суббота, 20 февраля 2016 г.

Powershell. Сканирование сети

Скрипт сканирует сеть на наличие хостов, определяет вендора по MAC, определяет некоторые открытые порты, определяет имена хостов.
#####################################################
#Сканирование диапозона хостов сети 
#14.01.2016 Сатин Павел
#
#####################################################



Function Get-MAC ($IP) {
  $This_IP=((Get-NetIPConfiguration).IPv4Address).IPv4Address
  if ($IP -eq $This_IP) {
    $InterfaceAlias=(Get-NetIPConfiguration).InterfaceAlias
    $This_HWAddr=(Get-NetAdapter | Where-Object{$_.ifAlias -eq $InterfaceAlias}).MACAddress
    #$This_HWAddr=(Get-NetAdapter).MACAddress | Select-Object -First 1
    $HW_Addr=$This_HWAddr
  } else {
    ping -4 -n 1 -w 2000 $IP > $Null 
    $Cmd_Arp_Out=arp -a | Where-Object {$_.Contains("$IP ")}
    if ($Cmd_Arp_Out -ne $NULL) {
      $HW_Addr=$Cmd_Arp_Out.Substring(24,17)
    }
  }
  $HW_Addr
}#Get-MAC

Function Get-DNSName ($IP) {
  (Resolve-DnsName -Name $IP -ErrorAction SilentlyContinue).NameHost
}

Function Get-NBTName ($IP) {
  $NETBIOS_Name=""
  $NETBIOS_Group=""
  $Cmd_Nbtstat_Out=nbtstat -A $IP
  if ( ($Cmd_Nbtstat_Out | Select-String(" <00> ")).Count -gt 0) {
    $NETBIOS_Name=$Cmd_Nbtstat_Out  | Where-Object {$_.Contains("<00>  Уникальный")} | Select-Object -First 1
    if($NETBIOS_Name -ne $NULL) {
      $NETBIOS_Name=$NETBIOS_Name.Substring(4,15)
      $NETBIOS_Group=($Cmd_Nbtstat_Out | Where-Object {$_.Contains("<00>  Группа")} | Select-Object -First 1)
      if($NETBIOS_Group -ne $NULL) {
        $NETBIOS_Group=$NETBIOS_Group.Substring(4,15)
      } else {
        $NETBIOS_Group="-"
      }
    } else { 
      $NETBIOS_Name="-"
    }
  } else {
    $NETBIOS_Name="-"
    $NETBIOS_Group="-"  
  }
  $NETBIOS_Name
  #$NETBIOS_Group
}

Function Get-NBTGroup ($IP) {
  $NETBIOS_Name=""
  $NETBIOS_Group=""
  $Cmd_Nbtstat_Out=nbtstat -A $IP
  if ( ($Cmd_Nbtstat_Out | Select-String(" <00> ")).Count -gt 0) {
    $NETBIOS_Name=$Cmd_Nbtstat_Out  | Where-Object {$_.Contains("<00>  Уникальный")} | Select-Object -First 1
    if($NETBIOS_Name -ne $NULL) {
      $NETBIOS_Name=$NETBIOS_Name.Substring(4,15)
      $NETBIOS_Group=($Cmd_Nbtstat_Out | Where-Object {$_.Contains("<00>  Группа")} | Select-Object -First 1)
      if($NETBIOS_Group -ne $NULL) {
        $NETBIOS_Group=$NETBIOS_Group.Substring(4,15)
      } else {
        $NETBIOS_Group="-"
      }
    } else { 
      $NETBIOS_Name="-"
    }
  } else {
    $NETBIOS_Name="-"
    $NETBIOS_Group="-"  
  }
  #$NETBIOS_Name
  $NETBIOS_Group
}


Function Get-Vendor ($MAC_Address) {
  $mymac = $MAC_Address
  $webrequest = Invoke-WebRequest -Uri "http://www.macvendorlookup.com/api/v2/$mymac/csv"  
  $macvendor = (($webrequest.Content -split '\,')[4] -split '\"')[1]  
  $macvendor
} #Get-Vendor


