GRR - Google Rapid Response


GRR
GRR veya GRR Rapid Response, Google tarafından geliştirilen açık kaynaklı uzaktan ve canlı olay müdahale (incident response) kütüphanesidir. Hem sunucu hem istemci tarafı python ile yazılmıştır. GRR’ın istemci tarafı platform bağımsız olduğu için büyük bir esneklik sağlamaktadır. GRR’ın amacı büyük ekosistemlerde hızlı bir şekilde forensic analizi yapmaktır.
GRR’ın mimarisi sunucu ve istemciden oluşmaktadır. GRR sunucusu varsayılan ayarlarla kurulduğundan 8000 portundan yöneticiye web arayüzü sunmaktadır. Bunun dışında işleri otomatize etmek için gerekli API’ı sağlamaktadır. Angular JS Web UI ve RESTFul JSON API sağlayarak Python, PowerShell ve Go dillerinde programlar yazmamıza imkan tanımaktadır. Cron Work’ler  yardımıyla otomatik olarak belirli aralıklarla analiz yapmaya da olanak sağlar. Bunların dışında verdiği sonuçları birden fazla dosya türüyle (CSV, zip, Sqlite vb.) indirip analizini yapabilmekteyiz.
Analiz yapmak istediğimiz makineye de GRR’ın istemcisini kurmamız gerekmektedir. İstemci ilk kurulduğunda sistem özelliklerini, donanım özelliklerini ve buna benzer bilgileri analiz eder ve sunucuya yollar. Aşağıda GRR’ın mimarisine ait bir görsel bulunmaktadır.




 Kurulum

GRR bize 4 tane kurulum yöntemi sunuyor. Bu 4 yöntem aşağıdaki gibidir:
  • DEB dosyasından kurulum*
  • PIP üzerinden kurulum
  • Docker üzerinden kurulum*
  • Kaynak kodlardan kurulum
Bu yazıda Google’ın önerdiği yol ve Docker ile kurulumu anlatılacaktır. Yazıda kullanılan makinelere ait özellikler aşağıdaki gibidir:
  • Sunucuda 4 GB ramli Ubuntu 18.04 makine kullanılmıştır.
  • Linux istemci Remnux distrosu üzerine kurulmuştur.
  • Windows istemci 4GB ramli Windows makinesi üzerine kurulmuştur.

Önerilen Yol

GRR varsayılan veri tabanı olarak MySQL kullanmaktadır. Bundan dolayı ya kendi makinemize veya uzaktaki bir makinedeki MySQL veri tabanına bağlı olması gerekmektedir. İlk olarak MySQL’i kuruyoruz.
apt install -y mysql-server
MySQL’i açıp gerekli yapılandırmaları yapmak için bağlanıyoruz.
mysql - u root -p

İlk defa root database kullanıcısyla giriş yaptığımızda, parola girmemizi isteyecek. Buraya parolamızı giriyoryuz.


MySQL üzerinde GRR için gerekli ayarları yapıyoruz. Bu ayarlarda veri tabanına gelecek maksimum paket sayısını değiştirip, gerekli veri tabanını oluşturuyoruz. Bu komutlar sırasıyla aşağıda verilmiştir. Komutların sonuna “;” koymayı unutmamak gerekiyor.
SET GLOBAL max_allowed_packet=41943040;

CREATE USER 'grr'@'localhost' IDENTIFIED BY 'password';


CREATE DATABASE grr;


GRANT ALL ON grr.* TO 'grr'@'localhost';


Sırada GRR’ın .deb uzantılı kurulum dosyasını indirip kurmak kaldı. Dosyayı wget komutuyla indiriyoruz.
wget https://storage.googleapis.com/releases.grr-response.com/grr-server_3.3.0-4_amd64.deb
İndirdiğimiz .deb uzantılı dosyayı kurmak için aşağıdaki komutu kullanıyoruz.
sudo apt install -y ./grr-server_3.3.0-4_amd64.deb

Burada yazılar akmaya başlayacak. Bu kuruluma başlandığı anlamına geliyor. Varsayılan ayarlar kullanılabilir fakat dikkat edilmesi gereken bazı noktalar var. Bizden database’de oluşturduğumuz root parolamızı isteyecek, bunu dikkatli bir şekilde girmeliyiz. Bir de hostname isteyecek. Burada ben sunucu makinesinin IP adresini girdim. Siz isterseniz varsayılan ayar olan “demo”yu girebilirsiniz fakat ileride çalıştırılabilir dosyalar buna göre oluşacaktır. Bağlanmama durumunda “demo”yu host’lara eklemeniz gerekmektedir.


