전공영역 공부 기록

토렌트로 유포되는 악성코드 분석(영화 결백)

악분 2020. 7. 17. 00:06
반응형
악성코드 링크: https://app.any.run/tasks/f4ccef4f-fd41-44f8-898b-0d6874baf8a6

 

동영상 1편: https://youtu.be/X45Z_jx0nHs

 

동영상 2편:  https://youtu.be/sdPjqHZWwUE

1. 분석 배경

2020.7.7에 토렌트 악성코드가 뉴스에 보도되었고 해당 샘플을 찾을 수 있어 분석을 시작했습니다.

봇넷 백도어 악성코드이지만 공격자에게 명령을 전달받는 부분이 분석이 너무 복잡해 해당 부분은 분석을 포기했습니다. 아쉬운대로 나머지 분석과정을 소개합니다.

2. 요약

2.1 실행 유도

공격자는 영화를 보기 위해서 압축해제 프로그램 실행을 유도합니다. 일종의 피싱 공격이라고 분류 할 수 있겠네요. LOCK.exe를 실행하면 악성코드가 실행될 뿐 기존 영화 압축해제는 되지 않습니다.

그림1 악성코드 실행 유도

2.2 실행환경 분석: 안티 디버깅

실행환경을 분석하여 악성코드를 강제종료하는 방법에 대해 살펴봅니다.

2.3 인젝션: 공유 메모리

공유 메모리를 사용하여 프로세스 인젝션하는 방법에 대해 살펴봅니다.

 

3. 샌드박스 분석

anyrun샌드박스는 오탐과 미탐을 한 것같습니다.

lock.exe는 자식 프로세스에 악성코드를 인젝션했지만 탐지하지 못한 미탐을 했습니다. 아프리카tv클라리언트 설치 프로그램은 악성코드가 아님에도 불구하고 악성코드라고 의심하는 오탐을 합니다.

그림2 anyrun 샌드박스 분석 요약

 

4. 소스코드 난독화

악성행위 중간 중간에 의미없는 명령어를 삽입하여 분석을 방해합니다.

4.1 0x0000을 삽입하여 분석을 방해

그림3 0x0000 난독화

 

4.2 의미없는 논리연산

그림4 add, and 논리연산 난독화

 

4.3 의미없는 push, pop연산

그림5 push, pop 난독화

 

 

5. 안티 디버깅

5.1 안티 디버깅 발견

프로세스모니터를 키고 악성코드를 실행하면 실행되지 않습니다. 반대로 프로세스 모니터를 끄고 실행하면 아프리카 클라이언트 설치 프로그램이 실행됩니다.

5.2 안티 디버깅 분석

https://www.notion.so/NtQueryInformationProcess-646023186f7847f3af4f9fbd8034bcf6

SycllaHide플러그인에서 NtQueryInformationProcess체크박스를 선택하면 안티 디버깅이 쉽게 우회된 것을 알 수 있습니다.

그림6 SycallHide 안티 디버깅 선택 옵션

 

X32dbg로 악성코드를 열고 NtQueryInformationProcess함수에 브레이크포인트를 설정합니다. 그리고 스택창 3번째 인자가 0x1F가 될 때까지 F9번을 눌러 실행합니다. 발견하면 Alt + F9(return User code)를 눌러 NtQueryInformationProcess함수를 호출한 곳으로 이동합니다.

그림7 ProcessDebugFlags 안티 디버깅 발견

ProcessInformationClass의 ProcessDebugFlags(0x1f)값을 검사하는 곳으로 왔습니다. 디버깅 중이라면 ProcessDebugFlags값이 0입니다. 악성코드는 ProcessDebugFlags값이 0인지 cmp로 검사합니다. 간단히 Zero flag를 수정해서 우회할 수 있지만 현재 플러그인을 사용하므로 무시합시다.

그림8 ProcessDebugFlags 안티 디버깅 검사

다시 F9를 눌러 스택창 3번째 값이 0x1E인지 확인하고 중지합니다. 그리고 Alt + F9를 눌러 NtQueryInformationProcess함수를 호출한 곳으로 이동합니다.

 

ProcessInformationClass의 ProcessDebugObjectHandle(0x1e)값을 검사하여 디버깅 중인지 검사하고 있습니다. 디버깅 중이면 값이 0으로 설정됩니다. 여기서도 플러그인을 사용하므로 무시합니다.

그림10 ProcessDebugObjectHandle 안티 디버깅 검사

