Uiseong Park zairo

Write-up

2015 WITHCON Quals

2015 White Hat Contest 예선 Write-up
Team. RebForPwn(zairo, jsh, choiys)

Overview

이번 대회의 시나리오 입니다. 박 부장의 PC가 랜섬웨어에 감염이 되었다고 합니다. 해당 PC의 디스크 이미지 파일과, 메모리 덤프 파일을 수집했으며, 해당 파일을 토대로 랜섬웨어에 관련된 정보들을 도출해내야 합니다.

주어진 파일은 DISKDUMP.vmdk, MEMDUMP 파일로 총 2가지 입니다. 메모리 포렌식 도구로써 volatility 2.4 를 사용해보도록 합니다. 먼저 MEMDUMP 파일을 이용해서 정보를 이것저것 살펴보도록 합시다.

먼저, 아래 그림과 같이 imageinfo 명령을 통해서 박부장의 PC가 Win7 64 bit를 사용 중 이란 것을 알 수 있습니다.

> volatility-2.3.1.standalone.exe -f MEMDUMP imageinfo

Exercise #1. 박부장 PC의 문서를 암호화한 랜섬 웨어 파일은 무엇인가요? (전체 경로)

image 정보를 위에서 알아냈으니, 이를 활용해서 volatilty 와 함께 메모리 덤프를 살펴보도록 합시다. 먼저 pslist, pstree, psscan 등의 명령어를 통해서 실행 중인 프로세스, 각 프로세스 간의 상관 관계, 프로세스 타임 라인에 대해서 살펴 볼 수 있도록 합니다.

psscan 명령을 통해서 살펴본 결과입니다. 딱히 특이한 점은 없지만, 유일하게 프로세스가 종료된 temp.exe 프로세스가 눈에 들어오는 것을 확인 할 수 있습니다. PPID3336을 가지며 해당 프로세스는 HWP.exe 인 것을 확인 할 수 있습니다. 이 HWP.exePPID를 또 살펴보면, 2560임을 알 수 있는데, 해당 프로세스는 iexplorer.exe 즉, 인터넷 익스플로러의 PID임을 확인 할 수 있습니다.

> volatility-2.3.1.standalone.exe -f MEMDUMP imageinfo

> volatility-2.3.1.standalone.exe -profile=Win7SP1x64 -f MEMDUMP psscan

이어서 pslist 명령어를 통해서 분석해보도록 합시다. 위에서 확인한 temp.exe 이외에 종료된 processOfficeHelp.exe를 확인 할 수 있습니다. 해당 OfficeHelp.exePPID2972를 가지는데 CMD.exePID2972를 가지는 것을 확인 할 수 있습니다. 다시 CMD.exePPID를 확인 해보니, 3584임을 알 수 있었는데, 해당 PID는 위에서 확인 했던, temp.exe인 것을 알 수 있습니다.

위에서 확인한 내용들을 토대로, 정리를 해보자면, iexplorer.exe로 부터 Hwp.exe가 실행 되고, Hwp.exe로 부터 temp.exe가 실행 되었으며, temp.exe로 부터 CMD.exe, CMD.exe로 부터 OfficeHelp.exe가 실행 되었음을 결론 지어 볼 수 있습니다. 추가적으로 OfficeHelp.exePIDPPID로 가지는 프로세스를 찾아보았으나, 존재하진 않았습니다.

pstree 명령어를 통해서 위에서 살펴본 내용들을 확인 할 수 있었으며 iexplorer.exe -> HWP.exe -> temp.exe -> CMD.exe -> OfficeHelp.exe 순으로 실행이 되었음을 알 수 있습니다.

> volatility-2.3.1.standalone.exe -profile=Win7SP1x64 -f MEMDUMP pstree

위와 같이 volatility의 명령어들을 통해서 메모리 덤프내에서 프로세스 정보들을 살펴보았습니다.

다음은, 제공된 vmdk 파일을 복사 해 vmware마운트 한 뒤, 실행을 시켜보도록 합니다. win 7이 실행되는 것을 확인 할 수 있으며, 아래와 같이 부팅이 되자마자 돈을 요구하는 창이 뜨는 것을 확인 할 수 있습니다.

부팅이 되자 마자 실행 되어 나오는 점을 착안하여 registry자동 시작 프로그램 리스트를 확인 하였습니다. 확인을 해보니 아래와 같이 OfficeHelp.exe 가 등록이 되어있는 것을 확인 할 수 있었습니다. 또한, OfficeHelp.exe의 경로를 알 수 있었습니다. 따라서 돈을 요구하는 창은 OfficeHelp.exe 로부터 실행된 것을 확인 할 수 있었습니다.

