local amqp = require "amqp"
local nmap = require "nmap"
local shortport = require "shortport"
local stdnse = require "stdnse"
description = [[
Gathers information (a list of all server properties) from an AMQP (advanced message queuing protocol) server.
See http://www.rabbitmq.com/extensions.html for details on the
server-properties
field.
]]
---
-- @usage
-- nmap --script amqp-info -p5672
---
-- @args amqp.version Can be used to specify the client version to use (currently, 0-8, 0-9 or 0-9-1)
--
-- @output
-- 5672/tcp open amqp
-- | amqp-info:
-- | capabilities:
-- | publisher_confirms: YES
-- | exchange_exchange_bindings: YES
-- | basic.nack: YES
-- | consumer_cancel_notify: YES
-- | copyright: Copyright (C) 2007-2011 VMware, Inc.
-- | information: Licensed under the MPL. See http://www.rabbitmq.com/
-- | platform: Erlang/OTP
-- | product: RabbitMQ
-- | version: 2.4.0
-- | mechanisms: PLAIN AMQPLAIN
-- |_ locales: en_US
author = "Sebastian Dragomir"
license = "Same as Nmap--See http://nmap.org/book/man-legal.html"
categories = {"default", "discovery", "safe", "version"}
portrule = shortport.port_or_service(5672, "amqp", "tcp", "open")
action = function(host, port)
local cli = amqp.AMQP:new( host.ip, port.number )
local status, data = cli:connect()
if not status then return "Unable to open connection: " .. data end
status, data = cli:handshake()
if not status then return data end
cli:disconnect()
port.version.name = "amqp"
port.version.product = cli:getServerProduct()
port.version.extrainfo = cli:getProtocolVersion()
port.version.version = cli:getServerVersion()
nmap.set_port_version(host, port, "hardmatched")
return stdnse.format_output(status, cli:getServerProperties())
end