Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
dtls-fuzzer — dtls-fuzzer es un fuzzer de estado de protocolo para implementaciones de servidores DTLS. | Kitploit
Herramientas/GitLabGitLab/pfg666/dtls-fuzzer
FuzzingSeguridad de Redes
GitLabpfg666/dtls-fuzzer

dtls-fuzzer

dtls-fuzzer es un fuzzer de estado de protocolo para implementaciones de servidores DTLS.

Ver Repositorio
49hace 5 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

dtls-fuzzer es una herramienta Java que realiza pruebas de estado de protocolo mediante fuzzing en servidores DTLS. Más concretamente, soporta las siguientes funcionalidades:

  1. dado un alfabeto, puede generar automáticamente un modelo de una implementación local de servidor DTLS;
  2. dada una prueba (secuencia de entradas) y un alfabeto, puede ejecutar la prueba en una implementación de servidor DTLS;
  3. puede ejecutar una tarea de aprendizaje por lotes, que involucra múltiples ejecuciones de aprendizaje.

dtls-fuzzer utiliza TLS-Attacker para generar/analizar mensajes DTLS, así como para mantener el estado. Con ese fin, TLS-Attacker ha sido extendido con soporte para DTLS. dtls-fuzzer se basa en la versión 3.0b de TLS-Attacker, una versión que implementa la mejora de DTLS.

Contenido del artefacto

El artefacto contiene:

  1. una descripción de la estructura de archivos de dtls-fuzzer, incluyendo código fuente y datos experimentales consistentes con lo mostrado en el artículo;
  2. un tutorial para evaluar dtls-fuzzer en un SUT (Sistema Bajo Prueba) / implementación de servidor DTLS elegido.

Estructura de archivos de dtls-fuzzer

Las carpetas más importantes en el directorio raíz de dtls-fuzzer son:

  1. 'src', directorio que contiene el código fuente Java de dtls-fuzzer;
  2. 'examples', directorio que contiene ejemplos de alfabetos, pruebas, especificaciones (es decir, modelos) y archivos de argumentos que se pueden proporcionar a dtls-fuzzer para lanzar experimentos de aprendizaje. Los archivos en este directorio se utilizan como entradas para experimentos de aprendizaje;
  3. 'experiments', directorio que contiene datos relacionados con experimentos. Parte de estos datos también sirven como entrada para experimentos de aprendizaje. Las carpetas más notables son:
    1. 'suts', con binarios para SUTs Java. Estos SUTs son programas de servidor DTLS hechos a medida cuyo código fuente está disponible públicamente;
    2. 'patches', parches que se aplicaron a algunos SUTs (particularmente a utilidades) antes de que se compilara el código fuente. El propósito principal de estos parches fue prevenir comportamientos inducidos por tiempos durante el aprendizaje, habilitar/deshabilitar funcionalidades en el SUT y configurar parámetros como la clave precompartida;
    3. 'keystore', material de claves (por ejemplo, pares de clave pública-privada, almacenes de claves Java) utilizado durante el aprendizaje;
    4. 'results', resultados experimentales.

Resultados experimentales

‘experiments/results’ contiene los resultados experimentales, que son la salida principal del trabajo. En particular:

  • ‘all_ciphers’ contiene carpetas de salida para todos los experimentos ejecutados;
    • ‘mapper’ contiene resultados experimentales que ayudan a justificar algunas de las decisiones del mapper tomadas (ver Sección 5.2)
  • ‘included’ contiene carpetas de salida para experimentos que convergen (converger significa que el aprendizaje genera exitosamente un modelo).
    • Tenga en cuenta que no todos los experimentos en ‘all_ciphers’ fueron exitosos/terminaron con un modelo final (decimos en tales casos que el aprendizaje no convergió)

Carpetas de salida

