Skip to content
Siber Vatan

Linux Ortamında PAM Yapılandırma Manipülasyonları ​

Nejdet Yılmaz · @nejdett


Giriş ve Çalışmanın Amacı ​

Siber Vatan bünyesinde yürüttüğümüz Takım 3 çalışmasında, sistem üzerinde yetki yükseltme (privilege escalation) sonrası kalıcılık (persistence) sağlama ve bu izleri tespit etme senaryoları üzerine odaklandık. Bir saldırgan sisteme sızıp root yetkisi aldığında, yönetici ilk açığı kapatsa bile sistemde kalabilmek için çeşitli mekanizmalar arar.

Bu çalışmada, harici bir binary derleyip antivirüs ya da dosya bütünlük alarmlarını tetiklemek yerine, işletim sisteminin kendi kimlik doğrulama katmanı olan PAM (Pluggable Authentication Modules) yapılandırması üzerinde değişiklik yaptık. Debian tabanlı test makinemizde parola denetimlerini nasıl atlatabileceğimizi, oturum açıldığı anda arka planda root haklarıyla nasıl sessizce betik çalıştırabileceğimizi test ettik. Ardından bu manipülasyonları Ansible ile tek komutla temizleyip, sistem çekirdeği seviyesinde (auditd) nasıl anlık takibe alacağımızı kurguladık.


1. Laboratuvar Ortamında PAM'in İncelenmesi ​

PAM, Linux'ta sshd, sudo, login veya cron gibi servislerin kimlik doğrulama adımlarını merkezi olarak yöneten bir modül mimarisi sunuyor. Yani her servisin içine tek tek şifre doğrulama kodu yazmak yerine servisler /etc/pam.d/ altındaki kurallara başvuruyor.

Bu mimaride kurallar yukarıdan aşağıya yığın (stack) mantığıyla çalışır. Bizim çalışmada odaklandığımız en kritik nokta sufficient kontrol bayrağı oldu. Eğer bir kural sufficient olarak işaretlenmişse ve o kural başarılı olursa, PAM motoru alt satırlardaki asıl şifre kontrollerini (örneğin /etc/shadow dosyasına bakan pam_unix.so modülünü) hiç işletmeden kullanıcıyı doğrudan içeri alıyor.


2. Kalıcılık Senaryoları ve Test Adımları ​

Test makinemizde iki farklı senaryo koştuk: Birincisi parola sormadan sisteme giriş sağlamak, ikincisi ise başarılı her oturumda arka planda tetiklenen bir komut mekanizması (execution hook) kurmak.

2.1. Parola Denetimini Atlatma (Authentication Bypass) ​

İlk denemede /etc/pam.d/sshd dosyasının başına auth sufficient pam_permit.so satırını girdik. pam_permit.so çağrıldığı anda koşulsuz şartsız başarılı dönen bir modüldür. Bu satır dosyanın en üstünde olduğu için SSH üzerinden gelen her isteği şifreye bakmadan kabul etti. Ancak bu ayar tüm kullanıcıları kapsadığı için çok göze batıyordu.

İkinci adımda daha gizli bir yöntem seçtik ve yalnızca bizim belirlediğimiz kullanıcının şifresiz girebilmesi için /etc/pam.d/common-auth dosyasını açıp ilk satıra şu kuralı ekledik:

text
auth sufficient pam_succeed_if.so user = hedef

Bu kural şu anlama geliyor: Eğer giriş yapmaya çalışan kullanıcı adı hedef ise kural doğrudan onaylansın. sufficient bayrağı devrede olduğu için PAM yığındaki diğer kuralları yok saydı. Test ettiğimizde, hedef kullanıcısıyla SSH veya konsol üzerinden bağlanırken parolaya ne yazarsak yazalım sisteme direkt root/kullanıcı kabuğu aldığımızı gördük.

PAM Yapılandırması
Görsel 1: /etc/pam.d/common-auth dosyasına eklediğimiz bypass ve session tetikleyici kuralları.


2.2. Oturum Anında Komut Tetikleme (Execution Hook) ​

Kimlik doğrulama adımından sonra oturumun yönetildiği session aşamasını test ettik. Amacımız, sistemde meşru bir kullanıcı dahi giriş yapsa arka planda root haklarıyla bizim istediğimiz bir betiğin koşturulmasıydı.

Bunun için /etc/pam.d/common-auth dosyasına şu satırı ilave ettik:

text
session optional pam_exec.so /home/backdoor.sh

pam_exec.so modülü harici betikleri çalıştırmak için kullanılıyor. Bu kural sayesinde makinede sudo, su, cron veya login ile kim oturum açarsa açsın, PAM motoru arka planda doğrudan root haklarıyla /home/backdoor.sh dosyasını çalıştırdı.

Bu modül çalıştırdığı betiğe ortam değişkenleri üzerinden bağlanan kullanıcının bilgilerini aktarıyor:

  • PAM_USER: Giriş yapan kullanıcı,
  • PAM_SERVICE: Tetikleyen servis (sudo, login, cron vb.),
  • PAM_RHOST: Bağlantının geldiği IP.

Laboratuvarda bu verileri toplayıp kaydetmek için /home/backdoor.sh betiğini şu şekilde hazırlayıp çalıştırılabilir (chmod +x) hale getirdik:

bash
#!/bin/bash
LOG_FILE="/var/log/pam_backdoor_test.log"
echo "=== PAM Tetiklenme Zamanı: $(date) ===" >> $LOG_FILE
echo "Sisteme erişmeye çalışan kullanıcı (PAM_USER): $PAM_USER" >> $LOG_FILE
echo "Tetikleyen servis (PAM_SERVICE): $PAM_SERVICE" >> $LOG_FILE
echo "Uzak IP adresi (PAM_RHOST): $PAM_RHOST" >> $LOG_FILE
echo "----------------------------------------" >> $LOG_FILE

Backdoor Betiği
Görsel 2: pam_exec.so tarafından her başarılı oturumda tetiklenen betik içeriği.


2.3. Test Sonuçları ve Logların İncelenmesi ​

Yapılandırmayı tamamladıktan sonra servisleri yeniden başlatmaya gerek kalmadı; çünkü PAM dinamik olarak her oturum isteğinde dosyaları tekrar okur. Farklı terminallerden sudo -i, konsoldan login ve zamanlanmış bir cron görevi tetikledik.

Log dosyasını (/var/log/pam_backdoor_test.log) kontrol ettiğimizde betiğin her işlemde eksiksiz çalıştığını teyit ettik:

PAM Tetiklenme Logları
Görsel 3: /var/log/pam_backdoor_test.log üzerinde yakalanan oturum ve servis kayıtları.

Bu test bize gösterdi ki: Bir saldırgan bu yöntemle root şifresi değiştirilse bile yetkili bir kullanıcı sudo çalıştırdığı anda arka planda ters bağlantı (reverse shell) açtırabilir veya veri sızdırabilir.


3. Sıkılaştırma: Ansible ile Otomatik Temizlik ​

Testler bittikten sonra makineyi ve ağdaki diğer test sunucularını eski temiz hâline getirmek için manuel dosya düzenlemek yerine Ansible otomasyonundan yararlandık. devices.ini envanter dosyasındaki hedef sunucuya yönelik hazırladığımız pam_ansible.yml playbook'u şu adımları işletti:

yaml
---
- name: PAM Backdoor Temizleme ve Fabrika Ayarlarına Dönüş
  hosts: pam_servers
  become: yes
  tasks:
    - name: common-auth içindeki pam_succeed_if kuralını temizle
      ansible.builtin.lineinfile:
        path: /etc/pam.d/common-auth
        regexp: '^auth\s+sufficient\s+pam_succeed_if\.so\s+user\s*=\s*.*'
        state: absent

    - name: common-auth içindeki yetkisiz pam_exec hook kuralını temizle
      ansible.builtin.lineinfile:
        path: /etc/pam.d/common-auth
        regexp: '^session\s+optional\s+pam_exec\.so\s+.*'
        state: absent

    - name: sshd içindeki pam_permit kuralını temizle
      ansible.builtin.lineinfile:
        path: /etc/pam.d/sshd
        regexp: '^auth\s+sufficient\s+pam_permit\.so'
        state: absent

    - name: Arka plandaki backdoor betiğini sil
      ansible.builtin.file:
        path: /home/backdoor.sh
        state: absent

    - name: Test logunu kaldır
      ansible.builtin.file:
        path: /var/log/pam_backdoor_test.log
        state: absent

    - name: PAM ayarlarını paket varsayılanlarına zorla döndür
      ansible.builtin.command:
        cmd: pam-auth-update --package --force

Playbook çalıştığında satırlar dosyalardan ayıklandı, zararlı betik silindi ve pam-auth-update komutuyla Debian'ın orijinal PAM yığını hatasız şekilde tekrar inşa edildi.


4. İzleme ve Tespit: Auditd ve SOC Bildirimi ​

Bu tarz yapılandırma değişiklikleri dosya boyutu veya hash'i üzerinden izlenmezse standart anti-virüsler tarafından kolayca kaçırılabilir. Bu yüzden Linux çekirdeğinin kendi denetim mekanizması olan auditd ile bir kural zinciri oluşturduk.

/etc/audit/rules.d/pam_monitor.rules altına eklediğimiz kuralla /etc/pam.d/ dizinine yapılacak tüm yazma ve dosya nitelik değişimlerini etiketledik:

text
-w /etc/pam.d/ -p wa -k pam_backdoor
-w /etc/security/ -p wa -k pam_security_tamper

Kuralı augenrules --load ile devreye aldıktan sonra ausearch -k pam_backdoor ile izlemeye alarak, bir saldırganın nano veya vim ile common-auth dosyasına dokunduğu anda çekirdek seviyesinde log düşürmesini sağlayabiliriz.

Takım olarak geliştirdiğimiz Python tabanlı SOC Alert ajanı ise /var/log/audit/audit.log dosyasını tail -F yöntemiyle canlı izleyerek key=pam_backdoor etiketli satırları yakalıyor ve Telegram API üzerinden SOC kanalına anlık uyarı iletiyor. Böylece yetkisiz bir satır eklendiği anda olay müdahale sürecini saniyeler içinde başlatabiliyoruz.


Çıkardığımız Sonuçlar ​

Laboratuvarda bizzat tecrübe ettiğimiz üzere:

  1. PAM yapılandırmaları dosya izinleri doğru kurgulanmadığında kalıcılık için en tehlikeli saldırı vektörlerinden birine dönüşüyor.
  2. sufficient kontrol bayrağı, parola doğrulamasını atlatmak isteyen saldırganlar için en pratik araç.
  3. Manuel kontrol yerine auditd gibi sistem çağrısı seviyesinde log üreten mekanizmalarla /etc/pam.d/ dizininin anlık izlenmesi ve konfigürasyon yönetim araçlarıyla (Ansible vb.) periyodik doğrulama yapılması bu tehdidi bertaraf etmenin en sağlam yoludur.

Kaynakça ​

PAM Mimarisi ve Güvenlik Mekanizmaları İçin Kaynakça