Skip to content

MCP安全应用和问题

BX

MCP安全应用和问题

MCP 相关安全项目

MCP-Security-Checklist/README_CN.md at main · slowmist/MCP-Security-Checklist

一些安全类 MCP 使用

IDA-Pro-MCP

:::info 我这里走的 stdio 方案

:::

项目地址

GitHub - mrexodia/ida-pro-mcp: MCP Server for IDA Pro.

先安装好 uv,(类似 pip)

pip uninstall ida-pro-mcp
pip install git+https://github.com/mrexodia/ida-pro-mcp

ida-pro-mcp --install

进入 IDA 打开文件,这里得把这个服务给起起来

MCP 客户端配置如下

{
  "mcpServers": {
    "IDA Pro MCP": {
      "command": "uv",
      "args": ["run", "ida-pro-mcp", "--install-plugin"],
      "timeout": 1800
    }
  }
}

用 cursor 或者 trae 这些,这里演示一下 trae

Trae 配置

可以新建一个智能体专门搞这个 ida 的

这里你提示词很重要

专注于 CTF 比赛的,可以再改改啥的

具体效果

具体脚本

#!/usr/bin/env python3
# RC4 解密脚本
# 基于IDA分析的rc4.exe程序

def rc4_init(key):
    """RC4密钥调度算法"""
    S = list(range(256))
    j = 0
    key_len = len(key)
    
    for i in range(256):
        j = (j + S[i] + key[i % key_len]) % 256
        S[i], S[j] = S[j], S[i]
    
    return S

def rc4_decrypt(ciphertext, key):
    """RC4解密函数(考虑额外的0x66异或)"""
    S = rc4_init(key)
    i = j = 0
    plaintext = []
    
    for byte in ciphertext:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        
        # 先去除额外的0x66异或,再进行RC4解密
        decrypted_byte = (byte ^ 0x66) ^ S[(S[i] + S[j]) % 256]
        plaintext.append(decrypted_byte)
    
    return bytes(plaintext)

def main():
    # 从IDA分析得到的密文数据(v6数组的值)
    # v6[0] = 0xF225450DA959419D
    # v6[1] = 0x424C79FD1B3DA063  
    # v6[2] = 0x77255DEA8E102BEC
    # v7 = 457 (0x01C9)
    
    # 将64位整数转换为字节数组(小端序)
    ciphertext = []
    
    # v6[0]
    val1 = 0xF225450DA959419D
    ciphertext.extend([(val1 >> (8*i)) & 0xFF for i in range(8)])
    
    # v6[1] 
    val2 = 0x424C79FD1B3DA063
    ciphertext.extend([(val2 >> (8*i)) & 0xFF for i in range(8)])
    
    # v6[2]
    val3 = 0x77255DEA8E102BEC
    ciphertext.extend([(val3 >> (8*i)) & 0xFF for i in range(8)])
    
    # v7 = 457
    val4 = 457
    ciphertext.extend([(val4 >> (8*i)) & 0xFF for i in range(2)])
    
    print(f"密文长度: {len(ciphertext)}")
    print(f"密文 (hex): {' '.join(f'{b:02x}' for b in ciphertext)}")
    
    # RC4密钥
    key = b"meowmeow"
    print(f"密钥: {key.decode()}")
    
    # 解密
    plaintext = rc4_decrypt(ciphertext, key)
    
    print(f"明文 (hex): {' '.join(f'{b:02x}' for b in plaintext)}")
    print(f"明文 (ascii): {plaintext.decode('ascii', errors='ignore')}")
    
    # 验证:重新加密看是否匹配
    print("\n=== 验证 ===")
    test_encrypt = rc4_encrypt(plaintext, key)
    print(f"重新加密: {' '.join(f'{b:02x}' for b in test_encrypt)}")
    print(f"原始密文: {' '.join(f'{b:02x}' for b in ciphertext)}")
    print(f"匹配: {test_encrypt == ciphertext}")

def rc4_encrypt(plaintext, key):
    """RC4加密函数(包含额外的0x66异或)"""
    S = rc4_init(key)
    i = j = 0
    ciphertext = []
    
    for byte in plaintext:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        
        # 先进行RC4加密,再异或0x66
        encrypted_byte = (byte ^ S[(S[i] + S[j]) % 256]) ^ 0x66
        ciphertext.append(encrypted_byte)
    
    return ciphertext

if __name__ == "__main__":
    main()

具体响应如下

密文长度: 26
密文 (hex): 9d 41 59 a9 0d 45 25 f2 63 a0 3d 1b fd 79 4c 42 ec 2b 10 8e ea 5d 25 77 c9 01
密钥: meowmeow
明文 (hex): 66 6c 61 67 7b 52 43 34 5f 69 73 5f 72 65 61 6c 6c 79 5f 73 69 6d 70 6c 65 7d
明文 (ascii): flag{RC4_is_really_simple}

=== 验证 ===
重新加密: 9d 41 59 a9 0d 45 25 f2 63 a0 3d 1b fd 79 4c 42 ec 2b 10 8e ea 5d 25 77 c9 01
原始密文: 9d 41 59 a9 0d 45 25 f2 63 a0 3d 1b fd 79 4c 42 ec 2b 10 8e ea 5d 25 77 c9 01
匹配: True

IDA-mcp 具体工具列表

