端口详解+端口扫描原理+简单端口扫描实现

一 摘要

        端口是个网络应用中很重要的东西,相当于“门”。
二 什么是端口
        端口在计算机网络中是个非常重要的概念,他不是硬件,不同于计算机中的插槽,可以说是个软插槽。如果有需要,一台计算机中可以由上万个端口。 

       端口是由计算通信协议TCP/IP协议定义的。其中规定,用IP地址和端口作为套接字,它代表TCP链接的一个连接端,一般称为socket,具体来说,就是用[ip:端口]来定位一台主机中的进程。可以做这样的比喻,端口相当于两台计算机进程间的大门,可随便定义,其目的只是为了让两台计算机能找到对方的进程。计算机就想一座大楼,这个大楼有好多入口(端口),进到不同的入口中就可以找到不同的公司(进程)。如果要和远程主机A的程序通信,那么只要把数据发向[A;端口]就可以实现通信了。
三 端口的分类
  在Internet上,按照协议类型分类,端口被分为TCP端口和UDP端口两类,虽然他们都用正整数标识,但这并不会引起歧义,比如TCP的80端口和UDP的80端口,因为数据报在标明端口的同时,还将标明端口的类型。 
  从端口的分配来看,端口被分为固定端口和动态端口两大类(一些教程还将极少被用到的高端口划分为第三类:私有端口):
  固定端口(0-1023):
   使用集中式管理机制,即服从一个管理机构对端口的指派,这个机构负责发布这些指派。由于这些端口紧绑于一些服务,所以我们会经常扫描这些端口来判断对方 是否开启了这些服务,如TCP的21(ftp),80(http),139(netbios),UDP的7(echo),69(tftp)等等一些大家熟 知的端口;
  动态端口(1024-49151):
  这些端口并不被固定的捆绑于某一服务,操作系统将这些端口动态的分配给各个进程, 同一进程两次分配有可能分配到不同的端口。不过一些应用程序并不愿意使用操作系统分配的动态端口,他们有其自己的‘商标性’端口,如oicq客户端的 4000端口,木马冰河的7626端口等都是固定而出名的。

四 端口在入侵中的作用
  有人曾经把服务器比作房子,而把端口比作通向不同房间(服务)的门,如果不考虑细节的话,这是一个不错的比喻。入侵者要占领这间房子,势必要破门而入(物理入侵另说),那么对于入侵者来说,了解房子开了几扇门,都是什么样的门,门后面有什么东西就显得至关重要。
   入侵者通常会用扫描器对目标主机的端口进行扫描,以确定哪些端口是开放的,从开放的端口,入侵者可以知道目标主机大致提供了哪些服务,进而猜测可能存在 的漏洞,因此对端口的扫描可以帮助我们更好的了解目标主机,而对于管理员,扫描本机的开放端口也是做好安全防范的第一步。

五、端口扫描原理:尝试与目标主机建立连接,如果目标主机有回复则说明端口开放。
扫描分类:
      1. 全TCP连接,这种方法使用三次握手与目标主机建立标准的tcp连接。但是这种方法跟容易被发现,被目标主机记录。
      2. SYN扫描,扫描主机自动向目标主机的指定端口发送SYN数据段,表示发送建立连接请求。
!!如果目标主机的回应报文SYN=1,ACK=1.则说明该端口是活动的,接着扫描主机发送回一个RST给目标主机拒绝连接。导致三次握手失败。
!!如果目标主机回应是RST则端口是“死的”。
      3 FIN扫描,发送一个FIN=1的报文到一个关闭的窗口该报文将丢失并返回一个RST,如果该FIN报文发送到活动窗口则报文丢失,不会有任何反应。
      4.代理扫描。就是抓鸡啦。

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <unistd.h>  
  5. #include <errno.h>  
  6. #include <sys/socket.h>  
  7. #include <arpa/inet.h>  
  8. #include <sys/types.h>  
  9. #include <pthread.h>  
  10.   
  11. #define MAX_THREAD_NUM 100  
  12. #define SEG_LEN 655  
  13. #define MAX_PORT 65535  
  14.   
  15. typedef struct PortNode  
  16. {  
  17.     char ip[30];  
  18.     int minPort;  
  19.     int maxPort;  
  20. }PortNode;  
  21. pthread_t tid;  
  22. void* doit(void* arg)  
  23. {  
  24.     int i, sockfd, connfd;  
  25.     struct sockaddr_in servaddr;  
  26.     PortNode* port = (PortNode*)arg;  
  27.     pthread_detach(pthread_self());//为避免存储器泄漏,每个可结合线程都应该被其他线程显式地收回,要么通过调用pthread_detach函数被分离  
  28.     memset(&servaddr, 0, sizeof(servaddr));  
  29.     servaddr.sin_family = AF_INET;  
  30.     //inet_pton(AF_INET, port->ip, &servaddr.sin_addr);  
  31.     servaddr.sin_addr.s_addr = inet_addr(port->ip);  
  32.     for(i = port->minPort; i <= port->maxPort; i++){  
  33.         servaddr.sin_port = htons(i);  
  34.         if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){  
  35.             perror("socket error");  
  36.             pthread_exit(NULL);  
  37.         }  
  38.         if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(struct sockaddr)) == 0){  
  39.             printf("%s:%d\n", port->ip, i);  
  40.         }  
  41.         close(sockfd);//注意关闭!!  
  42.     }  
  43.     pthread_exit(NULL);  
  44. }  
  45.   
  46.   
  47. int main(int argc, char** argv)  
  48. {  
  49.     int i,j;  
  50.     for(i = 1; i < argc; i++){  
  51.         PortNode* port = (PortNode*)malloc(sizeof(PortNode));  
  52.         for(j = 0; j < MAX_THREAD_NUM; j++){  
  53.             strcpy(port->ip, argv[i]);  
  54.             port->minPort = j*SEG_LEN + 1;  
  55.             if(j == (MAX_THREAD_NUM - 1))port->maxPort = MAX_PORT;  
  56.             else port->maxPort = port->minPort + SEG_LEN - 1;  
  57.             if(pthread_create(&tid, NULL, doit, (void*) port)  != 0 ){  
  58.                 perror("pthread create error.\n");  
  59.                 free(port);  
  60.                 port=NULL;  
  61.                 exit(1);  
  62.             }  
  63.         }  
  64.     }  
  65.     sleep(3);  
  66. }  
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值