ESET 연구 GopherWhisper: 악성코드로 가득한 굴
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
ESET는 몽골의 정부 기관을 대상으로 하는 GopherWhisper라는 중국 계열의 새로운 APT 그룹을 식별했습니다. 이 위협 행위자는 Go와 C++ 백도어, 로더, 인젝터로 구성된 맞춤형 악성 코드 생태계를 운영하며, 합법적인 클라우드 플랫폼을 많이 오용하여 명령 및 제어 활동을 수행합니다. LaxGopher, RatGopher, BoxOfFriends를 포함한 전체 도구세트는 Discord, Slack, Microsoft Outlook, file.io 등의 서비스를 통해 통신합니다. 연구진은 2025년 1월에 이 캠페인을 처음 관찰했습니다.
조사
ESET의 분석은 이 그룹의 광범위한 툴킷을 밝혀내고, 주입 방법을 문서화했으며, 운영에서 사용된 Slack 및 Discord API 토큰을 식별했습니다. 연구자들은 또한 수천 개의 명령 및 제어 메시지와 캠페인과 연관된 Outlook 이메일 초안들을 추출했습니다. 그들의 조사는 지원 인프라를 매핑하고, 공격자들이 신뢰할 수 있는 온라인 서비스를 사용하여 통신을 숨기고 데이터를 탈취하는 방식을 보여주었습니다.
완화 방법
방어자는 비인가된 Slack, Discord, Outlook API 활동을 모니터링하고, 의심스러운 업로드를 차단해야 합니다. file.io, 그리고 DLL 로딩 행동에 대한 엄격한 제어를 시행해야 합니다. 보안 팀은 또한 비정상적인 svchost.exe 인젝션 활동을 탐지하고 환경에서 실행되는 알려지지 않은 Go 기반 바이너리를 조사해야 합니다.
대응
GopherWhisper 활동이 탐지되면, 즉시 영향을 받은 시스템을 격리하고, 악성 프로세스를 종료하며, 주입된 DLL을 제거하고, 손상된 서비스 계정을 재설정하고, 노출된 API 토큰을 폐기해야 합니다. 전체 포렌식 조사가 뒤따라야 하며, 네트워크 전반에 걸친 위협 탐색을 수행하여 관련된 아티팩트나 추가로 손상된 호스트를 식별해야 합니다.
"graph TB %% Class definitions classDef malware fill:#ffcccc classDef process fill:#c2f0c2 classDef file fill:#ffd9b3 classDef technique fill:#e6e6ff classDef service fill:#ffffcc classDef network fill:#d9d9d9 %% Nodes node_initial_loader["<b>Malware</b> – <b>JabGopher Loader</b><br/><b>Action</b>: Create svchost.exe and inject LaxGopher backdoor"] class node_initial_loader malware node_svc_host["<b>Process</b> – svchost.exe"] class node_svc_host process node_laxgopher["<b>Malware</b> – <b>LaxGopher</b> backdoor (DLL)"] class node_laxgopher malware node_whisper_dll["<b>File</b> – whisper.dll (masquerading)"] class node_whisper_dll file node_process_injection["<b>Technique</b> – T1055 Process Injection<br/><b>Description</b>: Inject malicious code into a running process"] class node_process_injection technique node_reflective_loading["<b>Technique</b> – T1620 Reflective Code Loading<br/><b>Description</b>: Load code in memory without using the standard OS loader"] class node_reflective_loading technique node_masquerading["<b>Technique</b> – T1036 Masquerading<br/><b>Description</b>: Rename files to appear legitimate"] class node_masquerading technique node_frienddelivery["<b>Malware</b> – <b>FriendDelivery DLL</b>"] class node_frienddelivery malware node_boxoffriends["<b>Malware</b> – <b>BoxOfFriends</b> backdoor"] class node_boxoffriends malware node_go_backdoor["<b>Malware</b> – Go based backdoors (RatGopher, LaxGopher)"] class node_go_backdoor malware node_c2_slack["<b>Service</b> – Slack (Web Service)"] class node_c2_slack service node_c2_discord["<b>Service</b> – Discord (Web Service)"] class node_c2_discord service node_c2_outlook["<b>Service</b> – Microsoft 365 Outlook Mail REST API"] class node_c2_outlook service node_tech_c2_web["<b>Technique</b> – T1102.002 Web Service Bidirectional Communication<br/><b>Description</b>: Use legitimate web services for C2"] class node_tech_c2_web technique node_tech_mail["<b>Technique</b> – T1071.003 Mail Protocols<br/><b>Description</b>: Use mail protocols for C2"] class node_tech_mail technique node_remote_access["<b>Technique</b> – T1219 Remote Access Tools<br/><b>Description</b>: Provide remote command execution"] class node_remote_access technique node_compactgopher["<b>Malware</b> – CompactGopher"] class node_compactgopher malware node_archive["<b>Technique</b> – T1560.001 Archive Collected Data via Utility<br/><b>Description</b>: Compress data before exfiltration"] class node_archive technique node_data_limit["<b>Technique</b> – T1030 Data Transfer Size Limits<br/><b>Description</b>: Handle size limits by compressing or splitting data"] class node_data_limit technique node_exfil_fileio["<b>Service</b> – file.io cloud storage"] class node_exfil_fileio service node_exfil_tech["<b>Technique</b> – T1567.002 Exfiltration Over Web Service to Cloud Storage<br/><b>Description</b>: Use cloud storage as exfiltration channel"] class node_exfil_tech technique node_transfer_to_cloud["<b>Technique</b> – T1537 Transfer Data to Cloud Account<br/><b>Description</b>: Move data to attackeru2011controlled cloud account"] class node_transfer_to_cloud technique node_sslordoor["<b>Malware</b> – SSLORDoor"] class node_sslordoor malware node_raw_socket["<b>Technique</b> – Raw Socket Communication"] class node_raw_socket technique node_port_443["<b>Network</b> – Port 443"] class node_port_443 network %% Connections node_initial_loader –>|creates| node_svc_host node_initial_loader –>|injects| node_laxgopher node_laxgopher –>|uses| node_process_injection node_laxgopher –>|uses| node_reflective_loading node_laxgopher –>|file name| node_whisper_dll node_whisper_dll –>|masquerades as| node_masquerading node_frienddelivery –>|loads| node_boxoffriends node_boxoffriends –>|uses| node_process_injection node_boxoffriends –>|uses| node_reflective_loading node_laxgopher –>|C2 via| node_c2_slack node_go_backdoor –>|C2 via| node_c2_discord node_go_backdoor –>|C2 via| node_c2_slack node_c2_slack –>|uses technique| node_tech_c2_web node_c2_discord –>|uses technique| node_tech_c2_web node_boxoffriends –>|creates drafts via| node_c2_outlook node_c2_outlook –>|uses technique| node_tech_mail node_go_backdoor –>|provides| node_remote_access node_sslordoor –>|provides| node_remote_access node_compactgopher –>|compresses data with| node_archive node_compactgopher –>|handles size limits via| node_data_limit node_archive –>|uploaded to| node_exfil_fileio node_exfil_fileio –>|uses technique| node_exfil_tech node_exfil_fileio –>|uses technique| node_transfer_to_cloud node_sslordoor –>|uses raw sockets on| node_port_443 node_sslordoor –>|uses| node_raw_socket "
공격 흐름
탐지
짧은 파일 이름 (cmdline 사용)
보기
Windows Defender 실시간 모니터링 비활성화 및 기타 환경 설정 변경 (cmdline 사용)
보기
WebBrowserPassView 사용 가능성 (cmdline 사용)
보기
제3자 서비스/도구를 통한 데이터 침투/유출/C2 가능성 (프록시 사용)
보기
Slack, Discord, Microsoft Graph API를 통한 GopherWhisper C&C 탐지 [Windows 네트워크 연결]
보기
GopherWhisper에 의한 의심스러운 프로세스 인젝션 [Windows 프로세스 생성]
보기
시뮬레이션 실행
전제조건: 텔레메트리 및 기준 사전 체크가 통과되어야 합니다.
근거: 이 섹션은 탐지 규칙을 발동시키기 위해 설계된 적대적인 기술(TTP)의 정확한 실행을 상세히 설명합니다. 명령어와 내러티브는 식별된 TTP를 정확히 반영해야 하며 감지 로직에 의해 예상되는 정확한 텔레메트리를 생성해야 합니다.
-
공격 내러티브 및 명령어:
공격자는 먼저 새로운svchost.exe프로세스를 생성합니다.(인젝션을 위한 선택된 호스트)LaxGopher.dll페이로드는 반사형 DLL 인젝터를 사용하여 해당 프로세스의 메모리에 로드되어 동적 링크 라이브러리 인젝션(T1055.001)을 달성합니다.백도어가 상주하게 되면, 숨겨진cmd.exe인스턴스를 열어 C2 서버로부터 받은 명령어를 실행하여 Windows 명령 셸(T1059.003)을 충족시킵니다.이 체인은 GopherWhisper 연구에서 설명된 행동을 반영하며 Sigma 규칙이 찾는 두 가지 프로세스 생성 이벤트를 생성합니다. -
회귀 테스트 스크립트:
# ------------------------------------------------------------- # GopherWhisper 스타일의 프로세스 인젝션 시뮬레이션 # ------------------------------------------------------------- $svcHost = "$env:SystemRootSystem32svchost.exe" $dllPath = "C:TempLaxGopher.dll" # 해당 위치에 무해한 테스트 DLL이 존재한다고 가정 $cmdPath = "$env:SystemRootSystem32cmd.exe" # 1. 주입 대상이 될 새로운 svchost.exe 인스턴스 생성 (일시 중지) $svchost = Start-Process -FilePath $svcHost -ArgumentList "-k", "netsvcs" ` -PassThru -WindowStyle Hidden # 2. 간단한 반사형 주입 수행 (플레이스홀더) # 실제 테스트에서는 적절한 인젝터를 호출해야 하지만, 여기서는 의도를 로그로 남깁니다. Write-Host "[*] Injecting $dllPath into PID $($svchost.Id) (simulated)" # 시뮬레이션 된 인젝션 명령: # .Invoke-ReflectiveDLLInjection.ps1 -Pid $svchost.Id -Path $dllPath # 3. 주입된 프로세스 컨텍스트에서 cmd.exe 실행 (시뮬레이션) Write-Host "[*] Launching cmd.exe from injected svchost (simulated)" Start-Process -FilePath $cmdPath -ArgumentList "/c echo Compromised > C:Temppwned.txt" ` -WindowStyle Hidden # 4. Sysmon이 이벤트를 기록할 시간을 주기 위해 잠시 대기 Start-Sleep -Seconds 5 -
정리 명령어:
# 시뮬레이션 된 svchost.exe 및 cmd.exe 프로세스 종료 Get-Process -Name svchost -ErrorAction SilentlyContinue | Stop-Process -Force Get-Process -Name cmd -ErrorAction SilentlyContinue | Stop-Process -Force # 테스트 DLL 제거 (선택 사항) Remove-Item -Path "C:TempLaxGopher.dll" -Force -ErrorAction SilentlyContinue