From fd93f27c28744e45300264e555698c300b6579b8 Mon Sep 17 00:00:00 2001 From: dmiller Date: Fri, 9 Mar 2018 06:26:47 +0000 Subject: [PATCH] Correctly support IPv6 for bitcoin NSE scripts --- nselib/bitcoin.lua | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/nselib/bitcoin.lua b/nselib/bitcoin.lua index 15516e0e2..3344ba8d7 100644 --- a/nselib/bitcoin.lua +++ b/nselib/bitcoin.lua @@ -68,18 +68,22 @@ NetworkAddress = { assert(26 == #data, "Expected 26 bytes of data") local na = NetworkAddress:new() - local _ - _, na.service, na.ipv6_prefix, na.host, na.port = bin.unpack("IS", data) - na.host = ipOps.fromdword(na.host) + local ipv6_prefix, ipv4_addr + na.service, ipv6_prefix, ipv4_addr, na.port = string.unpack("I2", data) + if ipv6_prefix == "\0\0\0\0\0\0\0\0\0\0\xff\xff" then + -- IPv4 + na.host = ipOps.str_to_ip(ipv4_addr) + else + na.host = ipOps.str_to_ip(ipv6_prefix .. ipv4_addr) + end return na end, -- Converts the NetworkAddress instance to string -- @return data string containing the NetworkAddress instance __tostring = function(self) - local ipv6_prefix = "00 00 00 00 00 00 00 00 00 00 FF FF" - local ip = ipOps.todword(self.host) - return bin.pack("IS", self.service, ipv6_prefix, ip, self.port ) + local ipv6_addr = ipOps.ip_to_str(self.host) + return string.pack("I2", self.service, ipv6_addr, self.port ) end }