This shows you the differences between two versions of the page.
|
isc:labs:041-bonus [2024/10/19 19:10] florin.stancu removed |
— (current) | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | /* ~~SHOWSOLUTION~~ */ | ||
| - | |||
| - | ===== Lab 04 - Authentication (bonus) ===== | ||
| - | |||
| - | ===== Objectives ===== | ||
| - | |||
| - | * Authentication protocols | ||
| - | * Diffie Hellman | ||
| - | * Man in the Middle attacks | ||
| - | |||
| - | ===== Preparation ===== | ||
| - | |||
| - | You may use the UPB's [[https://cloud.grid.pub.ro|OpenStack cloud to instantiate a Virtual Machine]] to be used for this lab! | ||
| - | [[:isc:info:virtualmachine|Read these instructions if you wanna know how!]]. | ||
| - | |||
| - | ===== Overview ===== | ||
| - | |||
| - | In the last lecture ({{:isc:lectures:isc_05_auth.pdf | Lecture 05 - Authentication and Key Establishment}}), we studied various authentication protocols and how their behavior and security may be analyzed. | ||
| - | |||
| - | In the current lab, we test a MitM attack on a simple, but broken Diffie-Hellman based protocol. | ||
| - | |||
| - | ===== Tasks ===== | ||
| - | |||
| - | ==== 00. Setup ==== | ||
| - | |||
| - | * First, download the {{isc:labs:auth-dh-mitm.zip|lab code from here}} (inside the VM). | ||
| - | |||
| - | * Again, we use Docker for its remote provisioning features: | ||
| - | <code bash> | ||
| - | docker pull ropubisc/auth-lab # to update image | ||
| - | mkdir ~/auth-lab # to store your MitM solution persistenly | ||
| - | # you may use the --debug or --mitm argument at the end of the docker command | ||
| - | # when ran with no arguments, it runs a direct Client-Server simulation (no MitM) | ||
| - | docker run --rm --name auth-lab -v $(pwd)/auth-lab/:/home/hacker/auth-lab -it ropubisc/auth-lab | ||
| - | </code> | ||
| - | * Note: the ''~/auth-lab/'' folder is used as persistent volume so you won't lose + sync your work inside the container! | ||
| - | |||
| - | ==== 01. Man in the Middle ==== | ||
| - | |||
| - | * This one should be clear: code a MitM attack to get the flag (it's only one :D)! | ||
| - | * You must create (hint: start from ''server.py'') / modify the ''~/auth-lab/mitm.py'' file and run it inside the container (with ''%%--mitm%%'' argument for the real case); | ||
| - | * The middle-man should listen on UDP on port ''1337''; | ||
| - | * You may also use a **debug mode** by supplying the ''%%--debug%%'' as first argument to the Docker image; find the logs inside ''/var/log/auth-lab.log''; | ||
| - | * //Start from the sample client & server sources and code your way to it!// | ||
| - | * //**Hint**: First, you should make sure that the MitM script routes messages correctly!// | ||
| - | |||
| - | <solution -hidden> | ||
| - | This is a starter implementation of a NO-OP MitM (note: all you'll see is encrypted messages!): | ||
| - | <code python> | ||
| - | # skeleton from server.py, replace server_port to 1337 + the following function: | ||
| - | def receive_func(sock): | ||
| - | while True: | ||
| - | data, from_addr = sock.recvfrom(PACKET_LENGTH) | ||
| - | packet_time = struct.unpack(">L", data[-4:])[0] | ||
| - | if not verify_time(packet_time): | ||
| - | send_func(sock, assemble_packet('MSG', 'ERROR'.encode(), False), from_addr) | ||
| - | |||
| - | packet_type = data[:3] # first 3 bytes | ||
| - | packet_data = data[3:-4] # the content | ||
| - | packet_type = packet_type.decode() | ||
| - | print("MITM: got packet", packet_type, packet_data) | ||
| - | |||
| - | if from_addr[1] == 1336: | ||
| - | send_func(sock, data, (host, 1338)) | ||
| - | elif from_addr[1] == 1338: | ||
| - | send_func(sock, data, (host, 1336)) | ||
| - | </code> | ||
| - | TODO: implement client + server branches in MitM to negociate separate D-H keys. | ||
| - | </solution> | ||
| - | |||
| - | ==== 02. Bonus: implement authentication ==== | ||
| - | |||
| - | * Start from the client & server samples and implement authentication to both peers (either symmetric or asymmetric -- RSA recommended); | ||
| - | * Since you cannot easily modify the container, use your own virtual environment (install ''py-diffie-hellman'' and ''pycryptodome'' using ''pip''); | ||
| - | |||