Quét cổng mạng siêu nhanh với evilscan – node.js

8.462 views

Quét cổng (port scanning) là công việc thường xuyên của người quản trị mạng, web developer và hacker dù là mũ trắng hay đen. node.js cùng với cơ chế vòng lặp sự kiện là môi trường cũng như công cụ hoàn hảo để lập trình ứng dụng mạng nhanh, mạnh.

Hôm nay VietJS giới thiệu với các bạn bộ thư viện evilscan quét cổng cực nhanh và mạnh cho node.js.

evilscan hỗ trợ sử dụng dưới dạng module cho node.js hoặc chạy độc lập, các chức năng bao gồm

  • quét một IP hoặc dãy IP. Ví dụ: 172.16.0.1, 172.16.0.1-172.16.0.255, 172.16.0.0/16
  • quét một cổng, nhiều cổng, dãy cổng. Ví dụ: 22, 20-22
  • đọc biểu ngữ của cổng. Ví dụ: khi scan port 22 của Ubuntu server sẽ trả về biểu ngữ OpenSSH_5.9p1 Debian-5ubuntu1.1
  • IAC negotiation (?)
  • truy ngược domain từ một IP (reverse dns lookup)
  • truy ngược thông tin định vị của IP (geolocation)

Sử dụng evilscan như ứng dụng độc lập

# cài đặt evilscan toàn cục (-g)
npm install -g evilscan

# xem hướng dẫn sử dụng
evilscan --help

# scan toàn bộ port trong mạng LAN với dãy IP 192.168.0.0/24 và in ra biểu ngữ
evilscan 172.16.0.0/24 --port=0-65535 --banner

Sử dụng evilscan dưới dạng module

Để hiểu cách sử dụng evilscan dưới dạng module, cách tốt nhất chúng ta sẽ viết ứng dụng API scan port đơn giản

Mã nguồn: http://github.com/vietjs/port-scanner

Demo: http://port-scanner.herokuapp.com/port/scan?ip=74.125.225.167&port=80

Thực hiện

  • Tạo thư mục chứa mã nguồn dự án
mkdir port-scanner
  • Khởi tạo node.js project tại thư mục vừa tạo
cd port-scanner
npm init
  • Download module express, evilscan và ghi thông tin phụ thuộc vô file package.json (–save), sử dụng express để đơn giản hóa việc xử lý truy vấn HTTP
npm install express evilscan --save
  • Tạo file index.js và viết code cho ứng dụng

index.js

// khai báo require module evilscan
var evilscan = require('evilscan')
// khai báo require module express
,   express = require('express');

// khởi tạo ứng dụng express
var app = express();

// ứng dụng port-scanning tự giới thiệu về mình
app.get('/', function(req, res){
  res.send('<h1>Tui tên là port-scanning.<br>'+
    'Tui chạy rất nhanh và rất nguy hiểm.<br>'+
    '<a href="http://vietjs.com/?p=9">http://vietjs.com/2014/06/01/quet-cong-mang-sieu-nhanh-su-dung-node-js/</a></h1>');
});

// ứng dụng port-scanning làm việc
app.get('/port/scan', function (req, res) {
  var ips = req.query.ip
  ,   ports = req.query.port
  ,   options = {}
  ,   results = [];

  // kiểm tra lỗi và trả về thông báo khi thiếu thông tin
  if (!ips || !ports) {
    res.send(400, 'Missing ip or port params. Correctly URL is /port/scan?ip=192.168.0.1&port=22');
    return;
  }

  // khai báo options cho evilscan
  // xem thông tin đầy đủ tại https://github.com/eviltik/evilscan
  options = {
    target: ips, // địa chỉ IP, dãy IP
    port: ports, // cổng
    status:'TROU', // ?
    banner: true, // hiển thị biểu ngữ của cổng kết nối
    concurrency: 255, // số lượng kết nối đồng thời
    timeout: 2000, // thời gian chờ kết nối (ms)
    geo: true, // xác định vị trí địa lý của địa chỉ IP
    reverse: true // hiển thị thông tin reverse dns
  };;

  // khởi tạo evilscan scanner
  var scanner = new evilscan(options, function () {
    // khởi tạo xong scanner
  });

  // khi quét có kết quả, lưu kết quả vào biến results
  scanner.on('result', function (data) {
    results.push(data);
  });

  // khi có lỗi, trả về thông báo lỗi
  scanner.on('error', function (err) {
    res.send(500, 'evilscan error: ' + err);
  });

  // khi quét xong, kết thúc xử lý cho truy vấn này và trả về kết quả
  scanner.on('done', function () {
    res.send(results);
  });

  // chạy evilscan scanner
  scanner.run();
});

var HTTP_PORT = process.env.PORT || 3000;
app.listen(HTTP_PORT);
console.log('port-scanning application listening at 0.0.0.0:' + HTTP_PORT);
  • Chạy ứng dụng

node index.js