리버스 엔지니어링/악성코드 분석

Smoke Loader 상세분석

뿔맨 2019. 5. 8. 22:00
반응형

 

개요

최근 비너스락커 조직이 문서파일 내에 은닉하여 악성코드를 유포 하고있다.

문서파일 열람 시 상단의 "콘텐츠 사용" 버튼을 클릭하면 문서파일 내 매크로가 실행되며 특정 C2와 연결하여 바이너리 파일 다운로드 후 실행되며, 해당 악성코드는 explorer.exe 에 Code Injection을 하여 약 5개의 플러그인 들을 실행시키며 자세한 사항은 하단에서 확인이 가능하다.

 

해당 보고서에서는 바이너리 파일만 분석을 진행하며 해당 바이너리 파일은 현재 상세분석 관련된 보고서가 공개되어 있지 않기에 상세분석을 하게 되었다.

문서파일 매크로 분석은 - https://monster-bbulman.tistory.com/12?category=670587

 

x64dbg를 활용한 doc 난독화 스크립트 분석

본 작성자는 초급 분석가이며, 피드백 환영합니다. 이번 작성할 글은 x64dbg를 사용해서 doc 매크로 분석하는 글 입니다. 목차 - 개요 - 분석 - 마치며 개요 올해 doc 매크로 악성코드가 많이 유포 되었다. ms off..

monster-bbulman.tistory.com

위 url에서 확인이 가능하다.

 

국내 및 해외 보안업체에서는 SmokeLoader 라고 불리고 있다.

해당 샘플은 분석가들이 분석하기 어렵게 하기 위해서 가상화를 사용하였으며,

특정 루틴을 사용해서 다음 실행할 코드를 복호화 시킨다. 아래 명령어는 복호화 루틴이다.

LODS BYTE PTR DS:[ESI]
XOR AL, DL
STOS BYTE PTR ES:[EDI]
LOOPD SHORT 401237

 

악성코드 개요

해당 악성코드에서 사용하는 Code Injection 방식은 일반적인 Code Injection 이 아님을 확인 하였으며, 2017년 헥사콘에서 발표하였다.

' PROPagate – a new code injection trick ' 라고 게시글을 작성하였다.

SetProp 함수를 사용하여 explorer의 UxSubclassInfo 의 Value를 쉘코드의 시작점으로 변경하며,

SendMessage, SendNotifyMessage 함수를 사용하여 특정 메시지를 보내서 서브클래스 재가동하여 쉘코드가 실행하게 된다.

 

해당 악성코드에서는 WM_PAINT를 보내어 악성코드가 실행하게 된다.

WM_PAINT 관련된 설명을 본문 중간에 기재가 되어있으며, 자세한 설명은 하단에 참고 자료에서 확인이 가능하다.

 

분석에 사용된 툴은 다음과 같다.

 

코드분석 -1

Figure 1: 동작방식 -1

간략하게 도식화 하였으며, 악성코드를 실행 시 가상환경을 탐지하며 탐지될 시 강제종료 또는 Exception을 발생한다.

정상행위로는 explorer.exe 프로세스에 코드인젝션을 수행한다.

 

아래 그림은 Anti-VM 및 비교문자열 이다.

 

Figure 2: Anti-VM

가상머신의 경우 연결된 HDD의 Vendor가 해당 가상머신 이름과 관련된 값으로 저장되므로 가상환경을 탐지하기 위해 레지스트리에 존재하는 HDD연결 정보와 관련된 키를 조회한다.

- HKLM\System\CurrentControlSet\Services\Disk\Enum

- HKLM\System\CurrentControlSet\Enum\SCSI

- HKLMSystem\CurrentControlSet\Enum\IDE

레지스트리 키 또는 데이터 값을 열거한다.

- SCSI\Disk&Ven_VMware_&Prod_VMware_Virtual_S\5&22be343f&0&000000

- CdRomHL-DT-ST_DVD-ROM_GDR-T10N_______________1.05____

