Tengucon OSINT CTF

Recently, I’ve had the extreme pleasure of designing and setting up the challenges for the OSINT category of the Tengucon CTF.

If you want to learn more about Tengucon, you can do so here: https://tengucon.org/

Sadly, I was not in attendance for the event, but I was there in spirit. It was my first time designing and implementing CTF challenges from scratch, so I really hope the players enjoyed it.

Let’s look at the solutions !

1. Operation Monodrome

The challenge starts with this PDF file, which is a mission briefing. In there, we find a list of names, along with an email, or a specific account. For simplicity, we will immediately take a look at the last account of the list, William N., aka “wall0wW1spr”.

exiftool

exiftool for this PDF doesn’t tell us much

So far, here are our suspects:

  • Kamel Ghali: https://www.sans.org/profiles/kamel-ghali
  • Mathilde “kallone” R.: https://github.com/kallone
  • Tim Krach: https://www.linkedin.com/in/tim-krach/
  • William “wall0wW1spr” N.: [email protected]

If we look for this username on Github, we quickly find this page. We can confirm it’s the same person, as they use the same email for their commits.

will’s github account

There is a few interesting repos, but we find one in particular that is always interesting. It is the dotfiles repository, containing personal configs and things like that.

will’s dotfiles

Digging through the logs, we can see there was, at one point, a .ssh/config file:

Host github
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa-ww
    IdentitiesOnly yes

Host gitlab
    HostName gitlab.com
    User git
    IdentityFile ~/.ssh/id_rsa-wn
    IdentitiesOnly yes

This means they also have a gitlab account ! Using the User API, it is then trivial to find the account, since they have the email set as public.

We then finally reach the gitlab page, with the user wnds0r.

finding will’s account on gitlab

This is our first flag: tenguctf{wnds0r}

will’s gitlab account

2. Digging through files

Thank you for your work ! We will name our target WINDSOR, as it seems fitting. Can you find WINDSOR’s phone number ?

The second challenge prompts us to find our target’s phone number. We keep digging.

Looking at WINDSOR’s repositories, we find one that has many interesting files:

interesting repo

In the tools/ directory, we find a file called kit.zip, among pentesting scripts:

kit.zip in tools directory

If we download it and try to unzip it, we can see it is password-protected.

kit.zip password-protected

We can attempt to brute-force it, like so:

zip2john -s kit.zip

# we recover the following hash:
# kit.zip:$pkzip$5*1*1*0*8*24*7c7d*766435f74e9c312b27fa65c1697ea6fec27c84cb65ba0d6bce020947b1a406d71a64cee4*1*0*8*24*7c7d*d2d0db92d6537f8ad2c78adedf2f4940b96ffcb02b3a749ecf8f9100a0462f2150b651bd*1*0*8*24*7c7d*f352fc24a77bcee4568fd21ba9b2f0f0d7e6f51de48b9c771d0e95c3a0fc937fb90b447b*1*0*0*24*7c7d*95dd5ac34bbd1553b1804ff5d5eef80a2c2ce321e5e6a9c059eabd0e15321fafd3a1f402*2*0*8f*9a*e4d4a018*2fe9*46*8*8f*7ca3*b6f2ef639b52e6ca231322a28daf48e59cdb4af6639b7007b337e836b4e910d5a6944b1f62bcfc6bdbf76d8f063f920641dbd150a2311b1fc4274d494ec587bc425cc99dc51e9d84f2f6506cf7fa95fbd25c6a18e4155545335cfa9dba4839612f81791382a1fe040efcf962faec427b5fbe2462431b4a7c07b7e72f28c511c438b51f8fd925542b959777c262173f*$/pkzip$::kit.zip:kit/TODO.txt, kit/CssSheets/style.css, kit/index.html, kit/images/facebook-logo.png, kit/images/f.png:kit.zip

john --wordlist=/usr/share/wordlists/rockyou.txt hash

We pretty much immediately find that the password is william, after which we can unzip the archive.

Inside, we find a Facebook login page, similar to a phishing kit:

phishing kit

