Tải bản đầy đủ (.docx) (45 trang)

Tấn công ROOTKIT trên ORACLE AT9A HVKTMM

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.06 MB, 45 trang )

HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA CÔNG NGHỆ THÔNG TIN

BÀI TẬP LỚN
MÔN: AN TOÀN CƠ SỞ DỮ LIỆU

TẤN CÔNG ROOTKIT TRONG
ORACLE

Giảng viên hướng dẫn:
Trần Thị Lượng
Sinh viên thực hiện:
Nguyễn Việt Tiến
Phạm Quốc Đạt
Mai Trọng Hoàng
Hoàng Quang Thụy
Lớp: AT9A

HÀ NỘI 2016


HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA CÔNG NGHỆ THÔNG TIN

Bài tập lớn môn: An toàn cơ sở dữ liệu

TẤN CÔNG ROOTKIT TRONG ORACLE

Nhận xét của giảng viên: ............................................................................................
......................................................................................................................................
......................................................................................................................................


......................................................................................................................................
......................................................................................................................................
......................................................................................................................................
......................................................................................................................................
......................................................................................................................................
......................................................................................................................................

Điểm chuyên cần: ........................................................................................................
Điểm báo cáo: ..............................................................................................................


MỤC LỤC


LỜI NÓI ĐẦU
Rootkit trong OS không còn xa lạ với chúng ta. Chúng đã được các kẻ xâm
nhập sử dụng để che giấu các dấu vết từ rất lâu. Tuy nhiên, không phải ai cũng
biết rằng rootkit còn có thể được sử dụng và đang được các hacker sử dụng
trong cơ sở dữ liệu, thường chứa các dữ liệu quan trọng của các công ty, tổ
chức.
Theo ước tính, khoảng 100 triệu người có thông tin cá nhân nằm trong
tầm kiểm soát của tội phạm Internet. Lấy cắp thông tin đã trở thành một nguy
cơ chính, thông tin đã trở thành mỏ vàng cho tội phạm. Thông tin cá nhân được
chia thành nhiều loại với mức giá khác nhau. Ví dụ, thông tin về đị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 được đặt giá. Rất
nhiều cơ sở dữ liệu của các công ty lớn bị xâm phạm. Nhất là các ngân hàng, nhà
băng, dịch vụ thẻ thanh toán như CardSystems, Citigroup, Bank of America, DSW
Shoe Warehouse … đều đã bị tội phạm nhòm ngó và gây ra thiệt hại nhất định.
Oracle là hãng dẫn đầu trong thị trường cơ sở dữ liệu và thường được sử
dụng ở các cơ quan, tổ chức lớn. Với khối lượng dữ liệu lớn và quan trọng.

Không nghi ngờ gì, Oracle đã trở thành đích ngắm hấp dẫn trong các cuộc tấn
công.
Oracle database rootkit là hướng tấn công khá mới. Rootkit được cài đặt
sau khi đã đột nhập thành công vào một Oracle database, để che giấu mọi dấu
vết của cuộc đột nhập, và trở thành tấm bình phong che chắn sự hiện diện của
attacker trong database. Người quản trị sẽ khó lòng biết được database của
mình có đang bị nhìn ngó hay bị tấn công hay không, dù có sử dụng các công cụ
tìm kiếm rootkit. Và vì thế không có biện pháp cải thiện hay áp dụng phương
pháp tự bảo vệ, qua một thời gian dài thiệt hại sẽ rất đáng kể. Khi mà cơ sở dữ
liệu là một tài nguyên vô cùng quan trọng có ý nghĩa sống còn đối với doanh
nghiệp, tổ chức.

4


CHƯƠNG I: TỔNG QUAN VỀ ROOTKIT
1.1. Hiểu biết chung về mã độc hại (Malware)
Thuật ngữ malware là từ viết tắt của malicious software. Malware được
tạo với mục đích truy cập, chỉnh sửa và phá hoại các software khác trên máy
tính. Malware có nhiều loại: virus, worms, Trojans, backdoor, spyware…và các
biến thể khác xuất hiện từng ngày.
Mục tiêu của malware có thể là thông tin cá nhân, dữ liệu, tài nguyên, máy
tính… bằng cách ghi dấu các thói quen lướt Web của bạn, chúng biết những vẫn
đề bạn quan tâm và những quảng cáo mà sẽ phù hợp với ý định của bạn. Những
malware này cho phép các công ty quảng cáo thiết kế các pop up nắm bắt mục
đích của từng cá nhân. Xa hơn nữa, malware có thể điều khiển nội dung những
gì được hiển thị trên trình duyệt của bạn. Đó là hijacking. Các nội dung tìm kiếm
và hiển thị của bạn có thể bị hijacking sang trang mà malware chỉ định. Điều này
có thể đưa đến nhiều phiền toái với các pop up liên tục nhảy ra, và tệ hơn nữa nó
cở thể chứa các virus, worm mà khi vô tình kích phải chúng sẽ ngay lập tức xâm

