2016년 4월 7일 목요일

[DRM 솔루션으로 유명한 S사 제품을 이용하는 악성코드/DarkHotel] 악성코드 분석 Part.2 / Malware Analysis Part.2

* 서론

2016년 2월 경, DRM 솔루션으로 유명한 S사의 제품을 변조하는 악성코드가 발견되었다.

악성코드의 유형은 APT 공격 악성코드이며, 제작한 곳은 "Rifle Campaign"으로 작년 이슈된 “검은 광산 작전”의 제작한 조직과 동일한 것으로 추정된다.

해당 악성코드로 인한 피해는 아직 확인 된 바가 없는 상태로 알려져있다.

2가지 종류의 샘플이 발견되었는데, 비슷한 기능을 하는 악성코드다.

* 샘플은 여러개의 파일을 Drop을 하게 되는데, 마지막 악성 서비스로 등록하는 DLL을 마무리 분석

* 환경

(1) WINDOWS 7
(2) IDA Pro, OllyDBG, ExeInfo PE, HxD, NotePad++ 등

* 분석

0. 들어가기 전

<그림 0. 악성코드 흐름>

<그림 1. Drop 된 "wsupdatemgr.dll" PE 정보>

* 해당 DLL은 서비스로 등록되어 동작하는 DLL이기 때문에, "ServiceMain" 기반으로 분석한다.

1. 서비스 시작

<그림 2. 서비스 시작하는 과정>

* 상당히 일반적인 서비스를 시작하는 과정

<그림 3. 서비스를 실행 후 Thread 생성하는 과정>

* 서비스를 실행하고 악성행위를 위한 Thread를 생성한다.

2. 파일경로 생성

<그림 4. 파일명 복호화 하는 과정>

* Encoding 된 문자열을 XOR을 통해 Decoding한다.
* 해당 XOR Decoding 알고리즘은 기존 DarkHotel에서 사용하는 XOR Decoding과 상당히 일치한다.

DWORD EncodeXOR(LPBYTE data, DWORD dwSize)
{
 DWORD dwResult, i = 0;

 DWORD XORKey1;
 BYTE XORKey2 = 0xA2, XORKey3 = 0xD1, XORKey4;

 XORKey1 = 0x2B39DBD1;
 for (dwResult = 0x5A793B21; i < dwSize; XORKey1 = (((XORKey1 ^ (8 * XORKey1)) & 0x7F8) << 20) | (XORKey1 >> 8))
 {
  data[i] ^= XORKey2 ^ dwResult ^ XORKey3;
  XORKey4 = XORKey3 & (XORKey2 ^ dwResult);
  XORKey3 = (((XORKey1 ^ (8 * XORKey1)) & 0x7F8) << 20) | (XORKey1 >> 8);
  XORKey2 = XORKey4 ^ dwResult & XORKey2;
  dwResult = (((dwResult << 7) ^ (dwResult ^ 16 * (dwResult ^ 2 * dwResult)) & 0xFFFFFF80) << 17) | (dwResult >> 8);
  i++;
 }

 return dwResult;
}

3. IP주소 생성 후 생성 된 IP주소로 연결

<그림 5. IP주소 Decoding 후 연결>

* Decoding 된 IP 주소로 단순하게 연결만 한다. (전혀 RECV, SEND 과정이 없다.)
* 성공적으로 연결 되면 추가적인 작업을 하게 된다.

4. IP주소 연결 성공 시,  "SDSDec.dll" 파일명 생성 후 해당 파일을 XOR Decoding

<그림 6. "SDSDec.dll" 파일을 XOR Decoding하여 "svchost.exe"로 저장하는 과정>

<그림 7. "SDSDec.dll" 및 "svchost.exe"를 "kernel32.dll"과 동일한 생성시간으로 설정하는 과정>

* "SDSDec.dll" 파일 내용을 XOR Decoding 후 "svchoste.exe"로 저장하기 되는데 생성시간은 "kernel32.dll" 로 설정하게 된다.
* "SDSDec.dll" 파일이 무엇인지 알 수 없어서 어떤 공격을 위한 것인지 확인 할 수 없다.
* "SDSDec.dll"을 EXE로 만든다는 것은 기존에 "SDSDec.dll"이 EXE였단 것으로 판단된다.

