开源Web服务器GoAhead漏洞CVE-2017-17562分析

开源Web服务器GoAhead漏洞CVE-2017-17562分析

一.简介
GoAhead Web Server是为嵌入式实时操作系统定制的开源Web服务器。IBM、HP、Oracle、波音、D-link、摩托罗拉等厂商都曾在其产品中使用过GoAhead。根据反病毒实验室评估,全网有百万级别左右的设备运行该服务,鉴于嵌入式设备更新的滞后性,该漏洞影响的范围较广,后续mirai等恶意家族极有可能会利用该漏洞扩展僵尸主机,因此,反病毒实验室将对该漏洞进行持续关注,并将第一时间更新相关漏洞信息。
二.影响版本
GoAhead 3.6.5之前的版本(2.5.0 – 3.6.4)
三.漏洞成因
该漏洞的原因在于cgiHandler函数使用了不可信任的HTTP请求参数初始化已fork的CGI脚本的环境,当与glibc动态链接器结合使用时,可能会被使用特殊变量(如LD_PRELOAD)的导致远程代码执行。
从代码中可以看到,对于用户访问时所带的参数字段,只是对REMOTE_HOST和HTTP_AUTHORIZATION进行了过滤,所有其他参数都被认为是可信的而没有经过过滤。 正是由于对于参数的过滤不全,导致了用户可以修改CGI程序的LD_PRELOAD环境变量。



而补丁后的版本,对参数首先跳过待定的参数名称,并使用静态字符串做为其前缀。补丁后代码如下:



四.漏洞利用
漏洞利用首先使用上面的参数过滤不严的漏洞,向服务器发送LD_PRELOAD的环境变量,在系统的动态链接库的入口函数dl_main 中,会首先调用 process_envvars处理参数,链接器在解析envp数组时,如果找到特殊的变量名称(如LD_PRELOAD),则执行不同的代码路径。这里对LD_PRELOAD的处理,其中preloadlist被初始化。


随后,如果 preloadlist 不为空的话,会调用 handle_ld_preload函数


通过上面这些内容,可以实现通过设置LD_PRELOAD变量,来达到加载代码的目的。那么,如果能够通过gohead服务程序,将恶意程序发送到服务器并保存在固定目录下,就可以完美实现漏洞利用。
launchCgi函数调用系统函数dup2()将stdin文件描述符指向了POST请求数据对应的临时文件。 这意味着对于可以用类似LD_PRELOAD = / tmp / cgi-XXXXXX的请求,总会在磁盘有一个包含对应内容的文件,在这种情况下,如果能够猜出临时文件名,就能达到漏洞利用。
下图显示了launchCgi函数最终会调用execve函数加载执行。


实际上,我们很难猜出这个临时文件的文件名,但Linux procfs文件系统的一个很有用的符号链接:/proc/self/fd/0,,它对应着文件的stdin描述符,在这里,它也就指向了临时文件路径。通过使用/proc/self/fd/0符号链接,就可以访问到post到服务端的代码数据,通过这一系列的组合,最终就达到远程代码执行目的。
将上面的过程串联起来后, 在本地搭建测试环境,测试效果如下:



五.参考
https://www.exploit-db.com/exploits/43360/
https://github.com/elttam/advisories/tree/master/CVE-2017-17562

你可能感兴趣的:(开源Web服务器GoAhead漏洞CVE-2017-17562分析)