Compilar madwifi para injectar paquetes con el chipset AR5008 de atheros en Ubuntu 9.04 (Jaunty)

1-Pasos rápidos (Todo está explicado en detalle en el siguiente punto)

  • SO:  Ubuntu 9.04 jaunty (ejecuta el comando lsb_release -a para obtenerla)
  • Tarjeta wifi: Atheros Communications Inc. AR5008 Wireless Network Adapter (rev 01) (ejecuta el comando lscpi)
  • Kernel: 2.6.28-11-generic (obtenido mediante el comando uname -a)
  • gcc del kernel: gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4) (ejecuta: cat /proc/version)

Para los que tengan esta versión de ubuntu aquí dejo un paquete con el driver listo para ser usado 😉 madwifi-hal-01056-r4003_20090416-1_i386

1-Obtener los drivers de madwifi-hal de la página de snapshots del projecto madwifi

2-Obtener el parche desde esta web r3745-corregido o mediante la orden:

wget http://patches.aircrack-ng.org/madwifi-ng-r3745.patch

3-Preparar, compilar el código, cargar el módulo y probar la injección

cd src

tar zxf madwifi-hal-0.10.5.6-current.tar.gz

cd madwifi-hal-0.10.5.6-r4003-20090416/

sudo aptitude install patch

patch -p1 < ../r3745.patch-corregido

make && sudo make install

sudo modprobe -r ath9k && sudo modprobe ath_pci

sudo airmon-ng start wifi0

Found 5 processes that could cause trouble.
If airodump-ng, aireplay-ng or airtun-ng stops working after
a short period of time, you may want to kill (some of) them!

PID    Name
2834    wpa_supplicant
2851    avahi-daemon
2852    avahi-daemon
5332    NetworkManager
9426    dhclient
Process with PID 9426 (dhclient) is running on interface ath0

Interface    Chipset        Driver

wifi0        Atheros        madwifi-ng
ath0        Atheros        madwifi-ng VAP (parent: wifi0)
ath1        Atheros        madwifi-ng VAP (parent: wifi0) (monitor mode enabled)

sudo aireplay-ng -9 ath1
18:25:52  Trying broadcast probe requests…
18:25:52  Injection is working!
18:25:54  Found 5 APs

Perfecto listo y funcionando 😉

2- Pasos detallados

En este post voy a explicar como preparar una tarjeta wifi basada en un chipset atheros para realizar injección de paquetes, una técnica muy útil a la hora de realizar penetraciones en redes wireless protegidas mediante encriptación WEP (Wired Equivalent Privacy). Aunque esta tecnología está siendo reemplaza por WPA y WPA2 aún se encuentran muchas redes de este tipo tanto en entornos empresariales como en hogares.

Bien el primer problema que encuentro es saber qué driver usar ya que el proyecto madwifi se ha dividido en 3 ramas, la antigua, denominada Madwifi, que depende del desarrollo privado de los módulos para HAL (Hardware Abstraction Layer) llevado a cabo por el propio fabricante de los chipsets Atheros, la segunda rama es el ath5k que es el primer intento de desarrollar un driver completamente libre y la tercera rama es el ath9k que ya viene incluida por defecto en los kernels actuales. Bien por lo que he podido ver no hay todavía soporte a la injección de paquetes en ninguna de las ramas completamentes libres (ath5k y ath9k) así que hay que instalar el driver antiguo, el madwifi, también hay que destacar la desaparición de la rama madwifi-ng, ahora tan solo existe la madwifi pero es la que en su día fuera la madwifi-ng.

Estas instrucciones se han realizado en un pc con la siguiente configuración:

  • SO:  Ubuntu 9.04 jaunty (ejecuta el comando lsb_release -a para obtenerla)
  • Tarjeta wifi: Atheros Communications Inc. AR5008 Wireless Network Adapter (rev 01) (ejecuta el comando lscpi)
  • Kernel: 2.6.28-11-generic (obtenido mediante el comando uname -a)
  • gcc del kernel: gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4) (ejecuta: cat /proc/version)

Para los que tengan esta versión de ubuntu aquí dejo un paquete con el driver listo para ser usado 😉 madwifi-hal-01056-r4003_20090416-1_i386

Vale manos a la obra, lo primero que hay que hacer es obtener los drivers de madwifi, para eso hay que visitar la página de snapshots del projecto madwifi y descargar el último snapshot de madwifi-hal, para este post he utilizado la versión madwifi-hal-0.10.5.6-current.tar.gz . Tras obterner el código del driver hay que conseguir el parche (patch en inglés) que añade la funcionalidad de injectar paquetes, tan solo hay que ejecutar en un terminal la siguiente instrucción:

wget http://patches.aircrack-ng.org/madwifi-ng-r3745.patch

Me he encontrado con que la página de proyecto aircrack-ng estaba inactiva a la hora de escribir este post y he tenido que tirar de la caché de google para conseguir el archivo deseado así que dejo aquí el contenido del archivo (tener en cuenta que el patch puede cambiar así que este tan solo es válido para la versión del driver mencionada más arriba) parche madwifi r3745 (este parche dará problemas pero lo pongo para mostrar como se pueden solucionar los problemas que pueden surgir a la hora de aplicar un parche a cualquier código) aquí dejo el parche corregido y que no da problemas: r3745-corregido.

