Natas 8

Enunciado

Al igual que en uno de los niveles anteriores, en este nivel debemos proporcionar un código secreto para lograr la flag del siguiente nivel. Para ello, se nos muestra el código fuente.


El código fuente es el siguiente:

 1 
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?
$encodedSecret = "3d3d516343746d4d6d6c315669563362";

function encodeSecret($secret) {
    return bin2hex(strrev(base64_encode($secret)));
}

if(array_key_exists("submit", $_POST)) {
    if(encodeSecret($_POST['secret']) == $encodedSecret) {
    print "Access granted. The password for natas9 is <censored>";
    } else {
    print "Wrong secret";
    }
}
?>

Análisis del código

  1. En primer lugar se realiza la inicialización de variables y declaración de funciones.
    1. Se inicializa la variable $encodedSecret. Tiene un valor hexadecimal.
    2. Luego está la definición de la función encodeSecret(). Esta función recibe un parámetro de entrada, lo convierte en base64 a través de la función base64_encode(), invierte la cadena de caracteres mediante la función strrev() y la convierte, byte a byte, a hexadecimal con bin2hex().
  1. En la línea 8 empieza el flujo de ejecución:
    1. Si en los parámetros recibidos por el método POST existe el parámetro submit:
    2. Si el resultado de aplicar la función encodeSecret() sobre el valor del parámetro POST "secret" es igual a la variable $encodedSecret, se conseguirá el acceso y la respectiva flag.

Resolución

Por tanto, para conseguir el secreto correcto, deberemos aplicar el proceso inverso de la función encodeSecret() a la variable $encodedSecret:
  1. Convertir la cadena hexadecimal a formato binario
  2. Revertir el string
  3. Aplicar un decoding de base64
En Python, utilizaremos la función unhexlify() de la librería binascii para el punto nº 1 y la función b64decode() de la librería base64 para el nº 3:

1 
2
3
4
5
6
7
8
9
#!/usr/bin/env python3

from binascii import unhexlify
from base64 import b64decode

# Reverse the encoding process
encoded_secret = "3d3d516343746d4d6d6c315669563362"
decoded_secret = b64decode(unhexlify(encoded_secret)[::-1])
print("[*] The secret is {}".format(decoded_secret))

El código final unificado, encargado de realizar la petición POST con el secreto adecuado y conseguir la flag es el siguiente:

 1 
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/env python3

import requests
import re
from binascii import unhexlify as hex2bin
from base64 import b64decode

# Level config. parameters
user = "natas8"
passwd = "DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe"
url = "http://natas8.natas.labs.overthewire.org/"

# Configuring the session var. with the params.
session = requests.Session()
session.auth = (user, passwd)

# Reverse the process for the encoded secret
encoded_secret = "3d3d516343746d4d6d6c315669563362"
decoded_secret = b64decode(hex2bin(encoded_secret)[::-1])
print("[*] The secret is {}".format(decoded_secret))

params = {
    "secret": decoded_secret,
    "submit": "Submit Query"
}

response = session.post(url, data=params)

# Get the content
content = (response.content).decode("utf-8")
print(content)

# Strip the flag
flag = re.findall(r"([a-zA-Z\d]{32})", content)[1]

# Write the flag to a file
f = open("{}.flag".format(user), "w+")
f.write(flag)
f.close()

print("[+] The flag for level {} is {}".format(int(user[-1]) + 1, flag))

Ejeutamos y obtenemos la flag para natas9:

root@kali:~/ctf/natas/natas8# python3 natas8.py 
[*] The secret is b'oubWYf2kBq'
[+] The flag for level 9 is W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl

Comentarios