中易网

如何检测Sniffer

答案:2  悬赏:60  
解决时间 2021-02-27 21:46
如何检测Sniffer
最佳答案
正常情况下,就是说不在混乱模式,网卡检测是不是广播地址
要比较看收到的目的以太网址是否等于ff.ff.ff.ff.ff.ff
是则认为是广播地址。
   在混乱模式时,网卡检测是不是广播地址只看收到包的目的以太
网址的第一个八位组值,是0xff则认为是广播地址。
利用这点细微差别就可以检测出Sniffer.
Linux
   以前就提出过,一些版本内核有这种问题:
   当混杂模式时,每个包都被传到了操作系统内核以处理。
在处理某些包,只看IP地址而不看以太网头中的源物理地址。
所以:
   使用一个不存在的目的MAC,正确的目的IP,受影响
的内核将会由于是混杂模式而处理它,并将之交给相应系统
堆栈处理。从而实现检测Sniffer
   总之,只要发一个以太网头中目的地址是ff.00.00.00.00.00
的ARP包(l0pht公司是ff.ff.ff.ff.ff.00)就可以检测出Linux和
Windows网卡处于混乱状态的计算机.
   以下是一个Linux下用于检测Linux下Sniffer的程序,很多地方都贴
过了,我只改了一句话,这样也可以检测出Windows机器。:)


#include
#include
#include
#include
#include
#include
#define ETH_P_ARP 0x0806
#define MAX_PACK_LEN 2000
#define ETHER_HEADER_LEN 14
#define ARPREQUEST 1
#define ARPREPLY 2
#define perr(s) fprintf(stderr,s)
struct arp_struct
{
u_char dst_mac;
u_char src_mac;
u_short pkt_type;
u_short hw_type;
u_short pro_type;
u_char hw_len;
u_char pro_len;
u_short arp_op;
u_char sender_eth;
u_char sender_ip;
u_char target_eth;
u_char target_ip;
};
union
{
u_char full_packet[MAX_PACK_LEN];
struct arp_struct arp_pkt;
}
a;
#define full_packet a.full_packet
#define arp_pkt a.arp_pkt
char *
inetaddr ( u_int32_t ip )
{
struct in_addr in;
in.s_addr = ip;
return inet_ntoa(in);
}
char *
hwaddr (u_char * s)
{
static char buf[30];
sprintf (buf, "%02X:%02X:%02X:%02X:%02X:%02X", s[0], s, s, s,
s, s);
return buf;
}
void
main (int argc, char **argv)
{
int rec;
int len, from_len, rsflags;
struct ifreq if_data;
struct sockaddr from;
u_int8_t myMAC;
u_int32_t myIP, myNETMASK, myBROADCAST, ip, dip, sip;
if (getuid () != 0)
{
perr ("You must be root to run this program!\\n");
exit (0);
}
if (argc != 2)
{
fprintf(stderr,"Usage: %s eth0\\n", argv[0]);
exit (0);
}
if ((rec = socket (AF_INET, SOCK_PACKET, htons (ETH_P_ARP))) < 0)
{
perror("socket");
exit (0);
}
printf ("----------------------------------------------------------\\n");
strcpy (if_data.ifr_name, argv);
if (ioctl (rec, SIOCGIFHWADDR, &if_data) < 0) {
perr ("can't get HW addres of my interface!\\n");
exit(1);
}
memcpy (myMAC, if_data.ifr_hwaddr.sa_data, 6);
printf ("> My HW Addr: %s\\n", hwaddr (myMAC));
if (ioctl (rec, SIOCGIFADDR, &if_data) < 0) {
perr ("can't get IP addres of my interface!\\n");
exit(1);
}
memcpy ((void *) &ip, (void *) &if_data.ifr_addr.sa_data + 2, 4);
myIP = ntohl (ip);
printf ("> My IP Addr: %s\\n", inetaddr(ip));
if (ioctl (rec, SIOCGIFNETMASK, &if_data) < 0)
perr ("can't get NETMASK addres of my interface!\\n");
memcpy ((void *) &ip, (void *) &if_data.ifr_netmask.sa_data + 2, 4);
myNETMASK = ntohl (ip);
printf ("> My NETMASK: %s\\n", inetaddr(ip));
if (ioctl (rec, SIOCGIFBRDADDR, &if_data) < 0)
perr ("can't get BROADCAST addres of my interface!\\n");
memcpy ((void *) &ip, (void *) &if_data.ifr_broadaddr.sa_data + 2, 4);
myBROADCAST = ntohl (ip);
printf ("> My BROADCAST: %s\\n", inetaddr(ip));
if ((rsflags = fcntl (rec, F_GETFL)) == -1)
{
perror ("fcntl F_GETFL");
exit (1);
}
if (fcntl (rec, F_SETFL, rsflags | O_NONBLOCK) == -1)
{
perror ("fcntl F_SETFL");
exit (1);
}
printf ("----------------------------------------------------------\\n");
printf ("> Scanning ....\\n");
for (dip = (myIP & myNETMASK) + 1; dip < myBROADCAST; dip++)
{
bzero(full_packet, MAX_PACK_LEN);
memcpy (arp_pkt.dst_mac, "\\255\\255\\255\\255\\255\\0", 6);

memcpy (arp_pkt.src_mac, myMAC, 6);
arp_pkt.pkt_type = htons( ETH_P_ARP );
arp_pkt.hw_type = htons( 0x0001 );
arp_pkt.hw_len = 6;
arp_pkt.pro_type = htons( 0x0800 );
arp_pkt.pro_len = 4;
arp_pkt.arp_op = htons (ARPREQUEST);
memcpy (arp_pkt.sender_eth, myMAC, 6);
ip = htonl (myIP);
memcpy (arp_pkt.sender_ip, &ip, 4);
memcpy (arp_pkt.target_eth, "\\0\\0\\0\\0\\0\\0", 6);
ip = htonl (dip);
memcpy (arp_pkt.target_ip, &ip, 4);
strcpy(from.sa_data, argv);
from.sa_family = 1;
if( sendto (rec, full_packet, sizeof (struct arp_struct), 0, &from,
sizeof(from)) < 0)
perror ("sendto");
usleep (50);
len = recvfrom (rec, full_packet, MAX_PACK_LEN, 0, &from, &from_len);
if (len <= ETHER_HEADER_LEN)
continue;
memcpy (&ip, arp_pkt.target_ip, 4);
memcpy (&sip, arp_pkt.sender_ip, 4);
if (ntohs (arp_pkt.arp_op) == ARPREPLY
&& ntohl (ip) == myIP
&& ( dip - ntohl(sip) >= 0 )
&& ( dip - ntohl(sip) <= 2 ) )
{
printf ("*> Host %s, %s **** Promiscuous mode detected !!!\n",
inetaddr (sip),
hwaddr (arp_pkt.sender_eth));
}
}
printf ("> End.\\n");
exit (0);
}

