欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-26 16:20:09
...

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

在这篇文章中,我将分析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服务器的远程命令执行

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

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

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

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

分析:

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

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

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

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

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

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

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

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

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

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

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

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

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

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