前言
既CVE-2025-0282之后,ivanti再次爆出一个栈溢出漏洞CVE-2025-22457。此文记录关于它的利用过程学习。
漏洞定位
获取X-Forwarded-For的值,并且获取数字0-9以及点.,并把这些拷贝到栈上。
由于没有对X-Forwarded-For的长度进行检查,很明显存在一个栈溢出。
漏洞利用
由于只能输入数字和点,所以想通过控制返回地址去进行ROP是行不通的。同时注意上图中的*((_DWORD *)a1 + 0x36) = -1;
这一段代码,我们在进行栈溢出时,会覆盖掉这里的a1,并且很明显会把他覆盖成一个3开头的地址,比如0x39393939。但是这个地址正常来说是非法地址,所以当时在看到这个漏洞的适合以为是无法利用的。
后续参考rapid的文章,得知可用通过堆喷的方式去绕过上面这个限制。
我们通过申请大量的堆块,使得0x39393939等地址可用被我们控制。并且下面会进入函数processCookieHeader。这个函数的入参a1就是在上面会被我们覆盖的那个。
这个函数一开始的地方就是函数指针的调用,在堆喷控制堆布局之后,我们就可以通过控制这里的函数指针,去控制程序执行流,之后就可以进行ROP了。
并且文章中也给出了堆喷的方式,通过IF-T/TLS传输机制去进行堆喷即可。
下图是相关调试过程,因为多核不方便进行调试,我就改成了单核,这样更方便调试。
最后附上rce图。
参考链接
https://attackerkb.com/topics/0ybGQIkHzR/cve-2025-22457/rapid7-analysis?referrer=notificationEmail