2021-04-27

İnternetten indirilen bir dosyanın engelini kaldırma

Alternate data streams (ADS) konusunu daha önce yazmıştım. İnternetten indirilen bir dosya üzerinde bir "Zone.Identifier" ADS akışı olur. Windows'da çoğu tarayıcı (Firefox, Chrome, Edge, Internet Explorer) internetten indirilen dosyalar için bu ADS akışını oluşturur.


Yukarıdaki diyaloğun altındaki "Engellemeyi Kaldır" kutusu işaretlenmeden zip dosyası açılırsa açılan her dosya için Zone.Identifier akışı oluşur. Bu Windows ayıklama arayüzü kullanıldığında geçerlidir. Diğer dosya sıkıştırma uygulamaları için durum farklı olabilir. Örneğin 7zip, çıkartılan (veya ayıklanan, her neyse) dosyalar için Zone.Identifier akışını korumaz. Ayrıca bu akışa sahip bir dosya çalıştırılırken de kaynağına güvenip güvenmediğimize dair emin misiniz sorusu görüntülenir.

Neyse, çevirideki anlam karmaşasından sıyrılıp konuya dönelim. Zip dosyasına sağ tıklayıp engellemeyi kaldırabiliriz. Ama amacımız bunu komut satırından, powershell ile yapmak.

Önce akışı görelim:

PS> Get-Item -Path Sysinternals* -Stream *

Bu şekilde bulunduğumuz klasörde sysinternals ile başlayan tüm dosyaların ADS verilerini görüntülemiş oluruz. Belli bir dosyanın belli bir akışına (ADS'sine) ulaşmak için daha net olarak

PS> Get-Item SysinternalsSuite.zip -Stream Zone.Identifier

PSPath        : Microsoft.PowerShell.Core\FileSystem::D:\Download\SysinternalsSuite.zip:Zone.Identifier
PSParentPath  : Microsoft.PowerShell.Core\FileSystem::D:\Download
PSChildName   : SysinternalsSuite.zip:Zone.Identifier
PSDrive       : D
PSProvider    : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
FileName      : D:\Download\SysinternalsSuite.zip
Stream        : Zone.Identifier
Length        : 97

kullanabiliriz. Zone.Identifier akışını bulduk. Bir de içeriğini görüntüleyelim.

PS> Get-Content SysinternalsSuite.zip:Zone.Identifier

[ZoneTransfer]
ZoneId=3
ReferrerUrl=https://docs.microsoft.com/tr-tr/sysinternals/downloads/sysinternals-suite
HostUrl=https://download.sysinternals.com/files/SysinternalsSuite.zip

Bunu silmek için de

PS> Remove-Item SysinternalsSuite.zip:Zone.Identifier

kullanabiliriz. Hatta bu işi yapan bir cmdlet de var (2023-02-02):

PS> Unblock-File SysinternalsSuite.zip

ADS akışından kurtulduktan sonra powershell ile dosyaları çıkartmak (ayıklamak, genişletmek) için de şöyle bir yol olabilir:

PS> Expand-Archive .\SysinternalsSuite.zip -DestinationPath D:\Tools\ -Force

Burada -Force parametresi o klasörde var olan eski sürümlerin üzerine yazmayı etkinleştirmek için.

Not: Powershell Invoke-WebRequest cmdlet'ini kullanarak indirince ADS oluşturulmaz. Bu şekilde indirmek için mesela

PS> Invoke-WebRequest -Uri "https://download.sysinternals.com/files/SysinternalsSuite.zip" -OutFile "SysinternalsSuite.zip"

yazabiliriz.

2021-04-14

AWS üzerinde WireGuard VPN sunucu kurulumu

Amazon Web Services üzerinde düşük özelliklere sahip bir sunucu ücretsiz olarak kurulabiliyor. Bir hesap açarak aws.amazon.com adresine girerek bu işlemi yapabiliriz. Bunu yaptıktan sonra bugün için 1 GB RAM'e sahip, 1 CPU ve 8 GB depolamaya sahip bir linux sunucumuz olacak.

Yukarıdaki tabloda da görüldüğü gibi aylık 15 GB kotaya sahip olacağız. Ücretsiz kullanımda bizi sınırlayan tek ölçüt bu olacak.

Free Instance'ımızı oluşturduktan sonra bir linux sunucuyu uzaktan yönetmek için bize tahsis edilmiş bir de özel anahtar dosyamız olacak. *.pem uzantılı bu dosyayı işin sonunda download etmeyi unutmamak gerek. Ayrıca security bölümünden inbound rules'a bir SSH bağlantısı (22/TCP) izni oluşturmamız gerek.

Sunucumuza uzak bağlantıyı aşağıdaki gibi yapabiliriz.

> ssh ubuntu@sunucu_ip_adresi_veya_ismi -i ozel_anahtarimiz.pem

Özel anahtarımız aracılığıyla şifresiz ssh bağlantısı yapabiliriz. Oluşabilecek hatalar pem dosyasının yetkilerinin gereğinden fazla olmasından kaynaklanabilir. Bunun için yetkileri kısmak gerek. Sadece kendi kullanıcımıza yetki verelim.

Şu an için benim elimde Ubuntu 20.04.3 LTS bir sunucu var. İlk yapmak gereken paketleri bir güncellemek

> sudo apt update && sudo apt upgrade

Bir sonraki adım otomatik süreçte oluşturulan ubuntu kullanıcısından kurtulup kendi belirlediğimiz bir kullanıcı ve kendi yarattığımız bir özel anahtarla oturum açmak için. Çok gerekli mi? Değil. Ama ben yapmayı tercih ediyorum. Yeni bir grup ve kullanıcı oluşturalım.

> sudo groupadd metin

> sudo adduser metin

Yeni oluşturduğumuz kullanıcıya ayrıcalıklı yetkiler vermek için bazı grupların üyesi yapalım.

> sudo usermod -aG admin,adm,sudo,ssh metin

Bir de varsayılan grup olayımız var

> sudo usermod -g metin metin

Bu kullanıcı için bir RSA anahtar çifti oluşturmamız gerek. Daha sonra SSH bağlantımızı bu kullanıcı üzerinden yapacağız. Bunu yapmanın birkaç yolu var. Yollardan biri ssh-keygen'i ubuntu kullanıcısıyla çalıştırıp yaratılan dosyaları yeni kullanıcımızın profiline aktarmak. ssh-keygen varsayılan olarak 3072 bitlik bir anahtar çifti oluşturacak ve bunları varsayılan olarak .ssh klasörünün altında id_rsa ve id_rsa.pub dosyalarına yazacak. Ubuntu kullanıcısından yaptığımız bu işlem sonucunda oluşan dosyaları metin kullanıcısının authorized_keys dosyasına aktaracağım.

> sudo cp .ssh/id_rsa.pub /home/metin/.ssh/authorized_keys

Sonrasında ssh bağlantısını kesip özel anahtarımızı yerel bilgisayara aktaralım.

> scp -i ozel_anahtarimiz.pem ubuntu@sunucu_ip_adresi_veya_ismi:/home/ubuntu/.ssh/id_rsa D:\ssh\ozel_anahtarim

Özel anahtarımız pem dosyasının yerine geçecek. Bu dosyanın da yetkilerinin sadece kendi kullanıcımızla kısıtlı olması gerek. OpenSSH bu konuda katı. Bu işlemden sonra yeni kullanıcımız ve yeni anahtarımızla bağlantı yapabiliyor olmamız gerek. Deneyelim:

> ssh -i D:\ssh\ozel_anahtarim metin@sunucu_ip_adresi_veya_ismi

Artık ubuntu kullanıcısı ve ev klasörünün altındaki (/home/ubuntu) dosyalara ihtiyacımız kalmadı. Silebiliriz.

Sonrasında benim yapmayı tercih ettiğim ilk şey bir güvenlik duvarı ve fail2ban kurmak.

> sudo apt install ufw fail2ban

Sunucumuza uzaktan ssh ile bağlandığımız için güvenik duvarını kurduktan sonra etkinleştirmeden önce ilk yapmamız gereken SSH bağlantılarına izin veren bir kural oluşturmak.

> sudo ufw allow ssh

> sudo ufw enable

Artık sadece 22 TCP bağlantısına izin verilen bir sunucumuz var. Ben bununla yetinmiyorum. Böyle bir sunucuyu internete bağlı bırakmak aracınızı kilitleyip herkesin kendi anahtarını deneyerek açmaya çalışacağı bir pazar alanına bırakmak gibi. Sürekli birileri gelip bağlanmayı deneyecek. Bunu nispeten engelleyebilmek için fail2ban çok güzel bir çözüm. Fail2ban'in yapılandırma dosyası /etc/fail2ban/jail.conf adresinde. Ama bu dosyayı doğrudan düzenlemek yerine aynı klasöre jail.local kopyası oluşturup onun üzerinden düzenlemek önerilmiş. jail.local kopyası boş olabilir, ya da şu adreste gösterildiği gibi jail.conf dosyasının satırlarının başına # karakteri getirilerek etkisizleştirilmiş bir kopyası olabilir:

> awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local

Sonuçta bu dosyayı açıp içinde bazı düzenlemeler yapmamız gerek. Bu dosyaya sadece ben, belirsiz birkaç yerden bağlanacağım. Şifreyi en fazla 2 kere yanlış girme ihtimalim üzerinden yapılandıracağım. Aynı IP adresinden 10 dakika içinde 2'den fazla yanlış şifre denemesi olursa bu IP aderesinin engellenmesini istiyorum. Engelleme de süresiz olacak. Ama güvenli bir IP adresi vereceğim; bu adresten gelen bağlantılar engellenmeyecek. Bunu yapabilmek için şu satırları ekliyorum.

[DEFAULT]
ignoreip = 222.222.222.222
bantime = -1
findtime = 600
maxretry = 3

SSH protokolü varsayılan olarak jail.conf dosyasında izleniyor. Bazı kaynaklarda ssh için aşağıdaki gibi satırların eklenmesi önerilmiş ama ben eklemedim. Buna rağmen SSH protokolü izlemede.

[ssh]
enabled     = true
port        = ssh
filter      = sshd
logpath     = /var/log/auth.log

Fail2ban'in durumunu sorgulamak için

> sudo fail2ban-client status

ya da özellikle sshd durumunu öğrenmek için

> sudo fail2ban-client status sshd

yazıp engellenmiş IP adresi var mı, öğrenebiliriz. Engellenen bir IP adresini karalisteden çıkarmak için ise

> sudo fail2ban-client set sshd unbanip xxx.xxx.xxx.xxx

ya da bir IP adresini engellemek için

> sudo fail2ban-client set sshd banip 1xx.1x.2x.2x

Artık VPN kurulumuna başlayabiliriz. VPN kurulumu işin en kolay kısmı. Wolfgang sağolsun, şu videosunda konuyu oldukça basite indirgemiş.

> wget https://git.io/wireguard -O wireguard-install.sh && sudo bash wireguard-install.sh

Cep telefonlarından bağlanabilmek için Wireguard'ı kurup QR kodu okutmak yeterli. Bilgisayardan yapıyorsanız bu işlem sonucunda oluşan /root klasörünün altındaki *.conf dosyasını bilgisayarınıza aktarmanız yeterli. Linux'ta /etc/wireguard/wg0.conf dosyasına, Windows'da ize grafik arayüzden Wireguard uygulamasının için bu verileri aktararak bağlantı oluşturabilirsiniz. Sınırsız kullanıcı oluşturmak mümkün. Her cihaz/kullanıcı için 

> sudo bash wireguard-install.sh

komutunu tekrar çalıştırmak gerek. Sınır olmadığı için bunu yapmaktan kaçınmamak, bir cihazın/kullanıcının verilerini başka bir cihaz/kullanıcı ile paylaşmamak önerildiği için bu kurala uyuyoruz. Linux'ta VPN'i devreye almak için

> sudo wg-quick up wg0

komutunu çalıştırmak gerekli. Wireguard varsayılan olarak UDP 51820 portunu kullanıyor ama değişitirilebilir. Bu port için de güvenlik duvarının üzerinde izin vermek gerek. Hem Ubuntu'nun güvenlik duvarı, hem de Amazon'un Security Rules içinde. Ubuntu için bu

> sudo ufw allow 51820/UDP

ile mümkün.

Wireguard UDP kullandığı için ve UDP de TCP gibi oturumlu olmadığı için çalışıyor mu diye kontrol etmek biraz daha zor. Kontrol etmek için bir yöntem VPN'i devreye aldıktan sonra sunucuya dahili IP adresi üzerinden ping atmak olabilir. Wireguard kendi içinde başka bir IP aralığı kullanıyor. Örneğin 

> ping 10.7.0.1

ile istemcimiz sunucuya ping atabiliyor mu, ya da sunucu üzerinden

> ping 10.7.0.2

gibi bir şekilde sunucu istemciye ping atabiliyor mu, bakabiliriz. Artan cihaz sayısı ile son oktet değişecektir. Ya da sunucu tarafında 51820 portu üzerinden gerçekleşen trafiğe bakabiliriz.

> sudo tcpdump -i eth0 port 51820

Kriptolanmış paketlerin içini görmeye kalkışmadan bu trafiğin varlığının sistemin çalıştığını gösterdiğine kanaat getirmek genel olarak tercih edilen bir yöntem.

2023-08-13 Ek: Wireguard için kernel debug logu aktifleştirmek için

# echo "module wireguard +p" | sudo tee /sys/kernel/debug/dynamic_debug/control

yapılabilir. Bundan sonra da kernel loglarına

# dmesg -wT

ile bakılabilir. İhtiyacımız kalmadığında wireguard kernel loglarını devre dışı bırakmak için

# echo "module wireguard -p" | sudo tee /sys/kernel/debug/dynamic_debug/control

 Bu güzel bilgi de şu adresten alındı.

2021-03-16

Get-WinEvent ve Logon Type

Uzak masaüstü bağlantılarını eventlog'dan süzmek için garip filtereler kullandım durdum. Ta ki şunu bulana kadar:

PS> Get-WinEvent -FilterHashTable @{LogName="Security";Id=4624} | Where-Object {$_.properties[8].value -eq 10}

Buradaki properties olarak geçen 27 öğelik EventProperty nesnesi, her olay için ayrıntılar sekmesinde çıkan parametrize edilmiş olay özellikleri. Bunu aslında log parser zamanlarından biliyordum, ama nedense bu alanların powershell'den de erişebileceğini hiç düşünmemiştim.

Her durumda Logon Type=10 kaydı düşülmüyor. Sunucunun ekranı kilitlenmişse sadece Logon Type=7 (muhtemelen bir Logon Type=3 sonrasında) kaydı olabiliyor.

2023-04-11 ek: Uygulama ve Hizmet Günlükleri (Application and Service Logs) altında Microsoft>Windows>TerminalServices-RemoteConnectionManager/Operational günlüğü daha net bilgiler sunuyor. Bunun için logon audit policy'si etkinleştirilmiş olmalı.

PS> Get-WinEvent -FilterHashTable @{LogName="Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational";Id=1149} | Select-Object TimeCreated, @{N="User";E={$_.properties[0].Value}},@{N="Domain";E={$_.properties[1].Value}},@{N="IP";E={$_.properties[2].Value}}

2023-11-20 ek: Ayrıca "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" altında hem uzakmasaüstü oturum açma hem de kapama olayları sırasıyla 21 ve 23 olayları ile kaydedilir.

PS> Get-WinEvent -FilterHashtable @{Logname="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational";Id=21,23} -Max 4 | select TimeCreated, Id, @{N="UserName";E={$_.Properties[0].Value}},@{N="SessionID";E={$_.Properties[1].Value}},@{N="IPAddress";E={$_.Properties[2].Value}} | ft *

2021-03-15

Sysmon

Sysinternals araçlarının fanatiğiyim. Hepsi güzel, ama özellikle Process Monitor, Process Explorer, Autoruns gibi araçların hayranıyım. Bir süredir Sysmon'un varlığından ve işlevlerinden haberdardım ama çok yakınlaşma fırsatım olmamıştı. Aslında yakınlaşınca anladım ki Sysmon hakkında hiçbir şey bilmiyormuşum. Channel9'daki Defrag Tools programındaki konuşmalar falan konuya sadece giriş seviyesinde değinmiş.

İşin özünde Sysmon da Process Monitor benzeri bir araç. Ama bir grafik arayüzü yok. Grafik arayüz olmayınca da onun yerine geçecek filtreleme işlerini başka bir şekilde yapmamız gerekiyor. Bu şekil de burada XML oluyor.

Şu anda web sayfalarında 13.01 sürümü var. Yani ilk çıktığından bu yana çok yol almış. Yolun çoğu XML yapısı ile ilgili alınmış. Sanıyorum ilk çıktığında bugüne kıyasla çok ilkel bir XML yapısı varmış. Zamanla çok değişmiş. Şu anda XML schemaversion 4.5. Bu neleri değiştirmiş, varsayılan olarak VEYA olan filtre 4.22 ile VE olmuş, yeni XML elemanları eklenmiş vs.

Çalıştırıp yakalamaya başlaması için

sysmon -i

komutunu vermek gerekiyor. Bu şekilde varsayılan ayarlarla çalışmaya başlıyor. Yakaladığı olayları Event Viewer'da Application and Service Logs altında Microsoft-Windows-Sysmon/Operational'a yazıyor. -i anahtarı ile çalıştırıldığı anda kendini %SystemRoot% klasörünün altına kopyalayıp bir servis olarak çalışmaya başlıyor. Bu şekilde bilgisayarı tekrar başlattığımızda da çalışmaya devam ediyor. Faaliyetlerini durdurmak için kaldırmak gerekiyor ki bu da

sysmon -u

ile oluyor. Bir kez kurulduktan sonra varsayılan ayarlarla olayları yakalamaya başlıyor demiştik. Yapılandırmayı değiştirmek için bir XML dosyası oluşturarak -c anahtarı ile bu dosyanın yerini göstermek gerekiyor.

sysmon -c ornek.xml

Doğrudan bir bir yapılandırma dosyası ile işe başlamak istiyorsak ve ilk defa çalıştırıyorsak (accepteula) ve hatta 64-bitlik dosya ile çalışmak istiyorsak

sysmon64 -accepteula -i ornek.xml

Buraya kadarki konular zaten her yerde yazılan kısım. Bir örnek üzerinden gidelim. Bir sunucumuz var; bu sunucunun üzerinde IIS çalışıyor. C:\inetpub\wwroot\aspnet_client klasörü altında oluşturulan .aspx dosyalarının hangi süreç tarafından oluşturulduğunu bilmek ve bundan haberdar olmak istiyoruz. Aynı zamanda %ProgramData% ve %SystemRoot%\Temp klasörlerinin altında oluşturulabilecek *.7z, *.zip ve *.rar dosyalarına ait olayları takip etmek istioruz. Aslında bunun mantığını kurala dökmek kolay. Bir pseudo code ile:

(Path = C:\inetpub\wwwroot\aspnet_client VE Extension=*.aspx) VEYA ((PATH=%PROGRAMDATA% VEYA PATH=%SystemRoot%\temp) VE (Extension=.7z VEYA Extension=.zip VEYA Extension=.rar))

demek kolay. Ama bunu XML'e dökmek nispeten zor. Tüm süreci nasıl anlatırım bilemiyorum, ama nihayetinde şunları söyleyebilirim. Birden fazla mantık grupları için RuleGroup'lar oluşturmak gerek. Aynı olaya ait ikisi de include veya ikisi de exlude olan RuleGroup'lar geçerli değil. Ayrıca schemaversion 4.22'den sonra EventFiltering elemanı içindeki öğelerin varsayılan mantık operatörü VE. Bunu değiştirmek için groupRelation attribute'larını kullanıyoruz. İkisi de include olan RuleGroup'lardan kaçınmak için birini exclude yapmam gerekti. Bunu da path'ten yana kullandım. Hariç tutulabilecek path'leri toplayıp bir exlude RuleGroup'u oluşturdum. Sonuçta elimde şöyle bir XML dosyası oldu:

<Sysmon schemaversion="4.5">
  <HashAlgorithms>sha256</HashAlgorithms>
  <CheckRevocation/> <!-- Check loaded drivers, log if their code-signing certificate has been revoked, in case malware stole one to sign a kernel driver -->

  <EventFiltering>

    <RuleGroup name="Extension" groupRelation="or">
      <FileCreate onmatch="include">
        <TargetFilename condition="end with">.7z</TargetFilename>
        <TargetFilename condition="end with">.zip</TargetFilename>
        <TargetFilename condition="end with">.rar</TargetFilename>
        <TargetFilename condition="end with">.aspx</TargetFilename>
        <TargetFilename condition="end with">.asp</TargetFilename>
      </FileCreate>
    </RuleGroup>

    <RuleGroup name="Path" groupRelation="or">
      <FileCreate onmatch="exclude">
        <TargetFilename condition="begin with">C:\PerfLogs</TargetFilename>
        <TargetFilename condition="begin with">C:\Program Files (x86)</TargetFilename>
        <TargetFilename condition="begin with">C:\Program Files</TargetFilename>
        <TargetFilename condition="begin with">C:\Scripts</TargetFilename>
        <TargetFilename condition="begin with">C:\inetpub\temp</TargetFilename>
        <TargetFilename condition="begin with">C:\inetpub\logs</TargetFilename>
        <TargetFilename condition="begin with">C:\inetpub\history</TargetFilename>
        <TargetFilename condition="begin with">C:\inetpub\custerr</TargetFilename>
      </FileCreate>
    </RuleGroup>

    <RuleGroup name="ProcStart" groupRelation="or">
      <ProcessCreate onmatch="include">
        <Image condition="end with">cmd.exe</Image>
        <Image condition="end with">powershell.exe</Image>
        <Image condition="end with">iexplore.exe</Image>
      </ProcessCreate>
    </RuleGroup>

    <RuleGroup name="ProcStartExclude" groupRelation="or">
      <ProcessCreate onmatch="exclude">
        <CommandLine condition="contains">...</CommandLine>
      </ProcessCreate>
    </RuleGroup>

    <RuleGroup name="ProcEnd" groupRelation="or">
      <ProcessTerminate onmatch="include"/>
    </RuleGroup>

    <RuleGroup name="NetConnct" groupRelation="or">
      <NetworkConnect onmatch="include">
        <DestinationHostname condition="end with">github.com</DestinationHostname>
        <DestinationHostname condition="end with">githubusercontent.com</DestinationHostname>
      </NetworkConnect>
    </RuleGroup>

  </EventFiltering>

</Sysmon>

Arada başka öğeler de var. Örneğin cmd.exe, powershell.exe ve iexplore.exe süreçlerinin başlaması da takip ediliyor. Süreç başlaması işlemlerinin takibinde bazı hariç tutmalar için "..." ile olası bir durumu da ekledim. Ayrıca github.com ve githubusercontent.com'a girişleri de takip ettim. Bunun dışındaki süreç başlamalarını ve sonlanmalarını hariç tuttum.Şablon olarak şu kaynaktaki xml dosyası üzerinden gittim.

Yardım ve dökümanlarda gözükmeyen, webde de çok rastlanmayan bir komut satırı parametresi de -t ki bu hata ayıklamayı kolaylaştırıyor. Örneğin kalıcı olarak devreye alma öncesinde bir xml dosyasını denemek istiyorsak bunu aşağıdaki gibi deneme modunda başlatabilir, sonra da konsoldan gelen mesajlarla gidişatı izleyebiliriz:

sysmon -t -i testkonfig.xml

Sysmon'u kullanmaktan vazgeçtiğimizde kaldırmak için

sysmon -u

veya mevcut yapılanmasını varsayılana çevirmek için (sadece sysmon -i kullanılarak gelinen konum)

sysmon -c -- 

Yapılandırma şemasını ekrana basmak için

sysmon -s 

2023-12-27 Ek: Şu sayfada bir de sysmon hizmetinin yetkilerinin kısıtlanarak kullanıcılar tarafından durdurulamaması için yetkilerin yapılması anlatılmış:

Gizle:
sc sdset Sysmon D:(D;;DCLCWPDTSD;;;IU)(D;;DCLCWPDTSD;;;SU)(D;;DCLCWPDTSD;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
 

Eski haline döndür:
sc sdset Sysmon D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

Güzel.

---

[1] https://posts.specterops.io/putting-sysmon-v9-0-and-or-grouping-logic-to-the-test-c3ec27263df8

[2] https://www.hexacorn.com/blog/2018/06/29/sysmon-doing-lines-part-3/ 

[3] https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon 

[4] https://techcommunity.microsoft.com/t5/sysinternals-blog/sysmon-the-rules-about-rules/ba-p/733649 


2021-02-27

Youtube'u nasıl engellerim

Gördüğüm kadarıyla herkesin hedefi bu. Evde çocuk var, tableti var, ve eline tablet geçen çocuk Youtube'u bırakmıyor. Ebeveynler de nasıl engellerim diye düşünüyorlar.

Kolay bir yol buldum. Bir Raspberry PI ve PI-Hole ile istenen cihaz üzerinde istenen engelleme (sadece Youtube değil, başka adresler de engellenebilir) yapılabiliyor. Raspberry PI nasıl edinilir, üzerine bir işletim sistemi nasıl kurulur ve PI-Hole nasıl çalışır hale getirilir, bu adımları atlıyorum.

PI-Hole kurulduktan (modem üzerinde DNS yönlendirmeleri, DHCP işleri vs bittikten) sonra pi-hole'a http://pi.hole gibi bir adresten ulaşabiliyor olmalısınız. Ulaşamıyorsanız cihazlarınızın gizli DNS (private DNS) kullanmadığından emin olun. http://pi.hole adresi üzerinden pi-hole'a ulaştıktan (ve kurulum sırasında verilen şifre ile oturum açtıktan) sonra sol üstte yer alan üç çizgili butondan menüyü genişletin (masaüstü bir bilgisayardan giriyorsanız menü solda açık gelir).

Menüde "Group Management" altından Groups'u seçin. Buraya YoutubeYok gibi bir isimle yeni bir grup yaratın. Varsayılan "Default" grubunuzla birlikte 2 grubunuz olacak. Daha sonra yine menüden "Group Management"in altındaki Clients'i seçin. Buraya kısıtlamanın uygulanacağı cihazın MAC adresin girerek sağındaki grup adını bir önceki adımda yarattığımız YoutubeYok (veya ne verdiyseniz ona) ayarlayın. Bu şekilde sadece kısıtlamaların uygulanacağı cihazı bir grubun üyesi yaptık. Başka cihazların da bu kısıtlamaya maruz kalmasını istiyorsanız onları da eklemelisiniz.

Nihayet son aşamada menüden "Group Management" altından Domains'i seçin. Bu sayfaya yasaklanmasını istediğiniz youtube adreslerini yazın. Sadece youtube.com yetmeyebilir, wildcard kullanarak googlevideo.com, googleapis.com ve google.com gibi adresleri de eklemeniz gerekebilir.

Bu adımdan sonra yasaklamalar devreye girmiş olacak. Kaydettikten hemen sonra devam eden bir akış varsa Youtube hemen kesilmeyecektir. Sistem DNS sorgularını "yanlış cevaplandırma" mantığına dayandığı için malum cihaz(lar)ın üzerinde zaten çözülmüş sorguların süresi geçene kadar (tahminen birkaç dakika) herşey normal çalışmaya devam edecektir.

Bu elbette bu işi yapmanın tek yolu değil, ama Raspberry PI uygun fiyatlı bir cihaz. pi-hole da tek seçenek olmayabilir, pfSense gibi çözümler de uygulanabilir, ama bu çok daha kolay bir yöntem gibi geldi bana.

2021-02-25

Powershell ile sayma

Varsayalım ki şöyle bir hedefimiz var; bugün uygulama olay günlüğü (Application Event Log) içinde kaydı düşülen olayların ID'lerine göre hangisinin kaç kez olduğunu bulmak istiyoruz.

Get-WinEvent -FilterHashTable @{LogName="Application";StartTime="2021-02-25 00:00"} |
Group-Object -Property ID -NoElement |
Sort-Object -Property Count -Descending

Bunu bir de Log Parser ile yapmak istedim:

SELECT EventID,
COUNT(EventID) As IdCount
FROM Application
WHERE (TimeGenerated>TO_TIMESTAMP('2021-02-25 00:00:00','yyyy-MM-dd HH:mm:ss'))
GROUP BY EventID
ORDER BY IdCount DESC

Aralarındaki benzerik hoşuma gitti.

2021-02-23

IP adresinden coğrafi konum öğrenme

Sysmon Tools'un sayfasını incelerken basit bir IP adresini coğrafi konuma çeviren servisi öğrendim, hoşuma gitti. Ücretsiz sürüm ayda 10.000 sorguya kadar izin veriyor. Bu sebeple Powershell ile kullanma yoluna gittim.

Herşeyden önce ipstack.com üzerinde ücretsiz bir hesap açıp API access key'ine sahip olmak gerekiyor.

Varsayalım ki elimde $IPAdresi adında bir değişen var ve içeriğinde coğrafi konumunu sorgulamak istediğim bir IP adresi var.

Sorguları göndermek için $IPAdresi değişkenini kullanarak şöyle bir URI oluşturuyoruz.

$uri  = "http://api.ipstack.com/" + $IPAdresi + "?access_key=xxxx-xxx-xxx-xxx"

Daha sonra bu adrese bir Invoke-WebRequest ile istek gönderdim ve sonucu $wr değişkenine kaydettim.

$wr = Invoke-WebRequest -uri $uri -UseBasicParsing

IPStack.com'un cevabı bir JSON nesnesi. Bunu dönüştürebilmek için de şu satırı kullandım:

$json = $wr.content | ConvertFrom-Json

Bu adımdan sonra $json nesnesinin şu alt alanları döndü ki çok işime yaradı.

continent_code: 2 harfli kıta kodu (AF: Afrika, AS: Asya, EU: Avrupa, NA: Kuzey Amerika, OC: Okyanusya, SA: Güney Amerika, AN: Antarktika)

continent_name: Yukarıdakinin tam hali, kıta adı

country_code: 2 harfli ülke kodu (tam liste için Wikipedia sayfasına bakın)

country_name: Yukarıdakinin tam hali, ülke adı

region_code: Bölge kodu. Amerika için eyalet kodları, Türkiye için plaka numaraları.

region_name: Bölge ismi. Amerika için eyalet ismi, Türkiye için şehir ismi.

city: Şehir. Türkye için yukarıdaki ile aynı.

Ayrıntılar için şu sayfaya bakılabilir.

Sonradan aklıma geldi, ama Invoke-WebRequest | ConvertFrom-Json kullanmak yerine tek seferde Invoke-RestMethod kullanılabilir. İkisi de Powershell 3.0 ile gelmiş.