From 5e66513527e915cc5f3f238ee6c7fb32878bad52 Mon Sep 17 00:00:00 2001 From: OperKH Date: Sun, 10 Nov 2019 20:42:45 +0200 Subject: [PATCH 1/2] Complete port-sniffer homework --- submissions/OperKH/port-sniffer/sniffer.js | 129 +++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 submissions/OperKH/port-sniffer/sniffer.js diff --git a/submissions/OperKH/port-sniffer/sniffer.js b/submissions/OperKH/port-sniffer/sniffer.js new file mode 100644 index 0000000..a280f04 --- /dev/null +++ b/submissions/OperKH/port-sniffer/sniffer.js @@ -0,0 +1,129 @@ +const net = require('net'); + +function printFatal (message) { + process.stdout.write(message); + process.exit(1); +} + +function printSuccess (message) { + process.stdout.write(message); + process.exit(0); +} + +function getParamsFromArguments () { + if (process.argv.includes('--help')) { + printSuccessHelp(); + } + if (!process.argv.includes('--host')) { + printFatal('Host is required, e.g. "--host 8.8.8.8"'); + } + return process.argv + .slice(2) + .join(' ') + .split(/\s?--/) + .reduce(function (acc, str) { + if (!str) return acc; + const [key, value] = str.split(' '); + switch (key) { + case 'help': + break; + case 'host': + if (!value) { + printFatal('Host value must be provided, e.g. "--host 8.8.8.8"'); + } + acc[key] = value; + break; + case 'ports': + if (!value) { + printFatal('Ports value must be provided, e.g. "--ports 300-1024"'); + } + if (!value.includes('-')) { + printFatal('Ports format invalid, must be e.g. "--ports 300-1024"'); + } else { + const [startPort, endPort] = value.split('-').map(port => parseInt(port, 10)); + if (isNaN(startPort) || startPort < 0) { + printFatal('Start port format invalid'); + } + if (isNaN(endPort) || endPort < 0) { + printFatal('End port format invalid'); + } + if (endPort > 65535) { + printFatal('End port must be between 0-65535'); + } + if (startPort > endPort) { + printFatal('End port must be bigger then start port'); + } + acc.startPort = startPort; + acc.endPort = endPort; + } + break; + default: + acc[key] = value; + } + return acc; + }, {}); +} + +function printSuccessHelp () { + printSuccess(`NAME + TCP sniffer - scans open ports on specific host. + +OPTIONS + --help + Output a usage message and exit. + + --host + Set a host for scan. + E.g. "--host 127.0.0.1". + + --ports + Set ports to scan. + E.g. "--ports 300-1024". + Default values: 0-65535. + +EXAMPLES + node sniffer.js --host localhost + node sniffer.js --host localhost --ports 300-1024 +`); +} + +function sniffConnectionAvailabilityAsync (port, host) { + return new Promise(function (resolve, reject) { + const socket = new net.Socket(); + socket.setTimeout(300); + + socket.on('connect', function () { + socket.destroy(); + resolve(); + }); + socket.on('timeout', function () { + socket.destroy(); + reject(new Error('timeout')); + }); + socket.on('error', function (err) { + socket.destroy(); + reject(err); + }); + + socket.connect(port, host); + }); +} + +async function scanAsync (host, port, portLimit, availablePorts = []) { + if (port > portLimit) { + return availablePorts; + } + try { + await sniffConnectionAvailabilityAsync(port, host); + process.stdout.write('.'); + availablePorts.push(port); + } catch (e) {} + return scanAsync(host, port + 1, portLimit, availablePorts); +} + +(async function () { + const { host, startPort = 0, endPort = 65535 } = getParamsFromArguments(); + const openedPorts = await scanAsync(host, startPort, endPort); + const result = openedPorts.length ? `\n${openedPorts.join(',')} ports are opened` : `\nNo open ports on host: ${host}`; + printSuccess(result); +})(); From 551eeabda076e73787d80f35664a98a54f67c8a5 Mon Sep 17 00:00:00 2001 From: OperKH Date: Tue, 12 Nov 2019 15:52:39 +0200 Subject: [PATCH 2/2] Add requested changes --- submissions/OperKH/port-sniffer/sniffer.js | 103 +++++++++++---------- 1 file changed, 53 insertions(+), 50 deletions(-) diff --git a/submissions/OperKH/port-sniffer/sniffer.js b/submissions/OperKH/port-sniffer/sniffer.js index a280f04..9860f3e 100644 --- a/submissions/OperKH/port-sniffer/sniffer.js +++ b/submissions/OperKH/port-sniffer/sniffer.js @@ -11,12 +11,6 @@ function printSuccess (message) { } function getParamsFromArguments () { - if (process.argv.includes('--help')) { - printSuccessHelp(); - } - if (!process.argv.includes('--host')) { - printFatal('Host is required, e.g. "--host 8.8.8.8"'); - } return process.argv .slice(2) .join(' ') @@ -24,46 +18,52 @@ function getParamsFromArguments () { .reduce(function (acc, str) { if (!str) return acc; const [key, value] = str.split(' '); - switch (key) { - case 'help': - break; - case 'host': - if (!value) { - printFatal('Host value must be provided, e.g. "--host 8.8.8.8"'); - } - acc[key] = value; - break; - case 'ports': - if (!value) { - printFatal('Ports value must be provided, e.g. "--ports 300-1024"'); - } - if (!value.includes('-')) { - printFatal('Ports format invalid, must be e.g. "--ports 300-1024"'); - } else { - const [startPort, endPort] = value.split('-').map(port => parseInt(port, 10)); - if (isNaN(startPort) || startPort < 0) { - printFatal('Start port format invalid'); - } - if (isNaN(endPort) || endPort < 0) { - printFatal('End port format invalid'); - } - if (endPort > 65535) { - printFatal('End port must be between 0-65535'); - } - if (startPort > endPort) { - printFatal('End port must be bigger then start port'); - } - acc.startPort = startPort; - acc.endPort = endPort; - } - break; - default: - acc[key] = value; + + if (key === 'ports' && value) { + acc.ports = value.split('-').map(port => parseInt(port, 10)); + } else { + acc[key] = value; } + return acc; }, {}); } +function validateParams (params) { + if (Object.hasOwnProperty.call(params, 'help')) { + printSuccessHelp(); + } + + if (!Object.hasOwnProperty.call(params, 'host')) { + printFatal('Host is required, e.g. "--host 8.8.8.8"'); + } + if (!params.host) { + printFatal('Host value must be provided, e.g. "--host 8.8.8.8"'); + } + + if (Object.hasOwnProperty.call(params, 'ports')) { + if (!params.ports) { + printFatal('Ports value must be provided, e.g. "--ports 300-1024"'); + } + if (!Array.isArray(params.ports) || params.ports.length !== 2) { + printFatal('Ports format invalid, must be e.g. "--ports 300-1024"'); + } + const [startPort, endPort] = params.ports; + if (isNaN(startPort) || startPort < 0) { + printFatal('Start port format invalid'); + } + if (isNaN(endPort) || endPort < 0) { + printFatal('End port format invalid'); + } + if (endPort > 65535) { + printFatal('End port must be between 0-65535'); + } + if (startPort > endPort) { + printFatal('End port must be bigger then start port'); + } + } +} + function printSuccessHelp () { printSuccess(`NAME TCP sniffer - scans open ports on specific host. @@ -88,21 +88,21 @@ EXAMPLES } function sniffConnectionAvailabilityAsync (port, host) { - return new Promise(function (resolve, reject) { + return new Promise(function (resolve) { const socket = new net.Socket(); socket.setTimeout(300); socket.on('connect', function () { socket.destroy(); - resolve(); + resolve(true); }); socket.on('timeout', function () { socket.destroy(); - reject(new Error('timeout')); + resolve(false); }); - socket.on('error', function (err) { + socket.on('error', function () { socket.destroy(); - reject(err); + resolve(false); }); socket.connect(port, host); @@ -113,16 +113,19 @@ async function scanAsync (host, port, portLimit, availablePorts = []) { if (port > portLimit) { return availablePorts; } - try { - await sniffConnectionAvailabilityAsync(port, host); + const isPortOpen = await sniffConnectionAvailabilityAsync(port, host); + if (isPortOpen) { process.stdout.write('.'); availablePorts.push(port); - } catch (e) {} + } return scanAsync(host, port + 1, portLimit, availablePorts); } (async function () { - const { host, startPort = 0, endPort = 65535 } = getParamsFromArguments(); + const params = getParamsFromArguments(); + validateParams(params); + const { host, ports = [] } = params; + const [startPort = 0, endPort = 65535] = ports; const openedPorts = await scanAsync(host, startPort, endPort); const result = openedPorts.length ? `\n${openedPorts.join(',')} ports are opened` : `\nNo open ports on host: ${host}`; printSuccess(result);