보안 엔지니어로 일하면서 가장 머리 아픈 순간 중 하나가 "우리 회사 자산이 정확히 뭐가 있지?"라는 질문을 받을 때다. 클라우드 전환이 가속화되면서 서브도메인은 우후죽순 생겨나고, 개발팀마다 제각각 인프라를 구축하다 보니 IT 자산 현황 파악이 점점 어려워지고 있다.
이런 상황에서 공격표면관리(Attack Surface Management, ASM)의 중요성이 대두되고 있다. 공격자의 관점에서 우리 조직이 인터넷에 노출된 자산을 지속적으로 발견하고 모니터링하는 것이 ASM의 핵심이다.
오늘은 ASM을 위한 핵심 도구 중 하나인 OWASP Amass에 대해 실전 경험을 바탕으로 정리해보려 한다.
Amass를 처음 접했을 때 가장 인상 깊었던 점은 단순히 서브도메인만 찾는 도구가 아니라는 것이었다. 네트워크 인프라 정보부터 인증서 투명성 로그, WHOIS 데이터까지 다양한 각도로 조직의 디지털 자산을 탐색할 수 있다.
특히 ASM 관점에서 Amass가 유용한 이유:
# 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
실제 운영에서는 패시브와 액티브 모드를 상황에 맞게 구분해서 사용하고 있다.
타겟 조직의 인프라에 직접적인 요청을 보내지 않고 공개된 정보만 수집한다.
# 기본 패시브 스캔
amass enum -passive -d example.com
# 여러 도메인 동시 스캔
amass enum -passive -d example.com,test.example.com -o passive_results.txt
장점:
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
실제 운영에서는 패시브를 먼저 돌려서 기본 자산을 파악한 후, 필요시 액티브로 세부 정보를 보완하는 방식을 선호한다.
먼저 조직의 기본 디지털 footprint를 파악한다.
# 조직 ASN 기반 IP 대역 발견
amass intel -org "Example Corporation" -max-dns-queries 1000
# 도메인 기반 관련 자산 발견
amass intel -d example.com -whois
# 종합 서브도메인 스캔
amass enum -config /path/to/config.ini -d example.com -o subdomains.txt
# 시간 제약이 있을 때
amass enum -d example.com -timeout 30 -max-dns-queries 500
발견된 서브도메인들의 IP와 네트워크 정보를 수집한다.
# 발견된 서브도메인들의 네트워크 정보 수집
amass track -config /path/to/config.ini -d example.com
# 결과를 데이터베이스에 저장
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 서버를 지정한다.
# 커스텀 리졸버 파일 생성
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
# 발견된 자산 목록 정리
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
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
# 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 실행
cat subdomains.txt | nuclei -t /path/to/nuclei-templates/ -o vulnerabilities.txt
ASM을 수행할 때는 반드시 다음을 준수해야 한다:
대규모 환경에서 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를 강화해 나가길 바란다.