Пентест — это не просто покликать по клавишам и почувствовать себя хакером из голливудских фильмов. Это серьёзная работа, где куча времени уходит на рутину: сканирование сетей, перебор паролей, анализ веб-приложений или копание в открытых данных (OSINT). Эти задачи, хоть и важные, порой доводят до белого каления, потому что отнимают часы, которые можно было бы потратить на что-то поинтереснее. Вот тут-то и приходит на помощь автоматизация: скрипты и утилиты помогают скинуть с плеч этот груз и сосредоточиться на главном — анализе и креативе.
В этой статье мы разберём, как автоматизировать основные задачи пентеста: от проведения сканирования до составления отчётов. Будут примеры кода на Python, примеры команд для таких крутых штук, как Nuclei, Hydra и Amass, плюс немного про CI/CD. Но сразу предупреждаю: все скрипты и команды тут — чисто для примера, чтобы ты понял идею. Для реального пентеста их надо серьёзно дорабатывать. И, само собой, без письменного разрешения владельца системы даже не думай их запускать — это может быть незаконно и точно не этично. Законы вроде 272–274 УК РФ в России, американский Computer Fraud and Abuse Act (CFAA) в части запрета несанкционированного доступа, или европейские законы о кибербезопасности, такие как Директива NIS и национальные законы стран ЕС, так что давай играть по правилам.
Почему автоматизация — это твой лучший друг?
Пентест — это когда ты часами проверяешь порты, тестируешь пароли или роешься в конфигах серверов. Если делаешь всё руками, можно свихнуться, особенно если сеть огромная или веб-приложение сложное. Автоматизация — это как верный напарник, который берёт на себя всю нудятину:- Экономит время: Скрипты и утилиты шпарят быстрее, чем ты с кофе в руке.
- Меньше косяков: Автоматика не ошибается из-за невнимательности.
- Масштабируется на ура: Хочешь прогнать тысячу IP или URL? Легко!
- Даёт простор для мышления: Пока скрипты работают, ты анализируешь и придумываешь, как обойти защиту.
- Разрешение — must have: Не выходи за рамки области тестирования. Без письменного согласия (scope of engagement) — ни шагу.
- Не грузи сервера: Настраивай инструменты, чтобы не устроить случайно DDoS.
- Знай законы: В России — ст. 272–274 УК РФ, в США — CFAA, в ЕС — законы о кибербезопасности (Директива NIS) Не вляпайся.
- Цель:
example.com
- Что можно: Сканирование, перебор паролей (с лимитами)
- Что нельзя: DDoS, социальная инженерия
- Сроки:
01/06/2025 – 30/06/2025
- Контакт: security@example.com
Автоматизация сканирования уязвимостей с Python
Сканирование — это первый шаг разведки: надо понять, где слабые места. Проводить её руками — всё равно что искать иголку в стоге сена, особенно если целей сотни. Python тут как палочка-выручалочка: гибкий, с кучей библиотек и понятный даже новичкам.Пример: Параллельное сканирование веб-ресурсов
Вот демонстрационный скрипт, который прогоняет URL-ы, проверяя заголовки и содержимое на уязвимости. Это только пример, для реального пентеста его надо серьёзно доработать.
Python:
import requests
import ssl
import logging
from concurrent.futures import ThreadPoolExecutor
from urllib.parse import urljoin
# Настройка логов, чтобы не теряться в куче инфы
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def scan_vulnerability(url):
"""
Проверяет URL на уязвимости, смотрит заголовки и содержимое.
"""
try:
session = requests.Session()
session.verify = True # SSL — это важно
response = session.get(
url,
timeout=5,
headers={'User-Agent': 'Mozilla/5.0'},
proxies={'http': 'http://proxy:8080', 'https': 'http://proxy:8080'} # Прокси для анонимности
)
# Проверяем заголовки на старое ПО
server = response.headers.get('Server', '')
x_powered_by = response.headers.get('X-Powered-By', '')
if 'PHP/7.4' in x_powered_by or 'Apache/2.4.41' in server:
logging.warning(f"Старенькое ПО на {url}: {server}, {x_powered_by}")
# Ищем XSS
if '<script>alert(' in response.text.lower():
logging.warning(f"Похоже на XSS на {url}")
logging.info(f"Прогнал {url} - Статус: {response.status_code}")
except requests.RequestException as e:
logging.error(f"Ошибка на {url}: {e}")
def run_scanning(urls, max_workers=10):
"""
Запускает сканирование пачкой URL-ов.
"""
with ThreadPoolExecutor(max_workers=max_workers) as executor:
executor.map(scan_vulnerability, urls)
if __name__ == "__main__":
urls_to_scan = ["https://example1.com", "https://example2.com", "https://example3.com"]
run_scanning(urls_to_scan)
Что тут происходит:
- Логи: Всё записывается, чтобы сохранить важную информацию для анализа и отчётности.
- Обработка ошибок: Если сервер не отвечает или что-то пошло не так, скрипт не крашится.
- Многопоточность: Много URL-ов проверяются в рамках одного процесса — экономия времени.
- Прокси и SSL: Для безопасности и обхода блокировок.
Советы, по настройке:
- Добавь BeautifulSoup для парсинга HTML — найдёшь больше сигнатур.
- Подключи API базы CVE (например, NVD), чтобы проверять версии ПО.
- Проверяй редиректы и WAF, чтобы не попасть в бан.
Автоматизация перебора паролей с утилитами
Перебор паролей (brute-forcing) — важный инструмент для пентеста, проверяющий устойчивость учетных данных. Утилиты, такие как Hydra, Patator или Medusa, автоматизируют процесс, но требуют осторожности, чтобы не перегрузить сервер. Все команды — демонстрационные, для реального использования их нужно доработать. Используйте инструменты только с письменного разрешения владельца системы, чтобы не нарушить закон.1. Hydra — это один из самых популярных и мощных инструментов для перебора паролей. Он поддерживает более 50 различных сервисов и протоколов, включая SSH, FTP, HTTP, RDP и многие другие. Hydra позволяет легко и быстро перебрать пароли с использованием списка или словаря, а также предоставляет поддержку многопоточности для ускорения процесса.
Пример использования Hydra для перебора паролей через SSH:
Bash:
hydra -l root -P /path/to/passwords.txt -t 4 ssh://192.168.1.1
-l
admin: указывает имя пользователя (или используйте -L для списка пользователей).-P
/path/to/passwords.txt: файл с паролями для перебора.-t
4: количество потоков (параллельных попыток).-w
1: задержка в 1 секунду между попытками.ssh://192.168.1.1
: цель — в данном случае IP-адрес сервера через SSH.
- Используйте прокси-серверы или VPN для скрытия своей личности.
- Настройте ограничения по скорости и параметры таймаута, чтобы избежать блокировки со стороны цели.
- Если у вас есть список пользователей, используйте -L для подбора паролей для всех пользователей.
Пример использования Medusa для перебора паролей через FTP:
Bash:
medusa -h 192.168.1.1 -u admin -P /path/to/passwords.txt -M ftp
-h 192.168.1.1
: IP-адрес хоста.-u admin
: имя пользователя.-P /path/to/passwords.txt
: путь к файлу с паролями.-M ftp
: указывает, что перебор будет производиться для FTP.
- Используйте прокси: Настройте прокси (-x в Hydra) для анонимизации и обхода возможных блокировок по IP.
- Ограничивайте нагрузку: Установите низкое количество потоков (-t 2 или 4) и тестируйте небольшими партиями, чтобы минимизировать риск перегрузки сервера.
- Проверяйте ограничения на сервере:Перед началом перебора убедитесь, что вы понимаете лимиты целевой системы:
- Сканирование портов: Используйте nmap для проверки открытых портов и анализа ответов сервера. Например:
Bash:
nmap -p 22 192.168.1.1 --script ssh-auth-methods
- Это покажет доступные методы аутентификации и может намекнуть на наличие защиты, вроде fail2ban.
- Тестовые запросы: Отправьте несколько пробных попыток входа вручную или с помощью Hydra с минимальным словарем (например, 5–10 паролей) и отслеживайте ответы сервера (ошибки, таймауты, коды 429 или 403). Например:
Bash:
hydra -l root -P tiny_list.txt -t 1 ssh://192.168.1.1
- Анализ логов: Если у вас есть доступ к документации или логам сервера (в рамках scope of engagement), проверьте настройки, такие как лимиты подключений или блокировка после N неудачных попыток.
- Связь с владельцем системы: Уточните у клиента, есть ли системы защиты, такие как WAF, IDS/IPS или rate-limiting, чтобы адаптировать настройки перебора.
Пример использования Patator для перебора паролей на HTTP-сервере:
Bash:
patator http_fuzz url=https://example.com/login method=POST body="username=admin&password=^PASS^" 0=^passwords.txt
http_fuzz
: указывает, что будет проводиться атака на HTTP-сервер.url=https://example.com/login
: адрес целевого сервера.method=POST
: метод отправки данных (POST-запрос).body="username=admin&password=^PASS^"
: данные для формы авторизации, где ^PASS^ — это переменная для подставляемых паролей.0=^passwords.txt
: список паролей для подбора.
Создание эффективного словаря паролей
Инструмент | Роль | Преимущества | Недостатки | Рекомендации |
---|---|---|---|---|
Crunch | Генерация словарей | Полный контроль над шаблонами | Большие файлы | Для известных форматов паролей |
CeWL | Генерация словарей | Релевантные слова с сайта | Ограничен контентом сайта | Для контекстных словарей |
John the Ripper | Мутация словарей | Эффективные правила мутации | Требует базового списка | Для создания вариаций паролей |
Качество словаря определяет успех перебора. Целенаправленные словари, учитывающие контекст цели (имена, термины компании), эффективнее общих списков вроде RockYou.
Инструмент 1: Crunch — генерация паролей по шаблонам
Crunch создаёт словари на основе заданных символов или шаблонов.
Bash:
crunch 6 8 0123456789abcdef -o passwords.txt
Когда использовать: Если известен формат пароля (например, PIN или «имя + цифры»). Для шаблонов используйте -t:
Bash:
crunch 6 6 -t @@@@@% -o custom.txt
Инструмент 2: CeWL — сбор слов с сайта
CeWL извлекает слова с веб-сайта для создания словаря.
Bash:
cewl -d 2 -m 5 -w custom_wordlist.txt https://example.com
Когда использовать: Для паролей, связанных с контентом сайта (например, «Company2025»).
Инструмент 3: Фильтрация готовых словарей
Готовые словари (RockYou, SecLists) можно оптимизировать с помощью grep:
Bash:
grep -E '^.{8,12}$' rockyou.txt > filtered_rockyou.txt
Добавьте контекст (например, год):
Bash:
awk '{print $0 "2025"}' filtered_rockyou.txt > custom_2025.txt
Инструмент 4: Мутации с John the Ripper
John the Ripper создаёт вариации паролей (например, «password» → «p@ssw0rd»).
Bash:
john --wordlist=base_wordlist.txt --rules --stdout > mutated_wordlist.txt
Советы:
- Анализируйте цель: Используйте OSINT (например, Maltego) для сбора имён, дат или терминов.
- Оптимизируйте размер: Удаляйте дубликаты с помощью sort | uniq.
- Этичность: Проводите перебор в рамках scope of engagement, минимизируйте нагрузку.
Bash:
hydra -l admin -P clean_wordlist.txt -t 2 -w 2 ssh://192.168.1.1
Советы по перебору
- Используйте прокси (
-x
) для анонимизации. - Ограничивайте нагрузку (
-t, -w
) для избежания блокировок. - Проверяйте легальность: перебор без разрешения незаконен.
Автоматизация анализа веб-приложений
Веб-приложения — это как магнит для пентесеров: XSS, SQL-инъекции, кривые конфиги. Инструменты вроде Nuclei, OWASP ZAP или sqlmap помогают быстро найти дырки.Пример: Nuclei для сканирования
Bash:
nuclei -u https://example.com -t cves/ -o report.txt
YAML:
id: custom-xss-check
info:
name: Detect Reflected XSS
severity: medium
requests:
- method: GET
path:
- "{{BaseURL}}/search?q=<script>alert(1)</script>"
matchers:
- type: word
words:
- "<script>alert(1)</script>"
part: body
Bash:
name: Run Nuclei Scan
on: [push]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run Nuclei
run: nuclei -u https://example.com -t cves/ -o report.txt
Советы:
- Юзай OWASP ZAP с API для активного сканирования.
- Фильтруй ложные срабатывания в Nuclei.
- Интегрируй с CI/CD для регулярных проверок.
Автоматизация сбора OSINT
OSINT — это как детективная работа: собираешь информацию из открытых источников. Amass или Maltego делают это быстрее, чем ты в браузере.Сбор информации вручную — это крайне трудоемкая и долгая задача. Использование инструментов и скриптов для автоматизации процесса сбора данных позволяет значительно ускорить работу, минимизируя человеческий фактор и снижая шанс на пропуск важной информации.
Пример: Amass для разведки
Amass — это мощный инструмент для сбора информации о доменах, сетях и связанных с ними сущностях. Он может находить субдомены, а также извлекать информацию из различных публичных источников, таких как базы данных, журналы WHOIS, поисковые системы и другие. В отличие от других утилит, Amass может эффективно работать с огромными объемами данных и поддерживает различные методы поиска.Пример команды для использования Amass:
Bash:
amass enum -d example.com -o domains.txt
enum
: режим сбора информации.-d example.com
: указывает домен, для которого нужно собрать данные.-o domains.txt
: выводит результат в файл domains.txt.
Пример: Использование Maltego для визуализации связей
Maltego — мощный инструмент для визуализации связей между сущностями (домены, IP, email и т.д.). Пример сценария работы:- Установите Maltego (доступен в бесплатной версии Community Edition).
- Создайте новый проект и добавьте сущность, например, домен example.com.
- Примените трансформеры (преобразователи) для сбора данных:
- Запустите трансформер To DNS Name - Subdomains (из набора Domain Tools) для поиска поддоменов.
- Используйте To IP Address (из Infrastructure) для получения IP-адресов, связанных с доменом и поддоменами.
- Примените To Email Addresses (из OSINT) для поиска email, связанных с доменом.
- Добавьте To WHOIS Info (из Domain Tools) для получения регистрационных данных.
- Используйте To Social Media (из Social Links) для поиска связанных профилей в LinkedIn или Twitter.
- Постройте граф, где отображаются связи между доменом, поддоменами, IP, email, WHOIS-данными и социальными профилями. Используйте функцию «Layout» для упорядочивания графа (например, Organic Layout).
- Экспортируйте результаты в CSV или PDF для отчёта (File → Export Graph).
- Начальная сущность: example.com
- Трансформеры:
- To DNS Name - Subdomains → находит sub1.example.com, sub2.example.com.
- To IP Address → получает 192.168.1.10 для sub1.example.com.
- To WHOIS Info → возвращает регистратора и дату регистрации.
- To Email Addresses → находит admin@example.com.
- To Social Media → обнаруживает LinkedIn-профиль, связанный с admin@example.com.
- Доменная сущность: example.com
- Поддомены: sub1.example.com, sub2.example.com
- IP-адреса: 192.168.1.10 (геолокация: США), 192.168.1.11
- WHOIS: Регистратор GoDaddy, дата регистрации 2020-01-15, контакт admin@example.com
- Email: admin@example.com
- Социальный профиль: LinkedIn-аккаунт «John Doe», Twitter-аккаунт @example_admin
- Связь: IP 192.168.1.10 хостится у провайдера Example ISP
Organic Layout
List View
Пример: Сбор информации с помощью Python
Автоматизация сбора данных с использованием Python даёт гибкость и возможности для интеграции с другими инструментами. Наиболее часто используемые библиотеки для сбора OSINT данных:- requests — используется для отправки HTTP-запросов и получения ответов от веб-серверов.
- BeautifulSoup — для парсинга HTML-страниц.
- shodan — Shodan — инструмент для поиска информации о публичных устройствах в интернете (серверы, IoT-устройства). Требуется API-ключ для отправки запросов и получения данных через API.
Python:
import requests
def get_subdomains(domain):
"""
Извлекает поддомены для указанного домена через crt.sh.
"""
url = f"https://crt.sh/?q=%25.{domain}&output=json"
try:
response = requests.get(url, timeout=10)
response.raise_for_status() # Проверка на ошибки HTTP
data = response.json()
subdomains = [entry['name_value'] for entry in data]
return subdomains
except requests.RequestException as e:
print(f"Ошибка при запросе: {e}")
return []
if __name__ == "__main__":
domain = "example.com"
subdomains = get_subdomains(domain)
print(f"Найденные поддомены: {subdomains}")
Пример: Работа с базой данных WHOIS
Важным элементом OSINT является работа с WHOIS данными, которые позволяют получить информацию о владельцах доменов и их контактные данные. В Python можно использовать библиотеку whois для автоматизации этого процесса.Пример использования whois для получения данных:
Bash:
import whois
domain = "example.com"
whois_data = whois.whois(domain)
print(whois_data)
Объяснение:
- Используется библиотека
python-whois
(устанавливается черезpip install python-whois
) для получения WHOIS-данных о домене, таких как регистратор, даты регистрации и контакты. - Добавлена обработка ошибок для устойчивости скрипта.
Советы:
- Использование API: Множество сервисов, таких как Shodan или Censys, предлагают API для автоматизированного сбора информации о публичных устройствах и IP-адресах. Используйте их для интеграции в свои скрипты.
- Не забывай про конфиденциальность: При сборе данных с открытых источников всегда учитывайте юридические аспекты.
- Интеграция с CI/CD: Если вы хотите, чтобы процесс сбора данных и анализа был автоматизирован на постоянной основе, интегрируйте эти инструменты в процессы CI/CD, как это делается для сканирования уязвимостей.
Автоматизация отчётности
Отчёты — это та ещё морока, но без них никуда. Автоматизация с Python и reportlab спасает.Пример: PDF-отчёт
Python:
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
import matplotlib.pyplot as plt
import io
from reportlab.lib.utils import ImageReader
def create_summary_pdf(output_file):
c = canvas.Canvas(output_file, pagesize=letter)
c.drawString(100, 750, "Penetration Testing Report")
c.drawString(100, 700, "High Severity: 5 vulnerabilities")
c.drawString(100, 680, "Medium Severity: 3 vulnerabilities")
# Добавляем график
plt.figure(figsize=(4, 3))
plt.bar(['High', 'Medium', 'Low'], [5, 3, 2], color=['red', 'yellow', 'green'])
plt.title('Vulnerability Distribution')
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
c.drawImage(ImageReader(buf), 100, 500, width=200, height=150)
c.showPage()
c.save()
- Используй matplotlib для графиков.
- Попробуй Markdown для HTML-отчётов.
- Автоматизируй ввод данных из JSON.
Заключение
Автоматизация в пентестинге — это мощный инструмент, который помогает эффективно и быстро справляться с рутинными задачами, такими как сбор информации, сканирование уязвимостей, анализ данных и перебор паролей. Вместо того чтобы тратить огромное количество времени на однообразные процессы, пентестеры могут сосредоточиться на более творческих и критически важных задачах, таких как разработка стратегий эксплуатации и анализ уязвимостей.Что эффективнее для ускорения пентеста: полностью автоматизированный флоу ваших скриптов или идеально настроенные ручные проверки? Почему один подход лучше другого?
Последнее редактирование: