Sunday, October 25, 2009

The ultimate Pen-tester Ninja tool

No puedo explicar lo contento que estoy, luego de dos dias de trabajo logre convertir mi ahora amado SheevaPlug, en una herramienta de pentesting digna de un Ninja.

Fueron dos noches de trabajo hasta altas horas de la madrugada, de hecho hoy me fui a la cama cerca de las 6AM, pero el esfuerzo valio la pena.

Esta imagen es el resultado :


El sheevaplug ahora tiene una interfaz Wifi conectada al port USB. Haciendo un poco de bricolaje quedo asi :



Ustedes pensaran, conectar una placa Wifi usb y pegarle un velcro al sheevaplug no es mucho trabajo. El problema es que el equipo viene con un kernel Linux y módulos que no estan preparados para reconocer interfaces inalámbricas.

Esto me obligo a generar un kernel y los módulos para el modelo de placa que tenia en casa, una vieja Linksys WUSB54G v.4, las cuales traen un chipset ralink 2570.

A ver...como decirlo...Si el kernel es el cerebro de un Sistema Operativo, generar un nuevo kernel es como hacer una neurocirugía, pero en este caso con la dificultad adicional que el cerebro a operar, debe estar fuera del paciente !!! Esto debido a que sheevaplug tiene un procesador ARM diferente a la arquitectura x86 de los equipos de escritorio y compilarlo en el mismo dispositivo es muy engorroso.

Habia dos posibilidades, transformar el equipo en esto :

o romperme la cabeza y recibir mi cinturón Azul en el dojo Linux.
Pasos necesarios para compilar un nuevo kernel para Sheevaplug


En este blog >NIL:'s Techno Feats hay un excelente tutoríal, en el cual me base para compilar el nuevo kernel. Yo voy a hacer un copy&paste del mismo, agregando acotaciones sobre posibles problemas que pueden aparecer y que me ocurrieron.

La compilación se puede hacer directamente en el dispositivo, lo cual tiene entre otros inconvenientes, la lentitud dado el poder de procesamiento del equipo y la falta de espacio. Por lo tanto una opción recomendable es instalar un cross-compiler. Es decir un equipo que genera código para un procesador diferente al del equipo en el cual se ejecuta.

Como referencia, mi equipo un AMD Phenom(tm) II X4 940 con 8GB demora un minuto, según el blog anterior, esto demora 57 minutos en un sheevaplug.

Como se ve en el gráfico anterior el primer paso es instalar el compilador, este fue uno de los puntos mas complicados.

Instalar Crosstol-NG

