1-渗透测试 - 端口探测

about

端口是设备与外界通信交流的接口,如果把服务器看作一栋房子,那么端口就是可以进出这栋房子的门,真正的房子只有只有一个门或者几个门,但服务器至多可以有65536个端口。
不同的端口(门)可以指向不同的服务(房间)。
例如,我们经常浏览网页时涉及的WWW服务默认端口是80;而上传或者下载时使用的FTP服务的默认端口是21;MySQL的默认监听端口是3306
所以,入侵者想要获取到服务器的控制权,势必要从一个门进入一个房间,在通过这个房间进而控制整个房子。那么服务器开启状态的端口有几个?哪个软件监听的端口?这些都是十分重要的信息,可以为入侵者制定详细的入侵计划提供依据。
因此在信息搜集阶段,端口开放情况,的扫描就显得尤为重要。
本篇博客,演示了使用Python编写一个多线程端口探测脚本。

代码示例

win10 + python3.6.6

#!/bin/bash
# -*- coding: utf-8 -*-
# @Time    : 2020/12/8 11:24
# @Author  : 张开
# File      : 02 端口探测.py


import socket
import argparse
from concurrent.futures import ThreadPoolExecutor
from multiprocessing import cpu_count


class PortScan(object):

    def __init__(self, args):
        self.list = []
        self.args = args
        self.checkPort()

    def send_msg(self, port):

        try:
            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.sock.settimeout(self.args.timeout)
            result_code = self.sock.connect_ex((self.args.host, port))
            if result_code == 0:
                print("\033[1;32;40m[%d] OPEN\033[0m" % port)
            else:
                print('[%d] CLOSE' % port)
        except Exception as e:
            # print(e)
            pass
        finally:
            self.sock.close()

    def checkPort(self):
        if "-" in self.args.port:
            startPort, endPort = self.args.port.split("-")
            for i in range(int(startPort.strip()), int(endPort.strip()) + 1):
                self.list.append(i)
        else:
            self.list.append(int(self.args.port))

    def run(self):

        t = ThreadPoolExecutor(self.args.threadNum)
        for i in self.list:
            t.submit(self.send_msg, i)


if __name__ == '__main__':
    parse = argparse.ArgumentParser()
    parse.add_argument('--host', default='127.0.0.1', type=str, help='要循环的主机ip')
    parse.add_argument('--port', default='80-10000', help='要循环的端口范围,可以是 单个如 8888 或者范围 0-65535')
    parse.add_argument('--threadNum', default=cpu_count() * 5)
    parse.add_argument('--timeout', default=10)

    obj = PortScan(args=parse.parse_args())
    obj.run()
"""
D:\tmp>python "02 端口探测.py"
[135] OPEN
[137] CLOSE
[139] CLOSE
[141] CLOSE
[143] CLOSE
[144] CLOSE
.....
"""

that's all
posted @ 2020-12-08 14:23  听雨危楼  阅读(211)  评论(0编辑  收藏  举报