Introduction

Brixel CTF Winter Edition 2020 was the first CTF organized by hackerspace Brixel with callenges in the following categories:

  • Programming
  • Forensics
  • OSINT
  • Internet
  • Reverse engineering / cracking
  • Old tech
  • Cryptography
  • Steganography

The following is a writeup of the challenges I solved.


Are you fast enough?

Category: Programming

Description: Can you program something that is fast enough to submit the solution before the time runs out?

Solution:

When entering the webpage for the challenge we see the following page.

Lets take a look at the source to find out a way to read the random string and enter it in the input field programmatically.

Ok, we got id’s for the random string, the input field and the submit button. Then all we have to do is to write some javascript to do this for us.

document.getElementById('inputfield').value = document.getElementById('rndstring').innerHTML;
document.getElementById('submitbutton').click();

This will do the trick. But we have to execute this code within one second. So lets run window.location = 'http://timesink.be/speedy/index.php' in the console, and right after that we run the javascript we just wrote.

Flag: brixelCTF{sp33d_d3m0n}


Keep walking…

Category: Programming

Description:
This is a challenge to test your basic programming skills.

Pseudo code:
Set X = 1
Set Y = 1
Set previous answer = 1

answer = X * Y + previous answer + 3

After that => X + 1 and Y + 1 (‘answer’ becomes ‘previous answer’) and repeat this till you have X = 525.

The final answer is the value of ‘answer’ when X = 525. Fill it in below.

Example:
5 = 1 * 1 + 1 + 3
12 = 2 * 2 + 5 + 3
24 = 3 * 3 + 12 + 3

Solution:

Pretty straight forward, the following is a implementation in C#.

using System;

namespace Keep_walking
{
    class Program
    {
        static void Main(string[] args)
        {
            var prev = 1;

            for(var i = 1; i <= 525; i++) {
                prev = (i * i) + prev + 3;
            }

            Console.WriteLine(prev);
        }
    }
}

And when we run this we get the flag 48373851


A Song…

Category: Programming

Description: I wrote this song it seems I’m pretty bad at it, but hey! it could get you a flag 🙂

Solution:

Attached to this challenge is the following text.

(intro)
Shout "brixelCTF{" !!!

Brixel is a hackerspace
It's not like any other place

Your skill is hopefully the best
This CTF is the test
put your skill into the test
(-and-) let your score be "blessed"

(chorus)
The challenges are serious
Your skill is mysterious
Build your skill up, up, up (-up,up-)
Knock the challenges down
your skill is true,
your skill is right!
Knock the challenges down
your score is taking flight!

(verse1)
put This CTF into your skill
put Brixel into your Heart (-or not, hey! just chill!-)

the hype is getting to the top,
the beat is ready to drop,
build the hype up!
build the hype up!
build the hype up!

whisper the challenges,
say your score,
Shout the hype, (-and-)
SCREAM YOUR SKILL! (-m-M-M-MONSTERKILL!!-)

(chorus)
The challenges are serious
Your skill is mysterious
Build your skill up, up, up (up,up)
Knock the challenges down
your skill is true,
your skill is right!
Knock the challenges down
your score is taking flight!

(verse2)
Happy Holidays is a wish,
Brixel is wishing you today
Santa is now leaving
(-riding on his sleigh-)

This was fun
This was grand
Turn up your score
Turn up your skill

put your heart into your skill
put your skill into the test
say your score (-because you ARE the best-)

Say Happy Holidays
Say Brixel and "}"

(fin)

This looks like Rockstar source code. Lets try it out in the Rockstar online interpreter.

brixelCTF{
 5
 66
 7236
 34
 66
 14
 }
 Program completed in 70 ms

It worked, so our flag is brixelCTF{5667236346614}


An arduino project

Category: Programming

Description:
I once made this arduino program but forgot what it does.
Unfortunately I lost the schematic that comes with it.
Maybe you can get it running?

Solution:

Here we get an arduino project, opening the file in the Arduino IDE we get the following source code.

int msg[] = {9,0,9,0,9,0,9,0,7,8,3,4,0,7,6,5,4,3,2,0,7,8,6,5,4,2,0,2,3,4,0,7,2,3,8,4,5,0,2,3,4,5,6,7,8,0,7,6,0,7,2,3,8,4,5,0,2,3,4,5,6,7,0,2,3,8,4,5,0,2,3,8,4,5,0,2,3,8,6,5,0};

void setup()
{
  pinMode(2, OUTPUT); //A
  pinMode(3, OUTPUT); //B
  pinMode(4, OUTPUT); //C
  pinMode(5, OUTPUT); //D
  pinMode(6, OUTPUT); //E
  pinMode(7, OUTPUT); //F
  pinMode(8, OUTPUT); //G
  pinMode(9, OUTPUT); //DP
  //COMMON = 5V with 1K resistor
}

void loop()
{
  for (byte i = 0; i < (sizeof(msg)/ sizeof(msg[0])); i++) {
    if(msg[i] > 0) {
      digitalWrite(msg[i],LOW);
        }else{
            delay(500);
            reset();
    }
    }
}

void reset()
{
  for(int p = 2; p < 10;p++)
  {
    digitalWrite(p,HIGH);   
  }
  delay(500);
}

Ok, so we have pin 2-9 set as outputs and some writes to those outputs. Now we need to know what the comments after the pinMode calls means. A search for the values in the comments and arduino leads us to a bunch of articles about seven segment displays. Lets try to map the message to values on a seven segment display.

First of all we need to know what the A, B, C, D, E, F, G and DP pins maps to.

Here we can see what segments each pin maps to. Now its time to map the message to each segment so we easier can map the message to an output number. If we take the msg[] variable and replace each value with the corresponding character from the comments, we end up with the following message.

DP
DP
DP
DP
FGBC
FEDCBA
FGEDCA
ABC
FABGCD
ABCDEFG
FE
FABGCD
ABCDEF
ABGCD
ABGCD
ABGED

And if we map this to what is displayed on the led we get the flag 406798190332


Quizbot

Category: Programming

Description:
Legend has it there’s a flag at the end when you have a perfect score

Solution:

This challenge is another web based challenge.

We need to answer 1000 questions correctly in order to get the flag. When entering an invalid answer we get the correct answer for the previous question.

The questions are always the same and in the same order. So we need to scrape all correct answers and then enter those to be able to get the flag. The following code is using Selenium to control a web browser and first scraping all correct answers before answering all questions.

using System;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Internal;

namespace Quizbot
{
    public static class Program
    {
        private const int NumberOfQuestions = 1000;

