u1timate
Published on 2021-08-15 / 1,281 Visits
0

Linux提权

[toc]

0x01 linux权限结构介绍

1.文件权限

每个文件针对每类访问者定义了三种不同主要权限

  • r: Read读
  • w:Write写
  • x:Execte执行

drwxr-x— 该权限分为4个部分drwxr-x
d:表示文件类型;
rwx:表示文件所有者的对该文件所拥有的权限;
r-x:表示文件所属组对该文件所拥有的权限;
-:表示其他用户对该文件的权限

读(read),写(write),执行r(recute)简写即为(r,w,x),亦可用数字来(4,2,1)表示 (对应二进制的22, 21,2^0)

如果某文件权限为7则代表可读(4)、可写(2)、可执行(1),即(4+2+1=7).
若权限为6(4+2)则代表可读(4)、可写(2)。
权限为5(4+1)代表可读(4)和可执行(1).
权限为3(2+1)代表可写(2)和可执行(1)。

增加执行权限chmod +x
所有用户对该文件拥有最高权限:chmod 777

权限修改
chmod -R [mode=421] [文件或目录]
备注: r:4 w:2 x:1
r为读权限,可以用4来表示,
w为写权限,可以用2来表示,
x为执行权限,可以用1来表示。
-R 递归修改(就是将嵌套在很多文件夹中的文件权限修改了,如果没有这个,只能到指定的文件夹下进行修改)
范例: chmod 777 /etc/hurenxianghurenxiang这个文件夹权限改为对所有用户可读,可写,可执行
chmod 775 /etc/caiyaocaiyao这个文件夹权限改为其他用户不可读

2.用户

linux中用户结构相对较为简单,每个用户所对应的文件操作权限也比较单一
用户层级:
root 根用户,拥有最高权限,拥有独立于home的root专用的文件夹,相当于windows中的system
普通用户,拥有独立的home文件路径
服务用户,用于服务使用的账户,比如www用户,nginx用户等

  • 查看系统用户
    cat /etc/passwd
    image.png

image.png

字段解释
从上面的例子我们可以看到,/etc/passwd中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:

用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
  • 用户名
    是代表用户账号的字符串。通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头

  • 口令
    一些系统中,存放着加密后的用户口令字。虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如x或者*
    image.png

  • 用户标识号
    是一个整数,系统内部用它来标识用户。一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。通常用户标识号的取值范围是0~65535。0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。在Linux系统中,这个界限是500

  • 组标识号
    字段记录的是用户所属的用户组。它对应着/etc/group文件中的一条记录。

  • 注释性描述
    字段记录着用户的一些个人情况,例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。

  • 主目录
    也就是用户的起始工作目录,它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。

  • 登陆shell
    用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(BourneShell),csh(CShell),ksh(KornShell),tcsh(TENEX/TOPS-20typeCShell),bash(BourneAgainShell)
    系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。
    image.png

用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux系统要求只有那些在系统中登记了的程序才能出现在这个字段中。(nologin并不是是不能登陆,该文件其实是一个二进制文件)
image.png

系统中有一类用户称为伪用户(psuedousers),这些用户在Linux /etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。常见的伪用户如下所示(除了下面列出的伪用户外,还有许多标准的伪用户,例如:audit,cron,mail,usenet等,它们也都各自为相关的进程和文件所需要)

bin         拥有可执行的用户命令文件
sys         拥有系统文件
adm         拥有帐户文件
uucp        UUCP使用
lplp或lpd    子系统使用
nobody      NFS使用

0x02.linux权限的具体表现

1.文件权限

image.png

