def pack_delete(request):
    pack_id = ReqParams.one(request, 'pack_id')

    # delete fw_files_storage
    # delete fw_files
    # delete pack_files_storage
    # delete pack_files

    file_list = FwFileDO.search_files_of_pack(pack_id)
    for file in file_list:
        FwFilesStorage.delete(file['file_id'])

    # if len(file_list) > 0:
    FwFileDO.delete_many_of_pack(pack_id)

    pack_info = PackFileDO.fetch_pack(pack_id)
    PackFilesStorage.delete(pack_info['file_id'])

    PackFileDO.delete(pack_id)

    # 保存操作日志
    LogRecords.save('',
                    category='statistics',
                    action='删除固件包',
                    desc='删除指定固件包(ID=%s)的信息,' % pack_id)

    return sys_app_ok_p([])
def auto_vuler_association(request):
    pack_id = ReqParams.one(request, 'pack_id')
    task_id = start_check_component_task(pack_id)
    if task_id is None:
        return sys_app_ok_p("自动组件漏洞关联正在运行中")

    return sys_app_ok_p(MyTask.fetch_exec_info(task_id))
示例#3
0
def test_list_squash_fs(request):
    pack_id = ReqParams.one(request, 'pack_id')

    fs_image = FsImage(pack_id)
    fs_image.enum_files()

    return sys_app_ok_p({})
示例#4
0
def read_sys_config(request):
    read_all = ReqParams.one(request, 'all_config.int')

    # 从数据库中读取系统配置
    config = SystemConfig.read_db(read_all)

    # 保存操作日志
    LogRecords.save(config,
                    category='system_config',
                    action='读取系统配置',
                    desc='读取系统各项配置参数')

    return sys_app_ok_p(config)
示例#5
0
def taintdel(request):
    # 从请求中取参数:文件 ID
    func_name = ReqParams.one(request, 'func_name')
    ret = TaintdictDO.delete(func_name)

    # 保存操作日志
    LogRecords.save('', category='statistics', action='自定义污点函数-删除',
                    desc='污点函数(func_name=%s)的信息,' % func_name)

    if ret:
        return sys_app_ok_p('删除成功')
    else:
        return sys_app_ok_p('删除失败')
def taint_func_list(request):
    # 从请求中取参数:文件 ID
    file_id = ReqParams.one(request, 'file_id')

    # 查找函数列表分析结果
    # 查询文件 CFG 分析的标记
    is_cfg = CfgAnalyzeService.has_cfg_analyze(file_id)
    if not is_cfg:
        # 启动分析任务
        task_id = CfgAnalyzeService.start_cfg_task(file_id)
        # 保存操作日志
        LogRecords.save({
            'task_id': task_id,
            'file_id': file_id
        },
                        category='analysis',
                        action='分析CFG',
                        desc='对二进制文件做调用流程图分析')

        # 返回响应:任务初始化的信息
        return sys_app_ok_p(MyTask.fetch_exec_info(task_id))

    # 启动分析任务
    functions = FilesService.functions_list(file_id)
    if len(functions) == 0:
        return sys_app_err(Error.FW_FILE_NO_CFG_ANALYZE)

    taint_func_list = []

    taint_funcs = []

    taint_list = func_taint_col.find()

    for taint_info in taint_list:
        taint_funcs.append(taint_info.get('func_name'))
    for func_info in functions:
        func_name = func_info.get('name')
        for taint_func_info in taint_funcs:
            if taint_func_info == func_name:
                taint_func_list.append(taint_func_info)

    # 保存操作日志
    LogRecords.save('',
                    category='query',
                    action='查询污点函数列表',
                    desc='查询指定固件文件(ID=%s)在代码分析中产生的函数列表' % file_id)

    return sys_app_ok_p({
        'taint_num': len(taint_func_list),
        'taint_func_list': taint_func_list
    })
def pack_info(request):
    pack_id = ReqParams.one(request, 'pack_id')

    # 读取指定固件包的信息
    pack_service = PackInfoService(pack_id, None)
    info = pack_service.pack_summary()

    # 保存操作日志
    LogRecords.save('',
                    category='statistics',
                    action='查询包信息',
                    desc='查询指定固件包(ID=%s)的信息,统计其文件数量,查询任务信息' % pack_id)

    return sys_app_ok_p(info)
