/* Written by Edawrd
* BEng CSE department of CUHK,
* 如有错漏,欢迎批评指出,本人只是本科小菜鸟一个
*/
注:以下内容是基于BIND (Berkeley Internet Name Domain) 域名服务的
最近在学一门cyber security的课,总的来说挺有意思的。
在讲到DNS Cache Poisoning (wiki)的时候,Birthday Attack又被拿出来讲了,多亏教授的课件各种混乱,逼我的不得不自己去各种google,不然也学不到那么多东西。
先简单说一下基本原理
当一名client找到DNS服务器,询问www.example.com的IP地址是啥的时候,如果DNS服务器自己也不清楚www.example.com的IP地址是什么,那么该DNS服务器就会发出DNS Query,问“谁知道www.example.com的IP地址是啥啊?”。如果有人响应,告诉它www.example.com的IP地址是XX.XX.XX.XX,那么它就会把该IP储存起来,那么下一次有别人问它www.example.com的IP地址是什么的时候,它就可以直接告诉对方IP地址是XX.XX.XX.XX
攻击者进行攻击的情景如下:
1. 攻击者发出DNS Query A,询问www.example.com的IP地址
2. DNS服务器收到DNS Query A,并且在本地寻找www.example.com对应的IP地址
3. DNS服务器没有找到对应的IP地址,所以它发出一个DNS Query B, 希望有人告诉它www.example.com的IP地址是什么
4. 攻击者乘机返回DNS Response C,给DNS服务器,告诉它IP地址是IP FAKED
5. DNS服务器收到DNS Response C,如果C的identifier符合B的Identifier的话,将IP地址 IP FAKED 当做www.example.com的IP地址
6. 路人甲发出DNS Query D,询问www.example.com的IP地址
7. DNS服务器收到DNS Query D,一查本地数据库,嘿,哥已经知道www.example.com的IP地址是IP FAKED,
8. DNS服务器返回DNS Response E 给路人甲,告诉他“IP地址是IP FAKED”
9. 路人甲收到DNS Response, 然后去访问IP FAKED ,而路人甲以为自己在访问www.example.com,然而他实际访问的是攻击者指定的IP地址,从而造成可能的损失
可是以上的攻击有一个问题,就是所有的DNS数据包里面都有一个十六位的Identifier,如果攻击者返回的DNS Response C中的Identifier不对(与DNS服务器发出的DNS Query B的Identifier不符),那么DNS服务器则不会接受该DNS Reponse C作为其Query B的回复,那么攻击就失败了。十六位的identifier意味中DNS服务器发出的DNS Query B的identifier一共有2 ^ 16 = 65536种值,并且DNS服务器愿意接受的DNS Response的identifier的值也应该是65536中的一个(注意,并非一定与DNS QueryB的identifier相等)。
所以,一般的做法是,攻击者在DNS服务器发出DNS Query B之后,连续返回N个DNS Response(嵌入不同的identifier的值),以此来提高自己发出DNS Reponse被DNS服务器接受的几率。 很明显,N个NDS Reponse蒙中正确identifier的几率是N / 65536。
人们对这个蒙中的几率不满意啊,于是有人想啊想啊,想出来一种改进的攻击方法,基于Birthday Attack(wiki)。
新方法是这样运作的
1. 攻击者发出N个DNSQuery A,询问www.example.com的IP地址
2. DNS服务器收到N个DNS Query A,并且在本地寻找www.example.com对应的IP地址
3. DNS服务器没有找到对应的IP地址,所以它发出N个DNS Query B[1] - B[N], 希望有人告诉它www.example.com的IP地址是什么
4. 攻击者乘机返回N个DNS Response C[1] - C[N],给DNS服务器,告诉它IP地址是IP FAKED
5. DNS服务器收到N个DNS Response C[1] - C[N],如果其中有某一个与B[1] - B[N]中的某个identifier相符的话,那么将IP地址 IP FAKED 当做www.example.com的IP地址
之后6,7,8与旧方法一样
这样一来,蒙中的几率就相当于在N个Response C中至少有一个符合N个Response B中的identifier的几率。这相当于Birthday Attack的一个变种(传统的Birthday Attack是在同一组中寻找相同的元素,而这里则是在不同的两组中寻找相同的元素),但是其原理是一样的,而且都大大地提高了攻击成功的几率, 大概尝试N = 2^8就能有1/2的几率让攻击成功,旧方法则需要N = 2 ^ 15。(具体几率是多少,请看Reference[1]中的数据)
当然,只要DNS服务器能够检测到DNS Response是否由可信的Agent返回,那么这种攻击方式就无从说起了。另外,如果DNS服务器分别有两个网络接口,一个仅用于提供DNS服务(DNS RESPONSE),另一个仅用于向上级DNS服务器寻求DNS服务,那么攻击者也难以通过自己发出Query同时自己提供Response的方式误导DNS服务器储存错误的IP地址了
Reference:
[1] secureworks - DELL , DNS Spoofing - The next generation
[2] wikipedia, BIND