Autor Tema: Direcciones MAC válidas  (Leído 22878 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Drexxx

  • Visitante
Direcciones MAC válidas
« en: 18-06-2011, 21:28 (Sábado) »
Hola a todos!
Estoy desarrollando una aplicación que posiblemente veáis a la luz dentro de poco.
Faltan cosas por corregir, pulir, etc.
Y ahora mismo estoy estancado con un problema.
Una de las funciones de la aplicación es generar una MAC aleatoria y opcionalmente establecerla a la interfaz de red. Para eso utilizo
Código: [Seleccionar]
ifconfig wlan0 hw ether xx:xx:xx:xx:xx:xxSin embargo, con algunas direcciones MAC funciona, y con otras no. El fallo es:
"ifconfig: SIOCSIFHWADDR: Cannot assign requested address"

Por ejemplo, la siguiente dirección es inválida:
ff:aa:bb:cc:dd:ee
Sin embargo esta otra es válida (fijaos en que solamente cambia una letra)
fa:aa:bb:cc:dd:ee

Estas son inválidas:
dd:aa:bb:cc:dd:ee
bb:aa:bb:cc:dd:ee
Y sin embargo las siguientes son válidas (solo cambia el primer par)
ee:aa:bb:cc:dd:ee
aa:aa:bb:cc:dd:ee

Mi pregunta: Si quiero generar direcciones MAC pseudoaleatorias, ¿existe algún criterio para generar direcciones válidas? No encontré documentación al respecto...
Ya sé que macchanger -r genera y establece direcciones MAC correctas, pero me gustaría prescindir de este programa, al menos por el momento.

Muchas gracias por todo!



supremo12345

  • Visitante
Re: Direcciones MAC válidas
« Respuesta #1 en: 19-06-2011, 01:07 (Domingo) »
Los prefijos son importantes, pues identifican al FABRICANTE. Y no todos los prefijos son validos.

Lo que deberias hacer es crear una miniDB de prefijos (por cada fabricante), y luego crear una funcion que añada bytes aleatorios al resto de la MAC.

Eso si te toca currar y buscar todos los fabricantes que puedas, para hacer la DB mas grande posible xD.


rioport

  • Visitante
Re: Direcciones MAC válidas
« Respuesta #2 en: 19-06-2011, 01:44 (Domingo) »
Acá una lista de MAC de acuerdo al fabricante.

Drexxx

  • Visitante
Re: Direcciones MAC válidas
« Respuesta #3 en: 19-06-2011, 01:52 (Domingo) »
Muchas gracias por las respuestas!
Ahora ya parece claro cual es el fallo...
Lo que no tengo tan claro es como corregirlo, pero eso es otro tema, y cuestión de pensar un poco en esa DB.
Lo dicho, con esa lista, ahora ya sé por donde tirar.

En cuanto tenga el código, lo posteo por si fuera útil para alguien más.
Un saludo.

Lo dicho, por si le puede servir a alguien:
Al final usé el fichero OUI.list que hay en /usr/share/macchanger/
En este fichero están los 6 primeros bytes que especifican el fabricante, separados por espacios, junto con el fabricante en cuestión. Hacemos una copia del fichero y trabajaremos sobre la copia, a la que llamamos lista_de_macs:

Código: [Seleccionar]
# Solo nos interesan los 3 primeros campos (los 6 bytes)
# Además, sustituimos los espacios en blanco por ":"
cat OUI.list | cut -d " " -f 1,2,3 |sed 's/ /:/g' > lista_de_macs

# Podemos comprimir la lista de macs para ahorrar espacio, y leerla con zcat
tar zcvf lista_de_macs.tar.gz lista_de_macs

# Se lee una línea aleatoria.
# Para eso es necesario contar el número de líneas
numlineas=$(zcat lista_de_macs.tar.gz |wc -l)

# Obtenemos un número aleatorio entre 0 y el número de líneas
numaleatorio=$(($RANDOM%$numlineas))

# Se lee la línea $numaleatorio, y solamente esa (tail -1)
zcat lista_de_macs.tar.gz |head -$numaleatorio |tail -1

Y con esto ya tenemos media mac pseudoaleatoria.
Los otros 6 bytes restantes pueden ser completamente aleatorios, y así obtenemos una mac válida.

Gracias nuevamente!




« Última modificación: 20-06-2011, 03:32 (Lunes) por Drexxx »

supremo12345

  • Visitante
Re: Direcciones MAC válidas
« Respuesta #4 en: 26-06-2011, 13:56 (Domingo) »
Excelente codigo.

alist3r

  • Visitante
Re: Direcciones MAC válidas
« Respuesta #5 en: 26-06-2011, 14:16 (Domingo) »
suponiendo que la mac es AA:AA:AA:BB:BB:BB
aleatoriza la eleccion de un fabricante válido para AA:AA:AA.
por ejemplo, genera un numero de 1 a 10 para diez fabricantes válidos y luego en funcion del resultado aleatorio, asignas AA:AA:AA utilizando la base de datos de fabricantes y macs que te han pasado.
Para BB:BB:BB, genera bytes totalmente aleatorios y luego concatena ambos.

Drexxx

  • Visitante
Re: Direcciones MAC válidas
« Respuesta #6 en: 06-07-2011, 17:57 (Miércoles) »
Excelente codigo.

suponiendo que la mac es AA:AA:AA:BB:BB:BB
aleatoriza la eleccion de un fabricante válido para AA:AA:AA.
por ejemplo, genera un numero de 1 a 10 para diez fabricantes válidos y luego en funcion del resultado aleatorio, asignas AA:AA:AA utilizando la base de datos de fabricantes y macs que te han pasado.
Para BB:BB:BB, genera bytes totalmente aleatorios y luego concatena ambos.

Muchas gracias!
Al final, para el que le interese, un posible script en bash podría quedar así:
Código: [Seleccionar]
#!/bin/bash

# Partimos del archivo /usr/share/macchanger/OUI.list
# y de /usr/share/macchanger/wireless.list
rutaoui="/usr/share/macchanger/OUI.list"
rutawireless="/usr/share/macchanger/wireless.list"

# Comprobamos si existen tales archivos
if [ ! -f $rutaoui ]
then
echo "Falta $rutaoui"
exit 1
fi
if [ ! -f $rutawireless ]
then
echo "Falta $rutawireless"
exit 1
fi

# Si no existe lista_macs_completa.tar.gz, se crea
if [ ! -f lista_macs_completa.tar.gz ]
then
cat $rutaoui |cut -d " " -f 1,2,3 |sed 's/ /:/g' > lista_macs_completa
cat $rutawireless |cut -d " " -f 1,2,3 |sed 's/ /:/g' >> lista_macs_completa
tar zcvf lista_macs_completa.tar.gz lista_macs_completa
        sync
        rm lista_macs_completa
fi

# Contamos el número de líneas (número de macs)
numLineas=$(zcat lista_macs_completa.tar.gz |wc -l)

# Generamos un número aleatorio poniendo como
# límite el número de líneas
numAleatorio=$(($RANDOM%$numLineas))

# Lista de caracteres para hacer el resto de la mac
lista=('0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 'A' 'B' 'C' 'D' 'E' 'F')

# Longitud de la lista
# Van a ser 16 evidentemente
# La siguiente línea es sólo a modo didáctico
longLista=${#lista[*]}

# Obtenemos los 6 primeros bytes (corresponden con un fabricante)
fab=$(zcat lista_macs_completa.tar.gz |head -$numAleatorio |tail -1)
# Añadimos ":" para formar xx:xx:xx:
fab=$fab:

# El resto de la mac será completamente aleatoria
# Falta por hacer yy:yy:yy
# Primero se hace yy dos veces (i) y se repite 3 veces (j)
# De esta forma generamos yy:yy:yy
for j in {1..3}
do
for i in {1,2}
do
restomac=$restomac${lista[$(($RANDOM%$longLista))]}
done
if [ $j -lt 3 ]
then
restomac=$restomac:
fi
done
echo $fab$restomac
« Última modificación: 06-07-2011, 23:25 (Miércoles) por Drexxx »

alist3r

  • Visitante
Re: Direcciones MAC válidas
« Respuesta #7 en: 06-07-2011, 19:28 (Miércoles) »
impecable. y además en bash, toma castaña.
que se note que ^gnu/linux es poderoso :D

Drexxx

  • Visitante
Re: Direcciones MAC válidas
« Respuesta #8 en: 06-07-2011, 23:27 (Miércoles) »
Gracias!  ;D
Pero no estaba impecable... de hecho acabo de editar para corregir algo:
Añado
Código: [Seleccionar]
sync
rm lista_macs_completa
Si queremos comprimir en tar.gz y luego leer con zcat para ahorrar espacio, estaría bien que se borrara la lista original sin comprimir...  ^-^
Un saludo

alist3r

  • Visitante
Re: Direcciones MAC válidas
« Respuesta #9 en: 07-07-2011, 01:02 (Jueves) »
y encima meticuloso... a este mozo tienen que vigilarlo señores! que es un diamante en bruto! :D

supremo12345

  • Visitante
Re: Direcciones MAC válidas
« Respuesta #10 en: 07-07-2011, 13:13 (Jueves) »
Buen trabajo >:(