<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=939333007162424&amp;ev=PageView&amp;noscript=1">
 

    AI 딥페이크 사칭 캠페인 후속 Python 백도어 위협 분석

    Python Backdoor Threat Analysis Following an AI Deepfake Impersonation Campaign

    ◈ 주요 결과 (Key Findings)

    • 이메일에 ZIP 압축된 LNK 악성파일을 첨부한 스피어피싱으로 초기 접근 수행
    • 항공권 전자티켓, 북한연구 행사 초대, 국방·경찰 공무원 사칭 등 호기심 유발 테마 사용
    • LNK 실행 시 환경변수 기반 난독화 명령으로 배치파일을 호출하여 추가 페이로드 다운로드
    • 동일한 환경변수 치환 기법이 적용된 BAT 파일을 연쇄 실행하며 C2와 통신 지속
    • C2에서 .cat 확장자의 Compiled Python Script 악성코드를 내려받아 후속 행위 수행
    • 난독화·다단계 다운로드 악용 행위를 식별할 수 있는 행위 기반 EDR 대응 체계 강화 필요


     

    1. 개요 (Overview) 

    지니언스 시큐리티 센터(Genians Security Center)는 배치파일 난독화 명령 호출 기법과 Compiled Python 기반 악성코드를 결합한 APT37 연관성이 의심되는 위협 캠페인을 포착하였습니다.

    본 위협은 이메일 기반 스피어피싱을 통해 ZIP 압축 파일 형태로 유포되며, 내부에 포함된 LNK(바로가기) 파일 실행을 유도하는 방식으로 시작됩니다. 사용자가 해당 파일을 실행할 경우, 환경변수 기반 문자열 치환 기법을 통해 실제 명령이 복원되며, 이후 추가 페이로드를 순차적으로 다운로드 및 실행하는 구조로 전개됩니다.

    분석 결과, 위협 행위자는 항공권 전자티켓 확인서, 북한 연구 관련 행사 초청, 국방·경찰 분야 공무원 사칭 등 수신자의 관심을 유도할 수 있는 다양한 주제를 미끼로 활용하여 첨부파일 실행을 유도한 것으로 확인되었습니다.

    사용자가 압축 파일을 해제한 후 LNK 파일을 실행하면, 내부에 포함된 난독화 명령이 동작하면서 BAT 파일을 다운로드 및 실행하게 됩니다. 이후 동일한 환경변수 기반 문자열 재조합 기법이 적용된 추가 스크립트가 실행되며, 이를 통해 C2 서버와 통신하고 후속 페이로드를 수신하는 다단계 감염 흐름이 이어집니다.

    최종 단계에서는 .cat 확장자로 위장된 Compiled Python 바이트코드(.pyc) 형태의 악성코드가 다운로드되며, 이는 Python 실행 환경을 통해 동작하는 원격 명령 실행형 백도어로 분석되었습니다.

    특히 본 사례에서 확인된 환경변수 기반 배치파일 난독화 방식은 지난해 9월 15일 공개된 'AI 딥페이크 기반 군 공무원증 위조 APT 캠페인' 보고서 사례와 유사한 특징을 보이며, C2 인프라 측면에서도 한국의 카페24 서비스와 프랑스(FR) 도메인이 비슷하게 악용된 점이 식별되었습니다.

    이러한 점을 종합할 때, 이번 사례는 국가 배후 위협 그룹이 사용해 온 사회공학 기법, 스크립트 난독화, 다단계 다운로드형 침투 구조와 높은 유사성을 보이고 있습니다.

    이에 따라 식별된 침해지표(IoC) 기반 탐지와 더불어, 난독화 스크립트 실행, 비정상 명령 호출, 다단계 다운로드 행위를 식별할 수 있는 행위 기반 EDR 대응 체계의 강화가 필요합니다.

     

    [그림 1-1] 경찰 공무원 사칭 공격 사례 흐름

    [그림 1-1] 경찰 공무원 사칭 공격 사례 흐름

     

     

    2. 배경 (Background) 

    APT37 그룹은 국방·안보·대북 분야 종사자를 주요 표적으로 삼아, 스피어피싱과 사회공학 기법, 스크립트 난독화, 다단계 페이로드 다운로드를 결합한 침투 전술을 지속적으로 고도화해 왔습니다. 이 그룹은 다국적제재모니터링팀(MSMT, Multilateral Sanctions Monitoring Team) 보고서를 통해 조직도가 공개된 바 있습니다.

    보고서에 따르면 해당 위협 그룹은 북한 국무위원회 체계에 속한 정보기관인 국가보위성(Ministry of State Security)과 연계된 사이버 위협 행위자로 분류됩니다. 이 조직은 주로 대북 분야 인사를 대상으로 악성 사이버 스파이 활동과 자국의 이익을 위한 방첩 활동 등을 벌여 왔습니다.

    지난 3월 언론보도에 따르면 북한은 기존의 국가보위성을 국가정보국으로 개칭이 이루어진 것으로 알려진 바 있는데, 이는 체제 보위 중심의 기존 성격에서 벗어나 정보 수집 기능을 강화하고, 대외 정보기관으로서의 역할을 확대하려는 조직 개편으로 해석됩니다. 아울러 2025년 9월 북한은 군 총참모부 산하 대외 공작기구인 정찰총국을 정찰정보총국으로 확대 개편한 것으로 알려졌는데, 이는 대외 정보 획득 역량과 사이버 작전 기능을 강화하기 위한 조치로 평가됩니다.

    두 조직의 명칭에 공통적으로 '정보'라는 표현이 포함된 점은, 북한이 보위·정찰 조직의 기능을 보다 정보 중심적으로 재정의하고 있음을 보여주는 대목입니다. 이는 단순한 명칭 변경을 넘어 정보 수집과 분석, 활용 역량을 제도적으로 강조하려는 방향성과도 맞닿아 있는 것으로 볼 수 있습니다.

    북한의 특성상 내부 조직 체계를 외부에서 정확히 파악하기 어렵고, 조직 개편이나 인력 배치 이동이 이루어질 가능성도 반드시 염두에 둘 필요가 있습니다. 이러한 구조적 특성으로 인해 특정 사이버 위협 행위자의 배후 조직을 규명하거나 귀속(Attribution)하는 과정에서는 해석에 주의가 필요합니다.

    시점에 따라 조직 간 관계나 소속이 달라질 수 있으며, 특정 위협 행위자가 다른 조직으로 재배치되거나 필요에 따라 상호 협력하여 작전을 수행할 가능성도 상존합니다. 이 경우 동일한 인력, 도구, 인프라가 여러 조직에서 혼용될 수 있어, 악성 코드나 공격 도구, 인프라 특성만을 근거로 배후를 단정할 경우 위협 귀속 과정에서 오류나 오판이 발생할 가능성이 있습니다.

    한편, APT37의 배후로 지목된 이른바 'andydad'의 GitHub 저장소는 2020년부터 약 3년간 운영된 것으로 확인되었으며, 이 저장소에서 다수의 악성 파일과 페이로드 스테이징(Payload Staging) 인프라 활용 정황이 식별되었습니다. 이와 함께 해당 인프라의 외부 노출로 이어진 운영보안(OPSEC) 실패 정황이 확인되었으며, 공격 벡터에 활용된 다량의 관련 정보 또한 채증되었습니다.

     

    [그림 2-1] 위협 행위자의 깃허브 저장소 화면

    [그림 2-1] 위협 행위자의 깃허브 저장소 화면

     

    당시 APT37 그룹은 Windows 도움말 파일(CHM), HTML 응용 프로그램 파일(HTA), 한컴오피스 문서 파일(HWP), Microsoft Excel 추가 기능 파일(XLL), 매크로 기반 Microsoft Office 문서 파일, 바로가기 링크 파일(LNK) 등 다양한 형식의 악성 파일을 활용하였습니다.

    그런 가운데 2025년 3월 20일, 한국의 보안기업 하우리에서는 'APT37 공격 그룹의 지속적 위협 공격' 제목의 상세분석 보고서를 발간하였습니다. 해당 보고서에서는 APT37 그룹 인프라와 연계된 다수의 악성 LNK 파일이 확인되었습니다.

    LNK 바로가기 파일이 실행되면 PowerShell이 현재 경로에서 특정 크기의 .lnk 파일을 찾아 지정된 오프셋 영역의 데이터를 추출한 뒤, 이를 임시 경로(%TEMP%)에 _ms3360.bat 파일로 저장하고 숨김 창으로 실행합니다.

    여기서 생성된 배치 파일에는 환경변수 기반 문자열 치환을 통해 실제 명령을 재조합하는 난독화 기법이 적용되어 있으며, 변종에 따라 파일명은 _pK3772.bat, _wS1825.bat, _ms3360.bat의 세 가지 형태로 확인됩니다.

    이어서 C2 서버에서 추가 다운로드된 WStemp163.cab 내부에는 난독화된 Python 스크립트가 포함되어 있습니다. 해당 스크립트는 Windows의 CBS(Component-Based Servicing) 로그와 유사한 주석 데이터를 대량으로 삽입해 정상 파일처럼 위장하고, 실제 코드는 일부만 중간에 배치하여 악성 로직 식별을 어렵게 만드는 주석 기반 위장 기법을 사용합니다. 그 다음 C2 서버에서 MicroAppsTemp28h2.bat 파일을 다운로드하여 실행하는 순서를 거칩니다.

    이와 같은 배경은 본 사례의 위협 연계성을 판단하는 데 있어 중요한 비교 기준으로 작용합니다.

    지난해 보고된 AI 딥페이크 기반 군 공무원증 사칭 사례에서는 cafe24[.]com 계열 발신지와 versonnex74[.]fr 첨부파일 링크가 사용되었고, ZIP 압축 내부의 악성 LNK 파일 실행 이후 PowerShell 호출과 추가 배치 파일 다운로드·실행으로 이어지는 공격 흐름이 확인되었습니다.

    또한, 유사 사례로 제시된 통일학술연구 단체 사칭 LNK 기반 공격에서도 같은 이름의 _ms3360.bat 파일과 비슷한 이름의 MStemp109.cab 파일이 사용되었으며, 환경변수 기반 문자열 치환과 분기 설정 문구, 주석 기반 위장된 Python 스크립트 등 동일 계열의 난독화 기법이 관찰되어 전술적 유사성이 확인됩니다.

    이번 사례에서도 cafe24[.]com 발신지와 프랑스 소재 choisy[.]fr 기반 C2가 확인되었습니다. 특히 단순히 도메인 등록 국가가 유사한 수준을 넘어, 사용된 IP가 51.158.21[.]1 주소로 동일하다는 점은 주목할 필요가 있습니다.

    아울러 환경변수 기반 배치 스크립트 난독화 이후 후속 페이로드를 다운로드하는 실행 흐름 역시 확인되어, 인프라 운용 방식, 사회공학적 유인 구조, 초기 실행 기법 측면에서 기존 위협 활동과의 높은 유사성이 식별됩니다.

    종합하면, 이번 사례는 기존 공개 사례와 전술·기법·인프라 전반에서 높은 연속성을 보이며, APT37 그룹과 연계된 위협 활동의 연장선상에 있는 것으로 평가됩니다.

     

     

    3. 공격 시나리오(Attack Scenario)

    본 캠페인은 스피어피싱 이메일을 통한 초기 접근, 압축파일 내부 LNK 실행, 난독화된 BAT 스크립트 연쇄 호출, 외부 C2 접속, Compiled Python Script 기반 최종 페이로드 실행의 순서로 진행되는 다단계 감염 구조를 가집니다.

    위협 행위자는 먼저 수신자의 관심사와 업무 맥락을 고려한 이메일을 발송합니다.

     

    [그림 3-1] 스피어피싱 사례별 화면들

    [그림 3-1] 스피어피싱 사례별 화면들

     

    확인된 미끼 주제는 항공권 전자티켓, 포털사 이메일 아이디 충돌, 북한연구 관련 행사 초청, 국방·경찰 분야 공무원 신분 사칭 등으로, 사용자가 자연스럽게 열어보도록 설계되어 있습니다.

    이메일에는 대체로 ZIP 압축파일이 링크 또는 첨부되며, 내부에는 문서처럼 보이도록 위장된 LNK 파일이 포함됩니다. 사용자가 압축 해제 후 LNK 파일을 실행하면, 바로 악성 실행 파일이 동작하는 것이 아니라 cmd.exe를 통해 환경변수 기반 문자열 치환이 포함된 난독화 명령이 먼저 수행됩니다.

    이 과정은 실제 명령행을 직접 노출하지 않고, 여러 환경변수와 치환 문자열을 조합해 실행 시점에만 최종 명령을 복원하도록 구성되어 있습니다.

    복원된 명령은 C2 원격지에서 BAT 스크립트를 내려받아 실행하는 역할을 수행합니다. 이후 BAT 파일은 다시 유사한 형태의 난독화 기법을 사용하여 감염 체인을 연장합니다. 최종 단계에서는 .cat 확장자를 사용하는 Compiled Python Script 형태의 악성코드가 다운로드되어 실행됩니다.

    해당 파일은 정상 파일로 오인될 수 있는 확장자를 사용하지만, 실제로는 Python 기반으로 제작된 원격 제어형 악성코드로 동작합니다. 이를 통해 위협 행위자는 지속성 확보, 추가 명령 실행, 파일 수집, 시스템 정보 탈취 등 후속 행위를 수행할 수 있습니다.

    요약하면 본 위협은 사용자의 실행을 유도하는 사회공학 기법과, 분석 및 탐지를 회피하기 위한 문자열 치환 난독화, 그리고 다단계 다운로드 구조를 결합하여 초기 침투 이후 실제 목적 페이로드를 은닉하는 형태로 전개됩니다.

     

     

    4. 상세 분석 (Detailed Analysis) 


    4-1. 초기 유입 (Initial Access)

    초기 유입에 사용된 악성 파일은 다수의 변종이 확인되었으며, 본 보고서에서는 4월 중순에 식별된 경찰 공무원 사칭 형태의 최신 샘플을 대표 사례로 선정하여 상세 분석을 수행하였습니다.

    본 공격은 이메일을 통해 Windows Shortcut(LNK) 파일이 포함된 압축 파일을 전달하는 스피어 피싱 방식으로 수행되었습니다. 위협 행위자는 압축 파일 내부에 바로가기 파일을 포함시키고, 이를 업무 문서 또는 공공기관 관련 자료처럼 인식하도록 위장함으로써 사용자의 실행을 유도하였습니다.

    사용자가 압축 해제 후 LNK 파일을 실행할 경우, 겉으로는 정상 문서를 열람하는 것처럼 보이지만 실제로는 백그라운드에서 악성 명령이 함께 수행되는 구조로 확인되었습니다.

    특히 본 사례에서는 정상 문서로 인식될 수 있는 파일명을 사용한 미끼 문서가 함께 실행되도록 구성되어 있어, 사용자는 단순히 문서를 열어본 것으로 인식할 가능성이 높았습니다.

    이와 같은 방식은 사용자의 경계심을 낮추고 초기 실행 성공률을 높이기 위한 전형적인 사회공학 기법으로 분석되었습니다.

    LNK 기반 공격은 비교적 오래된 기법으로 알려져 있으나, 현재에도 다양한 위협 행위자가 반복적으로 활용하는 효과적인 초기 침투 수단으로 확인되고 있습니다.

    즉, 일반 사용자가 업무 과정에서 무심코 열람할 수 있는 파일 형식을 악용해 실제 침해로 연결된다는 점에서 지속적인 주의가 요구되었습니다.

     

    4-2. 실행 및 난독화 기법 (Execution & Obfuscation)

    해당 LNK 파일의 내부 명령행에는 환경 변수 기반 문자열 재조합 난독화 기법이 적용되었습니다.

    LNK는 cmd.exe /k 인자 형태로 실행되며, 우선 a9390f0 환경 변수에 긴 문자열을 저장한 뒤 %a9390f0:~offset,1% 형태의 부분 문자열 참조 구문을 이용해 필요한 문자만 순차적으로 조합하는 방식으로 실제 명령을 구성하였습니다.

     

    [그림 4-1] LNK 파일 내부 인자값

    [그림 4-1] LNK 파일 내부 인자값

     

    이 방식은 실행 구문 전체를 직접 노출하지 않고 명령어, 옵션, 파일 경로, URL, 변수명 등을 문자 단위로 분산시켜 재조합하도록 설계된 형태입니다.

    그 결과 정적 분석 과정에서 실제 실행 구문을 즉시 식별하기 어렵고, 위협 분석가 또는 보안 솔루션이 명령의 목적을 직관적으로 파악하는 것을 지연시키는 효과를 가졌습니다.

    원본 명령 복원 결과, LNK는 cmd.exe를 통해 난독화 문자열을 해석한 뒤 최종적으로 powershell -executionpolicy bypass -command 구문을 호출하는 구조로 확인되었습니다. 즉, 이 단계에서는 cmd.exe가 초기 난독화 해석을 담당하고, 후속 파일 다운로드 및 실행 제어는 PowerShell 스크립트가 수행하는 방식이었습니다.

    복원된 PowerShell 구문에서는 정상 시스템 경로에 존재하는 C:\Windows\System32\curl.exe를 %TEMP% 경로에 RpJjgMB.exe로 복사하려는 의도가 확인됩니다.

    그러나 경로 결합 과정에서 구분자(\)가 누락되어 실제로는 %LOCALAPPDATA%\TempRpJjgMB.exe 경로에 생성되며, 이후 해당 파일을 후속 다운로드 도구로 활용하는 행위가 확인되었습니다.

     

    [그림 4-2] 원본 명령 복원 결과

    [그림 4-2] 원본 명령 복원 결과

     

    이와 같이 운영체제 기본 제공 실행 파일인 curl.exe를 악용하는 방식은 일반적으로 LOLBins(Living-Off-the-Land Binaries) 기법으로 분류할 수 있습니다.

    반면, 이후 단계에서 사용된 pythonw.exe는 Windows 기본 제공 구성 요소가 아니라 정상 소프트웨어 배포본에 포함된 실행 파일이므로, 동일한 의미의 LOLBins로 분류하기보다는 정상 소프트웨어를 악용한 실행 환경 구성으로 보는 것이 보다 정확합니다.

    분석 결과, LNK 단계에서는 한국내 C2 서버 kmot.co[.]kr의 board.php 경로를 통해 두 개의 파일이 순차적으로 다운로드되었습니다.

    첫 번째는 정상 문서로 위장한 '사이버범죄 신고시스템(ECRM).hwp' 파일이었으며, 두 번째는 후속 악성 행위를 수행하는 배치 파일 'GuFLjO7q.bat'였습니다.

    이 중 HWP 파일은 사용자에게 표시되는 미끼(Decoy) 문서 역할을 수행하였고, BAT 파일은 별도로 실행되어 실제 감염 흐름을 이어가는 역할을 수행하였습니다.

    즉, 위협 행위자는 사용자에게는 정상 문서를 열람한 것처럼 보이도록 유도하는 동시에, 백그라운드에서는 별도의 스크립트를 통해 후속 악성 행위를 수행하는 이중 실행 구조를 적용한 것으로 확인되었습니다.

     

    4-3. 2차 페이로드 실행 (Secondary Payload Execution)

    LNK를 통해 실행된 GuFLjO7q.bat 역시 환경 변수 기반 문자열 재조합 방식의 난독화가 적용된 형태로 확인되었습니다.

    해당 배치 파일은 Windows 명령 해석기(cmd.exe) 환경에서 동작하는 스크립트로, 내부에서는 curl, mkdir, tar, del, ren, schtasks 등의 명령을 재조합하여 실행하도록 구성되어 있었습니다.

     

    [그림 4-3] 복호화된 배치 파일 명령어

    [그림 4-3] 복호화된 배치 파일 명령어

     

    복원 결과, 배치 파일은 우선 정상 python.org에서 python-3.10.0-embed-amd64.zip 파일을 다운로드하였으며, 이를 C:\Users\Public\temp012.zip 경로에 저장한 뒤 후속 압축 해제 과정에 활용하였습니다.

    이어서 C:\Users\Public\Music\MusicLibrariesPackage 경로를 생성하고, 해당 ZIP 파일을 압축 해제하여 Python Embed 실행 환경을 구성하였습니다.

    이 과정에서 python.exe는 삭제되었고, pythonw.exe는 codeflush.exe로 이름이 변경되었습니다. 분석상 이는 정상 Python 인터프리터의 원래 식별성을 제거하고, 일반 실행 파일처럼 보이도록 위장하기 위한 조치로 해석되었습니다.

    특히 pythonw.exe는 콘솔 창 없이 실행 가능한 특성을 가지므로, 사용자 인지 없이 백그라운드에서 동작하는 환경을 구성하는 데 적합한 선택으로 판단되었습니다.

    이후 배치 파일은 C2 서버로부터 settingenv.cat 파일을 추가로 다운로드하였습니다.

    분석 결과 해당 파일은 정상적인 Windows 보안 카탈로그(.cat) 파일이 아니라, Python 바이트코드(.pyc) 형식의 컴파일 파일로 확인되었습니다. 

    위협 행위자는 정상 Python Embed 패키지를 실행 기반으로 활용하고, 악성 스크립트는 .cat 확장자로 위장하여 저장함으로써 전체 감염 흐름을 보다 은밀하게 유지하도록 설계한 것으로 분석되었습니다.

    이와 같은 방식은 운영체제에 별도 프로그램을 정식 설치하지 않고도 독립적인 실행 환경을 빠르게 구성할 수 있다는 점에서 위협 행위자에게 유리하게 작용하였습니다.

    또한 정상 소프트웨어 배포 서버를 이용해 런타임을 확보함으로써, 네트워크 행위 자체의 악성 의심도를 낮추는 효과도 기대할 수 있었습니다.

     

    4-4. 지속성 확보 (Persistence)

    배치 파일의 최종 목적은 단순한 추가 파일 다운로드에 그치지 않고, 감염 이후 지속적으로 악성 페이로드가 실행되도록 환경을 고정하는 데 있었습니다.

    이를 위해 배치 파일은 Windows 예약 작업을 생성하여 지속성을 확보하였습니다.

    예약 작업명은 MicrosoftMusicLibrariesPackageTaskMachine으로 확인되었습니다.

    해당 명칭은 Microsoft 관련 정상 시스템 작업처럼 보이도록 설계되어 이용자의 육안 식별을 어렵게 만드는 특징을 보였습니다.

    예약 작업은 1분 간격으로 반복 실행되도록 설정되었으며, 실행 명령은 아래와 같이 구성되었습니다.

     

    C:\Users\Public\Music\MusicLibrariesPackage\codeflush.exe C:\Users\Public\Music\MusicLibrariesPackage\settingenv.cat

    [표 4-1] 예약 작업 실행 명령

     

    즉, 위장된 실행 파일인 codeflush.exe가 settingenv.cat 파일을 인자로 받아 주기적으로 실행되는 구조였습니다.

    이로 인해 시스템 재부팅 여부와 관계없이 악성 코드가 지속적으로 재실행될 수 있는 기반이 마련되었습니다.

    특히 1분 단위의 짧은 실행 주기는 프로세스 종료, 오류 발생 또는 사용자 개입 등의 상황에서도 빠르게 악성 동작을 복구하기 위한 목적으로 설정된 것으로 분석되었습니다.

     

    4-5. Python Bytecode 분석 (Python Bytecode Analysis)

    앞선 분석 단계에서 확인된 바와 같이, 배치 파일은 C2 서버로부터 settingenv.cat 파일을 다운로드하여 MusicLibrariesPackage 경로에 저장하였습니다. 해당 파일은 후속 실행 단계에서 핵심 역할을 수행하는 구성 요소로 판단되어 구조 분석을 수행하였습니다.

    settingenv.cat 파일은 확장자상 Windows 보안 카탈로그 파일(.cat)로 위장되어 있으나, 내부 구조 분석 결과 Python 바이트코드(.pyc) 형식의 컴파일 파일로 식별되었습니다.

     

    [그림 4-4] settingenv.cat 파일 헤더 구조

    [그림 4-4] settingenv.cat 파일 헤더 구조

     

    Python 바이트코드 파일(.pyc)은 Python 소스 코드가 컴파일되어 생성된 중간 코드 형태로, Python 인터프리터에 의해 직접 로드 및 실행됩니다. 이러한 파일은 실행 환경과의 호환성 검증을 위해 파일 시작부(Header)에 Magic Number 및 부가 정보를 포함합니다.

    Python 3.7 이후 버전에서는 PEP 552에 따라 확장된 헤더 구조가 사용됩니다. 여기서 PEP(Python Enhancement Proposal)는 Python 언어와 표준 구현의 기능, 구조, 정책 등을 제안하고 문서화하는 공식 설계 문서 체계입니다.

    Hex Editor를 통해 settingenv.cat 파일의 헤더 영역을 분석한 결과, 다음과 같은 구조가 확인되었습니다.

    • Offset 0x00 ~ 0x03: 6F 0D 0D 0A
    • Offset 0x04 ~ 0x07: 01 00 00 00
    • Offset 0x08 ~ 0x0F: 00 00 00 00 00 00 00 00
    • Offset 0x10: E3 (Code Object 시작)

    먼저, 파일 시작부의 6F 0D 0D 0A 값은 Python 바이트코드 파일의 Magic Number 형식과 일치합니다. Python .pyc 파일의 Magic Number는 총 4바이트로 구성되며, CPython 기준으로 앞의 2바이트(6F 0D)에는 Python 버전별 바이트코드 식별 값이 Little-endian 형식으로 저장되고, 뒤의 2바이트(0D 0A)에는 Carriage Return Line Feed(CRLF) 값이 결합되는 구조를 가집니다.

    여기서 CPython은 C 언어로 구현된 Python의 표준 인터프리터를 의미하며, 일반적으로 python.exe 또는 pythonw.exe로 실행되는 공식 Python 배포판을 지칭합니다.

    본 샘플에서 확인된 6F 0D 값은 Python 3.10.0의 Magic Number 값(3439)을 Little-endian 방식으로 표현한 값이며, 여기에 0D 0A가 결합된 형태로 구성되어 있습니다. 이를 통해 해당 파일이 Python 3.10 계열에서 생성되었거나, Python 3.10 실행 환경을 대상으로 제작된 바이트코드임을 확인할 수 있습니다.

    이는 앞선 단계에서 공격자가 python-3.10.0-embed-amd64.zip 파일을 다운로드하여 Python 실행 환경을 구성한 행위와도 일치합니다.

    이어지는 01 00 00 00 값은 Python 3.7 이후 도입된 PEP 552에서 정의된 Flags 영역에 해당하며, 해당 값은 본 파일이 기존 timestamp 기반이 아닌 hash 기반 방식으로 생성된 .pyc 파일임을 의미합니다.

    다만 Flags 이후에 위치한 8바이트 영역은 일반적으로 hash 또는 timestamp 관련 정보가 저장되는 구간이나, 본 샘플에서는 모든 값이 0x00으로 설정되어 있었습니다. 이는 정상적인 .pyc 파일에서 기대되는 소스 정보가 포함되지 않은 비정상적인 형태로, 원본 소스와의 연결 정보를 제거하거나 분석 및 추적을 어렵게 하기 위한 의도적인 조치로 판단됩니다.

    특히 hash 기반 .pyc 구조에서 해시 값이 존재하지 않는 경우는 일반적인 Python 동작과 부합하지 않기 때문에, 실행에는 영향을 주지 않는 범위 내에서 메타데이터를 무력화한 것으로 해석됩니다.

    이후 Offset 0x10에서 0xE3 값이 확인되었으며, 이는 Python marshal 포맷에서 Code Object의 시작을 나타내는 식별자입니다. 즉, 해당 지점부터 실제 실행 가능한 Python 바이트코드가 포함되어 있음을 의미합니다.

    즉, settingenv.cat 파일은 단순 데이터 파일이 아닌, Python 인터프리터에 의해 직접 실행되는 코드 객체를 포함한 컴파일 파일로 확인되었습니다. 또한 앞서 구성된 Python 실행 환경(codeflush.exe)을 통해 해당 바이트코드가 실행되는 구조로, 실제 악성 행위를 수행하는 핵심 페이로드로 기능하는 것으로 분석되었습니다.

    이후 0xE3 이후 영역을 기반으로 코드 객체를 추출하고, Python 바이트코드를 분석 가능한 형태로 변환하기 위해 디컴파일을 수행하였습니다.

    디컴파일 결과, settingenv.cat 파일 내부에는 Python 코드 형태가 일부 복원되었으나, 전체적으로 문자열 및 주요 구성 요소가 난독화된 상태로 유지되어 있는 것이 확인되었습니다.

    특히 코드 초기 영역에서 다음과 같은 특징이 확인되었습니다.

     

    [그림 4-5] 디컴파일된 Python 코드 초기 영역

    [그림 4-5] 디컴파일된 Python 코드 초기 영역

     

    디컴파일 결과, settingenv.cat 내부 코드는 일반적인 Python 코드처럼 주요 문자열과 모듈명을 직접 노출하지 않고, chr() 함수를 이용해 문자 단위로 조합하거나 [::-1] 연산을 통해 역순 문자열을 복원하는 방식으로 구성되어 있었습니다.

    또한 __import__ 함수는 직접 호출하지 않고 getattr(__builtins__, "__import__") 형태로 접근하여 필요한 모듈을 동적으로 로드하도록 구현되어 있었습니다.

    코드 내부에서는 os, base64, urllib.request, urllib.parse, sys, io 등의 모듈이 사용되었으나, 해당 모듈명은 모두 chr() 기반 문자열 조합을 통해 은닉되어 있었습니다. 또한 C2 URL, HTTP 헤더명(Cookie, User-Agent), 전송 파라미터(data), 인코딩 문자열(utf-8) 등 주요 분석 단서 역시 동일한 방식으로 난독화되어 있었습니다.

     

    [그림 4-6] 난독화된 문자열 복원

    [그림 4-6] 난독화된 문자열 복원

     

    이러한 난독화는 디컴파일 이후에도 코드의 의미를 즉시 파악하기 어렵게 만들며, 문자열 기반 탐지 및 분석을 지연시키기 위한 목적으로 사용됩니다.

    이에 따라 chr() 조합 문자열과 역순 처리 구문을 복원하고, 동적 import 구조를 해석하여 실제 수행 기능을 식별하는 추가 분석을 수행하였습니다.

    난독화 해제 결과, 해당 코드는 감염 시스템의 사용자 정보를 기반으로 식별 토큰을 생성한 뒤, C2 서버와 통신하여 명령을 수신하고 이를 실행하는 구조로 확인되었습니다.

    코드 내부에서는 os.getlogin()을 통해 현재 로그인 사용자명을 수집하고, 이를 사전에 정의된 문자열과 조합한 뒤 Base64로 인코딩하여 token 값을 생성합니다.

    생성된 token 값은 이후 C2 통신 시 HTTP Cookie 헤더에 포함되며, 감염 호스트를 식별하기 위한 값으로 사용되는 것으로 분석되었습니다. 이후 코드는 urllib.request를 이용해 kmot.co[.]kr의 board.php 경로로 HTTP 요청을 전송하고, C2 서버로부터 응답 데이터를 수신합니다.

    수신된 응답 데이터는 Base64로 인코딩된 Python 코드 형태로 처리되며, 코드 내부에서는 이를 디코딩한 뒤 exec() 함수를 통해 실행하도록 구성되어 있었습니다. 또한 실행 과정에서 표준 출력(stdout)을 io.StringIO() 객체로 리다이렉션하여, 실행 결과를 문자열 형태로 수집하는 동작이 확인되었습니다.

    이후 수집된 실행 결과는 원격에서 전달받은 명령 코드와 함께 다시 Base64로 인코딩되며, data 파라미터에 포함되어 C2 서버로 POST 전송됩니다.

    분석 결과, settingenv.cat는 단순한 다운로더가 아니라 C2 서버로부터 명령을 수신하고 이를 실행한 뒤 결과를 다시 전송하는 Python 기반 원격 명령 실행형 백도어(Backdoor)로 확인되었습니다.

    이러한 동작은 원격에서 감염 시스템을 제어할 수 있는 구조를 제공하며, C2 서버가 전달하는 Python 코드에 따라 기능이 동적으로 확장될 수 있는 특징을 보였습니다.

    따라서 해당 악성코드는 전형적인 RAT(Remote Access Trojan) 계열에서 관찰되는 제어 구조와 유사한 동작 방식을 갖는 것으로 평가되었습니다.

     

     

    5. 위협 귀속 (Threat Attribution)


    5-1. 과거 위협 사례

    APT37 그룹은 2020년, HWP 문서 파일에 OLE 개체를 삽입하고, 이를 통해 Adobe Flash Player 취약점인 CVE-2018-15982를 유발하는 방식의 공격을 수행한 이력이 있습니다.

     

    [그림 5-1] 프로필 양식.hwp 악성 파일 전달 화면

    [그림 5-1] 프로필 양식.hwp 악성 파일 전달 화면

     

    특히 OLE 개체에는 플래시 취약점 악용 파일을 호출하기 위한 외부 연결 주소가 포함되어 있었으며, 이 과정에서 C2 서버 sjem.co[.]kr 도메인이 사용되었습니다.

    해당 공격 인프라는 일회성으로 사용된 것이 아니라 약 2년에 걸쳐 반복적으로 관측되었습니다. 플래시 취약점에 대한 보안 패치가 배포되었음에도, 패치가 적용되지 않은 일부 사용자 환경에서는 동일한 공격 악용 방식이 여전히 유효했으며, 이를 통해 장기간 위협이 지속될 수 있었습니다.

     

    [그림 5-2] 플래시 취약점 호출 주소

    [그림 5-2] 플래시 취약점 호출 주소

     

    C2 서버와 통신이 수행되면, 추가 플래시 취약점 동작을 통해 원드라이브 저장소에 저장된 바이너리 데이터를 다운로드하고 이후 동작을 계속 이어갑니다.

     

    [그림 5-3] CWS 시그니처를 가지는 zlib 압축 SWF 파일

    [그림 5-3] CWS 시그니처를 가지는 zlib 압축 SWF 파일

     

    이때 확인된 최종 페이로드 HncUpdate.exe 파일은 2020-11-11 01:20:09 (UTC)에 제작된 정보유출 기능의 악성 파일이며, 내부에 포함된 PDB 경로를 통해 "Chinotto"라는 프로젝트명으로 널리 알려져 있습니다.

    • D:\VSWorkspace\chinotto\Release\Chinotto.pdb

    참고로 "Chinotto"는 이탈리아 감귤류 과일 및 이를 기반으로 한 탄산음료를 의미하는 용어입니다.

    본 악성 파일은 haeundaejugong[.]com, kumdo[.]org C2 서버로 이용자 정보를 수집해 유출을 시도하게 됩니다.

     

    [그림 5-4] Chinotto.pdb 문자열 화면

    [그림 5-4] Chinotto.pdb 문자열 화면

     

    당시 시점에 유사한 악성 파일들은 다양한 C2 인프라를 사용했는데, 대표적으로 ljs5950.cafe24[.]com, hanainternational[.]net, kjdnc.gp114[.]net, luminix[.]kr, sunlin[.]org, ezvm[.]kr, intobiz[.]kr 등이 있습니다.

     

    [그림 5-5] 2022년에 이용된 공격 메일 화면

    [그림 5-5] 2022년에 이용된 공격 메일 화면

     

    위협 행위자는 docx, hwp, exe 등 다양한 유형의 악성 파일과 C2 서버를 사용하였습니다. 다양한 사례들과 위협 인프라를 비교해 보면 유사성을 볼 수 있습니다.

     

    THEME

    TYPE

    C2

    IP

    'andydad'의 GitHub 저장소

    chm

    attiferstudio[.]com/install.bak/sony/10.html

    121.78.88[.]93

    평화 연구원 사칭

    exe

    haeundaejugong[.]com/editor/chinotto/do.php

    121.78.88[.]88

    서울 유엔 인권 사무소 사칭

    docx

    sunlin[.]org/adm/phpMyAdmin/info/style.php

    211.169.73[.]104

    민주평통 사무처 사칭

    hwp

    hanainternational[.]net/editor/data/font.php

    121.78.88[.]92

    경찰 수사관 사칭

    exe

    intobiz[.]kr/bbs/data/bbs62/blog.php

    121.78.88[.]93

    [표 5-1] 공격 유형별 C2 서버 비교

     

    3개의 C2 기능을 수행하는 PHP 파일에서는 공통적인 문자열 은닉 기법이 식별됩니다. 주요 문자열은 평문으로 직접 저장되지 않고, 동일한 길이의 더미 문자열을 선언한 뒤 [System.Text.Encoding]::UTF8.GetBytes()를 통해 바이트 배열로 변환됩니다.

    이후 각 배열 인덱스에 대해 두 개의 정수 상수를 XOR(-bxor) 연산하여 실제 문자열을 구성하는 바이트 값을 복원하며, 이러한 연산이 문자열 길이만큼 반복 수행됩니다.

     

    [그림 5-6] XOR 문자열 난독화 유사성 비교

    [그림 5-6] XOR 문자열 난독화 유사성 비교

     

    최종적으로 복원된 바이트 배열은 GetString() 호출을 통해 문자열로 재구성되며, 해당 과정은 실행 시점에만 수행되는 특징을 가집니다.

     

    5-2. 동일한 계정 반복 사용 흔적

    2026년 4월, 위협 행위자가 경찰 수사관을 사칭해 사용한 미끼(Decoy) 파일 중 사이버범죄 신고시스템(ECRM).hwp 문서가 확인되었습니다.

     

    [그림 5-7] 미끼 문서에 기록된 Lailey 계정명

    [그림 5-7] 미끼 문서에 기록된 Lailey 계정명

     

    해당 HWP 문서는 2026년 4월 17일 금요일 오전 11시 00분 10초에 마지막으로 저장되었으며, 마지막 저장 계정은 Lailey로 기록되어 있습니다.

    한편, 2022년 민주평통 사무처와 서울 유엔 인권 사무소를 사칭한 공격에 사용된 악성 파일 등에서도 Lailey 계정이 공통적으로 식별된 바 있습니다.

     

    5-3. PHP Webshell 유사도 비교

    2022년 hanainternational[.]net 주소에 등록된 웹셸과 2026년 printory[.]kr 주소에서 Compiled Python 바이트코드(.pyc) 형태의 악성코드를 다운로드한 웹셸은 동일한 유형으로 확인되었습니다.

    그리고 2021년 탈북청소년을 위한 입시·학과전공 박람회 사칭 피싱에 쓰인 udcontest[.]com 주소의 웹셸도 동일한 형태가 관찰됩니다.

     

    [그림 5-8] Webshell 비교 화면

    [그림 5-8] Webshell 비교 화면

     

    이때 사용된 udcontest[.]com 도메인은 114.207.246[.]156 IP 주소로 연결되었습니다.

    해당 IP 주소는 ableinfo.co[.]kr 도메인과 동일하며, 이른바 'andydad'의 GitHub 저장소에서 식별된 CHM 및 LNK 유형과 비슷한 악성 파일의 유포 인프라로 사용되었습니다.

     

    [그림 5-9] 악성 파일이 등록된 C2 화면

    [그림 5-9] 악성 파일이 등록된 C2 화면

     

    5-4. 위협 인프라 상관 관계도

    본 위협 캠페인을 조사하는 과정에서 과거에 분석된 다양한 인프라와의 유사성이 다수 식별되었습니다. 특히, 공격에 활용된 C2 인프라 구성뿐만 아니라 악성 코드의 동작 방식, 파일 구조, 드로퍼 및 로더 체인 등 고유한 기술적 특성에서도 일관된 패턴이 확인됩니다.

     

    [그림 5-10] 상관 관계도

    [그림 5-10] 상관 관계도

     

    위협 행위자는 과거에 사용한 흔적을 은폐하기 위해 인프라 도메인, IP, 파일명, 배포 경로 등의 요소를 지속적으로 변경하는 전략을 사용하는 것으로 보입니다.

    그러나 이러한 변화에도 불구하고, 특정 배치 스크립트 실행 방식, 설정 파일 구조, 중간 로딩 파일 활용 방식, 그리고 감염 체인의 단계적 구성 방식에서 유의미한 공통점이 반복적으로 관찰됩니다.

    이는 단순 인프라 교체 수준을 넘어, 동일하거나 유사한 공격 프레임워크 또는 개발 리소스를 기반으로 캠페인이 지속적으로 운영되고 있을 가능성을 시사합니다. 특히 일부 C2 서버 IP 대역, 파일 패키징 방식, 그리고 특정 목적성 미끼 문서 활용 패턴은 과거 사례와 높은 연관성을 보입니다.

    따라서 본 캠페인은 외형적인 인프라 변화에도 불구하고, 내부 구조 및 운영 방식의 일관성을 기반으로 동일 위협 행위자 또는 연관 조직에 의해 수행되었을 가능성이 높은 것으로 판단됩니다.

     

     

    6. 결론 및 대응 (Conclusion)


    6-1. 위협 캠페인 결론

    본 위협은 이메일 기반 스피어피싱을 통해 ZIP 압축 파일 내부의 LNK 악성파일 실행을 유도하고, 이후 난독화된 명령 호출과 다단계 페이로드 다운로드를 거쳐 Python 기반 백도어를 실행하는 APT37 연관 캠페인으로 확인되었습니다.

    위협 행위자는 항공권 전자티켓, 북한 연구 행사 초청, 국방·경찰 공무원 사칭 등 표적의 업무 환경과 관심사를 반영한 미끼를 사용하여 사용자의 경계심을 낮췄습니다. 사용자가 LNK 파일을 실행하면 정상 문서가 표시되는 것처럼 보이지만, 백그라운드에서는 cmd.exe와 PowerShell을 통해 환경변수 기반 문자열 치환 명령이 복원되고, 후속 BAT 파일이 다운로드·실행되는 구조를 가집니다.

    특히 본 캠페인에서는 정상 Windows 구성 요소인 curl.exe를 복사해 다운로드 도구로 활용하고, 정상 Python Embed 패키지를 내려받아 별도의 실행 환경을 구성한 뒤, pythonw.exe를 codeflush.exe로 변경하여 .cat 확장자로 위장된 Compiled Python 바이트코드를 실행하는 방식이 확인되었습니다. 이는 정상 도구와 정상 소프트웨어 실행 환경을 악용함으로써 보안 솔루션의 탐지 가능성을 낮추려는 시도로 판단됩니다.

    또한 예약 작업을 이용해 악성 Python 바이트코드가 반복 실행되도록 구성한 점은 감염 시스템 내 지속성 확보 의도가 명확히 드러나는 부분입니다. 최종 페이로드인 settingenv.cat는 C2 서버로부터 추가 명령을 수신하고, 이를 실행한 뒤 결과를 다시 전송하는 원격 명령 실행형 백도어로 확인되었습니다.

    이러한 특성을 고려할 때, 본 위협은 확보된 IoC 기반 대응과 함께, ▲압축파일 내부 LNK 실행 ▲cmd.exe 및 PowerShell 연계 호출 ▲환경변수 기반 문자열 치환 난독화 ▲curl.exe를 이용한 외부 다운로드 ▲사용자 공용 경로 내 Python 실행 환경 구성 ▲pythonw.exe 이름 변경 및 비정상 확장자 실행 ▲예약 작업 기반 지속성 확보 ▲C2를 통한 동적 Python 코드 수신 및 실행 등 공격 전 과정에 대한 행위 기반 분석이 요구됩니다.

    따라서 조직은 초기 유입부터 실행, 추가 페이로드 다운로드, 지속성 확보, C2 통신, 원격 명령 실행까지 위협 행위자의 전술·기법·절차(TTP)를 통합적으로 탐지할 수 있는 EDR 중심의 대응 체계를 강화해야 합니다. 특히 도메인, IP, 파일명, 확장자는 쉽게 변경될 수 있으므로 단일 침해지표에 의존하기보다, 프로세스 실행 관계, 명령행 패턴, 파일 생성 위치, 예약 작업 생성, 정상 도구 악용 행위 간 상관관계를 기반으로 한 탐지 및 위협 헌팅 체계의 병행이 필수적입니다.

     

    6-2. 'Genian Insights E' 기반 통합 대응 전략

    본 위협은 사회공학 기법, 정상 도구 악용(LOLBins), 난독화 스크립트, 다단계 다운로드, Python 기반 백도어 운용이 결합된 복합 공격으로 확인되었습니다. 따라서 초기 실행부터 지속성 확보, C2 통신, 후속 명령 수행까지 전체 공격 흐름을 가시화하고, 이벤트 간 상관관계를 기반으로 탐지·대응할 수 있는 EDR 중심의 통합 보안 체계가 필수적입니다.

    'Genian Insights E'는 단일 에이전트 기반의 통합 엔드포인트 보안 플랫폼으로, 다음과 같은 기능을 통해 각종 위협에 대한 효과적인 대응을 지원합니다.

    • EDR (Endpoint Detection and Response)
      • LNK 실행 이후 cmd.exe → PowerShell 호출 흐름
      • 환경변수 기반 문자열 치환 명령 실행
      • curl.exe를 이용한 외부 다운로드
      • pythonw.exe 기반 비정상 실행
      • 예약 작업 생성 및 반복 실행
    • Anti-Malware
      • 알려진 악성코드 및 변종에 대해 시그니처 기반 탐지·차단
      • 확보된 IoC를 기반으로 기존 감염 여부를 신속하게 식별
    • Anti-Ransom
      • 파일 암호화 행위 차단 및 자동 백업·복원 기능
      • 향후 유사 공격에서 발생할 수 있는 추가 피해를 최소화
    • Device Control
      • USB 및 외장 저장매체 사용을 통제하여 내부 정보 유출 가능성을 차단
      • 감염 이후 확산 경로를 제한


    EDR은 행위 기반 분석을 통해 특정 단말에서 압축 유틸리티를 이용해 의심스러운 LNK 파일이 생성되는 초기 유입 단계를 즉시 탐지할 수 있는 기능이 있습니다. 또한, 해당 LNK 파일이 어떤 인자값으로 실행되었는지까지 확인할 수 있는 가시성이 있습니다.

     

    [그림 6-1] EDR을 통해 의심스러운 LNK 파일을 탐지한 모습

    [그림 6-1] EDR을 통해 의심스러운 LNK 파일을 탐지한 모습

     

    Genian Insights E의 Attack Storyline 기능을 통해 LNK 파일이 어떤 배치 파일 명령을 수행했는지 커맨드라인 기반으로 쉽게 파악할 수 있습니다.

    이러한 정보는 보안 관리자가 EDR을 통해 위협 흐름을 분석하는 데 유용하게 활용될 수 있습니다.

     

    [그림 6-2] 커맨드 라인 조회 화면

    [그림 6-2] 커맨드 라인 조회 화면

    PowerShell 명령의 동작까지 파악할 수 있으며, 이후 PowerShell 명령에 의해 curl.exe 파일이 TempRpJjgMB.exe 파일명으로 변경되어 C2 서버에서 추가 파일 다운로드를 시도하는 행위까지 순차적으로 분석할 수 있습니다.

    실제 분석 시점에는 C2 서버와의 통신이 이루어지지 않았지만, 행위 기반 이벤트 로그를 통해 관련 시도 내역 자체를 확인할 수 있습니다.

     

    [그림 6-3] PowerShell과 curl.exe를 통한 C2 접속 화면

    [그림 6-3] PowerShell과 curl.exe를 통한 C2 접속 화면

    이와 같은 일련의 행위 기반 분석 정보를 통해 EDR 관리자는 위협의 초기 유입부터 후속 행위에 이르는 전체 공격 흐름을 가시적으로 파악할 수 있으며, 이를 바탕으로 위협을 신속하고 정확하게 식별할 수 있는 기반이 있습니다.


     

    7. IoC (Indicator of Compromise)


    • MD5

    255155bad9af5e2c6cf550ff2a95219d

    abbb362cdfe14b56b3a13a2a55937ee4

    b5f9cd67cb32f44c138c382e17b06fd6

    f7b2e0cebd7793c8cfee2c7c5b93df9c

    fcb97f87905a33af565b0a4f4e884d61

    1aa7751332710f4e963a708243d3d550

    09dabe5ab566e50ab4526504345af297

    16d7be5ebc3c2ff1cffbb83b965fd4fb

    33c97fc4eacd73addbae9e6cde54a77d

    804d12b116bb40282fbf245db885c093

    7922f91281e8b0fe00518d05bf295b4a

     

    • C2

    oxenhan1.cafe24[.]com

    kmot.co[.]kr

    ycpatent.co[.]kr

    printory[.]kr

    fe01.co[.]kr

    choisy[.]fr

    51.158.21[.]1

    183.111.174[.]69

    211.239.157[.]126

    218.150.78[.]198

    220.73.160[.]23