- CdRomNECVMWar_VMware_SATA_CD01_______________1.00____

- disk&ven_dell&prod_virtual_disk

- Disk&Ven_VMware_&Prod_VMware_Virtual_S

 

레지스트리 키 또는 데이터 값을 열거하여 가상머신과 관련된 특정 문자열이 존재할 경우 실행을종료한다.

 

Figure 3: Anti-VM Routine

RegOpenKeyExA 함수를 사용하여 레지스트리 키 값을 조회하며 strstr 함수를 사용하여 가상머신 관련된 문자열들과 비교를하며 같을시 종료하는 함수로 이동하게 된다.

 

아래 그림[동작방식 -2]은 상세하게 도식화한 악성코드 동작방식이다.

 

Figure 4: 동작방식 -2

  1. 악성코드가 가지고 있던 압축된 코드들을 메모리 영역을 할당하여 압축을 해제한다. 해제된 코드들은 추후 인젝션할 코드로 사용된다.

  2. 해당 악성코드는 (1)에 생성된 코드들을 explorer.exe에 인젝션 하기 위해서 아래와 같은 API들을 사용한다.
     - GetWindowThreadProcessID
     - ZwOpenProcess
     - ZwCreateSection
     - ZwMapViewOfSection

위 함수들을 사용하여 explorer.exe의 PID를 불러온 후 해당 프로세스에 코드인젝션을 수행하며,

explorer.exe에 아래와 같은 명령어로 코드들을 복사한다.

 

Figure 5: 메모리 복사

단, explorer.exe에 인젝션된 코드들은 직접적으로 실행이 되지 않기 때문에 해당 코드들을 실행시킬 쉘코드를 추가적으로 인젝션 한다.

 

아래는 jackripper.exe의 코드와 explorer.exe에 인젝션된 코드이다.

 

(상): jackripper.exe (하): explorer.exe

    3. 악성코드가 가지고 있던 코드들을 각각의 영역에 메모리를 할당하여 코드를 복사 후 복호화를 한다. 복호화 한 코드는 아래 사진과 같다.

 

해당 코드들은 Malicious Code를 실행시키기 위해 사용되는 코드들이며 explorer.exe의 서브클래스에 코드인젝션 하는 것으로 확인된다.

 

(상): jackripper.exe (하): explorer.exe

또한 쉘코드를 실행시키기 위해서 특정 함수들을 사용하여 쉘코드가 실행될 수 있게끔 SubClass의 벨류를 변조한다. 

아래 사진[서브클래스 변조]은 쉘코드 설정과 쉘코드를 실행시키기 위한 함수들이다.

 

Figure 6: 서브클래스 변조

SetPropA 함수를 사용하여 UxSubclassInfo Value를 변조하며 SendMessageA와 SendNotifyMessageA 함수를 사용하여 쉘코드를 실행시키는 것으로 확인된다.

SendMessageA와, SendNotifyMessageA 함수를 사용할 때 WM_PAINT 인자 값이 설정되며, 그 설명은 아래와 같다.

- 윈도우가 처음 생성되었을 때

- 윈도우의 위치가 이동되었을 때

- 윈도우의 크기가 변경되었을 때. 최대, 최소화되었을 때

- 다른 윈도우에 가려져 있다가 드러날 때

- 스크롤 될 때

정리하면 위와 같은 상황이 발생하였을 때 WM_PAINT가 발생하는 것으로 확인된다.

 

    4. 쉘코드가 실행되면 아래 사진과 같으며, CreateThread 함수를 사용하여 악성행위를 하는 것으로 확인된다.

 

(좌): Shell Code (우): Malicious Code

위 사진이 (1)과 (2)에서 삽입된 코드들이며 해당 코드들이 실제 악성행위를 하며,

쉘코드는 행위를 마친다.

 

코드분석 -2

