Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
RightHand-Persistence — COM Windows 지속성 기법 | Kitploit
도구/GitHubGitHub/i014n/righthand-persistence
Persistence MechanismsExploitationPost-ExploitationLearning & EducationRed Teaming
GitHubi014n/righthand-persistence

RightHand-Persistence

COM Windows 지속성 기법

저장소 보기
90113개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

RightHand Persistence

CVE-2026-21509에서 영감을 받음

지속성을 위한 C++ COM 컨텍스트 메뉴 핸들러

C++ 및 COM을 사용한 Windows 컨텍스트 메뉴 핸들러의 샘플 구현으로, 은밀한 지속성 기술을 보여줍니다. 사용자 지정 COM 개체를 등록하면 사용자가 Windows 탐색기에서 특정 대상(파일, 폴더 또는 배경)을 마우스 오른쪽 버튼으로 클릭할 때마다 코드가 실행됩니다.

면책 조항: 이 프로젝트는 교육 및 연구 목적으로만 제공됩니다. 여기에 설명된 기술은 악의적인 목적으로 사용될 수 있습니다. 저자는 이 코드를 불법 활동에 사용하는 것을 묵인하지 않습니다. 책임감 있게 행동하고 이 지식을 윤리적으로 사용하십시오.


POC

poc

시작하기

사전 요구 사항

  • C++ 컴파일러 (예: Visual Studio의 MSVC 또는 MinGW-w64)
  • Windows SDK
  • 테스트용 가상 머신 (안전한 등록 및 실행을 위해)

내 개발 환경

  • IDE: Visual Studio 2019
  • VM 개발: Windows 10 x64 (빌드 19045)
  • VM 테스트: Windows 10 x64 / Windows 11 x64

프로젝트 아키텍처

root@kitploit:~
                                       DllMain.cpp     
                                +-----------------------+
                                |  DLL 템플릿 프로젝트  |
                                +-------+-------+-------+
                            ____/           |        \_____
                            |               |             |
                            v               v             v
                    +------------+  +----------------+  +--------------+
                    |   정의     |  | MyClassFactory |  |   정의       |
    clsid_defined.h |   CLSID    |  +----------------+  |   내보내기   | Source.def
                    +------------+     ClassFactory     |   함수       |
                                          class         +--------------+
                                            |
                                            |
                                            v
                                     +--------------+    
                                     | MyMenuHandler|
                                     +--------------+         
                                      MyMenuHandler
                                          class

1. DllMain.cpp

COM 개체가 DLL을 등록 및 등록 취소하는 데 필요한 표준 함수를 포함합니다.

  • DllRegisterServer(): 대상 파일 확장자/배경에 해당하는 레지스트리 경로를 씁니다. DLL이 등록될 때 실행됩니다.
root@kitploit:~
STDAPI DllRegisterServer() {
    std::wstring clsidString = MyStringFromCLSID(CLSID_DecrypShellExtensionx64);
    std::wstring dllPath = MyGetModuleFilename();

    // 1. COM 클래스 등록 (CLSID)
    std::wstring clsidBaseKey = L"SOFTWARE\\Classes\\CLSID\\" + clsidString;
    SetRegistryKey(HKEY_LOCAL_MACHINE, clsidBaseKey, L"", L"MyMenuHandler Object");

    // 2. DLL 경로 및 스레딩 모델 등록
    std::wstring inprocKey = clsidBaseKey + L"\\InprocServer32";
    SetRegistryKey(HKEY_LOCAL_MACHINE, inprocKey, L"", dllPath);
    SetRegistryKey(HKEY_LOCAL_MACHINE, inprocKey, L"ThreadingModel", L"Apartment");

    // 3. 모든 셸 컨텍스트에 등록
    // 파일, 폴더, 배경, 데스크톱을 포함하는 경로 배열
    std::wstring handlerPaths[] = {
        L"SOFTWARE\\Classes\\*\\shellex\\ContextMenuHandlers\\",
        L"SOFTWARE\\Classes\\Directory\\shellex\\ContextMenuHandlers\\",
        L"SOFTWARE\\Classes\\Directory\\Background\\shellex\\ContextMenuHandlers\\",
        L"SOFTWARE\\Classes\\DesktopBackground\\shellex\\ContextMenuHandlers\\"
    };

    for (const auto& path : handlerPaths) {
        std::wstring fullPath = path + L"MyMenuHandler"; // 핸들러 이름으로 바꾸세요
        SetRegistryKey(HKEY_LOCAL_MACHINE, fullPath, L"", clsidString);
    }

    // 4. 승인된 목록에 등록 (많은 Windows 버전에서 필요)
    std::wstring approvedKey = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved";
    SetRegistryKey(HKEY_LOCAL_MACHINE, approvedKey, clsidString, L"MyMenuHandler");

    // 5. 셸에 변경 사항이 있음을 알림
    SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);

    return S_OK;
}
  • DllUnregisterServer(): 레지스트리를 정리합니다. DLL 등록이 취소될 때 호출됩니다.

2. MyClassFactory

COM 개체를 인스턴스화하는 데 필요합니다. 클래스 팩토리에 대한 자세한 내용.

3. Clsid_defined.h

애플리케이션이 탐색기에 등록될 GUID를 포함합니다. Visual Studio의 guidgen.exe 또는 온라인 GUID 생성기를 사용하여 새 GUID를 생성할 수 있습니다.

root@kitploit:~
// {CEF1AA1B-42F7-4A54-AF46-BCEE5B3FE6BF}
DEFINE_GUID(CLSID_DecrypShellExtensionx64, 0xcef1aa1b, 0x42f7, 0x4a54, 0xaf, 0x46, 0xbc, 0xee, 0x5b, 0x3f, 0xe6, 0xbf);

4. Source.def

모듈 정의 파일입니다. DLL이 내보내는 함수를 지정합니다. .DEF 파일에 대한 자세한 내용.

root@kitploit:~
EXPORTS
    DllGetClassObject PRIVATE
    DllCanUnloadNow PRIVATE
    DllRegisterServer PRIVATE
    DllUnregisterServer PRIVATE

5. MyMenuHandler.cpp

IShellExtInit와 IContextMenu를 구현하는 핵심 클래스입니다. 여기서 사용자 정의 동작을 정의합니다.

  • MyContextMenuHandler::Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject* pdtobj, HKEY hkeyProgId) 등록된 대상에서 마우스 오른쪽 버튼을 클릭할 때마다 호출됩니다. 클릭한 파일이나 폴더를 구문 분석하는 데 사용됩니다.
root@kitploit:~
HRESULT MyContextMenuHandler::Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject* pdtobj, HKEY hkeyProgId)
{
    MessageBoxA(NULL, "Initialize Called!", "Debug", MB_OK);

    // 1. 파일/폴더를 클릭했는지 확인
    if (pdtobj)
    {
        STGMEDIUM medium;
        FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
        if (SUCCEEDED(pdtobj->GetData(&fe, &medium)))
        {
            DragQueryFileA((HDROP)medium.hGlobal, 0, m_szFile, MAX_PATH);
            ReleaseStgMedium(&medium);
            return S_OK; // 성공!
        }
    }

    // 2. 배경을 클릭했는지 확인 (pidlFolder)
    if (pidlFolder)
    {
        if (SHGetPathFromIDListA(pidlFolder, m_szFile))
        {
            return S_OK; // 성공!
        }
    }

    // 3. 폴백: 둘 다 없는 경우에도 메뉴를 표시하기 위해 S_OK 반환
    // m_szFile에 경로가 채워지지 않았을 뿐입니다.
    return S_OK;
}
  • MyContextMenuHandler::InvokeCommand(LPCMINVOKECOMMANDINFO picp) 사용자가 컨텍스트 메뉴에서 특정 사용자 정의 옵션을 클릭할 때 호출됩니다. 여기서 지속성 페이로드 또는 사용자 정의 동작이 실행됩니다.

테스트

대상 VM에서 컴파일된 DLL을 복사하고 다음 명령을 실행합니다.

1. 등록

표준 Windows 바이너리를 사용하여 DLL을 등록합니다.

root@kitploit:~
regsvr32.exe RightHandPersistence.dll

2. 탐색기 다시 시작

explorer.exe 프로세스를 다시 시작하여 새 셸 확장이 메모리에 로드되도록 합니다.

root@kitploit:~
taskkill /f /im explorer.exe & start explorer.exe

3. 등록 취소

컨텍스트 메뉴 핸들러를 제거하고 레지스트리를 정리하려면 regsvr32.exe와 함께 /u 플래그를 사용합니다. 그러면 DllUnregisterServer 함수가 호출됩니다.

root@kitploit:~
regsvr32.exe /u RightHandPersistence.dll

사용자 정의

1. 특정 위치 지정

Windows는 "빈 공간"과 파일을 다르게 분류합니다. 배경을 대상으로 하려면 레지스트리 키를 다음 특정 위치에 매핑하세요.

확장자 매핑에 대한 자세한 내용은 Microsoft Shell 컨텍스트 메뉴 설명서에서 확인할 수 있습니다.

2. 사용자 정의 메뉴 명령 만들기

IContextMenu::QueryContextMenu 메서드를 구현하여 메뉴에 사용자 정의 텍스트(예: "사용자 정의 복사" 또는 "진단 실행")를 지정할 수 있습니다. 이 사용자 정의 텍스트를 클릭하면 IContextMenu::InvokeCommand 내부의 로직이 트리거됩니다.


참고 자료

  • 바로 가기 메뉴 핸들러 만들기 (Microsoft Learn)
  • IShellExtInit 인터페이스 (Microsoft Learn)
  • IContextMenu 인터페이스 (Microsoft Learn)
  • 셸 확장 처리기 등록 (Microsoft Learn)
  • DEF 파일을 사용하여 DLL에서 내보내기 (Microsoft Learn)
  • GuidGenerator.com
도구 다운로드
마우스 오른쪽 버튼 클릭 대상레지스트리 키 경로
파일 (모든 파일)HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers
폴더 (아이콘)HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers
폴더 배경HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers
데스크톱 배경HKEY_CLASSES_ROOT\DesktopBackground\shellex\ContextMenuHandlers