위에서, iexplorer.exe -> HWP.exe -> temp.exe -> CMD.exe -> OfficeHelp.exe 의 파생 순서를 확인 했었습니다. temp.exe가 실행되고 돈을 요구하는 OfficeHelp.exe를 실행시키므로, 해당 temp.exe랜섬웨어임을 추측해 볼 수 있었습니다. 또한, internet explorer를 통해 HWP.exe가 실행된 것으로 보아, 한글 파일을 다운 받아 실행 한 것으로 유추해 볼 수 있었습니다. FTK imager를 통해 temp.exe를 찾아본 결과 아래와 같이 삭제된 흔적을 찾을 수 있었습니다.

답 : C:\Program Files (x86)\Hnc\HOffice9\Bintemp.exe

Exercise #2. 박부장 PC에서 랜섬웨어에 의해 암호화된 파일을 모두 몇개인가요?

암호화 된 파일들을 찾아보기 위해, 복사한 vmdk파일을 로컬에 따로 마운트시켜보도록 합시다. 아래와 같이 vmware에서 제공하는 기능을 이용합니다. FTK imager를 이용해서 마운트 해도 동일합니다.

1번 문제에서 internet explorer를 통해서 다운로드를 하였을 것이라 추측했으므로, 마운트 후 다운로드 경로로 이동해 보았습니다. 그 결과, 아래와 같이 HWP 파일PDF 파일들을 확인 할 수 있었으나, 확장자에 _enc 가 추가된 이상한 확장자 임을 확인 할 수 있었습니다. 정상적으로 실행이 되지 않는 것으로 보아, 해당 파일이 암호화 되어 _enc가 확장자에 추가되어 잠긴 것을 알 수 있었습니다.

랜섬웨어에 감염된 파일들을 찾기 위해, 마운트Z drive 최상위 디렉토리에서 *.*_enc_enc를 포함하는 모든 파일을 검색해보았습니다. 아래에서 확인 할 수 있듯이 총 70개의 파일이 검색 되는 것을 확인 할 수 있습니다.

암호화 파일에 대해서 추가적으로 살펴보기 위해, winhex를 통해 파일 내부 구조를 살펴 보았습니다. 정상적인 PDF 구조가 아닌, 변조 된 구조임을 확인 할 수 있었습니다.

하지만, _enc가 붙은 모든 파일이 전부 랜섬 웨어로 인해 암호화가 된 것은 아래의 업무 협조 서신.docx_enc 파일을 통해 알 수 있었습니다. 모든 암호화 파일들을 winhex로 살펴보던 중 PK 시그니쳐를 가진 정상적인 압축 파일임을 확인 할 수 있었으며, 정상적으로 압축 해제까지 진행되는 것을 확인 할 수 있었습니다. 기존부터 _enc를 확장자로 가지고 있었던 것으로 예상됩니다.

70개의 파일을 winhex를 통해 간단히 헤더 부분만 파악한 결과 업무 협조 서신.docx_enc을 포함하여 확장자에 _enc가 들어가 있으나, 암호화 되지 않은 정상적인 파일들이 모두 3개인 것을 확인 할 수 있습니다.(EXCEL12.XLSX_enc, PWRPNT12.PPTX_enc, 업무 협조 서신.docx_enc) 따라서 암호화된 파일의 총 갯수는 67개 입니다.

추가적으로, OfficeHelp.exe 에서 확인 할 수 있는 PYTHONSCRIPT 에서 추출한 pyc 파일을 decompile 하면 .pdf, .hwp, .docx, .pptx, .xlsx 확장자를 가진 파일들을 BFCipher 알고리즘을 통해서 decrypt 하는 것을 확인 할 수 있습니다. .pdf, .hwp, .docx, .pptx, .xlsx 확장자만 복호화 하는 것으로 보아, 해당 5개의 확장자만 _enc 확장자로 암호화 한 것으로 판단할 수 있으며, 위 EXCEL12.XLSX_enc, PWRPNT12.PPTX_enc, 업무 협조 서신.docx_enc 파일들은 모두 기존의 확장자에 _enc 를 포함하고 있었던 것을 알 수 있습니다.

답 : 67

Exercise #3. 랜섬웨어가 사용한 암호 알고리즘과 모드는 무엇인가요? (암호 알고리즘_모드)

1번 문제에서 랜섬 웨어 파일은 temp.exe 임을 확인 하였습니다. 해당 temp.exe 파일을 살펴보아야 암호화 방식 등에 대한 정보를 알 수 있으나, 아래와 같이 파일을 복구할 수 없도록 삭제가 되어있어 temp.exe파일에 대한 상세 분석은 할 수 없습니다.

곰곰이 생각을 해보다가 다음과 같은 결론을 낼 수 있었습니다.

  • 파일을 암호화 하는 랜섬웨어temp.exe 입니다.
  • temp.exe 는 파일들을 암호화 한 뒤 삭제 되었습니다.
  • 사용자에게 금전을 요구하는 파일은 OfficeHelp.exe 입니다.

따라서 OfficeHelp.exe 파일에 복호화에 대한 실마리가 있을 것으로 추측 할 수 있습니다.

자동 시작 실행에 등록되어 있는 OfficeHelp.exe를 통해서 해당 파일의 경로를 알 수 있었으며 해당 파일의 경로는 다음과 같습니다.

C:\ProgramData\Microsoft Help\OfficeHelp.exe

이제 mountdrive 에서 OfficeHelp.exe 파일을 찾아보도록 합니다.

해당 경로에서 OfficeHelp.exe를 추출 해 낼 수 있었습니다. 추출 해낸 OfficeHelp.exe를 분석 해보도록 하겠습니다. 단순한 exe 파일인 줄 알았으나, zip형식의 exe파일인 것을 확인 할 수 있었습니다.

좀 더 정확한 내용을 위해 ollyDBG 를 통해서 살펴보도록 하겠습니다. string으로 추출한 내용들에는 아래와 같이 python을 로드하여 사용하는 것을 확인 할 수 있습니다. dllpyd확장자가 보이는 것으로 보아 python 프로그램을 exe로 컴파일 한 것으로 추측할 수 있습니다.

실제로 동적 분석을 진행한 결과, 내장된 pyc 파일들을 로드하여 사용하는 것과 py2exe 를 통해 컴파일 된 프로그램임을 알 수 있었습니다. 웹 상에서 해당 파일을 decompile 할 수 있는 py2exedumper를 다운로드 받아 decompile 한 결과, 아래와 같이 library.zipPYTHONSCRIPT파일이 추출되는 것을 확인 할 수 있습니다.

library.zip 내부에는 import 되는 python module 들이 들어있는 것을 확인 할 수 있었는데, 아래와 같이 여러 모듈들이 pyc 형태로 존재하는 것을 확인 함과 동시에 Crypto 라는 폴더 명을 확인 할 수 있었습니다. 해당 폴더가 암호화 방식과 관련이 있을 것으로 예상됩니다.

crypto 폴더 내부에는 아래와 같이 Blowfish 라는 pyc 파일이 들어 있는 것을 볼 수 있습니다. 암호화 알고리즘과 관련된 python code인 것 같습니다.

Blowfish를 검색해보니, 아래와 같은 암호화 알고리즘 설명을 찾을 수 있었습니다. 간단하게 설명하자면, 대칭형 블록화 암호 알고리즘으로 정의 할 수 있습니다. 암호화 방식은 Blowfish 암호화 방식인 것을 확인 할 수 있습니다.

해당 Blowfish.pycpyc파일이기 때문에 code를 바로 살펴 볼 수 없으므로, py파일로 decompile 해서 확인 할 수 있도록 하겠습니다. pyc파일을 py파일로 간단하게 decompile 해주는 Easy python Decompiler를 사용하여 decompile을 진행 하겠습니다.

decompileblowfish.py의 소스를 살펴 보면, 아래와 같이 암호화 방식의 default modeECB방식의 블록 암호화 인 것을 확인 할 수 있습니다. 암호화 모드는 ECB 모드인 것을 확인 할 수 있습니다. 물론, 정확한 암호화 모드는 temp.exe를 통해서 확인 하는 것이 가장 정확하지만, 현재 temp.exe 를 복구할 수 없기 때문에 암호화 방식과 모드를 확인 할 수 있는 가장 최선의 방법 입니다.

추가적으로 OfficeHelp.exe에서 확인 할 수 있는 PYTHONSCRIPT에서 추출한 pyc파일을 decompile한 결과, 아래와 같은 암호화 알고리즘을 확인 할 수 있었습니다. OfficeHelp.exe를 통해서 복호화 작업을 수행하는 BFCipher함수입니다. 코드의 일부분을 발췌해 왔는데, 복호화 작업 내에서 블록 암호화 모드에 대한 설정이 전혀 보이지 않으므로 위에서 확인했었던 Default값인 ECB 모드로 암호화를 한 것을 알 수 있었습니다.

