文献阅读
Overbot---A botnet protocol based on Kademlia
这篇文章作者介绍了一种基于Kademlia的新型p2p botnet.发表在08年的SecureComm上(turkey).
这篇文章并非有pingwang的hybird以及army of botnets的Superbots以及p2p botnet overview and casastudy 中的storm那么经典,但是它很有特色。
[ 我之所以说是前面几篇经典,是因为前面几篇的分析和实现可能性较大,但overbot虽然思想很好,但是作者给出的实现机制是在让我有点望而却步,哥们也太复杂了吧,而且有好多问题在我看来是没有得到很好解决的,比如overbot中sensor的个数和位置(这也应该是依赖它依存的协议的),还比如它botmaster控制机制的复杂性如何保障,它的重量级加密算法带来的负载和相关管理体制]
作者对前期P2P botnet的评价:
they do so in a naïve fashion. 因此导致许多存在的botnet实现允许attackers破坏botmaster到botnet中其他节点的信息通道。
在本文中,作者使用attackers来代表所有对botnet进行攻击的人群(一般文章中使用defenders来表示)
overbot特色:
Attacker在即使捕获botnet中的一些节点的前提下:
可以说第一个特色是overbot区别于之前的p2p botnet的重要特点,那么作者又是怎么实现的呢? (提前声明以下,作者用了一种相对来说比较复杂的方式,至于可行性,我想应该是各持己见吧)
进一步说明:
作者在introduction部分进一步说明了this paper的special points:
攻击者即使捕获一些botnet节点也无法识别余下的节点;
Botnet中的行为和合法的p2p 节点的行为无差别;
Botmaster不与botnet节点直接通信
(botnet中的节点不直接获取botmaster的ip并与之通信)。
我的分析:
第一点中,只要每个bot中不包含其他通信bots的ip,这个可以实现;
第二点,这个行为无差别,只能是相对来说,作者过于肯定了;
第三点,这个特征的实现目的很好,但是要知道越美好的东西,它的代价就越大,本文正是如此,作者为此花费了很多口舌来说明,在这样的要求下,如何做到命令的上传下达。显然,这是很困难的。
实现环境:
Bittorrent DHT中。
作者在文中的相关介绍:
Kademlia (可以参考我的blog:http://blog.csdn.net/jo_say/archive/2011/05/09/6405732.aspx)
4个远程调用命令 PING STORE FIND_NODE FIND_VALUE
FIND_NODE: 定位节点 当一个节点希望找到其它节点,它发出一个FIND_NODE命令到k个邻居,并提供所寻找节点的ID作为参数。每一个邻居都会返回距离寻找目的最近的K个邻居节点。原始节点会存储这些新的IDs并继续寻求节点,直到找到或者没有更好的节点被返回。
FIND_VALUE: 类似于FIND_NODE,每个节点返回最近的k个邻居,然而,如果一个节点包含请求的key,那么就会返回跟k相关的数据项而不是节点列表。在原始查询返回后,它会将key存储在离其最近但没有返回value的节点上。
STORE:用在DHT中存储数据,通过使用FIND_NODE,一个节点能得到key value附近的k个节点,然后,它发布STORE请求到所有节点。为了保证存储value的持续性,每个节点每隔一小时重新发布自己存储的value到其最近的k个nodes。
PING: 允许一个节点check另外一个节点是否在线。另外,一个PING replay同样包含各自的node ID。
为了初始化连接到网络,至少需要一个DHT中的IP地址。这个节点能被接近自己的其他节点所查询。典型的clients会包含硬编码的ip地址作为初始连接点。
Kad:一种Kademlia的实现,其中overnet和emule都使用了Kad。很复杂吧,记住:kademlia是基本协议思想,Kad是一种算法实现,overnet和emule是它的软件商用实现。
Khashmir:BT网络使用。几个命令:announce_peer, get_peers
作者认为对Botnet存在的威胁模型:
核心:如何发送相关命令:
【一是:请求->botmaster; 二是:botmaster->下达指示】
***********************************************************************************
一些特点:
- 节点仍会发送requests in regular intervals.
- 每个搜索请求的目标是一个加密文本:通过加密一个序列号+botmaster的公钥 (在外部看来,这样的请求就相当于合法的hash值,然后botmaster能够理解这些请求,解密后,它就能提取出节点的sequence号码,这个序列号被用来botmaster发送命令到bot,上文已经告诉我们,botmaster是不会与bot直接通信的,那么这一过程又是通过什么实现的呢?)
- 每个请求命令中包括两部分:【1】偷偷告知botmaster,说大哥,是我啊,我跟你混了;【2】说大哥,我发这个呢,是问你,你老有什么指示呢?
- 作者列举了三种可能的实现方式:【1】使用Find_NODE和FIND_VALUE函数,这个长160bit的函数,可以被node用作潜入信息;【2】使用STORE命令,但是一些协议严格限制了STORE能够接收到的数据,emule是可以,但bt中只能存储ip地址和端口信息。【3】使用发送者的ID,一个node的节点160bits,一个node可以选择自己的节点,这样一些信息就可以被转移到其他节点。
- 作者使用了第一种请求命令的方式:overnet使用160bits的hash values来转移序列号,另外协议使用node的ID来宣布它的botnet的成员地位。怎么做到的呢?
Node ID and Sequence numbers:
- Node ID:怎么产生的? 一般来讲,一个Node初始化时就会产生自己的Node ID, 在Overbot中,这个ID会通过Botma的公钥加密一个硬编码的字符串来实现。这个字符串被称为:magic value. 同样的字符串会被用到所有的botnet。但是由于overbot使用非确定性的椭圆曲线加密算法来加密这个字符串,因此这个同样的文本会被加密成为不同的密文,保证每一个的NodeID会是不同的。同时,可能的node IDs是非常多的,以至于attacks不能枚举所有可能的加密of the硬编码字符串(这会被用来直截了当的鉴定bots)。如果使用RSA,就需要一个随机的字符串来保证产生不同的node IDs。这个magic value允许botmaster来鉴定node是botnet的一部分(当它收到一个msg包含这个node ID)
- Botnet个体使用序列号,根据这个序列号botmaster可以预测发送到某个节点的未来的搜索请求,并且产生一个发送到某一节点信息所使用的对称密钥。(第一次看到这句的时候,说实话,我心里很不舒服,我以为作者会搞出一个什么开创性的东西,但是这种预测性的多数理论可行,实际使用会有n多问题缠身的东西居然也都出来了,当然,这只是我的一点想法,还是继续看下去吧)。初始部署时,这个序列号是一个随机值,这会保证每一个bot发送不同的搜索请求。之后,这个number会每隔一段时间自动增加,如果达到最大值,会自动清空为0. (这个我也是有很多疑惑的,这么多节点的时间一致性本来就是件很复杂的时间,如果连序列号都依赖这个,而且作者后面会提到,botmaster会根据这种增加序列来预测后来某一时刻的序列号,这?可靠么,botmaster怎么保证和每一个bot都时间同步呢,而且甚至一点也不能差?)
Sending information to the botmaster:
- 发送:为了向botmaster报告,一个肉鸡节点定期(注意奥,是regular intervals)发送搜索DHT keys的请求。这些key是通过使用botmaster的公钥加密当前序列号产生的。Botmaster收到这样的消息后就会知道这个小弟的存在以及其当前的序列号(这个也有问题,要知道,后面作者将会讲到,一个bots的请求要经过好几步才能到达botmaster,有的甚至不一定能到达,这里面的时延怎么考虑,如果时延足够大超过regular intervals,那岂不是序列号也要改变了)
- 接受:注意了:botmaster为了接收到botnets的节点的信息,botmaster将会注入多个 sensor nodes 到DHT中。这些sensor节点会像正常的客户端一样加入到P2P网络中。它们由botmaster直接控制并且存储类似于botmaster私钥的这种敏感数据。作者还解释道:这些节点和bots是不同的,它们不随机,虽然是肉鸡,但是不产生于Botnet相关的流量,因此不能被attacker鉴定为恶意的。(这是我对overbot最大的怀疑所在?尽管作者后面花了很大的篇幅来解释怎么部署sensor和部署多少的问题,但第一它给出的解决方案相当的不靠谱,而且轻描淡写,殊不知道这是它文章的核心所在,如果请求不能有效传递给botmaster,一切都是浮云。)
- 处理:当一个sensor节点接收到前来的搜索请求,它会尝试用私钥解密Node ID,如果解密操作得到magic value,就证明这个节点是botnet的一部分。此时,sensor 会将信息发送者的IP添加到肉鸡列表中。同样,sensor会从bot搜索key中提取出序列号(hash value) 【前文我们已经知道,信息是分为两部分获取的,一个是节点自己的Node ID,一个是搜索key,两个在kademlia中都是160bit】。
- 善后:作者在这里强调,一个肉鸡对sensor位置的不知情是非常重要的。作为一个肉鸡,它会发送不同的搜索key(取决于时间间隔导致序列号的递增),希望运气好的时候能够碰巧让其中一个请求到达sensor节点,作者在这一句之后说:显然,并不是所有的请求都能到达sensor。【作者的这句话,让我产生了绝望的念头,r u kidding? 仅仅是hope就可以么,这是论文么,是论文么,是论文么?】,作者又补充:botmaster要部署足够多的sensor来保障bots请求能够在一个合理的时间段内到达sensor(在section6中讨论),可以告诉大家的是,我已经分析了section6中的内容,作者显然没有提出什么好的方法,要不他一定会在这里炫耀一下的,可惜,他只能蒙混过关了】
Sending commands to botnet nodes:
- 作者又似乎大方的提出了两种解决方案(我有一个预感,我一个都不喜欢):作者认为最佳的实现要依赖DHT实现的特性,eMule中的DHT可以有意存储相近的值。因此botmaster可以存储一个信息到DHT,然后被botnet 节点读取。但由于BT中严格限制了写入DHT的values,因此这样的技术是不可行的。然而,使用基于UDP的DHT协议使out-of-band方法变得可能,通过使用伪造的IPV4源IP来发送命令。(in band:带宽内连接;out-of-band:带宽外连接)。【难道刚才的两种网络的分析就是两种解决方案?】
作者紧接着提出了:消息发送到botnet是通过actuator nodes,【不是吧,刚才为了发给botmaster,都要部署无数个sensor node,怎么又出来个acutator nodes,你让botmaster花多少钱和时间精力啊】。这些节点获取their (这个their是谁啊,是messages么)命令和intend recipients by the botmaster(目标接受者)的网络位置。不同于sensor nodes,actuator节点主动发送请求到网络。因此带来的被检测风险也比较高。(说来说去,还是烂方法啊,我向作者你也估计是没办法圆这个逻辑了,又整了这么个玩意,哎,可怜我认认真真的看你的论文)
In-band Messages: [首先我会按照论文一句一句来谈想法,之后我会加上总结性的分析] 【in-band message方式是以使用emule为前提】
- 论文描述:当一个botmaster从botnet node接受到搜索请求后,它得到了序列号。由于序列号是按照独特的已知的方式递增,因此botmaster是可以计算出任何之后某一时刻的序列号的。(这是我认为最扯淡的想法,你要忙死botmaster啊,我估计botmaster自己都要被DDOS了)。继续:如果一个确定性的公钥算法被应用,那么botmaster可以直接推算出目标ID未来的搜索请求(通过加密各自单独的序列号和botmaster的公钥)。但是如果是非确定性的如椭圆曲线加密算法ECC,这就不行了。为了解决这个问题(我实在不明白,为什么突然扯到了这个问题,你干嘛要预测它什么时候请求呢),botmaster和node都计算它们序列号的SHA-a hash值,这个hash值,是一个确定性的,被作为:meeting point value。(原来你是想搞这个,但是要知道hash值是一动全动的,如果botmaster计算的序列号和node自己当前的序列号有一点点差异,怎么办?我觉得这种差异的可能性是非常大的)。更精确地,对于每一个新的序列号,这个botnet node发送一个额外的搜索请求,使用meeting point value作为key(我又不懂了,这个mpv本来就是序列号的hash值,你这不又是把新的序列号当做搜索条件来查询么,这个时机呢?接受到命令之后,还是?)如果botmaster希望传递一个信息到node,它可以加密这个信息(使用SHA-A作为key),并指示一个actuator node来存储消息到计算的hash value值下。(这个说明了,你要在eMule类似的网络下进行)。一般来讲,这会将命令存储在一个合法的DHT节点中,然后bots将定期通过搜索meeting point value连接到这个客户端,并且下载命令。当然,命令中可以添加校验和,以防,偶然,一些不相干的数据被存储到这个meeting point value.
我的分析:看到最后,经过多次理解,可以看得出来,作者的想法在逻辑上还是行的通的,至于实际是否可行,反正大家都这么浮躁,也不能不让作者浮躁啊。大概是这样的:每个nodes都会定期每隔一段时间,向DHT发送搜索以自己当前序列号(注意是当前,因为会随着时间递增)的SHA-1值为key的FIND_VALUE命令,当时并非所有的都能搜到什么有用的东西?为什么呢,这就相当于一种pull模式,只有主人给你东西了,你才能得到一些,主人没给,你搜也是白搜,那什么时候能够搜索到有效的命令呢?其实在主人那边,它如果希望发送命令了,它会对每一个bot单独计算当前你的序列号,或者后面的某一个时刻的序列号(这个是可以计算出来的,前面讲过我就不说了),然后告诉actuator节点,你把我的命令给存储到这个key值的节点或者其附近的节点上吧。这样bots在后面定期的搜索中由于DHT的机制,它就会在主机发布这个key后,终于得到一点反馈,打开一看,原来是让我赴汤蹈火啊,nnd!这就是命令的发布过程,极其的繁琐,但也不能不说,作者为了写一篇论文,考虑的还是挺多的。(不过要想理解这一段内容,你必须要对kademlia的协议十分清楚)
Out-Of-Band 消息:
- 当使用BT的时候,由于BT的DHT中只能存储IP和端口,因此无法存储命令。之外,即使是存储IP,也需要远程的DHT节点首先接受到一个令牌。因此这里提供了一种通过伪造IPv4地址来存储任意指定的值。
还需要另外的机制:如果botmaster控制了一个host可以用来伪造IP并且那里没有出口过滤,它就可以直接给小兄弟们发命令。为此目的,消息需要包含在一个正常的DHT请求中(为了阻止中间节点和防火墙来鉴定恶意请求),通过使用相同的对称密码体系(和in-band中一致),并通过存储消息到源NodeID,这就允许botmaster使用全部的160bit来传递消息。由于是一个假的IP地址,因此botmaster就不可能被轻易追踪到。
文中所使用的加密
Overbot:结合了公钥和对称密码两种体系。当请求消息,部分消息被botmaster的公钥加密。但是botmaster处理的或者直接发送的命令却是通过对称密码加密,此密码来自于序列号。这就保证了攻击者无法通过查看消息内容来识别botnet节点,
下面我们首先介绍了why使用ECC,之后我们概要描述了从botmaster到肉鸡之间的加密算法。
为什么使用ECC?
- 首先有个需要:加密数据可以被存储在160bit之内,这就需要加密算法产生的数据长度不能超过160bit。首先想到的当然是经典的RSA,但是160bit的密文长度限制了n In the public key(n,e) to a maximum size of 160-bit. 不幸的是,这个160bit的数值可以被一个现代计算机1个小时之内因式分解(really?已经这么夸张了)。通过分解n,攻击者是可以计算出botmaster的私钥的。因此RSA不满足需要。
- 那么就是ECC了。它在提供与RSA同样的安全性的同时,需要更短的key size。通过NSA的报告,一个160bit的ECC可以与1024bit的RSAkey相媲美。直到08年3月,被破解的ECCkey最大的也仅是109bit,通过使用1万台奔腾级PC,连续540天。
作者随之介绍了一个112bit大小(什么大小?我不理解),并能提供56bits安全的曲线算法SECG secp112rl. 如果一个原始文本为40bits,那么密文的最大值为160bits。即使这个key以后可能被破解,但从我们使用的角度来看是足够的了。据SECG组织比较,SECG112rl相当于512bit的RSA,而其在1999年已经被分解。
Encryption messages from sensor nodes?
【我之所以不敢翻译此句,是我又不清楚了,sensor是bot结点告知botmaster时使用的,sensor已经包含了botmaster的私钥,那从sensor 来的加密信息又是什么? 但我可以预知的是,下文讲的肯定不是这个】
- 当botmaster知道节点的当前序列号,他就能够使用这个信息来产生一个对称密钥。这个key可以用来保护传递到botnet nodes的信息。一个可供选择的方法是:通过使用SHA-1求序列号的hash作为一个对称密钥。这样key的长度就和原始文本的长度一致,并且一次一用。这样,密文可以通过将原始文本和这个key通过XOR获得。加密信息需要宝航一个校验和checksum来验证一个节点被指定的key加密。
- 当一个sensor结点试图解密消息,(怎么又变成sensor了),它会尝试通过加密的key来解密消息。(这是哪跟哪儿啊??)这种可能keys的set取决于可以产生序列号递增的时间间隔。Botnet node可以验证成功的加密通过验证包含的checksum。(我无语了,sensor怎么又掺和进来了,作者你不说说要解释从botmaster到肉鸡之间的加密呢,那不就是actuator来搞定么,sensor去解密谁的消息啊?)
- 如果合法的序列号范围非常小,并且botmaster可以知道NodeID,那么将信息放入SHA-1 hash中还是有用的。这会阻止攻击者预计算所有可能的SHA-1值,并且检测前来请求的SHA-1 hash值。(还是搞不懂作者在搞什么)
- SHA-1用来产生对称密钥的输入范围应该注意,SHA-1用来计算meeting point的输入范围不应该重叠。比如:某一种情况下negating the sequence number (我个人理解为 求反. Otherwise, it is trivial for an attacker to decrypt messages sent by the botmaster
我的理解:作者在前文中其实只讲了在botmaster返回信息时使用对称密码,但是从本section来看,作者认为botnet的node开始进行search时,就应该被HASH,然后sensor才会处理这种信息,但这一过程中本来已经使用了公钥密码体系,看来是复合使用过了;后来botmaster发布消息的时候又使用对称密码体系,而且方法都是对序列号hash,作者还补充道,为了防止重复,让其中一个对序列号求反。哎,总算是有点逻辑了,之前看的我云里雾里的。
接受请求的概率
前面在考虑botnet node向botmaster汇报自己的时候,作者引入了sensor,但并没有给出sensor的部署情况等。这里作者试图做出一些努力来解释,我从我之前粗略的浏览来看,好像并没有得到很好的解决。
【这个问题留到以后再谈,先休息了】
攻击和反制策略
- Botnodes和sensor行为的不同可以用来鉴定和区分
- 而且botnet结点行为和合法结点行为的不同也可以用来鉴定,可以用来创建黑名单
结论
之所以分析这篇文章,是因为这片文章虽然我认为很不完善,但正是这种不完善,给了我来完善它的机会,if u know what I mean.