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: Ekspresi reguler 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 yang dibatasi: Mengisolasi nilai tertentu dari kolom yang berisi beberapa informasi yang dipisahkan dengan koma, titik koma, atau dicampur dengan teks lain.
  • Analisis teks bebas: Memindai kolom tidak terstruktur (seperti Catatan atau Komentar) untuk mengidentifikasi setiap kecocokan pola, seperti jalur file atau kunci registri.
  • Baris perintah audit: Ekstrak semua argumen atau tanda tertentu dari baris perintah proses untuk lebih memahami cakupan perintah.

Jenis data parameter

STRING, STRING

Jenis nilai 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 spesifik 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: Ekstrak 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: Ekspresi reguler 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().