โฮสต์เดียวที่ถูกบุกรุกในเครือข่ายภายในนั้นไร้ประโยชน์หากไม่มีเส้นทาง pivot ที่เชื่อถือได้ อุโมงค์ SOCKS5 ผ่าน SSH เป็นวิธีที่มีความหน่วงต่ำที่สุดและไม่ขึ้นกับเครื่องมือสำหรับการเคลื่อนที่ด้านข้าง — แต่ผู้ปฏิบัติส่วนใหญ่มักตั้งค่าผิดพลาดหรือทิ้งร่องรอยทางนิติวิทยาศาสตร์ที่ทีมฟ้าที่มีความสามารถจะตรวจพบได้ภายในไม่กี่วินาที ในปี 2024 พร็อกซี SOCKS5 ที่ตั้งค่าอย่างถูกต้องยังคงเหนือกว่าพร็อกซี HTTP CONNECT ในด้านปริมาณงาน TCP ดิบ และด้วยเครื่องมืออย่าง proxychains-ng และ Chisel คุณสามารถกำหนดเส้นทาง nmap, Metasploit และสคริปต์ที่กำหนดเองผ่านเซสชัน SSH เดียวโดยไม่ต้องแตะกฎไฟร์วอลล์ของเป้าหมาย
ทำไม SOCKS5 ผ่าน SSH ถึงดีกว่าการส่งต่อพอร์ต
การส่งต่อพอร์ตท้องถิ่นแบบคงที่ (-L) บังคับให้คุณแมปทุกบริการระยะไกลไปยังพอร์ตท้องถิ่นก่อนที่จะโต้ตอบได้ หากคุณต้องการสแกนซับเน็ต /24 คุณจะต้องสร้างการส่งต่อ 254 รายการแยกกัน การส่งต่อแบบไดนามิก SOCKS5 (-D) แก้ปัญหานี้โดยการเปิดเผยพร็อกซี SOCKS5 ท้องถิ่นที่กำหนดเส้นทางการเชื่อมต่อ TCP ใดๆ ผ่านอุโมงค์ SSH ไปยังโฮสต์ระยะไกล โปรโตคอลนี้ถูกกำหนดใน RFC 1928 และรองรับการตรวจสอบสิทธิ์, UDP (ไม่บังคับ) และ IPv6 ในทางปฏิบัติ คุณจะได้รับตัวฟังท้องถิ่นตัวเดียว — โดยทั่วไปบน 127.0.0.1:1080 — และทุกเครื่องมือที่รองรับพร็อกซี SOCKS สามารถใช้งานได้ โอเวอร์เฮดนั้นเล็กน้อย: การเข้ารหัสของ SSH เพิ่ม CPU ประมาณ 5-10% แต่ความหน่วงต่ำกว่า VPN หรือการส่งต่อพอร์ตย้อนกลับผ่านเว็บเชลล์มาก
การตั้งค่าตัวฟัง SOCKS5 บนจุดตั้งหลัก Linux
สมมติว่าคุณมีเชลล์บนโฮสต์ Linux ภายในเครือข่ายเป้าหมาย วิธีที่เร็วที่สุดในการสร้าง pivot คือการรัน ssh -D 1080 -N -f user@your-listener จากโฮสต์ที่ถูกบุกรุกกลับไปยังเครื่องโจมตีของคุณ แต่วิธีนี้ต้องการการเข้าถึง SSH ขาออก ซึ่งอาจถูกบล็อก ให้รันการส่งต่อแบบไดนามิกจากเครื่องโจมตีไปยังโฮสต์ที่ถูกบุกรุกแทน:
ssh -D 1080 -N -f compromised_user@compromised_host
การดำเนินการนี้จะเปิดพร็อกซี SOCKS5 บนพอร์ตท้องถิ่น 1080 จากนั้นกำหนดค่า proxychains-ng (/etc/proxychains.conf) เพื่อใช้พร็อกซีนั้น:
socks5 127.0.0.1 1080
จากนั้นรันเครื่องมือ TCP ใดๆ ผ่านอุโมงค์:
proxychains4 nmap -sT -Pn -p 445,3389 10.10.10.0/24
โปรดทราบว่า nmap ต้องการ -sT (สแกนแบบ TCP connect) เนื่องจาก SOCKS5 ไม่รองรับแพ็กเก็ต SYN ดิบ สำหรับ Metasploit ให้ตั้งค่า setg Proxies socks5:127.0.0.1:1080 และโมดูลเสริมและเอ็กซ์พลอยต์ทั้งหมดจะถูกกำหนดเส้นทางผ่าน pivot เทคนิคนี้ใช้ได้ในสภาพแวดล้อม CTF อย่าง Hack The Box หรือ Proving Grounds ซึ่งเป้าหมายคือการเข้าถึงซับเน็ตที่สอง
Chisel, Ligolo-ng และข้อแลกเปลี่ยน
เมื่อ SSH ไม่พร้อมใช้งาน — บางทีเป้าหมายรัน Windows หรือไม่มีเซิร์ฟเวอร์ SSH — เครื่องมือสร้างอุโมงค์ทางเลือกจะเข้ามาเติมเต็มช่องว่าง Chisel ใช้ไคลเอนต์และเซิร์ฟเวอร์ที่ใช้ Go ซึ่งสร้างอุโมงค์ TCP ผ่าน HTTP/HTTPS รันเซิร์ฟเวอร์บนเครื่องโจมตี: chisel server -p 8000 --reverse บนโฮสต์ที่ถูกบุกรุก ให้รันไคลเอนต์: chisel client your_ip:8000 R:socks วิธีนี้จะให้ตัวฟัง SOCKS5 ฝั่งเซิร์ฟเวอร์ Chisel นั้นเร็วและทำงานผ่านตัวกรองขาออกที่เข้มงวด แต่ทราฟฟิกของมันไม่ได้ถูกเข้ารหัสตามค่าเริ่มต้น — ให้ห่อหุ้มด้วย TLS หรือใช้ SSH หากคุณใส่ใจเรื่อง opsec
Ligolo-ng ใช้แนวทางที่แตกต่าง: มันสร้างอุโมงค์เครือข่ายที่เลเยอร์ 3 โดยใช้อินเทอร์เฟซ TUN/TAP แทนที่จะใช้ SOCKS5 คุณจะกำหนดเส้นทางช่วง IP ทั้งหมดผ่าน pivot ซึ่งหมายความว่าคุณสามารถรัน nmap -sS (สแกน SYN) โดยไม่ต้องใช้ proxychains ข้อแลกเปลี่ยนคือค่าใช้จ่ายด้านการบริหาร: คุณต้องมีสิทธิ์ root ทั้งสองฝั่ง และการตั้งค่าอุโมงค์ต้องเพิ่มเส้นทางบนเครื่องโจมตี สำหรับ CTF ที่คุณควบคุมทั้งสองฝั่ง Ligolo-ng จะเร็วกว่า ในการปฏิบัติงานจริง วิธี SOCKS5 นั้นพกพาได้มากกว่าเพราะทำงานโดยไม่ต้องมีสิทธิ์พิเศษบนโฮสต์ pivot
สัญญาณตรวจจับที่ผู้โจมตีทิ้งไว้
ทุกวิธี pivot ทิ้งร่องรอยไว้ การส่งต่อแบบไดนามิก SSH จะสร้างซ็อกเก็ตฟังบนโฮสต์ที่ถูกบุกรุก — ss -tlnp แสดงกระบวนการ ssh ที่ผูกกับ 127.0.0.1:1080 ทีมฟ้าสามารถเชื่อมโยงสิ่งนี้กับการเชื่อมต่อ SSH ขาออกไปยัง IP ภายนอก กระบวนการไคลเอนต์ของ Chisel มีชื่อว่า chisel ตามค่าเริ่มต้น — ตรวจจับได้ง่ายด้วยการตรวจสอบกระบวนการ Ligolo-ng ต้องการอุปกรณ์ TUN (ip link show) ซึ่งผิดปกติบนเซิร์ฟเวอร์
ที่แย่กว่านั้น ผู้ปฏิบัติหลายคนลืมทำความสะอาด เซสชัน SSH จะคงอยู่จนกว่าโฮสต์ระยะไกลจะฆ่ามันหรือการเชื่อมต่อหลุด Proxychains ไม่ทิ้งร่องรอยในเครื่อง แต่ทราฟฟิก nmap เอง — การสแกนพอร์ตที่ผิดปกติจากโฮสต์ที่ปกติไม่สแกน — จะกระตุ้นการแจ้งเตือน IDS ข้อผิดพลาดที่พบบ่อยที่สุดคือการใช้พอร์ต SOCKS5 เริ่มต้น 1080 ซ้ำ ให้เปลี่ยนเป็นพอร์ตชั่วคราวสูง (เช่น ssh -D 53421) และตั้งชื่อแทนการกำหนดค่า proxychains เพื่อหลีกเลี่ยงการทิ้งไฟล์กำหนดค่าเริ่มต้น ใน CTF สิ่งเหล่านี้ไม่สำคัญ ในการทดสอบเจาะระบบจริง สัญญาณเหล่านี้คือวิธีที่คุณจะถูกจับได้