from Crypto.Cipher import Blowfish
from PySide import QtCore, QtGui
from time import sleep

class BFCipher:

    def __init__(self, password):
        self.__cipher = Blowfish.new(password)

    def encrypt(self, file_buffer):
        try:
            cipher_text = self.__cipher.encrypt(self.__pad_file(file_buffer))
        except:
            pass

        return cipher_text

    def decrypt(self, file_buffer):
        try:
            clear_text = self.__depad_file(self.__cipher.decrypt(file_buffer))
        except:
            pass

        return clear_text

    def __pad_file(self, file_buffer):
        pad_bytes = 8 - len(file_buffer) % 8
        for i in range(pad_bytes - 1):
            file_buffer += chr(randrange(0, 256))

        bflag = randrange(6, 248)
        bflag -= bflag % 8 - pad_bytes
        file_buffer += chr(bflag)
        return file_buffer

    def __depad_file(self, file_buffer):
        pad_bytes = ord(file_buffer[-1]) % 8
        if not pad_bytes:
            pad_bytes = 8
        return file_buffer[:-pad_bytes]

Py2ExeDumper를 통해 decompile한 결과 아래와 같이 library.zipPYTHONSCRIPT파일이 추출되는 것을 확인 할 수 있었습니다. library.zipimport되는 python module들을 모아 놓은 파일이며, py2exe compile 특성 상, PYTHONSCRIPT 파일은 위 모듈들을 사용하는 주요 main 함수가 들어있는 파일임을 알 수 있었습니다.

PYTHONSCRIPT파일을 winhex를 이용해서 살펴보면, 여러 개의 pyc 파일로 이루어진 것을 알 수 있는데, 정상적으로 분석해 보기 위해서는 pyc로 다시 나누어 decompile을 진행해야 합니다. 아래와 같이 pyc파일 별로 구분하여, 파일을 나누어 주는 script를 이용하여 PYTHONSCRIPT내에 pyc 파일을 구분할 수 있었습니다.

위에서 추출한 pyc 파일을 각각 decompile하여 code를 살펴보면, 아래와 같이 temp.exe를 삭제하는 code를 확인 할 수 있었으며, 사용자 PC 의 MAC주소와 volume number를 가져오는 함수 또한 확인 할 수 있었습니다.

함수들을 따라가 보면 가져온 mac, volume정보를 아래 URL로 전송하는 것 또한 확인 할 수 있었으며 OfficeHelp.exe의 전체적인 동작을 확인함과 동시에 여러 정보를 얻을 수 있었습니다.

답 : Blowfish_ECB

Exercise #4. 랜섬웨어 파일은 어디에서 다운로드 되었나요? (원본 파일 URL 전체 경로, 프로토콜 포함)

이 문제를 해결 하기 위해서는 먼저 5번 문제를 해결해야 합니다. (5번 문제를 먼저 살펴보는 것을 추천해드립니다.)

메모리 상에 남아 있는 downloader참고지침.hwp임을 알 수 있었고, 파일을 카빙 하기 위해 해당 주소 영역 3곳에서 모두 dumpfiles 명령어를 통해서 file dump를 수행합니다.

> volatility-2.3.1.standalone.exe --profile=Win7SP1x64 -f MEMDUMP dumpfiles -D . -Q 0x13ffebb70
> volatility-2.3.1.standalone.exe --profile=Win7SP1x64 -f MEMDUMP dumpfiles -D . -Q 0x13fa38490
> volatility-2.3.1.standalone.exe --profile=Win7SP1x64 -f MEMDUMP dumpfiles -D . -Q 0x13cf11b50

그 결과, 아래와 같이 .dat확장자를 가진 file 하나가 추출 된 것을 확인 할 수 있습니다. 참고지침.hwp을 추출하기 위해 dump한 메모리 영역 내에서 카빙 된 파일입니다.

해당 .dat 파일을 virustotalscan한 결과, 아래와 같이 shellcode관련 악성 코드로 탐지하는 것을 확인 할 수 있었습니다. 추가적으로 winhex를 통해 살펴보았을 때, shellcode의 구성을 이루는 gadget으로 보이는 byte 조각들을 확인 할 수 있었습니다.

