Укроћење УСБ/ИП-а

Редовно се јавља задатак повезивања УСБ уређаја са удаљеним рачунаром преко локалне мреже. Испод реза је историја мојих претрага у овом правцу и пут до готовог решења заснованог на пројекту отвореног кода УСБ/ИП са описом препрека које су разни људи пажљиво постављали на овом путу, као и начина да их заобиђу.

Први део, историјски

Ако је машина виртуелна, све је ово лако. Функционалност УСБ прослеђивања са хоста на виртуелну машину појавила се у ВМВаре 4.1. Али у мом случају, безбедносни кључ, идентификован као ВИБУ-КЕИ, морао је да буде повезан са различитим машинама у различито време, а не само са виртуелним.
Први круг претраге 2009. довео ме је до комада хардвера који се зове ТрендНет ТУ2-НУ4
Предности:

  • понекад чак и ради

Против:

  • не ради увек. Рецимо да се заштитни кључ Гуардант Стеалтх ИИ не покреће кроз њега, псујући се са грешком „уређај се не може покренути“.
  • Софтвер за управљање (читај: монтирање и демонтажу УСБ уређаја) је изузетно лош. Прекидачи командне линије, аутоматизација - не, нисмо чули. Све се ради вашим рукама. Ноћна мора.
  • Контролни софтвер тражи сам хардвер на мрежи путем емитовања, тако да ради само у оквиру једног емитованог сегмента мреже. Не можете ручно да одредите ИП адресу комада хардвера. Да ли је део хардвера у другој подмрежи? Онда имате проблем.
  • Програмери су одустали од уређаја, слање извештаја о грешкама је бескорисно.

Други круг се десио у не тако далеком времену и довео ме до теме чланка - УСБ/ИП пројекат. Привлачи својом отвореношћу, поготово што су момци из РеацтОС Потписали су драјвер за Виндовс, тако да сада чак и на к64 све ради без икаквих штака попут тест мода. За шта велико хвала РеацтОС тиму! Све звучи лепо, хајде да то осетимо, да ли је заиста тако? Нажалост, и сам пројекат је напуштен, и не можете рачунати на подршку - али тамо где наш није нестао, изворни код је ту, схватићемо!

Други део, сервер-Линук

УСБ/ИП сервер који дели УСБ уређаје преко мреже може се инсталирати само у ОС заснованом на Линуку. Па, Линук је Линук, инсталирајте Дебиан 8 на виртуелну машину у минималној конфигурацији, стандардни покрет руке:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbip

Подесити. Онда интернет сугерише да треба да преузмете усбип модул, али - здраво, прво раке. Не постоји такав модул. То је зато што се већина приручника на мрежи односи на старију грану 0.1.к, ау најновијој верзији 0.2.0 усбип модули имају различита имена.

Стога:

sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip

Па, хајде да додамо следеће линије у /етц/модулес да их аутоматски учитамо када се систем покрене:

usbip-core
usbip-host
vhci-hcd

Покренимо усбип сервер:

sudo usbipd -D

Даље, универзална мудрост нам говори да усбип долази са скриптама које нам омогућавају да управљамо сервером - показујемо који уређај ће делити преко мреже, видети статус и тако даље. Овде нас чека још један баштенски алат - ове скрипте у грани 0.2.к су, опет, преименоване. Можете добити листу команди користећи

sudo usbip

Након читања описа команди, постаје јасно да усбип жели да сазна његов ИД магистрале да би поделио потребан УСБ уређај. Поштовани гледаоци, грабуљите број три у арени: ИД аутобуса који ће нам дати лсусб (чини се најочигледнији начин) - не одговара јој! Чињеница је да усбип игнорише хардвер попут УСБ чворишта. Због тога ћемо користити уграђену команду:

user@usb-server:~$ sudo usbip list -l
 - busid 1-1 (064f:0bd7)
   WIBU-Systems AG : BOX/U (064f:0bd7)

Напомена: овде и даље у листи ћу све описати на примеру мог специфичног УСБ кључа. Име вашег хардвера и пар ВИД:ПИД могу и биће различити. Мој се зове Вибу-Системс АГ: БОКС/У, ВИД 064Ф, ПИД 0БД7.

Сада можемо да делимо наш уређај:

user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete

Ура, другови!

user@usb-server:~$ sudo usbip list -r localhost
Exportable USB devices
======================
 - localhost
        1-1: WIBU-Systems AG : BOX/U (064f:0bd7)
           : /sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
           : Vendor Specific Class / unknown subclass / unknown protocol (ff/00/ff)

Три пута уздравље, другови! Сервер је делио хардвер преко мреже и можемо га повезати! Остаје само да додате аутостарт усбип демона у /етц/рц.лоцал

usbipd -D

Трећи део, на страни клијента и збуњујуће

Одмах сам покушао да повежем дељени уређај преко мреже са машином на којој је покренут Дебиан на истом серверу и све се савршено повезало:

sudo usbip attach --remote=localhost --busid=1-1

Пређимо на Виндовс. У мом случају то је био Виндовс Сервер 2008Р2 Стандард Едитион. Званични приручник тражи да прво инсталирате драјвер. Процедура је савршено описана у реадме-у приложеном уз Виндовс клијент, радимо све како је написано, све ради. Такође ради на КСП-у без икаквих потешкоћа.

Након што смо распаковали клијента, покушавамо да монтирамо наш кључ:

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip err: usbip_windows.c: 756 (query_interface0) recv op_common
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

Ох ох. Нешто није у реду. Хајде да користимо вештину Гугла. Помиње се фрагментарно да нешто није у реду са константама у серверском делу, програмери су променили верзију протокола при преласку на верзију 0.2.0, али су у Вин клијенту то заборавили. Предложено решење је да се промени константа у изворном коду и поново изгради клијент.

Али заиста не желим да преузимам Висуал Студио за ову процедуру. Али имам доброг старог Хиев. У изворном коду, константа је декларисана као двострука реч. Потражимо 0к00000106 у датотеци, замењујући је са 0к00000111. Не заборавите, редослед бајтова је обрнут. Резултат су две утакмице, закрпимо:

[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11

Ааа и... да!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1

Ово је могао бити крај приче, али музика није дуго свирала. Након поновног покретања сервера, открио сам да уређај на клијенту није монтиран!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

То је све. Чак ни свезнајући Гугл није могао да ми одговори на ово. А у исто време, команда за приказивање уређаја доступних на серверу сасвим исправно показује - ево га, кључа, можете га монтирати. Покушавам да монтирам са Линук-а - ради! Шта ако сада покушамо из Виндовс-а? Ох ужас - ради!

Последњи раке: нешто није написано у коду сервера. Када делите уређај, он не чита број УСБ дескриптора са њега. А када монтирате уређај са Линук-а, ово поље се попуњава. Нажалост, упознат сам са развојем Линука на нивоу „направи && направи инсталацију“. Стога је проблем решен коришћењем прилично прљавог хака - додавањем у /етц/рц.лоцал

usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00

Завршни део

После неког искушења, ради. Жељено је постигнуто, сада се кључ може монтирати на било који рачунар (и демонтирати, наравно, такође), укључујући и ван сегмента емитовања мреже. Ако желите, то можете учинити помоћу скрипте командне шкољке. Оно што је лепо је то што је задовољство потпуно бесплатно.
Надам се да ће моје искуство помоћи хакерима да заобиђу грабуље које ми је утиснуто на челу. Хвала на пажњи!

Извор: ввв.хабр.цом

Додај коментар