스캔 도구: 보안 엔지니어의 관점
스캐닝 도구는 현대 사이버 보안에서 양날의 검과도 같습니다. 방어자에게는 취약점 발견, 자산 인벤토리, 지속적인 보안 검증을 위해 필수적입니다. 공격자에게 스캐닝 도구는 종종 악용의 첫 번째 단계를 통해 대규모 정찰, 핑거프린팅, 취약점 발견이 가능합니다.
'방어 제품'이라는 관점에서만 스캐닝 도구를 이해하는 것은 불완전합니다. 시스템을 효과적으로 보호하려면 보안 엔지니어는 다음을 이해해야 합니다. 공격자가 실제로 스캐닝 도구를 사용하는 방법스캔이 탐지를 회피하는 방법과 방어자가 이를 식별하고 무력화할 수 있는 방법에 대해 알아보세요.
이 문서에서는 다음 사항에 중점을 두고 양쪽에서 스캔 도구를 살펴봅니다. 실제 남용 패턴다음에 네 가지 구체적인 공격 및 방어 코드 예시 프로덕션 환경을 반영합니다.

실제로 스캔 도구란 무엇인가요?
실제 사용 환경에서 스캔 도구는 일반적으로 몇 가지 범주로 나뉩니다:
- 네트워크 스캐너(포트 및 서비스 검색)
- 웹 애플리케이션 스캐너(DAST 스타일 프로빙)
- API 스캐너(스키마 및 행동 분석)
- 클라우드 및 자산 스캐너(잘못된 구성 검색)
공격자는 단일 도구에 의존하는 경우는 거의 없습니다. 대신 경량 스캐너, 사용자 지정 스크립트, 우회 기법을 연쇄적으로 사용하여 탐지 임계값을 낮게 유지합니다.
공격 체인에서 스캐닝 툴이 중요한 이유
스캔은 기본적으로 노이즈가 발생하지 않습니다. 최신 공격이 선호합니다:
- 저속 스캔
- 분산 소스 IP
- 프로토콜 준수 요청
- 타이밍 및 헤더 무작위화
이를 통해 공격자는 정밀한 공격 맵을 구축하면서 정상 트래픽에 섞여 들어갈 수 있습니다.
공격 및 방어 코드 예시
아래는 다음과 같습니다. 일반적인 스캔 도구 악용 기법 4가지와 각각 짝을 이루는 실질적인 방어 대책.
공격 예시 1: IDS 회피를 위한 저속 포트 스캐닝
공격자는 기존의 빠른 스캔 대신 스캔 속도를 조절하여 알림이 트리거되지 않도록 합니다.
공격: 느린 TCP 포트 스캔(Python)
python
소켓 가져오기
가져오기 시간
target = "192.168.1.10"
포트 = [22, 80, 443, 8080]
를 포트에 입력합니다:
s = 소켓.소켓()
s.setimeout(2)
시도해 보세요:
s.connect((target, port))
인쇄(f"[+] 포트 {포트} 열기")
예외:
통과
s.close()
time.sleep(10) # 의도적으로 느림
이 스캔은 몇 분 또는 몇 시간이 걸릴 수 있지만 속도 기반 감지를 우회하는 경우가 많습니다.
방어: 방어: 연결 속도 프로파일링
python
컬렉션에서 기본 딕셔너리 가져오기
가져오기 시간
connection_log = defaultdict(list)
def log_connection(ip):
now = time.time()
connection_log[ip].append(now)
최근 = [connection_log[ip]의 t에 대한 t if now - t < 300]
len(최근) > 20:
print(f"{ip}에서 의심스러운 스캔 동작")
방어 인사이트: 탐지는 다음 사항에 중점을 두어야 합니다. 시간 경과에 따른 행동트래픽이 폭증하지 않습니다.
공격 사례 2: 웹 스캐너 지문 인식 회피
공격자는 정상적인 브라우저 트래픽처럼 보이도록 스캔을 위장합니다.
공격 헤더 위장 스캐너
python
가져오기 요청
헤더 = {
"사용자-에이전트": "Mozilla/5.0",
"수락": "text/html,application/xhtml+xml",
}
페이로드 = ["/admin", "/.git", "/backup.zip"]
를 페이로드의 p로 대체합니다:
r = requests.get(f"{p}", headers=headers)
print(p, r.status_code)
이렇게 하면 기본적인 '스캐너 사용자-에이전트' 규칙을 피할 수 있습니다.
방어 방어: 경로 엔트로피 및 접속 패턴 탐지
python
수학 가져오기
def 엔트로피(들):
컬렉션에서 카운터 가져오기
probs = [카운터(s).values() 중 n에 대해 n / len(s)]
반환 -sum(p * math.log2(p) for p in probs)
경로 = ["/admin", "/.git", "/backup.zip"]
를 경로에 추가합니다:
엔트로피(p)가 2.5 이상인 경우:
print("고위험 스캔 경로가 감지되었습니다:", p)
방어 인사이트: 공격 탐지 시 고려해야 할 사항 요청 대상요청하는 사람뿐만 아니라
공격 예시 3: 스키마 열거를 통한 API 스캐닝
공격자는 API를 스캔하여 문서화되지 않은 엔드포인트와 매개변수를 유추합니다.
공격: API 매개변수 검색
python
가져오기 요청
params = ["id", "user_id", "debug", "admin"]
매개변수의 p를 입력합니다:
r = requests.get(
"",
params={p: "1"}
)
if r.status_code != 400:
print(f"흥미로운 매개변수: {p}")
이를 통해 숨겨진 로직 및 액세스 제어 결함이 드러납니다.
방어: 엄격한 매개변수 허용 목록
python
ALLOWED_PARAMS = {"id"}
def validate_params(request_params):
요청_파람의 p에 대해:
p가 ALLOWED_PARAMS에 없는 경우:
ValueError("잘못된 매개변수 감지") 발생
방어 인사이트: 느슨한 매개변수 처리는 API 검색을 검색 오라클로 전환합니다.
공격 예시 4: IP를 통한 분산 스캐닝
공격자는 상관관계를 회피하기 위해 여러 IP 주소에 검사를 분산시킵니다.
공격 회전 소스 스캔(개념)
python
target = ["", ""]
를 타겟에 추가합니다:
다른 호스트 또는 프록시에서 실행되는 #
send_request_from_random_ip(t)
각 IP는 정상으로 보이지만 총체적으로 애플리케이션을 매핑합니다.
방어: 방어: IP 간 행동 상관관계
python
def correlate_requests(logs):
지문 = {}
를 사용하여 로그에 입력합니다:
key = (entry["path"], entry["method"])
fingerprint.setdefault(key, set()).add(entry["ip"])
for k, ips in fingerprint.items():
len(ips) > 10:
print("분산 스캔이 다음에서 감지됨:", k)
방어 인사이트: 스캔 도구는 종종 스스로를 드러냅니다. 전체적으로 볼 때만.

보안 팀을 위한 핵심 사항
스캐닝 도구는 본질적으로 악의적인 것은 아닙니다. 남용 패턴을 예측할 수 있습니다.. 서명이나 정적 규칙에만 의존하는 방어자는 놓칠 수 있습니다:
- 느린 스캔
- 헤더 마스킹 프로브
- API 추론 공격
- 분산 정찰
효과적인 방어가 필요합니다:
- 행동 기준선
- 시간적 상관관계
- 시맨틱 요청 분석
- 컨텍스트 인식 로깅
최종 생각
스캔 도구는 거의 모든 심각한 공격의 오프닝 동작. 스캐닝을 '배경 소음'으로 취급하는 것은 가장 일반적인 방어 사각지대 중 하나입니다.
공격자가 실제로 스캔하는 방식을 이해하고 프로토콜, 로직, 행동 계층에서 방어 체계를 계측함으로써 조직은 위협을 탐지할 수 있습니다. 악용이 시작되기 전가 아니라 손상이 완료된 후입니다.

