PDA

View Full Version : Bảo mật dành cho root server



Tuxedo
08-09-2009, 11:37 AM
MySQL là một DBMS ( Database Management System - hệ thống quản trị cơ sở dử liệu ) gồm 4 loại ver:
* MySQL Standard bản chuẩn.
* MySQL Pro là bản thương mại
* MySQL Max là phiên bản nâng cao tích hợp những chức năng cao cấp.
* MySQL Classic : không tích hợp InnoDB engine.

Để cho thuận tiện, nhà sản xuất đã tích hợp thêm một số function có thể gây xâm hại đến bảo mật hệ thống. Như ở bài trước, thì một vào function trog số này đã được lợi dụng để thực hiện local attack ( tấn công cục bộ trên cùng máy chủ ).

Giả dụ hacker có quyền tạo, edit , delete, thêm / xóa DB trên server, hacker có thể tốn công qua kịch bản :
- Tạo 1 db
- Tạo một table mới.
- Thực hiện chuỗi câu lệnh :

use atttacker;
Create table readfile(text LONGTEXT);
Insert into readfile values(loadfile('/etc/passwd');

Và kết quả là :

Select * from readfile;

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:perator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rpm:x:37:37::/var/lib/rpm:/sbin/nologin
netdump:x:34:34:Network Crash Dump user:/var/crash:/bin/bash
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
ident:x:100:101::/home/ident:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
pcap:x:77:77::/var/arpwatch:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
canna:x:39:39:Canna Service User:/var/lib/canna:/sbin/nologin
wnn:x:49:49:Wnn Input Server:/var/lib/wnn:/sbin/nologin
mysql:x:101:102:MySQL server:/var/lib/mysql:/bin/bash
named:x:25:25:Named:/var/named:/sbin/nologin

Một số người có thể tự hỏi rằng sao hacker có thể làm được điều đó trong khi đã cố gắng bảo mật cho server bằng cách bật safe mode, disable function, disable open_basedir, cài thêm nhiều mod security cho server. Thật ra đây có thể là do người quản trị quên hoặc đã không cẩn thận trong quá trình cấu hình cũng như thiết lập lại hệ thống. Mỗi người quản trị cần phải đặt mình vào vị trí của người dùng shared - host để đánh giá :
+ "khách hàng có cần sử dụng những fuction đó không ?"
+ "hacker có thể làm gì nếu sở hữu được quyền kiếm soát bất kỳ 1 user trong MySQL"

Sau khi trả lời 2 câu hỏi đó, rất có thể bạn sẽ tìm được câu trả lời cho vấn đề bảo mật của mình.
Nhìn lại cách thức attack local qua MySQL, hacker sử dụng load_file() để tấn công. Cấu trúc chung của hàm này là LOAD_FILE(file_name) . Hàm này được sử dụng với mục đích chính là đọc 1 file và trả về nội dụng dưới dạng chuỗi ký tự. Theo manual của MySQL :

" To use this function, the file must be located on the server host, you must specify the full pathname to the file, and you must have the FILE privilege. The file must be readable by all and its size less than max_allowed_packet bytes. "

Như trên ta thấy để có thể đọc được file qua MySQL thì account phải có quyền FILE privilege và file muốn đọc phải có quyền read ( đc phép đọc ). Dựa vào đó ta có 2 cách để ngăn chặn việc truy xuất file trái phép :
+ chmod file: không có quyền read ở nhóm group và world, cách chmod tôi hay áp dụng là 401 ( |r--|---|--x| ), để thực hiện chỉnh sửa file bạn nên thực hiện trong Control Panel hoặc qua FTP.
+ cấm FILE privilege của tất cả các user trong MySQL.

-- Kịch bản 2 Thông qua hàm load data infile :
Trước khi vào đề thì mình xin nói sơ qua về hàm load data:
Hàm load data local trong MySQL lâu nay đc khai thác để attack local khá nhiều và cũng không ít srv dính lỗi này, thậm chí là rất phổ biến với các shared hosting vốn đòi hỏi yêu cầu về độ bảo mật cao.
Hàm này cho phép tải nội dung của một file ở bên trong srv "local" hoặc client host.
Theo mặc định thì đều được biên dich với tùy chọn --enable-local-infile. Để tắt tùy chọn này bạn dùng command để đăng nhập vào mysql với quyền root rồi dùng câu lệnh --local-infile=0 hoặc edit file my.cnf trong /etc
-----------------
[mysqld]
...(other stuff)
local-infile=0
[mysql]
...(other stuff)
local-infile=0
--------------------
Sau đó shutdown và chạy lại MySql.
----------------------------------------
shell> mysqladmin shutdown
shell> cd /usr/libexec
shell> mysqld
----------------------------------------

Khi đó nếu dùng hàm này sẽ có thông báo lỗi:
ERROR 1148: The used command is not allowed with this MySQL version

Ok vào đề thôi

"LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number LINES]
[(col_name,...)] "

Hàm này cũng giống như load_file() nhưng tốc độ thực hiện câu lệnh nhanh hơn. Ở đâu có thêm phạm vi "local", "local" ở đây có thể là localhost như /home/vietchuye/public_html/index.php hoặc client host như http://www.ddcntt.vn/index.php. Với nhu cầu dùng thông thường để setup và chạy trên localhost thì rõ ràng hàm này là không cần thiết.
Để sử dụng được hàm này thì file để đọc cần phải ở trong thư mục chứa database hoặc phải được phép read ở nhóm "world" và user MySQL phải có quyền FILE privilege.
Qua 2 kịch bản trên ta thấy FILE privilege chính là chìa khóa để giải quyết vấn đề attack local qua MySQL.

Tóm lại : MySQL là một hệ quản trị cơ sở dữ liệu rất mạnh mẽ và hữu dụng nhưng nó cũng có nhiều chức năng không cần thiết làm nảy sinh những nguy cơ tiềm ẩn về bảo mật hệ thống. Qua bài viết này tôi không có hy vọng có thể giúp các bạn khắc phục triệt để được vấn nạn local attack qua MySQL này nhưng hy vọng các bạn có thể tự cho mình những kinh nghiệm cho vấn đề bảo mật hệ thống server, phục vụ tốt cho công việc của các bạn.

trên đây là bài mình sưu tầm được, nhưng lưu ý là không phải chỉ có mỗi cách này :)

mình sẽ post tiếp các hướng dẫn sau về bảo mật :)

hackerkinhcan_lha
10-09-2009, 09:00 AM
Cái này chính là local via sql ;)
Nice post