Null Ahmedabad Nisan 2023 CTF Raporu

May 01 2023
Null Ahmedabad olarak bilinen topluluk, dört kişilik bir grup tarafından kuruldu. 18 Şubat 2018'de Ganpat Üniversitesi'nin yardımıyla mümkün olan açılış toplantılarını gerçekleştirdiler.

Null Ahmedabad olarak bilinen topluluk, dört kişilik bir grup tarafından kuruldu. 18 Şubat 2018'de Ganpat Üniversitesi'nin yardımıyla mümkün olan açılış toplantılarını gerçekleştirdiler. Birincil etkinlikleri, katılımcıların güvenlik ve CTF'ler (uygulamalı zorluklar) ile ilgili tartışmalara katılmak için bir araya geldikleri aylık bir toplantıdır. Zaman geçtikçe Null Ahmedabad, ek toplantı formatları ve atölyeler sunarak erişimini genişletmeye devam ediyor. Null Ahmedabad, ister öğrenci, meraklı veya profesyonel olsun, bilgi güvenliğiyle ilgilenen herkes için, Ahmedabad bölgesindeki bilgisayar korsanları ve profesyonellerle bağlantı kurmak için ideal bir topluluktur.

2023 yılının Nisan ayında Null Ahmedabad, üçüncü sırayı almayı başardığım bir CTF yarışması düzenledi. Bu başarının bir sonucu olarak, bir yazı yazmaya karar verdim.

Boş topluluğu keşfetmek için tıklayın:https://null.community/chapters/17-ahmedabad

Unsplash'ta Alex Chumak'ın fotoğrafı

1. Erişim Engellendi mi?

Challenge istemi diyor ki:

Null Ahmedabad ilk kez çevrimiçi giyim mağazasını açıyor! Ancak, kodumuzda bazı güvenlik açıkları olabileceğinden korkuyoruz. Bir açık güvenlik topluluğu üyesi olarak, karşılaşabileceğiniz tüm güvenlik açıklarını (işaretleri) bulup göndermekle görevlendirildiniz.

Mağazamız şu adrestedir:http://nullahm.kuldeep.io:5000/

Mutlu alışveriş! :)

Web sitesini keşfetmeye başladım; giriş ve kayıt olma özelliğine sahiptir.

Hesabımı kaydettim ve giriş yaptım. JavaScript kodunu araştırmaya başladım ve bir graphql bitiş noktası buldum.

Graphicql'e aşina iseniz, muhtemelen güvenlik nedeniyle genellikle yasak olan iç gözlem sorgularını desteklediğini biliyorsunuzdur.

Bu yüzden iç gözlem sorgusunu ateşlemeye çalıştım ve işe yaradı.

Sonucu inceledim ve "allUsers" adlı bir alan buldum.

"allUsers" düğümüne erişmeye çalıştım ve artık tüm kullanıcıların verilerine erişebiliyorum.

Ve bayrağı buldum.

2. Bağlı Dizeler

Meydan okuma istemi diyor ki:

Bu ikili dosyada herhangi bir sır bırakmadığımdan eminim ama yöneticim hala benden şüphe ediyor. Lütfen ikili dosyayı kontrol edip yanıldığını kanıtlayabilir misiniz?

İndirilecek yürütülebilir bir ikili dosyaya sahiptir.

İkili dosyayı indirdim ve Meta veri istatistikleri:

ELF 64-bit LSB pastası çalıştırılabilir, x86–64, sürüm 1 (SYSV), dinamik bağlantılı, yorumlayıcı /lib64/ld-linux-x86–64.so.2, BuildID[sha1]=9b34236e59bfcdbdb606def64c05cdfdbce9753b, GNU/Linux 4.4 için. 0, soyulmamış

Eski usul bir meydan okuma gibi görünüyor; Bayrak formatının “nullahm” olduğunu biliyorum. Bu yüzden ikili dosyaya karşı dizeler kullanmayı denedim.

diziler -n 7 -tx kal | grep nullahm

İkili dosyada gizli bulundu.

3. Tarihsel Olarak Güvensiz

Meydan Okuma İstemi diyor ki:

Bunu deşifre edin ve şu bayrağı alın: ubsshot{d4f_700_345f}

Bir bayrağa benziyor ama istemin dediği gibi şifrelenmiş. Şifreli bayrağı, bayrak formatı yani “nullahm” ile karşılaştırırsam, Vigenère Cipher gibi görünüyor.

Vigenère Cipher, bilinen düz metin saldırılarına karşı savunmasızdır. Bilinen düz metnin bir parçasına sahibim, yani ubsshot = nullahm.

Bu yüzden anahtarı çıkarmak için küçük bir senaryo yazdım:

def solve_historically_insecure(ciphertext, plaintext):

    ciphertext = ciphertext.upper()
    plaintext = plaintext.upper()
    key = ""
    for i in range(len(plaintext)):
        key += chr(((ord(ciphertext[i]) - ord(plaintext[i])) % 26) + ord('A'))
    return key
ciphertext = "ubsshot"
plaintext = "nullahm"
key = solve_historically_insecure(ciphertext, plaintext)
print("Key : ",key)

Artık anahtarı şifreli metne karşı kullanabilirim,

def vigenere_decode(ciphertext, key):
    plaintext = ''
    key_len = len(key)
    for i in range(len(ciphertext)):
        shift = ord(key[i % key_len]) - 65
        if ciphertext[i].isupper():
            plaintext += chr((ord(ciphertext[i]) - shift - 65) % 26 + 65)
        elif ciphertext[i].islower():
            plaintext += chr((ord(ciphertext[i]) - shift - 97) % 26 + 97)
        else:
            plaintext += ciphertext[i]
    return plaintext

ciphertext = "ubsshot{d4f_700_345f}"
key = solve_historically_insecure(ciphertext, plaintext)
plaintext = vigenere_decode(ciphertext, key)
print("Plain Text : ",plaintext)

      
                

Bu yazıyı okumak için zaman ayırdığınız için teşekkür ederiz.