Las carpetas de salida se nombran según la configuración del experimento, es decir:

  • el SUT/implementación probado;
  • el alfabeto utilizado, en términos de algoritmos de intercambio de claves cubiertos, donde ‘all’ indica que se utilizaron los 4 algoritmos de intercambio de claves;
  • cuando corresponda, si se requirió certificación del cliente (req), opcional (nreq) o deshabilitada (none);
  • el algoritmo de prueba: recorrido aleatorio (rwalk) o una adaptación del mismo (stests);
    • los experimentos que utilizan la adaptación no se han incluido en el artículo
  • opcionalmente, si las retransmisiones se incluyeron/excluyeron de las salidas (incl o excl).
    • las retransmisiones se incluyeron por defecto

Como ejemplo, el nombre de carpeta ‘jsse-12_rsa_cert_none_rwalk_incl’ indica un experimento en la implementación JSSE 12 de DTLS, utilizando un alfabeto que incluye entradas para realizar handshakes RSA, la autenticación de certificado del cliente está deshabilitada, el algoritmo de prueba es recorrido aleatorio y las retransmisiones están incluidas.

Una carpeta de salida contiene:

  • ‘alphabet.xml’, el alfabeto de entrada;
  • ‘command.args’, el archivo de argumentos utilizado que contiene varios parámetros del experimento, más notablemente:
    • queries, el límite en el número de pruebas de recorrido aleatorio que deben pasar para que una hipótesis se considere final
    • equivalenceAlgorithms, algoritmos de prueba basados en modelos empleados
    • runWait y timeout, el tiempo de espera de inicio y de respuesta respectivamente (los abordaremos más adelante)
  • ‘sul.config’, configuración dependiente del SUT para TLS-Attacker, la misma configuración se puede usar para ejecutar trazas de flujo de trabajo en el SUT usando solo TLS-Attacker;
  • ‘hyp[0-9]+.dot’, hipótesis intermedias;
  • ‘statistics.txt’, estadísticas del experimento como el número total de pruebas, tiempo de aprendizaje;
    • La Tabla 4 muestra estos datos
  • ‘nondet.log’, registros de comportamiento no determinista encontrados;
  • ‘learnedModel.dot’, en caso de que el aprendizaje haya convergido, el modelo aprendido (es decir, hipótesis final);
  • ‘error.msg’, un mensaje de error generado en caso de que el experimento haya fallado/el aprendizaje se haya detenido y, por lo tanto, no haya convergido a un modelo final.
    • el principal culpable es el no determinismo relacionado con el tiempo (las mismas entradas llevan a resultados diferentes).

El evaluador puede verificar (por ejemplo) que los resultados experimentales en ‘included’ correspondan a los mostrados en la Tabla 4, o que las configuraciones probadas en la Tabla 2 también aparezcan en ‘all_ciphers’. Tenga en cuenta que los modelos que aparecen en el artículo fueron el resultado de una poda/recorte significativo, mientras que los modelos que aparecen en las carpetas de salida no están alterados.

Pasos de evaluación de dtls-fuzzer

Con el propósito de evaluar dtls-fuzzer es necesario realizar los siguientes pasos:

  1. Asegurar que se cumplen los prerrequisitos
  2. Instalar dtls-fuzzer
  3. Configurar el SUT
  4. Usar dtls-fuzzer para generar modelos para el SUT
  5. Analizar resultados

Esta sección de evaluación es seguida por una guía sobre el uso de dtls-fuzzer que introduce sus principales casos de uso.

Asegurar los prerrequisitos

dtls-fuzzer ha sido probado en Ubuntu 18.04 y Debian 9 distribuciones de Linux. Debería funcionar en cualquier distribución reciente de Linux. No se ha probado el soporte para otras plataformas. Esta guía asume que se utiliza una distribución basada en Debian (que tiene 'apt-get').

Se requiere una Máquina Virtual (VM) Java 8 JDK (Kit de Desarrollo Java). La versión utilizada para ejecutar experimentos es 1.8.0_222, aunque versiones posteriores de Java 8 también deberían funcionar. Tenga en cuenta que la herramienta no compila en Java 9 o posterior. También confiamos en maven (la utilidad 'mvn') para la gestión/implementación de dependencias.

