İPUCU

Capture The Flag Vulnerable VM Walkthrough & Capture The Flag Writeup Yazabileceğiniz Bölüm

Seçenekler

Hax.Tor CTF Tam Çözüm [1..5/1..15]

23-06-2016 21:32
#1
Par4d0x1D - ait Kullanıcı Resmi (Avatar)
Researcher
Üyelik tarihi:
02/2012
Yaş:
17
Mesajlar:
244
Teşekkür (Etti):
42
Teşekkür (Aldı):
539
Konular:
27


##[Hax.Tor CTF Tam Çözümü (1..5/1..15)]##


"Bilgi, paylaştıkça çoğalan bir hazinedir."
- Bhartrihari

##[0x00]##
#
CTF (Capture The Flag), Türkçesi ile Bayrak Kapmaca, bilgi güvenliği yarışmalarına verilen genel isimdir. Jeopardy ve Atak Defansı olmak üzere 2 şekilde gerçekleştirilebilir. Jeopardy CTF'lerde her güvenlik sorusuna ait olan flag, yani bayrağı bulur, soru başına puanlarınızı toplarsınız. Atak defansında ise hedef olarak belirlenen sistemde zafiyetleri kapatmaya çalışır, ayrıca yarıştığınız kişilerin zafiyetlerini de bulmaya çalışırsınız. Yarışmaya takımlar halinde katılırsınız. Sorular belirli kategoriler baz alınarak hazırlanır, misal "Web Aplikasyon Güvenliği, Ağ Teknolojileri/Güvenliği, Kriptografi, Tersine Mühendislik.." Bu tarz etkinlikler, bize aslında çok şey katar. En basitinden siber güvenlik bilgimiz ister istemez artış gösterir, takım ruhunu hissederiz.


#Bugün, sizlerle birlikte gayet eski bir CTF olan "Hax.Tor" adlı etkinliğin tam çözümü hakkında fikir yürütüp, kafa patlatacağız. Açıkçası ciddiye alıp, adam akıllı çözmeye çalışacağım. Çözerken de yaşadıklarımı buraya aktaracağım. Eğer şu an bunu okuyor iseniz, bilin ki başarılı olmuşum (: Hax.Tor, kayıt olmak için öncelikle bizi 5 soru ile sınar, ardından kayıt olur ve asıl sorular ile yüzleşmek zorunda kalırız. Umarım tüm herkes için öğretici, ayrıca eğlendirici bir yazı ortaya çıkar. Her ne ise, çok uzatmadan başlayalım. Öncelikle web sitesini verelim. Aşağıdaki URL adresinden CTF etkinliğine ulaşabilirsiniz. Artık "Start" yazan butona tıklayarak sorularımızla yüzleşmeye başlayabiliriz.
Kod:
https://hax.tor.hu/welcome/


0.1 <Baslangic>

##[~0x1]##
#
Evet, ilk sorum olan "warmup1"deyim. Burada, bana "Şifre kaynak kodunda" demiş, aradan da Javascript diline lafı geçirmiş.. Kaynak kodlarını görmek üzere Kontrol + U (CTRL+U) kombinasyonunu kullandım. Kaynak kodlarına ilk baktığımda hiçbir ipucu göremedim, ancak scrollbar'ı gördüğüm zaman devamı olduğunu anladım. Yaklaşık 200 satır geçtikten sonra asıl kodlara ulaştım. Benim için önemli olan kısım, ipucunda dendiği gibi "Javascript" bloğunda yer alıyordu.
Kod:
function a(){
    thepw = 'warmup1';
    thepw = thepw+'lol';
    thepw = thepw + 'copter';
    if (docu.ment.loc.ation.lf.pw.value==thepw) {
        docu.ment.loc.ation = '/'+thepw; } else { alert('That is not correct. Please try again.');
    }
}


0.2 <Warm UP 1>

İnceler incelemez, "thepw" adında bir değişken oluşturup stringler ile ilave ettiğini doğal olarak anladım, "warmup1", "lol" ve "copter" stringlerini birleştirdim. Karşıma flag çıktı bile, "warmup1lolcopter". Bu flagi yazdım ve sonuç: 2. hazırlık aşamasındayım! Aah, ve iyi bir haber, 2. aşamayı iptal etmişler. Dendiği gibi "fail" yazıp geçtim..



0.3 <Warm UP 2 ~ Fail>

##[~0x3]##
#
Bu aşamaya başlar başlamaz, benden "Domuz pastırmasını" (Bacon) seçmemi isteyen bir liste çıktı. Aslında bu bölümü yapmanın birçok yolu var. Ancak kolayıma geldiğinden dolayı kaynak kodlarından, herhangi bir liste elemanının değerini değiştirerek "Bacon" yapıp butona tıklamayı seçtim. Bunun için "Sağ Klik > Inspect Element with Firebug" diyerek eklentim üzerinden kaynak kodlarını açtım. Karşıma doğal olarak "Select" tagları, ve liste elemanları çıktı.
Kod:
<select class="select" name="chosen">
<option value="Apple">Apple</option>
<option value="Lemon">Lemon</option>
<option value="Mango">Mango</option>
<option value="Orange">Orange</option>
</select>
Ben de Elmanın "value" seçeneğini "Apple > Bacon" olarak değiştirdim. Böylelikle butona tıkladığım zaman, domuz pastırmasını seçmiş kadar olacaktım. Sonrasında listeden "Apple" seçeneğini seçip, "Proceed" butonuna tıkladım. Sonuç olarak bir seviyeyi daha geçmiş oldum.



