首页 > 编程知识 正文

路由器欺骗的原理(IP欺骗攻击原理及如何修改IP)

时间:2023-05-03 09:19:57 阅读:124171 作者:3161

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

1 .最基本的IP欺骗技术有三种。 (1)基本地址变化

IP欺骗包括将计算机伪装为其他计算机的IP地址。 因此,IP欺骗的基本方法是阐明网络配置并更改自己的IP地址。

)2)源路由攻击

源根目录允许包的发送者将包通过的路径写入包中。 这样,入侵者就可以通过特殊路径获取受保护的数据,而不是使用主机的名称。

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

在UNIX系统中,可以在不同主机上的帐户之间建立特殊的信任关系,从而方便计算机之间的交流。 只要攻击者获得了可以信任网络上的哪个计算机,就可以登录到可以信任该IP的任何计算机。 r命令允许您在不输入密码的情况下登录到远程计算机。 例如:

rlogin :远程登录,远程登录;

rsh :远程shell、远程shell;

RCP :远程拷贝,远程拷贝。

但是,这种欺诈方法只能在Unix环境中使用,已经过时了。

2 .比常规TCP/IP会话的过程IP欺骗更高级的APP应用是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=k1 )。 此数据包发送完成,客户端和服务器进入ESTABLISHED状态,第三次握手完成。

3.IP欺骗攻击步骤: (1)首先暂时关闭受信任主机的网络,避免干扰攻击; 攻击者将取代真正受信任的主机,因此必须阻止真正受信任的主机接收有效的网络数据。 否则,它将被公开。 可以使用Dos攻击。

)2)然后连接目标机某端口推测ISN基值(初始号)和增长规律; 通过嗅探器和ARP欺骗,您可以发现目标计算机正在使用的序列号,然后根据序列号机制推测以下SEQ/ACK序列号:

)3)然后将源地址伪装为可信主机,发送带有SYN标志的段请求连接;

)4)然后,等待向目标瘫痪的主机发送SYN ACK分组; 但是,此主机不能接收此包

)5)再次冒充受信任的主机向目标发送ACK。 此时发送的数据段是先前预测的目标的SEQ 1;

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

4 .轻松修改IP地址流程构建套接字,填写地址数据结构,填充结构发送消息,调用sendto发送。

第一个参数是PF_PACKET,因为它自己生成IP标头,自己计算校验和。 对应的地址也使用sockaddr_ll结构。

intsockfd=socket(pf_packet,SOCK_RAW,htons ) eth_p_IP ); 而不是使用

sockfd=socket(af_inet,SOCK_RAW,IPPROTO_IP ) )将该虚拟机发送的源IP变为主机IP,进行伪装

虚拟机IP为。 (这里需要安装VMware虚拟机和kali系统。 详情请参考这篇文章。 请不要下载最新的超详细虚拟机VMware安装注意事项版本2020iso。 安装中有错误。 )

在虚拟机中编译并运行代码。 具体步骤参照kali编译并运行c程序

下图显示数据包已成功发送

选择目标IP地址为115.239.21.112的IP地址。 打开虚拟机上的wireshark捕获包,然后运行程序发送echo请求消息,即可看到包已发送。 且源地址是主机IP

到目前为止,通过简单地修改IP地址并发送请求数据包,可以欺骗目标主机

5 .源代码# includesys/socket.h # includesys/ioctl.h # includenetinet/in.h # includenetinet/IP _ icmp.h # includenetion

(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 SIOCGIFINDEXn"); return 0;}addr_ll.sll_ifindex = ifr.ifr_ifindex; //接口索引if (ioctl(sockfd, SIOCGIFADDR, &ifr) == -1){printf("error ioctl SIOCGIFADDRn"); 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 : %sn", ipSrc); //source ipif (ioctl(sockfd, SIOCGIFHWADDR, &ifr) == -1){printf("error ioctl SIOCGIFHWADDRn"); 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;}

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。