Notepad++ 공식 패키지 파일로 위장한 악성코드 주의

안랩 분석팀이 최근 Notepad++의 기본 플러그인(Plugin)인 “mimeTools.dll”가 변조돼 악성코드가 유포된 정황을 확인했다. 해당 악성 mimeTools.dll 파일은 특정 버전의 Notepad++ 패키지 설치 파일에 포함돼 정상 패키지 파일로 위장했다. 따라서 사용자가 Notepad++를 실행하기만 해도 악성코드가 설치된다. 해당 악성코드의 유포 과정을 자세히 알아보자.

 

 

mimeTools는 [그림 1]과 같이 베이스64(Base64)등의 인코딩 기능을 수행하는 모듈이며, 사용자가 별도로 추가하지 않아도 기본적으로 포함돼 있다.

 

mimeTools.dll은 Notepad++의 기본 플러그인이기 때문에, notepad++을 실행시키면 자동으로 로드된다. 공격자는 이 점을 악용했으며, 일종의 DLL 하이재킹(Hijacking) 기법을 사용한 것으로 확인된다. 즉, 사용자가 notepad++.exe를 실행하면 mimeTools.dll이 자동으로 로드돼 악성코드가 동작한다.

 

[그림 1] Notepad++의 플러그인 mimeTools

 

공격자는 mimeTools.dll에 암호화된 악성 셸코드(Shell Code)와 이를 복호화 및 실행하는 코드를 추가했다. [그림 2]는 정상적인 Notepad++의 패키지와 악성 패키지 내부에 포함된 파일들을 비교한 이미지다. 이 중 certificate.pem 파일이 악성 셸 코드를 포함한 파일이다.

 

[그림 2] 공식 패키지와 악성 패키지 내부 파일 비교

 

악성 패키지에도 mimeTools.dll에서 제공하는 기능(Export)들은 그대로 구현돼 있으며, [그림3]과 같이DllEntryPoint만 공식 패키지와 코드가 다르다.

 

[그림 3] 정상 mimeTools.dll과 악성 mimeTools.dll의 EntryPoint 비교

 

해당 악성코드의 실행 흐름은 [그림 4]와 같다.

 

악성 행위는 사용자가 notepad++을 실행할 때 동시에 mimeTools.dll이 로드되면서 시작된다.
mimeTools.dll에서 certificate.pem파일을 셸코드로 복호화해 실행한다.
이후 BingMaps.dll->GetBingMapsFactory()함수 내부 코드를 악성 셸코드로 덮어 씌운다.
덮어 씌워진 셸코드는 다시 explorer.exe에 Thread Injection을 수행한다.
최종적으로는 C2서버에서 추가 셸코드를 다운로드해 실행한다.

 


[그림 4] 악성코드 흐름 도식

 

0. Indirect Syscall

해당 악성코드는 실행 시점에서 다수의 Indirect Syscall 기법을 사용하는데, 이는 안티바이러스 제품을 우회하기 위함이다.

 

[그림 5] Indirect Syscall

 

위 그림과 같이 jmp문을 이용해 syscall로 분기하는데, jmp문은 정확하게 syscall 부분을 가리키고 있으며, 해당 syscall을 호출하기 위해 필요한 인자 값을 직접 세팅한다. 이 방식으로 ntdll을 후킹해 Native API를 모니터링하는 안티바이러스 제품을 우회한다.

 

복호화 된 셸 코드는 최초 실행된 notepad++ 프로세스 영역에 생성된다. 해당 영역에는 약 10분가량의 시간 지연 로직이 존재하는데, RCX 값을 수정해 간단히 우회할 수 있다.

 

[그림 6] certificate.pem 파일 복호화 과정

 

[그림 7] 복호화 된 셸코드

 

certificate.pem 파일에 있는 바이너리(Binary)는 Crypt32.dll, BCrypt.dll 두 가지 모듈을 사용해 셸코드로 바뀐다.

 

 

1. Base64 Decoding
2. AES Decrypt (key: wqviIfew62w0zgP97yw9G2nqlHFKkggQ)

 

[그림 8] 셸코드로 실행 흐름 전환

 

이후 셸코드가 생성된 영역에 실행 권한을 부여하고, jmp문을 통해 실행 흐름이 전환된다.

 

1. BingMaps.dll 변조

BingMaps.dll의 EntryPoint를 변조하고, Export 함수인 GetBingMapsFactory()의 내부 코드를 셸코드로 덮어 씌운다.

 

[그림 9] BingMaps.dll->EntryPoint 변조

 

[그림 10] BingMaps.dll->GetBingMapsFactory() 변조

 

이후 아래와 같은 순서로 BingMaps.dll->GetBingMapsFactory()로 실행 흐름이 전환된다.

 