Recomendamos usar una máquina suficientemente potente; de lo contrario, parámetros de temporización sensibles como el tiempo de espera de respuesta podrían volverse demasiado bajos, causando salidas diferentes a las obtenidas en el artículo. Peor aún, pueden causar que los experimentos de aprendizaje fallen. Los experimentos originales se ejecutaron en un servidor con muchos núcleos; sin embargo, esperamos (aunque no lo hemos probado a fondo) que el aprendizaje debería ser posible en un escritorio con un procesador i7. El aprendizaje también es posible en sistemas más débiles si los parámetros de temporización se ajustan en consecuencia. Finalmente, visualizar modelos .dot exportándolos a .pdf requiere instalar la biblioteca graphviz. Se asume que la utilidad 'dot' proporcionada por graphviz se encuentra en el PATH del sistema.

En resumen, los prerrequisitos recomendados son:

  • distribución reciente de Linux, preferiblemente basada en Debian
  • máquina de escritorio/servidor para reproducción de experimentos/aprendizaje confiable
  • (>=) 4 GB de RAM
  • Java 8 JDK
  • maven
  • graphviz

Configuración del entorno

Java 8 JDK

dtls-fuzzer requiere Java 8 JDK (Kit de Desarrollo Java). Si Java no está instalado, instalamos la implementación OpenJDK (a través de 'apt-get' en Ubuntu), y podemos saltarnos el resto de esta subsección.

root@kitploit:~
> sudo apt-get install openjdk-8-jdk

Si una versión de Java está instalada, podemos verificar qué versión es ejecutando:

root@kitploit:~
> java -version

El código de versión debe comenzar con 1.8 (por ejemplo, 1.8.0_242), y la Máquina Virtual debe ser "Server VM" (indicando que el JDK completo está instalado, en lugar de solo el entorno de ejecución). Si es así, hemos terminado con Java. Si no, podemos verificar si Java 8 JDK está instalado en nuestra plataforma pero no está seleccionado actualmente, listando las máquinas virtuales Java instaladas mediante:

root@kitploit:~
> update-java-alternatives --list

Si Java 8 JDK aparece, podemos usar el mismo comando para configurar Java 8 JDK como la implementación Java predeterminada.

root@kitploit:~
> sudo update-java-alternatives --set java-1.8.0-openjdk-amd64

De lo contrario, necesitamos realizar la instalación completa como se muestra al principio. Desafortunadamente, 'update-java-alternatives' a veces no tiene éxito, indicado por mensajes de "error". Si surge tal caso, podemos usar 'update-alternatives' para configurar interactivamente qué máquina virtual Java es seleccionada por 'java' (intérprete) y 'javac' (compilador).

root@kitploit:~
> sudo update-alternatives --config java
> sudo update-alternatives --config javac

Otros

Con Java 8 configurado, procedemos a instalar las otras dependencias, maven, graphviz más algunas dependencias comunes del SUT. Luego clonamos el repositorio de dtls-fuzzer en una carpeta de nuestra elección, verificando la rama del artefacto. Para terminar, hacemos de esa carpeta nuestro directorio actual.

root@kitploit:~
> sudo apt-get install maven graphviz autotools-dev automake libtool
> git clone  -b usenix20-artifact https://github.com/assist-project/dtls-fuzzer.git ~/dtls-fuzzer
> cd ~/dtls-fuzzer

Instalación de dtls-fuzzer

Primero ejecutamos el script 'prepare.sh' que instala las bibliotecas de las que depende dtls-fuzzer, a saber, dos .jars locales y TLS-Attacker 3.0b. Luego instalamos la herramienta en sí. Los comandos resultantes en un sistema POSIX serán:

root@kitploit:~
> bash prepare.sh
> mvn clean install

Siguiendo estos pasos, se debería haber creado un directorio llamado 'target' que contiene 'dtls-fuzzer.jar'. Esta es nuestra biblioteca ejecutable. A partir de este punto se asume que los comandos se ejecutan desde el directorio raíz de dtls-fuzzer.

Ejecución rápida

Supongamos que queremos generar un modelo para OpenSSL 1.1.1b usando solo PSK (Claves Precompartidas). Una ejecución rápida de dtls-fuzzer es la siguiente.

Primero configuramos el SUT, lo cual se hace automáticamente mediante un script 'setup_sut.sh'.

