星期二, 三月 17, 2015

利用iptables禁用QQ号码

最开始禁用QQ是用iptables的七层补丁,但那个是针对源ip去禁用QQ的特征码,现在我们要做的是想针对QQ号做处理。另外,之前认为QQ是用udp连接服务器的8000端口,然后试着把udp的8000端口禁用,发现和我们游戏一样,发现这个端口不通,会去用另外的备用端口,比如tcp的80和443之类的端口,所以通过禁用端口这是行不通的,而且服务器地址不定。

注意到iptables有个-m string –hex-string 这个匹配方式,有个string模块,有个抓数据包,然后做drop处理的方式,下面就去抓包。
工具:SmartSniff
QQ号码:858276842
电脑ip:192.168.3.7
网关:linux iptables nat环境
思路:QQ号码需要通信,先得到QQ号码的十六进制。
echo "obase=16; 858276842" | bc  (关于linux通过echo对16进制的转换参见:http://www.cyberciti.biz/faq/linux-unix-convert-hex-to-decimal-number/)
得到QQ号码的十六进制332843EA。
下面抓包的时候多注意到33 28 43 EA 这种字符。


第一个框是QQ号,第二个和第三个是经过多次登陆,和登陆不同QQ号得到的“特征码”
每次登陆都需要有这个字符,所以试着匹配这个字符,然后drop。看看效果,
另外有个差异的就是QQ2011的Q+版本特征码不一样,看下面的截图65变成了64
针对QQ2011 Q+版本
iptables -I RH-Firewall-1-INPUT -s 192.168.3.7/32 -m string –hex-string “|0000010101000064|” –algo bm -j DROP
QQ2012的时候匹配的是0000010101000065,会出现已经登陆的QQ不会掉线的情况,但是会出现重复收到好友发送过来的消息,可能是因为收到消息之后无法通知服务器已经收到,所以服务器重复发送好友的消息过来,但是下线之后会无法上线。
当匹配的是00010101000065,前面少匹配一个00,已经登陆的QQ发现会出现无法发送消息的情况。
iptables -I RH-Firewall-1-INPUT -s 192.168.3.7/32 -m string –hex-string “|0000010101000065|” –algo bm -j DROP
开白名单的时候只需要匹配到那个QQ号,然后ACCEPT处理就可以了,比如858276842这个QQ号码,可以抓包得到是33 28 43 ea,也可以通过计算得到,为了减小误差,后面可以多匹配0200这个后缀。
iptables -I RH-Firewall-1-INPUT -s 192.168.3.7/32 -m string –hex-string “|332843ea0200|” –algo bm -j ACCEPT
经测试百发百中。
echo “obase=16; 858276842″ | bc这样可以得到QQ号码的16进制。当然也有例外的情况,当十六进制前面有个0的时候,系统默认会把0去掉,我们可以做个特殊处理,当是奇数的时候前面自动加0,用的是awk
echo “obase=16;396162545″|bc | awk -F “” ‘{if(NF%2==”0″) {print $0} else {print “0″$0 }}’
另外可以通过抓包得到哪个ip在登陆哪个QQ号,具体操作方法是在网关上面抓包。
tcpdump -nn -i eth1 -X ‘host 192.168.3.7′
可以加个参数 –w file,把结果写到文件里面去,好做分析,之后用同样的方法-r读取这个文件就可以了,在文件里面把十六进制的空格去掉,用sed ‘s/ //g’就可以了,然后去搜索特征码0200,前面的那几位就是QQ号码的十六进制了,十六进制转换十进制可以用shell的echo命令巧妙地实现:
echo $((16#179CF5F1))
得到QQ:396162545
所以最终的实行方法是
#允许的QQ先ACCEPT放行,
iptables -I RH-Firewall-1-INPUT -m string –hex-string “|332843ea0200|” –algo bm -j ACCEPT
#拒绝所有QQ2012和Q+的登陆
iptables -I RH-Firewall-1-INPUT -m string –hex-string “|0000010101000065|” –algo bm -j DROP
iptables -I RH-Firewall-1-INPUT -m string –hex-string “|0000010101000064|” –algo bm -j DROP
附做测试时候保存的QQ数据包:

这个是Q+的。
已经做大范围验证~ ~

转自:http://my.oschina.net/liujen/blog/78446