A LNK Between Browsers: Hunting Methodologies and Extension Abusing Actors | Mandiant
Tags
cmtmf-attack-pattern: | Masquerading |
maec-delivery-vectors: | Watering Hole |
attack-pattern: | Data Domains - T1583.001 Domains - T1584.001 Javascript - T1059.007 Malware - T1587.001 Malware - T1588.001 Masquerading - T1655 Powershell - T1059.001 Software - T1592.002 Visual Basic - T1059.005 Whois - T1596.002 Browser Extensions - T1176 Masquerading - T1036 Powershell - T1086 Masquerading |
Common Information
Type | Value |
---|---|
UUID | 06294309-ab32-4cb1-8aad-a1cb835a177d |
Fingerprint | 10449e2366a787e8 |
Analysis status | DONE |
Considered CTI value | 2 |
Text language | |
Published | May 1, 2023, midnight |
Added to db | Aug. 12, 2023, 3:26 a.m. |
Last updated | Nov. 17, 2024, 6:54 p.m. |
Headline | A LNK Between Browsers: Hunting Methodologies and Extension Abusing Actors |
Title | A LNK Between Browsers: Hunting Methodologies and Extension Abusing Actors | Mandiant |
Detected Hints/Tags/Attributes | 78/3/36 |
Source URLs
Redirection | Url | |
---|---|---|
Details | Source | https://www.mandiant.com/resources/blog/lnk-between-browsers |
URL Provider
RSS Feed
Details | Id | Enabled | Feed title | Url | Added to db |
---|---|---|---|---|---|
Details | 330 | ✔ | Threat Intelligence | https://www.mandiant.com/resources/blog/rss.xml | 2024-08-30 22:08 |
Attributes
Details | Type | #Events | CTI | Value |
---|---|---|---|---|
Details | Domain | 1 | 94406.zip |
|
Details | Domain | 1 | telegromcn.org |
|
Details | Domain | 1 | extension.zip |
|
Details | Domain | 291 | raw.githubusercontent.com |
|
Details | Domain | 2 | ashgrrwt.click |
|
Details | Domain | 2 | nch-software.info |
|
Details | Domain | 1 | panger-top.click |
|
Details | File | 1 | tradevlewdesktop_v4-94406.zip |
|
Details | File | 1 | tradevlewdesktop_x64.exe |
|
Details | File | 1 | extension.exe |
|
Details | File | 674 | node.js |
|
Details | File | 1 | extension.zip |
|
Details | File | 1 | wtf.vbs |
|
Details | File | 4 | chrome.vbs |
|
Details | File | 82 | taskkill.exe |
|
Details | File | 1 | blanks_online.exe |
|
Details | File | 86 | manifest.json |
|
Details | md5 | 2 | 0a4f321c903a7fbc59566918c12aca09 |
|
Details | md5 | 1 | 34eea751fcbf4ee8d44977adb4742d93 |
|
Details | IPv4 | 1 | 146.70.79.75 |
|
Details | Mandiant Uncategorized Groups | 65 | UNC1151 |
|
Details | Mandiant Uncategorized Groups | 1 | UNC4553 |
|
Details | Threat Actor Identifier - APT | 665 | APT29 |
|
Details | Threat Actor Identifier - FIN | 377 | FIN7 |
|
Details | Threat Actor Identifier - FIN | 10 | FIN13 |
|
Details | Url | 1 | http://telegromcn.org/soft/analytics/extension.exe |
|
Details | Url | 1 | http://raw.githubusercontent.com/gulantin/blanks/main/blanks_online.exe |
|
Details | Yara rule | 1 | rule M_Hunting_Embedded_Chromium_CRX_1 { meta: author = "Mandiant" md5 = "f1c21a69ed9f85e12d58ef0f5ac5c9b1" description = "Hunting for non-CRX files with extension equities" strings: $a1 = "_metadata" $a2 = "manifest.json" $a3 = "verified_contents.json" $s1 = "_locales" $s2 = "messages.json" $f = /[a-z0-9A-Z_-]+\.(html|htm|css|js)/ $pk = { 50 4B 03 04 } condition: (((uint16(0) == 0x5A4D) and uint32(uint32(0x3C)) == 0x00004550) or (uint32(0) == 0x464c457f) or (uint32(0) == 0xfeedface or uint32(0) == 0xcefaedfe or uint32(0) == 0xfeedfacf or uint32(0) == 0xcffaedfe or uint32(0) == 0xcafebabe or uint32(0) == 0xbebafeca or uint32(0) == 0xcafebabf or uint32(0) == 0xbfbafeca)) and (((2 of ($a*)) and $f) or ((1 of ($a*)) and ($f or (1 of ($s*))))) and $pk and (#pk > 1) and (for any i in (1 .. #pk) : ( $a2 at @pk[i] + 30 )) and (for any j in (1 .. #pk) : ( $f at @pk[j] + 30 )) } |
|
Details | Yara rule | 1 | rule M_Hunting_Embedded_Chromium_CRXandLNK_1 { meta: author = "jared.wilson" md5 = "f1c21a69ed9f85e12d58ef0f5ac5c9b1" description = "Hunting for non-CRX files with extension equities and common strings for Google Chrome LNKs" strings: $a1 = "_metadata" $a2 = "manifest.json" $a3 = "verified_contents.json" $s1 = "_locales" $s2 = "messages.json" $f = /[a-z0-9A-Z_-]+\.(html|htm|css|js)/ $pk = { 50 4B 03 04 } $load = "--load-extension" ascii wide $lnk1 = "Google Chrome.lnk" ascii wide condition: (((uint16(0) == 0x5A4D) and uint32(uint32(0x3C)) == 0x00004550) or (uint32(0) == 0x464c457f) or (uint32(0) == 0xfeedface or uint32(0) == 0xcefaedfe or uint32(0) == 0xfeedfacf or uint32(0) == 0xcffaedfe or uint32(0) == 0xcafebabe or uint32(0) == 0xbebafeca or uint32(0) == 0xcafebabf or uint32(0) == 0xbfbafeca)) and (((2 of ($a*)) and $f) or ((1 of ($a*)) and ($f or (1 of ($s*))))) and $pk and (#pk > 1) and (for any i in (1 .. #pk) : ( $a2 at @pk[i] + 30 )) and (for any j in (1 .. #pk) : ( $f at @pk[j] + 30 )) and ($load or $lnk1) } |
|
Details | Yara rule | 1 | rule M_Hunting_AdvancedInstaller_LNK_1 { meta: author = "Mandiant" md5 = "2782af385665c765807ed887d4bacf36" description = "Hunting for Advanced Installer files that drop LNKs to known locations." strings: $a1 = "Advanced Installer" wide $a2 = "Advanced Installer" $a3 = "https://www.advancedinstaller.com" $l1 = "Google Chrome.lnk" $l2 = "Brave.lnk" $p1 = "\\Microsoft\\Windows\\Start Menu\\Programs\\Google Chrome.lnk" $p2 = "\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\Brave.lnk" $p3 = "\\Microsoft\\Internet Explorer\\Quick Launch\\Brave.lnk" $p4 = "\\Microsoft\\Internet Explorer\\Quick Launch\\Google Chrome.lnk" $p5 = "\\Microsoft\\Windows\\Start Menu\\Programs\\Brave.lnk" $p6 = "\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\Google Chrome.lnk" $r = /\$[^\.]+\.CreateShortcut\([^\)]+\)/ condition: ((uint16(0) == 0x5A4D) and uint32(uint32(0x3C)) == 0x00004550) and (all of ($a*)) and (1 of ($l*)) and (2 of ($p*)) and $r } |
|
Details | Yara rule | 1 | rule M_Hunting_LNKEngine_LoadExtension_1 { meta: author = "Mandiant" description = "Hunting rule that looks for files containing strings pertaining to execution of Edge, Opera, Brave, Chrome to launch an extension." md5 = "30abf9ca1bb792eb5edd8b033c010979" strings: $r1 = /(chrome|msedge|opera|brave)[^\r\n]+--load-extension=/ ascii wide nocase $s1 = "chrome" ascii wide $s2 = "--load-extension=" ascii wide condition: (uint32(0) == 0x0000004c) and filesize < 50KB and all of ($s*) and $r1 } |
|
Details | Yara rule | 1 | rule M_Hunting_LNKEngine_LoadExtension_Temp_1 { meta: author = "Mandiant" description = "Hunting rule that looks for files containing strings pertaining to execution of Edge, Opera, Brave, Chrome to launch an extension." md5 = "30abf9ca1bb792eb5edd8b033c010979" strings: $r1 = /(chrome|msedge|opera|brave)[^\r\n]+--load-extension="?[A-Za-z]:\\Users\\[^\\]+\\AppData\\/ ascii wide nocase $s2 = "--load-extension=" ascii wide condition: (uint32(0) == 0x0000004c) and filesize < 50KB and all of them } |
|
Details | Yara rule | 1 | rule M_Hunting_ArchiveEngine_CAB_Extension_1 { meta: author = "Mandiant" description = "Looking for CAB containing what is suspected to be the files that make up an extension" md5 = "de283dfb9c88dbb6d455ca4b31c57240" strings: $f1 = "manifest.json" nocase $f2 = ".js" nocase $f3 = ".htm" nocase $f4 = ".png" nocase condition: filesize < 1MB and uint32be(0) == 0x4D534346 and ($f1 in (uint32(16) .. uint32(16) + 256)) and ($f2 in (uint32(16) .. uint32(16) + 256)) and ($f3 in (uint32(16) .. uint32(16) + 256)) and ($f4 in (uint32(16) .. uint32(16) + 256)) } |
|
Details | Yara rule | 1 | rule M_Hunting_RILIDE_InjectJS_1 { meta: author = "Mandiant" md5 = "9fe5b99b20bc91995b81eddd917bff50" description = "Hunting for the code that RILIDE injects" strings: $banner = "https://public.bnbstatic.com/image/email_template/emailBanner.png" $s1 = "[Bybit]Withdrawal Request" $s2 = "[Bybit] Authorize New Device" $a1 = "created a withdrawal request" $a2 = "Authorize New Device You recently attempted to sign in to your Bybit account from a new device or location. As a security measure, we require additional" $a3 = "Please check your withdrawal address carefully." $a4 = "Verification Code Of Withdrawal" $a6 = "Withdrawal Verification Code" $a7 = "Verification Code Of Authorization" $a8 = "initiate this withdrawal or the address is" $a9 = "Authorize New Device You recently attempted to sign in to your OKX account from a new device or location. As a security measure, we require additional" $a10 = "Confirm your new withdrawal address" $a11 = "A new withdrawal address was just added to your account." $f1 = "div:contains(\"Binance\"), div:contains(\"binance\")" $f2 = "binance()" fullword $f3 = "div:contains(\"Bybit\"), div:contains(\"bybit\")" $f4 = "bybit()" fullword $f5 = "div:contains(\"Huobi\"), div:contains(\"huobi\")" $f6 = "huobi()" fullword $f7 = "div:contains(\"Okx\"), div:contains(\"okx\")" $f8 = "okx()" fullword $f9 = "div:contains(\"Kraken\"), div:contains(\"kraken\")" $f10 = "kraken()" fullword condition: filesize < 1MB and $banner and (1 of ($s*)) and (3 of ($a*)) and (6 of ($f*)) } |
|
Details | Yara rule | 1 | rule M_Hunting_RILIDE_InjectJS_2 { meta: author = "Mandiant" md5 = "6e426758f184b5a942428731b749b000" description = "Hunting for the code that RILIDE injects" strings: $anchor = "const DOMAIN = 'https://extenision-app.com/api'" $v1 = "exchangeRates" ascii fullword $v2 = "supportedAssets" ascii fullword $v3 = "supportedAccounts" ascii fullword $v4 = "currencySymbol" ascii fullword $v5 = "userId" ascii fullword $v6 = "settings" ascii fullword $v7 = "extensions" ascii fullword $s1 = "Confirm settings change" $s2 = "2-step verification" $s3 = "This extra step is to make sure it's really you trying to change settings" $s4 = "Enter the 2-step verification code we texted to your phone" $s5 = "Enter the 2-step verification code from your authenticator app" $s6 = "Didn't receive the SMS?" $s7 = "Re-send SMS" $u1 = "${DOMAIN}/settings" $u2 = "${DOMAIN}/exchange/get-address?type=${type}" $u3 = "${DOMAIN}/exchange/create-account" $u4 = "${DOMAIN}/exchange/set-balance" $u5 = "${DOMAIN}/exchange/set-all-balances" $u6 = "${DOMAIN}/exchange/set-withdraw" $p1 = "password = localStorage.getItem('coinbase_password')" $p2 = "email = localStorage.getItem('coinbase_username')" $f1 = "getExchangeRates" fullword $f2 = "getSupportedAssets" fullword $f3 = "getAccounts" fullword $f4 = "currentWithdraw" condition: filesize < 1MB and (($anchor and (8 of them)) or ((4 of ($v*)) and (4 of ($s*)) and (3 of ($u*)) and (1 of ($p*)) and (2 of ($f*)))) } |
|
Details | Yara rule | 1 | rule M_Hunting_RILIDE_InjectJS_3 { meta: author = "Mandiant" md5 = "6e426758f184b5a942428731b749b000" description = "Hunting for the code that RILIDE injects" strings: $anchor = "const DOMAIN = 'https://extenision-app.com/api'" $v1 = "userId" ascii fullword $v2 = "bearerToken" ascii fullword $v3 = "sharedKey" ascii fullword $v4 = "multiaddr" ascii fullword $v5 = "ethAccount" ascii fullword $v6 = "userSeed" ascii fullword $s1 = "${DOMAIN}/exchange/create-account" $s2 = "${DOMAIN}/exchange/set-balance" $s3 = "${DOMAIN}/exchange/set-all-balances" $s4 = "${DOMAIN}/settings" $f1 = "setBalance" $f2 = "setAllBalance" $f3 = "getSettings" $f4 = "getPrecisions" $f5 = "getPriceInUSDT" $f6 = "checkAuthTimer" $f7 = "checkBalanceTimer" $f8 = "balanceInUSDT" condition: filesize < 1MB and (($anchor and (8 of them)) or ((4 of ($v*)) and (2 of ($s*)) and (6 of ($f*)))) } |