0.4 <Warm UP 3>

##[~0x4]##
#
Geçer geçmez, karşıma birer adet ipucu ve şifrenin bulunduğu sayfayı işaret eden adres çıktı. "Bu kadar kolay olmamalı" diye düşündüm. Düşündüğüm gibi de oldu. Şifrenin bulunduğu yere yönlendiren referansa tıkladığım zaman, tarayıcımın banlandığını ifade eden bir bilgi mesajı çıkageldi. Uyanıklık edip telefondan giriş yaptım, aynı mesaj. Arka planda neler döndüğünü, ipucuna baktığım zaman anladım. Beni, HTTP protokolü hakkında yazılmış basit bir yazıya yönlendirmişti. Demek ki burada, HTTP başlık bilgisinden yola çıkarak bir şeyler yapmam gerekli, ve o anda dank etti, "Şifrenin bulunduğu sayfa, benim HTTP başlığımda bulunan User-Agent bilgisini alıyordu!". Zaman kaybetmeden HTTP trafiği izlemeye yardımcı olan "Tamper Data" adlı plug-in'i açtım ve HTTP başlık bilgisinden User-Agent'ı kaldırdım. Karşıma aşağıdaki cümle çıktı,



0.5 <Warm UP 4>

Kod:
The password is: spaceship
Buradan bayrağımın "spaceship" anahtar kelimesi olduğunu anladım ve yazdım. E doğal olarak bir sonraki aşama için ayırttığım uçuş biletini kullanıp, hedefime "spaceship" ile gitmiş oldum (: Anlamadıysan, "Translate it *-* ".

##[~0x5]##
#
Ve son göreve de ulaşmış oldum, artık ısınma turları bitecek idi. Karşıma bir form çıktı, görünce şaşırmadım değil.. Bir şifreleme yapmış, ayrıca giriş formunu da ataklara karşı korumak için basit bir kontrol mekanizması ile güvenliğe almıştı. "Aman ne güzel" diye düşündüm. Karşıma çıkan şifrelenmiş metne göz gezdirdim. Önce RGB değerleridir diye kontrol ettim, ancak doğal olarak sayıları tutmuyor idi. Birden fazla IP adresidir diye düşündüm, diğerinden daha saçma geldi. Sonradan, "Neden form üzerinde bir giriş denemesi yapmıyorum?" diye içimden geçirdim. "Password:" olan kısma "selam" yazıp bir denedim. O da ne! Karşıma aşağıdaki gibi bir dizi çıkageldi.
Kod:
Hash    68 230 82 128 91 214 86 24 90 204
Should be    83 230 69 128 66 214 89 24 92 204
Bazı sayılar nedense tekrar ediyorlardı. Ayrıca, 5 haneli bir şey girmediğim taktirde uzunluklar bile tutmuyordu. Demek ki aradığım bayrak 5 haneli olmalıydı. Şifremi, "salam" olarak değiştirip tekrar denedim. Ve beni çözüme yaklaştıran an, çıktı aynen aşağıdaki gibi oldu,
Kod:
Hash    68 230 86 128 91 214 86 24 90 204
Should be    83 230 69 128 66 214 89 24 92 204


0.6 <Warm UP 5 ~ Last>

Sadece bir sayı dizisi değişmişti. Vee algoritma çözülür. Arka planda her harfe bir değer atanmıştı. Aralarda tekrar eden sayıları çıkardığımız taktirde, her harfin değeri ortaya çıkıyordu. Bu mantık ile gidecek olursak,

68 > "s"
82 > "e"
91 > "l"
86 > "a"
204 > "m"
..




0.7 <Warm UP 5.1 ~ Last>

olarak sıralanmışlardı. Bu kısımda, deneme - yanılma ile 5'er 5'er harflerin değerlerini buldum, "Should be" olarak gösterilen şifre üzerinde tekrar eden sayıları çıkardığımda, olması gereken metnin şifrelenmiş hali ortaya çıkıyordu. Şöyle ki, benden istediği "83 69 66 89 92" şifresinin karşılığıydı. Deneme yanılma ile bulduğum karşılıklara göre "83 > d, 69 > r, 66 > u, 89 > n, 92 > k" oluyordu. Yani şifrem "drunk" olmalıydı. Cidden de sorunun bayrağı "sarhoş" etmişti.. Girdim, ve karşıma kayır formu geldi. Bu aşamayı, gazetelerde yer alan "her harfe bir sayı" vererek asıl cümleyi bulmamızı sağlayan bulmacaya benzetmedim değil..

##[0x0]##
#
Artık kayıt olabilirim, çünkü bunu hak ettim. Buraya kadar gelip yazana kadar yaklaşık 25 dakikamı harcadım.. Karşıma çıkan kayıt formunu, ileriki maceralar için doldurdum. Yorumumu da bıraktım.. Butona tıklar tıklamaz, beni 70'lerden diye düşündüğüm bir kalabalık alkışladı. Hiç gerek yok böyle şeylere yahu.. Her ne ise, mail adresime gelen onay postasından üyeliğimi aktifleştirdim. Bana şifremi de mail üzerinden yolladılar.. Ve, mutlu bir başlangıca hazırım.



0.8 <Kayit Formu>

#Verdiği şifre ile SSL üzerinden giriş yaptım - zorunlu tutmuşlar - ve şifremi değiştirdim. Tabii ki de "abbas123" yaptım. Giriş yapar yapmaz beni iptal edilmiş bir soru karşıladı, dendiği gibi "next" yazıp geçtim.
Kod:
Broken level - type 'next' to continue
##[0x2]##
#
Aman Allah'ım, bunlar da ne böyle? Bana birkaç anlamsız string vermiş, hata olmalı (mı acaba..). Şaka yahu.. Bunlar besbelli "hash" idi. Verdiği ipucuna baktım, dakikalar sürecek dediğine göre bir kırma işlemi var (Hayır, bundan bunu çıkarmadım tabii ki. Referans olduğu URL'de John the Ripper adlı aracın indirme linki var idi.) Ona geçmeden önce, stringlerin özelliklerine göz gezdirdim. Başlarında birer adet anahtar var idi, ayrıca uzunlukları da aynıydı. Bunların "DES" olduğunu anlamam çok da uzun sürmedi. Hepsini alıp John the Ripper'a verdim. Ve saniyeler içerisinde kırdı.
Kod:
john.exe --format=DES hash.txt