Yukarıdaki ayarları yaptıktan sonra bize çalıştırılabilir dosyaları tekrardan oluşturalım mı oluşturmayalım mı diye soracak. Burada “y” yazıp dosyaları tekrar oluşturmakta fayda var.
Artık GRR’ı sunucu tarafını kurduk. Başarılı olup olmadığını görmek için tarayıcıdan localhost:8000 adresine gidiyoruz. Bizden kullanıcı adı ve parola isteyecek. Varsayılan ayarlarla kurduysak kullanıcı adımız “admin”, parola “demo” olacaktır. Servis olarak eklenen grr-server’ı “service grr-server status” komutuyla da kontrol edebiliriz.




GRR’ın sunucu tarafı ayakta ve düzgün bir şekilde çalıştığından emin olduktan sonra ilk istemcimizi kuralım. GRR’ın web arayüzünden Binaries’e girdiğimizde bize farklı seçenekler sunacaktır.



Burada istemcinizin işletim sistemine uygun olan dosyayı indirin ve istemcinize kopyalayın. Kopyaladığınız dosyayı çalıştırın ve istemciniz hazır hale gelsin.



İstemci kurulumu tamamlandıktan sonra bu makineyi sunucu tarafında görebiliyoruz. Bunun için web arayüzüne girip “Search” kısmını boş bırakarak arama yapmanız yeterlidir. Bu bize bütün makineleri göstermektedir.




Önerilen yol ile kurulum bu şekilde olmaktadır.

Docker ile Kurulum

Docker ile sunucu tarafını kurmak oldukça kolay. Docker imajını indirip gerekli parametrelerle çalıştırmak yetiyor. İmajı indirmek için aşağıdaki komutu kullanacağız.

docker pull grrdocker/grr



İmajı indirdikten sonra gerekli parametrelerle sunucuyu ayağa kaldırıyoruz.
docker run --name grr-server -e EXTERNAL_HOSTNAME=”<IP Adresiniz veya localhost>” -e ADMIN_PASSWORD="demo" -v /var/lib/mysql -p 0.0.0.0:8000:8000 -p 0.0.0.0:8080:8080 \ grrdocker/grr:v3.3.0.4
Bu komutla sunucumuzu ayağa kaldırdıktan sonra önerilen kurulum yönteminde yaptığımız gibi tarayıcıdan web arayüzüne girip kontrol sağlanabilir. İstemci kurulumu sadece çalıştırılabilir dosya ile olduğu için Docker ile istemci kurulumu yapılamamaktadır.

Kullanım


Sunucumuzu ve istemcimizi hazır hale getirdikten sonra artık kullanmaya başlayabiliriz. GRR’ın web arayüzü ve kullanımı oldukça basittir. İlk başta bir makineyi incelediğimizde ortaya çıkan menüleri açıklayalım.


  • Host Information: Bu menüye bastığımızda bağlı olduğumuz istemciye ait bilgileri getirmektedir. “Overview” kısmı daha önemli bilgileri getirirken “Full Details” kısmında sisteme ait ayrıntılı bir analizi buluyoruz.
  • Browse Virtual Filesystem: Adından da anlaşılacağı üzere bu menünün altında virtual filesystem’de geziniyoruz. Dosyalara ait özellikleri görüp, dosyaları indirebiliyoruz. İlk açılışta biraz bekledikten sonra bütün klasörleri görebiliyoruz.

  • Start new flows: Burası GRR’ın en önemli bölümlerinde biri. Bu menünün altında makine üzerinde işlemler yapıyoruz. Bu işlemlerden bazıları; tarayıcı geçmişi alma, sistem analizi verme, dosya indirme, osquery yollama, process dump alma, yara kurallarına göre process’leri tarama vb. gibi forensic analizleri için hayati öneme sahip işlemlerdir.

  • Manage launched flows: Bu menü altında daha önceden başlatılan işlemlerin kontrolü ve takibi yapılmaktadır.

  • Advanced: Bu menü kendi içerisinde 3 menüden oluşmaktadır.
    • Crashes: Hatalardan dolayı meydana gelen kapanmaları göstermektedir.
    • Debug Client Requests: İstemciye kurduğumuz çalıştırılabilir dosyaların debug modunda çalışması durumunda sunucuya gelen istekleri göstermektedir.
    • Client Load Stats: İstemcinin CPU, IO, network ve bellek kullanımlarını göstermektedir.
  • Cron Jobs: Bu menü altında istemcide belirli periyodlarla çalışmasını istediğimiz işlemleri oluşturup, yönetimini sağlıyoruz.
  • Hunts: GRR’ın en güçlü olduğu yanlardan bir taneside Hunt seçeneği. Yukarıda açıkladığım flow menüsünde sadece 1 makine için işlem oluşturup yollayabiliyorduk. Hunt menüsünde oluşturduğumuz flow’un istediğimiz kadar makine için çalışmasını sağlıyoruz.
  • Statistics: Adından da anlaşılacağı üzere sisteme ait istatistikleri gösterir. Bu istatistikleri aktiviteler, işletim sistemi bilgileri, cron joblar, hunt’lar ve buna benzer detaylar oluşturmaktadır.
  • Binaries: Bu menünün altında istemcide çalıştırmak üzere oluşturulmuş dosyaları görüyoruz. Linux, MacOS, Windows işletim sistemler için 64-bit ve 32-bit ayrı ayrı olmak üzere dosyalar bulunmaktadır.
  • Settings: Ayarları göstermektedir. Burada görülen ayarlar sadece okumak için olup bu menü altından değiştirilememektedir. Eğer mavi ile işaretli bölümler varsa o ayarların varsayılan ayarlardan farklı olduğu anlamına geliyor.
  • Artifacts: İstemciden toplanan dosyalar bu menünün altında bulunmaktadır.


