Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Пассивная разведка позволяет собрать данные о цели с минимальными рисками обнаружения. Это важный этап в пентестах и прочих offensive-проектах. Эта статья — пошаговое руководство от сбора доменов, IP-адресов и утекших данных до поиска уязвимостей. Имея перед глазами четкий план действий, можно эффективнее готовиться к следующим этапам.
На просторах интернета — как в русскоязычном сегменте, так и в иностранном — очень много крутых материалов, однако я не находил универсальных пошаговых инструкций, которые охватывали бы весь процесс от начала и до конца, особенно в части проведения активной и пассивной разведки на этапе формирования поверхности атаки.
Поэтому я попытался выстроить универсальный рабочий процесс, который мог бы как‑то унифицировать базовые проверки. Точнее, настолько универсальный, насколько это возможно.
Я постарался сделать статью понятной и интересной для специалистов с любым уровнем и бэкграундом. Я добавлял в воркфлоу такие проверки, которые, на мой взгляд, необходимо проводить почти на любом проекте — будь то Red Team, пентест или анализ защищенности.
Конечно, любой воркфлоу будет сильно зависеть от того, какие данные есть на начальном этапе. Например, если это анализ защищенности конкретного веб‑приложения, то алгоритм действий один, а если пентест, на котором нам ничего не известно, кроме названия компании или основного домена, то другой.
Я старался исходить из того, что на старте нам известен самый минимум. Если в твоей задаче есть какие‑то другие вводные данные и, например, список доменов уже известен, то просто пропускай до нужного места.
Наши методы и сценарии будут по возможности пассивными, но среди них могут попадаться и подразумевающие какое‑то минимальное взаимодействие. Об этом я буду предупреждать сразу же — пометкой «взаимодействие» на случай, если тебе нужно полное отсутствие активных действий.
Поскольку мы будем использовать в подавляющем большинстве случаев консольные утилиты, нам нужно хранить полученную информацию так, чтобы в ней не запутаться. На первый взгляд это кажется легкой задачей, а на деле зачастую возникает путаница. Так как у нас цикл статей, я решил вместо общей структуры показать пример возможного варианта в конце каждого пройденного этапа.
Разумеется, в идеальном мире все это будет автоматизировано и станет храниться непосредственно в базе данных, откуда информация подгружается на красивые дашборды… Но мы не в идеальном мире, поэтому продолжим работать в привычном формате.
Здесь я кратко опишу часто используемые утилиты. Некоторые из них малоизвестны, поэтому неплохо будет сказать пару слов о том, как и для чего они применяются:
stdin
; Для inscope нужно создать в корневом каталоге проекта файлик .scope
примерно с таким содержимым:
.*.example.com$ ^example.com$
Глобально на этапе пассивной разведки перед нами стоят следующие цели:
Обычно перед стартом работ я делаю несколько простых шагов, которые никак не связаны с общим процессом. Делаются они исключительно для того, чтобы получить начальное представление о цели. Первыми они идут условно — их можно и нужно проводить повторно, когда будет больше информации.
Свое первое знакомство с таргетом я предпочитаю начинать с беглого взгляда на цель с помощью специально заготовленной JavaScript‑закладки. Она выводит список уникальных адресов, найденных на текущей странице.
info
Букмарклет — это фрагмент кода на JavaScript, сохраненный в виде закладки браузера. Если нажать на него, он запустится на текущей веб‑странице и что‑то сделает. Это никак не триггерит целевую систему: по сути, мы просто один раз зашли на страницу, как сделал бы любой легитимный клиент.
Вот код букмарклета:
javascript:(async 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>`})();
Как установить и использовать этот букмарклет:
Результат запуска
В продолжение знакомства с целью мы можем использовать онлайновые сервисы для поиска информации о сайте:
Этот этап занимает немного времени, но уже на нем ты познакомишься с целью и потенциально выявишь такие уязвимости, как, например, 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]/_/g"); echo "Starting EmailHarvester for $domain"; python3 EmailHarvester.py -d "$domain" -s "email_${target_name}.txt"; done < ~debian/Desktop/scope)
Думаю, все знают такой ресурс для IT-специалистов, как LinkedIn. С его помощью мы можем спарсить email-адреса сотрудников интересующей нас компании. Ниже приведен пример работы неплохой утилиты CrossLinked, которая справляется с этой задачей (и, кстати, не требует ни учетной записи, ни API-ключа).
Пример команды для запуска:
python3 crosslinked.py -f '{first}.{last}@example.ru' "Рога и Копыта"
Тут я предлагаю сделать небольшую паузу и обратить внимание на то, что у нас уже есть на данный момент:
В этом разделе и далее мы начнем заниматься, как сейчас модно говорить, Attack Surface Managed. Пришло время приступить к сбору активов исследуемой компании и формированию поверхности атаки.
Бывают ситуации, когда заказчик не предоставляет полный список поддоменов компании. Тогда нам нужно самостоятельно найти домены, связанные с нашим таргетом. В этом может помочь довольно известный онлайновый сервис whoxy.com, который предоставляет много полезной информации как напрямую, так и косвенно по исследуемой цели.
Скажу сразу, что, несмотря на мою любовь к CLI, этот метод мне не очень понравился, так как приходится перепроверять валидность большого объема информации. Вдобавок необходимость поиска TLD (Top Level Domain) в рамках проектной деятельности встречается довольно редко. Но все же утилита tldfinder стоит упоминания.
Пример команды:
tldfinder -d google -dm tld | anew domains
Я, впрочем, предпочитаю whoxy.com.
Именно на этом этапе формируется файл scope. В него мы помещаем либо домены, относящиеся к компании, либо домены, предоставленные заказчиком. Это важно для дальнейшей работы.
Источник: xakep.ru