[toc]
0x01 linux权限结构介绍
1.文件权限
每个文件针对每类访问者定义了三种不同主要权限
- r: Read读
- w:Write写
- x:Execte执行
drwxr-x—
该权限分为4个部分d
、rwx
、r-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/hurenxiang
将hurenxiang
这个文件夹权限改为对所有用户可读,可写,可执行
chmod 775 /etc/caiyao
将caiyao
这个文件夹权限改为其他用户不可读
2.用户
linux中用户结构相对较为简单,每个用户所对应的文件操作权限也比较单一
用户层级:
root
根用户,拥有最高权限,拥有独立于home的root专用的文件夹,相当于windows中的system
普通用户
,拥有独立的home文件路径
服务用户
,用于服务使用的账户,比如www用户,nginx用户等
- 查看系统用户
cat /etc/passwd
字段解释
从上面的例子我们可以看到,/etc/passwd中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
-
用户名
是代表用户账号的字符串。通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头 -
口令
一些系统中,存放着加密后的用户口令字。虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow
文件中,而在/etc/passwd
文件的口令字段中只存放一个特殊的字符,例如x
或者*
。
-
用户标识号
是一个整数,系统内部用它来标识用户。一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录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。
用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux系统要求只有那些在系统中登记了的程序才能出现在这个字段中。(nologin并不是是不能登陆,该文件其实是一个二进制文件)
系统中有一类用户称为伪用户(psuedousers),这些用户在Linux /etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。常见的伪用户如下所示(除了下面列出的伪用户外,还有许多标准的伪用户,例如:audit
,cron
,mail
,usenet
等,它们也都各自为相关的进程和文件所需要)
bin 拥有可执行的用户命令文件
sys 拥有系统文件
adm 拥有帐户文件
uucp UUCP使用
lplp或lpd 子系统使用
nobody NFS使用
0x02.linux权限的具体表现
1.文件权限
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的使用者)的权限
0x03.linux信息收集
1.基础信息收集
res.txt结果
2.linux提权审计工具
les
这个工具误报比较高,需要确认
0x04.linux内核漏洞提权
linux内核漏洞提权原理比较简单,能通过内核写地址的漏洞拿到就是root权限的shell,不会像windows还有privilege的开关
1.利用dirtycow提权
使用kali中的searchsploit
搜索提权exp
查看利用代码 (kali将exploitdb的利用库存放在/usr/share/exploitdb/exploits
中)
这里我们使用40939.c
这个利用代码
cat /usr/share/exploitdb/exploits/linux/local/40839.c
编译(推荐在目标机器上编译)
运行(实战中推荐nc+putty shell反弹连接回连,这里因为需要交互,直接使用msf无法完成预期效果)
输入新用户的密码
默认新用户名firefar
切换用户,完成提权
nc+putty回连
- 服务端
nc -lvvvp 5555
- 目标机运行
2.内核提权原理分析
这里使用cve-2021-3156 sudo漏洞分析与利用
0x05.利用linux已安装的应用中的漏洞进行提权
思路:安装的应用如果能调用内核又存在漏洞即可直接利用并转换成root
1.利用samba应用CVE-2007-2447漏洞提权
使用msf
search usermap
use *
....
直接获取root权限
0x06.利用suid提权
1.suid介绍
思路:利用过程有点类似上面,但是原理不一样,linux中存在suid这种系统特性。
setuid
和 setgid
分别是 set uid ID upon execution 和 set group ID upon execution 的缩写。我们一般会再次把它们缩写为 suid
和 sgid
。它们是控制文件访问的权限标志(flag),它们分别允许用户以可执行文件的owner或 owner group 的权限运行可执行文件。如Ping命令,通
过设置Ping程序的suid,就可以允许低权限⽤户执⾏Ping程序时是以root权限执⾏。因此,如果⼀个程序中设置了suid,我们可以该程序⽣成的shell来提升权限。
passwd权限实现原理
上图红框中的权限信息有些奇怪,owner 的信息为 rws
而不是 rwx
。当 s
出现在文件拥有者的x
权限上时,就被称为 SETUID BITS
或 SETUID
,其特点如下:
- SUID 权限仅对二进制可执行文件有效
- 如果执行者对于该二进制可执行文件具有
x
的权限,执行者将具有该文件的所有者的权限 - 本权限仅在执行该二进制可执行文件的过程中有效
看 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
现在 cat 已经具有了 SUID 权限,试试看,是不是已经可以 cat 到 /etc/shadow 的内容了。因为这样做非常不安全,所以赶快通过下面的命令把 cat 的 SUID 权限移除掉:
$ sudo chmod 755 /bin/cat
2.补充
sgid
当 s
标志出现在用户组的 x
权限时称为 SGID
。SGID
的特点与 SUID
相同,我们通过 /usr/bin/mlocate
程序来演示其用法。mlocate
程序通过查询数据库文件 /var/lib/mlocate/mlocate.db
实现快速的文件查找。 mlocate
程序的权限如下图所示
很明显,它被设置了 SGID
权限。下面是数据库文件 /var/lib/mlocate/mlocate.db
的权限信息:很明显,它被设置了 SGID
权限。下面是数据库文件 /var/lib/mlocate/mlocate.db
的权限信息:
普通用户 tester 执行 mlocate 命令时,tester 就会获得用户组 mlocate 的执行权限,又由于用户组 mlocate 对 mlocate.db 具有读权限,所以 tester 就可以读取 mlocate.db 了。程序的执行过程如下图所示:
除二进制程序外,SGID
也可以用在目录上。当一个目录设置了 SGID 权限后,它具有如下功能:
- 用户若对此目录具有
r
和x
权限,该用户能够进入该目录 - 用户在此目录下的有效用户组将变成该目录的用户组
- 若用户在此目录下拥有 w 权限,则用户所创建的新文件的用户组与该目录的用户组相同
下面看个例子,创建 testdir 目录,目录的权限设置如下:
此时目录 testdir 的 owner 是 nick,所属的 group 为 tester。先创建一个名为 nickfile 的文件:
这个文件的权限看起来没有什么特别的。然后给 testdir 目录设置 SGID 权限:
$ sudo chmod 2775 testdir
然后再创建一个文件nickfile2:
新建的文件所属的组为 tester!
总结一下,当 SGID
作用于普通文件时,和 SUID
类似,在执行该文件时,用户将获得该文件所属组的权限。当 SGID
作用于目录时,意义就非常重大了。当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录用 SGID
修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。
sbit
其实 SBIT
与 SUID
和 SGID
的关系并不大。SBIT 是 the restricted deletion flag or sticky bit 的简称。SBIT 目前只对目录有效,用来阻止非文件的所有者删除文件。比较常见的例子就是 /tmp 目录:
权限信息中最后一位 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
同样,可以用 2
和 1
来设置 SGID
和 SBIT
权限。设置完成后分别会用 s
, s
, t
代替文件权限中的 x
。其实,还可能出现 S
和 T
的情况。S
和 t
是替代 x
这个权限的,但是,**如果它本身没有 x
这个权限,添加 SUID、SGID、SBIT 权限后就会显示为大写 S
或大写 T
。**比如我们为一个权限为 666
的文件添加 SUID、SGID、SBIT 权限:
执行 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为例
3.尝试寻找这个可执行文件中是否能调用交互界面并查看提权效果
老版本的nmap存在交互式界面
nmap --interactive
完成提权
0x06.计划任务提权(待补充)
0x07.实战思路
ps:服务账户:比如nginx,apache等