Skip to content

Instantly share code, notes, and snippets.

@pich4ya
Last active October 9, 2023 15:44
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save pich4ya/02aea07c3d311b14467f04c05c71c9a2 to your computer and use it in GitHub Desktop.
Save pich4ya/02aea07c3d311b14467f04c05c71c9a2 to your computer and use it in GitHub Desktop.
การทำ SSH Tunnel (-D, -R, -L)
# @author LongCat (p.morimoto@sth.sh)
# การทำ SSH Tunnel (-D, -R, -L)
กรณี 1: -D ทำ socks4a proxy ไปออกเน็ตที่เครื่อง ssh server
ทำให้เรามี proxy บนเครื่อง MacOS ที่ถ้าเราใช้ proxy นี้จะ route network ไปที่ ssh server ได้
ตัวอย่างเช่น server A ต่อหา server B ได้, เราต่อหา server A ได้ แต่เราต่อหา server B โดยตรงไม่ได้
ทำให้เราสามารถทำ proxy ให้เน็ตวิ่งไป server A -> server B ต่ออีกที
$ ssh -D 31337 -q -C -N longcat@demo.ssh.example
จากนั้นตั้ง proxy ที่ 127.0.0.1:31337 เช่นใช้ proxychains
$ brew install proxychains-ng
$ sudo vim /usr/local/etc/proxychains.conf
socks4 127.0.0.1 31337
$ proxychains wpscan <...>
ประโยชน์ของ -D:
ใช้กรณีเราแฮกเข้าไปเครื่องเซิร์ฟเวอร์ที่มี network interface มากกว่า 1 อัน เช่น host เรา IP 10.1.1.11 ต่อ ssh ไปหา host 10.1.1.12 ได้ แต่เครื่อง host 10.1.1.12 มี network อีกขาไป host 192.168.0.4 ได้อีก (ซึ่งเราที่อยู่ 10.1.1.11 ต่อไปไม่ได้) เราเลยทำ ssh tunnel ใช้ 10.1.1.12 เป็นตัวกลาง (proxy) ในการส่งข้อมูลไป-กลับหา host 192.168.0.4
โดยการใช้ -D จะสามารถ route ออกไป host ปลายทาง (กรณีนี้คือ 192.168.0.4) ได้ทุก port ตามที่ ssh server ที่เราใช้เป็น proxy (10.1.1.12) เข้าถึงได้
เรา 10.1.1.11 -ssh tunnel-> proxy [eth0: 10.1.1.12 / eth1: 192.168.0.3] -> ที่เราจะคุยด้วย 192.168.0.4
ปกติถ้าคนทั่วไป ไม่ได้ทำ pentest ท่านี้จะใช้บ่อยสุด คือแค่ใช้ server ตรงกลางเป็น proxy ธรรมดานี้เอง
กรณี 2: -R ทำให้ network ที่เครื่อง ssh server ต่อย้อนกลับมาที่ local port ของ ssh client ได้
เราเปิด web server บนเครื่อง MacOS (ssh client) ที่ TCP/8002
อยากให้ คนที่ ต่อเข้ามาที่ เครื่องปลายทางที่เรา ssh ไป (ssh server) ที่ TCP/8001
แล้ว forward ข้อมูล กลับมาที่ web server เราบนเครื่อง MacOS (ssh client) ที่ TCP/8002 ได้
ssh-client $ python3 -m http.server 8002
ssh-client $ ssh -R 192.168.123.210:8001:0.0.0.0:8002 -N longcat@demo.ssh.example
192.168.123.210 คือ addr ของ inf บนเครื่องที่เรารัน ssh server
8001 คือ port บนเครื่อง ssh server (ที่จะให้คนอื่นต่อเข้ามา)
0.0.0.0 คือ addr ของ inf บนเครื่องที่เรารัน ssh client
8002 คือ port บนเครื่องที่เรารัน ssh client (ที่เราเปิด web server)
ssh-server $ curl 192.168.123.210:8001 -v # จะต่อเข้า port 8002 ของ ssh-client
หรือถ้าเครื่องอื่นในวง network ของ 192.168.123.210 (เช่น 192.168.123.0/24 หรืออื่น ๆ ที่มี route หากันได้)
ก็จะต่อเข้ามาที่ 192.168.123.210:8001 ได้เช่นกัน
ประโยชน์ของ -R:
กรณีที่เราอยากเปิด web server หรือ รอรับ reverse shell บนเครื่อง ssh client เรา โดยที่เครื่องปลายทางที่จะต่อเข้ามา เข้าถึงเราโดยตรงไม่ได้ แต่เข้าถึง ssh server ที่เราต่อไปได้
เรา 0.0.0.0:8002 <-ssh tunnel- 192.168.123.210:8001 <-ssh tunnel- host 10.11.1.123 ที่จะคุยกับเรา
กรณี 3: -L ทำให้ network ที่เครื่อง ssh client ต่อไปหา local port ของ ssh server ได้
ตัวอย่าง 3.1 กรณี ssh server ที่เราเข้าได้มี web server เปิดอยู่ที่ 127.0.0.1:11223 แต่เราจะเข้า โดยตรงบนเครื่อง ssh client ไม่ได้เพราะถ้าเราเข้า 127.0.0.1:11223 มันจะวิ่งไปที่ localhost ของเครื่องเรา (ssh client) แทน
ssh -L 127.0.0.1:1080:127.0.0.1:11223 longcat@demo.ssh.example -N
จากนั้น การที่เราเข้าเว็บ http://127.0.0.1:1080 บน MacOS จะทะลุไปเข้าเว็บ http://127.0.0.1:11223 บนเครื่อง demo.ssh.example แทน
ตัวอย่าง 3.2 ใน ssh server ปลายทางมี port TCP/1234 ที่มีช่องโหว่ ที่เรายิง exploit.py เข้าไปแล้วแตก แต่ว่า เปิดอยู่ใน network interface ของ ssh server ที่เราเข้าถึงไม่ได้
เรา (ssh client)
- eth0: 10.1.1.12
ปลายทาง (ssh server)
- eth0: 10.1.1.13
- eth1: 192.168.0.123 มี port TCP/1234 ถูกเปิดไว้
จะเห็นว่าในตัวอย่างนี้เรา (ssh client) ที่ 10.1.1.12 จะต่อเข้า port TCP/1234 ของ ปลายทาง (ssh server) ตรง ๆ ไม่ได้เราเลยอาจจะต้องใช้ -L ช่วย
$ ssh -L 127.0.0.1:4321:192.168.0.123:1234 longcat@10.1.1.13 -N
จากนั้นเรายิงเข้า 127.0.0.1:4321 บนเครื่องเรา (ssh client) จะไปทะลุถึง 192.168.0.123:1234
$ python exploit.py 127.0.0.1:4321
เรา 127.0.0.1:4321 -ssh tunnel-> 10.1.1.13:22 -ในเครื่องเดียวกัน-> 192.168.0.123:1234
ประโยชน์ของ -L:
ใช้กรณี เครื่อง ssh server ปลายทางที่เราต่อไปได้ ดันมี local port ที่เข้าถึงได้ (bind/listening ไว้ที่) จาก localhost หรือ network interface ที่จากเครื่อง ssh client เราเข้าถึงโดยตรงไม่ได้ แต่เราอยากจะเข้า
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment