Rockyou Wordlistindeki Türkçe Parolalarin Tespiti

22 July 2019

Bu seneki araştırmam, parola listeleri (wordlist) ve NLP (Natural Language Processing) üzerine olduğundan, piyasadaki wordlistler ile epey haşır neşir olmuş durumdayım. Bu wordlistlerin de en büyüğü ve kapsamlısı bildiğiniz üzere Rockyou‘dur. Geçenlerde, uzun süredir üzerinde uğraşmadığım Wifi hacking konusunda antreman yapıp bilgimi tazeliyim dedim. Elde ettiğim WPA handshake’lerin bazılarını 8 haneli alphanumeric karakter setiyle kırmak mümkün olurken bazılarını mümkün olmadı. Ben de Türkçe kelimeler içeren bir wordlist arayışına girdim. İnternette sözlük tarzı wordlistler bulunsa da bunlar gerçek kullanıcı parolaları olmadığından bana pek mantıklı gelmedi. Örneğin bir kullanıcı, sözlükte yer alan “sandalye” kelimesini parola olarak kullanmayacaktır.

Bunları düşünürken bir yandan Hashcat’i Rockyou wordlisti ile çalıştırmıştım. Wordlistten herhangi bir ümidim yoktu fakat ne kadar süreceğini görmek istemiştim. Sonuç beni çok şaşırttı. Hashcat, “1907_fenerbahce” parolasının kırıldığını söylüyordu. Küçük bir şaşkınlığın ardından Rockyou.txt içerisinde “fenerabahce” kelimesini arattım. Sonuç beni daha da şaşırttı çünkü içerisinde fenerbahce geçen 44 parola vardı. Diğer kulüplere de baktım. Besiktas 32, galatasaray 63, trabzon 25 kez geçiyordu. İçerisinde karagumruk geçen bile parolalar vardı. Demek ki Rockyou sistemine vakti zamanda çok sayıda Türk kullanıcı da üye olmuş. Bu benim için çok yeni bir bilgiydi. Ben de küçük bir akşam uğraşı olarak Rockyou’nun içerisinde geçen tüm Türkçe kelimelerin sayısını bulmayı hedefledim.

Türkçe Corpus(Derlem) Seçimi

Bir kelimenin Türkçe olup olmadığını Türkçe sözlüğe bakarak anlayabiliriz. Ancak sözlükler özel isimleri içermez. Parolaların içerisinde de bolca özel isim bulunduğundan, sözlük verisi işimize yaramayacaktır. Bize lazım olan şey bir derlemdir (corpus). Derlem, içerisinde çok sayıda yazılı metni barındıran külliyatlara verilen isimdir. Sözlüğün aksine, içerisinde özel isimler, şehir isimleri gibi farklı kelime türleri de barındırır. NLP çalışmalarında oldukça işe yarar. Yıllar önce ROMTU isimli otomatik şiir üreten yazılımı oluştururken TSCorpus isimli derlemi kullanmıştım. Bu derlem binlerce Türkçe websitesi taranarak oluşturulmuş muazzam bir kaynaktı. Fakat bu derlemin açık halini ne yazık ki bulamadım. Ancak ROMTU için kullandığım, Word2Vec ile derlenmiş halini yine de kullanabiliriz: https://github.com/utkusen/romtu/blob/master/trcorpus.bin

Eğlenelim, Öğrenelim Köşesi: word2vec kabaca (hatırladığım kadarıyla, tekrar araştırmaya üşendim); verilen derlemi işleyen ve vektörel değerler üreten bir neural network modelidir. Üretilen vektör değerlerini, kelimeler arasındaki anlam ilişkilerini ölçmek için kullanabilirsiniz. Örneğin word2vec çıktısına göre ağaç ve yaprak kelimelerinin cosine distance değeri 0.66 iken (ilk cümlede yalan söyledim, araştırdım tekrar) ağaç ve araba kelimelerinin cosine distance değeri çok daha düşük olacaktır (o kadar da araştırmadım). Dolayısıyla ağaç ve yaprak kelimeleri birbirlerine benzer, ağaç ve araba kelimeleri birbirlerine benzer değil şeklinde çıkarımlar yapabiliriz. Otomatik yazılan şiirin anlam bütünlüğünü koruması açısından bana epey faydası olmuştu.

Compile edilmiş derlemin içerisindeki kelimeleri tekrar çıkarmak için aşağıdaki Python kodunu yazdım:

import gensim #pip3 install gensim
from gensim.models import Word2Vec

