用python實現(xiàn)端口嗅探

一:簡介

主要用到socket實現(xiàn)tcp包發(fā)送,gevent實現(xiàn)并發(fā)操作。支持網(wǎng)段。

二:代碼實現(xiàn)

#!/usr/bin/env python3
# coding:utf-8

import argparse
import socket
import time

from IPy import IP
from gevent import monkey

monkey.patch_all()
import gevent
import gevent.pool


class PortScan():
    def __init__(self, ipaddr, port=None):
        self.ipaddr = ipaddr
        if port is None:
            port = '1-65535'
        self.fat(port)

    '''解析port,支持80-100的格式'''
    def fat(self, ports):
        if isinstance(ports, int):
            self.port = ports
        else:
            self.port = [port for port in range(int(ports.split('-')[0]), int(ports.split('-')[1]) + 1)]

    '''端口連接'''
    def tcp_conn(self, ip, port):
        tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        tcp_socket.settimeout(0.1)
        try:
            res = tcp_socket.connect_ex((ip, int(port)))
            if res == 0:
                print("{0} TCP Open".format(port))
            tcp_socket.close()
        except Exception as e:
            print("Error: {0}".format(e))

    '''使用多線程加快端口掃描的過程'''
    def scan(self, ip):
        if isinstance(self.port, list):
            g = gevent.pool.Pool(100)
            runs = [g.spawn(self.tcp_conn, ip, port) for port in self.port]
            gevent.joinall(runs)
        elif isinstance(self.port, int):
            self.tcp_conn(ip=ip, port=self.port)

    '''解析ip address'''
    def run(self):
        for ip in IP(self.ipaddr):
            print("IP:{}".format(str(ip)))
            self.scan(ip=str(ip))

if __name__ == "__main__":
    start_time = time.time()

    '''命令行幫助'''
    parser = argparse.ArgumentParser()
    parser.description = 'Port Scan'
    parser.add_argument("--ip", help="ip or ip address", required=True, type=str)
    parser.add_argument("--port", help="80 or 80-100", default=None, type=str)
    args = parser.parse_args()

    r = PortScan(ipaddr=args.ip)
    r.run()
    print("耗時:{}".format(time.time() - start_time))

三:使用方法

1.不指定ip的話,默認為1-65535

./port_scan.py --ip 127.0.0.1

2.嗅探指定網(wǎng)段

./port_scan.py --ip 192.168.1.0/24 --port 1024-65535
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容