TL;DR
- 前两天看到这个漏洞的时候感觉还是挺有意思的,让我想起了之前分析的nginx提权漏洞(CVE-2016-1247)以及shellshock漏洞(CVE-2014-6271),前两天只是简单的看了一下,今天有时间就整理一下,留个备忘。
- goAHead是一个使用c语言实现的一个简单web服务器,主要用在嵌入式设备上,官方给出的一句话描述也是simple,secure Embedded web server,官方说有亿万的设备在使用(夸张了吧?),其中有像是hp、oracle、西门子、摩托罗拉等。详细可以看向这里https://embedthis.com/goahead/
CVE-2016-1247简单介绍
- 这个漏洞可以导致GoAhead web服务器在小于3.6.5版本远程代码执行。攻击者通过发送一个恶意的http请求,利用开启了CGI功能的goAhead的服务器,从而进行远程代码执行。其中exp是利用到了向新的进程中注入环境变量这种比较基本的攻击方式。
- 具体需要的条件主要有如下:
1.GoAhead开启CGI功能,即有cgi的处理页面(关于GoAhead cgi的使用可以看向这里https://embedthis.com/goahead/doc/users/cgi.html)
2.需要GoAhead版本低于3.6.5
3.需要动态链接glibc库(默认是动态链接的)具体
- 在英文原版文章中作者已经分析了glibc是如何加载和处理环境变量、GoAhead如何处理cgi以及linux的procfs的符号链接如何指向输入描述符等,我这里就不细分析了。下面只是放几张测试的图片。
(a.html extract from wireshark)
可以看到,打过payload之后,页面返回的环境变量多了一个LD_PRELOAD=/proc/self/fd/0的键值对。
可以看到,cgi处理进程符号链接指向的tmp文件和我们的payload是相同的。小结
- 这个漏洞利用的难点在于怎么将动态链接库注入到远程服务器,作者这里提供了一个很好的思路就是利用到了/proc/self/fd/0(它对应了文件的stdin文件描述符)这个文件就链接到了我们上传的文件
- 就像英文原版文章的标题一样,这个漏洞的精髓就是利用ld_preload来进行exploit,这个思路很新颖,后面可能会有其它的漏洞用到这个思路和方法。
漏洞引申1-有关nginx提权
- 漏洞分析文章见这里
Nginx-Exploit-Deb-Root-PrivEsc-CVE-2016-12471
作者的poc shell脚本写的不错
- 之前简单研究过nginx的提权漏洞,和这次的漏洞有一些像,也用到了环境变量,nginx的这个漏洞用到了写入恶意动态链接库路径到/etc/ld.so.preload。
漏洞引申2-有关shellshock
- 对比shellshock,这个漏洞要需要的条件苛刻很多,shellshock简单粗暴,而且shellshock的影响范围也更广。
Shellshock漏洞回顾与分析测试 - Debug_Orz漏洞引申3-其它
- 在github上看这个项目的一些cve issue
https://github.com/embedthis/goahead/issues?page=1&q=label%3Acve+is%3Aclosed
还是有很多东西值得学习的(基本上可以看到开发一个web服务器可能会遇到的安全问题)
比如这个issue https://github.com/embedthis/goahead/issues/241中,某位安全研究员提的报告
https://pierrekim.github.io/blog/2017-03-08-camera-goahead-0day.html - As I’m a fan of looking at the source –author
向作者学习,安全研究有个好处就是我们可以透过现象看本质,研究原理很有意思。 - 有关patch,原文中作者也说了,漏洞的修复只是过滤了几个特殊的参数名,有可能会被绕过,期待大牛们绕过的思路。
Reference
REMOTE LD_PRELOAD EXPLOITATION