But, more interestingly, we find a TODO.txt file:


Add Telegram bot integration:

1. create account (phone number: 07700900382)
2. add PHP back-end
3. make bot link up with login page
4. start spraying:)

Here, in plaintext, we find our phone number, which is the flag: tenguctf{07700900382}

3. Email intercept

Thank you. This is very valuable intelligence. Using this information, we were able intercept an email, but it is GPG-encrypted. Recover its content, we are looking for a domain, phone number, or another email.

For the third challenge, we’re provided a gpg-encrypted text. Our goal is to recover the contents and find critical intel from it.

Looking again at the repositories we have, we can find that a GPG-private key was mistakenly pushed.

oops indeed

With it, we can try to decrypt the message. However, most GPG (this one too) require a password. To address that, you can simply brute-force with rockyou.txt and you will find the password for the key. Or, you can simply re-use the same password as before, which will work.

This will allow you to see the contents of the message:

From: William Nottingham <[email protected]>
To: djnn <[email protected]>
Subject: Re: working together

Thanks. I'll be in touch after I'm back from vacation.

	From: djnn <[email protected]>
	To: William Nottingham <[email protected]>
	Subject: Re: working together

	It's ready. You can find the address by checking DNS record on MZWGCZYK.tengu.fyi

	Talk to you soon


		From: djnn <[email protected]>
		To: William Nottingham <[email protected]>
		Subject: Re: working together

		Hey,

		I own a couple of domains for throwaway things. I can set it up myself.
		Once it's ready, I'll just send you the logs, or something.

		Just make sure to keep it very low-key.

			From: William Nottingham <[email protected]>
			To: djnn <[email protected]>
			Subject: Re: working together

			What's up ?

			Yeah, that could work. To be honest, I feel like this kind of thing is just easy money.
			We can spray the exploit before it gets patched, and deploy a couple of kits.

			I'll get a leak site going, not sure when yet. We cannot put it on the clear net though, it's too risky.

			Do you have an idea ?

It talks about DNS records. Using the nslookup command, we can check all types of records for this address. And, if we check TXT records, we find:

$ nslookup -type=TXT MZWGCZYK.tengu.fyi

To make it a bit more obvious, you can also use this CLI tool to make the TXT query

Since it is one of WINDSOR’s projects, it gives a bit of a hint.

third flag

This is our third flag: tengu{egya2aoovdhihddgsluq5dovomq3t6y2qexsull2j5zbzbupsdhoqjad.onion}

4. Peeling the layers…

A .onion website ! How interesting. Let’s visit it and find out more. What is the hacking group’s name ?

We need Tor to access it. It just looks like a normal website at a first glance. (Although somewhat ironic)

i am a little silly, not gonna lie

However, if we look for the sitemap (or robots.txt), we can find a mention for another page: /backdoor.html. It is quite common to find assets here, as it instructs scrappers not to visit (or index) those pages. Unfortunately, only few scrappers respect this directive nowadays.

robots.txt

Indeed, if we visit it, we find a secret page !

the secret page

All the way at the bottom of the text, the name of the hacking group is given. This is our fourth flag: tenguctf{ev1l_M0d3}

5. GEOINT

We have enough evidence to proceed with an arrest. It’s time to locate WINDSOR. Based on his accounts, identify where he could be right now.

As the name suggests, we’re doing some Geolocalisation here.

We need to find our target’s approximate location. Going back to his initial nickname, we find an associated soundcloud account, with an interesting picture as the banner:

soundcloud account

However, we cannot simply right-click to recover the banner.

You will need to Open “Inspect element”, reload the page, and grab the request that downloads the image. Here is it, for your convenience:

the banner

Zooming a lot, to the left, we see the famous Red Torii gates that are often found in Japan. However, we can see those are in the water, which is not typical. There is also a JR ferry. An LLM chatgot like Gemini or ChatGPT, will advise you that this is likely Miyajima, near Hiroshima, in Japan.

This is our fifth flag: tenguctf{Miyajima}

6. Just like on Netflix…

We are going to prepare a Social Engineering campaign using another of our agents, AGENT AERO.

