ลองนำ kali-mcp เดิมมาเขียนใหม่ด้วย Go
(github.com/found-cake)สวัสดีครับ ผมเป็นนักศึกษามหาวิทยาลัยที่กำลังเรียนอยู่ในสาขาความมั่นคงปลอดภัยสารสนเทศ
ผมใช้ kali-mcp เป็นประจำสำหรับงานเจาะระบบจำลอง / ทดสอบทราฟฟิก / งานอัตโนมัติสำหรับ CTF แต่เมื่อใช้งานในสภาพแวดล้อมที่ต้องต่อหลายเอเจนต์พร้อมกัน ก็เริ่มเจอคอขวด เลยลองลงมือเขียนใหม่ด้วย Go เองครับ
GitHub: https://github.com/found-cake/kali-mcp-go
โครงสร้างและข้อจำกัดของ kali-mcp เดิม
ต้นฉบับพัฒนาด้วย Flask + Python และมีโครงสร้างที่คลาส CommandExecutor จะสร้าง subprocess.Popen ใหม่ในทุกคำขอ จากนั้นจึงสร้าง daemon thread เพิ่มอีก 2 ตัวเพื่ออ่าน stdout/stderr แยกกันในแต่ละคำขอ
สำหรับเอเจนต์เดี่ยวถือว่าเพียงพอ แต่เมื่อมีคำขอพร้อมกันจำนวนมากในสภาพแวดล้อมแบบ multi-agent จะเกิดปัญหาดังนี้
- Flask แบบ single worker ตามค่าเริ่มต้น — เอเจนต์แต่ละตัวบล็อกกันเอง
- มี overhead จากการสร้าง process + thread ใหม่ในทุกคำขอ
- เอเจนต์อาจเข้าใจความล่าช้าในการตอบกลับผิดว่าเป็น timeout แล้วลองทำงานเดิมซ้ำ
การเปลี่ยนแปลงหลัก
เซิร์ฟเวอร์
- เดิม: Flask (single worker ตามค่าเริ่มต้น)
- เปลี่ยน: Fiber v3 / fasthttp — รองรับ concurrent ได้เต็มรูปแบบ
การเก็บผลลัพธ์เอาต์พุต
- เดิม: ใช้ daemon thread 2 ตัวทำ readline loop
- เปลี่ยน: ใช้ goroutine 2 ตัว + WaitGroup เพื่อซิงก์ให้ชัดเจน และกำหนดจังหวะการเก็บ stdout/stderr ได้แม่นยำ จึงประมวลผลได้โดยไม่มีเอาต์พุตตกหล่น
timeout/cancel
- เดิม:
process.wait(timeout=...)+ kill แบบบังคับ - เปลี่ยน: ใช้ context เป็นฐาน — ปิดได้ถูกต้องแม้กระทั่ง pipe
ไฟล์ชั่วคราวของ Metasploit
- เดิม: ฮาร์ดโค้ด
/tmp/mks_msf_resource.rc— มีโอกาสเกิด race condition เมื่อมีหลายคำขอพร้อมกัน - เปลี่ยน:
os.CreateTemp— ใช้ชื่อไฟล์เฉพาะต่อคำขอ ทำให้จัดการได้อย่างปลอดภัย
รองรับ tshark
- เดิม: ไม่มี
- เปลี่ยน: เพิ่ม endpoint เฉพาะ
สถาปัตยกรรม
ยังคงโครงสร้างแบบ 2-tier เหมือนเดิม แต่เปลี่ยนเฉพาะภายใน
[AI Client] →(MCP stdio)→ [mcp-client] →(HTTP + Bearer token)→ [kali-server] →(exec)→ [nmap, tshark, ...]
ยังไม่มีความคิดเห็น