해당 .dat 파일 내부를 확인 해본 결과, 파일 내부에 temp.exe와 함께 URL로 보이는 문자열 들을 확인 할 수 있었습니다. 이로 미루어 보아 참고지침.hwp는 한글 취약점을 이용한 exploit code를 포함하고 있는 file이며, 아래에서 확인 할 수 있는 URL로 접속을 시도하여 temp.exe를 설치하는 것을 확인 할 수 있었습니다. process tree에서 확인 한 로직 상에 temp.exe와 관련된 프로세스는 HWP.exe 밖에 없었으므로 temp.exe랜섬 웨어 파일을 다운로드 한 downloader참고지침.hwp이며, 다운로드 경로는 http://poworks.com/wp-includes/theme-compat/post.gif임을 확인 할 수 있었습니다.

답 : http://poworks.com/wp-includes/theme-compat/post.gif

Exercise #5. 랜섬웨어 파일을 다운로드한 다운로더(Downloader)는 무엇인가요? (파일명.확장자)

iexplorer.exe -> HWP.exe -> temp.exe -> CMD.exe -> OfficeHelp.exe에서 랜섬웨어 파일인 temp.exe를 실행시킨 프로세스는 HWP.exe 입니다. HWP.exe로 인해 temp.exe가 실행이 되었으므로 Downloader에 대한 실마리를 찾기 위해선 HWP.exe로 어떤 작업을 통해 temp.exe가 실행 되었는지, iexplorer를 통해서 다운로드 한 hwp파일은 무엇인지 알아보도록 합시다.

volatilitycmdline 명령어를 통해서 아래와 같이 HWP.exe의 행위를 txt파일로 출력할 수 있습니다. HWP.exePID는 위에서 확인한 바와 같이 3336입니다.

> volatility-2.3.1.standalone.exe --profile=Win7SP1x64 -f MEMDUMP cmdline -p 3336 > result.txt

result.txt를 열어 보면 3336PID를 가진 HWP.exeContent.IE5폴더의 L0Z3CKRQ폴더에 존재하는 ????.hwp파일을 실행 시키는 것을 확인 할 수 있습니다.

mountdrive에서 해당 경로로 이동해 살펴 보면 hwp 파일이 보이지 않는 걸 확인 할 수 있습니다. FTK imager를 통해서 해당 폴더 내에 참고지침.hwp라는 삭제된 파일을 확인 할 수 있습니다. 다른 hwp 파일은 존재 하지 않으므로, 해당 참고지침.hwp 파일이 HWP.exe 가 실행시킨 ????.hwp 임을 확인 할 수 있습니다.

temp.exe와 마찬 가지로, FTK imager에서 바로 복구 되지 않습니다. volatilityfilescan기능을 통해 메모리 덤프 상에 남아있는 참고지침.hwp를 스캔 해보았더니, 아래와 같이 3 영역에서 hwp 파일이 스캔 되는 것을 확인 할 수 있었습니다. 경로는 모두 참고지침.hwp 의 경로와 동일한 것을 알 수 있습니다.

> volatility-2.3.1.standalone.exe --profile=Win7SP1x64 -f MEMDUMP filescan | find ".hwp"

메모리 상에 남아 있는 참고지침.hwp 파일을 카빙 하기 위해 해당 주소 영역 3곳에서 모두 dumpfiles명령어를 통해서 file dump를 수행해 보았습니다.

> volatility-2.3.1.standalone.exe --profile=Win7SP1x64 -f MEMDUMP dumpfiles -D . -Q 0x13ffebb70
> volatility-2.3.1.standalone.exe --profile=Win7SP1x64 -f MEMDUMP dumpfiles -D . -Q 0x13fa38490
> volatility-2.3.1.standalone.exe --profile=Win7SP1x64 -f MEMDUMP dumpfiles -D . -Q 0x13cf11b50

그 결과, 아래와 같이 .dat확장자를 가진 file 하나가 추출 된 것을 확인 할 수 있습니다. 참고지침.hwp을 추출하기 위해 dump한 메모리 영역 내에서 카빙 된 파일입니다.

해당 .dat파일을 확인 해본 결과, 파일 내부에 temp.exe와 함께 URL로 보이는 문자열 들을 확인 할 수 있었습니다. process tree에서 확인 한 로직 상에 temp.exe와 관련된 프로세스는 HWP.exe 없으므로 이로써, temp.exe 랜섬웨어 파일을 다운로드 한 downloader참고지침.hwp 임을 알 수 있습니다.

답 : 참고지침.hwp

Exercise #6. 다운로더(Downloader)는 박부장 PC에 언제 다운로드되었나요? (YYYY-MM-DDThh:mm:ss)

Exercise #7. 다운로더(Downloader)는 어디에서 다운로드 되었나요? (다운로드 URL 전체 경로, 프로토콜 포함)

