>  기사  >  운영 및 유지보수  >  포트 스캐닝 방법은 무엇입니까?

포트 스캐닝 방법은 무엇입니까?

王林
王林앞으로
2020-08-10 17:19:5513407검색

포트 스캐닝 방법은 무엇입니까?

사건의 원래 원인

(추천 튜토리얼: 웹 서버 보안)

저자는 침투 테스트 중에 수집해야 할 정보를 자동으로 수집하기 위해 스크립트를 사용하는 작은 도구를 작성하고 있습니다. 이 모듈에는 포트 배너 정보 수집이라는 어려운 부분이 있습니다. 처음에는 python+nmap+multi-thread 스캐닝을 사용하여 20개 이상의 IP를 스캔하려고 시도했는데 대기 시간이 지쳤습니다. . . 저자의 목표는 200개 이상의 IP를 검색하는 것입니다. 다음으로 포트 스캐닝 기술을 분석해 보겠습니다.

1. nmap 감지 포트

nmap은 여러 호스트를 스캔할 때 --min-hostgroup 매개변수를 설정할 수 있습니다. 이 매개변수를 설정하면 여러 호스트를 병렬로 스캔하고 이러한 호스트를 그룹으로 나눈 다음 한 번에 하나의 그룹을 스캔할 수 있습니다.

예:

--min-hostgroup 50 nmap은 50개의 호스트를 그룹으로 사용하며 50개의 호스트를 스캔할 때까지 결과가 표시되지 않습니다.

#coding=utf-8
import nmap 
from queue import Queue
from threading import Thread
def portscan(ip):
    portlist = []
    nm = nmap.PortScannerYield()
    for r in nm.scan(ip,ports='1-10000',arguments='-sS --min-hostgroup'):
        m = r[1]['scan'][ip]['tcp']
        for p in m:
            temp = str(p) + "----" +m[p]['state']
            portlist.append(temp)
    print(portlist)
class Consumer(Thread):
    def __init__(self, q):
        Thread.__init__(self)
        self.q = q
    def run(self):
        while  not self.q.empty():
            ip = self.q.get()
            try:
                portscan(ip)
            except Exception as e:
                print(e)
                continue
def producer(ip_list):
    num = 10
    threads = []
    q = Queue()
    for i in ip_list:
        print(i)
        q.put(i)
    threads = [Consumer(q) for i in range(0,int(num))]
    for t in threads:
        t.start()
    for t in threads:
        t.join()
ip_list =['120.78.207.76', '120.78.207.231', '120.78.207.18', '120.78.207.233', '120.78.207.165', '120.78.207.48', 
'120.78.207.112', '120.78.207.27', '120.78.207.51', '120.78.207.8']
producer(ip_list)

포트 스캐닝 방법은 무엇입니까?

사진과 같이 10개의 IP를 실행하는데 318s가 소요됩니다.

2. Masscan 감지 포트

(1) Python Masscan 호출

기본적으로 Masscan은 syn 데이터 패킷을 보냅니다. 대상 호스트가 ack+syn을 반환하면 포트가 열려 있다는 의미입니다. 구체적인 프로세스는 다음과 같습니다

A:192.168.70.142

B:192.168.0.143 오픈 포트 3306

(1)A->B syn

(2)B->A syn+ack

( 3)A ->B RST

포트 스캐닝 방법은 무엇입니까?

열리지 않은 포트 감지

A->B syn

B->A rst

포트 스캐닝 방법은 무엇입니까?

예:

def portscan(ip):
    mas = masscan.PortScanner()
    mas.scan(ip,ports='1-65535')
    print(mas.scan_result)

시스템 명령을 사용하여 감지

사용법

扫描扫描443端口的B类子网
Masscan 10.11.0.0/16 -p443
扫描80或443端口的B类子网
Masscan 10.11.0.0/16 -p80,443
扫描100个常见端口的B类子网,每秒100,000个数据包
Masscan 10.11.0.0/16  --top-ports 100 -rate 100000

结果输出
-oX filename:输出到filename的XML。
-oG filename:输出到filename在的grepable格式。
-oJ filename:输出到filename在JSON格式。

3. 소켓 감지 포트

소켓 감지 포트는 다음과 같이 불완전한 3방향 핸드셰이크 패킷을 보냅니다.

A:192.168.70.142

B:192.168.0.143 오픈 포트 3306

A가 수신합니다. B 및 반환 syn+ack 패킷 후에 A는 데이터를 삭제합니다.

포트 스캐닝 방법은 무엇입니까?

열리지 않은 포트 감지

A는 syn을 보내고, B는 포트 33을 열지 않으므로 RST 패킷이 반환됩니다.

포트 스캐닝 방법은 무엇입니까?

def portscan(ip,port):
    try:
        s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s.settimeout(0.2)
        status = s.connect_ex((ip,port))
        if status == 0:
            temp_str = str(ip) + "---" + str(port) + "---open"
            port_list.append(temp_str)
        else:
            pass
    except Exception as e:
        pass
    finally:
        s.close()

포트 스캐닝 방법은 무엇입니까?

IP 10개를 탐지하는데 26.3초, 거의 2.6초가 걸렸습니다.

4. 텔넷 감지 포트

텔넷 감지 포트는 완전한 3방향 핸드셰이크 연결을 사용합니다. 텔넷 IP 포트 명령을 사용합니다. 패킷 전송 프로세스는 다음과 같습니다

A:192.168.70.142

B:192.168.0.143 포트 3306

telnet 192.168.0.143 3306

과정은 다음과 같습니다:

TCP 3방향 핸드셰이크를 사용하여 연결 설정: SYN ->

포트 스캐닝 방법은 무엇입니까?

探测不存在端口,发送SYN数据包,然后RST包丢弃。

포트 스캐닝 방법은 무엇입니까?

如果有返回值,则说明端口开放,否则则端口关闭。

def portscan(ip,port):
     try:
         t = telnetlib.Telnet(ip,port=port,timeout=0.2)
         if t:
             temp_str = str(ip) + '---' + str(port)
             port_list.append(temp_str)
 except Exception as e:
     print(e)
     pass

포트 스캐닝 방법은 무엇입니까?

探测10个ip花费了27.8s差不多一个2.7s。

5、nc探测端口

nc探测端口采用完整的三次握手连接,使用命令 nc -v -w 1 -z ip port,发包过程和telent 探测一样。

探测开放端口的数据包

포트 스캐닝 방법은 무엇입니까?

探测未开放端口的数据包

포트 스캐닝 방법은 무엇입니까?

端口开放,返回值为0,可以依此作为判断依据。

def portscan(ip,port):
     command = 'nc -v -w 1 -z {0} {1}'.format(ip,port)
     m = os.system(command)
     if m == 0:
         temp_str = str(ip) + "---" + str(port)
         port_list.append(temp_str)
     else:
         pass

포트 스캐닝 방법은 무엇입니까?

备注:比如你想探测某个指定的端口开放情况,推荐使用nc。

总结

nmap 作为扫描端口的神器,扫描出的结果比其他几种方式要详细。如果追求效率的话,建议采用socket。相比于nmap,socket会存在漏报情况,笔者在测试某主机时,nmap扫出了8888端口,但是socket没有。

위 내용은 포트 스캐닝 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 secpulse.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제