browser-node-virustotal
Version:
An implementation of the Virustotal API for client js
590 lines (589 loc) • 17.1 kB
JavaScript
const fs = require("fs");
const shelljs = require("shelljs");
const readline = require("readline");
const request = require("request");
const publicAPI = require("./code.js");
const rl = readline.createInterface(process.stdin, /*process.stdout*/ null);
const sendPrompt = function(){
rl.resume();
process.stdout.write(">");
return;
};
var mode = "public";
var defaultKeystore = {
public: ["e2513a75f92a4169e8a47b4ab1df757f83ae45008b4a8a49903450c8402add4d"],
honey: [],
intel: [],
private: []
};
var mode = "public";
var workingKeystore = defaultKeystore;
var workingConnection = publicAPI.MakePublicConnection();
workingConnection.setKey(workingKeystore.public[0]);
rl.on("line", function(input){
rl.pause();
var segments = input.split(" ");
var initial = segments[0];
switch(initial) {
case "pwd":
console.log(process.cwd());
sendPrompt();
return;
case "exit":
process.exit(0);
return;
case "cd":
if ((segments.length > 1)&&(segments[1] != "~")) {
process.chdir(segments[1]);
}
sendPrompt();
return;
case "printKeyring":
console.dir(workingKeystore);
sendPrompt();
return;
case "saveKeyring":
if (segments.length > 2) {
shelljs.touch(segments[1]);
fs.writeFileSync("./" + segments[1], JSON.stringify(workingKeystore));
}
sendPrompt();
return;
case "loadKeyring":
if (segments.length > 1) {
try {
const raw = fs.readFileSync(segments[1]);
const parsed = JSON.parse(raw);
workingKeystore = parsed;
} catch (e) {
console.log(e);
}
}
sendPrompt();
return;
case "printMode":
console.log(mode);
sendPrompt();
return;
case "addKey":
if (segments.length > 2){
addKeySwitch:
switch(segments[1]) {
case "public":
workingKeystore.public[workingKeystore.public.length] = segments[2];
break addKeySwitch;
case "private":
workingKeystore.private[workingKeystore.private.length] = segments[2];
break addKeySwitch;
case "intel":
workingKeystore.intel[workingKeystore.intel.length] = segments[2];
break addKeySwitch;
case "honey":
workingKeystore.honey[workingKeystore.honey.length] = segments[2];
break addKeySwitch;
default:
break addKeySwitch;
}
}
sendPrompt();
return;
case "deleteKey":
if (segments.length > 2){
deleteKeySwitch:
switch(segments[1]) {
case "public":
workingKeystore.public = workingKeystore.public.splice(parseInt(segments[2]), 1);
break deleteKeySwitch;
case "private":
workingKeystore.private = workingKeystore.private.splice(parseInt(segments[2]), 1);
break deleteKeySwitch;
case "intel":
workingKeystore.intel = workingKeystore.intel.splice(parseInt(segments[2]), 1);
break deleteKeySwitch;
case "honey":
workingKeystore.honey = workingKeystore.honey.splice(parseInt(segments[2]), 1);
break deleteKeySwitch;
default:
break deleteKeySwitch;
}
}
sendPrompt();
return;
case "setKey":
if (segments.length > 2) {
setKeySwitch:
switch(segments[1]) {
case "":
sendPrompt();
return;
case "public":
mode = segments[1];
workingConnection = publicAPI.MakePublicConnection();
workingConnection.setKey(workingKeystore.public[parseInt(segments[2])]);
break setKeySwitch;
case "private":
mode = segments[1];
workingConnection = publicAPI.makePrivateConnection();
workingConnection.setKey(workingKeystore.private[parseInt(segments[2])]);
break setKeySwitch;
case "intel":
mode = segments[1];
workingConnection = publicAPI.makeIapiConnection();
workingConnection.setKey(workingKeystore.intel[parseInt(segments[2])]);
break setKeySwitch;
case "honey":
mode = segments[1];
workingConnection = publicAPI.MakeHoneypot2Connection();
workingConnection.setKey(workingKeystore.honey[parseInt(segments[2])]);
break setKeySwitch;
default:
break setKeySwitch;
}
}
sendPrompt();
return;
case "getDelay":
if ((mode=="public") || (mode=="honey")) {
console.log(workingConnection.getDelay());
} else {
console.log(0);
}
sendPrompt();
return;
case "setDelay":
if (segments.length > 1) {
if ((mode=="public") || (mode=="honey")) {
workingConnection.setDelay(parseInt(segments[1]));
}
}
sendPrompt();
return;
case "help":
console.log("CLI documentation can be found in \"insert directory of node-virustotal here\"/README.md .");
sendPrompt();
return;
case "IPv4Report":
if ("mode" != "intel") {
if (segments.length > 1) {
workingConnection.checkIPv4(segments[1], function(response){
console.dir(response);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
}
sendPrompt();
return;
}
console.log("error: feature not usable in Intel API");
sendPrompt();
return;
case "DomainReport":
if ("mode" != "intel") {
if (segments.length > 1) {
workingConnection.getDomainReport(segments[1], function(response){
console.dir(response);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
}
sendPrompt();
return;
}
console.log("error: feature not usable in Intel API");
sendPrompt();
return;
case "submitURL":
if (segments.length > 1) {
workingConnection.submitUrlForScanning(segments[1], function(result){
console.dir(result);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
}
sendPrompt();
return;
case "getUrlReport":
if (segments.length > 1) {
workingConnection.retrieveUrlAnalysis(segments[1], function(result){
console.dir(result);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
}
sendPrompt();
return;
case "publishUrlComment":
if (segments.length > 2) {
workingConnection.publishUrlComment(segments[1], segments.slice(2, segments.length).join(" "), function(result){
console.dir(result);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
}
sendPrompt();
return;
case "publishFileComment":
if (segments.length > 2) {
workingConnection.publishFileComment(segments[1], segments.slice(2, segments.length).join(" "), function(result){
console.dir(result);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
}
sendPrompt();
return;
case "sendFile":
if (segments.length > 2) {
workingConnection.publishFileComment(segments[1], segments[2], fs.readFileSync(segments[3]), function(result){
console.dir(result);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
}
sendPrompt();
return;
case "rescanFile":
if (mode=="intel" || (mode=="private")) {
sendPrompt();
return;
}
if (segments.length > 1) {
workingConnection.rescanFile(segments[1], function(result){
console.dir(result);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
}
sendPrompt();
return;
case "getFileReport":
if (segments.length > 1) {
workingConnection.getFileReport(segments[1], function(response){
console.dir(response);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
}
sendPrompt();
return;
case "getUrlComments":
if (mode != "private") {
console.log("Feature only usable in private mode.");
sendPrompt();
return;
}
if (segments.length > 1) {
workingConnection.getUrlComments(segments[1], function(data){
console.dir(data);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
}
sendPrompt();
return;
case "getFileComments":
if (mode != "private") {
console.log("Feature only usable in private mode.");
sendPrompt();
return;
}
if (segments.length > 1) {
workingConnection.getFileComments(segments[1], function(data){
console.dir(data);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
}
sendPrompt();
return;
case "getFile":
if (mode != "private") {
console.log("Feature only usable in private mode.");
sendPrompt();
return;
}
if (segments.length > 2) {
workingConnection.getFile(segments[1], function(data){
console.log("Warning: downloading known or suspected malware to " + segments[2] + " .");
fs.writeFileSync(segments[2], data);
sendPrompt()
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
}
sendPrompt();
return;
case "fileRescan":
if (mode != "private") {
console.log("Only usable in private mode.");
sendPrompt();
return;
}
if (segments.length < 2) {
console.log("Need resource specified.");
sendPrompt();
return;
}
const rescanURL = ("https://www.virustotal.com/vtapi/v2/file/rescan?apikey=" + workingConnection.getKey()) + ("&resource=" + segments[1]);
request({url: rescanURL, method: "POST", gzip: true, headers: { "User-Agent": "gzip"}}, function(error, response, body){
if (error) {
console.log(error);
sendPrompt();
return;
}
console.log(body);
sendPrompt();
return;
});
return;
case "cancelRescan":
if (mode != "private") {
console.log("Only usable in private mode.");
sendPrompt();
return;
}
if (segments.length < 2) {
console.log("Need resource specified.");
sendPrompt();
return;
}
const cancelURL = ("https://www.virustotal.com/vtapi/v2/file/rescan/delete?apikey=" + workingConnection.getKey()) + ("&resource=" + segments[1]);
request({url: cancelURL, method: "POST", gzip: true, headers: { "User-Agent": "gzip"}}, function(error, response, body){
if (error) {
console.log(error);
sendPrompt();
return;
}
console.log(body);
sendPrompt();
return;
});
return;
case "getFileBehavior":
if (mode != "private") {
console.log("Only usable in private mode.");
sendPrompt();
return;
}
if (segments.length < 2) {
console.log("Need resource specified.");
sendPrompt();
return;
}
workingConnection.getFileBehavior(segments[1], function(response){
console.dir(response);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
case "getFileNetworkActivity":
if (mode != "private") {
console.log("Only usable in private mode.");
sendPrompt();
return;
}
if (segments.length < 2) {
console.log("Need resource specified.");
sendPrompt();
return;
}
workingConnection.getFileNetworkActivity(segments[1], function(response){
console.dir(response);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
case "getClusters":
if (mode != "private") {
console.log("Only usable in private mode.");
sendPrompt();
return;
}
if (segments.length < 4) {
console.log("Need year, month, and date specified.");
sendPrompt();
return;
}
workingConnection.getClusters(segments[1], segments[2], segments[3], function(response){
console.dir(response);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
case "getFileFeed":
case "getUrlFeed":
if (segments.length < 6) {
console.log("Need resource specified.");
sendPrompt();
return;
}
var jobName = {};
if (initial=="getFileFeed") {
jobName = workingConnection.getFileFeed;
} else {
jobName = workingConnection.getUrlFeed;
}
jobName(segments[1],segments[2],segments[3],segments[4],segments[5],function(resp){
console.dir(resp);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
case "getNextFalsePositive":
if (mode != "private") {
console.log("Mode Error");
sendPrompt();
return;
}
workingConnection.getNextFalsePositive(function(resp){
console.dir(resp);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
case "deleteNotification":
if (mode != "private") {
console.log("Mode Error");
sendPrompt();
return;
}
if (segments.length < 2) {
console.log("Need Notification ID.");
sendPrompt();
return;
}
workingConnection.deleteNotifications(segments[1], function(resp){
console.dir(resp);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
case "search":
if (mode != "private") {
console.log("Mode Error");
sendPrompt();
return;
}
if (segments.length < 2) {
console.log("Need Query.");
sendPrompt();
return;
}
var actualQuery = segments.splice(0, 1).join(" ");
workingConnection.search2(actualQuery, function(resp){
console.dir(resp);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
case "exportRuleset":
if (mode != "private") {
console.log("Mode Error");
sendPrompt();
return;
}
if (segments.length < 2) {
console.log("Need RulesetID.");
sendPrompt();
return;
}
workingConnection.exportRuleset(segments[1], function(resp){
console.dir(resp);
sendPrompt();
return;
}, function(err){
console.log(err);
sendPrompt();
return;
});
return;
default:
console.log("feature not yet implemented");
sendPrompt();
return;
}
});
sendPrompt();