路由器欺骗(原始套接字五)

Windows系统保持着一张已知的路由器列表,我们可以使用route PRINT命令显示路由表,下面是笔者的电脑运行route PRINT命令后的结果:


  列表中到达某目的节点的第一项Gateway为默认路由器,如果默认路由器关闭,则位于列表第二项的路由器成为缺省路由器。缺省路由向发送者报告另一条到特定主机的更短路由,就是ICMP重定向。攻击者可利用ICMP重定向报文破坏路由,并伪装成路由器截获所有到某些目标网络或全部目标网络的IP数据包,进行窃听。

  显然,前文中我们只是讲解了发送ICMP Ping命令,可以编写更加通用的函数以便发送各种类型的ICMP报文。下面给出了美国北卡罗莱纳大学(University of North Carolina)计算机系的开放源代码的发送各类ICMP报文的程序:

// icmp:发送各类ICMP报文
icmp(type, code, dst, pa1, pa2) short type, code;
IPaddr dst;
char *pa1, *pa2;
{
 struct ep *pep;
 struct ip *pip;
 struct icmp *pic;
 Bool isresp, iserr;
 IPaddr src;
 int i, datalen; 
 IcmpOutMsgs++;

 pep = icsetbuf(type, pa1, &isresp, &iserr);
 if (pep == 0)
 {
  IcmpOutErrors++;
  return SYSERR;
 }
 pip = (struct ip*)pep->ep_data;
 pic = (struct icmp*)pip->ip_data;

 datalen = IC_HLEN;

 /* we fill in the source here, so routing won‘t break it */

 if (isresp)
 {
  if (iserr)
  {
   if (!icerrok(pep))
   {
    freebuf(pep);
    return OK;
   } blkcopy(pic->ic_data, pip, IP_HLEN(pip) + 8);
   datalen += IP_HLEN(pip) + 8;
  }
  icsetsrc(pip);
 }
 else
  pip->ip_src = ip_anyaddr;
  pip->ip_dst = dst;

  pic->ic_type = (char)type;
  pic->ic_code = (char)code;
  if (!isresp)
  {
   if (type == ICT_ECHORQ)
    pic->ic_seq = (int)pa1;
   else
    pic->ic_seq = 0;
    pic->ic_id = getpid();
  }
  datalen += icsetdata(type, pip, pa2);

  pic->ic_cksum = 0;
  pic->ic_cksum = cksum(pic, datalen);

  ipsend(dst, pep, datalen, IPT_ICMP, IPP_INCTL, IP_TTL);
  return OK;
 }
 // icsetdata:根据报文类型填充相应的数据
 int icsetdata(type, pip, pa2)
 int type;
 struct ip *pip;
 char *pa2;
 {
  struct icmp *pic = (struct icmp *)pip->ip_data;
  int i, len;
 
  switch (type) {
   case ICT_ECHORP:
    len = pip->ip_len - IP_HLEN(pip) - IC_HLEN;
    if (isodd(len))
     pic->ic_data[len] = 0; /* so cksum works */
    return len;
   case ICT_DESTUR:
   case ICT_SRCQ:
   case ICT_TIMEX:
    pic->ic_mbz = 0; /* must be 0 */
    break;
   case ICT_REDIRECT:
    pic->ic_gw = (IPaddr)pa2;
    break;
   case ICT_PARAMP:
    pic->ic_ptr = (char) pa2;
    for (i=0; i<IC_PADLEN; ++i)
     pic->ic_pad[i] = 0;
     break;
   case ICT_MASKRP:
    blkcopy(pic->ic_data, &pa2, IP_ALEN);
    break;
   case ICT_ECHORQ:
    if ((int)pa2 > ECHOMAX(pip))
     pa2 = (char *)ECHOMAX(pip);
    for (i=0; i<(int)pa2; ++i)
     pic->ic_data[i] = i;
     return (int)pa2;
   case ICT_MASKRQ:
    blkcopy(pic->ic_data, &ip_anyaddr, IP_ALEN);
    return IP_ALEN;
  }
  return 0;
}

  而下面的代码则显示了计算机在收到ICMP redirect报文后的行为:

// icredirect:处理接收到的ICMP redirect报文,刷新路由缓存
int icredirect(pep) struct ep *pep;
{
 struct route *prt;
 struct ip *pip, *pip2;
 struct icmp *pic;
 IPaddr mask;

 pip = (struct ip*)pep->ep_data;
 pic = (struct icmp*)pip->ip_data;
 pip2 = (struct ip*)pic->ic_data;

 if (pic->ic_code == ICC_HOSTRD)
  mask = ip_maskall;
 else
  netmask(mask, pip2->ip_dst);
  prt = rtget(pip2->ip_dst, RTF_LOCAL);
  if (prt == 0)
  {
   freebuf(pep);
   return OK;
  }
  if (pip->ip_src == prt->rt_gw)
  {
   rtdel(pip2->ip_dst, mask);
   rtadd(pip2->ip_dst, mask, pic->ic_gw, prt->rt_metric, prt->rt_ifnum,IC_RDTTL);
  }
  rtfree(prt);
  freebuf(pep);
 return OK;
} 

  University of North Carolina完整的ICMP代码下载地址为:http://www.cs.unc.edu/~dewan/242/s00/xinu-pentium/icmp/

路由器欺骗(原始套接字五)

时间: 2024-08-14 03:23:34

路由器欺骗(原始套接字五)的相关文章

ip欺骗(原始套接字系列九)

