Secure Socket Funneling (SSF) เป็นเครื่องมือเครือข่ายและชุดเครื่องมือ
มันมีวิธีที่ง่ายและมีประสิทธิภาพในการส่งต่อข้อมูลจากซ็อกเก็ตหลายตัว (TCP หรือ UDP) ผ่านอุโมงค์ TLS ที่ปลอดภัยเพียงครั้งเดียวไปยังคอมพิวเตอร์ระยะไกล
SSF เป็นแพลตฟอร์มข้าม (Windows, Linux, OSX) และมาเป็น Executables แบบสแตนด์อโลน
คุณสมบัติ:
ดาวน์โหลดไบนารี prebuilt
เอกสาร
สร้างบน Windows
สร้างบน unix/linux
Cross Compiling SSF (เช่น Raspberry Pi)
การใช้งาน: ssf[.exe] [options] server_address
ตัวเลือก:
-v verbose_level : verbosity: วิกฤต | ข้อผิดพลาด | คำเตือน | ข้อมูล | debug | trace (ค่าเริ่มต้น: ข้อมูล)
-q : โหมดเงียบ อย่าพิมพ์บันทึก
-p port : พอร์ตระยะไกล (ค่าเริ่มต้น: 8011)
-c config_file_path : ระบุไฟล์การกำหนดค่า หากไม่ได้ตั้งค่า 'config.json' จะถูกโหลดจากไดเรกทอรีการทำงานปัจจุบัน
-m attempts : ความพยายามในการเชื่อมต่อที่ไม่ประสบความสำเร็จสูงสุดก่อนหยุด (ค่าเริ่มต้น: 1)
-t delay : เวลารอก่อนที่จะพยายามเชื่อมต่ออีกครั้งในวินาที (ค่าเริ่มต้น: 60)
-n : อย่าพยายามเชื่อมต่อไคลเอนต์ใหม่หากการเชื่อมต่อถูกขัดจังหวะ
-g : อนุญาตพอร์ตเกตเวย์ อนุญาตให้ลูกค้าผูกซ็อกเก็ตท้องถิ่นสำหรับบริการไปยังที่อยู่เฉพาะแทนที่จะเป็น "localhost"
-S : แสดงสถานะ microservices (เปิด/ปิด)
ตัวเลือกบริการ:
-D [[bind_address]:]port : เรียกใช้ช่องว่างพร็อกซีบนเซิร์ฟเวอร์ที่สามารถเข้าถึงได้บน [[bind_address]:]port ที่ด้านท้องถิ่น
-F [[bind_address]:]port : เรียกใช้พอร์ตถุงเท้าบนโฮสต์ท้องถิ่นที่สามารถเข้าถึงได้จากเซิร์ฟเวอร์บน [[bind_address]:]port
-X [[bind_address]:]port : ไปข้างหน้าเซิร์ฟเวอร์เชลล์ I/O ไปยังพอร์ตที่ระบุในด้านท้องถิ่น การเชื่อมต่อแต่ละครั้งสร้างกระบวนการเชลล์ใหม่
-Y [[bind_address]:]port : ส่งต่อเชลล์โลคัล i/o ไปยังพอร์ตที่ระบุบนเซิร์ฟเวอร์
-L [[bind_address]:]port:host:hostport : ส่งต่อการเชื่อมต่อ TCP ไปยัง [[bind_address]:]port บนโฮสต์โลคัลเป็น host:hostport บนเซิร์ฟเวอร์
-R [[bind_address]:]port:host:hostport : ส่งต่อการเชื่อมต่อ TCP ไปยัง [[bind_address]:]port บนเซิร์ฟเวอร์เพื่อ host:hostport ทางด้านท้องถิ่น
-U [[bind_address]:]port:host:hostport : ส่งต่อการรับส่งข้อมูล UDP ในพื้นที่บน [[bind_address]:]port ไป host:hostport บนเซิร์ฟเวอร์
-V [[bind_address]:]port:host:hostport : ส่งต่อทราฟฟิก UDP บน [[bind_address]:]port บนเซิร์ฟเวอร์เพื่อ host:hostport ทางด้านท้องถิ่น
การใช้งาน: ssfd[.exe] [options]
ตัวเลือก:
-v verbose_level : verbosity: วิกฤต | ข้อผิดพลาด | คำเตือน | ข้อมูล | debug | trace (ค่าเริ่มต้น: ข้อมูล)
-q : โหมดเงียบ อย่าพิมพ์บันทึก
-c config_file_path : ระบุไฟล์การกำหนดค่า หากไม่ได้ตั้งค่า 'config.json' จะถูกโหลดจากไดเรกทอรีการทำงานปัจจุบัน
-p port : พอร์ตท้องถิ่น (ค่าเริ่มต้น: 8011)
-R : เซิร์ฟเวอร์จะถ่ายทอดการเชื่อมต่อเท่านั้น
-l host : Set Server Bind ที่อยู่
-g : อนุญาตพอร์ตเกตเวย์ อนุญาตให้ลูกค้าผูกซ็อกเก็ตท้องถิ่นสำหรับบริการไปยังที่อยู่เฉพาะแทนที่จะเป็น "localhost"
-S : แสดงสถานะ microservices (เปิด/ปิด)
คุณลักษณะการคัดลอกจะต้องเปิดใช้งานบนไฟล์การกำหนดค่าไคลเอนต์และเซิร์ฟเวอร์:
{
"ssf" : {
"services" : {
"copy" : { "enable" : true }
}
}
} การใช้งาน: ssfcp[.exe] [options] [host@]/absolute/path/file [[host@]/absolute/path/file]
ตัวเลือก:
-v verbose_level : verbosity: วิกฤต | ข้อผิดพลาด | คำเตือน | ข้อมูล | debug | trace (ค่าเริ่มต้น: ข้อมูล)
-q : โหมดเงียบ อย่าพิมพ์บันทึก
-c config_file_path : ระบุไฟล์การกำหนดค่า หากไม่ได้ตั้งค่า 'config.json' จะถูกโหลดจากไดเรกทอรีการทำงานปัจจุบัน
-p port : พอร์ตระยะไกล (ค่าเริ่มต้น: 8011)
-t : ใช้ stdin เป็นอินพุต
--resume : พยายามถ่ายโอนไฟล์ต่อหากไฟล์ปลายทางมีอยู่
--check-integrity : ตรวจสอบความสมบูรณ์ของไฟล์ในตอนท้ายของการถ่ายโอน
-r : คัดลอกไฟล์ซ้ำ
--max-transfers arg : การถ่ายโอนสูงสุดในแบบขนาน (ค่าเริ่มต้น: 1)
ไคลเอนต์จะเรียกใช้พร็อกซีถุงเท้าบนพอร์ต 9000 และโอนคำขอการเชื่อมต่อไปยังเซิร์ฟเวอร์ 192.168.0.1:8000
ssf -D 9000 -c config.json -p 8000 192.168.0.1
เซิร์ฟเวอร์จะถูกผูกไว้กับพอร์ต 8011 บนอินเทอร์เฟซเครือข่ายทั้งหมด
ssfd
เซิร์ฟเวอร์จะถูกผูกไว้กับ 192.168.0.1:9000
ssfd -p 9000 -l 192.168.0.1
ssfcp [-c config_file] [-p port] path/to/file host@absolute/path/directory_destination
ssfcp [-c config_file] [-p port] path/to/file* host@absolute/path/directory_destination
ssfcp [-c config_file] [-p port] -r path/to/dir host@absolute/path/directory_destination
data_in_stdin | ssfcp [-c config_file] [-p port] -t host@path/to/destination/file_destination
ssfcp [-c config_file] [-p port] remote_host@path/to/file absolute/path/directory_destination
ssfcp [-c config_file] [-p port] remote_host@path/to/file* absolute/path/directory_destination
ssfcp [-c config_file] [-p port] -r remote_host@path/to/dir absolute/path/directory_destination
{
"ssf" : {
"arguments" : " " ,
"circuit" : [],
"http_proxy" : {
"host" : " " ,
"port" : " " ,
"user_agent" : " " ,
"credentials" : {
"username" : " " ,
"password" : " " ,
"domain" : " " ,
"reuse_ntlm" : true ,
"reuse_nego" : true
}
},
"socks_proxy" : {
"version" : 5 ,
"host" : " " ,
"port" : " 1080 "
},
"tls" : {
"ca_cert_path" : " ./certs/trusted/ca.crt " ,
"cert_path" : " ./certs/certificate.crt " ,
"key_path" : " ./certs/private.key " ,
"key_password" : " " ,
"dh_path" : " ./certs/dh4096.pem " ,
"cipher_alg" : " DHE-RSA-AES256-GCM-SHA384 "
},
"services" : {
"datagram_forwarder" : { "enable" : true },
"datagram_listener" : {
"enable" : true ,
"gateway_ports" : false
},
"stream_forwarder" : { "enable" : true },
"stream_listener" : {
"enable" : true ,
"gateway_ports" : false
},
"copy" : { "enable" : false },
"shell" : {
"enable" : false ,
"path" : " /bin/bash|C: \ windows \ system32 \ cmd.exe " ,
"args" : " "
},
"socks" : { "enable" : true }
}
}
}| คีย์การกำหนดค่า | คำอธิบาย |
|---|---|
| ข้อโต้แย้ง | ใช้อาร์กิวเมนต์การกำหนดค่าแทนอาร์กิวเมนต์ CLI ที่กำหนด (ยกเว้น -c ) |
คีย์ arguments ช่วยให้ผู้ใช้ปรับแต่งอาร์กิวเมนต์บรรทัดคำสั่งในไฟล์กำหนดค่า คุณสมบัตินี้เป็นวิธีที่สะดวกในการบันทึกโปรไฟล์การเชื่อมต่อไคลเอนต์ที่แตกต่างกัน
ได้รับไฟล์กำหนดค่าต่อไปนี้ conf.json :
{
"ssf" : {
"arguments" : " 10.0.0.1 -p 443 -D 9000 -L 11000:localhost:12000 -v debug "
}
} SSF จะแยกอาร์กิวเมนต์ที่กำหนดและใช้เป็นแทนที่อาร์กิวเมนต์เริ่มต้น (ยกเว้น -c )
ตัวอย่างเช่น ssf -c conf.json จะเทียบเท่ากับ ssf 10.0.0.1 -p 443 -D 9000 -L 11000:localhost:12000 -v debug :
10.0.0.1:443 ( 10.0.0.1 -p 443 )-D 9000 )-L 11000:localhost:12000 )-v debug ) | คีย์การกำหนดค่า | คำอธิบาย |
|---|---|
| วงจร | เซิร์ฟเวอร์รีเลย์โซ่ที่ใช้ในการสร้างการเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกล |
วงจรเป็นอาร์เรย์ JSON ที่มีเซิร์ฟเวอร์ตีกลับและพอร์ตซึ่งจะใช้ในการสร้างการเชื่อมต่อ พวกเขามีรายการดังนี้:
{
"ssf" : {
"circuit" : [
{ "host" : " SERVER1 " , "port" : " PORT1 " },
{ "host" : " SERVER2 " , "port" : " PORT2 " },
{ "host" : " SERVER3 " , "port" : " PORT3 " }
]
}
}การกำหนดค่านี้จะสร้างห่วงโซ่การเชื่อมต่อต่อไปนี้:
CLIENT -> SERVER1:PORT1 -> SERVER2:PORT2 -> SERVER3:PORT3 -> TARGET
SSF รองรับการเชื่อมต่อผ่าน:
CONNECT HTTP| คีย์การกำหนดค่า | คำอธิบาย |
|---|---|
| http_proxy.host | โฮสต์พร็อกซี http |
| http_proxy.port | พอร์ตพร็อกซี http |
| http_proxy.user_agent | ค่าส่วนหัวของตัวแทนผู้ใช้ในคำขอ HTTP Connect |
| http_proxy.credentials.username | ข้อมูลรับรองชื่อผู้ใช้พร็อกซี (แพลตฟอร์มทั้งหมด: พื้นฐานหรือย่อย, windows: ntlm และเจรจาต่อรองถ้านำกลับมาใช้ใหม่ = false) |
| http_proxy.credentials.password | ข้อมูลรับรองรหัสผ่านพร็อกซี (แพลตฟอร์มทั้งหมด: พื้นฐานหรือย่อย, windows: ntlm และเจรจาหากนำกลับมาใช้ซ้ำ = false) |
| http_proxy.credentials.domain | โดเมนผู้ใช้ (NTLM และเจรจารับรองความถูกต้องบน Windows เท่านั้น) |
| http_proxy.credentials.reuse_ntlm | นำข้อมูลรับรองผู้ใช้คอมพิวเตอร์ปัจจุบันกลับมาใหม่เพื่อรับรองความถูกต้องด้วยพร็อกซี NTLM Auth (SSO) |
| http_proxy.credentials.reuse_kerb | นำข้อมูลรับรองผู้ใช้คอมพิวเตอร์ปัจจุบันกลับมาใช้ใหม่ (ตั๋ว Kerberos) เพื่อตรวจสอบสิทธิ์ด้วยพร็อกซีเจรจาต่อรอง Auth (SSO) |
รูปแบบการรับรองความถูกต้องที่รองรับ:
| คีย์การกำหนดค่า | คำอธิบาย |
|---|---|
| Socks_proxy.version | รุ่นถุงเท้า (4 หรือ 5) |
| Socks_proxy.host | โฮสต์พร็อกซีของถุงเท้า |
| Socks_proxy.port | พอร์ตพร็อกซีถุงเท้า |
ไม่สนับสนุนรูปแบบการตรวจสอบสิทธิ์
| คีย์การกำหนดค่า | คำอธิบาย |
|---|---|
| tls.ca_cert_path | filepath สัมพัทธ์หรือสัมบูรณ์ไปยังไฟล์ใบรับรอง CA |
| tls.cert_path | filepath สัมพัทธ์หรือสัมบูรณ์ไปยังไฟล์ใบรับรองอินสแตนซ์ |
| tls.key_path | filepath สัมพัทธ์หรือสัมบูรณ์กับไฟล์คีย์ส่วนตัว |
| tls.key_password | รหัสผ่านหลัก |
| tls.dh_path | filepath สัมพัทธ์หรือสัมบูรณ์กับไฟล์ diffie-hellman (เซิร์ฟเวอร์เท่านั้น) |
| tls.cipher_alg | อัลกอริทึมการเข้ารหัส |
ด้วยตัวเลือกเริ่มต้นไฟล์และโฟลเดอร์ต่อไปนี้ควรอยู่ในไดเรกทอรีการทำงานของไคลเอนต์หรือเซิร์ฟเวอร์:
./certs/dh4096.pem./certs/certificate.crt./certs/private.key./certs/trusted/ca.crtที่ไหน:
หากคุณต้องการไฟล์เหล่านั้นที่เส้นทางที่แตกต่างกันเป็นไปได้ที่จะปรับแต่งได้ด้วยปุ่มเส้นทาง TLS:
{
"ssf" : {
"tls" : {
"ca_cert_path" : " ./certs/trusted/ca.crt " ,
"cert_path" : " ./certs/certificate.crt " ,
"key_path" : " ./certs/private.key " ,
"key_password" : " " ,
"dh_path" : " ./certs/dh4096.pem " ,
"cipher_alg" : " DHE-RSA-AES256-GCM-SHA384 "
}
}
}| คีย์การกำหนดค่า | คำอธิบาย |
|---|---|
| tls.ca_cert_buffer | เนื้อหาไฟล์ใบรับรอง CA ในรูปแบบ PEM (: คำเตือน: n ระหว่างข้อมูลและส่วนหัว/ส่วนท้ายของ PEM) |
| tls.cert_buffer | เนื้อหาไฟล์ใบรับรองอินสแตนซ์ในรูปแบบ PEM (: คำเตือน: n ระหว่างข้อมูลและส่วนหัว/ส่วนท้ายของ PEM) |
| tls.key_buffer | เนื้อหาไฟล์คีย์ส่วนตัวในรูปแบบ PEM (: คำเตือน: n ระหว่างข้อมูลและส่วนหัว/ส่วนท้ายของ PEM) |
| tls.key_password | รหัสผ่านหลัก |
| tls.dh_buffer | พารามิเตอร์ Diffie-Hellman พารามิเตอร์เนื้อหาไฟล์ในรูปแบบ PEM (: คำเตือน: n ระหว่างข้อมูลและส่วนหัว/ส่วนท้ายของ PEM, เซิร์ฟเวอร์เท่านั้น) |
| tls.cipher_alg | อัลกอริทึมการเข้ารหัส |
คุณสามารถรวมพารามิเตอร์ TLS ลงในไฟล์กำหนดค่าได้โดยตรงโดยใช้ tls.ca_cert_buffer , tls.cert_buffer , tls.key_buffer และคีย์ tls.dh_buffer
{
"ssf" : {
"tls" : {
"ca_cert_buffer" : " -----BEGIN CERTIFICATE----- n ... n -----END CERTIFICATE----- " ,
"cert_buffer" : " -----BEGIN CERTIFICATE----- n ... n -----END CERTIFICATE----- " ,
"key_buffer" : " -----BEGIN RSA PRIVATE KEY----- n ... n -----END RSA PRIVATE KEY----- " ,
"key_password" : " " ,
"dh_buffer" : " -----BEGIN DH PARAMETERS----- n ... n -----END DH PARAMETERS----- " ,
"cipher_alg" : " DHE-RSA-AES256-GCM-SHA384 "
}
}
} ใบรับรองคีย์ส่วนตัวและพารามิเตอร์ DH ต้องอยู่ในรูปแบบ PEMn ระหว่างข้อมูลและส่วนหัว/ส่วนท้ายของ PEM เป็นสิ่งจำเป็น
| คีย์การกำหนดค่า | คำอธิบาย |
|---|---|
| บริการ.*. เปิดใช้งาน | เปิด/ปิดใช้งาน microservice |
| บริการ.*. gateway_ports | เปิด/ปิดพอร์ตเกตเวย์ |
| services.shell.path | เส้นทางไบนารีที่ใช้สำหรับการสร้างเปลือก |
| services.shell.args | อาร์กิวเมนต์ไบนารีที่ใช้สำหรับการสร้างเชลล์ |
คุณสมบัติของ SSF ถูกสร้างขึ้นโดยใช้ microservices (การส่งต่อ TCP, ถุงเท้าระยะไกล, ... )
มีไมโครไซต์ 7 แห่ง:
แต่ละคุณสมบัติคือการรวมกันของ microservice ด้านไคลเอ็นต์อย่างน้อยหนึ่งรายการและ Microservice ด้านเซิร์ฟเวอร์หนึ่งตัว
ตารางนี้รวมกันว่าการประกอบคุณลักษณะแต่ละอย่าง:
| คุณสมบัติ SSF | ด้านไคลเอนต์ Microservice | ด้านเซิร์ฟเวอร์ Microservice |
|---|---|---|
-L : การส่งต่อ TCP | stream_listener | stream_ forwarder |
-R : การส่งต่อ TCP ระยะไกล | stream_ forwarder | stream_listener |
-U : การส่งต่อ UDP | dataGram_listener | dataGram_forwarder |
-V : การส่งต่อ UDP ระยะไกล | dataGram_forwarder | dataGram_listener |
-D : ถุงเท้า | stream_listener | ถุงเท้า |
-F : ถุงเท้าระยะไกล | ถุงเท้า | stream_listener |
-X : เชลล์ | stream_listener | เปลือก |
-Y : Shell ระยะไกล | เปลือก | stream_listener |
สถาปัตยกรรมนี้ทำให้ง่ายต่อการสร้างคุณสมบัติระยะไกล: พวกเขาใช้ไมโครไซต์เดียวกัน แต่อยู่ฝั่งตรงข้าม
ssf และ ssfd มาพร้อมกับ Microservices ที่เปิดใช้งานล่วงหน้า นี่คือการกำหนดค่า Microservices เริ่มต้น:
{
"ssf" : {
"services" : {
"datagram_forwarder" : { "enable" : true },
"datagram_listener" : { "enable" : true },
"stream_forwarder" : { "enable" : true },
"stream_listener" : { "enable" : true },
"socks" : { "enable" : true },
"copy" : { "enable" : false },
"shell" : { "enable" : false }
}
}
} ในการเปิดใช้งานหรือปิดใช้งาน microservice ให้ตั้งค่าปุ่ม enable เป็น true หรือ false
การพยายามใช้คุณสมบัติที่ต้องการ microservice ที่ปิดใช้งานจะส่งผลให้เกิดข้อความแสดงข้อผิดพลาด
openssl dhparam 4096 -outform PEM -out dh4096.pemก่อนอื่นให้สร้างไฟล์ชื่อ extfile.txt ที่มีบรรทัดต่อไปนี้:
[ v3_req_p ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
จากนั้นสร้างใบรับรองที่ลงนามด้วยตนเอง (CA) CA.CRT และคีย์ส่วนตัว CA.KEY :
openssl req -x509 -nodes -newkey rsa:4096 -keyout ca.key -out ca.crt -days 3650สร้างคีย์ส่วนตัว ส่วนตัวคีย์ และ ใบรับรองใบรับรองใบรับรองใบรับรอง CSSR :
openssl req -newkey rsa:4096 -nodes -keyout private.key -out certificate.csrสร้างใบรับรอง ( certificate.pem ) โดยการลงนาม CSR กับ CA ( ca.crt , ca.key ):
openssl x509 -extfile extfile.txt -extensions v3_req_p -req -sha1 -days 3650 -CA ca.crt -CAkey ca.key -CAcreateserial -in certificate.csr -out certificate.pem