Laboratuvar: Hash it Out
Hash, belirli bir mesaj için benzersiz bir karakter kümesi üreten tek yönlü bir kriptografik fonksiyondur. Mükemmel bir dünyada, bir hash verildiğinde orijinal mesajın ne olduğunu belirleyememeniz gerekir, ancak bir hash ve orijinal mesaj verildiğinde hash'in mesajla eşleşip eşleşmediğini kontrol edebilirsiniz. Bir hash'in kullanım alanlarına dalmadan önce, basit ve sonuç olarak zayıf bir hash algoritmasına bakarak onu daha iyi anlamaya çalışalım.
Anagram Hash
"Hello from Karl" mesajını hash etmek istediğimizi varsayalım, böylece bu ifadeyi benzersiz bir şekilde temsil eden bir karakter dizisine sahip olabiliriz. Bunu yapmanın bir yolu, mesajdaki tüm noktalama işaretlerini kaldırmak, her şeyi küçük harf yapmak ve ardından tüm harfleri alfabetik olarak düzenlemek olabilir. "Hello from Karl" "aefhklllmoorr" olur. Bunu şöyle düşünebilirsiniz: "Mesajda bir 'a' var, mesajda bir 'e' var, mesajda bir 'f' var, mesajda bir 'k' var, mesajda üç 'l' var…" Artık hash değerimiz olan "aefhklllmoorr" ifadeyi benzersiz bir şekilde tanımlamak için kullanılabilir.
Şimdi Karl'ın bize bir mesaj göndermek istediğini ancak mesajı gönderen kişiye güvenemediğini varsayalım. Bize mesajı göndermek için güvenilmeyen tarafı kullanabilir ve ardından hash'i bir web sitesi gibi herkese açık bir yere koyabilir. Mesajın Karl'dan geldiğini bilmek için hash'i kullanabiliriz ve başka birisi hash'i alırsa mesajı ayırt edemez çünkü hash tek yönlü bir fonksiyondur. "aefhklllmoorr" mesaj hakkında çok az bilgi verir, ancak doğruluğunu kontrol etmek için kullanılabilir.
Umarım bu, hash'lerin gücünü göstermeye başlamıştır. Şimdi çok yaygın bir başka kullanım durumunu inceleyelim ve bunun neden korkunç bir algoritma olduğunu tam olarak öğrenelim.
Bir kullanıcının oturum açmak için parola kullandığı bir web sitesi işlettiğinizi varsayalım. Kullanıcıların oturum açtıklarında parolalarını kullandıklarından emin olmak istiyorsunuz, ancak parolayı web sitenizde saklamak istemiyorsunuz. Bu oldukça yaygın bir durumdur. Web siteniz ele geçirildiyse bir sürü insanın şifresini sızdırmak istemezsiniz. Ne yaparsınız? Yapabileceğiniz şey, şifrelerinin bir karmasını saklamak, giriş yapmaya çalıştıklarında şifreyi karma hale getirmek ve karmaları karşılaştırmaktır. Örneğin, şifremiz "password" olsaydı, temel hash algoritmamızı kullanarak hash "adoprssw" olurdu. "adoprssw"yi veritabanımızda saklayabilir, giriş sırasında karşılaştırma için kullanabilir ve birisi veritabanımızdaki verileri çalacak olursa orijinal şifrenin "password" olduğunu bilemez. Bu, bir saldırganın birçok kişinin aynı parolayı birden fazla sitede kullanması gerçeğini istismar etmesini önleyebilir.
Sorun şu ki, "adoprssw" hash'ine sahip "wordpass", "drowsaps" ve hatta depoladığımız hash dahil olmak üzere birçok şey var: "adoprssw". Birden fazla mesaj aynı hash'e sahip olduğunda bu bir çarpışma olarak adlandırılır ve bu özel algoritma işe yaramaz çünkü bunlardan çok fazla üretir.
| “AlwaysDancing“in anagram karması ne olabilir? |
Artık hash'lerin ne işe yaradığını ve nasıl mümkün olduklarını anladığımıza göre, çok daha kullanışlı bir hash fonksiyonuna bakalım.
MD5
Bu bölüm için Docker ve bir terminal kullanacağız. Docker'ı yüklemek için lütfen bu talimatları izleyin. Windows için Windows Terminal uygulamasını, MacOS için ise önceden yüklenmiş Terminal uygulamasını kullanabilirsiniz. Gri kutular, mümkün olan yerlerde tipik çıktı ile terminale yazılan komutları gösterir. Komut isteminiz (komuttan önce gösterilen kısım) işletim sisteminize bağlı olarak farklılık gösterebilir.
Özel bir Linux konteynerinde bir BASH kabuğu çalıştırarak başlayın:
ryan@R90VJ3MK:/windir/c/Users/rxt1077/it230/docs$ docker run -it ryantolboom/hash root@8e0962021f85:/ |
MD5, Anagram algoritmamızdan önemli ölçüde daha iyi hash'ler üreten bir mesaj özeti algoritmasıdır. Çoğu Linux dağıtımı, bir dosyanın içeriğine dayalı olarak MD5 hash oluşturmak için basit bir yardımcı program içerir. Bu komut md5sum olarak adlandırılır. Tipik olarak bu, bir dosyanın kurcalanıp kurcalanmadığını tespit etmek için kullanılır. Bir web sitesi, yazılımı indirmek için bağlantıların yanı sıra indirdiğiniz şeyin doğru olduğunu bilmeniz için dosyaların MD5 karmasını da sağlayabilir. Benzer şekilde bir güvenlik sistemi, kötü amaçlı yazılımlar tarafından tahrif edilip edilmediklerini belirlemek için belirli kritik dosyaların md5 toplamlarını (MD5 hash) tutabilir. Şimdi /etc/passwd dosyasının md5 sum'unu alma alıştırması yapalım:
root@8e0962021f85:/# md5sum /etc/passwd 9911b793a6ca29ad14ab9cb40671c5d7 /etc/passwd |
Şimdi içinde adınızın geçtiği bir dosya oluşturacağız ve bunu /tmp/name.txt dosyasında saklayacağız:
root@8e0962021f85:/# echo "<your_name>" >> /tmp/name.txt |
| /tmp/name.txt dosyasının md5 toplamı nedir? |
Son etkinliğimiz için, hash'lerin bazı zayıflıklarına bir göz atalım.
Hash Kırma
Bir Linux sistemindeki parolalar hashlenir ve /etc/shadow dosyasında saklanır. Nasıl göründüğünü görmek için bu dosyanın içeriğini yazdıralım:
root@7f978dd90746:/# cat /etc/shadow root:*:19219:0:99999:7::: daemon:*:19219:0:99999:7::: bin:*:19219:0:99999:7::: sys:*:19219:0:99999:7::: sync:*:19219:0:99999:7::: games:*:19219:0:99999:7::: man:*:19219:0:99999:7::: lp:*:19219:0:99999:7::: mail:*:19219:0:99999:7::: news:*:19219:0:99999:7::: uucp:*:19219:0:99999:7::: proxy:*:19219:0:99999:7::: www-data:*:19219:0:99999:7::: backup:*:19219:0:99999:7::: list:*:19219:0:99999:7::: irc:*:19219:0:99999:7::: gnats:*:19219:0:99999:7::: nobody:*:19219:0:99999:7::: _apt:*:19219:0:99999:7::: karl:$y$j9T$oR2ZofMTuH3dpEGbw6c/y.$TwfvHgCl4sIp0b28YTepJ3YVvl/3UyWKeLCmDV1tAd9:19255:0:99999:7::: |
Hash'lerle ilgili sorunlardan biri, insanların basit şifreler seçmesi durumunda, yaygın şifrelerden oluşan bir kelime listesi alan, bunların hash'lerini oluşturan ve ardından hash'in aynı olup olmadığını kontrol eden bir program tarafından kolayca kırılabilmesidir. Bir hash tek yönlü bir fonksiyon olsa da, yine de bu tür saldırılara maruz kalabilir. John the Ripper adında bir program kullanıyoruz ve tam olarak bunu yapıyoruz.
John the Ripper, basit bir kelime listesi ile birlikte bu konteynere zaten yüklenmiştir. Karl'ın /etc/shadow'daki hash'iyle eşleşen parolanın ne olduğunu belirlemek için varsayılan sözcük listesini kullanmasını söyleyeceğiz:
root@8e0962021f85:/# john --format=crypt --wordlist=/usr/share/john/password.lst /etc/shadow Loaded 1 password hash (crypt, generic crypt(3) [?/64]) Press 'q' or Ctrl-C to abort, almost any other key for status <karl's password> (karl) 1g 0:00:00:01 100% 0.6211g/s 178.8p/s 178.8c/s 178.8C/s lacrosse..pumpkin Use the "--show" option to display all of the cracked passwords reliably Session completed |
| ! john bir parolayı kırdıktan sonra tekrar çalıştırdığınızda parolayı göstermeyecektir. Daha önce kırılmış olan parolaları göstermek için –show komutunu şu dosyayla birlikte çalıştırmalısınız: john –show /etc/shadow |
Parolanın ortak parola kelime listesinde (/usr/share/john/password.lst) yer aldığı göz önüne alındığında, John the Ripper'ın karl'ın parolasını çabucak bulduğunu göreceksiniz. John the Ripper ayrıca tüm olası karakter kombinasyonlarını aşamalı olarak çalıştırabilir, ancak bu çok daha uzun sürer. Bu tür saldırıları daha zor hale getirmeye yardımcı olmak için /etc/shadow içindeki her hash rastgele bir sayıdan oluşturulur. Bu sayıya tuz adı verilir ve hash ile birlikte saklanır. Bu, kelime listesindeki her kelime için sadece bir hash denemek yerine, hash kırıcının kelime listesindeki her kelime için olası tüm tuzları denemesi gerektiği ve işleri önemli ölçüde yavaşlattığı anlamına gelir. Modern hash kırıcılar gökkuşağı tabloları kullanabilir, böylece olası tüm hash'ler zaten hesaplanmış olur. Bu tablolar terabaytlarca disk alanı kaplayabilir, ancak karmaşık hash'leri bile kırmayı çok daha basit hale getirebilir.
Gerçek parolaya sahip olduğumuzu göstermek için crypt adlı özel bir yardımcı program kullanalım. Bu yardımcı program konteynerinizde zaten yüklüdür. Sadece /etc/shadow dosyasında karl'ın bilgilerini içeren satırı yazdırarak başlayacağız. Çıktıyı içinde karl geçen şeylerle sınırlamak için grep komutunu kullanacağız:
root@7f978dd90746:/# cat /etc/shadow | grep karl karl:$y$j9T$oR2ZofMTuH3dpEGbw6c/y.$TwfvHgCl4sIp0b28YTepJ3YVvl/3UyWKeLCmDV1tAd9:19255:0:99999:7::: |
Gölge çizgisinin ilk kısmı kullanıcı adıdır, Karl. Gölgeli satırın bir sonraki kısmı, ilk iki nokta üst üste işaretinin hemen ardından, hash bilgisidir. İlk $ kümesi arasındaki karakterler, kullanılan hashing algoritmasının sürümüdür, bizim durumumuzda yescrypt için y. İkinci $ kümesi arasındaki karakterler yescrypt'e aktarılan parametrelerdir ve bizim için her zaman j9T olacaktır. Üçüncü $ kümesi arasındaki karakterler tuzunuzdur. Son olarak dördüncü $ kümesi arasındaki karakterler hash'tir.
[crypt] yardımcı programı sistem crypt komutunu çağırır ve çıktıyı yazdırır. Bu yardımcı programı kırdığımız parola ve /etc/shadow'daki hash bilgisinin ilk üç kısmı ile çalıştıralım. Her şey yolunda giderse, /etc/shadow içinde olanla eşleşen hash çıktısını görmelisiniz:
root@7f978dd90746:/# crypt <karl's password> '$y$j9T$oR2ZofMTuH3dpEGbw6c/y.' $y$j9T$oR2ZofMTuH3dpEGbw6c/y.$TwfvHgCl4sIp0b28YTepJ3YVvl/3UyWKeLCmDV1tAd9 |
Yorumlar
Yorum Gönder