sark--Kali Tools MCP服务器
轻量级、符合规范的MCP服务器,在一个 流式HTTP MCP 端点,以便LM Studio(或其他支持MCP的客户端)可以以编程方式调用它们。
设计危险。 此服务器执行系统二进制文件。阅读 安全 跑步前要小心。
______________________________________________________________________
此存储库包含什么
sark.py --单文件Python MCP服务器,封装了常见的Kali工具(nmap、gobuster、dirb、nikto、sqlmap、hydra、john、wpscan、enum4linux)和通用工具 exec_cmd 工具。使用 fastmcp 通过MCP HTTP端点公开这些功能。
______________________________________________________________________
需求
- Python 3.10+(用现代3.x测试)
fastmcpPython包:
pip install fastmcp- 您打算运行的Kali工具必须安装在您的
PATH(例如。,nmap,gobuster,nikto,sqlmap,hydra,john,wpscan,enum4linux).
______________________________________________________________________
快速启动
- 安装要求(pip、所需工具):
# default Kali pip repository doesn't include fastmcp
python -m venv .venv
.venv/bin/pip3 install fastmcp
# install system packages as required (nmap, gobuster, ...), e.g. apt on Debian/Ubuntu:
# sudo apt install nmap gobuster nikto sqlmap hydra john wpscan enum4linux- 运行服务器(默认绑定到localhost):
.venv/bin/python sark.py HOST=127.0.0.1 PORT=8765您应该看到:
[kali-mcp] serving on 127.0.0.1:8765 at /mcp
[kali-mcp] WARNING: no allowlist set (all commands permitted)______________________________________________________________________
环境变量
HOST--要绑定的接口(默认127.0.0.1). 更喜欢127.0.0.1除非你了解网络风险。PORT--要侦听的端口(默认8765).ALLOWED_COMMAND_PREFIXES--逗号分隔的前缀用于限制允许的命令(例如:nmap,gobuster,nikto).设置后,只允许文本以其中一个前缀开头的命令。
allowlist示例:
ALLOWED_COMMAND_PREFIXES="nmap,gobuster,nikto" HOST=127.0.0.1 python3 sark.py
# prints: [kali-mcp] allowed commands: nmap, gobuster, nikto如果 ALLOWED_COMMAND_PREFIXES 未设置,服务器将允许任何命令-- 高度不安全.______________________________________________________________________
LM Studio集成
添加(或编辑) mcp.json LM Studio中指向此服务的条目:
{
"kali-tools": {
"url": "http://127.0.0.1:8765/mcp",
"timeout": 120000
}
}然后,LM Studio将能够调用以下公开的MCP工具 sark.py.
______________________________________________________________________
外露工具(API)
所有工具都装饰有 @mcp.tool() 并通过MCP暴露。函数签名(Python)和简短描述:
exec_cmd(cmd: str, shell: bool=False) -> str\
运行任意shell命令。使用时要格外小心。
nmap_scan(target: str, scan_type: str="-sV", ports: str="", additional_args: str="-T4 -Pn") -> str\
跑 nmap.
gobuster(url: str, mode: str="dir", wordlist: str="/usr/share/wordlists/dirb/common.txt", additional_args: str="") -> str\
跑 gobuster.
dirb(url: str, wordlist: str="/usr/share/wordlists/dirb/common.txt", additional_args: str="") -> str\
跑 dirb.
nikto(target: str, additional_args: str="") -> str\
跑 nikto.
sqlmap(url: str, data: str="", additional_args: str="") -> str\
跑 sqlmap (批处理模式)。
hydra(target: str, service: str, username: str="", username_file: str="", password: str="", password_file: str="", additional_args: str="") -> str\
跑 hydra 为了蛮力。
john(hash_file: str, wordlist: str="/usr/share/wordlists/rockyou.txt", format: str="", additional_args: str="") -> str\
跑 john (开膛手约翰)。
wpscan(url: str, additional_args: str="") -> str\
跑 wpscan.
enum4linux(target: str, additional_args: str="-a") -> str\
跑 enum4linux.
每个工具都以字符串形式返回组合的STDOUT/STDERR和返回代码(或错误消息)。
______________________________________________________________________
例子
运行服务器(只允许nmap和gobuster):
ALLOWED_COMMAND_PREFIXES="nmap,gobuster" HOST=127.0.0.1 PORT=8765 python3 sark.py从MCP客户端(LM Studio将为您处理此问题)--示例概念 curl 用法仅供演示(LM Studio使用MCP;原始HTTP调用可能并不等同于正确的MCP客户端):
# This is illustrative — LM Studio does the MCP protocol work for you.
curl -X POST http://127.0.0.1:8765/mcp \
-H "Content-Type: application/json" \
-d '{ "method": "nmap_scan", "params": ["127.0.0.1", "-sV", "", "-T4 -Pn"] }'使用LM Studio的内置MCP客户端,而不是制作原始HTTP调用,除非您知道客户端所期望的MCP帧。
______________________________________________________________________
实现注意事项
- 服务器使用
subprocess.run()执行命令。当shell=True被使用exec_cmd包装,/bin/bash被用作外壳。 - 命令通过以下方式进行标记
shlex.split()除非shell=True. - allowlist检查是一种简单的前缀检查(
cmd.strip().startswith(prefix));如果您需要更精细的控制,请根据您的需求进行调整。 - 输出以纯文本形式返回:stdout、可选stderr和
[rc=]错误/超时以人类可读的字符串形式返回。
______________________________________________________________________
安全与加固(请仔细阅读)
此服务器 执行任意系统命令。如果配置错误或暴露,可能会导致整个系统受损。
建议:
- 绑定到
127.0.0.1并对端口设置防火墙 不 将此服务暴露给不受信任的网络。 - 使用
ALLOWED_COMMAND_PREFIXES以限制允许使用哪些命令前缀。例子:ALLOWED_COMMAND_PREFIXES="nmap,gobuster,nikto". - 以非特权用户身份运行(从不
root). - 考虑其他沙盒:容器、chroot、seccomp、AppArmor或类似的。
- 尽量减少攻击面:只安装所需的工具,保持适当的系统更新。
- 如果暴露给多个客户端,请考虑日志记录、审计跟踪和速率限制。
- 如果您需要远程访问,请使用经过身份验证的加密隧道(SSH端口转发,VPN)——不要绑定到
0.0.0.0公开。
______________________________________________________________________
服务(systemd)示例
示例systemd单元(运行方式 kaliuser,调整路径):
[Unit]
Description=Kali MCP Server (sark)
After=network.target
[Service]
User=kaliuser
WorkingDirectory=/opt/kali-mcp
Environment=HOST=127.0.0.1
Environment=PORT=8765
Environment=ALLOWED_COMMAND_PREFIXES=nmap,gobuster,nikto
ExecStart=/usr/bin/python3 /opt/kali-mcp/sark.py
Restart=on-failure
LimitNOFILE=4096
[Install]
WantedBy=multi-user.target______________________________________________________________________
故障排除
- 如果工具返回
command not found错误:确保运行进程的用户已安装二进制文件并在PATH上。 - 如果命令挂起:
_run()助手强制执行默认超时(300秒)。您可以调整使用情况或修改服务器。 - 如果LM Studio无法连接:请验证HOST/PORT和LM Studio
mcp.jsonURL匹配 `http://:
/mcp`.
______________________________________________________________________
延伸
- 添加新项
@mcp.tool()用于包装其他二进制文件的函数。 - 改进满列表检查(例如,将完整命令模板列入白名单或验证参数)。
- 如果暴露在本地主机之外,请添加身份验证/授权。
- 添加结构化JSON响应(当前返回纯文本字符串)。
______________________________________________________________________
许可与免责声明
为方便起见,此代码按原样提供。使用风险自负。作者不对运行此软件造成的误用或损坏负责。使用前仔细评估安全影响。
______________________________________________________________________
