码迷,mamicode.com
首页 > 其他好文 > 详细

Scapy 网段中ping扫描

时间:2018-11-24 16:37:01      阅读:905      评论:0      收藏:0      [点我收藏+]

标签:sorted   处理   进程   [1]   17.1   pack   scapy   main   ack   

安装scapy

pip3 install scapy-python3

交互式ip包构造

#scapy
>>> ping = sr(IP(dst='202.100.1.1')/ICMP()/b'welcome to qytang')

>>> b = IP(dst='202.100.1.1')/ICMP()/b'welcome to qytang'

>>> b.show()

>>> ping = sr1(b)     #send and receive  1个包

>>> ping.show()

>>> ping.getlayer(ICMP).fields    #提取ICMP的头部,并把头部字段提取出来产生一个字典

>>> ping.getlayer(ICMP).fields['id']    #提取id字段


#sr()   发送三层数据包,等待接收一个或者多个数据包的响应
#sr(1)  发送三层数据包,并仅仅只等待接收一个数据包的相应
#srp()  发送二层数据包,并且等待响应
#send() 发送三层数据包,系统会自动处理路由和二层信息
#sendp()    发送二层数据包

Scapy实现ping扫描

scapy_ping_one.py 实现一个ip地址的ping

import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
from random import randint

def scapy_ping_one(host):
    id_ip = randint(1,65535)#随机产生IP_ID位
    id_ping = randint(1,65535)#随机产生Ping_ID位
    seq_ping = randint(1,65535)#随机产生Ping序列号位
    #构造Ping数据包
    packet = IP(dst = host,ttl = 64,id = id_ip)/ICMP(id = id_ping,seq = seq_ping)/b'Welcome to qytang'
    ping = sr1(packet,timeout = 2,verbose = False)#获取相应信息,超时为2秒,关闭详细信息
    #ping.show() #被调用来扫描整个网段时候最好注释起来,不然产生大量信息
    if ping:#如果又响应信息
        os._exit(3)#退出码为3

if __name__ == '__main__':
    scapy_ping_one('172.17.168.1')

scapy_ping_scan.py 实现整个网段的ping扫描

import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
import ipaddress
import time
import multiprocessing
from scapy_ping_one import scapy_ping_one
from scapy.all import *
def scapy_ping_scan(network):
    net = ipaddress.ip_network(network)
    ip_processes = {}
    for ip in net:
        ip_addr = str(ip)#读取网络中的每一个IP地址,注意需要str转换为字符串!
        ping_one = multiprocessing.Process(target = scapy_ping_one,args=(ip_addr))
        ping_one.start()
        ip_processes[ip_addr] = ping_one#产生IP与进程对应的字典
    ip_list = []
    for ip,process in ip_processes.items():
        if process.exitcode == 3:
            ip_list.append(ip)
        else:
            process.terminate()
    return sorted(ip_list)

if __name__ == '__main__':
    import time
    t = time.time()
    active_ip = scapy_ping_scan(sys.argv[1])
    print('活动IP地址如下:')
    for ip in active_ip:
        print(ip)
    t2 = time.time()
    print(t2 - t1)

Scapy 网段中ping扫描

标签:sorted   处理   进程   [1]   17.1   pack   scapy   main   ack   

原文地址:https://www.cnblogs.com/maskerk/p/10000547.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!