침해 지표 분석은(는) 무엇을 하나요?
사용 시기
이 스킬은 다음과 같은 경우에 사용하세요:
- 피싱 이메일 또는 경보에서 IOC(URL, IP 주소, 파일 해시)가 생성되어 신속한 분류가 필요한 경우
- 자동화된 피드에서 대량의 IOC가 전달되어 차단 제어에 적용 전 신뢰도 점수가 필요한 경우
- 사고 조사 과정에서 관찰된 네트워크 아티팩트에 대한 맥락적 강화가 필요한 경우
높은 중요도의 차단 결정을 위해 이 스킬을 단독으로 사용하지 마십시오 — 특히 CDN, 클라우드 제공업체와 같은 공유 인프라의 경우 항상 자동 강화와 분석가의 판단을 함께 사용하세요.
전제 조건
- 멀티 AV 및 샌드박스 조회를 위한 VirusTotal API 키(무료 또는 Enterprise)
- IP 평판 확인을 위한 AbuseIPDB API 키
- 알려진 캠페인과 교차 참조를 위한 MISP 인스턴스 또는 TIP
requests및vt-py라이브러리가 설치된 Python, 또는 사전 구축된 커넥터가 있는 SOAR 플랫폼
워크플로우
1단계: IOC 유형 정규화 및 분류
강화 전에 각 IOC를 분류합니다:
- IPv4/IPv6 주소: RFC 1918 사설 IP인지 확인(외부 강화 생략), 형식 검증
- 도메인/FQDN: 안전한 처리를 위해 디팡(defang) 처리(
evil[.]com), tldextract를 통해 등록된 도메인 추출 - URL: 도메인과 경로를 별도로 추출, 리다이렉터 확인
- 파일 해시: 해시 유형 식별(MD5/SHA-1/SHA-256), 고유성을 위해 SHA-256 선호
- 이메일 주소: 도메인(MX/DMARC 확인)과 로컬 파트로 분할하여 패턴 분석
실수로 클릭하는 것을 방지하기 위해 문서에서 IOC를 디팡 처리하십시오(.을 [.]로, ://을 [://]로 대체).
2단계: 다중 소스 강화
VirusTotal (파일 해시, URL, IP, 도메인):
import vt
client = vt.Client("YOUR_VT_API_KEY")
# 파일 해시 조회
file_obj = client.get_object(f"/files/{sha256_hash}")
detections = file_obj.last_analysis_stats
print(f"악성: {detections['malicious']}/{sum(detections.values())}")
# 도메인 분석
domain_obj = client.get_object(f"/domains/{domain}")
print(domain_obj.last_analysis_stats)
print(domain_obj.reputation)
client.close()
AbuseIPDB (IP 주소):
import requests
response = requests.get(
"https://api.abuseipdb.com/api/v2/check",
headers={"Key": "YOUR_KEY", "Accept": "application/json"},
params={"ipAddress": "1.2.3.4", "maxAgeInDays": 90}
)
data = response.json()["data"]
print(f"신뢰도: {data['abuseConfidenceScore']}%, 신고 수: {data['totalReports']}")
MalwareBazaar (파일 해시):
response = requests.post(
"https://mb-api.abuse.ch/api/v1/",
data={"query": "get_info", "hash": sha256_hash}
)
result = response.json()
if result["query_status"] == "ok":
print(result["data"][0]["tags"], result["data"][0]["signature"])
3단계: 캠페인 연관성 부여
IOC와 일치하는 기존 이벤트를 MISP에서 조회합니다:
from pymisp import PyMISP
misp = PyMISP("https://misp.example.com", "API_KEY")
results = misp.search(value="evil-domain.com", type_attribute="domain")
for event in results:
print(event["Event"]["info"], event["Event"]["threat_level_id"])
IP 맥락(호스팅 제공업체, 오픈 포트, 배너)을 확인하기 위해 Shodan을 확인하여 IP가 불법 호스팅에 속하는지 또는 합법적인 클라우드 제공업체(오탐 위험)에 속하는지 식별합니다.
4단계: 신뢰도 점수 및 처리 방침 할당
계층적 의사 결정 프레임워크를 적용합니다:
- 차단 (높은 신뢰도 ≥ 70%): VT에서 15개 이상의 AV 탐지, AbuseIPDB 점수 ≥ 70, 알려진 악성코드 패밀리 또는 캠페인과 일치
- 모니터링/경보 (중간 40–69%): 5–14개 AV 탐지, 중간 수준 AbuseIPDB 점수, 캠페인 연관성 없음
- 허용 목록/조사 (낮음 < 40%): 4개 이하 AV 탐지, 신고 기록 없음, 합법적인 서비스(Google, Cloudflare CDN IP)
- 오탐: 합법적인 비즈니스 서비스가 잘못 플래그된 경우, 문서화하고 향후 경보에서 제외
5단계: 문서화 및 배포
TIP/MISP에 다음 내용을 기록합니다:
- 수집된 모든 강화 데이터(타임스탬프, 출처, 점수)
- 처리 방침 결정 및 근거
- 수행된 차단 조치(방화벽, 프록시, DNS 싱크홀)
- 관련 사건 티켓 번호
적절한 신뢰도 필드와 함께 STIX 지표 객체로 내보냅니다.
주요 개념
| 용어 | 정의 |
|---|---|
| IOC | 침해 지표 — 잠재적인 침해를 나타내는 관찰 가능한 네트워크 또는 호스트 아티팩트 |
| 강화 | 여러 인텔리전스 소스로부터 원시 IOC에 맥락 데이터를 추가하는 프로세스 |
| 디팡 | 문서에서 실수로 활성화되는 것을 방지하기 위해 IOC를 수정(.을 [.]로 대체) |
| 오탐률 | 양성 아티팩트가 잘못 악성으로 플래그되는 비율, 차단 임계값 조정에 중요 |
| 싱크홀 | 악성 도메인 조회를 트래픽을 완전히 차단하지 않고 탐지를 위해 양성 IP로 리디렉션하는 DNS 서버 |
| TTL | 차단 제어에서 IOC의 유효 기간, IP 지표는 30일 후, 도메인은 90일 후 만료 |
도구 및 시스템
- VirusTotal: 70개 이상의 AV 엔진, 샌드박스 보고서, 커뮤니티 댓글을 갖춘 멀티 엔진 악성코드 스캐너 및 위협 인텔리전스 플랫폼
- AbuseIPDB: 90일 남용 신고 기록이 있는 커뮤니티 관리 IP 평판 데이터베이스
- MalwareBazaar (abuse.ch): YARA 규칙 연관성 및 악성코드 패밀리 태깅이 포함된 무료 악성코드 해시 저장소
- URLScan.io: 피싱 URL 분류를 위해 스크린샷, DOM, 네트워크 요청을 캡처하는 무료 URL 분석 서비스
- Shodan: IP 강화를 위해 호스팅 제공업체, 오픈 포트, 배너 정보를 제공하는 인터넷 전체 스캔 데이터
일반적인 함정
- 공유 인프라 차단: CDN IP(Cloudflare 104.21.x.x, AWS CloudFront)는 합법적으로 악성 콘텐츠를 호스팅할 수 있지만 IP를 차단하면 수천 개의 합법적인 사이트가 중단됩니다.
- VT 점수 집착: 낮은 VT 탐지 수가 양성을 의미하지는 않습니다 — 제로데이 악성코드와 맞춤형 APT 도구는 종종 처음에는 0점을 기록합니다. 샌드박스 동작, MISP, 패시브 DNS를 확인하십시오.
- 디팡 누락: 이메일 또는 Confluence 문서에 활성 IOC를 붙여넣으면 자동 URL 스캐너나 피싱 도구가 트리거될 수 있습니다.
- 만료 정책 없음: TTL이 없는 IOC는 블랙리스트에 무기한 축적되어 인프라가 합법적인 사용자에 의해 재사용됨에 따라 오탐을 생성합니다.
- 단일 소스 과의존: VirusTotal은 AV 의견을 집계하지만, 모두 잘못되었거나 새로운 악성코드보다 뒤처질 수 있습니다. 높은 중요도 결정에는 3개 이상의 독립적인 소스를 사용하십시오.