Active Recon. Составляем пошаговый план активной разведки

Содержание статьи

  • Фильтруем URL по статус-кодам
  • Сканируем порты
  • Формируем список веб-сервисов
  • Обрабатываем список доменов
  • Коды 401, 403 и 404
  • Альтернативы httpx
  • Поиск виртуальных хостов
  • Работа со списками URL
  • Брут директорий
  • Поиск эндпоинтов
  • Сохраняем ответы по URL-адресам
  • Анализируем список URL
  • URL с параметрами
  • POST-запросы
  • Список JS-файлов
  • Технологии
  • Еще немного фильтруем
  • Скрытые параметры
  • Вкратце об API и Swagger
  • Строим карту сайта
  • Скриншотим
  • Выводы

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

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

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

Да­вай подума­ем о пред­сто­ящих целях. На этом эта­пе наша задача сво­дит­ся к сле­дующе­му:

  • от­филь­тро­вать соб­ранные в пас­сивном режиме URL-адре­са;
  • соб­рать информа­цию об откры­тых пор­тах;
  • най­ти вир­туаль­ные хос­ты;
  • сде­лать скрин­шоты веб‑сер­висов;
  • до­пол­нить спи­сок URL-адре­сов с помощью брут­форса дирек­торий и поис­ка инте­рес­ных эндпо­интов;
  • сох­ранить отве­ты на зап­росы по соб­ранным URL и най­ти в них важ­ную информа­цию;
  • пос­тро­ить спи­сок URL-адре­сов с парамет­рами;
  • соб­рать спи­сок фай­лов JavaScript;
  • пос­тро­ить кар­ту веб‑при­ложе­ний и сер­висов в Burp.

 

Фильтруем URL по статус-кодам

Итак, будем счи­тать, что у нас уже есть огромный спи­сок уни­каль­ных URL и доменов, соб­ранных пас­сивно. Что­бы эффектив­но с ними работать, нуж­но отсорти­ровать их по ста­тус‑кодам. Этот шаг я вклю­чил в этап Enum, потому что тут мы уже активно вза­имо­дей­ству­ем с целевой инфраструк­турой и это уже не отно­сит­ся к пас­сивным методам.

При­мер коман­ды:

cat uniq_passive_urls | httpx -mc 200,201,202,204,206,301,302,401,403,404,405,500,502,503 -o live_passive_url

Ос­новные ста­тус‑коды (на слу­чай, если кто‑то позабыл):

  • 200 OK — стра­ница дос­тупна;
  • 201 Created — ресурс успешно соз­дан сер­вером (нап­ример, при заг­рузке фай­лов или тес­тирова­нии API);
  • 202 Accepted — зап­рос при­нят, но пока обра­баты­вает­ся асин­хрон­но;
  • 203 Non-Authoritative Information — сер­вер отда­ет модифи­циро­ван­ный кеширо­ван­ный кон­тент;
  • 204 No Content — зап­рос выпол­нен успешно, но в отве­те нет содер­жимого;
  • 205 Reset Content — кли­енту нуж­но сбро­сить пред­став­ление, нап­ример очис­тить фор­му;
  • 206 Partial Content — сер­вер пре­дос­тавля­ет часть фай­ла по Range;
  • 301 Moved Permanently / 302 Found — сиг­нализи­руют о воз­можных редирек­тах;
  • 401 Unauthorized — тре­бует­ся авто­риза­ция;
  • 403 Forbidden — дос­туп зап­рещен, хотя ресурс сущес­тву­ет (полез­но для обхо­да ACL);
  • 404 Not Found — ресурс не най­ден, но иног­да через обход мож­но обна­ружить что‑то инте­рес­ное;
  • 405 Method Not Allowed — может сви­детель­ство­вать о наличии нес­тандар­тных методов (нап­ример, PUT, DELETE);
  • 500 Internal Server Error — ука­зыва­ет на баг в обра­бот­ке зап­роса;
  • 502 Bad Gateway / 503 Service Unavailable — проб­лемы на сер­верной сто­роне, иног­да в тек­сте ошиб­ки содер­жится что‑то инте­рес­ное.

Ес­ли у нас боль­шой ско­уп и спи­сок URL-адре­сов тоже впе­чат­ляюще велик, то надо исполь­зовать трюк с раз­бивкой на час­ти.

Ко­ман­да для раз­деления боль­шого спис­ка URL на час­ти:

split -l 5000 ../uniq_passive_urls target_part_

При­мер коман­ды для поэтап­ного запус­ка:

( trap 'pkill -P $$' SIGINT; for file in target_part_*; do httpx -list "$file" -mc 200,201,202,204,206,301,302,401,403,404,405,500,502,503 -o "httpx-optimized_${file}.txt" & done; wait )

Ко­ман­да для объ­еди­нения нес­коль­ких фай­лов в один файл:

cat httpx-optimized_* | anew live_passive_url

Или оставь толь­ко самые важ­ные ста­тус‑коды, нап­ример 200, 301, 302, 500, 502 и 503. Отве­ты на коды 401 и 403 мож­но будет потом соб­рать отдель­но.

 

Сканируем порты

Ути­лита Naabu, думаю, всем зна­кома (если нет, у нее отличная докумен­тация). Здесь я покажу, как запус­тить ска­ниро­вание в активном режиме.

Но сна­чала под­готовим спи­сок для ска­ниро­вания:

cat live_subdomains.txt ip_list_resolved | anew for_port_scan

По­чему мы объ­еди­няем домены и IP? Это помога­ет обес­печить мак­сималь­ное пок­рытие при ана­лизе ска­нера­ми. Нап­ример, ска­нер может не обна­ружить уяз­вимость по адре­су http://1.1.1.1:9443, но най­дет ее на http://example.com:9443. Или, если дос­туп к веб‑сер­вису через IP заб­локиро­ван, мы смо­жем прос­каниро­вать его по домену. От нас ник­то не уйдет!

