5.09.2022

Powershell ile dosyaların sahibini değiştirme

Grafik arayüz bir yöntem; ama biz Powershell ile yapmak istiyoruz.

Hedefimiz $hedef değişkeninde olsun. Dosyamızın yeni sahibi de BILGISAYAR\kullanıcı hesabı olsun.

Önce bir acl değişkeni oluşturalım:

PS> $acl = Get-Acl -Path $hedef

Daha sonra da bir hesap nesnesi oluşturalım.

PS>  $hesap = New-Object-TypeName System.Security.Principal.NTAccount -ArgumentList "BILGISAYAR\kullanici"

Daha sonra $acl nesnesinin içinde yer alan Owner'ı değiştirelim.

PS> $acl.SetOwner($hesap)

Daha sonra da bunu Set-Acl ile dosya sistemine yansıtalım.

PS> Set-Acl -Path $hedef -AclObject $acl

Güzel.

---

[1] https://stackoverflow.com/questions/22988384/powershell-change-owner-of-files-and-folders

[2] https://learn-powershell.net/2014/06/24/changing-ownership-of-file-or-folder-using-powershell/

16.08.2022

Nirsoft araçları ve güvenlik

Uzun bir süredir Nirsoft.net sitesinde yayınlanan ücretsiz (ama kapalı kaynak kodlarına sahip) bazı araçların varlığından haberdarım ve zaman zaman kullanıyorum. Örneğin Sysinternals araçlarından biri olan TCP View'un benzeri olan ama gerek IP adresi gerek protokol bazında listeyi filtreleme özelliğine sahip CurrPorts, çok sayıda hedefi gerek ICMP gerekse TCP üzerinden pingleyebilen PingInfoView. Bunlarla da sınırlı değil, bir sürü güzel minik tatlı progam var sitede genel kullanıma açık.

Ama birçok antivirüs ve güvenlik sisteminde yıllardır bu programların bir kısmı "zararlı kod" olarak sınıflandırılıyor. Nirsoft sitesinde bu konuya özel bir sayfa var. Burada deniyor ki; bazı antivirüs yazılımları, araçlarımız ile ilgili "yanlış alarm" (false positive) verebilir, bu gerçeği yansıtan bir durum değil. Başka sitelerde Nirsoft araçları ile ilgili PUA (Potentially Unwanted Application - Muhtemel İstenmeyen Program) sınıflandırması yapılmış. Yani araçlardan birkaçı internet tarayıcılarında kaydedilmiş şifreleri görmeye izin verdiğinden, ya da ağ cihazlarının izlenmesine, ekran görüntülerinin alınmasına sebep olabileceği ve kullanıcıların istekleri dışında kullanım amacına sahip olmasından dolayı varsayılan olarak karantiya alınması gerektiğine dair bir sınıflandırma yapılmış ([1], [2], [3]).

Sadece bu sebeple güvenlik yazılımlarının yıllardır ısrarla bu "zararsız" programları bu kategoriye alması ilginç geldiği için biraz daha araştırdım ve şu Youtube videosuna ve orada bahsedilen şu yazıya denk geldim. Bu yazı da başka bir uzman ile vardıkları sonucu şöyle özetlemiş; Nirsoft araçlarının içinde doğrudan kötü olmayan ama kötüye kullanıma çok açık, hatta önüne geçilmezse işletim sisteminde istenmeyen bazı sonuçlara yol açabilecek kodlar var.

Bu iki arkadaş, Nirsoft geliştiricisi olarak sitede ismi geçen kişiye durumu bildirdiklerini, ama geliştiricinin bu konuyla ilgili bir çabasını göremediklerini, hatta kendilerine cevap bile vermediğinini ifade etmişler. Eğer konu burada kapansaydı Nirsoft geliştiricisinin kötü niyetli bir insan olduğu çok net olurdu sanırım. Ama yorumlarda geliştiriciye ulaşma yöntemleri eleştirilmiş. Daha "doğrudan" yöntemlerin neden kullanılmadığı sorulmuş.

Konu yine ortada kaldı. Ama ben bu aşamada Nirsoft araçlarına daha az güvenmem gerektiğ sonucunu çıkardım.

---

[1] https://superuser.com/questions/1508706/does-nirsoft-utilities-have-a-virus

[2] https://www.bleepingcomputer.com/forums/t/448129/is-nirsofts-software-safe/

[3] https://www.reddit.com/r/Hacking_Tutorials/comments/f6813s/nirsoftnet_software_are_safe/

3.08.2022

zsh

 Linux kabuğu (shell) olarak zsh'i denemek istedim. Fedora kullandığım makineye şu satırla kurulum yaptım:

$ sudo dnf install zsh util-linux-user

util-linux-user paketi, varsayılan kabuğu zsh olarak kullanmamızı sağlayacak chsh'e sahip.

Şu aşamada açtığımız ilk terminal hala varsayılan kabuğu (çoğu durumda bash) kullanıyor olacaktır. zsh'e geçmek için ya terminalde zsh yazıp elle giriş yapmamız lazım, ya da terminal'i açar açmaz zsh'in gelmesi için chsh'i kullanmamız lazım:

$ chsh -s $(which zsh)

Bunu sudo/root ile çalıştırmaya falan gerek yok. Sadece kendi kabuğumuzu değiştiriyoruz. Dolayısıyla mevcut kullanıcının parolasını girmemizi isteyecek. Bundan sonra bir kez oturumu kapatıp tekrar açmak gerek.

chsh kullanmayan başka bir yöntem ise usermod'u kullanmak:

$ sudo usermod -s $(which zsh) $(whoami)

Bir sonraki oturum açılışında artık varsayılan kabuğumuz zsh olacak. İlk açılışta da bir yapılandırma ekranı bizi karşılayacak.

zsh, aynı bash gibi profilin altında .zshrc adındaki bir yapılandırma dosyasına ihtiyaç duyar. Bu ekran, bu yapılandırma dosyasının olmaması durumunda çıkıyor. zsh'i yanlışlıkla çalıştıranlar ve henüz bir .zshrc dosyası oluşturmadan çıkmak isteyenler için (q) seçeneği makul. Eğer boş bir yapılandırma dosyası oluşturup devam etmesini istiyorsak (0)ı, ya da tam gaz yapılandırmaya geçmek için (1)i seçmemiz gerek. Bu durumda sıradaki ekranımız şöyle olacak:

Ben bu ekranda (1)e basarak komut geçmişi ile ilgili varsayılan ayarları kabul ediyorum, (2)ye basarak komut tamamlama sistemi ile ilgili varsayılanları kabul ediyorum, ve (4)e basarak da (1), (2), (3) ve (5)'i (s)ye basarak ayarlıyorum. Her ekrandan da (0)a basarak ayarlarımı hatırlamasını ve nihayetinde yukarıdaki ekrana döndüğümde de (0) seçeneği için açıklama "boş bir .zshrc dosyası oluşturup çıkmak" yerine "ayarları kaydederek çık"a dönüştüğünde bu seçenek ile ayarları kaydedip çıkmayı seçiyorum.

İşler bittiğinde yukarıdaki gibi bir ekran ile karşılaşıyorum. Aslında prompt'ta sadece değişen $ karakterinin yerine % karakterinin gelmiş olmasının dışında bir fark gözükmüyor.

Bu arada yukarıda yazan birkaç açıklamaya vurgu yapalım; bu çalışan karşılama ekranını tekrar çalıştırmak için

$ autoload -Uz zsh-newuser-install
$ zsh-newuser-install -f

yazabiliriz. Ayrıca .zshrc yapılandırma dosyasında 

# Lines configured by zsh-newuser-install
# End of lines configured by zsh-newuser-install

satırları arasına müdahale etmemiz, yapaacğımız değişiklikleri bu satırlar dışına eklememiz önerilmiş.

Bu noktada sade bir zsh'ımız oldu. Biraz daha renklendirmek için oh-my-zsh kurmayı tercih ediyorum. curl kullanarak

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

ya da git clone ile

$ git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh

ilgili dosyaları aldıktan sonra profil klasörümüzün altında .oh-my-zsh gizli klasörü oluşacak. oh-my-zsh bize hazır bazı temalar getirecek. Curl yöntemini seçtiysek .zshrc dosyasına varsayılan tema da girilmiş olacak. git clone yaptıysak bu işi el ile yapmamız gerekecek. Mevcut temalara göz atmak için projenin github sayfasına bakabiliriz. Bir tema seçtikten sonra .zshrc dosyasına 

ZSH_THEME="robbyrussell"

gibi bir tema adı yazmak, temamızı her açtığımızda rastgele değişecek şekilde belirlemek için

ZSH_THEME="random"

ya da belli birkaç temanın içinden rastgele seçmek için

ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )

yapılabiliyor.

zsh'i güzel yapan şeylerden biri de eklentileri. Çok kullanılan 2 güzel eklenti Fedora'nın depolarında mevcut. Kurmak için

$ sudo dnf install zsh-autosuggestions zsh-syntax-highlighting

yazmak yeterli. Kurulum sonrası bu iki eklentiyi yapılandırmamıza dahil etmek için yine .zshrc dosyasını açıp son satıra şu satırları eklemek gerek:

# plugins
source /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh
source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

Bu eklentilere ek olarak zsh-Z, fsf de kullanılabilir.

Oh-my-zsh ile gelen plugin'ler de faydalı olabilir.Herhangi bir plugin'i etkinleştirmek için .zshrc dosyasına

plugins=(rails git ruby)

gibi isimlerini yazmak gerek.

Görselliğe seviye atlatacak powerlevel10k temasını yüklemek için ise

$ git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k
$ echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc

yazabiliriz. En son satırdaki echo ile source'u .zshrc'ye ilave etmek yerine aşağıdakini de yapabiliriz

ZSH_THEME="powerlevel10k/powerlevel10k"

Niye 2 kere powerlevel10k yazdık? Çünkü profil klasörümüzün içinde powerline10k klasörünün içindeki powerlevel10k dosyasını göstermeye çalışıyoruz.

Powerlevel10k'in github sayfasında özel bir fonta ihtiyaç duymadığı, ama ek karakterlere sahip bir font ailesinin avantajlarını kullanabileceği yazılmış. Dolayısıyla şu fontlardan birini kullanmak isteyebiliriz:

Nerd Fonts,  

Source Code Pro,  

Font Awesome

Powerline

Powerlevel10k'yı etkinleştirdikten sonraki ilk açılışta aşağıdaki gibi bir ekran ile karşılaşacağız.

Görülebileceği gibi seçili fontlar ile bazı karakterleri göstermeyi deniyor ve bunların uygun şekilde gözüküp gözükmediği konusunda kullanıcıdan bir geri dönüş bekliyor. Diamond için hadi neyse, ama bir sonraki ekrandaki asma kilit sembolü için Fedora'nın varsayılan sabit genişlikli fontu monospace yeterli olmadı. Şu sayfada anlatıldığı gibi powerlevel10k-media reposundaki fontları indirdim.

$ cd $HOME/Downloads
$ wget https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf
$ wget https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf
$ wget https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf
$ wget https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf

Kurmak için Gnome fonts uygulaması ile açtıktan sonra sağ üst köşedeki Kur düğmesine bastım. Kurultuktan sonra bu düğme pasif hale geldi.


powerlevel10k'i tekrar yapılandırmak istersek

$ p10k configure

çalıştırmak gerek.

2.06.2022

Linux'ta Forticlient ile VPN ve internet

 Linux'ta fortisslvpn ile VPN yapaken internete bağlanamıyordum.

$ ip r

ile route tablomu incelediğimde 

default dev ppp0 proto static scope link metric 50

gibi fazladan bir satır gördüm. Bu, herşeyi VPN sanal arayüzüne göndermesini söylüyor. Windows'da forticlient böyle çalışmıyor; trafiğin sadece gereken kısmı VPN tüneline gidiyor, diğer kısmı varsayılan ağ geçidimize yönlendiriliyor. Linux'ta da aynısını yapalım, bu satırı silelim:

$ sudo ip route del default dev ppp0

4.05.2022

Manjaro'da düşük güç kipine giriş ve çıkış kayıtları

Hibernate ve suspend durumlarına ait kayıtları incelemek için bulduğum yöntemler şunlar:

$ journalctl -u systemd-hibernate.service --output=short-iso

$ journalctl -t systemd-sleep --output=short-iso

 Ayrıca beklenmeyen kapanmalarla ilgili şu bilgiler de faydalı olabilir.

12.04.2022

Eventlog ve provider listeleri

Türkçesi olay günlüğü ve sağlayıcı/tedarikçi listeleri. Windows işletim sistemlerinde oluşan olayları arka planda kaydeden bir olay günlüğü mekanizması vardır. Vista öncesi sistemlerde standart olarak Sistem (System), Güvenlik (Security) ve Uygulama (Application) gibi olay günlüklerine daha sonra Uygulama ve Hizmet Günlükleri (Application and Service Logs) altındaki diğer günlükler eklendi.

Powershell'in olay günlükleri ile ilgili ilk cmdlet'i Get-EventLog idi. Bu cmdlet, standart olay günlükleriyle çalışmakta yeterliydi. Örneğin bir makinedeki olay günlüklerinin listesini alabilmek için:

> Get-EventLog -List 

kullanabiliriz. Vista öncesi sistemlerde olay günlüklerine kayıt düşen bileşenlere kaynak (source) denirdi. Sisteme yeni kurulan bir sürücü, yeni bir yazılım, istediği olay günlüğüne kendi uygun gördüğü kaynak ismiyle kayıt düşerdi. Örnek olarak aşağıdaki olay kaydına bakalım:

Bir hizmetin durumu hakkında bizi bilgilendiren bu olay kaydını Sistem olay günlüğüne yazan kaynağın adı "Service Control Manager". Alışkanlıklar daha sonra biraz değişiti. Vista ile birlikte "Uygulama ve Hizmet Günlükleri"ni okumak için hem Get-Eventlog'dan başka bir cmdlet'e ihtiyaç duyuldu, hem de Kaynak (Source) teriminin yerine Sağlayıcı (Provider) geldi.

Yeni cmdlet Get-WinEvent oldu. Vista sonrası sistemlerde var olan yeni logların listesini alabilmek için de önceki örneğe eşdeğer olarak

> Get-WinEvent -ListLog *

geldi. Bu şekilde hiçbir ölçüt belirtmeden sadece * kullanara sorgularsak çok uzun bir liste ile karşılaşabilriz. Bunun yerine örneğin içinde powershell geçen olay günlükleri için

> Get-WinEvent -ListLog *powershell*

yazabiliriz.

Get-EventLog'da olmayan, ama Get-WinEvent ile gelen -ListProvider parametresi de bir önceki paragrafa konu sağlayıcıların listesini alabilmek için:

> Get-WinEvent -ListProvider *

Bu komut da benzer şekilde uzun bir liste verecek. Onun yerine örneğin içinde içinde sadece Sysmon geçen sağlayıcıları görebilmek için

> Get-WinEvent -ListProvider *sysmon*

yazabiliriz.

Get-Eventlog cmdlet'i için benzer bir -ListProvider parametresi yoktu. Bunun yerine kullanılabilecek yöntem şu olabilirdi:

> Get-WmiObject -Class Win32_NTEventLOgFile | Select-Object FileName, Sources

Bu şekilde her olay günlüğüne kaydedilmiş sağlayıcı (ya da kaynakları) ayrı ayrı görebiliriz.




11.03.2022

Powershell'de alias aramak

Get-Alias komutunun varsayılan araması bir alias'ın hangi cmdlet'e karşılık geldiğini bulmaya yönelik. Örneğin

PS> Get-Alias sls

CommandType     Name                           Version    Source
-----------     ----                           -------    ------
Alias           sls -> Select-String

Bazen ihtiyacım tam tersi oluyor; yani select-string'in alias'ı nedir, bunu bilmek istiyorum. Ama Get-Alias'ın böyle bir araması hata ile sonuçlanıyor:

PS> Get-Alias Select-String

Get-Alias : This command cannot find a matching alias because an alias with the name 'select-string' does not exist.
At line:1 char:1

Get-Alias komutunun ne gibi bir çıktı ürettiğini görmek için Get-Member (gm) cmdlet'ini kullanarak çıktı alanlarını inceledim.

PS> Get-Alias sls | gm

HelpUri             : https://go.microsoft.com/fwlink/?LinkID=113388
ResolvedCommandName : Select-String
DisplayName         : sls -> Select-String
ReferencedCommand   : Select-String
ResolvedCommand     : Select-String
Definition          : Select-String
Options             : None
Description         :
OutputType          : {Microsoft.PowerShell.Commands.MatchInfo, System.Boolean}
Name                : sls
CommandType         : Alias
Source              :
Version             :
Visibility          : Public
ModuleName          :
Module              :
RemotingCapability  : PowerShell
Parameters          : {[InputObject, System.Management.Automation.ParameterMetadata], [Pattern, System.Management.Automation.ParameterMetadata], [
                      Path, System.Management.Automation.ParameterMetadata], [LiteralPath, System.Management.Automation.ParameterMetadata]...}
ParameterSets       :

Yukarıdaki alanların içinde kırmızı ile belirttiğim Definition aradığım alan. Get-Alias'ın parametrelerinin içinde de böyle bir bölüm vardı. Bunu kullanarak:

PS> Get-Alias -Definition Select-String

CommandType     Name                          Version    Source
-----------     ----                          -------    ------
Alias           group -> Group-Object

sonuca ulaştım.