root@kitploit:~
> bash setup_sut.sh openssl-1.1.1b

Luego seleccionamos un archivo de argumentos de la carpeta 'args/openssl-1.1.1b'. Observamos que hay varios archivos de argumentos para elegir, a saber:

root@kitploit:~
learn_openssl-1.1.1b_all_cert_none_rwalk_incl  
learn_openssl-1.1.1b_all_cert_nreq_rwalk_incl  
learn_openssl-1.1.1b_all_cert_req_rwalk_incl  
learn_openssl-1.1.1b_psk_rwalk_incl

El archivo de argumentos de interés es 'learn_openssl-1.1.1b_psk_rwalk_incl', ya que su nombre indica PSK. Por lo tanto, lo seleccionamos y ejecutamos el fuzzer sobre él. Además, limitamos el número de pruebas a 200, para acortar el tiempo de aprendizaje. Finalmente, para OpenSSL, LD_LIBRARY_PATH debe establecerse en el directorio de la implementación ('suts/openssl-1.1.1b/'). Antes de ejecutar el aprendizaje, quizás queramos ejecutar una prueba simple para verificar que nuestra configuración funciona. Una buena prueba es simplemente completar un handshake. Proporcionamos el archivo de argumentos, junto con una prueba correspondiente de 'examples/tests' como parámetro. Obtenemos:

root@kitploit:~
>  LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl-1.1.1b/learn_openssl-1.1.1b_psk_rwalk_incl -test examples/tests/psk

Si todo va bien, el servidor debería haber impreso "This is a hello message", un mensaje que enviamos después de completar el handshake. Sabiendo que nuestra configuración funciona, ahora podemos iniciar el aprendizaje ejecutando:

root@kitploit:~
> LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl-1.1.1b/learn_openssl-1.1.1b_psk_rwalk_incl -queries 200

Notamos que se ha creado un directorio de salida, 'output/openssl-1.1.1b_psk_rwalk_incl/' para el experimento. Podemos hacer 'ls' en este directorio para verificar el estado actual del experimento (el número de hipótesis generadas...).

root@kitploit:~
> ls output/openssl-1.1.1b_psk_rwalk_incl/

Cuando las cosas van bien

Si todo va bien, después de 20-30 minutos, el directorio de salida debería contener un archivo 'learnedModel.dot'. Podemos visualizar el archivo usando la utilidad 'dot' de graphviz, exportándolo a .pdf y abriendo el .pdf con nuestro visor de .pdf favorito.

root@kitploit:~
> dot -Tpdf output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.dot > output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.pdf
> evince output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.pdf

Finalmente, podemos usar 'trim_model.sh' para generar una versión mejor/recortada del modelo. Esto se puede hacer de la siguiente manera:

root@kitploit:~
> bash trim_model.sh --output output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.dot output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.dot 
> dot -Tpdf output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.dot > output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.pdf
> evince output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.pdf

Ahora podemos determinar la conformidad del sistema verificando el modelo contra la especificación...

Cuando las cosas van mal

Al hacer 'ls' en el directorio de salida, podríamos encontrar 'error.msg'. Eso es una señal de que el experimento falló y el aprendizaje terminó abruptamente. En tales casos, mostrar el contenido revela la razón detrás del fallo.

root@kitploit:~
> cat output/openssl-1.1.1b_psk_rwalk_incl/error.msg

Tenga en cuenta que aún se puede verificar la conformidad en la última hipótesis generada, siempre que los hallazgos potenciales sean validados contra el sistema (como deberían ser de todos modos).

Configuración del SUT

Proporcionamos un script para configurar el SUT. Este script descarga los archivos fuente, instala algunas dependencias (jvm) y construye el SUT. Para ver los SUTs para los cuales se proporciona configuración automática, ejecute:

root@kitploit:~
> bash setup_sut.sh

Para configurar, por ejemplo, la implementación tinydtls de Contiki-NG, ejecute:

root@kitploit:~
> bash setup_sut.sh ctinydtls

