stamin4
  • whoami
  • HTB Academy
    • Introduction to Academy
    • Learning Process
    • Vulnerability Assessment
    • Web Requests
    • Introduction to Networking
    • Linux Fundamentals
    • Brief Intro to Hardware Attacks
    • Setting Up
    • Using the Metasploit Framework
    • Security Incident Reporting
    • Introduction to Web Applications
    • JavaScript Deobfuscation
    • Attacking Web Applications with Ffuf
    • Windows Fundamentals
    • File Inclusion
  • HTB Machines
    • Windows
      • 🟢Easy
      • 🟠Medium
      • 🔴Difficult
      • 🟣Insane
    • Linux
      • 🟢Easy
        • Cap
      • 🟠Medium
      • 🔴Difficult
      • 🟣Insane
  • OverTheWire
    • Bandit
      • Nivel 0
      • Nivel 1
      • Nivel 2
      • Nivel 3
      • Nivel 4
      • Nivel 5
      • Nivel 6
      • Nivel 7
      • Nivel 8
      • Nivel 9
      • Nivel 10
  • Base de datos
    • SQL
      • SELECT queries 101
      • Queries with constraints (Pt. 1)
      • Queries with constraints (Pt. 2)
      • Filtering and sorting Query results
      • Simple SELECT Queries
      • Multi-table queries with JOINs
      • OUTER JOINs
      • A short note on NULLs
      • Queries with expressions
      • Queries with aggregates (Pt. 1)
      • Queries with aggregates (Pt. 2)
      • Order of execution of a Query
      • Inserting rows
      • Updating rows
      • Deleting rows
      • Creating tables
      • Altering tables
      • Dropping tables
  • PortSwigger
    • Path Traversal
  • Dockerlabs
    • Trust
    • Firsthacking
    • Upload
Powered by GitBook
On this page
  • Overview
  • Source Code
  • Deobfuscation
  • HTTP Requests
  • Decoding
  • Skills Assessment
  1. HTB Academy

JavaScript Deobfuscation

PreviousIntroduction to Web ApplicationsNextAttacking Web Applications with Ffuf

Last updated 1 year ago

Overview

En este módulo, aprendí qué es la ofuscación de código y con qué fines se utiliza, así como herramientas para llevarlo a cabo como BeautifyTools o JavaScript Obfuscator Tool.

En primer lugar, se enseña cómo encontrar el código fuente HTML de una página y localizar el código JavaScript. También se explica cómo desofuscar código y analizar su función principal. En el camino vemos un paneo general de solicitudes HTTP para ser capaces de replicar la función del código ofuscado.

Finalmente, se tocan métodos de codificación como base64, hexadecimal y ROT13.


Source Code

Para empezar, desplegamos el target. Abrimos el navegador e indicamos la IP y el puerto por el que corre el servicio web. Esta es la página:

Con Ctrl + U vemos el código fuente; en un comentario se encuentra la flag.

</html>
<!DOCTYPE html>

<head>
    <title>Secret Serial Generator</title>
    <style>
        *,
        html {
            margin: 0;
            padding: 0;
            border: 0;
        }

        html {
            width: 100%;
            height: 100%;
        }

        body {
            width: 100%;
            height: 100%;
            position: relative;
            background-color: #6fb3eb;
        }

        .center {
            width: 100%;
            height: 50%;
            margin: 0;
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            color: white;
            font-family: "Helvetica", Helvetica, sans-serif;
            text-align: center;
        }

        h1 {
            font-size: 144px;
        }

        p {
            font-size: 64px;
        }
    </style>
    <script src="secret.js"></script>
    <!-- HTB{4lw4y5_r34d_7h3_******} -->
</head>

<body>
    <div class="center">
        <h1>Secret Serial Generator</h1>
        <p>This page generates secret serials!</p>
    </div>
</body>

</html>

Deobfuscation

En el propio código fuente de la página, podemos ver un archivo secret.js.

Si lo abrimos, veremos código ofuscado. No podemos identificar de primeras qué acciones realiza este código:

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 }('g 4(){0 5="6{7!}";0 1=8 a();0 2="/9.c";1.d("e",2,f);1.b(3)}', 17, 17, 'var|xhr|url|null|generateSerial|flag|HTB|1_4m_7h3_53r14l_g3n3r470r|new|serial|XMLHttpRequest|send|php|open|POST|true|function'.split('|'), 0, {}))

La función generateSerial está enviando una petición por el método POST a /serial.php, sin tramitar ninguna data.

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.

</html>
<!DOCTYPE html>

<head>
    <title>Secret Serial Generator</title>
    <style>
        *,
        html {
            margin: 0;
            padding: 0;
            border: 0;
        }

        html {
            width: 100%;
            height: 100%;
        }

        body {
            width: 100%;
            height: 100%;
            position: relative;
            background-color: #6fb3eb;
        }

        .center {
            width: 100%;
            height: 50%;
            margin: 0;
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            color: white;
            font-family: "Helvetica", Helvetica, sans-serif;
            text-align: center;
        }

        h1 {
            font-size: 144px;
        }

        p {
            font-size: 64px;
        }
    </style>
    <script src="api.min.js"></script>
</head>

<body>
    <div class="center">
        <h1>API Keys</h1>
        <p>API Keys control panel</p>
    </div>
</body>

</html>

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

Es una cadena codificada en hexadecimal.

La decodificamos:

$ curl -s -X POST 83.136.249.57:59043/keys.php | xxd -p -r
API_p3n_73571n6_15_fun

Ahora tramitamos una petición por POST a /keys.php e incluimos la cadena ya decodificada en el parámetro key para obtener la flag.

$ curl -s -X POST 83.136.249.57:59043/keys.php -d "key=API_p3n_73571n6_15_fun"
HTB{r34dy_70_h4ck_my_w4y_1n_*_***}

Para desofuscarlo, lo pasamos por .

Si lo , la cadena que obtenemos es HTB{j4v45cr1p7_3num3r4710n_**_***}.

Desofuscamos el código con y obtenemos la siguiente flag: HTB{n3v3r_run_0bfu5c473d_*****}.

unPacker
ejecutamos
unPacker