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

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

В копилку маленьких но нужных инструментов пентестера можно добавить еще одно. В этой статье хочу познакомить вас с интересной тулзой — сканер портов на PowerShell.

Еще по теме: Лучшие инструменты сисадмина

Написанный на чистом PowerShell, этот небольшой, но мощный сканер портов TCP и UDP, будет полезен в ситуации, когда не представляется возможным использование обычных сканеров портов.

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

Существует большое количество отличных сканеров портов: Nmap, Masscan, Angry IP Scanner, ZMap и т.д. Все они обладают богатым функционалом, и это с одной стороны плюс, но с другой — минус. В некоторых ситуациях, не требуется богатый функционал.

Написание сканера портов может потребоваться, например, когда мы выполняем пентест в строго ограниченной среде, где мы не можем использовать какие-либо стандартные инструменты пентеста. Например, при тестировании изолированной среды VDI / Citrix, в которую мы не можем ничего загружать. В таких случаях лучше создать свой инструменты.

Без возможности сканирования портов мы вряд ли смогли бы добиться какого-либо прогресса. Сканер портов просто необходим, и если мы не можем его использовать, мы должны его сделать.

Сканер портов TCP и UDP в PowerShell

Для таких случаев я разработал следующий быстрый и простой, но мощный и надежный сканер портов.

Чтобы сохранить небольшой размер, я разделил сканер на два отдельных независимых модуля:

Так что это действительно два сканера портов, а не один. Оба сканера можно найти в репозитории GitHub:

Список возможностей сканера портов PowerShell

Оба сканера имеют следующие особенности:

  • Обнаружение открытых, закрытых и фильтруемых портов (как TCP, так и UDP).
  • Возможность сканирования отдельного хоста, диапазона сети или списка хостов в файле из файла.
  • Настраиваемые значения тайм-аута для эффективного и надежного сканирования портов.
  • Не обнаруживается никаким антивирусом или решением EDR

С точки зрения дизайна:

  • Маленький и минималистичный.
  • Написано на чистом PowerShell — дополнительных модулей не требуется.
  • Практичный и продуманный дизайн.
  • Возобновление сканирования.
  • Умеет пропускать просканированные хосты / порты.

Давайте посмотрим, как пользоваться этими сканерами.

Типичный сценарий использования

Поскольку сканеры портов написаны на PowerShell, мы должны иметь возможность запускать команды PowerShell в системе, которую используем.

Сканер TCP-портов:

Import-Module .\port-scan-tcp.ps1

# Usage:
port-scan-tcp <host(s)> <port(s)>

Сканер портов UDP:

Import-Module .\port-scan-udp.ps1

# Usage:
port-scan-udp <host(s)> <port(s)>

Давайте посмотрим на несколько примеров использования на практике.

Сканирование портов отдельного хоста

Поиск открытых портов на удаленном хосте порт tcp / 445:

port-scan-tcp 192.168.204.183 445

PowerShell сканирование портов отдельного хоста и порта

Сканирования одного хоста на предмет выбранных TCP-портов:

port-scan-tcp 192.168.204.183 (21,22,23,25,80,443,445,3389)

PowerShell сканирование портов отдельного хоста для выбранных портов

Сканирование портов сетевого диапазона

Сканирования портов в диапазоне 192.168.204.0/24 для порта tcp / 445 (сканирование портов):

0..255 | foreach { port-scan-tcp 192.168.204.$_ 445 }

PowerShell сканирование портов диапазона для одного порта

Сканирования сетевого диапазона 192.168.204.0/24 для выбранных TCP-портов:

0..255 | foreach { port-scan-tcp 192.168.204.$_ (22,80,445) }

PowerShell сканирование портов в диапазоне сети для выбранных портов

Список хостов в файле

Есть также возможность сканирования хостов из файла.

Например, в корпоративных сетях с развертыванием Active Directory (AD) мы могли бы извлечь список компьютеров из AD с помощью командлетов PowerShell:

$a = [adsisearcher]”(objectCategory=computer)”
$a.PropertiesToLoad.add(“dnshostname”) | out-null
$a.PageSize = 1
$a.FindAll() | % { echo $_.properties.dnshostname } > computers.txt

Теперь мы можем идентифицировать все живые хосты Windows с помощью сканирования порта tcp / 445:

port-scan-tcp (gc .\computers.txt) 445

PowerShell сканирование портов компьютеров, найденных в активном каталоге, с использованием входного файла

Получение результатов

Оба сканера сохраняют отчет в файл scanresults.txt, который создается в рабочем каталоге. Это позволяет проверять результаты в любое время, даже во время текущего сканирования.

Например, вот как мы можем получить список систем с открытым портом tcp / 445:

Get-Content .\scanresults.txt | Select-String "tcp,445,Open"

Результаты сканирования портов - хосты с открытым портом tcp / 445

Если бы мы хотели перечислить только первый столбец, мы могли бы легко сделать это с помощью PowerShell следующим образом:

(Get-Content .\scanresults.txt | Select-String "tcp,445,Open") -replace ",.*",""

Извлечение списка хостов с открытым портом tcp / 445

Теперь можно открыть список в программе для брутфорса SMB, и попытаться взломать некоторые из этих машин Windows.

Требования и ограничения

Совместимость. Сканер TCP поставляется в двух версиях, но с той разницей, что используется метод TcpClient.ConnectAsync (). Этот метод, доступный в .NET 4.5, дает сканеру возможность различать «закрытые» и «отфильтрованные» порты. Совместимая версия сканера (для более старых систем) не может распознать это и просто сообщает обо всех таких случаях как «Закрыто».

Скорость. Оба сканера портов (TCP и UDP) не поддерживают многопоточность. Таким образом, скорость сканирования ограничена. Минимальная скорость — 1 сканирование порта в секунду, в зависимости от значений тайм-аута, которые также можно изменить.

Снижение скорости. Следует иметь в виду, что сканеры могут немного замедлиться через некоторое время, из-за большого количества результатов.

Import-Module .\port-scan-tcp.ps1 -force
Import-Module .\port-scan-udp.ps1 -force

Заключение

Эти сканеры портов не идеальны, но в некоторых ситуациях именно их функционала достаточно, да и размер в некоторых ситуация имеет значение.

Еще по теме: Выбираем лучший сканеров уязвимостей

ВКонтакте
OK
Telegram
WhatsApp
Viber

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *