Python을 이용한 사이버 보안 정찰 초보자를 위한 최고의 가이드
Source: Dev.to – Best Beginner’s Guide for Cybersecurity Recon with Python
배울 내용
가이드가 끝날 때까지 다음을 할 수 있게 됩니다:
- 패시브와 액티브 정찰의 차이를 이해한다.
- 모든 정찰 프로젝트에 대해 범위와 대상을 효과적으로 정의한다.
- Python을 사용해 DNS 레코드, 서브도메인, 인증서 투명성 로그를 조회한다.
- 호스트 및 서비스 탐지를 위해 비동기 네트워크 스캔을 수행한다.
- 분석 및 보고를 위해 정찰 데이터를 효율적으로 정리한다.
- 정찰 중 은밀함을 유지하기 위해 OPSEC 및 속도 제한 기법을 적용한다.
이러한 기술은 다음을 위한 탄탄한 기반이 된다:
- 침투 테스트
- 버그 바운티 사냥
- OSINT 조사
시작할 준비가 되셨나요? 다음 섹션에서 실습 예제와 코드 스니펫을 계속 확인하세요.
사전 요구 사항
시작하기 전에 Python 3.12 환경이 준비되어 있는지 확인하세요. 아래에 나열된 라이브러리는 정찰 작업에 권장됩니다.
| 라이브러리 | 목적 |
|---|---|
asyncio / trio | 스레드 없이 수천 개의 작업을 동시에 처리 |
httpx | HTTP/2, 프록시 및 SOCKS 지원이 포함된 비동기 HTTP/HTTPS 요청 |
aiodns | DNSSEC 지원이 포함된 비동기 DNS 해석 |
ipwhois | ASN 및 프리픽스 조회 |
rich | 진행 표시줄이 있는 깔끔한 터미널 출력 |
pandas | 데이터 정리, CSV/HTML 내보내기 |
설정
# Create a virtual environment
python3 -m venv recon
source recon/bin/activate
# Install the required packages
pip install httpx[http2] aiodns ipwhois rich pandas
Recon 기본: 능동 vs 수동
수동 정찰
- No direct interaction with the target. → 대상과 직접적인 상호작용이 없습니다.
- Typical sources: WHOIS, crt.sh, Shodan, GitHub, leaked databases. → 일반적인 소스: WHOIS, crt.sh, Shodan, GitHub, 유출된 데이터베이스.
- Stealthy – leaves no logs on the target system. → 은밀함 – 대상 시스템에 로그를 남기지 않습니다.
능동 정찰
- Direct probing: DNS queries, port scans, banner grabbing, web crawling. → 직접 탐색: DNS 쿼리, 포트 스캔, 배너 수집, 웹 크롤링.
- Powerful, but generates logs and can trigger firewalls. → 강력함, 하지만 로그를 생성하고 방화벽을 작동시킬 수 있습니다.
Rule: Always start with passive recon. It’s safer, cost‑free, and helps narrow down what to probe actively.
Rule: 항상 수동 정찰부터 시작하세요. 더 안전하고 비용이 들지 않으며, 능동적으로 탐색할 대상을 좁히는 데 도움이 됩니다.
표준 워크플로우
| # | 단계 | 설명 |
|---|---|---|
| 1 | Scope Definition | 범위 정의 – IP 범위, 도메인 및 직원 별명을 식별합니다. |
| 2 | Passive Recon | 수동 정찰 – 공개적으로 이용 가능한 아티팩트를 수집합니다. |
| 3 | Correlation & Pivot | 상관관계 및 피벗 – 데이터 중복을 제거하고, 발견을 보강하며, 리드를 생성합니다. |
| 4 | Active Recon | 능동 정찰 – 실시간 호스트, 서비스 및 버전을 탐색합니다. |
| 5 | Reporting | 보고 – 분석을 위해 구조화된 JSON 또는 CSV 형식으로 결과를 내보냅니다. |
DNS 레코드 개요
DNS는 인터넷이 식별하고 트래픽을 라우팅하는 기반입니다. 레코드 유형을 이해하면 조직의 온라인 구조에 대한 초기 인사이트를 얻을 수 있습니다.
A / AAAA – 호스트‑대‑IP 매핑
- A – IPv4 주소.
- AAAA – IPv6 주소.
이 레코드들은 서비스가 어디에 호스팅되는지(클라우드 제공업체, 온‑프레미스, 공유 호스팅)를 보여줍니다.
CNAME – 별칭 및 CDN
blog.example.com → cname → example-blog.hosting.net
보통 드러나는 서비스:
- CDN 제공업체 (Cloudflare, Akamai)
- 이메일 플랫폼
- SaaS 대시보드
- 클라우드 호스팅 환경 (AWS, GCP, Azure)
NS – 권한 서버
NS 레코드는 도메인에 대해 권한을 가진 서버를 나타내며, 다음을 추론하는 데 도움이 됩니다:
- 호스팅 제공업체
- DNS가 자체 관리되는지 외부에 위임되는지 여부
- 중복성 / 장애 조치 구성
- 영역 오구성으로 인한 가능한 서브도메인
Note: 자체 호스팅 NS 서버는 대규모 내부 인프라를 나타내는 경우가 많습니다.
MX – 이메일 라우팅
MX 레코드는 이메일을 수신하는 메일 서버를 보여주며 다음을 드러낼 수 있습니다:
- Google Workspace, Microsoft 365, 또는 맞춤형 메일 서버 사용 여부
- 레거시 또는 보안이 취약한 메일 시스템
- 메일 인프라와 연결된 추가 서브도메인
TXT – 보안 정책 및 검증 아티팩트
| 목적 | 예시 |
|---|---|
| 이메일 인증 | SPF, DKIM, DMARC |
| 도메인 검증 | 클라우드/ SaaS 검증 토큰 |
| 공개 공개 | 보안 정책, 소유권 진술 |
| 기타 | 맞춤 메타데이터, API 키(숨김) |
Note: SPF, DKIM, DMARC를 함께 사용하면 위조 이메일을 방지할 수 있습니다.
SRV – 서비스 검색
SRV 레코드는 SIP, LDAP, Kerberos, VoIP, Microsoft 서비스, 게임 서버 등과 같은 서비스에 대한 호스트명과 포트를 지정합니다. 이를 통해 다음을 파악할 수 있습니다:
- 내부 인증 서비스
- 디렉터리 서비스
- 공개 웹에서는 보이지 않는 인프라 의존성
Source: …
서브도메인 탐색 – 공격 표면 확대
서브도메인은 종종 고유한 애플리케이션, API, 관리자 패널, 혹은 온보딩 시스템을 호스팅합니다(예: api.example.com, vpn.example.com, dev.example.com). 이를 발견하면 공격 표면이 넓어집니다.
1. 수동 열거
이미 인터넷을 모니터링하고 있는 외부 소스에서 정보를 수집합니다:
- Certificate Transparency (CT) 로그
- 과거 DNS 데이터
- 검색엔진 도크
각 소스는 도메인의 진화 단계별 다른 정보를 제공합니다.
2. Certificate Transparency 로그
모든 HTTPS 사이트는 SSL/TLS 인증서를 공개 CT 로그에 게시해야 합니다. 여기에는 비공개로 유지될 의도였던 서브도메인도 포함될 수 있습니다.
| 도구 / 서비스 | 설명 |
|---|---|
| crt.sh | 공개 CT‑로그 검색 엔진 |
| bufferover.run | CT, DNS, 역조회 데이터를 집계 |
CT 로그를 통해 발견된 서브도메인 예시
api.example.com
dev.example.com
staging-api.example.com
internal-vpn.example.com
초보자용 파이썬 스크립트 – CT 로그 가져오기
import requests
domain = "example.com"
url = f"https://crt.sh/?q=%25.{domain}&output=json"
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
entries = response.json()
subdomains = {entry["name_value"] for entry in entries}
for sub in sorted(subdomains):
print(sub)
except requests.RequestException as e:
print(f"Error fetching CT logs: {e}")
example.com을 대상 도메인으로 교체하세요. 이 스크립트는 crt.sh에 도메인을 포함하는 모든 인증서를 조회하고, 중복을 제거한 서브도메인 목록을 출력합니다.
3. 다음 단계
- 수동 데이터와 능동 탐지를 병합 – 예: HTTP 요청 전송, 포트 스캔 실행.
- 결과를
pandasDataFrame에 저장 – CSV/JSON으로 손쉽게 내보낼 수 있습니다. - 은밀하게 진행 – 속도 제한(
asyncio.sleep)과 무작위 사용자‑에이전트(httpx)를 구현합니다.
이 기본기를 바탕으로 보다 고급 리콘 파이프라인을 구축하고, 추가 데이터 소스를 통합하며, 전체 규모의 침투 테스트나 버그 바운티 워크플로우로 원활히 전환할 수 있습니다.