fortigate Vulnerability
条评论CVE-2018-13382
关键字是 magic
,4tinet2095866
。对 init 文件进行分析。找到包含这2个关键字的函数。
最终定位到 sub_1234A80 ,这个函数很长,调用了很多其他函数,我也不是都看的明白。但是没有关系,只要能看明白关键的地方。
SSLVPN_get_value__
,SSLVPN_copy_value__
是我自己取的名字。它们的作用一个是取值,一个是复制。
最后比较我们发送的 magic 值是不是等于 4tinet2095866 。相等 v37 = 1 ,然后进入下一个 if 判断中。
另外:我用的 IDA 分析,有时候函数会分析得不到位。后面得到这里的逻辑如下。
1 | v35 = (const void *)SSLVPN_get_value__(*(_QWORD *)(v2 + 720), "magic"); |
接着,我们只需要追踪输入的密码,也就是 credential 的值,在哪里使用到了。就知道什么地方改掉了密码。
根据分析,credential 值现在有 2 个变量存放。 v33 与 v56,最后在下方找到一处调用 sub_1224080。
这里的 s 实际是存放的用户名,在上面的某个位置取出来的。
这个sub_1224080 函数应该就是来修改对应用户名的密码。这里就不展开分析了。
gdb动态调试
之前的文章中,已经上传了一个 gdb 到 fortigate 的环境中。这里直接开始来调试。
./gdb -p 3806 ,3806 是 /bin/sslvpn 的 PID 号。
从读取密码的地方开始下断:b *0x12350C0
跟踪密码,看它去哪了。同时,关注 magic 的值。
后面的分析,分成发送了 magic ,和不发送 magic。看看他们代码执行流程的不同。
发送Magic
credential 的值已经读入到 rax 中,继续向下走到读取magic。
magic 的值读取到 rax ,接着我们分析可知它会走到改用户名的密码的位置去。
下断 0x123547E ,走过来如下。
不带 Magic
当不带magci参数的时候,分析可知程序没有走到 sub_1224080 函数。所以间接的证明这个函数就是修改密码的。
后面我想更直观的用IDA + gdbserver 的方式进行调试。但奈何,IDA 就是attach不上目标。
gdbserver 能够运行起来,并且访问ssl-vpn登陆页面,可知确实挂载了起来。
IDA 这边的配置也没有发现什么问题。
不知道什么原因。
注:2022-2月,原因是:飞塔不允许主动开放其他端口。所以这个问题,我在做飞塔后门研究的时候,已经解决。
另外 /migadmin/sslvpn/js/login.js 里面写上了页面读取账户密码的逻辑。这里就不去看了。
CVE-2018-13380
这个xss漏洞,经过我一番寻找。找到了漏洞代码的位置。
最终定位到 : sub_1225390 -> sub_1225750
sub_1225750
从图中可以看到 v5 的值从 errmsg 来,并且直接用 %s 写入了,没有任何过滤。导致了这个xss。
同时在这个代码处还有另一个XSS CVE-2019-5586 , Param 参数造成。
以及另一个 XSS