Сканер портов на PowerShell

В решении задач практической безопасности не редко приходится заниматься сканированием портов. Чаще всего, конечно, используется NMAP из поставки дистрибутива KALI LINUX. Но иногда когда нужно сделать чтото простое может пригодится консольная утилита Windows — PowerShell. Которая в последних версиях этой ОС достаточно мощная и позволяет решать множество задач при помощи командной строки.

PowerShell.
Предполагается, что читающий эту тему знает что такое сканер портов и имел опыт использования, иначе гугль.
Ещё нужна оболочка PowerShell, но она на многих машинах уже стандартно установлена.
В общем писатель из меня не очень, так что кратко о главном.

Скрин:

Исходник:

Код:
Param(
    [parameter(Mandatory = $true,
      Position = 0)]
    [ValidatePattern("bd{1,3}.d{1,3}.d{1,3}.d{1,3}b")]
    [string]$StartAddress,
    [parameter(Mandatory = $true,
      Position = 1)]
    [ValidatePattern("bd{1,3}.d{1,3}.d{1,3}.d{1,3}b")]
    [string]$EndAddress,
    [switch]$ResolveHost,
    [switch]$ScanPort,
    [int[]]$Ports = @(21,22,23,53,69,71,80,98,110,139,111,389,443,445,1080,1433,2001,2049,3001,3128,5222,6667,6868,7777,7878,8080,1521,3306,3389,5801,5900,5555,5901),
    [int]$TimeOut = 10000
  )
function Invoke-TSPingSweep {
  
  Begin {
    $ping = New-Object System.Net.Networkinformation.Ping
  }
  Process {
    foreach($a in ($StartAddress.Split(".")[0]..$EndAddress.Split(".")[0])) {
      foreach($b in ($StartAddress.Split(".")[1]..$EndAddress.Split(".")[1])) {
        foreach($c in ($StartAddress.Split(".")[2]..$EndAddress.Split(".")[2])) {
          foreach($d in ($StartAddress.Split(".")[3]..$EndAddress.Split(".")[3])) {
            write-progress -activity PingSweep -status "$a.$b.$c.$d" -percentcomplete (($d/($EndAddress.Split(".")[3])) * 100)
            $pingStatus = $ping.Send("$a.$b.$c.$d",$TimeOut)
            if($pingStatus.Status -eq "Success") {
              if($ResolveHost) {
                write-progress -activity ResolveHost -status "$a.$b.$c.$d" -percentcomplete (($d/($EndAddress.Split(".")[3])) * 100) -Id 1
                $getHostEntry = [Net.DNS]::BeginGetHostEntry($pingStatus.Address, $null, $null)
              }
              if($ScanPort) {
                $openPorts = @()
                for($i = 1; $i -le $ports.Count;$i++) {
                  $port = $Ports[($i-1)]
                  write-progress -activity PortScan -status "$a.$b.$c.$d" -percentcomplete (($i/($Ports.Count)) * 100) -Id 2
                  $client = New-Object System.Net.Sockets.TcpClient
                  $beginConnect = $client.BeginConnect($pingStatus.Address,$port,$null,$null)
                  if($client.Connected) {
                    $openPorts += $port
                  } else {
                    # Wait
                    Start-Sleep -Milli $TimeOut
                    if($client.Connected) {
                      $openPorts += $port
                    }
                  }
                  $client.Close()
                }
              }
              if($ResolveHost) {
                $hostName = ([Net.DNS]::EndGetHostEntry([IAsyncResult]$getHostEntry)).HostName
              }
              # Return Object
              New-Object PSObject -Property @{
                IPAddress = "$a.$b.$c.$d";
                HostName = $hostName;
                Ports = $openPorts
              } | Select-Object IPAddress, HostName, Ports
            }
          }
        }
      }
    }
  }
  End {
  }
}
Invoke-TSPingSweep

Что с ним делать?
Исходник вбиваем в блокнот и сохраняем под названием Port-Scan.ps1
Для удобства можно закинуть его на С: или куда вам удобно.

Как пользоваться?
А пользоваться мы будем с помощью параметров, так же можно запустить дабл кликом по командлету, но мне так удобней.
Нажимаем Windows + R и вводим powershell
Запустили пс, теперь вводим параметры, как и что — ниже.

Моя часто-юзаемая схема:
<полный путь к файлу> -StartAddress <начальный айпишник> -EndAddress <конечный айпишник> -ResolveHost -Scanport -port <порты через запятую>

Примеры:

C:port-scan.ps1 -StartAddress 148.251.6.0 -EndAddress 148.251.6.100 -ResolveHost -ScanPort -Port 3389,21,139 //TimeOut -по умолчанию
C:port-scan.ps1 -StartAddress 148.251.6.0 -EndAddress 148.251.6.100 -ResolveHost -ScanPort -TimeOut 300 //Порты будут сканиться по умолчанию
C:port-scan.ps1 -StartAddress 148.251.6.0 -EndAddress 148.251.6.100 -ScanPort -Port 3389,21,139 //Хост не будет определяться и таймаут по умолчанию

Пояснение:
C:port-scan.ps1 -это полный путь к сканеру.
-StartAddress -этот параметр задает с какого айпишника пудем начинать сканить.
-EndAddress -этот параметр задает по какой айпишник сканить.
-ResolveHost -этот параметр определяет хост.
-ScanPort -этот параметр указывает, что мы будем сканить порты.
-Port -это сами порты, которые мы хотим отсканить.
-TimeOut -это таймаут времени ответа от хоста, в общем поймете 🙂

Заключение:
Все исходники и документацию можете найти по ссылке.

За материал спасибо Сrusty (Zloy.bz)

Click to rate this post!
[Total: 3 Average: 5]

Специалист в области кибер-безопасности. Работал в ведущих компаниях занимающихся защитой и аналитикой компьютерных угроз. Цель данного блога - простым языком рассказать о сложных моментах защиты IT инфраструктур и сетей.

1 comments On Сканер портов на PowerShell

Leave a reply:

Your email address will not be published.