本文为2018年十大网络黑客技术题名文章,欢迎读者来读

Pound?

Pound是一个开源HTTP负载均衡器,通常用作SSL/TLS终端(在http后端处理https与证书)。 在过去,这个工具被用于为网站添加SSL。

如果访问官方网站,你会看到pound被描述为负载均衡器、反向代理、SSL封装器以及删除工具:

HTTP/HTTPS处理程序:Pound会进行验证请求操作并接受格式正确的请求。

项目活动一直被拖延进行,2018年初发布的最后一个CVE引发了各界对某些项目的关注。Debian项目删除了软件包,不仅仅是因为其被爆出可用的CVE。新版本的openSSL的兼容性和缺乏项目活动对公司决策起到了关键的作用。

固定版本的Pound

如果我们现在检查此软件包的Debian页面状态,我们会发现该软件包已被删除,并且我们无法在任何开发存储库中找到它。这里存在三个安全隐患:版本过时、忽略了安全问题的稳定性并且是jessie(oldstable)其中之一。在我自己的测试过程中,我发现我无法在jessie上安装它,进一步测试后我发现了其内部存在的安全问题。

如果用户使用了Suse包,则可以使用安全更新操作。

在官方项目介绍页面上,officiel稳定版现在是Pound-2.8并包含修复程序。 第一个固定版本是2.8a,并且有很长一段时间只有这个实验版本可用。

版本2.8的源代码差异不是很大:(fossies1 | fossies2 | fossies3)
。 有趣的是,这些版本包含了HTTP Smuggling问题,包括功能的删除(动态扩展)和安全语法过滤器等。

CVE-2016-10711

官方描述如下:

在2.8a之前的Apsis Pound允许通过自行设计的消息头进行request smuggling

事实上,这里大多数的问题都是HTTP解析器常见的错误(还有一些罕见的问题,比如NULL字符处理)。在过去的几年里,我在许多项目中报告了类似的问题,所以研究这些攻击是值得的。

正如后面所解释的那样,作为SSl工具的Pound并不是smuggling攻击中最关键的部分。 在反向代理缓存或常见HTTP服务器上执行此类攻击对攻击者来说更有价值。 但是整个“HTTPsmuggling攻击”范例均是基于链接的多语法错误,所以每个用户均可以检测出非正常的消息头内容。

1-支持双倍长度内容:

任何带有2个Content-Length标头的请求都必须被拒绝。

RFC7230 section 3.3.2

如果收到的消息具有多个Content-Length头,其字段值包含相同的十进制值,或者单个Content-Length头,其字段值包含相同十进制值的列表(例如,“Content-Length” :42,42),表示消息处理器生成重复的Content-Length头字段,此时接收者必须拒绝该消息并设置其为无效或用单个有效Content-Length替换重复的字段值。在确定邮件正文长度之前包含该十进制值的字段。

RFC7230 section 3.3.3

如果在没有Transfer-Encoding的情况下收到消息并且Content-Length头字段具有不同字段值,则消息无效且接收者必须将其处理为错误。 如果这是请求消息,则服务器必须以400(错误请求)状态代码响应,然后关闭连接。

在Pound中,如果你发送如下请求:

Content-Length: 0
Content-Length: 147

返回结果:Size of Body = 0

如果你发送:

Content-Length: 147
Content-Length: 0

返回结果:Size of Body = 147

官方结果会将其处理为错误。 如果HTTP通信中的前一个actor包含相同的情况,那么用户将面临一个smuggling攻击隐患。
我们将在下面看到关于HTTP漏洞的一些示例,其目标通常大小不同,一个分析者发现3个请求,另一个认为只有2个。

2)Chunks会根据消息长度进行优先考虑

这里我们再次讨论RFC7230第3.3.3节,但另一点:

如果收到包含Transfer-EncodingContent-Length字段的消息,则Transfer-Encoding将覆盖整个Content-Length。 这样的消息表示了执行请求smuggling响应拆分操作,并且应该作为错误进行处理。

因此我们这里的设置是拒绝该消息(现在大多数服务器都是这种情况)。倘若不进行拒绝操作,则分块传输在任何Content-Length头上都具有优先级。

使用Pound是令第一个消息头具有读取优先级。

我们来看一个例子吧。 在这里,我让Pound Server127.0.0.1上侦听HTTP端口8080。 (所以没有HTTPS支持,但相信我在HTTPS模式下所有的攻击都是一样的,你甚至可以使用openssl_client而不是netcat来输出一些printf输出)。 在Pound中,任何端口均可以与HTTP服务器(后端)进行通信。

  • 我使用printf来反馈HTTP查询结果。由于我想要对所有字符进行完全控制,所以我没有使用curl或wget。

  • 我将所有查询链接在一个单独的字符串中,然而我没有等待每个查询之间的响应,这称为HTTP pipeline,然而没有pipelining服务器上的支持(这里是Pound)我什么也做不了。

  • 我将此字符串(HTTP查询)发送到netcat(命令nc),这是一个非常低级别的命令,它可以控制目标IP和端口的tcp/ip连接。

  • 这与使用浏览器或curl发送HTTP查询相同,不过我可以对消息头进行完全控制。

  • 攻击者的目标是发送不同数量查询的消息,这是技术目标。 这个功能是绕过过滤器或领缓存失效。像XSS的alert()功能,如果你的有效响应数量出现错误,那么这里就不仅仅是功能问题,而是安全隐患。

  • 如果在测试环境中进行使用,那么我们应该跟踪Pound在后端发送的请求,例如使用Wireshark。 管道的每个请求将单独发送到后端,而不是发送到管道中。

# 2 responses instead of 3
printf 'GET / HTTP/1.1\r\n'\
'Host:localhost\r\n'\
'Content-length:56\r\n'\
'Transfer-Encoding: chunked\r\n'\
'Dummy:Header\r\n\r\n'\
'0\r\n'\
'\r\n'\
'GET /tmp HTTP/1.1\r\n'\
'Host:localhost\r\n'\
点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