CVE-2019-16278-Nostromo Web Server远程代码执行

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

Nostromo无法验证URL,导致可以通过路径遍历系统中的任何文件。没有通过身份验证的攻击者可以强制服务器指向/bin/sh之类的shell文件并执行任意命令。由于所有Nostromo的版本(包括最新版本1.9.6)都很容易受到攻击,甚至其开发人员的网站www.nazgul.ch也可以利用。

Nostromo之前也有路径遍历漏洞,没有身份验证的远程代码执行CVE-2011-0751。在URI解码的转义字符之前,Web服务器先检查字符串/../,然后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发送了一个请求,该请求的URI中带有/.%0d./.%0d./.%0d./.%0d./bin/sh。 跟CVE-2011-0751对比,只是将%2f更改为%0d,Nostromo的漏洞被绕过。那么系统为什么可以用这样的字符%0d回车符(CR)%0d ./.% 0d./而不是../../遍历上层目录。 其实系统接收到没有任何CR字符的../../。 那么,那些CR字符哪里去了?
让我们看一下Nostromo版本1.9.6的源代码(http://www.nazgul.ch/dev/nostromo-1.9.6.tar.gz)。

源码分析:

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

在http_verify()函数里,这个URI先是被URL解码,然后检查/../.是否存在。这个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

OK,通过路径遍历实现RCE!

如果觉得这个知识点有价值,请与他人分享。
如有任何疑问,随时在Twitter上提问或发表评论。

猜你喜欢

转载自www.cnblogs.com/17bdw/p/12057671.html