이 글은 아이디어와 코드를 포함하여 Python3을 사용하여 TCP 전체 연결 포트 스캐너를 구현하는 제작 과정을 공유합니다.
침투 중 테스트의 초기 단계에서는 일반적으로 공격 대상에 대한 정보를 수집해야 하며, 포트 스캐닝은 정보 수집에 있어서 중요한 단계입니다. 포트 스캐닝을 통해 대상 호스트에 어떤 서비스가 열려 있는지 알 수 있으며, 서비스를 기반으로 특정 취약점이 있을 수도 있음을 추측할 수도 있습니다. TCP 포트 스캔은 일반적으로 다음과 같은 유형으로 구분됩니다.
TCP 연결 스캔: 전체 연결 스캔이라고도 하며, 이 방법은 대상 포트에 직접 연결하여 TCP 3방향 핸드셰이크 프로세스를 완료합니다. 정확하지만 대상 시스템에서 느리고 쉽게 감지됩니다.
TCP SYN 스캔: 세미 오픈 스캔이라고도 하는 이 방법은 SYN 패킷을 보내고 TCP 세션을 시작한 다음 대상 응답 패킷을 기다립니다. RST 패킷이 수신되면 포트가 닫혀 있음을 나타내고, SYN/ACK 패킷이 수신되면 해당 포트가 열려 있음을 나타냅니다.
Tcp FIN 스캔: 이 방법은 활성 TCP 연결이 끊어졌음을 나타내는 FIN 패킷을 전송하여 상대방이 연결을 닫을 수 있도록 합니다. RST 패킷이 수신되면 해당 포트가 닫혀 있음을 나타냅니다.
TCP XMAS 스캔: 이 방법은 PSH, FIN, URG 및 TCP 플래그가 1로 설정된 패킷을 전송합니다. RST 패킷이 수신되면 해당 포트가 닫혀 있음을 나타냅니다.
다음으로 Python3을 사용하여 TCP 전체 연결 포트 스캐너를 구현한 다음 프로그래밍 링크를 입력합니다.
코딩연습
全连接扫描
이 방법의 핵심은 서로 다른 포트에 대해 TCP 연결을 하고, 연결 여부에 따라 해당 포트가 열려 있는지 판단하는 것입니다. 이제 가장 간단한 포트 스캐너를 구현해 보겠습니다.
#!/usr/bin/python3 # -*- coding: utf-8 -*- from socket import * def portScanner(host,port): try: s = socket(AF_INET,SOCK_STREAM) s.connect((host,port)) print('[+] %d open' % port) s.close() except: print('[-] %d close' % port) def main(): setdefaulttimeout(1) for p in range(1,1024): portScanner('192.168.0.100',p) if name == 'main': main()
이 코드의 핵심은 portScanner
함수 입니다. 연결에 성공하면 해당 포트는 열린 것으로 판단되고, 그렇지 않으면 닫힌 것으로 간주됩니다. 실행 결과를 살펴보겠습니다.
이러한 스캔은 너무 비효율적으로 보이며 기본 시간 제한을 10,000초로 설정했기 때문에 실제로 매우 느립니다. 항구, 꽃이 시들 때까지 기다려야 하는 거 아닌가요? 가장 간단한 방법은 多线程
을 사용하여 효율성을 높이는 것입니다. 파이썬의 멀티스레딩이 약간 너무 약하기는 하지만, 적어도 기다리는 시간을 다른 일에 사용할 수 있습니다. 게다가 이전에는 스캔한 포트가 많아서 표시되는 정보가 우리에게 불편한 것 같았습니다. 이번에는 우리가 관심 있는 打开的端口
만 표시하고, 스캔이 끝나면 열린 포트 수를 표시합니다.
#!/usr/bin/python3 # -*- coding: utf-8 -*- from socket import * import threading lock = threading.Lock() openNum = 0 threads = [] def portScanner(host,port): global openNum try: s = socket(AF_INET,SOCK_STREAM) s.connect((host,port)) lock.acquire() openNum+=1 print('[+] %d open' % port) lock.release() s.close() except: pass def main(): setdefaulttimeout(1) for p in range(1,1024): t = threading.Thread(target=portScanner,args=('192.168.0.100',p)) threads.append(t) t.start() for t in threads: t.join() print('[*] The scan is complete!') print('[*] A total of %d open port ' % (openNum)) if name == 'main': main()
실행해 보면 아래와 같이 효과가 나타납니다.
이제 훨씬 편리해 보이지 않나요? 이 시점에서 효율성 문제는 해결되었습니다. 이제 스캐너가 괜찮아 보일 수 있도록 매개변수 구문 분석 기능을 추가해야 합니다. 스캔 대상과 포트를 수정하기 위해 매번 코드를 변경할 수는 없습니다.
Python3과 함께 제공되는 표준 모듈 argparse
을 사용하여 매개변수를 구문 분석하므로 문자열
#!/usr/bin/python3 # -*- coding: utf-8 -*- from socket import * import threading import argparse lock = threading.Lock() openNum = 0 threads = [] def portScanner(host,port): global openNum try: s = socket(AF_INET,SOCK_STREAM) s.connect((host,port)) lock.acquire() openNum+=1 print('[+] %d open' % port) lock.release() s.close() except: pass def main(): p = argparse.ArgumentParser(description='Port scanner!.') p.add_argument('-H', dest='hosts', type=str) args = p.parse_args() hostList = args.hosts.split(',') setdefaulttimeout(1) for host in hostList: print('Scanning the host:%s......' % (host)) for p in range(1,1024): t = threading.Thread(target=portScanner,args=(host,p)) threads.append(t) t.start() for t in threads: t.join() print('[*] The host:%s scan is complete!' % (host)) print('[*] A total of %d open port ' % (openNum)) if name == 'main': main()아래와 같이 실행 효과를 살펴보세요. 이제 포트 스캐너가 기본적으로 완성되었습니다. 기능은 비교적 간단하지만 포트 스캐너의 기본 구현 아이디어를 표현하는 것을 목표로 합니다! 좀 더 세부적인 기능은 이 기본 구조를 바탕으로 점차 개선될 수 있을 것 같아요!
요약
하세요!위 내용은 Python3을 사용하여 TCP 포트 스캐너를 만들기 위한 그래픽 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!