Advertisement
opexxx

Discovery.psm1

Feb 23rd, 2014
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <#
  2. .Synopsis
  3.    Perform Whois Query
  4. .DESCRIPTION
  5.    Performs a Whois query for a given Domain.
  6. .EXAMPLE
  7.    Perfrom a whois query for google.com
  8.  
  9.    PS C:\> Get-Whois google.com
  10.  
  11. #>
  12. function Get-Whois
  13. {
  14.     [CmdletBinding(DefaultParameterSetName="Domain")]
  15.    
  16.     Param
  17.     (
  18.         # Param1 help description
  19.         [Parameter(Mandatory=$true,
  20.                    ParameterSetName = "Domain",
  21.                    ValueFromPipelineByPropertyName=$true,
  22.                    Position=0)]
  23.         [string]$Domain
  24.  
  25.         #[string]$IPAddress
  26.     )
  27.  
  28.     Begin
  29.     {
  30.         # Need to generate hash from http://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xml,
  31.         # http://www.iana.org/assignments/ipv6-address-space
  32.         # http://www.iana.org/assignments/multicast-addresses
  33.     }
  34.     Process
  35.     {
  36.         if ($Domain)
  37.         {
  38.             [WebTools.Whois]::lookup($Domain, [WebTools.Whois+RecordType]::domain)
  39.         }
  40.     }
  41.     End
  42.     {
  43.     }
  44. }
  45.  
  46.  
  47. <#
  48. .Synopsis
  49.    Enumerates all mDNS records in the local subnet.
  50. .DESCRIPTION
  51.    Unsing mDNS the function qill query and resolve all mDNS records for
  52.    devices advertising on the local subnet.
  53. .EXAMPLE
  54.    Shows only the A and AAAA Records for hosts in the local subnet
  55.  
  56.    Get-MDNSRecords | where recordtype -like "A*"
  57.  
  58. .EXAMPLE
  59.    Show only HTTP servers in the local subnet
  60.  
  61.    Get-MDNSRecords | where name -like "*_http._tcp*"
  62. #>
  63. function Get-MDNSRecords
  64. {
  65.     [CmdletBinding()]
  66.     param()
  67.     $mdns = new-object -typename ARSoft.Tools.Net.Dns.MulticastDnsOneShotClient -ArgumentList 4
  68.     $records = $mdns.Resolve("_services._dns-sd._udp.local",[ARSoft.Tools.Net.Dns.RecordType]::Any)
  69.     $doms = @();
  70.     $records| sort -Unique | foreach-object {
  71.         $_.answerrecords| foreach {
  72.             Write-Verbose $_.PointerDomainName
  73.             $doms += $_.PointerDomainName
  74.         }
  75.     }
  76.     $results = @()
  77.     $doms | foreach-object {
  78.         Write-Verbose "Resolving $($_)"
  79.         $queryres = $mdns.Resolve($_,[ARSoft.Tools.Net.Dns.RecordType]::Ptr)
  80.         $results += $queryres.answerrecords
  81.         $results += $queryres.additionalrecords
  82.        
  83.     }
  84.     $results | sort -Unique
  85. }
  86.  
  87.  
  88.  
  89. <#
  90. .Synopsis
  91.     Generates a IP Address Objects for IPv4 and IPv6 Ranges.
  92. .DESCRIPTION
  93.     Generates a IP Address Objects for IPv4 and IPv6 Ranges given a ranges in CIDR or
  94.     range <StartIP>-<EndIP> format.
  95. .EXAMPLE
  96.     PS C:\> New-IPvRange -Range 192.168.1.1-192.168.1.5
  97.  
  98.     Generate a collection of IPv4 Object collection for the specified range.
  99.  
  100. .EXAMPLE
  101.    New-IPRange -Range 192.168.1.1-192.168.1.50 | select -ExpandProperty ipaddresstostring
  102.  
  103.    Get a list of IPv4 Addresses in a given range as a list for use in another tool.
  104. #>
  105. function New-IPRange
  106. {
  107.     [CmdletBinding(DefaultParameterSetName="CIDR")]
  108.     Param(
  109.         [parameter(Mandatory=$true,
  110.         ParameterSetName = "CIDR",
  111.         Position=0)]
  112.         [string]$CIDR,
  113.  
  114.         [parameter(Mandatory=$true,
  115.         ParameterSetName = "Range",
  116.         Position=0)]
  117.         [string]$Range  
  118.     )
  119.     if($CIDR)
  120.     {
  121.         $IPPart,$MaskPart = $CIDR.Split("/")
  122.         $AddressFamily = ([System.Net.IPAddress]::Parse($IPPart)).AddressFamily
  123.  
  124.         # Get the family type for the IP (IPv4 or IPv6)
  125.         $subnetMaskObj = [IPHelper.IP.Subnetmask]::Parse($MaskPart, $AddressFamily)
  126.        
  127.         # Get the Network and Brodcast Addressed
  128.         $StartIP = [IPHelper.IP.IPAddressAnalysis]::GetClasslessNetworkAddress($IPPart, $subnetMaskObj)
  129.         $EndIP = [IPHelper.IP.IPAddressAnalysis]::GetClasslessBroadcastAddress($IPPart,$subnetMaskObj)
  130.        
  131.         # Ensure we do not list the Network and Brodcast Address
  132.         $StartIP = [IPHelper.IP.IPAddressAnalysis]::Increase($StartIP)
  133.         $EndIP = [IPHelper.IP.IPAddressAnalysis]::Decrease($EndIP)
  134.         [IPHelper.IP.IPAddressAnalysis]::GetIPRange($StartIP, $EndIP)
  135.     }
  136.     elseif ($Range)
  137.     {
  138.         $StartIP, $EndIP = $range.split("-")
  139.         [IPHelper.IP.IPAddressAnalysis]::GetIPRange($StartIP, $EndIP)
  140.     }
  141. }
  142.  
  143.  
  144. <#
  145. .Synopsis
  146.     Generates a list of IPv4 IP Addresses given a Start and End IP.
  147. .DESCRIPTION
  148.     Generates a list of IPv4 IP Addresses given a Start and End IP.
  149. .EXAMPLE
  150.     Generating a list of IPs from CIDR
  151.  
  152.     Get-IPRange 192.168.1.0/24
  153.    
  154. .EXAMPLE
  155.     Generating a list of IPs from Range
  156.  
  157.     Get-IPRange -Range 192.168.1.1-192.168.1.50
  158. #>
  159. function New-IPv4Range
  160. {
  161.     param(
  162.         [Parameter(Mandatory=$true,
  163.                    ValueFromPipelineByPropertyName=$true,
  164.                    Position=0)]
  165.                    $StartIP,
  166.                    
  167.         [Parameter(Mandatory=$true,
  168.                    ValueFromPipelineByPropertyName=$true,
  169.                    Position=2)]
  170.                    $EndIP          
  171.     )
  172.    
  173.     # created by Dr. Tobias Weltner, MVP PowerShell
  174.     $ip1 = ([System.Net.IPAddress]$StartIP).GetAddressBytes()
  175.     [Array]::Reverse($ip1)
  176.     $ip1 = ([System.Net.IPAddress]($ip1 -join '.')).Address
  177.  
  178.     $ip2 = ([System.Net.IPAddress]$EndIP).GetAddressBytes()
  179.     [Array]::Reverse($ip2)
  180.     $ip2 = ([System.Net.IPAddress]($ip2 -join '.')).Address
  181.  
  182.     for ($x=$ip1; $x -le $ip2; $x++) {
  183.         $ip = ([System.Net.IPAddress]$x).GetAddressBytes()
  184.         [Array]::Reverse($ip)
  185.         $ip -join '.'
  186.     }
  187. }
  188.  
  189.  
  190. <#
  191. .Synopsis
  192.     Generates a list of IPv4 IP Addresses given a CIDR.
  193. .DESCRIPTION
  194.     Generates a list of IPv4 IP Addresses given a CIDR.
  195. .EXAMPLE
  196.     Generating a list of IPs
  197.     PS C:\> New-IPv4RangeFromCIDR -Network 192.168.1.0/29
  198.     192.168.1.1
  199.     192.168.1.2
  200.     192.168.1.3
  201.     192.168.1.4
  202.     192.168.1.5
  203.     192.168.1.6
  204.     192.168.1.7
  205. #>
  206. function New-IPv4RangeFromCIDR
  207. {
  208.     param(
  209.         [Parameter(Mandatory=$true,
  210.                    ValueFromPipelineByPropertyName=$true,
  211.                    Position=0)]
  212.                    $Network
  213.     )
  214.     # Extract the portions of the CIDR that will be needed
  215.     $StrNetworkAddress = ($Network.split("/"))[0]
  216.     [int]$NetworkLength = ($Network.split("/"))[1]
  217.     $NetworkIP = ([System.Net.IPAddress]$StrNetworkAddress).GetAddressBytes()
  218.     $IPLength = 32-$NetworkLength
  219.     [Array]::Reverse($NetworkIP)
  220.     $NumberOfIPs = ([System.Math]::Pow(2, $IPLength)) -1
  221.     $NetworkIP = ([System.Net.IPAddress]($NetworkIP -join ".")).Address
  222.     $StartIP = $NetworkIP +1
  223.     $EndIP = $NetworkIP + $NumberOfIPs
  224.     # We make sure they are of type Double before conversion
  225.     If ($EndIP -isnot [double])
  226.     {
  227.         $EndIP = $EndIP -as [double]
  228.     }
  229.     If ($StartIP -isnot [double])
  230.     {
  231.         $StartIP = $StartIP -as [double]
  232.     }
  233.     # We turn the start IP and end IP in to strings so they can be used.
  234.     $StartIP = ([System.Net.IPAddress]$StartIP).IPAddressToString
  235.     $EndIP = ([System.Net.IPAddress]$EndIP).IPAddressToString
  236.     New-IPv4Range $StartIP $EndIP
  237. }
  238.  
  239.  
  240. <#
  241. .Synopsis
  242.    Performs a DNS Reverse Lookup of a given IPv4 IP Range.
  243. .DESCRIPTION
  244.    Performs a DNS Reverse Lookup of a given IPv4 IP Range.
  245. .EXAMPLE
  246.    Perfrom a threaded reverse lookup against a given CIDR
  247.  
  248.    PS C:\> Invoke-ReverseDNSLookup -CIDR 192.168.1.0/24
  249.  
  250. .EXAMPLE
  251.    Perfrom a reverse lookup against a given range given the start and end IP Addresses
  252.  
  253.    PS C:\> Invoke-ReverseDNSLookup -Range 192.168.1.1-192.168.1.20
  254. #>
  255. function Invoke-ReverseDNSLookup
  256. {
  257.     [CmdletBinding()]
  258.     Param
  259.     (
  260.         [Parameter(Mandatory=$true,
  261.                    ParameterSetName = "Range",
  262.                    ValueFromPipelineByPropertyName=$true,
  263.                    Position=0)]
  264.         [string]$Range,
  265.  
  266.         [Parameter(Mandatory=$true,
  267.                    ParameterSetName = "CIDR",
  268.                    ValueFromPipelineByPropertyName=$true,
  269.                    Position=0)]
  270.         [string]$CIDR,
  271.  
  272.         [Parameter(Mandatory=$false,
  273.                    ValueFromPipelineByPropertyName=$true,
  274.                    Position=0)]
  275.         [string]$MaxThreads=30,
  276.         [Parameter(
  277.                    ValueFromPipelineByPropertyName=$true,
  278.                    Position=2)]
  279.         [int]$TimeOut = 200
  280.     )
  281.  
  282.     Begin
  283.     {
  284.         # Manage if range is given
  285.         if ($Range)
  286.         {
  287.             $rangeips = $Range.Split("-")
  288.             $targets = New-IPv4Range -StartIP $rangeips[0] -EndIP $rangeips[1]
  289.         }
  290.  
  291.         # Manage if CIDR is given
  292.         if ($CIDR)
  293.         {
  294.             $targets = New-IPv4RangeFromCIDR -Network $CIDR
  295.         }
  296.     }
  297.     Process
  298.     {
  299.         $RvlScripBlock = {
  300.             param($ip)
  301.             try {
  302.             [System.Net.Dns]::GetHostEntry($ip)
  303.             }
  304.             catch {}
  305.         }
  306.  
  307.         #Multithreading setup
  308.  
  309.         # create a pool of maxThread runspaces  
  310.         $pool = [runspacefactory]::CreateRunspacePool(1, $MaxThreads)  
  311.         $pool.Open()
  312.  
  313.         $jobs = @()  
  314.         $ps = @()  
  315.         $wait = @()
  316.  
  317.         $i = 0
  318.  
  319.         # How many servers
  320.         $record_count = $targets.Length
  321.  
  322.         #Loop through the endpoints starting a background job for each endpoint
  323.         foreach ($ip in $targets)
  324.         {
  325.             Write-Verbose $ip
  326.             # Show Progress
  327.             $record_progress = [int][Math]::Ceiling((($i / $record_count) * 100))
  328.             Write-Progress -Activity "Performing DNS Reverse Lookup Discovery" -PercentComplete $record_progress -Status "Reverse Lookup - $record_progress%" -Id 1;
  329.  
  330.             while ($($pool.GetAvailableRunspaces()) -le 0)
  331.             {
  332.                 Start-Sleep -milliseconds 500
  333.             }
  334.    
  335.             # create a "powershell pipeline runner"  
  336.             $ps += [powershell]::create()
  337.  
  338.             # assign our pool of 3 runspaces to use  
  339.             $ps[$i].runspacepool = $pool
  340.  
  341.             # command to run
  342.             [void]$ps[$i].AddScript($RvlScripBlock).AddParameter('ip', $ip)
  343.             #[void]$ps[$i].AddParameter('ping', $ping)
  344.    
  345.             # start job
  346.             $jobs += $ps[$i].BeginInvoke();
  347.      
  348.             # store wait handles for WaitForAll call  
  349.             $wait += $jobs[$i].AsyncWaitHandle
  350.    
  351.             $i++
  352.         }
  353.  
  354.         $waitTimeout = get-date
  355.  
  356.         while ($($jobs | ? {$_.IsCompleted -eq $false}).count -gt 0 -or $($($(get-date) - $waitTimeout).totalSeconds) -gt 60) {
  357.                 Start-Sleep -milliseconds 500
  358.             }
  359.  
  360.         # end async call  
  361.         for ($y = 0; $y -lt $i; $y++) {    
  362.  
  363.             try
  364.             {  
  365.                 # complete async job  
  366.                 $ScanResults += $ps[$y].EndInvoke($jobs[$y])  
  367.  
  368.             }
  369.             catch
  370.             {  
  371.        
  372.                 # oops-ee!  
  373.                 write-warning "error: $_"  
  374.             }
  375.    
  376.             finally
  377.             {
  378.                 $ps[$y].Dispose()
  379.             }    
  380.         }
  381.  
  382.         $pool.Dispose()
  383.     }
  384.  
  385.     end
  386.     {
  387.         $ScanResults
  388.     }
  389. }
  390.  
  391.  
  392. <#
  393. .Synopsis
  394.    Performs a Ping Scan against a given range of IPv4 IP addresses.
  395. .DESCRIPTION
  396.    Performs a Ping Scan against a given range of IPv4 IP addresses by sending
  397.    ICMP Echo Packets.
  398. .EXAMPLE
  399.    Perform Ping Scan against a given range in CIDR format
  400.  
  401.    PS C:\> Invoke-PingScan -CIDR 192.168.1.0/24
  402. .EXAMPLE
  403.    Perform Ping Scan against a given range given the start and end IP Addresses
  404.  
  405.    PS C:\> Invoke-PingScan -Range 192.168.1.1-192.168.1.10
  406. #>
  407. function Invoke-PingScan
  408. {
  409.     [CmdletBinding()]
  410.     Param
  411.     (
  412.         # IP Range to perform ping scan against.
  413.         [Parameter(Mandatory=$true,
  414.                    ParameterSetName = "Range",
  415.                    ValueFromPipelineByPropertyName=$true,
  416.                    Position=0)]
  417.         [string]$Range,
  418.  
  419.         # IP CIDR to perform ping scan against.
  420.         [Parameter(Mandatory=$true,
  421.                    ParameterSetName = "CIDR",
  422.                    ValueFromPipelineByPropertyName=$true,
  423.                    Position=0)]
  424.         [string]$CIDR,
  425.  
  426.         # Number of concurrent threads to execute
  427.         [Parameter(Mandatory=$false,
  428.                    ValueFromPipelineByPropertyName=$true,
  429.                    Position=1)]
  430.         [string]$MaxThreads=10,
  431.  
  432.         # Timeout in miliseconds for the ICMP Echo request.
  433.         [Parameter(ValueFromPipelineByPropertyName=$true,
  434.                    Position=2)]
  435.         [int]$TimeOut = 200
  436.     )
  437.  
  438.     Begin
  439.     {
  440.         # Manage if range is given
  441.         if ($Range)
  442.         {
  443.             $rangeips = $Range.Split("-")
  444.             $targets = New-IPv4Range -StartIP $rangeips[0] -EndIP $rangeips[1]
  445.         }
  446.  
  447.         # Manage if CIDR is given
  448.         if ($CIDR)
  449.         {
  450.             $targets = New-IPv4RangeFromCIDR -Network $CIDR
  451.         }
  452.     }
  453.     Process
  454.     {
  455.         $PingScripBlock = {
  456.             param($ip, $TimeOut)
  457.             $ping = New-Object System.Net.NetworkInformation.Ping
  458.             $result = $ping.Send($ip, $TimeOut)
  459.             if ($result.Status -eq 'success')
  460.             {
  461.                 new-object psobject -Property @{Address = $result.Address; Time = $result.RoundtripTime}
  462.             }
  463.         }
  464.  
  465.         #Multithreading setup
  466.  
  467.         # create a pool of maxThread runspaces  
  468.         $pool = [runspacefactory]::CreateRunspacePool(1, $MaxThreads)  
  469.         $pool.Open()
  470.  
  471.         $jobs = @()  
  472.         $ps = @()  
  473.         $wait = @()
  474.  
  475.         $i = 0
  476.  
  477.         # How many servers
  478.         $record_count = $targets.Length
  479.  
  480.         #Loop through the endpoints starting a background job for each endpoint
  481.         foreach ($ip in $targets)
  482.         {
  483.             Write-Verbose $ip
  484.             # Show Progress
  485.             $record_progress = [int][Math]::Ceiling((($i / $record_count) * 100))
  486.             Write-Progress -Activity "Performing Ping Discovery" -PercentComplete $record_progress -Status "Pinged Host - $record_progress%" -Id 1;
  487.  
  488.             while ($($pool.GetAvailableRunspaces()) -le 0) {
  489.                 Start-Sleep -milliseconds 500
  490.             }
  491.    
  492.             # create a "powershell pipeline runner"  
  493.             $ps += [powershell]::create()
  494.    
  495.             $ps[$i].runspacepool = $pool
  496.  
  497.             # command to run
  498.             [void]$ps[$i].AddScript($PingScripBlock).AddParameter('ip', $ip).AddParameter('Timeout', $TimeOut)
  499.    
  500.             # start job
  501.             $jobs += $ps[$i].BeginInvoke();
  502.      
  503.             # store wait handles for WaitForAll call  
  504.             $wait += $jobs[$i].AsyncWaitHandle
  505.    
  506.             $i++
  507.         }
  508.  
  509.         write-verbose "Waiting for scanning threads to finish..."
  510.  
  511.         $waitTimeout = get-date
  512.  
  513.         while ($($jobs | ? {$_.IsCompleted -eq $false}).count -gt 0 -or $($($(get-date) - $waitTimeout).totalSeconds) -gt 60) {
  514.                 Start-Sleep -milliseconds 500
  515.             }
  516.  
  517.         # end async call  
  518.         for ($y = 0; $y -lt $i; $y++) {    
  519.  
  520.             try {  
  521.                 # complete async job  
  522.                 $ScanResults += $ps[$y].EndInvoke($jobs[$y])  
  523.  
  524.             } catch {
  525.                 write-warning "error: $_"  
  526.             }
  527.    
  528.             finally {
  529.                 $ps[$y].Dispose()
  530.             }    
  531.         }
  532.  
  533.         $pool.Dispose()
  534.     }
  535.  
  536.     end
  537.     {
  538.         $ScanResults
  539.     }
  540. }
  541.  
  542.  
  543. <#
  544. .Synopsis
  545.    Performs full TCP Connection and UDP port scan.
  546. .DESCRIPTION
  547.    Performs full TCP Connection and UDP port scan against a given host
  548.    or range of IPv4 addresses.
  549. .EXAMPLE
  550.    Perform TCP Scan of known ports against a host
  551.    
  552.     PS C:\> Invoke-PortScan -Target 172.20.10.3 -Ports 22,135,139,445 -Type TCP
  553.  
  554.     Host                                                 Port State                        Type                        
  555.     ----                                                 ---- -----                        ----                        
  556.     172.20.10.3                                           135 Open                         TCP                        
  557.     172.20.10.3                                           139 Open                         TCP                        
  558.     172.20.10.3                                           445 Open                         TCP                        
  559.  
  560. #>
  561. function Invoke-PortScan
  562. {
  563.     [CmdletBinding()]
  564.    
  565.     Param
  566.     (
  567.         # Param1 help description
  568.         [Parameter(Mandatory=$true,
  569.                    ParameterSetName = "SingleIP",
  570.                    ValueFromPipelineByPropertyName=$true,
  571.                    Position=0)]
  572.         [Alias("IPAddress,Host")]
  573.         [string]$Target,
  574.  
  575.         [Parameter(Mandatory=$true,
  576.                    ParameterSetName = "Range",
  577.                    ValueFromPipelineByPropertyName=$true,
  578.                    Position=0)]
  579.         [string]$Range,
  580.  
  581.         [Parameter(Mandatory=$true,
  582.                    ParameterSetName = "CIDR",
  583.                    ValueFromPipelineByPropertyName=$true,
  584.                    Position=0)]
  585.         [string]$CIDR,
  586.  
  587.         [Parameter(Mandatory=$false,
  588.                    ValueFromPipelineByPropertyName=$false,
  589.                    Position=1)]
  590.         [int32[]]$Ports,
  591.  
  592.         [Parameter(Mandatory=$true,
  593.                    ValueFromPipelineByPropertyName=$false,
  594.                    Position=2)]
  595.         [ValidateSet("TCP", "UDP")]
  596.         [String[]]$Type,
  597.  
  598.         [Parameter(Mandatory=$false,
  599.                    ValueFromPipelineByPropertyName=$false,
  600.                    Position=3)]
  601.         [ValidateSet("TCP", "UDP")]
  602.         [int32]$Timeout=100
  603.  
  604.  
  605.     )
  606.  
  607.     Begin
  608.     {
  609.         # Expand the needed address ranges
  610.         if ($Range)
  611.         {
  612.             $rangeips = $Range.Split("-")
  613.             $targets = New-IPv4Range -StartIP $rangeips[0] -EndIP $rangeips[1]
  614.         }
  615.  
  616.         # Expnd CIDR
  617.         if ($CIDR)
  618.         {
  619.             $targets = New-IPv4RangeFromCIDR -Network $CIDR
  620.         }
  621.  
  622.         # Manage single target
  623.         if ($Target)
  624.         {
  625.             $targets = @($Target)
  626.         }
  627.        
  628.         # Set the default ports
  629.  
  630.     }
  631.     Process
  632.     {
  633.         foreach ($t in $Type)
  634.         {
  635.             if ($t -eq "TCP")
  636.             {
  637.                 foreach ($ip in $targets)
  638.                 {
  639.                     foreach($p in $Ports)
  640.                     {
  641.                         try
  642.                         {
  643.                             $TcpSocket = new-object System.Net.Sockets.TcpClient
  644.                             #$TcpSocket.client.ReceiveTimeout = $Timeout
  645.                             # Connect to target host and port
  646.                             $TcpSocket.Connect($ip, $p)
  647.                             $ScanPortProps = New-Object -TypeName System.Collections.Specialized.OrderedDictionary
  648.                             $ScanPortProps.Add("Host",$ip)
  649.                             $ScanPortProps.Add("Port",$p)
  650.                             $ScanPortProps.Add("State","Open")
  651.                             $ScanPortProps.Add("Type","TCP")
  652.                             $scanport = New-Object psobject -Property $ScanPortProps
  653.  
  654.                             # Close Connection
  655.                             $tcpsocket.Close()
  656.                             $scanport
  657.                         }
  658.                         catch
  659.                         {
  660.                             Write-Verbose "Port $p is closed"
  661.                         }
  662.                     }
  663.                 }
  664.             }
  665.             elseif ($t -eq "UDP")
  666.             {
  667.                 foreach ($ip in $targets)
  668.                 {
  669.                     foreach($p in $Ports)
  670.                     {
  671.                    
  672.                         $UDPSocket = new-object System.Net.Sockets.UdpClient
  673.                         $UDPSocket.client.ReceiveTimeout = $Timeout
  674.                         $UDPSocket.Connect($ip,$p)
  675.  
  676.                         $data = New-Object System.Text.ASCIIEncoding
  677.                         $byte = $data.GetBytes("$(Get-Date)")
  678.  
  679.                         #Send the data to the endpoint
  680.                         [void] $UDPSocket.Send($byte,$byte.length)
  681.  
  682.                         #Create a listener to listen for response
  683.                         $Endpoint = New-Object System.Net.IPEndPoint([system.net.ipaddress]::Any,0)
  684.  
  685.                         try
  686.                         {
  687.                             #Attempt to receive a response indicating the port was open
  688.                             $receivebytes = $UDPSocket.Receive([ref] $Endpoint)
  689.                             [string] $returndata = $data.GetString($receivebytes)
  690.                             $ScanPortProps = New-Object -TypeName System.Collections.Specialized.OrderedDictionary
  691.                             $ScanPortProps.Add("Host",$ip)
  692.                             $ScanPortProps.Add("Port",$p)
  693.                             $ScanPortProps.Add("State","Open")
  694.                             $ScanPortProps.Add("Type","UDP")
  695.                             $scanport = New-Object psobject -Property $ScanPortProps
  696.                             $scanport
  697.                         }
  698.            
  699.                         catch
  700.                         {
  701.                             #Timeout or connection refused
  702.                             Write-Verbose "Port $p is closed"
  703.                         }
  704.  
  705.                         finally
  706.                         {
  707.                             #Cleanup
  708.                             $UDPSocket.Close()
  709.                         }
  710.  
  711.                     }
  712.                 }
  713.             }
  714.         }
  715.     }
  716.     End
  717.     {
  718.     }
  719. }
  720.  
  721.  
  722. <#
  723. .Synopsis
  724.    Performs an ARP scan against a given range of IPv4 IP Addresses.
  725. .DESCRIPTION
  726.    Performs an ARP scan against a given range of IPv4 IP Addresses.
  727. .EXAMPLE
  728.    Invoke an ARP Scan against a range of IPs specified in CIDR Format
  729.  
  730.     PS C:\> Invoke-ARPScan -CIDR 172.20.10.1/24
  731.  
  732.     MAC                                                       Address                                                  
  733.     ---                                                       -------                                                  
  734.     14:10:9F:D5:1A:BF                                         172.20.10.2                                              
  735.     00:0C:29:93:10:B5                                         172.20.10.3                                              
  736.     00:0C:29:93:10:B5                                         172.20.10.15  
  737. #>
  738. function Invoke-ARPScan {
  739.  
  740.     param (
  741.         [Parameter(Mandatory=$true,
  742.                    ParameterSetName = "Range",
  743.                    ValueFromPipelineByPropertyName=$true,
  744.                    Position=0)]
  745.         [string]$Range,
  746.  
  747.         [Parameter(Mandatory=$true,
  748.                    ParameterSetName = "CIDR",
  749.                    ValueFromPipelineByPropertyName=$true,
  750.                    Position=0)]
  751.         [string]$CIDR,
  752.  
  753.         [Parameter(Mandatory=$false,
  754.                    ValueFromPipelineByPropertyName=$true,
  755.                    Position=0)]
  756.         [string]$MaxThreads=50
  757.     )
  758.  
  759.  
  760.     Begin
  761.     {
  762. $sign = @"
  763. using System;
  764. using System.Collections.Generic;
  765. using System.Text;
  766. using System.Net;
  767. using System.Net.NetworkInformation;
  768. using System.Runtime.InteropServices;
  769.  
  770. public static class NetUtils
  771. {
  772.    [System.Runtime.InteropServices.DllImport("iphlpapi.dll", ExactSpelling = true)]
  773.    static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref int PhyAddrLen);
  774.  
  775.    public static string GetMacAddress(String addr)
  776.    {
  777.        try
  778.                {                  
  779.                    IPAddress IPaddr = IPAddress.Parse(addr);
  780.                  
  781.                    byte[] mac = new byte[6];
  782.                    
  783.                    int L = 6;
  784.                    
  785.                    SendARP(BitConverter.ToInt32(IPaddr.GetAddressBytes(), 0), 0, mac, ref L);
  786.                    
  787.                    String macAddr = BitConverter.ToString(mac, 0, L);
  788.                    
  789.                    return (macAddr.Replace('-',':'));
  790.                }
  791.  
  792.                catch (Exception ex)
  793.                {
  794.                    return (ex.Message);              
  795.                }
  796.    }
  797. }
  798. "@
  799.         try
  800.         {
  801.             Write-Verbose "Instanciating NetUtils"
  802.             $IPHlp = Add-Type -TypeDefinition $sign -Language CSharp -PassThru
  803.         }
  804.         catch
  805.         {
  806.             Write-Verbose "NetUtils already instanciated"
  807.         }
  808.  
  809.         # Manage if range is given
  810.         if ($Range)
  811.         {
  812.             $rangeips = $Range.Split("-")
  813.             $targets = New-IPv4Range -StartIP $rangeips[0] -EndIP $rangeips[1]
  814.         }
  815.  
  816.         # Manage if CIDR is given
  817.         if ($CIDR)
  818.         {
  819.             $targets = New-IPv4RangeFromCIDR -Network $CIDR
  820.         }
  821.     }
  822.     Process
  823.     {
  824.  
  825.  
  826.         $scancode = {
  827.             param($IPAddress,$IPHlp)
  828.             $result = $IPHlp::GetMacAddress($IPAddress)
  829.             if ($result) {New-Object psobject -Property @{Address = $IPAddress; MAC = $result}}
  830.         } # end ScanCode var
  831.  
  832.         $jobs = @()
  833.  
  834.    
  835.  
  836.         $start = get-date
  837.         write-verbose "Begin Scanning at $start"
  838.  
  839.         #Multithreading setup
  840.  
  841.         # create a pool of maxThread runspaces  
  842.         $pool = [runspacefactory]::CreateRunspacePool(1, $MaxThreads)  
  843.         $pool.Open()
  844.  
  845.         $jobs = @()  
  846.         $ps = @()  
  847.         $wait = @()
  848.  
  849.         $i = 0
  850.  
  851.         # How many servers
  852.         $record_count = $targets.Length
  853.  
  854.         #Loop through the endpoints starting a background job for each endpoint
  855.         foreach ($IPAddress in $targets)
  856.         {
  857.             # Show Progress
  858.             $record_progress = [int][Math]::Ceiling((($i / $record_count) * 100))
  859.             Write-Progress -Activity "Performing ARP Scan" -PercentComplete $record_progress -Status "Addresses Queried - $record_progress%" -Id 1;
  860.  
  861.             while ($($pool.GetAvailableRunspaces()) -le 0)
  862.             {
  863.                 Start-Sleep -milliseconds 500
  864.             }
  865.    
  866.             # create a "powershell pipeline runner"  
  867.             $ps += [powershell]::create()
  868.  
  869.             # assign our pool of 3 runspaces to use  
  870.             $ps[$i].runspacepool = $pool
  871.  
  872.             # command to run
  873.             [void]$ps[$i].AddScript($scancode).AddParameter('IPaddress', $IPAddress).AddParameter('IPHlp', $IPHlp)
  874.             #[void]$ps[$i].AddParameter()
  875.    
  876.             # start job
  877.             $jobs += $ps[$i].BeginInvoke();
  878.      
  879.             # store wait handles for WaitForAll call  
  880.             $wait += $jobs[$i].AsyncWaitHandle
  881.    
  882.             $i++
  883.         }
  884.  
  885.         write-verbose "Waiting for scanning threads to finish..."
  886.  
  887.         $waitTimeout = get-date
  888.  
  889.         while ($($jobs | ? {$_.IsCompleted -eq $false}).count -gt 0 -or $($($(get-date) - $waitTimeout).totalSeconds) -gt 60)
  890.         {
  891.                 Start-Sleep -milliseconds 500
  892.         }
  893.  
  894.         # end async call  
  895.         for ($y = 0; $y -lt $i; $y++) {    
  896.  
  897.             try
  898.             {  
  899.                 # complete async job  
  900.                 $ScanResults += $ps[$y].EndInvoke($jobs[$y])  
  901.  
  902.             }
  903.             catch
  904.             {  
  905.        
  906.                 write-warning "error: $_"  
  907.             }
  908.    
  909.             finally
  910.             {
  911.                 $ps[$y].Dispose()
  912.             }    
  913.         }
  914.  
  915.         $pool.Dispose()
  916.     }
  917.  
  918.     end
  919.     {
  920.         $ScanResults
  921.     }
  922. }
  923.  
  924.  
  925. <#
  926. .Synopsis
  927.    Enumerates the DNS Servers used by a system
  928. .DESCRIPTION
  929.    Enumerates the DNS Servers used by a system returning an IP Address .Net object for each.
  930. .EXAMPLE
  931.    C:\> Get-SystemDNSServer
  932.  
  933.  
  934.     Address            : 16885952
  935.     AddressFamily      : InterNetwork
  936.     ScopeId            :
  937.     IsIPv6Multicast    : False
  938.     IsIPv6LinkLocal    : False
  939.     IsIPv6SiteLocal    : False
  940.     IsIPv6Teredo       : False
  941.     IsIPv4MappedToIPv6 : False
  942.     IPAddressToString  : 192.168.1.1
  943. #>
  944.  
  945. function Get-SystemDNSServer
  946. {
  947.     $DNSServerAddresses = @()
  948.     $interfaces = [System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces()
  949.     foreach($interface in $interfaces)
  950.     {
  951.         if($interface.OperationalStatus -eq "Up")
  952.         {
  953.             $DNSConfig = $interface.GetIPProperties().DnsAddresses
  954.             if (!$DNSConfig.IsIPv6SiteLocal)
  955.             {
  956.                 $DNSServerAddresses += $DNSConfig
  957.             }
  958.         }
  959.     }
  960.     $DNSServerAddresses
  961. }
  962.  
  963.  
  964. <#
  965. .Synopsis
  966.    Enumerates common DNS SRV Records for a given domain.
  967. .DESCRIPTION
  968.    Enumerates common DNS SRV Records for a given domain.
  969. .EXAMPLE
  970.    PS C:\> Invoke-EnumSRVRecords -Domain microsoft.com
  971.  
  972.  
  973.     Type     : SRV
  974.     Name     : _sip._tls.microsoft.com
  975.     Port     : 443
  976.     Priority : 0
  977.     Target   : sip.microsoft.com.
  978.     Address   : @{Name=sip.microsoft.com; Type=A; Address=65.55.30.130}
  979.  
  980.     Type     : SRV
  981.     Name     : _sipfederationtls._tcp.microsoft.com
  982.     Port     : 5061
  983.     Priority : 0
  984.     Target   : sipfed.microsoft.com.
  985.     Address   : @{Name=sipfed.microsoft.com; Type=A; Address=65.55.30.130}
  986.  
  987.     Type     : SRV
  988.     Name     : _xmpp-server._tcp.microsoft.com
  989.     Port     : 5269
  990.     Priority : 0
  991.     Target   : sipdog3.microsoft.com.
  992.     Address   : @{Name=sipdog3.microsoft.com; Type=A; Address=131.107.1.47}
  993. #>
  994.  
  995. function Invoke-EnumSRVRecords
  996. {
  997.     Param(
  998.         [Parameter(Mandatory = $true)]
  999.         [string]$Domain,
  1000.  
  1001.         [Parameter(Mandatory = $false)]
  1002.         [string]$NameServer,
  1003.  
  1004.         [Parameter(Mandatory = $false)]
  1005.         [int32]$TimeOut,
  1006.  
  1007.         [Parameter(Mandatory = $false)]
  1008.         [int32]$Retries
  1009.         )
  1010.     Begin
  1011.     {
  1012.        
  1013.         # Records to test against
  1014.         $srv_rcds = @('_gc._tcp.', '_kerberos._tcp.', '_kerberos._udp.', '_ldap._tcp.',
  1015.         '_test._tcp.', '_sips._tcp.', '_sip._udp.', '_sip._tcp.', '_aix._tcp.',
  1016.         '_aix._tcp.', '_finger._tcp.', '_ftp._tcp.', '_http._tcp.', '_nntp._tcp.',
  1017.         '_telnet._tcp.', '_whois._tcp.', '_h323cs._tcp.', '_h323cs._udp.',
  1018.         '_h323be._tcp.', '_h323be._udp.', '_h323ls._tcp.', '_https._tcp.',
  1019.         '_h323ls._udp.', '_sipinternal._tcp.', '_sipinternaltls._tcp.',
  1020.         '_sip._tls.', '_sipfederationtls._tcp.', '_jabber._tcp.',
  1021.         '_xmpp-server._tcp.', '_xmpp-client._tcp.', '_imap.tcp.',
  1022.         '_certificates._tcp.', '_crls._tcp.', '_pgpkeys._tcp.',
  1023.         '_pgprevokations._tcp.', '_cmp._tcp.', '_svcp._tcp.', '_crl._tcp.',
  1024.         '_ocsp._tcp.', '_PKIXREP._tcp.', '_smtp._tcp.', '_hkp._tcp.',
  1025.         '_hkps._tcp.', '_jabber._udp.', '_xmpp-server._udp.', '_xmpp-client._udp.',
  1026.         '_jabber-client._tcp.', '_jabber-client._udp.', '_kerberos.tcp.dc._msdcs.',
  1027.         '_ldap._tcp.ForestDNSZones.', '_ldap._tcp.dc._msdcs.', '_ldap._tcp.pdc._msdcs.',
  1028.         '_ldap._tcp.gc._msdcs.', '_kerberos._tcp.dc._msdcs.', '_kpasswd._tcp.', '_kpasswd._udp.',
  1029.         '_imap._tcp.')
  1030.  
  1031.         $dnsopts = new-object JHSoftware.DnsClient+RequestOptions
  1032.         # Set the NS Server if one givem
  1033.         if ($nameserver)
  1034.         {
  1035.             try
  1036.             {
  1037.                 # Check if what we got is an IP or a FQDN
  1038.                 $IPObj = [Net.IPAddress]::Parse($nameserver)
  1039.                 $IPCheck = [System.Net.IPAddress]::TryParse($nameserver,[ref]$IPObj)
  1040.                 if ($IPCheck)
  1041.                 {
  1042.                     $dns = [System.Net.IPAddress]$nameserver
  1043.                     $dnsopts.DnsServers += $dns
  1044.                 }
  1045.                 else
  1046.                 {
  1047.                     Write-Error "$nameserver is not a valid IP Address"
  1048.                 }
  1049.             }
  1050.  
  1051.             catch
  1052.             {
  1053.                 $nsip = [Net.Dns]::GetHostAddresses($nameserver)[0]
  1054.                 $dns = $nsip
  1055.                 $dnsopts.DnsServers += $dns
  1056.             }
  1057.          }
  1058.          # Set the timeout
  1059.          if ($TimeOut)
  1060.          {
  1061.             $dnsopts.TimeOut = New-TimeSpan -Seconds $TimeOut
  1062.          }
  1063.  
  1064.          # Set Retries
  1065.          if ($Retries)
  1066.          {
  1067.             $dnsopts.RetryCount = $Retries
  1068.          }
  1069.          # Collection of records found
  1070.          $found = @()
  1071.     }
  1072.    
  1073.     Process
  1074.     {
  1075.         $i = 0
  1076.         $record_count = $srv_rcds.Length
  1077.         foreach($srv in  $srv_rcds)
  1078.             {
  1079.                 $record_progress = [int][Math]::Ceiling((($i / $record_count) * 100))
  1080.                 Write-Progress -Activity "Enumerating Common SRV Records" -PercentComplete $record_progress -Status "Records  - $record_progress%" -Id 1;
  1081.                 $target = $srv+$domain
  1082.  
  1083.                 try
  1084.                 {
  1085.                     $found += [JHSoftware.DnsClient]::Lookup($target,[JHSoftware.DnsClient+RecordType]::SRV,$dnsopts).AnswerRecords
  1086.                 }
  1087.                 catch
  1088.                 {
  1089.                 }
  1090.                 $i++
  1091.             }
  1092.         foreach($recond in $found)
  1093.         {
  1094.             $data_info = $recond.Data.split(' ')
  1095.             New-Object psobject -Property ([ordered]@{Type=$recond.Type;
  1096.                 Name =$recond.name;
  1097.                 Port=$data_info[2];Priority=$data_info[1];
  1098.                 Target=$data_info[3]
  1099.                 Address = & {
  1100.                                 if ($NameServer)
  1101.                                 {
  1102.                                     Resolve-HostRecord -Target $data_info[3] -NameServer $NameServer}
  1103.                                 else
  1104.                                 {
  1105.                                     Resolve-HostRecord -Target $data_info[3]
  1106.                                 }
  1107.                             }
  1108.             })
  1109.         }
  1110.     }
  1111.  
  1112. }
  1113.  
  1114.  
  1115. <#
  1116. .Synopsis
  1117.    Resolve a given FQDN
  1118. .DESCRIPTION
  1119.    Resolves a given FQDN to its A, AAAA and CNAME record.
  1120. .EXAMPLE
  1121.  
  1122.    C:\> Resolve-HostRecord ipv6.google.com
  1123.  
  1124.     Name                                                   Type Address
  1125.     ----                                                   ---- -------
  1126.     ipv6.google.com                                       CNAME ipv6.l.google.com.
  1127.     ipv6.l.google.com                                      AAAA 2607:f8b0:4002:c02::93
  1128. #>
  1129.  
  1130. function Resolve-HostRecord
  1131. {
  1132.     param(
  1133.         [Parameter(Mandatory = $true)]
  1134.         [string]$Target,
  1135.  
  1136.         [Parameter(Mandatory = $false)]
  1137.         [string]$NameServer,
  1138.  
  1139.         [Parameter(Mandatory = $false)]
  1140.         [int32]$TimeOut,
  1141.  
  1142.         [Parameter(Mandatory = $false)]
  1143.         [int32]$Retries
  1144.     )
  1145.  
  1146.     begin
  1147.     {
  1148.         $dnsopts = new-object JHSoftware.DnsClient+RequestOptions
  1149.         # Set the NS Server if one givem
  1150.         if ($nameserver)
  1151.         {
  1152.             try
  1153.             {
  1154.                 # Check if what we got is an IP or a FQDN
  1155.                 $IPObj = [Net.IPAddress]::Parse($nameserver)
  1156.                 $IPCheck = [System.Net.IPAddress]::TryParse($nameserver,[ref]$IPObj)
  1157.                 if ($IPCheck)
  1158.                 {
  1159.                     $dns = [System.Net.IPAddress]$nameserver
  1160.                     $dnsopts.DnsServers += $dns
  1161.                 }
  1162.                 else
  1163.                 {
  1164.                     Write-Error "$nameserver is not a valid IP Address"
  1165.                 }
  1166.             }
  1167.  
  1168.             catch
  1169.             {
  1170.                 $nsip = [Net.Dns]::GetHostAddresses($nameserver)[0]
  1171.                 $dns = $nsip
  1172.                 $dnsopts.DnsServers += $dns
  1173.             }
  1174.          }
  1175.          # Set the timeout
  1176.          if ($TimeOut)
  1177.          {
  1178.             $dnsopts.TimeOut = New-TimeSpan -Seconds $TimeOut
  1179.          }
  1180.  
  1181.          # Set Retries
  1182.          if ($Retries)
  1183.          {
  1184.             $dnsopts.RetryCount = $Retries
  1185.          }
  1186.     }
  1187.     process
  1188.     {
  1189.         $ARecs = @()
  1190.         # Resolve A Record
  1191.         try
  1192.         {
  1193.             $answer = [JHSoftware.DnsClient]::Lookup($target,[JHSoftware.DnsClient+RecordType]::A,$dnsopts).AnswerRecords
  1194.             foreach ($A in $answer)
  1195.             {
  1196.             $ARecs += Select-Object -InputObject $A -Property Name,Type,@{Name='Address';Expression={$A.Data}}
  1197.             }
  1198.         }
  1199.         catch {}
  1200.         try
  1201.         {
  1202.             # Resolve AAAA Recod
  1203.             $answer = [JHSoftware.DnsClient]::Lookup($target,[JHSoftware.DnsClient+RecordType]::AAAA,$dnsopts).AnswerRecords
  1204.             foreach ($AAAA in $answer)
  1205.             {
  1206.                $ARecs += Select-Object -InputObject $AAAA -Property Name,Type,@{Name='Address';Expression={$AAAA.Data}}
  1207.             }
  1208.         }
  1209.         catch {}
  1210.     }
  1211.  
  1212.     end
  1213.     {
  1214.         $ARecs
  1215.     }
  1216. }
  1217.  
  1218.  
  1219. <#
  1220. .Synopsis
  1221.    Query for specific DNS Records against a Nameserver
  1222. .DESCRIPTION
  1223.    Query for specific DNS Records against a Nameserver
  1224. .EXAMPLE
  1225.     C:\> Resolve-DNSRecord -Target microsoft.com -Type MX
  1226.  
  1227.     Name                                     Type                   TTL Data
  1228.     ----                                     ----                   --- ----
  1229.     microsoft.com                              MX                  1001 10 microsoft-com.m...
  1230.  
  1231. .EXAMPLE
  1232.  
  1233.     C:\> Resolve-DNSRecord -Target microsoft.com -Type NS
  1234.  
  1235.     Name                                     Type                   TTL Data
  1236.     ----                                     ----                   --- ----
  1237.     microsoft.com                              NS                 14893 ns1.msft.net.
  1238.     microsoft.com                              NS                 14893 ns2.msft.net.
  1239.     microsoft.com                              NS                 14893 ns3.msft.net.
  1240.     microsoft.com                              NS                 14893 ns4.msft.net.
  1241.     microsoft.com                              NS                 14893 ns5.msft.net.
  1242. #>
  1243.  
  1244. function Resolve-DNSRecord
  1245. {
  1246.     param(
  1247.         [Parameter(Mandatory = $true)]
  1248.         [string]$Target,
  1249.  
  1250.         [Parameter(Mandatory = $false)]
  1251.         [string]$NameServer,
  1252.  
  1253.         [Parameter(Mandatory = $false)]
  1254.         [int32]$TimeOut,
  1255.  
  1256.         [Parameter(Mandatory = $false)]
  1257.         [int32]$Retries,
  1258.        
  1259.         [string]
  1260.         [ValidateSet('A','A6','AAAA','AFSDB','ANY','APL','ATMA','CERT','CNAME',
  1261.         'DHCID','DLV','DNAME','DNSKEY','DS','EID','GID','GPOS','HINFO',
  1262.         'HIP','IPSECKEY','ISDN','KEY','KX','LOC','MB','MD','MF','MG',
  1263.         'MINFO','MR','MX','NAPTR','NIMLOC','NS','NSAP','NSAPPTR','NSEC',
  1264.         'NSEC3','NSEC3PARAM','NULL','NXT','OPT','PTR','PX','RP','RRSIG',
  1265.         'RT','SRV','SINK','SIG','SOA','SPF','SSHFP','TA','TXT','UID',
  1266.         'UINFO','UNSPEC','WKS','X25')]
  1267.         $Type
  1268.     )
  1269.  
  1270.     begin
  1271.     {
  1272.         $dnsopts = new-object JHSoftware.DnsClient+RequestOptions
  1273.         # Set the NS Server if one givem
  1274.         if ($nameserver)
  1275.         {
  1276.             try
  1277.             {
  1278.                 # Check if what we got is an IP or a FQDN
  1279.                 $IPObj = [Net.IPAddress]::Parse($nameserver)
  1280.                 $IPCheck = [System.Net.IPAddress]::TryParse($nameserver,[ref]$IPObj)
  1281.                 if ($IPCheck)
  1282.                 {
  1283.                     $dns = [System.Net.IPAddress]$nameserver
  1284.                     $dnsopts.DnsServers += $dns
  1285.                 }
  1286.                 else
  1287.                 {
  1288.                     Write-Error "$nameserver is not a valid IP Address"
  1289.                 }
  1290.             }
  1291.  
  1292.             catch
  1293.             {
  1294.                 $nsip = [Net.Dns]::GetHostAddresses($nameserver)[0]
  1295.                 $dns = $nsip
  1296.                 $dnsopts.DnsServers += $dns
  1297.             }
  1298.          }
  1299.          # Set the timeout
  1300.          if ($TimeOut)
  1301.          {
  1302.             $dnsopts.TimeOut = New-TimeSpan -Seconds $TimeOut
  1303.          }
  1304.  
  1305.          # Set Retries
  1306.          if ($Retries)
  1307.          {
  1308.             $dnsopts.RetryCount = $Retries
  1309.          }
  1310.          
  1311.     }
  1312.    
  1313.     process
  1314.     {
  1315.         # Resolve A Record
  1316.         $answer = [JHSoftware.DnsClient]::Lookup($target,[JHSoftware.DnsClient+RecordType]::$Type,$dnsopts).AnswerRecords
  1317.         foreach ($A in $answer)
  1318.         {
  1319.            $A
  1320.         }
  1321.     }
  1322.  
  1323.     end
  1324.     {
  1325.     }
  1326. }
  1327.  
  1328.  
  1329. <#
  1330. .Synopsis
  1331.    Convert a string representation of an IPV4 IP to In-Addr-ARPA format.
  1332. .DESCRIPTION
  1333.    Convert a string representation of an IPV4 IP to In-Addr-ARPA format for performing PTR Lookups.
  1334. .EXAMPLE
  1335.     ConvertTo-InAddrARPA -IPAddress 192.168.1.10
  1336.     10.1.168.192.in-addr.arpa
  1337.  
  1338. #>
  1339. function ConvertTo-InAddrARPA
  1340. {
  1341.     [CmdletBinding()]
  1342.     [OutputType([String])]
  1343.     Param
  1344.     (
  1345.         # Param1 help description
  1346.         [Parameter(Mandatory=$true,
  1347.                    ValueFromPipeline=$true,
  1348.                    ValueFromPipelineByPropertyName=$true,
  1349.                    ValueFromRemainingArguments=$false,
  1350.                    Position=0)]
  1351.         [ValidateNotNull()]
  1352.         [ValidateNotNullOrEmpty()]
  1353.         [Alias("IP")]
  1354.         $IPAddress
  1355.     )
  1356.  
  1357.     Begin
  1358.     {
  1359.     }
  1360.     Process
  1361.     {
  1362.         try
  1363.         {
  1364.             $IPObj = [System.Net.IPAddress]::Parse($IPAddress)
  1365.             $ipIpaddressSplit = $IPAddress.Split(".")
  1366.             "$($ipIpaddressSplit.GetValue(3)).$($ipIpaddressSplit.GetValue(2)).$($ipIpaddressSplit.GetValue(1)).$($ipIpaddressSplit.GetValue(0)).in-addr.arpa"
  1367.         }
  1368.         catch
  1369.         {
  1370.             Write-Host "Value provided is not an IP Address"
  1371.         }
  1372.     }
  1373.     End
  1374.     {
  1375.     }
  1376. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement