环境:攻击机Ubuntu 18 ,受攻击机Windows7
一、使用netwox体会实验效果,netwox发出的ICMP重定向包的目的IP是受害者的IP,也即,netwox先抓到受害者的数据包,根据捕获包的IP地址,再构造攻击包。
1.Ubuntu安装netwox
sudo apt-get install netwox
2.用netwox做重定向攻击
netwox 86 -g 新的网关地址 -i 目标机当前使用的网关地址
3.在目标机上安装wireshark程序(参考网上),执行ping命令,并启动wireshark抓包,观察虚拟机1 (攻击者)的netwox程序发出的数据包。
二、pcap简单介绍与应用
2.1 pcap简介
pcap是一个抓包库,这个抓包库给抓包系统提供了一个高层次的接口。所有网络上的数据包,甚至是那些发送给其他主机的,通过这种机制,都是可以捕获的。它也支持把捕获的数据包保存为本地文件和从本地文件读取信息。而使用pcap需要以下的流程:
-
确认嗅探的接口,如Linux中的eth0;
-
初始化pcap,告诉pcap需要嗅探的接口。使用文件句柄来命名区分不同的对话;
-
创建自己的规则集,保存在字符串中,“编译“并应用它;
-
规定循环方式并定义回调函数,回调函数在抓到满足我们的规则集的数据报时执行;
-
结束会话
接下来我们按照这个步骤一步一步来设置一个简单的pcap程序:
2.2 写一个简单的pcap程序
2.2.1 嗅探接口
#include <stdio.h>
#include <pcap.h>//pcap.h
int main()
{
char *device;//存储pcap_lookupdev自动寻找到的可用interface
char err[PCAP_ERRBUF_SIZE];//用于记录pcap_lookupdev的错误信息
device = pcap_lookupdev(errbuf);//寻找第一个可用的网络interface
if (device == NULL) {
fprintf(stderr, "Can't find valid interface: %s\n", err);
return(2);
}
printf("Valid Interface: %s\n", device);
return(0);
}
尝试运行一下
gcc pcap1.c -o pcap
这里可能会报错找不到pcap.h这个头文件,说明运行机器上未安装libpcap库。
安装GNU M4这个是编译flex必备的环境,否则会提示“GNU M4is required”的错误。直接在终端执行
sudo apt-get install m4
安装flex直接在终端执行
sudo apt-get install flex
安装bison直接在终端执行
sudo apt-get install bison
5.安装libpcap上面四步完成后,首先去官网下载libpcap的压缩包,tar -zxvf libpcap-1.9.1.tar.gz
解压后,通过终端进入存放该libpcap到文件路径,就可以使用下面三个指令安装libpcap环境。
./configure
make
sudo make install
第三步建议以sudo到身份执行该命令,否则可能因为权限原因而无法正确执行。完成以上步骤后,libpcap即安装成功。
再次编译,此时加上 -lpcap,告诉gcc要去找pcap的库,但是还是报错,原因是安装libpcap时,.so文件没有在gcc寻找库的默认文件夹下
/usr/local/lib$ sudo cp libpcap.so.1 /usr/lib
到/usr/local/lib
下,将库文件libpcap.so.1
复制到/usr/lib
即可
此时再次编译
gcc pcap1.c -o pcap1 -lpcap
./pcap1
运行结果:The Valid Interface is: ens33
en33正式本实验机的接口名称。
2.2.2 打开设备嗅探
#include <pcap.h>
...
pcap_t *handle;//pcap_t结构体,用于接收pcap_open_live返回的句柄
handle = pcap_open_live(device, BUFSIZ, 1, 1000, err);
if (handle == NULL) {
fprintf(stderr, "Couldn't open device %s: %s\n", dev, err);
return(2);
}
pcap_open_live(device, BUFSIZ, 1, 1000, err);
:用于获取一个数据包捕获的描述符,以便用来查看网络上的数据包。
device:上文的pcap_lookupdev
获得的可用接口;
BUFSIZ:从次device获取流量的缓冲区大小;
1:是否开启混杂模式(是否接收与本机无关的流量);
1000:设置的超时时间(毫秒);
err:存储该函数的错误信息
gcc pcap2.c -o pcap2 -lpcap
sudo ./pcap2.c
执行此函数的时候要sudo
,因为要获得接口的流量,需要管理员权限。
2.2.3 定义规则集
对流量进行过滤需要使用pcap_compile()和pcap_setfilter(),前者给指定的数据包捕获描述符设定过滤规则,后者运行这个过滤规则。
int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)
可以看到编译函数共有五个参数,他们分别是:
-
pcap句柄
-
存储过滤器的编译版本的位置的引用
-
规则集,规则集很灵活,pcap规则集
-
是否优化表达式
-
指定过滤器适用的网络的网络掩码,可以直接写0
int pcap_setfilter(pcap_t *p, struct bpf_program *fp)
-
pcap句柄
-
存储过滤器的编译版本的位置的引用
简单举个例子:
#include <pcap.h>
...
pcap_t *handle; /* Session handle */
char dev[] = "rl0"; /* Device to sniff on */
char errbuf[PCAP_ERRBUF_SIZE]; /* Error string */
struct bpf_program fp; /* The compiled filter expression */
char filter_exp[] = "port 23"; /* The filter expression ,目标端口23*/
bpf_u_int32 mask; /* The netmask of our sniffing device */
bpf_u_int32 net; /* The IP of our sniffing device */
//调用函数自动寻找网络掩码
if (pcap_lookupnet(dev,