nhập và máy tính của bạn.
Mục tiêu thứ ba, là thông tin cá nhân. Những thông tin dùng để đăng nhập
và tìa khoản ngân hàng, chuyển tiền, rút tiền. Nếu bạn dùng password, hacker có
thể dùng chương trình giải mã mật khẩu. Hoặc nó có thể giả một chương trình
an ninh, dụ bạn cài vào mà không biết trong đó có thể có chương trình
keylogger, spyware…sẵn sang lấy cắp thông tin của bạn. Cuối cùng, hacker sẽ lợi
dụng tài nguyên hệ thống vào những mục đích như tấn công hệ thống khác, ẩn
nấp sau hệ thống của bạn nhằm che giấu hành tung của mình. Để thực hiện được
các mục đích này, malware sẽ thực hiện dễ dang hơn nếu có sự trợ giúp của
rootkit. Vì thế các malware đầu tiên sẽ cài đặt rootkit vào máy, tới lượt mình
rootkit sẽ che giấu hành vi của malware. Thực tế, rootkit là xấu hay tốt do mục
đích mà nó được sử dụng.
1.2. Khái niệm Rootkit
1.2.1. Lịch sử Rootkit
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 Unix-like (Solaris và Linux) và
5


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 trình
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ố) vởi Mark
Rusonovich 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 31/10/2005 đã đưa ra 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
những người tạo ra 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 6/12/2005 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 trong tổng số malware là 14%, trong khi tại
thời điển của sự kiện Sony Rootkit con số đó là 8%.
1.2.2. Định nghĩa Rootkit
Rootkit /ru:tkit/ là bộ công cụ phần mềm che giấu sự tồn tại tập tin nhưng
thực ra nó vẫn hoạt động. Rootkit thường được bên thứ ba (thường là kẻ xâm
nhập) dùng sau khi chiếm được quyền truy cập vào hệ thống máy tính. Các công
cụ này thường nhằm để che dấu dữ liệu hệ thống, tập tin hoặc tiến trình đang
chạy, từ đó giúp cho kẻ xâm nhập duy trì quyền truy cập vào hệ thống mà người
dùng không biết. Rootkit có ở nhiều loại hệ điều hành như Linux, Solaris và các
phiên bản Microsoft Windows. Một máy tính bị cài rootkit được gọi là bị "chiếm
quyền root" ("rooted" trong tiếng Anh).
Thuật ngữ "rootkit" (còn được viết là "root kit") lúc đầu được dùng để chỉ
một bộ công cụ Unix được biên dịch lại như "ps", "netstat", "w" and "passwd" có
6


