Skip to content

Commit

Permalink
spoof-host
Browse files Browse the repository at this point in the history
  • Loading branch information
zardus committed Feb 24, 2025
1 parent 69bb6e8 commit 0ce135d
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 0 deletions.
4 changes: 4 additions & 0 deletions intercepting-communication/module.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ challenges:
name: UDP
- id: udp-2
name: UDP 2
- id: udp-spoof-host
name: UDP 2
visibility:
start: "2029-11-04T13:00:00-07:00"
- id: level-12
name: ARP
- id: level-13
Expand Down
1 change: 1 addition & 0 deletions intercepting-communication/udp-spoof-host/.init
9 changes: 9 additions & 0 deletions intercepting-communication/udp-spoof-host/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Though we didn't explore this for TCP, in addition to selecting the destination port, both TCP and UDP can set their _source_ port.
We'll practice that here --- you can set the source port with `s.bind` on the socket, exactly how a server does it to set their listening port.
Read the source code of `/challenge/run` to see what source port you'll need!

----

**NOTE:**
You must set the source port _before_ sending data!
Otherwise, Linux will pick a random source port (the default behavior, when `bind` is not called).
43 changes: 43 additions & 0 deletions intercepting-communication/udp-spoof-host/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/usr/bin/exec-suid --real -- /usr/bin/python -I

import psutil
import socket
import os

from dojjail import Host, Network

flag = open("/flag").read()
parent_process = psutil.Process(os.getppid())

class ServerHost(Host):
def entrypoint(self):
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(("0.0.0.0", 31337))
while True:
try:
client_message, (client_host, client_port) = server_socket.recvfrom(1024)
if client_message.strip() == b"ACTION?":
server_socket.sendto(b"NONE", (client_host, client_port))
except ConnectionError:
continue

class ClientHost(Host):
def entrypoint(self):
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.bind(("0.0.0.0", 31338))
while True:
try:
server_socket.sendto(b"ACTION?", ("10.0.0.3", 31337))
message, (peer_host, peer_port) = server_socket.recvfrom(1024)
if peer_port == 31337 and message.strip() == b"FLAG":
print(f"YOUR FLAG: {flag}")
except ConnectionError:
continue

user_host = Host("ip-10-0-0-1", privileged_uid=parent_process.uids().effective)
client_host = ClientHost("ip-10-0-0-2")
server_host = ServerHost("ip-10-0-0-3")
network = Network(hosts={user_host: "10.0.0.1", client_host: "10.0.0.2", server_host: "10.0.0.3"}, subnet="10.0.0.0/24")
network.run()

user_host.interactive(environ=parent_process.environ())

0 comments on commit 0ce135d

Please sign in to comment.