学习Python渗透第十一天:用Python对漏洞进行渗透

黑客发现和利用漏洞的过程

我们将会用实例来了解黑客发现和利用漏洞的过程,以及黑客最常用的一个工具,Nmap的使用方式,因为kali Linux安装了这个工具,所以我们会在vmwware虚拟机中进行我们的实验过程。

用Nmap识别目标操作系统类型和安装的应用程序

我们模拟黑客进行信息搜集,但是黑客一般是不会接触到靶机,只能通过远程扫描的方式来完成信息搜集,而信息搜集中目标操作系统是一个很重要的信息,知道目标操作系统之后,就可以大大的减少工作量,因为就相当于知道了这个操作系统的常见漏洞。但是并没有一种工具可以提供绝对准确的远程操作系统信息,几乎所有的工具都是使用了一种“猜”的方式,当然这不是凭空猜测,而是向目标机器发送探针,然后根据目标设备的回应来猜测操作系统类型。这个探针多数是以TCP数据包和UDP数据包的形式发送的,检查的细节包括初始序列号(ISN),TCO选项,IP标识符,数字时间戳,显示拥塞通知(ECN),窗口大小等等。不同类型的操作系统对这些探针都会做出不同的响应,这些工具把这些响应中的特征提取出来,并大都将这些特征记录在一个数据库中,这就是Nmap的识别原理。

如果我们要对目标操作系统进行扫描,就可以使用如下命令,因为Nmap需要root权限,所以前面加上sudo 

sudo nmap -O 目标IP地址

比起操作系统,那些安装在操作系统之上的软件更是网络安全的重灾区,所以在对目标设备进行渗透测试的时候,要尽量检测出目标操作系统上的各种软件。使用nmap中的-sV参数

sudo nmap -sV 目标IP地址

使用Python识别操作系统和安装的应用程序

那么我们要怎样使用Python来实现这些功能呢,不用怕,python中也有nmap模块,而python-namp模块中的核心就是PortsScanner,PortScannerAsync,PortScannerError,PortScannerHostDict,PortScannerYied这五类,其中最为重要的就是PortScanner类。

这个类可以实现Nmap工具功能的封装,对这个类进行实例化很简单,只需要如下语句即可实现。

如果自己的编译器上没有nmap这个模块的需要先下载:pip install python-nmap

import nmap

nmap.PortScanner()

PortScannerAsync类和PortScanner类的功能类似,但是这个类可以实现异步扫描,这个类的实例化语句如下

nmap.PortScannerAsync()

首先我们来看PortScanner这个类,这个类包含了如下几个函数:

scan()函数:这个函数的完整形式是scan(self,hosts='127.0.0.1',port = None,arguments='-sV',sudo=False)用来对指定目标设备进行扫描,其中需要设置的三个参数为host,ports和arguments,参数hosts是一个字符串,表示要扫描的目标设备,可以是IP地址也可以是域名,ports的值也是一个字符串,表示要扫描的端口,可以扫描单个,如"80",也可以扫描多个,如"22,21,80",如果是一个范围,形式为“1-100”,参数arguments也是字符串,这个参数实际上就是Nmap扫描时用的参数,例如"-O -sV -sP -sT -sS"等等,表示对目标设备进行ping主机在线扫描,-sS表示对目标设备进行一个TCP半开类型的端口扫描,-O表示扫描目标设备的操作系统类型,-sV表示扫描目标设备上所安装的网络服务软件的版本。

如果要对192.168.1.101的1-100的端口进行一次TCP半开扫描,可以使用以下代码:

import nmap

nm=nmap.PortScanner()
nm.scan('192.168.1.101','1-100','-sS')

all_host会返回一个被扫描的所有设备的列表,command_line()函数会返回在当前扫描中使用的命令行,如nmap -oX -p 1-100 -sS 192.168.1.101,csv()函数的返回值是一个CSV文件的输出,has_host(self,host)函数会检查是否有对主机的扫描结果,如果有则返回True,否则返回False,scaninfo()会列出一个扫描信息的结构。

PortScannerAsync类中最为重要的函数也是scan(),该函数的用法与PortScanner类中的scan()函数基本一致,只是多了一个回调函数,完整的scan()函数格式为scan(self,host='127.0.0.1',port =None,arguments = '-sV',callback =None,sudo=False)

现在我们了解了python-nmap模块的使用方法了,接下来就可以使用这个模块来编写一个简单的端口扫描程序,该程序实现对目标端口的TCP扫描,nmap默认使用的就是半开连接,所以无需添加Nmap参数。

import nmap

