В копилку маленьких но нужных инструментов пентестера можно добавить еще одно. В этой статье хочу познакомить вас с интересной тулзой — сканер портов на 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-портов:
1 2 3 4 |
Import-Module .\port-scan-tcp.ps1 # Использование: port-scan-tcp <host(s)> <port(s)> |
Сканер портов UDP:
1 2 3 4 |
Import-Module .\port-scan-udp.ps1 # Использование: port-scan-udp <host(s)> <port(s)> |
Давайте посмотрим на несколько примеров использования на практике.
Сканирование портов отдельного хоста
Поиск открытых портов на удаленном хосте порт tcp / 445:
1 |
port-scan-tcp 192.168.204.183 445 |
Сканирования одного хоста на предмет выбранных TCP-портов:
1 |
port-scan-tcp 192.168.204.183 (21,22,23,25,80,443,445,3389) |
Сканирование портов сетевого диапазона
Сканирования портов в диапазоне 192.168.204.0/24 для порта tcp / 445:
1 |
0..255 | foreach { port-scan-tcp 192.168.204.$_ 445 } |
Сканирования диапазона 192.168.204.0/24 для выбранных TCP-портов:
1 |
0..255 | foreach { port-scan-tcp 192.168.204.$_ (22,80,445) } |
Список хостов в файле
Есть также возможность сканирования хостов из файла.
Например, в корпоративных сетях с развертыванием Active Directory (AD) мы могли бы извлечь список компьютеров из AD с помощью командлетов PowerShell:
1 2 3 4 |
$a = [adsisearcher]”(objectCategory=computer)” $a.PropertiesToLoad.add(“dnshostname”) | out-null $a.PageSize = 1 $a.FindAll() | % { echo $_.properties.dnshostname } > computers.txt |
Теперь мы можем идентифицировать все живые хосты Windows с помощью сканирования порта tcp / 445:
1 |
port-scan-tcp (gc .\computers.txt) 445 |
Получение результатов
Оба сканера сохраняют отчет в файл scanresults.txt, который создается в рабочем каталоге. Это позволяет проверять результаты в любое время, даже во время текущего сканирования.
Например, вот как мы можем получить список хостов с открытым портом tcp / 445:
1 |
Get-Content .\scanresults.txt | Select-String "tcp,445,Open" |
Если бы мы хотели перечислить только первый столбец, мы могли бы легко сделать это с помощью PowerShell следующим образом:
1 |
(Get-Content .\scanresults.txt | Select-String "tcp,445,Open") -replace ",.*","" |
Теперь можно открыть список в программе для брутфорса SMB, и попытаться взломать найденные хосты Windows.
Требования и ограничения
Совместимость. Сканер TCP поставляется в двух версиях, но с той разницей, что используется метод TcpClient.ConnectAsync (). Этот метод, доступный в .NET 4.5, дает сканеру возможность различать «закрытые» и «отфильтрованные» порты. Совместимая версия сканера (для более старых систем) не может распознать это и просто сообщает обо всех таких случаях как «Закрыто».
Скорость. Оба сканера портов (TCP и UDP) не поддерживают многопоточность. Таким образом, скорость сканирования ограничена. Минимальная скорость — 1 сканирование порта в секунду, в зависимости от значений тайм-аута, которые также можно изменить.
Снижение скорости. Следует иметь в виду, что сканеры могут немного замедлиться через некоторое время, из-за большого количества результатов.
1 2 |
Import-Module .\port-scan-tcp.ps1 -force Import-Module .\port-scan-udp.ps1 -force |
Заключение
Эти сканеры портов не идеальны, но в некоторых ситуациях именно их функционала достаточно, да и размер в некоторых ситуация имеет значение.
Еще по теме: Выбираем лучший сканеров уязвимостей