From aac11cd57047070e1723877bf074b8ed343c29b0 Mon Sep 17 00:00:00 2001 From: Rob Date: Sat, 26 Feb 2022 23:08:16 -0600 Subject: [PATCH] GeoIP database stuff --- README.md | 4 +++ package.json | 4 ++- scanner.js | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 91 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 03ef78d..5d8b47e 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,10 @@ Run `node ./scanner.js [options] --ip ` * `--max-players ` - Only show servers with max player count or below. * `--out ` - Output to CSV file (Can be opened as a spreadsheet in MS Office, Google Docs, etc.) * `--format ` - Output format (`txt-connect-only` for `ip:port` list format) +#### Geo Location +* `--geo-ip` - Use IP Geolocation database. +* `--geo-coords` - Add geo-coordinates to output. +* `--maxmind-key` - Provide a key for maxmind database download. ## By really fast, I mean really fast! # time node ./scanner.js --ip 135.148.60.0/24 --show-desc --quiet --out example.csv diff --git a/package.json b/package.json index eec6e79..aecfcf3 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,9 @@ "dependencies": { "commandos": "^0.10.1", "evilscan": "^1.8.1", + "maxmind": "^4.3.5", "minecraft-status": "^1.1.0", - "mineflayer": "^4.0.0" + "mineflayer": "^4.0.0", + "zlib": "^1.0.5" } } diff --git a/scanner.js b/scanner.js index da4ee1e..e7759ab 100644 --- a/scanner.js +++ b/scanner.js @@ -2,6 +2,7 @@ var Scanner = require('evilscan'); var status = require('minecraft-status').MinecraftServerListPing; var mc = require('mineflayer'); var fs = require('fs'); +var maxmind; //var mcClient = require('minecraft-protocol'); process.params = (require('commandos')).parse(process.argv); var MINECRAFT_DEFAULT_PORT = '25565-25566'; @@ -11,6 +12,49 @@ var SCAN_OPTS_PORTS = (process.params['port'] || MINECRAFT_DEFAULT_PORT).toStrin var SCAN_OPTS_OUTPUT_CSV = (process.params['out']||null); var CLIENT_TOKEN; +if(process.params['geo-ip']) +{ + if (!fs.existsSync("./GeoLite2.mmdb")) + { + if(!process.params['maxmind-key']) + { + return console.log("NO MAXMIND DOWNLOAD KEY WAS PROVIDED! CANNOT DOWNLOAD THE DATABASE WITHOUT A KEY!"); + } + //var file = fs.createWriteStream("./GeoLite2-City.tar"); + //https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key= + return require('https').get("https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key="+ process.params['maxmind-key'] +"&suffix=tar.gz", function(resp){ + const zlib = require('zlib'); + const tar = require('tar-stream'); + + const tarFile = fs.createWriteStream("./GeoLite2.tar"); + const dbfile = fs.createWriteStream('./GeoLite2.mmdb'); + resp.pipe(zlib.createGunzip()).pipe(tarFile); + + tarFile.on("close", function(){ + console.log("Wrote tar to disk. Extracting DB file..."); + var extract = tar.extract(); + extract.on('entry', function(header, stream, next){ + //console.log(header); + if (header.name.match(/.*?\.mmdb/)) + { + stream.pipe(dbfile); + dbfile.on('close', function(){ + fs.unlinkSync("./GeoLite2.tar"); + console.log("Extracted GeoIP database. Please rerun your scan to continue."); + return process.exit(0); + }) + } else { + return next(); + } + stream.resume(); + }); + fs.createReadStream("./GeoLite2.tar").pipe(extract); + }) + }); + } + maxmind = require('maxmind'); +} + if(process.params['quiet'] && !SCAN_OPTS_OUTPUT_CSV) { console.log("Error:\tYou have asked for --quiet output, but did not specify an --out file. This scan is pointless!\nRefusing to run a pointless operation."); @@ -94,11 +138,49 @@ scan.on('result', function(data){ default: line = data.ip + ":" + data.port + "," + pingRes.version.name.replace(/\,/g, '+') + "," + pingRes.players.online + "/" + pingRes.players.max + "\n"; } - fs.appendFileSync(SCAN_OPTS_OUTPUT_CSV, line); + if(process.params['geo-ip']) + { + maxmind.open('./GeoLite2.mmdb').then(function(geoip){ + var geoLoc = geoip.get(data.ip); + var geoText = geoLoc.country.iso_code; + if (process.params['geo-coords']) { + geoText += " (" + geoLoc.location.latitude + "," + geoLoc.location.longitude + ")"; + } + switch (process.params['format'] || 'csv') + { + case "txt": + line += " " + geoText; + case "csv": + line += "," + geoText; + default: + break; + } + fs.appendFileSync(SCAN_OPTS_OUTPUT_CSV, line); + }).catch(function(err){ + console.log(err); + }); + } else { + fs.appendFileSync(SCAN_OPTS_OUTPUT_CSV, line); + } } if(!process.params['quiet']) { - console.log(theText); + if (process.params['geo-ip']) + { + maxmind.open('./GeoLite2.mmdb').then(function (geoip) { + var geoLoc = geoip.get(data.ip); + var geoText = geoLoc.country.iso_code; + if(process.params['geo-coords']) + { + geoText += " (" + geoLoc.location.latitude + "," + geoLoc.location.longitude + ")"; + } + console.log("[" + geoText + "] " + theText); + }).catch(function (err) { + console.log(err); + }); + } else { + console.log(theText); + } } } if(process.params['enable-client'] && (CLIENT_TOKEN||process.params['client-token']))