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))
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({})
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)
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)
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})
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)
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})