Descripción del reto:

El cliente tiene control absoluto. Elude la autenticación y lee la clave para obtener la bandera (flag).

Contenido descargable del reto:

El archivo descargable del reto contiene el ejecutable bypass.exe.


Enumeración estática

Para determinar el tipo de archivo con el que estamos trabajando utilizamos el comando file Bypass.exe, lo que nos proporciona información básica sobre el archivo.

Comando files

La información obtenida es la siguiente:

  • PE32: Portable Executable de 32-bit
  • Executable (console): Se trata de una aplicación de consola.
  • Mono/.Net assembly: Es un ensamblado creado con el framework Mono, una implementación de código abierto de .NET. Esto indica que probablemente la aplicación esté desarrollada en C# o VB.NET.
  • for MS Windows: Para sistemas operativos Windows.

Para obtener más información del ejecutable, podemos utilizar Detect It Easy (DIE), una herramienta que identifica el compilador, empaquetador (packer), protector o cualquier otra herramienta utilizada para crear un archivo ejecutable.

Detect It Easy (DIE) está disponible en su repositorio de GitHub:
https://github.com/horsicq/Detect-It-Easy

Enumeración estática con Detect It Easy (DIE)

Con este análisis podemos saber:

  • Formato del archivo: PE32 (Portable Executable, 32-bit)
  • Sistema operativo: Windows 95 en adelante
  • Arquitectura: i386 (32-bit)
  • Tipo de aplicación: Consola (CLI)
  • Compilador/Linker: Microsoft Linker 8.0
  • Lenguaje: C#
  • Biblioteca: .NET Framework v4.0.30319

A continuación, se procederá a extraer las cadenas de texto presentes en el archivo utilizando el comando strings, que nos permitirá obtener una lista de las cadenas contenidas en el ejecutable. También se puede realizar esta tarea mediante Detect It Easy en su modo avanzado.

strings bypass.exe > strings_bypass.txt

alt text

El análisis no ha proporcionado información relevante, aunque se puede observar que se menciona la versión 4.5.2 de .NET Framework, mientras que DIE identificó la versión 4.0.30319.

No se ha obtenido información relevante de las cadenas contenidas en el archivo.


Análisis de la aplicación

Dado que el ejecutable está desarrollado en C# bajo el framework .NET, es posible descompilar y leer el código fuente casi en su totalidad. Las aplicaciones .NET tienden a preservar su estructura, lo que facilita su interpretación mediante herramientas de descompilación.

Una de las mejores herramientas para descompilar, depurar y modificar ejecutables de .NET en Windows es dnSpy, disponible en su repositorio de GitHub: https://github.com/dnSpy/dnSpy.

dnSpy assembly explorer

Análisis del código

La aplicación consta de nueve clases numeradas del 0 al 7, más la clase module, que actúa como el constructor del módulo.

  • Clase 0: Contiene la lógica principal de la aplicación.
  • Clases de la 1 a la 4: Devuelven una variable que proviene de la clase 5.
  • Clase 5: Contiene un conjunto de variables que obtiene llamando a la clase 7 y posteriormente a la clase 6.
  • Clase 7: Realiza operaciones de descifrado que retornan un array de bits.
  • Clase 6: Convierte un array de bits a un tipo específico.

Para encontrar el punto de entrada de la aplicación, haz clic derecho sobre HTBchallenge y selecciona “Ir al punto de entrada”, el punto de entrada se encuentra en el método 0 de la clase 0.

HTB Bypass Assembly clase 0

El método 0 llama al método 1, que retorna un valor de tipo booleano, el cual se almacena en la variable flag. Luego, esta variable se asigna a flag2.

El condicional if (flag2) invoca al metodo 2 si es verdadero; en caso contrario, muestra un mensaje en la consola y el método se llama a sí mismo.

HTB Bypass Assembly clase 1

El método 1 escribe y lee valores de la consola que no utiliza y siempre devuelve false.

HTB Bypass Assembly clase 2

El método 2 compara la entrada de texto almacenada en la variable b con el valor de la clase 5, variable 3, y asigna el resultado a flag. Si el valor de flag es verdadero, se muestra en la consola; de lo contrario, el método se llama a sí mismo.


Explotación

Ahora que comprendemos la lógica de la aplicación, es posible establecer los puntos de interrupción en los métodos 0 y 2 para modificar el flujo de ejecución.

Los puntos de interrupción permiten pausar la ejecución de un programa en un punto específico para inspeccionar el estado de las variables y el flujo del programa.

Para agregar un punto de interrupción, haz clic en el margen izquierdo de la línea donde deseas detener la ejecución. Aparecerá un círculo rojo indicando que el punto de interrupción ha sido establecido. También puedes presionar F9 para añadir un punto de interrupción en la línea actual.

Inciar la depuración

Presiona el botón de inicio o la tecla F5 para comenzar la depuración. La aplicación pedirá un nombre de usuario y una contraseña, lo cual se realiza desde el método 1 que siempre devuelve false.

alt text

Si los puntos de interrupción están correctamente establecidos, la ejecución se detendrá en la línea 11. En la parte inferior de dnSpy podrás observar el valor de las variables locales. Modifica el valor de flag2 a true y presiona F5.

Para cambiar el valor de una variable local, haz doble clic sobre el valor actual, escribe el nuevo valor y presiona Enter para guardarlo. El valor modificado aparecerá resaltado.

El programa ahora pedirá una clave secreta.

alt text

Cuando la ejecución se detenga en el método 2, modifica el valor de flag2 a true y pulsa F10 para avanzar la ejeución paso a paso.

HTB Bypass flag

La flag ha sido obtenida exitosamente, la he censurado para seguir con las normas de HTB.


Lecciones aprendidas

El uso de herramientas como file y Detect It Easy para obtener información sobre los binarios.

La posibilidad de descompilar aplicaciones .NET con dnSpy para comprender su lógica interna y modificar su comportamiento.