Figure 7: 동작방식 -3

    1. CreateThread 함수를 사용하여 (2)와 (3)이 생성되어 특정 프로세스들을 지속적으로 탐지하고 있으며 탐지시 강제로 종료하게 된다. 

 

아래 사진[Create Thread]은 CreateThread 함수를 사용하는 부분이다.

 

Figure 8: Create Thread

총 2개의 Thread를 생성을 하며 각각 프로세스와 Class들을 탐지하는 것으로 확인된다.

 

    2. 아래 사진[프로세스 탐지 -1]은 첫 번째 Thread이다.

 

Figure 9: 프로세스 탐지 -1

프로세스 리스트를 가져오기 위해 CreateToolhelp32Snapshot, Process32First, Process32Next 함수들을 사용하였으며,

특정 프로세스가 탐지되면 TerminateProcess 함수를 사용하여 프로세스를 강제종료 한다.

 

허나 탐지하는 프로세스명 들을 해쉬화 시켜서 특정 메모리영역(40E10D0)에 저장을 해 두었으며, 해쉬화 시키는 알고리즘은 XOR와 ROL 명령어를 사용하여 해쉬화 시킨다.

그리고 XOR EAX, E214E895로 다시 한 번 XOR연산을 한 뒤에 비교를 하여 같을 시 프로세스 강제종료 하는 함수로 이동하게 된다.

 

    3. 아래 사진[EnumWindows]은 두 번째 Thread이다. 해당 Thread는 (1)과 행위가 비슷하며,

EnumWindows 함수를 사용하여 윈도우의 열려있는 프로세스들을 가져오는 것으로 확인되며, 열려있는 프로세스들에 대하여 Class를 가져와서 탐지할 Class들과 비교하여 강제종료 하는 것으로 확인된다.

 

Figure 10: EnumWindows

EnumWindows 함수 내부를 들어가서 직접 트레이싱하여 분석해 본 결과 40E3C1C를 호출하는 부분을 발견하였으며 해당 어드레스에서 Class를 비교하여 강제종료 한다.

 

아래 사진[프로세스 탐지 -2]은 Class 탐지 및 강제종료 부분이다.

 

Figure 11: 프로세스 탐지 -2

전체적으로 (1)과 같으며 다른 부분은 Class를 비교 후 GetWindowThreadProcessID 함수를 사용하여 핸들 값으로 ProcessID를 불러온 후 프로세스를 강제종료 하는 것 외에는 없는 것으로 확인된다.

 

이상으로 2개의 Thread는 특정 프로세스들을 지속적으로 탐지하여 강제종료 하는 것으로 확인된다.

 

    4. 실질적으로 악성행위를 하는 부분이다.

Internet Explorer 레지스트리를 조회하여 버전을 확인 후 http://www.msfncsi.com/ncsi.txt에 접속하여 네트워크 가능여부를 확인한다.

 

아래 사진[네트워크 확인]은 네트워크 관련 함수이다.

 

Figure 12: 네트워크 확인

GetComputerName, GetVolumeInformation 함수를 사용하여 사용자 PC명과 하드 드라이브 정보를 가져와 암호화 후 뮤텍스를 생성한다.

 

아래 사진[Create Mutex]은 뮤텍스를 생성한 부분이다.

 

Figure 13: Create Mutex
Figure 14: Create Directory

CreateDirectory 함수를 사용하여 폴더를 생성하기 위해 특정 문자열(eewvsivs)을 생성한다.

그리고 원본파일을 복사하기 위해 eewvsivs 폴더에 hgrdwjd.exe로 복사한다. 복사가 완료되면 자기자신을 삭제한다.

또한 스케줄을 등록하며 아래와 같은 문자열들을 스케줄 등록하여 10분마다 자동실행되게 설정한 것을 확인하였다.

- Opera scheduled Autoupdate 641546687

- Administrator

- C:\\Users\\Administrator\\AppData\\Microsoft\\Windows\\eewvsivs\\dgrdswjd.exe

- PT10M

