ØxOPOSɆC | Underground Leaks - Part III

ØxOPOSɆC | Underground Leaks - Part III

This level starts with the email message where the last level ended:

When we go to the link at the end of the message we see a simple HTML page that contains a <meta> tag that uses the http-equiv attribute:

<html>
   <body>
      <b>Please wait while you are being redirected...</b>
      <meta http-equiv="refresh" content="5; URL=https://sefod.eu/ctf/0xOPOSEC_0x0E_DTMF_MultiTap.pdf" />
   </body>
</html>

As expected, 5 seconds after the page is loaded, we're redirected to https://sefod.eu/ctf/0xOPOSEC_0x0E_DTMF_MultiTap.pdf.

After a bit of trial and error, we realise that the PDF is hiding more than meets the eye (indeed "things are not always what they seem"):

$ curl -X GET https://sefod.eu/ctf/0xOPOSEC_0x0E_DTMF_MultiTap.pdf > out.file

$ file out.file
out.file: DOS/MBR boot sector

The file contains a boot loader, which we can check by searching for the magic bytes (0x55 0xAA) in position 0x1FE.


Getting through the front door

We can run load this boot loader using qemu, an "open source machine emulator and virtualizer":

$ qemu-system-i386 -fda out.file
SeaBIOS (version 1.14.0-1)


iPXE (http://ipxe.org) 00:03.0 CA00 PCI2.10 PnP PMM+07F8F4C0+07ECF4C0 CA00



Booting from Hard Disk...
Boot failed: could not read the boot disk

Booting from Floppy...

After "Booting from Floppy" we can see the intro screen:

A few seconds later this authentication form is displayed:

Since I didn't know the credentials, I decided to try and dump the machine's RAM using qemu-monitor's dump-guest-memory utility:

Then, by simply running strings on the memdump file I realised that the credentials were root:toor.


12 days of OPOTEAM

When we enter the credentials we see this screen:

Let's check out the options!

"o" is for 0xOPOLEAKS

Simply by combining all of the letters that shouldn't be uppercase we get the flag: FLAG{SONHOSWILLKEEPYOUDREAM}

"f" is for Xmas Flag

Not really a challenge, more of a Christmas message. Flag is FLAG{COSCOROES_IS_THE_REAL_DEAL}.

"v" is for Vault

On this challenge, the prompt would only display a certain char when it matched the exact position of the flag, which meant we had to "brute-force" the solution manually, re-entering partial flags until we got the final one.

Flag is  FLAG{RABANADAS_GIVE_STRENGTH_TO_BRUTEFORCE}.

"g" is for Glitch in the Matrix

Using CyberChef we can see the instructions encoded in the example Shellcode: B40EB041CD10.

B40E                            MOV AH,0E
B041                            MOV AL,41
CD10                            INT 10

So, it seems like this code is able to print "A" since its hex value (41) is being moved to the AL register on the second operation. This means that most likely all we need to do is change the second operation with one that retrieves the value stored in 0X1337.

Since I'm not very familiar with shellcode I started by trying to retrieve the original instructions from x86 Assembly code:

$ nano glitch.asm

;glitch.asm
[SECTION .text]
global _start

_start:
        mov ah, 0x0E
        mov al, 0x41
        int 0x10

Then I converted the Assembly code to object code (.o) using NASM, and then generated the final executable using ld.

$ nasm -f elf glitch.asm
$ ld -m elf_i386 -s -o glitch glitch.o

$ ls -la
...
-rw-r--r-- 1 vagrant vagrant  192 Dec 12 07:01 glitch.asm
-rw-r--r-- 1 vagrant vagrant  432 Dec 12 07:06 glitch.o
-rwxr-xr-x 1 vagrant vagrant 4244 Dec 12 07:10 glitch

Finally, I disassembled the executable  using objdump, which gets us its corresponding shellcode:

$ objdump -d glitch

glitch:     file format elf32-i386

Disassembly of section .text:
08049000 <.text>:
 8049000:	b4 0e                	mov    $0xe,%ah
 8049002:	b0 41                	mov    $0x41,%al
 8049004:	cd 10                	int    $0x10

Great, we got the original shellcode! Now we can simply change the Assembly code to retrieve the value stored at 0x1337.

$ nano glitch.asm

;glitch.asm

[SECTION .text]
global _start

_start:
        mov ah,0x0E
        mov al,[0x00001337]
        int 0x10

Let's do the same process as before to get the shellcode:

$ nasm -f elf glitch.asm
$ ld -m elf_i386 -s -o glitch glitch.o
$ objdump -d glitch

glitch:     file format elf32-i386
Disassembly of section .text:

08049000 <.text>:
 8049000:	b4 0e                	mov    $0xe,%ah
 8049002:	a0 37 13 00 00       	mov    0x1337,%al
 8049007:	cd 10                	int    $0x10

The shellcode is b40ea037130000cd10, let's see what happens when we enter it on the program:

By repeating the process for the following addresses I got the complete flag: FLAG{filhoses_will not keep_you_fit}.


Taking the hint

A short while after the challenge was published, a new hint was released, a Portuguese sketch show that uses the word kunami.

With a bit of Googling I found something interesting, the Konami Code. After trying the sequence ↑↑↓↓←→←→BA on the menu I got:


Unfortunately, I didn't get all of the flags, but you can check out the Github project and official write-up here.