0x01 基础概念

ICMP(Internet control Message Protocal)Internet报文协议,是TCP/IP的一种子协议,属于网络层协议,其目的是用于在IP主机、路由器之间传递控制信息

0x02 程序

程序

# -*- coding:utf-8 -*-
from scapy.all import *
from random import randint
from optparse import OptionParserdef Scan(ip):'''Scan函数通过调用ICMP,将构造好的请求包发送到目的地址,并根据目的地址的应答数据判断目标主机是否存活。存活的IP地址打印出“xx.xx.xx.xx--->Host is up",不存活的主机打印出"xx.xx.xx.xx--->Host is down"::param ip::return:'''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:pass# print(ip+'---> host is down')def main():parser = OptionParser("usage:%prog -i <target host>")#输出帮助信息parser.add_option("-i",type='string',dest='IP',help='specify target host')#获取IP地址参数options,args = parser.parse_args()print("Scan report for"+options.IP+"\n")#判断是单台主机还是多台主机#IP中存在-,说明是要扫描多台主机if '-' in options.IP:#代码举例:192.168.1.1-120#通过'-'进行分割,把192.168.1.1和120分开#把192.168.1.1通过','进行分割,取最后一个数作为range函数的start,然后把120+1作为range函数的stop#这样循环遍历出需要扫描的IP地址for i in range(int(options.IP.split('-')[0].split('.')[3]),int(options.IP.split('-')[1])+1):Scan(options.IP.split('.')[0]+'.'+options.IP.split('.')[1]+'.'+options.IP.split('.')[2]+'.'+str(i))time.sleep(0.2)else:Scan(options.IP)print("\nScan finished!...\n")if __name__ == '__main__':try:main()except KeyboardInterrupt:print("interrupted by user,killing all threads...")

结果:

0x03 分析

关于optionparser的使用
  1. 创建parser实例
  2. 使用add_option添加我们要处理的命令行参数
  3. 得到解析sys.argv后的options对象,查看用户的输入
  from optparse import OptionParserparser = OptionParser(...)parser.add_option(.....)
  • OptionParser()不要求一定要传递参数
OptionParser(usage="%prog",version="%prog 1.0",description="hello")#%prog 在这里会自动替换为程序名字#usage 可以打印用法#version 在使用%prog --version的时候输出版本信息#description 描述信息
  • add_option添加命令行参数
#action  指示optparser解析参数时候该如何处理。默认是'store',表示将命令行参数值保存options    对象里 。<br>action的值有:store,store_true,store_false,store_const,append,count,callback.
#type 默认是“string",也可以是"int","float"等
#dest 如果没有指定dest参数,将用命令行参数名来对options对象的值进行存取。
#store store可以为store_true和store_false两种形式。用于处理命令行参数后面不带值的情况。如-v,-q等命令行参数。
#default 设置默认值
#help    指定帮助文档
#metavar 提示用户期望参数
  • 最后调用parse_args()解析命令行形参
(options, args) = parser.parse_args()可以传递一个参数列表给parse_args(),否则,默认使用命令行参数(sysargv[1:])。
parse_args()返回两个值:options, 这是一个对象(optpars.Values),保存有命令行参数值。只要知道命令行参数名,如file,就可以访问其对应的值:options.file。args,一个由positional arguments组成的列表。

这里要特别注意options和args,options访问值是options.参数名,args是一个列表
例如:

from optparse import OptionParser
#创建parser实例
parser = OptionParser()
#添加参数
parser.add_option('-s','--server',dest='server',help='server ip_address')
parser.add_option('-P','--port',type='int',dest='port',help='server port')
parser.add_option('-u','--username',dest='username',help='username info')
parser.add_option('-p','--password',dest='password',help='password info')
#获取值
options,args=parser.parse_args()
print(options)
print(args)
#获取特定参数
serv = options.server
user = options.username
print(serv)
print(user)

我们命令行输入:

python test.py -s 192.168.142.145 -P 80 -u name -p 123456 111 22 333

输出结果:

这里重点看懂:

  • options获取的是哪些值?就是我们dest值以及参数值,比如-p 80,options里的值是'port':80
  • args获取的是哪些值?就是除了参数和参数值以外的,这里是['111', '22', '333'],这个是列表类型
  • 如何获取特定参数值?使用options.dest值
  • 使用OptionParser的三步骤,创建对象—》添加参数----》获取输入值

虽然我们没有添加-h,我们依然可以使用-h获取帮助文档

这里看明白,main函数基本就能看懂了,对于Scan函数,使用的是scapy模块的一些知识,可以这篇文章:
https://blog.csdn.net/qq_41683305/article/details/117436197
main主要用来获取IP地址的,并将IP地址依次传入Scan函数进行就行判断,是否存在该主机

0x04 参看文章

https://www.cnblogs.com/blacksunny/p/5315545.html

python安全攻防---信息收集---ICMP主机探测 以及optionparser的使用相关推荐

  1. python安全攻防---信息收集---whois查询

    whois是用来查询域名的IP以及所有者信息的传输协议.简单地说,whois就是一个数据库,用来查询域名是否以及被注册,以及注册域名的详细信息(如域名所有人.域名注册商等). 使用whois查询,首先 ...

  2. python安全攻防---信息收集---IP查询

    IP查询是通过当前所获得的URL去查询对应IP地址的过程,可应用Socket库函数中的gethostbyname()获取域名所对用的IP值 程序如下: # -*- coding:utf-8 -*- ' ...

  3. Web安全攻防 信息收集篇(仅供交流学习使用,请勿用于非法用途)

    Web安全攻防 准备篇 1. 信息收集 域名介绍: 域名(Domain Name),是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名 称,用于在数据传 输时标识计算机的电子方位 ...

  4. HCIE-Security Day41:理论学习:信息收集与网络探测

    ​​​​​​​ 信息收集 目的 攻击者无法攻击一个他一无所知的网络,所以网络攻击的第一步就是目标网络的信息收集. 信息收集帮助攻击者决定用什么方式展开攻击. 方法 互联网搜索.社会工程等. 从高度碎片 ...

  5. Waf攻防-信息收集漏洞发现漏洞利用权限控制

    目录 WAF的介绍 1.什么是WAF 2.WAF的分类 软件型WAF 硬件型WAF 云 WAF 网站内置的WAF 3.WAF的判断 WAF的绕过 1.信息收集 介绍 信息收集常见检测 信息收集绕过wa ...

  6. 网络攻防---信息收集----网络查点与网络监听技术

    网络查点 网络监听技术 听课笔记--<网络攻击与防御> 网络查点:根据网络扫描的结果进一步地对目标主机的服务以及系统版本等信息进行更具针对性的检测,来寻找真正可以攻击的入口,以及攻击过程中 ...

  7. python爬虫和信息收集_python爬站长之家写一个信息搜集器

    前言: 不知道写什么好,绕来绕去还是写回爬虫这一块. 之前的都爬了一遍.这次爬点好用一点的网站. 0x01: 自行备好requests模块 目标站:http://tool.chinaz.com/ 0x ...

  8. Python全栈(五)Web安全攻防之1.信息收集

    文章目录 一.Kali虚拟机安装 二.域名介绍及查询 1.域名介绍 2.域名查询方法whois web接口查询 通过whois命令行查询 3.ICP备案 三.收集子域名信息 1.域名和子域名 2.子域 ...

  9. 菜鸟渗透日记29---python渗透测试编程之信息收集1-主机发现

    目录 简述信息收集 主机状态扫描 基于ARP的活跃主机发现 ARP协议分析 利用ARP实现活跃主机的扫描python程序 基于ICMP的活跃主机发现 ICMP协议分析 利用ICMP实现活跃主机的扫描p ...

最新文章

  1. Python机器学习:训练Tesseract
  2. supervisor安装部署和使用实例
  3. SAP OData:callbackend entry point - iwfndcl_mgw_request_manager~read_entity
  4. 域名服务器(DNS)工作原理
  5. CSS Modules入门教程
  6. 哔哩哔哩n倍速播放视频
  7. Android开发,使用背景图(xml drawable)为view 设置边框
  8. Appium+Python API相关知识了解
  9. Python中的signal模块和Ctrl+C操作
  10. 【安全】Web渗透测试(全流程)
  11. 使用airdrop在iphone与ubuntu之间共享文件
  12. JSFinder自动化脚本一键批量处理URL(附自动执行脚本带whatweb筛选)
  13. 自动将视频文件生成字幕的软件autosub的替代工具字幕酱(支持英文、日语和法语、德语、韩语)
  14. Maven 详解及常用命令
  15. Java短视频直播APP源码
  16. acm:C语言程序设计:求圆柱的体积等,去除小数点后两位最后一位的四舍五入
  17. 元宇宙是什么,如何看待未来元宇宙的发展?
  18. c++输出Hello world
  19. 使用dot.tk和Sina SAE服务免费搭建自己的网站
  20. 英伟达 (Nvidia) GPU 系统管理界面(SMI)

热门文章

  1. jquery常用表单操作
  2. VirtualDOM与diff(Vue实现)
  3. 层次和约束:项目中使用vuex的3条优化方案
  4. 关于IE6.7.8.FF兼容的问题
  5. abp.event.on与abp.event.off使用
  6. Linux基础之命令练习Day2-useradd(mod,del),groupadd(mod,del),chmod,chown,
  7. R软件中 文本分析安装包 Rjava 和 Rwordseg 傻瓜式安装方法四部曲
  8. android:layout_weight属性的简单使用
  9. [转]Ubuntu远程桌面登陆
  10. dev c++ 报错[Error] ld returned 1 exit status 的解决办法