蜜罐中常用协议——HPFEEDS协议


hpfeeds是一个轻量级的验证发布-订阅协议(authenticated publish-subscribe protocol)。

0x00 hpfeeds协议是什么?

轻量级好理解,就是代码量相对较少,功能相对不复杂。那什么是发布-订阅协议呢?订阅发布协议定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。它是为了解决这样一种情况的发生,一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象需要改变。我的理解,这就类似于发传单,目标发送通知,没有指定特定的对象,通知会自动传播,观察者自己决定是否需要看传单,发送者对于传单是否被看一无所知。

详细的发布订阅者介绍可以戳这里:

https://msdn.microsoft.com/en-us/library/ff649664.aspx

线路协议组成如下:

首先是消息头:有两个参数,消息总长和消息类型

消息类型有以下几种:

error (0): errormessage
info (1): server name, nonce
auth (2): client id, sha1(nonce+authkey)
publish (3): client id, channelname, payload
subscribe (4): client id, channelname

数字代表消息类型,而冒号后面的内容则代表后续的消息字段

比如说当消息类型为3,publish时,后面的字段就会有四个:

client id的长度
client id
channelname的长度
channelname
payload

一个完整的消息如下:

length | opcode | next | identifier | next | channelname|payload
----------------------------------------------------------------
85       3        9       b4aa2@hp1   9      mwcapture      137941a3d8589f6728924c08561070bceb5d72b8,http://1.2.3.4/calc.exe

消息有了,整个消息的认证过程就是以下的几个步骤:
-

  • 服务器为每一个连接生成一个标志
  • 客户端发送id 和 标志+authkey组成的sha1
  • 服务器检查id和sha1
  • 服务器检查数据类型,是要发布还是要订阅

最终实现服务器、发布者、订阅者之间的解耦,彼此之间完全独立,互不干扰。

0x01 为什么要用hpfeeds协议

首先,正如以上所说的,整个协议实现了三方的功能独立。使用这种方式降低了应用与业务逻辑之间的耦合,统一一个对外的发布接口,只需要关心监听的类型,不关心监听的具体处理人。只管发,不管到不到。很方便的建立一种一对多的依赖关系。

在当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象需要改变时,就可以使用订阅发布模式。

hpfeeds协议希望能够实现一个单一的连线形式,使得每一个人都可以在任何时间以任何语言去订阅发布数据,不同的数据以通道来划分,由通道的使用者来决定数据结构形式。而通道的验证通过authkey来完成,它由两部分组成,ident和secret,相当于身份和密码。密码在hash后和每一个临时连接标志一起发送给服务器,这样保证不会被窃听,所以它可以运行在SSL、TLS下。

优点

  • 1.降低耦合。发布者对于接收者的数量,身份,接收的数据类型一无所知。
  • 2.安全性高。只有消息订阅者之间的单线信息交互,不存在其他程序的信息交换。
  • 3.测试方便。

缺点

性能降低,订阅要进行管理

0x02 如何操作

正常安装使用hpfeeds的步骤如下:

git clone https://github.com/rep/hpfeeds/
cd hpfeeds
python setup.py build
python setup.py install

安装成功后,会出现下面几个文件夹。

  • appsuport:hpfeeds支持的一些蜜罐的应用程序
  • broker:服务器功能程序集,包括增加用户,服务器运行,查看所有用户信息等
  • build:一些编译环境
  • cli:用户程序
  • example:例程
  • lib:支持库

使用时先打开broker,运行其中的add_user.py添加用户信息:

根据提示信息,我们添加用户test,密码123456,拥有发布频道1,2,无订阅频道

再添加用户custom,密码123456,拥有订阅频道1,2,无发布频道

现在使用dump_users.py查看刚才创建的用户

如图所示,这里应经可以查看到刚才我们新建的用户了。

接下来,我们打开服务器feedbroker.py

再开启一个新的进程运行cli文件夹里的用户程序hpfeeds-client

先开启订阅者custom,使用1频道

此时,服务器端显示用户登录成功

我们再打开一个新的进程,以发布者test,使用1频道发布“helloworld”

我们可以看到发布者一旦发布完消息后,立即退出进程,并不确认消息是否收到

这时,服务器显示test登录成功

于此同时,订阅者custom成功接收到消息

到此,一次完整的发送、接收消息的流程就走完了。

通过这一过程,我们发现,频道与用户分离,发送和订阅者身份平等,只需订阅者实时监听,发送者可以即时发送即时撤出。

这里是对于hpfeeds协议的简单介绍,下一部分我会从代码的角度进一步分析该协议,并适当对于协议功能进行添加。