def test_zip_file(request):
    file_id = ReqParams.one(request, 'file_id')

    file_path = FwFilesStorage.export(file_id)
    if file_path is None:
        return sys_app_err('FW_FILE_NOT_FOUND')

    # compress_files = _test_zipfile(file_path)

    # compress_files = _test_patool(file_path)

    compress_files = _test_py7zr(file_path)

    return sys_app_ok_p(compress_files)
def test_angr_cfg(request):
    file_name = ReqParams.one(request, 'file_name')


    file_path = os.path.join(MyPath.samples(), file_name)
    project = angr.Project(file_path, load_options={'auto_load_libs': False})
    main_symbol = project.loader.main_object.get_symbol('main')
    start_addr = main_symbol.rebased_addr
    start_state = project.factory.blank_state(addr=start_addr)
    start_state.stack_push(0x0)
    project.factory.full_init_state(add_options={angr.options.STRICT_PAGE_ACCESS, angr.options.ENABLE_NX,
                                         angr.options.ZERO_FILL_UNCONSTRAINED_MEMORY, angr.options.USE_SYSTEM_TIMES})
    cfg = project.analyses.CFG()
    functions = cfg.kb.functions
    return sys_app_ok_p(functions)
示例#10
0
def async_com_download(request):
    com_download_url = ReqParams.one(request, 'url', protocol='POST')
    # 启动下载任务
    extra_info = {'task_type': TaskType.REMOTE_DOWNLOAD,
                  'task_name': '组件源码下载',
                  'task_desc': '下载组件源码入库存储桶'}
    task = MyTask(_proc_component_tasks, (com_download_url, MyPath.component()), extra_info=extra_info)
    task_id = task.get_task_id()

    # 保存操作日志
    LogRecords.save({'task_id': task_id}, category='download', action='组件源码下载',
                    desc='下载组件源码入库存储桶')

    # 返回响应:任务初始化的信息
    return sys_app_ok_p(MyTask.fetch_exec_info(task_id))
def info(request):
    pack_id = ReqParams.one(request, 'pack_id')

    com_info = PackCOMFileDO.fetch_pack(pack_id)
    # 读取指定固件包的信息
    files_stat = get_sourcecode_files_stat(pack_id)
    pack_info = dict(com_info, **files_stat)

    # 保存操作日志
    LogRecords.save('',
                    category='statistics',
                    action='查询组件源码包信息',
                    desc='查询组件源码包的信息,统计其文件数量,查询任务信息')

    return sys_app_ok_p(pack_info)
def list_name(request):
    component_name = ReqParams.one(request, 'name')
    com_info = PackCOMFileDO.fetch_name(component_name)
    """ 获取源码包所有的文件统计信息 """
    # info_list = []
    # for pack in com_list:
    #     # 各个包的所含文件信息
    #     files_stat = get_sourcecode_files_stat(pack['pack_id'])
    #     pack_info = dict(pack, **files_stat)
    #     info_list.append(pack_info)

    # 保存操作日志
    LogRecords.save('',
                    category='statistics',
                    action='组件源码查询_按名称查询',
                    desc='组件源码查询_按名称查询')

    return sys_app_ok_p(com_info)
def test(request):
    value = ReqParams.one(request, 'value', protocol='GET')
    # 启动下载任务
    extra_info = {
        'task_type': TaskType.REMOTE_DOWNLOAD,
        'task_name': 'test组件源码下载',
        'task_desc': 'test下载组件源码入库存储桶'
    }
    task = MyTask(_proc_inverted_tasks, (value, MyPath.component()),
                  extra_info=extra_info)
    task_id = task.get_task_id()

    # 保存操作日志
    LogRecords.save({'task_id': task_id},
                    category='download',
                    action='test组件源码下载',
                    desc='test下载组件源码入库存储桶')

    # 返回响应:任务初始化的信息
    return sys_app_ok_p(MyTask.fetch_exec_info(task_id))
def cfg_func_list(request):
    # 从请求中取参数:文件 ID
    file_id = ReqParams.one(request, 'file_id')

    # 查找函数列表分析结果
    # 查询文件 CFG 分析的标记
    is_cfg = CfgAnalyzeService.has_cfg_analyze(file_id)
    if not is_cfg:
        # 启动分析任务
        task_id = CfgAnalyzeService.start_cfg_task(file_id)
        # 保存操作日志
        LogRecords.save({
            'task_id': task_id,
            'file_id': file_id
        },
                        category='analysis',
                        action='分析CFG',
                        desc='对二进制文件做调用流程图分析')

        # 返回响应:任务初始化的信息
        return sys_app_ok_p(MyTask.fetch_exec_info(task_id))

    # 启动分析任务
    functions = FilesService.functions_list(file_id)
    # 查找函数列表分析结果
    # functions = CfgAnalyzeResultDAO.get_functions(file_id)
    if len(functions) == 0:
        return sys_app_err(Error.FW_FILE_NO_CFG_ANALYZE)

    # 保存操作日志
    LogRecords.save('',
                    category='query',
                    action='查询函数列表',
                    desc='查询指定固件文件(ID=%s)在代码分析中产生的函数列表' % file_id)

    return sys_app_ok_p({
        'functions_count': len(functions),
        'functions': functions
    })
