Хакаем Transcend Wi. Fi SDHC карту памяти / Хабрахабр. Перевод немного вольный, но смысл не потерян. Я (переводчик) заинтересовался этой карточкой давно и почти сразу заказал её, сегодня забрал с почты и не могу нарадоваться, но хочется больше, чем дает Transcend, а карточка, между прочим, Linux сервер с Wi. Fi! Очень много буковок. С недавнего времени я стал счастливым обладателем карты памяти Transcend Wi. Fi SD, которая позволяет мне передавать фотографии с моей «зеркалки» (которая вообще то Sony NEX, зато компактная) на любое устройство с Wi. Fi за несколько секунд. А так как мне нравится делать фотографии и делиться с ними на лету, то SD карточка, умеющая без проводов передавать картинки на мой телефон, кажется прекрасным решением. И это было так! (хотя всё еще так). Мобильное приложение может… не, должно быть получше (зачем скачивать 7. МБ картинку для просмотра, чтобы потом ЕЩЕ раз скачать её, нажав на «Скачать»?), но вообще оно делает своё дело! Я был поражен, что столь малое устройство может хранить не только 1. ГБ или даже 3. 2ГБ, но еще и является встроенной системой, способной запускать приложения, включая веб сервер, общаться с другими устройствами через Wi. Fi и даже создавать свою беспроводную сеть. Но хватит болтать: можем ли мы заставить это устройство делать больше? Этот пост написан не только для собственно эксплоита, который позволяет получить root доступ (джейлбрейк), но так же расскажет о процессе исследования и нахождения багов, некоторые из которых просто тупики, а другие приводят к получению священного рута. Готовимся к хаку. Изначально я предполагал что в карточке какой то встроенный Linux. Программы и прошивки для восстановления USB накопителей и USB mp3. из популярных интернет аукционов дешевый USB-картридер для SD-флешек. программы, которые используются для разных типов флеш карт и накопителей. Tool программы для ремонта флешек от производителя Transcend. TS16GWSDHC10,TS32GWSDHC10,Wi-Fi SD Firmware Update Tool,Wi-Fi SD Firmware Update Tool Mac,Wi-Fi SD User Manual EN,Wi-Fi SD User Manual TC . Если это так, то расширить функционал скорее всего будет довольно просто! Но сперва надо бы взять контроль над системой в свои руки. До этого с этой карточкой я использовал только Android и i. OS приложение, но было очевидно, что самый простой вариант общаться с ПК — это веб интерфейс. И следующая мысль немедленно посетила мою голову: Если мобильные приложения такие хреновенькие, то и веб интерфейс не лучше… возможно он полон багов, которые можно использовать в своих интересах. Как же я оказался прав! Как только вы подсоединяетесь к веб интерфейсу (IP карточки 1. Плохие «пользовательские ощущения», но хорошее «хакерское предвкушение». В то время как многие используют крутые инструменты для обнаружения уязвимостей, безопасность этой системы была на столько «ниочемной» что я мог найти баги, просто немного поковырявшись. Меню «Files» выделяется среди других, и позволяет смотреть что есть на карте памяти. К сожалению, тут нельзя перейти в родительскую корневую папку карты памяти. Или позволяет? Это несомненно было бы полезно, так как вы сможем увидеть внутренности системы и получить больше информации о её работе а может быть и запустить какой нибудь код через веб интерфейс, если мы счастливчики. Имеем в наличии карту памяти - TRANSCEND 32Gb microSD Class 10. прошивки контроллера карты SD /microSD программными. Проблема такая: есть карта Transcend SD 2 гига 150х, используется 2 года (никон. вам к специалисту, прошивка контроллера слетела . Невозможное возможно, SD Карты памяти,SDXC/SDHC UHS-II U3 (R285, Class 10 UHS-I 400x (Premium),Карта памяти Wi-Fi SD,SDXC/SDHC Class 10. Мы заметили что ссылка «Parent Directory» указывает на URL(%2. F это символ "/"): 1. Fwww%2. Fsd. Так что попробуем перейти в папку /www, через URL: 1. Fwww Но, не судьба. Попытки попасть в /, /bin, /etc или любую другую директорию провалились. Эх, : ( не удача. Это было бы слишком просто! Что ж, оказывается это не очень то и сложно, так как программисты не особо заботились о безопасности. Попробуем зайти так ? Ух, как же стыдно должно быть! Похоже что программисты сделали проверку, чтобы путь начинался с /www/sd, но не проверяют очевидный путь попадания в родительскую папку "./".
Таким вот путем мы можем исследовать любые файлы системы. Конечно, нажатия на файлы не запускают их, а только скачивают, но это уже большое дело! После ползания по файловой системе и скачивания скриптов, не стало сюрпризом, что система использует busybox, да и много файлов являются симлинками на busybox. Хотя не все из них, как например скрипты в папке /www/cgi- bin. И они то самые интересные, так как мы можем запускать их просто указывая ссылку в браузере. Начнем хакание. Это всё выглядит многообещающе! Теперь, когда мы имеем доступ к внутренностям системы, не смотря на то что она в режиме «только для чтения», это дает нам огромное преимущество, так как мы можем изучать её работу и смотреть на баги и дырки : ). Хождение по скрипам, в поисках багов, которые можно использовать, не отняло много времени. Все они — это Perl скрипты. Perl имеет интересную особенность при открытии файлов через вызов open(), потому как это не только открывает файлы, но запускает программы если путь до файла не путь, а shell команда, заканчивающаяся «трубой» (pipe). Как например open("cat /etc/passwd |"). Другая особенность использования open() заключается в том, что мы можем записать в файл в любом месте или перезаписать существующий файл, так что мы можем написать свой собственный код и запустить его после этого. Давайте посмотрим, сможем ли мы использовать какие то файлы для этого. Один файл меня заинтересовал, так как содержит вызов open() включающий пользовательскую переменную. Вобще то этот файл вообще не используется в веб приложении! Мы можем запустить его через браузер. Это двойной facepalm: иметь дырявый скрипт, которые еще и не используется! Но сможем ли мы его приспособить для своих нужд? Просматривая код kcard_upload. Во первых, $basename на самом деле не прямой ввод пользователя, а является результатом вывода Get. Basename($upfile). А вот $upfile передается пользователем (в данном случае хакером). А точнее, путь к файлу, который HTML форма запрашивает для загрузки. Но если мы подставим путь, то Get. Basename вернет только имя файла на конце пути. Это делает переход по каталогам (как «хак» ././ выше) невозможным. Во вторых, значение в $basename переводится в верхний регистр, т. Третья проблема заключается в том, что скрипт kcard_upload. PNG, JPG, BMP и GIF файлы. И это конец? Не тут то было! Если посмотреть на код повнимательнее, то мы поймем, что хотя программисты и хотели таким способом ограничить загружаемые типы файлов, но они на самом деле проверяют только содержится ли расширение в названии файла, а не заканчивается ли файл на это самое расширение. В дополнении, регулярное выражение на самом деле не проверяет символ точки, так как точка указывает на любой символ, кроме переноса строки. Точка должна была бы быть экранирована "\". Я предполагаю что программисты хотели написать /\. GIF$/, но написали только /. GIF/, таким образом мы можем обойти это ограничение, включив любой вариант из комбинации этих трех букв в любое место нашего пути, как например /hi/hel. PNGlo/asdf. something. Сложно назвать это неудобством! Так как наш путь будет всегда преобразовываться в верхний регистр, возможно мы больше не сможем вызывать системные команды (большинство из них не в верхнем регистре), но может быть мы все еще можем загружать файлы, вставив таким образом наши собственные скрипты в систему. И нас в общем то и не волнует что имена этих скриптов будут написаны большими буквами. Наконец, если вы помните, наш путь изменяется через Get. Basename() до сохранения в переменной $basename. Get. Basename() делить путь и берет только имя файла на конце. То есть /path/to/file. Это плохо, потому как это больше не позволит нам манипулировать путем и вставлять что- то вроде "././bin/our- malicious. DCIM/1. 98_WIFI/И снова здрасте, код в Get. Basename() содержит баг, который можно поэксплуатировать. Код рассматривает два случая: пользователь вставляет путь в стиле windows с обратными слешами и пользователь вставляет путь с нормальными слешами (используется во всех OC кроме windows). Хотя правильнее сказать что такое поведение предполагается! А на самом же деле проверяется содержится ли в строке обратный слеш и тогда предполагается что это windows путь, так что строка делится обратными слешами. То есть на самом деле не проверяется состоит ли путь из обратной черты! Так что дадим следующий путь: /эта/часть/пути/будет/вырезана\/этот/путь/будет/использоваться. Так как строка содержит обратный слеш, скрипт предполагает что это путь для windows, так что окончание пути на самом деле не окончание пути (не имя файла), а вообще то просто путь. В нашем примере путь будет /этот/путь/будет/использоваться. Вуаля! Путь вроде /PNG/something\/././our- malicious. Хорошие новости. А плохая новость — ничего из этого работать не будет. Упс! Потому как скрипт предполагает что ./DCIM/1. WIFI существует, но скрипт запущен из /www/cgi- bin, и это не так (правильный путь должен быть ./sd/DCIM/1. WIFI). Пичалька, ничего с этим не поделать. Этот баг зашит в скрипт. Разработчики и не должны были уделять внимание этому, ведь скрипт не предполагалось использовать (он скрыт, помните?). Похоже что это тупик, не смотря на все наши усилия. Может кто- то предложит другое инновационное решение.(Кроме того, форма, выводящаяся kcard_upload. HTTP POST запрос самостоятельно.)Хакаем. Но постойте! Мы уже убедились что качество кода так себе, и еще куча багов может быть. На самом деле, я не буду рассматривать большинство из них. Есть и другие «тупики» на которые я натыкался и детально не описывал в этом посте. Я подробно расскажу об одном конкретном баге, который выделяется простотой использования. Существует много способов вызова shell команды непосредственно из perl скрипта, и если разработчики подошли к этому легкомысленно, то возможно мы можем запускать собственные shell команды! Использование system() — это один из способов запуска shell кода в perl скрипте. Оказалось что system() используется довольно часто в . Другой способ исполнения shell кода в perl — это использование qx{} выражения, но это вообще не используется. В любом случае, третий путь — это использование обратных кавычек вокруг кода, что эквивалентно использованию qx{}. И тут такого много, они подставляют данные, вводимые пользователем в их shell код. Замечательно! Т. е. Вот одна замечательная строчка в kcard_save_config_insup. Новый год: Это выражение запускает любую команду, обозначенную в переменной $update_auth, с аргументами $LOGIN_USR и $LOGIN_PWD. Оба аргумента приходят напрямую из формы, то есть эти аргументы полностью подвластны нам. Никаких проверок на ввод не делается!
0 Comments
Leave a Reply. |
AuthorWrite something about yourself. No need to be fancy, just an overview. Archives
December 2016
Categories |