Crypto Challenge – Infinite Descent

Merhabalar, 

bu yazıda HackTheBox içerisinde bulunan “Infinite Descent” isimli crypto challenge çözümünü inceleyeceğiz.

İlk olarak uygulama hakkında bize ipucu vermesi için challenge başlığını inceleniriz. Burada “DevOps ekibi tarafından RSA işlemlerinde asal sayı seçmek ve AES ile anahtar oluşturma işlemi için çok daha iyi bir yol bulundu. Buradaki kusurları bulabilir misin?” ifadesi ile karşılaşılmaktadır.

Daha sonra challenge için paylaşılan zip dosyası indirilir ve herhangi bir arşiv açma aracı kullanılarak içerisindeki dosyaların dışarı çıkartılması sağlanır.

Elde edilen “infinete_descent” klasörünün içeriği aşağıdaki şekildedir.

“email.msg” dosyası içeriği aşağıdaki şekildedir.

Dosya içeriği incelendiğinde; bir adet şifreli mesaj, bir adet PUBLIC anahtar bulunmaktadır. Ayrıca,

  • Daha önceden belirtilen bir sorunun “numpy” kütüphanesine ait PSNG – Pseudorandom Number Generator içerisinden kaynaklandığının tespit edildiği ve bunun önüne geçmek için bir “Mersene Twister” oluşturulduğu belirtilmektedir (“Mersene Twister” bir tür PSNG yöntemidir)
  • Bu yöntem ile elde edilen değerin “pre-shared” anahtar olarak RSA tarafında kullanılacağından ve bu sayede AES ile gerçekleştirilen iletişimin daha hızlı bir şekilde gerçekleştirileceği belirtilmektedir.
  • RSA üretimi esnasında şuan için problem yaşandığı görülmektedir. Ayrıca güvenlik ekipleri tarafından asal sayı seçimleri ile alakalı sorular olduğu belirtilmiştir. Tüm bu sorulara cevap olması adına, daha önceden gönderilmiş olan PRIVATE anahtar yardımı ile şifreli mesajın açılması ve geliştirilen “Twister” ile pre-shared anahtar doğrulamasının sağlanması istenilmektedir.

Tüm bu bilgiler doğrultusunda;

  • Flag değerinin şifreli mesaj içerisinde saklanıldığı
  • Güvenlik ekipleri tarafından asal sayı seçimi ile alakalı sorular yöneltilmesi, (n = p * q) asal sayı seçim yönteminin incelenmesi gerektiğini
  • PRIVATE anahtar değerinin elde edilmesi/yeniden oluşturulması gerektiği
  • Pre-shared anahtar oluşturma yöntemine ilişkin yapılan güncellemelerin güvenlik problemi içerebileceği

düşünülmektedir.

Gereksinimlerimizin belirlenmesinin ardından ilk olarak PRIVATE anahtar değerinin yeniden oluşturulması denenmektedir. Bu işlem için “RsaCtfTool” isimli bir araç kullanılmaktadır.

Mail dosyası içerisinde bulunan PUBLIC anahtar değeri, kopyalanarak “infinite_descent_pubkey” isimli bir dosyanın içerisine aktarılmaktadır. Sonrasında aşağıdaki komut kullanılarak, RSA PRIVATE anahtar oluşturma esnasında seçilen asal değerlerin çarpım sonucu olan “n” değerini elde edilmesi beklenilmektedir.

  • ./RsaCtfTool.py –key /root/Desktop/infinite_descent_pubkey –dumpkey

Görüleceği üzere “n” değeri elde edilmektedir. Bir sonraki adım “n” değerini oluşturmak için kullanılmış olan “p” ve “q” değerlerinin tespit edilmesi hedeflenmektedir. Bu konuda bilgimiz tek nokta hem “p” hem de “q” değerlerinin asal sayı olduğudur. Bu bilgiler doğrultusunda yola çıkılarak, asal çarpanlara ayırma işlemi gerçekleştiren http://www.mickybullock.com/blog/wp-content/RSA_Cryptography/ffactory.php adresi tespit edilmektedir.

“n” değerinin parametre olarak sisteme aktarılması sonrasında “p” ve “q” değerlerinin elde edildiği görülmektedir.

“fasterprimes.py” dosyası incelendiğinde “p” ve “q” değerleri yardımı ile PRIVATE anahtar oluşturma işlemi bulunduğu görülmektedir. Mevcutta bulunan, rastgele olarak “p”, “q” değerlerinin seçilmesini sağlayan işlem bloğu elde edilen değerler kullanılarak aşağıdaki şekilde güncellenmektedir.

Bir sonraki adımda “fasterprimes.py” dosyası içerisinde bulunan şifreleme işlemi, şifre çözme işlemi gerçekleştirecek şekilde güncellenmektedir.

Elde edilen yeni kodların çalıştırılması sonrasında şifreli ifadenin çözüldüğü görülmektedir.

Mail içerisinde verilen ipuçları göz önüne alındığında pre-shared anahtar üzerinde gerçekleştirilen işlemler bulunduğu ve maili alan kişi tarafından bu anahtarın geliştirilen “Twister” yöntemi ile doğrulanması istenilmektedir. Bu doğrultuda “AESbootstrap.py” dosyası incelenmektedir.

62 numaralı satır incelendiğinde, decode edilmesi istenilen verilerin üçerli bloklar halinde “gen_and_check” metodu içerisine aktarılması gerektiği belirtilmektedir. Bu bilgi doğrultusunda “AESbootstrap.py” dokümanı aşağıdaki şekilde güncellenmektedir.

Gerçekleştirilen güncellemeler sonrasında “AESbootstrap.py” dosyası çalıştırıldığında, aşağıdaki görüntü elde edilmektedir.

Görüleceği üzere 1 Byte (8 bit) büyüklüğünde değerler sonuç olarak üretilmektedir. Elde edilen bu değerlerin ASCII formatına dönüştürülmesi ile anlamlı bir çıktı elde edilmesi hedeflenmektedir. Bu doğrultuda aşağıdaki kod satırları “AESbootstrap.py” dokümanı içerisine eklenmektedir.

“AESbootstrap.py” dosyasının çalıştırılması sonucunda elde edilen sonuç aşağıdaki şekildedir.

Görüleceği üzere base64 formatında olduğu düşünülen bir ifade elde edilmektedir. İfadenin çözülmesi sonrasında flag değerine ulaşılabilmektedir.

Yazar: Ahmet Akan

2016 Karabük Üniversitesi Bilgisayar Mühendisliği Mezunu. Kariyerine Uygulama Güvenliği Analisti olarak başladı ve bu alanda görev almaya devam etmekte.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir