社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

渗透测试中批量处理数据的python脚本

白帽子左一 • 3 年前 • 511 次点击  

从零基础学渗透,领取配套视频

#统统可白嫖#

扫码找小助理白嫖渗透资料

学习大佬的思路技巧





作者:goatest 

原文地址:http://33h.co/91v11


一、前言


由于在渗透测试和企业安全自查过程中,经常会涉及到批量数据处理,之前有写过python脚本处理,但是需要每次调整代码对应不同的情况

于是经过不断改进,直接编写了一版具备较强健壮性的python脚本再次遇到批量数据处理,直接运行python脚本,选择参数即可,不需要手动调试代码。

脚本包含功能:json数据转excel文件,自定义正则表达式提取批量数据,两个excel文件进行数据匹配,批量数据的编码解码等。

二、环境准备

import re
import openpyxl
from openpyxl import Workbook
import base64
from urllib import parse
import pypinyin

执行脚本提示缺少模块,使用命令‘pip install 模块名’  或 ‘pip3 install 模块名’即可。


三、功能实现

功能分类

1 json2excel() #从一串josn{}{}中获取到想要的结果,可匹配任意数量的变量,并写入指定的excel文件中
2 re2excel() #从文本中使用正则表达式筛选出信息到excel文件中,正则表达式需自定义
3 excel2_pipei() #匹配两个excel,以key为匹配参数从excel2中检索信息填写在excel1的某一列中
4 encode_decode() #对单条数据或多条数据进行编码解码处理,包含base64,url,unicode,拼音处理


3.1 json2excel()

从一串josn{}{}中获取到想要的结果,可匹配任意数量的变量,并写入指定的excel文件中。


使用场景:

通常用于批量数据处理分析、暴力破解快速获得用户名使用。


示例json数据:

{"rows":[{"Id":3170,"UserName":"test1","CreateDate":"2021-11-12 14:34","RoleName":"测试","RoleId":183},{"Id":3172,"UserName":"user2","CreateDate":"2021-11-12 14:34","RoleName":"测试","RoleId":183},{"Id":3173,"UserName":"user3","CreateDate":"2021-11-12 14:34","RoleName":"测试","RoleId":183},{"Id":3174,"UserName":"user4","CreateDate":"2021-11-12 14:34","RoleName":"测试","RoleId":183},{"Id":3175,"UserName":"user5","CreateDate":"2021-11-12 14:34","RoleName":"测试","RoleId":183},{"Id":3185,"UserName":"user6","CreateDate":"2021-11-12 14:34","RoleName":"测试","RoleId":183}]}

使用方法1-全部提取:


处理结果:


使用方法2-部分提取:

当json数据中一条数据参数过多,而你只想提取某个参数时,使用该方法


处理结果:

3.2 re2excel()

从文本中使用正则表达式筛选出信息到excel文件中,正则表达式需自定义


使用场景:

对于非json数据,如需批量获得具有类似数据的值,可使用该方法处理,需具备一定正则表达式的知识。


示例处理数据:


  • 机器学习(72)


  • 人工智能(64)


  • 前端(21)

  • 使用方法:

    由于在cmd下直接输入正则表达式容易误输入中文字符,建议现在notepad++上尝试是否能匹配到。


    处理结果:



    3.3 excel2_pipei()

    匹配两个excel,以key为匹配参数从excel2中检索信息填写在excel1的某一列中。


    使用场景:

    excel1保存了id、username,excel2保存了id、password,可使用该方法将两个excel的数据进行匹配,获得比较全的数据,在企业自测口令安全中使用较多。


    示例数据


    使用方法:


    处理结果:

    3.4 encode_decode()

    对单条数据或多条数据进行编码解码处理,包含base64,url,unicode,拼音处理


    使用场景:

    处于内网环境,无法在线使用编码解码工具,根据姓名输出可能的密码字典


    使用方法1-base64编码解码处理:


    使用方法2-url编码解码处理:


    使用方法3-Unicode编码解码处理:


    使用方法4-拼音全拼简拼处理:


    使用方法5-循环输入单条数据:


    使用方法6-从文本中读取批量数据处理:

    3.5 整体使用

    使用方法:命令台下执行‘python tool_tool.py’ or 'python3 tool_tool.py'


    四、源代码


    由于本人为非专业的开发人员,代码实现上可能会较为繁琐,仅为实现相关功能。


    代码上已实现输入参数的校验及循环输入,输出文件保存错误提示,代码小白也可以正常使用,具备较好的友好性。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # author:goat time:2021/11/15


    '''
    基础函数
    1 text2list() #从text中读取数据并返回一个list
    2 list2text() #把list转化为text,可指定间隔符
    3 listll2excel() #把list[][]按行写入excel
    4 excel2listll() #把excel转换为list[][]
    5 base64_url() #base64/url编码解码
    6 pinyin_list2str() #把字符串进行base64/url等编码解码处理
    7 encode_decode_io() #循环监听输入的处理方式,直到输入正确
    '''

    import re
    import openpyxl
    from openpyxl import Workbook
    import base64
    from urllib import parse
    import pypinyin

    '''
    从text中读取数据并返回一个list
    '''


    def text2list(text_path):
    l = []
    with open(text_path, encoding='utf-8') as f:
    text = f.read()
    for l1 in re.split(r'[\s\n,;]+', text): # 以文本中空格,回车,逗号,顿号为切割符处理
    l.append(l1)
    return l


    '''
    把list转化为text,可指定间隔符
    '''


    def list2text(l, text_path, tag):
    with open(text_path, 'w', encoding='utf-8') as f:
    for i in l:
    f.write(str(i) + tag)


    '''
    把二层list[][]按行写入excel
    '''


    def listll2excel(ll, excel_path):
    wb = Workbook()
    ws = wb.active
    for x in ll:
    ws.append(x)
    wb.save(excel_path)


    '''
    把excel转换为list[][]
    '''


    def excel2listll(excel_path, sheet_index=0):
    wb = openpyxl.load_workbook(excel_path)
    ws = wb[wb.sheetnames[sheet_index]]
    total_list = []
    for row in ws.rows: # ws.rows是一个生成器
    row_list = []
    for cell in row: # 直接从行中取每个cell
    row_list.append(cell.value)
    total_list.append(row_list)
    return total_list


    '''
    把pinyin处理的多层list提取出来处理为一个字符串
    '''


    def pinyin_list2str(ll, level):
    s = ''
    if level == 0:
    for x in ll:
    s = s + x[0]
    elif level == 1:
    for x in ll:
    s = s + x[0][0]
    else:
    s = '处理错误'
    return s


    '''
    把字符串进行base64/url等编码解码处理
    '''


    def base64_url(s, k):
    if k == '00': # base64编码
    x = base64.b64encode(s.encode('utf-8')).decode('utf-8')
    elif k == '01': # base64解码
    x = base64.b64decode(s.encode('utf-8')).decode('utf-8')
    elif k == '10': # url编码
    x = parse.quote(s)
    elif k == '11': # url解码
    x = parse.unquote(s)
    elif k == '20': # unicode编码
    x = s.encode('unicode_escape').decode('utf-8')
    elif k == '21': # unicode解码
    x = s.encode('utf-8').decode('unicode_escape')
    elif k == '30': # 拼音全拼输出
    x = pinyin_list2str(pypinyin.pinyin(s, style=pypinyin.NORMAL), 0)
    elif k == '31': # 拼音首字母输出
    x = pinyin_list2str(pypinyin.pinyin(s, style=pypinyin.NORMAL), 1)
    else:
    x = '测试处理参数输入信息错误!'
    return x


    '''
    循环监听输入的处理方式,直到输入正确
    '''


    def encode_decode_io():
    global k
    print('base64编码:00,base64解码:01; url编码:10,url解码:11; unicode编码:20,unicode解码:21;拼音全拼输出:30,拼音首字母输出:31; 输入end返回上一级')
    in_k = input("请输入处理方法>>>")
    if in_k in ['00', '01', '10', '11', '20', '21', '30', '31']:
    k = in_k
    elif in_k == 'end':
    main()
    else:
    print("参数选取错误!")
    encode_decode_io() # 自循环等待输入成功


    message = '''
    对数据进行批量加工处理,输入序号选择

    1 json2excel() #从一串josn{}{}中获取到想要的结果,可匹配任意数量的变量,并写入指定的excel文件中
    2 re2excel() #从文本中使用正则表达式筛选出信息到excel文件中,正则表达式需自定义
    3 excel2_pipei() #匹配两个excel,以key为匹配参数从excel2中检索信息填写在excel1的某一列中
    4 encode_decode() #对单条数据或多条数据进行编码解码处理,包含base64,url,unicode,拼音处理
    '''

    '''
    从一串josn{}{}中获取到想要的结果,可匹配任意数量的变量,并写入指定excel文件中
    '''


    def json2excel():
    path_du = input("请输入要读取的json文件地址,同路径下直接输入文件名,或输入绝对或相对路径>>>")
    with open(path_du, 'r', encoding='utf-8') as f: # 读取
    s = f.read()
    list_xuqiu = [] # 保存需提取的值
    json_key = re.findall('{.*?\[({.*?})', s, re.S) # 获取第一个{}
    list_xuqiu = re.findall('"([a-zA-Z0-9]+)":', json_key[0], re.S) # 获取key值
    print("自动识别json数据为:", list_xuqiu)
    auto = input("提取部分参数输入0,全部提取输入任意值>>>")
    if auto == '0':
    list_xuqiu = [] # 手动提取时先置空
    while True == True:
    xuqiu = input("请输入需要匹配的参数,输入0结束>>>")
    if xuqiu != '0':
    list_xuqiu.append(xuqiu)
    else:
    break
    elif auto == '1':
    pass
    print("提取数据为:", list_xuqiu)
    list_xuqiu_compile = []
    for i in range(len(list_xuqiu)):
    list_xuqiu_compile.append(re.compile(str(list_xuqiu[i] + '\":(.*?)[,}]'), re.S))
    # print(list_xuqiu_compile)#查看匹配集合是否出问题
    c = re.compile('{.*?}', re.S) # 定位每个框
    results = re.findall(c, s)
    # print(results)#查看{}返回结果
    path_xie = input("请输入需要输出的excel文件名称,如1.xlsx>>>")
    ll_result = [] # 获取到的结果记录在ll_result中
    ll_result.append(list_xuqiu) # 把需求参数添加,后续写在excel的第一行
    for result in results: # 遍历每个框
    l_result = []
    for cc in list_xuqiu_compile: # 遍历寻找几个值
    ccc = re.findall(cc, result)
    if ccc:
    l_result.append(re.sub(r'[\"]', '', ccc[0])) # 去除“”包裹
    else:
    l_result.append('无')
    ll_result.append(l_result)
    # print(ll_result)
    listll2excel(ll_result, path_xie)
    print("写入完成,请查看同目录下文件")


    '''
    从文本中使用正则表达式筛选出信息到excel文件中,正则表达式需自定义
    '''


    def re2excel():
    path_du = input("请输入要读取的文件地址,同路径下直接输入文件名,或输入绝对或相对路径>>>")
    with open(path_du, 'r', encoding='utf-8') as f: # 读取
    s = f.read()
    str_re = input("请输入自定义正则表达式,请注意中英文字符,建议先在notepad++单条查询尝试>>>")
    c = re.compile(str_re, re.S)
    results = re.findall(c, s)
    # print(results)#查看{}返回结果
    path_xie = input("请输入需要输出的excel文件名称,如1.xlsx>>>")
    try:
    listll2excel(results, path_xie)
    print("写入完成,请查看同目录下文件")
    except:
    print("保存失败,请确认同名文件未被打开")


    '''
    匹配两个excel,以key为匹配参数从excel2中检索信息填写在excel1的某一列中
    '''


    def excel2_pipei():
    print("---\n比如1.xlsx保存了'id','name',2.xlsx保存了'id','passwd',则可以将2.xlsx的passwd信息写入1.xlsx的某一列\n---")
    excel_path1 = input("请输入需写入信息的excel文件地址,同路径下直接输入文件名,或输入绝对或相对路径>>>")
    l1_key = input("请输入excel-key所在的列,如第一列输入1>>>")
    l1_value = input("请输入excel被写入的列值,如第二列输入2>>>")
    l1 = [int(l1_key), int(l1_value)]
    wb = openpyxl.load_workbook(excel_path1)
    ws = wb[wb.sheetnames[0]]
    excel_path2 = input("请输入需提取信息的excel文件地址,同路径下直接输入文件名,或输入绝对或相对路径>>>")
    l2_key = input("请输入excel-key所在的列,如第一列输入1>>>")
    l2_value = input("请输入需提取的值所在的列,如第二列输入2>>>")
    l2 = [int(l2_key), int(l2_value)]
    ll = excel2listll(excel_path2)
    dict_index = {}
    for x in ll:
    key_s = str(x[l2[0] - 1]).strip() # .strip()去除前后空格
    value_s = str(x[l2[1] - 1])
    dict_index[key_s] = value_s
    # print(dict_index.keys())
    for r in range(1, ws.max_row + 1):
    key_ss = str(ws.cell(r, l1[0]).value).strip()
    if key_ss in dict_index.keys():
    ws.cell(r, l1[1]).value = str(dict_index[key_ss])
    # print(key_ss,dict_index[key_ss])
    else:
    pass
    # print(key_ss,"无法匹配")
    try:
    wb.save(excel_path1)
    print("保存成功,请查看被写入excel文件")
    except:
    print("保存失败,请关闭被写入信息的excel文件再操作")
    c = input("请确认关闭文件后,输入任意信息继续保存>>>")
    if c:
    print("再次保存,请查看是否保存成功")
    wb.save(excel_path1)


    '''
    对单条数据或多条数据进行编码解码处理,包含base64,url
    '''


    def encode_decode():
    code_way = input("处理单条数据输入0,处理批量数据输入1>>>")
    if code_way == '0':
    while True == True:
    s = input("可循环输入,输入end结束循环,请输入单条字符串数据>>>")
    if s != 'end':
    s2 = base64_url(s, k)
    print("结果为:", s2)
    else:
    encode_decode_io()
    encode_decode()
    break
    elif code_way == '1':
    path_du = input("请输入文件名称>>>")
    l = text2list(path_du)
    l2 = []
    for s in l:
    x = base64_url(s, k)
    l2.append(x)
    path_xie = input("处理完成,请输入写入的文件名称>>>")
    list2text(l2, path_xie, '\n')
    print("写入完成,请查看文件" + path_xie)
    else:
    print("参数选取错误!")
    encode_decode()


    '''
    定义用户输入选择
    '''
    k = ''#全局变量k,定义用户的编码处理方式
    def IO():
    way = input("请输入要执行的操作>>>")
    if way == '1':
    json2excel()
    elif way == '2':
    re2excel()
    elif way == '3':
    excel2_pipei()
    elif way == '4':
    k = ''
    encode_decode_io() # 循环等待输入成功,将正确的in_k赋值给全局变量K
    encode_decode()
    else:
    print("参数选取错误!")
    IO()


    def main():
    while True == True:
    print(message)
    IO()
    io = input("处理完成,是否还要再处理数据,输入任意字符继续,输入end结束>>>")
    if io == 'end':
    break


    if __name__ == '__main__':
    main()

    五、结语


    编写该工具的目的,最开始是因为企业自查弱口令,方便从返回包提取用户名进行暴力破解,再对弱口令账户关联身份信息;


    暴力破解过程中,部分系统会进行简单编码,并可以通过身份信息构造相应的弱密码字典,在弱口令自查中有奇效;


    后面是在风控分析中,可手动关联多个excel表,手动分析出异常行为用户(手动的原因当然是目前还没有风控系统)。


    声明:本公众号所分享内容仅用于网安爱好者之间的技术讨论,禁止用于违法途径,所有渗透都需获取授权!否则需自行承担,本公众号及原作者不承担相应的后果.


    @
    欢迎加我个人微信:zkaq99、实时分享安全动态

    防丢失


    爬取免费代理,拥有自己的代理池

    2021-10-22

    Burpsuite在各场景下的抓包方法(整理)

    2021-08-11

    【精选】SRC快速入门+上分小秘籍+实战指南

    2021-07-26

    干货|列了几种均能过安全狗的方法!

    2021-07-01

    巧用FOFA挖到你的第一个漏洞

    2021-06-08

    一名大学生的黑客成长史到入狱的自述

    2020-12-22

    那些年的Hvv日记

    2021-04-17


    看到这里了,点个“赞”、“再看”吧

    Python社区是高质量的Python/Django开发社区
    本文地址:http://www.python88.com/topic/123839
     
    511 次点击