
🖖 Быстрый, современный, удобный сетевой сканер
sx — это сетевой сканер командной строки, разработанный в соответствии с философией UNIX.
Цель этого проекта — создать самый быстрый сетевой сканер с чистым и простым кодом.
Самый простой способ — скачать из GitHub Releases и поместить исполняемый файл в ваш PATH.
Требования:
На macOS сначала установите Xcode Command Line Tools, чтобы CGO мог ссылаться на системную libpcap:
xcode-select --install
Из корня дерева исходников выполните:
go build
Вот краткие примеры, показывающие, как можно сканировать сети с помощью sx.
Сканируйте локальную сеть и отобразите IP-адрес, MAC-адрес и связанного производителя оборудования подключённых устройств:
sx arp 192.168.0.1/24
пример вывода:
192.168.0.1 b0:be:76:40:05:8d TP-LINK TECHNOLOGIES CO.,LTD.
192.168.0.111 80:c5:f2:0b:02:e3 AzureWave Technology Inc.
192.168.0.171 88:53:95:2d:3c:af Apple, Inc.
с выводом в JSON:
sx arp --json 192.168.0.1/24
пример вывода:
{"ip":"192.168.0.1","mac":"b0:be:76:40:05:8d","vendor":"TP-LINK TECHNOLOGIES CO.,LTD."}
{"ip":"192.168.0.111","mac":"80:c5:f2:0b:02:e3","vendor":"AzureWave Technology Inc."}
{"ip":"192.168.0.171","mac":"88:53:95:2d:3c:af","vendor":"Apple, Inc."}
подождать 5 секунд перед выходом, чтобы получить задержанные ответные пакеты (по умолчанию sx ждёт 300 миллисекунд):
sx arp --exit-delay 5s 192.168.0.1/24
Режим постоянного сканирования, который пересканирует сеть каждые 10 секунд:
sx arp 192.168.0.1/24 --live 10s
В отличие от nmap и других сканеров, которые неявно выполняют ARP-запросы для разрешения IP-адресов в MAC-адреса перед фактическим сканированием, sx явно использует концепцию ARP-кэша. Файл ARP-кэша — это простой текстовый файл, содержащий строку JSON на каждой строке (файл JSONL), который имеет те же поля JSON, что и описанный выше вывод ARP-сканирования в JSON. Сканирования протоколов более высокого уровня, таких как TCP и UDP, читают файл ARP-кэша из stdin, а затем начинают фактическое сканирование.
Это не только упрощает дизайн программы, но и ускоряет процесс сканирования, поскольку не нужно каждый раз выполнять ARP-сканирование.
Предположим, что фактический ARP-кэш находится в файле arp.cache. Мы можем создать его вручную или использовать ARP-сканирование, как показано ниже:
sx arp 192.168.0.1/24 --json | tee arp.cache
После того как у нас есть файл ARP-кэша, мы можем запускать сканирования протоколов более высокого уровня, такие как TCP SYN-сканирование:
cat arp.cache | sx tcp -p 1-65535 192.168.0.171
пример вывода:
192.168.0.171 22
192.168.0.171 443
В этом случае мы обнаруживаем, что порты 22 и 443 открыты.
Если во время больших сканирований вы видите send: No buffer space available, это обычно означает, что отправитель переполняет буферы ядра/raw-сокетов. Первое решение — добавить --rate и уменьшить скорость отправки, например -r 100000/s или меньше, если необходимо. В некоторых системах настройка лимитов буферов сокетов ОС также может помочь, но ограничение скорости является основным исправлением.
сканирование с выводом в JSON:
cat arp.cache | sx tcp --json -p 1-65535 192.168.0.171
пример вывода:
{"scan":"tcpsyn","ip":"192.168.0.171","port":22}
{"scan":"tcpsyn","ip":"192.168.0.171","port":443}
сканирование нескольких диапазонов портов:
cat arp.cache | sx tcp -p 1-23,25-443 192.168.0.171
или отдельных портов:
cat arp.cache | sx tcp -p 22,443 192.168.0.171
или используйте опцию --ports-file, чтобы указать файл с портами или диапазонами портов для сканирования, по одному на строку.
сканирование пар IP/порт из файла с выводом в JSON:
cat arp.cache | sx tcp --json -f ip_ports_file.jsonl
Каждая строка входного файла представляет собой строку JSON, которая должна содержать поля ip и port.
пример входного файла:
{"ip":"10.0.1.1","port":1080}
{"ip":"10.0.2.2","port":1081}
Можно указать файл ARP-кэша с помощью опций -a или --arp-cache:
sx tcp -a arp.cache -p 22,443 192.168.0.171
или перенаправление stdin:
sx tcp -p 22,443 192.168.0.171 < arp.cache
Вы также можете использовать подкоманду tcp syn вместо tcp:
cat arp.cache | sx tcp syn -p 22 192.168.0.171
Подкоманда tcp — это просто сокращение для подкоманды tcp syn, если не передана опция --flags (см. ниже).
sx поддерживает сканирование через виртуальные сетевые интерфейсы (wireguard, openvpn и т.д.), и в этом случае не обязательно использовать ARP-кэш, поскольку эти интерфейсы требуют ввода сырых IP-пакетов вместо Ethernet-кадров. Например, сканирование IP-адреса в VPN-сети:
sx tcp 10.1.27.1 -p 80 --json
Большинство сетевых сканеров пытаются интерпретировать результаты сканирования. Например, они говорят «этот порт закрыт» вместо «я получил RST». Иногда они правы. Иногда нет. Это проще для новичков, но когда вы знаете, что делаете, вы продолжаете пытаться понять, что на самом деле произошло, из интерпретации программы, особенно для более продвинутых методов сканирования.