Pyrit es un programa con muchas funcionalidades enfocadas principalmente
a descifrar mediante fuerza bruta o diccionarios por tablas, claves como
las de los AP (Puntos de Acceso) WPA.
Pyrit, herramienta de pentesting
Se encuentra en la mayoría de las distribuciones para instalar
directamente desde sus repositorios pero además lo puedes conseguir
desde github:
https://github.com/JPaulMora/Pyrit
El código antiguo en los archivos de google code se encuentra aquí:
https://code.google.com/archive/p/pyrit/
Si instalas desde los repositorios de tu distribución probablemente no
tenga soporte para GPU.
La instalación desde repositorios en distribuciones debian o derivadas
se lleva a cabo con la siguiente orden:
sudo apt install pyrit && sudo apt install pyrit-opencl
La tarjeta grafica suele ser mucho mas potente que cualquier procesador
y aumenta considerablemente el numero de comprobaciones por segundo.
Para que tenga este soporte instálalo desde la fuente del proyecto.
Puedes seguir está guía para compilar pyrit con soporte para CUDA y
para OpenCL tal como redacto en la siguiente entrada:
https://laguialinux.es/instalar-pyrit-con-soporte-cuda-y-opencl
Sintaxis de Pyrit
La sintaxis básica corresponde al siguiente orden:
pyrit [opciones] comando
Esta herramienta es bastante amplia y personalizable, además se puede
conjugar mediante tuberías/pipelines para ser usada con otras
herramientas y así poder lograr tu objetivo final.
Si desea ir directo al grano mediante ejemplos, puede visitar la entrada
dónde explicamos
como capturar handshake y usar pyrit mediante ejemplos
En las próximas secciones se detallan los parámetros
Opciones de Pyrit
Explicamos cada una de las opciones que dispone pyrit
-b BSSID
Especifica un BSSID. Puede ser utilizado para restringir a ciertos
comandos-puntos de acceso.
-e ESSID
Especifica el ESSID. Comandos general se refieren a todos los ESSIDs en
la base de datos si se omite esta opción.
-i infile
Especifica un nombre de archivo para leer, el nombre de archivo especial
‘-‘ se puede utilizar para la entrada estándar.
El archivo puede ser comprimido con gzip, en cuyo caso su nombre debe
terminar en “.gz” para la descompresión transparente.
-o outfile
Especifica un nombre de archivo para escribir, el nombre de archivo
especial ‘-‘ se puede utilizar para la salida estándar.
Los nombres de archivo que terminen en ‘.gz’ porque pyrit puede
comprimir/descomprimir en tiempo real estos archivos.
-r capture-file
Especifica un archivo con la captura de paquetes en formato pcap
(posiblemente con gzip) o un dispositivo (por ejemplo, ‘wlan0’) para
capturar desde él.
-u URL
Especifica la dirección URL del dispositivo de almacenamiento así:
driver://username:password@host:port/database
Pyrit puede utilizar el sistema de archivos, un servidor remoto para almacenar en una base de datos externa SQl como almacenamiento.
El driver ‘file://’ se refiere al propio almacenamiento del sistema de archivos basado en Pyrit
‘http://’ conecta al Pyrit-Relay-Server y el resto de las direcciones URL se pasan directamente a SQLAlchemy.
Es posible que desee para ver esta documentación para obtener más información acerca de la sintaxis.
El almacenamiento URL por defecto también se puede especificar mediante
el parámetro ‘default_storage’ en el archivo de configuración de Pyrit
que normalmente alojamos en ‘~/.pyrit/config’.
–all-handshakes
Los comandos attackbatch, attackdb, attackcowpatty y
attackpassthrough utilizan automáticamente el mejor handshake.
En algunos casos, incluso el handshake puede haber sido
indebidamente reconstruido a partir de los datos capturados, lo que
hace el ataque inútil.
En caso de que más de un EAPOL-handshake se reconstruye desde el
archivo de captura, la opción –all-handshakes se pueden utilizar
para atacar a todos los handshakes reconstruibles partir de los
datos capturados.
Más adelante se describe el comportamiento exacto de las órdenes afectadas por esta opción.
Comandos de Pyrit
Listado y descripción de los comandos para pyrit.
analyze
Analizar uno o varios archivos de captura de paquetes (en formato pcap,
posiblemente con gzip) y trate de detectar-los puntos de acceso,
estaciones y EAPOL-handshake.
Por ejemplo:
pyrit -r "test*.pcap" analyze
Puede devolver uno de estos resultados:
- Good: El handshake incluye el desafío desde el AP,
la respuesta de la estación y la confirmación del punto de acceso. -
Workable: El handshake incluye la respuesta de la estación y
la confirmación del Punto de Acceso. El reto no fue capturado. -
Bad: El handshake incluye el desafío desde el punto de acceso,
y la respuesta de la estación. La confirmación no fue capturado.
attack_batch
Atacar un EAPOL-handshake que se encuentra en el archivo de captura de
paquetes (s) dada por la opción -r con las llaves maestras por
parejas y contraseñas almacenadas en la base de datos.
Las opciones -b y -e se pueden utilizar para especificar el
Punto de Acceso para atacar
Se recogió automáticamente si se omiten las dos opciones.
La contraseña se escribe en el nombre de archivo dado por la opción
-o, si se especifica. Por ejemplo:
pyrit -r test.pcap -e MyNetwork -b 00:de:ad:c0:de:00 -o MyNetworkPassword.txt attack_batch
Por parejas claves maestras que han sido previamente calculados y
almacenados en la base de datos se han tomado de allí, todas las demás
contraseñas se convierten en sus respectivas llaves maestras por
parejas y se agregan a la base de datos para su posterior
reutilización. ESSIDs se crean automáticamente en la base de datos si
es necesario.
Pyrit trabaja por la lista de reconstruidas EAPOL-handshake en caso de que la opción –all-handshakes se haya pasado.
attack_cowpatty
Atacar un EAPOL-handshake que se encuentra en el archivo de
captura de paquete(s) dada por la opción -r por parejas utilizando
claves maestras de un archivo cowpatty similar (por ejemplo, genera
genpmk / export_cowpatty) dada por la opción -f.
Las opciones -b y -e se pueden utilizar para especificar
el Punto de Acceso para atacar; se recogió automáticamente si se omiten
las dos opciones.
La contraseña se escribe en el nombre de archivo dado por la opción-o,
si se especifica.
El fichero cowpatty puede ser comprimido con gzip y debe coincidir con
el ESSID elegido. Por ejemplo:
pyrit -r test.pcap -e MyOwnNetwork -i MyOwnNetwork.cow.gz -o - attack_cowpatty
La propia base de datos de Pyrit no es tocada por attack_cowpatty
attack_db
Atacar un EAPOL-handshake que se encuentra en el archivo de
captura de paquete(s) dada por la opción -r con las llaves maestras
por pares almacenados en la base de datos.
Las opciones-b y-e se pueden utilizar para especificar el Punto de
Acceso que se pretende atacar.
Se recogió automáticamente si se omiten las dos opciones. La contraseña
se escribe en el nombre de archivo dado por la opción-o, si se
especifica. Por ejemplo:
pyrit -r test.pcap -e MyOtherNetwork attack_db
Sólo las claves maestras de por parejas que se han computado
previamente y se almacenan en la base de datos son utilizados por
attack_db.
Pyrit trabaja por la lista de reconstruidas EAPOL-handshakes en caso de
que la opción –all-handshakes sea pasada.
attack_passthrough
Atacar un EAPOL-handshake que se encuentra en el archivo de captura de paquete(s) dada por la opción -r con las contraseñas leídas desde el archivo dado por la opción -i.
Las opciones -b y -e se pueden utilizar para especificar el Punto de Acceso que será atacado.
Se obtendrán automáticamente si se omiten las dos opciones.
La contraseña se escribe en el nombre de archivo dado por la opción-o,
si se especifica. Por ejemplo:
pyrit -r test.pcap -b 00:de:ad:be:ef:00 -i words.txt attack_passthrough
Este comando evita la base de datos de Pyrit y debe utilizarse sólo
si el espacio de almacenamiento es un problema (por ejemplo, en el
LiveCD).
Usted debe considerar el uso de attack_batch.
Pyrit ataca todos EAPOL-handshakes al mismo tiempo, si la opción –all-handshakes es pasada como parámetro.
batch
Comience a traducir todas las contraseñas en la base de datos en sus
respectivos Pairwise claves maestras y almacenar los resultados en la
base de datos.
La opción -e puede ser utilizado para restringir este comando a un
único ESSID, si está omitido, todos los ESSIDs se procesan uno tras
otro en orden indefinido. Por ejemplo:
pyrit -e NETGEAR batch
La opción -o se puede utilizar para especificar un nombre de archivo de los resultados, además, deberán estar escritos en formato binario cowpatty’s.
La opción -e se convierte en obligatoria y el ESSID se crea automáticamente en la base de datos si es necesario.
Por parejas de claves maestras que han sido previamente calculadas y
almacenadas en la base de datos se exportan desde allí sin más
transformación.
Pyrit parará y saldrá si un IOError es levantado al escribir en el
archivo especificado. Esto hace que sea muy conveniente para los
resultados de tuberías directamente a otros programas, pero también
mantener para su uso posterior. Por ejemplo:
pyrit -e NETGEAR -o - batch | cowpatty -d - -r wpatestcapture.cap -s NETGEAR
benchmark
Pruebas para determinar el máximo rendimiento del hardware disponible
computando con todo simultáneo. Por ejemplo:
pyrit benchmark
check_db
Desempaqueta la base de datos y comprueba si hay errores como la
corrupción de datos o errores de referencia.
Esta función no comprueba el valor de los resultados calculados (véase
verificar). Por ejemplo:
pyrit check_db
create_essid
Añadir nuevas ESSIDs a la base de datos.
Una sola ESSID puede ser dada por la opción -e.
Múltiples ESSIDs se pueden crear mediante el suministro de un archivo
(una por línea), a través de la opción -i.
Vuelva a la creación de un ESSID existente no da lugar a un error.
Por ejemplo:
pyrit -e NETGEAR create_essid
delete_essid
Elimine el ESSID dado por -e de la base de datos.
Esto incluye todos los resultados que pueden haber sido almacenados
para que ESSID en particular. Por ejemplo:
pyrit -e NETGEAR delete_essid
eval
Contar todas las contraseñas disponibles, todos ESSIDs y sus respectivos resultados en la base de datos. Por ejemplo:
pyrit eval
export_passwords
Escribe todas las contraseñas que se almacenan actualmente en la base
de datos a un nuevo archivo dado por -o.
Las contraseñas son terminados por una sola nueva línea de
caracteres (“\n”).
Los archivos existentes se sobrescriben sin confirmación. Por ejemplo:
pyrit -o myword.txt.gz export_passwords
export_cowpatty
Escribe todos los resultados almacenados actualmente en la base de
datos para el ESSID dado por -e para el archivo dado por -o
en formato binario cowpatty‘s.
Los archivos existentes se sobrescriben sin confirmación. Por ejemplo:
pyrit -o NETGEAR.cow -e NETGEAR export_cowpatty
export_hashdb
Escribe todos los resultados almacenados actualmente en la base de datos a la base de datos airolib-ng dada por -o.
La base de datos se crea con un diseño de tabla por defecto si el archivo no existe todavía.
La opción -e se puede utilizar para limitar la exportación a un único ESSID. Por ejemplo:
pyrit -o NETGEAR.db -e NETGEAR export_hashdb
import_passwords
Lea el archivo dado por -i e importa una contraseña por línea a la
base de datos.
Las contraseñas pueden contener todos los caracteres (incluyendo
nulo bytes) además de la terminación de nueva línea de caracteres \n.
Se ignoran las contraseñas que no son adecuados para ser utilizados con
WPA-/WPA2-PSK.
Almacenamiento ejecución de Pyrit garantiza que todas las
contraseñas siguen siendo únicos en toda la base de datos.
Por ejemplo:
pyrit -i dirty_words.txt import_passwords
importuniquepasswords
Lee el archivo dado por -i e importa una contraseña por línea a la
base de datos.
Las contraseñas pueden contener todos los caracteres (incluyendo
nulo bytes) además de la terminación de nueva línea de caracteres \n.
Se ignoran las contraseñas que no son adecuados para ser utilizados con
WPA-/WPA2-PSK.
Este comando no comprueba si está duplicando las contraseñas en el
archivo o entre el archivo y la base de datos, sino que debe ser
utilizado con precaución para evitar que la base de datos desde el
envenenamiento con claves duplicadas.
Este comando sin embargo puede ser mucho más rápido que
import_passwords.
Por ejemplo:
pyrit -i dirty_words.txt import_unique_passwords
list_cores
Mostrar una lista de todos los módulos de hardware disponibles Pyrit
utiliza actualmente.
Por ejemplo:
pyrit list_cores
list_essids
Mostrar una lista de todos ESSIDs almacenados actualmente en la base de
datos.
Esta función es más rápido que eval en caso de que no es necesario conocer el número de resultados calculados.
Por ejemplo:
pyrit list_essids
passthrough
Lea las contraseñas del archivo dado por -i y calcular sus pareadas
claves maestras para el ESSID dado por -e.
Los resultados se escriben en el archivo especificado por -o en
formato binario cowpatty‘s y no se almacenan en la base de datos para
su uso posterior.
Este comando elude la base de datos y se debe usar sólo si el espacio
de almacenamiento es un problema (por ejemplo, cuando se utiliza Pyrit
en un LiveCD).
El procesado de comandos por lotes proporciona exactamente la misma
funcionalidad que de paso a través, pero puede dar un rendimiento mucho
mejor ya que los resultados se pueden leer a partir de la base de datos
en lugar de recalcularlas.
Por ejemplo:
pyrit -i dirty_words.txt.gz -e NETGEAR -o - passthrough | cowpatty -d - -r wpatestcapture.cap -s NETGEAR
relay
Inicie el servidor para transmitir otro dispositivo de almacenamiento a
través de XML-RPC, otros clientes Pyrit pueden utilizar el servidor
como dispositivo de almacenamiento.
Esto permite tener acceso a la red basada en fuente de almacenamiento
que no proporcionan acceso de red por su cuenta (como file:// y
sqlite://) u ocultar una base de datos SQL-detrás de un firewall y
dejar que los clientes acceso múltiple que la base de datos sólo a
través de Pyrit de RPC-interface.
El puerto TCP 17934 debe estar abierto para que esta opción funcione.
Por ejemplo, en el servidor (donde la base de datos es):
pyrit -u sqlite://var/local/pyrit.db relay
…y el cliente (donde está la principal GPU):
pyrit -u http://192.168.0.100:17934 batch
selftest
Ejecutar una extensa autocomprobación durante unos 60 segundos.
Esta prueba incluye toda la programación-mecanismo y todos los núcleos que se enumeran por list_cores.
Puede utilizar esta función para detectar el hardware módulos rotos o red-clientes maliciosos.
Por ejemplo:
pyrit selftest
serve
Inicie un servidor que proporciona acceso al hardware de computación
local para ayudar a otros clientes Pyrit.
Dirección IP del servidor, debe añadirse al archivo de configuración del
usuario que lo ejecuta, normalmente ~/.pyrit/config como una lista
separada por espacio bajo known_clients.
Estos clientes rpc_server-setting también se debe establecer en true
El puerto TCP y UDP 17935 debe ser accesible.
Por ejemplo, en el servidor (donde está la GPU):
pyrit serve
…y los clientes (la dirección IP del servidor de ha sido añadido a
knownclients y rpcserver está establecido en ‘true’):
pyrit -r test.pcap -b 00:de:ad:be:ef:00 -i words.txt attack_passthrough
strip
Analizar uno o más archivos de paquetes de captura propuestos por la
opción -r, extraer sólo los paquetes que son necesarios para la
detección EAPOL-handshakes y escribir un nuevo vertedero en el nombre
de archivo dado por la opción -o.
Las opciones -e y -b se pueden utilizar para filtrar
determinados AP.
Por ejemplo:
pyrit -r "large_dumps_*.pcap" -e MyNetwork -o tiny_compressed_dump_MyNetwork.dump.gz strip
stripLive
Analizar un archivo de captura de paquetes dada por la opción -r,
extraer sólo los paquetes que son necesarios para la detección
EAPOL-handshakes y escribir un nuevo vertedero para el archivo dado por
la opción -o.
Este comando se diferencia de la tira como el archivo de captura puede
ser cualquier dispositivo de caracteres incluyendo tomas de corriente y
otros pseudo-archivos que se parecen a los archivos en formato pcap.
StripLive escribe paquetes relevantes para el nuevo archivo dado por
-o como llegan en lugar de tratar de leer el archivo-captura todo
primero.
Por ejemplo:
pyrit -r /temp/kismet_dump -o small_dump.pcap stripLive
verify
Elegir al azar el 10% de los resultados almacenados en la base de datos
y verificar su valor por recálculo.
Usted necesita esta función si sospecha hardware roto o clientes
maliciosos en la red.
Por ejemplo:
pyrit -e NETGEAR verify
Estados de salida
Si el comando se ejecuta correctamente, el código de salida del proceso
Pyrit se establece en 0, de lo contrario se pone a 1 y
(generalmente) un mensaje de error o un python-traceback se escribe en
stderr (salida por defecto).
Los siguientes comandos también indican una condición de error en
algunos casos:
- analyze: No al menos un EAPOL-handshake válida podría ser detectado.
- attackpassthrough, attackbatch, attackdb y attackcowpatty: La
contraseña no se puede conocer. - verify: Por lo menos una unidad de trabajo contenía resultados no
válidos. - check_db: No se encontraron errores en la base de datos (y
posiblemente fijos).
Trabajando con pyrit
Puede ver nuestra sección de ejemplos, consejos y ayudas para trabajar
con pyrit y archivos de captura (handshakes)desde el siguiente enlace:
https://laguialinux.es/pyrit-analizando-y-capturando-handshakes
Instalar pyrit desde fuentes con soporte para GPU y CUDA o OpenCL
En este vídeo explicamos como instalar pyrit con soporte CUDA y OpenCL enfocado a tarjetas gráficas NVIDIA y la distribución Debian.