Segala sesuatu yang ingin Anda ketahui tentang aturan Sigma. Bagian 2

Artikel ini adalah kelanjutan dari seri materi kami yang ditujukan untuk deskripsi format aturan Sigma. Marilah kita mengingat secara singkat struktur siklus tersebut. Di posting sebelumnya, kami memberikan contoh aturan sederhana dan melihat secara detail pada bagian yang menjelaskan sumber acara. Sekarang kami memiliki pemahaman umum tentang struktur aturan, dan kami juga dapat menunjukkan di mana dan informasi apa yang harus diberikan ke aturan untuk mendeteksi aktivitas yang mencurigakan.



Sekarang kita perlu belajar bagaimana menjelaskan logika yang akan beroperasi pada data yang diterima dan mengeluarkan keputusan tentang apakah aturan kita akan berfungsi dalam situasi tertentu. Bagian aturan ini dan fitur-fiturnya yang dikhususkan untuk artikel ini. Deskripsi bagian logika deteksi adalah bagian terpenting dari sintaks, pengetahuan yang diperlukan untuk memahami aturan yang ada dan menulis aturan Anda sendiri.



Dalam publikasi berikutnya, kami akan membahas secara rinci tentang deskripsi informasi meta (atribut yang bersifat informatif atau infrastruktur, seperti deskripsi atau pengenal) dan kumpulan aturan. Ikuti publikasi kami!



Deskripsi logika deteksi (atribut deteksi)



Ketentuan pemicu aturan ditetapkan dalam atribut deteksi . Subbidangnya menjelaskan bagian teknis utama dari aturan tersebut. Penting untuk diperhatikan bahwa aturan hanya dapat memiliki satu bagian deskriptif dan beberapa sumber log dan deteksi. Karena bagian deteksi menjelaskan kriteria pemicu berdasarkan data dari bagian sumber, kedua bagian ini memiliki 1 hingga 1.



Secara umum, konten bidang deteksi terdiri dari dua bagian logis:



  • deskripsi asumsi tentang bidang acara (ID pencarian),
  • hubungan logis antara deskripsi ini ( jangka waktu dan ekspresi di bidang kondisi ).






Deskripsi asumsi tentang konten bidang acara dilakukan dengan menentukan pengidentifikasi pencarian. Pengenal seperti itu bisa satu (seperti di sini ) atau bisa ada beberapa (seperti di sini ).



Bagian kedua dapat terdiri dari tiga jenis:



  • kondisi biasa,
  • kondisi dengan ekspresi agregat (seperti pada contoh di atas),
  • kondisi dengan kata kunci dekat .


Sintaks elemen setiap bagian dijelaskan di bagian terkait di artikel ini.



Cari ID



Pengenal pencarian adalah pasangan nilai-kunci, dengan kuncinya adalah nama pengenal pencarian, dan nilainya adalah daftar atau kamus (alias array asosiatif). Dengan analogi dengan bahasa pemrograman - daftar atau peta. Format untuk menentukan daftar dan kamus ditentukan oleh standar YAML, yang dapat ditemukan di sini . Perlu dicatat bahwa format aturan Sigma tidak memperbaiki nama pengenal pencarian, tetapi paling sering Anda dapat menemukan variasi dengan pemilihan kata.



Ada persyaratan umum yang berlaku untuk item daftar dan item kamus:



  • Semua nilai diperlakukan sebagai string tidak peka huruf besar / kecil, artinya, tidak ada perbedaan antara huruf besar dan huruf kecil.
  • (wildcards) β€˜*’ β€˜?’. β€˜*’ β€” ( ), β€˜?’ β€” ( ).
  • β€˜\’, β€˜\*’. , : β€˜\\*’. .
  • , .
  • β€˜ .


List of Values ​​Search Identifier

List of Values ​​berisi string yang dicari di seluruh pesan acara. Elemen daftar digabungkan dengan OR logis.