El script generará dos carpetas en el directorio raíz de dtls-fuzzer.

  • 'suts', donde se despliegan los binarios del SUT
  • 'modules', donde se despliegan las dependencias

Desafortunadamente, automatizar la configuración del SUT es un proceso complicado, por lo que tomamos los siguientes atajos. Para SUTs Java (JSSE, Scandium) no construimos las implementaciones, en su lugar usamos los .jars compilados del directorio 'experimentos/suts'. Tenga en cuenta que el código fuente de estos SUTs Java (aplicaciones servidor) está disponible públicamente en línea, ver Scandium y JSSE, que también es el caso de PionDTLS. La instalación automática de dependencias puede solicitar acceso 'sudo'. Esto ocurre para GnuTLS, que depende de bibliotecas externas como nettle, y para TinyDTLS de Eclipse, que depende de autoconf. Finalmente, no proporcionamos configuración automática/archivos de argumentos para NSS y PionDTLS debido a lo complicado que es la configuración para estos sistemas.

Solución de problemas

Si las cosas en el proceso de configuración dejan de funcionar, eliminar la carpeta 'suts' (o la carpeta 'suts/SUT' específica del SUT) y volver a ejecutar el script de configuración puede resolver el problema. Además, en caso de fallo de construcción, el código fuente de la implementación aún debería estar descargado en el directorio 'suts'. Una solución alternativa es construir la implementación manualmente. Siempre que la implementación esté construida, nuestra configuración debería funcionar.

Por la presente damos un árbol incompleto de dependencias que tienen los diversos SUTs. Aquellas en cursiva son dependencias que 'setup_sut.sh' intenta instalar usando acceso 'sudo'.

  • GnuTLS:
    • m4
    • pkg-config
    • nettle
  • TinyDTLS de Eclipse
    • m4
    • autoconf
  • WolfSSL
    • m4
    • autoconf
    • libtool
  • nettle
    • m4
    • pkg-config
  • autoconf
    • aclocal
      • automake
      • autotools-dev

Aprendizaje de una configuración de SUT

Ahora estamos listos para aprender una configuración de SUT. Se proporcionan archivos de argumentos para varias configuraciones de SUT en el directorio 'args' ubicado en el directorio principal de dtls-fuzzer. Cada nombre de archivo de argumentos describe la configuración del experimento (SUT, alfabeto, autenticación) como se describe por los nombres de las carpetas de salida en 'experiments/results/'. Para iniciar el aprendizaje para un SUT usando un archivo de argumentos, ejecute:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/nombre_sut/archivo_arg

La carpeta de salida se almacenará en un directorio 'output' generado.

Adaptaciones de parámetros

Límite de pruebas

En comparación con los experimentos del artículo, aumentamos el tiempo de espera de respuesta para varios SUTs como adaptación a hardware menos potente. Para acortar el tiempo de aprendizaje, sugerimos disminuir el límite de pruebas del algoritmo de recorrido aleatorio de 20000 a 5000. Esto se puede hacer mediante:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/nombre_sut/archivo_arg -queries 5000

Esto sobrescribirá la configuración del límite en el archivo de argumentos. Excepto para GnuTLS, PionDTLS y JSSE, esperamos que el aprendizaje produzca los mismos modelos para este límite inferior.

Parámetros de temporización

El tiempo puede convertirse en un problema, causando no determinismo, seguido de una terminación abrupta con un archivo 'error.msg' informativo. En tales casos, hay dos parámetros que se pueden ajustar:

  1. el tiempo de espera de respuesta (tiempo esperado por cada respuesta antes de concluir que el servidor está en silencio);
  2. el tiempo de espera de inicio (tiempo esperado para que el servidor inicie).

Estos parámetros se pueden ajustar sobrescribiendo (probablemente con un valor más alto) las configuraciones correspondientes en el archivo de argumentos:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/nombre_sut/archivo_arg -timeout nuevo_tiempo_espera_respuesta -runWait nuevo_tiempo_espera_inicio

Para evitar problemas relacionados con la temporización, sugerimos ejecutar experimentos en una máquina suficientemente potente. La causa principal del no determinismo es que el SUT tarde demasiado en iniciar o generar una respuesta. Esta probabilidad disminuye a medida que se proporciona más potencia de cálculo.

