악성코드 공부를 처음 시작했을 때 IcedID 로더를 분석한 적이 있었는데 되게 "간단한" 분석이었습니다. 아울러 그때의 IcedID의 TTP (Tactics, Techniques, and Procedures)가 달라졌기 때문에 오랜만에 IcedID를 다시 한번 보기로 했습니다! (파일은 링크에 들어가 다운로드 가능). 그리고 파이썬 코딩은 아직 좀 약한 편인데.... 간단한 config extractor를 만들어보고 싶어서 IcedID 고른 이유도 있습니다 :)
https://bazaar.abuse.ch/sample/a60bbdf9d08eb136bb124595828f944fd292a08dd8c860beeeb6fe5e96187fef/
압축 폴더를 풀고 확인해 보니 .iso 파일하고, "Invoi_PDF"이라는 Shortcut 파일이 보입니다.
Shortcut 파일의 설정을 보고 Target을 확인해보니 "SuperciliouslyJove.js"라는 파일을 가르키고 있네요.
이 자바스크립트 파일은 shell.application을 활용하여 "ricocheted"이라는 폴더 안에 있는 potionClassy.cmd를 실행시키고, "impossiblyHalfhearted"이라는 변수에 저장되어 있는 "#1"를 보니 .dll 파일이 실행될 것 같습니다
cmd 파일은 trailers.db라는 파일을 가리키고 있는데...
dll 파일이 맞나 봅니다. 하지만 이 파일은 packed되어 있기 때문에 x64dbg로 unpacking 과정을 보여드리겠습니다.
unpacking 과정은 옛날에 제가 작성했던 IcedID 블로그와 똑같습니다. (https://0xmh.tistory.com/14)
위에 언급된 블로그에 unpacking 과정이 자세하게 나왔으니 참고하시면 됩니다! 그래도 간단하게 설명하자면 packed되어 있는 코드가 자기의 "main payload"를 unpacking하기 위해서 메모리를 할당하기 때문에 "VirtualAlloc"에 breakpoint를 박습니다. VirtualAlloc의 return 값은 RAX에 저정되기 때문에 오른쪽에 있는 RAX를 누른 다음에 "Follow in Dump" 누르면 됩니다. RAX 값은 6번 사진에서 확인할 수 있습니다. MZ header하고 "This program cannot be run in DOS mode"가 있으니 확실히 PE 파일입니다. 다음 단계는 이 PE를 dump하는 것입니다!
파일을 Pe-Bear로 열어보니 섹션들이 엉망입니다! 파일이 dump됐을 때 메모리에 적재되어 있어서 그랬습니다.
따라서 Imports들을 확인해도 아무것도 나오지 않습니다.
해결 방법이 매우 쉽습니다. Raw Addr를 Virtual Addr하고 동일하게 쓰고 수학을 조금 하면 됩니다
.text 섹션은 3000이고 .c 섹션은 1000이니 --> 3000 - 1000 = 2000
.rdata 4000 - .text 3000 = 1000
.data 5000 - .rdata 4000 = 1000 등!
완료하고 나서 PeStudio로 파일을 열면 다 정상적으로 뜹니다!
IDA로 파일을 열자마자 통신서버 decryption routine이 보이는데 그렇게 어려운 편이 아니라서 간단한 파이썬 스크립트를 써서 암호화되어 있는 통신서버를 해독할 수 있습니다!
코드는 파일 이름을 받아주고, 파일의 다양한 섹션들을 loop하며 ".d"섹션을 찾고가 합니다. (통신서버 데이터 ".d" 섹션에 저장되어 있음). 남은 코드는 IDA의 decompile된 코드를 참고하면서 간단하게 xor decryption을 파이썬으로 작성할 수 있습니다.
import pefile
file = input("Binary Path input: ")
dll_location = pefile.PE(file)
data = ""
C2 = ""
for section in dll_location.sections:
if section.Name.decode().split("\x00")[0] == ".d":
data = section.get_data()
break;
for i in range(0,0x20):
C2 = C2 + chr(data[i] ^ data[i+64])
config_C2 = C2.split("\x00")[0][4:]
print(f"C2: {config_C2}")
파이썬 스크립트의 결과는 다음과 같습니다. 분석된 파일의 C2 서버는 hxxp://zalikomanperis[.]com입니다.
IcedID가 C2 서버에 연결하는 것은 다음 사진 2개에서 확인할 수 있습니다. 먼저 WinHttpOpen라는 API로 핸들 (handle)하나 받아 WinHttpConnect API로 통신서버에 연결합니다. WinHttpReadData API로는 아마 IcedID가 실행된 다음에 다음 stage를 다운로드할 것 같습니다.
다음 stage를 다운로드하는 것뿐만 아니라 피해자의 시스템에 대한 정보도 통신서버에게 보냅니다.
피해자 정보는 다양한 변수에 저장될 것입니다:
_gads: TickCount, ZwQuerySystemInformation
_gat: 윈도우 버전
_ga: 프로세서 정보
_u: 컴퓨터 이름, 유저이름,
_io: SID 정보
_gid: 어댑터 정보
다음 stage는 C:\\ProgramData\\에 저장될 것입니다. path를 만들어 Directory도 만들고 CreateFile하고 WriteFile API로 다음 stage가 저장됩니다.
path는 ProgramData가 아닌 경우에는 GetTempPathA API로 현재의 Path를 불러오고 그 path를 a2에 저장하고 파일을 생성합니다.
SquirrelWaffle 로더 악성코드 분석 (0) | 2022.08.02 |
---|---|
Yara Rule로 DiceLoader 악성코드 사냥 | 분석 | Config Extractor (0) | 2022.06.22 |
Hancitor DLL 악성코드 분석 (0) | 2022.05.19 |
IcedID Loader 악성코드 분석 (0) | 2022.05.19 |