0.9 <Level 2>

Karşıma çıkan mesaja göre, aralarında boşluk bırakarak 7 adet sözcük/harf yazmam gerekiyordu. "a b c d e f g". Bayrağım bundan ibaretti, aynen dediği gibi yaptım ve bir sonraki göreve geçiş hakkımı kazandım.

##[0x3]##
#
Yine bir kriptografi sorusu ile karşılaştım, ancak bu sefer işim kolaya benziyordu. Gereğinden çok ipucu vermişti. O bana pis pis gülen surat ifadesine tıkladım. Beni "Base64" şifreleme algoritmasının Wiki üzerindeki tanımına ve açıklamasına yönlendirdi. Bundan, hedef şifreleme algoritmamın "Base64" olduğunu anladım. Ancak bir sorunum vardı, hem aralarında boşluklar bırakılmış, hem de "Padding"e yer verilmemişti. Bu sebeple Python programlama diline başvurup, bu sorunları hızlıca çözdüm.
Kod:
>>> import base64, binascii
>>> Degerler = []
>>> Deger = base64.b64decode("".join("V m 0 w d 2 Q y U X l V W G x X Y T F w T 1 Z s Z G 9 W R m x 0 Z U V 0 W F J t e F Z V M j A 1 V j A x V 2 J E T l h h M k 0 x V j B a S 2 M y S k V U b G h o T W s w e F Z t c E d T M k 1 5 U 2 t W V W J H a G 9 U V 3 N 3 Z U Z a d G N F Z F R N b E p J V m 1 0 c 2 F W S n R h R z l V V m 1 o R F Z W W m F k R 0 5 G Z E Z S T l Z U V k p W b T E w Y T F k S F N r Z G p T R U p Y W V R G d 2 F G W k Z S U Q".split()) + "==")
>>> while(True):
    try:
        Padding = 4-len(Deger) % 4
        if(Padding):
            Deger += b'=' * padding
        Deger = base64.b64decode(Deger)
        Degerler.append(Deger)
    except(binascii.Error):
        print("[^^] Sonuc: ", str(Degerler[-2], 'utf-8'))
        break

    
[^^] Sonuc:  64BASE
>>>


1.0 <Level 3>

Koda bakacak olursak, öncelikle gerekli olan kütüphanelerimi (Binascii, Base64) içe aktardım. Sonrasında, "Degerler" adında bir liste oluşturup, verdiği ilk şifrelemenin arasındaki boşlukları silerek "decode" edilmiş halini "Deger" adındaki değişkene atadım. Bir döngü içerisinde gerekli olan dolgu sayısını "Padding" adındaki değişkene atayıp, değişken bulunduğu taktirde "Deger" degiskenime dolguyu eklemesini sağladım. Ve "Deger" adlı değişkenimi, kendisinin "decode" edilmiş haline atayıp bunu "Degerler" adındaki listeme ekledim. Herhangi bir hata durumunda da, listemin sondan 2. elemanını ekrana yazdırıp döngüyü sonlandırdım. Sonuç? Tabii ki bayrağım "64BASE" idi. Bunu yazıp, sonraki aşamaya girişimi yaptım. Ve her zamanki gibi.. Diğer aşama da artık çalışmıyor. Continue yazıp bir sonrakine geçtim.
Kod:
Level temporarily broken, just enter 'continue' for now.
##[0x5]##
#
Bu kısımda, benden bir sanal adresleme (VHost) üzerinde bulunan baykuşun ismini yazmamı istiyor. Bunun için, theHarvester adlı scripti kullanarak arama motorlarında yer alan URL adreslerine bakmaya başvuracağım. LAN ağımda çalışan Ubuntu sunucuma theHarvester adlı scripti, GitHub üzerinden, konsoluma "git clone https://github.com/laramies/theHarvester.git" yazarak "/theHarvester" dizinime yüklüyorum. Sonrasında, aşağıdaki gibi örnek bir kullanım ile kolayca hostlara ulaşıyorum.



