CVE-2018-13382

关键字是 magic4tinet2095866 。对 init 文件进行分析。找到包含这2个关键字的函数。

最终定位到 sub_1234A80 ,这个函数很长,调用了很多其他函数,我也不是都看的明白。但是没有关系,只要能看明白关键的地方。

SSLVPN_get_value__SSLVPN_copy_value__ 是我自己取的名字。它们的作用一个是取值,一个是复制。

最后比较我们发送的 magic 值是不是等于 4tinet2095866 。相等 v37 = 1 ,然后进入下一个 if 判断中。

另外:我用的 IDA 分析,有时候函数会分析得不到位。后面得到这里的逻辑如下。

1
2
v35 = (const void *)SSLVPN_get_value__(*(_QWORD *)(v2 + 720), "magic");
if ( v35 && !memcmp(v35, "4tinet2095866", 0xEuLL) )

接着,我们只需要追踪输入的密码,也就是 credential 的值,在哪里使用到了。就知道什么地方改掉了密码。

根据分析,credential 值现在有 2 个变量存放。 v33v56,最后在下方找到一处调用 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 这边的配置也没有发现什么问题。

不知道什么原因。

另外 /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