十一 使用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,地址:https://nmap.org/npcap/windows-10.html
0x02 scapy模块学习笔记
1. 生成数据包
生成一个发往192.168.8.1的数据包
ip = IP(dst="192.168.8.1")
Scapy采用分层的形式来构造数据包,通常最下面的一个协议为Ether,然后是IP,在之后是TCP或者UDP。例如:
数据包 | 例子 | |
---|---|---|
HTTP | Ether()/IP(dst=“www.baidu.com”)/TCP()/“GET /index.html HTTP/1.0 \n\n” | |
ARP | Ether()/ARP(pdst=“192.168.8.12”) | |
ICMP | IP(dst=“192.168.8.12”)/ICMP() | |
TCP | tcp=IP(dst=“192.168.8.12”)/TCP(dport=80,flags=“S”) | |
生成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-8
from scapy.all import *
from random import randint
from 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
https://nmap.org/dist/nmap-7.80-setup.exe
0x02 nmap模块学习笔记
这一部分学习自:https://blog.csdn.net/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/24
- port : 可选参数,要扫描的端口,多个端口用逗号隔开,如:20,21,22,23,24
- args :可选参数,要扫描的方式
import nmap
nm = 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 nmap
nm = nmap.PortScanner()
nm.scan('192.168.8.1-100', '22,21','-sV')
a=nm.command_line()
print(a)
###########################
nmap -oX - -p 20,21 -sV 192.168.125.134
scaninfo()
方法:返回nmap扫描信息,格式为字典类型
import nmap
nm = 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扫描的主机清单,格式为列表类型
```python
import nmap
nm = 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 nmap
import 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模块进行主机存活探测相关推荐
- 利用ICMP协议,使用python原始套接字实现主机存活探测工具
一.课题概述. 一学期一次的课程设计终于开始了(停课两周,马上放寒假了,哈哈哈哈哈哈...)这次我们课程设计的科目是计算机协议,我们小组抽到的题目是利用ICMP模仿ping命令写一个主机存活探测的工具 ...
- Python中Scapy网络嗅探模块的使用
目录 Scapy scapy的安装和使用 发包 发包和收包 抓包 将抓取到的数据包保存
- [批量主机存活扫描工具scanhost]扫描主机存活[python版本,非nmap版本]
地址: http://blog.csdn.net/hujkay 作者:Jekkay Hu(34538980@qq.com) 关键词:主机扫描,主机存活,纯python版本,非nmap 时间: 2014 ...
- 使用python的scapy库,提供一个可用的通过nbns获取主机名称的示例代码
以下是使用python的scapy库通过NBNS获取主机名称的示例代码: from scapy.layers.inet import IP, UDP from scapy.layers.dns imp ...
- python扫描器_7.python实现高效端口扫描器之nmap模块
对于端口扫描,使用的最多的就是nmap这个工具,不想python已经强大到,提供了nmap这个扫描端口的模块. 本片文章主要介绍nmap模块的两个常用类: PortScanner()类,实现一个nma ...
- 7.python实现高效端口扫描器之nmap模块
对于端口扫描,使用的最多的就是nmap这个工具,不想python已经强大到,提供了nmap这个扫描端口的模块. 本片文章主要介绍nmap模块的两个常用类: PortScanner()类,实现一个nma ...
- python nmap模块详解_python中的Nmap模块问题
我已经安装了nmap.exe文件以及nmap模块.但我不确定如何配置nmap路径. 输入nmap路径的代码块如下所示class PortScanner(object): ""&qu ...
- 使用python调用nmap模块实现端口扫描
使用python调用nmap模块实现端口扫描 安装python-nmap模块 pip3 install python-nmapPortScanner()类,实现一个nmap工具的端口扫描功能封装; 代 ...
- python时间戳_Python-强大的模块功能库-No11
<Python真好玩,教孩子学编程>小挑战[转载] 第十一章,强大的模块功能库书籍<Python真好玩,教孩子学编程> 书中详细充实地讲解了模块和命名空间,和通过Python在 ...
最新文章
- cannot find package “github.com/json-iterator/go“cannot find package “github.com/modern-go/reflect2“
- 用python操作mysql数据库(之“更新”操作)
- C++实现Hash表
- mysql case break_按月转移日志表中日志时,mysql总是报‘MySQL server has gone away’这样的错!...
- sql横着连接起来sql_SQL联接的简要介绍(到目前为止)
- leetcode 649. Dota2 参议院(贪心算法)
- Leetcode016 3Sum Closest
- Java学习路线,你值得了解
- 异步处理老司机:IntentService 源码分析
- 马尔科夫链(Markov Chain, MC)算法详解及Python实现
- 使用Python把BT种子转化为磁力链接
- 使用Photoshop画一个圆锥体
- windows 7编辑启动菜单 bcdedit linux,bcdedit用法详解 windows7/vista启动修改
- 找出列表中最大或最小的元素-python3
- oCPC实践录 | 摸石头过河,oCPC先跑起来再说
- [Jupyter Notebook]导出好看的中文PDF
- twitter全自动发推_如何阻止Twitter视频自动播放
- 微信运动刷步教程 QQ健康刷步数(一)之安卓版本 - 乐运动
- 「实验性讲稿」载谭 Binomial Sums 详解
- Visual Studio 2019 下载地址