Tiempo de aprendizaje

Podemos desear terminar automáticamente los experimentos después de un cierto período, particularmente experimentos que no se espera que terminen nunca. Establecer este período es posible a través del parámetro límite de tiempo al que se le asigna la duración máxima que se permite que se ejecute el experimento. Esta duración se proporciona en formato ISO 8601. Para limitar el tiempo de ejecución de un experimento a 60 minutos, ejecutaríamos:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/nombre_sut/archivo_arg -timeLimit "PT60M"

Experimentos concurrentes y colisiones de puertos

Es posible ejecutar múltiples experimentos a la vez siempre que los servidores estén configurados para escuchar en diferentes puertos. Podemos optar por lanzar cada experimento en una terminal separada. Alternativamente, podemos lanzar experimentos en una sola terminal usando la utilidad 'disown':

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/ctinydtls/learn_ctinydtls_psk_rwalk 1>/dev/null 2>&1 & disown

Sin embargo, ejecutar más de unos pocos (>2) pone una carga adicional en la máquina. También aumenta la probabilidad de fallo de aprendizaje debido a una colisión accidental de puertos. En la mayoría de las configuraciones, los servidores están configurados para escuchar en algún puerto fijo a través de localhost, las configuraciones proporcionadas en 'args' usan puertos fijos distintos. Para configuraciones JSSE y Scandium, la configuración es diferente. En cada prueba, el SUT lanza un servidor escuchando en un puerto elegido dinámicamente y comunica el puerto a través de sockets TCP a dtls-fuzzer. Esto tiene la ventaja de notificar a dtls-fuzzer cuando el servidor está listo para recibir paquetes (careciendo de esto, dtls-fuzzer tendría que esperar ciegamente una cantidad arbitraria de tiempo para que el servidor se inicie). La desventaja es que el puerto asignado podría ser el mismo que algún puerto fijo de un experimento diferente, en el que un hilo del servidor se ha detenido recientemente y no se ha iniciado un nuevo hilo aún (lo que significa que el puerto fijo podría ser utilizado en la asignación dinámica). Para evitar esta forma de colisión, recomendamos ejecutar experimentos de Scandium y JSSE por separado de todos los demás.

Configuraciones sugeridas

Sugerimos las siguientes configuraciones para las cuales la construcción automática es confiable, el aprendizaje es más rápido o se han encontrado errores interesantes. Asegúrese de configurar el SUT antes de ejecutar el comando proporcionado. Notará que nos centramos en configuraciones PSK cuando sea posible. Esto se debe a que PSK con contraseñas pequeñas requiere significativamente menos tiempo de procesamiento que cualquier otro mecanismo de cifrado.### OpenSSL 1.1.1b Cualquier configuración de openssl-1.1.1b (por ejemplo, 'args/openssl-1.1.1b/learn_openssl-1.1.1b_all_cert_req_rwalk_incl') puede probarse. Los experimentos terminan rápidamente (menos de un día), ejercitando todos los algoritmos de intercambio de claves. Comando para la configuración que requiere certificado de cliente usando todos los algoritmos de intercambio de claves (PSK, RSA, ECDH, DH):

root@kitploit:~
> LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl-1.1.1b/learn_openssl-1.1.1b_all_cert_req_rwalk_incl -queries 5000

Nota: al aprender OpenSSL es necesario apuntar la variable LD_LIBRARY_PATH al directorio de instalación.

MbedTLS 2.16.1

Cualquier configuración de mbedtls-2.16.1 puede usarse por las mismas razones que OpenSSL. Los experimentos tardan más en completarse ya que el SUT es más lento. Comando para la configuración con autenticación de certificado de cliente deshabilitada usando todos los algoritmos de intercambio de claves:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/mbedtls-2.16.1/learn_mbedtls_all_cert_none_rwalk_incl -queries 5000

Contiki-NG TinyDTLS usando PSK