Sniffer Scaner

   Ace Studio , 1999. ([email protected])

运行环境:Win95/98,无需Winsock

本程序可以检测出本网络内正在运行Sniffer的计算机,或者说
网卡处于混乱状态。对方的操作系统可以是Win95/98/NT,Linux。

   Sniffer一般只能监听连到同一集线器上计算机(这主要看网络的
拓扑结构),但检测Sniffer可没这种限制,只要与对方通讯可以不过
路由。只要符合此条件其他网络中的Sniffer也可以查出。

   一般不必配置,程序会自动检测网络配置。一旦扫描发现有人窃
听,会提示对方的IP, MAC,并会记录到日志(Antilog.txt)中。

注:有时候会误报。一般是某些网卡驱动本身的问题

可以在以下位置下载
替换202.115.16.8/~skyfly/net/anti.zip
替换www2.neiep.edu.cn/ace/net/anti.zip

每台主机进入LAN时会向整个子网发送免费ARP通知报文,即该request包是
利用广播方式请求解析自己的IP地址,但源和目标IP已经就位了。
免费ARP(源IP和目标IP一致)请求意味着一个包就影响了整个子网,
如果一个错误的免费ARP请求出现,整个子网都被搅乱了。

即使主机不发送免费ARP报文,也会因为后续的request请求导致自己的IP-MAC
对进入LAN上所有主机的ARP Cache中,所以冲突与否与免费ARP包没有必然
联系。这个结论可以这样理解,一台Linux主机与pwin98争夺IP地址,Linux
主机将争夺成功,pwin98却一直在报告IP冲突,显然后面所有的IP冲突
全部回答

您好!您可以安装科来网络分析系统技术交流版6.9 r2,或者最新的2009版(内部版本7.0,目前尚未正式对外公开)

提供了对win7和2008r2系统的完全支持。

我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
今天刚来的烟台,烟台大学附近有什么好玩的
辽宁亿鑫汽车贸易有限公司地址有知道的么?有
春天到了,种子开始长叶、生根、发芽。(修改
为什么我手机在接电话,或者打电话的时候,每
嘉陵摩托互助专卖这个地址在什么地方,我要处
流量月节日为02日是什么意思
那能听上兰州kee慢摇吧的歌曲
非英语专业的社会人员如何报考catti
尔贡包茅不入,王祭不共的"共"同"供".
百合都有哪些颜色?
中国联通鲍店营业厅地址在什么地方,想过去办
制造飞机的材料
金立s5.5桌面上的通话记录图标没有了在哪找到
建筑工程挖土方计算放坡系数怎么计算公式
通化到哈尔滨的客车在哈尔滨什么地方停啊,我
推荐资讯
加勒比海盗威尔特纳和杰克是不是有什麼关系?
高低压电器开关柜
韩国的首都为什么要改成首尔?
钱王陵园西侧停车场我想知道这个在什么地方
建行信用卡预存款可否提现
美声古筝的厂家在哪里?这款适合北方吗,音色
南阳路大砂锅地址有知道的么?有点事想过去
衣服上沾了101怎么去除
泰拳警告到底是什么梗 什么来源
太子杰在哪里啊,我有事要去这个地方
安徽省太和县福寿安寿衣专卖总代理地址在什么
桥头鲁在哪里啊,我有事要去这个地方
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?