批量获取网络数据包文件中的IP和DNS,并对IP进行地址归属地查询

该脚本使用Scapy、requests和lxml库从网络数据包文件中提取目的IP和DNS信息,并获取IP的归属地。通过多线程处理多个文件,将境外IP和DNS信息写入文本文件,便于网络流量分析和安全监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

脚本制作原因:

        需从大量的网络数据包文件中获取数据并进行分析

脚本效果:

        可将网络数据包中的IP和DNS及IP的归属地信息写入文件中

完整代码如下:

# !/usr/bin/env python
# -*- coding: utf-8 -*-

from scapy.all import *
import requests
from lxml import etree
import os
import re
import threading


# 获取IP的归属地
def get_ip_city(ip):
    pass
    url = 'https://www.ip.cn/ip/{}.html'.format(ip)
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }
    response = requests.get(url, headers=headers).text
    # print(response)
    html = etree.HTML(response)
    city = html.xpath('//div[@id="tab0_address"]/text()')
    # print(ip, city[0])
    try:
        result = ip + ' ' + city[0]
        # print(result)
    except:
        result = ip

    return result


# 获取抓包文件的目的地址和DNS
def get_dst_addr(file):
    pcaps = rdpcap(file)
    # print(len(pcaps))
    # print(pcaps[0]['IP'].src)
    dst_addr_list = []
    dns_list = []
    for i in range(0, len(pcaps)):
        # print(pcaps[i]['IP'].src)
        dst_addr = pcaps[i]['IP'].dst
        if dst_addr not in dst_addr_list:
            dst_addr_list.append(dst_addr)
        try:
            dns = pcaps[i]['DNS']['DNS Question Record'].qname.decode('utf-8').strip('.')
            if dns not in dns_list:
                dns_list.append(dns)

        except:
            pass

    # return dst_addr_list
    return [dst_addr_list, dns_list]


# 将数据写入文本
def save_file(file, message):
    fn = file + '.txt'
    with open(fn, 'wb') as f:
        f.write(message.encode('utf-8'))
        print('{}保存成功'.format(fn))


# 主程序,调用save_file、get_dst_addr、get_ip_city三个函数
def main(f, root):
    pattern_txt = re.compile(r'\.txt$')
    pattern_foreign = re.compile(r'中国|内网')
    if not pattern_txt.search(f):
        message = '访问地址:\n'
        file = os.path.join(root, f)

        ip_dns_list = get_dst_addr(file)

        foreign_iplist = ''
        for ip in ip_dns_list[0]:
            info = get_ip_city(ip) + '\n'

            if not pattern_foreign.search(info):
                foreign_iplist += info
            message = message + info

        if len(ip_dns_list[1]) == 0:
            pass
            dns_info = ''
        else:
            dns_info = '\n'.join(ip_dns_list[1])
        if foreign_iplist != '':
            print('------------{}出现境外IP---'.format(file))
        message += '\n所使用协议:tcp\n\n分析结果:\n\n访问境外IP:\n{}\n\n访问域名:\n{}'.format(foreign_iplist, dns_info)
        save_file(file, message)


if __name__ == '__main__':
    threads = []
    # 存放网络数据包的文件目录
    sdir = 'E:\\工作资料\\行为分析\\2021.9.7\\2'
    for root, dirs, files in os.walk(sdir):

        message = '访问地址:\n'
        for f in files:
            th = threading.Thread(target=main, args=(f, root))
            th.start()
            threads.append(th)
            time.sleep(2)

        for th in threads:
            th.join()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值