사건의 원래 원인
(추천 튜토리얼:웹 서버 보안)
저자는 침투 테스트 중에 수집해야 할 정보를 자동으로 수집하기 위해 스크립트를 사용하는 작은 도구를 작성하고 있습니다. 이 모듈에는 포트 배너 정보 수집이라는 어려운 부분이 있습니다. 처음에는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!