Power belongs to the people who take it

(Español) Cybercamp 2019 – Free Wifi (Forense)

Sorry, this entry is only available in European Spanish. For the sake of viewer convenience, the content is shown below in the alternative language. You may click the link to switch the active language.

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 Comments

  1. zulu_blackhat

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

  2. Rods k rosad

    Hack wifi

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

© 2024 ironHackers

Theme by Anders NorenUp ↑