En el apéndice aparece una versión editada del modelo obtenido para esta configuración. Podemos usar un límite de pruebas bajo de 2000 ya que el alfabeto de entrada es pequeño, facilitando las pruebas.

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/ctinydtls/learn_ctinydtls_psk_rwalk -queries 2000

WolfSSL 4.0.0 usando PSK

Para WolfSSL proporcionamos una configuración PSK para la cual el aprendizaje debería terminar relativamente rápido.

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/wolfssl-4.0.0/learn_wolfssl-4.0.0_psk_rwalk -queries 2000

GnuTLS 3.6.7 con autenticación de cliente deshabilitada

La versión más reciente de GnuTLS que analizamos produjo modelos compactos y agradables. Desafortunadamente, habilitar la autenticación de cliente provocó un fuerte aumento en el número de pruebas requeridas. Sugerimos una configuración que la deshabilite para acortar el tiempo de aprendizaje:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/gnutls-3.6.7/learn_gnutls-3.6.7_all_cert_none_rwalk_incl -queries 2000

Scandium PSK (antes de las correcciones de errores)

En el artículo aparece una versión editada del modelo obtenido para esta configuración. El modelo expone errores importantes; desafortunadamente, el experimento es largo. El experimento no debe ejecutarse en paralelo con experimentos que no involucren Scandium o JSSE. Comando:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/scandium-2.0.0/learn_scandium-2.0.0_psk_rwalk -queries 2000

JSSE 12.0.2 con autenticación requerida

En el artículo aparece una versión editada del modelo obtenido para esta configuración. El modelo expone errores importantes. El experimento no debe ejecutarse en paralelo con experimentos que no involucren Scandium o JSSE. Tenga en cuenta que el aprendizaje para JSSE no finaliza/converge, construyendo hipótesis con cada vez más estados. Por lo tanto, configuramos los experimentos de JSSE para que terminen automáticamente después de un día (dos días en el artículo). Comando para intercambio de claves RSA:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/jsse-12/learn_jsse-12_rsa_cert_req_rwalk_incl 

En lugar de un aprendizaje arduo, es posible que simplemente queramos probar si se puede completar un handshake en esta configuración sin enviar ningún mensaje de certificado. Esto se puede hacer ejecutando:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/jsse-12/learn_jsse-12_rsa_cert_req_rwalk_incl -test examples/tests/rsa

Analizando resultados

Una vez finalizado el aprendizaje, los elementos a analizar en el directorio de salida son:

  • 'statistics.txt', estadísticas del experimento como el número total de pruebas, tiempo de aprendizaje;
  • 'nondet.log', registros del comportamiento no determinista encontrado; si todo fue bien, debería estar vacío;
  • 'learnedModel.dot', el modelo aprendido (o hipótesis final) generado tras la terminación exitosa;
  • 'hyp[0-9]+.dot', hipótesis intermedias;
  • 'error.msg', en caso de que ocurra algo malo que detenga el aprendizaje. También se genera si el experimento de aprendizaje se agota.

Visualizando el modelo

El modelo aprendido en formato .dot se puede visualizar usando la biblioteca graphviz, mediante conversión a .pdf:

root@kitploit:~
> dot -Tpdf learnedModel.dot  > learnedModel.pdf

Desafortunadamente, a medida que los modelos crecen en tamaño, los .pdf generados con este método se vuelven cada vez más difíciles de leer. Por ello, desarrollamos/utilizamos/importamos scripts de poda a los que se accede mediante 'trim_model.sh'. El script proporciona información de uso ejecutando:

root@kitploit:~
> bash trim_model.sh

Recomendamos usar el script en su forma más básica, que es:

root@kitploit:~
> bash trim_model.sh learnedModel.dot 

El script:

  1. compactifica estados y etiquetas de entrada/salida
  2. colorea las rutas que llevan a la finalización del handshake
    • el usuario debe entonces determinar si los handshakes son legales según la configuración
  3. fusiona grupos de 3 o más transiciones que conecten los mismos estados y tengan las mismas salidas pero diferentes entradas, bajo la entrada 'Other'
  4. (opcionalmente) poda los estados desde los cuales ya no se puede completar un handshake (particularmente útil para JSSE)
  5. (opcionalmente) posiciona las transiciones que conectan los mismos estados en una sola arista

