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 tokensjyn, 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.