5. 저장 된 "svchost.exe" 실행

<그림 8. 저장 된 "svchost.exe" 실행하는 과정>

* 숨겨서 실행하게 된다.

6. 생성한 파일 제거, Log 파일명 생성 후 Log 확인

<그림 9. 시간 및 파일제거 후 Log 파일 확인하는 과정>


<그림 10. "setuperror.log" 생성 후 '#' 기반으로 자른 후 Log 확인>

<그림 11. 1시간 Sleep하는 과정>

* 위 과정을 1시간 간격으로 무한반복하게 된다.


* 결과

 악성 서비스 DLL도 핵심 악성행위를 하는 파일은 아닌 것 같다.

"SDSDec.dll"을 생성하는 또 다른 샘플이 필요한 것으로 파악된다.

기존 S사에서 제공하는 솔루션에는 "SDSDec.dll"이란 파일은 존재하지 않는다.

분석가 입장에서 추가적으로 시나리오를 가설하자면 다음과 같다.

총 3개의 샘플이 있어야 한다.

1번 샘플에서 Encoding 된 "SDSDec.dll" 생성
2번 샘플에서 Encoding 된 "SDSDec.dll" Decoding 하여 "svchost.exe" 생성 후 실행
(분석 내용)
3번 샘플에서 "SDSDec.dll" 및 "svchost.exe" 삭제

추가적으로 샘플 확보가 필요한 사항이다.

2016년 4월 6일 수요일

[DRM 솔루션으로 유명한 S사 제품을 이용하는 악성코드/DarkHotel] 악성코드 분석 Part.1 / Malware Analysis Part.1

* 서론

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" 정보>
* 악성 행위는 전혀 없는것으로 판단 되는 과거 버전의 "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 여는 과정>
* OpenFileMapping이 성공할 경우 BAT 명령어를 이용하여 자기소멸한다.
* 실패할 경우 파일을 생성하고 생성된 파일을 서비스로 등록한다.

 (4) "Window Service Manager", "wsupdatemgr", "RasMan" 문자열 만들기

