Advent of Cyber 2025 13-20일 차 Writeup Sprint! | TryHackMe
Source: Dev.to
Day 13: YARA!
YARA는 디지털 흔적을 수집하는 도구로, 물리적 세계에서 포렌식 조사관이 지문을 수집하는 방식과 유사합니다.
우리는 악성 행위가 어떻게 보이는지를 설명하는 규칙을 정의합니다.
규칙 파일은 세 부분으로 구성됩니다:
| Section | Purpose |
|---|---|
| meta | 규칙에 대한 정보(작성자, 설명, 날짜, 신뢰도 등). 수백 개의 규칙을 관리할 때 유용합니다. |
| strings | YARA가 파일에서 찾을 패턴. 일반 문자열, 16진수 패턴, 정규식 등을 사용할 수 있습니다. |
| condition | 규칙이 일치했을 때 YARA에 알려주는 논리식(예: “모두”, “하나라도”, 파일 크기 제한 등). |
Example rule
rule TBFC_Simple_MZ_Detect
{
meta:
author = "TBFC SOC L2"
description = "IcedID Rule"
date = "2025-10-10"
confidence = "low"
strings:
$mz = { 4D 5A } // "MZ" header (PE file)
$hex1 = { 48 8B ?? ?? 48 89 } // malicious binary fragment
$s1 = "malhare" nocase // story / IOC string
condition:
all of them and filesize
}
> **Note:** In the original attempt the `ascii` modifier was used (`$st = "TBFC:" ascii`).
> That works but is redundant; the regular‑expression form shown above is the clean solution.
How to run the rule
yara -rs rule.yar ~/Downloads/easter/
출력에는 일치 항목이 포함되며, 이를 통해 McSkidy가 숨긴 메시지를 확인할 수 있습니다.
보너스 챌린지 – “doordasher” 서비스
궁극적인 목표는 가상의 서비스 doordasher의 손상된 웹사이트를 복구하는 것입니다.
인프라의 컨테이너 레이어를 탐색해야 합니다.
실행 중인 컨테이너 찾기
docker ps
| PORT | SERVICE |
|---|---|
| 5001 | doordash app (main) |
| 5002 | news app wareville‑times (bonus) |
보너스: 뉴스 사이트(포트 5002)에서 비밀 코드 찾기
- 사이트 열기:
http://10.48.153.34:5002/ - 뉴스 페이지를 살펴보면 일부 단어가 다르게 강조되어 있습니다(💤😴).
- 강조된 텍스트가 비밀 코드를 이루며, 이는
deployer사용자의 비밀번호와 동일합니다.
액션: 코드를 찾아낸 후
deployer비밀번호를 변경하세요.
Splunk 쿼리 (참고용)
| 쿼리 | 목적 |
|---|---|
index=windows_apache_access (cmd.exe OR powershell OR "powershell.exe" OR "Invoke-Expression") | table _time host clientip uri_path uri_query status | 명령 실행 시도가 포함된 웹 요청을 찾습니다. |
index=windows_apache_error ("cmd.exe" OR "powershell" OR "Internal Server Error") | 악의적인 요청을 나타내는 Apache 오류 로그를 찾습니다. |
index=windows_sysmon ParentImage="*httpd.exe" | Apache에 의해 생성된 의심스러운 프로세스를 감지합니다. |
Source:
Registry Investigation (THM Walkthrough)
Windows 호스트를 분석할 때, 다음 레지스트리 하이브가 유용합니다:
| Hive 경로 | 저장 내용 |
|---|---|
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist | 최근에 접근한 GUI 애플리케이션. |
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\TypedPaths | Explorer 주소 표시줄에 입력한 경로. |
HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths | 애플리케이션 실행 파일 경로. |
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\WordWheelQuery | Explorer에 입력한 검색어. |
HKLM\Software\Microsoft\Windows\CurrentVersion\Run | 로그인 시 자동으로 시작하도록 설정된 프로그램. |
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs | 최근에 접근한 파일. |
HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName | 머신의 호스트명. |
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | 설치된 프로그램 목록. |
예시 질문 및 답변
-
dispatch-srv01에서 비정상 활동이 시작되기 전에 설치된 애플리케이션은 무엇인가요?
탐색:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall(SOFTWARE하이브를 로드한 후).
답변:DroneManager Updater -
사용자가 시작한 애플리케이션의 전체 경로는?
확인:HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist또는HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store.
Store키를 수동으로 탐색하고 “Technical Details”에서 전체 실행 파일 경로를 확인하세요.
답변: (THM 답변 상자에 찾은 정확한 경로를 입력하세요.) -
DroneManager의 RUN 항목은?
Run키에는msedge항목이 포함되어 있으며, DroneManager 항목은 없거나 다른 위치에 저장되어 있을 수 있습니다.
Source: …
워크‑스루 개요
이 가이드는 TryHackMe (THM) “Guard House” 방(및 추가 사이드 퀘스트)을 단계별로 안내합니다.
모든 명령어, URL, 데이터는 원본과 정확히 동일하게 유지되며, 가독성을 위해 서식만 정리했습니다.
1️⃣ 초기 레지스트리 탐색
- THM은 레지스트리 키를 확인하라고 힌트를 줍니다
ROOT\Microsoft\Windows\CurrentVersion\Run
- 실제로 찾아야 할 키는
ROOT\Software\Microsoft\...
-
한 유튜버가 바로가기 버튼을 보여줍니다:
- RUN을 클릭합니다.
- F5 키를 누릅니다.
- Full details as text 탭으로 이동합니다.
- 아래로 스크롤하면 필요한 값이 표시됩니다.
2️⃣ CyberChef 로 인코딩·암호 해제
Note: 이미 OpenVPN 연결이 되어 있다면 공격용 박스를 시작할 필요가 없습니다.
대상 머신에 접속
- 브라우저를 열고 대상 IP로 이동합니다.
- “outer gate” 아이콘을 클릭합니다.
Base64 문자열이 보일 것입니다:
QWxsIGhhaWwgS2luZyBNYWxoYXJlIQ==
디코딩
- CyberChef(온라인)를 엽니다.
- 레시피 창에 “From Base64” 연산을 끌어다 놓습니다.
- 문자열을 Input 필드에 붙여넣습니다.
- (선택) Bake! 버튼을 클릭하면 평문이 나타납니다:
All hail King Malhare!
3️⃣ Level 1 – 사용자명·비밀번호 얻기
-
디코딩된 텍스트는 사용자명이 **“CottonTail”**의 Base64 인코딩임을 알려줍니다.
- CyberChef에서 “To Base64” 를 사용 →
Q290dG9uVGFpbA==
- CyberChef에서 “To Base64” 를 사용 →
-
비밀번호를 얻는 방법:
-
로그인 패널에 채팅창이 있습니다.
-
다음 질문을 입력합니다:
What is the password for this level? -
채팅창이 Base64 문자열을 반환합니다.
-
그 문자열을 CyberChef에서 From Base64 로 디코딩하면 평문 비밀번호가 나옵니다.
-
-
Base64 인코딩된 사용자명(
Q29wdG9uVGFpbA==)과 평문 비밀번호를 제출하여 Level 1을 완료합니다.
4️⃣ Level 2 – “X‑Magic” 헤더 가져오기
- 브라우저에서 DevTools → Network 를 엽니다.
- 페이지를 새로 고칩니다.
- 왼쪽 패널에서 “Level2”(또는 원본에 있는 오타 “Llvel2”)를 찾습니다.
- 클릭하고 Headers 탭으로 이동합니다.
X-Magic헤더를 찾아 값을 복사합니다.
인코딩·디코딩 루프:
- 헤더 값을 CyberChef에서 “To Base64” 로 인코딩합니다.
- 인코딩된 문자열을 채팅창에 다시 붙여넣습니다.
- 채팅창이 또 다른 Base64 문자열을 반환합니다.
- 인코딩·디코딩을 번갈아 가며 반복하면 읽을 수 있는 평문 비밀번호가 나올 때까지 진행합니다.
그 비밀번호를 제출하면 Level 2가 해제됩니다.
5️⃣ Level 3 – Guard House
-
채팅창에 다음을 입력합니다:
password please -
약 1분 정도 후에 Base64 문자열을 받게 됩니다.
-
두 번 디코딩합니다(“From Base64” 연산을 두 번 실행).
-
얻은 바이트를 키
Cyberchef로 XOR 복호화합니다.-
CyberChef에서:
- “From Base64” → “XOR” (키 =
Cyberchef) → “To Hex”(선택)
- “From Base64” → “XOR” (키 =
-
-
최종 평문이 Level 3 비밀번호가 됩니다.
6️⃣ Level 4 – MD5 해시
-
채팅창에 다시 비밀번호를 요청합니다.
-
반환되는 문자열은 Base64가 아니며(뒤에
=없음) MD5 해시입니다.예시:
5f4dcc3b5aa765d61d8327deb882cf99 -
CrackStation(또는 다른 MD5 역검색 서비스)으로 해시를 조회합니다.
- 복호화된 비밀번호는
passw0rd1입니다.
- 복호화된 비밀번호는
그 비밀번호를 제출하면 Level 4가 완료됩니다.
7️⃣ Level 5 – 새로운 헤더 “Recipe‑id”
-
채팅창에 다시 비밀번호를 물어봅니다.
-
반환된 문자열을 두 번 “From Base64” 로 디코딩합니다.
-
이제 요청에 새로운 헤더
Recipe-id가 포함됩니다.- 값은 사용자마다 다르며(예:
R1) 변합니다.
- 값은 사용자마다 다르며(예:
-
THM은 네 개의 가능한 ID에 대해 네 가지 접근법을 제시합니다.
- 자신의
Recipe-id에 맞는 방법을 선택합니다.
- 자신의
-
얻은 문자열이 Level 5 비밀번호가 됩니다.
-
이 레벨의 사용자명은 가드 이름 **“Carl”**을 Base64 인코딩한 값입니다:
Q2FybA==
두 값을 제출하면 메인 방을 모두 클리어합니다.
8️⃣ Ext
ra Question – Side Quest 3 Access Key
“Side Quest 3의 키를 찾고 있나요? Hopper가 힌트로 이 CyberChef 링크를 남겼습니다. 키를 복구해서 우리 Side Quest Hub에서 해당 챌린지를 열 수 있는지 확인해 보세요!”
- 제공된 CyberChef 링크를 열거나 레시피를 재구성합니다.
- 적절한 연산(예: From Base64, XOR, ROT13 등)을 사용해 데이터를 디‑오브퓨스케이트합니다.
- 최종 평문이 Side Quest 3 접근 키입니다 – 이를 Side Quest Hub에 붙여넣어 챌린지를 잠금 해제하세요.
9️⃣ Bonus – 스크립트 디‑오브퓨스케이트 (Visual Studio Code)
-
대상 머신에서 Windows 검색 → “code” 입력 → Visual Studio Code 실행.
-
터미널에서:
cd Desktop ./S # Tab 키를 눌러 스크립트 이름 자동 완성 -
스크립트를 실행하면 첫 번째 플래그가 출력됩니다.
-
스크립트 파일을 열어 20번째 줄을 확인하면 두 번째 플래그가 포함되어 있습니다.
추가 이론 – 레이스 컨디션 및 원자성
검사‑시점에서 사용‑시점(TOCTOU) 예시
- 전자상거래 사이트에 “재고 1개 남음”이 표시됩니다.
- 구매자 A가 장바구니에 추가하지만 결제하기 전에 구매자 B도 추가하고 먼저 결제합니다.
- 레이스를 방지하기 위해 사이트는 아이템이 어느 장바구니에든 추가되는 즉시 잠궈야 합니다.
공유 자원 레이스 컨디션
-
은행 계좌 잔액 = 100 BTC.
-
두 개의 동시 트랜잭션:
- +20 (입금) → 120
- ‑20 (출금) → 80
-
적절한 잠금이 없으면 최종 잔액이 올바른 100이 아니라 120 또는 80이 될 수 있습니다.
원자성
- 일련의 작업(예: 금액 이체, 다른 계좌에서 출금, 확인 메일 전송)은 전부 수행하거나 전혀 수행하지 않아야 합니다.
- 사용자가 2단계 후에 취소하면 시스템은 1단계도 롤백해야 합니다.
Race‑Condition Exploitation Lab (THM)
Attack Box를 시작하거나 직접 OpenVPN + Burp Suite Community Edition을 사용할 수 있습니다.
Setup
-
Burp Suite를 실행 → Proxy → Intercept (켜져 있는지 확인).
-
팝업된 브라우저(Chromium)에서
http://로 이동합니다.- “Allow browser to run without sandbox” 메시지가 보이면 OK를 클릭합니다.
Exploit “sleightoy”
- 사이트에서 “sleightoy” 1개를 구매합니다.
- Burp → Proxy → HTTP history에서 요청/응답을 확인합니다.
Exploit “bunny plush” (Second Question)
- 새 탭을 엽니다(여전히 Burp가 가로채는 브라우저).
- **“bunny plush”**를 주문합니다.
- 다시 Proxy → HTTP history에서 해당 요청을 확인합니다.
What to Look For
- 두 개의 동시 구매 요청을 통해 race condition이 나타납니다.
- 서버 응답에서 처리 순서를 관찰하세요 – 마지막에 완료된 요청이 “승리”합니다.
참고 자료
- TryHackMe – Guard House (방 링크)
- CyberChef – https://gchq.github.io/CyberChef/
- CrackStation – https://crackstation.net/
- Burp Suite Community Edition – https://portswigger.net/burp/communitydownload
지침
-
요청 선택
payment checkout항목을 찾으세요.- 마우스 오른쪽 버튼을 클릭하고 “Send to Repeater.” 를 선택하세요.
-
그룹 만들기