• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Составляем полный воркфлоу для тихой разведки

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,178
Розыгрыши
0
Реакции
510
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Пассивная разведка позволяет собрать данные о цели с минимальными рисками обнаружения. Это важный этап в пентестах и прочих offensive-проектах. Эта статья — пошаговое руководство от сбора доменов, IP-адресов и утекших данных до поиска уязвимостей. Имея перед глазами четкий план действий, можно эффективнее готовиться к следующим этапам.
На просторах интернета — как в русскоязычном сегменте, так и в иностранном — очень много крутых материалов, однако я не находил универсальных пошаговых инструкций, которые охватывали бы весь процесс от начала и до конца, особенно в части проведения активной и пассивной разведки на этапе формирования поверхности атаки.

Поэтому я попытался выстроить универсальный рабочий процесс, который мог бы как‑то унифицировать базовые проверки. Точнее, настолько универсальный, насколько это возможно.


Я постарался сделать статью понятной и интересной для специалистов с любым уровнем и бэкграундом. Я добавлял в воркфлоу такие проверки, которые, на мой взгляд, необходимо проводить почти на любом проекте — будь то Red Team, пентест или анализ защищенности.

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

Я старался исходить из того, что на старте нам известен самый минимум. Если в твоей задаче есть какие‑то другие вводные данные и, например, список доменов уже известен, то просто пропускай до нужного места.

Наши методы и сценарии будут по возможности пассивными, но среди них могут попадаться и подразумевающие какое‑то минимальное взаимодействие. Об этом я буду предупреждать сразу же — пометкой «взаимодействие» на случай, если тебе нужно полное отсутствие активных действий.


Структура папок​

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

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


Используемый софт​

Здесь я кратко опишу часто используемые утилиты. Некоторые из них малоизвестны, поэтому неплохо будет сказать пару слов о том, как и для чего они применяются:

  • Для просмотра ссылки Войди или Зарегистрируйся служит для добавления в файл уникальных строк из stdin;
  • Для просмотра ссылки Войди или Зарегистрируйся используется для анализа ответов сервера;
  • Для просмотра ссылки Войди или Зарегистрируйся мы будем использовать для сохранения заголовков и тела ответа в файлы;
  • Для просмотра ссылки Войди или Зарегистрируйся позволяет исключать все, что за пределами скоупа;
  • Для просмотра ссылки Войди или Зарегистрируйся был мной разработан в качестве аналога для Для просмотра ссылки Войди или Зарегистрируйся. Утилита qsreplace мне не понравилась тем, что она изменяет абсолютно все параметры в URL сразу (это делает результат непредсказуемым), а paramrep подменяет параметры по одному;
  • Для просмотра ссылки Войди или Зарегистрируйся — усовершенствованный curl. Позволяет обходить защиту от ботов, изображая легитимный браузер, в том числе путем подмены JA3-фингерпринта, что в последнее время все актуальнее.
Для inscope нужно создать в корневом каталоге проекта файлик .scope примерно с таким содержимым:

.*\.example\.com$
^example\.com$

Цели​

Глобально на этапе пассивной разведки перед нами стоят следующие цели:

  • познакомиться с таргетами, понять, насколько они большие и архитектурно сложные, какие технологии используются;
  • собрать список поддоменов;
  • собрать живые поддомены;
  • получить несколько опциональных файлов для ручного анализа;
  • собрать список IP-адресов;
  • получить список URL-адресов из разных источников в пассивном режиме;
  • посмотреть в пассивном режиме порты и сервисы;
  • проверить в пассивном режиме уязвимости;
  • изучить утечки учетных данных;
  • собрать из открытых источников список email-адресов.

Первое знакомство​

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


Букмарклет для сбора URL (взаимодействие)​

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

info​

Букмарклет — это фрагмент кода на JavaScript, сохраненный в виде закладки браузера. Если нажать на него, он запустится на текущей веб‑странице и что‑то сделает. Это никак не триггерит целевую систему: по сути, мы просто один раз зашли на страницу, как сделал бы любой легитимный клиент.
Вот код букмарклета:

Код:
javascriptasync function(){let scanningDiv=document.createElement("div");scanningDiv.style.position="fixed",scanningDiv.style.bottom="0",scanningDiv.style.left="0",scanningDiv.style.width="100%",scanningDiv.style.maxHeight="50%",scanningDiv.style.overflowY="scroll",scanningDiv.style.backgroundColor="white",scanningDiv.style.color="black",scanningDiv.style.padding="10px",scanningDiv.style.zIndex="9999",scanningDiv.style.borderTop="2px solid black",scanningDiv.innerHTML="<h4>Scanning...</h4>",document.body.appendChild(scanningDiv);let e=[],t=new Set;async function n(e){try{const t=await fetch(e);return t.ok?await t.text()console.error(Failed to fetch ${e}: ${t.status}),null)}catch(t){return console.error(Error fetching ${e}:,t),null}}function o(e){if(!(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")))return!1;if(e.includes(" ")||/[^\x20-\x7E]/.test(e))return!1;if(e.length<2||e.length>=200)return!1;if(e.includes("{")||e.includes("}")||e.includes(":")||e.includes("?")||e.includes("*")||e.includes("(")||e.includes(")")||e.includes("[")||e.includes("]"))return!1;return!0}function s(e){return[...e.matchAll(/[%27"]((?:\/|\.\.\/|\.\/)[^%27"]+)[%27"]/g)].map(e=>e[1]).filter(o)}async function c(o){if(t.has(o))return;t.add(o),console.log(Fetching and processing: ${o});const c=await n(o);if(c){const t=s(c);e.push(...t)}}const l=performance.getEntriesByType("resource").map(e=>e.name);console.log("Resources found:",l);for(const e of l)await c(e);const i=[...new Set(e)];console.log("Final list of unique paths:",i),console.log("All scanned resources:",Array.from(t)),scanningDiv.innerHTML=<h4>Unique Paths Found:</h4><ul>${i.map(e=><li>${e}</li>).join("")}</ul>})();
Как установить и использовать этот букмарклет:

  • добавь новую закладку на панель закладок в браузере;
  • замени URL закладки фрагментом кода на JavaScript;
  • открой целевую страницу и щелкни по букмарклету;
  • если не сработало, поищи разрешение запускать букмарклеты в настройках безопасности браузера.