5번 문제를 통해서 downloader참고지침.hwp인 것을 알 수 있었습니다. 해당 hwp파일이 언제 박부장의 PC 로 다운로드 된 것인지 확인 해 보도록 합시다. volatilityprocess list를 통해서 확인한 참고지침.hwp파일의 실행 시간은 아래와 같이 2015-09-25 06:22:24입니다. 한국은 GMT+9가 기준시 이므로, 이 부분을 유의 한다면 실행 시간은 2015-09-25 15:22:24임을 알 수 있습니다. PPIDiexplorer.exe가 실행된 시간은 2015-09-25 15:21:52이므로 2015-09-25 15:21:52 ~ 2015-09-25 15:22:24 사이에 downloader가 다운 되었음을 알 수 있습니다.

> volatility-2.3.1.standalone.exe --profile=Win7SP1x64 -f MEMDUMP pstree

iexplorer를 통해서 hwp파일을 download하였으므로 인터넷 사용 기록에 관해서 조사를 해볼 필요가 있을 것 같습니다. 사용자가 방문한 모든 웹사이트에 대한 URL, 웹 페이지 목록 등에 대한 내용을 확인 하기 위해 index.dat파일을 추출했으며, 해당 dat 파일을 index.dat Analyzer tool을 통해서 확인 할 수 있었습니다.

index.dat파일을 조사 했으나, hwp 파일의 다운로드 흔적은 찾지 못했습니다. IE 버전에 따라 해당 내용들이 WebCache 에 저장되는 경우도 있으므로 browser Cache값을 통해서 접속한 URL, file download 기록 등에 대해서 조사해보아야 할 것 같습니다. Cache 값을 확인하기 위해서, IECacheView란 tool 을 사용하였으며, 아래의 WebCacheV01.dat파일을 통해서 Cache 값을 확인 해 볼 수 있습니다.

IECacheView를 통해서 확인 하기 전에 mountvmdk 디스크 파일을 이용해서 구동한 vmware 내부에서 IE를 직접 실행해 아래와 같이 열어본 페이지 목록 을 참조해 보았더니, file.jandi.com을 통해서 4개의 file을 다운로드 한 것을 확인 할 수 있었습니다. 정확한 다운로드 filename 을 확인 할 수는 없었지만, download경로에 존재하는 해당 일자를 기준으로 4개의 file을 간추려내 아래와 같이 참고지침.hwp로 추측 되는 file의 속성을 확인 할 수 있었습니다.

보다 정확한 분석을 위해서, 위에서 준비한 WebCacheV01.dat파일을 IECacheView를 통해서 Cache 값을 확인 해보았습니다. 아래에서 확인 할 수 있듯이 정확하게 참고지침.hwp파일의 다운로드 URL 과 다운로드 시간을 확인 할 수 있었습니다.

downloader참고지침.hwpdownload경로는 https://files.jandi.com/files-private/11278028/142fc17cddb52a1749b66935d2184bae.hwp/download/이며, download 시간은 2015-09-25T15:22:24임을 확인 할 수 있었습니다.

답 : 2015-09-25T15:22:24

답 : https://files.jandi.com/files-private/11278028/142fc17cddb52a1749b66935d2184bae.hwp/download/

Exercise #8. 박부장 PC의 문서를 암호화한 키가 저장되어 있는 데이터베이스명, 테이블명은 무엇인가요? (DBNAME_TABLENAME)

Exercise #9. 박부장 PC의 문서를 암호화한 키는 무엇인가요?

위에서 확인한 랜섬웨어 temp.exe로부터 파생되어 실행되는 OfficeHelp.exe에서는 사용자에게 금전을 요구하는 것을 확인 할 수 있었습니다. 아래와 같이 입금을 한 후, 계좌 번호를 서버로 전송하도록 요구하고 있는 것을 확인 할 수 있었습니다. 계좌를 해커의 서버로 보내면, 해커가 해당 계좌로부터 금전이 입금 되었는지 확인 후 복호화 작업을 수행하는 것으로 보입니다.

해커의 서버에 관련된 정보를 획득하기 위해서, OfficeHelp.exe을 실행 시킨 뒤, 가짜 계좌 123123123을 입력하고 보내기 버튼을 누른 뒤의 패킷을 잡아 확인해보았습니다. 아래와 같이 http://poworks.com/wp-includes/SimplePie/Cache/Key.php?s03p08=%s&a88d11=%s 형식으로 GET 요청을 하는 것을 확인 할 수 있었습니다. 해커의 서버로 사용자가 입력한 계좌번호를 붙여서 전송하고 있는 것을 알 수 있습니다.