Oka, vamos p’allá, abrir un terminal y siturase en el directorio en el que hayamos descargado los archivos, descomprimir el archivo del código fuente y aplicar el patch:

cd src

tar zxf madwifi-hal-0.10.5.6-current.tar.gz

cd madwifi-hal-0.10.5.6-r4003-20090416/patch -p1 < ../r3745.patch
patching file ath/if_ath.c
Hunk #1 FAILED at 2950.
Hunk #2 succeeded at 3035 (offset 72 lines).
Hunk #3 succeeded at 3060 (offset 72 lines).
1 out of 3 hunks FAILED — saving rejects to file ath/if_ath.c.rej

Como se puede ver la salida del comando patch indica que han habido errores al aplicar el parche y que los detalles se han almacenado en el archivo ath/if_ath.c.rej así pues, veamos que contiene ese archivo

cat ath/if_ath.c.rej
***************
*** 2950,2955 ****
ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb)
{
struct ath_softc *sc = dev->priv;
struct ath_hal *ah = sc->sc_ah;
struct ieee80211_phy_params *ph = &(SKB_CB(skb)->phy);
const HAL_RATE_TABLE *rt;
— 2950,2956 —-
ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb)
{
struct ath_softc *sc = dev->priv;
+     struct ieee80211com *ic = &sc->sc_ic;
struct ath_hal *ah = sc->sc_ah;
struct ieee80211_phy_params *ph = &(SKB_CB(skb)->phy);
const HAL_RATE_TABLE *rt;

Los archivos de errores del parcheado se componen de dos partes, la superior y la inferior separadas por —numero de linea inicial, numero de linea final—- la parte superior muestra el código original y la inferior muestra los cambios que se realizarán al código original, las líneas precedidas por el signo + serán añadidas y las precedidas por el signo – serán eliminadas ¿sencillo verdad? ;). Este parche busca en la línea 2950 del archivo ath/if_ath.c la función ath_tx_startraw y le añadade la línea struct ieee80211com *ic = &sc->sc_ic; pero falla, los fallos normalmente se deben a cambios en el código que provocan un cambio en los números de las líneas evitando así que el parche encaje con el código pero también pueden deverse a cambios más profundos en el código, a ver qué pasa en este caso:

grep -n ath_tx_startraw ath/if_ath.c
3022:ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb)
3408:        ath_tx_startraw(dev, bf, skb);

Al buscar el nombre de la función en el archivo fuente (mediante grep -n que muestra el número de línea en el que encuentra la coincidencia) se ve que se encuentra en la línea 3022  en lugar de la 2950 que es donde la espera el parche (El 2º resultado devuelto por grep, la línea 3408 hay una llamada a la función pero no su definición el importante es el primer resultado), así que ahora podemos o bien modificar los números de líneas del parche o aplicar los cambios manualmente, como en este caso tan solo se agrega una linea yo me decanto por editar el archivo de código y añadir la linea a mano, esto lo dejo a la elección de cada uno 😉

Bien una vez realizados todos los cambios necesarios al código hay que compilarlo e instalar el driver en el sistema, es importante compilar el módulo con la misma versión de gcc que se utilizó para compilar el kernel (para ver cual es la versión de gcc que se utilizó ejecuta en un terminal cat /proc/version):

make

sudo make install

Si al ejecutar make el sistema dice que no exite el comando debes asegurarte que tienes instalado el paquete build-essentials si estas en Ubuntu o Debian, para otras distribuciones buscar el paquete que contenga gcc o g++.  También debes tener instaladas las cabeceras del kernel que estes usando, para asegurarte que están instaladas ejecuta:

sudo aptitude install linux-headers-`uname -r`

Ahora tan solo queda quitar el módulo que se esta usando, cargar el nuevo módulo y provar que todo rula bien

sudo modprobe -r ath9k

sudo modprobe ath_pci

sudo airmon-ng start wifi0

Found 5 processes that could cause trouble.
If airodump-ng, aireplay-ng or airtun-ng stops working after
a short period of time, you may want to kill (some of) them!

PID    Name
2834    wpa_supplicant
2851    avahi-daemon
2852    avahi-daemon
5332    NetworkManager
9426    dhclient
Process with PID 9426 (dhclient) is running on interface ath0

Interface    Chipset        Driver

wifi0        Atheros        madwifi-ng
ath0        Atheros        madwifi-ng VAP (parent: wifi0)
ath1        Atheros        madwifi-ng VAP (parent: wifi0) (monitor mode enabled)

sudo aireplay-ng -9 ath1
18:25:52  Trying broadcast probe requests…
18:25:52  Injection is working!
18:25:54  Found 5 APs

Perfecto listo y funcionando 😉 

2 comentarios en “Compilar madwifi para injectar paquetes con el chipset AR5008 de atheros en Ubuntu 9.04 (Jaunty)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.