2.用户位置

  • /root :root用户
  • /home/***: 普通用户

3.操作区别

sudo命令

sudo是Linux上的常用命令,其目的是为了给普通用户提升操作权限,完成一些需要root权限才能完成的任务。如halt,reboot,su等等。这样不仅减少了root用户的登陆和管理时间,还提高安全性(最主要的意图就是解决root在使用过程中存在的问题。root 权限实在是太大了,泄漏或者误操作都将造成巨大的风险)。

  • sudo特性
    • sudo能够显示用户只在某台主机上执行某些命令
    • sudo提供了丰富的日志,详细的记录了用户干了什么,能够将日志传到中心主机或日志服务器
    • sudo使用时间戳文件来执行类型的检票系统,当用户调用sudo并且输入他的密码时。用户获得了一张存活期为5分钟的票(这个值可以在编译的时候修改)
    • sudo的配置文件是sudoer文件,它允许系统管理员集中管理用户的使用权限和使用的主机,他所存放的位置默认为/etc/sudoers,属性必须是0440

sudo -l,显示出主机(执行sudo的使用者)的权限
image.png

0x03.linux信息收集

1.基础信息收集

leas地址
image.png

res.txt结果
image.png

2.linux提权审计工具

les
这个工具误报比较高,需要确认

0x04.linux内核漏洞提权

linux内核漏洞提权原理比较简单,能通过内核写地址的漏洞拿到就是root权限的shell,不会像windows还有privilege的开关

1.利用dirtycow提权

使用kali中的searchsploit搜索提权exp
image.png

查看利用代码 (kali将exploitdb的利用库存放在/usr/share/exploitdb/exploits中)
这里我们使用40939.c这个利用代码
cat /usr/share/exploitdb/exploits/linux/local/40839.c
编译(推荐在目标机器上编译)
image.png

运行(实战中推荐nc+putty shell反弹连接回连,这里因为需要交互,直接使用msf无法完成预期效果)
输入新用户的密码
默认新用户名firefar
image.png

切换用户,完成提权
image.png

nc+putty回连

  • 服务端
nc -lvvvp 5555
  • 目标机运行

2.内核提权原理分析

这里使用cve-2021-3156 sudo漏洞分析与利用

0x05.利用linux已安装的应用中的漏洞进行提权

思路:安装的应用如果能调用内核存在漏洞即可直接利用并转换成root

1.利用samba应用CVE-2007-2447漏洞提权

使用msf

search usermap
use * 
....

直接获取root权限
image.png

0x06.利用suid提权

1.suid介绍

思路:利用过程有点类似上面,但是原理不一样,linux中存在suid这种系统特性。
setuidsetgid 分别是 set uid ID upon execution 和 set group ID upon execution 的缩写。我们一般会再次把它们缩写为 suidsgid。它们是控制文件访问的权限标志(flag),它们分别允许用户以可执行文件的owner或 owner group 的权限运行可执行文件。如Ping命令,
过设置Ping程序的suid,就可以允许低权限⽤户执⾏Ping程序时是以root权限执⾏
。因此,如果⼀个程序中设置了suid,我们可以该程序⽣成的shell来提升权限

passwd权限实现原理

image.png
上图红框中的权限信息有些奇怪,owner 的信息为 rws 而不是 rwx。当 s出现在文件拥有者的x权限上时,就被称为 SETUID BITSSETUID ,其特点如下:

  • SUID 权限仅对二进制可执行文件有效
  • 如果执行者对于该二进制可执行文件具有 x 的权限,执行者将具有该文件的所有者的权限
  • 本权限仅在执行该二进制可执行文件的过程中有效
    image.png

tester 用户是如何利用 SUID 权限完成密码修改的:

  • tester 用户对于 /usr/bin/passwd 这个程序具有执行权限,因此可以执行passwd 程序
  • passwd 程序的所有者为 root
  • tester 用户执行 passwd 程序的过程中会暂时获得 root 权限
  • 因此 tester 用户在执行 passwd 程序的过程中可以修改 /etc/shadow 文件
    但是如果由 tester 用户执行 cat 命令去读取 /etc/shadow 文件确是不行的,没有权限

如果想让任意用户通过 cat 命令读取 /etc/shadow 文件的内容也是非常容易的,给它设置 SUID 权限就可以了

sudo chmod 4755 /bin/cat

image.png
现在 cat 已经具有了 SUID 权限,试试看,是不是已经可以 cat 到 /etc/shadow 的内容了。因为这样做非常不安全,所以赶快通过下面的命令把 cat 的 SUID 权限移除掉:

$ sudo chmod 755 /bin/cat

2.补充

sgid

s 标志出现在用户组的 x 权限时称为 SGIDSGID 的特点与 SUID 相同,我们通过 /usr/bin/mlocate程序来演示其用法。mlocate 程序通过查询数据库文件 /var/lib/mlocate/mlocate.db 实现快速的文件查找。 mlocate 程序的权限如下图所示
image.png
很明显,它被设置了 SGID 权限。下面是数据库文件 /var/lib/mlocate/mlocate.db 的权限信息:很明显,它被设置了 SGID 权限。下面是数据库文件 /var/lib/mlocate/mlocate.db的权限信息:
image.png
普通用户 tester 执行 mlocate 命令时,tester 就会获得用户组 mlocate 的执行权限,又由于用户组 mlocate 对 mlocate.db 具有读权限,所以 tester 就可以读取 mlocate.db 了。程序的执行过程如下图所示:
image.png
除二进制程序外,SGID可以用在目录上。当一个目录设置了 SGID 权限后,它具有如下功能:

  • 用户若对此目录具有 rx 权限,该用户能够进入该目录
  • 用户在此目录下的有效用户组将变成该目录的用户组
  • 若用户在此目录下拥有 w 权限,则用户所创建的新文件的用户组与该目录的用户组相同

下面看个例子,创建 testdir 目录,目录的权限设置如下:
image.png
此时目录 testdir 的 owner 是 nick,所属的 group 为 tester。先创建一个名为 nickfile 的文件:image.png
这个文件的权限看起来没有什么特别的。然后给 testdir 目录设置 SGID 权限:
$ sudo chmod 2775 testdir
image.png
然后再创建一个文件nickfile2:
image.png
新建的文件所属的组为 tester!

总结一下,当 SGID 作用于普通文件时,和 SUID 类似,在执行该文件时,用户将获得该文件所属组的权限。当 SGID 作用于目录时,意义就非常重大了。当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录用 SGID 修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。

sbit

其实 SBITSUIDSGID 的关系并不大。SBIT 是 the  restricted  deletion  flag  or  sticky  bit 的简称。SBIT 目前只对目录有效用来阻止非文件的所有者删除文件。比较常见的例子就是 /tmp 目录
image.png
权限信息中最后一位 t 表明该目录被设置了 SBIT权限。
SBIT 对目录的作用是:当用户在该目录下创建新文件或目录时,仅有自己和 root 才有权力删除

设置 SUID、SGID、SBIT 权限

以数字的方式设置权限
SUID、SGID、SBIT 权限对应的数字如下:

SUID->4
SGID->2
SBIT->1

所以如果要为一个文件权限为 "-rwxr-xr-x" 的文件设置 SUID 权限,需要在原先的 755 前面加上 4,也就是 4755
chmod 4755 filename
同样,可以用 21来设置 SGIDSBIT 权限。设置完成后分别会用 s, s, t 代替文件权限中的 x。其实,还可能出现 ST 的情况。St 是替代 x 这个权限的,但是,**如果它本身没有 x这个权限,添加 SUID、SGID、SBIT 权限后就会显示为大写 S 或大写 T。**比如我们为一个权限为 666 的文件添加 SUID、SGID、SBIT 权限:
image.png
执行 chmod 7666 nickfile,因为666 表示 -rw-rw-rw,均没有x 权限,所以最后变成了 "-rwSrwSrwT"。通过符号类型改变权限除了使用数字来修改权限,还可以使用符号:

$ chmod u+s testfile # 为 testfile 文件加上 SUID 权限。
$ chmod g+s testdir  # 为 testdir 目录加上 SGID 权限。
$ chmod o+t testdir  # 为 testdir 目录加上 SBIT 权限。

2.寻找具有suid权限的可执行文件

这里以老版本的NMAP为例
image.png

3.尝试寻找这个可执行文件中是否能调用交互界面并查看提权效果

老版本的nmap存在交互式界面
nmap --interactive
image.png
完成提权

0x06.计划任务提权(待补充)

0x07.实战思路

image.png
ps:服务账户:比如nginx,apache等

参考

详细解析Linux /etc/passwd文件
Linux 特殊权限 SUID,SGID,SBIT