        private static void Main()
        {
            var questionArray = new string[NumberOfQuestions];
            var driver = new ChromeDriver {Url = "http://timesink.be/quizbot/index.php"};
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
            
            for (var i = 0; i < NumberOfQuestions; i++)
            {
                ClickSubmitButton(driver);
                var answer = driver.FindElementById("answer");
                questionArray[i] = answer.Text;
            }

            driver.Navigate().GoToUrl("http://timesink.be/quizbot/index.php");

            for (var i = 0; i < NumberOfQuestions; i++)
            {
                var inputField = driver.FindElementById("insert_answer");
                inputField.SendKeys(questionArray[i]);
                ClickSubmitButton(driver);
            }

            Console.WriteLine("Done.");
        }

        private static void ClickSubmitButton(IFindsByName driver)
        {
            var submitButton = driver.FindElementByName("submit");
            submitButton.Click();
        }
    }
}

When completed we get the following message.

Flag: brixelCTF{kn0wl3dg3}


A message from space

Category: Forensics

Description:
I received a message from space
Beam me up scottie1!

Solution:

Attached to this challenge is an audio file. After some investigation it seems that it is an SSTV signal.

So if we use RX-SSTV we should be able to get an image out of the signal.

Flag: brixelCTF{SP4C3L4B}


Lottery ticket

Category: Forensics

Description:
Someone is trying to sell this lottery ticket online, it has the winning numbers but I suspect foul play
Can you tell me which the new numbers are that are photoshopped?
Add them all up, the resulting number is the flag

Solution:

Attached to this challenge is the following image.

Now we have to find out which numbers are photoshopped. Lets check it out in Stegsolve.

Here we can see four numbers that stands out, 42, 88, 25 and 48.

If we sum those values we get the flag 203


Lost evidence

Category: Forensics

Description:
A buddy of mine is in serious trouble. He works for the feds and accidentally deleted a pendrive containing crucial evidence
Can you get it back and tell us what the evidence is?
We need to know what the suspect bought

Solution:

Here we got an NTFS image file we need to analyze. Lets load the image in Autopsy and see what we can find out.

Autopsy found two deleted wave files. Lets extract those so we can take a listen.

As it turns out, both recordings are identical and it is a recording of a bank transfer. We can also hear that a message is entered using DTMF tones. Lets try to decode those tones to their corresponding numbers to see if we can get the message.

First we need to save only the tones for the message so it will be easier to decode them. At the end of the recording we can clearly see them when using an audio editor like Audacity.

Lets save this to a new file and try to decode the tones. For this we can use dtmf-decoder.

python dtmf.py ..\tones.wav
80449903336667771708443302226662222444663302277788441

Now we have the numbers entered, but we still need to map those to characters. To do this we can use the following image.

After mapping we get the message T HX FOR. P T HE COCAINE BRUH. So the flag is brixelCTF{cocaine}


A quick search

Category: OSINT

Description:
Here’s an easy one to start off the OSINT challenges.
I took this photo but forgot the name of this tower.
Can you give me the name?
I remember it started with an E.

Solution:

Attached is an image of some tower. Lets see what we can find using a reverse image search.

Flag: Eben-Ezer


Manhunt #1

Category: OSINT

Description:
My dad is pissed off! He was told by my mother NOT to buy ice cream but he did anyway when she wasn’t looking.
Someone posted this picture on the internet and my mother saw it, man, he is in so much trouble!
I want to know WHO posted this picture, let’s hunt this guy down!

Solution:

Here we got another picture we need to analyze. Lets check out the metadata using Exif & Metadata Viewer.

System:FileName	icecream.jpg
System:FileSize	329275
System:FileModifyDate	2020:12:26 13:45:45+00:00
System:FileAccessDate	2020:12:26 13:45:45+00:00
System:FileInodeChangeDate	2020:12:26 13:45:45+00:00
System:FilePermissions	644
File:FileType	JPEG
File:FileTypeExtension	JPG
File:MIMEType	image/jpeg
File:ExifByteOrder	MM
File:ImageWidth	1536
File:ImageHeight	2048
File:EncodingProcess	0
File:BitsPerSample	8
File:ColorComponents	3
File:YCbCrSubSampling	1 1
IFD0:ResolutionUnit	2
IFD0:YCbCrPositioning	1
ExifIFD:ExifVersion	0231
ExifIFD:ComponentsConfiguration	1 2 3 0
ExifIFD:FlashpixVersion	0100
ExifIFD:OwnerName	Johnny Dorfmeister
Composite:ImageSize	1536x2048
Composite:Megapixels	3.145728

At the ExifIFD:OwnerName we can see a name, so this is probably the person we are looking for.

So our flag is Johnny_Dorfmeister


Manhunt #2

Category: OSINT

Description:
Ah, now you know his name, good. Can you tell me the name of his last employer?

Solution:

If we do a google search on Johnny Dorfmeister we find a link to his LinkedIn profile.

And here we can see his previous employer pishapasha which is the flag.


Manhunt #5

Category: OSINT

Description:
What is he talking about with that deleted page on his twitter account? can you retrieve it somehow?

Solution:

We got a link to his Twitter account on his LinkedIn profile. Lets head over to it and check out his Twitter activity.

Here we find the tweet mentioned in the description. When navigating to the test-page link we can see that it’s removed.

Lets find out if the page is archived somewhere. Lets head over to the Wayback Machine and enter the URL for the test-page.

We got a hit for the 15th of january 2019. Lets take a look at whats archived.

We got the flag w@yb@ck!


Manhunt #6

Category: OSINT

Description:
So he’s a webdesigner huh? I wonder what his customers have to say about his work. In english please!

Solution:

Taking a look at his page at howitshouldbe.be we see some reviews on the start page.

When we translate the russian sentence we get the following.

So the flag is poetry


Manhunt #7

Category: OSINT

Description:
Can you tell me where he lives? Then I can drop some kind words in his mailbox!
Format: brixelCTF{STREET_NUMBER_POSTALCODE_CITY} e.g brixelCTF{examplestreet_15_8500_kortrijk}

Solution:

On his webpage we can find a contact form. When submitting this form we get this message.

From this we can create the flag brixelCTF{Melkvoetstraat_48_3500_Hasselt}


Manhunt #8

Category: OSINT

Description:
so now you know where he lives, can you tell me what was written on his wall in 2013?

Solution:

Lets start by heading over to google maps and check out the street view of his address. When we have found the place lets take a look at the archived images and select 2013.

Our flag is Just_Married


Manhunt #9

Category: OSINT

Description:
Auth. You’re on your own for this 🙂

Solution:

Lets head back to the webpage on howitshouldbe.be. Just below the reviews and the animated gif we can find a small link.

When we click on the link we get the following message.

Ok, lets take a look at the source to see if we can find anything interesting.

<html>
<body>
<title>Auth</title>
<!-- Authentication script by Johnny Dorfmeister. https://github.com/JohnnyDorfmeister/authentication-requests !-->
Eat shit and die...