def com_files_tree(request):
    tree_type = ReqParams.one(request, 'tree_type')
    # 读取所有组件文件
    com_list = FwFileDO.search_all_com_files()

    if tree_type is None or len(tree_type) == 0 or tree_type == 'normal':
        tree_type = 'normal'
        exec_tree = {}
    elif tree_type == 'antd':
        exec_tree = []
    else:
        tree_type = 'normal'
        exec_tree = {}

    # 对每个文件做树的各级节点定位和创建
    for exec_file in com_list:
        # 获取文件路径
        file_path = exec_file['file_path']
        file_id = exec_file['file_id']

        component = exec_file['component']

        if file_path is None or len(file_path) == 0:
            continue

        if tree_type == 'normal':
            MyTree.file_path_insert_into_tree(exec_tree, file_path, file_id)
        elif tree_type == 'antd':
            MyTree.file_path_insert_into_antd_tree(exec_tree, file_path,
                                                   file_id)

    # 保存操作日志
    LogRecords.save('',
                    category='statistics',
                    action='查询所有组件文件目录树',
                    desc='获取所有组件文件目录树结构(模式为:%s)' % (tree_type))

    return sys_app_ok_p(exec_tree)
def test_angr_functions(request):
    file_name = ReqParams.one(request, 'file_name')
    file_path = os.path.join(MyPath.samples(), file_name)
    # --disasm
    # bw_result = binwalk.scan('--signature', file_path)
    # bw_result = binwalk.scan('--signature', '--opcodes', file_path)
    # bw_result = binwalk.scan('--signature', '--opcodes', '--disasm', file_path)
    # bw_result = binwalk.scan('--signature', '--disasm', file_path)
    # bw_result = binwalk.scan('--signature', '--opcodes', '--disasm', '--verbose', file_path)

    project = angr.Project(file_path, load_options={'auto_load_libs': False})
    # project = angr.Project(file_path, load_options={
    #     'auto_load_libs': False,
    #     'main_opts': {
    #         'backend': 'blob',
    #         'base_addr': 0x10000,
    #         'entry_point': 0x10000,
    #         'arch': 'MIPS32',
    #         'offset': 0,
    #     }
    # })

    cfg = project.analyses.CFGFast(resolve_indirect_jumps=True, force_complete_scan=False, normalize=True,
                                   # context_sensitivity_level=1,
                                   # enable_advanced_backward_slicing=False,
                                   # enable_symbolic_back_traversal=False
                                   )
    items = cfg.kb.functions.items()

    functions = []
    for addr, func in items:
        func_name = func.name
        if func_name == 'UnresolvableJumpTarget' or func_name == 'UnresolvableCallTarget':
            continue
        functions.append({'address': hex(addr), 'name': func.name})

    return sys_app_ok_p({'count': len(functions), 'functions': functions})
示例#17
0
def test_squash_fs(request):
    file_id = ReqParams.one(request, 'file_id')
    file_path = FwFilesStorage.export(file_id)

    squash = SquashFS(file_path)

    if squash.check_format():
        for i in squash.image.root.findAll():
            print(i.getName())

        for i in squash.image.root.findAllPaths():
            print(i)

    items = []
    nodes = squash.list_all()
    for inode in nodes:
        name, path, folder = squash.node_props(inode)
        items.append(path)
        # content = squash.node_content(inode)
        print(path)

    squash.close()

    return sys_app_ok_p(items)
