PicoCTF 2022 Forensics walkthrough – Part 1
In this article, we will attempt to solve picoCTF 2022 Forensics challenges 1 to 3.
This post assumes you are familiar with what CTF is, if not then feel free to check out this introduction to CTF video by LiveOverFlow:
So, let's get started.
Challenge 1 – Enhance
As we can see in the description that we are provided with a download link of an image file and no hints.
Let's start by firing up our terminal and grabbing the image using curl and open it.
curl -LO "https://artifacts.picoctf.net/c/137/drawing.flag.svg"
When opened:
It looks like there's nothing here. Let's try something else. Let's try to cat this image file.
cat drawing.flag.svg
Output:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg8"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
sodipodi:docname="drawing.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.69833333"
inkscape:cx="400"
inkscape:cy="538.41159"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1872"
inkscape:window-height="1016"
inkscape:window-x="48"
inkscape:window-y="27"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<ellipse
id="path3713"
cx="106.2122"
cy="134.47203"
rx="102.05357"
ry="99.029755"
style="stroke-width:0.26458332" />
<circle
style="fill:#ffffff;stroke-width:0.26458332"
id="path3717"
cx="107.59055"
cy="132.30211"
r="3.3341289" />
<ellipse
style="fill:#000000;stroke-width:0.26458332"
id="path3719"
cx="107.45217"
cy="132.10078"
rx="0.027842503"
ry="0.031820003" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:0.00352781px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
x="107.43014"
y="132.08501"
id="text3723"><tspan
sodipodi:role="line"
x="107.43014"
y="132.08501"
style="font-size:0.00352781px;line-height:1.25;fill:#ffffff;stroke-width:0.26458332;"
id="tspan3748">p </tspan><tspan
sodipodi:role="line"
x="107.43014"
y="132.08942"
style="font-size:0.00352781px;line-height:1.25;fill:#ffffff;stroke-width:0.26458332;"
id="tspan3754">i </tspan><tspan
sodipodi:role="line"
x="107.43014"
y="132.09383"
style="font-size:0.00352781px;line-height:1.25;fill:#ffffff;stroke-width:0.26458332;"
id="tspan3756">c </tspan><tspan
sodipodi:role="line"
x="107.43014"
y="132.09824"
style="font-size:0.00352781px;line-height:1.25;fill:#ffffff;stroke-width:0.26458332;"
id="tspan3758">o </tspan><tspan
sodipodi:role="line"
x="107.43014"
y="132.10265"
style="font-size:0.00352781px;line-height:1.25;fill:#ffffff;stroke-width:0.26458332;"
id="tspan3760">C </tspan><tspan
sodipodi:role="line"
x="107.43014"
y="132.10706"
style="font-size:0.00352781px;line-height:1.25;fill:#ffffff;stroke-width:0.26458332;"
id="tspan3762">T </tspan><tspan
sodipodi:role="line"
x="107.43014"
y="132.11147"
style="font-size:0.00352781px;line-height:1.25;fill:#ffffff;stroke-width:0.26458332;"
id="tspan3764">F { 3 n h 4 n </tspan><tspan
sodipodi:role="line"
x="107.43014"
y="132.11588"
style="font-size:0.00352781px;line-height:1.25;fill:#ffffff;stroke-width:0.26458332;"
id="tspan3752">c 3 d _ 2 4 3 7 4 6 7 5 }</tspan></text>
</g>
</svg>
Upon looking closely at the end of the output, we see that before every, </tspan>
there's a little fragment of the flag. Let us now concatenate this and remove the spaces from between:
Flag: picoCTF{3nh4nc3d_24374675}
Challenge 2 – File types
Let's begin this challenge by downloading the linked PDF file.
curl -LO "https://artifacts.picoctf.net/c/324/Flag.pdf"
When I tried to open the linked Flag.pdf, I faced an error:
When I clicked on hint it said:
It is possible for this file to not be a PDF, let us now check it using the “file” command in our Linux terminal. file command is used to determine file type.
file Flag.pdf
Running this command revealed that this is not a PDF file, but it's a “shell archive text”. Let us now try to rename it to .sh
extension, give it executable permission and then try to execute it.
mv Flag.pdf Flag.sh
chmod +x Flag.sh
./Flag.sh
It threw an error uudecode: command not found
After doing a quick internet search I found Arch Linux's manual for uudecode and under package information found the package name: “extra/sharutils”
Let us now install it:
sudo pacman -S sharutils
Now after I re-executed the Flag.sh
did ls
, I found a new file named flag
in my directory.
After again running file
command on our new flag
, it is revealed that it is current ar archive
.
To extract it I then used binwalk: binwalk -e
Which then created a folder named _flag.extracted
which then contained a file named 64
which turned out to be gzip compressed data
Again, we can use binwalk
to extract this file. Upon doing so, we got a folder _64.extracted
which contained two files flag
and flag.gz
, both compressed data, one lzip and the other one gzip.
I tried extracting the flag
lzip file using binwalk -e flag
, but it didn't work. So I tried extracting it using lzip
command, and the output file flag.out
turned out to be LZ4 compressed data
lzip -k -d flag
Then I extracted the lz4
data and then ran file
command on the output file2.out
, and it turned out to be LZMA compressed data
lz4 -d flag.out flag2.out
Then the to extract the lzma
file I executed
lzma -d -k flag2.out
But it gave me an error:
lzma: flag2.out: No such file or directory
So I renamed the flag2.out
to flag2.lzma
and ran the command again:
lzma -d -k flag2.lzma
Which successfully executed and created a new file named flag2
which then turned out to be lzop compressed data
upon running file
command.
To extract the lzop
file, I then installed the lzop
package using sudo pacman -S lzop
.
After changing the name of the file flag2
to flag2.lzop
I ran:
lzop -d -k flag2.lzop -o flag3
Which then created the file named flag3
which turned out to be lzip compressed data
and then again, to extract it I ran:
lzip -k -d flag3
Which created flag3.out
, XZ compressed data
Then after renaming flag3.out
to flag4.xz
, I extracted flag4.xz
using the xz
command, which created flag4
which turned out to be an ASCII text.
mv flag3.out flag4.xz
xz -d -k flag4.xz
After running cat
on flag4
which is an ASCII file, I got:
7069636f4354467b66316c656e406d335f6d406e3170756c407431306e5f
6630725f3062326375723137795f37396230316332367d0a
So to decode it from hex I went over to CyberChef which gave me the flag:
picoCTF{f1len@m3_m@n1pul@t10n_f0r_0b2cur17y_79b01c26}
Challenge 3 – Lookey here
Let's begin this challenge by downloading the linked anthem.flag.txt
file.
This time it is what it says, a text file.
After viewing it in using less I realised it's a very long text file, so I ran wc
to count the lines:
wc -l anthem.flag.txt
Output:
2146 anthem.flag.txt
So I ran grep
to search through it if it contains our flag or not.
grep pico anthem.flag.txt
And we've found the flag:
picoCTF{gr3p_15_@w3s0m3_58f5c024}
~ spignelon | Ujjawal Saini