Динамическая смена принта

hellhyde

Новичок
Пользователь
Июл 28, 2020
28
4
3
Доброго всем времени суток.
Помогите пожалуйста сделать динамическую смену вывода принта. Сейчас объясню

Программа через словарь проверяет сайты на скрытые разделы.
Пока ответ сайта 404 он держится на одной линии
Как только ответ другой, 200, 301 и тд этот ответ занимает эту линию и дальше опускается на 1 линию вниз и так до конца


Вот функция которая выводит это все

А ниже приложу весь код в спойлере.

Python:
def get_site_dirs():
    """Функция проверяет директории"""
    counter = 0
    try:
        for target_dir in DIRS:
            target_url = DOMAIN + target_dir.strip() + '/'
            host_answer = requests.get(target_url, allow_redirects=False)
            counter += 1
            if host_answer.status_code == 404:
                print(f"{counter:08d} of {len(DIRS)}\t{host_answer.status_code}\t{target_url}")
            else:
                writetxt(f"{counter:08d} of {len(DIRS)}   {host_answer.status_code} --> {target_url}")
                print_host_answers(host_answer.status_code, counter, target_url)
    except KeyboardInterrupt:
        print(Fore.RED + 'ERROR: manually stop Ctrl+C' + Fore.RESET)

Python:
import requests
import argparse
import sys
import os
from colorama import Fore
import colorama
colorama.init()

DOMAIN = ""
DIRS = []


def greetings():
    """Функция отображает приветствие пользователя"""
    print(Fore.GREEN + '''
╔═══╗╔══╗╔═══╗     ╔═══╗╔╗─╔╗╔════╗╔════╗╔═══╗╔═══╗
╚╗╔╗║╚╣║╝║╔═╗║     ║╔══╝║║─║║╚══╗═║╚══╗═║║╔══╝║╔═╗║
─║║║║─║║─║╚═╝║     ║╚══╗║║─║║──╔╝╔╝──╔╝╔╝║╚══╗║╚═╝║
─║║║║─║║─║╔╗╔╝     ║╔══╝║║─║║─╔╝╔╝──╔╝╔╝─║╔══╝║╔╗╔╝
╔╝╚╝║╔╣║╗║║║╚╗     ║║───║╚═╝║╔╝═╚═╗╔╝═╚═╗║╚══╗║║║╚╗
╚═══╝╚══╝╚╝╚═╝     ╚╝───╚═══╝╚════╝╚════╝╚═══╝╚╝╚═╝
          ''' + Fore.RESET)


def check_wordlist_file(path_to_wordlist):
    """Функция проверяет наличие файла со словарём"""
    if not os.path.isfile(path_to_wordlist.replace("\'", "")):
        print(f"{path_to_wordlist}\nФайл со словарём не найден.")
        sys.exit(0)
    fill_dirs_from_file(path_to_wordlist)


def set_url_format(hostname):
    """Функция проверяет форматирование url сайта"""
    global DOMAIN
    if hostname.split('/')[-1] == 'FUZZ':
        hostname = hostname[:-4]
    if hostname[-1] != "/":
        hostname += "/"
    DOMAIN = hostname
    check_site_annotaion()


def check_site_annotaion():
    """Функция проверяет есть ли коннект с хостом"""
    try:
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"}
        response = requests.get(DOMAIN, headers=headers, timeout=1)
        response.raise_for_status()
        if response.status_code == 200:
            print('ОК!')
    except (requests.exceptions.HTTPError, requests.exceptions.Timeout) as e:
        print('Ошибка: %s' % e)
        sys.exit(0)


def check_main_args():
    """Функция проверяет наличие аргументов сайта и словаря"""
    if not arg.wordlist or not arg.url:
        parser.print_help()
        sys.exit(0)


def check_app_keys():
    """Функция проверяет правильность аргументов"""
    # Наличие аргументов
    check_main_args()
    # Доступность файла словаря
    check_wordlist_file(arg.wordlist)
    # Форматирование url сайта и доступность хоста
    set_url_format(arg.url)
    print(f"\nРаботаем с сайтом {arg.url}. Путь к словарю {arg.wordlist}\n")


def fill_dirs_from_file(dirs_file):
    """Функция читает файл с адресами папок в список"""
    with open(dirs_file, "r") as reader:
        for line in reader.readlines():
            DIRS.append(line)
    print("\nЗагружено строк из словаря: " + str(len(DIRS)) + "\n")


def writetxt(results):
    """Функция записывает результаты в файл"""
    with open('fuzz.txt', 'a', encoding='utf-8') as file:
        file.write(results + '\n')


def print_host_answers(status_code, counter, url):
    """Функция отображает ответы хостов"""
    if status_code == 200:
        status_code = f'\033[32m{str(status_code)}\033[0m'
    elif status_code == 301 or status_code == 302:
        status_code = f'\033[94m{str(status_code)}\033[0m'
    elif status_code == 403:
        status_code = f'\033[31m{str(status_code)}\033[0m'
    print(f"{counter:08d} of {len(DIRS)}\t{status_code}\t{url}")


def get_site_dirs():
    """Функция проверяет директории"""
    counter = 0
    try:
        for target_dir in DIRS:
            target_url = DOMAIN + target_dir.strip() + '/'
            host_answer = requests.get(target_url, allow_redirects=False)
            counter += 1
            if host_answer.status_code == 404:
                print(f"{counter:08d} of {len(DIRS)}\t{host_answer.status_code}\t{target_url}")
            else:
                writetxt(f"{counter:08d} of {len(DIRS)}   {host_answer.status_code} --> {target_url}")
                print_host_answers(host_answer.status_code, counter, target_url)
    except KeyboardInterrupt:
        print(Fore.RED + 'ERROR: manually stop Ctrl+C' + Fore.RESET)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Dir Fuzzer', usage='Script options')
    parser.add_argument('-u', '--url', help='Enter domain https://site.com')
    parser.add_argument('-w', '--wordlist', help='Name and path of the wordlist')
    arg = parser.parse_args()
    greetings()
    check_app_keys()
    get_site_dirs()
 
Последнее редактирование:
  • Мне нравится
Реакции: Student

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот исправленный вариант функции:
Python:
def get_site_dirs():
    """Функция проверяет директории"""
    counter = 0
    x = ''
    try:
        for target_dir in DIRS:
            target_url = DOMAIN + target_dir.strip() + '/'
            host_answer = requests.get(target_url, allow_redirects=False)
            counter += 1
            if host_answer.status_code == 404:
                sys.stdout.write(f"{counter:08d} of {len(DIRS)}\t{host_answer.status_code}\t{target_url} {' ' * len(x)}\r")
                sys.stdout.flush()
                x = target_url
            else:
                writetxt(f"{counter:08d} of {len(DIRS)}   {host_answer.status_code} --> {target_url}")
                print_host_answers(host_answer.status_code, counter, target_url)
    except KeyboardInterrupt:
        print(Fore.RED + 'ERROR: manually stop Ctrl+C' + Fore.RESET)
 
Последнее редактирование:
  • Мне нравится
Реакции: hellhyde

Форум IT Специалистов