You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MiaCTFer/client/portscan/NmapScan.py

69 lines
3.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 导入nmap模块用于进行端口扫描
import nmap
# 导入自定义的PortScan配置这里用于提供nmap的搜索路径配置
from client.subdomain.oneforall.config import PortScan
# 定义一个端口扫描函数接收ip地址和可选的端口信息列表
def Nmap_Portscan(ip, port_info_list=None):
# 打印开始扫描的提示信息
print(f'[+]端口扫描-开始nmap端口扫描[{ip}]')
try:
# 尝试初始化nmap扫描器并设置nmap的搜索路径
nm = nmap.PortScanner(nmap_search_path=PortScan.nmap_search_path)
except Exception as e:
# 如果初始化失败打印错误信息并返回None
print(f'[-]端口扫描-nmap初始化失败[{ip}];{e}')
return None
# 如果传入了端口信息列表,则指定扫描的端口范围
if port_info_list:
# 将端口列表转化为逗号分隔的字符串适合nmap扫描
ports = ','.join([str(tmp) for tmp in port_info_list])
# 执行nmap扫描指定扫描的ip和端口
nm.scan(hosts=ip, ports=ports, arguments='-Pn -T 4 -sV --version-intensity=5')
else:
# 如果没有指定端口信息,扫描所有端口
nm.scan(hosts=ip, arguments='-Pn -T 4 -sV --version-intensity=5')
try:
# 获取扫描到的端口列表默认扫描TCP端口
port_list = nm[ip]['tcp'].keys()
except Exception as e:
# 如果扫描异常,捕获异常并打印错误信息
print(f'[-]端口扫描-nmap扫描异常[{ip}];{e}')
return None
else:
# 初始化一个字典,用于存储扫描结果
port_dict = {}
# 遍历扫描到的端口列表
for port in port_list:
# 确保端口信息存在
if nm[ip].has_tcp(port):
# 获取该端口的详细信息
port_info = nm[ip]['tcp'][port]
# 获取端口的状态(如果未找到则默认为'no'
state = port_info.get('state', 'no')
# 如果端口是开放的open则收集更多信息
if state == 'open':
# 获取端口的服务名称、产品名称和版本
name = port_info.get('name', '')
product = port_info.get('product', '')
version = port_info.get('version', '')
# 将端口信息添加到字典中
port_dict[port] = {'ip': ip, 'port': port, 'name': name, 'product': product, 'version': version}
# 打印扫描结果
print(f'[+]端口扫描-nmap扫描成功{ip}:{port} {name} {product} {version}')
# 打印扫描完成的提示信息
print(f'[+]端口扫描-nmap扫描完毕')
# 返回扫描到的开放端口信息字典
return port_dict
# 如果该脚本作为主程序执行
if __name__ == '__main__':
# 调用端口扫描函数扫描指定IP地址
info = Nmap_Portscan('1.1.1.1')
# 打印扫描结果
print(info)