보안정보
전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.
솔라윈즈(Solarwinds)와 악성코드
2021.03.03
68,462
01. 개요
2020년 12월 13일 CISA를 통해 네트워크 관리 솔루션 SolarWinds Orion 제품의 공급망이 신원 미상의 해커들에게 공격당해 일부 버전의 제품이 백도어로 사용된 사실이 세상에 공개되었다. SolarWinds Orion은 Fortune 500대 기업 중 400곳 이상의 기업에서 사용되고 있고, SolarWinds의 전체 고객사 30만 곳 중 3만 3천 곳에서 사용 중인 제품이다. 공격자들은 악성코드가 감염된 기업 중에서도 공격 가치가 높은 정보를 탈취할 수 있는 곳을 표적으로 삼아 공격하였다. Microsoft가 공개한 피해 비중은 △IT관련 분야(44%), △정부기관(18%), △싱크탱크 및 NGO(18%), △정부 계약업체(9%), △기타(11%) 이며 공격을 당한 미 정부기관은 미국 국방부, 미국 국토안보부, 미국 국립 보건 연구원, 미국 재무부, 미국 상무부 등이 있다.
현재까지의 조사 결과에 따르면 솔라윈즈 공급망 공격에서는 SUNSPOT과 SUNBURST(Solorigate) 악성코드가 사용되었다. FireEye社는 해당 공격의 배후 그룹을 UNC2452, Volexity社는 Dark Halo로 명명하고 있으며, 美 보안기관 4곳은 배후 국가로 러시아를 지목했다. Kaspersky社는 SUNBURST 악성코드가 러시아 APT 그룹 Turla가 사용하는 백도어 KAZUAR 와 유사하다고 밝혔다.
본 보고서에서는 솔라윈즈 공급망 해킹 사건과 공격에서 사용된 SUNBURST 악성코드에 대해 알아보고자 한다.
[그림 1] Solarwinds Orion 공급망 공격 피해 비중(출처 : 마이크로소프트)
02. 공격
1) 솔라윈즈와 공급망 공격(Supply Attack)
공급망 공격(Supply Attack)이란 해커가 기업의 개발 환경에 침투하여 문제를 발생시키는 공격을 의미한다. 공급망 공격은 개발/배포 단계에서 변조된 악성코드가 소프트웨어 업체의 정상 업데이트 서버로 배포되기 때문에 사용자의 입장에서는 업데이트된 파일이 공격자에 의해 변조된 파일임을 쉽게 알아차릴 수 없다. 때문에 공격 발생 시 사용자의 입장에서는 속수무책으로 당할 수밖에 없고 기업의 입장해서는 공격이 발생하였음을 인지하기 전까지는 계속해서 악성코드를 유포하게 된다. 이러한 공급망 공격의 특성으로 인해 피해는 클 수 밖에 없으며 몇 년 전부터 공격자들의 공급망 공격 빈도가 증가하고 있다. 솔라윈즈 공급망을 공격한 해커들도 이러한 공급망 공격의 특성을 노렸다. 2019년 9월부터 시작된 공격은 2021년 1월이 되어서야 탄로 났다.
2) 영향을 받는 대상
악성코드의 영향을 받는 대상은 [표 1]과 같다. 2019.4.HF 4 이전의 모든 버전은 SUNBURST의 영향은 받지 않으나, 취약점(CVE-2020-10148)을 이용하는 SUPERNOVA는 모두 영향을 받는다.
[SUPERNOVA]
SUPERNOVA는 이번 솔라윈즈 공급망 공격 사고 조사 중 발견된 악성코드로, Microsoft는 공급망을 공격한 그룹이 아닌 다른 공격 그룹의 소행으로 보고 있다. SUPERNOVA는 제로데이 취약점을 이용하여 악성코드를 설치한다. 설치되는 악성코드는 .NET로 개발된 웹 쉘이며, 웹서버를 대상으로 하는 백도어이다. |
순번 |
영향 받는 Orion 플랫폼 버전 |
SUNBURST |
SUPERNOVA |
최신버전 |
1 |
2020.2.4 |
X |
X |
최신버전 |
2 |
2020.2.1HF2 |
X |
X |
2020.2.4 |
3 |
2020.2.1 HF 1 |
X |
O | |
4 |
2020.2.1 |
X |
O | |
5 |
2020.2 HF 1 |
O |
O | |
6 |
2020.2 |
O |
O | |
7 |
2019.4.2 |
X |
X |
최신버전 |
8 |
2019.4 HF 6 |
X |
O |
2020.2.4 or 2019.4.2 |
9 |
2019.4 HF5 |
O |
O | |
10 |
2019.4 HF 4 |
X |
O |
[표 1] 영향을 받는 Orion 플랫폼 버전(출처 : Solarwinds)
03. 공격에 사용된 악성코드
1) SUNSPOT
CrowdStrike 社의 분석 내용에 따르면 공격자들은 공급망에 메인 악성코드인 SUNBURST 백도어를 SUNSPOT 이라는 악성코드를 사용하였다. 해당 악성코드는 “taskhostsvc.exe”라는 이름으로 Solarwinds Orion 제품의 소프트웨어 빌드 서버에서 동작하였다. SUNSPOT은 Microsoft Visual Studio 개발도구 중 빌드에 사용되는 MsBuild.exe가 현재 Orion 소프트웨어를 빌드 중인지 확인한다. 빌드 중인 것이 확인되면 SUNSPOT은 빌드 작업을 하이재킹해 Solarwinds Orion 소프트웨어에 SUNBURST 백도어 코드를 추가하고, 백도어 코드를 추가하여 빌드 하는 도중 오류가 발생하는지에 대해 확인하였다. 현재까지 샘플의 IOC는 공개되었으나, 샘플이 공개되지 않아 직접 분석을 할 수 없었다.
2) SUNBURST
SUNSPOT에 의해 변조된 Solarwinds Orion 소프트웨어에 포함되어 있는 백도어 악성코드이다. FireEye社에서는 SUNBURST, Microsoft社에서는 Solorigate로 명명하고 있다. SUNSPOT은 △DGA(Domain Generation Algorithms)를 이용한 도메인 네임 변경, △보안 제품 관련 서비스 확인 및 리버싱 · 포렌식 툴 실행 여부 확인, △C2 통신 등의 행위를 통해 피해 대상의 정보를 탈취하고 일부 공격 대상에는 추가 악성코드(TEARDROP)를 이용하여 공격을 진행하였다. 본 보고서에서는 샘플이 공개된 SUNBURST에 대해서 분석을 진행하였다.
3) TEARDROP
SUNBURST에서 특정 조건을 만족 시 드롭 되는 악성코드로 소수의 공격 대상에서만 발견되었다. 감염된 사용자의 PC에서 Cobalt Strike Beacon을 로드하기 위한 로더(Loader) 역할을 한다.
04. SUNBURST
1) 개요
공급망 공격에 의해 유포된 SUNBURST 백도어는 SolarWinds.Orion.Core.BusinessLayer.dll 파일을 이용한다. 설치는 변조된 SolarWinds Installer Patch(*.m네) 파일을 통해 설치되며. 설치 후 정상 SolarWinds.BusinessLayerHost.exe(or x64)에 의해 로드되어 악성 행위가 진행된다.
2) 분석 파일 정보
본 보고서에서 분석된 분석에 사용된 샘플은 FireEye에서 공개한 악성코드 IoC에서 채택하였다.
순번 |
파일명 |
MD5 |
1 |
CORE-2019.4.5220.20574-SolarWinds-Core- v2019.4.5220-Hotfix5.msp |
02af7cec58b9a5da1c542b5a32151ba1 |
2 |
Solarwinds Worldwide, LLC |
08e35543d6110ed11fdf558bb093d401 |
3 |
SolarWinds.Orion.Core.BusinessLayer.dll |
2c4a910a1299cdae2a4e55988a2f102e |
4 |
SolarWinds.Orion.Core.BusinessLayer.dll |
846e27a652a5e1bfbd0ddd38a16dc865 |
5 |
SolarWinds.Orion.Core.BusinessLayer.dll |
b91ce2fa41029f6955bff20079468448 |
6 |
OrionImprovementBusinessLayer.2.cs |
4f2eb62fa529c0283b28d05ddd311fae |
7 |
app_web_logoimagehandler.ashx.b6031896.dll |
56ceb6d0011d87b6e4d7023d7ef85676 |
[표 2] FireEye에서 공개한 악성코드 IoC 정보
순번 |
구분 |
내용 |
1 |
파일명 |
SolarWinds.Orion.Core.BusinessLayer.dll |
2 |
MD5 |
b91ce2fa41029f6955bff20079468448 |
3 |
파일크기 |
987.34 KB |
4 |
파일 타입 |
Win32 DLL(.NET) |
5 |
AV 탐지여부 |
53/63 (AV 탐지여부 : Virustotal 2021/01/11 기준(UTC)) |
6 |
Version |
2019.4.5200.9083 |
7 |
Compile Time |
2020-03-24 08:52:34 (UTC) |
8 |
Signing Time |
2020-03-24 08:53:43 (UTC) |
[표 3] 분석 파일 정보
3) 상세분석
SolarWinds.Orion.Core.BusinessLayer.dll 파일은 [표 4]와 같은 일련번호를 가진 디지털 서명으로 인증 되어있어 사용자의 입장에서는 악성코드임 의심하기가 어렵다.
순번 |
구분 |
내용 |
1 |
일련번호 |
0f:e9:73:75:20:22:a6:06:ad:f2:a3:6e:34:5d:c0:ed |
[표 4] 인증서 일련번호
메인 악성행위는 변조된 SolarWinds.Orion.Core. BusinessLayer.dll 파일의 RefreshInternal 메소드 내부 스레드를 통해 동작한다. 정상 SolarWinds.Orion.Core.BusinessLayer.dll 파일에는 다음의 try/catch 구문이 존재하지 않는다.
[그림 5] 변조된 RefreshInternal 메소드 내부
현재 실행중인 상위 프로세스 이름이 solarwinds.businesslayerhost 인지 해시 값을 이용하여 확인한다.
[그림 6] 해시 값으로 프로세스 명 확인
SUNBURST 악성코드 내부에서 사용되는 파일/프로세스/서비스명은 64bit FNV-1A로 연산한 해시 값에 6605813339339102567 을 XOR 연산 한 값을 사용한다.
[그림 7] 좌-해시값을 만드는 함수 / 우-해시값을 사용하는 함수 내부
현재 실행중인 DLL파일의 마지막 수정된 날짜를 확인한다. 최종 수정된 날짜가 12~14일 이전인지 확인한다.
[그림 8] 수정된 날짜를 확인하는 루틴
실행중인 악성코드의 현재 상태 값을 설정한다. 최초 실행 시 해당 악성코드는 new(4) 값이 설정된다. 이 후 행위의 조건에 따라 Truncate, Append의 값이 설정된다.
[그림 9] 실행중인 악성코드의 현재 상태 값을 설정
악성코드가 동작중인 PC에서 도메인 네임을 확인한다. 도메인 네임이 존재하는 경우 해당 도메인 네임이 다음의 [표 5]에 포함된 이름에 해당되는지 확인한다. 감염된 대상에서 도메인 네임을 가지고 올 수 없거나 [표 5]에 포함된 도메인 네임을 가지고 있으면 악성코드는 종료된다.
[그림 10] 도메인 네임을 확인하는 루틴
도메인 네임(13개) | ||||
swdev.local |
swdev.dmz |
lab.local |
lab.na |
emea.sales |
cork.lab |
dev.local |
dmz.local |
pci.local |
saas.swi |
lab.rio |
lab.brno |
apac.lab |
- |
- |
[표 5] 악성코드에서 확인하는 도메인 네임
악성코드에서는 사용자의 PC에 설치된 보안 프로그램 확인을 위해 드라이브 파일과 서비스, 현재 실행중인 프로세스를 확인한다. 8개의 보안 제품을 확인하며 [표 6]의 서비스들이 동작중인 경우 레지스트리를 수정하여 [사용 안함] 상태로 변경한다.
확인하는 보안제품(8개) | |||
Windows Defender |
Windows Defender Advanced Threat Protection |
Microsoft Defender for Identity |
carbonblack |
CrowdStrike |
FireEye |
ESET |
f-secure |
[표 6] 악성코드에서 확인하는 보안 제품 종류
프로세스/서비스명(59개) | |||||
carbonblack |
csfalconservice |
epfw |
fe_avk |
fsdevcon |
fsni |
carbonblackk |
eamonm |
epfwwfp |
feelam |
fsdfw |
fsorsp |
cavp |
eelam |
f-secure filter |
fekern |
fses |
fsorspclient |
cb |
egui |
f-secure gatekeeper |
fewscservice |
fsfw |
fssm32 |
cbcomms |
eguiproxy |
f-secure gatekeeper handler starter |
fnrb32 |
fsgk32 |
fsvista |
cbstream |
ehdrv |
f-secure hips |
fsaua |
fsgk32st |
fswebuid |
csagent |
ekbdflt |
f-secure network request broker |
fsaus |
fsma |
microsoft.tri.sensor |
csdevicecontrol |
ekrn |
f-secure recognizer |
fsav32 |
fsma32 |
microsoft.tri.sensor.updater |
csfalconcontainer |
ekrnepfw |
f-secure webui daemon |
fsbts |
fsms |
msmpeng |
sense |
windefend |
mssense |
xagt |
xagtnotif |
|
[표 7] 악성코드에서 확인하는 프로세스/서비스 명
사용자의 PC에 악성코드 분석/포렌식 등에 사용되는 툴이 동작중인 지 확인한다. 이 때 확인하는 툴은 136개 이며 악성코드가 분석/탐지되는 것을 방지하기 위해 많은 노력을 들인 부분으로 보여진다. 확인하는 136개의 툴 중에는 악성코드 분석에 많이 사용되는 IDA, ollydbg, x32/64dbg, dnspy, peid, peview, tcpview, tcpdump, procmon 등 다양한 툴들이 확인되었다.
해당 악성코드에서는 최종 C2에 연결하기 위해 중간단계 서버를 거친다. 이 중간단계 서버는 avsvmcloud[.]com 도메인에 대한 권한이 있는 서버이며 해당 악성코드의 Update 메소드에서는 중간단계 서버와의 통신을 위해 DGA(Domain Generation Algorithms)를 이용하여 하위 도메인을 생성한다. 하위 도메인은 [표 8]의 규칙으로 생성된다. userId, domain2, domain3, domain1은 악성코드에서 사용된 변수명을 의미하며 [domain3]의 경우 4개의 값 중 하나가 랜덤으로 사용된다.
userId |
domain2 |
Domain3(랜덤 1) |
domain1 |
감염된 컴퓨터 정보 |
appsync-api |
•eu-west-1
•eu-west-2
•us-east-1
•us-east-2
|
avsvmcloud[.]com |
[표 8] C2 도메인 생성에 사용되는 값
[userId] 는 감염된 PC의 △ 물리주소, △ 도메인 네임, △ Hardware ID를 수집하여 생성된다. 악성코드 내부의 루틴을 이용하여 인코딩 되며 이 정보를 디코딩 하여 악성코드에 감염된 도메인을 특정할 수 있다.
※ 디코더 : https://github.com/RedDrip7/SunBurst_DGA_Decode/blob/main/decode.py
[그림 11] [userId] 값을 생성하는 함수 내부
중간단계 서버
FireEye 社에서는 C2 Coordinator Protocol, PREVASIO 社에서는 authoritative DNS server로 표현되며 본 보고서에서는 임의로 중간단계 서버라 명명하였다. |
A Record / CNAME Record
- SUNBURST에서는 인코딩된 DNS 요청을 전송하여 C&C서버와 통신한다. 전송된 요청에 따라 공격자는 A Record, CNAME Record 로 DNS응답을 보낼 수 있다. |
통신 시 중간단계 서버의 응답(A Record, CNAME Record)에 따라 이후의 행위가 달라진다. A Record로 응답 시 해당 IP가 [표9]에 포함되는지 확인한다. 확인 후 각각의 Address Family에 맞는 모드로 전환한다. 공개된 킬 스위치(Kill Switch)는 해당 악성코드의 IP가 Address Family Atm, ImpLink에 속한 경우 종료되는 행위를 이용한다.
순번 |
IP/Subnet Mask |
Address Family |
순번 |
IP/Subnet Mask |
Address Family |
1 |
10.0.0.0/255.0.0.0 |
Atm |
12 |
20.140.0.0/255.254.0.0 |
ImpLink |
2 |
172.16.0.0/255.240.0.0 |
13 |
96.31.172.0/255.255.255.0 | ||
3 |
192.168.0.0/255.255.0.0 |
14 |
131.228.12.0/255.255.252.0 | ||
4 |
224.0.0.0/240.0.0.0 |
15 |
144.86.226.0/255.255.255.0 | ||
5 |
fc00::/fe00:: |
16 |
8.18.144.0/255.255.254.0 |
NetBios | |
6 |
fec0::/ffc0:: |
17 |
18.130.0.0/255.255.0.0 | ||
7 |
ff00::/ff00:: |
18 |
71.152.53.0/255.255.255.0 | ||
8 |
41.84.159.0/255.255.255.0 |
Ipx
|
19 |
99.79.0.0/255.255.0.0 | |
9 |
74.114.24.0/255.255.248.0 |
20 |
87.238.80.0/255.255.248.0 | ||
10 |
154.118.140.0/255.255.255.0 |
21 |
199.201.117.0/255.255.255.0 | ||
11 |
217.163.7.0/255.255.255.0 |
22 |
184.72.0.0/255.254.0.0 |
중간단계 서버가 CNAME Record 로 응답 시 HTTP(S) 기반의 C2와 추가로 통신을 진행한다. HTTP(S) C2통신을 통해 받아온 명령코드 값을 이용하여 JobEngine 메소드 내부의 다양한 기능 사용한다.
Command | ||||
Idle |
Exit |
SetTime |
CollectSystem Description |
UploadSystem Description |
RunTask |
GetProcessBy Description |
KillTask |
GetFileSystem Entries |
WriteFile |
FileExists |
DeleteFile |
GetFileHash |
ReadRegistryValue |
SetRegistryValue |
DeleteRegistryValue |
GetRegistrySubKeyAndValueNames |
Reboot |
- |
- |
[표 10] JobEngine 메소드 내 명령어
05. MITRE ATT&CK
▶ MITRE ATT&CK for Enterprise(v8.1)
다양한 매체를 통해 솔라윈즈 공급망 공격사건과 SUNBURST에 대한 MITRE ATT&CK Techniques을 공개했다. 그 중 본 보고서에서 분석 된 부분만 따로 정리해보았다.
Enterprise tactics |
NAME (ID) |
Description |
Persistence |
Create or Modify System Process: Windows Service (T1543.003) |
•8개의
보안제품에 대한 서비스/프로세스를 검색 후 서비스 동작중이면 [동작
안함] 상태로 플래그 변경
|
Privilege Escalation |
Create or Modify System Process: Windows Service (T1543.003) |
•8개의
보안제품에 대한 서비스/프로세스를 검색 후 서비스 동작중이면 [동작
안함] 상태로 플래그 변경
|
Defense Evasion |
Obfuscated Files or Information (T1027) |
•악성코드 내부 문자열은 Deflate + base64로
압축/인코딩
•내부에서 사용되는 파일, 프로세스, 서비스등의 이름은 64bit FNV-1A 해시값에
XOR
연산값
사용
|
Subvert Trust Controls: Code Signing (T1553.002) |
•디지털 서명 존재
| |
Discovery |
Software Discovery (T1518) |
•현재 실행중인 분석툴이 있는지 검색(136개)
|
Software Discovery :Security Software Discovery (T1518.001) |
•8개의
보안 제품에 대한 서비스/프로세스를
검색(59개)
| |
Command and Control |
Application Layer Protocol: Web Protocols (T1071.001) |
•C2 통신을 통해 받아온 명령코드 값을 이용하여 추가행위
|
Application Layer Protocol: DNS (T1071.004) |
•A Record와 CNAME
으로
받아온 값을 이용하여 각기 다른 행위
| |
Dynamic Resolution: Domain Generation Algorithms (T1568.002) |
•DGA알고리즘을
이용하여 도메인을 생성
|
[표 11] MITER ATT&CK
06. 참고자료
[2]https://www.mcafee.com/blogs/other-blogs/mcafee-labs/additional-analysis-into-the-sunburst-backdoor/
[5]https://www.picussecurity.com/resource/blog/ttps-used-in-the-solarwinds-breach
[6]https://blog.prevasio.com/2020/12/dns-tunneling-in-solarwinds-supply.html
[8] https://securelist.com/sunburst-connecting-the-dots-in-the-dns-requests/99862/