lsof ile Şüpheli Dosya ve Bağlantıları Tespit Etme
Bir sunucuda garip bir şeyler döndüğünü hissediyorsunuz ama tam olarak neyin nerede olduğunu bilmiyorsunuz. İşte tam bu noktada lsof komutu sysadmin’in en güvenilir silahlarından biri haline geliyor. “List Open Files” anlamına gelen bu araç, sistemde o anda hangi dosyaların, soketlerin ve ağ bağlantılarının açık olduğunu size gösteriyor. Linux’ta “her şey bir dosyadır” felsefesi düşünüldüğünde, lsof’un ne kadar güçlü bir araç olduğunu anlamak kolaylaşıyor.
lsof Nedir ve Neden Bu Kadar Değerlidir?
lsof, sistemdeki tüm açık dosyaları listeleyen bir komut satırı aracıdır. Ama burada “dosya” kavramını geniş tutmak gerekiyor: düzenli dosyalar, dizinler, blok özel dosyalar, karakter özel dosyalar, çalışan kütüphaneler, akış dosyaları ve ağ dosyaları (soketler dahil) bunların hepsi lsof’un radarına giriyor.
Güvenlik açısından bakıldığında lsof size şunları söyleyebilir:
- Hangi işlem hangi ağ bağlantısını kullanıyor
- Silinen ama hala açık tutulan dosyalar var mı
- Belirli bir port dinleyen process nedir
- Bir kullanıcı hangi dosyalara erişiyor
- Şüpheli bir process hangi kütüphaneleri yüklemiş
Güvenlik olayı müdahalesi (incident response) sırasında lsof, size sistemin anlık durumunu net bir şekilde gösterir. Zararlı yazılımlar genellikle kendilerini gizlemeye çalışır ama açık dosya ve bağlantılar çoğunlukla ele geçirir onları.
Temel Kullanım ve Çıktıyı Okumak
lsof’u ilk kez çalıştırdığınızda yüzlerce satır çıktı görürsünüz. Bu çıktıyı doğru okuyabilmek kritik önem taşır.
sudo lsof | head -20
Çıktının sütunları şu anlama gelir:
- COMMAND: İşlemi çalıştıran komutun adı
- PID: Process ID numarası
- USER: İşlemi çalıştıran kullanıcı
- FD: File Descriptor (dosya tanımlayıcı tipi)
- TYPE: Dosya tipi (REG, DIR, IPv4, IPv6, FIFO vs.)
- DEVICE: Cihaz numarası
- SIZE/OFF: Dosya boyutu veya offset
- NODE: Inode numarası
- NAME: Dosya veya bağlantının adı/adresi
FD sütunundaki değerlere dikkat etmek gerekiyor. cwd çalışma dizini, txt program kodu veya datası, mem hafızaya yüklenmiş dosya, sayısal değerler ise gerçek dosya tanımlayıcıları anlamına geliyor.
Ağ Bağlantılarını İncelemek
Şüpheli ağ aktivitesi tespitinde lsof’un ağ modunu kullanmak en hızlı yöntemdir.
sudo lsof -i
Bu komut tüm internet ve ağ dosyalarını listeler. Ama daha spesifik sorgular yapmak genellikle daha işe yarar.
Sadece TCP bağlantılarını görmek için:
sudo lsof -i TCP
Belirli bir portu dinleyen process’i bulmak için:
sudo lsof -i :4444
Port 4444, Metasploit’in varsayılan dinleme portudur. Eğer bu komut bir sonuç döndürüyorsa ciddi bir sorun var demektir.
Belirli bir IP adresine giden bağlantıları görmek için:
sudo lsof -i @203.0.113.50
Hem port hem de IP filtresi birleştirmek de mümkün:
sudo lsof -i [email protected]:80
LISTEN ve ESTABLISHED Durumlarını Ayırt Etmek
sudo lsof -i TCP -s TCP:LISTEN
Bu komut yalnızca bağlantı bekleyen portları gösterir. Sunucunuzda beklenmedik portların açık olması kritik bir uyarı işaretidir. Normal şartlarda görmeyeceğiniz portlar, yani 22 (SSH), 80 (HTTP), 443 (HTTPS) dışındaki portlar mercek altına alınmalıdır.
Aktif bağlantıları görmek için:
sudo lsof -i TCP -s TCP:ESTABLISHED
Bu çıktıda tanımadığınız uzak IP adresleri görüyorsanız, o bağlantıların hangi process tarafından kurulduğuna hemen bakın.
Gerçek Dünya Senaryosu: Reverse Shell Tespiti
Bir sızma testi veya gerçek saldırı senaryosunda saldırganlar sisteme girdikten sonra genellikle reverse shell açarlar. Bu sayede kendi sistemlerine bağlantı kurarak komut çalıştırabilirler.
Şüpheli bir durumda şu komutu çalıştırın:
sudo lsof -i -n -P | grep ESTABLISHED
-n parametresi DNS çözümlemesini devre dışı bırakır (daha hızlı sonuç verir), -P ise port numaralarını servis adına çevirmez. Bu sayede gerçek port numaralarını görürsünüz.
Eğer çıktıda şuna benzer bir şey görüyorsanız:
bash 1337 root 3u IPv4 89234 0t0 TCP 192.168.1.100:45234->203.0.113.50:4444 (ESTABLISHED)
Bu çok ciddi bir durumdur. bash process’i dışarıya bir bağlantı kurmuş ve bu bağlantı üzerinden komut alıyor olabilir. PID’i not alın ve hemen araştırmaya başlayın:
sudo ls -la /proc/1337/exe
sudo cat /proc/1337/cmdline | tr '' ' '
sudo ls -la /proc/1337/fd
Silinen Ama Hala Açık Dosyaları Bulmak
Zararlı yazılımların klasik numaralarından biri, kendini diske yazıp çalıştırdıktan sonra dosyayı silmektir. Dosya silinmiş olsa da process hala çalışıyorsa, lsof bu durumu (deleted) etiketi ile gösterir.
sudo lsof | grep deleted
Bu çıktıda karşınıza şöyle bir satır çıkabilir:
python3 2891 attacker 3r REG 8,1 45678 /tmp/.hidden_malware (deleted)
Bu durumda dosya diskten silinmiş ama hafızada hala çalışıyor. Process’in içeriğini kurtarmak mümkündür:
sudo cp /proc/2891/exe /tmp/recovered_binary
sudo strings /tmp/recovered_binary | less
Bu yöntem, aktif bir saldırı sırasında zararlı yazılımın bir kopyasını almanızı sağlar. Forensics açısından son derece değerlidir.
Belirli Bir Kullanıcının Aktivitesini İzlemek
Şüpheli bir kullanıcı hesabınız mı var? lsof ile o kullanıcının tüm açık dosyalarını görebilirsiniz:
sudo lsof -u kullanici_adi
Bir kullanıcının ağ bağlantılarını filtrelemek için:
sudo lsof -u kullanici_adi -i
Belirli bir kullanıcı dışındaki herkesin bağlantılarını görmek isterseniz:
sudo lsof -u ^root -i
Başındaki ^ işareti “hariç tut” anlamına gelir. Bu komut root dışındaki tüm kullanıcıların ağ bağlantılarını listeler. Beklenmedik sistem hesaplarının (www-data, nobody, daemon gibi) ağ bağlantısı kurması şüphe uyandırmalıdır.
Process ID ile Derinlemesine Analiz
Şüpheli bir PID tespit ettiğinizde, o process’in tüm açık dosyalarını incelemek istersiniz:
sudo lsof -p 1337
Birden fazla PID’i aynı anda inceleyebilirsiniz:
sudo lsof -p 1337,1338,1339
Belirli bir process adına göre aramak için:
sudo lsof -c python3
Bu komut adında “python3” geçen tüm process’lerin açık dosyalarını gösterir. Eğer bir web sunucusunuz var ve python3 process’leri beklenmedik ağ bağlantıları kuruyorsa, bu mutlaka araştırılmalıdır.
Gerçek Dünya Senaryosu: Web Shell Tespiti
Bir web sunucusunda bir şeylerin ters gittiğini düşünelim. Apache veya Nginx process’lerinin beklenmedik bağlantılar kurduğunu görüyorsunuz.
sudo lsof -u www-data -i TCP -s TCP:ESTABLISHED
Eğer web sunucusu kullanıcısı (www-data) dışarıya bağlantı açmışsa, büyük ihtimalle bir web shell çalıştırılmıştır.
Apache’nin hangi dosyalara eriştiğini kontrol edin:
sudo lsof -c apache2 | grep -v ".so" | grep REG
Bu çıktıda /var/www/html dışında açılan dosyalar, özellikle /tmp veya /dev/shm altındaki dosyalar ciddi şüphe işareti taşır.
Şüpheli bir PHP dosyası tespit ettiyseniz, hangi process’in o dosyayı açtığını bulun:
sudo lsof /var/www/html/wp-content/uploads/shell.php
/tmp ve /dev/shm Dizinlerini İzlemek
Saldırganlar geçici dizinleri sever. Bu dizinler genellikle çalıştırma izni verir ve log’larda daha az dikkat çeker.
sudo lsof +D /tmp
+D parametresi belirtilen dizini ve alt dizinlerini özyinelemeli olarak tarar.
sudo lsof +D /dev/shm
/dev/shm (shared memory) dizini RAM üzerinde çalışır ve disk’e yazılmaz. Zararlı yazılımlar bu dizini çok sever çünkü sistem yeniden başlatıldığında tüm izler siliner.
sudo lsof +D /var/tmp
Bu üç dizinde beklenmedik çalıştırılabilir dosyalar veya script’ler görüyorsanız hemen müdahale etmelisiniz.
Periyodik İzleme ve Otomatik Uyarı
lsof’u tek seferlik kullanmak yetmez. Özellikle kritik sistemlerde periyodik tarama yapılması gerekir.
Belirli aralıklarla çalışıp sonuçları log’a yazan basit bir script:
#!/bin/bash
LOGFILE="/var/log/lsof_security.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "=== $TIMESTAMP ===" >> $LOGFILE
# Şüpheli portlarda dinleyen process'leri kontrol et
SUSPICIOUS=$(sudo lsof -i TCP -s TCP:LISTEN -n -P |
grep -vE ":(22|80|443|8080|3306|5432)s" |
grep -v "COMMAND")
if [ -n "$SUSPICIOUS" ]; then
echo "[UYARI] Beklenmedik dinleme portları tespit edildi:" >> $LOGFILE
echo "$SUSPICIOUS" >> $LOGFILE
# Mail gönder veya Slack webhook tetikle
fi
# Silinen ama açık dosyaları kontrol et
DELETED=$(sudo lsof | grep deleted | grep -vE "(log|cache|tmp)")
if [ -n "$DELETED" ]; then
echo "[UYARI] Silinmiş ama açık dosyalar tespit edildi:" >> $LOGFILE
echo "$DELETED" >> $LOGFILE
fi
Bu script’i cron’a ekleyin:
*/5 * * * * /usr/local/bin/lsof_monitor.sh
netstat ve ss ile Karşılaştırmalı Kullanım
lsof tek başına güçlü olsa da bazı sysadmin’ler ss veya eski netstat komutlarını da kullanır. Ancak lsof’un önemli bir avantajı var: hangi process’in hangi bağlantıyı kurduğunu doğrudan gösterir.
Aynı bilgiyi ss ile almak için:
ss -tulnp
lsof ile:
sudo lsof -i -n -P | grep LISTEN
lsof’un üstün olduğu nokta, dosya bazlı sorgulama yapabilmesidir. “Bu dosyayı kim açmış?” sorusunu ss ile cevaplayamazsınız ama lsof ile saniyeler içinde bulursunuz.
Gelişmiş Filtreleme Teknikleri
Birden fazla koşulu aynı anda sorgulamak için lsof’un mantıksal operatörlerini kullanabilirsiniz. Varsayılan olarak lsof OR mantığıyla çalışır. AND mantığı için -a parametresi kullanılır.
sudo lsof -u www-data -a -i TCP
Bu komut “www-data kullanıcısı AND TCP bağlantısı” şeklinde çalışır.
Belirli bir dosya sistemindeki tüm açık dosyaları görmek (unmount öncesi kullanışlıdır):
sudo lsof /dev/sdb1
IPv4 ve IPv6’yı ayrı ayrı filtrelemek:
sudo lsof -i 4 -n -P
sudo lsof -i 6 -n -P
Çıktıyı daha makine okunabilir hale getirmek için:
sudo lsof -F pcn -i TCP
-F parametresi ile alanları belirleyebilirsiniz: p PID, c komut adı, n ağ adresi.
Hafıza Eşlemeli Dosyaları Analiz Etmek
Zararlı yazılımlar bazen meşru görünen kütüphane dosyalarının içine kod enjekte eder. lsof ile hangi kütüphanelerin hangi process’ler tarafından yüklendiğini görebilirsiniz.
sudo lsof -p 1337 | grep mem
Bu çıktıda beklenmedik .so dosyaları veya standart olmayan dizinlerden yüklenen kütüphaneler dikkat çekmeli. Örneğin /tmp/libevil.so veya /home/kullanici/.config/liblegit.so.1 gibi dosyalar kesinlikle şüphelidir.
Tüm sistemde şüpheli hafıza eşlemelerini aramak:
sudo lsof | grep mem | grep -v ".so" | grep -v ".jar" | grep REG
Bu komut, hafızaya yüklenmiş ama standart kütüphane uzantısı olmayan dosyaları listeler.
Olay Müdahalesinde lsof Kullanım Sırası
Bir güvenlik olayı sırasında sistematik bir yaklaşım benimsemek kritiktir. Şu sırayı takip etmenizi öneririm:
İlk olarak genel durumu değerlendirin ve çıktıyı kaydedin:
sudo lsof -n -P > /tmp/lsof_snapshot_$(date +%Y%m%d_%H%M%S).txt
Ardından anormal ağ bağlantılarına odaklanın. Bilinen iyi portlar dışında ne var, dışarıya bağlantı açan beklenmedik process’ler var mı diye bakın. Tespit ettiğiniz şüpheli PID’leri derinlemesine analiz edin. Silinen ama çalışan dosyaları arayın ve varsa kopyalarını alın. Son olarak şüpheli process’lerin parent-child ilişkisini inceleyin:
sudo lsof -p $(pgrep -d, -P 1337)
Bu adımlar sizi hızlıca olayın merkezine götürür.
Performans ve Dikkat Edilmesi Gerekenler
lsof, özellikle büyük sistemlerde yavaş çalışabilir. Binlerce process ve açık dosya olduğunda birkaç saniye sürebilir.
Performansı artırmak için:
- -n kullanın: DNS sorgusu yapmaz, hızlanır
- -P kullanın: Port-servis çevirisi yapmaz, hızlanır
- Gereksiz yere
sudo lsofyerine spesifik sorgular yapın - Sonuçları pipe ile
grepveyaawk‘a yönlendirin
Ayrıca lsof’un anlık bir fotoğraf çektiğini unutmayın. Bir process hızla bağlanıp bağlantısını kesiyorsa lsof’u tam o anda çalıştırmadıkça göremezsiniz. Bu yüzden düzenli aralıklarla çalıştırmak veya watch komutuyla canlı izleme yapmak daha sağlıklı sonuçlar verir:
watch -n 2 'sudo lsof -i TCP -s TCP:ESTABLISHED -n -P'
Sonuç
lsof, sysadmin’in ve güvenlik uzmanının araç kutusunda olmazsa olmaz bir yerden haketmektedir. Basit görünen bir “açık dosyaları listele” komutu, doğru kullanıldığında reverse shell’leri, web shell’leri, şüpheli ağ bağlantılarını ve hafızada gizlenen zararlı yazılımları gün yüzüne çıkarabilir.
Önemli olan, sisteminizin normal davranışını iyi tanımaktır. Hangi portların açık olması gerektiğini, hangi kullanıcıların ağ bağlantısı kurmasının normal olduğunu bilmeden lsof çıktısını yorumlamak zordur. Bu yüzden olaysız dönemlerde de düzenli olarak lsof snapshot’ları alın ve karşılaştırmalı analiz yapın.
Sonuçta güvenlik, reaktif değil proaktif bir disiplindir. lsof’u yalnızca bir şeyler ters gittiğinde değil, her gün rutin izlemenizin bir parçası haline getirin. Sisteminizi ne kadar iyi tanırsanız, anormalliği o kadar hızlı fark edersiniz.
