Step 115. CVE 읽는 법: NVD와 Exploit-DB — 번호 하나에 담긴 이야기
Level 2 — 보안 입문과 공격 스킬 기초 | 난이도 ★★☆☆☆ | 예상 소요 시간 2시간
전제: Step 114에서 스캐너가 뽑아 준 CVE 후보 목록을 봤다. "vsftpd 2.3.4"처럼 서비스명+버전 표기에 익숙하다.
- 준비물: 웹 브라우저(NVD, Exploit-DB 접속용). 랩의 Kali가 있다면
searchsploit까지. 명령 실습은 거의 없는 읽기 중심 챕터입니다. - 주의: ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. 공격 코드(PoC)를 읽는 것은 공부지만, 남의 시스템에 실행하면 범죄입니다. 이 환경은 외부 네트워크가 차단되어 있어 NVD·Exploit-DB의 화면과
searchsploit출력은 전부 "화면 예시/출력 예시"로 표기합니다.
Step 114에서 스캐너가 "CVE-2011-2523"이라는 번호를 던져 줬습니다. 이 번호는 무엇이고, 어디서 읽고, 얼마나 믿어야 할까요? 오늘은 취약점의 세계에서 통용되는 언어 — CVE 번호, CVSS 점수, PoC(개념 증명 코드) — 를 배웁니다. "버전 번호 → 취약점 정보 → 공격 코드 존재 여부"로 이어지는 검색 능력이 실무 정찰의 핵심이고, 오늘 배우는 두 사이트(NVD와 Exploit-DB)는 그 검색의 출발점입니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- CVE 번호의 구조(연도-일련번호)를 설명하고, CVE·NVD·Exploit-DB의 역할 차이를 말한다
- CVSS 점수(0~10)와 벡터 문자열을 읽어 심각도를 해석한다
- NVD 페이지 한 장에서 "설명, 점수, 영향 버전, 참고 링크"를 찾아낸다
- Exploit-DB와
searchsploit으로 "공격 코드가 공개됐는가"를 확인한다 - "점수가 높다"와 "실전에서 위험하다"의 차이를 설명한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 웹 브라우저 + (선택) Kali의 searchsploit 명령 |
| 오늘의 사이트·명령 | NVD(nvd.nist.gov), Exploit-DB(exploit-db.com), searchsploit 서비스명, searchsploit -m 번호 |
| 필요한 개념 | CVE 번호, CVSS 점수와 벡터, PoC(개념 증명 코드), Step 114의 후보 목록 |
| 오늘의 산출물 | CVE 한 건의 "독서 카드" — 설명·점수·영향 버전·공격 코드 유무 정리 |
2-1. CVE — 취약점의 주민등록번호
CVE(Common Vulnerabilities and Exposures, 공통 취약점·노출 목록)는 전 세계 취약점에 붙는 고유 번호입니다. 모양은 CVE-연도-일련번호입니다. CVE-2011-2523이면 "2011년에 등록된 2523번째 후보"라는 뜻입니다.
번호가 있기 전에는 같은 취약점을 회사마다 다른 이름으로 불렀습니다. 번호가 생긴 뒤에는 스캐너, 뉴스, 패치 공지가 전부 같은 번호를 가리킵니다. 그래서 Step 114의 스캐너 출력이 CVE 번호로 요약됐던 것입니다 — 번호가 곧 세계 공통의 색인입니다.
2-2. NVD와 CVSS — 번호에 붙은 상세 정보와 점수
NVD(National Vulnerability Database, 미국 국가 취약점 데이터베이스)는 CVE 번호별 상세 정보 페이지입니다. 여기에 실리는 심각도 점수가 CVSS(Common Vulnerability Scoring System, 공통 취약점 채점 체계)입니다. 0.0~10.0 사이의 숫자로, 7.0 이상이면 High, 9.0 이상이면 Critical로 분류합니다.
점수 옆에는 벡터(vector)라는 암호 같은 문자열이 붙습니다. 예를 들어 AV:N/AC:L/Au:N/C:C/I:C/A:C는 각 항목이 "어디서 공격 가능한가(네트워크)/조건이 까다로운가(낮음)/인증이 필요한가(불필요)/기밀성·무결성·가용성 피해(전부 완전)"를 압축한 것입니다. 벡터를 읽으면 숫자의 근거가 보입니다.
2-3. Exploit-DB와 PoC — "실제로 뚫리나"의 증거
Exploit-DB는 공개된 공격 코드, 즉 PoC(Proof of Concept, 개념 증명 코드)를 모아 둔 저장소입니다. Kali 리눅스에는 이 DB의 오프라인 사본이 내장되어 있고, searchsploit이라는 명령으로 인터넷 없이 검색합니다.
여기서 오늘의 가장 중요한 감각이 나옵니다. CVSS 점수는 "이론상 얼마나 나쁜가"를 말해 주지만, 실전 위험도는 "누구나 복사해 쓸 수 있는 공격 코드가 공개됐는가"가 더 잘 말해 줍니다. 점수 10.0인데 공격 코드가 없는 취약점은 연구자의 일이고, 점수 7.5인데 코드가 널린 취약점은 스크립트 키디의 장난감이 됩니다.
2-4. 오늘의 사례 — vsftpd 2.3.4 백도어 (CVE-2011-2523)
오늘 독서의 교과서는 CVE-2011-2523입니다. 2011년, 인기 FTP 서버 프로그램인 vsftpd의 배포 파일이 공격자에게 바꿔치기당해, 2.3.4 버전에 백도어가 심어진 채 배포된 사건입니다. 아이디에 :) 문자열이 포함되면 6200번 포트에 루트 권한의 쉘이 열립니다. 공급망 공격(supply chain attack)의 고전 사례이고, Step 117에서 우리가 직접 뚫어 볼 바로 그 취약점입니다.
3. 따라 하기
3-1. NVD에서 CVE-2011-2523 읽기
브라우저에서 NVD(nvd.nist.gov)에 접속해 검색창에 CVE-2011-2523을 넣습니다. 이 환경은 외부 네트워크가 차단되어 있으므로, 여러분이 보게 될 화면을 아래에 재구성했습니다 (화면 예시).
화면 예시 (NVD의 CVE-2011-2523 페이지, 발췌 재구성):
CVE-2011-2523 Detail
Description
vsftpd 2.3.4 downloaded between 20110630 and 20110703 contains a
backdoor which opens a shell on port 6200/tcp.
Base Score: 10.0 CRITICAL
Vector: AV:N/AC:L/Au:N/C:C/I:C/A:C (CVSS v2)
읽는 법: 네 칸을 찾으세요. ① Description — 무슨 일인지 한 문장 요약. 여기서 핵심 정보("6200번 포트에 쉘이 열린다")를 발견합니다. ② Base Score — 10.0 만점. ③ Vector — 점수의 근거. ④ 페이지 아래쪽의 영향 버전과 참고 링크(원래 공지, 패치 정보).
왜: 스캐너가 던진 번호를 사람의 언어로 바꾸는 첫 독서입니다. Description 한 문장에 공격 조건과 결과가 모두 들어 있다는 점을 느껴 두세요.
3-2. CVSS 벡터 해부 — 암호 풀기
방금 본 벡터 AV:N/AC:L/Au:N/C:C/I:C/A:C를 항목별로 풀어 봅시다. 각 알파벳 쌍은 "항목:값"입니다.
| 벡터 조각 | 항목 | 값의 뜻 |
|---|---|---|
AV:N |
Attack Vector(공격 경로) | Network — 네트워크 너머에서 가능 |
AC:L |
Attack Complexity(복잡도) | Low — 조건이 까다롭지 않음 |
Au:N |
Authentication(인증) | None — 로그인 없이 가능 |
C:C |
Confidentiality(기밀성) | Complete — 완전히 털림 |
I:C |
Integrity(무결성) | Complete — 완전히 조작 가능 |
A:C |
Availability(가용성) | Complete — 완전히 마비 가능 |
읽는 법: 여섯 칸 전부가 공격자에게 최악(좋은) 쪽입니다. 네트워크에서, 특별한 조건 없이, 인증도 없이, 시스템을 통째로 삼키는 취약점 — 그래서 10.0입니다. 벡터를 읽는 버릇을 들이면 "왜 이 점수인가"를 납득하고 넘어갈 수 있습니다. 최신 문서는 CVSS v3 벡터(CVSS:3.1/AV:N/AC:L/PR:N/...)를 쓰며, 항목 이름(PR, UI 등)만 다르고 읽는 법은 같습니다.
왜: 점수만 보면 "10점이니까 무섭다"로 끝나지만, 벡터를 보면 "어떤 상황에서 무서운가"가 보입니다. 방어 우선순위는 이 문맥으로 정합니다.
3-3. Exploit-DB에서 공격 코드 찾기
이제 "실제로 뚫는 코드가 공개됐나"를 확인합니다. Exploit-DB(exploit-db.com)의 검색창에 vsftpd 2.3.4를 넣습니다 (화면 예시).
화면 예시 (검색 결과 재구성):
EDB-ID 17491 vsftpd 2.3.4 - Backdoor Command Execution (Metasploit)
EDB-ID 49757 vsftpd 2.3.4 - Backdoor Command Execution
읽는 법: 각 행은 EDB-ID(Exploit-DB 번호)와 제목입니다. "(Metasploit)" 꼬리표는 이 공격이 Metasploit 모듈로도 들어 있다는 뜻 — Step 116에서 우리가 use할 바로 그 모듈입니다. EDB-ID를 누르면 공격 코드 원문을 볼 수 있습니다. 읽는 것과 실행하는 것은 다릅니다. 실행은 내 랩에서만입니다.
왜: NVD가 "취약점의 진단서"라면 Exploit-DB는 "수술 도구의 창고"입니다. 진단서만으로는 뚫을 수 없고, 도구만으로는 왜 되는지 모릅니다. 둘을 오가는 것이 정찰의 완성입니다.
3-4. searchsploit — 인터넷 없이 창고 검색
Kali에는 Exploit-DB의 오프라인 사본이 있어, 랩처럼 인터넷이 안 되는 곳에서도 검색됩니다 (이 환경에는 Kali가 없으므로 출력 예시입니다).
입력 (Kali에서)
searchsploit vsftpd
출력 예시:
---------------------------------------------------------- ---------------------------------
Exploit Title | Path
---------------------------------------------------------- ---------------------------------
vsftpd 2.3.2 - Denial of Service | linux/dos/16270.c
vsftpd 2.3.4 - Backdoor Command Execution (Metasploit) | unix/remote/17491.rb
vsftpd 2.3.4 - Backdoor Command Execution | linux/remote/49757.py
---------------------------------------------------------- ---------------------------------
읽는 법: 왼쪽이 제목, 오른쪽이 Kali 내부의 파일 경로입니다. 코드 파일을 내 작업 디렉터리로 복사할 때는 searchsploit -m 49757처럼 -m(mirror) 옵션에 EDB-ID를 줍니다. -m 다음에는 제목이 아니라 번호라는 점이 초보의 단골 실수입니다.
왜: 폐쇄막 침투 테스트 현장에서는 오프라인 DB가 유일한 창고입니다. 그리고 결과에 .py, .rb, .c 등 다양한 언어가 섞여 있다는 것 — 공격 코드도 그냥 프로그램이라는 사실을 확인하세요.
3-5. 독서 카드 만들기 — 인벤토리에서 공격 코드까지
마무리로, 오늘 배운 검색 능력을 하나의 형식으로 고정합니다. Step 113 인벤토리의 서비스를 하나 골라 "독서 카드"를 만듭니다.
카드 예시 (vsftpd 2.3.4):
서비스/버전: vsftpd 2.3.4 (Step 113에서 -sV로 확인)
CVE: CVE-2011-2523
한 줄 요약: 배포본에 심어진 백도어 — 6200번 포트에 루트 쉘
CVSS: 10.0 (AV:N/AC:L/Au:N/C:C/I:C/A:C) — 네트워크·무인증·완전 장악
공격 코드: Exploit-DB 17491(Metasploit), 49757(파이썬) — 공개됨
실전 판단: 점수 만점 + 코드 공개 + 조건 단순 = 최우선 검증 대상
왜: 이 다섯 줄이 있으면 "다음에 무엇을 할지"가 자동으로 정해집니다. Step 116에서 Metasploit을 켜는 순간, 여러분은 이미 어느 모듈을 찾아야 하는지 알고 있습니다.
3-6. 번호가 있다고 다 읽을 수 있는 것은 아니다 — CVE의 상태
마지막으로 정직한 예외 하나. CVE 번호를 NVD에서 검색했는데 내용이 비어 있거나 이상할 때가 있습니다. 번호에는 상태가 있기 때문입니다.
- Analyzed / Modified: 심사가 끝나 점수와 상세가 채워진 정상 상태 — 오늘 우리가 읽은 것.
- Awaiting Analysis: 번호는 배정됐지만 NVD의 분석이 아직입니다. 막 터진 취약점 뉴스를 따라가 보면 이 상태를 만납니다.
- REJECT(Reject): 배정됐다가 취소된 번호 — 중복이었거나, 알고 보니 취약점이 아니었던 경우입니다. 화면 예시로 표현하면
<strong> REJECT </strong> DO NOT USE THIS CANDIDATE NUMBER라고 큼직하게 적혀 있습니다.
읽는 법: REJECT 표시가 보이면 그 번호는 폐기된 것입니다. 참고 링크에 "대신 이 번호를 보라"는 안내가 따라붙는 경우가 많습니다. 스캐너가 낡은 번호를 뿌리는 경우가 있어, 오늘의 교차 검증 습관이 여기서도 필요합니다.
왜: "번호가 있다"와 "유효한 정보가 있다"는 다릅니다. 도구의 출력을 그대로 믿지 않는 오늘의 태도가 데이터베이스 단계에서도 통합니다.
4. 미션과 연습문제
미션 — CVE 독서 카드 3장
- Step 113 인벤토리(또는 Step 114의 CVE 후보 목록)에서 서비스 3개를 고릅니다. MS2 랩이 없다면 이 책의 사례(vsftpd 2.3.4, OpenSSH, Apache 2.2.8 등)로 대체해도 됩니다.
- 각 서비스의 CVE를 NVD에서 하나씩 찾아 Description, Base Score, Vector를 베낍니다.
- 벡터 중 최소 한 장은 3-2의 표처럼 항목별로 풀어 적습니다.
- Exploit-DB(또는 Kali의
searchsploit)에서 공격 코드 공개 여부를 확인해 EDB-ID까지 적습니다. - 카드 마지막 줄에 "실전 판단"을 한 문장으로 적습니다 — 점수와 코드 유무를 함께 고려해서요.
연습문제
문제 1. CVE-2014-0160(Heartbleed)이라는 번호에서 2014와 0160이 각각 무엇을 뜻하나요? 그리고 이 번호 체계가 있기 전에는 어떤 문제가 있었나요?
문제 2. 벡터 AV:N/AC:L/Au:N/C:C/I:C/A:C와 AV:L/AC:H/Au:M/C:P/I:P/A:N을 비교해, 어느 쪽이 더 위험한지와 그 이유를 벡터 근거로 설명해 보세요.
문제 3. "CVSS 9.8이지만 공개된 공격 코드가 없는 취약점"과 "CVSS 7.5지만 Metasploit 모듈이 있는 취약점" 중, 랩의 MS2를 오늘 밤 뚫어야 하는 테스터는 어느 쪽을 먼저 검증할까요? 이유를 말해 보세요.
문제 4. searchsploit 결과의 Path 열은 무엇이며, 그 파일을 내 디렉터리로 가져오는 올바른 명령은 무엇인가요?
5. 모범 답안과 완료 기준
미션 모범 답안
vsftpd 카드는 3-5의 예시가 모범 답안입니다. 나머지 두 장의 골격 예시 (수치는 NVD 페이지에서 직접 확인해 채우세요 — 점수는 개정될 수 있습니다):
서비스/버전: OpenSSH <버전>
CVE: NVD 검색으로 선정
한 줄 요약: Description 첫 문장을 그대로 베끼되, 핵심 조건에 밑줄
CVSS: 점수 + 벡터 원문
공격 코드: searchsploit openssh 결과에서 버전이 맞는 행의 EDB-ID
실전 판단: 점수·코드·조건(인증 필요? 특정 설정 필요?) 종합
검증하는 법: ① 세 장 모두 CVE 번호·점수·벡터·EDB-ID가 채워져 있는가. ② "실전 판단"에 점수와 공격 코드 유무가 둘 다 언급됐는가 — 점수만 보고 판단한 카드는 반쪽입니다. ③ 벡터를 푼 카드가 최소 한 장 있는가.
연습문제 해답
문제 1 해답. 2014는 등록 연도, 0160은 그 해의 일련번호입니다. 번호 체계가 없던 시절에는 같은 취약점을 벤더·연구자·스캐너가 제각각 다른 이름으로 불러, "우리가 지금 말하는 게 같은 취약점인가"부터 확인해야 했습니다. CVE 번호는 전 세계가 공유하는 색인입니다.
문제 2 해답. 첫 번째가 압도적으로 위험합니다. 첫 번째는 네트워크에서(N), 까다로운 조건 없이(L), 인증 없이(N) 공격 가능하고 피해는 세 축 모두 완전(C)입니다. 두 번째는 로컬 접근이 필요하고(L), 조건이 까다로우며(H), 인증이 필요하고(M), 피해도 부분적(P)입니다. 벡터는 점수의 근거 문서입니다.
문제 3 해답. Metasploit 모듈이 있는 7.5짜리를 먼저 검증합니다. 오늘 밤 뚫어야 하는 사람에게 중요한 것은 이론적 심각도가 아니라 "지금 당장 쓸 수 있는 도구가 있는가"입니다. 코드가 공개된 취약점은 누구나 쓸 수 있으므로 방어자 입장에서도 패치 우선순위가 높습니다. 점수는 위험의 이론값, 공개 코드는 위험의 현실값입니다.
문제 4 해답. Path는 Kali 내부의 exploit-db 사본 안에서 그 코드 파일의 위치입니다. 가져오는 명령은 searchsploit -m 49757처럼 -m 옵션에 EDB-ID(번호)를 주는 것입니다. 제목을 넣거나 경로를 직접 cp하는 실수가 잦습니다.
완료 기준 체크리스트
- [ ] CVE 번호의 구조(연도-일련번호)를 설명할 수 있다
- [ ] NVD 페이지에서 Description·점수·벡터·영향 버전의 위치를 안다
- [ ] CVSS 벡터의 각 항목(AV/AC/Au/C/I/A)을 풀어 말할 수 있다
- [ ] Exploit-DB와 searchsploit의 관계(온라인 원본과 오프라인 사본)를 안다
- [ ]
searchsploit -m 번호로 코드를 복사할 수 있다 - [ ] 점수와 공개 코드 유무를 함께 봐야 하는 이유를 설명할 수 있다
- [ ] 미션: CVE 독서 카드 3장을 완성했다
6. 흔한 실수와 해결
벽 1. CVE와 EDB-ID를 헷갈려요
증상: Exploit-DB 검색창에 CVE-2011-2523을 넣고 결과가 이상하다고 느끼거나, 반대로 NVD에 EDB-ID를 넣습니다.
원인: 두 저장소는 번호 체계가 다릅니다. CVE는 취약점의 번호, EDB-ID는 공격 코드의 번호입니다. 하나의 CVE에 여러 EDB-ID가 붙을 수 있습니다(17491, 49757처럼).
해결: "취약점을 읽을 때는 CVE로 NVD, 코드를 찾을 때는 서비스명으로 Exploit-DB"로 기억하세요. NVD 페이지의 참고 링크가 다리 역할을 해 줍니다.
벽 2. 점수만 보고 우선순위를 정해요
증상: CVSS 내림차순으로 정렬해 위부터 검증합니다.
원인: 점수는 "조건이 성립할 때의 최악"을 재는 자입니다. 코드가 없거나 조건이 까다로운 만점짜리보다, 코드가 널린 7점대가 오늘 더 위험할 수 있습니다.
해결: 정렬 기준에 "공개 코드 유무"와 "공격 조건(인증 필요? 특정 설정?)"을 추가하세요. 오늘의 독서 카드 형식이 그 세 가지를 한눈에 보게 해 줍니다.
벽 3. Description의 영어가 길어서 포기해요
증상: NVD 페이지를 열고 Description 단락에서 읽기를 멈춥니다.
원인: CVE 설명은 간결한 편이지만 전문 용어가 섞입니다.
해결: 찾을 단서는 세 개뿐입니다 — "무엇이(어떤 입력이)", "무엇을 여는가(쉘? 코드 실행? 정보 유출?)", "어느 버전까지". 이 세 개만 밑줄 치면 나머지는 생략해도 됩니다. CVE-2011-2523에서는 "backdoor / opens a shell on port 6200 / vsftpd 2.3.4"가 전부였습니다.
벽 4. searchsploit -m에 제목을 넣어요
증상 (출력 예시): searchsploit -m "vsftpd 2.3.4"라고 쳤더니 의도한 것과 다른 결과가 나옵니다.
원인: -m(mirror)이 받는 값은 EDB-ID 번호입니다.
해결: 먼저 searchsploit vsftpd로 검색해 왼쪽 목록에서 번호를 확인하고, searchsploit -m 49757처럼 번호만 넘기세요.
벽 5. 예전 벡터와 새 벡터가 달라 당황해요
증상: 어떤 페이지는 Au:N, 어떤 페이지는 PR:N을 씁니다.
원인: CVSS v2와 v3의 항목 이름이 다릅니다(v2의 Au가 v3에서는 PR과 UI로 세분화됐습니다). CVE-2011-2523처럼 오래된 취약점은 v2 벡터로 적혀 있습니다.
해결: 읽는 법은 같습니다 — "어디서 / 얼마나 까다롭게 / 인증은 / 피해는" 네 물음을 찾으세요. 표기가 다를 뿐입니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| CVE | 취약점의 세계 공통 번호 — CVE-연도-일련번호 |
| NVD | CVE 번호별 상세 정보 DB — 설명, 점수, 영향 버전, 참고 링크 |
| CVSS | 심각도 점수(0~10)와 그 근거인 벡터 문자열 |
| CVSS 벡터 | "어디서/얼마나 까다롭게/인증은/피해는"을 압축한 암호 |
| Exploit-DB | 공개 공격 코드(PoC)의 저장소 — 번호는 EDB-ID |
| searchsploit | Exploit-DB 오프라인 사본 검색 도구 (Kali 내장) |
| PoC | 취약점이 실제로 성립함을 보이는 개념 증명 코드 |
오늘의 명령어와 사이트
| 도구 | 하는 일 |
|---|---|
| nvd.nist.gov | CVE 번호로 진단서 읽기 (설명·점수·벡터·영향 버전) |
| exploit-db.com | 서비스명+버전으로 공개 공격 코드 검색 |
searchsploit 서비스명 |
오프라인 DB에서 공격 코드 검색 |
searchsploit -m EDB-ID |
코드 파일을 내 디렉터리로 복사 (번호로 지정) |
명령어보다 중요한 감각
"버전 번호 → CVE → 공격 코드"로 이어지는 검색 체인이 오늘의 본체입니다. 스캐너가 번호를 던져 주면, NVD에서 진단서를 읽고, Exploit-DB에서 도구가 있는지 확인하는 — 이 세 걸음을 5분 안에 밟는 것이 오늘의 완료 기준이었습니다.
그리고 마지막 감각 하나. 점수는 참고하고, 코드 유무를 보세요. CVSS 10.0과 "Exploit-DB에 코드가 있다"는 서로 다른 종류의 정보입니다 — 전자는 얼마나 나쁜가, 후자는 누구나 할 수 있는가. CVE-2011-2523이 전설적인 이유는 둘 다 해당하기 때문입니다. 이 카드의 마지막 줄 "실전 판단"이 있어야, 뒤이어 Metasploit을 켰을 때(Step 116) 어느 모듈을 찾아야 하는지가 자동으로 정해집니다.
전부 체크되면 Step 115 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.