Power belongs to the people who take it

Cybercamp 2019 – Free Wifi (Forense)

CyberCamp 2019

Con esta entrada continuamos con los writeups resolviendo los retos de la fase clasificatoria online de la CyberCamp 2019.
En este caso es un reto sencillo de Forense.

Enunciado

En este reto se nos pasa una memoria flash (flash.bin) de un dispositivo que envia información robada por wifi. Se nos dice además que el SSID es ddwrt.

Solución

Lo primero que hacemos es buscar en la evidencia la cadena “ddwrt” con grep.

strings flash.bin | grep -A 5 -B 5 "ddwrt"

Como veis hay una cadena larga sospechosa. Es un Base64:

ZmxhZ3ttZDUoY29uY2F0KDEwQnl0ZXNIZXgoMHgzOTNjNjEpLDEwQnl0ZXNIZXgoMHgxMzlmODYpLDEwQnl0ZXNIZXgoMHgxMGRjYmYpKSl9

echo 'ZmxhZ3ttZDUoY29uY2F0KDEwQnl0ZXNIZXgoMHgzOTNjNjEpLDEwQnl0ZXNIZXgoMHgxMzlmODYpLDEwQnl0ZXNIZXgoMHgxMGRjYmYpKSl9' | base64 -d

Tras decodificar la cadena, obtenemos:

flag{md5(concat(10BytesHex(0x393c61),10BytesHex(0x139f86),10BytesHex(0x10dcbf)))}

Al ver esto y darle unas cuantas vueltas nos damos cuenta que debemos leer los 10 primeros bytes desde cada offset en hexadecimal, concatenarlos y pasarlos a MD5.
Para solucionarlo podemos usar cualquier lenguaje de programación con las instrucción Fseek que sitúa el puntero de lectura/escritura de un archivo en la posición indicada:

Python3

from hashlib import md5
# https://stackoverflow.com/questions/35883044/python-2-7-11-how-to-read-big-binary-file-from-at-hex-offset
def read_from_hex_offset(file, hex_offset):
    offset = int(hex_offset, base=16)
    file.seek(offset, 0)
    return file.read(10).hex()

# flag{md5(concat(10BytesHex(0x393c61),10BytesHex(0x139f86),10BytesHex(0x10dcbf)))}
f = open('flash.bin', 'rb')
list = ['0x393c61', '0x139f86', '0x10dcbf']
result = ''
for i in list:
    result += read_from_hex_offset(f, i)

print('flag{%s}' % md5(result.encode()).hexdigest())

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/md5.h>

// flag{md5(concat(10BytesHex(0x393c61),10BytesHex(0x139f86),10BytesHex(0x10dcbf)))}
void TenBytesHex(FILE *f, int offset, unsigned char *s){
    unsigned char out[20] = "";
    int i;
    fseek(f, offset, SEEK_SET);
    fread(s, sizeof(char), 10, f);
    for(i=0;i<10;i++){
        sprintf(out, "%s%02x", out, s[i]);
    }
    strcpy(s, out);
}

int main(int argc, char *argv[]){

    FILE *f;
    int i;
    unsigned char s1[20];
    unsigned char s2[20];
    unsigned char s3[20];
    unsigned char flag[60];
    unsigned char result[MD5_DIGEST_LENGTH];

    f = fopen("flash.bin", "rb");
    TenBytesHex(f, 0x393c61, s1);
    TenBytesHex(f, 0x139f86, s2);
    TenBytesHex(f, 0x10dcbf, s3);
    fclose(f);

    sprintf(flag, "%s%s%s", s1, s2, s3);
    fprintf(stdout, "flag{");
    MD5(flag, strlen(flag), result);
    for(i = 0; i < MD5_DIGEST_LENGTH; i++)
      fprintf(stdout, "%02x", result[i]);
    fprintf(stdout, "}\n");

    return EXIT_SUCCESS;
}
gcc solver.c -o solver -lssl -lcrypto
./solver

¿Me ayudas a compatirlo?

2 comentarios

  1. zulu_blackhat

    Muchisimas gracias por subir este tipo de cosas, se agradece mucho los writeups.

  2. Rods k rosad

    Hack wifi

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

© 2024 ironHackers

Tema por Anders NorenArriba ↑