Last active
October 9, 2023 15:44
-
-
Save pich4ya/02aea07c3d311b14467f04c05c71c9a2 to your computer and use it in GitHub Desktop.
การทำ SSH Tunnel (-D, -R, -L)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# @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