OWASP Amass로 시작하는 실전 공격표면관리(ASM)

이군·2026년 1월 17일

시작하며

보안 엔지니어로 일하면서 가장 머리 아픈 순간 중 하나가 "우리 회사 자산이 정확히 뭐가 있지?"라는 질문을 받을 때다. 클라우드 전환이 가속화되면서 서브도메인은 우후죽순 생겨나고, 개발팀마다 제각각 인프라를 구축하다 보니 IT 자산 현황 파악이 점점 어려워지고 있다.

이런 상황에서 공격표면관리(Attack Surface Management, ASM)의 중요성이 대두되고 있다. 공격자의 관점에서 우리 조직이 인터넷에 노출된 자산을 지속적으로 발견하고 모니터링하는 것이 ASM의 핵심이다.

오늘은 ASM을 위한 핵심 도구 중 하나인 OWASP Amass에 대해 실전 경험을 바탕으로 정리해보려 한다.

왜 Amass가 ASM에 적합한가?

Amass를 처음 접했을 때 가장 인상 깊었던 점은 단순히 서브도메인만 찾는 도구가 아니라는 것이었다. 네트워크 인프라 정보부터 인증서 투명성 로그, WHOIS 데이터까지 다양한 각도로 조직의 디지털 자산을 탐색할 수 있다.

특히 ASM 관점에서 Amass가 유용한 이유:

  • 포괄적 데이터 소스: 100개 이상의 데이터 소스를 통합 활용
  • 패시브/액티브 모드: 상황에 따른 유연한 정찰 수행
  • 관계형 데이터 모델: 자산 간 연관성까지 파악 가능
  • 자동화 친화적: CI/CD 파이프라인에 쉽게 통합

빠른 설치

# Homebrew로 설치 (macOS/Linux)
brew install amass

# Go를 통한 설치 (권장: 최신 소스 기반)
go install -v github.com/owasp-amass/amass/v4/...@master

# 또는 바이너리 다운로드(리눅스 예시)
wget https://github.com/OWASP/Amass/releases/latest/download/amass_linux_amd64.zip
unzip amass_linux_amd64.zip && sudo mv amass /usr/local/bin/

설치 후 버전 확인:

amass -version

패시브 vs 액티브: 기본 개념 잡기

실제 운영에서는 패시브와 액티브 모드를 상황에 맞게 구분해서 사용하고 있다.

패시브 정찰 (Passive Reconnaissance)

타겟 조직의 인프라에 직접적인 요청을 보내지 않고 공개된 정보만 수집한다.

# 기본 패시브 스캔
amass enum -passive -d example.com

# 여러 도메인 동시 스캔
amass enum -passive -d example.com,test.example.com -o passive_results.txt

장점:

  • 탐지 위험 거의 없음
  • 빠른 실행 속도
  • 대용량 스캔 가능

액티브 정찰 (Active Reconnaissance)

DNS 조회, 인증서 검증 등 타겟에 직접 쿼리를 전송한다.

# 액티브 스캔 (DNS bruteforce 포함)
amass enum -active -d example.com -p 80,443,8080,8443

# 더 공격적인 스캔 (조심해서 사용)
amass enum -active -brute -d example.com -w /path/to/wordlist.txt

실제 운영에서는 패시브를 먼저 돌려서 기본 자산을 파악한 후, 필요시 액티브로 세부 정보를 보완하는 방식을 선호한다.

실전 워크플로: 단계별 ASM 수행

1단계: 초기 자산 발견

먼저 조직의 기본 디지털 footprint를 파악한다.

# 조직 ASN 기반 IP 대역 발견
amass intel -org "Example Corporation" -max-dns-queries 1000

# 도메인 기반 관련 자산 발견
amass intel -d example.com -whois

2단계: 서브도메인 열거

# 종합 서브도메인 스캔
amass enum -config /path/to/config.ini -d example.com -o subdomains.txt

# 시간 제약이 있을 때
amass enum -d example.com -timeout 30 -max-dns-queries 500

3단계: 네트워크 매핑

발견된 서브도메인들의 IP와 네트워크 정보를 수집한다.

# 발견된 서브도메인들의 네트워크 정보 수집
amass track -config /path/to/config.ini -d example.com

4단계: 데이터베이스 구축

# 결과를 데이터베이스에 저장
amass db -d example.com -enum 1 -show

# JSON 형태로 내보내기
amass db -d example.com -json output.json

고급 활용: 설정 최적화

설정 파일 활용

config.ini 파일을 통해 API 키와 세부 옵션을 관리한다.

# config.ini 예시
[scope]
[scope.domains]
domain = example.com
domain = example.org

[scope.blacklisted]
subdomain = test.example.com

[data_sources]
[data_sources.Shodan]
[data_sources.Shodan.Credentials]
apikey = your_shodan_api_key

[data_sources.VirusTotal]
[data_sources.VirusTotal.Credentials]
apikey = your_virustotal_api_key

[resolvers]
resolver = 8.8.8.8
resolver = 1.1.1.1

[settings]
minimum_ttl = 1440

커스텀 DNS 리졸버 설정

성능 향상을 위해 신뢰할 수 있는 DNS 서버를 지정한다.

# 커스텀 리졸버 파일 생성
echo "8.8.8.8" > custom_resolvers.txt
echo "1.1.1.1" >> custom_resolvers.txt
echo "9.9.9.9" >> custom_resolvers.txt

# 리졸버 파일 사용
amass enum -d example.com -rf custom_resolvers.txt

속도 조절과 스텔스 모드

대규모 조직을 스캔할 때는 속도 조절이 중요하다.

# 느린 스캔 (탐지 회피)
amass enum -d example.com -max-dns-queries 100 -rate-limit 5

# 빠른 스캔 (내부망 등)
amass enum -d example.com -max-dns-queries 10000

결과 활용: 자산 DB와 지속적 모니터링

자산 인벤토리화

# 발견된 자산 목록 정리
amass db -d example.com -names | sort -u > asset_inventory.txt

# IP 목록 추출
amass db -d example.com -names | xargs -I {} dig +short {} | sort -u > ip_list.txt

변경 감지 모니터링

주기적으로 스캔을 실행하여 새로운 자산이나 변경사항을 감지한다.

#!/bin/bash
# daily_asm_scan.sh

DOMAIN="example.com"
DATE=$(date +%Y%m%d)
CURRENT_SCAN="scan_${DATE}.txt"
PREVIOUS_SCAN="scan_$(date -d '1 day ago' +%Y%m%d).txt"

# 현재 스캔 실행
amass enum -passive -d $DOMAIN -o $CURRENT_SCAN

# 변경사항 감지
if [ -f $PREVIOUS_SCAN ]; then
    NEW_ASSETS=$(comm -13 <(sort $PREVIOUS_SCAN) <(sort $CURRENT_SCAN))
    if [ ! -z "$NEW_ASSETS" ]; then
        echo "새로 발견된 자산들:"
        echo "$NEW_ASSETS"
        # 알림 전송 로직 추가
    fi
fi

CI/CD 파이프라인 통합

GitHub Actions 예시:

name: ASM Scan
on:
  schedule:
    - cron: '0 2 * * *'  # 매일 오전 2시 실행

jobs:
  asm-scan:
    runs-on: ubuntu-latest
    steps:
      - name: Install Amass
        run: go install -v github.com/owasp-amass/amass/v4/...@master
      
      - name: Run ASM Scan
        run: |
          amass enum -passive -d ${{ secrets.TARGET_DOMAIN }} -o results.txt
        
      - name: Upload Results
        uses: actions/upload-artifact@v2
        with:
          name: asm-results
          path: results.txt

다른 도구와의 연계

Nmap과 연계한 포트 스캔

# Amass 결과를 Nmap으로 전달
amass enum -passive -d example.com | tee subdomains.txt
nmap -iL subdomains.txt -p 80,443,8080,8443 --open -oN port_scan.txt

Nuclei로 취약점 스캔

# 발견된 서브도메인들에 대해 Nuclei 실행
cat subdomains.txt | nuclei -t /path/to/nuclei-templates/ -o vulnerabilities.txt

운영 시 유의사항

법적/윤리적 고려사항

ASM을 수행할 때는 반드시 다음을 준수해야 한다:

  1. 자사 자산만 스캔: 승인받지 않은 외부 조직 스캔 금지
  2. 합리적 속도: DDoS로 오해받을 수 있는 과도한 쿼리 자제
  3. 데이터 보호: 수집된 정보의 안전한 보관 및 접근 제한
  4. 투명성: 보안팀 내 ASM 활동 공유 및 문서화

실전 팁

  1. 점진적 확장: 작은 도메인부터 시작해서 점차 범위 확대
  2. API 키 관리: 가능한 많은 데이터 소스의 API 키 확보
  3. 정기적 업데이트: Amass와 데이터 소스는 지속적으로 업데이트
  4. 결과 검증: 자동화된 발견 결과는 반드시 수동 검증

성능 최적화

대규모 환경에서 Amass를 효율적으로 사용하는 방법:

# 병렬 처리를 위한 도메인 분할
echo "subdomain1.example.com" > batch1.txt
echo "subdomain2.example.com" > batch2.txt

# 백그라운드에서 병렬 실행
amass enum -df batch1.txt &
amass enum -df batch2.txt &
wait

마무리

Amass는 단순한 서브도메인 발견 도구를 넘어 종합적인 ASM 솔루션의 핵심 구성요소로 활용할 수 있다. 하지만 도구는 결국 도구일 뿐이고, 수집된 데이터를 어떻게 분석하고 액션으로 연결하느냐가 더 중요하다.

실제 운영에서는 Amass로 발견한 자산들을 정기적으로 취약점 스캔하고, 불필요한 서비스는 제거하며, 새로 생성되는 자산에 대한 보안 정책을 수립하는 것이 핵심이다.

보안은 일회성 작업이 아닌 지속적인 프로세스다. Amass를 활용한 ASM도 마찬가지로, 꾸준한 모니터링과 개선을 통해 조직의 보안 posture를 강화해 나가길 바란다.

profile
이군의 보안, 그리고 생각을 다룹니다.

0개의 댓글