국내에는 게임관련 파일들을 타겟(Target)으로 제작된 랜섬웨어로 알려진 'TeslaCrypt' 혹은 'Tescrypt' 라는 이름의 악성코드는 2015년 4월 27일, CISCO 블로그("Threat Spotlight: TeslaCrypt – Decrypt It Yourself")를 통해 처음으로 복원방법이 소개되었다. 국내에서는 아직 피해사례가 많지 않지만, 감염기법에 대한 상세정보 및 복원 가능여부 확인을 통해 추후 피해가 발생 시 활용하고자 한다. 'TeslaCrypt' 랜섬웨어는 지난 4월 국내에 이슈가된 랜섬웨어 처럼 정상 프로세스(explorer.exe, svchost.exe)에 코드 인젝션(Injection)을 통한 방식이 아닌, %APPDATA% 경로에 생성한 악성코드 실행을 통해 감염이 이루어진다. 파일을 암호화하는 과정은 다음과 같다. (감염 후, 사용자 시스템에는 '.ecc' 이름의 파일만 존재)

'normal.jpg' -> 'normal.jpg'(암호화) -> 'normal.jpg.ecc' (복사본) -> 'normal.jpg'(삭제) 
                                                        (kernel32.MoveFileW)          (kernel32.DeleteFileW)

 

TeslaCrypt 랜섬웨어의 분석내용 다음과 같다.

 

1. 파일 및 레지스트리 생성

 

(1) 파일생성

%APPDATA% 경로(CSIDL_APPDATA)에 생성되는 파일들은 다음과 같다.
(%APPDATA%: C:\Documents and Settings\<username>\Application Data)

- 랜덤이름.exe (예제:asoddjv.exe)
- help.html
- log.html (감염된 파일들 목록정보)
- key.dat (파일 복호화에 사용되는 KEY 파일)

바탕화면 경로(CSIDL_DESKTOPDIR)에 아래의 파일들이 생성된다.

- CryptoLocker.lnk (%APPDATA%asoddjv.exe  파일에 대한 바로가기)
- HELP_TO_DECRYPT_YOUR_FILES.bmp (경고 윈도우화면('v4')의 내용에 대한 이미지 파일)
- HELP_TO_DECRYPT_YOUR_FILES.txt (경고 윈도우화면('v4')의 내용에 대한 텍스트 파일)

 

(2) 레지스트리 등록

자동실행을 위해 아래의 레지스트리 등록작업이 이루어진다.

- HKCU\Software\Microsoft\Windows\CurrentVersion\Run  
  > 값 이름: crypto13 (고정)
  > 값 데이터: C:\Documents and Settings\<username>\Application Data\asoddjv.exe (가변)

 

2. Mutex 생성

악성코드는 아래의 고정된 뮤텍스정보를 사용한다.

- System1230123

 

3. 볼륨쉐도우(Volume Shadow) 삭제

감염 작업을 수행하기 전, 아래의 명령(Volume Shadow copy Service(VSS) Admin)을 통해 모든 윈도우 복원 이미지를 사용할 수 없도록 한다.