Результат запуска

Онлайновые сервисы​

В продолжение знакомства с целью мы можем использовать онлайновые сервисы для поиска информации о сайте:

  • Для просмотра ссылки Войди или Зарегистрируйся — неплохо подойдет для поиска поддоменов;
  • Для просмотра ссылки Войди или Зарегистрируйся — позволяет быстро смотреть статус‑коды по доменам и поверхностно ознакомиться с заголовками; более детальный анализ я опишу далее.
Этот этап занимает немного времени, но уже на нем ты познакомишься с целью и потенциально выявишь такие уязвимости, как, например, subdomain takeover.


Проверяем утечки​

Для общего понимания системы и обогащения информации неплохо было бы посмотреть утечки учетных данных пользователей или сотрудников нашей цели. Обычно этот тип проверок выделяют в отдельный вид работ, которым занимаются специалисты по OSINT. Я приведу несколько ресурсов для примера (на самом деле их намного больше):


Собираем почты​

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


EmailHarvester​

Для просмотра ссылки Войди или Зарегистрируйся — одна из утилит для поиска и сбора email-адресов.

Ниже приведена bash-команда для запуска утилиты и поиска по списку доменов:

(trap 'kill 0' SIGINT; while IFS= read -r domain; do target_name=$(echo $domain | sed "s/[^a-zA-Z0-9]/[I]/g"); echo "Starting EmailHarvester for $domain"; python3 EmailHarvester.py -d "$domain" -s "email[/I]${target_name}.txt"; done < ~debian/Desktop/scope)

LinkedIn​

Думаю, все знают такой ресурс для IT-специалистов, как LinkedIn. С его помощью мы можем спарсить email-адреса сотрудников интересующей нас компании. Ниже приведен пример работы неплохой утилиты Для просмотра ссылки Войди или Зарегистрируйся, которая справляется с этой задачей (и, кстати, не требует ни учетной записи, ни API-ключа).

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

python3 crosslinked.py -f '{first}.{last}@example.ru' "Рога и Копыта"
Тут я предлагаю сделать небольшую паузу и обратить внимание на то, что у нас уже есть на данный момент:
  • эндпоинты на целевом ресурсе;
  • список утекших учетных данных;
  • поверхностное понимание ландшафта, составленное по активным поддоменам, без глубокого изучения;
  • список email-адресов сотрудников компании.

TLD и root domains​

В этом разделе и далее мы начнем заниматься, как сейчас модно говорить, Attack Surface Managed. Пришло время приступить к сбору активов исследуемой компании и формированию поверхности атаки.


Онлайн​

Бывают ситуации, когда заказчик не предоставляет полный список поддоменов компании. Тогда нам нужно самостоятельно найти домены, связанные с нашим таргетом. В этом может помочь довольно известный онлайновый сервис Для просмотра ссылки Войди или Зарегистрируйся, который предоставляет много полезной информации как напрямую, так и косвенно по исследуемой цели.

Для просмотра ссылки Войди или Зарегистрируйся

Из командной строки​

Скажу сразу, что, несмотря на мою любовь к CLI, этот метод мне не очень понравился, так как приходится перепроверять валидность большого объема информации. Вдобавок необходимость поиска TLD (Top Level Domain) в рамках проектной деятельности встречается довольно редко. Но все же утилита Для просмотра ссылки Войди или Зарегистрируйся стоит упоминания.

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

tldfinder -d google -dm tld | anew domains
Я, впрочем, предпочитаю Для просмотра ссылки Войди или Зарегистрируйся.

Именно на этом этапе формируется файл scope. В него мы помещаем либо домены, относящиеся к компании, либо домены, предоставленные заказчиком. Это важно для дальнейшей работы.

Собираем IP-адреса​

Если компания большая и у нее есть собственный пул IP-адресов, выполняем следующие шаги.


Поиск номера AS​

Чтобы узнать ASN, сначала резолвим в IP:

nslookup example.com
Ответ будет выглядеть примерно так:

Код:
Non-authoritative answer:
Name:   example.com
Address: 111.111.111.111
Name:   example.com
Address: 112.112.112.112

Смотрим Whois:

Код:
whois 111.111.111.111
whois 112.112.112.112
Вывод будет примерно такой:

Код:
domain:        EXAMPLE.COM
nserver:       ns4-l2.abc.com.
nserver:       ns8-l2.abc.com.
nserver:       nsz501s1.example.com. 111.111.111.2
nserver:       nsz502s1.example.com. 111.111.111.3
nserver:       nsz503s1.example.com. 111.111.111.4
state:         REGISTERED, DELEGATED, VERIFIED
org:           LLC "Roga and Koputa"
taxpayer-id:   7704211234
registrar:     ocean-com
admin-contact: https://www.didgitalocean.com/whois
created:       1998-02-09T07:45:50Z
paid-till:     2025-02-28T21:00:00Z
free-date:     2025-04-01
source:        TCI

Далее мы можем поискать в базе данных BGP информацию по подсетям.

Если нашли ASN, то Для просмотра ссылки Войди или Зарегистрируйся:

[URL unfurl="true"]https://bgp.he.net/AS11111#_prefixes[/URL]
Если не нашли, то можем просто Для просмотра ссылки Войди или Зарегистрируйся:

[URL unfurl="true"]https://bgp.he.net/ip/111.111.111.1[/URL]
Для просмотра ссылки Войди или Зарегистрируйся:

[URL unfurl="true"]https://bgp.he.net/dns/example.com#_ipinfo[/URL]

Ripe — ситуативно​

Если вдруг так вышло, что результаты из BGP нас каким‑то образом не удовлетворили, можно поискать в БД Ripe.

Для просмотра ссылки Войди или Зарегистрируйся по доменному имени example.com:

[URL unfurl="true"]https://apps.db.ripe.net/db-web-ui/query?bflag=false&dflag=false&rflag=true&searchtext=examle.com&source=RIPE&types=inetnum[/URL]
Поиск по организации ORG-PIS111-RIPE:

[URL unfurl="true"]https://apps.db.ripe.net/db-web-ui/query?bflag=false&dflag=false&rflag=true&searchtext=-i%20org%20ORG-PIS111-RIPE&source=ripe[/URL]

ASNmap​

