Reconnoitre: помощник в анализе веб-приложений

Уже рассмотрено немало разных любительских сканеров и «фреймворков». Обычно они довольно простые (а иногда ещё и глючные smiley) . Но всё равно мне интересно с ними знакомиться, так как довольно часто они содержат какую-то изюминку — интересную функцию, которая может однажды понадобиться.

Инструмент Reconnoitre был создан для автоматизации рутинных действий при проведении лабораторных работ OSCP. Это довольно простой скрипт, и умеет он следующее:

  • ищет живые хосты
  • для найденных хостов выполняет сканирование, составляет список обнаруженных служб
  • для обнаруженных служб составляет команды по запуску других инструментов
  • умеет искать из большого числа хостов DNS серверы
  • пытается определить имя хостов и виртуальные хосты
  • может искать устройства, отвечающие на SNMP протокол

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

Как установить Reconnoitre в Kali Linux

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

Пример запуска без установки:

git clone https://github.com/codingo/Reconnoitre
cd Reconnoitre/Reconnoitre/
python2 ./reconnoitre.py -h

Каждый раз, когда вы захотите использовать Reconnoitre, вам нужно будет перейти в указанную папку и использовать python2 ./reconnoitre.py вместо имени программы (reconnoitre) как в следующих командах.

Для выполнения установки:

git clone https://github.com/codingo/Reconnoitre
cd Reconnoitre/
find . -type f -print0 | xargs -0 sed -i 's/from lib.file_helper/from file_helper/g' #fix
sudo python setup.py install
reconnoitre -h

Как видно, используется небольшой фикс — автор использовал обратный фикс для возможности запуска без установки, но поломал программу в случае если делается установка… Возможно, он ещё найдёт универсальное решение, а пока перед установкой нужно применять указанную команду с пометкой #fix.

Как запустить Reconnoitre

Обязательных опций фактически три:

  • -t после которой нужно указать хост или диапазон хостов. Можно также указать файл с этими данными
  • -o — после этой опции нужно указать директорию для сохранения результатов. В ней для каждого хоста будут созданы поддиректории
  • также нужно указать опцию с действием, например --pingsweep или --services или какую-то другую

Поиск активных (живых хостов) из диапазона IP

В качестве примера я буду анализировать соседей suip.biz (бедные соседи — сколько уже можно angry). Я возьму диапазон 185.117.153.1-255. Данные я буду сохранять в папку suip-neighbors в текущей директории. Для поиска живых хостов используется опция --pingsweep. Тогда команда получается следующая:

reconnoitre -t 185.117.153.1-255 -o suip-neighbors --pingsweep

Кстати, папка, которую в этой команде указываем для сохранения данных, также будет использоваться в сгенерированных командах (они тоже будут сохранять данные на диск), поэтому рекомендуется указывать абсолютный путь:

reconnoitre -t 185.117.153.1-255 -o /home/mial/suip-neighbors --pingsweep

Результат:

[*] Found 190 live hosts
[*] Created target list suip-neighbors/targets.txt

То есть найдено 190 живых хостов (те, кто онлайн в данный момент) и все они сохранены в файл suip-neighbors/targets.txt.

Можно посмотреть содержимое этого файла:

cat suip-neighbors/targets.txt

Поиск запущенных служб и генерация команд для дальнейшего анализа

Для сбора служб используется опция --services. Алгоритм её работы следующий:

  • выполняется быстрое сканирование
  • генерируется файл для данного хоста с новыми командами для запуска
  • в отношении этого же хоста выполняется более точное сканирование служб

Кстати, все сканирования служб выполняется простой программой Nmap. Так вот, третий этап — он долгий, а если хостов много, то он очень долгий. Поэтому можно добавить опцию --quick для пропуска глубокого сканирования.

Несмотря на то что теперь хосты будут браться из файла targets.txt (и если этот файл не сгенерирован с помощью опции --pingsweep, то программа будет завершать работу с ошибкой), нам всё равно при запуске нужно указать опцию -t:

reconnoitre -t 185.117.153.1-255 -o suip-neighbors --services --quick

И только после того, как предыдущая команда наглухо повесила систему (в виртуальной машине), а затем ещё пару раз наглухо повесила систему уже с выделенной ей 11 Гигабайтами оперативной памяти, я понял, как правы разработчики! В общем, для ускорения процесса все сканирования Nmap запускаются одновременно. Несмотря на нетребовательность Nmap к ресурсам, у этой программы бывают пиковые нагрузки на оперативную память и на процессор. И одновременный запуск нескольких сотен экземпляров Nmap может повесить систему, которая уже не оклемается.

Поэтому с помощью опции -t разбиваю подсеть на диапазоны поменьше:

reconnoitre -t 185.117.153.1-30 -o suip-neighbors --services --quick

Программа создаст много папок и запустит быстрое сканирование:

Для каждого хоста будут сделаны следующие подпапки:

  • scans
  • exploit
  • loot

Если я правильно понял описание, программа записывает данные только в scans. Что касается exploit и loot (добыча), то они сделаны только для нашего удобства и туда мы сами должны сохранять добытые другими способами данные.

В папке scans будет создано несколько файлов — в основном это результаты сканирования Nmap в разных форматах. Но файл вида ХОСТ_findings.txt содержит команды для последующего анализа или атаки на найденные службы.

Пример такого файла:


То есть в нём содержаться сгенерированные команды для анализа каждой службы. Инструменты в командах выбраны с учётом вида службы, также учтены используемый порт, предусмотрено сохранение результатов в файл. Например, если HTTP/HTTPS служба на 1500 порту, то именно он будет указан в команде для запуска.

Обратите внимание, что на примере этого файла видно, что данные могут дублироваться — используйте его внимательно.

Классификация предлагаемых команд:

  • Enumeration — Перечисление (поиск интересных файлов, виртуальных хостов и т.п.
  • Find users — Поиск пользователей
  • Bruteforcing — Подбор учётных данных
  • Use nmap to automate banner grabbing and key fingerprints, e.g. - Использование nmap для сбора баннера и отпечатков
  • Check out the server for web applications with sqli vulnerabilities — Проверка сервера на веб-приложения с уязвимостью sqli

Поиск имён хостов

Для определения имён хостов используется опция --hostnames, пример запуска:

reconnoitre -t 185.117.153.1-255 -o suip-neighbors --hostnames

Результаты:

Если честно, я эти результаты не понимаю. Если кто-то знает, что такое WIN-344VU98D3RU, WIN-32VTGRUNTN0 и даже IH999345, то поясните, плиз, в комментариях.

Поиск виртуальных хостов

Чтобы лучше понимать, что за виртуальные хосты предполагается искать, рекомендуется статья «Поиск виртуальных хостов веб-сервера» - там, кстати, рассказывается о другой программе для этого. Но поскольку у неё тот же автор, что и у Reconnoitre, то, надо думать, что код одинаковый.

Для поиска виртуальных хостов используется опция --virtualhosts. Также нужно обязательно указать путь до словаря с опцией -w. В папке с Reconnoitre имеется небольшой словарик по пути: Reconnoitre/wordlists/virtual-host-scanning.txt

Пример запуска:

reconnoitre -t 185.117.153.1-255 -o suip-neighbors -w bin/Reconnoitre/Reconnoitre/wordlists/virtual-host-scanning.txt --virtualhosts

Поиск DNS серверов в указанном диапазоне адресов

Если вам нужно из большого массива хостов найти те, на которых настроен сервер имён, то запустите Reconnoitre с опцией --dns:

reconnoitre -t 185.117.153.1-255 -o suip-neighbors --dns

Заключение

Итак, мы рассмотрели примеры использования Reconnoitre. Полный список опцией (там есть ещё несколько полезных), вы найдёте на странице: https://kali.tools/?p=4691

Дальше рассмотрены ошибки, которые не должны у вас возникнуть, если вы всё делали по данной инструкции. Тем не менее если вы что-то пропустили, то следующий раздел должен помочь вам.

Решение проблем

Ошибка PermissionError: [Errno 13] Permission denied:

В зависимости от способа установки, указание папки для сохранения в виде относительного пути может вызывать ошибку вроде следующей:

Traceback (most recent call last):
  File "/usr/share/reconnoitre/Reconnoitre/lib/file_helper.py", line 7, in check_directory
    os.stat(output_directory)
FileNotFoundError: [Errno 2] No such file or directory: 'suip-neighbors'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "reconnoitre.py", line 146, in <module>
    main()
  File "reconnoitre.py", line 87, in main
    arguments.quiet)
  File "/usr/share/reconnoitre/Reconnoitre/lib/ping_sweeper.py", line 7, in ping_sweeper
    check_directory(output_directory)
  File "/usr/share/reconnoitre/Reconnoitre/lib/file_helper.py", line 9, in check_directory
    os.mkdir(output_directory)
PermissionError: [Errno 13] Permission denied: 'suip-neighbors'

Причина ошибки в том, что с опцией -o указан относительный путь до папки сохранения — в этом примере это suip-neighbors. В данном случае для программы рабочей директорией является папка, в которую у неё не хватает прав для записи. Поэтому для исправления рекомендуется указать полный путь до директории для которой у текущего пользователя есть разрешения на запись, например -o /home/mial/suip-neighbors.

Ошибка TypeError: a bytes-like object is required, not 'str'

Traceback (most recent call last):
  File "reconnoitre.py", line 146, in <module>
    main()
  File "reconnoitre.py", line 87, in main
    arguments.quiet)
  File "/usr/share/reconnoitre/Reconnoitre/lib/ping_sweeper.py", line 12, in ping_sweeper
    lines = call_nmap_sweep(target_hosts)
  File "/usr/share/reconnoitre/Reconnoitre/lib/ping_sweeper.py", line 27, in call_nmap_sweep
    lines = str(results).encode("utf-8").split("\n")
