CyberChef를 이용한 PBKDF2 기반 암호화 데이터 복호화

CyberChef를 이용한 PBKDF2 기반 암호화 데이터 복호화

일반적으로 멀웨어에서 사용되는 암호화 방식은 하드코딩된 Key, IV 에 AES 와 같이 잘 알려진 알고리즘을 사용하는 것이다. 이런 경우 Key 와 IV 가 코드에 하드코딩되거나 런타임 도중 생성되기 때문에 Cyberchef 로 쉽게 복호화할 수 있다.

하지만 최근 발견된 멀웨어는 이러한 암호화 방식에 PBKDF2 를 추가해 복호화 과정을 분석하기 어렵게 만들었다. PBKDF2 은 무차별 대입 공격에 대한 취약성을 줄이기 위해 주어진 비밀번호와 Salt를 사용해 무작위 값을 생성한다. 이렇게 생성된 값은 AES 와 같이 알려진 알고리즘에 사용됨으로써 비밀번호 크래킹을 어렵게 만든다.

분석가인 우리에게 중요한 점은 이런 방법으로 암호화된 데이터를 어떻게 쉽게 복호화하느냐이다. 이 글에서는 Cyberchef 로 PBKDF2와 AES 를 이용해 암호화된 데이터를 복호화하는 방법에 대해 설명한다.

1. FileInfo

  • MD5 : 25596412BE7A34C82C30F4652AE38CF3
  • SHA256 : 7D7789F9E30220D886BF7C37F3DBC7BE0ADC361A451FFAD333E087EE72D92ECE
  • FileType : exe (.NET)
  • 비고 : PhatomStealer

예제 샘플은 MalwareBazaar 에서 다운로드할 수 있다.

해당 파일은 정보 탈취 기능을 가진 멀웨어이므로 반드시 격리된 환경에서만 테스트하기를 권고한다.

2. 복호화 코드 분석

다음은 테스트 샘플의 암호화된 문자열을 복호화하는 과정이다.

문자열 복호화 흐름도

복호화 과정은 PBKDF2와 AES 알고리즘 단계로 나뉜다. PBKDF2 는 다음과 같은 하드코딩된 입력 값을 이용하여 AES 에 사용할 Key, IV 값을 생성한다.

다음은 샘플에서 사용되는 PBKDF2 데이터 생성, AES 복호화 코드다.

문자열 복호화 코드

.NET 프레임워크에서는 Rfc2898DeriveBytes 클래스를 사용해 PBKDF2 알고리즘을 이용할 수 있다.

Rfc2898DeriveBytes 클래스 문서

참고로 Key Size 가 384인 이유는 AES 에서 사용할 Key 가 32 바이트, IV 가 16바이트로 총 48바이트를 요구하며 이를 위해 PBKDF2의 실행 결과는 총 48바이트(384비트)를 생성해야 하기 때문이다.

샘플에서 사용되는 PBKDF2 입력 값은 다음과 같다.

  • Passphrase : 3b 26 4b 46 21 4d 21 68 38 5e 69 54 3a 3c 29 61 3f 7e 6d 58 65 4e 2a 7e 6f 3f 67 4e 5b 76 40 72 51 3d 42
  • Key size : 384
  • Iteration : 1000
  • Hashing Function : SHA1
  • Salt : 66 33 6f 33 4b 2d 31 31 3d 47 2d 4e 37 56 4a 74 6f 7a 4f 57 52 72 3d 28 74 4e 5a 42 66 4b 2b 62 53 37 46 79

CyberChef 에서 Derive PBKDF2 key 를 선택하여 적절하게 옵션을 입력하면 다음과 같은 48 바이트 hex 값이 생성된다.

475f6e68e30d296766cc730b6c882653a5eb9a04031812ff0426d081f1fc86bd54f5712a1b6304a9bce604684434bc81

이제 생성된 48바이트를 앞의 32바이트, 뒤의 16바이트로 나누어 AES 알고리즘의 Key, IV 로 사용한다.

  • Key : 475f6e68e30d296766cc730b6c882653a5eb9a04031812ff0426d081f1fc86bd
  • IV : 54f5712a1b6304a9bce604684434bc81

다음은 입력 값 A0PtIFR6FC2+7dtbdcVP9w26FTrRmH70J9Utnh+wtOkTirhICQdsHONOgKECMQtc 을 주어진 Key 와 IV 로 복호화한 결과다.

AES 복호화 결과