sensor_ua 17.04.2011 16:10
How-to`s — Запуск программ в guest-машине VirtualBox из-под host-Linux
Запускать приложения предлагается старинным способом - посредством кроссплатформенной утилиты netcat.Запуск netcat на 2-х компьютерах приводит к созданию TCP-подключения с указанными реквизитами и замыканием стандартного ввода на сетевой вывод и наоборот, стандартного вывода на сетевой ввод.
В рамках задачи запуска приложений требуется на стороне исполнителя сборка netcat с поддержкой ключа запуска на выполнение -e сторонней программы (что в принципе открывает брешь уязвимости). Для Windows такую сборку можно скачать на securitylab.ru.
Для обмена потоками ввода-вывода выберем какой-нибудь непримечательный номер порта, например, 4455.
Если в командной строке Windows XP запустить
nc -l -p 4455 -d -L -e "cmd.exe"
то netcat будет слушать порт 4455 и всё полученное передавать cmd.exe.
Далее описываю действия для Ubuntu 10.10 и VirtualBox 4.04.
Утилиту netcat доустанавливаем обычным способом
sudo apt-get install netcat
Для изоляции виртуальной машины от внешней сети создаём в Ubuntu средствами user-mode-linux виртуальный сетевой адаптер и разрешаем работу по выбранному порту. Для этого инсталлируем
sudo apt-get install user-mode-linux
и добавляем в /etc/rc.local запуск виртуального сетевого адаптера (имя ему выбрал vbox0) от имени пользователя, запускающего VirtualBox, при этом выбираем IP для guest-машины 192.168.56.3 и разрешаем прохождение пакетов между виртуальным интерфейсом vbox0 и этим IP по порту 4455.
$ sudo gedit /etc/rc.local
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
TUN=vbox0 #имя предполагаемого хост-интерфейса
IP=192.168.56.1 #IP-адрес хост-интерфейса
USERNAME=vitaly #ваш логин
NETMASK=24 #маска подсети
tunctl -t $TUN -u $USERNAME
ifconfig $TUN up
ifconfig $TUN $IP/$NETMASK
arp -Ds $IP $TUN pub
iptables -A FORWARD -i vbox0 -d 192.168.56.3 -p tcp --dport 4455 -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/conf/$TUN/proxy_arp
exit 0
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Далее пробуем запустить виртуальный сетевой адаптер
sudo /etc/init.d/rc.local stop
sudo /etc/init.d/rc.local start
Если после этого в выдаче ifconfig виртуальный сетевой адаптер не появился, то, к сожалению, требуется перезагрузка.
Тогда в виртуальной Windows не забудем запустить
nc -l -p 4455 -d -L -e "cmd.exe"
и при запуске в Ubuntu
$ nc 192.168.56.3 4455
увидим приглашение типа такого
Microsoft Windows XP
(C) Copyright 1985-2001 Microsoft Corp.
c:\Pr\NetCat>
Далее можно, например, запустить калькулятор в Windows просто введя calc, а далее, в следующем приглашении exit. Guest-Windows, запущенная в бесшовном режиме (штатная возможность для современных версий VirtualBox) позволит увидеть запущенное приложение (калькулятор виндовс) прямо на десктопе Linux (Gnome для Ubuntu).
Но это случай, когда файлы лежат на машине с Windows. Для запуска файлов, размещенных на разделах host-а, можно сделать пути к файлам доступными для guest-системы и передать их для выполнения той же cmd.exe
Для этого даём виртуальной машине средствами VirtualBox доступ к общей папке - у меня это /home/vitaly/vboxshare, замонтированная в guest-Windows как раздел x:. В неё укладываю симлинк на домашнюю директорию
ln -fs /home/vitaly /home/vitaly/vboxshare/vhome
В /home/vitaly/my создал файл скрипта, обозвал "windows". Дополнительная фишка - конвертирование кодировок, чтобы нормально работало с кириллицей в путях.
Прошу сильно не пинать за силу скриптостроения;) - получилось вот как:
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
#! /bin/bash
#
# echo '"'x:$1'"'|iconv -f utf-8 -t cp866 |sed 's/\/home\/vitaly/\/vhome/g'|sed 's/\//\\/g'> a.txt
# echo '"'x:$1'"'|iconv -f utf-8 -t cp866 |sed 's/\/home\/vitaly/\/vhome/g;s/\//\\/g' > a.txt
# echo exit >> a.txt
echo -e '"'x:$1'"\nexit'|iconv -f utf-8 -t cp866 |sed 's/\/home\/vitaly/\/vhome/g;s/\//\\/g' > a.txt
nc -i 1 192.168.56.3 4455 < a.txt
rm a.txt
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(192.168.56.3 - адрес виртуалки, 4455 - порт, на котором в виртуалке висит netcat и передаёт параметры cmd.exe). Делаем скрипт исполняемым
chmod +x /home/vitaly/my/windows
В строке запуска файла с определенным разрешением, например,exe, в подменю "Открыть в программе" nautilus-а выбираю /home/vitaly/my/windows и "запомнить". Не забываем в виртуальной Windows создать bat-файл с содержимым
nc -l -p 4455 -d -L -e "cmd.exe"
и положить линк на него в автозагрузку. Одно НО - придётся его закрывать руками при каждом запуске Windows - это не страшно, так как ключ -d осталяет работать netcat в фоне в режиме демона.
Теперь правый клик в Nautilus-е на файле *.exe, выбираем windows, а далее поднимается приложение в запущенной виртуальной (удаленной) Windows прямо на рабочем столе Gnome. Точно так же можно передать файл с любым зарегистрированным в Windows расширением и тогда поднимется соответствующая обслуживающая программа.
Описанные действия возможно произвести и с гостевыми *nix системами, но потребуется соответствующая сборка netcat. В случае с Ubuntu 10.10 x86_64 оказалось достаточно удалить пакет netcat-openbsd, собрать пакет из исходников через
$ ./configure
$ sudo checkinstall
в директории с распакованными исходниками, а затем обычная установка deb-пакета. Далее
$ nc -l -p 4499 -e /bin/bash
В VMware Player 3.1.4 не удалось пройти по симлинкам в сетевой шаре. Вместо симлинков годится использование mount --bind /home/user/ home/user/sharefolder/homemnt. Использовал Host-only сетевой адаптер и виртуальный адаптер от VMware - vmnet1 - подсеть 192.168.174.255. Передача пути немного отличается, потому что сетевая шара монтируется в виртуальной Windows несколько иначе, чем принято в VirtualBox - у меня получилось z:\vboxshare.
Способы автоматического закрытия окна с работающим netcat-ом можно найти на форумах хакеров.
Тэги: virtualbox
kma21 17.04.2011 17:28 #
+ 0 -
Статейка годная, но уберите это под cut, пожалуйста.
Извиняюсь. Положил под кат. Почему-то пропала(не видел/не нашёл) кнопа редактирования
в последнем скрипте можно соединить оба sed, разделив команды точкой с запятой.
писать во временный файл совсем не обязательно, так как можно тот же exit добавить в уже существующий echo.
писать во временный файл совсем не обязательно, так как можно тот же exit добавить в уже существующий echo.
exit дописывается в следующую, а не в текущую строку. Строки нужно передавать отдельно - сначала вызов программы, потом, через паузу, exit. Не нашел другого способа. Варианты приветствуются.
#! /bin/bash
#
SOMECOMMAND=$(echo x:$1 |iconv -f utf-8 -t cp866 |sed 's/\/home\/vitaly/\/vhome/g;s/\//\\/g')"/nexit"
nc -i 1 192.168.56.3 4455 "$SOMECOMMAND"
я думаю, что будет работать, но не проверяла.зы: с техникой, представленной в статье, я ещё
обязательно поиграюсь.
ну или разбирайся в синтаксисе nc, чтоб он читал стринг команды, или наивно echo $SOMECOMMAND > a ; nc < a; rm a
Не получается сделать с помощью echo перевод строки. Пробовал просто пару букв и превод и с прямым, и с обратным слешом - не хочет:(
Это-то понятно. Но тут кагбе ещё одна альтернатива, что очень даже неплохо.
А ещё в голову пришла идея, которая требует проверки, но очень даже может сработать. Пустить неткат на двух машинах в конвеере с gpg или openssl с шифрованием на одной стороне и дешифровкой на другой с соответствующими ключами. Должно получиться забавно.
Только что попробовал в разных терминалах:
Работает!
cat wget-log | openssl enc -e -aes-256-cbc | nc -l -p 11111
nc localhost 11111 | openssl enc -d -aes-256-cbc
Работает!
Серьёзно думаешь виндовое использование тут будет интересно?
Хотя бы это давал: http://handynotes.ru/2010/01/unix-utility-netcat.html
Хотя бы это давал: http://handynotes.ru/2010/01/unix-utility-netcat.html