SSDP協議編程 upnp設備查找方法
- int ssdp_discovery()
- {
- struct sockaddr_in addrin ;
- struct timeval rtime ;
- int newsock ;
- int ret ;
- char buf[1024] ;
- int i=0 ;
- int yes=1 ;
- rtime.tv_sec = 2 ;
- rtime.tv_usec = 0 ;
- bzero(&addrin, sizeof(addrin));
- addrin.sin_family = AF_INET;
- addrin.sin_addr.s_addr = inet_addr("239.255.255.250"); //htonl(INADDR_ANY)
- addrin.sin_port = htons(1900);
- newsock=socket(AF_INET,SOCK_DGRAM,0);
- if( newsock < 0) {perror("1"); return -1;}
- setsockopt( newsock, SOL_SOCKET, SO_RCVTIMEO, (const char *)&rtime, sizeof(struct timeval));
- setsockopt( newsock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) ;
- ret=bind( newsock, (struct sockaddr *)&addrin, sizeof(addrin));
- if( ret < 0 ) {perror("2"); return -1;}
- while(i<8)
- {
- i++;
- yes=sizeof(struct sockaddr_in);
- memset(buf, 0, sizeof(buf));
- ret=recvfrom( newsock, &buf,sizeof(buf), 0, (struct sockaddr *)&addrin, &yes);
- if( ret < 0 ) {perror("3"); continue;}
- printf("ip:%s/n",inet_ntoa( addrin.sin_addr));
- }
- close(newsock);
- return 0;
- }
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