Linux提权手法整理
之前写过了windows提权小结,这下一篇水什么就有了嘛,于是有了这篇水文,整理一下Linux提权
前篇windows提权小结 ,链接送上 https://www.cnblogs.com/lcxblogs/p/14163338.html
0x00 前言
同windows提权的目的,也是从普通用户权限提升到管理员权限,以便实现读写敏感文件、横向移动进一步控制、执行一些需要权限的命令之类的要求
仍然是思路总结性质的文章,具体操作不展开介绍
具体如何做,应该注意哪些细节,请参考网上其他师傅们的复现操作
本文不涉及第三方提权
0x01 系统内核漏洞
按照windows那篇与这篇两篇文章相互对应的关系,我就也把系统内核漏洞放在第一个位置(事实上能不用就不最先用内核漏洞,未经测试的内核漏洞可能产生意外的结果,比如系统崩溃啦、蓝屏啦、连接GG啦......)
还是,同windows内核提权一样,我们需要知道有哪些可以利用的Linux内核漏洞?
推荐几个脚本
(1)LinEnum
下载链接: https://github.com/rebootuser/LinEnum
使用方法在链接里有,能搜集出很多信息
(2)linuxprivchecker
下载链接:https://github.com/sleventyeleven/linuxprivchecker
(3)linux-exploit-suggester2
下载链接:https://github.com/jondonas/linux-exploit-suggester-2
利用内核漏洞,需要目标系统没打有关此漏洞的补丁,然后我们把利用脚本exp往目标机器上传,传了之后要能执行
当然除了上面介绍的几个信息收集工具之外,也可以手动搜集内核相关信息,前提是你记得住命令
比如uname -a 看一下内核版本
cat /etc/issue
cat /etc/*-release 看下发行版本
然后用kali的searchsploit查询exploitdb ,找一下此版本下,哪些内核漏洞可以利用,具体呢要看exp的说明,都是有要求的不是很随便的exp,注意不要被坑了
给你一个眼神:
言归正传
首先,如果提到Linux提权,绝对绕不过著名的脏牛漏洞,即CVE-2016-5195
Linux内核>=2.6.22(2007年发行)开始受影响,直到2016年10月18日修复
其危害就是与低权限用户可提权相关的
至于为什么叫做dirty COW(脏...牛?)?
大致原因是内核函数处理Copy-on Write(即COW)时存在条件竞争造成COW过程被破坏,出现一些问题,原理分析看这里 https://www.anquanke.com/post/id/84851
网上有此漏洞提权的exp,c的,下载后编译成可执行文件,然后执行
其他类型的内核漏洞也是怎么个思想去寻找,不要怂就是干
Linux内核的一些exp合集: https://github.com/SecWiki/linux-kernel-exploits
0x02 钻空子提权
利用root权限运行的服务钻空子
这个其实并不算一种办法,只是一种朴素的想法
如果找到某服务以root用户身份运行,并且这是一个我们可以执行命令的程序相关的服务,那我们是不是可以钻个空子,用这个程序执行一些命令,变相地实现“提权”
ps -aux | grep root 找到root运行的服务
比较常用的例子就是:数据库服务是root权限运行的,那么我们可以通过在数据库shell中执行一些本来普通权限执行不了需要系统高权限才能执行的系统命令,这也是一种提权......吧
或者
查找敏感文件,比如passwd和shadow
/etc/passwd 存了一些用户信息。正常来说此文件是全用户可读,root可写的
/etc/shadow 存密码hash。仅仅root可读写的
cd /etc 然后 ls -l passwd shadow
看一下文件权限
如果passwd是普通用户可写的(梦里啥都有),可以把root的密码字段换成一个已知密码的hash
如果shadow是普通用户可读的(洗洗睡吧),可以读取root的hash密码,爆破之
或者
是不是存在一些密码复用的情况,root密码和其他你找到的密码一样......呢
可以尝试,但是不要对这种办法报太大希望
0x03 定时任务提权
又名cronjobs提权,如果配置不当就能加以利用(都比较看脸)
主要思想是:计划任务如果被设置是以root权限执行的,且可以修改定时(计划)任务中定义的脚本或文件,就能在root权限下执行任意代码
例子请参考 https://www.freebuf.com/articles/system/175453.html
(例子中的dash、nano可以根据实际情况选择其他的shell和编辑器)
0x04 SUID提权
SUID---set user ID
顺便讲一下Linux中文件权限的表示方法,啊懂的都懂,有不懂的兄弟我就自告奋勇一下了
类UNIX系统下可以通过 ls -l 查看文件权限
表示方法是一种十位表示法,类似:
- r w x r w x r w x
1 2 3 4 5 6 7 8 9 10
2-10位展示的 r w x 分别是readable 、writable、 executable权限 或者说可读、可写、可执行 或者说4、2、1,没有相应权限的位置写-
属主(u)2-4位;属组(g)5-7位; 其他(o)8-10位
第一位可以是:p 管道文件; d 目录文件 ;l 符号连接文件;- 普通文件;s socket文件;c 字符设备文件;b 块设备文件
除此之外,还有三种特殊权限:SUID、SGID、sticky
s或S(SUID--set user ID )占据4号位,对应值为4
s或S(SGID-set group ID)占据7号位,对应值为2
t或T(sticky)占据10号位,对应值为1
于是给文件加减权限就有:
chmod u+s filename
chmod g+s filename
chmod o+t filename (取消权限顺理成章+换成-即可)
或用数字表示
chmod 4755 filename 代表-rwsr-xr-x (-rwxr-xr-x 这是原来的755,赋了SUID=4权限)
chmod 7755 filename 代表-rwsr-sr-t (-rwxr-xr-x 这是原来的755,赋了SUID、GUID、sticky=4+2+1=7权限)
chmod 7666 filename 代表-rwSrwSrwT (-rw-rw-rw- 这是原来的666,赋了SUID、GUID、sticky=4+2+1=7权限)
chmod 0755 filename 去掉所有特权
看出来点区别没?
小写s或s或t是取代了原来的x的,但如果原来没有x,就会表示为大写的S或S或T
SUID作用于文件(二进制程序):用户将继承文件所有者的权限(root用户创建一个文件并加上SUID,其他用户使用这个文件时就是具有root权限的)
GUID作用于文件(二进制程序)和目录:对于文件,用户将继承文件所属组的权限;对于目录,此目录下的所有新建目录、文件都自动继承此目录的属组权限
sticky作用于目录:粘滞键,目录中的用户只能删除、移动、更改自己的文件或目录(比如创建一个公共目录,管理员不希望a用户能修改b用户创建的、放在公共目录中的文件,反之b用户也不能修改a用户创建的、放在公共目录中的文件,那就把公共目录设定一个sticky位,定住)
讲了这么多废话,这和提权有啥关系啊?
别急,原理懂了就好说了
首先找目标系统上,所有运行中的且有SUID的、都以root用户权限运行的可执行文件(3种命令,不同系统不一样,都试试):
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -print 2>/dev/null
find / -user root -perm -4000-exec ls -ldb {} \;
找到的这些都是以root权限运行的,包含SUID的‘s’的,属主是root的文件
随便找一个试一下(只是演示)
可以看到是root的SUID,都红了
我这里没有好的命令,实际上最好找到有nmap、vim、find、more、less、bash、cp、Nano、mv、awk、man、weget之类的且用了SUID的命令
这些命令都是可以在root权限下运行,对于SUID提权有帮助的
具体提权方法可以参考 https://pentestlab.blog/2017/09/25/suid-executables/
https://blog.csdn.net/fly_hps/article/details/80428173
实际上,基本没有人很nice又非常可爱的小运维会把这些文件加SUID的,相信我
所以就当复习一下Linux的小知识吧,不说了
0x05 环境变量操作
一种与SUID提权 结合+操作 的手段
Linux中环境变量是PATH,echo $PATH 查看当前环境变量
如果在PATH变量中发现“.”,表示用户可以从当前目录执行二进制文件脚本
举个简单的例子,仅供演示不代表实操:
我新建一个ls的可执行文件,里面写着 whoami
PATH没加.之前是这样的
加个. (关于Linux环境变量配置请参考:https://www.cnblogs.com/youyoui/p/10680329.html)
再来ls
可见执行结果不是原来的ls 产生的列表效果了,而是变成执行了我ls文件中的whoami了
那么你讲这些对提权有啥用啊?辅助理解,辅助理解
举一反三,我原来有个可执行的A文件,运行这个A文件可以实现某种功能,比如查看系统进程或者其他什么东西
诶好巧不巧,这个A文件是个有root的SUID的可执行文件(但除了管理员其他人无修改此文件的w权限,只是可读可执行 -rwsr-xr-x)
一个普通用户,在目标Linux中为了提权,想利用我上一点说的搜索root权限的有SUID的文件(find / -user root -perm -4000 -print 2>/dev/null)时,啪地一下发现了这个A文件,很快啊
比如执行A文件叫shell,是通过gcc demo.c -o shell生成的,demo.c这个C文件中调用了系统命令ps,于是./shell效果和执行ps效果是一样的,会显示当前进程信息
cp /bin/sh /tmp/ps
把/bin/sh脚本执行命令文件复制到/tmp路径下,新文件起个名也叫ps
export PATH=/tmp:$PATH
($PATH处写echo $PATH的结果)在原有的环境变量基础上,加上新文件ps(其实内容也就是/bin中的sh)所在的路径
再次./shell的时候,也就是执行ps的时候!!!
这次执行的并不是原有的显示进程信息的操作,由于加入了环境变量,而是执行了/tmp路径下的新文件ps,即执行了sh命令,会出现执行sh的脚本执行命令效果!
在sh命令下,执行whoami查看权限是root,提权成功,是因为SUID提权原理,shell文件本身是有root的SUID的,配合本小点讲的环境变量的操作实现提权+任意命令执
行(ps可以换其他的,/tmp路径可以换其他的,/bin/sh也可以换其他的),这个方法本质上还是需要SUID提权的,算是一种操作的延展,鸡肋+1 get
参考过这篇被翻译烂了、讲的比较全的文章:https://xz.aliyun.com/t/2767
就能更好理解一下上述内容了
其他还有一些方法,比如CVE-2019-14287
请参考文章:https://www.freebuf.com/vuls/217089.html
嗯......不做评论,感兴趣可以看一下
各位师傅还有哪些最新的好办法,求分享
随便转载,请标明作者出处