패킷으로 확인한, poworks.com으로 데이터를 전송하는 것과 Key.php로 파라미터를 전송하는 것으로 보아 해당 URL에서 암호화 Key를 알 수 있을 것으로 추정되어 powork.com의 취약점을 찾아보았습니다. 그 결과, Poworks.com의 Forum 게시판에서 취약점을 발견 할 수 있었습니다.

Fiddler를 통한 파라미터 확인을 통해서 Poworks.com Forum 게시판 검색 페이지 내에서 wp-symposium 플러그인을 사용하는 것을 확인하였으며, 해당 플러그인에 SQL Injection 취약점이 존재하는지 확인 해 보았습니다.

wp-symposium에 대해서 구글 검색을 하던 중, Dxwsecurity를 통해 해당 플러그인에 Blind SQL Injection 취약점이 존재하는 것을 확인 할 수 있었습니다.

wp-symposium 플러그인에서 Blind SQL Injection 취약점이 존재한다는 것을 확인하였으며, blind sql injection 을 위한 자동화 tool인 SQLMAP을 이용해 아래와 같은 쿼리문으로 데이터베이스 목록을 스캔해 보았습니다.

스캔 결과, 아래와 같은 결과 값을 얻을 수 있었으며, information_schema, KeyDB, virtue 총 3개의 데이터베이스 목록이 존재하는 것을 확인 할 수 있었습니다.

이 중 가장 Key 값과 관련 있는 것으로 보이는 DBKeyDBTable 목록을 살펴보기 위해 SQLMAP–tables –D KeyDB 옵션을 덧붙여서 실행 해보았습니다. 위에서 사용한 동일한 쿼리문에 해당 옵션만 덧붙여 스캔하도록 합니다.

그 결과, 아래와 같이 kt1506, kt1507, kt1508, kt1509, kt1510, money 테이블이 존재하는 것을 알 수 있었습니다. 각 테이블을 살펴보면 kt1506~kt1510 테이블은 피해자 PC의 감염된 년도와 월을 나타내는 것, 그리고 랜섬 웨어의 암호화를 풀 수 있는 Key를 가지고 있는 KeyTable의 약자임을 유추해볼 수 있고, money 테이블은 OfficeHelp.exe에서 계좌번호를 입력하면 계좌번호가 저장되는 테이블임을 유추해 볼 수 있습니다.

박부장의 PC는 9월 25일에 감염되었으므로 kt1509 테이블을 중점적으로 Key를 찾아보면 실마리를 얻을 수 있을 것 같았습니다. Sql-shell 옵션을 이용하여, key table을 조사 해보았습니다.

key table을 살펴 본 결과 아래에서 flag, keystr, signature 3개의 컬럼이 존재하는 것을 확인할 수 있었습니다. 여기에서 keystr은 32글자를 가지는 값인데 랜섬 웨어의 암호화를 풀 수 있는 key로 추정 되며, signature은 각 PC를 식별할 수 있는 key로 추정됩니다.

패킷을 통해서 전송되는 형식인 http://poworks.com/wp-includes/SimplePie/Cache/Key.php?s03p08=%s&a88d11=%s를 다시 살펴보면 Key.php에 데이터를 전송할 때 파라미터로 계좌번호와 같이 20글자의 정보를 보내는 것을 확인 할 수 있었는데, 이 정보는 사용자 PC의 드라이브 Volume Serial NumberMAC 주소를 합친 20 자리인 것을 PYTHONSCRIPT에서 추출한 아래의 pyc decompile code 내에서 확인 할 수 있었습니다.

vmdk 디스크 이미지 파일 내의 registry 정보를 통해서 박부장 PC 의 MAC정보와 디스크 volume 정보를 아래와 같이 알 수 있었습니다. 2개의 MAC정보를 확인 할 수 있었는데, count 가 1 인 MAC주소를 이용, injection 에 성공 할 수 있었습니다. volume 값은 vmdk 로 구동한 vmware 내에서 cmd 를 열어 dir 명령을 통해 확인 할 수 있습니다.

아래와 같이 volume값을 이용해서 table내에서 박부장의 디스크 정보를 가진 레코드를 Blind sql injection 기법을 통해 추출해낼 수 있었습니다. 데이터베이스 이름은 KeyDB이며, key가 들어있는 table명은 kt1509 인 것을 알 수 있었습니다.

답 : KeyDB_kt1509

답 : d8f13049cda1b0fa73d5707c750622b7

Exercise #10. 박부장 PC의 IP주소는 무엇인가요?

