HackIstanbul'21 Writeup
HackIstanbul'21 Writeup

[TR] HACKISTANBUL ’21 WRITE UP

[TR] HACKISTANBUL ’21 WRITE UP

Merhabalar herkese, geçtiğimiz günlerde HackIstanbul’21 CTF yarışmasının ilk etabı yapılmıştı. Bu etapta bulunan diğerler sorulara göre zor olan soruların çözümlerini sizler için derledik, keyifli okumalar dileriz.

ARCFOUR


Soruda bize bozuk QR kod verilmişti

QR Kod 1
QR Kod 1

Bize verilen QR kodu https://www.gifgit.com/image/swirl-image sitesinden düzeltiyoruz.

QR Kod 2
QR Kod 2

Düzeltilmiş QR kodu okuduğumuz zaman bize

UGpiMlBGR3dPSDZRU2VqNkhaaGVocVRWMUFYcmU5RnJYcWFhdHRzbldaUTZoMCthS0MvcXpxcz0KUGFzczpDQkNIYWNrSXN0YW5idWw=

çıktısını elde ediyoruz.Bu bir base64 gibi görünüyor.

Base64’ü decode ettikten sonra,

Pjb2PFGwOH6QSej6HZhehqTV1AXre9FrXqaattsnWZQ6h0+aKC/qzqs= Pass:CBCHackIstanbul

çıktısını elde ediyoruz.Bu değeri RC4-40 ile decode edince karşımıza flag çıkıyor.

FLAG: {HI2021-62f170fb07fdbb79ceb7147101406eb8}

 

B2B21

Soruda bize b2b21.tar verilmişti. Tar’ı açtığımızda 2.tar çıktı daha sonra ondan ise 3.tar çıktı. Burdan içiçe birçok tar’ın olduğunu anladık ve bunun için bir script yazmaya karar verdik.

Çalıştırdığımızda 2.tar’dan 1232.tar’a kadar olan tar’lar ve CTF_flg adında bir dizin çıktı.

Dizinin içinde de ascii.pdf.gpg, A’dan N’ye kadar harflerle adlandırılmış dizinler ve her birinde 1.zip vardı. Bu zipler için de benzer bi script yazdık

F dizini hariç diğerler dizinlerden flag.txt çıktı fakat içlerinde fake flagler vardı. Ama F dizininde 221.zip için şifre soruyordu ve içinde flag.exe olduğunu söylüyordu. Oradakinin gerçek flag olduğunu düşünüp john tooluyla 221.zip’i kırmayı denedik fakat başarılı olamadık. Daha sonra ascii.pdf.gpg‘i de aynı şekilde john ile kırmayı denedik ve

$ gpg2john ascii.pdf.gpg > hash

File ascii.pdf.gpg
[gpg2john] MDC is missing, expect lots of false positives!

$ sudo john hash

Using default input encoding: UTF-8
Loaded 1 password hash (gpg, OpenPGP / GnuPG Secret Key [32/64])
Cost 1 (s2k-count) is 14155776 for all loaded hashes
Cost 2 (hash algorithm [1:MD5 2:SHA1 3:RIPEMD160 8:SHA256 9:SHA384 10:SHA512 11:SHA224]) is 2 for all loaded hashes
Cost 3 (cipher algorithm [1:IDEA 2:3DES 3:CAST5 4:Blowfish 7:AES128 8:AES192 9:AES256 10:Twofish 11:Camellia128 12:Camellia192 13:Camellia256]) is 3 for all loaded hashes
Note: This format may emit false positives, so it will keep trying even after
finding a possible candidate.
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
Proceeding with wordlist:/usr/share/john/password.lst, rules:Wordlist
princess         (?)

Bu şifreyle gpgyi decrypt ettik.

$ gpg --ignore-mdc-error --decrypt ascii.pdf.gpg

gpg: CAST5 şifreli veri
gpg: 1 anahtar parolası ile şifrelenmiş
79 104 33 32 78 111 44 32 89 111 117 32 109 117 115 116 32 99 111 110 116 105 110 117 101 46 32 84 104 105 115 32 116 101 120 116 32 104 97 115 110 39 116 32 103 111 116 32 97 32 123 70 125 108 97 103 32 58 68 32 123 67 84 70 45 67 48 110 116 49 78 117 51 125 10
gpg: UYARI: ileti bütünlük korumalı değildi

Çıkan sonucu CyberChef sitesinde kırınca bize bir hint verdi.

Hintin sonunda yazanın zip şifresi olup olmadığını denedik ve oldu

$ unzip 221.zip 

Archive:  221.zip
[221.zip] flag.exe password: CTF-C0nt1Nu3
  inflating: flag.exe

Strings komuduyla flag.exe ye bakınca bize bir binary verdi.

$ strings flag.exe 

01111011 01001000 01001001 00110010 00110000 00110010 00110001 00101101 01000111 00110000 00110000 01100100 01001010 00110000 01100010 01000110 00110001 01101110 01000100 01101101 00110011 01010111 00110011 00110100 01110100 00110100 00110010 00111000 01001000 01110110 00110110 01011001 01010011 01011010 00110001 01010000 01110011 00110011 01111101

Son olarak binary’i text’e çevirdiğimizde flagi elde ediyoruz

FLAG: {HI2021-G00dJ0bF1nDm3W34t428Hv6YSZ1Ps3}