thể che dấu kĩ lưỡng vết tích của kẻ xâm nhập mà bình thường sẽ bị hiển thị bởi
các lệnh trên, vì vậy nó cho phép kẻ xâm nhập duy trì quyền "root" ("siêu người
dùng") trên hệ thống mà ngay cả người quản trị hệ thống cũng không thể thấy
họ.
Ngày nay thuật ngữ này không chỉ giới hạn ở các hệ điều hành dựa trên

Unix mà còn được dùng để chỉ các công cụ thực hiện tác vụ tương tự trên hệ
điều hành không Unix như Microsoft Windows (ngay cả khi hệ điều hành đó
không có tài khoản "root").
1.3. Cách thức hoạt động của Rootkit
Sự xuất hiện của Rootkit trên máy tính hay mạng cho thấy khả năng bị vi
phạm của các hệ thống mà bạn phải làm việc và tin tưởng và đó cũng là lỗ hổng
an ninh lớn nhất. Không nghi ngờ gì nữa, rootkit có khả năng quanh quẩn ở đâu
đó để thực hiện những nhiệm vụ mà nhờ đó nó được tạo ra. Vậy làm thế nào
rootkit có thể lợi hại như vậy? Đó là nhờ lợi dụng tính mềm dẻo và linh hoạt của
kiến trúc Windows. Phần này chúng ta sẽ tìm hiểu cách thức ẩn nấp và hoạt
động của Rootkit.
1.3.1. Chiếm quyền điều khiển
Bất kỳ khi nào user hay một chương trình nào cần truy vấn hệ thống, kết
quả trả về sẽ được mặc định tin tưởng không gợn chút nghi vẫn. Rootkit lợi
dụng sự tin tưởng cơ bản này. Đầu tiên nó phải chiếm được quyền quản trị hệ
thống để có thể điều khiện hệ thống làm gì cho nó. Vì thế chiếm quyền admin là
một bước vô cùng quan trọng và quyết định.
1.3.2. Kỹ thuật Hooking
Là kỹ thuật mà Rootkit sử dụng để thay đổi đường dẫn thực thi của hệ
điều hành - nó chặn các lời gọi hệ thống và điều chỉnh kết quả sao cho không có
dấu vết gì về sự tồn tại của nó. Hook sẽ chuyển hướng các chương trình bình
thường, sang các hàm của rootkit thay vì các hàm của hệ thống. Cả kernel mode
và user mode rootkit đều sử dụng kỹ thuật hooking để lọc các kết quả trả về bởi
OS và giấu đi sự tồn tại của nó. Các chương trình phân tích và quét sẽ không
phát hiện ra thông tin về sự tồn tại của nó trong Registry, cũng như các port mà
rootkit sử dụng. Đó là vì các chương trình này dựa trên thông tin lấy từ OS.
Chúng ta sẽ không phát hiện được rootkit thông qua các công cụ như Task
Manager, windows explorer hay regedit. Windows sử dụng các table để lưu trữ
7



và ghi dấu các thông tin quan trọng. Các table này có thể bị hook, thay đổi và bẻ
gẫy bởi rootkit.
User mode và kernel mode rootkit đều sử dụng kỹ thuật hook và mỗi loại
bị hạn chế bởi những gì mà chúng có thể hook do phạm vi hoạt động của chúng.
User mode rootkit chỉ có thể hook các table trong phạm vi không gian địa chỉ
dành cho user(các bảng IAT, EAT) hoặc có thể chèn các jump vào API mức user để
thay các system call sang function của rootkit.
Có hai kiểu hook là priviledge hook và unpriviledge hook. User mode
rootkit là các unpriviledge, trong khi kernel mode rootkit là priviledge hook. Ở
mỗi kiểu hook khác nhau về quyền hệ thống đều sử dụng kỹ thuật hook giống
nhau. Kỹ thuật hooking API và thay đổi địa chỉ API: user mode rootkit sẽ chặn
các lời gọi hàm API và thay đổi địa chỉ API trong IAT thuộc tiến trình của user,
sau đó trỏ tời rootkit function thay vì Windows API functions. Cả user mode và
kernel mode rootkit sử dụng API hooking để đảm bảo OS chỉ trả về kết quả đã
được sàng lọc, vốn sẽ bỏ rơi bất kỳ sự tiết lộ nào về rootkit hay tung tích của nó.
User mode rootkit chỉ cho thể chỉnh sửa table nào thuộc về chương trình user.
Mỗi chương trình user có IAT riêng chứa thông tin về các function mà kernel sẽ
thực hiện cho nó. Để hiệu quả, user mode rootkit phải tìm cách để thay đổi table
của mọi user program và điều khiển bất kỳ chương trình nào sắp sửa chạy để nó
cỏ thể hook API tương ứng của chương trình đó. Rootkit không nhất thiết phải
hook mọi API, chỉ những API nào có thể liên quan tới nó. Ví dụ nó có thể hook API
của Task Manager dùng để liệt kê các process hoặc API mà dùng bởi Windows
Explorer để liệt kê danh sách các file, folder. Và bởi vì nó phải hook cùng một API
của mọi tiến trình đang được kích hoạt nên user mode rootkit ít hiệu quả bằng
kernel mode rootkit. Kernel mode rootkit chỉ cần hook một cấu trúc mà tất cả
user program sử dụng.
1.4. Phân loại Rootkit
Rootkit được phân chia thành hai loại: user mode, kernel mode rootkit phụ
thuộc vào phạm vi ảnh hưởng và liệu chúng chỉ tồn tại trong bộ nhớ hay sau khi

khởi động lại (được ghi lên ổ đĩa) persiten và non-persitent rootkit.

8


1.4.1. User-mode rootkit và kernel-mode rootkit
Đây là rootkit có cơ chế điều khiển và phạm vi ảnh hưởng lên hệ điều hành
khác nhau. Cơ chế điều khiển thông qua đặc quyền mà nó giành được. đặc biệt
quyền càng lớn, phạm vi ảnh hưởng càng tăng.
Bất kể là chế độ nào đi nữa, thì mọi rootkit đều dựa trên cơ sở: các
chương trình giao tiếp với nhau nhờ các lời gọi hàm. Tùy vào mức đặc quyền của
chương trình, nó có thể tạo lời gọi trực tiếp tới kernel hay gián tiếp qua một bên
xử lý thứ ba đứng giữa nó và kernel. Hay người ta gọi là User mode và kernel
mode.
Rootkit mức user, là mức đặc quyền thấp nhất, nó phải sử dụng giao diện
ứng dụng chương trình API để gửi tới yêu cầu tới hệ thống. Các lời gọi này sẽ
thông qua thư viện liên kết động mức user(DLL) để được chuyển thành thông
điệp mà kernel có thể hiểu. Thực tế thì chương trình mức user không tự chứa tất
cả các khả năng xử lý, nó sẽ phải tạo các system call tới kernel. Ví dụ, user click
chuột OK, Windows chuyển thông tin đó thành một system call để hệ thống xử lý.
Ngôn ngữ mà Window cung cấp để thực hiện giao tiếp giữa kernel và chương
trình mức user gọi là API. Để vận hành tốt hơn, mỗi chương trình user tạo một
bảng riêng chứa địa chỉ của tất cả API hoặc system function mà nó sẽ cần gọi tới.
Bảng đó được gọi là 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 của user mode rootkit. Lợi điểm của nó là dễ tạo, không
làm hệ thống bị treo hay gặp sự cố. Nhưng để có kết quả nhất định, user mode
rootkit còn khá nhiều việc phải làm.
Kernel mode rootkit: Kernel là phần mềm tương ứng với đơn vị xử lý trung
tâm - bộ não của hệ điều hành, là thành phần căn bản. Kernel duy trì và điểu
khiển nhiều tài nguyên quan trọng, và các hàm như thông tin bộ nhớ, an ninh,

lập lịch xử lý, giao tiếp giữa phần cứng và tất cả các ứng dụng tất cả các chương
trình đều phải tương tác với kernel theo một cách nào đó. Và nếu rootkit thao
túng được kernel, nó sẽ ở vị trí điều khiển tất cả.
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 sẽ cài đặt
một driver sẽ chuyển hướng các system function call sang mã lập trình của nó để
thi hành.
1.4.2. Persistent và non-persistent rootkit
Persistent rootkit: để có thể tồn tại sau khi hệ thống khởi động rootkit phải
thay đổi được nội dung ổ cứng: rootkit sẽ chèn thêm một mục autostart và
9


Registry, nhờ đó nó được load vào bộ nhớ và tự động thực thi mỗi lần máy tính
khởi động. Dù các thay đổi vật lý làm tăng khả năng bị phát hiện nhưng vẫn rất
nhiều tiện ích hệ thống cũng như chương trình quét malware lại bỏ qua rootkit.
Non-persistent rootkit: chỉ tồn tại trên bộ nhớ và mất đi khi hệ thống khởi
động lại. Các chương trình mà bỏ qua việc quét các nơi lưu trữ vật lý sẽ không
phát hiện ra rootkit này. Non-persister rootkit có vẻ như ít đe dọa tới những ai
mà việc khởi động lại máy tính là thường xuyên. Nhưng đối với một mạng server
với hàng trăm máy tính client, việc reboot thường rất hiếm. Các rootkit nằm trên
bộ nhớ thường lợi dụng điểm này, hơn nữa, rootkit kiểu này không để lại manh
mối vật lý nào để có thể bị phát hiện.

10


CHƯƠNG II: TẤN CÔNG ROOTKIT TRONG ORACLE
Oracle database và OS khá tương đồng với nhau về mặt cấu trúc. Cả
Oracle database và OS đều có user, process, job, executable và symbolic link. Vì

vậy, hacker có thể lợi dụng sự tương đồng này để triển khai các rootkit cũng như
các mã độc khác như virus từ phạm vi của OS sang lãnh địa của Oracle database.
Một số tương đồng về command và object giữa Oracle và OS*Nix
*NIX
command/obje
ct
Ps
Kill
>
Executable
Execute
Cd
Rm
fdisk

Oracle command/object
SELECT *FROM V$PROCESS
ALTER SYSTEM KILL SESSION ’12,55’
View, package, function and procedure
SELECT * FROM MY_VIEW EXEC PROCEDURE
ALTER SESSION SET CURRENT_SCHEMA=USER01
Delete bal…(put in correct sytax)
Drop tablespaces
Bảng 1: Tương đồng giữa database và OS

Thông thường có một thủ thuật của rootkit OS thế hệ đầu tiên khi ẩn một
tài khoản. Lệnh ở trong OS*Nix như ps, who và top đã bị thay thế bằng phiên bản
của Trojan, liệt kê tất cả trừ tài khoản của kẻ xâm nhập. Hướng tiếp cận này
cũng có thể được áp dụng đối với DB. Rootkit database cũng cần che giấu các

hành tung của nó, cụ thể là các process, job, login. Bằng cách tác động vào nơi sẽ
lưu trữ và cung cấp các thông tin này cũng như tác động vào các base table và
các data dictionary view là sys.user$, v$pwfile_users…Vì vậy attacker cần can
thiệp vào source code của các view này.
Đầu tiên, chúng ta thử tìm hiểu một số data dictionary view mà cung cấp
thông tin về user cũng như thông tin về các tiến trình có liên quan tới hoạt động
của user trong DB. Và tìm hiểu một số PL/SQL package sẵn có của Oracle được
sử dụng cho việc tấn công của attacker.
11


2.1. Tìm hiểu 1 số data dictionary view
DBA_JOBS
View dba_jobs lưu thông tin về tất cả jobs trong database. Thông tin về các
cột trong view này:
Column
Job
Log_user
Priv_user
Schema_user
Last_date
Last_sec
This_date
This_sec
Next_date
Next_sec
Total_time
Brocken
Interval
Failures

What
Nls_env
Misc_env
instance

Comments
Xác định một job. Không thay đổi nó dù thực hiện import hay
export nhiều lần
Khi user xác nhận job thì sẽ được ghi lại
User có quyền mặc định được áp dụng cho job này
Schema mặc định được gán cho job khi thực thi
Thời điểm gần nhất mà job được thực hiện thành cng
Tương tự như last_date
Thời điểm mà job được bắt đầu thực hiện(là null nếu ko thực
thi)
Tương tự this_date. Thời điểm lần thực thi cuối cùng được
bắt đầu
Thời điểm kế tiếp mà job sẽ được thực hiện
Tương tự next_date. Thời điểm được thực hiện kế tiếp
Tổng thời gian sử dụng hệ thống của job, tính theo giây
Nếu là Y, nghĩa là không có một cố gắng chạy job này.
Nếu là N có một cố gắng để chạy job
Lập lịch chạy job lần tiếp thep
Số lần khởi động job và không thành công kể từ lần thành
công gần nhất
Body của block anonymous PL/SQL mà job này thực hiện
Tham số phiên mô tả biến môi trường nls của job
Tham số phiên khác áp dụng cho job
ID của instance chạy hoặc có thể chạy job. Mặc định là 0
Bảng 2: View dba_jobs


12


DBA_JOB_RUNNING
View Dba_job_running liệt kê thông tin về tất cả job đang chạy
Column
Failures
instance
Job
Last_date
Last_sec
SID
This_date
This_sec

Comments
Số lần job được khởi hoạt và thất bại kể từ lần thành công
sau cùng
ID của instance chạy job
ID của job đang chạy
Ngày gần nhất mà job chạy thành công
Tương tự như last_date,đó là lần thực hiện thành công gần
nhất
ID của tiến trình đang thực hiện job
Ngày mà job bắt đầu thực hiện(thường là null nếu không
đang thực hiện)
Giống như this_date. Đó là lần thực hiện thành công cuối
cùng
Bảng 3: View dba_jobs_running


V$PROCESS
Lưu thông tin về các process hiện tại đang chạy
Column
addr
Pid
Spid
Username
Trace ID
Background
Latchwait
Latchspin
Pga_used_mem
Pga_alloc_mem

Comments
Địa chỉ của process
Định danh của process
Định danh trên OS của process
Process được chạy bằng tài khoản OS nào
Định danh file trace
Nhận diện process có phải tiến trình background không
Địa chỉ của Latch mà process đang đợi
Địa chỉ của latch mà process đang spinning trên
Vùng nhớ PGA mà process sử dụng
Vùng nhớ PGA hiện thời được cấp phát cho process
Bảng 4: V$Process

13



V$Session
V$sesion liệt kê các thông tin về mỗi session hiện tại. rootkit cần tìm cách
che giấu thông tin về các process ở trong các view này. Một số thông tin trong
view v$sesion:
Column
Saddr
sid
Sarial#
Paddr
Event
Status
Logon_time
Username
Command
Type

Comments
Địa chỉ session
Định danh session
Số serial của session. Dùng để xác định duy nhất một
object của session đảm bảo rằng các câu lệnh được thực
thi đúng đối tượng khi session kết thúc và một session
khác dùng ID lại định danh của session
Địa chỉ của process sở hữu session,
Tài nguyên hoặc sự kiện mà session đang đợi
Trạng thái của session(active, inactive, killed, catched…)
Thời gian logon
Tên user
Các lệnh đang xử lý

Kiểu session
Bảng 5: V$Session

2.2. Khai thác các PL/SQL Package
Package là một schema object nhóm các kiểu, biến và chương trình
PL/SQL có liên quan. Package thường có 2 phần: phần đặc tả là phần giao tiếp
của package. Nó khai báo các kiểu, các biến, hằng, ngoại lệ, con trỏ và các
chương trình con mà bên ngoài có thể tham chiều tới. Phần body định nghĩa các
truy vẫn cho con trỏ và mã cho các chương trình con(các procedure, function…).
Phần spec được coi là phần hộp trắng, phần body là hộp đen. Có thể debug, thay
đổi phần body mà không ảnh hưởng tới phần spec.
Để tạo package spec, dùng lệnh: Create package. Lệnh Create package
body định nghĩa phần body. Phần spec sẽ được public với tất cả các procedure và
code khác bên ngoài pack. Phần body chứa các thực thi và các khai báo riêng,
không được hiển thị đối với bên ngoài.

14


Package DBMS_METADATA
Để thay đổi thông tin mà các view đưa ra, attacker cần phải tác động tới
mã nguồn (mã tạo ra) các view, table. Trong các function, procedure được viết
để thực hiện ý đồ của mình, attacker sẽ cần phải lấy mã nguồn của cá view, table
cần thay đổi sau đó thêm vào phần mã của mình và thực hiện tạo lại view, table.
Attacker có thể sử dụng package dbms_metadata của Oracle để lấy mã nguồn
(DDL) này.
Thực tế Oracle đưa ra package dbms_metadata nhằm làm đơn giản hóa
một số công việc trong database mà cần phải trích (extract) thông tin về các
table, index từ Oracle và chueyenr chúng sang hệ thống khác. Việc trích DDL của
các schema object từ dictionary sẽ rất hữu ích khi phải chuyển sang hệ thống

mới và muốn có lại cá object đó trong tablespace miows. Oracle cung cấp
package dbms_metadata giúp các nhà phát triển dễ dàng lấy các metadata về
các object từ data dictionary và đưa ra dưới dạng XMI hoặc DDL. Sau đó load
XMI hoặc chạy DDL để tạo lại object. Dbms_metadata sử dụng một số object và
table được định nghĩa trong schema SYS. Thường gặp nhất là ku$_parsed item
và ku$_ddl.
Trong dbms_metadata những user thông thường chỉ có thể xem metadata
các object mà họ sở hữu, các object họ được gán quyền, các object được public.
SYS và user có quyền Select_catalog_role xem được metadata của tất cả các
object trong database. Trong các procedure, function và các package định nghĩa
quyền, các role như select_cattalog_role không được kích hoạt. Vì thế các
chương trình PL/SQL chỉ có thể lấy metadata cho các object ở trong schema của
chính nó. Package dbms_metadata định nghĩa trong schema SYS các object và
table như sau:
Table
Sys.ku$_parsed_item
Sys.ku$_ddl
Sys-ku$_Errorline
Sys.kus_submitresult

Các column
Item, values, object_row
ddlText,parsedItem
errorNumber, errorText
Ddl, errorlines
Bảng 6: dbms_metadata

15



Sử dụng các chương trình con trong dbms_metadata để lấy DDL của các object
hoặc đăng ký dạng XML của các object với database.
Subprogram
Add_transform function
Fetch_xxx
Get_query
Get_xxx
Open
Set_count
Set_parse_item
Set_filter
put

Nội dung
Xác định 1 transform mà fetch_xxx áp dụng đối
với dạng thể hiện XML của object
Trả về metadata cho object thỏa mãn các tiêu
chuẩn thiết lập bởi open, set_filter, set_count,
add_transform
Trả về dạng text của query mà fetch_xxx sử
dụng
Lấy về metadata cho một object cụ thể
Chỉ ra kiểu của object cần lấy, phiên bản
metadata của nó
Thiết lập số object được lấy trong một lời gọi
fetch_xxx
Xác định một thuộc tính object được phân tích
Đặt các tiêu chuẩn để tìm hiểu object ví dụ tên
hay schema
Gửi dạng XML cho database


Bảng 7: Các chương trình con trong dbms_metadata
Ví dụ để lấy metadata dạng XML của Scottemp:
Set long 2000000
Set pagesize 0
Select dbms_metadata.get_xml(‘table’,’scott’)
From dual;

Package DBMS_OUTPUT
Dbms_output package cho phép gửi message từ pl/sql. Thường dùng nhất
là kích hoạt package dbms_output và hiển thị nội dung của message buffer.
Trong sql*plus điều này có thể thực hiện bằng lệnh: ‘ Set serveroutput on’ hoặc
“Setserverout on”. Dbms_output package thường được dùng trong việc debug.
Procedure put và put_line cho phép đặt thông tin vào buffer để bất kỳ trigger,
procedure, package nào cũng có thể đọc được. hiển thị thông tin ở vùng buffer
bằng cách gọi procedure get_line và get_lines.
16


Package dbms_output được chạy bằng scrip dbmsscrip.sql bởi user
Sys.Package này được gán Excute cho tất cả user(public)
Subprogram
Dbms_output.enable
Dbms_output.new_line
Dbms_output.get_line(s)
Dbms_output.put
Dbms_output.put_line

Nội dung
Enable các chương trình con Put, put_line,

get_line, get_lines và new_line
Thêm một end-ò-line vào buffer
Lấy một hoặc nhiều dòng từ buffer
Chuyển tham số được gọi vào buffer
Thêm một end-of-line vào buffer
Bảng 8: dbms_output

Package DBMS_JOB
Dbms_job cung cấp một job cho nhiều instance. Mặc định job có thể chạy
trên bất kỳ một instance nào, nhưng chỉ có một instance sẽ chạy nó. Không yêu
cầu phải có system privilege nào để có thể sử dụng dbms_job. Và cũng không có
system privilege nào quản lý dbms_job. Các job không thể bị sửa đổi hay xóa
ngoài job sở hữu bởi user đó. Một khi job được start và chạy sẽ không dễ ngừng
job lại.
Subprogram
Broken
Change
Instance
Next_date
Remote
Run
Submit
what

Nội dung
Chặn thực hiện job
Chỉnh sửa tham số user định nghĩa liên quan tới job
Gán một job cho một instance chạy
Lần thực hiện job tiếp theo
Xóa một job khỏi hàng đợi job

Thực hiện chạy job
Đưa một job vào hàng đợi job
Thay đổi đặc tả của một job
Bảng 9: dbms_jobs

Package DBMS_SQL
Package dbms_sql cho phép truy nhập tới dynamic SQL và dynamic
PL/SQL từ bên trong chương trình PL/SQL. Dynamic có nghĩa là các câu lệnh
SQL trong package sử dụng những tham số chưa được trong chương trình.
Chúng là các chuỗi ký tự được xây dựng tại thời điểm chạy và sau đó được đưa
17


vào SQL engine để thực hiện. package dbms_sql cho phép thực hiện những hành
động là không thể trong chương trình PL/SQL bao gồm:





Executre câu lệnh ddl: câu lệnh ddl như drop table hay create index là
không được phép trong native PL/SQL.
Tạo một ad-hoc query interface: với dbms không cần phải nhọn nhằn gõ các
câu lệnh select cho một truy vẫn hay con trỏ. Bạn có thể cho user xác định
các thứ tự sắp xếp, các điều kiện và bất kỳ trường hợp nào của các câu lệnh
select.
Execute dynamic các chương trình PL/SQL đã được tạo: trong table, chúng
ta lưu tên của procedure thực hiện cho phép tính toán nào đó. Sau đó dùng
một front-end cho table đó, để user lực chọn chức năng phù hợp đưa giá trị
đầu vào và thực thi thay vì phải thêm vào hàng và tương tác với khá nhiều

giao diện

Với sức mạnh sự ảnh hưởng và linh hoạt của dynamic SQL thông thường
chỉ nên gán quyền Execute cho những user mà cần thực hiện dynamic SQL. Để
che giấu dbms_sql thực hiện lệnh bằng tài khoản sys:
Revoke execute on dbms_sql from public;

Để gán quyền execute cho user nào đó, thực hiện:
Grant execute on dbms_sql to User_name;

Khi thực hiện một chương trình dbms_sql từ một anonymous block,
chương trình đó được thực hiện với quyền của schema hiện tại. Nếu những
chương trình dbms SQL sẽ thực hiện sử dụng quyền của người sở hữu chương
trình đó. Dbms_sql còn được gọi là package ‘run as user’ hơn là ‘run as owner’.
Name
Miêu tả
Close(open)_curror
Đóng(mở) con trỏ
Column_value
Lấy giá trị từ con trỏ vào biến cục bộ
Execute
Thực thi con trỏ
Fetch_rows
Nhập giá trị row từ con trỏ
Is_open
Trả về giá trị true true nếu con trỏ đang mở
Last_row_count
Trả về tổng số row được fetch từ con trỏ
Last_SQL_function_code
Trả về function code cho câu lệnh SQL

Xác định một column được chọn từ một con trỏ cụ
Define_column
thể
Parse
Phân tích cú pháp câu lệnh SQL nếu đó là DDL thủ
18


Variale_value

tục phân tích sẽ thực thi luôn câu lệnh
Lấy giá trị một biến trong con trỏ
Bảng 10: dbms_sql

Dbms_sql thực sự là một package mạnh nhưng nó cũng là một package
khá phức tạp để sử dụng. thông thường chúng ta có thể tạo và thực hiện vào các
câu lệnh SQL. Nhưng việc tạo như vậy khá là thủ công và vất vả, phải xác định
tất cả các câu lệnh SQL. Nhưng việc tạo như vậy khá thủ công và vất vả, phải xác
định tất cả các câu lệnh SQL, với các lời gọi thủ tục, các kiểu, biến…
Quá trình xử lý của Dynamic SQL


Mở vùng nhớ: trước khi thực hiện bất kỳ sql dynamic nào phải có một con
trỏ tới cùng nhớ mà sql dynamic sẽ được quản lý. Khi mở vùng nhớ, Rdbms
trả về một integer gán với con trỏ. Chúng ta sẽ sử dụng giá trị này trong các
lời gọi sau đó tới các chương trình dbms_sql để thực hiện câu lệnh dynamic
này. Có thể sử dụng một con trỏ để thực hiện nhiều câu lệnh SQL. Nội dung
của vùng lưu dữ liệu sẽ được rết nếu một câu lệnh mới được phân tích vì
thế không phải close và open lại con trỏ.




Phân tích câu lệnh: sau khi đã xác định con trỏ tới vùng nhớ, để liên kết nó
với câu lệnh sql cần phải phân tích (parse) câu lệnh bằng lời gọi tới thủ tục
parse. Nó xác định các câu lệnh này có đúng cấu trúc không và liên kết các
câu lệnh với con trỏ. Lưu ý khi phân tích một câu lệnh DDL, nó cũng ngay
tức khắc được thực thi và rdbms cũng thực hiện một lệnh commit ngầm
định.



Ràng buộc tất cả giá trị host: câu lệnh mà chúng ta thực hiện ở dạng chuỗi
tại thời điểm chạy. Khi sử dụng dynamic sql, tại thời điểm compile chúng ta
chưa biết giá trị vì thế phải chuyển qua giá trị vào câu lệnh sql tai thời điểm
chạy. Có 2 cách để thực hiện: móc nối(concatenation) và ràng
buộc(binding). Với móc nối, chuyển tất các thành phần tròn câu lệnh sql
thành chuỗi và nối chúng lại. Với ràng buộc chúng ta nên chèn nơi lưu trữ
(placebolder) vào chuỗi với dấu ‘:’ đặt trước. nếu câu lệnh sql chứa tham
chiếu tới các biến PL/SQL, chúng ta phải chỉ ra nơi đặt các biến đó trong
câu lệnh sql bằng cách đặt dấu ‘:’ trước tên. Sau đó gán giá trị thật cho biến
đó trong câu truy vấn
19


Nếu nối giá trị vào một chuỗi thì không cần phải gọi các thủ tục
bind_varalable hay bind_array. Ví dụ:
DBMS_SQL_PARSE(the_cursor,
SELECT COUNT(*) freq FROM call WHERE call_date =: call_date’
|| ‘AND call_type_cd =: call_type’,DBMS_SQL.V7);
DBMS_SQLBIND_VARIABLE(the_cursor,’call_date’,:call.last_date

_called);
DBMS_SQL_BIND_VARIABLE(the_cursor,’call_type’,:call.call_sta
tus);

Để tránh phải tạo các lời gọi riêng rẽ tới bind_variable có thể đưa các giá
trị này vào câu lệnh tại thời điểm phân tích. Ví dụ trên có thể viết thành:
DBMS_SQL.PARSE
(the_cursor,
‘SELECT COUNT(*) freq FROM call WHERE call_date=’’’||
TO_CHAR(:call.last_date_called ||
“AND call_type_cd = ‘’’||:call.call_status ||’’’,
DBMS_SQL.V7);

Các dấu ‘’’ được nhóm lại thành cùng nhau (3 dấu ‘’’ ở cuối chuỗi sẽ trở
thành một dấu ‘ ở cuối giá trị được đưa vào câu lệnh sql, móc nối hay kiểu giá
trị.






Định nghĩa các cột trong lệnh select: mỗi cột trong danh sách mà câu lệnh
sql liệt kê với các biến PL/SQL nhận giá trị đó. Bước này chỉ dành cho câu
lệnh select.
Thực thi câu lệnh: thực thi tại vùng nhớ đã chỉ ra-tức là câu lệnh tại vùng
nhớ đó. Nếu câu lệnh sql là insert, update hay delete, lệnh execute sẽ trả về
số các hàng được xử lý. Còn lại, chúng ta có thể bỏ qua giá trị trả về.
Lấy các hàng từ truy vấn sql dynamic: nếu thực thi truy vấn, sau đó phải lấy
các hàng từ vùng nhớ. Tuy nhiên, không lấy trực tiếp vào các biến PL/SQL

cục bộ.
20





Tìm hiều các giá trị việc thực thi sql dynamic: nếu câu lệnh SQL là một truy
vấn, tìm kiếm các giá trị trả về của lệnh select bằng column_value.
Đóng con trỏ: giải phóng vùng nhớ liên quan tới con trỏ.

Utl_tcp
Utl_tcp là package cơ bản nhất có thể truy xuất network. UTL_TCP có thể
tạo các kết nối TCP tới server khác gửi và nhận dữ liệu. Hơn nữa,không có giới
hạn trong định dạng của data này, tức là có thể ở dạng binary hoặc text-based.
Nó cho phép rdbms giao tiếp với bất kỳ server nào trên network mà nó cần, web
server hay RPC server. Đây là một package rất hữu ích cho attacker. Ví dụ,
attacker có thể dựa vào utl_tcp để tạo một chương trình quét cổng TCP.
Các function cơ bản:
Open_connection
Read_raw
Write_raw
Read_text
Write_text

Mở một socket tới host
Đọc dữ liệu binary từ socket
Viết dữ liệu binary tới socket
Đọc dữ liệu ASCII từ socket
Viết dữ liệu ASCII từ socket

Bảng 11: Utl_tcp

2.3. Nhiệm vụ của Rootkit
2.3.1. Ẩn tài khoản truy nhập
User oracle được lưu trong table SYS.USER$ cùng với database role. User
có flag TYPE#=1 và roll có flag TYPE#=0. Để việc truy nhập dễ dàng hơn và đảm
bảo tính tương thích với các phiên bản trước. Oracle đưa ra 2 view là
DBA_USER$ thông qua public synonym. Hầu hết các DBA và các công cụ sử dụng
các view này để truy nhập table SYS.USER$. Vì vậy để ẩn đi các user muốn che
giấu cần sửa các view source:
AND U.NAME != ‘tên cần ẩn’

21


Hình 1: Trước khi ẩn user HACKER
Mọi thay đổi trên view thuộc về SYS yêu cầu quyền SYSDBA (cần có một
mục về các tài khoản và quyền hạn trên Oracle). Sau đó truy vấn trở lại view trên
sẽ không thấy xuất hiện tài khoản đó

22


Hình 2: Sau khi ẩn user Hacker
Thông thường attacker sẽ chọn các username khó phát hiện( ví dụ MTSYS)
và một câu điều kiện không dễ nhận ra, ví dụ AND U.USER#<> 17, trong đó 17 là
chỉ số của user mới được tạo. vì thế Developer hoặc các DBA không nên dựa vào
view mà nên truy nhập các table căn bản như SYS.USER$.
2.3.2. Ẩn process
Oracle process được chia làm 3 loại:

• User process: Bắt đầu khi database user yêu cầu kết nối tới Oracle server
• Server process: xử lý các yêu cầu từ user process kết nối tới instance.
• Background process: là các tiến trình tương tác lẫn nhau và với hệ điều hành
để quản lý bộ nhớ, quản lý các tín hiệu nhập xuất để ghi dữ liệu ra đĩa và một
số nhiệm vụ khác. Nó được bắt đầu khi Oracle instance hoạt động

23


V$session trước và sau khi ẩn tiến trình của attacker.

Hình 3: V$session trước khi ẩn session

Hình 4: V$session sau khi ẩn session
Các tiến trình được lưu trong view v$session nằm ở schema Sys. Ngoài ra
thông tin về mỗi session còn xuất hiện trong gv_$session, flow_session,v_$
process.
2.3.3. Ẩn Database job
Job là những tác vụ cần được thực hiện tại một thời điểm nào đó và có thể
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 lịch
24


update, import, export dữ liệu. Thông tin về tất cả các job có trong dba_jobs,
sys_job$, dba_jobs_running.
Giả sử hacker cần tạo một job để chạy tại một thời điểm nào đó ví dụ
export dữ liệu, thì cần là phải ẩn các job này. Để job này không hiển thị khi truy
vấn dba_jobs thì cần phải giấu đi priv_user: quyền của user mà job được sử dụng.
Do chỉ có job do tài khoản hacker tạo sẽ chạy bằng quyền của hacker.
Dba_jobs trước và sau khi ẩn job của attacker.


Hình 5: dba_jobs trước khi ẩn job

Hình 6: dba_jobs sau khi ẩn job
2.3.4. Xóa oracle listener log
Trong quá trình ghi log các thông tin được log trong listener.log của TNSlistener(nếu kích hoạt logging). Gỡ bỏ các dấu vết có trong các file này là điều
cần thiết với attacker. Oracle đưa ra nhiều cách để thực hiện điều này. Cách dễ
nhất là dùng package utl_file. Package này cho phép đọc (UTL_FILE.GET_LINE),
viết (UTL_FILE.PUT_LINE) hay xóa (UTL_FILE.REMOVE_LINE) file. Log file không
bị cấm(lock) bởi TNS listener, nhờ đó có thể thay đổi nội dung ở tại thời điểm
đang hoạt động(runtime).

25


×