안티 디버깅 한 구간이 더 있는데 발견하지 못했습니다. 그래서 이 예제에서는 플러그인에 의존했네요. ㅜ.ㅜ

 

6. 코드조각(추측:쉘코드) 초기화 및 실행

VirtualAlloc함수를 사용하여 메모리를 할당하고 코드조각(추측:쉘코드)을 초기화합니다. 총 7번 VirtualAlloc과 초기화 과정을 걸쳐 환경분석을 시작합니다.

7. 환경분석 및 악성코드 강제종료

7.1 프로세스 목록 저장

CreateToolhelp32Snapshot, Process32First, Process32Next를 사용해서 실행중인 프로세스 이름을 배열에 저장합니다.

그림11 프로세스 목록 불러오는 함수 시작

 

연속해서 이름을 저장하는 것이 아니라 약 0xe0거리를 두면서 저장합니다. 아마도 백신 탐지를 피하는 것과 분석을 방해하기 위한 것으로 생각합니다.

그림12 프로세스 목록을 배열에 저장

 

7.2 파일 이름 검사

샌드박스 자동분석을 감지하기 위해 파일 이름을 검사합니다. 악성코드가 설정한 파일 이름이 있으면 프로세스를 강제 종료합니다. 파일 이름은 GetModuleFileName API함수를 사용해서 가져옵니다.

 

 - 검사하는 파일 이름

  • malware
  • sandbox
  • ample

그림13 파일 이름 검사

 

그림14 파일 이름 비교방법 ​

 

비교할 파일 이름은 실행 중에 한글자씩 복사해서 배열로 저장됩니다.

그림15 파일 이름 생성 ​

 

그림16 생성된 파일 이름

 

7.3 백신 프로그램 발견시 종료

[그림 12]에서 수집한 프로세스 목록에서 백신 프로그램이 있는지 검사합니다. 만약 백신 프로그램이 2개 이상이라면 악성코드를 강제종료합니다.

 

- 검사하는 백신 프로그램 이름

  • aswidsagent
  • avgsvc.exe
  • avgui.exe
  • avastsvc.exe
  • avastui.exe
  • avp.exe
  • bdagent.exe
  • bdwtxage.exe
  • dwengine.exe
  • msmpeng
  • mpcmdrun
  • nissrv

그림17 실행중에 생성된 백신 프로그램 이름 ​

 

그림18 생성된 백신 프로그램 이름

그림19 발견한 백신이 2개 이상인지 검사

 

7.4 분석도구 검사

분석도구가 실행중이라면 악성코드를 강제로 종료합니다.

 

- 검사하는 분석도구

  • procmon.exe
  • procmon64.exe
  • windbg.exe
  • procexp.exe
  • procexp64.exe
  • ollydbg.exe

 

그림20 실행중에 생성되는 분석도구 이름

그림21 생성된 분석도구 이름

 

8. 인젝션: 공유 메모리 인젝션

공유 메모리를 만들어 새로운 악성코드를 저장합니다. 그리고 자식 프로세스에 인젝션하여 새로운 악성코드를 실행합니다.

8.1 자식 프로세스 생성

CreateProcessW함수에 브레이브포인트를 설정합니다. F9를 눌러 시작하면 첫 번째로 실행되는 프로세스는 아프리카tv클라이언트 설치입니다. 다시 F9를 눌러 시작하면 일시정지상태로 자식 프로세스를 실행합니다.

그림22 일시정지 상태로 시작하는 자식프로세스

8.2 자식 프로세스 메모리 해제

ZwUnmapViewOfSection에 브레이크포인트를 설정하고 실행합니다. 브레이크포인트에 멈추면 Alt + F9를 눌러 유저코드로 돌아옵니다.

Process Hacker로 자식 프로세스의 메모리 탭을 확인하면 0x00400000영역이 없어진 것을 확인할 수 있습니다.

8.3 공유 메모리 생성 할당 및 연결, 초기화

공유 메모리를 생성하여 악성코드(부모 프로세스)와 타겟(자식 프로세스)에 모두 연결시킵니다. 그 후 악성코드는 공유 메모리에 새로운 악성코드를 덮어 씁니다. 타겟도 공유 메모리가 연결되어 있으므로 새로운 악성코드가 인젝션되는 결과가 됩니다.

NtCreateSection에 브레이크포인트를 설정하고 실행합니다. 브레이크포인트에 멈추면 ALT + F9를 누릅니다. Process Hacker → Handles탭을 확인하면 Full Control권한인 섹션이 생겼습니다. 이 섹션은 공유 메모리 역할을 합니다.

