Background Image

BLOG

DKHOS - Crypto 400 - Yazlıkçı moduna bağladık
17 Şubat 2018 CTF

DKHOS - Crypto 400 - Yazlıkçı moduna bağladık


Soruda verilen bir grup '(x, y)-hex' biçiminde satırlar vardı. Bu satırlarla ilgilenmeden önce soru metninden çıakrılması gereken şeylere göz atalım. Öncelikle sorunun ismi herhangi bir ipucu içermemekteydi. Mahmut'un gördüğü 3, 8 ve 4 numaralı dolaplar fazlasıyla önemliydi. Buradan elde ettiğimiz sayılar ile 384 sayısını bir kenara not edelim. Playstation'un da kırık olması aslında tüm bu şifreli metinlerin ve sayının Playstation ile bir ilgisi olabileceğini sezdiriyordu. Aslında burada kullanılan şifreleme 'Elliptic Curve Digital Signature' algoritmasıydı. (ECDSA) Bu imzalama yapı eliptik eğrileri kullanarak şifreleme/imzalama yapılmasını sağlayan bir sistemdir, Diffie-Hellman ile bağdaştırabilirsiniz aynı yapı anahtar değişim işlemlerinde de çok kullanışlıdır.

Kripto ile ilgili çoğu protokolün temel aldığı en önemli seçim aşaması belirli yerlerde tamamen rastgele sayılar seçmektir. Çoğu kitapta ve anlatımda eğer bu sayılar her seferinde baştan alakasız ve rastgele seçilmez ise güvenliğin ciddi anlamda sağlanamayacağı yazar/söylenir. Bu soruda da bunun nasıl bir tehlike yarattığını göstermek istedim. Playstation oyun konsolu da aynı zaafiyet veya entegrasyon hatası yüzünden sıkıntı yaşamıştı. Buradaki zaafiyet ECDSA yapılırken seçilen "session key" yani "k" değerinin her zaman rastgele olmaması idi.

 

Burada gördüğümüz üzere eğer k değerini aynı seçersek 2 tane imzayı kullanarak private key'i geri oluşturabiliriz. Eğer verilen şifreli metinlere dikkat edilirse zaten 3 tanesinin parantez içlerindeki ilk değerlerinin aynı olduğu fark edilecekti. Aynı zamanda bu (x,y) ikilisinin bu algoritmadaki (r,s) ikilisi olduğunu da anlamalıydık, çünkü eğer k değeri aynı kullanılırsa r değerleri de aynı olacaktı.

r değerleri "287da9e8899dae17ce8f4367beaab1e861a7ed941700076fecf0374af5edf2d45648e1ed1d6654723b2b9e05c7c6e147" olan kısımlar.

Diğer satırlar anlamsız, sadece tek bakışta benzerliğin görülmemesi için yaratılmış rastgele karakterlerin imzalanmış halleriydi. Sondaki hex değerlerini de ASCII'ye çevirirsek çeşitli tekerlemeler çıkacaktı. Bu sayede aşağıdaki python kodu gibi bir denemeyle k ve private key'i çekip, imzalama işlemini yapıp yapamadığımızı kontrol edebilirdik.Bir diğer dikkat etmemiz gereken nokta da ECDSA kullanırken mesajın SHA1 değerini imzalamamız gerektiği, sonuçta protokolün esas kullanım amacına bu durum daha çok hizmet etmekte.

Dikkat etmişsinizdir burada çok önemli olan bir detay hangi eğriyi kullanacağımızdı. Ben NIST384p'yi seçmiştim ve bunu direk sorunun içerisinde de sezdirmiştik. Bu işlemleri Python'da yapıp r ve s değerlerini elde edebilmek için "ecdsa" kütüphanesinin kaynak kodlarıyla birazcık oynamanız gerekmekte, en azından ben o şekilde elde ettim :). Buradan sonra yapacağımız tek şey "cekoslavakyalilastiramadiklarimizdanmisiniz" imzalayıp bunun SHA1 değerini alıp flag formatına uygun bir şekilde girmek olacaktı. 

Not:

k değerini nasıl oluyor da çekiyoruz diyerek, kodu da karışık bulan arkadaşlar için verebileceğim en temiz kaynak, maalesef şuan yasaklı da olsa wikipedia.

https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm