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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP文件系统-文件下载

一、网页请求和响应的过程 请求&#xff1a; 1. HTTP 1.1 协议 版本 2. 头信息&#xff0c;请求的ip&#xff0c;其他 3. 你请求的表单信息, 你提交给服务器的信息 http://localhost/one.php?aabbb&cccdd 响应&#xff1a; 1. 状态 200 ok 404 页面没找到 2. 响应头信息&a…

Java——网络编程练习

练习一(黑马程序员面试题)&#xff1a;客户端向服务器写字符串(键盘录入)&#xff0c;服务器(多线程)将字符串反转后写回&#xff0c;客户端再次读取到的是反转后的字符串 相关代码如下&#xff1a; package com.wsq.test;import java.io.BufferedReader; import java.io.Buf…

第一章 基础知识---1.4Crack小实验--复现

0x01 程序及其编译环境 程序如下&#xff0c;功能&#xff1a;我们必须输入正确的密码1234567才能得到密码验证的确认&#xff0c;跳出循环。否则程序提示密码错误再次输入。 #include <stdio.h>#define PASSWORD "1234567"int verify_password(char* passwo…

.net中调用exchange服务器发邮件

普通的邮件, 用System.Net.Mail 类 或 System.Web.Mail 类 处理即可, 但是Exchange Server 环境下, 这两个类起不了作用-------至少目前我看到的情况如此. 整个过程如下: 1. 先添加COM 引用 "Microsoft CDO for Windows 2000 Library" .2. 发送邮件的代码: CDO.Messa…

Java Double类doubleToLongBits()方法与示例

Double类doubleToLongBits()方法 (Double class doubleToLongBits() method) doubleToLongBits() method is available in java.lang package. doubleToLongBits()方法在java.lang包中可用。 doubleToLongBits() method follows IEEE 754 double floating-point standards and …

Firefox(火狐浏览器)彩蛋

①在地址栏上输入&#xff1a; about:mozilla ②在地址栏上输入&#xff1a; about:robots ③在地址栏上输入&#xff1a; www.figma.com/404/ ④地址栏上输入&#xff1a; chrome://global/content/alerts/alert.xul

jquery.history插件在ie中失效的问题

hash标志中不能有? ff中不存在这个问题。 转载于:https://www.cnblogs.com/xyun/archive/2008/12/01/1345188.html

Java——反射(Class.forName()读取配置文件举例).

榨汁机(Juicer)榨汁机的案例&#xff1a; 分别有水果(Fruit),苹果(Apple)&#xff0c;香蕉(Bananal)&#xff0c;橘子(Orange),榨汁(squeeze) 要求&#xff1a; 榨出不同的水果汁来喝 //一般方法求解 package com.testl;public class Text1 {public static void main(Strin…

java 根据类名示例化类_Java类类getEnclosingClass()方法及示例

java 根据类名示例化类类的类getEnclosingClass()方法 (Class class getEnclosingClass() method) getEnclosingClass() method is available in java.lang package. getEnclosingClass()方法在java.lang包中可用。 getEnclosingClass() method is used to return recent or im…

C++:cin.getline

转&#xff1a;百度百科 http://baike.baidu.com/view/2383876.htm cin.getline 此函数是按行读取,其语法为:cin.getline(字符指针,字符个数N,结束符); 功能是&#xff1a;一次读取多个字符(包括空白字符&#xff09;&#xff0c;直到读满N-1个&#xff0c;或者遇到指定的结束符…

端口复用和重映射--STM32F103

什么是端口复用&#xff1f; STM32中有很多内置外设&#xff0c;这些外设的引脚都是与GPIO复用的&#xff0c;什么时候复用呢&#xff1f;就是当一个GPIO作为内置外设引脚使用时&#xff0c;就叫做复用。比如串口1的发送接收引脚是PA9&#xff0c;PA10&#xff0c;当PA9&#…

考研数学

眼前俨然一副冬的气象&#xff0c;伴随气温的骤降&#xff0c;考研复习也进入异常紧张的阶段。在考试前这两个月里&#xff0c;考生如何复习数学&#xff0c;成绩还可以有所提高。万学?海文数学教研组针对冲刺阶段数学复习归纳总结以下复习经验和建议&#xff0c;供大家参考。…

一个很好的自学网站~推荐一下

http://www.51zxw.net/study.asp?vip15746908

[转]Ubuntu远程桌面登陆

原文地址&#xff1a;http://www.cnblogs.com/xdzone/archive/2011/03/10/1979644.html 1.xp下默认的远程桌面协议是rdp&#xff0c;默认端口3389&#xff0c;而ubuntu用的时vnc&#xff1a;默认端口5900 2.首先被访问的主机&#xff08;windows/linux&#xff09;都要设置为允…

NVIC中断管理---STM32

NVIC&#xff1a;嵌套向量中断控制器 在了解中断之前&#xff0c;我们先了解抢占优先级和响应优先级 抢占优先级和响应优先级 抢占优先级决定能不能打断&#xff0c;高优先级的抢占可以中断低优先级的抢占响应优先级在抢占优先级相同时&#xff0c;高响应优先级先执行&#x…

Java BigDecimal stripTrailingZeros()方法与示例

BigDecimal类stripTrailingZeros()方法 (BigDecimal Class stripTrailingZeros() method) stripTrailingZeros() method is available in java.math package. stripTrailingZeros()方法在java.math包中可用。 stripTrailingZeros() method is used to get a BigDecimal that is…

外部中断---STM32F1

外部中断概述 STM32的中断控制器支持19个外部中断/事件请求&#xff1a; 线0-15&#xff1a;对应外部IO口的输入中断线16&#xff1a;连接到PVD输出线17&#xff1a;连接到RTC闹钟事件线18&#xff1a;连接到USB唤醒事件 STM32每个IO口都有可以作为外部中断输入&#xff0c;…

转:点9图

关于”点九” 转&#xff1a;http://mux.baidu.com/?p1506“点九”是andriod平台的应用软件开发里的一种特殊的图片形式&#xff0c;文件扩展名为&#xff1a;.9.png 智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向…

Python HTMLCalendar类| 带实例的formatyear()方法

Python HTMLCalendar.formatyear()方法 (Python HTMLCalendar.formatyear() Method) formatyear() method is an inbuilt method of the HTMLCalendar class of calendar module in Python. It works on HTMLCalendar class object and returns an HTML table consisting of th…

2009中国企业家新春联谊会

2009中国企业家新春联谊会——把握当前机遇&#xff0c;笑对经济危机&#xff0c;畅饮将帅美酒尊敬的嘉宾&#xff1a;当前&#xff0c;国际形势正在发生深刻而复杂的变化&#xff0c;由美国次贷危机引发的全球经济危机已经愈演愈烈&#xff0c;美国前五大投资银行有3家宣告破产…