如何在异常端口上运行 nmap HTTP 脚本

信息安全 网络扫描仪 地图
2021-08-30 02:02:39

如何让 nmap 在 HTTP 不常见的端口上运行 HTTP 脚本,比如 TCP 端口 123?在类似nmap -n --script="http* ..." -p123 targetnmap 的东西上,除了检查端口 123 是否打开并且没有针对该端口运行任何脚本外,什么都不做。(我用 nmap 的跟踪选项验证了这一点。)

是 HTTP 吗?版本扫描无法识别服务的性质,但指纹输出非常清楚:

==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port123-TCP:V=6.47%I=7%D=4/27%Time=553D8163%P=i686-pc-linux-gnu%r(Gener
SF:icLines,1BA,"HTTP/1\.1\x20400\x20Bad\x20request\r\nContent-Type:\x20tex
SF:t/html\r\n\r\n<!DOCTYPE\x20HTML\x20PUBLIC\x20\"-//W3C//DTD\x20HTML\x204
SF:\.01\x20Transitional//EN\"\x20\"http://www\.w3\.org/TR/html4/loose\.dtd
SF:\">\r\n<html><head><link\x20rel=\"stylesheet\"\x20href=\"/minishare\.cs
SF:s\"\x20type=\"text/css\"><title>400\x20Bad\x20request</title></head><bo
SF:dy><h1>400\x20Bad\x20request</h1></body><hr><p\x20class=\"versioninfo\"
[...]
4个回答

这里的其他答案非常好。但是,几种方法可以做你想做的是将无需编辑脚本的工作是什么:

  1. 你可以教 Nmap 识别这个服务。Nmap 的服务指纹在nmap-service-probes文件中。Nmap 已经通过这条匹配线识别了某些版本的 MiniShare,在 Nmap 6.00 中添加:

    match http m|^HTTP/1\.1 200 OK\r\nContent-Type: text/html\r\n\r\n.*<title>MiniShare</title>\r\n.*<td class=\"total\" colspan=\"2\">Total: (\d+) files</td><td class=\"totalsize\">([^<]+)</td></tr>\r\n</table>\r\n<hr><p class=\"versioninfo\"><a href=\"http://minishare\.sourceforge\.net/\">MiniShare ([\d.]+)</a>|s p/MiniShare http interface/ v/$3/ i/$1 files, $2 shared/ o/Windows/ cpe:/o:microsoft:windows/a
    

    但是您的服务响应略有不同,并且不匹配。按照 Nmap 提供的说明提交此服务指纹,以便其他用户受益。同时,您可以构建一个类似的匹配行,以便将服务标识为“http”,-sV并且脚本将运行。

  2. 作为一般规则,您可以尝试更新到新版本的 Nmap。在撰写本文时,6.47 是最新版本,因此这对您没有帮助,但它可能会帮助稍后阅读此答案的人。

  3. 您可以通过在脚本名称前加上“+”来强制 NSE 脚本针对所有打开的端口运行。例如,--script +http-title将尝试请求一个页面并检索目标上每个打开服务的标题。这可能是危险缓慢的,因为脚本不是针对任意服务运行而编写的,并且可能会超时或使目标服务崩溃。

最后一个警告:请求--script http*将尝试运行许多您可能不想要的脚本,包括(在开发版本中):23 个“exploit”、1 个“dos”(拒绝服务)、51 个“侵入式”和 10 个“外部”类别脚本。指定这一点的更好方法是--script "http* and safe"--script "http* and default"

只需在脚本名称前使用 + 字符即可强制执行脚本。强调我的:

有两个特殊功能仅供高级用户使用。一种是在 脚本名称和表达式前面加上 + 前缀,以强制它们运行,即使它们通常不会运行(例如,在目标端口上未检测到相关服务)。另一个是参数 all 可用于指定 Nmap 数据库中的每个脚本。对此要小心,因为 NSE 包含危险脚本,例如漏洞利用、暴力验证破解程序和拒绝服务攻击。

所以如果我运行命令

# nmap 127.0.0.1 -p 22 --script=+http-title.nse -d

这将强制“http-title”脚本在端口 22 上运行:

NSE: Starting runlevel 1 (of 1) scan.
NSE: Starting http-title against 127.0.0.1:22.
Initiating NSE at 14:14
NSE: Finished http-title against 127.0.0.1:22.
Completed NSE at 14:14, 0.03s elapsed
Nmap scan report for localhost (127.0.0.1)
Host is up, received localhost-response (0.000089s latency).
Scanned at 2015-04-28 14:14:07 BST for 0s
PORT   STATE SERVICE REASON
22/tcp open  ssh     syn-ack
Final times for host: srtt: 89 rttvar: 5000  to: 100000

在您上次的测试结果中,问号(“ntp?”而不是“ntp”)表示 nmap 无法识别正在运行的服务。因此,他猜测 NTP 仅依赖于通常与此端口号相关联的那种服务,但根本没有任何信心(因此是问号)。

此服务发送的标头非常简约:

HTTP/1\.1 400 Bad request
Content-Type: text/html

就是这样。在真正的 Web 服务器上,您会发现一堆标有日期、服务器名称、缓存参数等的标头。这里,什么都没有。

我的猜测是,您因此面临的不是一个成熟的 Web 服务器,而是:

  • 专门设计的 Web 服务器,例如嵌入在某些设备中的远程管理界面,
  • 一个混淆的网络服务器(在我们在下面的评论中讨论之后),
  • 另一个依赖 HTTP 协议的服务(Web 服务、WebDav 服务器等)在这种情况下尝试其他 HTTP 请求而不是通常的 GET 可能会触发有趣的行为。

编辑

为了更准确地回答您的问题,Nmap 是一个通用工具,它的脚本主要用于针对非混淆服务器,作为获取基本信息的简单方法。

在这里,管理员做了特别的努力来混淆他的服务器,目的是为了隐藏这些通用工具所需的信息。因此,需要更进一步,使用更具体的工具。

从技术角度来看,nmap 脚本被设计为仅在必要时运行。HTTP 相关脚本只有在服务被 nmap 识别为 HTTP 时才会执行。这是通过portrule=您将在脚本开头找到的语句完成的,这里有一些来自随机 HTTP nmap 脚本的示例:

portrule = shortport.http    
portrule = shortport.port_or_service( {80, 443}, {"http", "https"}, "tcp", "open")


 例如,一种肮脏的方式是编辑这些脚本以强制执行它们……但不能保证结果。更好地为正确的任务使用正确的工具。

这与直接在浏览器中点击端口给您的结果相同,它是一个文本/html 文档!带有样式表和 400 状态码,通过 HTTP 1.1 传输。

400 Bad Request
    The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing)

如果您想了解有关它正在运行的更多信息,我会直接使用浏览器去那里,看看您可以看到哪些其他信息。也许就在你剪断它之后

class="versioninfo

您可以从这里运行很多 HTTP 脚本,具体取决于您想要获取的有关 Web 服务器的信息,格式如下:

nmap --script http-enum -p 123 x.x.x.x

来源:https ://nmap.org/nsedoc/scripts/http-enum.html

编辑:鉴于它引用 minishare.css 样式表,你可能想开始找出它是否是这样的:http: //minishare.sourceforge.net