基本概念

  1. 什么是提权

    在渗透测试的时候,我们通过漏洞获取到目标主机系统上的 shell 用于执行系统命令,从而达到控制目标主机的目的。但是我们获取到的初始 shell 可能为低权限用户,这时我们需要想办法提升权限为高权限用户,这个过程就叫做提权(系统权限提升)。

  2. 为什么 shell 会有高低权限的区别?

    因为通常情况下 Web 服务架构中:后端 linux 服务器通过 Tomcat 中间件提供 Web 服务

    如今的计算机操作系统都是基于多用户设计的,通常一台计算机上同时存在着多个不同权限的系统用户,而在 Linux 服务器上,每个服务都需要先赋予某个用户权限才能运行。假设 tomcat 服务以普通用户 www-data 的权限运行并提供 Web 服务,此时如果黑客通过 Web 漏洞获取到 shell,此 shell 就是一个 www-data 用户权限的 shell——此时就需要提权。

    反之,若 tomcat 是以root用户权限运行,那黑客获取到的 shell 就是 root 权限。

  3. 为什么需要提权

    获取更高权限的 shell,能为渗透测试后期的工作带来便利。

    • 高权限能对更多的文件进行「增删改查」操作,便于进一步收集主机系统中的敏感信息
    • Linux 系统的 root 权限可获取 shadow 文件中的密码 Hash,若内网环境中存在「账户/密码复用」的情况,可用于横向扩展
    • Windows 系统中的 system 权限可提取内存中的密码 Hash,可进一步用于域渗透

linux提权方法

暴力破解

  1. 信息收集

    在前期对目标的信息搜集可能会得到一些存储着用户密码的文件,或者是可能会获取到一些如数据库、后台 web 密码。

    极有可能管理员会复用这些密码。于是便可以直接在 shell 中使用 sudo 命令(SSH 中不可用)尝试提权至管理员权限。还有就是查看一下桌面上的文件,有时候管理员为了方便记忆,会把一些账号密码放在桌面上的文件里。还有浏览器里面可能会存密码!

  2. 历史记录

    通过查看历史记录,查看是否有有用的信息,有的管理员为了方便登陆mysql或其他软件时,不经意间加上参数-p,从而将密码暴露出来或者一些.sh脚本连接mysql、vpn等,查看对应的配置文件即可拿到账号密码

    1
    2
    # 保存了当前用户使用过的历史命令
    cat ~/.bash_history

内核漏洞提权

  1. 原理

    利用操作系统内核中的安全漏洞,将当前用户的权限提升到 root。由于内核拥有对整个系统的控制权限,一旦被利用成功,攻击者几乎可以掌控整台主机。

  2. 具体流程

    获取目标系统的内核信息及版本信息。

    1
    2
    3
    4
    5
    6
    # 查看linux内核版本和架构信息
    uname -a
    # 查看内核版本及其编译器信息
    cat /proc/version
    # 查看操作系统发行版本信息
    lsb_release -a

    根据内核版本获取对应漏洞以及exp

    1
    2
    # 利用exploitdb搜索相关漏洞
    searchsploit Ubuntu 16.04

    使用exp对目标进行攻击,提权

  3. 工具

    • 信息收集配合kali提权
    • Linux Exploit Suggester
    • LinPEAS
  4. 例子:Dirty COW 脏牛漏洞

    Dirty COW 是一个特权升级漏洞,可以在每个Linux发行版中找到。这个漏洞的特别之处在于,防病毒和安全软件无法检测,一旦被利用,根本无从知晓。

sudo提权

  1. 原理

    sudo 允许普通用户执行一些或者全部的root命令,如halt,reboot,su等等。这样不仅减少了root用户的登录和管理时间,同样也提高了安全性。但是在一些场景下,管理员为了平常运营方便给sudoer文件配置不当,从而导致权限提升的问题产生。

    sudo使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是/etc/sudoers),即完成对该用户的授权(此时该用户称为“sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。

  2. sudo提权方法

    输入下面命令,可以根据 /etc/sudoers 文件中的配置,显示允许当前用户可以通过 sudo 执行的命令清单

    1
    sudo -l

    可以看到,当前用户可以通过sudo执行echo、find等命令,二无需密码

    img

    然后再分别地利用这些命令,实现提权

    各种命令的sudo提权利用方式,参考:Linux提权-70种sudo提权汇总

SUID提权

  1. 原理:SUID(set UID,设置用户ID)是一种LINUX的权限机制,在执行有SUID权限的文件时,会使调用者暂时获得这个文件拥有者的权限。例如:当我们以一个普通用户的身份去运行一个root用户所有的SUID文件,那么在执行该文件的时候我们就可以获取到root权限

  2. 条件

    • 只有可以执行的二进制程序文件才能设定SUID权限
    • 命令执行者对二进制程序文件有执行(x)权限
    • SUID权限只在该程序执行过程中有效
  3. SUID提权方法

    1)全局搜索有SUID权限的文件

    1
    find / -perm -4000 -type f 2>/dev/null

    2)常见的具有提权功能的linux可执行文件

    1
    2
    3
    4
    5
    6
    7
    8
    nmap
    vim
    find
    bash
    more
    less
    nano
    cp

    各种linux可执行文件的SUID提权方式:【安全科普】Linux提权——利用可执行文件SUID

Passwd 文件提权

  1. 原理/etc/passwd/etc/shadow文件是 Linux 系统登录认证的关键文件,一般 passwd 里面储存了用户(用户可读但不可修改),shadow 里面是密码的hash(用户不可读且不可修改),如果系统运维人员对 passwdshadow文件的内容或权限配置有误,则可以被利用来进行系统提权。

  2. /etc/passwd文件功能

    /etc/passwd文件用于保存用户信息,每一行代表一个用户,每一行通过冒号 :分为七个部分:

    image-20250412112524494

    • 这里的字段 x 表示该用户密码哈希存放在 /etc/shadow文件中,如果密码不用存在 /etc/shadow中,可以直接将 x替换为 「密码」即可。

      打开 /etc/passwd 文件可以发现,大部分的密码字段都是x,表示存储在 shadow 文件中,但是因为管理员的失误,passwd 文件中可能也会有加密后的密码。

      在这种情况下,可以使用hash 破解神器——john 来进行破解

      image-20250412154357635

    在用户登录的时候:

    1)检测「输入的用户名」是否与 /etc/passwd文件中某一行第一个字段匹配。

    2)若匹配成功,再对比该行第二个字段的密码,如果均匹配成功即登录成功。

    3)登录成功之后所具有的权限,通过第三个字段 UID和第四个字段 GID确定。其中 UID=0代表 root 用户,也就是说——无论第一个字段代表的用户名是什么,只要 UID=0,则该账户就拥有 root 权限——这点在提权中非常重要。

    可见,如果我们能够对 /etc/passwd文件内容进行伪造、篡改,那就能很轻易的登录成功并获取任意用户权限。

  3. 通过 /etc/passwd 文件提权

    适用场景:/etc/passwd 具有写权限

    使用下面的命令查看 /etc/passwd/etc/shadow文件的权限:

    1
    ls -alh /etc/passwd /etc/shadow

    假如输出的结果如下,表示 /etc/passwd 文件的权限为:所有者可以读写、组用户可以读、其他用户可以读。/etc/shadow 文件的权限:所有者可读写、组用户可读、其他用户无权限

    image-20250412144458167

    一般的权限类型:

    字符 权限类型 含义
    r read 可读取内容
    w write 可修改内容
    x execute 可执行(或进入目录)
    - 无权限 没有任何权限

    如果其他用户对密码文件具有“写”权限,我们可以构造一行用户数据添加到 passwd 文件中,将 UID设置为 0( root 权限),例如:

    1
    syl-passwd:x:0:0:root:/root:/bin/bash

    x 表示该用户密码加密后存放在 /etc/shadow 文件中,如果我们不想存在文件中,而是直接输入密码的化,需要输入加密之后的密文字符串,例如这里我们使用 openssl 创建一个密码pass123

    1
    openssl passwd -1 -salt ignite pass123
    • -1 :使用 MD5 hash 算法
    • -salt :对 hash 算法加 “盐”

    将生成的密码添加到 passwd 文件中:

    1
    echo 'syl-passwd:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash' >> /etc/passwd

    再查看一下是否添加成功

    1
    cat /etc/passwd|grep syl-passwd

    确认添加成功后,切换成刚创建的用户,就获取到root权限

    image-20250412153057032

计划任务提权

  1. 原理

    系统内可能会有一些定时执行的任务,一般这些任务由crontab来管理,具有所属用户的权限。非root权限的用户是不可以列出root用户的计划任务的。但是/etc/内系统的计划任务可以被列出。

  2. 方法

    运行下面的命令列出一些计划任务

    1
    2
    ls -l /etc/cron*
    cat /etc/crontab

    可能发现存在root权限运行的计划任务

    img

    查看这个文件的权限

    1
    cd /sbin;ls -l test.sh

    如果我们对这个文件存在写权限的话,那么我们就可以直接修改这个脚本,以root的权限执行恶意代码

参考文章