보안정보

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

Powershell을 이용한 파일리스 공격

2021.04.06

75,480






01. 파일리스와 공격 패러다임 상관관계 분석

최근 악성코드 관련 뉴스 기사를 접할 때 파일리스라는 단어를 자주 접하게 된다. 파일리스 공격은 파일이 존재하진 않지만 악성코드나 랜섬웨어에 감염되게 하는 것으로 공격자들이 자신들의 공격 행위의 탐지를 어렵게 하기 위해 애용하는 공격방식으로 자리매김한 것으로 보인다. ESET은 ‘사이버 보안 트렌드 리포트 2021’을 통하여 파일리스 방식의 악성코드 공격 위협이 더욱 고도화될 것으로 전망하고 있다. 또한, 사이버 스파이 활동을 수행하는 해커 그룹들이 파일리스 공격을 이용하여 여러 정부 기관을 공격하고 있으며 파일리스 공격 수법이 더욱 복잡해지고 대규모 조직을 대상으로 하는 공격에 주로 사용될 것으로 예측되고 있다.

파일리스 공격의 자세한 내용은 후술하겠지만 악성 파일을 저장시키지 않고 시스템 메모리에 바로 로드되어 실행하는 공격 방식이다. 대부분의 악성코드는 대상 PC에 파일을 설치 및 실행 시켜 공격자가 원하는 행위를 실행시키는 것이 일반적인 공격 방식이다. 파일리스 공격은 대부분의 악성코드가 공격하는 방식을 비틀어 버리는 새로운 공격방식으로 이론적으로는 사용자의 디스크에 파일을 저장하지 않고 공격자가 원하는 공격이 가능하다.

따라서, 다양한 경로를 활용하여 공격자는 파일리스 공격을 시도하지만 CMD 및 기본적으로 이용되는 경로를 사용하는 것은 백신에 탐지되거나 공격 시도가 들킬 위험성이 크다. 공격자는 당연히 탐지되지 않는 경로를 찾는데 그런 경로 중 하나로 PC에 설치된 여러 프로그램 중 Powershell이 새로운 경로로 주목받고 있다. 어떤 이유에서 파일리스의 공격 경로로 Powershell이 주목을 받고 있는지 알아보자.


02. 파일리스(Fileless) 개요

파일리스(Fileless)란 희생자의 컴퓨터의 저장장치에 악성 파일을 저장시키지 않고 시스템 메모리에 바로 로드되어 실행되는 것을 의미한다. 해당 방식을 이용하여 실행되는 악성코드를 파일리스 악성코드(Fileless Malware)라고 지칭한다. 그에 따라 하드디스크와 같은 저장 장치에 저장된 파일들을 스캔하는 일반적인 방식으로는 악성코드를 탐지할 수 없다. 

통상적으로 메모리에 실행 데이터를 저장 후 실행시키기 때문에 최초 실행 이후 메모리 초기화, 재부팅 등의 방법을 이용 시 이미 장악한 시스템 권한 등을 다시 얻기 위한 재공격이 필요하다. 하지만, 최근 발견되고 있는 파일리스 악성코드는 희생자 PC에 최소한의 악성파일을 남겨두어 지속적으로 제어권을 획득 할 수 있는 발판을 마련한다. 일반적으로 레지스트리, 서비스, 작업 스케쥴러, WMI(Windows Management Instrumentation) 또는 OS 관리 영역을 벗어난 외부에도 저장될 수 있다. 


[그림 1] 파일리스(Fileless) 공격의 라이프사이클 (출처: Kaspersky Lab)



[그림 2] 파일리스(Fileless) 공격에서 주로 사용되는 도구 목록 (출처: TrendMicro)


마이크로소프트(Microsoft)사는 파일리스 공격의 유입 및 실행 방식을 [그림 3]으로 표현하였으며 공격타입을 정리하면 [표 1]과 같다.


[그림 3] 파일리스(Fileless) 공격의 유입 경로 (출처: Microsoft)


Type 1

Type 2

Type 3

파일을 사용하지 않고

명령어만 이용

파일을 디스크에 쓰지 않지만

특정 파일을 간접적으로 사용

파일리스 공격의 지속성을

위해 파일이 필요


[표 1] 파일리스 공격 타입


