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
Muchisimas gracias por subir este tipo de cosas, se agradece mucho los writeups.
Hack wifi