(5) requiere instalar la biblioteca personalizada mypydot Python 3 que se encuentra en 'experiments\scripts'. Todos los demás pasos usan 'sed' simple más la biblioteca Java dot-trimmer. Se incluye un .jar para esta biblioteca en 'experiments\scripts'.

Tutorial general de dtls-fuzzer

Mostrando la página de ayuda

Ejecute:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -help

Aprendiendo implementaciones DTLS

La cantidad de opciones puede ser abrumadora. Para aprender una implementación de servidor DTLS, solo es necesario especificar algunas opciones, a saber: "-connect ip_address:port", que es la dirección donde el servidor DTLS en ejecución está escuchando. Todas las demás opciones se establecen en valores predeterminados, incluido el alfabeto.

Ejecución de aprendizaje única

Para lanzar una ejecución de aprendizaje para una implementación de servidor local existente, por ejemplo, escuchando en el puerto 20000, ejecute:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000

Probablemente habrá problemas con este tipo de aprendizaje. El aprendizaje requiere que sea posible reiniciar el servidor después de cada prueba. Algunos servidores mantendrán cierto estado de una prueba a otra. Esto puede provocar no determinismo durante el aprendizaje, por lo que un mejor enfoque es lanzar un nuevo hilo de servidor en cada prueba utilizando un comando proporcionado. El hilo del servidor se termina una vez que se ejecuta la prueba, asegurando un reinicio adecuado. Ejemplo para OpenSSL:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -cmd "openssl s_server -accept 20000 -dtls1_2"

Con tantos parámetros, los comandos pueden volverse muy largos. dtls-fuzzer utiliza JCommander para analizar argumentos, que también puede leer parámetros de un archivo. Vaya a 'experiments/args' para ver ejemplos de argumentos. Para proporcionar un archivo de argumentos a dtls-fuzzer, indíquelo como parámetro precedido por "@". También puede agregar otros argumentos explícitos a los comandos (que sobrescribirán los del archivo de argumentos)

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @arg_file ...parámetros de sobrescritura...

Aprendizaje por lotes

Para lanzar un lote de ejecuciones de aprendizaje, se puede utilizar el script 'launcher.py' en 'experiments/scripts'. Proporcionado un directorio con archivos de argumentos, la herramienta lanzará un proceso de aprendizaje para cada archivo de argumentos.

root@kitploit:~
> python3 experiments/scripts/launcher.py --jar target/dtls-fuzzer.jar --args args_folder

Ejecutando un conjunto de pruebas

Antes de ejecutar experimentos de aprendizaje, ayuda verificar que los argumentos estén configurados correctamente, particularmente los parámetros de temporización. Con ese fin, dtls-fuzzer puede ejecutar un conjunto de pruebas personalizado (colección de pruebas) sobre el SUT y proporcionar un resumen de las salidas. Esta funcionalidad también se puede utilizar al diagnosticar experimentos de aprendizaje fallidos, es decir, averiguar qué salió mal.

Para ejecutar el conjunto de pruebas en un servidor usando el alfabeto predeterminado, puede ejecutar:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file

Para ejemplos de archivos de prueba, vaya a 'examples/tests'. Un archivo de prueba comprende una lista de entradas separadas por nuevas líneas. Las pruebas están separadas por líneas nuevas vacías. El final de cada prueba es el final del archivo o una línea nueva vacía. "#" se usa para comentar una línea.

Si tiene un modelo/especificación, también puede ejecutar el conjunto de pruebas y comparar la salida con la de una especificación.

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file -specification model

El número de veces que se ejecutan las pruebas es configurable mediante el parámetro '-times', que por defecto es 1. Configurarlo a un número alto ayuda a detectar no determinismo en las configuraciones de aprendizaje, comparando la salida de cada prueba.

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file -times 10

Finalmente, si tiene el archivo de argumentos para un experimento de aprendizaje, puede usarlos para ejecutar pruebas en el SUT involucrado simplemente agregando los argumentos de prueba necesarios:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @learning_arg_file -test test_file
Descargar herramienta