function generateSerial() {
var flag = "HTB{1_4m_7h3_53r14l_**********}";
var xhr = new XMLHttpRequest();
var url = "/serial.php";
xhr.open("POST", url, true);
xhr.send(null);
}
Ya podemos visualizar la flag.
HTTP Requests
El ejercicio de esta sección consiste en lanzar una petición por POST a /serial.php. Esto lo podemos hacer mediante la herramienta cURL.
$ curl -s -X POST 94.237.53.58:35660/serial.php
N2gxNV8xNV9hX3MzY3IzN19tMzU1NGcz
La petición nos devuelve una cadena codificada en base64.
Decoding
Decodificamos la cadena que obtuvimos en el ejercicio previo.
$ curl -s -X POST 94.237.53.58:35660/serial.php | base64 -d
7h15_15_a_s3cr37_m3554g3
Para obtener la flag, tramitamos una petición por POST a /serial.php y enviamos la data que acabamos de decodificar en el parámetro serial.
$ curl -s -X POST 94.237.53.58:35660/serial.php -d "serial=7h15_15_a_s3cr37_m3554g3"
HTB{ju57_4n07h3r_r4nd0m_******}
Skills Assessment
Desplegamos el nuevo target y nos dirigimos a la página web.
Con Ctrl + U analizamos el código fuente. El nombre del archivo JavaScript que se está utilizando es api.min.js.
Hacemos click en el archivo para ver su contenido.
Nos encontramos con código js ofuscado.
eval(function (p, a, c, k, e, d) { e = function (c) { return c.toString(36) }; if (!''.replace(/^/, String)) { while (c--) { d[c.toString(a)] = k[c] || c.toString(a) } k = [function (e) { return d[e] }]; e = function () { return '\\w+' }; c = 1 }; while (c--) { if (k[c]) { p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]) } } return p }('t 5(){6 7=\'1{n\'+\'8\'+\'9\'+\'a\'+\'b\'+\'c!\'+\'}\',0=d e(),2=\'/4\'+\'.g\';0[\'f\'](\'i\',2,!![]),0[\'k\'](l)}m[\'o\'](\'1{j\'+\'p\'+\'q\'+\'r\'+\'s\'+\'h\'+\'3}\');', 30, 30, 'xhr|HTB|_0x437f8b|k3y|keys|apiKeys|var|flag|3v3r_|run_0|bfu5c|473d_|c0d3|new|XMLHttpRequest|open|php|n_15_|POST||send|null|console||log|4v45c|r1p7_|3num3|r4710|function'.split('|'), 0, {}))
function apiKeys() {
var flag = 'HTB{n'+'3v3r_'+'run_0'+'bfu5c'+'473d_'+'*****'+'};
var xhr = new XMLHttpRequest();
var _0x437f8b = '/keys' + '.php';
xhr.open('POST', _0x437f8b, true);
xhr.send(null);
}
console.log('HTB{j'+'4v45c'+'r1p7_'+'3num3'+'r4710'+'n_**_'+'***}');
Tenemos que analizar el código y entender su funcionalidad para poder replicar lo que está haciendo y obtener una clave secreta.
Si observamos el código, veremos que la función apiKeys está tramitando una petición por POST al recurso /keys.php sin enviar ninguna data.
Replicamos esta acción con cURL por consola y obtenemos la clave:
$ curl -s -X POST 83.136.249.57:59043/keys.php
4150495f70336e5f37333537316e365f31355f66756e