--- title: "404CTF 2025: USB51" excerpt: "Identifying information present in a data leak using a USB packet capture." tags: [ctf, forensics] --- Someone tried to exfiltrate data from our space agency, and we need to know what it was. To do this, we're given a USB packet capture in `pcapng` format. Opening it using Wireshark was my first reflex: ``` 1 0.000000 host 2.3.2 USBMS 95 SCSI: Test Unit Ready LUN: 0x00 2 0.000037 2.3.2 host USB 64 URB_BULK out 3 0.000054 host 2.3.1 USB 64 URB_BULK in 4 0.000150 2.3.1 host USBMS 77 5 1.173244 host 1.1.0 USBHUB 64 SET_FEATURE Request [Port 3: PORT_SUSPEND] ``` As we can see, there is some communication going on between the host and a couple of USB devices. When ordering the packets by Length, we find something interesting: ``` 43 3.364572 host 2.3.2 USB 48192 URB_BULK out 73 3.381362 host 2.3.2 USB 576 URB_BULK out 67 3.380135 host 2.3.2 USB 576 URB_BULK out 61 3.378983 host 2.3.2 USB 576 URB_BULK out ``` One packet is clearly standing out from the others; its size is 48192 bytes, whereas the others are usually 576 bytes or less. Let's investigate this one: we can copy its raw information as a hex stream: ``` 255044462d312e370a25c3a4c3bcc3b6c39f0a322030206f626a0a3c3c2f4c656e6774682033203020522f46696c7465722f466c6174654465636f64653e3e0a73747265616d0a789c9d5a4d8fe3b811bdf7af30905b0e1ab2f80d180624cb0eb2c81e266920872087ddd9d960379b1964308b24ff3eaf8a12f561aa65ed34bac7966592557cf5 [redacted for simplicity] ``` This hex can then be transcribed to ASCII-printable characters with a tool like CyberChef: ``` @µC*ä.ÿÿS.....-.é©.h....§* ..ÿÿÿ.¼...¼..........................%PDF-1.7 %äüöÃ. 2 0 obj <> [redacted for simplicity] ``` Looks like we found a PDF file! Let's look at the hex dump of a sample PDF to see how it's made on the inside: ``` 00000000 25 50 44 46 2D 31 2E 37 0A 25 C3 A4 %PDF-1.7.%.. 0000000C C3 BC C3 B6 C3 9F 0A 32 20 30 20 6F .......2 0 o 00000018 62 6A 0A 3C 3C 2F 4C 65 6E 67 74 68 bj.<>.stream.x [redacted for simplicity] 00001D08 0A 3E 3E 0A 73 74 61 72 74 78 72 65 .>>.startxre 00001D14 66 0A 36 38 39 34 0A 25 25 45 4F 46 f.6894.%%EOF 00001D20 0A . ``` We can see that a normal PDF file starts with `%PDF-1.7` and ends with `%%EOF`, followed by a newline character (in the dump, byte `0A`). We can now trim our hex dump to these borders, and then dump the whole hex into a fresh PDF, to examine it like a human would do: ``` $ xxd -r -p pdf_hex.txt > extracted.pdf $ open extracted.pdf ``` When opening that PDF file, we see a report of the space agency, containing a binary piece of information, that we can convert to ASCII easily: ``` 00110100 00110000 00110100 01000011 01010100 01000110 01111011 01010111 00110011 01011111 01100011 00110000 01001101 01000101 01011111 01001001 01001110 01011111 01110000 00110011 01100001 01000011 00110011 01111101 ``` We have the flag! `404CTF{W3_c0ME_IN_p3aC3}`