IsItPhishing

Collaborative web service that provides validation on whether a URL is a phishing page or not by analyzing the content of the webpage.

Data Enrichment & Threat Intelligence · IsItPhishing

Details

IDIsItPhishing
ProviderOpen Source
CategoryData Enrichment & Threat Intelligence
From Version5.0.0
Supported ModulesAgentix XSIAM

README

Collaborative web service that provides validation on whether a URL is a phishing page or not by analyzing the content of the webpage.

Configure IsItPhishing in Cortex

Parameter Description Required
Server URL (e.g. https://192.168.0.1)   False
Customer’s name   True
Customer’s License   True
Use system proxy settings   False
Trust any certificate (not secure)   False
Source Reliability Reliability of the source providing the intelligence data. False

Commands

You can execute these commands from the CLI, as part of an automation, or in a playbook.
After you successfully execute a command, a DBot message appears in the War Room with the command details.

url


Checks if URL is phishing

Base Command

url

Input

Argument Name Description Required
url URL to be checked if phishing. Required
force Set true to analyze URL, or false to check whether URL may cause collateral damage to the end user. Default is false. Optional
smart Set true to force checks on URLs that may cause collateral damage to the end user, or false to ignore the argument. Default is true. Optional
area The regional area to force using a proxy. Optional
timeout Timeout in milliseconds. Default value set to 10000, with a minimum value of 1000. Once timeout is reached, TIMEOUT response is returned. Optional

Context Output

Path Type Description
URL.Status unknown URL identification result.
URL.Url unknown The URL that was tested.
URL.Malicious.Vendor unknown For malicious URLs, the vendor that made the decision.
URL.Malicious.Description unknown For malicious URLs, the reason for the vendor to make the decision.
DBotScore.Indicator unknown The indicator that was tested.
DBotScore.Type unknown The indicator type.
DBotScore.Vendor unknown The vendor used to calculate the score.
DBotScore.Score unknown The actual score.

Configuration parameters

  • url — Server URL (e.g. https://192.168.0.1)
  • name — Customer's name
  • license — Customer's License
  • credentials — Customer's name
  • proxy — Use system proxy settings
  • insecure — Trust any certificate (not secure)
  • integrationReliability — Source Reliability
  • feedExpirationPolicy
  • feedExpirationInterval

Commands (1)

  • url

    Checks if URL is phishing.

var auth = 'Bearer ' + btoa(
    params.credentials 
    ? params.credentials.identifier + ':' + params.credentials.password 
    :  params.name + ':' + params.license
);

var sendRequest = function(method, api, body) {
    var url = params.url;
    var requestUrl = url.replace(/[\/]+$/, '') + '/' + api;
    var res = http(
        requestUrl,
        {
            Method: method,
            Headers: {
                'Authorization': [auth],
                'Content-Type': ['application/x-www-form-urlencoded']
            },
            Body: encodeToURLQuery(body).substring(1)
        },
        params.insecure,
        params.proxy
    );

    if (res.StatusCode < 200 || res.StatusCode >= 300) {
        throw 'Request Failed.\nStatus code: ' + res.StatusCode + '.\nBody: ' + JSON.stringify(res) + '.';
    }

    return res;
};

var isPhishing = function(url, force, smart, area, timeout) {
    var urls = url.split(',')
    var results = new Array(urls.length)
    for (var i = 0; i < urls.length; i++) {
        var md;
        var body = {
            name: params.credentials ? params.credentials.identifier : params.name,
            license: params.credentials  ? params.credentials.password : params.license,
            version: '2',
            force: force,
            url: urls[i],
            area: area,
            timeout: timeout
        };
        if (!area) {
            delete body.area;
        }
        if (!timeout) {
            delete body.timeout;
        }
        var res = sendRequest('POST', 'check', body);
        var ec = {
            IsItPhishing: {Url: urls[i]},
            DBotScore: {
                Indicator: urls[i],
                Score: 0,
                Type: 'url',
                Vendor: 'IsItPhishing',
                Reliability: params.integrationReliability
            }
        };
        var resBody = res.Body.trim();

        if (resBody.substring(0,17) == 'TOO_MANY_REQUESTS') {
        md = 'You have reached the maximum number of requests for your license. You must wait for the returned period of time' + resBody.substring(17) + 'before running requests again.';
        ec.IsItPhishing.Status = 'TOO_MANY_REQUESTS';
        }
        if (resBody.substring(0,5) == 'ERROR') {
        md = 'An error has occurred. Please refer to the description of the error indicated in the' + resBody.substring(0,5) + 'value.';
        ec.IsItPhishing.Status = 'ERROR';
        }

        switch (resBody){
            case 'SPAM':
                md = 'URL was identified as spam.';
                ec.IsItPhishing.Status = 'SPAM';
                ec.DBotScore.Score = 2;
                addMalicious(ec, outputPaths.url, {
                Data: urls[i],
                Malicious: {Vendor: 'IsItPhishing', Description: 'URL found as spam by IsItPhishing'}
                });
                break;
            case 'PHISHING':
                md = 'URL was identified as phishing.';
                ec.IsItPhishing.Status = 'PHISHING';
                ec.DBotScore.Score = 3;
                addMalicious(ec, outputPaths.url, {
                Data: urls[i],
                Malicious: {Vendor: 'IsItPhishing', Description: 'URL found as phishing by IsItPhishing'}
                });
                break;
            case 'UNKNOWN':
                md = 'URL is clean.';
                ec.IsItPhishing.Status = 'CLEAN';
                ec.DBotScore.Score = 1;
                break;
            case 'TIMEOUT':
                md = 'Timeout for the request has been reached. No verdict was returned for the request, and the URL should be considered clean.';
                ec.IsItPhishing.Status = 'TIMEOUT';
                break;
            case 'NOT_EXPLORED':
                md = 'The URL was not analyzed as triggering the analysis may cause collateral damage (unsubscribe, order conformation, etc.)';
                ec.IsItPhishing.Status = 'NOT_EXPLORED';
                break;
            case 'NOT_AUTHORIZED':
                md = 'Authorization has failed for one of the following reasons:\n• Invalid customer name,\n• Invalid customer license.';
                ec.IsItPhishing.Status = 'NOT_AUTHORIZED';
                break;
            case 'REVOKED':
                md = 'The license provided is no longer valid for one of the following reasons:\n• Validity period has expired,\n• License has been revoked.';
                ec.IsItPhishing.Status = 'REVOKED';
                break;
        }

        results[i] = {Type: entryTypes.note, Contents: resBody, ContentsFormat: formats.text, HumanReadable: md, EntryContext: ec, HumanReadableFormat: formats.text};
    }
    return results
};

switch (command) {
    case 'test-module':
        return 'ok';
    case 'url':
        return isPhishing(args.url, args.force, args.smart, args.area, args.timeout);
    default:
}