1. 개요
○ 북한 해킹 그룹 Lazarus가 사용한 IP Messenger(IPMsg)* 설치 파일로 위장한 악성코드 확보 후 분석
* IP Messenger : 동일한 네트워크 사용자간 채팅 및 파일 전송 등을 지원하는 무료 네트워크 메신저
○ 악성 설치 파일은 정상 설치 파일과 동일한 파일명 사용하고, 악성 행위 수행 전 정상 설치 파일을 생성 및 실행해 사용자로부터 악성코드 실행을 은폐
○ 여러 악성 DLL들을 파일리스 방식으로 실행해 최대 3개의 C2 서버와 지속적인 통신이 가능하며 유사 백도어처럼 동작하는 것으로 분석
•
각 DLL 파일은 샌드박스나 자동화 도구에서 단독으로 실행되는 것을 막기 위한 안티리버싱 코드가 존재해 악성코드 분석 방해 및 검사 우회를 시도
○ C2로부터 ZIP 파일로 압축된 악성 DLL을 다운로드 및 실행하여 추가 악성 행위를 수행
[그림 1] 공격 흐름도
2. 대응방안
○ 신뢰할 수 없는 사이트에서의 파일 다운로드 자제 및 공식 다운로드 페이지 이용
○ 다운로드한 파일의 해시 값과 제조사에서 제공하는 해시 값 비교를 통한 무결성 검증
3. 악성코드 상세분석
3.1. ipmsg5.6.18_installer.exe - 로더 복호화 및 실행
○ 악성 설치 파일은 사용자를 속이기 위해 정상 설치 파일과 동일한 파일명을 사용했지만, 파일 정보 및 해시는 [그림 2]이나 [그림 3]과 같이 다른 것으로 확인되었으며 정상 설치 파일의 경우 악성 설치 파일과 달리 디지털 서명 존재
[그림 2] 정상 및 악성 설치 파일 해시 비교
[그림 3] 정상 및 악성 설치 파일 정보 비교
[그림 4] 정상 설치 파일만 존재하는 디지털 서명
○ 내부에서 XOR로 암호화된 데이터가 확인되었고 복호화 후 추출해 데이터를 확인한 결과 Export 디렉토리에서 “ATT_Loader_DLL.dll”이라는 DLL명 정보가 확인
[그림 5] 파일 복호화 알고리즘 일부
[그림 6] 복호화된 PE 파일
[그림 7] ATT_Loader_DLL.dll의 Export 디렉토리
○ 복호화된 DLL은 [표 1]의 과정을 거쳐 파일리스 방식으로 메모리에 로드
단계 | 행위 |
1 | 로드를 위한 가상 메모리 할당 |
2 | PE 데이터를 파싱하여 데이터를 가상 메모리에 복사 |
3 | Relocation 테이블을 파싱해 데이터 재배치 |
4 | Import 테이블을 구성 |
5 | 가상 메모리 보호 속성을 변경 |
6 | 로드된 DLL의 EntryPoint를 호출 |
[표 1] 파일리스 로드 과정
[그림 8] 로드된 ATT_Loader_DLL.dll의 EP 호출 코드
○ 이후 PE 헤더를 파싱하여 로드된 DLL의 Export 테이블에서 WinOrgBinW 함수를 검색 후 “3.2 ATT_Loader_DLL.dll”에서 설명할 안티리버싱에 사용되는 “tonimo” 문자열을 파라미터로 전달하여 실행
[그림 9] WinOrgBinW 함수 검색 코드 일부
[그림 10] ATT_Loader_DLL.dll의 WinOrgBinW 함수 실행 코드
3.2. ATT_Loader_DLL.dll - 추가 로더 복호화 및 실행
○ 호출된 WinOrgBinW 함수는 샌드박스 혹은 자동화 도구 등에서 DLL 단독으로 실행되는 것을 막기 위해 전달된 파라미터가 "tonimo" 문자열과 일치하는지 확인하는 안티리버싱 코드가 존재
[그림 11] 안티리버싱 코드
○ 안티리버싱을 통과했다면 %APPDATA% 폴더에 정상 설치 파일과 동일한 해시 값을 가지는 installer.exe 파일을 생성
[그림 12] installer.exe 생성 코드
[그림 13] %APPDATA% 폴더에 생성된 installer.exe
[그림 14] 정상 설치 파일로 확인된 installer.exe
○ 생성한 installer.exe(정상 설치 파일)을 실행해 악성 설치 파일의 실행을 은폐
[그림 15] installer.exe 실행 코드
[그림 16] 악성 설치 파일에 의해 실행된 정상 설치 파일
○ 정상 설치 파일을 실행 후 “3.1 ipmsg5.6.18_intstaller.exe”와 동일한 과정을 통해 데이터 복호화 및 파일리스 방식으로 로드 후 Export 테이블에서 GetsPrintW 함수를 검색 후 호출
○ 로드된 데이터를 추출한 후 확인한 결과 “Loader1.dll”이라는 DLL명 정보 확인
[그림 17] Loader1.dll의 Export 디렉토리
[그림 18] Loader1.dll의 GetsPrintW 함수 실행 코드
3.3. Loader1.dll 분석 - 다운로더 복호화 및 실행
○ 호출된 WinOrgBinW 함수는 전달된 문자열이 “evolic”인지 확인하는 안티리버싱 코드 이후 앞선 파일들과 유사한 [표 2]의 동작을 수행하는 스레드를 생성
○ 로드된 데이터를 추출한 후 확인한 결과 “Dll64.dll”이라는 DLL명 정보가 확인
단계 | 행위 |
1 | 파일리스로 실행할 데이터 복호화 |
2 | 복호화한 파일을 파일리스로 로드 후 실행 |
3 | Export 테이블에서 GetWindowSizedW 함수를 검색 |
4 | GetWindowSizedW 함수에 “0701” 문자열을 전달하여 호출 |
[표 2] Loader1.dll 행위
[그림 19] 스레드 생성 코드
[그림 20] Dll64.dll의 GetWindowSizedW 함수 호출 코드
[그림 21] Dll64.dll의 Export 디렉토리
3.4. Dll64.dll 분석 - 다운로더(유사 백도어)
○ 호출된 GetWindowSizedW 함수는 “0701” 문자열을 생성할 스레드에 전달해 앞선 파일들과 달리 전달된 문자열 길이를 체크하는 안티리버싱 수행
[그림 22] 생성할 스레드로 “0701”를 전달
[그림 23] 전달된 문자열 길이를 체크하는 안티리버싱 코드
○ 이후 해당 문자열 사용해 C2 통신 시 사용할 [표 3]과 같은 구성의 ID를 생성
Loader1.dll 전달 문자열 | 버전 정보 | 무작위 문자 10자리 |
“0701” | “64” | “qUqq67805L” |
[표 3] DNS Query를 시도한 도메인
[그림 24] ID 생성 코드 일부
[그림 25] C2 통신을 위한 ID 생성
○ C2 통신에 사용할 주소는 하드 코딩된 3개의 주소 중 하나가 무작위로 선택되지만, 확보한 샘플에는 3개 모두 동일한 주소(hxxps://cryptocopedia[.]com/upgrade/latest.asp)가 사용
•
해당 주소 외의 다른 주소가 추가적으로 사용되었을 가능성 존재
[그림 26] 동일한 주소로 하드 코딩된 C2
[그림 27] 무작위 C2 선택 코드
○ 통신은 무작위 문자열 길이로 표현되어 전달되는 [표 4]의 Code 정보를 통해 데이터 교환이 이루어지며, 네트워크상에서 악성 행위를 숨기기 위해 base64 인코딩과 무작위 문자열을 사용해 데이터를 난독화
Code | 정보 |
10 | C2와의 연결을 위해 감염 사실 공지 |
7 | 추가 악성 행위를 수행할 파일 다운로드 정보 요청 |
12 | 다운로드 파일의 악성 행위 수행 결과 전송 |
11 | 디버깅 용 에러 문자열 전송 |
[표 4] C2 통신에 사용되는 Code 정보
[그림 28] 난독화된 패킷 데이터
[그림 29] base64 인코딩 코드
[그림 30] 무작위 문자열 생성 코드 일부
○ C2 통신을 통해 감염 정보를 전송한 악성코드는 C2에서 latest.asp 파일 데이터를 획득 후 복호화를 통해 다운로드할 파일의 MD5, 파일 크기, 수신 크기 등의 정보를 확인하고 [표 5]의 flag를 설정
Flag | 상태 | 행위 |
0 | C2에서 의미 있는 데이터 획득에 실패한 경우
C2에서 획득한 데이터가 “0x00 0x00”로 시작하는 경우 | C2 변경 |
1 | C2에서 획득한 데이터가 “0x01 0x00”로 시작하는 경우 | 현재 C2에서 재시도 |
2 | C2에서 획득한 데이터의 복호화 및 파싱에 성공한 경우 | 추가적인 데이터 획득 |
-1 | C2에서 획득한 데이터가 “0x0d 0x00”로 시작하는 경우 | 프로세스 종료 |
[표 5] 사용된 flag 정보
[그림 31] flag에 의해 분기되는 코드 일부
○ 다운로드 파일 정보 데이터를 성공적으로 파싱한 후 flag 2가 설정되었다면 [표 6]의 과정을 따라 추가 파일을 다운로드
No | 정보 |
1 | C2로 Code 7 패킷을 전송하여 다운로드 시작을 공지 |
2 | 파일 다운로드 |
3 | C2로 Code 7 패킷을 전송하여 다운로드 완료를 공지 |
4 | MD5를 계산하여 무결성 확인 |
[표 6] 파일 다운로드 및 처리 과정
[그림 32] Code 7 패킷 전송 코드 일부
[그림 33] 파일 다운로드 코드 일부
[그림 34] MD5 검증 코드 일부
○ C2 서버가 닫혀있어 다운로드 파일에 획득이 불가능하여 이후 동작 분석을 진행
[그림 35] C2 서버 DNS 쿼리 실패 로그
○ 다운로드 파일에서 ZIP 파일의 시그니처 문자열 “PK” 검색을 수행하는 것으로 보아 해당 파일은 압축 파일로 사료되며, 압축 해제 후 파일리스 방식으로 메모리에 로드 후 Export 함수를 실행하고 그 결과를 Code 12 패킷을 사용해 전송하는 것으로 분석
[그림 36] PK 문자열 검색 코드
[그림 37] fileless로 로드하는 코드
[그림 38] Export 함수 실행 코드 일부
[그림 39] 실행 결과 전송 코드 일부
○ 무한루프와 무작위 Sleep과 함께 C2와 지속적으로 통신하며 악성 행위를 수행
[그림 40] 무한루프를 통한 C2 통신 코드 일부
4. IoC 정보
NO | Type | Data | Info |
1 | MD5 | a7b23cd8b09a3ce918a77de355e9d3e5 | ipmsg5.6.18_installer.exe |
2 | MD5 | a31f8f6e6078f9f59d195e3e2f29d1b3 | ATT_Loader_DLL.dll |
3 | MD5 | 8459e1c6f6c1d3996b3a86146eb961bf | Loader1.dll |
4 | MD5 | d4e2bd08c8366be665e54592dec1a7ce | Dll64.dll |
5 | C2 | hxxps://cryptocopedia[.]com/upgrade/latest.asp | 추가 악성코드 다운로드 |



_%EC%A0%95%EC%83%81_%EC%95%85%EC%84%B1_%ED%95%B4%EC%8B%9C_%EB%B9%84%EA%B5%90.png&blockId=1f5f216a-760c-8079-833b-d91c1e9a7edf)
_%EC%A0%95%EC%83%81_%EC%95%85%EC%84%B1_%ED%8C%8C%EC%9D%BC_%EC%A0%95%EB%B3%B4_%EB%B9%84%EA%B5%90.png&blockId=1f5f216a-760c-8047-9efc-db0d5d955db2)
_%EC%A0%95%EC%83%81_%ED%8C%8C%EC%9D%BC_%EB%94%94%EC%A7%80%ED%84%B8_%EC%84%9C%EB%AA%85.png&blockId=1f5f216a-760c-8019-b3f1-c867c6934e3b)
_ATT_Loader_DLL_%EB%B3%B5%ED%98%B8%ED%99%94_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-803b-a515-c24f33423bb8)
_ATT_Loader_DLL_%EB%B3%B5%ED%98%B8%ED%99%94_%ED%9B%84_%EB%8D%B0%EC%9D%B4%ED%84%B0.png&blockId=1f5f216a-760c-80d5-a38c-ce9529794196)
_Export_%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90%EC%84%9C_%ED%99%95%EC%9D%B8%ED%95%9C_DLL%EB%AA%85.png&blockId=1f5f216a-760c-8052-bfea-e6b69f20d8f4)
_%EB%A1%9C%EB%93%9C%EB%90%9C_ATT_Loader_DLL.dll%EC%9D%98_EP_%ED%98%B8%EC%B6%9C_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-80b2-9a1c-ceb3c17c3fa5)
_WinOrgBinW_%ED%95%A8%EC%88%98_%EA%B2%80%EC%83%89_%EC%BD%94%EB%93%9C_%EC%9D%BC%EB%B6%80.png&blockId=1f5f216a-760c-800c-a7d5-c6eff9c4bc69)
_ATT_Loader_DLL.dll%EC%9D%98_WinOrgBinW_%ED%95%A8%EC%88%98_%EC%8B%A4%ED%96%89_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-8097-9cf0-c6a8b727e6b7)
_%EC%95%88%ED%8B%B0%EB%A6%AC%EB%B2%84%EC%8B%B1_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-80f8-93ab-d7df8767af65)
_installer.exe_%EC%83%9D%EC%84%B1_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-80d4-a58a-cd448b6e3a70)
_APPDATA_%ED%8F%B4%EB%8D%94%EC%97%90_%EC%83%9D%EC%84%B1%EB%90%9C_installer.png&blockId=1f5f216a-760c-80a1-b09e-fdf0246c40c1)
_%EC%A0%95%EC%83%81_%EC%84%A4%EC%B9%98_%ED%8C%8C%EC%9D%BC%EB%A1%9C_%ED%99%95%EC%9D%B8%EB%90%9C_installer.png&blockId=1f5f216a-760c-8074-889e-db8db69d9258)
_installer.exe_%EC%8B%A4%ED%96%89_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-801b-915c-e471f0e3aee0)
_%EC%95%85%EC%84%B1_%EC%84%A4%EC%B9%98_%ED%8C%8C%EC%9D%BC%EC%97%90_%EC%9D%98%ED%95%B4_%EC%8B%A4%ED%96%89%EB%90%9C_%EC%A0%95%EC%83%81_%EC%84%A4%EC%B9%98_%ED%8C%8C%EC%9D%BC.png&blockId=1f5f216a-760c-8094-b07c-c3d8ced19687)
_Export_%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90%EC%84%9C_%ED%99%95%EC%9D%B8%ED%95%9C_DLL%EB%AA%85.png&blockId=1f5f216a-760c-80c0-a261-c0a07a3b5cdf)
_Loader1.dll%EC%9D%98_GetsPrintW_%ED%95%A8%EC%88%98_%EC%8B%A4%ED%96%89_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-802a-9b99-d0c2dcd6de42)
_%EC%8A%A4%EB%A0%88%EB%93%9C_%EC%83%9D%EC%84%B1_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-8080-ab29-e83788175bc5)