To better approach WINDSOR, we need to find more intelligence about him. Since he’s a chess fan, find what is his favorite opening with white ?

We can use on of those OSINT services to get our target’s chess.com account. Or, we can simply look for the username on Chess.com

We can confirm they’re owned by the same person because it shares the same profile image as the Gitlab account.

chess.com account

Looking at the history of games, we can find that pretty much all games played with white start with the move d2-d4. This is called the Queen’s Game, or the Queen’s Gambit.

tragic chess history

i know, i suck at chess.

Multiple flags are accepted here:

  • tenguctf{QueensGambit}
  • tenguctf{QueensGame}
  • tenguctf{QueensPawn}
  • tenguctf{d2d4}

7. Preparing the arrest

AGENT AERO managed to make contact with WINDSOR. Our target is currently on vacation, but we will back soon. We need to arrest him at the airport, before he vanishes. Find which flight is WINDSOR going to take from the conversation:

AERO: Thanks for the games.

WINDSOR: You bet. Lichess is kinda nice. Had no idea you didn't need an account to play.

WINDSOR: Better for OPSEC.

AERO: Yeah.

WINDSOR: Alright. Thanks, man. I'll talk to you when I'm back in Europe.

AERO: When will that be ? I need to work soon, I need the money.

WINDSOR: Ahhh I understand. Don't worry, I have a couple of targets lined up. :)

AERO: When will we start man ?

WINDSOR: I'm back in Europe next week-end.

AERO: Are you flying from where you are ? I didn't know there was an international airport there)

WINDSOR: Haha, no. I'll take the ferry.

WINDSOR: Going to another country for two days. Then I'll fuck off from there on Friday.

AERO: That's cool. Are you taking a private jet, mr businessman ?))

WINDSOR: Lol, I wish. No. I have 38 hours of flight and a layover in Taiwan.

WINDSOR: Fucking kill me.

WINDSOR: At least I land in Heathrow, which is reasonnable.

AERO: wow

WINDSOR: Yeah. Overnight layover in Taiwan though. Not too bad, maybe I'll go out.

WINDSOR: Alright man, I'll talk to you later

AERO: Alright, see you)

We need to both flights WINDSOR will take to reach London. Please respond with the following format: FL123-FL123. Then, we can proceed with the arrest.

Reading the conversation, we can find the following information:

  • WINDSOR is flying on a friday, from a country adjacent to Japan,
  • To get there, he is taking the ferry from Japan,
  • The flight makes him land at Heathrow, with an overnight layover in Taiwan,
  • The flight takes 38 hours in total (layover included)

The most common country to reach by ferry from Japan is South Korea. You can get the ferry from Fukuoka to Busan. Proceeding by elimination, we should be able to determine that the flight is the following:

flight path

This is our final flag:

tenguctf{CI189-CI81}

Bonus challenge

Since I had a bit of time, I also contributed a reverse-engineering challenge. It is based on a rootkit I wrote (which I should probably finish one day…).

It is quite simple, it hooks kill, and if you pass it a succession of 19 kill calls with SIGUSR1, it will reveal a cool ASCII art ! Here is the solver:

#!/usr/bin/env bash


echo "[+] sending sequence"

# WhatIsYourPizzaStory -- if you don't know what the flag means, ask kamel;D
ASCII_CODES=(87 104 97 116 73 115 89 111 117 114 80 105 122 122 97 83 116 111 114 121)

for new_code in "${ASCII_CODES[@]}"; do
    echo "[+] killing [$new_pid]."
    kill -10 $new_pid
    sleep .2
done

I also made a little demo, that is available on Youtube.

Final words

And that concludes the series of challenges ! I hope the difficulty was linear, with easy challenges at the beginning, and it would gradually be harder. Feel free to reach out to give me your impressions if you attended, I am genuinely curious of whether it was too guessy or not.

But I will say that in general, making CTF challenges was really fun, and I hope I can keep doing that in the future.

See you next time :)~

djnn.sh

offensive security & software engineering


CTF solutions !

2025-11-22