go_GET


Soruda bize bir adet binary vermiş ve flagi bulmamızı istiyor.

İsminden yola çıkarak bunun go ile yazılmış ve compile edilmiş bir binary olduğunu düşündüm.Ayrıca içerisinde GET geçtiği için binarynin biryerlere http requesti atacağını tahmin ediyordum.Hemen strings go_GET.out | grep "http" komutunu kullanarak, binarydeki okunabilir değerler içersinde httpyi aradım ve tahminimde haklı çıktığımı gördüm.

Binarynin nereye request attığını bularak flage ulaşabileceğimi düşündüm.Bunun için binarye proxy bağlamak yeterli olacaktır.

CTF esnasında soruyu hızlı çözmek adına internet bağlantımı kesip binaryi çalıştırdığımda request atamayacağını ve error kodunda adersin sızdırılacağını düşündüm. İnternet bağlantımı kestim ve binary’yi çalıştırdım. Böylelikle request’in atılacağı URL’i buldum.

Request hackistanbul.com adresine gidiyordu ve request’in path’inde bir base64 değer vardı. Bu değeri base64 olarak decode ettim ve flagi aldım.

Flag: {HI2021-54da74cc881dc1422d05aa021ea412e8}

R0ck’n Roll


Soruda bize R0cknR0ll adlı bir pcap dosyası veriliyordu. Hemen dosyayı wireshark ile açıp incelemeye başladım.

Dosyayı açar açmaz birçok HTTP request’i olduğunu ve birçok request’in response’larinin aynı uzunlukta olduğunu fark ettim. Dolayısıyla HTTP request’lerini uzunluklarına göre sıralamak ve dışa aktarmak için Wireshark’ın HTTP Object List fonksiyonunu kullandım. Böylelikle paket numarası, response uzunluğu, host, path gibi değelerlere sıralı olarak ulaşmış olduk.

Birçok requestin responsesu 277 byte uzunluğundaydı ve herhangi birini indirip açtığımda serverin 404 not found göndüğünü gördüm.Bende requestleri response uzunluklarına göre sıraladım ve farklı olanları indirdim.Dosyaları incelerken guns.txt dosyasında 1/3 yazısını ve encrypted bir değer olduğunu gördüm.

Bunun flagin 1/3 ünün şifrelenmiş hali olduğunu düşündüm ve flagin geri kalanının şifrelenmiş halini elde etmek için diğer dosyaları inceledim. Flagin geri kalanının and.txt ve roses.txt dosyalarında olduğunu gördüm.

Sırada bu encrypted değerleri decrypt etmek vardı. Hemen ilk değeri base32 olarak decrypt ettim ve flag’in 1/3’ünü elde etmiş oldum.

Hemen ardından ikinci değeri base64 olarak decrypt ettim ve flagin 2/3 ünü elde etmiş oldum.

Uzun bir süre son değerin md5 olduğunu sandık ve ilerleyemedik. Uzun bir süre sonra bunun bir rc2 yöntemiyle şifrelenmiş bir değer olduğunu fark ettik. Cybershef yardımıyla hızlıca decrypt ettik ve flagin tamamını elde ettik.

Flag: {HI2021-Sw33t_Ch1lD_O_M1n3_R0CK}

XSS-BruteLogic


XSS-BruteLogic sorusunda bize XSS-BruteLogic.zip adlı bir zip dosyası veriyordu. Bunu unzip ettiğimiz zaman bize .git/ dizini ve XSS-BruteLogic.txt.png adlı bir dosya verdi. XSS-BruteLogic.txt.png dosyasına file attığımız zaman bize bir PNG dosyası olduğunu gösterdi.

XSS-BruteLogic.txt.png resmini açtığımız zaman bizim işimize yarayacak bir görüntü ortaya çıkmadı. .git/ dizinine geçtiğimiz zaman git diff ve git log komutlarından bir bilgi elde edemedik. Config dosyasını okudğumuz zaman https://github.com/Effective1212/Steganography.git bir Github repository’si verdi. Bu github reposunu clone ettik ve içerisinde opencv ile yazılmış bir steg.py adında bir python script’i gördük. Bu scripti python2 ile çalıştırdık sebebi syntax’ı python2 ye göre yazılmasıydı. Scripti çalıştırıp decrypt etmeye çalışırken bizden bir key istedi.

Denemelerimizden sonra buraya bruteforce karar verdik fakat elimizdeki çoğu liste işe yaramadı. XSS-BruteLogic kelimseini Google’da aradığımız zaman ilk çıkanlardan BRUTELOGIC-XSS-STRINGS.txt böyle bir Github linki çıkıyordu. Sonrasında bu txt dosyası içerisindeki payloadları steg.py dosyasına key olarak verecek bir script yazdık. Fakat python scriptinde AES decrypt modu bulunmuyordu bunun için kendimiz var olan tüm modları denedik. Bu scripti çalıştırdıktan sonra ECB moduyla bu keyi elde ettik '-alert(1)-' ve keyimizi yazdıktan sonra fotoğrafı başarıyla decrypt etmiş olduk. Solution.py

 

Sorulara ekleme yapılacaktır.

 

Hazırlayanlar

Osman Eren Güneş

Devran Atuğ

Furkan Öztürk

Eren Şimşek

Arda Ay