1.1 <Level 5>

Kod:
$ python theHarvester.py -d tor.hu -l 100 -b google
...output
188.227.224.116:hax.tor.hu
188.227.224.116:www.hax.tor.hu
188.227.224.116:game.tor.hu
...output
Bu sayede, "Google" arama motorunda veritabanında yer alan ilk 100 sonuç içerisinde, "tor.hu" adresiyle aynı konumda bulunan adreslere göz atma imkanına sahip oldum. Tek IP adresine sahip olan adresler dikkatimi çekti, bu da "Name Based VHosting" yapıldığı konusunda biraz daha emin olmamı sağladı. "game.tor.hu" adresine gittiğim zaman da, beni bir baykuş ve arkadaşları karşıladı. Üst kısımda "uid 0 0wl AnD ThE TeAm Of FoReSt" yazıyor idi. "Password is ??? ? owl." olan yeri, "uid 0 owl" olarak biçimlendirdim aklımda, ve bayrağım "uid 0" idi. Yazıp bu aşamayı da başarıyla bitirdim.

##[0x6]##
#
Sıradaki aşamada, benden "SQL Ninjitsu" yapmamı istiyordu, Referans olduğu URL adresine gittiğim zaman karşıma bir giriş formu çıkageldi. "Kullanıcı: abbas, Şifre: test" olarak giriş yapmayı denedim. E doğal olarak, beni bir bilgi mesajı karşıladı. "Invalid username or password". Girdiğim veriler GET methodu ile aplikasyona yollanıyor idi.Hızlıca arka planda çalışan query hakkında fikir yürüttüm. Tahminen bu tarz bir şey olmalıydı,
Kod:
$uname = $_GET['user'];
$pass = $_GET['pass'];
$query = "SELECT * FROM users WHERE pass = 'pass' AND uname = '$uname'";
..code


1.2 <Level 6>

Bunu baz alarak, "$query" değişkenine kod enjektesi yapmaya karar verdim. Aplikasyona, "?user=abbas' OR '1' = '1&pass=test' OR '1' = '1" olarak bir payload yolladım. Yani, yukarıdaki SQLi sorgusu aşağıdaki değeri aldı. Hal böyle olunca, "OR" Logical operatörünün bir yanı "True" olunca, diğer tarafı her ne olursa olsun sonuçta "True" döndüreceğinden, sorgu sonucu başarılı olacaktı. Böyle de oldu. Bu payloadı gönderdiğim zaman, ekranıma "Password is: 0x90" yazdırıldı. Bu sorumdaki flag, "0x90" idi.
Kod:
SELECT * FROM users WHERE pass = 'abbas' OR '1' = '1' AND uname = 'test' OR '1' = '1'
##[0x7]##
#
Soruya baktığım zaman, beni bir "Snifflog.txt" adında dosya karşıladı. İncelediğim zaman, hemen bunun adından da anlaşılacağı üzere, ağda koklanmış bir trafik olduğunu anladım. Gönderilen veriler arasında ".M.i.c.r.o.s.o.f.t. .S.Q.L. .S.e.r.v.e.r." string ifadesinin olduğu dikkatimi çekti. Demek ki MS SQL Auth. Paketi olmalıydı bu incelediğim şey. "Hint"e tıkladığım zaman, beni "MS SQL Server Captured Authentication Packets Cracker" başlığına sahip bir Sniffer/Cracker aracının URL adresine yönlendirdi. Demek ki tahminim doğru idi. Abilerimiz yazmış, bize de okumak düşer diyerekten kodu ve yorum satırlarını inceledim. Koda dahil olmayan bu açıklama oldukça dikkatimi çekti,
Kod:
For example to encrypt the character "p":
(ASCII is 70 hex):
70 is expanded to 70 00
After the swap the result is: 07 00
XOR with A5: A2 A5

Hence to decrypt it, we will take the odd bytes, XOR with A5, and swap the higher and lower 4 bits.
Take A2
XOR with A5: A2 XOR A5 = 07
Swap: 7 becomes 70.


1.3 <Level 7>

