域名拦截一直都是大家头疼的事情.
下面从原理给出拦截方法和绕过方法.
防火墙或者拦截方式也无非下面五种: 1.函数拦截 2.DNS查询信息拦截 3.反向DNS域名服务器信息拦截 4.网络协议封包拦截 5.DNS,IP等查询信息黑名单强制拦截 6.入侵检测式协议分析 7.等等...
绕行方法: 1.直接通过ip地址连接 2.通过其他DNS查询函数获取IP地址 (dnsapi.dll模块的DnsQuery_A函数,Winsock2.0的getaddrinfo函数) 3.路由器DNS服务器查询(利用路由器的DNS缓存来查询) 4.手工构造DNS查询封包(Icmp等模块来直接查询)或者IPv6... 5.cmd.exe,whois.exe,ping.exe等函数来查询 6.通过HTTP,FTP等来读取IP地址(也就是所谓的qq空间,微博,二级域名上线) 7.代理连接(socks4\a,5,http proxy,反向代理,Tor隧道.) 8.利用外部域名服务器查询(比如说提交给web版的whois查询,域名解析服务) 9.等等...
或许还有其他方法,但是可能性和实现难度都过于高,所以可能性不大. 下面来具体解析一下思路
[1].函数拦截: 已知的域名查询信息方法.绝大部分主要是采用ws2_32.dll,wsock32.dll模块gethostbyname函数来获取DNS的IP地址然后通过ip地址进行连接.可以采用1,2,3,4,5,6,7,8的方法来绕行
[2].DNS查询信息拦截: 不管调用什么Api最终都要变成DNS查询包. 于是就可以针对这种包来进行数据查询(DNS查询包是公开的而且无加密) hook还是底层驱动拦截发送的DNS查询信息进行拦截. 可以采用3,4,5,6,7,8方法绕行 3可以绕行是因为查询在路由器上而不是本机所以可以查询,网关拦截似乎就没有办法了
[3].反向DNS域名服务器信息拦截: 由于为了加强上线性能,大部分DNS上线都可以通过封包得出域名解析服务器 比如xxx.3322.org域名是绑定到3322的域名解析服务器上的. 所以当进行连接的时候直接查询这个IP是否被绑定过在3322的域名解析服务器上采用5,6,7,8是可以绕行的
[4].网络协议封包拦截: 这种拦截方式可能是360主要采用的方法.比如对付gh0st等协议. 所以不少人采用修改头部信息和信息结构来绕行. gh0st的协议有着明显的特征,所以很容易找到固定模式, 拦截即可.不过由于开发者的一些技术还是不负责任等行为,导致拦截不够准确.
绕行方法: 1.大家常用的调整包结构(无非就是改改头部特征,改一下结构信息) 2.一劳永逸直接加密即可.(国内使用加密的不多,压缩的倒是不少大部分都是zlib,所以很容易被解包分析,加密算法不用太难,够隐藏特征即可.) 3.如果还觉得怕被识别出密文特征,干脆采用流加密算法-RC4,xxTEA都可以(Bifrost,Flux等远控都是采用RC4,pi 2.20以前是rc4后来用了日本人 的Camellia算法-最初版本.不是后期的强版本,具体看文档)基本上不会从封包中找到固定特征了. 很不幸国内大部分的都是采用第一种绕过的,只能说大部分开发者技术水平确实不如国外开发者. 当然了能绕过即可(不过还是喜欢一劳永逸的方法)
[5].DNS,IP,PORT等查询信息黑名单强制拦截: 既然查询DNS是不可避免的.那干脆就把一些特殊的端口直接封死.不过由于误杀率过高.而且绕行的方法确实也还是存在的. 据测试360似乎是采用了一些这样的方法,所以一些特殊端口还是最好不要使用. 域名尽量不要采用3322等绑定.最好直接采用http,ftp,二级域名等方式上线.代理也是不错的方法. 比如某国的XX墙就是针对上亿网民部署的是这种拦截方式. 绕行办法: 7,8,或者采用IPv6.不过目前IPv6使用量不多而且也很容易封锁. 代理服务器没什么好说的socks4,5这些都是一些远控都具备的. Tor Plugin估计知道的人不多,不过经常翻墙的人应该会知道这个插件,本来主要用于firefox,不过由于无聊的程序员很多所以被开发成通用的了采用Tor的远控不是没有. Aphex的I2K4某些版本是有这个插件的, 大家熟知的Bifrost 1.21也是有Tor插件的(1.2b后就去掉了) 国内用的不多而且速度慢.如果要对国外控制的话最好还是不要采用这类方法.有更有效的方法以后再说.
[6].入侵检测式协议分析: 终于杀软没招了.想不出好的方法,肿么办? 还能记得<<变形金刚>>里面霸天虎入侵的时候,美军找了一帮黑客来帮忙解析协议吧.正常的网络通讯协议包无非那几种,而远控,后门等采用的不是一般的协议. 或者说传输的数据不是我们一般的数据, 如果采用加密的话杀软是没什么好方法分析的,那剩下的最后一招就是协议白名单了, 当出现无法识别,或者不是日常的协议信息的时候就会发出警报. 这样的话就可以预防一些未知的拦截信息. 采用这种拦截方法的防火墙和杀软很少很少,主要应用在服务器上. 大部分也都是配合硬防的.软防也有.
绕行的方法: 也就是伪装成已有协议,比如http ssl,或者各种隧道技术,http隧道,ftp隧道,各种网络工具的隧道技术. 对于这方面的研究其实很多,只是公开的人很少.资料可以从sf.net或者codeproject.com等网站上找到.以前的网络神偷,PcShare,炽天使,无花果的远程控制.采用的是这种
http隧道 有介绍说灰鸽子是,其实只是上线头部采用XML结构,并不是HTTP隧道. 网络神偷的HTTP隧道构造的相当原始.几乎就是一滩xx... PcShare略好,但是由于双工所以产生不少连接.HTTP是短连接,一个基于HTTP的长连接很容易被怀疑. 不过这个事情在HTML5后会有比较大的改善.还是很期待Web Socket的当然了这种方法的坏处就是速度极慢,远没有直接二进制连接速度快, 采用UDP协议也是不错的选择,事实上现在基于RUDP的网络程序很多.在国外以前也有不少采用UDP协议的,不过由于RUDP实现不好所以许多 都昙花一现.
3G,4G的兴起,UDP体现出比TCP更高的效率和数据流量占用. 基于RUDP的很快也会兴盛起来的.
当然了所谓的自定义协议也不是没有,黑洞2005,和许多rootkit都采用过自定义协议. 不过目前来看都需要驱动配合.或者RAW SOCKET,开发有难度.至于如何选择看各位开发者需求. 关于HTTP隧道,RUDP,自定义协议以后再说.这里不做过多说明.
[写在最后] 至于某些人说的P2P协议什么的,这完全不靠谱的行为,而且P2P需要转接服务器,虽然利用BT服务器这样来进行转接打洞也不是不可能,但是难度还是不小的. 而且P2P不是放在任何地方都好,远程控制属于直连,长连接方式,根本不适合P2P.如果P2P服务器被攻击了那不是全完了么? 什么?做成SkyPE那样?好吧洗洗早点睡吧... |