Örnekler

İlk örneğimiz Linux istemci üzerinde çalışan işlemleri (process) listelemek olacak. Bunun için “Start new flows” menüsünün altından Process -> ListProcesses yolunu izliyoruz. Aşağıdaki bölmede flow’a ait açıklamaları görüyoruz. Ne olduğu, nasıl çağırıldığı, hangi argümanları aldığı ve bu argümanların açıklamalarını görüyoruz. Ayarları bitirdikten sonra “Launch” butonuna basarak flow’u başlatıyoruz.


Bu sırada çalışan flow’u kontrol etmek veya sonlandırmak için “Manage launched flows” menüsüne gidiyoruz. Burada flow’un adı, ne zaman başladığı, kimin oluşturduğu gibi bilgiler yer alıyor. Eğer flow’u oluştururken bildirimleri aç özelliğini aktif ettiyseniz, flow bittikten sonra arama çubuğunun yanındaki bildirim yeri kırmızı olacaktır.

Bastığımızda işlemin tamamlandığını gösteren bir mesajla karşılaşıyoruz. Bildirime gittiğimiz zaman flow’a ait bilgileri görüyoruz. “Results” kısmına geldiğimizde işlem sonucunda çıkan bütün sonuçları görebiliyoruz. Remnux makinesinde çalışan bütün işlemleri artık burada görebiliriz. “Download As” menüsünden sonuçları istediğiniz formatta indirebilirsiniz. Aşağıdaki görselde testi yaptığım sırada benim makinemde çalışan “firefox” process’inin detayları bulunmaktadır.



İkinci örneğimizi Windows istemci üzerinde dosya toplama üzerine yapacağız. “Collectors” menüsünün altındaki Collectors-> ClientArtifactCollector yolunu izleyerek dosya toplamaya başlayalım. Bu örnekte Google Chrome tarayıcısının geçmiş loglarını almak için flow oluşturacağız. Ayarları girip “Launch” butonuna tıklayarak flow’u başlatıyoruz.


Flow’un çalışması bitip bildirimimiz gelince sonuçlara bakmak için “Results” kısmına giriyoruz. Bu istemciyi sıfırdan kurup chrome üzerinden sadece grr-deniyoruz’i aratmıştım. Aşağıdaki görselde hem flow’un sonucu hemde benim aramamın sonucunu yani benim tarayıcı geçmişimi görüyoruz.

Flow’ları bitirdikten sonra şimdide GRR’ın çok güzel başka bir özelliği olan Hunt’ları kullanmaya başlayalım. Hunt, birden çok sistemde aynı anda flow çalıştırmaya yarayan özelliktir. Bu olay müdahale ekiplerinin işine çok fazla yarayan bir özellik olmakla beraber fiziksel erişimimiz olmayan sistemlerden bilgi almak için kullanılabilir.
Hunt oluşturmak için menüye giriyoruz. “New Hunt” butonuna basarak istediğimiz işlemi seçiyoruz. Bu örnekte sistemdeki bütün sistemlerde o anda çalışan process’leri almak için gerekli hunt’ı oluşturalım. Process -> ListProcesses işlemini seçerek devam edelim. Devam ettiğimizde bazı seçenekler var. Bu seçenekleri açıklayalım:

  • Description: Hunt’a vereceğimiz açıklama.
  • Client Limit: Maksimum istemci sayısı.
  • Crash Limit: Maksimum hata sayısı. Bu sayıya ulaşıldıktan sonra hunt otomatik olarak durur.
  • Expirty time: Geçerlilik süresi. Bu süreyi aştıktan sonra hunt silinir.
  • Client rate: Dakikada iletişime geçilecek maksimum istemci sayısı.


