후기/컨퍼런스

[2021 CodeEngn Conference] 문서형 악성코드를 분석해보자

ruming 2021. 7. 7. 22:59

문서형 악성코드를 분석해보자!

이충호

개요

[VirusTotal 최근 7일 통계] - 문서형 악성코드의 비중이 약 10%

 

문서형 악성코드란?

문서 속에 악성코드를 삽입한 것. 

지능형 지속 공격(APT)에서 이메일 첨부파일을 이용해 감염시키는 형태로 많이 활용.

보통 매크로 언어 사용.

확장자 : PDF, HWP, DOC, PPT, XLS 등

 

문서형 악성코드 공격 사례

1) [2014년 한국 수력원자력 정보유출 사건]

1. 북한 해커가 퇴직자 정보를 통해 피싱 메일을 보냄

2. 메일에 정보탈취용 문서용 악성코드 첨부

3. 임직원의 개인정보가 유출됨

 

2) [EST security]

doc 문서를 사용해 공격

1. 문서를 실행하면 문서가 보호됐다고 뜸 → 문서의 보안 기능 때문에 내용이 보이지 않는 것처럼 속임

2. 컨텐츠 사용 버튼을 클릭하면 악성코드가 실행됨.

3. 작업 스케줄러에 원드라이브라는 이름으로 3분마다 무기한으로 반복하는 트리거 등록

 

3) [EST security]

1. 스캔 문서로 위장한 pdf 파일 첨부, 이메일 형태로 악성파일 배포

악성 코드를 직접 첨부하지 않고 pdf파일만 첨부함 → 사용자가 의심없이 실행할 확률 높음

2. pdf 첨부파일 기능을 이용해 8677.docm 파일을 실행하도록 유도

3. 실행하면 추가 악성코드를 다운로드

 

1번째 샘플 상세 분석

sample1 정적 분석

<detect it easy> : sample1이 워드파일인 것을 확인

<반디집> : sample1의 word 파일 안에 vbaProject.bin 파일을 발견(매크로를 이용)

<OfficeMalScanner> : 소스코드를 추출

AutoOpen 매크로 사용 (문서파일을 열 때 자동으로 실행되는 매크로)

- LogBase 함수 호출

폴더 생성 → MakeSureDirectoryPathExists 함수를 사용해 C드라이브에 여러 폴더를 생성

파일 생성 → List1.jse, Other.BAT 파일을 생성하는 코드. 

파일 쓰기 → Other.BAT 파일은 Cscript 명령어를 이용해 List1.jse를 실행, 나머지 파일은 어떤 내용을 덮어쓰는지 모름

파일 실행 → LogBase 함수는 OpenApp()함수를 호출해 ExecuteCommand 함수에 Other.BAT파일의 경로를 인자로 넘겨줘서 드롭한 파일을 실행시킴

 

sample1 동적 분석

vbaProject를 열어보려 했는데 비밀번호가 걸려있었음. 

메모리를 패치하는 방법으로 비밀번호 우회 (틀린 비밀번호를 입력받아도 맞았다고 반환하도록)

사용자 정의 폼의 컨트롤 안에 파일에 복사할 문자열을 숨겨둠.

 

sample1 상세 분석

파일의 난독화

역난독화 함수

- opvqPbn함수 → 숫자를 문자로 바꿔주는 역할

문자열 역난독화 코드

- 익명 함수 여러 개를 정의하고 호출 → 문자와 문자를 이어서 문자열을 만듦

정규표현식을 작성해 역난독화를 진행 → 난독화 코드 탐지 정규표현식

 

temp와 startup문자열이 없으면 팝업창을 띄움 -> 런타임오류처럼 보이려고 삽입한걸로 판단

ooAzPthinkof15 변수의 값을 1씩 올려서 209만과 값이 같으면 if문 안의 코드를 실행 (필연적으로 실행)

wmi를 이용해 프로세스 관련 정보와 네트워크 관련 정보를 메모리에 저장하는 코드

 + 수집한 프로세스 정보 문자열의 길이가 3천을 넘지 않으면 런타임에러를 의도적으로 발생

여러 환경변수 값을 얻어와 고유한 hex값을 생성 → 파일을 생성할 때 c2서버에 request를 보낼 때 사용

c2서버와 통신을 성공했을 때 실행되는 코드

 

반복적으로 url을 생성해 request를 보냄. 그러나 c2서버가 만료되어 프로그램이 

c2서버와 통신이 성공하면 통신 내용을 저장한 프로파일 내용을 읽고 삭제.

새로운 com파일을 만들어 파일을 저장

프로그램을 다운로드 해 실행시키는 기능이 있음

드라이브를 순회하며 다양한 문서파일의 경로를 텍스트파일에 저장. 

 

결론

여러 폴더를 생성하고 드롭하고 실행. 생성된 파일에서는 로컬 컴퓨터에서 정보를 수집해 request를 보낼 url을 생성함. c2서버와 통신에 성공하면 다운로드 받은 파일을 실행하고 다양한 문서파일을 삭제하고 문서파일이 있던 경로에 스크립트 파일을 복사하는 샘플

 

2번째 샘플 상세 분석

sample1 정적 분석

rtf 파일인 것을 확인

ida로 object를 diassemble

 

sample2 동적 분석

비정상적인 크기의 문자열이 저장 → 스택오버플로우

call, pop 명령어 조합 → erp 레지스터의 값을 edx 레지스터에 저장

edx레지스터에 0x1C3이라는 값을 더함 → stage2 shellcode가 시작하는 주소 저장

ebp 레지스터에 stage2 shellcode가 끝나는 주소를 저장

ecx 레지스터에 특정 hex값을 곱하고 다시 특정 hex값을 더한 후 edx레지스터가 가리키는 주소의 값과 ecx레지스터의 값을 xor연산을 해 저장함.

edx 레지스터의 값을 4 늘리고 ebp 레지스터가 edx 레지스터보다 클 때 해당 구문을 반복함.

 

복호화한 문자열 추측

LoadLibrary, GetProcAddress - 라이브러릴르 추가적으로 로드하고 라이브러리에서 제공하는 함수의 주소를 얻을 것으로 보임

URLDownloadToFileW, 유니코드 형태의 c2서버 주소 - c2서버에서 파일을 다운로드 받을 것.

CreateProcessW - 다운로드 받은 파일을 실행할 것.

 

shellcode는 문자열과 코드가 복잡하게 섞여있음

 

결론

CVE-2017-12881의 취약점을 이용해 쉘코드를 실행시켜 프로그램을 다운로드 받고 실행시키는 샘플

 

3번째 샘플 간단 분석 및 연구

word 파일

또 다른 docx파일 확인 afchunk2.docx

afchunk2.rtf 파일 발견 - calc.exe 파일 내장, CVE-2017-12881 취약점 사용

실행된 calc.exe 프로세스에 인젝션을 시도해 악의적인 행위를 하는 것 같음.

Q. 왜 굳이 docx파일 안에 rtf파일을 감춘 형태로 악성코드를 유포했을까?

탐지 회피율이 크게 향상되지는 않음. 압축 횟수가 문제? - 여러번 압축하니 나름 효과가 있음.

감싸는 횟수를 더 늘리면 탐지엔진 개수가 줄어드는 것을 확인.