Sızma Testlerinde Hash, Encoding ve Encryption Tipini Belirleme

Sızma testlerinin önemli adımlarından biri olan parola/hash kırma saldırıları  bazı durumlarda ele geçirilen parolanın tipinin tam olarak bilinmemesi nedeniyle tıkanır. Uygulamanın kaynak kodu olmadan ya da reverse enginering yapılmadan hash tipi kesin olarak belirlenemez fakat bazı uygulamaların kullandıkları hash/encoding/encryption yöntemi bellidir.

Hash, Encoding(kodlama) ve Encryption(şifreleme) kavramları genellikle birbirleri yerine kullanılsa da üç kavramda özünde farklıdır.

Encoding/Kodlama: Verinin farklı sistem ve ortamlarda dolaşabilmesi için bir formattan başka bir formata dönüştürülmesi işlemidir. Kodlama gizlilik sağlamak için kullanılmaz. En fazla bilinen kodlama örneği Base64 olup aşağıdaki gibi bir formata sahiptir.

Bilgi Guvenligi AKADEMISI    QmlsZ2kgR3V2ZW5saWdpIEFLQURFTUlTSQo=

#echo QmlsZ2kgR3V2ZW5saWdpIEFLQURFTUlTSQo=|base64 -dBilgi Guvenligi AKADEMISI
text tabanlı kodlama çeşitleri ve işlemleri için https://hackvertor.co.uk/public adresi kullanılabilir.

Encryption/Şifreleme:
Bir verinin sadece gizli anahtarı bilen yetkili kişilerce okunabilmesi amaçlı gerçekleştirilen format değişikliği olarak. Şifrelemenin kodlamadan temel farkı sadece ilgili anahtarı bilen kişiler tarafından orjinaline döndürülebilmesidir. RSA, AES en sık kullanılan şifreleme algoritmalarındandır.

Hash:
Hash fonksiyonları doğrulama amaçlı kullanılır ve matematiksel olarak geri döndürülemez özelliğe sahiptirler. Genellikle bir verinin içeriğinin değişmediğinin garantisi olarak kullanılır veya bir parolanın veritabanında açık bir şekilde tutulmasını engellemek ve başkaları tarafından (işin sahibi dahil) bilinmesi istenmediği zaman tercih edilir.
MD5, SHA1 en fazla bilinen hash tipine örnektir.

Kullanılan Hash, Encryption ve Encoding Tipi Belirleme

Belirlemenin kesin yollar bulunmamakla birlikte bazı tanımlamalar
yaparak(hash uzunluğu, kullanılan karekter dizgisi vs) tahmin
edilebilir.

Bazı durumlarda ele geçirilen parola tuzlu(salted) hash formatında saklanıyor olabilir. Bu durumda  http://www.insidepro.com/hashes.php#1(345 hash tipini destekler) adresinden faydalanılarak hangi türe ait olduğu belirlenebilir. 

Alternatif bir yöntem de kırılacak hash satırlarını  bir dosyaya yazarak bilinen parola kırma programlarına parametre olarak vermektir. Bu yöntem her zaman doğru sonucu vermeyebilir zira hash tiplerinin birbirlerine benzerlik göstermektedir. Bu nedenle  John The ripper, Cain &Abel gibi araçlar hash tipini sizin belirlemenize sağlayacak parametreler barındırır.

Hash tipini yanlış belirlediyse hangi hash tipine göre parola kırma işleminin gerçekleştirileceğini bulmak için http://pentestmonkey.net/cheat-sheet/john-the-ripper-hash-formats adresindeki döküman kolaylık sağlayacaktır.

Bu sayfada hangi hash tiplerinin hangi uygulamalarad kullanıldığına dair detay bilgi bulabilirsiniz.
http://forum.insidepro.com/viewtopic.php?t=8225

Hash Tipi Belirleme için Hash_ID Betiğinin Kullanımı
hash-identifier belirli hash tipleri icin hangi algoritmanın kullanıldığını belirlemek amacıyla kullanılan bir betiktir ve aşağıdaki gibi kullanıma sahiptir.

~$ wget https://hash-identifier.googlecode.com/files/Hash_ID_v1.1.py

~$ python Hash_ID_v1.1.py
   ————————————————————————- HASH: /0vW8jFro7CKUmFzHBDkCkgEDS8=

 Not Found.
   ————————————————————————-
 HASH: 855c3697d9979e78ac404c4ba2c66533

Possible Hashs:
[+]  MD5
[+]  Domain Cached Credentials – MD4(MD4(($pass)).(strtolower($username)))

