十一 使用python的scapy和nmap模块进行主机存活探测

使用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。例如:

数据包例子
HTTPEther()/IP(dst=“www.baidu.com”)/TCP()/“GET /index.html HTTP/1.0 \n\n”
ARPEther()/ARP(pdst=“192.168.8.12”)
ICMPIP(dst=“192.168.8.12”)/ICMP()
TCPtcp=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 ArgumentParser


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].src
            print(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].src
            print(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().url
    print("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 optparse


def 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:
        pass


if __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)

使用
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值