1. NtCreateThreadEx()
2. NtGetContextThread()
3. NtSetContextThread() : Set RIP
4. ResumeThread()

스레드(Thread) 생성 이후 NtGetContextThread()를 이용해 해당 Thread의 레지스터 값을 가져오며, RIP 레지스터를 GetBingMapsFactory(셸코드로 덮어씌운 영역)로 세팅한다.

 

[그림 11] 변조된 GetBingMapsFactory()를 RIP로 세팅

 

2. 변조된 GetBingMapsFactory()

BingMaps.dll의 GetBingMapsFactory()함수는 이전 과정에서 셸코드로 덮어씌워졌다. 새로운 스레드로 시작된 해당 함수에서는 VM 등의 분석 환경을 인식해 프로세스를 종료하는 과정이 존재하며, explorer.exe에 스레드를 삽입하는 역할을 수행한다.

 

[그림 12] 프로세스 이름에 기반한 해시(Hash) 매치

 

해당 코드는 런타임에 실행 중인 모든 프로세스의 이름을 대상으로, 한 글자씩 SHIFT, XOR 연산해 간단한 해시값을 생성한다. 생성된 해시값은 특정 프로세스의 존재 여부를 확인하는 데 사용되고, 해시가 일치할 경우 추가 악성 행위를 수행하지 않고 종료한다. 종료 대상이 되는 프로세스 이름 중 확인된 목록은 아래와 같다.

 

VGAuthService.exe
vmtoolsd.exe
ProcessHacker.exe
x64dbg.exe
PE-bear.exe
CFF Explorer.exe
Autoruns.exe
procexp.exe
procexp64.exe
Procmon.exe
Procmon64.exe
tcpview.exe
Dbgview.exe
portmon.exe

“explorer.exe” 프로세스를 만나면 이후 악성 행위에 필요한 정보(PID)를 추가로 수집해 보관한다. 보관된 explorer의 PID는 이후 explorer.exe에 추가 셸코드를 생성할 때 사용되며, 순서는 아래와 같다.

 

1. NtAllocateVirtualMemory() : explorer.exe 내부에 공간을 할당
2. NtWriteVirtualMemory() : 해당 공간에 ShellCode를 삽입
3. NtCreateThreadEx() : 삽입된 ShellCode를 Thread로 실행

이후부터는 explorer.exe의 메모리 공간에서 악성코드가 실행된다.

 

[그림 13] explorer.exe 영역에 삽입된 셸코드

 

3. Explorer.exe (Injected)

여기서부터 본격적으로 악성 행위가 시작된다. 공격자는 C2에 접속해 추가 셸코드를 다운로드해 실행한다.

 

[그림 14] Rebuild 하기 전 C2 문자열

 

C2와 통신하는 과정에서 사용되는 문자열은 특정한 함수를 거치면서 URL로 바뀐다. C2 URL 문자열은홀수 번째의 문자만 이어 붙이는 매우 간단한 과정을 통해 획득할 수 있다.

 

[그림 15] 시스템 정보를 Request Header에 추가

 

C2에 Get Request를 보내기 전 Header에 추가되는 내용으로, 사용자 PC에서 수집한 정보들이 베이스64로 인코딩돼 공격자에게 전달된다. 이 때 수집되는 정보는 아래와 같다.

 

Computer Name
User Name
Whether the current user is a member of the Administrator’s group
Language
System Time

 

[그림 16] response에서 셸코드 추출

 

C2 통신 이후 response에서 특정한 문자열(“on><!–gmail “)의 offset을 찾는 과정이 추가로 확인됐다.해당 Offset에서 추가 셸코드를 복호화해 해당 셸코드로 jmp한다. 현재 C2 URL에 접속할 수는 있으나, 해당 Offset에 추가 셸코드는 비어 있는 상태다.

 

[그림 17] C2의 외형과 내부 코드

 

해당 C2는 분석 시점에 워드프레스(WordPress) 로그인 페이지로 확인됐다. 해당 악성코드가 최초로 유포될 당시에는 C2의 외형이 Wiki 사이트로 확인돼 “위키로더(WikiLoader)”라는 이름이 붙었다.

 

이번 글에서는 다양한 언어 지원, 강력한 플러그인(plugin) 기능 등으로 유저들에게 많은 사랑을 받고 있는 Notepad++에 악성코드가 삽입된 사례를 살펴봤다. 이처럼 소프트웨어를 공식 배포 사이트에서 다운로드하는 습관은 매우 중요하며, 크랙 버전이나 기타 출처를 알 수 없는 소프트웨어를 사용할 때 각별히 주의해야 한다.

 

 

​출처 : AhnLab

02-553-2331
견적 요청
카카오톡 문의