re.capture_all

re.capture_all(stringText, regex)

설명

re.capture_all() 함수를 사용하여 문자열에서 정규 표현식과 일치하는 모든 중복되지 않는 항목을 추출합니다. 표준 re.capture() 함수는 첫 번째 일치 항목을 찾은 후 중지되지만 re.capture_all()는 전체 문자열을 계속 검색하여 패턴과 일치하는 모든 인스턴스를 식별합니다.

이 함수에는 두 개의 인수가 사용됩니다.

  • string_to_search: 검색할 입력 문자열 또는 UDM 필드입니다.
  • regex_pattern: 적용할 정규 표현식입니다. 참고: 이 정규 표현식에는 캡처 그룹이 두 개 이상 포함되어서는 안 됩니다.

일반적인 사용 사례

re.capture_all()는 단일 로그 필드에 여러 유용한 데이터 포인트가 포함된 시나리오를 해결하는 데 사용됩니다.

  • 여러 지표 추출: 단일 로그 메시지 또는 설명 필드에서 모든 IP 주소, URL 또는 호스트 이름을 가져옵니다.
  • 구분된 데이터 파싱: 여러 정보가 쉼표, 세미콜론으로 구분되거나 다른 텍스트와 혼합된 필드에서 특정 값을 분리합니다.
  • 자유 형식 텍스트 분석: 구조화되지 않은 필드 (예: 메모 또는 댓글)를 스캔하여 파일 경로나 레지스트리 키와 같은 모든 패턴 일치를 식별합니다.
  • 명령줄 감사: 프로세스 명령줄에서 모든 인수 또는 특정 플래그를 추출하여 명령의 범위를 더 잘 파악합니다.

매개변수 데이터 유형

STRING, STRING

반환 유형

ARRAY_STRINGS

예시

이 섹션에서는 다양한 유형의 원격 분석에 re.capture_all()를 적용하는 방법을 보여주는 예를 제공합니다. events 섹션에서 이러한 패턴을 사용하여 데이터를 필터링하거나 outcome 섹션에서 최종 감지 알림을 보강합니다.

예: 명령줄에서 다섯 번째 .conf 경로 추출

이 검색 예에서는 먼저 명령줄에 .conf가 있는지 확인합니다.

그런 다음 전체 명령줄을 저장하고 .conf 파일 경로와 관련된 특정 패턴의 다섯 번째 항목을 추출합니다. re.capture_all() 함수를 arrays.index_to_str()와 결합하여 명령줄에서 다섯 번째 .conf 경로와 같은 특정 항목을 추출할 수 있습니다.

re.regex(principal.process.command_line, `\.conf`)
$command_line = principal.process.command_line
$path_component_5 = arrays.index_to_str(re.capture_all(principal.process.command_line, `[s='"]([^'"=s]*.conf)`), 4)
예: error로 시작하는 모든 단어 추출

이 규칙 예에서는 보안 결과 설명에서 error로 시작하는 모든 단어를 캡처하여 $all_errors이라는 배열에 저장합니다.

rule ExtractErrors {
  meta:
    author = "user@example.com"
  events:
    $e.principal.hostname = "server1"
    $log_message = $e.security_result[0].description
  outcome:
    $all_errors = re.capture_all($log_message, `error\w+`)
  condition:
    $e
}
예: User-Agent 문자열에서 캡처된 모든 IP 유사 패턴 결합

이 규칙 예시에서는 보안 이벤트의 network.http.user_agent 필드에서 모든 IPv4 주소를 추출합니다.

re.capture_all()는 배열을 반환하므로 arrays.join_string()를 사용하여 이러한 일치 항목을 읽기 쉬운 단일 목록으로 병합할 수 있습니다.

rule CaptureAllIPs {
  meta:
    author = "user@example.com"
  events:
    $e.network.http.user_agent != ""
    $captured_ips = arrays.join_string(re.capture_all($e.network.http.user_agent, `\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}`), ", ")
  condition:
    $e
}

알려진 제한사항

  • 단일 캡처 그룹: re.capture_all()와 함께 사용되는 정규 표현식에는 캡처 그룹이 두 개 이상 포함되어서는 안 됩니다.
  • 배열 반환 유형: 함수는 문자열 배열을 반환합니다. 결과를 이벤트 변수에 할당하거나 단일 문자열을 예상하는 함수에서 사용하려면 일반적으로 arrays.join_string()로 래핑해야 합니다.