rodrigoborgessss/portscan
GitHub: rodrigoborgessss/portscan
一款基于 Node.js 的全连接端口扫描器,集服务检测、存活主机发现、本地绑定审计和实时 Web 仪表盘于一体,用于授权环境下的网络侦察与安全审计。
Stars: 0 | Forks: 0
# 端口扫描
TCP **connect** 端口扫描器,具备服务检测功能(类似 `nmap -sV`)、HTTP/TLS 指纹识别、IP 段扫描以及 **live-hosts finder**。提供可重用的引擎、CLI 界面以及 Web dashboard(Node.js + Express + vanilla 前端)。
## 目录结构
```
portscan/
├── bin/
│ └── portscan.js # CLI (entry point)
├── src/
│ ├── scanner.js # motor: scanPort, scanHost, scanTargets, descoberta, sweep
│ ├── probes.js # deteção de serviço por probe ativo (NULL, HTTP, Redis, …)
│ ├── enrich.js # fingerprint HTTP (tech/versões/título) + certificado TLS
│ ├── discover.js # ICMP ping (via comando do sistema, cross-platform)
│ ├── bindaudit.js # leitura do bind address real (netstat/ss) + exposição
│ ├── targets.js # expansão de alvos (IP, hostname, CIDR, range)
│ ├── ports.js # mapa porta→serviço, "top ports", parser de specs
│ └── server.js # API Express + Server-Sent Events
├── public/
│ └── index.html # dashboard web
├── index.js # API programática (require('portscan'))
├── package.json
├── CHANGELOG.md
└── LICENSE
```
## 工作原理
**Connect scan** — 通过 `net.Socket` 进行 TCP 握手,无需 root 权限或 raw sockets。状态分为 `open` / `closed` (RST) / `filtered` (timeout)。
**服务检测 (`-sV`)** — 在每个开放端口上执行:探测 NULL(获取 SSH/FTP/SMTP/MySQL... 的 banner)、特定探测(Redis, Memcached)以及 HTTP。随后进行信息丰富:
- **HTTP** → 服务器类型、`X-Powered-By`、`X-AspNet-Version`、标题以及技术栈(IIS, nginx, Apache, ASP.NET, PHP, Express, WordPress, Drupal, Laravel, CDN...)。
- **TLS** → 证书(subject, SANs, 有效期 + 剩余天数、issuer、证书链)、self-signed/过期情况、协议及加密套件。当目标为 hostname 时使用 SNI。
**IP 段** — CIDR (`192.168.1.0/24`)、range (`10.0.0.1-50`)、列表或单个 host。
**Live-hosts finder** — 通过 TCP-ping、ICMP(系统自带的 `ping`)或两者结合进行并行发现。`--sweep` 模式仅列出存活主机。在 `both` 方法中,TCP 优先运行,ICMP 仅对未探测到的主机执行(确保 `both` ≥ `tcp`)。
## 安装说明
```
npm install
```
## CLI
```
node bin/portscan.js [opções]
# 或者,在 `npm link` 之后: portscan <目标> [选项]
-p, --ports top | all | 22 | 22,80,443 | 1-1024 (default: top)
-t, --timeout timeout por porta (default: 1500)
-c, --concurrency sockets em paralelo (default: 200)
-b, --banner lê o banner das portas abertas
-sV, --service deteção de serviço + fingerprint HTTP/TLS
--bind bind address real (local/exposto) — só para localhost
--discover descoberta de hosts antes do scan
--icmp descoberta ICMP + TCP (mais cobertura)
--method método de descoberta: tcp | icmp | both
--sweep SÓ descobrir hosts vivos (live-hosts finder)
--json saída em JSON
--csv saída em CSV
--xml saída em XML (formato nmap)
--no-adaptive desliga o scan em 2 fases
-o, --out grava a saída (json/csv/xml) num ficheiro
```
示例:
```
node bin/portscan.js 192.168.1.0/24 --sweep --method both # hosts vivos na LAN
node bin/portscan.js scanme.nmap.org -sV # serviço + HTTP/TLS
node bin/portscan.js exemplo.pt -p 80,443 -sV # tech stack + certificado
node bin/portscan.js 127.0.0.1 -p all --bind # o que está exposto vs local
node bin/portscan.js 10.0.0.10 -p top -sV --csv -o scan.csv # exportar para CSV
```
### Bind 审计 (`--bind`)
仅在目标为**本机**时生效(通过 `netstat`/`ss` 读取本地监听进程)。针对每个开放端口,它会显示服务是 `local`(仅限 127.0.0.1)、`exposed`(0.0.0.0 — 网络内可见)还是绑定到特定的 `interface`,并附带进程名称。这对于审计你的机器向网络暴露的内容非常有用。
## Web dashboard
```
npm start # http://localhost:3000
```
可配置目标、端口、timeout、并发数和发现方法;包含服务、banner、发现以及“仅存活主机”的复选框。支持流式传输 (SSE),在扫描 IP 段时带有主机列,每个端口下方显示技术栈/证书标签,并在 sweep 模式下列出存活主机列表。Web 模式限制:最多 512 个主机和 40 万次探测;如果超过此限制,请使用 CLI。
## 作为库使用
```
const { scanTargets, expandTargets, parsePorts } = require('portscan');
const out = await scanTargets(
expandTargets('192.168.1.0/24'),
parsePorts('top'),
{ detectService: true, discover: true, discoverMethod: 'both' },
{ onHostDone: (h) => console.log(h.host, h.openCount) }
);
```
### 性能
在 connect scan 中,关闭的端口会立即返回 RST,但**被过滤**(firewall 执行 drop)的端口只能在 timeout 结束时才能确定状态。如果一台主机的 firewall 过滤了数千个端口,扫描过程本质上会很慢。主要优化手段:
- **并发数** (`-c`) 是最大的影响因素 — 默认值为 300;在局域网 (LAN) 中设置为 500–800 是安全的。
- **Timeout** (`-t`) — 在局域网 (LAN) 中 400–600ms 就足够了;1500ms 则显得过长。
- **自适应扫描**(默认开启)允许使用较短的 timeout 而不会遗漏响应缓慢的开放端口,它仅会对被过滤的端口进行重新测试。
如果针对过滤端口的主机执行 `all`(65535 个端口)扫描,可能仍需要几分钟 — 建议使用 `top` 或较小的 range 以便快速进行侦察。
## 使用说明
请仅对你**拥有**的系统,或你具有**明确书面授权**的系统进行扫描。未经授权的端口扫描可能违反法律(在葡萄牙,即《网络犯罪法》 — Lei n.º 109/2009)以及网络服务提供商的条款。`scanme.nmap.org` 是 Nmap 项目提供的用于测试扫描器的公开目标。
标签:GNU通用公共许可证, MITM代理, Node.js, Web仪表盘, 云存储安全, 插件系统, 数据统计, 端口扫描, 网络扫描, 自定义脚本