CVE-2019-16278:Nostromo Web服务器的远程命令执行

CVE-2019-16278:Nostromo Web服务器的远程命令执行_第1张图片

在这篇文章中,我将分析CVE-2019-16278漏洞的成因,以及如何去利用它。这个漏洞存在于Nostromo web服务上(又名nhttpd),这是一个开源的web服务,在Unix系统上非常流行,例如FreeBSD, OpenBSD等等。

Nostromo由于在验证URL安全性方面存在缺陷,导致目录穿越,任何人都可以遍历系统中任何文件。因此未经过身份验证的远程攻击者可以强制服务器指向/bin/sh这样的shell文件,借此执行任意命令。在我测试时,Nostromo的所有版本,包括最新的1.9.6版本,都存在漏洞。甚至它的开发者网站[www.nazgul.ch](http://www.nazgul.ch)也有。

在以前Nostromo也出现过目录穿越漏洞,最终也可导致远程命令代码,编号为CVE-2011-0751。漏洞原因在于当时的web服务在对URL进行检查的时机是在URL被解码前,因此攻击者只需将/转换为%2f就可绕过检查,最后paylaod如下:

/..%2f..%2f..%2fbin/sh

虽然Nostromo很快修正了1.9.4版本的CVE-2011-0751漏洞,但现在我们又有了CVE-2019-16278,同样也是目录穿越。

利用

在Shodan上进行搜索,你可以在公网上找到大约2000个Nostromo web服务:"Server: nostromo"

CVE-2019-16278:Nostromo Web服务器的远程命令执行_第2张图片

我也用Python编写了一些PoC来抽查一些服务器。

在这里插入图片描述

如果你查看我的脚本呢,你会发现我发送了一个包含/.%0d./.%0d./.%0d./.%0d./bin/sh的请求。与CVE-2011-0751相比,我仅仅只是加入了大量%0d,Nostromo并不会对这种特殊字符进行检查。你可能想知道为什么加入了这种特殊字符就可绕过安全检查,下面我将详细说明。

让我们看一下Nostromo 1.9.6版本的源代码。

分析:

首先,服务器会验证请求然后处理它。

CVE-2019-16278:Nostromo Web服务器的远程命令执行_第3张图片

在上图的函数http_verify()中,请求的首行会先进行解码,然后检查/../是否存在。注意,此时攻击请求的首行包含/.\r./.\r./.\r./.\r./bin/sh

CVE-2019-16278:Nostromo Web服务器的远程命令执行_第4张图片

接下来,函数http_proc()会将首行传递给函数http_header()

CVE-2019-16278:Nostromo Web服务器的远程命令执行_第5张图片

漏洞根源就在这,函数http_header()会通过函数strcutl()解析数据。

CVE-2019-16278:Nostromo Web服务器的远程命令执行_第6张图片

而在函数strcutl()的内部,你可以看到它会把字符串中的\r(回车)去除。
CVE-2019-16278:Nostromo Web服务器的远程命令执行_第7张图片

最后,得到的路径是/../../../../bin/sh。那么,目录穿越完成,命令执行如何进行呢?在函数http_proc()中的execve()函数(用于执行指定程序)中,它执行了rh->rq_filef,这正是路径过滤后的结果/../../../../bin/sh

CVE-2019-16278:Nostromo Web服务器的远程命令执行_第8张图片

于是,我们就得到了一个可导致RCE的目录穿越!

如果你有任何问题,请通过我的Twitter和我交流。

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场:
来源:https://www.sudokaikan.com/2019/10/cve-2019-16278-unauthenticated-remote.html

你可能感兴趣的:(web,rce,目录穿越,安全)