LummaStealer 악성코드 정적분석
1. 파일 유형 식별
.exe 확장자를 가짐 -> 윈도우 실행 파일로 추정.
보다 정확한 유형을 파악하기 위해 파일 시그니처를 확인했다. 파일의 첫 바이트가 헥사 문자 4D 5A라는 시그니처를 가지므로, 윈도우 실행 파일이 맞았다.
리눅스 시스템의 file 유틸리티를 이용해서도 파일을 식별해 봤다.
PE32 executable : 32비트 윈도우 실행파일
-> 악성코드 바이너리는 32비트 실행 파일이란 사실을 알 수 있다.
ChatGPT 이용으로 얻은 추가 정보
GUI : 윈도우 GUI 프로그램
.Net assembly : .NET으로 작성된 프로그램(.NET malware일 가능성 높음)
Intel 80386 : 32비트 x86 아키텍처
3 sections : 섹션 구조가 정상(보통 .text, .data, .rsrc 등)
2. 악성코드 식별
다중 백신 스캐닝 서비스를 이용하기 위해 암호 해시를 생성했다. 리눅스에서는 md5sum, sha256sum, sha1sum 도구를 이용해 파일 해시를 생성할 수 있다. 아래는 MD5 해시를 생성한 결과이다.

b0a74444c30f85f59c12e85e26a9113
->파일 고유 해시값. 이를 이용해 바이러스토털에 질의할 수 있다. 질의 결과 아무것도 나오지 않았는데, 내가 잘못 생성한 것인지 의문스러웠다...
pestudio 같은 PE 분석 도구를 사용하면, 바이너리의 해시 값을 바이러스토털 데이터베이스에 자동 질의한 후 아래와 같은 결과를 보여준다. pestudio의 경우 SHA-256 해시를 이용한다.
3. 문자열 추출
문자열 추출을 위해 리눅스 시스템의 strings 유틸리티를 사용할 수 있다. 그러나 strings 결과가 너무 길어서, GPT의 도움을 받아 필터링해서 해당 문자열을 포함하는 것만 걸러냈다.
$ strings LummaStealer.exe | grep -iE 'http|\.bat|\.exe|cmd|powershell|ftp|del|run|temp|user|pass|reg'
접은 글은 명령어 실행 후의 결과이다.
!This program cannot be run in DOS mode.
System.Runtime.CompilerServices
RuntimeCompatibilityAttribute
System.Runtime.InteropServices
System.Runtime.Versioning
3.exe
MulticastDelegate
System.Collections.ObjectModel
Regex
System.Text.RegularExpressions
RegexOptions
System.ComponentModel
RuntimeTypeHandle
RuntimeHelpers
RuntimeFieldHandle
System.Runtime.Remoting
Delegate
CreateDelegate
GetDelegateForFunctionPointer
DebuggerNonUserCodeAttribute
SUsSystem.Runtime.InteropServices.CharSet, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
lSystem.Resources.ResourceReader, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSet
lSystem.Resources.ResourceReader, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSet
m_useUserOverride
System.Globalization.TextInfo%System.Globalization.NumberFormatInfo'System.Globalization.DateTimeFormatInfo&System.Globalization.GregorianCalendar
m_useUserOverride
m_useUserOverride
m_useUserOverride
&System.Globalization.GregorianCalendar
&System.Globalization.GregorianCalendar
+System.Globalization.GregorianCalendarTypes
+System.Globalization.GregorianCalendarTypes
lSystem.Resources.ResourceReader, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSet
CmD0448
jrEg
RuN*
5KFtpU
vWreg
위의 결과 중 의미 있는 부분 몇 가지를 GPT 덕분에 추출해냈다.
- Regex, System.Text.RegularExpressions, RegexOptions -> C2 명령 파싱, 키로거 입력 감지 등에 사용.
- MulticastDelegate, Delegate, CreateDelegate, GetDelegateForFunctionPointer -> 동적 함수 호출을 사용해서 행위 또는 난독화 가능성 있음.
- RuntimeTypeHandle, RuntimeFieldHandle, RuntimeHelpers -> 리플렉션 내부 구조 조작, 난독화 우회 등에서 사용.
- System.Resources.ResourceReader, System.Resources.RuntimeResourceSet -> 리소스 영역에 악성 데이터 저장 가능성.
- 3.exe -> 의심스러운 파일명 ..다른 프로그램을 호출하는 악성코드 기능
FLOSS
FLOSS는 악성코드에서 난독화된 문자열을 자동으로 추출하고 식별하고자 디자인된 도구이다. 실행해 보는데 VM의 용량이 부족해서 실패했다..
4. 파일 난독화 파악
Exeinfo PE로 패커 또는 크립터를 탐지한다. EP Section이 .text라고 나오므로 패커나 크립터가 사용되지 않았을 가능성이 크다.
5. PE 헤더 정보 조사
1) 파일 의존성과 임포트 조사
악성코드는 운영 시스템에서 제공하는 함수를 많이 의존한다. 악성코드가 의존하는 DLL과 DLL이 임포트하는 API 함수를 조사하면 악성코드의 기능과 성능, 실행 중 예상할 수 있는 기능을 알 수 있다.
pestudio에서 libraries 클릭하면 의존성을 가진 모든 DLL 파일과 각 DLL에서 임포트한 임포트 함수의 수를 보여준다. 사진과 같이 mscoree.dll 이 하나이고, 이 DLL 파일이 160개의 함수를 임포트하고 있다.
pestudio에서 imports 클릭하면 DLL에서 임포트한 API 함수를 표시한다. blacklist 열을 통해 악성코드가 자주 사용하는 API 함수가 'MemoryStream'임을 보여준다. GPT에게 물어본 결과, 이는 종종 암호화된 페이로드 디코딩/로드에도 사용된다고 한다.
그외 159개의 모든 함수를 분석하진 못했으나, 꽤나 많은 함수들이 의심스러움을 확인할 수 있었다.
.ctor, .cctor : 생성자/정적 생성자 (.NET) -> 실행 초기에 동작. 악성코드 로직이 숨겨져 있을 가능성.
invoke, get_item, Add : 리플렉션 또는 컬렉션 조작 함수, invoke는 리플렉션 기반 함수 호출 가능성 높음 -> 동적 실행 흔적.
m8DD7084B7FBC4F7 : 난독화/암호화 문자열 의심
RSACryptoServiceProvider : RSA 공개키/비밀키 암호화 사용 클래스. C2 서버와 키 교환 등에 자주 사용.
AesCryptoServiceProvider, SymmetricAlgorithm, RijndaelManaged : 대칭키 암호화 클래스들. 악성 페이로드, 설정값, C2 정보 암호화 시 자주 사용.
RuntimeTypeHandle, Module : 리플렉션 관련 메타데이터 접근자, 코드 동적 실행 / 난독화된 메서드 로딩 가능.
*C2(Command and Control) : 악성코드가 외부와 통신하는 서버 또는 시스템. 악성코드는 주인한테 명령을 받거나 데이터를 보내야 할 때가 있는데, 그 주인 역할을 하는 서버가 C2 서버이다.
2) 익스포트 조사
DLL은 실행 파일이 임포트할 수 있는 함수를 노출한다. DLL은 단독으로 실행할 수 없기 때문에 호스트 프로세스를 통해 실행한다. 악의적인 함수를 익스포트하는 DLL을 자주 생성한다.
이것 역시 pestudio로도 확인할 수 있지만, 런타임 에러로 확인이 어려워 파이썬 pefile 모듈을 사용해 익스포트 함수를 나열하고자 했다. 이렇게 아무것도 안 뜨는 것으로 보아 export 함수가 없는 것으로 추정했다.
3) PE 섹션 테이블과 섹션 조사
이것 역시 pestudio의 sections 탭에서 확인할 수 있으나 런타임 에러로 확인이 어려웠다.
4) 컴파일 타임스탬프 조사
PE 헤더는 바이너리가 컴파일될 때 생성되는 정보를 포함한다. 이 필드를 조사하면 악성코드가 언제 처음 생성됐는지 알 수 있다.
파이썬 명령어를 사용해 컴파일 타임스탬프를 확인했다.
5) PE 리소스 조사
리소스 해커는 의심 바이너리에서 리소스를 조사하고 확인 후 추출할 수 있는 도구다. 사진처럼 리소스 해커에 악성코드를 로드하면 리소스 2개를 볼 수 있다.
첫 번째 리소스 : PE 파일의 Version Info 리소스 -> 3, 3.exe등은 자동 생성되었거나 위장 파일일 가능성. 또한 정보의 일관성이 없어 악성코드 제작자가 임의값으로 넣는 패턴과 유사하다.
두 번째 리소스
헤더의 EF BB BF 3C 3F 78 6D는 XML 형식의 데이터임을 알려준다. 다만 이 정보는 Editor View로 봐도 보이는 정보 같았다...
- EF BB BF -> UTF-8 BOM
- 3C 3F 78 6D -> XML 시작 태그
6. 악성코드 비교와 분류
의심 바이너리를 공개 및 사설 저장소에 저장된 샘플, 이전 분석 샘플 등과 비교하면 유사성을 파악할 수 있다.
퍼지 해싱을 위해 ssdeep을 활용해서 퍼지 해시를 생성해 봤다.
퍼지 해시 : 49152:257zTSUEMolkBbVVfSPwgJEFhApHfmkA4J7kPA/SPoRd9f7Z7b/GLfiYG:E30XebVBAwggShnJ74A6PoV1b+
L6
해당 퍼지 해시를 virustotal에 검색했음에도 아무것도 뜨지 않았다. 그외 이전 분석 샘플 같은 것은 존재하지 않아서 비교도 어려웠다.