由于使用Raw Socket的时候,IP报头可完全由程序员自定义,所以我们可以任意地修改本地发送包的IP地址,使得接收方错误的认为IP报文是由欺骗地址发出的. 下面的程序演示了向某目标发送IP地址伪装的UDP报文的过程: void sendPesuoIpUDP(void){ WSADATA wsd; if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) { printf("WSAStartup() failed: %d ", GetLastErr

ARP欺骗(原始套接字系列八)

ARP欺骗的原理可简单的解释如下:假设有三台主机A,B,C位于同一个交换式局域网中,监听者处于主机A,而主机B,C正在通信.现在A希望能嗅探到B->C的数据,于是A就可以伪装成C对B做ARP欺骗--向B发送伪造的ARP应答包,应答包中IP地址为C的IP地址而MAC地址为A的MAC地址. 这个应答包会刷新B的ARP缓存,让B认为A就是C,说详细点,就是让B认为C的IP地址映射到的MAC地址为主机A的MAC地址.这样,B想要发送给C的数据实际上却发送给了A,就达到了嗅探的目的.我们在嗅探到数据后,还

关于原始套接字的两个小问题

1.原始套接字的协议是否可以设置为IPPRORO_TCP?UDP和TCP分组没有对应的套接字,此时会不会将其传递到原始套接口? 答: (1) 可以.对于socket()函数,在流式套接字编程中第二个参数是SOCK_STREAM,而对于数据报套接字编程,第二个参数是SOCK_DGRAM,在这两种情况下,第三个参数可以填0,这样系统会自动匹配相应的协议. 而原始套接字编程中,第二个参数是SOCK_RAW,在这种情况下,第三个参数必须指明相应的协议,协议类型的常用取值有 IPPROTO_IP.IPPR

原始套接字简介(原始套接字系列一)

大多数程序员所接触到的套接字(Socket)为两类: (1)流式套接字(SOCK_STREAM):一种面向连接的Socket,针对于面向连接的TCP服务应用: (2)数据报式套接字(SOCK_DGRAM):一种无连接的Socket,对应于无连接的UDP服务应用. 从用户的角度来看,SOCK_STREAM.SOCK_DGRAM这两类套接字似乎的确涵盖了TCP/IP应用的全部,因为基于TCP/IP的应用,从协议栈的层次上讲,在传输层的确只可能建立于TCP或UDP协议之上(图1),而SOCK_STRE

原始套接字

原始套接字 一般情况下程序设计人员主要接触以下两类套接字: 流式套接字(SOCK_STREAM): 面向连接的套接字,对应于 TCP 应用程序. 数据包套接字(SOCK_DGRAM): 无连接的套接字,对应于UDP 应用程序. 这一类套接字为标准套接字.此外,还有一类原始套接字,它是一种对原始网络报文进行处理的套接字.原始套接字的用途主要有: 发送自定义的IP 数据报 发送ICMP 数据报 网卡的侦听模式,监听网络上的数据包. 伪装IP地址. 自定义协议的实现. 原始套接字主要应用在底层网络编程

SNIFF(原始套接字系列六)

大家知道,以太网采用广播机制,所有与网络连接的工作站都可以看到网络上传递的数据.通过查看包含在帧中的目标地址,确定是否进行接收或放弃.如果证明数据确实是发给自己的,工作站将会接收数据并传递给高层协议进行处理.但是,如果让网卡置于混杂模式(Promiscuous mode),则网卡不会鉴别帧的MAC地址,而是一律接收. 上图给出了以太网的帧格式,网卡是通过图中的MAC地址进行ID标识的.传说中的网络嗅探(sniffer)就是指让网卡进入混杂模式从而接收正在局域网总线上发送的所有报文.为什么能够嗅探

原始套接字-1

原始套接字-1 2010-05-20 00:13:16|  分类: 计算机与 Interne |字号 订阅 大多数程序员所接触到的套接字(Socket)为两类: (1)流式套接字(SOCK_STREAM):一种面向连接的Socket,针对于面向连接的TCP服务应用: (2)数据报式套接字(SOCK_DGRAM):一种无连接的Socket,对应于无连接的UDP服务应用. 从用户的角度来看,SOCK_STREAM.SOCK_DGRAM这两类套接字似乎的确涵盖了TCP/IP应用的全部,因为基于TCP/

Linux网络编程——原始套接字能干什么?

通常情况下程序员接所接触到的套接字(Socket)为两类: (1)流式套接字(SOCK_STREAM):一种面向连接的 Socket,针对于面向连接的TCP 服务应用: (2)数据报式套接字(SOCK_DGRAM):一种无连接的 Socket,对应于无连接的 UDP 服务应用. 从用户的角度来看,SOCK_STREAM.SOCK_DGRAM 这两类套接字似乎的确涵盖了 TCP/IP 应用的全部,因为基于 TCP/IP 的应用,从协议栈的层次上讲,在传输层的确只可能建立于 TCP 或 UDP 协议

网络骇客初级之原始套接字(SOCK_RAW)

本文用实际程序完成了MAC数据包分析,网络数据分析,MAC地址扫描器和飞秋欺骗 在这里我把原来的入门改成了初级,因为对于原始套接字的操作确实在普通的TCP,UDP之上 TCP和UDP确实涵盖了普通的网络应用程序,但请注意"普通"二字,要成为一名骇客的你,可不能仅仅满足于写一些普通的网络小程序,而要直接对所有数据包进行分析,还要能够发送自己组装的数据包,踏入高级网络编程的领域,编写一些奇特的网络程序(嘿嘿!). 注意所有程序都是在LINUX系统下实现的,当然在windows下不是不行,只