Zanimiv CTF, že najlažje naloge so na medium težavnosti. Rešil sem jih kar nekaj. Potrebno je zelo dobro poznavanje Linux sistemov in ukazov kot so:
strace, strings, lsof, nc … različnih orodij kot so john, radare2, binwalk, nmap, … seveda je nuja imeti Kali Linux oz. podoben OS v virtalki, da se preko nje rešujejo naloge.
Na spletu je ogromno materialov, kako reševati naloge, kako izgledajo naloge. Zelo uporabna je stran:
https://github.com/9p4/cyber-camp-2020-writeup/tree/master (naloge na tej strani so enostavne).
Zanimiva naloga je bila tale; odpre se spletna stran z Log In (username / password). Na začetku sem pogledal izvorno kodo strani:
<html>
<head>
<title> Log Me In</title>
<script src=”js/jquery-3.4.1.min.js”></script>
</head>
<body>
<div>
<h1>Log Me In</h1>
<form>
<label for=”username”>Username: </label>
<input type=”text” id=”username” class=”username” name=”username” /><br>
<label for=”password”>Password: </label>
<input type=”password” id=”password” class=”password” name=”password” /><br>
<input type=”submit” id=”submit” class=”submit” value=”Submit” type=”button” />
</form>
<div id=”output”></div>
</div>
<script>
$(document).ready(function() {
$(“#submit”).click(function(e) {
e.preventDefault();
var user = $(“#username”).val();
var pass = $(“#password”).val();
words = [“vary”, “ends”, “broccoli”, “alike”]
if ((user === “admin”) && (pass === words[1] + “-” + words[0] + “-” + words[3] + “-” + words[2])) {
$(“#output”).empty().append((function(){var P=Array.prototype.slice.call(arguments),S=P.shift();return P.reverse().map(function(B,c){return String.fromCharCode(B-S-29-c)}).join(”)})(6,155,145,116,150,140,72,97,141,134,144,105)+(10).toString(36).toLowerCase().split(”).map(function(f){return String.fromCharCode(f.charCodeAt()+(-13))}).join(”)+(35).toString(36).toLowerCase().split(”).map(function(q){return String.fromCharCode(q.charCodeAt()+(-39))}).join(”)+(function(){var U=Array.prototype.slice.call(arguments),W=U.shift();return U.reverse().map(function(T,B){return String.fromCharCode(T-W-49-B)}).join(”)})(54,214,211,218,182,174,204,208)+(30).toString(36).toLowerCase().split(”).map(function(e){return String.fromCharCode(e.charCodeAt()+(-39))}).join(”)+(1).toString(36).toLowerCase()+(function(){var H=Array.prototype.slice.call(arguments),k=H.shift();return H.reverse().map(function(I,N){return String.fromCharCode(I-k-14-N)}).join(”)})(29,92)+(324).toString(36).toLowerCase());
}
})
});
</script>
</body>
</html>
V izvorni kodi se tako vidi, da je geslo sestavljeno iz spremnljivke words:
if ((user === “admin”) && (pass === words[1] + “-” + words[0] + “-” + words[3] + “-” + words[2]))
in da je pass potem pravilno zaporedje besed v spremeljivki words, ki ima vmes “-“:
words = [“vary”, “ends”, “broccoli”, “alike”]
Torej je pravilen rezultat beseda: ends-vary-alike-broccoli
Par nalog je bilo takih, da je bilo potrebno pogledati strings programa in se je besedna zveza za flag skrivala v stringsih oz. je včasih že deloval navaden cat ukaz, da si lahko izluščil besedilo za rešitev. Naslednje naloge so bile bolj kriptografske narave, kjer je bilo potrebno pretvarjati med različnimi stringi oz. najprej ugotoviti tip stringa. Tu je še nabolj v pomoč prišel CyberChef.
Naslednja zanimiva naloga je bila ti. EPOCH Time Converter (2 nalogi). V obeh nalogah je bilo potrebno priti do flaga. Prva je bila enostavna, saj sem kar hitro ugotovil da se v okence na spletni strani lahko vpisujejo Linux ukazi, katerim damo predpono ; (podpičje). Tako sem z ukazom ;ls / dobil imeniško strukturo Linuxa OS, nato sem izvedel ukaz ;ls -latrh / in videl ukaz flag.txt ter enostavno izpisal vsebino flag.txt datoteke z ukazom ;cat /flag.txt.
Naslednja naloga z EPOCH Time Converterjem je bil zelo podobna: pri tej nalogi je bilo pomembno, da ne izbrišemo predpone ukzaz, ki je v tem primeru bila EPOCH vrednost. Tako sem izvedel ukaz ls -ltrha /, ki pa ni deloval, saj je javil, da ne prepozna “character”. Kmalu sem ugotovil, da je “character” presledek in že pred časom sem nekje prebral, da je oznaka za presledek ${IFS}. Tako sem ukaze kombiniral z oznako za preledek, s tem, da se je tukaj flag.txt nahajal v skritem imeniku “___”.
Tako je končni ukaz za prebrat flag.txt bil:
1349361711.169942&&cd${IFS}___&&cat${IFS}flag.txt
Sledile so naloge v stilu naredi nc na port in se poskusi prijaviti ipd.
Sledila je še ena, kjer je bilo potrebno pregledati cookie, ki je bil md5 hash:
Pri nekaterih se je dalo pomagati z “Buffer overflow”, nekaterih nisem reševal, saj CTF vzame kar precej časa, saj dogodek traja 48 ur.
Enostavno, z majhno mero iznajdljivosti. 😀 Odlična izkušnja, za naslednjič vem kako deluje in bo tudi rezultat boljši.
Najtežje naloge so zame bile, naloge v katerij je potrebno iz exe datoteke izluščiti string. Orodij je ogromno in tukaj moje znanje še rahlo šepa. V nalogi, kjer sem dobil datoteko, kjer je ukaz file imedatoteke izpisal, da je filetype DATA, sem sklepal, da je z datoteko nekaj narobe. Odprl sem jo z binwalk, ki mi ni povedal nič novega. Zato sem jo odprl v hexeditorju, kjer sem videl, da manjka zapis ELF, torej menjka header, kjer je zapisano, da je datoteka ELF executable.
Torej manjka tole:
in to je potrebno vpisat v datoteko file. To lahko naredimo z recimo ghex editorjem, kar je rahlo nepregledno ali pa uporabimo xxd, da posortiramo vrstice v navadno TXT datoteko in dodamo ELF zapis:
xxd -c 16 -p file > output
odpremo datoteko output in dodamo:
7f454c46020101000000000000000000
v prvo vrstico, ter datoteko shranimo.
Datoteko konvertiramo nazaj:
xxd -r -p output > final
in preverimo ali imamo pravilen format oz. popravljeno datoteko:
file ./final
./final: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=d61ed43c5cdb98fa520d9ddad1c338d23ca0301d, not stripped
in dobimo željen rezultat: Flag: headersAreImportANT91-91