detection: 
  keywords: 
	- EVILSERVICE 
	- svchost.exe -n evil 
  condition: keywords 
 






Contoh aturan yang berisi pengenal pencarian sebagai daftar nilai:



Pengenal pencarian kamus



Kamus terdiri dari sekumpulan pasangan kunci-nilai, dengan kuncinya adalah nama bidang dari peristiwa, dan nilainya dapat berupa string, bilangan bulat, atau daftar salah satu dari jenis ini (daftar string atau angka digabungkan dengan logika OR). Kumpulan kamus digabungkan dengan logika AND



Skema umum:







Mari pertimbangkan beberapa contoh.



Contoh 1. Aturan aturan deteksi pembersihan log peristiwa



/ windows / builtin / win_susp_security_eventlog_cleared.yml


Aturan ini akan dipicu jika acara memenuhi ketentuan:



EventID = 517 β€―OR EventID = 1102



Pada aturan, terlihat seperti ini:



detection: 
  selection: 
      EventID: 
        - 517 
        - 1102 
  condition: selection 


Di sini pilihan adalah nama satu-satunya pengenal pencarian, dan subbidang lainnya adalah nilainya, dan nilai ini adalah tipe "kamus". Dalam kamus ini, EventID adalah kuncinya, dan angka 517 dan 1102 membentuk daftar, yang merupakan nilai kunci kamus ini.



Contoh 2. Permintaan tiket yang mencurigakan, kemungkinan besar aturan Kerberoasting



/ windows / builtin / win_susp_rc4_kerberos.yml


Aturan ini akan dipicu jika acara memenuhi kondisi:



EventID =β€― β€―4679 DAN TicketOptions = 0x40810000 DAN TicketEncryption = 0x17 DAN ServiceName tidak diakhiri dengan tanda '$'



Pada aturan, tampilannya seperti ini:



detection: 
  selection: 
    EventID: 4769 
    TicketOptions: '0x40810000' 
    TicketEncryption: '0x17' 
  reduction: 
	- ServiceName: '*$' 
  condition: selection and not reduction 


Nilai bidang khusus



Ada dua nilai bidang khusus yang dapat digunakan:



  • Nilai kosong ditentukan oleh dua tanda kutip tunggal ''
  • Nilai null ditentukan oleh kata kunci null


Catatan: nilai yang tidak kosong tidak dapat ditentukan melalui konstruksi not null


Penerapan nilai-nilai ini bergantung pada sistem SIEM target. Untuk mendeskripsikan kondisi not null, Anda perlu membuat pengenal pencarian terpisah dengan nilai kosong dan mengambil negasi dari kondisi tersebut (kolom kondisi, dijelaskan di akhir artikel). Pertimbangkan contoh lebih lanjut dari aturan yang menggunakan deskripsi bidang kosong.



Contoh 3. Peluncuran mencurigakan dari aturan streaming jarak jauh



/ windows / sysmon / sysmon_password_dumper_lsass.yml


Aturan yang ditentukan akan dipicu jika acara memenuhi kondisi:



EventID = 8 DAN TargetImage = 'C: \ Windows \ System32 \ lsass.exe' DAN StartModule adalah bidang kosong



Dalam aturan, terlihat seperti ini:



detection: 
	selection: 
        EventID: 8 
        TargetImage: 'C:\Windows\System32\lsass.exe' 
        StartModule: null 
	condition: selection 


Contoh 4. Menulis file yang dapat dieksekusi ke aliran file alternatif aturan NTFS



/ windows / sysmon / sysmon_ads_executable.yml


Aturan yang dipertimbangkan adalah contoh penunjukan yang benar dari nilai yang tidak kosong. Aturan ini akan dipicu jika acara memenuhi kondisi:



EventID = 15 DAN I mphash != '00000000000000000000000000000000' Imphash



Dalam aturan, terlihat seperti ini:



