Race Condition
Last updated
Last updated
Gebruik Trickest om maklik te bou en outomatiese werksvloei te skep wat deur die wêreld se mees gevorderde gemeenskapstools aangedryf word. Kry Toegang Vandag:
Vir 'n diep begrip van hierdie tegniek, kyk na die oorspronklike verslag in https://portswigger.net/research/smashing-the-state-machine
Die hoofhindernis om voordeel te trek uit race condities is om te verseker dat verskeie versoeke gelyktydig hanteer word, met baie min verskil in hul verwerkings tye—ideaal gesproke, minder as 1ms.
Hier kan jy 'n paar tegnieke vir die Sinchronisering van Versoeke vind:
HTTP/2: Ondersteun die sending van twee versoeke oor 'n enkele TCP-verbinding, wat die impak van netwerk jitter verminder. egter, as gevolg van bediener-kant variasies, mag twee versoeke nie genoeg wees vir 'n konsekwente race condition uitbuiting nie.
HTTP/1.1 'Laaste-Byte Sync': Maak dit moontlik om die meeste dele van 20-30 versoeke vooraf te stuur, terwyl 'n klein fragment teruggehou word, wat dan saamgestuur word, wat gelyktydige aankoms by die bediener bereik.
Voorbereiding vir Laaste-Byte Sync behels:
Stuur koptekste en liggaamsdata minus die finale byte sonder om die stroom te beëindig.
Pauzeer vir 100ms na die aanvanklike sending.
Deaktiveer TCP_NODELAY om Nagle se algoritme te benut vir die bundeling van finale rame.
Ping om die verbinding op te warm.
Die daaropvolgende sending van teruggehoude rame moet lei tot hul aankoms in 'n enkele pakket, verifieerbaar via Wireshark. Hierdie metode is nie van toepassing op statiese lêers nie, wat tipies nie betrokke is by RC-aanvalle nie.
Om die teiken se argitektuur te verstaan is van kardinale belang. Voorpunt bedieners mag versoeke anders roete, wat tydsberekening beïnvloed. Voorkomende bediener-kant verbinding opwarming, deur onbelangrike versoeke, mag versoek tydsberekening normaliseer.
Raamwerke soos PHP se sessiehandler serialiseer versoeke volgens sessie, wat moontlik kwesbaarhede verdoesel. Die gebruik van verskillende sessietokens vir elke versoek kan hierdie probleem omseil.
As verbinding opwarming nie effektief is nie, kan die doelbewuste onttriggering van webbedieners se tarief of hulpbronlimiet vertragings deur 'n vloed van dummy versoeke die enkel-pakket aanval fasiliteer deur 'n bediener-kant vertraging te veroorsaak wat bevorderlik is vir race condities.
Tubo Intruder - HTTP2 enkel-pakket aanval (1 eindpunt): Jy kan die versoek na Turbo intruder (Extensions
-> Turbo Intruder
-> Send to Turbo Intruder
) stuur, jy kan die waarde wat jy wil brute force vir %s
soos in csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s
verander en dan die examples/race-single-packer-attack.py
uit die keuselys kies:
As jy verskillende waardes gaan stuur, kan jy die kode met hierdie een wat 'n woordlys van die klembord gebruik, aanpas:
As die web nie HTTP2 ondersteun nie (slegs HTTP1.1) gebruik Engine.THREADED
of Engine.BURP
in plaas van Engine.BURP2
.
Tubo Intruder - HTTP2 enkele-pakket aanval (Verskeie eindpunte): In die geval dat jy 'n versoek na 1 eindpunt moet stuur en dan verskeie na ander eindpunte om die RCE te aktiveer, kan jy die race-single-packet-attack.py
skrip met iets soos:
Dit is ook beskikbaar in Repeater via die nuwe 'Stuur groep in parallel' opsie in Burp Suite.
Vir limit-overrun kan jy net die dieselfde versoek 50 keer in die groep voeg.
Vir connection warming, kan jy byvoeg aan die begin van die groep 'n paar versoeke na 'n nie-statiese deel van die webbediener.
Vir delaying die proses tussen die verwerking van een versoek en 'n ander in 'n 2 substates stappe, kan jy extra versoeke tussen beide versoeke voeg.
Vir 'n multi-endpoint RC kan jy begin om die versoek te stuur wat na die versteekte toestand gaan en dan 50 versoeke net daarna wat die versteekte toestand benut.
Geoutomatiseerde python skrip: Die doel van hierdie skrip is om die e-pos van 'n gebruiker te verander terwyl dit voortdurend verifieer totdat die verifikasietoken van die nuwe e-pos by die laaste e-pos aankom (dit is omdat daar in die kode 'n RC gesien is waar dit moontlik was om 'n e-pos te wysig maar die verifikasie na die ou een te stuur omdat die veranderlike wat die e-pos aandui reeds met die eerste een bevolk was). Wanneer die woord "objetivo" in die ontvangde e-posse gevind word, weet ons ons het die verifikasietoken van die veranderde e-pos ontvang en ons beëindig die aanval.
In die oorspronklike navorsing word verduidelik dat hierdie aanval 'n limiet van 1,500 bytes het. egter, in hierdie pos, is verduidelik hoe dit moontlik is om die 1,500-byte beperking van die enkelpakketaanval uit te brei na die 65,535 B vensterbeperking van TCP deur IP-laag fragmentasie te gebruik (om 'n enkele pakket in verskeie IP-pakkette te verdeel) en dit in 'n ander volgorde te stuur, wat dit moontlik gemaak het om die pakket te voorkom om weer saamgestel te word totdat al die fragmente by die bediener aangekom het. Hierdie tegniek het die navorser in staat gestel om 10,000 versoeke in ongeveer 166ms te stuur.
Let daarop dat alhoewel hierdie verbetering die aanval meer betroubaar maak in RC wat honderde/duisende pakkette vereis om op dieselfde tyd aan te kom, dit ook 'n paar sagtewarebeperkings kan hê. Sommige gewilde HTTP-bedieners soos Apache, Nginx en Go het 'n streng SETTINGS_MAX_CONCURRENT_STREAMS
instelling van 100, 128 en 250. egter, ander soos NodeJS en nghttp2 het dit onbeperk.
Dit beteken basies dat Apache slegs 100 HTTP-verbindinge van 'n enkele TCP-verbinding sal oorweeg (wat hierdie RC-aanval beperk).
Jy kan 'n paar voorbeelde van hierdie tegniek in die repo vind https://github.com/Ry0taK/first-sequence-sync/tree/main.
Voor die vorige navorsing was daar 'n paar payloads wat gebruik is wat net probeer het om die pakkette so vinnig as moontlik te stuur om 'n RC te veroorsaak.
Herhaler: Kyk na die voorbeelde van die vorige afdeling.
Indringer: Stuur die versoek na Indringer, stel die aantal drade op 30 binne die Opsies-menu en, kies as payload Null payloads en genereer 30.
Turbo Indringer
Python - asyncio
Dit is die mees basiese tipe van 'n race condition waar kwesbaarhede wat verskyn in plekke wat die aantal kere wat jy 'n aksie kan uitvoer, beperk. Soos om dieselfde afslagkode verskeie kere in 'n webwinkel te gebruik. 'n Baie maklike voorbeeld kan gevind word in hierdie verslag of in hierdie fout.
Daar is baie variasies van hierdie soort aanval, insluitend:
Om 'n geskenkkaart verskeie kere in te wissel
Om 'n produk verskeie kere te beoordeel
Om kontant te onttrek of oor te dra bo jou rekeningbalans
Om 'n enkele CAPTCHA-oplossing te hergebruik
Om 'n anti-brute-force koerslimiet te omseil
Die ontginning van komplekse race conditions behels dikwels die benutting van kort geleenthede om met versteekte of onbedoelde masjien substates te kommunikeer. Hier is hoe om dit aan te pak:
Identifiseer Potensiële Versteekte Substates
Begin deur eindpunte te identifiseer wat kritieke data, soos gebruikersprofiele of wagwoordherstelprosesse, wysig of mee kommunikeer. Fokus op:
Berging: Verkies eindpunte wat server-kant volhoubare data manipuleer bo dié wat data kliënt-kant hanteer.
Aksie: Soek na operasies wat bestaande data verander, wat meer waarskynlik is om ontginbare toestande te skep in vergelyking met dié wat nuwe data byvoeg.
Sleutel: Suksesvolle aanvalle behels gewoonlik operasies wat op dieselfde identifiseerder gegrond is, bv. gebruikersnaam of hersteltoken.
Voer Aanvanklike Probering Uit
Toets die geïdentifiseerde eindpunte met race condition aanvalle, en let op enige afwykings van verwagte uitkomste. Onverwagte reaksies of veranderinge in toepassingsgedrag kan 'n kwesbaarheid aandui.
Demonstreer die Kwesbaarheid
Beperk die aanval tot die minimale aantal versoeke wat nodig is om die kwesbaarheid te ontgin, dikwels net twee. Hierdie stap mag verskeie pogings of outomatisering vereis weens die presiese tydsberekening wat betrokke is.
Presisie in die tydsberekening van versoeke kan kwesbaarhede onthul, veral wanneer voorspelbare metodes soos tydstempels vir sekuriteitstokens gebruik word. Byvoorbeeld, die generering van wagwoordherstel tokens gebaseer op tydstempels kan identiese tokens vir gelyktydige versoeke toelaat.
Om te Ontgin:
Gebruik presiese tydsberekening, soos 'n enkele pakket aanval, om gelyktydige wagwoordherstel versoeke te maak. Identiese tokens dui op 'n kwesbaarheid aan.
Voorbeeld:
Versoek twee wagwoordherstel tokens op dieselfde tyd en vergelyk hulle. Ooreenstemmende tokens dui op 'n fout in token generasie.
Kyk na hierdie PortSwigger Lab om dit te probeer.
Kyk na hierdie PortSwigger Lab om te sien hoe om te betaal in 'n winkel en 'n ekstra item by te voeg wat jy nie vir hoef te betaal nie.
Die idee is om 'n e-posadres te verifieer en dit terselfdertyd na 'n ander een te verander om uit te vind of die platform die nuwe een wat verander is, verifieer.
Volgens hierdie navorsing was Gitlab kwesbaar vir 'n oorneem op hierdie manier omdat dit mag stuur die e-posverifikasietoken van een e-pos na die ander e-pos.
Kyk na hierdie PortSwigger Lab om dit te probeer.
As 2 verskillende skrywe gebruik word om inligting binne 'n databasis toe te voeg, is daar 'n klein tydsdeel waar slegs die eerste data geskryf is binne die databasis. Byvoorbeeld, wanneer 'n gebruiker geskep word, kan die gebruikersnaam en wagwoord geskryf word en dan die token om die nuut geskepte rekening te bevestig, geskryf word. Dit beteken dat vir 'n kort tyd die token om 'n rekening te bevestig is null.
Daarom kan die registrasie van 'n rekening en die stuur van verskeie versoeke met 'n leë token (token=
of token[]=
of enige ander variasie) om die rekening onmiddellik te bevestig, toelaat om 'n rekening te bevestig waar jy nie die e-pos beheer nie.
Kyk na hierdie PortSwigger Lab om dit te probeer.
Die volgende pseudo-kode is kwesbaar vir race condition omdat daar in 'n baie kort tyd die 2FA nie afgedwing word terwyl die sessie geskep word:
Daar is verskeie OAUth verskaffers. Hierdie dienste sal jou toelaat om 'n toepassing te skep en gebruikers te verifieer wat die verskaffer geregistreer het. Om dit te doen, sal die klient jou toepassing moet toelaat om toegang te verkry tot sommige van hul data binne die OAUth verskaffer. So, tot hier is dit net 'n algemene aanmelding met google/linkedin/github... waar jy 'n bladsy te sien kry wat sê: "Toepassing <InsertCoolName> wil toegang tot jou inligting hê, wil jy dit toelaat?"
authorization_code
Die probleem verskyn wanneer jy dit aanvaar en outomaties 'n authorization_code
na die kwaadwillige toepassing stuur. Dan, hierdie toepassing misbruik 'n Race Condition in die OAUth diensverskaffer om meer as een AT/RT (Authentication Token/Refresh Token) van die authorization_code
vir jou rekening te genereer. Basies, dit sal die feit misbruik dat jy die toepassing aanvaar het om toegang tot jou data te verkry om verskeie rekeninge te skep. Dan, as jy stop om die toepassing toe te laat om toegang tot jou data te verkry, sal een paar AT/RT verwyder word, maar die ander sal steeds geldig wees.
Refresh Token
Sodra jy 'n geldige RT verkry het, kan jy probeer om dit te misbruik om verskeie AT/RT te genereer en selfs as die gebruiker die toestemmings vir die kwaadwillige toepassing om sy data te verkry, sal verskeie RT's steeds geldig wees.
In WS_RaceCondition_PoC kan jy 'n PoC in Java vind om websocket boodskappe in parallel te stuur om Race Conditions ook in Web Sockets te misbruik.
Gebruik Trickest om maklik te bou en werkvloei te outomatiseer wat deur die wêreld se mees gevorderde gemeenskap gereedskap aangedryf word. Kry Toegang Vandag:
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)