feat(server): Setup basic Echo QUIC server
- Generated server private key, Certificate Signing Request (CSR) and self-signed certificate.
This commit is contained in:
commit
7573f1769f
19
README.md
Normal file
19
README.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# QUIC Reflection Attack Simulation
|
||||||
|
|
||||||
|
Tested on the Python 3.12
|
||||||
|
|
||||||
|
## Goals
|
||||||
|
|
||||||
|
- Learn about the basics of the QUIC protocol and the python `aioquic` library.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
- Install Python3.12 and Pip
|
||||||
|
- Consider using a python virtual environment
|
||||||
|
- Run `pip install -r requirements.txt`
|
||||||
|
|
||||||
|
## Progress
|
||||||
|
|
||||||
|
- [ ] Server implementation
|
||||||
|
- [ ] Client (Victim) implementation
|
||||||
|
- [ ] Client (Bad Actor) implementation
|
29
requirements.txt
Normal file
29
requirements.txt
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# This file was autogenerated by uv via the following command:
|
||||||
|
# uv pip compile - -o requirements.txt
|
||||||
|
aioquic==1.2.0
|
||||||
|
attrs==24.1.0
|
||||||
|
# via service-identity
|
||||||
|
certifi==2024.7.4
|
||||||
|
# via aioquic
|
||||||
|
cffi==1.16.0
|
||||||
|
# via cryptography
|
||||||
|
cryptography==43.0.0
|
||||||
|
# via
|
||||||
|
# aioquic
|
||||||
|
# pyopenssl
|
||||||
|
# service-identity
|
||||||
|
pyasn1==0.6.0
|
||||||
|
# via
|
||||||
|
# pyasn1-modules
|
||||||
|
# service-identity
|
||||||
|
pyasn1-modules==0.4.0
|
||||||
|
# via service-identity
|
||||||
|
pycparser==2.22
|
||||||
|
# via cffi
|
||||||
|
pylsqpack==0.3.18
|
||||||
|
# via aioquic
|
||||||
|
pyopenssl==24.2.1
|
||||||
|
# via aioquic
|
||||||
|
service-identity==24.1.0
|
||||||
|
# via aioquic
|
||||||
|
uvloop==0.20.0
|
23
server.crt
Normal file
23
server.crt
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIID6TCCAtGgAwIBAgIUA6R0Oohkukp0PbSKG2yCqBv7YL0wDQYJKoZIhvcNAQEL
|
||||||
|
BQAwgZsxCzAJBgNVBAYTAkNBMQ8wDQYDVQQIDAZRdWViZWMxETAPBgNVBAcMCE1v
|
||||||
|
bnRyZWFsMRMwEQYDVQQKDApNaW5oVHJhbkxUMRowGAYDVQQLDBFRdWljUmVmbGVj
|
||||||
|
dGlvbkF0azERMA8GA1UEAwwITWluaFRyYW4xJDAiBgkqhkiG9w0BCQEWFW1pbmhA
|
||||||
|
bWluaHRyYW5uaGF0LmNvbTAgFw0yNDA4MTgxOTAwNTBaGA8zMDEwMDQxMjE5MDA1
|
||||||
|
MFowgZsxCzAJBgNVBAYTAkNBMQ8wDQYDVQQIDAZRdWViZWMxETAPBgNVBAcMCE1v
|
||||||
|
bnRyZWFsMRMwEQYDVQQKDApNaW5oVHJhbkxUMRowGAYDVQQLDBFRdWljUmVmbGVj
|
||||||
|
dGlvbkF0azERMA8GA1UEAwwITWluaFRyYW4xJDAiBgkqhkiG9w0BCQEWFW1pbmhA
|
||||||
|
bWluaHRyYW5uaGF0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
||||||
|
AMbS8p4wjNHUfnGc8sGdBRIEOMHQ+/QCtKnltgkt0i3fVfl0x9iMsORQjayLvJRJ
|
||||||
|
zgfA7yO6bpIVM4XfJavIxSyLCZT7uHEYWPfzNmvGHiOhdr9wuI6XMbeDDEU09t1A
|
||||||
|
pYWA+yiW6yDWQcg3fKA4DsmMFP5ebHPtDO+Wz3jtRkatynCD9AsAxqPmy7v/ruBB
|
||||||
|
sELyVvFGORDUk5po2OSrRb7Awlkwx2LhkhMYH7pNXmkJYbSjc8k0krWcQQLU7c17
|
||||||
|
c81PQvmb7Co9I6hVqZ0yxzmJ8G+EWtJSEdPNGLO8dUkvH6tmWZNgb2RMB3QMRsJF
|
||||||
|
LDFu0bt3OI/wwDrSwfU3dykCAwEAAaMhMB8wHQYDVR0OBBYEFPQrcuSoVRkrKJlZ
|
||||||
|
Beg7I2ssQpf1MA0GCSqGSIb3DQEBCwUAA4IBAQA/fuJy0ROp2zd2F8fKaoteC/7f
|
||||||
|
GQmd9AGPqdpuadxxFaOgpX2Skrf42p4GgPalPr2D7YZOxhmraSFWVHlSSxrSjiK0
|
||||||
|
fpLE8SGvL8ioGiFwiMza+m9+lOYdN1oPiHLFnklkRGIjAK09HCe3bYdhyOpCSYD9
|
||||||
|
ANqTAUNG1KN0PKFK+VoAK188fdbTF6vDc1PEVo/ManEeNzLIc/KModme264NJQhE
|
||||||
|
h4q21gbVaH+DdwpMZP29E+FLiOo+27BI1cwWyofv763BzWsZzwqGP3sK9vz6l8CK
|
||||||
|
giNruYNoQ/5Nd2xkB86sOdaryl6FYTCyr3p+oqGcfao5r0PY1B7ZYrFFhb6W
|
||||||
|
-----END CERTIFICATE-----
|
18
server.csr
Normal file
18
server.csr
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
-----BEGIN CERTIFICATE REQUEST-----
|
||||||
|
MIIC9jCCAd4CAQAwgZsxCzAJBgNVBAYTAkNBMQ8wDQYDVQQIDAZRdWViZWMxETAP
|
||||||
|
BgNVBAcMCE1vbnRyZWFsMRMwEQYDVQQKDApNaW5oVHJhbkxUMRowGAYDVQQLDBFR
|
||||||
|
dWljUmVmbGVjdGlvbkF0azERMA8GA1UEAwwITWluaFRyYW4xJDAiBgkqhkiG9w0B
|
||||||
|
CQEWFW1pbmhAbWluaHRyYW5uaGF0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
||||||
|
ADCCAQoCggEBAMbS8p4wjNHUfnGc8sGdBRIEOMHQ+/QCtKnltgkt0i3fVfl0x9iM
|
||||||
|
sORQjayLvJRJzgfA7yO6bpIVM4XfJavIxSyLCZT7uHEYWPfzNmvGHiOhdr9wuI6X
|
||||||
|
MbeDDEU09t1ApYWA+yiW6yDWQcg3fKA4DsmMFP5ebHPtDO+Wz3jtRkatynCD9AsA
|
||||||
|
xqPmy7v/ruBBsELyVvFGORDUk5po2OSrRb7Awlkwx2LhkhMYH7pNXmkJYbSjc8k0
|
||||||
|
krWcQQLU7c17c81PQvmb7Co9I6hVqZ0yxzmJ8G+EWtJSEdPNGLO8dUkvH6tmWZNg
|
||||||
|
b2RMB3QMRsJFLDFu0bt3OI/wwDrSwfU3dykCAwEAAaAVMBMGCSqGSIb3DQEJBzEG
|
||||||
|
DARlY2hvMA0GCSqGSIb3DQEBCwUAA4IBAQChwKgKdLGzkO0Towus06ioPDfy7nAz
|
||||||
|
cVjlA8HTHx7GURbBElCOwXEot78t3UOgLHlJYQ9J9v/8w0rKmby3WmjV1pwmZoZH
|
||||||
|
Scef1DYhpYvPSGHpEaPHdvDx+tOoa7x2AvLgzMrdJZui2wVbmRUmXfdb8v8ZjK12
|
||||||
|
7e/IifMK2dLc/U4csf7VkS/+WmuuE/4C3eaA0F6nBzkdB2ecwZbWelzTNLVf/u7h
|
||||||
|
a3XTFbFIrd7RU2kbDuU0o/5K5nrvx4ZHZzeaTy+hVVY1R5WwEITnb3/mxY3OvkfH
|
||||||
|
cNcXtYTr2Fp+Uw7YIPKSDGv7EXnCHErYzmNOP3OazWT+aAYPbzwa4ACN
|
||||||
|
-----END CERTIFICATE REQUEST-----
|
28
server.key
Normal file
28
server.key
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDG0vKeMIzR1H5x
|
||||||
|
nPLBnQUSBDjB0Pv0ArSp5bYJLdIt31X5dMfYjLDkUI2si7yUSc4HwO8jum6SFTOF
|
||||||
|
3yWryMUsiwmU+7hxGFj38zZrxh4joXa/cLiOlzG3gwxFNPbdQKWFgPsolusg1kHI
|
||||||
|
N3ygOA7JjBT+Xmxz7Qzvls947UZGrcpwg/QLAMaj5su7/67gQbBC8lbxRjkQ1JOa
|
||||||
|
aNjkq0W+wMJZMMdi4ZITGB+6TV5pCWG0o3PJNJK1nEEC1O3Ne3PNT0L5m+wqPSOo
|
||||||
|
VamdMsc5ifBvhFrSUhHTzRizvHVJLx+rZlmTYG9kTAd0DEbCRSwxbtG7dziP8MA6
|
||||||
|
0sH1N3cpAgMBAAECggEACDWZkvKKPfe6KNLEKz5igTXvagFJBfA+qW00sPhVX1OD
|
||||||
|
Z0NtJQHaI/M3hlJWvQC3IxbSSPVfr2R0tihak9c8XPR4ttAV84V/1u0R6C1L/Uij
|
||||||
|
cJAk7q5LfTpJ/WmMb+JFc1e6BxkEKFzwZmX0HWFzKts/2qjnbXnyOMpPUrzpU+2y
|
||||||
|
b+Y+o8FW3RRCvxADm5U4YrQPaJsObScduK9xxK95RoTvp27oXtu7vL2MqCZbucbQ
|
||||||
|
lua4u29T5U5XKGIqd8G7UTsj2nXVFArqXGG0N0CIQnyqbNGLrrpAd9FuyJeXnsgP
|
||||||
|
xBh2H+CcXBsDrqqfk45pzme76dQRN9SDsfFy7CIESQKBgQDt8XQDivYYOh+syF58
|
||||||
|
OYKjrqEEoaBQQkqY8m48KbopnRmPHiy7JbWM7wWsEWDgItGtATBDvPPzx6FnhqJO
|
||||||
|
80S0VD0P91a4WUy7a1A1SQvyI9ZUaJVEsWHQY5lzMmU3NJHeYo/lovtQ3h5DgNL8
|
||||||
|
gHpCgSxmUKT48CsrZikDf0BZCwKBgQDV6YXECThpT/BikDkRxF+w0fUqg6L5P4pG
|
||||||
|
W857y6n4j5BKFwNPPbrREEXI1RpLLM/8D0gVKlS9hYOamWZiH6J+3I1FltRJxrju
|
||||||
|
Q9OiyKI+MErj+bEq6nPVA8tV2IfZYsmq2S7K8XXvuMG/QAOIHIT3O/B2Plvk0DwS
|
||||||
|
O6yAD7QZGwKBgBwuZsEsqi0AZVP/f0FTRmfAfQ2hXu1ijJdEz02M26GmG6rZtg6M
|
||||||
|
Ts5cWN2iSUkClrbY1zCOpo4O7MzoIz0ajt6Uw46qirjWysG/2gYVmraZC/9/S36R
|
||||||
|
S7Z0tW3xYA+DyGsAXW6jOQTA6fCwx0xkoxZRWkLb9k4Nk+9V8DGb1rE1AoGAD99v
|
||||||
|
JJfGjtH2tWmcQnw+2YEK3ye7bSFQ4l2nmboIF8CXZVgFz9h1x1OcygU+GTvvBvYf
|
||||||
|
VCq69QE2Pb+KQFe2mBFHjlVd1Uegq1VvG9Ilb9XniLkbc2LIS5MngGw70F6rNjk9
|
||||||
|
ZqO6K5qbDdTzLiNnnmzdL/j6mqT1AClbaHlB1OcCgYA/qlAHtzVpHWeWg8UtNNjW
|
||||||
|
S5Mfdcld/wIy0T1dsw7ha8PPnwHU2aSydCrqIdyw4Ol0AuGNUsq+qpdfKHdyD/Li
|
||||||
|
7JxfTFUSXuqbzC6odFXZBZNBtphHUyvVwk4QybRXMVMVPIvOkvebij2kTiRanTjZ
|
||||||
|
jUp2nUaVQw4kDaiECn6NXQ==
|
||||||
|
-----END PRIVATE KEY-----
|
0
src/quic_reflection_attack/__init__.py
Normal file
0
src/quic_reflection_attack/__init__.py
Normal file
45
src/quic_reflection_attack/server.py
Normal file
45
src/quic_reflection_attack/server.py
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
import asyncio
|
||||||
|
from typing import Optional
|
||||||
|
import uvloop
|
||||||
|
|
||||||
|
from aioquic.quic.configuration import QuicConfiguration
|
||||||
|
from aioquic.quic.connection import QuicConnection
|
||||||
|
from aioquic.quic.events import QuicEvent, StreamDataReceived
|
||||||
|
from aioquic.asyncio import serve # type: ignore
|
||||||
|
|
||||||
|
|
||||||
|
class QuicServerProtocol:
|
||||||
|
def __init__(self):
|
||||||
|
self.quic: Optional[QuicConnection] = None
|
||||||
|
|
||||||
|
def quic_event_received(self, event: QuicEvent) -> None:
|
||||||
|
if isinstance(event, StreamDataReceived):
|
||||||
|
print(f"Received data on stream {event.stream_id}: {event.data.decode()}")
|
||||||
|
|
||||||
|
assert self.quic is not None, "QUIC Connection is not initialized"
|
||||||
|
|
||||||
|
# Echo the received data back to the client
|
||||||
|
self.quic.send_stream_data(event.stream_id, event.data)
|
||||||
|
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
configuration = QuicConfiguration(
|
||||||
|
is_client=False,
|
||||||
|
alpn_protocols=["quic-echo"], # our own custome ALPN protocol
|
||||||
|
)
|
||||||
|
|
||||||
|
# Load your SSL certificate and private key
|
||||||
|
configuration.load_cert_chain("server.crt", "server.key") # type: ignore
|
||||||
|
|
||||||
|
await serve(
|
||||||
|
"localhost",
|
||||||
|
8000,
|
||||||
|
configuration=configuration,
|
||||||
|
create_protocol=QuicServerProtocol,
|
||||||
|
)
|
||||||
|
|
||||||
|
await asyncio.Future() # Run forever
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
uvloop.run(main())
|
Loading…
x
Reference in New Issue
Block a user