前言

最近需要使用Goby对目标进行批量化漏洞插件检测,但是Goby的漏洞检测逻辑是先进行资产的指纹识别,资产匹配上才会打对应的POC进行漏洞扫描。

对于某些场景来说很不友好,扩展goby_exp说是能直接进行漏洞扫描,但是这个实现逻辑更不能理解。。开启直接检测模式居然要有一个任务扫描出对应的资产指纹,然后才能调用。

解决

可以观察到插件都有一个GobyQuery字段,在我的插件库里则是有FofaQueryGobyQuery

cdab5b5e-7dc6-48c2-bab2-4ea6ad8dc251

通过界面修改这两个字段发现Goby居然有强校验逻辑。

所以,写个脚本把插件中的字段批量修改成通配符就行了(就是如此简单

AI写的脚本有点问题,需要小小修改下:

import os
import re
import argparse

def replace_in_file(file_path):
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            content = f.read()
    except (UnicodeDecodeError, PermissionError) as e:
        print(f"⚠️  无法读取文件 {file_path}: {e}")
        return False

    # 正则表达式:匹配 "FofaQuery": "任意内容" 或 "GobyQuery": "任意内容"
    # 使用非贪婪匹配 .*? 来捕获引号内的内容
    pattern = r'("(?:FofaQuery|GobyQuery)":\s*")([^"]*)(")'

    # 替换函数:保留前后部分,中间替换为 *
    def replacer(match):
        return match.group(1) + '*' + match.group(3)

    new_content, count = re.subn(pattern, replacer, content)

    if count > 0:
        try:
            with open(file_path, 'w', encoding='utf-8') as f:
                f.write(new_content)
            print(f"✅ 已修改 {file_path}(替换 {count} 处)")
            return True
        except Exception as e:
            print(f"❌ 写入失败 {file_path}: {e}")
            return False
    else:
        # print(f"🔍 无匹配项 {file_path}")
        return False

def main(folder_path):
    if not os.path.isdir(folder_path):
        print(f"❌ 指定路径不是有效文件夹: {folder_path}")
        return

    modified_count = 0
    file_count = 0

    for root, dirs, files in os.walk(folder_path):
        for file in files:
            file_path = os.path.join(root, file)
            file_count += 1
            if replace_in_file(file_path):
                modified_count += 1

    print(f"\n📊 总结:遍历 {file_count} 个文件,修改了 {modified_count} 个文件。")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="替换文件中 FofaQuery 和 GobyQuery 的值为 *")
    parser.add_argument("folder", help="要遍历的文件夹路径")
    args = parser.parse_args()

    main(args.folder)

溜了