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协议的简单介绍,下一部分我会从代码的角度进一步分析该协议,并适当对于协议功能进行添加。