Burada, algoritmaya yer verildiğini anladım. Hatta çözümüne de değinilmişti. Şöyle ki, 16'lık karakteri XOR vasıtasıyla A5 anahtarı ile şifreleyip tersini alarak, bunu karaktere çevirmemiz yeterli idi. Hemen "snifflog.txt" dosyasına giderek, A5 anahtarının yer aldığı satıra göz gezdirdim. Bu anahtarları çıkardım, karşıma yandaki hexadecimal ifadeler çıktı, "0xb1, 0x93, 0xe2, 0xf6, 0xc6, 0xb6, 0x11, 0xf3, 0x32". Bunları çözümlemek için, Python'un gücünden tekrardan yararlanarak tek satırlık bir kod yazdım. Kodum, aynen şifreleme algoritmasının panzehirinde verildiği gibi, hexadecimal ifadeleri alıp "0xA5" anahtarını kullanarak şifreliyor, sonra oluşan her bir ifadeyi tersine çevirerek ascii karakter karşılığına çeviriyor idi.
Kod:
>>> str(codecs.decode("".join([str(i[::-1]).replace('x0', '') for i in list(map(hex, [i ^ 0xa5 for i in [0xb1, 0x93, 0xe2, 0xf6, 0xc6, 0xb6, 0x11, 0xf3, 0x32]]))]), "hex_codec"), 'utf-8')
'Act561Key'
>>> 
Sonuç olarak birazcık vaktimi alan bu sorunun cevabı, aynen çıktıda yer aldığı gibi "Act561Key" olarak belirlenmişti. Ben de bunu cevaplayarak, sonraki soruya başarıyla adımımı atmış oldum.

##[0x8]##
#
Sıradaki soruda, referans olduğu URL adresinde şifrenin JPEG formatındaki fotoğrafta yer aldığını ifade eden bir cümle ile karşılaştım. Ancak, devamında ".hu lokasyonundan giriş yapmam" gerektiğini ifade eden bir ifade daha yer alıyordu. Girmeye çalıştığım zaman, aynen dendiği gibi bir mesaj ile karşılaştım, ve birkaç tane gerekli/gereksiz ipucu.. Bana bunu "Google"lamam gerektiğini diyorlardı, aynı benim yukarıda "Google it (:" dediğim gibi.
Kod:
oops, directory needs .hu host to see
Ancak lokasyon işi oldukça kolay idi, en basitinden web tabanlı bir proxy ile hallederdim. Bunun için, GHDB kullanarak arama motoruna aşağıdaki söz dizimini yazmam yeterli oldu. Böylelikle, "Macaristan" lokasyonlu, web proxy görevini üstlenen bir web sitesini kullanarak o lokasyon üzerinden, benden ziyaret etmemi istediği URL adresine giriş yapabilecektim. Karşıma ilk çıkan web sitesine, yani "http://www.webproxy.hu/" adresine uğradım. Buradan, bana verdiği URL adresine gittim.
Kod:
GHDB Dork: web proxy site:hu


1.4 <Level 8>

Sonuç olarak, karşıma JPEG formatındaki resim çıktı, üstünde "tehpw" yazıyordu. Benden istediği bayrak bu olsa gerek, çünkü sorunun başında bunun şifrem olacağından bahsetmişti. Öyle de oldu, bunu "textbox"a yazıp sonraki seviyeye geçiş yaptım.

##[0x9]##
#
Huzur.. Açıklamayı okuduğum zaman, bu bölümde matematiksel işlemler yapılması gerektiğini anladım. Tam da ilgi alanım. Uzatmadan, sorumuzu Türkçe'ye çevirdim. "Dünya çapındaki çeşitli sunuculardan DDoS saldırısı geliyor. 1/4'ü Amerika'dan, 1/6'sı Avrupa'dan, 1/8'i ise Asyadan. Avrupa'dan olanlar, Asya'dakilerden 120 daha fazla. Şifre, toplam saldırgan sayısı ile ilgili." Bu kısımda, ilkokulda öğrendiğimiz "Kesirler" konusunu hatırlamam yeterliydi. Öncelikle,
Kod:
x.1/6 - x.1/8 = 120
x/6 - x/8 = 120
denklemini kurdum. Paydalarımızı eşitlediğim zaman, yani paydalarda genişletme yaptığım zaman işim daha da kolaylaşacaktı. Bu sebeple genişletmemi yaptım. Denklemi tekrardan kurup, çözdüm. İşlemimin sonucunda, bayrak "2880" olarak çıkacaktı. Girip sonraki aşamaya geçtim.
Kod:
4x/24 - 3x/24 = 120
(4x - 3x)/24 = 120
x/24 = 120
1.x = 124.24
x = 2880 = Bayrak


1.5 <Level 9>

##[0xa]##
#
Bu aşamaya geçtiğim zaman, karşıma bir takım rastgele ifadeler çıktı. Önce hiçbir anlam veremedim doğal olarak, ancak sayfayı yenilediğim zaman karakterlerin konumları ve uzunluklarının değişmediğini fark ettim. Sadece karakterlerin kendileri değişiyor, her harfe de rastgele bir karakter düşüyor idi. İpucuna baktığım zaman, beni bilgisayar ile ilgili birkaç şiirin olduğu bir adrese yönlendirdi. İşimi kolaylaştırmak adına "G" harfine yönlendirmişti, var olsun.. Bana ürettiği rastgele stringlerin uzunlukları ve konumları ile, şiirlerde yer alan kelimelerin konumları ve uzunluklarını karşılaştırdım. "Geek" adlı bir şiir tam anlamıyla tuttu. Şiirin başlığını yazdığım zaman işe yaramadı. Ancak şifrenin bir şiir olamayacağını biliyordum.
Kod:
N onem w ondm hk-onkm * N rwem kh vmkvm hd inpm * Nkvnxm w owc woo xwq * N'em woswqv cmmk irnv swq * N'p w gmma * N'p w gmma * Hr rh N'p w gmma * Ghhx Ohux N'p w gmma. *** Irm jwvvshux nv snoxirnkg
E metg v mewg xi-meig * E svtg ix jgijg xw rekg * Eijelg v mva vmm lvn * E'tg vmcvnj aggi rsej cvn * E'k v bggf * E'k v bggf * Xs sx E'k v bggf * Bxxl Mxhl E'k v bggf. *** Rsg uvjjcxhl ej cemlrseib 
Bana ürettiği stringlerde, yıldız işaretlerine rastladım. Hep aynı konumdalardı. Sonradan jeton düştü, bunlardan tekli olanlar satırları, 3'lü olan ise bambaşka bir stringi işaret ediyordu! 3'lünün gerisindeki karakterlerin karşılıklarını şiire göre belirleyip, 3'lüden sonraki karakterlerin yerlerine yazdım. Sonuç? Bu cümleyi elde ettim, "the *assword is wildthing". Bayrağım "wildthing" idi. Yazdıktan sonra, bu görevi de tamamlamış oldum.