We got a link to a GitHub repository. Lets take a look at the source code found there.

<html>
<body>
<title>Auth</title>
<?php
if(!isset($_POST['username']))
{
	die("Eat shit and die...");
}
if($_POST['username'] == "johnny" && $_POST['password'] == removed for security reasons)
{
	$_SESSION["loggedin"] = "true";
	include("flag.php");
	die();
}else{
	echo "<form method=\"POST\" action=\"" . $_SERVER['PHP_SELF'] . "\">\n";
	echo "<table align=\"center\">\n";
	echo "	<tr><td>Username: <td><input type=\"text\" name=\"username\"></tr>\n";
	echo "	<tr><td>Password: <td><input type=\"password\" name=\"password\"></tr>\n";
	echo "	<tr><td colspan=2 align=\"right\"><input type=\"submit\" name=\"submit\" value=\"log in\"></tr>\n";
	echo "</table>\n";
	echo "</form>\n";
	die();
}
?>
</body>
</html>

We got the username, but the password is removed. If we take a look at the commit history of the file we can see that there has been two commits. Lets take a look at how the file looked on the first commit.

Great! The password was stored in the commit history, now we have the username and the password. Lets make a request to the auth.php. To do this we can use Postman.

Now we got the response with the flag g1ttern00b


Bird call

Category: OSINT

Description:
I heard this birdcall when walking the other day
Can you give me the LATIN name of this bird species?
Here’s a dutch joke for you: Het is niet de proxi-mus
replace (if any) spaces with underscores (‘_’)

Solution:

For this challenge we get a recording of some birdcall. To figure out what species this is we have to find some way to analyze the recording. If we search for bird from sound we find a page called BirdNET.

Uploading our recording to this service we get the following result.

The recording is of a White Stork (Ciconia ciconia) so the flag is Ciconia_ciconia


Easy

Category: Internet

Description:
On the homepage there is a hidden flag. It’s a Source of easy points!

Solution:

If we take a look at the source of https://ctf.brixel.space/ we can find the following.

<div class="row">
    <div class="col-md-6 offset-md-3" align="center">
        <h1>Brixel CTF winter edition</h1>
        <h8>By <a href="https://www.brixel.be" target="_blank">hackerspace Brixel</a></h5>
        <img class="w-100 mx-auto d-block" style="max-width: 500px;padding: 50px;padding-top: 3vh;" src="/files/3e28cc281e12b29b536038aa7d9b058e/snowman.png" />
        <h3 class="text-center">
            <p>Welkom to the brixel CTF!</p>
        </h3>
        <h6 class="text-center">
            <p>First time? check out our <a href="/guide">guide for new players</a></p>
        </h6>
        <h6 class="text-center">
            <p>Questions or remarks? Find Kevin (kefcom) on the discord server<p>
          	<p>(<a href="https://discord.gg/28uPqr5wmh">Invite link</a>)</p>
        </h6>  
        <h6><b>This is our first public CTF, so please be gentle with the comments!</b></h6>
      	<h6><b>❗ We're experiencing some high load on the server, please be patient as we try to improve the response time</b></h6>
        <br>
      <p>The CTF will run from December 26 13:00 CET to January 03 20:00 CET (GMT+1)</p>
      <p id="demo"></p>
        <h3 class="text-center">
            <p>Ready to play?</p>
            <a class="btn btn-primary w-100" href="/register">Create an account</a>
        </h3>
        <h6>
        	<br>
            <p>Once you are logged in:</p>
       </h6>
       <h3>
            <a class="btn btn-secondary w-100" href="/teams/join">Join a team</a>
		</h3>
        <h3>
            <a class="btn btn-secondary w-100" href="/teams/new">Make a new team</a>
        </h3>        
        <sub>And remember folks: It's only a game. Please do not attack the CTF server. Drink plenty of water (Not only MATE or beer!) and be excellent!</sub>
        <!-- hidden flag: 'brixelCTF{notsosecret}' -->
    </div>
</div>

Flag: brixelCTF{notsosecret}


Hidden Code

Category: Internet

Description:
Something strange happens on the brixel website when you enter the konami code
flag = the character you see floating by

Solution:

Heading over to the brixel website and taking a look at what scripts are loaded we find this script.

From the last line in the source we can see that this code is bound to the window.WP_Easter_Egg object and we have access to all functions on that object.

If we execute window.WP_Easter_Egg.move_image_across_top() we can see Mario running across the screen.

So the flag is mario


Robotopia

Category: Internet

Description:
I found this cool website, it claims to be 100% robot-free!
There’s nothing there yet at the moment, but at least it’s robots-free. I wonder how they keep it that way?

Solution:

Heading over to the challenge page we see this.

No links or anything useful in the source. But it says that it’s robot free, lets take a look at the robots.txt file.

We found the flag brixelCTF{sadr0b0tz}


Discord

Category: Internet

Description:
Join our Discord and read the rules.

Solution:

Joining the discord server we get the following message.

And in point 5 of the rules we get the flag brixelCTF{th4nk5_f0r_r34d1ng_th3_rulz}


login1

Category: Internet

Description:
My buddy is trying to become a web developer, he made this little login page. Can you get the password?

Solution:

This page consists only of a login form.

Lets take a look at the source. Here we can see the javascript in the script element.

<script type="text/javascript">
	function verify() {
		password = document.getElementById("the_password").value;
		if(password == "brixelCTF{w0rst_j4v4scr1pt_3v3r!}")
		{
			alert("Password Verified");
		}
		else 
		{
		alert("Incorrect password");
		}
	}
</script>

Now we got the flag brixelCTF{w0rst_j4v4scr1pt_3v3r!}


login2

Category: Internet

Description:
Cool, you found the first password! He secured it more, could you try again?

Solution:

This page looks identical to the previous login challenge. Taking a look at the javascript for this page we can see the following.

<script type="text/javascript">
	function verify() {
		password = document.getElementById("the_password").value;
		split = 6;
		if (password.substring(0, split) == 'brixel') 
		{
			if (password.substring(split*6, split*7) == '180790') 
			{
				if (password.substring(split, split*2) == 'CTF{st') 
				{
					if (password.substring(split*4, split*5) == '5cr1pt') 
					{
						if (password.substring(split*3, split*4) == 'd_j4v4') 
						{
							if (password.substring(split*5, split*6) == '_h3r3.') 
							{
								if (password.substring(split*2, split*3) == '1ll_b4') 
								{
									if (password.substring(split*7, split*8) == '54270}') 
									{
										alert("Password Verified")
									}
								}
							}
						}
					}
				}
			}
		}
		else 
		{
		alert("Incorrect password");
		}
	}
</script>

