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

Вопрос Вытаскиваем данные на macOS с помощью js + html (2018)

Тема в разделе "Вопросы новичков", создана пользователем TEXHO, 30 окт 2018.

  1. TEXHO

    TEXHO Member

    Сообщения:
    141
    Симпатии:
    0
    О более сложный и эффективных атаках мы поговорим в нашем обучении.
    Представь ситуацию: ты открываешь HTML-документ, и через какое-то время файлы с твоего жесткого диска оказываются у злоумышленника, притом абсолютно незаметно. Документы, код, SSH-ключи, пароли… Словом, улетают все файлы, которые ты, как текущий системный пользователь, имеешь право читать. Скажешь, невозможно? Современный браузер должен тебя защитить? Да, но у некоторых из них есть свои особенности.

    В общих чертах атака работает следующим образом.
    1. Пользователь открывает HTML-страницу в браузере.
    2. Браузер читает список имеющихся на компьютере пользователя файлов.
    3. Браузер читает «важные» файлы и загружает их на удаленный сервер злоумышленника. При этом для пользователя весь процесс остается незаметным.
    Разделим атаку условно на два этапа:
    • получение информации о файлах удаленного компьютера;
    • само чтение и отправка на наш сервер.
    На первом этапе мы должны каким-то образом узнать список интересующих нас файлов на компьютере пользователя. Проблема в том, что никакого внятного способа сделать это нет. Ни один браузер не даст тебе с HTML-страницы прочесть локальную директорию ~/ и список файлов на рабочем столе.
    Тыкаться наугад — тоже не вариант: да, мы знаем несколько «важных» путей вроде ~/.ssh/id_rsa, но в большинстве случаев файловая система пользователя, открывающего нашу «злую» страницу, — темный лес.
    На втором этапе мы, имея полный набор путей, должны каким-то образом выйти за границы песочницы браузера, прочесть локальные файлы и загрузить к себе на сервер.

    Извлекаем список файлов

    MacOS имеет забавную особенность. Если ты откроешь директорию с файлами, операционная система создаст специальный скрытый файл — .DS_Store. Этот файл хранит настройки просмотра папки в macOS, включает в себя информацию о расположении окна папки, размере окна, опции просмотра, которые были выбраны (значки, список или таблица), и внешний вид значков в окне. Система создает эти файлы автоматически. Другими словами, операционная система кеширует информацию о файлах для быстрого отображения директории.
    В .DS_Store попадают превью изображений (как скрытый файл Thumbs.db в Windows), но в отличие от Windows в нем также содержатся имена файлов и директорий. Достаточно зайти в директорию с файлами, и операционка тут же создаст .DS_Store.

    [​IMG]

    Служебный файл .DS_Store автоматически создается в директории, когда в нее заходишь
    Что в этом примечательного? А то, что .DS_Store можно распарсить и получить названия всех файлов в каталоге. Для этого подойдет одноименный модуль DSStore для Python. Вот пример кода, реализующего чтение .DS_Store:

    Code:
    [SRC]
    ##!/usr/bin/env python
    from ds_store import DSStore
    import json
    path = /Users/USERNAME/.DS_Store
    def parse(file):
    filelist = []
    for i in file:
    if i.filename!=.:
    filelist.append(i.filename)
    return list(set(filelist))
    d=DSStore.open(path, r+)
    fileresult=parse(d)
    print(json.dumps(fileresult))
    for name in fileresult:
    try:
    d = DSStore.open(path + name+ /.DS_Store, r+)
    fileresult = parse(d)
    all.append(fileresult)
    print(json.dumps(fileresult))
    except:
    pass
    [/SRC]​

    Сохраним этот код в файл parse_ds_store.py и запустим. В моем случае результат работы выглядит как-то так:

    Code:
    [SRC]
    $ python parse_ds_store.py
    [Documents, Pictures, .idm, Desktop, Music, .oracle_jre_usage, Public, tmp, Parallels, MEGA, .BurpSuite, Downloads, .config, .cache, Applications, .bash_sessions, Creative Cloud Files, PycharmProjects, Applications (Parallels), Dropbox, Nextcloud, .iterm2, .Trash, Scripts, Movies, MEGAsync Downloads, Soft, .local, .ssh, Library, .pgadmin]
    [/SRC]​

    Что мы видим? А мы видим имена файлов и папок в домашней директории. Узнав их, можно обращаться к каждой следующей директории, искать .DS_Store там и таким образом получать иерархию файлов и папок, не имея доступа к листингу директорий.
    Для примера парсим домашнюю папку (~/.DS_Store), получаем подобное содержимое:
    [Backups, Soft, Pictures, .ssh ...]

    Обращаемся к ~/Backups/.DS_Store, получаем:
    [2017, 2016, 2015, ...]

    На следующей итерации ~/Backups/2017/.DS_Store:
    [source, sql, static, ...]

    И так далее.
    Пара замечаний:
    • тебе нужно знать имя пользователя в системе;
    • файл .DS_Store создается только там, куда заходит пользователь.
    В остальном все отлично работает. Теперь слушай дальше.

    Предсказываем пути для чувствительных файлов

    Что же еще есть ценного у пользователя? В первую очередь директория .ssh, куда обычно сваливаются закрытые ключи.
    Для начала вспомним о таких путях:
    • ~/.ssh/id_rsa;
    • ~/.ssh/id_rsa.key;
    • ~/.ssh/id_rsa.pub;
    • ~/.ssh/known_hosts;
    • ~/.ssh/authorized_keys.
    И .bash_history — история введенных в терминал команд еще никому не помешала!

    Собираем куки и не только

    Займемся сбором печенек. Во-первых, macOS имеет предсказуемые пути хранения данных об аккаунтах в директории.
    • ~/Library/Cookies/Cookies.binarycookies
    • ~/Library/Cookies/com.apple.Safari.cookies

    Там же будут лежать cookie от Twitter, Skype и прочих приложений.
    Захватим и данные о HSTS — там найдутся посещенные сайты, которые вернули заголовок HSTS. Лишним не будет!
    ~/Library/Cookies/HSTS.plist
    Информацию об аккаунтах в системе тоже заберем с собой.
    ~/Library/Accounts/Accounts4.sqlite
    Ну и не Safari единым, обычно различные файлы и конфиги установленного софта лежат в пути
    ~/Library/Application Support/
    Мы заберем только файлики Chrome:
    ~/Library/Application Support/Google/Chrome/Default/Login Data
    ~/Library/Application Support/Google/Chrome/Default/Cookies
    ~/Library/Application Support/Google/Chrome/Default/History

    А ты пошарься, вдруг где хранятся интересные файлы каких-нибудь FTP/SQL-клиентов или история сообщений мессенджеров.

    Получение полных путей к файлам пользователя.

    Что забрать с собой, мы уже выяснили. Теперь попробуем собрать эти файлы с помощью Safari.
    В Chrome, к примеру, с ходу читать локальные файлы с помощью JavaScript не выйдет. Чтобы это сработало, Chrome нужно предварительно запустить со специальным аргументом (--disable-web-security). Safari тоже предупреждает, что работать с file:// он не умеет.

    [​IMG]

    Просто так читать file:// в Safari нельзя
    Однако если HTML не был скачан из интернета, Safari более лоялен к такому виду запросов — отправив с помощью XHR запрос к локальному файлу, мы получим его содержимое:

    [​IMG]

    Благодаря этой особенности, зная полный путь к файлу, мы можем загрузить его содержимое и отправить на удаленный сервер!
    Но вот незадача — как получить полный путь, если мы не знаем имя пользователя? А ведь в /etc/passwd вообще нет логинов пользователей (я проверял, да)!
    Чтобы узнать имя пользователя, мы проверяем два log-файла, которые появляются, едва ты установишь и настроишь ОС (отдельное спасибо @f1nnix). Это файлы /var/log/system.log и /var/log/install.log. Не будет в одном — скорее всего, будет в другом. Загружаем эти файлы в браузер и с помощью регулярного выражения получаем имя пользователя.

Поделиться этой страницей