function Test-Port
{
    Param(
        [parameter(ParameterSetName='ComputerName', Position=0)]
        [string]
        $ComputerName,

        [parameter(ParameterSetName='IP', Position=0)]
        [System.Net.IPAddress]
        $IPAddress,

        [parameter(Mandatory=$true , Position=1)]
        [int]
        $Port,

        [parameter(Mandatory=$true, Position=2)]
        [ValidateSet("TCP", "UDP")]
        [string]
        $Protocol
        )

    $RemoteServer = If ([string]::IsNullOrEmpty($ComputerName)) {$IPAddress} Else {$ComputerName};

    If ($Protocol -eq 'TCP')
    {
        $test = New-Object System.Net.Sockets.TcpClient;
        Try
        {
            #Write-Host "Connecting to "$RemoteServer":"$Port" (TCP)..";
            $test.Connect($RemoteServer, $Port);
            #Write-Host "Connection successful";
            return $true
        }
        Catch
        {
            #Write-Host "Connection failed";
            return $false
        }
        Finally
        {
            $test.Dispose();
        }
    }

    If ($Protocol -eq 'UDP')
    {
        Write-Host "UDP port test functionality currently not available."
        <#
        $test = New-Object System.Net.Sockets.UdpClient;
        Try
        {
            #Write-Host "Connecting to "$RemoteServer":"$Port" (UDP)..";
            $test.Connect($RemoteServer, $Port);
            #Write-Host "Connection successful";
            return $true
        }
        Catch
        {
            #Write-Host "Connection failed";
            return $false
        }
        Finally
        {
            $test.Dispose();
        }
        #>
    }
} #Test-Port


Function ScanHost ($IP,$LogFullPath=$Null) {

#Определяем порты для сканирования
  $ports = 22,23,80,161,139,443

  $MAC_Address=Get-MAC($IP)
  $Vendor = Get-Vendor($MAC_Address)
  if ($MAC_Address -ne $Null) {
    $NETBIOS_Name=Get-NBTName($IP)
    $NETBIOS_Group=Get-NBTGroup($IP)
    $DNS_Name=Get-DNSName($IP)

    $ScanHostObj = New-Object PSObject


    $ScanHostObj | Add-Member HW_Address $MAC_Address
    $ScanHostObj | Add-Member HW_Vendor $Vendor
    $ScanHostObj | Add-Member IP $IP
    $ScanHostObj | Add-Member NETBIOS_Name $NETBIOS_Name
    $ScanHostObj | Add-Member NETBIOS_Group $NETBIOS_Group
    $ScanHostObj | Add-Member DNS_Name $DNS_Name

    foreach ($port in $ports) {

      $strResult = Test-Port -IP $IP -Port $port -Protocol TCP
      $ScanHostObj | Add-Member $port $strResult

    }

    #Отдаем результаты сканирования
    $ScanHostObj
  }




} #ScanHost

 

#################################### Тело скрипта #############################

#Определяем диапозон сети для сканирования
$i1=192
$i2=168
$i3=0

$i4 = 1
$i5 = 254

#Массив результатов
$a = @()

$strIP = "$i1.$i2.$i3.$i4"
$prcComplete = 0
  Write-Progress -Activity "Работаю..." -PercentComplete $prcComplete -CurrentOperation "$prcComplete% complete" -Status "Сканируется хост: $strIP"

For ($i4; $i4 -le $i5; $i4++) {
  $strIP = "$i1.$i2.$i3.$i4"

  Write-Progress -Activity "Работаю..." -PercentComplete $prcComplete -CurrentOperation "$prcComplete% complete" -Status "Сканируется хост: $strIP"

  $a += ScanHost($strIP)

  [int]$prcComplete = $i4 / $i5 * 100
  Write-Progress -Activity "Работаю..." -PercentComplete $prcComplete -CurrentOperation "$prcComplete% complete" -Status "Сканируется хост: $strIP"

  $a | Format-Table -Property * -AutoSize | Out-String -Width 1024 | Out-File ScanHosts.txt

}

#Выводим результаты

$a | Format-Table -Wrap -AutoSize
$a | Format-Table -Property * -AutoSize | Out-String -Width 1024 | Out-File ScanHosts.txt
$a | Out-GridView -Title ScanHosts

#----- Конец скрипта

Комментариев нет:

Отправить комментарий