<그림 17. 문자열 만드는 과정>
* 생성 된 문자열들은 레지스트리 Key로 활용된다.

 (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 추가로 분석하여 마무리 하도록 하겠다.
 

2016년 4월 5일 화요일

[많은 보안 솔루션을 보유한 I사를 겨냥한 악성코드/Dark Hotel] 악성코드 분석 Part.1 / Malware Analysis Part.1

* 서론

2016년 2월 경, 많은 보안 솔루션을 보유한 I사 내부로 침투한 악성코드이다.

해당 악성코드는 I사 내부에 있는 공인인증서를 탈취했다고 알려져있다.

악성코드 명칭은 RIFLE(가칭), 유형은 Backdoor이며, 제작한 곳은 "Rifle Campaign"으로 추정한다.

대략 6개 가량의 샘플이 발견되었다.

그 중 1개를 분석한다.

* 환경

(1) WINDOWS 7
(2) IDA Pro, OllyDBG, ExeInfo PE, HxD, NotePad++ 등


* 분석

0. 들어가기 전

<그림 0. 악성코드 과정>



<그림 1. 샘플 #1 PE 정보>

1. Socket 초기화


<그림 2. Socket을 사용하기 위해 WSA를 초기화 과정>

2. C&C 서버 연결

<그림 3. C&C 서버 연결 과정>

C&C 서버 IP/Port : 192[.]99[.]223[.]115[:]8080

3. 해상도 구하기


<그림 4. GetSystemMetrics API를 이용하여 해상도 구하기>


<그림 5. GetSystemMetrics API>
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724385(v=vs.85).aspx


4. SID 검색하여 현재 로그인 된 WINDOWS 계정 권한 확인


<그림 5. SID 검색하여 계정권한 찾는 과정>


<그림 6. GetTokenInformation API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa446671(v=vs.85).aspx

<그림 7. AllocateAndInitializeSid API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa375213(v=vs.85).aspx

5. PC의 Processor 이름 구하기

<그림 8. 레지스트리를 통해 Processor 이름 얻어오는 과정>

6. WINDOWS 로그인 된 사용자명 얻어오기

<그림 9. GetUserName API를 이용하여 사용자명 얻어오는 과정>

<그림 10. GetUserName API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms724432(v=vs.85).aspx

7. IP 주소와 현재 Hostname 얻어오기

<그림 11. IP Address와 Hostname 얻어오는 과정>


<그림 12. gethostname API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms738527(v=vs.85).aspx

<그림 13. gethostbyname API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms738524(v=vs.85).aspx

<그림 14. inet_ntoa API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms738564(v=vs.85).aspx

8. WINDOWS Version 구하기

<그림 15. 시스템 버전 얻어오는 과정>


<그림 16. GetNativeSystemInfo API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms724340(v=vs.85).aspx

<그림 17. GetSystemInfo API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms724381(v=vs.85).aspx

<그림 18. 레지스트리 내 WINDOWS Version 명 얻어오는 과정>

9. 메모리 크기 얻어오기

<그림 19. GlobalMemoryStatus를 이용하여 메모리 크기 얻어오는 과정>


<그림 20. GlobalMemoryStatus API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa366586(v=vs.85).aspx

10. 얻어온 시스템 정보를 C&C 서버로 전송


<그림 21. sprintf를 통해 시스템정보를 하나의 Buffer로 모으는 과정>



<그림 22. 시스템정보를 ZLIB로 Compress 후 XOR로 Encoding>

* ZLIB의 버전은 1.1.4

<그림 23. ZLIB의 compress API>
http://www.zlib.net/manual.html

DWORD EncodeXOR(LPBYTE data, DWORD dwSize)
{
 DWORD dwResult, i = 0;

 DWORD XORKey1;
 BYTE XORKey2 = 0x27, XORKey3 = 0x13, XORKey4;

 XORKey1 = 0x7A188913;
 for (dwResult = 0xF4460304; i < dwSize; XORKey1 = (((XORKey1 ^ (8 * XORKey1)) & 0x7F8) << 20) | (XORKey1 >> 8))
 {
  data[i] ^= XORKey2 ^ dwResult ^ XORKey3;
  XORKey4 = XORKey3 & (XORKey2 ^ dwResult);
  XORKey3 = (((XORKey1 ^ (8 * XORKey1)) & 0x7F8) << 20) | (XORKey1 >> 8);
  XORKey2 = XORKey4 ^ dwResult & XORKey2;
  dwResult = (((dwResult << 7) ^ (dwResult ^ 16 * (dwResult ^ 2 * dwResult)) & 0xFFFFFF80) << 17) | (dwResult >> 8);
  i++;
 }

 return dwResult;
}

LPBYTE CompressData(LPBYTE lpData, DWORD dwSize, DWORD EncodeSize)
{
 int nRet;
 LPBYTE lpResult;

 lpResult = (LPBYTE)malloc(sizeof(BYTE) * dwSize);
 if (lpResult)
 {
  memcpy(lpResult, lpData, dwSize);
  nRet = compress((Bytef *)lpData, (uLongf *)&EncodeSize, (Bytef *)lpResult, (uLong)dwSize);

  if (nRet)
  {
   lpResult = NULL;
  }
  else
  {
   lpResult = (LPBYTE)EncodeSize;
   EncodeXOR(lpData, EncodeSize);
  }
 }

 return lpResult;
}

11. Compress 과정 이후 사이즈와 데이터를 결합하여 C&C 서버로 전송


<그림 24. C&C서버로 데이터 전송>

12. C&C 서버로 부터 명령 전달받기

<그림 25. C&C 서버로 부터 Command를 Loop 돌며 계속 받아오는 과정>

<그림 26. C&C 서버로 받은 데이터를 Uncompress 처리하여 가져오는 과정>

<그림 27. Uncompress 과정>

* XOR은 Encoding 했던 값으로 다시 Encoding을 하게 되면 Decoding이 된다. (상식!)
* ZLIB로 Compress 했기 때문에 Uncompress 해야 한다.

13. 프로토콜 목록


<그림 28. 프로토콜 목록>

14-1. 실행중인 프로세스 목록 가져오기 (2002)


<그림 29. 실행 중인 프로세스 목록 가져오는 과정>


<그림 30. CreateToolhelp32Snapshot API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms682489(v=vs.85).aspx

<그림 31. Process32Next API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms684836(v=vs.85).aspx

<그림 32. EnumProcessModules API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms682631(v=vs.85).aspx

<그림 33. GetModuleFileName API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms683197(v=vs.85).aspx

14-2. 프로세스명 기반으로 특정 프로세스 강제종료 (2003)

<그림 34. 프로세스 명 기반으로 특정 프로세스 강제종료 과정>

<그림 35. OpenProcess API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms684320(v=vs.85).aspx

<그림 36. TerminateProcess API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms686714(v=vs.85).aspx

14-3. 사용자가 보고 있는 프로세스의 WINDOW명 얻어오기 (2004)

<그림 37. 최상위 WINDOW를 가져와 WINDOW 명을 가져오는 과정>
 
<그림 38. 다음 WINDOW를 가져와 WINDOW명 가져오는 과정>
 
<그림 39. 현재 찾은 WINDOW가 화면에서 활성화가 되고 있는 확인 하는 과정>


<그림 40. GetForegroundWindow API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms633505(v=vs.85).aspx

<그림 41. GetWindowText API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms633520(v=vs.85).aspx


<그림 42. IsWindowVisible API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms633530(v=vs.85).aspx

* 현재 실행되고 있는 모든 WINDOW 탐색

14-4. WINDOW명 기반으로 특정 프로세스 강제종료 (2007)


<그림 43. WINDOW명 기반으로 특정 프로세스 강제종료하는 과정>

<그림 44. SendMessage API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms644950(v=vs.85).aspx
<그림 45. WM_CLOSE Message>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms632617(v=vs.85).aspx

* SendMessage로 WM_CLOSE를 전송하여 프로세스 강제종료

14-5. 전체 시스템 드라이브 유형 검색 (2010)


<그림 46. 전체 시스템 드라이브 유형 검색하는 과정>

<그림 47. GetDriveType API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa364939(v=vs.85).aspx

* A~Z 드라이브까지 전체 검색하여 유형을 C&C 서버로 전달

14-6. 드라이브 내 파일 검색 (2012)

<그림 48. 파일 찾기 위해 초기화>


<그림 49. 드라이브 내 파일 검색하는 과정>


<그림 50. FindFirstFile API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa364418(v=vs.85).aspx

<그림 51. FindFirstFile API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa364418(v=vs.85).aspx
<그림 52. FindNextFile API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa364428(v=vs.85).aspx

* 폴더 내 스캔하는 전형적인 알고리즘

14-7. 특정 경로로 파일 복사 (2014)

<그림 53. CopyFile를 이용한 특정 경로로 파일 복사하는 과정>

<그림 54. CopyFile API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa363851(v=vs.85).aspx

14-8. 특정 파일 삭제 (2016)



<그림 55. DeleteFile를 이용한 특정 파일 삭제 과정>

<그림 56. DeleteFile API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa363915(v=vs.85).aspx

14-9. 특정 경로로 파일 이동 (2018)

<그림 57. MoveFile를 이용한 특정 경로로 특정 파일 이동하는 과정>

<그림 58. MoveFile API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa365239(v=vs.85).aspx

14-10. 특정 파일명으로 특정 내용 쓰기 (2020)

<그림 59. fwrite로 파일 쓰기>

<그림 60. fwrite API>
https://msdn.microsoft.com/ko-kr/library/h9t88zwz.aspx

14-11. C&C 서버로 특정 파일 보내기 (2022)

<그림 61. C&C로 파일 보내기 위한 과정>


<그림 62. fopen API>
https://msdn.microsoft.com/ko-kr/library/yeby3zcb.aspx

<그림 63. fseek API>
https://msdn.microsoft.com/ko-kr/library/75yw9bf3.aspx

<그림 64. fread API>
https://msdn.microsoft.com/ko-kr/library/kt0etdcs.aspx

* fopen으로 파일 읽어서 fseek를 통해 파일 총 크기를 구하고 fread를 통해 데이터를 읽어 C&C 서버로 전송

14-12. 시스템 드라이브 폴더 검색 (2024)

<그림 65. 시스템 드라이브 폴더 검색 과정>

* 2012 프로토콜과 비슷한 것으로 판단

14-13. 특정 프로세스 실행 (2026)

<그림 66. 특정 프로세스 실행하는 과정>

<그림 67. ShellExecute API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/bb762153(v=vs.85).aspx

 

* Index에 따라 숨겨서 실행(SW_HIDE)하거나 일반 실행(SW_SHOW)하게 된다.

14-14. 현재 WINDOWS 화면을 0.1초마다 C&C 서버로 전송 (2050)

<그림 68. 스크린 캡쳐를 위한 초기화하는 과정>


<그림 69. 캡쳐 대상을 Desktop으로 지정하는 과정>
<그림 70. 대상을 캡쳐하는 과정 #1>



<그림 71. 대상을 캡쳐하는 과정 #2>
 
<그림 72. GetClientRect API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms633503(v=vs.85).aspx

<그림 73. CreateCompatibleDC API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd183489(v=vs.85).aspx

<그림 74. GetDC API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd144871(v=vs.85).aspx

<그림 75. CreateCompatibleBitmap API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd183488(v=vs.85).aspx

<그림 76. GetDIBits API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd144879(v=vs.85).aspx

<그림 77. CreateDIBSection API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd183494(v=vs.85).aspx


<그림 78. SelectObject API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd162957(v=vs.85).aspx

<그림 79. Bitblt API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd183370(v=vs.85).aspx

* 상당히 복잡해보이지만, C++ 내 그래픽 처리하는 과정은 보통 이정도 과정이 된다.
* 구글 검색하면 위 수준의 알고리즘은 금방 발견할 수 있다.

14-15. 특정 서비스 시작 (2081)

<그림 80. 특정 서비스 시작하는 과정>

<그림 81. OpenSCManager API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms684323(v=vs.85).aspx

<그림 82. OpenService API>
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684330(v=vs.85).aspx

<그림 83. StartService API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms686321(v=vs.85).aspx

14-16. 특정 서비스 정지 (2082)


<그림 84. 특정 서비스 정지 하는 과정>

<그림 85. QueryServiceStatusEx API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms684941(v=vs.85).aspx

<그림 86. ControlService API>
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682108(v=vs.85).aspx


* ControlService를 통해 SERVICE_CONTROL_STOP 명령을 보내 서비스를 중지시킨다.

14-17. 시스템에 설치된 프로그램과 설치경로 얻어오기 (3010)

<그림 87. 레지스트리를 통해 시스템에 설치된 프로그램과 설치경로 얻어오는 과정>
* "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" 레지스트리 경로에는 시스템에 설치 된 프로그램과 설치경로가 존재한다.

14-18. CMD.EXE 파이프 생성 및 명령어 받기 (4001)


<그림 88. CMD.EXE를 파이프로 생성하는 과정>


<그림 89. 파이프 통신하는 과정>


<그림 90. CreatePipe API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa365152(v=vs.85).aspx

<그림 91. CreateProcess API>
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx


<그림 92. PeekNamedPipe API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa365779(v=vs.85).aspx

<그림 93. ReadFile API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa365467(v=vs.85).aspx

 * C&C에서 내린 명령어를 수월하게 처리하기 위해 PIPE를 열어둔 것으로 파악된다.

14-19. 파이프로 수행한 명령어 결과 보내기 (4002)


<그림 94. 파이프로 수행한 결과 보내는 과정>


<그림 95. WriteFile API>
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa365747(v=vs.85).aspx

* 결론

해당 악성코드는 Backdoor를 목적으로 둔 악성코드이다.

I사는  인증서를 탈취당했다고 전해진다.

악성코드의 기능을 보아하면 인증서 외 다른 것도 탈취 및 공격 당했을 가능성이 충분히 농후해 보인다.
© NoFaceLab
Maira Gall