Python - FTP dictionary attack (2)

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: nitrexx
Datum: 25.9.2012
Hodnocení/Hlasovalo: 1.8/10

Druhý diel seriálu o tvorbe FTP dict. Attacku.

V tomto diely vás zoznámim s argumentmi príkazového riadku ktoré sú dobre známe Unixovým užívateľom kde za program vkladajú výrazy ako –t 85.12.25.45 –v –o output.txt a podobné .

My budeme používať na spúšťanie:

python ftpda.py  -s server –l login.txt –p pass.txt

Úplne jednoduché, -s je server na ktorý sa skúšame pripájať, -l je textový dokument z loginmi a –p je textový dokument z heslami.

Argumenty príkazového riadku a výnimky

Najprv musíme naimportovať moduly sys a getopt a pridáme aj globálne premenné:

import getopt
import sys

app = "Ftp Dictionary Attack"
version = '1.0'
author = "Nitrexx"

Táto časť kódu prijíma argumenty:

print sys.argv[1:]#pre lepsie pochopenie, nepotrebny vypis
try:#prijime argumenty, ak su zle zadane skoci na except, vypise spravu a skonci
    opts,args = getopt.getopt(sys.argv[1:],"h:s:l:p:",["help","server=","lfile=","pfile="])
    print opts #pre lepsie pochopenie, nepotrebny vypis
except getopt.GetoptError:
    print app, " ", "Created By: ",author, "Version: ", version 
    print 'ftpda.py -s  -l  -p '
    sys.exit(1)

V try: sú nadefinované 2 premenné prvá je options a druhá je argument. Teraz opts obsahuje napr.[(‘-s’, ‘server.com’)] a args zvyšok a ďalej je už nepotrebná. Metóda getopt() ako prvé prijíma z kadiaľ má prijímať argumenty, sys.argv[1:] určuje že ich má prijímať od prvej pozície keďže argv[0] je názov programu tak sa urobí výrez od prvej pozície. Ako druhé prijíma krátke názvy options a ako tretie prijíma dlhé názvy mali by sa končiť na „=“ ak prijímajú argument. A celé je to obalené do výnimiek, ak v try: nastane chyba skočí na except ,vypíše správu a skončí.

Už len jednoduchý cyklus for:

for opt, arg in opts:
    if opt in ('-h', '--help'):
        print app, " ", "Created By: ",author, "Version: ", version
        print 'ftpda.py -s  -l  -p '
        sys.exit()
    elif opt in ("-l", "--lfile"):
        loginfile = arg
    elif opt in ("-p", "--pfile"):
        passwordfile = arg
    elif opt in ("-s", "--server"):
        server = arg 

Cyklom for prejdeme hodnoty opts ktoré rozdelíme do dvoch premenných opt je vlastnosť a arg je hodnota. Čiže ak sme zadali všetky argumenty správne tak server ,loginfile a passwordfile obsahujú argumenty ktoré boli zadané za –s –l –p.

Ešte chcem podotknúť že sa dá pristupovať k vlastnostiam(options) aj dlhou formou tj. –server= nazov –lfile=nazov –pfile=nazov.

A už iba overíme správnosť zadaných súborov :

print '-' *15  
print 'Login subor :' ,loginfile
print 'Password subor :', passwordfile
print '-' *15

try:
    logins = open(loginfile,"r").readlines()
except(IOError):
    print "{0} nebol najdeny".format(loginfile)
    sys.exit(1)

try:
    passwords = open(passwordfile, "r").readlines()
except(IOError):
    print "{0} nebol najdeny".format(passwordfile)
    sys.exit(1)

Pokúsi sa načítať riadky z loginfile do logins pri chybe vypíše reťazec a skončí a to isté spravý aj z heslami. A v ďalšom diely si ukážeme vlákna a zámky a prácu z FTP a potom už bude každý schopný napísať ftp dict. cracker.

Toto je výsledok tohto dielu :

import getopt
import sys

app = "Ftp Dictionary Attack"
version = '1.0'
author = "Nitrexx"

print sys.argv[1:]#pre lepsie pochopenie, nepotrebny vypis
try:#prijime argumenty, ak su zle zadane skoci na except, vypise spravu a skonci
    opts,args = getopt.getopt(sys.argv[1:],"h:s:l:p:",["help","server=","lfile=","pfile="])
    print opts #pre lepsie pochopenie, nepotrebny vypis
    print args
except getopt.GetoptError:
    print app, " ", "Created By: ",author, "Version: ", version 
    print 'ftpda.py -s  -l  -p '
    sys.exit(1)
for opt, arg in opts:
    if opt in ('-h', '--help'):
        print app, " ", "Created By: ",author, "Version: ", version
        print 'ftpda.py -s  -l  -p '
        sys.exit()
    elif opt in ("-l", "--lfile"):
        loginfile = arg
    elif opt in ("-p", "--pfile"):
        passwordfile = arg
    elif opt in ("-s", "--server"):
        server = arg

print '-' *15  
print 'Login subor :' ,loginfile
print 'Password subor :', passwordfile
print '-' *15

try:
    logins = open(loginfile,"r").readlines()
except(IOError):
    print "{0} nebol najdeny".format(loginfile)
    sys.exit(1)

try:
    passwords = open(passwordfile, "r").readlines()
except(IOError):
    print "{0} nebol najdeny".format(passwordfile)
    sys.exit(1)