trcorpus = gensim.models.KeyedVectors.load_word2vec_format('trcorpus.bin', binary=True) #bu dosyayi romtu reposundan indirebilirsiniz
#rockyou = [line.rstrip('\n') for line in open("rockyou.txt",encoding="latin1")]
word_vectors = trcorpus.wv

for i in word_vectors.vocab:
	#turkce karakterleri temizleyelim
	clean_word = i.replace("ı","i").replace("ş","s").replace("ğ","g").replace("ö","o").replace("ç","c").replace("ü","u").replace("â","a")
	print(clean_word) #hosgeldin python3

Derlemin Temizlenmesi

Derlemdeki kelimeleri temiz bir txt dosyasına aldığımda içerisinde iki problem olduğunu farkettim.

1) İçerisinde çok kısa kelimeler de var. Örneğin “aba” kelimesi Türkçe olsa da bu söz öbeğini içeren çok sayıda parola olabilir. Kısa kelimeler yanlışlık oranımızı artıracaktır. Dolayısıyla 5 karakterden kısa kelimeleri çıkartmak zorunda kaldım.

2) Derlemin içerisinde bazı İngilizce kelimeler de yer almaktaydı. (Aslında bu problemi iş bittikten sonra sonuçlar çok anormal gelince fark ettim)

Türkçe derlemin içerisindeki İngilizce kelimeleri çıkartmak için İngilizce derlem kullanmaya karar verdim. Bu konuda Wordnet isimli başarılı bir çalışma mevcut. Türkçe derlemin içerisindeki her kelimeyi Wordnet’de arattım, olumlu sonuç gelenleri çıkarttım. Bunu da aşağıdaki kod parçasıyla yaptım:

import codecs
from nltk.corpus import wordnet #nltk corpuslarini yuklemek biraz zahmetli, google'dan aratabilirsiniz

with open("corpus.txt","r") as corpus:
	for i in corpus.read().splitlines():
		a = wordnet.synsets(i.lower())
		if not a:
			print(i)

Derlemdeki Kelimelerin Rockyou İçerisinde Aranması

Bunun da kodunu iki dakikada Python’da yazıp beklemeye başladım. Fakat iş bitmeyince biraz hesaplama yaparak durumu hafife aldığımı farkettim. Rockyou wordlisti 14 milyon satırdan oluşuyor. Türkçe corpusta ise 56 bin satır mevcut. Yani 14 milyon x 56 bin kere (784.000.000.000) string karşılaştırması yapmamız gerekiyor. Bunu klasik dosyaları listeye çevirip iki for loop araması yaparak çözemeyeceğimi farkettim. Araştırmaya koyuldum. Bu tip string aramaları için geliştirilmiş Aho–Corasick diye bir algoritma olduğunu öğrendim. Python’da da kütüphanesi mevcut. Aşağıdaki kodla bu işi 20-30 saniye içinde çözdüm:

import ahocorasick

with open("corpus.txt") as corpus:
    auto = ahocorasick.Automaton()
    for word in corpus:
        word = word.rstrip('\n')
        auto.add_word(word, word)
    auto.make_automaton()

with open("rockyou.txt") as wordlist:
    for no, line in enumerate(wordlist):
        for end_ind, found in auto.iter(line ):
            print(found,line)

Sonuçlar

Her ne kadar İngilizce kelimeleri derlemimizden temizlediysek de diğer dillerle ortak olarak kullandığımız kelimeler derlemin içinde mevcut olabilir. Gördüklerimi elle temizledim. Dolayısıyla sonuçlarda bir miktar yanlışlık olması doğal.

Sonuç olarak 10875 adet Türkçe parolayı Rockyou.txt’den elde etmiş oldum. Parolalar buradan erişilebilir: https://github.com/utkusen/turkce-wordlist

Oluşan yeni wordlisteki parolaların istatistikleri ise şu şekilde:

En Popüler Parola Uzunlukları

  • 9: 15%
  • 10: 15%
  • 8: 12%
  • 11: 12%
  • 12: 09%

En Popüler Karakter Setleri

  • loweralpha: 54%
  • loweralphanum: 34%

En Popüler Hashcat Maskları

  • ?l?l?l?l?l?l?l?l: 10%
  • ?l?l?l?l?l?l?l?l?l: 07%
  • ?l?l?l?l?l?l?l?l?l?l: 06%
  • ?l?l?l?l?l?l?l: 06%
  • ?l?l?l?l?l?l?l?l?l?l?l: 05%
  • ?l?l?l?l?l?l?l?l?l?l?l?l: 05%