39
Эй, привет, хакер! Сегодня мы с тобой замутим крутой инструмент — чекер уязвимостей на Python, который будет сканировать тысячи хостов в час и находить дыры быстрее, чем ты успеешь допить свой энергетик. Мы используем асинхронные запросы с aiohttp
, чтобы всё летало на максималках, и я дам тебе готовый шаблон для массового сканирования. Готов? Погнали!
Зачем это нужно и что мы строим?
Чекер уязвимостей — это твой швейцарский нож для поиска слабых мест в веб-приложениях. Будь то открытые админки, уязвимости вроде SQL-инъекций или просто небрежно оставленные файлы config.php
— наш скрипт будет проверять хосты пачками. Основная фича — скорость: за счёт асинхронности мы пробьём 5000+ хостов в час даже на среднем железе. А ещё это шаблон, который ты сможешь кастомизировать под свои задачи.
Что сделаем:
aiohttp
./admin
).Инструменты и подготовка
Нам нужен Python 3.7+ (асинхронность требует свежих версий), а также несколько библиотек. Устанавливаем всё через pip
:
1 |
pip install aiohttp asyncio colorama |
aiohttp
— для асинхронных HTTP-запросов.asyncio
— для управления асинхронными задачами.colorama
— чтобы вывод в консоль был красивым и цветным (для стиля, бро).Также подготовь список хостов для сканирования — текстовый файл targets.txt
, где каждая строка — это IP или домен (например, http://example.com
или просто example.com
).
Пишем код: основа асинхронного чекера
Давай начнём с базового скрипта. Мы создадим асинхронный клиент, который будет отправлять запросы пачками, проверять ответы и логировать результаты. Вот готовый шаблон:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
import aiohttp import asyncio from colorama import Fore, init import time # Инициализация цветного вывода init() # Настройки MAX_CONCURRENT = 100 # Максимум одновременных соединений TIMEOUT = 5 # Таймаут на запрос в секундах TARGETS_FILE = "targets.txt" RESULTS_FILE = "results.txt" # Загружаем список целей def load_targets(): with open(TARGETS_FILE, 'r') as f: return [line.strip() for line in f if line.strip()] # Логирование результатов def log_result(target, status, message): timestamp = time.strftime("%Y-%m-%d %H:%M:%S") log_line = f"[{timestamp}] {target} - {status} - {message}\n" print(log_line, end="") with open(RESULTS_FILE, 'a') as f: f.write(log_line) # Проверка одного хоста async def check_vuln(session, target): try: # Формируем URL, если его нет if not target.startswith(('http://', 'https://')): target = f"http://{target}" url = f"{target}/admin" # Пример: проверяем наличие админки async with session.get(url, timeout=TIMEOUT, allow_redirects=False) as resp: if resp.status == 200: log_result(target, Fore.GREEN + "VULN" + Fore.RESET, f"Admin panel found at {url}") return True else: log_result(target, Fore.RED + "SAFE" + Fore.RESET, f"Status code: {resp.status}") return False except aiohttp.ClientError as e: log_result(target, Fore.YELLOW + "ERROR" + Fore.RESET, f"Connection error: {str(e)}") return False except asyncio.TimeoutError: log_result(target, Fore.YELLOW + "TIMEOUT" + Fore.RESET, "Request timed out") return False # Основная функция для массового сканирования async def main(): targets = load_targets() print(f"Loaded {len(targets)} targets. Starting scan...\n") # Создаём коннектор с лимитом соединений connector = aiohttp.TCPConnector(limit=MAX_CONCURRENT) async with aiohttp.ClientSession(connector=connector) as session: # Создаём задачи для каждого хоста tasks = [check_vuln(session, target) for target in targets] # Запускаем задачи пачками await asyncio.gather(*tasks) if __name__ == "__main__": start_time = time.time() asyncio.run(main()) elapsed = time.time() - start_time print(f"\nScan completed in {elapsed:.2f} seconds.") |
Как это работает?
aiohttp
и asyncio
, чтобы отправлять запросы параллельно. Параметр MAX_CONCURRENT
ограничивает количество одновременных соединений, чтобы не перегрузить сеть или сервер.check_vuln
мы делаем запрос на /admin
. Если код ответа 200, считаем, что админка открыта. Это базовый пример — можешь заменить на проверку других путей или уязвимостей.results.txt
.Лайфхаки для улучшения
MAX_CONCURRENT
до 50 или даже 20. Если хосты медленные, увеличь TIMEOUT
.aiohttp
это делается через параметр proxy
в session.get
./wp-admin
для WordPress или /phpinfo.php
для конфиденциальной инфы.
1 2 |
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"} async with session.get(url, headers=headers, timeout=TIMEOUT) as resp: |
Пример кастомизации: проверка SQL-инъекций
Давай добавим базовую проверку на SQL-инъекцию. Мы будем отправлять запрос с параметром вроде id=1'
и искать в ответе ошибки базы данных (например, SQL syntax error
):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
async def check_sql_injection(session, target): try: if not target.startswith(('http://', 'https://')): target = f"http://{target}" url = f"{target}/page.php?id=1'" # Пример уязвимого параметра async with session.get(url, timeout=TIMEOUT, allow_redirects=False) as resp: text = await resp.text() if "sql" in text.lower() or "syntax error" in text.lower(): log_result(target, Fore.GREEN + "VULN" + Fore.RESET, f"Possible SQL Injection at {url}") return True else: log_result(target, Fore.RED + "SAFE" + Fore.RESET, f"No SQL error found") return False except Exception as e: log_result(target, Fore.YELLOW + "ERROR" + Fore.RESET, f"Error: {str(e)}") return False |
Просто добавь эту функцию и вызови её в main()
вместо или вместе с check_vuln
.
Как запустить на продакшене?
targets.txt
с доменами или IP. Если их тысячи, разбей на части, чтобы не перегружать память.python script.py
. Убедись, что всё настроено (таймауты, лимиты).results.txt
и ищи строки с [VULN]
— это твои цели для дальнейшей работы.Заключение
Ты только что замучил чекер, который жёстко сканирует 5000+ хостов в час и находит уязвимости на автомате. Это базовый шаблон, но с твоей фантазией он превратится в настоящую пушку. Добавляй новые проверки, играйся с параметрами, подключай прокси — делай, что хочешь, но помни: используй это ответственно. Мы тут не для хаоса, а для знаний и кайфа от кода.