149 lines
6.8 KiB
JavaScript
149 lines
6.8 KiB
JavaScript
process.env.UV_THREADPOOL_SIZE = 128;
|
|
const dns = require('dns');
|
|
const url = require('url');
|
|
const yaml = require('js-yaml');
|
|
const fs = require('fs');
|
|
const request = require("request");
|
|
const shuffle = require('shuffle-array');
|
|
const config = require('./config');
|
|
|
|
let scams = yaml.safeLoad(fs.readFileSync('_data/scams.yaml'));
|
|
let urlscan_timeout = 0;
|
|
let scams_checked = 0;
|
|
let requests_pending = 0;
|
|
let new_cache = {
|
|
'scams': [],
|
|
'legiturls': [],
|
|
'blacklist': [],
|
|
'addresses': {},
|
|
'ips': {},
|
|
'whitelist': [],
|
|
'updated': (new Date()).getTime()
|
|
};
|
|
|
|
if (!fs.existsSync('_cache')) {
|
|
fs.mkdirSync('_cache');
|
|
}
|
|
|
|
yaml.safeLoad(fs.readFileSync('_data/legit_urls.yaml')).sort(function(a, b) {
|
|
return a.name - b.name;
|
|
}).forEach(function(legit_url) {
|
|
new_cache.legiturls.push(legit_url);
|
|
new_cache.whitelist.push(url.parse(legit_url.url).hostname.replace("www.", ""));
|
|
new_cache.whitelist.push('www.' + url.parse(legit_url.url).hostname.replace("www.", ""));
|
|
});
|
|
setInterval(function() {
|
|
console.log(scams_checked + '/' + scams.length + ' (' + requests_pending + ' requests pending)');
|
|
}, 1000);
|
|
scams.forEach(function(scam, index) {
|
|
if ('url' in scam) {
|
|
if (!scam.url.includes('http://') && !scam.url.includes('https://')) {
|
|
console.log('Warning! Entry ' + scam.id + ' has no protocol (http or https) specified. Please update!');
|
|
scam.url = 'http://' + scam.url;
|
|
}
|
|
var scam_details = new_cache.scams[new_cache.scams.push(scam) - 1];
|
|
new_cache.blacklist.push(url.parse(scam.url).hostname.replace("www.", ""));
|
|
new_cache.blacklist.push('www.' + url.parse(scam.url).hostname.replace("www.", ""));
|
|
dns.lookup(url.parse(scam.url).hostname, (err, address, family) => {
|
|
if (!err) {
|
|
scam_details.ip = address;
|
|
}
|
|
dns.resolveNs(url.parse(scam.url).hostname, (err, addresses) => {
|
|
if (!err) {
|
|
scam_details.nameservers = addresses;
|
|
}
|
|
requests_pending++;
|
|
var r = request(scam.url, {timeout: 5*60*1000}, function(e, response, body) {
|
|
requests_pending--;
|
|
if (e || !([200, 301, 302].includes(response.statusCode))) {
|
|
scam_details.status = 'Offline';
|
|
} else if (r.uri.href.indexOf('cgi-sys/suspendedpage.cgi') !== -1) {
|
|
scam_details.status = 'Suspended';
|
|
} else {
|
|
if ('subcategory' in scam && scam.subcategory == 'MyEtherWallet') {
|
|
requests_pending++;
|
|
request('http://' + url.parse(scam.url).hostname.replace("www.", "") + '/js/etherwallet-static.min.js', {timeout: 5*60*1000}, function(e, response, body) {
|
|
requests_pending--;
|
|
if (!e && response.statusCode == 200) {
|
|
scam_details.status = 'Active';
|
|
} else {
|
|
scam_details.status = 'Inactive';
|
|
}
|
|
});
|
|
} else if ('subcategory' in scam && scam.subcategory == 'MyCrypto') {
|
|
requests_pending++;
|
|
request('http://' + url.parse(scam.url).hostname.replace("www.", "") + '/js/mycrypto-static.min.js', {timeout: 5*60*1000}, function(e, response, body) {
|
|
requests_pending--;
|
|
if (!e && response.statusCode == 200) {
|
|
scam_details.status = 'Active';
|
|
} else {
|
|
scam_details.status = 'Inactive';
|
|
}
|
|
});
|
|
} else if (body == '') {
|
|
scam_details.status = 'Inactive';
|
|
} else {
|
|
scam_details.status = 'Active';
|
|
}
|
|
}
|
|
/*if(scam_details.status != 'Offline' && 'Urlscan_API_Key' in config) {
|
|
urlscan_timeout++;
|
|
setTimeout(function() {
|
|
request('https://urlscan.io/api/v1/scan/', { method: 'POST', json: { 'url': scam.url, 'public': 'off' }, headers: { 'API-Key': config.Urlscan_API_Key }}, function(err,response,body) {
|
|
if(err || response.statusCode != 200) {
|
|
console.log(err);
|
|
console.log('Status code: ' + response.statusCode);
|
|
} else if(body.message != 'Submission successful' || !('api' in body)) {
|
|
console.log(body.message);
|
|
} else {
|
|
setTimeout(function() {
|
|
request(body.api, { method: 'POST', json: { 'url': scam.api, 'public': 'off' }, headers: { 'API-Key': config.Urlscan_API_Key }}, function(err,response,body) {
|
|
if(err || response.statusCode != 200) {
|
|
console.log(err);
|
|
console.log('Status code: ' + response.statusCode);
|
|
} else {
|
|
console.log(body);
|
|
}
|
|
});
|
|
}, 2000);
|
|
}
|
|
});
|
|
}, urlscan_timeout * 8000);
|
|
}*/
|
|
if ('ip' in scam_details) {
|
|
if (!(scam_details.ip in new_cache.ips)) {
|
|
new_cache.ips[scam_details.ip] = [];
|
|
}
|
|
new_cache.ips[scam_details.ip] = scam_details;
|
|
}
|
|
if ('addresses' in scam_details) {
|
|
scam_details.addresses.forEach(function(address) {
|
|
if (!(address in new_cache.addresses)) {
|
|
new_cache.addresses[address] = [];
|
|
}
|
|
new_cache.addresses[address] = scam_details;
|
|
});
|
|
}
|
|
scams_checked++;
|
|
if(index == (scams.length-1)) {
|
|
var done_interval = setInterval(function() {
|
|
if (requests_pending == 0) {
|
|
clearInterval(done_interval);
|
|
Object.keys(new_cache.ips).forEach(function(ip) {
|
|
new_cache.blacklist.push(ip);
|
|
});
|
|
fs.writeFileSync("_cache/cache.json", JSON.stringify(new_cache));
|
|
console.log("Done");
|
|
process.abort();
|
|
}
|
|
}, 500);
|
|
}
|
|
});
|
|
});
|
|
});
|
|
} else {
|
|
console.log("Fatal error: Scam without URL found (" + scam.id + ")");
|
|
process.abort();
|
|
}
|
|
});
|