최근 발견되는 파일리스 공격은 Type 1을 이용한 공격에서 최초 공격 이후 재부팅 등의 이유로 재공격이 필요한 방식에 한계를 느낀 공격자들이 Type 3를 이용하여 취약점을 이용, 문서 내부의 매크로 기능을 이용하여 공격을 시도하며 지속적인 공격을 시도하기 위해 외부 C2에서 파일을 내려받아 사용자가 알아채기 어려운 경로에 파일을 저장 후 실행한다. 


03. Living-Off-The-Land 기법

Living-off-the-land 기법은 해커와 같은 공격자들이 시스템에 이미 설치되어 있는 정상적인 도구를 사용하거나 간단한 스크립트, 코드를 메모리에서 직접 실행하는 기법이다. 피해자 시스템에 기본으로 설치되어 있는 정상적인 프로그램을 활용하여 공격을 수행하기 때문에, 백신의 탐지를 회피할 수 있다.

순번

파일명

기능

1

powershell.exe

 CLI 셸 및 스크립트 언어를 사용하는 명령어 인터프리터

2

regsvr32.exe

DLL(Dynamic Link Library)Windows Registry에 등록

3

mshta.exe

HTA(HTML Application)을 실행 (내부 javascript 실행 가능)

4

rundll32.exe

DLL(Dynamic Link Library)를 실행시키는 용도로 사용

5

certutil.exe

CA(Certification Authority) 정보 관리, 파일 다운로드 기능 존재


[표 2] Living-off-the-land 기법에서 자주 사용되는 프로그램


파일리스 공격은 Living-off-the-land 기법에서 사용되는 프로그램 중 Powershell.exe를 주로 이용하여 사용자가 원하는 C2에서 파일 다운로드를 시도하거나 특정 명령어를 실행한다. [표 3]는 Powershell 명령어를 이용하여 원격에서 파일 다운로드를 시도하는 명령어의 예제이다.


순번

기능

1

윈도우에 기본으로 내장된 도구인 Powershell 실행

2

Powershell 프로세스 실행여부를 확인하기 어렵도록 백그라운드로 실행

3

파라미터를 이용하여 스크립트 문자열 전달 

4

IEX(Invoke-Expression) 파일을 저장하지 않고

전달된 문자열을 코드로 메모리에서 바로 실행 가능, 공격의 핵심 명령어

5

.NET 라이브러리 사용 가능, 외부 파일 다운로드 명령어를 이용한 스크립트 다운로드 시도

추가

-enc 명령어를 이용하여 base64인코딩된 데이터를 디코딩하는 등의 난독화 공격 시도 가능


[표 3] Powershell 명령어에서 각 인자의 기능


04. PowerShell을 이용한 파일리스 공격사례

파일리스의 공격은 2000년 초반의 메모리 상주형 악성코드부터 시작되어 2016년 Powershell을 활용한 공격방식을 사용하기 시작한 시점부터 공격 횟수가 큰 폭으로 증가하였다. MITRE의 ATTACK Techniques에 별도의 항목으로 생성될 정도의 높은 활용도를 보이며 EMOTET, njRAT 등의 금융 관련 악성코드부터 Cobalt Strike, 북한 추정 그룹인 Lazarus를 포함한 약 100개 이상의 공격그룹에서 파일리스 공격방식을 사용하는 것으로 알려져 있다. 

대부분의 악성코드의 전파방식에서 사용 가능한 방식이지만 해당 내용에서는 가장 많이 알려진 문서형 악성코드의 전파방식과 Powershell 코드만 이용하여 감염을 시도하는 실제 공격사례를 알아보자.


1) 문서형 악성코드 (매크로, VBS)

다양한 악성코드에서 파일리스 방식의 공격 기법을 사용하고 있으나 예시에 사용되는 파일은 REMCOS RAT이다. 해당 악성코드는 피싱 메일을 이용하여 꾸준히 유포되고 있으며 악성 행위를 하는 매크로 코드가 삽입된 문서 파일을 이메일에 첨부 후 발송한다. 해당 사용자가 문서 파일을 실행 시 감염되며 공격자는 감염된 사용자의 PC를 원격 조작, 정보 탈취 등의 기능이 있는 악성코드이다. 

해당 샘플 최초 실행 시 매크로를 포함하여 실행할 것인지 물어보며 매크로 포함 버튼을 클릭 시 내부 매크로 코드가 실행 후 파일은 종료된다.