박부장 PC 의 IP 주소를 확인 하기 위해, volatilitynetscan을 활용 하여 메모리 덤프를 조사 해보았습니다. netscan명령어를 통해서 network 개방 상태, 특정 포트와의 연결 상태 등을 check 함으로써, 아래와 같이 local IP 또한 확인 할 수 있었습니다. TCP connection을 맺기 위해 listening 중인 localIPiexplorer 를 통해서 외부와 통신을 하는 localhost Address10.10.10.135임을 알 수 있었습니다. 박부장 PC 의 IP는 10.10.10.135인 것을 확인 할 수 있었습니다.

추가적으로, vmdk 디스크 파일을 이용하여, 직접 image 를 구동 시켜 IP를 확인 할 수 도 있었습니다. 이 과정에서는 vmdk 를 통해 구동시킨 상태이므로, 네트워크 정보가 제대로 인식 되지 않는 것을 확인 할 수 있습니다. 그러므로, registry상에 남아있던 정보를 이용해서 IP 정보 또한 확인 할 수 있었습니다. local IP address 는 역시 10.10.10.135이므로 위에서 확인한 결과가 옳은 것을 확인 할 수 있었습니다.

답 : 10.10.10.135

Conclusion

암호화 방식과 모드를 알고 있으므로, 암호화 된 파일 들을 복호화 하여 원상 복구 시킬 수 있었습니다. 아래는 python으로 작성한 랜섬웨어를 통해 암호화 된 파일들을 복호화 하는 PoC(Proof of concept) 코드입니다. 박부장의 PC에서 아래 코드를 실행하면 암호화된 67개의 파일들이 복호화 되어 저장됩니다.

#-*- coding: cp949 -*-
# writer: zairo(park.uiseong@gmail.com)

import os
from Crypto.Cipher import Blowfish

class BFCipher:
    def __init__(self, password):
        self.__cipher = Blowfish.new(password)

    def decrypt(self, file_buffer):
        try:
            clear_text = self.__depad_file(self.__cipher.decrypt(file_buffer))
        except:
            pass

        return clear_text

    def __pad_file(self, file_buffer):
        pad_bytes = 8 - len(file_buffer) % 8
        for i in range(pad_bytes - 1):
            file_buffer += chr(randrange(0, 256))

        bflag = randrange(6, 248)
        bflag -= bflag % 8 - pad_bytes
        file_buffer += chr(bflag)
        return file_buffer

    def __depad_file(self, file_buffer):
        pad_bytes = ord(file_buffer[-1]) % 8
        if not pad_bytes:
            pad_bytes = 8
        return file_buffer[:-pad_bytes]

count = 0
decrypt_key = "d8f13049cda1b0fa73d5707c750622b7"

for path, dirs, files in os.walk('C:\\'): # C드라이브의 전체 파일 스캔
    for file in files:  
        if "_enc" in os.path.splitext(file)[1].lower(): # 확장자에 _enc 확인

            f = open(path + "\\" + file, 'rb')
            signature = f.read(2)   # 2바이트 읽기
            f.close()

            sig_hex = ""
            for ch in signature:
                sig_hex += '%02x' % int(ord(ch))  # signature hex 변환

            if sig_hex != '504b':   # 'PK' signature 비교 

                print "[*] Decrypt File - " + path + "\\" + file

                filename = file.split('.')[0]
                extension = file.split('.')[1]

                buffer = None
                with open(path + "\\" + file, 'rb+') as src:    # 파일 읽기
                    buffer = src.read()
                    bfc = BFCipher(decrypt_key)
                    buffer = bfc.decrypt(buffer)    # 복호화

                with open(path + "\\" + filename + "_decrypt" + "." + extension.split('_')[0], 'wb') as dec:    #복호화된 파일 저장
                    dec.write(buffer)

                print "[*] Save File - " + path + "\\" + filename + "_decrypt" + "." + extension.split('_')[0]
                count +=1

print str(count) + "개의 파일이 복호화 되었습니다."

위의 PoC(Proof of concept) 코드를 이용해 복호화 한 본래의 프로젝트 설계서, 개선 방안 PDF 파일의 내용입니다.

박부장은.. 참 재밌는 사람인 것 같습니다. 😆

Written by Team. RebForPwn

이 블로그의 글은 개인적인 학습을 목적으로 작성된 내용이므로 사실과 다르거나 잘못 기재된 내용이 있을 수 있습니다. 올바르지 않은 내용이나 수정해야 할 사항이 있다면 park.uiseong@gmail.com으로 연락주시면 감사하겠습니다.