TypeError: a bytes-like object is required, not 'str'

Данная ошибка уже исправлена в последней версии Reconnoitre, поэтому вам достаточно обновиться. Если в вашем репозитории отсутствуют обновления, то скачайте непосредственно с GitHub:

git clone https://github.com/codingo/Reconnoitre
cd Reconnoitre/Reconnoitre/
python2 ./reconnoitre.py -h

Ошибка «TypeError: not all arguments converted during string formatting»

При выполнении SNMP сканирования могут появиться сообщения вроде таких:

[+] Performing SNMP scans for 185.117.153.18 to suip-neighbors/185.117.153.18/scans/snmp/
   [>] Performing snmpwalk on public tree for: 185.117.153.18 - Checking for System Processes
Process Process-18:
Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 267, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python2.7/dist-packages/Reconnoitre-1.0-py2.7.egg/Reconnoitre/lib/snmp_walk.py", line 73, in snmp_scans
    ip_address, output_directory, ip_address)
TypeError: not all arguments converted during string formatting

Для исправления откройте файл snmp_walk.py:

gedit /usr/local/lib/python2.7/dist-packages/Reconnoitre-1.0-py2.7.egg/Reconnoitre/lib/snmp_walk.py

Найдите там строку:

        ip_address, output_directory, ip_address)

и замените её на:

        ip_address, output_directory)

Ошибка «ImportError: No module named lib.file_helper»

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

Traceback (most recent call last):
  File "/usr/local/bin/reconnoitre", line 11, in <module>
    load_entry_point('Reconnoitre==1.0', 'console_scripts', 'reconnoitre')()
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 489, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2793, in load_entry_point
    return ep.load()
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2411, in load
    return self.resolve()
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2417, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/usr/local/lib/python2.7/dist-packages/Reconnoitre-1.0-py2.7.egg/Reconnoitre/reconnoitre.py", line 7, in <module>
    from lib.find_dns import find_dns
  File "/usr/local/lib/python2.7/dist-packages/Reconnoitre-1.0-py2.7.egg/Reconnoitre/lib/find_dns.py", line 3, in <module>
    from lib.file_helper import check_directory
ImportError: No module named lib.file_helper

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

git clone https://github.com/codingo/Reconnoitre
cd Reconnoitre/
find . -type f -print0 | xargs -0 sed -i 's/from lib.file_helper/from file_helper/g' #fix
sudo python setup.py install
reconnoitre -h

Вы уже знаете о факультете информационной безопасности от GeekBrains? Комплексная годовая программа практического обучения с охватом всех основных тем, а также с дополнительными курсами в подарок. По итогам обучения выдаётся свидетельство установленного образца и сертификат. По этой ссылке специальная скидка на любые факультеты и курсы!

Рекомендуется Вам:

2 комментария to Reconnoitre: помощник в анализе веб-приложений

  1. Velizar:

    НЕ РАБОТАЕТ

    Один раз запустилась произвел цикл сканов,после сменил др. айпии усе на глухо пересталазапускатся.Переустанавливал мягко говоря МНОГО разитог тот же не рабртает.Фиксил ошибки по вашей инструкции не помогает.Да и крайний "фикс" в финале статьи где речь идет о -(То выполните установку следующим образом: ) собственно метод ни одним симоволом не отличается от метода в начале статьи забавно.Еще заметил если поэкспериментировать с количеством например 192.168.1.0-255, 192.168.1.0-70 ,192.168.1.0-255 40 и т.д иногда запускается.Интересная програмулька но ошибки раздражают.Посмотрите может опечатка в крайнем"фиксе" реально ни чем от начального не отвечает.Печально

    • Alexey Alexey:

      Извините, но я ничего не понял из вашего сообщения…

      Если ошибка, то какая именно ошибка, почему бы сразу не привести её текст и не приложить скриншот?

      Если ошибка сразу после установки (то есть даже не получается вывести справку), то какой из двух описанных способов установки вы выбрали?

      Я для проверки удалил программу:

      rm /usr/local/bin/reconnoitre

      Заново скачал и установил:

      git clone https://github.com/codingo/Reconnoitre
      cd Reconnoitre/
      find . -type f -print0 | xargs -0 sed -i 's/from lib.file_helper/from file_helper/g' #fix
      sudo python setup.py install

      У меня успешно вывелась справка:

      reconnoitre -h

      И успешно отработал пробный запуск:

      reconnoitre -t 185.117.153.1-255 -o suip-neighbors --pingsweep

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

      А «Решение проблем» - это что-то вроде справочного материала. В том числе для тех, кто пришёл из поиска (85% посетителей приходят из поиска).

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

Ваш e-mail не будет опубликован.