Continuamos con el Challenge de Hack The Box llamado «jscalc» de dificultad Fácil y categoría Web.

Te dejo al final del post un resumen de todo lo trabajado en este CTF. 🙂

La forma de iniciar los challenges es igual que cuando nos conectamos a una máquina del laboratorio de HTB, en este post te cuento paso a paso cómo conectarte con la VPN de la plataforma e iniciar la conexión.

Una vez nos dan el host de la máquina o web víctima, lo que hacemos es ejecutarla en navegador para ver qué resuelve:

Vemos una calculador hecha en js que utiliza eval().

¿Qué hace exactamente eval()?

La función eval() en JavaScript es un método que evalúa una cadena de texto como código JavaScript y la ejecuta.

Aunque puede parecer una herramienta poderosa, su uso en aplicaciones web es extremadamente peligroso debido a la facilidad con la que puede ser explotada, especialmente en un entorno como una calculadora web, donde el usuario controla directamente la entrada.

eval() toma un string como entrada y lo ejecuta como código JavaScript. Por ejemplo:

eval("2 + 2"); // Devuelve 4

Si el string contiene cualquier otro código JavaScript válido, también lo ejecutará:

eval("alert('Hola!')"); // Muestra una alerta

Es decir,

  • Cuando el usuario introduce una fórmula como 2+3*4, la función eval() interpreta el string como código JavaScript y devuelve el resultado X.
  • El problema radica en que eval() ejecuta cualquier código que el usuario ingrese sin restricciones, lo que abre la puerta a inyecciones maliciosas.

La calculadora mediante eval() permite la ejecución de código arbitrario

eval() no distingue entre una fórmula matemática válida y código malicioso.

Un atacante podría enviar código malicioso como:

eval("require('fs').readFileSync('/etc/passwd')"); 

y le permitiría ejecutar comandos, acceder a archivos del sistema, o incluso comprometer todo el servidor.

En el caso del Challenger con esta calculadora:

  • eval() está siendo usado para procesar directamente las entradas del usuario, como fórmulas matemáticas (2+3*4).
  • Si como atacantes ingresamos un código malicioso en la respuesta de la aplicación, pordremos ejecutarlo en el servidor.

Vamos a probarlo entonces…

Si interceptamos la petición web que va a ejecutar la calculadora mediante Burpsuite, y enviándolo al Repeater, podremos inyectar el código siguiente que nos permitirá ejecutar comandos de forma remota RCE. Si el servidor es capaz de interpretarlo, lo que ocurrirá es que se listará el contenido del directorio raíz del servidor.

{
  "formula": "require('fs').readdirSync('/')"
}

Al hacerlo vemos que efectivamente nos devuelve:

Y nos encontramos con el ficheros «flag.txt», por lo que vamos a modificar la solicitud anterior para que ejecute directamente el fichero y nos printee la flag:

{
  "formula": "require('fs').readFileSync('/flag.txt', 'utf8')"
}

Esto convierte a la calculadora en un vector de ataque crítico.

RESUMEN

En este CTF hemos trabajado con una calculadora web hecha en JavaScript que usaba la función eval(), una práctica insegura que ejecuta directamente el código introducido por el usuario.

Esta vulnerabilidad nos permitió inyectar código malicioso porque el servidor no validaba correctamente las entradas. Gracias a esto, ejecutamos comandos del sistema y usamos el módulo fs de Node.js para explorar el sistema de archivos del servidor.

Finalmente, localizamos y leímos el archivo flag.txt, que contenía la solución del reto.
Para lograrlo, utilizamos Burp Suite como herramienta principal, que nos permitió interceptar las peticiones enviadas al servidor, modificarlas y enviar código malicioso en el parámetro "formula".

Con el payload adecuado (require('fs').readFileSync()), conseguimos leer el archivo sensible.

Este CTF demuestra la importancia de evitar funciones inseguras como eval() y validar siempre las entradas del usuario para proteger aplicaciones contra ataques.

Otros posts relacionados