From this we can recreate the flag by concatenating the values in that are checked, starting with substring(0, split) then substring(split, split*2) then substring(split*2, split*3) and then the rest and we get the flag brixelCTF{st1ll_b4d_j4v45cr1pt_h3r3.18079054270}


login3

Category: Internet

Description:
Nice! you found another one! He changed it up a bit again, could you try again?

Solution:

Lets take a look at the javascript to see whats changed.

<script type="text/javascript">
	function verify() {
		username = document.getElementById("the_username").value;
		password = document.getElementById("the_password").value;
		if(username == readTextFile("username.txt"))
		{
			if(password == readTextFile("password.txt"))
			{
				alert("Password Verified");
			} else {
				alert("Incorrect password");
			}
		}else{
			alert("Incorrect username");
		}
		
	}
    function readTextFile(filePath) 
    {      
		var result = null;
		var xmlhttp = new XMLHttpRequest();
		xmlhttp.open("GET", filePath, false);
		xmlhttp.send();
		if (xmlhttp.status==200) {
			result = xmlhttp.responseText;
		}
		return result;
    } 
</script>

This time the username and password are matched with the contents of the files username.txt and password.txt. Lets see if we can access those files.

In the password.txt file we get the flag brixelCTF{n0t_3v3n_cl05e_t0_s3cur3!}


login4

Category: Internet

Description:
Whow, another one! You’re good! So I told my buddy how you managed to get the password last time, and he fixed it. Could you check again please?

Solution:

This time we have the following javascript.

<script type="text/javascript">
	function verify() {
		username = document.getElementById("the_username").value;
		password = document.getElementById("the_password").value;
		if(username == atob(readTextFile("username.txt")))
		{
			if(password == atob(readTextFile("password.txt")))
			{
				alert("Password Verified");
			} else {
				alert("Incorrect password");
			}
		}else{
			alert("Incorrect username");
		}
		
	}
    function readTextFile(filePath) 
    {      
		var result = null;
		var xmlhttp = new XMLHttpRequest();
		xmlhttp.open("GET", filePath, false);
		xmlhttp.send();
		if (xmlhttp.status==200) {
			result = xmlhttp.responseText;
		}
		return result;
    } 
</script>

It still matches the password to the contents of a file. But this time it base64 decodes the contents before checking the values. Lets get the contents of password.txt.

YnJpeGVsQ1RGe2V2ZW5fYmFzZTY0X3dvbnRfbWFrZV95b3Vfc2VjdXJlfQ==

Now we got a base64 encoded string, when decoding this we get the flag brixelCTF{even_base64_wont_make_you_secure}


Browsercheck

Category: Internet

Description:
I found this weird website, but it will only allow ‘ask jeeves crawler’ to enter?
Can you get me in?

Solution:

Navigating to the page gives us the following message.

So we need to impersonate a Ask Jeeves crawler. First we need to find out the user agent for the crawler. This can be found on this Crawler User Agents page.