[그림 4] 샘플파일 최초 실행 시 화면


매크로 코드 추출 후 확인 시 Powershell 관련 문자열 다수 확인되나 일부 난독화 확인되어 복호화 진행 시 Powershell 명령어를 이용하여 파일 다운로드, 이동, 실행 시도가 확인된다.


[그림 5] 복호화된 매크로 코드의 일부


실행 시 외부 C2에서 최종 파일인 remcos.exe가 다운로드 되어 사용자계정AppDataRoaming
Remcos 폴더 하위에 저장된다.


[그림 6] REMCOS RAT가 설치된 경로


실행 시 최종 파일인 remcos.exe가 다운로드 되어 사용자계정AppDataRoamingRemcos 폴더 하위에 저장되며 외부 C2와의 통신을 통해 탈취된 정보를 전송한다.




[그림 7] REMCOS RAT에서 키로깅 기능으로 탈취한 키보드 입력 내용


[표 1]에서 언급한 Type 3 방식 및 RAT 공격의 공통점인 지속적인 공격 시도를 위해 시작 프로그램에 실행파일을 등록한다.


[그림 8] REMCOS RAT 공격을 지속하기 위해 시작프로그램 등록


2) Netwalker 랜섬웨어

Netwalker 랜섬웨어의 변종 중 하나에서 다른 파일의 생성 없이 파워쉘 코드만을 이용하여 랜섬웨어를 감염시키는 것이 가능한 변종이 발견되었다. 해당 코드의 공격방식은 2020년 9월 월간보안동향에 작성된 Reflective DLL Injection 내용과 동일한 공격방식이나 차이점은 생성된 DLL에서 로드하는 것이 아닌 Powershell 코드 내부의 hex 데이터를 메모리에 직접 주입하는 것에 있다. Powershell 코드만 이용하여 작동되는 해당 랜섬웨어에 대해 알아보자. 

최초 Powershell 코드 확인 시 Base64 디코딩 및 ASCII로 문자열을 받기 위한 명령어와 Base64로 인코딩된 데이터가 추가되어 있다. Base64 디코딩, XOR 연산 등의 디코딩 결과 난독화되어 있는 코드가 확인된다.

[그림 9] 최초 코드에 존재하는 Base64 인코딩 된 데이터와 최종 디코딩 결과


최초 감염된 PC의 비트 수를 확인하여 저장된 랜섬웨어 데이터 중 32/64비트용 랜섬웨어 데이터를 선택한다. 


[그림 10] 감염된 PC의 비트 수 확인을 통한 버전 선택


공격 시도 및 저장 중인 데이터를 메모리에 올릴 때 필요한 함수의 API 주소를 kernel32.dll에서 찾는다.


[그림 11] API 사용을 위한 Import 시도

함수명(11)

VirtualAlloc

GetProcAddress

LoadLibraryA

WriteProcessMemory

VirtualFree

GetCurrentProcess

CloseHandle

VirtualAllocEx

VirtualProtectEx

OpenProcess

CreateRemoteThread

 


[표 4] 랜섬웨어가 API 사용을 위해 주소를 검색하는 함수명 


해당 파일에서 injection에 사용되는 Windows 탐색기인 explorer.exe 프로세스를 검색 후 내장된 DLL 로더를 이용하여 필요한 메모리 주소 및 재배치될 메모리 주소를 계산한다.


[그림 12] explorer.exe 프로세스 검색 및 메모리 주소 계산


랜섬웨어의 기본 특성인 복구를 불가능하게 하기 위해 섀도우 볼륨 복사본 정보를 확인 후 삭제한다. 


[그림 13] 랜섬웨어가 API 사용을 위해 주소를 검색하는 함수명 


05. 대응방안

지금까지 Powershell을 이용한 파일리스 공격에 대해서 알아보았다. 파일을 전혀 사용하지 않고 코드만 이용하는 완전한 파일리스 공격보다 최소 1개 이상의 파일을 내려받은 후 사용자가 모르는 경로에 설치 후 실행하며 시작 프로그램 등록, 서비스 등록 등을 이용하여 지속적인 공격을 진행할 수 있는 통로를 생성하는 경우가 많다. 파일을 설치하는 방식으로 지속적인 공격을 유지하기 위한 시도를 진행하나 안티바이러스에서 탐지를 못 하는 경우가 생길 수 있으며, 파일리스 공격에 사용되는 Living-off-the-land 기법은 Powershell과 같은 정상적인 윈도우 프로세스를 이용하기 때문에 안티바이러스에서 탐지에 어려움이 있다. 그렇기에 아래 대응 방안을 이용하여 파일리스 공격을 사전에 대비하거나 사후 추적에 용이하도록 설정하도록 하여야 한다.

