失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 十一 使用python的scapy和nmap模块进行主机存活探测

十一 使用python的scapy和nmap模块进行主机存活探测

时间:2022-10-05 18:03:44

相关推荐

十一  使用python的scapy和nmap模块进行主机存活探测

文章目录

使用scapy模块构造icmp数据包探测0x01 模块安装0x02 scapy模块学习笔记0x03 脚本编写使用nmap模块扫描0x01 下载nmap模块和nmap安装包0x02 nmap模块学习笔记0x03 脚本编写

使用scapy模块构造icmp数据包探测

0x01 模块安装

这里要用到scapy,所以要先安装pip install scapy,后来遇到如下报错:

ValueError: Unknown pypcap network interface '\\Device\\NPF_Loopback'

上网搜了下,在windows上运行scapy还需要安装npcap

于是下载npcap,地址:/npcap/windows-10.html

0x02 scapy模块学习笔记

1. 生成数据包

生成一个发往192.168.8.1的数据包

ip = IP(dst="192.168.8.1")

Scapy采用分层的形式来构造数据包,通常最下面的一个协议为Ether,然后是IP,在之后是TCP或者UDP。例如:

生成HTTP包:IP() / TCP() / "GET/HTTP/1.0\r\n\r\n"

生成一个icmp数据包:IP(dst=ip, ttl=64, id=ip_id) / ICMP(id=icmp_id, seq=icmp_seq) / b'rootkit'

2. 发送数据包

scapy中一共有六个发送数据包的函数,理解起来记忆很容易

第一组为sr()、sr1()、send(),其中s代表send,r代表receive,sr1()中的1代表接受一个数据包,sr()接受所有数据包,send()只发送不接收。这组函数工作在第三层

第二组为srp(),srp1(),sendp(),每个都在前一个的基础上加了一个p,代表只发送第二层的包

sr()接受所有包需要两个参数

>>> anx,unans=sr(IP(dst="192.168.8.1")/ICMP())Begin emission:Finished sending 1 packets....*Received 4 packets, got 1 answers, remaining 0 packets#############################################Received表示接收到的数据包数量answers表示目标应答数据包通过2个参数保存sr返回值一个是发出的数据包,一个是接收的数据包anx,unans=sr(IP(dst="192.168.43.135")/ICMP())通过anx.summary()查看两个包的内容

sr1()只接收一个包,一个参数就够了

>>> packet=sr1(IP(dst="192.168.8.1")/ICMP())Begin emission:Finished sending 1 packets....*Received 4 packets, got 1 answers, remaining 0 packets

0x03 脚本编写

果然安装好之后就没有报错了,脚本如下:

#!/usr/bin/python# coding:utf-8from scapy.all import *from random import randintfrom argparse import ArgumentParserdef Scan(ip):ip_id = randint(1, 65535)icmp_id = randint(1, 65535)icmp_seq = randint(1, 65535)packet = IP(dst=ip, ttl=64, id=ip_id) / ICMP(id=icmp_id, seq=icmp_seq) / b'rootkit'result = sr1(packet, timeout=1, verbose=False)if result:for rcv in result:scan_ip = rcv[IP].srcprint(scan_ip + '--->' 'Host is up')else:print(ip + '--->' 'host is down')def scan(ip):ip_id = randint(1, 65535)icmp_id = randint(1, 65535)icmp_seq = randint(1, 65535)packet = IP(dst=ip, ttl=64, id=ip_id) / ICMP(id=icmp_id, seq=icmp_seq) / b'rootkit'result = sr1(packet, timeout=1, verbose=False)if result:for rcv in result:scan_ip = rcv[IP].srcprint(scan_ip + '-->' 'host is up')else:print(ip + 'host is down')def main():parse = ArgumentParser()parse.add_argument("-u", "--url", dest="url", type=str, help="要转换为域名的ip")url = parse.parse_args().urlprint("Scan report for " + url.strip() + "\n")if '-' in url.strip():for i in range(int(url.strip().split('-')[0].split('.')[3]), int(url.strip().split('-')[1]) + 1):Scan(url.strip().split('.')[0] + '.' + url.strip().split('.')[1] + '.' + url.strip().split('.')[2] + '.' + str(i))time.sleep(0.2)else:Scan(url.strip())print("\nScan finished!....\n")if __name__ == "__main__":try:main()except KeyboardInterrupt:print("interrupted by user, killing all threads...")

这里我们用的是python的scapy模块来向目标发送icmp数据包,通过有无应答来判断目标主机是否开启

使用nmap模块扫描

0x01 下载nmap模块和nmap安装包

安装nmap模块(注意不是nmap是python-nmap)

pip install python-nmap

安装最新版nmap

/dist/nmap-7.80-setup.exe

0x02 nmap模块学习笔记

这一部分学习自:/qq_36119192/article/details/83717690

portScanner()类

portScanner()类用于实现对指定主机进行端口扫描

nmScan=nmap.PortScanner() #实例化

scan( host , port , args )方法:以指定方式扫描指定主机或网段的指定端口

参数:

host : 要扫描的主机或网段,可以是一个单独的ip:192.168.10.10 ;也可以是一个小范围网段:192.168.10.10-20 ;也可以是一个大网段:192.168.10.0/24port : 可选参数,要扫描的端口,多个端口用逗号隔开,如:20,21,22,23,24args :可选参数,要扫描的方式

import nmapnm = nmap.PortScanner()nm.scan('192.168.8.1-100', '22,21','-sV')也可以这样nm.scan(hosts='192.168.1.0/24', arguments='-n -sP -PE -PA21,23,80,3389')

command_line()方法:返回的扫描方法映射到具体的nmap命令行,也就是我们上面执行的nm.scan()命令,对应的具体的nmap的命令

import nmapnm = nmap.PortScanner()nm.scan('192.168.8.1-100', '22,21','-sV')a=mand_line()print(a)###########################nmap -oX - -p 20,21 -sV 192.168.125.134

scaninfo()方法:返回nmap扫描信息,格式为字典类型

import nmapnm = nmap.PortScanner()nm.scan('192.168.8.11-100', '22,21','-sV')a=nm.scaninfo()print(a)###########################{'tcp': {'services': '20-21', 'method': 'syn'}}

all_hosts()方法:返回nmap扫描的主机清单,格式为列表类型

```pythonimport nmapnm = nmap.PortScanner()nm.scan('192.168.10.10-12', '22,21','-sV')####################################################['192.168.10.10','192.168.10.11','192.168.10.12']

0x03 脚本编写

# -*- coding: utf-8 -*-import nmapimport optparsedef NmapScan(targetIP):nm = nmap.PortScanner()try:result = nm.scan(hosts=targetIP, arguments='-sn -PE')state = result['scan'][targetIP]['status']['state']print("[{}] is [{}]".format(targetIP, state))except Exception as e:passif __name__ == '__main__':parser = optparse.OptionParser('usage: python %prog -i ip \n\n''Example: python %prog -i 192.168.1.1[192.168.1.1-100]\n')parser.add_option('-i', '--ip', dest='targetIP', default='192.168.1.1', type='string', help='target ip address')options, args = parser.parse_args()if '-' in options.targetIP:for i in range(int(options.targetIP.split('-')[0].split('.')[3]), int(options.targetIP.split('-')[1]) + 1):NmapScan(options.targetIP.split('.')[0] + '.' + options.targetIP.split('.')[1] + '.' +options.targetIP.split('.')[2] + '.' + str(i))else:NmapScan(options.targetIP)

使用

如果觉得《十一 使用python的scapy和nmap模块进行主机存活探测》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。