nmap python扫描工具
1.功能说明
a.help方法
运行输入help可查看帮助


b.单IP扫描
参数分两次输入,其中扫描参数可以拼接输入 如-sS -O

nmap -p80-500 IP 指定范围端口扫描

c.表格化显示
针对特定数据增加表格化显示以方便查看


nmap -O IP 扫描系统

nmap -sV IP 扫描服务

d.多IP扫描
使用网段IP如192.168.25.1/24可以扫描到该网段所有IP信息,记住IP里要有符号/




e.漏洞扫描
比如这是ms17-010的漏扫结果
nmap --script=vuln IP



2.代码实现
import nmap
import prettytable as pt2
class nmapApply:target_host = "" #主机ip地址target_ports = "" #扫描端口号arguments = "-p" #扫描参数up_hosts = []nmps = nmap.PortScanner()def useage(self):print("nmap IP:", "无任何参数扫描,相当于sS 参数扫描")print("nmap -vv IP:", "冗余扫描,将侦测过程原原本本的打印输出出来")print("nmap -p22 IP:", "指定端口号扫描,p和端口号可以不加空格")print("nmap -O IP:", "操作系统侦测扫描")print("nmap -A IP:", "操作系统侦测扫描,使用 A 参数,可以得到更多的信息")print("nmap -sn IP:", "只进行主机发现扫描,最常用的扫描方式,使用ping 扫描来侦测存活的主机,而不进行端口扫描")print("nmap -Pn IP:", "跳过主机发现扫描,假设所有的目标 IP 均为存活,以这种方式一个一个主机的进行端口扫描。(逃脱策略)")print("nmap -sV IP:", "扫描和版本号侦测扫描,侦测开放的端口来判断开放的服务,并试图检测它的版本")print("nmap --script=vuln IP:", "常见漏洞扫描")print("nmap -sU IP:", "UDP 扫描,用于NTP(123端口)、SNMP(161端口)之类的UDP服务扫描")print("nmap -D IP1,IP2 IP3:", "绕过防火墙利用掩体扫描,用掩体IP混入其中")print("nmap -P0 IP1,IP2 IP3:", "禁用 ping扫描")print("nmap -sI 僵尸IP地址[:开放的僵尸端口] IP:", "空闲扫描,sI 根本不使用你自己的 IP 地址,而是使用空闲的网络资源用于提高隐蔽性")print("nmap -e 网卡 IP:", "指定网卡扫描")print("nmap --host-timeout 时间 IP:", "限制每个 IP 地址的扫描时间(单位为秒),当要扫描大量的主机 IP 时这很有用")print("nmap -S 源IP IP:", "指定源IP扫描,冒充的 IP 地址(可以是下线状态的主机地址)进行扫描以增强隐蔽性")print("nmap -g 53 IP:", "指定源主机端口扫描,g/source-port 参数手动设定用来扫描的端口")print("nmap -f IP:", "数据包分片技术扫描,用于逃脱防火墙或闯入检测系统的检测")print("nmap --mtu mtu单元大小 IP:", "数据包分片技术扫描,mtu 的值必须是 8 的倍数(如 8、16、24、32 等)")print("nmap --data-length 垃圾数据长度 IP:", "添加垃圾数据扫描,在发送的数据包末尾添加随机的垃圾数据,以达到混淆视听的作效果")print("nmap --randomize-hosts IP:","随机选择扫描对象,如果你要扫描大量的,比如成百上千的主机 IP,这很有效。它会打乱扫描顺序,以规避检测系统的检测")print("nmap --spoof-mac 伪造MAC IP:","伪装 MAC 地址扫描,通过指定供应商的名字来伪装 MAC 地址。可选的名字有 Dell、Apple、3Com。""当然也可以手动指定 MAC 地址的值。或者为了简单起见,可以在上面 “伪造IP” 的地方填写数字 0,这将生成一个随机的 MAC 地址")print("nmap --badsum IP:", "伪造检验值扫描,使用伪造的 TCP / UDP / SCTP 校验和发送数据")print("nmap -T0 IP:", "扫描速度,T后面跟的数字代表扫描速度,数字越大则速度越快。""0~5分别表示:妄想症、鬼鬼祟祟、彬彬有礼、正常、好斗、精神病")#判断主机是否存活def isalive(self):self.nmps.scan(hosts=self.target_host, arguments='-n -sP -PE')self.up_hosts = self.nmps.all_hosts() # 获取存活主机列表print("存活主机:",self.up_hosts)def oneIPscan(self):L = []if "/" in self.target_host:L = self.nmps.all_hosts()else:L.append(self.target_host)for ip in L:self.nmps.scan(hosts=ip,arguments=self.arguments + self.target_ports) # 扫描主机 127.0.0.1 端口号 22-443print(self.nmps.command_line()) # 获取用于扫描的命令行:nmap -oX - -p 22-443 127.0.0.1tableA = pt2.PrettyTable()# print('values:%s' % self.nmps[ip].values())col = 3if "-sV" in self.arguments:col = 4tableA.field_names = ["port", "state", "name", "product"]else:tableA.field_names = ["port", "state", "name"]for i in self.nmps[ip].values():if type(i) == dict:for j in i:li = [j, i[j]]if type(li[1]) == dict:ll = []str1 = str(j)if j in self.nmps[ip].all_tcp():str1 += "/tcp"elif j in self.nmps[ip].all_udp():str1 += "/udp"elif j in self.nmps[ip].all_ip():str1 += "/ip"elif j in self.nmps[ip].all_sctp():str1 += "/sctp"ll.append(str1)ll.append(li[1]['state'])ll.append(li[1]['name'])if "-sV" in self.arguments:ll.append(li[1]['product'])li = llwhile True:if len(li) < col:li.append(" ")else:breaktableA.add_row(li)print(tableA)tableB = pt2.PrettyTable()c = 0for i in self.nmps[ip].values():if type(i) != dict:for J in i:for k in J:if k != 'osclass' and k != 'id' and k != 'output':li = [k, J[k]]tableB.add_row(li)elif k == 'id':li = [J[k], J['output']] #漏洞检测输出tableB.add_row(li)c += 1if c > 0:tableB.field_names = ["id", "output"]print(tableB)tableC = pt2.PrettyTable()for i in self.nmps[ip].values():if type(i) != dict and len(i) > 0:if 'osclass' in i[0].keys():tableC.field_names = ["os", "vendor", "osfamily", "accuracy", "cpe"]for j in i[0]:li = [j, i[0][j]]if len(i[0][j]) > 0 and type(i[0][j][0]) == dict:ll = []ll.append(j)ll.append(i[0][j][0]["vendor"])ll.append(i[0][j][0]["osfamily"])ll.append(i[0][j][0]["accuracy"])ll.append(i[0][j][0]["cpe"])li = llif len(li) > 2:tableC.add_row(li) # 系统检测输出print(tableC)print("在线状态:", self.nmps[ip].state()) # 获取主机 127.0.0.1 的状态 (up|down|unknown|skipped)print("22端口检测:", self.nmps[ip].has_tcp(22)) # 是否含有主机 127.0.0.1 的 22 端口的信息
if __name__ == '__main__':nma = nmapApply()# 获取需要扫描的主机IP地址和端口nma.target_host = input("输入help可以查看帮助:")if nma.target_host == "help" or nma.target_host == "HELP":nma.useage()nma.target_host = input("请输入需要扫描的主机ip地址:")nma.arguments = input("请输入扫描参数:")#获取存活主机列表nma.isalive()#单IP扫描if len(nma.up_hosts) > 0:nma.oneIPscan()
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
