文章目录
使用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模块进行主机存活探测》对你有帮助,请点赞、收藏,并留下你的观点哦!