- 1999-11-30T00:00:00

 

스케줄이 성공적으로 등록이 되면 서비스 권한을 설정을하며 아래 사진[서비스 권한 설정]의 함수를 사용한다.

 

Figure 15: 서비스 권한 설정

인자 값으로 S:(ML;;NW;;;LW)D:(A;;0x120083;;;WD)(A;;0x120083;;;AC) 가 확인되며

시스템엑세스 제어 목록, 임의 엑세스 제어 목록 권한설정을 하는 것으로 확인된다.

 

아래 사진[C2 Connect]은 WinHttpConnect 함수를 사용하여 C2서버에 접속을 시도한다.

 

Figure 16: C2 Connect

분석당시 해당 C2에 접속이 되지않아 그 이후 행위는 알 수가 없었으며,

해외 분석보고서와 해당샘플의 코드들을 유추를 해 보았다.

 

RtlCopyMemory 함수를 사용하여 특정 버퍼를 메모리 영역에 복사하며 CreateFile 함수를 사용하여 hgrdwjd.exe의 쓰기 모드로 가져오는 것으로 확인된다.

 

Figure 17: 버퍼 삽입

읽기/쓰기 모드로 파일을 불러온 후 WriteFile 함수를 사용하여 복사한 버퍼를 삽입을하며 스케줄 등록한 Opera scheduled Autoupdate 641546687이 10분마다 실행이 되면서 파일이 실행된다. 

그리고 CreateProcessInternalA 함수를 사용하여 explorer.exe가 실행되면서 해당 프로세스에 코드인젝션을 수행을 하며 삽입된 버퍼는 해외 분석보고서에 기재된 내용으로는 특정 plugin들로 유추할 수 있다. 

 

아래 사진은 특정 복호화 알고리즘을 사용하여 plugin_size 문자열이 생성되는 부분과 CreateProcessInternalA 함수이다.

 

Figure 18: Plugin 실행

해외 분석보고서에 따르면 Plugin이 약 5개 정도가 발견되었으며, 각각 행위는 아래와 같다.

 

Plugin_1

  • FireFox, Internet Explorer, Chrome, Opera, QQ Browser, Outlook 및 Thunderbird에 대한 정보 검색

    • hostname, encryptedUsername 및 encryptedPassword에 대한 login.json 파일 반복적으로 검색

  • vaultcli.dll - 윈도우즈 자격 증명 관리자 추출

  • POP3, SMTP, IMAP 자격증명 추출

Plugin_2 

해당 플러그인은 추출 할 파일을 반복적으로 검색한다.

  • Outlook

  • *.pst

  • *.ost

  • Thunderbird

  • *.mab

  • *.msf

  • inbox

  • sent

  • templates

  • drafts

  • archives

  • The Bat!

  • *.tbb

  • *.tbn

  • *.abd

Plugin_3

해당 플러그인은 HTTP와 HTTPS를 통해 전송 될 때 자격 증명과 쿠키를 가로채기 위해 특정 브라우저에 주입한다.

  • iexplorer.exe 및 microsoftedgecp.exe

  • chrome.exe

  • opera.exe

Plugin_4

  • ftp, smtp, pop3 및 imap 에 대한 자격증명을 도용하려 시도

Plugin_5

  • TeamViewr.exe에 코드를 삽입하여 자격증명을 탈취

 

감사합니다.

 

- 참고 자료

  - https://blog.talosintelligence.com/2018/07/smoking-guns-smoke-loader-learned-new.html

  - https://sanseolab.tistory.com/28

  - https://modexp.wordpress.com/2018/08/23/process-injection-propagate/

  - http://www.hexacorn.com/blog/2017/10/26/propagate-a-new-code-injection-trick/

 

반응형

'리버스 엔지니어링 > 악성코드 분석' 카테고리의 다른 글

GandCrab 4.1.2 분석  (0) 2018.08.05
한글 악성코드 분석  (0) 2018.07.17