detection: 
    selection: 
        EventID: 15 
	filter: 
        Imphash:  
        	- '00000000000000000000000000000000' 
        	- null 
	condition: selection and not filter 


Seperti disebutkan di atas, negasi sekarang harus ditempatkan di kondisi (kondisi bidang), dan bukan di pengidentifikasi pencarian.



Pengubah nilai



Interpretasi nilai kolom dalam aturan dapat diubah menggunakan pengubah. Pengubah ditambahkan setelah nama field, setiap pengubah diawali dengan garis vertikal (pipa) - β€œ|”. Mereka dapat dirantai untuk membangun rantai (jalur pipa) pengubah:







Nilai bidang diubah sesuai dengan urutan pengubah dalam rantai. Pengubah bisa dari dua jenis: transform dan pengubah jenis.



Pengubah transformasi adalah pengubah yang mengonversi nilai bidang asli ke beberapa nilai lain, atau mengubah logika untuk memproses daftar nilai dalam pengidentifikasi pencarian. Contoh tipe pertama adalah pengubah Base64, dan yang kedua adalah pengubah semua . Semua pengubah akan dibahas lebih detail nanti.



Mari kita lihat masing-masing pengubah transformasi. Untuk kejelasan, kami akan menunjukkan secara skematis bagaimana tepatnya pengubah ini atau itu mengubah nilai awal.



dimulai dengan



Pengubah startswith digunakan untuk mencocokkan awal string dengan nilai yang diinginkan.







Contoh penggunaan:





berakhir dengan



Pengubah endswith digunakan untuk mencocokkan akhir string dengan nilai pencarian.







Contoh penggunaan:





mengandung



Pengubah berisi memeriksa terjadinya substring di nilai bidang. Faktanya, pengubah ini mengonversi nilai bidang sebagai berikut:







Artinya, jika kita mempertimbangkan hasil penerapan pengubah yang dianggap, Anda dapat menulis rumus berikut:



startswith + endswith = berisi



Contoh:





semua



Biasanya, elemen lembar digabungkan dengan OR logis. Semua pengubah mengubah logika OR menjadi logika AND. Artinya, semua elemen dari daftar harus ada. Mari kita lihat bagaimana kondisi akan berubah dalam skema umum, yang ada di awal bagian:







Seperti yang Anda lihat, ketika semua pengubah diterapkan, koneksi logis antara item daftar menjadi DAN. Biasanya, semua pengubah digunakan bersama dengan pengubah berisi. Sekelompok seperti itu dapat berfungsi sebagai pengganti pola dengan karakter meta wildcard jika urutan bagian statis tidak diketahui.



Contoh penggunaan all modifier :





base64



Pengubah ini diterapkan saat nilai bidang dienkode di Base64 , dan untuk kejelasan, kami menulis teks yang dienkode dalam aturan, dan bukan string Base64 yang dihasilkan.







Pengubah ini mengasumsikan bidang yang sama persis dengan string yang disandikan. Biasanya lebih berguna untuk mengidentifikasi tanda-tanda aktivitas yang mencurigakan dalam data asli daripada mencari kecocokan persis dengan hasil yang dikodekan. Oleh karena itu, belum ada contoh penggunaan pengubah base64 .



base64offset



Karena sifat pengodean Base64, Anda tidak dapat menggunakan pipa dari base64 dan berisi untuk menemukan substring yang dienkode . Pengubah base64offset dibuat untuk tujuan ini . Ini digunakan ketika sebuah string dikodekan Base64 dan kami ingin menemukan substring dari string yang dikodekan. Selain itu, karakter yang mengelilingi substring yang diinginkan tidak diketahui sebelumnya, dan offset substring yang berhubungan dengan awal string tidak diketahui. Anda dapat dengan jelas melihat apa yang dipertaruhkan di sini.



Hampir selalu, pengubah ini digunakan bersama dengan pengubah berisi :







Contoh penggunaan:





