Skip to content

Instantly share code, notes, and snippets.

@nstarke
Last active November 28, 2019 01:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nstarke/2e29b1c0bbc1030935804772b3e163ef to your computer and use it in GitHub Desktop.
Save nstarke/2e29b1c0bbc1030935804772b3e163ef to your computer and use it in GitHub Desktop.
Rsync Protocol Authentication flow in Python
#!/usr/bin/env python
from Crypto.Hash import MD4
import socket
import base64
import os
import random
import time
import sys
BUF_SIZE = 4096
HOST = sys.argv[1]
PORT = 873
USERNAME = "admin"
PASSWORD = "password"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send("@RSYNCD: 29\n")
print(s.recv(BUF_SIZE))
s.send("#list\n")
l = s.recv(BUF_SIZE).rstrip()
s.close()
# Second Connection
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, 873))
s.send("@RSYNCD: 29\n")
print(s.recv(BUF_SIZE))
s.send(l + "\n")
auth = s.recv(BUF_SIZE)
print(auth)
auth = auth.rstrip().split(' ')[2]
h = MD4.new("\x00" * 4) # Gag me with a giant spoon
h.update(PASSWORD)
h.update(auth)
digest = base64.b64encode(h.digest())
digest = digest.replace("=", "")
s.send(USERNAME + ' ' + digest + '\n')
print(s.recv(BUF_SIZE))
s.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment