Linux下的网络监听技术之二
作者:
struct arphdr
{
unsigned short int ar_hrd;
unsigned short int ar_pro;
unsigned char ar_hln;
unsigned char ar_pln;
unsigned short int ar_op;
#if 0
unsigned char _ar_sha[ETH_ALEN];
unsigned char _ar_sip[4];
unsigned char _ar_tha[ETH_ALEN];
unsigned char _ar_tip[4];
#end if
};
这是linux 的arp 协议报头,其中ar_hrd 是硬件地址的格式,ar_pro协议地址的格式,ar_hln是硬件地址的长度,ar_pln时协议地址的长度,ar_op是arp协议的分类0x001是arp echo 0x0002 是 arp reply.接下来的分别是源地址的物理地址,源ip地址,目标地址的物理地址,目标ip地址。
Tcphdr ip协议的tcp协议报头
以下是相应数据结构:
struct tcphdr
{
u_int16_t source;
u_int16_t dest;
u_int32_t seq;
u_int32_t ack_seq;
# if _BYTE_ORDER == _LITTLE _ENDIAN
u_int16_t resl:4;
u_int16_t doff:4;
u_int16_t fin:1;
u_int16_t syn:1;
u_int16_t rst:1;
u_int16_t psh:1;
u_int16_t ack:1;
u_int16_t urg:1;
u_int16_t res2:2;
#elif _BYTE _ORDER == _BIG _ENDIAN
u_int16_t doff:4;
u_int16_t res1:4;
u_int16_t res2:2;
u_int16_t urg:1;
u_int16_t ack:1;
u_int16_t psh:1;
u_int16_t rst:1;
u_int16_t syn:1;
u_int16_t fin:1;
#else
#error "Adjust your defines"
#endif
u_int16_t window;
u_int16_t check;
u_int16_t urg_ptr;
};
这是Linux 下tcp协议的一部分与ip协议相同取BIG,其中source是源端口,dest 是目的端口,seq是s序,ack_seq是a序号,其余的是tcp的连接标志其中包括6个标志:syn表示连接请求,urg 表示紧急信息,fin表示连接结束,ack表示连接应答,psh表示推栈标志,rst表示中断连接。window是表示接受数据窗口大小,check是校验码,urg ptr是紧急指针。
Udphdr 这是udp协议报头
struct udphdr {
u_int16_t source;
u_int16_t dest;
u_int16_t len;
u_int16_t check;
}
这是Linux下ip协议中udp协议的一部分,结构很明显 source 源端口,dest目的端口,len udp 长度,check 是校验码。
Icmphdr 这是ip协议的icmp协议的报头
struct icmphdr
{
u_int8_t type;
u_int8_t code;
u_int16_t checksum;
union
{
struct
{
u_int16_t id;
u_int16_t sequence;
} echo;
u_int32_t gateway;
struct
{
u_int16_t_unused;
u_int16_t mtu;
} frag;
} un;
};这是linux下的ip协议中的icmp的协议,这里面主要的是前两项参数,其中type是icmp协议的类型,而code 则是对type类型的再分析。如:type 0x03 是表示unsearchable,这时code的不同表示了不同的unsearchable :0x00表示网络不可寻,0x01表示主机不可寻,0x02表示协议不可寻,0x03表示端口不可寻,0x05表示源路由失败,0x06网络不可知,0x07主机不可知。
Igmphdr 这是ip协议的igmp协议报头
struct igmphdr
{
_u8 type;
_u8 code;
_u16 csum;
_u32 group;
};
这是Linux下的ip协议中的igmp协议,协议中主要是前面两个属性,Type表示igmp 协议的信息类型,code表示routing code. 然后,将截取的数据帧的地址赋值给定义的结构.由此可根据不同的结构分析数据,得到我们需要的信息.
检测网络监听的方法
网络监听在上述中已经说明了。它是为了系统管理员管理网络,监视网络状态和数据流动而设计的。但是由于它有着截获网络数据的功能所以也是黑客所惯用的伎俩之一。
检测规则的定义
监听是为了得到我们需要的网络信息,然而网络中的信息流量可能很大,例如一个拥有百台计算机的网络其一般监听日志是每分钟以MB计算的,从如此大量的数据中找出我们需要的信息是很不容易的,于是我再程序中添加了检测规则的定义,如此用户就可以自己定义检测的规则从大量的数据中找到需要的数据并对其进行操作。关于定义的包括了我们感兴趣的大部分数据包属性:包括了源地址,目的地址,源ip地址,目的ip地址,源端口,目的端口,协议类型,连接标志,数据包数量,时间限制等。
如我们可定义将源物理地址为172.16.11.148且源端口为25,协议为tcp连接标志为syn的数据存入相关日志文件中,并且在检测中采取链式规则,就是我们可以定义很多的规则而数据将像过流水线一样通过各个规则的检测处理,该功能和现在大多数的入侵检测系统的规则定义相似,有了这种功能使网络监听更具针对性,可以满足不同用户的需要。
一般检测网络监听的方法通过以下来进行:
网络监听实际上是很难被发现的。因为运行监听程序的主机在进监听的过程中只是被动的接收在以太网中传输的信息,它不会跟其它的主机交换信息的,也不能修改在网络中传输的信息包。这就说明了网络监听的检测是比较麻烦的事情。
一般情况下可以通过ps -ef或者ps -aux来检测。但大多实施监听程序的人都会通过修改ps的命令来防止被ps -ef的。
上边提到过。当运行监听程序的时候主机响应一般会受到影响变的会慢,所以也就有人提出来通过响应的速率来判断是否受到监听。如果说当你怀疑网内某太机器正在实施监听程序的话,可以用正确的IP地址和错误的物理地址去ping它,这样正在运行的监听程序就会做出响应的。这是因为正常的机器一般不接收错误的物理地址的ping信息的。但正在进监听的机器就可以接收,要是它的IP stack不再次反向检查的话就会响应的。不过这种方法对很多系统是没效果的,因为它依赖于系统的IP stack。
另一种就是向网上发大量不存在的物理地址的包,而监听程序往往就会将这些包进行处理,这样就会导致机器性能下降,你可以用icmp echo delay来判断和比较它。还可以通过搜索网内所有主机上运行的程序,但这样做其的难度可想而知,因为这样不但是大的工作量,而且还不能完全同时检查所有主机上的进程。可是如果管理员这样做也会有很大的必要性,那就是可以确定是否有一个进程是从管理员机器上启动的。 在Unix中可以通过ps –aun或ps –augx命令产生一个包括所有进程的清单:进程的属主和这些进程占用的处理器时间和内存等。这些以标准表的形式输出在STDOUT上。如果某一个进程正在运行,那么它将会列在这张清单之中。但很多黑客在运行监听程序的时候会毫不客气的把ps或其它运行中的程序修改成Trojan Horse程序,因为他完全可以做到这一点的。如果真是这样那么上述办法就不会有结果的。但这样做在一定程度上还是有所作为的。在Unix和Windows NT上很容易就能得到当前进程的清单了。
还有一种方式,这种方式要靠足够的运气。因为往往黑客所用的监听程序大都是免费在网上得到的,他并非专业监听。所以做为管理员用来搜索监听程序也可以检测。使用Unix可以写这么一个搜索的小工具了。有个叫Ifstatus的运行在Unix下的工具,它可以识别出网络接口是否正处于调试状态下或者是在进听装下。要是网络接口运行这样的模式之下,那么很有可能正在受到监听程序的攻击。Ifstatus一般情况下不会产生任何输出的,当它检测到网络的接口处于监听模式下的时候才回输出。管理员可以将系统的cron参数设置成定期运行Ifstatus,如果有好的cron进程的话可以将它产生的输出用mail发送给正在执行cron任务的人,要实现可以在crontab目录下加****/usr/local/etc/ifstatus一行参数。这样不行的话还可以用一个脚本程序在crontab下00****/usr/local/etc/run-ifstatus。
一般情况下监听只是对用户口令信息比较敏感一点(没有无聊的黑客去监听两台机器间的聊天信息的那是个浪费时间的事情)。所以对用户信息和口令信息进行加密是完全有必要的。防止以明文传输而被监听到。现代网络中,SSH通信协议一直都被沿用,SSH所使用的端口是22,它排除了在不安全信道上通信的信息,被监听的可能性使用到了RAS算法,在授权过程结束后,所有的传输都用IDEA技术加密。但SSH并不就是完全安全的。因此,总的说来,监听的检测属于安全防范的内容,需要非常综合的知识和技能进行分析设计。
安全方面的考虑
DOS 攻击的检测与预防
我国还在网络的发展阶段,自然有网络“hacker”、“crack”出现,也正是由于是发展阶段,这些人的攻击手段一般靠一些工具,这些工具一般分为破解性和破坏性,破解性耗时长成功率低,而破坏性的工具较符合这些人的性格故受欢迎,而DOS攻击工具攻击方便,成功率高,一般是“hacker”的首选。
所谓的DOS攻击是一种拒绝服务攻击,它并不是入侵系统,而只是让系统崩溃,或处于拒绝连接状态,DOS攻击的方法主要是发送大量假的syn包使服务器忙于应答和等待假syn的请求无法对正常的连接作出反应,或发送大量的广播包利用某系系统对一些广播包会产生回应得bug来形成广播风暴阻塞网络,消耗服务器资源达到进攻目的。现在还出现了分布式的DOS攻击工具,它通过控制多台分机同时发送到攻击包,威力巨大,同时,DOS攻击还可能是另一种供给的前奏,这就是IP欺骗攻击(该攻击可以获得ROOT权限,危险系数最高),如果出现了DOS攻击但又不阻塞网络,且攻击目标不起眼,那么这很可能就是一个IP欺或TCP截取的开始,所以DOS攻击是一种破坏力大,效果明显,且暗藏杀机的攻击。
热而DOS攻击是较容易检测的,其攻击现象明显,攻击特征突出,通过对网络的监听不难发现,如上所述我们已经可以从网络上监听数据帧并能分析他们,于是编写一个程序使用户可以通过定义自己的规范与数据帧比较然后对符合规范的数据作出相应的反应,对于DOS攻击我们可以通过定义一个带有时间限制的规范来检测,如我们可以定义在1秒如出现100个以上的syn数据包为DOS攻击,然后定义处理方法,如MAIL,LOG,SHUTDOWN或与_blank">防火墙联动等。
IP冒用的检测与攻击
网络的飞速发展导致了原有的32位地址协议不能满足飞速扩充的庞大计算机群,。利益不能均分,导致了IP冒用的出现,使网络秩序产生混乱。
在这里先解释一下ARP协议的应用。ARP协议是将IP地址转换成MAC地址的协议,是局域网数据交流的基础,一台计算机是如何将自己和某一IP地址绑定?首先,一台计算机启动,他将向局域网发送其IP的ARP询问包,这是为了防止IP冲突,如无人回答,其将发送其IP的ARP应答包,向局域网申明绑定其物理地址和ip地址,如果没有在服务器上使用固定的ip/mac表那么没有ip使用权的计算机也可以乘机绑定ip,这就是ip冒用。
对网络监测的利用可以达到检测ip冒用的出现并对之进行攻击的目的。具体方法是将检测到的arp数据帧中的ip 和 eth 地址取出来与我们建立的对应表比较,如发现ip冒用的情况,则向其发送反向arp包使其网络中断实现攻击,该做法适用于那些无法控制路由器配置,又不想修改网关配置的网络管理。在程序中我采用的是被动式的arp查询,也就是不发arp查询包,可以说出了发攻击包外对网络没有增加另外的负担。 监听技术在网络测试中的应用
网络监听不只是网络管理的基础,还能应用在网络测试中,现在的网络测试工具大都建立在监听基础上,对监听到的数据帧的种类和数量进行统计,从而实现网络的测试。同理可以使用本监听程序对数据分类统计达到测试网络的作用。
例如目前较多用到的网络测试:
1)检测广播包在网络中的负载,即检测广播包在所有包中的比例,只要在程序中比较数据帧中目的地址的物理地址为ff:ff:ff:ff:ff:ff与总帧数的比例就可得知。从而给出了配置VLAN等的数据基础。
2)检测网络中因冲突产生的坏数据帧的数量,因为共享式以太网采取的CSMA/CD协议,每台计算机发送信号时不能保证没有有其它计算机也在发送信号,而在发现冲突后就停止发送,故会产生一些损坏的数据帧,检测损坏的数据帧在网络数据中的比例是体现网络性能的重要参数,这种检测对于监听程序而言和第一种检测大体相同,只是把统计的数据包改成冲突的数据帧,也就是数据帧大小小于64个字节的数据帧的数量,同理类是网络测试都可以通过监听程序实现,由此我们可以分析出更合适具体情况的布线方法等等。
垃圾邮件过滤的初步实现
垃圾邮件就是过滤到那些我们不想接受的,内容不安全的电子邮件,由于电子邮件的服务特点,使得电子邮件成为当代社会信息传递的便捷途径之一,但同时也有一些人利用这一点发送不安全的危害社会的宣传,于是垃圾邮件过滤就成为了必要,由于当前邮件服务器管理的松懈,随便一个人有台计算机有个IP就可以组建服务器,使得邮件的来源相当复杂,所以要完全过滤不容易,但我们还是可以通过网络监听来实现邮件的初步过滤.
第一种方法:就是屏蔽某些ip的swtp连接,通过监听程序可以实现这点,如设定规则当源IP地址为****且TCP连接端口为25时就屏蔽连接。
第二种方法:由于很多电子邮件服务器允许邮件转发(这也是必要的,我们不可能能连接到每一台机),所以通过ip地址不一定可以屏蔽这个用户的邮件他可以通过其他的服务器转发,因此在第一种方法无效的情况下我们可以通过账号来屏蔽服务,由于电子邮件服务器的统一命令要求需要用户在发邮件时申明用户例如:mail from XXX@XXX ,所以我们可以通过监听程序来发现我们不喜欢的用户并屏蔽,这要求我们对数据帧不仅分析报头,还要分析数据,将其与我们设定的字符串比较,如相同,则找到了屏蔽连接.