Penting! Tiga pengubah transformasi pengkodean berikut hanya digunakan bersama dengan pengubah Base64.


utf16le atau wide



The utf16le dan lebar pengubah adalah sinonim. Mereka mengubah bidang string dalam pengkodean UTF-16LE, yaitu β€œ123” -> 0x31 0x00 0x32 0x00 0x33 0x00.







utf16be



Pengubah utf16be mengonversi nilai string bidang menjadi UTF-16BE, yaitu β€œ123” -> 0x00 0x31 0x00 0x32 0x00 0x33.







utf16



Modifier utf16 menambahkan byte order mark (BOM), dan mengkodekan string dalam UTF-16, yaitu β€œ123” -> 0xFF 0xFE 0x31 0x00 0x32 0x00 0x33 0x00.







Saat ini hanya ada satu jenis pengubah - re .



kembali



Pengubah tipe ini mengartikan nilai bidang sebagai pola ekspresi reguler. Sejauh ini, ini hanya didukung oleh konverter ke kueri Elasticsearch, jadi secara praktis tidak muncul dalam aturan publik.



Contoh penggunaan:





Interval waktu (atribut jangka waktu)



Selain itu, logika deteksi dapat disempurnakan dengan menentukan interval waktu di mana pengenal pencarian akan muncul. Singkatan standar digunakan untuk menunjukkan satuan waktu:



15s  (15 ) 
30m  (30 ) 
12h  (12 ) 
7d   (7 ) 
3M   (3 ) 


Contoh penggunaan:





Deskripsi kondisi pemicu aturan (atribut kondisi)



Menurut dokumentasi resmi Sigma, bagian dari aturan yang berisi kondisi pemicu adalah yang paling kompleks dan akan berubah seiring waktu. Ekspresi berikut saat ini tersedia.



Operasi logis DAN, ATAU



Mereka ditunjukkan oleh kata kunci dan dan atau, masing-masing. Ekspresi ini adalah elemen utama untuk membangun hubungan logis antara pengenal pencarian.



detection: 
  keywords1: 
      - EVILSERVICE
      - svchost.exe -n evil 
  keywords2: 
	- SERVICEEVIL 
	- svchost.exe -n live 
  condition: keywords1 or keywords2 




Contoh penggunaan:





Salah satu nilai ID pencarian / semua nilai ID pencarian (1 / semua pengidentifikasi pencarian)

Sama seperti untuk kasus sebelumnya, jika ID pencarian



  • 1 - logis ATAU di antara alternatif,
  • semua - logis DAN di antara alternatif.


Secara default condition: keywordsberarti bahwa nilai-nilai yang tercantum dalam pengenal kata kunci adalah logis ATAU, artinya, ini sama dengan penulisan condition: 1 of keywords. Jika kita ingin nilainya digabungkan dengan logika AND, maka kita perlu menulis condition: all of keywords.



Contoh penggunaan:





Salah satu ID pencarian / semua ID pencarian (1 / semuanya)

Logis OR (1 dari mereka) atau logis AND (semuanya) di antara semua ID pencarian yang diberikan. Secara default, ID pencarian ditautkan dengan logika AND jika merupakan elemen kamus, atau logika OR jika merupakan elemen daftar. Untuk mengubah hubungan ini, struktur ini dibuat. Jadi, condition, condition: 1 di antaranya, berarti setidaknya salah satu pengenal penelusuran harus muncul dalam acara tersebut.



Contoh penggunaan:





Salah satu ID pencarian yang cocok dengan pola nama / semua ID pencarian yang cocok dengan pola nama (1 / semua pencarian-pengenal-pola)



Sama seperti paragraf sebelumnya, tetapi pemilihannya terbatas pada pengenal pencarian yang namanya cocok dengan pola. Pola semacam itu dibuat menggunakan wildcard * (sejumlah karakter) pada posisi tertentu dalam pola nama.



Sintaksnya adalah sebagai berikut:



condition: 1 of selection* 
 
condition: all of selection* 


Contoh penggunaan:





Negasi logis



Negatif logis dibuat menggunakan kata kunci not . Seperti disebutkan di atas, ekspresi "tidak kosong" harus ditentukan dalam bidang kondisi , bukan dalam deskripsi pengenal penelusuran. Contoh berikut dengan jelas menunjukkan versi deskripsi yang benar dari ekspresi "nilai bidang tidak kosong".







Contoh penggunaan:





Pipa



Bilah vertikal (atau pipa) menunjukkan bahwa hasil ekspresi akan diteruskan ke fungsi agregat, yang hasilnya kemungkinan akan dibandingkan dengan beberapa nilai.



Skema umum:



_ | _  
 
condition: selection | count(category) by dst_ip > 30 


Contoh penggunaan:





Tanda kurung



Tanda kurung digunakan untuk menentukan subekspresi. Ini dapat berguna untuk menentukan urutan di mana ekspresi logika dievaluasi, atau untuk meniadakan predikat yang berisi beberapa ekspresi. Mereka memiliki prioritas tertinggi untuk operasi tersebut.



condition: selection and (keywords1 or keywords2) 
 
condition: selection and not (filter1 or filter2) 


Contoh penggunaan:





Ekspresi Fungsi Agregat



Ekspresi agregat (atau ekspresi fungsi agregat) digunakan untuk mengukur peristiwa yang telah terjadi.



Skema Ekspresi Agregat:







Semua fungsi agregat kecuali hitungan memerlukan nama bidang sebagai parameter. Fungsi hitungan menghitung semua kejadian yang cocok jika tidak ada nama bidang yang ditentukan. Jika nama bidang ditentukan, maka fungsi menghitung nilai yang berbeda di bidang ini. Misalnya, ekspresi berikut menghitung jumlah port berbeda yang sambungan dibuat dari satu alamat IP, dan jika nomor ini melebihi 10, maka aturan dipicu:



condition: selection | count(dst_port) by src_ip > 10 




Contoh penggunaan:





Ekspresi gabungan dekat



Kata kunci dekat digunakan untuk menghasilkan kueri (jika fungsi ini didukung oleh sistem target dan backend) yang mengenali terjadinya semua ID pencarian yang ditentukan dalam interval waktu tertentu setelah menemukan ID pertama.



Skema umum:



near search-id-1 [ [ and search-id-2 | and not search-id-3 ] ... ]



Contoh sintaks:



timeframe: 30s 
condition: selector | near dllload1 and dllload2 and not exclusion 


Aturan yang sama berlaku untuk ekspresi pencarian setelah kata yang mendekati ekspresi pencarian sebelum bilah vertikal, yang telah kami jelaskan di atas.



Contoh penggunaan:





Prioritas operasi default adalah:

  1. (ekspresi)
  2. X dari pola pencarian
  3. Tidak
  4. Dan
  5. Atau
  6. |


Jadi, tanda kurung memiliki prioritas tertinggi, dan pipa memiliki prioritas terendah.



Catatan: jika beberapa bidang kondisi ditentukan, maka nilai akhir diperoleh dengan menerapkan logika OR ke semua nilai ekspresi.


Pada artikel ini, kami telah menjelaskan logika pendeteksian. Ikuti posting kami, di artikel berikutnya kami akan melihat bidang aturan yang tersisa. Sebagian besar bersifat informatif atau infrastruktur. Selain bidang dengan informasi meta, mari kita bahas fitur komposisi aturan seperti itu, yang disebut kumpulan aturan. Bagi orang yang tidak terbiasa dengan seluk-beluk bahasa YAML, pertimbangan aspek sintaksis ini akan berguna saat membaca orang asing dan menulis aturan mereka sendiri.



Penulis : Anton Kutepov, spesialis dari departemen layanan ahli dan pengembangan Teknologi Positif (PT Expert Security Center)



All Articles