NTP时间欺骗

3

我正在尝试向Windows机器发送伪造时间,当它从NTP服务器请求时间时。

到目前为止,我的服务器将显示数据包并发送回数据,但是我似乎无法弄清楚我需要发送什么来给Windows一个虚假的时间。我尝试捕获合法的数据包进行发送,但失败了。

在这个例子中,我只发送空格,我正在尝试找出要发送的数据,告诉计算机例如时间是上午10点,实际上是下午12点。

我打算欺骗LAN上的DNS查询,将它们重定向到这个服务器,该服务器将响应不正确的时间。

我听说可以做到这一点,但从未见过工具来完成这个任务,所以现在我正在尝试做到这一点。

require 'socket'

class UDPServer
  def initialize(port)
    @port = port
  end

    def start
    @socket = UDPSocket.new
    @socket.bind('', @port) 
    data = " "
    while true
      packet = @socket.recvfrom(1024)
      puts packet
      @socket.send("${data}", 0, '10.0.0.16', "#{@port}")
    end
  end
end

server = UDPServer.new(123)
server.start

4
有趣的问题让我钻研了SNTP协议和数据报等内容,已经陷入了两个小时的兔子洞。简单回答是我认为你无法这样做,因为整个网络时间服务器网络都是自我校正的。伪造的数据包除非完全孤立,否则会被过滤掉。 - Dave Sag
我可以看出这种方法可能被用于恶意企图破坏或损坏系统服务,但我无法看到尝试这样做的好理由。如果您需要更改服务器所看到的时间,则设置其LOCALE或时区信息似乎是更好的选择。 - the Tin Man
@the Tin Man 在互联网上进行欺骗将会很困难,因为您需要欺骗源地址,而ISP使用uRPF(请参见https://www.rfc-editor.org/rfc/rfc3704.html)(除其他原因外)。在实验室中欺骗的原因是为了测试闰秒和其他问题,例如测试解决约34年问题的方法(新时钟芯片位于1970年,因此“原始”/旧的ntp在2004年后通常无法设置它)。 - Andrew
1个回答

0

这是可以做到的。您需要回复客户的请求。在回复中,您需要使用以下代码(您的代码目前还没有实现):

T1 = client timestamp at time of departure of request packet from client
and
T2 = server timestamp at time of ARRIVAL of request packet at server
and
T3 = server timestamp at time of departure of REPLY packet from server (ca be thee same s T2).

我在你的代码中没有看到这样做。此外,数据包的其余部分需要是“OK”——不确定你的是否是(似乎不是)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接