target = '192.168.1.1'
port = '80'
nm = nmap.PortScanner()
nm.scan(target,port)
for host in nm.all_hosts():
    print("----------------------------------")
    print('host : {0} {{1}}'.format(host,nm[host].hostname()))
    print('state : {0}'.format(nm[host].state()))
    for proto in nm[host].all_protocols():
        print('---------------')
        print('Protocol : {0}'.format(proto))
        lport = list(nm[host][proto].keys())
        lport.sort()
        for port in lport:
            print('port : {0}\tstate : {1}'.format(port,nm[host][proto][port]['state']))

使用python-nmap模块识别目标设备安装的应用程序

使用python-nmap模块识别目标设备安装的应用程序的过程很简单,核心语句变成nm.scan(target,port,'-sV'),关键是对扫描结果的处理,扫描之后得到的每一台设备的信息都是一个字典文件,字典文件中有较为重要的几项,分别是:

address:用来存储设备的IP地址

hostname:用来存储设备的名称

osmatch:用来存储设备的操作系统信息

portuserd:用来存储设备的端口信息(开放或者关闭)

status:用来存储设备的状态(活跃或者非活跃)

tcp:用来存储端口的详细信息(例如状态,运行的服务和提供服务的软件版本)

如果我们需要从扫描的结果中找出127,0,0,1的80端口上运行的服务的信息,就可以使用nm[127.0.0.1][tcp][80]['product']

import nmap

target = '192.168.1.1'
port = '80'
nm = nmap.PortScanner()
nm.scan(target,port,"-sV")
for host in nm.all_hosts():
    print("----------------------------------")
    print('host : {0} {{1}}'.format(host,nm[host].hostname()))
    print('state : {0}'.format(nm[host].state()))
    for proto in nm[host].all_protocols():
        print('---------------')
        print('Protocol : {0}'.format(proto))
        lport = list(nm[host][proto].keys())
        lport.sort()
        for port in lport:
            print('port : %s \tproduct : %s \tversion : %s'%(port,nm[host][proto][port]['product'],nm[host][proto][port]['version']))

使用python-nmap模块识别目标操作设备:

很多人一直认为获取远程主机的操作系统信息是一件很简单的事情,因为在他们的印象中,世界上只有那么几种操作系统,但是对于目标操作系统的扫描是一件极为复杂的事情,因为这个世界上的操作系统的数目远比我们想象的多得多。目前远程对操作系统进行检测发方法一般可以分为两类:

被动式方法:这种方法通过抓包工具来收集流经网络的数据包,再从这些数据包中分析出目标设备的操作系统信息:

主动式方法:向目标设备发送特定的数据包,目标设备一般会对这些数据包作出回应,我们对这些回应做出分析,很有可能得知目标操作系统信息,这些信息可以是正常的网络程序,如Telent,FTP等与设备交互时产生的数据包,也可以是游戏额经过精心构造的正常或残缺数据包。

p0f就是一款典型的被动式扫描工具,p0f可以自动捕获网络中通信的数据包,并对其进行分析,对于主动式方法,我们可以采用向目标设备发送数据包的方式来检测,这里我们使用nmap库编写一个主动式扫描程序。

这里我们使用的扫描参数是-O,扫描出来的结果是一个字典osmatcg,他跟前面扫描得到的字典有类似处,它也包括了几个重要的值,accuracy,line,osclass3个键,osclass中包含了关键信息,它本身也是一个字典类型,其中包含了accuracy(匹配度),cpe(通用平台枚举),osfamily(系统识别),osgen(第几代操作系统),type(设备类型),vender(生产厂家)六个键,下面给出完整的程序:

import nmap 
target = "192.168.1.1"
nm = nmap.PortScanner()
nm.scan(target,arguments="-O")
if 'osmatch' in nm[target]:
    for osmatch in nm[target]['osmatch']:
        print('OsMatch.name : {0}'.format(osmatch['name']))
        print('OsMatch.accuracy : {0}'.format(osmatch['accuracy']))
        print('OsMatch.line : {0}'.format(osmatch['line']))
        if 'osclass' in osmatch:
            for osclass in osmatch['osclass']:
                print('OsMatch.type : {0}'.format(osmatch['type']))
                print('OsMatch.vendor : {0}'.format(osmatch['vendor']))
                print('OsMatch.osfamily : {0}'.format(osmatch['osfamily']))
                print('OsMatch.osgen : {0}'.format(osmatch['osgen']))
                print('OsMatch.accuracy : {0}'.format(osmatch['accuracy']))

今天的学习分享就到这里啦,如果有什么不对欢迎大家的指出,谢谢大家的观看。

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值