猫头鹰
信安舆情早知道

BinProxy介绍

BinProxy是NCC Group在今年黑帽大会发布的一款获知和处理二进制网络流量的工具。在本文中,我们将对BinProxy的主要功能进行介绍,并展示该工具是如何使用自定义协议来评估应用程序的安全性。

当你对Web应用程序进行渗透测试时,你可能会使用拦截代理,比如Burp Suite、ZAP或者 Fiddler。你可以通过浏览器的开发工具以及手动地使用curl观察应用程序的HTTP(S)流量来对一个Web应用程序进行测试,这是为了更方便让应用程序做日志记录的工作,检索任何初始数据和篡改所有输入的请求参数。

但不是所有的应用都使用HTTP协议,当下艺术的状态是最原始的。最好的情况是,对于众所周知的协议,你可以查看应用程序的流量(Wireshark或者tcpdump),使用协议特定的客户端或库来手工请求。如果是自定义的协议,或者如果发送的消息格式不正确,那你就需要写自己的客户端了。

Binproxy会给你一个TCP代理和接口来使用BinDatalibrary编写特定协议分析程序(Ruby),它为消息中的指定领域定义了一种方便的声明性特定领域语言。然后你就可以在一个Web界面上查看和编辑协议消息。

入门

使用BinProxy之前,需要安装Ruby(2.3版本以上),BinProxy在RubyGems(对 Ruby组件进行打包的 Ruby 打包系统)上也是可用的,所以你可以使用以下命令安装:

gem install binproxy

你也可以在github上获取源代码,并按照README文件中的安装说明进行安装。

拦截流量

BinProxy可以作为一个静态上游的简单透明代理、SOCKS或者HTTPS2代理。我们要研究的是一个提供了基于云的“任务列表”的移动应用程序。经过初步调查,我们了解到但登录到这个应用的时候它将通过5555端口连接到server.example.com,然后显示我们的优秀项目。

为了直接应用BinProxy,我们将设备的网络设置在我们控制的DNS上,并且将server.example.com指向我们的电脑。

下一步,在我们的电脑上运行Binproxy:

binproxy $YOUR_PUBLIC_IP 5555 $REAL_SERVER_IP 5555

建议:你可以使用—debug或者—debug-extra选项以显示更多的控制台输出。使用binproxy –help查看帮助。

现在我们就可以捕抓一些流量了!

接着打开浏览器访问http://localhost:4567/,并开始使用客户端设备。我们将在浏览器上看到拦截的流量。

默认情况下,Binproxy将每个TCP数据包当作一个“消息”,并将它显示为一个十六进制转储。

7fbb-tmp

提示:解析和十六进制转储标签基本上是相同的,如果你要写一个解析器,可以使用十六进制转储标签来查看原始消息。逃走的文本标签将粘贴到如irb等程序或者交互式语言shell的字符串上。打印文本类似于原始信息或者你选择的字符串。

编写解析器

我们将展示一个适当的协议例子。在下面我们可以看到,这里有两个消息,一个登录命令和一个列表命令。每个消息都有一个命令字符串(四字节),一个参数计数(一个字节),和一个具有命令参数的零终止字符串列表:

4c 4f 47 49                            | LOGI
02                                     | 2 args
6a 73 6d 69 74 68 31 00                | "jsmith"
68 75 6e 74 65 72 32 00                | "hunter2"

4c 49 53 54                            | LIST
01                                     | 1 arg
64 6f 6e 65 20 3d 20 66 61 6c 73 65 00 | "done = false"

现在让我们让事情变得更容易一些。打开一个文本编辑器,创建demo_protocol.rb文件

require 'bindata'

class DemoProtocol < BinData::Record
  string :command, length: 4
  uint8 :num_args, value: lambda { args.length }
  array :args, type: :stringz, initial_length: :num_args
end

在这里,我们将定义一个简单的BinData类来解析我们上面叙述的三部分内容。在一个真实的世界场景中,你可能需要经过几次迭代的类,因为不能确定消息中的不同字节序列表示的是什么。

现在,使用你的新类重新运行BinProxy:

binproxy -c DemoProtocol \ $YOUR_PUBLIC_IP 5555 $REAL_SERVER_IP 5555

BinProxy将从类名来推断文件名demo_protocol.rb,如果你把它命名为别的东西,添加-C <filename>标志。

产生更多的流量,然后你就可以看到BinProxy解析数据包。

1

“done = false”说法看起来很可疑。比方说,我们在应用一些导航,查看了一些其他的请求,并认为服务器在做一些不安全的SQL结构。

SELECT * FROM todo_items
  WHERE user = ${current_user_id}
  AND ${arg} -- uh oh, raw SQL --

在Binproxy UI中,我们点击“Intercept”复选框(1),并重启客户端。我们现在不想要混乱的登录信息,所有我们点击“Forward”(2),选择列表中的消息,这些内容是可编辑的(3)。

3

我们现在可以添加or 1=1并且点击这个消息。幸运的是,我们现在看到一堆其他人的项目显示在我们的应用程序中做列表。

最后的思考

这个简单的例子将给你一个好建议,当你下一次使用Binproxy分析一个二进制协议的时候。

有关编写解析器的更多信息和示例,查看源代码中的parsers目录,其中包括DNS、HTTP、ZeroMQ、MessagePack以及X11类。虽然目前他们目前还在不同程度的完整性,这些解析类已经使用BinProxy gem打包好;所以你可以在项目中使用它们。

如果你喜欢命令行工具,查看Black Hat Arsenal的另一个发行版本。

*原文  Ryan Koppenhaver MottoIN翻译发布

转载请注明来自MottoIN,未经允许不得转载!MottoIN » BinProxy介绍

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

MottoIN 换一个角度看安全

寻求报道联系我们