var SERVER = params.server.replace(/[\/]+$/, '') + '/api/' + params.version + '/'; function doReq(path, data) { data.apiKey = params.apiKey; var result = http( SERVER + path, { Headers: {'Content-Type': ['application/json'], 'Accept': ['application/json']}, Method: 'POST', Body: JSON.stringify(data) }, params.insecure, params.useproxy ); if (result.StatusCode < 200 || result.StatusCode > 299) { if (result.StatusCode == 503) { throw '503 - Rate limit exceeded. Contact your Autofocus representative.'; } if (result.StatusCode == 409) { throw '409 - Invalid message or missing parameters.'; } else { throw 'Failed to perform request ' + path + ', request status code: ' + result.StatusCode + '\n' + result.Body; } } if (result.Body === '') { throw 'No content received.'; } var obj; try { obj = JSON.parse(result.Body); } catch (ex) { throw 'Error parsing reply - ' + result.Body + ' - ' + ex; } return { body: result.Body, obj: obj, statusCode: result.StatusCode }; } function doSearch(prefix) { var cookie = args.cookie; if (!cookie) { var q = {}; q.query = JSON.parse(args.query); q.from = parseInt(args.from); q.size = parseInt(args.size); if (args.sort) { q.sort = {}; q.sort[args.sort] = {order: (args.order ? args.order : 'asc')}; } if (args.scope) { q.scope = args.scope; } var res = doReq(prefix + '/search/', q); if (!res.obj.af_cookie) { throw 'Unable to retrieve cookie of search results'; } cookie = res.obj.af_cookie; } var checks = (args.checks) ? parseInt(args.checks) : 10; var sleep = (args.sleep) ? parseInt(args.sleep) : 3; var res1; var ec = {'Autofocus.Cookie': cookie}; while (checks > 0) { checks--; wait(sleep); res1 = doReq(prefix + '/results/' + cookie, {}); if (res1.obj.af_message === 'complete' || res1.obj.af_in_progress === false || (res1.obj.hits && res1.obj.hits.length >= parseInt(args.size))) { var md = '## PAN Autofocus ' + prefix + ' result\n'; md += 'Total: ' + res1.obj.total + '\nTook: ' + res1.obj.took + '\n'; var hits = []; for (var i=0; i= 1) { var hits = []; for (var i=0; i 0) { var c = search.EntryContext['Autofocus.Samples'][0]; var dbotScore = []; ['md5', 'sha1', 'sha256'].forEach(function(h) { if (c[h]) { dbotScore.push({Indicator: c[h], Type: 'hash', Vendor: 'PAN Autofocus', Score: c.malware === 1 ? 3 : 1, Description: c.tag && c.tag.length > 0 ? c.tag.join(', ') : c.malware === 1 ? 'Marked as malware' : ''}); } }); var ec = {DBotScore: dbotScore}; var f = {MD5: c.md5, SHA1: c.sha1, SHA256: c.sha256, Size: c.size, SSDeep: c.ssdeep, Region: c.region ? c.region.join(',') : '', Info: c.filetype, Type: c.filetype}; if (c.malware === 1) { f.properties_to_append = ['Malicious']; f.Malicious = {Vendor: 'PAN Autofocus', Description: dbotScore[0].Description}; } ec[outputPaths.file] = f; // Now, let's add any interesting sessions we've encountered to the display args.size = 50; delete args.scope; args.query = JSON.stringify({operator: 'all', children: [{field: 'session.sha256', operator: 'is', value: c.sha256}]}); var md = search.HumanReadable; var sessions = doSearch('sessions'); if (sessions.EntryContext && sessions.EntryContext['Autofocus.Sessions'] && sessions.EntryContext['Autofocus.Sessions'].length > 0) { md += '\n' + sessions.HumanReadable; } return { Type: entryTypes.note, Contents: search.Contents, ContentsFormat: formats.json, HumanReadable: md, EntryContext: ec }; } return { Type: entryTypes.note, ContentsFormat: formats.markdown, Contents: 'PAN Autofocus no data for: ' + args.file }; default: throw 'Unknown command "' + command + '"'; }