_Dll64.dll%EC%9D%98_Export_%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC.png&blockId=1f5f216a-760c-80ba-abab-efce92b9935c)
_0701_%EC%A0%84%EB%8B%AC_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-80ce-ba72-c4582cca71f1)
_%EB%AC%B8%EC%9E%90%EC%97%B4_%EA%B8%B8%EC%9D%B4_%EC%B2%B4%ED%81%AC_%EC%95%88%ED%8B%B0%EB%A6%AC%EB%B2%84%EC%8B%B1.png&blockId=1f5f216a-760c-8025-bb14-e428b68fbb4e)
_ID_%EC%83%9D%EC%84%B1_%EC%BD%94%EB%93%9C_%EC%9D%BC%EB%B6%80.png&blockId=1f5f216a-760c-804a-ab2f-ed775abdef52)
_C2_%ED%86%B5%EC%8B%A0%EC%9D%84_%EC%9C%84%ED%95%9C_ID.png&blockId=1f5f216a-760c-8052-849c-c7dedd79a454)
_%ED%95%98%EB%93%9C_%EC%BD%94%EB%94%A9%EB%90%9C_C2.png&blockId=1f5f216a-760c-8096-bab4-ce846879340e)
_C2_%EC%84%A0%ED%83%9D_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-80b4-a879-cc6acf969b9b)
_%EB%82%9C%EB%8F%85%ED%99%94%EB%90%9C_%ED%8C%A8%ED%82%B7_%EB%8D%B0%EC%9D%B4%ED%84%B0.png&blockId=1f5f216a-760c-8092-8de9-d90581279615)
_base64_%EC%9D%B8%EC%BD%94%EB%94%A9_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-80a7-9d16-f94967390456)
_%EB%AC%B4%EC%9E%91%EC%9C%84_%EB%AC%B8%EC%9E%90%EC%97%B4_%EC%83%9D%EC%84%B1_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-804e-97ff-ec6d66ba05ab)
_flag%EC%97%90_%EC%9D%98%ED%95%B4_%EB%B6%84%EA%B8%B0%EB%90%98%EB%8A%94_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-80db-b491-e33674052e69)
_%EC%BD%94%EB%93%9C_7_%ED%8C%A8%ED%82%B7_%EC%A0%84%EC%86%A1_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-8085-9ef3-e3de362e119b)
_%ED%8C%8C%EC%9D%BC_%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C_%EC%BD%94%EB%93%9C_%EC%9D%BC%EB%B6%80.png&blockId=1f5f216a-760c-80bb-be51-ff41f4f8806f)
_MD5_%EA%B2%80%EC%A6%9D_%EC%BD%94%EB%93%9C_%EC%9D%BC%EB%B6%80.png&blockId=1f5f216a-760c-8048-a2e4-f86f9047c4f3)

_PK_%EB%AC%B8%EC%9E%90%EC%97%B4_%EA%B2%80%EC%83%89_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-80fc-938d-d0a71a62f6da)
_fileless_%EB%A1%9C%EB%93%9C_%EC%BD%94%EB%93%9C_%EC%9D%BC%EB%B6%80.png&blockId=1f5f216a-760c-80c8-aaa5-eb9644baa989)
_Export_%ED%95%A8%EC%88%98_%ED%98%B8%EC%B6%9C_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-8061-bb6b-ea923385a03f)
_%EC%BD%94%EB%93%9C_12%EB%A1%9C_%EC%8B%A4%ED%96%89_%EA%B2%B0%EA%B3%BC_%EC%A0%84%EC%86%A1.png&blockId=1f5f216a-760c-803d-892e-f6889f84a3bc)
_%EB%AC%B4%ED%95%9C%EB%A3%A8%ED%94%84%EB%A5%BC_%ED%86%B5%ED%95%9C_%EC%A7%80%EC%86%8D%EC%A0%81%EC%9D%B8_C2_%ED%86%B5%EC%8B%A0.png&blockId=1f5f216a-760c-8038-831b-d495921fb6cb)
