Nodejs 抓取 TCP 端口 banner,支持 tls

Nodejs 抓取 TCP 端口 banner,支持 tls

写了一个扫描 banner 的工具,其实就是个极简版的 zgrab 。

zgrab 每个探针返回的数据 schema 都不一样,而且默认的 JSON 编码对二进制非常不友好,遇上蛋疼的 python 2 不停地报 UnicodeError 。怒而造了个轮子。目前只实现了直接回显(如 Telnet, SSH, 和 FTP ),带 payload (如 http ), tls (如 IMAPS 和 https )的情况,其实可以涵盖绝大多数抓 TCP 服务 banner 的场景了。

https://github.com/ChiChou/grab.js/blob/master/lib/index.js

调用:

const grabber = require('grab.js');
grabber.grab(ip, port)
  .payload(new Buffer('ping'))
  .run()
  .then(result => { /* 在这里读取 result.banner ,如为 tls 还会返回证书信息 */ })
  .catch(err => { /* 超时、目标不可达等错误 */ })

由于 http 探针需要设置 Host 头,所以接下来打算给 payload 增加字符串模板字段。

不支持 udp 协议,因为 udp 在 zmap 的探针里自带了 banner 功能。 zgrab 还支持一些工控协议,由于懒癌晚期,加上对我没太大用处,不打算做了。

与 zmap 组合,运行效果如下(在 Linux 下需要 sudo ):


6 回复

话说 node 4.0 支持 arrow function 和 class 语法么


最新版的 4.x 应该是支持的吧

zmap masscan 本身就支持部分端口 banner 的提取,其中就包括 ssh 。。。

支持的

我已经吐槽了 zgrab 的问题才自己写的哦

要在 Node.js 中抓取 TCP 端口的 banner 信息,并支持 TLS(即加密的 TCP 连接),你可以使用内置的 nettls 模块。以下是一个简单的示例代码,展示了如何实现这一功能:

const net = require('net');
const tls = require('tls');

async function getBanner(host, port, useTLS = false) {
    return new Promise((resolve, reject) => {
        const client = useTLS ? tls.connect({ host, port }) : net.connect({ host, port });

        client.on('data', (data) => {
            const banner = data.toString();
            client.destroy();
            resolve(banner);
        });

        client.on('error', (err) => {
            reject(err);
        });

        client.on('close', () => {
            console.log('Connection closed');
        });
    });
}

// 使用示例
const host = 'example.com';
const port = 443; // 通常 HTTPS 使用 443 端口

getBanner(host, port, true) // 设置为 true 以使用 TLS
    .then(banner => console.log(`Banner: ${banner}`))
    .catch(err => console.error(`Error: ${err.message}`));

上述代码定义了一个 getBanner 函数,该函数接受主机名、端口号和是否使用 TLS 作为参数。它返回一个 Promise,该 Promise 解析为抓取到的 banner 信息或在出错时拒绝。通过传递 trueuseTLS 参数,可以启用 TLS 支持。示例展示了如何连接到 example.com 的 443 端口(HTTPS)并抓取 banner 信息。

回到顶部