aboutsummaryrefslogtreecommitdiff
path: root/Invoke-SMBEnum.ps1
diff options
context:
space:
mode:
Diffstat (limited to 'Invoke-SMBEnum.ps1')
-rw-r--r--Invoke-SMBEnum.ps12489
1 files changed, 1253 insertions, 1236 deletions
diff --git a/Invoke-SMBEnum.ps1 b/Invoke-SMBEnum.ps1
index c683ee1..f911b2e 100644
--- a/Invoke-SMBEnum.ps1
+++ b/Invoke-SMBEnum.ps1
@@ -96,7 +96,7 @@ function New-PacketNetBIOSSessionService
$NetBIOSSessionService = New-Object System.Collections.Specialized.OrderedDictionary
$NetBIOSSessionService.Add("MessageType",[Byte[]](0x00))
- $NetBIOSSessionService.Add("Length",[Byte[]]($length))
+ $NetBIOSSessionService.Add("Length",$length)
return $NetBIOSSessionService
}
@@ -162,7 +162,16 @@ function New-PacketSMBNegotiateProtocolRequest
function New-PacketSMB2Header
{
- param([Byte[]]$Command,[Byte[]]$CreditRequest,[Int]$MessageID,[Byte[]]$ProcessID,[Byte[]]$TreeID,[Byte[]]$SessionID)
+ param([Byte[]]$Command,[Byte[]]$CreditRequest,[Bool]$Signing,[Int]$MessageID,[Byte[]]$ProcessID,[Byte[]]$TreeID,[Byte[]]$SessionID)
+
+ if($Signing)
+ {
+ $flags = 0x08,0x00,0x00,0x00
+ }
+ else
+ {
+ $flags = 0x00,0x00,0x00,0x00
+ }
[Byte[]]$message_ID = [System.BitConverter]::GetBytes($MessageID)
@@ -179,7 +188,7 @@ function New-PacketSMB2Header
$SMB2Header.Add("Reserved",[Byte[]](0x00,0x00))
$SMB2Header.Add("Command",$Command)
$SMB2Header.Add("CreditRequest",$CreditRequest)
- $SMB2Header.Add("Flags",[Byte[]](0x00,0x00,0x00,0x00))
+ $SMB2Header.Add("Flags",$flags)
$SMB2Header.Add("NextCommand",[Byte[]](0x00,0x00,0x00,0x00))
$SMB2Header.Add("MessageID",$message_ID)
$SMB2Header.Add("ProcessID",$ProcessID)
@@ -590,52 +599,6 @@ function New-PacketRPCRequest
return $RPCRequest
}
-function New-PacketSRVSVCNetSessEnum
-{
- param([String]$ServerUNC)
-
- [Byte[]]$server_UNC = [System.Text.Encoding]::Unicode.GetBytes($ServerUNC)
- [Byte[]]$max_count = [System.BitConverter]::GetBytes($ServerUNC.Length + 1)
-
- if($ServerUNC.Length % 2)
- {
- $server_UNC += 0x00,0x00
- }
- else
- {
- $server_UNC += 0x00,0x00,0x00,0x00
- }
-
- $SRVSVCNetSessEnum = New-Object System.Collections.Specialized.OrderedDictionary
- $SRVSVCNetSessEnum.Add("PointerToServerUNC_ReferentID",[Byte[]](0x00,0x00,0x02,0x00))
- $SRVSVCNetSessEnum.Add("PointerToServerUNC_MaxCount",$max_count)
- $SRVSVCNetSessEnum.Add("PointerToServerUNC_Offset",[Byte[]](0x00,0x00,0x00,0x00))
- $SRVSVCNetSessEnum.Add("PointerToServerUNC_ActualCount",$max_count)
- $SRVSVCNetSessEnum.Add("PointerToServerUNC_ServerUNC",$server_UNC)
- $SRVSVCNetSessEnum.Add("PointerToClient_ReferentID",[Byte[]](0x04,0x00,0x02,0x00))
- $SRVSVCNetSessEnum.Add("PointerToClient_MaxCount",[Byte[]](0x01,0x00,0x00,0x00))
- $SRVSVCNetSessEnum.Add("PointerToClient_Offset",[Byte[]](0x00,0x00,0x00,0x00))
- $SRVSVCNetSessEnum.Add("PointerToClient_ActualCount",[Byte[]](0x01,0x00,0x00,0x00))
- $SRVSVCNetSessEnum.Add("PointerToClient_Client",[Byte[]](0x00,0x00))
- $SRVSVCNetSessEnum.Add("PointerToUser",[Byte[]](0x00,0x00))
- $SRVSVCNetSessEnum.Add("PointerToUser_ReferentID",[Byte[]](0x08,0x00,0x02,0x00))
- $SRVSVCNetSessEnum.Add("PointerToUser_MaxCount",[Byte[]](0x01,0x00,0x00,0x00))
- $SRVSVCNetSessEnum.Add("PointerToUser_Offset",[Byte[]](0x00,0x00,0x00,0x00))
- $SRVSVCNetSessEnum.Add("PointerToUser_ActualCount",[Byte[]](0x01,0x00,0x00,0x00))
- $SRVSVCNetSessEnum.Add("PointerToUser_User",[Byte[]](0x00,0x00))
- $SRVSVCNetSessEnum.Add("PointerToLevel",[Byte[]](0x00,0x00))
- $SRVSVCNetSessEnum.Add("PointerToLevel_Level",[Byte[]](0x0a,0x00,0x00,0x00))
- $SRVSVCNetSessEnum.Add("PointerToCtr_NetSessCtr_Ctr",[Byte[]](0x0a,0x00,0x00,0x00))
- $SRVSVCNetSessEnum.Add("PointerToCtr_NetSessCtr_PointerToCtr10_ReferentID",[Byte[]](0x0c,0x00,0x02,0x00))
- $SRVSVCNetSessEnum.Add("PointerToCtr_NetSessCtr_PointerToCtr10_Ctr10_Count",[Byte[]](0x00,0x00,0x00,0x00))
- $SRVSVCNetSessEnum.Add("PointerToCtr_NetSessCtr_PointerToCtr10_Ctr10_NullPointer",[Byte[]](0x00,0x00,0x00,0x00))
- $SRVSVCNetSessEnum.Add("MaxBuffer",[Byte[]](0xff,0xff,0xff,0xff))
- $SRVSVCNetSessEnum.Add("PointerToResumeHandle_ReferentID",[Byte[]](0x10,0x00,0x02,0x00))
- $SRVSVCNetSessEnum.Add("PointerToResumeHandle_ResumeHandle",[Byte[]](0x00,0x00,0x00,0x00))
-
- return $SRVSVCNetSessEnum
-}
-
# LSA
function New-PacketLSAOpenPolicy
{
@@ -875,6 +838,53 @@ function New-PacketSAMRLookupRids
return $SAMRLookupRIDS
}
+# SRVSVC
+function New-PacketSRVSVCNetSessEnum
+{
+ param([String]$ServerUNC)
+
+ [Byte[]]$server_UNC = [System.Text.Encoding]::Unicode.GetBytes($ServerUNC)
+ [Byte[]]$max_count = [System.BitConverter]::GetBytes($ServerUNC.Length + 1)
+
+ if($ServerUNC.Length % 2)
+ {
+ $server_UNC += 0x00,0x00
+ }
+ else
+ {
+ $server_UNC += 0x00,0x00,0x00,0x00
+ }
+
+ $SRVSVCNetSessEnum = New-Object System.Collections.Specialized.OrderedDictionary
+ $SRVSVCNetSessEnum.Add("PointerToServerUNC_ReferentID",[Byte[]](0x00,0x00,0x02,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToServerUNC_MaxCount",$max_count)
+ $SRVSVCNetSessEnum.Add("PointerToServerUNC_Offset",[Byte[]](0x00,0x00,0x00,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToServerUNC_ActualCount",$max_count)
+ $SRVSVCNetSessEnum.Add("PointerToServerUNC_ServerUNC",$server_UNC)
+ $SRVSVCNetSessEnum.Add("PointerToClient_ReferentID",[Byte[]](0x04,0x00,0x02,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToClient_MaxCount",[Byte[]](0x01,0x00,0x00,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToClient_Offset",[Byte[]](0x00,0x00,0x00,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToClient_ActualCount",[Byte[]](0x01,0x00,0x00,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToClient_Client",[Byte[]](0x00,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToUser",[Byte[]](0x00,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToUser_ReferentID",[Byte[]](0x08,0x00,0x02,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToUser_MaxCount",[Byte[]](0x01,0x00,0x00,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToUser_Offset",[Byte[]](0x00,0x00,0x00,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToUser_ActualCount",[Byte[]](0x01,0x00,0x00,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToUser_User",[Byte[]](0x00,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToLevel",[Byte[]](0x00,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToLevel_Level",[Byte[]](0x0a,0x00,0x00,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToCtr_NetSessCtr_Ctr",[Byte[]](0x0a,0x00,0x00,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToCtr_NetSessCtr_PointerToCtr10_ReferentID",[Byte[]](0x0c,0x00,0x02,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToCtr_NetSessCtr_PointerToCtr10_Ctr10_Count",[Byte[]](0x00,0x00,0x00,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToCtr_NetSessCtr_PointerToCtr10_Ctr10_NullPointer",[Byte[]](0x00,0x00,0x00,0x00))
+ $SRVSVCNetSessEnum.Add("MaxBuffer",[Byte[]](0xff,0xff,0xff,0xff))
+ $SRVSVCNetSessEnum.Add("PointerToResumeHandle_ReferentID",[Byte[]](0x10,0x00,0x02,0x00))
+ $SRVSVCNetSessEnum.Add("PointerToResumeHandle_ResumeHandle",[Byte[]](0x00,0x00,0x00,0x00))
+
+ return $SRVSVCNetSessEnum
+}
+
function New-PacketSRVSVCNetShareEnumAll
{
param([String]$ServerUNC)
@@ -910,13 +920,25 @@ function New-PacketSRVSVCNetShareEnumAll
return $SRVSVCNetShareEnum
}
-function DataLength2
+function Get-UInt16DataLength
+{
+ param ([Int]$Start,[Byte[]]$Data)
+
+ $data_length = [System.BitConverter]::ToUInt16($Data[$Start..($Start + 1)],0)
+
+ return $data_length
+}
+
+function Get-StatusPending
{
- param ([Int]$length_start,[Byte[]]$string_extract_data)
+ param ([Byte[]]$Status)
- $string_length = [System.BitConverter]::ToUInt16($string_extract_data[$length_start..($length_start + 1)],0)
+ if([System.BitConverter]::ToString($Status) -eq '03-01-00-00')
+ {
+ $status_pending = $true
+ }
- return $string_length
+ return $status_pending
}
if($hash -like "*:*")
@@ -990,209 +1012,192 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
while($stage -ne 'Exit')
{
-
- switch ($stage)
+
+ try
{
+
+ switch ($stage)
+ {
- 'NegotiateSMB'
- {
- $packet_SMB_header = New-PacketSMBHeader 0x72 0x18 0x01,0x48 0xff,0xff $process_ID 0x00,0x00
- $packet_SMB_data = New-PacketSMBNegotiateProtocolRequest $SMB_version
- $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
- $NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
-
- try
- {
+ 'NegotiateSMB'
+ {
+ $packet_SMB_header = New-PacketSMBHeader 0x72 0x18 0x01,0x48 0xff,0xff $process_ID 0x00,0x00
+ $packet_SMB_data = New-PacketSMBNegotiateProtocolRequest $SMB_version
+ $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
+ $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
+ $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
+ $NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
$client_stream.Write($client_send,0,$client_send.Length) > $null
$client_stream.Flush()
$client_stream.Read($client_receive,0,$client_receive.Length) > $null
- }
- catch
- {
- Write-Output "[-] Something went wrong"
- throw
- }
-
- if([System.BitConverter]::ToString($client_receive[4..7]) -eq 'ff-53-4d-42')
- {
- $SMB_version = 'SMB1'
- $stage = 'NTLMSSPNegotiate'
- if([System.BitConverter]::ToString($client_receive[39]) -eq '0f')
+ if([System.BitConverter]::ToString($client_receive[4..7]) -eq 'ff-53-4d-42')
{
+ $SMB_version = 'SMB1'
+ $stage = 'NTLMSSPNegotiate'
- if($SigningCheck)
+ if([System.BitConverter]::ToString($client_receive[39]) -eq '0f')
{
- Write-Output "[+] SMB signing is required"
- $stage = 'exit'
- }
- else
- {
- Write-Verbose "[+] SMB signing is required"
- $SMB_signing = $true
- $SMB_session_key_length = 0x00,0x00
- $SMB_negotiate_flags = 0x15,0x82,0x08,0xa0
- }
- }
- else
- {
+ if($SigningCheck)
+ {
+ Write-Output "[+] SMB signing is required"
+ $stage = 'Exit'
+ }
+ else
+ {
+ Write-Verbose "[+] SMB signing is required"
+ $SMB_signing = $true
+ $session_key_length = 0x00,0x00
+ $negotiate_flags = 0x15,0x82,0x08,0xa0
+ }
- if($SigningCheck)
- {
- Write-Output "[+] SMB signing is not required"
- $stage = 'exit'
}
else
- {
- $SMB_signing = $false
- $SMB_session_key_length = 0x00,0x00
- $SMB_negotiate_flags = 0x05,0x82,0x08,0xa0
- }
-
- }
-
- }
- else
- {
- $stage = 'NegotiateSMB2'
+ {
- if([System.BitConverter]::ToString($client_receive[70]) -eq '03')
- {
+ if($SigningCheck)
+ {
+ Write-Output "[+] SMB signing is not required"
+ $stage = 'Exit'
+ }
+ else
+ {
+ $SMB_signing = $false
+ $session_key_length = 0x00,0x00
+ $negotiate_flags = 0x05,0x82,0x08,0xa0
+ }
- if($SigningCheck)
- {
- Write-Output "[+] SMB signing is required"
- $stage = 'exit'
- }
- else
- {
- Write-Verbose "[+] SMB signing is required"
- $SMB_signing = $true
- $SMB_session_key_length = 0x00,0x00
- $SMB_negotiate_flags = 0x15,0x82,0x08,0xa0
}
}
else
{
+ $stage = 'NegotiateSMB2'
- if($SigningCheck)
+ if([System.BitConverter]::ToString($client_receive[70]) -eq '03')
{
- Write-Output "[+] SMB signing is not required"
- $stage = 'exit'
+
+ if($SigningCheck)
+ {
+ Write-Output "[+] SMB signing is required"
+ $stage = 'Exit'
+ }
+ else
+ {
+ Write-Verbose "[+] SMB signing is required"
+ $SMB_signing = $true
+ $session_key_length = 0x00,0x00
+ $negotiate_flags = 0x15,0x82,0x08,0xa0
+ }
+
}
else
- {
- $SMB_signing = $false
- $SMB_session_key_length = 0x00,0x00
- $SMB_negotiate_flags = 0x05,0x80,0x08,0xa0
+ {
+
+ if($SigningCheck)
+ {
+ Write-Output "[+] SMB signing is not required"
+ $stage = 'Exit'
+ }
+ else
+ {
+ $SMB_signing = $false
+ $session_key_length = 0x00,0x00
+ $negotiate_flags = 0x05,0x80,0x08,0xa0
+ }
+
}
}
+ Write-Verbose "[+] SMB version is $SMB_version"
}
- }
-
- 'NegotiateSMB2'
- {
- $tree_ID = 0x00,0x00,0x00,0x00
- $session_ID = 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- $message_ID = 1
- $packet_SMB_header = New-PacketSMB2Header 0x00,0x00 0x00,0x00 $message_ID $process_ID $tree_ID $session_ID
- $packet_SMB_data = New-PacketSMB2NegotiateProtocolRequest
- $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
- $NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
-
- try
+ 'NegotiateSMB2'
{
+ $tree_ID = 0x00,0x00,0x00,0x00
+ $session_ID = 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ $message_ID = 1
+ $packet_SMB_header = New-PacketSMB2Header 0x00,0x00 0x00,0x00 $false $message_ID $process_ID $tree_ID $session_ID
+ $packet_SMB_data = New-PacketSMB2NegotiateProtocolRequest
+ $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
+ $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
+ $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
+ $NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
$client_stream.Write($client_send,0,$client_send.Length) > $null
$client_stream.Flush()
$client_stream.Read($client_receive,0,$client_receive.Length) > $null
$stage = 'NTLMSSPNegotiate'
}
- catch
- {
- Write-Output "[-] Something went wrong"
- throw
- }
+
+ 'NTLMSSPNegotiate'
+ {
+
+ if($SMB_version -eq 'SMB1')
+ {
+ $packet_SMB_header = New-PacketSMBHeader 0x73 0x18 0x07,0xc8 0xff,0xff $process_ID 0x00,0x00
- }
-
- 'NTLMSSPNegotiate'
- {
-
- if($SMB_version -eq 'SMB1')
- {
- $packet_SMB_header = New-PacketSMBHeader 0x73 0x18 0x07,0xc8 0xff,0xff $process_ID 0x00,0x00
+ if($SMB_signing)
+ {
+ $packet_SMB_header["Flags2"] = 0x05,0x48
+ }
- if($SMB_signing)
+ $packet_NTLMSSP_negotiate = New-PacketNTLMSSPNegotiate $negotiate_flags
+ $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
+ $NTLMSSP_negotiate = ConvertFrom-PacketOrderedDictionary $packet_NTLMSSP_negotiate
+ $packet_SMB_data = New-PacketSMBSessionSetupAndXRequest $NTLMSSP_negotiate
+ $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
+ $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
+ $NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
+ }
+ else
{
- $packet_SMB_header["Flags2"] = 0x05,0x48
+ $message_ID++
+ $packet_SMB_header = New-PacketSMB2Header 0x01,0x00 0x1f,0x00 $false $message_ID $process_ID $tree_ID $session_ID
+ $packet_NTLMSSP_negotiate = New-PacketNTLMSSPNegotiate $negotiate_flags 0x06,0x01,0xb1,0x1d,0x00,0x00,0x00,0x0f
+ $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
+ $NTLMSSP_negotiate = ConvertFrom-PacketOrderedDictionary $packet_NTLMSSP_negotiate
+ $packet_SMB_data = New-PacketSMB2SessionSetupRequest $NTLMSSP_negotiate
+ $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
+ $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
+ $NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
}
- $packet_NTLMSSP_negotiate = New-PacketNTLMSSPNegotiate $SMB_negotiate_flags
- $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- $NTLMSSP_negotiate = ConvertFrom-PacketOrderedDictionary $packet_NTLMSSP_negotiate
- $packet_SMB_data = New-PacketSMBSessionSetupAndXRequest $NTLMSSP_negotiate
- $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
- $NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
- }
- else
- {
- $message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x01,0x00 0x1f,0x00 $message_ID $process_ID $tree_ID $session_ID
- $packet_NTLMSSP_negotiate = New-PacketNTLMSSPNegotiate $SMB_negotiate_flags 0x06,0x01,0xb1,0x1d,0x00,0x00,0x00,0x0f
- $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- $NTLMSSP_negotiate = ConvertFrom-PacketOrderedDictionary $packet_NTLMSSP_negotiate
- $packet_SMB_data = New-PacketSMB2SessionSetupRequest $NTLMSSP_negotiate
- $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
- $NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
- }
-
- try
- {
$client_stream.Write($client_send,0,$client_send.Length) > $null
$client_stream.Flush()
$client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $stage = 'exit'
-
- }
- catch
- {
- Write-Output "[-] Something went wrong"
- throw
+ $stage = 'Exit'
}
}
-
+
+ }
+ catch
+ {
+ $error_message = $_.Exception.Message
+ $error_message = $error_message -replace "`n",""
+ Write-Output "[-] $error_message"
}
}
if(!$SigningCheck)
{
- $SMB_NTLMSSP = [System.BitConverter]::ToString($client_receive)
- $SMB_NTLMSSP = $SMB_NTLMSSP -replace "-",""
- $SMB_NTLMSSP_index = $SMB_NTLMSSP.IndexOf("4E544C4D53535000")
- $SMB_NTLMSSP_bytes_index = $SMB_NTLMSSP_index / 2
- $SMB_domain_length = DataLength2 ($SMB_NTLMSSP_bytes_index + 12) $client_receive
- $SMB_target_length = DataLength2 ($SMB_NTLMSSP_bytes_index + 40) $client_receive
+ $NTLMSSP = [System.BitConverter]::ToString($client_receive)
+ $NTLMSSP = $NTLMSSP -replace "-",""
+ $NTLMSSP_index = $NTLMSSP.IndexOf("4E544C4D53535000")
+ $NTLMSSP_bytes_index = $NTLMSSP_index / 2
+ $domain_length = Get-UInt16DataLength ($NTLMSSP_bytes_index + 12) $client_receive
+ $target_length = Get-UInt16DataLength ($NTLMSSP_bytes_index + 40) $client_receive
$session_ID = $client_receive[44..51]
- $SMB_NTLM_challenge = $client_receive[($SMB_NTLMSSP_bytes_index + 24)..($SMB_NTLMSSP_bytes_index + 31)]
- $SMB_target_details = $client_receive[($SMB_NTLMSSP_bytes_index + 56 + $SMB_domain_length)..($SMB_NTLMSSP_bytes_index + 55 + $SMB_domain_length + $SMB_target_length)]
- $SMB_target_time_bytes = $SMB_target_details[($SMB_target_details.Length - 12)..($SMB_target_details.Length - 5)]
+ $NTLM_challenge = $client_receive[($NTLMSSP_bytes_index + 24)..($NTLMSSP_bytes_index + 31)]
+ $target_details = $client_receive[($NTLMSSP_bytes_index + 56 + $domain_length)..($NTLMSSP_bytes_index + 55 + $domain_length + $target_length)]
+ $target_time_bytes = $target_details[($target_details.Length - 12)..($target_details.Length - 5)]
$NTLM_hash_bytes = (&{for ($i = 0;$i -lt $hash.Length;$i += 2){$hash.SubString($i,2)}}) -join "-"
$NTLM_hash_bytes = $NTLM_hash_bytes.Split("-") | ForEach-Object{[Char][System.Convert]::ToInt16($_,16)}
$auth_hostname = (Get-ChildItem -path env:computername).Value
@@ -1223,14 +1228,14 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
$security_blob_bytes = 0x01,0x01,0x00,0x00,
0x00,0x00,0x00,0x00 +
- $SMB_target_time_bytes +
+ $target_time_bytes +
$client_challenge_bytes +
0x00,0x00,0x00,0x00 +
- $SMB_target_details +
+ $target_details +
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00
- $server_challenge_and_security_blob_bytes = $SMB_NTLM_challenge + $security_blob_bytes
+ $server_challenge_and_security_blob_bytes = $NTLM_challenge + $security_blob_bytes
$HMAC_MD5.key = $NTLMv2_hash
$NTLMv2_response = $HMAC_MD5.ComputeHash($server_challenge_and_security_blob_bytes)
@@ -1264,10 +1269,10 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
$auth_hostname_length +
$auth_hostname_length +
$auth_hostname_offset +
- $SMB_session_key_length +
- $SMB_session_key_length +
+ $session_key_length +
+ $session_key_length +
$SMB_session_key_offset +
- $SMB_negotiate_flags +
+ $negotiate_flags +
$auth_domain_bytes +
$auth_username_bytes +
$auth_hostname_bytes +
@@ -1298,7 +1303,7 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
else
{
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x01,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
+ $packet_SMB_header = New-PacketSMB2Header 0x01,0x00 0x01,0x00 $false $message_ID $process_ID $tree_ID $session_ID
$packet_NTLMSSP_auth = New-PacketNTLMSSPAuth $NTLMSSP_response
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
$NTLMSSP_auth = ConvertFrom-PacketOrderedDictionary $packet_NTLMSSP_auth
@@ -1321,7 +1326,8 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
if([System.BitConverter]::ToString($client_receive[9..12]) -eq '00-00-00-00')
{
Write-Verbose "[+] $output_username successfully authenticated on $Target"
- $login_successful = $true
+ Write-Output "[-] SMB1 is not supported"
+ $login_successful = $false
}
else
{
@@ -1348,7 +1354,9 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
}
catch
{
- Write-Output "[-] Something went wrong"
+ $error_message = $_.Exception.Message
+ $error_message = $error_message -replace "`n",""
+ Write-Output "[-] $error_message"
$login_successful = $false
}
@@ -1374,6 +1382,7 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
$session_ID = $inveigh.session_table[$session]
$message_ID = $inveigh.session_message_ID_table[$session]
$tree_ID = 0x00,0x00,0x00,0x00
+ $SMB_signing = $false
}
if($Action -eq 'All')
@@ -1385,58 +1394,34 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
$action_stage = $Action
}
- $SMB_path = "\\" + $Target + "\IPC$"
- $SMB_path_bytes = [System.Text.Encoding]::Unicode.GetBytes($SMB_path)
+ $path = "\\" + $Target + "\IPC$"
+ $path_bytes = [System.Text.Encoding]::Unicode.GetBytes($path)
$j = 0
+ $stage = 'TreeConnect'
- if($SMB_version -eq 'SMB1')
- {
- Write-Output "[-] SMB1 is not supported"
- throw
- }
- else
+ while ($stage -ne 'Exit')
{
- $stage = 'TreeConnect'
- :SMB_execute_loop while ($stage -ne 'exit')
+ try
{
-
+
switch ($stage)
{
- 'TreeConnect'
+ 'CloseRequest'
{
$message_ID++
-
- if($share_list.Count -gt 0)
- {
-
- if($share_list[$j] -eq 'IPC$')
- {
- $j++
- }
-
- $SMB_path = "\\" + $Target + "\" + $share_list[$j]
- $SMB_path_bytes = [System.Text.Encoding]::Unicode.GetBytes($SMB_path)
-
- }
-
- $packet_SMB_header = New-PacketSMB2Header 0x03,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SMB_data = New-PacketSMB2TreeConnectRequest $SMB_path_bytes
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x06,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SMB_data = New-PacketSMB2CloseRequest $file_ID
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
+ $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data
+ $SMB_sign = $SMB_header + $SMB_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
@@ -1444,540 +1429,280 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
}
$client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- try
+ if(Get-StatusPending $client_receive[12..15])
{
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $tree_ID = $client_receive[40..43]
- $access_mask = $null
-
- if($client_receive[76] -eq 92)
- {
- $tree_access_mask = 0x00,0x00,0x00,0x00
- }
- else
- {
- $tree_access_mask = $client_receive[80..83]
- }
-
- if($share_list.Count -gt 0)
- {
-
- ForEach($byte in $tree_access_mask)
- {
- $access_mask = [System.Convert]::ToString($byte,2).PadLeft(8,'0') + $access_mask
- }
-
- $response_object_list | Where-Object {$_.Share -eq $share_list[$j]} | ForEach-Object {$_."Access Mask"=$access_mask}
- $stage = 'TreeDisconnect'
- }
- else
- {
- $tree_IPC = $tree_ID
- $stage = 'CreateRequest'
- }
-
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Session connection is closed"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
}
-
- 'CreateRequest'
- {
-
- if($action_stage -eq 'Share' -or $action_stage -eq 'NetSession')
- {
- $named_pipe = 0x73,0x00,0x72,0x00,0x76,0x00,0x73,0x00,0x76,0x00,0x63,0x00 # srvsvc
- }
- elseif($step -eq 1)
- {
- $named_pipe = 0x73,0x00,0x61,0x00,0x6d,0x00,0x72,0x00 # samr
- }
- else
- {
- $named_pipe = 0x6c,0x00,0x73,0x00,0x61,0x00,0x72,0x00,0x70,0x00,0x63,0x00 # lsarpc
- }
+ 'Connect2'
+ {
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x05,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SMB_data = New-PacketSMB2CreateRequestFile $named_pipe
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SAMR_data = New-PacketSAMRConnect2 $Target
+ $SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
+ $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x06,0x00,0x00,0x00 0x00,0x00 0x39,0x00
+ $RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
+ $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
+ $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
+ $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data
+ $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
-
- try
- {
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $file_ID = $client_receive[132..147]
- }
- catch
- {
- Write-Output "[-] Session connection is closed"
- $stage = 'Exit'
- }
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- if($Refresh -and $stage -ne 'Exit')
- {
- Write-Output "[+] Session refreshed"
- $stage = 'Exit'
- }
- elseif($step -ge 2)
+ if(Get-StatusPending $client_receive[12..15])
{
- $stage = 'RPCBind'
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- elseif($stage -ne 'Exit')
+ else
{
- $stage = 'QueryInfoRequest'
+ $stage = 'StatusReceived'
}
}
- 'QueryInfoRequest'
- {
- $message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x10,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SMB_data = New-PacketSMB2QueryInfoRequest 0x01 0x05 0x18,0x00,0x00,0x00 0x68,0x00 $file_ID
- $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
- $NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
-
- if($SMB_signing)
- {
- $SMB_sign = $SMB_header + $SMB_data
- $SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
- $SMB_signature = $SMB_signature[0..15]
- $packet_SMB_header["Signature"] = $SMB_signature
- $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- }
-
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
-
- try
- {
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $file_ID = $client_receive[132..147]
- $stage = 'RPCBind'
- }
- catch
- {
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
- }
-
- }
-
- 'RPCBind'
+ 'Connect5'
{
- $named_pipe = 0x73,0x00,0x72,0x00,0x76,0x00,0x73,0x00,0x76,0x00,0x63,0x00 # srvsvc
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x09,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- if($action_stage -eq 'Share')
- {
- $named_pipe_UUID = 0xc8,0x4f,0x32,0x4b,0x70,0x16,0xd3,0x01,0x12,0x78,0x5a,0x47,0xbf,0x6e,0xe1,0x88
- $packet_RPC_data = New-PacketRPCBind 0x48,0x00 2 0x01 0x00,0x00 $named_pipe_UUID 0x03,0x00
- $stage_next = 'NetShareEnumAll'
- }
- elseif($action_stage -eq 'NetSession')
- {
- $named_pipe_UUID = 0xc8,0x4f,0x32,0x4b,0x70,0x16,0xd3,0x01,0x12,0x78,0x5a,0x47,0xbf,0x6e,0xe1,0x88
- $packet_RPC_data = New-PacketRPCBind 0x74,0x00 2 0x02 0x00,0x00 $named_pipe_UUID 0x03,0x00
- $stage_next = 'NetSessEnum'
- }
- elseif($step -eq 1)
- {
- $named_pipe_UUID = 0x78,0x57,0x34,0x12,0x34,0x12,0xcd,0xab,0xef,0x00,0x01,0x23,0x45,0x67,0x89,0xac
- $packet_RPC_data = New-PacketRPCBind 0x48,0x00 5 0x01 0x00,0x00 $named_pipe_UUID 0x01,0x00
-
- if($action_stage -eq 'User')
- {
- $stage_next = 'Connect5'
- }
- else
- {
- $stage_next = 'Connect2'
- }
-
- }
- elseif($step -gt 2)
- {
- $named_pipe_UUID = 0x78,0x57,0x34,0x12,0x34,0x12,0xcd,0xab,0xef,0x00,0x01,0x23,0x45,0x67,0x89,0xab
- $named_pipe = 0x78,0x57,0x34,0x12,0x34,0x12,0xcd,0xab,0x76,0x00,0x63,0x00
- $packet_RPC_data = New-PacketRPCBind 0x48,0x00 14 0x01 0x00,0x00 $named_pipe_UUID 0x00,0x00
- $stage_next = 'LSAOpenPolicy'
- }
- else
- {
- $named_pipe_UUID = 0x78,0x57,0x34,0x12,0x34,0x12,0xcd,0xab,0xef,0x00,0x01,0x23,0x45,0x67,0x89,0xab
- $named_pipe = 0x78,0x57,0x34,0x12,0x34,0x12,0xcd,0xab,0x76,0x00,0x63,0x00
- $packet_RPC_data = New-PacketRPCBind 0x48,0x00 1 0x01 0x00,0x00 $named_pipe_UUID 0x00,0x00
- $stage_next = 'LSAOpenPolicy'
- }
-
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SAMR_data = New-PacketSAMRConnect5 $Target
+ $SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
+ $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x06,0x00,0x00,0x00 0x00,0x00 0x40,0x00
$RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
- $packet_SMB_data = New-PacketSMB2WriteRequest $file_ID $RPC_data.Length
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
$SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $RPC_data_length = $SMB_data.Length + $RPC_data.Length
+ $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data + $RPC_data
+ $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
{
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $stage = 'ReadRequest'
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
}
-
- 'ReadRequest'
+
+ 'CreateRequest'
{
- Start-Sleep -m $Sleep
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x08,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SMB_data = New-PacketSMB2ReadRequest $file_ID
- $packet_SMB_data["Length"] = 0x00,0x04,0x00,0x00
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x05,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SMB_data = New-PacketSMB2CreateRequestFile $named_pipe
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
+ $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data
+ $SMB_sign = $SMB_header + $SMB_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
- {
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
-
- if([System.BitConverter]::ToString($client_receive[12..15]) -ne '03-01-00-00')
- {
- $stage = $stage_next
- }
- else
- {
- $stage = 'StatusPending'
- }
-
- }
- catch
- {
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
- }
-
- }
-
- 'StatusPending'
- {
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
-
- if([System.BitConverter]::ToString($client_receive[12..15]) -ne '03-01-00-00')
- {
- $stage = $stage_next
- }
-
- }
-
- 'LSAOpenPolicy'
- {
- $message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_LSARPC_data = New-PacketLSAOpenPolicy
- $LSARPC_data = ConvertFrom-PacketOrderedDictionary $packet_LSARPC_data
- $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $LSARPC_data.Length 4280
- $packet_RPC_data = New-PacketRPCRequest 0x03 $LSARPC_data.Length 0 0 0x02,0x00,0x00,0x00 0x00,0x00 0x06,0x00
- $RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
- $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $LSARPC_data.Length
- $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
- $NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
-
- if($SMB_signing)
- {
- $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
- $SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
- $SMB_signature = $SMB_signature[0..15]
- $packet_SMB_header["Signature"] = $SMB_signature
- $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- }
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
try
{
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
$client_stream.Write($client_send,0,$client_send.Length) > $null
$client_stream.Flush()
$client_stream.Read($client_receive,0,$client_receive.Length) > $null
- [Byte[]]$policy_handle = $client_receive[140..159]
-
- if($step -gt 2)
+
+ if(Get-StatusPending $client_receive[12..15])
{
- $stage = 'LSALookupSids'
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
else
{
- $stage = 'LSAQueryInfoPolicy'
+ $stage = 'StatusReceived'
}
}
catch
{
- Write-Output "[-] Something went wrong"
+ Write-Output "[-] Session connection is closed"
$stage = 'Exit'
}
}
- 'LSALookupSids'
+ 'EnumDomainUsers'
{
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_LSARPC_data = New-PacketLSALookupSids $policy_handle $SID_array
- $LSARPC_data = ConvertFrom-PacketOrderedDictionary $packet_LSARPC_data
- $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $LSARPC_data.Length 4280
- $packet_RPC_data = New-PacketRPCRequest 0x03 $LSARPC_data.Length 0 0 0x10,0x00,0x00,0x00 0x00,0x00 0x0f,0x00
- $RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SAMR_data = New-PacketSAMREnumDomainUsers $SAMR_domain_handle
+ $SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x08,0x00,0x00,0x00 0x00,0x00 0x0d,0x00
+ $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
+ $RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
$SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $LSARPC_data.Length
+ $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
-
+
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
+ $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
{
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $stage = 'ParseLookupSids'
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
-
+
}
- 'LSAQueryInfoPolicy'
+ 'GetMembersInAlias'
{
- [Byte[]]$policy_handle = $client_receive[140..159]
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_LSARPC_data = New-PacketLSAQueryInfoPolicy $policy_handle
- $LSARPC_data = ConvertFrom-PacketOrderedDictionary $packet_LSARPC_data
- $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $LSARPC_data.Length 4280
- $packet_RPC_data = New-PacketRPCRequest 0x03 $LSARPC_data.Length 0 0 0x03,0x00,0x00,0x00 0x00,0x00 0x07,0x00
- $RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SAMR_data = New-PacketSAMRGetMembersInAlias $SAMR_policy_handle
+ $SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x0d,0x00,0x00,0x00 0x00,0x00 0x21,0x00
+ $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
+ $RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
$SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $LSARPC_data.Length
+ $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
-
+
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
+ $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
{
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $stage = 'LSAClose'
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
}
- 'LSAClose'
+ 'Logoff'
{
- [Byte[]]$LSA_domain_length_bytes = $client_receive[148..149]
- $LSA_domain_length = [System.BitConverter]::ToInt16($LSA_domain_length_bytes,0)
- [Byte[]]$LSA_domain_actual_count_bytes = $client_receive[168..171]
- $LSA_domain_actual_count = [System.BitConverter]::ToInt32($LSA_domain_actual_count_bytes,0)
-
- if($LSA_domain_actual_count % 2)
- {
- $LSA_domain_length += 2
- }
-
- [Byte[]]$LSA_domain_SID = $client_receive[(176 + $LSA_domain_length)..(199 + $LSA_domain_length)]
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_LSARPC_data = New-PacketLSAClose $policy_handle
- $LSARPC_data = ConvertFrom-PacketOrderedDictionary $packet_LSARPC_data
- $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $LSARPC_data.Length 4280
- $packet_RPC_data = New-PacketRPCRequest 0x03 $LSARPC_data.Length 0 0 0x04,0x00,0x00,0x00 0x00,0x00 0x00,0x00
- $RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x02,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SMB_data = New-PacketSMB2SessionLogoffRequest
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $LSARPC_data.Length
- $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
+ $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
+ $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
-
+
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
+ $SMB_sign = $SMB_header + $SMB_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
- {
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $stage = 'CloseRequest'
- $step++
- }
- catch
- {
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
- }
-
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+ $stage = 'Exit'
}
- 'Connect2'
+ 'LookupNames'
{
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SAMR_data = New-PacketSAMRConnect2 $Target
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SAMR_data = New-PacketSAMRLookupNames $SAMR_domain_handle $Group
$SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x08,0x00,0x00,0x00 0x00,0x00 0x11,0x00
$packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
- $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x06,0x00,0x00,0x00 0x00,0x00 0x39,0x00
$RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
$SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
$RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
-
+
if($SMB_signing)
{
$SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
@@ -1987,44 +1712,39 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
{
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $stage = 'OpenDomain'
- $step++
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
}
- 'Connect5'
+ 'LookupRids'
{
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SAMR_data = New-PacketSAMRConnect5 $Target
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SAMR_data = New-PacketSAMRLookupRids $SAMR_domain_handle $RID_count_bytes $RID_list
$SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x0b,0x00,0x00,0x00 0x00,0x00 0x12,0x00
$packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
- $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x06,0x00,0x00,0x00 0x00,0x00 0x40,0x00
$RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
$SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
$RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
-
+
if($SMB_signing)
{
$SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
@@ -2034,378 +1754,284 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
{
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $stage = 'OpenDomain'
- $step++
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
-
+
}
- 'OpenDomain'
+ 'LSAClose'
{
-
- if($step -eq 5 -and $action_stage -eq 'Group')
- {
- $LSA_domain_SID = 0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x05,0x20,0x00,0x00,0x00
- $SID_count = 0x01,0x00,0x00,0x00
- }
- elseif($action_stage -eq 'Group')
- {
- $SID_count = 0x04,0x00,0x00,0x00
- [Byte[]]$SAMR_connect_handle = $client_receive[140..159]
- }
- else
- {
- $SID_count = 0x04,0x00,0x00,0x00
- [Byte[]]$SAMR_connect_handle = $client_receive[156..175]
- }
-
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SAMR_data = New-PacketSAMROpenDomain $SAMR_connect_handle $SID_count $LSA_domain_SID
- $SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
- $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
- $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x07,0x00,0x00,0x00 0x00,0x00 0x07,0x00
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_LSARPC_data = New-PacketLSAClose $policy_handle
+ $LSARPC_data = ConvertFrom-PacketOrderedDictionary $packet_LSARPC_data
+ $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $LSARPC_data.Length 4280
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $LSARPC_data.Length 0 0 0x04,0x00,0x00,0x00 0x00,0x00 0x00,0x00
$RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
$SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
+ $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $LSARPC_data.Length
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
-
+
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
- {
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- [Byte[]]$SAMR_domain_handle = $client_receive[140..159]
- $step++
-
- if($action_stage -eq 'User')
- {
- $stage = 'EnumDomainUsers'
- }
- else
- {
- $stage = 'LookupNames'
- }
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+ $step++
+ if(Get-StatusPending $client_receive[12..15])
+ {
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
}
- 'LookupNames'
+ 'LSALookupSids'
{
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SAMR_data = New-PacketSAMRLookupNames $SAMR_domain_handle $Group
- $SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
- $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x08,0x00,0x00,0x00 0x00,0x00 0x11,0x00
- $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
- $RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_LSARPC_data = New-PacketLSALookupSids $policy_handle $SID_array
+ $LSARPC_data = ConvertFrom-PacketOrderedDictionary $packet_LSARPC_data
+ $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $LSARPC_data.Length 4280
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $LSARPC_data.Length 0 0 0x10,0x00,0x00,0x00 0x00,0x00 0x0f,0x00
+ $RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
$SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
+ $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $LSARPC_data.Length
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
-
+
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
- {
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- [Byte[]]$SAMR_RID = $client_receive[152..155]
- $step++
-
- if([System.BitConverter]::ToString($client_receive[156..159]) -eq '73-00-00-c0')
- {
- $stage = 'SAMRCloseRequest'
- }
- else
- {
-
- if($step -eq 4)
- {
- $stage = 'OpenGroup'
- }
- else
- {
- $stage = 'OpenAlias'
- }
-
- }
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+ if(Get-StatusPending $client_receive[12..15])
+ {
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
-
+
}
- 'OpenAlias'
- {
+ 'LSAOpenPolicy'
+ {
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SAMR_data = New-PacketSAMROpenAlias $SAMR_domain_handle $SAMR_RID
- $SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
- $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x0c,0x00,0x00,0x00 0x00,0x00 0x1b,0x00
- $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_LSARPC_data = New-PacketLSAOpenPolicy
+ $LSARPC_data = ConvertFrom-PacketOrderedDictionary $packet_LSARPC_data
+ $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $LSARPC_data.Length 4280
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $LSARPC_data.Length 0 0 0x02,0x00,0x00,0x00 0x00,0x00 0x06,0x00
$RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
$SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
+ $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $LSARPC_data.Length
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
-
+
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
- {
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $step++
-
- if([System.BitConverter]::ToString($client_receive[156..159]) -eq '73-00-00-c0')
- {
- $stage = 'SAMRCloseRequest'
- }
- else
- {
- $stage = 'GetMembersInAlias'
- }
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+ if(Get-StatusPending $client_receive[12..15])
+ {
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
-
+
}
- 'OpenGroup'
+ 'LSAQueryInfoPolicy'
{
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SAMR_data = New-PacketSAMROpenGroup $SAMR_domain_handle $SAMR_RID
- $SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
- $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x09,0x00,0x00,0x00 0x00,0x00 0x13,0x00
- $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
- $RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_LSARPC_data = New-PacketLSAQueryInfoPolicy $policy_handle
+ $LSARPC_data = ConvertFrom-PacketOrderedDictionary $packet_LSARPC_data
+ $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $LSARPC_data.Length 4280
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $LSARPC_data.Length 0 0 0x03,0x00,0x00,0x00 0x00,0x00 0x07,0x00
+ $RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
$SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
+ $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $LSARPC_data.Length
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
-
+
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $LSARPC_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
{
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- [Byte[]]$group_handle = $client_receive[140..159]
- $step++
- $stage = 'QueryGroupMember'
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
-
+
}
- 'QueryGroupMember'
+ 'NetSessEnum'
{
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SAMR_data = New-PacketSAMRQueryGroupMember $group_handle
- $SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
- $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x10,0x00,0x00,0x00 0x00,0x00 0x19,0x00
- $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SRVSVC_data = New-PacketSRVSVCNetSessEnum $Target
+ $SRVSVC_data = ConvertFrom-PacketOrderedDictionary $packet_SRVSVC_data
+ $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SRVSVC_data.Length 1024
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $SRVSVC_data.Length 0 0 0x02,0x00,0x00,0x00 0x00,0x00 0x0c,0x00
$RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
$SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
+ $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SRVSVC_data.Length
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SRVSVC_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SRVSVC_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
{
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- [Byte[]]$RID_count_bytes = $client_receive[144..147]
- $RID_count = [System.BitConverter]::ToInt16($RID_count_bytes,0)
- [Byte[]]$RID_list = $client_receive[160..(159 + ($RID_count * 4))]
- $step++
- $stage = 'LookupRids'
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
}
-
- 'LookupRids'
+
+ 'NetShareEnumAll'
{
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SAMR_data = New-PacketSAMRLookupRids $SAMR_domain_handle $RID_count_bytes $RID_list
- $SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
- $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x0b,0x00,0x00,0x00 0x00,0x00 0x12,0x00
- $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SRVSVC_data = New-PacketSRVSVCNetShareEnumAll $Target
+ $SRVSVC_data = ConvertFrom-PacketOrderedDictionary $packet_SRVSVC_data
+ $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SRVSVC_data.Length 4280
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $SRVSVC_data.Length 0 0 0x02,0x00,0x00,0x00 0x00,0x00 0x0f,0x00
$RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
$SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
+ $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SRVSVC_data.Length
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SRVSVC_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SRVSVC_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
{
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $step++
- $stage = 'ParseLookupRids'
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
}
- 'GetMembersInAlias'
- {
- [Byte[]]$SAMR_policy_handle = $client_receive[140..159]
+ 'OpenAlias'
+ {
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SAMR_data = New-PacketSAMRGetMembersInAlias $SAMR_policy_handle
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SAMR_data = New-PacketSAMROpenAlias $SAMR_domain_handle $SAMR_RID
$SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
- $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x0d,0x00,0x00,0x00 0x00,0x00 0x21,0x00
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x0c,0x00,0x00,0x00 0x00,0x00 0x1b,0x00
$packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
$RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
@@ -2423,54 +2049,39 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
- {
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- [Byte[]]$SID_array = $client_receive[140..([System.BitConverter]::ToInt16($client_receive[3..1],0) - 1)]
- $step++
-
- if([System.BitConverter]::ToString($client_receive[156..159]) -eq '73-00-00-c0')
- {
- $stage = 'SAMRCloseRequest'
- }
- else
- {
- $stage = 'CreateRequest'
- }
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+ if(Get-StatusPending $client_receive[12..15])
+ {
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
}
- 'SAMRCloseRequest'
- {
+ 'OpenDomain'
+ {
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SAMR_data = New-PacketSAMRClose $SAMR_domain_handle
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SAMR_data = New-PacketSAMROpenDomain $SAMR_connect_handle $SID_count $LSA_domain_SID
$SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
- $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x09,0x00,0x00,0x00 0x00,0x00 0x01,0x00
$packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x07,0x00,0x00,0x00 0x00,0x00 0x07,0x00
$RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
$SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
$RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
-
+
if($SMB_signing)
{
$SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
@@ -2480,47 +2091,31 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
- {
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $step++
-
- if($step -eq 8)
- {
- Write-Output "[-] $Group group not found"
- $stage = 'TreeDisconnect'
- }
- else
- {
- $stage = 'OpenDomain'
- }
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+ if(Get-StatusPending $client_receive[12..15])
+ {
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
}
- 'EnumDomainUsers'
+ 'OpenGroup'
{
- [Byte[]]$SAMR_domain_handle = $client_receive[140..159]
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SAMR_data = New-PacketSAMREnumDomainUsers $SAMR_domain_handle
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SAMR_data = New-PacketSAMROpenGroup $SAMR_domain_handle $SAMR_RID
$SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
- $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x08,0x00,0x00,0x00 0x00,0x00 0x0d,0x00
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x09,0x00,0x00,0x00 0x00,0x00 0x13,0x00
$packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
$RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
@@ -2538,74 +2133,21 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
- {
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $step++
- $stage = 'ParseUsers'
- }
- catch
- {
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
- }
-
- }
-
- 'ParseUsers'
- {
- [Byte[]]$response_user_count_bytes = $client_receive[148..151]
- $response_user_count = [System.BitConverter]::ToInt16($response_user_count_bytes,0)
- $response_user_start = $response_user_count * 12 + 172
- $response_user_end = $response_user_start
- $response_RID_start = 160
- $response_user_length_start = 164
- $response_user_list = @()
- $i = 0
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- while($i -lt $response_user_count)
+ if(Get-StatusPending $client_receive[12..15])
{
- $response_user_object = New-Object PSObject
- [Byte[]]$response_user_length_bytes = $client_receive[$response_user_length_start..($response_user_length_start + 1)]
- $response_user_length = [System.BitConverter]::ToInt16($response_user_length_bytes,0)
- [Byte[]]$response_RID_bytes = $client_receive[$response_RID_start..($response_RID_start + 3)]
- $response_RID = [System.BitConverter]::ToInt16($response_RID_bytes,0)
- $response_user_end = $response_user_start + $response_user_length
- [Byte[]]$response_actual_count_bytes = $client_receive[($response_user_start - 4)..($response_user_start - 1)]
- $response_actual_count = [System.BitConverter]::ToInt16($response_actual_count_bytes,0)
- [Byte[]]$response_user_bytes = $client_receive[$response_user_start..($response_user_end - 1)]
-
- if($response_actual_count % 2)
- {
- $response_user_start += $response_user_length + 14
- }
- else
- {
- $response_user_start += $response_user_length + 12
- }
-
- $response_user = [System.BitConverter]::ToString($response_user_bytes)
- $response_user = $response_user -replace "-00",""
- $response_user = $response_user.Split("-") | ForEach-Object{[Char][System.Convert]::ToInt16($_,16)}
- $response_user = New-Object System.String ($response_user,0,$response_user.Length)
- Add-Member -InputObject $response_user_object -MemberType NoteProperty -Name Username $response_user
- Add-Member -InputObject $response_user_object -MemberType NoteProperty -Name RID $response_RID
- $response_user_length_start = $response_user_length_start + 12
- $response_RID_start = $response_RID_start + 12
- $response_user_list += $response_user_object
- $i++
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
-
- if($Action -eq 'All')
+ else
{
- Write-Output "Local Users:"
+ $stage = 'StatusReceived'
}
- Write-Output $response_user_list | Sort-Object -property Username |Format-Table -AutoSize
- $stage = 'CloseRequest'
}
'ParseLookupRids'
@@ -2743,62 +2285,6 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
$stage = 'CloseRequest'
}
- 'NetShareEnumAll'
- {
- $message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
- {
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
- }
-
- $packet_SRVSVC_data = New-PacketSRVSVCNetShareEnumAll $Target
- $SRVSVC_data = ConvertFrom-PacketOrderedDictionary $packet_SRVSVC_data
- $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SRVSVC_data.Length 4280
- $packet_RPC_data = New-PacketRPCRequest 0x03 $SRVSVC_data.Length 0 0 0x02,0x00,0x00,0x00 0x00,0x00 0x0f,0x00
- $RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
- $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SRVSVC_data.Length
- $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
- $NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
-
- if($SMB_signing)
- {
- $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SRVSVC_data
- $SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
- $SMB_signature = $SMB_signature[0..15]
- $packet_SMB_header["Signature"] = $SMB_signature
- $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- }
-
- try
- {
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SRVSVC_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $stage_next = 'ParseSRVSVC'
-
- if([System.BitConverter]::ToString($client_receive[12..15]) -ne '03-01-00-00')
- {
- $stage = $stage_next
- }
- else
- {
- $stage = 'StatusPending'
- }
-
- }
- catch
- {
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
- }
-
- }
-
'ParseSRVSVC'
{
$response_object_list = @()
@@ -2871,22 +2357,7 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
$share_list += $response_item
Add-Member -InputObject $response_item_object -MemberType NoteProperty -Name Share $response_item
Add-Member -InputObject $response_item_object -MemberType NoteProperty -Name Description $response_item_2
-
- if($response_item -eq 'IPC$')
- {
-
- ForEach($byte in $tree_access_mask)
- {
- $access_mask = [System.Convert]::ToString($byte,2).PadLeft(8,'0') + $access_mask
- }
-
- Add-Member -InputObject $response_item_object -MemberType NoteProperty -Name "Access Mask" $access_mask
- }
- else
- {
- Add-Member -InputObject $response_item_object -MemberType NoteProperty -Name "Access Mask" ""
- }
-
+ Add-Member -InputObject $response_item_object -MemberType NoteProperty -Name "Access Mask" ""
}
else
{
@@ -2905,304 +2376,850 @@ if($client.Connected -or (!$startup_error -and $inveigh.session_socket_table[$se
elseif($Action -eq 'All' -and $action_stage -eq 'NetSession')
{
Write-Output "NetSessions:"
- $response_object_list | Sort-Object -property Share |Format-Table -AutoSize
+ Write-Output $response_object_list | Sort-Object -property Share |Format-Table -AutoSize
}
if($Action -eq 'NetSession')
{
- $response_object_list | Sort-Object -property Share |Format-Table -AutoSize
+ Write-Output $response_object_list | Sort-Object -property Share |Format-Table -AutoSize
}
$stage = 'CloseRequest'
}
- 'NetSessEnum'
+ 'ParseUsers'
{
- $message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
+ [Byte[]]$response_user_count_bytes = $client_receive[148..151]
+ $response_user_count = [System.BitConverter]::ToInt16($response_user_count_bytes,0)
+ $response_user_start = $response_user_count * 12 + 172
+ $response_user_end = $response_user_start
+ $response_RID_start = 160
+ $response_user_length_start = 164
+ $response_user_list = @()
+ $i = 0
+
+ while($i -lt $response_user_count)
+ {
+ $response_user_object = New-Object PSObject
+ [Byte[]]$response_user_length_bytes = $client_receive[$response_user_length_start..($response_user_length_start + 1)]
+ $response_user_length = [System.BitConverter]::ToInt16($response_user_length_bytes,0)
+ [Byte[]]$response_RID_bytes = $client_receive[$response_RID_start..($response_RID_start + 3)]
+ $response_RID = [System.BitConverter]::ToInt16($response_RID_bytes,0)
+ $response_user_end = $response_user_start + $response_user_length
+ [Byte[]]$response_actual_count_bytes = $client_receive[($response_user_start - 4)..($response_user_start - 1)]
+ $response_actual_count = [System.BitConverter]::ToInt16($response_actual_count_bytes,0)
+ [Byte[]]$response_user_bytes = $client_receive[$response_user_start..($response_user_end - 1)]
+
+ if($response_actual_count % 2)
+ {
+ $response_user_start += $response_user_length + 14
+ }
+ else
+ {
+ $response_user_start += $response_user_length + 12
+ }
+
+ $response_user = [System.BitConverter]::ToString($response_user_bytes)
+ $response_user = $response_user -replace "-00",""
+ $response_user = $response_user.Split("-") | ForEach-Object{[Char][System.Convert]::ToInt16($_,16)}
+ $response_user = New-Object System.String ($response_user,0,$response_user.Length)
+ Add-Member -InputObject $response_user_object -MemberType NoteProperty -Name Username $response_user
+ Add-Member -InputObject $response_user_object -MemberType NoteProperty -Name RID $response_RID
+ $response_user_length_start = $response_user_length_start + 12
+ $response_RID_start = $response_RID_start + 12
+ $response_user_list += $response_user_object
+ $i++
+ }
+
+ if($Action -eq 'All')
{
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
+ Write-Output "Local Users:"
}
- $packet_SRVSVC_data = New-PacketSRVSVCNetSessEnum $Target
- $SRVSVC_data = ConvertFrom-PacketOrderedDictionary $packet_SRVSVC_data
- $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SRVSVC_data.Length 1024
- $packet_RPC_data = New-PacketRPCRequest 0x03 $SRVSVC_data.Length 0 0 0x02,0x00,0x00,0x00 0x00,0x00 0x0c,0x00
+ Write-Output $response_user_list | Sort-Object -property Username |Format-Table -AutoSize
+ $stage = 'CloseRequest'
+ }
+
+ 'QueryGroupMember'
+ {
+ $message_ID++
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SAMR_data = New-PacketSAMRQueryGroupMember $group_handle
+ $SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x10,0x00,0x00,0x00 0x00,0x00 0x19,0x00
+ $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
$RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
$SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SRVSVC_data.Length
+ $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SRVSVC_data
+ $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
{
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SRVSVC_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
- $stage_next = 'ParseSRVSVC'
-
- if([System.BitConverter]::ToString($client_receive[12..15]) -ne '03-01-00-00')
- {
- $stage = $stage_next
- }
- else
- {
- $stage = 'StatusPending'
- }
-
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
-
+
}
- 'CloseRequest'
- {
+ 'QueryInfoRequest'
+ {
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x06,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x10,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SMB_data = New-PacketSMB2QueryInfoRequest 0x01 0x05 0x18,0x00,0x00,0x00 0x68,0x00 $file_ID
+ $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
+ $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
+ $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
+ $NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
+
if($SMB_signing)
{
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
+ $SMB_sign = $SMB_header + $SMB_data
+ $SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
+ $SMB_signature = $SMB_signature[0..15]
+ $packet_SMB_header["Signature"] = $SMB_signature
+ $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
-
- $packet_SMB_data = New-PacketSMB2CloseRequest $file_ID
+
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
+ {
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
+ }
+ else
+ {
+ $stage = 'StatusReceived'
+ }
+
+ }
+
+ 'ReadRequest'
+ {
+ Start-Sleep -m $Sleep
+ $message_ID++
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x08,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SMB_data = New-PacketSMB2ReadRequest $file_ID
+ $packet_SMB_data["Length"] = 0x00,0x04,0x00,0x00
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
+ $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data
+ $SMB_sign = $SMB_header + $SMB_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
{
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
-
- if($step -eq 1)
- {
- $stage = 'CreateRequest'
- }
- elseif($action_stage -eq 'Share' -and $share_list.Count -gt 0)
- {
- $stage = 'TreeConnect'
- }
- else
- {
- $stage = 'TreeDisconnect'
- }
-
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
}
- catch
+ else
{
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
+ $stage = 'StatusReceived'
}
-
+
}
- 'TreeDisconnect'
+ 'RPCBind'
{
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x04,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x09,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_RPC_data = New-PacketRPCBind $frag_length $call_ID $num_ctx_items 0x00,0x00 $named_pipe_UUID $named_pipe_UUID_version
+ $RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
+ $packet_SMB_data = New-PacketSMB2WriteRequest $file_ID $RPC_data.Length
+ $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
+ $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
+ $RPC_data_length = $SMB_data.Length + $RPC_data.Length
+ $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
+ $NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
+
if($SMB_signing)
{
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
+ $SMB_sign = $SMB_header + $SMB_data + $RPC_data
+ $SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
+ $SMB_signature = $SMB_signature[0..15]
+ $packet_SMB_header["Signature"] = $SMB_signature
+ $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
-
- $packet_SMB_data = New-PacketSMB2TreeDisconnectRequest
+
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
+ {
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
+ }
+ else
+ {
+ $stage = 'StatusReceived'
+ }
+
+ }
+
+ 'SAMRCloseRequest'
+ {
+ $message_ID++
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x0b,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SAMR_data = New-PacketSAMRClose $SAMR_domain_handle
+ $SAMR_data = ConvertFrom-PacketOrderedDictionary $packet_SAMR_data
+ $packet_RPC_data = New-PacketRPCRequest 0x03 $SAMR_data.Length 0 0 0x09,0x00,0x00,0x00 0x00,0x00 0x01,0x00
+ $packet_SMB_data = New-PacketSMB2IoctlRequest 0x17,0xc0,0x11,0x00 $file_ID $SAMR_data.Length 4280
+ $RPC_data = ConvertFrom-PacketOrderedDictionary $packet_RPC_data
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
- $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
+ $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
+ $RPC_data_length = $SMB_data.Length + $RPC_data.Length + $SAMR_data.Length
+ $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $RPC_data_length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
-
+
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data
+ $SMB_sign = $SMB_header + $SMB_data + $RPC_data + $SAMR_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
- try
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data + $RPC_data + $SAMR_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
{
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
- $client_stream.Write($client_send,0,$client_send.Length) > $null
- $client_stream.Flush()
- $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
+ }
+ else
+ {
+ $stage = 'StatusReceived'
+ }
+
+ }
+
+ 'StatusPending'
+ {
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if([System.BitConverter]::ToString($client_receive[12..15]) -ne '03-01-00-00')
+ {
+ $stage = $stage_next
+ }
+
+ }
+
+ 'StatusReceived'
+ {
+
+ switch ($stage_current)
+ {
+
+ 'CloseRequest'
+ {
+
+ if($step -eq 1)
+ {
+ $named_pipe = 0x73,0x00,0x61,0x00,0x6d,0x00,0x72,0x00 # samr
+ $stage = 'CreateRequest'
+ }
+ elseif($action_stage -eq 'Share' -and $share_list.Count -gt 0)
+ {
+ $stage = 'TreeConnect'
+ }
+ else
+ {
+ $stage = 'TreeDisconnect'
+ }
+
+ }
+
+ 'Connect2'
+ {
+ $step++
+ $SID_count = 0x04,0x00,0x00,0x00
+ [Byte[]]$SAMR_connect_handle = $client_receive[140..159]
+ $stage = 'OpenDomain'
+ }
+
+ 'Connect5'
+ {
+ $step++
+ $SID_count = 0x04,0x00,0x00,0x00
+ [Byte[]]$SAMR_connect_handle = $client_receive[156..175]
+ $stage = 'OpenDomain'
+ }
+
+ 'CreateRequest'
+ {
+
+ if($action_stage -eq 'Share')
+ {
+ $frag_length = 0x48,0x00
+ $call_ID = 2
+ $num_ctx_items = 0x01
+ $named_pipe_UUID = 0xc8,0x4f,0x32,0x4b,0x70,0x16,0xd3,0x01,0x12,0x78,0x5a,0x47,0xbf,0x6e,0xe1,0x88
+ $named_pipe_UUID_version = 0x03,0x00
+ $stage_next = 'NetShareEnumAll'
+ }
+ elseif($action_stage -eq 'NetSession')
+ {
+ $frag_length = 0x74,0x00
+ $call_ID = 2
+ $num_ctx_items = 0x02
+ $named_pipe_UUID = 0xc8,0x4f,0x32,0x4b,0x70,0x16,0xd3,0x01,0x12,0x78,0x5a,0x47,0xbf,0x6e,0xe1,0x88
+ $named_pipe_UUID_version = 0x03,0x00
+ $stage_next = 'NetSessEnum'
+ }
+ elseif($step -eq 1)
+ {
+ $frag_length = 0x48,0x00
+ $call_ID = 5
+ $num_ctx_items = 0x01
+ $named_pipe_UUID = 0x78,0x57,0x34,0x12,0x34,0x12,0xcd,0xab,0xef,0x00,0x01,0x23,0x45,0x67,0x89,0xac
+ $named_pipe_UUID_version = 0x01,0x00
+
+ if($action_stage -eq 'User')
+ {
+ $stage_next = 'Connect5'
+ }
+ else
+ {
+ $stage_next = 'Connect2'
+ }
+
+ }
+ elseif($step -gt 2)
+ {
+ $frag_length = 0x48,0x00
+ $call_ID = 14
+ $num_ctx_items = 0x01
+ $named_pipe_UUID = 0x78,0x57,0x34,0x12,0x34,0x12,0xcd,0xab,0xef,0x00,0x01,0x23,0x45,0x67,0x89,0xab
+ $named_pipe_UUID_version = 0x00,0x00
+ $named_pipe = 0x78,0x57,0x34,0x12,0x34,0x12,0xcd,0xab,0x76,0x00,0x63,0x00
+ $stage_next = 'LSAOpenPolicy'
+ }
+ else
+ {
+ $frag_length = 0x48,0x00
+ $call_ID = 1
+ $num_ctx_items = 0x01
+ $named_pipe_UUID = 0x78,0x57,0x34,0x12,0x34,0x12,0xcd,0xab,0xef,0x00,0x01,0x23,0x45,0x67,0x89,0xab
+ $named_pipe_UUID_version = 0x00,0x00
+ $named_pipe = 0x78,0x57,0x34,0x12,0x34,0x12,0xcd,0xab,0x76,0x00,0x63,0x00
+ $stage_next = 'LSAOpenPolicy'
+ }
+
+ $file_ID = $client_receive[132..147]
+
+ if($Refresh -and $stage -ne 'Exit')
+ {
+ Write-Output "[+] Session refreshed"
+ $stage = 'Exit'
+ }
+ elseif($step -ge 2)
+ {
+ $stage = 'RPCBind'
+ }
+ elseif($stage -ne 'Exit')
+ {
+ $stage = 'QueryInfoRequest'
+ }
+
+ }
+
+ 'EnumDomainUsers'
+ {
+ $step++
+ $stage = 'ParseUsers'
+ }
+
+ 'GetMembersInAlias'
+ {
+ $step++
+ [Byte[]]$SID_array = $client_receive[140..([System.BitConverter]::ToInt16($client_receive[3..1],0) - 1)]
+
+ if([System.BitConverter]::ToString($client_receive[156..159]) -eq '73-00-00-c0')
+ {
+ $stage = 'SAMRCloseRequest'
+ }
+ else
+ {
+ $named_pipe = 0x6c,0x00,0x73,0x00,0x61,0x00,0x72,0x00,0x70,0x00,0x63,0x00 # lsarpc
+ $stage = 'CreateRequest'
+ }
+
+ }
+
+ 'LookupNames'
+ {
+ $step++
+ [Byte[]]$SAMR_RID = $client_receive[152..155]
+
+ if([System.BitConverter]::ToString($client_receive[156..159]) -eq '73-00-00-c0')
+ {
+ $stage = 'SAMRCloseRequest'
+ }
+ else
+ {
+
+ if($step -eq 4)
+ {
+ $stage = 'OpenGroup'
+ }
+ else
+ {
+ $stage = 'OpenAlias'
+ }
+
+ }
+
+ }
+
+ 'LookupRids'
+ {
+ $step++
+ $stage = 'ParseLookupRids'
+ }
+
+ 'LSAClose'
+ {
+ $stage = 'CloseRequest'
+ }
+
+ 'LSALookupSids'
+ {
+ $stage = 'ParseLookupSids'
+ }
+
+ 'LSAOpenPolicy'
+ {
+ [Byte[]]$policy_handle = $client_receive[140..159]
- if($Action -eq 'All')
+ if($step -gt 2)
+ {
+ $stage = 'LSALookupSids'
+ }
+ else
+ {
+ $stage = 'LSAQueryInfoPolicy'
+ }
+
+ }
+
+ 'LSAQueryInfoPolicy'
+ {
+ [Byte[]]$LSA_domain_length_bytes = $client_receive[148..149]
+ $LSA_domain_length = [System.BitConverter]::ToInt16($LSA_domain_length_bytes,0)
+ [Byte[]]$LSA_domain_actual_count_bytes = $client_receive[168..171]
+ $LSA_domain_actual_count = [System.BitConverter]::ToInt32($LSA_domain_actual_count_bytes,0)
+
+ if($LSA_domain_actual_count % 2)
+ {
+ $LSA_domain_length += 2
+ }
+
+ [Byte[]]$LSA_domain_SID = $client_receive[(176 + $LSA_domain_length)..(199 + $LSA_domain_length)]
+ $stage = 'LSAClose'
+ }
+
+ 'NetSessEnum'
+ {
+ $stage = 'ParseSRVSVC'
+ }
+
+ 'NetShareEnumAll'
+ {
+ $stage = 'ParseSRVSVC'
+ }
+
+ 'OpenAlias'
+ {
+ $step++
+ [Byte[]]$SAMR_policy_handle = $client_receive[140..159]
+
+ if([System.BitConverter]::ToString($client_receive[156..159]) -eq '73-00-00-c0')
+ {
+ $stage = 'SAMRCloseRequest'
+ }
+ else
+ {
+ $stage = 'GetMembersInAlias'
+ }
+
+ }
+
+ 'OpenDomain'
{
+ $step++
+ [Byte[]]$SAMR_domain_handle = $client_receive[140..159]
- switch ($action_stage)
+ if($action_stage -eq 'User')
{
+ $stage = 'EnumDomainUsers'
+ }
+ else
+ {
+ $stage = 'LookupNames'
+ }
+
+ }
+
+ 'OpenGroup'
+ {
+ $step++
+ [Byte[]]$group_handle = $client_receive[140..159]
+ $stage = 'QueryGroupMember'
+ }
+
+ 'QueryGroupMember'
+ {
+ $step++
+ [Byte[]]$RID_count_bytes = $client_receive[144..147]
+ $RID_count = [System.BitConverter]::ToInt16($RID_count_bytes,0)
+ [Byte[]]$RID_list = $client_receive[160..(159 + ($RID_count * 4))]
+ $stage = 'LookupRids'
+ }
+
+ 'QueryInfoRequest'
+ {
+ $file_ID = $client_receive[132..147]
+ $stage = 'RPCBind'
+ }
+
+ 'ReadRequest'
+ {
+ $stage = $stage_next
+ }
- 'group'
+ 'RPCBind'
+ {
+ $stage = 'ReadRequest'
+ }
+
+ 'SAMRCloseRequest'
+ {
+ $step++
+
+ if($step -eq 8)
+ {
+ Write-Output "[-] $Group group not found"
+ $stage = 'TreeDisconnect'
+ }
+ else
+ {
+
+ if($step -eq 5 -and $action_stage -eq 'Group')
{
- $action_stage = "user"
- $stage = "treeconnect"
- $step = 0
+ $LSA_domain_SID = 0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x05,0x20,0x00,0x00,0x00
+ $SID_count = 0x01,0x00,0x00,0x00
}
- 'user'
+ $stage = 'OpenDomain'
+ }
+
+ }
+
+ 'TreeConnect'
+ {
+ $tree_ID = $client_receive[40..43]
+ $access_mask = $null
+
+ if($client_receive[76] -eq 92)
+ {
+ $tree_access_mask = 0x00,0x00,0x00,0x00
+ }
+ else
+ {
+ $tree_access_mask = $client_receive[80..83]
+ }
+
+ if($share_list.Count -gt 0)
+ {
+
+ if($client_receive[76] -ne 92)
{
- $action_stage = "netsession"
- $stage = "treeconnect"
+
+ ForEach($byte in $tree_access_mask)
+ {
+ $access_mask = [System.Convert]::ToString($byte,2).PadLeft(8,'0') + $access_mask
+ }
+
+ $response_object_list | Where-Object {$_.Share -eq $share_list[$j]} | ForEach-Object {$_."Access Mask" = $access_mask}
+ $stage = 'TreeDisconnect'
+ }
+ else
+ {
+ $access_mask = "00000000000000000000000000000000"
+ $response_object_list | Where-Object {$_.Share -eq $share_list[$j]} | ForEach-Object {$_."Access Mask" = $access_mask}
+ $stage = 'TreeConnect'
+ $j++
}
- 'netsession'
+ }
+ else
+ {
+
+ if($action_stage -eq 'Share' -or $action_stage -eq 'NetSession')
+ {
+ $named_pipe = 0x73,0x00,0x72,0x00,0x76,0x00,0x73,0x00,0x76,0x00,0x63,0x00 # srvsvc
+ }
+ else
{
- $action_stage = "share"
- $stage = "treeconnect"
+ $named_pipe = 0x6c,0x00,0x73,0x00,0x61,0x00,0x72,0x00,0x70,0x00,0x63,0x00 # lsarpc
}
- 'share'
+ $tree_IPC = $tree_ID
+ $stage = 'CreateRequest'
+ }
+
+ }
+
+ 'TreeDisconnect'
+ {
+
+ if($Action -eq 'All')
+ {
+
+ switch ($action_stage)
{
- if($share_list.Count -gt 0 -and $j -lt $share_list.Count - 1)
+ 'group'
{
- $stage = 'TreeConnect'
- $j++
+ $action_stage = "user"
+ $stage = "treeconnect"
+ $step = 0
}
- elseif($share_list.Count -gt 0 -and $j -eq $share_list.Count - 1)
+
+ 'user'
{
- $response_object_list | Sort-Object -property Share |Format-Table -AutoSize
- $tree_ID = $tree_IPC
- $stage = 'TreeDisconnect'
- $j++
+ $action_stage = "netsession"
+ $stage = "treeconnect"
}
- else
+
+ 'netsession'
{
-
- if($inveigh_session -and !$Logoff)
+ $action_stage = "share"
+ $stage = "treeconnect"
+ }
+
+ 'share'
+ {
+
+ if($share_list.Count -gt 0 -and $j -lt $share_list.Count - 1)
{
- $stage = 'Exit'
+ $stage = 'TreeConnect'
+ $j++
}
- else
+ elseif($share_list.Count -gt 0 -and $j -eq $share_list.Count - 1)
{
- $stage = 'Logoff'
+ Write-Output $response_object_list | Sort-Object -property Share |Format-Table -AutoSize
+ $tree_ID = $tree_IPC
+ $stage = 'TreeDisconnect'
+ $j++
}
+ else
+ {
+
+ if($inveigh_session -and !$Logoff)
+ {
+ $stage = 'Exit'
+ }
+ else
+ {
+ $stage = 'Logoff'
+ }
+ }
+
}
-
- }
- }
+ }
- }
- else
- {
-
- if($action_stage -eq 'Share' -and $share_list.Count -gt 0 -and $j -lt $share_list.Count - 1)
- {
- $stage = 'TreeConnect'
- $j++
- }
- elseif($action_stage -eq 'Share' -and $share_list.Count -gt 0 -and $j -eq $share_list.Count - 1)
- {
- $response_object_list | Sort-Object -property Share |Format-Table -AutoSize
- $tree_ID = $tree_IPC
- $stage = 'TreeDisconnect'
- $j++
}
else
{
-
- if($inveigh_session -and !$Logoff)
+
+ if($action_stage -eq 'Share' -and $share_list.Count -gt 0 -and $j -lt $share_list.Count - 1)
+ {
+ $stage = 'TreeConnect'
+ $j++
+ }
+ elseif($action_stage -eq 'Share' -and $share_list.Count -gt 0 -and $j -eq $share_list.Count - 1)
{
- $stage = 'Exit'
+ Write-Output $response_object_list | Sort-Object -property Share |Format-Table -AutoSize
+ $tree_ID = $tree_IPC
+ $stage = 'TreeDisconnect'
+ $j++
}
else
{
- $stage = 'Logoff'
+
+ if($inveigh_session -and !$Logoff)
+ {
+ $stage = 'Exit'
+ }
+ else
+ {
+ $stage = 'Logoff'
+ }
+
}
}
-
+
}
}
- catch
- {
- Write-Output "[-] Something went wrong"
- $stage = 'Exit'
- }
}
- 'Logoff'
+ 'TreeConnect'
{
$message_ID++
- $packet_SMB_header = New-PacketSMB2Header 0x02,0x00 0x01,0x00 $message_ID $process_ID $tree_ID $session_ID
-
- if($SMB_signing)
+ $stage_current = $stage
+
+ if($share_list.Count -gt 0)
{
- $packet_SMB_header["Flags"] = 0x08,0x00,0x00,0x00
+ $path = "\\" + $Target + "\" + $share_list[$j]
+ $path_bytes = [System.Text.Encoding]::Unicode.GetBytes($path)
}
-
- $packet_SMB_data = New-PacketSMB2SessionLogoffRequest
+
+ $packet_SMB_header = New-PacketSMB2Header 0x03,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SMB_data = New-PacketSMB2TreeConnectRequest $path_bytes
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
- $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
+ $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
$packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
$NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
if($SMB_signing)
{
- $SMB_sign = $SMB_header + $SMB_data
+ $SMB_sign = $SMB_header + $SMB_data
$SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
$SMB_signature = $SMB_signature[0..15]
$packet_SMB_header["Signature"] = $SMB_signature
$SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
}
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
+
try
{
- $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
$client_stream.Write($client_send,0,$client_send.Length) > $null
$client_stream.Flush()
$client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
+ {
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
+ }
+ else
+ {
+ $stage = 'StatusReceived'
+ }
+
}
catch
{
- Write-Output "[-] Something went wrong"
+ Write-Output "[-] Session connection is closed"
+ $stage = 'Exit'
+ }
+
+ }
+
+ 'TreeDisconnect'
+ {
+ $message_ID++
+ $stage_current = $stage
+ $packet_SMB_header = New-PacketSMB2Header 0x04,0x00 0x01,0x00 $SMB_signing $message_ID $process_ID $tree_ID $session_ID
+ $packet_SMB_data = New-PacketSMB2TreeDisconnectRequest
+ $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
+ $SMB_data = ConvertFrom-PacketOrderedDictionary $packet_SMB_data
+ $packet_NetBIOS_session_service = New-PacketNetBIOSSessionService $SMB_header.Length $SMB_data.Length
+ $NetBIOS_session_service = ConvertFrom-PacketOrderedDictionary $packet_NetBIOS_session_service
+
+ if($SMB_signing)
+ {
+ $SMB_sign = $SMB_header + $SMB_data
+ $SMB_signature = $HMAC_SHA256.ComputeHash($SMB_sign)
+ $SMB_signature = $SMB_signature[0..15]
+ $packet_SMB_header["Signature"] = $SMB_signature
+ $SMB_header = ConvertFrom-PacketOrderedDictionary $packet_SMB_header
+ }
+
+ $client_send = $NetBIOS_session_service + $SMB_header + $SMB_data
+ $client_stream.Write($client_send,0,$client_send.Length) > $null
+ $client_stream.Flush()
+ $client_stream.Read($client_receive,0,$client_receive.Length) > $null
+
+ if(Get-StatusPending $client_receive[12..15])
+ {
+ $stage = 'StatusPending'
+ $stage_next = 'StatusReceived'
+ }
+ else
+ {
+ $stage = 'StatusReceived'
}
- $stage = 'Exit'
}
}
-
+
+ }
+ catch
+ {
+ $error_message = $_.Exception.Message
+ $error_message = $error_message -replace "`n",""
+ Write-Output "[-] $error_message"
}
}
+
}
if($inveigh_session -and $Inveigh)