re.capture_all

re.capture_all(stringText, regex)

Deskripsi

Gunakan fungsi re.capture_all() untuk mengekstrak setiap kecocokan ekspresi reguler yang tidak tumpang-tindih dari string. Meskipun fungsi re.capture() standar berhenti setelah menemukan kecocokan pertama, re.capture_all() akan terus mencari di seluruh string untuk mengidentifikasi setiap instance yang cocok dengan pola Anda.

Fungsi ini menggunakan dua argumen:

  • string_to_search: String input atau kolom UDM yang ingin Anda telusuri.
  • regex_pattern: Ekspresi reguler yang Anda terapkan. Catatan: Regular expression ini tidak boleh berisi lebih dari satu grup penangkap.

Kasus penggunaan umum

Anda menggunakan re.capture_all() untuk menyelesaikan skenario saat satu kolom log berisi beberapa titik data berharga.

  • Mengekstrak beberapa indikator: Menarik semua alamat IP, URL, atau nama host dari satu pesan log atau kolom deskripsi.
  • Mengurai data berbatas: Mengisolasi nilai tertentu dari kolom yang berisi beberapa informasi yang dipisahkan dengan koma, titik koma, atau dicampur dengan teks lain.
  • Analisis teks berformat bebas: Pindai kolom yang tidak terstruktur (seperti Catatan atau Komentar) untuk mengidentifikasi setiap kecocokan pola, seperti jalur file atau kunci registri.
  • Audit command line: Ekstrak semua argumen atau flag tertentu dari command line proses untuk lebih memahami cakupan perintah.

Jenis data parameter

STRING, STRING

Jenis hasil yang ditampilkan

ARRAY_STRINGS

Contoh

Bagian ini menunjukkan contoh yang mendemonstrasikan cara menerapkan re.capture_all() ke berbagai jenis telemetri. Anda menggunakan pola ini di bagian events untuk memfilter data atau di bagian outcome untuk memperkaya pemberitahuan deteksi akhir.

Contoh: Mengekstrak jalur .conf kelima dari command line

Contoh penelusuran ini pertama-tama mengonfirmasi keberadaan .conf di command line.

Kemudian, perintah ini menyimpan command line lengkap dan mengekstrak kemunculan kelima dari pola tertentu yang terkait dengan jalur file .conf. Anda dapat menggabungkan fungsi re.capture_all() dengan arrays.index_to_str() untuk mengekstrak kemunculan tertentu, seperti jalur .conf kelima dari command line.

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)
Contoh: Mengekstrak semua kata yang diawali dengan error

Dalam contoh aturan ini, Anda mengambil setiap kata yang diawali dengan error dari deskripsi hasil keamanan dan menyimpannya dalam array yang disebut $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
}
Contoh: Gabungkan semua pola seperti IP yang diambil dari string Agen Pengguna

Dalam contoh aturan ini, Anda mengekstrak semua alamat IPv4 dari kolom network.http.user_agent peristiwa keamanan.

Karena re.capture_all() menampilkan array, Anda dapat menggunakan arrays.join_string() untuk menggabungkan kecocokan ini ke dalam satu daftar yang mudah dibaca.

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
}

Batasan umum

  • Grup tangkapan tunggal: Regular expression yang digunakan dengan re.capture_all() tidak boleh berisi lebih dari satu grup tangkapan.
  • Jenis nilai yang ditampilkan array: Fungsi ini menampilkan array string. Untuk menetapkan hasil ke variabel peristiwa atau menggunakannya dalam fungsi yang mengharapkan satu string, Anda biasanya perlu membungkusnya dengan arrays.join_string().