1.6 <Level 10>

Kod:
Cqs vrkkwoeh dk wdnhcqdyi
??? ???????? ?? ?????????
the *assword is wildthing
##[0xb]##
#
Zamanla yarışacağım gibi gözüküyordu, çünkü benden bir insanın çok zor yapabileceği bir şey istiyordu. Her 10 saniyede 1 değişen bir stringin arasındaki boşlukları silip, bunu hash'e çevirip yollamam gerektiği yazıyordu. Bir insan için gayet zor, ancak CTF'de "Bu sadece insanlar içindir" diye bir şey yazmıyordu? Hemen kötü gün dostum Python yorumlayıcısını açtım ve yazmaya koyuldum. Hemencecik bitmesi için, "requests, re ve hashlib" kütüphanelerini kullanarak basit bir parser/encoder yaptım. Kodlar aynen aşağıdaki gibiydi,
Kod:
>>> import hashlib, requests, re
>>> def Main(Cookie):
    URL = "https://hax.tor.hu/level11/"
    Headers = {'Cookie' : Cookie,
           'Accept-Encoding' : 'gzip, deflate',
           'Accept-Language' : 'tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3',
           'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
           'User-Agent' : 'AbbasWasH3re'}
    Source = requests.get(URL, timeout=10, headers=Headers, verify=False)
    BTag = re.findall(r"<b>(.*?)</b>", str(Source.content))
    Hash = hashlib.md5("".join(str(BTag[12]).split()).encode('utf-8')).hexdigest()
    requests.get(URL + "/?pw={0}".format(Hash), timeout=10, headers=Headers, verify=False)

    
>>> Main("HAXTOR=at1n2e3304s389lsc2bafb21o1")


1.7 <Level 11>

Artık tamamdır. Görüldüğü üzere ">>> Main("HAXTOR=at1n2e3304s389lsc2bafb21o1")" yazıp birkaç saniye bekledim, sonrasında da ise işlem tamamlandı. Web tarayıcımı yenilediğim zaman, sonraki göreve geçmiştim bile.. Ne yazık ki sonraki görev arızalı imiş, onu da "sense" diyip geçtim.

##[0xd]##
#
Soruların 1/5'i bitti bile.. Sorunun açıklamasında bir giriş sayfası ve kaynak kodlarını incelemem için bir web aplikasyonu vermiş, "http://hax.tor.hu/level13/login/source.php". Web aplikasyonu, HTTP GET methodunda "file" parametresindeki veriyi, yani dizinde yer alan dosyayı alıp, kaynak kodlarını ekrana yazdırıyordu. O an, "File Disclosure" zafiyetine rastlamış olabileceğimi düşündüm. Bu sebeple bölümü kolayca bitirebilmek için, kaynak koduna bile bakmadan "../index.php" verisini "http://hax.tor.hu/level13/login/source.php?file=../index.php" şeklinde aplikasyona yolladım, ancak karşıma boş bir sayfa çıktı. Bu nedenle hiçbir şeye başlamadan, kaynak kodlarını görmeme yarayan dosyayı incelemek için "source.php" adlı dosyayı incelemeye karar verdim. İncelediğim zaman karşıma bu çıktı,
Kod:
<?
    header("Content-Type: text/plain");        // give back plaintext ********

    $file = $_REQUEST['file'];                // filename
    $file = ereg_replace(":",'',$file);        // filter http:// ftp:// etc
    $file = ereg_replace("\.\.",'',$file);    // filter .. in filename 
    if (!file_exists($file) || is_dir($file)) { exit; }        // directories not allowed
    
    @Readfile($file);        // show contents
?>
koddan da anlayacağım üzere, bir filtreleme yapılmıştı. Bu sebeple giriş formunun kaynak kodlarından gitmek zorunda kaldım. Giriş formunun kodlarını incelerken, form giriş bilgilerini "*.txt" dosyalarından çektiğini fark ettim, ancak bu text dosyalarının dizinleri, değişkenlerin birleştirilmesiyle oluşturulmuştu. Her şeyden önce bu değişkenleri bulmam gerekliydi. "BaseDIR, UserDIR, User". Ayrıca aşağıdaki kod blogundan da anlayacağım üzere bir konfigürasyon dosyası var idi. Zaten değişkenlerin bazıları oradan alınıyordu. O dosyayı incelediğim zaman,
Kod:
Konfigürasyon dosyasının çekildiği blok;
function get_config() {
        ..code
        $rawconf = @file(".htconfig");        // some config vars read from .htconfig
        ..code
}

