What is this?
This is my writeup from the Større Faglige Opgave, a multi-day technical challenge handed out as part of the application process for the offensive security positions at Forsvarets Efterretningstjeneste (FE), through their Hackerakademi programme.
The Hackerakademi recruits and trains operators for the Danish foreign intelligence service. The application process consists of an IQ assessment, a smaller practice challenge (Operation Bad Primate), and finally the Større Faglige Opgave, the main technical evaluation.
You can read more about the programme at hackerakademi.dk/about and the practice challenge at hackerakademi.dk/challenge.
This writeup covers only the Større Faglige Opgave, not the practice challenge.
The scenario
The brief was framed as an operation against a fictional IoT device named DDING-3000, an “enterprise-grade Internet Service Bell” deployed at a fictional hotel. The device functioned as a network-connected reception bell with an integrated fingerprint reader, and the objective was to attack one of three exposed components in order to ultimately exfiltrate the fingerprint data.
The three attack vectors offered:
netupsrv- a custom file upload protocol and its serverupdate2d- a third-party update unpackerembedded femtium- the fingerprint reader’s own CPU running a Fenix kernel
Each vector was meant to be approached with three objectives in mind: exploitation, persistence, and exfiltration.
How it was handed out
The challenge was delivered as a VM containing three files:
README.md- initial instructionsu5fs.pdf- reference manual for a custom filesystem (U5FS)operation.u5fs- a disk image in that format
The first task was to build a tool capable of extracting files from the U5FS image. The actual challenge material, including the briefing, attack vector descriptions, and supporting files, were only revealed after successfully implementing an extractor and unpacking the image.
What I worked on
My primary attack vector was netupsrv. Through traffic analysis of a
provided pcap file and reverse engineering of the netup server binary, I
reconstructed the protocol and built a working client capable of every
operation the protocol supports, including read operations not exposed by
the official client.
I then found a spool directory escape via a path.Clean quirk involving
trailing slashes, which allowed arbitrary file writes outside the
intended sandbox.
As a secondary vector I attacked update2d, where I found command
injection in its handling of system() calls with unsanitized input from
update files. Combined with the netupsrv escape, this gave me a chain
ending in RCE via a custom u2d file that spawned a reverse shell, the
foundation for both persistence and exfiltration.
The full report below documents:
- My U5FS extractor implementation (source in
/src/U5FS_Extractor/) - Protocol reconstruction of NetUp through reverse engineering
- The spool directory escape and how I found it
- The update2d command injection chain
- A working proof-of-concept that delivers a reverse shell end-to-end
Source code
The full source code (U5FS extractor, NetUp client, exploitation scripts, and u2d forging tool) is available as a zip archive:
The archive structure mirrors the paths referenced throughout the writeup, and each subdirectory contains its own README.
Feedback from FE
After submitting my work I emailed Hackerakademi asking for feedback. They replied that due to the volume of submissions they couldn’t give detailed feedback, but they could confirm that my submission was good, however other participants performed better. They encouraged me to keep an eye on fe-ddis.dk for other IT roles at FE, and to keep practicing.
A note on what I cannot share
The original challenge materials, the U5FS image, the netup binary, the pcap file, and so on, are property of FE and won’t be redistributed here. The writeup focuses on my methodology, findings, and code. Snippets of protocol behaviour and binary analysis are included where necessary to explain reasoning.
The writeup itself is in English.