Когда нашли номер AS, в качестве неплохой и более простой альтернативы можно использовать консольную утилиту Для просмотра ссылки Войди или Зарегистрируйся, которая покажет все подсети по определенному номеру AS.

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

asnmap -a AS11111 -silent | anew subnet
Формируем список IP-адресов для удобного дальнейшего взаимодействия с ним:

nmap -sL -n -iL subnet | awk '/Nmap scan report/{print $NF}' | grep -E "^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$" > ip_list
Добавлю, что все‑таки рекомендую сверять результаты BGP/RIPE и ASNmap, чтобы точно ничего не упустить.


Ищем поддомены​

После того как мы собрали список IP-адресов компании, настало время для сбора поддоменов.


Google Dorks​

Первое, с чего хотелось бы начать рассказ о поиске доменных имен, принадлежащих компании, — это Google Dorks. Для многих это может показаться пережитком прошлого или даже чем‑то попсовым, но их не стоит недооценивать. Например, недавно, проводя некоторые исследования, я обнаружил с их помощью на правительственном портале Республики Чехии открытый доступ к Elasticsearch с Kibana.

info​

Подробнее о Google Dorks читай в статьях «Для просмотра ссылки Войди или Зарегистрируйся» и «Для просмотра ссылки Войди или Зарегистрируйся».

Google Dorks Online​

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

Однако я, как человек, который очень любит Linux и, в частности, работу в терминале, не особенно ценю эти сервисы по нескольким причинам:

  1. Крайне неудобно работать с результатами, которые мы получаем на выходе.
  2. Нет возможности дополнить имеющиеся дорки чем‑то своим — нас вынуждают использовать только то, что автор уже изначально заложил по своему усмотрению.

GoogleDorker​

Я рекомендую использовать утилиту Для просмотра ссылки Войди или Зарегистрируйся. Сами дорки можно найти где угодно, ниже приведены лишь пара примеров:

Пример запуска с загрузкой дорков из файла:

dorker -l queries_dork.txt | anew url_dorks.txt
Одиночный запрос:

dorker -q "inurl:api site:bentley.com"
GoogleDorker в действии
Если у нас несколько доменов второго уровня, то, чтобы каждый раз не редактировать файл с дорками, можем воспользоваться командой ниже и заменять значение site:

sed -i 's/^site:[^ ]*/site:example.com/' queries_dork.txt

Fast Google Dork Scanner​

Это довольно неплохой вариант для работы с дорками прямо в Docker, но есть нюансы. Эта утилита:

  • не предназначена для работы с API Google;
  • использует захардкоженные дорки;
  • работает в Docker.
Команда для Docker:

docker build -t google_dork_ .
Команда для запуска:

docker run -it --rm google_dork_ domain.com

Собираем поддомены в Google​

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

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

cat urls_dorks.txt | grep -oP 'https://\K[^/]+' | anew subdomains_dorks
Пример результата

Обратный резолв записей PTR (взаимодействие)​

После того как мы собрали список IP-адресов, относящихся к компании, можем попробовать поискать PTR-записи и проверить обратный резолв: какие IP-адреса резолвятся в какие доменные имена. Это очень удобно делать с помощью утилиты Project Discovery Для просмотра ссылки Войди или Зарегистрируйся.

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

echo "111.111.111.0/24" | dnsx -ptr -resp | anew ptr
Вывод только доменных имен:

cat subnet | dnsx -ptr -resp | sed 's/\x1b\[[0-9;]*m//g' | awk '{print $NF}' | tr -d '[]' | anew subdomain_ptr_all.txt
Далее из списка полученных поддоменов достанем только домены второго уровня и добавим уникальные значения в файл с доменами.

cat subdomain_ptr_all.txt | rev | cut -d . -f 1,2 | rev | sort
В списке могут оказаться доменные имена второго уровня, которые не имеют никакого отношения к исследуемой цели, и их необходимо будет проверить вручную.

Если мы нашли много мусора, не относящегося к нашей цели, то просто отсортируем полученные результаты:

cat subdomain_ptr_all.txt | inscope | anew subdomain_ptr.txt
Файл subdomain_ptr_all.txt потом просто удаляем.


TLSx — поиск по сертификатам (взаимодействие)​

Эта утилитка позволяет искать по всем подсетям домены в сертификатах. Найтись они могут в полях CN и SAN.

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

echo "111.111.111.0/24" | tlsx -p 443,3443,8443,9443,10443 -cn -san | anew tlsx
Вывод только уникальных доменов:

cat subnet | tlsx -p 443,3443,8443,9443,10443 -cn -san | grep -oP '\[\K[^\]]+' | anew subdomain_tlsx_all.txt
Далее из списка полученных поддоменов достанем только домены второго уровня и добавим уникальные значения в файл с доменами:

cat subdomain_tlsx_all.txt | rev | cut -d . -f 1,2 | rev | sort

info​

Аналогичная ситуация и с dnsx, там делаем все то же самое.

Amass​

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

Пример использования:

amass intel -asn 11111 | inscope | anew subdomain_amass.txt

Revwhois​

Как работает Whois? Мы подаем на вход домен и получаем в ответ информацию о нем. Однако утилита Для просмотра ссылки Войди или Зарегистрируйся позволяет делать обратное — например, искать домены по имени организации.

Нас интересуют все домены в базе данных Whois, у которых поле org соответствует LLC "Roga and Kopyta". Для начала получим доступ к бесплатному API, зарегистрировавшись на Для просмотра ссылки Войди или Зарегистрируйся. Затем создаем новый файл и просто кладем туда наш ключ: ~/.config/whoisxml.conf.

Пример использования:

revwhoix -k "LLC "Roga and Kopyta"" | anew subdomain_revwhoix.txt

Haktrails​

Один из многих крутых сервисов для сбора поддоменов — это Для просмотра ссылки Войди или Зарегистрируйся, думаю, он знаком почти всем. Мы можем воспользоваться Для просмотра ссылки Войди или Зарегистрируйся и затем сформировать запрос.

Пример запроса:

curl --request GET --url '[URL]https://api.securitytrails.com/v1/domain/example.com/subdomains?children_only=false&include_inactive=true[/URL]' --header 'accept: application/json' -H 'apikey: you_api'
Ответ будет примерно такой:

Код:
{
  "endpoint": "/v1/domain/example.com/subdomains",
  "meta": {
    "limit_reached": false
  },
  "subdomain_count": 113,
  "subdomains": [
    "sport2",
    "race-banner-widget",
    "green-mobileappv2",
    "raffle",
    "blue-mobileappv2",
    "site-static-blue-cdn",

На мой взгляд, сложновато. Есть классная утилита Для просмотра ссылки Войди или Зарегистрируйся, которая позволяет делать все то же самое, но без лишних сложностей.

Команда для установки:

go install -v github.com/hakluke/haktrails@latest
Создаем папку для файла с настройками:

mkdir ~/.config/haktools/
Создаем сам конфиг:

nano ~/.config/haktools/haktrails-config.yml
Пример настроек:

securitytrails:
key: you_api_ley
Пример команды для запуска:

cat scope | haktrails subdomains | anew subdomain_haktrails.txt

Subfinder​

Это одна из лучших утилит для поиска доменов. Настоятельно рекомендую использовать API-ключи для улучшения результатов — разница просто огромна.

Команда для установки:

go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
Конфиг по умолчанию лежит по пути ~/.config/subfinder/provider-config.yaml.

Вот как запустить поиск поддоменов по всему скоупу со статистикой и всеми источниками:

subfinder -dL scope -all -stats | anew subdomain_subfinder.txt

Crt.sh​

Еще один знаменитый ресурс для сбора поддоменов — Для просмотра ссылки Войди или Зарегистрируйся.

Команда для поиска:

while IFS= read -r domain; do curl -s "[URL='https://crt.sh/?cn=%25.$domain&output=json']https://crt.sh/?cn=%.$domain&output=json[/URL]" | jq -r '.[].name_value' | sort -u | anew subdomain_crtsh.txt; done < scope

Поддомены на GitHub​

Один из этапов, о котором, наверное, все знают, но который большинство специалистов пропускает, — сбор поддоменов с GitHub. Для этого существует замечательная утилита Для просмотра ссылки Войди или Зарегистрируйся. Для работы с ней я рекомендую сгенерировать 4–5 API-ключей GitHub и добавить их согласно инструкции.

Команда для установки:

go install github.com/gwen001/github-subdomains@latest
Простая команда для запуска выглядит так:

github-subdomains -d example.com -t ~/.config/github_recon/.tokens -o "github_example_com.txt"
Команда для поиска поддоменов по доменам из файла scope:

while read -r domain; do github-subdomains -d "$domain" -t ~/.config/github_recon/.tokens -o "github_${domain}.txt"; done < scope
Объединяем все в один файлик:

cat github_* | anew subdomain_github.txt

VirusTotal​

Думаю, многие знают о том, что через этот замечательный старинный сервис можно искать доменные имена и IP-адреса. Неплохо бы этот шаг делать в самом конце поиска поддоменов, но у VirusTotal есть ограничение при использовании бесплатного API.

Для просмотра ссылки Войди или Зарегистрируйся
Комфортными лимитами нас, конечно, не балуют: один запрос раз в 15 секунд с ограничением на 500 запросов в день и 15 500 в месяц.

Тут нужно действовать по ситуации. Иногда у нас уже может быть сформирован список IP-адресов, а списка с поддоменами может еще не быть. В таком сценарии мы будем искать по IP-адресам.
В других случаях может быть так, что у нас еще не будет готового списка IP, и тогда придется либо просто искать по доменам второго уровня, либо формировать неполный список поддоменов и проходиться по нему.
Особое внимание обрати на лимиты использования API: 500 запросов в день — это очень мало для большого проекта.
Пример команды для поиска доменных имен по списку IP-адресов:

while read -r ip_list; do vt ip resolutions "$ip" -i host_name | awk -F'"' '/host_name/ {print $2}'; sleep 15; done < ips.txt | anew subdomain_virustotal.txt
Пример команды для поиска IP-адресов по доменным именам:

while read -r domain; do vt domain resolutions "$domain" -i ip_address | awk -F'"' '/ip_address/ {print $2}'; sleep 15; done < subdomains.txt | anew ip_list.txt

Censys​

Этот замечательный сервис часто недооценивают или не используют весь его потенциал. Здесь я приведу лишь несколько примеров по поиску информации.

info​

Подробнее о Censys читай в статье «Для просмотра ссылки Войди или Зарегистрируйся».
По моим наблюдениям, альтернатив по количеству, качеству и актуальности найденной информации у Censys просто нет, поэтому мой выбор пал именно на него, а не на знаменитый Shodan. Впрочем, чем больше у тебя инструментов, тем лучше, так что пренебрегать аналогами тоже не стоит.

Запрос ниже — более‑менее универсальный и позволяет соблюсти золотую середину между валидностью предоставленных данных (результаты в скоупе) и количеством предоставляемой информации.

Итак, запрос:

(services.tls.certificate.parsed.subject.common_name=".domain.ru" or name=".domain.ru" or services.tls.certificates.leaf_data.issuer.common_name=".domain.ru" or services.tls.certificates.leaf_data.subject.common_name=".domain.ru" or services.http.response.html_title: ".domain.ru" or services.http.response.html_tags=".domain.ru") or services.http.response.favicons.md5_hash:your-md5-hash and not labels: truncated
Давай разберем его по частям. Следующая строка ищет сертификаты TLS, в которых поле subject.common_name (основное имя субъекта сертификата) соответствует домену *.domain.ru:

services.tls.certificate.parsed.subject.common_name="*.domain.ru"
Поиск записей, где имя ресурса соответствует *.domain.ru:

name="*.domain.ru"
Сертификаты, выданные организацией, у которой в поле issuer.common_name указано *.domain.ru:

services.tls.certificates.leaf_data.issuer.common_name="*.domain.ru"
Сертификаты TLS, в которых поле subject.common_name совпадает с *.domain.ru:

services.tls.certificates.leaf_data.subject.common_name="*.domain.ru"
HTTP-ресурсы, в которых заголовок страницы (HTML Title) содержит *.domain.ru:

services.http.response.html_title: "*.domain.ru"
Ресурсы, где *.domain.ru упоминается в HTML-тегах:

services.http.response.html_tags="*.domain.ru"
Следующая строка дополняет поиск ресурсами, у которых favicon (иконка сайта) имеет MD5-хеш your-md5-hash. Этот фильтр может быть полезен для идентификации похожих страниц:

services.http.response.favicons.md5_hash:your-md5-hash

Пара слов о favicon​

Перед тем как перейти к краткому разбору запросов Censys, я хотел бы сказать пару слов о favicon. Favicon — это самая обыкновенная картинка, которую браузер отображает на вкладках. Если, например, зайти на сайт Для просмотра ссылки Войди или Зарегистрируйся, то на открытой вкладке мы увидим логотип «Хакера».
Хеши favicon удобно сравнивать при помощи сервиса Для просмотра ссылки Войди или Зарегистрируйся.
Для просмотра ссылки Войди или Зарегистрируйся
Саму картинку можно искать при помощи Dev Tools браузера — просто поиском по коду. Теперь, когда мы знаем хеш, пора двигаться дальше.
Мы также можем исключить записи, которые помечены как truncated. Это помогает избежать анализа недостоверных данных:

not labels: truncated
Иногда этот универсальный запрос не дает нам ничего или содержит лишние результаты. Мы всегда можем воспользоваться оператором and not.

Например, чтобы исключить из выдачи хосты определенных облачных поставщиков, можно использовать следующую конструкцию:

and not autonomous_system.name=YANDEXCLOUD
А если мы в выдаче увидели, например, что‑то вроде domain-domain.ru, то можем исключить подобное из выдачи следующим способом:

and not dns.names: "*-domain.ru"
Рекомендую подробнее ознакомиться с синтаксисом запросов Censys, при грамотном использовании этот сервис будет ценнейшим инструментом.

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

Пример применения Censys​

Чтобы не быть голословным, приведу прикольный пример, который, возможно, тебя вдохновит.
Разберем такой запрос:
location.country=Russia and (services.port=8123 and services.http.response.status_code=200)
Он ищет все хосты на территории РФ, у которых порт 8123 отвечает статусом 200.
На этом порте работает БД ClickHouse, вернее, HTTP-интерфейс. Далее в пути дописываем /play и любуемся результатами.
Для просмотра ссылки Войди или Зарегистрируйся
Кстати, именно таким способом недавно был Для просмотра ссылки Войди или Зарегистрируйся.

Перебираем поддомены​

Еще один из этапов, которым пренебрегают некоторые специалисты, — это брутфорс поддоменов. Процедура небыстрая и требующая определенной подготовки. Лучше всего выделить под это VPS, так как домашний роутер точно не вывезет. Подойдет не любой хостер, но могу точно сказать, что с DigitalOcean у меня проблем не было. Поднять виртуалку на пару часов обычно недорого.

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

Код:
git clone https://github.com/blechschmidt/massdns.git
cd massdns
make
sudo make install

Затем Для просмотра ссылки Войди или Зарегистрируйся Go:

Код:
wget https://go.dev/dl/go1.23.1.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.23.1.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version

Переходим к самой Puredns.

Команда для установки:

Код:
go install github.com/d3mondev/puredns/v2@latest
Словарь для брута:

wget [URL]https://wordlists-cdn.assetnote.io/data/manual/best-dns-wordlist.txt[/URL]
Список для резолверов:

wget [URL]https://public-dns.info/nameservers-all.txt[/URL]
Пример команды для запуска перебора:

puredns bruteforce best-dns-wordlist.txt -d scope.txt -w subdomains.txt -r nameservers-all.txt

Ограничиваем лимиты​

Если видим, что VPS не вывозит нагрузку, то как вариант можно установить лимиты по числу запросов:

  • для публичных DNS-серверов ставь --rate-limit в районе 1000–2000 запросов в секунду. Ты можешь начать с нижней границы (1000) и постепенно увеличивать до 2000, если нет блокировок;
  • для доверенных DNS-серверов (--rate-limit-trusted) — 500–1000 запросов в секунду. Поскольку доверенные серверы (например, Google DNS, Cloudflare) могут быть более чувствительны к массовым запросам, тут лучше быть осторожным.
Также можно ограничить число потоков (--threads). Если используешь больше 100 потоков, это может привести к увеличению скорости, но также и к потенциальным проблемам — перегрузке сети и DNS-рекурсоров. Я бы рекомендовал оставить 100 потоков, а при необходимости снизить до 50–75, чтобы уменьшить нагрузку на систему.


Перебираем пермутации​

Перебор пермутаций поддоменов — еще одна из вещей, которые многие специалисты скипают из‑за банальной человеческой лени. Разумеется, осуждаем!

В переборе нам поможет утилита alterx.

Ставим ее на нашу VPS:

go install github.com/projectdiscovery/alterx/cmd/alterx@latest
Делаем перестановки для поиска новых поддоменов:

cat domains | alterx | dnsx -o alterx_resolved.txt
Далее мы детектим те, у которых есть wildcard (маска), то есть те, которые отвечают, что поддомен валиден для любого значения.

puredns resolve alterx_resolved.txt
Затем нам нужно удалить все строки, которые содержат домены с маской:

cat alterx_resolved.txt | grep -Ev '(^|\.)image\.finance\.domain\.ru$|(^|\.)links\.news\.domain\.ru$|(^|\.)links\.domain\.ru$|(^|\.)image\.news\.domain\.ru$|(^|\.)image\.moderation\.domain\.ru$|(^|\.)image\.supplier\.domain\.ru$' | anew subdomain_brute.txt
Заносим находки в наш файлик:

cat subdomain_brute.txt | anew domains
Сортируем:

sort -o domains domains
В конце вручную удаляем всякий мусор, который может быть найден случайно.


Ответы по доменам (взаимодействие)​

Чтобы проверять, как откликаются хосты на поддоменах, я использую еще одну утилиту — Для просмотра ссылки Войди или Зарегистрируйся. У ее автора очень много качественного софта. Конкретно эта тулза позволяет проксировать трафик и сохранять ответы от веб‑приложений.

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

info​

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

Команда для установки:

go install github.com/tomnomnom/fff@latest
Пример команды для запуска:

cat subdomains | fff -d 5 -S -o fff_res_subdomain
В ответах мы будем искать новые поддомены.

Начнем с того, что вытащим из ответов все URL. Тут нужно быть повнимательнее и либо использовать утилиту inscope, либо потом вручную проверить поддомены, которые могут быть вне области проведения работ. Я советую делать вручную, поскольку иногда можно наткнуться на что‑то интересное.

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

cat fff_res_subdomain/[I]/[/I].body | grep -oriahE "https?://[^"\'> ]+" | inscope | anew url_fff_subdomain.txt
Далее из списка URL будем собирать поддомены вот такой командой:

cat url_fff_subdomain.txt | grep -oP 'https://\K[^/]+' | anew subdomain_fff.txt
В качестве альтернативы мы могли бы использовать готовую утилиту Для просмотра ссылки Войди или Зарегистрируйся, которая, по сути, будет делать то же самое. Но тут кому что больше нравится.

info​

Кстати, unfurl умеет выводить из тела ответа отдельно пути, параметры, значения или пары параметр — значение. Иногда это может быть полезно при анализе конкретного таргета.
Пример команды для сбора поддоменов:

cat fff_res_subdomain/[I]/[/I].body | unfurl --unique domains | inscope | anew passive_urls

SAN — сертификаты альтернативного имени субъекта (взаимодействие)​

Сертификаты SSL/TLS — это не только основа для обеспечения защищенного соединения, но и ценный источник информации в процессе разведки. С их помощью можно найти поддомены, которые указаны в поле Subject Alternative Name (SAN), а также проверить конфигурацию SSL на целевых серверах.

Почему именно SAN, а не CN?

  • SAN (Subject Alternative Names) — современное поле сертификата, где перечислены все домены и поддомены, для которых сертификат действителен.
  • CN (Common Name) — устаревшее поле, которое использовалось в SSL-сертификатах для указания основного домена. Современные браузеры и TLS-стеки больше не полагаются только на него, если в сертификате указано поле SAN.
Дальше мы рассмотрим однострочник, позволяющий извлечь поддомены из SSL/TLS-сертификатов доменов, указанных в списке. Результат сохраняется в файл для дальнейшего анализа.

Команда следующая:

while read domain; do openssl s_client -connect "$domain:443" 2>&1 < /dev/null | openssl x509 -noout -text | grep -i dns | sed -E 's/DNS://g' | tr -d ' ' | anew subdomain_openssl.txt; done < subdomains
В файле subdomains список поддоменов должен быть без префиксов http:// и https://.

То же самое можно было бы сделать и с помощью утилиты tlsx, которую мы разбирали ранее. Лично мне нравятся однострочники, так как в них лучше видно, что происходит, в сравнении с запуском утилиты.

Еще одна важная тонкость: когда мы использовали tlsx раньше, на вход подавались IP-адреса, принадлежащие компании, а сейчас на входе список поддоменов.


Собираем URL по всем хостам​

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


Katana​

Katana — высокопроизводительный краулер для сбора URL и путей на сайтах.

Стоит отметить, что в версии Для просмотра ссылки Войди или Зарегистрируйся была удалена возможность пассивного сбора URL-адресов из разных источников, поэтому такую возможность выделили в отдельную утилиту Для просмотра ссылки Войди или Зарегистрируйся. Теперь можно либо использовать ее, либо пользоваться katana версии 1.1.0.

Пример работы:

cat subdomains | katana --passive | tee -a url_pas_katana

Gau​

Gau (GetAllUrls) — утилита для получения исторических URL из сервисов архивации вроде Wayback Machine и Common Crawl.

Запустить можно так:

cat subdomains | ~/go/bin/gau | anew url_pas_gau

Waybackurls​

Это простая CLI-утилита для извлечения URL из архива Wayback Machine.

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

cat subdomains | waybackurls | anew url_pas_wayback

Github-endpoints​

Инструмент для поиска чувствительных API-эндпоинтов и URL в открытых репозиториях GitHub.

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

go install github.com/gwen001/github-endpoints@latest
По каждому домену:

while read -r domains; do github-endpoints -d "$domain" -t ~/.config/github_recon/.tokens -o "github_${domain}.txt"; done < subdomains

info​

Если в файле, который подаем на входе, присутствуют префиксы http или https, их необходимо удалить.

Объединяем в один файл:

cat github_url/github_* | anew url_pas_github

Xurlfind3r​

Xurlfind3r — еще один инструмент для сбора URL из публичных источников, фокусируется на скорости и масштабируемости.

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

xurlfind3r -l subdomains --include-subdomains -o url_pas_xurlfinder

Формируем общий список​

На этом этапе нам необходимо слить в один файл результаты работы всех инструментов, собирающих URL. Это поможет в дальнейшем их анализировать и обрабатывать.

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

cat url_* | anew temp_passive_urls
Удалим все ненужные нам расширения (картинки, видео, звук):

cat temp_passive_urls | grep -vEi '\.(png|jpg|jpeg|gif|mp3|mp4|bmp|ico|css|svg|woff|woff2|webp)(\?.*)?$' > temp

Очищаем данные от невалидных​

Утилита Для просмотра ссылки Войди или Зарегистрируйся пройдется по твоему списку и выдаст только интересные URL, отфильтровав дубли и все, что не является гиперссылкой.

cat temp | uro
Но лично мне она не очень понравилась. Я в свое время написал на Python собственный скрипт, который выполняет ту же задачу. Код недлинный, поэтому приведу его здесь целиком. Ты можешь пользоваться как есть или дополнить своими фичами.

Код:
from pprint import pprint
from typing import TypeAlias
from urllib.parse import urlparse, ParseResult

def main():
    with open("temp", "r") as fp:
        lines = fp.readlines()

    lines: list[str] = list(map(lambda x: x.lower(), lines))

    def get_clean_query_params(query):
        query_params: list[str] = []
        for param in query:
            try:
                key, _ = param.split("=", 1)
            except ValueError as e:
                continue
            query_params.append(f"{key}=")
        return query_params

    uniq_urls = []
    url_set = set()

    for line in lines:
        url = line.strip()
        parse_result: ParseResult = urlparse(url)

        query_params_list = parse_result.query.split("&")

        clear_line = f"{parse_result.scheme}://{parse_result.netloc}"
        if parse_result.path != "":
            clear_line += parse_result.path
        if parse_result.query != "":
            clear_line += "?"
            clear_line += "&".join(get_clean_query_params(query_params_list))

        if clear_line not in url_set:
            uniq_urls.append(url)
            url_set.add(clear_line)

    # Сохраняем результат в файл
    with open("uniq_passive_urls.txt", "w") as outfile:
        for url in uniq_urls:
            outfile.write(url + "\n")

    print(f"Сохранено {len(uniq_urls)} уникальных URL в файл 'uniq_passive_urls.txt'.")

if name == "main":
    main()

Этот код читает файл с URL-адресами, и если у них одинаковая схема, протокол, путь и набор параметров, а отличаются они только значениями параметров, то такие URL будут признаваться дубликатами и удаляться.

То есть останутся адреса, у которых есть хотя бы одно отличие в схеме, протоколе, пути или наборе параметров.

В итоге у нас появится файл uniq_passive_urls с уникальными URL-адресами, собранными пассивно из разных источников.


Добавляем домены из URL, полученных в архивах​

Вдруг найдем что‑то новое? Как правило, новый поддомен тут встречается нечасто, но попробовать все же стоит.

Про Для просмотра ссылки Войди или Зарегистрируйся я уже рассказывал выше, так что просто повторю команды:

cat uniq_passive_urls | unfurl --unique domains | anew subdomains
Вариант простой команды:

cat uniq_passive_urls | grep -oP 'https://\K[^/]+' | anew subdomains_passive_url.txt
Настала пора собрать единый список поддоменов, для этого воспользуемся простой командой:

cat subdomain_* | anew subdomains

Обрабатываем список поддоменов и IP (взаимодействие)​

На этом этапе у нас уже должен получиться довольно внушительный список поддоменов, и теперь нам нужно его обработать. Точнее, сделать следующее:

  • собрать живые адреса;
  • посмотреть в целом, что куда резолвится (опционально);
  • зарезолвить домены в IP-адреса и дополнить наш список ip_list;
  • сформировать список потенциальных виртуальных хостов (опционально).

Ищем живые поддомены через публичные DNS​

На этом этапе лучше всего использовать DNS (и утилиту dnsx), поскольку в таком случае работа будет производиться пассивно через публичные DNS без какого‑либо взаимодействия с инфраструктурой заказчика.

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

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

cat subdomains | dnsx -silent -nc -resp -a | tee dnsx_all.txt | awk '{print $1}' | sort -u | inscope | anew live_subdomains.txt && awk '{gsub(/\[A\]|\[CNAME\]|\[|\]/,"")} {print $NF}' dnsx_all.txt | sort -u | anew ip_list_resolved
Мы получаем четыре файла.

dnsx_all.txt​

Его содержимое будет выглядеть примерно так:

Код:
1.example.com [CNAME] [a.example.com]
a.example.com [A] [1.1.2.2]
ab.example.com [A] [1.1.2.2]
222.example.com [A] [2.2.2.4]
333.example.com [A] [2.2.2.4]

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

dnsx_live_subdomain.txt

Это файл с живыми поддоменами, которые резолвятся в IP-адреса через публичные DNS.

ip_list

Здесь список IP-адресов — с ним все понятно. Единственное, что хочу добавить: для его составления есть альтернатива в виде такой команды:

cat subdomains | while read domain; do dig +short "$domain" | anew ip_list.txt; done
Однако я предпочитаю описанный выше вариант, так как он просто более информативен.

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

cat live_subdomains.txt domains ip_list | anew for_passive_ports
Эти списки (домены, живые поддомены и IP-адреса) мы объединяем для того, чтобы результаты сканирования были более полными. Тут нужно понимать, что универсального решения нет: либо мы получаем неполное покрытие, либо покрытие будет максимальным, но с некоторым количеством дубликатов. На мой взгляд, второй вариант предпочтительнее.

potential_vhost.txt

Можно еще поискать IP-адреса, в которые резолвятся разные домены. Это может служить маркером наличия виртуальных хостов.

awk '{gsub(/\[A\]|\[|\]/,"")} {ips[$NF] = ips[$NF] ? ips[$NF] ", " $1 : $1} END {for (ip in ips) if (split(ips[ip], arr, ", ") > 1) print ip ": " ips[ip]}' dnsx_resolved_with_ip.txt | sort -u > potential_vhost.txt

Пассивно смотрим открытые порты​

Если нам нужна полная тишина, то для сканирования портов нам подойдет Для просмотра ссылки Войди или Зарегистрируйся.

Команда для запуска:

smap -iL for_passive_ports -sV -oN smap
Как вариант можно использовать Для просмотра ссылки Войди или Зарегистрируйся в пассивном режиме.

info​

Naabu сам по себе сканирует список целей и выводит информацию в формате iport. Он умеет работать в активном или в пассивном режиме, но учти, что если добавить флаг nmap-cli, то запускаемый Nmap уже будет активничать независимо от того, какой режим выбран у Naabu.
Лично я предпочитаю на проектах по пентесту использовать связку из Naabu и Nmap, так как цели как‑то особенно спрятаться обычно нет, а дополнительная информация будет очень полезна.

Команда для запуска:

naabu -list for_passive_ports -passive -silent -verify -ec -nmap-cli "nmap -sV -oA nmap-naabu-passive" -o naabu-passive.txt
Чтобы было удобнее просматривать результаты Nmap, можно сконвертировать XML в HTML с помощью утилитки xsltproc:

xsltproc nmap-naabu-passive.xml -o nmap-naabu-passive.html
В итоге получим довольно красивый и неплохо читаемый HTML-документ c перечислением портов и работающих на них сервисов.


Пассивный поиск багов​


Google Dorks (взаимодействие)​

Помнишь, в самом начале у нас был файл urls_dorks.txt? Дорки, настало ваше время!

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

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

Вот, например, дорк для поиска документов (в них могут быть креды и полезные ссылки, например для регистрации):

site:domain.ru (ext:pdf OR ext:doc OR ext:docx OR ext:zip OR ext:bak OR ext:txt OR ext:ppt OR ext:pptx OR ext:xls OR ext:xlsx)

Секреты GitHub​

Поиск секретов мы начнем с обнаружения репозиториев, принадлежащих компании или, например, каким‑то сторонним разработчикам, имеющим отношение к исследуемой цели. Поэтому в продолжение темы с Google Dorks воспользуемся таким дорком:

site: "github.com" + "domain.ru" + password
Искать захардкоженную чувствительную информацию будем с помощью всем известной утилиты Для просмотра ссылки Войди или Зарегистрируйся.

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

Команда для установки:

curl -sSfL [URL]https://raw.githubusercontent.com/trufflesecurity/trufflehog/main/scripts/install.sh[/URL] | sudo sh -s -- -b /usr/local/bin
Пример команды для запуска по всем репозиториям:

sudo trufflehog github --org=name-org --results=verified,unknown
Здесь --org=name-org — имя организации (репозитория).

Пример ответа
Как видишь, мы узнали:

  • учетные данные;
  • внутренние адреса компании;
  • email-адреса сотрудников.

Leakix.net​

У сервиса Для просмотра ссылки Войди или Зарегистрируйся есть довольно большой список бесплатных Для просмотра ссылки Войди или Зарегистрируйся, с помощью которых можно неплохо протестировать наш скоуп. Также предоставляется API с ограничением на 3000 запросов в месяц.

Вот так можно Для просмотра ссылки Войди или Зарегистрируйся:

[URL unfurl="true"]https://leakix.net/search?scope=leak&q=%2Bexample.com[/URL]
Для просмотра ссылки Войди или Зарегистрируйся
А вот так — использовать сервис из командной строки, передав ему список IP:

while IFS= read -r target; do target=$(echo "$target" | tr -d '\r'); curl -H 'api-key: api' -H 'accept: application/json' "[URL]https://leakix.net/search?scope=leak&page=0&q=+$target[/URL]" | anew $target.json; sleep 2; done < ../ip_list
Ответ уже парсим, как захотим.

У сервиса качественная документация, поэтому советую ее изучить. Например, чтобы собрать не утечки, а просто известные активы, можно заменить значения параметра scope и вместо leak запросить service.

Однако сервис выдает маловато информации. Явно можно лучше!


Shodan и nrich​

Помнишь, что у нас уже есть собранный список IP-адресов? Можем быстренько просмотреть их при помощи Shodan на предмет известных уязвимостей.

Тут нам поможет инструмент командной строки Для просмотра ссылки Войди или Зарегистрируйся. Он позволяет анализировать IP-адреса, перечисленные в файле, и выявлять те, где есть открытые порты, а на них работают уязвимые сервисы.

info​

Nrich также может получать данные из stdin — удобно для использования в пайплайнах.
Скачиваем и устанавливаем nrich:

wget [URL]https://gitlab.com/api/v4/projects/33695681/packages/generic/nrich/latest/nrich_latest_x86_64.deb[/URL]
sudo dpkg -i nrich_latest_x86_64.deb
Запускаем:

nrich ip_list | anew nrich_res
В качестве аналога можно использовать Для просмотра ссылки Войди или Зарегистрируйся (пример запуска и результатов работы — по той же ссылке). По сути, он работает так же и берет информацию из Shodan с помощью CVEDB API. Какая из утилит дает более точные результаты, я не знаю и обычно запускаю обе.

В целом все то же самое можно сделать и с помощью одной строчки на Bash.


Работа с заголовками​

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

Посмотреть, какие в целом есть заголовки, можно такой командой:

find fff_res/[I]/[/I].headers -type f | fzf --preview 'less {}'
Для просмотра ссылки Войди или Зарегистрируйся

Заголовки, комментарии, атрибуты​

Еще одно интересное, на мой взгляд, решение для работы в терминале — это утилита Для просмотра ссылки Войди или Зарегистрируйся.

Команда для установки:

go install github.com/tomnomnom/hacks/html-tool@latest
Данная тулза позволяет нам просматривать заголовки:

find fff_res/[I]/[/I].body -type f | html-tool tags title | sort | bat
Также можно смотреть комментарии:

find [I]/[/I]/*.body -type f | html-tool comments | sort | uniq | bat
Для просмотра ссылки Войди или Зарегистрируйся
Атрибуты:

find [I]/[/I]/*.body -type f | html-tool attribs src href | sort | bat

Программное обеспечение сервера​

Поискать, какие технологии используются, можно такой командой:

find [I]/[/I]/*.body -type f | grep -Hnr "\(Powered\|Server\)"
Для просмотра ссылки Войди или Зарегистрируйся
А вот команда для просмотра уникальных заголовков Server и Powered-by:

find fff_res -name "*.headers" -exec grep --color -Hr "\(Powered\|Server:\)" {} + | awk -F : '{print $3}' | uniq
Для просмотра ссылки Войди или Зарегистрируйся
Если нужно посмотреть URL, где мы получили интересующие нас заголовки, выполним команду ниже и в строке поиска поищем нужный заголовок:

fd . --threads 48 -t f -e headers -X grep --color -n "\(Powered\|Server\)" {} | fzf --ansi --delimiter : --preview "batcat --color=always --theme zenburn --highlight-line {2} --line-range={2}:-25 --line-range={2}:+25 {1} | fold -s -w 200"
Для просмотра ссылки Войди или Зарегистрируйся

Собираем UUID​

Поискать разные ID можно такой командой:

grep -Eo '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}' live_passive_url | sort -u | anew UUID.txt
Вдруг найдем IDOR!


Поиск конфиденциальной информации​

Вытаскиваем все ссылки на файлы с данными, настройками, запросами и прочими форматами, где может быть что‑то интересное:

grep -Eo 'https?://[^ ]+\.(env|yaml|yml|json|xml|log|sql|ini|bak|conf|config|db|dbf|tar|gz|backup|swp|old|key|pem|crt|pfx|pdf|xlsx|xls|ppt|pptx)' live_passive_url
Возможно, здесь можно что‑то автоматизировать, но я предпочитаю смотреть результаты вручную.


Итоговая структура файлов и директорий​

Давай посмотрим, какая информация будет у нас в результате выполнения всего воркфлоу.

Для просмотра ссылки Войди или Зарегистрируйся
Я выделил те файлы, которые могут быть нам полезны в дальнейшем.


Выводы​

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

Мы получили доменные имена, IP-адреса, URL, электронные почты, а также изучили утекшие учетные данные, данные из Google и различных онлайновых сервисов на предмет потенциальных уязвимостей.

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

Собранная информация поможет нам в дальнейшем анализе внешней инфраструктуры. К концу этого этапа у нас сформировалось базовое представление о цели, и оно станет основой для следующих шагов — активной разведки и самого тестирования уязвимостей.

В заключение хочу выразить благодарность сообществу, которое пишет, собирает и документирует все те замечательные утилиты, которыми мы с тобой можем пользоваться.
 
Activity
So far there's no one here