PowerShell
(1) 파워셸의 개요 및 파워셸을 활용한 공격
1. PowerShell 이란?
파워셸은 명령줄 셸, 스크립팅 언어 및 구성 관리 프레임워크로 구성된 플랫폼 간 작업 자동화 솔루션이다. 파워셸은 Windows 위주로 개발되어 왔으나 최근에는 Linux 및 macOS에서 실행할 수도 있다. Windows 버전은 .NET 프레임워크 기반, 그 외 운영체제 버전은 .NET 코어 기반으로 개발이 되고 있다.
파워셸에서 관리 작업은 일반적으로 특정 작업을 구현하는 닷넷 클래스인 cmdlet을 통해 실행된다. 이러한 기능은 공급자를 통해 파일 시스템이나 레지스트리와 같은 다른 데이터 저장소의 데이터에 엑세스하여 작동될 수 있다.
cmdlet은 독립 실행 파일이 아닌 고유한 파워셸의 명령이다. cmdlet은 모든 컴파일된 .NET 언어 또는 PowerShell 스크립팅 언어로 사용할 수 있다. cmdlet은 파워셸에서 스크립트로 사용할 수 있으며 스크립트는 모듈로 패키지화 할 수도 있다. cmdlet에 대한 더 자세한 내용은 마이크로소프트 문서에서 확인할 수 있다.
Windows를 제외한 기타 운영체제에서도 파워셸을 사용할 수 있지만 역시 Windows 환경에서 파워셸을 가장 많이 사용하고 있다. Windows 운영체제에서는 Windows7 이상의 버전에서 파워셸을 지원하고 있으며 Windows Server는 2008 R2 버전 이상에서 지원하고 있다.
파워셸 버전 별로 해당되는 윈도우 운영체제의 목록은 아래 표와 같다. 기본 윈도우 버전은 해당 OS를 설치했을 때 함께 제공되는 파워셸의 버전과 대응된다.
PowerShell 1.0
November 2006
Windows Server 2008
Windows XP SP2
Windows XP SP3
Windows Server 2003 SP1
Windows Server 2003 SP2
Windows Server 2003 R2
Windows Vista
Windows Vista SP2
PowerShell 2.0
October 2009
Windows 7
Windows Server 2008 R2
Windows XP SP3
Windows Server 2003 SP2
Windows Vista SP1
Windows Vista SP2
Windows Server 2008 SP1
Windows Server 2008 SP2
PowerShell 3.0
September 2012
Windows 8
Windows Server 2012
Windows 7 SP1
Windows Server 2008 SP2
Windows Server 2008 R2 SP1
PowerShell 4.0
October 2013
Windows 8.1
Windows Server 2012 R2
Windows 7 SP1
Windows Server 2008 R2 SP1
Windows Server 2012
PowerShell 5.0
February 2016
Windows 10
Windows 7 SP1
Windows 8.1
Windows Server 2012
Windows Server 2012 R2
PowerShell 5.1
January 2017
Windows 10 Anniversary Update
Windows Server 2016
Windows 7 SP1
Windows 8.1
Windows Server 2008 R2 SP1
Windows Server 2012
Windows Server 2012 R2
PowerShell Core 6
January 2018
N/A
Windows 7 SP1
Windows 8.1
Windows Server 2008 R2 SP1
Windows Server 2012
Windows Server 2012 R2
PowerShell 7
March 2020
N/A
Windows 7 SP1
Windows 8.1
Windows Server 2008 R2 SP1
Windows Server 2012
Windows Server 2012 R2
표 출처 : https://4sysops.com/wiki/differences-between-powershell-versions/#powershell-32-bit-vs-64-bit
2. 파워셸을 활용한 공격
파워셸은 명령 프롬프트 창의 명령어를 지원하는 것 외에도, COM(Component Object Model), WMI(Windows Managemnet Instrumentation)를 지원하기 때문에 윈도우의 리소스에 접근하는 것이 용이하다. 따라서 공격자들은 목표 시스템에서 이미 설치가 되어 있으며, 다양한 기능을 수행할 수 있는 파워셸을 적극적으로 활용하여 공격을 수행하는 경우가 많다.
이와 같이 이미 설치되어 있는 정상적인 프로그램을 사용하여 공격을 수행하는 것을 Living-off-the-land (LOTL) 공격이라고 한다. LOTL 공격 수단으로 자주 사용되는 프로그램에는 powershell.exe, regsvr32.exe, mshta.exe, rundll32.exe, certutil.exe 등이 있다. 파워셸은 LOTL 공격 수단의 단골이라고 해도 과언이 아닐 것이다.
美 사이버보안 업체인 Red Canary에서 발표한 MITRE ATT&CK Framework 기반의 2021 위협 탐지 보고서에서 주요 공격 기법 중 가장 많은 퍼센트(24%)를 차지한 기술이 명령 및 스크립팅 인터프리터였다. 2022년 위협 탐지 보고서에서는 53%를 차지했으며 명령 및 스크립팅 인터프리터 항목의 가장 많은 퍼센트(35%)를 차지한 것이 파워셸을 활용한 공격이다. MITRE ATT&CK Framework 테크번호 T1059/001에 관련 내용이 기술되어 있다.
다음은 공격자가 자주 사용하는 파워셸 옵션이다.
-WindowsStyle hidden : 파워셸 스크립트 실행 시 파워셸 콘솔이 실행되지 않도록 합니다. (-w hidden)
-NoProfile : 파워셸 스크립트 실행 시 사용자의 프로필을 실행하지 않습니다. (-nop)
-NonInteractive : 파워셸 프롬프트로 사용자의 입력을 받지 않습니다. (-noni)
-ExecutionPolicy : 실행 정책 값을 설정합니다. (-ep)
-EncodedCommand : 인코딩된 값을 복호화합니다. (-enc)
다음은 공격자가 자주 사용하는 파워셸 유틸리티이다.
New-Object : Microsoft .NET Framework 또는 COM 개체의 인스턴스를 생성합니다.
System.Net.Webclient : URI로 식별되는 리소스와 데이터를 주고 받기 위한 일반적인 메소드를 제공합니다.
DownloadString : 원격지의 파일 내용을 대상 시스템의 메모리에 복사합니다.
DownloadFile : 리소스의 데이터를 로컬 파일로 다운로드합니다.
IEX/Invoke-Expression : 로컬 컴퓨터에서 명령 또는 표현식을 실행합니다.
ICM/Invoke-Command : 로컬 및 원격 컴퓨터에서 명령을 실행합니다.
주로 실행 과정을 숨기기 위한 옵션과 원격지의 데이터에 접근하는 유틸리티들이며, 특히 DownloadString 유틸리티는 파일을 다운로드하여 생성하는 것이 아닌 메모리에 복사하여 실행할 수 있도록 만들기 때문에 fileless 공격에 자주 사용된다. fileless 공격은 피해 시스템에 공격과 관련된 파일이 남지 않으며 메모리를 통해 악성코드가 실행되는 방식이지만 최근의 공격 유형에는 파일을 아예 남기지 않는 것 보다는 지속적으로 공격을 수행할 수 있도록 최소한의 파일만 남겨두는 경우가 많다. MITRE ATT&CK에서 분석한 결과 공격 그룹 중 40%가 fileless 기법을 사용한다고 한다.
위 코드는 간단한 파워셸 fileless 공격 코드이다. DownloadString 의 URI에 접근하고 해당 파일의 내용을 읽어 메모리에 복사한 후 실행하는 코드이다.
해당 코드가 실행되더라도 콘솔 창이 출력되지 않고(-w hidden) 사용자의 입력을 받을 필요가 없으며(-noni) 파일이 다운로드 되는 것을 사용자는 알 수 없다. (iex + DownloadString)
공격자들은 또한 공격이 탐지되는 것을 우회하기 위하여 위 코드처럼 난독화를 하는 경우가 많다. -enc 옵션의 인자로 난독화된 명령문을 넣으면 명령문을 복호화하여 실행할 수 있다.
REMCOS RAT은 악성 행위를 하는 매크로 코드가 삽입된 문서 파일을 피싱 메일을 이용하여 전파하고, 문서 파일이 실행되면 공격자는 감염된 PC를 원격 조작, 정보 탈취 등을 하는 악성코드이다. 이 악성코드에서 사용하는 문서 파일의 매크로 코드는 파일을 다운로드 하고 실행하고 옮기는 기능을 수행하는데, 파워셸 코드를 난독화하여 작성되었다.
NETWALKER 랜섬웨어의 변종 중 하나는 파워셸 코드만을 이용하여 랜섬웨어를 감염시키는데, 파워셸 코드 내부의 Hex 데이터를 메모리에 직접 로드한다. 해당 파워셸 코드 또한 Base64, XOR 연산, ASCII 등의 기법으로 난독화가 되어 있었다.
2019년 국내 대기업 마이킹스 봇넷 감염, 2019년 클롭 랜섬웨어 감염, 2016년 美 DNC 해킹 사건들의 공통점으로는 파워셸 원 라이너를 스케쥴러, 서비스, WMI 등에 등록하는 과정이 있었다는 것이다. 파워셸 원 라이너는 PowerShell One Liner 라는 의미로 텍스트 한 줄로 구성된 문자열 스크립트 명령을 의미한다. 위에서 간단하게 구현한 파일리스 공격 코드와 같이 한 줄로 구성된 공격코드를 의미하는 것이다.
파워셸을 활용한 파일리스의 공격과정은 큰 틀에서 다음과 같다.
파워셸 원 라이너를 실행할 수 있는 매개체인 파일이 실행된다. (js, vbs, hwp, xls, lnk… 등)
매개체 파일이 실행되면서 파워셸 원 라이너 공격 코드가 같이 실행된다.
파워셸 원 라이너를 통해 악성코드가 실행된다.
지속적인 공격을 위해 공격자는 추가 파일을 시스템에 다운로드할 수 있다.
이미 파워셸은 수많은 침해사고에서 흔적이 발견되었으며 공격에 사용되고 있다. 침해사고 대응 관점에서 공격자가 수행한 파워셸 명령문을 해석하는 것은 공격자의 행위를 파악하는 데 있어 중요한 일이다.
하지만 대부분의 공격 명령문은 난독화가 되어있다. 일반적으로 파워셸 관련 로그는 이벤트 로그에서 확인할 수 있으며 Windows 10 운영체제는 PSReadLine 폴더의 ConsoleHost_history.txt 파일에서도 파워셸 로그를 확인할 수 있다. 다음 글에서는 파워셸 명령어가 실행되는 경우 로그는 어디에 어떻게 남는지, 그리고 난독화된 파워셸 명령문의 로그는 어떻게 남는지 작성해보겠다.
Last updated