SUNBURST
SUNBURST C2 1단계 탐지 - Shannon 엔트로피 활용
About:
Shannon 엔트로피를 사용하여 DGA(Domain-Generation Algorithms)를 탐지합니다.
이 함수에는 FQDN만 입력하거나 CSV 파일에서 읽어야 합니다.
SYNTAX: Prefix_or_subdomain.Domain.TLD
APT가 Kill Chain: C2에서 긴 문자열 DGA를 활용하는 것에 대응하기 위해 제작되었습니다.
표준 편차의 2배 이상 높은 엔트로피를 가진 긴 문자열 URL을 식별합니다.
긴 접두사/하위 도메인이 있는 URL 중 상위 2.5%를 살펴봅니다.
CND 분석가가 필요로 할 경우 추가 메타데이터를 저장합니다 (예: 접두사 길이).
Requirements:
- Python 3.9+
- Python이 PATH 변수에 존재해야 합니다.
- 모든 import 항목 필요 (필요 시 pip install).
- 입력 DNS 로그에는 줄당 1개의 FQDN이 있어야 합니다 (다른 구두점 없음).
- Cisco Top-1M (CSV, ZIP) 또는 Majestic (CSV) Top-1M 파일이 스크립트와 같은 폴더에 있어야 합니다.
How-to-Run (INTERACTIVE MODE is ON, see VARIABLES):
- Python 3.9.x 설치
- 올바른 형식으로 모든 입력 파일 준비 (도메인은 텍스트 파일에 줄당 1개, 구두점 없음)
- 입력 파일이 이 스크립트와 같은 디렉터리/폴더에 있는지 확인하세요.
4a) (Windows) Python IDLE 또는 Visual Studio Code에서 이 스크립트를 엽니다.
4b) (Linux) $~: python3 shannon.py
- 검사할 입력 DNS 로그 파일을 입력합니다.
- 활용할 Cisco Umbrella (CSV/ZIP) 또는 Majestic Top-1M 파일(CSV)을 입력합니다.
- Frequency 및 Shannon Entropy 값이 생성될 때까지 기다립니다.
- 출력 파일을 검사합니다.
How-to-Run (INTERACTIVE MODE is OFF, see VARIABLES):
- Python 3.9.x 설치
- 올바른 형식으로 모든 입력 파일 준비 (도메인은 텍스트 파일에 줄당 1개, 구두점 없음)
- 입력 파일이 이 스크립트와 같은 디렉터리/폴더에 있는지 확인하세요.
4a) (Windows) Python IDLE 또는 Visual Studio Code에서 이 스크립트를 엽니다.
4b) (Linux) $~: python3 shannon.py
- 분석할 입력 로그는 "domains.txt"입니다. VARIABLES를 참조하세요.
- 사전 확률을 만드는 데 사용할 Top-N 파일을 선택하세요. VARIABLES를 참조하세요.
- Frequency 및 Shannon Entropy 값이 생성될 때까지 기다립니다.
- 출력 파일을 검사합니다.
Assumptions:
- 대문자와 소문자가 동일한 확률로 나타납니다.
a) TOR 노드가 DNS 쿼리의 대소문자 구분 및 0x20-encoding을 변경한다는 점은 무시합니다.
- ETOAN 문자 빈도 차트는 0-9, "-", ""가 없어 충분하지 않습니다.
a) 도메인에는 하이픈(-), 밑줄(), 숫자가 포함될 수 있습니다.
- ExploderBot DGA를 대응하도록 설계되지 않았습니다.
- 입력: 단순 텍스트 파일이며 각 URL은 자체 행에 있어야 하며 다른 내용은 없습니다.
- 입력은 금지 문자가 없는 엄격한 URL 문자열로만 구성됩니다.
- 입력 및 출력 파일은 이 스크립트와 같은 폴더에 있어야 합니다.
- Python3가 PATH 변수에 있어야 합니다.
Data Set (Domains):
데이터 세트는 SQLite에서 추출한 Pi-Hole 쿼리 로그(12시간 창)에서 파생되었습니다.
BASH:
$~: sqlite3 /etc/pihole/pihole-FTL.db "SELECT domain FROM queries WHERE timestamp >='$(($(date +%s) - 43200))'" > domains.txt
데이터는 Excel > Data > Remove Duplicates를 사용하여 중복 제거되었습니다.
역방향 조회(PTR) in-addr.arpa 데이터도 제거되었습니다.
Data Set (Probabilities):
RedCanary의 DGA 분석 결과를 활용하여 이 스크립트는 URL을 가져와 Shannon 엔트로피를 계산합니다.
DevOps Testing Phase Line:
- shannon.py (1.0) - 정적 RedCanary Dictionary로 계산이 작동하도록 합니다.
- shannon.py (1.1) - 약간의 테스트가 1.0에 병합됨.
- dictionary.py (1.0) - Cisco + Majestic Top-1M 열기/닫기 테스트.
- shannon.py (2.0) - 1.0과 dictionary.py 테스트 함수 결합.
Reference:
Splunk Shannon Entropy - 아이디어가 나온 곳*
https://www.splunk.com/en_us/blog/tips-and-tricks/when-entropy-meets-shannon.html
SANS Mark Baggett - RedCanary가 Alexa Top 1M 분석에 사용한 도구
https://github.com/markbaggett/freq
RedCanary - Probability 점수가 나온 블로그
https://redcanary.com/blog/threat-hunting-entropy/
Alexa's Top 1M Domains - RedCanary가 사용한 데이터 말뭉치
https://www.alexa.com/topsites
DGA Detector
https://github.com/exp0se/dga_detector
Shannon Entropy - 공식
https://towardsdatascience.com/the-intuition-behind-shannons-entropy-e74820fe9800