Sacándole jugo al router por ssh
De una forma sencilla y sin mucha complicación podemos ejecutar scripts y comandos interesantes de manera remota en un router por ssh.
Basta con generar las claves pública y privada de cifrado y configurar la clave pública en el router.
He hecho un pequeño script que puede resultar interesante, personalmente lo he metido en una carpeta configurada en el path y lo he llamado r.bat, de esta manera, tan solo tengo que pulsar inicio+R y después r + letra
Las distintas funcionalidades (argumentos) que tiene son:
<a> mira la tabla arp del router
<s> mira la velocidad de bajada y subida que le llega al router (solo compatible con ciertos routers)
<w> con una lista blanca de direcciones MAC, avisa de las macs desconocidas que haya en la red
<dns> ve las peticiones dns de todos los usuario (solo peticiones no encriptadas)
<pass> muestra contraseñas de la red enviadas en texto plano (ftp,http,smtp…)
<arpr> muestra peticiones arp en vivo para ver si hay ataques de spoofing
<r> reinicia el router (esta es la opción que más uso, ya que con solo poner r r en ejecutar de windows nos evita tener que abrir el navegador, loguear y reiniciar el router.
<sin argumentos> inicia una terminal putty para poder enviar todos los comandos que quieras de manera interactiva.
<argumento no definido> ejecuta el comando enviado como argumento
Esto lo conseguimos con la herramienta plink de putty, que nos permite hacer conexiones directas por ssh para ejecutar comandos sin necesidad de crear una conexión interactiva.
El comando que se usa es: plink.exe -i admin@
Aquí os dejo el script:
@echo off REM plink.exe -i P:\Documents\Downloads\routerAsus\sshKeys\pri.ppk admin@192.168.1.1 COMANDO set router_folder=P:\Documents\Downloads\routerAsus set private_key=%router_folder%\sshKeys\pri.ppk set plink=plink.exe -no-antispoof IF "%1"=="arp" ( REM mira la tabla arp del router set command=/sbin/arp ) ELSE IF "%1"=="a" ( REM mira la tabla arp del router set command=/sbin/arp ) ELSE IF "%1"=="s" ( REM mira la velocidad de bajada/subida y la tabla arp del router set command=-m %router_folder%\scripts\status.txt ) ELSE IF "%1"=="w" ( REM con una lista blanca avisa si alguien desconocido está conectado a la red set command=-m %router_folder%\scripts\arpwhitelist.txt ) ELSE IF "%1"=="dns" ( REM a la escucha de peticiones dns (si son encriptadas no las mostrará) set command=/userfs/bin/tcpdump -i br0 -n dst port 53 ) ELSE IF "%1"=="pass" ( REM muestra contraseñas de la red enviadas en texto plano (ftp,http,smtp...) set plink=start putty.exe set command=-m %router_folder%\scripts\tcpdumppass.txt ) ELSE IF "%1"=="arpr" ( REM muestra peticiones arp para ver si hay ataques de spoofing set command=/userfs/bin/tcpdump -i br0 -n arp ) ELSE IF "%1"=="r" ( REM reinicia el router set command=/sbin/reboot ) ELSE IF "%1"=="" ( REM ssh al router (para una sesion interactiva funciona mejor putty) set plink=start putty.exe set command= ) ELSE ( REM si es cualquier otro argumento, lo ejecuta como comando en el router set command=%1 ) %plink% -i %private_key% admin@192.168.1.1 %command% if not "%command%"=="" pause
Las opciones <dns>, <pass> y <arp> solo funcionarán si el router soporta tcpdump, el archiconocido sniffer que tiene posibilidades infinitas en cuanto a escucha de la red.
Aquí podemos ver la opción <dns> en funcionamiento.
Arriba una consola de máquina virtual haciendo pings a distintas direcciones (que podrían haber sido conexiones del navegador a esas páginas webs)
Y debajo en la máquina física habiendo ejecutado r dns en inicio+ejecutar se pone en marcha el sniffer del router a la escucha de peticiones dns.
Añado aquí los txt que ejecuta el script:
arpwhitelist.txt
Este script (adjunto debajo) es el que llama nuestro bat superior en la opción y que se ejecutará en el router como un script unix.
Arriba añadiremos las MACs conocidas, y al ejecutar cada 10 segundos nos reportará si hay alguna mac que no sea ninguna de esas conectada a nuestra red.
WHITELIST="" WHITELIST="${WHITELIST} 00:00:23:43:00:33" # desktop WHITELIST="${WHITELIST} 11:D1:11:33:CA:22" # laptop WHITELIST="${WHITELIST} 22:9D:22:22:A5:11" # bq WHITELIST="${WHITELIST} 33:11:29:2B:33:00" # vmware ubuntu while true do echo -e '\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n' arpcmd=`/sbin/arp -a | awk -F 'at ' '{print $2}' | awk -F ' ' '{print $1}'` macsonline=`echo $arpcmd | wc -w` WHITELISTMACS=`echo $WHITELIST | wc -w` if test $macsonline -ge 1 then FOUNDUNKNOWN=0 for i in $(seq 1 $macsonline) do UNKNOWNMAC=1 for j in $(seq 1 $WHITELISTMACS) do if test `echo $arpcmd | cut -f$i -d" "` == `echo $WHITELIST | cut -f$j -d" "` then UNKNOWNMAC=0 fi done if test $UNKNOWNMAC -gt 0 then /sbin/arp -a | grep `echo $arpcmd | cut -f$i -d" "` FOUNDUNKNOWN=1 fi done if test $FOUNDUNKNOWN -lt 1 then echo "all devices are known ->$macsonline online from whitelist" fi fi sleep 10 done
status.txt
Como dije antes, este solo es compatible con algunos routers. Cada 10 segundos nos muestra la velocidad de subida y bajada que le llega al router.
while true do echo -e '\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n' printf "Download rate: " /userfs/bin/tcapi get Info_Adsl DataRateDown printf "Upload rate: " /userfs/bin/tcapi get Info_Adsl DataRateUp echo -e '\n' /sbin/arp -a sleep 10 done
tcpdumppass.txt
Si nuestro router soporta tcpdump podremos ver todas las contraseñas no encriptadas que circulan por la red sin necesidad de servidores proxy intermedios ni ataques man in the middle.
/userfs/bin/tcpdump -i br0 -n port http or port ftp or port smtp or port imap or port pop3 or port telnet -l -A | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user '
Esto nos debería hacer replantearnos el usar protocolos nada seguros como el FTP, o conectarnos a webs que no tienen certificado HTTPS activo.
Instrucciones de configuración de claves para que funcione el script:
=> Generar las claves con puttygen (herramienta de putty)
=> En el router introducir clave pública en una sola línea (pegar directamente la que genera puttygen)
=> En el script usaremos la clave privada PPK generada que usará putty o plink para la ejecución remota de comandos sin necesidad de contraesñas.