2016년 2월 경, DRM 솔루션으로 유명한 S사의 제품을 변조하는 악성코드가 발견되었다.
악성코드의 유형은 APT 공격 악성코드이며, 제작한 곳은 "Rifle Campaign"으로 작년 이슈된 “검은 광산 작전”의 제작한 조직과 동일한 것으로 추정된다.
해당 악성코드로 인한 피해는 아직 확인 된 바가 없는 상태로 알려져있다.
2가지 종류의 샘플이 발견되었는데, 비슷한 기능을 하는 악성코드다.
* 환경
(1) WINDOWS 7
(2) IDA Pro, OllyDBG, ExeInfo PE, HxD, NotePad++ 등
* 분석
0. 들어가기 전
![]() |
<그림 0. 악성코드 흐름> |
![]() |
<그림 1. 샘플 PE 정보> |
1. "SDSLogin.exe" 파일 덮기
![]() |
<그림 2. "SDSLogin.exe" 파일 덮는 과정> |
* "c:\windows\s[oftcamp]\sds\SDSLogin.exe"를 "Write+Binary" 형태로 불러와 0x40CEC0 주소에 있는 데이터를 0x96350(615,248)만큼 덮는다.
![]() |
<그림 3. 0x40CEC0 주소에 존재 하는 PE 파일> |
2. 덮은 "SDSLogin.exe" 파일의 생성시간 변경
![]() |
<그림 4. 파일 생성시간 읽어와 변경하는 과정> |
* 변경하지 않았던 "SDSMan.exe"의 시간을 읽어와 변경했던 "SDSLogin.exe"의 시간을 동일하게 변경한다.
3. "SDSLogin.exe" 실행
![]() |
<그림 5. 덮은 "SDSLogin.exe" 실행하는 과정> |
![]() |
<그림 6. SHELLEXECUTEINFO Structure> https://msdn.microsoft.com/ko-kr/library/windows/desktop/bb759784(v=vs.85).aspx |
![]() |
<그림 7. nShow 정보> |
* 덮은 "SDSLogin.exe" 파일을 "/START" 인자를 주어 실행한다.
4. "SDSInst.exe" 파일 덮기
![]() |
<그림 8. "SDSInst.exe" 파일 덮는 과정> |
* "c:\windows\temp\SDSInst.exe"를 "Write+Binary" 형태로 불러와 0x4A3210 주소에 있는 데이터를 0x28A00(166,400)만큼 덮는다.
5. "SDSInst.exe" 실행
![]() |
<그림 9. "SDSInst.exe" 파일 실행하는 과정> |
![]() |
<그림 10. nShow 정보> |
* 덮은 "SDSInst.exe"를 보이지 않게 실행한다.
6. 최대 문제점
* 위 과정은 일반적인 파일 덮고 실행하는 과정이지만, 덮어지는 파일은 폴더 보호기능으로 관리되고 있는 파일이지만 우회하여 강제로 파일을 덮은 것이다.
7-1. Drop 된 파일 1. SDSLogin.exe
![]() |
<그림 11. Drop 된 "SDSLogin.exe" PE 정보> |
![]() |
<그림 12. 덮혀진 "SDSLogin.exe" 정보> |
* 덮혀진 버전에 존재할 것으로 예상 되는 특정한 취약점을 이용할 목적으로 보여진다.
7-2. Drop 된 파일 2. SDSInst.exe
![]() |
<그림 13. Drop 된 "SDSInst.exe" PE 정보> |
(1) GetProcAddress API 이용하여 사용 할 함수 가져오기
![]() |
<그림 14. 사용할 함수 가져오는 과정> |
* 가져오는 함수는 다음과 같다.
* kernel32.dll
- VirtualAllocEx
- WriteProcessMemory
- ExitProcess
- CreateFileA
- CloseHandle
- GetSystemDirectoryA
- SetFileTime
- GetFileTime
- GetTempPathA
- WriteFile
- GetModuleFileNameA
* Advapi32.dll
- RegOpenKeyExA
- RegQueryInfoKeyA
- RegEnumKeyExA
- RegEnumValueA
- RegQueryValueExA
- RegSetValueExA
- RegCreateKeyExA
- RegCloseKey
- CreateServiceA
- OpenSCManagerA
- OpenServiceA
- CloseServiceHandle
- StartServiceA
- QueryServiceStatusEx
- ChangeServiceConfig2A
(2) GetModuleFileName API 이용하여 파일경로 가져온 후 BAT 명령어 완성
![]() |
<그림 15. BAT 명령어 완성하는 과정> |
* 완성 된 BAT 명령어
@echo off
:start
if not exist "SDSInst.exe" goto done
del "SDSInst.exe"
del /AH "SDSInst.exe"
goto start
:done
del %0
(3) OpenFileMapping API로 FileMapping 확인
![]() |
<그림 16. FileMapping 여는 과정> |
* 실패할 경우 파일을 생성하고 생성된 파일을 서비스로 등록한다.
(4) "Window Service Manager", "wsupdatemgr", "RasMan" 문자열 만들기
![]() |
<그림 17. 문자열 만드는 과정> |
(5) 특정 서비스에 대한 "ServiceDll" 데이터 가져오기
![]() |
<그림 18. ServiceDll 가져오는 과정> |
* "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan" 내 있는 ServiceDll 경로를 가져온다.
* 해당 서비스는 "원격 액세스 관리자" 서비스
* ServiceDll은 실제 서비스가 동작하는 DLL
(6) 복사 경로 만들기
![]() |
<그림 19. 복사할 Source, Destination 경로를 생성하는 과정> |
* 복사 될 대상은 ServiceDll에서 얻어온 경로
* 복사 할 대상은 "%SystemRoot%\System32\wsupdatemgr.dll"
(7) 악성 서비스 생성
![]() |
<그림 20. 악성 서비스 등록 과정> |
* 악성 서비스명 : wsupdatemgr
* 악성 서비스 표시명 : Windows Service Manager
* 악성 서비스 실행경로 : %SystemRoot%\System32\svchost.exe -k netsvcs (DLL)
(8) 악성 서비스로 실행 될 DLL 설정
![]() |
<그림 21. 악성 서비스로 실행 될 DLL 설정 과정> |
* 악성 서비스 DLL 경로 : %SystemRoot%\System32\wsupdatemgr.dll
(9) 악성 서비스 Svchost 명령어로 등록
![]() |
<그림 22. 레지스트리를 이용하여 악성 서비스 Svchost 명령어로 등록하는 과정> |
* 등록 명령어 : wsupdatemgr
(10) 악성 서비스로 실행 될 DLL 생성 및 Kernel32.dll과 생성 시간 동일하게 설정
![]() |
<그림 23. 악성 서비스로 실행 될 DLL 생성 과정> |
* 생성 경로 : C:\Windows\system32\wsupdatemgr.dll
![]() |
<그림 24. Kernel32.dll과 생성시간 동일하게 하는 과정> |
(11) 악성 서비스 실행
![]() |
<그림 25. 악성 서비스 실행 과정> |
* 악성서비스 생성 함수와 동일한 함수
(12) 임시폴더에 BAT 생성 후 실행 (자가소멸)
![]() |
<그림 26. 임시폴더에 BAT 파일명 생성 과정> |
* BAT 파일명 : [임시폴더]\ud.bat
![]() |
<그림 27. BAT파일 생성 과정> |
* 프로그램 초기 때 완성 한 BAT 명령어를 내용으로 삽입
* 숨김 상태에서 실행
* BAT의 내용은 자가소멸
* 결론
악성 서비스로 등록 되는 DLL이 핵심 악성행위를 하는 악성코드로 판단 된다.
이 글에서 분석 된 것들은 전부 Dropper로 악성코드를 설치 위한 프로그램들이다.
악성 서비스 DLL 추가로 분석하여 마무리 하도록 하겠다.
댓글 없음
댓글 쓰기