类别工具名称
连接测试check_connection
元数据get_metadata
函数查找get_function_by_name
get_function_by_address
当前定位get_current_function
get_current_address
列出函数list_functions
字符串处理list_strings
search_strings
入口点get_entry_points
反编译decompile_function
反汇编disassemble_function
交叉引用get_xrefs_to
注释set_comment
变量/函数重命名rename_local_variable
rename_global_variable
rename_function
设置类型set_global_variable_type
set_local_variable_type
set_function_prototype
declare_c_type
数字转换convert_number

CloudSword-MCP(云鉴)

项目地址

GitHub - wgpsec/cloudsword: 一款帮助云租户发现和测试云上风险、增强云上防护能力的综合性开源工具

:::info 我们这里只讨论使用 MCP 的案例和效果,不去探究工具本身使用

但是实际测试情况这个 MCP 做的不够好,还是没有很完整

:::

启动 sse

./cloudsword sse http://localhost:8080

command 中设置你的软件位置

{
  "mcpServers": {
    "cloudsword": {
      "isActive": true,
      "name": "cloudsword-MCP",
      "description": "Cloudsword 安全分析服务",
      "type": "stdio",
      "command": "E:\\Tools\\利用工具\\\\cloudsword_v0.0.2_windows_amd64\\cloudsword.exe",
      "args": [
        "stdio"
      ],
    }
  }
}

为了更好地发挥工具 MCP 效果,需要一些比较合适的提示词

可用提示词

你现在是我的云安全助手,集成了 CloudSword 模块。  
你的目标是:帮助我在多云环境下快速发现资产、分析风险、执行安全操作。  

使用规则:
1. 当我提出问题时,请自动选择最合适的 CloudSword 模块并运行,并返回结果。
2. 在调用前,优先检查需要的认证参数(如 ACCESS_KEY_ID / ACCESS_KEY_SECRET 等),如果缺失请明确提示我设置。
3. 若有多个模块都可能符合要求,请优先选择推荐评级更高的模块。
4. 输出时,请用清晰的表格或列表展示结果,不要只给原始 JSON。
5. 如果模块运行失败,请输出报错信息,并提示我可能的修复办法。
6. 如果我提出的问题不在现有模块范围,请告诉我该模块暂不支持,并给出可选的替代方案。

常见问题示例:
- “列出阿里云 OSS 存储桶” → 调用 oss_list_buckets
- “搜索阿里云 OSS 对象” → 调用 oss_search_objects
- “列出阿里云 ECS 实例” → 调用 ecs_list_instances
- “查看阿里云 RAM 用户” → 调用 ram_list_users
- “列出腾讯云 COS 存储桶” → 调用 cos_list_buckets
- “查看腾讯云 CVM 实例列表” → 调用 cvm_list_instances
- “查看腾讯云 CAM 用户” → 调用 cam_list_users
- “列出华为云 OBS 存储桶” → 调用 obs_list_buckets
- “列出百度云 BOS 存储桶” → 调用 bos_list_buckets
- “列出七牛云 KODO 存储桶” → 调用 kodo_list_buckets
- “生成腾讯云蜜罐凭证” → 调用 create_honey_token

注意:
- 默认使用环境变量中的云访问密钥进行认证。
- 在输出中,敏感信息(如 AccessKey)不要直接暴露。
- 仅执行只读和合法的安全分析操作,不进行破坏性命令。

具体测试

配置之后可以看下工具列表

使用示例

Q:列出腾讯云用户的 COS 储存桶

A:响应如下,调用查看了我的一些储存桶

查看 MCP 信息

MCP 协议核心是 3 大类:

  1. Tools:动作(可调用函数)。
  2. Prompts:提示模板。
  3. Resources:数据源。

再加上 notifications(动态更新)和 capabilities(初始化声明)。

这里具体如下,

信息列表

让 AI 总结一下

🛠 Tools(工具)


📑 Prompts(提示模版)


📂 Resources(资源)


🔔 Notifications(事件通知)


🧩 Capabilities(能力声明)

使用官方 mcp SDK

GitHub - modelcontextprotocol/python-sdk: The official Python SDK for Model Context Protocol servers and clients

具体 uv 安装如下

# 安装
uv pip install "mcp[cli]"

# 运行
uv run python your_script.py

具体操作如下

import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

CLOUDSWORD = r"E:\Tools\利用工具\云\cloudsword_v0.0.2_windows_amd64\cloudsword.exe"

async def main():
    server = StdioServerParameters(
        command=CLOUDSWORD,
        args=["stdio"],
    )
    async with stdio_client(server) as (read, write):
        async with ClientSession(read, write) as session:
            # 初始化握手
            await session.initialize()
            # 拉取工具列表
            resp = await session.list_tools()
            print("== Available tools ==")
            for tool in resp.tools:
                print(f"- {tool.name}: {tool.description or ''}")
                if tool.inputSchema:
                    print(f"  schema: {tool.inputSchema}\n")

if __name__ == "__main__":
    asyncio.run(main())

使用 FastMCP

具体环境采用

uv pip install fastmcp

具体操作如下

import asyncio
from fastmcp import Client
from fastmcp.client.transports import StdioTransport

CLOUDSWORD = r"E:\Tools\利用工具\云\cloudsword_v0.0.2_windows_amd64\cloudsword.exe"

async def main():
    transport = StdioTransport(command=CLOUDSWORD, args=["stdio"])
    async with Client(transport=transport) as client:
        tools = await client.list_tools()
        for t in tools:
            print(f"- {t.name}: {t.description}")

if __name__ == "__main__":
    asyncio.run(main())
编辑这篇文章

评论区

使用 GitHub Discussions 驱动,欢迎留言交流。

上一篇
Claude Code使用记录&随笔
下一篇
OWAP-juice-shop靶场学习