SSDP协议编程 upnp设备查找方法

SSDP协议编程 upnp设备查找方法

 

[cpp]  view plain copy
  1. int ssdp_discovery()  
  2. {  
  3.     struct sockaddr_in   addrin     ;  
  4.     struct timeval       rtime      ;  
  5.     int                  newsock    ;  
  6.     int                  ret        ;  
  7.     char                 buf[1024]  ;  
  8.     int                  i=0        ;  
  9.     int                  yes=1      ;  
  10.   
  11.     rtime.tv_sec  = 2 ;  
  12.     rtime.tv_usec = 0 ;  
  13.   
  14.     bzero(&addrin, sizeof(addrin));  
  15.     addrin.sin_family = AF_INET;  
  16.     addrin.sin_addr.s_addr = inet_addr("239.255.255.250"); //htonl(INADDR_ANY)  
  17.     addrin.sin_port = htons(1900);  
  18.   
  19.     newsock=socket(AF_INET,SOCK_DGRAM,0);  
  20.     if( newsock < 0) {perror("1"); return -1;}  
  21.   
  22.     setsockopt( newsock, SOL_SOCKET, SO_RCVTIMEO, (const char *)&rtime, sizeof(struct timeval));  
  23.     setsockopt( newsock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) ;  
  24.   
  25.     ret=bind( newsock, (struct sockaddr *)&addrin, sizeof(addrin));  
  26.     if( ret < 0 )   {perror("2"); return -1;}  
  27.   
  28.     while(i<8)  
  29.     {  
  30.         i++;  
  31.         yes=sizeof(struct sockaddr_in);  
  32.   
  33.         memset(buf, 0, sizeof(buf));  
  34.         ret=recvfrom( newsock, &buf,sizeof(buf), 0, (struct sockaddr *)&addrin, &yes);  
  35.         if( ret < 0 ) {perror("3"); continue;}  
  36.         printf("ip:%s/n",inet_ntoa( addrin.sin_addr));  
  37.         
  38.   
  39.     }  
  40.   
  41.     close(newsock);  
  42.     return 0;  
  43. }  

 

 

 

SSDP是一个“简单服务发现协议” ,即英文“Simple Service Discovery Protocol的缩写” , 该协议定义了如何在网络上发现网络服务的方法。SSDP也规定了存放在XML文件中的信息格式。SSDP信息的传送是依靠HTTPU和HTTPMU进行的。不论是控制指针,或是UPnP设备,工作中都必然用到SSDP,设备接入网络之后,要利用它向网络广播自己的存在(广播的信息中还有设备位置的描述),以便尽快与对应的控制指针建立联系;控制指针则利用SSDP来搜索自己将要控制的设备在哪里?并且可以排除已经存在的设备和控制指针――只为新近的或尚未“联络”上的双方服务。

控制指针利用SSDP的方式是经由HTTPU发出搜索请求,这种请求可以很详细,能具体到需要什么样的设备以及何种服务。例如:请求对特定的VCR机进行设置时钟的服务。

设备利用SSDP的方式是“收听”来自网络端口的消息,从中发现与自己匹配的信息,一旦找到与自己匹配的信息,经由HTTPMU来发送一个响应信息到控制指针。

运行了UPnP服务的系统实施攻击并非难事,只要向该系统的1900端口发送一个UDP包,其中“LOCATION”域的地址指向另一个系统的Chargen端口,就可能使系统进入一个无限的连接循环,这将会导致受影响系统 CPU 和内存占用率达100%,使远程XP系统完全不能使用而拒绝了服务,只有通过重启后系统才能恢复正常。另外,攻击者只要向某个拥有众多XP主机的网络发送一个伪造的UDP报文,也可能会导致目标网络上所有的XP主机通过所选择的URL,执行了一个攻击的选择。而且当UPNP的部分服务被当作UDP来执行的时候,他产生的所有这些攻击都是难以找到的。 

包格式举例
NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900
CACHE-CONTROL: max-age=10
LOCATION:http://IPADDRESS:PORT/.xml
NT: urn:schemas-upnp-org:device:InternetGatewayDevice:1
NTS: ssdp:alive
SERVER: EEYE/2001 UPnP/1.0 product/1.1
USN: uuid:EEYE
---------------------------------------------------------------------------------------------
SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 6
ST: urn:schemas-upnp-org:service:WANIPConnection:1

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值