← Writeups

Skills Assessment — JavaScript Deobfuscation / API Keys

Deobfuscación de un packer 'p,a,c,k,e,d' para extraer una API key oculta: enumeración de JS, análisis de eval() obfuscado y replicación del flujo HTTP.

Resumen de la Cadena de Explotación

Target: 154.57.164.69:30116

Paso Acción Resultado
1 GET / → inspección del HTML Identificar api.min.js
2 Ejecutar el JS ofuscado Flag de enumeración
3 Deobfuscar el eval() Recuperar variable flag
4 Replicar el POST /keys.php Obtener secret key en hex
5 Decodificar hex + POST con key= Flag final

Q1 — Identificar el archivo JavaScript

Study the HTML code of the webpage and identify the JavaScript file used.

Respuesta: api.min.js

Un GET / devuelve la página index. El código fuente HTML expone la referencia directa al script:

<script src="api.min.js"></script>

Q2 — Ejecutar el JavaScript ofuscado

Run the JavaScript code to see if it does anything interesting.

Respuesta:

HTB{j4v45cr1p7_3num3r4710n_15_k3y}

api.min.js es un packer "p,a,c,k,e,d" (obfuscación por eval() con reemplazo de tokens). Al ejecutarlo dispara un console.log() con la flag de enumeración.

Nota: las cadenas vacías del keyword array son falsy, por lo que if (k[c]) omite reemplazar los tokens j y n, dejándolos como letras literales en la salida.


Q3 — Deobfuscar y recuperar la variable flag

Apply deobfuscation techniques to retrieve the 'flag' variable.

Respuesta:

HTB{n3v3r_run_0bfu5c473d_c0d3!}

Al des-envolver el packer, el código revela una función apiKeys() con la variable flag partida en segmentos que se concatenan:

function apiKeys() {
    var flag = 'HTB{' + 'n' + '3v3r_' + 'run_0' + 'bfu5c' + '473d_' + 'c0d3!' + '}',
        xhr = new XMLHttpRequest(),
        _0x437f8b = '/keys' + '.php';
    xhr['open']('POST', _0x437f8b, !![]);
    xhr['send'](null);
}
console['log']('HTB{' + 'j' + '4v45c' + 'r1p7_' + '3num3' + 'r4710' + 'n_15_' + 'k3y}');

Concatenando los segmentos de flag se obtiene HTB{n3v3r_run_0bfu5c473d_c0d3!}.


Q4 — Replicar la funcionalidad para obtener la secret key

Replicate the main functionality of the deobfuscated code to get a secret key.

Respuesta:

4150495f70336e5f37333537316e365f31355f66756e

El código deobfuscado ejecuta un POST a /keys.php. Replicarlo con la misma petición devuelve la key:

POST /keys.php HTTP/1.1
Host: 154.57.164.69:30116

Q5 — Decodificar la key y enviar el flag

Identify the key's encoding, decode it, and POST it as key=DECODED_KEY.

Respuesta:

HTB{r34dy_70_h4ck_my_w4y_1n_2_HTB}

La key es hexadecimal. Decodificación:

41 50 49 5f 70 33 6e 5f 37 33 35 37 31 6e 36 5f 31 35 5f 66 75 6e
API_p3n_73571n6_15_fun

Decoded key: API_p3n_73571n6_15_fun

curl -X POST -d "key=API_p3n_73571n6_15_fun" http://154.57.164.69:30116/keys.php

La petición con key=API_p3n_73571n6_15_fun devuelve la flag final HTB{r34dy_70_h4ck_my_w4y_1n_2_HTB}.


Análisis del Vector

El lab condensa el flujo real de un análisis estático de JS de un sitio: las claves de API nunca deben embeberse en el cliente. Aquí la key viaja en el bundle ofuscado, y el endpoint que la valida (/keys.php) acepta la key como parámetro sin autenticación adicional — dos malas prácticas que encadenadas entregan el secreto. La deobfuscación manual (o herramientas como de4js/jsnice) reduce el eval() a código legible en segundos, demostrando que la ofuscación por packing es un control de bajo valor contra un analista decidido.