naabu -list for_port_scan -verify -ec -retries 1 -p 0-65535 -warm-up-time 0 -c 50 -nmap-cli "nmap -sV -oA nmap-out" -o open_ports.txt

Ес­ли ско­уп боль­шой, можем раз­бить задачу на час­ти и ска­ниро­вать в мно­гопо­точ­ном режиме:

split -l 500 ../for_port_scan target_part_

Ко­ман­да для запус­ка Naabu на отдель­ных час­тях спис­ка IP-адре­сов:

( trap 'pkill -P $$' SIGINT; for file in target_part_*; do naabu -silent -list "$file" -verify -ec -retries 1 -p 0-65535 -warm-up-time 0 -c 50 -rate 500 -nmap-cli "nmap -sV -sC -oA nmap-out_${file}" -o "naabu-optimized_${file}.txt" & done; wait )

Сох­рани всё в файл open_ports.txt:

cat optimized_* | anew open_ports.txt info

Ес­ли ска­ниру­емый ско­уп велик, луч­ше сна­чала запус­тить Naabu и передать Nmap файл со спис­ком пор­тов open_ports.txt, чем поль­зовать­ся коман­дами из при­меров выше.

 

Формируем список веб-сервисов

Бе­рем спи­сок из фай­ла open_ports.txt и переда­ем его ути­лите httpx. На выходе получа­ем файл web_services.txt с веб‑сер­висами на раз­ных пор­тах.

cat open_ports.txt | httpx -o web_app.txt

Преж­де чем дви­гать­ся даль­ше, раз­делим текущий спи­сок на два отдель­ных. Это поз­волит нам эффектив­но искать вир­туаль­ные хос­ты — как через при­вяз­ку IP к доменам, так и с помощью брут­форса доменов для кон­крет­ного IP-адре­са.

Ко­ман­да для соз­дания спис­ка в фор­мате ip:port:

grep -E '^https?://([0-9]{1,3}.){3}[0-9]{1,3}(:[0-9]+)?$' web_app.txt > web_app_ip.txt

Ко­ман­да для фор­мирова­ния спис­ка в фор­мате domain:port:

grep -Ev '^https?://([0-9]{1,3}.){3}[0-9]{1,3}(:[0-9]+)?$' web_app.txt > web_app_domain.txt Важный нюанс

Ути­лита httpx заменя­ет пор­ты 80 и 443 пре­фик­сами http:// и https:// соот­ветс­твен­но, оставляя нес­тандар­тные пор­ты, такие как 8083, без изме­нений.

Что­бы решить эту проб­лему, мож­но исполь­зовать на этом эта­пе httprobe, а затем пов­торить те же шаги.

Уда­ляем пре­фик­сы http:// и https://:

sed 's|https?://||' web_app.txt > web_app2

Сос­тавля­ем спи­сок доменов:

grep -Ev '^([0-9]{1,3}.){3}[0-9]{1,3}:[0-9]+$' web_app2 > web_app_domain.txt

Сос­тавля­ем спи­сок с IP-адре­сами:

grep -E '^([0-9]{1,3}.){3}[0-9]{1,3}:[0-9]+$' web_app2 > web_app_ip.txt  

Обрабатываем список доменов

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

  • соб­рать спи­сок невалид­ных адре­сов (понадо­бит­ся для поис­ка вир­туаль­ных хос­тов);
  • соб­рать спи­сок адре­сов, воз­вра­щающих коды сос­тояния 401 и 403;
  • соб­рать спи­сок адре­сов, воз­вра­щающих 404.

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

Ос­талось соб­рать спи­сок под­доменов, которые не резол­вятся.

При­мер коман­ды:

comm -23 <(sort subdomains | uniq) <(sort live_subdomains.txt | uniq) > not_resolv_subdomain.txt  

Коды 401, 403 и 404

Те­перь, имея на руках два спис­ка под­доменов, нуж­но соб­рать из них те, которые резол­вятся через пуб­личные спис­ки под­доменов и име­ют ста­тусы 401, 403 и 404. Это дела­ется для пос­леду­юще­го брут­форса и поис­ка спо­собов обхо­да авто­риза­ции. Коман­да ниже сох­ранит в два фай­ла нуж­ные адре­са со ста­тус‑кодами 401, 403 и 404 для бру­та.

cat live_subdomain.txt | httpx -mc 401,403 -o 401_403.txt cat live_subdomain.txt | httpx -mc 404 -o 404.txt

Воз­ника­ет воп­рос: зачем нам два фай­ла, а не один? Все прос­то: файл со ста­тус‑кодами 401 и 403 мы потом допол­ним и будем про­бовать бай­пасы.

Итак, спис­ки для бай­паса у нас есть, теперь под­готовим спи­сок для брут­форса.

cat 401_403.txt 404.txt | anew for_brute_dir.txt

Ты, воз­можно, запутал­ся, и это нор­маль­но — про­цесс не из лег­ких. Давай пос­мотрим, что у нас получи­лось:

  • resolv_subdomain.txt;
  • not_resolv_subdomain.txt;
  • responses_401_403.txt;
  • responses_404.txt.

 

Альтернативы httpx

Ес­ли httpx вдруг чем‑то тебя не устра­ивает или ты сом­нева­ешь­ся в кор­рек­тнос­ти его резуль­татов (такое за ним уже замеча­ли), то сущес­тву­ют аль­тер­нативы, которые мож­но исполь­зовать. Давай крат­ко рас­смот­рим дос­тупные вари­анты.

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *