
CIM 또는 WMI를 사용하여 원격 시스템을 쿼리하는 WMImplant의 C# 포트
WMImplant의 C# 포트로, CIM 또는 WMI를 사용하여 원격 시스템을 쿼리합니다. 제공된 자격 증명이나 현재 사용자 세션을 사용할 수 있습니다.
참고: 일부 명령은 PowerShell을 WMI와 함께 사용하며, --show-commands 명령에서 **로 표시됩니다.
CIMplant는 @christruncer의 WMImplant를 C#으로 재작성하고 확장한 것입니다. 이를 통해 원격 시스템에 대한 데이터 수집, 명령 실행, 데이터 유출 등을 수행할 수 있습니다. 이 도구는 WMI(Windows Management Instrumentation) 또는 CIM(Common Interface Model) - 더 정확히는 MI(Windows Management Infrastructure) - 을 사용하여 연결할 수 있습니다. CIMplant는 대상 시스템에 대한 로컬 관리자 권한이 필요합니다.
Releases 아래에 있는 빌드된 버전을 사용하는 것이 가장 쉬울 수 있습니다. 단, Debug 모드로 컴파일되었습니다. 직접 솔루션을 빌드하려면 아래 단계를 따르세요.
CIMplant.exe --help
CIMplant.exe --show-commands
CIMplant.exe --show-examples
CIMplant.exe -s [remote IP address] -c cat -f c:\users\user\desktop\file.txt
CIMplant.exe -s [remote IP address] -u [username] -d [domain] -p [password] -c cat -f c:\users\test\desktop\file.txt
CIMplant.exe -s [remote IP address] -u [username] -d [domain] -p [password] -c command_exec --execute "dir c:\\"
cat - 파일 내용을 읽습니다.
copy - 파일을 한 위치에서 다른 위치로 복사합니다.
download** - 대상 시스템에서 파일을 다운로드합니다.
ls - 특정 디렉터리의 파일/디렉터리 목록을 표시합니다.
search - 사용자 파일을 검색합니다.
upload** - 대상 시스템에 파일을 업로드합니다.
command_exec** - 명령줄 명령을 실행하고 출력을 받습니다. nops 플래그를 사용하면 PowerShell을 비활성화합니다.
disable_wdigest - UseLogonCredential의 레지스트리 값을 0으로 설정합니다.
enable_wdigest - UseLogonCredential 레지스트리 값을 추가합니다.
disable_winrm** - 대상 시스템에서 WinRM을 비활성화합니다.
enable_winrm** - 대상 시스템에서 WinRM을 활성화합니다.
reg_mod - 대상 시스템의 레지스트리를 수정합니다.
reg_create - 대상 시스템에 레지스트리 값을 생성합니다.
reg_delete - 대상 시스템의 레지스트리를 삭제합니다.
remote_posh** - 원격 시스템에서 PowerShell 스크립트를 실행하고 출력을 받습니다.
sched_job - Win32_ScheduledJobs가 오래된 API에 접근하기 때문에 구현되지 않았습니다.
service_mod - 시스템 서비스를 생성, 삭제 또는 수정합니다.
process_kill - 대상 시스템에서 프로세스 이름 또는 ID로 프로세스를 종료합니다.
process_start - 대상 시스템에서 프로세스를 시작합니다.
ps - 프로세스 목록을 표시합니다.
active_users - 대상 시스템에서 활성 프로세스를 가진 도메인 사용자를 나열합니다.
basic_info - 대상 시스템에 대한 기본 메타데이터를 열거하는 데 사용됩니다.
drive_list - 로컬 및 네트워크 드라이브를 나열합니다.
ifconfig - 활성 네트워크 연결이 있는 NIC의 IP 정보를 가져옵니다.
installed_programs - 대상 시스템에 설치된 프로그램 목록을 가져옵니다.
logoff - 대상 시스템에서 사용자를 로그오프합니다.
reboot (or restart) - 대상 시스템을 재부팅합니다.
power_off (or shutdown) - 대상 시스템의 전원을 끕니다.
vacant_system - 사용자가 시스템에서 자리를 비웠는지 확인합니다.
edr_query - 로컬 또는 원격 시스템에서 EDR 공급업체를 쿼리합니다.
logon_events - 시스템에 로그온한 사용자를 식별합니다.
* 모든 PowerShell은 --nops 플래그를 사용하여 비활성화할 수 있지만, 일부 명령은 실행되지 않습니다 (upload/download, enable/disable WinRM).
** PowerShell 사용을 나타냅니다 (PowerShell Runspace 사용 또는 Win32_Process::Create 메서드를 통해).

저는 execute-assembly를 통해 사용할 수 있도록 CIMplant를 코딩하고 싶었습니다. 따라서 모든 것이 하나의 실행 파일로 패키징되어 반사적으로 로드됩니다. 모든 명령을 beacon을 통해 문제없이 실행할 수 있을 것입니다. 즐기세요!

이것은 작업의 두뇌, 프로그램의 드라이버입니다.
여기서 초기 CIM/WMI 연결이 이루어지고 애플리케이션의 나머지 부분으로 전달됩니다.
모든 WMI 명령에 대한 함수 코드
모든 CIM (MI) 명령에 대한 함수 코드
물론, 가장 먼저 주의해야 할 것은 초기 WMI 또는 CIM 연결입니다. 일반적으로 WMI는 DCOM을 통신 프로토콜로 사용하는 반면, CIM은 WSMan(또는 WinRM)을 사용합니다. 이는 CIM에서 수정할 수 있으며 CIMplant에서도 수정되지만, 지금은 기본값에 대해서만 알아보겠습니다. DCOM의 경우 초기 TCP 연결은 포트 135를 통해 이루어집니다. 그러면 연결 및 수신 시스템은 새롭고 매우 높은 포트를 사용하기로 결정하므로 이는 크게 달라집니다. WSMan의 경우 초기 TCP 연결은 포트 5985를 통해 이루어집니다.
다음으로, 이벤트 뷰어에서 Microsoft-Windows-WMI-Activity/Trace 이벤트 로그를 확인해야 합니다. 이벤트 ID 11을 검색하고 가능하면 IsLocal 속성으로 필터링하세요. 또한 Microsoft-Windows-WinRM/Analytic 로그 내에서 이벤트 ID 1295를 찾을 수도 있습니다.
마지막으로, Win32_OSRecoveryConfiguration 클래스의 DebugFilePath 속성에 대한 수정 사항을 찾아야 합니다. 탐지에 대한 더 자세한 정보는 블로그 시리즈 1부에서 확인할 수 있습니다: CIMplant Part 1: Detection of a C# Implementation of WMImplant