Dosya içeriği;
base /www/hax.tor.hu/www/level13/login/
userdir udir
fundir fundir


1.8 <Level 13>

Merakıma yenik düşüp, önce "fundir"de neler olup bittiğine baktım. Gülüp görevime devam ettim (: Filtrelemede alt dizinler engellenmişti, ama artık "basedir" dizini bende olduğundan, kendi sorumun dizinindeki "index.php" dosyasına tekrardan ulaşmayı denedim. Yani "http://hax.tor.hu/level13/login/source.php?file=/www/hax.tor.hu/www/level13/index.php" adresine gittim. Vee şifre karşımdaydı, "verynice". Ayrıca, kullanıcı girişi formundaki "*.txt" dosyalarının dizinlerini oluşturan değişkenlerden biri de buradaydı, artık dizinden şifreyi öğrenip giriş formuna da girebilirdim. Ancak fazla vakit kaybetmeden diğer soruya geçmek namına bayrağım olan "verynice"i yazıp sonraki göreve geçtim.

##[0xe]##
#
Yeni soruya geçtiğimde, tekrardan bir kriptografi sorusuna denk geldiğimi anladım. Bu sorunun açıklamasında, "Rainbow Tables çalışırken" sıkılmamam için bir URL adresi vermişler, çok düşünceli çıktılar yahu.. Her ne ise, "Rainbow Tables" çalışacağına göre, bu karmaşık ifadelerin hash fonksiyonu olmaları gerekir diye düşündüm, uzunluğuna daim dostum Python yorumlayıcısından baktım "len("..hash")" diyerekten, 160 haneli idi. Aklıma direkt "40 haneden oluşan SHA1" ve "32 haneden oluşan MD5" hash fonksiyonları geldi. Bu sebeple her ikisini de denemek amacıyla, bana verdiği o stringi 32/40'lı parçalara aşağıdaki kodlar yardımı ile böldüm.
Kod:
>>> import re
>>> def Bolucu(String):
    return("\n".join([i for i in re.findall(r'.{1,32}', "".join(String.split()), re.DOTALL)]))

>>> print(Bolucu("9 e 9 2 5 e 9 3 4 1 b 4 9 0 b f d 3 b 4 c 4 c a 3 b 0 c 1 e f 2 0 7 c c 6 9 4 b 9 b 3 f c 6 3 6 7 1 0 f a 0 8 b 6 9 2 2 c 4 2 b e 2 a 7 1 0 6 f 1 c c 8 b b 1 e 1 3 1 8 d f 7 0 a a 0 a 3 5 4 0 c 2 0 a d 4 d 7 6 f e 9 7 7 5 9 a a 2 7 a 0 c 9 9 b f f 6 7 1 0 8 9 7 5 9 e 1 2 8 4 e 2 4 7 9 b 9 9 1 d 2 6 6 9 d e 1 0 4 9 4 2 "))
9e925e9341b490bfd3b4c4ca3b0c1ef2
07cc694b9b3fc636710fa08b6922c42b
e2a7106f1cc8bb1e1318df70aa0a3540
c20ad4d76fe97759aa27a0c99bff6710
89759e1284e2479b991d2669de104942
>>>
Çıktıdan çıkan hashleri, açıklamada "Rainbow Tables"dan bahsettiğinden dolayı genel bir sözlük ile test etmem yeterli olacak idi, web üzerinde yer alan veritabanlarında bile karşılığı olabilirdi. Hashlerin MD5 mi, SHA1 mi, yoksa başka bir hash fonksiyonu olması gerektiğini öğrenmek adına ilk denemeyi yapmak için "HashKiller" adlı web sitesinin veritabanından yararlandım. Denediğim zaman, veritabanı hepsini kapsadığından dolayı çözümlenmişti bile! Aynen aşağıdaki gibi bir çıktı aldım.



1.9 <Level 14>

Kod:
9e925e9341b490bfd3b4c4ca3b0c1ef2 MD5 : this
07cc694b9b3fc636710fa08b6922c42b MD5 : time
e2a7106f1cc8bb1e1318df70aa0a3540 MD5 : enter
c20ad4d76fe97759aa27a0c99bff6710 MD5 : 12
89759e1284e2479b991d2669de104942 MD5 : words
Bu sorunun bayrağı, herhangi 12 adet kelime idi. "a b c d e f g h i j k l" yazarak bu görevi de tamamlamış oldum. Sonraki soruya geçtiğimde, sorunun iptal edilmiş olduğunu fark ettim. Bana söylendiği gibi, "drat" yazıp geçtim.



2.0 <Level 15>

##[0xff~1]##
#
Evet arkadaşlar, Hax.Tor CTF etkinliğinin "Warm UP" soruları ile ilk 15 sorusunu, toplamda 20 sorusunu başarıyla çözmüş olduk. Devamını en kısa sürede yazıp paylaşacağım. Umarım herkes için öğretici/eğlenceli bir Türkçe makale hazırlayabilmişimdir. Herkese kolay gelsin, sağlıcakla.. Sevgiler, @efeoglu_e.
Kullanıcı İmzası
Konu M4K4R tarafından (27-03-2018 22:16 Saat 22:16 ) değiştirilmiştir.

23-06-2016 21:33
#2
qRunt2 - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
07/2015
Mesajlar:
1.712
Teşekkür (Etti):
830
Teşekkür (Aldı):
644
Konular:
118
Sabahtan beri olan uğracın sonucu... Eline sağlık par
Kullanıcı İmzası
'' Beklenen hep geç geliyor; geldiği zaman da insan başka yerlerde oluyor. ''
OĞUZ ATAY


"Masallar albayım... Bu dünyada sonu mutlu biten tek şey onlar..."
23-06-2016 21:39
#3
Üyelik tarihi:
08/2012
Nereden:
Belirsiz.
Mesajlar:
11.243
Teşekkür (Etti):
4495
Teşekkür (Aldı):
5015
Konular:
1663
Ellerine sağlık

Sabit/
Kullanıcı İmzası


Vatan ne Türkiye'dir Türkler'e, ne Türkistan;
Vatan büyük ve müebbet bir ülkedir: Turan.

23-06-2016 21:41
#4
Black Viking - ait Kullanıcı Resmi (Avatar)
Forumdan Uzaklaştırıldı
Üyelik tarihi:
02/2016
Nereden:
[vkng@vkng~]
Yaş:
4
Mesajlar:
2.008
Teşekkür (Etti):
411
Teşekkür (Aldı):
455
Konular:
66
Eline Sağlık Abi

Öğrenmem gereken çok şey var :/
Konu Black Viking tarafından (23-06-2016 21:48 Saat 21:48 ) değiştirilmiştir.
23-06-2016 22:06
#5
Üyelik tarihi:
10/2014
Nereden:
Karayipler
Mesajlar:
1.542
Teşekkür (Etti):
1671
Teşekkür (Aldı):
1130
Konular:
99
Yardım merkezindeki konular bile daha çok hit alıyor adam onca emek verdi emekten anlayan yok

Ellerine sağlık
Kullanıcı İmzası
Black Viking Teşekkür etti.
23-06-2016 22:23
#6
qRunt2 - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
07/2015
Mesajlar:
1.712
Teşekkür (Etti):
830
Teşekkür (Aldı):
644
Konular:
118
Güncel//
Kullanıcı İmzası
'' Beklenen hep geç geliyor; geldiği zaman da insan başka yerlerde oluyor. ''
OĞUZ ATAY


"Masallar albayım... Bu dünyada sonu mutlu biten tek şey onlar..."
23-06-2016 22:37
#7
Black-Leonx' - ait Kullanıcı Resmi (Avatar)
Özel Üye
Üyelik tarihi:
06/2015
Nereden:
Nereye
Mesajlar:
10.125
Teşekkür (Etti):
866
Teşekkür (Aldı):
3552
Konular:
1189
Eline Emeğine Sağlık
Kullanıcı İmzası
TARİHİN TOZLU RAFLARINDA KAYBOLMA O RAFLARA TARİH YAZ !!!

Mümkün Olanı Başarmak İçin İmkansızı Yapmayı Unutma !

Siyah ~ Aslan'
23-06-2016 22:38
#8
02d3 - ait Kullanıcı Resmi (Avatar)
E-Mail onayı yapılmamış üye
Üyelik tarihi:
06/2015
Nereden:
LA
Mesajlar:
2.602
Teşekkür (Etti):
906
Teşekkür (Aldı):
590
Konular:
73
Alıntı:
qRunt2´isimli üyeden Alıntı Mesajı göster
Güncel//
Zaten 1 saat önce yorum yapmışsın. 2. sayfaya düşmeden -ki sayfanın yarısına bile inmedi- güncellenmiyor, ayrıca konu zaten sabitte.



Pardux Bey'ciğim, gerçekten nadir güzel konulardan. Emeğine sağlık.
23-06-2016 22:53
#9
SeYRaNi! - ait Kullanıcı Resmi (Avatar)
Forumdan Uzaklaştırıldı
Üyelik tarihi:
12/2015
Mesajlar:
645
Teşekkür (Etti):
81
Teşekkür (Aldı):
407
Konular:
35
Eline sağlık dostum epey uğraştığını biliyorum gayet zor bir sınav..
23-06-2016 23:02
#10
€r@y - ait Kullanıcı Resmi (Avatar)
Tamamen Forumdan Uzaklaştırıldı
Üyelik tarihi:
04/2015
Nereden:
İstanbul
Mesajlar:
3.978
Teşekkür (Etti):
2540
Teşekkür (Aldı):
1936
Konular:
269
Ellerine sağlık, tebrikler.

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler

Yetkileriniz
Sizin Yeni Konu Acma Yetkiniz var yok
You may not post replies
Sizin eklenti yükleme yetkiniz yok
You may not edit your posts

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodları Kapalı
Trackbacks are Kapalı
Pingbacks are Kapalı
Refbacks are Kapalı