그림23 공유 메모리 역할을 하게 될 섹션 생성

 

NtViewOfSection에서 브레이크포인트를 설정하고 F9를 눌러 실행합니다. 스택창을 확인하면 악성코드 자기자신에게 생성했던 섹션을 연결합니다.

그림24 공유 메모리를 악성코드에 연결 ​

 

F9를 눌러 한번 더 실행합니다. NtViewOfSection에 일시정지됩니다. 스택창을 확인하면 자식 프로세스에 생성했던 섹션을 연결합니다. 이제 악성코드와 자식 프로세스에 공유 메모리가 모두 연결되었습니다. 자식 프로세스 핸들은 x32dbg Handles탭에서 확인할 수 있습니다(동영상 확인).

그림25 공유 메모리를 자식 프로세스에 연결

Alt + F9를 눌러 유저코드로 되돌아갑니다. Process Hacker로 자식 프로세스 메모리 영역을 확인합니다. 기존에 없던 0x00400000이 생겼습니다. 공유 메모리가 0x00400000영역에 연결되었습니다.

그림26 자식 프로세스 공유 메모리 확인 ​

 

F8번을 눌러 한줄한줄 실행하다보면 공유 메모리에 데이터를 덮어쓰는 코드를 만납니다.

그림27 공유 메모리 덮어쓰기

 

Process Hacker로 자식 프로세스 0x00400000메모리 영역을 확인해봅시다.

그림28 인젝션 확인

F9번을 누르면 자식 프로세스가 실행됩니다. 자식 프로세스는 NtResumeThread함수에 의해 실행됩니다.

9. 인젝션된 악성코드 파일 추출

실제 악성행위는 인젝션된 악성코드가 수행합니다. 하지만 이 악성코드는 메모리에서만 존재하므로 분석하기 위해 파일로 추출해야 합니다. [그림 27]단계에서 x32dbg기능을 사용하면 쉽게 인젝션된 악성코드를 추출할 수 있습니다.

[그림 27]단계의 스택창에서 첫 번째 인자에 마우스 오른쪽 버튼을 누르고 Follow DWORD in Memory Map을 클릭합니다.

그림29 메모리 맵 이동

 

이동된 메모리 맵에서 오른쪽 버튼을 클릭 후 Dump Memory to File 메뉴를 선택하여 파일로 추출합니다.

그림30 파일 추출 ​

 

추출된 파일은 UPX로 패킹되어 있습니다. 간단히 upx프로그램 -d 옵션으로 언패킹됩니다.

그림31 UPX 패킹 확인

 

10. 인젝션 악성코드 분석

* 바이러스토탈 링크: https://www.virustotal.com/gui/file/88bd2a65da1bea7e7815fb9cab600c87e69b0bd8f3770b68a3b74b51a2d9eb2b/detection

* anyrun샌드박스 링크: https://app.any.run/tasks/84fd6c67-5b4d-4d7e-86a4-1d06025e6340

* cape샌드박스 링크: https://capesandbox.com/submit/status/25624/

인젝션 악성코드를 디버깅하면 이유는 알 수 없지만 컴퓨터가 먹통이 됩니다. 그러므로 CAPE샌드박스를 이용해서 분석을 진행했습니다.

의심스러운 악성행위는 dns쿼리밖에 발견하지 못했습니다. 현재 해당 서버가 없기 때문에 127.0.0.1로 변환되었습니다.

악성코드는 실행 중에 쉘코드를 복호화하고 실행합니다.

그림33 쉘코드 복호화 ​

 

쉘코드가 복호화된 악성코드는 CAPE샌드박스의 Process Dumps에서 다운로드 받을 수있습니다.

그림34 복호화된 쉘코드 다운로드 ​

 

문자열을 분석하면 키로깅기능이 있을 것으로 추측됩니다.

그림35 키로깅으로 의심되는 문자열

문자열을 참조하는 곳으로 이동하면 공격자에게 명령을 받아 실행하는 것으로 추측된 곳이 발견됩니다.

그림36 공격자 명령어 수행

 

참고자료

https://asec.ahnlab.com/1351

https://www.hauri.co.kr/security/issue_view.html?intSeq=405&page=1

Notion에서 더 편하게 볼 수 있습니다.https://www.notion.so/44405c0f16024ed49ed0e37be6defe0f

반응형