Least Possible Hashs:
[+]  RAdmin v2.x
[+]  NTLM
[+]  MD4
[+]  MD2
[+]  MD5(HMAC)
[+]  MD4(HMAC)
[+]  MD2(HMAC)
[+]  MD5(HMAC(WordPress))
[+]  Haval-128
[+]  Haval-128(HMAC)
[+]  RipeMD-128
[+]  RipeMD-128(HMAC)
[+]  SNEFRU-128
[+]  SNEFRU-128(HMAC)
[+]  Tiger-128
[+]  Tiger-128(HMAC)
[+]  md5($pass.$salt)
[+]  md5($salt.$pass)
[+]  md5($salt.$pass.$salt)
[+]  md5($salt.$pass.$username)
[+]  md5($salt.md5($pass))
[+]  md5($salt.md5($pass))
[+]  md5($salt.md5($pass.$salt))
[+]  md5($salt.md5($pass.$salt))
[+]  md5($salt.md5($salt.$pass))
[+]  md5($salt.md5(md5($pass).$salt))
[+]  md5($username.0.$pass)
[+]  md5($username.LF.$pass)
[+]  md5($username.md5($pass).$salt)
[+]  md5(md5($pass))
[+]  md5(md5($pass).$salt)
[+]  md5(md5($pass).md5($salt))
[+]  md5(md5($salt).$pass)
[+]  md5(md5($salt).md5($pass))
[+]  md5(md5($username.$pass).$salt)
[+]  md5(md5(md5($pass)))
[+]  md5(md5(md5(md5($pass))))
[+]  md5(md5(md5(md5(md5($pass)))))
[+]  md5(sha1($pass))
[+]  md5(sha1(md5($pass)))
[+]  md5(sha1(md5(sha1($pass))))
[+]  md5(strtoupper(md5($pass)))

   ————————————————————————-
 HASH: 0E6A48F765D0FFFFF6247FA80D748E615F91DD0C7431E4D9

Possible Hashs:
[+]  Tiger-192
[+]  Haval-192

Least Possible Hashs:
[+]  Tiger-192(HMAC)
[+]  Haval-192(HMAC)

   ————————————————————————-
 HASH: 000EA4D72A142E29

 Not Found.

   ————————————————————————-
 HASH: zyIIMSYjiPm0L7a6

Possible Hashs:
[+]  MySQL
[+]  MD5(Middle)

Least Possible Hashs:
[+]  MD5(Half)

   ————————————————————————-
 HASH:

Ticari bir yazılım olan Password Pro tarafından tanınan hash tipleri aşağıda yer almaktadır.
ñ Adler-32
ñ Blowfish(Eggdrop)
ñ Blowfish(OpenBSD)
ñ CRC-16
ñ CRC-16-CCITT
ñ CRC-32
ñ CRC-32(ZIP_Seed)
ñ CRC-32B
ñ CRC-64
ñ DCC2
ñ DES(Oracle)
ñ DES(Unix)
ñ Domain Cached Credentials
ñ ELF-32
ñ FCS-16
ñ FCS-32
ñ Fletcher-32
ñ FNV-32
ñ GHash-32-3
ñ GHash-32-5
ñ GOST R 34.11-94
ñ HAS-160
ñ Haval-128
ñ Haval-128(HMAC)
ñ Haval-160
ñ Haval-160(HMAC)
ñ Haval-192
ñ Haval-192(HMAC)
ñ Haval-224
ñ Haval-224(HMAC)
ñ Haval-256
ñ Haval-256(HMAC)
ñ Lineage II C4
ñ MD2
ñ MD2(HMAC)
ñ MD4
ñ MD4(HMAC)
ñ MD5
ñ md5($pass.$salt)
ñ md5($pass.$salt.$pass)
ñ md5($pass.md5($pass))
ñ md5($salt.’-‘.md5($pass))
ñ md5($salt.$pass)
ñ md5($salt.$pass.$salt)
ñ md5($salt.$pass.$username)
ñ md5($salt.md5($pass))
ñ md5($salt.md5($pass).$salt)
ñ md5($salt.MD5($pass).$username)
ñ md5($salt.md5($pass.$salt))
ñ md5($salt.md5($salt.$pass))
ñ md5($salt.md5(md5($pass).$salt))
ñ md5($username.0.$pass)
ñ md5($username.LF.$pass)
ñ md5($username.md5($pass).$salt)
ñ md5(3 x strtoupper(md5($pass)))
ñ MD5(APR)
ñ MD5(Cisco PIX)
ñ MD5(Custom)
ñ MD5(HMAC(WordPress))
ñ MD5(HMAC)
ñ md5(md5($pass))
ñ md5(md5($pass).$pass)
ñ md5(md5($pass).$salt)
ñ md5(md5($pass).md5($pass))
ñ md5(md5($pass).md5($salt))
ñ md5(md5($salt).$pass)
ñ md5(md5($salt).md5($pass))
ñ md5(md5($username.$pass).$salt)
ñ md5(md5(md5($pass)))
ñ md5(md5(md5(md5($pass))))
ñ md5(md5(md5(md5(md5($pass)))))
ñ MD5(phpBB3)
ñ md5(sha1($pass))
ñ md5(sha1(md5($pass)))
ñ md5(sha1(md5($pass)).sha1($pass))
ñ md5(sha1(md5(sha1($pass))))
ñ md5(strrev($pass))
ñ md5(strtoupper(md5($pass)))
ñ MD5(Unix)
ñ MD5(WordPress)
ñ MSSQL(2000)
ñ MSSQL(2005)
ñ MySQL
ñ MySQL5
ñ NTLM
ñ Palshop
ñ RAdmin v2.x
ñ RipeMD-128
ñ RipeMD-128(HMAC)
ñ RipeMD-160
ñ RipeMD-160(HMAC)
ñ RipeMD-256
ñ RipeMD-256(HMAC)
ñ RipeMD-320
ñ RipeMD-320(HMAC)
ñ SAPB
ñ SAPG
ñ SHA-1
ñ SHA-1(Django)
ñ SHA-1(HMAC)
ñ SHA-1(MaNGOS)
ñ SHA-1(MaNGOS2)
ñ SHA-1(Oracle)
ñ SHA-224
ñ SHA-224(HMAC)
ñ SHA-256
ñ SHA-256(Django)
ñ SHA-256(HMAC)
ñ SHA-256(PasswordSafe)
ñ SHA-256(Unix)
ñ SHA-384
ñ SHA-384(Django)
ñ SHA-384(HMAC)
ñ SHA-512
ñ SHA-512(Drupal)
ñ SHA-512(HMAC)
ñ SHA-512(Unix)
ñ sha1($pass.$salt)
ñ sha1($salt.$pass)
ñ sha1($salt.$username.$pass.$salt)
ñ sha1($salt.md5($pass))
ñ sha1($salt.md5($pass).$salt)
ñ sha1($salt.sha1($pass))
ñ sha1($salt.sha1($salt.sha1($pass)))
ñ sha1($username.$pass)
ñ sha1($username.$pass.$salt)
ñ sha1(md5($pass))
ñ sha1(md5($pass).$salt)
ñ sha1(md5($pass).$userdate.$salt)
ñ sha1(md5(sha1($pass)))
ñ sha1(md5(sha1(md5($pass))))
ñ sha1(sha1($pass))
ñ sha1(sha1($pass).$salt)
ñ sha1(sha1($pass).substr($pass,0,3))
ñ sha1(sha1($salt.$pass))
ñ sha1(sha1(sha1($pass)))
ñ sha1(strtolower($username).$pass)
ñ sha256($pass.$salt)
ñ sha256($salt.$pass)
ñ sha256(md5($pass))
ñ sha256(sha1($pass))
ñ sha384($pass.$salt)
ñ sha384($salt.$pass)
ñ sha512($pass.$salt)
ñ sha512($salt.$pass)
ñ Skein-1024
ñ Skein-1024(384)
ñ Skein-1024(512)
ñ Skein-256
ñ Skein-256(128)
ñ Skein-256(160)
ñ Skein-256(224)
ñ Skein-512
ñ Skein-512(128)
ñ Skein-512(160)
ñ Skein-512(224)
ñ Skein-512(256)
ñ Skein-512(384)
ñ Snefru-128
ñ Snefru-128(HMAC)
ñ Snefru-256
ñ Snefru-256(HMAC)
ñ SSHA-1
ñ strrev(md5($pass))
ñ strrev(md5(strrev(md5($pass))))
ñ substr(md5($pass),16,16)
ñ substr(md5($pass),8,16)
ñ Tiger-128
ñ Tiger-128(HMAC)
ñ Tiger-160
ñ Tiger-160(HMAC)
ñ Tiger-192
ñ Tiger-192(HMAC)
ñ Ventrilo
ñ Whirlpool
ñ Whirlpool(Double)
ñ Whirlpool(HMAC)
ñ WPA-PSK PMK
ñ XOR-32
ñ xsha1(strtolower($pass))

Huzeyfe ÖNAL <huzeyfe.onal@bga.com.tr>