def detect_vulner(request):
    file_id = ReqParams.one(request, 'file_id')
    # pack_id = ReqParams.one(request, 'pack_id')
    # fw_vul_analyze = FwVulnerAnalyze(file_id)
    # res = fw_vul_analyze.vuler_analyze()
    # return sys_app_ok_p({'res': res})

    # 查询文件 detect 分析的标记
    is_detect = OverflowDetectService.has_detect_overflow(file_id)
    if not is_detect:
        # 启动detect任务
        task_id = OverflowDetectService.start_detect_task(file_id)
        # 保存操作日志
        LogRecords.save({
            'task_id': task_id,
            'file_id': file_id
        },
                        category='analysis',
                        action='分析OVERFLOW',
                        desc='对二进制文件做溢出漏洞分析')

        # 返回响应:任务初始化的信息
        return sys_app_ok_p(MyTask.fetch_exec_info(task_id))

    file_item = FwFileDO.find(file_id)
    buffer_overflow = file_item.get('buffer_overflow')
    integer_overflow = file_item.get('integer_overflow')
    cmd_injection_overflow = file_item.get('cmd_injection_overflow')
    # return sys_app_ok_p({'缓冲区溢出': buffer_overflow, '整数溢出': integer_overflow, '命令注入溢出': cmd_injection_overflow})

    overflow_list = []
    overflow_list.append({"name": "缓冲区溢出", "value": buffer_overflow})
    overflow_list.append({"name": "整数溢出", "value": integer_overflow})
    overflow_list.append({"name": "命令注入溢出", "value": cmd_injection_overflow})

    return sys_app_ok_p({'overflow': overflow_list})
def test_check_file_type(request):
    category = ReqParams.one(request, 'category')

    if len(category) == 0:
        # 未指定检查类型时,可执行文件和非可执行都检测一遍
        check_exec = check_no_exec = True
    elif category == '1':
        # 指定'1'时,只检测非可执行文件
        check_exec = False
        check_no_exec = True
    elif category == '2':
        # 指定'2'时,只检测可执行文件
        check_exec = True
        check_no_exec = False
    else:
        return sys_app_ok_p(
            'category=1,检测非可执行文件;category=2,检测可执行文件;category为空时,检测全部文件')

    results = []

    if check_no_exec:
        files_list = [
            'image.bmp', 'image.gif', 'image.jpg', 'image.png', 'image.tif',
            'image2.png', 'office.docx', 'office.pptx', 'office.xlsx',
            'office2.docx', 'office2.xlsx', 'pdf.pdf', 'text.js', 'text.py',
            'text.txt', 'zip.zip', 'zip2.zip', 'rar.rar', '7z.7z', 'tar.tar'
        ]

        for file_name in files_list:
            file_path = os.path.join(MyPath.samples(), 'bin', file_name)
            file_type, extra_props = FileTypeJudge.scan_file_type(file_path,
                                                                  quiet=False)
            results.append({
                'file_name': file_name,
                'file_type': file_type,
                'type_name': FileType.get_alias(file_type)
            })

    if check_exec:
        files_list = [
            'libebt_standard.so',
            'bash',
            'regedit.exe',
            'opkg',
            'polkitd',
            'true',
            'ais3_crackme',
            'r100',
            'AcXtrnal.dll',
            'WdNisDrv.sys',
        ]

        for file_name in files_list:
            file_path = os.path.join(MyPath.samples(), 'bin', file_name)
            file_type, extra_props = FileTypeJudge.scan_file_type(file_path,
                                                                  quiet=False)
            if file_type == FileType.EXEC_FILE:
                arch, endianness = ExecFile.parse_exec_arch(file_path,
                                                            prefer=extra_props)
            else:
                arch = endianness = ''
            results.append({
                'file_name': file_name,
                'file_type': file_type,
                'type_name': FileType.get_alias(file_type),
                'arch': arch,
                'endianness': endianness,
            })
            # break

    return sys_app_ok_p(results)
示例#20
0
def test_extract_squash_fs(request):
    pack_id = ReqParams.one(request, 'pack_id')

    FsImage.start_fs_image_extract_task(pack_id)

    return sys_app_ok_p({})
def test_pack_verify_file_type(request):
    pack_id = ReqParams.one(request, 'pack_id')

    task_id = PackFiles.start_exec_bin_verify_task(pack_id)

    return sys_app_ok_p(task_id)
def test_add_single_exec(request):
    file_name = ReqParams.one(request, 'file_name')

    pack_infos = LoadDefaultPack.load_default_virtual_packs(file_name)

    return sys_app_ok_p(pack_infos)
def test_pack_extract_bat(request):
    pack_index = ReqParams.one(request, 'pack_index.int')
    id_list = LoadDefaultPack.load_default_real_packs([pack_index])
    return sys_app_ok_p({'pack_id_list': id_list})