- "vssadmin delete shadows /all" (참고: https://technet.microsoft.com/en-us/library/cc788026.aspx)

 

4. 감염대상 드라이브 및 파일들

TeslaCrypt 랜섬웨어는 드라이브 명에 상관없이 고정식 드라이브(DRIVE_FIXED)만을 감염대상으로 하며, 이동식, 네트워크 드라이브는 감염대상에서 제외된다.

감염대상 드라이브의 아래의 확장자를 갖는 파일들을 감염대상으로 한다. (확장자 리스트 중, .arch00, .DayZProfile, .forge, .mcgame, .rgss3a 등이 게임관련 파일들 임)

감염 제외조건은 다음의 3가지가 존재한다.

- File Extension: 파일 확장자 중 ".ecc" 를 갖는 형태
- File Name: 파일명 중 "Temporary"가 존재하는 경우
- File Size: 파일크기가 0x10000000 바이트(대략 260M 이상)보다 큰 경우

 

5. 파일복원의 핵심 ('key.dat')

%APPDATA% 경로에 생성되는 데이터 파일 중, 'key.dat' 파일은 파일이름에서 알 수 있듯이 암호화된 파일을 복원하는데 필요한 'AES Key' 정보를 담고있는 파일이다. TeslaCrypt 랜섬웨어에 감염 후, 사용자에게 보여지는 아래의 윈도우 화면창에서는 'RSA-2048' 방식으로 암호화되었으며, 복원을 위한 'Private Key'는 서버에 저장됨을 명시하고 있다. 

하지만, 실제로는 RSA 방식이 아닌 'AES' 방식으로 암호화되었으며, CBC(Cipher Block Chaining) Mode가 사용되었다. TeslaCrypt 랜섬웨어에서 사용한 암호화방식은 아래의 Python 예제코드와 같은 형태로 이루어진다. 아래의 예제코드에서 붉은색으로 표시한 'This is a key123'가 첫번째 키(AES Key)를 나타내며, 파란색으로 표시한 'This is an IV456'두번째 키(Initialization Vector)로 사용된다.

출처: https://pypi.python.org/pypi/pycrypto

>>> from Crypto.Cipher import AES
>>> obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
>>> message = "The answer is no"
>>> ciphertext = obj.encrypt(message)
>>> ciphertext
'\xd6\x83\x8dd!VT\x92\xaa`A\x05\xe0\x9b\x8b\xf1'
>>> obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
>>> obj2.decrypt(ciphertext)
'The answer is no' 

악성코드가 생성한 'key.dat' 파일에는 붉은색으로 표시한 'This is a key123' 정보가 존재하며, 파란색의 'This is an IV456' 정보에 해당하는 Initialization Vector(IV) 값은 감염파일의 첫 시작 16 바이트를 통해 얻을 수 있다. ('(3)감염파일 구조' 참고)

좀 더 정확하게는 'key.dat' 파일의 옵셋(0x177 ~ 0x197) 까지의 0x20 바이트값을 SHA256 으로 변환하는 과정을 거쳐 생성된 값이 실제 AES key (256-bits)로 사용된다.

 

(1) AES Key

'key.dat' 파일에 존재하는 AES Key 값(0x20 바이트)과 감염파일 마다 다른 IV값(0x10)을 통해 복원이 이루어질 수 있는 구조이다. 아래의 그림은 'key.dat' 파일의 내용을 나타내며, 파란색으로 표시된 부분이 AES Key 에 해당하는 0x20 바이트를 나타낸다. 해당 값은 파일시작을 기준으로 0x177 옵셋만큼 떨어진 위치에 존재하며, 전체 파일크기는 0x27C 바이트로 고정적이다.

생성된 AES Key 값은 공격자 서버에 전송되며, 아래와 같은 형태로 암호화과정을 거친 후 전송되는 구조이다.  "key=6446f0b0351eae14d01bcc70b0d4653ac1ce34887b2d23a53607c25655c8c793" 항목에 추가되는 값(1)이 AES Key 값이며, "addr=1MX9oeHq4??????????eVyd1kWrtJKozFz" 항목에 추가되는 값(2)은 BitCoin Address로 사용되는 값이다.  

악성코드 내부에 존재하는 공격자 주소는 아래와 같이 4곳이다.

- 7tno4hib47vlep5o.s2.tor-gateways.de
- 7tno4hib47vlep5o.tor2web.fi
- 7tno4hib47vlep5o.tor2web.blutmagie.de
- 7tno4hib47vlep5o.2kjb7.net

 

(2) Bitcoin Address

아래의 그림은 'key.dat' 파일의 첫 시작부터 존재하는 값(1MX9oeHq4??????????eVyd1kWrtJKozFz)이 결제를 통한 파일복원 시, 사용되는 인증 값(Bitcoin address)과 동일함을 알 수 있다. 정확한 Bitcoin address 값을 입력할 경우, 'Private Key' 를 얻기위한 결제수단으로 'Bitcoin'(2.2 BTC ~= 528 USD) 혹은 'PayPal My Cash Card(USD)' 2가지 방법을 제시한다.

테스트 목적으로 단 한번, 암호화된 파일(500kb 이하)을 복호화하는 기능을 제공하며, 웹 기반으로 파일을 업로드하는 구조이다.

 

(3) 감염파일 구조

아래의 그림은 랜섬웨어에 감염 전/후의 "겨울.jpg" 파일의 내용을 나타낸다. 감염 후 파일크기가 증가하였으며, 내부 데이터도 암호화된 것을 확인할 수 있다.

랜섬웨어에 의해 암호화된 파일은 "원본파일명.ecc" 형태이며, 변경 후의 파일들은 공통적으로 파일시작부터 0x10 바이트의 데이터는 암호화에 사용된 2차 키 값 IV(Initialization Vector)이며, 이후 LittleEndian 형태로 저장된 4바이트 값(0x00019C46)은 암호화 전 원본파일 크기정보가 저장된다. 즉, 암호화된 데이터의 시작은 감염파일 시작부터 0x14 바이트 떨어진 위치임을 알 수 있다.

실제 파일복원 시, 수행하는 작업은 다음과 같은 순서로 이루어진다.

1) key.dat 파일로 부터 AES Key 정보 0x20 바이트를 읽는다. (Offset: 0x177~0x197)
> AES Key(변환 전): 6446f0b0351eae14d01bcc70b0d4653ac1ce34887b2d23a53607c25655c8c793

2) AES Key 값을 SHA256 값으로 변환한다.
> AES Key(변환 후): 795230585896ef6e3dfdbaf694f426e60290b36b00c5b75cf028a82f2a35afc3

3) 암호화된 파일에서 얻은 IV 값과 AES Key 를 이용하여 복호화한다.
> IV 값은 *.ecc 파일의 첫 시작 16바이트

