Сканер портов в PowerShell (TCP / UDP)

Сканер портов в PowerShell (TCP / UDP)

.Существует множество сканеров сетевых портов. Некоторые из самых популярных включают Nmap, Masscan, Angry IP Scanner, ZMap и многие другие.Все они великолепны, хорошо протестированы и функциональны, но они также большие, сложные и, что самое главное, отмечены каждым достойным антивирусом или решением EDR. И это может стать преградой в некоторых сценариях тестирования на проникновение. На этот раз мы рассмотрим минималистичный сканер портов в PowerShell (TCP / UDP).

Зачем писать сканер портов с нуля?

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

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

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

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

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

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

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

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

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

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

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

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

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

      • Маленький и минималистичный — набирается вручную (на клавиатуре)
      • Написано на чистом PowerShell — дополнительных модулей не требуется
      • Практичный и продуманный дизайн:
        • Поддержка возобновления, если прервана
        • Пропустить уже просканированные хосты / порты

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

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

Поскольку сканеры портов написаны на PowerShell, мы должны иметь возможность запускать команды PowerShell в системе, которую мы используем. На рабочей станции с ограниченным доступом это может быть проблемой, так что ..

(1) Первым шагом обычно является обойти ограничения и создать оболочку. Как только мы сможем комфортно запускать команды PowerShell, мы сможем перейти к следующему шагу.

(2) Теперь мы можем записать сканеры портов где-нибудь в файловой системе. Например, мы могли бы разместить их на нашем рабочем столе, но из-за различных ограничений нам, возможно, придется разместить их где-нибудь еще, где мы можем писать, например:

      • C:\Users\Public
      • C:\Windows\Tasks
      • C:\Windows\Tracing
      • C:\Windows\System32\Spool\Drivers\Color
      • etc.

Теперь мы можем начать сканирование портов. Вот краткое введение в их использование.

Сканер 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

Port scanning a single host and port    Сканер портов в PowerShell (TCP / UDP)

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

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

Port scanning a single host for selected ports  Сканер портов в PowerShell (TCP / UDP)

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

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

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

Port scanning (sweeping) a network range for a single port  Сканер портов в PowerShell (TCP / UDP)

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

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

Port scanning a network range for selected ports

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

Мы также можем предоставить список целей в качестве входного файла.

Например, в корпоративных сетях с развертыванием 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

Port scanning of computers found in active directory using input file

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

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

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

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

Port scan results - hosts with port tcp/445 open

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

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

Extracting list of hosts with open port 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

Заключение

Хотя эти сканеры портов не идеальны, в некоторых ситуациях именно они справляются со своей задачей благодаря красивому списку функций и компактной форме. Надеюсь, вы тоже найдете их иногда полезными.

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Leave a reply:

Your email address will not be published.