Next’e basıp bir sonraki adıma geçtiğimizde kullanmak istediğimiz eklentinin olup olmadığını soruyor. İstediğiniz eklentileri burada kullanabilirsiniz. Mesela her hunt’ın sonunda mail yoluyla haber verilmesi bir eklenti olarak sunulmaktadır.
İlerlediğimiz zaman kurallar geliyor. GRR’ın asıl amaçlarından bir tanesi birden fazla makineyle aynı anda ilgilenmek olduğu için bu kurallar çok işimize yarıyor. Burada hangi makinelerde hunt’ı çalıştırmak istiyorsak ona göre kurallar yazıyoruz. İşletim sistemine, verdiğimiz etiketlere, yazacağımız regexlere veya sayısal koşullara göre buraya kural ekleyebiliyoruz. Hiç kural eklemezsek bütün cihazları eklemiş oluyor. Ben makineleri “inux”ve “w7” olarak etiketlemiştim. Bunları kural olarakta giriyorum.



En son adımda ise “Review” kısmını görüyoruz. Bu bölümde bütün ayarları kontrol edip “Create Hunt” butonuna basarak hunt’ı oluşturuyoruz.


Hunt oluştuktan sonra bitmesini bekliyoruz. Hunt’ın bitmesi flow’lara göre daha uzun sürebilir. GRR’ın varsayılan ayarları gereği bu süre daha uzundur. Hunt’ın hangi makinelerde bittiğini görmek için “Clients” menüsüne bakıyoruz.

“Results” kısmından aynı flow’daki gibi çıktıları görüp, istediğimiz formatta indirebiliyoruz. Graph kısmında ise istemcilere göre saatlik aktivileri görüyoruz.

GRR’ın bir başka güzel özelliği ise Cron Job olarak belirli periyodlar ile çalıştırabildiğimiz işlemler ekleyebilmemiz. Bunun için “Cron Jobs” menüsüne giriyoruz. Ekleme butonuna bastıktan sonra bizi aşağıdaki gibi bir ekran karşılıyor. Cron Job’da kullanılan bütün ayarlar Hunt’takiyle aynı tek fark “Periodicity” özelliği. Bu özellik hangi periyodlarla bu işlemin çalışacağını gösteriyor. Burada kullanılan kısaltmalar şu şekildedir:
  • s: saniye
  • d: gün
  • w: hafta
Cron Job’ı oluşturduktan sonra “Enable Cron Job” tuşuna basarak aktifleştiriyoruz. İşlem her çalıştığında kaydı Runs sekmesine düşecektir.

 GRR API

GRR, güvenlik ekiplerinin işini kolaylaştırmak için API sağlamaktadır. GRR API’ı kurmak için pip’e başvuruyoruz.
pip install grr-api-client
Kurulum gerçekleştikten sonra istediğimiz gibi kullanabiliriz. GRR’a bağlanmak için aşağıdaki kod parçasını kullanabiliriz.
from grr_api_client import api
grrapi = api.InitHttp(api_endpoint="http://localhost:8000", auth=("<kullanıcı adı>”, "<parola>"))
İstemci aramak için kullanılan fonksiyon aşağıdaki gibidir. Fonksiyonun içerisinde boş string olursa bütün istemcileri, herhangi bir değer girilirse sadece o istemciyi bulur.
search_result = grrapi.SearchClients("")
Flow’lara argüman vermek için:
flow_args = grrapi.types.CreateFlowArgs("<Flow adı>").
flow_args.ClearField("paths")
flow_args.paths.append("/var/log/*")
flow_args.action.action_type = flow_args.action.DOWNLOAD
Hunter oluşturmak için:
hunt_runner_args = grrapi.types.CreateHuntRunnerArgs()
rule = hunt_runner_args.client_rule_set.rules.add()
rule.rule_type = rule.LABEL rule.label.label_names.append("suspicious")
hunt=grrapi.CreateHunt(flow_name="FileFinder",flow_args=flow_args,hunt_runner_args=hunt_runner_args)
hunt = hunt.Start()
Bunların dışında çok daha fazla fonksiyon var. API ile ilgili dokümantasyonları aşağıda bulabilirsiniz.


Burak ÇARIKÇI
CT-Zer0

Yorumlar

Bu blogdaki popüler yayınlar

1. Geleneksel Stajyer CTF Soru ve Cevapları

B*-Tree (BTree, BPlusTree) Veri Yapısı ile Veri İndeksleme

2. Geleneksel Stajyer CTF Soru ve Cevapları - 2017