Если мы нашли открытый восьмидесятый порт (а также 443, 8080, 8443), то это означает, что какая-то служба его прослушивает в ожидании подключения. Ничего конкретнее мы сказать не можем. С той стороны может быть веб-сервер, роутер, веб-камера, файловый-сервер, что-то ещё, ну или просто нам никто не ответит. Если стоит цель исследовать большие сети, то есть разные варианты автоматизации — например, сбор отпечатков и последующий их анализ. Это хороший и продуктивный метод. В качестве ещё одной альтернативы существует такой способ как снятие скриншотов. Это очень наглядный метод. Даже если их просто открыть в проводнике и посмотреть на миниатюры картинок, то сразу видны роутеры, запущенные веб-серверы без контента, полноценные сайты и т. д. Если имя скриншота начинается с IP адреса, то также наглядны «скопления» необычных объектов в подсетях. Очень легко выделить самые часто встречающиеся роутеры. В общем, один из методов исследования сети, который имеет право на существование.
Я расскажу, как организовать массовый сбор скриншотов с помощью программы flashlight. Скорость — около тысячи скриншотов за 2-4 часа работы.
Кроме flashlight нам понадобиться ещё несколько программ. Установим их все одной командой:
sudo pacman -S flashlight nmap wireshark-gtk wireshark-cli tcpdump dsniff masscan --needed
Ещё нам нужен PhantomJS. Ставить его нужно по этой инструкции. Т.е.:
sudo pacman -S phantomjs --needed sudo ln -s /usr/bin/phantomjs /usr/local/bin/phantomjs sudo ln -s /usr/bin/phantomjs /usr/local/share/phantomjs
Теперь давайте определимся, какие IP адреса нам интересны. Можно выбрать просто диапазон (подсеть), можно выбрать конкретного интернет-провайдера, страну, область, город. К примеру я выберу свою родную Владимирскую область. Подробно о составлении диапазонов IP адресов рассказано в статье «Как узнать все IP провайдера, города, региона (области, республики) или страны». Нет смысла её здесь пересказывать, поэтому я сразу приведу свои команды с краткими пояснениями.
Я скачиваю и распаковываю базу данных:
wget `curl -s https://db-ip.com/db/download/city | grep -E -o 'http://download.db-ip.com/free/dbip-city-20[0-9]{2}-[0-9]{2}.csv.gz'`&& gunzip dbip-city-*.csv.gz && mv dbip-city-* dbip-city-csv
Теперь я составляю список всех IP Владимирской области (слово vladimir в команде):
CITY=vladimir;cat dbip-city-csv | grep -E -i "$CITY" | sed 's/","/-/' | cut -d ',' -f 1 | sed 's/"//' | sed 's/"//' > IP_Region_$CITY.txt
У меня сформировался файл IP_Region_vladimir.txt. Из него я удаляю IPv6 адреса (они в самом конце), т. к. программы ещё не очень хорошо с ними работают.
Если вы заглянули в файл, то он начинается со строк вроде этих:
23.237.62.232-23.237.62.239 31.28.192.0-31.28.223.255 31.40.32.0-31.40.63.255 31.130.120.0-31.130.127.255 31.133.200.0-31.133.207.255 31.135.224.0-31.135.239.255 31.184.243.0-31.184.243.255 37.18.81.0-37.18.81.255 37.19.72.0-37.19.79.255 37.29.74.0-37.29.74.255 37.75.200.0-37.75.203.255 37.75.204.0-37.75.207.255 37.230.136.0-37.230.139.255 45.54.12.120-45.54.12.127 45.54.35.32-45.54.35.47 46.20.176.0-46.20.183.255 46.20.184.0-46.20.191.255 46.148.128.0-46.148.143.255
Такой формат понимают далеко не все программы (например, nmap эти строки поставят в тупик).
Соответственно, если nmap его не «переваривает», то точно также с ним не может работать и flashlight, поскольку сама является, хоть и интеллектуальной, но всё же просто оболочкой для nmap. Нам бы хотелось реорганизовать эти подсети на IP с равными интервалами. Ещё желательно не сканировать одновременно IP из одной подсети — это нагрузка на неё, плюс большая вероятность, что наша активность попадёт в поле зрение разных систем обнаружения вторжений. Поэтому был придумал следующий метод с привлечением программы masscan. Мы начинаем с того, что эти «трудноперевариваемые» диапазоны разбиваем на отдельные IP. Найти подробную справку по программе masscan вы можете на этой страничке. Команда, которая считывает диапазоны, а выдаёт отдельные IP, причём в рандомном порядке, выглядит так:
masscan -sL -iL IP_Region_vladimir.txt > ready.hosts
Именно это нам и нужно:
Теперь всё просто — считываем нужное количество IP, объединяем их запятой и скармливаем программе. Для автоматизации процесса я написал следующий скриптик:
#!/bin/bash if [ `cat ready.hosts | wc -l` -eq 0 ] then echo 'IP закончились.' exit fi echo 'Продолжаем...' timeout 40 sudo flashlight -p vladimir_region -s screen -d `cat ready.hosts | head -n 200 | sed ':a;N;$!ba;s/\n/,/g'` -r /usr/share/phantomjs/examples/rasterize.js -t 200 -a -v cp ready.hosts /tmp/ready.hosts; cat /tmp/ready.hosts | sed '1,200d' > ready.hosts sudo bash ./mass_screen.sh
Сохраните его в файл mass_screen.sh. Запускать так:
sudo bash mass_screen.sh
Поясню некоторые моменты. Главная строка:
timeout 40 sudo flashlight -p vladimir_region -s screen -d `cat ready.hosts | head -n 200 | sed ':a;N;$!ba;s/\n/,/g'` -r /usr/share/phantomjs/examples/rasterize.js -t 200 -a -v
timeout 40 здесь означает сбросить (прекратить работу) программы после истечения 40 секунд. Это связано с тем, что многие хосты хоть и имеют открытый 80 порт, но не имеют ничего нам отправить. Т.е. можно и без этого сброса по таймауту, но программа будет часто «замирать» на таких «бракованных» IP адресах. Собрать тысячи скриншотов за один день не получиться.
Сама запускаемая команда:
flashlight -p vladimir_region -s screen -d `cat ready.hosts | head -n 200 | sed ':a;N;$!ba;s/\n/,/g'` -r /usr/share/phantomjs/examples/rasterize.js -t 200 -a -v
Здесь после ключа -d должен идти список IP. Список формируется на лету:
cat ready.hosts | head -n 200 | sed ':a;N;$!ba;s/\n/,/g
т. е. из файла ready.hosts считываются 200 адресов, которые объединяются, через запятую, в одну строку.
-p vladimir_region — это название проекта (может быть любое название).
-s screen — это режим сканирования.
-r /usr/share/phantomjs/examples/rasterize.js — это расположение файла rasterize.js. Если вы не знаете где у вас, то:
locate rasterize.js
-t 200 — означает сканировать в 200 потоков.
-a — означает предварительный пинг (по моим ощущениям, с этим режимом сканирования данная опция не работает).
-v — добавить вербальности.
Почему таймаут именно 40 секунд, а потоков 200? Цифры подобраны экспериментальным путём. Если установить более короткий таймаут, то программа будет сбрасываться до того, как получит скриншоты (если очень длинный — то это уменьшит количество скриншотов в час времени).
Если устанавливать более 200 потоков, то программа, хотя нигде это и не выводиться, начинает «проглатывать» адреса — просто не получает их скриншоты.
Дальше проще:
cp ready.hosts /tmp/ready.hosts; cat /tmp/ready.hosts | sed '1,200d' > ready.hosts
Мы копируем наш файл с IP во временное расположение, а потом считываем его же обратно за минусом первых 200 строк, которые уже отработали. Т.е. в результате мы вырезаем первые 200 строк.
Ну и последней строкой программа запускает сама себя, образуя бесконечный цикл.
sudo bash ./mass_screen.sh
Это мои скриншоты, которые я собрал для родной области (посмотри на ползунок, их там реально много):
Заключение
У программы flashlight есть 3 режима сканирования (мы рассмотрели только один) и 1 режим анализа. Найти подробности о них вы можете на странице программы flashlight в Энциклопедии инструментов для пентестинга.