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