Importante : Antes de comenzar es recomendable verificar el espacio libre si tienen un filesystem para /usr.
cd /usr/src
mkdir sheeva
cd sheeva
wget http://ymorin.is-a-geek.org/download/crosstool-ng/crosstool-ng-1.4.2.tar.bz2
tar -xjvf crosstool-ng-1.4.2.tar.bz2
cd crosstool-ng-1.4.2
./configure
make
make install
ct-ng menuconfig
Se nos abre un menu como el utilizado en el momento de compilar un kernel. Aquí definimos las opciones referentes al procesador ARM.
Siguiendo el tutoríal

  • Paths and misc options
    • Try features marked as EXPERIMENTAL: check
    • Prefix directory: "/usr/local/${CT_TARGET}" (this will result in all the tools residing in /usr/local/arm-unknown-linux-gnueabi) or, preferred: "/usr/local/sheeva"
    • Use LAN mirror: Let's try to use a mirror there, so - check
      • Prefer the mirror: check
      • Base URL: ftp://ftp.heanet.ie/mirrors/ftp.gnu.org/gnu/ (this is an Irish mirror - not entirely sure it works, as the downloads didn't seem much faster, but worth a try)
    • Stop after extracting tarballs: check (we'll need to patch glibc!)
    • Number of parallel jobs: 2x the number of cores you have. In my case that would be 8 (quad core)
    • Maximum log level to see: change from "INFO" to "EXTRA"
  • Target Options
    • Target Architecture: arm
    • Use EABI: check
    • Emit assembly for CPU: arm926ej-s
    • Floating point: change from "hardware (FPU)" to "software"
  • Toolchain options: don't change anything
  • Operating System:
    • Target OS: change from "bare-metal" to "linux"
    • Get kernel headers from: change from "kernel's 'headers_install'" to "Use custom headers"
    • Path to custom headers directory/tarball: "/usr/src/sheeva"
  • GMP and MPFR:
    • GMP and MPFR: check
    • GMP version: 4.2.4 (latest)
    • MPFR version: 2.4.1 (latest)
  • binutils
    • binutils version: 2.19.51.0.2
  • C compiler:
    • gcc version: 4.3.3
    • C++: check
  • C-library:
    • C library: glibc
    • glibc version: 2.9
    • Threading implementation to use: make sure "ntpl" is set.


Descargar código fuente

Para descargar el código fuente, utilice la herramienta GIT, el cual crea una copia del arbol con los fuentes del kernel.

Hay tres fuentes :
Feroceon, corresponde al kernel que viene originalmente con el equipo ( 2.6.22.18)
Orion, es el código fuente mantenido por Marvell y contiene las ultimas actualizaciones respecto a Sheevaplug.
kernel.org son los fuentes oficiales de Linux y donde se encuentran actualizaciones y código para nuevos drivers.

Preferí trabajar con el código fuente de Marvell, aunque supuestamente en este momento no hay diferencias con el arbol de kernel.org.

Cree un directorio dentro de mi home llamado sheeva y allí descargue el código.

git clone git://git.marvell.com/orion.git

Luego el siguiente paso fue generar los headers :

make headers_install ARCH=arm INSTALL_HDR_PATH=/usr/src/sheeva
El directorio debe coincidir con el ingresado al momento de configurar Crosstol-NG.


Construir el Cross-Compiler

Ya estamos en condiciones de generar el compilador
cd /usr/src/sheeva
ct-ng build
Importante : En mi caso durante este paso encontré varios problemas que no estaban referencia-dos en el post en el cual me base para el trabajo.

Afortunadamente encontré la pagina de un chino que tenia casi los mismos errores que me habian ocurrido a mi, pero con las soluciones.

Link a la pagina y un par de ejemplos :

用crosstool-ng建立arm-linux 4.3.2 交叉工具链


2.
[ERROR] Build failed in step 'Retrieving needed toolchain components' tarballs'
[ERROR] Error happened in '/opt/crosstool-ng/lib/ct-ng-1.4.1/scripts/functions' in function 'CT_DoExecLog' (line unknown, sorry)
[ERROR] called from '/opt/crosstool-ng/lib/ct-ng-1.4.1/scripts/functions' at line # 471 in function 'CT_GetCVS'
[ERROR] called from '/opt/crosstool-ng/lib/ct-ng-1.4.1/scripts/build/libc/glibc.sh' at line # 31 in function 'do_libc_get'
[ERROR] called from '/opt/crosstool-ng/lib/ct-ng-1.4.1/scripts/crosstool-NG.sh' at line # 449 in function 'main'
[ERROR] Look at '/home/star/x-tools/arm-unknown-linux-gnueabi/build.log' for more info on this error.
[ERROR] (elapsed: 33:29.56)
[33:30] / make[1]: *** [build] 错误 127
make: *** [build.4] 错误 2

Solucion : 解决: sudo apt-get install cvs

[ALL ] /usr/bin/install: cannot stat `/tmp/crosstool-ng/targets/arm-unknown-linux-gnueabi/build/build-libc-headers/gnu/li
b-names.h': No such file or directory
但在这之前也发生了一个error,但crosstool-ng并没有报错
[ALL ] mawk: scripts/gen-sorted.awk: line 19: regular expression compile failed (bad class -- [], [^] or [)
[ALL ] /[^
[ALL ] mawk: scripts/gen-sorted.awk: line 19: syntax error at or near ]
[ALL ] mawk: scripts/gen-sorted.awk: line 19: runaway regular expression /, "", subd ...
OK,在gen-sorted.awk第19行,出错,这是一个简单的错误,缺少了转义符
查找一个看有没有类似的  
cd /tmp/crosstool-ng/targets/src/glibc-cvs-2.9/scripts 
 sed '/\^\//p' gen-sorted.awk -n
 输出的则是存在语法错误的语句
 可以直接用
 sed -i 's/\^\//\^\\\//g' gen-sorted.awk
这种方法是不完善的,后面的还是会出现错误。
 网上搜了下,需要用/usr/bin/gawk 替换/usr/bin/mawk,即

Solucion :

sudo apt-get install gawk
cd /usr/bin
sudo mv mawk mawk.bak
sudo ln -s gawk mawk

Si todo sale como corresponde la compilacion luego de superados los errores tomara unos 13 minutos.

Terminada estaremos en condiciones de tener la herramienta para generar el codigo binario para procesadores ARM.

Instalando U-boot mkimage

Esta herramienta transformara el kernel generado en algo que pueda entender el bootloader de sheevaplug.

cd /usr/src/sheeva
wget http://ftp.de.debian.org/debian/pool/main/u/uboot-mkimage/uboot-mkimage_0.4.tar.gz
tar -xzvf uboot-mkimage_0.4.tar.gz
make
make install

Cross-Compiling el nuevo kernel

Ademas de el tutorial en el cual me baso para este post, hay dos guias mas para compilar el kernel :

Guia de compilacion Openplug

Guia de compilacion de Computingplugs

Nos movemos al directorio donde tenemos el codigo fuente del nuevo kernel :
( en este caso donde lo descargamos )
cd /usr/src/sheeva/linux-2.6.31.2
make ARCH=arm kirkwood_defconfig
make ARCH=arm menuconfig

Aquí seleccionamos las opciones que mas nos interesen, en mi caso :

OpenVPN requiere un dispistivo TUN

Device Drivers --> Network Device Support -->Universal TUN/TAP device driver support

El modulo para las el chipset Ralink

Device Drivers --> Network Device Support --> Wireless LAN--> Wireless LAN (IEEE 802.11) --> Ralink driver support --> Ralink rt2500 (USB) support


Luego de preprar la configuracion del futuro kernel, podemos iniciar la generacion del mismo.

make -j8 ARCH=arm CROSS_COMPILE=/usr/local/sheeva/bin/arm-unknown-linux-gnueabi- uImage

Luego de un par de minutos, la compilacion terminara con las siguientes lineas :

Image Name: Linux-2.6.32-rc4-00002-gfc03f4e
Created: Mon Oct 26 01:01:56 2009
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2268072 Bytes = 2214.91 kB = 2.16 MB
Load Address: 0x00008000
Entry Point: 0x00008000
Image arch/arm/boot/uImage is ready

Construir los modulos

Ya tenemos el kernel, nos queda construir los modulos que elegimos generar, los cuales deben ser copiados al directorio /lib/modules del sheevaplug.

make -j8 ARCH=arm CROSS_COMPILE=/usr/local/sheeva/bin/arm-unknown-linux-gnueabi- modules
make -j8 ARCH=arm CROSS_COMPILE=/usr/local/sheeva/bin/arm-unknown-linux-gnueabi- INSTALL_MOD_PATH=./modules modules_install

Conectarse al puerto serie

Para poder instalar el nuevo kernel, es serie acceder al puerto serie del Sheevaplug.

En este link se explica como conectarnos desde diferentes sistemas operativos, aqui yo voy a referirme a Linux.

Conectamos el conector MiniUSB al equipo y el terminal USB a un puerto de nuestra PC.
Ejecutamos el comando dmesg y observamos la salida del comando, si el puerto es reconocido veremos :

 ftdi_sio 1-1:1.0: FTDI USB Serial Device converter detected
drivers/usb/serial/ftdi_sio.c: Detected FT2232C
usb 1-1: FTDI USB Serial Device converter now attached to ttyUSB0
ftdi_sio 1-1:1.1: FTDI USB Serial Device converter detected
drivers/usb/serial/ftdi_sio.c: Detected FT2232C
usb 1-1: FTDI USB Serial Device converter now attached to ttyUSB1

Si no aparecen los mensajes anteriores, ejecutamos como root

rmmod ftdi_sio
modprobe ftdi_sio vendor=0x9e88 product=0x9e8f

Si esto funciona, ahora podemos conectarnos por medio de uno de los siguientes programas

CU
chown uucp /dev/ttyUSB1
cu -s 115200 -l /dev/ttyUSB1

Putty



Flashing el nuevo kernel en Sheevaplug

Copiamos el nuevo kernel a un Pendrive USB

mount /dev/sde1 /mnt/usb
cp arch/arm/boot/uImage /mnt/usb/
sync
umount /mnt/usb


Insertamos el Pendrive en el conector USB del SheevaPlug y lo reiniciamos ( debemos hacer esto mientras tenemos una conexion serial al equipo ).
Al momento de reiniciar, presionamos cualquier tecla e ingresamos los siguientes comandos en el prompt Marvell.

Debemos tener cuidado de ingresar los parametros correctos en los comandos nand erase y nand write.
Marvell>> usb start
(Re)start USB...
USB: scanning bus for devices... 2 USB Device(s) found
scanning bus for storage devices... 1 Storage Device(s) found
Marvell>> fatload usb 0 0x00800000 uImage
reading uImage
...................................................................................................................................................................................................................................................................................................................

3152056 bytes read
Marvell>> nand erase clean 0x00100000 0x00400000

NAND erase: device 0 offset 0x100000, size 0x400000
Erasing at 0x4e0000 -- 100% complete. Cleanmarker written at 0x4e0000.
OK
Marvell>> nand write.e 0x00800000 0x00100000 0x00400000

NAND write: device 0 offset 0x100000, size 0x400000

Writing data at 0x4ff800 -- 100% complete.
4194304 bytes written: OK
Marvell>> reset

Al reiniciar estaremos en condiciones de trabajar con el nuevo kernel.


Configurando WiFi en SheevaPlug


Para la configuracion de la interfaz inalambrica necesitaremos las siguientes herramientas.

wireless-tools,
wpasupplicant

Ejecutamos dmesg | grep rt2500 para verificar si cargo el driver.

Registered led device: rt2500usb-phy0::radio
Registered led device: rt2500usb-phy0::quality
usbcore: registered new interface driver rt2500usb

lsmod nos indicara si el modulo correspondiente esta cargado

root@ubuntu:~# lsmod
Module Size Used by
rt2500usb 15396 0
rt2x00usb 6430 1 rt2500usb
rt2x00lib 23252 2 rt2500usb,rt2x00usb


Luego de verificar esto, podemos configurar la interfaz en el archivo

/etc/networks/interfaces

Agregamos las siguientes lineas, reemplazando los valores correspondientes a wpa-ssid y wpa-psk

auto wlan0
iface wlan0 inet dhcp
wpa-ap-scan 1
wpa-scan-ssid 1
wpa-ssid xxxxxxx
wpa-psk xxxxxxx

Para levantar o bajar la interfaz utilizaremos los comandos

ifup wlan0

ifdown wlan0


Teniendo ya la plataforma lista, podemos incorporar herramientas de pentesting.

Ya estamos en condiciones de infiltrarnos y dejar este dispositivo capturando trafico de una red y enviándonos los resultados a un dispositivo que se encuentre fuera de las oficinas.

Solo nos falta el disfraz de Ninja.

6 comments:

E. Segura said...

Menudo problema el que te has tirado. Felicitaciones.

Gabolonte Blasfemus said...

Fabuloso, me imagino la sensación de satisfacción al terminarlo y tenerlo andando. Excelente post y tutorial!

Julio Jaime said...

Gracias, realmente para mi fue un desafío, mas que nada enfrentarte a un error que no esta comentado en el tutoríal y poder encontrar la solucion.

Christophe said...

Bravo Julio, muy impresionante !
saludos,

Anonymous said...

madre mia... un monumento para usted!

Julio Jaime said...

You are welcome.