本文主题主要是分析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服务器会先检查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版本源代码(http://www.nazgul.ch/dev/nostromo-1.9.6.tar.gz)。

源码分析:

当接收到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

这个漏洞就是这么通过路径遍历实现RCE的!

参考

https://www.sudokaikan.com/2019/10/cve-2019-16278-unauthenticated-remote.html

CVE-2019-16278-Nostromo Web Server远程代码执行的更多相关文章

  1. Windows 2003 Server远程代码执行漏洞集合

    目录 MS08-067 CVE-2017-7269 MS08-067 发布日期:2008/10/22 针对端口:139.445 漏洞等级:高危 漏洞影响:服务器服务中的漏洞可能允许远程执行代码 受影响 ...

  2. 漏洞复现-CVE-2017-4971-Spring Web Flow 远程代码执行

            0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场)(兼顾反弹shell的攻击机) 0x01 影响版本 Spring ...

  3. CVE-2020-0618 SQL Server远程代码执行

    1.简介 SQL Server Reporting Services(SSRS)提供了一组本地工具和服务,用于创建,部署和管理移动报告和分页报告. SSRS Web应用程序中的功能允许低特权用户帐户通 ...

  4. [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)

    Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...

  5. CVE-2020-0618 SQL 远程代码执行

    CVE-2020-0618 SQL Server远程代码执行 1.简介 SQL Server Reporting Services(SSRS)提供了一组本地工具和服务,用于创建,部署和管理移动报告和分 ...

  6. CVE-2020-0796—远程代码执行漏洞

    一.漏洞名称: 微软SMBv3 Client/Server - 远程代码执行漏洞——CVE-2020-0796 二.识别点: 445端口 三.影响范围: Windows 10 Version 1903 ...

  7. SMBv3远程代码执行漏洞复现(CVE-2020-0796)

    漏洞基本信息 服务器消息块(SMB),是一个网络通信协议,用于提供共享访问到文件,打印机和串行端口的节点之间的网络上.它还提供了经过身份验证的进程间通信机制.SMB的大多数用法涉及运行Microsof ...

  8. 【漏洞公告】CVE-2017-12615/CVE-2017-12616:Tomcat信息泄漏和远程代码执行漏洞

    2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616,该漏洞受影响版本为7.0-7.80之间,在一定 ...

  9. 【漏洞公告】Tomcat信息泄漏和远程代码执行漏洞:CVE-2017-12615/CVE-2017-12616

    2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616,该漏洞受影响版本为7.0-7.80之间,在一定 ...

随机推荐

  1. redis 哨兵集群原理及部署

    复制粘贴自: https://www.cnblogs.com/kevingrace/p/9004460.html 请点击此链接查看原文. 仅供本人学习参考, 如有侵权, 请联系删除, 多谢! Redi ...

  2. bind的模拟实现

    bind 一句话介绍 bind: bind() 方法会创建一个新函数.当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this,之后的一序列参数将会在传递的实参前传入作为它的参数.( ...

  3. 在函数内部定义的变量加与不加var的区别,匿名函数和有名函数内声明变量的区别

    2014年4月21日,14:49分: 原创:http://www.cnblogs.com/liujinyu/p/3678523.html 今天写天气网英文版的产品频道,maps页面的js时,偶然意识到 ...

  4. Java-Modifier类常用方法详解

    一.Modifier类的定义 Modifier类 (修饰符工具类) 位于 java.lang.reflect 包中,用于判断和获取某个类.变量或方法的修饰符Modifier类将各个修饰符表示为相对应的 ...

  5. Linux定时任务crontab命令

    linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另外, 由于用户自己也可以设置计划任务,所以,Li ...

  6. LeetCode 722. Remove Comments

    原题链接在这里:https://leetcode.com/problems/remove-comments/ 题目: Given a C++ program, remove comments from ...

  7. 【转】Fiddler抓包指南:结合Proxifier工具

    本文转自:https://blog.csdn.net/china_jeffery/article/details/93000824 本文介绍如何使用Fiddler抓取HTTP和HTTPS协议的包,同时 ...

  8. 第03组 Alpha冲刺

    队名:不等式方程组 组长博客 作业博客 团队项目进度 组员一:张逸杰(组长) 过去两天完成的任务: 文字/口头描述: 制定了初步的项目计划,并开始学习一些推荐.搜索类算法 GitHub签入纪录: 暂无 ...

  9. nginx之echo模块与内置变量

    Nginx扩展第三方模块——echo 第三方模块是对nginx的功能扩展,第三方模块需要在编译nginx的时候使用参数--add-module=PATH指定扩展模块的源码包路径给Nginx扩展添加ec ...

  10. 关于finalize()

    finalize()是Object中的方法,当垃圾回收器将要回收对象所占内存之前被调用,即当一个对象被虚拟机宣告死亡时会先调用它finalize()方法,让此对象处理它生前的最后事情(这个对象可以趁这 ...