이러한 정보를 바탕으로 감염된 시스템의 'key.dat '파일과 암호화된 파일들(*.ecc)만 있으면, 아래와 같은 Python 코드로 감염된 파일들을 복원할 수 있다.

   # read_key: 'key.dat' 에서 읽은 값
   read_key = KeyBuff[0x177:0x197]
   # SHA256 변환
   h = SHA256.new()
   h.update(read_key)
   # aes_key: 실제 복원시 사용되는 AES Key
   aes_key = h.digest()

   # iv_key: '*.ecc'에서 읽은 값 
   iv_key = EncBuff[:16]
   # aes_key, iv_key 를 이용한 복호화
   obj = AES.new(aes_key , AES.MODE_CBC, iv_key)
   # enc_data: '*.ecc'에서 읽은 값
   enc_data  = encbuff[20:]
   dec_data = obj.decrypt(enc_data)

 

(4) 그 외 'key.dat' 파일의 항목들

'key.dat' 파일에 존재하는 8가지 항목의 데이터 중, 'Bitcoin address' 와 'AES Key'에 해당하는 항목은 언급되었으나 나머지 항목들의 정보는 어떠한 용도로 사용되는 지 파악하지 못하였다.

다만, 아래의 API 호출을 통해 얻은 정보들이 'key.dat' 파일의 나머지 항목들을 생성하는데 사용된다는 것은 확인되었다. 아래의 그림은 실제 아래에 언급한 API 중, CryptGenRandom 함수를 통해 얻은 0x40 크기의 데이터가 특정 함수(sub_41B3A0)를 통해 변환되는 부분을 나타낸다. 그 외 다른 API 들도 결과로 리턴된 값이 공통적으로 sub_41B3A0 함수를 통해 변환과정을 거치며, 최종 변환값이 'key.dat'에 사용되는 것을 확인할 수 있다.

아래의 그림은 위와 동일하게 GlobalMemoryStatus, GetCurrentProcessId API 호출을 통해 얻은 결과값이 sub_41B3A0 함수를 통해 변환과정이 이루어짐을 나타낸다.

아래의 API 들이 'key.dat' 파일의 데이터를 생성하는데 사용되는 것으로 감염 시스템의 다양한 정보들(Process, Thread, Module, Heap)이 이용됨을 알 수 있다. 감염이 이루어질 때마다 'key.dat' 파일의 데이터가 다르게 생성되는 것도 아래의 API 들의 영향으로 추정된다.

 

[NETAPI32]

- NetStatisticsGet(0, "LanmanWorkstation", 0, 0, &buf)
- NetStatisticsGet(0, "LanmanServer", 0, 0, &buf)

[ADVAPI32]

- CryptAcquireContextW(&hProv, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)
- CryptGenRandom(hProv, 0x40, &buf)

- CryptAcquireContextW(&hProv, 0, "Intel Hardware Cryptographic Seervice Provider", PROV_INTEL_SEC, 0)
- CryptGenRandom(hProv, 0x40, &buf)

[kernel32]

- CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0)

- GetTickCount
- Heap32ListFirst
- Heap32First
- Heap32Next
- GetTickCount
- Heap32ListNext
- GetTickCount

- GetTickCount
- Process32First
- Process32Next
- GetTickCount

- GetTickCount
- Thread32First
- Thread32Next
- GetTickCount

- GetTickCount
- Module32First
- Module32Next
- GetTickCount

- GlobalMemoryStatus
- GetCurrentProcessId

아래의 그림은 key.dat 파일의 8가지 세부 항목별로 데이터를 Write 하는 부분을 나타낸다. 마지막 8번째 추가되는 항목은 GetLocalTime API 를 통해 얻은 시간정보(16바이트)로 붉은색 블럭을 나타낸다. 

각 세부 항목별 데이터의 의미 및 어떻게 사용되는 지 부분에 대한 분석은 추후 진행할 예정이다.

 

5. 프로세스 강제종료

감염 쓰레드가 구동 후, 2번째로 생성하는 쓰레드에서는 아래의 이름(GetProcessImageFileNameW)으로 실행되는 프로세스를 강제로 종료(TerminateProcess)하는 기능을 갖는다. 단순히, 프로세스 이름만으로 비교가 이루어짐으로 이름을 변경하여 실행 시, 정상적으로 실행할 수 있다.

- taskmgr
- procexp
- regedit
- msconfig
- cmd.exe

 

6. 참고사이트

- http://blogs.cisco.com/security/talos/teslacrypt
- https://blogs.mcafee.com/mcafee-labs/teslacrypt-joins-ransomware-field
- https://blog.kaspersky.com/teslacrypt-ransomware-targets-gamers/
- http://www.microsoft.com/security/portal/threat/encyclopedia/entry.aspx?Name=Ransom:Win32/Tescrypt.A#tab=2
- http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

 

해당 악성코드에 대한 V3 진단명은 다음과 같다.

- Trojan/Win32.Tescrypt (md5: 03c1a14c715e3a41f36b026a11a1bcb4)

 

또한, 아래의 경로에서 제공하는 전용백신을 통해 ".ecc" 이름으로 암호화된 파일들에 대한 복원이 가능하며, 'key.dat' 파일이 %AppData% 경로에 존재해야 한다.

- http://www.ahnlab.com/kr/site/download/product/downVacc.do?fileName=v3_TeslaDecryptor.exe

 

신고
Creative Commons License
Creative Commons License
Posted by yhayoung