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
也有。
在以前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"
我也用Python编写了一些PoC来抽查一些服务器。
如果你查看我的脚本呢,你会发现我发送了一个包含/.%0d./.%0d./.%0d./.%0d./bin/sh
的请求。与CVE-2011-0751
相比,我仅仅只是加入了大量%0d
,Nostromo并不会对这种特殊字符进行检查。你可能想知道为什么加入了这种特殊字符就可绕过安全检查,下面我将详细说明。
让我们看一下Nostromo 1.9.6版本的源代码。
分析:
首先,服务器会验证请求然后处理它。
在上图的函数http_verify()
中,请求的首行会先进行解码,然后检查/../
是否存在。注意,此时攻击请求的首行包含/.\r./.\r./.\r./.\r./bin/sh
。
接下来,函数http_proc()
会将首行传递给函数http_header()
。
漏洞根源就在这,函数http_header()
会通过函数strcutl()
解析数据。
而在函数strcutl()
的内部,你可以看到它会把字符串中的\r(回车)去除。
最后,得到的路径是/../../../../bin/sh
。那么,目录穿越完成,命令执行如何进行呢?在函数http_proc()
中的execve()
函数(用于执行指定程序)中,它执行了rh->rq_filef
,这正是路径过滤后的结果/../../../../bin/sh
。
于是,我们就得到了一个可导致RCE的目录穿越!
如果你有任何问题,请通过我的Twitter和我交流。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://www.sudokaikan.com/2019/10/cve-2019-16278-unauthenticated-remote.html
最新评论