首页
社区
课程
招聘
[翻译]CVE-2019-16278-Nostromo Web Server远程代码执行
发表于: 2019-12-19 00:52 7511

[翻译]CVE-2019-16278-Nostromo Web Server远程代码执行

2019-12-19 00:52
7511

翻译:lipss

校对:nxe

原文链接:d1bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2K6N6h3c8G2K9$3q4A6K9$3q4F1i4K6u0W2j5$3!0E0i4K6u0r3x3U0l9I4z5g2)9J5c8U0p5H3i4K6u0r3j5%4k6W2i4K6u0V1x3U0l9I4z5g2)9J5k6o6p5$3x3U0M7^5i4K6u0V1N6h3&6S2N6i4c8Z5k6h3&6@1K9h3y4S2N6r3g2V1i4K6u0V1M7X3g2E0L8%4c8W2i4K6u0W2K9s2c8E0L8l9`.`.

本文主题主要是分析CVE-2019-16278漏洞原因、漏洞如何利用以及为什么会受到攻击。这个CVE跟Nostromo Web服务器(又名nhttpd)有关,这个组件是在FreeBSD,OpenBSD等Unix系统上非常流行的开源Web服务器。

Nostromo无法验证URL,导致可以通过路径遍历系统中的任何文件。没有通过身份验证的攻击者可以强制服务器指向/bin/sh之类的shell文件并执行任意命令。由于所有Nostromo的版本(包括最新版本1.9.6)都很容易受到攻击,甚至其开发人员的网站b28K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3&6S2P5X3N6#2L8q4)9J5k6h3y4Z5i4@1f1@1i4@1t1&6i4K6W2r3i4@1f1#2i4K6S2r3i4@1q4r3i4@1f1@1i4@1u0n7i4@1p5#2i4@1f1#2i4K6R3^5i4@1p5&6i4@1f1%4i4K6V1@1i4@1p5^5i4@1f1K6i4K6R3H3i4K6R3J5

Nostromo之前也有路径遍历漏洞,未授权远程代码执行CVE-2011-0751。在URI解码的转义字符之前,Web服务器会先检查URI中的字符串/../,然后RedTeam Pentesting GmbH发现了这个漏洞。将字符/编码为%2f并将其传递给服务器,如下所示:
/..% 2f .. %2f .. % 2fbin/sh

虽然Nostromo在检查字符串/../之前解码转义字符来修复1.9.4版中的CVE-2011-0751,但是仍然被sp0re绕过,并且CVE-2019-16278可以返回Nostromo路径遍历的结果。

Shodan上使用以下查询语句可以找到大约2000个暴露于互联网上的Nostromo Web服务器:

"Server: nostromo"

可以使用Python编写的PoC对一些服务器验证漏洞,实际上这些所有服务器都可以被攻击。

EXP发送了一个HTTP请求,URI中带有/.%0d./.%0d./.%0d./.%0d./bin/sh。 跟CVE-2011-0751对比,只是将%2f更改为Nostromo没有检查到的字符%0d

那么系统为什么可以用含有%0d ./.% 0d./而不是../../这样的回车符(CR)去遍历上层目录。 其实系统接收到没有任何CR字符的../../。 那么,那些CR字符哪里去了?

这些疑问可以通过分析Nostromo源码得到答案,Nostromo 1.9.6版本源代码(02cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3&6S2P5X3N6#2L8q4)9J5k6h3y4Z5i4K6u0r3k6r3g2$3i4K6u0r3L8X3!0K6N6s2u0G2L8h3!0Q4x3X3b7I4i4K6u0W2z5g2)9J5k6e0k6Q4x3X3g2@1j5i4u0Q4x3X3g2Y4P5W2)9J5z5g2!0q4x3#2)9^5x3q4)9^5x3R3`.`.

当接收到URI,先进行验证然后进行处理。

在http_verify()函数里,这个URI先是被http_decode_header_uri()函数解码,然后检查/../.是否存在。这个URI现在是/.\r./.\r./.\r./.\r./bin/sh.

接下来,在http_proc()函数中,将URI传给http_header()函数

根本原因在这里,在http_header()函数中,通过strcutl()函数解析URI。

看一下strcutl()函数的实现,可以看到是接收一个字符串并以\ r(回车)被截断了返回。

现在路径是/../../../../bin/sh。 那么路径遍历部分完成了之后又怎么被执行呢?是因为http_proc()函数中的execve()函数。 执行rh-> rq_filef时,实际值是路径/../../../../bin/sh


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-12-29 23:06 被lipss编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回