Here we find out that the user agent used for Ask Jeeves is Mozilla/5.0 (compatible; Ask Jeeves/Teoma; +http://about.ask.com/en/docs/about/webmasters.shtml)

When we request the page with this user agent we get the following response.

HTTP/1.1 200 OK
Date: Sat, 26 Dec 2020 16:12:58 GMT
Server: Apache/2
X-Powered-By: PHP/7.1.33
Vary: Accept-Encoding,User-Agent
Content-Length: 108
Content-Type: text/html; charset=UTF-8
Connection: close

<html><body><div align="center"><h1>congratulations</h1>the flag is 'brixelCTF{askwho?}'</div></body></html>

Flag: brixelCTF{askwho?}


Readme

Category: Internet

Description:
This flag is hidden in a readme
We will only guide those who want to learn on this one

Solution:

On the Guide page for the CTF we get some information for new players, and under hints we see the following.

So the flag is freepoints


SnackShack awards

Category: Internet

Description:
A friend of mine owns a snackbar and is entered in a competition to win an award.
It seems he is not going to win because he has a low amount of votes 😦
Do you think you can boost his votes? adding 5000 votes at once should do the trick!
His snackbar is called Cafetaria ‘t pleintje

Solution:

Here we have a voting page where we can vote for different SnackShacks from 0-5. To be able to change the vote to 5000 for Cafetaria ‘t pleintje we can intercept the request in Burp and change the value to 5000.

score_bammens=0&score_omejan=0&score_fontainas=0&score_tpleintje=5000&score_frietuurtje=0

When we send this request we get the response ‘Well done! The flag is brixelCTF{bakpau}


Flat earth

Category: Internet

Description:
These idiots… I heard there is a rally of flat earth believers tomorrow
We should access their admin panel and stop that rally from happening!

Solution:

This is the home page of some flat earth community.

No visible links on the page. Lets take a look at the source.

<html>
<title>Flat Earth Believers</title>
<body bgcolor="#000000" text="white">
	<div align="center"><h1>The earth is flat!</h1></div>
	<hr>
	<div align="center">
		<p>Ever since that Greek idiot Eratosthenes claimed that the earth is round, we have been living in a lie.</p>
		<p><img src="images/ATuin.jpg" alt="flat earth"></p>
		<p>The earth is not round! It is a flat disk set on top of a turtle travelling trough space!</p>
		<p>We believe that the government is actively trying to hide this great truth from us by sending us pictures from <b>their OWN</b> so called 'space administration' or 'nasa'</p>
		<p>Therefor we must unite against the government! Join our protests that are taking place all around the globe.</p>
		<br>
		<p>Next protest:</p>
		<p><script type="text/javascript">var tomorrow = new Date();tomorrow.setDate(tomorrow.getDate() + 1);document.write(tomorrow.toLocaleDateString("nl-NL"));</script></p>
		<p>Joe's warehouse on 11th street, Hoboken New Jersey</p>
		<br><br>
		<p><a href="admin.php"><font color="#000000">administration</font></a></p>
	</div>
</body>
</html>

Here we can find a link to admin.php, which is “hidden” by changing the color to the same as the background.

Lets check out admin.php.

A basic login form. Entering some values for the username and password we get the following message.

Lets check for SQLi.

Looks like it might be vulnerable to SQLi! Lets try a basic SQLi to bypass the login form.

It worked and we got the flag brixelCTF{aroundtheglobe}


Hiding in the background

Category: Internet

Description:
Like our CTF homepage?
There is a little secret hiding in (or rather behind) the background

Solution:

Lets head back to the CTF homepage and take a look at the background properties.

So the background is an SVG image. Lets download that and see if there’s something interesting in the file.

Searching for brixelCTF in the file gets us to this part.

<text
       xml:space="preserve"
       style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
       x="62.649639"
       y="138.42255"
       id="text1434"><tspan
         sodipodi:role="line"
         id="tspan1432"
         x="62.649639"
         y="138.42255"
         style="fill:#000000;fill-opacity:1;stroke-width:0.264583">brixelCTF{happy_holidays}</tspan></text>

Flag: brixelCTF{happy_holidays}


login5

Category: Internet

Description:
Ok, THIS time it should be fine! if you find this one he is going to quit trying.

Solution:

If we take a look at the javascript this time, we can see that it’s obfuscated.

<script type="text/javascript">
var _0x2c58=['getElementById','Incorrect\x20password','Password\x20Verified','length','substr','the_password','abcdefghijklmnopqrstuvwxyz1234567890!{}'];(function(_0x47871f,_0x1326ab){var _0x2c58be=function(_0x58abc9){while(--_0x58abc9){_0x47871f['push'](_0x47871f['shift']());}};_0x2c58be(++_0x1326ab);}(_0x2c58,0x91));var _0x58ab=function(_0x47871f,_0x1326ab){_0x47871f=_0x47871f-0x192;var _0x2c58be=_0x2c58[_0x47871f];return _0x2c58be;};function verify(){var _0x41653e=_0x58ab;password=document[_0x41653e(0x194)](_0x41653e(0x192))['value'],alphabet=_0x41653e(0x193),newpassword=alphabet[_0x41653e(0x198)](0x1,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](0x11,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](0x8,0x1),newpassword=newpassword+alphabet['substr'](0x17,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](0x4,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](0xb,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](0x2,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](0x13,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](0x5,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](alphabet[_0x41653e(0x197)]-0x2,0x1),newpassword=newpassword+alphabet['substr'](alphabet[_0x41653e(0x197)]-0x4,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](0x1,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](0x5,0x1),newpassword=newpassword+alphabet['substr'](0x14,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](0x12,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](0x2,0x1),newpassword=newpassword+alphabet['substr'](0x0,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](0x13,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](0x8,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](alphabet[_0x41653e(0x197)]-0x4,0x1),newpassword=newpassword+alphabet[_0x41653e(0x198)](0xd,0x1),newpassword=newpassword+alphabet['substr'](alphabet[_0x41653e(0x197)]-0x1,0x1),password==newpassword?alert(_0x41653e(0x196)):alert(_0x41653e(0x195));}
</script>

Lets pretty print this code to make it easier to read.

var _0x2c58 = ['getElementById', 'Incorrect\x20password', 'Password\x20Verified', 'length', 'substr', 'the_password', 'abcdefghijklmnopqrstuvwxyz1234567890!{}'];
(function(_0x47871f, _0x1326ab) {
    var _0x2c58be = function(_0x58abc9) {
        while (--_0x58abc9) {
            _0x47871f['push'](_0x47871f['shift']());
        }
    };
    _0x2c58be(++_0x1326ab);
}(_0x2c58, 0x91));
var _0x58ab = function(_0x47871f, _0x1326ab) {
    _0x47871f = _0x47871f - 0x192;
    var _0x2c58be = _0x2c58[_0x47871f];
    return _0x2c58be;
};

function verify() {
    var _0x41653e = _0x58ab;
    password = document[_0x41653e(0x194)](_0x41653e(0x192))['value'], alphabet = _0x41653e(0x193), newpassword = alphabet[_0x41653e(0x198)](0x1, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](0x11, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](0x8, 0x1), newpassword = newpassword + alphabet['substr'](0x17, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](0x4, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](0xb, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](0x2, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](0x13, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](0x5, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](alphabet[_0x41653e(0x197)] - 0x2, 0x1), newpassword = newpassword + alphabet['substr'](alphabet[_0x41653e(0x197)] - 0x4, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](0x1, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](0x5, 0x1), newpassword = newpassword + alphabet['substr'](0x14, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](0x12, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](0x2, 0x1), newpassword = newpassword + alphabet['substr'](0x0, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](0x13, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](0x8, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](alphabet[_0x41653e(0x197)] - 0x4, 0x1), newpassword = newpassword + alphabet[_0x41653e(0x198)](0xd, 0x1), newpassword = newpassword + alphabet['substr'](alphabet[_0x41653e(0x197)] - 0x1, 0x1), password == newpassword ? alert(_0x41653e(0x196)) : alert(_0x41653e(0x195));
}

So we got some functions and some variables. In the verify function it seems that the correct password are created and stored in the newpassword variable.

Lets rewrite the code a bit so we can access the newpassword variable.

var _0x2c58 = ['getElementById', 'Incorrect\x20password', 'Password\x20Verified', 'length', 'substr', 'the_password', 'abcdefghijklmnopqrstuvwxyz1234567890!{}'];
(function(_0x47871f, _0x1326ab) {
    var _0x2c58be = function(_0x58abc9) {
        while (--_0x58abc9) {
            _0x47871f['push'](_0x47871f['shift']());
        }
    };
    _0x2c58be(++_0x1326ab);
}(_0x2c58, 0x91));
var _0x58ab = function(_0x47871f, _0x1326ab) {
    _0x47871f = _0x47871f - 0x192;
    var _0x2c58be = _0x2c58[_0x47871f];
    return _0x2c58be;
};

password = document[_0x58ab(0x194)](_0x58ab(0x192))['value'], alphabet = _0x58ab(0x193), newpassword = alphabet[_0x58ab(0x198)](0x1, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](0x11, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](0x8, 0x1), newpassword = newpassword + alphabet['substr'](0x17, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](0x4, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](0xb, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](0x2, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](0x13, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](0x5, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](alphabet[_0x58ab(0x197)] - 0x2, 0x1), newpassword = newpassword + alphabet['substr'](alphabet[_0x58ab(0x197)] - 0x4, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](0x1, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](0x5, 0x1), newpassword = newpassword + alphabet['substr'](0x14, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](0x12, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](0x2, 0x1), newpassword = newpassword + alphabet['substr'](0x0, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](0x13, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](0x8, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](alphabet[_0x58ab(0x197)] - 0x4, 0x1), newpassword = newpassword + alphabet[_0x58ab(0x198)](0xd, 0x1), newpassword = newpassword + alphabet['substr'](alphabet[_0x58ab(0x197)] - 0x1, 0x1), password == newpassword ? alert(_0x58ab(0x196)) : alert(_0x58ab(0x195));

Running this and accessing the newpassword variable we get the flag brixelctf{0bfuscati0n}


Dadjokes

Category: Internet

Description:
Darn! Some idiot scriptkiddy broke my favorite website full of dad jokes!
I can’t seem to contact the owner to fix the site
Can you bring it back and remove the defaced page?

Solution:

All we can see when entering the page is a defaced page.

If we take a look at the source we find a comment leading us to the original page.

<html>
<title>Haxx0red!</title>
<body bgcolor="#000000" text="green">
<div align="center">
	<h1>This site has been hacked!</h1>
	<hr>
	<p><img style='display:block; width:400px;height:400px;' id='base64image' src=' data:image/jpeg;base64,<REDACTED>'/></p>
	<br>
	<p>This site has been hacked by the m4st3r 0f d1ss4st3r</p>
	<p>Shoutout to my scriptkidz friends dr.d00m and blazingLaser</p>
</div>
</body>
	<!-- Hey bozo! I left your original index file under index_backup.html so you can see how your site looked before I used my l33t skillz to deface it. -->
</html>

Lets check the index_backup.html page.

Looks like this is the original page. Lets find out how the site got defaced and try to restore it.

On the submit page we have a form where we can enter our own joke.

When pressing submit we get a confirmation page.

If we check the URL we can see that it also contains a file name.

http://timesink.be/dadjokes/jokes/submit.php?filename=test.txt&title=test&content=test

So we might be able to overwrite the index.html page with the contents of the index_backup.html using this form. In the YES link we can see that we have another parameter added to the URL.

http://timesink.be/dadjokes/jokes/submit.php?filename=test.txt&title=test&content=test&submit=true

Lets try to create a request to restore the page. First we need to get the source of the index_backup.html file.

<html><title>DadJokes, your source of lame dad jokes</title><body><div align="center"><h1>DadJokes</h1><hr><img src="images/banner.png" alt="dadjokes"><br><br><a href="jokes/read.php">Read dad jokes</a><br><br><a href="jokes/submit.php">submit your own jokes</a></div></html>

And to be able to submit this, we need to URL encode it.

%3Chtml%3E%3Ctitle%3EDadJokes%2C%20your%20source%20of%20lame%20dad%20jokes%3C%2Ftitle%3E%3Cbody%3E%3Cdiv%20align%3D%22center%22%3E%3Ch1%3EDadJokes%3C%2Fh1%3E%3Chr%3E%3Cimg%20src%3D%22images%2Fbanner.png%22%20alt%3D%22dadjokes%22%3E%3Cbr%3E%3Cbr%3E%3Ca%20href%3D%22jokes%2Fread.php%22%3ERead%20dad%20jokes%3C%2Fa%3E%3Cbr%3E%3Cbr%3E%3Ca%20href%3D%22jokes%2Fsubmit.php%22%3Esubmit%20your%20own%20jokes%3C%2Fa%3E%3C%2Fdiv%3E%3C%2Fhtml%3E

Now we can replace the filename parameter and the content parameter in the request.

http://timesink.be/dadjokes/jokes/submit.php?filename=../index.html&title=test&content=%3Chtml%3E%3Ctitle%3EDadJokes%2C%20your%20source%20of%20lame%20dad%20jokes%3C%2Ftitle%3E%3Cbody%3E%3Cdiv%20align%3D%22center%22%3E%3Ch1%3EDadJokes%3C%2Fh1%3E%3Chr%3E%3Cimg%20src%3D%22images%2Fbanner.png%22%20alt%3D%22dadjokes%22%3E%3Cbr%3E%3Cbr%3E%3Ca%20href%3D%22jokes%2Fread.php%22%3ERead%20dad%20jokes%3C%2Fa%3E%3Cbr%3E%3Cbr%3E%3Ca%20href%3D%22jokes%2Fsubmit.php%22%3Esubmit%20your%20own%20jokes%3C%2Fa%3E%3C%2Fdiv%3E%3C%2Fhtml%3E&submit=true

When sending this request we get the message ‘Congratulations, the flag is brixelCTF{lamejoke}


Pathfinders #1

Category: Internet

Description:
These f*cking religious sects!
These guys brainwashed my niece into their demeted world of i-readings and other such nonsense.
The feds recently closed their churches, but it seems they are preparing for a new online platform to continue their malicious activities.
can you gain access to their admin panel to shut them down?

Solution:

We need to gain access to the admin panel for this religious sect.

When we try to access the admin page we get a basic auth prompt. So there’s probably a .htaccess file in the admin directory. Lets take a look at the URL.

http://timesink.be/pathfinder/index.php?page=home.php

It looks like the index.php script is including the file in the page parameter, lets see if we can include the index.php in the admin directory.

Ok, so we’re on the right track. Lets check out the .htaccess file.

AuthGroupFile /dev/null AuthType Basic AuthUserFile /home/cfromage/domains/epsilom/public_html/pathfinder/admin/.htpasswd AuthName "Admin only!" require valid-user ErrorDocument 401 "Unauthorized Access"

Great! Now we need to check the .htpasswd file.

#normally you would brute force this, but that is not in scope of this challenge. The flag is: brixelCTF{unsafe_include}
admin:$apr1$941ydmlw$aPUW.gCFcvUbIcP0ptVQF0

So the flag is brixelCTF{unsafe_include}


Pathfinders #2

Category: Internet

Description:
It seems they updated their security. can you get the password for their admin section on their new site?
oh yeah, let’s assume they are running a php version below 5.3.4 here…

Solution:

Ok, so now the pathfinders site is upgraded. When we try to access the .htpasswd file with the previous technique we get the message file not ending in .php, terminating.

So we need to trick the script into thinking that the filename requested ends in .php and still be able to access the .htpasswd file. Lets try to add a null byte after the .htpasswd and adding the .php extension after.

http://timesink.be/pathfinder2/index.php?page=admin/.htpasswd.php%00.php

Sending this request gives us the message ‘Great work! the flag is brixelCTF{outdated_php}


Cookieee!

Category: Reverse engineering / cracking

Description:
This stupid cookie clicker game…
Legend has it there is a reward when you reach 10000000 or more clicks
Can you think of a way to get that many clicks?

Solution:

After extracting the game, we can see that it is a Unity game written in C#. So we should be able to decompile the Assembly-CSharp.dll file to get the source code for the game.

Opening the dll in dnSpy we find a script called endGameScript. Here we find some interesting things.

// endGameScript
// Token: 0x04000003 RID: 3
private string alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 =.{}!";

private void Start()
{
	GameObject.Find("endGame").GetComponent<Text>().text = string.Concat(new string[]
	{
		this.alphabet.Substring(28, 1),
		this.alphabet.Substring(14, 1),
		this.alphabet.Substring(13, 1),
		this.alphabet.Substring(6, 1),
		this.alphabet.Substring(17, 1),
		this.alphabet.Substring(0, 1),
		this.alphabet.Substring(19, 1),
		this.alphabet.Substring(20, 1),
		this.alphabet.Substring(11, 1),
		this.alphabet.Substring(0, 1),
		this.alphabet.Substring(19, 1),
		this.alphabet.Substring(8, 1),
		this.alphabet.Substring(14, 1),
		this.alphabet.Substring(13, 1),
		this.alphabet.Substring(18, 1),
		this.alphabet.Substring(67, 1),
		this.alphabet.Substring(62, 1),
		this.alphabet.Substring(31, 1),
		this.alphabet.Substring(11, 1),
		this.alphabet.Substring(0, 1),
		this.alphabet.Substring(6, 1),
		this.alphabet.Substring(62, 1),
		this.alphabet.Substring(63, 1),
		this.alphabet.Substring(62, 1),
		this.alphabet.Substring(1, 1),
		this.alphabet.Substring(17, 1),
		this.alphabet.Substring(8, 1),
		this.alphabet.Substring(23, 1),
		this.alphabet.Substring(4, 1),
		this.alphabet.Substring(11, 1),
		this.alphabet.Substring(28, 1),
		this.alphabet.Substring(45, 1),
		this.alphabet.Substring(31, 1),
		this.alphabet.Substring(65, 1),
		this.alphabet.Substring(12, 1),
		this.alphabet.Substring(55, 1),
		this.alphabet.Substring(12, 1),
		this.alphabet.Substring(52, 1),
		this.alphabet.Substring(17, 1),
		this.alphabet.Substring(24, 1),
		this.alphabet.Substring(66, 1)
	});
}

It looks like the flag is being created from the alphabet string. Lets write a small program to generate the flag for us.

using System;

namespace Decoder
{
    class Program
    {
        static void Main(string[] args)
        {
            var alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 =.{}!";
            var flag = string.Concat(new string[]
	            {
		            alphabet.Substring(28, 1),
		            alphabet.Substring(14, 1),
		            alphabet.Substring(13, 1),
		            alphabet.Substring(6, 1),
		            alphabet.Substring(17, 1),
		            alphabet.Substring(0, 1),
		            alphabet.Substring(19, 1),
		            alphabet.Substring(20, 1),
		            alphabet.Substring(11, 1),
		            alphabet.Substring(0, 1),
		            alphabet.Substring(19, 1),
		            alphabet.Substring(8, 1),
		            alphabet.Substring(14, 1),
		            alphabet.Substring(13, 1),
		            alphabet.Substring(18, 1),
		            alphabet.Substring(67, 1),
		            alphabet.Substring(62, 1),
		            alphabet.Substring(31, 1),
		            alphabet.Substring(11, 1),
		            alphabet.Substring(0, 1),
		            alphabet.Substring(6, 1),
		            alphabet.Substring(62, 1),
		            alphabet.Substring(63, 1),
		            alphabet.Substring(62, 1),
		            alphabet.Substring(1, 1),
		            alphabet.Substring(17, 1),
		            alphabet.Substring(8, 1),
		            alphabet.Substring(23, 1),
		            alphabet.Substring(4, 1),
		            alphabet.Substring(11, 1),
		            alphabet.Substring(28, 1),
		            alphabet.Substring(45, 1),
		            alphabet.Substring(31, 1),
		            alphabet.Substring(65, 1),
		            alphabet.Substring(12, 1),
		            alphabet.Substring(55, 1),
		            alphabet.Substring(12, 1),
		            alphabet.Substring(52, 1),
		            alphabet.Substring(17, 1),
		            alphabet.Substring(24, 1),
		            alphabet.Substring(66, 1)
	            });
            Console.WriteLine(flag);
        }
    }
}

When running this program we get the output ‘Congratulations! Flag = brixelCTF{m3m0ry}


no peeking!

Category: Reverse engineering / cracking

Description:
Hidden inside this exe file is a flag
Up to you to find it

Solution:

This is a .NET program, so we can use dnSpy to decompile this. Taking a look at the Form1.cs file we find a method called showFlag.

public object showFlag()
{
	Interaction.MsgBox("Hey, stop looking at my innards!", MsgBoxStyle.OkOnly, null);
	Interaction.MsgBox("The flag is brixelCTF{d0tP33K}", MsgBoxStyle.OkOnly, null);
	Interaction.MsgBox("Happy holidays!", MsgBoxStyle.OkOnly, null);
	return true;
}

The flag is brixelCTF{d0tP33K}


registerme.exe

Category: Reverse engineering / cracking

Description:
This program needs to be activated
Can you figure out how to do it?

Solution:

This is a VB6 program, so we can’t just decompile or disassemble it to find out how to activate it. Lets see what we get when we run the program.

Not much here. Lets find the NOT REGISTERED! string location and see what we can find out.

Here we can see the string REGISTERED! and NOT REGISTERED!, we can also see the string activation.key.

Lets create a file with that name in the same directory as the program and see what happens.

Success! We get the flag brixelCTF{f1l34cc3ss}


android app

Category: Reverse engineering / cracking

Description:
This little android app requires a password, can you find it?
the flag is the password

Solution:

Since this is an android application we can decompile it with Bytecode Viewer. After doing this we can find three screens in the application. Inspecting those screens we find out that Screen1 is the main screen, Screen2 is the correct message screen and Screen3 is the invalid message screen.

Lets find out where Screen1 tries to switch the screen to either Screen2 or Screen3. In Screen1 we can find the following method.

public Object Button1$Click() {
      runtime.setThisForm();
      Object var1;
      if (runtime.callYailPrimitive(runtime.yail$Mnequal$Qu, LList.list2(runtime.getProperty$1(Lit23, Lit18), "brixelCTF{th3_4ndr0ids_y0u_4r3_l00k1ng_f0r}"), Lit30, "=") != Boolean.FALSE) {
         var1 = runtime.callYailPrimitive(runtime.open$Mnanother$Mnscreen, LList.list1("Screen2"), Lit31, "open another screen");
      } else {
         var1 = runtime.callYailPrimitive(runtime.open$Mnanother$Mnscreen, LList.list1("Screen3"), Lit32, "open another screen");
      }

      return var1;
   }

So the flag is brixelCTF{th3_4ndr0ids_y0u_4r3_l00k1ng_f0r}


punch card

Category: Old Tech

Description:
I found this old punchcard
it seems to be classified
can you figure out what’s on there?

Solution:

So we got an image of a punch card that we should figure out the contents of.

For this we need an punch card emulator, and when entering enough of the holes in the emulator we get this text.

The flag is BRIXELCTF(M41NFR4M3)


Goodbye old friend

Category: Old Tech

Description:
On 31/12/2020 support for flash will end
Therefor we made you a farewell animation
Can you get the flag?
Beware headphone users! the music is loud.

Solution:

Here we got a Flash animation. So lets decompile it with JPEXS. After looking through the texts in the file we find this.

The flag is brixelCTF{n0_m0r3_5upp0rt}


The tape

Category: Old Tech

Description:
I found this cassette tape from the ’80s. I bet it has some cool games on it or something.
Better start looking for someone who grew up in that era… 🙂

Solution:

For this challenge we get an audio file called CTF-TAPe.wav. And since the TAP format is used for C64 lets try to convert this into a TAP file with WAV-PRG. When we have converted the Wave file to a TAP file we can open it with an C64 emulator like Vice. And when we run it we get the following.

The flag is BASIC


Sea code

Category: Cryptography

Description:
beep beep beeeep…
This one should be fairly straight forward

Solution:

For this challenge we get a recording of some morse code. Lets use a Morse Decoder to find out the message.

The flag is SEAGULL


Merde

Category: Cryptography

Description:
A french messenger was caught during the war
He was carrying a piece of paper that read: Vvr ktdk vl jvtzsyHBI{fnzcievs}
Upon torturing the messenger for an explaination, he only shouted ‘confidentiel’!!!
Too bad he died, I bet something good was in that message 😦

Solution:

This is probably a Vigenère Cipher since he was french. So if we decrypt the ciphertext with the key confidentiel we get the text ‘The flag is brixelCTF{baguette}


Merda

Category: Cryptography

Description:
An Italian messenger was caught during the war
He was carrying a piece of paper that read: ymj kqfl nx gwncjqHYK{uneefsfutqn}
Upon torturing the messenger for an explaination, he gestured a V with his fingers. The english guard took it as an insult and killed him right on the spot.
Maybe he just wanted some peace?

Solution:

Ok, so this is probably a Caesar Cipher with shift 5. When we decrypt the ciphertext we get the text ‘the flag is brixelCTF{pizzanapoli}


shit

Category: Cryptography

Description:
A messenger droid was caught during the intergalactic war
Upon investigating his memory banks, we found this message:

MDExMTAxMDAgMDExMDEwMDAgMDExMDAxMDEgMDAxMDAwMDAgMDExMDAxMTAgMDExMDExMDAgMDExMDAwMDEgMDExMDAxMTEgMDAxMDAwMDAgMDExMDEwMDEgMDExMTAwMTEgMDAxMDAwMDAgMDExMDAwMTAgMDExMTAwMTAgMDExMDEwMDEgMDExMTEwMDAgMDExMDAxMDEgMDExMDExMDAgMDEwMDAwMTEgMDEwMTAxMDAgMDEwMDAxMTAgMDExMTEwMTEgMDExMTAwMTAgMDExMDExMTEgMDExMDAwMTAgMDExMDExMTEgMDExMDAwMTEgMDExMDExMTEgMDExMTAwMDAgMDExMTExMDE=

We are lucky we found him, he was only 64 parsecs from his base

Solution:

Here we got a Base64 encoded message, if we decode it we get the following.

01110100 01101000 01100101 00100000 01100110 01101100 01100001 01100111 00100000 01101001 01110011 00100000 01100010 01110010 01101001 01111000 01100101 01101100 01000011 01010100 01000110 01111011 01110010 01101111 01100010 01101111 01100011 01101111 01110000 01111101

When decoding this from binary we get the text ‘the flag is brixelCTF{robocop}


Scheiße

Category: Cryptography

Description:
A german messenger was caught during WW2
He was carrying a piece of paper that read: qbhbh zrmua gfbld ocqbv
He was nice enough to give us all we wanted, except the decoded message, he needs a special machine for that, and we don’t have it.
He DID give us the settings for the machine.
The settings for this machine are:
Model: G-312
Reflector: UKW 11/26
Rotor 1: 2/12/6
Rotor 2: 1/17/16
Rotor 3: 3/12/1
The flag is ONE word, no spaces.

Solution:

So this message is most probably encrypted with an Enigma machine. So we need to use an Enigma decoder and set up the machine with the settings provided.

Now we got the text ‘der flag ist sauerkraut


flawed

Category: Cryptography

Description:
Our l33t hackers hacked a bulletin board and gained access to the database. We need to find the admin password.
The user’s database info is:
Username:admin
Passwordhash:d269ce15f9c44bc3992a5f4e5f273e06
The flag is the plaintext password

Solution:

This looks like a MD5 hash. Lets try to do a reverse lookup for the hash and see if we can find anything.

The MD5 hash:
d269ce15f9c44bc3992a5f4e5f273e06
was succesfully reversed into the string:
notsecure 

The flag is notsecure


Don’t be salty

Category: Cryptography

Description:
Our l33t hackers hacked a bulletin board and gained access to the database. We need to find the admin password.
The user’s database info is:
Username:admin
Passwordhash:2bafea54caf6f8d718be0f234793a9be
Salt:04532@#!!
We know from the source code that the salt is put AFTER the password, then hashed. We also know the user likes to use lowercase passwords of only 5 characters long.
The flag is the plaintext password.

Solution:

Now we got a salted MD5 hash. Now we need to brute force the hash in order to get the password. Using HashCat with the md5($pass, $salt) method and setting the length of the password to 5 characters we get the following output.

2bafea54caf6f8d718be0f234793a9be:04532@#!!:brute

Flag: brute


Doc-ception

Category: Steganography

Description:
Need to hide something? why not a word document?
You need to dig deeper

Solution:

For this challenge we get a word document. And since word documents are Zip files we can extract the file to see if there’s anything interesting inside. When we unzip the document we get another word document with the same name, and if we extract this document we get a file called flag.txt. The contents of flag.txt is flag = openxml.

Flag: openxml


Limewire audio

Category: Steganography

Description:
I downloaded this sweet tune from limewire, but there’s something weird going on
can you find the hidden message?
The flag is the name of the character in english, no spaces!

Solution:

Here we got a audio file. Lets open it in Audacity to see if we can get some clues. If we switch to the spectogram view we can see the following image in the audio stream.

Looks like a distorted Hello Kitty.

Flag: hellokitty


Scan me

Category: Steganography

Description:
Can you solve this scan puzzle?
It could be handy to hide messages

Solution:

For this challenge we got an image of a QR code.

But we can’t scan this code. If we look closely it looks like there’s two QR codes in the same image. Lets extract the second one and see if we can scan it.

If we scan this code we get an URL http://www.timesink.be/qrcode/flag.html. Navigating to the URL gives us a barcode to decode.

Decoding this with an online barcode reader gives us the text code-128-easy. Entering this gives us another barcode to scan.

Using the same online tool as before we get the text 5449000133335. Entering this gives us yet another barcode.

Reading this barcode gives us the text congratulations_this_is_the_last_barcode and entering this gives us the flag.

Flag: brixelCTF{m4st3r_0f_sc4n5}


Rufus the vampire cat

Category: Steganography

Description:
This is a picture of Rufus the vampire cat
Despite being cute, Rufus hides a secret, up to you to find it

Solution:

Here we get an image of a cat. Lets try steghide to see if there’s any hidden information in the image.

You thought this was a cute cat picture? NOPE! Chuck Testa! (the flag is: chucktesta)

Flag: chucktesta