1) Powershell 스크립트 블록 로깅 설정

Windows 운영체제 최초 설치 시 Powershell 관련 로깅 옵션은 모두 구성되지 않음 (사용 안 함)으로 설정되어 있다. 이로 인해 Powershell에서 사용된 명령 등의 정보를 확인할 수 없어 침해사고 조사 등의 이유로 인해 PC의 확인이 필요한 경우 해당 내용을 확인할 수 없다. 이로 인해 아래와 같은 경로로 접근하여 Powershell 스크립트 블록 로깅을 사용으로 설정하여 활성화할 필요가 있다.


[그림 14] 로컬 그룹 정책 편집기에서 Powershell 로깅 설정 페이지


2) Sysmon을 이용한 탐지 방안

Windows 이벤트 로그에 기록되는 내용은 리눅스 배포판에서 기록되는 로그에 비해 정보의 양과 질이 떨어지며 Powershell 관련 로깅 옵션을 모두 사용한다고 하여도 Powershell에서 실행된 코드만 확인될 뿐 해당 코드의 행위는 확인하기 어렵다. 그렇기 때문에 로그를 세부적으로 기록할 수 있는 도구가 필요하기 마련이다. 이런 불편함을 해결 할 수 있는 Sysmon을 소개하려 한다.

Sysmon은 Microsoft에서 배포하는 Sysinternals에 포함된 도구로 Windows 로그에 기록되지 않거나 세부적으로 기록되지 않는 내용에 대해서 상세한 로그 기록을 위해 사용되는 도구이다. 최신 배포 일자는 2021/01/13으로 최초 실행 시 드라이버 및 서비스 형태로 설치되며 로그 데이터는 윈도우 로그 경로에 Microsoft-Windows-Sysmon%4Operational.evtx 파일이 생성되어 저장된다. 

최초로 실행 시 프로세스 생성에 관한 이벤트만 수집하며 특정 이벤트 및 해시를 포함한 로깅이 되지 않기 때문에 사용자가 원하는 데이터가 포함된 로그 수집이 가능하도록 XML 파일로 해당 내용이 포함되도록 설정 후 실행하여야 한다. 


[그림 15] 미리 설정된 xml 파일을 로드하여 Sysmon 실행



[그림 16] 미리 설정된 xml 파일 내용 일부 (출처: https://github.com/SwiftOnSecurity/sysmon-config)


[그림 15]에서 설정이 완료된 Sysmon은 설정된 조건에 맞는 로그를 지속적으로 수집하며 [그림 17]과 같이 랜섬웨어의 동작 도중 백그라운드에서 동작하는 행위 또한 수집이 가능하다.

이벤트 뷰어에서 Powershell 로그 확인 시 코드 디코딩 내역 및 원격 명령 실행 로그만 확인된다.


[그림 17] Netwalker 랜섬웨어 동작 당시 Powershell 로그


Sysmon 로그의 경우 Powershell 및 다른 로그에서 확인하기 어려운 Injection, 파일 생성, 레지스트리 조작 등의 행위에 대한 상세 로그가 존재한다. 해당 로그를 확인하여 공격 시작 시점, 행위, Process ID 등을 상세하게 확인 할 수 있다. Powershell 이외에 시스템 전반에서 발생되는 행위에 대한 로깅이 가능하여 침해사고 이후의 분석에 큰 도움을 줄 수 있다.


[그림 18] Netwalker 랜섬웨어 동작 당시 Sysmon 로그


06. 참고자료

[1] https://www.kaspersky.com/enterprise-security/wiki-section/products/fileless-threats-protection [2] https://docs.microsoft.com/ko-kr/windows/security/threat-protection/intelligence/fileless-threats
[3] https://attack.mitre.org/techniques/T1059/001/
[5] https://documents.trendmicro.com/assets/infographics/Fileless-Threats-101-infographic.jpg
[6] https://github.com/SwiftOnSecurity/sysmon-config