SSDP協議編程 upnp設備查找方法

SSDP協議編程 upnp設備查找方法

 

  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

發佈了93 篇原創文章 · 獲贊 16 · 訪問量 151萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章